|
@@ -249,15 +249,15 @@ public class ParkingWalletFeeService {
|
|
|
* <ol>
|
|
* <ol>
|
|
|
* <li>解冻:将下单时冻结的履约中金额(trading_amount)释放回可用余额(service_fee_balance),
|
|
* <li>解冻:将下单时冻结的履约中金额(trading_amount)释放回可用余额(service_fee_balance),
|
|
|
* 并写入 trade_type=5 的解冻明细(备注:订单完结解冻服务费)</li>
|
|
* 并写入 trade_type=5 的解冻明细(备注:订单完结解冻服务费)</li>
|
|
|
- * <li>扣减:按「实际履约量 × 收费策略单价」从可用余额中正式扣减服务费,
|
|
|
|
|
- * 并写入 trade_type=6 的消费明细(备注:订单完结扣减服务费)</li>
|
|
|
|
|
|
|
+ * <li>扣减:按「运输净重量 × 采购方当前最优收费策略单价」从可用余额中正式扣减服务费,
|
|
|
|
|
+ * 并写入 trade_type=6 的消费明细(备注含策略名称、单价描述、净重量)</li>
|
|
|
* </ol>
|
|
* </ol>
|
|
|
* 幂等:以 trade_type=6 的消费记录作为结算完成标识,重复调用直接返回当前余额。
|
|
* 幂等:以 trade_type=6 的消费记录作为结算完成标识,重复调用直接返回当前余额。
|
|
|
* <p>
|
|
* <p>
|
|
|
* 钱包状态变化示例(冻结50元,实际扣减40元):
|
|
* 钱包状态变化示例(冻结50元,实际扣减40元):
|
|
|
* 解冻前 balance=50, trading=50 → 解冻后 balance=100, trading=0 → 扣减后 balance=60, trading=0
|
|
* 解冻前 balance=50, trading=50 → 解冻后 balance=100, trading=0 → 扣减后 balance=60, trading=0
|
|
|
*
|
|
*
|
|
|
- * @param param 结算参数,需包含 orderNo、proEntId、actualQuantity、chargeStrategyId
|
|
|
|
|
|
|
+ * @param param 结算参数,需包含 orderNo、proEntId、actualQuantity(运输净重量)
|
|
|
* @return 结算结果,含实际扣减金额(freezeAmount字段)及扣减后服务费余额
|
|
* @return 结算结果,含实际扣减金额(freezeAmount字段)及扣减后服务费余额
|
|
|
*/
|
|
*/
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@@ -318,16 +318,19 @@ public class ParkingWalletFeeService {
|
|
|
walletFee.setTradingAmount(tradingBeforeSettle.subtract(freezeAmount));
|
|
walletFee.setTradingAmount(tradingBeforeSettle.subtract(freezeAmount));
|
|
|
log.info("完结解冻完成(内存态),orderNo:{}, unfreezeAmount:{}, balanceAfterUnfreeze:{}, tradingAfterUnfreeze:{}",
|
|
log.info("完结解冻完成(内存态),orderNo:{}, unfreezeAmount:{}, balanceAfterUnfreeze:{}, tradingAfterUnfreeze:{}",
|
|
|
param.getOrderNo(), freezeAmount, walletFee.getServiceFeeBalance(), walletFee.getTradingAmount());
|
|
param.getOrderNo(), freezeAmount, walletFee.getServiceFeeBalance(), walletFee.getTradingAmount());
|
|
|
- saveSettleUnfreezeWalletBalanceLog(param, walletFee, freezeAmount);
|
|
|
|
|
|
|
|
|
|
- // 第二步:按实际履约量计算应扣减服务费,并从可用余额中扣除
|
|
|
|
|
- BigDecimal consumeAmount = calculateSettleConsumeAmount(param, freezeAmount);
|
|
|
|
|
|
|
+ // 第二步:运输净重量 × 采购方当前最优收费策略单价 = 本次实际扣减服务费
|
|
|
|
|
+ SettleConsumeInfo consumeInfo = resolveSettleConsumeInfo(param, freezeAmount);
|
|
|
|
|
+ BigDecimal consumeAmount = consumeInfo.consumeAmount();
|
|
|
if (consumeAmount.compareTo(ZERO_AMOUNT) < 0) {
|
|
if (consumeAmount.compareTo(ZERO_AMOUNT) < 0) {
|
|
|
log.warn("服务费扣减金额计算异常,orderNo:{}, consumeAmount:{}", param.getOrderNo(), consumeAmount);
|
|
log.warn("服务费扣减金额计算异常,orderNo:{}, consumeAmount:{}", param.getOrderNo(), consumeAmount);
|
|
|
throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "服务费扣减金额异常,无法结算");
|
|
throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "服务费扣减金额异常,无法结算");
|
|
|
}
|
|
}
|
|
|
- log.info("服务费扣减金额计算完成,orderNo:{}, actualQuantity:{}, chargeStrategyId:{}, freezeAmount:{}, consumeAmount:{}",
|
|
|
|
|
- param.getOrderNo(), param.getActualQuantity(), param.getChargeStrategyId(), freezeAmount, consumeAmount);
|
|
|
|
|
|
|
+ log.info("服务费扣减金额计算完成,orderNo:{}, transportNetWeight:{}, strategyId:{}, strategyName:{}, strategyDesc:{}, freezeAmount:{}, consumeAmount:{}",
|
|
|
|
|
+ param.getOrderNo(), consumeInfo.transportNetWeight(), consumeInfo.strategyId(),
|
|
|
|
|
+ consumeInfo.strategyName(), consumeInfo.strategyDesc(), freezeAmount, consumeAmount);
|
|
|
|
|
+
|
|
|
|
|
+ saveSettleUnfreezeWalletBalanceLog(param, walletFee, freezeAmount, consumeInfo);
|
|
|
|
|
|
|
|
BigDecimal balanceAfterUnfreeze = walletFee.getServiceFeeBalance();
|
|
BigDecimal balanceAfterUnfreeze = walletFee.getServiceFeeBalance();
|
|
|
if (balanceAfterUnfreeze.compareTo(consumeAmount) < 0) {
|
|
if (balanceAfterUnfreeze.compareTo(consumeAmount) < 0) {
|
|
@@ -338,15 +341,33 @@ public class ParkingWalletFeeService {
|
|
|
walletFee.setServiceFeeBalance(balanceAfterUnfreeze.subtract(consumeAmount));
|
|
walletFee.setServiceFeeBalance(balanceAfterUnfreeze.subtract(consumeAmount));
|
|
|
parkingWalletFeeRepository.updateById(walletFee);
|
|
parkingWalletFeeRepository.updateById(walletFee);
|
|
|
|
|
|
|
|
- saveConsumeWalletBalanceLog(param, walletFee, consumeAmount);
|
|
|
|
|
|
|
+ saveConsumeWalletBalanceLog(param, walletFee, consumeInfo);
|
|
|
|
|
+ result.setChargeStrategyId(consumeInfo.strategyId());
|
|
|
|
|
+ result.setChargeStrategyDesc(consumeInfo.strategyDesc());
|
|
|
result.setFreezeAmount(consumeAmount);
|
|
result.setFreezeAmount(consumeAmount);
|
|
|
result.setServiceFeeBalance(walletFee.getServiceFeeBalance());
|
|
result.setServiceFeeBalance(walletFee.getServiceFeeBalance());
|
|
|
- log.info("贸易订单完结结算服务费完成,orderNo:{}, freezeAmount:{}, consumeAmount:{}, balanceBeforeSettle:{}, balanceAfterSettle:{}, tradingBeforeSettle:{}, tradingAfterSettle:{}",
|
|
|
|
|
- param.getOrderNo(), freezeAmount, consumeAmount,
|
|
|
|
|
|
|
+ log.info("贸易订单完结结算服务费完成,orderNo:{}, freezeAmount:{}, consumeAmount:{}, strategyDesc:{}, balanceBeforeSettle:{}, balanceAfterSettle:{}, tradingBeforeSettle:{}, tradingAfterSettle:{}",
|
|
|
|
|
+ param.getOrderNo(), freezeAmount, consumeAmount, consumeInfo.strategyDesc(),
|
|
|
balanceBeforeSettle, walletFee.getServiceFeeBalance(), tradingBeforeSettle, walletFee.getTradingAmount());
|
|
balanceBeforeSettle, walletFee.getServiceFeeBalance(), tradingBeforeSettle, walletFee.getTradingAmount());
|
|
|
return result;
|
|
return result;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 订单完结服务费扣减计算结果
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param consumeAmount 本次实际扣减服务费
|
|
|
|
|
+ * @param transportNetWeight 运输净重量
|
|
|
|
|
+ * @param strategyId 采用的收费策略id
|
|
|
|
|
+ * @param strategyName 采用的收费策略名称
|
|
|
|
|
+ * @param strategyDesc 收费策略单价描述,如10元/吨
|
|
|
|
|
+ */
|
|
|
|
|
+ private record SettleConsumeInfo(BigDecimal consumeAmount,
|
|
|
|
|
+ BigDecimal transportNetWeight,
|
|
|
|
|
+ Long strategyId,
|
|
|
|
|
+ String strategyName,
|
|
|
|
|
+ String strategyDesc) {
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 查询采购方服务费余额
|
|
* 查询采购方服务费余额
|
|
|
*/
|
|
*/
|
|
@@ -385,31 +406,54 @@ public class ParkingWalletFeeService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 计算订单完结时应扣减的服务费金额
|
|
|
|
|
|
|
+ * 解析订单完结服务费扣减信息
|
|
|
* <p>
|
|
* <p>
|
|
|
- * 优先按「实际履约量 × 收费策略单价」计算;若实际量或策略id缺失,则回退为下单冻结金额。
|
|
|
|
|
|
|
+ * 扣减金额 = 运输净重量 × 采购方当前最优收费策略单价;
|
|
|
|
|
+ * 最优策略:企业已绑定且开启的策略中,单价最低的一条(对采购方最优惠)。
|
|
|
|
|
+ * 若无法匹配策略,则回退为下单冻结金额。
|
|
|
*
|
|
*
|
|
|
- * @param param 结算参数
|
|
|
|
|
- * @param freezeAmount 下单时冻结金额(兜底扣减值)
|
|
|
|
|
- * @return 应扣减服务费,保留2位小数
|
|
|
|
|
|
|
+ * @param param 结算参数(actualQuantity 为运输净重量)
|
|
|
|
|
+ * @param freezeAmount 下单冻结金额(兜底扣减值)
|
|
|
|
|
+ * @return 扣减计算结果
|
|
|
|
|
+ */
|
|
|
|
|
+ private SettleConsumeInfo resolveSettleConsumeInfo(ParkingWalletFeeFreezeParam param, BigDecimal freezeAmount) {
|
|
|
|
|
+ BigDecimal transportNetWeight = param.getActualQuantity() == null ? ZERO_AMOUNT : param.getActualQuantity();
|
|
|
|
|
+ KwtParkingChargeStrategy strategy = queryOptimalEnableStrategy(param.getProEntId());
|
|
|
|
|
+ if (strategy == null && param.getChargeStrategyId() != null) {
|
|
|
|
|
+ strategy = parkingChangeStrategyRepository.getById(param.getChargeStrategyId());
|
|
|
|
|
+ log.info("未匹配到当前最优策略,回退使用订单关联策略,orderNo:{}, chargeStrategyId:{}",
|
|
|
|
|
+ param.getOrderNo(), param.getChargeStrategyId());
|
|
|
|
|
+ }
|
|
|
|
|
+ if (strategy == null || strategy.getMethod() == null
|
|
|
|
|
+ || strategy.getMethod().compareTo(ZERO_AMOUNT) <= 0) {
|
|
|
|
|
+ log.warn("收费策略无效,扣减金额按冻结金额处理,orderNo:{}, freezeAmount:{}", param.getOrderNo(), freezeAmount);
|
|
|
|
|
+ return new SettleConsumeInfo(freezeAmount, transportNetWeight, null, null, null);
|
|
|
|
|
+ }
|
|
|
|
|
+ String strategyDesc = buildStrategyMethodDesc(strategy);
|
|
|
|
|
+ BigDecimal consumeAmount = transportNetWeight.multiply(strategy.getMethod()).setScale(2, RoundingMode.HALF_UP);
|
|
|
|
|
+ log.info("按运输净重量×最优策略单价计算扣减,orderNo:{}, transportNetWeight:{}, strategyId:{}, strategyName:{}, unitFee:{}, consumeAmount:{}",
|
|
|
|
|
+ param.getOrderNo(), transportNetWeight, strategy.getId(), strategy.getStrategyName(),
|
|
|
|
|
+ strategy.getMethod(), consumeAmount);
|
|
|
|
|
+ return new SettleConsumeInfo(consumeAmount, transportNetWeight, strategy.getId(),
|
|
|
|
|
+ strategy.getStrategyName(), strategyDesc);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 构建完结结算钱包明细备注
|
|
|
*/
|
|
*/
|
|
|
- private BigDecimal calculateSettleConsumeAmount(ParkingWalletFeeFreezeParam param, BigDecimal freezeAmount) {
|
|
|
|
|
- if (param.getActualQuantity() == null || param.getChargeStrategyId() == null) {
|
|
|
|
|
- log.info("实际履约量或收费策略id为空,扣减金额按冻结金额处理,orderNo:{}, actualQuantity:{}, chargeStrategyId:{}, freezeAmount:{}",
|
|
|
|
|
- param.getOrderNo(), param.getActualQuantity(), param.getChargeStrategyId(), freezeAmount);
|
|
|
|
|
- return freezeAmount;
|
|
|
|
|
|
|
+ private String buildSettleWalletRemark(String actionDesc, ParkingWalletFeeFreezeParam param, SettleConsumeInfo consumeInfo) {
|
|
|
|
|
+ StringBuilder remark = new StringBuilder();
|
|
|
|
|
+ remark.append("订单").append(param.getOrderNo()).append(",").append(actionDesc);
|
|
|
|
|
+ if (consumeInfo.strategyName() != null) {
|
|
|
|
|
+ remark.append(",策略:").append(consumeInfo.strategyName());
|
|
|
}
|
|
}
|
|
|
- KwtParkingChargeStrategy strategy = parkingChangeStrategyRepository.getById(param.getChargeStrategyId());
|
|
|
|
|
- if (strategy == null || strategy.getMethod() == null) {
|
|
|
|
|
- log.warn("收费策略不存在或单价为空,扣减金额按冻结金额处理,orderNo:{}, chargeStrategyId:{}, freezeAmount:{}",
|
|
|
|
|
- param.getOrderNo(), param.getChargeStrategyId(), freezeAmount);
|
|
|
|
|
- return freezeAmount;
|
|
|
|
|
- }
|
|
|
|
|
- BigDecimal unitFee = strategy.getMethod();
|
|
|
|
|
- BigDecimal consumeAmount = param.getActualQuantity().multiply(unitFee).setScale(2, RoundingMode.HALF_UP);
|
|
|
|
|
- log.info("按实际履约量计算扣减金额,orderNo:{}, actualQuantity:{}, unitFee:{}, consumeAmount:{}",
|
|
|
|
|
- param.getOrderNo(), param.getActualQuantity(), unitFee, consumeAmount);
|
|
|
|
|
- return consumeAmount;
|
|
|
|
|
|
|
+ if (consumeInfo.strategyDesc() != null) {
|
|
|
|
|
+ remark.append(",").append(consumeInfo.strategyDesc());
|
|
|
|
|
+ }
|
|
|
|
|
+ if (consumeInfo.transportNetWeight() != null) {
|
|
|
|
|
+ remark.append(",净重").append(consumeInfo.transportNetWeight().stripTrailingZeros().toPlainString());
|
|
|
|
|
+ }
|
|
|
|
|
+ return remark.toString();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private boolean existsUnfreezeRecord(String orderNo, Long proEntId, Long supEntId) {
|
|
private boolean existsUnfreezeRecord(String orderNo, Long proEntId, Long supEntId) {
|
|
@@ -468,7 +512,8 @@ public class ParkingWalletFeeService {
|
|
|
*/
|
|
*/
|
|
|
private void saveSettleUnfreezeWalletBalanceLog(ParkingWalletFeeFreezeParam param,
|
|
private void saveSettleUnfreezeWalletBalanceLog(ParkingWalletFeeFreezeParam param,
|
|
|
KwtParkingWalletFee walletFee,
|
|
KwtParkingWalletFee walletFee,
|
|
|
- BigDecimal unfreezeAmount) {
|
|
|
|
|
|
|
+ BigDecimal unfreezeAmount,
|
|
|
|
|
+ SettleConsumeInfo consumeInfo) {
|
|
|
Long operatorId = resolveOperatorId(param.getOperatorId());
|
|
Long operatorId = resolveOperatorId(param.getOperatorId());
|
|
|
Date now = new Date();
|
|
Date now = new Date();
|
|
|
KwtParkingWalletFeeBalance balanceRecord = new KwtParkingWalletFeeBalance();
|
|
KwtParkingWalletFeeBalance balanceRecord = new KwtParkingWalletFeeBalance();
|
|
@@ -479,16 +524,16 @@ public class ParkingWalletFeeService {
|
|
|
balanceRecord.setTradeAmount(unfreezeAmount);
|
|
balanceRecord.setTradeAmount(unfreezeAmount);
|
|
|
balanceRecord.setServiceFeeBalance(walletFee.getServiceFeeBalance());
|
|
balanceRecord.setServiceFeeBalance(walletFee.getServiceFeeBalance());
|
|
|
balanceRecord.setTradingAmount(walletFee.getTradingAmount());
|
|
balanceRecord.setTradingAmount(walletFee.getTradingAmount());
|
|
|
- balanceRecord.setRemark("贸易订单号:" + param.getOrderNo() + ",订单完结解冻服务费");
|
|
|
|
|
|
|
+ balanceRecord.setRemark(buildSettleWalletRemark("完结解冻服务费", param, consumeInfo));
|
|
|
balanceRecord.setDelFlag(Global.NO);
|
|
balanceRecord.setDelFlag(Global.NO);
|
|
|
balanceRecord.setCreateUser(operatorId);
|
|
balanceRecord.setCreateUser(operatorId);
|
|
|
balanceRecord.setUpdateUser(operatorId);
|
|
balanceRecord.setUpdateUser(operatorId);
|
|
|
balanceRecord.setCreateTime(now);
|
|
balanceRecord.setCreateTime(now);
|
|
|
balanceRecord.setUpdateTime(now);
|
|
balanceRecord.setUpdateTime(now);
|
|
|
parkingWalletFeeBalanceRepository.save(balanceRecord);
|
|
parkingWalletFeeBalanceRepository.save(balanceRecord);
|
|
|
- log.info("服务费完结解冻明细已写入kwt_parking_wallet_fee_balance,orderNo:{}, proEntId:{}, supEntId:{}, tradeType:{}, tradeAmount:{}, balanceAfter:{}, tradingAfter:{}",
|
|
|
|
|
- param.getOrderNo(), param.getProEntId(), param.getSupEntId(), TRADE_TYPE_UNFREEZE,
|
|
|
|
|
- unfreezeAmount, walletFee.getServiceFeeBalance(), walletFee.getTradingAmount());
|
|
|
|
|
|
|
+ log.info("服务费完结解冻明细已写入kwt_parking_wallet_fee_balance,orderNo:{}, remark:{}, tradeAmount:{}, balanceAfter:{}, tradingAfter:{}",
|
|
|
|
|
+ param.getOrderNo(), balanceRecord.getRemark(), unfreezeAmount,
|
|
|
|
|
+ walletFee.getServiceFeeBalance(), walletFee.getTradingAmount());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -497,7 +542,7 @@ public class ParkingWalletFeeService {
|
|
|
*/
|
|
*/
|
|
|
private void saveConsumeWalletBalanceLog(ParkingWalletFeeFreezeParam param,
|
|
private void saveConsumeWalletBalanceLog(ParkingWalletFeeFreezeParam param,
|
|
|
KwtParkingWalletFee walletFee,
|
|
KwtParkingWalletFee walletFee,
|
|
|
- BigDecimal consumeAmount) {
|
|
|
|
|
|
|
+ SettleConsumeInfo consumeInfo) {
|
|
|
Long operatorId = resolveOperatorId(param.getOperatorId());
|
|
Long operatorId = resolveOperatorId(param.getOperatorId());
|
|
|
Date now = new Date();
|
|
Date now = new Date();
|
|
|
KwtParkingWalletFeeBalance balanceRecord = new KwtParkingWalletFeeBalance();
|
|
KwtParkingWalletFeeBalance balanceRecord = new KwtParkingWalletFeeBalance();
|
|
@@ -505,19 +550,19 @@ public class ParkingWalletFeeService {
|
|
|
balanceRecord.setProEntId(param.getProEntId());
|
|
balanceRecord.setProEntId(param.getProEntId());
|
|
|
balanceRecord.setSupEntId(param.getSupEntId());
|
|
balanceRecord.setSupEntId(param.getSupEntId());
|
|
|
balanceRecord.setTradeType(TRADE_TYPE_CONSUME);
|
|
balanceRecord.setTradeType(TRADE_TYPE_CONSUME);
|
|
|
- balanceRecord.setTradeAmount(consumeAmount);
|
|
|
|
|
|
|
+ balanceRecord.setTradeAmount(consumeInfo.consumeAmount());
|
|
|
balanceRecord.setServiceFeeBalance(walletFee.getServiceFeeBalance());
|
|
balanceRecord.setServiceFeeBalance(walletFee.getServiceFeeBalance());
|
|
|
balanceRecord.setTradingAmount(walletFee.getTradingAmount());
|
|
balanceRecord.setTradingAmount(walletFee.getTradingAmount());
|
|
|
- balanceRecord.setRemark("贸易订单号:" + param.getOrderNo() + ",订单完结扣减服务费");
|
|
|
|
|
|
|
+ balanceRecord.setRemark(buildSettleWalletRemark("完结扣减服务费", param, consumeInfo));
|
|
|
balanceRecord.setDelFlag(Global.NO);
|
|
balanceRecord.setDelFlag(Global.NO);
|
|
|
balanceRecord.setCreateUser(operatorId);
|
|
balanceRecord.setCreateUser(operatorId);
|
|
|
balanceRecord.setUpdateUser(operatorId);
|
|
balanceRecord.setUpdateUser(operatorId);
|
|
|
balanceRecord.setCreateTime(now);
|
|
balanceRecord.setCreateTime(now);
|
|
|
balanceRecord.setUpdateTime(now);
|
|
balanceRecord.setUpdateTime(now);
|
|
|
parkingWalletFeeBalanceRepository.save(balanceRecord);
|
|
parkingWalletFeeBalanceRepository.save(balanceRecord);
|
|
|
- log.info("服务费扣减明细已写入kwt_parking_wallet_fee_balance,orderNo:{}, proEntId:{}, supEntId:{}, tradeType:{}, tradeAmount:{}, balanceAfter:{}, tradingAfter:{}",
|
|
|
|
|
- param.getOrderNo(), param.getProEntId(), param.getSupEntId(), TRADE_TYPE_CONSUME,
|
|
|
|
|
- consumeAmount, walletFee.getServiceFeeBalance(), walletFee.getTradingAmount());
|
|
|
|
|
|
|
+ log.info("服务费扣减明细已写入kwt_parking_wallet_fee_balance,orderNo:{}, remark:{}, tradeAmount:{}, balanceAfter:{}, tradingAfter:{}",
|
|
|
|
|
+ param.getOrderNo(), balanceRecord.getRemark(), consumeInfo.consumeAmount(),
|
|
|
|
|
+ walletFee.getServiceFeeBalance(), walletFee.getTradingAmount());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private String buildStrategyMethodDesc(KwtParkingChargeStrategy strategy) {
|
|
private String buildStrategyMethodDesc(KwtParkingChargeStrategy strategy) {
|
|
@@ -607,13 +652,43 @@ public class ParkingWalletFeeService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 查询企业当前生效的收费策略
|
|
|
|
|
- * 逻辑:先查企业绑定的策略,再查策略详情,最后取“开启状态”且id最大(最新)的一条
|
|
|
|
|
|
|
+ * 查询企业当前生效的收费策略(开启状态中 id 最大的一条,用于下单冻结/预估)
|
|
|
*
|
|
*
|
|
|
* @param proEntId 采购企业id
|
|
* @param proEntId 采购企业id
|
|
|
* @return 生效策略;未匹配到则返回null
|
|
* @return 生效策略;未匹配到则返回null
|
|
|
*/
|
|
*/
|
|
|
private KwtParkingChargeStrategy queryCurrentEnableStrategy(Long proEntId) {
|
|
private KwtParkingChargeStrategy queryCurrentEnableStrategy(Long proEntId) {
|
|
|
|
|
+ KwtParkingChargeStrategy hitStrategy = listEnableStrategiesByProEntId(proEntId).stream()
|
|
|
|
|
+ .max(Comparator.comparing(KwtParkingChargeStrategy::getId))
|
|
|
|
|
+ .orElse(null);
|
|
|
|
|
+ log.info("匹配生效策略结果,proEntId:{}, hitStrategyId:{}",
|
|
|
|
|
+ proEntId, hitStrategy == null ? null : hitStrategy.getId());
|
|
|
|
|
+ return hitStrategy;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 查询采购方当前最优收费策略(开启状态中单价最低的一条,用于订单完结扣费)
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param proEntId 采购企业id
|
|
|
|
|
+ * @return 最优策略;未匹配到则返回null
|
|
|
|
|
+ */
|
|
|
|
|
+ private KwtParkingChargeStrategy queryOptimalEnableStrategy(Long proEntId) {
|
|
|
|
|
+ KwtParkingChargeStrategy optimalStrategy = listEnableStrategiesByProEntId(proEntId).stream()
|
|
|
|
|
+ .filter(item -> item.getMethod() != null && item.getMethod().compareTo(ZERO_AMOUNT) > 0)
|
|
|
|
|
+ .min(Comparator.comparing(KwtParkingChargeStrategy::getMethod)
|
|
|
|
|
+ .thenComparing(Comparator.comparing(KwtParkingChargeStrategy::getId).reversed()))
|
|
|
|
|
+ .orElse(null);
|
|
|
|
|
+ log.info("匹配最优收费策略结果,proEntId:{}, optimalStrategyId:{}, unitFee:{}",
|
|
|
|
|
+ proEntId,
|
|
|
|
|
+ optimalStrategy == null ? null : optimalStrategy.getId(),
|
|
|
|
|
+ optimalStrategy == null ? null : optimalStrategy.getMethod());
|
|
|
|
|
+ return optimalStrategy;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 查询企业已绑定且处于开启状态的收费策略列表
|
|
|
|
|
+ */
|
|
|
|
|
+ private List<KwtParkingChargeStrategy> listEnableStrategiesByProEntId(Long proEntId) {
|
|
|
List<KwtParkingChargeStrategyUnit> strategyUnitList = parkingChangeStrategyUnitRepository.list(
|
|
List<KwtParkingChargeStrategyUnit> strategyUnitList = parkingChangeStrategyUnitRepository.list(
|
|
|
Wrappers.<KwtParkingChargeStrategyUnit>lambdaQuery()
|
|
Wrappers.<KwtParkingChargeStrategyUnit>lambdaQuery()
|
|
|
.eq(KwtParkingChargeStrategyUnit::getEntId, proEntId)
|
|
.eq(KwtParkingChargeStrategyUnit::getEntId, proEntId)
|
|
@@ -623,17 +698,16 @@ public class ParkingWalletFeeService {
|
|
|
proEntId, strategyUnitList == null ? 0 : strategyUnitList.size());
|
|
proEntId, strategyUnitList == null ? 0 : strategyUnitList.size());
|
|
|
|
|
|
|
|
if (CollectionUtils.isEmpty(strategyUnitList)) {
|
|
if (CollectionUtils.isEmpty(strategyUnitList)) {
|
|
|
- log.info("企业未绑定任何策略,proEntId:{}, strategyUnitList:[]", proEntId);
|
|
|
|
|
- return null;
|
|
|
|
|
|
|
+ log.info("企业未绑定任何策略,proEntId:{}", proEntId);
|
|
|
|
|
+ return List.of();
|
|
|
}
|
|
}
|
|
|
List<Long> strategyIds = strategyUnitList.stream()
|
|
List<Long> strategyIds = strategyUnitList.stream()
|
|
|
.map(KwtParkingChargeStrategyUnit::getStrategyId)
|
|
.map(KwtParkingChargeStrategyUnit::getStrategyId)
|
|
|
.filter(Objects::nonNull)
|
|
.filter(Objects::nonNull)
|
|
|
.toList();
|
|
.toList();
|
|
|
- log.info("查询企业策略ID集合,proEntId:{}, strategyIds:{}", proEntId, strategyIds);
|
|
|
|
|
if (CollectionUtils.isEmpty(strategyIds)) {
|
|
if (CollectionUtils.isEmpty(strategyIds)) {
|
|
|
- log.info("企业绑定策略ID集合为空");
|
|
|
|
|
- return null;
|
|
|
|
|
|
|
+ log.info("企业绑定策略ID集合为空,proEntId:{}", proEntId);
|
|
|
|
|
+ return List.of();
|
|
|
}
|
|
}
|
|
|
List<KwtParkingChargeStrategy> strategyList = parkingChangeStrategyRepository.list(
|
|
List<KwtParkingChargeStrategy> strategyList = parkingChangeStrategyRepository.list(
|
|
|
Wrappers.<KwtParkingChargeStrategy>lambdaQuery()
|
|
Wrappers.<KwtParkingChargeStrategy>lambdaQuery()
|
|
@@ -641,18 +715,12 @@ public class ParkingWalletFeeService {
|
|
|
.eq(KwtParkingChargeStrategy::getDelFlag, Global.NO)
|
|
.eq(KwtParkingChargeStrategy::getDelFlag, Global.NO)
|
|
|
.orderByDesc(KwtParkingChargeStrategy::getId)
|
|
.orderByDesc(KwtParkingChargeStrategy::getId)
|
|
|
);
|
|
);
|
|
|
- log.info("查询策略详情完成,proEntId:{}, strategyCount:{}",
|
|
|
|
|
- proEntId, strategyList == null ? 0 : strategyList.size());
|
|
|
|
|
if (CollectionUtils.isEmpty(strategyList)) {
|
|
if (CollectionUtils.isEmpty(strategyList)) {
|
|
|
- return null;
|
|
|
|
|
|
|
+ return List.of();
|
|
|
}
|
|
}
|
|
|
- KwtParkingChargeStrategy hitStrategy = strategyList.stream()
|
|
|
|
|
|
|
+ return strategyList.stream()
|
|
|
.filter(item -> Objects.equals(item.getStatus(), STRATEGY_OPEN))
|
|
.filter(item -> Objects.equals(item.getStatus(), STRATEGY_OPEN))
|
|
|
- .max(Comparator.comparing(KwtParkingChargeStrategy::getId))
|
|
|
|
|
- .orElse(null);
|
|
|
|
|
- log.info("匹配生效策略结果,proEntId:{}, hitStrategyId:{}",
|
|
|
|
|
- proEntId, hitStrategy == null ? null : hitStrategy.getId());
|
|
|
|
|
- return hitStrategy;
|
|
|
|
|
|
|
+ .toList();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|