外观
流程用户组与流程评论是工作流(BPM)中两个相对独立但都很常用的能力:
两者都归属 module_bpm,分别位于 user_group 与 comment 子模块,表名分别为 bpm_user_group 与 bpm_comment。
module_bpm
user_group
comment
bpm_user_group
bpm_comment
用户组本质上是一份"用户编号数组 + 元信息"的配置,本身不参与流程流转,而是作为候选人策略的输入被引擎消费。在审批节点的候选策略中,选择"指定用户组"(USER_GROUP = 40)并勾选若干用户组后,引擎在节点推进时会把组内所有成员展开为候选审批人。
USER_GROUP = 40
与"指定用户""指定角色""部门成员"等策略相比,用户组的优势在于人员可集中维护:人事变动时只需在用户组里增删成员,无需逐个修改流程模型。
用户组表 bpm_user_group 关键字段:
name
description
user_ids
status
0
1
remark
用户组继承 ModelMixin 与 UserMixin,具备标准创建/更新时间与操作人字段;权限策略为 NONE,由接口层 RBAC 控制。
ModelMixin
UserMixin
NONE
用户组接口路径前缀为 /bpm/user-group,统一需要对应权限。
/bpm/user-group
/bpm/user-group/page
bpm:user-group:query
/bpm/user-group/simple-list
/bpm/user-group/get
/bpm/user-group/create
bpm:user-group:create
/bpm/user-group/update
bpm:user-group:update
/bpm/user-group/delete
bpm:user-group:delete
服务层 BpmUserGroupService 基于通用 CRUDBase 实现,逻辑较薄(分页、详情、增删改),成员以 user_ids 数组整体写入。
BpmUserGroupService
CRUDBase
用户组真正的价值在候选计算。引擎 framework/candidate.py 的 calculate_users 在校验策略属于 SUPPORTED_CANDIDATE_STRATEGIES 后,针对 USER_GROUP 分支读取所选用户组的 user_ids 并合并去重:
framework/candidate.py
calculate_users
SUPPORTED_CANDIDATE_STRATEGIES
USER_GROUP
elif strategy == BpmCandidateStrategyEnum.USER_GROUP: group_ids = parse_param_ids(param) if group_ids: rows = await db.execute( select(BpmUserGroupModel.user_ids).where(BpmUserGroupModel.id.in_(group_ids)) ) for group_user_ids in rows.scalars().all(): user_ids.extend(group_user_ids or [])
也就是说,节点配置里保存的是"用户组编号列表",运行时引擎再去解析成具体用户。这意味着用户组增删成员会实时反映到后续发起的流程,已生成任务不受影响(任务已落库候选人)。
前端位于 apps/web-ele/src/views/bpm/group,页面 index.vue 使用 Vben 的 useVbenVxeGrid 表格 + FormModal 弹窗完成增删改查,工具栏与行内操作按钮均绑定 bpm:user-group:* 权限。
apps/web-ele/src/views/bpm/group
index.vue
useVbenVxeGrid
FormModal
bpm:user-group:*
接口封装在 src/api/bpm/userGroup/index.ts,除常规的 page / get / create / update / delete 外,特别提供 getUserGroupSimpleList() 用于流程设计器的用户组下拉。
src/api/bpm/userGroup/index.ts
page / get / create / update / delete
getUserGroupSimpleList()
在设计器内,用户组以"候选策略 → 用户组"的方式被引用:
userGroupList
provide
user-task-node-config.vue
copy-task-node-config.vue
candidateStrategy === USER_GROUP(40)
configForm.userGroups
userGroups
candidateParam
流程评论以流程实例为单位组织,并可关联到具体任务。它同时承担两类角色:
评论表 bpm_comment 关键字段:
instance_id
task_id
user_id
type
message
评论同样继承 ModelMixin/UserMixin,权限策略 NONE,由接口层 bpm:task:* 控制读写。
bpm:task:*
framework/constants.py 中 BpmCommentTypeEnum(字符串枚举)定义了评论类型,前端通过字典 bpm_comment_type 渲染标签与颜色:
framework/constants.py
BpmCommentTypeEnum
bpm_comment_type
2
3
4
5
6
7
8
9
其中 COMMENT 由用户主动创建,其余多由引擎在审批动作中自动产生(本文档聚焦评论模块本身,审批动作如何写评论可参见"流程实例与任务")。
COMMENT
评论接口路径前缀为 /bpm/comment:
/bpm/comment
/bpm/comment/create
bpm:task:update
/bpm/comment/list-by-process-instance-id
bpm:task:query
BpmCommentService.create 的入参只需 message,并允许通过 task_id 或 process_instance_id 指定归属:若只传了 task_id,服务会自动反查出所属 instance_id;两者皆缺则抛出异常。创建时 type 固定为 COMMENT,user_id 取自当前登录用户。
BpmCommentService.create
process_instance_id
查询接口 list_by_process_instance_id 按 id 升序返回该实例的全部评论,并通过 candidate.get_user_map 批量拼接评论人的昵称、头像、部门信息,最终返回结构含 id / taskId / userId / type / message / createTime / user。
list_by_process_instance_id
id
candidate.get_user_map
id / taskId / userId / type / message / createTime / user
前端接口封装在 src/api/bpm/comment/index.ts:
src/api/bpm/comment/index.ts
getCommentListByProcessInstanceId(processInstanceId)
createComment(taskId, message)
taskId
processInstanceId
流程详情页 views/bpm/processInstance/detail 中的 modules/comment-list.vue 负责渲染评论时间线:
views/bpm/processInstance/detail
modules/comment-list.vue
DictTag
ElEmpty
流程用户组与评论
概述
流程用户组与流程评论是工作流(BPM)中两个相对独立但都很常用的能力:
两者都归属
module_bpm,分别位于user_group与comment子模块,表名分别为bpm_user_group与bpm_comment。流程用户组
概念与定位
用户组本质上是一份"用户编号数组 + 元信息"的配置,本身不参与流程流转,而是作为候选人策略的输入被引擎消费。在审批节点的候选策略中,选择"指定用户组"(
USER_GROUP = 40)并勾选若干用户组后,引擎在节点推进时会把组内所有成员展开为候选审批人。与"指定用户""指定角色""部门成员"等策略相比,用户组的优势在于人员可集中维护:人事变动时只需在用户组里增删成员,无需逐个修改流程模型。
数据模型
用户组表
bpm_user_group关键字段:namedescriptionuser_idsstatus0开启 /1关闭remark用户组继承
ModelMixin与UserMixin,具备标准创建/更新时间与操作人字段;权限策略为NONE,由接口层 RBAC 控制。后端接口
用户组接口路径前缀为
/bpm/user-group,统一需要对应权限。/bpm/user-group/pagebpm:user-group:query/bpm/user-group/simple-listbpm:user-group:query/bpm/user-group/getbpm:user-group:query/bpm/user-group/createbpm:user-group:create/bpm/user-group/updatebpm:user-group:update/bpm/user-group/deletebpm:user-group:delete服务层
BpmUserGroupService基于通用CRUDBase实现,逻辑较薄(分页、详情、增删改),成员以user_ids数组整体写入。在流程引擎中的集成
用户组真正的价值在候选计算。引擎
framework/candidate.py的calculate_users在校验策略属于SUPPORTED_CANDIDATE_STRATEGIES后,针对USER_GROUP分支读取所选用户组的user_ids并合并去重:也就是说,节点配置里保存的是"用户组编号列表",运行时引擎再去解析成具体用户。这意味着用户组增删成员会实时反映到后续发起的流程,已生成任务不受影响(任务已落库候选人)。
前端
前端位于
apps/web-ele/src/views/bpm/group,页面index.vue使用 Vben 的useVbenVxeGrid表格 +FormModal弹窗完成增删改查,工具栏与行内操作按钮均绑定bpm:user-group:*权限。接口封装在
src/api/bpm/userGroup/index.ts,除常规的page / get / create / update / delete外,特别提供getUserGroupSimpleList()用于流程设计器的用户组下拉。在设计器内,用户组以"候选策略 → 用户组"的方式被引用:
getUserGroupSimpleList()加载userGroupList并provide给各节点配置组件;user-task-node-config.vue与copy-task-node-config.vue在candidateStrategy === USER_GROUP(40)时展示"指定用户组"多选框,绑定configForm.userGroups;userGroups以逗号拼接成candidateParam;回显时再拆分回数组。流程评论
概念与定位
流程评论以流程实例为单位组织,并可关联到具体任务。它同时承担两类角色:
数据模型
评论表
bpm_comment关键字段:instance_idtask_iduser_idtypemessage评论同样继承
ModelMixin/UserMixin,权限策略NONE,由接口层bpm:task:*控制读写。评论类型枚举
framework/constants.py中BpmCommentTypeEnum(字符串枚举)定义了评论类型,前端通过字典bpm_comment_type渲染标签与颜色:0COMMENT1APPROVE2REJECT3CANCEL4RETURN5DELEGATE_START6DELEGATE_END7TRANSFER8ADD_SIGN9SUB_SIGN其中
COMMENT由用户主动创建,其余多由引擎在审批动作中自动产生(本文档聚焦评论模块本身,审批动作如何写评论可参见"流程实例与任务")。后端接口
评论接口路径前缀为
/bpm/comment:/bpm/comment/createbpm:task:update/bpm/comment/list-by-process-instance-idbpm:task:queryBpmCommentService.create的入参只需message,并允许通过task_id或process_instance_id指定归属:若只传了task_id,服务会自动反查出所属instance_id;两者皆缺则抛出异常。创建时type固定为COMMENT,user_id取自当前登录用户。查询接口
list_by_process_instance_id按id升序返回该实例的全部评论,并通过candidate.get_user_map批量拼接评论人的昵称、头像、部门信息,最终返回结构含id / taskId / userId / type / message / createTime / user。前端
前端接口封装在
src/api/bpm/comment/index.ts:getCommentListByProcessInstanceId(processInstanceId):拉取某实例评论。createComment(taskId, message):提交评论(注意该封装默认只传taskId,由后端反查实例;如需直接关联实例可扩展传processInstanceId)。流程详情页
views/bpm/processInstance/detail中的modules/comment-list.vue负责渲染评论时间线:bpm_comment_type字典的简称/颜色),区分评论与各类系统操作;DictTag类型标签、关联任务名(如有)以及格式化时间;message,空状态显示ElEmpty。