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