-- ================================
-- 出入库单据控制层
-- 目标：通过“单据 -> 审核 -> 执行”控制库存变更，避免直接操作出入库流水
-- 说明：
-- 1) 业务先创建出入库单据，再由单据驱动实际 gear_stock_io / gear_stock_io_detail
-- 2) 单据支持草稿、提交、审核、执行、作废、冲销
-- 3) 通过关联字段保留来源单、回退单、执行单之间的链路
-- ================================

DROP TABLE IF EXISTS gear_stock_io_order;
CREATE TABLE gear_stock_io_order (
  order_id               bigint(20)      NOT NULL                  COMMENT '单据ID',
  order_code             varchar(64)     NOT NULL                  COMMENT '单据编号（唯一）',
  io_type                char(1)         NOT NULL                  COMMENT '出入库类型（I入库 O出库 T调拨）',
  biz_type               varchar(32)     NOT NULL                  COMMENT '业务类型（purchase/sale/return/transfer/other）',
  source_type            varchar(32)     DEFAULT ''                COMMENT '来源单据类型（采购单/销售单/退货单/调拨单等）',
  source_no              varchar(64)     DEFAULT ''                COMMENT '来源单据编号',
  source_order_id        bigint(20)      DEFAULT NULL              COMMENT '来源单据ID（业务单ID）',
  warehouse_id           bigint(20)      DEFAULT NULL              COMMENT '主仓库ID',
  from_warehouse_id      bigint(20)      DEFAULT NULL              COMMENT '调出仓库ID',
  to_warehouse_id        bigint(20)      DEFAULT NULL              COMMENT '调入仓库ID',
  status                 char(1)         NOT NULL DEFAULT '0'      COMMENT '单据状态（0草稿 1已提交 2已审核 3已执行 4已作废 5已冲销）',
  exec_flag              char(1)         NOT NULL DEFAULT '0'      COMMENT '执行标志（0未执行 1已执行）',
  reversal_flag          char(1)         NOT NULL DEFAULT '0'      COMMENT '是否冲销单（0否 1是）',
  reversal_order_id      bigint(20)      DEFAULT NULL              COMMENT '对应原单据ID',
  reversal_reason        varchar(500)    DEFAULT ''                COMMENT '冲销原因',
  reversal_time          datetime                                  COMMENT '冲销时间',
  cancel_reason          varchar(500)    DEFAULT ''                COMMENT '作废原因',
  cancel_time            datetime                                  COMMENT '作废时间',
  audit_by               varchar(64)     DEFAULT ''                COMMENT '审核人',
  audit_time             datetime                                  COMMENT '审核时间',
  execute_by             varchar(64)     DEFAULT ''                COMMENT '执行人',
  execute_time           datetime                                  COMMENT '执行时间',
  source_io_id           bigint(20)      DEFAULT NULL              COMMENT '实际出入库单ID（gear_stock_io.stock_io_id）',
  total_qty              decimal(18,4)   NOT NULL DEFAULT 0.0000    COMMENT '单据总数量',
  remark                 varchar(500)    DEFAULT NULL              COMMENT '备注',
  del_flag               char(1)         NOT NULL DEFAULT '0'      COMMENT '删除标志（0存在 2删除）',
  create_by              varchar(64)     DEFAULT ''                COMMENT '创建者',
  create_time            datetime                                  COMMENT '创建时间',
  update_by              varchar(64)     DEFAULT ''                COMMENT '更新者',
  update_time            datetime                                  COMMENT '更新时间',
  PRIMARY KEY (order_id),
  UNIQUE KEY uk_order_code (order_code),
  UNIQUE KEY uk_reversal_order_id (reversal_order_id),
  KEY idx_status (status),
  KEY idx_exec_flag (exec_flag),
  KEY idx_biz_type (biz_type),
  KEY idx_source_no (source_no),
  KEY idx_source_order_id (source_order_id),
  KEY idx_create_time (create_time),
  KEY idx_source_io_id (source_io_id),
  KEY idx_reversal_flag (reversal_flag)
) ENGINE=InnoDB COMMENT='出入库单据表';

DROP TABLE IF EXISTS gear_stock_io_order_detail;
CREATE TABLE gear_stock_io_order_detail (
  detail_id              bigint(20)      NOT NULL                  COMMENT '明细ID',
  order_id               bigint(20)      NOT NULL                  COMMENT '单据ID',
  line_no                int(11)         NOT NULL DEFAULT 1        COMMENT '行号',
  item_type              varchar(32)     NOT NULL                  COMMENT '物料类型（product/material/other）',
  item_id                bigint(20)      NOT NULL                  COMMENT '物料ID',
  item_name              varchar(128)    DEFAULT ''                COMMENT '物料名称快照',
  spec_name              varchar(128)    DEFAULT ''                COMMENT '规格型号快照',
  warehouse_id           bigint(20)      DEFAULT NULL              COMMENT '入库仓库ID',
  from_warehouse_id      bigint(20)      DEFAULT NULL              COMMENT '出库仓库ID',
  quantity               decimal(18,4)   NOT NULL DEFAULT 0.0000    COMMENT '数量',
  unit                   varchar(32)     DEFAULT ''                COMMENT '单位',
  batch_no               varchar(64)     DEFAULT ''                COMMENT '批次号',
  unit_price             decimal(18,4)   NOT NULL DEFAULT 0.0000    COMMENT '单价快照',
  amount                 decimal(18,4)   NOT NULL DEFAULT 0.0000    COMMENT '金额快照',
  source_detail_no       varchar(64)     DEFAULT ''                COMMENT '来源明细编号',
  reversal_detail_id     bigint(20)      DEFAULT NULL              COMMENT '对应冲销明细ID',
  remark                 varchar(500)    DEFAULT NULL              COMMENT '备注',
  del_flag               char(1)         NOT NULL DEFAULT '0'      COMMENT '删除标志（0存在 2删除）',
  create_by              varchar(64)     DEFAULT ''                COMMENT '创建者',
  create_time            datetime                                  COMMENT '创建时间',
  update_by              varchar(64)     DEFAULT ''                COMMENT '更新者',
  update_time            datetime                                  COMMENT '更新时间',
  PRIMARY KEY (detail_id),
  UNIQUE KEY uk_order_line (order_id, line_no),
  KEY idx_order_id (order_id),
  KEY idx_item_id (item_id),
  KEY idx_batch_no (batch_no),
  KEY idx_source_detail_no (source_detail_no),
  KEY idx_reversal_detail_id (reversal_detail_id)
) ENGINE=InnoDB COMMENT='出入库单据明细表';

-- 建议：
-- 1) 业务层只允许通过单据驱动库存变更，禁止直接改 gear_stock / gear_stock_log
-- 2) 审核通过后，统一调用执行入口生成实际 gear_stock_io / gear_stock_io_detail
-- 3) 已执行错误时，通过反向单据进行冲销，不直接修改历史流水
