liu
2026-10-19 31f9b2e3e6a1cffb83c838f1db1d6251b708f983
fix(mes): 电力作业计划生成工单兼容编码规则缺失

- 生成工单时优先使用 PRO_WORK_ORDER_CODE 编码规则,规则不存在时降级为时间戳编码,避免被“编码规则不存在”阻断
- 新增 PRO_WORK_ORDER_CODE 编码规则幂等初始化 SQL

Co-Authored-By: Claude <noreply@anthropic.com>
已添加1个文件
已修改1个文件
71 ■■■■■ 文件已修改
sql/mes_pro_work_order_code_rule_init.sql 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/maintenanceplan/MesProMaintenancePlanServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/mes_pro_work_order_code_rule_init.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
-- ============================================================
-- ç”Ÿäº§å·¥å•编码规则(PRO_WORK_ORDER_CODE)初始化
--
-- èƒŒæ™¯ï¼š
--   ç”µåŠ›ä½œä¸šè®¡åˆ’â€œç”Ÿæˆå·¥å•â€ä¾èµ–ç¼–ç è§„åˆ™ PRO_WORK_ORDER_CODE,
--   è‹¥åº“中缺少该规则,会抛出“编码规则不存在”。
--
-- è¯´æ˜Žï¼š
--   1. è„šæœ¬å¯é‡å¤æ‰§è¡Œï¼ˆå·²å­˜åœ¨åˆ™è·³è¿‡ï¼‰ã€‚
--   2. ç”Ÿæˆçš„编码格式:WO_yyyyMMdd + 3 ä½æµæ°´å·ï¼Œä¾‹å¦‚ WO_20261019001。
--   3. åˆ†æ®µç±»åž‹ï¼š2=当前日期,3=固定字符,4=流水号;
--      å¾ªçŽ¯æ–¹å¼ï¼š3=按天;补齐方式:1=左补齐。
-- ============================================================
-- 1. ç¼–码规则主表
INSERT INTO mes_md_auto_code_rule
    (code, name, description, max_length, padded, padded_char, padded_method, status, remark, creator, updater, create_time, update_time, deleted)
SELECT 'PRO_WORK_ORDER_CODE', '生产工单编码', '生产工单自动编码', 15, b'1', '0', 1, 0, NULL, '1', '1', NOW(), NOW(), b'0'
FROM DUAL
WHERE NOT EXISTS (
    SELECT 1 FROM mes_md_auto_code_rule WHERE code = 'PRO_WORK_ORDER_CODE' AND deleted = b'0'
);
-- 2. è§„则分段:固定前缀 WO_
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, date_format, fix_character, serial_start_no, serial_step, cycle_flag, cycle_method, remark, creator, updater, create_time, update_time, deleted)
SELECT r.id, 1, 3, 3, NULL, 'WO_', NULL, NULL, NULL, NULL, '固定前缀', '1', '1', NOW(), NOW(), b'0'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PRO_WORK_ORDER_CODE' AND r.deleted = b'0'
  AND NOT EXISTS (
      SELECT 1 FROM mes_md_auto_code_part p WHERE p.rule_id = r.id AND p.sort = 1 AND p.deleted = b'0'
  );
-- 3. è§„则分段:日期 yyyyMMdd
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, date_format, fix_character, serial_start_no, serial_step, cycle_flag, cycle_method, remark, creator, updater, create_time, update_time, deleted)
SELECT r.id, 2, 2, 8, 'yyyyMMdd', NULL, NULL, NULL, NULL, NULL, '日期', '1', '1', NOW(), NOW(), b'0'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PRO_WORK_ORDER_CODE' AND r.deleted = b'0'
  AND NOT EXISTS (
      SELECT 1 FROM mes_md_auto_code_part p WHERE p.rule_id = r.id AND p.sort = 2 AND p.deleted = b'0'
  );
-- 4. è§„则分段:流水号(按天循环,从 1 å¼€å§‹ï¼Œæ­¥é•¿ 1)
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, date_format, fix_character, serial_start_no, serial_step, cycle_flag, cycle_method, remark, creator, updater, create_time, update_time, deleted)
SELECT r.id, 3, 4, 3, NULL, NULL, 1, 1, b'1', 3, '流水号', '1', '1', NOW(), NOW(), b'0'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PRO_WORK_ORDER_CODE' AND r.deleted = b'0'
  AND NOT EXISTS (
      SELECT 1 FROM mes_md_auto_code_part p WHERE p.rule_id = r.id AND p.sort = 3 AND p.deleted = b'0'
  );
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/maintenanceplan/MesProMaintenancePlanServiceImpl.java
@@ -226,8 +226,7 @@
        }
        // 3. ç»„装工单
        MesProWorkOrderSaveReqVO workOrderReq = new MesProWorkOrderSaveReqVO();
        workOrderReq.setCode(autoCodeRecordService.generateAutoCode(
                MesMdAutoCodeRuleCodeEnum.PRO_WORK_ORDER_CODE.getCode()));
        workOrderReq.setCode(generateWorkOrderCode());
        workOrderReq.setName(plan.getName());
        workOrderReq.setType(convertPlanTypeToWorkOrderType(plan.getPlanType()));
        workOrderReq.setOrderSourceType(MesProWorkOrderSourceTypeEnum.MAINTENANCE_PLAN.getType());
@@ -345,6 +344,22 @@
                + String.format("%03d", (int) (Math.random() * 1000));
    }
    /**
     * ç”Ÿæˆå·¥å•编码
     *
     * ä¼˜å…ˆä½¿ç”¨ç¼–码规则;若环境中未配置 PRO_WORK_ORDER_CODE è§„则,则降级为时间戳编码,避免生成工单被阻断
     */
    private String generateWorkOrderCode() {
        try {
            return autoCodeRecordService.generateAutoCode(
                    MesMdAutoCodeRuleCodeEnum.PRO_WORK_ORDER_CODE.getCode());
        } catch (Exception e) {
            log.warn("[generateWorkOrderCode] ç¼–码规则 {} ä¸å­˜åœ¨ï¼Œä½¿ç”¨æ—¶é—´æˆ³ç”Ÿæˆ",
                    MesMdAutoCodeRuleCodeEnum.PRO_WORK_ORDER_CODE.getCode(), e);
            return "WO" + DateUtil.format(java.time.LocalDateTime.now(), "yyyyMMddHHmmssSSS");
        }
    }
    private MesProMaintenancePlanDO validatePlanExists(Long id) {
        MesProMaintenancePlanDO plan = planMapper.selectById(id);
        if (plan == null) {