status: apply created: 2026-07-13 change:
app-first-lowcode-workbench执行原则:按 Phase 顺序推进;每一阶段通过独立门禁后才能进入下一阶段。
以下任务中的后端相对路径均位于:
forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/
前端相对路径均位于:
forge-admin-ui/src/
数据库迁移位于:
forge-server/db/migration/
spec.md 的 HARD-GATE。AGENTS.md、三份 memory 和 automated-testing-standard.md。V1.0.26,本阶段使用 V1.0.27。.DS_Store、preferences.md 等用户已有无关改动。| Phase | 目标 | Tasks | 可交付结果 |
|---|---|---|---|
| Phase 0 | 术语与兼容冻结 | 0~2 | 决策、测试基线、协议冻结 |
| Phase 1 | 应用聚合基础 | 3~11 | 新应用 CRUD、对象关联、入口归属、存量回填 |
| Phase 2 | 应用优先总览 | 12~16 | 总览以应用为主体,聚合分页无 N+1 |
| Phase 3 | 应用工作台与表优先设计 | 17~24 | 集中工作台、表映射首屏、保存/同步分离 |
| Phase 4 | 受治理扩展中心 | 25~34 | JS/CSS/服务绑定的安全生命周期 |
| Phase 5 | 应用级协调发布 | 35~41 | 就绪度、不可变快照、发布、恢复和回滚 |
| Phase 6 | 验证与归档准备 | 42~45 | 构建、浏览器验证、执行证据、评审结论 |
| Task | 阶段 | 名称 | 状态 | 优先级 |
|---|---|---|---|---|
| 0 | Phase 0 | Proposal 文档形成 | completed | P0 |
| 1 | Phase 0 | HARD-GATE 与术语确认 | completed | P0 |
| 2 | Phase 0 | 实施基线和兼容契约测试 | completed | P0 |
| 3 | Phase 1 | 应用聚合 Flyway 迁移 | completed | P0 |
| 4 | Phase 1 | 应用实体与 DTO/VO 协议 | completed | P0 |
| 5 | Phase 1 | 应用聚合 Mapper 查询 | completed | P0 |
| 6 | Phase 1 | 应用 CRUD 服务 | completed | P0 |
| 7 | Phase 1 | 应用-对象关联服务 | completed | P0 |
| 8 | Phase 1 | 应用 Controller 与权限资源 | completed | P0 |
| 9 | Phase 1 | 访问入口 applicationId 兼容 | completed | P0 |
| 10 | Phase 1 | Binding APPLICATION 目标兼容 | completed | P1 |
| 11 | Phase 1 | 存量回填与 Phase 1 验证 | completed | P0 |
| 12 | Phase 2 | 应用聚合分页计数 | completed | P0 |
| 13 | Phase 2 | 应用前端 API 与路由骨架 | completed | P0 |
| 14 | Phase 2 | 应用总览主区重构 | completed | P0 |
| 15 | Phase 2 | 新建/编辑应用交互 | completed | P0 |
| 16 | Phase 2 | Phase 2 构建与浏览器验收 | completed-static | P0 |
| 17 | Phase 3 | 应用工作台后端聚合 | completed | P0 |
| 18 | Phase 3 | 应用工作台页面骨架 | completed | P0 |
| 19 | Phase 3 | 数据对象分区 | completed | P0 |
| 20 | Phase 3 | 表映射聚合协议 | completed | P0 |
| 21 | Phase 3 | 表结构首屏与字段网格 | completed | P0 |
| 22 | Phase 3 | DDL 预览与显式同步编排 | completed | P0 |
| 23 | Phase 3 | 集中设计入口与旧对象兼容 | completed | P0 |
| 24 | Phase 3 | Phase 3 回归验收 | completed-static | P0 |
| 25 | Phase 4 | 扩展中心安全设计复核 | completed | P0 |
| 26 | Phase 4 | 扩展数据表与字典迁移 | completed | P0 |
| 27 | Phase 4 | 扩展实体、Mapper 和 CRUD | completed | P0 |
| 28 | Phase 4 | 扩展版本、差异和编辑锁 | completed | P0 |
| 29 | Phase 4 | JS 沙箱执行器 | completed | P0 |
| 30 | Phase 4 | CSS 解析与作用域隔离 | completed | P0 |
| 31 | Phase 4 | 服务端白名单绑定 | completed | P0 |
| 32 | Phase 4 | 扩展验证、测试与状态机 | completed | P0 |
| 33 | Phase 4 | 扩展中心前端 | completed | P0 |
| 34 | Phase 4 | Phase 4 安全负例验收 | completed-static | P0 |
| 35 | Phase 5 | 应用版本表迁移 | completed | P0 |
| 36 | Phase 5 | 应用就绪度聚合 | completed | P0 |
| 37 | Phase 5 | 不可变快照服务 | completed | P0 |
| 38 | Phase 5 | 协调发布编排 | completed | P0 |
| 39 | Phase 5 | 发布恢复与回滚 | completed | P0 |
| 40 | Phase 5 | 发布历史前端 | completed | P1 |
| 41 | Phase 5 | Phase 5 故障恢复验收 | completed-static | P0 |
| 42 | Phase 6 | 后端聚合构建和目标测试 | pending | P0 |
| 43 | Phase 6 | 前端构建、Lint 和浏览器验收 | pending | P0 |
| 44 | Phase 6 | 真实迁移/API/E2E 用户回填 | pending | P0 |
| 45 | Phase 6 | 文档回填和归档评审 | pending | P1 |
spec.md、tasks.md、test-spec.md、execution-log.md。code-copilot/changes/app-first-lowcode-workbench/spec.mdcode-copilot/changes/app-first-lowcode-workbench/tasks.mdcode-copilot/changes/app-first-lowcode-workbench/test-spec.mdcode-copilot/changes/app-first-lowcode-workbench/execution-log.mdcode-copilot/changes/app-first-lowcode-workbench/spec.md — 回填确认状态、确认人和时间。code-copilot/changes/app-first-lowcode-workbench/execution-log.md — 记录确认内容。src/test/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessAppServiceCompatibilityTest.java — 新增访问入口兼容测试。src/test/java/com/mdframe/forge/plugin/generator/controller/BusinessAppControllerCompatibilityTest.java — 新增旧 API 协议测试。code-copilot/changes/app-first-lowcode-workbench/execution-log.md — 记录 Red/Green 前基线。/ai/business/app CRUD、open-info、代码配置、代码预览/下载入口不改变;逻辑删除过滤仍有效。forge-server/db/migration/V<next>__add_business_application_aggregate.sql — 新增,实施时替换 <next> 为最新可用版本。ai_business_applicationai_business_application_objectai_business_app.application_id 与索引sys_resource 权限tenant_id=1 内置数据、del_flag、生成列未删除唯一键、information_schema 防重复、无 Flyway ${...} 占位符。BusinessApp。src/main/java/com/mdframe/forge/plugin/generator/domain/entity/AiBusinessApplication.javasrc/main/java/com/mdframe/forge/plugin/generator/domain/entity/AiBusinessApplicationObject.javasrc/main/java/com/mdframe/forge/plugin/generator/dto/businessapp/BusinessApplicationDTO.javasrc/main/java/com/mdframe/forge/plugin/generator/dto/businessapp/BusinessApplicationQueryDTO.javasrc/main/java/com/mdframe/forge/plugin/generator/vo/businessapp/BusinessApplicationVO.javaapplicationCode/applicationName/suiteCode/status/designStatus/lastPublishVersion/lastPublishTime;关联角色和计数字段。@TableLogic;状态展示依赖字典,Java 常量只负责校验和状态机。src/main/java/com/mdframe/forge/plugin/generator/mapper/BusinessApplicationMapper.javasrc/main/resources/mapper/BusinessApplicationMapper.xmlsrc/main/java/com/mdframe/forge/plugin/generator/mapper/BusinessApplicationObjectMapper.javasrc/main/resources/mapper/BusinessApplicationObjectMapper.xmlBusinessApplicationVO selectApplicationDetail(@Param("tenantId") Long tenantId,
@Param("id") Long id);
List selectByApplicationId(@Param("tenantId") Long tenantId,
@Param("applicationId") Long applicationId);
- **验收**:XML 中所有主表和 join 的设计元数据显式过滤 `del_flag='0'`。
### Task 6:应用 CRUD 服务
- **目标**:实现应用校验、CRUD、状态管理和删除保护。
- **涉及文件**:
- `src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationService.java`
- `src/test/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationServiceTest.java`
- **关键签名**:
```java
Page<BusinessApplicationVO> page(Integer pageNum, Integer pageSize, BusinessApplicationQueryDTO query);
BusinessApplicationVO detail(Long id);
BusinessApplicationVO detailByCode(String applicationCode);
Long create(BusinessApplicationDTO dto);
void update(BusinessApplicationDTO dto);
void updateStatus(Long id, Integer status);
void delete(Long id);
src/main/java/com/mdframe/forge/plugin/generator/dto/businessapp/BusinessApplicationObjectDTO.javasrc/main/java/com/mdframe/forge/plugin/generator/vo/businessapp/BusinessApplicationObjectVO.javasrc/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationObjectService.javasrc/test/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationObjectServiceTest.javajava
List<BusinessApplicationObjectVO> list(Long applicationId);
void replace(Long applicationId, List<BusinessApplicationObjectDTO> objects);
Set<Long> listAffectedApplicationIds(Long objectId);
src/main/java/com/mdframe/forge/plugin/generator/controller/BusinessApplicationController.javasrc/test/java/com/mdframe/forge/plugin/generator/controller/BusinessApplicationControllerTest.javaai:businessApplication:* 资源,仍未执行时可在同脚本维护。/page、/list、/{id}、/by-code/{applicationCode}、POST、PUT、status、DELETE、objects GET/PUT。pageNum/pageSize、@ApiEncrypt/@ApiDecrypt、RespInfo、@OperationLog、细分权限完整。src/main/java/com/mdframe/forge/plugin/generator/domain/entity/AiBusinessApp.javasrc/main/java/com/mdframe/forge/plugin/generator/dto/businessapp/BusinessAppDTO.javasrc/main/java/com/mdframe/forge/plugin/generator/dto/businessapp/BusinessAppQueryDTO.javasrc/main/java/com/mdframe/forge/plugin/generator/vo/businessapp/BusinessAppVO.javasrc/main/resources/mapper/BusinessAppMapper.xmlBusinessAppService.java 校验指定应用与业务域/对象一致;兼容同步调用允许为空。APP=访问入口。src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessBindingService.javasrc/main/java/com/mdframe/forge/plugin/generator/dto/businessapp/BusinessBindingDTO.javasrc/main/resources/mapper/BusinessBindingMapper.xmlsrc/test/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessBindingServiceTest.javaAPPLICATION 校验新应用 ID;APP 仍校验旧入口 ID;不存在、跨租户和已删除目标失败关闭。src/test/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationBackfillContractTest.java — 用固定数据集验证规则。code-copilot/changes/app-first-lowcode-workbench/execution-log.mdsrc/main/resources/mapper/BusinessApplicationMapper.xmlsrc/main/java/com/mdframe/forge/plugin/generator/vo/businessapp/BusinessApplicationVO.javasrc/test/java/com/mdframe/forge/plugin/generator/mapper/BusinessApplicationMapperTest.javaBusinessApplicationMapperTest 3 个场景通过。真实 SQL 次数和 800ms 响应基线待用户运行环境回填。api/business-application.js — 新增。router/index.js — 新增 /app-center/application/:applicationCode。views/app-center/application.[applicationCode].vue — 新增最小占位骨架。javascript
businessApplicationPage(params)
businessApplicationDetail(id)
businessApplicationDetailByCode(applicationCode)
createBusinessApplication(data)
updateBusinessApplication(data)
saveBusinessApplicationObjects(id, data)
api/business-app.js 继续只表示访问入口,不搬迁旧函数。business-application.js、稳定工作台路由和 Phase 2 摘要占位页;旧 /app-center/app/:appId、对象设计路由和 business-app.js 保持。views/app-center/index.vueviews/app-center/components/ApplicationTable.vue — 新增。views/app-center/components/AppFilterBar.vue — 改为应用筛选语义,必要时更名为 ApplicationFilterBar.vue。businessObjectRelations,不再渲染 BusinessObjectTable。ResizeObserver 读取列表真实可用宽度,隐藏业务域、资产、更新时间等次要列,最窄场景始终保留应用和操作列;分页导航与每页条数拆分后可换行展示。views/app-center/components/ApplicationEditorDrawer.vueviews/app-center/components/ApplicationInitializeStep.vueviews/app-center/index.vuecode-copilot/changes/app-first-lowcode-workbench/test-spec.mdcode-copilot/changes/app-first-lowcode-workbench/execution-log.mdgit diff --check 均通过。未启动 Admin/Vite、未执行 Flyway,因此浏览器交互、真实 SQL 次数、接口耗时和旧入口运行态回归仍保持 pending。src/main/java/com/mdframe/forge/plugin/generator/vo/businessapp/BusinessApplicationWorkspaceVO.javasrc/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationWorkspaceService.javasrc/main/java/com/mdframe/forge/plugin/generator/controller/BusinessApplicationController.javasrc/test/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationWorkspaceServiceTest.javajava
BusinessApplicationWorkspaceVO workspace(Long applicationId);
BusinessApplicationReadinessVO readiness(Long applicationId);
views/app-center/application.[applicationCode].vueviews/app-center/application-workspace/ApplicationWorkspaceHeader.vueviews/app-center/application-workspace/ApplicationWorkspaceNav.vueviews/app-center/application-workspace/ApplicationOverviewPanel.vueviews/app-center/application-workspace/ApplicationObjectsPanel.vueviews/app-center/application-workspace/ApplicationObjectBinder.vueapi/business-application.jssrc/main/java/com/mdframe/forge/plugin/generator/vo/businessapp/BusinessObjectTableMappingVO.javasrc/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessObjectDesignerService.javasrc/main/java/com/mdframe/forge/plugin/generator/controller/BusinessObjectDesignerController.javasrc/test/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessObjectTableMappingServiceTest.javajava
BusinessObjectTableMappingVO getTableMapping(Long objectId);
LowcodeDdlPreviewVO previewDatabaseDiff(Long objectId, Integer designVersion);
BusinessObjectDesignContextProvider 复用统一设计上下文,返回业务字段/字段编码/数据库列三向映射、实际列元数据、差异、设计版本和最近同步结果。views/app-center/object-designer.[objectCode].vueviews/app-center/components/designer/BusinessObjectDesignerShell.vueviews/app-center/components/designer/BusinessFieldManager.vueviews/app-center/components/designer/BusinessTableMappingSummary.vue — 新增。?panel=form/list/detail 深链保持。数据库导入增量修正为按物理列保留类型、长度、decimal 精度和必填状态,表单数字控件不再把已有 decimal/bigint 反向覆盖为 int;数据结构首屏新增显式索引配置入口,并为修复前已经保存错误类型的导入草稿提供“按数据库校准字段”显式修复动作。LowcodeDdlService 和发布检查整理为明确的预览/确认动作,不另写 DDL 引擎。src/main/java/com/mdframe/forge/plugin/generator/service/lowcode/LowcodeDdlService.javasrc/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessObjectDesignerService.javasrc/main/java/com/mdframe/forge/plugin/generator/controller/BusinessObjectDesignerController.javasrc/test/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessObjectDatabaseSyncServiceTest.javajava
LowcodeDdlPreviewVO previewDatabaseDiff(Long objectId, Integer designVersion);
void syncDatabase(Long objectId, Integer designVersion, boolean confirmOnlineDdl);
ai:lowcode:deploy-ddl;版本冲突失败;高风险差异默认只导出脚本;数据源 allowDdl=0 拒绝。syncDdl 兼容字段;预览与同步使用独立 API,版本、确认、权限、数据源能力和只读状态逐层校验,仅 CREATE/ADD COLUMN 及其受控索引/注释可在线执行,高风险脚本只预览/导出。增量修复对象发布检查与最终执行白名单不一致:两者统一复用同一安全判定,执行前先校验全部语句,避免先执行部分追加 DDL 后才被 MODIFY/ALTER COLUMN 拦截。二级索引进一步改为完全显式配置:不再从查询字段、关系字段、租户字段或审计字段自动生成,旧 auto=true 配置也不进入 DDL;用户保存索引配置后才允许在预览中生成受控 ADD/CREATE INDEX。views/app-center/components/designer/BusinessObjectDesignerShell.vueviews/app-center/object-designer.[objectCode].vueviews/app-center/application-workspace/ApplicationEntriesPanel.vueviews/app-center/application-workspace/ApplicationAutomationPanel.vuetest-spec.md、execution-log.md。completed-static。spec.md — 只在用户确认变更时修订技术决策。test-spec.md — 固化沙箱逃逸和越界负例。execution-log.md — 记录复核结论。eval/new Function、服务绑定无法任意反射时,不进入 Task 26。handlerCode 注册表、SHA-256 锁令牌和脱敏审计边界;宿主页动态执行与任意反射硬门已解除。forge-server/db/migration/V<next>__add_business_extension_governance.sqlai_business_extension、ai_business_extension_version、扩展类型/状态/钩子/失败策略字典和权限。V1.0.28__add_business_extension_governance.sql,包含扩展、不可变内容版本、执行审计、字典、权限和角色继承;真实迁移待用户执行。src/main/java/com/mdframe/forge/plugin/generator/domain/entity/AiBusinessExtension.javasrc/main/java/com/mdframe/forge/plugin/generator/domain/entity/AiBusinessExtensionVersion.javasrc/main/java/com/mdframe/forge/plugin/generator/mapper/BusinessExtensionMapper.javasrc/main/resources/mapper/BusinessExtensionMapper.xmlsrc/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessExtensionService.javasrc/test/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessExtensionServiceTest.java。@TableLogic;XML 显式过滤。src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessExtensionVersionService.javasrc/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessExtensionLockService.javasrc/main/java/com/mdframe/forge/plugin/generator/controller/BusinessExtensionController.javasrc/test/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessExtensionVersionServiceTest.javacomponents/lowcode-extension/js/ExtensionSandboxHost.vuecomponents/lowcode-extension/js/extension-sandbox.worker.jscomponents/lowcode-extension/js/extension-context-api.jscomponents/lowcode-extension/js/extension-sandbox.spec.jswindow 改为 globalThis,避免 module Worker 加载 env.mjs 时在用户脚本执行前异常终止。components/lowcode-extension/css/scoped-css.jscomponents/lowcode-extension/css/scoped-css.spec.jscomponents/lowcode-extension/css/ScopedCssPreview.vue@import、外部 URL、html/body/:root、作用域逃逸和 Forge 布局选择器被拒绝。css-tree AST 解析/重写并增加服务端二次作用域复核;全局根、URL、导入、布局选择器和越界样式失败关闭。src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/extension/LowcodeExtensionHandler.javasrc/main/java/com/mdframe/forge/plugin/generator/service/businessapp/extension/LowcodeExtensionRegistry.javasrc/main/java/com/mdframe/forge/plugin/generator/service/businessapp/extension/ServerBindingExecutor.javasrc/test/java/com/mdframe/forge/plugin/generator/service/businessapp/extension/ServerBindingExecutorTest.javajava
ExtensionExecutionResult execute(ExtensionExecutionContext context);
Optional<LowcodeExtensionHandler> find(String handlerCode);
lowcode-java-extension.md 开发模板,处理器结构化失败会写失败审计,并按 BLOCK/WARN/IGNORE 执行。src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessExtensionValidationService.javasrc/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessExtensionExecutionService.javasrc/main/java/com/mdframe/forge/plugin/generator/controller/BusinessExtensionController.javasrc/test/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessExtensionExecutionServiceTest.javaDRAFT→TESTED→ENABLED→DISABLED、内容变更退回草稿、风险/失败策略约束和不保存输入/原始异常的执行审计;扩展类型与钩子兼容性在保存和草稿校验两层失败关闭,Java 处理器返回 success=false 不再误判为测试通过。views/app-center/application-workspace/ApplicationExtensionsPanel.vueviews/app-center/application-workspace/ExtensionEditorDrawer.vueviews/app-center/application-workspace/ExtensionVersionDrawer.vueapi/business-extension.jsreadField/setField/triggerAction 自动识别字段与动作,加载所选业务对象的真实字段/动作名称,提供类型化测试值、示例值/空值场景和只读高级 JSON 预览,不再要求用户手工同步逗号字段串和整段 JSON。test-spec.md、execution-log.md。vitest 依赖缺失未执行,用户明确改为自行验证,因此 Phase 4 标记 completed-static。forge-server/db/migration/V<next>__add_business_application_version.sqlai_business_application_version、应用发布状态字典、发布/回滚权限。V1.0.29__add_business_application_release_coordination.sql,建立不可变版本表和可恢复发布运行单,补齐状态/步骤字典、发布/恢复/回滚权限与角色继承。src/main/java/com/mdframe/forge/plugin/generator/vo/businessapp/BusinessApplicationReadinessVO.javasrc/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationReadinessService.javasrc/test/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationReadinessServiceTest.javajava
BusinessApplicationReadinessVO check(Long applicationId);
WARN 影响提醒,只显示复用应用数量,不再要求同步评估并阻断当前应用。发布路径一次解析对象、入口、扩展和应用绑定,权限资源按对象集合批量查询,并把已解析上下文传给快照阶段复用。src/main/java/com/mdframe/forge/plugin/generator/domain/entity/AiBusinessApplicationVersion.javasrc/main/java/com/mdframe/forge/plugin/generator/mapper/BusinessApplicationVersionMapper.javasrc/main/resources/mapper/BusinessApplicationVersionMapper.xmlsrc/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationVersionService.javasrc/test/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationVersionServiceTest.javasnapshot_json;快照复用发布检查已装载的应用、对象、入口、扩展、绑定和权限摘要,扩展版本按 (extension_id, version_no) 批量读取。src/main/java/com/mdframe/forge/plugin/generator/dto/businessapp/BusinessApplicationPublishDTO.javasrc/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationPublishService.javasrc/main/java/com/mdframe/forge/plugin/generator/controller/BusinessApplicationController.javasrc/test/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationPublishServiceTest.javajava
BusinessApplicationPublishResultVO publish(Long applicationId,
BusinessApplicationPublishDTO dto, String idempotencyKey);
PUBLISHED、后续变更转 CHANGED。PRECHECK→SNAPSHOT→OBJECTS→ENTRIES→EXTENSIONS→COMMIT 六步编排、16~128 位幂等键、数据库认领、主对象/入口/扩展依赖补齐、步骤结果和最终 PUBLISHED 提交。首次发布复用创建运行单前的权威检查结果,对象最新发布版本改为一次批量查询,运行单步骤更新后复用内存实体,成功认领后不再额外回查;恢复发布仍强制重新执行检查。src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationPublishRecoveryService.javasrc/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationRollbackService.javasrc/test/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationRollbackServiceTest.javaPARTIAL/FAILED 并可按原运行单恢复;历史回滚检查对象版本、物理表/列、入口、扩展版本和挂接,缺失即阻断,不执行反向 DDL 或业务数据回滚。views/app-center/application-workspace/ApplicationPublishPanel.vueviews/app-center/application-workspace/ApplicationVersionDrawer.vueapi/business-application.jssection=releases&publish=1 深链复用同一确认和发布逻辑,不复制发布 API;进入发布历史只并发加载轻量版本/运行记录,完整检查改为显式按需执行,直接发布只由后端执行一次最终权威检查;发布检查超时保护为 60 秒,发布/恢复/回滚为 120 秒。test-spec.md、execution-log.md。pending。test-spec.md,JDK 17;先目标测试,后 mvn -pl forge-admin-server -am package -DskipTests。execution-log.md 记录命令、输出、警告和跳过项。pnpm build,必要时按项目已有脚本执行目标 lint;不得用全量自动修复覆盖无关文件。execution-log.md 记录构建和截图/交互证据。V1.0.30 隐藏路由资源,等待用户复验,任务状态保持 pending。pending。completed-static。pending。pending。forge_schema_history、应用/关联/入口计数、关键 API 返回、发布和回滚场景。pending,不得写成通过。/archive。BusinessApplicationTemplateService、BusinessApplicationController、目标服务测试源码。ApplicationInitializeStep.vue、ApplicationEditorDrawer.vue、business-application.js。V1.0.33__hide_legacy_lowcode_model_menu.sql、相关说明文案。V1.0.33,只隐藏 /ai/lowcode-models 菜单显示,不删除资源、路由、API 或模型数据;简易表导入继续由应用/对象向导承接。BusinessApplicationReadinessService、BusinessApplicationAssetSelectionService、发布检查测试源码。ApplicationWorkspaceHeader.vue、application.[applicationCode].vue。LowcodePreviewPane 草稿页已被后续 Task 52 的真实页面预览替代;V1.0.34 和旧路由仅保留已执行迁移兼容,不再作为工作台预览目标。objects 深链首屏直接显示应用头部和对象内容;无额外顶部空白;按用户分工不执行构建和浏览器验证。ApplicationInitializeStep.vue、来源选择组件、ApplicationEditorDrawer.vue、application.[applicationCode].vue、CRUD 配置与动态数据预览权限链路。/ai/crud-page/:configKey?designPreview=1,草稿配置和动态数据访问均要求对象设计权限,正式运行发布门禁不变。模板线框高度缩小并锁定边框盒模型,标题区和推荐徽标设置稳定布局;来源切换改为自有两列分段按钮,避免 Naive 单选按钮在抽屉中压缩重叠。按用户分工仅完成静态检查,真实页面由用户验收。BusinessFieldSchemaService.java、BusinessFieldSchemaServiceTest.java。TEXT/SWITCH/NUMBER 等类型不受“状态/类型/金额”等名称规则影响;字段类型缺失时仍允许名称推断;真正字典组件未配置字典或静态选项时继续阻断,并返回具体字段名称。TEXT,不再触发名称推断。字典校验文案补充字段名称和可选修复方式;新增显式 TEXT、SWITCH、未知类型和真实字典字段回归测试源码。按用户分工不运行 JUnit,由用户完成真实保存验证。AiCrudConfigService.java、BusinessObjectDesignerService.java、草稿渲染相关测试源码。modelSchema/pageSchema 构建运行配置;加载主对象草稿时根据当前关系和子对象草稿重新水合页面模型引用;正式运行仍读取发布快照。designPreview=1 链路看到最新草稿。designPreview=true 现在先按 configKey 定位对象并调用 prepareRuntimeDraft,根据最新关系和子对象字段刷新主对象草稿图,再强制从当前 modelSchema/pageSchema 编译运行配置;普通运行仍走不可变发布版本。应用协调发布在权威检查前只刷新 PRIMARY 对象聚合图,不要求用户逐个进入对象发布。已补静态契约测试源码,真实预览保持 pending-user。BusinessObjectDesignerService.java、BusinessFormDesigner.vue、ForgePropertyPanel.vue、字段/表单协议测试源码。fieldSettings;仅在新字段自动创建或用户显式编辑字段资产时更新字段定义;页面控件、标题、提示、只读、隐藏和表单校验保持在表单 Schema;列表继续使用页面 fieldSettings。applyFormDesignerSchemaToModel;既有字段从表单移除时继续保留在字段资产,新拖入且不存在的字段才根据组件生成初始定义。控件切换、页面校验和页面最大长度只修改当前表单组件;显式“保存字段”仍可更新字段资产。字段编码重命名、数据库映射和公式等全局能力保持原协议。BusinessFieldManager.vue、BusinessFieldPropertyPanel.vue,必要时新增共享字段摘要组件。字段列表 + 420~460px 固定属性栏,980px 以下只挂载同一属性面板的右侧抽屉;保留未保存切换/关闭保护。头部统计收敛为业务字段、系统字段、结构一致三项紧凑摘要,颜色改用 Forge/Naive 主题变量。属性页签收敛为“业务定义 / 规则与安全 / 数据库与开发”,公式与调试只保留在表单设计器的字段公式入口;移除全局“显示在表单、显示在列表、作为查询条件”开关;默认控件和默认查询方式明确只供新页面继承。字段列表只展示是否已进入当前表单,新建字段弹窗明确页面配置需到对应设计器完成。test-spec.md、execution-log.md、code-copilot/memory/decisions.md、相关测试文件。pending-user,不宣称真实运行通过。BusinessApplicationDraftPreviewContractTest 测试源码,覆盖草稿强制编译、预览前关系图刷新、发布前 PRIMARY 刷新和页面配置不反写字段资产契约;同步测试矩阵、执行日志、架构决策和踩坑记录。按用户分工仅执行目标 rg 与差异空白检查,不运行 Maven、JUnit、Lint、build、API、数据库、Vite 或浏览器。BusinessFieldPropertyPanel.vue,必要时同步字段新增表单。updateRequired 与类型默认值解析函数,只对可安全推断类型自动赋值。0,日期和日期时间填当前本地值,复选/文件/图片填 [],文本填 -。自动值通过本地标记追踪,切换为不可安全推断类型时会撤销自动值;既有或用户手填默认值不覆盖,字典、人员、部门、地区和引用字段显示人工选择提示。LowcodeErDiagram.vue、BusinessRelationDesigner.vue。DETAIL 关系,复用现有保存协议和自动默认值。LowcodeErDiagram 增加可选编辑模式、字段连接点、贝塞尔预览线、关系命中区和选中态,不新增依赖。关系页默认打开可视化关系图,用户先选择画布对象并按需加载字段,再从任意方向拖线;父层统一归一化为当前对象到目标对象的 DETAIL 关系。同对象自连、目标对象互连和跨业务域目标被拒绝;点击已有配置线或标签会打开对应关系属性。BusinessRelationDesigner.vue。当前对象字段 1 → N 目标对象字段 端点卡,回显字段单独放置;选择器、映射、审批数量仍在折叠区。新增关系向导分为选择目标、确认字段端点、页面展示三段,移除只有一个选项的关系类型下拉。字段联动改为“控制字段 → 联动方式 → 目标字段”,字典/远程数据源和空值/清空/启用策略分别成组;窄屏降级为单列。application.[applicationCode].vue、ApplicationWorkspaceHeader.vue、ApplicationOverviewPanel.vue。execution-log.md、相关目标文件。pending-user。pending-user。ApplicationTable.vue、app-center/index.vue。ApplicationTable 在不改变组件名和事件协议的前提下改为紧凑应用卡片网格,轨道以 268px 为最低宽度并等分当前行剩余空间;修正原 minmax(268px, 320px) 按固定上限计算列数、可放三列却只显示两列的问题。auto-fill 继续保留宽屏空轨道,少量数据不会拉满整行。卡片高度约 166px,包含应用身份、设计状态、单行说明、业务域、更新时间、四类资产计数、启停状态/版本和固定底部操作。“草稿”状态标签使用跟随主题的低饱和暖色背景区分,问题状态原有警示仍保留。移除表头、六列宽度、ResizeObserver 和 1180px 最小宽度分支;容器改为仅纵向滚动,筛选与分页保持原逻辑。LowcodeCodegenService.java、既有代码生成契约测试源码。LowcodeCodegenService 在存在统一模型/页面协议时不再复用旧 layoutType/searchSchema/columnsSchema/editSchema/apiConfig,最新页面 Schema 编译出的布局强制覆盖旧 simple-crud,运行派生 options 也覆盖旧派生字段但保留代码包设置;发布来源复用 AiCrudConfigService.resolvePublishedRuntimeConfig 读取已发布快照。Velocity 继续使用同一策略,根据最新 treeConfig/masterDetailConfig 进入单表、左树右表或主子表分支。增量修复主子表派生配置为空时静默退化为单表的问题:优先读取 masterDetailConfig.children,并从 pageSchema.modelRefs 的 CHILD_LIST/DETAIL/ONE_TO_MANY 关系补齐主外键;仍无法解析时直接阻断并提示检查子表关系。再次修正关联元数据私有内部类导致 Velocity 无法访问 getter 的问题,将模板元数据改为公开静态类型;Java 产物增加未解析变量扫描,渲染失败改为整体失败,不再跳过文件。BusinessApplicationCodegenService.java、BusinessApplicationController.java、代码生成请求/预览 VO、共享业务接口配置装配类。/ai/business/application/{id}/code/* 设置、预览、下载接口。默认读取应用全部对象,也接受 objectIds 批量范围;选中 PRIMARY 时刷新关系草稿并消费已进入主子/左树页面的 DETAIL/REFERENCE 依赖,其余对象复用现有对象生成器独立生成。聚合依赖除 Entity/Mapper 外继续生成 DTO、Query、Service 和 ServiceImpl;主 Service 仍通过 Mapper 在同一事务内执行明细查询、插入、替换和清理,遵循 Service 间不互相注入约束。文件按可部署目录合并,同路径不同内容直接阻断;ZIP 增加应用 README 和 manifest。新增 V1.0.35 代码设置/预览/下载权限,只继承应用编辑角色。AppCodePanel.vue、ApplicationTable.vue、app-center/index.vue、ApplicationWorkspaceHeader.vue、application.[applicationCode].vue、business-application.js。AppCodePanel 增加 APPLICATION scope,继续复用原文件树、CodeMirror、复制和下载逻辑,只增加应用摘要与对象复选区。应用总览更多操作和应用工作台头部都打开同一面板;来源、包设置或对象选择变化后下载立即禁用,只有当前参数成功预览后才允许下载当前预览。增量将应用模式的代码包设置改为默认收起,展开后的设置内容独立滚动,对象区同步压缩,并为文件树/源码区保留 300px 最小高度。test-spec.md、execution-log.md、代码生成契约测试。pending-user。BusinessApplicationCodegenContractTest 测试源码,覆盖统一生成器复用、最新 Schema 覆盖、三类布局模板、Mapper XML 和应用 API 契约;增量增加主子表页面关系兜底、失败关闭、关联类型实际渲染、子表独立 Service 文件和主 Service 聚合方法契约。完成模板指令平衡、Flyway placeholder、Mapper XML、目标引用和已跟踪/未跟踪文件差异空白检查;按用户分工未运行 Maven/JUnit、前端 Lint/build、API、Flyway、Vite 或浏览器,真实生成与解压运行保持 pending-user。LowcodeProtocolSnapshotBuilder.java,修改 VelocityCodegenStrategy.java、BusinessCodegenConfigAssembler.java、应用代码包 manifest/README。AiCrudConfig 为载体序列化全部顶层字段;将 model/page/search/columns/edit/api/options/dict/desensitize/encrypt/trans 解析为结构化 JSON;生成独立 generated_* 键;输出 frontend/backend/protocol/coverage 四类资产并校验存在性。GeneratedLowcodeRuntimeConfigBuilder,普通旧配置键也会派生 generated_* 键,非法 JSON、缺失权威 Schema 和未改写平台通用接口均失败关闭。forge-admin-ui/src/views/ai/crud-page.vue、新增 forge-admin-ui/src/components/lowcode-runtime/LowcodeRuntimePage.vue、templates/vm/ai-crud/index.vue.vm。runtimeConfig;共享组件提供稳定出口;生成页面只导入本地 JSON 并传入共享组件;路由和设计预览原链路保持兼容。transformColumns/transformFields/preloadDicts;多表单、字段渲染、动作、Hook、详情、树和主子表继续走 crud-page.vue 唯一路径。crud-page.vue 增加内嵌 runtimeConfig 输入并新增稳定的 LowcodeRuntimePage 出口;生成 Vue 模板缩减为共享组件和本地 runtime-config.json。左树右表继续加载 TreeCrudTemplate,主子表继续加载 MasterDetailCrudTemplate,异步导出任务在存在业务 API 配置时走生成 Controller 的任务端点。GeneratedLowcodeConfigRegistry.java,修改 DynamicCrudService.java、templates/vm/controller.java.vm、相关测试构造。/ai/crud/ 路径和静态 Service 规则复制;运行时公式、自动编号、唯一约束、数据权限、加密和主子事务均由共享内核承载;配置冲突失败关闭。DynamicCrudService 对 generated_* 键优先读取内嵌配置且不回退数据库同名配置;生成 Controller 改为委托动态 CRUD/Excel 内核并保留 POST-safe 业务 URL、业务事件发布、树查询和导入导出。业务 API 投影补齐 /tree、异步导出任务列表/详情,协议中的页面跳转改写为生成前端路由。BusinessApplicationCodegenContractTest.java、新增协议快照/注册器测试、test-spec.md、execution-log.md、memory。pending-user。pending-user。templates/vm/controller.java.vm、service.java.vm、serviceImpl.java.vm、mapper.java.vm、mapper.xml.vm。DynamicCrudService/DynamicCrudExcelService;三类布局静态代码契约完整;Service 无 LambdaQueryWrapper。I${className}Service 调用;ServiceImpl 继承 MyBatis-Plus ServiceImpl,基础增改删使用 Mapper/MP 内置方法,分页、列表、树、主子明细查询继续位于 Mapper XML。查询编译补齐 eq/ne/like/left_like/right_like/gt/ge/gte/lt/le/lte/in/between,IN/BETWEEN 在 Query DTO 使用类型化 List。主子写入、删除和导入保持 Service 事务,Controller 不再引用动态 CRUD 服务。VelocityCodegenStrategy.java、ServiceImpl、README 和 ownership 资产。.java.example 和文件所有权清单。proceed;用户实现路径不出现在 GENERATED 文件列表。ServiceExtension 默认方法契约和有序 around 调用链,使用 ObjectProvider.orderedStream() 保证零扩展 Bean 也能执行默认逻辑。扩展示例只输出到 examples/...java.example,正式 custom 目录不进入生成文件集合;每个对象新增 ownership 清单,明确 GENERATED、CREATE_ONCE_SAMPLE 与 NEVER_GENERATED_NEVER_OVERWRITTEN。新增 LowcodeStaticCodegenContributor,后续后端协议能力可由统一生成策略自动装配到所有下载入口。controller.java.vm、sql/excel.sql.vm、运行配置/协议构建器、DynamicCrudService.java、classpath 注册器及测试。META-INF/forge-lowcode 产物;coverage 改为静态编译语义。forge-starter-excel 元数据引擎,数据源 Bean 显式指向生成 Service;导入由标准 Excel 服务解析 DTO 后调用生成 Service 的事务导入方法。excel.sql.vm 已使用 WHERE NOT EXISTS 并由公共策略输出。删除 classpath 注册器、DynamicCrudService 内嵌配置分支、后端 META-INF/forge-lowcode 资产和异步动态导出任务 API;在线动态 CRUD 继续从数据库读取配置。coverage 改为静态编译语义,公式、自动编号、唯一校验和任意组合查询等未内建语义明确列入 REQUIRES_EXTENSION,不再误报完整覆盖。BusinessApplicationCodegenContractTest.java、协议构建测试、test-spec.md、execution-log.md、memory。pending-user。xmllint、目标引用、tracked/untracked 差异空白检查无错误;按既定边界未运行 Maven/JUnit、前端 build、服务、数据库和浏览器,真实 ZIP 与运行保持 pending-user。VelocityCodegenStrategy.java、templates/vm/entity.java.vm、生成契约测试。NONE;仅在匹配到真实字段时打开总开关;模板增加最终保护。Desensitize 残留,PHONE 等真实策略仍正常生成。NONE 归一为空;实体级 import 开关改为只统计真实生成字段,配置指向不存在字段时不再产生无用 import。实体模板保留非空且非 NONE 的最终保护,新增契约测试源码覆盖无策略实体。LowcodeCodegenRequest.java、LowcodeDomainSchema.java、三类代码生成 Service、BusinessCodegenConfigAssembler.java、VelocityCodegenStrategy.java。options.codegen;实现类名和安全相对路径规范化;统一主表/关联表类名;按后端、前端和 SQL 子项控制输出。options.codegen 字段,支持 entityPrefix、有序 stripTablePrefixes、后端 Java/Mapper XML/前端页面/前端 API 四类根目录,以及后端、前端、Excel SQL 独立范围。主表、树对象和明细对象统一通过最终 className 派生全部类型与文件名;非法 Java 前缀、绝对路径、空目录和 .. 失败关闭,同路径不同内容不再静默覆盖。应用级、访问入口级、低代码应用级和旧 configKey 公共策略均消费同一协议。AppCodePanel.vue。BusinessApplicationCodegenContractTest.java、test-spec.md、execution-log.md、memory。pending-user。pending-user。每个 Phase 单独作为一个可部署里程碑:
任一阶段超出 Spec 时停止扩张,新增需求另立变更,不把“完整低代码平台”无限塞入当前变更。