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:
@@ -45,6 +45,7 @@ public class FlowAdminController {
|
||||
private final FlowDefAdminService defAdminService;
|
||||
private final FlowMapAdminService mapAdminService;
|
||||
private final FlowCallbackAdminService callbackAdminService;
|
||||
private final com.yunhai.flowcenter.service.FlowRouterAdminService routerAdminService;
|
||||
private final FlwInstanceRepository instanceRepository;
|
||||
private final FlowDiagramService diagramService;
|
||||
private final com.yunhai.flowcenter.service.DiagramImageService imageService;
|
||||
@@ -241,6 +242,44 @@ public class FlowAdminController {
|
||||
callbackAdminService.rePush(adminGuard.requireAdmin(user, null), logIds);
|
||||
}
|
||||
|
||||
// ==================== 条件路由注册 / 重跑路由 ====================
|
||||
|
||||
/** 判断服务注册列表(flw_router 全局表;编辑器 routerKey 下拉与管理页共用) */
|
||||
@GetMapping("/router/list")
|
||||
public List<com.yunhai.flowcenter.entity.FlwRouter> routerList(BoaUser user) {
|
||||
adminGuard.requireAdmin(user, null);
|
||||
return routerAdminService.list();
|
||||
}
|
||||
|
||||
/** 保存注册(id 空=新建;serviceKey=服务目录键,path=判断端点,basePath=对端 context-path 生产必核对) */
|
||||
@PostMapping("/router/save")
|
||||
public com.yunhai.flowcenter.entity.FlwRouter routerSave(BoaUser user,
|
||||
@RequestBody Map<String, Object> body) {
|
||||
adminGuard.requireAdmin(user, null);
|
||||
return routerAdminService.save(
|
||||
body.get("id") == null ? null : Long.valueOf(String.valueOf(body.get("id"))),
|
||||
(String) body.get("routerKey"), (String) body.get("name"),
|
||||
(String) body.get("serviceKey"), (String) body.get("path"),
|
||||
(String) body.get("basePath"));
|
||||
}
|
||||
|
||||
/** 启用/停用注册(停用后发布校验拦截新引用) */
|
||||
@PostMapping("/router/status/{id}")
|
||||
public void routerStatus(BoaUser user, @PathVariable("id") Long id,
|
||||
@RequestParam("enabled") boolean enabled) {
|
||||
adminGuard.requireAdmin(user, null);
|
||||
routerAdminService.setStatus(id, enabled);
|
||||
}
|
||||
|
||||
/**
|
||||
* 重跑路由(判断失败挂起的恢复入口,2026-09-24 §4.4):重新调判断服务,成功即按出口续走;
|
||||
* 仍失败回业务错(办件继续挂起,route_log 已落新行)。
|
||||
*/
|
||||
@PostMapping("/instance/{id}/reroute")
|
||||
public void instanceReroute(BoaUser user, @PathVariable("id") Long id) {
|
||||
routerAdminService.reroute(adminGuard.requireAdmin(user, null), id);
|
||||
}
|
||||
|
||||
// ==================== 办件查询 ====================
|
||||
|
||||
@GetMapping("/instance/page")
|
||||
|
||||
@@ -66,6 +66,14 @@ public class FlowUserController {
|
||||
return queryService.pageDone(requireSchId(user), user.getId(), page, size);
|
||||
}
|
||||
|
||||
/** 我的抄送(NOTIFY 节点落库;知会不占待办,独立页签) */
|
||||
@GetMapping("/cc/my")
|
||||
public BasePageResult<FlowModels.CcItem> ccMy(BoaUser user,
|
||||
@RequestParam(value = "page", required = false) Integer page,
|
||||
@RequestParam(value = "size", required = false) Integer size) {
|
||||
return queryService.pageCc(requireSchId(user), user.getId(), page, size);
|
||||
}
|
||||
|
||||
/** 办件详情(提交人/办理人/本校管理员可见) */
|
||||
@GetMapping("/instance/{id}")
|
||||
public FlowModels.InstanceDetail detail(BoaUser user, @PathVariable("id") Long id) {
|
||||
|
||||
Reference in New Issue
Block a user