From 37f3d16b75bb388d665c93ff0ed3945093df42bc Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期四, 07 十一月 2024 20:09:35 +0800 Subject: [PATCH] add:钱包功能调整 --- src/main/java/com/mzl/flower/service/wallet/WalletBillRecordService.java | 2 src/main/java/com/mzl/flower/mapper/payment/OrderSettlementDetailMapper.java | 2 src/main/java/com/mzl/flower/mapper/wallet/WalletBillRecordMapper.java | 6 + src/main/resources/mapper/payment/OrderSettlementDetailMapper.xml | 14 ++ src/main/java/com/mzl/flower/schedule/ScheduleService.java | 97 +++++++++++++++++++ src/main/java/com/mzl/flower/dto/response/payment/OrderSettlementDetailDTO.java | 7 + src/main/java/com/mzl/flower/service/impl/wallet/WalletWithdrawRecordServiceImpl.java | 36 ++++-- src/main/java/com/mzl/flower/service/impl/wallet/WalletBillRecordServiceImpl.java | 79 ++++++++------- 8 files changed, 193 insertions(+), 50 deletions(-) diff --git a/src/main/java/com/mzl/flower/dto/response/payment/OrderSettlementDetailDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/OrderSettlementDetailDTO.java index 75794f2..8a25482 100644 --- a/src/main/java/com/mzl/flower/dto/response/payment/OrderSettlementDetailDTO.java +++ b/src/main/java/com/mzl/flower/dto/response/payment/OrderSettlementDetailDTO.java @@ -57,4 +57,11 @@ private String orderNo; private String orderId; + + private Long supplierId;//供应商id + + private String settlementId; + + private String orderItemId; + } diff --git a/src/main/java/com/mzl/flower/mapper/payment/OrderSettlementDetailMapper.java b/src/main/java/com/mzl/flower/mapper/payment/OrderSettlementDetailMapper.java index 34bfde8..7751a6f 100644 --- a/src/main/java/com/mzl/flower/mapper/payment/OrderSettlementDetailMapper.java +++ b/src/main/java/com/mzl/flower/mapper/payment/OrderSettlementDetailMapper.java @@ -11,4 +11,6 @@ @Repository public interface OrderSettlementDetailMapper extends BaseMapper<OrderSettlementDetail> { List<OrderSettlementDetailDTO> selectSettlementDetailList(@Param("settlementId") String settlementId); + + List<OrderSettlementDetailDTO> selectSettlementDetailLists(); } diff --git a/src/main/java/com/mzl/flower/mapper/wallet/WalletBillRecordMapper.java b/src/main/java/com/mzl/flower/mapper/wallet/WalletBillRecordMapper.java index 759723c..069bc6f 100644 --- a/src/main/java/com/mzl/flower/mapper/wallet/WalletBillRecordMapper.java +++ b/src/main/java/com/mzl/flower/mapper/wallet/WalletBillRecordMapper.java @@ -7,6 +7,7 @@ import com.mzl.flower.dto.response.wallet.WalletBillRecordVO; import com.mzl.flower.entity.wallet.WalletBillRecordDO; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; import org.springframework.stereotype.Repository; import java.util.List; @@ -28,5 +29,10 @@ List<WalletBillRecordVO> getPage(Page page, @Param("dto") QueryWalletBillDTO dto); List<WalletBillRecordVO> getPageByDesc(Page page, @Param("dto") QueryWalletBillDTO dto); + + + @Select("select * from t_wallet_withdraw_record where withdraw_record_id = #{withdrawRecordId}") + WalletBillRecordDO getBillRecordByWithdrawRecordId(Long withdrawRecordId); + } diff --git a/src/main/java/com/mzl/flower/schedule/ScheduleService.java b/src/main/java/com/mzl/flower/schedule/ScheduleService.java index e83425a..36afd60 100644 --- a/src/main/java/com/mzl/flower/schedule/ScheduleService.java +++ b/src/main/java/com/mzl/flower/schedule/ScheduleService.java @@ -3,15 +3,22 @@ import com.aliyuncs.exceptions.ClientException; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.mzl.flower.constant.Constants; +import com.mzl.flower.constant.LockConstants; import com.mzl.flower.dto.response.member.MemberGrowthRecordVO; +import com.mzl.flower.dto.response.payment.OrderSettlementDetailDTO; import com.mzl.flower.entity.flower.FlowerCategory; import com.mzl.flower.entity.partner.Partner; import com.mzl.flower.entity.payment.Order; import com.mzl.flower.entity.payment.Transfer; +import com.mzl.flower.entity.wallet.WalletBillRecordDO; +import com.mzl.flower.entity.wallet.WalletDO; import com.mzl.flower.mapper.flower.FlowerCategoryMapper; import com.mzl.flower.mapper.member.MemberGrowthRecordMapper; import com.mzl.flower.mapper.partner.PartnerMapper; import com.mzl.flower.mapper.payment.OrderMapper; +import com.mzl.flower.mapper.payment.OrderSettlementDetailMapper; +import com.mzl.flower.mapper.wallet.WalletBillRecordMapper; +import com.mzl.flower.mapper.wallet.WalletMapper; import com.mzl.flower.service.BaseService; import com.mzl.flower.service.coupon.CouponRecordService; import com.mzl.flower.service.coupon.CouponTemplateService2; @@ -19,21 +26,28 @@ import com.mzl.flower.service.menber.impl.GrowthValueDealService; import com.mzl.flower.service.payment.*; import com.mzl.flower.service.wallet.WalletBillRecordService; +import com.mzl.flower.service.wallet.WalletService; import com.mzl.flower.thread.FlowerCategoryPriceThread; import com.mzl.flower.utils.SmsUtil; +import com.mzl.flower.utils.UUIDGenerator; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.time.DateFormatUtils; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Profile; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; +import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.TimeUnit; @Component @Slf4j @@ -86,6 +100,21 @@ @Autowired private WalletBillRecordService walletBillRecordService; + + @Autowired + private OrderSettlementDetailMapper orderSettlementDetailMapper; + + @Autowired + private WalletService walletService; + + @Autowired + private RedissonClient redissonClient; + + @Autowired + private WalletBillRecordMapper walletBillRecordMapper; + + @Autowired + private WalletMapper walletMapper; @Scheduled(cron = "1 1 0/2 * * ?") @@ -291,4 +320,72 @@ log.info("供应商下单供货提示结束:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")); } + public void dealHistoryAmount() { + log.info("处理历史结算金额开始:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")); + List<OrderSettlementDetailDTO> orderSettlementDetailDTOS = orderSettlementDetailMapper.selectSettlementDetailLists(); + orderSettlementDetailDTOS.forEach(o->{ + BigDecimal totalAmount = new BigDecimal(0);//交易合计 + BigDecimal checkFee = new BigDecimal(0);//降级扣款 + BigDecimal lackFee = new BigDecimal(0);//缺货扣款 + BigDecimal replaceFee = new BigDecimal(0);//补货扣款 + BigDecimal stationFee = new BigDecimal(0);//集货站运费 + BigDecimal salesFee = new BigDecimal(0);//售后理赔 + + totalAmount = totalAmount.add(o.getTotalAmount()); + checkFee = checkFee.add(o.getCheckFee()); + lackFee = lackFee.add(o.getLackFee() == null ? new BigDecimal(0): o.getLackFee()); + replaceFee = replaceFee.add(o.getReplaceFee() == null ? new BigDecimal(0): o.getReplaceFee()); + stationFee = stationFee.add(o.getStationFee()); + salesFee = salesFee.add(o.getSalesFee()); + + BigDecimal settlementAmount = totalAmount.subtract(checkFee).subtract(lackFee).subtract(replaceFee) + .subtract(salesFee).subtract(stationFee);//结算金额 + + WalletDO walletDO = walletService.getOrCreateBySupplierId(o.getSupplierId()); + RLock lock = redissonClient.getLock(String.format(LockConstants.WALLET_ID_KEY, walletDO.getId())); + try { + if (lock.tryLock(10, 30, TimeUnit.SECONDS)) { + try { + if(settlementAmount.compareTo(BigDecimal.ZERO) > 0) { + WalletBillRecordDO walletBillRecord = new WalletBillRecordDO(); + walletBillRecord.setId(UUIDGenerator.getUUID()); + WalletDO walletDOInfo = walletService.getBySupplierId(o.getSupplierId()); + //增加供应商结算金额保存到钱包 + walletBillRecord.setSupplierId(o.getSupplierId()); + walletBillRecord.setWalletId(walletDOInfo.getId()); + walletBillRecord.setSettlementId(o.getSettlementId()); + walletBillRecord.setOrderItemId(o.getOrderItemId()); + //变动金额等于供应商收入 + walletBillRecord.setTotalAmount(settlementAmount); + walletBillRecord.setType(Constants.BILL_CHANGE_TYPE.settlement.name()); + walletBillRecord.setMethod(Constants.BILL_CHANGE_METHOD.add.name()); + walletBillRecord.setOriginalAmount(walletDOInfo.getTotalAmount()); + walletBillRecord.setChangeAmount(settlementAmount); + walletBillRecord.setBalance(walletDOInfo.getWithdrawableAmount().add(settlementAmount)); + Order order = orderMapper.selectById(o.getOrderId()); + if (!ObjectUtils.isEmpty(order)) { + walletBillRecord.setRemark("订单完成(订单号" + order.getOrderNo() + ")" + ",获得收入"); + walletBillRecord.setOrderNo(order.getOrderNo()); + } + //更新钱包 + //可提现金额=钱包余额=结算金额 + walletDOInfo.setWithdrawableAmount(walletDOInfo.getWithdrawableAmount().add(settlementAmount)); + walletDOInfo.setTotalAmount(walletDOInfo.getWithdrawableAmount()); + //已结算金额 + walletDOInfo.setSettledAmount(walletDOInfo.getSettledAmount().add(settlementAmount)); + walletMapper.updateById(walletDOInfo); + walletBillRecord.create(); + walletBillRecordMapper.insert(walletBillRecord); + } + } finally { + lock.unlock(); + } + } + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + }); + log.info("处理历史结算金额完成:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")); + } + } diff --git a/src/main/java/com/mzl/flower/service/impl/wallet/WalletBillRecordServiceImpl.java b/src/main/java/com/mzl/flower/service/impl/wallet/WalletBillRecordServiceImpl.java index 0420cbe..948c25c 100644 --- a/src/main/java/com/mzl/flower/service/impl/wallet/WalletBillRecordServiceImpl.java +++ b/src/main/java/com/mzl/flower/service/impl/wallet/WalletBillRecordServiceImpl.java @@ -98,47 +98,48 @@ if ("SUCCESS".equals(dStatus)) { walletBillRecordDO.setTransferState(Constants.SETTLEMENT_STATUS.COMPLETED.name()); walletBillRecordDO.update("sys"); + walletBillRecordDO.setRemark("微信商户转账成功"); walletBillRecordMapper.updateById(walletBillRecordDO); //更新钱包 - WalletDO walletDO = walletService.getOrCreateBySupplierId(walletBillRecordDO.getWalletId()); - RLock lock = redissonClient.getLock(String.format(LockConstants.WALLET_ID_KEY, walletDO.getId())); - try { - if (lock.tryLock(10, 30, TimeUnit.SECONDS)) { - try { - if (!ObjectUtils.isEmpty(walletDO)) { - WalletBillRecordDO walletBillRecordDO2 = new WalletBillRecordDO(); - walletBillRecordDO2.setId(UUIDGenerator.getUUID()); - walletBillRecordDO2.setSupplierId(walletDO.getSupplierId()); - walletBillRecordDO2.setWalletId(walletDO.getId()); - walletBillRecordDO2.setType(Constants.BILL_CHANGE_TYPE.withdraw.name()); - // 发起提现 - walletBillRecordDO2.setWithdrawType(Constants.BILL_WITHDRAW_TYPE.success.name()); - walletBillRecordDO2.setMethod(Constants.BILL_CHANGE_METHOD.reduce.name()); - walletBillRecordDO2.setOriginalAmount(walletDO.getWithdrawableAmount()); - walletBillRecordDO2.setChangeAmount(BigDecimal.ZERO); - walletBillRecordDO2.setBalance(walletDO.getWithdrawableAmount()); - walletBillRecordDO2.create(SecurityUtils.getUserId()); - walletBillRecordDO.setId(UUIDGenerator.getUUID()); - // 保存账单明细 - walletBillRecordService.save(walletBillRecordDO); - //提现中金额:减少提现中金额 - walletDO.setWithdrawingAmount(walletDO.getWithdrawingAmount().subtract(walletBillRecordDO.getChangeAmount())); - //已提现金额:增加已提现金额 - walletDO.setWithdrawnAmount(walletDO.getWithdrawnAmount().add(walletBillRecordDO.getChangeAmount())); - walletMapper.updateById(walletDO); - } - } finally { - lock.unlock(); - } - } - } catch (InterruptedException e) { - throw new RuntimeException(e); - } +// WalletDO walletDO = walletService.getOrCreateBySupplierId(walletBillRecordDO.getWalletId()); +// RLock lock = redissonClient.getLock(String.format(LockConstants.WALLET_ID_KEY, walletDO.getId())); +// try { +// if (lock.tryLock(10, 30, TimeUnit.SECONDS)) { +// try { +// if (!ObjectUtils.isEmpty(walletDO)) { +// WalletBillRecordDO walletBillRecordDO2 = new WalletBillRecordDO(); +// walletBillRecordDO2.setId(UUIDGenerator.getUUID()); +// walletBillRecordDO2.setSupplierId(walletDO.getSupplierId()); +// walletBillRecordDO2.setWalletId(walletDO.getId()); +// walletBillRecordDO2.setType(Constants.BILL_CHANGE_TYPE.withdraw.name()); +// // 发起提现 +// walletBillRecordDO2.setWithdrawType(Constants.BILL_WITHDRAW_TYPE.success.name()); +// walletBillRecordDO2.setMethod(Constants.BILL_CHANGE_METHOD.reduce.name()); +// walletBillRecordDO2.setOriginalAmount(walletDO.getWithdrawableAmount()); +// walletBillRecordDO2.setChangeAmount(BigDecimal.ZERO); +// walletBillRecordDO2.setBalance(walletDO.getWithdrawableAmount()); +// walletBillRecordDO2.create(SecurityUtils.getUserId()); +// walletBillRecordDO.setId(UUIDGenerator.getUUID()); +// // 保存账单明细 +// walletBillRecordService.save(walletBillRecordDO); +// //提现中金额:减少提现中金额 +// walletDO.setWithdrawingAmount(walletDO.getWithdrawingAmount().subtract(walletBillRecordDO.getChangeAmount())); +// //已提现金额:增加已提现金额 +// walletDO.setWithdrawnAmount(walletDO.getWithdrawnAmount().add(walletBillRecordDO.getChangeAmount())); +// walletMapper.updateById(walletDO); +// } +// } finally { +// lock.unlock(); +// } +// } +// } catch (InterruptedException e) { +// throw new RuntimeException(e); +// } //回写提现状态 if (StringUtils.isEmpty(walletBillRecordDO.getWithdrawRecordId())) { WalletWithdrawRecordDO withdrawRecordDO = walletWithdrawRecordMapper.selectById(walletBillRecordDO.getWithdrawRecordId()); withdrawRecordDO.setWithdrawState(Constants.BILL_WITHDRAW_TYPE.success.name()); - walletBillRecordDO.setRemark("账户资金提现完成"); + walletBillRecordDO.setRemark("微信商户转账成功"); walletWithdrawRecordMapper.updateById(withdrawRecordDO); } @@ -166,6 +167,7 @@ walletBillRecordDO2.setBalance(walletDO.getWithdrawableAmount().add(walletBillRecordDO.getActualTransferAmount())); walletBillRecordDO2.create(SecurityUtils.getUserId()); walletBillRecordDO.setId(UUIDGenerator.getUUID()); + walletBillRecordDO.setRemark("微信商户转账失败,余额返还钱包"); // 保存账单明细 walletBillRecordService.save(walletBillRecordDO); //提现中金额:减少提现中金额 @@ -185,7 +187,7 @@ if (StringUtils.isEmpty(walletBillRecordDO.getWithdrawRecordId())) { WalletWithdrawRecordDO withdrawRecordDO = walletWithdrawRecordMapper.selectById(walletBillRecordDO.getWithdrawRecordId()); withdrawRecordDO.setWithdrawState(Constants.BILL_WITHDRAW_TYPE.fail.name()); - walletBillRecordDO.setRemark("账户资金提现失败"); + walletBillRecordDO.setRemark("微信商户转账失败,余额返还钱包"); walletWithdrawRecordMapper.updateById(withdrawRecordDO); } } @@ -245,4 +247,9 @@ page.setRecords(list); return page; } + + @Override + public WalletBillRecordDO getBillRecordByWithdrawRecordId(Long withdrawRecordId) { + return walletBillRecordMapper.getBillRecordByWithdrawRecordId(withdrawRecordId); + } } diff --git a/src/main/java/com/mzl/flower/service/impl/wallet/WalletWithdrawRecordServiceImpl.java b/src/main/java/com/mzl/flower/service/impl/wallet/WalletWithdrawRecordServiceImpl.java index 7ed59d2..2e6110f 100644 --- a/src/main/java/com/mzl/flower/service/impl/wallet/WalletWithdrawRecordServiceImpl.java +++ b/src/main/java/com/mzl/flower/service/impl/wallet/WalletWithdrawRecordServiceImpl.java @@ -150,6 +150,8 @@ walletBillRecordDO.setChangeAmount(dto.getAmount()); walletBillRecordDO.setBalance(walletDO.getWithdrawableAmount().subtract(dto.getAmount())); walletBillRecordDO.create(SecurityUtils.getUserId()); + walletBillRecordDO.setWithdrawRecordId(withdrawRecordDO.getId()); + walletBillRecordDO.setRemark("提现中"); // 保存账单明细 walletBillRecordService.save(walletBillRecordDO); @@ -252,17 +254,21 @@ transferReqDTO.setRemarks(remarks); //保存账单信息 - WalletBillRecordDO walletBillRecordDO = new WalletBillRecordDO(); - walletBillRecordDO.setSupplierId(s.getId()); - walletBillRecordDO.setType(Constants.BILL_CHANGE_TYPE.withdraw.name()); - walletBillRecordDO.setWithdrawType(Constants.BILL_WITHDRAW_TYPE.success.name()); - walletBillRecordDO.setMethod(Constants.BILL_CHANGE_METHOD.reduce.name()); - walletBillRecordDO.setTransferId(transferReqDTO.getId()); - walletBillRecordDO.setWithdrawRecordId(withdrawRecordDO.getId()); - walletBillRecordDO.create(); - walletBillRecordDO.setOriginalAmount(walletDO.getWithdrawableAmount()); - walletBillRecordDO.setChangeAmount(BigDecimal.ZERO); - walletBillRecordDO.setBalance(walletDO.getWithdrawableAmount()); +// WalletBillRecordDO walletBillRecordDO = new WalletBillRecordDO(); +// walletBillRecordDO.setSupplierId(s.getId()); +// walletBillRecordDO.setType(Constants.BILL_CHANGE_TYPE.withdraw.name()); +// walletBillRecordDO.setWithdrawType(Constants.BILL_WITHDRAW_TYPE.success.name()); +// walletBillRecordDO.setMethod(Constants.BILL_CHANGE_METHOD.reduce.name()); +// walletBillRecordDO.setTransferId(transferReqDTO.getId()); +// walletBillRecordDO.setWithdrawRecordId(withdrawRecordDO.getId()); +// walletBillRecordDO.create(); +// walletBillRecordDO.setOriginalAmount(walletDO.getWithdrawableAmount()); +// walletBillRecordDO.setChangeAmount(BigDecimal.ZERO); +// walletBillRecordDO.setBalance(walletDO.getWithdrawableAmount()); + WalletBillRecordDO walletBillRecordDO = walletBillRecordService.getBillRecordByWithdrawRecordId(withdrawRecordDO.getId()); + if(ObjectUtils.isEmpty(walletBillRecordDO)){ + throw new ValidationException("提现没有对应的账单信息"); + } //提现金额 BigDecimal withdrawAmount = withdrawRecordDO.getAmount(); @@ -283,17 +289,18 @@ transferReqDTO.setDetails(details); try { //发起转账 - // paymentV3Service.doBatchTransfer(transferReqDTO, SecurityUtils.getUserId()); + paymentV3Service.doBatchTransfer(transferReqDTO, SecurityUtils.getUserId()); } catch (Exception e) { throw new ValidationException(e.getMessage()); } } //记录转账状态,定时任务定时获取状态并更新钱包交易记录表信息 - walletBillRecordDO.setRemark("账户资金提现中"); + walletBillRecordDO.setRemark("微信商户转账中"); walletBillRecordDO.setActualTransferAmount(withdrawAmount); walletBillRecordDO.setId(UUIDGenerator.getUUID()); - walletBillRecordMapper.insert(walletBillRecordDO); + walletBillRecordService.updateById(walletBillRecordDO); +// walletBillRecordMapper.insert(walletBillRecordDO); //不需要更新结算单了,此时提现的金额和计算单上的金额不一致 } } finally { @@ -336,6 +343,7 @@ walletBillRecordDO.setBalance(walletDO.getWithdrawableAmount().add(withdrawRecordDO.getAmount())); walletBillRecordDO.create(SecurityUtils.getUserId()); walletBillRecordDO.setId(UUIDGenerator.getUUID()); + walletBillRecordDO.setRemark("平台审核拒绝,余额返还钱包"); // 保存账单明细 walletBillRecordService.save(walletBillRecordDO); diff --git a/src/main/java/com/mzl/flower/service/wallet/WalletBillRecordService.java b/src/main/java/com/mzl/flower/service/wallet/WalletBillRecordService.java index 7f347f1..cfc9afc 100644 --- a/src/main/java/com/mzl/flower/service/wallet/WalletBillRecordService.java +++ b/src/main/java/com/mzl/flower/service/wallet/WalletBillRecordService.java @@ -34,4 +34,6 @@ Page<WalletBillRecordVO> getPage(Page page, QueryWalletBillDTO dto); Page<WalletBillRecordVO> getPageByDesc(Page page, QueryWalletBillDTO dto); + + WalletBillRecordDO getBillRecordByWithdrawRecordId(Long withdrawRecordId); } diff --git a/src/main/resources/mapper/payment/OrderSettlementDetailMapper.xml b/src/main/resources/mapper/payment/OrderSettlementDetailMapper.xml index 6c199d5..a16d0bc 100644 --- a/src/main/resources/mapper/payment/OrderSettlementDetailMapper.xml +++ b/src/main/resources/mapper/payment/OrderSettlementDetailMapper.xml @@ -12,4 +12,18 @@ ORDER BY o.receive_time desc, o.id, oi.flower_name </select> + + <select id="selectSettlementDetailLists" resultType="com.mzl.flower.dto.response.payment.OrderSettlementDetailDTO"> + SELECT s.*, oi.flower_name, oi.flower_level, o.receive_time, oi.check_time, o.order_no, s.order_id, oi.supplier_id + FROM t_order_settlement_detail s + join t_order_item oi on oi.id = s.order_item_id + join t_order o on o.id = s.order_id + join t_order_settlement os on os.id = s.settlement_id + WHERE s.deleted = 0 + and o.status = 'COMPLETED' + AND os.type = 'supplier' + AND os.status in ('PENDING','FAILED') + ORDER BY o.receive_time desc, o.id, oi.flower_name + </select> + </mapper> \ No newline at end of file -- Gitblit v1.9.3