|
@@ -3063,12 +3063,6 @@ public class KwoTradeOrderService {
|
|
|
return actualDisPatch;
|
|
return actualDisPatch;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * 手动完结订单
|
|
|
|
|
- *
|
|
|
|
|
- * @param tradeOrderSettleParam
|
|
|
|
|
- * @return
|
|
|
|
|
- */
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public Object settleOrder(TradeOrderSettleParam tradeOrderSettleParam) {
|
|
public Object settleOrder(TradeOrderSettleParam tradeOrderSettleParam) {
|
|
|
KwoTradeOrder kwoTradeOrder = new KwoTradeOrder();
|
|
KwoTradeOrder kwoTradeOrder = new KwoTradeOrder();
|
|
@@ -3079,8 +3073,6 @@ public class KwoTradeOrderService {
|
|
|
kwoTradeOrder.setStatus(TradeOrderStatusEnum.SUCCESS.getCode());
|
|
kwoTradeOrder.setStatus(TradeOrderStatusEnum.SUCCESS.getCode());
|
|
|
// 预付钱包完结:解冻 + 按实际装/卸货量消费
|
|
// 预付钱包完结:解冻 + 按实际装/卸货量消费
|
|
|
calculatePrepaidBalance(kwoTradeOrderDB);
|
|
calculatePrepaidBalance(kwoTradeOrderDB);
|
|
|
- // 收费策略服务费完结:解冻履约中金额 + 按实际履约量扣减(内部含详细日志)
|
|
|
|
|
- settleChargeStrategyIfApplied(kwoTradeOrderDB, logisticOrderList);
|
|
|
|
|
} else {
|
|
} else {
|
|
|
kwoTradeOrder.setStatus(TradeOrderStatusEnum.DEAL.getCode());
|
|
kwoTradeOrder.setStatus(TradeOrderStatusEnum.DEAL.getCode());
|
|
|
}
|
|
}
|
|
@@ -3093,6 +3085,7 @@ public class KwoTradeOrderService {
|
|
|
//通知下游,贸易订单已完结,或处于完结中。
|
|
//通知下游,贸易订单已完结,或处于完结中。
|
|
|
try {
|
|
try {
|
|
|
transportRemoteService.logisticOrderFinish(new OrderFinishParam(tradeOrderSettleParam.getId()));
|
|
transportRemoteService.logisticOrderFinish(new OrderFinishParam(tradeOrderSettleParam.getId()));
|
|
|
|
|
+ settleChargeStrategyAfterLogisticOrderFinish(tradeOrderSettleParam.getId());
|
|
|
} catch (BusinessException e) {
|
|
} catch (BusinessException e) {
|
|
|
if (StrUtil.equals(e.getMsg(), "未找到该物流订单信息")) {
|
|
if (StrUtil.equals(e.getMsg(), "未找到该物流订单信息")) {
|
|
|
kwoTradeOrder.setUnloadAmount(new BigDecimal("0"));
|
|
kwoTradeOrder.setUnloadAmount(new BigDecimal("0"));
|
|
@@ -3103,6 +3096,58 @@ public class KwoTradeOrderService {
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 物流订单完结后统一处理服务费结算。
|
|
|
|
|
+ * <p>
|
|
|
|
|
+ * 所有调用 TransportRemoteService.logisticOrderFinish 的场景,均应调用此方法。
|
|
|
|
|
+ * 方法内部重新查询订单和运单状态,确保仅在所有运单完成且订单应用收费策略时,
|
|
|
|
|
+ * 执行服务费解冻、扣减并记录钱包变动明细。
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param tradeOrderId 贸易订单ID
|
|
|
|
|
+ */
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
|
+ public void settleChargeStrategyAfterLogisticOrderFinish(Long tradeOrderId) {
|
|
|
|
|
+ log.info("物流订单完结后服务费结算开始,订单ID:{}", tradeOrderId);
|
|
|
|
|
+ if (tradeOrderId == null) {
|
|
|
|
|
+ log.warn("物流订单完结后服务费结算跳过,订单ID为空");
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ KwoTradeOrder order = kwoTradeOrderMapper.selectOne(new LambdaQueryWrapper<KwoTradeOrder>()
|
|
|
|
|
+ .eq(KwoTradeOrder::getId, tradeOrderId)
|
|
|
|
|
+ .eq(KwoTradeOrder::getDelFlag, Global.UN_DELETED));
|
|
|
|
|
+ if (order == null) {
|
|
|
|
|
+ log.warn("物流订单完结后服务费结算跳过,未找到贸易订单,订单ID:{}", tradeOrderId);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ List<KwtLogisticsOrderVO> logisticOrderList;
|
|
|
|
|
+ try {
|
|
|
|
|
+ logisticOrderList = transportRemoteService.getLogisticOrderList(new OrderFinishParam(tradeOrderId));
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("物流订单完结后查询运单列表失败,订单ID:{}, 订单号:{}",
|
|
|
|
|
+ order.getId(), order.getTOrderNo(), e);
|
|
|
|
|
+ throw new BusinessException("物流订单完结后查询运单列表失败");
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!hasAllLogisticsOrdersCompleted(logisticOrderList)) {
|
|
|
|
|
+ log.info("物流订单尚未全部完成,服务费结算跳过,订单ID:{}, 订单号:{}, 运单数量:{}",
|
|
|
|
|
+ order.getId(), order.getTOrderNo(), CollUtil.size(logisticOrderList));
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ settleChargeStrategyIfApplied(order, logisticOrderList);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 判断贸易订单下是否存在运单且所有运单均已完成。
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param logisticOrderList 物流订单列表
|
|
|
|
|
+ * @return true-所有运单完成;false-无运单或存在未完成运单
|
|
|
|
|
+ */
|
|
|
|
|
+ static boolean hasAllLogisticsOrdersCompleted(List<KwtLogisticsOrderVO> logisticOrderList) {
|
|
|
|
|
+ return CollUtil.isNotEmpty(logisticOrderList)
|
|
|
|
|
+ && logisticOrderList.stream()
|
|
|
|
|
+ .allMatch(order -> order != null
|
|
|
|
|
+ && Objects.equals(order.getStatus(), LogisticsOrderV1Enum.COMPLETED.getCode()));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 贸易订单完结时,处理收费策略关联的服务费结算
|
|
* 贸易订单完结时,处理收费策略关联的服务费结算
|
|
|
* <p>
|
|
* <p>
|