Sfoglia il codice sorgente

电签检测识别优化和兼容性优化

lvy 2 settimane fa
parent
commit
582d4405f2

+ 6 - 3
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ChekSignData.java

@@ -14,9 +14,11 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * 清表基础数据表 控制器
@@ -55,16 +57,17 @@ public class ChekSignData {
             for (ScrSignInfoVO dataInfo : query) {
                 if (executor.getQueue().size()<=30 ) {
                     Long nodeId = dataInfo.getId();
-                    Boolean aBoolean = RedisTemplate.hasKey("chek-" + nodeId);
+                    // 兼容以前 u_information_query 与 u_task 一对多的关系
+                    Boolean aBoolean = RedisTemplate.hasKey("chek-" + nodeId + dataInfo.getProcessInstanceId());
 
                     if (!aBoolean) {
-                        RedisTemplate.opsForValue().set("chek-" + nodeId, "1",3600, TimeUnit.SECONDS);
+                        RedisTemplate.opsForValue().set("chek-" + nodeId + dataInfo.getProcessInstanceId(), "1",3600, TimeUnit.SECONDS);
                         CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
                             try {
                                 /*===============执行批量任务===============*/
                                 scrDataService.sctTaskBatch(dataInfo);
                             } catch (Exception e) {
-                                RedisTemplate.delete("chek-" + nodeId);
+                                RedisTemplate.delete("chek-" + nodeId + dataInfo.getProcessInstanceId());
                                 e.printStackTrace();
                             }
                         }, executor);

+ 4 - 4
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVDataServiceImpl.java

@@ -590,7 +590,7 @@ public class EVDataServiceImpl implements EVDataService {
     public void addSignatureDataByAXQZ(List<SealStrategyVO> strategyListByAXQ,String formDataId,String markType) {
         System.out.println("www");
         String deleteSql = "delete from m_sign_data where query_id = '" + formDataId + "' and user_id in( ";
-        String insertsql = "INSERT INTO m_sign_data (id, query_id, text_id, user_id, sign_time, type, img_url, sign_type) VALUES (?, ?, ?, ?, SYSDATE(), ?, ?, ?)";
+        String insertsql = "INSERT INTO m_sign_data (id, query_id, text_id, user_id, sign_time, type, img_url, sign_type, pyzbx, pyzby) VALUES (?, ?, ?, ?, SYSDATE(), ?, ?, ?, ?, ?)";
         List<Object[]> batchArgs = new ArrayList<>();
         for (SealStrategyVO sealStrategyVO : strategyListByAXQ) {
             long newPkId = SnowFlakeUtil.getId(); //主键Id
@@ -598,7 +598,7 @@ public class EVDataServiceImpl implements EVDataService {
             if(sealStrategyVO.isCompanySeal()){
                 type = "2";
             }
-            batchArgs.add(new Object[]{newPkId, formDataId, sealStrategyVO.getKeyword(), sealStrategyVO.getUserId(), type, sealStrategyVO.getImageUrl(), markType});
+            batchArgs.add(new Object[]{newPkId, formDataId, sealStrategyVO.getKeyword(), sealStrategyVO.getUserId(), type, sealStrategyVO.getImageUrl(), markType, sealStrategyVO.getOffSetX(), sealStrategyVO.getOffSetY()});
             deleteSql+= sealStrategyVO.getUserId() +",";
         }
         // 添加更多数据...
@@ -611,13 +611,13 @@ public class EVDataServiceImpl implements EVDataService {
     public void addSignatureDataByDFZX(List<Map<String, Object>> strategyListByAXQ,String formDataId,String markType) {
         System.out.println("www");
         String deleteSql = "delete from m_sign_data where query_id = '" + formDataId + "' and user_id in( ";
-        String insertsql = "INSERT INTO m_sign_data (id, query_id, text_id, user_id, sign_time, type, img_url, sign_type) VALUES (?, ?, ?, ?, SYSDATE(), ?, ?, ?)";
+        String insertsql = "INSERT INTO m_sign_data (id, query_id, text_id, user_id, sign_time, type, img_url, sign_type, pyzbx, pyzby) VALUES (?, ?, ?, ?, SYSDATE(), ?, ?, ?, ?, ?)";
         List<Object[]> batchArgs = new ArrayList<>();
         for (Map<String, Object> map : strategyListByAXQ) {
             long newPkId = SnowFlakeUtil.getId(); //主键Id
             String userId = map.get("userId")+"";
             String type = map.get("type")+"";
-            batchArgs.add(new Object[]{newPkId, formDataId, map.get("keyWord"), userId, type, map.get("sealId"), markType});
+            batchArgs.add(new Object[]{newPkId, formDataId, map.get("keyWord"), userId, type, map.get("sealId"), markType, map.get("pyzbx"), map.get("pyzby")});
             deleteSql+=userId +",";
          }
         // 添加更多数据...

+ 84 - 26
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/ScrDataServiceImpl.java

@@ -7,9 +7,7 @@ import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
 import org.springblade.business.vo.ScrSignInfoVO;
-import org.springblade.business.vo.TaskSignInfoVO;
 import org.springblade.common.utils.CommonUtil;
-import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
@@ -74,7 +72,7 @@ public class ScrDataServiceImpl implements ScrDataService {
             String sql2 = "UPDATE u_information_query set chek_status=3 where id='"+taskApp.getId()+"'";
             jdbcTemplate.execute(sql2);
 
-            RedisTemplate.delete("chek-" + taskApp.getId());
+            RedisTemplate.delete("chek-" + taskApp.getId() + taskApp.getProcessInstanceId());
             System.out.println(taskApp.getProcessInstanceId()+"-"+"总共:" );
             return;
         }
@@ -222,7 +220,7 @@ public class ScrDataServiceImpl implements ScrDataService {
             String sql2 = "UPDATE u_information_query set chek_status=3 where id='"+taskApp.getId()+"'";
             jdbcTemplate.execute(sql2);
         }
-        RedisTemplate.delete("chek-" + taskApp.getId());
+        RedisTemplate.delete("chek-" + taskApp.getId() + taskApp.getProcessInstanceId());
       //  System.out.println(taskApp.getProcessInstanceId()+"-"+"总共:" );
       //  System.out.println(taskApp.getId() +"-"+"总共:" + positions.size() + "-剩下-" + differentElements.size());
     }
@@ -417,14 +415,6 @@ public class ScrDataServiceImpl implements ScrDataService {
             Map<String, String> dataMap = pdfSignIds.getDataMap();
 
             Map<String, String> dataMap1 = checkSignByPdf(taskApp, pdfSignIds, pdfData);
-            if (dataMap1 != null && !dataMap1.isEmpty()) {
-                dataMap = dataMap1;
-            } else {
-                String sql2 = "UPDATE u_information_query set chek_status=2 where id='" + taskApp.getId() + "'";
-                jdbcTemplate.execute(sql2);
-                RedisTemplate.delete("chek-" + taskApp.getId());
-                return;
-            }
 
             List<String> sucessUser = new ArrayList<>();
             List<String> sucessCompan = new ArrayList<>();
@@ -440,10 +430,10 @@ public class ScrDataServiceImpl implements ScrDataService {
 
             if (strategyListByDFZX == null || strategyListByDFZX.size() == 0) {
 
-                String sql2 = "UPDATE u_information_query set chek_status=3 where id='" + taskApp.getId() + "'";
+                String sql2 = "UPDATE u_information_query set chek_status=3 where chek_status != 2 and id='" + taskApp.getId() + "'";
                 jdbcTemplate.execute(sql2);
 
-                RedisTemplate.delete("chek-" + taskApp.getId());
+                RedisTemplate.delete("chek-" + taskApp.getId() + taskApp.getProcessInstanceId());
                 System.out.println(taskApp.getProcessInstanceId() + "-" + "总共:");
                 return;
             }
@@ -586,8 +576,8 @@ public class ScrDataServiceImpl implements ScrDataService {
                                 if (pkeyid.length() < 19) {
                                     keyw = keyw - (float) (10 - pkeyid.length() / 2.0);
                                 }
-//                                System.out.println("page = " + (i + 1) + ", type = " + type + ", keyid = " + pkeyid + ", imgX : " + imgX + ", keyw : " + keyw + ", imgY : "
-//                                        + imgY + ", keyh : " + keyh + ", keyword =" + keyData.replace("\r", "\\r") + ", remarkType = " + taskApp.getRemarkType());
+                                System.out.println("page = " + (i + 1) + ", type = " + type + ", keyid = " + pkeyid + ", imgX : " + imgX + ", keyw : " + keyw + ", imgY : "
+                                        + imgY + ", keyh : " + keyh + ", keyword =" + keyData.replace("\r", "\\r") + ", remarkType = " + taskApp.getRemarkType());
                                 if (Math.abs(imgX - keyw) <= threshold && Math.abs(imgY - keyh) <= threshold) {
                                     if (type.equals("1")) { //个人
                                         sucessUser.add(pkeyid);
@@ -633,13 +623,47 @@ public class ScrDataServiceImpl implements ScrDataService {
                     for(String mapkey:dataMap.keySet()){
                         String mapval = dataMap.get(mapkey);
                         if(mapval != null && (mapval.equals(company) || mapval.equals(company+"\r"))){
-//                        if(mapval != null && mapval.contains(company)){
                             dataUserMap.remove(mapkey) ;
                         }
                     }
                 }
                 if(!dataUserMap.isEmpty()){
-                    isSign = false ;
+                    Map<String, float[]> allKeyPositions = getKeyPositions(pdfSignIds, pdfData);
+                    Set<String> removeKeys = new HashSet<>();
+                    dataUserMap.forEach((id, value) -> {
+                        float[] floats = allKeyPositions.get(value);
+                        if (floats == null || floats.length < 6) {
+                            return;
+                        }
+                        dataMap.forEach((key, value1) -> {
+                            float[] floats1 = allKeyPositions.get(value);
+                            if (floats1.length < 2) {
+                                return;
+                            }
+                            if (floats[0] != floats1[0]) {
+                                return;
+                            }
+                            PDPage page = document.getPage((int) floats[0] - 1);
+                            float pageHeight = page.getMediaBox().getHeight();
+                            float pageWidth = page.getMediaBox().getWidth();
+                            if (Math.abs(floats[5] * pageHeight - floats1[3] * pageHeight) < 1 && Math.abs(floats[4] * pageWidth - floats1[1] * pageWidth) < 1 && !dataUserMap.containsKey(key)) {
+                                removeKeys.add(id);
+                            }
+                        });
+                    });
+                    if (!removeKeys.isEmpty()) {
+                        dataUserMap.entrySet().removeIf(entry -> removeKeys.contains(entry.getKey()));
+                    }
+                    if (!dataUserMap.isEmpty()) {
+                        if (dataMap1 == null) {
+                            dataUserMap.entrySet().removeIf(item -> true);
+                        } else {
+                            dataUserMap.entrySet().removeIf(entry -> !dataMap1.containsKey(entry.getKey()));
+                        }
+                    }
+                    if (!dataUserMap.isEmpty()) {
+                        isSign = false ;
+                    }
                 }
                 System.out.println(taskApp.getId() +"-"+"个人总共:" + sucessUser.size() + "-剩下-" +dataUserMap.keySet().size());
             }
@@ -647,11 +671,34 @@ public class ScrDataServiceImpl implements ScrDataService {
                 String sql2 = "UPDATE u_information_query set chek_status=2 where id='" + taskApp.getId() + "'";
                 jdbcTemplate.execute(sql2);
             } else {
-                String sql2 = "UPDATE u_information_query set chek_status=3 where id='" + taskApp.getId() + "'";
+                String sql2 = "UPDATE u_information_query set chek_status=3 where chek_status != 2 and id='" + taskApp.getId() + "'";
                 jdbcTemplate.execute(sql2);
             }
-            RedisTemplate.delete("chek-" + taskApp.getId());
+            RedisTemplate.delete("chek-" + taskApp.getId() + taskApp.getProcessInstanceId());
+        }
+    }
+
+    /**
+     * 获取所有电签关键字的位置
+     */
+    public Map<String, float[]> getKeyPositions(SignKeyVO pdfSignIds,byte[] pdfData) throws Exception {
+        if (pdfSignIds == null) {
+            return  null;
+        }
+        Map<String, String> dataMap = pdfSignIds.getDataMap();
+        Collection<String> keys = dataMap.values();
+        if (keys.isEmpty()) {
+            return null;
+        }
+        List<PDFIndexInfo> pdfIndexInfo = PdfAddimgUtil.findKeywordPostions(pdfData,  String.join(",", keys));
+        if (pdfIndexInfo.isEmpty()) {
+            return  null;
         }
+        Map<String, float[]> map = new HashMap<>();
+        for (PDFIndexInfo info : pdfIndexInfo) {
+            map.put(info.getPkeyid(), info.getDataInfo());
+        }
+        return map;
     }
 
     public Map<String, String> checkSignByPdf(ScrSignInfoVO taskApp,SignKeyVO pdfSignIds,byte[] pdfData) throws Exception {
@@ -689,9 +736,23 @@ public class ScrDataServiceImpl implements ScrDataService {
                                 float pyzbx = 0.0f;
                                 float pyzby = 0.0f;
                                 if (taskApp.getRemarkType().equals("3")) { //东方中讯
-
+                                    if (imgH >= 100) {
+                                        // 签章
+                                        keyw = keyw + pyzbx - 21;
+                                        keyh = keyh + pyzby - 16;
+                                    } else {
+                                        keyw = keyw + pyzbx + 10;
+                                        keyh = keyh + pyzby;
+                                    }
                                 } else if (taskApp.getRemarkType().equals("2")) { //东方中讯
-
+                                    if (imgH >= 100) {
+                                        // 签章
+                                        keyw = keyw + pyzbx - 21;
+                                        keyh = keyh + pyzby - 15;
+                                    } else {
+                                        keyw = keyw + pyzbx + 10;
+                                        keyh = keyh + pyzby;
+                                    }
                                 } else {
                                     keyw = keyw + pyzbx + 5;
                                     keyh = keyh + pyzby;
@@ -719,11 +780,8 @@ public class ScrDataServiceImpl implements ScrDataService {
                         }
                     }
                 }
-                if (!dataUserMap.isEmpty()) {
-                    return dataUserMap;
-                }
             }
+            return dataUserMap;
         }
-        return null;
     }
 }

+ 10 - 8
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/PdfAddimgUtil.java

@@ -265,6 +265,16 @@ public class PdfAddimgUtil {
                 }
 
                 float[] postions = charPositions.get(positionIndex);
+                try {
+                    // 获取text的结束位置
+                    int endPos = positionIndex + text.length();
+                    if (endPos < content.length()) {
+                        float[] floats = charPositions.get(endPos);
+                        postions = new float[]{postions[0], postions[1], postions[2], floats[0], floats[1], floats[2]};
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
                 data.setDataInfo(postions);
                 data.setPkeyid(text);
                 result.add(data);
@@ -406,16 +416,8 @@ public class PdfAddimgUtil {
             String text = stripper.getText(document);
             String[] lines = text.split("[ \\n]+");
 
-            Pattern pattern = Pattern.compile("(\\d{4}[年-]\\d{2}[月-]\\d{2}日?)");
-
             for(int k=0;k<lines.length;k++){
                 String textStr = lines[k];
-                if (!textStr.contains("\r") && k + 1 < lines.length) {
-                    if (textStr.matches("[0-9* ✹|]{8,}") && lines[k + 1].matches("[0-9* ✹|]{8,}") && text.contains(textStr + " " + lines[k + 1])) {
-                        textStr = textStr + "*" + lines[k + 1];
-                        k++;
-                    }
-                }
                 int index = textStr.indexOf("*");
                 if(index>=0 && textStr.lastIndexOf("*")+1 < textStr.length() && textStr.charAt(index+1) != '✹'){
                     textStr = textStr.substring(textStr.lastIndexOf("*")+1,textStr.length());