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
+65 -82
View File
@@ -1,79 +1,64 @@
-- ============================================================
-- 酒仓库管理系统 数据库 Schema
-- 酒仓库管理系统 数据库 Schema
-- MySQL 8.0+
-- 说明:所有业务表含 hotel_id 实现多租户隔离
-- 说明:所有业务表含 shop_id 实现多租户隔离
-- ============================================================
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ------------------------------------------------------------
-- 店(租户)
-- 店(租户)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `hotels` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL COMMENT '店名称',
`code` VARCHAR(50) NOT NULL COMMENT '店编号(唯一)',
`address` VARCHAR(255) DEFAULT NULL,
`phone` VARCHAR(30) DEFAULT NULL,
`custom_fields` JSON DEFAULT NULL COMMENT '扩展字段',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted_at` DATETIME DEFAULT NULL,
CREATE TABLE IF NOT EXISTS `shops` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL COMMENT '店名称',
`code` VARCHAR(50) NOT NULL COMMENT '店编号(唯一)',
`address` VARCHAR(255) DEFAULT NULL,
`phone` VARCHAR(30) DEFAULT NULL,
`manager_name` VARCHAR(50) DEFAULT NULL COMMENT '负责人',
`business_license` VARCHAR(500) DEFAULT NULL COMMENT '营业执照照片URL',
`shop_photos` JSON DEFAULT NULL COMMENT '门店照片URL数组',
`custom_fields` JSON DEFAULT NULL COMMENT '扩展字段',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted_at` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_code` (`code`),
KEY `idx_deleted_at` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='店(租户)';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='店(租户)';
-- ------------------------------------------------------------
-- 用户(操作人员)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `users` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`hotel_id` BIGINT UNSIGNED NOT NULL,
`shop_id` BIGINT UNSIGNED NOT NULL,
`username` VARCHAR(50) NOT NULL,
`password_hash` VARCHAR(255) NOT NULL COMMENT 'bcrypt',
`real_name` VARCHAR(50) DEFAULT NULL,
`phone` VARCHAR(30) DEFAULT NULL,
`role` ENUM('admin','operator') NOT NULL DEFAULT 'operator',
`role` ENUM('admin','operator','readonly') NOT NULL DEFAULT 'operator',
`is_active` TINYINT(1) NOT NULL DEFAULT 1,
`custom_fields` JSON DEFAULT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted_at` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_hotel_username` (`hotel_id`, `username`),
KEY `idx_hotel_id` (`hotel_id`),
UNIQUE KEY `uk_shop_username` (`shop_id`, `username`),
KEY `idx_shop_id` (`shop_id`),
KEY `idx_deleted_at` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户';
-- ------------------------------------------------------------
-- OAuth 第三方登录绑定
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `oauth_providers` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` BIGINT UNSIGNED NOT NULL,
`provider` ENUM('wechat','google','apple') NOT NULL,
`provider_user_id` VARCHAR(255) NOT NULL,
`access_token` TEXT DEFAULT NULL,
`refresh_token` TEXT DEFAULT NULL,
`expires_at` DATETIME DEFAULT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_provider_uid` (`provider`, `provider_user_id`),
KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='OAuth第三方绑定';
-- ------------------------------------------------------------
-- 许可证
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `licenses` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`hotel_id` BIGINT UNSIGNED NOT NULL,
`shop_id` BIGINT UNSIGNED NOT NULL,
`license_key` VARCHAR(255) NOT NULL COMMENT '激活码',
`device_id` VARCHAR(255) DEFAULT NULL COMMENT '绑定设备ID',
`type` ENUM('trial','annual','lifetime') NOT NULL DEFAULT 'trial',
`type` ENUM('trial','monthly','annual','lifetime') NOT NULL DEFAULT 'trial',
`expires_at` DATETIME DEFAULT NULL COMMENT 'NULL=永久',
`is_active` TINYINT(1) NOT NULL DEFAULT 1,
`features` JSON DEFAULT NULL COMMENT '功能开关 {"finance":true}',
@@ -82,7 +67,7 @@ CREATE TABLE IF NOT EXISTS `licenses` (
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_license_key` (`license_key`),
KEY `idx_hotel_id` (`hotel_id`)
KEY `idx_shop_id` (`shop_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='许可证';
-- ------------------------------------------------------------
@@ -90,7 +75,7 @@ CREATE TABLE IF NOT EXISTS `licenses` (
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `product_categories` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`hotel_id` BIGINT UNSIGNED NOT NULL,
`shop_id` BIGINT UNSIGNED NOT NULL,
`name` VARCHAR(100) NOT NULL,
`parent_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '父分类,支持二级',
`sort_order` INT NOT NULL DEFAULT 0,
@@ -98,7 +83,7 @@ CREATE TABLE IF NOT EXISTS `product_categories` (
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted_at` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_hotel_id` (`hotel_id`)
KEY `idx_shop_id` (`shop_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品分类';
-- ------------------------------------------------------------
@@ -106,7 +91,7 @@ CREATE TABLE IF NOT EXISTS `product_categories` (
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `products` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`hotel_id` BIGINT UNSIGNED NOT NULL,
`shop_id` BIGINT UNSIGNED NOT NULL,
`code` VARCHAR(50) DEFAULT NULL COMMENT '商品编号',
`barcode` VARCHAR(100) DEFAULT NULL COMMENT '条码',
`name` VARCHAR(200) NOT NULL COMMENT '商品名称',
@@ -115,8 +100,8 @@ CREATE TABLE IF NOT EXISTS `products` (
`unit` VARCHAR(20) DEFAULT NULL COMMENT '单位',
`category_id` BIGINT UNSIGNED DEFAULT NULL,
`brand` VARCHAR(100) DEFAULT NULL COMMENT '品牌',
`purchase_price` DECIMAL(12,2) DEFAULT NULL COMMENT '参考进价',
`sale_price` DECIMAL(12,2) DEFAULT NULL COMMENT '参考售价',
`purchase_price` DECIMAL(16,2) DEFAULT NULL COMMENT '参考进价',
`sale_price` DECIMAL(16,2) DEFAULT NULL COMMENT '参考售价',
`min_stock` INT DEFAULT 0 COMMENT '库存预警值',
`custom_fields` JSON DEFAULT NULL COMMENT '动态扩展字段',
`remark` VARCHAR(500) DEFAULT NULL,
@@ -124,7 +109,7 @@ CREATE TABLE IF NOT EXISTS `products` (
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted_at` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_hotel_id` (`hotel_id`),
KEY `idx_shop_id` (`shop_id`),
KEY `idx_category` (`category_id`),
KEY `idx_deleted_at` (`deleted_at`),
FULLTEXT KEY `ft_name` (`name`)
@@ -135,7 +120,7 @@ CREATE TABLE IF NOT EXISTS `products` (
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `warehouses` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`hotel_id` BIGINT UNSIGNED NOT NULL,
`shop_id` BIGINT UNSIGNED NOT NULL,
`name` VARCHAR(100) NOT NULL,
`location` VARCHAR(200) DEFAULT NULL,
`is_default` TINYINT(1) NOT NULL DEFAULT 0,
@@ -144,7 +129,7 @@ CREATE TABLE IF NOT EXISTS `warehouses` (
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted_at` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_hotel_id` (`hotel_id`)
KEY `idx_shop_id` (`shop_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='仓库';
-- ------------------------------------------------------------
@@ -152,7 +137,7 @@ CREATE TABLE IF NOT EXISTS `warehouses` (
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `partners` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`hotel_id` BIGINT UNSIGNED NOT NULL,
`shop_id` BIGINT UNSIGNED NOT NULL,
`code` VARCHAR(50) DEFAULT NULL,
`name` VARCHAR(200) NOT NULL,
`type` SET('supplier','customer') NOT NULL DEFAULT 'supplier' COMMENT '可同时是供应商和客户',
@@ -160,15 +145,13 @@ CREATE TABLE IF NOT EXISTS `partners` (
`phone` VARCHAR(30) DEFAULT NULL,
`address` VARCHAR(255) DEFAULT NULL,
`bank_account` VARCHAR(100) DEFAULT NULL COMMENT '银行账号',
`credit_limit` DECIMAL(12,2) DEFAULT NULL COMMENT '信用额度',
`balance` DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT '往来余额(正=应收,负=应付)',
`custom_fields` JSON DEFAULT NULL,
`remark` VARCHAR(500) DEFAULT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted_at` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_hotel_id` (`hotel_id`),
KEY `idx_shop_id` (`shop_id`),
KEY `idx_deleted_at` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='往来单位';
@@ -177,7 +160,7 @@ CREATE TABLE IF NOT EXISTS `partners` (
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `stock_in_orders` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`hotel_id` BIGINT UNSIGNED NOT NULL,
`shop_id` BIGINT UNSIGNED NOT NULL,
`order_no` VARCHAR(50) NOT NULL COMMENT '入库单号',
`type` VARCHAR(30) NOT NULL DEFAULT 'purchase' COMMENT '入库类型: purchase采购/return退货/other其他',
`warehouse_id` BIGINT UNSIGNED NOT NULL,
@@ -186,7 +169,7 @@ CREATE TABLE IF NOT EXISTS `stock_in_orders` (
`reviewer_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '审核人',
`status` ENUM('draft','pending','approved','rejected') NOT NULL DEFAULT 'draft',
`order_date` DATE NOT NULL,
`total_amount` DECIMAL(14,2) NOT NULL DEFAULT 0,
`total_amount` DECIMAL(16,2) NOT NULL DEFAULT 0,
`reviewed_at` DATETIME DEFAULT NULL,
`custom_fields` JSON DEFAULT NULL,
`remark` VARCHAR(500) DEFAULT NULL,
@@ -194,8 +177,8 @@ CREATE TABLE IF NOT EXISTS `stock_in_orders` (
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted_at` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_no` (`hotel_id`, `order_no`),
KEY `idx_hotel_id` (`hotel_id`),
UNIQUE KEY `uk_order_no` (`shop_id`, `order_no`),
KEY `idx_shop_id` (`shop_id`),
KEY `idx_warehouse` (`warehouse_id`),
KEY `idx_order_date` (`order_date`),
KEY `idx_status` (`status`)
@@ -207,18 +190,18 @@ CREATE TABLE IF NOT EXISTS `stock_in_orders` (
CREATE TABLE IF NOT EXISTS `stock_in_items` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`order_id` BIGINT UNSIGNED NOT NULL,
`hotel_id` BIGINT UNSIGNED NOT NULL,
`shop_id` BIGINT UNSIGNED NOT NULL,
`product_id` BIGINT UNSIGNED NOT NULL,
`quantity` DECIMAL(12,3) NOT NULL COMMENT '数量',
`unit_price` DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT '单价',
`total_price` DECIMAL(14,2) NOT NULL DEFAULT 0,
`unit_price` DECIMAL(16,2) NOT NULL DEFAULT 0 COMMENT '单价',
`total_price` DECIMAL(16,2) NOT NULL DEFAULT 0,
`batch_no` VARCHAR(50) DEFAULT NULL COMMENT '批次号',
`expire_date` DATE DEFAULT NULL COMMENT '有效期',
`custom_fields` JSON DEFAULT NULL,
`remark` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_order_id` (`order_id`),
KEY `idx_hotel_product` (`hotel_id`, `product_id`)
KEY `idx_shop_product` (`shop_id`, `product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='入库单明细';
-- ------------------------------------------------------------
@@ -226,7 +209,7 @@ CREATE TABLE IF NOT EXISTS `stock_in_items` (
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `stock_out_orders` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`hotel_id` BIGINT UNSIGNED NOT NULL,
`shop_id` BIGINT UNSIGNED NOT NULL,
`order_no` VARCHAR(50) NOT NULL,
`type` VARCHAR(30) NOT NULL DEFAULT 'sale' COMMENT 'sale销售/return退货/other其他',
`warehouse_id` BIGINT UNSIGNED NOT NULL,
@@ -235,7 +218,7 @@ CREATE TABLE IF NOT EXISTS `stock_out_orders` (
`reviewer_id` BIGINT UNSIGNED DEFAULT NULL,
`status` ENUM('draft','pending','approved','rejected') NOT NULL DEFAULT 'draft',
`order_date` DATE NOT NULL,
`total_amount` DECIMAL(14,2) NOT NULL DEFAULT 0,
`total_amount` DECIMAL(16,2) NOT NULL DEFAULT 0,
`reviewed_at` DATETIME DEFAULT NULL,
`custom_fields` JSON DEFAULT NULL,
`remark` VARCHAR(500) DEFAULT NULL,
@@ -243,8 +226,8 @@ CREATE TABLE IF NOT EXISTS `stock_out_orders` (
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted_at` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_no` (`hotel_id`, `order_no`),
KEY `idx_hotel_id` (`hotel_id`),
UNIQUE KEY `uk_order_no` (`shop_id`, `order_no`),
KEY `idx_shop_id` (`shop_id`),
KEY `idx_warehouse` (`warehouse_id`),
KEY `idx_order_date` (`order_date`),
KEY `idx_status` (`status`)
@@ -256,16 +239,16 @@ CREATE TABLE IF NOT EXISTS `stock_out_orders` (
CREATE TABLE IF NOT EXISTS `stock_out_items` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`order_id` BIGINT UNSIGNED NOT NULL,
`hotel_id` BIGINT UNSIGNED NOT NULL,
`shop_id` BIGINT UNSIGNED NOT NULL,
`product_id` BIGINT UNSIGNED NOT NULL,
`quantity` DECIMAL(12,3) NOT NULL,
`unit_price` DECIMAL(12,2) NOT NULL DEFAULT 0,
`total_price` DECIMAL(14,2) NOT NULL DEFAULT 0,
`unit_price` DECIMAL(16,2) NOT NULL DEFAULT 0,
`total_price` DECIMAL(16,2) NOT NULL DEFAULT 0,
`custom_fields` JSON DEFAULT NULL,
`remark` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_order_id` (`order_id`),
KEY `idx_hotel_product` (`hotel_id`, `product_id`)
KEY `idx_shop_product` (`shop_id`, `product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='出库单明细';
-- ------------------------------------------------------------
@@ -273,14 +256,14 @@ CREATE TABLE IF NOT EXISTS `stock_out_items` (
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `inventory` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`hotel_id` BIGINT UNSIGNED NOT NULL,
`shop_id` BIGINT UNSIGNED NOT NULL,
`warehouse_id` BIGINT UNSIGNED NOT NULL,
`product_id` BIGINT UNSIGNED NOT NULL,
`quantity` DECIMAL(12,3) NOT NULL DEFAULT 0 COMMENT '当前库存',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_hotel_wh_product` (`hotel_id`, `warehouse_id`, `product_id`),
KEY `idx_hotel_id` (`hotel_id`)
UNIQUE KEY `uk_shop_wh_product` (`shop_id`, `warehouse_id`, `product_id`),
KEY `idx_shop_id` (`shop_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='实时库存';
-- ------------------------------------------------------------
@@ -288,7 +271,7 @@ CREATE TABLE IF NOT EXISTS `inventory` (
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `inventory_logs` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`hotel_id` BIGINT UNSIGNED NOT NULL,
`shop_id` BIGINT UNSIGNED NOT NULL,
`warehouse_id` BIGINT UNSIGNED NOT NULL,
`product_id` BIGINT UNSIGNED NOT NULL,
`direction` ENUM('in','out') NOT NULL,
@@ -300,7 +283,7 @@ CREATE TABLE IF NOT EXISTS `inventory_logs` (
`operator_id` BIGINT UNSIGNED DEFAULT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_hotel_product` (`hotel_id`, `product_id`),
KEY `idx_shop_product` (`shop_id`, `product_id`),
KEY `idx_ref` (`ref_type`, `ref_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='库存流水';
@@ -309,7 +292,7 @@ CREATE TABLE IF NOT EXISTS `inventory_logs` (
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `inventory_checks` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`hotel_id` BIGINT UNSIGNED NOT NULL,
`shop_id` BIGINT UNSIGNED NOT NULL,
`check_no` VARCHAR(50) NOT NULL,
`warehouse_id` BIGINT UNSIGNED NOT NULL,
`operator_id` BIGINT UNSIGNED NOT NULL,
@@ -319,14 +302,14 @@ CREATE TABLE IF NOT EXISTS `inventory_checks` (
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_check_no` (`hotel_id`, `check_no`),
KEY `idx_hotel_id` (`hotel_id`)
UNIQUE KEY `uk_check_no` (`shop_id`, `check_no`),
KEY `idx_shop_id` (`shop_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='库存盘点单';
CREATE TABLE IF NOT EXISTS `inventory_check_items` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`check_id` BIGINT UNSIGNED NOT NULL,
`hotel_id` BIGINT UNSIGNED NOT NULL,
`shop_id` BIGINT UNSIGNED NOT NULL,
`product_id` BIGINT UNSIGNED NOT NULL,
`system_qty` DECIMAL(12,3) NOT NULL COMMENT '系统数量',
`actual_qty` DECIMAL(12,3) NOT NULL COMMENT '实际盘点数量',
@@ -341,11 +324,11 @@ CREATE TABLE IF NOT EXISTS `inventory_check_items` (
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `finance_records` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`hotel_id` BIGINT UNSIGNED NOT NULL,
`shop_id` BIGINT UNSIGNED NOT NULL,
`partner_id` BIGINT UNSIGNED DEFAULT NULL,
`type` ENUM('receivable','payable','receipt','payment') NOT NULL COMMENT '应收/应付/收款/付款',
`amount` DECIMAL(14,2) NOT NULL,
`balance` DECIMAL(14,2) NOT NULL COMMENT '操作后余额',
`amount` DECIMAL(16,2) NOT NULL,
`balance` DECIMAL(16,2) NOT NULL COMMENT '操作后余额',
`ref_type` VARCHAR(30) DEFAULT NULL COMMENT '关联单据类型',
`ref_id` BIGINT UNSIGNED DEFAULT NULL,
`operator_id` BIGINT UNSIGNED NOT NULL,
@@ -354,7 +337,7 @@ CREATE TABLE IF NOT EXISTS `finance_records` (
`remark` VARCHAR(500) DEFAULT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_hotel_id` (`hotel_id`),
KEY `idx_shop_id` (`shop_id`),
KEY `idx_partner` (`partner_id`),
KEY `idx_record_date` (`record_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='财务流水';
@@ -364,14 +347,14 @@ CREATE TABLE IF NOT EXISTS `finance_records` (
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `number_rules` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`hotel_id` BIGINT UNSIGNED NOT NULL,
`shop_id` BIGINT UNSIGNED NOT NULL,
`type` VARCHAR(30) NOT NULL COMMENT 'stock_in/stock_out/check',
`prefix` VARCHAR(20) DEFAULT '' COMMENT '前缀',
`current_no` INT NOT NULL DEFAULT 0 COMMENT '当前序号',
`date_format` VARCHAR(20) DEFAULT 'YYYYMMDD' COMMENT '日期格式',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_hotel_type` (`hotel_id`, `type`)
UNIQUE KEY `uk_shop_type` (`shop_id`, `type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='单号规则';
SET FOREIGN_KEY_CHECKS = 1;