Accept Merge Request #1887: (release/release_2.9 -> develop)

Merge Request: 取消销售订单时的下游单据清单【大类、单据名称、作业类型】显示错误

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/1887?initial=true
This commit is contained in:
马广威
2025-02-28 16:06:04 +08:00
committed by Coding
4 changed files with 67 additions and 31 deletions

View File

@@ -20,6 +20,7 @@ from odoo.addons.sf_mrs_connect.models.ftp_operate import FtpController
class ResMrpWorkOrder(models.Model): class ResMrpWorkOrder(models.Model):
_inherit = 'mrp.workorder' _inherit = 'mrp.workorder'
_order = 'sequence asc' _order = 'sequence asc'
_description = '工单'
product_tmpl_name = fields.Char('坯料产品名称', related='production_bom_id.bom_line_ids.product_id.name') product_tmpl_name = fields.Char('坯料产品名称', related='production_bom_id.bom_line_ids.product_id.name')

View File

@@ -3,5 +3,6 @@ from odoo import fields, models, api
class QualityCheck(models.Model): class QualityCheck(models.Model):
_inherit = "quality.check" _inherit = "quality.check"
_description = "质量检查"
is_inspect = fields.Boolean('需送检') is_inspect = fields.Boolean('需送检')

View File

@@ -192,5 +192,5 @@ access_sf_programming_reason,sf_programming_reason,model_sf_programming_reason,b
access_sf_programming_record,sf_programming_record,model_sf_programming_record,base.group_user,1,1,1,0 access_sf_programming_record,sf_programming_record,model_sf_programming_record,base.group_user,1,1,1,0
access_sf_work_individuation_page,sf_work_individuation_page,model_sf_work_individuation_page,sf_base.group_sf_mrp_user,1,1,1,0 access_sf_work_individuation_page,sf_work_individuation_page,model_sf_work_individuation_page,sf_base.group_sf_mrp_user,1,1,1,0
access_sf_work_individuation_page_group_plan_dispatch,sf_work_individuation_page_group_plan_dispatch,model_sf_work_individuation_page,sf_base.group_plan_dispatch,1,1,0,0 access_sf_work_individuation_page_group_plan_dispatch,sf_work_individuation_page_group_plan_dispatch,model_sf_work_individuation_page,sf_base.group_plan_dispatch,1,1,0,0
access_sf_sale_order_cancel_wizard,sf_sale_order_cancel_wizard,model_sf_sale_order_cancel_wizard,sf_base.group_sf_order_user,1,0,1,0 access_sf_sale_order_cancel_wizard,sf_sale_order_cancel_wizard,model_sf_sale_order_cancel_wizard,sf_base.group_sf_order_user,1,1,1,0
access_sf_sale_order_cancel_line,sf_sale_order_cancel_line,model_sf_sale_order_cancel_line,sf_base.group_sf_order_user,1,0,1,0 access_sf_sale_order_cancel_line,sf_sale_order_cancel_line,model_sf_sale_order_cancel_line,sf_base.group_sf_order_user,1,0,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
192
193
194
195
196

View File

@@ -1,4 +1,5 @@
from odoo import models, fields, api from odoo import models, fields, api
from odoo.exceptions import UserError
class SFSaleOrderCancelWizard(models.TransientModel): class SFSaleOrderCancelWizard(models.TransientModel):
@@ -47,6 +48,23 @@ class SFSaleOrderCancelWizard(models.TransientModel):
def action_confirm_cancel(self): def action_confirm_cancel(self):
self.ensure_one() self.ensure_one()
# 删除现有关联单据行
self.related_docs.unlink()
# 重新生成最新关联单据行
self.env['sf.sale.order.cancel.line'].create_from_order(self.id, self.order_id)
# 强制重新计算校验字段
self._compute_has_movement()
self._compute_display_message()
# 检查是否存在异动
if self.has_movement:
raise UserError(
"存在下游单据异动,无法取消订单!\n"
"请关闭向导重新进入,查看最新状态再操作!"
)
# 取消销售订单关联的采购单 # 取消销售订单关联的采购单
purchase_orders = self.env['purchase.order'].search([ purchase_orders = self.env['purchase.order'].search([
('origin', '=', self.order_id.name) ('origin', '=', self.order_id.name)
@@ -165,6 +183,20 @@ class SFSaleOrderCancelLine(models.TransientModel):
'assigned': '就绪' 'assigned': '就绪'
} }
module_name_dict = {
'purchase': '采购',
'quality': '质检',
'mrp': '制造',
'stock': '库存',
'account': '会计',
'hr': '员工',
'project': '项目',
'crm': '销售',
'point_of_sale': '销售',
'website': '网站',
'sf_plan': '计划',
}
# 检查销售订单 # 检查销售订单
if order.invoice_ids: if order.invoice_ids:
a = 0 a = 0
@@ -195,9 +227,11 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = { vals = {
'wizard_id': wizard_id, 'wizard_id': wizard_id,
'sequence': sequence, 'sequence': sequence,
'category': '库存', # 'category': '库存',
'doc_name': '交货单', 'category': module_name_dict[picking._original_module],
'operation_type': '调拨', # 'doc_name': '交货单',
'doc_name': picking._description,
'operation_type': picking.picking_type_id.name,
'doc_number': picking.name, 'doc_number': picking.name,
'line_number': b, 'line_number': b,
'product_name': f'[{move.product_id.default_code}] {move.product_id.name}' if move else '', 'product_name': f'[{move.product_id.default_code}] {move.product_id.name}' if move else '',
@@ -242,8 +276,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = { vals = {
'wizard_id': wizard_id, 'wizard_id': wizard_id,
'sequence': sequence, 'sequence': sequence,
'category': '质量', 'category': module_name_dict[quality_check._original_module],
'doc_name': '质检单', 'doc_name': quality_check._description,
'operation_type': '', 'operation_type': '',
'doc_number': f'{quality_check.name}-{quality_check.title}', 'doc_number': f'{quality_check.name}-{quality_check.title}',
'line_number': 1, 'line_number': 1,
@@ -266,8 +300,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = { vals = {
'wizard_id': wizard_id, 'wizard_id': wizard_id,
'sequence': sequence, 'sequence': sequence,
'category': '制造', 'category': module_name_dict[comp_mo._original_module],
'doc_name': '组件制造单', 'doc_name': comp_mo._description,
'operation_type': '', 'operation_type': '',
'doc_number': comp_mo.name, 'doc_number': comp_mo.name,
'line_number': h, 'line_number': h,
@@ -287,8 +321,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = { vals = {
'wizard_id': wizard_id, 'wizard_id': wizard_id,
'sequence': sequence, 'sequence': sequence,
'category': '子制造调拨', 'category': module_name_dict[pinking_id._original_module],
'doc_name': '库存移动', 'doc_name': pinking_id._description,
'doc_number': f'{comp_mo.name}-{pinking_id.name}', 'doc_number': f'{comp_mo.name}-{pinking_id.name}',
'line_number': y, 'line_number': y,
'operation_type': pinking_id.picking_type_id.name, 'operation_type': pinking_id.picking_type_id.name,
@@ -312,8 +346,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = { vals = {
'wizard_id': wizard_id, 'wizard_id': wizard_id,
'sequence': sequence, 'sequence': sequence,
'category': '采购', 'category': module_name_dict[po._original_module],
'doc_name': '询价单', 'doc_name': po._description,
'operation_type': '', 'operation_type': '',
'doc_number': po.name, 'doc_number': po.name,
'line_number': c, 'line_number': c,
@@ -338,8 +372,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = { vals = {
'wizard_id': wizard_id, 'wizard_id': wizard_id,
'sequence': sequence, 'sequence': sequence,
'category': '库存', 'category': module_name_dict[pkd._original_module],
'doc_name': '库存移动', 'doc_name': pkd._description,
'doc_number': pkd.name, 'doc_number': pkd.name,
'line_number': x3, 'line_number': x3,
'operation_type': pkd.picking_type_id.name, 'operation_type': pkd.picking_type_id.name,
@@ -360,8 +394,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = { vals = {
'wizard_id': wizard_id, 'wizard_id': wizard_id,
'sequence': sequence, 'sequence': sequence,
'category': '库存', 'category': module_name_dict[child_pkd._original_module],
'doc_name': '库存移动', 'doc_name': child_pkd._description,
'doc_number': child_pkd.name, 'doc_number': child_pkd.name,
'line_number': x4, 'line_number': x4,
'operation_type': child_pkd.picking_type_id.name, 'operation_type': child_pkd.picking_type_id.name,
@@ -387,8 +421,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = { vals = {
'wizard_id': wizard_id, 'wizard_id': wizard_id,
'sequence': sequence, 'sequence': sequence,
'category': '制造', 'category': module_name_dict[mo._original_module],
'doc_name': '制造订单', 'doc_name': mo._description,
'doc_number': mo.name, 'doc_number': mo.name,
'operation_type': '', 'operation_type': '',
'line_number': d, 'line_number': d,
@@ -412,8 +446,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = { vals = {
'wizard_id': wizard_id, 'wizard_id': wizard_id,
'sequence': sequence, 'sequence': sequence,
'category': '制造', 'category': module_name_dict[po._original_module],
'doc_name': '询价单', 'doc_name': po._description,
'doc_number': po.name, 'doc_number': po.name,
'line_number': e, 'line_number': e,
'operation_type': '', 'operation_type': '',
@@ -438,8 +472,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = { vals = {
'wizard_id': wizard_id, 'wizard_id': wizard_id,
'sequence': sequence, 'sequence': sequence,
'category': '坯料收货', 'category': module_name_dict[pkd._original_module],
'doc_name': '库存移动', 'doc_name': pkd._description,
'doc_number': pkd.name, 'doc_number': pkd.name,
'line_number': x1, 'line_number': x1,
'operation_type': pkd.picking_type_id.name, 'operation_type': pkd.picking_type_id.name,
@@ -460,8 +494,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = { vals = {
'wizard_id': wizard_id, 'wizard_id': wizard_id,
'sequence': sequence, 'sequence': sequence,
'category': '坯料外协', 'category': module_name_dict[child_pkd._original_module],
'doc_name': '库存移动', 'doc_name': child_pkd._description,
'doc_number': child_pkd.name, 'doc_number': child_pkd.name,
'line_number': x2, 'line_number': x2,
'operation_type': child_pkd.picking_type_id.name, 'operation_type': child_pkd.picking_type_id.name,
@@ -487,8 +521,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = { vals = {
'wizard_id': wizard_id, 'wizard_id': wizard_id,
'sequence': sequence, 'sequence': sequence,
'category': '制造', 'category': module_name_dict[picking._original_module],
'doc_name': '库存移动', 'doc_name': picking._description,
'doc_number': picking.name, 'doc_number': picking.name,
'line_number': f, 'line_number': f,
'operation_type': picking.picking_type_id.name, 'operation_type': picking.picking_type_id.name,
@@ -509,8 +543,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = { vals = {
'wizard_id': wizard_id, 'wizard_id': wizard_id,
'sequence': sequence, 'sequence': sequence,
'category': '制造', 'category': module_name_dict[workorder._original_module],
'doc_name': '工单', 'doc_name': workorder._description,
'doc_number': f'{mo.name}-{workorder.processing_panel}-{workorder.name}' if workorder.processing_panel else f'{mo.name}-{workorder.name}', 'doc_number': f'{mo.name}-{workorder.processing_panel}-{workorder.name}' if workorder.processing_panel else f'{mo.name}-{workorder.name}',
'line_number': g, 'line_number': g,
'operation_type': '', 'operation_type': '',
@@ -532,8 +566,8 @@ class SFSaleOrderCancelLine(models.TransientModel):
vals = { vals = {
'wizard_id': wizard_id, 'wizard_id': wizard_id,
'sequence': sequence, 'sequence': sequence,
'category': '工艺外协', 'category': module_name_dict[pkd._original_module],
'doc_name': '库存移动', 'doc_name': pkd._description,
'doc_number': f'{mo.name}-{workorder.name}-{pkd.name}', 'doc_number': f'{mo.name}-{workorder.name}-{pkd.name}',
'line_number': z, 'line_number': z,
'operation_type': pkd.picking_type_id.name, 'operation_type': pkd.picking_type_id.name,