签章功能修改

master
linjj 6 months ago
parent 8651f55867
commit 1526555105

@ -120,6 +120,16 @@
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.0</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20210307</version>
</dependency>
<!-- httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>

@ -35,10 +35,10 @@ public class TestController {
@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));
// long start = System.currentTimeMillis();
// caSignService.caSignByMasterId(masterId);
// long end = System.currentTimeMillis();
//// System.out.println("执行后:" + (end - start));
return "完成";
}

@ -258,6 +258,15 @@ public class lastVerifyController {
}
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
// 从session获取用户名
Power_User user = (Power_User) request.getSession().getAttribute("CURRENT_USER");
String handleName = user.getUserPosition();//姓名
String username = user.getUserName();//工号
//调用ca签章接口
Msg msg = caSignService.caSignByMasterId(emrFaultDetail.getArchiveDetailId(), user);
if (msg.getCode()==200){
return Msg.fail("使用签章时失败");
}
//修改病案归档状态
Archive_Master archiveMaster = new Archive_Master();
archiveMaster.setId(emrFaultDetail.getArchiveDetailId());
@ -267,6 +276,7 @@ public class lastVerifyController {
//归档记录添加到commomtable表
CommomVo commomVo = new CommomVo();
archiveMaster.setCmtNurse(1);
List<Archive_Master> archiveMasters = archiveMasterService.selectCommonlyUsed(emrFaultDetail.getArchiveDetailId());
for (Archive_Master list : archiveMasters) {
commomVo.setPatientId(list.getId());
@ -283,10 +293,6 @@ public class lastVerifyController {
}
//添加初审内容
if (bol == 1) {
// 从session获取用户名
Power_User user = (Power_User) request.getSession().getAttribute("CURRENT_USER");
String handleName = user.getUserPosition();//姓名
String username = user.getUserName();//工号
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowTime = format1.format(new Date());
emrFaultDetail.setCreater(username);
@ -310,8 +316,6 @@ public class lastVerifyController {
//留观号审核推送第三方
archiveMasterService.requestObservationRecord(inpatientNo,"AUDITED",null,null);
}
//调用ca签章接口
caSignService.caSignByMasterId(emrFaultDetail.getArchiveDetailId());
}
return Msg.success();
}
@ -331,7 +335,6 @@ public class lastVerifyController {
// 从session获取用户名
Power_User user = (Power_User) request.getSession().getAttribute("CURRENT_USER");
String username = user.getUserName();//获取前面登录的用户名
//参数输入
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowTime = format.format(new Date());

@ -0,0 +1,33 @@
package com.emr.dao;
import com.emr.vo.CaDepartIdVo;
import org.apache.ibatis.annotations.Param;
/**
*@InterfaceName CaDepartIdMapper
*@Description id
*@Author linjj
*@Date 2025/2/5 11:31
*@Version 1.0
*/
public interface CaDepartIdMapper {
/**
* @description:
* @params: dataName
* @return: CaDepartIdVo
* @author linjj
* @date: 2025/2/5 11:36
*/
CaDepartIdVo getDepartId(String dataName);
/**
* @description:
* @params: dataName
* @return: int
* @author linjj
* @date: 2025/2/5 12:27
*/
int addDepartId(@Param(value = "dataName") String dataName,@Param(value = "dataId") String dataId);
}

@ -15,4 +15,6 @@ public interface CaSignatureMapper {
int getCaMasterId(@Param("masterId") String masterId,@Param("signatureStatic") int signatureStatic);
int delCaMasterId(@Param("masterId") String masterId);
}

@ -34,6 +34,16 @@ public class Power_User {
private String deptId;
private String phone;
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
private String deptCode;
public String getDeptCode() {

@ -7,25 +7,36 @@ import cn.org.bjca.seal.esspdf.client.tools.AnySignClientTool;
import cn.org.bjca.seal.esspdf.client.utils.ClientUtil;
import com.emr.dao.ArchiveDetailCaCopyMapper;
import com.emr.dao.Archive_Detail_ca_reqParamMapper;
import com.emr.dao.CaDepartIdMapper;
import com.emr.dao.CaSignatureMapper;
import com.emr.dto.Archive_DetailPdfPathDto;
import com.emr.entity.Archive_Detail_caSign;
import com.emr.entity.Archive_Detail_ca_reqParam;
import com.emr.entity.Power_User;
import com.emr.service.Archive_DetailService;
import com.emr.util.Msg;
import com.emr.vo.CaDepartIdVo;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfReader;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONObject;
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 okhttp3.*;
import javax.annotation.Resource;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Date;
import java.util.List;
@ -61,6 +72,17 @@ public class CaSignServiceImpl {
private CaSignatureMapper caSignatureMapper;
@Resource
private ArchiveDetailCaCopyMapper archiveDetailCaCopyMapper;
@Resource
private CaDepartIdMapper caDepartIdMapper;
@Value("${synDepartUrl}")
private String synDepartUrl;
@Value("${signUrl}")
private String signUrl;
@Value("${clientId}")
private String clientId;
@Value("${clientSecret}")
private String clientSecret;
/**
* @Description: caSignByMasterIdmasterIdca
@ -69,17 +91,29 @@ public class CaSignServiceImpl {
* @author
* @createTime 2023/7/25 15:52
*/
@Async
public void caSignByMasterId(String masterId) {
public Msg caSignByMasterId(String masterId, Power_User user) {
if (isCaOpen == 0) {
return;
return Msg.success();
}
//根据masterId查询文件集合
try {
List<Archive_DetailPdfPathDto> pdfPathList = archiveDetailService.getPdfPathByMasterId(masterId);
if (!CollectionUtils.isEmpty(pdfPathList)) {
//判断该部门是否存在签章
CaDepartIdVo caDepartIdVo = caDepartIdMapper.getDepartId(user.getRemark());
//没有保存部门签章id时需要请求获取一个新的departId
if (caDepartIdVo==null){
//请求医院科室在医网信标识id
String departId = getDepartId(user);
caDepartIdMapper.addDepartId(user.getRemark(),departId);
return Msg.fail("该用户科室没有在医信网平台申请部门签章请联系医信网人员");
}
if (StringUtils.isBlank(caDepartIdVo.getDataId())) {
return Msg.fail("部门标识为空");
}
String dataId = caDepartIdVo.getDataId();
//保存文件表数据list
List<Archive_DetailPdfPathDto> list=new ArrayList<>();
List<Archive_DetailPdfPathDto> list = new ArrayList<>();
//签章后保存目录
String newPath = newPdfPath + File.separator + masterId;
//没有目录创建目录
@ -94,25 +128,29 @@ public class CaSignServiceImpl {
List<String> failIdList = new ArrayList<>();
//遍历文件集合
for (Archive_DetailPdfPathDto dto : pdfPathList) {
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmssSSS");
//获取今天日期
String todayDate = fmt.format(new Date());
//签章后地址
String newPdfPath = newPath + File.separator + todayDate+".pdf";
//获取文件路径
String pdfPath = dto.getPdfPath();
File file = new File(pdfPath);
if (file.isFile()) {
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmssSSS");
//获取今天日期
String todayDate = fmt.format(new Date());
//签章后地址
String newpdfPath = newPath + File.separator + todayDate+".pdf";
backupsPdf(pdfPath,newpdfPath);
//进行签章
boolean isSign = caSign(newpdfPath, caReqParam);
if (isSign) {
idList.add(dto.getId());
dto.setPdfPath(newpdfPath);
} else {
failIdList.add(dto.getId());
dto.setPdfPath(newpdfPath);
String pdfPathString = pdfToBase64(pdfPath);
PdfReader pdfReader = new PdfReader(pdfPath);
int pageCount = pdfReader.getNumberOfPages();
Msg msg = sign(pdfPathString, dataId,caReqParam,pageCount);
if (msg.getCode()!=100){
return Msg.fail();
}
String newPdfPathBase64 = msg.getMsg();
if (!convertBase64ToPdf(newPdfPathBase64, newPdfPath)){
return Msg.fail();
}
dto.setPdfPath(newPdfPath);
} else {
return Msg.fail();
}
list.add(dto);
}
@ -120,8 +158,9 @@ public class CaSignServiceImpl {
updateCaFileState(idList, failIdList, masterId);
//判断是否存在,存在在先删除
int caMasterId = caSignatureMapper.getCaMasterId(masterId, 1);
if (caMasterId>0){
if (caMasterId > 0) {
archiveDetailCaCopyMapper.updateByMasterID(masterId);
caSignatureMapper.delCaMasterId(masterId);
}
//签章完后保存新的文件表
archiveDetailCaCopyMapper.addArchiveDetailCaCopyMapper(list);
@ -130,19 +169,161 @@ public class CaSignServiceImpl {
}
} catch (Exception e) {
e.printStackTrace();
return Msg.fail("请求失败");
}
return Msg.success();
}
//将pdf文件base64方法
public static String pdfToBase64(String filePath) throws IOException {
File file = new File(filePath);
// 读取文件内容到字节数组
byte[] fileContent = Files.readAllBytes(file.toPath());
// 将字节数组编码为Base64字符串
return Base64.getEncoder().encodeToString(fileContent);
}
//将base64转为pdf方法
public Boolean convertBase64ToPdf(String base64String, String filePath) {
try {
// 解码Base64字符串
byte[] decodedBytes = Base64.getDecoder().decode(base64String);
// 将解码后的数据写入PDF文件
try (FileOutputStream fos = new FileOutputStream(filePath)) {
fos.write(decodedBytes);
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
private void backupsPdf(String pdfPath,String newpdfPath){
try (InputStream inputStream = new FileInputStream(pdfPath);
OutputStream outputStream = new FileOutputStream(newpdfPath)) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
//签章接口
private Msg sign(String pdfPathString,String departId,Archive_Detail_ca_reqParam caReqParam,int pageCount) {
// 创建OkHttpClient实例
OkHttpClient client = new OkHttpClient();
// 定义请求的URL
String url = signUrl;
String pdfSignBase64="";
// 创建请求体
String json = "{"
+ "\"head\": {"
+ "\"clientId\": \"" + clientId + "\","
+ "\"clientSecret\": \"" + clientSecret + "\","
+ "},"
+ "\"body\": {"
+ "\"pdfBase64\": \"" + pdfPathString + "\","
+ "\"departId\": \"" + departId + "\","
// + "\"keyword\": \"医师签名\","
// + "\"moveType\": \"1\","
// + "\"searchOrder\": \"2\","
// + "\"scale\": \"0.4\","
// + "\"fileType\": \"2\","
+ "\"locationPage\": \"" + pageCount + "\","
+ "\"x\": \"" + caReqParam.getSignTop() + "\","
+ "\"y\": \"" + caReqParam.getSignLeft() + "\","
+ "}"
+ "}";
// 创建RequestBody
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
// 创建Request
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
try {
// 执行请求
Response response = client.newCall(request).execute();
// 检查响应状态码
if (response.isSuccessful()) {
// 获取响应体
String responseData = response.body().string();
// 解析JSON响应
JSONObject jsonResponse = new JSONObject(responseData);
// 获取返回的参数
pdfSignBase64 = jsonResponse.getJSONObject("data").getString("pdfSignBase64");
String status = jsonResponse.getString("status");
if (!status.equals("0")){
return Msg.fail("请求失败");
}
} else {
System.out.println("请求失败,状态码:" + response.code());
}
} catch (Exception e) {
e.printStackTrace();
return Msg.fail();
}
return Msg.success(pdfSignBase64);
}
//请求医信网标识id
private String getDepartId(Power_User user) {
// 创建OkHttpClient实例
OkHttpClient client = new OkHttpClient();
// 定义请求的URL
String url = synDepartUrl;
String dataId = "";
// 创建请求体
String json = "{"
+ "\"head\": {"
+ "\"clientId\": \"" + clientId + "\","
+ "\"clientSecret\": \"" + clientSecret + "\","
+ "},"
+ "\"body\": {"
+ "\"thirdDepartId\": \"3040000\","
+ "\"departName\": \"病案室\","
+ "\"departPhone\": \"" + user.getUserEmail() + "\","
+ "\"departPerson\": \"" + user.getUserPosition() + "\","
+ "\"clientOrgCode\": \"BAS\","
+ "\"clientOrgType\": \"ORG\""
+ "}"
+ "}";
// 创建RequestBody
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
// 创建Request
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
try {
// 执行请求
Response response = client.newCall(request).execute();
// 检查响应状态码
if (response.isSuccessful()) {
// 获取响应体
String responseData = response.body().string();
// 解析JSON响应
JSONObject jsonResponse = new JSONObject(responseData);
// 获取返回的参数
dataId = jsonResponse.getJSONObject("data").getString("departId");
String message = jsonResponse.getString("message");
String status = jsonResponse.getString("status");
boolean successful = jsonResponse.getBoolean("successful");
// 输出解析结果
System.out.println("DepartId: " + dataId);
System.out.println("Message: " + message);
System.out.println("Status: " + status);
System.out.println("Successful: " + successful);
} else {
System.out.println("请求失败,状态码:" + response.code());
}
} catch (IOException e) {
} catch (Exception e) {
e.printStackTrace();
}
return dataId;
}
/**
@ -182,96 +363,4 @@ public class CaSignServiceImpl {
}
}
/**
* @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
*
* z:docus/caTemp/masterId/
*/
private boolean caSign(String newpdfPath, Archive_Detail_ca_reqParam caReqParam) throws Exception {
//定义是否成功
boolean flag = false;
PdfReader pdfReader = null;
try {
pdfReader = new PdfReader(newpdfPath);
} catch (Exception e) {
e.printStackTrace();
}
if (pdfReader != null) {
try {
anySignClientTool = new AnySignClientTool(caServerIp, caServerPort);
File file = new File(newpdfPath);
byte[] pdfBty = ClientUtil.readFileToByteArray(file);
//pdf验章
ChannelMessage messageExist = anySignClientTool.pdfVerify(pdfBty);
if (!StringUtils.isEmpty(messageExist.getStatusInfo()) && "pdf文档未签章".equals(messageExist.getStatusInfo())) {
RectangleBean bean = new RectangleBean();
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;
//获取pdf的高宽
Rectangle pageSize = pdfReader.getPageSizeWithRotation(i + 1);
// 获取页面的宽度和高度
float width = pageSize.getWidth();
float height = pageSize.getHeight();
// System.out.println("pdf尺寸width:" + width + "height:" + height);
bean.setLeft(Float.valueOf(width - caReqParam.getSignLeft()));
bean.setTop(Float.valueOf(caReqParam.getSignTop()));
bean.setRight(Float.valueOf(width));
bean.setBottom(Float.valueOf(caReqParam.getSignBottom()));
// System.out.println("左:" + bean.getLeft() + ",上:" + bean.getTop() + ",右:" + bean.getRight() + ",下:" + bean.getBottom());
message = anySignClientTool.pdfSignByParam(pdfBty, signNo, bean);
if ("200".equals(message.getStatusCode())) {//成功
ClientUtil.writeByteArrayToFile(new File(newpdfPath), message.getBody());
// System.out.println("签章成功");
} else {
String statusCode = message.getStatusCode();
String statusInfo = message.getStatusInfo();
log.error("statusCode=" + statusCode + ";statusInfo=" + statusInfo);
}
}
}
flag = true;
} catch (Exception e) {
e.printStackTrace();
}
} else {
log.error("进行签章pdf" + newpdfPath + "不存在或损坏");
}
System.out.println("完成");
return flag;
}
}

@ -0,0 +1,17 @@
package com.emr.vo;
import lombok.Data;
/**
* @ClassName CaDepartId
* @Description
* @Author linjj
* @Date 2025/2/5 11:38
* @Version 1.0
*/
@Data
public class CaDepartIdVo {
private String dataName;
private String dataId;
}

@ -14,8 +14,15 @@ signNo=3012E4D7D234DC58
#caServerPort=18002
###\u7B7E\u7AE0\u7F16\u53F7
#signNo=59BC18FE5DEB0F15
#\u8bf7\u6c42\u533b\u9662\u79d1\u5ba4\u5728\u533b\u7f51\u4fe1\u6807\u8bc6id
synDepartUrl=https://test.51trust.com/gateway/pdf/synDepart
signUrl=https://test.51trust.com/gateway/pdf/sign
#\u7b2c\u4e09\u65b9\u8d26\u53f7\u6807\u8bc6
clientId=2017070411003376
#\u7b2c\u4e09\u65b9\u8d26\u53f7\u79d8\u94a5
clientSecret=2017070411003360
#\u5907\u4EFD\u539F\u6587\u4EF6\u8DEF\u5F84
caCopyPath=d:docus/caCopy
newPdfPath=z:/caPdfs
newPdfPath=d:\\caPdfs

@ -0,0 +1,27 @@
<?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.CaDepartIdMapper">
<insert id="addDepartId">
insert into CaDepartId
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="dataName != null">
dataName,
</if>
<if test="dataId != null">
dataId,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="dataName != null">
#{dataName,jdbcType=NVARCHAR},
</if>
<if test="dataId != null">
#{dataId,jdbcType=NVARCHAR},
</if>
</trim>
</insert>
<select id="getDepartId" resultType="com.emr.vo.CaDepartIdVo">
select * from CaDepartId where dataName=#{dataName}
</select>
</mapper>

@ -6,6 +6,9 @@
insert into ca_signature(master_id,signature_static)
values(#{masterId},#{signatureStatic})
</insert>
<delete id="delCaMasterId">
delete FROM ca_signature where master_id=#{masterId}
</delete>
<select id="getCaMasterId" resultType="java.lang.Integer">
select count(*) num from ca_signature where master_id=#{masterId} and signature_static=#{signatureStatic}
</select>

Loading…
Cancel
Save