# -*- coding: utf-8 -*- import logging from datetime import datetime, timedelta from odoo import models, fields, api, _ class SFMessageSale(models.Model): _name = 'sale.order' _inherit = ['sale.order', 'jikimo.message.dispatch'] # 确认接单 def action_confirm(self): res = super(SFMessageSale, self).action_confirm() if res is True: try: self.add_queue('确认接单') picking_ids = self.mrp_production_ids purchase_order_id = [] if picking_ids: for picking_id in picking_ids: picking_id.add_queue('待确认加工路线') purchase_order_ids = ( picking_id.procurement_group_id.stock_move_ids.created_purchase_line_id.order_id | picking_id.procurement_group_id.stock_move_ids.move_orig_ids.purchase_line_id.order_id).ids purchase_order_id.extend(purchase_order_ids) if purchase_order_id: purchase_order_list = self.env['purchase.order'].sudo().search( [('id', 'in', purchase_order_id)]) for purchase_order_info in purchase_order_list: purchase_order_info.add_queue('坯料采购提醒') purchase_order_ids = self.order_line.purchase_line_ids.order_id | self.procurement_group_id.stock_move_ids.created_purchase_line_id.order_id | self.procurement_group_id.stock_move_ids.move_orig_ids.purchase_line_id.order_id for purchase_order_id in purchase_order_ids: if purchase_order_id.purchase_type == 'outsourcing': purchase_order_id.add_queue('委外加工采购单提醒') if purchase_order_id.purchase_type == 'outside': purchase_order_id.add_queue('外购订单采购单提醒') except Exception as e: logging.info('add_queue error:%s' % e) logging.info('action_confirm res:%s' % res) return res def confirm_to_supply_method(self): super(SFMessageSale, self).confirm_to_supply_method() try: self.add_queue('待确认供货方式') except Exception as e: logging.info('add_queue待确认供货方式 error:%s' % e) # 继承并重写jikimo.message.dispatch的_get_message() def _get_message(self, message_queue_ids): contents = [] bussiness_node = None url = self.env['ir.config_parameter'].sudo().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 in ('待接单', '待确认供货方式'): content, _ = super(SFMessageSale, self)._get_message(item) action_id = self.env.ref('sale.action_quotations_with_onboarding').id \ if item.message_template_id.bussiness_node_id.name == '待接单' \ else self.env.ref('sale.action_orders').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) 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[ 0].product_id.name action_id = self.env.ref('sf_plan.sf_production_plan_action1').id 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 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('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('{{warning_num}}', str(i)) elif bussiness_node == '销售订单已逾期': content = content_template.replace('{{overdue_num}}', str(i)) contents.append(content) return contents, message_queue_ids # # 销售订单逾期预警和已逾期 def _overdue_or_warning_func(self): 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) today_str = datetime.strptime(current_time, '%Y-%m-%d %H:%M:%S') today = today_str.strftime("%Y-%m-%d") # 计算下一天的日期 deadline_check_str = today_str + timedelta(days=1) deadline_check = deadline_check_str.strftime("%Y-%m-%d") logging.info( f"today: {today}, deadline_check: {deadline_check},current_time_strf: {current_time_strf}, current_time: {current_time}'") sale_order = self.sudo().search( [('state', 'in', ['sale']), ('deadline_of_delivery', '!=', False), ('delivery_status', '!=', 'full')]) for item in sale_order: production = self.env['mrp.production'].sudo().search([('origin', '=', item.name)]) production_not_done = production.filtered(lambda p: p.state not in ['done', 'scrap', 'cancel']) production_done_count = len(production.filtered(lambda p: p.state in ['done', 'scrap', 'cancel'])) deadline_of_delivery = item.deadline_of_delivery.strftime("%Y-%m-%d") if (len(production_not_done) >= 1 and len(production_not_done) != item.mrp_production_count) or len( production_not_done) != production_done_count: # logging.info("-----不等于----") # logging.info(f"name: {item.name}") # logging.info( # f"production_not_done: {len(production_not_done)}, production_done_count: {production_done_count}") # logging.info(f"deadline_of_delivery: {item.deadline_of_delivery}") if deadline_check == deadline_of_delivery and item.delivery_warning not in ['warning']: item.delivery_warning = 'warning' elif today >= deadline_of_delivery and item.delivery_warning not in ['overdue']: item.delivery_warning = 'overdue' elif production_done_count == item.mrp_production_count: # logging.info("-----等于----") # logging.info(f"name: {item.name}") # logging.info( # f"production_not_done: {len(production_not_done)}, production_done_count: {production_done_count}") # logging.info(f"deadline_of_delivery: {item.deadline_of_delivery}") if item.delivery_status in ['pending', 'partial']: if deadline_check == deadline_of_delivery and item.delivery_warning not in ['warning']: item.delivery_warning = 'warning' elif today >= deadline_of_delivery and item.delivery_warning not in ['overdue']: item.delivery_warning = 'overdue' else: # logging.info("-----1111111----") # logging.info(f"name: {item.name}") # logging.info( # f"production_not_done: {len(production_not_done)}, production_done_count: {production_done_count}") continue # 获取业务节点 business_node_ids = { 'warning': self.env.ref('sf_message.bussiness_sale_order_overdue_warning').id, 'overdue': self.env.ref('sf_message.bussiness_sale_order_overdue').id } overdue_orders = self.sudo().search([('delivery_warning', 'in', ['warning', 'overdue'])]) for wo in overdue_orders: business_node_id = business_node_ids.get(wo.delivery_warning) if business_node_id: message_template = self.env["jikimo.message.template"].sudo().search([ ("model", "=", self._name), ("bussiness_node_id", "=", business_node_id) ], limit=1) sale_order_has = self.env['jikimo.message.queue'].sudo().search([ ('res_id', '=', wo.id), ('message_status', '=', 'pending'), ('message_template_id', '=', message_template.id) ]) if not sale_order_has: message_name = '销售订单逾期预警' if wo.delivery_warning == 'warning' else '销售订单已逾期' wo.add_queue(message_name) if wo.delivery_warning == 'overdue': # 把消息队列中销售订单预警的状态改为取消发送 business_node_id_warning = business_node_ids['warning'] if business_node_id_warning: message_template_warning = self.env["jikimo.message.template"].search([ ("model", "=", self._name), ("bussiness_node_id", "=", business_node_id_warning) ], limit=1) if message_template_warning: sale_order_warning = self.env['jikimo.message.queue'].search([ ('res_id', '=', wo.id), ('message_status', '=', 'pending'), ('message_template_id', '=', message_template_warning.id) ]) if sale_order_warning: logging.info('取消发送:%s' % sale_order_warning) sale_order_warning.write({'message_status': 'cancel'}) def _recover_sale_time_warning_func(self): sale_order_done = self.sudo().search([('state', 'in', ['sale']), ('delivery_status', '=', 'full')]) sale_order_overdue = sale_order_done.filtered(lambda x: x.delivery_warning in ['overdue', 'warning']) if sale_order_overdue: sale_order_overdue.write({'delivery_warning': 'normal'}) message_queue_ids = self.env["jikimo.message.queue"].sudo().search([ ("message_status", "=", "pending"), ("res_id", "in", [item.id for item in sale_order_overdue]) ]) if message_queue_ids: message_queue_ids.write({'message_status': 'cancel'})