diff --git a/app-builder/plugins/aipp-plugin/src/main/java/modelengine/fit/jober/aipp/domains/appversion/service/impl/AppVersionServiceImpl.java b/app-builder/plugins/aipp-plugin/src/main/java/modelengine/fit/jober/aipp/domains/appversion/service/impl/AppVersionServiceImpl.java index b53c3eefcf..047c8624fa 100644 --- a/app-builder/plugins/aipp-plugin/src/main/java/modelengine/fit/jober/aipp/domains/appversion/service/impl/AppVersionServiceImpl.java +++ b/app-builder/plugins/aipp-plugin/src/main/java/modelengine/fit/jober/aipp/domains/appversion/service/impl/AppVersionServiceImpl.java @@ -333,12 +333,24 @@ public AppVersion update(String appId, AppBuilderAppDto appDto, OperationContext if (appVersion.isPublished()) { throw new AippException(AippErrCode.APP_HAS_ALREADY); } - List tasks = appVersion.getPublishedTasks(context); - if (CollectionUtils.isNotEmpty(tasks) && !StringUtils.equals(tasks.get(0).getEntity().getName(), - appDto.getName())) { - throw new AippException(AippErrCode.APP_NAME_HAS_PUBLISHED); - } + + // 检查名称是否发生变化 + String oldName = appVersion.getData().getName(); + String newName = appDto.getName(); + boolean nameChanged = !StringUtils.equals(oldName, newName); + this.validateAppName(appDto.getName(), context); + + // 如果名称发生变化,更新所有草稿态任务的name字段 + if (nameChanged) { + List previewTasks = this.appTaskService.getPreviewTasks( + appVersion.getData().getAppSuiteId(), context); + for (AppTask previewTask : previewTasks) { + previewTask.getEntity().setName(newName); + this.appTaskService.updateTask(previewTask, context); + } + } + appVersion.getData().setName(appDto.getName()); appVersion.getData().setUpdateBy(context.getOperator()); appVersion.getData().setUpdateAt(LocalDateTime.now()); diff --git a/app-builder/plugins/aipp-plugin/src/main/resources/mapper/AppBuilderAppMapper.xml b/app-builder/plugins/aipp-plugin/src/main/resources/mapper/AppBuilderAppMapper.xml index e2736df041..471000add3 100644 --- a/app-builder/plugins/aipp-plugin/src/main/resources/mapper/AppBuilderAppMapper.xml +++ b/app-builder/plugins/aipp-plugin/src/main/resources/mapper/AppBuilderAppMapper.xml @@ -90,7 +90,7 @@ select from ( - SELECT DISTINCT ON ( "name" ) * FROM app_builder_app where tenant_id = #{tenantId} and is_deleted = 0 + SELECT DISTINCT ON ( "app_suite_id" ) * FROM app_builder_app where tenant_id = #{tenantId} and is_deleted = 0 and type = #{cond.type} @@ -104,7 +104,6 @@ and state = #{cond.state} - and (attributes ->> 'latest_version') is null @@ -130,7 +129,7 @@ and (user_group_id = #{cond.userGroupId} or user_group_id = '*') ORDER BY - "name", update_at DESC + "app_suite_id", update_at DESC ) as sub WHERE ORDER BY update_at DESC offset #{offset} limit #{limit} @@ -176,7 +175,7 @@ diff --git a/app-builder/plugins/aipp-plugin/src/test/java/modelengine/fit/jober/aipp/domains/appversion/AppVersionServiceTest.java b/app-builder/plugins/aipp-plugin/src/test/java/modelengine/fit/jober/aipp/domains/appversion/AppVersionServiceTest.java index ea99b2e0e9..baeb922c50 100644 --- a/app-builder/plugins/aipp-plugin/src/test/java/modelengine/fit/jober/aipp/domains/appversion/AppVersionServiceTest.java +++ b/app-builder/plugins/aipp-plugin/src/test/java/modelengine/fit/jober/aipp/domains/appversion/AppVersionServiceTest.java @@ -513,6 +513,9 @@ public void testUpdateVersion() { doNothing().when(this.uploadedFileManageService).changeRemovable(anyString(), anyInt()); doNothing().when(this.appBuilderAppMapper).updateOne(any()); + // Mock getPreviewTasks to return empty list (no name change in this test) + when(this.appTaskService.getPreviewTasks(anyString(), any())).thenReturn(Collections.emptyList()); + // when. OperationContext context = new OperationContext(); context.setOperator("zy"); @@ -533,6 +536,50 @@ public void testUpdateVersion() { verify(this.uploadedFileManageService, times(2)).changeRemovable(anyString(), anyInt()); } + @Test + @DisplayName("测试 update version with name change") + public void testUpdateVersionWithNameChange() { + // given. + AppBuilderAppPo data = AppBuilderAppPo.builder() + .appSuiteId("app_1") + .name("oldAppName") + .state(AppState.IMPORTING.getName()) + .build(); + AppVersion appVersion = mock(AppVersion.class); + when(this.appBuilderAppMapper.selectWithId(anyString())).thenReturn(data); + when(this.appVersionFactory.create(any(), any())).thenReturn(appVersion); + when(appVersion.getData()).thenReturn(data); + when(appVersion.getIcon()).thenReturn("icon1"); + doNothing().when(appVersion).putAttributes(any()); + + doNothing().when(this.appBuilderAppMapper).updateOne(any()); + doNothing().when(this.uploadedFileManageService).changeRemovable(anyString(), anyInt()); + + // Mock preview tasks + AppTask previewTask = mock(AppTask.class); + when(previewTask.getEntity()).thenReturn(AppTask.asEntity()); + when(this.appTaskService.getPreviewTasks(eq("app_1"), any())).thenReturn(List.of(previewTask)); + doNothing().when(this.appTaskService).updateTask(any(), any()); + + // when. + OperationContext context = new OperationContext(); + context.setOperator("zy"); + this.appVersionService.update("app_version_1", AppBuilderAppDto.builder() + .name("newAppName") + .type(AppTypeEnum.APP.code()) + .appType(NORMAL.name()) + .state(AppState.INACTIVE.getName()) + .version("1.0.0") + .build(), context); + + // then. + assertEquals("newAppName", data.getName()); + assertEquals("zy", data.getUpdateBy()); + // Verify that preview task was updated + verify(this.appTaskService, times(1)).getPreviewTasks(eq("app_1"), any()); + verify(this.appTaskService, times(1)).updateTask(eq(previewTask), any()); + } + @Test @DisplayName("测试 update 通过graph") public void testUpdateByGraph() { diff --git a/app-builder/plugins/task-new/src/main/resources/mapper/MetaMapper.xml b/app-builder/plugins/task-new/src/main/resources/mapper/MetaMapper.xml index dc9ae6d4f8..937d3e10d1 100644 --- a/app-builder/plugins/task-new/src/main/resources/mapper/MetaMapper.xml +++ b/app-builder/plugins/task-new/src/main/resources/mapper/MetaMapper.xml @@ -29,6 +29,9 @@ update task_new + + name = #{name}, + version = #{version}, diff --git a/app-builder/services/aipp-service/src/main/java/modelengine/fit/jober/aipp/common/exception/AippErrCode.java b/app-builder/services/aipp-service/src/main/java/modelengine/fit/jober/aipp/common/exception/AippErrCode.java index 296bd63434..de4d872a51 100644 --- a/app-builder/services/aipp-service/src/main/java/modelengine/fit/jober/aipp/common/exception/AippErrCode.java +++ b/app-builder/services/aipp-service/src/main/java/modelengine/fit/jober/aipp/common/exception/AippErrCode.java @@ -212,11 +212,6 @@ public enum AippErrCode implements ErrorCode, RetCode { */ INVALID_OPERATION(90002913, "系统错误,应用信息为空,请联系管理员。"), - /** - * 该应用已经成功发布过,无法修改应用名称 - */ - APP_NAME_HAS_PUBLISHED(90002914, "该应用已经成功发布过,无法修改应用名称。"), - /** * 禁止使用更低的版本号 */