gaoluyang
5 天以前 3e8b8d3cb363b2a23e90e7f03e36472bfd27d696
feat(mes): 补全编号生成规则与条码配置,修正 MPS 下发工单取错编码规则

- docs/sql 新增幂等脚本:补 9 条 mes_md_auto_code_rule(DV_CHECK_PLAN_CODE、
PD_PROJECT_CODE、PD_TASK_CODE、PD_VERSION_CODE、PRO_CARD_CODE、PRO_PROCESS_CODE、
QC_IQC_VENDOR_BATCH_CODE、TM_TOOL_CODE、PRODUCTRECPT_CODE)及其分段组成,
前端这些页面的「生成」按钮不再报「编码规则不存在」。
- 同脚本补 18 条 mes_wm_barcode_config(覆盖 102~605 全部业务类型,
内容格式统一为「前缀-{BUSINESSCODE}」,自动生成开启、状态启用),
工具/设备/仓库等页面的条码页签与条码清单手工新增不再为空。
- 同脚本补回「条码配置」(5906)、「条码清单」(5911) 两个页面菜单及其按钮
(5908~5910、5913~5916),并给 163~168 角色授权。
- MesProMpsServiceImpl 生成工单编码时取错规则:原来写死 "WO"(库里无此规则,
每次回落成 WO+时间戳),改为 PRO_WORK_ORDER_CODE。
- MesMdAutoCodeRuleCodeEnum 补齐前端引用但枚举缺失的 8 个规则 code。

Co-Authored-By: Claude Code <noreply@anthropic.com>
已添加1个文件
已修改2个文件
444 ■■■■■ 文件已修改
docs/sql/mes_auto_code_barcode_config_20261103.sql 429 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/sql/mes_auto_code_barcode_config_20261103.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,429 @@
-- =============================================================================
-- è¯šå‘五金(CFWJ)MES ç¼–码规则 + æ¡ç é…ç½®è¡¥å…¨è„šæœ¬
-- æ—¥æœŸï¼š2026-11-03
-- ç›®æ ‡åº“:本地 CFWJ(127.0.0.1:3306)。请勿在生产库执行。
--
-- èƒŒæ™¯ï¼š
--   1) å‰ç«¯ MesAutoCodeRuleCode é‡Œå¼•用了 9 ä¸ªè§„则 code,但 mes_md_auto_code_rule é‡Œæ²¡æœ‰ï¼Œ
--      è¿™äº›é¡µé¢çš„「生成」按钮必报「编码规则不存在」。
--   2) mes_wm_barcode_config ä¸ºç©ºï¼ŒautoGenerateBarcode ç›´æŽ¥ return,
--      å·¥å…·/设备/仓库等页面的条码页签永远显示「未找到对应条码数据」,
--      æ¡ç æ¸…单页手工新增也因「条码配置不存在」失败。
--   3) æ¡ç é…ç½®ï¼ˆ5906)/条码清单(5911)两个页面菜单在 CFWJ é‡Œç¼ºå¤±ï¼Œ
--      èœå•树只剩孤立的查询按钮 5907/5912。
--
-- è„šæœ¬å¹‚ç­‰ï¼šå…¨éƒ¨ INSERT ... SELECT ... WHERE NOT EXISTS,可重复执行。
-- =============================================================================
-- -----------------------------------------------------------------------------
-- ä¸€ã€ç¼–号生成规则:补 9 æ¡è§„则 + è§„则组成
--    ç»„成口径沿用库内既有规则:
--      æœ‰æ—¥æœŸæ®µï¼šå›ºå®šå­—符 + yyyyMMdd + 3 ä½æµæ°´ï¼ˆæŒ‰å¤©å¾ªçŽ¯ï¼‰
--      æ— æ—¥æœŸæ®µï¼šå›ºå®šå­—符 + 3 ä½æµæ°´ï¼ˆä¸å¾ªçŽ¯ï¼Œé¿å…æ¯å¤©æ¸…é›¶æ’žå·²å­˜åœ¨çš„ç¼–ç ï¼‰
-- -----------------------------------------------------------------------------
-- 1.1 è§„则主表
INSERT INTO mes_md_auto_code_rule
    (code, name, description, max_length, padded, padded_char, padded_method, status, creator)
SELECT 'DV_CHECK_PLAN_CODE', '点检保养方案编码', '点检保养方案自动编码', 6, b'1', '0', 1, 0, '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_md_auto_code_rule WHERE code = 'DV_CHECK_PLAN_CODE' AND deleted = b'0');
INSERT INTO mes_md_auto_code_rule
    (code, name, description, max_length, padded, padded_char, padded_method, status, creator)
SELECT 'PD_PROJECT_CODE', '产品设计项目编码', '产品设计项目自动编码', 15, b'1', '0', 1, 0, '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_md_auto_code_rule WHERE code = 'PD_PROJECT_CODE' AND deleted = b'0');
INSERT INTO mes_md_auto_code_rule
    (code, name, description, max_length, padded, padded_char, padded_method, status, creator)
SELECT 'PD_TASK_CODE', '产品设计任务编码', '产品设计任务自动编码', 15, b'1', '0', 1, 0, '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_md_auto_code_rule WHERE code = 'PD_TASK_CODE' AND deleted = b'0');
INSERT INTO mes_md_auto_code_rule
    (code, name, description, max_length, padded, padded_char, padded_method, status, creator)
SELECT 'PD_VERSION_CODE', '产品设计版本编码', '产品设计版本自动编码', 14, b'1', '0', 1, 0, '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_md_auto_code_rule WHERE code = 'PD_VERSION_CODE' AND deleted = b'0');
INSERT INTO mes_md_auto_code_rule
    (code, name, description, max_length, padded, padded_char, padded_method, status, creator)
SELECT 'PRO_CARD_CODE', '流转卡编码', '生产流转卡自动编码', 14, b'1', '0', 1, 0, '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_md_auto_code_rule WHERE code = 'PRO_CARD_CODE' AND deleted = b'0');
INSERT INTO mes_md_auto_code_rule
    (code, name, description, max_length, padded, padded_char, padded_method, status, creator)
SELECT 'PRO_PROCESS_CODE', '工序编码', '生产工序自动编码', 6, b'1', '0', 1, 0, '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_md_auto_code_rule WHERE code = 'PRO_PROCESS_CODE' AND deleted = b'0');
INSERT INTO mes_md_auto_code_rule
    (code, name, description, max_length, padded, padded_char, padded_method, status, creator)
SELECT 'QC_IQC_VENDOR_BATCH_CODE', '来料检验供应商批次编码', '来料检验单供应商批次号自动编码', 17, b'1', '0', 1, 0, '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_md_auto_code_rule WHERE code = 'QC_IQC_VENDOR_BATCH_CODE' AND deleted = b'0');
INSERT INTO mes_md_auto_code_rule
    (code, name, description, max_length, padded, padded_char, padded_method, status, creator)
SELECT 'TM_TOOL_CODE', '工具编码', '工装工具自动编码', 6, b'1', '0', 1, 0, '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_md_auto_code_rule WHERE code = 'TM_TOOL_CODE' AND deleted = b'0');
INSERT INTO mes_md_auto_code_rule
    (code, name, description, max_length, padded, padded_char, padded_method, status, creator)
SELECT 'PRODUCTRECPT_CODE', '产品入库单编码', '产品入库单自动编码', 14, b'1', '0', 1, 0, '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_md_auto_code_rule WHERE code = 'PRODUCTRECPT_CODE' AND deleted = b'0');
-- 1.1.1 ä¿®æ­£æœ€å¤§é•¿åº¦ï¼ˆè„šæœ¬å¯é‡å¤æ‰§è¡Œï¼šæ—©æœŸç‰ˆæœ¬ PD_TASK_CODE è¯¯è®¾ä¸º 14,会把流水号末位截掉)
UPDATE mes_md_auto_code_rule
SET max_length = 15
WHERE code = 'PD_TASK_CODE' AND deleted = b'0' AND max_length <> 15;
-- 1.2 è§„则组成(sort=1 å›ºå®šå­—符 / sort=2 æ—¥æœŸ / sort=3 æµæ°´å·ï¼‰
--     åˆ†æ®µç±»åž‹ type:1 è¾“入字符 2 å½“前日期 3 å›ºå®šå­—符 4 æµæ°´å·
--     å¾ªçŽ¯æ–¹å¼ cycle_method:3 æŒ‰å¤©ï¼›padded_method:1 å·¦è¡¥é½
-- DV_CHECK_PLAN_CODE:CP_ + 3 ä½æµæ°´ï¼ˆä¸å¾ªçŽ¯ï¼‰
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, fix_character, cycle_flag, creator)
SELECT r.id, 1, 3, 3, 'CP_', b'0', '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'DV_CHECK_PLAN_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');
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, serial_start_no, serial_step, cycle_flag, creator)
SELECT r.id, 2, 4, 3, 1, 1, b'0', '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'DV_CHECK_PLAN_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');
-- PD_PROJECT_CODE:PDP_ + yyyyMMdd + 3 ä½æµæ°´
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, fix_character, cycle_flag, creator)
SELECT r.id, 1, 3, 4, 'PDP_', b'0', '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PD_PROJECT_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');
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, date_format, cycle_flag, creator)
SELECT r.id, 2, 2, 8, 'yyyyMMdd', b'0', '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PD_PROJECT_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');
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, serial_start_no, serial_step, cycle_flag, cycle_method, creator)
SELECT r.id, 3, 4, 3, 1, 1, b'1', 3, '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PD_PROJECT_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');
-- PD_TASK_CODE:PTK_ + yyyyMMdd + 3 ä½æµæ°´
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, fix_character, cycle_flag, creator)
SELECT r.id, 1, 3, 4, 'PTK_', b'0', '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PD_TASK_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');
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, date_format, cycle_flag, creator)
SELECT r.id, 2, 2, 8, 'yyyyMMdd', b'0', '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PD_TASK_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');
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, serial_start_no, serial_step, cycle_flag, cycle_method, creator)
SELECT r.id, 3, 4, 3, 1, 1, b'1', 3, '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PD_TASK_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');
-- PD_VERSION_CODE:PV_ + yyyyMMdd + 3 ä½æµæ°´
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, fix_character, cycle_flag, creator)
SELECT r.id, 1, 3, 3, 'PV_', b'0', '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PD_VERSION_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');
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, date_format, cycle_flag, creator)
SELECT r.id, 2, 2, 8, 'yyyyMMdd', b'0', '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PD_VERSION_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');
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, serial_start_no, serial_step, cycle_flag, cycle_method, creator)
SELECT r.id, 3, 4, 3, 1, 1, b'1', 3, '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PD_VERSION_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');
-- PRO_CARD_CODE:PC_ + yyyyMMdd + 3 ä½æµæ°´
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, fix_character, cycle_flag, creator)
SELECT r.id, 1, 3, 3, 'PC_', b'0', '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PRO_CARD_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');
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, date_format, cycle_flag, creator)
SELECT r.id, 2, 2, 8, 'yyyyMMdd', b'0', '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PRO_CARD_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');
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, serial_start_no, serial_step, cycle_flag, cycle_method, creator)
SELECT r.id, 3, 4, 3, 1, 1, b'1', 3, '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PRO_CARD_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');
-- PRO_PROCESS_CODE:OP_ + 3 ä½æµæ°´ï¼ˆä¸å¾ªçŽ¯ï¼‰
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, fix_character, cycle_flag, creator)
SELECT r.id, 1, 3, 3, 'OP_', b'0', '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PRO_PROCESS_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');
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, serial_start_no, serial_step, cycle_flag, creator)
SELECT r.id, 2, 4, 3, 1, 1, b'0', '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PRO_PROCESS_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');
-- QC_IQC_VENDOR_BATCH_CODE:IQCVB_ + yyyyMMdd + 3 ä½æµæ°´
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, fix_character, cycle_flag, creator)
SELECT r.id, 1, 3, 6, 'IQCVB_', b'0', '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'QC_IQC_VENDOR_BATCH_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');
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, date_format, cycle_flag, creator)
SELECT r.id, 2, 2, 8, 'yyyyMMdd', b'0', '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'QC_IQC_VENDOR_BATCH_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');
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, serial_start_no, serial_step, cycle_flag, cycle_method, creator)
SELECT r.id, 3, 4, 3, 1, 1, b'1', 3, '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'QC_IQC_VENDOR_BATCH_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');
-- TM_TOOL_CODE:TM_ + 3 ä½æµæ°´ï¼ˆä¸å¾ªçŽ¯ï¼‰
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, fix_character, cycle_flag, creator)
SELECT r.id, 1, 3, 3, 'TM_', b'0', '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'TM_TOOL_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');
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, serial_start_no, serial_step, cycle_flag, creator)
SELECT r.id, 2, 4, 3, 1, 1, b'0', '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'TM_TOOL_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');
-- PRODUCTRECPT_CODE:PR_ + yyyyMMdd + 3 ä½æµæ°´
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, fix_character, cycle_flag, creator)
SELECT r.id, 1, 3, 3, 'PR_', b'0', '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PRODUCTRECPT_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');
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, date_format, cycle_flag, creator)
SELECT r.id, 2, 2, 8, 'yyyyMMdd', b'0', '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PRODUCTRECPT_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');
INSERT INTO mes_md_auto_code_part
    (rule_id, sort, type, length, serial_start_no, serial_step, cycle_flag, cycle_method, creator)
SELECT r.id, 3, 4, 3, 1, 1, b'1', 3, '1'
FROM mes_md_auto_code_rule r
WHERE r.code = 'PRODUCTRECPT_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');
-- -----------------------------------------------------------------------------
-- äºŒã€æ¡ç é…ç½®ï¼š18 ä¸ªä¸šåŠ¡ç±»åž‹å…¨è¦†ç›–
--     æ¡ç æ ¼å¼ format:1 äºŒç»´ç ï¼›çŠ¶æ€ status:0 å¯ç”¨ï¼›auto_generate_flag:1 è‡ªåŠ¨ç”Ÿæˆ
--     å†…容格式只支持 {BUSINESSCODE} å ä½ç¬¦ï¼ˆåŽç«¯ä»…替换这一个)
-- -----------------------------------------------------------------------------
INSERT INTO mes_wm_barcode_config
    (format, biz_type, content_format, content_example, auto_generate_flag, status, remark, creator)
SELECT 1, 102, 'WH-{BUSINESSCODE}', 'WH-WH_001', b'1', 0, '仓库条码:内容 = WH- + ä»“库编码', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_wm_barcode_config WHERE biz_type = 102 AND deleted = b'0');
INSERT INTO mes_wm_barcode_config
    (format, biz_type, content_format, content_example, auto_generate_flag, status, remark, creator)
SELECT 1, 103, 'LC-{BUSINESSCODE}', 'LC-LC_001', b'1', 0, '库区条码:内容 = LC- + åº“区编码', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_wm_barcode_config WHERE biz_type = 103 AND deleted = b'0');
INSERT INTO mes_wm_barcode_config
    (format, biz_type, content_format, content_example, auto_generate_flag, status, remark, creator)
SELECT 1, 104, 'AR-{BUSINESSCODE}', 'AR-AR_001', b'1', 0, '库位条码:内容 = AR- + åº“位编码', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_wm_barcode_config WHERE biz_type = 104 AND deleted = b'0');
INSERT INTO mes_wm_barcode_config
    (format, biz_type, content_format, content_example, auto_generate_flag, status, remark, creator)
SELECT 1, 105, 'PK-{BUSINESSCODE}', 'PK-PK_20261103001', b'1', 0, '装箱单条码:内容 = PK- + è£…箱单编码', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_wm_barcode_config WHERE biz_type = 105 AND deleted = b'0');
INSERT INTO mes_wm_barcode_config
    (format, biz_type, content_format, content_example, auto_generate_flag, status, remark, creator)
SELECT 1, 106, 'ST-{BUSINESSCODE}', 'ST-ST_001', b'1', 0, '库存条码:内容 = ST- + åº“存编码', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_wm_barcode_config WHERE biz_type = 106 AND deleted = b'0');
INSERT INTO mes_wm_barcode_config
    (format, biz_type, content_format, content_example, auto_generate_flag, status, remark, creator)
SELECT 1, 107, 'BT-{BUSINESSCODE}', 'BT-BT_20261103001', b'1', 0, '批次条码:内容 = BT- + æ‰¹æ¬¡ç¼–码', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_wm_barcode_config WHERE biz_type = 107 AND deleted = b'0');
INSERT INTO mes_wm_barcode_config
    (format, biz_type, content_format, content_example, auto_generate_flag, status, remark, creator)
SELECT 1, 109, 'SN-{BUSINESSCODE}', 'SN-SN_202611030001', b'1', 0, 'SN æ¡ç ï¼šå†…容 = SN- + SN ç ', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_wm_barcode_config WHERE biz_type = 109 AND deleted = b'0');
INSERT INTO mes_wm_barcode_config
    (format, biz_type, content_format, content_example, auto_generate_flag, status, remark, creator)
SELECT 1, 300, 'PC-{BUSINESSCODE}', 'PC-PC_20261103001', b'1', 0, '流转卡条码:内容 = PC- + æµè½¬å¡ç¼–码', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_wm_barcode_config WHERE biz_type = 300 AND deleted = b'0');
INSERT INTO mes_wm_barcode_config
    (format, biz_type, content_format, content_example, auto_generate_flag, status, remark, creator)
SELECT 1, 301, 'WO-{BUSINESSCODE}', 'WO-WO_20261103001', b'1', 0, '工单条码:内容 = WO- + å·¥å•编码', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_wm_barcode_config WHERE biz_type = 301 AND deleted = b'0');
INSERT INTO mes_wm_barcode_config
    (format, biz_type, content_format, content_example, auto_generate_flag, status, remark, creator)
SELECT 1, 302, 'TF-{BUSINESSCODE}', 'TF-TF_20261103001', b'1', 0, '流转单条码:内容 = TF- + æµè½¬å•编码', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_wm_barcode_config WHERE biz_type = 302 AND deleted = b'0');
INSERT INTO mes_wm_barcode_config
    (format, biz_type, content_format, content_example, auto_generate_flag, status, remark, creator)
SELECT 1, 400, 'EQ-{BUSINESSCODE}', 'EQ-MC_20261103001', b'1', 0, '设备条码:内容 = EQ- + è®¾å¤‡ç¼–码', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_wm_barcode_config WHERE biz_type = 400 AND deleted = b'0');
INSERT INTO mes_wm_barcode_config
    (format, biz_type, content_format, content_example, auto_generate_flag, status, remark, creator)
SELECT 1, 500, 'TM-{BUSINESSCODE}', 'TM-TM_001', b'1', 0, '工具条码:内容 = TM- + å·¥å…·ç¼–码', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_wm_barcode_config WHERE biz_type = 500 AND deleted = b'0');
INSERT INTO mes_wm_barcode_config
    (format, biz_type, content_format, content_example, auto_generate_flag, status, remark, creator)
SELECT 1, 600, 'MAT-{BUSINESSCODE}', 'MAT-ITEM_20261103001', b'1', 0, '物料条码:内容 = MAT- + ç‰©æ–™ç¼–码', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_wm_barcode_config WHERE biz_type = 600 AND deleted = b'0');
INSERT INTO mes_wm_barcode_config
    (format, biz_type, content_format, content_example, auto_generate_flag, status, remark, creator)
SELECT 1, 601, 'VND-{BUSINESSCODE}', 'VND-VND_20261103001', b'1', 0, '供应商条码:内容 = VND- + ä¾›åº”商编码', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_wm_barcode_config WHERE biz_type = 601 AND deleted = b'0');
INSERT INTO mes_wm_barcode_config
    (format, biz_type, content_format, content_example, auto_generate_flag, status, remark, creator)
SELECT 1, 602, 'WS-{BUSINESSCODE}', 'WS-WS_001', b'1', 0, '工作站条码:内容 = WS- + å·¥ä½œç«™ç¼–码', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_wm_barcode_config WHERE biz_type = 602 AND deleted = b'0');
INSERT INTO mes_wm_barcode_config
    (format, biz_type, content_format, content_example, auto_generate_flag, status, remark, creator)
SELECT 1, 603, 'WP-{BUSINESSCODE}', 'WP-WP_001', b'1', 0, '车间条码:内容 = WP- + è½¦é—´ç¼–码', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_wm_barcode_config WHERE biz_type = 603 AND deleted = b'0');
INSERT INTO mes_wm_barcode_config
    (format, biz_type, content_format, content_example, auto_generate_flag, status, remark, creator)
SELECT 1, 604, 'USR-{BUSINESSCODE}', 'USR-EMP001', b'1', 0, '人员条码:内容 = USR- + å‘˜å·¥å·¥å·', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_wm_barcode_config WHERE biz_type = 604 AND deleted = b'0');
INSERT INTO mes_wm_barcode_config
    (format, biz_type, content_format, content_example, auto_generate_flag, status, remark, creator)
SELECT 1, 605, 'CLT-{BUSINESSCODE}', 'CLT-CLT_20261103001', b'1', 0, '客户条码:内容 = CLT- + å®¢æˆ·ç¼–码', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM mes_wm_barcode_config WHERE biz_type = 605 AND deleted = b'0');
-- -----------------------------------------------------------------------------
-- ä¸‰ã€èœå•:补「条码配置」「条码清单」两个页面及其按钮(挂到 ä»“库管理 1075579)
--     5907/5912 ä¸¤ä¸ªæŸ¥è¯¢æŒ‰é’®å·²å­˜åœ¨ä½†çˆ¶çº§ç¼ºå¤±ï¼Œæœ¬æ®µè¡¥é½çˆ¶çº§ 5906/5911。
-- -----------------------------------------------------------------------------
INSERT INTO system_menu
    (id, name, permission, type, sort, parent_id, path, icon, component, component_name,
     status, visible, keep_alive, always_show, creator)
SELECT 5906, '条码配置', '', 2, 8, 1075579, 'barcode/config', 'fa:barcode', 'wls/barcode/config/index',
       'MesWmBarcodeConfig', 0, b'1', b'1', b'1', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE id = 5906);
INSERT INTO system_menu
    (id, name, permission, type, sort, parent_id, path, icon, component, component_name,
     status, visible, keep_alive, always_show, creator)
SELECT 5911, '条码清单', '', 2, 9, 1075579, 'barcode', 'fa:qrcode', 'wls/barcode/index',
       'MesWmBarcode', 0, b'1', b'1', b'1', '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE id = 5911);
INSERT INTO system_menu (id, name, permission, type, sort, parent_id, status, creator)
SELECT 5908, '条码配置创建', 'mes:wm-barcode-config:create', 3, 2, 5906, 0, '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE id = 5908);
INSERT INTO system_menu (id, name, permission, type, sort, parent_id, status, creator)
SELECT 5909, '条码配置更新', 'mes:wm-barcode-config:update', 3, 3, 5906, 0, '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE id = 5909);
INSERT INTO system_menu (id, name, permission, type, sort, parent_id, status, creator)
SELECT 5910, '条码配置删除', 'mes:wm-barcode-config:delete', 3, 4, 5906, 0, '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE id = 5910);
INSERT INTO system_menu (id, name, permission, type, sort, parent_id, status, creator)
SELECT 5913, '条码清单创建', 'mes:wm-barcode:create', 3, 2, 5911, 0, '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE id = 5913);
INSERT INTO system_menu (id, name, permission, type, sort, parent_id, status, creator)
SELECT 5914, '条码清单更新', 'mes:wm-barcode:update', 3, 3, 5911, 0, '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE id = 5914);
INSERT INTO system_menu (id, name, permission, type, sort, parent_id, status, creator)
SELECT 5915, '条码清单删除', 'mes:wm-barcode:delete', 3, 4, 5911, 0, '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE id = 5915);
INSERT INTO system_menu (id, name, permission, type, sort, parent_id, status, creator)
SELECT 5916, '条码清单导出', 'mes:wm-barcode:export', 3, 5, 5911, 0, '1'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE id = 5916);
-- è§’色授权:所有有效业务角色可查看;生产管理员(166)/经理(168) å¯ç»´æŠ¤ã€‚
-- èœå•:5906 æ¡ç é…ç½® / 5907 æŸ¥è¯¢ / 5911 æ¡ç æ¸…单 / 5912 æŸ¥è¯¢
INSERT INTO system_role_menu (role_id, menu_id, creator)
SELECT r.id, m.id, '1'
FROM system_role r
JOIN system_menu m ON m.id IN (5906, 5907, 5911, 5912)
WHERE r.id IN (163, 164, 165, 166, 167, 168) AND r.deleted = b'0'
  AND NOT EXISTS (SELECT 1 FROM system_role_menu rm
                  WHERE rm.role_id = r.id AND rm.menu_id = m.id AND rm.deleted = b'0');
-- èœå•:5908/5909/5910 é…ç½®å¢žæ”¹åˆ ï¼›5913/5914/5915/5916 æ¸…单增改删导出
INSERT INTO system_role_menu (role_id, menu_id, creator)
SELECT r.id, m.id, '1'
FROM system_role r
JOIN system_menu m ON m.id IN (5908, 5909, 5910, 5913, 5914, 5915, 5916)
WHERE r.id IN (166, 168) AND r.deleted = b'0'
  AND NOT EXISTS (SELECT 1 FROM system_role_menu rm
                  WHERE rm.role_id = r.id AND rm.menu_id = m.id AND rm.deleted = b'0');
-- =============================================================================
-- æ ¡éªŒï¼ˆæ‰§è¡ŒåŽå¯æ‰‹å·¥æ ¸å¯¹ï¼Œä¸å±žäºŽå˜æ›´å†…容)
--   SELECT code,name FROM mes_md_auto_code_rule WHERE code IN ('DV_CHECK_PLAN_CODE','PD_PROJECT_CODE',
--     'PD_TASK_CODE','PD_VERSION_CODE','PRO_CARD_CODE','PRO_PROCESS_CODE','QC_IQC_VENDOR_BATCH_CODE',
--     'TM_TOOL_CODE','PRODUCTRECPT_CODE');   -- æœŸæœ› 9 æ¡
--   SELECT r.code, COUNT(p.id) FROM mes_md_auto_code_rule r JOIN mes_md_auto_code_part p ON p.rule_id = r.id
--     WHERE r.code = 'PRO_PROCESS_CODE' GROUP BY r.code;  -- æœŸæœ› 2 æ®µï¼Œå…¶ä½™ 2 æ®µæˆ– 3 æ®µ
--   SELECT biz_type, content_format FROM mes_wm_barcode_config ORDER BY biz_type;  -- æœŸæœ› 18 æ¡
-- =============================================================================
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java
@@ -18,8 +18,10 @@
    MD_WORKSTATION_CODE("MD_WORKSTATION_CODE", "工作站编码"),
    MD_WORKSHOP_CODE("MD_WORKSHOP_CODE", "车间编码"),
    TM_TOOL_TYPE_CODE("TM_TOOL_TYPE_CODE", "工具类型编码"),
    TM_TOOL_CODE("TM_TOOL_CODE", "工具编码"),
    WM_ARRIVAL_NOTICE_CODE("WM_ARRIVAL_NOTICE_CODE", "到货通知单编码"),
    WM_ITEM_RECEIPT_CODE("WM_ITEM_RECEIPT_CODE", "采购入库单编码"),
    PRODUCTRECPT_CODE("PRODUCTRECPT_CODE", "产品入库单编码"),
    WM_RETURN_VENDOR_CODE("WM_RETURN_VENDOR_CODE", "采购退货单编码"),
    WM_RETURN_ISSUE_CODE("WM_RETURN_ISSUE_CODE", "生产退料单编码"),
    WM_SN_CODE("WM_SN_CODE", "SN ç "),
@@ -43,6 +45,7 @@
    DV_MACHINERY_CODE("DV_MACHINERY_CODE", "设备编码"),
    DV_MACHINERY_TYPE_CODE("DV_MACHINERY_TYPE_CODE", "设备类型编码"),
    DV_SUBJECT_CODE("DV_SUBJECT_CODE", "点检保养项目编码"),
    DV_CHECK_PLAN_CODE("DV_CHECK_PLAN_CODE", "点检保养方案编码"),
    DV_REPAIR_CODE("DV_REPAIR_CODE", "维修单编码"),
    WM_SALES_NOTICE_CODE("WM_SALES_NOTICE_CODE", "发货通知单编码"),
    WM_RETURN_SALES_CODE("WM_RETURN_SALES_CODE", "销售退货单编码"),
@@ -50,9 +53,14 @@
    PRO_ROUTE_CODE("PRO_ROUTE_CODE", "工艺路线编码"),
    PRO_FEEDBACK_CODE("PRO_FEEDBACK_CODE", "生产报工单编码"),
    PRO_WORK_ORDER_CODE("PRO_WORK_ORDER_CODE", "生产工单编码"),
    PRO_CARD_CODE("PRO_CARD_CODE", "流转卡编码"),
    PRO_PROCESS_CODE("PRO_PROCESS_CODE", "工序编码"),
    QC_DEFECT_CODE("QC_DEFECT_CODE", "缺陷类型编码"),
    QC_INDICATOR_RESULT_CODE("QC_INDICATOR_RESULT_CODE", "样品检验结果编码"),
    WM_OUTSOURCE_RECEIPT_CODE("WM_OUTSOURCE_RECEIPT_CODE", "外协入库单编码"),
    PD_PROJECT_CODE("PD_PROJECT_CODE", "产品设计项目编码"),
    PD_TASK_CODE("PD_TASK_CODE", "产品设计任务编码"),
    PD_VERSION_CODE("PD_VERSION_CODE", "产品设计版本编码"),
    PD_DOCUMENT_AUDIT_CODE("PD_DOCUMENT_AUDIT_CODE", "资料审核单编码"),
    PD_ARCHIVE_CODE("PD_ARCHIVE_CODE", "归档台账编码"),
    PD_PROCESS_PARAM_CODE("PD_PROCESS_PARAM_CODE", "工艺参数编码"),
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java
@@ -30,6 +30,7 @@
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum;
import cn.iocoder.yudao.module.mes.enums.pro.MesProMpsStatusEnum;
import cn.iocoder.yudao.module.mes.enums.pro.MesProFeedbackStatusEnum;
import cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderSourceTypeEnum;
@@ -803,9 +804,11 @@
     */
    private String generateWorkOrderCode() {
        try {
            return autoCodeRecordService.generateAutoCode("WO");
            return autoCodeRecordService.generateAutoCode(
                    MesMdAutoCodeRuleCodeEnum.PRO_WORK_ORDER_CODE.getCode());
        } catch (Exception e) {
            log.warn("[generateWorkOrderCode] ç¼–码规则 WO ä¸å­˜åœ¨ï¼Œä½¿ç”¨æ—¶é—´æˆ³ç”Ÿæˆ");
            log.warn("[generateWorkOrderCode] ç¼–码规则 {} ä¸å­˜åœ¨ï¼Œä½¿ç”¨æ—¶é—´æˆ³ç”Ÿæˆ",
                    MesMdAutoCodeRuleCodeEnum.PRO_WORK_ORDER_CODE.getCode());
            return "WO" + System.currentTimeMillis();
        }
    }