无关风月
昨天 3044a637a15e09d50ad733fd482c6e64e90df2f9
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package com.ruoyi.order.task;
 
 
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.constant.WechatConstants;
import com.ruoyi.common.core.vo.UserDto;
import com.ruoyi.order.entity.Order;
import com.ruoyi.order.entity.Withdraw;
import com.ruoyi.order.entity.WithdrawDetail;
import com.ruoyi.order.service.OrderService;
import com.ruoyi.order.service.WithdrawDetailService;
import com.ruoyi.order.service.WithdrawService;
import com.ruoyi.order.vx.GetTransferBatchByOutNo;
import com.ruoyi.order.vx.HttpUtil;
import com.ruoyi.user.api.feignClient.UserClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
 
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
 
 
/**
 * 定时任务工具类
 */
@Component
public class TaskUtil {
 
    @Resource
    private WithdrawDetailService withdrawDetailService;
    @Resource
    private WithdrawService withdrawService;
 
    @Resource
    private OrderService orderService;
    @Autowired
    private UserClient userClient;
    /**
     * 每隔一小时去处理的定时任务
     */
    @Scheduled(fixedRate = 1000 * 3600)
    public void taskMinute(){
        try {
            List<Withdraw> list1 = withdrawService.list();
            List<WithdrawDetail> list = withdrawDetailService.lambdaQuery()
                    .isNotNull(WithdrawDetail::getOutBatchNo).ne(WithdrawDetail::getStatus, "SUCCESS").list();
 
            for (WithdrawDetail withdrawDetail : list) {
                Withdraw withdraw = list1.stream().filter(e -> e.getId().equals(withdrawDetail.getWithdrawId())).findFirst().orElse(null);
                if (withdraw==null)continue;
                Order order = orderService.getById(withdraw.getOrderId());
                UserDto data = userClient.getUser(order.getUserId()).getData();
                String s = withdrawDetail.getOutBatchNo();
                String s1 = HttpUtil.queryTransBatRequest(WechatConstants.WE_CHAT_PAY_QUERY_URL_PRE + s,
                        "7EEA04429B006E12AAA421C002EC48BBEED5BE94",
                        "1665330417",
                        "D:\\apiclient_key.pem", WechatConstants.WE_CHAT_QUERY_URL_SUF + s);
                System.err.println(s1);
                JSONObject jsonObject = JSONObject.parseObject(s1);
                String string = jsonObject.getString("state");
                if (StringUtils.hasLength( string)){
                    if (string.equals("SUCCESS")) {
                        order.setIsWithdrawal(3);
                        orderService.updateById(order);
                        withdrawDetail.setStatus("SUCCESS");
                        withdrawDetailService.updateById(withdrawDetail);
                    } else if (s.equals("FAIL")||s.equals("CANCELING")||s.equals("CANCELLED")) {
                        // 重新发起一笔转账
                        withdrawDetail.setStatus("FAIL");
                        withdrawDetailService.updateById(withdrawDetail);
 
                        weChatPay(order.getOrderMoney(), data.getOpenId(),withdraw.getId(),order.getServeName());
 
                    }
                }
 
 
            }
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    private boolean weChatPay(BigDecimal orderMoney, String openId, String withdrawId, String serverName) {
        if (com.ruoyi.common.core.utils.StringUtils.isBlank(openId)) {
            return false;
        }
        BigDecimal maxTransferAmount = new BigDecimal("200000"); // 单次转账限额,单位为分
        int totalTransfers = orderMoney.multiply(new BigDecimal("100")).divide(maxTransferAmount, 0, RoundingMode.UP).intValue();
        boolean allTransfersSuccessful = true;
        for (int i = 0; i < totalTransfers; i++) {
            BigDecimal transferAmount;
            if (i < totalTransfers - 1) {
                transferAmount = maxTransferAmount;
            } else {
                // 最后一笔转账,金额为剩余金额
                transferAmount = orderMoney.multiply(new BigDecimal("100")).subtract(maxTransferAmount.multiply(new BigDecimal(i))).setScale(0, RoundingMode.DOWN);
            }
 
            Map<String, Object> postMap = new HashMap<>(8);
            postMap.put(WechatConstants.APP_ID, "wx98563d0ec9cf21c8");
            // 订单号
            String s = String.valueOf(UUID.randomUUID()).replaceAll("-", "");
            postMap.put("out_bill_no", s);
            System.err.println("====="+postMap.get("out_bill_no"));
            postMap.put(WechatConstants.OPEN_ID, openId);
            // 转账金额
            postMap.put("transfer_amount", transferAmount);
            // 转账备注
            postMap.put("transfer_remark", "二手回收提现确认收款");
            // 回调地址
            postMap.put("notify_url", "https://hyhsbqgc.com/api/ruoyi-order/wx/wxChatPay");
            // 转账场景报备信息
            Map<String, Object> info = new HashMap<>();
            info.put("info_type","回收商品名称");
            info.put("info_content",serverName);
            postMap.put("transfer_scene_report_infos", com.alibaba.fastjson2.JSONObject.toJSONString(info));
            String result = HttpUtil.postTransBatRequest(
                    WechatConstants.WE_CHAT_PAY_URL_PRE,
                    com.alibaba.fastjson2.JSONObject.toJSONString(postMap),
                    "7EEA04429B006E12AAA421C002EC48BBEED5BE94",
                    "1665330417",
                    "/usr/local/vx/apiclient_key.pem", WechatConstants.WE_CHAT_URL_SUF);
            com.alibaba.fastjson2.JSONObject jsonObject = com.alibaba.fastjson2.JSONObject.parseObject(result);
//            WithdrawDetail withdrawDetail = new WithdrawDetail();
//            withdrawDetail.setWithdrawId(withdrawId);
//            withdrawDetail.setMoney(transferAmount);
//            withdrawDetail.setOutBatchNo((String) postMap.get(WechatConstants.OUT_BATCH_NO));
//            withdrawDetailService.save(withdrawDetail);
            if (jsonObject.containsKey(WechatConstants.CREATE_TIME)) {
                String string = jsonObject.getString("package_info");
                Withdraw withdraw = withdrawService.getById(withdrawId);
                WithdrawDetail one = withdrawDetailService.lambdaQuery().eq(WithdrawDetail::getWithdrawId, withdrawId).last("limit 1").one();
                if (one!=null){
                    one.setOutBatchNo(s);
                    one.setStatus("PENDING");
                    withdrawDetailService.updateById(one);
                    Order order = orderService.getById(withdraw.getOrderId());
                    order.setPackageInfo(string);
                    order.setIsWithdrawal(2);
                    orderService.updateById(order);
                }
            } else {
                allTransfersSuccessful = false;
                break;
            }
 
        }
 
        return allTransfersSuccessful;
    }
 
}