优化取消接单功能
This commit is contained in:
@@ -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
|
||||
|
||||
return lines
|
||||
|
||||
Reference in New Issue
Block a user