From c8f1676de91e4defd2fdc30f2369a1d99858c9ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=B0=A7?= Date: Tue, 1 Jul 2025 17:55:07 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E7=94=B3=E8=AF=B7=E5=88=9B=E5=BB=BA=E7=9A=84=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E5=8D=95=E5=8F=96=E6=B6=88=E5=90=8E=E5=AF=BC=E8=87=B4=E8=B0=83?= =?UTF-8?q?=E6=8B=A8=E5=8D=95=E4=B8=8D=E8=83=BD=E5=B0=B1=E7=BB=AA=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/purchase_order.py | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/jikimo_purchase_request/models/purchase_order.py b/jikimo_purchase_request/models/purchase_order.py index 95f81e9f..5284be7a 100644 --- a/jikimo_purchase_request/models/purchase_order.py +++ b/jikimo_purchase_request/models/purchase_order.py @@ -34,9 +34,43 @@ class PurchaseOrder(models.Model): 将取消的采购订单关联的库存移动撤销 """ move_ids = self.order_line.move_dest_ids.filtered(lambda move: move.state != 'done' and not move.scrapped) + move_line_ids = {} + move_states = { move_id.id: move_id.state for move_id in move_ids } + move_orig_ids = move_ids.move_orig_ids + move_dest_ids = move_ids.move_dest_ids + for move_line_id in move_ids.move_line_ids: + move_line_ids[move_line_id.move_id.id] = move_line_id.copy() + move_line_ids[move_line_id.move_id.id].move_id = False + move_line_ids[move_line_id.move_id.id].reserved_uom_qty = move_line_id.reserved_uom_qty + res =super(PurchaseOrder, self).button_cancel() + if move_ids.mapped('created_purchase_request_line_id'): + # 如果采购订单关联了采购申请,则将库存移动的状态设置为等待 move_ids.write({'state': 'waiting', 'is_done': False}) + move_ids.write({'move_orig_ids': [(4, move_orig_id.id, 0) for move_orig_id in move_orig_ids]}) + move_ids.write({'move_dest_ids': [(4, move_dest_id.id, 0) for move_dest_id in move_dest_ids]}) + for move_id in move_ids: + move_id.write({'procure_method': 'make_to_order', 'state': move_states[move_id.id]}) + move_id.write({'move_line_ids': [(4, move_line_ids[move_id.id].id, 0)]}) + move_id._action_assign() + origin_move_id = move_id + # 追回原mto的库存移动 + link_move_ids = self.env['stock.move'].search([ + ('origin','=',move_id.origin), + ('procure_method','=','make_to_stock'), + ('product_id','=',move_id.product_id.id), + ('id', '!=', move_id.id) + ]) + while link_move_ids: + link_move_id = link_move_ids.filtered(lambda move: move.location_id == origin_move_id.location_dest_id) + link_move_id.write({ + 'move_orig_ids': [(4, origin_move_id.id, 0)] if origin_move_id != link_move_id else [], + 'procure_method': 'make_to_order', + }) + origin_move_id = link_move_id + link_move_ids -= link_move_id + return res def write(self, vals): From 4615f1576f2fee9d17c14214b0abc9decb16459b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=B0=A7?= Date: Wed, 2 Jul 2025 17:31:43 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E7=94=B3=E8=AF=B7=E5=88=9B=E5=BB=BA=E7=9A=84=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E5=8D=95=E5=8F=96=E6=B6=88=E5=90=8E=E5=AF=BC=E8=87=B4=E5=90=8E?= =?UTF-8?q?=E7=BB=AD=E5=8D=95=E6=8D=AE=E6=97=A0=E6=B3=95=E5=B0=B1=E7=BB=AA?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/purchase_order.py | 50 +++++-------------- 1 file changed, 12 insertions(+), 38 deletions(-) diff --git a/jikimo_purchase_request/models/purchase_order.py b/jikimo_purchase_request/models/purchase_order.py index 5284be7a..0ad804b9 100644 --- a/jikimo_purchase_request/models/purchase_order.py +++ b/jikimo_purchase_request/models/purchase_order.py @@ -31,46 +31,20 @@ class PurchaseOrder(models.Model): def button_cancel(self): """ - 将取消的采购订单关联的库存移动撤销 + 1. 先将采购订单行与目标库存移动断开链接,避免采购单取消后,调拨单被调整为mts的问题 + 2. 取消采购订单 + 3. 将采购订单行与目标库存移动重新建立链接 """ - move_ids = self.order_line.move_dest_ids.filtered(lambda move: move.state != 'done' and not move.scrapped) - move_line_ids = {} - move_states = { move_id.id: move_id.state for move_id in move_ids } - move_orig_ids = move_ids.move_orig_ids - move_dest_ids = move_ids.move_dest_ids - for move_line_id in move_ids.move_line_ids: - move_line_ids[move_line_id.move_id.id] = move_line_id.copy() - move_line_ids[move_line_id.move_id.id].move_id = False - move_line_ids[move_line_id.move_id.id].reserved_uom_qty = move_line_id.reserved_uom_qty - + created_purchase_request_line_ids = {} + if self.order_line.move_dest_ids.created_purchase_request_line_id: + move_ids = self.order_line.move_dest_ids.filtered(lambda move: move.state != 'done' and not move.scrapped) + created_purchase_request_line_ids = {move.id: move.created_purchase_request_line_id for move in move_ids} + self.order_line.write({'move_dest_ids': [(5, 0, 0)]}) res =super(PurchaseOrder, self).button_cancel() - - if move_ids.mapped('created_purchase_request_line_id'): - # 如果采购订单关联了采购申请,则将库存移动的状态设置为等待 - move_ids.write({'state': 'waiting', 'is_done': False}) - move_ids.write({'move_orig_ids': [(4, move_orig_id.id, 0) for move_orig_id in move_orig_ids]}) - move_ids.write({'move_dest_ids': [(4, move_dest_id.id, 0) for move_dest_id in move_dest_ids]}) - for move_id in move_ids: - move_id.write({'procure_method': 'make_to_order', 'state': move_states[move_id.id]}) - move_id.write({'move_line_ids': [(4, move_line_ids[move_id.id].id, 0)]}) - move_id._action_assign() - origin_move_id = move_id - # 追回原mto的库存移动 - link_move_ids = self.env['stock.move'].search([ - ('origin','=',move_id.origin), - ('procure_method','=','make_to_stock'), - ('product_id','=',move_id.product_id.id), - ('id', '!=', move_id.id) - ]) - while link_move_ids: - link_move_id = link_move_ids.filtered(lambda move: move.location_id == origin_move_id.location_dest_id) - link_move_id.write({ - 'move_orig_ids': [(4, origin_move_id.id, 0)] if origin_move_id != link_move_id else [], - 'procure_method': 'make_to_order', - }) - origin_move_id = link_move_id - link_move_ids -= link_move_id - + for move_id, created_purchase_request_line_id in created_purchase_request_line_ids.items(): + self.env['stock.move'].browse(move_id).created_purchase_request_line_id = created_purchase_request_line_id + # if move_ids.mapped('created_purchase_request_line_id'): + # move_ids.write({'state': 'waiting', 'is_done': False}) return res def write(self, vals): From 10c6f59f528a0427b5ab403399278309d2ffec11 Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Fri, 4 Jul 2025 13:48:16 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=A4=84=E7=90=86=20=20=E6=88=90=E5=93=81?= =?UTF-8?q?=E5=87=BA=E5=BA=93=E5=8D=95=E5=88=9B=E5=BB=BA=E6=AC=A0=E5=8D=95?= =?UTF-8?q?=E5=90=8E=E7=94=9F=E6=88=90=E7=9A=84=E8=B0=83=E6=8B=A8=E5=8D=95?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B5=E4=B8=AD=E8=B4=A8=E9=87=8F=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E6=99=BA=E8=83=BD=E6=8C=89=E9=92=AE=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E4=B8=BA=E9=80=9A=E8=BF=87=E7=8A=B6=E6=80=81?= =?UTF-8?q?=20=20=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_quality/__manifest__.py | 1 + sf_quality/models/stock.py | 7 ++++++- sf_quality/views/stock_picking.xml | 28 ++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 sf_quality/views/stock_picking.xml diff --git a/sf_quality/__manifest__.py b/sf_quality/__manifest__.py index 00cbe496..8b99ce80 100644 --- a/sf_quality/__manifest__.py +++ b/sf_quality/__manifest__.py @@ -22,6 +22,7 @@ 'data/report_actions.xml', 'views/view.xml', 'views/quality_cnc_test_view.xml', + 'views/stock_picking.xml', 'views/mrp_workorder.xml', 'views/quality_check_view.xml', 'views/quality_company.xml', diff --git a/sf_quality/models/stock.py b/sf_quality/models/stock.py index 7b70b77a..8efb1b79 100644 --- a/sf_quality/models/stock.py +++ b/sf_quality/models/stock.py @@ -1,24 +1,29 @@ import logging -from odoo import api, models +from odoo import api, models, fields from odoo.exceptions import ValidationError, UserError class StockPicking(models.Model): _inherit = 'stock.picking' + whether_show_quality_check = fields.Boolean('是否显示质量检测按钮', default=True) + def _compute_check(self): super()._compute_check() for picking in self: picking_to_quality = picking.get_picking_to_quality() if not picking_to_quality: picking.quality_check_todo = False + picking.whether_show_quality_check = False break else: + picking.whether_show_quality_check = True need_quality_line = picking.get_need_quality_line(picking_to_quality) if not need_quality_line or all(not line.get('need_done_check_ids') for line in need_quality_line): picking.quality_check_todo = False + def check_quality(self): self.ensure_one() # checkable_products = self.mapped('move_line_ids').mapped('product_id') diff --git a/sf_quality/views/stock_picking.xml b/sf_quality/views/stock_picking.xml new file mode 100644 index 00000000..857436d8 --- /dev/null +++ b/sf_quality/views/stock_picking.xml @@ -0,0 +1,28 @@ + + + + stock.picking.view.form.sf.quality + stock.picking + + + + + + + {'invisible': ['|', '|','|', ('check_ids', '=', []), ('quality_check_fail', '=', + True), ('quality_check_todo', '!=', True), ('whether_show_quality_check', '!=', True)]} + + + + {'invisible': ['|', '|','|', ('check_ids', '=', []), ('quality_check_fail', '=', + True), ('quality_check_todo', '=', True), ('whether_show_quality_check', '!=', True)]} + + + + {'invisible': ['|', '|',('check_ids', '=', []), ('quality_check_fail', '!=', + True), ('whether_show_quality_check', '!=', True)]} + + + + + \ No newline at end of file