From e059d9266de654f20b7d9857db12c4d08da7cdab Mon Sep 17 00:00:00 2001 From: guanhuan Date: Thu, 26 Dec 2024 15:26:12 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=9D=AF=E6=96=99=E5=8F=91=E6=96=99?= =?UTF-8?q?=E6=8F=90=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_message/models/sf_message_stock_picking.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/sf_message/models/sf_message_stock_picking.py b/sf_message/models/sf_message_stock_picking.py index 05bd6f3e..ed490e8a 100644 --- a/sf_message/models/sf_message_stock_picking.py +++ b/sf_message/models/sf_message_stock_picking.py @@ -72,14 +72,13 @@ class SFMessageStockPicking(models.Model): content = message_queue_id.message_template_id.content stock_picking_line = self.env['stock.picking'].sudo().search( [('id', '=', int(message_queue_id.res_id))]) - if stock_picking_line.state == 'assigned': - url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') - action_id = self.env.ref('stock.action_picking_tree_ready').id - menu_id = self.env.ref('stock.menu_stock_root').id - url_with_id = f"{url}/web#view_type=form&action={action_id}&menu_id={menu_id}&id={stock_picking_line.id}" - content = content.replace('{{name}}', stock_picking_line.name).replace( + url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + action_id = self.env.ref('stock.action_picking_tree_ready').id + menu_id = self.env.ref('stock.menu_stock_root').id + url_with_id = f"{url}/web#view_type=form&action={action_id}&menu_id={menu_id}&id={stock_picking_line.id}" + content = content.replace('{{name}}', stock_picking_line.name).replace( '{{request_url}}', url_with_id) - contents.append(content) + contents.append(content) elif message_queue_id.message_template_id.name == '订单发货提醒': content = self.deal_stock_picking_sfp(message_queue_id) if content: From 6e2ee60616e974dbe373fe645032dfa10d5307a9 Mon Sep 17 00:00:00 2001 From: guanhuan Date: Thu, 26 Dec 2024 17:15:48 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=B7=A5=E5=8D=95=E5=B7=B2=E4=B8=8B?= =?UTF-8?q?=E5=8F=91=E6=8F=90=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_message/models/sf_message_product.py | 9 ++++++++- sf_message/models/sf_message_workorder.py | 19 ++++++++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/sf_message/models/sf_message_product.py b/sf_message/models/sf_message_product.py index 4f983e49..3b82dac7 100644 --- a/sf_message/models/sf_message_product.py +++ b/sf_message/models/sf_message_product.py @@ -13,8 +13,15 @@ class SFMessagePlan(models.Model): if message_queue_id.message_template_id.name == '工单已下发通知': content = message_queue_id.message_template_id.content product_product = self.env['product.product'].sudo().search([('id', '=', int(message_queue_id.res_id))]) - production_num = self.env['mrp.production'].sudo().search_count( + mrp_production_list = self.env['mrp.production'].sudo().search( [('product_id', '=', product_product.id)]) + production_num = 0 + for mrp_production_info in mrp_production_list: + routing_type = '人工线下加工' if mrp_production_info.production_type == '人工线下加工' else '装夹预调' + mrp_production_ready = mrp_production_info.workorder_ids.filtered( + lambda w: w.routing_type == routing_type and w.state == 'ready') + if mrp_production_ready: + production_num += 1 if production_num >= 1: url = self.get_request_url() content = content.replace('{{product_id}}', product_product.name).replace( diff --git a/sf_message/models/sf_message_workorder.py b/sf_message/models/sf_message_workorder.py index ee8f6c00..44b3a6b8 100644 --- a/sf_message/models/sf_message_workorder.py +++ b/sf_message/models/sf_message_workorder.py @@ -18,16 +18,21 @@ class SFMessageWork(models.Model): def _compute_state(self): super(SFMessageWork, self)._compute_state() for workorder in self: + min_sequence_wk = None work_ids = workorder.production_id.workorder_ids.filtered(lambda w: w.routing_type == '装夹预调') if work_ids: min_sequence_wk = work_ids.sorted(key=lambda w: w.sequence)[0] - if workorder.state == 'ready' and workorder.routing_type == '装夹预调' and workorder.id == min_sequence_wk.id: - message_template = self.env["jikimo.message.template"].sudo().search([("name", "=", '工单已下发通知')], limit=1) - jikimo_message_queue = self.env['jikimo.message.queue'].sudo().search( - [('res_id', '=', workorder.production_id.product_id.id), ("message_status", "in", ("pending", "sent")), - ('message_template_id', '=', message_template.id)]) - if not jikimo_message_queue: - workorder.production_id.product_id.add_queue('工单已下发通知') + if ( + workorder.state == 'ready' and workorder.routing_type == '装夹预调' and workorder.id == min_sequence_wk.id) or ( + workorder.state == 'ready' and workorder.routing_type == '人工线下加工'): + message_template = self.env["jikimo.message.template"].sudo().search( + [("name", "=", '工单已下发通知')], limit=1) + jikimo_message_queue = self.env['jikimo.message.queue'].sudo().search( + [('res_id', '=', workorder.production_id.product_id.id), + ("message_status", "in", ("pending", "sent")), + ('message_template_id', '=', message_template.id)]) + if not jikimo_message_queue: + workorder.production_id.product_id.add_queue('工单已下发通知') def _get_message(self, message_queue_ids): contents = [] From 133c1a87f2a7c53fc111bcaed70ec9d80ec577e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=B0=A7?= Date: Fri, 27 Dec 2024 13:53:10 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/jikimo_workorder_exception.py | 4 ++-- sf_message/models/sf_message_maintenance_logs.py | 4 ++-- sf_message/models/sf_message_mrp_production.py | 2 +- sf_message/models/sf_message_purchase.py | 2 +- sf_message/models/sf_message_quality_cnc_test.py | 2 +- sf_message/models/sf_message_sale.py | 6 +++--- sf_message/models/sf_message_stock_picking.py | 2 +- sf_message/models/sf_message_workorder.py | 2 +- sf_plan_management/i18n/zh_CN.po | 4 ++-- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/jikimo_workorder_exception_notify/models/jikimo_workorder_exception.py b/jikimo_workorder_exception_notify/models/jikimo_workorder_exception.py index 9849f2cd..0ab0d6ae 100644 --- a/jikimo_workorder_exception_notify/models/jikimo_workorder_exception.py +++ b/jikimo_workorder_exception_notify/models/jikimo_workorder_exception.py @@ -51,11 +51,11 @@ class JikimoWorkorderException(models.Model): return res def _get_message(self, message_queue_ids): - contents = super(JikimoWorkorderException, self)._get_message(message_queue_ids) + contents, _ = super(JikimoWorkorderException, self)._get_message(message_queue_ids) url = self.env['ir.config_parameter'].get_param('web.base.url') action_id = self.env.ref('mrp.mrp_production_action').id for index, content in enumerate(contents): exception_id = self.env['jikimo.workorder.exception'].browse(message_queue_ids[index].res_id) url = url + '/web#id=%s&view_type=form&action=%s' % (exception_id.workorder_id.production_id.id, action_id) contents[index] = content.replace('{{url}}', url) - return contents + return contents, message_queue_ids diff --git a/sf_message/models/sf_message_maintenance_logs.py b/sf_message/models/sf_message_maintenance_logs.py index 94a4c5c5..ab15864f 100644 --- a/sf_message/models/sf_message_maintenance_logs.py +++ b/sf_message/models/sf_message_maintenance_logs.py @@ -13,11 +13,11 @@ class SFMessageMaintenanceLogs(models.Model): return res def _get_message(self, message_queue_ids): - contents = super(SFMessageMaintenanceLogs, self)._get_message(message_queue_ids) + contents, _ = super(SFMessageMaintenanceLogs, self)._get_message(message_queue_ids) url = self.env['ir.config_parameter'].get_param('web.base.url') action_id = self.env.ref('sf_maintenance.action_maintenance_logs').id for index, content in enumerate(contents): maintenance_logs_id = self.env['sf.maintenance.logs'].browse(message_queue_ids[index].res_id) url = url + '/web#id=%s&view_type=form&action=%s' % (maintenance_logs_id.id, action_id) contents[index] = content.replace('{{url}}', url) - return contents \ No newline at end of file + return contents, message_queue_ids \ No newline at end of file diff --git a/sf_message/models/sf_message_mrp_production.py b/sf_message/models/sf_message_mrp_production.py index a60f2161..29905382 100644 --- a/sf_message/models/sf_message_mrp_production.py +++ b/sf_message/models/sf_message_mrp_production.py @@ -41,7 +41,7 @@ class SFMessageMrpProduction(models.Model): '{{sale_order_name}}', mrp_production.origin).replace('{{request_url}}', url) contents.append(content) logging.info('生产完工入库提醒: %s' % contents) - return contents + return contents, message_queue_ids def request_url(self, id): url = self.env['ir.config_parameter'].get_param('web.base.url') diff --git a/sf_message/models/sf_message_purchase.py b/sf_message/models/sf_message_purchase.py index e3fe269f..3cbc297e 100644 --- a/sf_message/models/sf_message_purchase.py +++ b/sf_message/models/sf_message_purchase.py @@ -16,7 +16,7 @@ class SFMessagePurchase(models.Model): content = content.replace('{{name}}', purchase_order_line.name).replace( '{{request_url}}', url) contents.append(content) - return contents + return contents, message_queue_ids def request_url(self, id): url = self.env['ir.config_parameter'].get_param('web.base.url') diff --git a/sf_message/models/sf_message_quality_cnc_test.py b/sf_message/models/sf_message_quality_cnc_test.py index 0ddc1391..43969682 100644 --- a/sf_message/models/sf_message_quality_cnc_test.py +++ b/sf_message/models/sf_message_quality_cnc_test.py @@ -33,4 +33,4 @@ class SFMessageQualityCncTest(models.Model): content_template = content.replace('{{judge_num}}', str(i)) content_template = content_template.replace('{{url}}', url_with_id) contents.append(content_template) - return contents + return contents, message_queue_ids diff --git a/sf_message/models/sf_message_sale.py b/sf_message/models/sf_message_sale.py index 58d1a021..e7663c1a 100644 --- a/sf_message/models/sf_message_sale.py +++ b/sf_message/models/sf_message_sale.py @@ -54,13 +54,13 @@ class SFMessageSale(models.Model): i = 0 for item in message_queue_ids: if item.message_template_id.bussiness_node_id.name == '待接单': - content = super(SFMessageSale, self)._get_message(item) + content, _ = super(SFMessageSale, self)._get_message(item) action_id = self.env.ref('sale.action_quotations_with_onboarding').id url_with_id = f"{url}/web#id={item.res_id}&view_type=form&action={action_id}" content = content[0].replace('{{url}}', url_with_id) contents.append(content) elif item.message_template_id.bussiness_node_id.name == '确认接单': - content = super(SFMessageSale, self)._get_message(item) + content, _ = super(SFMessageSale, self)._get_message(item) sale_order_line = self.env['sale.order.line'].sudo().search([('order_id', '=', int(item.res_id))]) product = sale_order_line[0].product_id.name if len(sale_order_line) == 1 else '%s...' % \ sale_order_line[ @@ -97,7 +97,7 @@ class SFMessageSale(models.Model): elif bussiness_node == '销售订单已逾期': content = content_template.replace('{{overdue_num}}', str(i)) contents.append(content) - return contents + return contents, message_queue_ids # # 销售订单逾期预警和已逾期 def _overdue_or_warning_func(self): diff --git a/sf_message/models/sf_message_stock_picking.py b/sf_message/models/sf_message_stock_picking.py index 6e80c670..b2e93d38 100644 --- a/sf_message/models/sf_message_stock_picking.py +++ b/sf_message/models/sf_message_stock_picking.py @@ -74,7 +74,7 @@ class SFMessageStockPicking(models.Model): content = self.deal_stock_picking_sfp(message_queue_id) if content: contents.append(content) - return contents + return contents, message_queue_ids def get_special_url(self, id, tmplate_name, special_name, model_id): menu_id = 0 diff --git a/sf_message/models/sf_message_workorder.py b/sf_message/models/sf_message_workorder.py index d5186797..fb2c5881 100644 --- a/sf_message/models/sf_message_workorder.py +++ b/sf_message/models/sf_message_workorder.py @@ -93,7 +93,7 @@ class SFMessageWork(models.Model): elif bussiness_node in template_names['已逾期']: content = content_template.replace('{{overdue_num}}', str(i)) contents.append(content) - return contents + return contents, message_queue_ids def request_url(self): url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') diff --git a/sf_plan_management/i18n/zh_CN.po b/sf_plan_management/i18n/zh_CN.po index 91b32d41..b811963b 100644 --- a/sf_plan_management/i18n/zh_CN.po +++ b/sf_plan_management/i18n/zh_CN.po @@ -6678,7 +6678,7 @@ msgstr "账单状态" #: model_terms:ir.ui.view,arch_db:account.account_journal_dashboard_kanban_view #, python-format msgid "Bills" -msgstr "账单" +msgstr "发票账单" #. module: account #: model_terms:ir.ui.view,arch_db:account.account_journal_dashboard_kanban_view @@ -23023,7 +23023,7 @@ msgstr "支付:支付收据" #: model_terms:ir.ui.view,arch_db:account.view_account_payment_search #, python-format msgid "Payments" -msgstr "支付" +msgstr "付款单" #. module: account #: model_terms:ir.actions.act_window,help:account.action_account_payments From e990f246157bd3f3fcba4b3fcb7d3171e8b74f0f Mon Sep 17 00:00:00 2001 From: liaodanlong Date: Fri, 27 Dec 2024 16:21:36 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=B8=A4=E5=BC=A0=E5=A4=96=E5=8D=8F?= =?UTF-8?q?=E5=B7=A5=E5=8D=95=E6=8A=A5=E9=94=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/mrp_production.py | 72 +++++++++++------------ sf_manufacturing/models/stock.py | 5 +- 2 files changed, 38 insertions(+), 39 deletions(-) diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index ed117589..b4367212 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -807,45 +807,45 @@ class MrpProduction(models.Model): workorder.move_subcontract_workorder_ids.picking_id.write({'state': 'cancel'}) consecutive_workorders = [] sorted_workorders = sorted(process_parameter_workorder, key=lambda w: w.sequence) - for i, workorder in enumerate(sorted_workorders): - # 检查当前工作订单和下一个工作订单是否连续,并且供应商相同 - if i == 0: - consecutive_workorders.append(workorder) - elif workorder.sequence == sorted_workorders[ - i - 1].sequence + 1 and workorder.supplier_id.id == sorted_workorders[i - 1].supplier_id.id: - consecutive_workorders.append(workorder) - else: - # 处理连续组,如果它不为空 - if consecutive_workorders: - proc_workorders.append(consecutive_workorders) - # 创建外协出入库单和采购订单 - # self.env['stock.picking'].create_outcontract_picking(consecutive_workorders, production, sorted_workorders) - # self.env['purchase.order'].get_purchase_order(consecutive_workorders, production, - # product_id_to_production_names) - if i < len(sorted_workorders) - 1: - # 重置连续组,并添加当前工作订单 - consecutive_workorders = [workorder] - else: - # 判断最后一笔: - if workorder.sequence == sorted_workorders[ - i - 1].sequence and workorder.supplier_id.id == sorted_workorders[ - i - 1].supplier_id.id: - consecutive_workorders = [workorder] - else: - proc_workorders.append([workorder]) - # 立即创建外协出入库单和采购订单 - # self.env['stock.picking'].create_outcontract_picking(workorder, production) - # self.env['purchase.order'].get_purchase_order(workorder, production, - # product_id_to_production_names) - consecutive_workorders = [] - - # 处理最后一个组,即使它可能只有一个工作订单 - if consecutive_workorders: - proc_workorders.append(consecutive_workorders) + # for i, workorder in enumerate(sorted_workorders): + # # 检查当前工作订单和下一个工作订单是否连续,并且供应商相同 + # if i == 0: + # consecutive_workorders.append(workorder) + # elif workorder.sequence == sorted_workorders[ + # i - 1].sequence + 1 and workorder.supplier_id.id == sorted_workorders[i - 1].supplier_id.id: + # consecutive_workorders.append(workorder) + # else: + # # 处理连续组,如果它不为空 + # if consecutive_workorders: + # proc_workorders.append(consecutive_workorders) + # # 创建外协出入库单和采购订单 + # # self.env['stock.picking'].create_outcontract_picking(consecutive_workorders, production, sorted_workorders) + # # self.env['purchase.order'].get_purchase_order(consecutive_workorders, production, + # # product_id_to_production_names) + # if i < len(sorted_workorders) - 1: + # # 重置连续组,并添加当前工作订单 + # consecutive_workorders = [workorder] + # else: + # # 判断最后一笔: + # if workorder.sequence == sorted_workorders[ + # i - 1].sequence and workorder.supplier_id.id == sorted_workorders[ + # i - 1].supplier_id.id: + # consecutive_workorders = [workorder] + # else: + # proc_workorders.append([workorder]) + # # 立即创建外协出入库单和采购订单 + # # self.env['stock.picking'].create_outcontract_picking(workorder, production) + # # self.env['purchase.order'].get_purchase_order(workorder, production, + # # product_id_to_production_names) + # consecutive_workorders = [] + # + # # 处理最后一个组,即使它可能只有一个工作订单 + # if consecutive_workorders: + # proc_workorders.append(consecutive_workorders) # self.env['stock.picking'].create_outcontract_picking(consecutive_workorders, production) # self.env['purchase.order'].get_purchase_order(consecutive_workorders, production, # product_id_to_production_names) - for workorders in reversed(proc_workorders): + for workorders in reversed(sorted_workorders): self.env['stock.picking'].create_outcontract_picking(workorders, production, sorted_workorders) self.env['purchase.order'].get_purchase_order(workorders, production, product_id_to_production_names) diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index 8c202e6f..4aba2693 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -677,9 +677,8 @@ class StockPicking(models.Model): move_dest_id = item.move_raw_ids[0].id else: # 从sorted_workorders中找到上一工单的move - if sorted_workorders.index(workorder) > 0: - move_dest_id = \ - sorted_workorders[sorted_workorders.index(workorder) - 1].move_subcontract_workorder_ids[1].id + if len(sorted_workorders) > 1: + move_dest_id = sorted_workorders[sorted_workorders.index(workorder)+1].move_subcontract_workorder_ids[1].id new_picking = True outcontract_picking_type_in = self.env.ref( 'sf_manufacturing.outcontract_picking_in').id,