drop table if exists flow_definition;
CREATE TABLE `flow_definition`
(
    `id`          bigint unsigned NOT NULL COMMENT '主键id',
    `flow_code`   varchar(40)  NOT NULL COMMENT '流程编码',
    `flow_name`   varchar(100) NOT NULL COMMENT '流程名称',
    `version`     varchar(20)  NOT NULL COMMENT '流程版本',
    `is_publish`  tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否发布（0未发布 1已发布 9失效）',
    `from_custom` char(1)      DEFAULT 'N' COMMENT '审批表单是否自定义（Y是 N否）',
    `from_path`   varchar(100) DEFAULT NULL COMMENT '审批表单路径',
    `create_time` datetime     DEFAULT NULL COMMENT '创建时间',
    `update_time` datetime     DEFAULT NULL COMMENT '更新时间',
    `del_flag`    char(1)      DEFAULT NULL COMMENT '删除标志',
    `tenant_id` varchar(40)  DEFAULT NULL COMMENT '租户id',
    PRIMARY KEY (`id`) USING BTREE,
    UNIQUE KEY `flow_code_version` (`flow_code`,`version`) USING BTREE
) ENGINE=InnoDB  COMMENT='流程定义表';

INSERT INTO flow_definition  VALUES (1, 'Flow-001', '设备录入审核', '1.0.0', 0, 'N', null, '2024-05-30 20:03:07', '2024-05-30 20:05:01', null, null);
INSERT INTO flow_definition  VALUES (2, 'Flow-002', '核心物料清单审核', '1.0.0', 0, 'N', null, '2024-05-30 20:03:06', '2024-05-30 20:05:01', null, null);
INSERT INTO flow_definition  VALUES (3, 'Flow-003', '验收单审核', '1.0.0', 0, 'N', null, '2024-05-30 20:03:05', '2024-05-30 20:05:01', null, null);
INSERT INTO flow_definition  VALUES (4, 'Flow-004', '残件信息审核', '1.0.0', 0, 'N', null, '2024-05-30 20:03:04', '2024-05-30 20:05:01', null, null);
INSERT INTO flow_definition  VALUES (5, 'Flow-005', '变更申请审核', '1.0.0', 0, 'N', null, '2024-05-27 16:50:03', '2024-05-30 12:54:29', null, null);
INSERT INTO flow_definition  VALUES (6, 'Flow-006', 'ECO验证审核', '1.0.0', 0, 'N', null, '2024-05-27 16:50:02', '2024-05-30 20:05:01', null, null);
INSERT INTO flow_definition  VALUES (7, 'Flow-007', 'DEMO申请审核', '1.0.0', 0, 'N', null, '2024-05-27 16:50:01', '2024-05-30 20:05:01', null, null);


drop table if exists flow_node;
CREATE TABLE `flow_node`
(
    `id`              bigint unsigned NOT NULL COMMENT '主键id',
    `node_type`       tinyint(1) NOT NULL COMMENT '节点类型（0开始节点 1中间节点 2结束结点 3互斥网关 4并行网关）',
    `definition_id`   bigint       NOT NULL COMMENT '流程定义id',
    `node_code`       varchar(100) NOT NULL COMMENT '流程节点编码',
    `node_name`       varchar(100) DEFAULT NULL COMMENT '流程节点名称',
    `permission_flag` varchar(200) DEFAULT NULL COMMENT '权限标识（权限类型:权限标识，可以多个，如role:1,role:2)',
    `coordinate`      varchar(100) DEFAULT NULL COMMENT '坐标',
    `skip_any_node`   varchar(100) DEFAULT 'N' COMMENT '是否可以退回任意节点（Y是 N否）',
    `listener_type`   varchar(100) DEFAULT NULL COMMENT '监听器类型',
    `listener_path`   varchar(400) DEFAULT NULL COMMENT '监听器路径',
    `version`         varchar(20)  NOT NULL COMMENT '版本',
    `create_time`     datetime     DEFAULT NULL COMMENT '创建时间',
    `update_time`     datetime     DEFAULT NULL COMMENT '更新时间',
    `del_flag`    char(1)      DEFAULT NULL COMMENT '删除标志',
    `tenant_id`     varchar(40)  DEFAULT NULL COMMENT '租户id',
    PRIMARY KEY (`id`) USING BTREE,
    UNIQUE KEY `info_id_code` (`definition_id`,`node_code`) USING BTREE COMMENT '保证一个流程中node_code是唯一的'
) ENGINE=InnoDB  COMMENT='流程结点表';

drop table if exists flow_skip;
CREATE TABLE `flow_skip`
(
    `id`             bigint unsigned NOT NULL COMMENT '主键id',
    `definition_id`  bigint       NOT NULL COMMENT '流程定义id',
    `now_node_code`  varchar(100) NOT NULL COMMENT '当前流程节点的编码',
    `now_node_type`  tinyint(1) DEFAULT NULL COMMENT '当前节点类型（0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关）',
    `next_node_code` varchar(100) NOT NULL COMMENT '下一个流程节点的编码',
    `next_node_type` tinyint(1) DEFAULT NULL COMMENT '下一个节点类型（0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关）',
    `skip_name`      varchar(100) DEFAULT NULL COMMENT '跳转名称',
    `skip_type`      varchar(40)  DEFAULT NULL COMMENT '跳转类型（PASS审批通过 REJECT退回）',
    `skip_condition` varchar(200) DEFAULT NULL COMMENT '跳转条件',
    `coordinate`     varchar(100) DEFAULT NULL COMMENT '坐标',
    `create_time`    datetime     DEFAULT NULL COMMENT '创建时间',
    `update_time`    datetime     DEFAULT NULL COMMENT '更新时间',
    `del_flag`    char(1)      DEFAULT NULL COMMENT '删除标志',
    `tenant_id`     varchar(40)  DEFAULT NULL COMMENT '租户id',
    PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB  COMMENT='结点跳转关联表';

drop table if exists flow_task;
CREATE TABLE `flow_task`
(
    `id`              bigint       NOT NULL COMMENT '主键id',
    `definition_id`   bigint       NOT NULL COMMENT '对应flow_definition表的id',
    `instance_id`     bigint       NOT NULL COMMENT '对应flow_instance表的id',
    `node_code`       varchar(100) NOT NULL COMMENT '节点编码',
    `node_name`       varchar(100) DEFAULT NULL COMMENT '节点名称',
    `node_type`       tinyint(1) NOT NULL COMMENT '节点类型（0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关）',
    `permission_flag` varchar(200) DEFAULT NULL COMMENT '权限标识（权限类型:权限标识，可以多个，如role:1,role:2)',
    `flow_status`     tinyint(1) NOT NULL COMMENT '流程状态（0待提交 1审批中 2 审批通过 8已完成 9已退回 10失效）',
    `approver`        varchar(40)  DEFAULT NULL COMMENT '审批者',
    `assignee`        varchar(40)  DEFAULT NULL COMMENT '转办人',
    `create_time`     datetime     DEFAULT NULL COMMENT '创建时间',
    `update_time`     datetime     DEFAULT NULL COMMENT '更新时间',
    `del_flag`    char(1)      DEFAULT NULL COMMENT '删除标志',
    `tenant_id`     varchar(40)  DEFAULT NULL COMMENT '租户id',
    PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB  COMMENT='待办任务表';


drop table if exists flow_his_task;
CREATE TABLE `flow_his_task`
(
    `id`               bigint unsigned NOT NULL COMMENT '主键id',
    `definition_id`    bigint NOT NULL COMMENT '对应flow_definition表的id',
    `instance_id`      bigint NOT NULL COMMENT '对应flow_instance表的id',
    `node_code`        varchar(100) DEFAULT NULL COMMENT '开始节点编码',
    `node_name`        varchar(100) DEFAULT NULL COMMENT '开始节点名称',
    `node_type`        tinyint(1) DEFAULT NULL COMMENT '开始节点类型（0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关）',
    `target_node_code` varchar(100) DEFAULT NULL COMMENT '目标节点编码',
    `target_node_name` varchar(100) DEFAULT NULL COMMENT '结束节点名称',
    `approver`         varchar(40)  DEFAULT NULL COMMENT '审批者',
    `permission_flag`  varchar(200) DEFAULT NULL COMMENT '权限标识（权限类型:权限标识，可以多个，如role:1,role:2)',
    `flow_status`      tinyint(1) NOT NULL COMMENT '流程状态（0待提交 1审批中 2 审批通过 8已完成 9已退回 10失效）',
    `message`          varchar(500) DEFAULT NULL COMMENT '审批意见',
    `create_time`      datetime     DEFAULT NULL COMMENT '创建时间',
    `update_time`      datetime     DEFAULT NULL COMMENT '更新时间',
    `del_flag`    char(1)      DEFAULT NULL COMMENT '删除标志',
    `tenant_id` varchar(40)  DEFAULT NULL COMMENT '租户id',
    PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB  COMMENT='历史任务记录表';

drop table if exists flow_instance;
CREATE TABLE `flow_instance`
(
    `id`            bigint      NOT NULL COMMENT '主键id',
    `definition_id` bigint      NOT NULL COMMENT '对应flow_definition表的id',
    `business_id`   varchar(40) NOT NULL COMMENT '业务id',
    `node_type`     tinyint(1) NOT NULL COMMENT '结点类型（0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关）',
    `node_code`     varchar(40) NOT NULL COMMENT '流程节点编码',
    `node_name`     varchar(100) DEFAULT NULL COMMENT '流程节点名称',
    `variable`      text COMMENT '任务变量',
    `flow_status`   tinyint(1) NOT NULL COMMENT '流程状态（0待提交 1审批中 2 审批通过 8已完成 9已退回 10失效）',
    `create_by`     varchar(64)  DEFAULT '' COMMENT '创建者',
    `create_time`   datetime     DEFAULT NULL COMMENT '创建时间',
    `update_time`   datetime     DEFAULT NULL COMMENT '更新时间',
    `ext`           varchar(500) DEFAULT NULL COMMENT '扩展字段',
    `del_flag`    char(1)      DEFAULT NULL COMMENT '删除标志',
    `tenant_id`     varchar(40)  DEFAULT NULL COMMENT '租户id',
    PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB  COMMENT='流程实例表';


-- flow-user 建表语句
CREATE TABLE `flow_user`
(
    `id`              bigint unsigned NOT NULL COMMENT '主键id',
    `type`            char(1)  NOT NULL COMMENT '人员类型（1代办任务的审批人权限 2代办任务的转办人权限 3流程实例的抄送人权限 4待办任务的委托人权限）',
    `processed_by`    varchar(80) DEFAULT NULL COMMENT '权限人',
    `associated`      bigint NOT NULL COMMENT '关联表id',
    `create_time`     datetime     DEFAULT NULL COMMENT '创建时间',
    `create_by`       varchar(80) DEFAULT NULL COMMENT '创建人',
    `update_time`     datetime     DEFAULT NULL COMMENT '更新时间',
    `del_flag`        char(1)      DEFAULT NULL COMMENT '删除标志',
    `tenant_id`       varchar(40)  DEFAULT NULL COMMENT '租户id',
    PRIMARY KEY (`id`) USING BTREE,
    KEY `user_processed_type` (`processed_by`,`type`)
) ENGINE=InnoDB  COMMENT='流程用户表';;

-- flow_task 历史数据迁移脚本sql
--insert into `flow_user` (id,type,associated,processed_by,create_time,update_time,del_flag,tenant_id)
--SELECT
--    a.id+CONVERT((@rowNum:=@rowNum+1),SIGNED),'1',a.id,
--    substring_index( substring_index( a.permission_flag, ',', b.help_topic_id + 1 ), ',', - 1 ),
--    a.create_time,a.update_time,a.del_flag,a.tenant_id
--FROM (select id,permission_flag,create_time,update_time,del_flag,tenant_id from flow_task) a
--INNER JOIN mysql.help_topic b
--    ON b.help_topic_id < (length( a.permission_flag ) - length(REPLACE ( a.permission_flag, ',', '' )) + 1)
--left join (Select (@rowNum :=0) ) c ON 1=1;

-- 去掉 flow_task 表废弃字段sql
ALTER TABLE `flow_task` DROP COLUMN approver;
ALTER TABLE `flow_task` DROP COLUMN assignee;
ALTER TABLE `flow_task` DROP COLUMN permission_flag;
-- 去掉 flow_his_task 表废弃字段sql
ALTER TABLE `flow_his_task` DROP COLUMN permission_flag;
ALTER TABLE `flow_task` DROP COLUMN assignee;
ALTER TABLE `flow_task` DROP COLUMN permission_flag;
ALTER TABLE `flow_task` DROP COLUMN flow_status;

-- flow_node 增加会签，票签字段
ALTER TABLE `flow_node`
    ADD COLUMN `handler_type` VARCHAR(100) NULL DEFAULT NULL COMMENT '处理器类型' AFTER `listener_path`,
    ADD COLUMN `handler_path` VARCHAR(400) NULL DEFAULT NULL COMMENT '处理器路径' AFTER `handler_type`,
    ADD COLUMN `node_ratio` DECIMAL(6,3) NULL DEFAULT NULL COMMENT '流程签署比例值' AFTER `node_name`;

-- flow_his_task 增加task_id
ALTER TABLE `flow_his_task`
    ADD COLUMN `task_id` BIGINT(19) NOT NULL COMMENT '对应flow_task表的id' AFTER `instance_id`,
    ADD COLUMN `cooperate_type` tinyint(1) NULL DEFAULT 0 COMMENT '协作方式(1或签 2转办 3委派 4会签 5票签 6加签 7减签)' AFTER `approver`,
    ADD COLUMN `collaborator` VARCHAR(40) NULL DEFAULT NULL COMMENT '协作人' AFTER `cooperate_type`;

ALTER TABLE `flow_definition`  DROP INDEX `flow_code_version`;
ALTER TABLE `flow_node` DROP INDEX `info_id_code`;