0e42f0e417
- 项目目录结构:backend/ deploy/ schema/ migrations/ - 数据库 Schema:所有建表 SQL,含 hotel_id 多租户隔离 - Go 后端:config、model、handler、service、middleware、router - 认证:账号密码登录 + JWT(Access + Refresh Token) - 许可证:HMAC-SHA256 激活码生成 + 设备绑定验证 - 业务模块:商品、仓库、往来单位、入库、出库、库存、盘点 - 库存事务:入库/出库审核时原子更新库存 + 流水记录 - 数据导入:Excel/CSV 批量导入商品、往来单位 - Docker Compose:本地 MySQL + Adminer Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
165 lines
7.3 KiB
SQL
165 lines
7.3 KiB
SQL
CREATE TABLE IF NOT EXISTS `stock_in_orders` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`hotel_id` BIGINT UNSIGNED NOT NULL,
|
|
`order_no` VARCHAR(50) NOT NULL,
|
|
`type` VARCHAR(30) NOT NULL DEFAULT 'purchase',
|
|
`warehouse_id` BIGINT UNSIGNED NOT NULL,
|
|
`partner_id` BIGINT UNSIGNED DEFAULT NULL,
|
|
`operator_id` BIGINT UNSIGNED NOT NULL,
|
|
`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,
|
|
`reviewed_at` DATETIME DEFAULT NULL,
|
|
`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`),
|
|
UNIQUE KEY `uk_order_no` (`hotel_id`, `order_no`),
|
|
KEY `idx_hotel_id` (`hotel_id`),
|
|
KEY `idx_order_date` (`order_date`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
|
|
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,
|
|
`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,
|
|
`batch_no` VARCHAR(50) DEFAULT NULL,
|
|
`expire_date` DATE DEFAULT NULL,
|
|
`custom_fields` JSON DEFAULT NULL,
|
|
`remark` VARCHAR(255) DEFAULT NULL,
|
|
PRIMARY KEY (`id`),
|
|
KEY `idx_order_id` (`order_id`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
|
|
CREATE TABLE IF NOT EXISTS `stock_out_orders` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`hotel_id` BIGINT UNSIGNED NOT NULL,
|
|
`order_no` VARCHAR(50) NOT NULL,
|
|
`type` VARCHAR(30) NOT NULL DEFAULT 'sale',
|
|
`warehouse_id` BIGINT UNSIGNED NOT NULL,
|
|
`partner_id` BIGINT UNSIGNED DEFAULT NULL,
|
|
`operator_id` BIGINT UNSIGNED NOT NULL,
|
|
`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,
|
|
`reviewed_at` DATETIME DEFAULT NULL,
|
|
`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`),
|
|
UNIQUE KEY `uk_order_no` (`hotel_id`, `order_no`),
|
|
KEY `idx_hotel_id` (`hotel_id`),
|
|
KEY `idx_order_date` (`order_date`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
|
|
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,
|
|
`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,
|
|
`custom_fields` JSON DEFAULT NULL,
|
|
`remark` VARCHAR(255) DEFAULT NULL,
|
|
PRIMARY KEY (`id`),
|
|
KEY `idx_order_id` (`order_id`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
|
|
CREATE TABLE IF NOT EXISTS `inventory` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`hotel_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,
|
|
`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`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
|
|
CREATE TABLE IF NOT EXISTS `inventory_logs` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`hotel_id` BIGINT UNSIGNED NOT NULL,
|
|
`warehouse_id` BIGINT UNSIGNED NOT NULL,
|
|
`product_id` BIGINT UNSIGNED NOT NULL,
|
|
`direction` ENUM('in','out') NOT NULL,
|
|
`quantity` DECIMAL(12,3) NOT NULL,
|
|
`qty_before` DECIMAL(12,3) NOT NULL,
|
|
`qty_after` DECIMAL(12,3) NOT NULL,
|
|
`ref_type` VARCHAR(30) NOT NULL,
|
|
`ref_id` BIGINT UNSIGNED NOT NULL,
|
|
`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`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
|
|
CREATE TABLE IF NOT EXISTS `inventory_checks` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`hotel_id` BIGINT UNSIGNED NOT NULL,
|
|
`check_no` VARCHAR(50) NOT NULL,
|
|
`warehouse_id` BIGINT UNSIGNED NOT NULL,
|
|
`operator_id` BIGINT UNSIGNED NOT NULL,
|
|
`status` ENUM('draft','completed') NOT NULL DEFAULT 'draft',
|
|
`check_date` DATE NOT 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,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_check_no` (`hotel_id`, `check_no`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
|
|
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,
|
|
`product_id` BIGINT UNSIGNED NOT NULL,
|
|
`system_qty` DECIMAL(12,3) NOT NULL,
|
|
`actual_qty` DECIMAL(12,3) NOT NULL,
|
|
`diff_qty` DECIMAL(12,3) GENERATED ALWAYS AS (`actual_qty` - `system_qty`) STORED,
|
|
`remark` VARCHAR(255) DEFAULT NULL,
|
|
PRIMARY KEY (`id`),
|
|
KEY `idx_check_id` (`check_id`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
|
|
CREATE TABLE IF NOT EXISTS `finance_records` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`hotel_id` BIGINT UNSIGNED NOT NULL,
|
|
`partner_id` BIGINT UNSIGNED DEFAULT NULL,
|
|
`type` ENUM('receivable','payable','receipt','payment') NOT NULL,
|
|
`amount` DECIMAL(14,2) NOT NULL,
|
|
`balance` DECIMAL(14,2) NOT NULL,
|
|
`ref_type` VARCHAR(30) DEFAULT NULL,
|
|
`ref_id` BIGINT UNSIGNED DEFAULT NULL,
|
|
`operator_id` BIGINT UNSIGNED NOT NULL,
|
|
`record_date` DATE NOT NULL,
|
|
`custom_fields` JSON DEFAULT NULL,
|
|
`remark` VARCHAR(500) DEFAULT NULL,
|
|
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
KEY `idx_hotel_id` (`hotel_id`),
|
|
KEY `idx_record_date` (`record_date`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
|
|
CREATE TABLE IF NOT EXISTS `number_rules` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`hotel_id` BIGINT UNSIGNED NOT NULL,
|
|
`type` VARCHAR(30) NOT NULL,
|
|
`prefix` VARCHAR(20) DEFAULT '',
|
|
`current_no` INT NOT NULL DEFAULT 0,
|
|
`date_format` VARCHAR(20) DEFAULT 'YYYYMMDD',
|
|
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_hotel_type` (`hotel_id`, `type`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|