|
|
@@ -3234,6 +3234,12 @@ public class KwtLogisticsConsignmentService {
|
|
|
// logisticsOrderResp.setLoadAmount(loadAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() + kwtLogisticsOrder.getUnit());
|
|
|
logisticsOrderResp.setUnloadAmount(unloadAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() +"吨");
|
|
|
logisticsOrderResp.setLoadAmount(loadAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() +"吨");
|
|
|
+
|
|
|
+ //设置余量
|
|
|
+ BigDecimal orderSurplus = getRaworeSupAmount(kwtLogisticsOrder, tradeIdAndOrderDetailVoMap, tradeIdAndLogOrderList,
|
|
|
+ logisticsOrderIdAndSubtaskList, waybillOrderIdAndTicketList);
|
|
|
+ logisticsOrderResp.setOrderSurplus(orderSurplus.toPlainString() + "吨");
|
|
|
+ logisticsOrderResp.setRemainingAmount(orderSurplus);
|
|
|
}else {
|
|
|
log.info("订单类型不为1,普通订单");
|
|
|
if (org.apache.commons.lang3.StringUtils.equals(kwtLogisticsOrder.getBillingMode(),
|
|
|
@@ -3263,6 +3269,11 @@ public class KwtLogisticsConsignmentService {
|
|
|
//logisticsOrderResp.setActualTransportPrice(transportPrice.setScale(2, RoundingMode.HALF_UP).toPlainString() + priceUnit);
|
|
|
}
|
|
|
logisticsOrderResp.setLoadAmount(loadAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() + kwtLogisticsOrder.getUnit());
|
|
|
+ //设置余量
|
|
|
+ BigDecimal orderSurplus = getSupAmount(kwtLogisticsOrder.getTOrderId(), tradeIdAndOrderDetailVoMap, tradeIdAndLogOrderList,
|
|
|
+ logisticsOrderIdAndSubtaskList, waybillOrderIdAndTicketList);
|
|
|
+ logisticsOrderResp.setOrderSurplus(orderSurplus.toPlainString() + kwtLogisticsOrder.getUnit());
|
|
|
+ logisticsOrderResp.setRemainingAmount(orderSurplus);
|
|
|
}
|
|
|
logisticsOrderResp.setActualTransportPrice(transportPrice.setScale(2, RoundingMode.HALF_UP).toPlainString() + priceUnit);
|
|
|
// logisticsOrderResp.setActualTransportPrice(actualTransportPrice.setScale(2, RoundingMode.HALF_UP).toPlainString() + priceUnit);
|
|
|
@@ -3287,11 +3298,7 @@ public class KwtLogisticsConsignmentService {
|
|
|
logisticsOrderResp.setCreateTime(DateUtils.format(kwtLogisticsOrder.getCreateTime(), DateUtils.DATE_TIME_PATTERN));
|
|
|
logisticsOrderResp.setStatus(String.valueOf(kwtLogisticsOrder.getStatus()));
|
|
|
logisticsOrderResp.setStatusDesc(LogisticsOrderV1Enum.getDesc(kwtLogisticsOrder.getStatus()));
|
|
|
- //设置余量
|
|
|
- BigDecimal orderSurplus = getSupAmount(kwtLogisticsOrder.getTOrderId(), tradeIdAndOrderDetailVoMap, tradeIdAndLogOrderList,
|
|
|
- logisticsOrderIdAndSubtaskList, waybillOrderIdAndTicketList);
|
|
|
- logisticsOrderResp.setOrderSurplus(orderSurplus.toPlainString() + kwtLogisticsOrder.getUnit());
|
|
|
- logisticsOrderResp.setRemainingAmount(orderSurplus);
|
|
|
+
|
|
|
return logisticsOrderResp;
|
|
|
}
|
|
|
|
|
|
@@ -3402,6 +3409,93 @@ public class KwtLogisticsConsignmentService {
|
|
|
return surplus.setScale(2, RoundingMode.HALF_UP);
|
|
|
}
|
|
|
|
|
|
+ private static BigDecimal getRaworeSupAmount(KwtLogisticsOrder kwtLogisticsOrder,
|
|
|
+ Map<Long, OrderDetailVo> tradeIdAndOrderDetailVoMap,
|
|
|
+ Map<Long, List<KwtLogisticsOrder>> tradeIdAndLogOrderList,
|
|
|
+ Map<Long, List<KwtWaybillOrderSubtask>> logisticsOrderIdAndSubtaskList,
|
|
|
+ Map<Long, List<KwtWaybillOrderTicket>> waybillOrderIdAndTicketList) {
|
|
|
+ log.debug("开始计算原矿订单余量,物流订单号: {}", kwtLogisticsOrder.getLOrderNo());
|
|
|
+
|
|
|
+ // 1. 获取贸易订单基础信息及总货物量
|
|
|
+ BigDecimal tradeAmount = Optional.ofNullable(kwtLogisticsOrder).map(KwtLogisticsOrder::getAmount).orElse(BigDecimal.ZERO);
|
|
|
+ log.debug("贸易订单总货物量: {}", tradeAmount);
|
|
|
+
|
|
|
+ // 2. 获取该贸易订单关联的所有物流订单
|
|
|
+ BigDecimal usedAmount = BigDecimal.ZERO;
|
|
|
+
|
|
|
+ if (Objects.nonNull(kwtLogisticsOrder)) {
|
|
|
+ log.debug("开始获取该贸易订单关联的所有物流订单");
|
|
|
+ Long logOrderId = kwtLogisticsOrder.getId();
|
|
|
+ // 获取当前物流订单下的所有子运单
|
|
|
+ List<KwtWaybillOrderSubtask> waybillOrderSubtasks = logisticsOrderIdAndSubtaskList.getOrDefault(logOrderId, Collections.emptyList());
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(waybillOrderSubtasks)) {
|
|
|
+ log.debug("物流订单 {} 下无子运单,跳过", logOrderId);
|
|
|
+ return BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 根据计费模式确定磅单类型(装货或卸货)
|
|
|
+ // CHARGING_TYPE_1: 按装货量计费 -> 对应装货磅单 (SHIPMENT)
|
|
|
+ // CHARGING_TYPE_2: 按卸货量计费 -> 对应卸货磅单 (TAKE)
|
|
|
+ Integer ticketType;
|
|
|
+ String billingMode = kwtLogisticsOrder.getBillingMode();
|
|
|
+ if (org.apache.commons.lang3.StringUtils.equals(billingMode, DictEnum.CHARGING_TYPE_1.getValue())) {
|
|
|
+ ticketType = AddressTypeEnum.SHIPMENT.getCode();
|
|
|
+ } else if (org.apache.commons.lang3.StringUtils.equals(billingMode, DictEnum.CHARGING_TYPE_2.getValue())) {
|
|
|
+ ticketType = AddressTypeEnum.TAKE.getCode();
|
|
|
+ } else {
|
|
|
+ // 未知计费模式,记录警告并跳过该物流订单的计算,避免数据错误
|
|
|
+ log.warn("余量计算跳过未知计费模式, logOrderId:{}, billingMode:{}",
|
|
|
+ logOrderId, billingMode);
|
|
|
+ return BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 计算子运单委托量总和
|
|
|
+ // 过滤条件:对象非空、状态非取消、委托量非空
|
|
|
+ List<Integer> statusList = Arrays.asList(CarWaybillV1Enum.COMPLETED.getCode(), CarWaybillV1Enum.CANCELLED.getCode());
|
|
|
+ BigDecimal entrustAmount = waybillOrderSubtasks.stream()
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .filter(subtask -> !statusList.contains(subtask.getStatus()))
|
|
|
+ .map(KwtWaybillOrderSubtask::getEntrustAmount)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+
|
|
|
+ // 5. 计算磅单实际量总和
|
|
|
+ // 逻辑:子运单 -> 主运单ID -> 磅单列表 -> 过滤特定类型 -> 累加金额/数量
|
|
|
+ BigDecimal ticketAmount = waybillOrderSubtasks.stream()
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .filter(subtask -> !Objects.equals(subtask.getStatus(), CarWaybillV1Enum.CANCELLED.getCode()))
|
|
|
+ .map(KwtWaybillOrderSubtask::getWOrderId)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .flatMap(wOrderId -> waybillOrderIdAndTicketList.getOrDefault(wOrderId, Collections.emptyList()).stream())
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ // 只统计与计费模式匹配的磅单类型(装或卸)
|
|
|
+ .filter(ticket -> Objects.equals(ticket.getType(), ticketType))
|
|
|
+ .map(KwtWaybillOrderTicket::getAmount)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+
|
|
|
+ // 累加当前物流订单的已使用量
|
|
|
+ BigDecimal currentUsed = entrustAmount.add(ticketAmount);
|
|
|
+ usedAmount = usedAmount.add(currentUsed);
|
|
|
+
|
|
|
+ log.debug("物流订单 {} 计算详情: 委托量={}, 磅单量={}, 计费类型={}",
|
|
|
+ logOrderId, entrustAmount, ticketAmount, ticketType);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 6. 计算最终余量:总量 - 已用量,若结果小于0则置为0
|
|
|
+ BigDecimal surplus = tradeAmount.subtract(usedAmount);
|
|
|
+ if (surplus.compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
+ log.info("物流订单 {} 余量计算结果为负或零,重置为0。总量: {}, 已用: {}", kwtLogisticsOrder.getId(), tradeAmount, usedAmount);
|
|
|
+ surplus = BigDecimal.ZERO;
|
|
|
+ } else {
|
|
|
+ log.debug("物流订单 {} 余量计算正常。总量: {}, 已用: {}, 余量: {}", kwtLogisticsOrder.getId(), tradeAmount, usedAmount, surplus);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 保留两位小数,四舍五入
|
|
|
+ return surplus.setScale(2, RoundingMode.HALF_UP);
|
|
|
+ }
|
|
|
+
|
|
|
public LogisticsOrderDetailResp getLogisticsOrderDetail(@Valid LogisticsOrderReq req) {
|
|
|
KwtLogisticsOrder logisticsOrder =
|
|
|
logisticsOrderRepository.queryByLogisticsOrderId(Long.valueOf(req.getLogisticsOrderId()));
|
|
|
@@ -3535,11 +3629,13 @@ public class KwtLogisticsConsignmentService {
|
|
|
BigDecimal totalAmount = BigDecimal.ZERO;
|
|
|
if (Objects.equals(logisticsOrder.getOrderType(), 1)){
|
|
|
log.info("物流单类型为1,原矿转运");
|
|
|
+ BigDecimal orderAmount1 = Objects.nonNull(logisticsOrder.getAmount()) ? logisticsOrder.getAmount() : BigDecimal.ZERO;
|
|
|
+ performanceInfoVO.setOrderAmount(orderAmount1.setScale(2, RoundingMode.HALF_UP).toPlainString() + "吨");
|
|
|
totalCarriageCost = Objects.nonNull(logisticsOrder.getPrice()) ? unloadAmount.multiply(logisticsOrder.getPrice()) :
|
|
|
BigDecimal.ZERO;
|
|
|
performanceInfoVO.setLoadAmount(loadAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() + "吨");
|
|
|
performanceInfoVO.setUnloadAmount(unloadAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() + "吨");
|
|
|
- BigDecimal surplusAmount = tradeAmount.subtract(orderAmount.add(unloadAmount)).compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : tradeAmount.subtract(orderAmount.add(unloadAmount));
|
|
|
+ BigDecimal surplusAmount = orderAmount1.subtract(orderAmount.add(unloadAmount)).compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : tradeAmount.subtract(orderAmount.add(unloadAmount));
|
|
|
performanceInfoVO.setSurplusAmount(surplusAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() + "吨");
|
|
|
}else {
|
|
|
log.info("物流单类型不为1,普通物流");
|
|
|
@@ -3818,6 +3914,11 @@ public class KwtLogisticsConsignmentService {
|
|
|
.map(KwtLogisticsOrder::getUnit).orElse("");
|
|
|
capacityVo.setStatus("0");
|
|
|
capacityVo.setStatusDesc("待接单");
|
|
|
+ KwtLogisticsOrder kwtLogisticsOrder = Optional.ofNullable(logisticsOrders).map(x -> x.get(0)).orElse(new KwtLogisticsOrder());
|
|
|
+ if (Objects.equals(kwtLogisticsOrder.getOrderType(), 1)){
|
|
|
+ log.info("物流单类型为1,原矿转运");
|
|
|
+ unit = "吨";
|
|
|
+ }
|
|
|
if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(waybillOrders)) {
|
|
|
List<KwtWaybillOrder> waybillOrderList = Optional.ofNullable(waybillOrders).orElse(List.of())
|
|
|
.stream()
|