1.sf的工作中心新增表面工艺字段,工序类型新增表面工艺类型,且当工序类型为表面工艺时,则显示表面工艺,其他则不显示

2.sf的工作中心新增工艺外协字段,该字段若被勾选则为表面工艺的外协加工中心
3.sf的销售订单上点击生成制造订单时在已有的成品工序后累加表面工艺工序,表面工艺的工序生成规则需根据表面工艺所对应的类别的排序来依次生成,并且工序里的工作中心的匹配规则需根据表面工艺的可选参数里的获取方式字段的值来匹配
This commit is contained in:
jinling.yang
2023-03-30 17:52:05 +08:00
parent 20d9e469f5
commit a008dbb76a
8 changed files with 79 additions and 30 deletions

View File

@@ -66,7 +66,6 @@ class MrsProductionProcess(models.Model):
# workcenter_ids = fields.Many2many('mrp.workcenter', 'rel_workcenter_process', required=True) # workcenter_ids = fields.Many2many('mrp.workcenter', 'rel_workcenter_process', required=True)
class MrsProcessingTechnology(models.Model): class MrsProcessingTechnology(models.Model):
_name = 'sf.processing.technology' _name = 'sf.processing.technology'
_description = '加工工艺' _description = '加工工艺'
@@ -123,4 +122,9 @@ class MrsProductionProcessParameter(models.Model):
# price = fields.Float('单价') # price = fields.Float('单价')
process_id = fields.Many2one('sf.production.process', string='表面工艺') process_id = fields.Many2one('sf.production.process', string='表面工艺')
materials_model_ids = fields.Many2many('sf.materials.model', 'applicable_material', string='适用材料') materials_model_ids = fields.Many2many('sf.materials.model', 'applicable_material', string='适用材料')
active = fields.Boolean('有效', default=True) active = fields.Boolean('有效', default=True)
# 获取表面工艺的获取方式
def get_gain_way(self, item):
process_parameter = self.env['sf.production.process.parameter'].search([('id', '=', item.id)])
return process_parameter

View File

@@ -29,7 +29,7 @@ class ProductModelTypeRoutingSort(models.Model):
('前置三元定位检测', '前置三元定位检测'), ('前置三元定位检测', '前置三元定位检测'),
('CNC加工', 'CNC加工'), ('CNC加工', 'CNC加工'),
('后置三元质量检测', '后置三元质量检测'), ('后置三元质量检测', '后置三元质量检测'),
('解除装夹', '解除装夹'), ('切割', '切割'), ('绑定表面工艺', '绑定表面工艺') ('解除装夹', '解除装夹'), ('切割', '切割'), ('表面工艺', '表面工艺')
], string="工序类型", related='route_workcenter_id.routing_type') ], string="工序类型", related='route_workcenter_id.routing_type')
workcenter_ids = fields.Many2many('mrp.workcenter', required=False, related='route_workcenter_id.workcenter_ids') workcenter_ids = fields.Many2many('mrp.workcenter', required=False, related='route_workcenter_id.workcenter_ids')
product_model_type_id = fields.Many2one('sf.model.type') product_model_type_id = fields.Many2one('sf.model.type')
@@ -52,7 +52,7 @@ class EmbryoModelTypeRoutingSort(models.Model):
('前置三元定位检测', '前置三元定位检测'), ('前置三元定位检测', '前置三元定位检测'),
('CNC加工', 'CNC加工'), ('CNC加工', 'CNC加工'),
('后置三元质量检测', '后置三元质量检测'), ('后置三元质量检测', '后置三元质量检测'),
('解除装夹', '解除装夹'), ('切割', '切割'), ('绑定表面工艺', '绑定表面工艺') ('解除装夹', '解除装夹'), ('切割', '切割'), ('表面工艺', '表面工艺')
], string="工序类型", related='route_workcenter_id.routing_type') ], string="工序类型", related='route_workcenter_id.routing_type')
workcenter_ids = fields.Many2many('mrp.workcenter', required=False, related='route_workcenter_id.workcenter_ids') workcenter_ids = fields.Many2many('mrp.workcenter', required=False, related='route_workcenter_id.workcenter_ids')
embryo_model_type_id = fields.Many2one('sf.model.type') embryo_model_type_id = fields.Many2one('sf.model.type')
@@ -75,7 +75,7 @@ class SurfaceTechnicsModelTypeRoutingSort(models.Model):
('前置三元定位检测', '前置三元定位检测'), ('前置三元定位检测', '前置三元定位检测'),
('CNC加工', 'CNC加工'), ('CNC加工', 'CNC加工'),
('后置三元质量检测', '后置三元质量检测'), ('后置三元质量检测', '后置三元质量检测'),
('解除装夹', '解除装夹'), ('切割', '切割'), ('绑定表面工艺', '绑定表面工艺') ('解除装夹', '解除装夹'), ('切割', '切割'), ('表面工艺', '表面工艺')
], string="工序类型", related='route_workcenter_id.routing_type') ], string="工序类型", related='route_workcenter_id.routing_type')
workcenter_ids = fields.Many2many('mrp.workcenter', required=False, related='route_workcenter_id.workcenter_ids') workcenter_ids = fields.Many2many('mrp.workcenter', required=False, related='route_workcenter_id.workcenter_ids')
surface_technics_model_type_id = fields.Many2one('sf.model.type') surface_technics_model_type_id = fields.Many2one('sf.model.type')

View File

@@ -23,7 +23,7 @@ class MrpProduction(models.Model):
for production in self: for production in self:
production.maintenance_count = len(production.request_ids) production.maintenance_count = len(production.request_ids)
#维修模块按钮 # 维修模块按钮
def button_maintenance_req(self): def button_maintenance_req(self):
self.ensure_one() self.ensure_one()
return { return {
@@ -37,7 +37,8 @@ class MrpProduction(models.Model):
}, },
'domain': [('production_id', '=', self.id)], 'domain': [('production_id', '=', self.id)],
} }
#打开维修模块请求
# 打开维修模块请求
def open_maintenance_request_mo(self): def open_maintenance_request_mo(self):
self.ensure_one() self.ensure_one()
action = { action = {
@@ -59,7 +60,8 @@ class MrpProduction(models.Model):
def action_generate_serial(self): def action_generate_serial(self):
self.ensure_one() self.ensure_one()
iot_code = self.env['stock.lot']._get_next_serial(self.company_id, self.product_id) or self.env['ir.sequence'].next_by_code('stock.lot.serial') iot_code = self.env['stock.lot']._get_next_serial(self.company_id, self.product_id) or self.env[
'ir.sequence'].next_by_code('stock.lot.serial')
iot_code_name = re.sub('[\u4e00-\u9fa5]', "", iot_code) iot_code_name = re.sub('[\u4e00-\u9fa5]', "", iot_code)
self.lot_producing_id = self.env['stock.lot'].create({ self.lot_producing_id = self.env['stock.lot'].create({
'product_id': self.product_id.id, 'product_id': self.product_id.id,
@@ -127,10 +129,33 @@ class MrpProduction(models.Model):
if i == processing_panel_len and route.routing_type == '解除装夹': if i == processing_panel_len and route.routing_type == '解除装夹':
workorders_values.append( workorders_values.append(
self.env['mrp.workorder'].json_workorder_str(k, production, route)) self.env['mrp.workorder'].json_workorder_str(k, production, route))
# 表面工艺 # 表面工艺工序
# for item in production.product_id.product_model_type_id.surface_technics_routing_tmpl_ids: # 获取表面工艺id
# workorders_values.append( surface_technics_arr = []
# self.env['mrp.workorder']._json_workorder_surface_process_str(production, item)) #工序id
route_workcenter_arr = []
for item in production.product_id.product_model_type_id.surface_technics_routing_tmpl_ids:
surface_technics_arr.append(item.route_workcenter_id.surface_technics_id.id)
route_workcenter_arr.append(item.route_workcenter_id)
if surface_technics_arr:
production_process = self.env['sf.production.process.category'].search(
[('production_process_ids.id', 'in', surface_technics_arr)],
order='sequence asc'
)
if production_process:
for p in production_process:
for pitem in p.production_process_ids:
if pitem.id in surface_technics_arr:
process_parameter = self.env['sf.production.process.parameter'].search(
[('id', '=', pitem.id)])
for ritem in route_workcenter_arr:
route_production_process = self.env['mrp.routing.workcenter'].search(
[('surface_technics_id', '=', pitem.id), ('id', '=', ritem)])
if route_production_process:
workorders_values.append(
self.env['mrp.workorder']._json_workorder_surface_process_str(
production, route_production_process,
process_parameter))
elif production.product_id.categ_id.type == '胚料': elif production.product_id.categ_id.type == '胚料':
embryo_routing_workcenter = self.env['sf.embryo.model.type.routing.sort'].search( embryo_routing_workcenter = self.env['sf.embryo.model.type.routing.sort'].search(
[('embryo_model_type_id', '=', production.product_id.embryo_model_type_id.id)], [('embryo_model_type_id', '=', production.product_id.embryo_model_type_id.id)],
@@ -143,8 +168,7 @@ class MrpProduction(models.Model):
for workorder in production.workorder_ids: for workorder in production.workorder_ids:
workorder.duration_expected = workorder._get_duration_expected() workorder.duration_expected = workorder._get_duration_expected()
# 在之前的销售单上重新生成制造订单
#在之前的销售单上重新生成制造订单
def create_production1_values(self, production): def create_production1_values(self, production):
production_values_str = {'origin': production.origin, production_values_str = {'origin': production.origin,
'product_id': production.product_id.id, 'product_id': production.product_id.id,
@@ -166,7 +190,7 @@ class MrpProduction(models.Model):
'user_id': production.user_id.id} 'user_id': production.user_id.id}
return production_values_str return production_values_str
#工单排序 # 工单排序
def _reset_work_order_sequence1(self, k): def _reset_work_order_sequence1(self, k):
sequen = 0 sequen = 0
for rec in self: for rec in self:
@@ -183,7 +207,7 @@ class MrpProduction(models.Model):
if work.name == 'CNC加工(返工)' and work.processing_panel == k: if work.name == 'CNC加工(返工)' and work.processing_panel == k:
work.sequence = sequen + 1 work.sequence = sequen + 1
#在制造订单上新增工单 # 在制造订单上新增工单
def _create_workorder1(self, k): def _create_workorder1(self, k):
for production in self: for production in self:
if not production.bom_id or not production.product_id: if not production.bom_id or not production.product_id:
@@ -217,9 +241,9 @@ class MrpProduction(models.Model):
production.product_id.model_processing_panel = k production.product_id.model_processing_panel = k
for k in (production.product_id.model_processing_panel.split(',')): for k in (production.product_id.model_processing_panel.split(',')):
routingworkcenter = self.env['sf.product.model.type.routing.sort'].search( routingworkcenter = self.env['sf.product.model.type.routing.sort'].search(
[('product_model_type_id', '=', production.product_id.product_model_type_id.id)], [('product_model_type_id', '=', production.product_id.product_model_type_id.id)],
order='sequence asc' order='sequence asc'
) )
i += 1 i += 1
for route in routingworkcenter: for route in routingworkcenter:
@@ -251,10 +275,10 @@ class MrpProduction(models.Model):
current_sequence += 1 current_sequence += 1
if work.name == '获取CNC加工程序': if work.name == '获取CNC加工程序':
work.button_start() work.button_start()
#work.button_finish() # work.button_finish()
#work.fetchCNC() # work.fetchCNC()
#创建工单并进行排序 # 创建工单并进行排序
def _create_workorder(self): def _create_workorder(self):
res = self._create_workorder3() res = self._create_workorder3()
self._reset_work_order_sequence() self._reset_work_order_sequence()

View File

@@ -1,4 +1,5 @@
from odoo import fields, models from odoo import fields, models
import logging
class ResMrpRoutingWorkcenter(models.Model): class ResMrpRoutingWorkcenter(models.Model):
@@ -12,12 +13,13 @@ class ResMrpRoutingWorkcenter(models.Model):
('后置三元质量检测', '后置三元质量检测'), ('后置三元质量检测', '后置三元质量检测'),
('解除装夹', '解除装夹'), ('解除装夹', '解除装夹'),
('切割', '切割'), ('切割', '切割'),
('绑定表面工艺', '绑定表面工艺') ('表面工艺', '表面工艺')
], string="工序类型") ], 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)
bom_id = fields.Many2one('mrp.bom', required=False) bom_id = fields.Many2one('mrp.bom', required=False)
surface_technics_id = fields.Many2one('sf.production.process', string="表面工艺")
# 获得当前登陆者公司 # 获得当前登陆者公司
def get_company_id(self): def get_company_id(self):
@@ -25,6 +27,7 @@ class ResMrpRoutingWorkcenter(models.Model):
company_id = fields.Many2one('res.company', compute="get_company_id", related=False) company_id = fields.Many2one('res.company', compute="get_company_id", related=False)
# 排产的时候, 根据胚料的长宽高比对一下机床的最大加工尺寸.不符合就不要分配给这个加工中心(机床). # 排产的时候, 根据胚料的长宽高比对一下机床的最大加工尺寸.不符合就不要分配给这个加工中心(机床).
# 工单对应的工作中心,根据工序中的工作中心去匹配, # 工单对应的工作中心,根据工序中的工作中心去匹配,
# 如果只配置了一个工作中心,则默认采用该工作中心; # 如果只配置了一个工作中心,则默认采用该工作中心;
@@ -40,7 +43,7 @@ class ResMrpRoutingWorkcenter(models.Model):
workcenter = self.env['mrp.workcenter'].search([('id', 'in', workcenter_ids)]) workcenter = self.env['mrp.workcenter'].search([('id', 'in', workcenter_ids)])
workcenter_ids = [] workcenter_ids = []
for item in workcenter: for item in workcenter:
print(item.name) logging.info('get_workcenter-vals:%s' % item.machine_tool_id.name)
if item.machine_tool_id: if item.machine_tool_id:
machine_tool = self.env['sf.machine_tool'].search( machine_tool = self.env['sf.machine_tool'].search(
[('x_axis', '>', product.bom_ids.bom_line_ids.product_id.length), [('x_axis', '>', product.bom_ids.bom_line_ids.product_id.length),
@@ -55,5 +58,9 @@ class ResMrpRoutingWorkcenter(models.Model):
SELECT workcenter_id FROM mrp_workorder where workcenter_id SELECT workcenter_id FROM mrp_workorder where workcenter_id
in %s group by workcenter_id in %s group by workcenter_id
order by count(*),workcenter_id asc limit 1 """, [tuple(workcenter_ids)]) order by count(*),workcenter_id asc limit 1 """, [tuple(workcenter_ids)])
workcenter_id = self.env.cr.dictfetchall()[0].get('workcenter_id') res = self.env.cr.fetchone()
if res:
workcenter_id = self.env.cr.dictfetchall()[0].get('workcenter_id')
else:
workcenter_id = workcenter_ids[0]
return workcenter_id return workcenter_id

View File

@@ -7,13 +7,18 @@ from odoo.addons.resource.models.resource import Intervals
class ResWorkcenter(models.Model): class ResWorkcenter(models.Model):
_inherit = "mrp.workcenter" _inherit = "mrp.workcenter"
machine_tool_id = fields.Many2one('sf.machine_tool', '机床') machine_tool_id = fields.Many2one('sf.machine_tool', '机床')
is_process_outsourcing = fields.Boolean('工艺外协')
users_ids = fields.Many2many("res.users", 'users_workcenter') users_ids = fields.Many2many("res.users", 'users_workcenter')
equipment_ids = fields.One2many( equipment_ids = fields.One2many(
'maintenance.equipment', 'workcenter_id', string="Maintenance Equipment", 'maintenance.equipment', 'workcenter_id', string="Maintenance Equipment",
check_company=True) check_company=True)
# 查询工艺外协加工中心
def get_process_outsourcing_workcenter(self):
outsourcing_workcenter = self.env['mrp.workcenter'].search([('is_process_outsourcing', '=', True)])
return outsourcing_workcenter.id
@api.onchange('machine_tool_id') @api.onchange('machine_tool_id')
def update_machine_tool_is_binding(self): def update_machine_tool_is_binding(self):
machine_tool = self.env["sf.machine_tool"].search([('is_binding', '=', True)]) machine_tool = self.env["sf.machine_tool"].search([('is_binding', '=', True)])

View File

@@ -29,7 +29,7 @@ class ResMrpWorkOrder(models.Model):
('CNC加工', 'CNC加工'), ('CNC加工', 'CNC加工'),
('后置三元质量检测', '后置三元质量检测'), ('后置三元质量检测', '后置三元质量检测'),
('解除装夹', '解除装夹'), ('解除装夹', '解除装夹'),
('切割', '切割'), ('绑定表面工艺', '绑定表面工艺') ('切割', '切割'), ('表面工艺', '表面工艺')
], string="工序类型") ], string="工序类型")
results = fields.Char('检测结果') results = fields.Char('检测结果')
@@ -158,16 +158,20 @@ class ResMrpWorkOrder(models.Model):
return workorders_values_str return workorders_values_str
# 拼接工单对象属性值(表面工艺) # 拼接工单对象属性值(表面工艺)
def _json_workorder_surface_process_str(self, production, route): def _json_workorder_surface_process_str(self, production, route, process_parameter):
workorders_values_str = [0, '', { workorders_values_str = [0, '', {
'product_uom_id': production.product_uom_id.id, 'product_uom_id': production.product_uom_id.id,
'qty_producing': 0, 'qty_producing': 0,
'operation_id': False, 'operation_id': False,
'name': route.name, 'name': route.name,
'processing_panel': '', 'processing_panel': '',
'routing_type': '绑定表面工艺', 'routing_type': '表面工艺',
'work_state': '', 'work_state': '',
'workcenter_id': '', 'workcenter_id': self.env[
'mrp.workcenter'].get_process_outsourcing_workcenter() if process_parameter.gain_way == '外协' else
self.env['mrp.routing.workcenter'].get_workcenter(route.workcenter_ids.ids,
route.routing_type,
production.product_id),
'date_planned_start': False, 'date_planned_start': False,
'date_planned_finished': False, 'date_planned_finished': False,
'duration_expected': 60, 'duration_expected': 60,

View File

@@ -8,6 +8,8 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<field name="workcenter_id" position="replace"> <field name="workcenter_id" position="replace">
<field name="workcenter_ids" widget="many2many_tags" string="工作中心" required="0"/> <field name="workcenter_ids" widget="many2many_tags" string="工作中心" required="0"/>
<field name="surface_technics_id"
attrs="{'invisible':[('routing_type','!=','表面工艺')],'required':[('routing_type','=','表面工艺')]}"/>
</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"/>

View File

@@ -109,6 +109,9 @@
<xpath expr="//field[@name='alternative_workcenter_ids']" position="after"> <xpath expr="//field[@name='alternative_workcenter_ids']" position="after">
<field name="machine_tool_id" domain="[('is_binding','=',False)]"/> <field name="machine_tool_id" domain="[('is_binding','=',False)]"/>
</xpath> </xpath>
<xpath expr="//field[@name='resource_calendar_id']" position="after">
<field name="is_process_outsourcing"/>
</xpath>
</field> </field>
</record> </record>