diff --git a/sf_manufacturing/wizard/sale_order_cancel.py b/sf_manufacturing/wizard/sale_order_cancel.py index bd49ea9d..6e1d35ef 100644 --- a/sf_manufacturing/wizard/sale_order_cancel.py +++ b/sf_manufacturing/wizard/sale_order_cancel.py @@ -1,11 +1,14 @@ from odoo import models, fields, api + class SFSaleOrderCancelWizard(models.TransientModel): _name = 'sf.sale.order.cancel.wizard' _description = '销售订单取消向导' order_id = fields.Many2one('sale.order', string='销售订单') related_docs = fields.One2many('sf.sale.order.cancel.line', 'wizard_id', string='相关单据') + has_movement = fields.Boolean(compute='_compute_has_movement', string='是否有异动') + display_message = fields.Char(compute='_compute_display_message', string='显示消息') @api.model def default_get(self, fields_list): @@ -19,14 +22,33 @@ class SFSaleOrderCancelWizard(models.TransientModel): defaults['related_docs'] = wizard.related_docs.ids return defaults + @api.depends('related_docs.cancel_reason') + def _compute_has_movement(self): + for wizard in self: + wizard.has_movement = any(doc.cancel_reason for doc in wizard.related_docs) + + @api.depends('has_movement') + def _compute_display_message(self): + for wizard in self: + wizard.display_message = '部分或全部下游单据存在异动,无法取消,详情如下:' if wizard.has_movement else '确认所有下游单据全部取消?' + def action_confirm_cancel(self): self.ensure_one() - return self.order_id.action_cancel() + # 取消销售订单 + result = self.order_id.action_cancel() + # 取消关联的制造订单 + manufacturing_orders = self.env['mrp.production'].search([ + ('origin', '=', self.order_id.name) + ]) + if manufacturing_orders: + manufacturing_orders.action_cancel() + return result + class SFSaleOrderCancelLine(models.TransientModel): _name = 'sf.sale.order.cancel.line' _description = '销售订单取消行' - + wizard_id = fields.Many2one('sf.sale.order.cancel.wizard') sequence = fields.Integer('序号') category = fields.Char('大类') @@ -43,7 +65,7 @@ class SFSaleOrderCancelLine(models.TransientModel): def create_from_order(self, wizard_id, order): sequence = 1 lines = [] - + # 检查销售订单 if order.invoice_ids: for invoice in order.invoice_ids: @@ -61,7 +83,7 @@ class SFSaleOrderCancelLine(models.TransientModel): } lines.append(self.create(vals)) sequence += 1 - + # 检查交货单 if order.picking_ids: for picking in order.picking_ids: @@ -73,7 +95,8 @@ class SFSaleOrderCancelLine(models.TransientModel): 'operation_type': '调拨', 'doc_number': picking.name, 'product_name': picking.product_id.name if picking.product_id else '', - 'quantity': picking.product_qty if hasattr(picking, 'product_qty') else 0, + # 'quantity': picking.product_qty if hasattr(picking, 'product_qty') else 0, + 'quantity': sum(picking.move_ids.mapped('product_uom_qty') or [0]), 'doc_state': picking.state, 'cancel_reason': '已有异动' if picking.state not in ['draft', 'cancel', 'waiting'] else '' } @@ -100,7 +123,7 @@ class SFSaleOrderCancelLine(models.TransientModel): } lines.append(self.create(vals)) sequence += 1 - + # 检查制造订单 manufacturing_orders = self.env['mrp.production'].search([ ('origin', '=', order.name) @@ -113,6 +136,7 @@ class SFSaleOrderCancelLine(models.TransientModel): 'category': '制造', 'doc_name': '制造订单', 'doc_number': mo.name, + 'operation_type': '制造', 'product_name': mo.product_id.name, 'quantity': mo.product_qty, 'doc_state': mo.state, @@ -141,7 +165,7 @@ class SFSaleOrderCancelLine(models.TransientModel): } lines.append(self.create(vals)) sequence += 1 - + # 检查制造订单的领料单 if mo.picking_ids: for picking in mo.picking_ids: @@ -153,13 +177,13 @@ class SFSaleOrderCancelLine(models.TransientModel): 'doc_number': picking.name, 'operation_type': picking.picking_type_id.name, 'product_name': picking.product_id.name if picking.product_id else '', - 'quantity': picking.product_qty if hasattr(picking, 'product_qty') else 0, + 'quantity': sum(picking.move_ids.mapped('product_uom_qty') or [0]), 'doc_state': picking.state, 'cancel_reason': '已有异动' if picking.state not in ['draft', 'cancel', 'waiting'] else '' } lines.append(self.create(vals)) sequence += 1 - + # 检查制造订单的工单 if mo.workorder_ids: for workorder in mo.workorder_ids: @@ -200,7 +224,7 @@ class SFSaleOrderCancelLine(models.TransientModel): } lines.append(self.create(vals)) sequence += 1 - + # 检查组件的制造单 component_mos = self.env['mrp.production'].search([ ('origin', '=', mo.name), @@ -221,7 +245,7 @@ class SFSaleOrderCancelLine(models.TransientModel): } lines.append(self.create(vals)) sequence += 1 - + # 检查制造订单的质检单 quality_checks = self.env['quality.check'].search([ ('production_id', '=', mo.id) @@ -240,5 +264,5 @@ class SFSaleOrderCancelLine(models.TransientModel): } lines.append(self.create(vals)) sequence += 1 - - return lines \ No newline at end of file + + return lines diff --git a/sf_manufacturing/wizard/sale_order_cancel_views.xml b/sf_manufacturing/wizard/sale_order_cancel_views.xml index 0adf0081..9758a8a9 100644 --- a/sf_manufacturing/wizard/sale_order_cancel_views.xml +++ b/sf_manufacturing/wizard/sale_order_cancel_views.xml @@ -7,11 +7,10 @@