diff --git a/jikimo_frontend/static/src/js/custom_form_status_indicator.js b/jikimo_frontend/static/src/js/custom_form_status_indicator.js index 79702f84..4992872a 100644 --- a/jikimo_frontend/static/src/js/custom_form_status_indicator.js +++ b/jikimo_frontend/static/src/js/custom_form_status_indicator.js @@ -139,7 +139,7 @@ patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', { owl.onMounted(() => { this.activeElement = this.uiService.activeElement; this.setRequired() - // this.listherHeaderBodyNum() + this.listherHeaderBodyNum() }) return this._super(...arguments); }, diff --git a/jikimo_purchase_tier_validation/__manifest__.py b/jikimo_purchase_tier_validation/__manifest__.py index 18a63e80..91dcbb49 100644 --- a/jikimo_purchase_tier_validation/__manifest__.py +++ b/jikimo_purchase_tier_validation/__manifest__.py @@ -20,7 +20,7 @@ 'version': '0.1', # any module necessary for this one to work correctly - 'depends': ['purchase', 'base_tier_validation', 'documents', 'purchase_request', 'account'], + 'depends': ['purchase', 'base_tier_validation', 'documents', 'purchase_request', 'account', 'purchase_order_approved'], # always loaded 'data': [ diff --git a/jikimo_purchase_tier_validation/models/models.py b/jikimo_purchase_tier_validation/models/models.py index e5a80f7b..d90ed257 100644 --- a/jikimo_purchase_tier_validation/models/models.py +++ b/jikimo_purchase_tier_validation/models/models.py @@ -23,6 +23,10 @@ class jikimo_purchase_tier_validation(models.Model): for record in self: if record.need_validation and record.validation_status != 'validated': raise ValidationError(_('此操作需要至少对一条记录进行审批。\n请发起审批申请。')) + if record.state in ['to approve']: + raise ValidationError(_('请先完成审批。')) + if record.state == 'approved': + record.state = 'purchase' return super().button_confirm() # def button_confirm(self): @@ -83,7 +87,17 @@ class jikimo_purchase_tier_validation(models.Model): def _validate_tier(self, tiers=False): res = super(jikimo_purchase_tier_validation, self)._validate_tier(tiers) - self.state = 'approved' + tier_reviews = tiers or self.review_ids + + # 检查是否所有审批都已通过 + all_approved = all( + tier_review.status == 'approved' + for tier_review in tier_reviews + ) + + if all_approved and tier_reviews: # 确保有审批记录 + self.state = 'approved' + return res def _rejected_tier(self, tiers=False): diff --git a/jikimo_purchase_tier_validation/views/views.xml b/jikimo_purchase_tier_validation/views/views.xml index ca82e729..b651e914 100644 --- a/jikimo_purchase_tier_validation/views/views.xml +++ b/jikimo_purchase_tier_validation/views/views.xml @@ -1,11 +1,23 @@ + + tier_validation_view_approved_purchase_order_form_inherit + purchase.order + + + + + + + tier_validation_view_purchase_order_form_inherit purchase.order + + diff --git a/quality_control/views/quality_views.xml b/quality_control/views/quality_views.xml index 790f8cef..c40d42b2 100644 --- a/quality_control/views/quality_views.xml +++ b/quality_control/views/quality_views.xml @@ -519,6 +519,7 @@ Quality Checks quality.check tree,kanban,form,pivot,graph + {'is_web_request': True}

No quality check found diff --git a/sf_message/__manifest__.py b/sf_message/__manifest__.py index 6796a50b..42f1ad13 100644 --- a/sf_message/__manifest__.py +++ b/sf_message/__manifest__.py @@ -12,7 +12,7 @@ 'category': 'sf', 'website': 'https://www.sf.jikimo.com', 'depends': ['sale', 'purchase', 'sf_plan', 'jikimo_message_notify', 'stock', 'sf_quality', 'mrp', - 'sf_manufacturing','product'], + 'sf_manufacturing', 'product', 'quality'], 'data': [ 'data/bussiness_node.xml', 'data/cron_data.xml', @@ -20,6 +20,7 @@ 'security/ir.model.access.csv', 'views/mrp_workorder_views.xml', 'views/purchase_order_view.xml', + 'views/stock_picking_view.xml', ], 'test': [ ], diff --git a/sf_message/data/bussiness_node.xml b/sf_message/data/bussiness_node.xml index e7c3b0ba..b429d766 100644 --- a/sf_message/data/bussiness_node.xml +++ b/sf_message/data/bussiness_node.xml @@ -150,5 +150,10 @@ 采购单已逾期提醒 purchase.order + + + 待质检提醒 + product.product + \ No newline at end of file diff --git a/sf_message/data/template_data.xml b/sf_message/data/template_data.xml index 52b226e3..11f05a3c 100644 --- a/sf_message/data/template_data.xml +++ b/sf_message/data/template_data.xml @@ -389,5 +389,17 @@ 事项:[共有{{num}}个采购订单已逾期]({{url}}) + + + 待质检提醒 + + product.product + + markdown + normal + ### 待质检提醒: +单号:产品[{{name}}]({{url}}) +事项:有{{num}}个质检单需要处理。 + \ No newline at end of file diff --git a/sf_message/models/__init__.py b/sf_message/models/__init__.py index 8c215042..18c6b873 100644 --- a/sf_message/models/__init__.py +++ b/sf_message/models/__init__.py @@ -13,3 +13,4 @@ from . import sf_message_maintenance_logs from . import sf_message_mrp_production_wizard from . import sf_message_mrp_production_adjust_wizard from . import sf_message_product +from . import sf_message_quality_check diff --git a/sf_message/models/sf_message_mrp_production.py b/sf_message/models/sf_message_mrp_production.py index b0689b81..9fd21e9e 100644 --- a/sf_message/models/sf_message_mrp_production.py +++ b/sf_message/models/sf_message_mrp_production.py @@ -63,8 +63,9 @@ class SFMessageMrpProduction(models.Model): [('origin', 'in', mrp_production_names), ('state', '=', 'assigned')]) if stock_picking_num >= 1: url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') - action_id = self.env.ref('stock.action_picking_tree_ready').id - url_with_id = f"{url}/web#view_type=list&action={action_id}" + action_id = self.env.ref('sf_message.action_picking_outsourced_tree_ready').id + menu_id = self.env.ref('stock.menu_stock_root').id + url_with_id = f"{url}/web#view_type=list&action={action_id}&menu_id={menu_id}" content = content.replace('{{name}}', mrp_production.product_id.name).replace('{{url}}', url_with_id).replace( '{{num}}', str(stock_picking_num)) diff --git a/sf_message/models/sf_message_product.py b/sf_message/models/sf_message_product.py index 85ac4ce2..0f2cfd7e 100644 --- a/sf_message/models/sf_message_product.py +++ b/sf_message/models/sf_message_product.py @@ -3,7 +3,7 @@ from odoo import models, fields, api, _ from urllib.parse import urlencode -class SFMessagePlan(models.Model): +class SFMessageProduct(models.Model): _name = 'product.product' _inherit = ['product.product', 'jikimo.message.dispatch'] @@ -28,6 +28,18 @@ class SFMessagePlan(models.Model): '{{number}}', str(production_num)).replace( '{{request_url}}', url) contents.append(content) + if message_queue_id.message_template_id.name == '待质检提醒': + content = message_queue_id.message_template_id.content + product_product = self.env['product.product'].sudo().search([('id', '=', int(message_queue_id.res_id))]) + quality_check_num = self.env['quality.check'].sudo().search_count( + [('product_id', '=', product_product.id), ('quality_state', '=', 'none')]) + if quality_check_num >= 1: + url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + action_id = self.env.ref('quality_control.quality_check_action_report').id + url_with_id = f"{url}/web#view_type=list&action={action_id}" + content = content.replace('{{name}}', product_product.name).replace('{{url}}', url_with_id).replace( + '{{num}}', str(quality_check_num)) + contents.append(content) return contents, message_queue_ids def get_request_url(self): diff --git a/sf_message/models/sf_message_quality_check.py b/sf_message/models/sf_message_quality_check.py new file mode 100644 index 00000000..15713791 --- /dev/null +++ b/sf_message/models/sf_message_quality_check.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +import logging +from odoo import models, fields, api, _ + + +class SFMessageQualityCheck(models.Model): + _name = 'quality.check' + _inherit = ['quality.check', 'jikimo.message.dispatch'] + + @api.model_create_multi + def create(self, vals_list): + result = super().create(vals_list) + try: + # 判断是否为web页面创建请求 + is_web_request = self.env.context.get('is_web_request', False) + if not is_web_request: + for obj in result: + jikimo_message_queue = self.get_message_queue(obj.product_id.id) + if not jikimo_message_queue: + obj.product_id.add_queue('待质检提醒') + except Exception as e: + logging.info('add_queue待质检提醒 error:%s' % e) + return result + + def get_message_queue(self, res_id): + business_node_id = self.env.ref('sf_message.bussiness_quality_check').id + message_template = self.env["jikimo.message.template"].sudo().search([ + ("name", "=", '待质检提醒'), + ("bussiness_node_id", "=", business_node_id) + ], limit=1) + jikimo_message_queue = self.env['jikimo.message.queue'].sudo().search( + [('res_id', '=', res_id), ("message_status", "in", ("pending", "sent")), + ('message_template_id', '=', message_template.id)]) + return jikimo_message_queue diff --git a/sf_message/models/sf_message_sale.py b/sf_message/models/sf_message_sale.py index 4e8679f8..f4712f67 100644 --- a/sf_message/models/sf_message_sale.py +++ b/sf_message/models/sf_message_sale.py @@ -32,7 +32,7 @@ class SFMessageSale(models.Model): 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 == 'standard': + if purchase_order_id.purchase_type == 'outside': purchase_order_id.add_queue('外购订单采购单提醒') except Exception as e: logging.info('add_queue error:%s' % e) diff --git a/sf_message/views/stock_picking_view.xml b/sf_message/views/stock_picking_view.xml new file mode 100644 index 00000000..9087aa18 --- /dev/null +++ b/sf_message/views/stock_picking_view.xml @@ -0,0 +1,37 @@ + + + + + stock.picking.search + stock.picking + + + + + + + + + + + + 待办 + stock.picking + ir.actions.act_window + tree,kanban,form,calendar + + {'search_default_outsourced': 1,'contact_display': 'partner_address', + 'search_default_available': 1} + + + +

+ 没有仓库调拨。 让我们创建一个! +

+

+ 移动允许您将产品从一个位置移动到另外一个位置。 +

+
+
+
\ No newline at end of file