diff --git a/sf_base/models/tool_base_new.py b/sf_base/models/tool_base_new.py
index 7977ed80..98eea36c 100644
--- a/sf_base/models/tool_base_new.py
+++ b/sf_base/models/tool_base_new.py
@@ -331,7 +331,7 @@ class ToolInventory(models.Model):
work_material = fields.Selection([('钢', '钢'), ('铝', '铝')], string='加工材料')
life_span = fields.Float('寿命(min)')
- tool_groups_id = fields.Many2one('sf.tool.groups', string='刀具组')
+ tool_groups_id = fields.Many2one('sf.tool.groups', string='刀具组', required=True)
active = fields.Boolean('已归档', default=True)
diff --git a/sf_base/views/tool_views.xml b/sf_base/views/tool_views.xml
index 1e82b8c2..87dbd94c 100644
--- a/sf_base/views/tool_views.xml
+++ b/sf_base/views/tool_views.xml
@@ -555,9 +555,9 @@
sf.tool.inventory
-
+
-
+
diff --git a/sf_machine_connect/views/compensation.xml b/sf_machine_connect/views/compensation.xml
index d3b14535..7668d818 100644
--- a/sf_machine_connect/views/compensation.xml
+++ b/sf_machine_connect/views/compensation.xml
@@ -5,10 +5,10 @@
mrp.workorder
-
-
-
-
+ -->
+
+
@@ -23,6 +23,7 @@
diff --git a/sf_manufacturing/controllers/controllers.py b/sf_manufacturing/controllers/controllers.py
index 8284f392..4af8315b 100644
--- a/sf_manufacturing/controllers/controllers.py
+++ b/sf_manufacturing/controllers/controllers.py
@@ -461,25 +461,27 @@ class Manufacturing_Connect(http.Controller):
if f'RfidCode{i}' in ret:
rfid_code = ret[f'RfidCode{i}']
logging.info('RfidCode:%s' % rfid_code)
- domain = [
- ('rfid_code', '=', rfid_code),
- ('routing_type', '=', 'CNC加工')
- ]
- workorder = request.env['mrp.workorder'].sudo().search(domain, order='id asc')
- if workorder:
- for order in workorder:
- if order.production_id.production_line_state == '待上产线':
- logging.info(
- '制造订单产线状态:%s' % order.production_id.production_line_state)
- order.production_id.write({'production_line_state': '已上产线'})
- workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search([
- ('rfid_code', '=', rfid_code), ('type', '=', '上产线'),
- ('production_id', '=', order.production_id.id)])
- if workpiece_delivery.status == '待下发':
- workpiece_delivery.write({'is_manual_work': True})
- else:
- res = {'Succeed': False, 'ErrorCode': 204,
- 'Error': 'DeviceId为%s没有对应的已配送工件数据' % ret['DeviceId']}
+ if rfid_code is not None:
+ domain = [
+ ('rfid_code', '=', rfid_code),
+ ('routing_type', '=', 'CNC加工')
+ ]
+ workorder = request.env['mrp.workorder'].sudo().search(domain, order='id asc')
+ if workorder:
+ for order in workorder:
+ if order.production_id.production_line_state == '待上产线':
+ logging.info(
+ '制造订单产线状态:%s' % order.production_id.production_line_state)
+ order.production_id.write({'production_line_state': '已上产线'})
+ workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search(
+ [
+ ('rfid_code', '=', rfid_code), ('type', '=', '上产线'),
+ ('production_id', '=', order.production_id.id)])
+ if workpiece_delivery.status == '待下发':
+ workpiece_delivery.write({'is_manual_work': True})
+ else:
+ res = {'Succeed': False, 'ErrorCode': 204,
+ 'Error': 'DeviceId为%s没有对应的已配送工件数据' % ret['DeviceId']}
else:
res = {'Succeed': False, 'ErrorCode': 203, 'Error': '未传IsComplete字段'}
else:
@@ -516,24 +518,26 @@ class Manufacturing_Connect(http.Controller):
if f'RfidCode{i}' in ret:
rfid_code = ret[f'RfidCode{i}']
logging.info('RfidCode:%s' % rfid_code)
- domain = [
- ('rfid_code', '=', rfid_code),
- ('routing_type', '=', 'CNC加工')
- ]
- workorder = request.env['mrp.workorder'].sudo().search(domain, order='id asc')
- if workorder:
- for order in workorder:
- if order.production_id.production_line_state == '已上产线':
- logging.info(
- '制造订单产线状态:%s' % order.production_id.production_line_state)
- order.production_id.write({'production_line_state': '已下产线'})
- workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search([
- ('rfid_code', '=', rfid_code), ('type', '=', '下产线'),
- ('production_id', '=', order.production_id.id)])
- delivery_Arr.append(workpiece_delivery.id)
- else:
- res = {'Succeed': False, 'ErrorCode': 204,
- 'Error': 'DeviceId为%s没有对应的已配送工件数据' % ret['DeviceId']}
+ if rfid_code is not None:
+ domain = [
+ ('rfid_code', '=', rfid_code),
+ ('routing_type', '=', 'CNC加工')
+ ]
+ workorder = request.env['mrp.workorder'].sudo().search(domain, order='id asc')
+ if workorder:
+ for order in workorder:
+ if order.production_id.production_line_state == '已上产线':
+ logging.info(
+ '制造订单产线状态:%s' % order.production_id.production_line_state)
+ order.production_id.write({'production_line_state': '已下产线'})
+ workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search(
+ [
+ ('rfid_code', '=', rfid_code), ('type', '=', '下产线'),
+ ('production_id', '=', order.production_id.id)])
+ delivery_Arr.append(workpiece_delivery.id)
+ else:
+ res = {'Succeed': False, 'ErrorCode': 204,
+ 'Error': 'DeviceId为%s没有对应的已配送工件数据' % ret['DeviceId']}
if delivery_Arr:
logging.info('delivery_Arr:%s' % delivery_Arr)
delivery_workpiece = request.env['sf.workpiece.delivery'].sudo().search(
diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py
index aa1ffae0..15a77160 100644
--- a/sf_manufacturing/models/mrp_production.py
+++ b/sf_manufacturing/models/mrp_production.py
@@ -531,46 +531,63 @@ class MrpProduction(models.Model):
def _reset_work_order_sequence(self):
for rec in self:
sequence_list = {}
+ # 产品模型类型
model_type_id = rec.product_id.product_model_type_id
+ # 产品加工面板
+ model_processing_panel = rec.product_id.model_processing_panel
if model_type_id:
- tmpl_num = 1
- # 成品工序
- product_routing_tmpl_ids = model_type_id.product_routing_tmpl_ids
- if product_routing_tmpl_ids:
- for tmpl_id in product_routing_tmpl_ids:
- sequence_list.update({tmpl_id.route_workcenter_id.name: tmpl_num})
- tmpl_num += 1
- # 表面工艺工序
- # 模型类型的表面工艺工序模版
- surface_tmpl_ids = model_type_id.surface_technics_routing_tmpl_ids
- # 产品选择的表面工艺
- model_process_parameters_ids = rec.product_id.model_process_parameters_ids
- process_dict = {}
- if model_process_parameters_ids:
- for process_parameters_id in model_process_parameters_ids:
- process_id = process_parameters_id.process_id
- for surface_tmpl_id in surface_tmpl_ids:
- if process_id == surface_tmpl_id.route_workcenter_id.surface_technics_id:
- surface_tmpl_name = surface_tmpl_id.route_workcenter_id.name
- process_dict.update({int(process_id.category_id.code): '%s-%s' % (
- surface_tmpl_name, process_parameters_id.name)})
- process_list = sorted(process_dict.keys())
- for process_num in process_list:
- sequence_list.update({process_dict.get(process_num): tmpl_num})
- tmpl_num += 1
- # 坯料工序
- tmpl_num = 1
- embryo_routing_tmpl_ids = model_type_id.embryo_routing_tmpl_ids
- if embryo_routing_tmpl_ids:
- for tmpl_id in embryo_routing_tmpl_ids:
- sequence_list.update({tmpl_id.route_workcenter_id.name: tmpl_num})
+ if model_processing_panel:
+ tmpl_num = 1
+ panel_list = model_processing_panel.split(',')
+ for panel in panel_list:
+ panel_sequence_list = {}
+ # 成品工序
+ product_routing_tmpl_ids = model_type_id.product_routing_tmpl_ids
+ if product_routing_tmpl_ids:
+ for tmpl_id in product_routing_tmpl_ids:
+ panel_sequence_list.update({tmpl_id.route_workcenter_id.name: tmpl_num})
+ tmpl_num += 1
+ sequence_list.update({panel: panel_sequence_list})
+ # 表面工艺工序
+ # 模型类型的表面工艺工序模版
+ surface_tmpl_ids = model_type_id.surface_technics_routing_tmpl_ids
+ # 产品选择的表面工艺
+ model_process_parameters_ids = rec.product_id.model_process_parameters_ids
+ process_dict = {}
+ if model_process_parameters_ids:
+ for process_parameters_id in model_process_parameters_ids:
+ process_id = process_parameters_id.process_id
+ for surface_tmpl_id in surface_tmpl_ids:
+ if process_id == surface_tmpl_id.route_workcenter_id.surface_technics_id:
+ surface_tmpl_name = surface_tmpl_id.route_workcenter_id.name
+ process_dict.update({int(process_id.category_id.code): '%s-%s' % (
+ surface_tmpl_name, process_parameters_id.name)})
+ process_list = sorted(process_dict.keys())
+ for process_num in process_list:
+ sequence_list.update({process_dict.get(process_num): tmpl_num})
tmpl_num += 1
+ # 坯料工序
+ tmpl_num = 1
+ embryo_routing_tmpl_ids = model_type_id.embryo_routing_tmpl_ids
+ if embryo_routing_tmpl_ids:
+ for tmpl_id in embryo_routing_tmpl_ids:
+ sequence_list.update({tmpl_id.route_workcenter_id.name: tmpl_num})
+ tmpl_num += 1
+ else:
+ raise ValidationError('该产品【加工面板】为空!')
+
else:
raise ValidationError('该产品没有选择【模版类型】!')
for work in rec.workorder_ids:
if sequence_list.get(work.name):
work.sequence = sequence_list[work.name]
+ elif sequence_list.get(work.processing_panel):
+ processing_panel = sequence_list.get(work.processing_panel)
+ if processing_panel.get(work.name):
+ work.sequence = processing_panel[work.name]
+ else:
+ raise ValidationError('工序【%s】在产品选择的模版类型中不存在!' % work.name)
else:
raise ValidationError('工序【%s】在产品选择的模版类型中不存在!' % work.name)
# if work.name == '获取CNC加工程序':
diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml
index e782e449..a2736834 100644
--- a/sf_manufacturing/views/mrp_workorder_view.xml
+++ b/sf_manufacturing/views/mrp_workorder_view.xml
@@ -162,6 +162,7 @@
attrs="{'invisible': ['|','|',('routing_type','!=','装夹预调'),('is_delivery','=',True),('state','!=','done')]}"/>
@@ -220,12 +221,12 @@
attrs='{"invisible": [("routing_type","in",("获取CNC加工程序","切割"))]}'/>
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/sf_plan/models/custom_plan.py b/sf_plan/models/custom_plan.py
index fcfb8020..db8f4bf9 100644
--- a/sf_plan/models/custom_plan.py
+++ b/sf_plan/models/custom_plan.py
@@ -19,7 +19,7 @@ class sf_production_plan(models.Model):
('done', '已排程'),
('processing', '加工中'),
('finished', '已完成')
- ], string='工单状态', tracking=True)
+ ], string='状态', tracking=True)
state_order = fields.Integer(compute='_compute_state_order', store=True)
@@ -36,7 +36,7 @@ class sf_production_plan(models.Model):
_order = 'state_order asc, write_date desc'
- name = fields.Char(string='工单编号')
+ name = fields.Char(string='制造订单')
active = fields.Boolean(string='已归档', default=True)
# selected = fields.Boolean(default=False)
# order_number = fields.Char(string='订单号')
@@ -52,7 +52,7 @@ class sf_production_plan(models.Model):
schedule_setting = fields.Selection([
('reverse', '倒排'), ('positive', '顺排')], string='排程设置', default='reverse')
product_id = fields.Many2one('product.product', '关联产品')
- origin = fields.Char(string='订单号')
+ origin = fields.Char(string='销售订单')
# # 加工时长
# process_time = fields.Float(string='加工时长', digits=(16, 2))
# 实际加工时长、实际开始时间、实际结束时间
diff --git a/sf_plan/views/view.xml b/sf_plan/views/view.xml
index 3b53efc2..065c97c4 100644
--- a/sf_plan/views/view.xml
+++ b/sf_plan/views/view.xml
@@ -17,18 +17,18 @@
decoration-danger="state == 'finished'"/>
-
+
-
-
-
-
-
+
+
+
+
+
+
+
@@ -68,7 +68,7 @@
-
+
@@ -152,16 +152,27 @@
sf.production.plan
+
-
-
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -188,30 +199,41 @@
+
+
+
-
- 开始时间:
-
+ 销售订单号:
+
-
- 结束时间:
-
-
- -
- 名称:
+ 制造订单号:
+ -
+ 订单交期:
+
+
+ -
+ 产品名称:
+
+
-
数量:
-
- 状态:
-
+ 计划开始时间:
+
+
+ -
+ 计划结束时间:
+
@@ -246,6 +268,8 @@
ir.actions.act_window
sf.production.plan
tree,gantt,form
+
+
{'search_default_draft': 1, 'display_complete': True}