From 9c5ecdfe76718fe1469eaa59f1aab21b694edc8c Mon Sep 17 00:00:00 2001 From: liaodanlong Date: Thu, 6 Mar 2025 10:25:56 +0800 Subject: [PATCH 1/5] =?UTF-8?q?sf=20=E6=9D=90=E6=96=99=E5=9E=8B=E5=8F=B7?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E4=BF=AE=E6=94=B9=E5=AD=97=E6=AE=B5=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_base/models/common.py | 21 +++++++++++++++------ sf_base/views/common_view.xml | 8 ++++---- sf_mrs_connect/models/res_config_setting.py | 4 +++- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/sf_base/models/common.py b/sf_base/models/common.py index 4152c119..25c79f72 100644 --- a/sf_base/models/common.py +++ b/sf_base/models/common.py @@ -57,15 +57,24 @@ class MrsMaterialModel(models.Model): remark = fields.Text("备注") gain_way = fields.Selection( [("自加工", "自加工"), ("外协", "委外加工"), ("采购", "采购")], - default="", string="获取方式") + default="采购", string="获取方式") supplier_ids = fields.One2many('sf.supplier.sort', 'materials_model_id', string='供应商') active = fields.Boolean('有效', default=True) - @api.constrains("gain_way") - def _check_supplier_ids(self): - for item in self: - if item.gain_way in ('外协', '采购') and not item.supplier_ids: - raise UserError("请添加供应商") + @api.model + def create(self, vals): + res = super(MrsMaterialModel, self).create(vals) + if not vals.get('supplier_ids'): + supplier_id = self.env['res.partner'].search([('name', '=', '湖南傲派自动化设备有限公司')], limit=1) + res.supplier_ids = [(0, 0, {'materials_model_id': res.id, 'partner_id': supplier_id.id or False})] + return res + else: + return res + # @api.constrains("gain_way") + # def _check_supplier_ids(self): + # for item in self: + # if item.gain_way in ('外协', '采购') and not item.supplier_ids: + # raise UserError("请添加供应商") class MrsProductionProcessCategory(models.Model): diff --git a/sf_base/views/common_view.xml b/sf_base/views/common_view.xml index e49e25ba..74b8f177 100644 --- a/sf_base/views/common_view.xml +++ b/sf_base/views/common_view.xml @@ -262,13 +262,13 @@ - - - + + + @@ -297,7 +297,7 @@ sf.materials.model - + diff --git a/sf_mrs_connect/models/res_config_setting.py b/sf_mrs_connect/models/res_config_setting.py index eb853186..c387f765 100644 --- a/sf_mrs_connect/models/res_config_setting.py +++ b/sf_mrs_connect/models/res_config_setting.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Part of SmartGo. See LICENSE file for full copyright and licensing details. import logging +import traceback import requests @@ -90,7 +91,8 @@ class ResConfigSettings(models.TransientModel): _logger.info("同步坯料冗余完成") except Exception as e: - _logger.info("sf_all_sync error: %s" % e) + traceback_error = traceback.format_exc() + _logger.error("sf_all_sync error:%s" % traceback_error) raise ValidationError("数据错误导致同步失败,请联系管理员") @api.model From 826d5b1d584e006796d1350598f8f0b64defebca Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Thu, 6 Mar 2025 13:37:52 +0800 Subject: [PATCH 2/5] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E5=8D=95=E5=AD=90=E9=A1=B5=E7=AD=BE=E5=8F=AF=E5=85=A8=E9=87=8F?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=A4=84=E7=90=86=E6=96=B9=E6=B3=95=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/mrp_production.py | 2 +- sf_manufacturing/models/mrp_workorder.py | 44 +++++++++---------- sf_manufacturing/views/mrp_workorder_view.xml | 8 ---- sf_quality/__init__.py | 1 + sf_quality/models/__init__.py | 1 + sf_quality/models/quality.py | 3 +- sf_quality/models/stock.py | 21 +++++++++ sf_quality/wizard/__init__.py | 0 8 files changed, 48 insertions(+), 32 deletions(-) create mode 100644 sf_quality/models/stock.py create mode 100644 sf_quality/wizard/__init__.py diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index 4f9571c8..f8a22b28 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -365,7 +365,7 @@ class MrpProduction(models.Model): and production.schedule_state == '已排' and production.is_rework is False): production.state = 'pending_cam' if any((wo.test_results == '返工' and wo.state == 'done' and - (production.programming_state in ['已编程'] or 'PTD' in wo.individuation_page_list)) + (production.programming_state in ['已编程'] or(wo.individuation_page_list and 'PTD' in wo.individuation_page_list))) or (wo.is_rework is True and wo.state == 'done' and production.programming_state in ['编程中', '已编程']) for wo in production.workorder_ids) or production.is_rework is True: production.state = 'rework' diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 728123e0..c0c45ac8 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -1442,7 +1442,8 @@ class ResMrpWorkOrder(models.Model): record.production_id.process_state = '待加工' # 生成工件配送单 record.workpiece_delivery_ids = record._json_workpiece_delivery_list() - if record.routing_type == 'CNC加工' or 'PTD' in record.individuation_page_list: + if (record.routing_type == 'CNC加工' or + (record.individuation_page_list and 'PTD' in record.individuation_page_list)): if record.routing_type == 'CNC加工': record.process_state = '待解除装夹' # record.write({'process_state': '待加工'}) @@ -1675,32 +1676,31 @@ class ResMrpWorkOrder(models.Model): move_subcontract_workorder_ids = fields.One2many('stock.move', 'subcontract_workorder_id', string='组件') # ==============================配置化页签--个性化记录=================================== - routing_workcenter_id = fields.Many2one('mrp.routing.workcenter', compute='_compute_routing_workcenter_id', - store=True, string='工序作业') - individuation_page_ids = fields.Many2many('sf.work.individuation.page', string='个性化记录', store=True, - compute='_compute_individuation_page_ids') - individuation_page_list = fields.Char('个性化记录', default=None) + routing_work_center_id = fields.Many2one('mrp.routing.workcenter', compute='_compute_routing_work_center_id', + store=True, string='工序作业') + individuation_page_ids = fields.Many2many('sf.work.individuation.page', string='个性化记录', + related='routing_work_center_id.individuation_page_ids') + individuation_page_list = fields.Char('个性化记录', default='', compute='_compute_individuation_page_ids', store=True) @api.depends('name') - def _compute_routing_workcenter_id(self): + def _compute_routing_work_center_id(self): for mw in self: - routing_workcenter_id = self.env['mrp.routing.workcenter'].sudo().search( - [('name', '=', mw.name), ('routing_type', '=', mw.routing_type)]) - if routing_workcenter_id: - mw.routing_workcenter_id = routing_workcenter_id.id + if not mw.routing_work_center_id and mw.name: + routing_work_center_id = self.env['mrp.routing.workcenter'].sudo().search( + [('name', 'in', mw.name.split('-')), ('routing_type', '=', mw.routing_type)]) + if routing_work_center_id: + mw.routing_work_center_id = routing_work_center_id.id - @api.depends('routing_workcenter_id.individuation_page_ids') + @api.depends('individuation_page_ids') def _compute_individuation_page_ids(self): for mw in self: - if mw.routing_workcenter_id: - mw.individuation_page_ids = mw.routing_workcenter_id.individuation_page_ids.ids - # 初始化页签配置 - mw.individuation_page_list = None - # 根据工单对应的【作业_个性化记录】配置页签 - individuation_page_list = [item.code for item in mw.routing_workcenter_id.individuation_page_ids] - if individuation_page_list: - mw.individuation_page_list = list(set(individuation_page_list)) - + mw.individuation_page_list = '[]' + if mw.routing_work_center_id: + if mw.individuation_page_ids: + # 根据工单对应的【作业_个性化记录】配置页签 + individuation_page_list = [item.code for item in mw.individuation_page_ids] + if individuation_page_list: + mw.individuation_page_list = list(set(individuation_page_list)) # ============================================================================================= is_inspect = fields.Boolean('需送检', compute='_compute_is_inspect', store=True, default=False) @@ -2010,7 +2010,7 @@ class WorkPieceDelivery(models.Model): feeder_station_destination_id = fields.Many2one('sf.agv.site', '目的接驳站') task_delivery_time = fields.Datetime('任务下发时间') task_completion_time = fields.Datetime('任务完成时间') - + def _get_agv_route_type_selection(self): return self.env['sf.agv.task.route'].fields_get(['route_type'])['route_type']['selection'] type = fields.Selection(selection=_get_agv_route_type_selection, string='类型') diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml index 23c67c71..64c1c7a8 100644 --- a/sf_manufacturing/views/mrp_workorder_view.xml +++ b/sf_manufacturing/views/mrp_workorder_view.xml @@ -503,14 +503,6 @@ - - - - - - - - diff --git a/sf_quality/__init__.py b/sf_quality/__init__.py index 8134f974..52497701 100644 --- a/sf_quality/__init__.py +++ b/sf_quality/__init__.py @@ -2,3 +2,4 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from . import models +from . import wizard diff --git a/sf_quality/models/__init__.py b/sf_quality/models/__init__.py index 60081c7b..4fcdb16f 100644 --- a/sf_quality/models/__init__.py +++ b/sf_quality/models/__init__.py @@ -5,3 +5,4 @@ from . import custom_quality from . import quality from . import quality_cnc_test from . import mrp_workorder +# from . import stock diff --git a/sf_quality/models/quality.py b/sf_quality/models/quality.py index 498ec402..970292b7 100644 --- a/sf_quality/models/quality.py +++ b/sf_quality/models/quality.py @@ -93,7 +93,8 @@ class QualityCheck(models.Model): raise ValidationError('请填写【判定结果】里的信息') if self.test_results == '合格': raise ValidationError('请重新选择【判定结果】-【检测结果】') - if self.workorder_id.routing_type != 'CNC加工' and 'PTD' not in self.workorder_id.individuation_page_list: + if (self.workorder_id.routing_type != 'CNC加工' and self.workorder_id.individuation_page_list + and 'PTD' not in self.workorder_id.individuation_page_list): self.workorder_id.production_id.write({'detection_result_ids': [(0, 0, { 'rework_reason': self.reason, 'detailed_reason': self.detailed_reason, diff --git a/sf_quality/models/stock.py b/sf_quality/models/stock.py new file mode 100644 index 00000000..c2eefa68 --- /dev/null +++ b/sf_quality/models/stock.py @@ -0,0 +1,21 @@ +from odoo import api, models + + +class StockPicking(models.Model): + _inherit = 'stock.picking' + + def button_validate(self): + """ + 调拨单若关联了质量检查单,验证调拨单时,应校验是否有不合格品,若存在,应弹窗提示: + “警告:存在不合格产品XXXX n 件、YYYYY m件,继续调拨请点“确认”,否则请取消?” + """ + if self.quality_check_ids.filtered(lambda qc: qc.quality_state == 'fail'): + return { + 'type': 'ir.actions.act_window', + 'res_model': 'sf.functional.tool.assembly.order', + 'name': ' ', + 'view_mode': 'form', + 'target': 'new', + 'context': {'': True} + } + return super(StockPicking, self).button_validate() diff --git a/sf_quality/wizard/__init__.py b/sf_quality/wizard/__init__.py new file mode 100644 index 00000000..e69de29b From 674af1d11d34c5f2fe2415bf8c3bfa2b1f9d5191 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=B0=A7?= Date: Thu, 6 Mar 2025 16:02:19 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=88=90=E5=93=81=EF=BC=8C=E5=9D=AF?= =?UTF-8?q?=E6=96=99=E5=A4=8D=E5=88=B6=E6=A8=A1=E6=9D=BF=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E9=87=87=E8=B4=AD=E7=94=B3=E8=AF=B7=E5=AD=97=E6=AE=B5=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jikimo_purchase_request/__init__.py | 2 ++ jikimo_purchase_request/__manifest__.py | 22 +++++++++++++++++++ jikimo_purchase_request/models/__init__.py | 2 ++ .../models/product_template.py | 17 ++++++++++++++ 4 files changed, 43 insertions(+) create mode 100644 jikimo_purchase_request/__init__.py create mode 100644 jikimo_purchase_request/__manifest__.py create mode 100644 jikimo_purchase_request/models/__init__.py create mode 100644 jikimo_purchase_request/models/product_template.py diff --git a/jikimo_purchase_request/__init__.py b/jikimo_purchase_request/__init__.py new file mode 100644 index 00000000..a0fdc10f --- /dev/null +++ b/jikimo_purchase_request/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import models diff --git a/jikimo_purchase_request/__manifest__.py b/jikimo_purchase_request/__manifest__.py new file mode 100644 index 00000000..f2054556 --- /dev/null +++ b/jikimo_purchase_request/__manifest__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +{ + 'name': '机企猫 采购申请', + 'version': '16.0.1.0.0', + 'summary': """ 机企猫 采购申请 """, + 'author': '机企猫', + 'website': 'https://bfw.jikimo.com', + 'category': 'purchase', + 'depends': ['sf_manufacturing', 'purchase_request'], + 'data': [ + + ], + # 'assets': { + # 'web.assets_backend': [ + # 'jikimo_purchase_request/static/src/**/*' + # ], + # }, + 'application': True, + 'installable': True, + 'auto_install': False, + 'license': 'LGPL-3', +} diff --git a/jikimo_purchase_request/models/__init__.py b/jikimo_purchase_request/models/__init__.py new file mode 100644 index 00000000..1c32c33a --- /dev/null +++ b/jikimo_purchase_request/models/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import product_template \ No newline at end of file diff --git a/jikimo_purchase_request/models/product_template.py b/jikimo_purchase_request/models/product_template.py new file mode 100644 index 00000000..e6e96f10 --- /dev/null +++ b/jikimo_purchase_request/models/product_template.py @@ -0,0 +1,17 @@ +from odoo import models, fields + +class ProductTemplate(models.Model): + _inherit = 'product.template' + + purchase_request_id = fields.Many2one('purchase.request', string='采购申请') + + def no_bom_product_create(self, product_id, item, order_id, route_type, i, finish_product): + """ 创建坯料时,复制采购申请 """ + template_id = super(ProductTemplate, self).no_bom_product_create(product_id, item, order_id, route_type, i, finish_product) + template_id.purchase_request = product_id.purchase_request + return template_id + + def copy_template(self, product_template_id): + """ 复制成品模板时,复制采购申请 """ + super(ProductTemplate, self).copy_template(product_template_id) + self.purchase_request = product_template_id.purchase_request \ No newline at end of file From dc550d1be5d03bffb657cea3c09a2bd4f084562c Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Mon, 10 Mar 2025 15:24:24 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=AE=8C=E6=88=90=20=20=E8=B0=83=E6=8B=A8?= =?UTF-8?q?=E5=8D=95=E5=8F=96=E6=B6=88=E5=90=8E=EF=BC=8C=E5=85=B3=E8=81=94?= =?UTF-8?q?=E5=8F=96=E6=B6=88=E8=B4=A8=E9=87=8F=E6=A3=80=E6=9F=A5=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- quality_control/models/stock_picking.py | 23 ++++++++++++++++++- quality_control/security/ir.model.access.csv | 1 + .../wizard/quality_check_wizard.py | 15 ++++++++++++ .../wizard/quality_check_wizard_views.xml | 17 ++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/quality_control/models/stock_picking.py b/quality_control/models/stock_picking.py index f6d2b07c..0f92edde 100644 --- a/quality_control/models/stock_picking.py +++ b/quality_control/models/stock_picking.py @@ -81,8 +81,29 @@ class StockPicking(models.Model): return quality_pickings def action_cancel(self): + """ + 调拨单取消后,关联取消质量检查单 + """ + context = self.env.context + if not context.get('cancel_check_picking') and self.sudo().mapped('check_ids').filtered( + lambda x: x.quality_state in ['pass', 'fail']): + self.env.cr.rollback() + return { + 'type': 'ir.actions.act_window', + 'res_model': 'picking.check.cancel.wizard', + 'name': '取消质检单', + 'view_mode': 'form', + 'target': 'new', + 'context': { + 'default_picking_id': self.id, + 'cancel_check_picking': True} + } + elif self.check_ids.filtered(lambda x: x.quality_state != 'cancel'): + self.sudo().mapped('check_ids').filtered(lambda x: x.quality_state != 'cancel').write({ + 'quality_state': 'cancel' + }) res = super(StockPicking, self).action_cancel() - self.sudo().mapped('check_ids').filtered(lambda x: x.quality_state == 'none').unlink() + # self.sudo().mapped('check_ids').filtered(lambda x: x.quality_state == 'none').unlink() return res def action_open_quality_check_picking(self): diff --git a/quality_control/security/ir.model.access.csv b/quality_control/security/ir.model.access.csv index d700da50..9c0c5529 100644 --- a/quality_control/security/ir.model.access.csv +++ b/quality_control/security/ir.model.access.csv @@ -1,2 +1,3 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_quality_check_wizard,access.quality_check_wizard,model_quality_check_wizard,quality.group_quality_user,1,1,1,0 +access_picking_check_cancel_wizard,access.picking_check_cancel_wizard,model_picking_check_cancel_wizard,quality.group_quality_user,1,1,1,0 diff --git a/quality_control/wizard/quality_check_wizard.py b/quality_control/wizard/quality_check_wizard.py index 300faf1d..1317236d 100644 --- a/quality_control/wizard/quality_check_wizard.py +++ b/quality_control/wizard/quality_check_wizard.py @@ -112,3 +112,18 @@ class QualityCheckWizard(models.TransientModel): default_current_check_id=self.current_check_id.id, ) return action + + +class PickingCheckCancelWizard(models.TransientModel): + _name = 'picking.check.cancel.wizard' + _description = 'picking check cancel wizard' + + picking_id = fields.Many2one('stock.picking', 'stock picking') + + def confirm_picking_check(self): + self.picking_id.action_cancel() + return {'type': 'ir.actions.act_window_close'} + + def cancel_picking_check(self): + # 这里是取消后的逻辑 + return {'type': 'ir.actions.act_window_close'} diff --git a/quality_control/wizard/quality_check_wizard_views.xml b/quality_control/wizard/quality_check_wizard_views.xml index 1b87847e..b8b9db2b 100644 --- a/quality_control/wizard/quality_check_wizard_views.xml +++ b/quality_control/wizard/quality_check_wizard_views.xml @@ -118,4 +118,21 @@ {} new + + + + + picking.check.cancel.wizard + picking.check.cancel.wizard + +
+
质量检查单已完成,继续取消吗?
+
注意:关联质量检查单也将被取消。
+
+
+
+
+
From 34456c3506e54f8f1fff6f2d10088ba8052583e6 Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Mon, 10 Mar 2025 16:54:15 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=AE=8C=E6=88=90=20=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E8=B0=83=E6=8B=A8=E5=8D=95=E6=97=B6=EF=BC=8C=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E4=B8=8D=E5=90=88=E6=A0=BC=E4=BA=A7=E5=93=81=EF=BC=8C=E5=A6=82?= =?UTF-8?q?=E6=9E=9C=E5=AD=98=E5=9C=A8=E4=B8=8D=E5=90=88=E6=A0=BC=E8=B4=A8?= =?UTF-8?q?=E6=A3=80=E5=8D=95=E5=88=99=E7=BB=99=E4=B8=8E=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_quality/__manifest__.py | 3 ++- sf_quality/models/__init__.py | 2 +- sf_quality/models/stock.py | 26 ++++++++++++++++--- sf_quality/security/ir.model.access.csv | 2 +- sf_quality/wizard/__init__.py | 1 + sf_quality/wizard/check_picking_wizard.py | 17 ++++++++++++ .../wizard/check_picking_wizard_view.xml | 15 +++++++++++ 7 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 sf_quality/wizard/check_picking_wizard.py create mode 100644 sf_quality/wizard/check_picking_wizard_view.xml diff --git a/sf_quality/__manifest__.py b/sf_quality/__manifest__.py index 9c2c3138..e44a6f68 100644 --- a/sf_quality/__manifest__.py +++ b/sf_quality/__manifest__.py @@ -19,7 +19,8 @@ 'views/view.xml', 'views/quality_cnc_test_view.xml', 'views/mrp_workorder.xml', - 'views/quality_check_view.xml' + 'views/quality_check_view.xml', + 'wizard/check_picking_wizard_view.xml', ], 'assets': { diff --git a/sf_quality/models/__init__.py b/sf_quality/models/__init__.py index 4fcdb16f..17ad5fab 100644 --- a/sf_quality/models/__init__.py +++ b/sf_quality/models/__init__.py @@ -5,4 +5,4 @@ from . import custom_quality from . import quality from . import quality_cnc_test from . import mrp_workorder -# from . import stock +from . import stock diff --git a/sf_quality/models/stock.py b/sf_quality/models/stock.py index c2eefa68..c9788a51 100644 --- a/sf_quality/models/stock.py +++ b/sf_quality/models/stock.py @@ -9,13 +9,31 @@ class StockPicking(models.Model): 调拨单若关联了质量检查单,验证调拨单时,应校验是否有不合格品,若存在,应弹窗提示: “警告:存在不合格产品XXXX n 件、YYYYY m件,继续调拨请点“确认”,否则请取消?” """ - if self.quality_check_ids.filtered(lambda qc: qc.quality_state == 'fail'): + context = self.env.context + if not context.get('again_validate') and self.quality_check_ids.filtered(lambda qc: qc.quality_state == 'fail'): + # 回滚事务,为二次确认/取消做准备 + self.env.cr.rollback() + quality_check_ids = self.quality_check_ids.filtered(lambda qc: qc.quality_state == 'fail') + product_list = list(set([quality_check_id.product_id for quality_check_id in quality_check_ids])) + fail_check_text = '' + for product_id in product_list: + check_ids = quality_check_ids.filtered(lambda qc: qc.product_id == product_id) + number = sum(check_ids.mapped('qty_line')) + if number != 0: + fail_check_text = (f'{fail_check_text}、{product_id.name} {number}件' + if fail_check_text != '' else f'{product_id.name} {number}件') + else: + fail_check_text = (f'{fail_check_text}、{product_id.name}' + if fail_check_text != '' else f'{product_id.name}') return { 'type': 'ir.actions.act_window', - 'res_model': 'sf.functional.tool.assembly.order', - 'name': ' ', + 'res_model': 'picking.validate.check.wizard', + 'name': '质检不合格提示', 'view_mode': 'form', 'target': 'new', - 'context': {'': True} + 'context': { + 'default_picking_id': self.id, + 'default_fail_check_text': f'警告:存在不合格产品{fail_check_text},继续调拨请点“确认”,否则请取消?', + 'again_validate': True} } return super(StockPicking, self).button_validate() diff --git a/sf_quality/security/ir.model.access.csv b/sf_quality/security/ir.model.access.csv index 907c115b..fa1ec3fa 100644 --- a/sf_quality/security/ir.model.access.csv +++ b/sf_quality/security/ir.model.access.csv @@ -73,6 +73,6 @@ access_quality_cnc_test_group_quality_director,quality_cnc_test_group_quality_di access_quality_cnc_test_group_sf_equipment_user,quality_cnc_test_group_sf_equipment_user,model_quality_cnc_test,sf_base.group_sf_equipment_user,1,1,0,0 - +access_picking_validate_check_wizard,access.picking_validate_check_wizard,model_picking_validate_check_wizard,quality.group_quality_user,1,1,1,0 diff --git a/sf_quality/wizard/__init__.py b/sf_quality/wizard/__init__.py index e69de29b..2c90d07b 100644 --- a/sf_quality/wizard/__init__.py +++ b/sf_quality/wizard/__init__.py @@ -0,0 +1 @@ +from . import check_picking_wizard diff --git a/sf_quality/wizard/check_picking_wizard.py b/sf_quality/wizard/check_picking_wizard.py new file mode 100644 index 00000000..1cb25756 --- /dev/null +++ b/sf_quality/wizard/check_picking_wizard.py @@ -0,0 +1,17 @@ +from odoo import api, models,fields + + +class PickingValidateCheckWizard(models.TransientModel): + _name = 'picking.validate.check.wizard' + _description = '调拨质检不合格二次验证' + + picking_id = fields.Many2one('stock.picking', '调拨单') + fail_check_text = fields.Text('提示信息') + + def confirm_picking_validate_check(self): + self.picking_id.button_validate() + return {'type': 'ir.actions.act_window_close'} + + def cancel_picking_validate_check(self): + # 这里是取消后的逻辑 + return {'type': 'ir.actions.act_window_close'} diff --git a/sf_quality/wizard/check_picking_wizard_view.xml b/sf_quality/wizard/check_picking_wizard_view.xml new file mode 100644 index 00000000..702b2578 --- /dev/null +++ b/sf_quality/wizard/check_picking_wizard_view.xml @@ -0,0 +1,15 @@ + + + picking.validate.check.wizard + picking.validate.check.wizard + +
+ + + +
+
+
\ No newline at end of file