fix(backend): JWT config mapstructure tag 修复 + 模型从 hotel 重构为 shop

- 修复 JWTConfig 缺少 mapstructure tag 导致 access_expire_min 解析为 0,
  token 签发即过期,所有 API 请求返回 401
- 全部 config struct 补齐 mapstructure tag(secret/dsn/hmac_secret 等)
- 模型层从 hotel/HotelID 统一重命名为 shop/ShopID
- 删除旧 migrations(001-004),新增 001_init 综合迁移文件
- 更新 schema.sql、testutil、handler/service/model 相关引用

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-04-07 22:20:12 +08:00
parent 37112d6599
commit 31ea370cea
50 changed files with 2675 additions and 951 deletions
+6 -6
View File
@@ -4,8 +4,8 @@
## 项目简介
面向酒店的酒水仓库管理系统。核心特点:
- **多租户**:一个账号对应一个店,数据完全隔离(通过 `hotel_id` 字段)
面向酒水门店的仓库管理系统。核心特点:
- **多租户**:一个账号对应一个店,数据完全隔离(通过 `shop_id` 字段)
- **付费授权**:许可证绑定设备 ID,支持试用/年付/买断
- **跨端客户端**:Flutter 单一代码库,支持 Windows / Web / macOS / iOS / Android
@@ -64,8 +64,8 @@ jiu/
```yaml
主要表:
hotels: # 酒店(租户)
users: # 用户(含 hotel_id
shops: # 酒店(租户)
users: # 用户(含 shop_id
licenses: # 许可证(含 device_id 绑定)
products: # 商品(含 custom_fields JSON 动态扩展)
warehouses: # 仓库
@@ -74,7 +74,7 @@ jiu/
stock_in_items: # 入库单明细
stock_out_orders: # 出库单
stock_out_items: # 出库单明细
inventory: # 实时库存(唯一键:hotel_id+warehouse_id+product_id
inventory: # 实时库存(唯一键:shop_id+warehouse_id+product_id
inventory_logs: # 库存流水(每次变动记录)
inventory_checks: # 盘点单
finance_records: # 财务流水
@@ -83,7 +83,7 @@ jiu/
## 关键业务规则
1. **多租户**:所有查询必须带 `hotel_id` 条件,`hotel_id` 只从 JWT 获取,不信任请求参数
1. **多租户**:所有查询必须带 `shop_id` 条件,`shop_id` 只从 JWT 获取,不信任请求参数
2. **库存变更**:入库/出库审核通过时,在同一事务中更新 `inventory` + 写 `inventory_logs`
3. **出库前检查**:出库审核时必须校验库存充足,不足时返回错误并回滚事务
4. **单号生成**:通过 `number_rules` 表事务安全生成,格式 `{前缀}{日期}{6位序号}`