From 201da3b318528454adbff4885bee1af09097346e Mon Sep 17 00:00:00 2001 From: seesaw Date: Wed, 14 Aug 2024 11:34:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E8=B4=A6=E5=9B=9E=E9=80=80=E6=9B=B4?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataobject/divideinfo/DivideInfoDO.java | 5 + .../pay/service/divide/DivideServiceImpl.java | 152 ++++++++++-------- 2 files changed, 88 insertions(+), 69 deletions(-) diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/divideinfo/DivideInfoDO.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/divideinfo/DivideInfoDO.java index 25cf1ce5..e3b24a66 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/divideinfo/DivideInfoDO.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/divideinfo/DivideInfoDO.java @@ -56,10 +56,15 @@ public class DivideInfoDO extends BaseDO { * 分账接收方账号 */ private String account; + /** * 分账金额 */ private Integer amount; + /** + * 可用于分账回退的金额 + */ + private Integer refundAmount; /** * 估算金额 */ diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/divide/DivideServiceImpl.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/divide/DivideServiceImpl.java index e2f5e91f..e5936886 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/divide/DivideServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/divide/DivideServiceImpl.java @@ -154,6 +154,7 @@ public class DivideServiceImpl implements DivideService { .setType(divideCompanyDO.getType()) .setAccount(divideCompanyDO.getAccount()) .setAmount(money) + .setRefundAmount(money) .setComputeAmount(money) .setDescription("给" + divideCompanyDO.getName() + "分账"); infoDOList.add(divideInfoDO); @@ -185,14 +186,14 @@ public class DivideServiceImpl implements DivideService { refundToday = BigDecimal.ZERO; } int refund = refundToday.multiply(new BigDecimal("100")).intValue(); - money = money-refund; + money = money - refund; //查询29天内的充值订单,原因:微信30天自动解冻,订单将不能分账 LocalDateTime now = LocalDateTime.now(); LocalDateTime thirtyDaysAgo = now.minusDays(29); List divideDOS = divideMapper.selectList(Wrappers.lambdaQuery() .eq(DivideDO::getStatus, PayDivideStatusRespEnum.WAITING.getStatus()) - .eq(DivideDO::getUnfreezeStatus,"0") + .eq(DivideDO::getUnfreezeStatus, "0") .ge(DivideDO::getCreateTime, thirtyDaysAgo) .orderByAsc(DivideDO::getCreateTime)); if (CollectionUtil.isEmpty(divideDOS)) { @@ -205,7 +206,7 @@ public class DivideServiceImpl implements DivideService { for (DivideDO divideDO : divideDOS) { Integer totalPrice = divideDO.getTotalPrice() - divideDO.getCpPrice(); - if(totalPrice == 0){ + if (totalPrice == 0) { continue; } @@ -214,19 +215,19 @@ public class DivideServiceImpl implements DivideService { if (sum < money) { divideDO.setUnPrice(totalPrice); divideDO.setCpPrice(divideDO.getCpPrice() + totalPrice); - divideDO.setPsPrice(divideDO.getPsPrice()+totalPrice); + divideDO.setPsPrice(divideDO.getPsPrice() + totalPrice); divideList.add(divideDO); } else if (sum == money) { divideDO.setUnPrice(totalPrice); divideDO.setCpPrice(divideDO.getCpPrice() + totalPrice); - divideDO.setPsPrice(divideDO.getPsPrice()+totalPrice); + divideDO.setPsPrice(divideDO.getPsPrice() + totalPrice); divideList.add(divideDO); break; } else { int leftMoney = money + totalPrice - sum; divideDO.setUnPrice(leftMoney); divideDO.setCpPrice(divideDO.getCpPrice() + leftMoney); - divideDO.setPsPrice(divideDO.getPsPrice()+leftMoney); + divideDO.setPsPrice(divideDO.getPsPrice() + leftMoney); divideList.add(divideDO); break; } @@ -266,7 +267,7 @@ public class DivideServiceImpl implements DivideService { } } } - if(CollectionUtil.isNotEmpty(divideRecordDOList)){ + if (CollectionUtil.isNotEmpty(divideRecordDOList)) { divideMapper.updateBatch(divideDOS); divideRecordMapper.insertBatch(divideRecordDOList); } @@ -300,7 +301,7 @@ public class DivideServiceImpl implements DivideService { payDivideUnifiedDto.setTransactionId(divideDO.getChannelOrderNo()) .setOutOrderNo(divideDO.getNo()); 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())) { divideDO.setStatus(PayDivideStatusRespEnum.COMPLETE.getStatus()); @@ -312,13 +313,13 @@ public class DivideServiceImpl implements DivideService { return divideDOS.size(); } - void updateDivideInfo(List receivers, String outOrderNo,String orderId) { + void updateDivideInfo(List receivers, String outOrderNo, String orderId) { List list1 = divideCompanyService.getList(); List accountList = list1.stream().map(DivideCompanyDO::getAccount).collect(Collectors.toList()); List list = new ArrayList<>(); for (ProfitSharingV3Result.Receiver receiver : receivers) { - if(!accountList.contains(receiver.getAccount())){ + if (!accountList.contains(receiver.getAccount())) { continue; } @@ -378,19 +379,19 @@ public class DivideServiceImpl implements DivideService { //判断是否有金额可退款 BigDecimal wxAmount = divideMapper.getWxAmount(drawMoneyVO.getUserId()); - if(wxAmount == null){ + if (wxAmount == null) { throw new ServiceException(WX_ACCOUNT_NO); } //判断是否有金额可退款 int money = wxAmount.multiply(new BigDecimal("100")).intValue(); - if (money <= 0 ) { + if (money <= 0) { throw new ServiceException(WX_ACCOUNT_NO); } //指定金额 - if(drawMoneyVO.getTotalPrice()!=null){ - if (money < drawMoneyVO.getTotalPrice() ) { + if (drawMoneyVO.getTotalPrice() != null) { + if (money < drawMoneyVO.getTotalPrice()) { throw new ServiceException(WX_ACCOUNT_NO); } money = drawMoneyVO.getTotalPrice(); @@ -402,7 +403,7 @@ public class DivideServiceImpl implements DivideService { List divideDOS = divideMapper.selectList(Wrappers.lambdaQuery() .eq(DivideDO::getChannelUserId, drawMoneyVO.getChannelUserId()) .eq(DivideDO::getRefundStatus, "0") - .ge(DivideDO::getCreateTime,threeYearsAgo) + .ge(DivideDO::getCreateTime, threeYearsAgo) .orderByDesc(DivideDO::getCreateTime)); //筛选出未分账的订单 @@ -432,12 +433,12 @@ public class DivideServiceImpl implements DivideService { if (sum < money) { divideDO.setUnRePrice(totalPrice); - divideDO.setRefundPrice(totalPrice+divideDO.getCpPrice()); + divideDO.setRefundPrice(totalPrice + divideDO.getCpPrice()); divideDO.setCpPrice(divideDO.getCpPrice() + totalPrice); noBackList.add(divideDO); } else if (sum == money) { divideDO.setUnRePrice(totalPrice); - divideDO.setRefundPrice(totalPrice+divideDO.getCpPrice()); + divideDO.setRefundPrice(totalPrice + divideDO.getCpPrice()); divideDO.setCpPrice(divideDO.getCpPrice() + totalPrice); noBackList.add(divideDO); break; @@ -453,7 +454,7 @@ public class DivideServiceImpl implements DivideService { //从分账完的订单进行退款 if (sum < money) { for (DivideDO divideDO : divideList) { - Integer totalPrice = divideDO.getTotalPrice()-divideDO.getRefundPrice(); + Integer totalPrice = divideDO.getTotalPrice() - divideDO.getRefundPrice(); sum = sum + totalPrice; @@ -473,9 +474,9 @@ public class DivideServiceImpl implements DivideService { } else { int leftMoney = money + totalPrice - sum; divideDO.setUnRePrice(leftMoney); - divideDO.setRefundPrice(leftMoney+divideDO.getRefundPrice()); + divideDO.setRefundPrice(leftMoney + divideDO.getRefundPrice()); divideDO.setBackPrice(leftMoney); - divideDO.setPsPrice(divideDO.getPsPrice()-leftMoney); + divideDO.setPsPrice(divideDO.getPsPrice() - leftMoney); backList.add(divideDO); break; } @@ -489,7 +490,7 @@ public class DivideServiceImpl implements DivideService { Integer totalPrice = divideDO.getTotalPrice() - divideDO.getCpPrice(); sum = sum + totalPrice; if (sum < money) { - if("0".equals(divideDO.getUnfreezeStatus())){ + if ("0".equals(divideDO.getUnfreezeStatus())) { //先解冻剩余资金 String unFreeNo = noRedisDAO.generate(payProperties.getOrderNoPrefix()); PayClient client = channelService.getPayClient(divideDO.getChannelId()); @@ -515,27 +516,27 @@ public class DivideServiceImpl implements DivideService { PayDivideRespDto payDivideRespDto = client.unifiedDivideResult(resultDto); 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; - if (sum <= money){ + sum = sum - totalPrice + psPrice; + if (sum <= money) { divideDO.setUnRePrice(psPrice); divideDO.setRefundPrice(divideDO.getTotalPrice()); divideDO.setBackPrice(divideDO.getPsPrice()); divideDO.setPsPrice(0); - }else{ - int left = money-sum+psPrice; + } else { + int left = money - sum + psPrice; 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.setPsPrice(divideDO.getPsPrice()-back); + divideDO.setPsPrice(divideDO.getPsPrice() - back); } backList.add(divideDO); divideDO.setCpPrice(divideDO.getTotalPrice()); @@ -543,7 +544,7 @@ public class DivideServiceImpl implements DivideService { //计算使用资金 Integer useMoney = sum - money; divideDO.setUnRePrice(useMoney); - divideDO.setRefundPrice(useMoney+divideDO.getRefundPrice()); + divideDO.setRefundPrice(useMoney + divideDO.getRefundPrice()); divideDO.setCpPrice(divideDO.getCpPrice() + useMoney); noBackList.add(divideDO); } @@ -556,7 +557,7 @@ public class DivideServiceImpl implements DivideService { int failNum = 0; //调用退款接口 - if(CollectionUtil.isNotEmpty(noBackList)){ + if (CollectionUtil.isNotEmpty(noBackList)) { for (DivideDO divideDO : noBackList) { String outRefundNo = noRedisDAO.generate(payProperties.getRefundNoPrefix()); RefundRecordDO refundRecordDO = new RefundRecordDO(); @@ -581,24 +582,24 @@ public class DivideServiceImpl implements DivideService { String channelRefundNo = payRefundRespDTO.getChannelRefundNo(); 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()); } else if (cn.iocoder.yudao.framework.pay.core.enums.refund.PayRefundStatusRespEnum.SUCCESS.getStatus().equals(payRefundRespDTO.getStatus())) { refundRecordDO.setStatus(PayDivideRefundStatusRespEnum.SUCCESS.getStatus()); - }else { + } else { failNum++; refundRecordDO.setStatus(PayDivideRefundStatusRespEnum.ABNORMAL.getStatus()); } refundRecordMapper.insert(refundRecordDO); - if(divideDO.getRefundPrice().equals(divideDO.getTotalPrice())){ + if (divideDO.getRefundPrice().equals(divideDO.getTotalPrice())) { divideDO.setRefundStatus("1"); } - if(divideDO.getTotalPrice().equals(divideDO.getCpPrice())){ + if (divideDO.getTotalPrice().equals(divideDO.getCpPrice())) { divideDO.setStatus(PayDivideStatusRespEnum.CASH.getStatus()); } String jsonString = JsonUtils.toJsonString(divideDO); //DivideDO divideDO1 = JsonUtils.parseObject(jsonString, DivideDO.class); - divideRedisTemplate.opsForValue().set("R"+outRefundNo,jsonString); + divideRedisTemplate.opsForValue().set("R" + outRefundNo, jsonString); //divideMapper.updateById(divideDO); //list.add(refundRecordDO); @@ -606,7 +607,7 @@ public class DivideServiceImpl implements DivideService { } //调用退款接口 - if(CollectionUtil.isNotEmpty(backList)){ + if (CollectionUtil.isNotEmpty(backList)) { for (DivideDO divideDO : backList) { String outRefundNo = noRedisDAO.generate(payProperties.getRefundNoPrefix()); RefundRecordDO refundRecordDO = new RefundRecordDO(); @@ -631,25 +632,25 @@ public class DivideServiceImpl implements DivideService { String channelRefundNo = payRefundRespDTO.getChannelRefundNo(); 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()); } else if (cn.iocoder.yudao.framework.pay.core.enums.refund.PayRefundStatusRespEnum.SUCCESS.getStatus().equals(payRefundRespDTO.getStatus())) { refundRecordDO.setStatus(PayDivideRefundStatusRespEnum.SUCCESS.getStatus()); - }else { + } else { failNum++; refundRecordDO.setStatus(PayDivideRefundStatusRespEnum.ABNORMAL.getStatus()); } //list.add(refundRecordDO); refundRecordMapper.insert(refundRecordDO); - if(divideDO.getRefundPrice().equals(divideDO.getTotalPrice())){ + if (divideDO.getRefundPrice().equals(divideDO.getTotalPrice())) { divideDO.setRefundStatus("1"); } - if(divideDO.getTotalPrice().equals(divideDO.getCpPrice())){ + if (divideDO.getTotalPrice().equals(divideDO.getCpPrice())) { divideDO.setStatus(PayDivideStatusRespEnum.CASH.getStatus()); } String jsonString = JsonUtils.toJsonString(divideDO); //DivideDO divideDO1 = JsonUtils.parseObject(jsonString, DivideDO.class); - divideRedisTemplate.opsForValue().set("R"+outRefundNo,jsonString); + divideRedisTemplate.opsForValue().set("R" + outRefundNo, jsonString); //divideMapper.updateById(divideDO); } @@ -662,7 +663,7 @@ public class DivideServiceImpl implements DivideService { //refundRecordMapper.insertBatch(list); // todo:清空 - return failNum>0?false:true; + return failNum > 0 ? false : true; } private String genChannelRefundNotifyUrl(PayChannelDO channel) { @@ -670,58 +671,71 @@ public class DivideServiceImpl implements DivideService { } @Override - public void returnMoney(List backList){ + public void returnMoney(List backList) { List companyList = divideCompanyService.getList(); Map companyMap = companyList.stream().collect(Collectors.toMap(DivideCompanyDO::getName, vo -> vo)); - - for(DivideDO divideDO:backList){ + //更新可分账回退金额 + List updateList = new ArrayList<>(); + for (DivideDO divideDO : backList) { PayClient client = channelService.getPayClient(divideDO.getChannelId()); //查询出分账的具体条数 List 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{ - Integer refundPrice = divideDO.getRefundPrice(); + } else { + Integer refundPrice = divideDO.getBackPrice(); //算出每个公司应回退的金额 - for(DivideCompanyDO companyDO:companyList){ - int backmoney = (int) Math.ceil(refundPrice* Double.valueOf(companyDO.getProportion())); + for (DivideCompanyDO companyDO : companyList) { + int backmoney = (int) Math.ceil(refundPrice * Double.valueOf(companyDO.getProportion())); List baList = divideListByTi.stream().filter(vo -> vo.getName().equals(companyDO.getName())).collect(Collectors.toList()); int sum = 0; - for (DivideInfoDO infoDO : baList){ - sum = sum+infoDO.getAmount(); - if(sum