status: done created: 2026-08-04 complexity: 🟡中等
应用中心删除业务应用时会保留可复用的业务对象。当业务域下最后一个应用删除后,业务对象仍存在,但应用中心没有独立的全局对象清理入口;此时删除业务域会提示“该业务套件已存在业务对象,不能删除”,用户无法完成业务域清理。
本变更将删除行为调整为显式清理:仍有子业务域、业务应用或访问入口时继续阻止删除;业务域仅剩未被有效应用使用的孤立对象时,在用户确认后清理对象关系、逻辑删除业务对象并逻辑删除业务域。业务数据表、历史设计版本和发布记录不做物理删除。
forge-admin-ui/src/views/app-center/index.vue 的 removeSuite 从应用中心业务域树发起删除。forge-admin-ui/src/views/app-center/suite.[suiteCode].vue 的 deleteSuite 从旧业务域详情页发起删除。forge-admin-ui/src/api/business-app.js 的 deleteBusinessSuite 调用 DELETE /ai/business/suite/{id}。BusinessSuiteController.delete 委托 BusinessSuiteService.delete 执行删除。BusinessApplicationService.delete 会逻辑删除应用对象关联,但明确保留业务对象,支持后续复用。BusinessSuiteService.delete 按“子域 → 业务对象 → 访问入口 → 业务应用”顺序校验;只要 ai_business_object 中仍有未删除对象,就直接报“该业务套件已存在业务对象,不能删除”。BusinessSuiteMapper.countObjectsBySuite 已显式过滤 del_flag = 0,问题不是已删除数据误计数,而是应用删除后的业务对象按现有产品语义仍被保留。BusinessApplicationObjectService.validateAndConvert 要求业务应用和业务对象属于同一业务域;应用带对象/入口时也禁止直接迁移业务域。ai_business_object_relation 是关系重建表,现有实现使用物理删除;ai_business_object、ai_business_suite 使用主键墓碑逻辑删除。cleanupOrphanObjects=true 才允许进入孤立对象清理。ai_business_application_object 引用,则禁止删除。ai_business_object_relation 属于关系重建表,随业务域删除做物理清理;ai_business_object 与 ai_business_suite 使用 del_flag = id 逻辑删除。| 操作 | 表名 | 字段/索引 | 说明 |
|---|---|---|---|
| 物理删除 | ai_business_object_relation |
按 tenant_id + suite_code |
关系重建表,避免同编码业务域重建后读取旧关系 |
| 逻辑删除 | ai_business_object |
del_flag = id |
仅清理目标业务域当前未删除对象 |
| 逻辑删除 | ai_business_suite |
del_flag = id |
保持现有 MyBatis-Plus 删除语义 |
不新增 Flyway 脚本,不修改表结构或索引。
| 操作 | 接口 | 方法 | 变更内容 |
|---|---|---|---|
| 修改 | /ai/business/suite/{id} |
DELETE | 新增可选查询参数 cleanupOrphanObjects,默认 false;显式为 true 时可清理孤立对象 |
ai_business_object_relation 关系重建表;业务对象、业务域继续逻辑删除。BusinessSuiteService.delete 的阻断顺序、显式确认、有效应用引用保护、关系清理和逻辑删除调用;Mapper XML 关键 SQL;前端 API 参数与删除确认文案;后端目标模块测试和前端构建。BusinessSuiteService 反向注入 BusinessObjectService,避免与 BusinessObjectService → BusinessSuiteService 形成循环依赖;批量清理由 BusinessSuiteMapper XML 完成。objectCount > 0 时传 cleanupOrphanObjects=true;若并发新增对象导致数量变化,后端默认关闭策略会要求重新确认。| Task | 状态 | 实际改动文件 | 备注 |
|---|---|---|---|
| Task 1 | 已完成 | BusinessSuiteServiceTest.java |
Red 因新删除协议缺失而失败,Green 6/6 通过 |
| Task 2 | 已完成 | Controller、Service、Mapper、Mapper XML | 显式清理参数与事务内孤立对象清理 |
| Task 3 | 已完成 | 前端 API、应用中心、旧业务域详情页 | 两处入口统一提示清理影响并传参 |
| Task 4 | 已完成 | Spec、Test Spec、Execution Log、memory | 完成定向测试、全量回归、构建与静态检查 |
实现符合本 Spec:默认删除协议不会无提示清理对象;显式确认后只物理清理关系重建表,并逻辑删除对象与业务域。定向测试 6/6、前端构建和 XML/差异检查通过。generator 全量 569 个用例中有 2 个失败和 4 个错误,均位于本轮未修改的公式、Binding、扩展版本和运行配置测试,已记录为非本轮阻断项。