Просмотр исходного кода

立项管理新增附件上传功能

yusm 1 неделя назад
Родитель
Сommit
ac7d12d524

+ 9 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalController.java

@@ -1,12 +1,8 @@
 package com.management.platform.controller;
 
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.google.gson.JsonObject;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.InformationMapper;
 import com.management.platform.mapper.ProjectLevelMapper;
@@ -15,13 +11,11 @@ import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.*;
 import com.management.platform.service.impl.WxCorpInfoServiceImpl;
 import com.management.platform.util.HttpRespMsg;
-import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
@@ -30,8 +24,8 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.*;
+import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -74,6 +68,8 @@ public class ProjectApprovalController {
     private ProjectLevelMapper projectLevelMapper;
     @Resource
     private InformationMapper informationMapper;
+    @Resource
+    private ProjectApprovalDocumentService projectApprovalDocumentService;
 
     /**
      * 分页获取项目列表
@@ -152,6 +148,7 @@ public class ProjectApprovalController {
             msg.setError("验证失败");
             return msg;
         }
+        msg.setData(projectApproval.getId());
         projectApprovalLog.setProjectApprovalId(projectApproval.getId());
         projectApprovalLogService.save(projectApprovalLog);
         participationApprovalService.remove(new LambdaQueryWrapper<ParticipationApproval>().eq(ParticipationApproval::getProjectApprovalId,projectApproval.getId()));
@@ -310,6 +307,7 @@ public class ProjectApprovalController {
 //                }
             }
         }
+        msg.setData(projectApproval.getId());
         return msg;
     }
 
@@ -378,6 +376,7 @@ public class ProjectApprovalController {
             msg.setError("验证失败");
             return msg;
         }
+        msg.setData(projectApproval.getId());
         projectApprovalLog.setProjectApprovalId(projectApproval.getId());
         projectApprovalLogService.save(projectApprovalLog);
         participationApprovalService.remove(new LambdaQueryWrapper<ParticipationApproval>().eq(ParticipationApproval::getProjectApprovalId,projectApproval.getId()));
@@ -482,6 +481,8 @@ public class ProjectApprovalController {
         projectApproval.setProjectApprovalAuditorList(projectApprovalAuditorList);
         List<ProjectApprovalBasecost> projectApprovalBasecostList = projectApprovalBasecostService.list(new LambdaQueryWrapper<ProjectApprovalBasecost>().eq(ProjectApprovalBasecost::getProjectApprovalId, id));
         projectApproval.setProjectApprovalBasecostList(projectApprovalBasecostList);
+        List<ProjectApprovalDocument> projectApprovalDocumentList = projectApprovalDocumentService.list(new LambdaQueryWrapper<ProjectApprovalDocument>().eq(ProjectApprovalDocument::getProjectApprovalId, id).eq(ProjectApprovalDocument::getIsDeleted, 0));
+        projectApproval.setProjectApprovalDocumentList(projectApprovalDocumentList);
         msg.setData(projectApproval);
         return msg;
     }

+ 44 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalDocumentController.java

@@ -0,0 +1,44 @@
+package com.management.platform.controller;
+
+import com.management.platform.entity.vo.ContractFileDelVO;
+import com.management.platform.service.ProjectApprovalDocumentService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@RestController
+@RequestMapping("/project-approval-document")
+public class ProjectApprovalDocumentController {
+
+    @Resource
+    private ProjectApprovalDocumentService projectApprovalDocumentService;
+
+    @RequestMapping("/fileUpload")
+    public HttpRespMsg fileUpload(HttpServletRequest request,
+                                  @RequestParam Integer projectApprovalId,
+                                  @RequestParam(required = false) Integer folderId,
+                                  @RequestParam("file") MultipartFile[] files) {
+        return projectApprovalDocumentService.fileUpload(request, projectApprovalId, folderId, files);
+    }
+
+    @RequestMapping("/fileDown")
+    public HttpRespMsg fileDown(HttpServletRequest request,
+                                HttpServletResponse response,
+                                @RequestParam(required = false) Integer folderId,
+                                Integer projectApprovalId,
+                                Integer fileId) {
+        return projectApprovalDocumentService.fileDown(request, response, folderId, projectApprovalId, fileId);
+    }
+
+    @RequestMapping("/fileDelete")
+    public HttpRespMsg fileDelete(HttpServletRequest request, ContractFileDelVO contractFileDelVO) {
+        return projectApprovalDocumentService.fileDelete(request, contractFileDelVO);
+    }
+
+}

+ 9 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectApproval.java

@@ -1,19 +1,19 @@
 package com.management.platform.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.extension.activerecord.Model;
-import java.time.LocalDate;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
-import java.io.Serializable;
-import java.util.List;
-
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.util.List;
+
 /**
  * <p>
  * 
@@ -265,6 +265,9 @@ public class ProjectApproval extends Model<ProjectApproval> {
     @TableField(exist = false)
     private List<ProjectApprovalCheck> projectApprovalCheckList;
 
+    @TableField(exist = false)
+    private List<ProjectApprovalDocument> projectApprovalDocumentList;
+
     @TableField(exist = false)
     private String inchargerName;
 

+ 67 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectApprovalDocument.java

@@ -0,0 +1,67 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 立项附件
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProjectApprovalDocument extends Model<ProjectApprovalDocument> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("document_name")
+    private String documentName;
+
+    @TableField("server_name")
+    private String serverName;
+
+    @TableField("url")
+    private String url;
+
+    @TableField("creator_id")
+    private String creatorId;
+
+    @TableField("creator_name")
+    private String creatorName;
+
+    @TableField("indate")
+    private LocalDateTime indate;
+
+    @TableField("project_approval_id")
+    private Integer projectApprovalId;
+
+    @TableField("folder_id")
+    private Integer folderId;
+
+    @TableField("size")
+    private String size;
+
+    @TableField("document_type")
+    private Integer documentType;
+
+    @TableField("is_deleted")
+    private Integer isDeleted;
+
+    @TableField("is_folder")
+    private Integer isFolder;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+}

+ 7 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectApprovalDocumentMapper.java

@@ -0,0 +1,7 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.ProjectApprovalDocument;
+
+public interface ProjectApprovalDocumentMapper extends BaseMapper<ProjectApprovalDocument> {
+}

+ 22 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectApprovalDocumentService.java

@@ -0,0 +1,22 @@
+package com.management.platform.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.ProjectApprovalDocument;
+import com.management.platform.entity.vo.ContractFileDelVO;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 立项附件服务
+ */
+public interface ProjectApprovalDocumentService extends IService<ProjectApprovalDocument> {
+
+    HttpRespMsg fileUpload(HttpServletRequest request, Integer projectApprovalId, Integer folderId, MultipartFile[] files);
+
+    HttpRespMsg fileDown(HttpServletRequest request, HttpServletResponse response, Integer folderId, Integer projectApprovalId, Integer fileId);
+
+    HttpRespMsg fileDelete(HttpServletRequest request, ContractFileDelVO contractFileDelVO);
+}

+ 204 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectApprovalDocumentServiceImpl.java

@@ -0,0 +1,204 @@
+package com.management.platform.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.entity.ProjectApproval;
+import com.management.platform.entity.ProjectApprovalDocument;
+import com.management.platform.entity.User;
+import com.management.platform.entity.vo.ContractFileDelVO;
+import com.management.platform.mapper.ProjectApprovalDocumentMapper;
+import com.management.platform.mapper.ProjectApprovalMapper;
+import com.management.platform.mapper.SysFunctionMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ProjectApprovalDocumentService;
+import com.management.platform.util.DocumentTypeUtil;
+import com.management.platform.util.FileUtil;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.UUID;
+
+@Service
+public class ProjectApprovalDocumentServiceImpl extends ServiceImpl<ProjectApprovalDocumentMapper, ProjectApprovalDocument> implements ProjectApprovalDocumentService {
+
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ProjectApprovalMapper projectApprovalMapper;
+    @Resource
+    private ProjectApprovalDocumentMapper projectApprovalDocumentMapper;
+    @Resource
+    private SysFunctionMapper sysFunctionMapper;
+    @Value(value = "${upload.path}")
+    private String path;
+
+    @Override
+    public HttpRespMsg fileUpload(HttpServletRequest request, Integer projectApprovalId, Integer folderId, MultipartFile[] files) {
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        ProjectApproval projectApproval = projectApprovalMapper.selectById(projectApprovalId);
+        if (projectApproval == null) {
+            msg.setError("立项不存在");
+            return msg;
+        }
+        boolean canManage = user.getId().equals(projectApproval.getCreatorId()) || user.getId().equals(projectApproval.getInchargerId());
+        if (!canManage) {
+            msg.setError(MessageUtils.message("access.operationError"));
+            return msg;
+        }
+
+        for (MultipartFile file : files) {
+            if (file == null || file.isEmpty()) {
+                continue;
+            }
+            ProjectApprovalDocument record = new ProjectApprovalDocument();
+            record.setCreatorId(user.getId());
+            record.setCreatorName(user.getName());
+            record.setDocumentName(file.getOriginalFilename());
+            record.setFolderId(folderId);
+            record.setProjectApprovalId(projectApprovalId);
+            record.setIndate(LocalDateTime.now());
+            record.setIsDeleted(0);
+            record.setIsFolder(0);
+
+            String fileSuffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
+            record.setDocumentType(DocumentTypeUtil.DocumentType(fileSuffix));
+
+            File dir = new File(path);
+            if (!dir.exists()) {
+                dir.mkdirs();
+            }
+
+            try {
+                String fileName = UUID.randomUUID().toString().replaceAll("-", "") + fileSuffix;
+                File saveFile = new File(dir, fileName);
+                saveFile.createNewFile();
+                file.transferTo(saveFile);
+                long fileSize = saveFile.length();
+                record.setServerName(path + fileName);
+                record.setSize(FileUtil.getReadableFileSize(fileSize));
+                record.setUrl("/upload/" + fileName);
+                projectApprovalDocumentMapper.insert(record);
+                msg.data = record;
+            } catch (IOException e) {
+                msg.setError(e.getMessage());
+                return msg;
+            }
+        }
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg fileDown(HttpServletRequest request, HttpServletResponse response, Integer folderId, Integer projectApprovalId, Integer fileId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        ProjectApproval projectApproval = projectApprovalMapper.selectById(projectApprovalId);
+        if (projectApproval == null) {
+            msg.setError("立项不存在");
+            return msg;
+        }
+        boolean canView = user.getId().equals(projectApproval.getCreatorId()) || user.getId().equals(projectApproval.getInchargerId());
+        if (!canView) {
+            msg.setError(MessageUtils.message("access.viewError"));
+            return msg;
+        }
+        List<ProjectApprovalDocument> files = projectApprovalDocumentMapper.selectList(
+                new QueryWrapper<ProjectApprovalDocument>()
+                        .eq("project_approval_id", projectApprovalId)
+                        .eq("is_deleted", 0)
+        );
+        try {
+            for (ProjectApprovalDocument file : files) {
+                if (fileId.equals(file.getId())) {
+                    File uploadFile = new File(file.getServerName());
+                    if (!uploadFile.exists()) {
+                        msg.setError(MessageUtils.message("file.error"));
+                        return msg;
+                    }
+                    long fileLength = uploadFile.length();
+                    String fileName = URLEncoder.encode(file.getDocumentName(), "UTF-8").replaceAll("\\+", "%20");
+                    response.reset();
+                    response.setCharacterEncoding("UTF-8");
+                    response.setContentType("application/octet-stream");
+                    response.addHeader("Content-Disposition", "attachment;filename*=UTF-8''" + fileName);
+                    response.addHeader("Accept-Ranges", "bytes");
+
+                    long start = 0;
+                    long end = fileLength - 1;
+                    String range = request.getHeader("Range");
+                    if (range != null && range.startsWith("bytes=")) {
+                        String[] ranges = range.substring(6).split("-");
+                        start = Long.parseLong(ranges[0]);
+                        if (ranges.length > 1 && ranges[1] != null && !ranges[1].isEmpty()) {
+                            end = Long.parseLong(ranges[1]);
+                        }
+                        if (end >= fileLength) {
+                            end = fileLength - 1;
+                        }
+                        response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
+                        response.addHeader("Content-Range", "bytes " + start + "-" + end + "/" + fileLength);
+                    } else {
+                        response.setStatus(HttpServletResponse.SC_OK);
+                    }
+
+                    try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(uploadFile));
+                         ServletOutputStream os = response.getOutputStream()) {
+                        if (start > 0) {
+                            bis.skip(start);
+                        }
+                        byte[] buffer = new byte[8192];
+                        long position = start;
+                        int len;
+                        while ((len = bis.read(buffer)) != -1 && position <= end) {
+                            if (position + len - 1 > end) {
+                                len = (int) (end - position + 1);
+                            }
+                            os.write(buffer, 0, len);
+                            position += len;
+                            if (position > end) {
+                                break;
+                            }
+                        }
+                        os.flush();
+                    }
+                    return msg;
+                }
+            }
+        } catch (IOException e) {
+            msg.setError(MessageUtils.message("file.error"));
+        }
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg fileDelete(HttpServletRequest request, ContractFileDelVO contractFileDelVO) {
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("Token"));
+        if (user == null) {
+            msg.setError("用户不存在");
+            return msg;
+        }
+        List<Integer> fileIds = contractFileDelVO.getFileIds();
+        List<ProjectApprovalDocument> docs = projectApprovalDocumentMapper.selectBatchIds(fileIds);
+        for (ProjectApprovalDocument doc : docs) {
+            doc.setIsDeleted(1);
+            projectApprovalDocumentMapper.updateById(doc);
+        }
+        msg.msg = MessageUtils.message("file.deleteSuc");
+        return msg;
+    }
+}

Разница между файлами не показана из-за своего большого размера
+ 2691 - 1463
fhKeeper/formulahousekeeper/timesheet/src/views/projectApproval/projectApproval.vue