优化销售订单+工单逾期预警和已1逾期代码

This commit is contained in:
jinling.yang
2024-10-10 17:36:35 +08:00
parent 02467d5220
commit 351815ad91
8 changed files with 222 additions and 274 deletions

View File

@@ -59,7 +59,7 @@ class ResMrpWorkOrder(models.Model):
compute='_compute_state', store=True, compute='_compute_state', store=True,
default='pending', copy=False, readonly=True, recursive=True, index=True, tracking=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') @api.depends('production_id.manual_quotation')
def _compute_manual_quotation(self): def _compute_manual_quotation(self):

View File

@@ -296,8 +296,11 @@
</attribute> </attribute>
</xpath> </xpath>
<xpath expr="//sheet//notebook//page[@name='operations']//field[@name='workorder_ids']" position="replace"> <xpath expr="//sheet//notebook//page[@name='operations']//field[@name='workorder_ids']"
<field name="workorder_ids" attrs="{'readonly': ['|', ('state', '!=', 'test_value'), '&amp;', ('state', '=', 'done'), ('is_locked', '=', True)]}" context="{'tree_view_ref': 'mrp.mrp_production_workorder_tree_editable_view', 'default_product_uom_id': product_uom_id, 'from_manufacturing_order': True}"/> position="replace">
<field name="workorder_ids"
attrs="{'readonly': ['|', ('state', '!=', 'test_value'), '&amp;', ('state', '=', 'done'), ('is_locked', '=', True)]}"
context="{'tree_view_ref': 'mrp.mrp_production_workorder_tree_editable_view', 'default_product_uom_id': product_uom_id, 'from_manufacturing_order': True}"/>
</xpath> </xpath>
<xpath expr="//sheet//notebook//page[@name='operations']" position="after"> <xpath expr="//sheet//notebook//page[@name='operations']" position="after">
@@ -348,8 +351,11 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//tree" position="attributes"> <xpath expr="//tree" position="attributes">
<attribute name="default_order">sequence</attribute> <attribute name="default_order">sequence</attribute>
<attribute name="decoration-warning">delivery_warning == 'warning'</attribute>
<attribute name="decoration-danger">delivery_warning == 'overdue'</attribute>
</xpath> </xpath>
<xpath expr="//field[@name='state']" position="replace"> <xpath expr="//field[@name='state']" position="replace">
<field name="delivery_warning" invisible="True"/>
<field name="state" widget="badge" decoration-warning="state == 'progress'" <field name="state" widget="badge" decoration-warning="state == 'progress'"
decoration-success="state == 'done'" decoration-danger="state in ('cancel','rework')" decoration-success="state == 'done'" decoration-danger="state in ('cancel','rework')"
decoration-muted="state == 'to be detected'" decoration-muted="state == 'to be detected'"

View File

@@ -101,7 +101,9 @@
<!-- <field name="target">fullscreen</field>--> <!-- <field name="target">fullscreen</field>-->
<field name="target">current</field> <field name="target">current</field>
<field name="domain">[('state', '!=', 'cancel'),('schedule_state', '=', '已排')]</field> <field name="domain">[('state', '!=', 'cancel'),('schedule_state', '=', '已排')]</field>
<field name="context">{'search_default_product': 1, 'search_default_workcenter_id': active_id}</field> <field name="context">{'search_default_product': 1, 'search_default_workcenter_id':
active_id,'search_default_filter_order_warning':1,'search_default_filter_order_overdue':1}
</field>
<field name="help" type="html"> <field name="help" type="html">
<p class="o_view_nocontent_workorder"> <p class="o_view_nocontent_workorder">
没有工单要做! 没有工单要做!
@@ -520,7 +522,8 @@
<xpath expr="//form//header" position="inside"> <xpath expr="//form//header" position="inside">
<button type="object" class="oe_highlight jikimo_button_confirm" name="get_three_check_datas" <button type="object" class="oe_highlight jikimo_button_confirm" name="get_three_check_datas"
string="获取数据" attrs='{"invisible": ["|", ("state","!=","progress"), ("routing_type","!=","装夹预调")]}'/> string="获取数据"
attrs='{"invisible": ["|", ("state","!=","progress"), ("routing_type","!=","装夹预调")]}'/>
</xpath> </xpath>
@@ -640,6 +643,12 @@
<xpath expr="//filter[@name='progress']" position="after"> <xpath expr="//filter[@name='progress']" position="after">
<filter string="待检测" name="state" domain="[('state','=','to be detected')]"/> <filter string="待检测" name="state" domain="[('state','=','to be detected')]"/>
</xpath> </xpath>
<xpath expr="//filter[@name='date_start_filter']" position="before">
<separator/>
<filter string="预警" name="filter_order_warning" domain="[('delivery_warning', '=', 'warning')]"/>
<filter string="逾期" name="filter_order_overdue" domain="[('delivery_warning', '=', 'overdue')]"/>
<separator/>
</xpath>
</field> </field>
</record> </record>

View File

@@ -61,45 +61,7 @@
</record> </record>
<record id="bussiness_mrp_workorder_cnc_overdue_warning" model="jikimo.message.bussiness.node"> <record id="bussiness_mrp_workorder_cnc_overdue_warning" model="jikimo.message.bussiness.node">
<field name="name">CNC工单逾期预警</field> <field name="name">CNC加工工单逾期预警</field>
<field name="model">mrp.workorder</field>
</record>
<record id="bussiness_mrp_workorder_cnc_overdue" model="jikimo.message.bussiness.node">
<field name="name">CNC工单已逾期</field>
<field name="model">mrp.workorder</field>
</record>
<record id="bussiness_mrp_workorder_unclamp_overdue_warning" model="jikimo.message.bussiness.node">
<field name="name">解除装夹工单逾期预警</field>
<field name="model">mrp.workorder</field>
</record>
<record id="bussiness_mrp_workorder_unclamp_overdue" model="jikimo.message.bussiness.node">
<field name="name">解除装夹工单已逾期</field>
<field name="model">mrp.workorder</field>
</record>
<record id="bussiness_mrp_workorder_surface_overdue_warning" model="jikimo.message.bussiness.node">
<field name="name">表面工艺工单逾期预警</field>
<field name="model">mrp.workorder</field>
</record>
<record id="bussiness_mrp_workorder_surface_overdue" model="jikimo.message.bussiness.node">
<field name="name">表面工艺工单已逾期</field>
<field name="model">mrp.workorder</field>
</record>
<record id="bussiness_mrp_workorder_pre_overdue_warning" model="jikimo.message.bussiness.node">
<field name="name">装夹预调工单逾期预警</field>
<field name="model">mrp.workorder</field>
</record>
<record id="bussiness_mrp_workorder_pre_overdue" model="jikimo.message.bussiness.node">
<field name="name">装夹预调工单已逾期</field>
<field name="model">mrp.workorder</field>
</record>
<record id="bussiness_mrp_workorder_cnc_overdue_warning" model="jikimo.message.bussiness.node">
<field name="name">CNC工单逾期预警</field>
<field name="model">mrp.workorder</field> <field name="model">mrp.workorder</field>
</record> </record>
<record id="bussiness_mrp_workorder_cnc_overdue" model="jikimo.message.bussiness.node"> <record id="bussiness_mrp_workorder_cnc_overdue" model="jikimo.message.bussiness.node">

View File

@@ -1,24 +1,11 @@
<odoo> <odoo>
<data noupdate="1"> <data noupdate="1">
<record model="ir.cron" id="ir_cron_sale_order_overdue_warning"> <record model="ir.cron" id="ir_cron_sale_order_overdue_warning">
<field name="name">销售订单逾期预警</field> <field name="name">检查销售订单是否已逾期预警和逾期</field>
<field name="model_id" ref="model_sale_order"/> <field name="model_id" ref="model_sale_order"/>
<field name="state">code</field> <field name="state">code</field>
<field name="code">model._overdue_warning_func()</field> <field name="code">model._overdue_or_warning_func()</field>
<field name="interval_number">1</field> <field name="interval_number">10</field>
<field name="interval_type">minutes</field>
<field name="numbercall">-1</field>
<field name="doall" eval="False"/>
<field name="user_id" ref="base.user_root"/>
<field name="active" eval="True"/>
</record>
<record model="ir.cron" id="ir_cron_sale_order_overdue">
<field name="name">销售订单已逾期</field>
<field name="model_id" ref="model_sale_order"/>
<field name="state">code</field>
<field name="code">model._overdue_func()</field>
<field name="interval_number">1</field>
<field name="interval_type">minutes</field> <field name="interval_type">minutes</field>
<field name="numbercall">-1</field> <field name="numbercall">-1</field>
<field name="doall" eval="False"/> <field name="doall" eval="False"/>
@@ -27,134 +14,16 @@
</record> </record>
<record model="ir.cron" id="ir_cron_mrp_workorder_overdue_warning"> <record model="ir.cron" id="ir_cron_mrp_workorder_overdue_warning">
<field name="name">工单逾期预警</field> <field name="name">检查工单是否已逾期预警和逾期</field>
<field name="model_id" ref="model_mrp_workorder"/> <field name="model_id" ref="model_mrp_workorder"/>
<field name="state">code</field> <field name="state">code</field>
<field name="code">model._overdue_warning_func()</field> <field name="code">model._overdue_or_warning_func()</field>
<field name="interval_number">1</field> <field name="interval_number">10</field>
<field name="interval_type">minutes</field> <field name="interval_type">minutes</field>
<field name="numbercall">-1</field> <field name="numbercall">-1</field>
<field name="doall" eval="False"/> <field name="doall" eval="False"/>
<field name="user_id" ref="base.user_root"/> <field name="user_id" ref="base.user_root"/>
<field name="active" eval="True"/> <field name="active" eval="True"/>
</record> </record>
<record model="ir.cron" id="ir_cron_mrp_workorder_overdue">
<field name="name">工单已逾期</field>
<field name="model_id" ref="model_mrp_workorder"/>
<field name="state">code</field>
<field name="code">model._overdue_func()</field>
<field name="interval_number">1</field>
<field name="interval_type">minutes</field>
<field name="numbercall">-1</field>
<field name="doall" eval="False"/>
<field name="user_id" ref="base.user_root"/>
<field name="active" eval="True"/>
</record>
<!-- -->
<!-- <record model="ir.cron" id="ir_cron_mrp_workorder_overdue_warning">-->
<!-- <field name="name">工单逾期预警</field>-->
<!-- <field name="model_id" ref="model_mrp_workorder"/>-->
<!-- <field name="state">code</field>-->
<!-- <field name="code">model._overdue_warning_func()</field>-->
<!-- <field name="interval_number">1</field>-->
<!-- <field name="interval_type">minutes</field>-->
<!-- <field name="numbercall">-1</field>-->
<!-- <field name="doall" eval="False"/>-->
<!-- <field name="user_id" ref="base.user_root"/>-->
<!-- <field name="active" eval="True"/>-->
<!-- </record>-->
<!-- <record model="ir.cron" id="ir_cron_mrp_workorder_pre_overdue">-->
<!-- <field name="name">工单已逾期</field>-->
<!-- <field name="model_id" ref="model_mrp_workorder"/>-->
<!-- <field name="state">code</field>-->
<!-- <field name="code">model._overdue_func()</field>-->
<!-- <field name="interval_number">1</field>-->
<!-- <field name="interval_type">minutes</field>-->
<!-- <field name="numbercall">-1</field>-->
<!-- <field name="doall" eval="False"/>-->
<!-- <field name="user_id" ref="base.user_root"/>-->
<!-- <field name="active" eval="True"/>-->
<!-- </record>-->
<!-- -->
<!-- <record model="ir.cron" id="ir_cron_mrp_workorder_pre_overdue_warning">-->
<!-- <field name="name">工单逾期预警</field>-->
<!-- <field name="model_id" ref="model_mrp_workorder"/>-->
<!-- <field name="state">code</field>-->
<!-- <field name="code">model._overdue_warning_func()</field>-->
<!-- <field name="interval_number">1</field>-->
<!-- <field name="interval_type">minutes</field>-->
<!-- <field name="numbercall">-1</field>-->
<!-- <field name="doall" eval="False"/>-->
<!-- <field name="user_id" ref="base.user_root"/>-->
<!-- <field name="active" eval="True"/>-->
<!-- </record>-->
<!-- <record model="ir.cron" id="ir_cron_mrp_workorder_pre_overdue">-->
<!-- <field name="name">工单已逾期</field>-->
<!-- <field name="model_id" ref="model_mrp_workorder"/>-->
<!-- <field name="state">code</field>-->
<!-- <field name="code">model._overdue_func()</field>-->
<!-- <field name="interval_number">1</field>-->
<!-- <field name="interval_type">minutes</field>-->
<!-- <field name="numbercall">-1</field>-->
<!-- <field name="doall" eval="False"/>-->
<!-- <field name="user_id" ref="base.user_root"/>-->
<!-- <field name="active" eval="True"/>-->
<!-- </record>-->
<!-- -->
<!-- -->
<!-- <record model="ir.cron" id="ir_cron_mrp_workorder_pre_overdue_warning">-->
<!-- <field name="name">工单逾期预警</field>-->
<!-- <field name="model_id" ref="model_mrp_workorder"/>-->
<!-- <field name="state">code</field>-->
<!-- <field name="code">model._overdue_warning_func()</field>-->
<!-- <field name="interval_number">1</field>-->
<!-- <field name="interval_type">minutes</field>-->
<!-- <field name="numbercall">-1</field>-->
<!-- <field name="doall" eval="False"/>-->
<!-- <field name="user_id" ref="base.user_root"/>-->
<!-- <field name="active" eval="True"/>-->
<!-- </record>-->
<!-- <record model="ir.cron" id="ir_cron_mrp_workorder_pre_overdue">-->
<!-- <field name="name">工单已逾期</field>-->
<!-- <field name="model_id" ref="model_mrp_workorder"/>-->
<!-- <field name="state">code</field>-->
<!-- <field name="code">model._overdue_func()</field>-->
<!-- <field name="interval_number">1</field>-->
<!-- <field name="interval_type">minutes</field>-->
<!-- <field name="numbercall">-1</field>-->
<!-- <field name="doall" eval="False"/>-->
<!-- <field name="user_id" ref="base.user_root"/>-->
<!-- <field name="active" eval="True"/>-->
<!-- </record>-->
<!-- -->
<!-- <record model="ir.cron" id="ir_cron_mrp_workorder_pre_overdue_warning">-->
<!-- <field name="name">工单逾期预警</field>-->
<!-- <field name="model_id" ref="model_mrp_workorder"/>-->
<!-- <field name="state">code</field>-->
<!-- <field name="code">model._overdue_warning_func()</field>-->
<!-- <field name="interval_number">1</field>-->
<!-- <field name="interval_type">minutes</field>-->
<!-- <field name="numbercall">-1</field>-->
<!-- <field name="doall" eval="False"/>-->
<!-- <field name="user_id" ref="base.user_root"/>-->
<!-- <field name="active" eval="True"/>-->
<!-- </record>-->
<!-- <record model="ir.cron" id="ir_cron_mrp_workorder_pre_overdue">-->
<!-- <field name="name">工单已逾期</field>-->
<!-- <field name="model_id" ref="model_mrp_workorder"/>-->
<!-- <field name="state">code</field>-->
<!-- <field name="code">model._overdue_func()</field>-->
<!-- <field name="interval_number">1</field>-->
<!-- <field name="interval_type">minutes</field>-->
<!-- <field name="numbercall">-1</field>-->
<!-- <field name="doall" eval="False"/>-->
<!-- <field name="user_id" ref="base.user_root"/>-->
<!-- <field name="active" eval="True"/>-->
<!-- </record>-->
</data> </data>
</odoo> </odoo>

View File

@@ -88,6 +88,102 @@
事项:共{{number}}个工单已下发,请查收知悉</field> 事项:共{{number}}个工单已下发,请查收知悉</field>
</record> </record>
<record id="template_mrp_workorder_pre_overdue_warning" model="jikimo.message.template">
<field name="name">装夹预调工单逾期预警</field>
<field name="model_id" ref="mrp_workorder.model_mrp_workorder"/>
<field name="model">mrp.workorder</field>
<field name="bussiness_node_id" ref="bussiness_mrp_workorder_pre_overdue_warning"/>
<field name="msgtype">markdown</field>
<field name="send_type">timing</field>
<field name="urgency">normal</field>
<field name="content">### 工单逾期预警
事项:共有[{{warning_num}}]({{url}})工单有逾期风险</field>
</record>
<record id="template_mrp_workorder_pre_overdue" model="jikimo.message.template">
<field name="name">装夹预调工单已逾期</field>
<field name="model_id" ref="mrp_workorder.model_mrp_workorder"/>
<field name="model">mrp.workorder</field>
<field name="bussiness_node_id" ref="bussiness_mrp_workorder_pre_overdue"/>
<field name="msgtype">markdown</field>
<field name="send_type">timing</field>
<field name="urgency">normal</field>
<field name="content">### 工单已逾期提醒
事项:共有[{{overdue_num}}]({{url}})工单已逾期</field>
</record>
<record id="template_mrp_workorder_cnc_overdue_warning" model="jikimo.message.template">
<field name="name">CNC工单逾期预警</field>
<field name="model_id" ref="mrp_workorder.model_mrp_workorder"/>
<field name="model">mrp.workorder</field>
<field name="bussiness_node_id" ref="bussiness_mrp_workorder_cnc_overdue_warning"/>
<field name="msgtype">markdown</field>
<field name="send_type">timing</field>
<field name="urgency">normal</field>
<field name="content">### 工单逾期预警
事项:共有[{{warning_num}}]({{url}})工单有逾期风险</field>
</record>
<record id="template_mrp_workorder_cnc_overdue" model="jikimo.message.template">
<field name="name">CNC工单已逾期</field>
<field name="model_id" ref="mrp_workorder.model_mrp_workorder"/>
<field name="model">mrp.workorder</field>
<field name="bussiness_node_id" ref="bussiness_mrp_workorder_cnc_overdue"/>
<field name="msgtype">markdown</field>
<field name="send_type">timing</field>
<field name="urgency">normal</field>
<field name="content">### 工单已逾期提醒
事项:共有[{{overdue_num}}]({{url}})工单已逾期</field>
</record>
<record id="template_mrp_workorder_unclamp_overdue_warning" model="jikimo.message.template">
<field name="name">解除装夹工单逾期预警</field>
<field name="model_id" ref="mrp_workorder.model_mrp_workorder"/>
<field name="model">mrp.workorder</field>
<field name="bussiness_node_id" ref="bussiness_mrp_workorder_unclamp_overdue_warning"/>
<field name="msgtype">markdown</field>
<field name="send_type">timing</field>
<field name="urgency">normal</field>
<field name="content">### 工单逾期预警
事项:共有[{{warning_num}}]({{url}})工单有逾期风险</field>
</record>
<record id="template_mrp_workorder_unclamp_overdue" model="jikimo.message.template">
<field name="name">解除装夹工单已逾期</field>
<field name="model_id" ref="mrp_workorder.model_mrp_workorder"/>
<field name="model">mrp.workorder</field>
<field name="bussiness_node_id" ref="bussiness_mrp_workorder_unclamp_overdue"/>
<field name="msgtype">markdown</field>
<field name="send_type">timing</field>
<field name="urgency">normal</field>
<field name="content">### 工单已逾期提醒
事项:共有[{{overdue_num}}]({{url}})工单已逾期</field>
</record>
<record id="template_mrp_workorder_surface_overdue_warning" model="jikimo.message.template">
<field name="name">表面工艺工单逾期预警</field>
<field name="model_id" ref="mrp_workorder.model_mrp_workorder"/>
<field name="model">mrp.workorder</field>
<field name="bussiness_node_id" ref="bussiness_mrp_workorder_surface_overdue_warning"/>
<field name="msgtype">markdown</field>
<field name="send_type">timing</field>
<field name="urgency">normal</field>
<field name="content">### 工单逾期预警
事项:共有[{{warning_num}}]({{url}})工单有逾期风险</field>
</record>
<record id="template_mrp_workorder_surface_overdue" model="jikimo.message.template">
<field name="name">表面工艺工单已逾期</field>
<field name="model_id" ref="mrp_workorder.model_mrp_workorder"/>
<field name="model">mrp.workorder</field>
<field name="bussiness_node_id" ref="bussiness_mrp_workorder_surface_overdue"/>
<field name="msgtype">markdown</field>
<field name="send_type">timing</field>
<field name="urgency">normal</field>
<field name="content">### 工单已逾期提醒
事项:共有[{{overdue_num}}]({{url}})工单已逾期</field>
</record>
<record id="template_transfer_inventory_remind" model="jikimo.message.template"> <record id="template_transfer_inventory_remind" model="jikimo.message.template">

View File

@@ -97,57 +97,44 @@ class SFMessageSale(models.Model):
contents.append(content) contents.append(content)
return contents return contents
# # 销售订单逾期预警 # # 销售订单逾期预警和已逾期
def _overdue_warning_func(self): def _overdue_or_warning_func(self):
today = fields.Date.today() today = datetime.today().date()
deadline_check = today + timedelta(days=1) deadline_check = today + timedelta(days=1)
logging.info(f"today: {today}, deadline_check: {deadline_check}")
sale_order = self.sudo().search([('state', 'in', ['sale']), ('deadline_of_delivery', '!=', False)]) sale_order = self.sudo().search([('state', 'in', ['sale']), ('deadline_of_delivery', '!=', False)])
for item in sale_order: for item in sale_order:
production = self.env['mrp.production'].search([('origin', '=', item.name)]) production = self.env['mrp.production'].search([('origin', '=', item.name)])
if len(production.filtered( production_not_done = production.filtered(lambda p: p.state not in ['done', 'scrap', 'cancel'])
lambda p: p.state not in ['done', 'scrap', 'cancel'])) != item.mrp_production_count: production_done_count = len(production.filtered(lambda p: p.state in ['done', 'scrap', 'cancel']))
if len(production_not_done) != item.mrp_production_count:
if deadline_check == item.deadline_of_delivery: if deadline_check == item.deadline_of_delivery:
item.delivery_warning = 'warning' item.delivery_warning = 'warning'
elif len(production.filtered( elif today == item.deadline_of_delivery:
lambda p: p.state in ['done', 'scrap', 'cancel'])) == item.mrp_production_count: item.delivery_warning = 'overdue'
if deadline_check == item.deadline_of_delivery and item.delivery_status in ['pending', 'partial']: elif production_done_count == item.mrp_production_count:
item.delivery_warning = 'warning' if item.delivery_status in ['pending', 'partial']:
sale_order_warning = self.sudo().search([('delivery_warning', '=', 'warning')]) if deadline_check == item.deadline_of_delivery:
if sale_order_warning: item.delivery_warning = 'warning'
for warning in sale_order_warning: elif today == item.deadline_of_delivery:
message_template = self.env["jikimo.message.template"].search([ item.delivery_warning = 'overdue'
("model", "=", self._name), else:
("bussiness_node_id", "=", self.env.ref('sf_message.bussiness_sale_order_overdue_warning').id) continue
]) overdue_orders = self.sudo().search([('delivery_warning', 'in', ['warning', 'overdue'])])
sale_order_has = self.env['jikimo.message.queue'].search( for wo in overdue_orders:
[('res_id', '=', warning.id), ('message_status', '=', 'pending'), message_template = self.env["jikimo.message.template"].search([
('message_template_id', '=', message_template.id)]) ("model", "=", self._name),
if not sale_order_has: ("bussiness_node_id", "=", self.env.ref('sf_message.bussiness_sale_order_overdue_warning').id)
sale_order_warning.add_queue('销售订单逾期预警') ])
sale_order_has = self.env['jikimo.message.queue'].search([
('res_id', '=', wo.id),
('message_status', '=', 'pending'),
('message_template_id', '=', message_template.id)
])
if not sale_order_has:
if wo.delivery_warning == 'warning':
wo.add_queue('销售订单逾期预警')
elif wo.delivery_warning == 'overdue':
wo.add_queue('销售订单已逾期')
# 销售订单已逾期 订单交期(交货日期)-当前日期时间≤0(未交货完成的销售订单)
def _overdue_func(self):
today = datetime.today().date()
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', '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', '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:
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('销售订单已逾期')

View File

@@ -1,3 +1,4 @@
from datetime import datetime, timedelta
from odoo import models, fields, api, _ from odoo import models, fields, api, _
import logging, json import logging, json
import requests import requests
@@ -11,8 +12,6 @@ class SFMessageWork(models.Model):
_name = 'mrp.workorder' _name = 'mrp.workorder'
_inherit = ['mrp.workorder', 'jikimo.message.dispatch'] _inherit = ['mrp.workorder', 'jikimo.message.dispatch']
delivery_warning = fields.Selection([('normal', '正常'), ('warning', '告警'), ('overdue', '逾期')], string='时效')
@api.depends('production_availability', 'blocked_by_workorder_ids.state') @api.depends('production_availability', 'blocked_by_workorder_ids.state')
def _compute_state(self): def _compute_state(self):
super(SFMessageWork, self)._compute_state() super(SFMessageWork, self)._compute_state()
@@ -32,6 +31,10 @@ class SFMessageWork(models.Model):
current_time = self.env['sf.sync.common'].sudo().get_add_time(current_time_strf) 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') current_time_datetime = datetime.strptime(current_time, '%Y-%m-%d %H:%M:%S')
time_range = timedelta(minutes=2) time_range = timedelta(minutes=2)
template_names = {
'预警': ['装夹预调工单逾期预警', 'CNC加工工单逾期预警', '解除装夹工单逾期预警', '表面工艺工单逾期预警'],
'已逾期': ['装夹预调工单已逾期', 'CNC加工工单已逾期', '解除装夹工单已逾期', '表面工艺工单已逾期']
}
i = 0 i = 0
for message_queue_id in message_queue_ids: for message_queue_id in message_queue_ids:
if message_queue_id.message_template_id.name == '工单已下发通知': if message_queue_id.message_template_id.name == '工单已下发通知':
@@ -47,10 +50,11 @@ class SFMessageWork(models.Model):
'{{request_url}}', url) '{{request_url}}', url)
product_id.append(mrp_workorder_line.product_id.id) product_id.append(mrp_workorder_line.product_id.id)
contents.append(content) contents.append(content)
elif message_queue_id.message_template_id.name in ['工单逾期预警', '工单已逾期']: elif message_queue_id.message_template_id.name in template_names['预警'] + template_names['已逾期']:
bussiness_node = item.message_template_id.bussiness_node_id.name item = message_queue_id.message_template_id
for reminder_time in item.message_template_id.reminder_time_ids: bussiness_node = item.bussiness_node_id.name
content = item.message_template_id.content for reminder_time in item.reminder_time_ids:
content = item.content
target_time = datetime.combine(current_time_datetime.date(), datetime.min.time()).replace( target_time = datetime.combine(current_time_datetime.date(), datetime.min.time()).replace(
hour=reminder_time.time_point, hour=reminder_time.time_point,
minute=0, minute=0,
@@ -59,9 +63,11 @@ class SFMessageWork(models.Model):
) )
logging.info(current_time) logging.info(current_time)
logging.info(target_time) logging.info(target_time)
logging.info(target_time - time_range)
logging.info(target_time + time_range)
if target_time - time_range <= current_time_datetime <= target_time + time_range: if target_time - time_range <= current_time_datetime <= target_time + time_range:
search_condition = [ search_condition = [
('delivery_warning', '=', 'warning')] if bussiness_node == '工单逾期预警' else [ ('delivery_warning', '=', 'warning')] if bussiness_node in template_names['预警'] else [
('delivery_warning', '=', 'overdue')] ('delivery_warning', '=', 'overdue')]
record = self.sudo().search(search_condition + [('id', '=', int(item.res_id))]) record = self.sudo().search(search_condition + [('id', '=', int(item.res_id))])
if record: if record:
@@ -70,9 +76,9 @@ class SFMessageWork(models.Model):
action_id = self.env.ref('sf_manufacturing.mrp_workorder_action_tablet').id action_id = self.env.ref('sf_manufacturing.mrp_workorder_action_tablet').id
url_with_id = f"{url}/web#view_type=list&action={action_id}" url_with_id = f"{url}/web#view_type=list&action={action_id}"
content_template = content.replace('{{url}}', url_with_id) content_template = content.replace('{{url}}', url_with_id)
if bussiness_node == '工单逾期预警': if bussiness_node in template_names['预警']:
content = content_template.replace('{{warning_num}}', str(i)) content = content_template.replace('{{warning_num}}', str(i))
elif bussiness_node == '工单已逾期': elif bussiness_node in template_names['已逾期']:
content = content_template.replace('{{overdue_num}}', str(i)) content = content_template.replace('{{overdue_num}}', str(i))
contents.append(content) contents.append(content)
return contents return contents
@@ -92,40 +98,53 @@ class SFMessageWork(models.Model):
full_url = full_url + "web#" + query_string full_url = full_url + "web#" + query_string
return full_url return full_url
def _overdue_warning_func(self): def _overdue_or_warning_func(self):
workorders = self.env['mrp.workorder'].read_group([("state", "in", ["ready", "progress", "to be detected"])] workorders = self.env['mrp.workorder'].search([("state", "in", ["ready", "progress", "to be detected"])])
, ['routing_type'], ['id']) grouped_workorders = {}
for group in workorders: for workorder in workorders:
workorder_id = group['id'][0] if group['id'] else False routing_type = workorder.routing_type
if not workorder_id: if routing_type not in grouped_workorders:
continue grouped_workorders[routing_type] = []
if workorder_id.routing_type == '装夹预调': grouped_workorders[routing_type].append(workorder)
bussiness_node = self.env.ref('sf_message.bussiness_mrp_workorder_pre_overdue_warning').id for routing_type, orders in grouped_workorders.items():
elif workorder_id.routing_type == 'CNC加工': print(f"Routing Type: {routing_type}, Orders: {len(orders)}")
bussiness_node = self.env.ref('sf_message.bussiness_mrp_workorder_cnc_overdue_warning').id for item in orders:
elif workorder_id.routing_type == '解除装夹': if item.date_planned_finished:
bussiness_node = self.env.ref('sf_message.bussiness_mrp_workorder_unclamp_overdue_warning').id current_time_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
elif workorder_id.routing_type == '表面工艺': current_time_datetime = datetime.strptime(current_time_str, '%Y-%m-%d %H:%M:%S')
bussiness_node = self.env.ref('sf_message.bussiness_mrp_workorder_surface_overdue_warning').id date_planned_finished_str = self.env['sf.sync.common'].sudo().get_add_time(
message_template = self.env["jikimo.message.template"].search([ item.date_planned_finished.strftime("%Y-%m-%d %H:%M:%S"))
("model", "=", self._name), date_planned_finished = datetime.strptime(date_planned_finished_str, '%Y-%m-%d %H:%M:%S')
("bussiness_node_id", "=", bussiness_node.id) logging.info(f"Workorder: {item.production_id.name}, Current Time: {current_time_datetime}, "
]) f"Planned Finish: {date_planned_finished}")
message_queue_ids = self.env["jikimo.message.queue"].search([ twelve_hours_ago = current_time_datetime - timedelta(hours=12)
("message_template_id", "=", message_template.id), if current_time_datetime >= date_planned_finished:
("message_status", "=", "pending") item.delivery_warning = 'overdue'
]) elif twelve_hours_ago <= current_time_datetime <= date_planned_finished:
if not message_queue_ids: item.delivery_warning = 'warning'
continue business_node_ids = {
# for workorder in workorders: '装夹预调': self.env.ref('sf_message.bussiness_mrp_workorder_pre_overdue_warning').id,
# for 'CNC加工': self.env.ref('sf_message.bussiness_mrp_workorder_cnc_overdue_warning').id,
# message_template = self.env["jikimo.message.template"].search([ '解除装夹': self.env.ref('sf_message.bussiness_mrp_workorder_unclamp_overdue_warning').id,
# ("model", "=", self._name), '表面工艺': self.env.ref('sf_message.bussiness_mrp_workorder_surface_overdue_warning').id,
# ("bussiness_node_id", "=", self.env.ref('sf_message.bussiness_sale_order_overdue').id) }
# ]) message_templates = {key: self.env["jikimo.message.template"].sudo().search([
# sale_order_has = self.env['jikimo.message.queue'].search( ("model", "=", self._name),
# [('res_id', '=', workorder.id), ('message_status', '=', 'pending'), ("bussiness_node_id", "=", business_node_ids[key])
# ('message_template_id', '=', message_template.id)]) ]) for key in business_node_ids}
# if not sale_order_has: for item in orders:
# sale_order_overdue.add_queue('销售订单已逾期') if item.delivery_warning in ['overdue', 'warning']:
bussiness_node_id = business_node_ids.get(item.routing_type)
if bussiness_node_id and message_templates[item.routing_type]:
message_queue_ids = self.env["jikimo.message.queue"].sudo().search([
("message_template_id", "=", message_templates[item.routing_type].id),
("message_status", "=", "pending"),
("res_id", "=", item.id)
])
if not message_queue_ids:
overdue_message = '工单已逾期' if item.delivery_warning == 'overdue' else '工单逾期预警'
queue_method_name = f'add_queue'
# 构建参数列表其中包含item.routing_type和overdue_message
args = [f'{item.routing_type}{overdue_message}']
# 获取add_queue方法并调用它传入参数列表
getattr(item, queue_method_name)(*args)