diff --git a/server/src/models/surveyMeta.entity.ts b/server/src/models/surveyMeta.entity.ts index f3daa3117..7191804bf 100644 --- a/server/src/models/surveyMeta.entity.ts +++ b/server/src/models/surveyMeta.entity.ts @@ -67,6 +67,9 @@ export class SurveyMeta extends BaseEntity { @Column() isDeleted: boolean; + @Column() + isCompletelyDeleted: boolean; + @Column() deletedAt: Date; diff --git a/server/src/modules/survey/__test/survey.controller.spec.ts b/server/src/modules/survey/__test/survey.controller.spec.ts index 3c674492a..855f4bf56 100644 --- a/server/src/modules/survey/__test/survey.controller.spec.ts +++ b/server/src/modules/survey/__test/survey.controller.spec.ts @@ -315,4 +315,68 @@ describe('SurveyController', () => { expect(result.code).toBe(200); }); }); + + describe('restoreSurvey', () => { + it('should restore a survey successfully', async () => { + const surveyId = new ObjectId(); + const surveyMeta = { + _id: surveyId, + surveyPath: 'test/path', + }; + + jest + .spyOn(surveyMetaService, 'restoreSurveyMeta') + .mockResolvedValue({ success: true }); + jest + .spyOn(responseSchemaService, 'restoreResponseSchema') + .mockResolvedValue({ success: true }); + + const result = await controller.restoreSurvey({ + surveyMeta, + user: { username: 'testUser', _id: new ObjectId() }, + }); + + expect(result).toEqual({ code: 200 }); + expect(surveyMetaService.restoreSurveyMeta).toHaveBeenCalledWith({ + surveyId: surveyId.toString(), + operator: 'testUser', + operatorId: expect.any(String), + }); + expect(responseSchemaService.restoreResponseSchema).toHaveBeenCalledWith({ + surveyPath: 'test/path', + }); + }); + }); + + describe('completelyDeleteSurvey', () => { + it('should completely delete a survey successfully', async () => { + const surveyId = new ObjectId(); + const surveyMeta = { + _id: surveyId, + surveyPath: 'test/path', + }; + + jest + .spyOn(surveyMetaService, 'completelyDeleteSurveyMeta') + .mockResolvedValue({ success: true }); + jest + .spyOn(responseSchemaService, 'completelyDeleteResponseSchema') + .mockResolvedValue({ success: true }); + + const result = await controller.completelyDeleteSurvey({ + surveyMeta, + user: { username: 'testUser', _id: new ObjectId() }, + }); + + expect(result).toEqual({ code: 200 }); + expect(surveyMetaService.completelyDeleteSurveyMeta).toHaveBeenCalledWith({ + surveyId: surveyId.toString(), + operator: 'testUser', + operatorId: expect.any(String), + }); + expect(responseSchemaService.completelyDeleteResponseSchema).toHaveBeenCalledWith({ + surveyPath: 'test/path', + }); + }); + }); }); diff --git a/server/src/modules/survey/__test/surveyMeta.service.spec.ts b/server/src/modules/survey/__test/surveyMeta.service.spec.ts index 2ebfa40c6..9cc4d89f1 100644 --- a/server/src/modules/survey/__test/surveyMeta.service.spec.ts +++ b/server/src/modules/survey/__test/surveyMeta.service.spec.ts @@ -242,4 +242,83 @@ describe('SurveyMetaService', () => { }); }); }); + + describe('restoreSurveyMeta', () => { + it('should restore a survey and update its status', async () => { + const surveyId = new ObjectId().toString(); + const operator = 'restorer'; + const operatorId = 'restorerId'; + + const mockUpdateResult = { + matchedCount: 1, + modifiedCount: 1, + acknowledged: true, + }; + + jest.spyOn(surveyRepository, 'updateOne').mockResolvedValue(mockUpdateResult); + + const result = await service.restoreSurveyMeta({ + surveyId, + operator, + operatorId, + }); + + expect(surveyRepository.updateOne).toHaveBeenCalledWith( + { _id: new ObjectId(surveyId) }, + { + $set: { + isDeleted: false, + operator, + operatorId, + deletedAt: null, + curStatus: { + status: RECORD_STATUS.NEW, + date: expect.any(Number), + }, + subStatus: { + status: RECORD_SUB_STATUS.DEFAULT, + date: expect.any(Number), + }, + }, + }, + ); + expect(result).toEqual(mockUpdateResult); + }); + }); + + describe('completelyDeleteSurveyMeta', () => { + it('should completely delete a survey', async () => { + const surveyId = new ObjectId().toString(); + const operator = 'deleter'; + const operatorId = 'deleterId'; + + const mockUpdateResult = { + matchedCount: 1, + modifiedCount: 1, + acknowledged: true, + }; + + jest.spyOn(surveyRepository, 'updateOne').mockResolvedValue(mockUpdateResult); + + const result = await service.completelyDeleteSurveyMeta({ + surveyId, + operator, + operatorId, + }); + + expect(surveyRepository.updateOne).toHaveBeenCalledWith( + { _id: new ObjectId(surveyId) }, + { + $set: { + isDeleted: true, + isCompletelyDeleted: true, + operator, + operatorId, + deletedAt: expect.any(Date), + }, + }, + ); + expect(result).toEqual(mockUpdateResult); + }); + }); }); diff --git a/server/src/modules/survey/controllers/survey.controller.ts b/server/src/modules/survey/controllers/survey.controller.ts index eed6a921a..5726055dd 100644 --- a/server/src/modules/survey/controllers/survey.controller.ts +++ b/server/src/modules/survey/controllers/survey.controller.ts @@ -223,6 +223,60 @@ export class SurveyController { }; } + @HttpCode(200) + @Post('/restoreSurvey') + @UseGuards(SurveyGuard) + @SetMetadata('surveyId', 'body.surveyId') + @SetMetadata('surveyPermission', [SURVEY_PERMISSION.SURVEY_CONF_MANAGE]) + @UseGuards(Authentication) + async restoreSurvey(@Request() req) { + const surveyMeta = req.surveyMeta; + + const resMetaRes = await this.surveyMetaService.restoreSurveyMeta({ + surveyId: surveyMeta._id.toString(), + operator: req.user.username, + operatorId: req.user._id.toString(), + }); + const resResponseRes = + await this.responseSchemaService.restoreResponseSchema({ + surveyPath: surveyMeta.surveyPath, + }); + + this.logger.info(JSON.stringify(resMetaRes)); + this.logger.info(JSON.stringify(resResponseRes)); + + return { + code: 200, + }; + } + + @HttpCode(200) + @Post('/completelyDeleteSurvey') + @UseGuards(SurveyGuard) + @SetMetadata('surveyId', 'body.surveyId') + @SetMetadata('surveyPermission', [SURVEY_PERMISSION.SURVEY_CONF_MANAGE]) + @UseGuards(Authentication) + async completelyDeleteSurvey(@Request() req) { + const surveyMeta = req.surveyMeta; + + const completelyDelMetaRes = await this.surveyMetaService.completelyDeleteSurveyMeta({ + surveyId: surveyMeta._id.toString(), + operator: req.user.username, + operatorId: req.user._id.toString(), + }); + const completelyDelResponseRes = + await this.responseSchemaService.completelyDeleteResponseSchema({ + surveyPath: surveyMeta.surveyPath, + }); + + this.logger.info(JSON.stringify(completelyDelMetaRes)); + this.logger.info(JSON.stringify(completelyDelResponseRes)); + + return { + code: 200, + }; + } + @HttpCode(200) @Post('/pausingSurvey') @UseGuards(SurveyGuard) diff --git a/server/src/modules/survey/controllers/surveyMeta.controller.ts b/server/src/modules/survey/controllers/surveyMeta.controller.ts index b6c665683..1ea58e29a 100644 --- a/server/src/modules/survey/controllers/surveyMeta.controller.ts +++ b/server/src/modules/survey/controllers/surveyMeta.controller.ts @@ -8,12 +8,18 @@ import { UseGuards, Request, SetMetadata, + Injectable, } from '@nestjs/common'; import * as Joi from 'joi'; import moment from 'moment'; import { ApiTags } from '@nestjs/swagger'; +import { InjectRepository } from '@nestjs/typeorm'; +import { MongoRepository } from 'typeorm'; +import { SurveyMeta } from 'src/models/surveyMeta.entity'; +import { ObjectId } from 'mongodb'; import { SurveyMetaService } from '../services/surveyMeta.service'; +import { WorkspaceService } from '../../workspace/services/workspace.service'; import { getFilter, getOrder } from 'src/utils/surveyUtil'; import { HttpException } from 'src/exceptions/httpException'; @@ -36,6 +42,9 @@ export class SurveyMetaController { private readonly surveyMetaService: SurveyMetaService, private readonly logger: Logger, private readonly collaboratorService: CollaboratorService, + private readonly workspaceService: WorkspaceService, + @InjectRepository(SurveyMeta) + private surveyMetaRepository: MongoRepository, ) {} @Post('/updateMeta') @@ -90,7 +99,7 @@ export class SurveyMetaController { this.logger.error(error.message); throw new HttpException('参数有误', EXCEPTION_CODE.PARAMETER_ERROR); } - const { curPage, pageSize, workspaceId, groupId } = value; + const { curPage, pageSize, workspaceId, groupId ,recycleId} = value; let filter = {}, order = {}; if (value.filter) { @@ -109,15 +118,25 @@ export class SurveyMetaController { } const userId = req.user._id.toString(); let cooperationList = []; + let workspaceList = []; if (groupId === GROUP_STATE.ALL) { cooperationList = await this.collaboratorService.getCollaboratorListByUserId({ userId }); } + if (value.recycleId) { + cooperationList = + await this.collaboratorService.getCollaboratorListByUserId({ userId }); + const getWorkspaceListResult = + await this.workspaceService.getWorkspaceListByUserId(userId); + workspaceList = getWorkspaceListResult.surveys; + } const cooperSurveyIdMap = cooperationList.reduce((pre, cur) => { pre[cur.surveyId] = cur; return pre; }, {}); - const surveyIdList = cooperationList.map((item) => item.surveyId); + const surveyIdList1 = cooperationList.map((item) => item.surveyId); + const surveyIdList2 = workspaceList.map((item) => item._id.toString()); + const surveyIdList = [...surveyIdList1, ...surveyIdList2]; const username = req.user.username; const data = await this.surveyMetaService.getSurveyMetaList({ pageNum: curPage, @@ -129,6 +148,7 @@ export class SurveyMetaController { workspaceId, groupId, surveyIdList, + recycleId }); return { code: 200, @@ -143,6 +163,7 @@ export class SurveyMetaController { item.curStatus.date = moment(item.curStatus.date).format(fmt); item.subStatus.date = moment(item.subStatus.date).format(fmt); item.updatedAt = moment(item.updatedAt).format(fmt); + item.deletedAt = moment(item.deletedAt).format(fmt); const surveyId = item._id.toString(); if (cooperSurveyIdMap[surveyId]) { item.isCollaborated = true; @@ -157,4 +178,65 @@ export class SurveyMetaController { }, }; } + + @Get('/getRecycleTotal') + @HttpCode(200) + @UseGuards(Authentication) + async getRecycleTotal(@Request() req) { + const userId = req.user._id.toString(); + let cooperationList = []; + let workspaceList = []; + cooperationList = + await this.collaboratorService.getCollaboratorListByUserId({ userId }); + const getWorkspaceListResult = + await this.workspaceService.getWorkspaceListByUserId(userId); + workspaceList = getWorkspaceListResult.surveys; + const surveyIdList1 = cooperationList.map((item) => item.surveyId); + const surveyIdList2 = workspaceList.map((item) => item._id.toString()); + const surveyIdList = [...surveyIdList1, ...surveyIdList2]; + + const surveys = await this.surveyMetaRepository.find({ + where: { + _id: { + $in: surveyIdList1.map(id => new ObjectId(id)) + }, + isDeleted: true, + isCompletelyDeleted: { $ne: true } + } + }); + const surveytotal1 = surveys.length; // 直接获取数组长度 + + const surveys2 = await this.surveyMetaRepository.find({ + where: { + _id: { + $in: surveyIdList2.map(id => new ObjectId(id)) + }, + isDeleted: true, + isCompletelyDeleted: { $ne: true } + } + }); + const surveytotal2 = surveys2.length; + const surveys3 = await this.surveyMetaRepository.find({ + where: { + ownerId: userId, + isDeleted: true, + isCompletelyDeleted: { $ne: true }, + $and: [ + { + workspaceId: { $exists: false }, + }, + { + workspaceId: null, + }, + ], + } + }); + const surveytotal3 = surveys3.length; + return { + code: 200, + total: surveytotal1 + surveytotal2 + surveytotal3 + }; + } } + + diff --git a/server/src/modules/survey/dto/getSurveyMetaList.dto.ts b/server/src/modules/survey/dto/getSurveyMetaList.dto.ts index e4d5f255e..a9b589d40 100644 --- a/server/src/modules/survey/dto/getSurveyMetaList.dto.ts +++ b/server/src/modules/survey/dto/getSurveyMetaList.dto.ts @@ -20,6 +20,9 @@ export class GetSurveyListDto { @ApiProperty({ description: '分组id', required: false }) groupId?: string; + @ApiProperty({ description: '是否查询回收站', required: false }) + recycleId?: boolean; + static validate(data) { return Joi.object({ curPage: Joi.number().required(), @@ -28,6 +31,7 @@ export class GetSurveyListDto { order: Joi.string().allow(null), workspaceId: Joi.string().allow(null, ''), groupId: Joi.string().allow(null, ''), + recycleId: Joi.boolean().allow(null, false).default(false), }).validate(data); } } diff --git a/server/src/modules/survey/services/surveyMeta.service.ts b/server/src/modules/survey/services/surveyMeta.service.ts index 301aa4c9f..92b754a90 100644 --- a/server/src/modules/survey/services/surveyMeta.service.ts +++ b/server/src/modules/survey/services/surveyMeta.service.ts @@ -139,6 +139,47 @@ export class SurveyMetaService { ); } + async restoreSurveyMeta({ surveyId, operator, operatorId }) { + return this.surveyRepository.updateOne( + { + _id: new ObjectId(surveyId), + }, + { + $set: { + isDeleted: false, + operator, + operatorId, + deletedAt: null, + curStatus: { + status: RECORD_STATUS.NEW, + date: Date.now(), + }, + subStatus: { + status: RECORD_SUB_STATUS.DEFAULT, + date: Date.now(), + }, + }, + }, + ); + } + + async completelyDeleteSurveyMeta({ surveyId, operator, operatorId }) { + return this.surveyRepository.updateOne( + { + _id: new ObjectId(surveyId), + }, + { + $set: { + isDeleted: true, + isCompletelyDeleted: true, + operator, + operatorId, + deletedAt: new Date(), + }, + }, + ); + } + async getSurveyMetaList(condition: { pageNum: number; pageSize: number; @@ -149,6 +190,7 @@ export class SurveyMetaService { workspaceId?: string; groupId?: string; surveyIdList?: Array; + recycleId?: boolean; }): Promise<{ data: any[]; count: number }> { const { pageNum, @@ -158,14 +200,14 @@ export class SurveyMetaService { workspaceId, groupId, surveyIdList, + recycleId, } = condition; const skip = (pageNum - 1) * pageSize; try { const query: ObjectLiteral = Object.assign( { - isDeleted: { - $ne: true, - }, + isDeleted: recycleId ? true : { $ne: true }, + isCompletelyDeleted: { $ne: true }, }, condition.filter, ); @@ -184,7 +226,7 @@ export class SurveyMetaService { } if (workspaceId) { otherQuery.workspaceId = workspaceId; - } else { + } else if (!recycleId){ otherQuery.$and = [ { workspaceId: { $exists: false }, @@ -224,6 +266,8 @@ export class SurveyMetaService { // }, // ]; otherQuery.ownerId = userId; + } else { + otherQuery.ownerId = userId; } if (Array.isArray(query.$or)) { diff --git a/server/src/modules/surveyResponse/services/responseScheme.service.ts b/server/src/modules/surveyResponse/services/responseScheme.service.ts index b1dc793c1..83dd215b2 100644 --- a/server/src/modules/surveyResponse/services/responseScheme.service.ts +++ b/server/src/modules/surveyResponse/services/responseScheme.service.ts @@ -89,4 +89,42 @@ export class ResponseSchemaService { }, ); } + + async restoreResponseSchema({ surveyPath }) { + return this.responseSchemaRepository.updateOne( + { + surveyPath, + }, + { + $set: { + isDeleted: false, + updatedAt: new Date(), + deletedAt: null, + curStatus: { + status: RECORD_STATUS.NEW, + date: Date.now(), + }, + subStatus: { + status: RECORD_SUB_STATUS.DEFAULT, + date: Date.now(), + }, + }, + }, + ); + } + + async completelyDeleteResponseSchema({ surveyPath }) { + return this.responseSchemaRepository.updateOne( + { + surveyPath, + }, + { + $set: { + isCompletelyDeleted: true, + isDeleted: true, + deletedAt: new Date(), + }, + }, + ); + } } diff --git a/server/src/modules/workspace/services/workspace.service.ts b/server/src/modules/workspace/services/workspace.service.ts index b5444540f..9ec2775db 100644 --- a/server/src/modules/workspace/services/workspace.service.ts +++ b/server/src/modules/workspace/services/workspace.service.ts @@ -4,6 +4,7 @@ import { MongoRepository } from 'typeorm'; import { Workspace } from 'src/models/workspace.entity'; import { SurveyMeta } from 'src/models/surveyMeta.entity'; +import { WorkspaceMember} from 'src/models/workspaceMember.entity'; import { ObjectId } from 'mongodb'; @@ -25,6 +26,8 @@ export class WorkspaceService { private workspaceRepository: MongoRepository, @InjectRepository(SurveyMeta) private surveyMetaRepository: MongoRepository, + @InjectRepository(WorkspaceMember) + private workspaceMemberRepository: MongoRepository, ) {} async create(workspace: { @@ -183,4 +186,30 @@ export class WorkspaceService { ], }); } + + async getWorkspaceListByUserId(userId: string) { + // 1. 获取用户的工作空间成员记录 + const workspaceMembers = await this.workspaceMemberRepository.find({ + where: { + userId, + workspaceId:{$ne:null} + }, + }); + + // 2. 提取工作空间ID + const workspaceIds = workspaceMembers.map(m => m.workspaceId); + + // 4. 获取这些工作空间下的所有问卷 + const surveys = await this.surveyMetaRepository.find({ + where: { + workspaceId: { + $in: workspaceIds, + }, + }, + }); + + return { + surveys, + }; + } } diff --git a/server/src/modules/workspace/workspace.module.ts b/server/src/modules/workspace/workspace.module.ts index 5807836c5..2ee8220e2 100644 --- a/server/src/modules/workspace/workspace.module.ts +++ b/server/src/modules/workspace/workspace.module.ts @@ -33,6 +33,6 @@ import { PluginManagerProvider } from 'src/securityPlugin/pluginManager.provider SurveyMetaService, PluginManagerProvider, ], - exports: [WorkspaceMemberService], + exports: [WorkspaceMemberService, WorkspaceService], }) export class WorkspaceModule {} diff --git a/web/src/management/api/space.ts b/web/src/management/api/space.ts index 9e152e4d8..1c44fab74 100644 --- a/web/src/management/api/space.ts +++ b/web/src/management/api/space.ts @@ -96,3 +96,7 @@ export const getGroupList = (params: any) => { export const deleteGroup = (id: string) => { return axios.post(`/surveyGroup/delete`, { groupId: id }) } + +export function getRecycleTotal() { + return axios.get('/survey/getRecycleTotal') +} diff --git a/web/src/management/api/survey.js b/web/src/management/api/survey.js index 40467e6c6..e35d2d243 100644 --- a/web/src/management/api/survey.js +++ b/web/src/management/api/survey.js @@ -1,6 +1,6 @@ import axios from './base' -export const getSurveyList = ({ curPage, filter, order, workspaceId, groupId }) => { +export const getSurveyList = ({ curPage, filter, order, workspaceId, groupId, recycleId }) => { return axios.get('/survey/getList', { params: { pageSize: 10, @@ -8,7 +8,8 @@ export const getSurveyList = ({ curPage, filter, order, workspaceId, groupId }) filter, order, workspaceId, - groupId + groupId, + recycleId } }) } @@ -50,6 +51,18 @@ export const deleteSurvey = (surveyId) => { }) } +export const restoreSurvey = (surveyId) => { + return axios.post('/survey/restoreSurvey', { + surveyId + }) +} + +export const completelyDeleteSurvey = (surveyId) => { + return axios.post('/survey/completelyDeleteSurvey', { + surveyId + }) +} + export const updateSurvey = (data) => { return axios.post('/survey/updateMeta', data) } diff --git a/web/src/management/config/listConfig.js b/web/src/management/config/listConfig.js index c9afa7f50..0bb377447 100644 --- a/web/src/management/config/listConfig.js +++ b/web/src/management/config/listConfig.js @@ -95,6 +95,30 @@ export const fieldConfig = { } } +export const recycleFieldConfig = { + title: { + title: '标题', + key: 'title', + width: 240, + tip: true + }, + createdAt: { + title: '创建时间', + key: 'createdAt', + minWidth: 200 + }, + deletedAt: { + title: '删除时间', + key: 'deletedAt', + minWidth: 200 + }, + owner: { + title: '所有者', + key: 'owner', + width: 140 + } +} + export const noListDataConfig = { title: '您还没有创建问卷', desc: '赶快点击右上角立即创建问卷吧!', diff --git a/web/src/management/pages/list/components/RecycleList.vue b/web/src/management/pages/list/components/RecycleList.vue new file mode 100644 index 000000000..0743e16a5 --- /dev/null +++ b/web/src/management/pages/list/components/RecycleList.vue @@ -0,0 +1,401 @@ + + + + + \ No newline at end of file diff --git a/web/src/management/pages/list/components/SliderBar.vue b/web/src/management/pages/list/components/SliderBar.vue index cc054d8fe..e0713a722 100644 --- a/web/src/management/pages/list/components/SliderBar.vue +++ b/web/src/management/pages/list/components/SliderBar.vue @@ -11,7 +11,8 @@ :class="[ index === 0 ? 'bottom' : '', index > 2 ? 'sub-item' : 'main-item', - activeValue == menu.id ? 'check-item' : '' + activeValue == menu.id ? 'check-item' : '', + menu.id == 'recycle' ? 'recycle-item' : '' ]" :index="menu.id.toString()" v-if="!menu.children?.length" @@ -20,6 +21,7 @@
{{ menu.name }} + {{menu.total}}
@@ -149,6 +151,14 @@ const handleMenu = (id: string) => { text-align: right; font-weight: 400; } + + .recycle-total{ + font-size: 14px; + color: #92949d; + text-align: right; + font-weight: 400; + margin-left: 78px + } } :deep(.el-menu-item-group) { > ul { @@ -174,4 +184,12 @@ const handleMenu = (id: string) => { .check-item { background: #fef6e6 100% !important; } +.recycle-item { + position: absolute; + bottom: 20px; + font-size: 16px; + font-weight: 500; + color: #292a36; + height: 48px; +} diff --git a/web/src/management/pages/list/components/ToolModule.vue b/web/src/management/pages/list/components/ToolModule.vue index 291f7caef..19c1b3b50 100644 --- a/web/src/management/pages/list/components/ToolModule.vue +++ b/web/src/management/pages/list/components/ToolModule.vue @@ -1,6 +1,14 @@ @@ -13,6 +21,11 @@ export default { type: String, width: Number }, + computed: { + isCompletelyDelete() { + return this.value === 'completelyDelete' || this.label === '彻底删除'; + } + }, methods: { onClick() { this.$emit('call', { diff --git a/web/src/management/pages/list/index.vue b/web/src/management/pages/list/index.vue index 7abb95fc0..7c10236aa 100644 --- a/web/src/management/pages/list/index.vue +++ b/web/src/management/pages/list/index.vue @@ -71,6 +71,14 @@ :total="groupListTotal" v-if="menuType === MenuType.PersonalGroup && !groupId" > + { return '我的空间' } else if (menuType.value === MenuType.SpaceGroup && !workSpaceId.value) { return '团队空间' + } else if (menuType.value === MenuType.RecycleBin) { + return '回收站' } else { return currentTeamSpace.value?.name || '问卷列表' } @@ -194,6 +206,7 @@ const activeValue = ref('') const listRef = ref(null) const loading = ref(false) +const recycleloading = ref(false) const spaceListRef = ref(null) const spaceLoading = ref(false) @@ -233,6 +246,11 @@ const handleSpaceSelect = async (id: string) => { workSpaceStore.changeWorkSpace('') await fetchSpaceList() break + case MenuType.RecycleBin: + workSpaceStore.changeMenuType(MenuType.RecycleBin) + workSpaceStore.changeRecycle() + await fetchSurveyList() + break default: { const parentMenu = spaceMenus.value.find((parent: any) => parent.children.find((children: any) => children.id.toString() === id) @@ -245,6 +263,7 @@ const handleSpaceSelect = async (id: string) => { workSpaceStore.changeWorkSpace(id) } } + await fetchSurveyList() listRef?.value?.resetCurrentPage() break } @@ -261,7 +280,11 @@ const fetchSurveyList = async (params?: any) => { if (workSpaceId.value) { params.workspaceId = workSpaceId.value } + if (menuType.value === MenuType.RecycleBin) { + params.recycleId = true + } loading.value = true + await workSpaceStore.getRecycleTotal() await surveyListStore.getSurveyList(params) loading.value = false } diff --git a/web/src/management/stores/surveyList.ts b/web/src/management/stores/surveyList.ts index 94acf63b5..e9883d27b 100644 --- a/web/src/management/stores/surveyList.ts +++ b/web/src/management/stores/surveyList.ts @@ -145,7 +145,8 @@ export const useSurveyListStore = defineStore('surveyList', () => { filter: filterString, order: orderString, workspaceId: workSpaceStore.workSpaceId, - groupId: workSpaceStore.groupId + groupId: workSpaceStore.groupId, + recycleId: workSpaceStore.recycleId } const res: any = await getSurveyListReq(params) diff --git a/web/src/management/stores/workSpace.ts b/web/src/management/stores/workSpace.ts index e07ee9cbb..a50dd18cd 100644 --- a/web/src/management/stores/workSpace.ts +++ b/web/src/management/stores/workSpace.ts @@ -14,7 +14,8 @@ import { createGroup, getGroupList as getGroupListReq, updateGroup as updateGroupReq, - deleteGroup as deleteGroupReq + deleteGroup as deleteGroupReq, + getRecycleTotal as getRecycleTotalReq } from '@/management/api/space' import { GroupState, MenuType } from '@/management/utils/workSpace' @@ -42,11 +43,19 @@ export const useWorkSpaceStore = defineStore('workSpace', () => { name: '团队空间', id: MenuType.SpaceGroup, children: [] + }, + { + icon: 'icon-icon_shanchu', + name: '回收站', + id: MenuType.RecycleBin, + total: 10, + children: [] } ]) const menuType = ref(MenuType.PersonalGroup) const groupId = ref('') const workSpaceId = ref('') + const recycleId = ref(false) const spaceDetail = ref(null) const workSpaceList = ref([]) const workSpaceListTotal = ref(0) @@ -98,12 +107,21 @@ export const useWorkSpaceStore = defineStore('workSpace', () => { function changeWorkSpace(id: string) { workSpaceId.value = id groupId.value = '' + recycleId.value = false surveyListStore.resetSearch() } function changeGroup(id: string) { groupId.value = id workSpaceId.value = '' + recycleId.value = false + surveyListStore.resetSearch() + } + + function changeRecycle() { + recycleId.value = true + groupId.value = '' + workSpaceId.value = '' surveyListStore.resetSearch() } @@ -241,11 +259,27 @@ export const useWorkSpaceStore = defineStore('workSpace', () => { } } + async function getRecycleTotal() { + try { + const res: any = await getRecycleTotalReq() + if (res.code === CODE_MAP.SUCCESS) { + const total = res.total + spaceMenus.value[2].total = total + } else { + ElMessage.error('getRecycleTotal' + res.errmsg) + } + } catch (err) { + ElMessage.error('getRecycleTotal' + err) + } + } + + return { menuType, spaceMenus, groupId, workSpaceId, + recycleId, spaceDetail, workSpaceList, workSpaceListTotal, @@ -254,6 +288,7 @@ export const useWorkSpaceStore = defineStore('workSpace', () => { changeMenuType, changeWorkSpace, changeGroup, + changeRecycle, addSpace, deleteSpace, updateSpace, @@ -267,6 +302,7 @@ export const useWorkSpaceStore = defineStore('workSpace', () => { getGroupList, getGroupDetail, setGroupDetail, - deleteGroup + deleteGroup, + getRecycleTotal } }) diff --git a/web/src/management/utils/workSpace.ts b/web/src/management/utils/workSpace.ts index 242cb7c04..6efbfb72c 100644 --- a/web/src/management/utils/workSpace.ts +++ b/web/src/management/utils/workSpace.ts @@ -67,7 +67,8 @@ export type GroupItem = { export enum MenuType { PersonalGroup = 'personalGroup', - SpaceGroup = 'spaceGroup' + SpaceGroup = 'spaceGroup', + RecycleBin = 'recycle' } export enum UserRole {