校验站点分润配置, 提出一个方法

This commit is contained in:
Guoqs
2025-04-03 17:00:00 +08:00
parent 539807faaf
commit 1a7c88c09a
4 changed files with 78 additions and 10 deletions

View File

@@ -15,6 +15,13 @@ public interface StationSplitConfigService {
// 插入站点分账配置信息
int settingSplitConfig(SplitConfigDTO splitConfigDTO);
/**
* 校验站点分账配置信息
* @param stationSplitConfigList 站点分账配置信息
* @return true: 通过校验, false: 未通过校验
*/
boolean verifySplitConfig(List<StationSplitConfig> stationSplitConfigList);
// 根据站点id查询站点分账配置信息
List<StationSplitConfig> queryByStationId(String stationId);

View File

@@ -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<StationSplitConfig> stationSplitConfigList = stationSplitConfigService.queryByStationIdWithInit(afterSettleOrderDTO.getStationId());
List<StationSplitConfig> stationSplitConfigList = stationSplitConfigService.queryByStationIdWithInit(stationId);
// 计算每个参与分账的用户, 应分多少钱
List<SplitData> splitDataList = calculationSplitDataList(stationSplitConfigList, afterSettleOrderDTO);
List<DivMember> divMemberList = transformDivMemberList(splitDataList);
// List<DivMember> 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<OrderPayRecord> orderPayRecordList = orderPayRecordService.getOrderPayRecordList(orderCode);
// 选出需要分账的支付id
@@ -2049,11 +2058,10 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
@Override
public List<SplitData> calculationSplitDataList(List<StationSplitConfig> stationSplitConfigList, AfterSettleOrderDTO afterSettleOrderDTO) {
List<SplitData> 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;
}

View File

@@ -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<StationSplitConfig> 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;
}
}