Commit Graph
37 Commits
Author SHA1 Message Date
chenxing f07ac6da93 feat(callback/app): 回调探测端点 /admin/callback/probe/{id}——签 flow.ping 未知事件码走真实管道同步一发(信封同构 CallbackDispatcher,结果落 flw_callback_log 一次性行+resp_body 响应摘要列);应用辅助统计 /admin/app/stats(appKey→本校回调注册数,应用设置页对接深度列)
build / build-push (push) Failing after 14s
2026-10-11 22:40:44 +08:00
chenxing cd046782d9 fix(flow): 科室/成员端点补 requireId 边界防护——缺 id 回业务错而非 findById(null) 笼统 500(用户验收反馈 R2)
build / build-push (push) Successful in 2m54s
2026-10-10 22:43:01 +08:00
chenxing a06b610d9d feat(dept): 科室管理——flw_dept/flw_dept_member 组+成员模型取代单用户映射行(议题3,拍板D1选B)
build / build-push (push) Successful in 54s
- deptKey=本地自增 id;source_group_id 幂等(一键拉取=初始化/刷新语义,不重复建组);不做存量迁移
- 四处读源全部切新表:AssigneeResolver(宽容口径:deptKey 不存在/停用返回空,图示/轨迹不炸)、
  enabledDeptKeys 发布校验白名单、DeptLabelSupport 唯一出口(图示科室视图+轨迹富化)、编辑器 deptList 聚合
- /admin/dept/* 全套端点(CRUD/成员/拉取预览导入);旧 /map/* 映射 CRUD 端点删除
  (保留 /map/lookupUser 选人检索与 /user/teacherTree);flw_assignee_map 实体/表保留不删
- IT 种子切源(FlowTestSupport tag→deptKey 注册表,用例主体零改动);全量 191 绿;E2E 22/22
  (local-debug/four-topics-e-e2e.py,含切源后果验证与生产盘点 SQL)
2026-10-10 19:47:58 +08:00
chenxing 4293c9628a feat(def): updateMeta 元数据原地编辑——已发布可改 name/appKey 不升版本(议题2)
- 独立于 save 的升版本路径:不碰 code/flow_guid/version/status/contentJson 结构
- contentJson 顶层 name 同步(ObjectNode 保序;消除行 name 与 JSON name 脏窗口,拍板 D4)
- appKey 校验同 save 口径(显式传入须 flw_app 启用集合;可置空)
- 单测 5 例(三不变断言/白名单/补写/跨校)+ E2E 14/14(含升版本路径回归与 oapi 摘要)
2026-10-10 19:23:44 +08:00
chenxing d6b7a68ec3 feat(app): 应用设置·应用管理——flw_app 白名单 + 学校池同步 + defSave 归属应用校验
- flw_app(sch,app_key uk):学校池(UserBase list-by-school,学校组单点已开通、clientType=null 不过滤端)
  diff 同步——新增即 enabled=1、改名静默刷新、池外保留;UserBase 不可达降级本地行
- /admin/app/list(触发同步)/ /admin/app/enable;defSave 显式 appKey 须 ∈ 启用集合(不传不拦,升版本继承不受影响)
- SQL 备案:flw_app 建表 + UserBase 菜单 107 新增/104 下线(人工执行)
- 单测 +8;E2E 13/13(local-debug/four-topics-c-e2e.py)
- 关联 SDK 修复:BoaApp.createTime @JsonFormat 对齐 UserBase 时间契约(BasePlatform 单独 commit,Nexus -73)
2026-10-10 19:17:38 +08:00
chenxing 92619508f0 feat(condition): CONDITION 判断方式二选一——EXPRESSION 内置 Aviator 表达式(沙箱)+ SERVICE 原口径;JudgeBody 补 submitterId
- ExpressionEvaluator:Aviator 5.4.3 沙箱(FEATURE_SET 只留 If、ALLOWED_CLASS_SET 空=禁类访问/反射)、编译缓存、
  顶层变量缺失抛错挂起(Aviator 缺失变量按 nil 且 nil 视作最小值,<= 兜底出口会静默放行——宁挂起不误放行)
- ConditionRouteService.decide 分流:EXPRESSION 按出边顺序取首个 true(逐边结果摘要落 raw_response),
  全 false/异常挂起沿用 SERVICE 纪律(route_log outlet=NULL + EXPRESSION 常量 + 告警 + 管理端重跑)
- DefValidator 发布期分层校验:EXPRESSION 出口缺条件/语法错/违禁表达式硬拦;表单变量放行(运行时核对);
  内置变量疑似拼错 warn;judgeMode 非法值拦
- /admin/router/eval 调试端点(同一求值核心,不落库不走流程)
- 单测 22 新增 + 全量 170 绿;E2E 18/18(发布/分支选路/挂起留痕/重跑/调试)见 local-debug/four-topics-a-e2e.py
2026-10-10 18:52:40 +08:00
chenxing a1f99fd7e0 feat(def): 流程定义唯一键改按流程线管 + 归属应用筛选
build / build-push (push) Successful in 8m31s
- flw_def 唯一键 (sch,code,ver)→(sch,flow_guid,ver)(uk_flw_def_guid_ver,生产/本地已手工切索引):升版本 maxByGuid+1 与唯一键同口径,同编码多条流程线(work-leave 三条线实锤追尾)不再死锁
- 新建永远新开流程线 v1,删除同编码草稿复用;撞唯一键转"保存冲突"友好提示
- 新增 flw_def.app_key 归属应用列:save 全链路透传(升版本缺省继承源线、传非空覆盖);/admin/def/list 支持 appKey 过滤;新增 /admin/def/appkeys 应用清单(flw_def 已标注 ∪ 已注册回调)
- FlowDefAdminServiceSaveTest 10 用例锁 save 分派语义
2026-10-10 14:34:25 +08:00
chenxing 7c92e953ec feat(diagram): 流程图竖排改造(横→竖)——布局单源坐标转置+名单2行换行+边几何/箭头/标签翻转,golden 用例改写并新增 6 出口用例
build / build-push (push) Successful in 2m44s
2026-10-09 19:42:50 +08:00
chenxing 56a71f813f fix(test): 平台 SDK 快照(101009 b66)移除 OpenApiUserClient 通道绑定 API——测试桩同步删除死 override 对齐编译基线 2026-10-09 19:42:38 +08:00
chenxing 9bb7250c5e fix(appearance): 503 改 sendError 直写——绕过 GlobalExceptionHandler 兜底(线上实测发现)
build / build-push (push) Failing after 1m14s
2026-10-09 00:39:57 +08:00
chenxing 1efe4feb50 feat(appearance): 外观偏好同源读代理端点 GET /api/appearance(oapi 代理轮)
build / build-push (push) Successful in 2m6s
- YschOpenCall(target=userhome) 经 open-gateway 签名直调,JsonNode 整体透传;下游不可达 503 静默降级
2026-10-08 23:27:50 +08:00
chenxing d28b5d1161 feat(embed): 新增办件进度嵌入页签发端点与免签数据端点
build / build-push (push) Successful in 10m1s
2026-10-03 16:42:21 +08:00
chenxing 1d2f4a0cb2 refactor(diagram): 停透传废弃的 layout 字段(positions 单源生效) 2026-10-03 15:13:39 +08:00
chenxing d6898ea674 test(diagram): DiagramLayoutService golden 用例 2026-10-03 13:55:24 +08:00
chenxing 09c3c0c38c feat(diagram): DiagramVo 增 positions 布局单源字段 2026-10-03 13:51:45 +08:00
chenxing cacdd4ee14 refactor(diagram): 布局计算抽 DiagramLayoutService,PNG 出图不变 2026-10-03 13:46:57 +08:00
chenxing 2384da7822 fix(test): 基线修复——stub 补平台 SDK 新增的通道绑定方法 + 自带 spring-boot-starter-data-redis(0928 快照 WeChatAuthAutoConfiguration 签名引用 StringRedisTemplate,接入前提为应用自带 data-redis) 2026-10-03 13:36:58 +08:00
chenxing 2f8daa12a5 feat(notify): 待办/抄送消息补 jumpApp 页面归属(B0 直批配套补提交)——bizUrl 落地页场景 jumpApp=instance.bizType(接收方按它查基址),未传 bizUrl 回落办理页留空按 bizType;UserMsgClient.sendUserMsg 增 jumpApp 形参;CallbackPushService/ConditionRouteService 跟随 B 系列回调前缀改造;测试补 jumpApp 断言
build / build-push (push) Successful in 49s
2026-09-28 19:23:29 +08:00
chenxing 31476ef707 chore(ci): 发版窗口重建触发(D3)——拉取 SDK SNAPSHOT -20260928(FLOW_CENTER 目录键归一 + getAppByCode),无代码变更
build / build-push (push) Successful in 1m13s
2026-09-28 18:27:32 +08:00
chenxing d2bef20e13 feat(engine): NOTIFY 抄送 + CONDITION 条件路由 + JOIN scope 修复(两批全栈)
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,含条件/嵌套并行/退回重走用例)
2026-09-24 08:58:26 +08:00
chenxing f2126cdf32 feat(oapi): 应用内审批 oapi——待办/办件查询 + 办理(operator 复核)+ 待办跳转 bizUrl 优先
build / build-push (push) Successful in 1m29s
- GET /oapi/flow/tasks/todo?schId&assigneeId&bizType&page&size(出参含 biz 定位/快照/版本)
- GET /oapi/flow/instances?schId&bizType&status&page&size(查询不限办理人)
- POST /oapi/flow/task/{taskId}/approve|reject?schId&operatorId&operatorName:
  operatorId 按任务办理人逐字复核(非办理人→业务码拒绝不 500),拒绝必填意见,
  opinion 经事件链透传到回调 payload;审批后回调/待办减一自动复用
- 待办通知 jumpPath:办件 bizUrl 优先(空回落 /task/{taskId})

契约 IT +3(todo 过滤分页/instances 状态过滤/办理三态+payload 断言),
单测 UserMsgNotifierBizUrlTest 两态;全量 99 单测 + 11 契约 IT 绿。
2026-09-22 16:54:29 +08:00
chenxing d2395c20ce feat(flow): 回调信封升级——事件携带操作人身份(operatorUserId/operatorName)
在飞工作合入:FlowEvent 增操作人字段(可空),引擎/推进监听/回调派发全程透传,
对齐 SDK FlowCallbackEvent 的 taskId/operator 字段(规范 §6.4)。
2026-09-22 16:54:02 +08:00
chenxing 695e20ab52 fix(config): 摘除 jar 内本地出站配置,修线上 GetUserInfo 连 localhost:8060
build / build-push (push) Successful in 1m6s
9cc0b06 为本地验签联调把 yh.open.services.userbase: http://localhost:8060 写进
jar 内 application.yml:服务目录第②级 services 永远压过平台注入的
YH_OPEN_BASE_HOST(只喂第③级枚举兜底),部署后容器内对 UserBase 的全部调用
(/api/base/GetUserInfo → /oapi/user/byLoginName)解析到容器 localhost:8060,
Connection refused → code=6 内部服务错误。

- services 覆盖从 jar 摘除:本地联调改运行时注入
  YH_OPEN_SERVICES_USERBASE=http://localhost:8060
- flow-center.usermsg.enabled 置回 false、base-url 注释掉:同批本地值不再随
  jar 出厂(生产未部署 UserMsg,enabled=true 会对 localhost:8080 空转告警);
  本地经 FLOWCENTER_USERMSG_ENABLED / FLOWCENTER_USERMSG_BASEURL 注入
2026-09-20 09:22:17 +08:00
chenxing 9cc0b06c29 feat(flow): 工作台与轨迹优化 + 管理端启用回路 + 本地验签配置修复
build / build-push (push) Successful in 1m30s
- 已办去重: 同一办件一行 + doneCount 累计次数(FlwTaskRepository 查询去重)
- 发起/撤回/重提留痕事件行(状态码 6/7, 无需 DDL); /oapi/flow/progress steps 含撤回/重提步骤
- 管理端新增启用回路: POST /admin/map/enable/{id}、POST /admin/def/enable/{id}; GET /api/flow/def/source 源码查询
- 修复 findEnabledByOrdId 未过滤 status 的隐性缺陷; 新增 DeptLabelSupport 科室标签支撑
- 测试: FlowEngineIT 撤回留痕/已办去重断言、OapiFlowContractIT 撤回步骤断言(94 tests 全过)
- 本地验签修复: 本地 UserBase 无 context-path, yh.open.services 显式覆盖服务目录枚举兜底的 /userbase basePath, 否则出站签名与服务端剥离不对齐 → GetUserInfo 等全部「验签失败」; 生产经 Caddy 挂 /userbase 时删除 services 覆盖
2026-09-18 16:56:01 +08:00
chenxing 434aa9d185 feat(admin): 选人教师树(仿 Notice GetSchoolAll)——组树剔除学生组, YschClassOpenApi.getSchTeaList 按 GroupIds 挂组+空组剪枝 (GET /admin/user/teacherTree); 管理端新增 /def/diagram.png 示意图页进度图 <img> 直嵌
build / build-push (push) Successful in 46s
2026-09-17 14:53:05 +08:00
chenxing 5a7d93a48f feat(admin): 选人组件数据源-userTree——管理端「选择用户」弹窗接学校组树 (组→组内用户叶子, GET /admin/user/tree), 替代管理页手输用户ID
build / build-push (push) Successful in 45s
2026-09-17 11:09:40 +08:00
chenxing 808e1c68b0 ci: 重新触发构建——镜像已含 fonts-noto-cjk 中文字体(流程图汉字方框修复收尾)
build / build-push (push) Successful in 46s
2026-09-17 09:54:31 +08:00
chenxing 0b2527214b fix(docker): 镜像补 fonts-noto-cjk——无中文系统字体导致流程图汉字方框的根凶
build / build-push (push) Successful in 1m31s
2026-09-17 09:47:47 +08:00
chenxing bfa2dfc713 fix(diagram): 流程图汉字方框——CJK 字体探测链(物理字体canDisplay验证→SansSerif回退→font-path配置兜底) + 副标起笔与label重叠
build / build-push (push) Successful in 2m18s
2026-09-17 08:22:13 +08:00
chenxing 6afc7d7b92 feat(oapi): 办件进度/流程图token出图/托管撤回 + CAS直嵌示意图(两会话产物合入)
build / build-push (push) Successful in 1m29s
2026-09-17 01:03:57 +08:00
chenxing b8441065d0 feat: 引擎多出口路由/退回/移交/或签补齐 + 定义 layout 坐标
build / build-push (push) Successful in 5m11s
- 多出口:FlwTask 增 edge_name 列(sql/20260916),FlwTaskRepository.claimAndFinish
  同步落列;FlowTaskService.handle 出度>1 时 edgeName 必填;FlowEngine.continueAdvance
  按 edge name 选路(单出口原路径逐字节兼容,未命中不推进);FlowAdvanceService/
  FlowNodeAdvanceListener 透传;BranchScope 从 FlowEngine 提取
- DefValidator:多出口出口命名必填且同节点唯一;跨分支连线发布期明确拒绝
- 退回 POST /task/{id}/returnBack:默认退主管线最近已批节点,精确失效当前节点待办,
  split 幂等 upsert 使退回重走并行段不撞 flw_branch uk
- 移交 POST /task/{id}/transfer:TRANSFERRED(5)+新建待办,AssigneeResolver.requireUserName
- 或签 ANY 补齐:首个同意失效同节点兄弟待办
- 已办口径/撤回守卫:status in (1,2,4,5);新事件 flow.returned/flow.transferred
- FlowDiagramService:EdgeVo.name/NodeVo.state/DiagramVo.layout,办件图状态计算
- 新 IT:多出口×3、ANY 或签、退回重走并行段、退回/移交/撤回

mvn test 84/84 绿
2026-09-16 22:23:02 +08:00
chenxing 55e3a3f800 feat: 一键拉取教师组作为科室(办理人映射批量导入)+ 回调签名/编辑器存量
build / build-push (push) Successful in 46s
- FlowMapAdminService:previewGroupDepts/importGroups(学校子树 type=7 容器→子组为科室,
  deptKey=UserBase 组 id,成员=组内用户;已存在启用中映射跳过;语义与 svc-hall buildDeptTree 对齐)
- FlowAdminController:GET /map/groupPreview + POST /map/importGroups
- flow-center.map.dept-group-type(默认 7)
- 含 2026-09-13/14 存量:CallbackAppSigner 回调签名、流程编辑器 sql、示意图(F1-F4)
2026-09-16 01:20:59 +08:00
chenxing f116786846 feat(base): GetUserMod 改为消费 UserBase 下发的模块树,移除硬编码菜单
build / build-push (push) Successful in 1m59s
与其他子应用(Notice / svc-hall / 事项库)统一:GetUserMod 不再返回本应用硬编码 MENUS,
改经平台 SDK YschBaseOpenApi.getUserModule(userId, schId) 取当前用户在本应用
(yh.open.app-key=100019)下的已授权模块树,层级由平台契约 BoaModule.children 承载,
本侧仅做前端 layout 契约的字段改名映射(toFrontendTree),不再本地组树。
设计概览 §9.4「菜单为本地路由约定、不进 app_module」的口径自此作废。

两处刻意的差异与取舍:

1) modId 取 custom_id 而非主键 id:front router/routes.ts 的 meta.modId 约定是 100~105,
   等于 app_module.custom_id,旧硬编码菜单发的也是这些值;若照抄其他子应用「modId=主键id」,
   前端 modId 兜底匹配会永久失配(仅剩 path 匹配可用)。故 custom_id 可解析为数字时取之,
   否则回退主键 id。
2) 不保留本地 MENUS 兜底:静默回退会把「UserBase 未配 app_module / 未授权」伪装成正常。
   配置缺失应表现为空菜单并被立刻发现。发布顺序必须先是 flow-center接入UserBase菜单.sql
   (含 app_module 写入与角色/组授权),再发本应用。

新增 FlowBaseControllerTest 4 例:层级原样保留与字段改名、children 恒为数组(含上游未展开
的 null 归零)、custom_id 非数字回退主键、path 缺失给空串且 null/空入参不抛 NPE。
映射方法放宽为包级可见以免为测试改写 YschBaseOpenApi 全局静态客户端、污染共享 JVM 内其它用例。
2026-09-15 18:44:16 +08:00
chenxing c1103aeb29 feat: 提交流程中心后端代码
build / build-push (push) Successful in 28s
Spring Boot 流程引擎服务:流程定义/实例/任务、审批人解析、
回调分发、oapi 接口及单元测试。
保留远程 .gitea/workflows/build.yml 与 docker/Dockerfile,
新增 .gitignore 排除 target/ 构建产物。
2026-09-15 10:42:56 +08:00
admin 0296b2b5dd ci: init Dockerfile [skip ci] 2026-09-15 10:18:34 +08:00
admin d4508cab53 ci: init build workflow [skip ci] 2026-09-15 10:18:34 +08:00
admin 57c07bec0e Initial commit 2026-09-15 10:18:27 +08:00