From bd6229ebd9cb543a22944ecb1142fad92b675dce Mon Sep 17 00:00:00 2001 From: rk <94314517@qq.com> Date: 星期一, 13 十月 2025 14:26:25 +0800 Subject: [PATCH] bug 修复 --- server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 219 insertions(+), 0 deletions(-) diff --git a/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java index 03b55af..20bf1f1 100644 --- a/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java +++ b/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java @@ -1,10 +1,24 @@ package com.doumee.service.business.impl; +import com.alibaba.fastjson.JSONObject; +import com.doumee.config.wx.SendWxMessage; +import com.doumee.config.wx.TransferToUser; +import com.doumee.config.wx.WXPayUtility; +import com.doumee.config.wx.WxMiniConfig; +import com.doumee.core.constants.Constants; +import com.doumee.core.constants.ResponseStatus; +import com.doumee.core.exception.BusinessException; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; +import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.Utils; +import com.doumee.dao.business.MemberMapper; +import com.doumee.dao.business.MemberRevenueMapper; import com.doumee.dao.business.WithdrawalOrdersMapper; +import com.doumee.dao.business.model.Member; +import com.doumee.dao.business.model.MemberRevenue; import com.doumee.dao.business.model.WithdrawalOrders; +import com.doumee.dao.dto.WithdrawalDTO; import com.doumee.service.business.WithdrawalOrdersService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; @@ -12,9 +26,15 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import java.math.BigDecimal; +import java.util.Date; import java.util.List; +import java.util.Objects; +import java.util.UUID; /** * 鎻愮幇鐢宠璁板綍Service瀹炵幇 @@ -26,6 +46,15 @@ @Autowired private WithdrawalOrdersMapper withdrawalOrdersMapper; + + @Autowired + private MemberMapper memberMapper; + + @Autowired + private MemberRevenueMapper memberRevenueMapper; + + @Autowired + private SendWxMessage sendWxMessage; @Override public Integer create(WithdrawalOrders withdrawalOrders) { @@ -146,4 +175,194 @@ QueryWrapper<WithdrawalOrders> wrapper = new QueryWrapper<>(withdrawalOrders); return withdrawalOrdersMapper.selectCount(wrapper); } + + + /************************************绉诲姩绔帴鍙�*******************************************/ + + /** + * 鎻愮幇鐢宠 + * @param withdrawalDTO + */ + @Override + @Transactional(rollbackFor = {BusinessException.class,Exception.class}) + public TransferToUser.TransferToUserResponse applyWithdrawal(WithdrawalDTO withdrawalDTO){ + if(Objects.isNull(withdrawalDTO) + || Objects.isNull(withdrawalDTO.getAmount()) + || org.apache.commons.lang3.StringUtils.isBlank(withdrawalDTO.getName()) + || withdrawalDTO.getAmount().compareTo(BigDecimal.ZERO)<=Constants.ZERO + ){ + throw new BusinessException(ResponseStatus.BAD_REQUEST); + } + Member member = memberMapper.selectById(withdrawalDTO.getMember().getId()); + if(Objects.isNull(member)){ + throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐢ㄦ埛淇℃伅寮傚父,璇疯仈绯荤鐞嗗憳"); + } + if(member.getAmount() < withdrawalDTO.getAmount().multiply(new BigDecimal("100")).intValue()){ + throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝鍙彁鐜颁綑棰濅笉瓒炽��"); + } + if(StringUtils.isEmpty(member.getName())){ + throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璇峰厛鍘荤淮鎶ょ湡瀹炲鍚嶅悗杩涜鎻愮幇鐢宠"); + } + WithdrawalOrders withdrawalOrders = new WithdrawalOrders(); + withdrawalOrders.setCreateTime(new Date()); + withdrawalOrders.setMemberId(member.getId()); + withdrawalOrders.setOutBillNo(UUID.randomUUID().toString().replace("-","")); + withdrawalOrders.setAmount((withdrawalDTO.getAmount().multiply(new BigDecimal("100"))).longValue()); + withdrawalOrders.setStatus(Constants.ZERO); + withdrawalOrders.setType(Constants.ZERO); + withdrawalOrders.setDeleted(Constants.ZERO); + + //鍙戣捣鎻愮幇鐢宠 + TransferToUser.TransferToUserRequest transferToUserRequest = new TransferToUser.TransferToUserRequest(); + transferToUserRequest.openid = member.getOpenid(); + transferToUserRequest.outBillNo = withdrawalOrders.getOutBillNo(); + transferToUserRequest.transferAmount = withdrawalOrders.getAmount(); + transferToUserRequest.transferRemark = "鎻愮幇鐢宠"; + try { + TransferToUser.TransferToUserResponse response = WxMiniConfig.transferToUser.run(transferToUserRequest,withdrawalDTO.getName()); + withdrawalOrders.setRemark(JSONObject.toJSONString(response)); + if(response.state.name().equals("WAIT_USER_CONFIRM") || response.state.name().equals("ACCEPTED")){ + withdrawalOrders.setWxExternalNo(response.transferBillNo); + } + withdrawalOrdersMapper.insert(withdrawalOrders); + //鏇存柊鐢ㄦ埛浣欓 + memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" AMOUNT = AMOUNT - " + withdrawalOrders.getAmount() ).eq(Member::getId,member.getId())); + //瀛樺偍娴佹按璁板綍 + MemberRevenue memberRevenue = new MemberRevenue(); + memberRevenue.setCreateTime(new Date()); + memberRevenue.setTransactionNo(withdrawalOrders.getOutBillNo()); + memberRevenue.setDeleted(Constants.ZERO); + memberRevenue.setMemberId(member.getId()); + memberRevenue.setType(Constants.THREE); + memberRevenue.setOptType(-Constants.ONE); + memberRevenue.setBeforeAmount(member.getAmount()); + memberRevenue.setAmount(withdrawalOrders.getAmount()); + memberRevenue.setAfterAmount(member.getAmount() - withdrawalOrders.getAmount()); + memberRevenue.setObjId(withdrawalOrders.getId()); + memberRevenue.setRemark(Constants.RevenueType.getInfo(memberRevenue.getType())); + memberRevenue.setObjType(Constants.ONE); + memberRevenue.setDeleted(Constants.ZERO); + memberRevenue.setStatus(Constants.TWO); + memberRevenueMapper.insert(memberRevenue); + return response; + } catch (WXPayUtility.ApiException e) { + String message = JSONObject.parseObject(e.getBody()).getString("message"); + throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),message); + } + } + + + @Override + public void transferSuccess(String outBillNo,Boolean isSuccess){ + WithdrawalOrders withdrawalOrders = withdrawalOrdersMapper.selectOne(new QueryWrapper<WithdrawalOrders>().lambda() + .eq(WithdrawalOrders::getOutBillNo,outBillNo).last("limit 1")); + Member member = memberMapper.selectById(withdrawalOrders.getMemberId()); + if(Objects.isNull(member)){ + return; + } + if(Objects.nonNull(withdrawalOrders)){ + //杞处鎴愬姛 + if(isSuccess){ + withdrawalOrdersMapper.update(new UpdateWrapper<WithdrawalOrders>().lambda() + .set(WithdrawalOrders::getStatus,Constants.ONE) + .set(WithdrawalOrders::getUpdateTime, DateUtil.getCurrDateTime()) + .eq(WithdrawalOrders::getOutBillNo,outBillNo) + ); + //淇敼娴佹按璁板綍鐘舵�� + memberRevenueMapper.update(new UpdateWrapper<MemberRevenue>().lambda() + .set(MemberRevenue::getStatus,Constants.ZERO) + .set(MemberRevenue::getUpdateTime, DateUtil.getCurrDateTime()) + .eq(MemberRevenue::getObjId,withdrawalOrders.getId()) + .eq(MemberRevenue::getObjType,Constants.ONE) + ); + withdrawalOrders.setUpdateTime(new Date()); + sendWxMessage.withdrawalMessage(member.getOpenid(),withdrawalOrders); + }else { + //鏇存柊鐢ㄦ埛浣欓 + memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" AMOUNT = AMOUNT + " + withdrawalOrders.getAmount() ).eq(Member::getId,withdrawalOrders.getMemberId())); + //淇敼娴佹按璁板綍鐘舵�� + memberRevenueMapper.update(new UpdateWrapper<MemberRevenue>().lambda() + .set(MemberRevenue::getStatus,Constants.ONE) + .set(MemberRevenue::getUpdateTime, DateUtil.getCurrDateTime()) + .eq(MemberRevenue::getObjId,withdrawalOrders.getId()) + .eq(MemberRevenue::getObjType,Constants.ONE) + ); + //瀛樺偍娴佹按璁板綍 + MemberRevenue memberRevenue = new MemberRevenue(); + memberRevenue.setCreateTime(new Date()); + memberRevenue.setTransactionNo(withdrawalOrders.getOutBillNo()); + memberRevenue.setDeleted(Constants.ZERO); + memberRevenue.setMemberId(withdrawalOrders.getMemberId()); + memberRevenue.setType(Constants.FOUR); + memberRevenue.setOptType(Constants.ONE); + memberRevenue.setBeforeAmount(member.getAmount()); + memberRevenue.setAmount(withdrawalOrders.getAmount()); + memberRevenue.setAfterAmount(member.getAmount() + withdrawalOrders.getAmount()); + memberRevenue.setObjId(withdrawalOrders.getId()); + memberRevenue.setRemark(Constants.RevenueType.getInfo(memberRevenue.getType())); + memberRevenue.setObjType(Constants.ONE); + memberRevenue.setDeleted(Constants.ZERO); + memberRevenue.setStatus(Constants.ZERO); + memberRevenueMapper.insert(memberRevenue); + } + } + + } + + @Override + public void cancelTransfer(TransferToUser.CancelTransferRequest request){ + if(Objects.isNull(request) + || StringUtils.isEmpty(request.outBillNo)){ + throw new BusinessException(ResponseStatus.BAD_REQUEST); + } + WithdrawalOrders withdrawalOrders = withdrawalOrdersMapper.selectOne(new QueryWrapper<WithdrawalOrders>().lambda().eq(WithdrawalOrders::getOutBillNo,request.outBillNo).last("limit 1")); + if(Objects.isNull(withdrawalOrders)){ + throw new BusinessException(ResponseStatus.DATA_EMPTY); + } + Member member = memberMapper.selectById(withdrawalOrders.getMemberId()); + if(Objects.isNull(member)){ + throw new BusinessException(ResponseStatus.DATA_EMPTY); + } + try { + TransferToUser.CancelTransferResponse response = WxMiniConfig.transferToUser.cancelRun(request); + if(response.state.equals("CANCELING")){ + //鏍囪鎻愮幇澶辫触 鍔犲洖瀵瑰簲鐨勬彁鐜伴噾棰� + withdrawalOrdersMapper.update(new UpdateWrapper<WithdrawalOrders>() + .lambda().set(WithdrawalOrders::getStatus,Constants.TWO) + .eq(WithdrawalOrders::getId,withdrawalOrders.getId())); + + memberRevenueMapper.update(new UpdateWrapper<MemberRevenue>().lambda().set(MemberRevenue::getStatus,Constants.ONE) + .set(MemberRevenue::getUpdateTime,new Date()) + .eq(MemberRevenue::getObjId,withdrawalOrders.getId())) + ; + + //鏇存柊鐢ㄦ埛浣欓 + memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" AMOUNT = AMOUNT + " + withdrawalOrders.getAmount() ).eq(Member::getId,withdrawalOrders.getMemberId())); + + //瀛樺偍娴佹按璁板綍 + MemberRevenue memberRevenue = new MemberRevenue(); + memberRevenue.setCreateTime(new Date()); + memberRevenue.setMemberId(withdrawalOrders.getMemberId()); + memberRevenue.setType(Constants.FOUR); + memberRevenue.setOptType(Constants.ONE); + memberRevenue.setBeforeAmount(member.getAmount()); + memberRevenue.setAmount(withdrawalOrders.getAmount()); + memberRevenue.setAfterAmount(member.getAmount() + withdrawalOrders.getAmount()); + memberRevenue.setObjId(withdrawalOrders.getId()); + memberRevenue.setObjType(Constants.ONE); + memberRevenue.setDeleted(Constants.ZERO); + memberRevenue.setStatus(Constants.ZERO); + memberRevenueMapper.insert(memberRevenue); + + } + System.out.println(JSONObject.toJSONString(response)); + } catch (WXPayUtility.ApiException e) { + String message = JSONObject.parseObject(e.getBody()).getString("message"); + throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),message); + } + + } + + + } -- Gitblit v1.9.3