-- ================================
-- 出入库单据控制层（新增）
-- 说明：
-- 1) 业务层先创建“出入库单”，再由单据生成实际的 gear_stock_io / gear_stock_io_detail
-- 2) 单据状态控制提交、审核、作废与执行结果
-- 3) 通过 source_io_id 关联已生成的实际出入库记录，确保单据可追溯
-- ================================

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 '来源单据编号',
  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已作废）',
  exec_flag              char(1)         NOT NULL DEFAULT '0'      COMMENT '执行标志（0未执行 1已执行）',
  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),
  KEY idx_status (status),
  KEY idx_exec_flag (exec_flag),
  KEY idx_biz_type (biz_type),
  KEY idx_source_no (source_no),
  KEY idx_create_time (create_time),
  KEY idx_source_io_id (source_io_id)
) 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 '来源明细编号',
  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)
) ENGINE=InnoDB COMMENT='出入库单据明细表';

-- 建议补充的业务索引说明：
-- 1) 先保存 gear_stock_io_order/gear_stock_io_order_detail 为草稿
-- 2) 提交后进入审核
-- 3) 审核通过后生成实际 gear_stock_io / gear_stock_io_detail，并回写 source_io_id
-- 4) 如果需要严格防重复执行，可在业务层通过 order_code + status / source_io_id 控制幂等
