diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 8470530c..2149023f 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -20,6 +20,7 @@ from odoo.addons.sf_mrs_connect.models.ftp_operate import FtpController class ResMrpWorkOrder(models.Model): _inherit = 'mrp.workorder' _order = 'sequence asc' + _description = '工单' product_tmpl_name = fields.Char('坯料产品名称', related='production_bom_id.bom_line_ids.product_id.name') diff --git a/sf_manufacturing/models/quality_check.py b/sf_manufacturing/models/quality_check.py index 291e598e..990dce23 100644 --- a/sf_manufacturing/models/quality_check.py +++ b/sf_manufacturing/models/quality_check.py @@ -3,5 +3,6 @@ from odoo import fields, models, api class QualityCheck(models.Model): _inherit = "quality.check" + _description = "质量检查" is_inspect = fields.Boolean('需送检') diff --git a/sf_manufacturing/security/ir.model.access.csv b/sf_manufacturing/security/ir.model.access.csv index 6661c9be..982506a5 100644 --- a/sf_manufacturing/security/ir.model.access.csv +++ b/sf_manufacturing/security/ir.model.access.csv @@ -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_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_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_line,sf_sale_order_cancel_line,model_sf_sale_order_cancel_line,sf_base.group_sf_order_user,1,0,1,0 \ No newline at end of file +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,1 \ No newline at end of file diff --git a/sf_manufacturing/wizard/sale_order_cancel.py b/sf_manufacturing/wizard/sale_order_cancel.py index 1f7cf306..5c24b9c8 100644 --- a/sf_manufacturing/wizard/sale_order_cancel.py +++ b/sf_manufacturing/wizard/sale_order_cancel.py @@ -1,4 +1,5 @@ from odoo import models, fields, api +from odoo.exceptions import UserError class SFSaleOrderCancelWizard(models.TransientModel): @@ -47,6 +48,23 @@ class SFSaleOrderCancelWizard(models.TransientModel): def action_confirm_cancel(self): 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([ ('origin', '=', self.order_id.name) @@ -165,6 +183,20 @@ class SFSaleOrderCancelLine(models.TransientModel): 'assigned': '就绪' } + module_name_dict = { + 'purchase': '采购', + 'quality': '质检', + 'mrp': '制造', + 'stock': '库存', + 'account': '会计', + 'hr': '员工', + 'project': '项目', + 'crm': '销售', + 'point_of_sale': '销售', + 'website': '网站', + 'sf_plan': '计划', + } + # 检查销售订单 if order.invoice_ids: a = 0 @@ -195,9 +227,11 @@ class SFSaleOrderCancelLine(models.TransientModel): vals = { 'wizard_id': wizard_id, 'sequence': sequence, - 'category': '库存', - 'doc_name': '交货单', - 'operation_type': '调拨', + # 'category': '库存', + 'category': module_name_dict[picking._original_module], + # 'doc_name': '交货单', + 'doc_name': picking._description, + 'operation_type': picking.picking_type_id.name, 'doc_number': picking.name, 'line_number': b, 'product_name': f'[{move.product_id.default_code}] {move.product_id.name}' if move else '', @@ -242,8 +276,8 @@ class SFSaleOrderCancelLine(models.TransientModel): vals = { 'wizard_id': wizard_id, 'sequence': sequence, - 'category': '质量', - 'doc_name': '质检单', + 'category': module_name_dict[quality_check._original_module], + 'doc_name': quality_check._description, 'operation_type': '', 'doc_number': f'{quality_check.name}-{quality_check.title}', 'line_number': 1, @@ -266,8 +300,8 @@ class SFSaleOrderCancelLine(models.TransientModel): vals = { 'wizard_id': wizard_id, 'sequence': sequence, - 'category': '制造', - 'doc_name': '组件制造单', + 'category': module_name_dict[comp_mo._original_module], + 'doc_name': comp_mo._description, 'operation_type': '', 'doc_number': comp_mo.name, 'line_number': h, @@ -287,8 +321,8 @@ class SFSaleOrderCancelLine(models.TransientModel): vals = { 'wizard_id': wizard_id, 'sequence': sequence, - 'category': '子制造调拨', - 'doc_name': '库存移动', + 'category': module_name_dict[pinking_id._original_module], + 'doc_name': pinking_id._description, 'doc_number': f'{comp_mo.name}-{pinking_id.name}', 'line_number': y, 'operation_type': pinking_id.picking_type_id.name, @@ -312,8 +346,8 @@ class SFSaleOrderCancelLine(models.TransientModel): vals = { 'wizard_id': wizard_id, 'sequence': sequence, - 'category': '采购', - 'doc_name': '询价单', + 'category': module_name_dict[po._original_module], + 'doc_name': po._description, 'operation_type': '', 'doc_number': po.name, 'line_number': c, @@ -338,8 +372,8 @@ class SFSaleOrderCancelLine(models.TransientModel): vals = { 'wizard_id': wizard_id, 'sequence': sequence, - 'category': '库存', - 'doc_name': '库存移动', + 'category': module_name_dict[pkd._original_module], + 'doc_name': pkd._description, 'doc_number': pkd.name, 'line_number': x3, 'operation_type': pkd.picking_type_id.name, @@ -360,8 +394,8 @@ class SFSaleOrderCancelLine(models.TransientModel): vals = { 'wizard_id': wizard_id, 'sequence': sequence, - 'category': '库存', - 'doc_name': '库存移动', + 'category': module_name_dict[child_pkd._original_module], + 'doc_name': child_pkd._description, 'doc_number': child_pkd.name, 'line_number': x4, 'operation_type': child_pkd.picking_type_id.name, @@ -387,8 +421,8 @@ class SFSaleOrderCancelLine(models.TransientModel): vals = { 'wizard_id': wizard_id, 'sequence': sequence, - 'category': '制造', - 'doc_name': '制造订单', + 'category': module_name_dict[mo._original_module], + 'doc_name': mo._description, 'doc_number': mo.name, 'operation_type': '', 'line_number': d, @@ -412,8 +446,8 @@ class SFSaleOrderCancelLine(models.TransientModel): vals = { 'wizard_id': wizard_id, 'sequence': sequence, - 'category': '制造', - 'doc_name': '询价单', + 'category': module_name_dict[po._original_module], + 'doc_name': po._description, 'doc_number': po.name, 'line_number': e, 'operation_type': '', @@ -438,8 +472,8 @@ class SFSaleOrderCancelLine(models.TransientModel): vals = { 'wizard_id': wizard_id, 'sequence': sequence, - 'category': '坯料收货', - 'doc_name': '库存移动', + 'category': module_name_dict[pkd._original_module], + 'doc_name': pkd._description, 'doc_number': pkd.name, 'line_number': x1, 'operation_type': pkd.picking_type_id.name, @@ -460,8 +494,8 @@ class SFSaleOrderCancelLine(models.TransientModel): vals = { 'wizard_id': wizard_id, 'sequence': sequence, - 'category': '坯料外协', - 'doc_name': '库存移动', + 'category': module_name_dict[child_pkd._original_module], + 'doc_name': child_pkd._description, 'doc_number': child_pkd.name, 'line_number': x2, 'operation_type': child_pkd.picking_type_id.name, @@ -487,8 +521,8 @@ class SFSaleOrderCancelLine(models.TransientModel): vals = { 'wizard_id': wizard_id, 'sequence': sequence, - 'category': '制造', - 'doc_name': '库存移动', + 'category': module_name_dict[picking._original_module], + 'doc_name': picking._description, 'doc_number': picking.name, 'line_number': f, 'operation_type': picking.picking_type_id.name, @@ -509,8 +543,8 @@ class SFSaleOrderCancelLine(models.TransientModel): vals = { 'wizard_id': wizard_id, 'sequence': sequence, - 'category': '制造', - 'doc_name': '工单', + 'category': module_name_dict[workorder._original_module], + 'doc_name': workorder._description, 'doc_number': f'{mo.name}-{workorder.processing_panel}-{workorder.name}' if workorder.processing_panel else f'{mo.name}-{workorder.name}', 'line_number': g, 'operation_type': '', @@ -532,8 +566,8 @@ class SFSaleOrderCancelLine(models.TransientModel): vals = { 'wizard_id': wizard_id, 'sequence': sequence, - 'category': '工艺外协', - 'doc_name': '库存移动', + 'category': module_name_dict[pkd._original_module], + 'doc_name': pkd._description, 'doc_number': f'{mo.name}-{workorder.name}-{pkd.name}', 'line_number': z, 'operation_type': pkd.picking_type_id.name,