Merge branch refs/heads/develop into refs/heads/feature/销售订单和工单逾期消息推送
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
'summary': '智能工厂刀具管理',
|
||||
'sequence': 1,
|
||||
'description': """
|
||||
在本模块,定义了主要的角色、菜单、基础业务对象
|
||||
在本模块,定义了刀具相关的模型和视图,以及相关的业务逻辑。
|
||||
""",
|
||||
'category': 'sf',
|
||||
'website': 'https://www.sf.jikimo.com',
|
||||
|
||||
@@ -234,7 +234,7 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
|
||||
|
||||
sf_functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装', readonly=True)
|
||||
|
||||
active = fields.Boolean(string='已归档', default=True)
|
||||
active = fields.Boolean(string='已归档', default=True, groups='base.user_root')
|
||||
|
||||
@api.depends('functional_tool_name')
|
||||
def _compute_tool_number(self):
|
||||
@@ -314,37 +314,41 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
|
||||
'applicant': None,
|
||||
'sf_functional_tool_assembly_id': None})
|
||||
|
||||
def create_cam_work_plan(self, cnc_processing):
|
||||
def create_cam_work_plan(self, cnc_ids):
|
||||
"""
|
||||
根据传入的工单信息,查询是否有需要的功能刀具,如果没有则生成CAM工单程序用刀计划
|
||||
"""
|
||||
|
||||
# 获取编程单号
|
||||
programming_no = cnc_processing.workorder_id.production_id.programming_no
|
||||
programming_no = cnc_ids[0].workorder_id.production_id.programming_no
|
||||
logging.info(f'编程单号:{programming_no}')
|
||||
cam_id = self.env['sf.cam.work.order.program.knife.plan'].sudo().search(
|
||||
[('programming_no', '=', programming_no),
|
||||
('functional_tool_name', '=', cnc_processing.cutting_tool_name)])
|
||||
logging.info(f'CAM装刀计划:{cam_id}')
|
||||
if not cam_id:
|
||||
knife_plan = self.env['sf.cam.work.order.program.knife.plan'].sudo().create({
|
||||
'name': cnc_processing.workorder_id.production_id.name,
|
||||
'programming_no': programming_no,
|
||||
'cam_procedure_code': cnc_processing.program_name,
|
||||
'filename': cnc_processing.cnc_id.name,
|
||||
'functional_tool_name': cnc_processing.cutting_tool_name,
|
||||
'cam_cutter_spacing_code': cnc_processing.cutting_tool_no,
|
||||
'process_type': cnc_processing.processing_type,
|
||||
'margin_x_y': float(cnc_processing.margin_x_y),
|
||||
'margin_z': float(cnc_processing.margin_z),
|
||||
'finish_depth': float(cnc_processing.depth_of_processing_z),
|
||||
'extension_length': float(cnc_processing.cutting_tool_extension_length),
|
||||
'shank_model': cnc_processing.cutting_tool_handle_type,
|
||||
'estimated_processing_time': cnc_processing.estimated_processing_time,
|
||||
})
|
||||
logging.info('CAM工单程序用刀计划创建成功!!!')
|
||||
# 创建装刀请求
|
||||
knife_plan.apply_for_tooling()
|
||||
for cnc_processing in cnc_ids:
|
||||
tool_name = cnc_processing.cutting_tool_name
|
||||
cam_id = self.env['sf.cam.work.order.program.knife.plan'].sudo().search(
|
||||
[('programming_no', '=', programming_no),
|
||||
('functional_tool_name', '=', tool_name)])
|
||||
if cam_id:
|
||||
logging.info(f'编程单号{programming_no}功能刀具名称{tool_name}已存在CAM装刀计划:{cam_id}')
|
||||
else:
|
||||
knife_plan = self.env['sf.cam.work.order.program.knife.plan'].sudo().create({
|
||||
'name': cnc_processing.workorder_id.production_id.name,
|
||||
'programming_no': programming_no,
|
||||
'cam_procedure_code': cnc_processing.program_name,
|
||||
'filename': cnc_processing.cnc_id.name,
|
||||
'functional_tool_name': tool_name,
|
||||
'cam_cutter_spacing_code': cnc_processing.cutting_tool_no,
|
||||
'process_type': cnc_processing.processing_type,
|
||||
'margin_x_y': float(cnc_processing.margin_x_y),
|
||||
'margin_z': float(cnc_processing.margin_z),
|
||||
'finish_depth': float(cnc_processing.depth_of_processing_z),
|
||||
'extension_length': float(cnc_processing.cutting_tool_extension_length),
|
||||
'shank_model': cnc_processing.cutting_tool_handle_type,
|
||||
'estimated_processing_time': cnc_processing.estimated_processing_time,
|
||||
})
|
||||
logging.info(f'创建CAM工单程序用刀计划:{knife_plan}')
|
||||
# 创建装刀请求
|
||||
knife_plan.apply_for_tooling()
|
||||
logging.info('CAM工单程序用刀计划创建已完成!!!')
|
||||
|
||||
def unlink_cam_plan(self, production):
|
||||
for item in production:
|
||||
@@ -683,7 +687,7 @@ class FunctionalToolAssembly(models.Model):
|
||||
sf_cam_work_order_program_knife_plan_id = fields.Many2one('sf.cam.work.order.program.knife.plan',
|
||||
'CAM工单程序用刀计划', readonly=True)
|
||||
|
||||
active = fields.Boolean(string='已归档', default=True)
|
||||
active = fields.Boolean(string='已归档', default=True, groups='base.user_root')
|
||||
|
||||
code = fields.Char('功能刀具编码', compute='_compute_code')
|
||||
|
||||
@@ -1275,7 +1279,7 @@ class FunctionalToolDismantle(models.Model):
|
||||
item.picking_num = 0
|
||||
|
||||
state = fields.Selection([('待拆解', '待拆解'), ('已拆解', '已拆解')], default='待拆解', tracking=True)
|
||||
active = fields.Boolean('有效', default=True)
|
||||
active = fields.Boolean('有效', default=True, groups='base.user_root')
|
||||
|
||||
# 刀柄
|
||||
handle_product_id = fields.Many2one('product.product', string='刀柄', compute='_compute_functional_tool_num',
|
||||
|
||||
@@ -402,7 +402,7 @@ class FunctionalToolWarning(models.Model):
|
||||
dispose_time = fields.Char('处理时间', readonly=True)
|
||||
dispose_func = fields.Char('处理方法/措施', readonly=True)
|
||||
|
||||
active = fields.Boolean(string='已归档', default=True)
|
||||
active = fields.Boolean(string='已归档', default=True, groups='base.user_root')
|
||||
|
||||
functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称')
|
||||
|
||||
@@ -554,7 +554,7 @@ class RealTimeDistributionOfFunctionalTools(models.Model):
|
||||
sf_functional_tool_entity_ids = fields.One2many('sf.functional.cutting.tool.entity', 'safe_inventory_id',
|
||||
string='功能刀具信息')
|
||||
|
||||
active = fields.Boolean(string='已归档', default=True)
|
||||
active = fields.Boolean(string='已归档', default=True, groups='base.user_root')
|
||||
|
||||
@api.depends('functional_name_id', 'functional_name_id.diameter', 'functional_name_id.angle',
|
||||
'functional_name_id.functional_cutting_tool_model_id')
|
||||
|
||||
@@ -29,7 +29,7 @@ class CNCprocessing(models.Model):
|
||||
# else:
|
||||
# raise ValidationError("MES装刀指令发送失败")
|
||||
|
||||
def cnc_tool_checkout(self, cnc_processing_ids):
|
||||
def cnc_tool_checkout_1(self, cnc_processing_ids):
|
||||
"""
|
||||
根据传入的工单信息,查询是否有需要的功能刀具,如果没有则生成CAM工单程序用刀计划
|
||||
"""
|
||||
@@ -128,13 +128,6 @@ class CNCprocessing(models.Model):
|
||||
})
|
||||
logging.info('工单cnc程序用刀校验已完成!')
|
||||
|
||||
@api.model_create_multi
|
||||
def create(self, vals):
|
||||
obj = super(CNCprocessing, self).create(vals)
|
||||
# 调用CAM工单程序用刀计划创建方法
|
||||
self.cnc_tool_checkout(obj)
|
||||
return obj
|
||||
|
||||
|
||||
class MrpWorkCenter(models.Model):
|
||||
_inherit = 'mrp.workcenter'
|
||||
@@ -143,3 +136,78 @@ class MrpWorkCenter(models.Model):
|
||||
action = self.env.ref('sf_tool_management.sf_functional_tool_assembly_view_act')
|
||||
result = action.read()[0]
|
||||
return result
|
||||
|
||||
|
||||
class MrpProduction(models.Model):
|
||||
_inherit = 'mrp.production'
|
||||
|
||||
def production_cnc_tool_checkout(self):
|
||||
logging.info('开始进行工单cnc程序用刀校验!!!')
|
||||
invalid_tool = [] # 无效刀
|
||||
invalid_tool_processing_panel = [] # 无效刀加工面
|
||||
missing_tool_1 = [] # 缺刀(机内、线边)
|
||||
missing_tool_2 = [] # 缺刀(库存)
|
||||
for item in self:
|
||||
workorder_ids = item.workorder_ids.filtered(lambda a: a.state not in ['rework', 'cancel'])
|
||||
for workorder_id in workorder_ids:
|
||||
if workorder_id.cnc_ids:
|
||||
for cnc_id in workorder_id.cnc_ids:
|
||||
tool_name = cnc_id.cutting_tool_name
|
||||
# 查询功能刀具在清单中是否存在
|
||||
tool_inventory_id = self.env['sf.tool.inventory'].sudo().search([('name', '=', tool_name)])
|
||||
if not tool_inventory_id:
|
||||
invalid_tool.append(tool_name)
|
||||
invalid_tool_processing_panel.append(workorder_id.processing_panel)
|
||||
continue
|
||||
# 查询功能刀具是否存在库存
|
||||
functional_tools = self.env['sf.functional.cutting.tool.entity'].sudo().search(
|
||||
[('tool_name_id', '=', tool_inventory_id.id), ('functional_tool_status', '=', '正常')])
|
||||
if not functional_tools.filtered(lambda p: p.current_location in ('线边刀库', '机内刀库')):
|
||||
missing_tool_1.append(tool_name) # 判断为 ('线边刀库', '机内刀库') 缺刀
|
||||
if not functional_tools:
|
||||
missing_tool_2.append(tool_name) # 判断为 库存缺刀
|
||||
break
|
||||
# 修改cnc程序的‘刀具状态’
|
||||
workorder_ids = self.env['mrp.workorder'].sudo().search([('production_id', 'in', self.ids)])
|
||||
if invalid_tool:
|
||||
# 修改cnc程序的‘刀具状态’为 ‘无效刀’
|
||||
cnc_ids = self.env['sf.cnc.processing'].sudo().search(
|
||||
[('workorder_id', 'in', workorder_ids.ids), ('cutting_tool_name', 'in', invalid_tool)])
|
||||
if cnc_ids:
|
||||
cnc_ids.write({'tool_state': '2'})
|
||||
# 创建制造订单无效刀检测结果记录
|
||||
for production_id in self:
|
||||
for processing_panel in list(set(invalid_tool_processing_panel)):
|
||||
if not production_id.detection_result_ids.filtered(
|
||||
lambda a: (a.processing_panel == processing_panel and a.detailed_reason == '无效功能刀具'
|
||||
and a.handle_result == '待处理' and a.routing_type == 'CNC加工'
|
||||
and a.rework_reason == 'programming' and a.test_results == '返工')):
|
||||
production_id.detection_result_ids.create({
|
||||
'production_id': production_id.id,
|
||||
'processing_panel': processing_panel,
|
||||
'routing_type': 'CNC加工',
|
||||
'rework_reason': 'programming', # 原因:编程(programming)
|
||||
'detailed_reason': '无效功能刀具',
|
||||
'test_results': '返工',
|
||||
'handle_result': '待处理'
|
||||
})
|
||||
# 自动调用重新获取编程的方法
|
||||
logging.info('cnc用刀校验到无效刀自动调用重新编程方法:update_programming_state()')
|
||||
self[0].update_programming_state()
|
||||
# 修改制造订单 编程状态变为“编程中”
|
||||
self.write({'programming_state': '编程中', 'work_state': '编程中'})
|
||||
if missing_tool_1:
|
||||
# 修改 修改cnc程序的‘刀具状态’ 为 ‘缺刀’
|
||||
cnc_ids = self.env['sf.cnc.processing'].sudo().search(
|
||||
[('workorder_id', 'in', workorder_ids.ids), ('cutting_tool_name', 'in', missing_tool_1)])
|
||||
if cnc_ids:
|
||||
cnc_ids.write({'tool_state': '1'})
|
||||
if missing_tool_2 and not invalid_tool:
|
||||
# 调用CAM工单程序用刀计划创建方法
|
||||
cnc_ids = self.env['sf.cnc.processing'].sudo().search(
|
||||
[('workorder_id', 'in', workorder_ids.filtered(lambda a: a.production_id == self[0].id).ids),
|
||||
('cutting_tool_name', 'in', missing_tool_2)])
|
||||
if cnc_ids:
|
||||
logging.info('调用CAM工单程序用刀计划创建方法!!!')
|
||||
self.env['sf.cam.work.order.program.knife.plan'].sudo().create_cam_work_plan(cnc_ids)
|
||||
logging.info('工单cnc程序用刀校验完成!!!')
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
<field name="barcode_id" invisible="1"/>
|
||||
<field name="rfid"/>
|
||||
<field name="tool_name_id"/>
|
||||
<field name="image" widget='image'/>
|
||||
<field name="tool_groups_id"/>
|
||||
<field name="functional_tool_diameter"/>
|
||||
<field name="knife_tip_r_angle"/>
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
<field name="cutting_tool_model_id"/>
|
||||
<field name="specification_id"/>
|
||||
<field name="brand_id"/>
|
||||
<field name="qty_available"/>
|
||||
<field name="qty_available" string="库存数量"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
|
||||
Reference in New Issue
Block a user