From 48809cd654e10d76240bc9be08d6d20cfb3a2adf Mon Sep 17 00:00:00 2001
From: yuxianghui <3437689193@qq.com>
Date: Fri, 29 Mar 2024 17:37:02 +0800
Subject: [PATCH 01/11] =?UTF-8?q?1=E3=80=81=E5=BA=8F=E5=88=97=E5=8F=B7?=
=?UTF-8?q?=E6=A8=A1=E5=9E=8B=E5=AF=B9=E8=B1=A1=E6=B7=BB=E5=8A=A0rfid?=
=?UTF-8?q?=E5=AD=97=E6=AE=B5=E4=B8=94rfid=E4=BB=85=E5=9C=A8=E4=BA=A7?=
=?UTF-8?q?=E5=93=81=E4=B8=BA=E5=88=80=E6=9F=84=E6=97=B6=E5=B1=95=E7=A4=BA?=
=?UTF-8?q?=EF=BC=8C=E5=BA=8F=E5=88=97=E5=8F=B7=E6=A8=A1=E5=9E=8B=E6=B7=BB?=
=?UTF-8?q?=E5=8A=A0=E8=A7=84=E6=A0=BC=E5=AD=97=E6=AE=B5=EF=BC=8C=E4=B8=94?=
=?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=87=AA=E5=8A=A8=E6=A0=B9=E6=8D=AE=E5=AF=B9?=
=?UTF-8?q?=E5=BA=94=E4=BA=A7=E5=93=81=E7=B1=BB=E5=9E=8B=E4=B8=8D=E5=90=8C?=
=?UTF-8?q?=E8=AE=A1=E7=AE=97=E5=87=BA=E5=85=B6=E5=80=BC=EF=BC=8C=E4=BA=A7?=
=?UTF-8?q?=E5=93=81=E4=B8=BA=E5=A4=B9=E5=85=B7=E6=97=B6=E7=9C=8B=E6=9D=BF?=
=?UTF-8?q?=E5=B1=95=E7=A4=BA=E5=85=B6=E8=A7=84=E6=A0=BC=E7=9A=84=E5=80=BC?=
=?UTF-8?q?=EF=BC=9B2=E3=80=81=E5=9C=A8=E9=87=87=E8=B4=AD=E5=85=A5?=
=?UTF-8?q?=E5=BA=93=E6=B5=81=E7=A8=8B=EF=BC=8C=E5=BD=95=E5=85=A5=E5=BA=8F?=
=?UTF-8?q?=E5=88=97=E5=8F=B7=E7=9A=84=E8=BF=87=E7=A8=8B=E7=95=8C=E9=9D=A2?=
=?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BD=95=E5=85=A5rfid=E5=AD=97=E6=AE=B5?=
=?UTF-8?q?=EF=BC=8C=E5=BD=93=E4=BA=A7=E5=93=81=E6=98=AF=E5=88=80=E6=9F=84?=
=?UTF-8?q?=E6=97=B6=E9=9C=80=E5=BD=95=E5=85=A5=E5=88=80=E6=9F=84=E7=9A=84?=
=?UTF-8?q?rfid=EF=BC=8C=E5=B9=B6=E5=9C=A8=E9=AA=8C=E8=AF=81=E9=80=9A?=
=?UTF-8?q?=E8=BF=87=E5=90=8E=E5=88=80=E6=9F=84=E7=9A=84=E5=BA=8F=E5=88=97?=
=?UTF-8?q?=E5=8F=B7=E4=B8=AD=E5=B8=A6=E6=9C=89rfid=E7=A0=81=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_manufacturing/models/stock.py | 16 ++++++++
.../views/mrp_production_addional_change.xml | 3 +-
sf_manufacturing/views/stock_lot_views.xml | 6 +++
sf_warehouse/models/model.py | 27 ++++++++++++-
.../views/change_stock_move_views.xml | 40 +++++++++++++------
5 files changed, 78 insertions(+), 14 deletions(-)
diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py
index f255d28b..b68b0ea0 100644
--- a/sf_manufacturing/models/stock.py
+++ b/sf_manufacturing/models/stock.py
@@ -222,6 +222,22 @@ class ProductionLot(models.Model):
_name = 'stock.lot'
_inherit = ['stock.lot', 'printing.utils']
+ rfid = fields.Char('Rfid', readonly=True)
+ product_material_name = fields.Char('刀具产品物料名称', related='product_id.cutting_tool_material_id.name')
+ product_specification = fields.Char('规格', compute='_compute_product_specification', store=True)
+
+ @api.depends('product_id')
+ def _compute_product_specification(self):
+ for stock in self:
+ if stock:
+ if stock.product_id:
+ if stock.product_id.categ_id.name in '刀具':
+ stock.product_specification = stock.product_id.specification_id.name
+ elif stock.product_id.categ_id.name in '夹具':
+ stock.product_specification = stock.product_id.specification_fixture_id.name
+ else:
+ stock.product_specification = stock.product_id.default_code
+
@api.model
def generate_lot_names1(self, display_name, first_lot, count):
"""Generate `lot_names` from a string."""
diff --git a/sf_manufacturing/views/mrp_production_addional_change.xml b/sf_manufacturing/views/mrp_production_addional_change.xml
index 0ae0d95f..6ba78573 100644
--- a/sf_manufacturing/views/mrp_production_addional_change.xml
+++ b/sf_manufacturing/views/mrp_production_addional_change.xml
@@ -422,7 +422,8 @@
规格:
-
+
+
[]
diff --git a/sf_manufacturing/views/stock_lot_views.xml b/sf_manufacturing/views/stock_lot_views.xml
index bd04005c..f7ef9c9b 100644
--- a/sf_manufacturing/views/stock_lot_views.xml
+++ b/sf_manufacturing/views/stock_lot_views.xml
@@ -13,6 +13,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sf_warehouse/models/model.py b/sf_warehouse/models/model.py
index 2228d2d5..3667c62c 100644
--- a/sf_warehouse/models/model.py
+++ b/sf_warehouse/models/model.py
@@ -424,6 +424,8 @@ class Sf_stock_move_line(models.Model):
# lot_qr_code = fields.Binary(string='二维码', compute='_compute_lot_qr_code', store=True)
lot_qr_code = fields.Binary(string='二维码', compute='_compute_lot_qr_code', store=True)
+ rfid = fields.Char('Rfid')
+
def action_revert_inventory(self):
# 检查用户是否有执行操作的权限
if not self.env.user.has_group('sf_warehouse.group_sf_stock_user'):
@@ -742,6 +744,12 @@ class SfStockPicking(models.Model):
if line.current_location_id:
line.current_location_id.product_sn_id = False
line.current_location_id.location_status = '空闲'
+
+ for move in self.move_ids:
+ if move and move.product_id.cutting_tool_material_id.name in '刀柄':
+ for item in move.move_line_nosuggest_ids:
+ if item:
+ self.env['stock.lot'].search([('name', '=', item.lot_name)]).write({'rfid': item.rfid})
return res
# def print_all_barcode(self):
@@ -932,7 +940,24 @@ class SfStockScrap(models.Model):
class CustomStockMove(models.Model):
_name = 'stock.move'
- _inherit = ['stock.move', 'printing.utils']
+ _inherit = ['stock.move', 'printing.utils', 'barcodes.barcode_events_mixin']
+
+ def on_barcode_scanned(self, barcode):
+ """
+ 采购入库扫码绑定Rfid码
+ """
+ for record in self:
+ if record:
+ if '刀柄' in record.product_id.cutting_tool_material_id.name:
+ for move_line_nosuggest_id in record.move_line_nosuggest_ids:
+ if move_line_nosuggest_id.rfid:
+ if move_line_nosuggest_id.rfid == barcode:
+ raise ValidationError('该刀柄的rfid已经录入,请勿重复录入!!!')
+ else:
+ move_line_nosuggest_id.sudo().rfid = barcode
+ break
+ else:
+ raise ValidationError('该产品不是刀柄!!!')
def action_assign_serial_show_details(self):
# 首先执行原有逻辑
diff --git a/sf_warehouse/views/change_stock_move_views.xml b/sf_warehouse/views/change_stock_move_views.xml
index cc4213c6..0875fa12 100644
--- a/sf_warehouse/views/change_stock_move_views.xml
+++ b/sf_warehouse/views/change_stock_move_views.xml
@@ -31,15 +31,16 @@
-
-
-
+
+
+
-
+
+
sf.stock.move.line.form
stock.move.line
@@ -63,6 +64,9 @@
stock.move.line
+
+
+
@@ -103,10 +107,10 @@
groups="sf_warehouse.group_sf_stock_user" data-hotkey="k"/>
-
-
-
-
+
+
+
+
@@ -145,11 +149,23 @@
stock.move
-
-
-
+
+
+
- -->
+
+ -->
+
+
+
+
+
+ mrp.subcontracting.stock.move.barcode.scanned.form
+ stock.move
+
+
+
+
From 18dcb791160b33fd0cd69cd13267346d24a8918f Mon Sep 17 00:00:00 2001
From: mgw <1392924357@qq.com>
Date: Mon, 1 Apr 2024 14:55:10 +0800
Subject: [PATCH 02/11] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=87=AA=E5=AE=9A?=
=?UTF-8?q?=E4=B9=89=E8=A7=92=E8=89=B2=E6=89=93=E5=8D=B0=E6=97=A0=E6=9D=83?=
=?UTF-8?q?=E9=99=90=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_manufacturing/models/stock.py | 2 +-
sf_warehouse/models/model.py | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py
index 3166441a..b093789e 100644
--- a/sf_manufacturing/models/stock.py
+++ b/sf_manufacturing/models/stock.py
@@ -319,7 +319,7 @@ class ProductionLot(models.Model):
# port = 9100 # 可以根据实际情况修改
# 获取默认打印机配置
- printer_config = self.env['printer.configuration'].search([('model', '=', self._name)], limit=1)
+ printer_config = self.env['printer.configuration'].sudo().search([('model', '=', self._name)], limit=1)
if not printer_config:
raise UserError('请先配置打印机')
host = printer_config.printer_id.ip_address
diff --git a/sf_warehouse/models/model.py b/sf_warehouse/models/model.py
index 2228d2d5..347fd658 100644
--- a/sf_warehouse/models/model.py
+++ b/sf_warehouse/models/model.py
@@ -475,7 +475,7 @@ class Sf_stock_move_line(models.Model):
# port = 9100 # 可以根据实际情况修改
# 获取默认打印机配置
- printer_config = self.env['printer.configuration'].search([('model', '=', self._name)], limit=1)
+ printer_config = self.env['printer.configuration'].sudo().search([('model', '=', self._name)], limit=1)
if not printer_config:
raise UserError('请先配置打印机')
host = printer_config.printer_id.ip_address
@@ -983,7 +983,7 @@ class CustomStockMove(models.Model):
# port = 9100 # 可以根据实际情况修改
# 获取默认打印机配置
- printer_config = self.env['printer.configuration'].search([('model', '=', self._name)], limit=1)
+ printer_config = self.env['printer.configuration'].sudo().search([('model', '=', self._name)], limit=1)
if not printer_config:
raise UserError('请先配置打印机')
host = printer_config.printer_id.ip_address
From f0b972e705ad5c8783d5b615b964f6934493bb11 Mon Sep 17 00:00:00 2001
From: yuxianghui <3437689193@qq.com>
Date: Mon, 1 Apr 2024 16:56:15 +0800
Subject: [PATCH 03/11] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96=E5=88=80?=
=?UTF-8?q?=E6=9F=84=E7=89=A9=E6=96=99=E4=BA=A7=E5=93=81=E9=80=82=E7=94=A8?=
=?UTF-8?q?=E5=A4=B9=E5=A4=B4=E5=9E=8B=E5=8F=B7=E6=B2=A1=E6=9C=89=E6=95=B0?=
=?UTF-8?q?=E6=8D=AE=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BC=98=E5=8C=96?=
=?UTF-8?q?=E5=88=80=E5=85=B7=E6=A0=87=E5=87=86=E5=BA=93=E5=9F=BA=E6=9C=AC?=
=?UTF-8?q?=E5=8F=82=E6=95=B0=E5=90=8C=E6=AD=A5=E6=8E=A5=E5=8F=A3=EF=BC=9B?=
=?UTF-8?q?2=E3=80=81=E4=BC=98=E5=8C=96=E5=8A=9F=E8=83=BD=E5=88=80?=
=?UTF-8?q?=E5=85=B7=E7=BB=84=E8=A3=85=E6=97=B6=EF=BC=8C=E5=8F=AA=E9=9C=80?=
=?UTF-8?q?=E6=89=AB=E5=85=A5=E5=88=80=E6=9F=84=E7=9A=84Rfid=EF=BC=8C?=
=?UTF-8?q?=E5=B0=86=E8=87=AA=E5=8A=A8=E5=B8=A6=E5=87=BA=E5=88=80=E6=9F=84?=
=?UTF-8?q?=E4=BF=A1=E6=81=AF=EF=BC=8C=E5=B9=B6=E6=A0=B9=E6=8D=AE=E5=88=80?=
=?UTF-8?q?=E6=9F=84=E9=80=82=E7=94=A8=E5=A4=B9=E5=A4=B4=E5=9E=8B=E5=8F=B7?=
=?UTF-8?q?=E5=92=8C=E9=80=82=E9=85=8D=E5=A4=B9=E5=A4=B4=E5=B0=BA=E5=AF=B8?=
=?UTF-8?q?=E9=9A=8F=E6=9C=BA=E5=B8=A6=E5=87=BA=E4=B8=80=E4=B8=AA=E5=8F=AF?=
=?UTF-8?q?=E7=94=A8=E5=A4=B9=E5=A4=B4=E7=89=A9=E6=96=99=E4=BF=A1=E6=81=AF?=
=?UTF-8?q?=EF=BC=8C=E5=90=8C=E6=97=B6=E5=B0=86=E5=88=80=E6=9F=84=E7=9A=84?=
=?UTF-8?q?Rfid=E7=A0=81=E5=A1=AB=E5=85=A5=E5=8A=9F=E8=83=BD=E5=88=80?=
=?UTF-8?q?=E5=85=B7=E7=9A=84Rfid=E7=A0=81=E3=80=823=E3=80=81=E4=BC=98?=
=?UTF-8?q?=E5=8C=96=E5=88=80=E6=9F=84=E7=89=A9=E6=96=99=E9=87=87=E8=B4=AD?=
=?UTF-8?q?=E5=85=A5=E5=BA=93=E6=97=B6=E7=9A=84=E9=AA=8C=E8=AF=81=E7=9A=84?=
=?UTF-8?q?=E5=88=A4=E6=96=AD=E6=9D=A1=E4=BB=B6=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_manufacturing/models/product_template.py | 7 +-
sf_mrs_connect/models/sync_common.py | 91 ++++++++------------
sf_tool_management/views/tool_base_views.xml | 2 +-
sf_tool_management/wizard/wizard.py | 82 +++++++++++-------
sf_warehouse/models/model.py | 4 +-
5 files changed, 95 insertions(+), 91 deletions(-)
diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py
index be0c09ae..1489cddd 100644
--- a/sf_manufacturing/models/product_template.py
+++ b/sf_manufacturing/models/product_template.py
@@ -7,7 +7,6 @@ from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
from odoo.modules import get_resource_path
-
from OCC.Extend.DataExchange import read_step_file
from OCC.Extend.DataExchange import write_stl_file
@@ -107,7 +106,10 @@ class ResProductMo(models.Model):
@api.onchange('cutting_tool_model_id')
def _onchange_cutting_tool_model_id(self):
- self.specification_id = False
+ for item in self:
+ if item:
+ item.specification_id = False
+ item.cutting_tool_chuck_id = item.cutting_tool_model_id.chuck_id
@api.onchange('cutting_tool_material_id')
def _onchange_cutting_tool_material_id(self):
@@ -310,7 +312,6 @@ class ResProductMo(models.Model):
self.cutting_tool_is_safety_lock = self.specification_id.is_safe_lock
self.cutting_tool_fit_nut_model = self.specification_id.nut
self.cutting_tool_wrench = self.specification_id.spanner
- self.cutting_tool_chuck_id = self.specification_id.chuck_id.id
self.cutting_tool_jump_accuracy = self.specification_id.diameter_slip_accuracy
self.cutting_tool_taper_shank_model = self.specification_id.taper_shank_model
self.cutting_tool_cooling_type = self.specification_id.cooling_model
diff --git a/sf_mrs_connect/models/sync_common.py b/sf_mrs_connect/models/sync_common.py
index 49956f4b..3ee916e7 100644
--- a/sf_mrs_connect/models/sync_common.py
+++ b/sf_mrs_connect/models/sync_common.py
@@ -2421,7 +2421,7 @@ class CuttingToolBasicParameters(models.Model):
'active': integral_tool_item['active'],
})
else:
- self.write({
+ self.search([('code', '=', integral_tool_item['code'])]).write({
'name': integral_tool_item['name'],
'total_length': integral_tool_item['total_length'],
'blade_diameter': integral_tool_item['blade_diameter'],
@@ -2482,7 +2482,7 @@ class CuttingToolBasicParameters(models.Model):
'active': blade_item['active'],
})
else:
- self.write({
+ self.search([('code', '=', blade_item['code'])]).write({
'name': blade_item['name'],
'length': blade_item['length'],
'thickness': blade_item['thickness'],
@@ -2539,7 +2539,7 @@ class CuttingToolBasicParameters(models.Model):
'active': chuck_item['active'],
})
else:
- self.write({
+ self.search([('code', '=', chuck_item['code'])]).write({
'name': chuck_item['name'],
'er_size_model': chuck_item['size_model'],
'min_clamping_diameter': chuck_item['clamping_diameter_min'],
@@ -2598,7 +2598,7 @@ class CuttingToolBasicParameters(models.Model):
'active': cutter_arbor_item['active'],
})
else:
- self.write({
+ self.search([('code', '=', cutter_arbor_item['code'])]).write({
'name': cutter_arbor_item['name'],
'height': cutter_arbor_item['height'],
'width': cutter_arbor_item['width'],
@@ -2662,7 +2662,7 @@ class CuttingToolBasicParameters(models.Model):
'active': cutter_head_item['active'],
})
else:
- self.write({
+ self.search([('code', '=', cutter_head_item['code'])]).write({
'name': cutter_head_item['name'],
'install_blade_tip_num': cutter_head_item['number_blade_installed'],
'blade_diameter': cutter_head_item['blade_diameter'],
@@ -2691,57 +2691,38 @@ class CuttingToolBasicParameters(models.Model):
for knife_handle_item in basic_parameters_knife_handle_list:
knife_handle = self.search(
[('code', '=', knife_handle_item['code']), ('active', 'in', [True, False])])
+ val = {
+ 'name': knife_handle_item['name'],
+ 'taper_shank_model': knife_handle_item['taper_shank_model'],
+ 'total_length': knife_handle_item['total_length'],
+ 'flange_shank_length': knife_handle_item['flange_length'],
+ 'flange_diameter': knife_handle_item['flange_diameter'],
+ 'shank_length': knife_handle_item['shank_length'],
+ 'shank_diameter': knife_handle_item['shank_diameter'],
+ 'min_clamping_diameter': knife_handle_item['clamping_diameter_min'],
+ 'max_clamping_diameter': knife_handle_item['clamping_diameter_max'],
+ 'clamping_mode': knife_handle_item['clamping_way'],
+ 'tool_changing_time': knife_handle_item['tool_changing_time'],
+ 'max_rotate_speed': knife_handle_item['rotate_speed_max'],
+ 'diameter_slip_accuracy': knife_handle_item['diameter_slip_accuracy'],
+ 'cooling_model': knife_handle_item['cooling_model'],
+ 'fit_chuck_size': knife_handle_item['fit_chuck_size'],
+ 'is_quick_cutting': knife_handle_item['is_quick_cutting'],
+ 'is_safe_lock': knife_handle_item['is_safe_lock'],
+ 'screw': knife_handle_item['fit_wrench_model'],
+ 'nut': knife_handle_item['fit_nut_model'],
+ 'dynamic_balance_class': knife_handle_item['dynamic_balance_class'],
+ 'active': knife_handle_item['active'],
+ }
if not knife_handle:
- self.create({
- 'name': knife_handle_item['name'],
- 'code': knife_handle_item['code'],
- 'cutting_tool_type': '刀柄',
- 'taper_shank_model': knife_handle_item['taper_shank_model'],
- 'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
- [('code', '=', knife_handle_item['standard_library_code'].replace("JKM", result[
- 'factory_short_name']))]).id,
- 'total_length': knife_handle_item['total_length'],
- 'flange_shank_length': knife_handle_item['flange_length'],
- 'flange_diameter': knife_handle_item['flange_diameter'],
- 'shank_length': knife_handle_item['shank_length'],
- 'shank_diameter': knife_handle_item['shank_diameter'],
- 'min_clamping_diameter': knife_handle_item['clamping_diameter_min'],
- 'max_clamping_diameter': knife_handle_item['clamping_diameter_max'],
- 'clamping_mode': knife_handle_item['clamping_way'],
- 'tool_changing_time': knife_handle_item['tool_changing_time'],
- 'max_rotate_speed': knife_handle_item['rotate_speed_max'],
- 'diameter_slip_accuracy': knife_handle_item['diameter_slip_accuracy'],
- 'cooling_model': knife_handle_item['cooling_model'],
- 'is_quick_cutting': knife_handle_item['is_quick_cutting'],
- 'is_safe_lock': knife_handle_item['is_safe_lock'],
- 'screw': knife_handle_item['fit_wrench_model'],
- 'nut': knife_handle_item['fit_nut_model'],
- 'dynamic_balance_class': knife_handle_item['dynamic_balance_class'],
- 'active': knife_handle_item['active'],
- })
+ val['code'] = knife_handle_item['code']
+ val['cutting_tool_type'] = '刀柄'
+ val['standard_library_id'] = self.env['sf.cutting_tool.standard.library'].search(
+ [('code', '=', knife_handle_item['standard_library_code'].replace("JKM", result[
+ 'factory_short_name']))]).id
+ self.create(val)
else:
- self.write({
- 'name': knife_handle_item['name'],
- 'taper_shank_model': knife_handle_item['taper_shank_model'],
- 'total_length': knife_handle_item['total_length'],
- 'flange_shank_length': knife_handle_item['flange_length'],
- 'flange_diameter': knife_handle_item['flange_diameter'],
- 'shank_length': knife_handle_item['shank_length'],
- 'shank_diameter': knife_handle_item['shank_diameter'],
- 'min_clamping_diameter': knife_handle_item['clamping_diameter_min'],
- 'max_clamping_diameter': knife_handle_item['clamping_diameter_max'],
- 'clamping_mode': knife_handle_item['clamping_way'],
- 'tool_changing_time': knife_handle_item['tool_changing_time'],
- 'max_rotate_speed': knife_handle_item['rotate_speed_max'],
- 'diameter_slip_accuracy': knife_handle_item['diameter_slip_accuracy'],
- 'cooling_model': knife_handle_item['cooling_model'],
- 'is_quick_cutting': knife_handle_item['is_quick_cutting'],
- 'is_safe_lock': knife_handle_item['is_safe_lock'],
- 'screw': knife_handle_item['fit_wrench_model'],
- 'nut': knife_handle_item['fit_nut_model'],
- 'dynamic_balance_class': knife_handle_item['dynamic_balance_class'],
- 'active': knife_handle_item['active'],
- })
+ self.search([('code', '=', knife_handle_item['code'])]).write(val)
else:
raise ValidationError("刀具物料基本参数认证未通过")
@@ -3097,6 +3078,7 @@ class CuttingToolBasicParameters(models.Model):
'cooling_model': knife_handle_item['cooling_model'],
'is_quick_cutting': knife_handle_item['is_quick_cutting'],
'is_safe_lock': knife_handle_item['is_safe_lock'],
+ 'fit_chuck_size': knife_handle_item['fit_chuck_size'],
'screw': knife_handle_item['fit_wrench_model'],
'nut': knife_handle_item['fit_nut_model'],
'dynamic_balance_class': knife_handle_item['dynamic_balance_class'],
@@ -3121,6 +3103,7 @@ class CuttingToolBasicParameters(models.Model):
'max_rotate_speed': knife_handle_item['rotate_speed_max'],
'diameter_slip_accuracy': knife_handle_item['diameter_slip_accuracy'],
'cooling_model': knife_handle_item['cooling_model'],
+ 'fit_chuck_size': knife_handle_item['fit_chuck_size'],
'is_quick_cutting': knife_handle_item['is_quick_cutting'],
'is_safe_lock': knife_handle_item['is_safe_lock'],
'screw': knife_handle_item['fit_wrench_model'],
diff --git a/sf_tool_management/views/tool_base_views.xml b/sf_tool_management/views/tool_base_views.xml
index 4406a90f..b210ff29 100644
--- a/sf_tool_management/views/tool_base_views.xml
+++ b/sf_tool_management/views/tool_base_views.xml
@@ -1056,7 +1056,7 @@
-
+
diff --git a/sf_tool_management/wizard/wizard.py b/sf_tool_management/wizard/wizard.py
index dbece7b7..eac95d8c 100644
--- a/sf_tool_management/wizard/wizard.py
+++ b/sf_tool_management/wizard/wizard.py
@@ -295,35 +295,70 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
"""
for record in self:
if 'DJWL' in barcode:
- records = record.env['stock.lot'].search([('name', '=', barcode)])
- if not records:
+ lot_ids = record.env['stock.lot'].sudo().search([('name', '=', barcode)])
+ if not lot_ids:
raise ValidationError('扫描的条形码数据不存在,请重新扫描!')
- for record_stock_lot in records:
- if record_stock_lot.quant_ids[-1].location_id.name == '刀具组装位置':
- raise ValidationError('该刀具物料已使用,请重新选择!!!')
- elif record_stock_lot.quant_ids[-1].location_id.name not in '刀具房':
- raise ValidationError('该刀具物料未入库,请重新选择!!!')
- tool_material_name = record_stock_lot.product_id.cutting_tool_material_id.name
+ for lot_id in lot_ids:
+ if lot_id.quant_ids[-1].location_id.name == '刀具组装位置':
+ raise ValidationError('该刀具物料已使用,请重新扫描!!!')
+ elif lot_id.quant_ids[-1].location_id.name not in '刀具房':
+ raise ValidationError('该刀具物料未入库,请重新扫描!!!')
+ tool_material_name = lot_id.product_id.cutting_tool_material_id.name
if tool_material_name == '整体式刀具':
- record.integral_code_id = record_stock_lot.id
+ record.integral_code_id = lot_id.id
elif tool_material_name == '刀片':
- record.blade_code_id = record_stock_lot.id
+ record.blade_code_id = lot_id.id
elif tool_material_name == '刀杆':
- record.bar_code_id = record_stock_lot.id
+ record.bar_code_id = lot_id.id
elif tool_material_name == '刀盘':
- record.pad_code_id = record_stock_lot.id
+ record.pad_code_id = lot_id.id
elif tool_material_name == '刀柄':
- record.handle_code_id = record_stock_lot.id
+ record.handle_code_id = lot_id.id
+ record.chuck_code_id = record.get_chuck_code_id(lot_id).id or False
elif tool_material_name == '夹头':
- record.chuck_code_id = record_stock_lot.id
+ record.chuck_code_id = lot_id.id
else:
raise ValidationError('扫描的刀具物料不存在,请重新扫描!')
else:
- record.rfid = barcode
+ lot_ids = self.env['stock.lot'].sudo().search([('rfid', '=', barcode)])
+ if not lot_ids:
+ raise ValidationError('扫描的刀具物料不存在,请重新扫描!')
+ for lot_id in lot_ids:
+ if lot_id.quant_ids[-1].location_id.name in '刀具房':
+ record.handle_code_id = lot_id.id
+ record.chuck_code_id = record.get_chuck_code_id(lot_id).id or False
+ elif lot_id.quant_ids[-1].location_id.name == '刀具组装位置':
+ raise ValidationError('该刀柄已使用,请重新扫描!!!')
+ else:
+ raise ValidationError('该刀柄未入库,请重新扫描!!!')
+
+ def get_chuck_code_id(self, lot_id):
+ # 适用夹头型号
+ cutting_tool_chuck_id = lot_id.product_id.cutting_tool_chuck_id
+ # 适用夹头尺寸
+ fit_chuck_size = lot_id.product_id.cutting_tool_fit_chuck_size
+ # 适用夹头产品
+ chuck_product_id = self.env['product.product'].sudo().search(
+ [('cutting_tool_model_id', '=', cutting_tool_chuck_id.id),
+ ('cutting_tool_er_size_model', '=', fit_chuck_size)])
+ # 适用夹头产品序列号
+ chuck_product_lot_ids = self.env['stock.lot'].sudo().search(
+ [('product_id', '=', chuck_product_id.id), ('tool_material_status', '=', '可用')])
+ for chuck_product_lot_id in chuck_product_lot_ids:
+ if chuck_product_lot_id.quant_ids[-1].location_id.name in '刀具房':
+ return chuck_product_lot_id
+
+ @api.depends('handle_code_id')
+ def _compute_rfid(self):
+ for item in self:
+ if item:
+ item.rfid = item.handle_code_id.rfid
+ else:
+ item.rfid = None
# 组装功能刀具参数信息
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号')
- rfid = fields.Char('Rfid', required=True)
+ rfid = fields.Char('Rfid', readonly=True, store=True, compute='_compute_rfid')
tool_code = fields.Char(string='功能刀具编码', readonly=True, compute='_compute_tool_code')
after_assembly_functional_tool_name = fields.Char(string='组装后功能刀具名称', compute='_compute_name')
after_assembly_functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model',
@@ -442,21 +477,6 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
if obj.after_assembly_functional_tool_length == 0:
raise ValidationError('组装参数信息【伸出长】不能为0!!!')
- @api.constrains('rfid')
- def _check_rfid(self):
- self.get_rfid()
-
- @api.onchange('rfid')
- def _onchange_rfid(self):
- self.get_rfid()
-
- def get_rfid(self):
- for obj in self:
- if obj.rfid:
- tool_entity = self.env['sf.functional.cutting.tool.entity'].sudo().search([('rfid', '=', obj.rfid)])
- if tool_entity:
- raise ValidationError('【%s】的Rfid已被使用,请重新录入!!!' % obj.rfid)
-
def functional_tool_assembly(self):
"""
功能刀具组装
diff --git a/sf_warehouse/models/model.py b/sf_warehouse/models/model.py
index 3667c62c..328f5d43 100644
--- a/sf_warehouse/models/model.py
+++ b/sf_warehouse/models/model.py
@@ -746,9 +746,9 @@ class SfStockPicking(models.Model):
line.current_location_id.location_status = '空闲'
for move in self.move_ids:
- if move and move.product_id.cutting_tool_material_id.name in '刀柄':
+ if move and move.product_id.cutting_tool_material_id.name == '刀柄':
for item in move.move_line_nosuggest_ids:
- if item:
+ if item.location_dest_id.name == '进货':
self.env['stock.lot'].search([('name', '=', item.lot_name)]).write({'rfid': item.rfid})
return res
From 02e4987281f243508f7ad9c31dbaa200d2d26e76 Mon Sep 17 00:00:00 2001
From: yuxianghui <3437689193@qq.com>
Date: Mon, 1 Apr 2024 17:12:47 +0800
Subject: [PATCH 04/11] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=80=89=E5=8F=96?=
=?UTF-8?q?=E9=80=82=E7=94=A8=E5=A4=B9=E5=A4=B4=E6=96=B9=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_tool_management/wizard/wizard.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/sf_tool_management/wizard/wizard.py b/sf_tool_management/wizard/wizard.py
index eac95d8c..285da727 100644
--- a/sf_tool_management/wizard/wizard.py
+++ b/sf_tool_management/wizard/wizard.py
@@ -347,6 +347,7 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
for chuck_product_lot_id in chuck_product_lot_ids:
if chuck_product_lot_id.quant_ids[-1].location_id.name in '刀具房':
return chuck_product_lot_id
+ return False
@api.depends('handle_code_id')
def _compute_rfid(self):
From 2580e0c795768ee0e533df03b08182c9207ea86a Mon Sep 17 00:00:00 2001
From: yuxianghui <3437689193@qq.com>
Date: Tue, 2 Apr 2024 15:36:28 +0800
Subject: [PATCH 05/11] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96=E4=BA=A7?=
=?UTF-8?q?=E5=93=81=E9=87=87=E8=B4=AD=E5=88=80=E5=85=B7=E7=89=A9=E6=96=99?=
=?UTF-8?q?=E7=94=9F=E6=88=90=E7=9A=84=E5=BA=8F=E5=88=97=E5=8F=B7=E5=87=BA?=
=?UTF-8?q?=E7=8E=B0=E4=B8=8D=E8=BF=9E=E7=BB=AD=E7=9A=84=E9=97=AE=E9=A2=98?=
=?UTF-8?q?=EF=BC=9B2=E3=80=81=E9=87=87=E8=B4=AD=E5=88=80=E6=9F=84?=
=?UTF-8?q?=E7=89=A9=E6=96=99=E6=97=B6=EF=BC=8C=E5=9C=A8=E5=85=A5=E5=BA=93?=
=?UTF-8?q?=E9=AA=8C=E8=AF=81=E7=8E=AF=E8=8A=82=E5=A2=9E=E5=8A=A0Rfid?=
=?UTF-8?q?=E6=98=AF=E5=90=A6=E5=85=A8=E9=83=A8=E5=BD=95=E5=85=A5=E6=A3=80?=
=?UTF-8?q?=E9=AA=8C=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_manufacturing/models/stock.py | 2 +-
sf_warehouse/models/model.py | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py
index d777d48b..6ea88c4c 100644
--- a/sf_manufacturing/models/stock.py
+++ b/sf_manufacturing/models/stock.py
@@ -280,7 +280,7 @@ class ProductionLot(models.Model):
if not last_serial:
return "%s-%s%03d" % (product.cutting_tool_model_id.code[:-12], now, 1)
else:
- return "%s-%s%03d" % (product.cutting_tool_model_id.code[:-12], now, int(last_serial.name[-3:]) + 2)
+ return "%s-%s%03d" % (product.cutting_tool_model_id.code[:-12], now, int(last_serial.name[-3:]) + 1)
else:
raise ValidationError('该刀具物料产品的型号字段为空,请补充完整!!!')
diff --git a/sf_warehouse/models/model.py b/sf_warehouse/models/model.py
index 84e2a771..6e1dd356 100644
--- a/sf_warehouse/models/model.py
+++ b/sf_warehouse/models/model.py
@@ -749,6 +749,8 @@ class SfStockPicking(models.Model):
if move and move.product_id.cutting_tool_material_id.name == '刀柄':
for item in move.move_line_nosuggest_ids:
if item.location_dest_id.name == '进货':
+ if not item.rfid:
+ raise ValidationError('你需要提供%s的Rfid' % move.product_id.name)
self.env['stock.lot'].search([('name', '=', item.lot_name)]).write({'rfid': item.rfid})
return res
From aac5195b4d8d44692e2435751ee4d987bb1c9de4 Mon Sep 17 00:00:00 2001
From: yuxianghui <3437689193@qq.com>
Date: Tue, 2 Apr 2024 16:38:19 +0800
Subject: [PATCH 06/11] =?UTF-8?q?=E5=BD=93=E4=BA=A7=E5=93=81=E7=9A=84?=
=?UTF-8?q?=E5=88=80=E5=85=B7=E7=89=A9=E6=96=99=E4=B8=8D=E6=98=AF=E5=88=80?=
=?UTF-8?q?=E6=9F=84=E6=97=B6=EF=BC=8C=E9=9A=90=E8=97=8F=E5=AF=B9=E5=BA=94?=
=?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8F=B7=E6=A8=A1=E5=9E=8B=E7=9A=84Rfid?=
=?UTF-8?q?=E5=AD=97=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_manufacturing/views/stock_lot_views.xml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/sf_manufacturing/views/stock_lot_views.xml b/sf_manufacturing/views/stock_lot_views.xml
index f7ef9c9b..1d371102 100644
--- a/sf_manufacturing/views/stock_lot_views.xml
+++ b/sf_manufacturing/views/stock_lot_views.xml
@@ -14,7 +14,8 @@
-
+
+
From 02e597227213401873a73cb48d8e4dbd69c3d7f1 Mon Sep 17 00:00:00 2001
From: yuxianghui <3437689193@qq.com>
Date: Wed, 3 Apr 2024 16:52:16 +0800
Subject: [PATCH 07/11] =?UTF-8?q?1=E3=80=81=E6=96=B0=E5=A2=9E=E8=A3=85?=
=?UTF-8?q?=E5=A4=B9=E9=A2=84=E8=B0=83=E5=B7=A5=E5=8D=95=E6=89=AB=E6=8B=96?=
=?UTF-8?q?=E7=9B=98Rfid=E7=BB=91=E5=AE=9A=E6=89=98=E7=9B=98=EF=BC=9B2?=
=?UTF-8?q?=E3=80=81=E5=88=A0=E9=99=A4=E5=B7=A5=E5=8D=95=E7=9A=84Rfid?=
=?UTF-8?q?=E5=AD=97=E6=AE=B5=E7=9A=84customRFID=E6=A0=B7=E5=BC=8F?=
=?UTF-8?q?=EF=BC=9B3=E3=80=81=E4=BF=AE=E6=94=B9=E5=BA=8F=E5=88=97?=
=?UTF-8?q?=E5=8F=B7=E6=A8=A1=E5=9E=8B=E7=9A=84Rfid=E5=AD=97=E6=AE=B5?=
=?UTF-8?q?=E7=9A=84=E9=9A=90=E8=97=8F=E6=9D=A1=E4=BB=B6=EF=BC=9B4?=
=?UTF-8?q?=E3=80=81=E4=BC=98=E5=8C=96=E5=88=80=E6=9F=84=E3=80=81=E6=89=98?=
=?UTF-8?q?=E7=9B=98=E7=89=A9=E6=96=99=E9=87=87=E8=B4=AD=E6=97=B6=E7=BB=91?=
=?UTF-8?q?=E5=AE=9ARfid=E7=9A=84=E5=88=A4=E6=96=AD=E6=9D=A1=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_manufacturing/models/mrp_workorder.py | 120 +++++++++++-------
sf_manufacturing/models/stock.py | 1 -
sf_manufacturing/views/mrp_workorder_view.xml | 5 +-
sf_manufacturing/views/stock_lot_views.xml | 3 +-
sf_warehouse/models/model.py | 21 ++-
5 files changed, 89 insertions(+), 61 deletions(-)
diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py
index 7b3467b7..c71411c3 100644
--- a/sf_manufacturing/models/mrp_workorder.py
+++ b/sf_manufacturing/models/mrp_workorder.py
@@ -1,3 +1,5 @@
+import re
+
import logging
import base64
import urllib.parse
@@ -819,57 +821,77 @@ class SfWorkOrderBarcodes(models.Model):
workorder = self.env['mrp.workorder'].browse(self.ids)
# workorder = self.env['mrp.workorder'].search(
# [('routing_type', '=', '装夹预调'), ('production_id', '=', self.production_id.id)])
+ workorder_old = self.env['mrp.workorder'].search([('rfid_code', '=', barcode)])
+ if workorder_old:
+ raise UserError('该托盘已绑定工件,请先解除绑定!!!')
if workorder:
if workorder.routing_type == '装夹预调':
- stock_move_line = self.env['stock.move.line'].search([('lot_name', '=', barcode)])
- if stock_move_line.product_id.categ_type == '夹具':
- workorder.write({
- 'tray_serial_number': stock_move_line.lot_name,
- 'tray_product_id': stock_move_line.product_id.id,
- 'tray_brand_id': stock_move_line.product_id.brand_id.id,
- 'tray_type_id': stock_move_line.product_id.fixture_material_id.id,
- 'tray_model_id': stock_move_line.product_id.fixture_model_id.id
- })
- workorder.button_start()
- # return {
- # 'type': 'ir.actions.act_window',
- # 'res_model': 'mrp.workorder',
- # 'view_mode': 'form',
- # 'domain': [('id', 'in', workorder.id)],
- # 'target': 'current'
- # }
- else:
- embryo_stock_lot = self.env['stock.lot'].search([('name', '=', barcode)])
- if embryo_stock_lot:
- embryo_stock_move_line = self.env['stock.move.line'].search(
- [('product_id', '=', embryo_stock_lot.product_id.id),
- ('reference', '=', workorder.production_id.name),
- ('lot_id', '=', embryo_stock_lot.id),
- ('product_category_name', '=', '坯料')])
- if embryo_stock_move_line:
- bom_production = self.env['mrp.production'].search(
- [('product_id', '=', embryo_stock_lot.product_id.id),
- ('origin', '=', workorder.production_id.name)], limit=1, order='id asc')
- workpiece_delivery = self.env['sf.workpiece.delivery'].search(
- [('workorder_id', '=', workorder.id)], limit=1, order='id asc')
- if workpiece_delivery:
- embryo_workpiece_code = workpiece_delivery.workpiece_code
- if bom_production:
- if workpiece_delivery.workpiece_code and bom_production.name not in \
- workpiece_delivery.workpiece_code:
- embryo_workpiece_code = workpiece_delivery.workpiece_code + ',' + \
- bom_production.name
- if not workpiece_delivery.workpiece_code:
- embryo_workpiece_code = bom_production.name
- workpiece_delivery.write({'workpiece_code': embryo_workpiece_code})
- else:
- raise UserError('工件生产线不一致,请重新确认')
- else:
- workorder_rfid = self.env['mrp.workorder'].search(
- [('production_id', '=', workorder.production_id.id)])
- if workorder_rfid:
- for item in workorder_rfid:
- item.write({'rfid_code': barcode})
+ lots = self.env['stock.lot'].sudo().search([('rfid', '=', barcode)])
+ if lots:
+ for lot in lots:
+ if lot.product_id.categ_type == '夹具':
+ workorder.write({
+ 'tray_serial_number': lot.name,
+ 'tray_product_id': lot.product_id.id,
+ 'tray_brand_id': lot.product_id.brand_id.id,
+ 'tray_type_id': lot.product_id.fixture_material_id.id,
+ 'tray_model_id': lot.product_id.fixture_model_id.id
+ })
+ workorder_rfid = self.env['mrp.workorder'].search(
+ [('production_id', '=', workorder.production_id.id)])
+ if workorder_rfid:
+ for item in workorder_rfid:
+ item.write({'rfid_code': barcode})
+ workorder.env.cr.commit()
+ # stock_move_line = self.env['stock.move.line'].search([('lot_name', '=', barcode)])
+ # if stock_move_line.product_id.categ_type == '夹具':
+ # workorder.write({
+ # 'tray_serial_number': stock_move_line.lot_name,
+ # 'tray_product_id': stock_move_line.product_id.id,
+ # 'tray_brand_id': stock_move_line.product_id.brand_id.id,
+ # 'tray_type_id': stock_move_line.product_id.fixture_material_id.id,
+ # 'tray_model_id': stock_move_line.product_id.fixture_model_id.id
+ # })
+ # workorder.button_start()
+ # # return {
+ # # 'type': 'ir.actions.act_window',
+ # # 'res_model': 'mrp.workorder',
+ # # 'view_mode': 'form',
+ # # 'domain': [('id', 'in', workorder.id)],
+ # # 'target': 'current'
+ # # }
+ # else:
+ # embryo_stock_lot = self.env['stock.lot'].search([('name', '=', barcode)])
+ # if embryo_stock_lot:
+ # embryo_stock_move_line = self.env['stock.move.line'].search(
+ # [('product_id', '=', embryo_stock_lot.product_id.id),
+ # ('reference', '=', workorder.production_id.name),
+ # ('lot_id', '=', embryo_stock_lot.id),
+ # ('product_category_name', '=', '坯料')])
+ # if embryo_stock_move_line:
+ # bom_production = self.env['mrp.production'].search(
+ # [('product_id', '=', embryo_stock_lot.product_id.id),
+ # ('origin', '=', workorder.production_id.name)], limit=1, order='id asc')
+ # workpiece_delivery = self.env['sf.workpiece.delivery'].search(
+ # [('workorder_id', '=', workorder.id)], limit=1, order='id asc')
+ # if workpiece_delivery:
+ # embryo_workpiece_code = workpiece_delivery.workpiece_code
+ # if bom_production:
+ # if workpiece_delivery.workpiece_code and bom_production.name not in \
+ # workpiece_delivery.workpiece_code:
+ # embryo_workpiece_code = workpiece_delivery.workpiece_code + ',' + \
+ # bom_production.name
+ # if not workpiece_delivery.workpiece_code:
+ # embryo_workpiece_code = bom_production.name
+ # workpiece_delivery.write({'workpiece_code': embryo_workpiece_code})
+ # else:
+ # raise UserError('工件生产线不一致,请重新确认')
+ # else:
+ # workorder_rfid = self.env['mrp.workorder'].search(
+ # [('production_id', '=', workorder.production_id.id)])
+ # if workorder_rfid:
+ # for item in workorder_rfid:
+ # item.write({'rfid_code': barcode})
class WorkPieceDelivery(models.Model):
diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py
index 6ea88c4c..5833b095 100644
--- a/sf_manufacturing/models/stock.py
+++ b/sf_manufacturing/models/stock.py
@@ -223,7 +223,6 @@ class ProductionLot(models.Model):
_inherit = ['stock.lot', 'printing.utils']
rfid = fields.Char('Rfid', readonly=True)
- product_material_name = fields.Char('刀具产品物料名称', related='product_id.cutting_tool_material_id.name')
product_specification = fields.Char('规格', compute='_compute_product_specification', store=True)
@api.depends('product_id')
diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml
index 4a766526..b1ca9946 100644
--- a/sf_manufacturing/views/mrp_workorder_view.xml
+++ b/sf_manufacturing/views/mrp_workorder_view.xml
@@ -184,10 +184,9 @@
attrs='{"invisible": [("routing_type","!=","装夹预调")]}'/>
-
-
@@ -242,6 +241,7 @@
+
@@ -250,7 +250,6 @@
-
diff --git a/sf_manufacturing/views/stock_lot_views.xml b/sf_manufacturing/views/stock_lot_views.xml
index 1d371102..aef50e55 100644
--- a/sf_manufacturing/views/stock_lot_views.xml
+++ b/sf_manufacturing/views/stock_lot_views.xml
@@ -14,8 +14,7 @@
-
-
+
diff --git a/sf_warehouse/models/model.py b/sf_warehouse/models/model.py
index 6e1dd356..cc2e20c8 100644
--- a/sf_warehouse/models/model.py
+++ b/sf_warehouse/models/model.py
@@ -1,4 +1,6 @@
# -*- coding: utf-8 -*-
+import re
+
import datetime
import logging
import base64
@@ -424,7 +426,7 @@ class Sf_stock_move_line(models.Model):
# lot_qr_code = fields.Binary(string='二维码', compute='_compute_lot_qr_code', store=True)
lot_qr_code = fields.Binary(string='二维码', compute='_compute_lot_qr_code', store=True)
- rfid = fields.Char('Rfid')
+ rfid = fields.Char('Rfid', readonly=True)
def action_revert_inventory(self):
# 检查用户是否有执行操作的权限
@@ -746,7 +748,8 @@ class SfStockPicking(models.Model):
line.current_location_id.location_status = '空闲'
for move in self.move_ids:
- if move and move.product_id.cutting_tool_material_id.name == '刀柄':
+ if move and move.product_id.cutting_tool_material_id.name == '刀柄' or '托盘' in (
+ move.product_id.fixture_material_id.name or ''):
for item in move.move_line_nosuggest_ids:
if item.location_dest_id.name == '进货':
if not item.rfid:
@@ -950,16 +953,22 @@ class CustomStockMove(models.Model):
"""
for record in self:
if record:
- if '刀柄' in record.product_id.cutting_tool_material_id.name:
+ if '刀柄' in (record.product_id.cutting_tool_material_id.name or '') or '托盘' in (
+ record.product_id.fixture_material_id.name or ''):
for move_line_nosuggest_id in record.move_line_nosuggest_ids:
if move_line_nosuggest_id.rfid:
if move_line_nosuggest_id.rfid == barcode:
- raise ValidationError('该刀柄的rfid已经录入,请勿重复录入!!!')
+ if record.product_id.cutting_tool_material_id.name:
+ raise ValidationError('该刀柄的Rfid已经录入,请勿重复录入!!!')
+ else:
+ raise ValidationError('该托盘的Rfid已经录入,请勿重复录入!!!')
else:
- move_line_nosuggest_id.sudo().rfid = barcode
+ line_id = int(re.sub(r"\D", "", str(move_line_nosuggest_id.id)))
+ self.env['stock.move.line'].sudo().search([('id', '=', line_id)]).write({'rfid': barcode})
+ move_line_nosuggest_id.rfid = barcode
break
else:
- raise ValidationError('该产品不是刀柄!!!')
+ raise ValidationError('该产品不需要录入Rfid!!!')
def action_assign_serial_show_details(self):
# 首先执行原有逻辑
From 2ef832c17ec7e04e99dbeb5033d96c2f223d2e42 Mon Sep 17 00:00:00 2001
From: yuxianghui <3437689193@qq.com>
Date: Wed, 3 Apr 2024 17:23:57 +0800
Subject: [PATCH 08/11] =?UTF-8?q?=E6=9A=82=E6=97=B6=E5=85=B3=E9=97=AD?=
=?UTF-8?q?=E5=B7=A5=E5=8D=95=E6=89=ABRfid=E7=BB=91=E5=AE=9A=E6=89=98?=
=?UTF-8?q?=E7=9B=98=E7=9A=84Rfid=E9=87=8D=E5=A4=8D=E9=AA=8C=E8=AF=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_manufacturing/models/mrp_workorder.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py
index c71411c3..14af7aab 100644
--- a/sf_manufacturing/models/mrp_workorder.py
+++ b/sf_manufacturing/models/mrp_workorder.py
@@ -821,9 +821,9 @@ class SfWorkOrderBarcodes(models.Model):
workorder = self.env['mrp.workorder'].browse(self.ids)
# workorder = self.env['mrp.workorder'].search(
# [('routing_type', '=', '装夹预调'), ('production_id', '=', self.production_id.id)])
- workorder_old = self.env['mrp.workorder'].search([('rfid_code', '=', barcode)])
- if workorder_old:
- raise UserError('该托盘已绑定工件,请先解除绑定!!!')
+ # workorder_old = self.env['mrp.workorder'].search([('rfid_code', '=', barcode)])
+ # if workorder_old:
+ # raise UserError('该托盘已绑定工件,请先解除绑定!!!')
if workorder:
if workorder.routing_type == '装夹预调':
lots = self.env['stock.lot'].sudo().search([('rfid', '=', barcode)])
From 4dd733c466a2fda0683517e2e9dc6c20f8414280 Mon Sep 17 00:00:00 2001
From: yuxianghui <3437689193@qq.com>
Date: Sun, 7 Apr 2024 15:35:47 +0800
Subject: [PATCH 09/11] =?UTF-8?q?1=E3=80=81=E5=A4=84=E7=90=86=E5=88=80?=
=?UTF-8?q?=E5=85=B7=E7=89=A9=E6=96=99=E6=B3=A8=E5=86=8C=E6=97=B6=E6=90=9C?=
=?UTF-8?q?=E7=B4=A2=E4=B8=8D=E5=88=B0=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9B?=
=?UTF-8?q?2=E3=80=81=E5=8A=9F=E8=83=BD=E5=88=80=E5=85=B7=E7=BB=84?=
=?UTF-8?q?=E8=A3=85=E6=97=B6=EF=BC=8C=E5=BD=93=E6=B2=A1=E6=9C=89=E9=80=89?=
=?UTF-8?q?=E6=8B=A9=E7=89=A9=E6=96=99=E7=9A=84=E6=97=B6=E5=80=99=E5=8A=9F?=
=?UTF-8?q?=E8=83=BD=E5=88=80=E5=85=B7=E7=BC=96=E7=A0=81=E4=B8=8D=E6=98=BE?=
=?UTF-8?q?=E7=A4=BA=E6=95=B0=E6=8D=AE=EF=BC=9B=E6=B7=BB=E5=8A=A0=E6=9C=80?=
=?UTF-8?q?=E5=A4=A7=E5=AF=BF=E5=91=BD=E5=80=BC=E3=80=81=E6=8A=A5=E8=AD=A6?=
=?UTF-8?q?=E5=80=BC=E3=80=81=E6=9C=89=E6=95=88=E9=95=BF=E3=80=81=E9=81=BF?=
=?UTF-8?q?=E7=A9=BA=E9=95=BF=E7=9A=84=E5=BF=85=E5=A1=AB=E9=AA=8C=E8=AF=81?=
=?UTF-8?q?=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_tool_management/models/functional_tool_enroll.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sf_tool_management/models/functional_tool_enroll.py b/sf_tool_management/models/functional_tool_enroll.py
index d762c865..8fb781f8 100644
--- a/sf_tool_management/models/functional_tool_enroll.py
+++ b/sf_tool_management/models/functional_tool_enroll.py
@@ -40,7 +40,7 @@ class StockLot(models.Model):
sf_secret_key = sf_sync_config['sf_secret_key']
headers = Common.get_headers(self, token, sf_secret_key)
str_url = sf_sync_config['sf_url'] + "/api/tool_material_stock/create"
- objs_all = self.env['stock.lot'].search([('id', '=', self.id)])
+ objs_all = self.env['stock.lot'].search([('id', '=', self.id), ('active', 'in', [True, False])])
tool_material_stock_list = []
if objs_all:
for item in objs_all:
From 000280e53a00362914455e674d7999a85ab519d8 Mon Sep 17 00:00:00 2001
From: yuxianghui <3437689193@qq.com>
Date: Sun, 7 Apr 2024 15:36:05 +0800
Subject: [PATCH 10/11] no message
---
sf_tool_management/wizard/wizard.py | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/sf_tool_management/wizard/wizard.py b/sf_tool_management/wizard/wizard.py
index 285da727..90b8da63 100644
--- a/sf_tool_management/wizard/wizard.py
+++ b/sf_tool_management/wizard/wizard.py
@@ -413,7 +413,7 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
num = self._get_code(str_2)
obj.tool_code = str_2 + str(num)
else:
- obj.tool_code = None
+ obj.tool_code = ''
def _get_code(self, str_2):
functional_tool_assembly = self.env['sf.functional.tool.assembly'].sudo().search(
@@ -470,13 +470,23 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
else:
record.L_D_number = 0
- @api.constrains('after_assembly_tool_loading_length', 'after_assembly_functional_tool_length')
+ @api.constrains('after_assembly_tool_loading_length', 'after_assembly_functional_tool_length',
+ 'after_assembly_max_lifetime_value', 'after_assembly_alarm_value',
+ 'after_assembly_effective_length', 'hiding_length')
def _check_length_control(self):
for obj in self:
if obj.after_assembly_tool_loading_length == 0:
raise ValidationError('组装参数信息【总长度】不能为0!!!')
if obj.after_assembly_functional_tool_length == 0:
raise ValidationError('组装参数信息【伸出长】不能为0!!!')
+ if obj.after_assembly_max_lifetime_value == 0:
+ raise ValidationError('组装参数信息【最大寿命值】不能为0!!!')
+ if obj.after_assembly_alarm_value == 0:
+ raise ValidationError('组装参数信息【报警值】不能为0!!!')
+ if obj.after_assembly_effective_length == 0:
+ raise ValidationError('组装参数信息【有效长】不能为0!!!')
+ if obj.hiding_length == 0:
+ raise ValidationError('组装参数信息【避空长】不能为0!!!')
def functional_tool_assembly(self):
"""
From 4faeda11b839b27a3745e1111eebb4566eea83ce Mon Sep 17 00:00:00 2001
From: yuxianghui <3437689193@qq.com>
Date: Mon, 8 Apr 2024 14:43:46 +0800
Subject: [PATCH 11/11] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96=E5=B7=A5?=
=?UTF-8?q?=E5=8D=95=E6=89=AB=E6=89=98=E7=9B=98Rfid=E7=BB=91=E5=AE=9ARfid?=
=?UTF-8?q?=E7=A0=81=E5=BD=95=E5=85=A5=E4=BF=A1=E6=81=AF=E6=97=B6=EF=BC=8C?=
=?UTF-8?q?=E5=B7=A5=E5=8D=95=E7=9A=84=E5=BC=80=E5=A7=8B=E7=AD=89=E6=8C=89?=
=?UTF-8?q?=E9=94=AE=E6=B6=88=E5=A4=B1=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_manufacturing/models/mrp_workorder.py | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py
index 14af7aab..3b6e8ead 100644
--- a/sf_manufacturing/models/mrp_workorder.py
+++ b/sf_manufacturing/models/mrp_workorder.py
@@ -826,23 +826,30 @@ class SfWorkOrderBarcodes(models.Model):
# raise UserError('该托盘已绑定工件,请先解除绑定!!!')
if workorder:
if workorder.routing_type == '装夹预调':
+ if workorder.state in ['progress', 'done']:
+ work_state = {'progress': '进行中', 'done': '已完工'}
+ raise UserError('该工单%s,不能重新绑定托盘' % work_state.get(workorder.state))
lots = self.env['stock.lot'].sudo().search([('rfid', '=', barcode)])
if lots:
for lot in lots:
if lot.product_id.categ_type == '夹具':
- workorder.write({
+ val = {
'tray_serial_number': lot.name,
'tray_product_id': lot.product_id.id,
'tray_brand_id': lot.product_id.brand_id.id,
'tray_type_id': lot.product_id.fixture_material_id.id,
- 'tray_model_id': lot.product_id.fixture_model_id.id
- })
+ 'tray_model_id': lot.product_id.fixture_model_id.id,
+ 'rfid_code': barcode
+ }
+ workorder.write(val)
+ self.write(val)
workorder_rfid = self.env['mrp.workorder'].search(
[('production_id', '=', workorder.production_id.id)])
if workorder_rfid:
for item in workorder_rfid:
item.write({'rfid_code': barcode})
- workorder.env.cr.commit()
+ else:
+ raise UserError('该托盘信息不存在!!!')
# stock_move_line = self.env['stock.move.line'].search([('lot_name', '=', barcode)])
# if stock_move_line.product_id.categ_type == '夹具':
# workorder.write({