create table wms_process_plan
(
    plan_id      bigint                             not null comment '主键'
        primary key,
    version_id   bigint                             not null comment '规程版本ID',
    segment_type varchar(32)                        not null comment '段类型(INLET/PROCESS/OUTLET)',
    segment_name varchar(100)                       null comment '段名称',
    point_name   varchar(200)                       not null comment '点位名称',
    point_code   varchar(64)                        not null comment '点位编码',
    sort_order   int      default 0                 not null comment '排序',
    create_by    varchar(64)                        null comment '创建人',
    create_time  datetime default CURRENT_TIMESTAMP null comment '创建时间',
    update_by    varchar(64)                        null comment '更新人',
    update_time  datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间',
    del_flag     tinyint  default 0                 not null comment '删除标志(0正常2删除)',
    remark       varchar(500)                       null comment '备注',
    constraint uk_plan_version_point_code
        unique (version_id, point_code)
)
    comment '方案点位表';

create index idx_plan_sort
    on wms_process_plan (version_id, sort_order);

create index idx_plan_version
    on wms_process_plan (version_id);

create table wms_process_plan_param
(
    param_id        bigint                             not null comment '主键'
        primary key,
    plan_id         bigint                             not null comment '方案点位ID',
    param_code      varchar(64)                        not null comment '参数编码',
    param_name      varchar(200)                       not null comment '参数名称',
    target_value    decimal(24, 6)                     null comment '设定值(L1预设值)',
    lower_limit     decimal(24, 6)                     null comment '下限(首次检测实际最小值)',
    upper_limit     decimal(24, 6)                     null comment '上限(首次检测实际最大值)',
    unit            varchar(32)                        null comment '单位',
    actual_src_id   varchar(64)                        null comment '实际值来源钢卷号(首次写入时的ENCOILID)',
    preset_src_id   varchar(64)                        null comment 'L1设定值来源钢卷号(首次写入时的COILID)',
    create_by       varchar(64)                        null comment '创建人',
    create_time     datetime default CURRENT_TIMESTAMP null comment '创建时间',
    update_by       varchar(64)                        null comment '更新人',
    update_time     datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间',
    del_flag        tinyint  default 0                 not null comment '删除标志(0正常2删除)',
    remark          varchar(500)                       null comment '备注',
    constraint uk_plan_param_code
        unique (plan_id, param_code)
)
    comment '方案参数表';

create index idx_plan_param_plan
    on wms_process_plan_param (plan_id);

create table wms_process_spec
(
    spec_id      bigint auto_increment comment '主键'
        primary key,
    spec_code    varchar(64)                           not null comment '规程编号',
    spec_name    varchar(200)                          not null comment '规程名称',
    spec_type    varchar(32) default 'PROCESS'         not null comment '类型(PROCESS=工艺规程,STANDARD=标准)',
    line_id      bigint                                not null comment '产线ID',
    product_type varchar(100)                          null comment '产品类型',
    is_enabled   tinyint     default 1                 not null comment '是否启用(0否1是)',
    create_by    varchar(64)                           null comment '创建人',
    create_time  datetime    default CURRENT_TIMESTAMP null comment '创建时间',
    update_by    varchar(64)                           null comment '更新人',
    update_time  datetime    default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间',
    del_flag     tinyint     default 0                 not null comment '删除标志(0正常2删除，与全局逻辑删除配置一致)',
    remark       varchar(500)                          null comment '备注',
    constraint uk_wms_process_spec_code
        unique (spec_code)
)
    comment '规程主表';

create index idx_wms_process_spec_line
    on wms_process_spec (line_id);

create index idx_wms_process_spec_type
    on wms_process_spec (spec_type);

create table wms_process_spec_version
(
    version_id   bigint                                not null comment '主键'
        primary key,
    spec_id      bigint                                not null comment '规程主表ID',
    version_code varchar(64)                           not null comment '版本号',
    is_active    tinyint     default 0                 not null comment '是否当前生效(0否1是)',
    status       varchar(32) default 'DRAFT'           not null comment '状态(DRAFT草稿/PUBLISHED已发布/OBSOLETE作废等)',
    create_by    varchar(64)                           null comment '创建人',
    create_time  datetime    default CURRENT_TIMESTAMP null comment '创建时间',
    update_by    varchar(64)                           null comment '更新人',
    update_time  datetime    default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间',
    del_flag     tinyint     default 0                 not null comment '删除标志(0正常2删除)',
    remark       varchar(500)                          null comment '备注',
    constraint uk_spec_version_code
        unique (spec_id, version_code)
)
    comment '规程版本表';

create index idx_spec_version_active
    on wms_process_spec_version (spec_id, is_active);

create index idx_spec_version_spec
    on wms_process_spec_version (spec_id);

-- ─────────────────────────────────────────────────────────────
-- 钢卷服役记录表：记录哪些钢卷经过了某版本规程的检测/生产
-- ─────────────────────────────────────────────────────────────
create table wms_process_coil_record
(
    record_id    bigint                             not null comment '主键'
        primary key,
    version_id   bigint                             not null comment '规程版本ID',
    coil_id      varchar(64)                        not null comment '出口钢卷号(EXCOILID)',
    en_coil_id   varchar(64)                        null comment '入口钢卷号(ENCOILID)',
    has_anomaly  tinyint  default 0                 not null comment '本次是否检测到参数异常(0否1是)',
    anomaly_cnt  int      default 0                 not null comment '异常参数数量',
    process_time datetime                           null comment '检测时间',
    create_by    varchar(64)                        null comment '创建人',
    create_time  datetime default CURRENT_TIMESTAMP null comment '创建时间',
    update_by    varchar(64)                        null comment '更新人',
    update_time  datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间',
    del_flag     tinyint  default 0                 not null comment '删除标志(0正常2删除)',
    remark       varchar(500)                       null comment '备注',
    constraint uk_coil_version
        unique (version_id, coil_id)
)
    comment '版本钢卷服役记录表';

create index idx_coil_record_version
    on wms_process_coil_record (version_id);

create index idx_coil_record_coil
    on wms_process_coil_record (coil_id);

create index idx_coil_record_anomaly
    on wms_process_coil_record (version_id, has_anomaly);

-- ─────────────────────────────────────────────────────────────
-- 工艺参数异常记录表：持久化每次检测到的超限/欠限异常
-- ─────────────────────────────────────────────────────────────
create table wms_process_anomaly
(
    anomaly_id    bigint                             not null comment '主键'
        primary key,
    version_id    bigint                             not null comment '规程版本ID',
    plan_id       bigint                             not null comment '方案点位ID',
    param_id      bigint                             null comment '参数ID(wms_process_plan_param)',
    coil_id       varchar(64)                        not null comment '触发异常的出口钢卷号',
    en_coil_id    varchar(64)                        null comment '入口钢卷号',
    param_code    varchar(64)                        not null comment '参数编码',
    param_name    varchar(200)                       null comment '参数名称',
    unit          varchar(32)                        null comment '单位',
    anomaly_type  varchar(32)                        not null comment '异常类型: OVER_MAX/UNDER_MIN/BOTH',
    stored_target decimal(24, 6)                     null comment '规程中存储的设定值',
    stored_upper  decimal(24, 6)                     null comment '规程中存储的上限',
    stored_lower  decimal(24, 6)                     null comment '规程中存储的下限',
    actual_target decimal(24, 6)                     null comment '本次L1实际设定值',
    actual_max    decimal(24, 6)                     null comment '本次实际最大值',
    actual_min    decimal(24, 6)                     null comment '本次实际最小值',
    deviation_max decimal(24, 6)                     null comment '最大值偏差(actual_max - stored_upper, 正值表示超上限)',
    deviation_min decimal(24, 6)                     null comment '最小值偏差(actual_min - stored_lower, 负值表示低于下限)',
    detected_at   datetime                           null comment '异常检测时间',
    create_by     varchar(64)                        null comment '创建人',
    create_time   datetime default CURRENT_TIMESTAMP null comment '创建时间',
    del_flag      tinyint  default 0                 not null comment '删除标志(0正常2删除)',
    remark        varchar(500)                       null comment '备注'
)
    comment '工艺参数异常记录表';

create index idx_anomaly_version
    on wms_process_anomaly (version_id);

create index idx_anomaly_coil
    on wms_process_anomaly (coil_id);

create index idx_anomaly_param
    on wms_process_anomaly (version_id, param_code);

create index idx_anomaly_detected
    on wms_process_anomaly (detected_at);

-- ─────────────────────────────────────────────────────────────
-- 存量数据迁移（为 wms_process_plan_param 新增列打补丁）
-- 已有库执行此 ALTER，新建库直接用上方 CREATE TABLE 即可
-- ─────────────────────────────────────────────────────────────
-- ALTER TABLE wms_process_plan_param
--     ADD COLUMN actual_src_id varchar(64) null comment '实际值来源钢卷号(首次写入时的ENCOILID)' AFTER unit,
--     ADD COLUMN preset_src_id varchar(64) null comment 'L1设定值来源钢卷号(首次写入时的COILID)'  AFTER actual_src_id;

create table wms_process_task
(
    task_id       bigint auto_increment comment '工艺任务ID'
        primary key,
    plan_id       bigint                                not null comment '关联生产计划ID',
    process_id    bigint                                not null comment '所需工艺ID',
    product_id    bigint                                not null comment '对应产品ID',
    task_quantity int                                   not null comment '任务数量',
    task_status   varchar(20) default 'pending'         null comment '任务状态：pending-待处理/processing-处理中/completed-已完成',
    sequence      int                                   not null comment '工艺顺序',
    del_flag      tinyint(1)  default 0                 not null comment '删除标志（0=正常，1=已删除）',
    remark        varchar(255)                          null comment '备注',
    create_time   datetime    default CURRENT_TIMESTAMP not null comment '创建时间',
    create_by     varchar(50)                           null comment '创建人',
    update_time   datetime    default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
    update_by     varchar(50)                           null comment '更新人'
)
    comment '工艺任务表（生产计划所需工艺任务）' row_format = DYNAMIC;

