跳至内容

工作流模型设计

动态工作流表模型设计

package workflow

import (
	"gorm.io/gorm"
	"time"
)

// 自定义表名
const (
	FlowTableName                = "workflow_base"                  // 工作流主表
	FlowNodeTableName            = "workflow_flow_node"             // 工作流节点表
	FlowTransitionTableName      = "workflow_flow_transition"       // 工作流流转信息表
	TicketRecordTableName        = "workflow_ticket_record"         // 工单信息表
	TicketTransitionLogTableName = "workflow_ticket_transition_log" // 工单流转日志表
	TicketCCListTableName        = "workflow_ticket_cc_users"
)

// FlowStatus 审批状态枚举
type FlowStatus string

const (
	FlowStatusInit     FlowStatus = "init"
	FlowStatusReview   FlowStatus = "review"
	FlowStatusAgree    FlowStatus = "agree"
	FlowStatusRefuse   FlowStatus = "refuse"
	FlowStatusRollback FlowStatus = "rollback"
	FlowStatusCancel   FlowStatus = "cancel"
)

// TaskStatus 任务状态枚举
type TaskStatus string

const (
	TaskStatusInit    TaskStatus = "init"
	TaskStatusDoing   TaskStatus = "doing"
	TaskStatusSuccess TaskStatus = "success"
	TaskStatusError   TaskStatus = "error"
)

// BaseModel 公共嵌入结构体,包含通用字段
type BaseModel struct {
	ID          uint           `gorm:"column:id;primaryKey;autoIncrement:true;comment:主键" json:"id"`                                          // 软删除标记
	CreatedAt   time.Time      `gorm:"column:created_at;not null;autoCreateTime;default:CURRENT_TIMESTAMP(3);comment:创建时间" json:"created_at"` // 创建时间
	UpdatedAt   time.Time      `gorm:"column:updated_at;not null;autoUpdateTime;default:CURRENT_TIMESTAMP(3);comment:更新时间" json:"updated_at"` // 更新时间
	DeletedAt   gorm.DeletedAt `gorm:"column:deleted_at;index;comment:软删除时间" json:"deleted_at"`                                               // 软删除时间
	Description string         `gorm:"type:varchar(256); column:description;comment: 备注信息" json:"description"`                                //  备注信息

}

模型字段详细说明

1. 工作流主表

package workflow

import (
	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
	"gorm.io/datatypes"
)

// WorkFlow 工作流主表
type WorkFlow struct {
	BaseModel
	Name             string         `gorm:"type:varchar(64);not null;uniqueIndex:idx_workflow_name;comment:工作流名称" json:"name" form:"name" query:"name"` // 流程名称
	ListDisplayField datatypes.JSON `gorm:"type:json;comment:需要返回的数据库字段" json:"list_display_field" form:"list_display_field"`                           // 列表显示字段配置
	LarkDisplayField datatypes.JSON `gorm:"type:json;comment:飞书三方审批返回字段" json:"lark_display_field" form:"lark_display_field"`                           // 飞书显示字段配置
	UserID           uint           `gorm:"type:int;comment:创建人" json:"user_id" form:"user_id" query:"user_id"`                                         // 创建人ID
	Tags             string         `gorm:"type:varchar(64);uniqueIndex:idx_workflow_tags;comment:标签" json:"tags" form:"tags" query:"tags"`             // 唯一标签标识

	// 关联关系
	FlowNodes       []FlowNode       `gorm:"foreignKey:WorkFlowID;references:ID" json:"flow_nodes"`
	FlowTransitions []FlowTransition `gorm:"foreignKey:WorkFlowID;references:ID" json:"flow_transitions"`
	CreatUser       system.SysUser   `gorm:"foreignKey:UserID;references:ID" json:"creat_user"`
}

func (*WorkFlow) TableName() string {
	return FlowTableName
}
CREATE TABLE `gva`.`workflow_base`  (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
  `updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '更新时间',
  `deleted_at` datetime(3) NULL DEFAULT NULL COMMENT '软删除时间',
  `description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT ' 备注信息',
  `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '工作流名称',
  `list_display_field` json NULL COMMENT '需要返回的数据库字段',
  `lark_display_field` json NULL COMMENT '飞书三方审批返回字段',
  `user_id` bigint(20) UNSIGNED NULL DEFAULT NULL COMMENT '创建人',
  `tags` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '标签',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `idx_workflow_name`(`name` ASC) USING BTREE,
  UNIQUE INDEX `idx_workflow_tags`(`tags` ASC) USING BTREE,
  INDEX `idx_workflow_base_deleted_at`(`deleted_at` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
字段名类型含义备注
IDuint主键自增
Namestring工作流名称唯一索引
ListDisplayFieldjson列表显示字段配置页面展示用
LarkDisplayFieldjson飞书显示字段配置飞书集成用
UserIDuint创建人ID关联用户表
Tagsstring唯一标签唯一索引
CreatedAtdatetime创建时间
UpdatedAtdatetime更新时间
DeletedAtdatetime软删除时间

2. 审批节点表

package workflow

import (
	"gorm.io/datatypes"
)

// FlowNode 审批节点表
type FlowNode struct {
	BaseModel
	Name              string         `gorm:"type:varchar(64);not null;comment:节点名称" json:"name" form:"name" query:"name"`
	WorkFlowID        uint           `gorm:"type:int;index;comment:工作流ID" json:"work_flow_id" form:"work_flow_id" query:"work_flow_id"` // 外键字段关联WorkFlow审批流程表
	OrderID           int            `gorm:"type:int;comment:状态顺序" json:"order_id" form:"order_id"`                                     // 节点顺序
	TypeID            int            `gorm:"type:int;default:0;comment:状态类型ID" json:"type_id" form:"type_id"`                           // 1.普通类型 2.初始状态 3.结束状态
	ParticipantTypeID int            `gorm:"type:int;default:1;comment:参与者类型ID" json:"participant_type_id" form:"participant_type_id"`  // 1.无处理人  2.个人/多人  3.自定义  4.条件表达式
	Participant       datatypes.JSON `gorm:"type:json;comment:参与者" json:"participant" form:"participant"`                               // 参与者配置
	StateFieldStr     datatypes.JSON `gorm:"type:json;not null;comment:表单字段" json:"state_field_str" form:"state_field_str"`             // 字段权限配置

	// 关联关系
	WorkFlow          WorkFlow         `gorm:"foreignKey:WorkFlowID;references:ID" json:"work_flow"`
	SourceTransitions []FlowTransition `gorm:"foreignKey:SourceNodeID;references:ID" json:"source_transitions"`
	TargetTransitions []FlowTransition `gorm:"foreignKey:DestinationNodeID;references:ID" json:"target_transitions"`
}

func (*FlowNode) TableName() string {
	return FlowNodeTableName
}
CREATE TABLE `gva`.`workflow_flow_node`  (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
  `updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '更新时间',
  `deleted_at` datetime(3) NULL DEFAULT NULL COMMENT '软删除时间',
  `description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT ' 备注信息',
  `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '节点名称',
  `work_flow_id` bigint(20) UNSIGNED NULL DEFAULT NULL COMMENT '工作流ID',
  `order_id` bigint(20) NULL DEFAULT NULL COMMENT '状态顺序',
  `type_id` bigint(20) NULL DEFAULT 0 COMMENT '状态类型ID',
  `participant_type_id` bigint(20) NULL DEFAULT 1 COMMENT '参与者类型ID',
  `participant` json NULL COMMENT '参与者',
  `state_field_str` json NOT NULL COMMENT '表单字段',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `idx_workflow_flow_node_deleted_at`(`deleted_at` ASC) USING BTREE,
  INDEX `idx_workflow_flow_node_work_flow_id`(`work_flow_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
字段名类型含义备注
IDuint主键自增
Namestring节点名称
WorkFlowIDuint所属工作流ID外键
OrderIDint节点顺序排序用
TypeIDint节点类型1:普通 2:初始 3:结束
ParticipantTypeIDint参与者类型1:无处理人 2:个人/多人
Participantjson参与者配置JSON格式
StateFieldStrjson表单字段权限配置控制字段读写
CreatedAtdatetime创建时间

3. 流程流转表

package workflow

import (
	"gorm.io/datatypes"
)

// FlowTransition 流程流转表
type FlowTransition struct {
	BaseModel
	Name                string         `gorm:"type:varchar(32);not null;comment:操作名称" json:"name" form:"name" query:"name"`
	WorkFlowID          uint           `gorm:"type:int;index;comment:工作流ID" json:"work_flow_id" form:"work_flow_id" query:"work_flow_id"`      // 工作流ID 外键字段关联WorkFlow表
	SourceNodeID        uint           `gorm:"type:int;index;comment:源节点ID" json:"source_node_id" form:"source_node_id"`                       // 源状态节点 外键字段关联FlowNode表
	DestinationNodeID   uint           `gorm:"type:int;index;comment:目标节点ID" json:"destination_node_id" form:"destination_node_id"`            // 目标状态节点 外键字段关联FlowNode表
	ConditionExpression datatypes.JSON `gorm:"type:json;comment:流转条件表达式" json:"condition_expression" form:"condition_expression"`              // 流转条件表达式 格式为[{"expression":"{days} > 3 and {days}<10", "target_state_id":11}]
	AttributeTypeID     int            `gorm:"type:int;default:1;comment:操作类型" json:"attribute_type_id" form:"attribute_type_id"`              // 操作类型 1.同意,2.拒绝,3.退回
	FieldRequireCheck   bool           `gorm:"type:boolean;default:true;comment:是否验证必填" json:"field_require_check" form:"field_require_check"` // 是否验证必填
	TaskRigger          string         `gorm:"type:varchar(256);comment:任务触发器" json:"task_rigger" form:"task_rigger"`                          // 任务触发器

	// 关联关系
	WorkFlow        WorkFlow `gorm:"foreignKey:WorkFlowID;references:ID" json:"work_flow"`
	SourceNode      FlowNode `gorm:"foreignKey:SourceNodeID;references:ID" json:"source_node"`
	DestinationNode FlowNode `gorm:"foreignKey:DestinationNodeID;references:ID" json:"destination_node"`
}

func (*FlowTransition) TableName() string {
	return FlowTransitionTableName
}
CREATE TABLE `gva`.`workflow_flow_transition`  (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
  `updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '更新时间',
  `deleted_at` datetime(3) NULL DEFAULT NULL COMMENT '软删除时间',
  `description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT ' 备注信息',
  `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '操作名称',
  `work_flow_id` bigint(20) UNSIGNED NULL DEFAULT NULL COMMENT '工作流ID',
  `source_node_id` bigint(20) UNSIGNED NULL DEFAULT NULL COMMENT '源节点ID',
  `destination_node_id` bigint(20) UNSIGNED NULL DEFAULT NULL COMMENT '目标节点ID',
  `condition_expression` json NULL COMMENT '流转条件表达式',
  `attribute_type_id` bigint(20) NULL DEFAULT 1 COMMENT '操作类型',
  `field_require_check` tinyint(1) NULL DEFAULT 1 COMMENT '是否验证必填',
  `task_rigger` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '任务触发器',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `idx_workflow_flow_transition_deleted_at`(`deleted_at` ASC) USING BTREE,
  INDEX `idx_workflow_flow_transition_work_flow_id`(`work_flow_id` ASC) USING BTREE,
  INDEX `idx_workflow_flow_transition_source_node_id`(`source_node_id` ASC) USING BTREE,
  INDEX `idx_workflow_flow_transition_destination_node_id`(`destination_node_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
字段名类型含义备注
IDuint主键自增
Namestring操作名称如"同意"、“拒绝”
WorkFlowIDuint工作流ID外键
SourceNodeIDuint源节点ID外键
DestinationNodeIDuint目标节点ID外键
ConditionExpressionjson流转条件表达式动态路由逻辑
AttributeTypeIDint操作类型1:同意 2:拒绝 3:退回
FieldRequireCheckbool是否验证必填默认true
TaskRiggerstring任务触发器触发任务逻辑
CreatedAtdatetime创建时间

4. 工单实例表

// TicketRecord 工单实例表
type TicketRecord struct {
	BaseModel
	Title        string         `gorm:"type:varchar(500);not null;comment:工单的标题" json:"title" form:"title" query:"title"`                           // 标题
	WorkFlowID   uint           `gorm:"type:int;index;comment:工作流ID" json:"work_flow_id" form:"work_flow_id" query:"work_flow_id"`                  // 外键字段关联WorkFlow审批流程表
	WorkflowType string         `gorm:"type:varchar(256);default:'';comment:工作流类型" json:"workflow_type" form:"workflow_type" query:"workflow_type"` // 工作流类型
	FlowNodeID   uint           `gorm:"type:int;index;comment:当前所在审批节点" json:"flow_node_id" form:"flow_node_id" query:"flow_node_id"`               // 外键字段关联FlowNode审批节点表
	Participant  datatypes.JSON `gorm:"type:json;comment:参与者" json:"participant" form:"participant"`                                                // 可以为空(无处理人的情况,如结束状态),包含多个节点信息
	FlowStatus   FlowStatus     `gorm:"type:varchar(32);default:'init';comment:审批状态" json:"flow_status" form:"flow_status" query:"flow_status"`     // 审批状态
	TaskStatus   TaskStatus     `gorm:"type:varchar(10);default:'init';comment:任务执行状态" json:"task_status" form:"task_status" query:"task_status"`   // 任务状态
	ExtendedData datatypes.JSON `gorm:"type:json;comment:扩展数据" json:"extended_data" form:"extended_data"`                                           // 扩展数据
	DisplayField datatypes.JSON `gorm:"type:json;comment:返回字段" json:"display_field" form:"display_field"`                                           // 返回字段
	UserID       uint           `gorm:"type:int;comment:创建人" json:"user_id" form:"user_id" query:"user_id"`                                         // 创建人ID

	// 关联关系
	WorkFlow       WorkFlow              `gorm:"foreignKey:WorkFlowID;references:ID" json:"work_flow"`
	CurrentNode    FlowNode              `gorm:"foreignKey:FlowNodeID;references:ID" json:"current_node"`
	CreatUser      system.SysUser        `gorm:"foreignKey:UserID;references:ID" json:"creat_user"`
	TransitionLogs []TicketTransitionLog `gorm:"foreignKey:TicketID;references:ID" json:"transition_logs"`
	CCUsers        []system.SysUser      `gorm:"many2many:workflow_ticket_cc_users;" json:"cc_users"`
}

func (*TicketRecord) TableName() string {
	return TicketRecordTableName
}
CREATE TABLE `gva`.`workflow_ticket_record`  (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
  `updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '更新时间',
  `deleted_at` datetime(3) NULL DEFAULT NULL COMMENT '软删除时间',
  `description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT ' 备注信息',
  `title` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '工单的标题',
  `work_flow_id` bigint(20) UNSIGNED NULL DEFAULT NULL COMMENT '工作流ID',
  `workflow_type` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '工作流类型',
  `flow_node_id` bigint(20) UNSIGNED NULL DEFAULT NULL COMMENT '当前所在审批节点',
  `participant` json NULL COMMENT '参与者',
  `flow_status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'init' COMMENT '审批状态',
  `task_status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'init' COMMENT '任务执行状态',
  `extended_data` json NULL COMMENT '扩展数据',
  `display_field` json NULL COMMENT '返回字段',
  `user_id` bigint(20) UNSIGNED NULL DEFAULT NULL COMMENT '创建人',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `idx_workflow_ticket_record_work_flow_id`(`work_flow_id` ASC) USING BTREE,
  INDEX `idx_workflow_ticket_record_flow_node_id`(`flow_node_id` ASC) USING BTREE,
  INDEX `idx_workflow_ticket_record_deleted_at`(`deleted_at` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
字段名类型含义备注
IDuint主键自增
Titlestring工单标题
WorkFlowIDuint工作流ID外键
FlowNodeIDuint当前节点ID外键
Participantjson参与者信息当前处理人
FlowStatusenum审批状态init/review/agree等
TaskStatusenum任务状态init/doing/success等
ExtendedDatajson扩展数据表单数据存储
DisplayFieldjson返回字段展示用字段列表
UserIDuint创建人ID外键
CreatedAtdatetime创建时间

5. 工单抄送人中间表 (TICKET_CC_USER)

// TicketCCUser 工单抄送人中间表
type TicketCCUser struct {
	TicketID  uint      `gorm:"primaryKey;autoIncrement:false;comment:工单ID" json:"ticket_id" form:"ticket_id"`
	UserID    uint      `gorm:"primaryKey;autoIncrement:false;comment:用户ID" json:"user_id" form:"user_id"`
	CreatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP(3);comment:添加时间" json:"created_at"`
	// 添加唯一约束
	UniqueConstraint string `gorm:"uniqueIndex:idx_ticket_user;type:varchar(64);default:''"`
}

func (*TicketCCUser) TableName() string {
	return TicketCCListTableName
}
CREATE TABLE `gva`.`workflow_ticket_cc_users`  (
  `ticket_id` bigint(20) UNSIGNED NOT NULL COMMENT '工单ID',
  `user_id` bigint(20) UNSIGNED NOT NULL COMMENT '用户ID',
  `created_at` datetime(3) NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '添加时间',
  `unique_constraint` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '',
  PRIMARY KEY (`ticket_id`, `user_id`) USING BTREE,
  UNIQUE INDEX `idx_ticket_user`(`unique_constraint` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
字段名类型含义备注
TicketIDuint工单ID联合主键
UserIDuint抄送人ID联合主键
CreatedAtdatetime添加时间

6. 工单流转日志表


// TicketTransitionLog 工单流转日志
type TicketTransitionLog struct {
	BaseModel
	TicketID                  uint   `gorm:"type:int;index;comment:工单ID" json:"ticket_id" form:"ticket_id" query:"ticket_id"`               // 工单ID
	FlowTransitionID          uint   `gorm:"type:int;index;comment:流转ID" json:"flow_transition_id" form:"flow_transition_id"`               // 流转ID
	Participant               string `gorm:"type:varchar(128);comment:处理人" json:"participant" form:"participant"`                           // 处理人
	ParticipantID             uint   `gorm:"type:int;comment:处理人ID" json:"participant_id" form:"participant_id"`                            // 处理人ID
	InterveneTypeID           int    `gorm:"type:int;comment:干预类型" json:"intervene_type_id" form:"intervene_type_id"`                       // 1.非干预 2.强制取消
	FlowNodeID                uint   `gorm:"type:int;index;comment:当前所在审批节点" json:"flow_node_id" form:"flow_node_id" query:"flow_node_id"`  // 外键字段关联FlowNode审批节点表
	FlowNodeName              string `gorm:"type:varchar(64);comment:节点名称" json:"flow_node_name" form:"flow_node_name"`                     // 节点名称
	TransitionAttributeTypeID int    `gorm:"type:int;comment:流转属性" json:"transition_attribute_type_id" form:"transition_attribute_type_id"` // 流转属性 1.同意,2.拒绝,3.退回
	FlowTransitionName        string `gorm:"type:varchar(64);comment:流转名称" json:"flow_transition_name" form:"flow_transition_name"`         // 流转名称
	FlowTransitionRecord      string `gorm:"type:varchar(1024);comment:流转记录" json:"flow_transition_record" form:"flow_transition_record"`   // 流转记录
	FlowNodeTypeID            int    `gorm:"type:int;comment:状态类型ID" json:"flow_node_type_id" form:"flow_node_type_id"`                     // 状态类型ID 1.普通类型 2.初始状态 3.结束状态

	// 关联关系
	Ticket     TicketRecord   `gorm:"foreignKey:TicketID;references:ID" json:"ticket"`
	Transition FlowTransition `gorm:"foreignKey:FlowTransitionID;references:ID" json:"transition"`
	TargetNode FlowNode       `gorm:"foreignKey:FlowNodeID;references:ID" json:"target_node"`
}

func (*TicketTransitionLog) TableName() string {
	return TicketTransitionLogTableName
}
CREATE TABLE `gva`.`workflow_ticket_transition_log`  (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
  `updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '更新时间',
  `deleted_at` datetime(3) NULL DEFAULT NULL COMMENT '软删除时间',
  `description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT ' 备注信息',
  `ticket_id` bigint(20) UNSIGNED NULL DEFAULT NULL COMMENT '工单ID',
  `flow_transition_id` bigint(20) UNSIGNED NULL DEFAULT NULL COMMENT '流转ID',
  `participant` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '处理人',
  `participant_id` bigint(20) NULL DEFAULT NULL COMMENT '处理人ID',
  `intervene_type_id` bigint(20) NULL DEFAULT NULL COMMENT '干预类型',
  `flow_node_id` bigint(20) UNSIGNED NULL DEFAULT NULL COMMENT '当前所在审批节点',
  `flow_node_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '节点名称',
  `transition_attribute_type_id` bigint(20) NULL DEFAULT NULL COMMENT '流转属性',
  `flow_transition_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '流转名称',
  `flow_transition_record` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '流转记录',
  `flow_node_type_id` bigint(20) NULL DEFAULT NULL COMMENT '状态类型ID',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `idx_workflow_ticket_transition_log_flow_transition_id`(`flow_transition_id` ASC) USING BTREE,
  INDEX `idx_workflow_ticket_transition_log_flow_node_id`(`flow_node_id` ASC) USING BTREE,
  INDEX `idx_workflow_ticket_transition_log_deleted_at`(`deleted_at` ASC) USING BTREE,
  INDEX `idx_workflow_ticket_transition_log_ticket_id`(`ticket_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
字段名类型含义备注
IDuint主键自增
TicketIDuint工单ID外键
FlowTransitionIDuint流转ID可为空
SourceNodeIDuint源节点ID外键
DestinationNodeIDuint目标节点ID外键
OperatorIDuint操作人ID外键
InterveneTypeIDint干预类型1:非干预 2:强制取消
AttributeTypeIDint流转属性同FlowTransition
FlowTransitionRecordstring流转记录操作详情
CreatedAtdatetime创建时间

7. 用户表

// SysUser 用户信息表
type SysUser struct {
	ID                  uint           `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"`
	Username            string         `gorm:"column:username;not null;uniqueIndex:idx_username;size:64;comment:用户名" json:"username"`                 // 用户名
	NickName            string         `gorm:"column:nick_name;not null;size:64;comment:昵称" json:"nick_name"`                                         // 昵称
	Password            string         `gorm:"column:password;not null;size:256;comment:用户密码" json:"password"`                                        // 用户密码
	Avatar              string         `gorm:"default:'';size:256;comment:用户头像" json:"avatar" `                                                       // 用户头像
	Gender              string         `gorm:"column:gender;default:male;size:16;comment:性别" json:"gender"`                                           // 性别
	Mobile              string         `gorm:"column:mobile;not null;size:16;comment:手机号" json:"mobile"`                                              // 手机号
	Email               string         `gorm:"column:email;comment:邮箱" json:"email"`                                                                  // 邮箱
	FeishuID            string         `gorm:"column:feishu_id;size:16;comment:飞书ID" json:"feishu_id"`                                                // 飞书ID
	OpenID              string         `gorm:"column:open_id;size:64;comment:飞书OpenID" json:"open_id"`                                                // 飞书OpenID
	UnionId             string         `gorm:"column:union_id;size:64;comment:飞书UnionID" json:"union_id"`                                             // 飞书UnionID
	IsActive            bool           `gorm:"column:is_active;default:1;comment:是否启用" json:"is_active"`                                              // 是否启用
	IsSuperuser         bool           `gorm:"column:is_superuser;comment:是否是管理员用户" json:"is_superuser"`                                              // 是否是管理员用户
	LastLogin           time.Time      `gorm:"column:last_login;default:CURRENT_TIMESTAMP(3);comment:最后一次登录时间" json:"last_login"`                     // 最后一次登录时间
	FailedLoginAttempts int32          `gorm:"column:failed_login_attempts;not null;comment:登录失败次数" json:"failed_login_attempts"`                     // 登录失败次数
	AuthorityId         uint           `gorm:"default:0;comment:用户角色ID" json:"authorityId" `                                                          // 用户角色ID
	Authority           SysAuthority   `gorm:"foreignKey:AuthorityId;references:AuthorityId;comment:用户角色" json:"authority"`                           // 用户角色, references: 重写引用,使用SysAuthority.AuthorityId作为引用
	Authorities         []SysAuthority `gorm:"many2many:sys_user_authority;" json:"authorities"`                                                      // 多用户角色
	OriginSetting       common.JSONMap `gorm:"type:text;default:null;column:origin_setting;comment:配置;" json:"originSetting" form:"originSetting"`    //配置
	CreatedAt           time.Time      `gorm:"column:created_at;not null;autoCreateTime;default:CURRENT_TIMESTAMP(3);comment:创建时间" json:"created_at"` // 创建时间
	UpdatedAt           time.Time      `gorm:"column:updated_at;not null;autoUpdateTime;default:CURRENT_TIMESTAMP(3);comment:更新时间" json:"updated_at"` // 更新时间
	DeletedAt           gorm.DeletedAt `gorm:"column:deleted_at;index;comment:软删除时间" json:"deleted_at"`                                               // 软删除时间
	Description         string         `gorm:"column:description;comment: 备注信息" json:"description"`                                                   //  备注信息
	ExtendedData        string         `gorm:"column:extended_data;comment:扩展数据" json:"extended_data"`                                                // 扩展数据
}
CREATE TABLE `sys_users` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(64) NOT NULL COMMENT '用户名',
  `nick_name` varchar(64) NOT NULL COMMENT '昵称',
  `password` varchar(256) NOT NULL COMMENT '用户密码',
  `avatar` varchar(256) DEFAULT '' COMMENT '用户头像',
  `gender` varchar(16) DEFAULT 'male' COMMENT '性别',
  `mobile` varchar(16) NOT NULL COMMENT '手机号',
  `email` varchar(191) DEFAULT NULL COMMENT '邮箱',
  `feishu_id` varchar(16) DEFAULT NULL COMMENT '飞书ID',
  `open_id` varchar(64) DEFAULT NULL COMMENT '飞书OpenID',
  `union_id` varchar(64) DEFAULT NULL COMMENT '飞书UnionID',
  `is_active` tinyint(1) DEFAULT '1' COMMENT '是否启用',
  `is_superuser` tinyint(1) DEFAULT NULL COMMENT '是否是管理员用户',
  `last_login` datetime(3) DEFAULT CURRENT_TIMESTAMP(3) COMMENT '最后一次登录时间',
  `failed_login_attempts` int(11) NOT NULL COMMENT '登录失败次数',
  `authority_id` bigint(20) unsigned DEFAULT '0' COMMENT '用户角色ID',
  `origin_setting` text COMMENT '配置',
  `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
  `updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '更新时间',
  `deleted_at` datetime(3) DEFAULT NULL COMMENT '软删除时间',
  `description` varchar(191) DEFAULT NULL COMMENT ' 备注信息',
  `extended_data` varchar(191) DEFAULT NULL COMMENT '扩展数据',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_username` (`username`),
  KEY `idx_sys_users_deleted_at` (`deleted_at`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
字段名类型含义备注
IDuint用户ID主键
Usernamestring用户名唯一
Passwordstring密码加密存储
NickNamestring昵称
AuthorityIduint角色ID
CreatedAtdatetime创建时间

模型关联关系

    erDiagram
    WORKFLOW ||--o{ FLOW_NODE : "1:N"
    WORKFLOW ||--o{ FLOW_TRANSITION : "1:N"
    FLOW_NODE ||--o{ FLOW_TRANSITION : "作为源节点"
    FLOW_NODE ||--o{ FLOW_TRANSITION : "作为目标节点"
    TICKET_RECORD ||--o{ TICKET_TRANSITION_LOG : "1:N"
    TICKET_RECORD ||--o{ TICKET_CC_USER : "1:N"
    
    WORKFLOW {
        uint ID PK "主键"
        string Name "工作流名称"
        json ListDisplayField "列表显示字段配置"
        json LarkDisplayField "飞书显示字段配置"
        uint UserID FK "创建人ID"
        string Tags "唯一标签"
        datetime CreatedAt "创建时间"
        datetime UpdatedAt "更新时间"
        datetime DeletedAt "软删除时间"
    }
    
    FLOW_NODE {
        uint ID PK "主键"
        string Name "节点名称"
        uint WorkFlowID FK "所属工作流ID"
        int OrderID "节点顺序"
        int TypeID "节点类型(1普通 2初始 3结束)"
        int ParticipantTypeID "参与者类型(1无 2个人 3自定)"
        json Participant "参与者配置"
        json StateFieldStr "表单字段权限配置"
        datetime CreatedAt "创建时间"
    }
    
    FLOW_TRANSITION {
        uint ID PK "主键"
        string Name "操作名称"
        uint WorkFlowID FK "工作流ID"
        uint SourceNodeID FK "源节点ID"
        uint DestinationNodeID FK "目标节点ID"
        json ConditionExpression "流转条件表达式"
        int AttributeTypeID "操作类型(1同意 2拒绝)"
        bool FieldRequireCheck "是否验证必填"
        string TaskRigger "任务触发器"
    }
    
    TICKET_RECORD {
        uint ID PK "主键"
        string Title "工单标题"
        uint WorkFlowID FK "工作流ID"
        uint FlowNodeID FK "当前节点ID"
        json Participant "参与者信息"
        enum FlowStatus "审批状态(init,review等)"
        enum TaskStatus "任务状态(init,doing等)"
        json ExtendedData "扩展数据"
        json DisplayField "返回字段"
        uint UserID FK "创建人ID"
        datetime CreatedAt "创建时间"
    }
    
    TICKET_CC_USER {
        uint TicketID PK "工单ID"
        uint UserID PK "抄送人ID"
        datetime CreatedAt "添加时间"
    }
    
    TICKET_TRANSITION_LOG {
        uint ID PK "主键"
        uint TicketID FK "工单ID"
        uint FlowTransitionID FK "流转ID"
        uint SourceNodeID FK "源节点ID"
        uint DestinationNodeID FK "目标节点ID"
        uint OperatorID FK "操作人ID"
        int InterveneTypeID "干预类型"
        int AttributeTypeID "流转属性"
        string FlowTransitionRecord "流转记录"
        datetime CreatedAt "创建时间"
    }
    
    SYS_USER {
        uint ID PK "用户ID"
        string Username "用户名"
        string Password "密码"
        string NickName "昵称"
        uint AuthorityId "角色ID"
        datetime CreatedAt "创建时间"
    }
    
    WORKFLOW }o--|| SYS_USER : "创建人"
    TICKET_RECORD }o--|| SYS_USER : "创建人"
    TICKET_RECORD }o--|| WORKFLOW : "所属工作流"
    TICKET_RECORD }o--|| FLOW_NODE : "当前节点"
    TICKET_TRANSITION_LOG }o--|| SYS_USER : "操作人"
    TICKET_TRANSITION_LOG }o--|| FLOW_TRANSITION : "流转信息"
    TICKET_TRANSITION_LOG }o--|| FLOW_NODE : "源节点"
    TICKET_TRANSITION_LOG }o--|| FLOW_NODE : "目标节点"
    TICKET_CC_USER }o--|| SYS_USER : "抄送人"
  

关键关联关系说明

1. 工作流定义层关联

    graph LR
A[WORKFLOW] --> B(FLOW_NODE)
A --> C(FLOW_TRANSITION)
B --> C
C --> B
  
  • 工作流 → 节点:1:N 关系
  • 工作流 → 流转:1:N 关系
  • 节点 ↔ 流转:双向关联(源节点和目标节点)

2. 工单处理层关联

    graph TD
D[TICKET_RECORD] --> E(TICKET_TRANSITION_LOG)
D --> G(TICKET_CC_USER)
E --> H[FLOW_NODE]
E --> I[FLOW_TRANSITION]
G --> J[SYS_USER]
  
  • 工单 → 日志:1:N 时间序列记录
  • 工单 → 处理人:1:N 关系
  • 工单 → 抄送人:1:N 关系
  • 日志 → 节点/流转:记录流转上下文

3. 用户关联

    graph LR
K[SYS_USER] --> L(WORKFLOW)
K --> M(TICKET_RECORD)
K --> N(TICKET_TRANSITION_LOG)
K --> P(TICKET_CC_USER)
  

用户作为创建人、处理人、操作人等角色参与全生命周期

最后更新于