瀏覽代碼

Merge branch 'dev' of http://219.151.181.73:3000/zhuwei/bladex into dev

laibulaizheli 1 月之前
父節點
當前提交
d02e177f7d
共有 43 個文件被更改,包括 1069 次插入156 次删除
  1. 7 1
      blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/entity/Oss.java
  2. 5 5
      blade-ops/blade-admin/pom.xml
  3. 1 0
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java
  4. 1 0
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/ossre/MinioTemplateRe.java
  5. 1 1
      blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/LargeFileEndpoint.java
  6. 1 0
      blade-ops/blade-resource/src/main/java/org/springblade/resource/mapper/OssMapper.xml
  7. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreeContract.java
  8. 9 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClient.java
  9. 5 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClientFallBack.java
  10. 11 4
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/EvaSummary.java
  11. 5 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/FB02.java
  12. 8 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractLazyVO.java
  13. 1 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WtcEva.java
  14. 1 0
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/vo/InformationQueryBIMVO.java
  15. 2 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/TaskSplitMapper.java
  16. 8 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/TaskSplitMapper.xml
  17. 13 7
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/TaskSplitServiceImpl.java
  18. 30 3
      blade-service/blade-business/src/main/java/org/springblade/business/controller/EVisaTaskCheckController.java
  19. 83 7
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  20. 7 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  21. 47 1
      blade-service/blade-business/src/main/java/org/springblade/business/utils/PDFUtil.java
  22. 19 14
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ArchiveController.java
  23. 0 4
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVController.java
  24. 79 10
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVDataServiceImpl.java
  25. 7 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/FileUtils.java
  26. 100 10
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/PDFUtils.java
  27. 3 2
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java
  28. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/bean/TableInfo.java
  29. 25 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  30. 8 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java
  31. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaMileage.java
  32. 7 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  33. 3 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java
  34. 8 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java
  35. 165 22
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  36. 131 11
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  37. 33 27
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  38. 207 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/TableCoordinates.java
  39. 1 1
      blade-service/blade-user/src/main/java/org/springblade/system/user/controller/WbsTreeController.java
  40. 1 1
      blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.java
  41. 3 1
      blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml
  42. 2 1
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java
  43. 16 6
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

+ 7 - 1
blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/entity/Oss.java

@@ -52,6 +52,13 @@ public class Oss extends TenantEntity {
      */
     @ApiModelProperty(value = "资源地址")
     private String endpoint;
+
+    /**
+     * oss地址
+     */
+    @ApiModelProperty(value = "资源地址")
+    private String transformEndpoint;
+
     /**
      * accessKey
      */
@@ -83,5 +90,4 @@ public class Oss extends TenantEntity {
     @ApiModelProperty(value = "备注")
     private String remark;
 
-
 }

+ 5 - 5
blade-ops/blade-admin/pom.xml

@@ -91,11 +91,11 @@
             <artifactId>spring-cloud-starter-security</artifactId>
         </dependency>
         <!--Taobao-Sdk-->
-        <dependency>
-            <groupId>com.taobao</groupId>
-            <artifactId>taobao-sdk</artifactId>
-            <version>20201116</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.taobao</groupId>-->
+<!--            <artifactId>taobao-sdk</artifactId>-->
+<!--            <version>20201116</version>-->
+<!--        </dependency>-->
     </dependencies>
 
     <build>

+ 1 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java

@@ -98,6 +98,7 @@ public class OssBuilder {
                 oss.setEndpoint("https://xinan1.zos.ctyun.cn");
             }
         }
+		oss.setEndpoint("https://xinan1.zos.ctyun.cn");
 		System.out.println("oss111="+oss.getEndpoint());
 		Oss ossCached = ossPool.get(tenantId);
 		OssTemplate template = templatePool.get(tenantId);

+ 1 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/ossre/MinioTemplateRe.java

@@ -483,6 +483,7 @@ public class MinioTemplateRe implements OssTemplateRe {
 	//	ossProperties.setEndpoint("http://183.247.216.148:9000");
 		//return ossProperties.getEndpoint();
 		return "http://183.247.216.148:9000";
+		//return "http://8.130.108.204:9000";
 	}
 
 

+ 1 - 1
blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/LargeFileEndpoint.java

@@ -286,7 +286,7 @@ public class LargeFileEndpoint {
 
             if (param.getFilename().contains("pdf") || param.getFilename().contains("PDF")) {
                 try {
-                    PdfReader pdfReader = new PdfReader(inputStream);
+                    PdfReader pdfReader = new PdfReader(new FileInputStream(file1));
                     int pages = pdfReader.getNumberOfPages();
                     //获取文件页数
                     newBladeFile.setPage(pages);

+ 1 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/mapper/OssMapper.xml

@@ -14,6 +14,7 @@
         <result column="oss_code" property="ossCode"/>
         <result column="category" property="category"/>
         <result column="endpoint" property="endpoint"/>
+        <result column="transform_endpoint" property="transformEndpoint"/>
         <result column="access_key" property="accessKey"/>
         <result column="secret_key" property="secretKey"/>
         <result column="bucket_name" property="bucketName"/>

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreeContract.java

@@ -325,6 +325,9 @@ public class WbsTreeContract extends BaseEntity {
     @JsonProperty(value = "treePId")
     private Long treePId;
 
+    @ApiModelProperty(value = "是否完成日期填写 1是 2否")
+    private Integer dateIsComplete;
+
 
 
 }

+ 9 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClient.java

@@ -58,6 +58,15 @@ public interface ExcelTabClient {
                  @RequestParam String projectId,
                  @RequestHeader("Blade-Auth") String header) throws Exception;
 
+
+
+    @PostMapping(API_PREFIX + "/synPdfKeyInfo")
+    R synPdfKeyInfo(@RequestParam String contractId,
+                 @RequestParam String nodeIds,
+                 @RequestParam String classify,
+                 @RequestParam String projectId,
+                 @RequestHeader("Blade-Auth") String header) throws Exception;
+
     @PostMapping(API_PREFIX + "/getArchiveTabList")
     List<ExcelTab> getArchiveTabList();
 

+ 5 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClientFallBack.java

@@ -51,6 +51,11 @@ public class ExcelTabClientFallBack implements ExcelTabClient {
         return null;
     }
 
+    @Override
+    public R synPdfKeyInfo(String contractId, String nodeIds, String classify, String projectId, String header) throws Exception {
+        return null;
+    }
+
     @Override
     public List<ExcelTab> getArchiveTabList(){
         return null;

+ 11 - 4
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/EvaSummary.java

@@ -60,17 +60,24 @@ public abstract class EvaSummary<T> {
                     ));
 
             int index=1;
+            int pageSizex=0;
             for (Map.Entry<Integer, List<T>> entry : pages.entrySet()) {
                 /*每一页就是一条插入记录*/
                 int k = entry.getKey();
+
                 if (wtcList.size() <= k) {
                     break;
                 }
                 List<T> v = entry.getValue();
                 /*是否是最后一页,fb02最后一页汇总用到*/
                 boolean isLast=index==pages.size();
+                // 算出 每页大小
+                if(pageSizex<=0){
+                    pageSizex = v.size();
+                }
                 index++;
-                List<Object> l=this.fds.stream().map(fd->putEd(k,v,fd,datas,isLast)).collect(Collectors.toList());
+                int finalPageSizex = pageSizex;
+                List<Object> l=this.fds.stream().map(fd->putEd(finalPageSizex,k,v,fd,datas,isLast)).collect(Collectors.toList());
                 l.add(wtcList.get(k).getPKeyId());
                 params.add(l.toArray());
             }
@@ -79,8 +86,8 @@ public abstract class EvaSummary<T> {
         return false;
     }
 
-    /**把数据放到对应元素*/
-    private String putEd(int pn, List<T> items, FormData fd,List<T>datas,boolean isLastPage){
+    /**把数据放到对应元素(一页一行的添加)*/
+    private String putEd(int pageSize,int pn, List<T> items, FormData fd,List<T>datas,boolean isLastPage){
         BiFunction<List<T>,Integer,List<Object>> fc = this.fm.get(fd.getCode());
         if(fc!=null) {
             List<Object> data ;
@@ -93,7 +100,7 @@ public abstract class EvaSummary<T> {
                     data=Collections.singletonList("");
                 }
             }else {
-                data  = fc.apply(items,pn);
+                data  = fc.apply(items,pn*pageSize);
             }
             for (int i = 0; i < data.size(); i++) {
                 Coords c = fd.getCoordsList().get(i);

+ 5 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/FB02.java

@@ -6,9 +6,13 @@ import lombok.EqualsAndHashCode;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.common.utils.BaseUtils;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.IoUtil;
 import org.springblade.manager.dto.FormData;
 import org.springblade.manager.entity.FormulaDataBlock;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
@@ -56,7 +60,7 @@ public class FB02 extends EvaSummary<Item02>{
                   this.fm.put(fd.getCode(),(List<Item02> l,Integer pn)->l.stream().map(Item02::getSubItem).collect(Collectors.toList()));
               }else if(fd.getEName().contains("序号")){
                   this.sn=fd;
-                  this.fm.put(fd.getCode(),(List<Item02> l,Integer pn)->IntStream.range(0, l.size()).boxed().map(i->i+pn*l.size()+1).collect(Collectors.toList()));
+                  this.fm.put(fd.getCode(),(List<Item02> l,Integer pn)->IntStream.range(0, l.size()).boxed().map(i->i+pn+1).collect(Collectors.toList()));
               }else if(fd.getEName().contains("实测项目")){
                   this.name=fd;
                   this.fm.put(fd.getCode(),(List<Item02> l,Integer pn)->l.stream().map(Item02::getName).collect(Collectors.toList()));

+ 8 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractLazyVO.java

@@ -19,6 +19,9 @@ public class WbsTreeContractLazyVO implements Serializable {
     @JsonProperty(value = "pKeyId")
     private Long pKeyId;
 
+    @ApiModelProperty("pkeyId的节点父级id")
+    private Long pId;
+
     @ApiModelProperty("节点主键pKeyId别名,其他接口要用")
     private Long primaryKeyId;
 
@@ -133,4 +136,9 @@ public class WbsTreeContractLazyVO implements Serializable {
     @ApiModelProperty(value = "关联后管节点ID")
     private Long isTypePrivatePid;
 
+    @ApiModelProperty(value = "是否完成日期填写1是2否")
+    private Integer dateIsComplete;
+
+
+
 }

+ 1 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WtcEva.java

@@ -19,6 +19,7 @@ public class WtcEva {
     private String treeCode;
     private Long parentId;
     private Long pKeyId;
+    private Long pId;//pkeyid 的父级 id
     public boolean isEva(){
       return Objects.requireNonNull(this.nodeName, "nodeName不能为空").contains("评定");
   }

+ 1 - 0
blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/vo/InformationQueryBIMVO.java

@@ -11,6 +11,7 @@ public class InformationQueryBIMVO {
 
     @TableField("id")
     private String id;
+
     @TableField("父级id")
     private String parentId;
 

+ 2 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/TaskSplitMapper.java

@@ -45,4 +45,6 @@ public interface TaskSplitMapper extends BaseMapper<TaskSplit> {
 
 	// 获取分解任务是否存在
 	Integer getSpliteTaskCount(String contractId);
+
+	//Integer updateArchiveByIds(String contractId,);
 }

+ 8 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/TaskSplitMapper.xml

@@ -34,4 +34,12 @@
         select count(1) from u_task_split where contract_id = #{contractId} and type=2
     </select>
 
+<!--    <update id="updateArchiveByIds">
+        update u_archives_auto set status = 1 where contract_id = #{contractId} and id in
+        <foreach item="item" collection="ids" separator="," close=")" open="(" index="index">
+            #{item}
+        </foreach>
+    </update>-->
+
+
 </mapper>

+ 13 - 7
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/TaskSplitServiceImpl.java

@@ -33,6 +33,7 @@ import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Random;
 
@@ -73,7 +74,7 @@ public class TaskSplitServiceImpl extends BaseServiceImpl<TaskSplitMapper, TaskS
 			}
 
 			Random random = new Random();
-			int randomNumber = random.nextInt(11) + 10; // 生成10到20之间的随机数
+			int randomNumber = random.nextInt(30) + 150; // 生成10到20之间的随机数
 			int i = (int) Math.ceil(randomNumber * spliteTaskCount/60.0 );
 
 			Integer archiveCount = baseMapper.getArchiveCount(contractId);
@@ -85,18 +86,23 @@ public class TaskSplitServiceImpl extends BaseServiceImpl<TaskSplitMapper, TaskS
 			data.put("taskTime",i);
 		}else{ // 指定文件解析
 			taskSplit.setType(3);
-			String[] split = splitIds.split(",");
-			taskSplit.setToolCount(split.length);
+			//String[] split = splitIds.split(",");
+			List<String> split = Func.toStrList(splitIds);
+			taskSplit.setToolCount(split.size());
 			taskSplit.setFinished(0);
 
+			// 修改当前文件的状体
+			// baseMapper.updateArchiveByIds(contractId,splitIds);
+
+
 			Random random = new Random();
-			int randomNumber = random.nextInt(11) + 10; // 生成10到20之间的随机数
-			int i = (int) Math.ceil(randomNumber * split.length/60.0 );
-			data.put("fileCount",split.length);
+			int randomNumber = random.nextInt(30) + 150;// 生成10到20之间的随机数
+			int i = (int) Math.ceil(randomNumber * split.size()/60.0 );
+			data.put("fileCount",split.size());
 			data.put("taskTime",i);
 			LocalDateTime now = LocalDateTime.now();
 			DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss");
-			String formattedDateTime = now.format(formatter)+"_"+split.length+"条分解任务";
+			String formattedDateTime = now.format(formatter)+"_"+split.size()+"条分解任务";
 			taskSplit.setTaskName(formattedDateTime);
 		}
 

+ 30 - 3
blade-service/blade-business/src/main/java/org/springblade/business/controller/EVisaTaskCheckController.java

@@ -844,9 +844,36 @@ public class EVisaTaskCheckController {
             if (ids == null || ids.size() == 0) {
                 return null;
             }
-            String sql = "select * from m_textdict_info where id in(" + StringUtils.join(ids, ",") + ") ";
-            List<TextdictInfo> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TextdictInfo.class));
-            jsonList = JSONArray.parseArray(JSONObject.toJSONString(query), JSONObject.class);
+        Map<String, List<String>> groupMap = ids.stream().collect(Collectors.groupingBy(str -> {
+            if (str.contains("✹")) {
+                return "sign";
+            }
+            return "dqid";
+        }));
+        List<String> dqIds = groupMap.get("dqid");
+        List<TextdictInfo> query = null;
+        if (dqIds != null && !dqIds.isEmpty()) {
+            String sql = "select * from m_textdict_info where id in(" + StringUtils.join(dqIds, ",") + ") ";
+            query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TextdictInfo.class));
+        }
+        List<String> signList = groupMap.get("sign");
+        if (signList != null && !signList.isEmpty()) {
+            String signIds = signList.stream().map(sign -> sign.replace("✹", "")).collect(Collectors.joining(","));
+            String sql = "SELECT distinct conf_id,relation_id from m_sign_config_relation WHERE conf_id in ( " + signIds + ") and type = 1 and is_deleted = 0";
+            List<SignConfigRelation> signConfigRelationList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(SignConfigRelation.class));
+            if (!signConfigRelationList.isEmpty()) {
+                if (query == null) {
+                    query = new ArrayList<>();
+                }
+                for (SignConfigRelation relation : signConfigRelationList) {
+                    TextdictInfo textdictInfo = new TextdictInfo();
+                    textdictInfo.setId(relation.getConfId());
+                    textdictInfo.setSigRoleId(relation.getRelationId() + "");
+                    query.add(textdictInfo);
+                }
+            }
+        }
+        jsonList = JSONArray.parseArray(JSONObject.toJSONString(query), JSONObject.class);
 //        }
         return jsonList;
     }

+ 83 - 7
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -1927,7 +1927,7 @@ public R<Boolean> copyContractTreeNode(@RequestBody CopyContractTreeNodeVO vo) {
                     List<String> keySet = new LinkedList<>();
                     for (Map.Entry<String, Object> entry : resultMap.entrySet()) {
                         keySet.add(entry.getKey());
-                        Object value = reviseValue(eMap, entry.getKey(), entry.getValue());
+                        Object value = reviseValue(eMap, entry.getKey(), entry.getValue(), nodeOld.getPKeyId());
                         if (value != null) {
                             if (value.toString().contains("\n")) {
                                 value = value.toString().replace("\n", "\\n");
@@ -2369,10 +2369,49 @@ private Object reviseValue(Map<String, String> p2, String key, Object value) {
     }
     return value;
 }
+    private Object reviseValue(Map<String, String> p2, String key, Object value, Long pKeyId) {
+        try {
+            if (p2.containsKey(key)) {
+                String setting = p2.get(key);
+                if (StringPool.NULL.equals(setting)) {
+                    /*擦除原来的内容*/
+                    return setting;
+                } else {
+                    /*重做随机值*/
+                    List<RangeJson> rjs = JSON.parseArray(setting, RangeJson.class);
+                    if (value != null && !value.toString().isEmpty() && Func.isNotEmpty(rjs)) {
+                        List<RangeJson> rangeJsons = rjs.stream().filter(rj -> rj.getPkeyId().equals(pKeyId)).collect(Collectors.toList());
+                        if (!rangeJsons.isEmpty()) {
+                            List<String[]> la = Arrays.stream(value.toString().split("☆")).map(s -> s.split("_\\^_")).collect(Collectors.toList());
+                            /*全部为一个数的时候不用修改*/
+                            if (la.stream().map(a -> a[0]).collect(Collectors.toSet()).size() > 1 || la.size() == 1) {
+                                List<String> result = new ArrayList<>();
+                                for (String[] a : la) {
+                                    String v = a[0];
+                                    String sv;
+                                    if (v.contains("、")) {
+                                        sv = Arrays.stream(v.split("[、]")).map(e -> imitate(e, rangeJsons)).collect(Collectors.joining("、"));
+                                    } else {
+                                        sv = imitate(v, rangeJsons);
+                                    }
+                                    result.add(sv + "_^_" + a[1]);
+                                }
+                                return String.join("☆", result);
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return value;
+    }
 
 public String imitate(String v, List<RangeJson> rjs) {
     try {
-        RangeJson best = rjs.stream().min(Comparator.comparingDouble(j -> Double.parseDouble(v) - Double.parseDouble(j.getDesign()))).orElse(rjs.get(0));
+        RangeJson best = rjs.stream().filter(j -> BaseUtils.isNotEmpty(j.getDesign()))
+                .peek(j -> j.setDesign(j.getDesign().split("/")[0])).min(Comparator.comparingDouble(j -> Double.parseDouble(v) - Double.parseDouble(j.getDesign()))).orElse(rjs.get(0));
         // int scale = Math.max(new StringBuilder(v).reverse().indexOf("."), 0);
         int scale = BaseUtils.getScaleZero(v, best.getDev(), best.getDesign());
         return BaseUtils.rangeList(1, best.getDesign(), best.getDev(), 1, scale, 1).get(0).toString();
@@ -2394,7 +2433,8 @@ private String reviseCols(Map<String, String> p2, String cols, Long pkeyId, Stri
                 List<String> colsList = target.stream().filter(k -> k.startsWith("key")).collect(Collectors.toList());
                 for (String k : colsList) {
                     if (p2.containsKey(k)) {
-                        Object value = reviseValue(p2, k, origin.get(k));
+//                        Object value = reviseValue(p2, k, origin.get(k));
+                        Object value = reviseValue(p2, k, origin.get(k), pkeyId);
                         if (value != null) {
                             if (value.toString().contains("_^_")) {
                                 value = "'" + value + "'";
@@ -2542,7 +2582,16 @@ private void addCopyTabData(WbsTreeContract needCopyNode, WbsTreeContract toCopy
                             String tableName = needTab.getInitTableName();
                             String col = nodeTabColsMap.get(tableName);
                             String colVal = nodeTabColsMap.get(tableName);
-                            colVal = colVal.replaceAll("id,p_key_id,", "'" + SnowFlakeUtil.getId() + "' as id,'" + toCopyNodeTab.getPKeyId() + "' as p_key_id,");
+                            String[] split = colVal.split(",");
+                            for (int i = 0; i < split.length; i++) {
+                                String key = split[i];
+                                if (key.equals("id")) {
+                                    split[i] = "'" + SnowFlakeUtil.getId() + "' as id";
+                                } else if (key.equals("p_key_id")) {
+                                    split[i] = "'" + toCopyNodeTab.getPKeyId() + "' as p_key_id";
+                                }
+                            }
+                            colVal = String.join(",", split);
                             //delete SQL (先删除旧数据,再新增)
                             String delSql = "delete from " + tableName + " where p_key_id = " + toCopyNodeTab.getPKeyId() + " ; ";
                             //insert into SQL
@@ -2591,7 +2640,16 @@ private void addCopyTabData(WbsTreeContract needCopyNode, WbsTreeContract toCopy
                                 String tableName = objTab.getInitTableName();
                                 String col = nodeTabColsMap.get(tableName);
                                 String colVal = nodeTabColsMap.get(tableName);
-                                colVal = colVal.replaceAll("id,p_key_id,", "'" + SnowFlakeUtil.getId() + "' as id,'" + objTab.getPKeyId() + "' as p_key_id,");
+                                String[] split = colVal.split(",");
+                                for (int i = 0; i < split.length; i++) {
+                                    String key = split[i];
+                                    if (key.equals("id")) {
+                                        split[i] = "'" + SnowFlakeUtil.getId() + "' as id";
+                                    } else if (key.equals("p_key_id")) {
+                                        split[i] = "'" + objTab.getPKeyId() + "' as p_key_id";
+                                    }
+                                }
+                                colVal = String.join(",", split);
                                 //delete SQL (先删除旧数据,再新增)
                                 String delSql = "delete from " + tableName + " where p_key_id = " + objTab.getPKeyId() + " ; ";
                                 //insert into SQL
@@ -2707,7 +2765,16 @@ private void addCopyNodesAndTabsBuildData(List<WbsTreeContract> addNodeList, Lis
                         String tableName = obj.getInitTableName();
                         String col = nodeTabColsMap.get(tableName);
                         String colVal = nodeTabColsMap.get(tableName);
-                        colVal = colVal.replaceAll("id,p_key_id,", "'" + SnowFlakeUtil.getId() + "' as id,'" + obj.getPKeyId() + "' as p_key_id,");
+                        String[] split = colVal.split(",");
+                        for (int i = 0; i < split.length; i++) {
+                            String key = split[i];
+                            if (key.equals("id")) {
+                                split[i] = "'" + SnowFlakeUtil.getId() + "' as id";
+                            } else if (key.equals("p_key_id")) {
+                                split[i] = "'" + obj.getPKeyId() + "' as p_key_id";
+                            }
+                        }
+                        colVal = String.join(",", split);
                         //delete SQL (先删除旧数据,再新增)
                         String delSql = "delete from " + tableName + " where p_key_id = " + obj.getPKeyId() + " ; ";
                         //insert into SQL
@@ -2840,7 +2907,16 @@ private void addCopyNodesAndTabsBuildData(List<WbsTreeContract> addNodeList, Lis
                                     StringBuilder copyDataSql = new StringBuilder();
                                     String col = queryProcessDataVO.getAncestors();
                                     String colVal = queryProcessDataVO.getAncestors();
-                                    colVal = colVal.replaceAll("id,p_key_id,", "'" + SnowFlakeUtil.getId() + "' as id,'" + objTab.getPKeyId() + "' as p_key_id,");
+                                    String[] split = colVal.split(",");
+                                    for (int i = 0; i < split.length; i++) {
+                                        String key = split[i];
+                                        if (key.equals("id")) {
+                                            split[i] = "'" + SnowFlakeUtil.getId() + "' as id";
+                                        } else if (key.equals("p_key_id")) {
+                                            split[i] = "'" + objTab.getPKeyId() + "' as p_key_id";
+                                        }
+                                    }
+                                    colVal = String.join(",", split);
                                     //delete SQL (先删除旧数据,再新增)
                                     String delSql = "delete from " + tableName + " where p_key_id = " + objTab.getPKeyId() + " ; ";
                                     //insert into SQL

+ 7 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -2048,6 +2048,11 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 
                     }
 
+                    /*if(type == 3 && task.getApprovalType()== 9){
+
+                        result = excelTabClient.synPdfKeyInfo(contractId, task.getFormDataId(), classify, projectId, header);
+
+                    }else*/
                     if (type == 1) {
                         //重新保存
                         long startTime_1 = System.currentTimeMillis();
@@ -2150,6 +2155,8 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
         return excelTabClient.synPDFInfo(contractId, nodePKeyIds, classify, projectId, header);
     }
 
+
+
     /**
      * 返回true代表满足条件 是超级管理员并且部门是在泓创智诚下面的部门
      */

+ 47 - 1
blade-service/blade-business/src/main/java/org/springblade/business/utils/PDFUtil.java

@@ -104,7 +104,8 @@ public class PDFUtil {
             String[] lines = text.split("[ \\n]+");
             for(int k=0;k<lines.length;k++){
                 String textStr = lines[k];
-                if(textStr.indexOf("*")>=0){
+                int index = textStr.indexOf("*");
+                if(index>=0 && textStr.charAt(index+1) != '✹'){
                     textStr = textStr.substring(textStr.lastIndexOf("*")+1,textStr.length());
                 }
 
@@ -119,6 +120,17 @@ public class PDFUtil {
                         eVisaConfigList.add(txt);
                     }
                 }
+                textS = Func.toStrArray("\\*",textStr);
+                for(String txt : textS){
+                    for (int i = 0; i < txt.length(); i++) {
+                        if (!Character.isDigit(txt.charAt(i))) {
+                            txt=txt.substring(0,i);
+                        }
+                    }
+                    if (txt.length() >= 15 && Func.isNumeric(txt)) {
+                        eVisaConfigList.add(txt);
+                    }
+                }
 
                 // 特殊处理
                 if(textStr.indexOf("1")>=0){
@@ -128,6 +140,40 @@ public class PDFUtil {
                         eVisaConfigList.add(txt);
                     }
                 }
+                if (textStr.contains("✹")) {
+                    String textString = textStr.substring(textStr.indexOf("✹") + 1);
+                    if (textString.contains("||✹")) {
+                        String[] textS1 = Func.toStrArray("\\|\\|✹",textString);
+                        for(String txt : textS1){
+                            for (int i = 0; i < txt.length(); i++) {
+                                if (!Character.isDigit(txt.charAt(i))) {
+                                    txt=txt.substring(0,i);
+                                }
+                            }
+                            if (txt.length() >= 15 && Func.isNumeric(txt)||(Func.isNumeric(txt)&&txt.length()==8&&txt.startsWith("123"))) {
+                                eVisaConfigList.add("✹" + txt);
+                            }
+                        }
+                    }
+                    if (textString.contains("*✹")) {
+                        String[] textS1 = Func.toStrArray("\\*✹",textString);
+                        for(String txt : textS1){
+                            for (int i = 0; i < txt.length(); i++) {
+                                if (!Character.isDigit(txt.charAt(i))) {
+                                    txt=txt.substring(0,i);
+                                }
+                            }
+                            if (txt.length() >= 15 && Func.isNumeric(txt)||(Func.isNumeric(txt)&&txt.length()==8&&txt.startsWith("123"))) {
+                                eVisaConfigList.add("✹" + txt);
+                            }
+                        }
+                    }
+                    if(textString.startsWith("1")){
+                        if (textString.length() >= 15 && Func.isNumeric(textString)) {
+                            eVisaConfigList.add("✹" + textString);
+                        }
+                    }
+                }
             }
 
             List<String> unique = eVisaConfigList.stream().distinct().collect(Collectors.toList());

+ 19 - 14
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ArchiveController.java

@@ -160,7 +160,6 @@ public class ArchiveController {
         }
     }
 
-
     @Scheduled(cron = "0/30 * * * * ?")
     public void SplitPdfInfo() {
         //执行代码
@@ -168,7 +167,7 @@ public class ArchiveController {
         log.info("分解html开始");
         String sql = "select  * from u_archives_split_info where status =2 "; // and TIMESTAMPDIFF(MINUTE, create_time, NOW()) >=3";
         List<ArchivesSplitInfoVO> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ArchivesSplitInfoVO.class));
-
+        log.info("分解html开始==="+query.size());
         if (query != null && query.size() >= 1) {
             for (ArchivesSplitInfoVO dataInfo : query) {
                 if (executor.getQueue().size() <= 10) {
@@ -198,6 +197,7 @@ public class ArchiveController {
 
     public void signTaskBatchpng(ArchivesSplitInfoVO taskSign) {
         try {
+            System.out.println("分解001");
             String archiveId = taskSign.getArchiveId();
             String fileUlr = taskSign.getFileUrl();
             String firstPage = FileUtils.getSysLocalFileUrl() + "archiveSplit/";
@@ -209,7 +209,7 @@ public class ArchiveController {
             int bkb = 0 ;
             //将imagePath 的数据转成一个可解析的html
             String htmlUrl = pngToHtml(firstPage, archiveId,taskSign.getFirstFileUrl());
-
+            System.out.println("分解002="+htmlUrl);
 
             if (htmlUrl.indexOf("_001.html") >= 0 && htmlUrl.indexOf("archiveSplit") >= 0) {
                 String htmlString = IoUtil.readToString(new FileInputStream(htmlUrl));
@@ -261,7 +261,7 @@ public class ArchiveController {
                     // 分解文件
                     String fmlUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_cf_00"+i+".pdf";
                     getPdfByPage(startYm,endYm,fileUlr,fmlUrl);
-                    saveDataToMysql(fmlUrl,wjtm,taskSign.getId(),endYm-startYm+1,i,zrz);
+                    saveDataToMysql(fmlUrl,wjtm,taskSign.getId(),endYm-startYm+1,i,zrz,rq);
                     bkb =  endYm ;
                 }
             } else {
@@ -271,30 +271,31 @@ public class ArchiveController {
             // 添加封面信息
             String fmlUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_fm_001.pdf";
             getPdfByPage(1,1,fileUlr,fmlUrl);
-            saveDataToMysql(fmlUrl,"封面",taskSign.getId(),1,-4,dutyUser);
+            saveDataToMysql(fmlUrl,"封面",taskSign.getId(),1,-4,dutyUser,"");
 
             // 卷内目录
             String jnmuUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_jnml_001.pdf";
             getPdfByPage(baseStart,basePage,fileUlr,jnmuUrl);
-            saveDataToMysql(jnmuUrl,"卷内目录",taskSign.getId(),1,-3,dutyUser);
+            saveDataToMysql(jnmuUrl,"卷内目录",taskSign.getId(),1,-3,dutyUser,"");
 
             // 卷内备考表
             String jnbkbUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_jnbkb_001.pdf";
             getPdfByPage(bkb+1,bkb+1,fileUlr,jnbkbUrl);
-            saveDataToMysql(jnbkbUrl,"卷内备考表",taskSign.getId(),1,100,dutyUser);
+            saveDataToMysql(jnbkbUrl,"卷内备考表",taskSign.getId(),1,100,dutyUser,"");
 
             // 背脊表
             String bjbUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_beiji_001.pdf";
             String bjbUrlPng = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_beiji_001.png";
+
             getPdfByPage(bkb+2,bkb+2,fileUlr,bjbUrl);
 
-            File bgImgFile = new File(bjbUrl);
+            File bgImgFile = new File(bjbUrlPng);
             if (!bgImgFile.exists()) {
                 savePdfAsImage(1, bjbUrl, bjbUrlPng);
             }
-            String state = OcrTitle(bjbUrl,"3");
+            String state = OcrTitle(bjbUrlPng,"3");
             if(state.equals("1")){
-                saveDataToMysql(jnbkbUrl,"背脊表",taskSign.getId(),1,101,dutyUser);
+                saveDataToMysql(bjbUrl,"背脊表",taskSign.getId(),1,101,dutyUser,"");
             }
             bgImgFile.delete();
 
@@ -312,6 +313,10 @@ public class ArchiveController {
             jdbcTemplate.execute(taxkSql);
             jdbcTemplate.execute(taxkSql2);
 
+            // 删除html
+            File fileHtml = new File(fmlUrl);
+            fileHtml.delete();
+
             // 修改完成情况
             RedisTemplate.delete("splithtml-" + archiveId);
         } catch (Exception e) {
@@ -333,6 +338,7 @@ public class ArchiveController {
                     new InputStreamReader(process.getInputStream()));
             String htmlUrl;
             while ((htmlUrl = reader.readLine()) != null) {
+                System.out.println(htmlUrl);
                 if (htmlUrl.indexOf("html文件路径") >= 0 && htmlUrl.indexOf("_001.html") >= 0 && htmlUrl.indexOf("archiveSplit") >= 0) {
                     lasHhtmlUrl = htmlUrl.replace("html文件路径", "");
                 }
@@ -350,7 +356,7 @@ public class ArchiveController {
         }
     }
 
-    public String OcrTitle(String fileUrl, String type) {
+    public static String OcrTitle(String fileUrl, String type) {
         String lasHhtmlUrl = "";
         try {
             // 定义Python解释器路径和脚本路径
@@ -445,8 +451,7 @@ public class ArchiveController {
         }
     }
 
-    public int saveDataToMysql(String upFileUrl,String fileName,String fileId,int filePage,int sort,String dutyUser) {
-
+    public int saveDataToMysql(String upFileUrl,String fileName,String fileId,int filePage,int sort,String dutyUser,String fileTime) {
         // 获取封面信息
         long newPkId = SnowFlakeUtil.getId(); //主键Id
         File fmfile = new File(upFileUrl);
@@ -459,7 +464,7 @@ public class ArchiveController {
                         " drawing_no,cite_change_number,certification_time,e_visa_file,node_ext_id,file_type,archive_id,origin_id,filming_time,filmingor_time,tag_id,pic_code,refer_code,film_code,width,height,ftime,utime,del_time,sort,box_name,box_number,is_auto_file,is_archive,page_num, " +
                         " file_size,source_type,is_element,pdf_page_url,fid,rectification,classify,m_wbs_tree_contract_p_key_id,u_image_classification_file_id,archive_file_storage_type,node_tree_structure,date_name,archive_file_stroage_type,out_id,sort_num " +
                         "   ) " +
-                        " SELECT "+newPkId+",project_id,contract_id,node_id,file_number,'" + fileName + "',file_time,'" + FmPdfUrl + "','" + FmPdfUrl + "',"+filePage+",is_approval,is_certification,is_need_certification,'"+dutyUser+"',create_user,create_dept,create_time,update_user,update_time,status,is_deleted,sheet_type,sheet_source, " +
+                        " SELECT "+newPkId+",project_id,contract_id,node_id,file_number,'" + fileName + "','"+fileTime+"','" + FmPdfUrl + "','" + FmPdfUrl + "',"+filePage+",is_approval,is_certification,is_need_certification,'"+dutyUser+"',create_user,create_dept,create_time,update_user,update_time,status,is_deleted,sheet_type,sheet_source, " +
                         "        drawing_no,cite_change_number,certification_time,e_visa_file,node_ext_id,file_type,archive_id,origin_id,filming_time,filmingor_time,tag_id,pic_code,refer_code,film_code,width,height,ftime,utime,del_time,"+sort+",box_name,box_number,is_auto_file,is_archive,page_num, " +
                         "        file_size,source_type,is_element,pdf_page_url,fid,rectification,classify,m_wbs_tree_contract_p_key_id,u_image_classification_file_id,archive_file_storage_type,node_tree_structure,date_name,archive_file_stroage_type,out_id,sort_num " +
                         " from u_archive_file where id=" + fileId;

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

@@ -103,10 +103,6 @@ public class EVController {
                                 try {
                                     /*===============执行批量任务===============*/
                                     evDataService.signTaskBatch(dataInfo);
-                                    System.out.println("队列数量" + executor.getQueue().size());
-                                    System.out.println("活跃数量" + executor.getActiveCount());
-                                    System.out.println("总共数量" + executor.getTaskCount());
-                                    System.out.println("完成数量" + executor.getCompletedTaskCount());
                                 } catch (Exception e) {
                                     e.printStackTrace();
                                 }

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

@@ -511,11 +511,27 @@ public class EVDataServiceImpl implements EVDataService {
         String[] strArray = Func.toStrArray(task.getUserId());
         String[] userNames = Func.toStrArray(task.getNickName());
         List<Map<String, Object>> maps = new ArrayList<>();
+        String[] split = ids.split(",");
+        StringBuilder dqIds = new StringBuilder();
+        StringBuilder signIds = new StringBuilder();
+        for (String id : split) {
+            if (id != null && id.contains("✹")) {
+                signIds.append(id.substring(1)).append( ",");
+            } else {
+                dqIds.append(id).append( ",");
+            }
+        }
+        if (dqIds.length()>0) {
+            dqIds.deleteCharAt(dqIds.length()-1);
+        }
+        if (signIds.length()>0) {
+            signIds.deleteCharAt(signIds.length()-1);
+        }
         if(strArray!=null && strArray.length>0) {
             for (int i = 0; i < strArray.length; i++) {
-                String sqlinfo = " SELECT * from ( SELECT a.id as keyWord,a.project_id,a.pyzbx ,a.pyzby,(SELECT acc_code from blade_user where id='" + strArray[i] + "' 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=" + task.getContractId() + " and user_id=" + strArray[i] + " and c.is_deleted=0 ) ) x where x.sealId is not null ";
+                String sqlinfo = " SELECT * from ( SELECT a.id as keyWord,a.project_id,a.pyzbx ,a.pyzby,(SELECT acc_code from blade_user where id='" + strArray[i] + "' and is_deleted=0  ) as sealId from m_textdict_info a where  a.type =2 and a.id in (" + dqIds + ")  and sig_role_id in (SELECT DISTINCT c.role_id from m_project_assignment_user c  where c.contract_id=" + task.getContractId() + " and user_id=" + strArray[i] + " and c.is_deleted=0 ) ) x where x.sealId is not null ";
                 if (task.getSigType() == 2) {
-                    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 '%" + task.getContractId() + "%' and a.is_deleted=0 and b.is_deleted=0 and a.type=6 and a.id in(" + ids + ")";
+                    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 '%" + task.getContractId() + "%' and a.is_deleted=0 and b.is_deleted=0 and a.type=6 and a.id in(" + dqIds + ")";
                     System.out.println("东方中讯--签章--" + sqlinfo);
                 } else {
                     System.out.println("东方中讯--签字--" + sqlinfo);
@@ -543,6 +559,25 @@ public class EVDataServiceImpl implements EVDataService {
                         }
                     }
                 }
+                if (signIds.length() > 0 && task.getSigType() != 2) {
+                    String sql = "SELECT * from ( SELECT a.conf_id as keyWord,a.project_id,a.pyzbx ,a.pyzby,(SELECT acc_code from blade_user where id = " + strArray[i] + " and is_deleted=0  ) as sealId " +
+                            "from m_sign_config_relation a where a.type = 1 and a.is_deleted = 0 and a.conf_id in (" + signIds + ") " +
+                            "and a.relation_id in (SELECT DISTINCT c.role_id from m_project_assignment_user c  where c.contract_id= " + task.getContractId() + " and user_id= " + strArray[i] + " and c.is_deleted=0 ) ) x where x.sealId is not null ";
+                    List<Map<String, Object>> maps3 = jdbcTemplate.queryForList(sql);
+                    System.out.println("东方中讯--签字--key =" + sql);
+                    if (!maps3.isEmpty()) {
+                        Map<String, List<Map<String, Object>>> peopleByAge = maps2.stream()
+                                .collect(Collectors.groupingBy(hada -> (Func.toStr(hada.get("keyWord")))));
+                        for (String keyId : peopleByAge.keySet()) {
+                            List<Map<String, Object>> keyList = peopleByAge.get(keyId);
+                            if (keyList != null && !keyList.isEmpty()) {
+                                Map<String, Object> map = keyList.get(0);
+                                map.put("keyWord", "✹" + map.get("keyWord"));
+                                maps.add(map);
+                            }
+                        }
+                    }
+                }
             }
         }
         return maps;
@@ -555,19 +590,33 @@ public class EVDataServiceImpl implements EVDataService {
         String[] userNames = Func.toStrArray(task.getNickName());
         List<SealStrategyVO> sealStrategyVOS = new ArrayList<>();
 
-
+        String[] split = ids.split(",");
+        StringBuilder dqIds = new StringBuilder();
+        StringBuilder signIds = new StringBuilder();
+        for (String id : split) {
+            if (id != null && id.contains("✹")) {
+                signIds.append(id.substring(1)).append( ",");
+            } else {
+                dqIds.append(id).append( ",");
+            }
+        }
+        if (dqIds.length()>0) {
+            dqIds.deleteCharAt(dqIds.length()-1);
+        }
+        if (signIds.length()>0) {
+            signIds.deleteCharAt(signIds.length()-1);
+        }
         if(strArray!=null && strArray.length>0){
             for (int i =0 ;i < strArray.length;i++) {
                 String userId =strArray[i];
-                String sqlinfo = "SELECT * from ( SELECT DISTINCT a.id,a.pyzbx ,a.pyzby,a.project_id,(SELECT signature_file_url from m_sign_pfx_file where is_register=1 and certificate_user_id='" + userId + "' and is_deleted=0  ) as signature_file_url, (SELECT wide from m_sign_pfx_file where is_register=1 and certificate_user_id='" + userId + "' and is_deleted=0  ) as wide ,(SELECT high from m_sign_pfx_file where is_register=1 and certificate_user_id='" + userId + "' and is_deleted=0  ) as high 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=" + task.getContractId() + " and user_id=" + userId + " and c.is_deleted=0 ) ) x where x.signature_file_url is not null ";
+                String sqlinfo = "SELECT * from ( SELECT DISTINCT a.id,a.pyzbx ,a.pyzby,a.project_id,(SELECT signature_file_url from m_sign_pfx_file where is_register=1 and certificate_user_id='" + userId + "' and is_deleted=0  ) as signature_file_url, (SELECT wide from m_sign_pfx_file where is_register=1 and certificate_user_id='" + userId + "' and is_deleted=0  ) as wide ,(SELECT high from m_sign_pfx_file where is_register=1 and certificate_user_id='" + userId + "' and is_deleted=0  ) as high from m_textdict_info a where  a.type =2 and a.id in (" + dqIds + ") and sig_role_id in (SELECT DISTINCT c.role_id from m_project_assignment_user c  where c.contract_id=" + task.getContractId() + " and user_id=" + userId + " and c.is_deleted=0 ) ) x where x.signature_file_url is not null ";
                 if (task.getSigType() == 2) {
-                    sqlinfo = "SELECT a.id,a.pyzbx,a.pyzby,b.signature_file_url,b.id as sfId,a.project_id,b.certificate_password,b.certificate_user_name,b.certificate_number ,b.wide,b.high from m_textdict_info a ,m_sign_pfx_file b where a.sig_role_id = b.pfx_type and b.project_contract_role like '%" + task.getContractId() + "%' and a.is_deleted=0 and b.is_deleted=0 and a.type=6 and a.id in(" + ids + ") ";
+                    sqlinfo = "SELECT a.id,a.pyzbx,a.pyzby,b.signature_file_url,b.id as sfId,a.project_id,b.certificate_password,b.certificate_user_name,b.certificate_number ,b.wide,b.high from m_textdict_info a ,m_sign_pfx_file b where a.sig_role_id = b.pfx_type and b.project_contract_role like '%" + task.getContractId() + "%' and a.is_deleted=0 and b.is_deleted=0 and a.type=6 and a.id in(" + dqIds + ") ";
                     System.out.println("安心签--签章--=" + sqlinfo);
                 } else {
                     System.out.println("安心签--签字--=" + sqlinfo);
                 }
                 List<Map<String, Object>> maps2 = jdbcTemplate.queryForList(sqlinfo);
-
                 if (maps2 != null && maps2.size() > 0) {
                     List<Map<String, Object>> maps = new ArrayList<>();
                     Map<String, List<Map<String, Object>>> peopleByAge = maps2.stream()
@@ -576,22 +625,42 @@ public class EVDataServiceImpl implements EVDataService {
                     for (String keyId : peopleByAge.keySet()) {
                         int exId = 0;
                         List<Map<String, Object>> keyList = peopleByAge.get(keyId);
-                        if (keyList != null && keyList.size() == 1) {
+                        if (keyList != null && keyList.size() == 1 && keyList.get(0).get("signature_file_url") != null) {
                             maps.addAll(keyList);
                             exId = 1;
                         } else if (keyList != null && keyList.size() >= 2) {
                             for (Map<String, Object> datax : keyList) {
-                                if ((datax.get("project_id") + "").equals(task.getProjectId())) {
+                                if ((datax.get("project_id") + "").equals(task.getProjectId()) && datax.get("signature_file_url") != null) {
                                     maps.add(datax);
                                     exId = 1;
                                 }
                             }
                         }
-                        if (exId == 0) {
+                        if (exId == 0 && keyList != null) {
                             maps.add(keyList.get(0));
                         }
                     }
-
+                    if (signIds.length() > 0 && task.getSigType() != 2) {
+                        String sql = "SELECT * from ( SELECT DISTINCT a.conf_id as id,0.0 as pyzbx ,0.0 as pyzby,(SELECT signature_file_url from m_sign_pfx_file where is_register=1 and certificate_user_id='"
+                                + userId + "' and is_deleted=0  ) as signature_file_url, (SELECT wide from m_sign_pfx_file where is_register=1 and certificate_user_id='"
+                                + userId + "' and is_deleted=0  ) as wide ,(SELECT high from m_sign_pfx_file where is_register=1 and certificate_user_id='"
+                                + userId + "' and is_deleted=0  ) as high from m_sign_config_relation a where a.type = 1 and a.is_deleted = 0 and a.conf_id in (" + signIds + ") and a.relation_id in (SELECT DISTINCT c.role_id from m_project_assignment_user c  where c.contract_id="
+                                + task.getContractId() + " and user_id=" + userId + " and c.is_deleted=0 ) ) x where x.signature_file_url is not null ";
+                        List<Map<String, Object>> maps3 = jdbcTemplate.queryForList(sql);
+                        System.out.println("安心签--签章--key =" + sql);
+                        if (!maps3.isEmpty()) {
+                            Map<String, List<Map<String, Object>>> peopleByAges = maps3.stream()
+                                    .collect(Collectors.groupingBy(hada -> (Func.toStr(hada.get("id")))));
+                            for (String keyId : peopleByAges.keySet()) {
+                                List<Map<String, Object>> keyList = peopleByAges.get(keyId);
+                                if (keyList != null && !keyList.isEmpty()) {
+                                    Map<String, Object> map = keyList.get(0);
+                                    map.put("id", "✹" + map.get("id"));
+                                    maps.add(map);
+                                }
+                            }
+                        }
+                    }
                     if (maps == null || maps.size() <= 0) {
                         break;
                     }

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

@@ -108,7 +108,13 @@ public class FileUtils {
             if (url.isEmpty() || url.equals("")) {
                 return "0";
             }
-            InputStream pdfInputStream = CommonUtil.getOSSInputStream(url);
+            File file1 = new File(url);
+            InputStream pdfInputStream;
+            if(file1.exists()){
+                pdfInputStream = new FileInputStream(file1);
+            }else{
+                pdfInputStream = CommonUtil.getOSSInputStream(url);
+            }
             //获取这份文件的页数并设置签章策略
             //获取PDF文件
             PDDocument document = PDDocument.load(pdfInputStream);

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

@@ -30,7 +30,8 @@ public class PDFUtils {
 
             for(int k=0;k<lines.length;k++){
                 String textStr = lines[k];
-                if(textStr.indexOf("*")>=0){
+                int index = textStr.indexOf("*");
+                if(index>=0 && textStr.charAt(index+1) != '✹'){
                     textStr = textStr.substring(textStr.lastIndexOf("*")+1,textStr.length());
                 }
 
@@ -41,25 +42,70 @@ public class PDFUtils {
                             txt=txt.substring(0,i);
                         }
                     }
-                    if (txt.length() >= 15 && Func.isNumeric(txt)||(Func.isNumeric(txt)&&txt.length()==8&&txt.startsWith("123"))) {
+                    if (txt.length() >= 15 && Func.isNumeric(txt)) {
                         eVisaConfigList.add(txt);
                     }
-                    if (taskApp.getPdfDate() == null || taskApp.getPdfDate().isEmpty()) {
-                        Matcher matcher = pattern.matcher(txt);
-                        if(matcher.matches()){
-                            taskApp.setPdfDate(matcher.group(1));
+                }
+                if (taskApp.getPdfDate() == null || taskApp.getPdfDate().isEmpty()) {
+                    Matcher matcher = pattern.matcher(textStr);
+                    if(matcher.matches()){
+                        taskApp.setPdfDate(matcher.group(1));
+                    }
+                }
+                textS = Func.toStrArray("\\*",textStr);
+                for(String txt : textS){
+                    for (int i = 0; i < txt.length(); i++) {
+                        if (!Character.isDigit(txt.charAt(i))) {
+                            txt=txt.substring(0,i);
                         }
                     }
+                    if (txt.length() >= 15 && Func.isNumeric(txt)) {
+                        eVisaConfigList.add(txt);
+                    }
                 }
 
                 // 特殊处理
                 if(textStr.indexOf("1")>=0){
                     String txt = textStr.substring(textStr.indexOf("1"));
-                    if (txt.length() >= 15 && Func.isNumeric(txt)||(Func.isNumeric(txt)&&txt.length()==8&&txt.startsWith("123"))) {
+                    if (txt.length() >= 15 && Func.isNumeric(txt)) {
                         System.out.println(txt);
                         eVisaConfigList.add(txt);
                     }
                 }
+                if (textStr.contains("✹")) {
+                    String textString = textStr.substring(textStr.indexOf("✹") + 1);
+                    if (textString.contains("||✹")) {
+                        String[] textS1 = Func.toStrArray("\\|\\|✹",textString);
+                        for(String txt : textS1){
+                            for (int i = 0; i < txt.length(); i++) {
+                                if (!Character.isDigit(txt.charAt(i))) {
+                                    txt=txt.substring(0,i);
+                                }
+                            }
+                            if (txt.length() >= 15 && Func.isNumeric(txt)||(Func.isNumeric(txt)&&txt.length()==8&&txt.startsWith("123"))) {
+                                eVisaConfigList.add("✹" + txt);
+                            }
+                        }
+                    }
+                    if (textString.contains("*✹")) {
+                        String[] textS1 = Func.toStrArray("\\*✹",textString);
+                        for(String txt : textS1){
+                            for (int i = 0; i < txt.length(); i++) {
+                                if (!Character.isDigit(txt.charAt(i))) {
+                                    txt=txt.substring(0,i);
+                                }
+                            }
+                            if (txt.length() >= 15 && Func.isNumeric(txt)||(Func.isNumeric(txt)&&txt.length()==8&&txt.startsWith("123"))) {
+                                eVisaConfigList.add("✹" + txt);
+                            }
+                        }
+                    }
+                    if(textString.startsWith("1")){
+                        if (textString.length() >= 15 && Func.isNumeric(textString)) {
+                            eVisaConfigList.add("✹" + textString);
+                        }
+                    }
+                }
             }
 
 
@@ -86,11 +132,10 @@ public class PDFUtils {
             PDFTextStripper stripper = new PDFTextStripper();
             String text = stripper.getText(document);
             String[] lines = text.split("[ \\n]+");
-            String regex = "^\\d{4}年\\d{2}月\\d{2}日$";
-
             for(int k=0;k<lines.length;k++){
                 String textStr = lines[k];
-                if(textStr.indexOf("*")>=0){
+                int index = textStr.indexOf("*");
+                if(index>=0 && textStr.charAt(index+1) != '✹'){
                     textStr = textStr.substring(textStr.lastIndexOf("*")+1,textStr.length());
                 }
 
@@ -105,6 +150,17 @@ public class PDFUtils {
                         eVisaConfigList.add(txt);
                     }
                 }
+                textS = Func.toStrArray("\\*",textStr);
+                for(String txt : textS){
+                    for (int i = 0; i < txt.length(); i++) {
+                        if (!Character.isDigit(txt.charAt(i))) {
+                            txt=txt.substring(0,i);
+                        }
+                    }
+                    if (txt.length() >= 15 && Func.isNumeric(txt)) {
+                        eVisaConfigList.add(txt);
+                    }
+                }
 
                 // 特殊处理
                 if(textStr.indexOf("1")>=0){
@@ -114,6 +170,40 @@ public class PDFUtils {
                         eVisaConfigList.add(txt);
                     }
                 }
+                if (textStr.contains("✹")) {
+                    String textString = textStr.substring(textStr.indexOf("✹") + 1);
+                    if (textString.contains("||✹")) {
+                        String[] textS1 = Func.toStrArray("\\|\\|✹",textString);
+                        for(String txt : textS1){
+                            for (int i = 0; i < txt.length(); i++) {
+                                if (!Character.isDigit(txt.charAt(i))) {
+                                    txt=txt.substring(0,i);
+                                }
+                            }
+                            if (txt.length() >= 15 && Func.isNumeric(txt)||(Func.isNumeric(txt)&&txt.length()==8&&txt.startsWith("123"))) {
+                                eVisaConfigList.add("✹" + txt);
+                            }
+                        }
+                    }
+                    if (textString.contains("*✹")) {
+                        String[] textS1 = Func.toStrArray("\\*✹",textString);
+                        for(String txt : textS1){
+                            for (int i = 0; i < txt.length(); i++) {
+                                if (!Character.isDigit(txt.charAt(i))) {
+                                    txt=txt.substring(0,i);
+                                }
+                            }
+                            if (txt.length() >= 15 && Func.isNumeric(txt)||(Func.isNumeric(txt)&&txt.length()==8&&txt.startsWith("123"))) {
+                                eVisaConfigList.add("✹" + txt);
+                            }
+                        }
+                    }
+                    if(textString.startsWith("1")){
+                        if (textString.length() >= 15 && Func.isNumeric(textString)) {
+                            eVisaConfigList.add("✹" + textString);
+                        }
+                    }
+                }
             }
 
 

+ 3 - 2
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -37,7 +37,7 @@ import static java.math.BigDecimal.ROUND_HALF_UP;
 
 
 /**
- * @author yangyj
+ * @author yangyjT(com.mixsmart.utils.CustomFunction).dateAfter(T(com.mixsmart.utils.CustomFunction).dateMax(E['m_20220928150650_1575019183173795840:key_9']),28)
  */
 public class CustomFunction {
 
@@ -450,13 +450,14 @@ public class CustomFunction {
             List<String> result = new ArrayList<>();
             if(ListUtils.isNotEmpty(dateList)&&ListUtils.isNotEmpty(offSet)){
                 for(int i=0;i<dateList.size();i++){
-                    String d= dateList.get(i);
+                    String d= dateList.get(i).replaceAll("[\"']", "");;
                     if(StringUtils.isNotEmpty(d)) {
                         if(d.contains(",")){
                             String[] arr=d.replaceAll("[\\[\\]\\s]+","").split(",");
                             d=arr[arr.length-1];
                         }
                         Integer n = StringUtils.handObj2Integer(offSet.size() > i ? offSet.get(i) : offSet.getLast());
+                        // 日期需要正确的格式,需要判断
                         DateTime dt = new DateTime(d);
                         dt.offset(DateField.HOUR_OF_DAY, 24 * n);
                         result.add(dt.toString(DatePattern.CHINESE_DATE_PATTERN));

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/bean/TableInfo.java

@@ -23,6 +23,7 @@ public class TableInfo {
     private String contractId;
     private String classify;
     private String projectId;
+    private String isTypePrivatePid; //用于判断操作
     private String groupId = "0";
     // 用于实验
     private String testGroupId = "0";

+ 25 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -600,9 +600,7 @@ public class ExcelTabController extends BladeController {
                         if (titleName.equals(ysName)) {
                             lastName = elementInfo.getEName();
                             attrInfo = elementInfo.getEKey() + "__" + i + "_" + j;
-
                             filedType = WbsElementUtil.getInitTableFiledType(elementInfo.getEType());
-
                             filedLength = elementInfo.getELength().toString();
 
                             maxScore = 100;
@@ -1648,7 +1646,9 @@ public class ExcelTabController extends BladeController {
         //拿到所有的名字
         Set<String> strings = wbsTreeContractList.stream().map(o -> o.getNodeName()).collect(Collectors.toSet());
         //根据实际排序
-        List<WbsTreeContract> wbsTreeContractList2 = wbsTreeContractList.stream().sorted(Comparator.comparing(WbsTreeContract::getCreateTime)).collect(Collectors.toList());
+        boolean flag = wbsInfo.getNodeName().contains("_PL_");
+        List<WbsTreeContract> wbsTreeContractList2 = wbsTreeContractList.stream().filter(wbs -> flag || (wbs.getNodeName()!= null && !wbs.getNodeName().contains("_PL_")))
+                .sorted(Comparator.comparing(WbsTreeContract::getCreateTime)).collect(Collectors.toList());
         //如果数量对不上说明有错的情况就进来,进行修改,现在wbsTreeContractList2就是正常的
         if (strings.size() != wbsTreeContractList2.size()) {
             for (int i = 0; i < wbsTreeContractList2.size(); i++) {
@@ -1689,7 +1689,7 @@ public class ExcelTabController extends BladeController {
         String tabName = wbsTreeContract.getInitTableName();
         // 字段查询 并去掉公式字段
 
-        String colkeys = "SELECT GROUP_CONCAT(COLUMN_NAME) as colkeys from information_schema.COLUMNS c where c.table_name='" + tabName + "' and COLUMN_NAME not in('id','p_key_id')";
+        String colkeys = "SELECT GROUP_CONCAT(distinct COLUMN_NAME) as colkeys from information_schema.COLUMNS c where c.table_name='" + tabName + "' and COLUMN_NAME not in('id','p_key_id')";
         Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(colkeys);
         colkeys = stringObjectMap.get("colkeys") + "";
         // 复制表数据
@@ -1981,6 +1981,15 @@ public class ExcelTabController extends BladeController {
             dataArray.add(dataInfo);
         }
 
+        String singnType ="2";
+        if(dataInfo.containsKey("signType")){
+            singnType=dataInfo.getString("signType");
+        } else {
+            singnType = "";
+        }
+
+      //  dataInfo.getJSONObject("dataInfo").getJSONArray("orderList");
+
         JSONObject tableInfo1 = dataArray.getJSONObject(0);
         String nodeId = tableInfo1.getString("nodeId");
         String contractId = tableInfo1.getString("contractId");
@@ -2014,7 +2023,7 @@ public class ExcelTabController extends BladeController {
         }
         executionTime.info("----公式填充执行完毕----");
         //保存数据到数据库
-        R<Object> result = this.excelTabService.saveOrUpdateInfo(tableInfoList);
+        R<Object> result = this.excelTabService.saveOrUpdateInfo(tableInfoList,singnType);
         RandomNumberHolder.RandomTemplateTypeclear();
         RandomNumberHolder.RandomWbsTreeContractclear();
         executionTime.info("----数据保存结束----");
@@ -2024,15 +2033,21 @@ public class ExcelTabController extends BladeController {
         executionTime.info("----数据合并前----");
         List<String> errorPKeyIds = new ArrayList<>();
         //单个pdf加载
+        tableInfoList = (List<TableInfo>) result.getData();
         if (tableInfoList != null) {
+            String finalSingnType = singnType;
             tableInfoList.parallelStream().forEach(tableInfo -> {
                 R bussPdfInfo = null;
                 try {
-                    bussPdfInfo = excelTabService.getBussPdfInfo(Long.parseLong(tableInfo.getPkeyId()));
+                    if(finalSingnType.equals("1") && tableInfo.getProjectId().equals("1630011899725201410") && (tableInfo.getIsTypePrivatePid().equals("1559714325173080065") || tableInfo.getIsTypePrivatePid().equals("1559479719236702210") )){
+                        System.out.println("12312312");
+                    }else{
+                        bussPdfInfo = excelTabService.getBussPdfInfo(Long.parseLong(tableInfo.getPkeyId()));
+                    }
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
-                if (ObjectUtil.isEmpty(bussPdfInfo) || bussPdfInfo.getCode() != 200) {
+                if (bussPdfInfo!=null && (ObjectUtil.isEmpty(bussPdfInfo) || bussPdfInfo.getCode() != 200)) {
                     //如果返回的单张pdfUrl为空,那么表示发生异常,返回异常信息
                     errorPKeyIds.add(tableInfo.getPkeyId());
                 }
@@ -2265,7 +2280,7 @@ public class ExcelTabController extends BladeController {
         //公式填充
         this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeId), ExecuteType.INSPECTION);
         //保存数据到数据库
-        R<Object> result = this.excelTabService.saveOrUpdateInfo(tableInfoList);
+        R<Object> result = this.excelTabService.saveOrUpdateInfo(tableInfoList,"");
         if (!result.isSuccess()) {
             R.fail(result.getMsg());
             return;
@@ -4544,11 +4559,13 @@ public class ExcelTabController extends BladeController {
                         obj.put("projectId", projectId);
                         obj.put("isCollapseLoad", true);
                         obj.put("isRenderForm", true);
+                        obj.put("isTypePrivatePid", tab.getIsTypePrivatePid());
                         array.add(obj);
                     }
                 }
                 js2.put("orderList", array);
                 js.put("dataInfo", js2);
+                js.put("signType", "1");
                 this.saveBussData2(js);
             }
         } catch (Exception e) {

+ 8 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java

@@ -38,6 +38,7 @@ import org.springblade.manager.service.IWbsTreePrivateService;
 import org.springblade.manager.utils.ExcelInfoUtils;
 import org.springblade.manager.utils.FileUtils;
 import org.springblade.manager.utils.RandomNumberHolder;
+import org.springblade.manager.vo.AppWbsTreeContractVO;
 import org.springblade.manager.vo.TrialSelfDataRecordVO1;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -884,4 +885,11 @@ public class ExcelTabClientImpl implements ExcelTabClient {
         return R.data(resultMapList);
     }
 
+    @Override
+    public R synPdfKeyInfo(String contractId, String nodeIds, String classify, String projectId, String authorization) throws Exception {
+
+        excelTabService.synPdfKeyInfo(nodeIds, classify, contractId, projectId);
+        return R.success("成功");
+    }
+
 }

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaMileage.java

@@ -114,8 +114,8 @@ public class FormulaMileage implements FormulaStrategy {
                     e.setUpdate(1);
                     e.setFinished(Boolean.TRUE);
                 });
-                forG10(mileageList, tec);
             }
+            forG10(mileageList, tec);
 
         }
         cur.setFinished(Boolean.TRUE);

+ 7 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml

@@ -437,7 +437,13 @@
     <select id="updateAllNodeTabById" resultType="org.springblade.manager.entity.WbsTreeContract">
         update m_wbs_tree_contract
         set excel_id= #{aPrivate.excelId},
-            node_name = #{aPrivate.nodeName},
+            node_name = CASE
+                            WHEN LOCATE('_PL_', node_name) > 0 THEN
+                                CONCAT( #{aPrivate.nodeName}, SUBSTRING(node_name, LOCATE('_PL_', node_name), LENGTH(node_name)))
+                            WHEN LOCATE('__', node_name) > 0 THEN
+                                CONCAT( #{aPrivate.nodeName},  SUBSTRING(node_name, LOCATE('__', node_name), LENGTH(node_name)))
+                            ELSE #{aPrivate.nodeName}
+                END,
             full_name = #{aPrivate.fullName},
             init_table_name = #{aPrivate.initTableName},
             is_link_table = 2,

+ 3 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java

@@ -106,7 +106,7 @@ public interface IExcelTabService extends BaseService<ExcelTab> {
     /**
      * 结果信息持久化
      */
-    R<Object> saveOrUpdateInfo(List<TableInfo> tableInfoList) throws SQLException;
+    R<Object> saveOrUpdateInfo(List<TableInfo> tableInfoList,String singType) throws SQLException;
 
     Map<String, String> getTablbCols(String pkeyid, String colkey) throws FileNotFoundException;
 
@@ -122,6 +122,8 @@ public interface IExcelTabService extends BaseService<ExcelTab> {
     // 多个pdf 合并
     void getBussPdfs(String nodeId, String classify, String contractId, String projectId) throws Exception;
 
+    void synPdfKeyInfo(String nodeId, String classify, String contractId, String projectId) throws Exception;
+
     // 试验
 
     /**

+ 8 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -431,13 +431,15 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
                             queryInfoList = JSON.parseArray(dataInformationQuery.toString(), WbsTreeContractLazyQueryInfoVO.class);
                         } else {
                             if (cn.hutool.core.util.ObjectUtil.isEmpty(tableOwner)) {
-                                queryInfoList = jdbcTemplate.query("select wbs_id,status from u_information_query where type = 1 and contract_id = " + contractId, new BeanPropertyRowMapper<>(WbsTreeContractLazyQueryInfoVO.class));
+                                queryInfoList = jdbcTemplate.query("select wbs_id,status from u_information_query where id in (SELECT id from (SELECT max(id) as id FROM u_information_query WHERE is_deleted = 0 AND type = 1 AND contract_id = ? GROUP BY wbs_id ) as a)"
+                                        , new BeanPropertyRowMapper<>(WbsTreeContractLazyQueryInfoVO.class), contractId);
                                 if (queryInfoList.size() > 0) {
                                     JSONArray array = JSONArray.parseArray(JSON.toJSONString(queryInfoList));
                                     redisTemplate.opsForValue().set("blade-manager::contract:wbstree:byInformationQuery:" + contractId + "_1", JSON.toJSON(array).toString());
                                 }
                             } else {
-                                queryInfoList = jdbcTemplate.query("select wbs_id,status from u_information_query where type = 1 and contract_id = " + contractId + " and classify = " + tableOwner, new BeanPropertyRowMapper<>(WbsTreeContractLazyQueryInfoVO.class));
+                                queryInfoList = jdbcTemplate.query("select wbs_id,status from u_information_query where id in (SELECT id from (SELECT max(id) as id FROM u_information_query WHERE is_deleted = 0 AND type = 1 AND contract_id = ? AND classify = ? GROUP BY wbs_id) as a)"
+                                        , new BeanPropertyRowMapper<>(WbsTreeContractLazyQueryInfoVO.class), contractId,tableOwner);
                                 if (queryInfoList.size() > 0) {
                                     JSONArray array = JSONArray.parseArray(JSON.toJSONString(queryInfoList));
                                     redisTemplate.opsForValue().set("blade-manager::contract:wbstree:byInformationQuery:" + contractId + "_" + tableOwner, JSON.toJSON(array).toString());
@@ -576,13 +578,15 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
                                 queryInfoList = JSON.parseArray(dataInformationQuery.toString(), WbsTreeContractLazyQueryInfoVO.class);
                             } else {
                                 if (cn.hutool.core.util.ObjectUtil.isEmpty(tableOwner)) {
-                                    queryInfoList = jdbcTemplate.query("select wbs_id,status from u_information_query where type = 1 and contract_id = " + contractRelationJlyz.getContractIdSg(), new BeanPropertyRowMapper<>(WbsTreeContractLazyQueryInfoVO.class));
+                                    queryInfoList = jdbcTemplate.query("select wbs_id,status from u_information_query where id in (SELECT id from (SELECT max(id) as id FROM u_information_query WHERE is_deleted = 0 AND type = 1 AND contract_id = ? GROUP BY wbs_id) as a)"
+                                            , new BeanPropertyRowMapper<>(WbsTreeContractLazyQueryInfoVO.class), contractRelationJlyz.getContractIdSg());
                                     if (queryInfoList.size() > 0) {
                                         JSONArray array = JSONArray.parseArray(JSON.toJSONString(queryInfoList));
                                         redisTemplate.opsForValue().set("blade-manager::contract:wbstree:byInformationQuery:" + contractRelationJlyz.getContractIdSg() + "_1", JSON.toJSON(array).toString());
                                     }
                                 } else {
-                                    queryInfoList = jdbcTemplate.query("select wbs_id,status from u_information_query where type = 1 and contract_id = " + contractRelationJlyz.getContractIdSg() + " and classify = " + tableOwner, new BeanPropertyRowMapper<>(WbsTreeContractLazyQueryInfoVO.class));
+                                    queryInfoList = jdbcTemplate.query("select wbs_id,status from u_information_query where id in (SELECT id from (SELECT max(id) as id FROM u_information_query WHERE is_deleted = 0 AND type = 1 AND contract_id = ? AND classify = ? GROUP BY wbs_id) as a)"
+                                            , new BeanPropertyRowMapper<>(WbsTreeContractLazyQueryInfoVO.class), contractRelationJlyz.getContractIdSg(), tableOwner);
                                     if (queryInfoList.size() > 0) {
                                         JSONArray array = JSONArray.parseArray(JSON.toJSONString(queryInfoList));
                                         redisTemplate.opsForValue().set("blade-manager::contract:wbstree:byInformationQuery:" + contractRelationJlyz.getContractIdSg() + "_" + tableOwner, JSON.toJSON(array).toString());

+ 165 - 22
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -1207,7 +1207,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
     }
 
     @Override
-    public R<Object> saveOrUpdateInfo(List<TableInfo> tableInfoList) {
+    public R<Object> saveOrUpdateInfo(List<TableInfo> tableInfoList,String sigType) {
+        List<TableInfo> tableInfoList2 = new ArrayList<>();
         String fileName1="";
         if (ListUtils.isNotEmpty(tableInfoList)) {
             //施工资料填报
@@ -1221,6 +1222,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     if (wbsTreeContract == null) {
                         continue;
                     }
+                    tableInfo.setIsTypePrivatePid(wbsTreeContract.getExcelId()+"");
+                    tableInfoList2.add(tableInfo);
                     pkids += tableInfo.getPkeyId() + ",";
                     String tabName = wbsTreeContract.getInitTableName();
                     // 判读修改还是 添加
@@ -1276,9 +1279,14 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                         sb.append(tableInfo.getPkeyId());sb.append(",");sb.append(user.getUserId());
                         sb.append(","); sb.append("SYSDATE()");sb.append(",\"");sb.append(sqlInfoNew);
                         sb.append("\")");
-                        jdbcTemplate.execute(delSql);
-                        jdbcTemplate.execute(sqlInfo);
-                        jdbcTemplate.execute(sb.toString());
+
+                        if(sigType.equals("1") && wbsTreeContract.getProjectId().equals("1630011899725201410") && (tableInfo.getIsTypePrivatePid().equals("1559714325173080065") || tableInfo.getIsTypePrivatePid().equals("1559479719236702210") )){
+                            System.out.println("123");
+                        }else{
+                            jdbcTemplate.execute(delSql);
+                            jdbcTemplate.execute(sqlInfo);
+                            jdbcTemplate.execute(sb.toString());
+                        }
                         transactionManager1.commit(transactionStatus);
                     } catch (Exception e) {
                         transactionManager1.rollback(transactionStatus);
@@ -1327,7 +1335,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 return R.fail(reason(log.toString()));
             }
         }
-        return R.success(fileName1);
+       return R.data(tableInfoList2);
+       // return R.success(fileName1);
     }
 
     public String reason(String log) {
@@ -1991,7 +2000,33 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         }
         return reData;
     }
+    public static String convertToYMD(String input) {
+        if (input == null || input.isEmpty()) return "";
 
+        try {
+            Date date;
+
+            // 尝试多种格式
+            if (input.matches("\\d{4}-\\d{2}-\\d{2}")) {
+                date = new SimpleDateFormat("yyyy-MM-dd").parse(input);
+            } else if (input.matches("\\d{4}/\\d{2}/\\d{2}")) {
+                date = new SimpleDateFormat("yyyy/MM/dd").parse(input);
+            } else if (input.matches("\\d{4}年\\d{1,2}月\\d{1,2}日")) {
+                date = new SimpleDateFormat("yyyy年MM月dd日").parse(input);
+            } else if (input.matches("\\d{8}")) {
+                date = new SimpleDateFormat("yyyyMMdd").parse(input);
+            } else if (input.contains("T") && input.contains(":")) {
+                date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").parse(input.replaceAll("Z$", "+0800"));
+            } else {
+                throw new IllegalArgumentException("Unsupported date format: " + input);
+            }
+
+            return new SimpleDateFormat("yyyy-MM-dd").format(date);
+
+        } catch (Exception e) {
+            return "";
+        }
+    }
     @Override
     public R getBussPdfInfo(Long pkeyId) throws Exception {
         String file_path = FileUtils.getSysLocalFileUrl();
@@ -2101,6 +2136,9 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 }
             }
         }
+        Boolean dateFlag=true;
+        String firstDate="";
+        List<String>dateKeyNames=new ArrayList<>();
         //数据不为空
         if (StringUtils.isNotEmpty(wbsTreeContract.getHtmlUrl())) {
             InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(wbsTreeContract.getHtmlUrl());
@@ -2110,12 +2148,13 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             Document doc = Jsoup.parse(htmlString);
             Element table = doc.select("table").first();
             //计算填报率
-            List<String> keyList = table.getElementsByAttribute("v-model").stream()
+            List<String> keyList = table.getElementsByAttribute("keyname")
+                    .stream().filter(k->k.attr("v-model").indexOf("\\.")>=0)
                     .map(l -> {
                         String attr = l.attr("v-model");
                         System.out.println(attr);
-                        String[] split = attr.split("\\.");
-                        return split[1];
+                            String[] split = attr.split("\\.");
+                            return split[1];
                     })
                     .collect(Collectors.toList());
             Long sigSize = table.getElementsByAttribute(":readonly").stream().count();
@@ -2131,7 +2170,27 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     realFillRate = v.intValue();
                 }
             }
-
+            Elements dateElements = doc.select("el-date-picker");
+            if(!dateElements.isEmpty()){
+                for (Element element : dateElements) {
+                    String keyname = element.attr("keyname");
+                    dateKeyNames.add(keyname);
+                    if(!DataInfo.containsKey(keyname)||(StringUtils.isEmpty(DataInfo.get(keyname).toString()))){
+                        dateFlag=false;
+                    }
+                }
+                if(dateFlag){
+                   if(!dateKeyNames.isEmpty()){
+                       for (int i = 0; i < dateKeyNames.size(); i++) {
+                           firstDate=DataInfo.get(dateKeyNames.get(i)).toString();
+                           firstDate=convertToYMD(firstDate);
+                           if(StringUtils.isNotEmpty(firstDate)){
+                               break;
+                           }
+                       }
+                   }
+                }
+            }
             Elements trs = table.select("tr");
             if (ObjectUtil.isNotEmpty(DataInfo)) {
                 for (String val : DataInfo.keySet()) {
@@ -2140,7 +2199,6 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     if (datas.size() >= 1) {
                         data = datas.get(0);
                     }
-
                     if (data != null) {
                         if (data.hasAttr("x1") && data.hasAttr("y1")) {
                             int x1 = 0;
@@ -2288,10 +2346,36 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     }
                 }
             }
+
+
             // 组装电签设置
             Elements dqids = table.getElementsByAttribute("dqid");
+            // 电签组装2
+            String tableName = wbsTreeContract.getInitTableName();
+            String dqSql = "select * from u_sign_key_role_info where tab_en_name='"+tableName+"'";
+            List<Map<String, Object>> mapList = jdbcTemplate.queryForList(dqSql);
+
+            if(mapList!=null && mapList.size()>0){
+                for(Map<String, Object> map : mapList) {
+                    Elements elementsBy = table.getElementsByAttributeValueStarting("keyname", map.get("e_key") + "");
+                    if(elementsBy!=null && elementsBy.size()>0){
+                        for(Element element : elementsBy){
+                            element.attr("sign_type", "✹"+map.get("id"));
+                            dqids.add(element);
+                        }
+                    }
+
+                }
+            }
+
             for (Element element : dqids) {
-                String dqid = element.attr("dqid");
+                String dqid="";
+                if(element.hasAttr("sign_type")){
+                    dqid = element.attr("sign_type");
+                }else{
+                    dqid = element.attr("dqid");
+                }
+
                 Elements x11 = element.getElementsByAttribute("x1");
                 if (x11 != null && x11.size() >= 1) {
                     Element element1 = x11.get(x11.size() - 1);
@@ -2324,15 +2408,19 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                 for (int i = 0; i < xssfRichTextString.numFormattingRuns(); i++) {
                                     XSSFFont runFont = xssfRichTextString.getFontOfFormattingRun(i);
                                     Font font = workbook.createFont();
-                                    font.setColor(runFont.getXSSFColor().getIndexed());
-                                    font.setFontHeightInPoints(runFont.getFontHeightInPoints());
-                                    font.setBold(runFont.getBold());
-                                    font.setItalic(runFont.getItalic());
-                                    font.setUnderline(runFont.getUnderline());
-                                    font.setTypeOffset(runFont.getTypeOffset());
-                                    font.setCharSet(runFont.getCharSet());
-                                    font.setStrikeout(runFont.getStrikeout());
-                                    font.setFontName(runFont.getFontName());
+                                    if (runFont!=null&&font != null) {
+                                        if(runFont.getXSSFColor()!=null){
+                                            font.setColor(runFont.getXSSFColor().getIndexed());
+                                        }
+                                        font.setFontHeightInPoints(runFont.getFontHeightInPoints());
+                                        font.setBold(runFont.getBold());
+                                        font.setItalic(runFont.getItalic());
+                                        font.setUnderline(runFont.getUnderline());
+                                        font.setTypeOffset(runFont.getTypeOffset());
+                                        font.setCharSet(runFont.getCharSet());
+                                        font.setStrikeout(runFont.getStrikeout());
+                                        font.setFontName(runFont.getFontName());
+                                    }
                                     int startIdx = xssfRichTextString.getIndexOfFormattingRun(i);
                                     int endIdx = Math.min(startIdx + xssfRichTextString.getLengthOfFormattingRun(i), existingValue.length());
                                     //根据原有值的长度,起始位置和结束位置设置成原有的文本格式
@@ -2355,6 +2443,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     }
                 }
             }
+
         }
 
         //输出流
@@ -2415,12 +2504,39 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         updateWrapper.in("p_key_id", pkeyId + "");
         updateWrapper.set("pdf_url", fileUrl);
         updateWrapper.set("real_fill_rate", realFillRate);
+        updateWrapper.set("date_is_complete", dateFlag?1:2);
         wbsTreeContractService.update(updateWrapper);
+        //
+        String sql="SELECT parent.* FROM m_wbs_tree_contract child JOIN m_wbs_tree_contract parent ON child.p_id = parent.p_key_id WHERE child.p_key_id ="+pkeyId+" AND child.contract_id = parent.contract_id AND child.project_id = parent.project_id";
+        List<WbsTreeContract> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+        if(!query.isEmpty()){
+            WbsTreeContract contract = query.get(0);
+            contract.setDateIsComplete(dateFlag?1:2);
+            String ancestorsPId = contract.getAncestorsPId();
+            if (ancestorsPId.startsWith("0,")) {
+                ancestorsPId = ancestorsPId.substring(2);
+            }
+            ancestorsPId=ancestorsPId+","+contract.getPKeyId();
+            List<Long> longList = Arrays.stream(ancestorsPId.split(","))
+                    .map(Long::valueOf)
+                    .collect(Collectors.toList());
+            UpdateWrapper<WbsTreeContract> updateWrapper1 = new UpdateWrapper<>();
+            updateWrapper1.in("p_key_id", longList);
+            updateWrapper1.set("date_is_complete",contract.getDateIsComplete());
+            wbsTreeContractService.update(updateWrapper1);
+            if(StringUtils.isNotEmpty(firstDate)){
+                Integer classify =
+                        Arrays.asList("1", "2", "3").contains(contract.getTableOwner()) ? 1 :
+                                Arrays.asList("4", "5", "6").contains(contract.getTableOwner()) ? 2 : 1;
+                String updateQuery="update u_information_query set business_time= '"+firstDate+"' where wbs_id="+contract.getPKeyId()+" and classify="+classify;
+                jdbcTemplate.update(updateQuery);
+            }
+        }
+
 
         //关闭流
         IoUtil.closeQuietly(outputStream);
         IoUtil.closeQuietly(exceInp);
-
         return R.data(fileUrl);
     }
 
@@ -2460,7 +2576,9 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             //资料填报原始pdf合并
             FileUtils.mergePdfPublicMethods(data, listPdf);
             BladeFile bladeFile = this.newIOSSClient.uploadFile(nodeId + ".pdf", listPdf);
-
+            if(bladeFile == null){
+                System.out.println("Oss上传失败");
+            }
             //获取当前填报节点sort
             System.out.println("pdfs__"+listPdf+"___"+bladeFile);
             WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, nodeId));
@@ -5004,4 +5122,29 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         }
     }
 
+    @Override
+    public void synPdfKeyInfo(String nodeId, String classify, String contractId, String projectId) throws Exception {
+        // 获取有权限的节点信息
+        List<AppWbsTreeContractVO> wbsTreeContractList = wbsTreeContractService.searchNodeAllTable(nodeId, classify, contractId, projectId, null);
+        List<String> data = new ArrayList<>();
+        if (nodeId.indexOf(":") >= 0) {
+            nodeId = nodeId.split(":")[0];
+        }
+        if (wbsTreeContractList != null && wbsTreeContractList.size() >= 1) {
+            for (WbsTreeContract wbsInfo : wbsTreeContractList) {
+                // 隐藏的不生成pdf
+                if (StringUtils.isNotEmpty(wbsInfo.getPdfUrl())) {
+                    data.add(wbsInfo.getPdfUrl());
+                } else {
+                    R bussPdfInfo = this.getBussPdfInfo(wbsInfo.getPKeyId());
+                    if (bussPdfInfo.getCode() == 200) {
+                        if (StringUtils.isNotBlank(bussPdfInfo.getData() + "")) {
+                            data.add(bussPdfInfo.getData() + "");
+                        }
+                    }
+                }
+            }
+        }
+        //
+    }
 }

+ 131 - 11
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -50,10 +50,7 @@ import org.springblade.manager.mapper.FormulaMapper;
 import org.springblade.manager.mapper.WbsTreeContractMapper;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.*;
-import org.springblade.manager.utils.AmountToChineseConverter;
-import org.springblade.manager.utils.FileUtils;
-import org.springblade.manager.utils.PeriodContractUtil;
-import org.springblade.manager.utils.RandomNumberHolder;
+import org.springblade.manager.utils.*;
 import org.springblade.manager.vo.*;
 import org.springblade.meter.entity.*;
 import org.springblade.meter.feign.*;
@@ -95,6 +92,8 @@ import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 import java.util.stream.Stream;
 
+import static org.springblade.manager.utils.TableCoordinates.*;
+
 /**
  * @author yangyj
  * @Date 2022/6/9 14:29
@@ -335,7 +334,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             if (tec.getTableAll().stream().anyMatch(e -> StringUtils.isEquals(e.getTableType(), 5))) {
                 /*评定节点*/
                 FormulaDataBlock fdb = findFdb(tec);
-                if (!StringUtils.isEquals("[]", fdb.getVal())) {
+                if (!StringUtils.isEquals("[]", fdb.getVal())) { //不等于[]
                     List<ElementBlock> elementBlockList = JSON.parseArray(fdb.getVal(), ElementBlock.class);
                     Map<String, Map<String, Set<Long>>> traceMap = new HashMap<>();
                     Map<String, List<ElementBlock>> tableElementMap = new HashMap<>();
@@ -5444,8 +5443,8 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         if (StringUtils.isNumber(pkeyId)) {
             /*节点信息*/
             WtcEva wtcEva = this.getSqlOne(
-                    "select b.tree_code treeCode ,a.contract_id contractId,a.init_table_name initTableName,a.html_url htmlUrl ,a.node_name nodeName ,a.parent_id parentId " +
-                            "from m_wbs_tree_contract a join m_wbs_tree_contract b on (a.parent_id=b.id and a.contract_id=b.contract_id) where a.p_key_id ="
+                    "select b.p_id as PId,b.tree_code treeCode ,a.contract_id contractId,a.init_table_name initTableName,a.html_url htmlUrl ,a.node_name nodeName ,a.parent_id parentId " +
+                            "from m_wbs_tree_contract a join m_wbs_tree_contract b on (a.p_id=b.p_key_id and a.contract_id=b.contract_id) where a.p_key_id ="
                             + pkeyId, WtcEva.class);
             try {
                 if (wtcEva.isEva()) {
@@ -5456,11 +5455,13 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                         FB02 fb02 = new FB02(processFds);
                         if (fb02.checked()) {
                             /*swId是分项评定的父节点Id*/
-                            List<FormulaDataBlock> formulaDataBlocks = this.getSqlList("select a.id,a.type,a.sw_id swId,a.contract_id contractId,a.val from m_formula_data_block a join (select parent_id from m_wbs_tree_contract where tree_code like '" + treeCode.getLast() + "%' and contract_id =" + wtcEva.getContractId() + " and major_data_type=2 and is_deleted=0 ORDER BY tree_code)b on a.sw_id=b.parent_id ", FormulaDataBlock.class);
-                            if (formulaDataBlocks != null && formulaDataBlocks.size() > 0) {
 
-                                /*就是分项工程节点的父节点名称*/
+                          ///  List<FormulaDataBlock> formulaDataBlocks = this.getSqlList("select DISTINCT a.id,a.type,a.sw_id swId,a.contract_id contractId,a.val from m_formula_data_block a,m_wbs_tree_contract b where a.sw_id=b.parent_id and b.contract_id ="+wtcEva.getContractId()+" and b.major_data_type=2 and b.is_deleted=0 and b.ancestors_p_id like '%"+wtcEva.getPId()+"%' ORDER BY b.sort ", FormulaDataBlock.class);
 
+                            // 每次需要依赖于treeCode值
+                            // List<FormulaDataBlock> formulaDataBlocks = this.getSqlList("select DISTINCT a.id,a.type,a.sw_id swId,a.contract_id contractId,a.val from m_formula_data_block a join (select parent_id from m_wbs_tree_contract where tree_code like '" + treeCode.getLast() + "%' and contract_id =" + wtcEva.getContractId() + " and major_data_type=2 and is_deleted=0 ORDER BY tree_code)b on a.sw_id=b.parent_id ", FormulaDataBlock.class);
+                            /*if (formulaDataBlocks != null && formulaDataBlocks.size() > 0) {
+                                *//*就是分项工程节点的父节点名称*//*
                                 String swIds = formulaDataBlocks.stream().map(FormulaDataBlock::getSwId).map(Objects::toString).collect(Collectors.joining(","));
                                 List<Map<String, Object>> listMaps = this.jdbcTemplate.queryForList("select id ,node_name nodeName,full_name fullName  from m_wbs_tree_contract where is_deleted =0 and contract_id=" + wtcEva.getContractId() + " and id in(" + swIds + ")");
                                 Map<String, String> swNameMap = new HashMap<>();
@@ -5468,10 +5469,11 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                     swNameMap.putAll(listMaps.stream().collect(Collectors.toMap(m -> m.get("id").toString(), m -> m.get("fullName").toString(), (v1, v2) -> v2)));
                                 }
                                 fb02.source(formulaDataBlocks, swNameMap);
+
                                 if (fb02.getDatas().size() > 0) {
                                     Map<String, String> tableKeysCoordsMap = FormulaUtils.getElementCell(wtcEva.getHtmlUrl());
                                     if (fb02.initFdCoords(tableKeysCoordsMap)) {
-                                        /*根据数据长度,增减页数*/
+                                        *//*根据数据长度,增减页数*//*
                                         List<WbsTreeContract> wtcList = this.adjustPageSize(fb02.getPageNum(), wtcEva, processFds);
                                         if (fb02.flush(wtcList)) {
                                             this.jdbcTemplate.batchUpdate(fb02.getSql(), fb02.getParams());
@@ -5479,7 +5481,86 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                         }
                                     }
                                 }
+                            }*/
+
+                            // 重新优化
+                           // String contSql = "SELECT p_key_id as pKeyId,node_name as fullName,init_table_name as initTableName,html_url as htmlUrl from m_wbs_tree_contract a where a.p_id in( select p_key_id  from m_wbs_tree_contract b where  b.contract_id ="+wtcEva.getContractId()+"  and b.major_data_type=2 and b.is_deleted=0 and b.ancestors_p_id like '%"+wtcEva.getPId()+"%' ) and a.type=2 and node_name not like '%附表%' and LENGTH(a.html_url)>=10 and init_table_name is not null ";
+                            String contSql = "SELECT p_key_id as pKeyId,p_id as pId,IFNULL(if(length(trim(full_name))>0, full_name, node_name), node_name) AS fullName,init_table_name as partitionCode,html_url as oldId,type,major_data_type as majorDataType from m_wbs_tree_contract where is_deleted=0 and ancestors_p_id like '%"+wtcEva.getPId()+"%' and contract_id ="+wtcEva.getContractId()+"  ORDER BY sort ,full_name ";
+                            List<WbsTreeContractLazyVO> allNode = this.getSqlList(contSql, WbsTreeContractLazyVO.class);
+                            List<WbsTreeContractLazyVO> conNode= getAllChildNodesWithStream(wtcEva.getPId()+"",allNode);
+                            //将conNode 转成Map对象
+                            Map<Long, WbsTreeContractLazyVO> map = conNode.stream().collect(Collectors.toMap(WbsTreeContractLazyVO::getPKeyId, WbsTreeContractLazyVO -> WbsTreeContractLazyVO));
+                            List<WbsTreeContractLazyVO> tableInfo = new ArrayList<>();
+                           // String nodeName = "";
+                            for (WbsTreeContractLazyVO info : conNode) {
+                                /*if(info.getType()==1 && (info.getPId()+"").equals(wtcEva.getPId()+"") ){
+                                    nodeName=info.getFullName();
+                                }*/
+                                if(info.getType()==2){
+                                    WbsTreeContractLazyVO wbsTreeContractLazyVO = map.get(info.getPId());
+                                  //  if(wbsTreeContractLazyVO!=null && wbsTreeContractLazyVO.getMajorDataType()!=null && wbsTreeContractLazyVO.getMajorDataType()==2 && info.getFullName().indexOf("附表")<0 && (info.getPKeyId()+"").equals("1861674943318589443")){
+                                    if(wbsTreeContractLazyVO!=null && wbsTreeContractLazyVO.getMajorDataType()!=null && wbsTreeContractLazyVO.getMajorDataType()==2 && info.getFullName().indexOf("附表")<0 ){
+                                        WbsTreeContractLazyVO wbsTreeC = map.get(wbsTreeContractLazyVO.getPId());
+                                        info.setTitle(wbsTreeC.getFullName());
+                                        tableInfo.add(info);
+                                      //  System.out.println("---------"+nodeName+"   "+info.getFullName());
+                                    }
+                                }
+                              //  System.out.println(info.getFullName());
+                            }
+                            System.out.println("tableInfo:"+tableInfo);
+                            for (WbsTreeContractLazyVO info : tableInfo) {
+                                String htmlUrl = info.getOldId();
+                                String tableName = info.getPartitionCode();
+                                String pkeId = info.getPKeyId()+"";
+                                Map<String, String> datainfo = getTableDataInfo(pkeId, tableName);
+                                TableCoordinates data = new TableCoordinates();
+                                if(pkeId.equals("1861674943318589443")){
+                                    System.out.println("123");
+                                }
+                                System.out.println("-------"+htmlUrl);
+                                List<String> datt = data.getHtmlDataInfo(htmlUrl);
+
+                                for (String d : datt) {
+                                    String[] split = d.split("_\\*_");
+                                    String hekey = split[0];
+                                    String name = split[1];
+                                    String hegezhi = split[3];
+                                    String hevalue = datainfo.get(hekey);
+                                    Item02 xm = new Item02();
+                                    xm.setName(name);
+                                    xm.setSubItem(info.getTitle());
+
+                                    if(name.contains("△")){
+                                        xm.setWeight(2);
+                                    }else{
+                                        xm.setWeight(1);
+                                    }
+                                    String fsValue = datainfo.get(hegezhi);
+                                    if( Func.isNotEmpty(fsValue) && fsValue.length()>=1){
+                                        xm.setPassRate(Func.toDouble(fsValue));
+                                    }
+
+                                    if( Func.isNotEmpty(hevalue) && hevalue.equals("合格")){
+                                        fb02.getDatas().add(xm);
+                                    }
+
+
+                                    System.out.println(hevalue);
+                                }
                             }
+
+                            if (fb02.getDatas().size() > 0) {
+                                Map<String, String> tableKeysCoordsMap = FormulaUtils.getElementCell(wtcEva.getHtmlUrl());
+                                if (fb02.initFdCoords(tableKeysCoordsMap)) {  /*根据数据长度,增减页数*/
+                                    List<WbsTreeContract> wtcList = this.adjustPageSize(fb02.getPageNum(), wtcEva, processFds);
+                                    if (fb02.flush(wtcList)) {
+                                        this.jdbcTemplate.batchUpdate(fb02.getSql(), fb02.getParams());
+                                        return R.success("成功");
+                                    }
+                                }
+                            }
+
                         }
                     } else if (FB01.TABLE_NAME.equals(wtcEva.getInitTableName())) {
                         FB01 fb01 = new FB01(processFds);
@@ -5638,6 +5719,44 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         return R.fail("无数据");
     }
 
+
+    // 获取所有子节点
+    public List<WbsTreeContractLazyVO> getAllChildNodesWithStream(String parentId, List<WbsTreeContractLazyVO> allNodes) {
+        List<WbsTreeContractLazyVO> children = new ArrayList<>();
+
+        // 筛选直接子节点
+        List<WbsTreeContractLazyVO> directChildren = allNodes.stream()
+                .filter(node -> parentId.equals(node.getPId()+""))
+                .collect(Collectors.toList());
+
+        // 递归处理每个子节点
+        for (WbsTreeContractLazyVO child : directChildren) {
+            children.add(child);
+            children.addAll(getAllChildNodesWithStream(child.getPKeyId()+"", allNodes));
+        }
+
+        return children;
+    }
+
+    public Map<String, String> getTableDataInfo(String PkeyId,String tableName) {
+        String sql = "select * from " + tableName +" where p_key_id="+PkeyId;
+        List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql);
+        Map<String, String> remap = new HashMap<>();
+        for (Map<String, Object> map : mapList) {
+            for (String key : map.keySet()) {
+                String[] keyData = (map.get(key)+"").split("☆");
+                if(keyData!=null && keyData.length>=1){
+                    for(String keyData1:keyData){
+                        if(keyData1.indexOf("_^_")>=0){
+                            String[] keyData2 = keyData1.split("_\\^_");
+                            remap.put(key+"__"+keyData2[1], keyData2[0]);
+                        }
+                    }
+                }
+            }
+        }
+        return remap;
+    }
     public Map<String, String> getWtpParent(String meterType, String projectId) {
         Map<String, Object> map = this.jdbcTemplate.queryForMap("select id,wbs_id wbsId,CONCAT(ancestors,',',p_key_id) path from  m_wbs_tree_private a  where a.node_name=? and a.project_id=?", meterType, projectId);
         Map<String, String> result = new HashMap<>();
@@ -6497,4 +6616,5 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         }
         return wbsTreeContract;
     }
+    
 }

+ 33 - 27
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -652,35 +652,39 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             // 如果 sort 相同,比较 nodeName
             String name1 = o1.getNodeName();
             String name2 = o2.getNodeName();
-            boolean flag=false;
-            boolean hasUnderscore1 = name1.contains("__");
-            boolean hasUnderscore2 = name2.contains("__");
-            if(name1.contains("PL")&&name2.contains("PL")){
-                flag=true;
-            }
-            if(flag){
-                int number1 = getPLNumberAfterUnderscore(name1);
-                int number2 = getPLNumberAfterUnderscore(name2);
-                return Integer.compare(number1, number2);
-            }
-            if (!hasUnderscore1 && !hasUnderscore2) {
-                // 两个都不包含 __,按字母顺序排序
-                return name1.compareTo(name2);
-            } else if (!hasUnderscore1) {
-                // 第一个不包含 __,排在前面
-                return -1;
-            } else if (!hasUnderscore2) {
-                // 第二个不包含 __,排在前面
-                return 1;
+            String[] split1 = name1.split("__");
+            String[] split2 = name2.split("__");
+            if (split1[0].equals(split2[0])) {
+                try {
+                    return compareTo(split1, split2);
+                } catch (NumberFormatException e) {
+                    // 如果无法将字符串转换为数字,则按照字符串比较
+                    return name1.compareTo(name2);
+                }
+            } else {
+                split1 = split1[0].split("_PL_");
+                split2 = split2[0].split("_PL_");
+                try {
+                    return compareTo(split1, split2);
+                } catch (NumberFormatException e) {
+                    return name1.compareTo(name2);
+                }
             }
-            else {
-                // 两个都包含 __,按 __ 后面的数字排序
-                int number1 = getNumberAfterUnderscore(name1);
-                int number2 = getNumberAfterUnderscore(name2);
+        }
+
+        private static int compareTo(String[] split1, String[] split2) {
+            if (split1.length > 1 && split2.length > 1) {
+                int number1 = Integer.parseInt(split1[1]);
+                int number2 = Integer.parseInt(split2[1]);
                 return Integer.compare(number1, number2);
+            } else if (split1.length == 1 && split2.length == 1) {
+                return 0;
+            } else if (split1.length > 1) {
+                return 1;
+            } else {
+                return -1;
             }
         }
-
         private int getNumberAfterUnderscore(String name) {
             String[] parts = name.split("__");
             if (parts.length > 1) {
@@ -1735,7 +1739,9 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                     }
                                 }
                             }
-                            if (ObjectUtil.isNotEmpty(vo.getDataLength()) && vo.getDataLength() > 250 && vo.getDataLength() <= 500) {
+
+                            // 此逻辑不符合
+                            /*if (ObjectUtil.isNotEmpty(vo.getDataLength()) && vo.getDataLength() > 250 && vo.getDataLength() <= 500) {
                                 Integer length = keyLengthMaps.get(vo.getKey());
                                 if (length < vo.getDataLength()) { //表字段的实际长度小于当前入参长度
                                     //如果字段长度不够,那么扩容
@@ -1745,7 +1751,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                             if (ObjectUtil.isNotEmpty(vo.getDataLength()) && vo.getDataLength() > 500) {
                                 //如果超过500字符长度,那么直接异常提示
                                 filedNames.add(vo.getName());
-                            }
+                            }*/
                         }
                         if (keys.size() > 0 && values.size() > 0 && keys.size() == values.size()) {
                             //alter SQL(扩容字段长度)

+ 207 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/TableCoordinates.java

@@ -0,0 +1,207 @@
+package org.springblade.manager.utils;
+
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+import org.springblade.core.tool.utils.IoUtil;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.*;
+
+public class TableCoordinates {
+    static Map<Integer, Set<Integer>> occupiedCells = new HashMap<>();
+    public static void main12(String[] args) throws Exception {
+        String htmlUrl = "/Users/hongchuangyanfa/fsdownload/1582300079941746688.html";
+       // String htmlUrl = "/mnt/sdc/Users/hongchuangyanfa/Desktop/privateUrlCopy/1630011899725201410/1582300079941746688.html";
+        getHtmlDataInfo(htmlUrl);
+    }
+
+    public static List<String> getHtmlDataInfo(String htmlUrl) throws Exception {
+        occupiedCells.clear();
+        List<String> redata = new ArrayList<>();
+        InputStream fileInputStream = FileUtils.getInputStreamByUrl(htmlUrl);
+        try {
+            String htmlString = IoUtil.readToString(fileInputStream);
+            Document doc = Jsoup.parse(htmlString, "UTF-8");
+
+            Element table = doc.select("table").first();
+            if (table == null) {
+                System.out.println("未找到表格!");
+                return redata;
+            }
+
+            Map<String, Map<String, Object>> tableKeys = new HashMap<>();
+            List<Map<String, Object>> dataList = new ArrayList<>();
+            int scX1 = 0;
+            int scX2 = 0;
+            int scY1 = 0;
+            int scY2 = 0;
+            int y = 0;
+
+            for (Element row : table.select("tr")) {
+                int x = 0; // 列计数器
+                for (Element cell : row.select("td, th")) {
+                    // 跳过已被合并单元格占用的位置
+                    while (isCellOccupied(x, y)) {
+                        x++;
+                    }
+                    // 获取单元格的合并属性
+                    int colspan = cell.hasAttr("colspan") ? Integer.parseInt(cell.attr("colspan")) : 1;
+                    int rowspan = cell.hasAttr("rowspan") ? Integer.parseInt(cell.attr("rowspan")) : 1;
+                    // 计算绝对坐标
+                    Map<String, Object> coord = new HashMap<>();
+                    String cellName = cell.text().replaceAll("\\s+", "");
+                    coord.put("name", cellName);
+                    coord.put("x1", x);
+                    coord.put("y1", y);
+                    coord.put("x2", x + colspan - 1);
+                    coord.put("y2", y + rowspan - 1);
+                    coord.put("key", findKeyname(cell));
+
+                    if (cellName != null && cellName.indexOf("实测项目") >= 0) {
+                        scX1 = x;
+                        scX2 = x + colspan - 1;
+                        scY1 = y;
+                        scY2 = y + rowspan - 1;
+                    } else if (cellName != null && cellName.indexOf("合格判定") >= 0) {
+                        tableKeys.put("合格判定", coord);
+                    } else if (cellName != null && cellName.indexOf("实测值或实测偏差值") >= 0) {
+                        tableKeys.put("实测值或实测偏差值", coord);
+                    } else if (cellName != null && cellName.indexOf("项次") >= 0) {
+                        tableKeys.put("项次", coord);
+                    } else if (cellName != null && cellName.indexOf("检查项目") >= 0) {
+                        tableKeys.put("检查项目", coord);
+                    } else if (cellName != null && cellName.indexOf("合格率") >= 0) {
+                        tableKeys.put("合格率", coord);
+                    } else {
+                        dataList.add(coord);
+                    }
+                    // 记录合并单元格占用区域
+                    markOccupiedCells(x, y, colspan, rowspan);
+                    x += colspan;
+                }
+                y++;
+            }
+
+            Map<String, List<Map<String, Object>>> coleMap = new HashMap<>();
+            int finalScY = scY2;
+            int finalScY1 = scY1;
+            tableKeys.forEach((k, v) -> {
+                int sdX1 = (int) v.get("x1");
+                int sdX2 = (int) v.get("x2");
+                int sdY1 = (int) v.get("y1");
+                int sdY2 = (int) v.get("y2");
+                List<Map<String, Object>> list = new ArrayList<>();
+                dataList.forEach(data -> {
+                    int x1 = (int) data.get("x1");
+                    int x2 = (int) data.get("x2");
+                    int y1 = (int) data.get("y1");
+                    int y2 = (int) data.get("y2");
+                    if (y1 >= sdY1 && x1 >= sdX1 && x2 <= sdX2 && y2 <= finalScY && y1 >= finalScY1) {
+                        list.add(data);
+                    }
+                    coleMap.put(k, list);
+                });
+                System.out.println(k + ": " + list);
+            });
+
+            List<Map<String, Object>> hgCol = coleMap.get("合格判定");
+            List<Map<String, Object>> xcCol = coleMap.get("项次");
+            List<Map<String, Object>> jcxmCol = coleMap.get("检查项目");
+            List<Map<String, Object>> sczCol = coleMap.get("实测值或实测偏差值");
+            List<Map<String, Object>> hglCol = coleMap.get("合格率");
+            for (int i = 0; i < hgCol.size(); i++) {
+                Map<String, Object> hgInfo = hgCol.get(i);
+                String keyName = hgInfo.get("key") + "";
+                int x1 = (int) hgInfo.get("x1");
+                int x2 = (int) hgInfo.get("x2");
+                int y1 = (int) hgInfo.get("y1");
+                int y2 = (int) hgInfo.get("y2");
+
+                // 判断是否合格
+                List<String> hekeysList = new ArrayList<>();
+                for (int j = 0; j < sczCol.size(); j++) {
+                    Map<String, Object> jcxm = sczCol.get(j);
+                    int hgx1 = (int) jcxm.get("x1");
+                    int hgx2 = (int) jcxm.get("x2");
+                    int hgy1 = (int) jcxm.get("y1");
+                    int hgy2 = (int) jcxm.get("y2");
+                    if (hgx2 < x1 && hgy1 >= y1 && hgy2 <= y2) {
+                        hekeysList.add(jcxm.get("key") + "");
+                    }
+                }
+                String hekeys = String.join(",", hekeysList);
+
+                List<String> jcxNameList = new ArrayList<>();
+                for (int j = 0; j < jcxmCol.size(); j++) {
+                    Map<String, Object> jcxm = jcxmCol.get(j);
+                    int hgx1 = (int) jcxm.get("x1");
+                    int hgx2 = (int) jcxm.get("x2");
+                    int hgy1 = (int) jcxm.get("y1");
+                    int hgy2 = (int) jcxm.get("y2");
+                    if (hgx2 < x1 && hgy1 <= y1 && hgy2 >= y2) {
+                        jcxNameList.add(jcxm.get("name") + "");
+                    }
+                }
+                String jcxName = String.join("--", jcxNameList); // 输出 "C-B-A"
+                String xhName = "";
+                for (int j = 0; j < xcCol.size(); j++) {
+                    Map<String, Object> jcxm = xcCol.get(j);
+                    int hgx1 = (int) jcxm.get("x1");
+                    int hgx2 = (int) jcxm.get("x2");
+                    int hgy1 = (int) jcxm.get("y1");
+                    int hgy2 = (int) jcxm.get("y2");
+                    if (hgx2 < x1 && hgy1 <= y1 && hgy2 >= y2) {
+                        xhName = xhName + jcxm.get("name");
+                    }
+                }
+
+                String hglName = "";
+                for (int j = 0; j < hglCol.size(); j++) {
+                    Map<String, Object> jcxm = hglCol.get(j);
+                    int hgx1 = (int) jcxm.get("x1");
+                    int hgx2 = (int) jcxm.get("x2");
+                    int hgy1 = (int) jcxm.get("y1");
+                    int hgy2 = (int) jcxm.get("y2");
+                    if (hgx2 < x1 && hgy1 <= y1 && hgy2 >= y2) {
+                        hglName =jcxm.get("key")+"";
+                    }
+                }
+
+                String reVal = keyName + "_*_" + xhName + jcxName + "_*_" + hekeys+"_*_" + hglName;
+                  System.out.println(reVal);
+                redata.add(reVal);
+            }
+        }finally {
+            fileInputStream.close();
+        }
+        return redata;
+    }
+
+    // 检查坐标是否被占用
+    public static boolean isCellOccupied(int x, int y) {
+        return occupiedCells.getOrDefault(y, Collections.emptySet()).contains(x);
+    }
+
+    // 标记合并单元格占用的区域
+    public static void markOccupiedCells(int startX, int startY, int colspan, int rowspan) {
+        for (int dy = 0; dy < rowspan; dy++) {
+            for (int dx = 0; dx < colspan; dx++) {
+                occupiedCells.computeIfAbsent(startY + dy, k -> new HashSet<>())
+                        .add(startX + dx);
+            }
+        }
+    }
+    public static String findKeyname(Element element) {
+        Elements elementsWithKeyname = element.select("[keyname]"); // 查找所有带 keyname 属性的元素
+        if (!elementsWithKeyname.isEmpty()) {
+            String keynameValue = elementsWithKeyname.first().attr("keyname");
+            return keynameValue;
+        }
+        return "";
+    }
+}

+ 1 - 1
blade-service/blade-user/src/main/java/org/springblade/system/user/controller/WbsTreeController.java

@@ -175,7 +175,7 @@ public class WbsTreeController extends BladeController {
             @ApiImplicitParam(name="fileNumber",value = "划分编号")
     })
     public R<List<InformationQueryBIMVO>> queryInformationByFileNumber(@RequestParam String contractId, @RequestParam String fileNumber){
-        return R.data(iUserService.queryInformationByFileNumber(contractId, fileNumber));
+        return iUserService.queryInformationByFileNumber(contractId, fileNumber);
     }
 
 

+ 1 - 1
blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.java

@@ -79,5 +79,5 @@ public interface UserMapper extends BaseMapper<User> {
     List<InformationQueryVO1> queryInformationByContractIdAndName(@Param("contractId")String contractId, @Param("name")String name);
 
     //
-    List<InformationQueryBIMVO> queryInformationByFileNumber(@Param("contractId")String contractId, @Param("name")String name);
+    List<InformationQueryBIMVO> queryInformationByFileNumber(@Param("contractId")String contractId, @Param("pKeyId")String pKeyId);
 }

+ 3 - 1
blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml

@@ -248,7 +248,9 @@
     </select>
 
     <select id="queryInformationByFileNumber" resultType="org.springblade.system.user.vo.InformationQueryBIMVO">
-
+        SELECT p_key_id as id,node_name as name,p_id as parentId ,IF(b.id is NULL,1,2) as nodeType,b.status,IF(b.status &lt;= 1,b.pdf_url,e_visa_pdf_url) as fileUrlPath from m_wbs_tree_contract a LEFT JOIN
+        (SELECT * from u_information_query c where c.is_deleted=0 and c.`status` in(1,2,0)) b  on  a.p_key_id=b.wbs_id
+        where a.ancestors_p_id LIKE CONCAT('%', #{pKeyId}, '%') and a.contract_id=#{contractId} and a.type=1 and a.is_deleted=0
     </select>
 
 </mapper>

+ 2 - 1
blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.business.vo.InformationQueryVO;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.vo.PrivateTreeVO;
 import org.springblade.manager.vo.PrivateTreeVO2;
@@ -246,5 +247,5 @@ public interface IUserService extends BaseService<User> {
 
     List<InformationQueryVO1> queryInformationByContractIdAndName(String contractId, String name);
 
-    List<InformationQueryBIMVO> queryInformationByFileNumber(String contractId, String fieldNumber);
+    R queryInformationByFileNumber(String contractId, String fieldNumber);
 }

+ 16 - 6
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -767,7 +767,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                     String sql = "SELECT is_custom,p_key_id,contract_id," +
                             "(SELECT is_reference_number FROM m_contract_info WHERE id="+contractId+") AS isReferenceNumber,"+
                             "(SELECT id FROM u_contract_tree_drawings WHERE process_id = p_key_id AND is_deleted = 0 limit 1) AS drawingsId," +
-                            "id,parent_id,node_type,type,wbs_type,is_buss_show as isBussShow,is_concrete,major_data_type,class_name,unit_name,node_class,unit_num,excellent_num,is_classifition,digitize_time,partition_code,old_id,contract_id_relation,is_concealed_works_node,wbs_id,sort,create_time,is_type_private_pid," +
+                            "id,parent_id,node_type,type,wbs_type,is_buss_show as isBussShow,is_concrete,major_data_type,class_name,unit_name,node_class,unit_num,excellent_num,is_classifition,digitize_time,partition_code,old_id,contract_id_relation,is_concealed_works_node,wbs_id,sort,create_time,is_type_private_pid,date_is_complete," +
                             "CASE (SELECT count(1) FROM u_tree_contract_first AS tcf WHERE tcf.is_deleted = 0 AND tcf.wbs_node_id = a.p_key_id) " +
                             "WHEN 0 THEN 'false' ELSE 'true' END AS isFirst,IFNULL(if(length(trim(full_name))>0,full_name,node_name),node_name) AS title," +
                             "(SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND b.type = 1" +
@@ -929,7 +929,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                             String sql = "SELECT is_custom,p_key_id,contract_id," +
                                     "(SELECT is_reference_number FROM m_contract_info WHERE id="+contractId+") AS isReferenceNumber,"+
                                     "(SELECT id FROM u_contract_tree_drawings WHERE process_id = p_key_id AND is_deleted = 0 limit 1) AS drawingsId," +
-                                    "id,parent_id,node_type,type,wbs_type,is_concrete,major_data_type,class_name,unit_name,node_class,unit_num,excellent_num,is_classifition,digitize_time,partition_code,old_id,contract_id_relation,is_concealed_works_node,wbs_id,sort,create_time,is_type_private_pid," +
+                                    "id,parent_id,node_type,type,wbs_type,is_concrete,major_data_type,class_name,unit_name,node_class,unit_num,excellent_num,is_classifition,digitize_time,partition_code,old_id,contract_id_relation,is_concealed_works_node,wbs_id,sort,create_time,is_type_private_pid,date_is_complete," +
                                     "CASE (SELECT count(1) FROM u_tree_contract_first AS tcf WHERE tcf.is_deleted = 0 AND tcf.wbs_node_id = a.p_key_id) " +
                                     "WHEN 0 THEN 'false' ELSE 'true' END AS isFirst,IFNULL(if(length(trim(full_name))>0,full_name,node_name),node_name) AS title," +
                                     "(SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND b.type = 1" +
@@ -2088,14 +2088,24 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
 
 
     @Override
-    public List<InformationQueryBIMVO> queryInformationByFileNumber(String contractId, String fileNumber) {
+    public R queryInformationByFileNumber(String contractId, String fileNumber) {
         if (StringUtil.isEmpty(contractId)) {
-            throw new ServiceException("未获取到合同段id");
+            return R.fail("未获取到合同段id");
+        }
+        if (StringUtil.isEmpty(fileNumber)) {
+            return R.fail("未获取到划分编号");
+        }
+        // 查询合同段下的所有节点
+        String conSql = "SELECT p_key_id,ancestors_p_id from m_wbs_tree_contract where contract_id="+contractId+" and partition_code='"+fileNumber+"' and is_deleted=0";
+        List<Map<String, Object>> mapList = jdbcTemplate.queryForList(conSql);
+        if(mapList==null || mapList.size()==0){
+           return R.fail("划分标号无效");
         }
 
-        List<InformationQueryBIMVO> informationQueryVO1s = baseMapper.queryInformationByFileNumber(contractId, fileNumber);
+        String pKeyId = mapList.get(0).get("p_key_id")+"";
+        List<InformationQueryBIMVO> information = baseMapper.queryInformationByFileNumber(contractId, pKeyId);
 
-        return informationQueryVO1s;
+        return R.data(information);
     }
 
 }