From 2e3a9a8b80cf9381d3be6207224a966af02bfc8d Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Wed, 25 Sep 2024 11:18:37 +0800 Subject: [PATCH 01/14] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8F=90=E9=86=92?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/product_template.py | 4 ++-- sf_sale/models/quick_easy_order.py | 4 ++-- sf_sale/models/quick_easy_order_old.py | 4 ++-- sf_tool_management/__manifest__.py | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index b18ab04c..9dc77bde 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -9,8 +9,8 @@ from odoo.exceptions import ValidationError, UserError from odoo.modules import get_resource_path -from OCC.Extend.DataExchange import read_step_file -from OCC.Extend.DataExchange import write_stl_file +# from OCC.Extend.DataExchange import read_step_file +# from OCC.Extend.DataExchange import write_stl_file class ResProductMo(models.Model): diff --git a/sf_sale/models/quick_easy_order.py b/sf_sale/models/quick_easy_order.py index 081807a4..cb1886a1 100644 --- a/sf_sale/models/quick_easy_order.py +++ b/sf_sale/models/quick_easy_order.py @@ -8,8 +8,8 @@ from datetime import datetime import requests from odoo import http from odoo.http import request -from OCC.Extend.DataExchange import read_step_file -from OCC.Extend.DataExchange import write_stl_file +# from OCC.Extend.DataExchange import read_step_file +# from OCC.Extend.DataExchange import write_stl_file from odoo import models, fields, api from odoo.modules import get_resource_path from odoo.exceptions import ValidationError, UserError diff --git a/sf_sale/models/quick_easy_order_old.py b/sf_sale/models/quick_easy_order_old.py index 4756a2c5..9bd61132 100644 --- a/sf_sale/models/quick_easy_order_old.py +++ b/sf_sale/models/quick_easy_order_old.py @@ -6,8 +6,8 @@ import os from datetime import datetime from stl import mesh # from OCC.Core.GProp import GProp_GProps -from OCC.Extend.DataExchange import read_step_file -from OCC.Extend.DataExchange import write_stl_file +# from OCC.Extend.DataExchange import read_step_file +# from OCC.Extend.DataExchange import write_stl_file from odoo.addons.sf_base.commons.common import Common from odoo import models, fields, api from odoo.modules import get_resource_path diff --git a/sf_tool_management/__manifest__.py b/sf_tool_management/__manifest__.py index 97c26e40..6c3a1e01 100644 --- a/sf_tool_management/__manifest__.py +++ b/sf_tool_management/__manifest__.py @@ -25,7 +25,7 @@ 'views/stock.xml', 'data/tool_data.xml', 'wizard/jikimo_bom_wizard.xml', - 'views/tool_inventory.xml', + # 'views/tool_inventory.xml', 'views/jikimo_bom.xml', 'views/tool_views.xml', From 7fef8f4c7781ad8d4686d4f2547b8359bd59342d Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Wed, 25 Sep 2024 17:50:00 +0800 Subject: [PATCH 02/14] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_message/__manifest__.py | 5 +- sf_message/data/bussiness_node.xml | 59 ++++++++++ sf_message/data/cron_data.xml | 160 +++++++++++++++++++++++++++ sf_message/models/sf_message_sale.py | 35 ++++-- 4 files changed, 249 insertions(+), 10 deletions(-) create mode 100644 sf_message/data/cron_data.xml diff --git a/sf_message/__manifest__.py b/sf_message/__manifest__.py index 0f032a6d..d69c06c1 100644 --- a/sf_message/__manifest__.py +++ b/sf_message/__manifest__.py @@ -11,9 +11,10 @@ """, 'category': 'sf', 'website': 'https://www.sf.jikimo.com', - 'depends': ['sale', 'purchase', 'sf_plan', 'jikimo_message_notify','stock'], + 'depends': ['sale', 'purchase', 'sf_plan', 'jikimo_message_notify', 'stock'], 'data': [ - 'data/bussiness_node.xml' + 'data/bussiness_node.xml', + 'data/cron_data.xml', ], 'test': [ ], diff --git a/sf_message/data/bussiness_node.xml b/sf_message/data/bussiness_node.xml index 76f3fcb7..fbad5581 100644 --- a/sf_message/data/bussiness_node.xml +++ b/sf_message/data/bussiness_node.xml @@ -1,6 +1,7 @@ + 待接单 sale.order @@ -10,6 +11,17 @@ 确认接单 sale.order + + + 销售订单逾期预警 + sale.order + + + + 销售订单已逾期 + sale.order + + 调拨入库 stock.picking @@ -26,5 +38,52 @@ 坯料采购提醒 purchase.order + + 坯料发料提醒 + stock.picking + + + + + 工单已下发通知 + mrp.workorder + + + 装夹预调工单逾期预警 + mrp.workorder + + + 装夹预调工单已逾期 + mrp.workorder + + + + CNC工单逾期预警 + mrp.workorder + + + CNC工单已逾期 + mrp.workorder + + + + 解除装夹工单逾期预警 + mrp.workorder + + + + 解除装夹工单已逾期 + mrp.workorder + + + + 表面工艺工单逾期预警 + mrp.workorder + + + + 表面工艺工单已逾期 + mrp.workorder + \ No newline at end of file diff --git a/sf_message/data/cron_data.xml b/sf_message/data/cron_data.xml new file mode 100644 index 00000000..f69dce7b --- /dev/null +++ b/sf_message/data/cron_data.xml @@ -0,0 +1,160 @@ + + + + 销售订单逾期预警 + + code + model._overdue_warning_func() + 1 + minutes + -1 + + + + + + + 销售订单已逾期 + + code + model._overdue_func() + 1 + minutes + -1 + + + + + + + 装夹预调工单逾期预警 + + code + model._overdue_warning_func() + 1 + minutes + -1 + + + + + + + 工单已逾期 + + code + model._overdue_func() + 1 + minutes + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sf_message/models/sf_message_sale.py b/sf_message/models/sf_message_sale.py index fb9d5976..85a7fd3e 100644 --- a/sf_message/models/sf_message_sale.py +++ b/sf_message/models/sf_message_sale.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +import logging from odoo import models, fields, api, _ @@ -10,6 +11,7 @@ class SFMessageSale(models.Model): res = super(SFMessageSale, self).create(vals_list) if res: try: + logging.info('add_queue res:%s' % res) res.add_queue('待接单') except Exception as e: logging.info('add_queue error:%s' % e) @@ -28,12 +30,29 @@ class SFMessageSale(models.Model): # 继承并重写jikimo.message.dispatch的_get_message() def _get_message(self, message_queue_ids): res = super(SFMessageSale, self)._get_message(message_queue_ids) - if message_queue_ids.message_template_id.bussiness_node_id.name == '确认接单': - # sale_order = self.env['sale.order'].search([('id', '=', message_queue_ids.model.res_id)]) - sale_order_line = self.env['sale.order.line'].search([('order_id', '=', int(message_queue_ids.res_id))]) - if len(sale_order_line) == 1: - product = sale_order_line[0].product_id.name - elif len(sale_order_line) > 1: - product = '%s...' % sale_order_line[0].product_id.name - res[0] = res[0].replace('{{product_id}}', product) + new_res = [] + processed_messages = set() # 用于跟踪已经处理过的消息 + for item in message_queue_ids: + if item.message_template_id.bussiness_node_id.name == '确认接单': + sale_order_line = self.env['sale.order.line'].search([('order_id', '=', int(item.res_id))]) + if len(sale_order_line) == 1: + product = sale_order_line[0].product_id.name + elif len(sale_order_line) > 1: + product = '%s...' % sale_order_line[0].product_id.name + for message in res: + message_text = message.replace('{{product_id}}', product) + if message_text not in processed_messages: + new_res.append(message_text) + processed_messages.add(message_text) + if new_res: + res = new_res return res + + # 销售订单逾期预警 + def _overdue_warning_func(self): + sale_order_ + return 1 + + # 销售订单已逾期 + def _overdue_func(self): + return 1 From c6065653f06b6a48af8ac8fee2375a5d123db984 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Sun, 29 Sep 2024 16:40:52 +0800 Subject: [PATCH 03/14] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=80=BE=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_message/models/sf_message_sale.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/sf_message/models/sf_message_sale.py b/sf_message/models/sf_message_sale.py index bd8e937d..e1a6ea3c 100644 --- a/sf_message/models/sf_message_sale.py +++ b/sf_message/models/sf_message_sale.py @@ -7,6 +7,8 @@ class SFMessageSale(models.Model): _name = 'sale.order' _inherit = ['sale.order', 'jikimo.message.dispatch'] + delivery_warning = fields.Selection([('normal', '正常'), ('warning', '告警'), ('overdue', '逾期')], string='时效') + def create(self, vals_list): res = super(SFMessageSale, self).create(vals_list) if res: @@ -48,7 +50,7 @@ class SFMessageSale(models.Model): if item.message_template_id.bussiness_node_id.name == '待接单': content = super(SFMessageSale, self)._get_message(item) action_id = self.env.ref('sale.action_quotations_with_onboarding').id - url = f"{url}/web#id={item.res_id}view_type=form&action={action_id}" + url = f"{url}/web#id={item.res_id}&view_type=form&action={action_id}" content = content[0].replace('{{url}}', url) contents.append(content) # 确认接单的处理 @@ -65,11 +67,18 @@ class SFMessageSale(models.Model): return contents # # 销售订单逾期预警 + def _overdue_warning_func(self): - sale_order_ - return 1 + today = fields.Date.today() + deadline_check = today + timedelta(days=2) + sale_order = self.sudo().search([('state', 'in', ['sale']), ('deadline_of_delivery', '!=', False)]) + for item in sale_order: + if deadline_check < item.deadline_of_delivery: + item.delivery_warning = '告警' + else: + item.delivery_warning = '正常' + sale_order_warning = self.sudo().search([('delivery_warning', 'in', ['告警']), ('deadline_of_delivery', '!=', False)]) # 销售订单已逾期 def _overdue_func(self): return 1 - From ccd01c9c750b58bec019a8dd8dd010d97f3ea793 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Sun, 29 Sep 2024 17:51:50 +0800 Subject: [PATCH 04/14] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=A4=9A=E6=9D=A1=E5=8F=91=E9=80=81=E9=94=80=E5=94=AE=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E9=80=BE=E6=9C=9F=E9=A2=84=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_message/data/template_data.xml | 16 +++++++++++++++- sf_message/models/sf_message_sale.py | 13 ++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/sf_message/data/template_data.xml b/sf_message/data/template_data.xml index 3033e687..9de7bfc8 100644 --- a/sf_message/data/template_data.xml +++ b/sf_message/data/template_data.xml @@ -2,7 +2,7 @@ - + 待接单 sale.order @@ -27,6 +27,20 @@ 事项:{{mrp_production_count}}个制造订单待计划排程 + + + 销售订单逾期预警 + + sale.order + + markdown + normal + ### 待排程提醒: +单号:销售订单[{{names}}]({{url}}) +事项:共有{{production_count}}个制造订单未加工完成,订单有逾期风险 + + + 坯料采购提醒 diff --git a/sf_message/models/sf_message_sale.py b/sf_message/models/sf_message_sale.py index e1a6ea3c..7fe03168 100644 --- a/sf_message/models/sf_message_sale.py +++ b/sf_message/models/sf_message_sale.py @@ -46,6 +46,7 @@ class SFMessageSale(models.Model): contents = [] url = self.env['ir.config_parameter'].get_param('web.base.url') for item in message_queue_ids: + i = 0 # 待接单的处理 if item.message_template_id.bussiness_node_id.name == '待接单': content = super(SFMessageSale, self)._get_message(item) @@ -64,6 +65,12 @@ class SFMessageSale(models.Model): url = f"{url}/web#view_type=list&action={action_id}" content = content[0].replace('{{product_id}}', product).replace('{{url}}', url) contents.append(content) + elif item.message_template_id.bussiness_node_id.name == '销售订单逾期预警': + sale_order_warning = self.sudo().search([('delivery_warning', '=', 'warning'),('id','=',int(item.res_id))]) + # if sale_order_warning: + # i++ + # + # if i>1 return contents # # 销售订单逾期预警 @@ -77,7 +84,11 @@ class SFMessageSale(models.Model): item.delivery_warning = '告警' else: item.delivery_warning = '正常' - sale_order_warning = self.sudo().search([('delivery_warning', 'in', ['告警']), ('deadline_of_delivery', '!=', False)]) + sale_order_warning = self.sudo().search([('delivery_warning', '=', 'warning')]) + if sale_order_warning: + if + sale_order_warning.add_queue('销售订单逾期预警') + # 销售订单已逾期 def _overdue_func(self): From a00f4af923e70dc41f8b6c1654929b063d046d6f Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Tue, 8 Oct 2024 17:50:59 +0800 Subject: [PATCH 05/14] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=94=80=E5=94=AE?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E9=80=BE=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_message/__manifest__.py | 2 +- sf_message/data/cron_data.xml | 48 ++++++------ sf_message/data/template_data.xml | 8 +- sf_message/models/sf_message_sale.py | 75 +++++++++++++----- sf_message/views/sf_message_sale_view.xml | 10 +++ sf_message/views/sf_message_template_view.xml | 76 ------------------- sf_sale/models/sale_order.py | 3 + sf_sale/views/sale_order_view.xml | 39 +++++++--- 8 files changed, 128 insertions(+), 133 deletions(-) create mode 100644 sf_message/views/sf_message_sale_view.xml delete mode 100644 sf_message/views/sf_message_template_view.xml diff --git a/sf_message/__manifest__.py b/sf_message/__manifest__.py index 64efb3c9..37805cff 100644 --- a/sf_message/__manifest__.py +++ b/sf_message/__manifest__.py @@ -16,7 +16,7 @@ 'data/bussiness_node.xml', 'data/cron_data.xml', 'data/template_data.xml', - + 'views/sf_message_sale_view.xml', ], 'test': [ diff --git a/sf_message/data/cron_data.xml b/sf_message/data/cron_data.xml index f69dce7b..222756b1 100644 --- a/sf_message/data/cron_data.xml +++ b/sf_message/data/cron_data.xml @@ -26,31 +26,31 @@ - - 装夹预调工单逾期预警 - - code - model._overdue_warning_func() - 1 - minutes - -1 - - - - + + + + + + + + + + + + - - 工单已逾期 - - code - model._overdue_func() - 1 - minutes - -1 - - - - + + + + + + + + + + + + diff --git a/sf_message/data/template_data.xml b/sf_message/data/template_data.xml index 9de7bfc8..a05e0354 100644 --- a/sf_message/data/template_data.xml +++ b/sf_message/data/template_data.xml @@ -22,9 +22,8 @@ markdown normal - ### 待排程提醒: -单号:产品[{{product_id}}]({{url}}) -事项:{{mrp_production_count}}个制造订单待计划排程 + ### 销售订单逾期预警 +事项:共有{{sale_warning_num}}个销售订单有逾期风险 @@ -36,8 +35,7 @@ markdown normal ### 待排程提醒: -单号:销售订单[{{names}}]({{url}}) -事项:共有{{production_count}}个制造订单未加工完成,订单有逾期风险 +事项:共有{{sale_overdue_num}}个销售订单已逾期 diff --git a/sf_message/models/sf_message_sale.py b/sf_message/models/sf_message_sale.py index 7fe03168..9f211871 100644 --- a/sf_message/models/sf_message_sale.py +++ b/sf_message/models/sf_message_sale.py @@ -7,8 +7,6 @@ class SFMessageSale(models.Model): _name = 'sale.order' _inherit = ['sale.order', 'jikimo.message.dispatch'] - delivery_warning = fields.Selection([('normal', '正常'), ('warning', '告警'), ('overdue', '逾期')], string='时效') - def create(self, vals_list): res = super(SFMessageSale, self).create(vals_list) if res: @@ -45,8 +43,8 @@ class SFMessageSale(models.Model): def _get_message(self, message_queue_ids): contents = [] url = self.env['ir.config_parameter'].get_param('web.base.url') + i = 0 for item in message_queue_ids: - i = 0 # 待接单的处理 if item.message_template_id.bussiness_node_id.name == '待接单': content = super(SFMessageSale, self)._get_message(item) @@ -66,30 +64,71 @@ class SFMessageSale(models.Model): content = content[0].replace('{{product_id}}', product).replace('{{url}}', url) contents.append(content) elif item.message_template_id.bussiness_node_id.name == '销售订单逾期预警': - sale_order_warning = self.sudo().search([('delivery_warning', '=', 'warning'),('id','=',int(item.res_id))]) - # if sale_order_warning: - # i++ - # - # if i>1 + current_time = datetime.now() + time_range = timedelta(minutes=2) + for reminder_time in item.message_template_id.reminder_time_ids: + content = item.message_template_id.content + target_time = current_time.replace(hour=reminder_time, minute=0, second=0, microsecond=0) + if target_time - time_range <= current_time <= target_time + time_range: + print("当前时间在12点02分以内") + sale_order_warning = self.sudo().search( + [('delivery_warning', '=', 'warning'), ('id', '=', int(item.res_id))]) + if sale_order_warning: + i += 1 + if i >= 1: + content = content.replace('{{sale_warning_num}}', i).replace('{{url}}', url) + contents.append(content) + elif item.message_template_id.bussiness_node_id.name == '销售订单已逾期': + current_time = datetime.now() + time_range = timedelta(minutes=2) + for reminder_time in item.message_template_id.reminder_time_ids: + content = item.message_template_id.content + target_time = current_time.replace(hour=reminder_time, minute=0, second=0, microsecond=0) + if target_time - time_range <= current_time <= target_time + time_range: + print("当前时间在12点02分以内") + sale_order_overdue = self.sudo().search( + [('delivery_warning', '=', 'overdue'), ('id', '=', int(item.res_id))]) + if sale_order_overdue: + i += 1 + if i >= 1: + content = content.replace('{{sale_overdue_num}}', i).replace('{{url}}', url) + contents.append(content) return contents - # # 销售订单逾期预警 - + # # 销售订单逾期预警 def _overdue_warning_func(self): today = fields.Date.today() deadline_check = today + timedelta(days=2) sale_order = self.sudo().search([('state', 'in', ['sale']), ('deadline_of_delivery', '!=', False)]) for item in sale_order: - if deadline_check < item.deadline_of_delivery: - item.delivery_warning = '告警' - else: - item.delivery_warning = '正常' + production = self.env['mrp.production'].search([('origin', '=', item.name)]) + if len(production.filtered( + lambda p: p.state not in ['done', 'scrap'])) != item.mrp_production_count: + if deadline_check < item.deadline_of_delivery: + item.delivery_warning = 'warning' + elif len(production.filtered( + lambda p: p.state in ['done', 'scrap'])) == item.mrp_production_count: + if deadline_check < item.deadline_of_delivery and item.delivery_status == 'pending': + item.delivery_warning = 'warning' sale_order_warning = self.sudo().search([('delivery_warning', '=', 'warning')]) if sale_order_warning: - if sale_order_warning.add_queue('销售订单逾期预警') - - # 销售订单已逾期 + # 销售订单已逾期 订单交期(交货日期)-当前日期时间≤0(未交货完成的销售订单) def _overdue_func(self): - return 1 + today = fields.Date.today() + sale_order = self.sudo().search([('state', 'in', ['sale']), ('deadline_of_delivery', '!=', False)]) + for item in sale_order: + delta = item.deadline_of_delivery - today + production = self.env['mrp.production'].search([('origin', '=', item.name)]) + if len(production.filtered( + lambda p: p.state not in ['done', 'scrap'])) != item.mrp_production_count: + if delta <= timedelta(days=0): + item.delivery_warning = 'overdue' + elif len(production.filtered( + lambda p: p.state in ['done', 'scrap'])) == item.mrp_production_count: + if delta <= timedelta(days=0): + item.delivery_warning = 'overdue' + sale_order_overdue = self.sudo().search([('delivery_warning', '=', 'overdue')]) + if sale_order_overdue: + sale_order_overdue.add_queue('销售订单已逾期') diff --git a/sf_message/views/sf_message_sale_view.xml b/sf_message/views/sf_message_sale_view.xml new file mode 100644 index 00000000..6de01920 --- /dev/null +++ b/sf_message/views/sf_message_sale_view.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/sf_message/views/sf_message_template_view.xml b/sf_message/views/sf_message_template_view.xml deleted file mode 100644 index 21920b64..00000000 --- a/sf_message/views/sf_message_template_view.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - sf.message.template.view.form - message.template - -
- -
-
- - - - - - - - - -
-
-
-
- - - sf.message.template.view.tree - message.template - - - - - - - - - - - - - - - sf.message.template.search.view - message.template - - - - - - - - - - - - 消息模板 - message.template - tree,form - - - - - -
-
\ No newline at end of file diff --git a/sf_sale/models/sale_order.py b/sf_sale/models/sale_order.py index d19a3b02..f28a76c4 100644 --- a/sf_sale/models/sale_order.py +++ b/sf_sale/models/sale_order.py @@ -55,6 +55,9 @@ class ReSaleOrder(models.Model): store=True, readonly=False, copy=False, precompute=True, states=READONLY_FIELD_STATES, default=fields.Datetime.now) + delivery_warning = fields.Selection([('normal', '正常'), ('warning', '告警'), ('overdue', '逾期')], string='时效') + + # 业务平台分配工厂后在智能工厂先创建销售订单 def sale_order_create(self, company_id, delivery_name, delivery_telephone, delivery_address, deadline_of_delivery, payments_way, pay_way): diff --git a/sf_sale/views/sale_order_view.xml b/sf_sale/views/sale_order_view.xml index 506f5b8d..9e2a82e8 100644 --- a/sf_sale/views/sale_order_view.xml +++ b/sf_sale/views/sale_order_view.xml @@ -67,7 +67,8 @@ {'readonly': [('state', 'in', ['cancel','sale'])]} - + + @@ -78,6 +79,7 @@ + {'no_create': True} @@ -180,6 +182,20 @@ + + sale.order.message.search.view + sale.order + + primary + + + + + + + + + sale.order.tree sale.order @@ -189,18 +205,15 @@ create_date desc False + delivery_warning == 'warning' + delivery_warning == 'overdue' 订单号 - - - - - - - - + + + @@ -225,10 +238,18 @@ + {"search_default_categ_id":1, "search_default_filter_to_sell":1,"sale_multi_pricelist_product_template": 1} + + + + + { 'search_default_filter_order_warning':1,'search_default_filter_order_overdue':1} + +
\ No newline at end of file From 2639a6ac6bab4fe229995c46d398256d624cadc8 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Wed, 9 Oct 2024 16:42:53 +0800 Subject: [PATCH 06/14] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=94=80=E5=94=AE?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E9=80=BE=E6=9C=9F=E5=92=8C=E9=A2=84=E8=AD=A6?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_message/__manifest__.py | 2 +- sf_message/data/template_data.xml | 23 +++-- sf_message/models/sf_message_sale.py | 111 ++++++++++++++---------- sf_message/security/ir.model.access.csv | 36 ++++---- 4 files changed, 105 insertions(+), 67 deletions(-) diff --git a/sf_message/__manifest__.py b/sf_message/__manifest__.py index 37805cff..506fd122 100644 --- a/sf_message/__manifest__.py +++ b/sf_message/__manifest__.py @@ -16,7 +16,7 @@ 'data/bussiness_node.xml', 'data/cron_data.xml', 'data/template_data.xml', - 'views/sf_message_sale_view.xml', + 'security/ir.model.access.csv', ], 'test': [ diff --git a/sf_message/data/template_data.xml b/sf_message/data/template_data.xml index a05e0354..a68468f1 100644 --- a/sf_message/data/template_data.xml +++ b/sf_message/data/template_data.xml @@ -16,14 +16,15 @@ - 确认接单 + 待排程提醒 sale.order markdown normal - ### 销售订单逾期预警 -事项:共有{{sale_warning_num}}个销售订单有逾期风险 + ### 待排程提醒: +单号:产品[{{product_id}}]({{url}}) +事项:{{mrp_production_count}}个制造订单待计划排程 @@ -34,8 +35,20 @@ markdown normal - ### 待排程提醒: -事项:共有{{sale_overdue_num}}个销售订单已逾期 + ### 销售订单逾期预警 +事项:共有[{{sale_warning_num}}]({{url}})个销售订单有逾期风险 + + + + + 销售订单已逾期 + + sale.order + + markdown + urgent + ### 销售订单已逾期提醒 +事项:共有[{{sale_overdue_num}}]({{url}})个销售订单已逾期 diff --git a/sf_message/models/sf_message_sale.py b/sf_message/models/sf_message_sale.py index 9f211871..e70e6d45 100644 --- a/sf_message/models/sf_message_sale.py +++ b/sf_message/models/sf_message_sale.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import logging +from datetime import datetime, timedelta from odoo import models, fields, api, _ @@ -42,17 +43,20 @@ class SFMessageSale(models.Model): # 继承并重写jikimo.message.dispatch的_get_message() def _get_message(self, message_queue_ids): contents = [] + bussiness_node = None url = self.env['ir.config_parameter'].get_param('web.base.url') + current_time_strf = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + current_time = self.env['sf.sync.common'].sudo().get_add_time(current_time_strf) + current_time_datetime = datetime.strptime(current_time, '%Y-%m-%d %H:%M:%S') + time_range = timedelta(minutes=2) i = 0 for item in message_queue_ids: - # 待接单的处理 if item.message_template_id.bussiness_node_id.name == '待接单': content = super(SFMessageSale, self)._get_message(item) action_id = self.env.ref('sale.action_quotations_with_onboarding').id - url = f"{url}/web#id={item.res_id}&view_type=form&action={action_id}" - content = content[0].replace('{{url}}', url) + 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) sale_order_line = self.env['sale.order.line'].search([('order_id', '=', int(item.res_id))]) @@ -60,75 +64,90 @@ class SFMessageSale(models.Model): sale_order_line[ 0].product_id.name action_id = self.env.ref('sf_plan.sf_production_plan_action1').id - url = f"{url}/web#view_type=list&action={action_id}" - content = content[0].replace('{{product_id}}', product).replace('{{url}}', url) + url_with_id = f"{url}/web#view_type=list&action={action_id}" + content = content[0].replace('{{product_id}}', product).replace('{{url}}', url_with_id) contents.append(content) - elif item.message_template_id.bussiness_node_id.name == '销售订单逾期预警': - current_time = datetime.now() - time_range = timedelta(minutes=2) + elif item.message_template_id.bussiness_node_id.name in ['销售订单逾期预警', '销售订单已逾期']: + bussiness_node = item.message_template_id.bussiness_node_id.name for reminder_time in item.message_template_id.reminder_time_ids: content = item.message_template_id.content - target_time = current_time.replace(hour=reminder_time, minute=0, second=0, microsecond=0) - if target_time - time_range <= current_time <= target_time + time_range: - print("当前时间在12点02分以内") - sale_order_warning = self.sudo().search( - [('delivery_warning', '=', 'warning'), ('id', '=', int(item.res_id))]) - if sale_order_warning: + target_time = datetime.combine(current_time_datetime.date(), datetime.min.time()).replace( + hour=reminder_time.time_point, + minute=0, + second=0, + microsecond=0 + ) + logging.info(current_time) + logging.info(target_time) + if target_time - time_range <= current_time_datetime <= target_time + time_range: + search_condition = [ + ('delivery_warning', '=', 'warning')] if bussiness_node == '销售订单逾期预警' else [ + ('delivery_warning', '=', 'overdue')] + record = self.sudo().search(search_condition + [('id', '=', int(item.res_id))]) + if record: i += 1 - if i >= 1: - content = content.replace('{{sale_warning_num}}', i).replace('{{url}}', url) - contents.append(content) - elif item.message_template_id.bussiness_node_id.name == '销售订单已逾期': - current_time = datetime.now() - time_range = timedelta(minutes=2) - for reminder_time in item.message_template_id.reminder_time_ids: - content = item.message_template_id.content - target_time = current_time.replace(hour=reminder_time, minute=0, second=0, microsecond=0) - if target_time - time_range <= current_time <= target_time + time_range: - print("当前时间在12点02分以内") - sale_order_overdue = self.sudo().search( - [('delivery_warning', '=', 'overdue'), ('id', '=', int(item.res_id))]) - if sale_order_overdue: - i += 1 - if i >= 1: - content = content.replace('{{sale_overdue_num}}', i).replace('{{url}}', url) - contents.append(content) + if i >= 1: + action_id = self.env.ref('sale.action_orders').id + url_with_id = f"{url}/web#view_type=list&action={action_id}" + content_template = content.replace('{{url}}', url_with_id) + if bussiness_node == '销售订单逾期预警': + content = content_template.replace('{{sale_warning_num}}', str(i)) + elif bussiness_node == '销售订单已逾期': + content = content_template.replace('{{sale_overdue_num}}', str(i)) + contents.append(content) return contents # # 销售订单逾期预警 def _overdue_warning_func(self): today = fields.Date.today() - deadline_check = today + timedelta(days=2) + deadline_check = today + timedelta(days=1) sale_order = self.sudo().search([('state', 'in', ['sale']), ('deadline_of_delivery', '!=', False)]) for item in sale_order: production = self.env['mrp.production'].search([('origin', '=', item.name)]) if len(production.filtered( - lambda p: p.state not in ['done', 'scrap'])) != item.mrp_production_count: - if deadline_check < item.deadline_of_delivery: + lambda p: p.state not in ['done', 'scrap', 'cancel'])) != item.mrp_production_count: + if deadline_check == item.deadline_of_delivery: item.delivery_warning = 'warning' elif len(production.filtered( - lambda p: p.state in ['done', 'scrap'])) == item.mrp_production_count: - if deadline_check < item.deadline_of_delivery and item.delivery_status == 'pending': + lambda p: p.state in ['done', 'scrap', 'cancel'])) == item.mrp_production_count: + if deadline_check == item.deadline_of_delivery and item.delivery_status in ['pending', 'partial']: item.delivery_warning = 'warning' sale_order_warning = self.sudo().search([('delivery_warning', '=', 'warning')]) if sale_order_warning: - sale_order_warning.add_queue('销售订单逾期预警') + for warning in sale_order_warning: + message_template = self.env["jikimo.message.template"].search([ + ("model", "=", self._name), + ("bussiness_node_id", "=", self.env.ref('sf_message.bussiness_sale_order_overdue_warning').id) + ]) + sale_order_has = self.env['jikimo.message.queue'].search( + [('res_id', '=', warning.id), ('message_status', '=', 'pending'), + ('message_template_id', '=', message_template.id)]) + if not sale_order_has: + sale_order_warning.add_queue('销售订单逾期预警') # 销售订单已逾期 订单交期(交货日期)-当前日期时间≤0(未交货完成的销售订单) def _overdue_func(self): - today = fields.Date.today() + today = datetime.today().date() sale_order = self.sudo().search([('state', 'in', ['sale']), ('deadline_of_delivery', '!=', False)]) for item in sale_order: - delta = item.deadline_of_delivery - today production = self.env['mrp.production'].search([('origin', '=', item.name)]) if len(production.filtered( - lambda p: p.state not in ['done', 'scrap'])) != item.mrp_production_count: - if delta <= timedelta(days=0): + lambda p: p.state not in ['done', 'scrap', 'cancel'])) != item.mrp_production_count: + if today == item.deadline_of_delivery: item.delivery_warning = 'overdue' elif len(production.filtered( - lambda p: p.state in ['done', 'scrap'])) == item.mrp_production_count: - if delta <= timedelta(days=0): + lambda p: p.state in ['done', 'scrap', 'cancel'])) == item.mrp_production_count: + if today == item.deadline_of_delivery and item.delivery_status in ['pending', 'partial']: item.delivery_warning = 'overdue' sale_order_overdue = self.sudo().search([('delivery_warning', '=', 'overdue')]) if sale_order_overdue: - sale_order_overdue.add_queue('销售订单已逾期') + for overdue in sale_order_overdue: + message_template = self.env["jikimo.message.template"].search([ + ("model", "=", self._name), + ("bussiness_node_id", "=", self.env.ref('sf_message.bussiness_sale_order_overdue').id) + ]) + sale_order_has = self.env['jikimo.message.queue'].search( + [('res_id', '=', overdue.id), ('message_status', '=', 'pending'), + ('message_template_id', '=', message_template.id)]) + if not sale_order_has: + sale_order_overdue.add_queue('销售订单已逾期') diff --git a/sf_message/security/ir.model.access.csv b/sf_message/security/ir.model.access.csv index cb42c911..05a7366c 100644 --- a/sf_message/security/ir.model.access.csv +++ b/sf_message/security/ir.model.access.csv @@ -1,22 +1,28 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_jikimo_message_template_group_sale_salemanager,jikimo_message_template,model_jikimo_message_template,sf_base.group_sale_salemanager,1,1,1,0 -access_jikimo_message_template_group_purchase,jikimo_message_template,model_jikimo_message_template,sf_base.group_purchase,1,1,1,0 -access_jikimo_message_template_group_sf_stock_user,jikimo_message_template,model_jikimo_message_template,sf_base.group_sf_stock_user,1,1,1,0 -access_jikimo_message_template_group_sf_order_user,jikimo_message_template,model_jikimo_message_template,sf_base.group_sf_order_user,1,1,1,0 -access_jikimo_message_template_group_sf_tool_user,jikimo_message_template,model_jikimo_message_template,sf_base.group_sf_tool_user,1,1,1,0 +access_jikimo_message_template_group_sale_salemanager,jikimo_message_template,jikimo_message_notify.model_jikimo_message_template,sf_base.group_sale_salemanager,1,1,1,0 +access_jikimo_message_template_group_purchase,jikimo_message_template,jikimo_message_notify.model_jikimo_message_template,sf_base.group_purchase,1,1,1,0 +access_jikimo_message_template_group_sf_stock_user,jikimo_message_template,jikimo_message_notify.model_jikimo_message_template,sf_base.group_sf_stock_user,1,1,1,0 +access_jikimo_message_template_group_sf_order_user,jikimo_message_template,jikimo_message_notify.model_jikimo_message_template,sf_base.group_sf_order_user,1,1,1,0 +access_jikimo_message_template_group_sf_tool_user,jikimo_message_template,jikimo_message_notify.model_jikimo_message_template,sf_base.group_sf_tool_user,1,1,1,0 -access_jikimo_message_bussiness_node_group_sale_salemanager,jikimo_message_bussiness_node,model_jikimo_message_bussiness_node,sf_base.group_sale_salemanager,1,1,1,0 -access_jikimo_message_bussiness_node_group_purchase,jikimo_message_bussiness_node,model_jikimo_message_bussiness_node,sf_base.group_purchase,1,1,1,0 -access_jikimo_message_bussiness_node_group_sf_stock_user,jikimo_message_bussiness_node,model_jikimo_message_bussiness_node,sf_base.group_sf_stock_user,1,1,1,0 -access_jikimo_message_bussiness_node_group_sf_order_user,jikimo_message_bussiness_node,model_jikimo_message_bussiness_node,sf_base.group_sf_order_user,1,1,1,0 -access_jikimo_message_bussiness_node_group_sf_tool_user,jikimo_message_bussiness_node,model_jikimo_message_bussiness_node,sf_base.group_sf_tool_user,1,1,1,0 +access_jikimo_message_bussiness_node_group_sale_salemanager,jikimo_message_bussiness_node,jikimo_message_notify.model_jikimo_message_bussiness_node,sf_base.group_sale_salemanager,1,1,1,0 +access_jikimo_message_bussiness_node_group_purchase,jikimo_message_bussiness_node,jikimo_message_notify.model_jikimo_message_bussiness_node,sf_base.group_purchase,1,1,1,0 +access_jikimo_message_bussiness_node_group_sf_stock_user,jikimo_message_bussiness_node,jikimo_message_notify.model_jikimo_message_bussiness_node,sf_base.group_sf_stock_user,1,1,1,0 +access_jikimo_message_bussiness_node_group_sf_order_user,jikimo_message_bussiness_node,jikimo_message_notify.model_jikimo_message_bussiness_node,sf_base.group_sf_order_user,1,1,1,0 +access_jikimo_message_bussiness_node_group_sf_tool_user,jikimo_message_bussiness_node,jikimo_message_notify.model_jikimo_message_bussiness_node,sf_base.group_sf_tool_user,1,1,1,0 -access_jikimo_message_queue_group_sale_salemanager,jikimo_message_queue,model_jikimo_message_queue,sf_base.group_sale_salemanager,1,1,1,0 -access_jikimo_message_queue_group_purchase,jikimo_message_queue,model_jikimo_message_queue,sf_base.group_purchase,1,1,1,0 -access_jikimo_message_queue_group_sf_stock_user,jikimo_message_queue,model_jikimo_message_queue,sf_base.group_sf_stock_user,1,1,1,0 -access_jikimo_message_queue_group_sf_order_user,jikimo_message_queue,model_jikimo_message_queue,sf_base.group_sf_order_user,1,1,1,0 -access_jikimo_message_queue_group_sf_tool_user,jikimo_message_queue,model_jikimo_message_queue,sf_base.group_sf_tool_user,1,1,1,0 +access_jikimo_message_queue_group_sale_salemanager,jikimo_message_queue,jikimo_message_notify.model_jikimo_message_queue,sf_base.group_sale_salemanager,1,1,1,0 +access_jikimo_message_queue_group_purchase,jikimo_message_queue,jikimo_message_notify.model_jikimo_message_queue,sf_base.group_purchase,1,1,1,0 +access_jikimo_message_queue_group_sf_stock_user,jikimo_message_queue,jikimo_message_notify.model_jikimo_message_queue,sf_base.group_sf_stock_user,1,1,1,0 +access_jikimo_message_queue_group_sf_order_user,jikimo_message_queue,jikimo_message_notify.model_jikimo_message_queue,sf_base.group_sf_order_user,1,1,1,0 +access_jikimo_message_queue_group_sf_tool_user,jikimo_message_queue,jikimo_message_notify.model_jikimo_message_queue,sf_base.group_sf_tool_user,1,1,1,0 + +access_jikimo_message_reminder_time_group_sale_salemanager,jikimo_message_reminder_time,jikimo_message_notify.model_jikimo_message_reminder_time,sf_base.group_sale_salemanager,1,1,1,0 +access_jikimo_message_reminder_time_group_purchase,jikimo_message_reminder_time,jikimo_message_notify.model_jikimo_message_reminder_time,sf_base.group_purchase,1,1,1,0 +access_jikimo_message_reminder_time_group_sf_stock_user,jikimo_message_reminder_time,jikimo_message_notify.model_jikimo_message_reminder_time,sf_base.group_sf_stock_user,1,1,1,0 +access_jikimo_message_reminder_time_group_sf_order_user,jikimo_message_reminder_time,jikimo_message_notify.model_jikimo_message_reminder_time,sf_base.group_sf_order_user,1,1,1,0 +access_jikimo_message_reminder_time_group_sf_tool_user,jikimo_message_reminder_time,jikimo_message_notify.model_jikimo_message_reminder_time,sf_base.group_sf_tool_user,1,1,1,0 From 02467d52206e126ff5be43b66b4ed6388c07aeb8 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Wed, 9 Oct 2024 17:58:47 +0800 Subject: [PATCH 07/14] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=B7=A5=E5=8D=95?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_message/data/cron_data.xml | 48 +++++++-------- sf_message/data/template_data.xml | 4 +- sf_message/models/sf_message_sale.py | 4 +- sf_message/models/sf_message_workorder.py | 75 +++++++++++++++++++++++ 4 files changed, 103 insertions(+), 28 deletions(-) diff --git a/sf_message/data/cron_data.xml b/sf_message/data/cron_data.xml index 222756b1..70310ba1 100644 --- a/sf_message/data/cron_data.xml +++ b/sf_message/data/cron_data.xml @@ -26,31 +26,31 @@ - - - - - - - - - - - - + + 工单逾期预警 + + code + model._overdue_warning_func() + 1 + minutes + -1 + + + + - - - - - - - - - - - - + + 工单已逾期 + + code + model._overdue_func() + 1 + minutes + -1 + + + + diff --git a/sf_message/data/template_data.xml b/sf_message/data/template_data.xml index a68468f1..0931318a 100644 --- a/sf_message/data/template_data.xml +++ b/sf_message/data/template_data.xml @@ -36,7 +36,7 @@ markdown normal ### 销售订单逾期预警 -事项:共有[{{sale_warning_num}}]({{url}})个销售订单有逾期风险 +事项:共有[{{warning_num}}]({{url}})个销售订单有逾期风险 @@ -48,7 +48,7 @@ markdown urgent ### 销售订单已逾期提醒 -事项:共有[{{sale_overdue_num}}]({{url}})个销售订单已逾期 +事项:共有[{{overdue_num}}]({{url}})个销售订单已逾期 diff --git a/sf_message/models/sf_message_sale.py b/sf_message/models/sf_message_sale.py index e70e6d45..fa1ff019 100644 --- a/sf_message/models/sf_message_sale.py +++ b/sf_message/models/sf_message_sale.py @@ -91,9 +91,9 @@ class SFMessageSale(models.Model): url_with_id = f"{url}/web#view_type=list&action={action_id}" content_template = content.replace('{{url}}', url_with_id) if bussiness_node == '销售订单逾期预警': - content = content_template.replace('{{sale_warning_num}}', str(i)) + content = content_template.replace('{{warning_num}}', str(i)) elif bussiness_node == '销售订单已逾期': - content = content_template.replace('{{sale_overdue_num}}', str(i)) + content = content_template.replace('{{overdue_num}}', str(i)) contents.append(content) return contents diff --git a/sf_message/models/sf_message_workorder.py b/sf_message/models/sf_message_workorder.py index d2e0fba2..73a47362 100644 --- a/sf_message/models/sf_message_workorder.py +++ b/sf_message/models/sf_message_workorder.py @@ -6,10 +6,13 @@ from urllib.parse import urlencode _logger = logging.getLogger(__name__) + class SFMessageWork(models.Model): _name = 'mrp.workorder' _inherit = ['mrp.workorder', 'jikimo.message.dispatch'] + delivery_warning = fields.Selection([('normal', '正常'), ('warning', '告警'), ('overdue', '逾期')], string='时效') + @api.depends('production_availability', 'blocked_by_workorder_ids.state') def _compute_state(self): super(SFMessageWork, self)._compute_state() @@ -23,6 +26,13 @@ class SFMessageWork(models.Model): def _get_message(self, message_queue_ids): contents = [] product_id = [] + bussiness_node = None + url = self.env['ir.config_parameter'].get_param('web.base.url') + current_time_strf = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + current_time = self.env['sf.sync.common'].sudo().get_add_time(current_time_strf) + current_time_datetime = datetime.strptime(current_time, '%Y-%m-%d %H:%M:%S') + time_range = timedelta(minutes=2) + i = 0 for message_queue_id in message_queue_ids: if message_queue_id.message_template_id.name == '工单已下发通知': content = message_queue_id.message_template_id.content @@ -37,6 +47,34 @@ class SFMessageWork(models.Model): '{{request_url}}', url) product_id.append(mrp_workorder_line.product_id.id) contents.append(content) + elif message_queue_id.message_template_id.name in ['工单逾期预警', '工单已逾期']: + bussiness_node = item.message_template_id.bussiness_node_id.name + for reminder_time in item.message_template_id.reminder_time_ids: + content = item.message_template_id.content + target_time = datetime.combine(current_time_datetime.date(), datetime.min.time()).replace( + hour=reminder_time.time_point, + minute=0, + second=0, + microsecond=0 + ) + logging.info(current_time) + logging.info(target_time) + if target_time - time_range <= current_time_datetime <= target_time + time_range: + search_condition = [ + ('delivery_warning', '=', 'warning')] if bussiness_node == '工单逾期预警' else [ + ('delivery_warning', '=', 'overdue')] + record = self.sudo().search(search_condition + [('id', '=', int(item.res_id))]) + if record: + i += 1 + if i >= 1: + action_id = self.env.ref('sf_manufacturing.mrp_workorder_action_tablet').id + url_with_id = f"{url}/web#view_type=list&action={action_id}" + content_template = content.replace('{{url}}', url_with_id) + if bussiness_node == '工单逾期预警': + content = content_template.replace('{{warning_num}}', str(i)) + elif bussiness_node == '工单已逾期': + content = content_template.replace('{{overdue_num}}', str(i)) + contents.append(content) return contents def request_url(self): @@ -54,3 +92,40 @@ class SFMessageWork(models.Model): full_url = full_url + "web#" + query_string return full_url + def _overdue_warning_func(self): + workorders = self.env['mrp.workorder'].read_group([("state", "in", ["ready", "progress", "to be detected"])] + , ['routing_type'], ['id']) + for group in workorders: + workorder_id = group['id'][0] if group['id'] else False + if not workorder_id: + continue + if workorder_id.routing_type == '装夹预调': + bussiness_node = self.env.ref('sf_message.bussiness_mrp_workorder_pre_overdue_warning').id + elif workorder_id.routing_type == 'CNC加工': + bussiness_node = self.env.ref('sf_message.bussiness_mrp_workorder_cnc_overdue_warning').id + elif workorder_id.routing_type == '解除装夹': + bussiness_node = self.env.ref('sf_message.bussiness_mrp_workorder_unclamp_overdue_warning').id + elif workorder_id.routing_type == '表面工艺': + bussiness_node = self.env.ref('sf_message.bussiness_mrp_workorder_surface_overdue_warning').id + message_template = self.env["jikimo.message.template"].search([ + ("model", "=", self._name), + ("bussiness_node_id", "=", bussiness_node.id) + ]) + message_queue_ids = self.env["jikimo.message.queue"].search([ + ("message_template_id", "=", message_template.id), + ("message_status", "=", "pending") + ]) + if not message_queue_ids: + continue + # for workorder in workorders: + # for + # message_template = self.env["jikimo.message.template"].search([ + # ("model", "=", self._name), + # ("bussiness_node_id", "=", self.env.ref('sf_message.bussiness_sale_order_overdue').id) + # ]) + # sale_order_has = self.env['jikimo.message.queue'].search( + # [('res_id', '=', workorder.id), ('message_status', '=', 'pending'), + # ('message_template_id', '=', message_template.id)]) + # if not sale_order_has: + # sale_order_overdue.add_queue('销售订单已逾期') + From 351815ad917087355f331d1953e083a0edb58966 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Thu, 10 Oct 2024 17:36:35 +0800 Subject: [PATCH 08/14] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=94=80=E5=94=AE?= =?UTF-8?q?=E8=AE=A2=E5=8D=95+=E5=B7=A5=E5=8D=95=E9=80=BE=E6=9C=9F?= =?UTF-8?q?=E9=A2=84=E8=AD=A6=E5=92=8C=E5=B7=B21=E9=80=BE=E6=9C=9F?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/mrp_workorder.py | 2 +- .../views/mrp_production_addional_change.xml | 10 +- sf_manufacturing/views/mrp_workorder_view.xml | 13 +- sf_message/data/bussiness_node.xml | 40 +---- sf_message/data/cron_data.xml | 143 +----------------- sf_message/data/template_data.xml | 96 ++++++++++++ sf_message/models/sf_message_sale.py | 81 +++++----- sf_message/models/sf_message_workorder.py | 111 ++++++++------ 8 files changed, 222 insertions(+), 274 deletions(-) diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 7c3ec50f..a26b5236 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -59,7 +59,7 @@ class ResMrpWorkOrder(models.Model): compute='_compute_state', store=True, default='pending', copy=False, readonly=True, recursive=True, index=True, tracking=True) - # state = fields.Selection(selection_add=[('to be detected', "待检测"), ('rework', '返工')], tracking=True) + delivery_warning = fields.Selection([('normal', '正常'), ('warning', '告警'), ('overdue', '逾期')], string='时效') @api.depends('production_id.manual_quotation') def _compute_manual_quotation(self): diff --git a/sf_manufacturing/views/mrp_production_addional_change.xml b/sf_manufacturing/views/mrp_production_addional_change.xml index c6ae49ad..e74a4e50 100644 --- a/sf_manufacturing/views/mrp_production_addional_change.xml +++ b/sf_manufacturing/views/mrp_production_addional_change.xml @@ -296,8 +296,11 @@ - - + + @@ -348,8 +351,11 @@ sequence + delivery_warning == 'warning' + delivery_warning == 'overdue' + fullscreen--> current [('state', '!=', 'cancel'),('schedule_state', '=', '已排')] - {'search_default_product': 1, 'search_default_workcenter_id': active_id} + {'search_default_product': 1, 'search_default_workcenter_id': + active_id,'search_default_filter_order_warning':1,'search_default_filter_order_overdue':1} +

没有工单要做! @@ -520,7 +522,8 @@