Przeglądaj źródła

查询棒一、棒二、棒三、上若统计明细

qiangxuan 1 miesiąc temu
rodzic
commit
b17f29f0af

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

@@ -35,6 +35,8 @@ import org.jeecg.modules.billet.billetOriginalProductRecord.dto.LengthCountQuery
 import org.jeecg.modules.billet.billetOriginalProductRecord.entity.BilletOriginalProductRecord;
 import org.jeecg.modules.billet.billetOriginalProductRecord.service.IBilletOriginalProductRecordService;
 import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.modules.billet.billetOriginalProductRecord.vo.BilletDetailsInfo;
+import org.jeecg.modules.billet.billetOriginalProductRecord.vo.BilletStatisticsDetail;
 import org.jeecg.modules.billet.billetOriginalProductRecord.vo.LengthCountVO;
 import org.jeecg.modules.billet.storageBill.entity.HeatsActualsInfo;
 import org.jeecg.modules.billet.storageBill.entity.StorageBillPrint;
@@ -74,9 +76,6 @@ public class BilletOriginalProductRecordController extends JeecgController<Bille
 	 @Autowired
 	 private IBilletHotsendBaseService billetHotsendBaseService;
 
-	 @Autowired
-	 private IHeatsActualsService heatsActualsService;
-
 	 @Autowired
 	 private IBilletBasicInfoService billetBasicInfoService;
 
@@ -847,6 +846,702 @@ public class BilletOriginalProductRecordController extends JeecgController<Bille
 		 return heatsActualsInfoList;
 	 }
 
+	 @ApiOperation(value="钢坯棒一棒二棒三上若统计明细查询", notes="钢坯棒一棒二棒三上若统计明细查询")
+	 @GetMapping(value = "/queryBilletStatisticsDetailByCcmNo")
+	 public Result<List<BilletDetailsInfo>> queryBilletStatisticsDetailByCcmNo(@RequestParam(name="ccmNo") String ccmNo,
+																	 		   @RequestParam(name="changeShiftId", required = false) String changeShiftId,
+																			   @RequestParam(name="queryDate", required = false) String queryDate,
+																	           @RequestParam(name="queryType") String queryType) {
+		 List<BilletDetailsInfo> billetDetailsInfoList = new ArrayList<>();
+		 if (queryType.equals("1") && oConvertUtils.isNotEmpty(queryDate)){
+			 // 查询棒一,指定日期的统计明细
+			 billetDetailsInfoList = queryRollClubOneStatisticsByDate(ccmNo, queryDate);
+		 }else if(queryType.equals("1") && oConvertUtils.isNotEmpty(changeShiftId)){
+			 // 查询棒一,指定班次的统计明细
+			 billetDetailsInfoList = queryRollClubOneStatisticsByShiftId(ccmNo, changeShiftId);
+		 }else if(queryType.equals("2") && oConvertUtils.isNotEmpty(queryDate)){
+			 // 查询棒二,指定班次的统计明细
+			 billetDetailsInfoList = queryRollClubTwoStatisticsByDate(ccmNo, queryDate);
+		 }else if(queryType.equals("2") && oConvertUtils.isNotEmpty(changeShiftId)){
+			 // 查询棒二,指定班次的统计明细
+			 billetDetailsInfoList = queryRollClubTwoStatisticsByShiftId(ccmNo, changeShiftId);
+		 }else if(queryType.equals("3") && oConvertUtils.isNotEmpty(queryDate)){
+			 // 查询棒三,指定班次的统计明细
+			 billetDetailsInfoList = queryRollClubThreeStatisticsByDate(ccmNo, queryDate);
+		 }else if(queryType.equals("3") && oConvertUtils.isNotEmpty(changeShiftId)){
+			 // 查询棒三,指定班次的统计明细
+			 billetDetailsInfoList = queryRollClubThreeStatisticsByShiftId(ccmNo, changeShiftId);
+		 }else if(queryType.equals("4") && oConvertUtils.isNotEmpty(queryDate)){
+			 // 查询上若,指定班次的统计明细
+			 billetDetailsInfoList = queryRollOutShippStatisticsByDate(ccmNo, queryDate);
+		 }else if(queryType.equals("4") && oConvertUtils.isNotEmpty(changeShiftId)){
+			 // 查询上若,指定班次的统计明细
+			 billetDetailsInfoList = queryRollOutShippStatisticsByShiftId(ccmNo, changeShiftId);
+		 }
+		 return Result.OK(billetDetailsInfoList);
+	 }
+
+	 /**
+	  * 棒一统计明细查询
+	  * @param ccmNo
+	  * @param queryDate
+	  * @return
+	  */
+	 private List<BilletDetailsInfo> queryRollClubOneStatisticsByDate(String ccmNo, String queryDate) {
+		 List<BilletDetailsInfo> billetDetailsInfoList = new ArrayList<>();
+		 String queryDateTime = queryDate + " 00:00:00";
+		 Date date = DateUtils.parseDatetime(queryDateTime);
+		 Date startTime = DateUtils.getStartOfDayByDate(date);
+		 Date endTime = DateUtils.getEndOfDayByDate(date);
+
+		 // 通过铸机号、开始时间、结束时间查询
+		 QueryWrapper<BilletOriginalProductRecord> queryWrapper = new QueryWrapper<>();
+		 queryWrapper.eq("ccm_no", ccmNo);
+		 queryWrapper.between("create_time", startTime, endTime);
+		 List<BilletOriginalProductRecord> billetOriginalProductRecordList = billetOriginalProductRecordService.list(queryWrapper);
+		 if (oConvertUtils.listIsEmpty(billetOriginalProductRecordList)){
+			 return billetDetailsInfoList;
+		 }
+
+		 Map<String, BilletStatisticsDetail> statisticsMap = new HashMap<>();
+
+		 int grandTotalCount = 0;
+		 double grandTotalWeight = 0.0d;
+
+		 for (BilletOriginalProductRecord record : billetOriginalProductRecordList) {
+			 String rollClubOneDetails = record.getRollClubOneDetails();
+			 if (rollClubOneDetails != null && !rollClubOneDetails.isEmpty()) {
+				 try {
+					 JSONObject detailsJson = JSON.parseObject(rollClubOneDetails);
+					 // 此处totalCount未被使用,可以考虑移除
+					 int totalCount = detailsJson.getIntValue("directRollingTotalCount");
+					 grandTotalCount += totalCount;
+
+					 JSONObject lengthGroupCount = detailsJson.getJSONObject("lengthGroupCount");
+					 if (lengthGroupCount != null) {
+						 for (Map.Entry<String, Object> entry : lengthGroupCount.entrySet()) {
+							 String size = entry.getKey();
+							 // 增加类型检查,避免潜在的空指针异常
+							 int count = Integer.parseInt(entry.getValue().toString());
+							 double sizeValue = Double.parseDouble(size);
+							 updateStatistics(statisticsMap, size, count, sizeValue);
+						 }
+					 }
+				 } catch (Exception e) {
+					 log.error("解析rollClubOneDetails失败: {}", rollClubOneDetails, e);
+				 }
+			 }
+		 }
+		 grandTotalWeight = statisticsMap.values().stream()
+				 .mapToDouble(BilletStatisticsDetail::getBlankOutput)
+				 .sum();
+
+		 if (!statisticsMap.isEmpty()) {
+			 BilletDetailsInfo info = new BilletDetailsInfo();
+			 info.setCcmNo(ccmNo);
+			 info.setCounts(grandTotalCount);
+			 info.setTotalWeight(grandTotalWeight);
+
+			 List<BilletStatisticsDetail> detailsList = new ArrayList<>(statisticsMap.values());
+			 info.setRollClubOneStatisticsList(detailsList);
+
+			 billetDetailsInfoList.add(info);
+		 }
+
+		 return billetDetailsInfoList;
+	 }
+	 /**
+	  * 棒一统计明细查询
+	  * @param ccmNo
+	  * @param changeShiftId
+	  * @return
+	  */
+	 private List<BilletDetailsInfo> queryRollClubOneStatisticsByShiftId(String ccmNo, String changeShiftId) {
+		 List<BilletDetailsInfo> billetDetailsInfoList = new ArrayList<>();
+		 // 根据铸机号、交班记录ID,获取交班记录中的班别、班次、创建时间
+		 LambdaQueryWrapper<BilletHotsendChangeShift> queryWrapper = new LambdaQueryWrapper<>();
+		 queryWrapper.eq(BilletHotsendChangeShift::getId, changeShiftId).eq(BilletHotsendChangeShift::getCcmNo, ccmNo);
+		 BilletHotsendChangeShift billetHotsendChangeShift = billetHotsendChangeShiftService.getOne(queryWrapper);
+		 if (billetHotsendChangeShift == null){
+			 log.info("{}{}", "查询棒一统计明细失败,交班记录为空!", ccmNo + "交班ID:" + changeShiftId);
+			 return billetDetailsInfoList;
+		 }
+		 String shift = billetHotsendChangeShift.getShift();
+		 String shiftGroup = billetHotsendChangeShift.getShiftGroup();
+
+		 Date startTime = billetHotsendChangeShift.getCreateTime();
+		 Date endTime;
+		 if (oConvertUtils.isEmpty(billetHotsendChangeShift.getChangeShiftTime())) {
+			 endTime = new Date();
+		 } else {
+			 endTime = billetHotsendChangeShift.getChangeShiftTime();
+		 }
+		 // 通过铸机号、开始时间、结束时间查询 钢坯原始生产记录
+		 QueryWrapper<BilletOriginalProductRecord> queryWrapper1 = new QueryWrapper<>();
+		 queryWrapper1.eq("ccm_no", ccmNo);
+		 queryWrapper1.eq("shift", shift);
+		 queryWrapper1.eq("shift_group", shiftGroup);
+		 queryWrapper1.between("create_time", startTime, endTime);
+		 List<BilletOriginalProductRecord> billetOriginalProductRecordList = billetOriginalProductRecordService.list(queryWrapper1);
+		 if (oConvertUtils.listIsEmpty(billetOriginalProductRecordList)){
+			 return billetDetailsInfoList;
+		 }
+		 Map<String, BilletStatisticsDetail> statisticsMap = new HashMap<>();
+
+		 int grandTotalCount = 0;
+		 double grandTotalWeight = 0.0d;
+
+		 for (BilletOriginalProductRecord record : billetOriginalProductRecordList) {
+			 String rollClubOneDetails = record.getRollClubOneDetails();
+			 if (rollClubOneDetails != null && !rollClubOneDetails.isEmpty()) {
+				 try {
+					 JSONObject detailsJson = JSON.parseObject(rollClubOneDetails);
+					 int totalCount = detailsJson.getIntValue("directRollingTotalCount");
+					 grandTotalCount += totalCount;
+					 JSONObject lengthGroupCount = detailsJson.getJSONObject("lengthGroupCount");
+					 if (lengthGroupCount != null) {
+						 for (Map.Entry<String, Object> entry : lengthGroupCount.entrySet()) {
+							 String size = entry.getKey();
+							 // 增加类型检查,避免潜在的空指针异常
+							 int count = Integer.parseInt(entry.getValue().toString());
+							 double sizeValue = Double.parseDouble(size);
+							 updateStatistics(statisticsMap, size, count, sizeValue);
+						 }
+					 }
+				 } catch (Exception e) {
+					 log.error("解析rollClubOneDetails失败: {}", rollClubOneDetails, e);
+				 }
+			 }
+		 }
+		 grandTotalWeight = statisticsMap.values().stream()
+				 .mapToDouble(BilletStatisticsDetail::getBlankOutput)
+				 .sum();
+
+		 if (!statisticsMap.isEmpty()) {
+			 BilletDetailsInfo info = new BilletDetailsInfo();
+			 info.setCcmNo(ccmNo);
+			 info.setCounts(grandTotalCount);
+			 info.setTotalWeight(grandTotalWeight);
+			 List<BilletStatisticsDetail> detailsList = new ArrayList<>(statisticsMap.values());
+			 info.setRollClubOneStatisticsList(detailsList);
+			 billetDetailsInfoList.add(info);
+		 }
+		 return billetDetailsInfoList;
+	 }
+	 /**
+	 * 棒二统计明细查询
+	 * @param ccmNo
+	 * @param queryDate
+	 * @return
+	 */
+	 private List<BilletDetailsInfo> queryRollClubTwoStatisticsByDate(String ccmNo, String queryDate) {
+		 List<BilletDetailsInfo> billetDetailsInfoList = new ArrayList<>();
+		 String queryDateTime = queryDate + " 00:00:00";
+		 Date date = DateUtils.parseDatetime(queryDateTime);
+		 Date startTime = DateUtils.getStartOfDayByDate(date);
+		 Date endTime = DateUtils.getEndOfDayByDate(date);
+
+		 // 根据铸机号、开始时间、结束时间查询查询装运单打印表
+		 LambdaQueryWrapper<StorageBillPrint> queryWrapper = new LambdaQueryWrapper<>();
+		 queryWrapper.eq(StorageBillPrint::getCcmNo, ccmNo)
+				 .eq(StorageBillPrint::getDestination, "棒二")
+				 .between(StorageBillPrint::getArrivalTime, startTime, endTime)
+				 .orderByDesc(StorageBillPrint::getArrivalTime);
+		 List<StorageBillPrint> storageBillPrintList = storageBillPrintService.list(queryWrapper);
+
+		 if (oConvertUtils.listIsEmpty(storageBillPrintList)) {
+			 log.info("{}{}", "指定日期棒二统计信息查询装运单打印表为空!", queryDate);
+			 return billetDetailsInfoList;
+		 }
+
+		 // 创建并初始化BilletDetailsInfo对象
+		 BilletDetailsInfo billetDetailsInfo = new BilletDetailsInfo();
+		 billetDetailsInfo.setCcmNo(ccmNo); // 设置铸机号
+
+		 // 按定尺(size)分组统计
+		 Map<String, List<StorageBillPrint>> sizeGroupMap = storageBillPrintList.stream()
+				 .filter(item -> item.getSize() != null && item.getAmountTotal() != null)
+				 .collect(Collectors.groupingBy(StorageBillPrint::getSize));
+
+		 // 计算每个分组的统计结果
+		 List<BilletStatisticsDetail> statisticsDetails = new ArrayList<>();
+		 for (Map.Entry<String, List<StorageBillPrint>> entry : sizeGroupMap.entrySet()) {
+			 String size = entry.getKey();
+			 List<StorageBillPrint> groupItems = entry.getValue();
+
+			 // 计算总支数
+			 Integer totalAmount = groupItems.stream()
+					 .mapToInt(StorageBillPrint::getAmountTotal)
+					 .sum();
+
+			 // 计算总重量: (size/1000) * amountTotal * 0.2265,保留4位小数
+			 double totalWeight = groupItems.stream()
+					 .filter(item -> item.getAmountTotal() != null)
+					 .mapToDouble(item -> {
+						 try {
+							 double sizeValue = Double.parseDouble(size);
+							 return (sizeValue / 1000) * item.getAmountTotal() * 0.2265;
+						 } catch (NumberFormatException e) {
+							 return 0.0;
+						 }
+					 }).sum();
+
+			 // 保留4位小数
+			 totalWeight = Math.round(totalWeight * 10000.0) / 10000.0;
+
+			 // 创建统计明细对象并添加到结果列表
+			 BilletStatisticsDetail detail = new BilletStatisticsDetail(totalAmount, totalWeight, size);
+			 statisticsDetails.add(detail);
+		 }
+
+		 // 设置统计结果到BilletDetailsInfo对象
+		 billetDetailsInfo.setRollClubTwoStatisticsList(statisticsDetails);
+
+		 // 计算并设置总车次、总支数和总重量
+		 billetDetailsInfo.setAllCarNum(storageBillPrintList.size()); // 总车次为记录数
+		 billetDetailsInfo.setCounts(statisticsDetails.stream().mapToInt(BilletStatisticsDetail::getAmountTotal).sum());
+		 billetDetailsInfo.setTotalWeight(statisticsDetails.stream().mapToDouble(BilletStatisticsDetail::getBlankOutput).sum());
+
+		 // 添加到结果列表
+		 billetDetailsInfoList.add(billetDetailsInfo);
+
+		 return billetDetailsInfoList;
+	 }
+	 /**
+	 * 棒二统计明细查询
+	 * @param ccmNo
+	 * @param changeShiftId
+	 * @return
+	 */
+	 private List<BilletDetailsInfo> queryRollClubTwoStatisticsByShiftId(String ccmNo, String changeShiftId) {
+		 List<BilletDetailsInfo> billetDetailsInfoList = new ArrayList<>();
+		 // 根据铸机号、交班记录ID,获取交班记录中的班别、班次、创建时间
+		 LambdaQueryWrapper<BilletHotsendChangeShift> queryWrapper = new LambdaQueryWrapper<>();
+		 queryWrapper.eq(BilletHotsendChangeShift::getId, changeShiftId).eq(BilletHotsendChangeShift::getCcmNo, ccmNo);
+		 BilletHotsendChangeShift billetHotsendChangeShift = billetHotsendChangeShiftService.getOne(queryWrapper);
+		 if (billetHotsendChangeShift == null){
+			 log.info("{}{}", "查询指定班次,棒二统计明细失败,交班记录为空!", ccmNo + "交班ID:" + changeShiftId);
+			 return billetDetailsInfoList;
+		 }
+		 String shift = billetHotsendChangeShift.getShift();
+		 String shiftGroup = billetHotsendChangeShift.getShiftGroup();
+
+		 Date startTime = billetHotsendChangeShift.getCreateTime();
+		 Date endTime;
+		 if (oConvertUtils.isEmpty(billetHotsendChangeShift.getChangeShiftTime())) {
+			 endTime = new Date();
+		 } else {
+			 endTime = billetHotsendChangeShift.getChangeShiftTime();
+		 }
+		 String shiftAndShiftGroup = shift + "/" + shiftGroup;
+		 // 根据铸机号、开始时间、结束时间查询查询装运单打印表
+		 LambdaQueryWrapper<StorageBillPrint> queryWrapper1 = new LambdaQueryWrapper<>();
+		 queryWrapper1.eq(StorageBillPrint::getCcmNo, ccmNo)
+				 .eq(StorageBillPrint::getDestination, "棒二")
+				 .eq(StorageBillPrint::getClasses, shiftAndShiftGroup)
+				 .between(StorageBillPrint::getArrivalTime, startTime, endTime)
+				 .orderByDesc(StorageBillPrint::getArrivalTime);
+		 List<StorageBillPrint> storageBillPrintList = storageBillPrintService.list(queryWrapper1);
+		 if (oConvertUtils.listIsEmpty(storageBillPrintList)) {
+			 log.info("{}{}", "指定班次棒二统计信息查询装运单打印表为空!", changeShiftId);
+			 return billetDetailsInfoList;
+		 }
+		 // 创建并初始化BilletDetailsInfo对象
+		 BilletDetailsInfo billetDetailsInfo = new BilletDetailsInfo();
+		 billetDetailsInfo.setCcmNo(ccmNo); // 设置铸机号
+
+		 // 按定尺(size)分组统计
+		 Map<String, List<StorageBillPrint>> sizeGroupMap = storageBillPrintList.stream()
+				 .filter(item -> item.getSize() != null && item.getAmountTotal() != null)
+				 .collect(Collectors.groupingBy(StorageBillPrint::getSize));
+
+		 // 计算每个分组的统计结果
+		 List<BilletStatisticsDetail> statisticsDetails = new ArrayList<>();
+		 for (Map.Entry<String, List<StorageBillPrint>> entry : sizeGroupMap.entrySet()) {
+			 String size = entry.getKey();
+			 List<StorageBillPrint> groupItems = entry.getValue();
+
+			 // 计算总支数
+			 Integer totalAmount = groupItems.stream()
+					 .mapToInt(StorageBillPrint::getAmountTotal)
+					 .sum();
+
+			 // 计算总重量: (size/1000) * amountTotal * 0.2265,保留4位小数
+			 double totalWeight = groupItems.stream()
+					 .filter(item -> item.getAmountTotal() != null)
+					 .mapToDouble(item -> {
+						 try {
+							 double sizeValue = Double.parseDouble(size);
+							 return (sizeValue / 1000) * item.getAmountTotal() * 0.2265;
+						 } catch (NumberFormatException e) {
+							 return 0.0;
+						 }
+					 }).sum();
+
+			 // 保留4位小数
+			 totalWeight = Math.round(totalWeight * 10000.0) / 10000.0;
+
+			 // 创建统计明细对象并添加到结果列表
+			 BilletStatisticsDetail detail = new BilletStatisticsDetail(totalAmount, totalWeight, size);
+			 statisticsDetails.add(detail);
+		 }
+
+		 // 设置统计结果到BilletDetailsInfo对象
+		 billetDetailsInfo.setRollClubTwoStatisticsList(statisticsDetails);
+
+		 // 计算并设置总车次、总支数和总重量
+		 billetDetailsInfo.setAllCarNum(storageBillPrintList.size()); // 总车次为记录数
+		 billetDetailsInfo.setCounts(statisticsDetails.stream().mapToInt(BilletStatisticsDetail::getAmountTotal).sum());
+		 billetDetailsInfo.setTotalWeight(statisticsDetails.stream().mapToDouble(BilletStatisticsDetail::getBlankOutput).sum());
+
+		 // 添加到结果列表
+		 billetDetailsInfoList.add(billetDetailsInfo);
+
+		 return billetDetailsInfoList;
+	 }
+	 /**
+	 * 棒三统计明细查询
+	 * @param ccmNo
+	 * @param queryDate
+	 * @return
+	 */
+	 private List<BilletDetailsInfo> queryRollClubThreeStatisticsByDate(String ccmNo, String queryDate) {
+		 List<BilletDetailsInfo> billetDetailsInfoList = new ArrayList<>();
+		 String queryDateTime = queryDate + " 00:00:00";
+		 Date date = DateUtils.parseDatetime(queryDateTime);
+		 Date startTime = DateUtils.getStartOfDayByDate(date);
+		 Date endTime = DateUtils.getEndOfDayByDate(date);
+
+		 // 根据铸机号、开始时间、结束时间查询查询装运单打印表
+		 LambdaQueryWrapper<StorageBillPrint> queryWrapper = new LambdaQueryWrapper<>();
+		 queryWrapper.eq(StorageBillPrint::getCcmNo, ccmNo)
+				 .eq(StorageBillPrint::getDestination, "棒三")
+				 .between(StorageBillPrint::getArrivalTime, startTime, endTime)
+				 .orderByDesc(StorageBillPrint::getArrivalTime);
+		 List<StorageBillPrint> storageBillPrintList = storageBillPrintService.list(queryWrapper);
+
+		 if (oConvertUtils.listIsEmpty(storageBillPrintList)) {
+			 log.info("{}{}", "指定日期棒三统计信息查询装运单打印表为空!", queryDate);
+			 return billetDetailsInfoList;
+		 }
+
+		 // 创建并初始化BilletDetailsInfo对象
+		 BilletDetailsInfo billetDetailsInfo = new BilletDetailsInfo();
+		 billetDetailsInfo.setCcmNo(ccmNo); // 设置铸机号
+
+		 // 按定尺(size)分组统计
+		 Map<String, List<StorageBillPrint>> sizeGroupMap = storageBillPrintList.stream()
+				 .filter(item -> item.getSize() != null && item.getAmountTotal() != null)
+				 .collect(Collectors.groupingBy(StorageBillPrint::getSize));
+
+		 // 计算每个分组的统计结果
+		 List<BilletStatisticsDetail> statisticsDetails = new ArrayList<>();
+		 for (Map.Entry<String, List<StorageBillPrint>> entry : sizeGroupMap.entrySet()) {
+			 String size = entry.getKey();
+			 List<StorageBillPrint> groupItems = entry.getValue();
+
+			 // 计算总支数
+			 Integer totalAmount = groupItems.stream()
+					 .mapToInt(StorageBillPrint::getAmountTotal)
+					 .sum();
+
+			 // 计算总重量: (size/1000) * amountTotal * 0.2265,保留4位小数
+			 double totalWeight = groupItems.stream()
+					 .filter(item -> item.getAmountTotal() != null)
+					 .mapToDouble(item -> {
+						 try {
+							 double sizeValue = Double.parseDouble(size);
+							 return (sizeValue / 1000) * item.getAmountTotal() * 0.2265;
+						 } catch (NumberFormatException e) {
+							 return 0.0;
+						 }
+					 }).sum();
+
+			 // 保留4位小数
+			 totalWeight = Math.round(totalWeight * 10000.0) / 10000.0;
+
+			 // 创建统计明细对象并添加到结果列表
+			 BilletStatisticsDetail detail = new BilletStatisticsDetail(totalAmount, totalWeight, size);
+			 statisticsDetails.add(detail);
+		 }
+
+		 // 设置统计结果到BilletDetailsInfo对象
+		 billetDetailsInfo.setRollClubThreeStatisticsList(statisticsDetails);
+
+		 // 计算并设置总车次、总支数和总重量
+		 billetDetailsInfo.setAllCarNum(storageBillPrintList.size()); // 总车次为记录数
+		 billetDetailsInfo.setCounts(statisticsDetails.stream().mapToInt(BilletStatisticsDetail::getAmountTotal).sum());
+		 billetDetailsInfo.setTotalWeight(statisticsDetails.stream().mapToDouble(BilletStatisticsDetail::getBlankOutput).sum());
+
+		 // 添加到结果列表
+		 billetDetailsInfoList.add(billetDetailsInfo);
+
+		 return billetDetailsInfoList;
+	 }
+	 /**
+	 * 棒三统计明细查询
+	 * @param ccmNo
+	 * @param changeShiftId
+	 * @return
+	 */
+	 private List<BilletDetailsInfo> queryRollClubThreeStatisticsByShiftId(String ccmNo, String changeShiftId) {
+		 List<BilletDetailsInfo> billetDetailsInfoList = new ArrayList<>();
+		 // 根据铸机号、交班记录ID,获取交班记录中的班别、班次、创建时间
+		 LambdaQueryWrapper<BilletHotsendChangeShift> queryWrapper = new LambdaQueryWrapper<>();
+		 queryWrapper.eq(BilletHotsendChangeShift::getId, changeShiftId).eq(BilletHotsendChangeShift::getCcmNo, ccmNo);
+		 BilletHotsendChangeShift billetHotsendChangeShift = billetHotsendChangeShiftService.getOne(queryWrapper);
+		 if (billetHotsendChangeShift == null){
+			 log.info("{}{}", "查询指定班次,棒三统计明细失败,交班记录为空!", ccmNo + "交班ID:" + changeShiftId);
+			 return billetDetailsInfoList;
+		 }
+		 String shift = billetHotsendChangeShift.getShift();
+		 String shiftGroup = billetHotsendChangeShift.getShiftGroup();
+
+		 Date startTime = billetHotsendChangeShift.getCreateTime();
+		 Date endTime;
+		 if (oConvertUtils.isEmpty(billetHotsendChangeShift.getChangeShiftTime())) {
+			 endTime = new Date();
+		 } else {
+			 endTime = billetHotsendChangeShift.getChangeShiftTime();
+		 }
+		 String shiftAndShiftGroup = shift + "/" + shiftGroup;
+		 // 根据铸机号、开始时间、结束时间查询查询装运单打印表
+		 LambdaQueryWrapper<StorageBillPrint> queryWrapper1 = new LambdaQueryWrapper<>();
+		 queryWrapper1.eq(StorageBillPrint::getCcmNo, ccmNo)
+				 .eq(StorageBillPrint::getDestination, "棒三")
+				 .eq(StorageBillPrint::getClasses, shiftAndShiftGroup)
+				 .between(StorageBillPrint::getArrivalTime, startTime, endTime)
+				 .orderByDesc(StorageBillPrint::getArrivalTime);
+		 List<StorageBillPrint> storageBillPrintList = storageBillPrintService.list(queryWrapper1);
+		 if (oConvertUtils.listIsEmpty(storageBillPrintList)) {
+			 log.info("{}{}", "指定班次,棒三统计信息查询,装运单打印表为空!", changeShiftId);
+			 return billetDetailsInfoList;
+		 }
+		 // 创建并初始化BilletDetailsInfo对象
+		 BilletDetailsInfo billetDetailsInfo = new BilletDetailsInfo();
+		 billetDetailsInfo.setCcmNo(ccmNo); // 设置铸机号
+
+		 // 按定尺(size)分组统计
+		 Map<String, List<StorageBillPrint>> sizeGroupMap = storageBillPrintList.stream()
+				 .filter(item -> item.getSize() != null && item.getAmountTotal() != null)
+				 .collect(Collectors.groupingBy(StorageBillPrint::getSize));
+
+		 // 计算每个分组的统计结果
+		 List<BilletStatisticsDetail> statisticsDetails = new ArrayList<>();
+		 for (Map.Entry<String, List<StorageBillPrint>> entry : sizeGroupMap.entrySet()) {
+			 String size = entry.getKey();
+			 List<StorageBillPrint> groupItems = entry.getValue();
+
+			 // 计算总支数
+			 Integer totalAmount = groupItems.stream()
+					 .mapToInt(StorageBillPrint::getAmountTotal)
+					 .sum();
+
+			 // 计算总重量: (size/1000) * amountTotal * 0.2265,保留4位小数
+			 double totalWeight = groupItems.stream()
+					 .filter(item -> item.getAmountTotal() != null)
+					 .mapToDouble(item -> {
+						 try {
+							 double sizeValue = Double.parseDouble(size);
+							 return (sizeValue / 1000) * item.getAmountTotal() * 0.2265;
+						 } catch (NumberFormatException e) {
+							 return 0.0;
+						 }
+					 }).sum();
+
+			 // 保留4位小数
+			 totalWeight = Math.round(totalWeight * 10000.0) / 10000.0;
+
+			 // 创建统计明细对象并添加到结果列表
+			 BilletStatisticsDetail detail = new BilletStatisticsDetail(totalAmount, totalWeight, size);
+			 statisticsDetails.add(detail);
+		 }
+
+		 // 设置统计结果到BilletDetailsInfo对象
+		 billetDetailsInfo.setRollClubThreeStatisticsList(statisticsDetails);
+
+		 // 计算并设置总车次、总支数和总重量
+		 billetDetailsInfo.setAllCarNum(storageBillPrintList.size()); // 总车次为记录数
+		 billetDetailsInfo.setCounts(statisticsDetails.stream().mapToInt(BilletStatisticsDetail::getAmountTotal).sum());
+		 billetDetailsInfo.setTotalWeight(statisticsDetails.stream().mapToDouble(BilletStatisticsDetail::getBlankOutput).sum());
+
+		 // 添加到结果列表
+		 billetDetailsInfoList.add(billetDetailsInfo);
+
+		 return billetDetailsInfoList;
+	 }
+	 /**
+	 * 上若统计明细查询
+	 * @param ccmNo
+	 * @param queryDate
+	 * @return
+	 */
+	 private List<BilletDetailsInfo> queryRollOutShippStatisticsByDate(String ccmNo, String queryDate) {
+		 List<BilletDetailsInfo> billetDetailsInfoList = new ArrayList<>();
+		 String queryDateTime = queryDate + " 00:00:00";
+		 Date date = DateUtils.parseDatetime(queryDateTime);
+		 Date startTime = DateUtils.getStartOfDayByDate(date);
+		 Date endTime = DateUtils.getEndOfDayByDate(date);
+
+		 // 根据铸机号、开始时间、结束时间查询查询装运单打印表
+		 LambdaQueryWrapper<StorageBillPrint> queryWrapper = new LambdaQueryWrapper<>();
+		 queryWrapper.eq(StorageBillPrint::getCcmNo, ccmNo)
+				 .eq(StorageBillPrint::getDestination, "上若")
+				 .between(StorageBillPrint::getArrivalTime, startTime, endTime)
+				 .orderByDesc(StorageBillPrint::getArrivalTime);
+		 List<StorageBillPrint> storageBillPrintList = storageBillPrintService.list(queryWrapper);
+
+		 if (oConvertUtils.listIsEmpty(storageBillPrintList)) {
+			 log.info("{}{}", "指定日期上若统计信息查询装运单打印表为空!", queryDate);
+			 return billetDetailsInfoList;
+		 }
+
+		 // 创建并初始化BilletDetailsInfo对象
+		 BilletDetailsInfo billetDetailsInfo = new BilletDetailsInfo();
+		 billetDetailsInfo.setCcmNo(ccmNo); // 设置铸机号
+
+		 // 按定尺(size)分组统计
+		 Map<String, List<StorageBillPrint>> sizeGroupMap = storageBillPrintList.stream()
+				 .filter(item -> item.getSize() != null && item.getAmountTotal() != null)
+				 .collect(Collectors.groupingBy(StorageBillPrint::getSize));
+
+		 // 计算每个分组的统计结果
+		 List<BilletStatisticsDetail> statisticsDetails = new ArrayList<>();
+		 for (Map.Entry<String, List<StorageBillPrint>> entry : sizeGroupMap.entrySet()) {
+			 String size = entry.getKey();
+			 List<StorageBillPrint> groupItems = entry.getValue();
+
+			 // 计算总支数
+			 Integer totalAmount = groupItems.stream()
+					 .mapToInt(StorageBillPrint::getAmountTotal)
+					 .sum();
+
+			 // 计算总重量: (size/1000) * amountTotal * 0.2265,保留4位小数
+			 double totalWeight = groupItems.stream()
+					 .filter(item -> item.getAmountTotal() != null)
+					 .mapToDouble(item -> {
+						 try {
+							 double sizeValue = Double.parseDouble(size);
+							 return (sizeValue / 1000) * item.getAmountTotal() * 0.2265;
+						 } catch (NumberFormatException e) {
+							 return 0.0;
+						 }
+					 }).sum();
+
+			 // 保留4位小数
+			 totalWeight = Math.round(totalWeight * 10000.0) / 10000.0;
+
+			 // 创建统计明细对象并添加到结果列表
+			 BilletStatisticsDetail detail = new BilletStatisticsDetail(totalAmount, totalWeight, size);
+			 statisticsDetails.add(detail);
+		 }
+
+		 // 设置统计结果到BilletDetailsInfo对象
+		 billetDetailsInfo.setRollOutShippStatisticsList(statisticsDetails);
+
+		 // 计算并设置总车次、总支数和总重量
+		 billetDetailsInfo.setAllCarNum(storageBillPrintList.size()); // 总车次为记录数
+		 billetDetailsInfo.setCounts(statisticsDetails.stream().mapToInt(BilletStatisticsDetail::getAmountTotal).sum());
+		 billetDetailsInfo.setTotalWeight(statisticsDetails.stream().mapToDouble(BilletStatisticsDetail::getBlankOutput).sum());
+
+		 // 添加到结果列表
+		 billetDetailsInfoList.add(billetDetailsInfo);
+
+		 return billetDetailsInfoList;
+	 }
+	 /**
+	 * 上若统计明细查询
+	 * @param ccmNo
+	 * @param changeShiftId
+	 * @return
+	 */
+	 private List<BilletDetailsInfo> queryRollOutShippStatisticsByShiftId(String ccmNo, String changeShiftId) {
+		 List<BilletDetailsInfo> billetDetailsInfoList = new ArrayList<>();
+		 // 根据铸机号、交班记录ID,获取交班记录中的班别、班次、创建时间
+		 LambdaQueryWrapper<BilletHotsendChangeShift> queryWrapper = new LambdaQueryWrapper<>();
+		 queryWrapper.eq(BilletHotsendChangeShift::getId, changeShiftId).eq(BilletHotsendChangeShift::getCcmNo, ccmNo);
+		 BilletHotsendChangeShift billetHotsendChangeShift = billetHotsendChangeShiftService.getOne(queryWrapper);
+		 if (billetHotsendChangeShift == null){
+			 log.info("{}{}", "查询指定班次,上若统计明细失败,交班记录为空!", ccmNo + "交班ID:" + changeShiftId);
+			 return billetDetailsInfoList;
+		 }
+		 String shift = billetHotsendChangeShift.getShift();
+		 String shiftGroup = billetHotsendChangeShift.getShiftGroup();
+
+		 Date startTime = billetHotsendChangeShift.getCreateTime();
+		 Date endTime;
+		 if (oConvertUtils.isEmpty(billetHotsendChangeShift.getChangeShiftTime())) {
+			 endTime = new Date();
+		 } else {
+			 endTime = billetHotsendChangeShift.getChangeShiftTime();
+		 }
+		 String shiftAndShiftGroup = shift + "/" + shiftGroup;
+		 // 根据铸机号、开始时间、结束时间查询查询装运单打印表
+		 LambdaQueryWrapper<StorageBillPrint> queryWrapper1 = new LambdaQueryWrapper<>();
+		 queryWrapper1.eq(StorageBillPrint::getCcmNo, ccmNo)
+				 .eq(StorageBillPrint::getDestination, "上若")
+				 .eq(StorageBillPrint::getClasses, shiftAndShiftGroup)
+				 .between(StorageBillPrint::getArrivalTime, startTime, endTime)
+				 .orderByDesc(StorageBillPrint::getArrivalTime);
+		 List<StorageBillPrint> storageBillPrintList = storageBillPrintService.list(queryWrapper1);
+		 if (oConvertUtils.listIsEmpty(storageBillPrintList)) {
+			 log.info("{}{}", "指定班次,上若统计信息查询,装运单打印表为空!", changeShiftId);
+			 return billetDetailsInfoList;
+		 }
+		 // 创建并初始化BilletDetailsInfo对象
+		 BilletDetailsInfo billetDetailsInfo = new BilletDetailsInfo();
+		 billetDetailsInfo.setCcmNo(ccmNo); // 设置铸机号
+
+		 // 按定尺(size)分组统计
+		 Map<String, List<StorageBillPrint>> sizeGroupMap = storageBillPrintList.stream()
+				 .filter(item -> item.getSize() != null && item.getAmountTotal() != null)
+				 .collect(Collectors.groupingBy(StorageBillPrint::getSize));
+
+		 // 计算每个分组的统计结果
+		 List<BilletStatisticsDetail> statisticsDetails = new ArrayList<>();
+		 for (Map.Entry<String, List<StorageBillPrint>> entry : sizeGroupMap.entrySet()) {
+			 String size = entry.getKey();
+			 List<StorageBillPrint> groupItems = entry.getValue();
+
+			 // 计算总支数
+			 Integer totalAmount = groupItems.stream()
+					 .mapToInt(StorageBillPrint::getAmountTotal)
+					 .sum();
+
+			 // 计算总重量: (size/1000) * amountTotal * 0.2265,保留4位小数
+			 double totalWeight = groupItems.stream()
+					 .filter(item -> item.getAmountTotal() != null)
+					 .mapToDouble(item -> {
+						 try {
+							 double sizeValue = Double.parseDouble(size);
+							 return (sizeValue / 1000) * item.getAmountTotal() * 0.2265;
+						 } catch (NumberFormatException e) {
+							 return 0.0;
+						 }
+					 }).sum();
+
+			 // 保留4位小数
+			 totalWeight = Math.round(totalWeight * 10000.0) / 10000.0;
+
+			 // 创建统计明细对象并添加到结果列表
+			 BilletStatisticsDetail detail = new BilletStatisticsDetail(totalAmount, totalWeight, size);
+			 statisticsDetails.add(detail);
+		 }
+
+		 // 设置统计结果到BilletDetailsInfo对象
+		 billetDetailsInfo.setRollOutShippStatisticsList(statisticsDetails);
+
+		 // 计算并设置总车次、总支数和总重量
+		 billetDetailsInfo.setAllCarNum(storageBillPrintList.size()); // 总车次为记录数
+		 billetDetailsInfo.setCounts(statisticsDetails.stream().mapToInt(BilletStatisticsDetail::getAmountTotal).sum());
+		 billetDetailsInfo.setTotalWeight(statisticsDetails.stream().mapToDouble(BilletStatisticsDetail::getBlankOutput).sum());
+
+		 // 添加到结果列表
+		 billetDetailsInfoList.add(billetDetailsInfo);
+
+		 return billetDetailsInfoList;
+	 }
+
 	 /**
 	  * 筛选指定流号的数据
 	  * @param billetList 钢坯信息列表
@@ -921,4 +1616,22 @@ public class BilletOriginalProductRecordController extends JeecgController<Bille
 		 }
 	 }
 
+	 // 提取的计算方法
+	 private void updateStatistics(Map<String, BilletStatisticsDetail> statisticsMap,
+								   String size, int count, double sizeValue) {
+		 statisticsMap.compute(size, (k, v) -> {
+			 // 计算weight
+			 double localWeight = (sizeValue / 1000) * count * 0.2265;
+			 localWeight = BigDecimal.valueOf(localWeight)
+					 .setScale(4, RoundingMode.HALF_UP)
+					 .doubleValue();
+
+			 BilletStatisticsDetail detail = v != null ? v :
+					 new BilletStatisticsDetail(0, 0.0, size);
+			 detail.setAmountTotal(detail.getAmountTotal() + count);
+			 detail.setBlankOutput(detail.getBlankOutput() + localWeight);
+			 return detail;
+		 });
+	 }
+
  }

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

@@ -0,0 +1,37 @@
+package org.jeecg.modules.billet.billetOriginalProductRecord.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.List;
+
+@Data
+public class BilletDetailsInfo {
+
+    @ApiModelProperty(value = "铸机号")
+    private String ccmNo;
+    /**总车次*/
+    @ApiModelProperty(value = "总车次")
+    private Integer allCarNum;
+    /**总支数*/
+    @ApiModelProperty(value = "总支数")
+    private Integer counts;
+    /**总重量*/
+    @ApiModelProperty(value = "总重量")
+    private Double totalWeight;
+
+    @ApiModelProperty(value = "班组")
+    private String shiftGroup;
+
+    @ApiModelProperty(value = "班别")
+    private String shift;
+
+    @ApiModelProperty(value = "棒一统计明细")
+    private List<BilletStatisticsDetail> rollClubOneStatisticsList;
+    @ApiModelProperty(value = "棒二统计明细")
+    private List<BilletStatisticsDetail> rollClubTwoStatisticsList;
+    @ApiModelProperty(value = "棒三统计明细")
+    private List<BilletStatisticsDetail> rollClubThreeStatisticsList;
+    @ApiModelProperty(value = "上若统计明细")
+    private List<BilletStatisticsDetail> rollOutShippStatisticsList;
+
+}

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

@@ -0,0 +1,29 @@
+package org.jeecg.modules.billet.billetOriginalProductRecord.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class BilletStatisticsDetail {
+
+    @ApiModelProperty(value = "总支数")
+    private Integer amountTotal;
+
+    /**出坯量*/
+    @ApiModelProperty(value = "总重量")
+    private Double blankOutput;
+
+    /**定尺*/
+    @ApiModelProperty(value = "定尺")
+    private String size;
+
+    public BilletStatisticsDetail(Integer amountTotal, Double blankOutput, String size) {
+        this.amountTotal = amountTotal;
+        this.blankOutput = blankOutput;
+        this.size = size;
+    }
+
+    public BilletStatisticsDetail() {
+
+    }
+}