|
@@ -37,7 +37,11 @@ import org.jeecg.modules.billet.billetOriginalProductRecord.dto.BilletOriginalPr
|
|
|
import org.jeecg.modules.billet.billetOriginalProductRecord.dto.LengthCountQueryDTO;
|
|
|
import org.jeecg.modules.billet.billetOriginalProductRecord.dto.QualityInspectionQueryDTO;
|
|
|
import org.jeecg.modules.billet.billetOriginalProductRecord.entity.BilletOriginalProductRecord;
|
|
|
+import org.jeecg.modules.billet.billetOriginalProductRecord.entity.BilletOriginalProductRecordDl;
|
|
|
+import org.jeecg.modules.billet.billetOriginalProductRecord.entity.BilletOriginalProductRecordYyf;
|
|
|
+import org.jeecg.modules.billet.billetOriginalProductRecord.service.IBilletOriginalProductRecordDlService;
|
|
|
import org.jeecg.modules.billet.billetOriginalProductRecord.service.IBilletOriginalProductRecordService;
|
|
|
+import org.jeecg.modules.billet.billetOriginalProductRecord.service.IBilletOriginalProductRecordYyfService;
|
|
|
import org.jeecg.modules.billet.billetOriginalProductRecord.vo.*;
|
|
|
import org.jeecg.modules.billet.sampleCardDeliveryRecord.entity.SampleCardDeliveryRecord;
|
|
|
import org.jeecg.modules.billet.sampleCardDeliveryRecord.service.ISampleCardDeliveryRecordService;
|
|
@@ -112,6 +116,12 @@ public class BilletOriginalProductRecordController extends JeecgController<Bille
|
|
|
@Autowired
|
|
|
private ISampleCardDeliveryRecordService sampleCardDeliveryRecordService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private IBilletOriginalProductRecordDlService billetOriginalProductRecordDlService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IBilletOriginalProductRecordYyfService billetOriginalProductRecordYyfService;
|
|
|
+
|
|
|
/**
|
|
|
* 分页列表查询
|
|
|
*
|
|
@@ -2646,4 +2656,794 @@ public class BilletOriginalProductRecordController extends JeecgController<Bille
|
|
|
billetHotsendChangeShift.setOutCarNum(billetHotsendChangeShift.getOutCarNum() + 1);
|
|
|
billetHotsendChangeShiftService.updateById(billetHotsendChangeShift);
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ @ApiOperation(value="德龙钢坯原始生产记录查询", notes="德龙钢坯原始生产记录查询")
|
|
|
+ @GetMapping(value = "/queryBilletRecordByCcmNoDL")
|
|
|
+ public Result<BilletOriginalProductRecordDetail> queryBilletRecordByCcmNoDL(@RequestParam(name="ccmNo", required = false) String ccmNo,
|
|
|
+ @RequestParam(name="changeShiftId", required = false) String changeShiftId,
|
|
|
+ @RequestParam(name="queryType") String queryType) {
|
|
|
+ List<BilletOriginalProductRecordDl> billetOriginalProductRecordDls = new ArrayList<>();
|
|
|
+ BilletHotsendChangeShift billetHotsendChangeShift;
|
|
|
+ if ("1".equals(queryType)){
|
|
|
+ String classShiftGroup = String.format("class:shift:group:%s", ccmNo); // 班组
|
|
|
+ String classShift = String.format("class:shift:%s",ccmNo); // 班别
|
|
|
+ String shift = !oConvertUtils.getString(redisTemplate.opsForValue().get(classShift)).isEmpty() ? oConvertUtils.getString(redisTemplate.opsForValue().get(classShift)) : "";
|
|
|
+ String shiftGroup = !oConvertUtils.getString(redisTemplate.opsForValue().get(classShiftGroup)).isEmpty() ? oConvertUtils.getString(redisTemplate.opsForValue().get(classShiftGroup)) : "";
|
|
|
+
|
|
|
+ if (oConvertUtils.isEmpty(shiftGroup) || oConvertUtils.isEmpty(shift)){
|
|
|
+ return Result.error("班组班别获取为空,德龙钢坯原始生产记录查询失败!");
|
|
|
+ }
|
|
|
+ // 根据ccmNo、shift、shiftGroup查询最新的交班记录
|
|
|
+ LambdaQueryWrapper<BilletHotsendChangeShift> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ queryWrapper.eq(BilletHotsendChangeShift::getCcmNo, ccmNo)
|
|
|
+ .eq(BilletHotsendChangeShift::getShift, shift)
|
|
|
+ .eq(BilletHotsendChangeShift::getShiftGroup, shiftGroup)
|
|
|
+ .isNull(BilletHotsendChangeShift::getChangeShiftTime)
|
|
|
+ .orderByDesc(BilletHotsendChangeShift::getCreateTime)
|
|
|
+ .last("limit 1");
|
|
|
+ billetHotsendChangeShift = billetHotsendChangeShiftService.getOne(queryWrapper);
|
|
|
+ if (billetHotsendChangeShift == null){
|
|
|
+ log.info("{}{}", "德龙钢坯原始生产记录,交班记录为空!", ccmNo + "失败时间:" + new Date());
|
|
|
+ return Result.error("交班信息为空,德龙钢坯原始生产记录查询失败!");
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ billetHotsendChangeShift = billetHotsendChangeShiftService.getById(changeShiftId);
|
|
|
+ }
|
|
|
+ if (billetHotsendChangeShift == null) {
|
|
|
+ log.error("未查询到有效的交班记录,无法继续处理");
|
|
|
+ return Result.error("未找到对应的交班信息,德龙原始生产记录获取失败!");
|
|
|
+ }
|
|
|
+ //1、 获取当班浇筑炉次详细信息
|
|
|
+ List<HeatsActualsInfo> heatsActualsInfoList = queryCurrentHeatsActualsInfoDl(ccmNo, billetHotsendChangeShift.getShift(), billetHotsendChangeShift.getShiftGroup(),
|
|
|
+ billetHotsendChangeShift.getCreateTime(), billetHotsendChangeShift.getChangeShiftTime(), queryType);
|
|
|
+ if (oConvertUtils.listIsNotEmpty(heatsActualsInfoList)){
|
|
|
+ log.info("德龙原始生产记录,当班浇筑炉次数据信息: " + JSON.toJSON(heatsActualsInfoList));
|
|
|
+ //2、把获取到的当班浇筑炉次信息heatsActualsInfoList保存到原始生产记录表
|
|
|
+ heatsActualsInfoList.forEach(x -> {
|
|
|
+ BilletOriginalProductRecordDl billetOriginalProductRecord = new BilletOriginalProductRecordDl();
|
|
|
+ billetOriginalProductRecord.setId(String.valueOf(IdWorker.getId()));
|
|
|
+ billetOriginalProductRecord.setCcmNo(ccmNo);
|
|
|
+ billetOriginalProductRecord.setHeatNo(x.getHeatNo());
|
|
|
+ billetOriginalProductRecord.setShift(x.getShift());
|
|
|
+ billetOriginalProductRecord.setShiftGroup(x.getShiftGroup());
|
|
|
+ billetOriginalProductRecord.setGrade(x.getBrandNum());
|
|
|
+ billetOriginalProductRecord.setOneStrandSum(x.getOneSum());
|
|
|
+ billetOriginalProductRecord.setTwoStrandSum(x.getTwoSum());
|
|
|
+ billetOriginalProductRecord.setThreeStrandSum(x.getThreeSum());
|
|
|
+ billetOriginalProductRecord.setFourStrandSum(x.getFourSum());
|
|
|
+ billetOriginalProductRecord.setFiveStrandSum(x.getFiveSum());
|
|
|
+ billetOriginalProductRecord.setSixStrandSum(x.getSixSum());
|
|
|
+ billetOriginalProductRecord.setSevenStrandSum(x.getSevenSum());
|
|
|
+ billetOriginalProductRecord.setEightStrandSum(x.getEightSum());
|
|
|
+ billetOriginalProductRecord.setBrandNum(x.getBrandNum());
|
|
|
+ String totalInfoJson = x.getTotalInfo();
|
|
|
+ if (oConvertUtils.isEmpty(totalInfoJson)){
|
|
|
+ billetOriginalProductRecord.setAmount(0);// 合计
|
|
|
+ }else {
|
|
|
+ JSONObject json = JSON.parseObject(totalInfoJson);
|
|
|
+ Integer totalCount = json.getInteger("totalCount");
|
|
|
+ billetOriginalProductRecord.setAmount(totalCount);// 合计
|
|
|
+ }
|
|
|
+ billetOriginalProductRecord.setRollClubOneDetails(x.getDirectRolling());// 直轧热送棒一
|
|
|
+ billetOriginalProductRecord.setHotChargeLength(x.getHotCharge());
|
|
|
+ billetOriginalProductRecord.setStackLength(x.getStacking());
|
|
|
+ billetOriginalProductRecord.setLengthDetails(x.getLength());
|
|
|
+ billetOriginalProductRecord.setCreateTime(DateUtils.str2Date(x.getCreateTime(), DateUtils.datetimeFormat.get()));
|
|
|
+ billetOriginalProductRecord.setDeliveryTime(DateUtils.str2Date(x.getCreateTime(), DateUtils.datetimeFormat.get()));
|
|
|
+ billetOriginalProductRecord.setIsEditCharge("1");
|
|
|
+ billetOriginalProductRecordDls.add(billetOriginalProductRecord);
|
|
|
+ });
|
|
|
+ log.info("德龙钢坯原始生产记录信息: " + JSON.toJSON(billetOriginalProductRecordDls));
|
|
|
+
|
|
|
+ // 在批量保存前,过滤掉已存在的炉号记录
|
|
|
+ List<BilletOriginalProductRecordDl> finalRecords = billetOriginalProductRecordDls.stream()
|
|
|
+ .filter(record -> {
|
|
|
+ // 使用 getOne 方法检查是否存在相同记录(铸机号、炉号、班次、班组均相同)
|
|
|
+ LambdaQueryWrapper<BilletOriginalProductRecordDl> checkWrapper = new LambdaQueryWrapper<>();
|
|
|
+ checkWrapper.eq(BilletOriginalProductRecordDl::getCcmNo, record.getCcmNo())
|
|
|
+ .eq(BilletOriginalProductRecordDl::getHeatNo, record.getHeatNo())
|
|
|
+ .eq(BilletOriginalProductRecordDl::getShift, record.getShift())
|
|
|
+ .eq(BilletOriginalProductRecordDl::getShiftGroup, record.getShiftGroup())
|
|
|
+ .last("LIMIT 1"); // 只查询一条记录,提高性能
|
|
|
+ // 如果 getOne 结果为 null,表示记录不存在,保留该记录
|
|
|
+ return billetOriginalProductRecordDlService.getOne(checkWrapper, false) == null;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ if(oConvertUtils.listIsNotEmpty(finalRecords)){
|
|
|
+ try {
|
|
|
+ // 批量保存
|
|
|
+ billetOriginalProductRecordDlService.saveBatch(finalRecords);
|
|
|
+ } catch (DuplicateKeyException e) {
|
|
|
+ log.error("德龙炉号重复插入:{}", JSON.toJSONString(billetOriginalProductRecordDls), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ QueryWrapper<BilletOriginalProductRecordDl> queryWrapper3 = new QueryWrapper<>();
|
|
|
+ queryWrapper3.eq("ccm_no", ccmNo)
|
|
|
+ .eq("shift", billetHotsendChangeShift.getShift())
|
|
|
+ .eq("shift_group", billetHotsendChangeShift.getShiftGroup());
|
|
|
+ if ("1".equals(queryType)){
|
|
|
+ queryWrapper3.between("create_time", billetHotsendChangeShift.getCreateTime(), new Date());
|
|
|
+ }else {
|
|
|
+ queryWrapper3.between("create_time", billetHotsendChangeShift.getCreateTime(), billetHotsendChangeShift.getChangeShiftTime());
|
|
|
+ }
|
|
|
+ // 通过铸机号、班组、班别、交班开始时间 查询德龙钢坯生产原始记录
|
|
|
+ List<BilletOriginalProductRecordDl> billetOriginalProductRecordList = billetOriginalProductRecordDlService.list(queryWrapper3);
|
|
|
+ BilletOriginalProductRecordDetail billetOriginalProductRecordDetails = new BilletOriginalProductRecordDetail();
|
|
|
+ billetOriginalProductRecordDetails.setBilletOriginalProductRecordDlList(billetOriginalProductRecordList);
|
|
|
+ billetOriginalProductRecordDetails.setSizeInfo(billetHotsendChangeShift.getSizeInfo());
|
|
|
+ billetOriginalProductRecordDetails.setContent(billetHotsendChangeShift.getContent());
|
|
|
+ billetOriginalProductRecordDetails.setConfirmStatus(billetHotsendChangeShift.getConfirmStatus());
|
|
|
+ return Result.OK(billetOriginalProductRecordDetails);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @ApiOperation(value="粤裕丰钢坯原始生产记录查询", notes="粤裕丰钢坯原始生产记录查询")
|
|
|
+ @GetMapping(value = "/queryBilletRecordByCcmNoYyf")
|
|
|
+ public Result<BilletOriginalProductRecordDetail> queryBilletRecordByCcmNoYyf(@RequestParam(name="ccmNo", required = false) String ccmNo,
|
|
|
+ @RequestParam(name="changeShiftId", required = false) String changeShiftId,
|
|
|
+ @RequestParam(name="queryType") String queryType) {
|
|
|
+ List<BilletOriginalProductRecordYyf> billetOriginalProductRecordYyfs = new ArrayList<>();
|
|
|
+ BilletHotsendChangeShift billetHotsendChangeShift;
|
|
|
+ if ("1".equals(queryType)){
|
|
|
+ String classShiftGroup = String.format("class:shift:group:%s", ccmNo); // 班组
|
|
|
+ String classShift = String.format("class:shift:%s",ccmNo); // 班别
|
|
|
+ String shift = !oConvertUtils.getString(redisTemplate.opsForValue().get(classShift)).isEmpty() ? oConvertUtils.getString(redisTemplate.opsForValue().get(classShift)) : "";
|
|
|
+ String shiftGroup = !oConvertUtils.getString(redisTemplate.opsForValue().get(classShiftGroup)).isEmpty() ? oConvertUtils.getString(redisTemplate.opsForValue().get(classShiftGroup)) : "";
|
|
|
+
|
|
|
+ if (oConvertUtils.isEmpty(shiftGroup) || oConvertUtils.isEmpty(shift)){
|
|
|
+ return Result.error("班组班别获取为空,粤裕丰钢坯原始生产记录查询失败!");
|
|
|
+ }
|
|
|
+ // 根据ccmNo、shift、shiftGroup查询最新的交班记录
|
|
|
+ LambdaQueryWrapper<BilletHotsendChangeShift> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ queryWrapper.eq(BilletHotsendChangeShift::getCcmNo, ccmNo)
|
|
|
+ .eq(BilletHotsendChangeShift::getShift, shift)
|
|
|
+ .eq(BilletHotsendChangeShift::getShiftGroup, shiftGroup)
|
|
|
+ .isNull(BilletHotsendChangeShift::getChangeShiftTime)
|
|
|
+ .orderByDesc(BilletHotsendChangeShift::getCreateTime)
|
|
|
+ .last("limit 1");
|
|
|
+ billetHotsendChangeShift = billetHotsendChangeShiftService.getOne(queryWrapper);
|
|
|
+ if (billetHotsendChangeShift == null){
|
|
|
+ log.info("{}{}", "粤裕丰钢坯原始生产记录,交班记录为空!", ccmNo + "失败时间:" + new Date());
|
|
|
+ return Result.error("交班信息为空,粤裕丰钢坯原始生产记录查询失败!");
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ billetHotsendChangeShift = billetHotsendChangeShiftService.getById(changeShiftId);
|
|
|
+ }
|
|
|
+ if (billetHotsendChangeShift == null) {
|
|
|
+ log.error("未查询到有效的交班记录,无法继续处理");
|
|
|
+ return Result.error("未找到对应的交班信息,粤裕丰原始生产记录获取失败!");
|
|
|
+ }
|
|
|
+ //1、 获取当班浇筑炉次详细信息
|
|
|
+ List<HeatsActualsInfo> heatsActualsInfoList = queryCurrentHeatsActualsInfoYyf(ccmNo, billetHotsendChangeShift.getShift(), billetHotsendChangeShift.getShiftGroup(),
|
|
|
+ billetHotsendChangeShift.getCreateTime(), billetHotsendChangeShift.getChangeShiftTime(), queryType);
|
|
|
+ if (oConvertUtils.listIsNotEmpty(heatsActualsInfoList)){
|
|
|
+ log.info("粤裕丰原始生产记录,当班浇筑炉次数据信息: " + JSON.toJSON(heatsActualsInfoList));
|
|
|
+ //2、把获取到的当班浇筑炉次信息heatsActualsInfoList保存到原始生产记录表
|
|
|
+ heatsActualsInfoList.forEach(x -> {
|
|
|
+ BilletOriginalProductRecordYyf billetOriginalProductRecord = new BilletOriginalProductRecordYyf();
|
|
|
+ billetOriginalProductRecord.setId(String.valueOf(IdWorker.getId()));
|
|
|
+ billetOriginalProductRecord.setCcmNo(ccmNo);
|
|
|
+ billetOriginalProductRecord.setHeatNo(x.getHeatNo());
|
|
|
+ billetOriginalProductRecord.setShift(x.getShift());
|
|
|
+ billetOriginalProductRecord.setShiftGroup(x.getShiftGroup());
|
|
|
+ billetOriginalProductRecord.setGrade(x.getBrandNum());
|
|
|
+ billetOriginalProductRecord.setOneStrandSum(x.getOneSum());
|
|
|
+ billetOriginalProductRecord.setTwoStrandSum(x.getTwoSum());
|
|
|
+ billetOriginalProductRecord.setThreeStrandSum(x.getThreeSum());
|
|
|
+ billetOriginalProductRecord.setFourStrandSum(x.getFourSum());
|
|
|
+ billetOriginalProductRecord.setFiveStrandSum(x.getFiveSum());
|
|
|
+ billetOriginalProductRecord.setSixStrandSum(x.getSixSum());
|
|
|
+ billetOriginalProductRecord.setSevenStrandSum(x.getSevenSum());
|
|
|
+ billetOriginalProductRecord.setEightStrandSum(x.getEightSum());
|
|
|
+ billetOriginalProductRecord.setBrandNum(x.getBrandNum());
|
|
|
+ String totalInfoJson = x.getTotalInfo();
|
|
|
+ if (oConvertUtils.isEmpty(totalInfoJson)){
|
|
|
+ billetOriginalProductRecord.setAmount(0);// 合计
|
|
|
+ }else {
|
|
|
+ JSONObject json = JSON.parseObject(totalInfoJson);
|
|
|
+ Integer totalCount = json.getInteger("totalCount");
|
|
|
+ billetOriginalProductRecord.setAmount(totalCount);// 合计
|
|
|
+ }
|
|
|
+ billetOriginalProductRecord.setRollClubOneDetails(x.getDirectRolling());// 直轧热送棒一
|
|
|
+ billetOriginalProductRecord.setHotChargeLength(x.getHotCharge());
|
|
|
+ billetOriginalProductRecord.setStackLength(x.getStacking());
|
|
|
+ billetOriginalProductRecord.setLengthDetails(x.getLength());
|
|
|
+ billetOriginalProductRecord.setCreateTime(DateUtils.str2Date(x.getCreateTime(), DateUtils.datetimeFormat.get()));
|
|
|
+ billetOriginalProductRecord.setDeliveryTime(DateUtils.str2Date(x.getCreateTime(), DateUtils.datetimeFormat.get()));
|
|
|
+ billetOriginalProductRecord.setIsEditCharge("1");
|
|
|
+ billetOriginalProductRecordYyfs.add(billetOriginalProductRecord);
|
|
|
+ });
|
|
|
+ log.info("粤裕丰钢坯原始生产记录信息: " + JSON.toJSON(billetOriginalProductRecordYyfs));
|
|
|
+
|
|
|
+ // 在批量保存前,过滤掉已存在的炉号记录
|
|
|
+ List<BilletOriginalProductRecordYyf> finalRecords = billetOriginalProductRecordYyfs.stream()
|
|
|
+ .filter(record -> {
|
|
|
+ // 使用 getOne 方法检查是否存在相同记录(铸机号、炉号、班次、班组均相同)
|
|
|
+ LambdaQueryWrapper<BilletOriginalProductRecordYyf> checkWrapper = new LambdaQueryWrapper<>();
|
|
|
+ checkWrapper.eq(BilletOriginalProductRecordYyf::getCcmNo, record.getCcmNo())
|
|
|
+ .eq(BilletOriginalProductRecordYyf::getHeatNo, record.getHeatNo())
|
|
|
+ .eq(BilletOriginalProductRecordYyf::getShift, record.getShift())
|
|
|
+ .eq(BilletOriginalProductRecordYyf::getShiftGroup, record.getShiftGroup())
|
|
|
+ .last("LIMIT 1"); // 只查询一条记录,提高性能
|
|
|
+ // 如果 getOne 结果为 null,表示记录不存在,保留该记录
|
|
|
+ return billetOriginalProductRecordYyfService.getOne(checkWrapper, false) == null;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ if(oConvertUtils.listIsNotEmpty(finalRecords)){
|
|
|
+ try {
|
|
|
+ // 批量保存
|
|
|
+ billetOriginalProductRecordYyfService.saveBatch(finalRecords);
|
|
|
+ } catch (DuplicateKeyException e) {
|
|
|
+ log.error("粤裕丰炉号重复插入:{}", JSON.toJSONString(billetOriginalProductRecordYyfs), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ QueryWrapper<BilletOriginalProductRecordYyf> queryWrapper3 = new QueryWrapper<>();
|
|
|
+ queryWrapper3.eq("ccm_no", ccmNo)
|
|
|
+ .eq("shift", billetHotsendChangeShift.getShift())
|
|
|
+ .eq("shift_group", billetHotsendChangeShift.getShiftGroup());
|
|
|
+ if ("1".equals(queryType)){
|
|
|
+ queryWrapper3.between("create_time", billetHotsendChangeShift.getCreateTime(), new Date());
|
|
|
+ }else {
|
|
|
+ queryWrapper3.between("create_time", billetHotsendChangeShift.getCreateTime(), billetHotsendChangeShift.getChangeShiftTime());
|
|
|
+ }
|
|
|
+ // 通过铸机号、班组、班别、交班开始时间 查询德龙钢坯生产原始记录
|
|
|
+ List<BilletOriginalProductRecordYyf> billetOriginalProductRecordList = billetOriginalProductRecordYyfService.list(queryWrapper3);
|
|
|
+ BilletOriginalProductRecordDetail billetOriginalProductRecordDetails = new BilletOriginalProductRecordDetail();
|
|
|
+ billetOriginalProductRecordDetails.setBilletOriginalProductRecordYyfList(billetOriginalProductRecordList);
|
|
|
+ billetOriginalProductRecordDetails.setSizeInfo(billetHotsendChangeShift.getSizeInfo());
|
|
|
+ billetOriginalProductRecordDetails.setContent(billetHotsendChangeShift.getContent());
|
|
|
+ billetOriginalProductRecordDetails.setConfirmStatus(billetHotsendChangeShift.getConfirmStatus());
|
|
|
+ return Result.OK(billetOriginalProductRecordDetails);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 德龙原始生产记录
|
|
|
+ * @param ccmNo
|
|
|
+ * @param shift
|
|
|
+ * @param shiftGroup
|
|
|
+ * @param shiftStartTime
|
|
|
+ * @param shiftEndTime
|
|
|
+ * @param queryType
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private List<HeatsActualsInfo> queryCurrentHeatsActualsInfoDl(String ccmNo, String shift, String shiftGroup, Date shiftStartTime, Date shiftEndTime, String queryType) {
|
|
|
+ List<HeatsActualsInfo> heatsActualsInfoList = new ArrayList<>();
|
|
|
+ //根据ccmNo、shift、shiftGroup、大于billetHotsendChangeShift的创建时间 查询所有炉次传递单BilletHotsend
|
|
|
+ LambdaQueryWrapper<BilletHotsend> queryWrapper1 = new LambdaQueryWrapper<>();
|
|
|
+ queryWrapper1.eq(BilletHotsend::getCcmNo, ccmNo)
|
|
|
+ .eq(BilletHotsend::getShift, shift)
|
|
|
+ .eq(BilletHotsend::getShiftGroup, shiftGroup);
|
|
|
+ if ("1".equals(queryType)){
|
|
|
+ queryWrapper1.between(BilletHotsend::getCreateTime, shiftStartTime, new Date());
|
|
|
+ }else {
|
|
|
+ queryWrapper1.between(BilletHotsend::getCreateTime, shiftStartTime, shiftEndTime);
|
|
|
+ }
|
|
|
+ //过滤从原始记录中删除的炉号
|
|
|
+ queryWrapper1.and(wrapper ->
|
|
|
+ wrapper.ne(BilletHotsend::getDeleteStatus, 1)
|
|
|
+ .or()
|
|
|
+ .isNull(BilletHotsend::getDeleteStatus)
|
|
|
+ );
|
|
|
+ queryWrapper1.orderByDesc(BilletHotsend::getCreateTime);
|
|
|
+ List<BilletHotsend> billetHotsendList = billetHotsendBaseService.list(queryWrapper1);
|
|
|
+ if (oConvertUtils.listIsEmpty(billetHotsendList)){
|
|
|
+ log.info("{}{}", "钢坯原始生产记录查询失败,炉次传递单为空!", ccmNo + "失败时间:" + new Date());
|
|
|
+ return heatsActualsInfoList;
|
|
|
+ }
|
|
|
+ List<String> distinctHeatNoList = billetHotsendList.stream()
|
|
|
+ .map(BilletHotsend::getHeatNo) // 提取炉号
|
|
|
+ .filter(Objects::nonNull) // 过滤可能的 null 值
|
|
|
+ .distinct() // 去重
|
|
|
+ .collect(Collectors.toList()); // 转为列表
|
|
|
+ List<BilletHotsend> filteredBilletHotsendList = new ArrayList<>();
|
|
|
+ // 根据铸机号、班别、班别、炉号查询钢坯原始生产记录
|
|
|
+ QueryWrapper<BilletOriginalProductRecordDl> queryWrapper8 = new QueryWrapper<>();
|
|
|
+ queryWrapper8.eq("ccm_no", ccmNo)
|
|
|
+ .eq("shift", shift)
|
|
|
+ .eq("shift_group", shiftGroup)
|
|
|
+ .in("heat_no", distinctHeatNoList)
|
|
|
+ .orderByDesc("create_time");
|
|
|
+ List<BilletOriginalProductRecordDl> billetOriginalProductRecordList = billetOriginalProductRecordDlService.list(queryWrapper8);
|
|
|
+ if (oConvertUtils.listIsNotEmpty(billetOriginalProductRecordList)){
|
|
|
+ List<String> distinctOriginalProductRecordHeatNoList = billetOriginalProductRecordList.stream()
|
|
|
+ .map(BilletOriginalProductRecordDl::getHeatNo) // 提取炉号
|
|
|
+ .filter(Objects::nonNull) // 过滤可能的 null 值
|
|
|
+ .distinct() // 去重
|
|
|
+ .collect(Collectors.toList()); // 转为列表
|
|
|
+ // 2. 将炉号列表转换为 Set 以提高查询效率
|
|
|
+ Set<String> excludeHeatNos = new HashSet<>(distinctOriginalProductRecordHeatNoList);
|
|
|
+ // 3. 过滤 billetHotsendList,保留炉号不在 excludeHeatNos 中的记录
|
|
|
+ filteredBilletHotsendList = billetHotsendList.stream()
|
|
|
+ .filter(item -> {
|
|
|
+ String heatNo = item.getHeatNo();
|
|
|
+ // 保留 heatNo 为空或不在 excludeHeatNos 中的记录
|
|
|
+ return heatNo == null || !excludeHeatNos.contains(heatNo);
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ // 4. 同步原始钢坯生产记录表中存在的炉号信息(热装hotChargeLength字段)
|
|
|
+ billetOriginalProductRecordList.forEach(x -> {
|
|
|
+ // 查询装运单打印表最新的数据,获取热装定尺
|
|
|
+ String shiftAndShiftGroup = x.getShift() + "/" + x.getShiftGroup();
|
|
|
+ String heatNo = x.getHeatNo();
|
|
|
+ // 构建安全的 JSON 路径表达式
|
|
|
+ String jsonPath = "$.\"" + heatNo + "\"";
|
|
|
+ List<StorageBillPrint> storageBillPrintList = storageBillPrintService.list(
|
|
|
+ new QueryWrapper<StorageBillPrint>()
|
|
|
+ .lambda()
|
|
|
+ .eq(StorageBillPrint::getCcmNo, x.getCcmNo())
|
|
|
+ .eq(StorageBillPrint::getClasses, shiftAndShiftGroup) // 新增的条件
|
|
|
+ .apply("JSON_EXTRACT(heat_no, '" + jsonPath + "') IS NOT NULL")
|
|
|
+ );
|
|
|
+ // 如果装运单打印表数据不为空,并且热装字段已经被编辑过,就不在实时读取装运打印表的实时热装数据
|
|
|
+ if (oConvertUtils.listIsNotEmpty(storageBillPrintList) && "1".equals(x.getIsEditCharge())){
|
|
|
+ List<Map<String, Object>> finalResult = handleStorageBillPrintHotCharge(storageBillPrintList, heatNo);
|
|
|
+ x.setHotChargeLength(JSON.toJSONString(finalResult));
|
|
|
+ billetOriginalProductRecordDlService.updateById(x);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }else {
|
|
|
+ filteredBilletHotsendList = billetHotsendList;
|
|
|
+ }
|
|
|
+ // 查询当班炉次浇筑时,增量查询
|
|
|
+ filteredBilletHotsendList.forEach(x -> {
|
|
|
+ HeatsActualsInfo heatsActualsInfo = new HeatsActualsInfo();
|
|
|
+ heatsActualsInfo.setCreateTime(DateUtils.date2Str(x.getCreateTime(), DateUtils.datetimeFormat.get()));
|
|
|
+ heatsActualsInfo.setShiftGroup(x.getShiftGroup());
|
|
|
+ heatsActualsInfo.setShift(x.getShift());
|
|
|
+ heatsActualsInfo.setHeatNo(x.getHeatNo());
|
|
|
+ heatsActualsInfo.setBrandNum(x.getBrandNum());// 牌号 钢种
|
|
|
+ // 根据铸机号、炉号查询钢坯实绩信息BilletBasicInfo
|
|
|
+ LambdaQueryWrapper<BilletBasicInfo> queryWrapper2 = new LambdaQueryWrapper<>();
|
|
|
+ queryWrapper2.eq(BilletBasicInfo::getCcmNo, x.getCcmNo())
|
|
|
+ .eq(BilletBasicInfo::getHeatNo, x.getHeatNo())
|
|
|
+ .eq(BilletBasicInfo::getShift, x.getShift())
|
|
|
+ .eq(BilletBasicInfo::getShiftGroup, x.getShiftGroup());
|
|
|
+ List<BilletBasicInfo> billetBasicInfoList = billetBasicInfoService.list(queryWrapper2);
|
|
|
+ if (oConvertUtils.listIsEmpty(billetBasicInfoList)){
|
|
|
+ log.info("{}{}", "钢坯原始生产记录,该炉对应的钢坯实绩不存在:", x.getHeatNo());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 统计各流号的数量
|
|
|
+ Map<Integer, Long> strandCountMap = billetBasicInfoList.stream()
|
|
|
+ .filter(info -> info.getStrandNo() != null && info.getStrandNo() >= 1 && info.getStrandNo() <= 8)
|
|
|
+ .collect(Collectors.groupingBy(BilletBasicInfo::getStrandNo, Collectors.counting()));
|
|
|
+
|
|
|
+ // 获取StrandNo等于1的所有定尺length,并去重后用逗号连接
|
|
|
+ heatsActualsInfo.setOneStrandNo(Math.toIntExact(strandCountMap.getOrDefault(1, 0L)));
|
|
|
+ List<BilletBasicInfo> strandOneData = filterByStrandNo(billetBasicInfoList,1);
|
|
|
+ heatsActualsInfo.setOneLength(JSON.toJSONString(groupByLength(strandOneData)));
|
|
|
+ heatsActualsInfo.setOneSum(strandOneData.size());
|
|
|
+
|
|
|
+ heatsActualsInfo.setTwoStrandNo(Math.toIntExact(strandCountMap.getOrDefault(2, 0L)));
|
|
|
+ List<BilletBasicInfo> strandTwoData = filterByStrandNo(billetBasicInfoList,2);
|
|
|
+ heatsActualsInfo.setTwoLength(JSON.toJSONString(groupByLength(strandTwoData)));
|
|
|
+ heatsActualsInfo.setTwoSum(strandTwoData.size());
|
|
|
+
|
|
|
+ heatsActualsInfo.setThreeStrandNo(Math.toIntExact(strandCountMap.getOrDefault(3, 0L)));
|
|
|
+ List<BilletBasicInfo> strandThreeData = filterByStrandNo(billetBasicInfoList,3);
|
|
|
+ heatsActualsInfo.setThreeLength(JSON.toJSONString(groupByLength(strandThreeData)));
|
|
|
+ heatsActualsInfo.setThreeSum(strandThreeData.size());
|
|
|
+
|
|
|
+ heatsActualsInfo.setFourStrandNo(Math.toIntExact(strandCountMap.getOrDefault(4, 0L)));
|
|
|
+ List<BilletBasicInfo> strandFourData = filterByStrandNo(billetBasicInfoList,4);
|
|
|
+ heatsActualsInfo.setFourLength(JSON.toJSONString(groupByLength(strandFourData)));
|
|
|
+ heatsActualsInfo.setFourSum(strandFourData.size());
|
|
|
+
|
|
|
+ heatsActualsInfo.setFiveStrandNo(Math.toIntExact(strandCountMap.getOrDefault(5, 0L)));
|
|
|
+ List<BilletBasicInfo> strandFiveData = filterByStrandNo(billetBasicInfoList,5);
|
|
|
+ heatsActualsInfo.setFiveLength(JSON.toJSONString(groupByLength(strandFiveData)));
|
|
|
+ heatsActualsInfo.setFiveSum(strandFiveData.size());
|
|
|
+
|
|
|
+ heatsActualsInfo.setSixStrandNo(Math.toIntExact(strandCountMap.getOrDefault(6, 0L)));
|
|
|
+ List<BilletBasicInfo> strandSixData = filterByStrandNo(billetBasicInfoList,6);
|
|
|
+ heatsActualsInfo.setSixLength(JSON.toJSONString(groupByLength(strandSixData)));
|
|
|
+ heatsActualsInfo.setSixSum(strandSixData.size());
|
|
|
+
|
|
|
+ heatsActualsInfo.setSevenStrandNo(Math.toIntExact(strandCountMap.getOrDefault(7, 0L)));
|
|
|
+ List<BilletBasicInfo> strandSevenData = filterByStrandNo(billetBasicInfoList,7);
|
|
|
+ heatsActualsInfo.setSevenLength(JSON.toJSONString(groupByLength(strandSevenData)));
|
|
|
+ heatsActualsInfo.setSevenSum(strandSevenData.size());
|
|
|
+
|
|
|
+ heatsActualsInfo.setEightStrandNo(Math.toIntExact(strandCountMap.getOrDefault(8, 0L)));
|
|
|
+ List<BilletBasicInfo> strandEightData = filterByStrandNo(billetBasicInfoList,8);
|
|
|
+ heatsActualsInfo.setEightLength(JSON.toJSONString(groupByLength(strandEightData)));
|
|
|
+ heatsActualsInfo.setEightSum(strandEightData.size());
|
|
|
+
|
|
|
+ // 5#直轧棒一、6#热送高线 过滤并计算
|
|
|
+ List<BilletBasicInfo> filterDirectRollingList = billetBasicInfoList.stream()
|
|
|
+ .filter(info -> "roll_club_one".equals(info.getBelongTable()) || "roll_height".equals(info.getBelongTable()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ if (oConvertUtils.listIsNotEmpty(filterDirectRollingList)){
|
|
|
+ // 计算总重(保留4位小数)
|
|
|
+ double totalWeight = filterDirectRollingList.stream()
|
|
|
+ .mapToDouble(BilletBasicInfo::getBilletWeight)
|
|
|
+ .sum();
|
|
|
+ totalWeight = Math.round(totalWeight * 10000) / 10000.0;
|
|
|
+
|
|
|
+ // 统计总数
|
|
|
+ int totalCount = filterDirectRollingList.size();
|
|
|
+
|
|
|
+ // 按定尺 length 分组统计每组数量(Long 类型)
|
|
|
+ Map<Integer, Long> lengthCountMapRaw = filterDirectRollingList.stream()
|
|
|
+ .filter(info -> info.getLength() != null)
|
|
|
+ .collect(Collectors.groupingBy(BilletBasicInfo::getLength, Collectors.counting()));
|
|
|
+
|
|
|
+ // 转换为 Map<String, Long>,确保 JSON key 是字符串
|
|
|
+ Map<String, Long> lengthCountMap = lengthCountMapRaw.entrySet().stream()
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ e -> String.valueOf(e.getKey()), // key 转字符串
|
|
|
+ Map.Entry::getValue
|
|
|
+ ));
|
|
|
+
|
|
|
+ // 转为JSON字符串
|
|
|
+ Map<String, Object> directRollingMap = new HashMap<>();
|
|
|
+ directRollingMap.put("directRollingTotalWeight", totalWeight);
|
|
|
+ directRollingMap.put("directRollingTotalCount", totalCount);
|
|
|
+ directRollingMap.put("lengthGroupCount", lengthCountMap); // 定尺统计结果
|
|
|
+ String jsonResult = JSON.toJSONString(directRollingMap); // 使用FastJSON转换.
|
|
|
+ heatsActualsInfo.setDirectRolling(jsonResult);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 堆垛过滤并计算
|
|
|
+ List<BilletBasicInfo> filterStackList = billetBasicInfoList.stream()
|
|
|
+ .filter(info -> "stacking_and_loading_vehicles".equals(info.getBelongTable()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ if (oConvertUtils.listIsNotEmpty(filterStackList)){
|
|
|
+ // 按定尺长度和所属对应ID分组
|
|
|
+ Map<String, List<BilletBasicInfo>> lengthAndBhtcGroupMap = filterStackList.stream()
|
|
|
+ .filter(info -> info.getLength() != null && info.getBhtcId() != null)
|
|
|
+ .collect(Collectors.groupingBy(info ->
|
|
|
+ info.getLength() + "_" + info.getBhtcId()
|
|
|
+ ));
|
|
|
+
|
|
|
+ // 构建分组统计结果列表
|
|
|
+ List<Map<String, Object>> lengthGroupList = new ArrayList<>();
|
|
|
+
|
|
|
+ for (Map.Entry<String, List<BilletBasicInfo>> entry : lengthAndBhtcGroupMap.entrySet()) {
|
|
|
+ String key = entry.getKey();
|
|
|
+ List<BilletBasicInfo> billets = entry.getValue();
|
|
|
+
|
|
|
+ // 解析分组键获取定尺长度和BhtcId
|
|
|
+ String[] parts = key.split("_");
|
|
|
+ Integer length = Integer.parseInt(parts[0]);
|
|
|
+ String bhtcId = parts[1];
|
|
|
+
|
|
|
+ // 计算该分组的总重(保留4位小数)
|
|
|
+ double lengthWeight = billets.stream().mapToDouble(BilletBasicInfo::getBilletWeight).sum();
|
|
|
+
|
|
|
+ lengthWeight = Math.round(lengthWeight * 10000) / 10000.0;
|
|
|
+
|
|
|
+ // 统计该分组的数量
|
|
|
+ int lengthCount = billets.size();
|
|
|
+
|
|
|
+ // 构建该分组的统计结果
|
|
|
+ Map<String, Object> lengthStat = new HashMap<>();
|
|
|
+ lengthStat.put("stackingWeight", lengthWeight);
|
|
|
+ lengthStat.put("stackingCount", lengthCount);
|
|
|
+ lengthStat.put("stackingLength", length);
|
|
|
+ lengthStat.put("stackingBhtcId", bhtcId);
|
|
|
+
|
|
|
+ // 添加到结果列表
|
|
|
+ lengthGroupList.add(lengthStat);
|
|
|
+ }
|
|
|
+ // 直接将列表转换为JSON
|
|
|
+ String jsonResult = JSON.toJSONString(lengthGroupList);
|
|
|
+ heatsActualsInfo.setStacking(jsonResult);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 根据铸机号、炉号、班组、班别查询装运单打印表
|
|
|
+ String shiftAndShiftGroup = x.getShift() + "/" + x.getShiftGroup();
|
|
|
+ String heatNo = x.getHeatNo();
|
|
|
+ // 构建安全的 JSON 路径表达式
|
|
|
+ String jsonPath = "$.\"" + heatNo + "\"";
|
|
|
+ List<StorageBillPrint> storageBillPrintList = storageBillPrintService.list(
|
|
|
+ new QueryWrapper<StorageBillPrint>()
|
|
|
+ .lambda()
|
|
|
+ .eq(StorageBillPrint::getCcmNo, x.getCcmNo())
|
|
|
+ .eq(StorageBillPrint::getClasses, shiftAndShiftGroup) // 新增的条件
|
|
|
+ .apply("JSON_EXTRACT(heat_no, '" + jsonPath + "') IS NOT NULL")
|
|
|
+ );
|
|
|
+ if (oConvertUtils.listIsNotEmpty(storageBillPrintList)){
|
|
|
+ List<Map<String, Object>> finalResult = handleStorageBillPrintHotCharge(storageBillPrintList, heatNo);
|
|
|
+ // 使用结果...
|
|
|
+ log.info("钢坯原始记录,热装打印表分组统计结果: {}", JSON.toJSONString(finalResult));
|
|
|
+ heatsActualsInfo.setHotCharge(JSON.toJSONString(finalResult));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 统计总数
|
|
|
+ long totalCount = billetBasicInfoList.size();
|
|
|
+
|
|
|
+ // 计算总重(保留4位小数)
|
|
|
+ double totalWeight = billetBasicInfoList.stream()
|
|
|
+ .mapToDouble(BilletBasicInfo::getBilletWeight)
|
|
|
+ .sum();
|
|
|
+ totalWeight = Math.round(totalWeight * 10000) / 10000.0;
|
|
|
+
|
|
|
+ // 转为JSON字符串
|
|
|
+ Map<String, Object> resultMap = new HashMap<>();
|
|
|
+ resultMap.put("totalCount", totalCount);
|
|
|
+ resultMap.put("totalWeight", totalWeight);
|
|
|
+ String sumJsonResult = JSON.toJSONString(resultMap); // 使用FastJSON转换
|
|
|
+ heatsActualsInfo.setTotalInfo(sumJsonResult);
|
|
|
+
|
|
|
+ heatsActualsInfoList.add(heatsActualsInfo);
|
|
|
+ });
|
|
|
+ return heatsActualsInfoList;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 粤裕丰 原始生产记录
|
|
|
+ * @param ccmNo
|
|
|
+ * @param shift
|
|
|
+ * @param shiftGroup
|
|
|
+ * @param shiftStartTime
|
|
|
+ * @param shiftEndTime
|
|
|
+ * @param queryType
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private List<HeatsActualsInfo> queryCurrentHeatsActualsInfoYyf(String ccmNo, String shift, String shiftGroup, Date shiftStartTime, Date shiftEndTime, String queryType) {
|
|
|
+ List<HeatsActualsInfo> heatsActualsInfoList = new ArrayList<>();
|
|
|
+ //根据ccmNo、shift、shiftGroup、大于billetHotsendChangeShift的创建时间 查询所有炉次传递单BilletHotsend
|
|
|
+ LambdaQueryWrapper<BilletHotsend> queryWrapper1 = new LambdaQueryWrapper<>();
|
|
|
+ queryWrapper1.eq(BilletHotsend::getCcmNo, ccmNo)
|
|
|
+ .eq(BilletHotsend::getShift, shift)
|
|
|
+ .eq(BilletHotsend::getShiftGroup, shiftGroup);
|
|
|
+ if ("1".equals(queryType)){
|
|
|
+ queryWrapper1.between(BilletHotsend::getCreateTime, shiftStartTime, new Date());
|
|
|
+ }else {
|
|
|
+ queryWrapper1.between(BilletHotsend::getCreateTime, shiftStartTime, shiftEndTime);
|
|
|
+ }
|
|
|
+ //过滤从原始记录中删除的炉号
|
|
|
+ queryWrapper1.and(wrapper ->
|
|
|
+ wrapper.ne(BilletHotsend::getDeleteStatus, 1)
|
|
|
+ .or()
|
|
|
+ .isNull(BilletHotsend::getDeleteStatus)
|
|
|
+ );
|
|
|
+ queryWrapper1.orderByDesc(BilletHotsend::getCreateTime);
|
|
|
+ List<BilletHotsend> billetHotsendList = billetHotsendBaseService.list(queryWrapper1);
|
|
|
+ if (oConvertUtils.listIsEmpty(billetHotsendList)){
|
|
|
+ log.info("{}{}", "钢坯原始生产记录查询失败,炉次传递单为空!", ccmNo + "失败时间:" + new Date());
|
|
|
+ return heatsActualsInfoList;
|
|
|
+ }
|
|
|
+ List<String> distinctHeatNoList = billetHotsendList.stream()
|
|
|
+ .map(BilletHotsend::getHeatNo) // 提取炉号
|
|
|
+ .filter(Objects::nonNull) // 过滤可能的 null 值
|
|
|
+ .distinct() // 去重
|
|
|
+ .collect(Collectors.toList()); // 转为列表
|
|
|
+ List<BilletHotsend> filteredBilletHotsendList = new ArrayList<>();
|
|
|
+ // 根据铸机号、班别、班别、炉号查询钢坯原始生产记录
|
|
|
+ QueryWrapper<BilletOriginalProductRecordYyf> queryWrapper8 = new QueryWrapper<>();
|
|
|
+ queryWrapper8.eq("ccm_no", ccmNo)
|
|
|
+ .eq("shift", shift)
|
|
|
+ .eq("shift_group", shiftGroup)
|
|
|
+ .in("heat_no", distinctHeatNoList)
|
|
|
+ .orderByDesc("create_time");
|
|
|
+ List<BilletOriginalProductRecordYyf> billetOriginalProductRecordList = billetOriginalProductRecordYyfService.list(queryWrapper8);
|
|
|
+ if (oConvertUtils.listIsNotEmpty(billetOriginalProductRecordList)){
|
|
|
+ List<String> distinctOriginalProductRecordHeatNoList = billetOriginalProductRecordList.stream()
|
|
|
+ .map(BilletOriginalProductRecordYyf::getHeatNo) // 提取炉号
|
|
|
+ .filter(Objects::nonNull) // 过滤可能的 null 值
|
|
|
+ .distinct() // 去重
|
|
|
+ .collect(Collectors.toList()); // 转为列表
|
|
|
+ // 2. 将炉号列表转换为 Set 以提高查询效率
|
|
|
+ Set<String> excludeHeatNos = new HashSet<>(distinctOriginalProductRecordHeatNoList);
|
|
|
+ // 3. 过滤 billetHotsendList,保留炉号不在 excludeHeatNos 中的记录
|
|
|
+ filteredBilletHotsendList = billetHotsendList.stream()
|
|
|
+ .filter(item -> {
|
|
|
+ String heatNo = item.getHeatNo();
|
|
|
+ // 保留 heatNo 为空或不在 excludeHeatNos 中的记录
|
|
|
+ return heatNo == null || !excludeHeatNos.contains(heatNo);
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ // 4. 同步原始钢坯生产记录表中存在的炉号信息(热装hotChargeLength字段)
|
|
|
+ billetOriginalProductRecordList.forEach(x -> {
|
|
|
+ // 查询装运单打印表最新的数据,获取热装定尺
|
|
|
+ String shiftAndShiftGroup = x.getShift() + "/" + x.getShiftGroup();
|
|
|
+ String heatNo = x.getHeatNo();
|
|
|
+ // 构建安全的 JSON 路径表达式
|
|
|
+ String jsonPath = "$.\"" + heatNo + "\"";
|
|
|
+ List<StorageBillPrint> storageBillPrintList = storageBillPrintService.list(
|
|
|
+ new QueryWrapper<StorageBillPrint>()
|
|
|
+ .lambda()
|
|
|
+ .eq(StorageBillPrint::getCcmNo, x.getCcmNo())
|
|
|
+ .eq(StorageBillPrint::getClasses, shiftAndShiftGroup) // 新增的条件
|
|
|
+ .apply("JSON_EXTRACT(heat_no, '" + jsonPath + "') IS NOT NULL")
|
|
|
+ );
|
|
|
+ // 如果装运单打印表数据不为空,并且热装字段已经被编辑过,就不在实时读取装运打印表的实时热装数据
|
|
|
+ if (oConvertUtils.listIsNotEmpty(storageBillPrintList) && "1".equals(x.getIsEditCharge())){
|
|
|
+ List<Map<String, Object>> finalResult = handleStorageBillPrintHotCharge(storageBillPrintList, heatNo);
|
|
|
+ x.setHotChargeLength(JSON.toJSONString(finalResult));
|
|
|
+ billetOriginalProductRecordYyfService.updateById(x);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }else {
|
|
|
+ filteredBilletHotsendList = billetHotsendList;
|
|
|
+ }
|
|
|
+ // 查询当班炉次浇筑时,增量查询
|
|
|
+ filteredBilletHotsendList.forEach(x -> {
|
|
|
+ HeatsActualsInfo heatsActualsInfo = new HeatsActualsInfo();
|
|
|
+ heatsActualsInfo.setCreateTime(DateUtils.date2Str(x.getCreateTime(), DateUtils.datetimeFormat.get()));
|
|
|
+ heatsActualsInfo.setShiftGroup(x.getShiftGroup());
|
|
|
+ heatsActualsInfo.setShift(x.getShift());
|
|
|
+ heatsActualsInfo.setHeatNo(x.getHeatNo());
|
|
|
+ heatsActualsInfo.setBrandNum(x.getBrandNum());// 牌号 钢种
|
|
|
+ // 根据铸机号、炉号查询钢坯实绩信息BilletBasicInfo
|
|
|
+ LambdaQueryWrapper<BilletBasicInfo> queryWrapper2 = new LambdaQueryWrapper<>();
|
|
|
+ queryWrapper2.eq(BilletBasicInfo::getCcmNo, x.getCcmNo())
|
|
|
+ .eq(BilletBasicInfo::getHeatNo, x.getHeatNo())
|
|
|
+ .eq(BilletBasicInfo::getShift, x.getShift())
|
|
|
+ .eq(BilletBasicInfo::getShiftGroup, x.getShiftGroup());
|
|
|
+ List<BilletBasicInfo> billetBasicInfoList = billetBasicInfoService.list(queryWrapper2);
|
|
|
+ if (oConvertUtils.listIsEmpty(billetBasicInfoList)){
|
|
|
+ log.info("{}{}", "钢坯原始生产记录,该炉对应的钢坯实绩不存在:", x.getHeatNo());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 统计各流号的数量
|
|
|
+ Map<Integer, Long> strandCountMap = billetBasicInfoList.stream()
|
|
|
+ .filter(info -> info.getStrandNo() != null && info.getStrandNo() >= 1 && info.getStrandNo() <= 8)
|
|
|
+ .collect(Collectors.groupingBy(BilletBasicInfo::getStrandNo, Collectors.counting()));
|
|
|
+
|
|
|
+ // 获取StrandNo等于1的所有定尺length,并去重后用逗号连接
|
|
|
+ heatsActualsInfo.setOneStrandNo(Math.toIntExact(strandCountMap.getOrDefault(1, 0L)));
|
|
|
+ List<BilletBasicInfo> strandOneData = filterByStrandNo(billetBasicInfoList,1);
|
|
|
+ heatsActualsInfo.setOneLength(JSON.toJSONString(groupByLength(strandOneData)));
|
|
|
+ heatsActualsInfo.setOneSum(strandOneData.size());
|
|
|
+
|
|
|
+ heatsActualsInfo.setTwoStrandNo(Math.toIntExact(strandCountMap.getOrDefault(2, 0L)));
|
|
|
+ List<BilletBasicInfo> strandTwoData = filterByStrandNo(billetBasicInfoList,2);
|
|
|
+ heatsActualsInfo.setTwoLength(JSON.toJSONString(groupByLength(strandTwoData)));
|
|
|
+ heatsActualsInfo.setTwoSum(strandTwoData.size());
|
|
|
+
|
|
|
+ heatsActualsInfo.setThreeStrandNo(Math.toIntExact(strandCountMap.getOrDefault(3, 0L)));
|
|
|
+ List<BilletBasicInfo> strandThreeData = filterByStrandNo(billetBasicInfoList,3);
|
|
|
+ heatsActualsInfo.setThreeLength(JSON.toJSONString(groupByLength(strandThreeData)));
|
|
|
+ heatsActualsInfo.setThreeSum(strandThreeData.size());
|
|
|
+
|
|
|
+ heatsActualsInfo.setFourStrandNo(Math.toIntExact(strandCountMap.getOrDefault(4, 0L)));
|
|
|
+ List<BilletBasicInfo> strandFourData = filterByStrandNo(billetBasicInfoList,4);
|
|
|
+ heatsActualsInfo.setFourLength(JSON.toJSONString(groupByLength(strandFourData)));
|
|
|
+ heatsActualsInfo.setFourSum(strandFourData.size());
|
|
|
+
|
|
|
+ heatsActualsInfo.setFiveStrandNo(Math.toIntExact(strandCountMap.getOrDefault(5, 0L)));
|
|
|
+ List<BilletBasicInfo> strandFiveData = filterByStrandNo(billetBasicInfoList,5);
|
|
|
+ heatsActualsInfo.setFiveLength(JSON.toJSONString(groupByLength(strandFiveData)));
|
|
|
+ heatsActualsInfo.setFiveSum(strandFiveData.size());
|
|
|
+
|
|
|
+ heatsActualsInfo.setSixStrandNo(Math.toIntExact(strandCountMap.getOrDefault(6, 0L)));
|
|
|
+ List<BilletBasicInfo> strandSixData = filterByStrandNo(billetBasicInfoList,6);
|
|
|
+ heatsActualsInfo.setSixLength(JSON.toJSONString(groupByLength(strandSixData)));
|
|
|
+ heatsActualsInfo.setSixSum(strandSixData.size());
|
|
|
+
|
|
|
+ heatsActualsInfo.setSevenStrandNo(Math.toIntExact(strandCountMap.getOrDefault(7, 0L)));
|
|
|
+ List<BilletBasicInfo> strandSevenData = filterByStrandNo(billetBasicInfoList,7);
|
|
|
+ heatsActualsInfo.setSevenLength(JSON.toJSONString(groupByLength(strandSevenData)));
|
|
|
+ heatsActualsInfo.setSevenSum(strandSevenData.size());
|
|
|
+
|
|
|
+ heatsActualsInfo.setEightStrandNo(Math.toIntExact(strandCountMap.getOrDefault(8, 0L)));
|
|
|
+ List<BilletBasicInfo> strandEightData = filterByStrandNo(billetBasicInfoList,8);
|
|
|
+ heatsActualsInfo.setEightLength(JSON.toJSONString(groupByLength(strandEightData)));
|
|
|
+ heatsActualsInfo.setEightSum(strandEightData.size());
|
|
|
+
|
|
|
+ // 5#直轧棒一、6#热送高线 过滤并计算
|
|
|
+ List<BilletBasicInfo> filterDirectRollingList = billetBasicInfoList.stream()
|
|
|
+ .filter(info -> "roll_club_one".equals(info.getBelongTable()) || "roll_height".equals(info.getBelongTable()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ if (oConvertUtils.listIsNotEmpty(filterDirectRollingList)){
|
|
|
+ // 计算总重(保留4位小数)
|
|
|
+ double totalWeight = filterDirectRollingList.stream()
|
|
|
+ .mapToDouble(BilletBasicInfo::getBilletWeight)
|
|
|
+ .sum();
|
|
|
+ totalWeight = Math.round(totalWeight * 10000) / 10000.0;
|
|
|
+
|
|
|
+ // 统计总数
|
|
|
+ int totalCount = filterDirectRollingList.size();
|
|
|
+
|
|
|
+ // 按定尺 length 分组统计每组数量(Long 类型)
|
|
|
+ Map<Integer, Long> lengthCountMapRaw = filterDirectRollingList.stream()
|
|
|
+ .filter(info -> info.getLength() != null)
|
|
|
+ .collect(Collectors.groupingBy(BilletBasicInfo::getLength, Collectors.counting()));
|
|
|
+
|
|
|
+ // 转换为 Map<String, Long>,确保 JSON key 是字符串
|
|
|
+ Map<String, Long> lengthCountMap = lengthCountMapRaw.entrySet().stream()
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ e -> String.valueOf(e.getKey()), // key 转字符串
|
|
|
+ Map.Entry::getValue
|
|
|
+ ));
|
|
|
+
|
|
|
+ // 转为JSON字符串
|
|
|
+ Map<String, Object> directRollingMap = new HashMap<>();
|
|
|
+ directRollingMap.put("directRollingTotalWeight", totalWeight);
|
|
|
+ directRollingMap.put("directRollingTotalCount", totalCount);
|
|
|
+ directRollingMap.put("lengthGroupCount", lengthCountMap); // 定尺统计结果
|
|
|
+ String jsonResult = JSON.toJSONString(directRollingMap); // 使用FastJSON转换.
|
|
|
+ heatsActualsInfo.setDirectRolling(jsonResult);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 堆垛过滤并计算
|
|
|
+ List<BilletBasicInfo> filterStackList = billetBasicInfoList.stream()
|
|
|
+ .filter(info -> "stacking_and_loading_vehicles".equals(info.getBelongTable()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ if (oConvertUtils.listIsNotEmpty(filterStackList)){
|
|
|
+ // 按定尺长度和所属对应ID分组
|
|
|
+ Map<String, List<BilletBasicInfo>> lengthAndBhtcGroupMap = filterStackList.stream()
|
|
|
+ .filter(info -> info.getLength() != null && info.getBhtcId() != null)
|
|
|
+ .collect(Collectors.groupingBy(info ->
|
|
|
+ info.getLength() + "_" + info.getBhtcId()
|
|
|
+ ));
|
|
|
+
|
|
|
+ // 构建分组统计结果列表
|
|
|
+ List<Map<String, Object>> lengthGroupList = new ArrayList<>();
|
|
|
+
|
|
|
+ for (Map.Entry<String, List<BilletBasicInfo>> entry : lengthAndBhtcGroupMap.entrySet()) {
|
|
|
+ String key = entry.getKey();
|
|
|
+ List<BilletBasicInfo> billets = entry.getValue();
|
|
|
+
|
|
|
+ // 解析分组键获取定尺长度和BhtcId
|
|
|
+ String[] parts = key.split("_");
|
|
|
+ Integer length = Integer.parseInt(parts[0]);
|
|
|
+ String bhtcId = parts[1];
|
|
|
+
|
|
|
+ // 计算该分组的总重(保留4位小数)
|
|
|
+ double lengthWeight = billets.stream().mapToDouble(BilletBasicInfo::getBilletWeight).sum();
|
|
|
+
|
|
|
+ lengthWeight = Math.round(lengthWeight * 10000) / 10000.0;
|
|
|
+
|
|
|
+ // 统计该分组的数量
|
|
|
+ int lengthCount = billets.size();
|
|
|
+
|
|
|
+ // 构建该分组的统计结果
|
|
|
+ Map<String, Object> lengthStat = new HashMap<>();
|
|
|
+ lengthStat.put("stackingWeight", lengthWeight);
|
|
|
+ lengthStat.put("stackingCount", lengthCount);
|
|
|
+ lengthStat.put("stackingLength", length);
|
|
|
+ lengthStat.put("stackingBhtcId", bhtcId);
|
|
|
+
|
|
|
+ // 添加到结果列表
|
|
|
+ lengthGroupList.add(lengthStat);
|
|
|
+ }
|
|
|
+ // 直接将列表转换为JSON
|
|
|
+ String jsonResult = JSON.toJSONString(lengthGroupList);
|
|
|
+ heatsActualsInfo.setStacking(jsonResult);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 根据铸机号、炉号、班组、班别查询装运单打印表
|
|
|
+ String shiftAndShiftGroup = x.getShift() + "/" + x.getShiftGroup();
|
|
|
+ String heatNo = x.getHeatNo();
|
|
|
+ // 构建安全的 JSON 路径表达式
|
|
|
+ String jsonPath = "$.\"" + heatNo + "\"";
|
|
|
+ List<StorageBillPrint> storageBillPrintList = storageBillPrintService.list(
|
|
|
+ new QueryWrapper<StorageBillPrint>()
|
|
|
+ .lambda()
|
|
|
+ .eq(StorageBillPrint::getCcmNo, x.getCcmNo())
|
|
|
+ .eq(StorageBillPrint::getClasses, shiftAndShiftGroup) // 新增的条件
|
|
|
+ .apply("JSON_EXTRACT(heat_no, '" + jsonPath + "') IS NOT NULL")
|
|
|
+ );
|
|
|
+ if (oConvertUtils.listIsNotEmpty(storageBillPrintList)){
|
|
|
+ List<Map<String, Object>> finalResult = handleStorageBillPrintHotCharge(storageBillPrintList, heatNo);
|
|
|
+ // 使用结果...
|
|
|
+ log.info("钢坯原始记录,热装打印表分组统计结果: {}", JSON.toJSONString(finalResult));
|
|
|
+ heatsActualsInfo.setHotCharge(JSON.toJSONString(finalResult));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 统计总数
|
|
|
+ long totalCount = billetBasicInfoList.size();
|
|
|
+
|
|
|
+ // 计算总重(保留4位小数)
|
|
|
+ double totalWeight = billetBasicInfoList.stream()
|
|
|
+ .mapToDouble(BilletBasicInfo::getBilletWeight)
|
|
|
+ .sum();
|
|
|
+ totalWeight = Math.round(totalWeight * 10000) / 10000.0;
|
|
|
+
|
|
|
+ // 转为JSON字符串
|
|
|
+ Map<String, Object> resultMap = new HashMap<>();
|
|
|
+ resultMap.put("totalCount", totalCount);
|
|
|
+ resultMap.put("totalWeight", totalWeight);
|
|
|
+ String sumJsonResult = JSON.toJSONString(resultMap); // 使用FastJSON转换
|
|
|
+ heatsActualsInfo.setTotalInfo(sumJsonResult);
|
|
|
+
|
|
|
+ heatsActualsInfoList.add(heatsActualsInfo);
|
|
|
+ });
|
|
|
+ return heatsActualsInfoList;
|
|
|
+ }
|
|
|
}
|