diff --git a/sf_base/security/group_security.xml b/sf_base/security/group_security.xml
index b45a2dbd..c08a0ad4 100644
--- a/sf_base/security/group_security.xml
+++ b/sf_base/security/group_security.xml
@@ -46,6 +46,11 @@
+
+ 工艺工程师
+
+
+
计划
diff --git a/sf_manufacturing/models/mrp_routing_workcenter.py b/sf_manufacturing/models/mrp_routing_workcenter.py
index a584379f..ef451df7 100644
--- a/sf_manufacturing/models/mrp_routing_workcenter.py
+++ b/sf_manufacturing/models/mrp_routing_workcenter.py
@@ -7,15 +7,16 @@ class ResMrpRoutingWorkcenter(models.Model):
_inherit = 'mrp.routing.workcenter'
routing_type = fields.Selection([
- # ('获取CNC加工程序', '获取CNC加工程序'),
('装夹预调', '装夹预调'),
- # ('前置三元定位检测', '前置三元定位检测'),
('CNC加工', 'CNC加工'),
- # ('后置三元质量检测', '后置三元质量检测'),
('解除装夹', '解除装夹'),
('切割', '切割'),
('表面工艺', '表面工艺')
], string="工序类型")
+ routing_tag = fields.Selection([
+ ('Standard', '标准'),
+ ('special', '特殊')
+ ], string="标签")
is_repeat = fields.Boolean('重复', default=False)
workcenter_id = fields.Many2one('mrp.workcenter', required=False)
workcenter_ids = fields.Many2many('mrp.workcenter', 'rel_workcenter_route', required=True)
diff --git a/sf_manufacturing/models/sf_technology_design.py b/sf_manufacturing/models/sf_technology_design.py
index f4e4d176..afb5f05b 100644
--- a/sf_manufacturing/models/sf_technology_design.py
+++ b/sf_manufacturing/models/sf_technology_design.py
@@ -11,12 +11,17 @@ class sf_technology_design(models.Model):
sequence = fields.Integer('序号')
time_cycle_manual = fields.Float('预计时长')
production_id = fields.Many2one('mrp.production')
+ is_auto = fields.Boolean('是否自动生成', default=False)
active = fields.Boolean('有效', default=True)
- def json_technology_design_str(self, k, route):
+ def json_technology_design_str(self, k, route_name, time_cycle_manual, i):
workorders_values_str = [0, '', {
- 'name': route.route_workcenter_id.name,
+ 'name': route_name,
'panel': k,
- 'sequence': False,
- 'time_cycle_manual':route.route_workcenter_id.time_cycle_manual }]
+ 'sequence': i,
+ 'is_auto': True,
+ 'time_cycle_manual': time_cycle_manual}]
return workorders_values_str
+
+ def unlink_technology_design(self):
+ self.active = False
diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py
index a48d9461..6fd56eb3 100644
--- a/sf_manufacturing/models/stock.py
+++ b/sf_manufacturing/models/stock.py
@@ -294,33 +294,31 @@ class StockRule(models.Model):
# 为同一个product_id创建一个生产订单名称列表
product_id_to_production_names[product_id] = [production.name for production in all_production]
for production_item in productions:
-
production_programming = self.env['mrp.production'].search(
[('product_id.id', '=', production_item.product_id.id),
('origin', '=', production_item.origin)],
limit=1, order='id asc')
if production_item.product_id.id in product_id_to_production_names:
- if not production_programming.programming_no:
- if production_item.product_id.model_process_parameters_ids:
- is_purchase = False
- sorted_process_parameters = sorted(production_item.product_id.model_process_parameters_ids,
- key=lambda w: w.id)
+ if production_item.product_id.model_process_parameters_ids:
+ is_purchase = False
+ sorted_process_parameters = sorted(production_item.product_id.model_process_parameters_ids,
+ key=lambda w: w.id)
- consecutive_process_parameters = []
- m = 0
- for i in range(len(sorted_process_parameters) - 1):
- if m == 0:
- is_purchase = False
- if self.env['product.template']._get_process_parameters_product(
- sorted_process_parameters[i]).partner_id == self.env[
- 'product.template']._get_process_parameters_product(sorted_process_parameters[
- i + 1]).partner_id and \
- sorted_process_parameters[i].gain_way == '外协':
- if sorted_process_parameters[i] not in consecutive_process_parameters:
- consecutive_process_parameters.append(sorted_process_parameters[i])
- consecutive_process_parameters.append(sorted_process_parameters[i + 1])
- m += 1
- continue
+ consecutive_process_parameters = []
+ m = 0
+ for i in range(len(sorted_process_parameters) - 1):
+ if m == 0:
+ is_purchase = False
+ if self.env['product.template']._get_process_parameters_product(
+ sorted_process_parameters[i]).partner_id == self.env[
+ 'product.template']._get_process_parameters_product(sorted_process_parameters[
+ i + 1]).partner_id and \
+ sorted_process_parameters[i].gain_way == '外协':
+ if sorted_process_parameters[i] not in consecutive_process_parameters:
+ consecutive_process_parameters.append(sorted_process_parameters[i])
+ consecutive_process_parameters.append(sorted_process_parameters[i + 1])
+ m += 1
+ continue
else:
if m == len(consecutive_process_parameters) - 1 and m != 0:
self.env['purchase.order'].get_purchase_order(consecutive_process_parameters,
@@ -330,7 +328,7 @@ class StockRule(models.Model):
is_purchase = True
consecutive_process_parameters = []
m = 0
- # 当前面的连续外协采购单生成再生成当前外协采购单
+ # 当前面的连续外协采购单生成再生成当前外协采购单
if is_purchase is False:
self.env['purchase.order'].get_purchase_order(consecutive_process_parameters,
production_item,
@@ -356,33 +354,70 @@ class StockRule(models.Model):
self.env['purchase.order'].get_purchase_order(sorted_process_parameters[i],
production_item,
product_id_to_production_names)
+ if not technology_design_values:
+ if production.product_id.categ_id.type == '成品':
+ production.product_id.model_processing_panel = 'ZM,FM'
+ # 根据加工面板的面数及成品工序模板生成工序设计
+ i = 0
+ for k in (production.product_id.model_processing_panel.split(',')):
+ product_routing_workcenter = self.env['sf.product.model.type.routing.sort'].search(
+ [('product_model_type_id', '=', production.product_id.product_model_type_id.id)],
+ order='sequence asc'
+ )
+ for route in product_routing_workcenter:
+ i += 1
+ technology_design_values.append(
+ self.env['sf.technology.design'].json_technology_design_str(k,
+ route.route_workcenter_id.name,
+ route.route_workcenter_id.time_cycle_manual,
+ i))
+ surface_technics_arr = []
+ route_workcenter_arr = []
+ for process_param in production.product_id.product_model_type_id.surface_technics_routing_tmpl_ids.filtered(
+ lambda st: st.id in production.product_id.model_process_parameters_ids.ids):
+ # if item.route_workcenter_id.surface_technics_id.id:
+ # for process_param in production.product_id.model_process_parameters_ids:
+ logging.info('process_param:%s%s' % (process_param.id, process_param.name))
+ if item.route_workcenter_id.surface_technics_id == process_param.process_id:
+ logging.info(
+ 'surface_technics_id:%s%s' % (
+ item.route_workcenter_id.surface_technics_id.id,
+ item.route_workcenter_id.surface_technics_id.name))
+ surface_technics_arr.append(
+ item.route_workcenter_id.surface_technics_id.id)
+ route_workcenter_arr.append(item.route_workcenter_id.id)
+ if surface_technics_arr:
+ production_process = self.env['sf.production.process'].search(
+ [('id', 'in', surface_technics_arr)],
+ order='sequence asc'
+ )
+ for p in production_process:
+ logging.info('production_process:%s' % p.name)
+ process_parameter = production.product_id.model_process_parameters_ids.filtered(
+ lambda pm: pm.process_id.id == p.id)
+ if process_parameter:
+ i += 1
+ route_production_process = self.env[
+ 'mrp.routing.workcenter'].search(
+ [('surface_technics_id', '=', p.id),
+ ('id', 'in', route_workcenter_arr)])
+ technology_design_values.append(
+ self.env['sf.technology.design'].json_technology_design_str(k,
+ process_parameter.display_name,
+ route_production_process.time_cycle_manual,
+ i))
+ productions.technology_design_ids = technology_design_values
- if production.product_id.categ_id.type == '成品':
- # 根据加工面板的面数及成品工序模板生成工序设计
- i = 0
- for k in (production.product_id.model_processing_panel.split(',')):
- product_routing_workcenter = self.env['sf.product.model.type.routing.sort'].search(
- [('product_model_type_id', '=', production.product_id.product_model_type_id.id)],
- order='sequence asc'
- )
- i += 1
- for route in product_routing_workcenter:
- technology_design_values.append(
- self.env['sf.technology.design'].json_technology_design_str(k, route))
- for process in sorted_process_parameters:
- technology_design_values.append(
- self.env['sf.technology.design'].json_technology_design_str(k, process))
-
- # # 同一个产品多个制造订单对应一个编程单和模型库
- # # 只调用一次fetchCNC,并将所有生产订单的名称作为字符串传递
- # if not production_item.programming_no:
- # if not production_programming.programming_no:
- # production_item.fetchCNC(
- # ', '.join(product_id_to_production_names[production_item.product_id.id]))
- # else:
- # production_item.write({'programming_no': production_programming.programming_no,
- # 'programming_state': '编程中'})
- return True
+ # # 同一个产品多个制造订单对应一个编程单和模型库
+ # # 只调用一次fetchCNC,并将所有生产订单的名称作为字符串传递
+ # if not production_item.programming_no:
+ # if not production_programming.programming_no:
+ # production_item.fetchCNC(
+ # ', '.join(product_id_to_production_names[production_item.product_id.id]))
+ # else:
+ # production_item.write({'programming_no': production_programming.programming_no,
+ # 'programming_state': '编程中'})
+ return True
class ProductionLot(models.Model):
diff --git a/sf_manufacturing/security/ir.model.access.csv b/sf_manufacturing/security/ir.model.access.csv
index be71cb0d..270c0f18 100644
--- a/sf_manufacturing/security/ir.model.access.csv
+++ b/sf_manufacturing/security/ir.model.access.csv
@@ -165,7 +165,8 @@ access_sf_agv_scheduling_group_sf_order_user,sf_agv_scheduling_group_sf_order_us
access_sf_agv_scheduling_group_sf_mrp_manager,sf_agv_scheduling_group_sf_mrp_manager,model_sf_agv_scheduling,sf_base.group_sf_mrp_manager,1,1,1,0
access_sf_agv_scheduling_group_sf_equipment_user,sf_agv_scheduling_group_sf_equipment_user,model_sf_agv_scheduling,sf_base.group_sf_equipment_user,1,1,1,0
-
-
+access_sf_technology_design_group_plan_dispatch,sf_technology_design_group_plan_dispatch,model_sf_technology_design,sf_base.group_plan_dispatch,1,1,1,0
+access_sf_technology_design_group_sf_mrp_manager,sf_technology_design_group_sf_mrp_manager,model_sf_technology_design,sf_base.group_sf_mrp_manager,1,1,1,0
+access_sf_technology_design_group_production_engineer,sf_technology_design_group_production_engineer,model_sf_technology_design,sf_base.group_production_engineer,1,1,1,0
diff --git a/sf_manufacturing/views/mrp_production_addional_change.xml b/sf_manufacturing/views/mrp_production_addional_change.xml
index 3d5aa625..42b68eae 100644
--- a/sf_manufacturing/views/mrp_production_addional_change.xml
+++ b/sf_manufacturing/views/mrp_production_addional_change.xml
@@ -337,6 +337,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sf_manufacturing/views/mrp_routing_workcenter_view.xml b/sf_manufacturing/views/mrp_routing_workcenter_view.xml
index eada92d9..ddb9558c 100644
--- a/sf_manufacturing/views/mrp_routing_workcenter_view.xml
+++ b/sf_manufacturing/views/mrp_routing_workcenter_view.xml
@@ -16,6 +16,7 @@
+