取消接单需求进行中

This commit is contained in:
mgw
2025-02-13 17:41:18 +08:00
parent d3cfec2f35
commit 3ac096e9a7
7 changed files with 176 additions and 0 deletions

View File

@@ -5,3 +5,4 @@ from . import production_technology_wizard
from . import production_technology_re_adjust_wizard
from . import mrp_workorder_batch_replan_wizard
from . import sf_programming_reason
from . import sale_order_cancel

View File

@@ -0,0 +1,103 @@
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='相关单据')
@api.model
def default_get(self, fields_list):
defaults = super().default_get(fields_list)
if self._context.get('active_id'):
order = self.env['sale.order'].browse(self._context.get('active_id'))
defaults['order_id'] = order.id
# 创建向导时自动创建关联单据行
wizard = self.create(defaults)
self.env['sf.sale.order.cancel.line'].create_from_order(wizard.id, order)
defaults['related_docs'] = wizard.related_docs.ids
return defaults
def action_confirm_cancel(self):
self.ensure_one()
return self.order_id.action_cancel()
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('大类')
doc_name = fields.Char('单据名称')
operation_type = fields.Char('作业类型')
doc_number = fields.Char('单据编号')
line_number = fields.Char('行号')
product_name = fields.Char('产品名称')
quantity = fields.Float('数量')
doc_state = fields.Char('单据状态')
cancel_reason = fields.Char('禁止取消原因')
@api.model
def create_from_order(self, wizard_id, order):
sequence = 1
lines = []
# 检查销售订单
if order.invoice_ids:
for invoice in order.invoice_ids:
vals = {
'wizard_id': wizard_id,
'sequence': sequence,
'category': '销售',
'doc_name': '销售订单',
'operation_type': '销售',
'doc_number': invoice.name,
'product_name': invoice.product_id.name,
'quantity': invoice.quantity,
'doc_state': invoice.state,
'cancel_reason': '已有异动' if invoice.state != 'draft' else ''
}
lines.append(self.create(vals))
sequence += 1
# 检查交货单
if order.picking_ids:
for picking in order.picking_ids:
vals = {
'wizard_id': wizard_id,
'sequence': sequence,
'category': '库存',
'doc_name': '交货单',
'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,
'doc_state': picking.state,
'cancel_reason': '已有异动' if picking.state not in ['draft', 'cancel', 'waiting'] else ''
}
lines.append(self.create(vals))
sequence += 1
# 检查制造订单
manufacturing_orders = self.env['mrp.production'].search([
('origin', '=', order.name)
])
for mo in manufacturing_orders:
vals = {
'wizard_id': wizard_id,
'sequence': sequence,
'category': '制造',
'doc_name': '制造订单',
'operation_type': '制造',
'doc_number': mo.name,
'product_name': mo.product_id.name,
'quantity': mo.product_qty,
'doc_state': mo.state,
'cancel_reason': '已有异动' if mo.state not in ['draft', 'cancel'] else ''
}
lines.append(self.create(vals))
sequence += 1
return lines

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_sf_sale_order_cancel_wizard" model="ir.ui.view">
<field name="name">sf.sale.order.cancel.wizard.form</field>
<field name="model">sf.sale.order.cancel.wizard</field>
<field name="arch" type="xml">
<form string="下游单据清单">
<group>
<field name="order_id" invisible="1"/>
</group>
<div class="alert alert-warning" role="alert">
<span>弹窗描述:</span><br/>
<span>1) 若无异动,描述为: 确认所有下游单据全部取消?</span><br/>
<span>2) 若有异动,描述为: 部分或全部下游单据存在异动,无法取消,详情如下:</span>
</div>
<field name="related_docs">
<tree string="下游单据" create="false" edit="false" delete="false">
<field name="sequence" string="序号"/>
<field name="category" string="大类"/>
<field name="doc_name" string="单据名称"/>
<field name="operation_type" string="作业类型"/>
<field name="doc_number" string="单据编号"/>
<field name="line_number" string="行号"/>
<field name="product_name" string="产品名称"/>
<field name="quantity" string="数量"/>
<field name="doc_state" string="单据状态"/>
<field name="cancel_reason" string="禁止取消原因"/>
</tree>
</field>
<footer>
<button name="action_confirm_cancel"
string="确认取消"
type="object"
class="btn-primary"/>
<button string="关闭"
class="btn-secondary"
special="cancel"/>
</footer>
</form>
</field>
</record>
</odoo>