diff --git a/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/api/hotel/HotelZaxOrderApi.java b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/api/hotel/HotelZaxOrderApi.java
new file mode 100644
index 0000000..33f946d
--- /dev/null
+++ b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/api/hotel/HotelZaxOrderApi.java
@@ -0,0 +1,20 @@
+package cn.iocoder.yudao.module.product.api.hotel;
+
+/**
+ * 酒店订单支付回调桥接(与商城共用 mall 支付应用)。
+ * 商户单号可能与 trade_order.id 撞号,必须以支付单反查酒店单。
+ */
+public interface HotelZaxOrderApi {
+
+ /**
+ * 支付成功通知:优先按 payOrderId 匹配酒店单。
+ *
+ * @return true=已按酒店单处理;false=不是酒店单,应继续走商城订单
+ */
+ boolean handlePayNotify(String merchantOrderId, Long payOrderId);
+
+ /**
+ * @return true=已按酒店单处理;false=不是酒店单
+ */
+ boolean updatePaidIfMatch(Long merchantOrderId, Long payOrderId);
+}
diff --git a/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/ErrorCodeConstants.java b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/ErrorCodeConstants.java
index 5da4261..22dcd17 100644
--- a/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/ErrorCodeConstants.java
+++ b/yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/enums/ErrorCodeConstants.java
@@ -75,4 +75,12 @@ public interface ErrorCodeConstants {
// ========== 贩卖机测试日志 1-008-013-000 ==========
ErrorCode DEVICE_LOG_NOT_EXISTS = new ErrorCode(1_008_013_000, "贩卖机测试日志不存在");
+ // ========== 资安心酒店本地库 1-008-020-000 ==========
+ ErrorCode HOTEL_ZAX_NOT_EXISTS = new ErrorCode(1_008_020_000, "本地酒店不存在");
+ ErrorCode HOTEL_ZAX_ROOM_NOT_EXISTS = new ErrorCode(1_008_020_001, "本地酒店房型不存在");
+ ErrorCode HOTEL_ZAX_PRODUCT_NOT_EXISTS = new ErrorCode(1_008_020_002, "本地酒店产品不存在");
+ ErrorCode HOTEL_ZAX_DAILY_NOT_EXISTS = new ErrorCode(1_008_020_003, "本地酒店日历不存在");
+ ErrorCode HOTEL_ZAX_ORDER_NOT_EXISTS = new ErrorCode(1_008_020_004, "本地酒店订单不存在");
+ ErrorCode HOTEL_ZAX_ORDER_CANCEL_FAIL = new ErrorCode(1_008_020_005, "酒店订单取消失败:{}");
+
}
diff --git a/yudao-module-mall/yudao-module-product-biz/pom.xml b/yudao-module-mall/yudao-module-product-biz/pom.xml
index e69e05d..ee6b9de 100644
--- a/yudao-module-mall/yudao-module-product-biz/pom.xml
+++ b/yudao-module-mall/yudao-module-product-biz/pom.xml
@@ -28,6 +28,11 @@
yudao-module-member-api
${revision}
+
+ cn.iocoder.boot
+ yudao-module-pay-api
+ ${revision}
+
diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/api/hotel/HotelZaxOrderApiImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/api/hotel/HotelZaxOrderApiImpl.java
new file mode 100644
index 0000000..c106275
--- /dev/null
+++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/api/hotel/HotelZaxOrderApiImpl.java
@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.module.product.api.hotel;
+
+import cn.iocoder.yudao.module.product.service.hotel.HotelZaxTradeService;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+@Service
+@Validated
+public class HotelZaxOrderApiImpl implements HotelZaxOrderApi {
+
+ @Resource
+ private HotelZaxTradeService hotelZaxTradeService;
+
+ @Override
+ public boolean handlePayNotify(String merchantOrderId, Long payOrderId) {
+ return hotelZaxTradeService.handlePayNotify(merchantOrderId, payOrderId);
+ }
+
+ @Override
+ public boolean updatePaidIfMatch(Long merchantOrderId, Long payOrderId) {
+ return hotelZaxTradeService.updatePaidIfMatch(merchantOrderId, payOrderId);
+ }
+}
diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/hotel/HotelZaxController.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/hotel/HotelZaxController.java
new file mode 100644
index 0000000..696c84b
--- /dev/null
+++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/hotel/HotelZaxController.java
@@ -0,0 +1,234 @@
+package cn.iocoder.yudao.module.product.controller.admin.hotel;
+
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.product.controller.admin.hotel.vo.HotelZaxDailyBatchReqVO;
+import cn.iocoder.yudao.module.product.controller.admin.hotel.vo.HotelZaxDailyPageReqVO;
+import cn.iocoder.yudao.module.product.controller.admin.hotel.vo.HotelZaxDailyRespVO;
+import cn.iocoder.yudao.module.product.controller.admin.hotel.vo.HotelZaxDailySaveReqVO;
+import cn.iocoder.yudao.module.product.controller.admin.hotel.vo.HotelZaxOrderPageReqVO;
+import cn.iocoder.yudao.module.product.controller.admin.hotel.vo.HotelZaxOrderRespVO;
+import cn.iocoder.yudao.module.product.controller.admin.hotel.vo.HotelZaxPageReqVO;
+import cn.iocoder.yudao.module.product.controller.admin.hotel.vo.HotelZaxProductRespVO;
+import cn.iocoder.yudao.module.product.controller.admin.hotel.vo.HotelZaxProductSaveReqVO;
+import cn.iocoder.yudao.module.product.controller.admin.hotel.vo.HotelZaxRespVO;
+import cn.iocoder.yudao.module.product.controller.admin.hotel.vo.HotelZaxRoomRespVO;
+import cn.iocoder.yudao.module.product.controller.admin.hotel.vo.HotelZaxRoomSaveReqVO;
+import cn.iocoder.yudao.module.product.controller.admin.hotel.vo.HotelZaxSaveReqVO;
+import cn.iocoder.yudao.module.product.controller.admin.hotel.vo.HotelZaxStatusReqVO;
+import cn.iocoder.yudao.module.product.dal.dataobject.hotel.HotelZaxDO;
+import cn.iocoder.yudao.module.product.dal.dataobject.hotel.HotelZaxSyncCursorDO;
+import cn.iocoder.yudao.module.product.dal.mysql.hotel.HotelZaxMapper;
+import cn.iocoder.yudao.module.product.dal.mysql.hotel.HotelZaxSyncCursorMapper;
+import cn.iocoder.yudao.module.product.service.hotel.HotelZaxAdminService;
+import cn.iocoder.yudao.module.product.service.hotel.HotelZaxSyncService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 资安心酒店本地库")
+@RestController
+@RequestMapping("/product/hotel-zax")
+@Validated
+public class HotelZaxController {
+
+ @Resource
+ private HotelZaxMapper hotelZaxMapper;
+
+ @Resource
+ private HotelZaxSyncCursorMapper cursorMapper;
+
+ @Resource
+ private HotelZaxSyncService hotelZaxSyncService;
+
+ @Resource
+ private HotelZaxAdminService hotelZaxAdminService;
+
+ @GetMapping("/page")
+ @Operation(summary = "本地酒店分页")
+ @PreAuthorize("@ss.hasPermission('product:hotel-zax:query')")
+ public CommonResult> page(@Valid HotelZaxPageReqVO req) {
+ return success(hotelZaxAdminService.page(req));
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "本地酒店详情(含房型/产品)")
+ @Parameter(name = "id", required = true)
+ @PreAuthorize("@ss.hasPermission('product:hotel-zax:query')")
+ public CommonResult get(@RequestParam("id") Long id) {
+ return success(hotelZaxAdminService.getDetail(id));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "编辑本地酒店基础信息")
+ @PreAuthorize("@ss.hasPermission('product:hotel-zax:update')")
+ public CommonResult update(@Valid @RequestBody HotelZaxSaveReqVO req) {
+ hotelZaxAdminService.update(req);
+ return success(true);
+ }
+
+ @PutMapping("/update-status")
+ @Operation(summary = "本地上下架")
+ @PreAuthorize("@ss.hasPermission('product:hotel-zax:update')")
+ public CommonResult updateStatus(@Valid @RequestBody HotelZaxStatusReqVO req) {
+ hotelZaxAdminService.updateStatus(req);
+ return success(true);
+ }
+
+ @PostMapping("/room/save")
+ @Operation(summary = "保存房型")
+ @PreAuthorize("@ss.hasPermission('product:hotel-zax:update')")
+ public CommonResult saveRoom(@Valid @RequestBody HotelZaxRoomSaveReqVO req) {
+ return success(hotelZaxAdminService.saveRoom(req));
+ }
+
+ @DeleteMapping("/room/delete")
+ @Operation(summary = "删除房型")
+ @PreAuthorize("@ss.hasPermission('product:hotel-zax:update')")
+ public CommonResult removeRoom(@RequestParam("hotelId") Long hotelId,
+ @RequestParam("roomId") Long roomId) {
+ hotelZaxAdminService.removeRoom(hotelId, roomId);
+ return success(true);
+ }
+
+ @PostMapping("/product/save")
+ @Operation(summary = "保存产品")
+ @PreAuthorize("@ss.hasPermission('product:hotel-zax:update')")
+ public CommonResult saveProduct(@Valid @RequestBody HotelZaxProductSaveReqVO req) {
+ return success(hotelZaxAdminService.saveProduct(req));
+ }
+
+ @DeleteMapping("/product/delete")
+ @Operation(summary = "删除产品")
+ @PreAuthorize("@ss.hasPermission('product:hotel-zax:update')")
+ public CommonResult removeProduct(@RequestParam("hotelId") Long hotelId,
+ @RequestParam("productId") Long productId) {
+ hotelZaxAdminService.removeProduct(hotelId, productId);
+ return success(true);
+ }
+
+ @GetMapping("/daily/page")
+ @Operation(summary = "本地酒店日历分页")
+ @PreAuthorize("@ss.hasPermission('product:hotel-zax:query')")
+ public CommonResult> pageDaily(@Valid HotelZaxDailyPageReqVO req) {
+ return success(hotelZaxAdminService.pageDaily(req));
+ }
+
+ @PostMapping("/daily/save")
+ @Operation(summary = "保存日历")
+ @PreAuthorize("@ss.hasPermission('product:hotel-zax:update')")
+ public CommonResult saveDaily(@Valid @RequestBody HotelZaxDailySaveReqVO req) {
+ return success(hotelZaxAdminService.saveDaily(req));
+ }
+
+ @PostMapping("/daily/batch")
+ @Operation(summary = "批量生成/调价日历 FILL/ADJUST")
+ @PreAuthorize("@ss.hasPermission('product:hotel-zax:update')")
+ public CommonResult