diff --git a/jsowell-admin/src/test/java/SpringBootTestController.java b/jsowell-admin/src/test/java/SpringBootTestController.java index 0be573fcd..39afe316f 100644 --- a/jsowell-admin/src/test/java/SpringBootTestController.java +++ b/jsowell-admin/src/test/java/SpringBootTestController.java @@ -292,6 +292,38 @@ public class SpringBootTestController { @Autowired private QcyunsService qcyunsService; + @Test + public void verifySplitConfigTest() { + List stationSplitConfigList = Lists.newArrayList(); + + stationSplitConfigList.add(StationSplitConfig.builder() + .adapayMemberId("adapayMemberId1") + .stationId("stationId1") + .merchantId("merchantId1") + .feeFlag(Constants.ONE) + .createBy(Constants.SYSTEM) + .createTime(DateUtils.getNowDate()) + .delFlag(DelFlagEnum.NORMAL.getValue()) + .electricitySplitRatio(new BigDecimal("50")) + .serviceSplitRatio(new BigDecimal("50")) + .build()); + + + stationSplitConfigList.add(StationSplitConfig.builder() + .adapayMemberId("adapayMemberId2") + .stationId("stationId2") + .merchantId("merchantId2") + .feeFlag(Constants.ZERO) + .createBy(Constants.SYSTEM) + .createTime(DateUtils.getNowDate()) + .delFlag(DelFlagEnum.NORMAL.getValue()) + .electricitySplitRatio(new BigDecimal("50")) + .serviceSplitRatio(new BigDecimal("50")) + .build()); + + stationSplitConfigService.verifySplitConfig(stationSplitConfigList); + } + @Test public void selectAutoWithdrawalMerchantInfoListTest() { List pileMerchantInfos = pileMerchantInfoService.selectAutoWithdrawalMerchantInfoList(); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/StationSplitConfigService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/StationSplitConfigService.java index 03eb3805a..40e5095e4 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/StationSplitConfigService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/StationSplitConfigService.java @@ -15,6 +15,13 @@ public interface StationSplitConfigService { // 插入站点分账配置信息 int settingSplitConfig(SplitConfigDTO splitConfigDTO); + /** + * 校验站点分账配置信息 + * @param stationSplitConfigList 站点分账配置信息 + * @return true: 通过校验, false: 未通过校验 + */ + boolean verifySplitConfig(List stationSplitConfigList); + // 根据站点id查询站点分账配置信息 List queryByStationId(String stationId); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index d4877e2fa..bb4a8254b 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -1988,27 +1988,36 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { */ private PaymentConfirmResponse splittingMethod(AfterSettleOrderDTO afterSettleOrderDTO) { // 结算金额 - BigDecimal orderSettleAmount = afterSettleOrderDTO.getOrderSettleAmount() == null ? BigDecimal.ZERO : afterSettleOrderDTO.getOrderSettleAmount(); + BigDecimal orderSettleAmount = afterSettleOrderDTO.getOrderSettleAmount(); + + // 站点id + String stationId = afterSettleOrderDTO.getStationId(); + + // 订单编号 + String orderCode = afterSettleOrderDTO.getOrderCode(); + // 订单是否需要分账, 结算金额必须大于0 - if (orderSettleAmount.compareTo(BigDecimal.ZERO) <= 0) { + if (orderSettleAmount == null || orderSettleAmount.compareTo(BigDecimal.ZERO) <= 0) { logger.info("realTimeOrderSplit-订单[{}]结算金额[{}]必须大于0", afterSettleOrderDTO.getOrderCode(), orderSettleAmount); return null; } + + // 校验分账 verifyOrderAllAmount(afterSettleOrderDTO); // 根据站点id查询分账配置(如果未配置则初始化) - List stationSplitConfigList = stationSplitConfigService.queryByStationIdWithInit(afterSettleOrderDTO.getStationId()); + List stationSplitConfigList = stationSplitConfigService.queryByStationIdWithInit(stationId); // 计算每个参与分账的用户, 应分多少钱 List splitDataList = calculationSplitDataList(stationSplitConfigList, afterSettleOrderDTO); List divMemberList = transformDivMemberList(splitDataList); // List divMemberList = calculationOfSplitAmount(stationSplitConfigList, afterSettleOrderDTO); - logger.info("realTimeOrderSplit-订单:{}, 分账信息:{}", afterSettleOrderDTO.getOrderCode(), JSON.toJSONString(splitDataList)); + logger.info("realTimeOrderSplit-订单:{}, 分账信息:{}", orderCode, JSON.toJSONString(splitDataList)); // 执行分账 if (CollectionUtils.isEmpty(divMemberList)) { - logger.info("realTimeOrderSplit-订单[{}]分账信息为空", afterSettleOrderDTO.getOrderCode()); + logger.info("realTimeOrderSplit-订单[{}]分账信息为空", orderCode); return null; } - String orderCode = afterSettleOrderDTO.getOrderCode(); + // 查询订单支付记录 List orderPayRecordList = orderPayRecordService.getOrderPayRecordList(orderCode); // 选出需要分账的支付id @@ -2049,11 +2058,10 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { @Override public List calculationSplitDataList(List stationSplitConfigList, AfterSettleOrderDTO afterSettleOrderDTO) { List resultList = Lists.newArrayList(); - BigDecimal totalElecSplitRatio = stationSplitConfigList.stream().map(StationSplitConfig::getElectricitySplitRatio).reduce(BigDecimal.ZERO, BigDecimal::add); - BigDecimal totalServiceSplitRatio = stationSplitConfigList.stream().map(StationSplitConfig::getServiceSplitRatio).reduce(BigDecimal.ZERO, BigDecimal::add); + // totalElecSplitRatio和totalServiceSplitRatio 都等于100%, 才进行后续操作 - if (totalElecSplitRatio.compareTo(BigDecimal.valueOf(100)) != 0 || totalServiceSplitRatio.compareTo(BigDecimal.valueOf(100)) != 0) { - logger.info("站点:{}, 分成配置中的电费分成比例相加必须为100.0%, 实际值:{}, 服务费分成比例相加必须为100.0%, 实际值:{}", stationSplitConfigList.get(0).getStationId(), totalElecSplitRatio, totalServiceSplitRatio); + boolean verifySplitConfig = stationSplitConfigService.verifySplitConfig(stationSplitConfigList); + if (!verifySplitConfig) { return resultList; } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/StationSplitConfigServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/StationSplitConfigServiceImpl.java index ee35370c8..98531dce5 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/StationSplitConfigServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/StationSplitConfigServiceImpl.java @@ -19,6 +19,7 @@ import com.jsowell.pile.service.AdapayMemberAccountService; import com.jsowell.pile.service.StationSplitConfigService; import com.jsowell.pile.vo.web.ShareMemberVO; import com.jsowell.pile.vo.web.SplitConfigVO; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -29,6 +30,7 @@ import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; +@Slf4j @Service public class StationSplitConfigServiceImpl implements StationSplitConfigService{ @@ -265,4 +267,23 @@ public class StationSplitConfigServiceImpl implements StationSplitConfigService{ } return stationSplitConfigMapper.batchInsert(splitConfigList); } + + @Override + public boolean verifySplitConfig(List stationSplitConfigList) { + BigDecimal totalElecSplitRatio = stationSplitConfigList.stream().map(StationSplitConfig::getElectricitySplitRatio).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal totalServiceSplitRatio = stationSplitConfigList.stream().map(StationSplitConfig::getServiceSplitRatio).reduce(BigDecimal.ZERO, BigDecimal::add); + + // totalElecSplitRatio和totalServiceSplitRatio 都等于100%, 才进行后续操作 + if (totalElecSplitRatio.compareTo(BigDecimal.valueOf(100)) != 0 || totalServiceSplitRatio.compareTo(BigDecimal.valueOf(100)) != 0) { + log.info("站点:{}, 分成配置中的电费分成比例相加必须为100.0%, 实际值:{}, 服务费分成比例相加必须为100.0%, 实际值:{}", stationSplitConfigList.get(0).getStationId(), totalElecSplitRatio, totalServiceSplitRatio); + return false; + } + + // 有且仅有一位手续费承担方 + if (stationSplitConfigList.stream().filter(stationSplitConfig -> Constants.ONE.equals(stationSplitConfig.getFeeFlag())).count() != 1) { + log.info("站点:{}, 分成配置中, 手续费承担方设置错误, 有且只能有1位手续费承担方", stationSplitConfigList.get(0).getStationId()); + return false; + } + return true; + } }