|
@@ -4,9 +4,24 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
+import org.jeecg.common.util.DateUtils;
|
|
|
import org.jeecg.common.util.SpringContextUtils;
|
|
|
+import org.jeecg.common.util.oConvertUtils;
|
|
|
+import org.jeecg.modules.actualControl.billetActual.billetActual.entity.BilletBasicInfo;
|
|
|
+import org.jeecg.modules.actualControl.billetActual.billetActual.service.IBilletBasicInfoService;
|
|
|
+import org.jeecg.modules.billet.rollClubOne.service.IRollClubOneDetailsService;
|
|
|
+import org.jeecg.modules.billet.rollClubThree.entity.RollClubThreeDetails;
|
|
|
+import org.jeecg.modules.billet.rollClubThree.service.IRollClubThreeDetailsService;
|
|
|
+import org.jeecg.modules.billet.rollClubTwo.entity.RollClubTwoDetails;
|
|
|
+import org.jeecg.modules.billet.rollClubTwo.service.IRollClubTwoDetailsService;
|
|
|
+import org.jeecg.modules.billet.rollHeight.service.IRollHeightDetailsService;
|
|
|
+import org.jeecg.modules.billet.rollOutShipp.entity.RollOutShippDetails;
|
|
|
+import org.jeecg.modules.billet.rollOutShipp.service.IRollOutShippDetailsService;
|
|
|
import org.jeecg.modules.billet.shiftConfiguration.entity.ShiftConfiguration;
|
|
|
import org.jeecg.modules.billet.shiftConfiguration.mapper.ShiftConfigurationMapper;
|
|
|
+import org.jeecg.modules.billet.storageBill.dto.StorageCenterQueryDTO;
|
|
|
+import org.jeecg.modules.billet.storageBill.entity.StorageBill;
|
|
|
+import org.jeecg.modules.billet.storageBill.mapper.StorageBillMapper;
|
|
|
import org.jeecg.modules.billet.storageBill.vo.StorageCenterExportRow;
|
|
|
import org.jeecg.modules.billet.storageBill.vo.StorageCenterHeatNoInvoicingVO;
|
|
|
import org.jeecg.modules.billet.storageBill.vo.StorageCenterInvoicingVO;
|
|
@@ -18,14 +33,16 @@ import org.jeecg.modules.carUnit.service.ICarUnitService;
|
|
|
import org.jeecg.modules.carUnit.service.ISysDictItemService;
|
|
|
import org.jeecg.modules.carUnit.service.ISysDictService;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import javax.annotation.Resource;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Optional;
|
|
|
+import java.util.*;
|
|
|
+import java.util.function.Function;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* @Description: 车辆单位管理
|
|
@@ -46,11 +63,35 @@ public class CarUnitServiceImpl extends ServiceImpl<CarUnitMapper, CarUnit> impl
|
|
|
@Autowired
|
|
|
private ISysDictService sysDictService;
|
|
|
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private StorageBillMapper storageBillMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IRollClubOneDetailsService rollClubOneDetailsService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IRollClubTwoDetailsService rollClubTwoDetailsService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IRollClubThreeDetailsService rollClubThreeDetailsService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IRollOutShippDetailsService rollOutShippDetailsService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IRollHeightDetailsService rollHeightDetailsService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IBilletBasicInfoService billetBasicInfoService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ public RedisTemplate redisTemplate;
|
|
|
+
|
|
|
+
|
|
|
@Override
|
|
|
public List<StorageCenterExportRow> buildExportData(List<StorageCenterInvoicingVO> records) {
|
|
|
List<StorageCenterExportRow> rows = new ArrayList<>();
|
|
|
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
-
|
|
|
|
|
|
for (StorageCenterInvoicingVO vo : records) {
|
|
|
Integer ccmNo = Optional.ofNullable(vo.getHeatNoDetails())
|
|
@@ -176,6 +217,564 @@ public class CarUnitServiceImpl extends ServiceImpl<CarUnitMapper, CarUnit> impl
|
|
|
return rows;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public StorageCenterHeatNoInvoicingVO storageCenterInvoicingByQueryDTO(StorageCenterQueryDTO queryDTO) {
|
|
|
+
|
|
|
+ String heatNo = queryDTO.getHeatsCode();
|
|
|
+ Date storageTimeBegin = queryDTO.getStorageTimeBegin();
|
|
|
+ Date storageTimeEnd = queryDTO.getStorageTimeEnd();
|
|
|
+ StorageCenterHeatNoInvoicingVO storageCenterHeatNoInvoicingVO = new StorageCenterHeatNoInvoicingVO();
|
|
|
+
|
|
|
+ StorageCenterHeatNoInvoicingVO.RollOneHeatNo rollOneHeatNo = new StorageCenterHeatNoInvoicingVO.RollOneHeatNo();
|
|
|
+ StorageCenterHeatNoInvoicingVO.RollTwoHeatNo rollTwoHeatNo = new StorageCenterHeatNoInvoicingVO.RollTwoHeatNo();
|
|
|
+ StorageCenterHeatNoInvoicingVO.RollThreeHeatNo rollThreeHeatNo = new StorageCenterHeatNoInvoicingVO.RollThreeHeatNo();
|
|
|
+ StorageCenterHeatNoInvoicingVO.RollHeightHeatNo rollHeightHeatNo = new StorageCenterHeatNoInvoicingVO.RollHeightHeatNo();
|
|
|
+ StorageCenterHeatNoInvoicingVO.RollOutHeatNo rollOutHeatNo = new StorageCenterHeatNoInvoicingVO.RollOutHeatNo();
|
|
|
+
|
|
|
+ // 查询 BilletBasicInfo 数据
|
|
|
+ LambdaQueryWrapper<BilletBasicInfo> basicInfoQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ basicInfoQueryWrapper.eq(BilletBasicInfo::getHeatNo, heatNo);
|
|
|
+
|
|
|
+ List<BilletBasicInfo> list = billetBasicInfoService.list(basicInfoQueryWrapper);
|
|
|
+ if (oConvertUtils.listIsEmpty(list)) {
|
|
|
+ return storageCenterHeatNoInvoicingVO;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ Map<String, Map<Integer, List<BilletBasicInfo>>> groupedByBelongTableAndLength = list.stream()
|
|
|
+ .collect(Collectors.groupingBy(
|
|
|
+ b -> Optional.ofNullable(b.getBelongTable()).orElse("unknown"), // 外层:按 belongTable 分组
|
|
|
+ Collectors.groupingBy(
|
|
|
+ BilletBasicInfo::getLength // 内层:按 length 分组
|
|
|
+ )
|
|
|
+ ));
|
|
|
+
|
|
|
+
|
|
|
+ if (groupedByBelongTableAndLength.containsKey("roll_club_one")) {
|
|
|
+ Map<Integer, List<BilletBasicInfo>> lengthGrouped = groupedByBelongTableAndLength.get("roll_club_one");
|
|
|
+
|
|
|
+ List<StorageCenterHeatNoInvoicingVO.SizeDetail> sizeDetailsList = new ArrayList<>();
|
|
|
+ List<StorageCenterHeatNoInvoicingVO.RollSendDetail> rollSendDetailList = new ArrayList<>();
|
|
|
+
|
|
|
+ int totalAmount = 0;
|
|
|
+ BigDecimal totalWeight = BigDecimal.ZERO;
|
|
|
+
|
|
|
+ for (Map.Entry<Integer, List<BilletBasicInfo>> entry : lengthGrouped.entrySet()) {
|
|
|
+ Integer length = entry.getKey();
|
|
|
+ List<BilletBasicInfo> billets = entry.getValue();
|
|
|
+
|
|
|
+ int amount = billets.size();
|
|
|
+ BigDecimal weight = billets.stream()
|
|
|
+ .map(BilletBasicInfo::getBilletWeight)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .map(BigDecimal::valueOf)
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+
|
|
|
+ totalAmount += amount;
|
|
|
+ totalWeight = totalWeight.add(weight);
|
|
|
+
|
|
|
+ String spec = Optional.ofNullable(billets.get(0).getSpec()).orElse("Unknown");
|
|
|
+ Date latestUpdateTime = billets.stream()
|
|
|
+ .map(BilletBasicInfo::getUpdateTime)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .max(Date::compareTo)
|
|
|
+ .orElse(null);
|
|
|
+
|
|
|
+ // 构造 SizeDetail
|
|
|
+ StorageCenterHeatNoInvoicingVO.SizeDetail sizeDetail = new StorageCenterHeatNoInvoicingVO.SizeDetail();
|
|
|
+ sizeDetail.setSize(length);
|
|
|
+ sizeDetail.setSizeAmount(amount);
|
|
|
+ sizeDetail.setSizeWeight(weight);
|
|
|
+ sizeDetailsList.add(sizeDetail);
|
|
|
+
|
|
|
+ // 构造 RollSendDetail
|
|
|
+ StorageCenterHeatNoInvoicingVO.RollSendDetail rollSendDetail = new StorageCenterHeatNoInvoicingVO.RollSendDetail();
|
|
|
+ rollSendDetail.setSize(length);
|
|
|
+ rollSendDetail.setWeight(weight);
|
|
|
+ rollSendDetail.setAmount(amount);
|
|
|
+ rollSendDetail.setSpec(spec);
|
|
|
+ rollSendDetail.setUpdateTime(latestUpdateTime);
|
|
|
+
|
|
|
+ rollSendDetailList.add(rollSendDetail);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 按照时间过滤
|
|
|
+ if (storageTimeBegin != null && storageTimeEnd != null) {
|
|
|
+ Date beginOfDay = DateUtils.getStartOfDayByDate(storageTimeBegin);
|
|
|
+ Date endOfDay = DateUtils.getEndOfDayByDate(storageTimeEnd);
|
|
|
+
|
|
|
+ rollSendDetailList = rollSendDetailList.stream()
|
|
|
+ .filter(detail -> {
|
|
|
+ Date updateTimeFilter = detail.getUpdateTime();
|
|
|
+ return updateTimeFilter != null &&
|
|
|
+ !updateTimeFilter.before(beginOfDay) &&
|
|
|
+ !updateTimeFilter.after(endOfDay);
|
|
|
+ })
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 排序
|
|
|
+ rollSendDetailList.sort(Comparator.comparing(StorageCenterHeatNoInvoicingVO.RollSendDetail::getSize));
|
|
|
+
|
|
|
+ // 最终赋值
|
|
|
+ rollOneHeatNo.setTotalAmount(totalAmount);
|
|
|
+ rollOneHeatNo.setTotalWeight(totalWeight);
|
|
|
+ rollOneHeatNo.setSizeDetails(sizeDetailsList);
|
|
|
+ rollOneHeatNo.setRollSendDetails(rollSendDetailList);
|
|
|
+
|
|
|
+ storageCenterHeatNoInvoicingVO.setRollClubOneDetails(rollOneHeatNo);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (groupedByBelongTableAndLength.containsKey("roll_height")) {
|
|
|
+ Map<Integer, List<BilletBasicInfo>> lengthGrouped = groupedByBelongTableAndLength.get("roll_height");
|
|
|
+
|
|
|
+ List<StorageCenterHeatNoInvoicingVO.SizeDetail> sizeDetailsList = new ArrayList<>();
|
|
|
+ List<StorageCenterHeatNoInvoicingVO.RollSendDetail> rollSendDetailList = new ArrayList<>();
|
|
|
+
|
|
|
+ int totalAmount = 0;
|
|
|
+ BigDecimal totalWeight = BigDecimal.ZERO;
|
|
|
+
|
|
|
+ for (Map.Entry<Integer, List<BilletBasicInfo>> entry : lengthGrouped.entrySet()) {
|
|
|
+ Integer length = entry.getKey();
|
|
|
+ List<BilletBasicInfo> billets = entry.getValue();
|
|
|
+
|
|
|
+ int amount = billets.size();
|
|
|
+ BigDecimal weight = billets.stream()
|
|
|
+ .map(BilletBasicInfo::getBilletWeight)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .map(BigDecimal::valueOf)
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+
|
|
|
+ totalAmount += amount;
|
|
|
+ totalWeight = totalWeight.add(weight);
|
|
|
+
|
|
|
+ String spec = Optional.ofNullable(billets.get(0).getSpec()).orElse("Unknown");
|
|
|
+ Date latestUpdateTime = billets.stream()
|
|
|
+ .map(BilletBasicInfo::getUpdateTime)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .max(Date::compareTo)
|
|
|
+ .orElse(null);
|
|
|
+
|
|
|
+ // 构造 SizeDetail
|
|
|
+ StorageCenterHeatNoInvoicingVO.SizeDetail sizeDetail = new StorageCenterHeatNoInvoicingVO.SizeDetail();
|
|
|
+ sizeDetail.setSize(length);
|
|
|
+ sizeDetail.setSizeAmount(amount);
|
|
|
+ sizeDetail.setSizeWeight(weight);
|
|
|
+ sizeDetailsList.add(sizeDetail);
|
|
|
+
|
|
|
+ // 构造 RollSendDetail
|
|
|
+ StorageCenterHeatNoInvoicingVO.RollSendDetail rollSendDetail = new StorageCenterHeatNoInvoicingVO.RollSendDetail();
|
|
|
+ rollSendDetail.setSize(length);
|
|
|
+ rollSendDetail.setWeight(weight);
|
|
|
+ rollSendDetail.setAmount(amount);
|
|
|
+ rollSendDetail.setSpec(spec);
|
|
|
+ rollSendDetail.setUpdateTime(latestUpdateTime);
|
|
|
+
|
|
|
+ rollSendDetailList.add(rollSendDetail);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 按照时间过滤
|
|
|
+ if (storageTimeBegin != null && storageTimeEnd != null) {
|
|
|
+ Date beginOfDay = DateUtils.getStartOfDayByDate(storageTimeBegin);
|
|
|
+ Date endOfDay = DateUtils.getEndOfDayByDate(storageTimeEnd);
|
|
|
+
|
|
|
+ rollSendDetailList = rollSendDetailList.stream()
|
|
|
+ .filter(detail -> {
|
|
|
+ Date updateTimeFilter = detail.getUpdateTime();
|
|
|
+ return updateTimeFilter != null &&
|
|
|
+ !updateTimeFilter.before(beginOfDay) &&
|
|
|
+ !updateTimeFilter.after(endOfDay);
|
|
|
+ })
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 排序
|
|
|
+ rollSendDetailList.sort(Comparator.comparing(StorageCenterHeatNoInvoicingVO.RollSendDetail::getSize));
|
|
|
+
|
|
|
+ // 最终赋值
|
|
|
+ rollHeightHeatNo.setTotalAmount(totalAmount);
|
|
|
+ rollHeightHeatNo.setTotalWeight(totalWeight);
|
|
|
+ rollHeightHeatNo.setSizeDetails(sizeDetailsList);
|
|
|
+ rollHeightHeatNo.setRollSendDetails(rollSendDetailList);
|
|
|
+
|
|
|
+ storageCenterHeatNoInvoicingVO.setRollHeightDetails(rollHeightHeatNo);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (groupedByBelongTableAndLength.containsKey("roll_club_two")) {
|
|
|
+ Map<Integer, List<BilletBasicInfo>> lengthMap = groupedByBelongTableAndLength.get("roll_club_two");
|
|
|
+
|
|
|
+ List<StorageCenterHeatNoInvoicingVO.SizeDetail> sizeDetails = new ArrayList<>();
|
|
|
+ List<StorageCenterHeatNoInvoicingVO.RollChargeDetail> rollChargeDetails = new ArrayList<>();
|
|
|
+
|
|
|
+ int totalAmount = 0;
|
|
|
+ BigDecimal totalWeight = BigDecimal.ZERO;
|
|
|
+
|
|
|
+ for (Map.Entry<Integer, List<BilletBasicInfo>> entry : lengthMap.entrySet()) {
|
|
|
+ Integer length = entry.getKey();
|
|
|
+ List<BilletBasicInfo> billets = entry.getValue();
|
|
|
+
|
|
|
+ int amount = billets.size();
|
|
|
+ BigDecimal weight = billets.stream()
|
|
|
+ .map(BilletBasicInfo::getBilletWeight)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .map(BigDecimal::valueOf)
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+
|
|
|
+ totalAmount += amount;
|
|
|
+ totalWeight = totalWeight.add(weight);
|
|
|
+
|
|
|
+ // SizeDetail 构造
|
|
|
+ StorageCenterHeatNoInvoicingVO.SizeDetail sizeDetail = new StorageCenterHeatNoInvoicingVO.SizeDetail();
|
|
|
+ sizeDetail.setSize(length);
|
|
|
+ sizeDetail.setSizeAmount(amount);
|
|
|
+ sizeDetail.setSizeWeight(weight);
|
|
|
+ sizeDetails.add(sizeDetail);
|
|
|
+
|
|
|
+ // 查询 RollClubThreeDetails
|
|
|
+ LambdaQueryWrapper<RollClubTwoDetails> twoDetailsLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ twoDetailsLambdaQueryWrapper.eq(RollClubTwoDetails::getHeatNo, heatNo)
|
|
|
+ .eq(RollClubTwoDetails::getSize, length);
|
|
|
+
|
|
|
+ List<RollClubTwoDetails> twoDetailsList = rollClubTwoDetailsService.list(twoDetailsLambdaQueryWrapper);
|
|
|
+
|
|
|
+ if (oConvertUtils.isNotEmpty(twoDetailsList)) {
|
|
|
+ // 按 storageBillId 分组
|
|
|
+ Map<String, List<RollClubTwoDetails>> groupedByStorageBillId = twoDetailsList.stream()
|
|
|
+ .filter(e -> oConvertUtils.isNotEmpty(e.getStorageBillId()))
|
|
|
+ .collect(Collectors.groupingBy(RollClubTwoDetails::getStorageBillId));
|
|
|
+
|
|
|
+ // 查询所有 StorageBill
|
|
|
+ Set<String> storageBillIds = groupedByStorageBillId.keySet();
|
|
|
+ Map<String, StorageBill> storageBillMap = new HashMap<>();
|
|
|
+ if (!storageBillIds.isEmpty()) {
|
|
|
+ LambdaQueryWrapper<StorageBill> storageBillLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ storageBillLambdaQueryWrapper.in(StorageBill::getId, storageBillIds);
|
|
|
+ List<StorageBill> matchedStorageBills = storageBillMapper.selectList(storageBillLambdaQueryWrapper);
|
|
|
+ storageBillMap = matchedStorageBills.stream()
|
|
|
+ .collect(Collectors.toMap(StorageBill::getId, Function.identity()));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 遍历每个分组
|
|
|
+ for (Map.Entry<String, List<RollClubTwoDetails>> groupEntry : groupedByStorageBillId.entrySet()) {
|
|
|
+ String storageBillId = groupEntry.getKey();
|
|
|
+ List<RollClubTwoDetails> detailList = groupEntry.getValue();
|
|
|
+
|
|
|
+ int groupAmount = detailList.stream()
|
|
|
+ .mapToInt(d -> StringUtils.isNotBlank(d.getStackAddr()) ? 4 : 1)
|
|
|
+ .sum();
|
|
|
+
|
|
|
+ BigDecimal groupWeight = detailList.stream()
|
|
|
+ .map(RollClubTwoDetails::getBlankOutput)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .map(BigDecimal::valueOf) // 关键转换
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+
|
|
|
+ StorageBill storageBill = storageBillMap.get(storageBillId);
|
|
|
+ String spec = billets.stream().map(BilletBasicInfo::getSpec).filter(Objects::nonNull).findFirst().orElse("");
|
|
|
+ String licensePlate = storageBill != null ? Optional.ofNullable(storageBill.getLicensePlate()).orElse("未知车牌") : "未知车牌";
|
|
|
+ String btype = storageBill != null ? Optional.ofNullable(storageBill.getBtype()).orElse("未知类型") : "未知类型";
|
|
|
+ String brandNum = storageBill != null ? Optional.ofNullable(storageBill.getBrandNum()).orElse("") : "";
|
|
|
+ Integer carNum = storageBill != null ? Optional.ofNullable(storageBill.getCarNum()).orElse(1) : 1;
|
|
|
+ Date createTime = storageBill != null ? Optional.ofNullable(storageBill.getCreateTime()).orElse(new Date()) : new Date();
|
|
|
+ Date updateTime = storageBill != null ? Optional.ofNullable(storageBill.getUpdateTime()).orElse(new Date()) : new Date();
|
|
|
+
|
|
|
+ StorageCenterHeatNoInvoicingVO.RollChargeDetail rollChargeDetail = new StorageCenterHeatNoInvoicingVO.RollChargeDetail();
|
|
|
+ rollChargeDetail.setSize(length);
|
|
|
+ rollChargeDetail.setSpec(spec);
|
|
|
+ rollChargeDetail.setAmount(groupAmount);
|
|
|
+ rollChargeDetail.setWeight(groupWeight);
|
|
|
+ rollChargeDetail.setHeatNo(heatNo);
|
|
|
+ rollChargeDetail.setLicensePlate(licensePlate);
|
|
|
+ rollChargeDetail.setBtype(btype);
|
|
|
+ rollChargeDetail.setBrandNum(brandNum);
|
|
|
+ rollChargeDetail.setCarNum(carNum);
|
|
|
+ rollChargeDetail.setCreateTime(createTime);
|
|
|
+ rollChargeDetail.setUpdateTime(updateTime);
|
|
|
+
|
|
|
+ rollChargeDetails.add(rollChargeDetail);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 时间过滤逻辑
|
|
|
+ if (storageTimeBegin != null && storageTimeEnd != null) {
|
|
|
+ Date beginOfDay = DateUtils.getStartOfDayByDate(storageTimeBegin);
|
|
|
+ Date endOfDay = DateUtils.getEndOfDayByDate(storageTimeEnd);
|
|
|
+
|
|
|
+ rollChargeDetails = rollChargeDetails.stream()
|
|
|
+ .filter(detail -> {
|
|
|
+ Date createTimeFilter = detail.getCreateTime();
|
|
|
+ return createTimeFilter != null &&
|
|
|
+ !createTimeFilter.before(beginOfDay) &&
|
|
|
+ !createTimeFilter.after(endOfDay);
|
|
|
+ })
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 排序(按车号)
|
|
|
+ rollChargeDetails.sort(Comparator.comparing(StorageCenterHeatNoInvoicingVO.RollChargeDetail::getCarNum));
|
|
|
+
|
|
|
+ // 赋值到 VO
|
|
|
+ rollTwoHeatNo.setTotalAmount(totalAmount);
|
|
|
+ rollTwoHeatNo.setTotalWeight(totalWeight);
|
|
|
+ rollTwoHeatNo.setSizeDetails(sizeDetails);
|
|
|
+ rollTwoHeatNo.setRollChargeDetails(rollChargeDetails);
|
|
|
+ storageCenterHeatNoInvoicingVO.setRollClubTwoDetails(rollTwoHeatNo);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if (groupedByBelongTableAndLength.containsKey("roll_club_three")) {
|
|
|
+ Map<Integer, List<BilletBasicInfo>> lengthMap = groupedByBelongTableAndLength.get("roll_club_three");
|
|
|
+
|
|
|
+ List<StorageCenterHeatNoInvoicingVO.SizeDetail> sizeDetails = new ArrayList<>();
|
|
|
+ List<StorageCenterHeatNoInvoicingVO.RollChargeDetail> rollChargeDetails = new ArrayList<>();
|
|
|
+
|
|
|
+ int totalAmount = 0;
|
|
|
+ BigDecimal totalWeight = BigDecimal.ZERO;
|
|
|
+
|
|
|
+ for (Map.Entry<Integer, List<BilletBasicInfo>> entry : lengthMap.entrySet()) {
|
|
|
+ Integer length = entry.getKey();
|
|
|
+ List<BilletBasicInfo> billets = entry.getValue();
|
|
|
+
|
|
|
+ int amount = billets.size();
|
|
|
+ BigDecimal weight = billets.stream()
|
|
|
+ .map(BilletBasicInfo::getBilletWeight)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .map(BigDecimal::valueOf)
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+
|
|
|
+ totalAmount += amount;
|
|
|
+ totalWeight = totalWeight.add(weight);
|
|
|
+
|
|
|
+ // SizeDetail 构造
|
|
|
+ StorageCenterHeatNoInvoicingVO.SizeDetail sizeDetail = new StorageCenterHeatNoInvoicingVO.SizeDetail();
|
|
|
+ sizeDetail.setSize(length);
|
|
|
+ sizeDetail.setSizeAmount(amount);
|
|
|
+ sizeDetail.setSizeWeight(weight);
|
|
|
+ sizeDetails.add(sizeDetail);
|
|
|
+
|
|
|
+ // 查询 RollClubThreeDetails
|
|
|
+ LambdaQueryWrapper<RollClubThreeDetails> threeDetailsLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ threeDetailsLambdaQueryWrapper.eq(RollClubThreeDetails::getHeatNo, heatNo)
|
|
|
+ .eq(RollClubThreeDetails::getSize, length);
|
|
|
+
|
|
|
+ List<RollClubThreeDetails> threeDetailsList = rollClubThreeDetailsService.list(threeDetailsLambdaQueryWrapper);
|
|
|
+
|
|
|
+ if (oConvertUtils.isNotEmpty(threeDetailsList)) {
|
|
|
+ // 按 storageBillId 分组
|
|
|
+ Map<String, List<RollClubThreeDetails>> groupedByStorageBillId = threeDetailsList.stream()
|
|
|
+ .filter(e -> oConvertUtils.isNotEmpty(e.getStorageBillId()))
|
|
|
+ .collect(Collectors.groupingBy(RollClubThreeDetails::getStorageBillId));
|
|
|
+
|
|
|
+ // 查询所有 StorageBill
|
|
|
+ Set<String> storageBillIds = groupedByStorageBillId.keySet();
|
|
|
+ Map<String, StorageBill> storageBillMap = new HashMap<>();
|
|
|
+ if (!storageBillIds.isEmpty()) {
|
|
|
+ LambdaQueryWrapper<StorageBill> storageBillLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ storageBillLambdaQueryWrapper.in(StorageBill::getId, storageBillIds);
|
|
|
+ List<StorageBill> matchedStorageBills = storageBillMapper.selectList(storageBillLambdaQueryWrapper);
|
|
|
+ storageBillMap = matchedStorageBills.stream()
|
|
|
+ .collect(Collectors.toMap(StorageBill::getId, Function.identity()));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 遍历每个分组
|
|
|
+ for (Map.Entry<String, List<RollClubThreeDetails>> groupEntry : groupedByStorageBillId.entrySet()) {
|
|
|
+ String storageBillId = groupEntry.getKey();
|
|
|
+ List<RollClubThreeDetails> detailList = groupEntry.getValue();
|
|
|
+
|
|
|
+ int groupAmount = detailList.stream()
|
|
|
+ .mapToInt(d -> StringUtils.isNotBlank(d.getStackAddr()) ? 4 : 1)
|
|
|
+ .sum();
|
|
|
+
|
|
|
+ BigDecimal groupWeight = detailList.stream()
|
|
|
+ .map(RollClubThreeDetails::getBlankOutput)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .map(BigDecimal::valueOf) // 关键转换
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+
|
|
|
+ StorageBill storageBill = storageBillMap.get(storageBillId);
|
|
|
+ String spec = billets.stream().map(BilletBasicInfo::getSpec).filter(Objects::nonNull).findFirst().orElse("");
|
|
|
+ String licensePlate = storageBill != null ? Optional.ofNullable(storageBill.getLicensePlate()).orElse("未知车牌") : "未知车牌";
|
|
|
+ String btype = storageBill != null ? Optional.ofNullable(storageBill.getBtype()).orElse("未知类型") : "未知类型";
|
|
|
+ String brandNum = storageBill != null ? Optional.ofNullable(storageBill.getBrandNum()).orElse("") : "";
|
|
|
+ Integer carNum = storageBill != null ? Optional.ofNullable(storageBill.getCarNum()).orElse(1) : 1;
|
|
|
+ Date createTime = storageBill != null ? Optional.ofNullable(storageBill.getCreateTime()).orElse(new Date()) : new Date();
|
|
|
+ Date updateTime = storageBill != null ? Optional.ofNullable(storageBill.getUpdateTime()).orElse(new Date()) : new Date();
|
|
|
+
|
|
|
+ StorageCenterHeatNoInvoicingVO.RollChargeDetail rollChargeDetail = new StorageCenterHeatNoInvoicingVO.RollChargeDetail();
|
|
|
+ rollChargeDetail.setSize(length);
|
|
|
+ rollChargeDetail.setSpec(spec);
|
|
|
+ rollChargeDetail.setAmount(groupAmount);
|
|
|
+ rollChargeDetail.setWeight(groupWeight);
|
|
|
+ rollChargeDetail.setHeatNo(heatNo);
|
|
|
+ rollChargeDetail.setLicensePlate(licensePlate);
|
|
|
+ rollChargeDetail.setBtype(btype);
|
|
|
+ rollChargeDetail.setBrandNum(brandNum);
|
|
|
+ rollChargeDetail.setCarNum(carNum);
|
|
|
+ rollChargeDetail.setCreateTime(createTime);
|
|
|
+ rollChargeDetail.setUpdateTime(updateTime);
|
|
|
+
|
|
|
+ rollChargeDetails.add(rollChargeDetail);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 时间过滤逻辑
|
|
|
+ if (storageTimeBegin != null && storageTimeEnd != null) {
|
|
|
+ Date beginOfDay = DateUtils.getStartOfDayByDate(storageTimeBegin);
|
|
|
+ Date endOfDay = DateUtils.getEndOfDayByDate(storageTimeEnd);
|
|
|
+
|
|
|
+ rollChargeDetails = rollChargeDetails.stream()
|
|
|
+ .filter(detail -> {
|
|
|
+ Date createTimeFilter = detail.getCreateTime();
|
|
|
+ return createTimeFilter != null &&
|
|
|
+ !createTimeFilter.before(beginOfDay) &&
|
|
|
+ !createTimeFilter.after(endOfDay);
|
|
|
+ })
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 排序(按车号)
|
|
|
+ rollChargeDetails.sort(Comparator.comparing(StorageCenterHeatNoInvoicingVO.RollChargeDetail::getCarNum));
|
|
|
+
|
|
|
+ // 赋值到 VO
|
|
|
+ rollThreeHeatNo.setTotalAmount(totalAmount);
|
|
|
+ rollThreeHeatNo.setTotalWeight(totalWeight);
|
|
|
+ rollThreeHeatNo.setSizeDetails(sizeDetails);
|
|
|
+ rollThreeHeatNo.setRollChargeDetails(rollChargeDetails);
|
|
|
+ storageCenterHeatNoInvoicingVO.setRollClubThreeDetails(rollThreeHeatNo);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (groupedByBelongTableAndLength.containsKey("roll_out_shipp")) {
|
|
|
+ Map<Integer, List<BilletBasicInfo>> lengthMap = groupedByBelongTableAndLength.get("roll_out_shipp");
|
|
|
+
|
|
|
+ List<StorageCenterHeatNoInvoicingVO.SizeDetail> sizeDetails = new ArrayList<>();
|
|
|
+ List<StorageCenterHeatNoInvoicingVO.RollChargeDetail> rollChargeDetails = new ArrayList<>();
|
|
|
+
|
|
|
+ int totalAmount = 0;
|
|
|
+ BigDecimal totalWeight = BigDecimal.ZERO;
|
|
|
+
|
|
|
+ for (Map.Entry<Integer, List<BilletBasicInfo>> entry : lengthMap.entrySet()) {
|
|
|
+ Integer length = entry.getKey();
|
|
|
+ List<BilletBasicInfo> billets = entry.getValue();
|
|
|
+
|
|
|
+ int amount = billets.size();
|
|
|
+ BigDecimal weight = billets.stream()
|
|
|
+ .map(BilletBasicInfo::getBilletWeight)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .map(BigDecimal::valueOf)
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+
|
|
|
+ totalAmount += amount;
|
|
|
+ totalWeight = totalWeight.add(weight);
|
|
|
+
|
|
|
+ // SizeDetail 构造
|
|
|
+ StorageCenterHeatNoInvoicingVO.SizeDetail sizeDetail = new StorageCenterHeatNoInvoicingVO.SizeDetail();
|
|
|
+ sizeDetail.setSize(length);
|
|
|
+ sizeDetail.setSizeAmount(amount);
|
|
|
+ sizeDetail.setSizeWeight(weight);
|
|
|
+ sizeDetails.add(sizeDetail);
|
|
|
+
|
|
|
+ // 查询 RollClubThreeDetails
|
|
|
+ LambdaQueryWrapper<RollOutShippDetails> outDetailsLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ outDetailsLambdaQueryWrapper.eq(RollOutShippDetails::getHeatNo, heatNo)
|
|
|
+ .eq(RollOutShippDetails::getSize, length);
|
|
|
+
|
|
|
+ List<RollOutShippDetails> outDetailsList = rollOutShippDetailsService.list(outDetailsLambdaQueryWrapper);
|
|
|
+
|
|
|
+ if (oConvertUtils.isNotEmpty(outDetailsList)) {
|
|
|
+ // 按 storageBillId 分组
|
|
|
+ Map<String, List<RollOutShippDetails>> groupedByStorageBillId = outDetailsList.stream()
|
|
|
+ .filter(e -> oConvertUtils.isNotEmpty(e.getStorageBillId()))
|
|
|
+ .collect(Collectors.groupingBy(RollOutShippDetails::getStorageBillId));
|
|
|
+
|
|
|
+ // 查询所有 StorageBill
|
|
|
+ Set<String> storageBillIds = groupedByStorageBillId.keySet();
|
|
|
+ Map<String, StorageBill> storageBillMap = new HashMap<>();
|
|
|
+ if (!storageBillIds.isEmpty()) {
|
|
|
+ LambdaQueryWrapper<StorageBill> storageBillLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ storageBillLambdaQueryWrapper.in(StorageBill::getId, storageBillIds);
|
|
|
+ List<StorageBill> matchedStorageBills = storageBillMapper.selectList(storageBillLambdaQueryWrapper);
|
|
|
+ storageBillMap = matchedStorageBills.stream()
|
|
|
+ .collect(Collectors.toMap(StorageBill::getId, Function.identity()));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 遍历每个分组
|
|
|
+ for (Map.Entry<String, List<RollOutShippDetails>> groupEntry : groupedByStorageBillId.entrySet()) {
|
|
|
+ String storageBillId = groupEntry.getKey();
|
|
|
+ List<RollOutShippDetails> detailList = groupEntry.getValue();
|
|
|
+
|
|
|
+ int groupAmount = detailList.stream()
|
|
|
+ .mapToInt(d -> StringUtils.isNotBlank(d.getStackAddr()) ? 4 : 1)
|
|
|
+ .sum();
|
|
|
+
|
|
|
+ BigDecimal groupWeight = detailList.stream()
|
|
|
+ .map(RollOutShippDetails::getBlankOutput)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .map(BigDecimal::valueOf) // 关键转换
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+
|
|
|
+ StorageBill storageBill = storageBillMap.get(storageBillId);
|
|
|
+ String spec = billets.stream().map(BilletBasicInfo::getSpec).filter(Objects::nonNull).findFirst().orElse("");
|
|
|
+ String licensePlate = storageBill != null ? Optional.ofNullable(storageBill.getLicensePlate()).orElse("未知车牌") : "未知车牌";
|
|
|
+ String btype = storageBill != null ? Optional.ofNullable(storageBill.getBtype()).orElse("未知类型") : "未知类型";
|
|
|
+ String brandNum = storageBill != null ? Optional.ofNullable(storageBill.getBrandNum()).orElse("") : "";
|
|
|
+ Integer carNum = storageBill != null ? Optional.ofNullable(storageBill.getCarNum()).orElse(1) : 1;
|
|
|
+ Date createTime = storageBill != null ? Optional.ofNullable(storageBill.getCreateTime()).orElse(new Date()) : new Date();
|
|
|
+ Date updateTime = storageBill != null ? Optional.ofNullable(storageBill.getUpdateTime()).orElse(new Date()) : new Date();
|
|
|
+
|
|
|
+ StorageCenterHeatNoInvoicingVO.RollChargeDetail rollChargeDetail = new StorageCenterHeatNoInvoicingVO.RollChargeDetail();
|
|
|
+ rollChargeDetail.setSize(length);
|
|
|
+ rollChargeDetail.setSpec(spec);
|
|
|
+ rollChargeDetail.setAmount(groupAmount);
|
|
|
+ rollChargeDetail.setWeight(groupWeight);
|
|
|
+ rollChargeDetail.setHeatNo(heatNo);
|
|
|
+ rollChargeDetail.setLicensePlate(licensePlate);
|
|
|
+ rollChargeDetail.setBtype(btype);
|
|
|
+ rollChargeDetail.setBrandNum(brandNum);
|
|
|
+ rollChargeDetail.setCarNum(carNum);
|
|
|
+ rollChargeDetail.setCreateTime(createTime);
|
|
|
+ rollChargeDetail.setUpdateTime(updateTime);
|
|
|
+
|
|
|
+ rollChargeDetails.add(rollChargeDetail);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 时间过滤逻辑
|
|
|
+ if (storageTimeBegin != null && storageTimeEnd != null) {
|
|
|
+ Date beginOfDay = DateUtils.getStartOfDayByDate(storageTimeBegin);
|
|
|
+ Date endOfDay = DateUtils.getEndOfDayByDate(storageTimeEnd);
|
|
|
+
|
|
|
+ rollChargeDetails = rollChargeDetails.stream()
|
|
|
+ .filter(detail -> {
|
|
|
+ Date createTimeFilter = detail.getCreateTime();
|
|
|
+ return createTimeFilter != null &&
|
|
|
+ !createTimeFilter.before(beginOfDay) &&
|
|
|
+ !createTimeFilter.after(endOfDay);
|
|
|
+ })
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 排序(按车号)
|
|
|
+ rollChargeDetails.sort(Comparator.comparing(StorageCenterHeatNoInvoicingVO.RollChargeDetail::getCarNum));
|
|
|
+
|
|
|
+ // 赋值到 VO
|
|
|
+ rollOutHeatNo.setTotalAmount(totalAmount);
|
|
|
+ rollOutHeatNo.setTotalWeight(totalWeight);
|
|
|
+ rollOutHeatNo.setSizeDetails(sizeDetails);
|
|
|
+ rollOutHeatNo.setRollChargeDetails(rollChargeDetails);
|
|
|
+ storageCenterHeatNoInvoicingVO.setRollOutShippDetails(rollOutHeatNo);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return storageCenterHeatNoInvoicingVO;
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
public static String getTransportUnitNameByCarNumber(String carNumber) {
|
|
|
if (StringUtils.isBlank(carNumber)) return "";
|
|
@@ -233,7 +832,7 @@ public class CarUnitServiceImpl extends ServiceImpl<CarUnitMapper, CarUnit> impl
|
|
|
private static StorageCenterExportRow convert(StorageCenterHeatNoInvoicingVO.RollChargeDetail detail, Integer ccmNo, String endpoint) {
|
|
|
StorageCenterExportRow row = new StorageCenterExportRow();
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
- String dateString = sdf.format(detail.getCreateTime());
|
|
|
+ String dateString = sdf.format(detail.getUpdateTime());
|
|
|
row.setFactoryDate(dateString);
|
|
|
row.setEndPoint(endpoint);
|
|
|
row.setLicensePlate(detail.getLicensePlate());
|
|
@@ -271,9 +870,9 @@ public class CarUnitServiceImpl extends ServiceImpl<CarUnitMapper, CarUnit> impl
|
|
|
row.setSize("170*170*" + result.toPlainString());
|
|
|
}
|
|
|
row.setSpec(detail.getSpec());
|
|
|
- if (detail != null && detail.getCreateTime() != null) {
|
|
|
+ if (detail != null && detail.getUpdateTime() != null) {
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
- row.setFactoryDate(sdf.format(detail.getCreateTime()));
|
|
|
+ row.setFactoryDate(sdf.format(detail.getUpdateTime()));
|
|
|
} else {
|
|
|
row.setFactoryDate("");
|
|
|
}
|
|
@@ -283,7 +882,7 @@ public class CarUnitServiceImpl extends ServiceImpl<CarUnitMapper, CarUnit> impl
|
|
|
|
|
|
private static BigDecimal calcWeightPerPiece(BigDecimal total, Integer amount) {
|
|
|
if (total == null || amount == null || amount == 0) return BigDecimal.ZERO;
|
|
|
- return total.divide(BigDecimal.valueOf(amount), 3, RoundingMode.HALF_UP);
|
|
|
+ return total.divide(BigDecimal.valueOf(amount), 4, RoundingMode.HALF_UP);
|
|
|
}
|
|
|
|
|
|
private static String getDictId(String dictCode) {
|