Browse Source

数据修改

zhuwei 7 months ago
parent
commit
2760cce45b
19 changed files with 489 additions and 36 deletions
  1. 5 3
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java
  2. 36 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ScrSignInfoVO.java
  3. 0 2
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenForm.java
  4. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  5. 7 4
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/EntrustInfoMapper.xml
  6. 1 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVController.java
  7. 0 2
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVisaController.java
  8. 82 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ScrController.java
  9. 12 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/ScrDataService.java
  10. 171 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/ScrDataServiceImpl.java
  11. 1 3
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/PDFUtils.java
  12. 9 2
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/PdfAddimgUtil.java
  13. 128 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/PdfSignatureInfo.java
  14. 1 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/SignFtpUtil.java
  15. 19 11
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  16. 11 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorInit.java
  17. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaDaoImpl.java
  18. 2 2
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java
  19. 1 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.xml

+ 5 - 3
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java

@@ -19,6 +19,7 @@ package org.springblade.resource.builder.oss;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import org.springblade.common.constant.CommonConstant;
 import org.springblade.core.cache.utils.CacheUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.oss.enums.OssEnum;
@@ -33,6 +34,7 @@ import org.springblade.core.tool.utils.WebUtil;
 import org.springblade.resource.builder.ossre.OssTemplateRe;
 import org.springblade.resource.entity.Oss;
 import org.springblade.resource.service.IOssService;
+import org.springblade.system.cache.ParamCache;
 
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -84,9 +86,9 @@ public class OssBuilder {
     public OssTemplateRe template(String code) {
         String tenantId = AuthUtil.getTenantId();
         Oss oss = getOss(tenantId, code);
-        oss.setEndpoint("http://183.247.216.148:9000/");
-       // oss.setEndpoint("https://oss-cn-shenzhen.aliyuncs.com/");
-        System.out.println("3333333"+oss.getEndpoint());
+     //   oss.setEndpoint("http://183.247.216.148:9000/");
+        oss.setEndpoint("https://oss-cn-shenzhen.aliyuncs.com/");
+
         Oss ossCached = ossPool.get(tenantId);
         OssTemplateRe template = templatePool.get(tenantId);
         // 若为空或者不一致,则重新加载

+ 36 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ScrSignInfoVO.java

@@ -0,0 +1,36 @@
+package org.springblade.business.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+@Data
+public class ScrSignInfoVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "主键信息")
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty("待审批列表中对应的taskId字段值")
+    private String eVisaPdfUrl;
+
+    @ApiModelProperty("合同段Id")
+    private String contractId;
+
+    @ApiModelProperty("项目ID")
+    private String projectId;
+
+    @ApiModelProperty("流程节点Id")
+    private String processInstanceId;
+
+}

+ 0 - 2
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenForm.java

@@ -130,6 +130,4 @@ public class ChangeTokenForm extends BaseEntity {
     @ApiModelProperty(value = "下达日期")
     private LocalDateTime commandDate;
 
-
-
 }

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java

@@ -1237,7 +1237,7 @@ public class TaskController extends BladeController {
         int size = dto.getSize();
         //封装入参SQL
         List<Object> params = new ArrayList<>();
-        StringBuilder sqlString = new StringBuilder("SELECT * FROM u_task WHERE 1=1 AND is_deleted = 0 AND approval_type not in(4,5)");
+        StringBuilder sqlString = new StringBuilder("SELECT * FROM u_task WHERE 1=1 AND is_deleted = 0 AND approval_type in(1,2,3,4,8)");
         if (ObjectUtil.isNotEmpty(dto.getTypeValue())) {
             sqlString.append(" AND type = ?");
             params.add(dto.getTypeValue());

+ 7 - 4
blade-service/blade-business/src/main/java/org/springblade/business/mapper/EntrustInfoMapper.xml

@@ -134,18 +134,21 @@
 
 
     <select id="selectDataInfoPage" resultType="org.springblade.business.vo.LoadDataInfoVO">
-        select * from u_view_gather_data_info a where 1=1
-
+        SELECT  * FROM (
+            select * from u_view_gather_data_info
+            union all
+        select * from u_view_gather_data_info2
+        ) a where 1=1
         <if test="param2.testTypeName != null and param2.testTypeName != ''">
             AND a.testTypeName like CONCAT(CONCAT('%', #{param2.testTypeName}), '%')
         </if>
 
        <if test="param2.startTime != null and param2.startTime != '' ">
-            and a.playTime &gt;= #{param2.startTime}
+            and a.testDate &gt;= #{param2.startTime}
         </if>
 
         <if test="param2.endTime != null and param2.endTime != '' ">
-            and a.playTime &lt;= #{param2.endTime}
+            and a.testDate &lt;= #{param2.endTime}
         </if>
         order by testDate desc;
 

+ 1 - 1
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVController.java

@@ -56,7 +56,7 @@ public class EVController {
     @Resource(name = "taskExecutor1")
     private ThreadPoolExecutor executor;
 
-     @Scheduled(cron = "0/10 * * * * ?")
+    //@Scheduled(cron = "0/10 * * * * ?")
     public void SignInfo() {
         //执行代码
         log.info("扫描开始");

+ 0 - 2
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVisaController.java

@@ -9,14 +9,12 @@ import org.apache.commons.lang.StringUtils;
 import org.springblade.business.entity.Task;
 import org.springblade.business.feign.TaskClient;
 import org.springblade.business.vo.TaskApprovalVO;
-import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SystemUtils;
 import org.springblade.evisa.service.EVisaService;
 import org.springblade.evisa.vo.EVisaTaskApprovalVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;

+ 82 - 0
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ScrController.java

@@ -0,0 +1,82 @@
+package org.springblade.evisa.controller;
+
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.business.vo.ScrSignInfoVO;
+import org.springblade.business.vo.TaskSignInfoVO;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.evisa.service.EVDataService;
+import org.springblade.evisa.service.ScrDataService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.scheduling.annotation.Scheduled;
+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;
+
+/**
+ * 清表基础数据表 控制器
+ *
+ * @author BladeX
+ * @since 2022-05-18
+ */
+@RestController
+@AllArgsConstructor
+@Api(value = "电签类", tags = "电签类接口")
+@Slf4j
+public class ScrController {
+
+    @Autowired
+    StringRedisTemplate RedisTemplate;
+    // jdbc
+    private final JdbcTemplate jdbcTemplate;
+    //电签服务类
+    private final ScrDataService scrDataService;
+    // 线程池
+    @Resource(name = "taskExecutor1")
+    private ThreadPoolExecutor executor;
+
+    @Scheduled(cron = "0/10 * * * * ?")
+    public void SignInfo() {
+        //执行代码
+
+        // 质检SQL
+        //String sql = "SELECT a.id as ,a.e_visa_pdf_url,b.process_instance_id,a.contract_id,a.project_id from u_information_query a ,u_task b  where a.id=1848624592908722177 and a.`status` in(1,2) and a.is_deleted=0 and a.e_visa_pdf_url is not null  and b.form_data_id = a.id and b.`status` in(1,2) ";
+        String sql = "SELECT a.id ,a.e_visa_pdf_url,b.process_instance_id,a.contract_id,a.project_id  from u_information_query a ,u_task b  where a.id=1848624592908722177 and a.`status` in(1,2) and a.is_deleted=0 and a.e_visa_pdf_url is not null  and b.form_data_id = a.id and b.`status` in(1,2) ";
+
+        List<ScrSignInfoVO> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ScrSignInfoVO.class));
+        if (query != null && query.size() >= 1 ) {
+            for (ScrSignInfoVO dataInfo : query) {
+                if (executor.getQueue().size()<=6 ) {
+                    Long nodeId = dataInfo.getId();
+                    Boolean aBoolean = RedisTemplate.hasKey("sign-" + nodeId);
+
+                    if (!aBoolean) {
+                        RedisTemplate.opsForValue().set("sign-" + nodeId, "1",1800, TimeUnit.SECONDS);
+                        CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
+                            try {
+                                /*===============执行批量任务===============*/
+                                scrDataService.sctTaskBatch(dataInfo);
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            }
+                        }, executor);
+                    }
+                }
+            }
+        }
+        System.out.println("队列数量" + executor.getQueue().size());
+        System.out.println("活跃数量" + executor.getActiveCount());
+        System.out.println("总共数量" + executor.getTaskCount());
+        System.out.println("完成数量" + executor.getCompletedTaskCount());
+    }
+}

+ 12 - 0
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/ScrDataService.java

@@ -0,0 +1,12 @@
+package org.springblade.evisa.service;
+
+import org.springblade.business.vo.ScrSignInfoVO;
+import org.springblade.business.vo.TaskSignInfoVO;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+public interface ScrDataService {
+
+   void sctTaskBatch(ScrSignInfoVO taskApp) throws IOException, Exception;
+}

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

@@ -0,0 +1,171 @@
+package org.springblade.evisa.service.impl;
+
+import lombok.AllArgsConstructor;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+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.common.utils.CommonUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.evisa.service.ScrDataService;
+import org.springblade.evisa.utils.PdfAddimgUtil;
+import org.springblade.manager.vo.PDFIndexInfo;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+import java.io.*;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
+public class ScrDataServiceImpl implements ScrDataService {
+
+    private final JdbcTemplate jdbcTemplate;
+
+    // 主流程
+    @Override
+    public void sctTaskBatch(ScrSignInfoVO taskApp) throws Exception {
+        // 电签检查
+
+
+
+
+    }
+
+    /**
+     * 电签检查
+     */
+    public void sctTaskBatch2(ScrSignInfoVO taskApp) throws Exception {
+        int threshold = 5;
+
+        String fileUrl = CommonUtil.replaceOssUrl(taskApp.getEVisaPdfUrl());
+        String pdfUrl = taskApp.getEVisaPdfUrl();
+        InputStream inputStream = CommonUtil.getOSSInputStream(fileUrl);
+        InputStream inputStream2 = CommonUtil.getOSSInputStream(fileUrl);
+        //转换
+        byte[] pdfData = CommonUtil.InputStreamToBytes(inputStream);
+
+        PDDocument document = PDDocument.load(inputStream2);
+        List<String> positions = PdfAddimgUtil.getPdfSignIds(pdfUrl);
+
+        List<String> sucess = new ArrayList<>();
+        String ids = String.join(",", positions);
+        List<Map<String, Object>> strategyListByDFZX = getStrategyListByDFZX(taskApp,ids);
+
+        positions = strategyListByDFZX.stream().map(map -> map.get("keyWord").toString()).collect(Collectors.toList());
+        String keyWord = String.join(",", positions);
+        List<PDFIndexInfo> pdfIndexInfo = PdfAddimgUtil.findKeywordPostions(pdfData, keyWord);
+
+        //根据id分组
+        List<Map<String, Object>> list2 = strategyListByDFZX.stream().collect(
+                Collectors.collectingAndThen(
+                        Collectors.toCollection(
+                                () ->new TreeSet<>(Comparator.comparing(m->m.get("keyWord").toString()))
+                        ),ArrayList::new
+                )
+        );
+
+        Map<String, List<Map<String, Object>>> newMap = list2.stream().collect(Collectors.groupingBy(b -> Func.toStr(b.get("keyWord"))));
+
+        Map<String, List<PDFIndexInfo>> groupBy = pdfIndexInfo.stream().collect(Collectors.groupingBy(da -> Func.toStr(da.getDataInfo()[0])));
+
+        for (int i = 0; i < document.getPages().getCount(); i++) {
+            PDPage page = document.getPage(i);
+            List<PDAnnotation> annotations = page.getAnnotations();
+            for (PDAnnotation annotation : annotations) {
+                if (annotation instanceof PDAnnotationWidget) {
+                    PDRectangle rect = annotation.getRectangle();
+
+                    float imgW = rect.getWidth();
+                    float imgH = rect.getHeight();
+                    float imgX = rect.getLowerLeftX() + imgW / 2;
+                    float imgY = rect.getLowerLeftY() + imgH / 2;
+                    List<PDFIndexInfo> pdfIndexInfos = groupBy.get((i + 1) + ".0");
+
+                    for (PDFIndexInfo pdfInfo : pdfIndexInfos) {
+                        String pkeyid = pdfInfo.getPkeyid();
+
+                        float[] dataInfo = pdfInfo.getDataInfo();
+
+                        float keyX = dataInfo[1];
+                        float keyY = dataInfo[2];
+
+                        float pageHeight = page.getMediaBox().getHeight();
+                        float pageWidth = page.getMediaBox().getWidth();
+
+                        float keyw = keyX * pageWidth;
+                        float keyh = pageHeight - keyY * pageHeight;
+
+                        List<Map<String, Object>> mapList = newMap.get(pkeyid);
+                        if(mapList!=null && mapList.size()>=0){
+                            Map<String, Object> map = mapList.get(0);
+                            Float pyzbx = Func.toFloat(map.get("pyzbx"));
+                            Float pyzby = Func.toFloat(map.get("pyzby"));
+                            keyw = keyw + pyzbx;
+                            keyh = keyh + pyzby;
+                        }
+
+                        if (Math.abs(imgX - keyw) <= threshold && Math.abs(imgY - keyh) <= threshold) {
+                            sucess.add(pkeyid);
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+
+        Set<String> differentElements = new HashSet<>(positions);
+        // 使用retainAll方法来移除两个集合中相同的元素,留下不同的元素
+        differentElements.removeAll(sucess);
+
+        System.out.println("总共:"+positions.size()+"-剩下-"+differentElements.size());
+    }
+
+
+    // 添加电签策略 -- 东方中讯
+    public List<Map<String, Object>> getStrategyListByDFZX(ScrSignInfoVO taskApp,String ids) {
+        List<Map<String, Object>> maps = new ArrayList<>();
+        List<Map<String, Object>> maps2 = new ArrayList<>();
+        String sql = "select * from u_task_parallel where process_instance_id = '" + taskApp.getProcessInstanceId() + "' and initiative=2 and status=2";
+        List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql);
+        if(mapList!=null && mapList.size()>0){
+            for(Map<String, Object> task : mapList){
+                String taskUserId = Func.toStr(task.get("task_user"));
+                String sqlinfo = " SELECT * from ( SELECT a.id as keyWord,a.project_id,a.pyzbx ,a.pyzby,(SELECT acc_code from blade_user where id='" + taskUserId + "' and is_deleted=0  ) as sealId from m_textdict_info a where  a.type =2 and a.id in (" + ids + ")  and sig_role_id in (SELECT DISTINCT c.role_id from m_project_assignment_user c  where c.contract_id=" + taskApp.getContractId() + " and user_id=" + taskUserId + " and c.is_deleted=0 ) ) x where x.sealId is not null ";
+                List<Map<String, Object>> maps3 = jdbcTemplate.queryForList(sqlinfo);
+                maps2.addAll(maps3);
+            }
+        }
+        // 添加章
+        String sqlinfo = "SELECT a.id as keyWord,a.pyzbx,a.pyzby,b.certificate_number as sealId from m_textdict_info a ,m_sign_pfx_file b where a.sig_role_id = b.pfx_type and b.project_contract_role like '%" + taskApp.getContractId() + "%' and a.is_deleted=0 and b.is_deleted=0 and a.type=6 and a.id in(" + ids + ")";
+        List<Map<String, Object>> maps3 = jdbcTemplate.queryForList(sqlinfo);
+        if(mapList!=null && mapList.size()>0){
+            maps2.addAll(maps3);
+        }
+
+        Map<String, List<Map<String, Object>>> peopleByAge = maps2.stream()
+                .collect(Collectors.groupingBy(hada -> (Func.toStr(hada.get("keyWord")))));
+        for (String keyId : peopleByAge.keySet()) {
+            int exId = 0;
+            List<Map<String, Object>> keyList = peopleByAge.get(keyId);
+            if (keyList != null && keyList.size() == 1) {
+                maps.addAll(keyList);
+                exId = 1;
+            } else if (keyList != null && keyList.size() >= 2) {
+                for (Map<String, Object> datax : keyList) {
+                    if ((datax.get("project_id") + "").equals(taskApp.getProjectId())) {
+                        maps.add(datax);
+                        exId = 1;
+                    }
+                }
+            }
+            if (exId == 0) {
+                maps.add(keyList.get(0));
+            }
+        }
+        return maps;
+    }
+
+}

+ 1 - 3
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/PDFUtils.java

@@ -71,6 +71,7 @@ public class PDFUtils {
         }
     }
 
+
     public static List<String>  getPdfSignIds(String pdfUrl) {
         List<String> eVisaConfigList = new ArrayList<>();
         try  {
@@ -84,9 +85,6 @@ public class PDFUtils {
                 if(textStr.indexOf("*")>=0){
                     textStr = textStr.substring(textStr.lastIndexOf("*")+1,textStr.length());
                 }
-                if(textStr.indexOf("1867379428376444928")>=0){
-                    System.out.println("");
-                }
 
                 String[] textS = Func.toStrArray("\\|\\|",textStr);
                 for(String txt : textS){

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

@@ -11,6 +11,7 @@ import org.apache.pdfbox.text.PDFTextStripper;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.manager.vo.PDFIndexInfo;
 import org.springblade.system.cache.ParamCache;
 
@@ -171,6 +172,7 @@ public class PdfAddimgUtil {
         return result;
     }
 
+
     /**
      * findKeywordPostions
      *
@@ -256,6 +258,7 @@ public class PdfAddimgUtil {
                 if (positionIndex == -1) {
                     break;
                 }
+
                 float[] postions = charPositions.get(positionIndex);
                 data.setDataInfo(postions);
                 data.setPkeyid(text);
@@ -388,8 +391,13 @@ public class PdfAddimgUtil {
 
     public static List<String>  getPdfSignIds(String pdfUrl) {
         List<String> eVisaConfigList = new ArrayList<>();
+        InputStream inputStream;
         try  {
-            InputStream inputStream = CommonUtil.getOSSInputStream(pdfUrl);
+            if(pdfUrl.indexOf("http")>=0){
+                inputStream = CommonUtil.getOSSInputStream(pdfUrl);
+            }else{
+                inputStream = new FileInputStream(new File(pdfUrl));
+            }
             PDDocument document = PDDocument.load(inputStream);
             PDFTextStripper stripper = new PDFTextStripper();
             String text = stripper.getText(document);
@@ -407,7 +415,6 @@ public class PdfAddimgUtil {
                         }
                     }
                     if (txt.length() >= 15 && Func.isNumeric(txt)) {
-                        System.out.println(txt);
                         eVisaConfigList.add(txt);
                     }
                 }

+ 128 - 0
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/PdfSignatureInfo.java

@@ -0,0 +1,128 @@
+package org.springblade.evisa.utils;
+
+import io.lettuce.core.ScriptOutputType;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+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.common.utils.CommonUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.vo.PDFIndexInfo;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class PdfSignatureInfo{
+
+
+
+
+    //
+    public static void main(String[] args) throws IOException {
+        String pdfUrl = "/Users/hongchuangyanfa/Downloads/727dd864f9569e802692294f9b8fbb97.pdf";
+        PDDocument document = PDDocument.load(new File(pdfUrl));
+        for (int i=0 ;i<document.getPages().getCount();i++) {
+            PDPage page = document.getPage(i);
+            List<PDAnnotation> annotations = page.getAnnotations();
+            for (PDAnnotation annotation : annotations) {
+                if (annotation instanceof PDAnnotationWidget) {
+                    PDRectangle rect = annotation.getRectangle();
+
+                    float imgW = rect.getWidth();
+                    float imgH = rect.getHeight();
+                    float imgX = rect.getLowerLeftX() + imgW / 2;
+                    float imgY = rect.getLowerLeftY() + imgH / 2;
+
+                    System.out.println("imgX:"+imgX+"--imgY:"+imgY+"--imgW:"+imgW+"--imgH:"+imgH);
+                }
+            }
+        }
+
+        String ids = "1847105950746411008";
+        byte[] pdfData = CommonUtil.InputStreamToBytes(new FileInputStream(new File(pdfUrl)));
+        List<PDFIndexInfo> pdfIndexInfo = PdfAddimgUtil.findKeywordPostions(pdfData, ids);
+        for (PDFIndexInfo pdfInfo : pdfIndexInfo) {
+            String pkeyid = pdfInfo.getPkeyid();
+            float[] dataInfo = pdfInfo.getDataInfo();
+
+            float keyX = dataInfo[1];
+            float keyY = dataInfo[2];
+            PDPage page = document.getPage(0);
+            float pageHeight = page.getMediaBox().getHeight();
+            float pageWidth = page.getMediaBox().getWidth();
+
+            float keyw = keyX * pageWidth + (-15);
+            float keyh = pageHeight - keyY * pageHeight + 36;
+            System.out.println("pkeyid:"+pkeyid+"--keyw:"+keyw+"--keyh:"+keyh);
+        }
+    }
+
+
+
+    public static void main2(String[] args) throws Exception {
+        String pdfUrl = "/Users/hongchuangyanfa/Downloads/277af927eb766a06186397d46fd9c4ce.pdf";
+        //阈值
+        int threshold = 5 ;
+        File file = new File(pdfUrl);
+        FileInputStream inputStream = new FileInputStream(file);
+        //转换
+        byte[] pdfData = CommonUtil.InputStreamToBytes(new FileInputStream(new File(pdfUrl)));
+
+        PDDocument document = PDDocument.load(new File(pdfUrl));
+        List<String> positions = PdfAddimgUtil.getPdfSignIds(pdfUrl);
+
+        List<String> sucess = new ArrayList<>();
+        String ids = String.join(",", positions);
+        List<PDFIndexInfo> pdfIndexInfo = PdfAddimgUtil.findKeywordPostions(pdfData, ids);
+
+        Map<String, List<PDFIndexInfo>> groupBy = pdfIndexInfo.stream().collect(Collectors.groupingBy(da -> Func.toStr(da.getDataInfo()[0])));
+
+        for (int i=0 ;i<document.getPages().getCount();i++) {
+            PDPage page = document.getPage(i);
+            List<PDAnnotation> annotations = page.getAnnotations();
+            for (PDAnnotation annotation : annotations) {
+                if (annotation instanceof PDAnnotationWidget) {
+                    PDRectangle rect = annotation.getRectangle();
+
+                    float imgW = rect.getWidth();
+                    float imgH = rect.getHeight();
+                    float imgX = rect.getLowerLeftX() + imgW/2;
+                    float imgY = rect.getLowerLeftY() + imgH/2;
+                    List<PDFIndexInfo> pdfIndexInfos = groupBy.get((i+1)+".0");
+
+                    for (PDFIndexInfo pdfInfo : pdfIndexInfos) {
+                        String pkeyid = pdfInfo.getPkeyid();
+                        System.out.println(pkeyid);
+                        float[] dataInfo = pdfInfo.getDataInfo();
+
+                        float keyX = dataInfo[1];
+                        float keyY = dataInfo[2];
+
+                        float pageHeight = page.getMediaBox().getHeight();
+                        float pageWidth = page.getMediaBox().getWidth();
+
+                        float keyw = keyX * pageWidth;
+                        float keyh = pageHeight - keyY * pageHeight;
+
+
+                        if(Math.abs(imgX - keyw) <= threshold && Math.abs(imgY - keyh) <= threshold ){
+                            System.out.println(imgX+"--"+imgY +"--"+keyw+"--"+keyh);
+                            sucess.add(pkeyid);
+                        }
+                    }
+                }
+            }
+        }
+
+        Set<String> differentElements = new HashSet<>(positions);
+        // 使用retainAll方法来移除两个集合中相同的元素,留下不同的元素
+        differentElements.removeAll(sucess);
+
+        System.out.println(differentElements.size());
+    }
+
+}

+ 1 - 0
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/SignFtpUtil.java

@@ -37,6 +37,7 @@ public class SignFtpUtil {
             if("20".equals(sys_isonline) || SystemUtils.isWindows() || SystemUtils.isMacOs()){
                 SERVER = "47.115.117.246";
             }
+            System.out.println("ftp上传ip地址:"+SERVER);
             ftp.connect(SERVER, PORT);
             ftp.setControlEncoding("UTF-8");
             ftp.enterLocalPassiveMode();

+ 19 - 11
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -2454,18 +2454,26 @@ public class ExcelTabController extends BladeController {
                                         String textainfo = element.text();
                                         if(textainfo ==null || textainfo == "" || Func.isEmpty(textainfo)){
                                             int x1, y1;
-                                            if (element.html().indexOf("el-tooltip") >= 0) {
-                                                x1 = Integer.parseInt(element.children().get(0).children().get(0).attr("x1"));
-                                                y1 = Integer.parseInt(element.children().get(0).children().get(0).attr("y1"));
-                                            } else {
-                                                x1 = Integer.parseInt(element.children().get(0).attr("x1"));
-                                                y1 = Integer.parseInt(element.children().get(0).attr("y1"));
-                                            }
-                                            if (x1 == 0) {
-                                                x1 = 1;
+                                            if (element.html().indexOf("x1")>=0 && element.html().indexOf("y1")>=0) {
+                                                if (element.html().indexOf("el-tooltip") >= 0) {
+                                                    x1 = Integer.parseInt(element.children().get(0).children().get(0).attr("x1"));
+                                                    y1 = Integer.parseInt(element.children().get(0).children().get(0).attr("y1"));
+                                                } else {
+                                                    Elements children = element.children();
+                                                    if (children.size() >= 1) {
+                                                        x1 = Integer.parseInt(element.children().get(0).attr("x1"));
+                                                        y1 = Integer.parseInt(element.children().get(0).attr("y1"));
+                                                    } else {
+                                                        x1 = Integer.parseInt(element.attr("x1"));
+                                                        y1 = Integer.parseInt(element.attr("y1"));
+                                                    }
+                                                }
+                                                if (x1 == 0) {
+                                                    x1 = 1;
+                                                }
+                                                final CellRange cellRange = sheet.getCellRange(y1, x1);
+                                                cellRange.setText(projectInfo.getProjectName());
                                             }
-                                            final CellRange cellRange = sheet.getCellRange(y1, x1);
-                                            cellRange.setText(projectInfo.getProjectName());
                                             break;
                                         }
                                     }

+ 11 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorInit.java

@@ -86,10 +86,19 @@ public class ExecutorInit extends FormulaExecutor {
         /*加载合同材料、材料清单*/
        /* tec.meterInfo.setMaterialsAll(materialFormFc.apply(tec.getContractId())); 中期计量支取关联的部分*/
         if(MeterType.MATERIAL.equals(tec.getMeterType())||MeterType.START.equals(tec.getMeterType())||MeterType.START_JL.equals(tec.getMeterType())){
-            /*加载合同材料、材料清单*/
-            tec.meterInfo.setMaterialsAll(materialFormFc.apply(tec.getContractId()));
+
             /*加载计量期信息*/
             tec.periodInfo=meterPeriodFc.apply(tec.getReportId());
+
+            /*加载合同材料、材料清单*/
+            if(MeterType.MATERIAL.equals(tec.getMeterType())){
+                tec.meterInfo.setMaterialsAll(materialFormFc.apply(tec.getContractId()));
+                // 由于材料 只需要计算材料支付,其他不需要
+                tec.meterInfo.setMaterialsAll(tec.meterInfo.getMaterialsAll().stream().filter(m->m.getPeriodId().equals(tec.periodInfo.getId())).collect(Collectors.toList()));
+            }else{
+                tec.meterInfo.setMaterialsAll(materialFormFc.apply(tec.getContractId()));
+            }
+
         }else if(MeterType.INTERIM.equals(tec.getMeterType())||MeterType.INTERIM_JL.equals(tec.getMeterType())){
             /*计量期*/
             periodInfo();;

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaDaoImpl.java

@@ -128,8 +128,8 @@ public class FormulaDaoImpl implements IFormulaDao {
     @Override
     public Function<Long, List<Material>> getMaterialFormFc() {
         //and a.contract_id="+contractId+"
-        return periodId ->{
-            String sql="select a.certificate,a.material_arrive_number,a.contract_material_name  formMaterialName,b.material_name materialName,b.unit,a.price,b.price price_base,a.meter_amount meterAmount,meter_money sum,a.material_source source,material_conform  materialConform,a.storage_place storagePlace,a.storage_status storageStatus,a.storage_conform storageConform,a.remark,c.sort,c.id period_id from s_material_meter_form a left join s_contract_material b on a.contract_material_id = b.id join s_meter_period c  on a.meter_period_id=c.id where a.meter_period_id="+periodId+" and a.is_deleted=0 ";
+        return contractId ->{
+            String sql="select a.certificate,a.material_arrive_number,a.contract_material_name  formMaterialName,b.material_name materialName,b.unit,a.price,b.price price_base,a.meter_amount meterAmount,meter_money sum,a.material_source source,material_conform  materialConform,a.storage_place storagePlace,a.storage_status storageStatus,a.storage_conform storageConform,a.remark,c.sort,c.id period_id from s_material_meter_form a left join s_contract_material b on a.contract_material_id = b.id join s_meter_period c  on a.meter_period_id=c.id where a.contract_id="+contractId+" and a.is_deleted=0 ";
             return  getEntityList(sql,Material.class);
         };
     }

+ 2 - 2
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java

@@ -1040,7 +1040,7 @@ public class TaskController extends BladeController {
         int current = dto.getCurrent();
         int size = dto.getSize();
         List<Object> params = new ArrayList<>();
-        StringBuilder sqlString = new StringBuilder("SELECT * FROM u_task WHERE 1=1 AND is_deleted = 0 AND approval_type in (5,6,7) "); //approval_type = 5 计量任务
+        StringBuilder sqlString = new StringBuilder("SELECT * FROM u_task WHERE 1=1 AND is_deleted = 0 AND approval_type in (5,6,7,8) "); //approval_type = 5 计量任务
 
         ContractInfo contractInfo = jdbcTemplate.queryForObject("select contract_type from m_contract_info where id = " + dto.getContractId(), new BeanPropertyRowMapper<>(ContractInfo.class));
         if (contractInfo != null && Arrays.asList(1, 4).contains(contractInfo.getContractType())) {
@@ -4481,7 +4481,7 @@ public class TaskController extends BladeController {
             List<Map<String, Object>> mapList = jdbcTemplate.queryForList(selSql);
             if(Func.isEmpty(mapList) || mapList.size()==0) {
                 // 修改个人电签状态
-                String UPSql = "update u_task_parallel a set a.e_visa_status=null,e_visa_content=null where a.process_instance_id = (select b.process_instance_id from u_task b where  b.`status` in(1,2) and b.form_data_id=" + report.getPeriodId() + ") ";
+                String UPSql = "update u_task_parallel a set a.e_visa_status=null,e_visa_content=null,initiative=1 where a.process_instance_id = (select b.process_instance_id from u_task b where  b.`status` in(1,2) and b.form_data_id=" + report.getPeriodId() + ") ";
                 String UPSqlJL = " update u_task_parallel a set a.e_visa_status=1,e_visa_content='电签成功',initiative=2 where sort in( SELECT a.fixed_flow_branch_sort from u_task b,u_fixed_flow_link a where b.`status` in(1,2) and b.form_data_id='" + report.getPeriodId() + "' and a.fixed_flow_id=b.fixed_flow_id and a.flow_task_type=2 ) and a.process_instance_id in(SELECT process_instance_id from u_task b where b.`status` in(1,2) and b.form_data_id='" + report.getPeriodId() + "')";
                 String DeSql = "delete from u_task_batch where task_parallel_id in(select b.process_instance_id from u_task b where b.`status` in(1,2) and b.form_data_id=" + report.getPeriodId() + ")";
                 //删除以前存在的电签

+ 1 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.xml

@@ -126,7 +126,7 @@
                  WHEN a.approve_status = 2 THEN
                     '已审批' ELSE '已废除'
                  END AS approveStatusName ,
-            (SELECT id from u_task c where b.id=c.form_data_id AND c.STATUS != 3 ) as task_id,
+            (SELECT id from u_task c where CONVERT(b.id, CHAR) =c.form_data_id AND c.STATUS != 3 ) as task_id,
             ( SELECT raw_url FROM s_interim_pay_certificate WHERE contract_id = #{apply.contractId} AND contract_period_id =
             a.contract_period_id AND is_deleted = 0 ) AS periodPdfUrl
             from