|
|
@@ -318,8 +318,8 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
|
|
|
log.info("车辆无皮重,按80%核定载重计算,车辆任务量:{}", loadVolume);
|
|
|
}
|
|
|
|
|
|
- //订单余量
|
|
|
- BigDecimal remainingAmount = getRemainingAmount(tradeOrder,logOrder);
|
|
|
+ //订单余量:区分正常流程和原矿运输
|
|
|
+ BigDecimal remainingAmount = Objects.equals(1, logOrder.getOrderType()) ? getRawOreSupAmount(logOrder) : getRemainingAmount(tradeOrder);
|
|
|
|
|
|
// 最终接取的任务量
|
|
|
BigDecimal taskAmount;
|
|
|
@@ -341,14 +341,9 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
|
|
|
}
|
|
|
|
|
|
@NotNull
|
|
|
- private BigDecimal getRemainingAmount(OrderDetailVo tradeOrder, KwtLogisticsOrder logOrder) {
|
|
|
- //订单分配总量(原矿运输的总量放在物流订单的)
|
|
|
- BigDecimal entrustAmount;
|
|
|
- if (Objects.equals(1, logOrder.getOrderType())) {
|
|
|
- entrustAmount = logOrder.getAmount();
|
|
|
- } else {
|
|
|
- entrustAmount = tradeOrder.getAmount();
|
|
|
- }
|
|
|
+ private BigDecimal getRemainingAmount(OrderDetailVo tradeOrder) {
|
|
|
+ //订单分配总量
|
|
|
+ BigDecimal entrustAmount = tradeOrder.getAmount();
|
|
|
if (entrustAmount == null || entrustAmount.compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "订单分配总量必须大于0!");
|
|
|
}
|
|
|
@@ -392,6 +387,69 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
|
|
|
return remainingAmount;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算贸易订单余量
|
|
|
+ * 逻辑:贸易订单总量 - (所有关联物流订单下,非取消/完成状态的子运单委托量 + 对应计费模式的磅单量)
|
|
|
+ *
|
|
|
+ * @return 订单余量,保留两位小数
|
|
|
+ */
|
|
|
+ private BigDecimal getRawOreSupAmount(KwtLogisticsOrder order) {
|
|
|
+ log.debug("开始计算物流订单余量,param: {}", JSON.toJSONString(order));
|
|
|
+
|
|
|
+ // 1. 获取贸易订单总货物量
|
|
|
+ BigDecimal tradeAmount = order.getAmount();
|
|
|
+ log.debug("物流订单[{}]总货物量: {}", order.getId(), tradeAmount);
|
|
|
+
|
|
|
+ Long logOrderId = order.getId();
|
|
|
+ // 获取当前物流订单下的所有子运单
|
|
|
+ List<KwtWaybillOrderSubtask> waybillOrderSubtasks = waybillOrderSubtaskRepository.queryByLogId(logOrderId);
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(waybillOrderSubtasks)) {
|
|
|
+ BigDecimal tradeTotalAmount = tradeAmount.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : tradeAmount;
|
|
|
+ BigDecimal bigDecimal = tradeTotalAmount.setScale(2, RoundingMode.HALF_UP);
|
|
|
+ log.debug("物流订单[{}]无子运单,跳过, 最终余量: {}",logOrderId, bigDecimal);
|
|
|
+ return bigDecimal;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 定义需要剔除的状态:已取消、已完成、空载(这些状态下的运单不再占用当前可接单的余量,或者其量已结算)
|
|
|
+ // 注意:具体业务逻辑中,通常“进行中”的运单会占用余量。这里根据原代码逻辑,剔除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;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 创建物流运单
|
|
|
*
|