添加工艺设计
This commit is contained in:
@@ -46,6 +46,11 @@
|
|||||||
<field name="category_id" ref="base.module_category_manufacturing_manufacturing"/>
|
<field name="category_id" ref="base.module_category_manufacturing_manufacturing"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<record id="group_production_engineer" model="res.groups">
|
||||||
|
<field name="name">工艺工程师</field>
|
||||||
|
<field name="implied_ids" eval="[(4, ref('group_sf_mrp_user'))]"/>
|
||||||
|
<field name="category_id" ref="base.module_category_manufacturing_manufacturing"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
<record model="ir.module.category" id="module_category_plan">
|
<record model="ir.module.category" id="module_category_plan">
|
||||||
<field name="name">计划</field>
|
<field name="name">计划</field>
|
||||||
|
|||||||
@@ -7,15 +7,16 @@ class ResMrpRoutingWorkcenter(models.Model):
|
|||||||
_inherit = 'mrp.routing.workcenter'
|
_inherit = 'mrp.routing.workcenter'
|
||||||
|
|
||||||
routing_type = fields.Selection([
|
routing_type = fields.Selection([
|
||||||
# ('获取CNC加工程序', '获取CNC加工程序'),
|
|
||||||
('装夹预调', '装夹预调'),
|
('装夹预调', '装夹预调'),
|
||||||
# ('前置三元定位检测', '前置三元定位检测'),
|
|
||||||
('CNC加工', 'CNC加工'),
|
('CNC加工', 'CNC加工'),
|
||||||
# ('后置三元质量检测', '后置三元质量检测'),
|
|
||||||
('解除装夹', '解除装夹'),
|
('解除装夹', '解除装夹'),
|
||||||
('切割', '切割'),
|
('切割', '切割'),
|
||||||
('表面工艺', '表面工艺')
|
('表面工艺', '表面工艺')
|
||||||
], string="工序类型")
|
], string="工序类型")
|
||||||
|
routing_tag = fields.Selection([
|
||||||
|
('Standard', '标准'),
|
||||||
|
('special', '特殊')
|
||||||
|
], string="标签")
|
||||||
is_repeat = fields.Boolean('重复', default=False)
|
is_repeat = fields.Boolean('重复', default=False)
|
||||||
workcenter_id = fields.Many2one('mrp.workcenter', required=False)
|
workcenter_id = fields.Many2one('mrp.workcenter', required=False)
|
||||||
workcenter_ids = fields.Many2many('mrp.workcenter', 'rel_workcenter_route', required=True)
|
workcenter_ids = fields.Many2many('mrp.workcenter', 'rel_workcenter_route', required=True)
|
||||||
|
|||||||
@@ -11,12 +11,17 @@ class sf_technology_design(models.Model):
|
|||||||
sequence = fields.Integer('序号')
|
sequence = fields.Integer('序号')
|
||||||
time_cycle_manual = fields.Float('预计时长')
|
time_cycle_manual = fields.Float('预计时长')
|
||||||
production_id = fields.Many2one('mrp.production')
|
production_id = fields.Many2one('mrp.production')
|
||||||
|
is_auto = fields.Boolean('是否自动生成', default=False)
|
||||||
active = fields.Boolean('有效', default=True)
|
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, '', {
|
workorders_values_str = [0, '', {
|
||||||
'name': route.route_workcenter_id.name,
|
'name': route_name,
|
||||||
'panel': k,
|
'panel': k,
|
||||||
'sequence': False,
|
'sequence': i,
|
||||||
'time_cycle_manual':route.route_workcenter_id.time_cycle_manual }]
|
'is_auto': True,
|
||||||
|
'time_cycle_manual': time_cycle_manual}]
|
||||||
return workorders_values_str
|
return workorders_values_str
|
||||||
|
|
||||||
|
def unlink_technology_design(self):
|
||||||
|
self.active = False
|
||||||
|
|||||||
@@ -294,33 +294,31 @@ class StockRule(models.Model):
|
|||||||
# 为同一个product_id创建一个生产订单名称列表
|
# 为同一个product_id创建一个生产订单名称列表
|
||||||
product_id_to_production_names[product_id] = [production.name for production in all_production]
|
product_id_to_production_names[product_id] = [production.name for production in all_production]
|
||||||
for production_item in productions:
|
for production_item in productions:
|
||||||
|
|
||||||
production_programming = self.env['mrp.production'].search(
|
production_programming = self.env['mrp.production'].search(
|
||||||
[('product_id.id', '=', production_item.product_id.id),
|
[('product_id.id', '=', production_item.product_id.id),
|
||||||
('origin', '=', production_item.origin)],
|
('origin', '=', production_item.origin)],
|
||||||
limit=1, order='id asc')
|
limit=1, order='id asc')
|
||||||
if production_item.product_id.id in product_id_to_production_names:
|
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:
|
||||||
if production_item.product_id.model_process_parameters_ids:
|
is_purchase = False
|
||||||
is_purchase = False
|
sorted_process_parameters = sorted(production_item.product_id.model_process_parameters_ids,
|
||||||
sorted_process_parameters = sorted(production_item.product_id.model_process_parameters_ids,
|
key=lambda w: w.id)
|
||||||
key=lambda w: w.id)
|
|
||||||
|
|
||||||
consecutive_process_parameters = []
|
consecutive_process_parameters = []
|
||||||
m = 0
|
m = 0
|
||||||
for i in range(len(sorted_process_parameters) - 1):
|
for i in range(len(sorted_process_parameters) - 1):
|
||||||
if m == 0:
|
if m == 0:
|
||||||
is_purchase = False
|
is_purchase = False
|
||||||
if self.env['product.template']._get_process_parameters_product(
|
if self.env['product.template']._get_process_parameters_product(
|
||||||
sorted_process_parameters[i]).partner_id == self.env[
|
sorted_process_parameters[i]).partner_id == self.env[
|
||||||
'product.template']._get_process_parameters_product(sorted_process_parameters[
|
'product.template']._get_process_parameters_product(sorted_process_parameters[
|
||||||
i + 1]).partner_id and \
|
i + 1]).partner_id and \
|
||||||
sorted_process_parameters[i].gain_way == '外协':
|
sorted_process_parameters[i].gain_way == '外协':
|
||||||
if sorted_process_parameters[i] not in consecutive_process_parameters:
|
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])
|
||||||
consecutive_process_parameters.append(sorted_process_parameters[i + 1])
|
consecutive_process_parameters.append(sorted_process_parameters[i + 1])
|
||||||
m += 1
|
m += 1
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
if m == len(consecutive_process_parameters) - 1 and m != 0:
|
if m == len(consecutive_process_parameters) - 1 and m != 0:
|
||||||
self.env['purchase.order'].get_purchase_order(consecutive_process_parameters,
|
self.env['purchase.order'].get_purchase_order(consecutive_process_parameters,
|
||||||
@@ -330,7 +328,7 @@ class StockRule(models.Model):
|
|||||||
is_purchase = True
|
is_purchase = True
|
||||||
consecutive_process_parameters = []
|
consecutive_process_parameters = []
|
||||||
m = 0
|
m = 0
|
||||||
# 当前面的连续外协采购单生成再生成当前外协采购单
|
# 当前面的连续外协采购单生成再生成当前外协采购单
|
||||||
if is_purchase is False:
|
if is_purchase is False:
|
||||||
self.env['purchase.order'].get_purchase_order(consecutive_process_parameters,
|
self.env['purchase.order'].get_purchase_order(consecutive_process_parameters,
|
||||||
production_item,
|
production_item,
|
||||||
@@ -356,33 +354,70 @@ class StockRule(models.Model):
|
|||||||
self.env['purchase.order'].get_purchase_order(sorted_process_parameters[i],
|
self.env['purchase.order'].get_purchase_order(sorted_process_parameters[i],
|
||||||
production_item,
|
production_item,
|
||||||
product_id_to_production_names)
|
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 == '成品':
|
# # 同一个产品多个制造订单对应一个编程单和模型库
|
||||||
# 根据加工面板的面数及成品工序模板生成工序设计
|
# # 只调用一次fetchCNC,并将所有生产订单的名称作为字符串传递
|
||||||
i = 0
|
# if not production_item.programming_no:
|
||||||
for k in (production.product_id.model_processing_panel.split(',')):
|
# if not production_programming.programming_no:
|
||||||
product_routing_workcenter = self.env['sf.product.model.type.routing.sort'].search(
|
# production_item.fetchCNC(
|
||||||
[('product_model_type_id', '=', production.product_id.product_model_type_id.id)],
|
# ', '.join(product_id_to_production_names[production_item.product_id.id]))
|
||||||
order='sequence asc'
|
# else:
|
||||||
)
|
# production_item.write({'programming_no': production_programming.programming_no,
|
||||||
i += 1
|
# 'programming_state': '编程中'})
|
||||||
for route in product_routing_workcenter:
|
return True
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
class ProductionLot(models.Model):
|
class ProductionLot(models.Model):
|
||||||
|
|||||||
@@ -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_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_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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
|
@@ -337,6 +337,20 @@
|
|||||||
<page string="质检标准">
|
<page string="质检标准">
|
||||||
<field name="quality_standard" widget="adaptive_viewer"/>
|
<field name="quality_standard" widget="adaptive_viewer"/>
|
||||||
</page>
|
</page>
|
||||||
|
<page string="工艺设计">
|
||||||
|
<field name="technology_design_ids" widget="one2many">
|
||||||
|
<tree editable="bottom">
|
||||||
|
<field name="sequence" widget="handle"/>
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="panel"/>
|
||||||
|
<field name="time_cycle_manual"/>
|
||||||
|
<field name="is_auto" invisible="1"/>
|
||||||
|
<button name="unlink_technology_design" confirm="是否确认删除?" class="oe_highlight"
|
||||||
|
attrs="{'invisible': [('is_auto', '=', True)]}" type="object"
|
||||||
|
string="删除"></button>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</page>
|
||||||
</xpath>
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
</field>
|
</field>
|
||||||
<field name="bom_product_template_attribute_value_ids" position="after">
|
<field name="bom_product_template_attribute_value_ids" position="after">
|
||||||
<field name="routing_type" required="1"/>
|
<field name="routing_type" required="1"/>
|
||||||
|
<field name="routing_tag" required="1" string="工序标签"/>
|
||||||
<field name="is_repeat"/>
|
<field name="is_repeat"/>
|
||||||
<field name="reserved_duration"/>
|
<field name="reserved_duration"/>
|
||||||
</field>
|
</field>
|
||||||
|
|||||||
Reference in New Issue
Block a user