Skip to content

商户日期库存管理 ​

入口和首期范围 ​

AdminWeb → 商户中心 → 商户管理 → 商户详情 → 结算底价 → 编辑库存。

  • 房型:房型 + 日期,不是实体房号。
  • 酒店商品:已投放团购/拼团的活动 + 日期。界面展示关联房型,但不联动修改房型或其他活动。
  • 只编辑已存在、已设置有限库存的日期。历史日期、缺失房态、未设置日期配额不可编辑。
  • 单日、多日、当月日期范围批量设置总库存;已占用只读。剩余 = 总库存 - 已占用。
  • 库存调整不改变底价、售价、房态、活动状态或订单。

一致性和留痕 ​

  • 客户端提交日期、原总库存、原已占用、新总库存、修改原因,不提交价格。
  • 保存按日期排序加行锁,核对原库存和占用,并通过条件更新再次保证总库存不低于实时已占用。
  • 任意日期冲突、写入失败或记录失败,整批回滚;弹窗保留输入,运营可刷新后重新调整。
  • 数量必须是 0 至 2147483647 的整数,不接受小数截断。
  • 变更复用商户最近变更入口,来源为 PLATFORM_STOCK,明细记录原库存、新库存、当时已占用。
  • 库存明细的价格字段为空,不参与历史结算价查询。
  • 旧售价编辑页的库存能力保留,但库存变化额外校验库存权限、有限配额、已占用,并记录数量明细。

与其他库存写入的关系 ​

平台调整会为该日期标记 platform_stock_override = 1:

  • 房型默认库存同步、月度房态发布、商品月度发布保留平台单独设置的库存。
  • 待审核房态记录的旧库存不会覆盖平台调整;价格和房态审核仍按原流程执行。
  • 商品旧价格日历入口尝试改变已被平台单独调整的库存会报错,需转到商户详情编辑库存。
  • 商家在房型日历主动再次修改库存仍属于明确的新操作,会替换库存并解除该日期覆盖标记;被动同步和审核不会解除标记。
  • 订单占用和释放仍修改原有 sold,不创建第二套库存。
  • 未设限日期的历史占用不一定计数,因此首期禁止将其直接改为有限配额,需后续单独设计核对存量订单的流程。

发布 ​

先执行迁移 V20260920_001__merchant_inventory_management.sql,再发布后端和 AdminWeb。 迁移增加日历覆盖标记及库存变更字段,允许变更明细价格字段为空。请走现有迁移和发布脚本,不直接修改生产库。

权限:

  • xl:merchant:inventory:list:查看库存对象及日历。
  • xl:merchant:inventory:edit:保存库存。
  • 普通运营角色需要同时分配上述两个权限,并保留商户详情及结算底价列表的原有查看权限。
  • 迁移只为已有底价查看角色继承库存查看权限,不自动授予库存编辑权限。管理员通配权限可直接使用。

接口位于 /api/admin/merchants/{merchantId}/inventory/{targetType}/{targetId}:

  • GET:库存对象;平台运营商品返回可选酒店活动。
  • GET /calendar?startDate=...&endDate=...:日期库存。
  • PUT:批量保存;类型仅支持 ROOM_TYPE 或 PRODUCT_ACTIVITY。

验证 ​

后端覆盖对象归属、权限、数量校验、日期限制、有限配额、库存不联动价格/房型、条件更新、事务回滚、订单并发和覆盖标记。 事务测试使用隔离的 H2 MySQL 模式库,不访问业务库。MerchantInventoryMysqlTest 会在真实 MySQL 中重复执行事务测试,并验证商品库存、订单占用和月度发布的 SQL。

默认使用 Testcontainers 启动 MySQL 8.0.36;没有 Docker 时可使用独立的本机临时 MySQL 实例:

bash
cd Api
mvn -pl ruoyi-system -am -Dtest=MerchantInventoryMysqlTest -Dsurefire.failIfNoSpecifiedTests=false -Dxiedao.test.mysql.port=33306 test
mvn -pl ruoyi-migration -am -Dxiedao.test.mysql.port=33306 test

本机端口模式只用于 root 空密码的临时测试实例,连接固定为 127.0.0.1。测试自动创建随机命名的数据库并在结束时删除,不接受业务库名,不应指向实际服务实例。未提供测试端口且 Docker 不可用时,真实 MySQL 测试会跳过,不能将跳过视为验证通过。

2026-09-20 已在隔离 MySQL 8.4 实例完成 8 项库存 SQL/事务测试,以及基准版本之后的 55 条迁移执行和 Flyway 校验;验证了存量库存和占用不变、库存字段创建、库存查看权限继承及编辑权限不自动授予。当前 Flyway 会提示其声明的已测试版本上限为 MySQL 8.1,但此次执行和校验均通过;没有因此更改项目的 Flyway 版本。

前端:

bash
cd AdminWeb
node --test tests/merchant-inventory.test.mjs tests/merchant-sale-price-contract.test.mjs tests/merchant-settlement-price-contract.test.mjs
npm run build:prod
PLAYWRIGHT_MODULE=/path/to/playwright TEST_BASE_URL=http://127.0.0.1:8081 node tests/merchant-inventory.browser.mjs

浏览器回归使用模拟 API,覆盖房型/活动选择、单日/批量保存、冲突输入保留、未保存确认、重试及桌面/手机布局。

携岛 XieDao · 内部文档