feat: 改造为冷轧双机架二级控制系统

- 删除 ruoyi-flowable 模块,移除所有 Flowable 依赖
- 新建 ruoyi-mill 业务模块:
  * protocol: iXComPCS UDP 电文编解码器(7条电文完整定义)
  * udp: UdpServer/UdpSender/TelegramDispatcher
  * domain: MillPlan / MillProductionResult
  * service/controller: 生产计划、产出管理骨架
- 前端改造为工业深色主题(深海军蓝 + 工业青色)
- 系统标题更新为"冷轧双机架二级控制系统"
- application.yml 新增 mill.udp 配置节

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-28 12:58:22 +08:00
parent 30764b5854
commit 7648a56a0d
66 changed files with 1579 additions and 6169 deletions

View File

@@ -0,0 +1,192 @@
package com.ruoyi.mill.protocol;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static com.ruoyi.mill.protocol.FieldType.*;
/**
* 7 条电文的字段 Schema 定义(与 电文/*.xlsx 完全对应)
*
* L3→L2接收:
* 2FK101 作业命令信息
* 2FK102 作业命令撤销
* 2FK103 作业命令应答
* 2FK104 产出信息应答
*
* L2→L3发送:
* K12F01 计划信息应答
* K12F02 计划钢卷删除
* K12F03 生产信息电文
*/
public final class TelegramSchema {
private TelegramSchema() {}
private static FieldDef s(String name, int len) { return new FieldDef(name, STRING, len, 0); }
private static FieldDef i(String name) { return new FieldDef(name, INT, 4, 0); }
private static FieldDef f(String name, int len, int precision) { return new FieldDef(name, FLOAT, len, precision); }
// ─────────────────────────────────────────────────────────────
// 2FK101 作业命令信息 L3→L2
// ─────────────────────────────────────────────────────────────
public static final String ID_2FK101 = "2FK101";
public static final List<FieldDef> SCHEMA_2FK101 = Collections.unmodifiableList(Arrays.asList(
s("PLAN_NO", 20),
s("MAT_SEQ_NO", 3),
s("UNIT_CODE", 4),
s("PLAN_TYPE", 1),
s("IN_MAT_NO", 20),
f("IN_MAT_THICK", 9, 3),
f("IN_MAT_THICK_MAX", 9, 3),
f("IN_MAT_THICK_MIN", 9, 3),
f("IN_MAT_WIDTH", 10, 3),
f("IN_MAT_WT", 5, 0),
f("IN_MAT_LEN", 12, 3),
f("IN_MAT_IN_DIA", 8, 2),
f("IN_MAT_DIA", 8, 2),
s("PONO", 10),
s("SG_SIGN", 24),
s("OUT_MAT_NO", 20),
s("CUST_IN_MAT_NO", 20),
s("REMARK", 250),
s("SPARE_1", 20),
s("SPARE_2", 20),
s("SPARE_3", 20),
s("SPARE_4", 20),
s("SPARE_5", 20),
f("SPARE_6", 13, 3),
f("SPARE_7", 13, 3),
f("SPARE_8", 13, 3),
f("SPARE_9", 13, 3),
f("SPARE_10", 13, 3)
));
// ─────────────────────────────────────────────────────────────
// 2FK102 作业命令撤销 L3→L2
// ─────────────────────────────────────────────────────────────
public static final String ID_2FK102 = "2FK102";
public static final List<FieldDef> SCHEMA_2FK102 = Collections.unmodifiableList(Arrays.asList(
s("PLAN_NO", 20),
i("MAT_SEQ_NO"),
s("UNIT_CODE", 4),
s("IN_MAT_NO", 20),
s("SPARE_1", 20),
s("SPARE_2", 20),
s("SPARE_3", 20),
s("SPARE_4", 20),
s("SPARE_5", 20)
));
// ─────────────────────────────────────────────────────────────
// 2FK103 作业命令应答 L3→L2
// ─────────────────────────────────────────────────────────────
public static final String ID_2FK103 = "2FK103";
public static final List<FieldDef> SCHEMA_2FK103 = Collections.unmodifiableList(Arrays.asList(
s("TC_NO", 6),
s("PLAN_NO", 20),
i("SEQ_NO"),
s("UNIT_CODE", 4),
s("IN_MAT_NO", 20),
s("FLAG", 1),
s("DEAL_RESULT", 50),
s("SPARE_1", 20),
s("SPARE_2", 20),
s("SPARE_3", 20),
s("SPARE_4", 20),
s("SPARE_5", 20)
));
// ─────────────────────────────────────────────────────────────
// 2FK104 产出信息应答 L3→L2
// ─────────────────────────────────────────────────────────────
public static final String ID_2FK104 = "2FK104";
public static final List<FieldDef> SCHEMA_2FK104 = Collections.unmodifiableList(Arrays.asList(
s("TC_NO", 6),
s("PLAN_NO", 20),
i("SEQ_NO"),
s("UNIT_CODE", 4),
s("OUT_MAT_NO", 20),
s("FLAG", 1),
s("DEAL_RESULT", 50),
s("SPARE_1", 20),
s("SPARE_2", 20),
s("SPARE_3", 20),
s("SPARE_4", 20),
s("SPARE_5", 20)
));
// ─────────────────────────────────────────────────────────────
// K12F01 计划信息应答 L2→L3
// ─────────────────────────────────────────────────────────────
public static final String ID_K12F01 = "K12F01";
public static final List<FieldDef> SCHEMA_K12F01 = Collections.unmodifiableList(Arrays.asList(
s("TC_NO", 6),
s("PLAN_NO", 20),
i("SEQ_NO"),
s("UNIT_CODE", 4),
s("IN_MAT_NO", 20),
s("FLAG", 1),
s("DEAL_RESULT", 50),
s("SPARE_1", 20),
s("SPARE_2", 20),
s("SPARE_3", 20),
s("SPARE_4", 20),
s("SPARE_5", 20)
));
// ─────────────────────────────────────────────────────────────
// K12F02 计划钢卷删除 L2→L3
// ─────────────────────────────────────────────────────────────
public static final String ID_K12F02 = "K12F02";
public static final List<FieldDef> SCHEMA_K12F02 = Collections.unmodifiableList(Arrays.asList(
s("PLAN_NO", 20),
i("SEQ_NO"),
s("UNIT_CODE", 4),
s("IN_MAT_NO", 20),
s("CAUSE_DESC", 50),
s("DO_TIME", 14),
s("SPARE_1", 20),
s("SPARE_2", 20),
s("SPARE_3", 20),
s("SPARE_4", 20),
s("SPARE_5", 20)
));
// ─────────────────────────────────────────────────────────────
// K12F03 生产信息电文 L2→L3
// ─────────────────────────────────────────────────────────────
public static final String ID_K12F03 = "K12F03";
public static final List<FieldDef> SCHEMA_K12F03 = Collections.unmodifiableList(Arrays.asList(
s("FLAG", 1),
s("PLAN_NO", 20),
i("SEQ_NO"),
s("UNIT_CODE", 4),
s("PROC_SEQ_NO", 4),
s("ANNEAL_FLAG", 16),
s("IN_MAT_NO", 20),
i("IN_MAT_WT"),
f("IN_MAT_THICK", 9, 3),
f("IN_MAT_WIDTH", 10, 3),
s("OUT_MAT_NO", 20),
s("CUST_MAT_NO", 20),
i("OUT_MAT_ACT_WT"),
f("OUT_MAT_ACT_THICK", 9, 3),
f("OUT_MAT_ACT_WIDTH", 10, 3),
f("OUT_MAT_ACT_LEN", 15, 3),
f("OUT_MAT_ACT_INNER_DIA", 8, 2),
f("OUT_MAT_ACT_OUTER_DIA", 8, 2),
s("PROD_SHIFT_NO", 1),
s("PROD_SHIFT_GROUP", 1),
s("START_PROD_TIME", 14),
s("END_PROD_TIME", 14),
s("SOCKET_NO", 2),
s("REMARK", 100),
s("SPARE_1", 20),
s("SPARE_2", 20),
s("SPARE_3", 20),
s("SPARE_4", 20),
s("SPARE_5", 20)
));
}