|  |  | 
 |  |  | package com.doumee.service.business.impl; | 
 |  |  |  | 
 |  |  | import com.alibaba.fastjson.JSONArray; | 
 |  |  | import com.alibaba.fastjson.JSONObject; | 
 |  |  | 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 org.springframework.stereotype.Service; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  | import org.springframework.util.CollectionUtils; | 
 |  |  | import org.springframework.util.StringUtils; | 
 |  |  |  | 
 |  |  | import java.util.Date; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.Objects; | 
 |  |  | import java.util.UUID; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * 提现申请记录Service实现 | 
 |  |  | 
 |  |  |      * 提现申请 | 
 |  |  |      * @param withdrawalDTO | 
 |  |  |      */ | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     @Transactional(rollbackFor = {BusinessException.class,Exception.class}) | 
 |  |  |     public void  applyWithdrawal(WithdrawalDTO withdrawalDTO){ | 
 |  |  |     public TransferToUser.TransferToUserResponse  applyWithdrawal(WithdrawalDTO withdrawalDTO){ | 
 |  |  |         if(Objects.isNull(withdrawalDTO) | 
 |  |  |         || Objects.isNull(withdrawalDTO.getAmount())){ | 
 |  |  |             throw new BusinessException(ResponseStatus.BAD_REQUEST); | 
 |  |  | 
 |  |  |         if(member.getAmount() < withdrawalDTO.getAmount()){ | 
 |  |  |             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()); | 
 |  |  |         withdrawalOrders.setStatus(Constants.ZERO); | 
 |  |  |         withdrawalOrders.setType(Constants.ZERO); | 
 |  |  |         withdrawalOrders.setDeleted(Constants.ZERO); | 
 |  |  |  | 
 |  |  |         //TODO 发起提现申请 | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         //发起提现申请 | 
 |  |  |         TransferToUser.TransferToUserRequest transferToUserRequest = new TransferToUser.TransferToUserRequest(); | 
 |  |  |         transferToUserRequest.openid = member.getOpenid(); | 
 |  |  |         transferToUserRequest.outBillNo =  withdrawalOrders.getOutBillNo(); | 
 |  |  |         transferToUserRequest.transferAmount = withdrawalDTO.getAmount(); | 
 |  |  |         transferToUserRequest.transferRemark = "提现申请"; | 
 |  |  | //        transferToUserRequest.userName = member.getName(); | 
 |  |  |         try { | 
 |  |  |             TransferToUser.TransferToUserResponse response =  WxMiniConfig.transferToUser.run(transferToUserRequest,member.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 -  " + withdrawalDTO.getAmount() ).eq(Member::getId,member.getId())); | 
 |  |  |  | 
 |  |  |         //存储流水记录 | 
 |  |  |             MemberRevenue memberRevenue = new MemberRevenue(); | 
 |  |  |             memberRevenue.setCreateTime(new Date()); | 
 |  |  |             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.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 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); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  |