添加Spring Boot Web、Security、Validation等基础依赖

- 集成MyBatis-Plus持久层框架
- 引入JWT认证相关依赖(jjwx-api, jjwx-impl, jjwx-jackson)
- 添加Hutool工具库支持
This commit is contained in:
2026-07-06 11:17:06 +08:00
parent 66b9aac302
commit 3fcf927aef
5 changed files with 1711 additions and 23 deletions

View File

@@ -0,0 +1,658 @@
-- ============================================================
-- 药品管理系统 (MedicineManagerSystem) — 数据库初始化脚本
-- ============================================================
-- 说明: 包含全部建表 DDL + 初始种子数据
-- 引擎: InnoDB | 字符集: utf8mb4 | 排序: utf8mb4_unicode_ci
-- 执行方式: mysql -u root -p < init.sql
-- 建表顺序: 按外键依赖关系排序,确保执行无误
-- ============================================================
-- 创建数据库(如不存在)
CREATE DATABASE IF NOT EXISTS `medicine_manager`
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
USE `medicine_manager`;
-- ============================================================
-- 第一部分: 建表 DDL (15 张表,按外键依赖排序)
-- ============================================================
-- -----------------------------------------------------------
-- 1. 药品分类表(无外键)
-- -----------------------------------------------------------
DROP TABLE IF EXISTS `medicine_category`;
CREATE TABLE `medicine_category` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '分类ID',
`parent_id` BIGINT NOT NULL DEFAULT 0 COMMENT '父分类ID0=顶级分类)',
`name` VARCHAR(64) NOT NULL COMMENT '分类名称',
`code` VARCHAR(32) NOT NULL COMMENT '分类编码',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序序号(升序)',
`description` VARCHAR(255) DEFAULT NULL COMMENT '分类描述',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除0=未删除, 1=已删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_code` (`code`),
KEY `idx_parent_id` (`parent_id`),
KEY `idx_sort_order` (`sort_order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='药品分类表';
-- -----------------------------------------------------------
-- 2. 药品主表FK → medicine_category
-- -----------------------------------------------------------
DROP TABLE IF EXISTS `medicine`;
CREATE TABLE `medicine` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '药品ID',
`category_id` BIGINT NOT NULL COMMENT '所属分类ID',
`name` VARCHAR(128) NOT NULL COMMENT '药品通用名称',
`generic_name` VARCHAR(128) DEFAULT NULL COMMENT '英文/化学通用名',
`specification` VARCHAR(64) NOT NULL COMMENT '规格(如 0.25g*12片',
`manufacturer` VARCHAR(128) NOT NULL COMMENT '生产厂家',
`approval_number` VARCHAR(64) NOT NULL COMMENT '批准文号(国药准字)',
`barcode` VARCHAR(64) DEFAULT NULL COMMENT '条形码',
`dosage_form` VARCHAR(32) DEFAULT NULL COMMENT '剂型(片剂/胶囊/注射液/颗粒等)',
`unit` VARCHAR(16) NOT NULL DEFAULT '' COMMENT '基本单位(盒/瓶/支/袋)',
`retail_price` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '零售价',
`wholesale_price` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '批发价',
`storage_condition` VARCHAR(128) DEFAULT NULL COMMENT '储存条件(常温/阴凉/冷藏)',
`shelf_life` INT DEFAULT NULL COMMENT '有效期(月)',
`warning_stock` INT NOT NULL DEFAULT 10 COMMENT '库存预警阈值',
`description` VARCHAR(500) DEFAULT NULL COMMENT '备注说明',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除0=未删除, 1=已删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_approval_number` (`approval_number`),
UNIQUE KEY `uk_barcode` (`barcode`),
KEY `idx_name` (`name`),
KEY `idx_category_id` (`category_id`),
KEY `idx_manufacturer` (`manufacturer`),
CONSTRAINT `fk_medicine_category` FOREIGN KEY (`category_id`) REFERENCES `medicine_category` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='药品主表';
-- -----------------------------------------------------------
-- 3. 供应商表(无外键)
-- -----------------------------------------------------------
DROP TABLE IF EXISTS `supplier`;
CREATE TABLE `supplier` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '供应商ID',
`name` VARCHAR(128) NOT NULL COMMENT '供应商名称',
`contact_person` VARCHAR(32) DEFAULT NULL COMMENT '联系人',
`phone` VARCHAR(20) DEFAULT NULL COMMENT '联系电话',
`email` VARCHAR(64) DEFAULT NULL COMMENT '电子邮箱',
`address` VARCHAR(255) DEFAULT NULL COMMENT '地址',
`bank_account` VARCHAR(64) DEFAULT NULL COMMENT '银行账号',
`bank_name` VARCHAR(128) DEFAULT NULL COMMENT '开户银行',
`tax_id` VARCHAR(32) DEFAULT NULL COMMENT '税号',
`license_number` VARCHAR(64) DEFAULT NULL COMMENT '经营许可证号',
`status` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '状态0=停用, 1=启用)',
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除0=未删除, 1=已删除)',
PRIMARY KEY (`id`),
KEY `idx_name` (`name`),
KEY `idx_phone` (`phone`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='供应商表';
-- -----------------------------------------------------------
-- 4. 客户表(无外键)
-- -----------------------------------------------------------
DROP TABLE IF EXISTS `customer`;
CREATE TABLE `customer` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '客户ID',
`name` VARCHAR(128) NOT NULL COMMENT '客户名称',
`contact_person` VARCHAR(32) DEFAULT NULL COMMENT '联系人',
`phone` VARCHAR(20) DEFAULT NULL COMMENT '联系电话',
`email` VARCHAR(64) DEFAULT NULL COMMENT '电子邮箱',
`address` VARCHAR(255) DEFAULT NULL COMMENT '地址',
`type` VARCHAR(16) DEFAULT '个人' COMMENT '客户类型(个人/医院/药店/诊所/批发商)',
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除0=未删除, 1=已删除)',
PRIMARY KEY (`id`),
KEY `idx_name` (`name`),
KEY `idx_phone` (`phone`),
KEY `idx_type` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='客户表';
-- -----------------------------------------------------------
-- 5. 仓库表(无外键)
-- -----------------------------------------------------------
DROP TABLE IF EXISTS `warehouse`;
CREATE TABLE `warehouse` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '仓库ID',
`name` VARCHAR(64) NOT NULL COMMENT '仓库名称',
`code` VARCHAR(32) NOT NULL COMMENT '仓库编码',
`location` VARCHAR(255) DEFAULT NULL COMMENT '仓库位置',
`manager` VARCHAR(32) DEFAULT NULL COMMENT '负责人',
`status` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '状态0=停用, 1=启用)',
`remark` VARCHAR(255) DEFAULT NULL COMMENT '备注',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除0=未删除, 1=已删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_code` (`code`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='仓库表';
-- -----------------------------------------------------------
-- 6. 系统用户表(被 stock_in_record 和 stock_out_record 引用,需先创建)
-- -----------------------------------------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`username` VARCHAR(32) NOT NULL COMMENT '用户名(登录账号)',
`password` VARCHAR(128) NOT NULL COMMENT '密码BCrypt 加密)',
`real_name` VARCHAR(32) DEFAULT NULL COMMENT '真实姓名',
`phone` VARCHAR(20) DEFAULT NULL COMMENT '手机号',
`email` VARCHAR(64) DEFAULT NULL COMMENT '电子邮箱',
`avatar` VARCHAR(255) DEFAULT NULL COMMENT '头像URL',
`status` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '状态0=停用, 1=启用)',
`last_login_time` DATETIME DEFAULT NULL COMMENT '最后登录时间',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除0=未删除, 1=已删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`),
KEY `idx_phone` (`phone`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统用户表';
-- -----------------------------------------------------------
-- 7. 角色表(被 user_role 引用,需先创建)
-- -----------------------------------------------------------
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '角色ID',
`name` VARCHAR(32) NOT NULL COMMENT '角色名称',
`code` VARCHAR(32) NOT NULL COMMENT '角色编码(如 admin / warehouse / staff',
`description` VARCHAR(255) DEFAULT NULL COMMENT '角色描述',
`status` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '状态0=停用, 1=启用)',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除0=未删除, 1=已删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表';
-- -----------------------------------------------------------
-- 8. 用户角色关联表FK → user + role
-- -----------------------------------------------------------
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '关联ID',
`user_id` BIGINT NOT NULL COMMENT '用户ID',
`role_id` BIGINT NOT NULL COMMENT '角色ID',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_role` (`user_id`, `role_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_role_id` (`role_id`),
CONSTRAINT `fk_user_role_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`),
CONSTRAINT `fk_user_role_role` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户角色关联表';
-- -----------------------------------------------------------
-- 9. 菜单权限表(被 role_menu 引用,需先创建)
-- -----------------------------------------------------------
DROP TABLE IF EXISTS `menu`;
CREATE TABLE `menu` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '菜单ID',
`parent_id` BIGINT NOT NULL DEFAULT 0 COMMENT '父菜单ID0=顶级菜单)',
`name` VARCHAR(32) NOT NULL COMMENT '菜单名称',
`type` TINYINT(1) NOT NULL COMMENT '菜单类型1=目录, 2=菜单, 3=按钮)',
`path` VARCHAR(128) DEFAULT NULL COMMENT '路由路径type=2时填写',
`component` VARCHAR(128) DEFAULT NULL COMMENT '组件路径type=2时填写',
`icon` VARCHAR(32) DEFAULT NULL COMMENT '图标名称Element Plus icon',
`permission_code` VARCHAR(64) DEFAULT NULL COMMENT '权限编码type=3时填写如 medicine:add',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序序号(升序)',
`visible` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否可见0=隐藏, 1=显示)',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除0=未删除, 1=已删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_permission_code` (`permission_code`),
KEY `idx_parent_id` (`parent_id`),
KEY `idx_type` (`type`),
KEY `idx_sort_order` (`sort_order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='菜单权限表';
-- -----------------------------------------------------------
-- 10. 角色菜单关联表FK → role + menu
-- -----------------------------------------------------------
DROP TABLE IF EXISTS `role_menu`;
CREATE TABLE `role_menu` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '关联ID',
`role_id` BIGINT NOT NULL COMMENT '角色ID',
`menu_id` BIGINT NOT NULL COMMENT '菜单ID',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_role_menu` (`role_id`, `menu_id`),
KEY `idx_role_id` (`role_id`),
KEY `idx_menu_id` (`menu_id`),
CONSTRAINT `fk_role_menu_role` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`),
CONSTRAINT `fk_role_menu_menu` FOREIGN KEY (`menu_id`) REFERENCES `menu` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色菜单关联表';
-- -----------------------------------------------------------
-- 11. 库存表FK → medicine + warehouse
-- -----------------------------------------------------------
DROP TABLE IF EXISTS `stock`;
CREATE TABLE `stock` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '库存ID',
`medicine_id` BIGINT NOT NULL COMMENT '药品ID',
`warehouse_id` BIGINT NOT NULL COMMENT '仓库ID',
`batch_no` VARCHAR(32) NOT NULL COMMENT '批号',
`quantity` INT NOT NULL DEFAULT 0 COMMENT '库存数量',
`cost_price` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '成本价',
`production_date` DATE DEFAULT NULL COMMENT '生产日期',
`expiry_date` DATE NOT NULL COMMENT '有效期至',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除0=未删除, 1=已删除)',
PRIMARY KEY (`id`),
KEY `idx_medicine_id` (`medicine_id`),
KEY `idx_warehouse_id` (`warehouse_id`),
KEY `idx_expiry_date` (`expiry_date`),
KEY `idx_medicine_batch` (`medicine_id`, `warehouse_id`, `batch_no`),
KEY `idx_quantity` (`quantity`),
CONSTRAINT `fk_stock_medicine` FOREIGN KEY (`medicine_id`) REFERENCES `medicine` (`id`),
CONSTRAINT `fk_stock_warehouse` FOREIGN KEY (`warehouse_id`) REFERENCES `warehouse` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='库存表';
-- -----------------------------------------------------------
-- 12. 入库记录表FK → supplier + warehouse + user
-- -----------------------------------------------------------
DROP TABLE IF EXISTS `stock_in_record`;
CREATE TABLE `stock_in_record` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '入库单ID',
`record_no` VARCHAR(32) NOT NULL COMMENT '入库单号(如 SI202607060001',
`supplier_id` BIGINT NOT NULL COMMENT '供应商ID',
`warehouse_id` BIGINT NOT NULL COMMENT '入库仓库ID',
`total_amount` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '入库总金额',
`operator_id` BIGINT NOT NULL COMMENT '操作人ID',
`in_date` DATE NOT NULL COMMENT '入库日期',
`status` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '状态0=待审核, 1=已入库, 2=已取消)',
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除0=未删除, 1=已删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_record_no` (`record_no`),
KEY `idx_supplier_id` (`supplier_id`),
KEY `idx_warehouse_id` (`warehouse_id`),
KEY `idx_operator_id` (`operator_id`),
KEY `idx_status` (`status`),
KEY `idx_in_date` (`in_date`),
CONSTRAINT `fk_stock_in_supplier` FOREIGN KEY (`supplier_id`) REFERENCES `supplier` (`id`),
CONSTRAINT `fk_stock_in_warehouse` FOREIGN KEY (`warehouse_id`) REFERENCES `warehouse` (`id`),
CONSTRAINT `fk_stock_in_operator` FOREIGN KEY (`operator_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='入库记录表';
-- -----------------------------------------------------------
-- 13. 入库明细表FK → stock_in_record + medicine
-- -----------------------------------------------------------
DROP TABLE IF EXISTS `stock_in_detail`;
CREATE TABLE `stock_in_detail` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '明细ID',
`record_id` BIGINT NOT NULL COMMENT '入库单ID',
`medicine_id` BIGINT NOT NULL COMMENT '药品ID',
`batch_no` VARCHAR(32) NOT NULL COMMENT '批号',
`quantity` INT NOT NULL COMMENT '入库数量',
`cost_price` DECIMAL(10,2) NOT NULL COMMENT '进价',
`total_price` DECIMAL(12,2) NOT NULL COMMENT '小计金额quantity * cost_price',
`production_date` DATE DEFAULT NULL COMMENT '生产日期',
`expiry_date` DATE NOT NULL COMMENT '有效期至',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除0=未删除, 1=已删除)',
PRIMARY KEY (`id`),
KEY `idx_record_id` (`record_id`),
KEY `idx_medicine_id` (`medicine_id`),
CONSTRAINT `fk_stock_in_detail_record` FOREIGN KEY (`record_id`) REFERENCES `stock_in_record` (`id`),
CONSTRAINT `fk_stock_in_detail_medicine` FOREIGN KEY (`medicine_id`) REFERENCES `medicine` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='入库明细表';
-- -----------------------------------------------------------
-- 14. 出库记录表FK → customer + warehouse + user
-- -----------------------------------------------------------
DROP TABLE IF EXISTS `stock_out_record`;
CREATE TABLE `stock_out_record` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '出库单ID',
`record_no` VARCHAR(32) NOT NULL COMMENT '出库单号(如 SO202607060001',
`customer_id` BIGINT DEFAULT NULL COMMENT '客户ID销售出库时填写',
`warehouse_id` BIGINT NOT NULL COMMENT '出库仓库ID',
`total_amount` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '出库总金额',
`operator_id` BIGINT NOT NULL COMMENT '操作人ID',
`out_date` DATE NOT NULL COMMENT '出库日期',
`out_type` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '出库类型1=销售出库, 2=领用出库, 3=报损出库, 4=退货出库)',
`status` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '状态0=待审核, 1=已出库, 2=已取消)',
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除0=未删除, 1=已删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_record_no` (`record_no`),
KEY `idx_customer_id` (`customer_id`),
KEY `idx_warehouse_id` (`warehouse_id`),
KEY `idx_operator_id` (`operator_id`),
KEY `idx_status` (`status`),
KEY `idx_out_date` (`out_date`),
KEY `idx_out_type` (`out_type`),
CONSTRAINT `fk_stock_out_customer` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`),
CONSTRAINT `fk_stock_out_warehouse` FOREIGN KEY (`warehouse_id`) REFERENCES `warehouse` (`id`),
CONSTRAINT `fk_stock_out_operator` FOREIGN KEY (`operator_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='出库记录表';
-- -----------------------------------------------------------
-- 15. 出库明细表FK → stock_out_record + medicine
-- -----------------------------------------------------------
DROP TABLE IF EXISTS `stock_out_detail`;
CREATE TABLE `stock_out_detail` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '明细ID',
`record_id` BIGINT NOT NULL COMMENT '出库单ID',
`medicine_id` BIGINT NOT NULL COMMENT '药品ID',
`batch_no` VARCHAR(32) NOT NULL COMMENT '批号',
`quantity` INT NOT NULL COMMENT '出库数量',
`unit_price` DECIMAL(10,2) NOT NULL COMMENT '出库单价',
`total_price` DECIMAL(12,2) NOT NULL COMMENT '小计金额quantity * unit_price',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除0=未删除, 1=已删除)',
PRIMARY KEY (`id`),
KEY `idx_record_id` (`record_id`),
KEY `idx_medicine_id` (`medicine_id`),
CONSTRAINT `fk_stock_out_detail_record` FOREIGN KEY (`record_id`) REFERENCES `stock_out_record` (`id`),
CONSTRAINT `fk_stock_out_detail_medicine` FOREIGN KEY (`medicine_id`) REFERENCES `medicine` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='出库明细表';
-- ============================================================
-- 第二部分: 种子数据
-- ============================================================
-- -----------------------------------------------------------
-- 药品分类初始数据14 条顶级分类)
-- -----------------------------------------------------------
INSERT INTO `medicine_category` (`id`, `parent_id`, `name`, `code`, `sort_order`, `description`) VALUES
(1, 0, '抗生素类', 'ANTIBIOTIC', 1, '抗生素类药品,包括青霉素类、头孢菌素类、大环内酯类等'),
(2, 0, '抗病毒类', 'ANTIVIRAL', 2, '抗病毒药品,用于治疗流感、肝炎等病毒性疾病'),
(3, 0, '解热镇痛类', 'ANALGESIC', 3, '解热镇痛消炎药品,如阿司匹林、布洛芬、对乙酰氨基酚等'),
(4, 0, '心血管类', 'CARDIOVASCULAR', 4, '心血管系统药品,包括降压药、降脂药、抗心律失常药等'),
(5, 0, '呼吸系统类', 'RESPIRATORY', 5, '呼吸系统药品,包括止咳药、祛痰药、平喘药等'),
(6, 0, '消化系统类', 'DIGESTIVE', 6, '消化系统药品,包括胃药、止泻药、肝胆用药等'),
(7, 0, '内分泌类', 'ENDOCRINE', 7, '内分泌系统药品,包括降糖药、甲状腺用药、激素类等'),
(8, 0, '维生素及矿物质类', 'VITAMIN', 8, '维生素、矿物质及营养补充剂'),
(9, 0, '外用药类', 'EXTERNAL', 9, '外用药,包括皮肤用药、眼药水、贴膏等'),
(10, 0, '中成药类', 'CHINESE_MED', 10, '中成药制剂,包括颗粒、丸剂、口服液等'),
(11, 0, '生物制品类', 'BIOLOGICAL', 11, '生物制品,包括疫苗、血液制品、免疫制剂等'),
(12, 0, '麻醉药品类', 'NARCOTIC', 12, '麻醉药品及精神类药品(需特殊管理)'),
(13, 0, '医疗器械类', 'MEDICAL_DEVICE', 13, '医疗器械及耗材,如注射器、纱布、血压计等'),
(14, 0, '其他', 'OTHER', 99, '其他未分类药品');
-- -----------------------------------------------------------
-- 仓库初始数据1 条默认仓库)
-- -----------------------------------------------------------
INSERT INTO `warehouse` (`id`, `name`, `code`, `location`, `manager`, `status`, `remark`) VALUES
(1, '主仓库', 'WH-MAIN', 'A栋1楼101室', '系统管理员', 1, '默认主仓库');
-- -----------------------------------------------------------
-- 角色初始数据3 个默认角色)
-- -----------------------------------------------------------
INSERT INTO `role` (`id`, `name`, `code`, `description`, `status`) VALUES
(1, '超级管理员', 'admin', '系统超级管理员,拥有所有权限', 1),
(2, '仓库管理员', 'warehouse', '仓库管理员,负责库存、入库、出库管理', 1),
(3, '普通员工', 'staff', '普通员工,仅有查看权限', 1);
-- -----------------------------------------------------------
-- 默认管理员用户(用户名: admin / 密码: admin123
-- BCrypt 加密: $2a$10$... 共 60 字符
-- -----------------------------------------------------------
INSERT INTO `user` (`id`, `username`, `password`, `real_name`, `phone`, `email`, `status`) VALUES
(1, 'admin', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EH', '系统管理员', '13800000000', 'admin@medicine.com', 1);
-- -----------------------------------------------------------
-- 用户角色关联admin 用户 → 超级管理员角色)
-- -----------------------------------------------------------
INSERT INTO `user_role` (`user_id`, `role_id`) VALUES (1, 1);
-- -----------------------------------------------------------
-- 菜单权限初始数据3 级树:目录 → 菜单 → 按钮)
-- -----------------------------------------------------------
-- ===== 仪表盘(一级菜单,排最前面) =====
INSERT INTO `menu` (`id`, `parent_id`, `name`, `type`, `path`, `component`, `icon`, `permission_code`, `sort_order`) VALUES
(55, 0, '仪表盘', 2, '/dashboard', 'views/dashboard/DashboardView', 'Odometer', NULL, 0),
(56, 55, '仪表盘查看', 3, NULL, NULL, NULL, 'dashboard:view', 1);
-- ===== 系统管理(目录) =====
INSERT INTO `menu` (`id`, `parent_id`, `name`, `type`, `path`, `component`, `icon`, `permission_code`, `sort_order`) VALUES
(1, 0, '系统管理', 1, NULL, NULL, 'Setting', NULL, 1),
(2, 1, '用户管理', 2, '/user/list', 'views/user/UserList', 'User', NULL, 11),
(3, 2, '用户查询', 3, NULL, NULL, NULL, 'user:list', 111),
(4, 2, '用户详情', 3, NULL, NULL, NULL, 'user:query', 112),
(5, 2, '新增用户', 3, NULL, NULL, NULL, 'user:add', 113),
(6, 2, '编辑用户', 3, NULL, NULL, NULL, 'user:edit', 114),
(7, 2, '删除用户', 3, NULL, NULL, NULL, 'user:delete', 115),
(8, 2, '重置密码', 3, NULL, NULL, NULL, 'user:reset-pwd', 116),
(9, 2, '分配角色', 3, NULL, NULL, NULL, 'user:assign-role',117),
(10, 1, '角色管理', 2, '/role/list', 'views/role/RoleList', 'UserFilled', NULL, 12),
(11, 10, '角色查询', 3, NULL, NULL, NULL, 'role:list', 121),
(12, 10, '新增角色', 3, NULL, NULL, NULL, 'role:add', 122),
(13, 10, '编辑角色', 3, NULL, NULL, NULL, 'role:edit', 123),
(14, 10, '删除角色', 3, NULL, NULL, NULL, 'role:delete', 124),
(15, 10, '分配权限', 3, NULL, NULL, NULL, 'role:assign-menu',125),
(16, 1, '菜单管理', 2, '/menu/list', 'views/menu/MenuList', 'Menu', NULL, 13),
(17, 16, '菜单查询', 3, NULL, NULL, NULL, 'menu:list', 131),
(18, 16, '新增菜单', 3, NULL, NULL, NULL, 'menu:add', 132),
(19, 16, '编辑菜单', 3, NULL, NULL, NULL, 'menu:edit', 133),
(20, 16, '删除菜单', 3, NULL, NULL, NULL, 'menu:delete', 134);
-- ===== 药品管理(目录) =====
INSERT INTO `menu` (`id`, `parent_id`, `name`, `type`, `path`, `component`, `icon`, `permission_code`, `sort_order`) VALUES
(21, 0, '药品管理', 1, NULL, NULL, 'MedicineBox', NULL, 2),
(22, 21, '药品列表', 2, '/medicine/list', 'views/medicine/MedicineList', NULL, 'medicine:list', 21),
(23, 22, '药品查询', 3, NULL, NULL, NULL, 'medicine:query', 211),
(24, 22, '新增药品', 3, NULL, NULL, NULL, 'medicine:add', 212),
(25, 22, '编辑药品', 3, NULL, NULL, NULL, 'medicine:edit', 213),
(26, 22, '删除药品', 3, NULL, NULL, NULL, 'medicine:delete',214),
(27, 21, '药品分类', 2, '/category/list', 'views/category/CategoryList', NULL, 'category:list', 22),
(28, 27, '分类查询', 3, NULL, NULL, NULL, 'category:query', 221),
(29, 27, '新增分类', 3, NULL, NULL, NULL, 'category:add', 222),
(30, 27, '编辑分类', 3, NULL, NULL, NULL, 'category:edit', 223),
(31, 27, '删除分类', 3, NULL, NULL, NULL, 'category:delete',224);
-- ===== 库存管理(目录) =====
INSERT INTO `menu` (`id`, `parent_id`, `name`, `type`, `path`, `component`, `icon`, `permission_code`, `sort_order`) VALUES
(32, 0, '库存管理', 1, NULL, NULL, 'Box', NULL, 3),
(33, 32, '库存列表', 2, '/stock/list', 'views/stock/StockList', NULL, 'stock:list', 31),
(34, 33, '库存查询', 3, NULL, NULL, NULL, 'stock:query', 311),
(35, 33, '库存盘点', 3, NULL, NULL, NULL, 'stock:check', 312),
(36, 32, '入库管理', 2, '/stock-in/list', 'views/stockIn/StockInList', NULL, 'stock-in:list', 32),
(37, 36, '入库查询', 3, NULL, NULL, NULL, 'stock-in:query', 321),
(38, 36, '新增入库', 3, NULL, NULL, NULL, 'stock-in:add', 322),
(39, 36, '审核入库', 3, NULL, NULL, NULL, 'stock-in:audit', 323),
(40, 32, '出库管理', 2, '/stock-out/list', 'views/stockOut/StockOutList', NULL, 'stock-out:list', 33),
(41, 40, '出库查询', 3, NULL, NULL, NULL, 'stock-out:query', 331),
(42, 40, '新增出库', 3, NULL, NULL, NULL, 'stock-out:add', 332),
(43, 40, '审核出库', 3, NULL, NULL, NULL, 'stock-out:audit', 333);
-- ===== 往来单位(目录) =====
INSERT INTO `menu` (`id`, `parent_id`, `name`, `type`, `path`, `component`, `icon`, `permission_code`, `sort_order`) VALUES
(44, 0, '往来单位', 1, NULL, NULL, 'Connection', NULL, 4),
(45, 44, '供应商管理', 2, '/supplier/list', 'views/supplier/SupplierList', NULL, 'supplier:list', 41),
(46, 45, '供应商查询', 3, NULL, NULL, NULL, 'supplier:query', 411),
(47, 45, '新增供应商', 3, NULL, NULL, NULL, 'supplier:add', 412),
(48, 45, '编辑供应商', 3, NULL, NULL, NULL, 'supplier:edit', 413),
(49, 45, '删除供应商', 3, NULL, NULL, NULL, 'supplier:delete',414),
(50, 44, '客户管理', 2, '/customer/list', 'views/customer/CustomerList', NULL, 'customer:list', 42),
(51, 50, '客户查询', 3, NULL, NULL, NULL, 'customer:query', 421),
(52, 50, '新增客户', 3, NULL, NULL, NULL, 'customer:add', 422),
(53, 50, '编辑客户', 3, NULL, NULL, NULL, 'customer:edit', 423),
(54, 50, '删除客户', 3, NULL, NULL, NULL, 'customer:delete',424);
-- -----------------------------------------------------------
-- 角色菜单关联数据
-- -----------------------------------------------------------
-- 超级管理员role_id=1拥有所有菜单权限共 56 条 menu
INSERT INTO `role_menu` (`role_id`, `menu_id`) VALUES
(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),
(1,10),(1,11),(1,12),(1,13),(1,14),(1,15),
(1,16),(1,17),(1,18),(1,19),(1,20),
(1,21),(1,22),(1,23),(1,24),(1,25),(1,26),
(1,27),(1,28),(1,29),(1,30),(1,31),
(1,32),(1,33),(1,34),(1,35),
(1,36),(1,37),(1,38),(1,39),
(1,40),(1,41),(1,42),(1,43),
(1,44),(1,45),(1,46),(1,47),(1,48),(1,49),
(1,50),(1,51),(1,52),(1,53),(1,54),
(1,55),(1,56);
-- 仓库管理员role_id=2库存管理全部 + 往来单位只读 + 仪表盘
INSERT INTO `role_menu` (`role_id`, `menu_id`) VALUES
(2,32), -- 库存管理(目录)
(2,33),(2,34),(2,35), -- 库存列表 + 查询 + 盘点
(2,36),(2,37),(2,38),(2,39), -- 入库管理 + 全部按钮
(2,40),(2,41),(2,42),(2,43), -- 出库管理 + 全部按钮
(2,44), -- 往来单位(目录)
(2,45),(2,46), -- 供应商管理 + 查询(只读)
(2,50),(2,51), -- 客户管理 + 查询(只读)
(2,55),(2,56); -- 仪表盘
-- 普通员工role_id=3仪表盘 + 药品/库存只看
INSERT INTO `role_menu` (`role_id`, `menu_id`) VALUES
(3,55),(3,56), -- 仪表盘
(3,21), -- 药品管理(目录)
(3,22),(3,23), -- 药品列表 + 查询(只读)
(3,32), -- 库存管理(目录)
(3,33),(3,34); -- 库存列表 + 查询(只读)
-- -----------------------------------------------------------
-- 仓库管理员用户(用户名: warehouse01 / 密码: admin123
-- -----------------------------------------------------------
INSERT INTO `user` (`id`, `username`, `password`, `real_name`, `phone`, `email`, `status`) VALUES
(2, 'warehouse01', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EH', '张伟', '13800000001', 'zhangwei@medicine.com', 1),
(3, 'staff01', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EH', '李娜', '13800000002', 'lina@medicine.com', 1);
-- -----------------------------------------------------------
-- 用户角色关联
-- -----------------------------------------------------------
INSERT INTO `user_role` (`user_id`, `role_id`) VALUES (2, 2), (3, 3);
-- -----------------------------------------------------------
-- 药品初始数据12 种常用药品)
-- -----------------------------------------------------------
INSERT INTO `medicine` (`id`, `category_id`, `name`, `generic_name`, `specification`, `manufacturer`, `approval_number`, `barcode`, `dosage_form`, `unit`, `retail_price`, `wholesale_price`, `storage_condition`, `shelf_life`, `warning_stock`, `description`) VALUES
(1, 1, '阿莫西林胶囊', 'Amoxicillin Capsules', '0.25g×24粒', '石药集团中诺药业', '国药准字H13023923', '6901234567890', '胶囊剂', '', 18.50, 14.20, '密封、阴凉干燥处', 24, 50, '青霉素类广谱抗生素,适用于敏感菌引起的呼吸道、泌尿道感染等'),
(2, 1, '头孢克肟分散片', 'Cefixime Dispersible', '0.1g×12片', '广州白云山制药总厂', '国药准字H20067177', '6901234567891', '片剂', '', 42.00, 33.50, '密封、阴凉干燥处', 24, 30, '第三代头孢菌素,用于敏感菌引起的呼吸道、泌尿系统感染'),
(3, 3, '布洛芬缓释胶囊', 'Ibuprofen SR Capsules', '0.3g×20粒', '中美天津史克制药', '国药准字H10900089', '6901234567892', '胶囊剂', '', 25.80, 19.00, '密封保存', 36, 40, '非甾体抗炎药,用于缓解轻至中度疼痛及退热'),
(4, 3, '对乙酰氨基酚片', 'Paracetamol Tablets', '0.5g×12片', '上海强生制药', '国药准字H31022137', '6901234567893', '片剂', '', 12.00, 8.50, '密封保存', 36, 60, '解热镇痛药,用于普通感冒或流感引起的发热及头痛'),
(5, 4, '硝苯地平控释片', 'Nifedipine CR Tablets', '30mg×7片', '拜耳医药保健有限公司','国药准字J20180025', '6901234567894', '片剂', '', 38.50, 29.00, '遮光、密封保存', 36, 20, '钙通道阻滞剂,用于治疗高血压及冠心病'),
(6, 5, '盐酸氨溴索口服液', 'Ambroxol Oral Solution', '100ml:0.6g', '深圳致君制药', '国药准字H20073942', '6901234567895', '口服液', '', 28.00, 21.00, '遮光、阴凉处保存', 24, 30, '祛痰药,用于急慢性呼吸道疾病引起的痰液黏稠'),
(7, 6, '奥美拉唑肠溶胶囊', 'Omeprazole Enteric Capsules', '20mg×14粒', '阿斯利康制药', '国药准字J20130093', '6901234567896', '胶囊剂', '', 56.00, 43.00, '遮光、密封、阴凉处', 24, 25, '质子泵抑制剂,用于胃溃疡、十二指肠溃疡及反流性食管炎'),
(8, 7, '盐酸二甲双胍缓释片', 'Metformin HCl ER Tablets', '0.5g×30片', '中美上海施贵宝制药', '国药准字H20023370', '6901234567897', '片剂', '', 32.00, 24.50, '密封保存', 36, 40, '口服降糖药用于2型糖尿病的治疗'),
(9, 8, '维生素C片', 'Vitamin C Tablets', '0.1g×100片', '东北制药集团', '国药准字H21021078', '6901234567898', '片剂', '', 8.50, 5.80, '遮光、密封保存', 24, 80, '维生素类非处方药,用于预防和治疗坏血病'),
(10, 9, '阿昔洛韦乳膏', 'Acyclovir Cream', '10g:0.3g(3%)', '湖北科益药业', '国药准字H42022673', '6901234567899', '乳膏剂', '', 8.00, 5.50, '密封、阴凉处保存', 24, 50, '抗病毒外用药,用于单纯疱疹及带状疱疹感染'),
(11, 10,'连花清瘟胶囊', 'Lianhua Qingwen Capsules','0.35g×36粒', '石家庄以岭药业', '国药准字Z20040063', '6901234567900', '胶囊剂', '', 22.80, 16.50, '密封、阴凉干燥处', 24, 50, '中成药,用于流感和感冒引起的发热、咳嗽、咽痛'),
(12, 7, '胰岛素注射液', 'Insulin Injection', '10ml:400单位', '诺和诺德(中国)制药', '国药准字J20171030', '6901234567901', '注射液', '', 65.00, 49.00, '2-8℃冷藏禁止冷冻', 24, 15, '用于1型糖尿病及需要胰岛素治疗的2型糖尿病患者');
-- -----------------------------------------------------------
-- 供应商初始数据4 家)
-- -----------------------------------------------------------
INSERT INTO `supplier` (`id`, `name`, `contact_person`, `phone`, `email`, `address`, `bank_account`, `bank_name`, `tax_id`, `license_number`, `status`, `remark`) VALUES
(1, '九州通医药集团股份有限公司', '陈经理', '027-88886666', 'chen@jzt.com.cn', '湖北省武汉市汉阳区龙阳大道特8号', '6222023202012345678', '中国工商银行武汉汉阳支行', '91420106714200579A', '鄂AA0270001', 1, '主要供应商,覆盖大部分抗生素和心血管药品'),
(2, '华润医药商业集团有限公司', '王经理', '010-66668888', 'wang@crpharm.com', '北京市东城区安定门内大街88号', '6222020200012345678', '中国建设银行北京东四支行', '91110000610000278B', '京AA0100002', 1, '国企背景,供应价格稳定'),
(3, '国药控股股份有限公司', '刘经理', '021-55559999', 'liu@sinopharm.com', '上海市黄浦区南京东路100号', '6222021001012345678', '中国银行上海市分行', '91310000607300379C', '沪AA0210003', 1, '全国最大医药流通企业,药品种类齐全'),
(4, '上海医药集团股份有限公司', '赵经理', '021-33332222', 'zhao@shapharma.com', '上海市浦东新区张江高科技园区', '6222021001022345678', '交通银行上海张江支行', '91310000607300680A', '沪AA0210004', 0, '暂时停用,合同到期未续签');
-- -----------------------------------------------------------
-- 客户初始数据4 个)
-- -----------------------------------------------------------
INSERT INTO `customer` (`id`, `name`, `contact_person`, `phone`, `email`, `address`, `type`, `remark`) VALUES
(1, '市第一人民医院', '医务科-周主任', '0531-88881234', 'zhou@diyi-hospital.cn', '山东省济南市历下区解放路105号', '医院', '三甲医院,长期合作客户,月均采购量较大'),
(2, '仁心大药房连锁有限公司', '采购部-吴经理', '0531-88882345', 'wu@renxin-pharmacy.cn', '山东省济南市市中区经七路66号', '药店', '连锁药店15家门店需求稳定'),
(3, '阳光社区卫生服务中心', '药房-郑主管', '0531-88883456', 'zheng@yangguang-chc.cn', '山东省济南市槐荫区阳光新路22号', '诊所', '基层医疗机构,以常用药为主'),
(4, '康源堂中医门诊部', '门诊-孙医生', '0531-88884567', 'sun@kangyuantang.cn', '山东省济南市历城区花园路200号', '诊所', '中医门诊,主要采购中成药');
-- -----------------------------------------------------------
-- 库存初始数据12 条,对应 12 种药品,含不同批号和效期)
-- -----------------------------------------------------------
INSERT INTO `stock` (`id`, `medicine_id`, `warehouse_id`, `batch_no`, `quantity`, `cost_price`, `production_date`, `expiry_date`) VALUES
(1, 1, 1, '20260501A', 200, 13.80, '2026-05-10', '2028-05-09'),
(2, 1, 1, '20260315B', 80, 13.50, '2026-03-20', '2028-03-19'),
(3, 2, 1, '20260601A', 150, 32.00, '2026-06-05', '2028-06-04'),
(4, 3, 1, '20260420A', 300, 18.00, '2026-04-25', '2029-04-24'),
(5, 3, 1, '20251201B', 45, 17.50, '2025-12-10', '2026-09-09'), -- 近效期3个月内触发预警
(6, 4, 1, '20260515A', 500, 7.80, '2026-05-20', '2029-05-19'),
(7, 5, 1, '20260110A', 120, 28.00, '2026-01-15', '2029-01-14'),
(8, 6, 1, '20260301A', 180, 20.00, '2026-03-05', '2028-03-04'),
(9, 7, 1, '20260401A', 100, 42.00, '2026-04-05', '2028-04-04'),
(10, 8, 1, '20260520A', 250, 23.50, '2026-05-25', '2029-05-24'),
(11, 9, 1, '20260610A', 600, 5.20, '2026-06-15', '2028-06-14'),
(12, 10, 1, '20260215A', 350, 5.00, '2026-02-20', '2028-02-19'),
(13, 11, 1, '20260605A', 400, 15.80, '2026-06-10', '2028-06-09'),
(14, 12, 1, '20260501C', 80, 48.00, '2026-05-05', '2027-05-04');
-- -----------------------------------------------------------
-- 入库记录 + 明细2 笔入库单,模拟真实采购场景)
-- -----------------------------------------------------------
-- 入库单 #12026年7月1日从九州通采购已确认入库
INSERT INTO `stock_in_record` (`id`, `record_no`, `supplier_id`, `warehouse_id`, `total_amount`, `operator_id`, `in_date`, `status`, `remark`) VALUES
(1, 'SI202607010001', 1, 1, 22696.00, 1, '2026-07-01', 1, '7月初常规补货采购');
INSERT INTO `stock_in_detail` (`record_id`, `medicine_id`, `batch_no`, `quantity`, `cost_price`, `total_price`, `production_date`, `expiry_date`) VALUES
(1, 1, '20260701A', 300, 13.60, 4080.00, '2026-06-20', '2028-06-19'),
(1, 3, '20260701B', 400, 17.80, 7120.00, '2026-06-25', '2029-06-24'),
(1, 6, '20260701C', 200, 19.80, 3960.00, '2026-06-15', '2028-06-14'),
(1, 7, '20260701D', 150, 41.50, 6225.00, '2026-06-10', '2028-06-09'),
(1, 5, '20260701E', 60, 27.50, 1650.00, '2026-06-01', '2029-05-31');
-- 入库单 #22026年7月5日从国药控股采购待审核
INSERT INTO `stock_in_record` (`id`, `record_no`, `supplier_id`, `warehouse_id`, `total_amount`, `operator_id`, `in_date`, `status`, `remark`) VALUES
(2, 'SI202607050002', 3, 1, 18445.00, 2, '2026-07-05', 0, '补充胰岛素及中成药库存');
INSERT INTO `stock_in_detail` (`record_id`, `medicine_id`, `batch_no`, `quantity`, `cost_price`, `total_price`, `production_date`, `expiry_date`) VALUES
(2, 8, '20260705A', 300, 23.00, 6900.00, '2026-06-28', '2029-06-27'),
(2, 11, '20260705B', 500, 15.50, 7750.00, '2026-06-25', '2028-06-24'),
(2, 12, '20260705C', 100, 47.50, 4750.00, '2026-06-20', '2027-06-19');
-- -----------------------------------------------------------
-- 出库记录 + 明细1 笔出库单,模拟销售/领用场景)
-- -----------------------------------------------------------
-- 出库单 #12026年7月3日向市第一人民医院销售出库已确认出库
INSERT INTO `stock_out_record` (`id`, `record_no`, `customer_id`, `warehouse_id`, `total_amount`, `operator_id`, `out_date`, `out_type`, `status`, `remark`) VALUES
(1, 'SO202607030001', 1, 1, 8170.00, 2, '2026-07-03', 1, 1, '第一人民医院常规领药');
INSERT INTO `stock_out_detail` (`record_id`, `medicine_id`, `batch_no`, `quantity`, `unit_price`, `total_price`) VALUES
(1, 1, '20260501A', 100, 18.50, 1850.00),
(1, 7, '20260401A', 80, 56.00, 4480.00),
(1, 6, '20260301A', 60, 28.00, 1680.00);
-- ============================================================
-- 完成
-- ============================================================
-- 执行方式: mysql -u root -p < init.sql
-- 执行后请验证:
-- 1. SHOW TABLES; -- 应显示 15 张表
-- 2. SELECT COUNT(*) FROM `menu`; -- 应显示 56 条菜单
-- 3. SELECT * FROM `user`; -- 应显示 3 个用户admin, warehouse01, staff01
-- 4. SELECT * FROM `medicine`; -- 应显示 12 种药品
-- 5. SELECT * FROM `stock`; -- 应显示 14 条库存记录
-- 6. SELECT * FROM `stock_in_record`; -- 应显示 2 张入库单
-- 7. SELECT * FROM `stock_in_detail`; -- 应显示 8 条入库明细
-- 8. SELECT * FROM `stock_out_record`; -- 应显示 1 张出库单
-- 9. SELECT * FROM `stock_out_detail`; -- 应显示 3 条出库明细
-- ============================================================