写入功能完成

This commit is contained in:
2026-01-02 16:00:11 +08:00
parent 00154d29fa
commit ca91e43067

View File

@@ -4,17 +4,25 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fizz.business.domain.BizSendJob;
import com.fizz.business.domain.BizSendJobGroup;
import com.fizz.business.domain.BizSendJobItem;
import com.fizz.business.domain.CrmPdiPlan;
import com.fizz.business.domain.vo.BizSendTemplateItemVO;
import com.fizz.business.domain.vo.BizSendTemplateVO;
import com.fizz.business.domain.vo.SendJobLastSuccessVO;
import com.fizz.business.mapper.BizSendJobGroupMapper;
import com.fizz.business.mapper.BizSendJobItemMapper;
import com.fizz.business.mapper.BizSendJobMapper;
import com.fizz.business.mapper.CrmPdiPlanMapper;
import com.fizz.business.service.IBizSendTemplateService;
import com.fizz.business.service.ISendJobQueryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class SendJobQueryServiceImpl implements ISendJobQueryService {
@@ -28,50 +36,142 @@ public class SendJobQueryServiceImpl implements ISendJobQueryService {
@Autowired
private BizSendJobItemMapper itemMapper;
@Autowired
private IBizSendTemplateService templateService;
@Autowired
private CrmPdiPlanMapper planMapper;
@Override
public SendJobLastSuccessVO getLastSuccess(String groupType) {
// 1) 先找最近一次 COMPLETED 的 job倒序
BizSendJob lastJob = jobMapper.selectOne(
new LambdaQueryWrapper<BizSendJob>()
.eq(BizSendJob::getStatus, "COMPLETED")
.eq(BizSendJob::getGroupType, groupType)
.orderByDesc(BizSendJob::getFinishTime)
.last("LIMIT 1")
);
if (lastJob == null) {
return null;
// 如果找到了,直接返回上次成功的值
if (lastJob != null) {
List<BizSendJobGroup> groups = groupMapper.selectList(
new LambdaQueryWrapper<BizSendJobGroup>()
.eq(BizSendJobGroup::getJobId, lastJob.getJobId())
);
if (groups != null && !groups.isEmpty()) {
List<Integer> groupIds = groups.stream().map(BizSendJobGroup::getGroupId).collect(Collectors.toList());
List<BizSendJobItem> items = itemMapper.selectList(
new LambdaQueryWrapper<BizSendJobItem>()
.in(BizSendJobItem::getGroupId, groupIds)
.eq(BizSendJobItem::getResultStatus, "SUCCESS")
.orderByAsc(BizSendJobItem::getItemId)
);
Map<String, String> values = new HashMap<>();
for (BizSendJobItem it : items) {
if (it.getParamCode() == null) continue;
values.put(it.getParamCode(), it.getValueRaw());
}
SendJobLastSuccessVO vo = new SendJobLastSuccessVO();
vo.setJobId(lastJob.getJobId());
vo.setLastSendTime(lastJob.getFinishTime());
vo.setValues(values);
// 添加一个标志,告诉前端这是真实发送过的值
vo.setIsFromHistory(true);
return vo;
}
}
// 2) 找该 job 下对应 groupType 的 groups
List<BizSendJobGroup> groups = groupMapper.selectList(
new LambdaQueryWrapper<BizSendJobGroup>()
.eq(BizSendJobGroup::getJobId, lastJob.getJobId())
.eq(groupType != null && !groupType.trim().isEmpty(), BizSendJobGroup::getGroupType, groupType)
);
if (groups == null || groups.isEmpty()) {
return null;
// 2) 如果没找到,根据 groupType 返回模板或计划值
if ("FURNACE".equalsIgnoreCase(groupType)) {
return getFurnaceTemplateValues();
} else if ("DRIVE".equalsIgnoreCase(groupType)) {
return getDrivePlanValues();
}
List<Integer> groupIds = groups.stream().map(BizSendJobGroup::getGroupId).collect(java.util.stream.Collectors.toList());
return null; // 其他情况返回 null
}
// 3) 取这些 group 的 item按 paramCode 聚合最后一次值(同 paramCode 取最后一条 itemId 最大)
List<BizSendJobItem> items = itemMapper.selectList(
new LambdaQueryWrapper<BizSendJobItem>()
.in(BizSendJobItem::getGroupId, groupIds)
.eq(BizSendJobItem::getResultStatus, "SUCCESS")
.orderByAsc(BizSendJobItem::getItemId)
);
/**
* 获取炉火工艺模板的默认值
*/
private SendJobLastSuccessVO getFurnaceTemplateValues() {
// "FURNACE_DEFAULT" 是前端写死的模板编码
BizSendTemplateVO template = templateService.getTemplateWithItems("FURNACE_DEFAULT");
if (template == null || template.getItems() == null || template.getItems().isEmpty()) {
return createEmptyResponse("Furnace template 'FURNACE_DEFAULT' not found or is empty.");
}
Map<String, String> values = new HashMap<>();
for (BizSendJobItem it : items) {
if (it.getParamCode() == null) continue;
values.put(it.getParamCode(), it.getValueRaw());
for (BizSendTemplateItemVO item : template.getItems()) {
if (item.getEnabled() && item.getParamCode() != null) {
values.put(item.getParamCode(), item.getDefaultValueRaw());
}
}
SendJobLastSuccessVO vo = new SendJobLastSuccessVO();
vo.setJobId(lastJob.getJobId());
vo.setLastSendTime(lastJob.getFinishTime());
vo.setValues(values);
// 标志为非历史值
vo.setIsFromHistory(false);
return vo;
}
/**
* 获取当前计划的传动参数
*/
private SendJobLastSuccessVO getDrivePlanValues() {
// 优先找 PRODUCING 或 ONLINE 状态的计划,按更新时间倒序取最新的一个
CrmPdiPlan currentPlan = planMapper.selectOne(
new LambdaQueryWrapper<CrmPdiPlan>()
.in(CrmPdiPlan::getStatus, "PRODUCING", "ONLINE")
.orderByDesc(CrmPdiPlan::getUpdateTime)
.last("LIMIT 1")
);
// 如果没有正在生产的,就找第一个 READY 的计划
if (currentPlan == null) {
currentPlan = planMapper.selectOne(
new LambdaQueryWrapper<CrmPdiPlan>()
.eq(CrmPdiPlan::getStatus, "READY")
.orderByAsc(CrmPdiPlan::getSeqid)
.last("LIMIT 1")
);
}
if (currentPlan == null) {
return createEmptyResponse("No active or ready plan found.");
}
// 将 CrmPdiPlan 对象的字段反射为 Map
Map<String, String> values = new HashMap<>();
Field[] fields = CrmPdiPlan.class.getDeclaredFields();
for (Field field : fields) {
try {
field.setAccessible(true);
Object value = field.get(currentPlan);
if (value != null) {
values.put(field.getName(), String.valueOf(value));
}
} catch (IllegalAccessException e) {
// 忽略无法访问的字段
}
}
SendJobLastSuccessVO vo = new SendJobLastSuccessVO();
vo.setValues(values);
vo.setIsFromHistory(false); // 标志为非历史值
return vo;
}
/**
* 创建一个空的带消息的返回对象
*/
private SendJobLastSuccessVO createEmptyResponse(String message) {
SendJobLastSuccessVO vo = new SendJobLastSuccessVO();
vo.setValues(Collections.singletonMap("_message", message));
vo.setIsFromHistory(false);
return vo;
}
}