工作流(golang版本的流程引擎、规则引擎、表单引擎)、表单编辑器、流程编辑器
Workflow (a Golang-based flow engine, rule engine, form engine), form editor, process editor.
|-- bin # 二进制文件目录
|-- cmd # 编译入口
| `-- app
|-- deploy # 环境和部署相关目录
| |-- docker-compose # docker-compose 容器编排目录
| `-- kubernetes # k8s 编排配置目录
|-- docs # 文档目录
|-- etc # 配置文件目录
|-- internal
| `-- app
| |-- command # 命令行功能模块
| | |-- handler
| | `-- script # 临时脚本
| |-- component # 功能组件,如:db, redis 等
| |-- config # 配置模型
| |-- cron # 定时任务功能模块
| | `-- job
| |-- model # 数据库模型
| |-- pkg # 功能类库
| |-- repository # 数据处理层
| |-- service # 业务逻辑层
| |-- test
| `-- transport
| |-- grpc
| | |-- api # proto 文件目录
| | |-- handler # 控制层
| | `-- middleware # 中间件
| `-- http
| |-- api # swagger 文档
| |-- handler # 控制层
| |-- middleware # 中间件
| `-- router # 路由
|-- logs # 日志目录
|-- pkg # 功能类库
`-- proto # 第三方 proto 文件目录
软件架构说明
支持特性
- 支持流程办理、退回、自由流、会签、并行、串行、服务任务等
- 支持退回任务,退回到指定环节,退回到上一步,退回到发起人
- 支持转办任务,将任务交接给他人办理,办理完成后继续下一步骤
- 支持委托任务,将任务委托给他人,他人办理完成后再回到委托人
- 支持智能提交,相同处理人自动跳过,支持自由指定下一步处理人
- 支持作废流程,允许发起人快速终止流程,管理员维护终止流程
- 支持自由流程,根据环节选择,自由跳转到指定环节,特事特办
- 支持流程撤回,下一步未办理的任务,可进行取回撤销重做任务
- 支持流程跟踪图,流程状态展现,流转信息,任务历史,任务分配信息
- 支持节点表单权限,控制人员表单权限,如:只读、编辑、隐藏、必填等
- 待办任务,已办任务、已发任务、流程跟踪、审批记录
- 流程管控,在无关联表单情况下流程调试,如流程发起、挂起;流程定义、实例、任务等查询;任务办理,重定位等
- 支持流程组件标签定义(流程按钮、意见审批、下一步流程信息等)快速与自定义的业务表单建立关系。
- 支持版本化管理流程,新调整的流程业务不影响正在运行,未结束的流程继续流转。
- 支持任务加签、催办任务、传阅任务、流程委托设置
设计文档:
https://www.processon.com/view/link/6459ef517ca03d041ea38cba
节点模型【1:开始节点;2:审批节点;3:办理节点;4:抄送节点;5:自定义节点;6:条件节点;7:分支节点;8:汇聚节点;9:结束节点】
节点字段描述:
- 节点模型:nodeModel
- 节点名称:nodeName
- 节点ID:nodeId
- 父节点ID:parentId
{
"nodeModel":"节点模型【1:开始节点;2:审批节点;3:办理节点;4:抄送节点;5:自定义节点;6:条件节点;7:分支节点;8:汇聚节点;9:结束节点】--数字",
"nodeName":"发起节点",
"nodeId":"节点ID",
"parentId":"节点父ID"
}案例:
{
"nodeModel":1,
"nodeName":"发起人",
"nodeId":"1640993392605401001",
"parentId":""
}{
"nodeModel":"节点模型【1:开始节点;2:审批节点;3:办理节点;4:抄送节点;5:自定义节点;6:条件节点;7:分支节点;8:汇聚节点;9:结束节点】--数字",
"nodeName":"审批节点",
"nodeId":"节点ID",
"parentId":"节点父ID",
"formPer":[{
"elemId": "表单元素ID",
"elemPId": "表单元素父ID",
"per": "表单权限【可编辑:1;只读:2;隐藏:3】默认只读2--数字"
}],
"approveType": "审批类型【人工审批:1;自动通过:2;自动拒绝】默认人工审批1--数字",
"nodeSetting":{
"execCheck":"审批执行校验,设计中可忽略",
"timeout":"审批限时处理,设计中可忽略"
},
"nodeHandler": {
"type": "常用审批人【指定成员:1;发起人自己:2;发起人自选:3:角色:4;部门:5】主管(相对岗位)【直属主管:1;部门主管:2;连续多级主管:3;部门控件对应主管:4】其他【表单人员控件:1;部门控件:2;角色控件:3】--数字",
"handlers": [{
"id": "处理人ID",
"name": "处理人名称",
"sort": "排序--数字"
}],
"strategy":"处理人策略【常用审批人:1;主管(相对岗位):2;其他:3】--数字",
"obj": "扩展字段,设计中可忽略",
"relative":"相对发起人的直属主管,设计中可忽略"
},
"noneHandler":"审批人为空时【自动通过:1;自动转交管理员:2;指定审批人:3】默认自动通过1--数字",
"appointHandler":"审批人为空时指定审批人ID",
"handleMode":"审批方式【依次审批:1、会签(需要完成人数的审批人同意或拒绝才可完成节点):2、或签(其中一名审批人同意或拒绝即可):3】默认会签2--数字",
"finishMode":"完成人数:依次审批默认0所有人不可选人,会签默认0所有人(可选人大于0),或签默认1一个人(可选人大于0)--数字"
}案例:
{
"nodeModel":2,
"nodeName":"审批节点1",
"nodeId":"1640993392605401002",
"parentId":"",
"formPer":[{
"elemId": "param1",
"elemPId": "",
"per": 1
}],
"approveType": 1,
"nodeSetting":{
"execCheck":"",
"timeout":""
},
"nodeHandler": {
"type": "1",
"handlers": [{
"id": "547",
"name": "xuch01",
"sort": 1
}],
"strategy":1,
"obj": "",
"relative":""
},
"noneHandler":1,
"appointHandler":"",
"handleMode":2,
"finishMode":0
}{
"nodeModel":"节点模型【1:开始节点;2:审批节点;3:办理节点;4:抄送节点;5:自定义节点;6:条件节点;7:分支节点;8:汇聚节点;9:结束节点】--数字",
"nodeName":"办理节点",
"nodeId":"节点ID",
"parentId":"节点父ID",
"formPer":[{
"elemId": "表单元素ID",
"elemPId": "表单元素父ID",
"per": "表单权限【可编辑:1;只读:2;隐藏:3】默认只读2--数字"
}],
"nodeSetting":{
"timeout":"审批限时处理,设计中可忽略"
},
"nodeHandler": {
"type": "常用审批人【指定成员:1;发起人自己:2;发起人自选:3:角色:4;部门:5】主管(相对岗位)【直属主管:1;部门主管:2;连续多级主管:3;部门控件对应主管:4】其他【表单人员控件:1;部门控件:2;角色控件:3】--数字",
"handlers": [{
"id": "处理人ID",
"name": "处理人名称",
"sort": "排序--数字"
}],
"strategy":"处理人策略【常用审批人:1;主管(相对岗位):2;其他:3】--数字",
"obj": "扩展字段,设计中可忽略",
"relative":"相对发起人的直属主管,设计中可忽略"
},
"noneHandler":"审批人为空时【自动通过:1;自动转交管理员:2;指定审批人:3】默认自动通过1",
"appointHandler":"审批人为空时指定审批人:3,指定审批人ID",
"handleMode":"审批方式【依次审批:1、会签(需要完成人数的审批人同意或拒绝才可完成节点):2、或签(其中一名审批人同意或拒绝即可):3】默认会签2",
"finishMode":"完成人数:依次审批默认0所有人不可选人,会签默认0所有人(可选人大于0),或签默认1一个人(可选人大于0)"
}案例:
{
"nodeModel":3,
"nodeName":"办理节点1",
"nodeId":"1640993392605401005",
"parentId":"1640993392605401003",
"formPer":[{
"elemId": "param1",
"elemPId": "",
"per": 1
}],
"nodeSetting":{
"timeout":""
},
"nodeHandler": {
"type": "1",
"handlers": [{
"id": "547",
"name": "xuch01",
"sort": 1
}],
"strategy":1,
"obj": "",
"relative":""
},
"noneHandler":1,
"appointHandler":"",
"handleMode":2,
"finishMode":0
}{
"nodeModel":"节点模型【1:开始节点;2:审批节点;3:办理节点;4:抄送节点;5:自定义节点;6:条件节点;7:分支节点;8:汇聚节点;9:结束节点】--数字",
"nodeName":"抄送节点",
"nodeId":"节点ID",
"parentId":"节点父ID",
"formPer":[{
"elemId": "表单元素ID",
"elemPId": "表单元素父ID",
"per": "表单权限【可编辑:1;只读:2;隐藏:3】默认只读2--数字"
}],
"nodeSetting":{
"allowNotify":"允许发起人添加抄送人,先忽略"
},
"nodeHandler": {
"type": "常用审批人【指定成员:1;发起人自己:2;发起人自选:3:角色:4;部门:5】主管(相对岗位)【直属主管:1;部门主管:2;连续多级主管:3;部门控件对应主管:4】其他【表单人员控件:1;部门控件:2;角色控件:3】--数字",
"handlers": [{
"id": "处理人ID",
"name": "处理人名称",
"sort": "排序--数字"
}],
"strategy":"处理人策略【常用审批人:1;主管(相对岗位):2;其他:3】--数字",
"obj": "扩展字段,设计中可忽略",
"relative":"相对发起人的直属主管,设计中可忽略"
}
}案例:
{
"nodeModel":4,
"nodeName":"抄送节点1",
"nodeId":"1640993392605401007",
"parentId":"1640993392605401003",
"formPer":[{
"elemId": "param1",
"elemPId": "",
"per": 1
}],
"nodeSetting":{
"allowNotify":""
},
"nodeHandler": {
"type": "1",
"handlers": [{
"id": "547",
"name": "xuch01",
"sort": 1
}],
"strategy":1,
"obj": "",
"relative":""
}
}{
"nodeModel":"节点模型【1:开始节点;2:审批节点;3:办理节点;4:抄送节点;5:自定义节点;6:条件节点;7:分支节点;8:汇聚节点;9:结束节点】--数字",
"nodeName":"分支节点",
"nodeId":"节点ID",
"parentId":"节点父ID",
"branchMode":"分支执行方式【单分支:1;多分支:2】默认多分支2--数字",
"defaultBranch":"单分支处理需要默认分支,在条件优先级无法处理时候执行默认分支,取值分支下标--数字",
"children":[
[
{
"nodeModel":"节点模型【1:开始节点;2:审批节点;3:办理节点;4:抄送节点;5:自定义节点;6:条件节点;7:分支节点;8:汇聚节点;9:结束节点】--数字",
"nodeName":"条件节点",
"nodeId":"节点ID",
"parentId":"节点父ID对应分支节点ID",
"level":"优先级,分支执行方式为多分支处理方式无优先级应为0--数字",
"conditionGroup":"条件组前端描述展示条件组",
"conditionExpr":"条件组解析后的表达式"
},
{
"nodeModel":"节点模型【1:开始节点;2:审批节点;3:办理节点;4:抄送节点;5:自定义节点;6:条件节点;7:分支节点;8:汇聚节点;9:结束节点】--数字",
"nodeName":"抄送节点",
"nodeId":"节点ID",
"parentId":"节点父ID",
"...":""
}
]
]
}{
"nodeModel":"节点模型【1:开始节点;2:审批节点;3:办理节点;4:抄送节点;5:自定义节点;6:条件节点;7:分支节点;8:汇聚节点;9:结束节点】--数字",
"nodeName":"条件节点",
"nodeId":"节点ID",
"parentId":"节点父ID对应分支节点ID",
"level":"优先级,分支执行方式为多分支处理方式无优先级应为0--数字",
"conditionGroup":"条件组前端描述展示条件组",
"conditionExpr":"条件组解析后的表达式"
}{
"nodeModel":"节点模型【1:开始节点;2:审批节点;3:办理节点;4:抄送节点;5:自定义节点;6:条件节点;7:分支节点;8:汇聚节点;9:结束节点】--数字",
"nodeName":"汇聚节点",
"nodeId":"节点ID",
"parentId":"节点父ID"
}案例:
{
"nodeModel":8,
"nodeName":"分支汇聚",
"nodeId":"1640993392605401008",
"parentId":""
}{
"nodeModel":"节点模型【1:开始节点;2:审批节点;3:办理节点;4:抄送节点;5:自定义节点;6:条件节点;7:分支节点;8:汇聚节点;9:结束节点】--数字",
"nodeName":"自定义节点",
"nodeId":"节点ID",
"parentId":"节点父ID"
}
设计中{
"nodeModel":"节点模型【1:开始节点;2:审批节点;3:办理节点;4:抄送节点;5:自定义节点;6:条件节点;7:分支节点;8:汇聚节点;9:结束节点】--数字",
"nodeName":"结束节点",
"nodeId":"节点ID",
"parentId":"节点父ID"
}案例
{
"nodeModel":9,
"nodeName":"流程结束",
"nodeId":"1640993392605401009",
"parentId":""
}引入本地module
require "github.com/wegoteam/weflow" v0.0.1
replace "github.com/wegoteam/weflow" => "../"- cwgo语法
cwgo model --db_type mysql --out_file dao_gen.go --out_dir ./backend/pkg/dao --dsn "root:root@tcp(localhost:3306)/weflow?charset=utf8&parseTime=True&loc=Local"
cwgo server --service flow --module github.com/wegoteam/weflow/internal --type HTTP --idl ./idl/flow.thrift
cwgo server --service flow --module github.com/wegoteam/weflow/api --type RPC --idl ./idl/flow.thrift$ cwgo -h
NAME:
cwgo - All in one tools for CloudWeGo
USAGE:
cwgo [global options] command [command options] [arguments...]
COMMANDS:
init 交互式命令行
server 生成 RPC 或者 HTTP Server
client 生成 RPC 或者 HTTP Client
model 生成 DB Model
fallback 回退到 kitex 或者 hz 工具
GLOBAL OPTIONS:
--verbose 打开冗余日志模式
--version, -v 打印工具版本
数据库模型语法
USAGE:
cwgo model [command options] [arguments...]
OPTIONS:
--dsn value Specify the database source name. (https://gorm.io/docs/connecting_to_the_database.html)
--db_type value Specify database type. (mysql or sqlserver or sqlite or postgres) (default: mysql)
--out_dir value Specify output directory (default: biz/dao/query)
--out_file value Specify output filename (default: gen.go)
--tables value [ --tables value ] Specify databases tables
--unittest Specify generate unit test (default: false)
--only_model Specify only generate model code (default: false)
--model_pkg value Specify model package name
--nullable Specify generate with pointer when field is nullable (default: false)
--type_tag Specify generate field with gorm column type tag (default: false)
--index_tag Specify generate field with gorm index tag (default: false)
--help, -h show help (default: false)
解释:
--dsn 指定数据库 DSN
--db_type 指定数据库类型
--out_dir 指定输出文件夹,默认 biz/dao/query
--out_file 指定输出文件名,默认 gen.go
--tables 指定数据库表名称
--unittest 是否生成单测,默认不生成
--only_model 是否只生成 model 代码,默认关闭
--model_pkg 指定 model package 名
--nullable 当字段为 null 时,指定是否生成指针,默认关闭
--type_tag 是否给字段生成 gorm column type tag,默认不生成
--index_tag 是否给字段生成 gorm index tag,默认不生成
客户端、服务端语法
USAGE:
cwgo client [command options] [arguments...]
OPTIONS:
--service value Specify the service name.
--type value Specify the generate type. (RPC or HTTP) (default: "RPC")
--module value, --mod value Specify the Go module name to generate go.mod.
--idl value Specify the IDL file path. (.thrift or .proto)
--out_dir value, -o value Specify the output path. (default: biz/http)
--registry value Specify the registry, default is None
--proto_search_path value, -I value [ --proto_search_path value, -I value ] Add an IDL search path for includes. (Valid only if idl is protobuf)
--pass value [ --pass value ] pass param to hz or kitex
--help, -h show help (default: false)
解释:
--service 指定服务名称
--type 指定生成类型
--module 指定生成 module 名称
--idl 指定 IDL 文件路径
--out_dir 指定输出路径
--template 指定 layout 模板路径
--registry 指定服务注册组件
--proto_search_path 添加 IDL 搜索路径,只对 pb 生效
--pass value 传递给 hz 和 kitex 的参数