|
@@ -639,10 +639,9 @@ public class WaybillOrderService {
|
|
|
orderResp.setStatus(Optional.ofNullable(order.getStatus()).map(String::valueOf).orElse(null));
|
|
orderResp.setStatus(Optional.ofNullable(order.getStatus()).map(String::valueOf).orElse(null));
|
|
|
orderResp.setStatusDesc(LogisticsOrderV1Enum.IN_TRANSIT.getCode().equals(order.getStatus()) ? "待接单" : "未知状态");
|
|
orderResp.setStatusDesc(LogisticsOrderV1Enum.IN_TRANSIT.getCode().equals(order.getStatus()) ? "待接单" : "未知状态");
|
|
|
//设置余量
|
|
//设置余量
|
|
|
-// BigDecimal orderSurplus = getSupAmount(order.getTOrderId(), tradeIdAndOrderDetailVoMap, tradeIdAndLogOrderList,
|
|
|
|
|
-// logisticsOrderIdAndSubtaskList);
|
|
|
|
|
-// orderResp.setOrderSurplus(orderSurplus.toPlainString());
|
|
|
|
|
-// orderResp.setRemainingAmount(orderSurplus);
|
|
|
|
|
|
|
+ BigDecimal orderSurplus = getRawOreSupAmount(order, logisticsOrderIdAndSubtaskList);
|
|
|
|
|
+ orderResp.setOrderSurplus(orderSurplus.toPlainString());
|
|
|
|
|
+ orderResp.setRemainingAmount(orderSurplus);
|
|
|
|
|
|
|
|
return orderResp;
|
|
return orderResp;
|
|
|
}
|
|
}
|
|
@@ -1201,6 +1200,73 @@ public class WaybillOrderService {
|
|
|
return result;
|
|
return result;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 计算贸易订单余量
|
|
|
|
|
+ * 逻辑:贸易订单总量 - (所有关联物流订单下,非取消/完成状态的子运单委托量 + 对应计费模式的磅单量)
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param tradeOrderId 贸易订单ID
|
|
|
|
|
+ * @param tradeIdAndOrderDetailVoMap 贸易订单详情映射
|
|
|
|
|
+ * @param tradeIdAndLogOrderList 贸易订单关联的物流订单列表映射
|
|
|
|
|
+ * @param logisticsOrderIdAndSubtaskList 物流订单关联的子运单列表映射
|
|
|
|
|
+ * @param waybillOrderIdAndTicketList 运单ID关联的磅单列表映射
|
|
|
|
|
+ * @return 订单余量,保留两位小数
|
|
|
|
|
+ */
|
|
|
|
|
+ private BigDecimal getRawOreSupAmount(KwtLogisticsOrder order,
|
|
|
|
|
+ Map<Long, List<KwtWaybillOrderSubtask>> logisticsOrderIdAndSubtaskList) {
|
|
|
|
|
+ log.debug("开始计算物流订单余量,param: {}", JSON.toJSONString(order));
|
|
|
|
|
+
|
|
|
|
|
+ // 1. 获取贸易订单总货物量
|
|
|
|
|
+ BigDecimal tradeAmount = order.getAmount();
|
|
|
|
|
+ log.debug("物流订单[{}]总货物量: {}", order.getId(), tradeAmount);
|
|
|
|
|
+
|
|
|
|
|
+ Long logOrderId = order.getId();
|
|
|
|
|
+ // 获取当前物流订单下的所有子运单
|
|
|
|
|
+ List<KwtWaybillOrderSubtask> waybillOrderSubtasks = logisticsOrderIdAndSubtaskList.getOrDefault(logOrderId, Collections.emptyList());
|
|
|
|
|
+
|
|
|
|
|
+ if (CollectionUtils.isEmpty(waybillOrderSubtasks)) {
|
|
|
|
|
+ log.debug("物流订单[{}]无子运单,跳过", logOrderId);
|
|
|
|
|
+ return BigDecimal.ZERO;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 定义需要剔除的状态:已取消、已完成、空载(这些状态下的运单不再占用当前可接单的余量,或者其量已结算)
|
|
|
|
|
+ // 注意:具体业务逻辑中,通常“进行中”的运单会占用余量。这里根据原代码逻辑,剔除CANCELLED和COMPLETED。
|
|
|
|
|
+ // 空载待离场,实际装货量接近0,所以也要剔除
|
|
|
|
|
+ List<Integer> excludeStatusList = Arrays.asList(CarWaybillV1Enum.CANCELLED.getCode(), CarWaybillV1Enum.COMPLETED.getCode()
|
|
|
|
|
+ , CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode());
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 计算子运单委托量合计(仅统计未取消/未完成/空载的有效子运单)
|
|
|
|
|
+ BigDecimal entrustAmount = waybillOrderSubtasks.stream()
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .filter(subtask -> !excludeStatusList.contains(subtask.getStatus()))
|
|
|
|
|
+ .map(KwtWaybillOrderSubtask::getEntrustAmount)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
|
|
+
|
|
|
|
|
+ log.debug("物流订单[{}]子运单委托量合计: {}", logOrderId, entrustAmount);
|
|
|
|
|
+
|
|
|
|
|
+ // 5. 计算运单已完成的合计量
|
|
|
|
|
+ BigDecimal totalLoadAmount = order.getTotalLoadAmount();
|
|
|
|
|
+ totalLoadAmount = totalLoadAmount == null || totalLoadAmount.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : totalLoadAmount;
|
|
|
|
|
+ log.debug("物流订单[{}]有完成的运单实际装货量合计: {}", logOrderId, totalLoadAmount);
|
|
|
|
|
+
|
|
|
|
|
+ // 累加到总占用量
|
|
|
|
|
+ BigDecimal usedAmount = entrustAmount.add(totalLoadAmount);
|
|
|
|
|
+
|
|
|
|
|
+ log.debug("物流订单[{}]总占用量: {}", logOrderId, usedAmount);
|
|
|
|
|
+
|
|
|
|
|
+ // 6. 计算余量:贸易订单总量 - 已占用量
|
|
|
|
|
+ // 如果计算结果小于等于0,则余量为0,避免负数
|
|
|
|
|
+ BigDecimal surplus = tradeAmount.subtract(usedAmount);
|
|
|
|
|
+ BigDecimal finalSurplus = surplus.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : surplus;
|
|
|
|
|
+
|
|
|
|
|
+ // 保留两位小数,四舍五入
|
|
|
|
|
+ BigDecimal result = finalSurplus.setScale(2, RoundingMode.HALF_UP);
|
|
|
|
|
+ log.debug("物流订单[{}]最终余量: {}", logOrderId, result);
|
|
|
|
|
+
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 批量构建运单ID与磅单信息映射,供订单余量计算复用。
|
|
* 批量构建运单ID与磅单信息映射,供订单余量计算复用。
|
|
|
*/
|
|
*/
|