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 1/2] =?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 2/2] =?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