mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-04-20 11:05:18 +08:00
update 新分账方法
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
package com.jsowell.adapay.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* 订单分账数据
|
||||
*/
|
||||
@Data
|
||||
public class SplitData {
|
||||
// 分账用户 Member对象 的 id;若是商户本身时,传入0
|
||||
private String memberId;
|
||||
|
||||
// 分账金额,精确到分,如0.50,1.00等,分账总金额必须等于主交易金额,金额不能为0.00
|
||||
private String amount;
|
||||
|
||||
// 是否手续费承担方,N-否,Y-是,手续费承担方有且只能有一个
|
||||
private String feeFlag;
|
||||
|
||||
// 控制台 主页面应用的app_id,不上送默认取商户自身app_id
|
||||
private String appId;
|
||||
|
||||
/**
|
||||
* 电费分账比例
|
||||
*/
|
||||
private BigDecimal elecRatio;
|
||||
|
||||
/**
|
||||
* 电费分账金额
|
||||
*/
|
||||
private BigDecimal elecAmount;
|
||||
|
||||
/**
|
||||
* 服务费分账比例
|
||||
*/
|
||||
private BigDecimal serviceRatio;
|
||||
|
||||
/**
|
||||
* 服务费分账金额
|
||||
*/
|
||||
private BigDecimal serviceAmount;
|
||||
}
|
||||
@@ -2,6 +2,7 @@ package com.jsowell.pile.service;
|
||||
|
||||
import com.huifu.adapay.core.exception.BaseAdaPayException;
|
||||
import com.jsowell.adapay.common.DivMember;
|
||||
import com.jsowell.adapay.dto.SplitData;
|
||||
import com.jsowell.adapay.response.PaymentReverseResponse;
|
||||
import com.jsowell.adapay.vo.OrderSplitResult;
|
||||
import com.jsowell.adapay.vo.PaymentInfo;
|
||||
@@ -206,6 +207,8 @@ public interface OrderBasicInfoService{
|
||||
|
||||
OrderSplitResult realTimeOrderSplit(AfterSettleOrderDTO afterSettleOrderDTO) throws BaseAdaPayException;
|
||||
|
||||
List<SplitData> calculationSplitDataList(List<StationSplitConfig> stationSplitConfigList, AfterSettleOrderDTO afterSettleOrderDTO);
|
||||
|
||||
List<DivMember> calculationOfSplitAmount(List<StationSplitConfig> stationSplitConfigList, AfterSettleOrderDTO afterSettleOrderDTO);
|
||||
|
||||
List<DivMember> calculationOfSplitAmount(List<StationSplitConfig> stationSplitConfigList, AfterSettleOrderDTO afterSettleOrderDTO, List<PaymentInfo> paymentInfos);
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package com.jsowell.pile.service;
|
||||
|
||||
import com.jsowell.adapay.dto.PaymentConfirmParam;
|
||||
import com.jsowell.adapay.dto.SplitData;
|
||||
import com.jsowell.pile.domain.OrderSplitRecord;
|
||||
|
||||
import java.util.List;
|
||||
@@ -21,5 +23,10 @@ public interface OrderSplitRecordService {
|
||||
int updateBatchSelective(List<OrderSplitRecord> list);
|
||||
|
||||
int batchInsert(List<OrderSplitRecord> list);
|
||||
|
||||
/**
|
||||
* 保存订单分账记录
|
||||
*/
|
||||
void saveOrderSplitRecord(PaymentConfirmParam param, String id, List<SplitData> stationSplitConfigList);
|
||||
}
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ import com.jsowell.adapay.dto.PaymentConfirmParam;
|
||||
import com.jsowell.adapay.common.PaymentConfirmInfo;
|
||||
import com.jsowell.adapay.dto.QueryConfirmReverseDTO;
|
||||
import com.jsowell.adapay.dto.QueryPaymentConfirmDTO;
|
||||
import com.jsowell.adapay.dto.SplitData;
|
||||
import com.jsowell.adapay.operation.PaymentReverseOperation;
|
||||
import com.jsowell.adapay.response.*;
|
||||
import com.jsowell.adapay.service.AdapayService;
|
||||
@@ -190,6 +191,9 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
|
||||
@Autowired
|
||||
private StationSplitConfigService stationSplitConfigService;
|
||||
|
||||
@Autowired
|
||||
private OrderSplitRecordService orderSplitRecordService;
|
||||
|
||||
@Override
|
||||
public int deleteByPrimaryKey(Integer id) {
|
||||
return orderBasicInfoMapper.deleteByPrimaryKey(id);
|
||||
@@ -1734,7 +1738,9 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
|
||||
List<StationSplitConfig> stationSplitConfigList = stationSplitConfigService.queryByStationId(afterSettleOrderDTO.getStationId());
|
||||
|
||||
// 计算每个参与分账的用户, 应分多少钱
|
||||
List<DivMember> divMemberList = calculationOfSplitAmount(stationSplitConfigList, afterSettleOrderDTO);
|
||||
List<SplitData> splitDataList = calculationSplitDataList(stationSplitConfigList, afterSettleOrderDTO);
|
||||
List<DivMember> divMemberList = transformDivMemberList(splitDataList);
|
||||
// List<DivMember> divMemberList = calculationOfSplitAmount(stationSplitConfigList, afterSettleOrderDTO);
|
||||
|
||||
// 执行分账
|
||||
if (CollectionUtils.isEmpty(divMemberList)) {
|
||||
@@ -1776,9 +1782,101 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
|
||||
.wechatAppId(appId)
|
||||
.build();
|
||||
PaymentConfirmResponse paymentConfirmRequest = adapayService.createPaymentConfirmRequest(param);
|
||||
|
||||
// 保存订单分账记录
|
||||
orderSplitRecordService.saveOrderSplitRecord(param, paymentConfirmRequest.getId(), splitDataList);
|
||||
|
||||
return paymentConfirmRequest;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算每个账户需要分账的金额
|
||||
* @param stationSplitConfigList 参与分账的账户信息
|
||||
* @param afterSettleOrderDTO 订单结算信息
|
||||
* @return
|
||||
*/
|
||||
@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);
|
||||
return resultList;
|
||||
}
|
||||
|
||||
// 需要分成的电费金额 = 总电费金额 - 电费优惠金额
|
||||
BigDecimal orderElectricityAmount = afterSettleOrderDTO.getOrderElectricityAmount().subtract(afterSettleOrderDTO.getOrderElectricityDiscountAmount());
|
||||
// 需要分成的服务费金额 = 总服务费金额 - 服务费优惠金额
|
||||
BigDecimal orderServiceAmount = afterSettleOrderDTO.getOrderServiceAmount().subtract(afterSettleOrderDTO.getOrderServiceDiscountAmount());
|
||||
// 校验 结算金额 = 需要分成的电费金额 + 需要分成的服务费金额
|
||||
if (orderElectricityAmount.add(orderServiceAmount).compareTo(afterSettleOrderDTO.getOrderSettleAmount()) != 0) {
|
||||
logger.info("订单结算金额:{}与需要分成的电费金额:{}+需要分成的服务费金额:{}不相等", afterSettleOrderDTO.getOrderSettleAmount(), orderElectricityAmount, orderServiceAmount);
|
||||
return resultList;
|
||||
}
|
||||
|
||||
// 定义两个变量, 分别保存剩余电费金额, 剩余服务费金额, 原始值需要分成的金额相等, 分账后减去响应金额, 最后剩余的金额分给手续费承担者
|
||||
BigDecimal remainElectricityAmount = orderElectricityAmount;
|
||||
BigDecimal remainServiceAmount = orderServiceAmount;
|
||||
for (StationSplitConfig stationSplitConfig : stationSplitConfigList) {
|
||||
BigDecimal electricitySplitRatio = stationSplitConfig.getElectricitySplitRatio();
|
||||
BigDecimal serviceSplitRatio = stationSplitConfig.getServiceSplitRatio();
|
||||
SplitData splitData = new SplitData();
|
||||
splitData.setMemberId(stationSplitConfig.getAdapayMemberId());
|
||||
splitData.setElecRatio(electricitySplitRatio);
|
||||
splitData.setServiceRatio(serviceSplitRatio);
|
||||
if (stationSplitConfig.getFeeFlag().equals(Constants.ZERO)) {
|
||||
// 该用户分到的电费金额 保留两位小数, 后面的舍弃
|
||||
BigDecimal elecAmt = electricitySplitRatio.divide(BigDecimal.valueOf(100)).multiply(orderElectricityAmount).setScale(2, RoundingMode.DOWN);
|
||||
splitData.setElecAmount(elecAmt);
|
||||
remainElectricityAmount = remainElectricityAmount.subtract(elecAmt);
|
||||
// 该用户分到的服务费金额
|
||||
BigDecimal servAmt = serviceSplitRatio.divide(BigDecimal.valueOf(100)).multiply(orderServiceAmount).setScale(2, RoundingMode.DOWN);
|
||||
splitData.setServiceAmount(servAmt);
|
||||
remainServiceAmount = remainServiceAmount.subtract(servAmt);
|
||||
splitData.setAmount(AdapayUtil.formatAmount(elecAmt.add(servAmt)));
|
||||
} else {
|
||||
// 最后剩余的金额分给手续费承担者
|
||||
splitData.setElecAmount(remainElectricityAmount);
|
||||
splitData.setServiceAmount(remainServiceAmount);
|
||||
splitData.setAmount(AdapayUtil.formatAmount(remainElectricityAmount.add(remainServiceAmount)));
|
||||
}
|
||||
splitData.setFeeFlag(StringUtils.equals(Constants.ONE, stationSplitConfig.getFeeFlag()) ? Constants.Y : Constants.N);
|
||||
resultList.add(splitData);
|
||||
}
|
||||
|
||||
// 所有用户电费分账之和
|
||||
BigDecimal totalAmt = resultList.stream().map(SplitData::getAmount).map(BigDecimal::new).reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
if ((totalAmt).compareTo(afterSettleOrderDTO.getOrderSettleAmount()) != 0 ) {
|
||||
logger.info("订单结算金额:{}, 与分账后所有用户分到金额总和:{}不相等", afterSettleOrderDTO.getOrderSettleAmount(), totalAmt);
|
||||
return resultList;
|
||||
}
|
||||
|
||||
return resultList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换分账对象
|
||||
* @param list
|
||||
* @return
|
||||
*/
|
||||
private List<DivMember> transformDivMemberList(List<SplitData> list) {
|
||||
List<DivMember> resultList = Lists.newArrayList();
|
||||
if (CollectionUtils.isEmpty(list)) {
|
||||
return resultList;
|
||||
}
|
||||
for (SplitData splitData : list) {
|
||||
DivMember divMember = new DivMember();
|
||||
divMember.setMemberId(splitData.getMemberId());
|
||||
divMember.setAmount(splitData.getAmount());
|
||||
divMember.setFeeFlag(splitData.getFeeFlag());
|
||||
divMember.setAppId(splitData.getAppId());
|
||||
resultList.add(divMember);
|
||||
}
|
||||
return resultList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算每个账户需要分账的金额
|
||||
* @param stationSplitConfigList 参与分账的账户信息
|
||||
|
||||
@@ -1,11 +1,16 @@
|
||||
package com.jsowell.pile.service.impl;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.jsowell.adapay.dto.PaymentConfirmParam;
|
||||
import com.jsowell.adapay.dto.SplitData;
|
||||
import com.jsowell.common.enums.DelFlagEnum;
|
||||
import com.jsowell.pile.domain.OrderSplitRecord;
|
||||
import com.jsowell.pile.mapper.OrderSplitRecordMapper;
|
||||
import com.jsowell.pile.service.OrderSplitRecordService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
@@ -53,5 +58,49 @@ public class OrderSplitRecordServiceImpl implements OrderSplitRecordService {
|
||||
public int batchInsert(List<OrderSplitRecord> list) {
|
||||
return orderSplitRecordMapper.batchInsert(list);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveOrderSplitRecord(PaymentConfirmParam param, String paymentConfirmId, List<SplitData> splitDataList) {
|
||||
List<OrderSplitRecord> list = Lists.newArrayList();
|
||||
|
||||
String orderCode = param.getOrderCode();
|
||||
BigDecimal settleAmount = param.getConfirmAmt();
|
||||
String paymentId = param.getPaymentId();
|
||||
// List<DivMember> divMemberList = param.getDivMemberList();
|
||||
// for (DivMember divMember : divMemberList) {
|
||||
// OrderSplitRecord orderSplitRecord = new OrderSplitRecord();
|
||||
// orderSplitRecord.setOrderCode(orderCode);
|
||||
// orderSplitRecord.setStatus("");
|
||||
// orderSplitRecord.setSettleAmount(settleAmount);
|
||||
// orderSplitRecord.setAdapayMemberId(divMember.getMemberId());
|
||||
// orderSplitRecord.setPaymentId(paymentId);
|
||||
// orderSplitRecord.setPaymentConfirmId(paymentConfirmId);
|
||||
// // orderSplitRecord.setElectricitySplitRatio(divMember.getElectricitySplitRatio());
|
||||
// // orderSplitRecord.setElectricitySplitAmount(divMember.getElectricitySplitAmount());
|
||||
// // orderSplitRecord.setServiceSplitRatio(divMember.getServiceSplitRatio());
|
||||
// // orderSplitRecord.setServiceSplitAmount(divMember.getServiceSplitAmount());
|
||||
// orderSplitRecord.setRemark("");
|
||||
// orderSplitRecord.setDelFlag(DelFlagEnum.NORMAL.getValue());
|
||||
// list.add(orderSplitRecord);
|
||||
// }
|
||||
|
||||
for (SplitData splitData : splitDataList) {
|
||||
OrderSplitRecord orderSplitRecord = new OrderSplitRecord();
|
||||
orderSplitRecord.setOrderCode(orderCode);
|
||||
orderSplitRecord.setStatus("");
|
||||
orderSplitRecord.setSettleAmount(settleAmount);
|
||||
orderSplitRecord.setAdapayMemberId(splitData.getMemberId());
|
||||
orderSplitRecord.setPaymentId(paymentId);
|
||||
orderSplitRecord.setPaymentConfirmId(paymentConfirmId);
|
||||
orderSplitRecord.setElectricitySplitRatio(splitData.getElecRatio());
|
||||
orderSplitRecord.setElectricitySplitAmount(splitData.getElecAmount());
|
||||
orderSplitRecord.setServiceSplitRatio(splitData.getServiceRatio());
|
||||
orderSplitRecord.setServiceSplitAmount(splitData.getServiceAmount());
|
||||
orderSplitRecord.setRemark("");
|
||||
orderSplitRecord.setDelFlag(DelFlagEnum.NORMAL.getValue());
|
||||
list.add(orderSplitRecord);
|
||||
}
|
||||
this.batchInsert(list);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user