18582019636
2024-06-21 45f4118f98840ff098e94a5072a9f937d3810a1c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package com.ruoyi.user.service.impl;
 
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.admin.api.entity.WithdrawalSetting;
import com.ruoyi.admin.api.feignClient.AdminClient;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.exception.GlobalException;
import com.ruoyi.user.entity.Order;
import com.ruoyi.user.entity.RecoveryServe;
import com.ruoyi.user.entity.User;
import com.ruoyi.user.entity.Withdraw;
import com.ruoyi.user.mapper.WithdrawMapper;
import com.ruoyi.user.service.OrderService;
import com.ruoyi.user.service.RecoveryServeService;
import com.ruoyi.user.service.UserService;
import com.ruoyi.user.service.WithdrawService;
import com.ruoyi.user.vo.WithdrawListVO;
import com.ruoyi.user.vo.WithdrawMoneyVO;
import com.ruoyi.user.vo.WithdrawOrderVO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
 
/**
 * <p>
 * 用户提现申请记录表 服务实现类
 * </p>
 *
 * @author hjl
 * @since 2024-06-07
 */
@Service
public class WithdrawServiceImpl extends ServiceImpl<WithdrawMapper, Withdraw> implements WithdrawService {
 
    @Resource
    private OrderService orderService;
    @Resource
    private RecoveryServeService recoveryServeService;
    @Resource
    private UserService userService;
    @Resource
    private AdminClient adminClient;
 
    @Override
    public WithdrawListVO withdrawList(Integer userid) {
        WithdrawListVO withdrawList = new WithdrawListVO();
        List<Order> orderList = orderService.lambdaQuery().eq(Order::getUserId, userid)
                .eq(Order::getState, 3).eq(Order::getIsDelete, 0).list();
        // 总金额
        BigDecimal totalMoney = BigDecimal.ZERO;
        // 未提现金额
        BigDecimal undelivered = BigDecimal.ZERO;
        // 已提现金额
        BigDecimal withdrawn = BigDecimal.ZERO;
        if (!orderList.isEmpty()) {
            // 总金额
            totalMoney = orderList.stream().map(Order::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
            // 未提现金额
            undelivered = orderList.stream().filter(data -> Constants.ZERO.equals(data.getIsWithdrawal()))
                    .map(Order::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
            // 已提现金额
            withdrawn = orderList.stream().filter(data -> Constants.ONE.equals(data.getIsWithdrawal()))
                    .map(Order::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
        }
        withdrawList.setMoneyCount(new WithdrawMoneyVO(totalMoney, undelivered, withdrawn));
        // 回收服务列表
        List<Integer> serveIds = orderList.stream().map(Order::getServeId).collect(Collectors.toList());
        LambdaQueryChainWrapper<RecoveryServe> wrapper = recoveryServeService.lambdaQuery()
                .eq(RecoveryServe::getIsDelete, 0);
        wrapper = serveIds.isEmpty() ? wrapper : wrapper.in(RecoveryServe::getId, serveIds);
        List<RecoveryServe> serveList = wrapper.list();
        Map<Integer, RecoveryServe> serveMap = serveList.stream().collect(Collectors.toMap(RecoveryServe::getId, serve -> serve));
        // 订单列表
        List<WithdrawOrderVO> list = new ArrayList<>();
        for (Order order : orderList) {
            RecoveryServe recoveryServe = serveMap.get(order.getServeId());
            WithdrawOrderVO withdrawOrder = new WithdrawOrderVO();
            withdrawOrder.setOrderNumber(order.getOrderNumber());
            withdrawOrder.setServeId(order.getServeId());
            withdrawOrder.setServeName(recoveryServe.getServeName());
            withdrawOrder.setServeDescribe(recoveryServe.getServeDescribe());
            withdrawOrder.setCover(recoveryServe.getCover());
            withdrawOrder.setCompleteTime(order.getCompleteTime());
            withdrawOrder.setIsWithdrawal(order.getIsWithdrawal());
            list.add(withdrawOrder);
        }
        withdrawList.setWithdrawOrder(list);
        return withdrawList;
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean confirmWithdraw(Integer orderId, Integer userid) {
        Order order = orderService.lambdaQuery().eq(Order::getId, orderId).eq(Order::getIsDelete, 0).one();
        if (null == order) {
            throw new GlobalException("订单信息异常!");
        }
        // 校验提现
        List<Withdraw> list = this.lambdaQuery().eq(Withdraw::getUserId, userid)
                .eq(Withdraw::getOrderId, order).list();
        List<Integer> stateList = list.stream().map(Withdraw::getState).collect(Collectors.toList());
        if (stateList.contains(Constants.ZERO)) {
            throw new GlobalException("当前订单已提交提现申请,请等待审核!");
        } else if (stateList.contains(Constants.ONE)) {
            throw new GlobalException("当前订单已提现通过!");
        }
        User user = userService.lambdaQuery().eq(User::getId, userid).eq(User::getIsDelete, 0).one();
        // 系统审核设置
        WithdrawalSetting setting = adminClient.withdrawProcess().getData();
        Withdraw withdraw = new Withdraw();
        if (Constants.ZERO.equals(setting.getEnableProcess())) {
            withdraw.setState(Constants.ZERO);
            // todo 商家微信打款至微信零钱
        }
        withdraw.setUserId(user.getId());
        withdraw.setUserPhone(user.getPhone());
        withdraw.setApplyForTime(new Date());
        withdraw.setApplyForMoney(order.getOrderMoney());
        withdraw.setOrderId(orderId);
        return this.save(withdraw);
    }
}