-- ==========================================================
-- 库房模块简化迁移
-- 目的：删除冗余表、修复乱码注释、补关键索引
-- 注意：所有 ALTER 在 MySQL 8 上为 in-place / instant，业务低峰执行
-- ==========================================================
-- 强烈建议执行前做一次备份：
--   mysqldump -uroot -p fad_oa_dev \
--     sys_oa_warehouse sys_oa_warehouse_master sys_oa_warehouse_detail \
--     sys_oa_warehouse_task sys_oa_warehouse_log sys_oa_warehouse_request \
--     > warehouse_backup_$(date +%Y%m%d).sql
-- ==========================================================

-- ----------------------------------------------------------
-- 1. 删除完全未使用的表
-- ----------------------------------------------------------
-- request 表 0 行，前端没接入，确认废弃

-- ----------------------------------------------------------
-- 2. 修复字段注释（数据库中是 ? 乱码，重新设置为可读中文）
-- ----------------------------------------------------------

-- 2.1 sys_oa_warehouse 物料档案 / 实时库存
ALTER TABLE `sys_oa_warehouse`
    MODIFY COLUMN `id`             bigint        NOT NULL AUTO_INCREMENT COMMENT '物料ID',
    MODIFY COLUMN `inventory`      bigint        DEFAULT NULL            COMMENT '当前库存数量',
    MODIFY COLUMN `model`          varchar(50)   DEFAULT NULL            COMMENT '型号',
    MODIFY COLUMN `price`          decimal(18,2) DEFAULT '0.00'          COMMENT '加权平均单价',
    MODIFY COLUMN `unit`           varchar(5)    DEFAULT NULL            COMMENT '单位',
    MODIFY COLUMN `name`           varchar(50)   DEFAULT NULL            COMMENT '物料名称',
    MODIFY COLUMN `brand`          varchar(200)  DEFAULT NULL            COMMENT '品牌',
    MODIFY COLUMN `specifications` varchar(125)  DEFAULT NULL            COMMENT '规格',
    MODIFY COLUMN `remark`         varchar(500)  DEFAULT NULL            COMMENT '备注',
    MODIFY COLUMN `create_time`    datetime      DEFAULT NULL            COMMENT '创建时间',
    MODIFY COLUMN `create_by`      varchar(50)   DEFAULT NULL            COMMENT '创建人',
    MODIFY COLUMN `update_time`    datetime      DEFAULT NULL            COMMENT '更新时间',
    MODIFY COLUMN `update_by`      varchar(50)   DEFAULT NULL            COMMENT '更新人',
    MODIFY COLUMN `del_flag`       tinyint       DEFAULT '0'             COMMENT '删除标志（0=正常 2=删除）',
    MODIFY COLUMN `threshold`      bigint        NOT NULL DEFAULT '5'    COMMENT '库存预警阈值',
    COMMENT = '物料档案/实时库存';

-- 2.2 sys_oa_warehouse_master 出入库单据头
ALTER TABLE `sys_oa_warehouse_master`
    MODIFY COLUMN `master_id`      bigint        NOT NULL AUTO_INCREMENT COMMENT '单据ID',
    MODIFY COLUMN `master_num`     varchar(296)  DEFAULT NULL            COMMENT '单据编号',
    MODIFY COLUMN `type`           int           DEFAULT NULL            COMMENT '类型（0=出库 1=入库 2=归还）',
    MODIFY COLUMN `project_id`     bigint        DEFAULT NULL            COMMENT '关联项目ID',
    MODIFY COLUMN `requirement_id` bigint        DEFAULT NULL            COMMENT '关联需求ID',
    MODIFY COLUMN `sign_time`      datetime      NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '签收/操作时间',
    MODIFY COLUMN `sign_user`      varchar(20)   DEFAULT NULL            COMMENT '签收人',
    MODIFY COLUMN `is_like`        int           DEFAULT '0'             COMMENT '是否收藏（0=否 1=是）',
    MODIFY COLUMN `status`         int           DEFAULT '0'             COMMENT '单据状态',
    MODIFY COLUMN `return_type`    int           DEFAULT '0'             COMMENT '归还类型（0=否 1=部分归还）',
    MODIFY COLUMN `withdraw_lock`  tinyint       NOT NULL DEFAULT '0'    COMMENT '撤回锁定（1=锁定）',
    MODIFY COLUMN `remark`         varchar(500)  DEFAULT NULL            COMMENT '备注',
    MODIFY COLUMN `del_flag`       tinyint       NOT NULL DEFAULT '0'    COMMENT '删除标志',
    COMMENT = '出入库单据头';

-- 2.3 sys_oa_warehouse_detail 出入库单据行
ALTER TABLE `sys_oa_warehouse_detail`
    MODIFY COLUMN `id`           bigint        NOT NULL AUTO_INCREMENT COMMENT '明细ID',
    MODIFY COLUMN `master_id`    bigint        DEFAULT NULL            COMMENT '所属单据ID（sys_oa_warehouse_master）',
    MODIFY COLUMN `warehouse_id` bigint        NOT NULL                COMMENT '物料ID（sys_oa_warehouse）',
    MODIFY COLUMN `amount`       bigint        DEFAULT NULL            COMMENT '本次出入库数量',
    MODIFY COLUMN `sign_price`   decimal(18,2) DEFAULT '0.00'          COMMENT '签收单价',
    MODIFY COLUMN `project_id`   bigint        DEFAULT NULL            COMMENT '所属项目ID',
    MODIFY COLUMN `father_id`    bigint        DEFAULT NULL            COMMENT '父任务ID（task 派生明细使用）',
    MODIFY COLUMN `remark`       varchar(255)  DEFAULT NULL            COMMENT '备注',
    MODIFY COLUMN `del_flag`     tinyint(1)    DEFAULT '0'             COMMENT '删除标志',
    COMMENT = '出入库单据行';

-- 2.4 sys_oa_warehouse_task 库房任务（采购/补货）
ALTER TABLE `sys_oa_warehouse_task`
    MODIFY COLUMN `task_id`        bigint       NOT NULL AUTO_INCREMENT COMMENT '任务ID',
    MODIFY COLUMN `master_id`      bigint       DEFAULT NULL            COMMENT '完成后写回的单据ID',
    MODIFY COLUMN `warehouse_id`   bigint       DEFAULT NULL            COMMENT '关联物料ID（新采购可空）',
    MODIFY COLUMN `name`           varchar(50)  DEFAULT NULL            COMMENT '物料名称（快照）',
    MODIFY COLUMN `model`          varchar(20)  DEFAULT NULL            COMMENT '型号',
    MODIFY COLUMN `brand`          varchar(20)  DEFAULT NULL            COMMENT '品牌',
    MODIFY COLUMN `specifications` varchar(40)  DEFAULT NULL            COMMENT '规格',
    MODIFY COLUMN `unit`           varchar(50)  DEFAULT NULL            COMMENT '单位',
    MODIFY COLUMN `task_inventory` int          DEFAULT NULL            COMMENT '任务数量（采购量/补货量）',
    MODIFY COLUMN `task_status`    int          DEFAULT '0'             COMMENT '任务状态（0=待处理 1=进行中 2=完成 3=取消）',
    MODIFY COLUMN `end_time`       datetime     DEFAULT NULL            COMMENT '期望完成时间',
    MODIFY COLUMN `remark`         varchar(500) DEFAULT NULL            COMMENT '备注',
    MODIFY COLUMN `del_flag`       int          DEFAULT '0'             COMMENT '删除标志',
    COMMENT = '库房任务（采购/补货）';

-- 2.5 sys_oa_warehouse_log 库房操作日志
ALTER TABLE `sys_oa_warehouse_log`
    MODIFY COLUMN `log_id`       bigint  NOT NULL AUTO_INCREMENT COMMENT '日志ID',
    MODIFY COLUMN `master_id`    bigint  DEFAULT NULL            COMMENT '关联单据ID',
    MODIFY COLUMN `warehouse_id` bigint  DEFAULT NULL            COMMENT '关联物料ID',
    MODIFY COLUMN `num`          int     DEFAULT NULL            COMMENT '变更数量',
    MODIFY COLUMN `del_flag`     int     NOT NULL DEFAULT '0'    COMMENT '删除标志',
    COMMENT = '库房操作日志';


-- ----------------------------------------------------------
-- 3. 补关键索引（之前所有表只有主键，查询慢的根因）
-- ----------------------------------------------------------

-- master 单据头：按项目、状态、类型查
ALTER TABLE `sys_oa_warehouse_master`
    ADD INDEX `idx_project_id` (`project_id`),
    ADD INDEX `idx_type_status` (`type`, `status`),
    ADD INDEX `idx_sign_time` (`sign_time`);

-- detail 单据行：按单据、物料、项目查（最高频）
ALTER TABLE `sys_oa_warehouse_detail`
    ADD INDEX `idx_master_id` (`master_id`),
    ADD INDEX `idx_warehouse_id` (`warehouse_id`),
    ADD INDEX `idx_project_id` (`project_id`);

-- warehouse 物料：按名称、型号搜
ALTER TABLE `sys_oa_warehouse`
    ADD INDEX `idx_name` (`name`),
    ADD INDEX `idx_model` (`model`),
    ADD INDEX `idx_del_flag` (`del_flag`);

-- task 任务：按状态、物料、单据
ALTER TABLE `sys_oa_warehouse_task`
    ADD INDEX `idx_task_status` (`task_status`),
    ADD INDEX `idx_warehouse_id` (`warehouse_id`),
    ADD INDEX `idx_master_id` (`master_id`);

-- log：按单据、物料查
ALTER TABLE `sys_oa_warehouse_log`
    ADD INDEX `idx_master_id` (`master_id`),
    ADD INDEX `idx_warehouse_id` (`warehouse_id`);


-- ----------------------------------------------------------
-- 4. 数据健康检查（运行后看看）
-- ----------------------------------------------------------

-- 4.1 库存为负数的物料（数据错乱）
SELECT id, name, model, inventory FROM sys_oa_warehouse
 WHERE del_flag = 0 AND inventory < 0;

-- 4.2 detail 指向已删除/不存在物料的孤儿行
SELECT d.id, d.master_id, d.warehouse_id
  FROM sys_oa_warehouse_detail d
  LEFT JOIN sys_oa_warehouse w ON w.id = d.warehouse_id
 WHERE w.id IS NULL AND d.del_flag = 0
 LIMIT 50;

-- 4.3 detail 指向已删除/不存在单据的孤儿行
SELECT d.id, d.master_id
  FROM sys_oa_warehouse_detail d
  LEFT JOIN sys_oa_warehouse_master m ON m.master_id = d.master_id
 WHERE m.master_id IS NULL AND d.del_flag = 0
 LIMIT 50;

-- 4.4 task 中超过 90 天还在进行中的（疑似遗留）
SELECT task_id, name, task_status, create_time
  FROM sys_oa_warehouse_task
 WHERE task_status IN (0, 1)
   AND create_time < DATE_SUB(NOW(), INTERVAL 90 DAY)
   AND del_flag = 0;
