From 04a39fbeff0c9b76e7303a7f3b336e0c07370d37 Mon Sep 17 00:00:00 2001
From: zjf <1799650030@qq.com>
Date: Wed, 21 Oct 2026 13:14:48 +0800
Subject: [PATCH] =?UTF-8?q?=E9=85=92=E5=BA=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../supermarket/constant/SmHotelOpenApi.java | 13 +
.../config/SmHotelOpenProperties.java | 23 +
.../controller/SmHotelAppController.java | 270 +++++++++---
.../controller/SmHotelOpenApiController.java | 16 +
.../shangyou/ShangyouHotelClient.java | 58 ++-
.../mapper/SmHotelDailyMapper.java | 16 +
.../service/SmHotelOpenApiService.java | 6 +
.../SmHotelOpenResourceNotifyService.java | 21 +
.../service/impl/SmHotelMidServiceImpl.java | 11 +-
.../impl/SmHotelOpenApiServiceImpl.java | 411 ++++++++++++++++--
.../SmHotelOpenResourceNotifyServiceImpl.java | 112 +++++
.../service/impl/SmHotelOrderServiceImpl.java | 20 +-
.../service/impl/SmHotelServiceImpl.java | 27 +-
.../src/main/resources/application.yml | 7 +
14 files changed, 910 insertions(+), 101 deletions(-)
create mode 100644 pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/config/SmHotelOpenProperties.java
create mode 100644 pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmHotelOpenResourceNotifyService.java
create mode 100644 pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmHotelOpenResourceNotifyServiceImpl.java
diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/constant/SmHotelOpenApi.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/constant/SmHotelOpenApi.java
index 3c3473637..268b3de75 100644
--- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/constant/SmHotelOpenApi.java
+++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/constant/SmHotelOpenApi.java
@@ -13,6 +13,15 @@ public final class SmHotelOpenApi {
public static final String HOTEL_DAILY = BASE + "/hotel/daily";
+ /** 授权范围内筛选项(区域 adcode/名称、商圈、星级等) */
+ public static final String HOTEL_FILTER_META = BASE + "/hotel/filter-meta";
+
+ /**
+ * 增量同步拉取(下游落库用):按 updateTime 水位翻页,可含下架。
+ * 路径仍走 list 增强参数亦可;独立路径便于限流与文档。
+ */
+ public static final String HOTEL_SYNC = BASE + "/hotel/sync";
+
public static final String ORDER_CHECK = BASE + "/order/check";
public static final String ORDER_CREATE = BASE + "/order/create";
@@ -28,6 +37,10 @@ public final class SmHotelOpenApi {
public static final String API_HOTEL_DAILY = "hotel.daily";
+ public static final String API_HOTEL_FILTER_META = "hotel.filterMeta";
+
+ public static final String API_HOTEL_SYNC = "hotel.sync";
+
public static final String API_ORDER_CHECK = "order.check";
public static final String API_ORDER_CREATE = "order.create";
diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/config/SmHotelOpenProperties.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/config/SmHotelOpenProperties.java
new file mode 100644
index 000000000..f19d87e68
--- /dev/null
+++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/config/SmHotelOpenProperties.java
@@ -0,0 +1,23 @@
+package com.bsd.pjcloud.supermarket.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 酒店下游开放平台配置。
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "sm-hotel.open")
+public class SmHotelOpenProperties {
+
+ /**
+ * 对外开放的文件/图片根地址(含网关前缀,无尾斜杠),例如:
+ * https://www.zianxin.com/api
+ *
+ * 库内相对路径(如 /admin/sys-file/oss/file?fileName=xx)会拼到此前缀后下发;
+ * 已是 http(s) 的上游图原样返回。未配置时仍返回库内原值(下游可能无法展示)。
+ */
+ private String publicFileBaseUrl = "";
+}
diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmHotelAppController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmHotelAppController.java
index 63b5127a5..793c30da8 100644
--- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmHotelAppController.java
+++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmHotelAppController.java
@@ -86,6 +86,14 @@ public class SmHotelAppController {
private static final String CANDIDATE_CACHE_OVERFLOW = "OVERFLOW";
+ /** 列表页结果短缓存(同条件重复进入/下拉) */
+ private static final String PAGE_CACHE_PREFIX = "sm:hotel:app:page:";
+
+ private static final long PAGE_CACHE_SECONDS = 45L;
+
+ /** 先按区域/关键字缩小酒店集合时的上限,超出则回退 EXISTS */
+ private static final int MAX_SCOPED_HOTEL_IDS = 3000;
+
private final SmHotelService hotelService;
private final SmHotelMidService midService;
@@ -219,8 +227,95 @@ public class SmHotelAppController {
@RequestParam(required = false) Integer guests,
@RequestParam(required = false) String checkIn,
@RequestParam(required = false) String checkOut) {
+ long t0 = System.currentTimeMillis();
List starList = parseIntCsv(starLevels);
List facilityList = parseStrCsv(facilityTags);
+ LocalDate stayFrom = parseDay(checkIn);
+ LocalDate stayToExclusive = parseDay(checkOut);
+ int guestTotal = resolveGuestTotal(guests, adults, children);
+ int roomCnt = rooms == null || rooms < 1 ? 1 : Math.min(rooms, 20);
+ int needCap = guestTotal > 0 ? Math.max(1, (guestTotal + roomCnt - 1) / roomCnt) : 1;
+
+ String pageCacheKey = buildPageCacheKey(page.getCurrent(), page.getSize(), keyword, city, district,
+ districtAdcode, bizArea, starLevels, minScore, minPrice, maxPrice, facilityTags, rooms, adults,
+ children, guests, checkIn, checkOut);
+ Page