feat:独立分账

This commit is contained in:
suzhuhong
2026-04-16 11:03:52 +08:00
parent 33f47db7e7
commit d90f8eb2a8
11 changed files with 371 additions and 15 deletions

View File

@@ -252,7 +252,7 @@ public class SplitOrderServiceImpl implements SplitOrderService {
//分账失败 释放锁
redisUtil.unlock(lockKey);
log.info("confirmSplitOrder:{}",e.getMessage());
throw new ServiceException(ErrorCodeEnum.TRANSFER_ERROR);
throw new ServiceException(ErrorCodeEnum.ERROR_MESSAGE);
}
existing.setConfirmer(userInfo.getUserId());
existing.setStatus(accountTransferDTO.getTradeStatus());

View File

@@ -2,6 +2,7 @@ package com.cool.store.service.store;
import com.cool.store.entity.order.PreAllocationRecordDO;
import com.cool.store.entity.order.StoreOrderDO;
import com.cool.store.entity.wallet.WalletTradeDO;
import com.cool.store.request.store.PreAllocationQueryShopRequest;
import com.cool.store.request.store.PreAllocationSaveRequest;
import com.cool.store.request.store.TransRequest;
@@ -29,4 +30,11 @@ public interface PreAllocationRecordService {
Boolean trans(TransRequest transRequest);
/**
* 分账状态刷新
* @param walletTradeDO
* @return
*/
Boolean transStatusRefresh(WalletTradeDO walletTradeDO);
}

View File

@@ -1,6 +1,7 @@
package com.cool.store.service.store.impl;
import cn.hutool.core.collection.CollStreamUtil;
import com.alibaba.excel.converters.bigdecimal.BigDecimalNumberConverter;
import com.alibaba.fastjson.JSONObject;
import com.cool.store.constants.RedisConstant;
import com.cool.store.dao.FranchiseFeeDAO;
@@ -18,6 +19,7 @@ import com.cool.store.dto.fees.WalletAllocationDTO;
import com.cool.store.dto.wallet.AccountInfoDTO;
import com.cool.store.dto.wallet.AccountTransferDTO;
import com.cool.store.dto.wallet.BatchTransferDTO;
import com.cool.store.dto.wallet.TradeRecordDTO;
import com.cool.store.entity.FranchiseFeeDO;
import com.cool.store.entity.LineInfoDO;
import com.cool.store.entity.ShopInfoDO;
@@ -38,14 +40,12 @@ import com.cool.store.enums.fees.WalletFeeItemEnum;
import com.cool.store.enums.order.StoreOrderStatusEnum;
import com.cool.store.enums.point.ShopSubStageEnum;
import com.cool.store.enums.point.ShopSubStageStatusEnum;
import com.cool.store.enums.wallet.TradeTypeEnum;
import com.cool.store.exception.ServiceException;
import com.cool.store.mapper.FranchiseFeeMapper;
import com.cool.store.request.store.PreAllocationSaveRequest;
import com.cool.store.request.store.TransRequest;
import com.cool.store.request.wallet.BatchTransferQueryRequest;
import com.cool.store.request.wallet.BatchTransferRequest;
import com.cool.store.request.wallet.OutStoreIdRequest;
import com.cool.store.request.wallet.TransferRequest;
import com.cool.store.request.wallet.*;
import com.cool.store.request.xgj.PushFranchiseFeeRequest;
import com.cool.store.request.xgj.ReceiptRequest;
import com.cool.store.service.PushService;
@@ -54,10 +54,7 @@ import com.cool.store.service.fees.WalletPayInfoService;
import com.cool.store.service.order.MiniStoreOrderService;
import com.cool.store.service.store.PreAllocationRecordService;
import com.cool.store.service.wallet.WalletApiService;
import com.cool.store.utils.BeanUtil;
import com.cool.store.utils.GenerateNoUtil;
import com.cool.store.utils.RedisUtil;
import com.cool.store.utils.StringUtil;
import com.cool.store.utils.*;
import com.cool.store.vo.order.MiniStoreOrderDetailVO;
import com.cool.store.vo.order.PreAllocationRecordVO;
import com.sun.xml.bind.v2.TODO;
@@ -78,6 +75,7 @@ import java.util.stream.Stream;
import static com.cool.store.enums.order.StoreOrderStatusEnum.PAY_FAIL;
import static com.cool.store.enums.wallet.WalletTradeModuleEnum.STANDARD_STORE;
import static com.cool.store.enums.wallet.WalletTradeModuleEnum.TRANSFER;
/**
* @Auther zx_szh
@@ -740,21 +738,76 @@ public class PreAllocationRecordServiceImpl implements PreAllocationRecordServic
if (CollectionUtils.isEmpty(accountInfoList)){
throw new ServiceException(ErrorCodeEnum.NOT_EXIST_WANG_SHANG_ACCOUNT);
}
//校验金额
AccountInfoDTO accountInfoDTO = accountInfoList.get(0);
String totalAmount = accountInfoDTO.getTotalAmount();
Boolean amountSupport = BigDecimalUtils.greaterThanOrEqual(new BigDecimal(totalAmount), record.getPayAmount());
if (!amountSupport){
throw new ServiceException(ErrorCodeEnum.WALLET_BALANCE_INSUFFICIENT);
}
AccountTransferDTO accountTransferDTO ;
try {
AccountInfoDTO accountInfoDTO = accountInfoList.get(0);
accountTransferDTO = walletPayInfoService.accountPay(record.getExpenseType(), record.getPayAmount(),
record.getPayeeCode(), accountInfoDTO.getAccountNo(), record.getPayNo(), transRequest.getRemark());
}catch (Exception e){
//分账失败 释放锁
redisUtil.unlock(lockKey);
log.info("confirmSplitOrder:{}",e.getMessage());
//todo 改为明确的提示
throw new ServiceException(ErrorCodeEnum.TRANSFER_ERROR);
log.error("confirmSplitOrder:{}",e.getMessage());
throw new ServiceException(ErrorCodeEnum.ERROR_MESSAGE);
}
record.setAllocationStatus(AllocationPayStatusEnum.PAYING.getStatus());
//先改为分账中
preAllocationRecordDAO.updateByPrimaryKeySelective(record);
WalletTradeDO walletTradeDO = new WalletTradeDO();
walletTradeDO.setPayStatus(accountTransferDTO.getTradeStatus());
walletTradeDO.setModule(TRANSFER.getModule());
walletTradeDO.setRemark(transRequest.getRemark());
walletTradeDO.setPayAmount(new BigDecimal(accountTransferDTO.getAmount()));
walletTradeDO.setPayTime(new Date());
walletTradeDO.setPayNo(record.getPayNo());
walletTradeDO.setTradeId(String.valueOf(accountTransferDTO.getTradeId()));
walletTradeDO.setType(TradeTypeEnum.ADD_BY_HAND.getStatus());
walletTradeDAO.insertSelective(walletTradeDO);
return null;
}
@Override
public Boolean transStatusRefresh(WalletTradeDO walletTradeDO) {
BillDetailRequest request = new BillDetailRequest();
request.setTradeId(Long.valueOf(walletTradeDO.getTradeId()));
TradeRecordDTO billDetail = walletApiService.getBillDetail(request);
walletTradeDO.setPayStatus(billDetail.getTradeStatus());
walletTradeDAO.updateByPrimaryKeySelective(walletTradeDO);
PreAllocationRecordDO preAllocationRecordDO = preAllocationRecordDAO.queryPageByPayNo(walletTradeDO.getPayNo());
preAllocationRecordDO.setAllocationStatus(billDetail.getTradeStatus());
preAllocationRecordDO.setUpdateTime(new Date());
preAllocationRecordDAO.updateByPrimaryKeySelective(preAllocationRecordDO);
if (AllocationPayStatusEnum.PAID.getStatus().equals(walletTradeDO.getPayStatus())) {
ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(preAllocationRecordDO.getShopId());
//订单状态更新
StoreOrderDO storeOrder = storeOrderDAO.getById(preAllocationRecordDO.getOrderId());
//部分支付
StoreOrderDO updateOrder = StoreOrderDO.builder()
.id(storeOrder.getId())
.status(StoreOrderStatusEnum.PART_OF_WAIT_PAY.getCode())
.updateTime(new Date())
.build();
//当前缴纳金额 = 本次缴纳前已缴纳金额+本次缴纳金额
BigDecimal currentAmount = new BigDecimal(billDetail.getAmount());
BigDecimal paidAmount = storeOrder.getPaidAmount().add(currentAmount);
BigDecimal unpaidAmount = storeOrder.getTotalAmount().subtract(paidAmount);
//支付成功 修改金额,支付中 回调的时候习惯
updateOrder.setPaidAmount(paidAmount);
updateOrder.setUnpaidAmount(unpaidAmount);
updateOrder.setPayTime(new Date());
if (BigDecimalUtils.equals(unpaidAmount,new BigDecimal(0))){
//剩余缴纳金额是0 缴费完成
updateOrder.setStatus( StoreOrderStatusEnum.PAID.getCode());
}
storeOrderDAO.updateSelective(updateOrder);
}
return Boolean.TRUE;
}
}