feat():设定值查询,实绩查询

This commit is contained in:
Allenxy
2024-10-13 13:25:04 +08:00
parent e61476d06b
commit e30dcc477e
34 changed files with 1289 additions and 61 deletions

View File

@@ -97,6 +97,12 @@
</exclusions>
</dependency>
<!--websocket-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>

View File

@@ -0,0 +1,24 @@
package com.fizz.business.constants;
public class CommonConstants {
public static final double RO = 7.86; //硅钢密度
public static class RocketMQ {
public static final String CONSUMER_GROUP_RECEIVE_ALARM_ZR1 = "C-ZG-ZR1-ALARM";
public static final String CONSUMER_GROUP_RECEIVE_ALARM_ZR2 = "C-ZG-ZR2-ALARM";
public static final String TOPIC_RECEIVE_ALARM_FROM_PLAT_ZR1 = "ZG-ZR1-ALARM";
public static final String TOPIC_RECEIVE_ALARM_FROM_PLAT_ZR2 = "ZG-ZR2-ALARM";
public static final String CONSUMER_GROUP_COIL_POINT_DATA_ZR1 = "C-ZG-ZR1-COIL-POINT-DATA";
public static final String CONSUMER_GROUP_COIL_POINT_DATA_ZR2 = "C-ZG-ZR2-COIL-POINT-DATA";
public static final String TOPIC_RECEIVE_COIL_POINT_DATA_ZR1 = "ZG-ZR1-COIL-POINT-DATA";
public static final String TOPIC_RECEIVE_COIL_POINT_DATA_ZR2 = "ZG-ZR2-COIL-POINT-DATA";
public static final String TOPIC_COIL_OUTPUT = "JH_PRODUCTION_PLAN_OUT";
public static final String TOPIC_COIL_DEFECT = "ZG-COIL-DEFECT";
}
}

View File

@@ -0,0 +1,90 @@
package com.fizz.business.constants.enums;
import com.baomidou.mybatisplus.annotation.IEnum;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import com.fizz.business.form.ChangePlanStatusForm;
import com.fizz.business.form.WebOperateMatForm;
import com.fizz.business.service.client.PdiPlanClient;
import com.fizz.business.service.impl.BeanFactory;
import com.fizz.business.utils.WebSocketUtil;
import com.fizz.business.vo.CrmPdiPlanVO;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.Map;
@Getter
@Slf4j
@AllArgsConstructor
public enum WebMatOperateEnum implements IEnum<String> {
ONLINE("上线") {
@Override
public void operate(WebOperateMatForm form) {
CrmPdiPlanVO crmPdiPlanVO = ONLINE.syncPlanStatus(form.getId());
WebSocketUtil.sendMatmapMsg(crmPdiPlanVO);
}
},
READY("回退") {
@Override
public void operate(WebOperateMatForm form) {
}
},
PRODUCT("卸卷并封闭") {
@Override
public void operate(WebOperateMatForm form) {
super.operate(form);
}
},
;
private final String desc;
private static final Map<String, WebMatOperateEnum> MAP = new HashMap<>(16);
static {
for (WebMatOperateEnum e : WebMatOperateEnum.values()) {
MAP.put(e.getValue(), e);
}
}
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static WebMatOperateEnum getByValue(String value) {
return MAP.get(value);
}
@JsonValue
@Override
public String getValue() {
return this.name();
}
public void operate(WebOperateMatForm form) {
PdiPlanClient planClient = BeanFactory.getBean(PdiPlanClient.class);
planClient.changeStatus(ChangePlanStatusForm.builder()
.operation(this.name())
.id(form.getId())
.build());
}
/**
* 同步计划状态
*
* @param planId 计划id
*/
private CrmPdiPlanVO syncPlanStatus(Long planId) {
PdiPlanClient planClient = BeanFactory.getBean(PdiPlanClient.class);
return planClient.changeStatus(ChangePlanStatusForm.builder()
.operation(this.name())
.id(planId)
.build());
}
}

View File

@@ -0,0 +1,39 @@
package com.fizz.business.constants.enums;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.HashMap;
import java.util.Map;
/**
* websocket type
*
* @author chenhao
* @date 2023/04/24
*/
@Getter
@AllArgsConstructor
public enum WsTypeEnum {
alarm, track_position, track_measure, track_signal, track_matmap;
private static final Map<String, WsTypeEnum> MAP = new HashMap<>(8);
static {
for (WsTypeEnum e : WsTypeEnum.values()) {
MAP.put(e.getValue(), e);
}
}
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static WsTypeEnum getByValue(String value) {
return MAP.get(value);
}
@JsonValue
public String getValue() {
return this.name();
}
}

View File

@@ -3,7 +3,9 @@ package com.fizz.business.controller;
import com.fizz.business.domain.CrmPdiPlan;
import com.fizz.business.form.PlanQueryForm;
import com.fizz.business.service.CrmPdiPlanService;
import com.fizz.business.service.ModSetupResultService;
import com.fizz.business.vo.CrmPdiPlanVO;
import com.fizz.business.vo.ModSetupResultVO;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.core.domain.R;
import io.swagger.annotations.Api;
@@ -24,7 +26,7 @@ public class CrmPdiPlanController {
private CrmPdiPlanService crmPdiPlanService;
@GetMapping("/get/{coilid}")
@ApiOperation("通过钢卷号查询计划")
@ApiOperation("通过钢卷号或者状态查询计划")
public R<CrmPdiPlanVO> getByCoilId(@PathVariable String coilid) {
return R.ok(crmPdiPlanService.getByCoilIdAndOperId(coilid));
}
@@ -52,4 +54,5 @@ public class CrmPdiPlanController {
public R<List<CrmPdiPlanVO>> list(@RequestBody PlanQueryForm form) {
return R.ok(crmPdiPlanService.listAll(form));
}
}

View File

@@ -1,6 +1,7 @@
package com.fizz.business.controller;
import com.fizz.business.domain.CrmPdoExcoil;
import com.fizz.business.form.CrmPdoExcoilForm;
import com.fizz.business.service.CrmPdoExcoilService;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.core.domain.R;
@@ -45,9 +46,9 @@ public class CrmPdoExcoilController {
return R.ok(crmPdoExcoilService.deleteCrmPdoExcoil(excoilid, operid));
}
@GetMapping("/list")
@PostMapping("/list")
@ApiOperation("查询实绩列表")
public R<List<CrmPdoExcoil>> list() {
return R.ok(crmPdoExcoilService.listAll());
public R<List<CrmPdoExcoil>> list(@RequestBody CrmPdoExcoilForm form) {
return R.ok(crmPdoExcoilService.listAll(form));
}
}

View File

@@ -0,0 +1,37 @@
package com.fizz.business.controller;
import com.fizz.business.domain.ModSetupResult;
import com.fizz.business.form.ModSetupResultForm;
import com.fizz.business.service.ModSetupResultService;
import com.fizz.business.vo.ModSetupResultVO;
import com.ruoyi.common.core.domain.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("/setup")
@Api("南钢设定值接口")
public class ModSetupResultController {
@Resource
private ModSetupResultService modSetupResultService;
// 查询所有记录
@PostMapping("/list")
@ApiOperation("查询设定值列表")
public R<List<ModSetupResultVO>> list(@RequestBody ModSetupResultForm form) {
return R.ok(modSetupResultService.list(form));
}
@PostMapping("/calc")
@ApiOperation("计算设定值")
public R<String> calcSetup(@RequestBody ModSetupResultForm form) {
return R.ok(modSetupResultService.calcSetup(form));
}
}

View File

@@ -0,0 +1,41 @@
package com.fizz.business.controller;
import com.fizz.business.form.WebOperateMatForm;
import com.fizz.business.service.TrackService;
import com.ruoyi.common.core.domain.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
/**
* @author baomidou
* @since 2023-05-17
*/
@RestController
@RequestMapping("/track")
@Api(value = "过程跟踪页面", tags = "过程跟踪")
public class TrackController {
@Resource
TrackService trackService;
@PostMapping("/manual/operate/mat")
@ApiOperation(value = "页面手动操作钢卷 上线,回退")
public R<String> manualOperateMat(@RequestBody @Valid WebOperateMatForm form) {
trackService.operateMatWeb(form);
return R.ok();
}
@PostMapping("/manual/tr/unload")
@ApiOperation(value = "页面卷取机手动卸卷登记产出")
public R<String> manualtrUnload(@RequestBody @Valid WebOperateMatForm form) {
trackService.trUnload(form);
return R.ok();
}
}

View File

@@ -44,16 +44,16 @@ public class CrmPdiPlan implements Serializable {
private Integer annealThick;
@ApiModelProperty(value = "入口厚度")
private Float entryThick;
private Double entryThick;
@ApiModelProperty(value = "入口宽度")
private Float entryWidth;
private Double entryWidth;
@ApiModelProperty(value = "入口重量")
private Float entryWeight;
private Double entryWeight;
@ApiModelProperty(value = "入口长度")
private Float entryLength;
private Double entryLength;
@ApiModelProperty(value = "入口内径")
private Integer entryInnerDiameter;
@@ -74,34 +74,34 @@ public class CrmPdiPlan implements Serializable {
private Integer cutMode;
@ApiModelProperty(value = "出口重量1")
private Float exitValue1;
private Double exitValue1;
@ApiModelProperty(value = "出口重量2")
private Float exitValue2;
private Double exitValue2;
@ApiModelProperty(value = "出口重量3")
private Float exitValue3;
private Double exitValue3;
@ApiModelProperty(value = "出口重量4")
private Float exitValue4;
private Double exitValue4;
@ApiModelProperty(value = "出口重量5")
private Float exitValue5;
private Double exitValue5;
@ApiModelProperty(value = "出口重量6")
private Float exitValue6;
private Double exitValue6;
@ApiModelProperty(value = "出口重量")
private Float exitWeight;
private Double exitWeight;
@ApiModelProperty(value = "出口长度")
private Float exitLength;
private Double exitLength;
@ApiModelProperty(value = "出口厚度")
private Float exitThick;
private Double exitThick;
@ApiModelProperty(value = "出口宽度")
private Float exitWidth;
private Double exitWidth;
@ApiModelProperty(value = "钢种")
private String grade;
@@ -119,16 +119,16 @@ public class CrmPdiPlan implements Serializable {
private String planNo;
@ApiModelProperty(value = "压下率")
private Float reductionRate;
private Double reductionRate;
@ApiModelProperty(value = "热卷温度")
private Float hotCoilTemp;
private Double hotCoilTemp;
@ApiModelProperty(value = "厚度正偏差")
private Float entryThickMaxtol;
private Double entryThickMaxtol;
@ApiModelProperty(value = "厚度正偏差")
private Float entryThickMintol;
private Double entryThickMintol;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "计划日期")

View File

@@ -1,5 +1,6 @@
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;
@@ -14,9 +15,12 @@ import java.time.LocalDateTime;
@TableName("crm_pdo_excoil")
public class CrmPdoExcoil implements Serializable {
@TableId
@TableId(type = IdType.AUTO)
@ApiModelProperty(value = "id")
private Long id;
@ApiModelProperty(value = "成品卷ID")
private String excoilid;
private String exitCoilid;
@ApiModelProperty(value = "进入卷ID")
private String encoilid;
@@ -31,10 +35,10 @@ public class CrmPdoExcoil implements Serializable {
private Integer subid;
@ApiModelProperty(value = "头部位置")
private Float headpos;
private Double headpos;
@ApiModelProperty(value = "尾部位置")
private Float tailpos;
private Double tailpos;
@ApiModelProperty(value = "班次")
private String shift;
@@ -43,37 +47,37 @@ public class CrmPdoExcoil implements Serializable {
private String crew;
@ApiModelProperty(value = "退火厚度")
private Float annealThick;
private Double annealThick;
@ApiModelProperty(value = "入口厚度")
private Float entryThick;
private Double entryThick;
@ApiModelProperty(value = "入口宽度")
private Float entryWidth;
private Double entryWidth;
@ApiModelProperty(value = "入口重量")
private Float entryWeight;
private Double entryWeight;
@ApiModelProperty(value = "成品厚度")
private Float exitThick;
private Double exitThick;
@ApiModelProperty(value = "成品宽度")
private Float exitWidth;
private Double exitWidth;
@ApiModelProperty(value = "成品长度")
private Float exitLength;
private Double exitLength;
@ApiModelProperty(value = "成品内径")
private Float exitInnerDiameter;
private Double exitInnerDiameter;
@ApiModelProperty(value = "理论出口重量")
private Float calcExitWeight;
private Double calcExitWeight;
@ApiModelProperty(value = "实际出口重量")
private Float measExitWeight;
private Double measExitWeight;
@ApiModelProperty(value = "外径")
private Float outerDiameter;
private Double outerDiameter;
@ApiModelProperty(value = "状态")
private String status;
@@ -94,7 +98,7 @@ public class CrmPdoExcoil implements Serializable {
private LocalDateTime insdate;
@ApiModelProperty(value = "质量")
private Float quality;
private Double quality;
@ApiModelProperty(value = "热卷ID")
private String hotCoilid;

View File

@@ -0,0 +1,189 @@
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 io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("mod_setup_result")
@ApiModel(value = "ModSetupResult对象", description = "轧机设置结果实体类")
public class ModSetupResult {
@ApiModelProperty(value = "自增主键")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty(value = "logid")
private Integer logId;
@ApiModelProperty(value = "钢卷ID")
private String coilId;
@ApiModelProperty(value = "道次号")
private Integer passId;
@ApiModelProperty(value = "机架号")
private Integer standId;
@ApiModelProperty(value = "断面ID")
private Integer fractId;
@ApiModelProperty(value = "速度限制")
private Integer speedLimit;
@ApiModelProperty(value = "力限制")
private Integer forceLimit;
@ApiModelProperty(value = "功率限制")
private Integer powerLimit;
@ApiModelProperty(value = "入口厚度")
private Float entryThick;
@ApiModelProperty(value = "出口厚度")
private Float exitThick;
@ApiModelProperty(value = "最小厚度")
private Float minThick;
@ApiModelProperty(value = "压下率")
private Float reduction;
@ApiModelProperty(value = "摩擦系数")
private Float friction;
@ApiModelProperty(value = "入口凸度")
private Float entryCrown;
@ApiModelProperty(value = "出口凸度")
private Float exitCrown;
@ApiModelProperty(value = "入口张力")
private Float entryTension;
@ApiModelProperty(value = "出口张力")
private Float exitTension;
@ApiModelProperty(value = "入口应力")
private Float entryTenstress;
@ApiModelProperty(value = "出口应力")
private Float exitTenstress;
@ApiModelProperty(value = "速度比")
private Float speedFract;
@ApiModelProperty(value = "入口速度")
private Float entrySpeed;
@ApiModelProperty(value = "出口速度")
private Float exitSpeed;
@ApiModelProperty(value = "轧制速度")
private Float rollSpeed;
@ApiModelProperty(value = "入口应变")
private Float sigmae;
@ApiModelProperty(value = "出口应变")
private Float sigmas;
@ApiModelProperty(value = "平均应变")
private Float sigmaave;
@ApiModelProperty(value = "轧制力")
private Float rollForce;
@ApiModelProperty(value = "轧辊间隙")
private Float rollgap;
@ApiModelProperty(value = "超出间隙")
private Float overgap;
@ApiModelProperty(value = "轧机刚度")
private Float millModulus;
@ApiModelProperty(value = "滑移")
private Float slip;
@ApiModelProperty(value = "变形半径")
private Float rdef;
@ApiModelProperty(value = "轧制角度")
private Float angle;
@ApiModelProperty(value = "中心流量")
private Float centerFlow;
@ApiModelProperty(value = "边缘流量")
private Float edgeFlow;
@ApiModelProperty(value = "中心压力")
private Float centerPress;
@ApiModelProperty(value = "边缘压力")
private Float edgePress;
@ApiModelProperty(value = "入口温度")
private Float entryTemp;
@ApiModelProperty(value = "出口温度")
private Float exitTemp;
@ApiModelProperty(value = "工作辊弯曲")
private Float wrbend;
@ApiModelProperty(value = "支撑辊弯曲")
private Float irbend;
@ApiModelProperty(value = "支撑辊位移")
private Float irshift;
@ApiModelProperty(value = "电机电流")
private Float motorCurrent;
@ApiModelProperty(value = "电机电压")
private Float motorVoltage;
@ApiModelProperty(value = "轧制扭矩")
private Float rollTorque;
@ApiModelProperty(value = "总轧制扭矩")
private Float totalRollTorque;
@ApiModelProperty(value = "电机扭矩")
private Float motorTorque;
@ApiModelProperty(value = "扭矩比")
private Float torqueRatio;
@ApiModelProperty(value = "比扭矩")
private Float specTorque;
@ApiModelProperty(value = "功率")
private Float power;
@ApiModelProperty(value = "负载比")
private Float loadRatio;
@ApiModelProperty(value = "计算ID 实际用的这个值")
private String calcId;
@ApiModelProperty(value = "记录插入时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime insdate;
@ApiModelProperty(value = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@ApiModelProperty(value = "更新时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}

View File

@@ -0,0 +1,30 @@
package com.fizz.business.form;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 状态变更form
*
* @author chenhao
* @date 2023/04/27
*/
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ChangePlanStatusForm implements Serializable {
@NotNull(message = "状态变更类型不能为空")
@ApiModelProperty("ONLINE-钢卷上线UNLOAD-手动卸卷PRODUCT-生产完成")
private String operation;
@NotNull(message = "计划id不能为空")
@ApiModelProperty("计划id集合")
private Long id;
}

View File

@@ -0,0 +1,25 @@
package com.fizz.business.form;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class CrmPdoExcoilForm {
@ApiModelProperty(value = "钢卷号")
private String encoilid;
@JsonFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty(value = "开始日期")
private LocalDateTime startDate;
@JsonFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty(value = "结束日期")
private LocalDateTime endDate;
}

View File

@@ -0,0 +1,27 @@
package com.fizz.business.form;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class ModSetupResultForm {
@ApiModelProperty(value = "钢卷ID")
private String coilId;
@ApiModelProperty(value = "钢种")
private String grade;
@ApiModelProperty(value = "道次号")
private Integer passId;
@ApiModelProperty(value = "退火厚度")
private Integer annealThick;
@ApiModelProperty(value = "入口厚度")
private Double entryThick;
@ApiModelProperty(value = "出口厚度")
private Double exitThick;
}

View File

@@ -0,0 +1,39 @@
package com.fizz.business.form;
import com.fizz.business.constants.enums.WebMatOperateEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 状态变更form
*
* @author chenhao
* @date 2023/04/27
*/
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WebOperateMatForm implements Serializable {
@NotNull(message = "操作不存在")
@ApiModelProperty("ONLINE-钢卷上线READY-回退PRODUCT-生成完成")
private WebMatOperateEnum operation;
@NotNull(message = "计划id不能为空")
@ApiModelProperty("计划id集合")
private Long id;
@NotBlank(message = "钢卷号不能为空")
@ApiModelProperty(value = "钢卷号")
private String entryMatId;
@ApiModelProperty(value = "计划号")
private String planNo;
}

View File

@@ -0,0 +1,10 @@
package com.fizz.business.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.fizz.business.domain.ModSetupResult;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ModSetupResultMapper extends BaseMapper<ModSetupResult> {
// 如果需要自定义查询或操作,可在此处添加相应的接口方法
}

View File

@@ -2,6 +2,7 @@ package com.fizz.business.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fizz.business.domain.CrmPdiPlan;
import com.fizz.business.form.ChangePlanStatusForm;
import com.fizz.business.form.PlanQueryForm;
import com.fizz.business.vo.CrmPdiPlanVO;
@@ -18,4 +19,6 @@ public interface CrmPdiPlanService extends IService<CrmPdiPlan> {
public boolean deleteCrmPdiPlan(List<Long> coilid);
public List<CrmPdiPlanVO> listAll(PlanQueryForm form);
CrmPdiPlanVO updateCrmPdiPlanById(ChangePlanStatusForm form);
}

View File

@@ -2,6 +2,7 @@ package com.fizz.business.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fizz.business.domain.CrmPdoExcoil;
import com.fizz.business.form.CrmPdoExcoilForm;
import java.util.List;
@@ -14,6 +15,6 @@ public interface CrmPdoExcoilService extends IService<CrmPdoExcoil> {
boolean deleteCrmPdoExcoil(String excoilid, Integer operid);
List<CrmPdoExcoil> listAll();
List<CrmPdoExcoil> listAll(CrmPdoExcoilForm form);
}

View File

@@ -0,0 +1,15 @@
package com.fizz.business.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fizz.business.domain.ModSetupResult;
import com.fizz.business.form.ModSetupResultForm;
import com.fizz.business.vo.ModSetupResultVO;
import java.util.List;
public interface ModSetupResultService extends IService<ModSetupResult> {
List<ModSetupResultVO> list(ModSetupResultForm form);
String calcSetup(ModSetupResultForm form);
// 可在此处添加自定义业务方法
}

View File

@@ -0,0 +1,15 @@
package com.fizz.business.service;
import com.fizz.business.form.WebOperateMatForm;
/**
* @author chenhao
* @date 2023/05/17
*/
public interface TrackService {
void operateMatWeb(WebOperateMatForm form);
void trUnload(WebOperateMatForm form);
}

View File

@@ -0,0 +1,44 @@
package com.fizz.business.service.client;
import com.fizz.business.form.ChangePlanStatusForm;
import com.fizz.business.service.CrmPdiPlanService;
import com.fizz.business.vo.CrmPdiPlanVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
* 计划执行接口
*
* @author chenhao
* @date 2023/05/17
*/
@Slf4j
@Component
public class PdiPlanClient {
@Resource
CrmPdiPlanService crmPdiPlanService;
public List<CrmPdiPlanVO> queryTrackPlanList() {
return null;
}
public CrmPdiPlanVO queryTrackPlanFirst() {
return null;
}
public CrmPdiPlanVO detail(Long planId) {
return null;
}
public CrmPdiPlanVO changeStatus(ChangePlanStatusForm form) {
return crmPdiPlanService.updateCrmPdiPlanById(form);
}
}

View File

@@ -0,0 +1,102 @@
package com.fizz.business.service.client;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.AbstractWebSocketHandler;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author chenhao
* @date 2023/05/19
*/
@Slf4j
@Component
public class TrackWsHandler extends AbstractWebSocketHandler {
private static final ConcurrentHashMap<String, Map<String, WebSocketSession>> clients = new ConcurrentHashMap<>();
/**
* socket 建立成功事件
*
* @param session
*/
@Override
public void afterConnectionEstablished(WebSocketSession session) {
try {
String sid = session.getId();
String type = (String) session.getAttributes().get("type");
Map<String, WebSocketSession> sessionMap = clients.get(type);
if (Objects.isNull(sessionMap)) {
sessionMap = new ConcurrentHashMap<>();
}
sessionMap.put(sid, session);
// 添加 session
clients.put(type, sessionMap);
log.info("[websocket]建立连接:{}", type + sid);
} catch (Exception e) {
log.error("[websocket]建立连接错误:{}", e.getMessage(), e);
}
}
/**
* 接收消息事件
*
* @param session
* @param message
* @throws Exception
*/
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String payload = message.getPayload();
log.info("[websocket]收到客户端[{}]的消息:{}", session.getAttributes().get("type") + "-" + session.getId(), payload);
// 心跳
if (payload.equals("ping")) {
session.sendMessage(new TextMessage("pong"));
}
}
/**
* socket 断开连接时
*
* @param session
* @param status
* @throws Exception
*/
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
onClose(session);
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
log.error("[websocket]连接异常:{}", session.getAttributes().get("type") + "-" + session.getId(), exception);
onClose(session);
}
public ConcurrentHashMap<String, Map<String, WebSocketSession>> getClients() {
return clients;
}
private void onClose(WebSocketSession session) {
try {
String sid = session.getId();
String type = (String) session.getAttributes().get("type");
if (clients.containsKey(type) && clients.get(type).containsKey(sid)) {
WebSocketSession webSocketSession = clients.get(type).remove(sid);
if (webSocketSession != null) {
webSocketSession.close();
}
}
log.info("[websocket]连接关闭:{}", type + "-" + sid);
} catch (Exception e) {
log.error("[websocket]连接关闭错误:{}", e.getMessage(), e);
}
}
}

View File

@@ -0,0 +1,25 @@
package com.fizz.business.service.impl;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* @author chenhao
* @date 2023/05/18
*/
@Component
public class BeanFactory implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
BeanFactory.applicationContext = applicationContext;
}
public static <T> T getBean(Class<T> var1, Object... var2) {
return applicationContext.getBean(var1, var2);
}
}

View File

@@ -1,9 +1,11 @@
package com.fizz.business.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fizz.business.domain.CrmPdiPlan;
import com.fizz.business.form.ChangePlanStatusForm;
import com.fizz.business.form.PlanQueryForm;
import com.fizz.business.mapper.CrmPdiPlanMapper;
import com.fizz.business.service.CrmPdiPlanService;
@@ -23,7 +25,15 @@ public class CrmPdiPlanServiceImpl extends ServiceImpl<CrmPdiPlanMapper, CrmPdiP
* @return 查询到的CrmPdiPlan对象
*/
public CrmPdiPlanVO getByCoilIdAndOperId(String coilid) {
QueryWrapper<CrmPdiPlan> queryWrapper = new QueryWrapper<>();
if (coilid.equals("online")){
queryWrapper.eq("STATUS", coilid);
CrmPdiPlan one = this.getOne(queryWrapper);
return BeanUtil.copyProperties(one, CrmPdiPlanVO.class);
}
queryWrapper.like("coilid", coilid);
CrmPdiPlan one = this.getOne(queryWrapper);
@@ -70,4 +80,17 @@ public class CrmPdiPlanServiceImpl extends ServiceImpl<CrmPdiPlanMapper, CrmPdiP
return BeanUtil.copyToList(this.list(), CrmPdiPlanVO.class);
}
@Override
public CrmPdiPlanVO updateCrmPdiPlanById(ChangePlanStatusForm form) {
CrmPdiPlan crmPdiPlan = this.getById(form.getId());
crmPdiPlan.setStatus(form.getOperation());
this.updateById(crmPdiPlan);
return BeanUtil.toBean(crmPdiPlan, CrmPdiPlanVO.class);
}
}

View File

@@ -3,8 +3,10 @@ package com.fizz.business.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fizz.business.domain.CrmPdoExcoil;
import com.fizz.business.form.CrmPdoExcoilForm;
import com.fizz.business.mapper.CrmPdoExcoilMapper;
import com.fizz.business.service.CrmPdoExcoilService;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -58,7 +60,16 @@ public class CrmPdoExcoilServiceImpl extends ServiceImpl<CrmPdoExcoilMapper, Crm
* 查询所有记录
* @return CrmPdoExcoil对象的列表
*/
public List<CrmPdoExcoil> listAll() {
return this.list();
public List<CrmPdoExcoil> listAll(CrmPdoExcoilForm form) {
QueryWrapper<CrmPdoExcoil> queryWrapper = new QueryWrapper<>();
if (!StringUtils.isEmpty(form.getEncoilid())){
queryWrapper.eq("exit_coilid", form.getEncoilid()).eq("encoilid", form.getEncoilid());
}
queryWrapper.ge("start_date", form.getStartDate() + "00:00:00");
queryWrapper.le("start_date", form.getStartDate() + "23:59:59");
return baseMapper.selectList(queryWrapper);
}
}

View File

@@ -0,0 +1,52 @@
package com.fizz.business.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fizz.business.domain.ModSetupResult;
import com.fizz.business.form.ModSetupResultForm;
import com.fizz.business.mapper.ModSetupResultMapper;
import com.fizz.business.service.ModSetupResultService;
import com.fizz.business.vo.ModSetupResultVO;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ModSetupResultServiceImpl extends ServiceImpl<ModSetupResultMapper, ModSetupResult> implements ModSetupResultService {
@Override
public List<ModSetupResultVO> list(ModSetupResultForm form) {
// 确保各个字段的非空验证
if (StringUtils.isEmpty(form.getGrade()) || form.getAnnealThick() == null ||
form.getEntryThick() == null || form.getExitThick() == null || form.getPassId() == null) {
throw new IllegalArgumentException("必要的字段缺失");
}
// 去除Double类型的字段的小数位
int annealThick = form.getAnnealThick();
int entryThick = form.getEntryThick().intValue(); // 去除小数位
int exitThick = form.getExitThick().intValue(); // 去除小数位
int passId = form.getPassId();
// 根据字段构建 calcId
String calcId = form.getGrade() + annealThick + entryThick + exitThick + passId;
// 实际查询代码(根据 calcId 查询数据)
// 这里假设查询方法为根据 calcId 查找结果
LambdaQueryWrapper<ModSetupResult> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ModSetupResult::getCalcId,calcId);
List<ModSetupResult> results = this.baseMapper.selectList(queryWrapper);
return BeanUtil.copyToList(results, ModSetupResultVO.class);
}
@Override
public String calcSetup(ModSetupResultForm form) {
return null;
}
}

View File

@@ -0,0 +1,68 @@
package com.fizz.business.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSON;
import com.fizz.business.domain.CrmPdiPlan;
import com.fizz.business.domain.CrmPdoExcoil;
import com.fizz.business.form.WebOperateMatForm;
import com.fizz.business.mapper.CrmPdiPlanMapper;
import com.fizz.business.service.CrmPdoExcoilService;
import com.fizz.business.service.TrackService;
import com.fizz.business.utils.CalcUtil;
import com.fizz.business.vo.Plan2PdoVO;
import com.ruoyi.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @author chenhao
* @date 2023/05/18
*/
@Slf4j
@Service
public class TrackServiceImpl implements TrackService {
@Resource
CrmPdiPlanMapper crmPdiPlanMapper;
@Resource
CrmPdoExcoilService crmPdoExcoilService;
@Override
public void operateMatWeb(WebOperateMatForm form) {
log.info("unitCode:{}, hand operate mat by Web: {}", form.getPlanNo(), JSON.toJSONString(form));
form.getOperation().operate(form);
}
@Override
public void trUnload(WebOperateMatForm form) {
if (StringUtils.compare(form.getOperation().getValue(),"PRODUCT") != 0) {
return;
}
CrmPdiPlan pdiPlan = crmPdiPlanMapper.selectById(form.getId());
Plan2PdoVO bean = BeanUtil.toBean(pdiPlan, Plan2PdoVO.class);
CrmPdoExcoil excoil = BeanUtil.toBean(bean, CrmPdoExcoil.class);
double calcCoilWeight = CalcUtil.calcCoilWeight(excoil.getExitLength(), excoil.getEntryThick(), excoil.getEntryWidth());
excoil.setCalcExitWeight(calcCoilWeight);
excoil.setMeasExitWeight(calcCoilWeight);
excoil.setHeadpos(0d);
excoil.setTailpos(excoil.getExitLength());
excoil.setSubid(1);
excoil.setOuterDiameter(Double.valueOf(bean.getEntryOuterDiameter()));
excoil.setStatus("PRODUCT");
crmPdoExcoilService.addCrmPdoExcoil(excoil);
}
}

View File

@@ -0,0 +1,53 @@
package com.fizz.business.utils;
import cn.hutool.core.util.NumberUtil;
import com.fizz.business.constants.CommonConstants;
/**
* @author chenhao
* @date 2023/05/15
*/
public class CalcUtil {
/**
* 计算带钢长度
*
* @param weight 重量[T]
* @param thick 厚度[mm]
* @param width 宽度[mm]
* @return 长度[m]
*/
public static double calcCoilLength(double weight, double thick, double width) {
double v = weight / (thick * width * CommonConstants.RO) * 1000 * 1000;
return NumberUtil.round(v, 0).doubleValue();
}
/**
* 计算带钢重量
*
* @param length 长度[m]
* @param thick 厚度[mm]
* @param width 宽度[mm]
* @return 重量[T]
*/
public static double calcCoilWeight(double length, double thick, double width) {
double v = thick * width * length * CommonConstants.RO / (1000 * 1000);
return NumberUtil.round(v, 3).doubleValue();
}
/**
* 计算钢卷外径
*
* @param weight 重量[T]
* @param width 宽度[mm]
* @param innerDiameter 内径[mm]
* @return 外径[mm]
*/
public static double calcOuterDiameter(double weight, double width, double innerDiameter) {
double innerRadius = (innerDiameter / 1000) / 2;
double v = 2 * Math.sqrt(((weight * 1000) / (width * CommonConstants.RO) + Math.PI * Math.pow(innerRadius, 2)) / Math.PI) * 1000;
return NumberUtil.round(v, 0).doubleValue();
}
}

View File

@@ -0,0 +1,48 @@
package com.fizz.business.utils;
import com.alibaba.druid.support.json.JSONUtils;
import com.fizz.business.constants.enums.WsTypeEnum;
import com.fizz.business.service.client.TrackWsHandler;
import com.fizz.business.vo.CrmPdiPlanVO;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.Map;
@Slf4j
@Component
public class WebSocketUtil {
private static TrackWsHandler trackWsHandler;
@Autowired
public void setTrackWsHandler(TrackWsHandler trackWsHandler) {
WebSocketUtil.trackWsHandler = trackWsHandler;
}
public static void sendMessage(WsTypeEnum type, String text) {
Map<String, WebSocketSession> clients = trackWsHandler.getClients().getOrDefault(type.name(), Maps.newConcurrentMap());
TextMessage message = new TextMessage(text);
clients.values().forEach(s -> {
try {
s.sendMessage(message);
// log.info("[websocket]向客户端[{}]推送消息:{}", type + "-" + s.getId(), text);
} catch (IOException e) {
log.error("[websocket]向客户端[{}]推送消息异常:{}", type + "-" + s.getId(), text);
}
});
}
public static void sendMatmapMsg(CrmPdiPlanVO crmPdiPlanVO) {
sendMessage(WsTypeEnum.valueOf(WsTypeEnum.track_matmap.getValue()), JSONUtils.toJSONString(crmPdiPlanVO));
}
}

View File

@@ -38,16 +38,16 @@ public class CrmPdiPlanVO {
private Integer annealThick;
@ApiModelProperty(value = "入口厚度")
private Float entryThick;
private Double entryThick;
@ApiModelProperty(value = "入口宽度")
private Float entryWidth;
private Double entryWidth;
@ApiModelProperty(value = "入口重量")
private Float entryWeight;
private Double entryWeight;
@ApiModelProperty(value = "入口长度")
private Float entryLength;
private Double entryLength;
@ApiModelProperty(value = "入口内径")
private Integer entryInnerDiameter;
@@ -68,34 +68,34 @@ public class CrmPdiPlanVO {
private Integer cutMode;
@ApiModelProperty(value = "出口重量1")
private Float exitValue1;
private Double exitValue1;
@ApiModelProperty(value = "出口重量2")
private Float exitValue2;
private Double exitValue2;
@ApiModelProperty(value = "出口重量3")
private Float exitValue3;
private Double exitValue3;
@ApiModelProperty(value = "出口重量4")
private Float exitValue4;
private Double exitValue4;
@ApiModelProperty(value = "出口重量5")
private Float exitValue5;
private Double exitValue5;
@ApiModelProperty(value = "出口重量6")
private Float exitValue6;
private Double exitValue6;
@ApiModelProperty(value = "出口重量")
private Float exitWeight;
private Double exitWeight;
@ApiModelProperty(value = "出口长度")
private Float exitLength;
private Double exitLength;
@ApiModelProperty(value = "出口厚度")
private Float exitThick;
private Double exitThick;
@ApiModelProperty(value = "出口宽度")
private Float exitWidth;
private Double exitWidth;
@ApiModelProperty(value = "钢种")
private String grade;
@@ -113,16 +113,16 @@ public class CrmPdiPlanVO {
private String planNo;
@ApiModelProperty(value = "压下率")
private Float reductionRate;
private Double reductionRate;
@ApiModelProperty(value = "热卷温度")
private Float hotCoilTemp;
private Double hotCoilTemp;
@ApiModelProperty(value = "厚度正偏差")
private Float entryThickMaxtol;
private Double entryThickMaxtol;
@ApiModelProperty(value = "厚度正偏差")
private Float entryThickMintol;
private Double entryThickMintol;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "计划日期")

View File

@@ -0,0 +1,118 @@
package com.fizz.business.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class ModSetupResultVO {
@ApiModelProperty(value = "自增主键")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty(value = "logid")
private Integer logId;
@ApiModelProperty(value = "钢卷ID")
private String coilId;
@ApiModelProperty(value = "道次号")
private Integer passId;
@ApiModelProperty(value = "入口厚度")
private Float entryThick;
@ApiModelProperty(value = "出口厚度")
private Float exitThick;
@ApiModelProperty(value = "压下率")
private Float reduction;
@ApiModelProperty(value = "入口张力")
private Float entryTension;
@ApiModelProperty(value = "出口张力")
private Float exitTension;
@ApiModelProperty(value = "入口应力")
private Float entryTenstress;
@ApiModelProperty(value = "出口应力")
private Float exitTenstress;
@ApiModelProperty(value = "速度比")
private Float speedFract;
@ApiModelProperty(value = "入口速度")
private Float entrySpeed;
@ApiModelProperty(value = "出口速度")
private Float exitSpeed;
@ApiModelProperty(value = "轧制速度")
private Float rollSpeed;
@ApiModelProperty(value = "轧制力")
private Float rollForce;
@ApiModelProperty(value = "轧辊间隙")
private Float rollgap;
@ApiModelProperty(value = "超出间隙")
private Float overgap;
@ApiModelProperty(value = "轧机刚度")
private Float millModulus;
@ApiModelProperty(value = "前滑")
private Float slip;
@ApiModelProperty(value = "工作辊弯辊力")
private Float wrbend;
@ApiModelProperty(value = "支撑辊弯辊力")
private Float irbend;
@ApiModelProperty(value = "轧制扭矩")
private Float rollTorque;
@ApiModelProperty(value = "总轧制扭矩")
private Float totalRollTorque;
@ApiModelProperty(value = "电机扭矩")
private Float motorTorque;
@ApiModelProperty(value = "扭矩比")
private Float torqueRatio;
@ApiModelProperty(value = "比扭矩")
private Float specTorque;
@ApiModelProperty(value = "功率")
private Float power;
@ApiModelProperty(value = "负载比")
private Float loadRatio;
@ApiModelProperty(value = "计算ID 实际用的这个值")
private String calcId;
@ApiModelProperty(value = "记录插入时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime insdate;
@ApiModelProperty(value = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@ApiModelProperty(value = "更新时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}

View File

@@ -0,0 +1,87 @@
package com.fizz.business.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class Plan2PdoVO {
@ApiModelProperty(value = "多火轧制次数")
private Integer operid;
@ApiModelProperty(value = "钢卷id")
private String coilid;
@ApiModelProperty(value = "热轧卷ID")
private String hotCoilid;
@ApiModelProperty(value = "道次数")
private Integer passno;
@ApiModelProperty(value = "退火厚度")
private Integer annealThick;
@ApiModelProperty(value = "入口厚度")
private Double entryThick;
@ApiModelProperty(value = "入口宽度")
private Double entryWidth;
@ApiModelProperty(value = "入口重量")
private Double entryWeight;
@ApiModelProperty(value = "入口长度")
private Double entryLength;
@ApiModelProperty(value = "入口内径")
private Integer entryInnerDiameter;
@ApiModelProperty(value = "入口外径")
private Integer entryOuterDiameter;
@ApiModelProperty(value = "出口卷号")
private String exitCoilid;
@ApiModelProperty(value = "下工序代码")
private String nextUnit;
@ApiModelProperty(value = "出口长度")
private Double exitLength;
@ApiModelProperty(value = "出口厚度")
private Double exitThick;
@ApiModelProperty(value = "出口宽度")
private Double exitWidth;
@ApiModelProperty(value = "钢种")
private String grade;
@ApiModelProperty(value = "屈服强度")
private Integer yieldStrength;
@ApiModelProperty(value = "抗拉强度")
private Integer tensileStrength;
@ApiModelProperty(value = "状态")
private String status;
@ApiModelProperty(value = "计划号")
private String planNo;
@ApiModelProperty(value = "压下率")
private Double reductionRate;
@ApiModelProperty(value = "热卷温度")
private Double hotCoilTemp;
}