feat(engine): NOTIFY 抄送 + CONDITION 条件路由 + JOIN scope 修复(两批全栈)
build / build-push (push) Successful in 47s
build / build-push (push) Successful in 47s
- NOTIFY:TYPE_NOTIFY 瞬时抄送(flw_cc 逐人留痕 + CC_SENT 事件 + 站内通知不加待办角标)、/api/flow/cc/my、轨迹 kind=CC 与 oapi progress 抄送步、示意图青框卡片
- CONDITION:flw_router 判断服务注册 + flw_route_log 决策留痕(REQUIRES_NEW,reroute 回滚不丢失败行)+ 同步判断调用(服务目录寻址 + 平台签名,3s×3 退避重试)+ 失败挂起/管理端重跑(不配默认出口)+ 可选事件 flow.route.decided
- JOIN scope:branch_key 路径前缀编码 + scope 级到齐放行 + DefValidator SPLIT/JOIN 配对与键长守卫(存量无点号键零迁移,历史直连图回退实例级口径)
- 管理端:/api/flow/admin/router/* CRUD + POST /api/flow/admin/instance/{id}/reroute
- 生产 SQL:sql/20260923_create_flw_cc.sql(含 flw_task 时间列升 DATETIME(3))、20260924_create_flw_router_and_route_log.sql
- 测试:全量 125 绿(FlowEngineIT 24,含条件/嵌套并行/退回重走用例)
This commit is contained in:
@@ -47,6 +47,9 @@ public class UserMsgNotifier {
|
||||
case TRANSFERRED:
|
||||
notifyTaskCreated(event);
|
||||
break;
|
||||
case CC_SENT:
|
||||
notifyCc(event);
|
||||
break;
|
||||
case COMPLETED:
|
||||
case REJECTED:
|
||||
case WITHDRAWN:
|
||||
@@ -121,6 +124,32 @@ public class UserMsgNotifier {
|
||||
"returned:" + instance.getId() + ":" + instance.getVersion(), 30);
|
||||
}
|
||||
|
||||
/**
|
||||
* 抄送(2026-09-23 NOTIFY 节点):msgType=1 通知类(待办才是 2),bizType=flow.cc、
|
||||
* msgNo=cc:{ccId}(逐人逐节点一行一消息,重走重复抄送不互吞);跳转与任务到达同策略
|
||||
* (bizUrl 优先,空回落办件详情)。★ 不调 todoInc——知会不占待办角标、不进待办列表。
|
||||
*/
|
||||
private void notifyCc(FlowEvent event) {
|
||||
FlwInstance instance = instanceOf(event.getInstanceId());
|
||||
Object ccUserId = event.getData() == null ? null : event.getData().get("ccUserId");
|
||||
if (instance == null || ccUserId == null) {
|
||||
return;
|
||||
}
|
||||
Object nodeName = event.getData().get("nodeName");
|
||||
Object ccId = event.getData().get("ccId");
|
||||
String bizTitle = safe(instance.getBizTitle());
|
||||
String content = "「" + bizTitle + "」抄送给您"
|
||||
+ (nodeName == null || String.valueOf(nodeName).isEmpty()
|
||||
? "" : "(" + nodeName + ")");
|
||||
String jumpPath = instance.getBizUrl() == null || instance.getBizUrl().trim().isEmpty()
|
||||
? "/instance/" + instance.getId() : instance.getBizUrl();
|
||||
userMsgClient.sendUserMsg(instance.getSchId().intValue(),
|
||||
Collections.singletonList((Integer) ccUserId), 1,
|
||||
"flow.cc", String.valueOf(instance.getId()),
|
||||
"您有新的抄送:" + bizTitle, content,
|
||||
jumpPath, "cc:" + ccId, 30);
|
||||
}
|
||||
|
||||
private void notifyResult(FlowEvent event) {
|
||||
FlwInstance instance = instanceOf(event.getInstanceId());
|
||||
if (instance == null) {
|
||||
|
||||
Reference in New Issue
Block a user