package com.wtkj.service.impl; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.wtkj.dto.SearchProjectFileDTO; import com.wtkj.dto.UploadFileDTO; import com.wtkj.dto.UploadInnerFileDTO; import com.wtkj.entity.FileAndFolder; import com.wtkj.entity.FileAndFolderHistory; import com.wtkj.entity.InnerFileAndFolder; import com.wtkj.entity.ProjectAuth; import com.wtkj.handler.es.Document; import com.wtkj.service.*; import com.wtkj.vo.AuthUserInfo; import com.wutong.file.feign.IFileClient; import com.wutong.file.vo.FileVO; import lombok.AllArgsConstructor; import lombok.SneakyThrows; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.secure.BladeUser; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.BeanUtil; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; import org.springblade.core.tool.utils.WebUtil; import org.springblade.system.entity.Dept; import org.springblade.system.feign.ISysClient; import org.springblade.system.user.entity.User; import org.springblade.system.user.feign.IUserClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.util.*; import java.util.stream.Collectors; import static com.wtkj.config.MagicValue.*; /** * @author Blizzard * @create at 2023-09-14 16:07 * @describe */ @Service @AllArgsConstructor public class CommonServiceImpl implements ICommonService { private final IFileClient fileClient; private final IFileAndFolderService fileAndFolderService; private final IFileAndFolderHistoryService historyService; private final IInnerFileAndFolderService innerFileAndFolderService; private final IProjectAuthService projectAuthService; private final RestHighLevelClient client; private final ISysClient sysClient; private final IUserClient userClient; @Override public boolean uploadFile(List files) { boolean flag = false; List fileList = new ArrayList<>(); if (!CollectionUtils.isEmpty(files)) { Long projectId = files.get(0).getProjectId(); Long parentId = files.get(0).getParentId(); Long stageId = files.get(0).getStageId(); files.forEach(file -> { Long fileId = file.getBladeFileId(); R rpc = fileClient.findById(fileId); if (rpc.isSuccess()) { FileAndFolder newFile = new FileAndFolder(); newFile.setProjectId(projectId); newFile.setStageId(stageId); newFile.setParentId(parentId); newFile.setBladeFileId(file.getBladeFileId()); newFile.setType(1); newFile.setTitle(rpc.getData().getOriginalFileName()); if (parentId != null && parentId > 0L) { FileAndFolder folder = fileAndFolderService.getById(parentId); if (folder != null) { newFile.setIsPrivate(folder.getIsPrivate()); newFile.setPrivateUser(folder.getPrivateUser()); } } fileList.add(newFile); } }); flag = fileAndFolderService.saveBatch(fileList); } return flag; } @Override @Transactional(rollbackFor = Exception.class) public boolean coverFile(List files) { boolean flag = false; List fileList = new ArrayList<>(); List histories = new ArrayList<>(); if (!CollectionUtils.isEmpty(files)) { Long projectId = files.get(0).getProjectId(); Long parentId = files.get(0).getParentId(); Long stageId = files.get(0).getStageId(); files.forEach(file -> { Long fileId = file.getBladeFileId(); R rpc = fileClient.findById(fileId); if (rpc.isSuccess()) { //是否存在同名文件 LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(FileAndFolder::getStageId, stageId); lqw.eq(FileAndFolder::getParentId, parentId); lqw.eq(FileAndFolder::getTitle, rpc.getData().getOriginalFileName()); FileAndFolder old = fileAndFolderService.getOne(lqw); if (old != null) { //存在同名文件 //此处不删除旧的同名文件,直接修改值 ---> 再保存历史记录信息 修改已存在的的数据 更新url 文件大小等信息 //先根据旧的fileId判断是否存在历史记录 List hisList = historyService.getByLatestId(old.getBladeFileId()); if (!CollectionUtils.isEmpty(hisList)) { hisList.forEach(h -> { h.setLatestId(String.valueOf(fileId)); histories.add(h); }); } //历史文件和新上传文件不是同一个的时候才保存 if (!fileId.equals(old.getBladeFileId())) { FileAndFolderHistory his = new FileAndFolderHistory(); his.setLatestId(String.valueOf(fileId)); his.setHistoryId(String.valueOf(old.getBladeFileId())); histories.add(his); } old.setBladeFileId(fileId); fileList.add(old); } else { FileAndFolder newFile = new FileAndFolder(); newFile.setProjectId(projectId); newFile.setStageId(stageId); newFile.setParentId(parentId); newFile.setBladeFileId(file.getBladeFileId()); newFile.setType(1); newFile.setTitle(rpc.getData().getOriginalFileName()); if (parentId != null && parentId > 0L) { FileAndFolder folder = fileAndFolderService.getById(parentId); if (folder != null) { newFile.setIsPrivate(folder.getIsPrivate()); newFile.setPrivateUser(folder.getPrivateUser()); } } fileList.add(newFile); } } }); if (!CollectionUtils.isEmpty(histories)) { historyService.saveOrUpdateBatch(histories); } flag = fileAndFolderService.saveOrUpdateBatch(fileList); } return flag; } @Override public boolean remove(List ids) { boolean flag = false; if (!CollectionUtils.isEmpty(ids)) { ids.forEach(id -> { FileAndFolder byId = fileAndFolderService.getById(id); //如果是文件夹 if (Objects.equals(byId.getType(), TWO)) { List children = fileAndFolderService.getChildren(null, id); if (!CollectionUtils.isEmpty(children)) { throw new ServiceException("删除文件夹失败:请先删除下级"); } } }); flag = fileAndFolderService.removeByIds(ids); } return flag; } @Override public boolean move(String ids, Long stageId, Long parentId) { boolean flag = false; if (StringUtil.isNotBlank(ids)) { List list = new ArrayList<>(); List idList = Func.toLongList(ids); idList.forEach(id -> { FileAndFolder byId = fileAndFolderService.getById(id); if (byId != null) { byId.setStageId(stageId); byId.setParentId(parentId); list.add(byId); } }); flag = fileAndFolderService.updateBatchById(list); } return flag; } @Override public boolean delete(List ids) { boolean flag = false; Long deptId = Func.firstLong(AuthUtil.getDeptId()); if (!CollectionUtils.isEmpty(ids)) { ids.forEach(id -> { InnerFileAndFolder byId = innerFileAndFolderService.getById(id); //如果是文件夹 if (byId != null && Objects.equals(byId.getType(), TWO)) { if (!deptId.equals(byId.getDeptId())) { throw new ServiceException("非你部门下文件,禁止删除"); } List children = innerFileAndFolderService.getChildren(byId.getDeptId(), id); if (!CollectionUtils.isEmpty(children)) { throw new ServiceException("删除文件夹失败:请先删除下级"); } } }); flag = innerFileAndFolderService.removeByIds(ids); } return flag; } @Override public boolean uploadInnerFile(List files) { boolean flag = false; List fileList = new ArrayList<>(); if (!CollectionUtils.isEmpty(files)) { Long parentId = files.get(0).getParentId(); Long deptId = files.get(0).getDeptId(); files.forEach(file -> { Long fileId = file.getBladeFileId(); R rpc = fileClient.findById(fileId); if (rpc.isSuccess()) { InnerFileAndFolder newFile = new InnerFileAndFolder(); newFile.setDeptId(deptId); newFile.setParentId(parentId); newFile.setBladeFileId(file.getBladeFileId()); newFile.setType(1); newFile.setTitle(rpc.getData().getOriginalFileName()); fileList.add(newFile); } }); flag = innerFileAndFolderService.saveBatch(fileList); } return flag; } @SneakyThrows @Override public IPage esSearch(SearchProjectFileDTO dto, IPage page) { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); Long deptId = dto.getTopDeptId(); String text = dto.getText(); Long projectId = dto.getProjectId(); Long createUser = dto.getCreateUser(); Set projectIds = new HashSet<>(); if (projectId != null && projectId > 0L) { projectIds.add(projectId); } else { //如果projectId为空 则查询机构下所有项目 //此机构下的项目 List auths = projectAuthService.getByDeptAndUser(deptId, null, null); if (!CollectionUtils.isEmpty(auths)) { Set ids = auths.stream().map(ProjectAuth::getProjectId).filter(Objects::nonNull).collect(Collectors.toSet()); projectIds.addAll(ids); } } // select * from xxx where projectId in (...) and create_user = #{createUser} and (title like %text% or content like %text%) SearchRequest request = new SearchRequest(); request.indices(PROJECT_RESOURCE_INDEX); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); // 1.创建BoolQueryBuilder BoolQueryBuilder condition = QueryBuilders.boolQuery(); //2. 添加must子句 condition.must(QueryBuilders.termsQuery("projectId", projectIds)); if (createUser != null) { condition.must(QueryBuilders.termQuery("createUser", createUser)); } if (StringUtil.isNotBlank(text)) { // 3.添加should子句 condition.should(QueryBuilders.matchQuery("title", text)); condition.should(QueryBuilders.matchQuery("content", text)); } searchSourceBuilder.query(condition); searchSourceBuilder.from(0); searchSourceBuilder.size(100); request.source(searchSourceBuilder); //执行查询 SearchResponse response = client.search(request, RequestOptions.DEFAULT); Set set = new HashSet<>(); if (response != null) { SearchHits hits = response.getHits(); int size = hits.getHits().length; for (int i = 0; i < size; i++) { String str = hits.getHits()[i].getSourceAsString(); Document document = JSON.parseObject(str, Document.class); set.add(document); } } if (!CollectionUtils.isEmpty(set)) { Set fileIds = set.stream().map(Document::getFileId).collect(Collectors.toSet()); lqw.in(FileAndFolder::getBladeFileId, fileIds); } lqw.eq(FileAndFolder::getType, 1); return fileAndFolderService.page(page, lqw); } @SneakyThrows @Override public Set openSearchFile(Long projectId, Long fileId, String text) { Long userId = AuthUtil.getUserId(); List list = projectAuthService.getByUserId(userId); if (!CollectionUtils.isEmpty(list)) { Set collect = list.stream().map(ProjectAuth::getProjectId).collect(Collectors.toSet()); if (!collect.contains(projectId)) { throw new ServiceException("对不起,你暂未拥有此项目权限"); } } SearchRequest request = new SearchRequest(); request.indices(PROJECT_RESOURCE_INDEX); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); // 1.创建BoolQueryBuilder BoolQueryBuilder condition = QueryBuilders.boolQuery(); //2. 添加must子句 condition.must(QueryBuilders.termQuery("projectId", projectId)); condition.must(QueryBuilders.termQuery("fileId", fileId)); condition.must(QueryBuilders.matchQuery("title", text)); searchSourceBuilder.query(condition); searchSourceBuilder.from(0); searchSourceBuilder.size(100); request.source(searchSourceBuilder); searchSourceBuilder.query(condition); searchSourceBuilder.from(0); searchSourceBuilder.size(100); request.source(searchSourceBuilder); //执行查询 SearchResponse response = client.search(request, RequestOptions.DEFAULT); //返回页码 Set set = new HashSet<>(); if (response != null) { SearchHits hits = response.getHits(); int size = hits.getHits().length; for (int i = 0; i < size; i++) { String str = hits.getHits()[i].getSourceAsString(); Document document = JSON.parseObject(str, Document.class); set.add(document.getCurrentPage()); } } return set; } @Override public AuthUserInfo userInfo() { BladeUser user = AuthUtil.getUser(); if (user != null) { AuthUserInfo userInfo = Objects.requireNonNull(BeanUtil.copy(user, AuthUserInfo.class)); String deptIdStr = userInfo.getDeptId(); if (StringUtil.isNotBlank(deptIdStr)) { R rpc = sysClient.getDept(Long.valueOf(deptIdStr)); if (rpc.isSuccess()) { userInfo.setDeptCategory(rpc.getData().getDeptCategory()); userInfo.setDeptName(rpc.getData().getDeptName()); String ancestors = rpc.getData().getAncestors(); // ancestors 0,1689540492698267649 if (ancestors != null && ancestors.contains(String.valueOf(ZERO))) { List longList = Func.toLongList(ancestors); if (!CollectionUtils.isEmpty(longList)) { if (longList.size() > 1) { Long deptId = longList.get(1); userInfo.setTopDept(deptId); R dept = sysClient.getDept(deptId); if (dept.isSuccess()) { userInfo.setTopDeptName(dept.getData().getDeptName()); } } else { userInfo.setTopDept(Long.valueOf(deptIdStr)); userInfo.setTopDeptName(rpc.getData().getDeptName()); } } } } } Long userId = user.getUserId(); R userR = userClient.userInfoById(userId); if (userR.isSuccess()) { userInfo.setUser(userR.getData()); } //登录成功通知 仅pc端 String platform = WebUtil.getHeader("platform"); if (StringUtil.isNotBlank(platform) && platform.equals("pc")) { } return userInfo; } return null; } }