engine

package
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 19, 2024 License: MIT Imports: 16 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var DB *gorm.DB
View Source
var DBConnConfigurator = DataBaseConnConfigurator{MaxIdleConns: 10, MaxOpenConns: 100, ConnMaxLifetime: 3600, SlowThreshold: 1, LogLevel: 3, IgnoreRecordNotFoundError: true, Colorful: true}
View Source
var EventPool = make(map[string]method)

事件池,所有的事件都会在流程引擎启动的时候注册到这里

View Source
var IgnoreEventError bool

事件出错,则可能导致流程无法运行下去,在这里添加选项,是否忽略事件出错,让流程继续

View Source
var ProcCache = make(map[int]ProcNodes)

定义流程cache其结构为 map [ProcID]ProcNodes

View Source
var ScheduledTaskPool = make(map[string]*ScheduledTask)

计划任务池 任务计划池的作用是存储任务运行中的信息,方便排查问题

Functions

func CreateTask

func CreateTask(ProcessInstanceID int, NodeID string, PrevNodeID string, UserIDs []string) ([]int, error)

生成任务 返回生成的任务ID数组 思考,一个节点可能分配了N位用户,所以生成节点对应的Task的时候,也需要生成N条Task 一个节点的上级节点可能不是一个,节点驳回的时候,就需要知道往哪个节点驳回,所以需要记录上一个节点是谁

func DBConnect

func DBConnect() error

func DatabaseInitialize

func DatabaseInitialize() error

初始化数据库表

func EndNodeHandle

func EndNodeHandle(ProcessInstanceID int, Status int) error

结束节点处理 结束节点只做收尾工作,将数据库中此流程实例产生的数据归档 Status 流程实例状态 1:已完成 2:撤销

func ExecSQL

func ExecSQL(SQL string, Result interface{}, Params ...interface{}) (interface{}, error)

执行SQL语句,返回执行结果(可选) 示例: ExecSQL("CALL SP_GET(?)",&RESULT,Par1,Par2) ExecSQL("select * from test where id=? and c=?",&RESULT,1,"yes") ExecSQL("update test set c="no" where id=? and c=?",nil,1,"yes")

func ExpressionEvaluator

func ExpressionEvaluator(expression string) (bool, error)

这是一个偷懒取巧的办法:利用数据库计算网关中的条件表达式

func GateWayNodeHandle

func GateWayNodeHandle(ProcessInstanceID int, CurrentNode *Node, PrevTaskNode Node) error

GateWay节点处理

func GetInstanceInfo

func GetInstanceInfo(ProcessInstanceID int) (Instance, error)

获取流程实例信息

func GetInstanceNode

func GetInstanceNode(ProcessInstanceID int, NodeID string) (Node, error)

获取流程实例中某个Node 返回 Node

func GetInstanceStartByUser

func GetInstanceStartByUser(UserID string, ProcessName string, StartIndex int, MaxRows int) ([]Instance, error)

获取起始人为特定用户的流程实例。参数说明: UserID:用户ID 传入空则获取所有用户的流程实例 ProcessName:指定流程名称,传入""则为全部 StartIndex:分页用,开始index MaxRows:分页用,最大返回行数

func GetInstanceTaskHistory

func GetInstanceTaskHistory(ProcessInstanceID int) ([]Task, error)

获取流程实例下任务历史记录

func GetProcessDefine

func GetProcessDefine(ProcessID int) (Process, error)

获取流程定义 by 流程ID

func GetProcessIDByInstanceID

func GetProcessIDByInstanceID(ProcessInstanceID int) (int, error)

获取流程ID by 流程实例ID

func GetProcessIDByProcessName

func GetProcessIDByProcessName(db *gorm.DB, ProcessName string, Source string) (int, int, error)

获取流程ID、Version by 流程名、来源 设置传入参数db,是因为此函数可能在事务中执行。当在事务中执行时,需要传入对应的*gorm.DB 若db传参为nil,则默认使用当前默认的*gorm.DB

func GetProcessList

func GetProcessList(Source string) ([]database.ProcDef, error)

获得某个source下所有流程信息

func GetProcessNameByInstanceID

func GetProcessNameByInstanceID(ProcessInstanceID int) (string, error)

获取流程名称 by 流程实例ID

func GetScheduledTaskList

func GetScheduledTaskList() map[string]*ScheduledTask

获取任务信息

func GetTaskFinishedList

func GetTaskFinishedList(UserID string, ProcessName string, IgnoreStartByMe bool, SortByASC bool, StartIndex int, MaxRows int) ([]Task, error)

获取特定用户已完成任务列表。参数说明: UserID:用户ID 传入空则获取所有用户的已完成任务 /*注意,当传入UserID为空时,IgnoreStartByMe参数强制为False ProcessName:指定流程名称,传入""则为全部 IgnoreStartByMe: 某些情况下只希望看到“别人提交由我审批完成的任务",而不希望看到"由我开启流程,而生成处理人是我自己的任务",则传True taps:"由我启动的流程"可使用GetInstanceStartByUser函数 SortByASC 返回数据是否按照任务完成时间升序排列。若传入false,则会按照降序排列 StartIndex:分页用,开始index MaxRows:分页用,最大返回行数

func GetTaskInfo

func GetTaskInfo(TaskID int) (Task, error)

获取任务信息

func GetTaskToDoList

func GetTaskToDoList(UserID string, ProcessName string, SortByASC bool, StartIndex int, MaxRows int) ([]Task, error)

获取特定用户待办任务列表。参数说明: UserID:用户ID 传入空则获取所有用户的待办任务 ProcessName:指定流程名称,传入""则为全部 SortByASC 返回数据是否按照任务生成时间升序排列(实际是按照TaskID排序。TaskID是int型自增字段,用其排序与用createtime效果一致)。若传入false,则会按照降序排列 StartIndex:分页用,开始index MaxRows:分页用,最大返回行数

func InstanceNodeIsFinish

func InstanceNodeIsFinish(ProcessInstanceID int, NodeID string) (bool, error)

判断特定实例中某一个节点是否已经完成 注意,finish只是代表节点是不是已经处理,不管处理的方式是驳回还是通过 一个流程实例中,由于驳回等原因,x节点可能出现多次。这里使用统计所有x节点的任务是否都finish来判断x节点是否finish

func InstanceRevoke

func InstanceRevoke(ProcessInstanceID int, Force bool, RevokeUserID string) error

撤销流程实例 参数说明: 1、InstanceID 实例ID 2、Force 是否强制撤销,若为false,则只有流程回到发起人这里才能撤销 3、撤销发起人用户ID

func InstanceStart

func InstanceStart(ProcessID int, BusinessID string, Comment string, VariablesJson string) (int, error)

开始流程实例 返回流程实例ID

func InstanceVariablesSave

func InstanceVariablesSave(ProcessInstanceID int, VariablesJson string) error

流程实例变量存入数据库

func IsVariable

func IsVariable(Key string) bool

判断传入字符串是否是变量(是否以$开头)

func JSONMarshal

func JSONMarshal(t interface{}, escapeHtml bool) ([]byte, error)

json.Marshal()函数默认用HTMLEscape进行编码,它将替换“<”、“>”、“&”、U+2028和U+2029, 并将其转义为“\u003c”、“\u003e”、“\u0026”、“\ u2028”和“\u2029” 所以在这里做处理,判断是否开启转义

func Json2Struct

func Json2Struct(j string, s any) error

将json字符串转为struct

func MakeUnique

func MakeUnique(List ...[]string) []string

利用Map,对数组/切片数据做去重处理

func ProcessNode

func ProcessNode(ProcessInstanceID int, CurrentNode *Node, PrevNode Node) error

处理节点,如:生成task、进行条件判断、处理结束节点等

func ProcessParse

func ProcessParse(Resource string) (Process, error)

流程定义解析(json->struct)

func ProcessSave

func ProcessSave(Resource string, CreateUserID string) (int, error)

流程定义保存,返回 流程ID、error

func RegisterEvents

func RegisterEvents(Struct any)

注册一个struct中的所有func 注意,此时不会验证事件方法参数是否正确,因为此时不知道事件到底是“节点事件”还是“流程事件”

func RemoveFromSlice

func RemoveFromSlice[T any](Slice []T, RemoveItemIndex int) []T

从切片中删除对应Index的项

func RemovePrefix

func RemovePrefix(variable string) string

去掉变量前缀"$"

func ResolveVariables

func ResolveVariables(ProcessInstanceID int, Variables []string) (map[string]string, error)

解析变量,获取并设置其value,返回map(注意,如果不是变量,则原样存储在map中)

func RunNodeEvents

func RunNodeEvents(EventNames []string, ID int, CurrentNode *Node, PrevNode Node) error

运行节点事件(1、节点开始 2、节点结束 3、任务结束)

func RunProcEvents

func RunProcEvents(EventNames []string, ProcessInstanceID int, RevokeUserID string) error

//运行流程事件(目前只有撤销事件)

func ScheduleTask

func ScheduleTask(TaskName string, StartAt time.Time, StopAt time.Time, IntervalSecond int64, Func func() error) error

登记计划任务,任务会被添加进计划任务池,并进入运行状态,可使用GetScheduledTaskList查看任务运行信息 **注意**:请使用go关键词运行此函数。因为任务运行周期可能很长,若不使用goroutine运行,则可能造成主进程堵塞 参数说明: StartAt 任务开始时间 StopAt 任务结束时间 IntervalSecond 重复执行间隔(秒),最小1秒 Func 需要执行的方法,签名必须是func() error

func SetVariable

func SetVariable(ProcessInstanceID int, variable string) (string, bool, error)

从proc_inst_variable表中查找变量,若有则返回变量值,若无则返回false

func StartWorkFlow

func StartWorkFlow(DBConnConfigurator DataBaseConfigurator, ignoreEventError bool, EventStructs ...any)

传入参数 1、DBConnConfigurator:数据库连接配置方法,方法签名func() 2、ignoreEventError:是否忽略事件错误 3、EventStructs:动态参数,事件函数所关联的struct,可传多个

func TaskFreeRejectToUpstreamNode

func TaskFreeRejectToUpstreamNode(TaskID int, NodeID string, Comment string, VariableJson string) error

自由驳回到任意一个上游节点

func TaskNextNode

func TaskNextNode(TaskID int) (Node, error)

获取任务执行完毕后下一个节点

func TaskNodeHandle

func TaskNodeHandle(ProcessInstanceID int, CurrentNode *Node, PrevNode Node) ([]int, error)

任务节点处理 返回生成的taskid数组

func TaskNodeStatus

func TaskNodeStatus(TaskID int) (int, int, int, error)

任务节点审批状态 返回节点总任务数量、通过数、驳回数、

func TaskPass

func TaskPass(TaskID int, Comment string, VariableJson string, DirectlyToWhoRejectedMe bool) error

完成任务,在本节点处理完毕的情况下会自动处理下一个节点

func TaskReject

func TaskReject(TaskID int, Comment string, VariableJson string) error

驳回任务,在本节点处理完毕的情况下会自动处理下一个节点

func TaskTransfer

func TaskTransfer(TaskID int, Users []string) error

将任务转交给其他用户处理 此功能由常继百同学提出,在此感谢他的建议

func TaskUpstreamNodeList

func TaskUpstreamNodeList(TaskID int) ([]Node, error)

根据流程定义,列出task所在节点的所有上流节点

func TypeIsError

func TypeIsError(Type reflect.Type) bool

func VerifyEvents

func VerifyEvents(ProcessID int, Nodes ProcNodes) error

检查流程: 1、是否注册 2、参数是否正确

func WhatCanIDo

func WhatCanIDo(TaskID int) (TaskAction, error)

此方法方便前端判断,某一个任务可以执行哪些操作 目前为止,除了传统的通过驳回,本项目还增加了"自由驳回"与"直接提交到上一个驳回我的节点" 而"直接提交到上一个驳回我的节点": 1、在会签节点无法使用 2、在此任务的上一节点并未做驳回时也无法使用 对于前端而言,实现无法提前知道这些信息。 难道让用户一个一个点按钮试错?此方法目的是解决这个困扰

Types

type DataBaseConfigurator

type DataBaseConfigurator func()

type DataBaseConnConfigurator

type DataBaseConnConfigurator struct {
	DBConnectString           string //连接字符串
	MaxIdleConns              int    //空闲连接池中连接的最大数量
	MaxOpenConns              int    //打开数据库连接的最大数量
	ConnMaxLifetime           int    //连接可复用的最大时间(分钟)
	SlowThreshold             int64  //慢SQL阈值(秒)
	LogLevel                  int    //日志级别 1:Silent  2:Error 3:Warn 4:Info
	IgnoreRecordNotFoundError bool   //忽略ErrRecordNotFound(记录未找到)错误
	Colorful                  bool   //使用彩色打印
}

type ProcNodes

type ProcNodes map[string]Node

map [NodeID]Node

func GetProcCache

func GetProcCache(ProcessID int) (ProcNodes, error)

从缓存中获取流程节点定义

type ScheduledTask

type ScheduledTask struct {
	StartAt        time.Time     //任务开始时间
	StopAt         time.Time     //任务结束时间
	IntervalSecond int64         //重复执行间隔(秒),最小1秒
	Func           func() error  //需要运行的任务方法
	LastRunTime    time.Time     //上一次运行时间
	LastResult     string        //上一次运行结果
	LastDuration   time.Duration //上一次运行时长
}

被计划的任务

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL