package com.doc.biz.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.doc.biz.domain.DocFavorite; import com.doc.biz.domain.DocInfo; import com.doc.biz.domain.DocumentFile; import com.doc.biz.domain.EsDocInfo; import com.doc.biz.mapper.DocInfoMapper; import com.doc.biz.service.*; import com.doc.biz.vo.DocumentVO; import com.doc.common.constant.Constants; import com.doc.common.utils.DateUtils; import com.doc.common.utils.SecurityUtils; import com.doc.common.utils.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.Optional; /** * 文件基本信息表Service业务层处理 * * @author wukai * @date 2023-08-15 */ @Service public class DocInfoServiceImpl implements IDocInfoService { @Resource private DocInfoMapper docInfoMapper; @Resource private IElasticSearchService elasticSearchService; @Resource private IDocSpaceService spaceService; @Resource private IDocFavoriteService favoriteService; @Resource private IDocDirService dirService; @Resource private IMongoService mongoService; /** * 查询文件基本信息表 * * @param docId 文件基本信息表主键 * @return 文件基本信息表 */ @Override public DocInfo selectDocInfoByDocId(Long docId) { DocInfo info = docInfoMapper.selectDocInfoByDocId(docId); if (info != null) { String unloading = "l0400"; //是否允许转存 info.setUnloading(dirService.hasRole(info.getDirId(), unloading)); } return info; } /** * 通过fileID查询文件基本信息 * * @param fileId mongo文件ID */ @Override public DocInfo selectDocInfoByFileId(String fileId) { return docInfoMapper.selectDocInfoByFileId(fileId); } /** * only office更新文件内容 * * @param info 文件信息 */ @Override public void updateDocInfoByOnlyOffice(DocInfo info) { info.setUpdateTime(DateUtils.getNowDate()); docInfoMapper.updateDocInfo(info); if (StringUtils.isNotEmpty(info.getFileId())) { elasticSearchService.save(info); } } /** * 文件上传之后的操作 * * @param vo 上传对象 * @param spaceId 空间ID * @param dirId 目录ID * @return 对象 */ @Override public DocInfo upload(DocumentVO vo, Long spaceId, Long dirId) { DocInfo docInfo = new DocInfo(); docInfo.setSpaceId(spaceId); docInfo.setDirId(dirId); docInfo.setFileId(vo.getFileId()); docInfo.setFileName(vo.getFileName()); docInfo.setFileSize(vo.getFileSize()); docInfo.setFileType(vo.getSuffix()); docInfo.setCreateBy(SecurityUtils.getUsername()); insertDocInfo(docInfo); return docInfo; } /** * 查询文件基本信息表列表 * * @param docInfo 文件基本信息表 * @return 文件基本信息表 */ @Override public List selectDocInfoList(DocInfo docInfo) { List list = docInfoMapper.selectDocInfoList(docInfo); List favorites = new ArrayList<>(); DocFavorite favorite = new DocFavorite(); favorite.setOwner(SecurityUtils.getUserId()); favorite.setIsFolder("N"); favoriteService.selectDocFavoriteList(favorite).forEach(f -> { favorites.add(f.getRelaId()); }); list.forEach(i -> { if (favorites.contains(i.getDocId())) { i.setIsFavorite("Y"); } else { i.setIsFavorite("N"); } }); return list; } /** * 新增文件基本信息表 * * @param docInfo 文件基本信息表 * @return 结果 */ @Override public int insertDocInfo(DocInfo docInfo) { docInfo.setCreateTime(DateUtils.getNowDate()); checkDuplicateNames(docInfo); int i = docInfoMapper.insertDocInfo(docInfo); String fileType = docInfo.getFileType().toLowerCase(); if (docInfo.getFileSize() > 0 && Constants.ES_EXTENSION.contains(fileType)) { //文件不为空,且可以解析的文件后缀名 String allowSearch = "l0300"; if (dirService.hasRole(docInfo.getDirId(), allowSearch)) { //只有允许全文搜索的才会存入ES库,否则不存入 elasticSearchService.save(docInfo); } } //改变空间容量 spaceService.changeUsedCap(docInfo.getSpaceId(), docInfo.getFileSize()); return i; } /** * 检查重名 * * @param docInfo 文件信息 */ private void checkDuplicateNames(DocInfo docInfo) { DocInfo query = new DocInfo(); query.setDirId(docInfo.getDirId()); query.setFileName(docInfo.getFileName()); List list = selectDocInfoList(query); if (list.size() > 0 && !list.get(0).getDocId().equals(docInfo.getDocId())) { String fileName = docInfo.getFileName(); fileName = fileName + "-" + DateUtils.dateTimeNow(); docInfo.setFileName(fileName); } } /** * 修改文件基本信息表 * * @param docInfo 文件基本信息表 * @return 结果 */ @Override public int updateDocInfo(DocInfo docInfo) { checkDuplicateNames(docInfo); docInfo.setUpdateTime(DateUtils.getNowDate()); return docInfoMapper.updateDocInfo(docInfo); } /** * 批量删除文件基本信息表 * * @param docIds 需要删除的文件基本信息表主键 * @return 结果 */ @Override public int deleteDocInfoByDocIds(Long[] docIds) { int i = 1; for (Long docId : docIds) { i = i & deleteDocInfoByDocId(docId); } return 1; } /** * 删除文件基本信息表信息 * * @param docId 文件基本信息表主键 * @return 结果 */ @Override public int deleteDocInfoByDocId(Long docId) { DocInfo docInfo = selectDocInfoByDocId(docId); int i = docInfoMapper.deleteDocInfoByDocId(docId); //改变空间容量 spaceService.changeUsedCap(docInfo.getSpaceId(), 0 - docInfo.getFileSize()); return i; } /** * 查询已失效的文件 * * @return 失效文件列表 */ @Override public List selectLoseList() { List list = docInfoMapper.selectDocInfoList(new DocInfo()); List result = new ArrayList<>(); list.forEach(info -> { Optional optional = mongoService.findByFileId(info.getFileId()); if (!optional.isPresent()) { EsDocInfo esDocInfo = elasticSearchService.getEsDocInfo(info.getDocId()); if (esDocInfo != null) { info.setRemark(esDocInfo.getContent()); } result.add(info); } }); return result; } /** * 根据目录ID查询文件数量 * * @param dirId 目录ID * @return 文件数量 */ @Override public Long selectCountList(Long dirId) { QueryWrapper wrapper = new QueryWrapper(); wrapper.eq("dir_id", dirId); return docInfoMapper.selectCount(wrapper); } }