FlowLong 1.2.7 的改动没有停留在界面微调,而是补齐了流程落地时经常遇到的两个业务能力:办理节点可以使用节点作为办理人来源,流程实例也可以标记紧急程度。同时,这一版本改善了节点模型扩展属性的读取方式,并继续完善注释、文档与缺陷修复。
这些变化尤其适合审批、工单、客服协同和 AI 辅助决策流程。它们解决的不是“流程能不能跑”,而是任务如何动态流转、紧急实例如何被优先处理,以及自定义节点属性如何更安全地进入业务代码。
节点成为办理人,适合表达动态责任链
固定用户、角色或部门适合静态审批链,但真实业务经常要求“由上一环节的实际处理人继续负责”或“把某个节点的办理结果作为后续任务分配依据”。1.2.7 新增节点作为办理人的配置能力,但该能力仅适用于办理节点。
这项边界值得特别注意:通知、条件判断、自动执行等非办理节点不应被当作人工责任主体。设计模型时,可以在发布前检查节点类型和引用关系,避免流程启动后才发现无法解析办理人。
典型场景包括:
- 工单初审人员继续负责复核补充材料;
- 售前方案节点的实际负责人自动承接报价审批;
- AI 节点完成分类后,将任务交给前序人工节点的办理人;
- 多级审批中复用某一环节已经确定的责任人,而不是再次查询组织架构。
这里仍要处理两个异常分支:被引用节点尚未完成时如何分配,以及该节点存在多人办理时选择全部人员、首位办理人还是最终办理人。摘要没有给出这些策略的具体实现,因此接入时应以项目文档和实际版本行为为准,并为无法解析办理人的情况准备兜底规则。
紧急程度应该进入查询、排序和审计链路
1.2.7 支持为流程实例设置紧急程度。这个字段只有被消费时才会产生业务价值,不能只停留在启动表单或详情页上。
落地时建议统一定义有限枚举,例如 LOW、NORMAL、HIGH 和 CRITICAL,并让它参与:
- 待办列表排序;
- SLA 超时计算;
- 消息通知渠道选择;
- 管理台筛选与统计;
- 紧急程度变更审计。
不要让调用方随意提交 very_urgent、P0、加急 等互不兼容的值。若业务线已有不同标准,应在接入层完成映射,而不是把混乱直接写入流程实例。
紧急程度也不应等同于审批优先权。它可以影响展示和调度,但不应绕过权限、会签规则或必要的风控节点。对于允许运行中提升紧急程度的系统,还应记录修改人、修改时间和修改原因。
用一个本地校验器检查模型配置
来源摘要没有公开字段名和接口结构,下面使用一份示意模型展示如何在发布流程定义前检查两个约束:节点型办理人只能用于办理节点,且流程实例紧急程度必须属于允许集合。接入真实项目时,请把字段名映射为 FlowLong 1.2.7 实际使用的模型结构。
先创建 process-model.json:
{
"instance": {
"urgency": "HIGH"
},
"nodes": [
{
"id": "submit",
"type": "handle",
"assignee": {
"type": "user",
"value": "user-1001"
}
},
{
"id": "review",
"type": "handle",
"assignee": {
"type": "node",
"value": "submit"
}
},
{
"id": "notify",
"type": "notification"
}
]
}
再创建可直接运行的 validate_model.py:
#!/usr/bin/env python3
import json
import sys
from pathlib import Path
ALLOWED_URGENCY = {"LOW", "NORMAL", "HIGH", "CRITICAL"}
HANDLE_NODE_TYPE = "handle"
def validate(model: dict) -> list[str]:
errors = []
urgency = model.get("instance", {}).get("urgency", "NORMAL")
if urgency not in ALLOWED_URGENCY:
errors.append(f"不支持的紧急程度: {urgency}")
nodes = model.get("nodes", [])
node_by_id = {node.get("id"): node for node in nodes if node.get("id")}
for node in nodes:
assignee = node.get("assignee") or {}
if assignee.get("type") != "node":
continue
if node.get("type") != HANDLE_NODE_TYPE:
errors.append(
f"节点 {node.get('id')} 不是办理节点,不能使用节点型办理人"
)
referenced_id = assignee.get("value")
referenced = node_by_id.get(referenced_id)
if referenced is None:
errors.append(
f"节点 {node.get('id')} 引用了不存在的节点 {referenced_id}"
)
elif referenced.get("type") != HANDLE_NODE_TYPE:
errors.append(
f"被引用节点 {referenced_id} 不是办理节点,无法提供办理人"
)
return errors
def main() -> int:
path = Path(sys.argv[1] if len(sys.argv) > 1 else "process-model.json")
model = json.loads(path.read_text(encoding="utf-8"))
errors = validate(model)
if errors:
print("模型校验失败:")
for error in errors:
print(f"- {error}")
return 1
print("模型校验通过")
return 0
if __name__ == "__main__":
raise SystemExit(main())
执行检查:
python3 validate_model.py process-model.json
这类校验可以放进 CI,在流程定义发布前阻止错误配置进入生产环境。真实接入时还可以补充循环引用检测、多人办理策略检查,以及被引用节点未完成时的兜底配置检查。
扩展属性不要继续散落强制转换
本次版本还优化了节点模型扩展属性,提供更友好的获取方式。对于使用自定义字段的项目,这是一个值得跟进的改动。
常见的旧式代码会直接读取原始 Map,再在业务层反复进行字符串转换、空值判断和类型转换。这样做容易出现键名拼写错误,也会让模型升级影响大量业务代码。升级后应优先使用版本提供的友好读取方式;如果现有项目封装较深,也可以在适配层集中处理默认值和类型转换。
迁移时可重点搜索以下代码模式:
grep -RInE 'extension|extend|properties|get\(' src/ \
--include='*.java' --include='*.kt'
命令中的关键词只是排查入口,需要根据项目实际类名调整。对读取频繁的扩展字段,建议补充“字段不存在”“值类型错误”“旧模型未设置字段”三类测试。
升级前后的检查清单
FlowLong 1.2.7 更适合按小范围流程灰度升级,而不是直接替换全部生产定义:
- 确认数据库变更是否涉及流程实例紧急程度字段;
- 验证旧流程实例在没有紧急程度时采用什么默认值;
- 只在办理节点上启用节点型办理人;
- 测试被引用节点未执行、撤回或由多人办理时的行为;
- 将紧急程度接入待办排序、筛选和审计,而不只是展示;
- 逐步把扩展属性的裸 Map 访问迁移到统一获取方式;
- 回归已有流程定义,尤其是自定义节点和监听器;
- 查阅完整修复列表,并针对受影响模块补充回归测试。
从发布内容看,1.2.7 的重点是增强流程治理和模型可扩展性,而不是大幅改变流程设计方式。对于已有项目,最有价值的升级路径是先统一紧急程度语义,再选择一条需要动态责任链的流程验证节点型办理人,最后收敛扩展属性读取代码。这样既能尽快获得新能力,也能控制流程引擎升级对存量业务的影响。