|
|
@@ -23,8 +23,10 @@ import com.sckw.core.web.response.result.PageDataResult;
|
|
|
import com.sckw.fleet.api.RemoteFleetService;
|
|
|
import com.sckw.fleet.api.model.vo.RTruckVo;
|
|
|
import com.sckw.order.api.dubbo.TradeOrderInfoService;
|
|
|
+import com.sckw.order.api.model.GoodsVo;
|
|
|
import com.sckw.order.api.model.OrderDetailVo;
|
|
|
import com.sckw.order.api.model.OrderUnitInfoDetailVO;
|
|
|
+import com.sckw.order.api.model.TradeOrderGoodsVo;
|
|
|
import com.sckw.product.api.dubbo.GoodsInfoService;
|
|
|
import com.sckw.product.api.model.KwpGoods;
|
|
|
import com.sckw.system.api.RemoteSystemService;
|
|
|
@@ -41,6 +43,7 @@ import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
+import org.jetbrains.annotations.NotNull;
|
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
|
import org.springframework.data.redis.core.script.DefaultRedisScript;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
@@ -78,6 +81,7 @@ public class WaybillOrderService {
|
|
|
private final KwtWaybillOrderNodeRepository waybillOrderNodeRepository;
|
|
|
private final KwtWaybillOrderWeighbridgeRepository waybillOrderWeighbridgeRepository;
|
|
|
private final KwtLogisticsOrderContractRepository logisticsOrderContractRepository;
|
|
|
+ private final KwtGatekeeperWaybillOrderRepository gatekeeperWaybillOrderRepository;
|
|
|
|
|
|
@DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
|
|
|
RemoteSystemService remoteSystemService;
|
|
|
@@ -1064,7 +1068,7 @@ public class WaybillOrderService {
|
|
|
tradeIdAndOrderDetailVoMap,tradeIdAndLogOrderList,logisticsOrderIdAndSubtaskList,
|
|
|
dictValueAndDictResDtoMap, goodsIdAndGoodsMap);
|
|
|
}).collect(Collectors.toList());
|
|
|
- log.info("{}物流运单查询结束,result:{}", isRawOre ? "原矿运输" : "正常流程", JSON.toJSONString(orderList));
|
|
|
+ log.info("{}物流运单查询结束,size:{}", isRawOre ? "原矿运输" : "正常流程", orderList.size());
|
|
|
return orderList;
|
|
|
}
|
|
|
|
|
|
@@ -1976,69 +1980,238 @@ public class WaybillOrderService {
|
|
|
* @param param
|
|
|
* @return
|
|
|
*/
|
|
|
- public PageDataResult<WaybillOrderReportResp> queryWaybillOrderReport(WaybillOrderReportQueryParam param) {
|
|
|
+ public List<WaybillOrderReportResp> queryWaybillOrderReport(WaybillOrderReportQueryParam param) {
|
|
|
log.info("[报表]开始查询运单每日报表:{}", JSON.toJSONString(param));
|
|
|
+ // 查询运单数据
|
|
|
+ List<WaybillOrderReportResp> orderRepoost = getWaybillOrderRepoost(param);
|
|
|
+ //汇总数据
|
|
|
+ List<WaybillOrderReportResp> orderGroupedReportList = buildGroupedReport(orderRepoost);
|
|
|
+
|
|
|
+ return orderGroupedReportList;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将扁平的运单列表转换为“汇总行在前,明细在后”的报表格式
|
|
|
+ */
|
|
|
+ public List<WaybillOrderReportResp> buildGroupedReport(List<WaybillOrderReportResp> rawList) {
|
|
|
+ log.info("[报表]开始分组汇总!");
|
|
|
+ if (rawList == null || rawList.isEmpty()) {
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 1. 排序优先级:单位ID -> 商品名称 -> 离场时间(倒序或正序均可)
|
|
|
+ rawList.sort(Comparator.comparing(WaybillOrderReportResp::getProcurementEntId, Comparator.nullsLast(Long::compareTo))
|
|
|
+ .thenComparing(WaybillOrderReportResp::getGoodsName, Comparator.nullsLast(String::compareTo))
|
|
|
+ .thenComparing(WaybillOrderReportResp::getLeaveTime, Comparator.nullsLast(Date::compareTo)));
|
|
|
+
|
|
|
+ // 2. 分组:LinkedHashMap保持插入顺序
|
|
|
+ Map<String, List<WaybillOrderReportResp>> groupedMap = rawList.stream()
|
|
|
+ .collect(Collectors.groupingBy(
|
|
|
+ item -> item.getProcurementEntId() + "_" + item.getGoodsName(),
|
|
|
+ LinkedHashMap::new,
|
|
|
+ Collectors.toList()
|
|
|
+ ));
|
|
|
+
|
|
|
+ List<WaybillOrderReportResp> resultList = new ArrayList<>();
|
|
|
+
|
|
|
+ // 3. 遍历组装:【汇总行】 -> 【明细行】
|
|
|
+ for (Map.Entry<String, List<WaybillOrderReportResp>> entry : groupedMap.entrySet()) {
|
|
|
+ List<WaybillOrderReportResp> details = entry.getValue();
|
|
|
+ if (details.isEmpty()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ WaybillOrderReportResp firstItem = details.get(0);
|
|
|
+
|
|
|
+ // A. 创建并添加【汇总行】 ---
|
|
|
+ WaybillOrderReportResp summaryRow = createSummaryRow(firstItem, details);
|
|
|
+ resultList.add(summaryRow);
|
|
|
+
|
|
|
+ // B. 添加【明细行】 ---
|
|
|
+ // 此时 details 已经是排好序的了,直接追加即可
|
|
|
+ resultList.addAll(details);
|
|
|
+ }
|
|
|
+ log.info("[报表]分组汇总结束!");
|
|
|
+ return resultList;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算并生成一行汇总数据
|
|
|
+ */
|
|
|
+ private WaybillOrderReportResp createSummaryRow(WaybillOrderReportResp sample, List<WaybillOrderReportResp> details) {
|
|
|
+ log.info("[报表]开始生成一行汇总数据!");
|
|
|
+ WaybillOrderReportResp summary = new WaybillOrderReportResp();
|
|
|
+
|
|
|
+ // 复制分组维度的信息
|
|
|
+ summary.setId(-1L);
|
|
|
+ summary.setProcurementEntId(sample.getProcurementEntId());
|
|
|
+
|
|
|
+ BigDecimal totalMoney = BigDecimal.ZERO;
|
|
|
+ BigDecimal totalNetWeight = BigDecimal.ZERO;
|
|
|
+ BigDecimal totalGrossWeight = BigDecimal.ZERO;
|
|
|
+ BigDecimal totalTareWeight = BigDecimal.ZERO;
|
|
|
+
|
|
|
+
|
|
|
+ // 累加计算
|
|
|
+ for (WaybillOrderReportResp item : details) {
|
|
|
+ totalMoney = totalMoney.add(item.getTotalPrice() != null ? item.getTotalPrice() : BigDecimal.ZERO);
|
|
|
+ totalNetWeight = totalNetWeight.add(item.getAmount() != null ? item.getAmount() : BigDecimal.ZERO);
|
|
|
+ totalGrossWeight = totalGrossWeight.add(item.getGrossAmount() != null ? item.getGrossAmount() : BigDecimal.ZERO);
|
|
|
+ totalTareWeight = totalTareWeight.add(item.getTareAmount() != null ? item.getTareAmount() : BigDecimal.ZERO);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 赋值给汇总行
|
|
|
+ summary.setTotalPrice(totalMoney);
|
|
|
+ summary.setAmount(totalNetWeight);
|
|
|
+ summary.setGrossAmount(totalGrossWeight);
|
|
|
+ summary.setTareAmount(totalTareWeight);
|
|
|
+ log.info("[报表]生成一行汇总数据结束!");
|
|
|
+ return summary;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private List<WaybillOrderReportResp> getWaybillOrderRepoost(WaybillOrderReportQueryParam param) {
|
|
|
|
|
|
// 1. 贸易订单id
|
|
|
- Set<Long> tOrderId = tradeOrderInfoService.queryOrderIdByEntId(param.getEntId(), "2");
|
|
|
- if (CollectionUtils.isEmpty(tOrderId)) {
|
|
|
+ Set<Long> tOrderIds = tradeOrderInfoService.queryOrderIdByEntId(param.getEntId(), "2");
|
|
|
+ if (CollectionUtils.isEmpty(tOrderIds)) {
|
|
|
log.info("当前企业无贸易订单!,entId:{}", param.getEntId());
|
|
|
- return PageDataResult.empty(param.getPageNum(), param.getPageSize());
|
|
|
+ return new ArrayList<>();
|
|
|
}
|
|
|
- // 2. 贸易订单
|
|
|
- List<OrderDetailVo> tOrderList = tradeOrderInfoService.queryByTradeOrderIds(tOrderId);
|
|
|
- if (CollectionUtils.isEmpty(tOrderList)) {
|
|
|
- throw new BusinessPlatfromException(ErrorCodeEnum.TRADE_ORDER_NOT_FOUND, "贸易订单不存在,tOrderIds:" + JSON.toJSONString(tOrderId));
|
|
|
+
|
|
|
+ // 2. 采购商
|
|
|
+ List<OrderUnitInfoDetailVO> tOrderUnit= tradeOrderInfoService.queryOrderUnitInfByTOrderIds(tOrderIds, "1");
|
|
|
+ if (CollectionUtils.isEmpty(tOrderUnit)) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.TRADE_ORDER_NOT_FOUND, "采购商不存在,tOrderIds:" + JSON.toJSONString(tOrderIds));
|
|
|
}
|
|
|
- Map<Long, OrderDetailVo> tOrderMap = tOrderList.stream()
|
|
|
- .collect(Collectors.toMap(OrderDetailVo::getId, Function.identity(), (x, y) -> x));
|
|
|
+ Map<Long, OrderUnitInfoDetailVO> tOrderUnitMap = tOrderUnit.stream()
|
|
|
+ .collect(Collectors.toMap(OrderUnitInfoDetailVO::getTOrderId, Function.identity(), (x, y) -> x));
|
|
|
|
|
|
- // 2. 物流订单
|
|
|
- List<KwtLogisticsOrder> logisticsOrders = logisticsOrderRepository.queryByTradeOrderIds(tOrderId);
|
|
|
+ //3. 贸易商品
|
|
|
+ List<TradeOrderGoodsVo> tOrderGoodsVos = tradeOrderInfoService.queryOrderGoodsByTOrderIds(tOrderIds);
|
|
|
+ if (CollectionUtils.isEmpty(tOrderGoodsVos)) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.TRADE_ORDER_NOT_FOUND, "贸易商品不存在,tOrderIds:" + JSON.toJSONString(tOrderIds));
|
|
|
+ }
|
|
|
+ Map<Long, TradeOrderGoodsVo> tOrderGoodsMap = tOrderGoodsVos.stream()
|
|
|
+ .collect(Collectors.toMap(TradeOrderGoodsVo::getTradeOrderId, Function.identity(), (x, y) -> x));
|
|
|
+
|
|
|
+ // 4. 物流订单
|
|
|
+ List<KwtLogisticsOrder> logisticsOrders = logisticsOrderRepository.queryByTradeOrderIds(tOrderIds);
|
|
|
if (CollectionUtils.isEmpty(logisticsOrders)) {
|
|
|
- throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_FOUND, "物流订单不存在,tOrderIds:" + JSON.toJSONString(tOrderId));
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_FOUND, "物流订单不存在,tOrderIds:" + JSON.toJSONString(tOrderIds));
|
|
|
}
|
|
|
Set<Long> lOrderIds= logisticsOrders.stream().map(KwtLogisticsOrder::getId).collect(Collectors.toSet());
|
|
|
+ Map<Long, KwtLogisticsOrder> logOrderMap = logisticsOrders.stream()
|
|
|
+ .collect(Collectors.toMap(KwtLogisticsOrder::getId, Function.identity(), (x, y) -> x));
|
|
|
|
|
|
- // 3.物流卸货订单
|
|
|
+ // 5.物流卸货订单
|
|
|
List<KwtLogisticsOrderAddress> lOrderAddresseList = logisticsOrderAddressRepository.queryByLogOrderIds(lOrderIds);
|
|
|
if (CollectionUtils.isEmpty(lOrderAddresseList)) {
|
|
|
throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ADDRESS_NOT_FOUND, "物流订单卸货信息不存在,lOrderIds:" + JSON.toJSONString(lOrderIds));
|
|
|
}
|
|
|
- Map<Long, KwtLogisticsOrderAddress> addressMap = lOrderAddresseList
|
|
|
- .stream().collect(Collectors.toMap(KwtLogisticsOrderAddress::getLOrderId, Function.identity(), (x, y) -> x));
|
|
|
+ Map<Long, KwtLogisticsOrderAddress> addressMap = lOrderAddresseList.stream()
|
|
|
+ .collect(Collectors.toMap(KwtLogisticsOrderAddress::getLOrderId, Function.identity(), (x, y) -> x));
|
|
|
|
|
|
- // 4.运单
|
|
|
- LambdaQueryWrapper<KwtWaybillOrder> queryWrapper = Wrappers.<KwtWaybillOrder>lambdaQuery()
|
|
|
- .eq(KwtWaybillOrder::getEntId, param.getEntId())
|
|
|
- .eq(KwtWaybillOrder::getDelFlag, 0)
|
|
|
- .in(KwtWaybillOrder::getLOrderId, lOrderIds)
|
|
|
- .ge(KwtWaybillOrder::getStatus,18)
|
|
|
- .orderByDesc(KwtWaybillOrder::getCreateTime)
|
|
|
- .orderByDesc(KwtWaybillOrder::getId);
|
|
|
- List<KwtWaybillOrder> waybillOrderList = waybillOrderRepository.list(queryWrapper);
|
|
|
- if (CollectionUtils.isEmpty(waybillOrderList)) {
|
|
|
- throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_NOT_FOUND, "物流运单不存在,lOrderIds:" + JSON.toJSONString(lOrderIds));
|
|
|
+ // 6.运单
|
|
|
+ List<KwtWaybillOrder> waybillOrderList = queryWaybillOrders(param, lOrderIds);
|
|
|
+ List<Long> wOrderIds = waybillOrderList.stream().map(KwtWaybillOrder::getId).collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 7. 运单装货单
|
|
|
+ List<KwtWaybillOrderTicket> ticketList = waybillOrderTicketRepository.queryByWOrderIdsAndType(wOrderIds, Global.ADDRESS_LOAD);
|
|
|
+ if (CollectionUtils.isEmpty(ticketList)) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_NOT_FOUND, "运单装货单不存在,wOrderIds:" + JSON.toJSONString(wOrderIds));
|
|
|
}
|
|
|
- Map<Long, KwtWaybillOrder> waybillOrderMap = waybillOrderList.stream().collect(Collectors.toMap(KwtWaybillOrder::getLOrderId, Function.identity(), (x, y) -> x));
|
|
|
+ Map<Long, KwtWaybillOrderTicket> ticketMap = ticketList.stream()
|
|
|
+ .collect(Collectors.toMap(KwtWaybillOrderTicket::getWOrderId, Function.identity(), (x, y) -> x));
|
|
|
|
|
|
- // 5.
|
|
|
+ // 8.门卫
|
|
|
+ List<KwtGatekeeperWaybillOrder> gatekeepers = gatekeeperWaybillOrderRepository.queryGatekeeperByWaybillOrders(wOrderIds, Global.ADDRESS_LOAD);
|
|
|
+ if (CollectionUtils.isEmpty(gatekeepers)) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_NOT_FOUND, "门卫运单不存在,wOrderIds:" + JSON.toJSONString(wOrderIds));
|
|
|
+ }
|
|
|
+ Map<Long, KwtGatekeeperWaybillOrder> gatekeeperMap = gatekeepers.stream()
|
|
|
+ .collect(Collectors.toMap(KwtGatekeeperWaybillOrder::getWOrderId, Function.identity(), (x, y) -> x));
|
|
|
|
|
|
+ //组装参数
|
|
|
+ List<WaybillOrderReportResp> orderList = waybillOrderList.stream()
|
|
|
+ .map(waybillOrder -> {
|
|
|
+ return getWaybillOrderReport(waybillOrder, tOrderUnitMap, tOrderGoodsMap, logOrderMap, addressMap, ticketMap, gatekeeperMap);
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ log.info("[报表]查询运单每日报表结算,还未分组, size:{}",orderList.size());
|
|
|
+ return orderList;
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
|
|
- Page<KwtWaybillOrder> page = waybillOrderRepository.page(new Page<>(param.getPageNum(), param.getPageSize()), queryWrapper);
|
|
|
- List<KwtWaybillOrder> records = page.getRecords();
|
|
|
- if (CollectionUtils.isEmpty(records)) {
|
|
|
- log.info("当前企业无已离场数据,entId:{}", param.getEntId());
|
|
|
- return PageDataResult.empty(param.getPageNum(), param.getPageSize());
|
|
|
- }
|
|
|
+ private List<KwtWaybillOrder> queryWaybillOrders(WaybillOrderReportQueryParam param, Set<Long> lOrderIds) {
|
|
|
+ //当天开始时间
|
|
|
+ Date startOfDay = DateUtils.getStartOfDay(param.getOneDayTime(), DateUtils.DATE_TIME_PATTERN);
|
|
|
+ //当天结算时间
|
|
|
+ Date endOfDay = DateUtils.getEndOfDay(param.getOneDayTime());
|
|
|
+
|
|
|
+ LambdaQueryWrapper<KwtWaybillOrder> queryWrapper = Wrappers.<KwtWaybillOrder>lambdaQuery()
|
|
|
+ .in(KwtWaybillOrder::getLOrderId, lOrderIds)
|
|
|
+ .ge(KwtWaybillOrder::getCreateTime, startOfDay)
|
|
|
+ .le(KwtWaybillOrder::getCreateTime, endOfDay)
|
|
|
+ .eq(KwtWaybillOrder::getStatus,25)
|
|
|
+ .eq(KwtWaybillOrder::getDelFlag, 0)
|
|
|
+ .orderByDesc(KwtWaybillOrder::getUpdateTime);
|
|
|
|
|
|
+ Page<KwtWaybillOrder> pageList = waybillOrderRepository.page(new Page<>(param.getPageNum(), param.getPageSize()), queryWrapper);
|
|
|
|
|
|
- log.info("[报表]查询运单每日报表结束:{}", JSON.toJSONString(param));
|
|
|
+ List<KwtWaybillOrder> waybillOrderList = pageList.getRecords();
|
|
|
+ if (CollectionUtils.isEmpty(waybillOrderList)) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_NOT_FOUND, "物流运单不存在,lOrderIds:" + JSON.toJSONString(lOrderIds));
|
|
|
+ }
|
|
|
+ return waybillOrderList;
|
|
|
+ }
|
|
|
|
|
|
- return PageDataResult.success(param.getPageNum(), param.getPageSize(), null , null);
|
|
|
|
|
|
+ /**
|
|
|
+ * 查询正常流程物流运单
|
|
|
+ * @param param
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private WaybillOrderReportResp getWaybillOrderReport(KwtWaybillOrder waybillOrder,
|
|
|
+ Map<Long, OrderUnitInfoDetailVO> tOrderUnitMap,
|
|
|
+ Map<Long, TradeOrderGoodsVo> tOrderGoodsMap,
|
|
|
+ Map<Long, KwtLogisticsOrder> logOrderMap,
|
|
|
+ Map<Long, KwtLogisticsOrderAddress> addressMap,
|
|
|
+ Map<Long, KwtWaybillOrderTicket> ticketMap,
|
|
|
+ Map<Long, KwtGatekeeperWaybillOrder> gatekeeperMap) {
|
|
|
+
|
|
|
+ //订单
|
|
|
+ KwtLogisticsOrder logOrder = logOrderMap.getOrDefault(waybillOrder.getLOrderId(), new KwtLogisticsOrder());
|
|
|
+ //采购商
|
|
|
+ OrderUnitInfoDetailVO tOrderUnit = tOrderUnitMap.getOrDefault(logOrder.getTOrderId(), new OrderUnitInfoDetailVO());
|
|
|
+ //贸易商品
|
|
|
+ TradeOrderGoodsVo tradeOrderGoods = tOrderGoodsMap.getOrDefault(logOrder.getTOrderId(), new TradeOrderGoodsVo());
|
|
|
+ //地址
|
|
|
+ KwtLogisticsOrderAddress loAddress = addressMap.getOrDefault(waybillOrder.getLOrderId(), new KwtLogisticsOrderAddress());
|
|
|
+ //运单装货
|
|
|
+ KwtWaybillOrderTicket ticket = ticketMap.getOrDefault(waybillOrder.getId(), new KwtWaybillOrderTicket());
|
|
|
+ //门卫
|
|
|
+ KwtGatekeeperWaybillOrder gatekeeper = gatekeeperMap.getOrDefault(waybillOrder.getId(), new KwtGatekeeperWaybillOrder());
|
|
|
+
|
|
|
+ WaybillOrderReportResp resp = new WaybillOrderReportResp();
|
|
|
+ resp.setId(waybillOrder.getId());
|
|
|
+ resp.setTruckNo(waybillOrder.getTruckNo());
|
|
|
+ resp.setTradeOrderNo(logOrder.getTOrderNo());
|
|
|
+ resp.setWaybillNo(waybillOrder.getWOrderNo());
|
|
|
+ resp.setProcurementEntId(tOrderUnit.getEntId());
|
|
|
+ resp.setProcurementEntName(tOrderUnit.getFirmName());
|
|
|
+
|
|
|
+ resp.setTareAmount(ticket.getTareAmount());
|
|
|
+ resp.setGrossAmount(ticket.getGrossAmount());
|
|
|
+ resp.setAmount(ticket.getAmount());
|
|
|
+ resp.setGoodsName(gatekeeper.getGoodsName());
|
|
|
+ resp.setLeaveTime(gatekeeper.getLeaveTime());
|
|
|
+ resp.setUnloadingPerson(loAddress.getContacts());
|
|
|
+ resp.setUnitPrice(tradeOrderGoods.getAmount());
|
|
|
+ //装货总价 = 装货净重*单价
|
|
|
+ resp.setTotalPrice(ticket.getAmount().multiply(tradeOrderGoods.getAmount()));
|
|
|
+
|
|
|
+ return resp;
|
|
|
}
|
|
|
|
|
|
|