From 9d883d112cb008c2614bce66b3cc7411ebd30e03 Mon Sep 17 00:00:00 2001 From: guanhuan Date: Fri, 20 Dec 2024 13:51:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=8F=90=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_message/data/bussiness_node.xml | 10 +++++++ sf_message/data/template_data.xml | 27 +++++++++++++++++ sf_message/models/sf_message_purchase.py | 37 ++++++++++++++++++++++++ sf_sale/__manifest__.py | 1 + sf_sale/data/cron_data.xml | 16 ++++++++++ sf_sale/models/sale_order.py | 27 +++++++++++++++++ 6 files changed, 118 insertions(+) create mode 100644 sf_sale/data/cron_data.xml diff --git a/sf_message/data/bussiness_node.xml b/sf_message/data/bussiness_node.xml index cff79873..8a95f525 100644 --- a/sf_message/data/bussiness_node.xml +++ b/sf_message/data/bussiness_node.xml @@ -140,5 +140,15 @@ 工序外协发料通知 mrp.production + + + 采购订单预警提醒 + purchase.order + + + + 采购单已逾期提醒 + purchase.order + \ No newline at end of file diff --git a/sf_message/data/template_data.xml b/sf_message/data/template_data.xml index 42256ce6..e1ba0a93 100644 --- a/sf_message/data/template_data.xml +++ b/sf_message/data/template_data.xml @@ -362,5 +362,32 @@ 单号:产品[{{name}}]({{url}})发料单 事项:请确认{{num}}个工序外协发料单并发料处理。 + + + + 采购订单预警提醒 + + purchase.order + + markdown + timing + normal + ### 采购订单预警提醒 +事项:[共有{{num}}个采购订单有逾期风险]({{url}}) + + + + + 采购单已逾期提醒 + + purchase.order + + markdown + timing + normal + ### 采购单已逾期提醒 +事项:[共有{{num}}个采购订单已逾期]({{url}}) + + \ No newline at end of file diff --git a/sf_message/models/sf_message_purchase.py b/sf_message/models/sf_message_purchase.py index 3f1c4709..b9505414 100644 --- a/sf_message/models/sf_message_purchase.py +++ b/sf_message/models/sf_message_purchase.py @@ -24,6 +24,19 @@ class SFMessagePurchase(models.Model): [('id', '=', int(message_queue_id.res_id))]) mrp_production = self.env['mrp.production'].sudo().search([('name', '=', purchase_order_line.origin)]) process_outsourcing.add(mrp_production.product_id.id) + if message_queue_id.message_template_id.name in ('采购订单预警提醒', '采购单已逾期提醒'): + content = message_queue_id.message_template_id.content + if message_queue_id.message_template_id.name == '采购订单预警提醒': + domain = [('delivery_warning', '=', 'warning')] + else: + domain = [('delivery_warning', '=', 'overdue')] + purchase_order_num = self.env['purchase.order'].sudo().search_count(domain) + if purchase_order_num >= 1: + url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + action_id = self.env.ref("purchase.purchase_form_action").id + url_with_id = f"{url}/web#view_type=list&action={action_id}" + content = content.replace('{{url}}', url_with_id).replace('{{num}}', str(purchase_order_num)) + contents.append(content) if process_outsourcing: content_info = content for products_id in process_outsourcing: @@ -58,3 +71,27 @@ class SFMessagePurchase(models.Model): # 拼接URL full_url = url + "/web#" + query_string return full_url + + def _overdue_or_warning_func(self): + last_overdue_order, last_warning_order = super(SFMessagePurchase, self)._overdue_or_warning_func() + if last_overdue_order: + business_node_id = self.env.ref('sf_message.template_purchase_order_overdue').id + purchase_order_has = self._get_message_queue(business_node_id) + if not purchase_order_has: + last_overdue_order.add_queue("采购单已逾期提醒") + if last_warning_order: + business_node_id = self.env.ref('sf_message.template_purchase_order_warning').id + purchase_order_has = self._get_message_queue(business_node_id) + if not purchase_order_has: + last_warning_order.add_queue("采购订单预警提醒") + + def _get_message_queue(self, business_node_id): + message_template = self.env["jikimo.message.template"].sudo().search([ + ("model", "=", self._name), + ("bussiness_node_id", "=", business_node_id) + ], limit=1) + purchase_order_has = self.env['jikimo.message.queue'].sudo().search([ + ('message_status', '=', 'pending'), + ('message_template_id', '=', message_template.id) + ]) + return purchase_order_has diff --git a/sf_sale/__manifest__.py b/sf_sale/__manifest__.py index 45c95030..12d50f5f 100644 --- a/sf_sale/__manifest__.py +++ b/sf_sale/__manifest__.py @@ -16,6 +16,7 @@ 'security/ir.model.access.csv', 'wizard/sale_order_wizard_views.xml', 'wizard/purchase_order_wizard_views.xml', + 'data/cron_data.xml', 'views/sale_team.xml', 'views/sale_order_view.xml', 'views/res_partner_view.xml', diff --git a/sf_sale/data/cron_data.xml b/sf_sale/data/cron_data.xml new file mode 100644 index 00000000..3a1d2ea7 --- /dev/null +++ b/sf_sale/data/cron_data.xml @@ -0,0 +1,16 @@ + + + + 检查采购单是否已逾期预警和逾期 + + code + model._overdue_or_warning_func() + 10 + minutes + -1 + + + + + + \ No newline at end of file diff --git a/sf_sale/models/sale_order.py b/sf_sale/models/sale_order.py index ca851fc6..492c0316 100644 --- a/sf_sale/models/sale_order.py +++ b/sf_sale/models/sale_order.py @@ -1,8 +1,10 @@ import datetime import base64 +import logging from odoo import Command from odoo import models, fields, api, _ from odoo.exceptions import UserError, ValidationError +from datetime import datetime, timedelta READONLY_FIELD_STATES = { state: [('readonly', True)] @@ -218,6 +220,10 @@ class RePurchaseOrder(models.Model): purchase_type = fields.Selection([('standard', '标准采购'), ('consignment', '委外加工')], string='采购类型', default='standard') + delivery_warning = fields.Selection([('normal', '正常'), ('warning', '预警'), ('overdue', '已逾期')], + string='交期状态', + tracking=True) + @api.depends('partner_id') def _compute_user_id(self): if not self.user_id: @@ -299,6 +305,27 @@ class RePurchaseOrder(models.Model): return result + # # 采购订单逾期预警和已逾期 + def _overdue_or_warning_func(self): + purchase_order = self.sudo().search( + [('state', 'in', ['purchase']), ('date_planned', '!=', False), + ('receipt_status', 'in', ('partial', 'pending'))]) + last_overdue_order = None + last_warning_order = None + for item in purchase_order: + current_time = datetime.now() + if item.date_planned <= current_time: # 已逾期 + item.delivery_warning = 'overdue' + last_overdue_order = item + elif (item.date_planned - current_time).total_seconds() < 48 * 3600: # 预警 + item.delivery_warning = 'warning' + last_warning_order = item + purchase_order_done = self.sudo().search([('state', 'in', ['purchase']), ('receipt_status', '=', 'full')]) + purchase_order_overdue = purchase_order_done.filtered(lambda x: x.delivery_warning in ['overdue', 'warning']) + if purchase_order_overdue: + purchase_order_overdue.write({'delivery_warning': 'normal'}) + return last_overdue_order, last_warning_order + class ResPartnerToSale(models.Model): _inherit = 'res.partner'