فهرست منبع

班次实绩新增字段维护交班表

qiangxuan 2 ماه پیش
والد
کامیت
fbc1af9e3a

+ 656 - 11
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetHotsendChangeShift/controller/BilletHotsendChangeShiftController.java

@@ -33,6 +33,7 @@ import org.jeecg.modules.billet.rollClubThree.service.IRollClubThreeDetailsServi
 import org.jeecg.modules.billet.rollClubTwo.entity.RollClubTwoDetails;
 import org.jeecg.modules.billet.rollClubTwo.service.IRollClubTwoDetailsService;
 import org.jeecg.modules.billet.rollHeight.entity.DestinationStatisticsDetails;
+import org.jeecg.modules.billet.rollHeight.entity.RollHeightDetails;
 import org.jeecg.modules.billet.rollHeight.service.IRollHeightDetailsService;
 import org.jeecg.modules.billet.rollOutShipp.entity.RollOutShippDetails;
 import org.jeecg.modules.billet.rollOutShipp.service.IRollOutShippDetailsService;
@@ -53,6 +54,7 @@ import org.springframework.web.servlet.ModelAndView;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
+import java.text.DecimalFormat;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.YearMonth;
@@ -419,22 +421,665 @@ public class BilletHotsendChangeShiftController extends JeecgController<BilletHo
 		log.info("自动化{}交班成功!{} 结果值:{}", shiftName, DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()), jsonObject);
 	}
 
-//	@Scheduled(cron = "0 40 10 * * ?")
-	public void executeNeightShiftTask1() {
-		log.info("设置索引iD");
-		String nextshiftIdKey = String.format("class:nextshift:Id:%s", "5-6");
-		redisTemplate.opsForValue().set(nextshiftIdKey, 26);
+
+//	@Scheduled(cron = "5 0 0 * * ?")
+	public void runAtMidnight() {
+		// 每天	00:00:05 执行的任务逻辑
+
+		// 5号机、统计热送、热装、起跺数量维护到交班信息
+		executeShiftTask11();
+		// 6号机、统计热送、热装、起跺数量维护到交班信息
+		executeShiftTask22();
+		// 5号机 班次吊运明细维护到交班信息
+		executeShiftTask33();
+		// 6号机 班次吊运明细维护到交班信息
+		executeShiftTask44();
+		// 5号机 统计班次吊运明细、轧钢棒二、轧钢棒三、轧钢上若维护到交班信息
+		executeShiftTask55();
+		// 6号机 统计班次吊运明细、轧钢棒二、轧钢棒三、轧钢上若维护到交班信息
+		executeShiftTask66();
+		// 5号机 轧钢棒一维护到交班信息
+		executeShiftTask77();
+		// 6号机 轧钢高线维护到交班信息
+		executeShiftTask88();
 	}
 
-//	@Scheduled(cron = "0 * * * * ?")
-	public void executeNeightShiftTask2() {
-		log.info("获取索引ID");
-		String nextshiftIdKey = String.format("class:nextshift:Id:%s", "5-6");
-		String nextCacheId = oConvertUtils.getString(redisTemplate.opsForValue().get(nextshiftIdKey));
-		log.info("获取索引ID结果:", nextCacheId);
+//	@Scheduled(cron = "0 5 8 * * ?")
+	public void runAtEight() {
+		// 08:05:00 执行的任务逻辑
+
+		// 5号机、统计热送、热装、起跺数量维护到交班信息
+		executeShiftTask11();
+		// 6号机、统计热送、热装、起跺数量维护到交班信息
+		executeShiftTask22();
+		// 5号机 班次吊运明细维护到交班信息
+		executeShiftTask33();
+		// 6号机 班次吊运明细维护到交班信息
+		executeShiftTask44();
+		// 5号机 统计班次吊运明细、轧钢棒二、轧钢棒三、轧钢上若维护到交班信息
+		executeShiftTask55();
+		// 6号机 统计班次吊运明细、轧钢棒二、轧钢棒三、轧钢上若维护到交班信息
+		executeShiftTask66();
+		// 5号机 轧钢棒一维护到交班信息
+		executeShiftTask77();
+		// 6号机 轧钢高线维护到交班信息
+		executeShiftTask88();
+	}
+
+//	@Scheduled(cron = "5 0 16 * * ?")
+	public void runAtFourPm() {
+		// 16:00:05 执行的任务逻辑
+
+		// 5号机、统计热送、热装、起跺数量维护到交班信息
+		executeShiftTask11();
+		// 6号机、统计热送、热装、起跺数量维护到交班信息
+		executeShiftTask22();
+		// 5号机 班次吊运明细维护到交班信息
+		executeShiftTask33();
+		// 6号机 班次吊运明细维护到交班信息
+		executeShiftTask44();
+		// 5号机 统计班次吊运明细、轧钢棒二、轧钢棒三、轧钢上若维护到交班信息
+		executeShiftTask55();
+		// 6号机 统计班次吊运明细、轧钢棒二、轧钢棒三、轧钢上若维护到交班信息
+		executeShiftTask66();
+		// 5号机 轧钢棒一维护到交班信息
+		executeShiftTask77();
+		// 6号机 轧钢高线维护到交班信息
+		executeShiftTask88();
+	}
+
+	/**
+	 * 5号机	热送、热装、堆垛、定尺明细、数量维护到交班信息
+	 */
+	@ApiOperation(value="5号机统计热送热装数量维护到交班信息", notes="5号机统计热送热装数量维护到交班信息")
+	@GetMapping(value = "/executeShiftTask111")
+	public void executeShiftTask11() {
+		log.info("5号机统计热送热装数量维护到交班信息!");
+		// 根据铸机号、交班结束时间倒序并不为空,查询交班记录,
+		LambdaQueryWrapper<BilletHotsendChangeShift> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(BilletHotsendChangeShift::getCcmNo, "5")
+				.orderByDesc(BilletHotsendChangeShift::getChangeShiftTime)
+				.ne(BilletHotsendChangeShift::getChangeShiftTime, null)
+				.last("limit 1");
+		BilletHotsendChangeShift billetHotsendChangeShift = billetHotsendChangeShiftService.getOne(queryWrapper);
+		if (billetHotsendChangeShift == null) {
+			log.info("{}{}", "5号机查询当班热送热装数量维护到交班信息失败,交班记录为空!", new Date());
+			return;
+		}
+		commonHot1(billetHotsendChangeShift);
+	}
+
+	/**
+	 * 6号机	热送、热装、堆垛、定尺明细、数量维护到交班信息
+	 */
+	@ApiOperation(value="6号机统计热送热装数量维护到交班信息", notes="6号机统计热送热装数量维护到交班信息")
+	@GetMapping(value = "/executeShiftTask222")
+	public void executeShiftTask22() {
+		log.info("6号机统计热送热装数量维护到交班信息!");
+		// 根据铸机号、交班结束时间倒序并不为空,查询交班记录,
+		LambdaQueryWrapper<BilletHotsendChangeShift> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(BilletHotsendChangeShift::getCcmNo, "6")
+				.orderByDesc(BilletHotsendChangeShift::getChangeShiftTime)
+				.ne(BilletHotsendChangeShift::getChangeShiftTime, null)
+				.last("limit 1");
+		BilletHotsendChangeShift billetHotsendChangeShift = billetHotsendChangeShiftService.getOne(queryWrapper);
+		if (billetHotsendChangeShift == null) {
+			log.info("{}{}", "6号机查询当班热送热装数量维护到交班信息失败,交班记录为空!", new Date());
+			return;
+		}
+		commonHot1(billetHotsendChangeShift);
+	}
+
+	/**
+	 *
+	 * @param billetHotsendChangeShift
+	 */
+	private void commonHot1(BilletHotsendChangeShift billetHotsendChangeShift) {
+		// 根据ccmNo、shift、shiftGroup、交班开始时间到交班结束时间范围 查询对应钢坯基础信息所有数据
+		LambdaQueryWrapper<BilletBasicInfo> queryWrapper1 = new LambdaQueryWrapper<>();
+		queryWrapper1.eq(BilletBasicInfo::getCcmNo, billetHotsendChangeShift.getCcmNo());
+		queryWrapper1.eq(BilletBasicInfo::getShift, billetHotsendChangeShift.getShift());
+		queryWrapper1.eq(BilletBasicInfo::getShiftGroup, billetHotsendChangeShift.getShiftGroup());
+		queryWrapper1.between(BilletBasicInfo::getCreateTime, billetHotsendChangeShift.getCreateTime(), billetHotsendChangeShift.getChangeShiftTime());
+		List<BilletBasicInfo> billetBasicInfoList = billetBasicInfoService.list(queryWrapper1);
+		if (oConvertUtils.listIsNotEmpty(billetBasicInfoList)){
+			int totalCountHotsend = 0;
+			double totalWeightHotsend = 0d;
+
+			int totalCountHotfeign = 0;
+			double totalWeightHotfeign = 0d;
+			for (BilletBasicInfo billetBasicInfo : billetBasicInfoList) {
+				// 热送统计  支数、重量
+				if ("roll_height".equals(billetBasicInfo.getBelongTable()) || "roll_club_one".equals(billetBasicInfo.getBelongTable())) {
+					totalCountHotsend ++;
+					if (billetBasicInfo.getBilletWeight() != null) {
+						totalWeightHotsend += billetBasicInfo.getBilletWeight();
+					}
+				}
+				// 热装统计  支数、重量
+				if ("roll_club_two".equals(billetBasicInfo.getBelongTable()) || "roll_club_three".equals(billetBasicInfo.getBelongTable()) || "roll_out_shipp".equals(billetBasicInfo.getBelongTable())) {
+					totalCountHotfeign ++;
+					if (billetBasicInfo.getBilletWeight() != null) {
+						totalWeightHotfeign += billetBasicInfo.getBilletWeight();
+					}
+				}
+
+				// 保留 4 位小数
+				totalWeightHotsend = new BigDecimal(totalWeightHotsend).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
+				// 保留 4 位小数
+				totalWeightHotfeign = new BigDecimal(totalWeightHotfeign).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
+			}
+
+			// 班组定尺
+			List<DestinationStatisticsDetails> lengthGroupList = new ArrayList<>();
+			Map<Integer, GroupInfo> lengthGroupMap = new HashMap<>();
+			String ccmNo = billetHotsendChangeShift.getCcmNo();
+			for (BilletBasicInfo info : billetBasicInfoList) {
+				int length = info.getLength();
+				double weight = info.getBilletWeight();
+				GroupInfo groupInfo = lengthGroupMap.computeIfAbsent(length, k -> new GroupInfo());
+				groupInfo.sum++;
+				groupInfo.weight += weight;
+			}
+			for (Map.Entry<Integer, GroupInfo> entry : lengthGroupMap.entrySet()) {
+				int length = entry.getKey();
+				GroupInfo groupInfo = entry.getValue();
+				// 保留 4 位小数
+				BigDecimal bd = new BigDecimal(groupInfo.weight).setScale(4, BigDecimal.ROUND_HALF_UP);
+				double roundedWeight = bd.doubleValue();
+				DestinationStatisticsDetails details = new DestinationStatisticsDetails(
+						String.valueOf(length),
+						groupInfo.sum,
+						roundedWeight,
+						ccmNo
+				);
+				lengthGroupList.add(details);
+			}
+
+
+			// 班次热送统计  支数、重量
+			billetHotsendChangeShift.setShiftHotsendWeight(totalWeightHotsend);
+			billetHotsendChangeShift.setShiftHotsendAmount(totalCountHotsend);
+
+			// 班次热装统计  支数、重量
+			billetHotsendChangeShift.setShiftHotfeignAmount(totalCountHotfeign);
+			billetHotsendChangeShift.setShiftHotfeignWeight(totalWeightHotfeign);
+
+			// 班次定尺明细
+			billetHotsendChangeShift.setSizeDetailsList(lengthGroupList);
+		}
+
+
+
+		// 堆垛统计  支数、重量   根据铸机号、班组、班别、时间范围。查询起跺日志明细表
+		int stackCount = 0;
+		double stackWeight = 0d;
+		LambdaQueryWrapper<StackingUpLog> stackingUpLogQueryWrapper = new LambdaQueryWrapper<>();
+		stackingUpLogQueryWrapper.eq(StackingUpLog::getCcmNo, billetHotsendChangeShift.getCcmNo());
+		stackingUpLogQueryWrapper.eq(StackingUpLog::getShift, billetHotsendChangeShift.getShift());
+		stackingUpLogQueryWrapper.eq(StackingUpLog::getShiftGroup, billetHotsendChangeShift.getShiftGroup());
+		stackingUpLogQueryWrapper.between(StackingUpLog::getCreateTime, billetHotsendChangeShift.getCreateTime(), billetHotsendChangeShift.getChangeShiftTime());
+		List<StackingUpLog> stackingUpLogList = stackingUpLogService.list(stackingUpLogQueryWrapper);
+		if (oConvertUtils.listIsNotEmpty(stackingUpLogList)) {
+			// 收集所有的 billetNo
+			Set<String> allBilletNos = new HashSet<>();
+			for (StackingUpLog stackingUpLog : stackingUpLogList) {
+				if (oConvertUtils.isNotEmpty(stackingUpLog.getBilletNo())) {
+					String[] billetNoArray = stackingUpLog.getBilletNo().split(",");
+					allBilletNos.addAll(Arrays.asList(billetNoArray));
+				}
+			}
+			// 通过billetNo匹配 billetBasicInfoList中的坯号
+			for (BilletBasicInfo billetBasicInfo : billetBasicInfoList) {
+				if (allBilletNos.contains(billetBasicInfo.getBilletNo())) {
+					stackCount ++;
+					if (billetBasicInfo.getBilletWeight() != null) {
+						stackWeight += billetBasicInfo.getBilletWeight();
+					}
+				}
+			}
+			// 保留 4 位小数
+			stackWeight = new BigDecimal(stackWeight).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
+			// 班次堆垛统计  支数、重量
+			billetHotsendChangeShift.setShiftStackAmount(stackCount);
+			billetHotsendChangeShift.setShiftStackWeight(stackWeight);
+		}
+
+		billetHotsendChangeShiftService.updateById(billetHotsendChangeShift);
+	}
+
+	/**
+	 * 5号机 班次吊运明细维护到交班信息
+	 */
+	@ApiOperation(value="5号机统计班次吊运明细维护到交班信息", notes="5号机统计班次吊运明细维护到交班信息")
+	@GetMapping(value = "/executeShiftTask333")
+	public void executeShiftTask33() {
+		log.info("5号机统计班次吊运明细维护到交班信息!");
+		// 根据铸机号、交班结束时间倒序并不为空,查询交班记录,
+		LambdaQueryWrapper<BilletHotsendChangeShift> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(BilletHotsendChangeShift::getCcmNo, "5")
+				.orderByDesc(BilletHotsendChangeShift::getChangeShiftTime)
+				.ne(BilletHotsendChangeShift::getChangeShiftTime, null)
+				.last("limit 1");
+		BilletHotsendChangeShift billetHotsendChangeShift = billetHotsendChangeShiftService.getOne(queryWrapper);
+		if (billetHotsendChangeShift == null) {
+			log.info("{}{}", "查询当班吊运明细维护交班信息失败,交班记录为空!", new Date());
+			return;
+		}
+		commonBilletLiftingBill(billetHotsendChangeShift);
+	}
+
+	/**
+	 * 6号机 班次吊运明细维护到交班信息
+	 */
+	@ApiOperation(value="6号机统计班次吊运明细维护到交班信息", notes="6号机统计班次吊运明细维护到交班信息")
+	@GetMapping(value = "/executeShiftTask444")
+	public void executeShiftTask44() {
+		log.info("6号机统计班次吊运明细维护到交班信息!");
+		// 根据铸机号、交班结束时间倒序并不为空,查询交班记录,
+		LambdaQueryWrapper<BilletHotsendChangeShift> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(BilletHotsendChangeShift::getCcmNo, "6")
+				.orderByDesc(BilletHotsendChangeShift::getChangeShiftTime)
+				.ne(BilletHotsendChangeShift::getChangeShiftTime, null)
+				.last("limit 1");
+		BilletHotsendChangeShift billetHotsendChangeShift = billetHotsendChangeShiftService.getOne(queryWrapper);
+		if (billetHotsendChangeShift == null) {
+			log.info("{}{}", "6号机查询当班热送热装数量维护到交班信息失败,交班记录为空!", new Date());
+			return;
+		}
+		commonBilletLiftingBill(billetHotsendChangeShift);
+	}
+
+	/**
+	 * 统计班次吊运明细维护到交班信息
+	 * @param billetHotsendChangeShift
+	 */
+	private void commonBilletLiftingBill(BilletHotsendChangeShift billetHotsendChangeShift) {
+		// 根据ccmNo、shift、shiftGroup、交班开始时间到交班结束时间范围 查询对应钢坯基础信息所有数据
+		LambdaQueryWrapper<BilletBasicInfo> queryWrapper1 = new LambdaQueryWrapper<>();
+		queryWrapper1.eq(BilletBasicInfo::getCcmNo, billetHotsendChangeShift.getCcmNo())
+				.eq(BilletBasicInfo::getShift, billetHotsendChangeShift.getShift())
+				.eq(BilletBasicInfo::getShiftGroup, billetHotsendChangeShift.getShiftGroup())
+				.between(BilletBasicInfo::getCreateTime, billetHotsendChangeShift.getCreateTime(), billetHotsendChangeShift.getChangeShiftTime());
+		List<BilletBasicInfo> billetBasicInfoList = billetBasicInfoService.list(queryWrapper1);
+		if (oConvertUtils.listIsEmpty(billetBasicInfoList)){
+			log.info("{}{}", "查询班次实绩吊运明细,钢坯基础信息为空!", billetHotsendChangeShift.getCcmNo());
+			return;
+		}
+		// 班次吊运信息
+		// 根据铸机号、班组、班别、交班的创建时间,查询当班行车吊运单信息,
+		LambdaQueryWrapper<BilletLiftingBill> queryWrapper2 = new LambdaQueryWrapper<>();
+		queryWrapper2.eq(BilletLiftingBill::getCcmNo, billetHotsendChangeShift.getCcmNo())
+				.eq(BilletLiftingBill::getShift, billetHotsendChangeShift.getShift())
+				.eq(BilletLiftingBill::getShiftGroup, billetHotsendChangeShift.getShiftGroup())
+				.between(BilletLiftingBill::getCreateTime, billetHotsendChangeShift.getCreateTime(), billetHotsendChangeShift.getChangeShiftTime())
+				.groupBy(BilletLiftingBill::getVehicleNumber);
+		List<BilletLiftingBill> billetLiftingBillList = billetLiftingBillService.list(queryWrapper2);
+		if (oConvertUtils.listIsEmpty(billetLiftingBillList)){
+			log.info("{}{}", "查询当班行车吊运信息为空!", new Date());
+			return;
+		}
+		List<String> vehicleNumberList = billetLiftingBillList.stream().map(BilletLiftingBill::getVehicleNumber).collect(Collectors.toList());
+		List<OnDutyLiftingBillDetails> allDetailsList = new ArrayList<>();
+		for (String vehicleNumber : vehicleNumberList) {
+			OnDutyLiftingBillDetails details = new OnDutyLiftingBillDetails();
+			details.setVehicleNumber(vehicleNumber);
+			details.setChangeShiftCreateTime(billetHotsendChangeShift.getCreateTime());
+			// 热送统计
+			countAndSet(details, billetHotsendChangeShift, vehicleNumber, "0","hotSendAmont");
+			// 热装统计
+			countAndSet(details, billetHotsendChangeShift, vehicleNumber, "1","hotChargingAmont");
+			// 堆垛统计
+			countAndSet(details, billetHotsendChangeShift, vehicleNumber, "2","stackingAmont");
+			allDetailsList.add(details);
+		}
+		billetHotsendChangeShift.setLiftingBillDetailsList(allDetailsList);
+		billetHotsendChangeShiftService.updateById(billetHotsendChangeShift);
+	}
+
+	/**
+	 * 5号机
+	 *
+	 * 班次
+	 * 吊运明细、轧钢棒二、轧钢棒三、轧钢上若
+	 * 维护到交班信息
+	 *
+	 */
+	@ApiOperation(value="5号机统计班次吊运明细、轧钢棒二、轧钢棒三、轧钢上若维护到交班信息", notes="5号机统计班次吊运明细、轧钢棒二、轧钢棒三、轧钢上若维护到交班信息")
+	@GetMapping(value = "/executeShiftTask555")
+	public void executeShiftTask55() {
+		log.info("5号机统计班次吊运明细、轧钢棒二、轧钢棒三、轧钢上若维护到交班信息!");
+		// 根据铸机号、交班结束时间倒序并不为空,查询交班记录,
+		LambdaQueryWrapper<BilletHotsendChangeShift> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(BilletHotsendChangeShift::getCcmNo, "5")
+				.orderByDesc(BilletHotsendChangeShift::getChangeShiftTime)
+				.ne(BilletHotsendChangeShift::getChangeShiftTime, null)
+				.last("limit 1");
+		BilletHotsendChangeShift billetHotsendChangeShift = billetHotsendChangeShiftService.getOne(queryWrapper);
+		if (billetHotsendChangeShift == null) {
+			log.info("{}{}", "5号机查询班次实绩吊运明细、轧钢棒二、轧钢棒三、轧钢上若维护到交班信息失败,交班记录为空!", new Date());
+			return;
+		}
+		commonShift1(billetHotsendChangeShift);
+	}
+
+	/**
+	 * 6号机
+	 *
+	 * 班次
+	 * 吊运明细、轧钢棒二、轧钢棒三、轧钢上若
+	 * 维护到交班信息
+	 *
+	 */
+	@ApiOperation(value="6号机统计班次吊运明细、轧钢棒二、轧钢棒三、轧钢上若维护到交班信息", notes="6号机统计班次吊运明细、轧钢棒二、轧钢棒三、轧钢上若维护到交班信息")
+	@GetMapping(value = "/executeShiftTask666")
+	public void executeShiftTask66() {
+		log.info("6号机统计班次吊运明细、轧钢棒二、轧钢棒三、轧钢上若维护到交班信息!");
+		// 根据铸机号、交班结束时间倒序并不为空,查询交班记录,
+		LambdaQueryWrapper<BilletHotsendChangeShift> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(BilletHotsendChangeShift::getCcmNo, "6")
+				.orderByDesc(BilletHotsendChangeShift::getChangeShiftTime)
+				.ne(BilletHotsendChangeShift::getChangeShiftTime, null)
+				.last("limit 1");
+		BilletHotsendChangeShift billetHotsendChangeShift = billetHotsendChangeShiftService.getOne(queryWrapper);
+		if (billetHotsendChangeShift == null) {
+			log.info("{}{}", "6号机查询班次实绩吊运明细、轧钢棒二、轧钢棒三、轧钢上若维护到交班信息失败,交班记录为空!", new Date());
+			return;
+		}
+		commonShift1(billetHotsendChangeShift);
+
+	}
+
+	/**
+	 * 5.6号机
+	 * 统计班次吊运明细、轧钢棒二、轧钢棒三、轧钢上若维护到交班信息 公共方法
+	 * @param billetHotsendChangeShift
+	 */
+	private void commonShift1(BilletHotsendChangeShift billetHotsendChangeShift) {
+
+		// 班次装运统计  车次总数、总重、总支数  查询当班装运单信息
+		LambdaQueryWrapper<StorageBill> queryWrapper3 = new LambdaQueryWrapper<>();
+		queryWrapper3.eq(StorageBill::getCcmNo, billetHotsendChangeShift.getCcmNo())
+				.eq(StorageBill::getShift, billetHotsendChangeShift.getShift())
+				.eq(StorageBill::getShiftGroup, billetHotsendChangeShift.getShiftGroup())
+				.isNotNull(StorageBill::getDestination)
+				.ne(StorageBill::getTypeConfigId, "1024")
+				.between(StorageBill::getCreateTime, billetHotsendChangeShift.getCreateTime(), billetHotsendChangeShift.getChangeShiftTime());
+		List<StorageBill> storageBillList = storageBillService.list(queryWrapper3);
+		if (oConvertUtils.listIsEmpty(storageBillList)){
+			log.info("{}{}", "查询班次实绩吊运明细、轧钢棒二、轧钢棒三、轧钢上若,装运信息为空!", billetHotsendChangeShift.getCcmNo());
+			return;
+		}
+		List<DestinationStatisticsDetails> statisticsDetailsList1 = new ArrayList<>();
+		List<DestinationStatisticsDetails> statisticsDetailsList2 = new ArrayList<>();
+		List<DestinationStatisticsDetails> statisticsDetailsList3 = new ArrayList<>();
+
+		for (StorageBill storageBill : storageBillList) {
+			if ("棒二".equals(storageBill.getDestination())) {
+				LambdaQueryWrapper<RollClubTwoDetails> queryWrapper4 = new LambdaQueryWrapper<>();
+				queryWrapper4.eq(RollClubTwoDetails::getCcmNo, billetHotsendChangeShift.getCcmNo())
+						.eq(RollClubTwoDetails::getStorageBillId, storageBill.getId());
+				List<RollClubTwoDetails> rollClubTwoDetailsList = rollClubTwoDetailsService.list(queryWrapper4);
+				if (oConvertUtils.listIsNotEmpty(rollClubTwoDetailsList)) {
+					List<DestinationStatisticsDetails> currentList1 = rollClubTwoDetailsList.stream()
+							.collect(Collectors.groupingBy(RollClubTwoDetails::getSize))
+							.entrySet().stream()
+							.map(entry -> {
+								String size = entry.getKey();
+								List<RollClubTwoDetails> group = entry.getValue();
+								// 统计 blankOutput 总和
+								Double totalBlankOutput = group.stream()
+										.mapToDouble(RollClubTwoDetails::getBlankOutput)
+										.sum();
+								BigDecimal bd = BigDecimal.valueOf(totalBlankOutput).setScale(4, BigDecimal.ROUND_HALF_UP);
+								totalBlankOutput = bd.doubleValue();
+								// 统计数量
+								Integer totalNums = group.stream()
+										.mapToInt(detail -> detail.getStackAddr() != null ? 4 : 1).sum();
+								// 取第一个元素的 ccmNo 作为该分组的 ccmNo
+								String ccmNos = group.isEmpty() ? null : group.get(0).getCcmNo();
+								return new DestinationStatisticsDetails(size, totalNums, totalBlankOutput, ccmNos);
+							}).collect(Collectors.toList());
+					statisticsDetailsList1.addAll(currentList1);
+				}
+			}
+
+			if ("棒三".equals(storageBill.getDestination())) {
+				LambdaQueryWrapper<RollClubThreeDetails> queryWrapper5 = new LambdaQueryWrapper<>();
+				queryWrapper5.eq(RollClubThreeDetails::getCcmNo, billetHotsendChangeShift.getCcmNo())
+						.eq(RollClubThreeDetails::getStorageBillId, storageBill.getId());
+				List<RollClubThreeDetails> rollClubThreeDetailsList = rollClubThreeDetailsService.list(queryWrapper5);
+				if (oConvertUtils.listIsNotEmpty(rollClubThreeDetailsList)) {
+					List<DestinationStatisticsDetails> currentList2 = rollClubThreeDetailsList.stream()
+							.collect(Collectors.groupingBy(RollClubThreeDetails::getSize))
+							.entrySet().stream()
+							.map(entry -> {
+								String size = entry.getKey();
+								List<RollClubThreeDetails> group = entry.getValue();
+								// 统计 blankOutput 总和
+								Double totalBlankOutput = group.stream()
+										.mapToDouble(RollClubThreeDetails::getBlankOutput)
+										.sum();
+								BigDecimal bd = BigDecimal.valueOf(totalBlankOutput).setScale(4, BigDecimal.ROUND_HALF_UP);
+								totalBlankOutput = bd.doubleValue();
+								// 统计数量
+								Integer totalNums = group.stream()
+										.mapToInt(detail -> detail.getStackAddr() != null ? 4 : 1).sum();
+								// 取第一个元素的 ccmNo 作为该分组的 ccmNo
+								String ccmNos = group.isEmpty() ? null : group.get(0).getCcmNo();
+								return new DestinationStatisticsDetails(size, totalNums, totalBlankOutput, ccmNos);
+							}).collect(Collectors.toList());
+					statisticsDetailsList2.addAll(currentList2);
+				}
+			}
+
+			if ("上若".equals(storageBill.getDestination())) {
+				LambdaQueryWrapper<RollOutShippDetails> queryWrapper6 = new LambdaQueryWrapper<>();
+				queryWrapper6.eq(RollOutShippDetails::getCcmNo, billetHotsendChangeShift.getCcmNo())
+						.eq(RollOutShippDetails::getStorageBillId, storageBill.getId());
+				List<RollOutShippDetails> rollOutShippDetailsList = rollOutShippDetailsService.list(queryWrapper6);
+				if (oConvertUtils.listIsNotEmpty(rollOutShippDetailsList)) {
+					List<DestinationStatisticsDetails> currentList3 = rollOutShippDetailsList.stream()
+							.collect(Collectors.groupingBy(RollOutShippDetails::getSize))
+							.entrySet().stream()
+							.map(entry -> {
+								String size = entry.getKey();
+								List<RollOutShippDetails> group = entry.getValue();
+								// 统计 blankOutput 总和
+								Double totalBlankOutput = group.stream()
+										.mapToDouble(RollOutShippDetails::getBlankOutput)
+										.sum();
+								BigDecimal bd = BigDecimal.valueOf(totalBlankOutput).setScale(4, BigDecimal.ROUND_HALF_UP);
+								totalBlankOutput = bd.doubleValue();
+								// 统计数量
+								Integer totalNums = group.stream()
+										.mapToInt(detail -> detail.getStackAddr() != null ? 4 : 1).sum();
+								// 取第一个元素的 ccmNo 作为该分组的 ccmNo
+								String ccmNos = group.isEmpty() ? null : group.get(0).getCcmNo();
+								return new DestinationStatisticsDetails(size, totalNums, totalBlankOutput, ccmNos);
+							}).collect(Collectors.toList());
+					statisticsDetailsList3.addAll(currentList3);
+				}
+			}
+		}
+
+		// 合并三个列表并根据 size 分组统计
+		List<DestinationStatisticsDetails> mergedList = Stream.concat(
+						Stream.concat(statisticsDetailsList1.stream(), statisticsDetailsList2.stream()),
+						statisticsDetailsList3.stream()
+				).collect(Collectors.groupingBy(DestinationStatisticsDetails::getSize))
+				.entrySet().stream()
+				.map(entry -> {
+					String size = entry.getKey();
+					List<DestinationStatisticsDetails> group = entry.getValue();
+					int totalNums = group.stream().mapToInt(DestinationStatisticsDetails::getNums).sum();
+					double totalBlankOutput = group.stream().mapToDouble(DestinationStatisticsDetails::getBlankOutput).sum();
+					BigDecimal bd = BigDecimal.valueOf(totalBlankOutput).setScale(4, BigDecimal.ROUND_HALF_UP);
+					double finalBlankOutput = bd.doubleValue();
+					String ccmNoForGroup = group.isEmpty() ? null : group.get(0).getCcmNo();
+					return new DestinationStatisticsDetails(size, totalNums, finalBlankOutput, ccmNoForGroup);
+				}).collect(Collectors.toList());
+		// 遍历mergedList获取nums总和
+		int finalAmountTotal = mergedList.stream().mapToInt(DestinationStatisticsDetails::getNums).sum();
+		// 遍历mergedList获取blankOutput总和
+		double finalBlankOutputs = mergedList.stream().mapToDouble(DestinationStatisticsDetails::getBlankOutput).sum();
+		BigDecimal bd = BigDecimal.valueOf(finalBlankOutputs).setScale(4, BigDecimal.ROUND_HALF_UP);
+
+
+		// 装运总支数
+		billetHotsendChangeShift.setCounts(finalAmountTotal);
+
+		// 装运总重量
+		billetHotsendChangeShift.setBlankOutputs(bd.doubleValue());
+
+		// 轧钢棒二明细
+		billetHotsendChangeShift.setRollClubTwoDetails(statisticsDetailsList1);
+
+		// 轧钢棒三明细
+		billetHotsendChangeShift.setRollClubThreeDetails(statisticsDetailsList2);
+
+		// 轧钢上若明细
+		billetHotsendChangeShift.setRollClubShipDetails(statisticsDetailsList3);
+		billetHotsendChangeShiftService.updateById(billetHotsendChangeShift);
 	}
 
 
+	/**
+	 * 5号机
+	 * 班次
+	 * 轧钢棒一明细
+	 * 维护到交班信息
+	 */
+	@ApiOperation(value="5号机统计班次轧钢棒一明细维护到交班信息", notes="5号机统计班次轧钢棒一明细维护到交班信息")
+	@GetMapping(value = "/executeShiftTask777")
+	public void executeShiftTask77() {
+		log.info("5号机统计班次轧钢棒一明细维护到交班信息!");
+		// 根据铸机号、交班结束时间倒序并不为空,查询交班记录,
+		LambdaQueryWrapper<BilletHotsendChangeShift> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(BilletHotsendChangeShift::getCcmNo, "5")
+				.orderByDesc(BilletHotsendChangeShift::getChangeShiftTime)
+				.ne(BilletHotsendChangeShift::getChangeShiftTime, null)
+				.last("limit 1");
+		BilletHotsendChangeShift billetHotsendChangeShift = billetHotsendChangeShiftService.getOne(queryWrapper);
+		if (billetHotsendChangeShift == null) {
+			log.info("{}{}", "5号机查询班次实绩轧钢棒一,交班记录为空!", new Date());
+			return;
+		}
+
+		// 班次实绩, 统计轧钢棒一
+		List<DestinationStatisticsDetails> rollClubOneDetailsStatisticsList = new ArrayList<>();
+		LambdaQueryWrapper<RollClubOneDetails> queryWrapperDetails = new LambdaQueryWrapper<>();
+		queryWrapperDetails.eq(RollClubOneDetails::getCcmNo, billetHotsendChangeShift.getCcmNo())
+				.eq(RollClubOneDetails::getShift, billetHotsendChangeShift.getShift())
+				.eq(RollClubOneDetails::getShiftGroup, billetHotsendChangeShift.getShiftGroup())
+				.between(RollClubOneDetails::getCreateTime, billetHotsendChangeShift.getCreateTime(), billetHotsendChangeShift.getChangeShiftTime());
+		List<RollClubOneDetails> rollClubOneDetailsList = rollClubOneDetailsService.list(queryWrapperDetails);
+		if (oConvertUtils.listIsEmpty(rollClubOneDetailsList)){
+			log.info("{}{}", "5号机查询班次实绩轧钢棒一,装运单为空!", new Date());
+			return;
+		}
+		// 根据size属性进行分组,并统计每组的总数和总重 直接在流操作中完成分组、求和并保留 4 位小数
+		Map<String, Double> sumBySizeAndCcmNo = rollClubOneDetailsList.stream()
+				.collect(Collectors.groupingBy(
+						roll -> roll.getSize() + "_" + roll.getCcmNo(),
+						Collectors.collectingAndThen(
+								Collectors.summingDouble(RollClubOneDetails::getBlankOutput),
+								sum -> BigDecimal.valueOf(sum)
+										.setScale(4, BigDecimal.ROUND_HALF_UP)
+										.doubleValue()
+						)
+				));
+
+		Map<String, Long> countBySizeAndCcmNo = rollClubOneDetailsList.stream()
+				// 通过一个Function将size和ccmNo组合起来作为分组的键
+				.collect(Collectors.groupingBy(roll -> roll.getSize() + "_" + roll.getCcmNo(),
+						// 直接使用Collectors.counting()来统计每个分组内元素的个数
+						Collectors.counting()
+				));
+		sumBySizeAndCcmNo.forEach((size, totalWeight) -> {
+			String[] parts = size.split("_");
+			String sizeStr = parts[0];
+			String ccmNoStr = parts[1];
+			long count = countBySizeAndCcmNo.get(size);
+			// 找到第一个匹配size的RollClubOneDetails对象获取其ccmNo值(假设ccmNo在同一size分组内是相同的,如有不同需调整逻辑)
+			rollClubOneDetailsStatisticsList.add(new DestinationStatisticsDetails(sizeStr, (int) count, totalWeight, ccmNoStr));
+		});
+
+		billetHotsendChangeShift.setRollClubOneDetails(rollClubOneDetailsStatisticsList);
+
+		billetHotsendChangeShiftService.updateById(billetHotsendChangeShift);
+
+	}
+
+
+	/**
+	 * 6号机
+	 * 班次
+	 * 轧钢高线明细
+	 * 维护到交班信息
+	 */
+	@ApiOperation(value="6号机统计班次轧钢高线明细维护到交班信息", notes="6号机统计班次轧钢高线明细维护到交班信息")
+	@GetMapping(value = "/executeShiftTask888")
+	public void executeShiftTask88() {
+		log.info("6号机统计班次轧钢高线明细维护到交班信息!");
+		// 根据铸机号、交班结束时间倒序并不为空,查询交班记录,
+		LambdaQueryWrapper<BilletHotsendChangeShift> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(BilletHotsendChangeShift::getCcmNo, "6")
+				.orderByDesc(BilletHotsendChangeShift::getChangeShiftTime)
+				.ne(BilletHotsendChangeShift::getChangeShiftTime, null)
+				.last("limit 1");
+		BilletHotsendChangeShift billetHotsendChangeShift = billetHotsendChangeShiftService.getOne(queryWrapper);
+		if (billetHotsendChangeShift == null) {
+			log.info("{}{}", "6号机查询班次实绩轧钢高线明细,交班记录为空!", new Date());
+			return;
+		}
+
+		List<DestinationStatisticsDetails> rollHeightStatisticsDetailsList = new ArrayList<>();
+		LambdaQueryWrapper<RollHeightDetails> queryWrapperDetails6 = new LambdaQueryWrapper<>();
+		queryWrapperDetails6.eq(RollHeightDetails::getCcmNo, billetHotsendChangeShift.getCcmNo())
+				.eq(RollHeightDetails::getShift, billetHotsendChangeShift.getShift())
+				.eq(RollHeightDetails::getShiftGroup, billetHotsendChangeShift.getShiftGroup())
+				.between(RollHeightDetails::getCreateTime, billetHotsendChangeShift.getCreateTime(), billetHotsendChangeShift.getChangeShiftTime());
+		List<RollHeightDetails> rollHeightDetailsList = rollHeightDetailsService.list(queryWrapperDetails6);
+		if (oConvertUtils.listIsEmpty(rollHeightDetailsList)){
+			log.info("{}{}", "6号机查询班次实绩轧钢高线,明细为空!", new Date());
+			return;
+		}
+
+		// 根据size属性进行分组,并统计每组的总数和总重 直接在流操作中完成分组、求和并保留 4 位小数
+		Map<String, Double> sumBySizeAndCcmNo1 = rollHeightDetailsList.stream()
+				.collect(Collectors.groupingBy(
+						roll -> roll.getSize() + "_" + roll.getCcmNo(),
+						Collectors.collectingAndThen(
+								Collectors.summingDouble(RollHeightDetails::getBlankOutput),
+								sum -> {
+									DecimalFormat df = new DecimalFormat("#.####");
+									return Double.parseDouble(df.format(sum));
+								}
+						)
+				));
+
+		Map<String, Long> countBySizeAndCcmNo1 = rollHeightDetailsList.stream()
+				// 通过一个Function将size和ccmNo组合起来作为分组的键
+				.collect(Collectors.groupingBy(roll -> roll.getSize() + "_" + roll.getCcmNo(),
+						// 直接使用Collectors.counting()来统计每个分组内元素的个数
+						Collectors.counting()
+				));
+
+		sumBySizeAndCcmNo1.forEach((size, totalWeight) -> {
+			String[] parts = size.split("_");
+			String sizeStr = parts[0];
+			String ccmNoStr = parts[1];
+			long count = countBySizeAndCcmNo1.get(size);
+			// 找到第一个匹配size的RollClubOneDetails对象获取其ccmNo值(假设ccmNo在同一size分组内是相同的,如有不同需调整逻辑)
+			rollHeightStatisticsDetailsList.add(new DestinationStatisticsDetails(sizeStr, (int) count, totalWeight, ccmNoStr));
+		});
+
+		billetHotsendChangeShift.setRollClubHeightDetails(rollHeightStatisticsDetailsList);
+		billetHotsendChangeShiftService.updateById(billetHotsendChangeShift);
+
+	}
+
 	@ApiOperation(value="班次实绩查询-分页列表查询", notes="班次实绩查询-分页列表查询")
 	@GetMapping(value = "/shiftPerformanceList")
 	public Result<IPage<BilletShiftPerformance>> queryShiftPerformanceListPageList(BilletHotsendChangeShift billetHotsendChangeShift,

+ 111 - 35
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetHotsendChangeShift/entity/BilletHotsendChangeShift.java

@@ -1,19 +1,24 @@
 package org.jeecg.modules.billet.billetHotsendChangeShift.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.jeecg.modules.billet.rollHeight.entity.DestinationStatisticsDetails;
+import org.jeecg.modules.billet.storageBill.entity.OnDutyLiftingBillDetails;
 import org.jeecgframework.poi.excel.annotation.Excel;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 
 /**
  * @Description: 钢坯交班记录
@@ -29,86 +34,157 @@ import java.util.Date;
 public class BilletHotsendChangeShift implements Serializable {
     private static final long serialVersionUID = 1L;
 
-	/**主键*/
-	@TableId(type = IdType.ASSIGN_ID)
+    /**主键*/
+    @TableId(type = IdType.ASSIGN_ID)
     @ApiModelProperty(value = "主键")
     private String id;
-	/**创建人*/
+    /**创建人*/
     @ApiModelProperty(value = "创建人")
     private String createBy;
-	/**创建日期*/
-	@JsonFormat(timezone = "GMT+8",pattern = "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 createTime;
-	/**更新人*/
+    /**更新人*/
     @ApiModelProperty(value = "更新人")
     private String updateBy;
-	/**更新日期*/
-	@JsonFormat(timezone = "GMT+8",pattern = "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 updateTime;
-	/**所属部门*/
+    /**所属部门*/
     @ApiModelProperty(value = "所属部门")
     private String sysOrgCode;
     /**铸机*/
     @Excel(name = "铸机号", width = 15)
     @ApiModelProperty(value = "铸机号")
     private String ccmNo;
-	/**当前浇铸炉号*/
-	@Excel(name = "当前浇铸炉号", width = 15)
+    /**当前浇铸炉号*/
+    @Excel(name = "当前浇铸炉号", width = 15)
     @ApiModelProperty(value = "当前浇铸炉号")
     private String heatNo;
-	/**班组*/
-	@Excel(name = "班组", width = 15)
+    /**班组*/
+    @Excel(name = "班组", width = 15)
     @ApiModelProperty(value = "班组")
     private String shiftGroup;
-	/**班别*/
-	@Excel(name = "班别", width = 15)
+    /**班别*/
+    @Excel(name = "班别", width = 15)
     @ApiModelProperty(value = "班别")
     private String shift;
-	/**当前生产支数*/
-	@Excel(name = "当前生产支数", width = 15)
+    /**当前生产支数*/
+    @Excel(name = "当前生产支数", width = 15)
     @ApiModelProperty(value = "当前生产支数")
     private Integer productAmount;
-	/**当前废品支数*/
-	@Excel(name = "当前废品支数", width = 15)
+    /**当前废品支数*/
+    @Excel(name = "当前废品支数", width = 15)
     @ApiModelProperty(value = "当前废品支数")
     private Integer wasteAmount;
-	/**当前热送支数*/
-	@Excel(name = "当前热送支数", width = 15)
+    /**当前热送支数*/
+    @Excel(name = "当前热送支数", width = 15)
     @ApiModelProperty(value = "当前热送支数")
     private Integer hotsendAmount;
-	/**当前热装支数*/
-	@Excel(name = "当前热装支数", width = 15)
+    /**当前热装支数*/
+    @Excel(name = "当前热装支数", width = 15)
     @ApiModelProperty(value = "当前热装支数")
     private Integer hotfeignAmount;
-	/**当前起垛支数*/
-	@Excel(name = "当前起垛支数", width = 15)
+    /**当前起垛支数*/
+    @Excel(name = "当前起垛支数", width = 15)
     @ApiModelProperty(value = "当前起垛支数")
     private Integer stackAmount;
-	/**当班总重*/
-	@Excel(name = "当班总重", width = 15)
+    /**当班总重*/
+    @Excel(name = "当班总重", width = 15)
     @ApiModelProperty(value = "当班总重")
     private Double shiftProduct;
-	/**当班总数*/
-	@Excel(name = "当班总数", width = 15)
+    /**当班总数*/
+    @Excel(name = "当班总数", width = 15)
     @ApiModelProperty(value = "当班总数")
     private Integer shiftSum;
-	/**车牌号*/
-	@Excel(name = "车牌号", width = 15)
+    /**车牌号*/
+    @Excel(name = "车牌号", width = 15)
     @ApiModelProperty(value = "车牌号")
     private String carNumber;
-	/**出车号*/
-	@Excel(name = "车次", width = 15)
+    /**出车号*/
+    @Excel(name = "车次", width = 15)
     @ApiModelProperty(value = "车次")
     private Integer outCarNum;
-	/**备注*/
-	@Excel(name = "备注", width = 15)
+    /**备注*/
+    @Excel(name = "备注", width = 15)
     @ApiModelProperty(value = "备注")
     private String remark;
     @Excel(name = "交班时间", width = 15)
     @ApiModelProperty(value = "交班时间")
     private Date changeShiftTime;
+
+    // 2025/03/19
+    /**当前热送支数*/
+    @Excel(name = "当班热送总支数", width = 15)
+    @ApiModelProperty(value = "当前热送支数")
+    private Integer shiftHotsendAmount;
+
+    /**当前热送支数*/
+    @Excel(name = "当班热送总重量", width = 15)
+    @ApiModelProperty(value = "当前热送重量")
+    private Double shiftHotsendWeight;
+
+    /**当前热装支数*/
+    @Excel(name = "当班热装总支数", width = 15)
+    @ApiModelProperty(value = "当前热装支数")
+    private Integer shiftHotfeignAmount;
+
+    /**当前热装支数*/
+    @Excel(name = "当班热装总重量", width = 15)
+    @ApiModelProperty(value = "当前热装重量")
+    private Double shiftHotfeignWeight;
+
+    /**当前起垛支数*/
+    @Excel(name = "当班起垛总支数", width = 15)
+    @ApiModelProperty(value = "当前起垛支数")
+    private Integer shiftStackAmount;
+
+    /**当前起垛支数*/
+    @Excel(name = "当班起垛总重量", width = 15)
+    @ApiModelProperty(value = "当前起垛重量")
+    private Double shiftStackWeight;
+
+
+    @ApiModelProperty(value = "装运总车次")
+    private Integer allCarNum;
+
+    @ApiModelProperty(value = "装运总支数")
+    private Integer counts;
+
+    @ApiModelProperty(value = "装运总重量")
+    private Double blankOutputs;
+
+
+    @ApiModelProperty(value = "轧钢棒一明细")
+    @TableField(typeHandler = FastjsonTypeHandler.class)
+    private List<DestinationStatisticsDetails> rollClubOneDetails;
+
+    @ApiModelProperty(value = "轧钢棒二明细")
+    @TableField(typeHandler = FastjsonTypeHandler.class)
+    private List<DestinationStatisticsDetails> rollClubTwoDetails;
+
+    @ApiModelProperty(value = "轧钢棒三明细")
+    @TableField(typeHandler = FastjsonTypeHandler.class)
+    private List<DestinationStatisticsDetails> rollClubThreeDetails;
+
+    @ApiModelProperty(value = "轧钢高线明细")
+    @TableField(typeHandler = FastjsonTypeHandler.class)
+    private List<DestinationStatisticsDetails> rollClubHeightDetails;
+
+    @ApiModelProperty(value = "轧钢上若明细")
+    @TableField(typeHandler = FastjsonTypeHandler.class)
+    private List<DestinationStatisticsDetails> rollClubShipDetails;
+
+    // 班组定尺明细
+    @ApiModelProperty(value = "班组定尺明细")
+    @TableField(typeHandler = FastjsonTypeHandler.class)
+    private List<DestinationStatisticsDetails> sizeDetailsList;
+
+    @ApiModelProperty(value = "班次吊运信息")
+    @TableField(typeHandler = FastjsonTypeHandler.class)
+    private List<OnDutyLiftingBillDetails>  liftingBillDetailsList;
 }