From 6d20b9870280480e44b38588d10fa60094b093b5 Mon Sep 17 00:00:00 2001 From: cst61 Date: Sun, 17 May 2026 09:29:42 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=90=8C=E6=AD=A5=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E6=97=B6=EF=BC=8C=E6=AF=8F=E6=AC=A1=E5=8F=AA=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E5=9B=BA=E5=AE=9A90=E6=9D=A1=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/HxrAdminOrderSelectService.java | 15 ++- .../service/impl/LbOrderRowServiceImpl.java | 112 ++++++++++++------ 2 files changed, 92 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/rj/service/HxrAdminOrderSelectService.java b/src/main/java/com/rj/service/HxrAdminOrderSelectService.java index da498b0..22b2b7b 100644 --- a/src/main/java/com/rj/service/HxrAdminOrderSelectService.java +++ b/src/main/java/com/rj/service/HxrAdminOrderSelectService.java @@ -49,7 +49,17 @@ public class HxrAdminOrderSelectService { */ public Optional fetchOrderSelect( String buyTimeStart, String buyTimeEnd, Integer isResell) throws Exception { - return fetchOrderSelectInternal(buildOrderSelectUrl(buyTimeStart, buyTimeEnd, isResell)); + return fetchOrderSelect(buyTimeStart, buyTimeEnd, isResell, 1); + } + + /** + * 按购买时间区间、转卖状态及页码拉取订单列表。 + * + * @param page 页码,从 1 开始;与配置 URL 中的 {@code limit} 配合分页 + */ + public Optional fetchOrderSelect( + String buyTimeStart, String buyTimeEnd, Integer isResell, int page) throws Exception { + return fetchOrderSelectInternal(buildOrderSelectUrl(buyTimeStart, buyTimeEnd, isResell, page)); } private Optional fetchOrderSelectInternal(String requestUri) throws Exception { @@ -94,13 +104,14 @@ public class HxrAdminOrderSelectService { /** * 在 {@link HxrAdminProperties#getOrderSelectUrl()} 上覆盖 {@code buy_time[0]}、{@code buy_time[1]}、{@code is_resell}。 */ - private String buildOrderSelectUrl(String buyTimeStart, String buyTimeEnd, Integer isResell) { + private String buildOrderSelectUrl(String buyTimeStart, String buyTimeEnd, Integer isResell, int page) { UriComponentsBuilder b = UriComponentsBuilder.fromUriString(properties.getOrderSelectUrl()); b.replaceQueryParam("buy_time[0]", buyTimeStart == null ? "" : buyTimeStart); b.replaceQueryParam("buy_time[1]", buyTimeEnd == null ? "" : buyTimeEnd); if (isResell != null) { b.replaceQueryParam("is_resell", isResell); } + b.replaceQueryParam("page", Math.max(1, page)); return b.build().encode().toUriString(); } diff --git a/src/main/java/com/rj/service/impl/LbOrderRowServiceImpl.java b/src/main/java/com/rj/service/impl/LbOrderRowServiceImpl.java index 4bfb1f6..321b003 100644 --- a/src/main/java/com/rj/service/impl/LbOrderRowServiceImpl.java +++ b/src/main/java/com/rj/service/impl/LbOrderRowServiceImpl.java @@ -23,6 +23,9 @@ import java.util.Optional; @Service public class LbOrderRowServiceImpl extends ServiceImpl implements ILbOrderRowService { + /** 与 hxr.admin.order-select-url 中 {@code limit} 一致,用于判断是否还有下一页 */ + private static final int HXR_ORDER_PAGE_SIZE = 90; + @Autowired private HxrAdminOrderSelectService hxrAdminOrderSelectService; @@ -208,43 +211,86 @@ public class LbOrderRowServiceImpl extends ServiceImpl opt = - hxrAdminOrderSelectService.fetchOrderSelect(buyTimeStart, buyTimeEnd, isResell); - if (opt.isEmpty()) { - result.put("success", false); - result.put("message", "未拉取到订单(请检查 hxr.admin cookie/phpsid、网络或后台返回)"); - result.put("synced", 0); - return result; - } - - HxrOrderSelectResponse body = opt.get(); - List rows = body.data(); - if (rows == null || rows.isEmpty()) { - result.put("success", true); - result.put("message", "接口成功,本页无订单数据"); - result.put("synced", 0); - result.put("remoteCount", body.count()); - return result; - } - String tid = tenantId.trim(); String rowDataType = resolveSyncDataType(dataType, isResell); - BigDecimal todayTotalMoneySum = parseMoney(body.allMoney()); - int todayOrderCount = body.count(); - int todayUnresellCount = countUnresell(rows); - List entities = new ArrayList<>(rows.size()); - for (HxrOrderRow row : rows) { - entities.add(toLbOrderRow( - row, tid, rowDataType, todayTotalMoneySum, todayOrderCount, todayUnresellCount)); + HxrOrderSelectResponse firstBody = null; + int page = 1; + int totalSynced = 0; + while (true) { + Optional opt = + hxrAdminOrderSelectService.fetchOrderSelect( + buyTimeStart, buyTimeEnd, isResell, page); + if (opt.isEmpty()) { + if (page == 1) { + result.put("success", false); + result.put("message", "未拉取到订单(请检查 hxr.admin cookie/phpsid、网络或后台返回)"); + result.put("synced", 0); + return result; + } + result.put("success", false); + result.put("message", "第 " + page + " 页拉取失败,已成功同步前 " + + (page - 1) + " 页共 " + totalSynced + " 条"); + result.put("synced", totalSynced); + if (firstBody != null) { + result.put("remoteCount", firstBody.count()); + result.put("allMoney", firstBody.allMoney()); + } + result.put("pages", page - 1); + return result; + } + + HxrOrderSelectResponse body = opt.get(); + if (firstBody == null) { + firstBody = body; + } + List rows = body.data(); + if (rows == null || rows.isEmpty()) { + break; + } + + BigDecimal todayTotalMoneySum = parseMoney(firstBody.allMoney()); + int todayOrderCount = firstBody.count(); + int todayUnresellCount = countUnresell(rows); + List entities = new ArrayList<>(rows.size()); + for (HxrOrderRow row : rows) { + entities.add(toLbOrderRow( + row, tid, rowDataType, todayTotalMoneySum, todayOrderCount, todayUnresellCount)); + } + + boolean ok = this.saveOrUpdateBatch(entities); + if (!ok) { + result.put("success", false); + result.put("message", "第 " + page + " 页保存失败,已成功同步前 " + + (page - 1) + " 页共 " + totalSynced + " 条"); + result.put("synced", totalSynced); + result.put("remoteCount", firstBody.count()); + result.put("allMoney", firstBody.allMoney()); + result.put("pages", page - 1); + return result; + } + totalSynced += entities.size(); + + if (rows.size() < HXR_ORDER_PAGE_SIZE ) { + break; + } + page++; } - boolean ok = this.saveOrUpdateBatch(entities); -// boolean ok = this.saveBatch(entities); - result.put("success", ok); - result.put("message", ok ? "同步完成" : "批量保存失败"); - result.put("synced", ok ? entities.size() : 0); - result.put("remoteCount", body.count()); - result.put("allMoney", body.allMoney()); + if (totalSynced == 0) { + result.put("success", true); + result.put("message", "接口成功,时间范围内无订单数据"); + result.put("synced", 0); + result.put("remoteCount", firstBody != null ? firstBody.count() : 0); + result.put("pages", page); + return result; + } + + result.put("success", true); + result.put("message", "同步完成"); + result.put("synced", totalSynced); + result.put("remoteCount", firstBody.count()); + result.put("allMoney", firstBody.allMoney()); + result.put("pages", page); return result; } catch (Exception e) { result.put("success", false);