检查订单分账记录

This commit is contained in:
Guoqs
2025-10-11 15:29:29 +08:00
parent da5664b7bf
commit 17873f5405
6 changed files with 275 additions and 94 deletions

View File

@@ -618,4 +618,6 @@ public interface OrderBasicInfoService{
* @return
*/
List<OrderPaymentDetailVO> getSplitOrders(QueryOrderSplitRecordDTO dto);
void checkOrUpdateOrderSplitRecord(AfterSettleOrderDTO afterSettleOrderDTO);
}

View File

@@ -46,7 +46,21 @@ public interface OrderSplitRecordService {
*/
void saveOrderSplitRecord(PaymentConfirmParam param, PaymentConfirmResponse response, List<SplitData> stationSplitConfigList, OrderInfoDetailVO orderInfoDetailVO);
void saveOrderSplitRecordTemp(PaymentConfirmParam param, PaymentConfirmInfo response, List<SplitData> splitDataList, OrderInfoDetailVO orderInfoDetailVO);
/**
* 批量保存订单分账记录
*/
void saveOrderSplitRecord(PaymentConfirmParam param, PaymentConfirmInfo response, List<SplitData> splitDataList, OrderInfoDetailVO orderInfoDetailVO);
/**
* 生成订单分账记录
* 用于对比使用
* @param param
* @param response
* @param splitDataList
* @param orderInfoDetailVO
* @return
*/
List<OrderSplitRecord> generatedOrderSplitRecordList(PaymentConfirmParam param, PaymentConfirmInfo response, List<SplitData> splitDataList, OrderInfoDetailVO orderInfoDetailVO);
List<OrderSplitRecordVO> selectByOrderCode(String orderCode);
@@ -124,5 +138,10 @@ public interface OrderSplitRecordService {
* @return
*/
int deleteOrderSplitRecord(String orderCode);
/**
* 根据订单号查询订单分账记录
*/
List<OrderSplitRecord> queryOrderSplitRecordByOrderCode(String orderCode);
}

View File

@@ -2195,7 +2195,7 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
}
/**
* 此方法只用来更新OrderSplitRecord
* 此方法只用来更新OrderSplitRecord,这个方法不管是否一致都会更新,新方法正在开发,后面换成新方法
* @param afterSettleOrderDTO
* @return
*/
@@ -2285,7 +2285,7 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
orderSplitRecordService.deleteOrderSplitRecord(orderCode);
// 保存订单分账记录
OrderInfoDetailVO orderInfoDetailVO = getOrderInfoDetailVO(orderCode);
orderSplitRecordService.saveOrderSplitRecordTemp(param, paymentConfirmInfo, splitDataList, orderInfoDetailVO);
orderSplitRecordService.saveOrderSplitRecord(param, paymentConfirmInfo, splitDataList, orderInfoDetailVO);
return null;
}
@@ -5758,5 +5758,99 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
dto.setEndTime(DateUtils.parseToEndOfDay(dto.getEndTime()));
return orderBasicInfoMapper.getSplitOrders(dto);
}
/**
* 校验或更新订单分账信息
* 此方法重新生成订单分账记录,与数据库中记录对比,如果不一致,则更新
*/
@Override
public void checkOrUpdateOrderSplitRecord(AfterSettleOrderDTO afterSettleOrderDTO) {
logger.info("处理OrderSplitRecord中值为0的数据, orderCode:{}, 分账金额:{}",
afterSettleOrderDTO.getOrderCode(), afterSettleOrderDTO.getOrderSettleAmount());
// 结算金额
BigDecimal orderSettleAmount = afterSettleOrderDTO.getOrderSettleAmount();
// 站点id
String stationId = afterSettleOrderDTO.getStationId();
// 订单编号
String orderCode = afterSettleOrderDTO.getOrderCode();
// 订单信息
OrderBasicInfo orderBasicInfo = afterSettleOrderDTO.getOrderBasicInfo();
// 保险金额(有默认值 0.00
BigDecimal insuranceAmount = orderBasicInfo.getInsuranceAmount();
// 订单是否需要分账, 结算金额必须大于0
if (orderSettleAmount == null || orderSettleAmount.compareTo(BigDecimal.ZERO) <= 0) {
logger.info("realTimeOrderSplit-订单[{}]结算金额[{}]必须大于0", afterSettleOrderDTO.getOrderCode(), orderSettleAmount);
return;
}
// 获取订单待分账信息
List<PaymentInfo> paymentInfos = getOrderPaymentInfoList(afterSettleOrderDTO);
if (CollectionUtils.isEmpty(paymentInfos)) {
logger.info("realTimeOrderSplit-订单[{}]没有待分账的支付记录", afterSettleOrderDTO.getOrderCode());
return;
}
// 根据站点id查询分账配置(如果未配置则初始化)
List<StationSplitConfig> stationSplitConfigList = stationSplitConfigService.queryByStationIdWithInit(stationId);
// 查字典是否开启收取平台支持服务费 1-开启; 0-关闭
String dictValue = DictUtils.getDictValue("platform_service_flag", "status");
if (StringUtils.equals(dictValue, Constants.ONE)) {
// 开启收取平台支持服务费, 更新参与分账的账户列表
updateSplitConfigList(stationId, stationSplitConfigList, orderCode);
}
// 计算每个参与分账的用户, 应分多少钱
List<SplitData> splitDataList = calculationSplitDataList(stationSplitConfigList, afterSettleOrderDTO);
List<DivMember> divMemberList = transformDivMemberList(splitDataList);
logger.info("realTimeOrderSplit-订单:{}, 分账信息:{}", orderCode, JSON.toJSONString(splitDataList));
// 执行分账
if (CollectionUtils.isEmpty(divMemberList)) {
logger.info("realTimeOrderSplit-订单[{}]分账信息为空", orderCode);
return;
}
String paymentId = paymentInfos.get(0).getPaymentId(); // 支付id
String merchantId = afterSettleOrderDTO.getMerchantId(); // 运营商id
// 根据运营商id 查询appId
String appId = pileMerchantInfoService.queryAppIdByMerchantId(merchantId);
PaymentConfirmParam param = PaymentConfirmParam.builder()
.paymentId(paymentId)
.divMemberList(divMemberList)
.confirmAmt(orderSettleAmount.add(insuranceAmount)) // 订单结算金额 + 保险金额
.orderCode(orderCode)
.wechatAppId(appId)
.build();
// PaymentConfirmResponse paymentConfirmRequest = adapayService.createPaymentConfirmRequest(param);
// 查询支付确认id
QueryPaymentConfirmDTO queryPaymentConfirmDTO = new QueryPaymentConfirmDTO();
queryPaymentConfirmDTO.setPaymentId(paymentId);
queryPaymentConfirmDTO.setWechatAppId(Constants.DEFAULT_APP_ID);
QueryPaymentConfirmDetailResponse response = adapayService.queryPaymentConfirmList(queryPaymentConfirmDTO);
String paymentConfirmId = response.getPaymentConfirms().get(0).getId();
// 查询支付确认id
QueryPaymentConfirmDTO dto = new QueryPaymentConfirmDTO();
dto.setPaymentConfirmId(paymentConfirmId);
dto.setWechatAppId(Constants.DEFAULT_APP_ID);
// 查询分账信息
PaymentConfirmInfo paymentConfirmInfo = adapayService.queryPaymentConfirmDetail(dto);
// 获取计算出来的订单分账记录
OrderInfoDetailVO orderInfoDetailVO = getOrderInfoDetailVO(orderCode);
List<OrderSplitRecord> orderSplitRecords = orderSplitRecordService.generatedOrderSplitRecordList(param, paymentConfirmInfo, splitDataList, orderInfoDetailVO);
logger.info("realTimeOrderSplit-订单:{}, 获取计算出来的订单分账记录:{}", orderCode, JSON.toJSONString(orderSplitRecords));
// 查询数据库中该订单的分账记录
List<OrderSplitRecord> splitRecordInfoVOS = orderSplitRecordService.queryOrderSplitRecordByOrderCode(orderCode);
logger.info("realTimeOrderSplit-订单:{}, 数据库中的订单分账记录:{}", orderCode, JSON.toJSONString(splitRecordInfoVOS));
// 对比分账记录
}
}

View File

@@ -1,6 +1,6 @@
package com.jsowell.pile.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.druid.support.json.JSONUtils;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.google.common.collect.Lists;
@@ -63,6 +63,47 @@ public class OrderSplitRecordServiceImpl implements OrderSplitRecordService {
return orderSplitRecordMapper.batchInsert(list);
}
/**
* 订单分账记录转换
*/
private List<OrderSplitRecord> transformationOrderSplitRecordList(BigDecimal settleAmount, String feeAmt,
String paymentId, String paymentConfirmId,
List<SplitData> splitDataList, OrderInfoDetailVO orderInfoDetailVO) {
// 订单分账记录集合
List<OrderSplitRecord> resultList = Lists.newArrayList();
for (SplitData splitData : splitDataList) {
OrderSplitRecord orderSplitRecord = new OrderSplitRecord();
orderSplitRecord.setOrderCode(orderInfoDetailVO.getOrderCode());
orderSplitRecord.setStatus(AdapayStatusEnum.SUCCEEDED.getValue());
orderSplitRecord.setSettleAmount(settleAmount);
orderSplitRecord.setTradeDate(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, orderInfoDetailVO.getSettlementTime())); // 订单结算日期 yyyy-MM-dd
orderSplitRecord.setMerchantId(orderInfoDetailVO.getMerchantId());
orderSplitRecord.setStationId(orderInfoDetailVO.getStationId());
orderSplitRecord.setElectricityAmount(orderInfoDetailVO.getTotalElectricityAmount());
orderSplitRecord.setServiceAmount(orderInfoDetailVO.getTotalServiceAmount());
orderSplitRecord.setAdapayMemberId(splitData.getMemberId());
orderSplitRecord.setPaymentId(paymentId);
orderSplitRecord.setPaymentConfirmId(paymentConfirmId);
orderSplitRecord.setElectricitySplitRatio(splitData.getElecRatio() != null ? splitData.getElecRatio() : BigDecimal.ZERO);
orderSplitRecord.setElectricitySplitAmount(splitData.getElecAmount() != null ? splitData.getElecAmount() : BigDecimal.ZERO);
orderSplitRecord.setServiceSplitRatio(splitData.getServiceRatio() != null ? splitData.getServiceRatio() : BigDecimal.ZERO);
orderSplitRecord.setServiceSplitAmount(splitData.getServiceAmount() != null ? splitData.getServiceAmount() : BigDecimal.ZERO);
orderSplitRecord.setRemark("");
orderSplitRecord.setDelFlag(DelFlagEnum.NORMAL.getValue());
orderSplitRecord.setCreateBy(Constants.SYSTEM);
orderSplitRecord.setCreateTime(DateUtils.getNowDate());
// 如果是手续费承担方, 保存feeAmt, 否则保存0
if (StringUtils.equals(splitData.getFeeFlag(), Constants.Y)) {
orderSplitRecord.setFeeAmount(new BigDecimal(feeAmt));
} else {
orderSplitRecord.setFeeAmount(BigDecimal.ZERO);
}
resultList.add(orderSplitRecord);
}
log.info("transformationOrderSplitRecordList-订单分账记录转换完成:{}", JSONUtils.toJSONString(resultList));
return resultList;
}
@Override
public void saveOrderSplitRecord(PaymentConfirmParam param, PaymentConfirmResponse response, List<SplitData> splitDataList, OrderInfoDetailVO orderInfoDetailVO) {
// 判断入参
@@ -75,52 +116,22 @@ public class OrderSplitRecordServiceImpl implements OrderSplitRecordService {
}
String paymentConfirmId = response.getId(); // 支付确认id
String feeAmt = response.getFee_amt(); // 手续费
String orderCode = param.getOrderCode(); // 订单号
BigDecimal settleAmount = param.getConfirmAmt(); // 结算金额
String paymentId = param.getPaymentId(); // 支付id
List<OrderSplitRecord> list = Lists.newArrayList(); // 订单分账记录集合
for (SplitData splitData : splitDataList) {
OrderSplitRecord orderSplitRecord = new OrderSplitRecord();
orderSplitRecord.setOrderCode(orderCode);
orderSplitRecord.setStatus(AdapayStatusEnum.SUCCEEDED.getValue());
orderSplitRecord.setSettleAmount(settleAmount);
// orderSplitRecord.setTradeDate(DateUtils.getDate()); // 订单结算日期 yyyy-MM-dd
orderSplitRecord.setTradeDate(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, orderInfoDetailVO.getSettlementTime())); // 订单结算日期 yyyy-MM-dd
orderSplitRecord.setMerchantId(orderInfoDetailVO.getMerchantId());
orderSplitRecord.setStationId(orderInfoDetailVO.getStationId());
orderSplitRecord.setElectricityAmount(orderInfoDetailVO.getTotalElectricityAmount());
orderSplitRecord.setServiceAmount(orderInfoDetailVO.getTotalServiceAmount());
orderSplitRecord.setAdapayMemberId(splitData.getMemberId());
orderSplitRecord.setPaymentId(paymentId);
orderSplitRecord.setPaymentConfirmId(paymentConfirmId);
orderSplitRecord.setElectricitySplitRatio(splitData.getElecRatio() != null ? splitData.getElecRatio() : BigDecimal.ZERO);
orderSplitRecord.setElectricitySplitAmount(splitData.getElecAmount() != null ? splitData.getElecAmount() : BigDecimal.ZERO);
orderSplitRecord.setServiceSplitRatio(splitData.getServiceRatio() != null ? splitData.getServiceRatio() : BigDecimal.ZERO);
orderSplitRecord.setServiceSplitAmount(splitData.getServiceAmount() != null ? splitData.getServiceAmount() : BigDecimal.ZERO);
orderSplitRecord.setRemark("");
orderSplitRecord.setDelFlag(DelFlagEnum.NORMAL.getValue());
orderSplitRecord.setCreateBy(Constants.SYSTEM);
orderSplitRecord.setCreateTime(DateUtils.getNowDate());
// 如果是手续费承担方, 保存feeAmt, 否则保存0
if (StringUtils.equals(splitData.getFeeFlag(), Constants.Y)) {
orderSplitRecord.setFeeAmount(new BigDecimal(feeAmt));
} else {
orderSplitRecord.setFeeAmount(BigDecimal.ZERO);
}
list.add(orderSplitRecord);
}
List<OrderSplitRecord> list = transformationOrderSplitRecordList(settleAmount, feeAmt, paymentId, paymentConfirmId, splitDataList, orderInfoDetailVO); // 订单分账记录集合
this.batchInsert(list);
}
/**
* 保存订单分账记录。临时保存
* generated
* @param param
* @param response
* @param splitDataList
* @param orderInfoDetailVO
*/
@Override
public void saveOrderSplitRecordTemp(PaymentConfirmParam param, PaymentConfirmInfo response, List<SplitData> splitDataList, OrderInfoDetailVO orderInfoDetailVO) {
public void saveOrderSplitRecord(PaymentConfirmParam param, PaymentConfirmInfo response, List<SplitData> splitDataList, OrderInfoDetailVO orderInfoDetailVO) {
// 判断入参
if (param == null || response == null || CollectionUtils.isEmpty(param.getDivMemberList()) || orderInfoDetailVO == null) {
return;
@@ -131,44 +142,36 @@ public class OrderSplitRecordServiceImpl implements OrderSplitRecordService {
}
String paymentConfirmId = response.getId(); // 支付确认id
String feeAmt = response.getFeeAmt(); // 手续费
String orderCode = param.getOrderCode(); // 订单号
BigDecimal settleAmount = param.getConfirmAmt(); // 结算金额
String paymentId = param.getPaymentId(); // 支付id
List<OrderSplitRecord> list = Lists.newArrayList(); // 订单分账记录集合
for (SplitData splitData : splitDataList) {
OrderSplitRecord orderSplitRecord = new OrderSplitRecord();
orderSplitRecord.setOrderCode(orderCode);
orderSplitRecord.setStatus(AdapayStatusEnum.SUCCEEDED.getValue());
orderSplitRecord.setSettleAmount(settleAmount);
// orderSplitRecord.setTradeDate(DateUtils.getDate()); // 订单结算日期 yyyy-MM-dd
orderSplitRecord.setTradeDate(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, orderInfoDetailVO.getSettlementTime())); // 订单结算日期 yyyy-MM-dd
orderSplitRecord.setMerchantId(orderInfoDetailVO.getMerchantId());
orderSplitRecord.setStationId(orderInfoDetailVO.getStationId());
orderSplitRecord.setElectricityAmount(orderInfoDetailVO.getTotalElectricityAmount());
orderSplitRecord.setServiceAmount(orderInfoDetailVO.getTotalServiceAmount());
orderSplitRecord.setAdapayMemberId(splitData.getMemberId());
orderSplitRecord.setPaymentId(paymentId);
orderSplitRecord.setPaymentConfirmId(paymentConfirmId);
orderSplitRecord.setElectricitySplitRatio(splitData.getElecRatio() != null ? splitData.getElecRatio() : BigDecimal.ZERO);
orderSplitRecord.setElectricitySplitAmount(splitData.getElecAmount() != null ? splitData.getElecAmount() : BigDecimal.ZERO);
orderSplitRecord.setServiceSplitRatio(splitData.getServiceRatio() != null ? splitData.getServiceRatio() : BigDecimal.ZERO);
orderSplitRecord.setServiceSplitAmount(splitData.getServiceAmount() != null ? splitData.getServiceAmount() : BigDecimal.ZERO);
orderSplitRecord.setRemark("");
orderSplitRecord.setDelFlag(DelFlagEnum.NORMAL.getValue());
orderSplitRecord.setCreateBy(Constants.SYSTEM);
orderSplitRecord.setCreateTime(DateUtils.getNowDate());
// 如果是手续费承担方, 保存feeAmt, 否则保存0
if (StringUtils.equals(splitData.getFeeFlag(), Constants.Y)) {
orderSplitRecord.setFeeAmount(new BigDecimal(feeAmt));
} else {
orderSplitRecord.setFeeAmount(BigDecimal.ZERO);
}
list.add(orderSplitRecord);
}
log.info("保存:{}", JSON.toJSONString(list));
List<OrderSplitRecord> list = transformationOrderSplitRecordList(settleAmount, feeAmt, paymentId, paymentConfirmId, splitDataList, orderInfoDetailVO); // 订单分账记录集合
this.batchInsert(list);
}
/**
* 生成订单分账记录列表,用于对比使用
* @param param
* @param response
* @param splitDataList
* @param orderInfoDetailVO
*/
@Override
public List<OrderSplitRecord> generatedOrderSplitRecordList(PaymentConfirmParam param, PaymentConfirmInfo response, List<SplitData> splitDataList, OrderInfoDetailVO orderInfoDetailVO) {
// 判断入参
if (param == null || response == null || CollectionUtils.isEmpty(param.getDivMemberList()) || orderInfoDetailVO == null) {
return null;
}
// response中status为failed 不保存
if (response.isFailed()) {
return null;
}
String paymentConfirmId = response.getId(); // 支付确认id
String feeAmt = response.getFeeAmt(); // 手续费
BigDecimal settleAmount = param.getConfirmAmt(); // 结算金额
String paymentId = param.getPaymentId(); // 支付id
return transformationOrderSplitRecordList(settleAmount, feeAmt, paymentId, paymentConfirmId, splitDataList, orderInfoDetailVO); // 订单分账记录集合
}
@Override
public List<OrderSplitRecordVO> selectByOrderCode(String orderCode) {
List<OrderSplitRecord> orderSplitRecords = orderSplitRecordMapper.selectByOrderCode(orderCode);
@@ -726,7 +729,10 @@ public class OrderSplitRecordServiceImpl implements OrderSplitRecordService {
return orderSplitRecordMapper.deleteOrderSplitRecord(orderCode);
}
@Override
public List<OrderSplitRecord> queryOrderSplitRecordByOrderCode(String orderCode) {
return orderSplitRecordMapper.selectByOrderCode(orderCode);
}
/**
* 根据汇付会员id查询分账汇总数据