status: review_fix_completed created: 2026-07-02
code-copilot/changes/lowcode-platform-capability-foundation/spec.mdcode-copilot/changes/lowcode-platform-capability-foundation/tasks.mdcode-copilot/changes/lowcode-platform-capability-foundation/test-spec.md/apply,建议第一轮只实现 Phase 1「通用动作执行引擎」。apply lowcode-platform-capability-foundation,并要求及时更新任务状态。spec.md、tasks.md、test-spec.md、execution-log.md,后续验证按增量范围记录。in_progress。forge-server/db/migration/V1.0.87__add_business_action_execution_log.sql。in_progress。BusinessActionExecutionService,统一负责动作解析、动作权限校验、幂等命中、步骤编排、事务执行和动作日志写入。UPDATE_FIELD、CREATE_RECORD、START_FLOW、SEND_MESSAGE。/ai/business/action/execute、/ai/business/action/preview、/ai/business/action/logs 接口。executeBusinessAction、previewBusinessAction、businessActionLogs。in_progress。BusinessActionDesigner.vue:新增 COMMAND 动作类型,支持动作表单 Schema 和动作步骤配置保存为通用协议。BusinessListDesigner.vue:新增 COMMAND 设计态/运行态转换,发布后的列表行操作可透传通用动作配置。AiCrudPage.vue:运行态支持 COMMAND 动作;有 formSchema 时弹窗采集参数,无表单时直接执行;复用 action loading key 防重复点击;成功后按 successBehavior 刷新或返回。mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests:首次失败,原因是 shell 未指定 Java 17,报 无效的目标发行版: 17。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests:通过。source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm build:通过;仅有项目既有 chunk warning 和 CSS // 注释 warning。git diff --check:通过。rg -n '\$\{[^}]+\}' forge-server/db/migration:无输出,确认本轮迁移未引入 Flyway placeholder。pending。in_progress。BusinessRecordSelectorController、BusinessRecordSelectorService、BusinessRecordSelectorQueryDTO、BusinessRecordSelectorResultVO,选择器查询通过业务对象运行配置调用 DynamicCrudService.selectPage,复用字段白名单、运行数据源、租户/数据权限、解密/脱敏/公式读取链路;返回记录中的 Long ID 和 _raw Long 值统一字符串化。AiRecordSelectorModal.vue 和 record-selector-utils.js;AiFormItem.vue 支持 recordSelector 字段单选回填与字段映射;ChildTableEditor.vue 支持按选择器多选批量追加子表行。BusinessFieldPropertyPanel.vue 新增 RECORD_SELECTOR 字段类型和记录选择器配置区;ForgeFieldShelf.vue 新增“记录选择器”组件;BusinessFormDesigner.vue、ForgePropertyPanel.vue、formDesignerSchema.js、autoFieldRegistry.js、BusinessObjectDesignerService.java、BusinessFieldSchemaService.java、LowcodeRuntimeConfigBuilder.java、LowcodeSchemaValidator.java 已补齐组件类型映射和校验。AiFormItem.vue 中新增选择器显示文本误用了不存在的 valueText,已改为现有 normalizeDisplayText。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests:通过;仅有既有 deprecated/unchecked 编译提示。source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm build:通过;仅有项目既有 CSS // 注释和动态/静态 import chunk warning。git diff --check:通过。rg -n '\$\{[^}]+\}' forge-server/db/migration:无输出,未引入 Flyway placeholder。rg -n 'valueText\(' forge-admin-ui/src/components/ai-form/AiFormItem.vue forge-admin-ui/src/components/page-templates/ChildTableEditor.vue forge-admin-ui/src/components/ai-form/AiRecordSelectorModal.vue:无输出,确认未保留未定义调用。merge 保存模式;本轮只完成选择器批量追加子表行,行级合并保存仍需单独改 DynamicCrudService 并保持默认 replace 行为兼容。pending。DynamicCrudService 新增子表 saveMode=merge 处理分支,默认仍保持 replace 全量替换,避免改变既有行为。id 修改、按 _deleted/__deleted 删除。min/max 数值范围校验。DynamicCrudService 中未定义的 mapValue(ref.getProps()) 调用,改为复用现有 firstMap。BusinessRelationDesigner.vue 已支持“子表保存模式”配置。BusinessObjectDesignerService 将关系 relationConfig.saveMode 同步到 pageSchema.modelRefs[].props.saveMode。LowcodeRuntimeConfigBuilder 将 saveMode 输出到 masterDetailConfig.children[]。ChildTableEditor.vue 在 merge 模式下对已有行删除改为隐藏并提交 _deleted: true。getValue() 保留 _deleted 行给后端,表格展示和校验跳过已删除行。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests:通过;仅有既有 deprecated/unchecked 编译提示。source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm build:通过;仅有项目既有 CSS // 注释、动态/静态 import chunk warning 和 UserSelectModal 命名冲突 warning。git diff --check:通过。rg -n '\$\{[^}]+\}' forge-server/db/migration:无输出,未引入 Flyway placeholder。in_progress。BusinessFlowService 在流程结果回调状态回写、实例关联更新后,按流程结果读取 bindingConfig.options.callbackActions。APPROVED、REJECTED、CANCELED 三类结果绑定对象动作编码。BusinessActionExecutionService,动作步骤、事务、幂等和执行日志都走通用动作引擎。flowCallback:{processInstanceId|businessKey}:{result}:{actionCode},防止流程重复回调重复执行业务副作用。BusinessFlowBindingPanel.vue 新增“流程结果动作”配置区,可为通过、驳回、取消分别选择对象动作。COMMAND 或具备步骤配置的动作。options.callbackActions,运行摘要展示已配置回调动作数量。BusinessFlowAppConfigPanel.vue 将 objectId 传给流程绑定面板,用于加载对象动作。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests:通过;仅有既有 deprecated/unchecked 编译提示。source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm build:通过;仅有项目既有 CSS // 注释、动态/静态 import chunk warning 和 UserSelectModal 命名冲突 warning。git diff --check:通过。rg -n '\$\{[^}]+\}' forge-server/db/migration:无输出,未引入 Flyway placeholder。in_progress。BusinessTriggerExecutor 注入 BusinessActionExecutionService。actionType 为 BUSINESS_ACTION、ACTION、COMMAND,或 actionConfig 中存在 actionCode/businessActionCode/commandActionCode 时,统一调用动作执行引擎。correlationId 与 actionResult。START_FLOW、SEND_MESSAGE、CREATE_RECORD、UPDATE_FIELD、WEBHOOK 保持原兼容执行路径。trigger.vue 增加“执行对象动作”类型,并按当前业务对象加载可执行对象动作选项。TriggerActionConfigPanel.vue 支持 BUSINESS_ACTION,保存标准 actionCode 配置。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests:通过;仅有既有 deprecated/unchecked 编译提示。source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm build:通过;仅有项目既有 CSS // 注释、动态/静态 import chunk warning 和 UserSelectModal 命名冲突 warning。git diff --check:通过。rg -n '\$\{[^}]+\}' forge-server/db/migration:无输出,未引入 Flyway placeholder。in_progress。BusinessDomainActionExecutor:定义领域动作 SPI,领域能力通过 actionType() 注册。BusinessDomainActionRegistry:启动时收集领域动作执行器,重复注册或空 actionType 明确失败;运行时未注册动作返回 未注册领域动作。DomainActionStepExecutor:动作步骤类型 DOMAIN_ACTION 接入领域动作注册中心;支持从 params 和字段映射中解析参数,支持 ${field} 从当前记录/表单/上下文取值。V1.0.88__add_business_quantity_ledger.sql。ai_business_quantity_balance、ai_business_quantity_ledger、ai_business_quantity_lock 三张通用数量表。tenant_id + account_code + item_code + dimension_key。idempotency_key 唯一约束,避免重复入账、重复锁定或重复扣减。ai:businessQuantity:operate,内置数据 tenant_id=1,脚本无 Flyway ${...} placeholder。BusinessQuantityLedgerService 支持 inbound、lock、release、commit、transfer。BusinessQuantityDomainActionExecutor,注册为领域动作 QUANTITY。BusinessActionDesigner.vue 的通用动作步骤区新增“数量台账步骤”模板插入和格式化入口,减少从空 JSON 手写步骤。BusinessQuantityLedgerServiceTest 覆盖入账幂等、锁定不足、转移成功三个核心分支;受根 POM 固定跳过测试影响,测试类未被 Maven 实际执行,见验证记录。BusinessTriggerSchedulerService 支持 schedule.tierRules / schedule.reminderRules。lookAheadDays 和分层规则最大 lookAheadDays 取最大值。reminderRuleCode、reminderRuleName、reminderReceiverRule、reminderLookAheadDays、reminderMetricField、reminderMetricValue。BusinessTriggerExecutor 的 SEND_MESSAGE 动作优先读取事件上下文中的 reminderReceiverRule,分层规则可覆盖默认接收人规则。trigger.vue 的定时触发器普通模式新增“分层提醒”配置区。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests:首次失败,原因是 BusinessTriggerSchedulerService 漏 import JSONArray;补充 import 后重跑通过。source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm build:通过。// 注释、动态/静态 import chunk warning、UserSelectModal 命名冲突 warning。mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -Dtest=BusinessQuantityLedgerServiceTest test:未执行,缺少 -am 导致内部模块依赖解析到远程仓库并因 401 失败。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am -Dtest=BusinessQuantityLedgerServiceTest -DskipTests=false -Dmaven.test.skip=false -Dsurefire.skipTests=false test:构建通过,但根 POM 固定配置 compiler/surefire skip,日志显示 Not compiling test sources、Tests are skipped,测试类未实际执行。git diff --check:通过。rg -n '\$\{[^}]+\}' forge-server/db/migration:无输出,未引入 Flyway placeholder。tasks.md 已更新为 review_ready,Task 1-16 均已完成。spec.md 已补齐 Task 10-16 的实际改动文件、验证结果和遗留风险。test-spec.md 已记录 Phase 4-7 的编译、构建、测试跳过和静态检查结果。/review lowcode-platform-capability-foundation。BusinessActionExecutionService 执行动作前先以独立事务写入 RUNNING 预占日志。tenant_id + object_code + record_id + action_code + idempotency_key 的重复请求命中 RUNNING 时直接拒绝,不再执行步骤。BusinessActionExecutionLogMapper.xml 的幂等查询改为查询最新日志,不再只查询 SUCCESS/TODO。V1.0.87__add_business_action_execution_log.sql 将 record_id 改为 NOT NULL DEFAULT '',避免 MySQL 唯一索引遇到 NULL 后无法防重。BusinessRecordSelectorService 增加目标对象 VIEW 权限校验。configKey。_raw 只投影 id、展示字段、关键词字段、搜索参数字段和映射源字段,并排除租户、审计、删除标记和 _ 开头内部字段。BusinessQuantityLedgerService 强制所有数量操作携带稳定幂等键。BusinessQuantityDomainActionExecutor 移除随机链路号兜底,改为配置幂等键、动作请求幂等键或稳定业务来源哈希。BusinessTriggerExecutor 调用业务动作时生成稳定触发器幂等键。transfer 转移写源端 :source 和目标端 :target 两条流水,结果返回 targetLedgerId。forge-server/pom.xml 增加 enable-tests profile,允许定向开启 testCompile/surefire。BusinessActionExecutionServiceTest、BusinessRecordSelectorServiceTest、BusinessQuantityLedgerServiceTest。git diff --check:通过。rg -n '\$\{[^}]+\}' forge-server/db/migration:无输出,未引入 Flyway placeholder。rg -n 'selectLatestReusableByIdempotencyKey|valueText\(' forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator forge-admin-ui/src/components/ai-form forge-admin-ui/src/components/page-templates:无输出。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests:通过;仅有既有 deprecated/unchecked 编译提示。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -Pdev,enable-tests -Dtest=BusinessQuantityLedgerServiceTest,BusinessActionExecutionServiceTest,BusinessRecordSelectorServiceTest -Dsurefire.failIfNoSpecifiedTests=false test:通过;8 tests run, 0 failures, 0 errors, 0 skipped。review_fix_completed。