status: proposed created: 2026-06-13 spec:
code-copilot/changes/formula-next-capabilities/spec.mdbase:code-copilot/changes/formula-capability-extension/
| Task | 名称 | 状态 | 优先级 | 阶段 |
|---|---|---|---|---|
| Task 1 | 执行日志库表与持久化模型 | completed | P0 | Phase 1 |
| Task 2 | 公式执行 Trace 数据结构 | completed | P0 | Phase 1 |
| Task 3 | 运行时接入 Trace 与执行日志 | completed | P0 | Phase 1 |
| Task 4 | 执行日志查询 API | completed | P0 | Phase 1 |
| Task 5 | 公式调试器后端 API | completed | P0 | Phase 1 |
| Task 6 | Dependency 图后端 API | completed | P0 | Phase 1 |
| Task 7 | 公式可观测性前端组件 | completed | P0 | Phase 1 |
| Task 8 | LOOKUP / 跨对象公式领域模型扩展 | completed | P1 | Phase 2 |
| Task 9 | LOOKUP 公式解析与执行 | completed | P1 | Phase 2 |
| Task 10 | 一跳跨对象路径解析与批量预取 | completed | P1 | Phase 2 |
| Task 11 | 跨对象发布校验与重算策略 | completed | P1 | Phase 2 |
| Task 12 | LOOKUP / 跨对象公式前端配置 | completed | P1 | Phase 2 |
| Task 13 | 条件规则 AST 与编译 API | completed | P2 | Phase 3 |
| Task 14 | 条件规则设计器前端组件 | completed | P2 | Phase 3 |
| Task 15 | 函数注册表库表与持久化模型 | completed | P3 | Phase 4 |
| Task 16 | 函数注册中心与表达式引擎集成 | completed | P3 | Phase 4 |
| Task 17 | 函数市场后端 API | completed | P3 | Phase 4 |
| Task 18 | 函数市场与动态函数选择前端 | completed | P3 | Phase 4 |
| Task 19 | 安全、权限、脱敏与配置开关 | completed | P0 | Hardening |
| Task 20 | 自动化测试与执行日志回填 | completed | P0 | Validation |
tenant_id 使用 1。涉及文件
forge-server/db/migration/V1.0.69__add_formula_observability_and_function_market.sqlforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/entity/AiFormulaExecutionLog.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/mapper/FormulaExecutionLogMapper.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/resources/mapper/FormulaExecutionLogMapper.xmlforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/formula/FormulaExecutionLogQueryDTO.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/formula/FormulaExecutionLogResponse.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaExecutionLogService.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/FormulaExecutionLogServiceTest.java执行要点
ai_formula_execution_log 表,字段覆盖 Spec 6.5。input_snapshot 使用 JSON 或 TEXT,写入前必须走脱敏工具。selectFormulaExecutionLogPage 和 selectFormulaExecutionLogById。pageNum + pageSize。record(FormulaExecutionLogResponse log)、page(FormulaExecutionLogQueryDTO query)、detail(Long id)。验证命令
mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaExecutionLogServiceTest
验收标准
执行记录
ai_formula_execution_log 表、实体、Mapper/XML、查询 DTO、响应 DTO、Service 与单测文件。/private/tmp/FormulaExecutionLogServiceSmoke.java 临时 runner 验证。涉及文件
forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/formula/FormulaExecutionTrace.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/formula/FormulaExecutionStep.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/formula/FormulaTraceOptions.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/formula/ExecutionResult.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/domain/formula/FormulaExecutionTraceTest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/domain/formula/ExecutionResultTest.java执行要点
FormulaExecutionTrace 保存 traceId、executionPlan、steps、elapsedMs、errors。FormulaExecutionStep 保存 fieldCode、formulaType、expression、input、output、elapsedMs、success、errorMessage、metadata。FormulaTraceOptions 支持 enabled、includeInputSnapshot、includeOutputValue、debugMode。ExecutionResult 保持 V1 兼容,新增可空 trace 字段。验证命令
mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaExecutionTraceTest,ExecutionResultTest
验收标准
ExecutionResult 行为不变。ExecutionResult 旧单测继续通过。执行记录
FormulaExecutionTrace、FormulaExecutionStep、FormulaTraceOptions,并为 ExecutionResult 增加可空 trace 字段。/private/tmp/FormulaExecutionTraceSmoke.java 临时 runner 验证。涉及文件
forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaExecutionEngine.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/AbstractFormulaRuntime.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/StoredFormulaRuntime.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/VirtualFormulaRuntime.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/formula/FormulaErrorHandler.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/FormulaExecutionEngineTest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/StoredFormulaRuntimeTest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/VirtualFormulaRuntimeTest.java执行要点
FormulaExecutionEngine.execute 增加带 FormulaTraceOptions 的重载方法。FormulaExecutionStep。FormulaExecutionLogService.record。traceId,便于从应用日志反查业务日志。验证命令
mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaExecutionEngineTest,StoredFormulaRuntimeTest,VirtualFormulaRuntimeTest
验收标准
执行记录
FormulaExecutionEngine.execute(..., FormulaTraceOptions)、运行时失败/调试日志接入和 traceId 错误日志。/private/tmp/FormulaRuntimeTraceSmoke.java 临时 runner 验证。涉及文件
forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/FormulaController.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/formula/FormulaExecutionLogDetailResponse.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/controller/FormulaControllerTest.java执行要点
GET /api/ai/business/formula/log/page。GET /api/ai/business/formula/log/{id}。pageNum + pageSize。RespInfo.success(data)。验证命令
mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaControllerTest
验收标准
执行记录
GET /api/ai/business/formula/log/page 与 GET /api/ai/business/formula/log/{id}。FormulaExecutionLogDetailResponse,Controller 统一使用 pageNum + pageSize 绑定查询参数。/private/tmp/FormulaControllerLogSmoke.java 临时 runner 验证。涉及文件
forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/formula/FormulaDebugRequest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/formula/FormulaDebugResponse.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaDebugService.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/FormulaController.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/FormulaDebugServiceTest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/controller/FormulaControllerTest.java执行要点
POST /api/ai/business/formula/debug。fieldCode,也支持调试当前对象全部公式。sampleValues,输出 traceId、executionPlan、steps、errors。验证命令
mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaDebugServiceTest,FormulaControllerTest
验收标准
price * quantity 返回每一步输入和输出。执行记录
POST /api/ai/business/formula/debug、FormulaDebugRequest、FormulaDebugResponse 与 FormulaDebugService。FormulaExecutionLogService。conditionResult、conditionMatched、trueValue、falseValue,前端可直接展示分支命中。/private/tmp/FormulaDebugServiceSmoke.java 临时 runner 验证。涉及文件
forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/formula/FormulaDependencyGraphRequest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/formula/FormulaDependencyGraphResponse.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/formula/FormulaDependencyGraphNode.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/formula/FormulaDependencyGraphEdge.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaDependencyGraphService.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/FormulaController.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/FormulaDependencyGraphServiceTest.java执行要点
POST /api/ai/business/formula/dependency/graph。DependencyAnalysisResult 转换为 nodes / edges。cyclePath。验证命令
mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaDependencyGraphServiceTest
验收标准
hasCycle = true 且 cyclePath 不为空。执行记录
POST /api/ai/business/formula/dependency/graph。FormulaDependencyGraphRequest、FormulaDependencyGraphResponse、FormulaDependencyGraphNode、FormulaDependencyGraphEdge。FormulaDependencyGraphService,将现有 DAG 分析结果转换为 nodes / edges,支持 FIELD、FORMULA、RELATION 节点和 DEPENDS_ON、AGGREGATE 边。/private/tmp/FormulaDependencyGraphSmoke.java 临时 runner 验证。涉及文件
forge-admin-ui/src/api/formula.jsforge-admin-ui/src/views/app-center/components/designer/formula/FormulaDebuggerPanel.vueforge-admin-ui/src/views/app-center/components/designer/formula/FormulaExecutionLogDrawer.vueforge-admin-ui/src/views/app-center/components/designer/formula/FormulaDependencyGraph.vueforge-admin-ui/src/views/app-center/components/designer/formula/FormulaTraceSteps.vueforge-admin-ui/src/views/app-center/components/designer/BusinessFieldPropertyPanel.vueforge-admin-ui/src/views/app-center/components/designer/BusinessFieldManager.vueforge-admin-ui/src/views/app-center/object-designer.[objectCode].vue执行要点
formula.js 新增 debugFormula、getFormulaLogPage、getFormulaLogDetail、getDependencyGraph。验证命令
source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm --dir forge-admin-ui exec eslint src/api/formula.js src/views/app-center/components/designer/formula/*.vue src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue src/views/app-center/object-designer.[objectCode].vue
source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
验收标准
执行记录
formula.js 调试、日志、依赖图 API 封装。BusinessFieldManager 向属性面板透传 objectCode,用于调试请求和日志筛选。涉及文件
forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/formula/FormulaType.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/formula/FormulaConfig.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/formula/LookupConfig.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/formula/CrossObjectConfig.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/formula/CrossObjectRecomputeMode.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/businessapp/BusinessFieldDTO.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/vo/businessapp/BusinessFieldVO.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/domain/formula/FormulaConfigTest.java执行要点
FormulaType 新增 LOOKUP。FormulaConfig 新增 lookup、crossObject、rule、functionRefs,并保持 V1 JSON 兼容。LookupConfig 非空。formulaConfig JSON 透传,不破坏旧字段。验证命令
mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaConfigTest
验收标准
执行记录
FormulaType.LOOKUP、LookupConfig、CrossObjectConfig、CrossObjectRecomputeMode。FormulaConfig 新增 lookup、crossObject、rule、functionRefs,保留 builder 不可变风格并补充 Jackson 反序列化兼容。AggregateConfig、ConditionConfig 补充 Jackson 构造注解,旧 CALC / AGGREGATE / CONDITIONAL JSON 可直接反序列化。AbstractFormulaRuntime、FormulaPublishValidator 支持从字段 formulaConfig Map 解析 LOOKUP / crossObject 元数据。BusinessFieldDTO、BusinessFieldVO 注释更新为 CALC / AGGREGATE / CONDITIONAL / LOOKUP JSON 透传。/private/tmp/FormulaConfigSmoke.java 临时 runner 验证。涉及文件
forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaLookupResolver.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/LookupResolveResult.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaExecutionEngine.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaValidationService.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/formula/FormulaDependencyAnalyzer.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/formula/FormulaDebugRequest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/formula/FormulaDependencyGraphRequest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaDebugService.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaDependencyGraphService.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/FormulaLookupResolverTest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/FormulaExecutionEngineTest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/FormulaExecutionEngineLookupTest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/domain/formula/FormulaDependencyAnalyzerTest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/FormulaValidationServiceTest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/FormulaDependencyGraphServiceTest.java执行要点
relationCode 和对象关系元数据解析目标对象。sourceField 值匹配目标对象 targetField,返回 returnField。notFoundValue。验证命令
mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaLookupResolverTest,FormulaExecutionEngineLookupTest,FormulaDependencyAnalyzerTest,FormulaValidationServiceTest,FormulaDependencyGraphServiceTest
验收标准
执行记录
FormulaLookupResolver 与 LookupResolveResult,LOOKUP 只接收关系/对象/字段元数据,数据库路径内部解析目标对象模型与物理列,不暴露表名或 SQL 配置。FormulaExecutionEngine 接入 LOOKUP 执行分支,命中返回目标字段值,未命中按 notFoundValue 成功降级,resolver 失败走公式错误处理并在 trace metadata 输出 relationCode、targetObjectCode、sourceField、targetField、returnField、lookupMatched。FormulaValidationService 支持 LOOKUP 空表达式校验,拦截 path-style relationCode;FormulaDependencyAnalyzer 将 LOOKUP sourceField 纳入拓扑排序、深度和字段存在性校验。FormulaExecutionEngineTest.java 是非 UTF-8 旧文件,未做编码转换;新增 FormulaExecutionEngineLookupTest 独立覆盖 LOOKUP 引擎行为。/private/tmp/FormulaLookupSmoke.java 临时 runner 验证。涉及文件
forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/CrossObjectPath.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaCrossObjectResolver.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaReferenceResolver.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/VirtualFormulaRuntime.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/DetailRecordFetcher.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/DynamicDetailRecordFetcher.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/DynamicCrudRepository.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/formula/FormulaDebugRequest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/formula/FormulaDependencyGraphRequest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaDebugService.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaDependencyGraphService.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/FormulaCrossObjectResolverTest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/VirtualFormulaRuntimeTest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/FormulaDependencyGraphServiceTest.java执行要点
relationAlias.fieldCode,例如 customer.level。a.b.c 多跳路径。验证命令
mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaCrossObjectResolverTest,VirtualFormulaRuntimeTest,FormulaDependencyGraphServiceTest
验收标准
执行记录
CrossObjectPath、FormulaCrossObjectResolver、FormulaReferenceResolver,支持 relationAlias.fieldCode 一跳路径解析,多跳和非法路径直接拒绝。VirtualFormulaRuntime 对包含 crossObject 的 VIRTUAL 公式先复制记录、批量预取目标对象值、执行公式,再只把公式结果回写原记录,避免泄漏内部嵌套对象上下文。DetailRecordFetcher 增加批量读取默认方法,DynamicDetailRecordFetcher 使用 DynamicCrudRepository.selectListByColumnIn 单次查询目标对象记录,避免列表场景 N+1。crossObject 配置解析;依赖图输出 CROSS_OBJECT 边。/private/tmp/FormulaCrossObjectSmoke.java 临时 runner 验证。涉及文件
forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaObjectDependencyAnalyzer.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/CrossObjectRecomputeTaskService.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaPublishValidator.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessObjectPublishService.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/FormulaObjectDependencyAnalyzerTest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/FormulaPublishValidatorTest.java执行要点
验证命令
mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaObjectDependencyAnalyzerTest,FormulaPublishValidatorTest
验收标准
执行记录
FormulaObjectDependencyAnalyzer,发布期可将跨对象公式转换为对象图边并检测对象级循环依赖。CrossObjectRecomputeTaskService,为 STORED 跨对象公式生成 PENDING 待重算任务,幂等键格式为 objectCode:recordId:fieldCode:dependencyTrace。FormulaPublishValidator 新增对象图上下文校验重载,保留旧 validate(modelSchema) 兼容入口。BusinessObjectPublishService 在发布检查中接入对象图校验,并在发布成功后为当前对象生成跨对象公式待重算任务。/private/tmp/FormulaObjectDependencySmoke.java 临时 runner 验证。涉及文件
forge-admin-ui/src/api/formula.jsforge-admin-ui/src/views/app-center/components/designer/formula/FormulaConfigPanel.vueforge-admin-ui/src/views/app-center/components/designer/formula/FormulaLookupPanel.vueforge-admin-ui/src/views/app-center/components/designer/formula/FormulaCrossObjectPanel.vueforge-admin-ui/src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue执行要点
BusinessFieldPropertyPanel.vue 中拆到 FormulaConfigPanel.vue。验证命令
source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm --dir forge-admin-ui exec eslint src/views/app-center/components/designer/formula/*.vue src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue src/api/formula.js
source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
验收标准
执行记录
FormulaConfigPanel.vue 承载公式基础配置、表达式校验、预览、调试、执行日志和依赖图入口。FormulaLookupPanel.vue,支持 relationCode、targetObjectCode、sourceField、targetField、returnField、notFoundValue 配置,并在 LOOKUP payload 中保持 V1 兼容。FormulaCrossObjectPanel.vue,通过关系选择生成一跳 relationCode.returnField 路径,不提供自由多跳输入。BusinessFieldPropertyPanel.vue 改为引用公式配置组件,旧 CALC / AGGREGATE / CONDITIONAL 配置仍可回显,LOOKUP 和跨对象配置会同步到调试器、依赖图请求。git diff --check 均通过;本地 preview 冒烟因当前沙箱禁止监听 127.0.0.1:4174 未执行到浏览器步骤,已记录为环境边界。涉及文件
forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/formula/ConditionRuleNode.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/formula/ConditionRuleOperator.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/ConditionRuleCompiler.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/formula/ConditionRuleCompileRequest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/formula/ConditionRuleCompileResponse.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/FormulaController.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/ConditionRuleCompilerTest.java执行要点
POST /api/ai/business/formula/rule/compile 返回表达式。POST /api/ai/business/formula/rule/validate 校验字段、操作符和值类型。验证命令
mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=ConditionRuleCompilerTest,FormulaControllerTest
验收标准
amount > 1000 AND status = ACTIVE 编译为 amount > 1000 && status == 'ACTIVE'。执行记录
ConditionRuleNode、ConditionRuleOperator,支持 AND / OR 分组与 EQ、NE、GT、GTE、LT、LTE、IN、NOT_IN、CONTAINS、STARTS_WITH、ENDS_WITH、IS_NULL、NOT_NULL 条件操作符。ConditionRuleCompiler,将规则 AST 编译为受控 Aviator 表达式,并校验字段、操作符、集合值和基础值类型。ConditionRuleCompileRequest、ConditionRuleCompileResponse,Controller 增加 POST /api/ai/business/formula/rule/compile 和 /rule/validate。ConditionRuleCompilerTest,扩展 FormulaControllerTest 覆盖 compile / validate 路由。/private/tmp/ConditionRuleCompilerSmoke.java 临时 runner 验证。涉及文件
forge-admin-ui/src/api/formula.jsforge-admin-ui/src/views/app-center/components/designer/formula/FormulaConditionRuleDesigner.vueforge-admin-ui/src/views/app-center/components/designer/formula/FormulaConditionRuleNode.vueforge-admin-ui/src/views/app-center/components/designer/formula/FormulaConfigPanel.vueforge-admin-ui/src/views/app-center/components/designer/formula/FormulaDebuggerPanel.vue执行要点
验证命令
source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm --dir forge-admin-ui exec eslint src/views/app-center/components/designer/formula/*.vue src/api/formula.js
source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
验收标准
amount > 1000 && status == 'ACTIVE'。执行记录
FormulaConditionRuleNode.vue,支持递归 AND / OR 分组、条件节点新增/删除、字段/操作符/值编辑。FormulaConditionRuleDesigner.vue,规则变更时本地生成表达式快照,并调用 /rule/compile 做后端校验。FormulaConfigPanel.vue 的 CONDITIONAL 配置改为“表达式 / 规则设计”模式切换,规则模式保存 rule JSON 和编译后的 expression 快照。BusinessFieldPropertyPanel.vue 支持旧表达式模式回显、rule JSON 回显、规则编译错误纳入本地校验和保存 payload。FormulaDebuggerPanel.vue 调试请求透传 rule,并根据调试上下文展示规则分组和叶子条件命中状态。git diff --check 均通过;本地浏览器点击冒烟因当前沙箱端口监听限制未执行,仍沿用 Task 12 记录的环境边界。涉及文件
forge-server/db/migration/V1.0.69__add_formula_observability_and_function_market.sqlforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/entity/AiFormulaFunction.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/entity/AiFormulaFunctionVersion.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/entity/AiFormulaFunctionInstall.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/mapper/FormulaFunctionMapper.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/resources/mapper/FormulaFunctionMapper.xmlforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/FormulaFunctionPersistenceTest.java执行要点
ai_formula_function、ai_formula_function_version、ai_formula_function_install。INSERT ... SELECT ... WHERE NOT EXISTS。tenant_id 使用 1。验证命令
mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaFunctionPersistenceTest
验收标准
执行记录
ai_formula_function、ai_formula_function_version、ai_formula_function_install 表结构,迁移脚本具备 CREATE TABLE IF NOT EXISTS 和 seed WHERE NOT EXISTS 防重复保护,内置数据 tenant_id 使用 1。AiFormulaFunction、AiFormulaFunctionVersion、AiFormulaFunctionInstall 实体和 FormulaFunctionMapper / XML,提供分页、详情、版本和安装状态查询。FormulaFunctionPersistenceTest,覆盖函数元数据、版本元数据、安装状态和 Mapper 方法签名。/private/tmp/FormulaFunctionPersistenceSmoke.java 临时 runner 验证通过。涉及文件
forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaFunctionRegistry.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaFunctionDefinition.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaFunctionInvoker.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaBuiltinFunctionProvider.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/formula/ExpressionExecutor.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaValidationService.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaExecutionEngine.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/FormulaController.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/FormulaFunctionRegistryTest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/domain/formula/ExpressionExecutorTest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/FormulaValidationServiceTest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/controller/FormulaControllerTest.java执行要点
验证命令
mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaFunctionRegistryTest,ExpressionExecutorTest,FormulaValidationServiceTest
验收标准
执行记录
FormulaFunctionDefinition、FormulaBuiltinFunctionProvider、FormulaFunctionInvoker、FormulaFunctionRegistry,内置函数和后续市场函数统一走 Java Bean 注册路径。FormulaController.functions() 已从硬编码列表切换为 FormulaFunctionRegistry.listEnabledResponses()。ExpressionExecutor 在编译/执行前安装注册函数;FormulaValidationService 在表达式校验中阻断禁用函数、未支持实现和受管命名空间未注册函数;FormulaExecutionEngine 的 Spring 注入路径复用注册中心。/private/tmp/FormulaFunctionRegistrySmoke.java 临时 runner 验证通过。涉及文件
forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/formula/FormulaFunctionMarketQueryDTO.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/formula/FormulaFunctionInstallRequest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaFunctionMarketService.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/FormulaController.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/FormulaFunctionMarketServiceTest.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/controller/FormulaControllerTest.java执行要点
验证命令
mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaFunctionMarketServiceTest,FormulaControllerTest
验收标准
执行记录
FormulaController.functions() 切换为市场服务返回已安装且启用的函数。FormulaFunctionMarketQueryDTO、FormulaFunctionInstallRequest、FormulaFunctionMarketResponse、FormulaFunctionMarketService,Mapper XML 提供市场分页、详情、已启用函数列表和安装状态 upsert。@OperationLog;XML upsert 前由 Service 显式生成 IdWorker 主键,避免 ASSIGN_ID 在手写 XML insert 中不生效。FormulaValidationService 在 Spring 注入路径下使用 FormulaFunctionMarketService.validateFunctionReferences(),禁用或未启用的市场函数会阻断公式校验。V1.0.69__add_formula_observability_and_function_market.sql 已补齐注册中心全部内置函数种子,保持数据库市场函数和表达式引擎能力一致。/private/tmp/FormulaFunctionMarketSmoke.java 临时 runner 验证通过。涉及文件
forge-admin-ui/src/api/formula.jsforge-admin-ui/src/views/app-center/components/designer/formula/FormulaFunctionMarket.vueforge-admin-ui/src/views/app-center/components/designer/formula/FormulaFunctionBrowser.vueforge-admin-ui/src/views/app-center/components/designer/formula/FormulaExpressionEditor.vueforge-admin-ui/src/views/app-center/object-designer.[objectCode].vue执行要点
getFormulaFunctions 改为从后端注册表读取。验证命令
source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm --dir forge-admin-ui exec eslint src/views/app-center/components/designer/formula/*.vue src/views/app-center/object-designer.[objectCode].vue src/api/formula.js
source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
验收标准
执行记录
FormulaExpressionEditor 取代 FormulaConfigPanel 中的静态函数下拉;FormulaFunctionBrowser 从 /api/ai/business/formula/functions 动态加载可插入函数并支持搜索、分类筛选和插入表达式。FormulaFunctionMarket 通过居中弹窗提供分页、搜索、分类筛选、详情、安装、启用、禁用,不使用右侧抽屉。functionRefs,用于后端发布校验识别函数市场状态。git diff --check 通过;构建仅保留既有 CSS // 注释和 chunk 混合导入警告。涉及文件
forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaValueMasker.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaRuntimeProperties.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/FormulaController.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaExecutionLogService.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaLookupResolver.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/formula/FormulaCrossObjectResolver.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/formula/FormulaValueMaskerTest.java执行要点
验证命令
mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaValueMaskerTest,FormulaControllerTest
验收标准
执行记录
FormulaValueMasker,执行日志写入统一脱敏手机号、身份证、银行卡、Token、AK/SK 等敏感值。FormulaRuntimeProperties,将执行日志总开关、失败/成功/debug 日志开关、debug 输入/输出快照和函数 timeout 纳入 forge.formula.runtime 配置。FormulaController 增加 @SaCheckPermission("ai:businessObject:design"),公式调试、执行日志、依赖图、规则编译和函数市场接口统一复用对象设计权限。FormulaLookupResolver、FormulaCrossObjectResolver 和 FormulaValidationService 补齐配置校验,拒绝 SQL 片段、非法字段编码、路径式 LOOKUP relationCode,并要求 LOOKUP 目标/返回字段解析到目标模型字段资产或 id。FormulaValueMaskerTest、FormulaExecutionLogServiceTest、FormulaFunctionRegistryTest、FormulaValidationServiceTest,并通过临时 runner /private/tmp/FormulaSecurityHardeningSmoke.java 验证脱敏、timeout 和非法配置阻断。涉及文件
code-copilot/changes/formula-next-capabilities/test-spec.mdcode-copilot/changes/formula-next-capabilities/execution-log.mdcode-copilot/changes/formula-next-capabilities/tasks.mdcode-copilot/rules/automated-testing-standard.md执行要点
推荐验证矩阵
mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test
source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
git diff --check -- code-copilot/changes/formula-next-capabilities forge-server forge-admin-ui
验收标准
test-spec.md 覆盖后端、前端、数据库和跳过项。execution-log.md 记录命令、结果、警告、失败项和服务清理情况。tasks.md 状态随实现推进更新。执行记录
code-copilot/rules/automated-testing-standard.md 复用当前 spec.md、tasks.md、test-spec.md、execution-log.md 执行 Task 19 增量验证。test-spec.md 已追加 Task 19/20 验证矩阵,覆盖后端编译、测试源码编译、smoke runner、空白检查和跳过项。execution-log.md 已追加 Task 19/20 执行记录,记录 Maven 父 POM 跳过 Surefire、测试源码编译、smoke 输出、空白检查和服务清理情况。| 阶段 | 任务 | 预计 |
|---|---|---|
| Phase 1 | Task 1-7 | 4-6 天 |
| Phase 2 | Task 8-12 | 5-8 天 |
| Phase 3 | Task 13-14 | 2-3 天 |
| Phase 4 | Task 15-18 | 4-6 天 |
| Hardening / Validation | Task 19-20 | 2-3 天 |
| 合计 | Task 1-20 | 17-26 天 |