|  |  |  | 
|---|
|  |  |  | package com.doumee.service.business.impl; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.alibaba.fastjson.JSONArray; | 
|---|
|  |  |  | 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.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 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; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private MemberRevenueMapper memberRevenueMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private SendWxMessage sendWxMessage; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public Integer create(WithdrawalOrders withdrawalOrders) { | 
|---|
|  |  |  | 
|---|
|  |  |  | @Transactional(rollbackFor = {BusinessException.class,Exception.class}) | 
|---|
|  |  |  | public TransferToUser.TransferToUserResponse  applyWithdrawal(WithdrawalDTO withdrawalDTO){ | 
|---|
|  |  |  | if(Objects.isNull(withdrawalDTO) | 
|---|
|  |  |  | || Objects.isNull(withdrawalDTO.getAmount())){ | 
|---|
|  |  |  | || 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()){ | 
|---|
|  |  |  | if(member.getAmount() < withdrawalDTO.getAmount().multiply(new BigDecimal("100")).intValue()){ | 
|---|
|  |  |  | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,可提现余额不足。"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(StringUtils.isEmpty(member.getName())){ | 
|---|
|  |  |  | 
|---|
|  |  |  | withdrawalOrders.setCreateTime(new Date()); | 
|---|
|  |  |  | withdrawalOrders.setMemberId(member.getId()); | 
|---|
|  |  |  | withdrawalOrders.setOutBillNo(UUID.randomUUID().toString().replace("-","")); | 
|---|
|  |  |  | withdrawalOrders.setAmount(withdrawalDTO.getAmount()); | 
|---|
|  |  |  | 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 = withdrawalDTO.getAmount(); | 
|---|
|  |  |  | transferToUserRequest.transferAmount = withdrawalOrders.getAmount(); | 
|---|
|  |  |  | transferToUserRequest.transferRemark = "提现申请"; | 
|---|
|  |  |  | //        transferToUserRequest.userName = member.getName(); | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | TransferToUser.TransferToUserResponse response =  WxMiniConfig.transferToUser.run(transferToUserRequest,member.getName()); | 
|---|
|  |  |  | 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 -  " + withdrawalDTO.getAmount() ).eq(Member::getId,member.getId())); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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.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); | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @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) | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | 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())); | 
|---|
|  |  |  | //存储流水记录 | 
|---|
|  |  |  | 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)){ | 
|---|