update 处理未分账订单

This commit is contained in:
Guoqs
2025-11-19 11:55:05 +08:00
parent 80498404da
commit d1c8827b4f
6 changed files with 191 additions and 14 deletions

View File

@@ -9,6 +9,7 @@ import com.huifu.adapay.model.Payment;
import com.huifu.adapay.model.PaymentReverse; import com.huifu.adapay.model.PaymentReverse;
import com.huifu.adapay.model.Refund; import com.huifu.adapay.model.Refund;
import com.jsowell.JsowellApplication; import com.jsowell.JsowellApplication;
import com.jsowell.adapay.common.DivMember;
import com.jsowell.adapay.common.PaymentConfirmInfo; import com.jsowell.adapay.common.PaymentConfirmInfo;
import com.jsowell.adapay.dto.PaymentConfirmParam; import com.jsowell.adapay.dto.PaymentConfirmParam;
import com.jsowell.adapay.dto.QueryPaymentConfirmDTO; import com.jsowell.adapay.dto.QueryPaymentConfirmDTO;
@@ -21,9 +22,13 @@ import com.jsowell.adapay.vo.AdapayCorpMemberVO;
import com.jsowell.adapay.vo.OrderSplitResult; import com.jsowell.adapay.vo.OrderSplitResult;
import com.jsowell.api.uniapp.customer.TempController; import com.jsowell.api.uniapp.customer.TempController;
import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.constant.CacheConstants;
import com.jsowell.common.constant.Constants;
import com.jsowell.common.core.redis.RedisCache; import com.jsowell.common.core.redis.RedisCache;
import com.jsowell.common.enums.ykc.ScenarioEnum; import com.jsowell.common.enums.ykc.ScenarioEnum;
import com.jsowell.common.util.AdapayUtil;
import com.jsowell.common.util.DateUtils; import com.jsowell.common.util.DateUtils;
import com.jsowell.common.util.PageUtils;
import com.jsowell.pile.domain.AdapayUnsplitRecord;
import com.jsowell.pile.domain.OrderBasicInfo; import com.jsowell.pile.domain.OrderBasicInfo;
import com.jsowell.pile.domain.OrderDetail; import com.jsowell.pile.domain.OrderDetail;
import com.jsowell.pile.domain.OrderUnsplitRecord; import com.jsowell.pile.domain.OrderUnsplitRecord;
@@ -801,18 +806,135 @@ public class PaymentTestController {
int pageSize = 3; int pageSize = 3;
PageHelper.startPage(pageNum, pageSize); PageHelper.startPage(pageNum, pageSize);
List<AdapayUnsplitRecordVO> adapayUnsplitRecordVOS = adapayUnsplitRecordService.queryList(); List<AdapayUnsplitRecordVO> adapayUnsplitRecordVOS = adapayUnsplitRecordService.queryList();
// 分账账户
List<DivMember> divMemberList = Lists.newArrayList();
for (AdapayUnsplitRecordVO adapayUnsplitRecordVO : adapayUnsplitRecordVOS) { for (AdapayUnsplitRecordVO adapayUnsplitRecordVO : adapayUnsplitRecordVOS) {
System.out.println(adapayUnsplitRecordVO); String orderCode = adapayUnsplitRecordVO.getOrderCode();
String paymentId = adapayUnsplitRecordVO.getPaymentId();
// 获取待分账金额 // 获取待分账金额
String waitSplitAmount = adapayUnsplitRecordVO.getWaitSplitAmount(); BigDecimal waitSplitAmount = adapayUnsplitRecordVO.getWaitSplitAmount() != null ? new BigDecimal(adapayUnsplitRecordVO.getWaitSplitAmount()) : BigDecimal.ZERO;
// 如果waitSplitAmount > 0, 调用分账接口 // 如果waitSplitAmount > 0, 调用分账接口
if (waitSplitAmount != null && !"".equals(waitSplitAmount)) { if (waitSplitAmount.compareTo(BigDecimal.ZERO) > 0) {
logger.info("订单{}, 待分账金额{}", orderCode, waitSplitAmount);
DivMember divMember = new DivMember();
divMember.setMemberId(Constants.ZERO); // 若是商户本身时传入0
divMember.setAmount(AdapayUtil.formatAmount(waitSplitAmount));
divMember.setFeeFlag(Constants.Y);
divMemberList.add(divMember);
// 调用分账接口 // 调用分账接口
PaymentConfirmParam param = PaymentConfirmParam.builder()
.paymentId(paymentId)
.divMemberList(divMemberList)
.confirmAmt(waitSplitAmount) // 订单结算金额 + 保险金额
.orderCode(orderCode)
.wechatAppId(wechatAppId1)
.build();
PaymentConfirmResponse paymentConfirmRequest = adapayService.createPaymentConfirmRequest(param);
if (paymentConfirmRequest.isSuccess()) {
logger.info("分账成功, 订单号:{}, 分账信息:{}", orderCode, JSON.toJSONString(paymentConfirmRequest));
} else {
logger.info("分账失败, 订单号:{}, 分账信息:{}", orderCode, JSON.toJSONString(paymentConfirmRequest));
}
divMemberList.clear();
} }
// 获取待退款金额 // 获取待退款金额 (sql已经计算过了refundPayAmount = 订单表中应退款金额 - 汇付查询的已退款金额)
String refundPayAmount = adapayUnsplitRecordVO.getRefundPayAmount(); // BigDecimal refundPayAmount = adapayUnsplitRecordVO.getRefundPayAmount() != null ? new BigDecimal(adapayUnsplitRecordVO.getRefundPayAmount()) : BigDecimal.ZERO;
// if (refundPayAmount.compareTo(BigDecimal.ZERO) > 0) {
// // 调用退款接口
// logger.info("订单号:{}, 退款金额:{}", orderCode, refundPayAmount);
// PaymentReverseResponse response = adapayService.createPaymentReverseRequest(paymentId, refundPayAmount,
// wechatAppId1, "", ScenarioEnum.ORDER.getValue(), orderCode);
// }
} }
PageHelper.clearPage();
}
@Test
public void queryAdapayData() {
String startTime = "2025-01-01 00:00:00";
String endTime = "2025-12-31 23:59:59";
// 查询未分帐订单
PageUtils.startPage(1, 99999);
List<AdapayUnsplitRecord> list = adapayUnsplitRecordService.queryUnsplitOrders(startTime, endTime);
// 需要更新的数据
List<AdapayUnsplitRecord> updateList = Lists.newArrayList();
List<JSONObject> listA = Lists.newArrayList();
List<JSONObject> listB = Lists.newArrayList();
// 实用并行流处理list
list.parallelStream().forEach(adapayUnsplitRecord -> {
QueryPaymentConfirmDTO dto = new QueryPaymentConfirmDTO();
dto.setWechatAppId(Constants.DEFAULT_APP_ID);
dto.setPaymentId(adapayUnsplitRecord.getPaymentId());
QueryPaymentConfirmDetailResponse response = adapayService.queryPaymentConfirmList(dto);
List<PaymentConfirmInfo> paymentConfirms = response.getPaymentConfirms();
if (CollectionUtils.isEmpty(paymentConfirms)) {
return;
}
PaymentConfirmInfo paymentConfirmInfo = paymentConfirms.get(0);
String orderCode = adapayUnsplitRecord.getOrderCode();
BigDecimal confirmedAmt = new BigDecimal(paymentConfirmInfo.getConfirmedAmt()); // 汇付返回分账金额
BigDecimal confirmedSplitAmount = adapayUnsplitRecord.getConfirmedSplitAmount(); // 表中记录分账金额
BigDecimal reservedAmt = new BigDecimal(paymentConfirmInfo.getReservedAmt()); // 汇付返回退款金额
BigDecimal refundAmount = adapayUnsplitRecord.getRefundAmount(); // 表中记录退款金额
logger.info("订单号:{}, 汇付返回分账金额:{}, 表中记录分账金额:{}, 汇付返回退款金额:{}, 表中记录退款金额:{}",
orderCode, confirmedAmt, confirmedSplitAmount, reservedAmt, refundAmount);
boolean updateFlag = false;
// 如果汇付返回分账金额与表中记录分账金额不一致,则更新表
if (confirmedAmt.compareTo(confirmedSplitAmount) > 0) {
adapayUnsplitRecord.setConfirmedSplitAmount(confirmedAmt);
updateFlag = true;
} else if (confirmedAmt.compareTo(confirmedSplitAmount) < 0) {
listA.add(JSONObject.of("orderCode", orderCode, "confirmedAmt", confirmedAmt, "confirmedSplitAmount", confirmedSplitAmount));
}
// 如果汇付返回退款金额与表中记录退款金额不一致,则更新表
if (reservedAmt.compareTo(refundAmount) > 0) {
adapayUnsplitRecord.setRefundAmount(reservedAmt);
updateFlag = true;
} else if (reservedAmt.compareTo(refundAmount) < 0) {
listB.add(JSONObject.of("orderCode", orderCode, "reservedAmt", reservedAmt, "refundAmount", refundAmount));
}
if (updateFlag) {
updateList.add(adapayUnsplitRecord);
}
});
// if (CollectionUtils.isNotEmpty(updateList)) {
// // 分批处理updateList, 每批处理1000条数据
// List<List<AdapayUnsplitRecord>> partition = Lists.partition(updateList, 1000);
// partition.parallelStream().forEach(list2 -> {
// adapayUnsplitRecordService.updateBatchSelective(list2);
// });
// }
logger.info("第{}批处理数据,更新表成功, 共更新{}条数据", 1, updateList.size());
logger.info("listA共更新{}条数据, {}", listA.size(), listA);
logger.info("listB共更新{}条数据, {}", listB.size(), listB);
}
@Test
public void queryAdapayV2() {
String paymentId = "002212025070321462910786843519524786176";
QueryPaymentConfirmDTO dto = new QueryPaymentConfirmDTO();
dto.setWechatAppId(Constants.DEFAULT_APP_ID);
dto.setPaymentId(paymentId);
QueryPaymentConfirmDetailResponse response = adapayService.queryPaymentConfirmList(dto);
List<PaymentConfirmInfo> paymentConfirms = response.getPaymentConfirms();
if (CollectionUtils.isEmpty(paymentConfirms)) {
return;
}
PaymentConfirmInfo paymentConfirmInfo = paymentConfirms.get(0);
logger.info("{}", JSON.toJSONString(paymentConfirmInfo));
} }
} }

View File

@@ -1,13 +1,16 @@
package com.jsowell.pile.domain; package com.jsowell.pile.domain;
import java.math.BigDecimal;
import java.util.Date;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.math.BigDecimal;
import java.util.Date;
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
@@ -100,4 +103,27 @@ public class AdapayUnsplitRecord {
* 更新时间 * 更新时间
*/ */
private Date updateTime; private Date updateTime;
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.JSON_STYLE)
.append("id", id)
.append("merchantCode", merchantCode)
.append("payTime", payTime)
.append("paymentId", paymentId)
.append("orderNo", orderNo)
.append("payAmount", payAmount)
.append("confirmedSplitAmount", confirmedSplitAmount)
.append("refundAmount", refundAmount)
.append("paymentRevokeAmount", paymentRevokeAmount)
.append("remainingSplitAmount", remainingSplitAmount)
.append("orderCode", orderCode)
.append("pileType", pileType)
.append("dueRefundAmount", dueRefundAmount)
.append("settleAmount", settleAmount)
.append("refundFlag", refundFlag)
.append("splitFlag", splitFlag)
.append("updateTime", updateTime)
.toString();
}
} }

View File

@@ -3,9 +3,11 @@ package com.jsowell.pile.mapper;
import com.jsowell.pile.domain.AdapayUnsplitRecord; import com.jsowell.pile.domain.AdapayUnsplitRecord;
import com.jsowell.pile.vo.AdapayUnsplitRecordVO; import com.jsowell.pile.vo.AdapayUnsplitRecordVO;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List; import java.util.List;
@Repository
public interface AdapayUnsplitRecordMapper { public interface AdapayUnsplitRecordMapper {
int deleteByPrimaryKey(Integer id); int deleteByPrimaryKey(Integer id);

View File

@@ -7,6 +7,9 @@ public class AdapayUnsplitRecordVO {
// 订单号 // 订单号
private String orderCode; private String orderCode;
// 支付ID
private String paymentId;
// 支付金额 // 支付金额
private String payAmount; private String payAmount;

View File

@@ -702,14 +702,15 @@
<select id="queryUnsplitOrders" resultMap="BaseResultMap"> <select id="queryUnsplitOrders" resultMap="BaseResultMap">
select * from adapay_unsplit_record select * from adapay_unsplit_record
where pay_time >= #{startTime} and pay_time &lt;= #{endTime} where pay_time >= #{startTime} and pay_time &lt;= #{endTime}
and due_refund_amount is null <!--and due_refund_amount is null-->
and settle_amount is null <!--and settle_amount is null-->
and order_code like 'C%' <!--and order_code like 'C%'-->
</select> </select>
<select id="queryList" resultType="com.jsowell.pile.vo.AdapayUnsplitRecordVO"> <select id="queryList" resultType="com.jsowell.pile.vo.AdapayUnsplitRecordVO">
SELECT SELECT
order_code as orderCode, order_code as orderCode,
payment_id as paymentId,
pay_amount as payAmount, pay_amount as payAmount,
settle_amount as settleAmount, settle_amount as settleAmount,
confirmed_split_amount as confirmedSplitAmount, confirmed_split_amount as confirmedSplitAmount,

View File

@@ -1,7 +1,10 @@
package com.jsowell.quartz.task; package com.jsowell.quartz.task;
import com.alibaba.fastjson2.JSON;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.jsowell.adapay.dto.QueryPaymentConfirmDTO;
import com.jsowell.adapay.dto.WithdrawDTO; import com.jsowell.adapay.dto.WithdrawDTO;
import com.jsowell.adapay.response.QueryPaymentConfirmDetailResponse;
import com.jsowell.adapay.service.AdapayService; import com.jsowell.adapay.service.AdapayService;
import com.jsowell.common.YouDianUtils; import com.jsowell.common.YouDianUtils;
import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.constant.CacheConstants;
@@ -411,7 +414,7 @@ public class JsowellTask {
// processUnSettledOrderOld(); // 旧方法 // processUnSettledOrderOld(); // 旧方法
for (int i = 0; i < 35; i++) { for (int i = 0; i < 35; i++) {
int batchNum = i + 1; int batchNum = i + 1;
processUnSettledOrderV1(batchNum); // 新方法 processUnSettledOrderV2(batchNum); // 新方法
} }
} }
@@ -460,8 +463,28 @@ public class JsowellTask {
log.info("第{}批次,共更新{}条数据", batchNum, updateList.size()); log.info("第{}批次,共更新{}条数据", batchNum, updateList.size());
} }
/**
* 更新adapay_unsplit_record表, 去汇付查询最新的数据
* @param batchNum
*/
private void processUnSettledOrderV2(int batchNum) { private void processUnSettledOrderV2(int batchNum) {
String startTime = "2025-01-01 00:00:00";
String endTime = "2025-12-31 23:59:59";
// 查询未分帐订单
PageUtils.startPage(1, 3);
List<AdapayUnsplitRecord> list = adapayUnsplitRecordService.queryUnsplitOrders(startTime, endTime);
// 根据paymentId去汇付查询最新数据
for (AdapayUnsplitRecord adapayUnsplitRecord : list) {
String paymentId = adapayUnsplitRecord.getPaymentId();
QueryPaymentConfirmDTO dto = new QueryPaymentConfirmDTO();
dto.setWechatAppId(Constants.DEFAULT_APP_ID);
dto.setPaymentId(paymentId);
QueryPaymentConfirmDetailResponse response = adapayService.queryPaymentConfirmList(dto);
System.out.println(JSON.toJSONString(response));
}
} }
// private void processUnSettledOrderOld() { // private void processUnSettledOrderOld() {