Merge branch 'refs/heads/test'

This commit is contained in:
seesaw
2024-08-14 11:35:06 +08:00
2 changed files with 88 additions and 69 deletions

View File

@ -56,10 +56,15 @@ public class DivideInfoDO extends BaseDO {
* 分账接收方账号 * 分账接收方账号
*/ */
private String account; private String account;
/** /**
* 分账金额 * 分账金额
*/ */
private Integer amount; private Integer amount;
/**
* 可用于分账回退的金额
*/
private Integer refundAmount;
/** /**
* 估算金额 * 估算金额
*/ */

View File

@ -154,6 +154,7 @@ public class DivideServiceImpl implements DivideService {
.setType(divideCompanyDO.getType()) .setType(divideCompanyDO.getType())
.setAccount(divideCompanyDO.getAccount()) .setAccount(divideCompanyDO.getAccount())
.setAmount(money) .setAmount(money)
.setRefundAmount(money)
.setComputeAmount(money) .setComputeAmount(money)
.setDescription("" + divideCompanyDO.getName() + "分账"); .setDescription("" + divideCompanyDO.getName() + "分账");
infoDOList.add(divideInfoDO); infoDOList.add(divideInfoDO);
@ -185,14 +186,14 @@ public class DivideServiceImpl implements DivideService {
refundToday = BigDecimal.ZERO; refundToday = BigDecimal.ZERO;
} }
int refund = refundToday.multiply(new BigDecimal("100")).intValue(); int refund = refundToday.multiply(new BigDecimal("100")).intValue();
money = money-refund; money = money - refund;
//查询29天内的充值订单原因微信30天自动解冻订单将不能分账 //查询29天内的充值订单原因微信30天自动解冻订单将不能分账
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
LocalDateTime thirtyDaysAgo = now.minusDays(29); LocalDateTime thirtyDaysAgo = now.minusDays(29);
List<DivideDO> divideDOS = divideMapper.selectList(Wrappers.<DivideDO>lambdaQuery() List<DivideDO> divideDOS = divideMapper.selectList(Wrappers.<DivideDO>lambdaQuery()
.eq(DivideDO::getStatus, PayDivideStatusRespEnum.WAITING.getStatus()) .eq(DivideDO::getStatus, PayDivideStatusRespEnum.WAITING.getStatus())
.eq(DivideDO::getUnfreezeStatus,"0") .eq(DivideDO::getUnfreezeStatus, "0")
.ge(DivideDO::getCreateTime, thirtyDaysAgo) .ge(DivideDO::getCreateTime, thirtyDaysAgo)
.orderByAsc(DivideDO::getCreateTime)); .orderByAsc(DivideDO::getCreateTime));
if (CollectionUtil.isEmpty(divideDOS)) { if (CollectionUtil.isEmpty(divideDOS)) {
@ -205,7 +206,7 @@ public class DivideServiceImpl implements DivideService {
for (DivideDO divideDO : divideDOS) { for (DivideDO divideDO : divideDOS) {
Integer totalPrice = divideDO.getTotalPrice() - divideDO.getCpPrice(); Integer totalPrice = divideDO.getTotalPrice() - divideDO.getCpPrice();
if(totalPrice == 0){ if (totalPrice == 0) {
continue; continue;
} }
@ -214,19 +215,19 @@ public class DivideServiceImpl implements DivideService {
if (sum < money) { if (sum < money) {
divideDO.setUnPrice(totalPrice); divideDO.setUnPrice(totalPrice);
divideDO.setCpPrice(divideDO.getCpPrice() + totalPrice); divideDO.setCpPrice(divideDO.getCpPrice() + totalPrice);
divideDO.setPsPrice(divideDO.getPsPrice()+totalPrice); divideDO.setPsPrice(divideDO.getPsPrice() + totalPrice);
divideList.add(divideDO); divideList.add(divideDO);
} else if (sum == money) { } else if (sum == money) {
divideDO.setUnPrice(totalPrice); divideDO.setUnPrice(totalPrice);
divideDO.setCpPrice(divideDO.getCpPrice() + totalPrice); divideDO.setCpPrice(divideDO.getCpPrice() + totalPrice);
divideDO.setPsPrice(divideDO.getPsPrice()+totalPrice); divideDO.setPsPrice(divideDO.getPsPrice() + totalPrice);
divideList.add(divideDO); divideList.add(divideDO);
break; break;
} else { } else {
int leftMoney = money + totalPrice - sum; int leftMoney = money + totalPrice - sum;
divideDO.setUnPrice(leftMoney); divideDO.setUnPrice(leftMoney);
divideDO.setCpPrice(divideDO.getCpPrice() + leftMoney); divideDO.setCpPrice(divideDO.getCpPrice() + leftMoney);
divideDO.setPsPrice(divideDO.getPsPrice()+leftMoney); divideDO.setPsPrice(divideDO.getPsPrice() + leftMoney);
divideList.add(divideDO); divideList.add(divideDO);
break; break;
} }
@ -266,7 +267,7 @@ public class DivideServiceImpl implements DivideService {
} }
} }
} }
if(CollectionUtil.isNotEmpty(divideRecordDOList)){ if (CollectionUtil.isNotEmpty(divideRecordDOList)) {
divideMapper.updateBatch(divideDOS); divideMapper.updateBatch(divideDOS);
divideRecordMapper.insertBatch(divideRecordDOList); divideRecordMapper.insertBatch(divideRecordDOList);
} }
@ -300,7 +301,7 @@ public class DivideServiceImpl implements DivideService {
payDivideUnifiedDto.setTransactionId(divideDO.getChannelOrderNo()) payDivideUnifiedDto.setTransactionId(divideDO.getChannelOrderNo())
.setOutOrderNo(divideDO.getNo()); .setOutOrderNo(divideDO.getNo());
PayDivideRespDto payDivideRespDto = client.unifiedDivideResult(payDivideUnifiedDto); PayDivideRespDto payDivideRespDto = client.unifiedDivideResult(payDivideUnifiedDto);
updateDivideInfo(payDivideRespDto.getReceivers(), divideDO.getNo(),payDivideRespDto.getOrderId()); updateDivideInfo(payDivideRespDto.getReceivers(), divideDO.getNo(), payDivideRespDto.getOrderId());
if (divideDO.getTotalPrice().equals(divideDO.getCpPrice())) { if (divideDO.getTotalPrice().equals(divideDO.getCpPrice())) {
divideDO.setStatus(PayDivideStatusRespEnum.COMPLETE.getStatus()); divideDO.setStatus(PayDivideStatusRespEnum.COMPLETE.getStatus());
@ -312,13 +313,13 @@ public class DivideServiceImpl implements DivideService {
return divideDOS.size(); return divideDOS.size();
} }
void updateDivideInfo(List<ProfitSharingV3Result.Receiver> receivers, String outOrderNo,String orderId) { void updateDivideInfo(List<ProfitSharingV3Result.Receiver> receivers, String outOrderNo, String orderId) {
List<DivideCompanyDO> list1 = divideCompanyService.getList(); List<DivideCompanyDO> list1 = divideCompanyService.getList();
List<String> accountList = list1.stream().map(DivideCompanyDO::getAccount).collect(Collectors.toList()); List<String> accountList = list1.stream().map(DivideCompanyDO::getAccount).collect(Collectors.toList());
List<DivideInfoDO> list = new ArrayList<>(); List<DivideInfoDO> list = new ArrayList<>();
for (ProfitSharingV3Result.Receiver receiver : receivers) { for (ProfitSharingV3Result.Receiver receiver : receivers) {
if(!accountList.contains(receiver.getAccount())){ if (!accountList.contains(receiver.getAccount())) {
continue; continue;
} }
@ -378,19 +379,19 @@ public class DivideServiceImpl implements DivideService {
//判断是否有金额可退款 //判断是否有金额可退款
BigDecimal wxAmount = divideMapper.getWxAmount(drawMoneyVO.getUserId()); BigDecimal wxAmount = divideMapper.getWxAmount(drawMoneyVO.getUserId());
if(wxAmount == null){ if (wxAmount == null) {
throw new ServiceException(WX_ACCOUNT_NO); throw new ServiceException(WX_ACCOUNT_NO);
} }
//判断是否有金额可退款 //判断是否有金额可退款
int money = wxAmount.multiply(new BigDecimal("100")).intValue(); int money = wxAmount.multiply(new BigDecimal("100")).intValue();
if (money <= 0 ) { if (money <= 0) {
throw new ServiceException(WX_ACCOUNT_NO); throw new ServiceException(WX_ACCOUNT_NO);
} }
//指定金额 //指定金额
if(drawMoneyVO.getTotalPrice()!=null){ if (drawMoneyVO.getTotalPrice() != null) {
if (money < drawMoneyVO.getTotalPrice() ) { if (money < drawMoneyVO.getTotalPrice()) {
throw new ServiceException(WX_ACCOUNT_NO); throw new ServiceException(WX_ACCOUNT_NO);
} }
money = drawMoneyVO.getTotalPrice(); money = drawMoneyVO.getTotalPrice();
@ -402,7 +403,7 @@ public class DivideServiceImpl implements DivideService {
List<DivideDO> divideDOS = divideMapper.selectList(Wrappers.<DivideDO>lambdaQuery() List<DivideDO> divideDOS = divideMapper.selectList(Wrappers.<DivideDO>lambdaQuery()
.eq(DivideDO::getChannelUserId, drawMoneyVO.getChannelUserId()) .eq(DivideDO::getChannelUserId, drawMoneyVO.getChannelUserId())
.eq(DivideDO::getRefundStatus, "0") .eq(DivideDO::getRefundStatus, "0")
.ge(DivideDO::getCreateTime,threeYearsAgo) .ge(DivideDO::getCreateTime, threeYearsAgo)
.orderByDesc(DivideDO::getCreateTime)); .orderByDesc(DivideDO::getCreateTime));
//筛选出未分账的订单 //筛选出未分账的订单
@ -432,12 +433,12 @@ public class DivideServiceImpl implements DivideService {
if (sum < money) { if (sum < money) {
divideDO.setUnRePrice(totalPrice); divideDO.setUnRePrice(totalPrice);
divideDO.setRefundPrice(totalPrice+divideDO.getCpPrice()); divideDO.setRefundPrice(totalPrice + divideDO.getCpPrice());
divideDO.setCpPrice(divideDO.getCpPrice() + totalPrice); divideDO.setCpPrice(divideDO.getCpPrice() + totalPrice);
noBackList.add(divideDO); noBackList.add(divideDO);
} else if (sum == money) { } else if (sum == money) {
divideDO.setUnRePrice(totalPrice); divideDO.setUnRePrice(totalPrice);
divideDO.setRefundPrice(totalPrice+divideDO.getCpPrice()); divideDO.setRefundPrice(totalPrice + divideDO.getCpPrice());
divideDO.setCpPrice(divideDO.getCpPrice() + totalPrice); divideDO.setCpPrice(divideDO.getCpPrice() + totalPrice);
noBackList.add(divideDO); noBackList.add(divideDO);
break; break;
@ -453,7 +454,7 @@ public class DivideServiceImpl implements DivideService {
//从分账完的订单进行退款 //从分账完的订单进行退款
if (sum < money) { if (sum < money) {
for (DivideDO divideDO : divideList) { for (DivideDO divideDO : divideList) {
Integer totalPrice = divideDO.getTotalPrice()-divideDO.getRefundPrice(); Integer totalPrice = divideDO.getTotalPrice() - divideDO.getRefundPrice();
sum = sum + totalPrice; sum = sum + totalPrice;
@ -473,9 +474,9 @@ public class DivideServiceImpl implements DivideService {
} else { } else {
int leftMoney = money + totalPrice - sum; int leftMoney = money + totalPrice - sum;
divideDO.setUnRePrice(leftMoney); divideDO.setUnRePrice(leftMoney);
divideDO.setRefundPrice(leftMoney+divideDO.getRefundPrice()); divideDO.setRefundPrice(leftMoney + divideDO.getRefundPrice());
divideDO.setBackPrice(leftMoney); divideDO.setBackPrice(leftMoney);
divideDO.setPsPrice(divideDO.getPsPrice()-leftMoney); divideDO.setPsPrice(divideDO.getPsPrice() - leftMoney);
backList.add(divideDO); backList.add(divideDO);
break; break;
} }
@ -489,7 +490,7 @@ public class DivideServiceImpl implements DivideService {
Integer totalPrice = divideDO.getTotalPrice() - divideDO.getCpPrice(); Integer totalPrice = divideDO.getTotalPrice() - divideDO.getCpPrice();
sum = sum + totalPrice; sum = sum + totalPrice;
if (sum < money) { if (sum < money) {
if("0".equals(divideDO.getUnfreezeStatus())){ if ("0".equals(divideDO.getUnfreezeStatus())) {
//先解冻剩余资金 //先解冻剩余资金
String unFreeNo = noRedisDAO.generate(payProperties.getOrderNoPrefix()); String unFreeNo = noRedisDAO.generate(payProperties.getOrderNoPrefix());
PayClient client = channelService.getPayClient(divideDO.getChannelId()); PayClient client = channelService.getPayClient(divideDO.getChannelId());
@ -515,27 +516,27 @@ public class DivideServiceImpl implements DivideService {
PayDivideRespDto payDivideRespDto = client.unifiedDivideResult(resultDto); PayDivideRespDto payDivideRespDto = client.unifiedDivideResult(resultDto);
state = payDivideRespDto.getState(); state = payDivideRespDto.getState();
}while ("PROCESSING".equals(state)); } while ("PROCESSING".equals(state));
} }
//计算退款资金 //计算退款资金
//可用于退款的资金 //可用于退款的资金
Integer psPrice = divideDO.getTotalPrice()- divideDO.getRefundPrice(); Integer psPrice = divideDO.getTotalPrice() - divideDO.getRefundPrice();
sum = sum - totalPrice+psPrice; sum = sum - totalPrice + psPrice;
if (sum <= money){ if (sum <= money) {
divideDO.setUnRePrice(psPrice); divideDO.setUnRePrice(psPrice);
divideDO.setRefundPrice(divideDO.getTotalPrice()); divideDO.setRefundPrice(divideDO.getTotalPrice());
divideDO.setBackPrice(divideDO.getPsPrice()); divideDO.setBackPrice(divideDO.getPsPrice());
divideDO.setPsPrice(0); divideDO.setPsPrice(0);
}else{ } else {
int left = money-sum+psPrice; int left = money - sum + psPrice;
divideDO.setUnRePrice(left); divideDO.setUnRePrice(left);
divideDO.setRefundPrice(divideDO.getRefundPrice()+left); divideDO.setRefundPrice(divideDO.getRefundPrice() + left);
//分账回退金额 //分账回退金额
int back = left-totalPrice; int back = left - totalPrice;
divideDO.setBackPrice(back); divideDO.setBackPrice(back);
divideDO.setPsPrice(divideDO.getPsPrice()-back); divideDO.setPsPrice(divideDO.getPsPrice() - back);
} }
backList.add(divideDO); backList.add(divideDO);
divideDO.setCpPrice(divideDO.getTotalPrice()); divideDO.setCpPrice(divideDO.getTotalPrice());
@ -543,7 +544,7 @@ public class DivideServiceImpl implements DivideService {
//计算使用资金 //计算使用资金
Integer useMoney = sum - money; Integer useMoney = sum - money;
divideDO.setUnRePrice(useMoney); divideDO.setUnRePrice(useMoney);
divideDO.setRefundPrice(useMoney+divideDO.getRefundPrice()); divideDO.setRefundPrice(useMoney + divideDO.getRefundPrice());
divideDO.setCpPrice(divideDO.getCpPrice() + useMoney); divideDO.setCpPrice(divideDO.getCpPrice() + useMoney);
noBackList.add(divideDO); noBackList.add(divideDO);
} }
@ -556,7 +557,7 @@ public class DivideServiceImpl implements DivideService {
int failNum = 0; int failNum = 0;
//调用退款接口 //调用退款接口
if(CollectionUtil.isNotEmpty(noBackList)){ if (CollectionUtil.isNotEmpty(noBackList)) {
for (DivideDO divideDO : noBackList) { for (DivideDO divideDO : noBackList) {
String outRefundNo = noRedisDAO.generate(payProperties.getRefundNoPrefix()); String outRefundNo = noRedisDAO.generate(payProperties.getRefundNoPrefix());
RefundRecordDO refundRecordDO = new RefundRecordDO(); RefundRecordDO refundRecordDO = new RefundRecordDO();
@ -581,24 +582,24 @@ public class DivideServiceImpl implements DivideService {
String channelRefundNo = payRefundRespDTO.getChannelRefundNo(); String channelRefundNo = payRefundRespDTO.getChannelRefundNo();
refundRecordDO.setRefundId(channelRefundNo); refundRecordDO.setRefundId(channelRefundNo);
if(cn.iocoder.yudao.framework.pay.core.enums.refund.PayRefundStatusRespEnum.WAITING.getStatus().equals(payRefundRespDTO.getStatus())){ if (cn.iocoder.yudao.framework.pay.core.enums.refund.PayRefundStatusRespEnum.WAITING.getStatus().equals(payRefundRespDTO.getStatus())) {
refundRecordDO.setStatus(PayDivideRefundStatusRespEnum.PROCESSING.getStatus()); refundRecordDO.setStatus(PayDivideRefundStatusRespEnum.PROCESSING.getStatus());
} else if (cn.iocoder.yudao.framework.pay.core.enums.refund.PayRefundStatusRespEnum.SUCCESS.getStatus().equals(payRefundRespDTO.getStatus())) { } else if (cn.iocoder.yudao.framework.pay.core.enums.refund.PayRefundStatusRespEnum.SUCCESS.getStatus().equals(payRefundRespDTO.getStatus())) {
refundRecordDO.setStatus(PayDivideRefundStatusRespEnum.SUCCESS.getStatus()); refundRecordDO.setStatus(PayDivideRefundStatusRespEnum.SUCCESS.getStatus());
}else { } else {
failNum++; failNum++;
refundRecordDO.setStatus(PayDivideRefundStatusRespEnum.ABNORMAL.getStatus()); refundRecordDO.setStatus(PayDivideRefundStatusRespEnum.ABNORMAL.getStatus());
} }
refundRecordMapper.insert(refundRecordDO); refundRecordMapper.insert(refundRecordDO);
if(divideDO.getRefundPrice().equals(divideDO.getTotalPrice())){ if (divideDO.getRefundPrice().equals(divideDO.getTotalPrice())) {
divideDO.setRefundStatus("1"); divideDO.setRefundStatus("1");
} }
if(divideDO.getTotalPrice().equals(divideDO.getCpPrice())){ if (divideDO.getTotalPrice().equals(divideDO.getCpPrice())) {
divideDO.setStatus(PayDivideStatusRespEnum.CASH.getStatus()); divideDO.setStatus(PayDivideStatusRespEnum.CASH.getStatus());
} }
String jsonString = JsonUtils.toJsonString(divideDO); String jsonString = JsonUtils.toJsonString(divideDO);
//DivideDO divideDO1 = JsonUtils.parseObject(jsonString, DivideDO.class); //DivideDO divideDO1 = JsonUtils.parseObject(jsonString, DivideDO.class);
divideRedisTemplate.opsForValue().set("R"+outRefundNo,jsonString); divideRedisTemplate.opsForValue().set("R" + outRefundNo, jsonString);
//divideMapper.updateById(divideDO); //divideMapper.updateById(divideDO);
//list.add(refundRecordDO); //list.add(refundRecordDO);
@ -606,7 +607,7 @@ public class DivideServiceImpl implements DivideService {
} }
//调用退款接口 //调用退款接口
if(CollectionUtil.isNotEmpty(backList)){ if (CollectionUtil.isNotEmpty(backList)) {
for (DivideDO divideDO : backList) { for (DivideDO divideDO : backList) {
String outRefundNo = noRedisDAO.generate(payProperties.getRefundNoPrefix()); String outRefundNo = noRedisDAO.generate(payProperties.getRefundNoPrefix());
RefundRecordDO refundRecordDO = new RefundRecordDO(); RefundRecordDO refundRecordDO = new RefundRecordDO();
@ -631,25 +632,25 @@ public class DivideServiceImpl implements DivideService {
String channelRefundNo = payRefundRespDTO.getChannelRefundNo(); String channelRefundNo = payRefundRespDTO.getChannelRefundNo();
refundRecordDO.setRefundId(channelRefundNo); refundRecordDO.setRefundId(channelRefundNo);
if(cn.iocoder.yudao.framework.pay.core.enums.refund.PayRefundStatusRespEnum.WAITING.getStatus().equals(payRefundRespDTO.getStatus())){ if (cn.iocoder.yudao.framework.pay.core.enums.refund.PayRefundStatusRespEnum.WAITING.getStatus().equals(payRefundRespDTO.getStatus())) {
refundRecordDO.setStatus(PayDivideRefundStatusRespEnum.PROCESSING.getStatus()); refundRecordDO.setStatus(PayDivideRefundStatusRespEnum.PROCESSING.getStatus());
} else if (cn.iocoder.yudao.framework.pay.core.enums.refund.PayRefundStatusRespEnum.SUCCESS.getStatus().equals(payRefundRespDTO.getStatus())) { } else if (cn.iocoder.yudao.framework.pay.core.enums.refund.PayRefundStatusRespEnum.SUCCESS.getStatus().equals(payRefundRespDTO.getStatus())) {
refundRecordDO.setStatus(PayDivideRefundStatusRespEnum.SUCCESS.getStatus()); refundRecordDO.setStatus(PayDivideRefundStatusRespEnum.SUCCESS.getStatus());
}else { } else {
failNum++; failNum++;
refundRecordDO.setStatus(PayDivideRefundStatusRespEnum.ABNORMAL.getStatus()); refundRecordDO.setStatus(PayDivideRefundStatusRespEnum.ABNORMAL.getStatus());
} }
//list.add(refundRecordDO); //list.add(refundRecordDO);
refundRecordMapper.insert(refundRecordDO); refundRecordMapper.insert(refundRecordDO);
if(divideDO.getRefundPrice().equals(divideDO.getTotalPrice())){ if (divideDO.getRefundPrice().equals(divideDO.getTotalPrice())) {
divideDO.setRefundStatus("1"); divideDO.setRefundStatus("1");
} }
if(divideDO.getTotalPrice().equals(divideDO.getCpPrice())){ if (divideDO.getTotalPrice().equals(divideDO.getCpPrice())) {
divideDO.setStatus(PayDivideStatusRespEnum.CASH.getStatus()); divideDO.setStatus(PayDivideStatusRespEnum.CASH.getStatus());
} }
String jsonString = JsonUtils.toJsonString(divideDO); String jsonString = JsonUtils.toJsonString(divideDO);
//DivideDO divideDO1 = JsonUtils.parseObject(jsonString, DivideDO.class); //DivideDO divideDO1 = JsonUtils.parseObject(jsonString, DivideDO.class);
divideRedisTemplate.opsForValue().set("R"+outRefundNo,jsonString); divideRedisTemplate.opsForValue().set("R" + outRefundNo, jsonString);
//divideMapper.updateById(divideDO); //divideMapper.updateById(divideDO);
} }
@ -662,7 +663,7 @@ public class DivideServiceImpl implements DivideService {
//refundRecordMapper.insertBatch(list); //refundRecordMapper.insertBatch(list);
// todo清空 // todo清空
return failNum>0?false:true; return failNum > 0 ? false : true;
} }
private String genChannelRefundNotifyUrl(PayChannelDO channel) { private String genChannelRefundNotifyUrl(PayChannelDO channel) {
@ -670,58 +671,71 @@ public class DivideServiceImpl implements DivideService {
} }
@Override @Override
public void returnMoney(List<DivideDO> backList){ public void returnMoney(List<DivideDO> backList) {
List<DivideCompanyDO> companyList = divideCompanyService.getList(); List<DivideCompanyDO> companyList = divideCompanyService.getList();
Map<String, DivideCompanyDO> companyMap = companyList.stream().collect(Collectors.toMap(DivideCompanyDO::getName, vo -> vo)); Map<String, DivideCompanyDO> companyMap = companyList.stream().collect(Collectors.toMap(DivideCompanyDO::getName, vo -> vo));
//更新可分账回退金额
for(DivideDO divideDO:backList){ List<DivideInfoDO> updateList = new ArrayList<>();
for (DivideDO divideDO : backList) {
PayClient client = channelService.getPayClient(divideDO.getChannelId()); PayClient client = channelService.getPayClient(divideDO.getChannelId());
//查询出分账的具体条数 //查询出分账的具体条数
List<DivideInfoDO> divideListByTi = divideInfoService.getDivideListByTi(divideDO.getChannelOrderNo()); List<DivideInfoDO> divideListByTi = divideInfoService.getDivideListByTi(divideDO.getChannelOrderNo());
//全部回退
if(divideDO.getRefundPrice().equals(divideDO.getTotalPrice())){
for(DivideInfoDO divideInfoDO : divideListByTi){ //全部回退
doReturn(client,divideInfoDO,companyMap.get(divideInfoDO.getName()).getAccount()); if (divideDO.getBackPrice().equals(divideDO.getTotalPrice())) {
for (DivideInfoDO divideInfoDO : divideListByTi) {
updateList.add(divideInfoDO.setRefundAmount(0));
doReturn(client, divideInfoDO, companyMap.get(divideInfoDO.getName()).getAccount());
} }
}else{ } else {
Integer refundPrice = divideDO.getRefundPrice(); Integer refundPrice = divideDO.getBackPrice();
//算出每个公司应回退的金额 //算出每个公司应回退的金额
for(DivideCompanyDO companyDO:companyList){ for (DivideCompanyDO companyDO : companyList) {
int backmoney = (int) Math.ceil(refundPrice* Double.valueOf(companyDO.getProportion())); int backmoney = (int) Math.ceil(refundPrice * Double.valueOf(companyDO.getProportion()));
List<DivideInfoDO> baList = divideListByTi.stream().filter(vo -> vo.getName().equals(companyDO.getName())).collect(Collectors.toList()); List<DivideInfoDO> baList = divideListByTi.stream().filter(vo -> vo.getName().equals(companyDO.getName())).collect(Collectors.toList());
int sum = 0; int sum = 0;
for (DivideInfoDO infoDO : baList){ for (DivideInfoDO infoDO : baList) {
sum = sum+infoDO.getAmount(); if(infoDO.getRefundAmount()==0){
if(sum<backmoney){ continue;
doReturn(client,infoDO,companyDO.getAccount()); }
}else if (sum==backmoney){ sum = sum + infoDO.getRefundAmount();
doReturn(client,infoDO,companyDO.getAccount()); if (sum < backmoney) {
doReturn(client, infoDO, companyDO.getAccount());
updateList.add(infoDO.setRefundAmount(0));
} else if (sum == backmoney) {
doReturn(client, infoDO, companyDO.getAccount());
updateList.add(infoDO.setRefundAmount(0));
break; break;
}else{ } else {
int left = backmoney+infoDO.getAmount()-sum; int leftRefundAmount = sum -backmoney;
infoDO.setAmount(left); int left = backmoney + infoDO.getAmount() - sum;
doReturn(client,infoDO,companyDO.getAccount()); infoDO.setRefundAmount(left);
doReturn(client, infoDO, companyDO.getAccount());
updateList.add(infoDO.setRefundAmount(leftRefundAmount));
break; break;
} }
} }
} }
} }
} }
if (CollectionUtil.isNotEmpty(updateList)) {
divideInfoService.updateList(updateList);
}
} }
void doReturn(PayClient client ,DivideInfoDO divideInfoDO ,String account){ void doReturn(PayClient client, DivideInfoDO divideInfoDO, String account) {
PayDivideBackUnifiedDto payDivideBackUnifiedDto = new PayDivideBackUnifiedDto(); PayDivideBackUnifiedDto payDivideBackUnifiedDto = new PayDivideBackUnifiedDto();
payDivideBackUnifiedDto.setAmount(divideInfoDO.getAmount().longValue()); payDivideBackUnifiedDto.setAmount(divideInfoDO.getRefundAmount().longValue());
payDivideBackUnifiedDto.setDescription("分账回退"); payDivideBackUnifiedDto.setDescription("分账回退");
payDivideBackUnifiedDto.setOrderId(divideInfoDO.getOrderId()); payDivideBackUnifiedDto.setOrderId(divideInfoDO.getOrderId());
payDivideBackUnifiedDto.setReturnMchid(account); payDivideBackUnifiedDto.setReturnMchid(account);
payDivideBackUnifiedDto.setOutOrderNo(divideInfoDO.getOutOrderNo()); payDivideBackUnifiedDto.setOutOrderNo(divideInfoDO.getOutOrderNo());
payDivideBackUnifiedDto.setOutReturnNo(noRedisDAO.generate(payProperties.getOrderNoPrefix())); payDivideBackUnifiedDto.setOutReturnNo(noRedisDAO.generate(payProperties.getOrderNoPrefix()));
PayDivideBackRespDto payDivideBackRespDto = client.unifiedDivideback(payDivideBackUnifiedDto); PayDivideBackRespDto payDivideBackRespDto = client.unifiedDivideback(payDivideBackUnifiedDto);
log.info("订单:"+payDivideBackRespDto.getOrderId()+"回退结果:"+payDivideBackRespDto.getResult()); log.info("订单:" + payDivideBackRespDto.getOrderId() + "回退结果:" + payDivideBackRespDto.getResult());
} }
@Override @Override
@ -740,7 +754,7 @@ public class DivideServiceImpl implements DivideService {
cardDO.setChangeMoney(changeMoney); cardDO.setChangeMoney(changeMoney);
cardDO.setType("7"); cardDO.setType("7");
BigDecimal oldMoney = lastCardDO.getMoney(); BigDecimal oldMoney = lastCardDO.getMoney();
BigDecimal wxOldMoney= lastCardDO.getWxAmount(); BigDecimal wxOldMoney = lastCardDO.getWxAmount();
cardDO.setMoney(oldMoney.subtract(changeMoney).setScale(2, BigDecimal.ROUND_HALF_UP)); cardDO.setMoney(oldMoney.subtract(changeMoney).setScale(2, BigDecimal.ROUND_HALF_UP));
cardDO.setWxAmount(wxOldMoney.subtract(changeMoney).setScale(2, BigDecimal.ROUND_HALF_UP)); cardDO.setWxAmount(wxOldMoney.subtract(changeMoney).setScale(2, BigDecimal.ROUND_HALF_UP));