diff --git a/pom.xml b/pom.xml
index 9abf60bc..64356c66 100644
--- a/pom.xml
+++ b/pom.xml
@@ -156,7 +156,35 @@
${mybatis.paginator.version}
+
+
+ cn.org.bjca.anysign
+ anysign-client
+ 2.1.6-RELEASE
+ system
+ ${project.basedir}/src/main/webapp/WEB-INF/lib/anysign-client-2.1.6-RELEASE.jar
+
+
+
+ cn.org.bjca.anysign
+ anysign-components
+ 2.1.6-RELEASE
+ system
+ ${project.basedir}/src/main/webapp/WEB-INF/lib/anysign-components-2.1.6-RELEASE.jar
+
+
+ cn.org.bjca.anysign
+ anysign-components-bean
+ 2.1.6-RELEASE
+ system
+ ${project.basedir}/src/main/webapp/WEB-INF/lib/anysign-components-bean-2.1.6-RELEASE.jar
+
+
+ com.fasterxml.jackson.module
+ jackson-module-jaxb-annotations
+ 2.9.0
+
mysql
diff --git a/src/main/java/com/emr/controller/TestController.java b/src/main/java/com/emr/controller/TestController.java
new file mode 100644
index 00000000..5712354b
--- /dev/null
+++ b/src/main/java/com/emr/controller/TestController.java
@@ -0,0 +1,28 @@
+package com.emr.controller;
+
+import com.emr.service.ipml.CaSignServiceImpl;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+
+/**
+ * @author 曾文和
+ * @description: XXX类
+ * @createTime 2023/7/25 11:02
+ */
+@Controller
+public class TestController {
+ @Resource
+ private CaSignServiceImpl caSignService;
+ @RequestMapping("font/test")
+ @ResponseBody
+ public String test(String masterId) throws Exception{
+ long start = System.currentTimeMillis();
+ caSignService.caSignByMasterId(masterId);
+ long end = System.currentTimeMillis();
+ System.out.println("执行后:"+(end-start));
+ return "完成";
+ }
+}
diff --git a/src/main/java/com/emr/dao/Archive_DetailMapper.java b/src/main/java/com/emr/dao/Archive_DetailMapper.java
index e66b15bc..b73ae376 100644
--- a/src/main/java/com/emr/dao/Archive_DetailMapper.java
+++ b/src/main/java/com/emr/dao/Archive_DetailMapper.java
@@ -1,5 +1,6 @@
package com.emr.dao;
+import com.emr.dto.Archive_DetailPdfPathDto;
import com.emr.entity.Archive_Detail;
import com.emr.entity.Archive_Detail_Vo;
import org.apache.ibatis.annotations.Param;
@@ -185,4 +186,6 @@ public interface Archive_DetailMapper {
List getPdfUrlByMasterOrId(@Param("assortIds") String[] assortIds, @Param("masterId")String masterId, @Param("flag")String flag, @Param("fileIds")String fileIds);
List getChildPdfUrlByMasterIds(@Param("masterIds")String masterIds);
+
+ List getPdfPathByMasterId(@Param("masterId")String masterId);
}
\ No newline at end of file
diff --git a/src/main/java/com/emr/dao/Archive_Detail_caSignMapper.java b/src/main/java/com/emr/dao/Archive_Detail_caSignMapper.java
new file mode 100644
index 00000000..63174128
--- /dev/null
+++ b/src/main/java/com/emr/dao/Archive_Detail_caSignMapper.java
@@ -0,0 +1,13 @@
+package com.emr.dao;
+
+
+import com.emr.entity.Archive_Detail_caSign;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface Archive_Detail_caSignMapper {
+ void deletesFromMasterId(@Param("masterId")String masterId);
+
+ void insertBatchCaSign(@Param("list")List list);
+}
\ No newline at end of file
diff --git a/src/main/java/com/emr/dto/Archive_DetailPdfPathDto.java b/src/main/java/com/emr/dto/Archive_DetailPdfPathDto.java
new file mode 100644
index 00000000..3394ce26
--- /dev/null
+++ b/src/main/java/com/emr/dto/Archive_DetailPdfPathDto.java
@@ -0,0 +1,15 @@
+package com.emr.dto;
+
+import lombok.Data;
+
+/**
+ * @author 曾文和
+ * @description: XXX类
+ * @createTime 2023/7/25 15:41
+ */
+@Data
+public class Archive_DetailPdfPathDto {
+ private String id;
+
+ private String pdfPath;
+}
diff --git a/src/main/java/com/emr/entity/Archive_Detail_caSign.java b/src/main/java/com/emr/entity/Archive_Detail_caSign.java
new file mode 100644
index 00000000..30e26146
--- /dev/null
+++ b/src/main/java/com/emr/entity/Archive_Detail_caSign.java
@@ -0,0 +1,17 @@
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by Fernflower decompiler)
+//
+
+package com.emr.entity;
+
+import lombok.Data;
+
+import java.util.Date;
+@Data
+public class Archive_Detail_caSign {
+ private Integer id;
+ private String archiveDetailId;
+ private String masterId;
+ private Date signTime;
+}
diff --git a/src/main/java/com/emr/service/Archive_DetailService.java b/src/main/java/com/emr/service/Archive_DetailService.java
index 7bab7c2c..eadccdbf 100644
--- a/src/main/java/com/emr/service/Archive_DetailService.java
+++ b/src/main/java/com/emr/service/Archive_DetailService.java
@@ -6,6 +6,7 @@
*/
package com.emr.service;
+import com.emr.dto.Archive_DetailPdfPathDto;
import com.emr.entity.Archive_Detail;
import com.emr.entity.Archive_Detail_Vo;
import com.emr.entity.OffsetLimitPage;
@@ -145,6 +146,8 @@ public interface Archive_DetailService {
OffsetLimitPage selectPdfPathMayError(Archive_Detail_Vo record, Integer offset, Integer limit);
List getPdfUrlByMasterOrId(String[] assortIds, String masterId, String flag, String fileIds);
+
+ List getPdfPathByMasterId(String masterId);
}
diff --git a/src/main/java/com/emr/service/ipml/Archive_Detai_CaSignServiceImpl.java b/src/main/java/com/emr/service/ipml/Archive_Detai_CaSignServiceImpl.java
new file mode 100644
index 00000000..17c9f216
--- /dev/null
+++ b/src/main/java/com/emr/service/ipml/Archive_Detai_CaSignServiceImpl.java
@@ -0,0 +1,29 @@
+package com.emr.service.ipml;
+
+import com.emr.dao.Archive_Detail_caSignMapper;
+import com.emr.entity.Archive_Detail_caSign;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author 曾文和
+ * @description: ca签章类
+ * @createTime 2023/7/25 10:27
+ */
+@Service
+@Transactional
+public class Archive_Detai_CaSignServiceImpl {
+ @Resource
+ private Archive_Detail_caSignMapper archiveDetailCaSignMapper;
+
+ public void deletesFromMasterId(String masterId) {
+ archiveDetailCaSignMapper.deletesFromMasterId(masterId);
+ }
+
+ public void insertBatchCaSign(List list) {
+ archiveDetailCaSignMapper.insertBatchCaSign(list);
+ }
+}
diff --git a/src/main/java/com/emr/service/ipml/Archive_DetailServiceImpl.java b/src/main/java/com/emr/service/ipml/Archive_DetailServiceImpl.java
index 995f5716..19146f7d 100644
--- a/src/main/java/com/emr/service/ipml/Archive_DetailServiceImpl.java
+++ b/src/main/java/com/emr/service/ipml/Archive_DetailServiceImpl.java
@@ -8,6 +8,7 @@ package com.emr.service.ipml;
import com.emr.dao.Archive_DetailMapper;
import com.emr.dao.Archive_MasterMapper;
+import com.emr.dto.Archive_DetailPdfPathDto;
import com.emr.dto.Archive_MasterDto;
import com.emr.entity.*;
import com.emr.service.Archive_DetailService;
@@ -335,6 +336,11 @@ public class Archive_DetailServiceImpl implements Archive_DetailService {
return resultList;
}
+ @Override
+ public List getPdfPathByMasterId(String masterId) {
+ return archiveDetailMapper.getPdfPathByMasterId(masterId);
+ }
+
}
diff --git a/src/main/java/com/emr/service/ipml/CaSignServiceImpl.java b/src/main/java/com/emr/service/ipml/CaSignServiceImpl.java
new file mode 100644
index 00000000..3c0604ec
--- /dev/null
+++ b/src/main/java/com/emr/service/ipml/CaSignServiceImpl.java
@@ -0,0 +1,205 @@
+package com.emr.service.ipml;
+
+import cn.org.bjca.seal.esspdf.client.message.ChannelMessage;
+import cn.org.bjca.seal.esspdf.client.message.RectangleBean;
+import cn.org.bjca.seal.esspdf.client.tools.AnySignClientTool;
+import cn.org.bjca.seal.esspdf.client.utils.ClientUtil;
+import com.emr.dto.Archive_DetailPdfPathDto;
+import com.emr.entity.Archive_Detail_caSign;
+import com.emr.service.Archive_DetailService;
+import com.lowagie.text.pdf.PdfReader;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.io.*;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author 曾文和
+ * @description: ca签章类
+ * @createTime 2023/7/25 10:27
+ */
+@Service
+@EnableAsync
+@Slf4j
+public class CaSignServiceImpl {
+ AnySignClientTool anySignClientTool = null;
+ @Value("${caServerIp}")
+ private String caServerIp;
+ @Value("${caServerPort}")
+ private int caServerPort;
+ @Value("${signNo}")
+ private String signNo;
+ @Value("${signLeft}")
+ private String signLeft;
+ @Value("${signTop}")
+ private String signTop;
+ @Value("${signRight}")
+ private String signRight;
+ @Value("${signBottom}")
+ private String signBottom;
+ @Value("${isCaOpen}")
+ private int isCaOpen;
+ @Value("${caCopyPath}")
+ private String caCopyPath;
+ @Resource
+ private Archive_DetailService archiveDetailService;
+ @Resource
+ private Archive_Detai_CaSignServiceImpl archiveDetaiCaSignService;
+ /**
+ * @Description: caSignByMasterId方法是根据masterId查询所有文件进行ca签章
+ * @param: [masterId]
+ * @return: void
+ * @author 曾文和
+ * @createTime 2023/7/25 15:52
+ */
+ @Async
+ public void caSignByMasterId(String masterId) {
+ if (isCaOpen == 0) {
+ return;
+ }
+ //根据masterId查询文件集合
+ try {
+ List pdfPathList = archiveDetailService.getPdfPathByMasterId(masterId);
+ if (!CollectionUtils.isEmpty(pdfPathList)) {
+ //定义此次需要签章的文件id集合
+ List idList = new ArrayList<>();
+ SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
+ //获取今天日期
+ String todayDate = fmt.format(new Date());
+ //遍历文件集合
+ for (Archive_DetailPdfPathDto dto : pdfPathList) {
+ //获取文件路径
+ String pdfPath = dto.getPdfPath();
+ File file = new File(pdfPath);
+ if (file.isFile()) {
+ //备份源文件
+ caCopyFile(pdfPath, todayDate, masterId);
+ //进行签章
+ boolean isSign = caSign(pdfPath);
+ if (isSign) {
+ idList.add(dto.getId());
+ }
+ }
+ }
+ //添加签章记录
+ updateCaFileState(idList,masterId);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * @Description: updateCaFileState方法是更新ca签章
+ * @param: [idList, masterId]
+ * @return: void
+ * @author 曾文和
+ * @createTime 2023/7/25 16:19
+ */
+ private void updateCaFileState(List idList, String masterId) {
+ if(!CollectionUtils.isEmpty(idList)) {
+ //先删除原有签章记录
+ archiveDetaiCaSignService.deletesFromMasterId(masterId);
+ //后新增
+ List list = new ArrayList<>();
+ Date date = new Date();
+ for(String id : idList){
+ Archive_Detail_caSign obj = new Archive_Detail_caSign();
+ obj.setArchiveDetailId(id);
+ obj.setMasterId(masterId);
+ obj.setSignTime(date);
+ list.add(obj);
+ }
+ //批量新增
+ archiveDetaiCaSignService.insertBatchCaSign(list);
+ }
+ }
+
+ /**
+ * @Description: caCopyFile方法是备份ca前文件
+ * @param: [pdfPath]
+ * @return: void
+ * @author 曾文和
+ * @createTime 2023/7/25 15:51
+ */
+ private void caCopyFile(String pdfPath, String todayDate,String masterId) {
+ String newPath = caCopyPath + File.separator + todayDate + File.separator + masterId ;
+ if(!new File(newPath).isDirectory()){
+ new File(newPath).mkdirs();
+ }
+ String newSrc = newPath + File.separator + new File(pdfPath).getName();
+ try (InputStream inputStream = new FileInputStream(pdfPath);
+ OutputStream outputStream = new FileOutputStream(newSrc)) {
+ byte[] buffer = new byte[1024];
+ int bytesRead;
+ while ((bytesRead = inputStream.read(buffer)) != -1) {
+ outputStream.write(buffer, 0, bytesRead);
+ }
+ System.out.println("文件拷贝完成");
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * @Description: caSign方法是根据pdf文件路径调用ca接口进行每页签章
+ * @param: [fileSrc]
+ * @return: void
+ * @author 曾文和
+ * @createTime 2023/7/25 10:30
+ */
+ private boolean caSign(String fileSrc) throws Exception {
+ //定义是否成功
+ boolean flag = false;
+ PdfReader pdfReader = null;
+ try {
+ pdfReader = new PdfReader(fileSrc);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ if (pdfReader != null) {
+ anySignClientTool = new AnySignClientTool(caServerIp, caServerPort);
+ File file = new File(fileSrc);
+ byte[] pdfBty = ClientUtil.readFileToByteArray(file);
+ //pdf验章
+ ChannelMessage messageExist = anySignClientTool.pdfVerify(pdfBty);
+ if(!StringUtils.isEmpty(messageExist.getStatusInfo()) && "pdf文档未签章".equals(messageExist.getStatusInfo())) {
+ RectangleBean bean = new RectangleBean();
+ bean.setLeft(Float.valueOf(signLeft));
+ bean.setTop(Float.valueOf(signTop));
+ bean.setRight(Float.valueOf(signRight));
+ bean.setBottom(Float.valueOf(signBottom));
+ int numberOfPages = pdfReader.getNumberOfPages();
+ for (int i = 0; i < numberOfPages; i++) {
+ if (i != 0) {
+ pdfBty = ClientUtil.readFileToByteArray(file);
+ }
+ bean.setPageNo(i + 1);
+ ChannelMessage message = null;
+ message = anySignClientTool.pdfSignByParam(pdfBty, signNo, bean);
+ if ("200".equals(message.getStatusCode())) {//成功
+ ClientUtil.writeByteArrayToFile(new File(fileSrc), message.getBody());
+ } else {
+ String statusCode = message.getStatusCode();
+ String statusInfo = message.getStatusInfo();
+ System.out.println("statusCode=" + statusCode + ";statusInfo=" + statusInfo);
+ }
+ }
+ }
+ flag = true;
+ } else {
+ log.error("进行签章pdf:"+fileSrc+"不存在或损坏");
+ }
+ return flag;
+ }
+}
diff --git a/src/main/resources/config/caSign.properties b/src/main/resources/config/caSign.properties
new file mode 100644
index 00000000..5e5e4594
--- /dev/null
+++ b/src/main/resources/config/caSign.properties
@@ -0,0 +1,20 @@
+#\u662F\u5426\u5F00\u542F\u63A5\u53E3 1:\u5F00\u542F\uFF1B0:\u5173\u95ED
+isCaOpen=0
+#ca\u63A5\u53E3ip
+caServerIp=223.70.139.221
+#ca\u63A5\u53E3\u7AEF\u53E3
+caServerPort=18002
+#\u7B7E\u7AE0\u7F16\u53F7
+signNo=59BC18FE5DEB0F15
+#\u7B7E\u7AE0\u4F4D\u7F6E\u5DE6\u504F
+signLeft=200
+#\u7B7E\u7AE0\u4F4D\u7F6E\u4E0A\u504F
+signTop=300
+#\u7B7E\u7AE0\u4F4D\u7F6E\u53F3\u504F
+signRight=650
+#\u7B7E\u7AE0\u4F4D\u7F6E\u4E0B\u504F
+signBottom=50
+
+
+#\u5907\u4EFD\u539F\u6587\u4EF6\u8DEF\u5F84
+caCopyPath=d:docus/caCopy
\ No newline at end of file
diff --git a/src/main/resources/config/jdbc.properties b/src/main/resources/config/jdbc.properties
index 16ed71a8..01207209 100644
--- a/src/main/resources/config/jdbc.properties
+++ b/src/main/resources/config/jdbc.properties
@@ -1,8 +1,8 @@
POWER_IP=127.0.0.1
jdbc.username=sa
-jdbc.password=admin123
+jdbc.password=docus702
dataBaseName=zj_record_new
-POWER_PORT=8082
+POWER_PORT=8081
jdbc.url=jdbc\:sqlserver\://${POWER_IP}:1433;databaseName=${dataBaseName}
jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
diff --git a/src/main/resources/mapper/Archive_DetailMapper.xml b/src/main/resources/mapper/Archive_DetailMapper.xml
index 27e18493..c40732b2 100644
--- a/src/main/resources/mapper/Archive_DetailMapper.xml
+++ b/src/main/resources/mapper/Archive_DetailMapper.xml
@@ -768,4 +768,7 @@
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/Archive_Detail_caSignMapper.xml b/src/main/resources/mapper/Archive_Detail_caSignMapper.xml
new file mode 100644
index 00000000..11c9d8f1
--- /dev/null
+++ b/src/main/resources/mapper/Archive_Detail_caSignMapper.xml
@@ -0,0 +1,15 @@
+
+
+
+
+ insert into Archive_Detail_caSign(archive_detail_id,master_id,sign_time)
+ values
+
+ #{item.archiveDetailId},#{item.masterId},#{item.signTime}
+
+
+
+
+ delete from Archive_Detail_caSign where master_id = #{masterId}
+
+
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/lib/anysign-client-2.1.6-RELEASE.jar b/src/main/webapp/WEB-INF/lib/anysign-client-2.1.6-RELEASE.jar
new file mode 100644
index 00000000..7ac3f3b3
Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/anysign-client-2.1.6-RELEASE.jar differ
diff --git a/src/main/webapp/WEB-INF/lib/anysign-components-2.1.6-RELEASE.jar b/src/main/webapp/WEB-INF/lib/anysign-components-2.1.6-RELEASE.jar
new file mode 100644
index 00000000..6f09b993
Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/anysign-components-2.1.6-RELEASE.jar differ
diff --git a/src/main/webapp/WEB-INF/lib/anysign-components-bean-2.1.6-RELEASE.jar b/src/main/webapp/WEB-INF/lib/anysign-components-bean-2.1.6-RELEASE.jar
new file mode 100644
index 00000000..19e6a295
Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/anysign-components-bean-2.1.6-RELEASE.jar differ