Browse Source

电签功能

huangjn 2 years ago
parent
commit
7354199c77

+ 3 - 2
blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/feign/EVisaClient.java

@@ -5,6 +5,7 @@ import org.springblade.evisa.vo.EVisaMakeSealVO;
 import org.springblade.evisa.vo.EVisaTaskApprovalVO;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 
 @FeignClient(value = EVisaConstant.APPLICATION_WEATHER_NAME)
 public interface EVisaClient {
@@ -18,12 +19,12 @@ public interface EVisaClient {
      * 电签
      */
     @PostMapping(API_PREFIX + "/eVisa")
-    void eVisa(EVisaTaskApprovalVO task);
+    void eVisa(@RequestBody EVisaTaskApprovalVO task);
 
     /**
      * 创建印模
      */
     @PostMapping(API_PREFIX + "/createSeal")
-    String createSeal(EVisaMakeSealVO vo);
+    String createSeal(@RequestBody EVisaMakeSealVO vo);
 
 }

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreePrivateClient.java

@@ -20,6 +20,9 @@ public interface WbsTreePrivateClient {
      */
     String API_PREFIX = "/api/manager/WbsTreePrivate";
 
+    @PostMapping(API_PREFIX + "/queryExcelTableByParentId")
+    List<WbsTreePrivate> queryExcelTableByParentId(@RequestBody WbsTreePrivate treePrivate);
+
     @PostMapping(API_PREFIX + "/queryChildByParentId")
     List<WbsTreePrivate> queryChildByParentId(@RequestBody WbsTreePrivate treePrivate);
 

+ 2 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SignPfxFileVO.java

@@ -55,4 +55,6 @@ public class SignPfxFileVO extends SignPfxFile {
 	@ApiModelProperty("项目合同段信息")
 	private List<SignPfxDeputy> signPfxDeputieList;
 
+	private String key;
+
 }

+ 5 - 62
blade-service/blade-business/src/main/java/org/springblade/business/controller/ArchiveFileController.java

@@ -13,6 +13,7 @@ import org.apache.commons.lang.StringUtils;
 import org.springblade.business.entity.Task;
 import org.springblade.business.feign.OperationLogClient;
 import org.springblade.business.feign.TaskClient;
+import org.springblade.business.utils.FileUtils;
 import org.springblade.business.vo.ArchiveTaskVO;
 import org.springblade.business.vo.TaskVO;
 import org.springblade.common.utils.CommonUtil;
@@ -37,6 +38,7 @@ import java.io.InputStream;
 import java.net.URLEncoder;
 import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
@@ -71,68 +73,9 @@ public class ArchiveFileController extends BladeController {
 		if(StringUtils.isNotEmpty(ids)){
 			//获取文件
 			List<ArchiveFile> result = this.archiveFileService.list(Wrappers.<ArchiveFile>lambdaQuery().in(ArchiveFile::getId, Arrays.asList(ids.split(","))));
-
-			// 设置压缩流:直接写入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(ArchiveFile file : result){
-					if(StringUtils.isNotEmpty(file.getFileUrl())){
-						try{
-
-							//获取文件流
-							inputStream = CommonUtil.getOSSInputStream(file.getFileUrl());
-							//转换
-							byte[] bytes = CommonUtil.InputStreamToBytes(inputStream);
-
-							String suffix = file.getFileUrl().substring(file.getFileUrl().lastIndexOf("."));
-							zipos.putNextEntry(new ZipEntry(file.getFileName()+suffix));
-
-							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);
-			}
-
+			List<String> urls = result.stream().map(ArchiveFile::getFileUrl).distinct().collect(Collectors.toList());
+			//打包下载
+			FileUtils.batchDownloadFileToZip(urls, response);
 		}
 
 	}

+ 25 - 1
blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java

@@ -9,6 +9,8 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
+
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.util.IOUtils;
@@ -86,6 +88,28 @@ public class ImageClassificationFileController extends BladeController {
 
 	private final NewIOSSClient newIOSSClient;
 
+	/**
+	 * 批量下载
+	 */
+	@PostMapping("/batchDownloadFileToZip")
+	@ApiOperationSupport(order = 13)
+	@ApiOperation(value = "批量下载")
+	public void batchDownloadFileToZip(String ids, HttpServletResponse response){
+		if(StringUtils.isNotEmpty(ids)){
+			//查询数据
+			List<ImageClassificationFile> result = this.imageClassificationFileService.list(Wrappers.<ImageClassificationFile>lambdaQuery().in(ImageClassificationFile::getId, Arrays.asList(ids.split(","))));
+			List<String> urls = new ArrayList<>();
+			for(ImageClassificationFile file : result){
+				if(StringUtils.isNotEmpty(file.getImageUrl())){
+					urls.addAll(Arrays.asList(file.getImageUrl().split(",")));
+				}
+			}
+
+			//打包下载
+			FileUtils.batchDownloadFileToZip(urls, response);
+		}
+	}
+
 	/**
 	 * 影音资料览(图片)
 	 */
@@ -94,7 +118,7 @@ public class ImageClassificationFileController extends BladeController {
 	@ApiOperation(value = "影音资料览(图片)")
 	public R<String> preview(@RequestParam String ids){
 		//获取固定表格
-		ExcelTab excelTab = this.excelTabClient.getById("1548845687369334785");
+		ExcelTab excelTab = this.excelTabClient.getById("1550363881879781377");
 
 		List<String> result = new ArrayList<>();
 		if(excelTab != null){

+ 6 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -515,6 +515,12 @@ public class InformationWriteQueryController extends BladeController {
 					//还有子级,继续向下
 					this.foreachQueryChild(childs, childList);
 				}
+			} else {
+				//说明是工序,查询这个节点下是否存在表格数据
+				List<WbsTreePrivate> exlTables = this.wbsTreePrivateClient.queryExcelTableByParentId(parent);
+				if(exlTables != null && exlTables.size() > 0){
+					childList.addAll(exlTables);
+				}
 			}
 		});
 	}

+ 63 - 39
blade-service/blade-business/src/main/java/org/springblade/business/utils/FileUtils.java

@@ -3,63 +3,87 @@ package org.springblade.business.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.servlet.http.HttpServletResponse;
 import java.io.*;
+import java.net.URLEncoder;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.regex.Matcher;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
 
 public class FileUtils {
 
-    public Map<String,Integer> getDxDy(Sheet sheet, ClientAnchor anchor){
-        Map<String,Integer> map = new HashMap<>();
-        if(sheet != null && anchor != null){
-            /*左上角单元格坐标*/
-            final int x1=anchor.getCol1();
-            final int y1=anchor.getRow1();
-            /*相对位移像素*/
-            final int dx1= Units.pointsToPixel(Units.toPoints(anchor.getDx1()));
-            final int dy1= Units.pointsToPixel(Units.toPoints(anchor.getDy1()));
-            int sum1=0;
-            for(int i=0;i<x1;i++){
-                sum1+=sheet.getColumnWidthInPixels(i)+8;
-            }
-            sum1+=dx1;
-            map.put("x1",sum1);
-            int sum2=0;
-            for(int i=0;i<y1;i++){
-                sum2+=Units.pointsToPixel(sheet.getRow(i).getHeightInPoints());
+    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();
             }
-            sum2+=dy1;
-            map.put("y1",sum2);
-            /*右下角单元格坐标*/
-            final int x2=anchor.getCol2();
-            final int y2=anchor.getRow2();
-            /*相对位移像素*/
-            final int dx2= Units.pointsToPixel(Units.toPoints(anchor.getDx2()));
-            final int dy2= Units.pointsToPixel(Units.toPoints(anchor.getDy2()));
-            int sum3=0;
-            for(int i=0;i<x2;i++){
-                sum3+=sheet.getColumnWidthInPixels(i)+8;
+
+            if(zipos == null){
+                return;
             }
-            sum3+=dx2;
-            map.put("x2",sum3);
-            int sum4=0;
-            for(int i=0;i<y2;i++){
-                sum4+=Units.pointsToPixel(sheet.getRow(i).getHeightInPoints());
+
+            InputStream inputStream = null;
+
+            for(String url : urls){
+                if(StringUtils.isNotEmpty(url)){
+                    try{
+
+                        //获取文件流
+                        inputStream = CommonUtil.getOSSInputStream(url);
+                        //转换
+                        byte[] bytes = CommonUtil.InputStreamToBytes(inputStream);
+
+                        String fileName = url.substring(url.lastIndexOf("/") + 1);
+                        zipos.putNextEntry(new ZipEntry(fileName));
+
+                        os = new DataOutputStream(zipos);
+                        os.write(bytes);
+                        zipos.closeEntry();
+
+                    }catch (Exception e){
+                        e.printStackTrace();
+                    } finally {
+                        IoUtil.closeQuietly(inputStream);
+                    }
+                }
             }
-            sum4+=dy2;
-            map.put("y2",sum4);
+
+        }catch (Exception e){
+            e.printStackTrace();
+        } finally {
+            IoUtil.closeQuietly(os);
+            IoUtil.closeQuietly(zipos);
         }
-        return map;
     }
 
     /**

+ 11 - 5
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java

@@ -38,6 +38,10 @@ import java.util.List;
 @AllArgsConstructor
 public class EVisaServiceImpl implements EVisaService {
 
+    private static final String SIGN_HOST = "47.115.117.246";
+
+    private static final String SIGN_PORT = "8183";
+
     private static final Logger logger = LoggerFactory.getLogger(EVisaServiceImpl.class);
 
     private final SignPfxClient signPfxClient;
@@ -76,7 +80,7 @@ public class EVisaServiceImpl implements EVisaService {
     private boolean signPdf(){
         StringBuffer stringbuffer = new StringBuffer();
         try{
-            PaperlessClient paperlessClient = new PaperlessClient("host", "port", 3000, 20000);
+            PaperlessClient paperlessClient = new PaperlessClient(SIGN_HOST, SIGN_PORT, 3000, 20000);
 
             paperlessClient.setSSL(false);
             //*****************************************************************************
@@ -108,7 +112,7 @@ public class EVisaServiceImpl implements EVisaService {
     @Override
     public String createSeal(EVisaMakeSealVO vo) {
         try{
-            PaperlessClient paperlessClient = new PaperlessClient("host", "port", 3000, 20000);
+            PaperlessClient paperlessClient = new PaperlessClient(SIGN_HOST, SIGN_PORT, 3000, 20000);
             paperlessClient.setSSL(false);
 
             // ------构造请求报文头------
@@ -163,9 +167,11 @@ public class EVisaServiceImpl implements EVisaService {
             ResponseHead responseHeadBean = responseBean.getHead();
             // 响应报文体
             MakeSealResponseBody responseBodyBean = responseBean.getBody();
-            logger.info("【电签模块】{}", "创建印章成功==========certDn: " + responseBodyBean.getCertDn() + " ; message: " + responseHeadBean.getMessage());
-            //请求结果
-            return responseHeadBean.getCode();
+            if(responseBodyBean != null){
+                logger.info("【电签模块】{}", "创建印章成功==========certDn: " + responseBodyBean.getCertDn() + " ; message: " + responseHeadBean.getMessage());
+                //请求结果
+                return responseHeadBean.getMessage();
+            }
         }catch (Exception e){
             e.printStackTrace();
         }

+ 7 - 0
blade-service/blade-manager/pom.xml

@@ -121,6 +121,13 @@
             <scope>compile</scope>
         </dependency>
 
+        <!-- 电签类引用 -->
+        <dependency>
+            <groupId>com.e.visa</groupId>
+            <artifactId>paperless.base</artifactId>
+            <version>4.6.0.2</version>
+        </dependency>
+        <!-- 电签类引用 -->
 
     </dependencies>
 

+ 4 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/SignPfxFileController.java

@@ -351,10 +351,10 @@ public class SignPfxFileController extends BladeController {
 	 */
 	@PostMapping("/goRegister")
 	@ApiOperationSupport(order = 5)
-	@ApiOperation(value = "注册(先对接接口,功能未完成)")
+	@ApiOperation(value = "注册")
 	@ApiImplicitParam(name = "id", value = "列表数据主键ID", required = true)
-	public R<Boolean> goRegister(Long id){
-		return this.signPfxFileService.goRegister(id);
+	public R<Boolean> goRegister(@RequestBody SignPfxFileVO vo){
+		return this.signPfxFileService.goRegister(Long.parseLong(vo.getKey()));
 	}
 
 	/**
@@ -389,6 +389,7 @@ public class SignPfxFileController extends BladeController {
 		}
 		vo.setCreateUser(AuthUtil.getUserId());
 		vo.setCreateTime(new Date());
+		vo.setIsRegister(0);
 		return R.status(this.signPfxFileService.save(vo));
 	}
 

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java

@@ -86,7 +86,7 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
         vos.forEach(voData -> {
             voData.setLeaf(new Integer("6").equals(voData.getDeptCategory()));
             //检查是否有下级
-            long count = this.wbsTreeContractService.count(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getParentId, voData.getId()).eq(WbsTreeContract::getContractId, contractId));
+            long count = this.wbsTreeContractService.count(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getParentId, voData.getId()).eq(WbsTreeContract::getContractId, contractId).eq(WbsTreeContract::getWbsType, 1));
             voData.setExsitChild(count == 0);
         });
         return vos;

+ 5 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreePrivateClientImpl.java

@@ -16,6 +16,11 @@ public class WbsTreePrivateClientImpl implements WbsTreePrivateClient {
 
     private final IWbsTreePrivateService wbsTreePrivateService;
 
+    @Override
+    public List<WbsTreePrivate> queryExcelTableByParentId(WbsTreePrivate treePrivate) {
+        return this.wbsTreePrivateService.list(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getParentId, treePrivate.getId()).eq(WbsTreePrivate::getProjectId, treePrivate.getProjectId()).eq(WbsTreePrivate::getType, 2));
+    }
+
     @Override
     public List<WbsTreePrivate> queryChildByParentId(WbsTreePrivate treePrivate) {
         return this.wbsTreePrivateService.list(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getParentId, treePrivate.getId()).eq(WbsTreePrivate::getProjectId, treePrivate.getProjectId()));

+ 4 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/SignPfxFileServiceImpl.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.manager.service.impl;
 
+import cfca.paperless.base.enums.IdType;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -99,7 +100,7 @@ public class SignPfxFileServiceImpl extends BaseServiceImpl<SignPfxFileMapper, S
 
 			//判断是否存在个人签名文件
 			if(StringUtils.isNotEmpty(singPfx.getSignatureFileUrl()) && !"null".equals(singPfx.getSignatureFileUrl())){
-				if(!singPfx.getSignatureFileUrl().contains("png") || !singPfx.getSignatureFileUrl().contains("jpg")){
+				if(!singPfx.getSignatureFileUrl().contains("png") && !singPfx.getSignatureFileUrl().contains("jpg")){
 					return R.data(-1, false, "用户签名不是PNG/JPG图片");
 				}
 
@@ -110,7 +111,7 @@ public class SignPfxFileServiceImpl extends BaseServiceImpl<SignPfxFileMapper, S
 				//签名文件
 				makeSeal.setImageUrl(singPfx.getSignatureFileUrl());
 				//居民身份证
-//				makeSeal.setIdType(IdType.JUMINSHENFENZHENG.getCode());
+				makeSeal.setIdType(IdType.JUMINSHENFENZHENG.getCode());
 				//证书文件
 				makeSeal.setPfxFileUrl(singPfx.getCertificateFileUrl());
 				//证书密码
@@ -140,7 +141,7 @@ public class SignPfxFileServiceImpl extends BaseServiceImpl<SignPfxFileMapper, S
 		try{
 			//调用接口创建印模
 			String resultCode = this.eVisaClient.createSeal(JSONObject.parseObject(JSONObject.toJSONString(makeSeal), EVisaMakeSealVO.class));
-			if(StringUtils.isNotEmpty(resultCode) && "1".equals(resultCode)){
+			if(StringUtils.isNotEmpty(resultCode) && ("successfully".equals(resultCode) || "success".equals(resultCode) || "1".equals(resultCode))){
 				logger.info("【电签模块】{}", "创建" + msg + "成功");
 				//修改状态为已注册
 				this.update(Wrappers.<SignPfxFile>lambdaUpdate().set(SignPfxFile::getIsRegister, 1).eq(SignPfxFile::getId, pfxFileId));