增加ca签章业务代码

master
zengwh 2 years ago
parent f1679fad0e
commit 94353df48e

@ -156,7 +156,35 @@
<version>${mybatis.paginator.version}</version>
</dependency>
<!-- CA签章 -->
<dependency>
<groupId>cn.org.bjca.anysign</groupId>
<artifactId>anysign-client</artifactId>
<version>2.1.6-RELEASE</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/anysign-client-2.1.6-RELEASE.jar</systemPath>
</dependency>
<dependency>
<groupId>cn.org.bjca.anysign</groupId>
<artifactId>anysign-components</artifactId>
<version>2.1.6-RELEASE</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/anysign-components-2.1.6-RELEASE.jar</systemPath>
</dependency>
<dependency>
<groupId>cn.org.bjca.anysign</groupId>
<artifactId>anysign-components-bean</artifactId>
<version>2.1.6-RELEASE</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/anysign-components-bean-2.1.6-RELEASE.jar</systemPath>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>2.9.0</version>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>

@ -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 "完成";
}
}

@ -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<String> getPdfUrlByMasterOrId(@Param("assortIds") String[] assortIds, @Param("masterId")String masterId, @Param("flag")String flag, @Param("fileIds")String fileIds);
List<String> getChildPdfUrlByMasterIds(@Param("masterIds")String masterIds);
List<Archive_DetailPdfPathDto> getPdfPathByMasterId(@Param("masterId")String masterId);
}

@ -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<Archive_Detail_caSign> list);
}

@ -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;
}

@ -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;
}

@ -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<String> getPdfUrlByMasterOrId(String[] assortIds, String masterId, String flag, String fileIds);
List<Archive_DetailPdfPathDto> getPdfPathByMasterId(String masterId);
}

@ -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<Archive_Detail_caSign> list) {
archiveDetailCaSignMapper.insertBatchCaSign(list);
}
}

@ -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<Archive_DetailPdfPathDto> getPdfPathByMasterId(String masterId) {
return archiveDetailMapper.getPdfPathByMasterId(masterId);
}
}

@ -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: caSignByMasterIdmasterIdca
* @param: [masterId]
* @return: void
* @author
* @createTime 2023/7/25 15:52
*/
@Async
public void caSignByMasterId(String masterId) {
if (isCaOpen == 0) {
return;
}
//根据masterId查询文件集合
try {
List<Archive_DetailPdfPathDto> pdfPathList = archiveDetailService.getPdfPathByMasterId(masterId);
if (!CollectionUtils.isEmpty(pdfPathList)) {
//定义此次需要签章的文件id集合
List<String> 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: updateCaFileStateca
* @param: [idList, masterId]
* @return: void
* @author
* @createTime 2023/7/25 16:19
*/
private void updateCaFileState(List<String> idList, String masterId) {
if(!CollectionUtils.isEmpty(idList)) {
//先删除原有签章记录
archiveDetaiCaSignService.deletesFromMasterId(masterId);
//后新增
List<Archive_Detail_caSign> 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: caCopyFileca
* @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: caSignpdfca
* @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;
}
}

@ -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

@ -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

@ -768,4 +768,7 @@
<select id="getDetailInfo" resultType="com.emr.entity.Archive_Detail_Vo">
select Title,page_number,Source,flag,PDF_PATH from Archive_Detail where ID=#{detailId}
</select>
<select id="getPdfPathByMasterId" resultType="com.emr.dto.Archive_DetailPdfPathDto">
select id,PDF_PATH pdfPath from Archive_Detail where MasterID = #{masterId}
</select>
</mapper>

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.emr.dao.Archive_Detail_caSignMapper">
<insert id="caSignInsertBatch">
insert into Archive_Detail_caSign(archive_detail_id,master_id,sign_time)
values
<foreach collection="list" item="item" separator="," open="(" close=")">
#{item.archiveDetailId},#{item.masterId},#{item.signTime}
</foreach>
</insert>
<delete id="deletesFromMasterId">
delete from Archive_Detail_caSign where master_id = #{masterId}
</delete>
</mapper>
Loading…
Cancel
Save