diff --git a/pom.xml b/pom.xml
index 718cee11..75cc50d9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -120,6 +120,16 @@
commons-collections4
4.4
+
+ com.squareup.okhttp3
+ okhttp
+ 4.9.0
+
+
+ org.json
+ json
+ 20210307
+
org.apache.httpcomponents
diff --git a/src/main/java/com/emr/controller/TestController.java b/src/main/java/com/emr/controller/TestController.java
index fa5004de..7a9a0a40 100644
--- a/src/main/java/com/emr/controller/TestController.java
+++ b/src/main/java/com/emr/controller/TestController.java
@@ -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 "完成";
}
diff --git a/src/main/java/com/emr/controller/lastVerifyController.java b/src/main/java/com/emr/controller/lastVerifyController.java
index 3a0efd82..681887bc 100644
--- a/src/main/java/com/emr/controller/lastVerifyController.java
+++ b/src/main/java/com/emr/controller/lastVerifyController.java
@@ -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 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());
diff --git a/src/main/java/com/emr/dao/CaDepartIdMapper.java b/src/main/java/com/emr/dao/CaDepartIdMapper.java
new file mode 100644
index 00000000..e1f5e2f9
--- /dev/null
+++ b/src/main/java/com/emr/dao/CaDepartIdMapper.java
@@ -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);
+}
diff --git a/src/main/java/com/emr/dao/CaSignatureMapper.java b/src/main/java/com/emr/dao/CaSignatureMapper.java
index 2bb46ae6..4f179fb1 100644
--- a/src/main/java/com/emr/dao/CaSignatureMapper.java
+++ b/src/main/java/com/emr/dao/CaSignatureMapper.java
@@ -15,4 +15,6 @@ public interface CaSignatureMapper {
int getCaMasterId(@Param("masterId") String masterId,@Param("signatureStatic") int signatureStatic);
+ int delCaMasterId(@Param("masterId") String masterId);
+
}
diff --git a/src/main/java/com/emr/entity/Power_User.java b/src/main/java/com/emr/entity/Power_User.java
index f7b6f983..08db2bcc 100644
--- a/src/main/java/com/emr/entity/Power_User.java
+++ b/src/main/java/com/emr/entity/Power_User.java
@@ -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() {
diff --git a/src/main/java/com/emr/service/ipml/CaSignServiceImpl.java b/src/main/java/com/emr/service/ipml/CaSignServiceImpl.java
index 9a1f9aec..53415fde 100644
--- a/src/main/java/com/emr/service/ipml/CaSignServiceImpl.java
+++ b/src/main/java/com/emr/service/ipml/CaSignServiceImpl.java
@@ -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: caSignByMasterId方法是根据masterId查询所有文件进行ca签章
@@ -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 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 list=new ArrayList<>();
+ List list = new ArrayList<>();
//签章后保存目录
String newPath = newPdfPath + File.separator + masterId;
//没有目录创建目录
@@ -94,25 +128,29 @@ public class CaSignServiceImpl {
List 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: 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
- *
- * 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;
- }
}
diff --git a/src/main/java/com/emr/vo/CaDepartIdVo.java b/src/main/java/com/emr/vo/CaDepartIdVo.java
new file mode 100644
index 00000000..bf1f6f94
--- /dev/null
+++ b/src/main/java/com/emr/vo/CaDepartIdVo.java
@@ -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;
+}
diff --git a/src/main/resources/config/caSign.properties b/src/main/resources/config/caSign.properties
index b01358b1..7ab05745 100644
--- a/src/main/resources/config/caSign.properties
+++ b/src/main/resources/config/caSign.properties
@@ -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
\ No newline at end of file
+newPdfPath=d:\\caPdfs
\ No newline at end of file
diff --git a/src/main/resources/mapper/CaDepartIdMapper.xml b/src/main/resources/mapper/CaDepartIdMapper.xml
new file mode 100644
index 00000000..4c06333e
--- /dev/null
+++ b/src/main/resources/mapper/CaDepartIdMapper.xml
@@ -0,0 +1,27 @@
+
+
+
+
+ insert into CaDepartId
+
+
+ dataName,
+
+
+ dataId,
+
+
+
+
+ #{dataName,jdbcType=NVARCHAR},
+
+
+ #{dataId,jdbcType=NVARCHAR},
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/caSignatureMapper.xml b/src/main/resources/mapper/caSignatureMapper.xml
index dda5b27c..76d55682 100644
--- a/src/main/resources/mapper/caSignatureMapper.xml
+++ b/src/main/resources/mapper/caSignatureMapper.xml
@@ -6,6 +6,9 @@
insert into ca_signature(master_id,signature_static)
values(#{masterId},#{signatureStatic})
+
+ delete FROM ca_signature where master_id=#{masterId}
+