diff --git a/server/src/enums/exceptionCode.ts b/server/src/enums/exceptionCode.ts index f930188f..48a17ff9 100644 --- a/server/src/enums/exceptionCode.ts +++ b/server/src/enums/exceptionCode.ts @@ -25,4 +25,5 @@ export enum EXCEPTION_CODE { RESPONSE_PAUSING = 9006, // 问卷已暂停 UPLOAD_FILE_ERROR = 5001, // 上传文件错误 + SERVER_ERROR = 5002, // 获取数据失败 } diff --git a/server/src/models/surveyMeta.entity.ts b/server/src/models/surveyMeta.entity.ts index cb37e430..08b74b7b 100644 --- a/server/src/models/surveyMeta.entity.ts +++ b/server/src/models/surveyMeta.entity.ts @@ -71,7 +71,7 @@ export class SurveyMeta extends BaseEntity { deletedAt: Date; @Column() - isCompletedeleted: boolean; + isCompleteDeleted: boolean; @BeforeInsert() initDefaultInfo() { diff --git a/server/src/modules/survey/__test/collaborator.service.spec.ts b/server/src/modules/survey/__test/collaborator.service.spec.ts index 9c9a8019..5a28167c 100644 --- a/server/src/modules/survey/__test/collaborator.service.spec.ts +++ b/server/src/modules/survey/__test/collaborator.service.spec.ts @@ -376,9 +376,28 @@ describe('CollaboratorService', () => { describe('getManageListByUserId', () => { it('should return a list of collaborators who has manage permission by user id', async () => { const userId = new ObjectId().toString(); - + + const findSpy = jest.spyOn(repository, 'find').mockResolvedValue([ + { + _id: '1', + surveyId: '1', + userId, + permissions: [SURVEY_PERMISSION.SURVEY_COOPERATION_MANAGE], + } as unknown as Collaborator, + ]); + const result = await service.getManageListByUserId({ userId }); - + + expect(findSpy).toHaveBeenCalledWith({ + where: { + userId, + permissions: { + $elemMatch: { + $eq: SURVEY_PERMISSION.SURVEY_COOPERATION_MANAGE, + }, + }, + }, + }); expect(result).toEqual([ { _id: '1', surveyId: '1', userId, permissions: [SURVEY_PERMISSION.SURVEY_COOPERATION_MANAGE] }, ]); diff --git a/server/src/modules/survey/controllers/recycleBin.controller.ts b/server/src/modules/survey/controllers/recycleBin.controller.ts index 165dbcc3..915d021e 100644 --- a/server/src/modules/survey/controllers/recycleBin.controller.ts +++ b/server/src/modules/survey/controllers/recycleBin.controller.ts @@ -21,16 +21,15 @@ export class RecycleBinController { @Get('') @HttpCode(200) async getCount(@Request() req) { - - const userId = req.user._id.toString(); - let isRecycleBin = true; + // 查询当前用户协作的问卷 let cooperationList = [] - cooperationList = - await this.collaboratorService.getManageListByUserId({ userId }); + cooperationList = await this.collaboratorService.getManageListByUserId({ userId }); const surveyIdList1 = cooperationList.map((item) => item.surveyId); - const surveyIdList2 = (await this.workspaceService.getAllSurveyIdListByUserId(userId, isRecycleBin)).data.surveyIdList + // 查询当前用户参与的空间下的回收站的问卷 + const surveyIdList2 = (await this.workspaceService.getAllSurveyIdListByUserId(userId, true)).data.surveyIdList const surveyIdList = [...new Set([...surveyIdList1, ...surveyIdList2])]; + // 查询回收站中所有问卷总数 const allSurveyTotal = await this.surveyMetaService.countSurveyMetaByGroupId({ userId, diff --git a/server/src/modules/survey/controllers/surveyMeta.controller.ts b/server/src/modules/survey/controllers/surveyMeta.controller.ts index 2d7e9f87..e5285bca 100644 --- a/server/src/modules/survey/controllers/surveyMeta.controller.ts +++ b/server/src/modules/survey/controllers/surveyMeta.controller.ts @@ -116,6 +116,7 @@ export class SurveyMetaController { await this.collaboratorService.getCollaboratorListByUserId({ userId }); } if (isRecycleBin) { + // 回收站查询当前用户协作的问卷 cooperationList = await this.collaboratorService.getManageListByUserId({ userId }); } @@ -126,6 +127,7 @@ export class SurveyMetaController { const surveyIdList1 = cooperationList.map((item) => item.surveyId); let surveyIdList2 = [] if (isRecycleBin) { + // 回收站查询当前用户参与的空间下的回收站的问卷 surveyIdList2 = (await this.workspaceService.getAllSurveyIdListByUserId(userId, isRecycleBin)).data.surveyIdList } const surveyIdList = [...new Set([...surveyIdList1, ...surveyIdList2])]; diff --git a/server/src/modules/workspace/_test/workspace.service.spec.ts b/server/src/modules/workspace/_test/workspace.service.spec.ts index b9e768e4..b5df4873 100644 --- a/server/src/modules/workspace/_test/workspace.service.spec.ts +++ b/server/src/modules/workspace/_test/workspace.service.spec.ts @@ -188,23 +188,96 @@ describe('WorkspaceService', () => { describe('getAllSurveyIdListByUserId', () => { it('should return all survey id list of work space under a user', async () => { + const userId = '1'; + const isRecycleBin = false; const workspaceMemberList = [ - { userId: '1', workSpaceId: 'f'} - ] + { userId: '1', workspaceId: 'workspace1' }, + { userId: '1', workspaceId: 'workspace2' } + ]; const surveyMetaList = [ - { workSpaceId: 'f', isDeleted: false, _id: 666 }, + { _id: new ObjectId('507f1f77bcf86cd799439011'), workspaceId: 'workspace1' }, + { _id: new ObjectId('507f1f77bcf86cd799439012'), workspaceId: 'workspace2' } ]; - jest - .spyOn(mockWorkspaceMemberService, 'findAllByUserId') - .mockResolvedValue(workspaceMemberList as any); - jest - .spyOn(mockSurveyMetaService, 'getSurveyMetaListByWorkspaceIdList') - .mockResolvedValue(surveyMetaList as any) + // Mock WorkspaceMemberService.findAllByUserId + mockWorkspaceMemberService.findAllByUserId.mockResolvedValue(workspaceMemberList); + + // Mock SurveyMetaService.getSurveyMetaListByWorkspaceIdList + mockSurveyMetaService.getSurveyMetaListByWorkspaceIdList.mockResolvedValue(surveyMetaList); + + const result = await service.getAllSurveyIdListByUserId(userId, isRecycleBin); + + // Verify the method calls + expect(mockWorkspaceMemberService.findAllByUserId).toHaveBeenCalledWith({ userId }); + expect(mockSurveyMetaService.getSurveyMetaListByWorkspaceIdList).toHaveBeenCalledWith({ + workspaceIdList: ['workspace1', 'workspace2'], + isDeleted: isRecycleBin + }); + + // Verify the result + expect(result).toEqual({ + code: 200, + data: { + surveyIdList: [ + '507f1f77bcf86cd799439011', + '507f1f77bcf86cd799439012' + ] + } + }); + }); + + it('should return empty list when user has no workspace memberships', async () => { + const userId = '1'; + const isRecycleBin = true; + + // Mock empty workspace member list + mockWorkspaceMemberService.findAllByUserId.mockResolvedValue([]); + + // Mock empty survey meta list + mockSurveyMetaService.getSurveyMetaListByWorkspaceIdList.mockResolvedValue([]); + + const result = await service.getAllSurveyIdListByUserId(userId, isRecycleBin); + + expect(mockWorkspaceMemberService.findAllByUserId).toHaveBeenCalledWith({ userId }); + expect(mockSurveyMetaService.getSurveyMetaListByWorkspaceIdList).toHaveBeenCalledWith({ + workspaceIdList: [], + isDeleted: isRecycleBin + }); - const result = await service.getAllSurveyIdListByUserId('1', false); + expect(result).toEqual({ + code: 200, + data: { + surveyIdList: [] + } + }); + }); + + it('should handle recycle bin mode correctly', async () => { + const userId = '1'; + const isRecycleBin = true; + const workspaceMemberList = [ + { userId: '1', workspaceId: 'workspace1' } + ]; + const surveyMetaList = [ + { _id: new ObjectId('507f1f77bcf86cd799439011'), workspaceId: 'workspace1' } + ]; + + mockWorkspaceMemberService.findAllByUserId.mockResolvedValue(workspaceMemberList); + mockSurveyMetaService.getSurveyMetaListByWorkspaceIdList.mockResolvedValue(surveyMetaList); + + const result = await service.getAllSurveyIdListByUserId(userId, isRecycleBin); + + expect(mockSurveyMetaService.getSurveyMetaListByWorkspaceIdList).toHaveBeenCalledWith({ + workspaceIdList: ['workspace1'], + isDeleted: true + }); - expect(result).toEqual({code: 200, data: {surveyIdList: ['666']}}); + expect(result).toEqual({ + code: 200, + data: { + surveyIdList: ['507f1f77bcf86cd799439011'] + } + }); }); }); diff --git a/web/src/management/pages/list/components/RecycleBinList.vue b/web/src/management/pages/list/components/RecycleBinList.vue index ac8d146b..c2a58513 100644 --- a/web/src/management/pages/list/components/RecycleBinList.vue +++ b/web/src/management/pages/list/components/RecycleBinList.vue @@ -312,7 +312,7 @@ const onRecover = async (row) => { const onCompleteDelete = async (row) => { try { - await ElMessageBox.confirm('将从回收站中永久删除改问卷,是否确认删除?', '提示', { + await ElMessageBox.confirm('将从回收站中永久删除该问卷,是否确认删除?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' diff --git a/web/src/management/pages/list/index.vue b/web/src/management/pages/list/index.vue index eded204c..e42e4445 100644 --- a/web/src/management/pages/list/index.vue +++ b/web/src/management/pages/list/index.vue @@ -243,8 +243,10 @@ const showExcelImport = ref(false) const showCreateForm = ref(false) const questionList = ref>([]) const createMethod = ref('') -const isRecycleBin = ref(false) +const isRecycleBin = computed(() => menuType.value === MenuType.RecycleBin); + const showAIGenerate = ref(false) + const fetchSpaceList = async (params?: any) => { spaceLoading.value = true workSpaceStore.changeWorkSpace('') @@ -273,22 +275,22 @@ const handleSpaceSelect = async (id: string) => { workSpaceStore.changeMenuType(MenuType.PersonalGroup) workSpaceStore.changeWorkSpace('') await fetchGroupList() - isRecycleBin.value = false + // isRecycleBin.value = false break case MenuType.SpaceGroup: workSpaceStore.changeMenuType(MenuType.SpaceGroup) workSpaceStore.changeWorkSpace('') await fetchSpaceList() - isRecycleBin.value = false + // isRecycleBin.value = false break case MenuType.RecycleBin: workSpaceStore.changeMenuType(MenuType.RecycleBin) workSpaceStore.changeWorkSpace('') - isRecycleBin.value = true + // isRecycleBin.value = true await fetchSurveyList() break default: { - isRecycleBin.value = false + // isRecycleBin.value = false const parentMenu = spaceMenus.value.find((parent: any) => parent.children.find((children: any) => children.id.toString() === id) ) diff --git a/web/src/management/stores/workSpace.ts b/web/src/management/stores/workSpace.ts index ec4f1143..48d1648d 100644 --- a/web/src/management/stores/workSpace.ts +++ b/web/src/management/stores/workSpace.ts @@ -251,11 +251,13 @@ export const useWorkSpaceStore = defineStore('workSpace', () => { async function getRecycleBinCount(params?: any) { + const recycleBinMenu = spaceMenus.value.find(menu => menu.id === MenuType.RecycleBin); + try { const res: any = await getRecycleBinCountReq(params) if (res.code === CODE_MAP.SUCCESS) { const { count } = res.data - spaceMenus.value[2].count = count + recycleBinMenu && (recycleBinMenu.count = count) } else { ElMessage.error('getRecycleBinCount' + res.errmsg) }