内容

1、支持并行分支
2、撤回/废弃/驳回 等内置按钮的可配置化
3、节点审批人身份策略支持(为空跳过/相邻跳过)

步骤

数据库脚本

CREATE TABLE state_machine_task_his (
         id varchar(36) NOT NULL, -- 主键
         def_id varchar(36) NOT NULL, -- 状态机定义
         transaction_id varchar(256) NOT NULL, -- 业务事务ID
         crt_user varchar(100) NULL, -- 创建人
         crt_name varchar(100) NULL, -- 创建人姓名
         crt_host varchar(100) NULL, -- 创建主机
         crt_time timestamp NULL, -- 创建时间
         upd_user varchar(100) NULL, -- 最后更新人
         upd_name varchar(100) NULL, -- 最后更新人姓名
         upd_host varchar(100) NULL, -- 最后更新主机
         upd_time timestamp NULL, -- 最后更新时间
         start_time timestamp NULL, -- 开始时间
         task_id varchar(100) NULL, -- 执行实例ID
         source_state_code varchar(256) NULL, -- 开始节点编码
         source_state_name varchar(256) NULL, -- 开始节点名称
         target_state_code varchar(256) NULL, -- 结束节点编码
         target_state_name varchar(256) NULL, -- 结束节点名称
         parent_task_id varchar(100) NULL, -- 父执行实例ID
         end_time timestamp NULL, -- 结束时间
         event_code varchar(256) NULL, -- 操作事件编码
         event_name varchar(256) NULL, -- 操作事件名称
         assignee varchar(2000) NULL, -- 签收人或被委托-实际操作人
         owner varchar(2000) NULL, -- 实际签收人,任务的拥有者
         active_type varchar(100) NULL, -- 当前节点类型(suspend/splitNode/joinNode)
         PRIMARY KEY (id)
);

COMMENT ON COLUMN state_machine_task_his.id IS '主键';
COMMENT ON COLUMN state_machine_task_his.def_id IS '状态机定义';
COMMENT ON COLUMN state_machine_task_his.transaction_id IS '业务事务ID';
COMMENT ON COLUMN state_machine_task_his.crt_user IS '创建人';
COMMENT ON COLUMN state_machine_task_his.crt_name IS '创建人姓名';
COMMENT ON COLUMN state_machine_task_his.crt_host IS '创建主机';
COMMENT ON COLUMN state_machine_task_his.crt_time IS '创建时间';
COMMENT ON COLUMN state_machine_task_his.upd_user IS '最后更新人';
COMMENT ON COLUMN state_machine_task_his.upd_name IS '最后更新人姓名';
COMMENT ON COLUMN state_machine_task_his.upd_host IS '最后更新主机';
COMMENT ON COLUMN state_machine_task_his.upd_time IS '最后更新时间';
COMMENT ON COLUMN state_machine_task_his.start_time IS '开始时间';
COMMENT ON COLUMN state_machine_task_his.task_id IS '执行实例ID';
COMMENT ON COLUMN state_machine_task_his.source_state_code IS '开始节点编码';
COMMENT ON COLUMN state_machine_task_his.source_state_name IS '开始节点名称';
COMMENT ON COLUMN state_machine_task_his.target_state_code IS '结束节点编码';
COMMENT ON COLUMN state_machine_task_his.target_state_name IS '结束节点名称';
COMMENT ON COLUMN state_machine_task_his.parent_task_id IS '父执行实例ID';
COMMENT ON COLUMN state_machine_task_his.end_time IS '结束时间';
COMMENT ON COLUMN state_machine_task_his.event_code IS '操作事件编码';
COMMENT ON COLUMN state_machine_task_his.event_name IS '操作事件名称';
COMMENT ON COLUMN state_machine_task_his.assignee IS '签收人或被委托-实际操作人';
COMMENT ON COLUMN state_machine_task_his.owner IS '实际签收人,任务的拥有者';
COMMENT ON COLUMN state_machine_task_his.active_type IS '当前节点类型(suspend/splitNode/joinNode)';


ALTER TABLE state_machine_task ADD parent_id varchar(100) NULL;
COMMENT ON COLUMN state_machine_task.parent_id IS '父实例ID';

ALTER TABLE state_machine_task ADD active_type varchar(100) NULL;
COMMENT ON COLUMN state_machine_task.active_type IS '当前节点类型(suspend/splitNode/joinNode)';

ALTER TABLE state_machine_task ADD active_state varchar(1) NULL;
COMMENT ON COLUMN state_machine_task.active_state IS '当前节点状态(1-激活 0-挂起)';

ALTER TABLE state_machine_task ADD start_time timestamp NULL;
COMMENT ON COLUMN state_machine_task.start_time IS '当前节点进入时间';

ALTER TABLE state_machine_task ADD process_id varchar(100) NULL;
COMMENT ON COLUMN state_machine_task.process_id IS '当前节点状态(1-激活 0-挂起)';

ALTER TABLE state_machine_task ADD tenant_id varchar(100) NULL;
COMMENT ON COLUMN state_machine_task.tenant_id IS '租户id';

ALTER TABLE state_machine_task ADD title varchar(1024) NULL;
COMMENT ON COLUMN state_machine_task.title IS '流程标题';

ALTER TABLE state_machine_task ADD biz_type varchar(4000) NULL;
COMMENT ON COLUMN state_machine_task.biz_type IS '业务标识';

ALTER TABLE state_machine_task_log ADD p_task_id varchar NULL;
COMMENT ON COLUMN state_machine_task_log.p_task_id IS '父实例id';

ALTER TABLE state_machine_task_log ADD process_id varchar(100) NULL;
COMMENT ON COLUMN state_machine_task_log.process_id IS '流程实例id';

ALTER TABLE state_machine_trans_conditon ADD check_type varchar(1000) NULL;
COMMENT ON COLUMN state_machine_trans_conditon.check_type IS '条件类型';

ALTER TABLE state_machine_trans_branch ADD check_type varchar(1000) NULL;
COMMENT ON COLUMN state_machine_trans_branch.check_type IS '条件类型';


CREATE TABLE state_machine_task_error (
       id varchar(36) NOT NULL, -- 主键
       task_id varchar(36) NOT NULL, -- 状态机任务实例ID
       machine_code varchar(256) NULL, -- 状态机编码
       event_name varchar(256) NULL, -- 事件编码
       request_body text NULL, -- 请求体
       response_body text NULL, -- 响应体
       op_user varchar(100) NULL, -- 操作人ID
       op_name varchar(100) NULL, -- 操作人名称
       op_time timestamp NULL, -- 操作时间
       crt_user varchar(100) NULL, -- 创建人
       crt_name varchar(100) NULL, -- 创建人姓名
       crt_host varchar(100) NULL, -- 创建主机
       crt_time timestamp NULL, -- 创建时间
       upd_user varchar(100) NULL, -- 最后更新人
       upd_name varchar(100) NULL, -- 最后更新人姓名
       upd_host varchar(100) NULL, -- 最后更新主机
       upd_time timestamp NULL, -- 最后更新时间
       process_id varchar(100) NULL,
       error_summary varchar(4000) NULL, -- 错误概要
       error_info text NULL, -- 详细错误
       error_type varchar(256) NULL, -- 错误类型
       event_label varchar(256) NULL, -- 事件名称
       PRIMARY KEY (id)
);

COMMENT ON COLUMN state_machine_task_error.id IS '主键';
COMMENT ON COLUMN state_machine_task_error.task_id IS '状态机任务实例ID';
COMMENT ON COLUMN state_machine_task_error.machine_code IS '状态机编码';
COMMENT ON COLUMN state_machine_task_error.event_name IS '事件编码';
COMMENT ON COLUMN state_machine_task_error.request_body IS '请求体';
COMMENT ON COLUMN state_machine_task_error.response_body IS '响应体';
COMMENT ON COLUMN state_machine_task_error.op_user IS '操作人ID';
COMMENT ON COLUMN state_machine_task_error.op_name IS '操作人名称';
COMMENT ON COLUMN state_machine_task_error.op_time IS '操作时间';
COMMENT ON COLUMN state_machine_task_error.crt_user IS '创建人';
COMMENT ON COLUMN state_machine_task_error.crt_name IS '创建人姓名';
COMMENT ON COLUMN state_machine_task_error.crt_host IS '创建主机';
COMMENT ON COLUMN state_machine_task_error.crt_time IS '创建时间';
COMMENT ON COLUMN state_machine_task_error.upd_user IS '最后更新人';
COMMENT ON COLUMN state_machine_task_error.upd_name IS '最后更新人姓名';
COMMENT ON COLUMN state_machine_task_error.upd_host IS '最后更新主机';
COMMENT ON COLUMN state_machine_task_error.upd_time IS '最后更新时间';
COMMENT ON COLUMN state_machine_task_error.error_summary IS '错误概要';
COMMENT ON COLUMN state_machine_task_error.error_info IS '详细错误';
COMMENT ON COLUMN state_machine_task_error.error_type IS '错误类型';
COMMENT ON COLUMN state_machine_task_error.event_label IS '事件名称';

ALTER TABLE state_machine_template ADD product_id varchar(100) NULL;
COMMENT ON COLUMN state_machine_template.product_id IS '产品id';
ALTER TABLE state_machine_template ADD tenant_id varchar(100) NULL;
COMMENT ON COLUMN state_machine_template.tenant_id IS '租户id';

ALTER TABLE state_machine_task ADD product_id varchar(100) NULL;
COMMENT ON COLUMN state_machine_task.product_id IS '产品id';

update state_machine_task set parent_id =-1 where parent_id is null ;
update state_machine_task set active_state =1 where active_state is null ;

ALTER TABLE state_machine_task ADD biz_name varchar(500) NULL;
COMMENT ON COLUMN state_machine_task.biz_name IS '业务单据名称';

ALTER TABLE state_machine_task_error ADD transaction_id varchar(64) NULL;

ALTER TABLE state_machine_task_error ADD biz_type varchar(100) NULL;

ALTER TABLE state_machine_task_error ADD biz_name varchar(1000) NULL;

ALTER TABLE state_machine_task_error ADD title varchar(1000) NULL;

ALTER TABLE state_machine_task_error ADD class_id varchar(32) NULL;

ALTER TABLE state_machine_task_error ADD serial_number varchar(100) NULL;

ALTER TABLE state_machine_task_error ADD lifecycle varchar(32) NULL;

ALTER TABLE state_machine_task_error ADD dversion_no numeric(8) NULL;

ALTER TABLE state_machine_task_error ADD p_class_id varchar(32) NULL;

ALTER TABLE state_machine_task_error ADD description varchar(1024) NULL;

ALTER TABLE state_machine_task_error ADD change_id varchar(32) NULL;

ALTER TABLE state_machine_task_error ADD release_date timestamp NULL;

ALTER TABLE state_machine_task_error ADD is_enabled varchar(4) NULL;

ALTER TABLE state_machine_task_error ADD is_deleted varchar(4) NULL;

ALTER TABLE state_machine_task_error ADD tenant_id varchar(64) NULL;

ALTER TABLE state_machine_task_error ADD product_id varchar(64) NULL;

ALTER TABLE state_machine_task_error ADD app_id varchar(64) NULL;

ALTER TABLE state_machine_task_error ADD org_id varchar(64) NULL;

ALTER TABLE state_machine_task_error ADD wf_relation_id varchar(256) NULL;

ALTER TABLE state_machine_task_error ADD wf_instance_id varchar(256) NULL;

ALTER TABLE state_machine_task_error ADD current_handler varchar(256) NULL;

ALTER TABLE state_machine_task_error ADD current_node varchar(256) NULL;

ALTER TABLE state_machine_task_error ADD current_handler_name varchar(256) NULL;

ALTER TABLE state_machine_task_error ADD current_node_name varchar(256) NULL;

ALTER TABLE state_machine_task_error ADD attr1 varchar(1024) NULL;

ALTER TABLE state_machine_task_error ADD attr2 varchar(1024) NULL;

ALTER TABLE state_machine_task_error ADD attr3 varchar(1024) NULL;

ALTER TABLE state_machine_task_error ADD attr4 varchar(1024) NULL;

ALTER TABLE state_machine_task_error ADD attr5 varchar(1024) NULL;

ALTER TABLE state_machine_task_error ADD attr6 varchar(1024) NULL;

ALTER TABLE state_machine_task_error ADD attr7 varchar(1024) NULL;

ALTER TABLE state_machine_task_error ADD attr8 varchar(1024) NULL;

ALTER TABLE state_machine_task_error ADD attr9 varchar(1024) NULL;

ALTER TABLE state_machine_task_error ADD attr10 varchar(1024) NULL;



CREATE TABLE IF NOT EXISTS state_machine_todo (
     id varchar(64) NOT NULL, -- 主键
     task_id varchar(64) NULL, -- 流程实例id
     url varchar(2048) NULL, -- 待办链接
     current_state varchar(1000) NULL, -- 当前节点编码
     current_state_label varchar(1000) NULL, -- 当前节点名称
     transaction_id varchar(64) NULL, -- 单据id
     crt_time timestamp NULL, -- 创建时间
     product_id varchar(64) NULL, -- 产品id
     tenant_id varchar(64) NULL, -- 租户id
     module_id varchar(1024) NULL, -- 模块标识
     title varchar(2048) NULL, -- 待办标题
     doc_creator_id varchar(256) NULL, -- 流程创建人标识
     doc_create_name varchar(256) NULL, -- 流程创建人姓名
     todo_type varchar(256) NULL, -- 待办类型(通知、待审)
     "level" varchar(64) NULL, -- 紧急程度
     wf_number varchar(64) NULL, -- 流程编码
     CONSTRAINT state_machine_todo_pk PRIMARY KEY (id)
);

COMMENT ON COLUMN state_machine_todo.id IS '主键';
COMMENT ON COLUMN state_machine_todo.task_id IS '流程实例id';
COMMENT ON COLUMN state_machine_todo.url IS '待办链接';
COMMENT ON COLUMN state_machine_todo.current_state IS '当前节点编码';
COMMENT ON COLUMN state_machine_todo.current_state_label IS '当前节点名称';
COMMENT ON COLUMN state_machine_todo.transaction_id IS '单据id';
COMMENT ON COLUMN state_machine_todo.crt_time IS '创建时间';
COMMENT ON COLUMN state_machine_todo.product_id IS '产品id';
COMMENT ON COLUMN state_machine_todo.tenant_id IS '租户id';
COMMENT ON COLUMN state_machine_todo.module_id IS '模块标识';
COMMENT ON COLUMN state_machine_todo.title IS '待办标题';
COMMENT ON COLUMN state_machine_todo.doc_creator_id IS '流程创建人标识';
COMMENT ON COLUMN state_machine_todo.doc_create_name IS '流程创建人姓名';
COMMENT ON COLUMN state_machine_todo.todo_type IS '待办类型(通知、待审)';
COMMENT ON COLUMN state_machine_todo."level" IS '紧急程度';
COMMENT ON COLUMN state_machine_todo.wf_number IS '流程编码';

CREATE TABLE IF NOT EXISTS state_machine_todo_done (
      id varchar NOT NULL,
      todo_id varchar(64) NULL, -- 待办id
      handler_user varchar(64) NULL, -- 用户id
      handler_user_name varchar NULL, -- 用户姓名
      finish_time timestamp NULL, -- 完成时间
      CONSTRAINT state_machine_todo_done_pk PRIMARY KEY (id)
);

COMMENT ON COLUMN state_machine_todo_done.todo_id IS '待办id';
COMMENT ON COLUMN state_machine_todo_done.handler_user IS '用户id';
COMMENT ON COLUMN state_machine_todo_done.handler_user_name IS '用户姓名';
COMMENT ON COLUMN state_machine_todo_done.finish_time IS '完成时间';


CREATE TABLE IF NOT EXISTS state_machine_todo_target (
    id varchar(64) NOT NULL, -- 主键
    todo_id varchar(64) NULL, -- 待办id
    handler_user varchar(64) NULL,
    handler_user_name varchar(256) NULL, -- 用户姓名
    CONSTRAINT state_machine_todo_target_pk PRIMARY KEY (id)
);

COMMENT ON COLUMN state_machine_todo_target.id IS '主键';
COMMENT ON COLUMN state_machine_todo_target.todo_id IS '待办id';
COMMENT ON COLUMN state_machine_todo_target.handler_user_name IS '用户姓名';


update state_machine_task_log set process_id = task_id,p_task_id ='-1' where process_id is null and p_task_id is null;
update state_machine_task set active_type = 'suspend' where active_type is null ;
ALTER TABLE state_machine_task ADD wf_number varchar(64) NULL;
COMMENT ON COLUMN state_machine_task.wf_number IS '流程编码';
ALTER TABLE state_machine_task ADD form_instance_url varchar(2048) NULL;
COMMENT ON COLUMN state_machine_task.form_instance_url IS '流程编码';



ALTER TABLE state_machine_task_log ADD COLUMN request_body1 text ;
update state_machine_task_log set request_body1 = request_body ;
ALTER TABLE state_machine_task_log DROP COLUMN request_body;
ALTER TABLE state_machine_task_log RENAME COLUMN request_body1 TO request_body;

ALTER TABLE state_machine_task_log ADD COLUMN response_body1 text ;
update state_machine_task_log set response_body1 = response_body ;
ALTER TABLE state_machine_task_log DROP COLUMN response_body;
ALTER TABLE state_machine_task_log RENAME COLUMN response_body1 TO response_body;

ALTER TABLE state_machine_task ADD COLUMN response_body1 text ;
update state_machine_task set response_body1 = response_body ;
ALTER TABLE state_machine_task DROP COLUMN response_body;
ALTER TABLE state_machine_task RENAME COLUMN response_body1 TO response_body;

ALTER TABLE state_machine_task ADD COLUMN request_body1 text ;
update state_machine_task set request_body1 = request_body ;
ALTER TABLE state_machine_task DROP COLUMN request_body;
ALTER TABLE state_machine_task RENAME COLUMN request_body1 TO request_body;


ALTER TABLE state_machine_template ADD product_id varchar(100) NULL;
COMMENT ON COLUMN state_machine_template.product_id IS '产品id';
依赖

springboot 2.+
更换或添加

<dependency>
    <groupId>com.cvte.csb</groupId>
    <artifactId>csb-statemachine-client</artifactId>
    <version>1.4.3.PLUS-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>com.cvte.csb</groupId>
    <artifactId>csb-statemachine-admin</artifactId>
    <version>1.4.3.PLUS-SNAPSHOT</version>
</dependency>

springboot 1.5+
更换或添加

<dependency>
    <groupId>com.cvte.csb</groupId>
    <artifactId>csb-statemachine-client</artifactId>
    <version>1.4.3-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>com.cvte.csb</groupId>
    <artifactId>csb-statemachine-admin</artifactId>
    <version>1.4.3-SNAPSHOT</version>
</dependency>

说明:如果依赖无法下载,提前配置依赖仓库

<repository>
    <id>jfrog-virtual</id>
    <name>artifactory-releases</name>
    <url>
        https://artifactory.gz.cvte.cn/artifactory/SR_maven_virtual/
    </url>
    <releases>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy>
    </releases>
    <snapshots>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy>
    </snapshots>
</repository>
流程按钮
#指定用户的按钮获取
List<EventBtnDTO> btns = stateMachineService.getNextEventsV2("单据id", "域账号/ID");
审批操作
#审批
stateMachineService.dispatchEventV2("单据id","执行实例id,按钮中的taskId",event)

#转办
stateMachineService.updateApproverV2("单据id", "taskId",toApproverVo, fromApproverVo)
审批记录
 前端包直接集成
其他能力
#可驳回节点
stateMachineHistoryServiceImpl.getRefuseNodes("单据id","执行实例taskId")
#可重启节点
stateMachineHistoryServiceImpl.getRestartNodes("单据id","执行实例taskId")
说明
 流程图中审核节点出发的非正向的线需手工移除,使用"驳回选节点"功能代替
作者:叶端旺  创建时间:2023-12-20 15:24
最后编辑:叶端旺  更新时间:2024-12-27 15:01