|
|
@@ -1,20 +1,30 @@
|
|
|
package com.yingpaipay.business.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.yingpaipay.business.constant.DictTypeConst;
|
|
|
import com.yingpaipay.business.constant.DocumentAuditorTypeConst;
|
|
|
import com.yingpaipay.business.constant.DocumentStatusConst;
|
|
|
import com.yingpaipay.business.constant.DocumentTypeConst;
|
|
|
import com.yingpaipay.business.domain.DocumentAuditLog;
|
|
|
+import com.yingpaipay.business.domain.Folder;
|
|
|
+import com.yingpaipay.business.domain.Project;
|
|
|
import com.yingpaipay.business.domain.bo.*;
|
|
|
import com.yingpaipay.business.domain.vo.DocumentAuditLogVo;
|
|
|
import com.yingpaipay.business.domain.vo.TaskCenterAuditListVo;
|
|
|
import com.yingpaipay.business.domain.vo.TaskCenterSubmissionListVo;
|
|
|
import com.yingpaipay.business.mapper.DocumentAuditLogMapper;
|
|
|
+import com.yingpaipay.common.file.util.WatermarkUtils;
|
|
|
+import jakarta.servlet.http.HttpServletResponse;
|
|
|
+import org.apache.commons.io.FilenameUtils;
|
|
|
import org.dromara.common.core.exception.BusinessException;
|
|
|
+import org.dromara.common.core.exception.ServiceException;
|
|
|
import org.dromara.common.core.utils.MapstructUtils;
|
|
|
import org.dromara.common.core.utils.MessageUtils;
|
|
|
+import org.dromara.common.core.utils.SpringUtils;
|
|
|
import org.dromara.common.core.utils.StringUtils;
|
|
|
+import org.dromara.common.core.utils.file.FileUtils;
|
|
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
@@ -22,6 +32,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.dromara.common.oss.core.OssClient;
|
|
|
+import org.dromara.common.oss.factory.OssFactory;
|
|
|
import org.dromara.common.satoken.utils.LoginHelper;
|
|
|
import org.dromara.common.tenant.helper.TenantHelper;
|
|
|
import org.dromara.system.domain.vo.SysOssVo;
|
|
|
@@ -29,6 +41,7 @@ import org.dromara.system.service.ISysDictDataService;
|
|
|
import org.dromara.system.service.ISysDictTypeService;
|
|
|
import org.dromara.system.service.ISysOssService;
|
|
|
import org.dromara.system.service.ISysUserService;
|
|
|
+import org.springframework.http.MediaType;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import com.yingpaipay.business.domain.vo.DocumentVo;
|
|
|
import com.yingpaipay.business.domain.Document;
|
|
|
@@ -36,6 +49,7 @@ import com.yingpaipay.business.mapper.DocumentMapper;
|
|
|
import com.yingpaipay.business.service.IDocumentService;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
+import java.io.*;
|
|
|
import java.util.*;
|
|
|
|
|
|
/**
|
|
|
@@ -104,6 +118,7 @@ public class DocumentServiceImpl implements IDocumentService {
|
|
|
folderIds.add(e.getFolderId());
|
|
|
userIds.add(e.getSubmitterId());
|
|
|
});
|
|
|
+ folderService.queryListByIds(folderIds).forEach(e -> folderMap.put(e.getId(), e.getName()));
|
|
|
ossService.queryListByIds(ossIds).forEach(e -> ossMap.put(e.getOssId(), e));
|
|
|
documents.forEach(e -> {
|
|
|
SysOssVo ossVo = ossMap.get(e.getOssId());
|
|
|
@@ -111,6 +126,7 @@ public class DocumentServiceImpl implements IDocumentService {
|
|
|
e.setUrl(ossVo.getUrl());
|
|
|
e.setFileName(ossVo.getOriginalName());
|
|
|
}
|
|
|
+ e.setFolderName(folderMap.get(e.getFolderId()));
|
|
|
});
|
|
|
}
|
|
|
|
|
|
@@ -350,6 +366,71 @@ public class DocumentServiceImpl implements IDocumentService {
|
|
|
}));
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void download(Long ossId, HttpServletResponse response) throws IOException {
|
|
|
+ SysOssVo sysOss = ossService.getById(ossId);
|
|
|
+ if (sysOss == null) {
|
|
|
+ throw new ServiceException("文件数据不存在!");
|
|
|
+ }
|
|
|
+
|
|
|
+ String originalExt = FilenameUtils.getExtension(sysOss.getOriginalName());
|
|
|
+ File tempFile = File.createTempFile("oss_download_", "." + originalExt);
|
|
|
+ tempFile.deleteOnExit();
|
|
|
+
|
|
|
+ try {
|
|
|
+ OssClient storage = OssFactory.instance(sysOss.getService());
|
|
|
+ try (FileOutputStream fos = new FileOutputStream(tempFile)) {
|
|
|
+ storage.download(sysOss.getFileName(), fos, null);
|
|
|
+ }
|
|
|
+
|
|
|
+ File processedFile = WatermarkUtils.processFile(tempFile, "123456");
|
|
|
+
|
|
|
+ FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName());
|
|
|
+ response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8");
|
|
|
+ response.setContentLengthLong(processedFile.length());
|
|
|
+
|
|
|
+ try (FileInputStream fis = new FileInputStream(processedFile);
|
|
|
+ BufferedInputStream bis = new BufferedInputStream(fis);
|
|
|
+ OutputStream os = response.getOutputStream()) {
|
|
|
+
|
|
|
+ byte[] buffer = new byte[8192];
|
|
|
+ int len;
|
|
|
+ while ((len = bis.read(buffer)) != -1) {
|
|
|
+ os.write(buffer, 0, len);
|
|
|
+ }
|
|
|
+ os.flush();
|
|
|
+ }
|
|
|
+
|
|
|
+ } finally {
|
|
|
+ if (tempFile.exists()) {
|
|
|
+ tempFile.delete();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<DocumentVo> listOnSearch(DocumentSearchBo bo, PageQuery pageQuery) {
|
|
|
+ List<Long> projectIds = new ArrayList<>();
|
|
|
+ projectService.queryOnSearch(bo.getProjectName(), bo.getProjectCode())
|
|
|
+ .forEach(e -> projectIds.add(e.getId()));
|
|
|
+ IPage<DocumentVo> page = baseMapper.selectVoPage(pageQuery.build(), buildOnSearchWrapper(bo, projectIds));
|
|
|
+ dealVo(page.getRecords());
|
|
|
+ return TableDataInfo.build(page);
|
|
|
+ }
|
|
|
+
|
|
|
+ private LambdaQueryWrapper<Document> buildOnSearchWrapper(DocumentSearchBo bo, List<Long> projectIds) {
|
|
|
+ return Wrappers.lambdaQuery(Document.class)
|
|
|
+ .in(StringUtils.isNotBlank(bo.getProjectName()) || StringUtils.isNotBlank(bo.getProjectCode()), Document::getProjectId, projectIds.isEmpty() ? List.of(-1L) : projectIds)
|
|
|
+ .like(StringUtils.isNotBlank(bo.getName()), Document::getName, bo.getName())
|
|
|
+ .eq(bo.getStatus() != null, Document::getStatus, bo.getStatus())
|
|
|
+ .eq(bo.getType() != null, Document::getPlanType, bo.getType())
|
|
|
+ .ge(bo.getParams().containsKey("createTimeEarliest"), Document::getCreateTime, bo.getParams().get("createTimeEarliest"))
|
|
|
+ .le(bo.getParams().containsKey("createTimeLatest"), Document::getCreateTime, bo.getParams().get("createTimeLatest"))
|
|
|
+ .ge(bo.getParams().containsKey("updateTimeEarliest"), Document::getUpdateTime, bo.getParams().get("updateTimeEarliest"))
|
|
|
+ .le(bo.getParams().containsKey("updateTimeLatest"), Document::getUpdateTime, bo.getParams().get("updateTimeLatest"))
|
|
|
+ .orderByDesc(Document::getId);
|
|
|
+ }
|
|
|
+
|
|
|
private LambdaQueryWrapper<Document> buildAuditListWrapper(TaskCenterAuditListBo bo, List<Long> folderIds) {
|
|
|
return Wrappers.lambdaQuery(Document.class)
|
|
|
.like(StringUtils.isNotBlank(bo.getName()), Document::getName, bo.getName())
|