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;
|
}
|
|
}
|