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