Browse Source

案卷收集

“zhifk” 2 năm trước cách đây
mục cha
commit
edf0644866

+ 7 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java

@@ -54,5 +54,11 @@ public interface ArchiveFileClient {
     List<ArchiveFile> listWrappers(@RequestBody LambdaQueryWrapper<ArchiveFile> in);
 
     @PostMapping(API_PREFIX + "/updateWrappers")
-    boolean updateWrappers(LambdaUpdateWrapper<ArchiveFile> eq);
+    boolean updateWrappers(@RequestBody LambdaUpdateWrapper<ArchiveFile> eq);
+
+    @PostMapping(API_PREFIX + "/removeFile")
+    boolean removeFile(@RequestBody List<Long> toLongList);
+
+    @PostMapping(API_PREFIX + "/getArchiveFileByArchivesId")
+    List<ArchiveFile> getArchiveFileByArchivesId(@RequestParam String archivesIds,@RequestParam String fileIds);
 }

+ 48 - 5
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileAutoController.java

@@ -11,6 +11,7 @@ import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.archive.service.IArchivesAutoService;
+import org.springblade.archive.utils.FileUtils;
 import org.springblade.archive.vo.ArchivesAutoVO;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.feign.ArchiveFileClient;
@@ -20,6 +21,7 @@ import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.Func;
 import org.springblade.evisa.feign.EVisaClient;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.manager.feign.ArchiveTreeContractClient;
@@ -28,10 +30,8 @@ import org.springblade.system.user.entity.UserOauth;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -134,9 +134,52 @@ public class ArchiveFileAutoController extends BladeController {
      * 迁移文件
      */
     @PostMapping("/migrateFile")
-    @ApiOperationSupport(order = 9)
+    @ApiOperationSupport(order = 4)
     @ApiOperation(value = "迁移文件", notes = "传入ids")
     public R migrateFile(@RequestParam String ids,@RequestParam String nodeId,@RequestParam String nodeSort) {
         return R.status(archivesAutoService.updateArchivesAutoFileByNodeId(ids,nodeId,nodeSort));
     }
+    /**
+     * 删除
+     */
+    @PostMapping("/remove")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "逻辑删除", notes = "传入ids")
+    public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+        List<ArchiveFile> list = this.archiveFileClient.getArchiveFileByArchivesId(ids,"");
+        StringBuffer fileIds = new StringBuffer();
+        if(list != null && list.size()>0){
+            for(ArchiveFile archiveFile : list){
+                fileIds.append(archiveFile.getId());
+                fileIds.append(",");
+            }
+        }
+        /**先删除对应工程文件在删除案卷**/
+        boolean b = this.archiveFileClient.removeFile(Func.toLongList(fileIds.toString()));
+        if(b){
+            return R.status(archivesAutoService.deleteLogic(Func.toLongList(ids)));
+        }
+        return R.status(false);
+    }
+    /**
+     * 批量下载
+     */
+    @PostMapping("/batchDownloadFileToZip")
+    @ApiOperationSupport(order = 8)
+    @ApiOperation(value = "批量下载")
+    public void batchDownloadFileToZip(String ids, HttpServletResponse response){
+
+        if(StringUtils.isNotEmpty(ids)){
+            //获取文件
+            List<ArchiveFile> result = this.archiveFileClient.getArchiveFileByArchivesId(ids,"");
+            if(result != null && result.size() > 0){
+                List<String> urls = new ArrayList<>();
+                result.forEach(archiveFile -> urls.add(archiveFile.getFileUrl() + "@@@" + archiveFile.getFileName()));
+
+                //打包下载
+                FileUtils.batchDownloadFileToZip(urls, response);
+            }
+        }
+
+    }
 }

+ 32 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java

@@ -11,6 +11,7 @@ import io.swagger.annotations.*;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
 import org.apache.commons.lang.StringUtils;
+import org.springblade.archive.utils.FileUtils;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.feign.ArchiveFileClient;
 import org.springblade.business.vo.ArchiveFileVO;
@@ -27,6 +28,7 @@ import org.springblade.resource.feign.IOSSClient;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -227,4 +229,34 @@ public class ArchiveFileController extends BladeController {
         }
         return list.size() == 0 ? R.data(true) : R.data(300, false, "没有找到证书文件或PDF文件");
     }
+    /**
+     * 删除
+     */
+    @PostMapping("/remove")
+    @ApiOperationSupport(order = 10)
+    @ApiOperation(value = "逻辑删除", notes = "传入ids")
+    public R<Boolean> remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+        return R.status( this.archiveFileClient.removeFile(Func.toLongList(ids)));
+    }
+    /**
+     * 批量下载
+     */
+    @PostMapping("/batchDownloadFileToZip")
+    @ApiOperationSupport(order = 8)
+    @ApiOperation(value = "批量下载")
+    public void batchDownloadFileToZip(String ids, HttpServletResponse response){
+
+        if(StringUtils.isNotEmpty(ids)){
+            //获取文件
+            List<ArchiveFile> result = this.archiveFileClient.getArchiveFileByArchivesId("",ids);
+            if(result != null && result.size() > 0){
+                List<String> urls = new ArrayList<>();
+                result.forEach(archiveFile -> urls.add(archiveFile.getFileUrl() + "@@@" + archiveFile.getFileName()));
+
+                //打包下载
+                FileUtils.batchDownloadFileToZip(urls, response);
+            }
+        }
+
+    }
 }

+ 232 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileUtils.java

@@ -0,0 +1,232 @@
+package org.springblade.archive.utils;
+
+import com.itextpdf.text.Document;
+import com.itextpdf.text.pdf.PdfCopy;
+import com.itextpdf.text.pdf.PdfReader;
+import org.apache.commons.lang.StringUtils;
+import org.apache.poi.ss.usermodel.ClientAnchor;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.util.Units;
+import org.springblade.common.utils.CommonUtil;
+import org.springblade.common.vo.DataVO;
+import org.springblade.core.tool.utils.IoUtil;
+
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.net.URLEncoder;
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+public class FileUtils {
+
+    public static void batchDownloadFileToZip(List<String> urls, HttpServletResponse response){
+        // 设置压缩流:直接写入response,实现边压缩边下载
+        ZipOutputStream zipos = null;
+        // 循环将文件写入压缩流
+        DataOutputStream os = null;
+        try{
+
+            // 响应头的设置
+            response.reset();
+            response.setCharacterEncoding("utf-8");
+            response.setContentType("multipart/form-data");
+            // 设置压缩包的名字
+            // 解决不同浏览器压缩包名字含有中文时乱码的问题
+            String downloadName = "附件-" + System.currentTimeMillis() + ".zip";
+            response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(downloadName, "UTF-8"));
+
+
+            try {
+                zipos = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
+                // 设置压缩方法
+                zipos.setMethod(ZipOutputStream.DEFLATED);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+            if(zipos == null){
+                return;
+            }
+
+            InputStream inputStream = null;
+
+            for(String url : urls){
+                if(StringUtils.isNotEmpty(url)){
+                    try{
+                        String fileName = null, symbol = "";
+                        if(url.contains("@@@")){
+                            String[] array = url.split("@@@");
+                            url = array[0];
+                            fileName = array[1];
+                            symbol = url.substring(url.lastIndexOf("."));
+                        }
+
+                        //获取文件流
+                        inputStream = CommonUtil.getOSSInputStream(url);
+                        //转换
+                        byte[] bytes = CommonUtil.InputStreamToBytes(inputStream);
+
+                        if(StringUtils.isEmpty(fileName)){
+                            fileName = url.substring(url.lastIndexOf("/") + 1);
+                            symbol = "";
+                        }
+                        zipos.putNextEntry(new ZipEntry(fileName + symbol));
+
+                        os = new DataOutputStream(zipos);
+                        os.write(bytes);
+                        zipos.closeEntry();
+
+                    }catch (Exception e){
+                        e.printStackTrace();
+                    } finally {
+                        IoUtil.closeQuietly(inputStream);
+                    }
+                }
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+        } finally {
+            IoUtil.closeQuietly(os);
+            IoUtil.closeQuietly(zipos);
+        }
+    }
+
+    /**
+     * 压缩图片
+     */
+    public static byte[] resizeImage(byte[] srcImgData, float reduceMultiple) throws IOException {
+        BufferedImage bi = ImageIO.read(new ByteArrayInputStream(srcImgData));
+        /*int width = (int) (bi.getWidth() * reduceMultiple);
+        int height = (int) (bi.getHeight() * reduceMultiple);*/
+        int width = 600;
+        int height = 800;
+        Image image = bi.getScaledInstance(width, height, Image.SCALE_SMOOTH);
+        BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+        Graphics g = tag.getGraphics();
+        g.setColor(Color.RED);
+        g.drawImage(image, 0, 0, null);
+        g.dispose();
+        ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+        ImageIO.write(tag, "JPEG", bOut);
+        return bOut.toByteArray();
+    }
+
+    /**
+     * 压缩图片2
+     */
+    public static byte[] resizeImage2(byte[] srcImgData, float reduceMultiple) throws IOException {
+        BufferedImage bi = ImageIO.read(new ByteArrayInputStream(srcImgData));
+        int width = (int) (bi.getWidth() * reduceMultiple);
+        int height = (int) (bi.getHeight() * reduceMultiple);
+        Image image = bi.getScaledInstance(width, height, Image.SCALE_SMOOTH);
+        BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+        Graphics g = tag.getGraphics();
+        g.setColor(Color.RED);
+        g.drawImage(image, 0, 0, null);
+        g.dispose();
+        ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+        ImageIO.write(tag, "JPEG", bOut);
+        return bOut.toByteArray();
+    }
+
+    /**
+     * 图片定位
+     */
+    public static void imageOrientation(Sheet sheet, ClientAnchor anchor, DataVO dataVO) {
+        anchor.setDx1(Units.pixelToEMU(5));
+        anchor.setDy1(Units.pixelToEMU(5));
+        anchor.setCol2(anchor.getCol1());
+        anchor.setRow2(anchor.getRow1());
+        int k = getMergedRegionIndex(sheet, CommonUtil.join(dataVO.getX(), dataVO.getY(), dataVO.getX(), dataVO.getY(),","));
+        if(k>-1){
+            /*如果是合并单元格,则锚点第二坐标设置为合并区右下角单元格坐标*/
+            CellRangeAddress ca = sheet.getMergedRegion(k);
+            anchor.setCol1(ca.getFirstColumn());
+            anchor.setRow1(ca.getFirstRow());
+            anchor.setCol2(ca.getLastColumn());
+            anchor.setRow2(ca.getLastRow());
+        }
+        int dx=(int)(sheet.getColumnWidthInPixels(anchor.getCol2())+3);
+        int dy=Units.pointsToPixel(sheet.getRow(anchor.getRow2()).getHeightInPoints())-5;
+        anchor.setDx2(Units.pixelToEMU(dx));
+        anchor.setDy2(Units.pixelToEMU(dy));
+    }
+
+    public static int getMergedRegionIndex(Sheet sheet, String coords) {
+        for (int i = 0; i < sheet.getNumMergedRegions(); i++) {
+            CellRangeAddress ca = sheet.getMergedRegion(i);
+            int firstColumn = ca.getFirstColumn();
+            int lastColumn = ca.getLastColumn();
+            int firstRow = ca.getFirstRow();
+            int lastRow = ca.getLastRow();
+            Matcher mu = CommonUtil.matcher("(\\d{1,3}),(\\d{1,3}),(\\d{1,3}),(\\d{1,3})",coords);
+            /*合并单元格四个角坐标,只要任意一个在落在将要合并的区域里面意味着两者重合,就必须拆分前者*/
+            List<Integer[]> corners = Arrays.asList(new Integer[]{firstColumn,firstRow},new Integer[]{lastColumn,firstRow},new Integer[]{firstColumn,lastRow},new Integer[]{lastColumn,lastRow});
+            if(mu.find()){
+                int firstColumn2 = mu.group(1) == null ? 0 : Integer.parseInt(mu.group(1));
+                int lastColumn2 = mu.group(3) == null ? 0 : Integer.parseInt(mu.group(3));
+                int firstRow2 = mu.group(2) == null ? 0 : Integer.parseInt(mu.group(2));
+                int lastRow2 = mu.group(4) == null ? 0 : Integer.parseInt(mu.group(4));
+                for(Integer[] corner:corners){
+                    if(firstColumn2<=corner[0]&&corner[0]<=lastColumn2&&firstRow2<=corner[1]&&corner[1]<=lastRow2){
+                        return i;
+                    }
+                }
+            }
+        }
+        return -1;
+    }
+
+    /**
+     * 合并方法
+     */
+    public static void mergePdfPublicMethods(List<String> urlList, String localImgUrl){
+        PdfReader reader = null;
+
+        Document doc = new Document();
+        PdfCopy pdfCopy = null;
+        try{
+            pdfCopy = new PdfCopy(doc, new FileOutputStream(localImgUrl));
+            int pageCount;
+            doc.open();
+
+            for(String urlStr : urlList){
+                try{
+                    //获取OSS文件输入流
+                    reader = new PdfReader(CommonUtil.getOSSInputStream(urlStr));
+
+                    pageCount = reader.getNumberOfPages();
+
+                    for(int i = 0; i < pageCount; ++i){
+                        int is = i + 1;
+                        pdfCopy.addPage(pdfCopy.getImportedPage(reader,is));
+                    }
+                }catch (Exception e){
+                    e.printStackTrace();
+                } finally {
+                    if(reader != null){
+                        reader.close();
+                    }
+                }
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+        } finally {
+            if(pdfCopy != null){
+                pdfCopy.flush();
+                pdfCopy.close();
+            }
+            doc.close();
+        }
+    }
+
+}

+ 11 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java

@@ -74,4 +74,15 @@ public class ArchiveFileClientImpl implements ArchiveFileClient {
     public boolean updateWrappers(LambdaUpdateWrapper<ArchiveFile> eq) {
         return this.iArchiveFileService.update(eq);
     }
+
+    @Override
+    public boolean removeFile(List<Long> toLongList) {
+        return this.iArchiveFileService.deleteLogic(toLongList);
+    }
+
+    @Override
+    public List<ArchiveFile> getArchiveFileByArchivesId(String archivesIds,String fileIds) {
+
+        return this.iArchiveFileService.getArchiveFileByArchivesId(archivesIds,fileIds);
+    }
 }

+ 4 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.java

@@ -62,4 +62,8 @@ public interface ArchiveFileMapper extends BaseMapper<ArchiveFile> {
 	List<Object> selectBoxNameAndBoxNumber(String nodeId);
 
 	Integer updateArchiveFileByNodeId(List<Long> ids, String nodeId);
+
+	List<ArchiveFile> getArchiveFileByArchivesId(@Param("ids") List<Long> ids);
+
+	List<ArchiveFile> getArchiveFileByFileIds(@Param("ids") List<Long> ids);
 }

+ 22 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml

@@ -245,4 +245,26 @@
             #{id}
         </foreach>
     </update>
+
+
+    <select id="getArchiveFileByArchivesId" resultMap="archiveFileResultMap">
+        select * from u_archive_file where is_deleted = 0
+        <if test="ids != null and ids != ''">
+            and archive_id in
+            <foreach collection="ids" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </if>
+        order by sort,create_time DESC
+    </select>
+    <select id="getArchiveFileByFileIds" resultMap="archiveFileResultMap">
+        select * from u_archive_file where is_deleted = 0
+        <if test="ids != null and ids != ''">
+            and id in
+            <foreach collection="ids" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </if>
+        order by sort,create_time DESC
+    </select>
 </mapper>

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/IArchiveFileService.java

@@ -65,4 +65,6 @@ public interface IArchiveFileService extends BaseService<ArchiveFile> {
 	List<Object> selectBoxNameAndBoxNumber(String nodeId);
 
 	boolean updateArchiveFileByNodeId(String ids, String nodeId);
+
+	List<ArchiveFile> getArchiveFileByArchivesId(String archivesIds,String fileIds);
 }

+ 12 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ArchiveFileServiceImpl.java

@@ -17,6 +17,7 @@ import org.springblade.system.feign.IDictBizClient;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -144,6 +145,17 @@ public class ArchiveFileServiceImpl extends BaseServiceImpl<ArchiveFileMapper, A
 		return true;
 	}
 
+	@Override
+	public List<ArchiveFile> getArchiveFileByArchivesId(String archivesIds,String fileIds) {
+		if(!archivesIds.isEmpty() && archivesIds != ""){
+			return baseMapper.getArchiveFileByArchivesId(Func.toLongList(archivesIds));
+		}else if(!fileIds.isEmpty() && fileIds != ""){
+			return baseMapper.getArchiveFileByFileIds(Func.toLongList(fileIds));
+		}else{
+			return new ArrayList<>();
+		}
+	}
+
 	@Override
 	public IPage<ArchiveFileVO> selectArchiveFilePageByBoxName(ArchiveFileVO vo) {
 		Query query = new Query();