yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -254,6 +254,7 @@
    ErrorCode PRO_ROUTE_ENABLE_NO_KEY_PROCESS = new ErrorCode(1_040_501_003, "工艺路线必须要有关键工序");
    ErrorCode PRO_ROUTE_ENABLE_PRODUCT_NO_BOM = new ErrorCode(1_040_501_004, "产品 {} 未配置工序的 BOM 消耗");
    ErrorCode PRO_ROUTE_IS_ENABLE = new ErrorCode(1_040_501_005, "工艺路线已启用,不允许操作");
    ErrorCode PRO_ROUTE_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_040_501_006, "导入工艺路线数据不能为空");
    // ========== MES 生产管理-工艺路线工序(1-040-501-100) ==========
    ErrorCode PRO_ROUTE_PROCESS_NOT_EXISTS = new ErrorCode(1_040_501_100, "工艺路线工序不存在");
    ErrorCode PRO_ROUTE_PROCESS_SORT_DUPLICATE = new ErrorCode(1_040_501_101, "序号已存在");
@@ -262,6 +263,13 @@
    // ========== MES 生产管理-工艺路线产品(1-040-501-200) ==========
    ErrorCode PRO_ROUTE_PRODUCT_NOT_EXISTS = new ErrorCode(1_040_501_200, "工艺路线产品不存在");
    ErrorCode PRO_ROUTE_PRODUCT_ITEM_DUPLICATE = new ErrorCode(1_040_501_201, "此产品已配置了工艺路线");
    ErrorCode PRO_ROUTE_PRODUCT_ITEM_TYPE_INVALID = new ErrorCode(1_040_501_202, "物料【{}】的主数据类型及MES分类均非成品/半成品,请先核对物料类型");
    ErrorCode PRO_ROUTE_PRODUCT_WAREHOUSE_REQUIRED = new ErrorCode(1_040_501_203, "产品【{}】未配置报工入库仓库、库区和库位");
    ErrorCode PRO_ROUTE_PROCESS_OUTPUT_REQUIRED = new ErrorCode(1_040_501_204, "工序【{}】未配置产出产品");
    ErrorCode PRO_ROUTE_PROCESS_OUTPUT_NOT_BOUND = new ErrorCode(1_040_501_205, "工序产出产品【{}】未绑定到当前工艺路线");
    ErrorCode PRO_ROUTE_MIDDLE_OUTPUT_INVALID = new ErrorCode(1_040_501_206, "中间工序【{}】只能产出半成品分类产品");
    ErrorCode PRO_ROUTE_LAST_OUTPUT_INVALID = new ErrorCode(1_040_501_207, "末道工序【{}】只能产出成品分类产品,且必须包含全部绑定成品");
    ErrorCode PRO_ROUTE_LAST_OUTPUT_ATTRIBUTION_REQUIRED = new ErrorCode(1_040_501_208, "末道工序【{}】的成品产出必须按产品归属配置,每个成品归属到自身,不能使用“通用”");
    // ========== MES 生产管理-工艺路线产品BOM(1-040-501-300) ==========
    ErrorCode PRO_ROUTE_PRODUCT_BOM_NOT_EXISTS = new ErrorCode(1_040_501_300, "工艺路线产品 BOM 不存在");
    ErrorCode PRO_ROUTE_PRODUCT_BOM_DUPLICATE = new ErrorCode(1_040_501_301, "当前 BOM 物料在此工序已经配置过");
@@ -274,6 +282,8 @@
    ErrorCode PRO_WORK_ORDER_HAS_CHILDREN = new ErrorCode(1_040_502_004, "存在子工单,无法删除");
    ErrorCode PRO_WORK_ORDER_PRODUCT_MISMATCH = new ErrorCode(1_040_502_005, "当前产品物料与生产工单产品不一致");
    ErrorCode PRO_WORK_ORDER_SCHEDULE_QUANTITY_EXCEED = new ErrorCode(1_040_502_006, "排产数量超限:工单{}(计划{},已排产{},本次排产{})");
    ErrorCode PRO_WORK_ORDER_RETENTION_SAMPLE_REQUIRED = new ErrorCode(1_040_502_007, "生产工单【{}】尚未登记留样记录,无法完成;请先在【质量管理 → 留样管理】中新增该工单的留样记录");
    ErrorCode PRO_WORK_ORDER_NO_PRODUCED_QUANTITY = new ErrorCode(1_040_502_008, "生产工单【{}】已生产数量为 0,无法完成;请先在最后一道工序完成报工并审批通过,待工单已生产数量大于 0 后再完成工单");
    ErrorCode PRO_WORK_ORDER_BOM_NOT_EXISTS = new ErrorCode(1_040_502_100, "生产工单BOM不存在");
    // ========== MES 生产管理-生产工单工序(1-040-502-300) ==========
@@ -452,6 +462,21 @@
    ErrorCode QC_NCR_NOT_PENDING_REVIEW = new ErrorCode(1_040_609_002, "只有待评审状态的不合格品处理单才可操作");
    ErrorCode QC_NCR_NOT_REVIEWED = new ErrorCode(1_040_609_003, "只有已评审状态的不合格品处理单才可执行处置");
    ErrorCode QC_NCR_NOT_DISPOSED = new ErrorCode(1_040_609_004, "只有已处置状态的不合格品处理单才可关闭");
    // ========== MES 质量管理-留样管理(1-040-610-000) ==========
    ErrorCode QC_RETENTION_SAMPLE_NOT_EXISTS = new ErrorCode(1_040_610_000, "留样记录不存在");
    ErrorCode QC_RETENTION_SAMPLE_CODE_DUPLICATE = new ErrorCode(1_040_610_001, "留样编号【{}】已存在,请刷新页面后重试");
    ErrorCode QC_RETENTION_SAMPLE_WORK_ORDER_NOT_EXISTS = new ErrorCode(1_040_610_002, "生产工单不存在,请重新选择工单");
    ErrorCode QC_RETENTION_SAMPLE_WORK_ORDER_DUPLICATE = new ErrorCode(1_040_610_003, "生产工单【{}】已登记留样记录(留样编号【{}】),每张工单只能登记一条留样;如需调整请修改原留样记录");
    ErrorCode QC_RETENTION_SAMPLE_WORK_ORDER_CANCELED = new ErrorCode(1_040_610_004, "生产工单【{}】已取消,不能登记留样");
    ErrorCode QC_RETENTION_SAMPLE_QUANTITY_INVALID = new ErrorCode(1_040_610_005, "留样数量必须大于 0,请填写实际留样件数");
    ErrorCode QC_RETENTION_SAMPLE_SALE_ORDER_REQUIRED = new ErrorCode(1_040_610_006, "生产工单【{}】来源销售订单【{}】,请选择对应的销售订单后再登记留样");
    ErrorCode QC_RETENTION_SAMPLE_SALE_ORDER_MISMATCH = new ErrorCode(1_040_610_007, "所选销售订单与工单不一致:工单【{}】对应销售订单为【{}】,提交的销售订单为【{}】;请重新选择该工单对应的销售订单");
    ErrorCode QC_RETENTION_SAMPLE_SALE_ORDER_NOT_EXISTS = new ErrorCode(1_040_610_008, "所选销售订单不存在({}),请重新选择");
    ErrorCode QC_RETENTION_SAMPLE_WORK_ORDER_CHANGED = new ErrorCode(1_040_610_009, "留样记录不允许修改所属生产工单;如需更换工单,请删除本条记录后重新登记");
    ErrorCode QC_RETENTION_SAMPLE_FINISHED_DELETE = new ErrorCode(1_040_610_010, "生产工单【{}】已完成,留样记录不允许删除;如需调整请联系管理员");
    ErrorCode QC_RETENTION_SAMPLE_SALE_ORDER_AMBIGUOUS = new ErrorCode(1_040_610_011, "生产工单【{}】由多张销售订单合并下发({}),请选择本次留样对应的销售订单");
    ErrorCode QC_RETENTION_SAMPLE_MPS_SALE_ORDER_NOT_EXISTS = new ErrorCode(1_040_610_012, "生产工单【{}】由 MPS 下发,但 MPS 记录的销售订单【{}】(ID={})在销售订单中不存在,无法登记留样;请先修正该 MPS 的销售订单信息后再登记");
    // ========== MES 仓库管理-仓库(1-040-700-000) ==========
    ErrorCode WM_WAREHOUSE_NOT_EXISTS = new ErrorCode(1_040_700_000, "仓库不存在");
@@ -797,6 +822,12 @@
    ErrorCode WM_PACKAGE_CHILD_NOT_FINISHED = new ErrorCode(1_040_740_007, "子箱必须是已完成状态才能添加");
    ErrorCode WM_PACKAGE_HAS_CHILDREN = new ErrorCode(1_040_740_008, "存在子箱,不允许删除");
    ErrorCode WM_PACKAGE_LINE_NOT_EXISTS = new ErrorCode(1_040_740_100, "装箱明细不存在");
    ErrorCode WM_PACKAGE_LINE_ITEM_NOT_FINISHED = new ErrorCode(1_040_740_101, "装箱物料【{}】所属分类不是成品分类,不能装箱;请选择成品分类下的物料");
    ErrorCode WM_PACKAGE_LINE_BOX_QUANTITY_NOT_CONFIGURED = new ErrorCode(1_040_740_102, "装箱物料【{}】未配置每箱数量,无法自动计算箱数;请先在物料档案中维护每箱数量");
    ErrorCode WM_PACKAGE_LINE_WORK_ORDER_PRODUCT_MISMATCH = new ErrorCode(1_040_740_103, "装箱物料【{}】与生产工单【{}】的产品【{}】不一致,请选择该工单对应的产品装箱");
    ErrorCode WM_PACKAGE_LINE_WORK_ORDER_QUANTITY_EXCEED = new ErrorCode(1_040_740_104, "生产工单【{}】装箱数量超限:工单数量 {},已装箱/已计划 {},本次装箱 {};请调整装箱数量");
    ErrorCode WM_PACKAGE_LINE_ASSEMBLY_PROCESS_NOT_FOUND = new ErrorCode(1_040_740_105, "生产工单【{}】未配置【组装】工序,不能装箱;请先在该工单的「工单工序」中添加名称为「组装」(编码 PRO-ASSEMBLY)的工序,并完成报工");
    ErrorCode WM_PACKAGE_LINE_ASSEMBLY_NOT_COMPLETED = new ErrorCode(1_040_740_106, "生产工单【{}】组装工序报工合格数量不足:已完成组装合格 {},本次装箱后累计装箱 {}(已装箱/已计划 {} + 本次 {});请先完成组装工序报工,或调小本次装箱数量");
    // ========== MES 产品设计-设计项目(1-040-800-000) ==========
    ErrorCode PD_PROJECT_NOT_EXISTS = new ErrorCode(1_040_800_000, "设计项目不存在");