jiangping
2025-07-19 0cfbaf9a439dc75824c52a6e58b6849064afbc80
server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
@@ -1,10 +1,22 @@
package com.doumee.service.business.impl;
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 com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
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 +24,14 @@
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.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
/**
 * 提现申请记录Service实现
@@ -26,6 +43,12 @@
    @Autowired
    private WithdrawalOrdersMapper withdrawalOrdersMapper;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private MemberRevenueMapper memberRevenueMapper;
    @Override
    public Integer create(WithdrawalOrders withdrawalOrders) {
@@ -146,4 +169,133 @@
        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())){
            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()){
            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);
        //发起提现申请
        TransferToUser.TransferToUserRequest transferToUserRequest = new TransferToUser.TransferToUserRequest();
        transferToUserRequest.openid = member.getOpenid();
        transferToUserRequest.outBillNo =  withdrawalOrders.getOutBillNo();
        transferToUserRequest.transferAmount = withdrawalDTO.getAmount();
        transferToUserRequest.transferRemark = "提现申请";
        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.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 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);
        }
    }
}