From 93aed1dbf6cafbd5eecfb867a08046590dd19931 Mon Sep 17 00:00:00 2001 From: Allenxy <13762749+chaosallen@user.noreply.gitee.com> Date: Mon, 18 Aug 2025 08:48:22 +0800 Subject: [PATCH] =?UTF-8?q?init():=20=E5=88=9D=E5=A7=8B=E5=8C=96=E9=80=9A?= =?UTF-8?q?=E8=AE=AF=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/anno/OpcMessageHandlerType.java | 12 + .../constants/enums/OpcMessageType.java | 19 ++ .../com/fizz/business/domain/CrmPdiPlan.java | 240 ++++++++---------- .../domain/msg/AppMeasureCoatMessage.java | 134 ++++++++++ .../domain/msg/AppMeasureEntryMessage.java | 74 ++++++ .../domain/msg/AppMeasureExitMessage.java | 54 ++++ .../domain/msg/AppMeasureFurnaceMessage.java | 71 ++++++ .../domain/msg/AppMeasureMessage.java | 10 + .../domain/msg/EntryMovementMessage.java | 12 + .../business/domain/msg/ExitCutMessage.java | 32 +++ .../domain/msg/ExitMeasureMessage.java | 21 ++ .../domain/msg/ExitMovementMessage.java | 21 ++ .../fizz/business/domain/msg/OpcMessage.java | 10 + .../business/service/OpcMessageHandler.java | 7 + .../service/hanle/AppMeasureHandler.java | 19 ++ .../service/hanle/EntryMovementHandler.java | 14 + .../service/hanle/ExitCutHandler.java | 15 ++ .../service/hanle/ExitMeasureHandler.java | 16 ++ .../service/hanle/ExitMovementHandler.java | 15 ++ .../service/hanle/OpcMessageDispatcher.java | 41 +++ .../service/hanle/OpcReceiverHandler.java | 19 ++ 21 files changed, 720 insertions(+), 136 deletions(-) create mode 100644 business/src/main/java/com/fizz/business/anno/OpcMessageHandlerType.java create mode 100644 business/src/main/java/com/fizz/business/constants/enums/OpcMessageType.java create mode 100644 business/src/main/java/com/fizz/business/domain/msg/AppMeasureCoatMessage.java create mode 100644 business/src/main/java/com/fizz/business/domain/msg/AppMeasureEntryMessage.java create mode 100644 business/src/main/java/com/fizz/business/domain/msg/AppMeasureExitMessage.java create mode 100644 business/src/main/java/com/fizz/business/domain/msg/AppMeasureFurnaceMessage.java create mode 100644 business/src/main/java/com/fizz/business/domain/msg/AppMeasureMessage.java create mode 100644 business/src/main/java/com/fizz/business/domain/msg/EntryMovementMessage.java create mode 100644 business/src/main/java/com/fizz/business/domain/msg/ExitCutMessage.java create mode 100644 business/src/main/java/com/fizz/business/domain/msg/ExitMeasureMessage.java create mode 100644 business/src/main/java/com/fizz/business/domain/msg/ExitMovementMessage.java create mode 100644 business/src/main/java/com/fizz/business/domain/msg/OpcMessage.java create mode 100644 business/src/main/java/com/fizz/business/service/OpcMessageHandler.java create mode 100644 business/src/main/java/com/fizz/business/service/hanle/AppMeasureHandler.java create mode 100644 business/src/main/java/com/fizz/business/service/hanle/EntryMovementHandler.java create mode 100644 business/src/main/java/com/fizz/business/service/hanle/ExitCutHandler.java create mode 100644 business/src/main/java/com/fizz/business/service/hanle/ExitMeasureHandler.java create mode 100644 business/src/main/java/com/fizz/business/service/hanle/ExitMovementHandler.java create mode 100644 business/src/main/java/com/fizz/business/service/hanle/OpcMessageDispatcher.java create mode 100644 business/src/main/java/com/fizz/business/service/hanle/OpcReceiverHandler.java diff --git a/business/src/main/java/com/fizz/business/anno/OpcMessageHandlerType.java b/business/src/main/java/com/fizz/business/anno/OpcMessageHandlerType.java new file mode 100644 index 0000000..332c9bb --- /dev/null +++ b/business/src/main/java/com/fizz/business/anno/OpcMessageHandlerType.java @@ -0,0 +1,12 @@ +package com.fizz.business.anno; + +import com.fizz.business.constants.enums.OpcMessageType; + +import java.lang.annotation.*; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface OpcMessageHandlerType { + OpcMessageType value(); +} \ No newline at end of file diff --git a/business/src/main/java/com/fizz/business/constants/enums/OpcMessageType.java b/business/src/main/java/com/fizz/business/constants/enums/OpcMessageType.java new file mode 100644 index 0000000..0ee0544 --- /dev/null +++ b/business/src/main/java/com/fizz/business/constants/enums/OpcMessageType.java @@ -0,0 +1,19 @@ +package com.fizz.business.constants.enums; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor + +public enum OpcMessageType { + + ENTRY_MOVEMENT("入口移动"), + APP_MEASURE("测量值电文"), + EXIT_CUT("出口剪切"), + EXIT_MOVEMENT("出口移动"), + EXIT_MEASURE("出口测量"); + + private final String type; +} diff --git a/business/src/main/java/com/fizz/business/domain/CrmPdiPlan.java b/business/src/main/java/com/fizz/business/domain/CrmPdiPlan.java index 7309f5a..af02fdb 100644 --- a/business/src/main/java/com/fizz/business/domain/CrmPdiPlan.java +++ b/business/src/main/java/com/fizz/business/domain/CrmPdiPlan.java @@ -1,152 +1,120 @@ package com.fizz.business.domain; -import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fizz.business.constants.enums.NextUnitEnum; -import com.fizz.business.constants.enums.OperModeEnum; -import com.fizz.business.constants.enums.PlanStatusEnum; -import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.io.Serializable; -import java.sql.Timestamp; +import java.math.BigDecimal; import java.time.LocalDateTime; @Data @TableName("crm_pdi_plan") public class CrmPdiPlan implements Serializable { - @TableId(type = IdType.AUTO) - @Schema(description = "id") - private Long id; + private static final long serialVersionUID = 1L; - @Schema(description = "序号") - private Integer seqid; + @TableId + private Long id; // 主键ID - @Schema(description = "多火轧制次数") - private Integer operid; - - @Schema(description = "轧制模式") - private Integer operMode; - - @Schema(description = "钢卷id") - private String coilid; - - @Schema(description = "热轧卷ID") - private String hotCoilid; - - @Schema(description = "道次数") - private Integer passno; - - @Schema(description = "退火厚度") - private Double annealThick; - - @Schema(description = "入口厚度") - private Double entryThick; - - @Schema(description = "入口宽度") - private Double entryWidth; - - @Schema(description = "入口重量") - private Double entryWeight; - - @Schema(description = "入口长度") - private Double entryLength; - - @Schema(description = "入口内径") - private Integer entryInnerDiameter; - - @Schema(description = "入口外径") - private Integer entryOuterDiameter; - - @Schema(description = "出口卷号") - private String exitCoilid; - - @Schema(description = "下工序代码") - private String nextUnit; - - @Schema(description = "分切数量") - private Integer splitNum; - - @Schema(description = "分切模式") - private Integer cutMode; - - @Schema(description = "出口重量1") - private Double exitValue1; - - @Schema(description = "出口重量2") - private Double exitValue2; - - @Schema(description = "出口重量3") - private Double exitValue3; - - @Schema(description = "出口重量4") - private Double exitValue4; - - @Schema(description = "出口重量5") - private Double exitValue5; - - @Schema(description = "出口重量6") - private Double exitValue6; - - @Schema(description = "出口重量") - private Double exitWeight; - - @Schema(description = "出口长度") - private Double exitLength; - - @Schema(description = "出口厚度") - private Double exitThick; - - @Schema(description = "出口宽度") - private Double exitWidth; - - @Schema(description = "钢种") - private String grade; - - @Schema(description = "屈服强度") - private Integer yieldStrength; - - @Schema(description = "抗拉强度") - private Integer tensileStrength; - - @Schema(description = "状态") - private String status; - - @Schema(description = "计划号") - private String planNo; - - @Schema(description = "压下率") - private Double reductionRate; - - @Schema(description = "热卷温度") - private Double hotCoilTemp; - - @Schema(description = "厚度正偏差") - private Double entryThickMaxtol; - - @Schema(description = "厚度正偏差") - private Double entryThickMintol; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "计划日期") - private LocalDateTime createTime; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "记录日期") - private LocalDateTime insdate; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "上线时间") - private LocalDateTime onlineTime; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "开始日期") - private LocalDateTime startDate; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "结束日期") - private LocalDateTime endDate; + private Integer seqid; // 主键ID + private String coilid; // 钢卷号 + private Integer picklingCount; // 酸洗次数 + private Integer dummyCoilFlag; // 虚卷标识 + private Integer seqno; // 顺序号 + private Integer status; // 状态 + private String planid; // 计划ID + private String planType; // 计划类型 + private BigDecimal yieldPoint; // 屈服点 + private BigDecimal entryWeight; // 入口重量(t) + private BigDecimal entryThick; // 入口厚度(mm) + private BigDecimal entryWidth; // 入口宽度(mm) + private BigDecimal entryLength; // 入口长度(mm) + private BigDecimal entryOuterDiameter; // 入口外径(mm) + private BigDecimal entryInnerDiameter; // 入口内径(mm) + private BigDecimal exitInnerDiameter; // 出口内径(mm) + private String steelGrade; // 钢种 + private String exitCoilid; // 出口卷号 + private Integer tlvFlag; // 张力平整标识 + private String orderNo; // 订单号 + private String custommerCode; // 客户代码 + private BigDecimal orderThick; // 订单厚度(mm) + private BigDecimal orderWidth; // 订单宽度(mm) + private BigDecimal orderLenLow; // 订单长度下限(mm) + private BigDecimal orderLenUp; // 订单长度上限(mm) + private BigDecimal orderWt; // 订单重量(t) + private BigDecimal orderWtLow; // 订单重量下限(t) + private BigDecimal orderWtUp; // 订单重量上限(t) + private BigDecimal orderMetCoatTop; // 订单镀层上 + private BigDecimal orderMetCoatBot; // 订单镀层下 + private String finalUse; // 最终用途 + private String hotCoilCode; // 热卷代码 + private BigDecimal exitLengthTar; // 出口目标长度(mm) + private BigDecimal exitLengthTolMax; // 出口长度公差最大值(mm) + private BigDecimal exitLengthTolMin; // 出口长度公差最小值(mm) + private BigDecimal exitThickTar; // 出口目标厚度(mm) + private BigDecimal exitThickTolMax; // 出口厚度公差最大值(mm) + private BigDecimal exitThickTolMin; // 出口厚度公差最小值(mm) + private BigDecimal exitWidthTar; // 出口目标宽度(mm) + private BigDecimal exitWidthTolMax; // 出口宽度公差最大值(mm) + private BigDecimal exitWidthTolMin; // 出口宽度公差最小值(mm) + private String nextWholeBacklogCode; // 下道全流程积压代码 + private String prevWholeBacklogCode; // 上道全流程积压代码 + private String exitWtMode; // 出口重量模式 + private Integer splitNum; // 分卷数量 + private BigDecimal exitWeight1; // 出口重量1 + private BigDecimal exitWeight2; // 出口重量2 + private BigDecimal exitWeight3; // 出口重量3 + private BigDecimal exitWeight4; // 出口重量4 + private BigDecimal exitWeight5; // 出口重量5 + private BigDecimal exitWeight6; // 出口重量6 + private String headSampleMode; // 头部取样模式 + private String headSamplePosition; // 头部取样位置 + private BigDecimal headSampleLength; // 头部取样长度(mm) + private String headSamplePlace; // 头部取样地点 + private Integer headSampleNum; // 头部取样数量 + private String tailSampleMode; // 尾部取样模式 + private String tailSamplePosition; // 尾部取样位置 + private BigDecimal tailSampleLength; // 尾部取样长度(mm) + private String tailSamplePlace; // 尾部取样地点 + private Integer tailSampleNum; // 尾部取样数量 + private LocalDateTime timestamp; // 时间戳 + private LocalDateTime onlineDate; // 上线时间 + private LocalDateTime startDate; // 开始时间 + private LocalDateTime endDate; // 结束时间 + private LocalDateTime furInDate; // 进炉时间 + private LocalDateTime furOutDate; // 出炉时间 + private LocalDateTime createTime; // 创建时间 + private LocalDateTime updateTime; // 更新时间 + private String surfaceVice; // 副面 + private String weldCode; // 焊缝代码 + private Integer spmFlag; // SPM标识 + private BigDecimal spmElongation; // SPM延伸率(%) + private BigDecimal spmRollforce; // SPM轧制力 + private String spmProcessType; // SPM工艺类型 + private String spmControlMode; // SPM控制模式 + private BigDecimal spmBendingForce; // SPM弯曲力 + private BigDecimal spmCrimpingRollMesh; // SPM咬入辊目 + private BigDecimal spmBillyRollMesh; // SPM精轧辊目 + private Integer trimFlag; // 切边标识 + private String tlvMode; // 张力平整模式 + private BigDecimal tlvElongation; // 张力平整延伸率(%) + private Integer chromating; // 钝化标识 + private String coatingCode; // 镀层代码 + private Integer oilingFlag; // 涂油标识 + private String oilingType; // 涂油类型 + private BigDecimal oilingTop; // 涂油上 + private BigDecimal oilingBottom; // 涂油下 + private String heatCycle; // 热循环 + private String coatingSelection; // 镀层选择 + private String coatingType; // 镀层类型 + private String chemTreatMode; // 化学处理模式 + private BigDecimal aimWeightTop; // 目标重量上 + private BigDecimal aimWeightBottom; // 目标重量下 + private BigDecimal maxTolWeightTop; // 最大公差重量上 + private BigDecimal maxTolWeightBottom; // 最大公差重量下 + private BigDecimal headendGaugeLength; // 头端测厚长度(mm) + private BigDecimal tailendGaugeLength; // 尾端测厚长度(mm) + private String origin; // 产地 + private String originCoilid; // 原卷号 } \ No newline at end of file diff --git a/business/src/main/java/com/fizz/business/domain/msg/AppMeasureCoatMessage.java b/business/src/main/java/com/fizz/business/domain/msg/AppMeasureCoatMessage.java new file mode 100644 index 0000000..70a0e33 --- /dev/null +++ b/business/src/main/java/com/fizz/business/domain/msg/AppMeasureCoatMessage.java @@ -0,0 +1,134 @@ +package com.fizz.business.domain.msg; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel(description = "后处理段测量电文") +public class AppMeasureCoatMessage extends OpcMessage { + + @ApiModelProperty("系统计数器 (ms)") + private Integer systemCounter; + + @ApiModelProperty("钢带位置 (m),0 表示头部在参考点 (weld detector 2)") + private BigDecimal stripLocation; + + @ApiModelProperty("测量次数 / 宽度") + private Integer measurementCount; + + @ApiModelProperty("上层平均涂层重量 (g/m²)") + private BigDecimal avrCoatingWeightTop; + + @ApiModelProperty("上层标准涂层重量 (g/m²)") + private BigDecimal stdCoatingWeightTop; + + @ApiModelProperty("上层最大涂层重量 (g/m²)") + private BigDecimal maxCoatingWeightTop; + + @ApiModelProperty("上层最小涂层重量 (g/m²)") + private BigDecimal minCoatingWeightTop; + + @ApiModelProperty("下层平均涂层重量 (g/m²)") + private BigDecimal avrCoatingWeightBottom; + + @ApiModelProperty("下层标准涂层重量 (g/m²)") + private BigDecimal stdCoatingWeightBottom; + + @ApiModelProperty("下层最大涂层重量 (g/m²)") + private BigDecimal maxCoatingWeightBottom; + + @ApiModelProperty("下层最小涂层重量 (g/m²)") + private BigDecimal minCoatingWeightBottom; + + @ApiModelProperty("气刀压力") + private BigDecimal airKnifePressure; + + @ApiModelProperty("气刀流量") + private BigDecimal airKnifeFlow; + + @ApiModelProperty("气刀间隙") + private BigDecimal airKnifeGap; + + @ApiModelProperty("TM出口钢带速度 (m/min)") + private BigDecimal stripSpeedTmExit; + + @ApiModelProperty("钢带张力 BR5 – TM (daN)") + private BigDecimal tensionBr5Tm; + + @ApiModelProperty("钢带张力 TM – BR6 (daN)") + private BigDecimal tensionTmBr6; + + @ApiModelProperty("钢带张力 BR5 – BR6 (daN)") + private BigDecimal tensionBr5Br6; + + @ApiModelProperty("TM mask (0x0001 tempering, 0x0002 type, 0x0004 pure water, 0x0008 water+detergent, 0x0010 control mode)") + private Integer tmMask; + + @ApiModelProperty("TM延伸率 (%)") + private BigDecimal tmElongation; + + @ApiModelProperty("操作侧辊压力 (kN)") + private BigDecimal rollForceOperator; + + @ApiModelProperty("驱动侧辊压力 (kN)") + private BigDecimal rollForceDrive; + + @ApiModelProperty("电机扭矩 (kNm)") + private BigDecimal motorTorque; + + @ApiModelProperty("总弯曲力 (kN)") + private BigDecimal bendingForce; + + @ApiModelProperty("防卷翘辊 - 网距 (mm)") + private BigDecimal antiCrimpingRollMesh; + + @ApiModelProperty("Billy Roll - 网距 (mm)") + private BigDecimal billyRollMesh; + + @ApiModelProperty("备用字段 1") + private BigDecimal spare1; + + @ApiModelProperty("备用字段 2") + private BigDecimal spare2; + + @ApiModelProperty("备用字段 3") + private BigDecimal spare3; + + @ApiModelProperty("钢带张力 TL – BR7 (calc., daN)") + private BigDecimal tensionTlBr7; + + @ApiModelProperty("钢带张力 BR6 – BR7 (calc., daN)") + private BigDecimal tensionBr6Br7; + + @ApiModelProperty("拉矫机投用") + private Integer tlFlag; + + @ApiModelProperty("TL延伸率 (%)") + private BigDecimal tlElongation; + + @ApiModelProperty("Leveling Unit N°1 - 网距 (mm)") + private BigDecimal levelingUnit1Mesh; + + @ApiModelProperty("Leveling Unit N°2 - 网距 (mm)") + private BigDecimal levelingUnit2Mesh; + + @ApiModelProperty("Anti Cross Bow Unit - 网距 (mm)") + private BigDecimal antiCrossBowUnitMesh; + + @ApiModelProperty("AFP段钢带张力 BR7 – BR8 (N/mm²)") + private BigDecimal tensionBr7Br8; + + @ApiModelProperty("AFP段钢带速度 (m/min)") + private BigDecimal stripSpeedAfp; + + @ApiModelProperty("钝化标记 1开启,2耐指纹,3干膜润滑剂") + private Integer coatingFlag; + + @ApiModelProperty("AFP段钢带温度 (℃)") + private Integer stripTempAfp; +} diff --git a/business/src/main/java/com/fizz/business/domain/msg/AppMeasureEntryMessage.java b/business/src/main/java/com/fizz/business/domain/msg/AppMeasureEntryMessage.java new file mode 100644 index 0000000..cd0cef1 --- /dev/null +++ b/business/src/main/java/com/fizz/business/domain/msg/AppMeasureEntryMessage.java @@ -0,0 +1,74 @@ +package com.fizz.business.domain.msg; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel(description = "入口段测量电文") +public class AppMeasureEntryMessage extends OpcMessage { + + @ApiModelProperty("系统计数器") + private Integer systemCounter; + + @ApiModelProperty("入口钢卷标识") + private String entryCoilId; + + @ApiModelProperty("钢带位置 (m),0 表示头部在参考点 (Welder)") + private BigDecimal stripLocation; + + @ApiModelProperty("支付卷号,1 或 2") + private Integer payOffReelNumber; + + @ApiModelProperty("钢带张力 POR – BR1 (daN)") + private BigDecimal tensionPorBr1; + + @ApiModelProperty("钢带张力 BR1 – BR2 (daN)") + private BigDecimal tensionBr1Br2; + + @ApiModelProperty("钢带张力 BR2 – BR3 (daN)") + private BigDecimal tensionBr2Br3; + + @ApiModelProperty("钢带速度 (m/min)") + private BigDecimal stripSpeed; + + @ApiModelProperty("入口活套位置最大值 (m)") + private BigDecimal entryLooperPositionMax; + + @ApiModelProperty("入口活套位置最小值 (m)") + private BigDecimal entryLooperPositionMin; + + @ApiModelProperty("当前实际活套位置 (m)") + private BigDecimal entryLooperPositionCurrent; + + @ApiModelProperty("清洗电压 (V)") + private BigDecimal cleaningVoltage; + + @ApiModelProperty("清洗电流 (A)") + private BigDecimal cleaningCurrent; + + @ApiModelProperty("碱液浓度") + private BigDecimal alkaliConcentration; + + @ApiModelProperty("碱液温度 (℃)") + private BigDecimal alkaliTemperature; + + @ApiModelProperty("漂洗电导率") + private BigDecimal rinseConductivity; + + @ApiModelProperty("漂洗温度 (℃)") + private BigDecimal rinseTemperature; + + @ApiModelProperty("烘干温度 (℃)") + private BigDecimal dryingTemperature; + + @ApiModelProperty("热风流量 (m3/h)") + private BigDecimal hotAirFlow; + + @ApiModelProperty("热风压力 (Pa)") + private BigDecimal hotAirPressure; +} diff --git a/business/src/main/java/com/fizz/business/domain/msg/AppMeasureExitMessage.java b/business/src/main/java/com/fizz/business/domain/msg/AppMeasureExitMessage.java new file mode 100644 index 0000000..d7e5b7d --- /dev/null +++ b/business/src/main/java/com/fizz/business/domain/msg/AppMeasureExitMessage.java @@ -0,0 +1,54 @@ +package com.fizz.business.domain.msg; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel(description = "出口段/工艺段测量电文") +public class AppMeasureExitMessage extends OpcMessage { + + @ApiModelProperty("系统计数器 (ms)") + private Integer systemCounter; + + @ApiModelProperty("钢带位置 (m),0 表示头部在参考点 (weld detector 3)") + private BigDecimal stripLocation; + + @ApiModelProperty("钢带张力 BR8 – BR9 (daN)") + private BigDecimal tensionBr8Br9; + + @ApiModelProperty("出口活套位置 (m)") + private BigDecimal deliveryLooperPosition; + + @ApiModelProperty("出口活套最大可用百分比 (%)") + private BigDecimal exitLooperMaxPercent; + + @ApiModelProperty("出口活套最小可用百分比 (%)") + private BigDecimal exitLooperMinPercent; + + @ApiModelProperty("出口活套当前百分比 (%)") + private BigDecimal exitLooperCurrentPercent; + + @ApiModelProperty("涂油标志 (0=no, 1=yes)") + private Integer oilingFlag; + + @ApiModelProperty("上层涂油量 (g/m²)") + private BigDecimal oilingAmountTop; + + @ApiModelProperty("下层涂油量 (g/m²)") + private BigDecimal oilingAmountBottom; + + @ApiModelProperty("钢带张力 BR9 – TR (daN)") + private BigDecimal tensionBr9Tr; + + @ApiModelProperty("出口段钢带速度 (m/min)") + private BigDecimal speedExitSection; + + @ApiModelProperty("钢卷长度 (m)") + private BigDecimal coilLength; +} + diff --git a/business/src/main/java/com/fizz/business/domain/msg/AppMeasureFurnaceMessage.java b/business/src/main/java/com/fizz/business/domain/msg/AppMeasureFurnaceMessage.java new file mode 100644 index 0000000..b68182c --- /dev/null +++ b/business/src/main/java/com/fizz/business/domain/msg/AppMeasureFurnaceMessage.java @@ -0,0 +1,71 @@ +package com.fizz.business.domain.msg; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel(description = "退火炉段测量电文") +public class AppMeasureFurnaceMessage extends OpcMessage { + + @ApiModelProperty("系统计数器 (ms)") + private Integer systemCounter; + + @ApiModelProperty("入口钢卷标识") + private String entryCoilId; + + @ApiModelProperty("钢带位置 (m),0 表示头部在参考点 (weld detector 1)") + private BigDecimal stripLocation; + + @ApiModelProperty("钢带张力 BR3 (daN)") + private BigDecimal tensionBr3; + + @ApiModelProperty("钢带张力 N°1 Furnace (daN)") + private BigDecimal tensionFurnace1; + + @ApiModelProperty("钢带张力 N°2 Furnace (daN)") + private BigDecimal tensionFurnace2; + + @ApiModelProperty("钢带速度 Furnace Entry (m/min)") + private BigDecimal stripSpeed; + + @ApiModelProperty("Furnace 延伸率 (%)") + private BigDecimal furnaceElongation; + + @ApiModelProperty("PHF-出口钢带温度 (℃)") + private BigDecimal phfExitStripTemp; + + @ApiModelProperty("RTF-出口钢带温度 (℃)") + private BigDecimal rtfExitStripTemp; + + @ApiModelProperty("JCS-出口钢带温度 (℃)") + private BigDecimal jcsExitStripTemp; + + @ApiModelProperty("SCS-出口钢带温度 (℃)") + private BigDecimal scsExitStripTemp; + + @ApiModelProperty("PHF 露点 (℃)") + private BigDecimal phfDewPoint; + + @ApiModelProperty("RTF 露点 (℃)") + private BigDecimal rtfDewPoint; + + @ApiModelProperty("天然气耗量 (m3)") + private BigDecimal gasConsumption; + + @ApiModelProperty("钢带张力 BR4 – BR5 (daN)") + private BigDecimal tensionBr4Br5; + + @ApiModelProperty("炉锅温度 (℃)") + private Integer potTemperature; + + @ApiModelProperty("冷却塔钢带温度 (℃)") + private Integer coolingTowerStripTemp; + + @ApiModelProperty("锌锅功率 (kW)") + private BigDecimal zincPotPower; +} \ No newline at end of file diff --git a/business/src/main/java/com/fizz/business/domain/msg/AppMeasureMessage.java b/business/src/main/java/com/fizz/business/domain/msg/AppMeasureMessage.java new file mode 100644 index 0000000..8a61c49 --- /dev/null +++ b/business/src/main/java/com/fizz/business/domain/msg/AppMeasureMessage.java @@ -0,0 +1,10 @@ +package com.fizz.business.domain.msg; + +public class AppMeasureMessage extends OpcMessage { + + AppMeasureEntryMessage appMeasureEntryMessage; + AppMeasureFurnaceMessage appMeasureFurnaceMessage; + AppMeasureCoatMessage appMeasureCoatMessage; + AppMeasureExitMessage appMeasureExitMessage; + +} diff --git a/business/src/main/java/com/fizz/business/domain/msg/EntryMovementMessage.java b/business/src/main/java/com/fizz/business/domain/msg/EntryMovementMessage.java new file mode 100644 index 0000000..a6759dd --- /dev/null +++ b/business/src/main/java/com/fizz/business/domain/msg/EntryMovementMessage.java @@ -0,0 +1,12 @@ +package com.fizz.business.domain.msg; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class EntryMovementMessage extends OpcMessage { + private Integer counter; + private Integer materialPlaceSource; + private Integer materialPlaceDestination; +} \ No newline at end of file diff --git a/business/src/main/java/com/fizz/business/domain/msg/ExitCutMessage.java b/business/src/main/java/com/fizz/business/domain/msg/ExitCutMessage.java new file mode 100644 index 0000000..4a0070b --- /dev/null +++ b/business/src/main/java/com/fizz/business/domain/msg/ExitCutMessage.java @@ -0,0 +1,32 @@ +package com.fizz.business.domain.msg; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel(description = "出口剪切电文") +public class ExitCutMessage extends OpcMessage { + + @ApiModelProperty("计数器") + private Integer counter; + + @ApiModelProperty("剪切类型:0=split, 1=weldSeam, 2=stripBreak") + private Integer cutType; + + @ApiModelProperty("剪切时卷取长度 (m)") + private BigDecimal cutLength; + + @ApiModelProperty("计算卷取外径 (mm)") + private BigDecimal outerDiameter; + + @ApiModelProperty("下一个焊缝到飞剪的距离 (m)") + private BigDecimal leftLength; + + @ApiModelProperty("breakPosition,含义待定") + private BigDecimal breakPosition; +} diff --git a/business/src/main/java/com/fizz/business/domain/msg/ExitMeasureMessage.java b/business/src/main/java/com/fizz/business/domain/msg/ExitMeasureMessage.java new file mode 100644 index 0000000..a4a42b7 --- /dev/null +++ b/business/src/main/java/com/fizz/business/domain/msg/ExitMeasureMessage.java @@ -0,0 +1,21 @@ +package com.fizz.business.domain.msg; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel(description = "出口称重电文") +public class ExitMeasureMessage extends OpcMessage { + + @ApiModelProperty("计数器") + private Integer counter; + + @ApiModelProperty("重量 (kg)") + private BigDecimal weight; +} + diff --git a/business/src/main/java/com/fizz/business/domain/msg/ExitMovementMessage.java b/business/src/main/java/com/fizz/business/domain/msg/ExitMovementMessage.java new file mode 100644 index 0000000..f1b314c --- /dev/null +++ b/business/src/main/java/com/fizz/business/domain/msg/ExitMovementMessage.java @@ -0,0 +1,21 @@ +package com.fizz.business.domain.msg; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel(description = "出口移动电文") +public class ExitMovementMessage extends OpcMessage { + + @ApiModelProperty("计数器") + private Integer counter; + + @ApiModelProperty("Material Place Source") + private Integer materialPlaceSource; + + @ApiModelProperty("Material Place Destination") + private Integer materialPlaceDestination; +} diff --git a/business/src/main/java/com/fizz/business/domain/msg/OpcMessage.java b/business/src/main/java/com/fizz/business/domain/msg/OpcMessage.java new file mode 100644 index 0000000..2526281 --- /dev/null +++ b/business/src/main/java/com/fizz/business/domain/msg/OpcMessage.java @@ -0,0 +1,10 @@ +package com.fizz.business.domain.msg; + +import com.fizz.business.constants.enums.OpcMessageType; +import lombok.Data; + +@Data +public abstract class OpcMessage { + private Integer messageId; // 电文ID + private Integer length; // 电文长度 +} \ No newline at end of file diff --git a/business/src/main/java/com/fizz/business/service/OpcMessageHandler.java b/business/src/main/java/com/fizz/business/service/OpcMessageHandler.java new file mode 100644 index 0000000..fe78a59 --- /dev/null +++ b/business/src/main/java/com/fizz/business/service/OpcMessageHandler.java @@ -0,0 +1,7 @@ +package com.fizz.business.service; + +import com.fizz.business.domain.msg.OpcMessage; + +public interface OpcMessageHandler { + void handle(T message); +} \ No newline at end of file diff --git a/business/src/main/java/com/fizz/business/service/hanle/AppMeasureHandler.java b/business/src/main/java/com/fizz/business/service/hanle/AppMeasureHandler.java new file mode 100644 index 0000000..5df4512 --- /dev/null +++ b/business/src/main/java/com/fizz/business/service/hanle/AppMeasureHandler.java @@ -0,0 +1,19 @@ +package com.fizz.business.service.hanle; + +import com.fizz.business.anno.OpcMessageHandlerType; +import com.fizz.business.constants.enums.OpcMessageType; +import com.fizz.business.domain.msg.AppMeasureExitMessage; +import com.fizz.business.domain.msg.AppMeasureMessage; +import com.fizz.business.service.OpcMessageHandler; +import org.springframework.stereotype.Component; + +@Component +@OpcMessageHandlerType(OpcMessageType.APP_MEASURE) +public class AppMeasureHandler implements OpcMessageHandler { + + @Override + public void handle(AppMeasureMessage message) { + // 处理出口段测量逻辑 + System.out.println("处理 APP_MEASURE_EXIT 消息: " + message); + } +} \ No newline at end of file diff --git a/business/src/main/java/com/fizz/business/service/hanle/EntryMovementHandler.java b/business/src/main/java/com/fizz/business/service/hanle/EntryMovementHandler.java new file mode 100644 index 0000000..6503e95 --- /dev/null +++ b/business/src/main/java/com/fizz/business/service/hanle/EntryMovementHandler.java @@ -0,0 +1,14 @@ +package com.fizz.business.service.hanle; + +import com.fizz.business.domain.msg.EntryMovementMessage; +import com.fizz.business.service.OpcMessageHandler; +import org.springframework.stereotype.Component; + +@Component +public class EntryMovementHandler implements OpcMessageHandler { + + @Override + public void handle(EntryMovementMessage message) { + System.out.println("处理入口移动消息: " + message); + } +} \ No newline at end of file diff --git a/business/src/main/java/com/fizz/business/service/hanle/ExitCutHandler.java b/business/src/main/java/com/fizz/business/service/hanle/ExitCutHandler.java new file mode 100644 index 0000000..566c62a --- /dev/null +++ b/business/src/main/java/com/fizz/business/service/hanle/ExitCutHandler.java @@ -0,0 +1,15 @@ +package com.fizz.business.service.hanle; + +import com.fizz.business.domain.msg.ExitCutMessage; +import com.fizz.business.service.OpcMessageHandler; +import org.springframework.stereotype.Component; + +@Component +public class ExitCutHandler implements OpcMessageHandler { + + @Override + public void handle(ExitCutMessage message) { + // 出口剪切逻辑处理 + System.out.println("处理 EXIT_CUT 消息: " + message); + } +} diff --git a/business/src/main/java/com/fizz/business/service/hanle/ExitMeasureHandler.java b/business/src/main/java/com/fizz/business/service/hanle/ExitMeasureHandler.java new file mode 100644 index 0000000..3ec8ce4 --- /dev/null +++ b/business/src/main/java/com/fizz/business/service/hanle/ExitMeasureHandler.java @@ -0,0 +1,16 @@ +package com.fizz.business.service.hanle; + +import com.fizz.business.domain.msg.ExitMeasureMessage; +import com.fizz.business.service.OpcMessageHandler; +import org.springframework.stereotype.Component; + +@Component +public class ExitMeasureHandler implements OpcMessageHandler { + + @Override + public void handle(ExitMeasureMessage message) { + // 出口称重逻辑处理 + System.out.println("处理 EXIT_MEASURE 消息: " + message); + } +} + diff --git a/business/src/main/java/com/fizz/business/service/hanle/ExitMovementHandler.java b/business/src/main/java/com/fizz/business/service/hanle/ExitMovementHandler.java new file mode 100644 index 0000000..2e05a3a --- /dev/null +++ b/business/src/main/java/com/fizz/business/service/hanle/ExitMovementHandler.java @@ -0,0 +1,15 @@ +package com.fizz.business.service.hanle; + +import com.fizz.business.domain.msg.ExitMovementMessage; +import com.fizz.business.service.OpcMessageHandler; +import org.springframework.stereotype.Component; + +@Component +public class ExitMovementHandler implements OpcMessageHandler { + + @Override + public void handle(ExitMovementMessage message) { + // 出口移动逻辑处理 + System.out.println("处理 EXIT_MOVEMENT 消息: " + message); + } +} diff --git a/business/src/main/java/com/fizz/business/service/hanle/OpcMessageDispatcher.java b/business/src/main/java/com/fizz/business/service/hanle/OpcMessageDispatcher.java new file mode 100644 index 0000000..23aa29f --- /dev/null +++ b/business/src/main/java/com/fizz/business/service/hanle/OpcMessageDispatcher.java @@ -0,0 +1,41 @@ +package com.fizz.business.service.hanle; + +import com.fizz.business.anno.OpcMessageHandlerType; +import com.fizz.business.constants.enums.OpcMessageType; +import com.fizz.business.domain.msg.OpcMessage; +import com.fizz.business.service.OpcMessageHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +public class OpcMessageDispatcher { + + private final Map> handlerMap = new HashMap<>(); + + @Autowired + public OpcMessageDispatcher(ApplicationContext context) { + Map beans = context.getBeansOfType(OpcMessageHandler.class); + beans.values().forEach(handler -> { + OpcMessageHandlerType annotation = handler.getClass().getAnnotation(OpcMessageHandlerType.class); + if (annotation != null) { + handlerMap.put(annotation.value(), handler); + } else { + throw new IllegalStateException("Handler " + handler.getClass().getSimpleName() + " 未标注 @OpcMessageHandlerType"); + } + }); + } + + @SuppressWarnings("unchecked") + public void dispatch(OpcMessageType type, T message) { + OpcMessageHandler handler = (OpcMessageHandler) handlerMap.get(type); + if (handler != null) { + handler.handle(message); + } else { + System.out.println("未注册的 OPC 消息类型: " + type); + } + } +} diff --git a/business/src/main/java/com/fizz/business/service/hanle/OpcReceiverHandler.java b/business/src/main/java/com/fizz/business/service/hanle/OpcReceiverHandler.java new file mode 100644 index 0000000..26ab76b --- /dev/null +++ b/business/src/main/java/com/fizz/business/service/hanle/OpcReceiverHandler.java @@ -0,0 +1,19 @@ +package com.fizz.business.service.hanle; + + +import com.fizz.business.constants.enums.OpcMessageType; +import com.fizz.business.domain.msg.OpcMessage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class OpcReceiverHandler { + + @Autowired + private OpcMessageDispatcher dispatcher; + + // 统一入口 + public void onMessageReceived(OpcMessageType type, OpcMessage message) { + dispatcher.dispatch(type, message); + } +}