Parcourir la source

粤裕丰、德龙钢坯原始记录查询

qiangxuan il y a 1 jour
Parent
commit
59d58577bc
14 fichiers modifiés avec 1582 ajouts et 0 suppressions
  1. 800 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/controller/BilletOriginalProductRecordController.java
  2. 163 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/controller/BilletOriginalProductRecordDlController.java
  3. 161 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/controller/BilletOriginalProductRecordYyfController.java
  4. 173 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/entity/BilletOriginalProductRecordDl.java
  5. 174 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/entity/BilletOriginalProductRecordYyf.java
  6. 15 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/mapper/BilletOriginalProductRecordDlMapper.java
  7. 13 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/mapper/BilletOriginalProductRecordYyfMapper.java
  8. 5 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/mapper/xml/BilletOriginalProductRecordDlMapper.xml
  9. 5 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/mapper/xml/BilletOriginalProductRecordYyfMapper.xml
  10. 15 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/service/IBilletOriginalProductRecordDlService.java
  11. 14 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/service/IBilletOriginalProductRecordYyfService.java
  12. 18 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/service/impl/BilletOriginalProductRecordDlServiceImpl.java
  13. 18 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/service/impl/BilletOriginalProductRecordYyfServiceImpl.java
  14. 8 0
      zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/vo/BilletOriginalProductRecordDetail.java

+ 800 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/controller/BilletOriginalProductRecordController.java

@@ -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;
+	}
 }

+ 163 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/controller/BilletOriginalProductRecordDlController.java

@@ -0,0 +1,163 @@
+package org.jeecg.modules.billet.billetOriginalProductRecord.controller;
+
+import java.util.Arrays;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecg.modules.billet.billetOriginalProductRecord.entity.BilletOriginalProductRecordDl;
+import org.jeecg.modules.billet.billetOriginalProductRecord.service.IBilletOriginalProductRecordDlService;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+
+ /**
+ * @Description: 德龙原始记录
+ * @Author: jeecg-boot
+ * @Date:   2025-07-21
+ * @Version: V1.0
+ */
+@Api(tags="德龙原始记录")
+@RestController
+@RequestMapping("/billet/billetOriginalProductRecordDl")
+@Slf4j
+public class BilletOriginalProductRecordDlController extends JeecgController<BilletOriginalProductRecordDl, IBilletOriginalProductRecordDlService> {
+	@Autowired
+	private IBilletOriginalProductRecordDlService billetOriginalProductRecordDlService;
+	
+	/**
+	 * 分页列表查询
+	 *
+	 * @param billetOriginalProductRecordDl
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "德龙原始记录-分页列表查询")
+	@ApiOperation(value="德龙原始记录-分页列表查询", notes="德龙原始记录-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<BilletOriginalProductRecordDl>> queryPageList(BilletOriginalProductRecordDl billetOriginalProductRecordDl,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+		QueryWrapper<BilletOriginalProductRecordDl> queryWrapper = QueryGenerator.initQueryWrapper(billetOriginalProductRecordDl, req.getParameterMap());
+		Page<BilletOriginalProductRecordDl> page = new Page<BilletOriginalProductRecordDl>(pageNo, pageSize);
+		IPage<BilletOriginalProductRecordDl> pageList = billetOriginalProductRecordDlService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+	
+	/**
+	 *   添加
+	 *
+	 * @param billetOriginalProductRecordDl
+	 * @return
+	 */
+	@AutoLog(value = "德龙原始记录-添加")
+	@ApiOperation(value="德龙原始记录-添加", notes="德龙原始记录-添加")
+	@RequiresPermissions("billetOriginalProductRecordDl:billet_original_product_record_dl:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody BilletOriginalProductRecordDl billetOriginalProductRecordDl) {
+		billetOriginalProductRecordDlService.save(billetOriginalProductRecordDl);
+		return Result.OK("添加成功!");
+	}
+	
+	/**
+	 *  编辑
+	 *
+	 * @param billetOriginalProductRecordDl
+	 * @return
+	 */
+	@AutoLog(value = "德龙原始记录-编辑")
+	@ApiOperation(value="德龙原始记录-编辑", notes="德龙原始记录-编辑")
+	@RequiresPermissions("billetOriginalProductRecordDl:billet_original_product_record_dl:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody BilletOriginalProductRecordDl billetOriginalProductRecordDl) {
+		billetOriginalProductRecordDlService.updateById(billetOriginalProductRecordDl);
+		return Result.OK("编辑成功!");
+	}
+	
+	/**
+	 *   通过id删除
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "德龙原始记录-通过id删除")
+	@ApiOperation(value="德龙原始记录-通过id删除", notes="德龙原始记录-通过id删除")
+	@RequiresPermissions("billetOriginalProductRecordDl:billet_original_product_record_dl:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		billetOriginalProductRecordDlService.removeById(id);
+		return Result.OK("删除成功!");
+	}
+	
+	/**
+	 *  批量删除
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "德龙原始记录-批量删除")
+	@ApiOperation(value="德龙原始记录-批量删除", notes="德龙原始记录-批量删除")
+	@RequiresPermissions("billetOriginalProductRecordDl:billet_original_product_record_dl:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.billetOriginalProductRecordDlService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+	
+	/**
+	 * 通过id查询
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "德龙原始记录-通过id查询")
+	@ApiOperation(value="德龙原始记录-通过id查询", notes="德龙原始记录-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<BilletOriginalProductRecordDl> queryById(@RequestParam(name="id",required=true) String id) {
+		BilletOriginalProductRecordDl billetOriginalProductRecordDl = billetOriginalProductRecordDlService.getById(id);
+		if(billetOriginalProductRecordDl==null) {
+			return Result.error("未找到对应数据");
+		}
+		return Result.OK(billetOriginalProductRecordDl);
+	}
+
+    /**
+    * 导出excel
+    *
+    * @param request
+    * @param billetOriginalProductRecordDl
+    */
+    @RequiresPermissions("billetOriginalProductRecordDl:billet_original_product_record_dl:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, BilletOriginalProductRecordDl billetOriginalProductRecordDl) {
+        return super.exportXls(request, billetOriginalProductRecordDl, BilletOriginalProductRecordDl.class, "德龙原始记录");
+    }
+
+    /**
+      * 通过excel导入数据
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    @RequiresPermissions("billetOriginalProductRecordDl:billet_original_product_record_dl:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, BilletOriginalProductRecordDl.class);
+    }
+
+}

+ 161 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/controller/BilletOriginalProductRecordYyfController.java

@@ -0,0 +1,161 @@
+package org.jeecg.modules.billet.billetOriginalProductRecord.controller;
+
+import java.util.Arrays;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.modules.billet.billetOriginalProductRecord.entity.BilletOriginalProductRecordYyf;
+import org.jeecg.modules.billet.billetOriginalProductRecord.service.IBilletOriginalProductRecordYyfService;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+
+ /**
+ * @Description: 粤裕丰原始记录
+ * @Author: jeecg-boot
+ * @Date:   2025-07-21
+ * @Version: V1.0
+ */
+@Api(tags="粤裕丰原始记录")
+@RestController
+@RequestMapping("/billet/billetOriginalProductRecordYyf")
+@Slf4j
+public class BilletOriginalProductRecordYyfController extends JeecgController<BilletOriginalProductRecordYyf, IBilletOriginalProductRecordYyfService> {
+	@Autowired
+	private IBilletOriginalProductRecordYyfService billetOriginalProductRecordYyfService;
+	
+	/**
+	 * 分页列表查询
+	 *
+	 * @param billetOriginalProductRecordYyf
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "粤裕丰原始记录-分页列表查询")
+	@ApiOperation(value="粤裕丰原始记录-分页列表查询", notes="粤裕丰原始记录-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<BilletOriginalProductRecordYyf>> queryPageList(BilletOriginalProductRecordYyf billetOriginalProductRecordYyf,
+																	   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+																	   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+																	   HttpServletRequest req) {
+		QueryWrapper<BilletOriginalProductRecordYyf> queryWrapper = QueryGenerator.initQueryWrapper(billetOriginalProductRecordYyf, req.getParameterMap());
+		Page<BilletOriginalProductRecordYyf> page = new Page<BilletOriginalProductRecordYyf>(pageNo, pageSize);
+		IPage<BilletOriginalProductRecordYyf> pageList = billetOriginalProductRecordYyfService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+	
+	/**
+	 *   添加
+	 *
+	 * @param billetOriginalProductRecordYyf
+	 * @return
+	 */
+	@AutoLog(value = "粤裕丰原始记录-添加")
+	@ApiOperation(value="粤裕丰原始记录-添加", notes="粤裕丰原始记录-添加")
+	@RequiresPermissions("billetOriginalProductRecordYyf:billet_original_product_record_yyf:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody BilletOriginalProductRecordYyf billetOriginalProductRecordYyf) {
+		billetOriginalProductRecordYyfService.save(billetOriginalProductRecordYyf);
+		return Result.OK("添加成功!");
+	}
+	
+	/**
+	 *  编辑
+	 *
+	 * @param billetOriginalProductRecordYyf
+	 * @return
+	 */
+	@AutoLog(value = "粤裕丰原始记录-编辑")
+	@ApiOperation(value="粤裕丰原始记录-编辑", notes="粤裕丰原始记录-编辑")
+	@RequiresPermissions("billetOriginalProductRecordYyf:billet_original_product_record_yyf:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody BilletOriginalProductRecordYyf billetOriginalProductRecordYyf) {
+		billetOriginalProductRecordYyfService.updateById(billetOriginalProductRecordYyf);
+		return Result.OK("编辑成功!");
+	}
+	
+	/**
+	 *   通过id删除
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "粤裕丰原始记录-通过id删除")
+	@ApiOperation(value="粤裕丰原始记录-通过id删除", notes="粤裕丰原始记录-通过id删除")
+	@RequiresPermissions("billetOriginalProductRecordYyf:billet_original_product_record_yyf:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		billetOriginalProductRecordYyfService.removeById(id);
+		return Result.OK("删除成功!");
+	}
+	
+	/**
+	 *  批量删除
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "粤裕丰原始记录-批量删除")
+	@ApiOperation(value="粤裕丰原始记录-批量删除", notes="粤裕丰原始记录-批量删除")
+	@RequiresPermissions("billetOriginalProductRecordYyf:billet_original_product_record_yyf:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.billetOriginalProductRecordYyfService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+	
+	/**
+	 * 通过id查询
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "粤裕丰原始记录-通过id查询")
+	@ApiOperation(value="粤裕丰原始记录-通过id查询", notes="粤裕丰原始记录-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<BilletOriginalProductRecordYyf> queryById(@RequestParam(name="id",required=true) String id) {
+		BilletOriginalProductRecordYyf billetOriginalProductRecordYyf = billetOriginalProductRecordYyfService.getById(id);
+		if(billetOriginalProductRecordYyf==null) {
+			return Result.error("未找到对应数据");
+		}
+		return Result.OK(billetOriginalProductRecordYyf);
+	}
+
+    /**
+    * 导出excel
+    *
+    * @param request
+    * @param billetOriginalProductRecordYyf
+    */
+    @RequiresPermissions("billetOriginalProductRecordYyf:billet_original_product_record_yyf:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, BilletOriginalProductRecordYyf billetOriginalProductRecordYyf) {
+        return super.exportXls(request, billetOriginalProductRecordYyf, BilletOriginalProductRecordYyf.class, "粤裕丰原始记录");
+    }
+
+    /**
+      * 通过excel导入数据
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    @RequiresPermissions("billetOriginalProductRecordYyf:billet_original_product_record_yyf:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, BilletOriginalProductRecordYyf.class);
+    }
+
+}

+ 173 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/entity/BilletOriginalProductRecordDl.java

@@ -0,0 +1,173 @@
+package org.jeecg.modules.billet.billetOriginalProductRecord.entity;
+
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: 德龙原始记录
+ * @Author: jeecg-boot
+ * @Date:   2025-07-21
+ * @Version: V1.0
+ */
+@Data
+@TableName("billet_original_product_record_dl")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="billet_original_product_record_dl对象", description="德龙原始记录")
+public class BilletOriginalProductRecordDl implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**ID*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "ID")
+    private java.lang.String id;
+	/**创建人*/
+    @ApiModelProperty(value = "创建人")
+    private java.lang.String createBy;
+	/**创建时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+    private java.util.Date createTime;
+	/**更新人*/
+    @ApiModelProperty(value = "更新人")
+    private java.lang.String updateBy;
+	/**更新时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "更新时间")
+    private java.util.Date updateTime;
+	/**所属部门*/
+    @ApiModelProperty(value = "所属部门")
+    private java.lang.String sysOrgCode;
+	/**铸机号*/
+	@Excel(name = "铸机号", width = 15)
+    @ApiModelProperty(value = "铸机号")
+    private java.lang.String ccmNo;
+	/**炉号*/
+	@Excel(name = "炉号", width = 15)
+    @ApiModelProperty(value = "炉号")
+    private java.lang.String heatNo;
+	/**班别*/
+	@Excel(name = "班别", width = 15)
+    @ApiModelProperty(value = "班别")
+    private java.lang.String shift;
+	/**班组*/
+	@Excel(name = "班组", width = 15)
+    @ApiModelProperty(value = "班组")
+    private java.lang.String shiftGroup;
+	/**牌号*/
+	@Excel(name = "牌号", width = 15)
+    @ApiModelProperty(value = "牌号")
+    private java.lang.String grade;
+	/**定尺*/
+	@Excel(name = "定尺", width = 15)
+    @ApiModelProperty(value = "定尺")
+    private java.lang.Integer length;
+	/**合计*/
+	@Excel(name = "合计", width = 15)
+    @ApiModelProperty(value = "合计")
+    private java.lang.Integer amount;
+	/**棒一定尺明细*/
+	@Excel(name = "棒一定尺明细", width = 15)
+    @ApiModelProperty(value = "棒一定尺明细")
+    private java.lang.String rollClubOneDetails;
+	/**棒二定尺明细*/
+	@Excel(name = "棒二定尺明细", width = 15)
+    @ApiModelProperty(value = "棒二定尺明细")
+    private java.lang.String rollClubTwoDetails;
+	/**棒三定尺明细*/
+	@Excel(name = "棒三定尺明细", width = 15)
+    @ApiModelProperty(value = "棒三定尺明细")
+    private java.lang.String rollClubThreeDetails;
+	/**定尺明细*/
+	@Excel(name = "定尺明细", width = 15)
+    @ApiModelProperty(value = "定尺明细")
+    private java.lang.String lengthDetails;
+	/**1流支数*/
+	@Excel(name = "1流支数", width = 15)
+    @ApiModelProperty(value = "1流支数")
+    private java.lang.Integer oneStrandSum;
+	/**2流支数*/
+	@Excel(name = "2流支数", width = 15)
+    @ApiModelProperty(value = "2流支数")
+    private java.lang.Integer twoStrandSum;
+	/**3流支数*/
+	@Excel(name = "3流支数", width = 15)
+    @ApiModelProperty(value = "3流支数")
+    private java.lang.Integer threeStrandSum;
+	/**4流支数*/
+	@Excel(name = "4流支数", width = 15)
+    @ApiModelProperty(value = "4流支数")
+    private java.lang.Integer fourStrandSum;
+	/**5流支数*/
+	@Excel(name = "5流支数", width = 15)
+    @ApiModelProperty(value = "5流支数")
+    private java.lang.Integer fiveStrandSum;
+	/**6流支数*/
+	@Excel(name = "6流支数", width = 15)
+    @ApiModelProperty(value = "6流支数")
+    private java.lang.Integer sixStrandSum;
+	/**7流支数*/
+	@Excel(name = "7流支数", width = 15)
+    @ApiModelProperty(value = "7流支数")
+    private java.lang.Integer sevenStrandSum;
+	/**8流支数*/
+	@Excel(name = "8流支数", width = 15)
+    @ApiModelProperty(value = "8流支数")
+    private java.lang.Integer eightStrandSum;
+	/**热送定尺*/
+	@Excel(name = "热送定尺", width = 15)
+    @ApiModelProperty(value = "热送定尺")
+    private java.lang.String hotChargeLength;
+	/**堆垛定尺*/
+	@Excel(name = "堆垛定尺", width = 15)
+    @ApiModelProperty(value = "堆垛定尺")
+    private java.lang.String stackLength;
+	/**备注*/
+	@Excel(name = "备注", width = 15)
+    @ApiModelProperty(value = "备注")
+    private java.lang.String remark;
+	/**确认人*/
+	@Excel(name = "确认人", width = 15)
+    @ApiModelProperty(value = "确认人")
+    private java.lang.String confirmBy;
+	/**确认日期*/
+	@Excel(name = "确认日期", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "确认日期")
+    private java.util.Date confirmTime;
+	/**是否编辑热装(1:未编辑,2:已编辑)*/
+	@Excel(name = "是否编辑热装(1:未编辑,2:已编辑)", width = 15)
+    @ApiModelProperty(value = "是否编辑热装(1:未编辑,2:已编辑)")
+    private java.lang.String isEditCharge;
+	/**起垛信息*/
+	@Excel(name = "起垛信息", width = 15)
+    @ApiModelProperty(value = "起垛信息")
+    private java.lang.String stackInfo;
+	/**质检牌号*/
+	@Excel(name = "质检牌号", width = 15)
+    @ApiModelProperty(value = "质检牌号")
+    private java.lang.String brandNum;
+	/**送样时间*/
+	@Excel(name = "送样时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "送样时间")
+    private java.util.Date deliveryTime;
+	/**质检备注*/
+	@Excel(name = "质检备注", width = 15)
+    @ApiModelProperty(value = "质检备注")
+    private java.lang.String notes;
+}

+ 174 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/entity/BilletOriginalProductRecordYyf.java

@@ -0,0 +1,174 @@
+package org.jeecg.modules.billet.billetOriginalProductRecord.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: 粤裕丰原始记录
+ * @Author: jeecg-boot
+ * @Date:   2025-07-21
+ * @Version: V1.0
+ */
+@Data
+@TableName("billet_original_product_record_yyf")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="billet_original_product_record_yyf对象", description="粤裕丰原始记录")
+public class BilletOriginalProductRecordYyf implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**ID*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "ID")
+    private String id;
+	/**创建人*/
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+	/**创建时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+	/**更新人*/
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+	/**更新时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+	/**所属部门*/
+    @ApiModelProperty(value = "所属部门")
+    private String sysOrgCode;
+	/**铸机号*/
+	@Excel(name = "铸机号", width = 15)
+    @ApiModelProperty(value = "铸机号")
+    private String ccmNo;
+	/**炉号*/
+	@Excel(name = "炉号", width = 15)
+    @ApiModelProperty(value = "炉号")
+    private String heatNo;
+	/**班别*/
+	@Excel(name = "班别", width = 15)
+    @ApiModelProperty(value = "班别")
+    private String shift;
+	/**班组*/
+	@Excel(name = "班组", width = 15)
+    @ApiModelProperty(value = "班组")
+    private String shiftGroup;
+	/**牌号*/
+	@Excel(name = "牌号", width = 15)
+    @ApiModelProperty(value = "牌号")
+    private String grade;
+	/**定尺*/
+	@Excel(name = "定尺", width = 15)
+    @ApiModelProperty(value = "定尺")
+    private Integer length;
+	/**合计*/
+	@Excel(name = "合计", width = 15)
+    @ApiModelProperty(value = "合计")
+    private Integer amount;
+	/**棒一定尺明细*/
+	@Excel(name = "棒一定尺明细", width = 15)
+    @ApiModelProperty(value = "棒一定尺明细")
+    private String rollClubOneDetails;
+	/**棒二定尺明细*/
+	@Excel(name = "棒二定尺明细", width = 15)
+    @ApiModelProperty(value = "棒二定尺明细")
+    private String rollClubTwoDetails;
+	/**棒三定尺明细*/
+	@Excel(name = "棒三定尺明细", width = 15)
+    @ApiModelProperty(value = "棒三定尺明细")
+    private String rollClubThreeDetails;
+	/**定尺明细*/
+	@Excel(name = "定尺明细", width = 15)
+    @ApiModelProperty(value = "定尺明细")
+    private String lengthDetails;
+	/**1流支数*/
+	@Excel(name = "1流支数", width = 15)
+    @ApiModelProperty(value = "1流支数")
+    private Integer oneStrandSum;
+	/**2流支数*/
+	@Excel(name = "2流支数", width = 15)
+    @ApiModelProperty(value = "2流支数")
+    private Integer twoStrandSum;
+	/**3流支数*/
+	@Excel(name = "3流支数", width = 15)
+    @ApiModelProperty(value = "3流支数")
+    private Integer threeStrandSum;
+	/**4流支数*/
+	@Excel(name = "4流支数", width = 15)
+    @ApiModelProperty(value = "4流支数")
+    private Integer fourStrandSum;
+	/**5流支数*/
+	@Excel(name = "5流支数", width = 15)
+    @ApiModelProperty(value = "5流支数")
+    private Integer fiveStrandSum;
+	/**6流支数*/
+	@Excel(name = "6流支数", width = 15)
+    @ApiModelProperty(value = "6流支数")
+    private Integer sixStrandSum;
+	/**7流支数*/
+	@Excel(name = "7流支数", width = 15)
+    @ApiModelProperty(value = "7流支数")
+    private Integer sevenStrandSum;
+	/**8流支数*/
+	@Excel(name = "8流支数", width = 15)
+    @ApiModelProperty(value = "8流支数")
+    private Integer eightStrandSum;
+	/**热送定尺*/
+	@Excel(name = "热送定尺", width = 15)
+    @ApiModelProperty(value = "热送定尺")
+    private String hotChargeLength;
+	/**堆垛定尺*/
+	@Excel(name = "堆垛定尺", width = 15)
+    @ApiModelProperty(value = "堆垛定尺")
+    private String stackLength;
+	/**备注*/
+	@Excel(name = "备注", width = 15)
+    @ApiModelProperty(value = "备注")
+    private String remark;
+	/**确认人*/
+	@Excel(name = "确认人", width = 15)
+    @ApiModelProperty(value = "确认人")
+    private String confirmBy;
+	/**确认日期*/
+	@Excel(name = "确认日期", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "确认日期")
+    private Date confirmTime;
+	/**是否编辑热装(1:未编辑,2:已编辑)*/
+	@Excel(name = "是否编辑热装(1:未编辑,2:已编辑)", width = 15)
+    @ApiModelProperty(value = "是否编辑热装(1:未编辑,2:已编辑)")
+    private String isEditCharge;
+	/**起垛信息*/
+	@Excel(name = "起垛信息", width = 15)
+    @ApiModelProperty(value = "起垛信息")
+    private String stackInfo;
+	/**质检牌号*/
+	@Excel(name = "质检牌号", width = 15)
+    @ApiModelProperty(value = "质检牌号")
+    private String brandNum;
+	/**送样时间*/
+	@Excel(name = "送样时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "送样时间")
+    private Date deliveryTime;
+	/**质检备注*/
+	@Excel(name = "质检备注", width = 15)
+    @ApiModelProperty(value = "质检备注")
+    private String notes;
+}

+ 15 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/mapper/BilletOriginalProductRecordDlMapper.java

@@ -0,0 +1,15 @@
+package org.jeecg.modules.billet.billetOriginalProductRecord.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.billet.billetOriginalProductRecord.entity.BilletOriginalProductRecordDl;
+
+/**
+ * @Description: 德龙原始记录
+ * @Author: jeecg-boot
+ * @Date:   2025-07-21
+ * @Version: V1.0
+ */
+public interface BilletOriginalProductRecordDlMapper extends BaseMapper<BilletOriginalProductRecordDl> {
+
+}

+ 13 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/mapper/BilletOriginalProductRecordYyfMapper.java

@@ -0,0 +1,13 @@
+package org.jeecg.modules.billet.billetOriginalProductRecord.mapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.billet.billetOriginalProductRecord.entity.BilletOriginalProductRecordYyf;
+
+/**
+ * @Description: 粤裕丰原始记录
+ * @Author: jeecg-boot
+ * @Date:   2025-07-21
+ * @Version: V1.0
+ */
+public interface BilletOriginalProductRecordYyfMapper extends BaseMapper<BilletOriginalProductRecordYyf> {
+
+}

+ 5 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/mapper/xml/BilletOriginalProductRecordDlMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.billet.billetOriginalProductRecord.mapper.BilletOriginalProductRecordDlMapper">
+
+</mapper>

+ 5 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/mapper/xml/BilletOriginalProductRecordYyfMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.billet.billetOriginalProductRecord.mapper.BilletOriginalProductRecordYyfMapper">
+
+</mapper>

+ 15 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/service/IBilletOriginalProductRecordDlService.java

@@ -0,0 +1,15 @@
+package org.jeecg.modules.billet.billetOriginalProductRecord.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.billet.billetOriginalProductRecord.entity.BilletOriginalProductRecordDl;
+
+/**
+ * @Description: 德龙原始记录
+ * @Author: jeecg-boot
+ * @Date:   2025-07-21
+ * @Version: V1.0
+ */
+public interface IBilletOriginalProductRecordDlService extends IService<BilletOriginalProductRecordDl> {
+
+}

+ 14 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/service/IBilletOriginalProductRecordYyfService.java

@@ -0,0 +1,14 @@
+package org.jeecg.modules.billet.billetOriginalProductRecord.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.billet.billetOriginalProductRecord.entity.BilletOriginalProductRecordYyf;
+
+/**
+ * @Description: 粤裕丰原始记录
+ * @Author: jeecg-boot
+ * @Date:   2025-07-21
+ * @Version: V1.0
+ */
+public interface IBilletOriginalProductRecordYyfService extends IService<BilletOriginalProductRecordYyf> {
+
+}

+ 18 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/service/impl/BilletOriginalProductRecordDlServiceImpl.java

@@ -0,0 +1,18 @@
+package org.jeecg.modules.billet.billetOriginalProductRecord.service.impl;
+import org.jeecg.modules.billet.billetOriginalProductRecord.entity.BilletOriginalProductRecordDl;
+import org.jeecg.modules.billet.billetOriginalProductRecord.mapper.BilletOriginalProductRecordDlMapper;
+import org.jeecg.modules.billet.billetOriginalProductRecord.service.IBilletOriginalProductRecordDlService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 德龙原始记录
+ * @Author: jeecg-boot
+ * @Date:   2025-07-21
+ * @Version: V1.0
+ */
+@Service
+public class BilletOriginalProductRecordDlServiceImpl extends ServiceImpl<BilletOriginalProductRecordDlMapper, BilletOriginalProductRecordDl> implements IBilletOriginalProductRecordDlService {
+
+}

+ 18 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/service/impl/BilletOriginalProductRecordYyfServiceImpl.java

@@ -0,0 +1,18 @@
+package org.jeecg.modules.billet.billetOriginalProductRecord.service.impl;
+import org.jeecg.modules.billet.billetOriginalProductRecord.entity.BilletOriginalProductRecordYyf;
+import org.jeecg.modules.billet.billetOriginalProductRecord.mapper.BilletOriginalProductRecordYyfMapper;
+import org.jeecg.modules.billet.billetOriginalProductRecord.service.IBilletOriginalProductRecordYyfService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 粤裕丰原始记录
+ * @Author: jeecg-boot
+ * @Date:   2025-07-21
+ * @Version: V1.0
+ */
+@Service
+public class BilletOriginalProductRecordYyfServiceImpl extends ServiceImpl<BilletOriginalProductRecordYyfMapper, BilletOriginalProductRecordYyf> implements IBilletOriginalProductRecordYyfService {
+
+}

+ 8 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetOriginalProductRecord/vo/BilletOriginalProductRecordDetail.java

@@ -3,6 +3,8 @@ package org.jeecg.modules.billet.billetOriginalProductRecord.vo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 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 java.util.List;
 
@@ -20,4 +22,10 @@ public class BilletOriginalProductRecordDetail {
 
     @ApiModelProperty(value = "原始记录确认状态 默认待确认:1,2:已确认")
     private Integer confirmStatus;
+
+    @ApiModelProperty(value = "德龙原始生产记录信息")
+    private List<BilletOriginalProductRecordDl> billetOriginalProductRecordDlList;
+
+    @ApiModelProperty(value = "粤裕丰原始生产记录信息")
+    private List<BilletOriginalProductRecordYyf> billetOriginalProductRecordYyfList;
 }