status: proposed created: 2026-06-01 complexity: 🔴复杂 related:
code-copilot/changes/lowcode-business-app-platform-business-closure/spec.md,code-copilot/changes/form-first-business-object-designer/spec.md
当前低代码应用已经具备应用中心、业务套件、业务对象、运行态 CRUD、对象设计器、触发器、流程桥接、消息通道、统计看板等基础能力,但这些能力还没有被组织成业务人员能理解和使用的一条闭环主链路。
本次改造目标是把低代码应用从“功能分散可配置”收敛为“业务单据驱动的全链路闭环”:
应用/套件 → 业务对象 → 单据 → 表单录入 → 流程流转 → 触发器自动化 → 消息推送 → 权限控制 → 报表展示 → 业务验收
完成后,以“客户商机管理”为例,业务人员应能完成:
同时,本次要做产品边界收敛:
forge-admin-ui/src/views/app-center/index.vue:3-21 当前“应用总览”首屏提供“引擎中心”按钮,并围绕业务套件、对象、应用入口组织页面。forge-admin-ui/src/views/app-center/engines.vue:43-49 当前硬编码展示流程引擎、报表引擎、权限引擎、消息引擎、触发器,其中“流程引擎”同时包含 FLOW 和 APPROVAL 类型。forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessEngineSummaryService.java:34-50 后端汇总仍包含 APPROVAL 审批引擎和 IMPORT_EXPORT 导入导出引擎,和本次“去掉审批引擎、导入导出引擎”的目标冲突。forge-admin-ui/src/views/app-center/mobile.vue:17-18 当前存在独立“移动端中心”,用于登记 H5、移动待办、移动审批和移动业务入口。forge-admin-ui/src/views/app-center/integration.vue:17-18 当前存在独立“集成中心”,用于登记开放接口、Webhook 和第三方平台入口。forge/db/migration/V1.0.27__add_business_app_platform_dicts_menus.sql:101-103 和 forge/db/migration/V1.0.31__normalize_app_center_menu_directory.sql:65-67 已注册引擎中心、移动端中心、集成中心菜单资源,后续需要用新增 Flyway 脚本收敛可见入口。DynamicCrudController#create/update/delete 在新增、修改、删除后分别调用业务事件发布器,见 forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/DynamicCrudController.java:67-105。BusinessEventPublisher 会根据 configKey 查询 ai_crud_config.object_code,只有能解析为业务对象的动态 CRUD 才触发自动化,见 forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessEventPublisher.java:93-139。BusinessEventPublisher#checkStatusChange 当前只识别 status/state/audit_status/approval_status 作为状态字段,见 BusinessEventPublisher.java:63-88;单据状态字段需要标准化,否则状态变更触发器不稳定。forge/db/migration/V1.0.46__add_business_trigger_and_message_channel.sql:4-78 已新增 ai_business_trigger、ai_business_trigger_log、ai_business_message_channel 三张表,覆盖触发器、执行日志和消息通道。BusinessTriggerController 已提供触发器分页、详情、新增、修改、删除、启停和日志接口,见 forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/BusinessTriggerController.java:32-89。BusinessTriggerService#selectPage/selectLogPage 当前分页查询仍使用 LambdaQueryWrapper,见 forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessTriggerService.java:35-44 和 122-131;按项目规则,查询类 SQL 后续应迁移到 Mapper XML。BusinessTriggerMapper.xml:5-18 已有按对象和事件查询启用触发器的 XML SQL,可作为后续分页查询下沉 XML 的参考。BusinessTriggerExecutor 支持 START_FLOW、SEND_MESSAGE、CREATE_RECORD、UPDATE_FIELD、WEBHOOK 动作分发,见 BusinessTriggerExecutor.java:177-195。BusinessTriggerExecutor#executeCreateRecordAction、executeUpdateFieldAction、executeWebhookAction 仍是 TODO 或模拟状态,见 BusinessTriggerExecutor.java:335-374;“审批通过后自动生成交接记录”这类数据闭环还没有真实落地。BusinessFlowService#startFlow 已能从 ai_business_binding 读取 FLOW 绑定,通过 FlowClient.startProcess 发起流程,见 forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessFlowService.java:45-90。BusinessFlowService#buildFlowVariables 后端期望变量映射字段名是 formField 和 flowVariable,见 BusinessFlowService.java:189-208。BusinessTriggerExecutor#executeStartFlowAction 也期望 formField 和 flowVariable,见 BusinessTriggerExecutor.java:200-214。forge-admin-ui/src/views/app-center/trigger.vue:101-119 前端触发器变量映射当前使用 field 和 variable,并在 trigger.vue:486-488 直接序列化保存,和后端期望不一致,会导致触发器发起流程时变量映射失效。BusinessApprovalRuntimeService#startApproval 当前没有真实调用流程引擎,只返回 recordId 并标记 TODO,见 forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApprovalRuntimeService.java:93-110;该服务应被“流程运行服务”替代或收敛。BusinessApprovalController 暴露 /ai/business/approval/runtime 和 /ai/business/approval/start,见 forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/BusinessApprovalController.java:28-45;本次不再保留独立审批引擎入口。BusinessTriggerExecutor#executeSendMessageAction 已复用现有消息中心 MessageService.send,支持模板、通道、接收人规则和业务参数,见 BusinessTriggerExecutor.java:235-287。BusinessTriggerExecutor#resolveReceivers 当前支持 OWNER、CREATOR、USERS、ALL,见 BusinessTriggerExecutor.java:290-333;需要补齐基于流程处理人、部门主管、角色的接收人规则。V1.0.46__add_business_trigger_and_message_channel.sql:91-120 已初始化企业微信、飞书、钉钉通道为停用且备注“待实现”,符合本阶段只保留 TODO 的方向。BusinessStatsService#overview/groupCount/trend 已支持按 configKey 做总数、今日新增、本月新增、字段分组和时间趋势统计,见 forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessStatsService.java:35-126。forge-admin-ui/src/views/app-center/stats-dashboard.vue:12-13 当前看板文案是通用“数据统计看板”,stats-dashboard.vue:135-158 只固定读取概览、status 分组和近 30 天趋势;商机阶段、金额汇总、流程结果等业务指标还没有场景化配置。BusinessPermissionFlowPanel.vue:5-19 当前只维护数据权限和树形模型,未承载“流程绑定、单据状态、按钮权限”的完整配置。BusinessActionDesigner.vue:12-16 已提供“添加发起审批”和“新增操作”入口,BusinessActionDesigner.vue:152-158 支持打开页面、调用能力、发起审批、执行触发器、打开外部链接等动作类型。BusinessActionDesigner.vue:84-86 仅用文本输入配置流程标识,缺少已发布流程选择、变量映射、发起条件、按钮权限与单据状态联动。业务对象是低代码平台的领域资产,例如客户、联系人、商机、合同、离职申请。业务对象负责定义字段、表单、列表、详情、关系、权限和运行配置。
单据是具备业务生命周期的业务对象记录。不是所有业务对象都必须是单据。
单据至少具备:
商机管理中的“商机录入”可以是普通记录;当它需要审批、编号、状态流转和结果回写时,它就是“商机单据”。
流程引擎是唯一承载审批流转的底座。不再单独定义“审批引擎”。
审批场景通过以下组合完成:
触发器是业务事件自动化,不替代流程引擎。它适合处理“当某件事发生时,自动做一件明确动作”:
本阶段触发器只做低复杂度规则。复杂串并行审批、多人任务、节点条件、超时等仍交给 Flowable 流程引擎。
报表展示不是独立“报表中心”的堆入口,而是业务套件和业务对象的看板能力。业务对象可以配置统计指标,CRM 套件可以配置组合看板。
消息推送优先打通站内消息。第三方平台通道保留为 WECHAT_WORK、FEISHU、DINGTALK 适配器扩展点,返回明确 TODO 状态并记录日志,不保存明文密钥。
formField/flowVariable 或在后端兼容旧的 field/variable。AiCrudPage / DynamicCrudExcelService 拆成新引擎。configKey。formField 和 flowVariable;保存时对旧协议 field 和 variable 做兼容转换。${opportunityName}-商机审批。${objectCode}:${recordId}。START_FLOW 和手动按钮发起流程复用同一后端服务。/ai/business/approval/start 不作为新页面调用入口;需要保留时仅作为兼容层转发到流程运行服务。tenant_id=1。pageNum 和 pageSize。:id 格式。| 操作 | 表名 | 字段/索引 | 说明 |
|---|---|---|---|
| 新增 | ai_business_document_config |
tenant_id, suite_code, object_code, config_key, document_name, document_no_rule, status_field, starter_field, owner_field, default_flow_key, status_mapping, options |
业务对象单据模式配置 |
| 新增 | ai_business_flow_instance_link |
tenant_id, object_code, record_id, business_key, flow_model_key, process_instance_id, flow_status, start_user_id, start_time, end_time, result, variables_snapshot |
单据记录与流程实例关联 |
| 扩展 | ai_business_trigger |
可选增加 scenario_type, blocking_mode, developer_mode |
支持场景模板、同步阻断和开发者高级模式 |
| 扩展 | ai_business_trigger_log |
可选增加 todo_code, correlation_id |
标识第三方 TODO 动作和关联流程/消息 |
| 复用 | ai_business_message_channel |
channel_config_ref, channel_type, status |
保留企微、飞书、钉钉通道定义,不存明文密钥 |
| 复用 | ai_business_binding |
binding_type=FLOW/REPORT/MESSAGE/PERMISSION/TRIGGER |
不再新增 APPROVAL 和 IMPORT_EXPORT 作为业务引擎类型 |
| 调整 | sys_resource |
移动端中心、集成中心、审批引擎、导入导出引擎相关菜单或按钮权限 | 新脚本隐藏或废弃旧入口,保留必要兼容权限 |
Flyway 要求:
CREATE TABLE IF NOT EXISTS。information_schema。tenant_id=1。| 操作 | 接口 | 方法 | 变更内容 |
|---|---|---|---|
| 新增 | /ai/business/document/config/{objectId} |
GET | 查询对象单据配置 |
| 新增 | /ai/business/document/config/{objectId} |
PUT | 保存对象单据配置 |
| 新增 | /ai/business/document/{objectCode}/{recordId}/runtime |
GET | 查询单据状态、流程状态、可执行动作 |
| 新增 | /ai/business/flow/binding/{objectCode} |
GET/PUT | 查询和保存对象流程绑定 |
| 新增 | /ai/business/flow/start |
POST | 从单据记录手动发起流程 |
| 新增 | /ai/business/flow/status/{objectCode}/{recordId} |
GET | 查询单据流程状态 |
| 新增 | /ai/business/flow/callback |
POST | 接收流程结束或节点事件并回写单据 |
| 调整 | /ai/business/trigger/page |
GET | 分页查询改为 Mapper XML SQL,支持场景筛选 |
| 调整 | /ai/business/trigger |
POST/PUT | 动作配置统一变量映射协议,兼容旧字段 |
| 新增 | /ai/business/trigger/scenario-templates |
GET | 查询触发器场景模板 |
| 调整 | /ai/business/engine/summary |
GET | 移除审批引擎、导入导出引擎统计 |
| 废弃 | /ai/business/approval/runtime |
GET | 不作为新页面调用入口,兼容期内转流程运行状态 |
| 废弃 | /ai/business/approval/start |
POST | 不作为新页面调用入口,兼容期内转流程发起 |
接口安全要求:
@SaCheckPermission。@ApiDecrypt,查询敏感配置需要 @ApiEncrypt。| 文件 | 变更方向 |
|---|---|
forge-admin-ui/src/views/app-center/index.vue |
入口收敛,不突出移动端中心、集成中心;业务对象卡片增加单据/流程状态摘要 |
forge-admin-ui/src/views/app-center/engines.vue |
移除审批引擎、导入导出引擎;优先展示流程、触发器、消息、权限、报表底座状态 |
forge-admin-ui/src/views/app-center/mobile.vue |
本阶段不暴露入口;可保留文件但菜单隐藏 |
forge-admin-ui/src/views/app-center/integration.vue |
本阶段不暴露入口;第三方推送从消息通道和触发器动作中体现 |
forge-admin-ui/src/views/app-center/trigger.vue |
触发器场景化配置、修复变量映射协议、补齐日志状态展示 |
forge-admin-ui/src/views/app-center/stats-dashboard.vue |
从通用统计升级为业务场景指标配置和展示 |
BusinessPermissionFlowPanel.vue |
从“数据权限”扩展为单据状态、流程绑定、按钮权限摘要 |
BusinessActionDesigner.vue |
“发起审批”改为“发起流程”,支持已发布流程选择、变量映射和按钮权限 |
forge-admin-ui/src/api/business-app.js |
新增 document/flow/scenario 接口,废弃 approval 新调用 |
| 类/模块 | 变更方向 |
|---|---|
BusinessFlowService |
升级为单据流程运行服务,负责流程发起、变量映射、状态查询、流程实例关联 |
BusinessApprovalRuntimeService |
废弃或兼容转发到流程运行服务,不再模拟返回 |
BusinessApprovalController |
废弃新调用入口,兼容期转发 |
BusinessTriggerService |
查询类 SQL 下沉 Mapper XML,新增场景模板与配置校验 |
BusinessTriggerExecutor |
实现创建记录、更新字段动作;Webhook 保持 TODO 状态和日志 |
BusinessEventPublisher |
单据状态字段标准化,增加流程结果事件 |
BusinessEngineSummaryService |
移除 APPROVAL、IMPORT_EXPORT 引擎统计 |
BusinessStatsService |
增加指标配置校验、金额字段聚合、流程结果分布 |
BusinessPermissionService |
增加按钮权限和单据动作权限摘要 |
DynamicCrudController |
保持事件发布,必要时补充单据运行上下文 |
cd forge && mvn clean compilecd forge-admin-ui && pnpm buildfield/variable 与后端 formField/flowVariable 不一致,必须优先修复或兼容。documentStatus / document_status,同时允许高级模式映射到已有字段;保存和发布检查必须校验字段存在。ai_crud_config。BusinessTriggerService 的分页查询。| Task | 状态 | 实际改动文件 | 备注 |
|---|---|---|---|
| Spec | completed | code-copilot/changes/lowcode-app-full-loop-optimization/spec.md |
已创建改造分析和需求 Spec |
| Task 0 | completed | spec.md, tasks.md |
确认 Phase 0 边界,保留历史页面兼容,冻结三方通道 TODO 边界 |
| Task 1 | completed | forge/db/migration/V1.0.47__add_business_document_flow_closure.sql |
新增单据配置表、流程实例关联表、触发器扩展字段,隐藏移动端/集成中心菜单 |
| Task 2 | completed | AiBusinessDocumentConfig.java, AiBusinessFlowInstanceLink.java, BusinessDocumentConfigMapper.java, BusinessFlowInstanceLinkMapper.java, BusinessDocumentConfigMapper.xml, BusinessFlowInstanceLinkMapper.xml, BusinessDocumentConfigDTO.java, BusinessFlowStartDTO.java, BusinessFlowCallbackDTO.java, BusinessDocumentConfigVO.java, BusinessDocumentRuntimeVO.java, BusinessFlowRuntimeVO.java |
建立单据和流程关联 Java 数据模型 |
| Task 3 | completed | BusinessDocumentController.java, BusinessDocumentConfigService.java, BusinessObjectPublishService.java, BusinessObjectDesignerService.java, BusinessObjectDesignerVO.java |
提供单据配置查询/保存,设计器带出单据配置,发布检查校验单据字段和默认流程 |
| Task 4 | completed | BusinessDocumentRuntimeService.java, BusinessDocumentController.java, BusinessPermissionService.java |
提供单据运行态查询,普通对象返回未启用,单据对象返回状态、流程摘要和可执行动作 |
| Task 5 | completed | BusinessFlowController.java, BusinessFlowService.java, BusinessTriggerController.java, BusinessFlowBindingDTO.java, BusinessFlowBindingVO.java |
新增 /ai/business/flow/binding/{objectCode},旧触发器路径兼容转发,变量映射统一输出 formField/flowVariable |
| Task 6 | completed | BusinessFlowController.java, BusinessFlowService.java, BusinessFlowInstanceLinkMapper.java, BusinessFlowInstanceLinkMapper.xml, BusinessDocumentRuntimeService.java, DynamicCrudService.java, BusinessTriggerExecutor.java, BusinessFlowRuntimeVO.java |
新增 /ai/business/flow/start 和 /status/{objectCode}/{recordId},真实调用 FlowClient.startProcess,写入流程实例关联并回写单据状态为流程中 |
| Task 7 | completed | BusinessFlowController.java, BusinessFlowService.java, BusinessEvent.java, BusinessEventPublisher.java, BusinessApprovalRuntimeService.java, BusinessApprovalController.java, BusinessFlowCallbackDTO.java, V1.0.49__add_business_flow_callback_permission.sql |
新增流程回调接口,按通过/驳回/撤回幂等回写单据状态并发布流程结果事件,旧审批发起接口转发到流程运行服务 |
| Task 8 | completed | BusinessTriggerMapper.java, BusinessTriggerMapper.xml, BusinessTriggerLogMapper.java, BusinessTriggerLogMapper.xml, BusinessTriggerService.java, BusinessTriggerController.java, AiBusinessTrigger.java, AiBusinessTriggerLog.java |
触发器和执行日志分页查询下沉 Mapper XML,分页继续使用 pageNum/pageSize,支持 scenarioType 筛选并补齐 TODO/关联日志字段 |
| Task 9 | completed | BusinessTriggerScenarioTemplateVO.java, BusinessTriggerController.java, BusinessTriggerService.java, BusinessTriggerExecutor.java, trigger.vue, business-app.js |
新增触发器场景模板接口,START_FLOW 变量映射统一保存 formField/flowVariable,执行端兼容历史 field/variable |
| Task 10 | completed | BusinessTriggerExecutor.java, DynamicCrudService.java, BusinessTriggerService.java, BusinessEventPublisher.java, AiBusinessTriggerLog.java |
创建记录和更新字段动作走受控内部 CRUD 方法,Webhook 返回 TODO 并写入 WEBHOOK_NOT_IMPLEMENTED、correlationId |
| Task 11 | completed | BusinessMessageChannelMapper.java, BusinessMessageChannelMapper.xml, BusinessMessageChannelService.java, BusinessMessageChannelStatus.java, BusinessTriggerExecutor.java |
站内信继续调用消息中心,企业微信/飞书/钉钉/Webhook 通道只返回 TODO;接收人规则扩展到 STARTER/OWNER/CREATOR/USERS/ROLES/DEPTS/ALL,日志不输出通道密钥 |
| Task 12 | completed | BusinessStatsController.java, BusinessStatsService.java, BusinessStatsMapper.java, BusinessStatsMapper.xml, BusinessStatsMetricQueryDTO.java, BusinessStatsMetricVO.java |
新增 /ai/business/stats/{configKey}/metrics,指标 SQL 下沉 XML,支持总量、今日、本月、状态/阶段分布、金额分值汇总和流程结果分布,非模型字段直接业务报错 |
| Task 13 | completed | BusinessPermissionService.java, BusinessPermissionMapper.java, BusinessPermissionMapper.xml, BusinessPermissionSummaryVO.java, BusinessObjectActionService.java, BusinessObjectDesignerController.java, BusinessObjectPublishService.java, V1.0.50__add_business_stats_and_action_permissions.sql |
增加单据动作权限摘要、动作保存权限标识校验、发布检查权限缺口提示,并补齐保存/提交/撤回/触发器执行/报表查看权限资源 |
| Task 14 | completed | BusinessEngineSummaryService.java, engines.vue, index.vue, suite.[suiteCode].vue, ObjectCard.vue, app-entry.vue, AppEditorDrawer.vue |
应用中心入口回到业务套件/对象主链路,后端和前端引擎摘要移除独立审批/导入导出类型,API 入口不再跳转独立集成中心 |
| Task 15 | completed | business-app.js, BusinessDocumentPanel.vue, BusinessObjectDesignerShell.vue, object-designer.[objectCode].vue |
新增单据配置/运行态和流程新协议前端 API,设计器增加单据设置面板,字段下拉来自当前业务对象字段 |
| Task 16 | completed | BusinessFlowBindingPanel.vue, BusinessActionDesigner.vue, BusinessObjectDesignerShell.vue, object-designer.[objectCode].vue |
设计器增加流程与自动化面板,自定义操作新增“发起流程”并保存 START_FLOW、formField/flowVariable 映射 |
| Task 17 | completed | trigger.vue, TriggerConditionBuilder.vue, TriggerActionConfigPanel.vue, business-app.js |
触发器接入场景模板、条件构造器和动作结构化配置,开发者模式保留原始 JSON 输入 |
| Task 18 | completed | stats-dashboard.vue, BusinessMetricPanel.vue, suite.[suiteCode].vue, business-app.js |
业务看板改用 /ai/business/stats/{configKey}/metrics,按对象字段推断状态/阶段/金额指标,金额分值前端格式化为元 |
| Task 19 | completed | V1.0.51__seed_crm_opportunity_document_flow.sql, DynamicCrudController.java, DynamicCrudService.java, BusinessTriggerExecutor.java |
初始化 CRM 商机单据状态字段、单据配置、流程绑定、自动发起流程触发器、审批结果站内信触发器和商机看板入口;新增记录事件改用创建后数据以携带 recordId |
| Task 20 | completed | V1.0.52__seed_leave_document_flow_demo.sql, BusinessTriggerExecutor.java |
初始化 HR 离职申请与离职交接样板对象、运行配置、单据流程绑定、日期条件自动发起流程和流程通过后创建交接记录触发器 |
| Task 21 | completed | V1.0.53__align_flow_template_logic_delete_column.sql, V1.0.54__patch_opportunity_flow_dept_manager_mapping.sql, BusinessFlowService.java, BusinessTriggerExecutor.java, MessageTemplateEngine.java, execution-log.md |
完成 Flyway 实跑、leave_multi 流程部署、商机手动发起流程、核心接口、后端 package、前端 build 和 git diff --check 验证 |
| Task 22 | completed | spec.md, tasks.md, execution-log.md, code-copilot/memory/pitfalls.md, code-copilot/memory/decisions.md |
回填 Phase 8 执行记录、审查结论、HARD-GATE 结论,并沉淀 Flyway 占位符与 Flowable 变量映射踩坑 |
git diff --check 通过。mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests 通过(JDK 17)。V1.0.51__seed_crm_opportunity_document_flow.sql 与 V1.0.52__seed_leave_document_flow_demo.sql 内嵌 JSON 片段离线解析通过。127.0.0.1:3407 MySQL 未运行,Flyway 迁移实跑验证留到 Phase 8 或数据库恢复后执行。git diff --check 通过。mvn -pl forge-admin-server -am package -DskipTests 通过,后端主应用及依赖模块 package 成功。pnpm build 通过;仅保留既有 UnoCSS 图标加载、CSS // 注释、动态/静态导入混用和 chunk size 警告。1.0.54,V1.0.53 补齐 sys_flow_template.del_flag,V1.0.54 补齐商机样板 deptManager 流程变量映射。leave_multi Flowable 流程定义,模型 ID e7d55f0a4087ec5dc0189784a00204ad,部署 ID dcbda981-5e14-11f1-a0fd-d67ed5f8e875,流程定义 version 1。/ai/business/flow/start 对 OPPORTUNITY/10 返回 code=200,流程实例 602ad5c2-5e15-11f1-a0fd-d67ed5f8e875,单据状态回写为 IN_PROCESS,流程待办进入 部门经理审批。/ai/business/document/config/1910000000000000104、/ai/business/document/OPPORTUNITY/10/runtime、/ai/business/flow/status/OPPORTUNITY/10、/ai/business/trigger/page?pageNum=1&pageSize=10、/ai/business/trigger/scenario-templates、/ai/business/stats/crm_opportunity/metrics 均返回 code=200。code-copilot/changes/lowcode-app-full-loop-optimization/execution-log.md。Phase 8 自检通过。当前变更已完成 Spec 定义的低代码业务单据闭环最小验证,包括数据库迁移、流程部署、商机单据发起流程、运行态状态查询、触发器分页/模板和业务指标接口验证。
遗留项:
// 注释、动态/静态导入混用和 chunk size 提示;未阻断构建。status: proposed created: 2026-06-02 priority: P0 source: 低代码应用运行态用户反馈
Phase 8 已经跑通低代码业务单据的最小闭环,但实际配置和使用时仍有明显断点:
/app-center/app/{appId} 中转页,再跳到 /ai/crud-page/{configKey},当前菜单无法稳定保持选中态,父级“应用总览”和套件目录会短暂闪动。MANUAL 或 BOTH 后,运行页没有自动出现可用的“发起流程”按钮,也没有自动绑定按钮事件。本阶段目标不是新增独立中心,而是把“配置完成即可使用”补齐为产品级体验。
/app-center 或父级目录。objectCode 交给后端。AiCrudPage 为新的运行时框架。BusinessAppService#syncManagementMenu 当前把管理端应用菜单固定注册到 /app-center/app/{id},组件为 app-center/app-entry。app-entry.vue 对 RUNTIME 入口调用 businessAppOpenInfo 后执行 router.replace(info.targetUrl),最终路由变成 /ai/crud-page/{configKey}。useMenu.activeKey 主要通过当前 route.path 和菜单 path 匹配选中项,最终运行页没有与动态应用菜单 path 相同的菜单项,因此选中态丢失。BusinessDocumentPanel.vue 的编号规则是普通输入框,状态映射是原始值输入。BusinessFlowBindingPanel.vue 和 TriggerActionConfigPanel.vue 的流程变量名仍需要手填。AiCrudPage.vue 当前只内置处理新增、编辑、详情、删除、路由跳转和外链,自定义 START_FLOW 没有运行态执行分支。trigger.vue 全局新增触发器时允许空对象进入弹窗,后端 BusinessTriggerService#validateTrigger 会抛出“业务对象编码不能为空”。/app-center/app/{appId} 中转后丢失菜单归属。RUNTIME 菜单可以直接注册为 /ai/crud-page/{configKey},并通过 query 或 meta 携带 appId/menuKey/menuResourceId;如果继续保留中转页,也必须在跳转后保留 active menu key。BusinessAppOpenInfoVO 需要返回当前入口的 activeMenuKey、menuResourceId、targetRoute 和 runtimeOpenMode,前端打开时按这些字段写入路由 query。useMenu.activeKey 需要优先识别 route.query.menuKey、route.query.appId 或 route.meta.parentKey,再按路径匹配。/ai/crud-page/{configKey}?appId=...&menuKey=... 后,仍能恢复同一个应用菜单选中态。LIST 列表管理、CREATE_FORM 新增填报、DETAIL 详情查看。LIST;启用单据模式且入口名称/类型为填报类时默认建议 CREATE_FORM。CREATE_FORM 模式打开 /ai/crud-page/{configKey}?mode=create&appId=...&menuKey=... 后,运行页自动打开新增表单。${yyyy}、${yyyyMM}、${yyyyMMdd}、${HHmmss}、${seq}、${seq:4}、${suiteCode}、${objectCode}、${starter}、${deptCode}、${field:<fieldCode>}。ai_business_binding 的 binding_type=FLOW 配置;ai_business_document_config.default_flow_key 仅保留兼容读取或同步快照。${variable}、审批人 SPEL 表达式、flowable:assignee/candidateUsers/candidateGroups 中的变量、动态表单字段、流程模板变量配置、流程引擎内置变量。initiator、startUserId、businessKey、recordId、objectCode、deptId、deptManager。amount、opportunityAmount、deptManager。formField 和 flowVariable,旧协议 field 和 variable 继续兼容读取。MANUAL 或 BOTH 时,运行态自动生成“发起流程”按钮,不要求用户在自定义操作里手动添加。/ai/business/flow/start,payload 至少包含 objectCode、recordId、flowModelKey、titleTemplate 或主流程绑定引用。ai:businessFlow:start 权限和单据状态,前端隐藏不是安全边界。objectCode,新增弹窗自动带入并锁定或默认选中当前对象。objectCode、triggerName、eventType、actionType、actionConfig,不允许把空对象编码提交给后端。TRIGGER 或 BOTH,下一步进入触发器配置并自动带入对象和流程。| 类型 | 位置 | 变更 |
|---|---|---|
| 复用 | ai_business_app.options |
增加 runtimeOpenMode, activeMenuKey, adminMenu.menuResourceId 回显使用,不新增表字段 |
| 复用 | ai_business_document_config.options |
保存编号规则预览配置、状态动作策略和兼容标记 |
| 复用 | ai_business_binding.binding_config |
作为主流程配置事实来源,保存流程模型、变量映射、标题模板、发起方式和条件流程 |
| 复用 | ai_business_object.designer_options |
保存自定义按钮覆盖配置,自动按钮不强制写入此处 |
| 可选 | sys_resource |
如调整应用菜单 path 或组件,需要用新 Flyway 脚本修复已有动态应用菜单,不修改历史脚本 |
数据约束:
tenant_id=1,并具备 NOT EXISTS 或按 menuResourceId 防重复保护。ai_business_document_config.default_flow_key 和 ai_business_binding 不一致时,以 ai_business_binding 为准,并在保存时回写兼容字段。| 操作 | 接口 | 方法 | 说明 |
|---|---|---|---|
| 调整 | /ai/business/app/{id}/open-info |
GET | 返回 activeMenuKey, menuResourceId, targetRoute, runtimeOpenMode |
| 调整 | /ai/business/app |
POST/PUT | 保存入口时校验并保存 runtimeOpenMode,同步菜单时保留菜单归属 |
| 新增 | /ai/business/document/no-rule/tokens |
GET | 返回编号规则内置变量、说明、示例和适用范围 |
| 新增 | /ai/business/document/no-rule/preview |
POST | 按对象、规则和样例数据返回编号预览和校验结果 |
| 调整 | /ai/business/document/config/{objectId} |
GET/PUT | 单据配置返回主流程摘要,不再把 defaultFlowKey 作为唯一流程配置入口 |
| 调整 | /ai/business/flow/binding/{objectCode} |
GET/PUT | 返回流程变量候选项摘要、自动映射建议和配置完整度 |
| 新增 | /ai/business/flow/model/{modelKey}/variables |
GET | 返回流程变量候选项,供单据流程和触发器动作配置使用 |
| 调整 | /ai/business/flow/start |
POST | 支持运行态自动按钮发起,返回流程实例和单据状态摘要 |
| 调整 | /ai/business/trigger |
POST/PUT | 后端继续校验对象编码,前端提交前必须拦截空对象 |
接口安全要求:
@SaCheckPermission。| 文件 | 变更方向 |
|---|---|
forge-admin-ui/src/composables/useMenu.js |
activeKey 支持 menuKey/appId 优先匹配,避免动态应用菜单失焦 |
forge-admin-ui/src/utils/menu-utils.js |
保持路径匹配能力,必要时支持 query 中的菜单归属解析 |
forge-admin-ui/src/views/app-center/app-entry.vue |
中转页保留菜单归属 query;RUNTIME 可直接 replace 到带 menuKey 的目标路由 |
forge-admin-ui/src/views/app-center/components/AppEditorDrawer.vue |
增加运行态打开模式,保存到 options.runtimeOpenMode |
forge-admin-ui/src/views/ai/crud-page.vue |
支持 mode=create 自动打开新增表单;向 AiCrudPage 传入单据运行态和自动流程按钮配置 |
forge-admin-ui/src/components/ai-form/AiCrudPage.vue |
增加 START_FLOW 自定义动作执行分支和自动流程按钮渲染 |
BusinessDocumentPanel.vue |
编号规则变量选择、预览、状态映射表格化,移除独立流程选择器 |
BusinessFlowBindingPanel.vue |
主流程配置、流程变量候选项、自动映射建议、标题模板变量插入和预览 |
BusinessActionDesigner.vue |
发起流程按钮变成覆盖配置,避免和自动按钮重复 |
trigger.vue |
新增触发器前置业务对象选择、query 默认对象、提交前阻断 |
TriggerActionConfigPanel.vue |
START_FLOW 变量下拉选择,复用流程变量候选项和标题模板编辑器 |
BusinessObjectDesignerShell.vue |
增加单据闭环配置步骤条和配置完成度摘要 |
| 类/模块 | 变更方向 |
|---|---|
BusinessAppService |
保存运行态打开模式,调整菜单同步时的 path 或菜单归属信息,保留已有授权 |
BusinessAppOpenService |
open-info 返回目标路由、菜单归属和打开模式 |
BusinessDocumentConfigService |
单据配置与主流程绑定联动,兼容 default_flow_key |
BusinessFlowService |
提供主流程完整度、变量候选项摘要、自动映射建议和运行态发起结果 |
BusinessTriggerService |
场景模板补齐默认动作配置,错误文案保持明确 |
BusinessObjectPublishService |
发布检查增加菜单选中态、运行态打开模式、自动按钮和触发器串联检查 |
FlowClient 或业务侧适配服务 |
获取流程模型详情并解析变量候选项,避免前端直接解析完整 BPMN |
MenuRegisterAdapter |
如菜单 path 变更,需要支持更新已有菜单且不丢角色授权 |
${yyyyMMdd}、${seq} 等语法。/ai/business/flow/start 并刷新状态。objectCode。LIST 和 CREATE_FORM,确认普通对象不自动弹表单,单据填报入口自动弹新增表单。cd forge && mvn -pl forge-admin-server -am package -DskipTests,cd forge-admin-ui && pnpm build。code-copilot/rules/automated-testing-standard.md,并把命令、结果、警告和跳过项追加到 execution-log.md。sys_resource.id。/app-center/app/{id} 中转页,不能直接删除该路由。default_flow_key 和 ai_business_binding 可能存在历史不一致,必须给出迁移优先级和页面提示。START_FLOW 动作和位置去重。START_FLOW 动作复用同一套配置体验。MANUAL 或 BOTH 时,前端可自动渲染“发起流程”行操作并调用 /ai/business/flow/start。objectCode query 自动带入上下文,保存前不再把空对象编码提交给后端。forge-plugin-generator 及依赖模块 compile 通过,前端 pnpm build 通过,git diff --check 通过。接口联调和浏览器点击验证因本轮未启动服务/数据库记录为跳过项。当前触发器表结构和前端已经预留 SCHEDULE/到期提醒配置,但真实执行链路仍只依赖业务事件发布。BusinessTriggerMapper.selectActiveByObjectAndEvent 还限定 trigger_type='EVENT',因此定时触发器不会被执行。用户明确要求补齐定时触发能力,同时注意效率和执行间隔,避免过于频繁扫描。
triggerType=SCHEDULE,兼容历史 SCHEDULED。SCHEDULED_DUE。eventCondition.schedule,至少包含:
dueField:到期日期/时间字段,必填。lookAheadDays:提前扫描天数,默认 0。lookBehindDays:回看天数,默认 0。batchSize:单轮处理条数,默认 50,最大 200。minIntervalMinutes:同一触发器最小扫描间隔,默认 5。0 0/5 * * * ?,可通过任务中心调整,但不得默认秒级轮询。SCHEDULE 到期提醒触发器,扫描器执行后写入 ai_business_trigger_log,同一记录当天不重复。BusinessTriggerSchedulerService 并注册为系统任务中心任务:任务名 lowcodeBusinessTriggerScanJob,分组 LOWCODE,默认 cron 0 0/5 * * * ?,每轮最多扫描有限数量触发器,单触发器默认处理 50 条、最大 200 条候选记录。forge:business-trigger:schedule:scan,未抢到锁的节点直接跳过本轮;记录级锁按 tenantId + triggerId + recordId + naturalDay 生成。RedissonClient 通过 ObjectProvider 可选注入;未检测到 Redisson 时仍可依赖任务调度中心集群触发和日志去重,生产如需手动并发兜底建议启用 Redis/Redisson。ScheduleConfig 的 Quartz 集群配置:forge.job.clustered 默认 true,并支持 thread-pool-size、cluster-checkin-interval、misfire-threshold、table-prefix 配置。DynamicCrudService.selectScheduledCandidateRows,按字段区间和批量上限查询,不拼接未校验业务表字段。SUCCESS/TODO 日志的 triggerId + recordId + SCHEDULED_DUE 不再重复执行;每次有效扫描后回写扫描时间,减少无候选数据触发器的重复优先扫描。forge-plugin-generator、forge-plugin-job 及依赖模块 compile 通过,前端 pnpm build 通过,git diff --check 通过。未启动后端服务、数据库或多实例环境,真实 Quartz 集群触发、任务中心注册和落库去重验证记录为跳过项。SINGLE/单表对象仍可选择“列表管理”或“单据填报”。originalParentId,避免套件父目录实际挂载后编辑回填丢失。designerOptions.actions,发布时必须注入运行态 table zone 的 customActions,并由运行态列表合并到操作列。runtimeOpenMode 缺省值按 LIST 处理,不再作为“未配置”警告;只有存在非法值时才提示配置错误。options.adminMenu 中按字符串保存,避免雪花 Long 被前端 JSON.parse 转 Number 后丢精度。adminMenuParentId、menuResourceId 回填和保存。FLOW 绑定,并兼容历史 APPROVAL 绑定;旧空绑定或停用绑定不应抢先导致“请先配置主流程”误报。/ai/crud-page 运行态工具栏中,add/create/新增 这类标准新增动作由 AiCrudPage 内置新增按钮承载,不应再作为自定义 toolbar action 渲染第二个“新增”。FLOW 绑定曾被停用,保存后必须同步置为启用,避免页面显示已配置但运行态发起仍认为无可用主流程。binding_config.flowModelKey 和配置预览,便于定位是对象编码、租户、绑定状态还是配置内容不一致。adminMenu.actualParentId/suiteMenuResourceId 并在编辑抽屉中只读回显,避免用户误以为父级未回填。domain_id。LowcodePublishService 现在会按业务域父链递归解析目录父级,发布时生成或更新的领域目录会落到正确的上级目录下。MenuRegisterAdapterImpl 支持领域目录在父级变化时自动迁移,避免重复创建同名目录。LowcodeAppService 的总览分页已改为按当前领域及子树领域取数,选中父业务域时不会出现“父节点空白、子节点有数据却看不到”的错觉。pnpm build 通过,git diff --check 通过。真实菜单落库与浏览器回显验证因未启动后端/数据库/前端 dev server 记录为跳过项。forge-admin-ui/src/views/app-center/index.vue 的应用总览,不是低代码构建器 ai_lowcode_domain 页面。ai_business_suite,因此新增 parent_id 字段和索引,并在 BusinessSuiteDTO/VO/SummaryVO 中透出父级。BusinessSuiteService 负责业务套件父级循环校验、子业务域删除拦截和业务套件菜单目录递归解析;访问入口菜单同步复用该递归解析能力。parentId 渲染成树,节点三点菜单提供“新增子目录 / 编辑信息 / 启停 / 删除”。suiteCode,对象和入口查询通过 suiteCodes 聚合返回父子业务域数据。git diff --check、应用总览相关 Vue 文件 ESLint、后端 generator/admin 编译均通过。未启动数据库、后端服务或浏览器,真实 Flyway 执行、菜单落库和页面点击回显仍需环境可用时补验。