写入功能完成

This commit is contained in:
2026-01-04 15:05:28 +08:00
parent 76ad6bcbd7
commit 8d8be94c2d
5 changed files with 131 additions and 0 deletions

View File

@@ -9,8 +9,11 @@ import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.fizz.business.domain.vo.FurnaceSendCoilInfoVO;
import com.fizz.business.domain.vo.SendJobLastSuccessVO;
import com.fizz.business.service.ISendJobQueryService;
import com.fizz.business.utils.RedisUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.annotation.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
@@ -87,4 +90,24 @@ public class SendJobController extends BaseController {
SendJobLastSuccessVO vo = sendJobQueryService.getLastSuccess(groupType);
return AjaxResult.success(vo);
}
/**
* 获取上次炉火写入的钢卷信息
* @return 上次写入的钢卷信息coilId、planId、sendTime
*/
@GetMapping("/furnace/lastCoilInfo")
public AjaxResult getLastFurnaceSendCoilInfo() {
try {
String jsonValue = RedisUtil.getValue("furnace:send:coil:info");
if (jsonValue == null || jsonValue.isEmpty()) {
return AjaxResult.success(null);
}
ObjectMapper objectMapper = new ObjectMapper();
FurnaceSendCoilInfoVO coilInfo = objectMapper.readValue(jsonValue, FurnaceSendCoilInfoVO.class);
return AjaxResult.success(coilInfo);
} catch (Exception e) {
return AjaxResult.error("获取上次炉火写入钢卷信息失败: " + e.getMessage());
}
}
}

View File

@@ -0,0 +1,22 @@
package com.fizz.business.domain.vo;
import lombok.Data;
import java.util.Date;
/**
* 炉火写入时的钢卷信息(存储到 Redis
*/
@Data
public class FurnaceSendCoilInfoVO {
/** 钢卷号 */
private String coilId;
/** 计划ID */
private String planId;
/** 写入时间 */
private Date sendTime;
}

View File

@@ -29,4 +29,10 @@ public interface CrmPdiPlanService extends IService<CrmPdiPlan> {
CrmPdiPlan getFirstUnProducedCoil();
void changeStatus(ChangePlanStatusForm build);
/**
* 获取当前正在线上的钢卷优先级ONLINE > PRODUCING > READY/NEW
* @return 当前正在线上的钢卷如果没有则返回null
*/
CrmPdiPlan getCurrentOnlineCoil();
}

View File

@@ -169,4 +169,45 @@ public class CrmPdiPlanServiceImpl extends ServiceImpl<CrmPdiPlanMapper, CrmPdiP
log.info("计划状态更新成功ID: {}, 新状态: {}", build.getId(), build.getOperation());
}
/**
* 获取当前正在线上的钢卷优先级ONLINE > PRODUCING > READY/NEW
* @return 当前正在线上的钢卷如果没有则返回null
*/
@Override
public CrmPdiPlan getCurrentOnlineCoil() {
// 1. 优先查找 PRODUCING 状态的钢卷
CrmPdiPlan producingPlan = this.lambdaQuery()
.eq(CrmPdiPlan::getStatus, "PRODUCING")
.orderByAsc(CrmPdiPlan::getSeqid)
.last("limit 1")
.one();
if (producingPlan != null) {
return producingPlan;
}
// 2. 其次查找 ONLINE 状态的钢卷
CrmPdiPlan onlinePlan = this.lambdaQuery()
.eq(CrmPdiPlan::getStatus, "ONLINE")
.orderByAsc(CrmPdiPlan::getSeqid)
.last("limit 1")
.one();
if (onlinePlan != null) {
return onlinePlan;
}
// 3. 最后查找 READY 或 NEW 状态的钢卷(按顺序号排序,取第一个)
CrmPdiPlan readyOrNewPlan = this.lambdaQuery()
.in(CrmPdiPlan::getStatus, "READY", "NEW")
.orderByAsc(CrmPdiPlan::getSeqid)
.last("limit 1")
.one();
return readyOrNewPlan;
}
}

View File

@@ -13,8 +13,13 @@ import com.fizz.business.domain.vo.SendJobItemVO;
import com.fizz.business.mapper.BizSendJobGroupMapper;
import com.fizz.business.mapper.BizSendJobItemMapper;
import com.fizz.business.mapper.BizSendJobMapper;
import com.fizz.business.domain.CrmPdiPlan;
import com.fizz.business.domain.vo.FurnaceSendCoilInfoVO;
import com.fizz.business.service.CrmPdiPlanService;
import com.fizz.business.service.ISendJobService;
import com.fizz.business.service.manager.OpcMessageIdsManager;
import com.fizz.business.utils.RedisUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
@@ -45,6 +50,11 @@ public class SendJobServiceImpl extends ServiceImpl<BizSendJobMapper, BizSendJob
@Autowired
private OpcMessageIdsManager opcMessageIdsManager;
@Autowired
private CrmPdiPlanService crmPdiPlanService;
private static final String REDIS_KEY_FURNACE_SEND_COIL_INFO = "furnace:send:coil:info";
@Override
@Transactional(rollbackFor = Exception.class)
public Integer createSendJob(SendJobCreateDTO dto) {
@@ -338,6 +348,35 @@ public class SendJobServiceImpl extends ServiceImpl<BizSendJobMapper, BizSendJob
finish.setRemark(allSuccess ? "全部发送成功" : "部分发送失败");
baseMapper.updateById(finish);
// 如果是炉火写入FURNACE获取当前正在线上的钢卷信息并存储到 Redis
try {
boolean isFurnaceSend = groups.stream()
.anyMatch(g -> "FURNACE".equalsIgnoreCase(g.getGroupType()));
if (isFurnaceSend && allSuccess) {
CrmPdiPlan currentCoil = crmPdiPlanService.getCurrentOnlineCoil();
if (currentCoil != null) {
FurnaceSendCoilInfoVO coilInfo = new FurnaceSendCoilInfoVO();
coilInfo.setCoilId(currentCoil.getCoilid());
coilInfo.setPlanId(currentCoil.getPlanid());
coilInfo.setSendTime(new Date());
// 存储到 Redis使用 JSON 格式)
ObjectMapper objectMapper = new ObjectMapper();
String jsonValue = objectMapper.writeValueAsString(coilInfo);
RedisUtil.setValue(REDIS_KEY_FURNACE_SEND_COIL_INFO, jsonValue);
log.info("炉火写入成功,已保存钢卷信息到 Redis: coilId={}, planId={}",
coilInfo.getCoilId(), coilInfo.getPlanId());
} else {
log.warn("炉火写入成功,但未找到当前正在线上的钢卷");
}
}
} catch (Exception e) {
log.error("保存炉火写入钢卷信息到 Redis 失败", e);
// 不影响主流程,只记录日志
}
return true;
}
}