|
|
@@ -1281,52 +1281,69 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 修复漏掉的支付分扣费:查询有支付分服务订单但未完成扣费的订单,重新发起扣费
|
|
|
+ * 修复指定订单的支付分扣费,支持订单ID或订单编号
|
|
|
*
|
|
|
- * 适用场景:订单创建后因并发回调导致 payChannel 为 null,processPayScorePayment 跳过扣费
|
|
|
- * 筛选条件:payScoreOrderId 已设置 + payScoreState 为 CREATED/DOING + payStatus 为 UNPAID + totalAmount > 0
|
|
|
- *
|
|
|
- * @return { total, success, failed }
|
|
|
+ * @param orderIdOrNo 订单ID(数字)或订单编号
|
|
|
+ * @param payScoreOrderId 微信支付分服务订单号(outOrderNo),为空则使用订单上的值
|
|
|
+ * @return { success: true/false, message: "..." }
|
|
|
*/
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
- public Map<String, Object> repairPayScorePayments() {
|
|
|
- List<Order> orders = lambdaQuery()
|
|
|
- .isNotNull(Order::getPayScoreOrderId)
|
|
|
- .ne(Order::getPayScoreOrderId, "")
|
|
|
- .in(Order::getPayScoreState, PayScoreState.CREATED.getCode(), PayScoreState.DOING.getCode())
|
|
|
- .eq(Order::getPayStatus, OrderConstants.PAY_STATUS_UNPAID)
|
|
|
- .gt(Order::getTotalAmount, BigDecimal.ZERO)
|
|
|
- .list();
|
|
|
-
|
|
|
- int success = 0, failed = 0;
|
|
|
- for (Order order : orders) {
|
|
|
- try {
|
|
|
- BigDecimal amount = order.getPaidAmount() != null
|
|
|
- && order.getPaidAmount().compareTo(BigDecimal.ZERO) > 0
|
|
|
- ? order.getPaidAmount() : order.getTotalAmount();
|
|
|
+ public Map<String, Object> repairPayScorePayment(String orderIdOrNo, String payScoreOrderId) {
|
|
|
+ Order order;
|
|
|
+ if (orderIdOrNo.matches("^\\d{1,19}$")) {
|
|
|
+ order = this.getById(Long.parseLong(orderIdOrNo));
|
|
|
+ } else {
|
|
|
+ order = lambdaQuery().eq(Order::getOrderNo, orderIdOrNo).one();
|
|
|
+ }
|
|
|
+ if (order == null) {
|
|
|
+ return Map.of("success", false, "message", "订单不存在: " + orderIdOrNo);
|
|
|
+ }
|
|
|
|
|
|
- boolean result = completeOrderWithPayScore(order.getId(), amount);
|
|
|
- if (result) {
|
|
|
- success++;
|
|
|
- log.info("[支付分修复] 扣费成功 - orderId: {}, orderNo: {}, amount: {}",
|
|
|
- order.getId(), order.getOrderNo(), amount);
|
|
|
- } else {
|
|
|
- failed++;
|
|
|
- log.warn("[支付分修复] 扣费失败 - orderId: {}, orderNo: {}",
|
|
|
- order.getId(), order.getOrderNo());
|
|
|
- }
|
|
|
- } catch (Exception e) {
|
|
|
- failed++;
|
|
|
- log.error("[支付分修复] 扣费异常 - orderId: {}, error: {}", order.getId(), e.getMessage());
|
|
|
+ // 如果提供了 outOrderNo,先回填到本地订单
|
|
|
+ if (payScoreOrderId != null && !payScoreOrderId.isEmpty()) {
|
|
|
+ if (order.getPayScoreOrderId() == null || order.getPayScoreOrderId().isEmpty()) {
|
|
|
+ order.setPayScoreOrderId(payScoreOrderId);
|
|
|
+ order.setPayScoreState(PayScoreState.DOING.getCode());
|
|
|
+ this.updateById(order);
|
|
|
+ log.info("[支付分修复] 回填 payScoreOrderId - orderId: {}, orderNo: {}, payScoreOrderId: {}",
|
|
|
+ order.getId(), order.getOrderNo(), payScoreOrderId);
|
|
|
+ } else if (!payScoreOrderId.equals(order.getPayScoreOrderId())) {
|
|
|
+ return Map.of("success", false, "message",
|
|
|
+ "提供的 outOrderNo 与订单上的不一致: " + order.getPayScoreOrderId());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- Map<String, Object> result = new HashMap<>();
|
|
|
- result.put("total", orders.size());
|
|
|
- result.put("success", success);
|
|
|
- result.put("failed", failed);
|
|
|
- log.info("[支付分修复] 完成 - total: {}, success: {}, failed: {}", orders.size(), success, failed);
|
|
|
- return result;
|
|
|
+ // 重新加载以获取最新状态
|
|
|
+ order = this.getById(order.getId());
|
|
|
+
|
|
|
+ if (order.getPayScoreOrderId() == null || order.getPayScoreOrderId().isEmpty()) {
|
|
|
+ return Map.of("success", false, "message",
|
|
|
+ "订单未创建支付分服务订单,请在微信商户后台找到 outOrderNo 后输入");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (PayScoreState.isFinished(order.getPayScoreState())) {
|
|
|
+ return Map.of("success", false, "message", "支付分订单已完结,无需修复: " + order.getPayScoreState());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!OrderConstants.PAY_STATUS_UNPAID.equals(order.getPayStatus())) {
|
|
|
+ return Map.of("success", false, "message", "订单已支付,无需修复");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (order.getTotalAmount() == null || order.getTotalAmount().compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
+ return Map.of("success", false, "message", "订单金额为0,无法扣费");
|
|
|
+ }
|
|
|
+
|
|
|
+ BigDecimal amount = order.getPaidAmount() != null
|
|
|
+ && order.getPaidAmount().compareTo(BigDecimal.ZERO) > 0
|
|
|
+ ? order.getPaidAmount() : order.getTotalAmount();
|
|
|
+
|
|
|
+ boolean result = completeOrderWithPayScore(order.getId(), amount);
|
|
|
+ log.info("[支付分修复] orderId: {}, orderNo: {}, payScoreOrderId: {}, amount: {}, result: {}",
|
|
|
+ order.getId(), order.getOrderNo(), order.getPayScoreOrderId(), amount, result);
|
|
|
+
|
|
|
+ return result
|
|
|
+ ? Map.of("success", true, "message", "扣费成功")
|
|
|
+ : Map.of("success", false, "message", "扣费失败,请查看服务端日志");
|
|
|
}
|
|
|
|
|
|
/**
|