|
|
@@ -1105,6 +1105,54 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
return fixed;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 批量修复已支付订单的支付状态同步到哈哈平台
|
|
|
+ * 匹配规则:优先 hahaOrderId,其次 16 位纯数字 orderNo(曾被哈哈覆盖过的历史数据),否则跳过
|
|
|
+ *
|
|
|
+ * @return { synced: 成功数, skipped: 跳过数, failed: 失败数 }
|
|
|
+ */
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public Map<String, Object> repairPayStatusSync() {
|
|
|
+ List<Order> orders = lambdaQuery()
|
|
|
+ .eq(Order::getPayStatus, OrderConstants.PAY_STATUS_PAID)
|
|
|
+ .list();
|
|
|
+
|
|
|
+ int synced = 0, skipped = 0, failed = 0;
|
|
|
+ for (Order order : orders) {
|
|
|
+ String hahaRef = order.getHahaOrderId();
|
|
|
+ if (hahaRef == null || hahaRef.isEmpty()) {
|
|
|
+ // 历史订单可能被哈哈短号覆盖过 orderNo(16位纯数字 = 旧行为)
|
|
|
+ if (order.getOrderNo() != null && order.getOrderNo().matches("^\\d{16}$")) {
|
|
|
+ hahaRef = order.getOrderNo();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (hahaRef == null || hahaRef.isEmpty()) {
|
|
|
+ log.info("跳过同步 - orderNo: {}, 无法确定哈哈订单号", order.getOrderNo());
|
|
|
+ skipped++;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ hahaClient.getOrderApi().setPayStatus(hahaRef);
|
|
|
+ synced++;
|
|
|
+ log.info("支付状态同步成功 - hahaRef: {}, localOrderNo: {}", hahaRef, order.getOrderNo());
|
|
|
+ } catch (Exception e) {
|
|
|
+ failed++;
|
|
|
+ log.error("支付状态同步失败 - hahaRef: {}, localOrderNo: {}, error: {}",
|
|
|
+ hahaRef, order.getOrderNo(), e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
+ result.put("total", orders.size());
|
|
|
+ result.put("synced", synced);
|
|
|
+ result.put("skipped", skipped);
|
|
|
+ result.put("failed", failed);
|
|
|
+ log.info("批量同步支付状态完成 - total: {}, synced: {}, skipped: {}, failed: {}",
|
|
|
+ orders.size(), synced, skipped, failed);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 标准化图片URL
|
|
|
*/
|