Browse Source

Merge branch 'master' of http://121.41.40.202:3000/zhuwei/bladex

huangtf 1 year ago
parent
commit
638987994c
43 changed files with 839 additions and 361 deletions
  1. 30 7
      blade-common/src/main/java/org/springblade/common/utils/BaseUtils.java
  2. 3 1
      blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/CommonFileClientImpl.java
  3. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/InformationQueryClient.java
  4. 4 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskQueryVO.java
  5. 12 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormData.java
  6. 3 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/FormulaDataBlock.java
  7. 6 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/CurrentNode.java
  8. 14 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractVO8.java
  9. 78 10
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  10. 114 32
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  11. 14 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/UserViewProjectContractController.java
  12. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/InformationQueryClientImpl.java
  13. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.java
  14. 25 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml
  15. 3 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java
  16. 62 62
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  17. 10 4
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java
  18. 1 1
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java
  19. 17 31
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java
  20. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/AppVersionDetailController.java
  21. 89 46
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  22. 128 13
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java
  23. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TabBusstimeInfoController.java
  24. 2 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java
  25. 3 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java
  26. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ElementBlock.java
  27. 4 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ITurnPointCalculator.java
  28. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ItemBlock.java
  29. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/LevelInfo.java
  30. 8 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/TurnPoint.java
  31. 12 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaTurnPoint.java
  32. 7 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java
  33. 3 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/TabBusstimeInfoMapper.java
  34. 7 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/TabBusstimeInfoMapper.xml
  35. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java
  36. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/ITabBusstimeInfoService.java
  37. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsParamService.java
  38. 77 60
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  39. 29 35
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  40. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/TabBusstimeInfoServiceImpl.java
  41. 18 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java
  42. 24 9
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  43. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

+ 30 - 7
blade-common/src/main/java/org/springblade/common/utils/BaseUtils.java

@@ -4,9 +4,7 @@ import cn.hutool.core.lang.func.Func;
 import com.alibaba.cloud.commons.lang.StringUtils;
 import org.springblade.common.constant.RegexConstant;
 
-import java.io.File;
-import java.io.FileFilter;
-import java.io.IOException;
+import java.io.*;
 import java.lang.annotation.Annotation;
 import java.math.BigDecimal;
 import java.net.JarURLConnection;
@@ -84,7 +82,6 @@ public class BaseUtils {
     /**
      * @Description  判断对象是否为数值
      * @Param [value]
-     * @return boolean
      * @Author yangyj
      * @Date 2023.01.17 13:48
      **/
@@ -116,6 +113,32 @@ public class BaseUtils {
                 .collect(Collectors.toList());
     }
 
+
+    /**
+     * @Description 深度拷贝
+     * @Param [originalList]
+     * @return java.util.List<T>
+     * @Author yangyj
+     * @Date 2023.04.28 14:18
+     **/
+    public static <T extends Serializable> List<T> copyList(List<T> originalList) {
+        try {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            ObjectOutputStream oos = new ObjectOutputStream(baos);
+            oos.writeObject(originalList);
+            oos.close();
+            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+            ObjectInputStream ois = new ObjectInputStream(bais);
+            @SuppressWarnings("unchecked")
+            List<T> copiedList = (List<T>) ois.readObject();
+            ois.close();
+            return copiedList;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
     public static String handleNull(Object obj) {
         if (null == obj) {
             return "";
@@ -129,8 +152,8 @@ public class BaseUtils {
                     return true;
                  }else if(value instanceof Map&&((Map<?, ?>) value).size()>0){
                      return true;
-                 }else if(value.toString().trim().length()>0){
-                     return true;
+                 }else {
+                     return value.toString().trim().length() > 0;
                  }
              }
              return false;
@@ -189,7 +212,7 @@ public class BaseUtils {
         if (null == obj) {
             return 0;
         } else {
-            double value = 0;
+            double value;
             try {
                 value = Double.parseDouble(obj.toString());
             } catch (Exception ex) {

+ 3 - 1
blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/CommonFileClientImpl.java

@@ -12,6 +12,7 @@ import org.apache.poi.ss.usermodel.WorkbookFactory;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tenant.annotation.NonDS;
+import org.springblade.core.tool.utils.FileUtil;
 import org.springblade.core.tool.utils.IoUtil;
 import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.resource.builder.oss.OssBuilder;
@@ -56,8 +57,9 @@ public class CommonFileClientImpl implements CommonFileClient {
             document.close();
 
             //上传文件
+            String fileExtension =  "."+FileUtil.getFileExtension(file.getOriginalFilename());
             pdfInput = new ByteArrayInputStream(bos.toByteArray());
-            String originalFilename = Objects.requireNonNull(file.getOriginalFilename()).replaceAll(".png", ".pdf").replaceAll(".jpg", ".pdf");
+            String originalFilename = Objects.requireNonNull(file.getOriginalFilename()).replaceAll(fileExtension, ".pdf");
 
             BladeFile bladeFile = this.ossBuilder.template().putFile(originalFilename, pdfInput);
             pdfFileUrl = bladeFile.getLink();

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/InformationQueryClient.java

@@ -61,6 +61,9 @@ public interface InformationQueryClient {
     @PostMapping(API_PREFIX + "/informationQuerySaveData")
     void saveData(@RequestParam String id, @RequestParam String projectId, @RequestParam String contractId, @RequestParam String classify, @RequestParam String link, @RequestParam String trialProjectName);
 
+    @PostMapping(API_PREFIX + "/informationQuerySaveInfo")
+    void saveInfo(@RequestBody InformationQuery info);
+
     @PostMapping(API_PREFIX + "/updateInformationQuery")
     void updateInformationQuery(@RequestParam String link, @RequestParam String classify, @RequestParam String nodeId, @RequestParam String contractId);
 

+ 4 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskQueryVO.java

@@ -21,7 +21,10 @@ public class TaskQueryVO {
     @ApiModelProperty("上报批次")
     private String batch;
 
-    @ApiModelProperty("合同段ID")
+    @ApiModelProperty("当前登陆用户选择的项目合同段ID")
+    private String currentContractId;
+
+    @ApiModelProperty("选择框的合同段ID")
     private String contractId;
 
     @ApiModelProperty("开始时间")

+ 12 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormData.java

@@ -3,6 +3,7 @@ package org.springblade.manager.dto;
 
 import lombok.Data;
 import lombok.Setter;
+import org.springblade.common.utils.BaseUtils;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringPool;
 import org.springblade.manager.entity.Formula;
@@ -62,6 +63,10 @@ public class FormData {
      * 用于输出
      */
     private List<ElementData> values;
+    /**
+     * 初始内容
+     * */
+    private List<ElementData> initial ;
     /**
      * 当需要偏移处理的时候需要备份原数据,等计算完成还原回去
      */
@@ -224,5 +229,12 @@ public class FormData {
         return this.values.stream().map(ElementData::getValue).collect(Collectors.toList());
     }
 
+    public void init(){
+        if(this.values.size()>0){
+            /*原始数据*/
+            this.setInitial(BaseUtils.copyList(this.values));
+        }
+    }
+
 
 }

+ 3 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/FormulaDataBlock.java

@@ -9,7 +9,7 @@ import lombok.Data;
 /**
  * @author yangyj
  * @Date 2023/4/13 15:40
- * @description TODO
+ * @description 分项评定数据集
  */
 @Data
 @TableName("m_formula_data_block")
@@ -23,6 +23,8 @@ public class FormulaDataBlock {
     private Integer type;
     /**
      * sub work
+     * 查找第一个包含分项评定子节点的父节点的id
+     * 一个分项里面可以存在多个评定节点,共享数据所以采用共同父级锚定
      */
     private Long swId;
     private Long contractId;

+ 6 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/CurrentNode.java

@@ -6,6 +6,8 @@ import org.springblade.manager.entity.WbsTreePrivate;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Optional;
 
 /**
@@ -33,6 +35,9 @@ public class CurrentNode {
     private Long wtpPkeyId;
     /**wbs_tree的流水号 需要溯源*/
     private Long wbsNodeId;
-
+    /**
+     * 当前节点父级下所有子孙节点里所有的node_type in(6,4)节点的pkeyId
+     * */
+    public List<CurrentNode> divisional= new ArrayList<>();
 
 }

+ 14 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractVO8.java

@@ -0,0 +1,14 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class WbsTreeContractVO8 implements Serializable {
+
+    private Long id;
+    private Long pKeyId;
+    private Integer hasChildren;
+
+}

+ 78 - 10
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -20,6 +20,7 @@ import org.springblade.business.feign.MessageWarningClient;
 import org.springblade.business.feign.OperationLogClient;
 import org.springblade.business.feign.RecycleBinClient;
 import org.springblade.business.feign.TaskClient;
+import org.springblade.business.mapper.InformationQueryMapper;
 import org.springblade.business.service.*;
 import org.springblade.business.socket.WebSocket;
 import org.springblade.business.utils.FileUtils;
@@ -45,6 +46,7 @@ import org.springblade.manager.entity.*;
 import org.springblade.manager.feign.*;
 import org.springblade.manager.vo.WbsTreeContractLazyVO;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
+import org.springblade.manager.vo.WbsTreeContractVO8;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.cache.ParamCache;
 import org.springblade.system.entity.DictBiz;
@@ -93,6 +95,8 @@ public class InformationWriteQueryController extends BladeController {
 
     private final IInformationQueryService informationQueryService;
 
+    private final InformationQueryMapper informationQueryMapper;
+
     private final IInformationQueryFileService informationQueryFileService;
 
     private final IDictBizClient dictBizClient;
@@ -1165,7 +1169,7 @@ public class InformationWriteQueryController extends BladeController {
                                 }
                             }
 
-                            iTaskService.delArchiveFileBusinessData(query.getProjectId(),query.getWbsId());
+                            iTaskService.delArchiveFileBusinessData(query.getProjectId(), query.getWbsId());
                         }
 
                         //更新Redis缓存
@@ -1480,6 +1484,9 @@ public class InformationWriteQueryController extends BladeController {
                     if (nodeOld.getType() == 2 && StringUtils.isNotEmpty(newData.getInitTableName()) && tabOwner.contains(nodeOld.getTableOwner()) && vo.getIsCopyData() == 1) {
                         String tableName = newData.getInitTableName();
                         String col = nodeTabColsMap.get(tableName);
+                        if (ObjectUtil.isEmpty(col)) { //如果没获取到字段,那么跳过
+                            continue;
+                        }
                         List<String> filteredList = Arrays.stream(col.split(","))
                                 .filter(value -> !value.equals("id") && !value.equals("p_key_id") && !value.equals("group_id"))
                                 .collect(Collectors.toList());
@@ -1866,11 +1873,11 @@ public class InformationWriteQueryController extends BladeController {
                             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,rjs)).collect(Collectors.joining("、"));
-                                }else{
-                                  sv=imitate(v,rjs);
+                                String sv;
+                                if (v.contains("、")) {
+                                    sv = Arrays.stream(v.split("[、]")).map(e -> imitate(e, rjs)).collect(Collectors.joining("、"));
+                                } else {
+                                    sv = imitate(v, rjs);
                                 }
                                 result.add(sv + "_^_" + a[1]);
                             }
@@ -1884,7 +1891,8 @@ public class InformationWriteQueryController extends BladeController {
         }
         return value;
     }
-    public String imitate(String v,List<RangeJson> rjs){
+
+    public String imitate(String v, List<RangeJson> rjs) {
         RangeJson best = rjs.stream().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);
         return BaseUtils.rangeList(1, best.getDesign(), best.getDev(), 1, scale, 1).get(0).toString();
@@ -3509,16 +3517,49 @@ public class InformationWriteQueryController extends BladeController {
             node = this.wbsTreeContractClient.getContractWbsTreeByContractIdAndId(vo.getWbsId(), Long.parseLong(vo.getContractIdRelation()));
         }
         List<QueryProcessDataVO> queryDataResult = new ArrayList<>();
+        List<WbsTreeContractVO8> lowestNodes = new ArrayList<>();
         if (!new Integer("6").equals(node.getNodeType()) && !Arrays.asList("1,2,3,4".split(",")).contains(node.getMajorDataType() + "")) {
+            /**
+             * 更改逻辑
+             * 使用queryProcessDataByParentIdAndContractId_3中,通过pKeyId查询;
+             * 放弃使用queryProcessDataByParentIdAndContractIdTwo中,通过ancestors字段查询,ancestors有问题
+             * @author liuyc
+             * @date 2023年9月8日11:26:46
+             */
             //不是工序,则查询当前节点下的所有填报节点
             if (node.getParentId() == 0) {
-                queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractIdTwo("", contract.getContractType(), StringUtils.isNotEmpty(vo.getContractIdRelation()) ? vo.getContractIdRelation() : vo.getContractId().toString());
+                //当前合同段最底层节点pKeyIds
+                List<WbsTreeContract> lowestNodesAll = jdbcTemplate.query("select a.p_key_id,a.id,(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.contract_id = " + node.getContractId() + " AND b.status = 1 AND b.type = 1 AND b.is_deleted = 0) AS hasChildren from m_wbs_tree_contract a where a.type = 1 and a.status = 1 and a.is_deleted = 0 and a.contract_id = " + node.getContractId() + " HAVING hasChildren = 0", new BeanPropertyRowMapper<>(WbsTreeContract.class));
+                List<String> pKeyIds = lowestNodesAll.stream().map(WbsTreeContract::getPKeyId).map(String::valueOf).collect(Collectors.toList());
+                List<List<String>> partition = Lists.partition(pKeyIds, 1000);
+                for (List<String> items : partition) {
+                    //获取填报节点信息
+                    List<QueryProcessDataVO> result = this.informationQueryMapper.queryProcessDataByParentIdAndContractId_3(contract.getContractType(), items);
+                    if (result.size() > 0) {
+                        queryDataResult.addAll(result);
+                    }
+                }
+
+                //queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractIdTwo("", contract.getContractType(), StringUtils.isNotEmpty(vo.getContractIdRelation()) ? vo.getContractIdRelation() : vo.getContractId().toString());
             } else {
-                queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractIdTwo(node.getId().toString(), contract.getContractType(), StringUtils.isNotEmpty(vo.getContractIdRelation()) ? vo.getContractIdRelation() : vo.getContractId().toString());
+                //获取当前选择的节点下的所有最底层节点
+                WbsTreeContractVO8 vo8 = BeanUtil.copyProperties(node, WbsTreeContractVO8.class);
+                this.lowestNodesRecursively(lowestNodes, Collections.singleton(vo8), node.getContractId());
+                List<String> pKeyIds = lowestNodes.stream().map(WbsTreeContractVO8::getPKeyId).map(String::valueOf).collect(Collectors.toList());
+                List<List<String>> partition = Lists.partition(pKeyIds, 1000);
+                for (List<String> items : partition) {
+                    //获取填报节点信息
+                    List<QueryProcessDataVO> result = this.informationQueryMapper.queryProcessDataByParentIdAndContractId_3(contract.getContractType(), items);
+                    if (result.size() > 0) {
+                        queryDataResult.addAll(result);
+                    }
+                }
 
+                //queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractIdTwo(node.getId().toString(), contract.getContractType(), StringUtils.isNotEmpty(vo.getContractIdRelation()) ? vo.getContractIdRelation() : vo.getContractId().toString());
             }
+
             //如果是首件列表请求,则删掉没有标记为首件的数据
-            if (queryDataResult != null && queryDataResult.size() > 0) {
+            if (queryDataResult.size() > 0) {
                 if (StringUtils.isNotEmpty(vo.getIsFirst())) {
                     if (StringUtils.isNotEmpty(vo.getFirstTitle())) {
                         queryDataResult = queryDataResult.stream().filter(qdr -> "3".equals(qdr.getQueryType())).collect(Collectors.toList());
@@ -3534,6 +3575,7 @@ public class InformationWriteQueryController extends BladeController {
                 submitNodeKeyIds.addAll(queryDataResult.stream().map(QueryProcessDataVO::getPrimaryKeyId).distinct().collect(Collectors.toList()));
             }
         }
+
         //设置进集合中
         vo.setWbsIds(submitNodeKeyIds);
         if (StringUtils.isNotEmpty(vo.getContractIdRelation())) {
@@ -3543,6 +3585,32 @@ public class InformationWriteQueryController extends BladeController {
         return R.data(this.informationQueryService.selectInformationQueryPage(Condition.getPage(query), vo, node));
     }
 
+
+    /**
+     * 获取一个节点下的所有最底层节点
+     *
+     * @param lowestNodes 结果集
+     * @param nodes       初始入参节点
+     */
+    private void lowestNodesRecursively(List<WbsTreeContractVO8> lowestNodes, Set<WbsTreeContractVO8> nodes, String contractId) {
+        if (nodes.size() > 0) {
+            Set<Long> ids = nodes.stream().map(WbsTreeContractVO8::getId).collect(Collectors.toSet());
+            if (ids.size() > 0) {
+                List<WbsTreeContractVO8> childNodes = jdbcTemplate.query("select a.p_key_id,a.id,(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.contract_id = " + contractId + " AND b.status = 1 AND b.type = 1 AND b.is_deleted = 0) AS hasChildren from m_wbs_tree_contract a where a.type = 1 and a.status = 1 and a.is_deleted = 0 and a.contract_id = " + contractId + " and a.parent_id in(" + StringUtils.join(ids, ",") + ")", new BeanPropertyRowMapper<>(WbsTreeContractVO8.class));
+                if (childNodes.size() > 0) {
+                    Set<WbsTreeContractVO8> lowestNode = childNodes.stream().filter(f -> f.getHasChildren().equals(0)).collect(Collectors.toSet());
+                    Set<WbsTreeContractVO8> noLowestNode = childNodes.stream().filter(f -> f.getHasChildren().equals(1)).collect(Collectors.toSet());
+                    if (lowestNode.size() > 0) { //最底层节点加入结果集
+                        lowestNodes.addAll(lowestNode);
+                    }
+                    if (noLowestNode.size() > 0) { //非最底层节点继续递归
+                        this.lowestNodesRecursively(lowestNodes, noLowestNode, contractId);
+                    }
+                }
+            }
+        }
+    }
+
     /**
      * 获取当前合同段的划分树
      *

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

@@ -24,6 +24,7 @@ import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.sms.model.SmsResponse;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.jackson.JsonUtil;
@@ -34,12 +35,15 @@ import org.springblade.flow.core.entity.BladeFlow;
 import org.springblade.flow.core.feign.NewFlowClient;
 import org.springblade.flow.core.vo.SendPageVO;
 import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.feign.ContractClient;
 import org.springblade.resource.feign.CommonFileClient;
 import org.springblade.resource.feign.NewISmsClient;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
 import org.springframework.beans.BeanUtils;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.web.bind.annotation.*;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -53,6 +57,7 @@ import java.time.Duration;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ThreadPoolExecutor;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -67,6 +72,8 @@ import java.util.stream.Collectors;
 @Api(value = "任务审核主表", tags = "任务审核主表接口")
 public class TaskController extends BladeController {
 
+    private final JdbcTemplate jdbcTemplate;
+
     private final ITaskService taskService;
 
     private final ITaskParallelService taskParallelService;
@@ -208,14 +215,24 @@ public class TaskController extends BladeController {
     @ApiOperationSupport(order = 9)
     @ApiOperation(value = "获取发起")
     public R<IPage<TaskVO>> queryUserStartFlow(TaskQueryVO queryVO) {
+        //获取所有合同段信息Maps
+        Map<Long, ContractInfo> contractInfoMaps = jdbcTemplate.query("select id,contract_type from m_contract_info where is_deleted = 0 and status = 1", new BeanPropertyRowMapper<>(ContractInfo.class)).stream().collect(Collectors.toMap(ContractInfo::getId, Function.identity()));
         //获取发起,只需要查询主表
         //先查询符合条件的流程
         LambdaQueryWrapper<Task> wrapper = Wrappers.<Task>lambdaQuery().eq(Task::getProjectId, queryVO.getProjectId()).eq(Task::getReportUser, AuthUtil.getUserId().toString());
+
         //设置查询参数
-        this.integrationMethod(wrapper, queryVO);
+        this.integrationMethod(wrapper, queryVO, contractInfoMaps);
+
         //获取主流程
         List<Task> masterTaskList = this.taskService.list(wrapper);
         if (masterTaskList != null && masterTaskList.size() > 0) {
+
+            //封装获取主流程下所有相关的审批人相关map
+            Map<String, List<TaskParallel>> taskParallelMaps = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery()
+                    .select(TaskParallel::getProcessInstanceId, TaskParallel::getTaskUserName, TaskParallel::getEVisaStatus, TaskParallel::getStatus, TaskParallel::getInitiative))
+                    .stream().filter(f -> ObjectUtil.isNotEmpty(f.getProcessInstanceId())).collect(Collectors.groupingBy(TaskParallel::getProcessInstanceId));
+
             //获取集合
             List<String> processInstanceIds = masterTaskList.stream().map(Task::getProcessInstanceId).distinct().collect(Collectors.toList());
             //设置主表map,方便获取
@@ -250,8 +267,10 @@ public class TaskController extends BladeController {
                     vo.setTypeValue(new Integer("1").equals(vo.getType()) ? "普通任务" : new Integer("2").equals(vo.getType()) ? "验收任务" : "移交任务");
                     vo.setTaskId(flow.getTaskId());
                     vo.setTaskStatus(new Integer("1").equals(task.getStatus()) ? "待审批" : new Integer("2").equals(task.getStatus()) ? "已审批" : "已废除", task.getStatus());
+
                     //查询分支流程信息
-                    List<TaskParallel> linkList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().eq(TaskParallel::getProcessInstanceId, task.getProcessInstanceId()));
+                    //List<TaskParallel> linkList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().eq(TaskParallel::getProcessInstanceId, task.getProcessInstanceId()));
+                    List<TaskParallel> linkList = taskParallelMaps.get(task.getProcessInstanceId());
                     if (linkList != null && !linkList.isEmpty()) {
                         this.integrationMethod(vo, linkList);
                     }
@@ -393,7 +412,7 @@ public class TaskController extends BladeController {
     @ApiOperationSupport(order = 6)
     @ApiOperation(value = "获取任务类型或任务状态")
     public R<List<DictBiz>> queryTaskTypeOrStatus(String typeOrStatus) {
-        return this.dictBizClient.getList(typeOrStatus, "notRoot");
+        return R.data(jdbcTemplate.query("select dict_key, dict_value from blade_dict_biz where code = '" + typeOrStatus + "' and parent_id > 0 and is_sealed = 0 and is_deleted = 0 order by sort", new BeanPropertyRowMapper<>(DictBiz.class)));
     }
 
     /**
@@ -407,14 +426,17 @@ public class TaskController extends BladeController {
         Map<String, Task> masterTaskMap = new HashMap<>();
         Map<String, TaskParallel> parallelMap = new HashMap<>();
         List<String> parallelProcessInstanceIds = new ArrayList<>();
+
         //统合查询方法
         this.integrationMethod(queryVO, masterTaskMap, parallelMap, parallelProcessInstanceIds, "2,3");
-        if (masterTaskMap.size() == 0 || parallelMap.size() == 0) {
+
+        if (masterTaskMap.size() == 0 && parallelMap.size() == 0) {
             return R.data(null);
         }
 
-        //获取已办(基于原生已办)
+        //获取待办(基于原生待办,原生待办是指的系统上报的,不是数字化上传生成的)
         R<Object> rObject = this.newFlowClient.selectDonePage(queryVO.getCurrent(), queryVO.getSize(), queryVO.getOrdType() == null ? 1 : queryVO.getOrdType(), String.join(",", parallelProcessInstanceIds));
+
         //处理参数
         return this.integrationMethod(queryVO, rObject, masterTaskMap, parallelMap, false);
     }
@@ -450,33 +472,84 @@ public class TaskController extends BladeController {
     @GetMapping("/user-to-do-task-list")
     @ApiOperationSupport(order = 3)
     @ApiOperation(value = "获取当前用户待办流程")
-    public R<IPage<TaskVO>> todoUserApprovalTask(TaskQueryVO queryVO) {
+    public R<IPage<TaskVO>> todoUserApprovalTask(TaskQueryVO queryVO) throws IOException {
         //设置获取参数
         Map<String, Task> masterTaskMap = new HashMap<>();
         Map<String, TaskParallel> parallelMap = new HashMap<>();
         List<String> parallelProcessInstanceIds = new ArrayList<>();
+
         //统合查询方法
         this.integrationMethod(queryVO, masterTaskMap, parallelMap, parallelProcessInstanceIds, "1");
-        if (masterTaskMap.size() == 0 || parallelMap.size() == 0) {
+
+        //如果为空直接返回
+        if (masterTaskMap.size() == 0 && parallelMap.size() == 0) {
+            this.sendsWebSocketCount(null, 2, queryVO);
             return R.data(null);
         }
-        //获取待办(基于原生待办)
+
+        //获取待办(基于原生待办,原生待办是指的系统上报的,不是数字化上传生成的)
         R<Object> rObject = this.newFlowClient.selectTodoPage(queryVO.getCurrent(), queryVO.getSize(), queryVO.getOrdType() == null ? 1 : queryVO.getOrdType(), String.join(",", parallelProcessInstanceIds));
+
         //处理参数
-        return this.integrationMethod(queryVO, rObject, masterTaskMap, parallelMap, true);
+        R<IPage<TaskVO>> iPageR = this.integrationMethod(queryVO, rObject, masterTaskMap, parallelMap, true);
+
+        //推送
+        if (ObjectUtil.isNotEmpty(iPageR.getData()) && ObjectUtil.isNotEmpty(iPageR.getData().getRecords())) {
+            this.sendsWebSocketCount(iPageR, 1, queryVO);
+        } else {
+            this.sendsWebSocketCount(null, 2, queryVO);
+        }
+        return iPageR;
+    }
+
+    /**
+     * 推送消息
+     *
+     * @param iPageR
+     * @param type
+     * @param queryVO
+     * @throws IOException
+     */
+    @Async
+    public void sendsWebSocketCount(R<IPage<TaskVO>> iPageR, int type, TaskQueryVO queryVO) throws IOException {
+        if (type == 1) {
+            Map<String, String> stringMap = iTaskService.getTaskCount(queryVO.getProjectId(), queryVO.getCurrentContractId(), SecureUtil.getUserId().toString());
+            stringMap.put("taskCount", String.valueOf(iPageR.getData().getTotal()));
+            long messageCount = Long.parseLong(stringMap.get("messageCount"));
+            long taskCount = Long.parseLong(stringMap.get("taskCount"));
+            stringMap.put("allCount", String.valueOf(messageCount + taskCount));
+            webSocket.sendMessageByUserId(AuthUtil.getUserId().toString(), JSON.toJSONString(stringMap));
+        } else if (type == 2) {
+            Map<String, String> stringMap = iTaskService.getTaskCount(queryVO.getProjectId(), queryVO.getCurrentContractId(), SecureUtil.getUserId().toString());
+            stringMap.put("taskCount", "0");
+            long messageCount = Long.parseLong(stringMap.get("messageCount"));
+            long taskCount = Long.parseLong(stringMap.get("taskCount"));
+            stringMap.put("allCount", String.valueOf(messageCount + taskCount));
+            webSocket.sendMessageByUserId(AuthUtil.getUserId().toString(), JSON.toJSONString(stringMap));
+        }
     }
 
     /**
      * 统合查询方法
+     *
+     * @param queryVO                    入参vo
+     * @param masterTaskMap              所有符合条件的任务Map,key=getProcessInstanceId,value=task
+     * @param parallelMap
+     * @param parallelProcessInstanceIds
+     * @param status
      */
     private void integrationMethod(TaskQueryVO queryVO, Map<String, Task> masterTaskMap, Map<String, TaskParallel> parallelMap, List<String> parallelProcessInstanceIds, String status) {
+        //获取所有合同段信息Maps
+        Map<Long, ContractInfo> contractInfoMaps = jdbcTemplate.query("select id,contract_type from m_contract_info where is_deleted = 0 and status = 1", new BeanPropertyRowMapper<>(ContractInfo.class)).stream().collect(Collectors.toMap(ContractInfo::getId, Function.identity()));
         //先查询符合条件的流程
         LambdaQueryWrapper<Task> wrapper = Wrappers.<Task>lambdaQuery().eq(Task::getIsDeleted, 0)
                 .eq(Task::getProjectId, queryVO.getProjectId()).eq(StringUtils.isNotBlank(queryVO.getBatch()), Task::getBatch, queryVO.getBatch());
-        this.integrationMethod(wrapper, queryVO);
+        //封装wrapper
+        this.integrationMethod(wrapper, queryVO, contractInfoMaps);
 
-        //符合条件的集合
+        //符合条件的集合(获取当前查询的任务,还未分页)
         List<Task> masterTaskList = this.taskService.list(wrapper);
+
         //根据主表获取附表且当前用户的记录
         List<String> processInstanceIds = new ArrayList<>();
         masterTaskList.forEach(task -> {
@@ -485,7 +558,9 @@ public class TaskController extends BladeController {
         });
 
         if (processInstanceIds.size() > 0) {
-            List<TaskParallel> parallelTaskList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().in(TaskParallel::getProcessInstanceId, processInstanceIds).eq(TaskParallel::getTaskUser, AuthUtil.getUserId().toString()).eq(TaskParallel::getIsDeleted, 0).in(TaskParallel::getStatus, Arrays.asList(status.split(","))));
+            List<TaskParallel> parallelTaskList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().in(TaskParallel::getProcessInstanceId, processInstanceIds)
+                    .eq(TaskParallel::getTaskUser, AuthUtil.getUserId().toString()).eq(TaskParallel::getIsDeleted, 0)
+                    .in(TaskParallel::getStatus, Arrays.asList(status.split(","))));
             parallelTaskList.forEach(parallel -> {
                 parallelMap.put(parallel.getParallelProcessInstanceId(), parallel);
                 parallelProcessInstanceIds.add(parallel.getParallelProcessInstanceId());
@@ -493,7 +568,7 @@ public class TaskController extends BladeController {
         }
     }
 
-    private void integrationMethod(LambdaQueryWrapper<Task> wrapper, TaskQueryVO queryVO) {
+    private void integrationMethod(LambdaQueryWrapper<Task> wrapper, TaskQueryVO queryVO, Map<Long, ContractInfo> contractInfoMaps) {
         //任务类型
         if (StringUtils.isNotEmpty(queryVO.getTaskType())) {
             wrapper.eq(Task::getType, queryVO.getTaskType());
@@ -504,7 +579,8 @@ public class TaskController extends BladeController {
         }
         //合同段ID
         if (StringUtils.isNotEmpty(queryVO.getContractId())) {
-            ContractInfo contractInfo = contractClient.getContractById(Long.valueOf(queryVO.getContractId()));
+            //ContractInfo contractInfo = contractClient.getContractById(Long.valueOf(queryVO.getContractId()));
+            ContractInfo contractInfo = contractInfoMaps.get(Long.valueOf(queryVO.getContractId()));
             if (contractInfo.getContractType() == 2) {
                 wrapper.eq(Task::getProjectId, queryVO.getProjectId());
             } else {
@@ -539,6 +615,12 @@ public class TaskController extends BladeController {
             List<BladeFlow> result = JSONArray.parseArray(JSONObject.toJSONString(flowIPage.getRecords()), BladeFlow.class);
 
             if (result != null && result.size() > 0) {
+
+                //封装获取主流程下所有相关的审批人相关map
+                Map<String, List<TaskParallel>> taskParallelMaps = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery()
+                        .select(TaskParallel::getProcessInstanceId, TaskParallel::getTaskUserName, TaskParallel::getEVisaStatus, TaskParallel::getStatus, TaskParallel::getInitiative))
+                        .stream().filter(f -> ObjectUtil.isNotEmpty(f.getProcessInstanceId())).collect(Collectors.groupingBy(TaskParallel::getProcessInstanceId));
+
                 //获取相关信息
                 result.forEach(flow -> {
                     TaskParallel taskParallel = parallelMap.get(flow.getProcessInstanceId());
@@ -555,7 +637,7 @@ public class TaskController extends BladeController {
                             vo.setParallelProcessInstanceId(flow.getProcessInstanceId());
                             vo.setTaskId(flow.getTaskId());
                             vo.setTaskStatus(new Integer("1").equals(task.getStatus()) ? "待审批" : new Integer("2").equals(task.getStatus()) ? "已审批" : "已废除", task.getStatus());
-//                            vo.setEVisaContent(taskParallel.getEVisaContent());
+                            //vo.setEVisaContent(taskParallel.getEVisaContent());
                             if (task.getStatus() == 3) {
                                 vo.setEVisaContent("废除成功");
                             } else {
@@ -563,7 +645,8 @@ public class TaskController extends BladeController {
                             }
 
                             //获取主流程下所有相关的审批人
-                            List<TaskParallel> linkList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().eq(TaskParallel::getProcessInstanceId, task.getProcessInstanceId()).eq(TaskParallel::getIsDeleted, 0));
+                            //List<TaskParallel> linkList = this.taskParallelService.list(Wrappers.<TaskParallel>lambdaQuery().eq(TaskParallel::getProcessInstanceId, task.getProcessInstanceId()).eq(TaskParallel::getIsDeleted, 0));
+                            List<TaskParallel> linkList = taskParallelMaps.get(task.getProcessInstanceId());
                             if (linkList != null && linkList.size() > 0) {
                                 this.integrationMethod(vo, linkList);
                             }
@@ -573,24 +656,23 @@ public class TaskController extends BladeController {
                         }
                     }
                 });
-
-//				//待办的原生方法并没有对数据做分页,所以需要在这里进行手动分页,而已办的原生方法已经做了分页处理
-//				if(!isToDo){
-//					//result是一个总的集合,需要手动进行分组分页
-//					List<List<TaskVO>> groupResult = CommonUtil.getBatchSize(finalResult, query.getSize());
-//					//获取当前页数据
-//					List<TaskVO> finalFlowList;
-//					if(groupResult.size() > 0){
-//						finalFlowList = groupResult.get(query.getCurrent() - 1);
-//					} else {
-//						finalFlowList = new ArrayList<>();
-//					}
-//					//最终分页数据
-//					return this.getIPageR(query, flowIPage, finalFlowList);
-//				} else {
+				/*//待办的原生方法并没有对数据做分页,所以需要在这里进行手动分页,而已办的原生方法已经做了分页处理
+				if(!isToDo){
+					//result是一个总的集合,需要手动进行分组分页
+					List<List<TaskVO>> groupResult = CommonUtil.getBatchSize(finalResult, query.getSize());
+					//获取当前页数据
+					List<TaskVO> finalFlowList;
+					if(groupResult.size() > 0){
+						finalFlowList = groupResult.get(query.getCurrent() - 1);
+					} else {
+						finalFlowList = new ArrayList<>();
+					}
+					//最终分页数据
+					return this.getIPageR(query, flowIPage, finalFlowList);
+				} else {*/
                 //最终分页数据
                 return this.getIPageR(query, flowIPage, finalResult);
-//				}
+                //}
             }
         }
         return R.data(null);

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

@@ -14,6 +14,7 @@ import org.apache.commons.lang.StringUtils;
 import org.springblade.business.entity.DefaultProject;
 import org.springblade.business.service.IDefaultProjectService;
 import org.springblade.business.vo.UserVO;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.SecureUtil;
@@ -166,6 +167,19 @@ public class UserViewProjectContractController {
             //获取当前所有合同段
             List<ContractInfo> contractInfos = this.contractClient.queryContractListByIds(longProjectIds);
 
+            /*//如果没有设置默认项目合同段,那么选择一个设置固定的
+            if (ObjectUtil.isEmpty(defaultProject) || ObjectUtil.isEmpty(defaultContract)) {
+                ProjectInfo projectInfo = projectInfos.get(0); //默认选第一个
+                ContractInfo contractInfo = contractInfos.stream().filter(f -> f.getPId().contains(projectInfo.getId().toString()) && f.getContractType() == 1).findAny().orElse(null);
+                if (projectInfo != null && contractInfo != null) {
+                    defaultProject = projectInfo.getId().toString();
+                    defaultContract = contractInfo.getId().toString();
+                }
+            }
+            if (StringUtils.isEmpty(defaultProject) || StringUtils.isEmpty(defaultContract)) {
+                throw new ServiceException("获取默认项目合同段信息失败,请联系管理员");
+            }*/
+
             //如果是监理,那么移除施工合同段信息
             if (var) {
                 contractInfos.removeIf(next -> next.getContractType() == 1);
@@ -181,7 +195,6 @@ public class UserViewProjectContractController {
                 //用户默认的项目及合同段
                 String finalDefaultProject = defaultProject;
                 String finalDefaultContract = defaultContract;
-
                 projectInfoVOS.forEach(vo -> {
                     //统一返回格式
                     vo.setName(vo.getProjectName());

+ 5 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/InformationQueryClientImpl.java

@@ -71,6 +71,11 @@ public class InformationQueryClientImpl implements InformationQueryClient {
         iInformationQueryService.save(obj);
     }
 
+    @Override
+    public void saveInfo(InformationQuery info) {
+        iInformationQueryService.save(info);
+    }
+
     @Override
     public void updateInformationQuery(String link, String classify, String nodeId, String contractId) {
         LambdaUpdateWrapper<InformationQuery> updateWrapper = new LambdaUpdateWrapper<>();

+ 5 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.java

@@ -59,6 +59,11 @@ public interface InformationQueryMapper extends BaseMapper<InformationQuery> {
      */
     List<QueryProcessDataVO> queryProcessDataByParentIdAndContractIdTwo(@Param("parentId") String parentId, @Param("classify") Integer classify, @Param("contractId") String contractId);
 
+    /**
+     * 查询工序节点的填报记录3
+     */
+    List<QueryProcessDataVO> queryProcessDataByParentIdAndContractId_3(@Param("classify") Integer classify, @Param("list") List<String> list);
+
     /**
      * 查询工序节点的填报记录,资料进度使用
      */

+ 25 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml

@@ -831,6 +831,31 @@
           AND wtc.status = 1
     </select>
 
+    <select id="queryProcessDataByParentIdAndContractId_3" resultMap="queryProcessDataMap">
+        SELECT wtc.id                                                                                   AS treeId,
+               wtc.p_key_id,
+               wtc.ancestors,
+               wtc.major_data_type,
+               wtc.node_type                                                                            AS nodeType,
+               IFNULL(if(length(trim(wtc.full_name)) > 0, wtc.full_name, wtc.node_name), wtc.node_name) AS title,
+               wtc.parent_id                                                                            AS parentId,
+               uiq.id                                                                                   AS informationQueryId,
+               IFNULL(uiq.status, 0)                                                                    AS status,
+               uiq.type                                                                                 AS queryType,
+               case
+                   WHEN uiq.pdf_trial_url is null then 'false'
+                   ELSE 'true' end                                                                      AS isExperiment
+        FROM m_wbs_tree_contract AS wtc
+                 LEFT JOIN u_information_query AS uiq
+                           ON wtc.p_key_id = uiq.wbs_id AND uiq.classify = #{classify} and uiq.is_deleted = 0 and
+                              wtc.is_deleted = 0 and
+                              wtc.status = 1
+        WHERE wtc.p_key_id in
+        <foreach collection="list" item="item" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+
     <select id="queryProcessDataByParentIdAndContractIdThree" resultMap="queryProcessDataMap">
         SELECT wtc.id                                                                                   AS treeId,
                wtc.p_key_id,

+ 3 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java

@@ -516,7 +516,9 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
             List<InformationQueryVO> voResult = JSONArray.parseArray(JSONObject.toJSONString(result), InformationQueryVO.class);
             //处理流程状态
             voResult.forEach(vor -> {
-                vor.setStartTime(DateUtil.format(vor.getCreateTime(), "yyyy-MM-dd"));
+                if (ObjectUtil.isNotEmpty(vor.getCreateTime())) {
+                    vor.setStartTime(DateUtil.format(vor.getCreateTime(), "yyyy-MM-dd"));
+                }
                 vor.setTaskStatusStr(new Integer("0").equals(vor.getStatus()) ? "未上报" : new Integer("1").equals(vor.getStatus()) ? "待审批" : new Integer("2").equals(vor.getStatus()) ? "已审批" : "已废除");
                 try {
                     //填报人

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

@@ -366,8 +366,8 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
         //修改主流程状态为3
         this.update(Wrappers.<Task>lambdaUpdate().set(Task::getStatus, 3).eq(Task::getId, task.getId()));
         //修改业务数据状态为未上报
-       // this.updateBusinessDataByFormDataId(task, 0, null);
-        this.updateBusinessDataByFormDataId(task, 0, null,-1L);
+        // this.updateBusinessDataByFormDataId(task, 0, null);
+        this.updateBusinessDataByFormDataId(task, 0, null, -1L);
 
         return true;
     }
@@ -376,41 +376,40 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
     public Map<String, String> getTaskCount(String projectId, String contractId, String userId) {
         if (StringUtils.isNotEmpty(projectId) && StringUtils.isNotEmpty(contractId)) {
             List<Task> tasks = this.baseMapper.selectList(Wrappers.<Task>lambdaQuery()
+                    .select(Task::getProcessInstanceId)
                     .eq(Task::getProjectId, projectId)
                     .eq(Task::getContractId, contractId)
-                    .eq(Task::getStatus, 1));
-
-            List<String> collect = tasks.stream().map(Task::getProcessInstanceId).collect(Collectors.toList());
-
-            long aLong = 0L;
-            if (collect.size() > 0) {
-                for (String id : collect) {
-                    Long row = taskParallelService.getBaseMapper().selectCount(Wrappers.<TaskParallel>lambdaQuery()
-                            .eq(TaskParallel::getProcessInstanceId, id)
-                            .eq(TaskParallel::getStatus, 1)
-                            .eq(TaskParallel::getTaskUser, userId)
-                    );
-                    if (row == 1) {
-                        aLong++;
-                    }
-                }
+                    .eq(Task::getStatus, 1)); //只获取待办任务数量
+
+            //任务主表相关数量
+            List<String> taskCountIds = tasks.stream().map(Task::getProcessInstanceId).collect(Collectors.toList());
+
+            //任务附表中当前用户的相关任务数量
+            long taskAllCount = 0;
+            if (taskCountIds.size() > 0) {
+                taskAllCount = taskParallelService.getBaseMapper().selectCount(Wrappers.<TaskParallel>lambdaQuery()
+                        .in(TaskParallel::getProcessInstanceId, taskCountIds)
+                        .eq(TaskParallel::getTaskUser, userId)
+                        .eq(TaskParallel::getStatus, 1));
             }
 
+            //未读消息提醒数量
             List<MessageWarning> messageWarnings = messageWarningService.getBaseMapper().selectList(Wrappers.<MessageWarning>lambdaQuery()
+                    .select(MessageWarning::getType)
                     .eq(MessageWarning::getProjectId, projectId)
                     .eq(MessageWarning::getContractId, contractId)
                     .eq(MessageWarning::getPushUser, userId)
                     .eq(MessageWarning::getIsRead, 0)
             );
+
             long messageCount1 = messageWarnings.stream().filter(f -> f.getType().equals(1)).count();
             long messageCount2 = messageWarnings.stream().filter(f -> f.getType().equals(2)).count();
             long messageCount3 = messageWarnings.stream().filter(f -> f.getType().equals(3)).count();
             long messageCount4 = messageWarnings.stream().filter(f -> f.getType().equals(4)).count();
             long messageCount5 = messageWarnings.stream().filter(f -> f.getType().equals(5)).count();
-
             Map<String, String> map = new HashMap<>();
-            map.put("allCount", String.valueOf(aLong + messageWarnings.size()));//任务管理
-            map.put("taskCount", String.valueOf(aLong));//任务查看
+            map.put("allCount", String.valueOf(taskAllCount + messageWarnings.size()));//任务管理
+            map.put("taskCount", String.valueOf(taskAllCount));//任务查看
             map.put("messageCount", String.valueOf(messageWarnings.size()));//消息提醒
             map.put("messageCount_1", String.valueOf(messageCount1));//任务催办
             map.put("messageCount_2", String.valueOf(messageCount2));//监测预警
@@ -622,14 +621,14 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                         //修改主流程状态为已完成
                         this.update(Wrappers.<Task>lambdaUpdate().set(Task::getStatus, 2).set(Task::getUpdateTime, new Date()).eq(Task::getId, masterTask.getId()));
                         //修改对应的业务数据状态为已审批
-                        this.updateBusinessDataByFormDataId(masterTask, 2, finalPdfUrl,taskApprovalVO.getUserId());
+                        this.updateBusinessDataByFormDataId(masterTask, 2, finalPdfUrl, taskApprovalVO.getUserId());
 
                         //返回电签成功的pdf路径,给试验用
                         return finalPdfUrl;
                     }
                 } else {
                     //只更新PDF路径
-                    this.updateBusinessDataByFormDataId(masterTask, 1, eVisaStatus.contains("@@@@") ? eVisaStatus.split("@@@@")[1] : null,taskApprovalVO.getUserId());
+                    this.updateBusinessDataByFormDataId(masterTask, 1, eVisaStatus.contains("@@@@") ? eVisaStatus.split("@@@@")[1] : null, taskApprovalVO.getUserId());
                     return eVisaStatus.contains("@@@@") ? eVisaStatus.split("@@@@")[1] : null;
                 }
             } else if ("eVisaError".equals(eVisaStatus) || eVisaStatus.contains("eVisaError")) {
@@ -700,7 +699,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             }
             this.update(Wrappers.<Task>lambdaUpdate().set(Task::getStatus, 3).set(Task::getUpdateTime, new Date()).eq(Task::getProcessInstanceId, masterProcessInstanceId));
             //修改对应的业务数据状态为已废除
-            this.updateBusinessDataByFormDataId(this.getOne(Wrappers.<Task>lambdaQuery().eq(Task::getProcessInstanceId, masterProcessInstanceId)), 3, null,taskApprovalVO.getUserId());
+            this.updateBusinessDataByFormDataId(this.getOne(Wrappers.<Task>lambdaQuery().eq(Task::getProcessInstanceId, masterProcessInstanceId)), 3, null, taskApprovalVO.getUserId());
 
             //任务废除通知
             this.abolishMessage(masterTask, currentLink, comment);
@@ -942,11 +941,11 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
     /**
      * 修改业务数据状态
      */
-    private void updateBusinessDataByFormDataId(Task task, Integer status, String newFileUrl,Long UserId) {
+    private void updateBusinessDataByFormDataId(Task task, Integer status, String newFileUrl, Long UserId) {
         switch (task.getApprovalType()) {
             case 1:
                 //资料填报
-                this.updateWriteBusinessDataStatus(task.getFormDataId(), status, newFileUrl,UserId);
+                this.updateWriteBusinessDataStatus(task.getFormDataId(), status, newFileUrl, UserId);
                 break;
             case 2:
                 //工程文件
@@ -977,50 +976,50 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
      * 资料填报
      */
     @Transactional
-    public void updateWriteBusinessDataStatus(String formDataId, Integer status, String newFileUrl,Long userId) {
-        String pdfPage ="";
-        Long pdfSize =0L;
+    public void updateWriteBusinessDataStatus(String formDataId, Integer status, String newFileUrl, Long userId) {
+        String pdfPage = "";
+        Long pdfSize = 0L;
         String dateInfo = "";
         try {
             System.out.println("----- 电签成功--------");
             pdfPage = commonFileClient.getPdfNum(newFileUrl);
             pdfSize = CommonUtil.getResourceLength(newFileUrl);
-            System.out.println("----- 电签成功--------==pdfPage"+pdfPage);
-            System.out.println("----- 电签成功--------==pdfSize"+pdfSize);
+            System.out.println("----- 电签成功--------==pdfPage" + pdfPage);
+            System.out.println("----- 电签成功--------==pdfSize" + pdfSize);
             List<String> list = Arrays.asList(formDataId.split(","));
-            for(String iId : list){
+            for (String iId : list) {
                 //获取
                 InformationQuery queryinfo = informationQueryService.getById(iId);
 
-                List<AppWbsTreeContractVO> WbsTreeContract = wbsTreeContractClient.searchNodeAllTableInfo(queryinfo.getWbsId() + "", queryinfo.getClassify() + "", queryinfo.getContractId() + "", queryinfo.getProjectId() + "",userId);
+                List<AppWbsTreeContractVO> WbsTreeContract = wbsTreeContractClient.searchNodeAllTableInfo(queryinfo.getWbsId() + "", queryinfo.getClassify() + "", queryinfo.getContractId() + "", queryinfo.getProjectId() + "", userId);
                 List<String> collect = new ArrayList<>();
-                Map<String,String> idMap = new HashMap<>();
-                for(AppWbsTreeContractVO appWbsTreeContractVO : WbsTreeContract){
+                Map<String, String> idMap = new HashMap<>();
+                for (AppWbsTreeContractVO appWbsTreeContractVO : WbsTreeContract) {
                     collect.add(appWbsTreeContractVO.getInitTableName());
-                    idMap.put(appWbsTreeContractVO.getInitTableName(),appWbsTreeContractVO.getPKeyId()+"");
+                    idMap.put(appWbsTreeContractVO.getInitTableName(), appWbsTreeContractVO.getPKeyId() + "");
                 }
                 List<TabBusstimeInfo> tabussTimeInfo = informationQueryService.getTabussTimeInfo(collect);
-                if(tabussTimeInfo!=null && tabussTimeInfo.size()>=1){
+                if (tabussTimeInfo != null && tabussTimeInfo.size() >= 1) {
                     TabBusstimeInfo tabBusstimeInfo = tabussTimeInfo.get(0);
-                    String querySql = "select "+tabBusstimeInfo.getColKey()+" from "+tabBusstimeInfo.getTabEnName()+" where p_key_id="+idMap.get(tabBusstimeInfo.getTabEnName());
+                    String querySql = "select " + tabBusstimeInfo.getColKey() + " from " + tabBusstimeInfo.getTabEnName() + " where p_key_id=" + idMap.get(tabBusstimeInfo.getTabEnName());
                     Map<String, Object> maps = jdbcTemplate.queryForMap(querySql);
-                    if(maps!=null){
-                      String  keyData = maps.get(tabBusstimeInfo.getColKey())+"";
-                        if(StringUtils.isNotEmpty(keyData)){
+                    if (maps != null) {
+                        String keyData = maps.get(tabBusstimeInfo.getColKey()) + "";
+                        if (StringUtils.isNotEmpty(keyData)) {
                             dateInfo = keyData.split("_\\^_")[0];
-                            if(dateInfo.indexOf("年")>=0){
-                                dateInfo = dateInfo.replace("年","-");
+                            if (dateInfo.indexOf("年") >= 0) {
+                                dateInfo = dateInfo.replace("年", "-");
                             }
-                            if(dateInfo.indexOf("月")>=0){
-                                dateInfo = dateInfo.replace("月","-");
+                            if (dateInfo.indexOf("月") >= 0) {
+                                dateInfo = dateInfo.replace("月", "-");
                             }
-                            if(dateInfo.indexOf("日")>=0){
-                                dateInfo = dateInfo.replace("日","");
+                            if (dateInfo.indexOf("日") >= 0) {
+                                dateInfo = dateInfo.replace("日", "");
                             }
                         }
                     }
                 }
-                System.out.println("----- 电签成功--------==修改---="+dateInfo);
+                System.out.println("----- 电签成功--------==修改---=" + dateInfo);
                 this.informationQueryService.update(Wrappers.<InformationQuery>lambdaUpdate().set(InformationQuery::getStatus, status)
                         .set(InformationQuery::getEVisaPdfUrl, newFileUrl)
                         .set(InformationQuery::getReportNumber, null)
@@ -1030,7 +1029,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                         .set(InformationQuery::getBusinessTime, dateInfo)
                         .in(InformationQuery::getId, Arrays.asList(formDataId.split(","))));
             }
-        }catch (Exception e){
+        } catch (Exception e) {
             this.informationQueryService.update(Wrappers.<InformationQuery>lambdaUpdate().set(InformationQuery::getStatus, status)
                     .set(InformationQuery::getEVisaPdfUrl, newFileUrl)
                     .set(InformationQuery::getReportNumber, null)
@@ -1042,7 +1041,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
         }
 
         //关联原生电子文件到归档
-        handleArchiveFileBusinessData(formDataId,status);
+        handleArchiveFileBusinessData(formDataId, status);
     }
 
     /**
@@ -1060,11 +1059,11 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 
     /**
      * 关联原生电子文件到归档
+     *
      * @param formDataId
-     * @param status 任务状态
+     * @param status     任务状态
      */
-    public void handleArchiveFileBusinessData(String formDataId, Integer status)
-    {
+    public void handleArchiveFileBusinessData(String formDataId, Integer status) {
         InformationQuery query = this.informationQueryService.getById(formDataId);
         if (query != null) {
             ArchiveProjectConfig archiveProjectConfig = archiveAutoClient.getByProjectIdOrNew(query.getProjectId());
@@ -1107,7 +1106,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
         //Long fileSize = FileUtils.getOssFileSizeCount(listFiles);
 
         if (archiveFiles != null && archiveFiles.size() > 0) {
-            for (ArchiveFile archiveFile: archiveFiles) {
+            for (ArchiveFile archiveFile : archiveFiles) {
                 archiveFile.setEVisaFile(query.getEVisaPdfUrl());
                 archiveFile.setPdfFileUrl(query.getEVisaPdfUrl()); // 这里将pdfFileUrl也更新了,因为需求中没有限制只能更新eVisaFile属性
                 archiveFile.setFileSize(query.getEVisaPdfSize());
@@ -1116,23 +1115,23 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
         } else {
             Date createTime = null;
             WbsTreeContract wbsTreeContract = wbsTreeContractClient.getContractNodeByPrimaryKeyId(keyId.toString());
-            if (wbsTreeContract!= null ) {
+            if (wbsTreeContract != null) {
                 createTime = wbsTreeContract.getCreateTime();
             }
-            ArchiveFile newArchiveFile = getArchiveFile(query,nodeId,keyId,query.getEVisaPdfSize(),contractIndfo.archivesUnit(),createTime);
+            ArchiveFile newArchiveFile = getArchiveFile(query, nodeId, keyId, query.getEVisaPdfSize(), contractIndfo.archivesUnit(), createTime);
             this.archiveFileService.save(newArchiveFile);
         }
     }
 
-    public ArchiveFile getArchiveFile(InformationQuery query,Long nodeId,Long keyId,Long fileSize,String unit,Date createTime) {
+    public ArchiveFile getArchiveFile(InformationQuery query, Long nodeId, Long keyId, Long fileSize, String unit, Date createTime) {
         ArchiveFile archiveFile = new ArchiveFile();
         archiveFile.setNodeId(nodeId.toString());
         archiveFile.setNodeExtId(keyId);
-        archiveFile.setProjectId(query.getProjectId() == null?"":query.getProjectId().toString());
+        archiveFile.setProjectId(query.getProjectId() == null ? "" : query.getProjectId().toString());
         archiveFile.setContractId(query.getContractId().toString());
         archiveFile.setStatus(2); // 这里是新增归档文件,所以状态为1(已完成)
         //TODO 文件题名规则,待补充
-        fillFileNameAndTime(archiveFile,query);
+        fillFileNameAndTime(archiveFile, query);
         archiveFile.setSourceType(1);
         archiveFile.setIsArchive(0);
 
@@ -1154,7 +1153,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
     }
 
 
-    public  void fillFileNameAndTime(ArchiveFile archiveFile,InformationQuery info) {
+    public void fillFileNameAndTime(ArchiveFile archiveFile, InformationQuery info) {
         archiveFile.setFileName(info.getName());
         archiveFile.setFileTime(info.getBusinessTime());
 
@@ -1164,16 +1163,17 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 
     /**
      * 废除任务时删除原生电子文件数据
+     *
      * @param projectId
      * @param wbsId
      */
-    public void delArchiveFileBusinessData(Long projectId,Long wbsId) {
+    public void delArchiveFileBusinessData(Long projectId, Long wbsId) {
         List<ArchiveFile> archiveFiles = this.archiveFileService.list(Wrappers.<ArchiveFile>lambdaQuery()
                 .eq(ArchiveFile::getProjectId, projectId)
                 .eq(ArchiveFile::getNodeExtId, wbsId)
                 .eq(ArchiveFile::getIsDeleted, 0));
 
-        if (archiveFiles!= null && archiveFiles.size() > 0) {
+        if (archiveFiles != null && archiveFiles.size() > 0) {
             List<Long> ids = archiveFiles.stream()
                     .map(ArchiveFile::getId)
                     .collect(Collectors.toList());

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

@@ -39,6 +39,7 @@ import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.FileUtil;
 import org.springblade.evisa.redissionUtil.DistributedRedisLock;
 import org.springblade.evisa.service.EVisaService;
 import org.springblade.evisa.vo.EVisaMakeSealVO;
@@ -135,6 +136,7 @@ public class EVisaServiceImpl implements EVisaService {
                     }
                 }
             }
+
             //没有找到合同章,直接返回
             if (contractPfx == null) {
                 return NOT_PFX_OR_FILE;
@@ -196,11 +198,9 @@ public class EVisaServiceImpl implements EVisaService {
                 //电签失败 ,接口返回认证失败
                 return "认证失败!认证接口调用异常";
             }
-
         } catch (Exception e) {
             e.printStackTrace();
         }
-
         return null;
     }
 
@@ -375,9 +375,15 @@ public class EVisaServiceImpl implements EVisaService {
                 Object[] result = this.signPdfByAXQZ(pdfVO, fileByte);
                 if (result != null) {
                     if (result[0] != null) {
-                        MultipartFile newFiles = new MockMultipartFile("file", SnowFlakeUtil.getId() + ".pdf", "text/plain", IOUtils.toByteArray(new ByteArrayInputStream((byte[]) result[0])));
+
+                      //MultipartFile newFiles = new MockMultipartFile("file", SnowFlakeUtil.getId() + ".pdf", "text/plain", IOUtils.toByteArray(new ByteArrayInputStream((byte[]) result[0])));
+
+                        byte[] byteArray = IOUtils.toByteArray(new ByteArrayInputStream((byte[]) result[0]));
+                        String dataUrl = "/www/wwwroot/Users/hongchuangyanfa/Desktop/pdf/"+SnowFlakeUtil.getId() + ".pdf";
+                        File file1 =new File(dataUrl);
+                        FileUtil.copy(byteArray,file1);
                         //重新上传
-                        BladeFile bladeFile = this.newIOSSClient.uploadFileByInputStream(newFiles);
+                        BladeFile bladeFile = this.newIOSSClient.uploadFile(SnowFlakeUtil.getId() + ".pdf",dataUrl);
                         if (bladeFile != null) {
                             resultMessage = SUCCESS + "@@@@" + bladeFile.getLink();
                         } else {

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

@@ -1476,7 +1476,7 @@ public class CustomFunction {
     public static Object tableNames(List<String> treeNodes) {
         if (CollectionUtil.isNotEmpty(treeNodes)) {
             List<String> nodes = new ArrayList<>(treeNodes);
-            return nodes.stream().filter(e -> StringUtils.isNotEmpty(e) && !e.contains("A15")).map(e -> e.replaceAll("_(PL)?_\\d+$", "")).distinct().collect(Collectors.joining("\n"));
+            return nodes.stream().filter(StringUtils::isNotEmpty).map(e -> e.replaceAll("[\\s]+|_(PL)?_\\d+$", "")).distinct().collect(Collectors.joining("\n"));
         }
         return "";
     }

+ 17 - 31
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -22,6 +22,7 @@ import org.jfree.data.xy.XYSeries;
 import org.jfree.data.xy.XYSeriesCollection;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
+import org.springblade.common.utils.BaseUtils;
 import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.IoUtil;
@@ -173,7 +174,12 @@ public class FormulaUtils {
                         if(values.stream().filter(CustomFunction::containsZH).anyMatch(e->e.toString().contains("\n"))){
                             fd.getValues().get(0).setValue(values.stream().filter(Objects::nonNull).map(Object::toString).collect(Collectors.joining()));
                         }else{
-                            fd.getValues().get(0).setValue(values.stream().map(StringUtils::handleNull).collect(Collectors.joining("、")));
+                            /*日期类型的元素只获取最后一个非空*/
+                            if(StringUtils.isEquals(4,fd.getEType())){
+                                fd.getValues().get(0).setValue(values.stream().filter(StringUtils::isNotEmpty).reduce((first, second) -> second).orElse(null));
+                            }else{
+                                fd.getValues().get(0).setValue(values.stream().map(StringUtils::handleNull).collect(Collectors.joining("、")));
+                            }
                         }
                     }else{
                         // copy(fd,values);
@@ -320,30 +326,7 @@ public class FormulaUtils {
         itemNames.stream().map(FormulaUtils::checkItemName).forEach(System.out::println);
     }*/
 
-    /**
-     * @Description 深度拷贝
-     * @Param [originalList]
-     * @return java.util.List<T>
-     * @Author yangyj
-     * @Date 2023.04.28 14:18
-     **/
-    public static <T extends Serializable> List<T> copyList(List<T> originalList) {
-        try {
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            ObjectOutputStream oos = new ObjectOutputStream(baos);
-            oos.writeObject(originalList);
-            oos.close();
-            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-            ObjectInputStream ois = new ObjectInputStream(bais);
-            @SuppressWarnings("unchecked")
-            List<T> copiedList = (List<T>) ois.readObject();
-            ois.close();
-            return copiedList;
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
+
 
 
 
@@ -491,10 +474,10 @@ public class FormulaUtils {
         return data.stream().peek(e->{if(StringUtils.isDouble(e.getValue())){e.setValue(StringUtils.number2StringZero(e.getValue(),finalScale));}}).collect(Collectors.toList());
     }
 
-    public static void main1(String[] args) {
-        Map<String,String> map=getElementCell("/www/wwwroot//Users/hongchuangyanfa/Desktop/privateUrl/1584783238218383360.html","key_16");
+/*    public static void main(String[] args) {
+        Map<String,String> map=getElementCell("/www/wwwroot/Users/hongchuangyanfa/Desktop/privateUrl/1694630551069130752.html","key_22");
         System.out.println(map);
-    }
+    }*/
     /**
      * @Description  定位信息排序
      * @Param [coords]
@@ -611,8 +594,9 @@ public class FormulaUtils {
         return list;
     }
     /**从时间段中获取最后一个日期*/
+    static final  String RANGE_DATE_REG="^\\[(\\d{4}[年.\\-]\\d{2}[月.\\-]\\d{2}[日]?),\\s+(\\d{4}[年.\\-]\\d{2}[月.\\-]\\d{2}[日]?)]$";
     public  static String range2end(String t){
-        if(t!=null&&Pattern.matches("^\\[(\\d{4}[年.\\-]\\d{2}[月.\\-]\\d{2}[日]?),\\s+(\\d{4}[年.\\-]\\d{2}[月.\\-]\\d{2}[日]?)]$",t)){
+        if(t!=null&&Pattern.matches(RANGE_DATE_REG,t)){
             t=t.replaceAll("^\\[|]$","").split(",")[1].trim();
         }
         return t;
@@ -620,8 +604,6 @@ public class FormulaUtils {
 
     public static FormData createFormDataFast(String name,String code,String values,String coords){
         if(StringUtils.isNotEmpty(code,name)){
-            //String[] arr=code.split(":");
-           // String coords = tec.getCoordinateMap().get(arr[0]).get(arr[1]);
             if(StringUtils.isNotEmpty(coords)) {
                 /*定位信息存在才合法*/
                 List<Coords> coordsList = Stream.of(coords).flatMap(s -> Arrays.stream(s.split(";"))).map(s -> {
@@ -657,6 +639,8 @@ public class FormulaUtils {
                 }
                 FormData one = new FormData(code, eds, null, coords);
                 one.setEName(name);
+                /*备份原始数据,用于更新比较*/
+                one.init();
                 return one;
             }
         }
@@ -756,4 +740,6 @@ public class FormulaUtils {
 
 
 
+
+
 }

+ 2 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/AppVersionDetailController.java

@@ -36,11 +36,12 @@ public class AppVersionDetailController extends BladeController {
     @GetMapping("/getNewVersion")
     @ApiOperationSupport(order = 2)
     @ApiOperation(value = "获取最新版本", notes = "传入版本id与软件类型1安卓2IOS")
-    public R<AppVersionDetail> getNewVersion(String platform,Integer softwareType){
+    public R<AppVersionDetail> getNewVersion(String platform,Integer softwareType,Integer fileType){
         AppVersion one = versionService.getOne(new LambdaQueryWrapper<AppVersion>().eq(AppVersion::getPlatform, platform));
         return R.data(versionDetailService.getOne(new LambdaQueryWrapper<AppVersionDetail>()
                             .eq(AppVersionDetail::getVersionId,one.getId())
                             .eq(AppVersionDetail::getSoftwareType,softwareType)
+                            .eq(AppVersionDetail::getFileType,fileType)
                             .orderByDesc(AppVersionDetail::getUpdateDate)
                             .last("limit 1")));
     }

+ 89 - 46
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -16,7 +16,6 @@ import io.swagger.annotations.*;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
 import org.apache.commons.codec.Charsets;
-import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.poi.ss.usermodel.WorkbookFactory;
@@ -25,6 +24,7 @@ import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 import org.springblade.business.entity.ContractLog;
+import org.springblade.business.entity.InformationQuery;
 import org.springblade.business.feign.ContractLogClient;
 import org.springblade.business.feign.InformationQueryClient;
 import org.springblade.business.vo.SaveContractLogVO;
@@ -74,6 +74,7 @@ import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.io.*;
 import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
 import java.util.List;
 import java.util.*;
 import java.util.regex.Matcher;
@@ -142,6 +143,8 @@ public class ExcelTabController extends BladeController {
 
     private final IContractInfoService contractInfoService;
 
+    private final IWbsParamService wbsParamService;
+
 
     /**
      * 详情
@@ -301,9 +304,9 @@ public class ExcelTabController extends BladeController {
         String filecode = SnowFlakeUtil.getId() + "";
         String thmlUrl = file_path + filecode + ".html";
         String exceUrl = file_path + filecode + "123.xlsx";
-        ExcelInfoUtils.excelInfo(file.getInputStream(),exceUrl,thmlUrl,"1");
+        ExcelInfoUtils.excelInfo(file.getInputStream(), exceUrl, thmlUrl, "1");
         // 上传excel文件
-         BladeFile bladeFile = newIOSSClient.uploadFile(file.getOriginalFilename(),exceUrl);
+        BladeFile bladeFile = newIOSSClient.uploadFile(file.getOriginalFilename(), exceUrl);
         // 解析原始excel
 
         BladeFile bladeFileR = newIOSSClient.uploadFileByInputStream(file);
@@ -1912,7 +1915,7 @@ public class ExcelTabController extends BladeController {
         R<BladeFile> bladeFile = iossClient.addFileInfo(file);
         BladeFile bladeFile1 = bladeFile.getData();
         TableFile tableFile = new TableFile();
-        String fileExtension = FileUtil.getFileExtension(bladeFile1.getName());
+        String fileExtension = FileUtil.getFileExtension(bladeFile1.getName()).toLowerCase();
         tableFile.setTabId(pkeyId + "");
         tableFile.setName(file.getOriginalFilename());
         tableFile.setType(2);
@@ -1931,7 +1934,8 @@ public class ExcelTabController extends BladeController {
         } else if (fileExtension.contains("docx")) {
             newBladeFile = this.commonFileClient.wordToPdf(file);
             tableFile.setDomainPdfUrl(newBladeFile.getPdfUrl());
-        } else if (fileExtension.contains("png") || file.getOriginalFilename().contains("jpg")) {
+        } else if (fileExtension.contains("png") || fileExtension.contains("jpg") || fileExtension.contains("webp") || fileExtension.contains("apng") ||
+                fileExtension.contains("bmp") || fileExtension.contains("jepg") || fileExtension.contains("tif") || fileExtension.contains("gif")) {
             newBladeFile = this.commonFileClient.pngOrJpgToPdf(file);
             tableFile.setDomainPdfUrl(newBladeFile.getPdfUrl());
         } else if (fileExtension.contains("pdf")) {
@@ -1950,7 +1954,26 @@ public class ExcelTabController extends BladeController {
         updateWrapper.set("is_tab_pdf", 2);
         wbsTreeContractService.update(updateWrapper);
         // 合并后
-
+        //如果上传文件前没有保存过,则直接生成一条基础数据
+        String sql = "select pdf_url,e_visa_pdf_url,pdf_trial_url,pdf_trial_url_position,status from u_information_query where classify='" + classify + "' and wbs_id='" + nodeId + "' and contract_id='" + contractId + "'";
+        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
+        if (maps == null || maps.size() == 0) {
+            WbsTreeContract contract = wbsTreeContractService.getOne(new LambdaQueryWrapper<WbsTreeContract>().eq(WbsTreeContract::getPKeyId,nodeId));
+            String fileName = this.wbsParamService.createFileTitle(Func.isNotEmpty(contract.getOldId()) ? Long.valueOf(contract.getOldId()) : contract.getId(), Long.parseLong(contract.getContractId()), contract);
+            fileName = StringUtils.isNotEmpty(fileName) ? fileName : "缺少文件提名配置";
+            InformationQuery query = new InformationQuery();
+            query.setId(SnowFlakeUtil.getId());
+            query.setWbsId(Long.parseLong(nodeId));
+            query.setContractId(Long.parseLong(contractId));
+            query.setProjectId(Long.parseLong(projectId));
+            query.setClassify(Integer.parseInt(classify));
+            query.setCategory(contract.getNodeType());
+            query.setType((contract.getIsExpernode() == null || contract.getIsExpernode() <= 0) ? 1 : 2);
+            query.setName(fileName);
+            query.setCreateTime(new Date());
+            query.setFileUserIdAndName(AuthUtil.getUserId()+"-"+AuthUtil.getUserName());
+            informationQueryClient.saveInfo(query);
+        }
         excelTabService.getBussPdfs(nodeId, classify, contractId, projectId);
 
         return R.data(tableFile.getId());
@@ -1964,7 +1987,7 @@ public class ExcelTabController extends BladeController {
             @ApiImplicitParam(name = "status", value = "状态(1显示 2隐藏)", required = true)
     })
     @Transactional
-    public R showBussTab(Long pkeyId, int status,String nodeId,String classify) throws Exception {
+    public R showBussTab(Long pkeyId, int status, String nodeId, String classify) throws Exception {
         WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
                 .eq(WbsTreeContract::getPKeyId, pkeyId));
         UpdateWrapper<WbsTreeContract> updateWrapper = new UpdateWrapper<>();
@@ -2083,35 +2106,26 @@ public class ExcelTabController extends BladeController {
     @PostMapping("/save_buss_data")
     @ApiOperationSupport(order = 13)
     @ApiOperation(value = "填报页面数据保存", notes = "填报页面数据保存")
-    public R<String> saveBussData(@Valid @RequestBody JSONObject dataInfo, BladeUser bladeUser) throws Exception {
+    public R saveBussData(@Valid @RequestBody JSONObject dataInfo) throws Exception {
         JSONArray dataArray = new JSONArray();
-        if (dataInfo.containsKey("dataInfo")) { // 节点保存
+        if (dataInfo.containsKey("dataInfo")) { //节点保存
             JSONObject jsonObject = dataInfo.getJSONObject("dataInfo");
             dataArray = jsonObject.getJSONArray("orderList");
-        } else { // 单个保存
+        } else { //单个保存
             dataArray.add(dataInfo);
         }
 
         JSONObject tableInfo1 = dataArray.getJSONObject(0);
-        String nodeid = tableInfo1.getString("nodeId");
+        String nodeId = tableInfo1.getString("nodeId");
         String contractId = tableInfo1.getString("contractId");
         String projectId = tableInfo1.getString("projectId");
         String classify = tableInfo1.getString("classify");
-        String groupId = tableInfo1.getString("tabGroupId");
-        String pkeyId = tableInfo1.getString("pkeyId");
 
-        //
-        String pkeyIds = pkeyId;
-        String groupIds = groupId;
-        for (int i = 1; i < dataArray.size(); i++) {
-            JSONObject jsonObject = dataArray.getJSONObject(i);
-            pkeyIds += "," + jsonObject.getString("pkeyId");
-            groupIds += "," + jsonObject.getString("tabGroupId");
-        }
         /*全加载,或者可以优化成依赖加载*/
+        List<AppWbsTreeContractVO> tableAll = new ArrayList<>();
         List<TableInfo> tableInfoList = this.excelTabService.getTableInfoList(dataArray);
         if (tableInfoList != null) {
-            List<AppWbsTreeContractVO> tableAll = wbsTreeContractService.searchNodeAllTable(nodeid, "1", contractId, projectId);
+            tableAll = wbsTreeContractService.searchNodeAllTable(nodeId, "1", contractId, projectId);
             List<Long> tableAllIds = tableAll.stream().map(AppWbsTreeContractVO::getPKeyId).collect(Collectors.toList());
             if (tableAll.size() > tableInfoList.size()) {
                 List<Long> exclude = tableInfoList.stream().map(TableInfo::getPkeyId).map(Long::parseLong).collect(Collectors.toList());
@@ -2121,7 +2135,7 @@ public class ExcelTabController extends BladeController {
                         R bussDataInfo = this.excelTabService.getBussDataInfo(pk, 1);
                         @SuppressWarnings("unchecked")
                         Map<String, Object> jo = (Map<String, Object>) bussDataInfo.getData();
-                        if(jo!=null && ObjectUtils.isNotEmpty(jo)){
+                        if (jo != null && ObjectUtils.isNotEmpty(jo)) {
                             jo.put("pkeyId", pk);
                             extra.add(jo);
                         }
@@ -2143,27 +2157,47 @@ public class ExcelTabController extends BladeController {
                 tableInfoList.sort(Comparator.comparingInt(a -> tableAllIds.indexOf(Long.parseLong(a.getPkeyId()))));
             }
         }
+
         //公式填充
-        this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeid), ExecuteType.INSPECTION);
-        // 保存数据到数据库
-        R info = this.excelTabService.saveOrUpdateInfo(tableInfoList);
-        if (!info.isSuccess()) {
-            return info;
+        this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeId), ExecuteType.INSPECTION);
+        //保存数据到数据库
+        R<Object> result = this.excelTabService.saveOrUpdateInfo(tableInfoList);
+        if (!result.isSuccess()) {
+            return R.fail(result.getMsg());
         }
-        try {
-            //单个 pdf加载
-            if (tableInfoList != null) {
-                for (TableInfo tableInfo : tableInfoList) {
-                    excelTabService.getBussPdfInfo(Long.parseLong(tableInfo.getPkeyId()));
+
+
+        List<String> errorPKeyIds = new ArrayList<>();
+        //单个pdf加载
+        if (tableInfoList != null) {
+            for (TableInfo tableInfo : tableInfoList) {
+                R bussPdfInfo = excelTabService.getBussPdfInfo(Long.parseLong(tableInfo.getPkeyId()));
+                if (ObjectUtil.isEmpty(bussPdfInfo) || bussPdfInfo.getCode() != 200) {
+                    //如果返回的单张pdfUrl为空,那么表示发生异常,返回异常信息
+                    errorPKeyIds.add(tableInfo.getPkeyId());
                 }
             }
-            // 合并pdf加载
-            excelTabService.getBussPdfs(nodeid, classify, contractId, projectId);
-        } catch (Exception e) {
-            e.printStackTrace();
         }
+
+        //发生异常后直接返回,不进行合并
+        if (errorPKeyIds.size() > 0) {
+            List<AppWbsTreeContractVO> errorTabs = new LinkedList<>();
+            for (AppWbsTreeContractVO appWbsTreeContractVO : tableAll) {
+                if (errorPKeyIds.contains(appWbsTreeContractVO.getPKeyId().toString())){
+                    errorTabs.add(appWbsTreeContractVO);
+                }
+            }
+            if (errorTabs.size() > 0) {
+                List<String> names = errorTabs.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList());
+                return R.fail("以下的表在生成pdf文件时发生了异常【" + StringUtils.join(names, "、") + "】");
+            }
+        }
+
+        //合并pdf加载
+        excelTabService.getBussPdfs(nodeId, classify, contractId, projectId);
         //更新缓存
         informationQueryClient.delAsyncWbsTree(contractId);
+
         return R.data("操作成功");
     }
 
@@ -2328,16 +2362,19 @@ public class ExcelTabController extends BladeController {
                                                 x1 = 1;
                                             }
                                             String myData = dataMap.get(val) + "";
-                                            if (myData.indexOf("T") >= 0 && myData.indexOf("-") >= 0) {
+                                            if ((myData.indexOf("T") >= 0 && myData.indexOf("-") >= 0) || (myData.indexOf(",") >= 0 && myData.indexOf("]") >= 0)) {
+                                                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+                                                sdf.setTimeZone(TimeZone.getTimeZone("GTM+8"));
+                                                SimpleDateFormat formatStr = new SimpleDateFormat("yyyy年MM月dd日");
                                                 if (myData.indexOf(",") >= 0 && myData.indexOf("]") >= 0) {
-                                                    myData = myData.replace("[", "").replace("]", "");
-                                                    String[] dataVal = myData.split(",");
-                                                    String[] Start_dataStr = dataVal[0].split("T")[0].split("-");
-                                                    String StartDate = StringUtil.format("{}年{}月{}日", Start_dataStr[0], Start_dataStr[1], Integer.parseInt(Start_dataStr[2]) + 1);
 
-                                                    String[] end_dataStr = dataVal[1].split("T")[0].split("-");
-                                                    String endDate = StringUtil.format("{}年{}月{}日", end_dataStr[0], end_dataStr[1], Integer.parseInt(end_dataStr[2]) + 1);
+                                                    myData = myData.replace("[", "").replace("]", "").replaceAll("'", "");
+                                                    String[] dataVal = myData.split(",");
 
+                                                    Date Start_dataStr = sdf.parse(dataVal[0]);
+                                                    Date end_dataStr = sdf.parse(dataVal[1]);
+                                                    String StartDate = formatStr.format(Start_dataStr);
+                                                    String endDate = formatStr.format(end_dataStr);
                                                     if (StartDate.equals(endDate)) {
                                                         myData = StartDate;
                                                     } else {
@@ -2345,7 +2382,9 @@ public class ExcelTabController extends BladeController {
                                                     }
                                                 } else {
                                                     String[] dataStr = myData.split("T")[0].split("-");
-                                                    myData = StringUtil.format("{}年{}月{}日", dataStr[0], dataStr[1], Integer.parseInt(dataStr[2]));
+                                                    if (dataStr.length == 3) {
+                                                        myData = StringUtil.format("{}年{}月{}日", dataStr[0], dataStr[1], Integer.parseInt(dataStr[2]));
+                                                    }
                                                 }
                                             }
 
@@ -2364,6 +2403,11 @@ public class ExcelTabController extends BladeController {
                                                 pic.setHeight(Height);
                                                 sheet.getCellRange(y1, x1).getStyle().setShrinkToFit(true);
 
+                                            } else if (myData.equals("1") && data.html().indexOf("hc-form-checkbox-group") >= 0) {
+                                                CellRange cell = sheet.getCellRange(y1, x1);
+                                                String exceVal = cell.getText().replaceAll(" ", "");
+                                                cell.getCellStyle().getExcelFont().setFontName("EUDC");
+                                                cell.setText(exceVal.replace("□", "\u2611"));
                                             } else {
                                                 final CellRange cellRange = sheet.getCellRange(y1, x1);
                                                 cellRange.setText(myData);
@@ -3721,5 +3765,4 @@ public class ExcelTabController extends BladeController {
         return R.fail("操作失败");
     }
 
-
 }

+ 128 - 13
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -15,6 +15,7 @@ import com.mixsmart.utils.StringUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import lombok.SneakyThrows;
 import org.springblade.common.utils.BaseUtils;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
@@ -28,6 +29,7 @@ import org.springblade.core.tool.utils.StringPool;
 import org.springblade.manager.dto.*;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.enums.ExecuteType;
+import org.springblade.manager.formula.ITurnPointCalculator;
 import org.springblade.manager.formula.KeyMapper;
 import org.springblade.manager.formula.impl.CompositeDataAccess;
 import org.springblade.manager.formula.impl.StartupTimeListener;
@@ -42,6 +44,8 @@ import org.springframework.web.bind.annotation.*;
 import springfox.documentation.annotations.ApiIgnore;
 
 import java.io.FileNotFoundException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.time.Instant;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
@@ -321,25 +325,41 @@ public class FormulaController {
                 }
             }
             String[] dw2 = keymap.get(info.getKey()).split(StringPool.SEMICOLON);
-            // 排序
-            String dw[] = new String[dw2.length];
+            //排序
+            String[] dw = new String[dw2.length];
             int start=0;
             List<String> list = Arrays.asList(dw2);
-            // 横向排序
+            //横向排序
             int yindex;
             int xindex;
             if(info.getDirection().equals("2")){ //纵向
                 yindex = 1;
                 xindex = 0;
-            } else { //横向
+            } else {//横向
                 xindex = 1;
                 yindex = 0;
             }
-            Map<Integer, List<String>> collect = list.stream().filter(s -> s.indexOf("_")>=0).collect(Collectors.groupingBy(s -> Integer.parseInt(s.split("_")[yindex])));
+
+            //Map<Integer, List<String>> collect = list.stream().filter(s -> s.contains("_")).collect(Collectors.groupingBy(s -> Integer.parseInt(s.split("_")[yindex])));
+
+            //转为LinkedHashMap并保持List<String>顺序
+            Map<Integer, List<String>> collect = list.stream()
+                    .filter(s -> s.contains("_"))
+                    .collect(Collectors.toMap(
+                            s -> Integer.parseInt(s.split("_")[yindex]),
+                            Collections::singletonList,
+                            (obj1, obj2) -> {
+                                List<String> mergedList = new ArrayList<>(obj1);
+                                mergedList.addAll(obj2);
+                                return mergedList;
+                            },
+                            LinkedHashMap::new
+                    ));
+
             int j=0;
             for(Integer key: collect.keySet()){
                 List<String> datakey = collect.get(key);
-                List<String> ordList = datakey.stream().filter(s -> s.indexOf("_")>=0).sorted(Comparator.comparing(s -> Integer.parseInt(s.split("_")[xindex]))).collect(Collectors.toList());
+                List<String> ordList = datakey.stream().filter(s -> s.contains("_")).sorted(Comparator.comparing(s -> Integer.parseInt(s.split("_")[xindex]))).collect(Collectors.toList());
                 for (String ord:ordList){
                     dw[j]=ord;
                     j++;
@@ -439,13 +459,16 @@ public class FormulaController {
     }
 
     @GetMapping("/log")
-    public R<Object> log(Long pkeyId) {
+    public R<Object> log(Long pkeyId) throws UnknownHostException {
         Map<String, Object> result = new HashMap<>();
         Instant startupTime = StartupTimeListener.getStartupTime();
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault());
         result.put("版本信息", "Application started at:" + formatter.format(startupTime));
+        result.put("公式版本", "Formula version:" + ITurnPointCalculator.VERSION);
+        result.put("serve",   System.getProperty("os.name"));
         if (Func.isNotEmpty(pkeyId)) {
-            result.put("执行情况", this.jdbcTemplate.queryForList("select * from m_formula_log where id=" + pkeyId));
+            String sql="select * from m_formula_log where id=?";
+            result.put("执行情况", this.jdbcTemplate.queryForList(sql,pkeyId));
         }
         return R.data(result);
     }
@@ -504,7 +527,7 @@ public class FormulaController {
                     })
                     .collect(Collectors.joining("\n"));
             System.out.println(result);
-            return R.data(result);
+            return R.data(list);
         }
         return R.fail("无数据");
     }
@@ -770,10 +793,13 @@ public class FormulaController {
         return formula;
     }
 
-
+    /**initTableName 缺失刷入*/
     @GetMapping("/table-name")
-    public R<Object> lack() {
-        List<Map<String,Object>> listMap=this.jdbcTemplate.queryForList("select p_key_id pkeyId,node_name nodeName from m_wbs_tree_contract where  project_id=1630011899725201410 and table_type>0  and is_deleted=0 and init_table_name is null ");
+    public R<Object> lack(Long projectId) {
+        if(!StringUtils.isNumber(projectId)){
+            return R.fail("错误项目id格式");
+        }
+        List<Map<String,Object>> listMap=this.jdbcTemplate.queryForList("select p_key_id pkeyId,node_name nodeName from m_wbs_tree_contract where  project_id="+projectId+" and table_type>0  and is_deleted=0 and init_table_name is null ");
         Map<Long,String> idMap= listMap.stream().collect(Collectors.toMap(m->Long.parseLong(m.get("pkeyId").toString()),m->m.get("nodeName").toString()));
         List<Map<String,Object>> tn = this.jdbcTemplate.queryForList("select tab_ch_name ch,tab_en_name en  from m_table_info where tab_ch_name in("+idMap.values().stream().distinct().map(Object::toString).collect(Collectors.joining("','","'","'"))+")");
         Map<String,String> tbMap= tn.stream().collect(Collectors.toMap(m->m.get("ch").toString(),m->m.get("en").toString()));
@@ -787,7 +813,7 @@ public class FormulaController {
         return R.success("成功");
     }
 
-
+    /*项目级*/
     public R<Object> flushPri(){
         List<Map<String,Object>> listMap=this.jdbcTemplate.queryForList("select p_key_id nodeId,init_table_id tableId from m_wbs_tree_private where project_id=1630011899725201410 and init_table_id is not null and init_table_name is null and is_deleted=0");
         if(listMap.size()>0){
@@ -811,5 +837,94 @@ public class FormulaController {
         return R.fail("失败");
     }
 
+    @GetMapping("/ref")
+    public R<Object> ref(Long projectId) {
+        if(!StringUtils.isNumber(projectId)){
+            R.fail("项目Id格式有问题");
+        }
+        /*专门用刷数据的*/
+ //       Long contractId=1630017379264610305L;
+        if(projectId==null) {
+            projectId = 1630011899725201410L;
+        }
+        List<ContractInfo> contractInfoList =this.contractInfoService.list(Wrappers.<ContractInfo>lambdaQuery().eq(ContractInfo::getPId,projectId.toString()).eq(ContractInfo::getContractType,1));
+       for (ContractInfo info:contractInfoList){
+           System.out.println("刷新开始");
+           System.out.println(info.getContractName());
+           if(cp(info.getId(),projectId)){
+               System.out.println("成功");
+           }else{
+               System.out.println("失败");
+           }
+           System.out.println("刷新结束");
+       }
+
+      /*  String sql ="select p_key_id pkeyId ,id,old_id originId,full_name fullName,node_name nodeName  from m_wbs_tree_contract where contract_id=? and node_type in(6,4) and major_data_type in(2,3,4) AND is_deleted=0 and is_type_private_pid is null";
+        List<Map<String,Object>> listMaps=this.jdbcTemplate.queryForList(sql,contractId);
+        if(listMaps.size()>0){
+           Map<Long,List<Map<String,Object>>> group=listMaps.stream().collect(Collectors.groupingBy(m->{Object id=m.get("id");Object originId=m.get("originId");if(originId!=null){
+                        return Long.parseLong(originId.toString());
+                    }else{
+                        return Long.parseLong(id.toString());
+                    }}));
+           String sql2="select node_name nodeName,p_key_id pkeyId,id from m_wbs_tree_private where id in ("+group.keySet().stream().map(Objects::toString).collect(Collectors.joining(","))+") and project_id=?";
+           List<Map<String,Object>> privateListMap= this.jdbcTemplate.queryForList(sql2,projectId);
+           if(privateListMap.size()>0){
+               Map<Long,Long> kkm=privateListMap.stream().collect(Collectors.toMap(s->Long.parseLong(s.get("id").toString()),s->Long.parseLong(s.get("pkeyId").toString())));
+               System.out.println(kkm.size());
+               *//*{id,pkeyId}*//*
+               Set<Long> set = new HashSet<>(group.keySet());
+               set.removeAll(kkm.keySet());
+               System.out.println("剩余数量:"+set.size());
+           }
+
+        }*/
+      return    R.success("成功");
+    }
+
+    private  boolean cp(Long contractId,Long projectId){
+        try{
+            String sql ="select p_key_id pkeyId ,id,old_id originId,full_name fullName,node_name nodeName  from m_wbs_tree_contract where contract_id=? and node_type in(6,4) and major_data_type in(2,3,4) AND is_deleted=0 and is_type_private_pid is null";
+            List<Map<String,Object>> listMaps=this.jdbcTemplate.queryForList(sql,contractId);
+            if(listMaps.size()>0){
+                Map<Long,List<Map<String,Object>>> group=listMaps.stream().collect(Collectors.groupingBy(m->{Object id=m.get("id");Object originId=m.get("originId");if(originId!=null){
+                    return Long.parseLong(originId.toString());
+                }else{
+                    return Long.parseLong(id.toString());
+                }}));
+                String sql2="select node_name nodeName,p_key_id pkeyId,id from m_wbs_tree_private where id in ("+group.keySet().stream().map(Objects::toString).collect(Collectors.joining(","))+") and project_id=?";
+                List<Map<String,Object>> privateListMap= this.jdbcTemplate.queryForList(sql2,projectId);
+                if(privateListMap.size()>0){
+                    Map<Long,Long> kkm=privateListMap.stream().collect(Collectors.toMap(s->Long.parseLong(s.get("id").toString()),s->Long.parseLong(s.get("pkeyId").toString())));
+                    /*{id,pkeyId}*/
+                    List<String> updateSql= new ArrayList<>();
+                    group.forEach((k,v)->{
+                        Long pkeyId=kkm.get(k);
+                        String ids = v.stream().map(g->g.get("pkeyId").toString()).collect(Collectors.joining(","));
+                        String sqlTg="update m_wbs_tree_contract set is_type_private_pid="+pkeyId+"  where p_key_id in("+ids+") ";
+                        updateSql.add(sqlTg);
+                    });
+                    if(updateSql.size()>0){
+                        /*每一百条为一组*/
+                      List<List<String>>  lists=  BaseUtils.splitList(updateSql,100);
+                      lists.forEach(l->{
+                          try {
+                              this.jdbcTemplate.batchUpdate(l.toArray(new String[0]));
+                          }catch (Exception e){
+                              e.printStackTrace();
+                          }
+                      });
+                    }
+                    Set<Long> set = new HashSet<>(group.keySet());
+                    set.removeAll(kkm.keySet());
+                    System.out.println("剩余无非关联的数量:"+set.size());
+                }
+                return true;
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return false;
+    }
 
 }

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TabBusstimeInfoController.java

@@ -129,7 +129,7 @@ public class TabBusstimeInfoController extends BladeController {
 		String [] keys = tabBusstimeInfo.getColKey().split(":");
 		tabBusstimeInfo.setColKey(keys[1]);
 		tabBusstimeInfo.setTabEnName(keys[0]);
-		tabBusstimeInfoService.delTabBussTimeByColId(tabBusstimeInfo.getColId()+"");
+		tabBusstimeInfoService.delTabBussTimeByColId(tabBusstimeInfo.getTableId()+"","");
 		return R.status(tabBusstimeInfoService.save(tabBusstimeInfo));
 	}
 
@@ -140,6 +140,6 @@ public class TabBusstimeInfoController extends BladeController {
 	@ApiOperationSupport(order = 2)
 	@ApiOperation(value = "逻辑删除", notes = "传入ids")
 	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-		return R.status(tabBusstimeInfoService.delTabBussTimeByColId(ids));
+		return R.status(tabBusstimeInfoService.delTabBussTimeByColId(null,ids));
 	}
 }

+ 2 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java

@@ -480,13 +480,11 @@ public class TextdictInfoController extends BladeController {
 
                 } else if (textdictInfo.getTextId().equals("img")) { //图片
                     element.empty().append("<hc-table-form-upload @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight'  :src='" + vmode + "' placeholder=" + placeholder + "  @mouseup.right='RightClick(" + parm + ")' v-model=" + vmode + "  keyName=" + keyname + " weighing=" + weighing + "  @success='formUploadSuccess' @del='delTableFormFile' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + "></hc-table-form-upload> ");
-                    element.removeAttr("style");
-                    //默认图片是在线框里,如果在线框外替换成图片,会自带线框
-                    element.attr("style","border-style: solid;");
+//                  element.removeAttr("style");
                 } else if (textdictInfo.getTextId().equals("searchSelect")) { //搜索框
                     element.empty().append("<hc-form-select-search id=" + keyname + " @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight'  @mouseup.right='RightClick(" + parm + ")' type='dap_site_data' :val=" + vmode + " contractId=''  pkeyId='' @change='formRemoteChange' v-model=" + vmode + " placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%' > </hc-form-select-search>");
                 } else if (textdictInfo.getTextId().equals("strengthSearch")) { //强度搜索框
-                    element.empty().append("<hc-form-select-search2 id=" + keyname + " @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight  @mouseup.right='RightClick(" + parm + ")'' type='strength_search' :val=" + vmode + " contractId=''  pkeyId='' @change='formRemoteChange' v-model=" + vmode + " placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%' > </hc-form-select-search2>");
+                    element.empty().append("<hc-form-select-search2 id=" + keyname + " @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight'  @mouseup.right='RightClick(" + parm + ")' type='strength_search' :val=" + vmode + " contractId=''  pkeyId='' @change='formRemoteChange' v-model=" + vmode + " placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%' > </hc-form-select-search2>");
                 }
                 element.attr("@click", "getInformation(" + oncklickText + ")");
 

+ 3 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java

@@ -14,7 +14,6 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
 import org.springblade.common.utils.BaseUtils;
-import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
@@ -455,8 +454,7 @@ public class WbsParamController {
         return formula;
     }
 
-    @GetMapping("/del-duplicate")
-    public R<Object> duplicate() {
+    /*private R<Object> duplicate() {删除重复节点参数配置,方法已经过时无法直接使用
         try {
             StopWatch stopWatch = new StopWatch();
             stopWatch.start("节点参数查重及删除");
@@ -473,7 +471,7 @@ public class WbsParamController {
                         if (!relationMap.isEmpty()) {
                             Object id = relationMap.get(0).get("paramId");
                             removeWpIds.addAll(v.stream().map(WbsParam::getId).filter(eId -> !StringUtils.isNotEquals(id, eId)).collect(Collectors.toList()));
-                            /*同一道工序下,一个节点参数可能会关联多个元素,除了保留参数关联的以外全部添加到待删除列表*/
+                            *//*同一道工序下,一个节点参数可能会关联多个元素,除了保留参数关联的以外全部添加到待删除列表*//*
                             relationMap.stream().filter(x -> StringUtils.isNotEquals(x.get("paramId"), id)).forEach(e -> {
                                 removeMapingIds.add(Long.parseLong(e.get("mappingId").toString()));
                                 removeFormulaIds.add(Long.parseLong(e.get("formulaId").toString()));
@@ -504,7 +502,7 @@ public class WbsParamController {
             e.printStackTrace();
         }
         return R.fail("执行异常");
-    }
+    }*/
 
     public <T> void  batchDel(BaseService<T> sv,List<Long> list){
         if(sv!=null&&Func.isNotEmpty(list)) {

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

@@ -9,7 +9,7 @@ import java.util.List;
 /**
  * @author yangyj
  * @Date 2023/4/14 14:57
- * @description TODO
+ * @description 元素数据集
  */
 
 @Data

+ 4 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ITurnPointCalculator.java

@@ -17,15 +17,15 @@ import static org.springblade.manager.formula.TurnPoint.*;
  * @author yangyj
  */
 public interface ITurnPointCalculator {
-
+    Long VERSION=2309081800L;
      String ZD_REG="(?i)zd\\d+";
-    static List<TurnPoint> create(List<Map<String, Object>> data, LinkedHashMap<String, String> configMap,String g8pcfw) {
+    static List<TurnPoint> create(List<Map<String, Object>> data, LinkedHashMap<String, String> configMap,LevelInfo levelInfo) {
         /*1.验证数据的合理性,如果已经合理则不需要计算
         * 2.尝试补充数据,如果不合理则重新生成转点,并用正尺方式生成
         * 3.合理性定义:(测点前视不存在或者非负数则视线高-测点实测高程在【0.5~4.8】范围,如果前视为负数则视线高-实际高程在【-0.5~-4.8】范围)*/
         if (Func.isNotEmpty(data) && configMap != null) {
-            LevelInfo levelInfo = new LevelInfo();
-            levelInfo.setDx(g8pcfw);
+         /*   LevelInfo levelInfo = new LevelInfo();
+            levelInfo.setDx(g8pcfw);*/
             List<TurnPoint> tmp = new ArrayList<>();
             /*是否尝试初步补充数据*/
             boolean checked=true;

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

@@ -11,7 +11,7 @@ import java.util.stream.Collectors;
 /**
  * @author yangyj
  * @Date 2023/4/14 14:45
- * @description TODO
+ * @description 元素分页数据集
  */
 @Data
 public class ItemBlock {

+ 4 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/LevelInfo.java

@@ -169,5 +169,9 @@ public class LevelInfo implements  Cloneable {
         }
         return true;
     }
+    /**获取最大允许高差*/
+    public double maxHeightDx(){
+        return getStep()-getMin();
+    }
 
 }

+ 8 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/TurnPoint.java

@@ -257,11 +257,13 @@ public class TurnPoint {
     }
 
     public static void test() {
-        for (int i = 0; i < 5; i++) {
+        for (int i = 0; i < 10; i++) {
             LevelInfo info = new LevelInfo();
-            info.setSightHeight(392.497+2.489);
+            info.setMin(0.4D);
+            info.setStep(4.6D);
+            info.setSightHeight(407.168);
             TurnPoint tp = new TurnPoint(info, new HashMap<>());
-            tp.setQ(1.256);
+            tp.setQ(0.538);
             tp.setSc(402.248);
             if(!tp.isVisible(false)) {
                 System.out.println("第" + (i + 1) + "次");
@@ -273,7 +275,7 @@ public class TurnPoint {
         }
     }
 /*    public static void main(String[] args) {
-        test();
+       test();
     }*/
 
     public Boolean isNegativeQ(){
@@ -285,7 +287,7 @@ public class TurnPoint {
     /**转点的核心处理算法,当测点不在测量范围会触发*/
     public List<TurnPoint> limit(Boolean negative) {
         List<TurnPoint> result = new ArrayList<>();
-        double step = levelInfo.getStep();
+        /*double step = levelInfo.getStep();*/
         /*负前视必须是表单传入,而非自动生成*/
         /*boolean fake=(!negative&&getQ0L()<0);*/
         boolean overRange=(!negative&&getQ0L()<levelInfo.getMin()) || getQ0L() > levelInfo.getStep();
@@ -299,7 +301,7 @@ public class TurnPoint {
         int loop = 0;
         do {
             TurnPoint tmp;
-            if (hd > step) {
+            if (hd > levelInfo.maxHeightDx()) {
                 double x = hdx();
                 tmp = createZd(x, higher, "ZD" + (levelInfo.getCloseZd().size()));
                 hd -= x;

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

@@ -71,8 +71,19 @@ public class FormulaTurnPoint implements FormulaStrategy {
             List<Map<String, Object>>  tableData=listMaps( cur,tec, dataSourceMap,configMap,args);
             /*数据分组*/
             List<List<Map<String, Object>>> total = group(tableData);
+            /*项目配置*/
+            LevelInfo info = new LevelInfo();
+            String dev=Expression.parse(F_DEV).calculate(tec.getConstantMap());
+            if(Func.isNotBlank(dev)){
+                info.setDx(dev);
+            }
+            if(1630011899725201410L== tec.getProjectId()){
+                /*宝顶山项目*/
+                info.setStep(4.6D);
+                info.setMin(0.4D);
+            }
            /* 分组计算*/
-            List<List<TurnPoint>> result = total.stream().map(e->ITurnPointCalculator.create(e, configMap,Expression.parse(F_DEV).calculate(tec.getConstantMap()))).collect(Collectors.toList());
+            List<List<TurnPoint>> result = total.stream().map(e->ITurnPointCalculator.create(e, configMap,info)).collect(Collectors.toList());
             /*附加属性如:顶面和底面高程判断*/
             forG8(result.stream().flatMap(Collection::stream).collect(Collectors.toList()), (Map<String, Object>)tec.getConstantMap().computeIfAbsent("G8", k -> new HashMap<>()),tec);
            /*插值分页*/

+ 7 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java

@@ -2,6 +2,7 @@ package org.springblade.manager.formula.impl;
 
 
 import cn.hutool.log.StaticLog;
+import com.mixsmart.utils.FormulaUtils;
 import com.mixsmart.utils.StringUtils;
 import lombok.Data;
 import org.apache.poi.ss.usermodel.Workbook;
@@ -85,11 +86,14 @@ public class TableElementConverter implements ITableElementConverter {
      * 当前执行环境全局变量
      */
     public Map<String, Object> constantMap = new HashMap<>();
+    /**公式执行序列*/
     public List<FormData> formDataList;
 
-
+    /**检查项*/
     public List<FormData> checkItems = new ArrayList<>();
+    /**关键日期*/
     public List<FormData> checkDate = new ArrayList<>();
+    /**汇总公式*/
     public List<FormData> summary = new ArrayList<>();
 
 
@@ -105,17 +109,10 @@ public class TableElementConverter implements ITableElementConverter {
         this.coordinateMap = coordinateMap;
         this.nodeId = wtc.getPkId();
         this.wbsTreeId = wtc.getId();
-/*        if (Func.isNotEmpty(tableInfoList)) {总监办有问题
-            this.contractId = Long.parseLong(tableInfoList.get(0).getContractId());
-        }*/
         this.currentNode = wtc;
         this.tableAll = tableAll;
     }
 
-    public TableElementConverter() {
-
-    }
-
 
     public Boolean isPresent() {
         return BaseUtils.isNotNull(this.keyMappers, this.formulas, this.nodeId);
@@ -181,6 +178,8 @@ public class TableElementConverter implements ITableElementConverter {
                 if (Func.isEmpty(fd.getCoordsList())) {
                     log.put(FormulaLog.POSITION,fd.getCode()+"("+fd.getEName()+")");
                 }
+                /*备份原始数据,用于更新比较*/
+                fd.init();
                 this.formDataMap.put(fd.getCode(), fd);
                 if (fd.getFormula() != null) {
                     /*只有需要执行公式的才放这里*/

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

@@ -20,6 +20,8 @@ import org.springblade.manager.entity.TabBusstimeInfo;
 import org.springblade.manager.vo.TabBusstimeInfoVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.data.repository.query.Param;
+
 import java.util.List;
 
 /**
@@ -39,5 +41,5 @@ public interface TabBusstimeInfoMapper extends BaseMapper<TabBusstimeInfo> {
 	 */
 	List<TabBusstimeInfoVO> selectTabBusstimeInfoPage(IPage page, TabBusstimeInfoVO tabBusstimeInfo);
 
-	boolean delTabBussTimeByColId(String colId);
+	boolean delTabBussTimeByColId(@Param("tabId") String tabId,@Param("colId") String colId);
 }

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

@@ -24,6 +24,12 @@
     </select>
 
     <delete id="delTabBussTimeByColId">
-        delete from m_tab_busstime_info where col_id = #{colId}
+        delete from m_tab_busstime_info where 1=1
+        <if test="tabId != null and colId != ''">
+           and tab_id = #{tabId}
+        </if>
+        <if test="colId != null and colId != ''">
+           and col_id = #{colId}
+        </if>
     </delete>
 </mapper>

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

@@ -104,7 +104,7 @@ public interface IExcelTabService extends BaseService<ExcelTab> {
     /**
      * 结果信息持久化
      */
-    R saveOrUpdateInfo(List<TableInfo> tableInfoList) throws SQLException;
+    R<Object> saveOrUpdateInfo(List<TableInfo> tableInfoList) throws SQLException;
 
     Map<String, String> getTablbCols(String pkeyid, String colkey) throws FileNotFoundException;
 

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

@@ -38,5 +38,5 @@ public interface ITabBusstimeInfoService extends BaseService<TabBusstimeInfo> {
 	 */
 	IPage<TabBusstimeInfoVO> selectTabBusstimeInfoPage(IPage<TabBusstimeInfoVO> page, TabBusstimeInfoVO tabBusstimeInfo);
 
-	boolean delTabBussTimeByColId(String colId);
+	boolean delTabBussTimeByColId(String tabId,String colId);
 }

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsParamService.java

@@ -22,6 +22,9 @@ public interface IWbsParamService extends BaseService<WbsParam> {
      * @Author yangyj
      **/
     String createFileTitle(Long nodeId, Long contractId, WbsTreeContract wbsTreeContract);
+    String createFileTitle(Long id, Long contractId);
+    String createFileTitle(WbsTreeContract wbsTreeContract);
+    String createFileTitle(Long pkeyId);
 
     /**
      * @Description 获取节点参数 nodeId:项目级节点id

+ 77 - 60
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -335,7 +335,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         if (Func.isNotEmpty(tableInfoList)) {
             try {
                 /*用来保存日志执行情况*/
-                FormulaLog log =new FormulaLog();
+                FormulaLog log = new FormulaLog();
                 /*每次都是部分表单提交,保证跨节点跨表取数正常,其次是反向依赖的被动刷新*/
                 List<NodeTable> tableAll = createNodeTables(nodeId, tableInfoList.get(0).getContractId(), tableInfoList.get(0).getProjectId(), type);
                 StopWatch stopWatch = new StopWatch();
@@ -371,11 +371,11 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                             this.formulaService.execute(tec);
                             tec.after();
                         } else {
-                            tec.getLog().put(FormulaLog.OTHER,"没有执行任何公式");
+                            tec.getLog().put(FormulaLog.OTHER, "没有执行任何公式");
                         }
                         stopWatch.stop();
                         long totalTime = stopWatch.getTotalTimeMillis();
-                        log.put(FormulaLog.PF,"公式执行消耗时间:"+totalTime/1000+"秒");
+                        log.put(FormulaLog.PF, "公式执行消耗时间:" + (double)totalTime / 1000 + "秒");
                         StaticLog.info("公式执行用时:{}", totalTime);
                         updateFormulaLog(log.toJsonString(), pKeyId);
                     }
@@ -490,14 +490,14 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             //为空,默认今天
             recordTime = DateUtil.format(new Date(), "yyyy-MM-dd");
         }
-        // 为数据集
-        String businessIds = tableInfoList.stream().map(TableInfo::getBusinessId).filter(Objects::nonNull).collect(Collectors.joining(","));
+        //对应实体表的数据id = businessIds
+        String businessIds = tableInfoList.stream().map(TableInfo::getBusinessId).filter(ObjectUtils::isNotEmpty).collect(Collectors.joining(","));
         String ids = "";
         if (StringUtils.isEmpty(businessIds)) {
             //检查是否存在原本的数据
             List<ContractLog> contractLogs = this.contractLogClient.queryContractLogByPrimaryKeyIdAndRecordTimeList(parentNode.getPKeyId().toString(), recordTime, tableInfoList.get(0).getContractId());
             if (contractLogs.size() > 0) {
-                businessIds = contractLogs.stream().map(ContractLog::getDataId).map(String::valueOf).collect(Collectors.joining(","));
+                businessIds = contractLogs.stream().map(ContractLog::getDataId).filter(ObjectUtils::isNotEmpty).map(String::valueOf).collect(Collectors.joining(","));
                 ids = contractLogs.stream().map(ContractLog::getId).map(String::valueOf).collect(Collectors.joining(","));
             }
         } else {
@@ -544,14 +544,32 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             try {
                 this.jdbcTemplate.execute(sql.toString());
             } catch (Exception e) {
-                throw new ServiceException("当前字段值太长,请减少输入的字符数量或联系管理员");
+                String errorKeyName = null;
+                String errorMessage = e.getMessage();
+                if (StringUtils.isNotEmpty(errorMessage)) {
+                    String errorKey = null;
+                    if (errorMessage.contains("long for column ") && errorMessage.contains(" at ")) {
+                        errorKey = errorMessage.split("long for column ")[1].split(" at ")[0];
+                    }
+                    if (StringUtils.isNotEmpty(errorKey)) {
+                        //获取公有原始节点实体表id = init_table_id
+                        WbsTree wbsTree = jdbcTemplate.queryForObject("select init_table_id from m_wbs_tree where id = " + tableNode.getId(), new BeanPropertyRowMapper<>(WbsTree.class));
+                        if (wbsTree != null) {
+                            //获取字段名
+                            WbsFormElement tabElement = jdbcTemplate.queryForObject("select e_name from m_wbs_form_element where f_id = " + wbsTree.getInitTableId() + " and e_key = " + errorKey, new BeanPropertyRowMapper<>(WbsFormElement.class));
+                            if (tabElement != null) {
+                                errorKeyName = tabElement.getEName();
+                            }
+                        }
+                    }
+                }
+                e.printStackTrace();
+                if (StringUtils.isNotEmpty(errorKeyName)) {
+                    throw new ServiceException("【" + errorKeyName + "】字段值太长,请减少输入的字符数量或联系管理员");
+                }
             }
 
             List<Object> linkTabIds = tableInfo.getLinkTabIds();
-            /*if (linkTabIds == null || linkTabIds.size() <= 0) {
-                //这一步主要为了兼容同工序时只想在第一张勾选的情况
-                linkTabIds = tableInfoList.get(0).getLinkTabIds();
-            }*/
             List<JSONObject> logWbsList = new ArrayList<>();
             if (linkTabIds != null && linkTabIds.size() > 0) {
                 //处理每个表格的关联情况
@@ -665,7 +683,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         // 查询所有合同段的数据
         List<WbsTreeContract> wbsTreeContractList = wbsTreeContractService.getBaseMapper().selectList(Wrappers.<WbsTreeContract>query().lambda()
                 .eq(WbsTreeContract::getContractId, contractId)
-                .eq(WbsTreeContract::getIsDeleted, 0));
+                .eq(WbsTreeContract::getIsDeleted, 0)
+                .eq(WbsTreeContract::getType,1));
 
         // 数据维数据
         Map<String, List<WbsTreeContract>> Data = new HashMap<>();
@@ -955,8 +974,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
     }
 
     @Override
-    public R saveOrUpdateInfo(List<TableInfo> tableInfoList) {
-
+    public R<Object> saveOrUpdateInfo(List<TableInfo> tableInfoList) {
         if (ListUtils.isNotEmpty(tableInfoList)) {
             //施工资料填报
             String pkids = "";
@@ -1013,7 +1031,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                         transactionManager1.rollback(transactionStatus);
                         log.append(e.getMessage()).append("@@");
                         e.printStackTrace();
-                        return R.fail(wbsTreeContract.getNodeName());
+                        /*return R.fail(wbsTreeContract.getNodeName());*/
+                        return R.fail(reason(e.getMessage()));
                     }
                 }
 
@@ -1049,7 +1068,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
     }
 
     public String reason(String log) {
-        /*字段过短提示*/
+        /*保存的时候错误提示例如:字段过短提示 yangyj*/
         StringBuilder sb = new StringBuilder();
         String[] part = log.split("@@");
         for (String p : part) {
@@ -1359,10 +1378,10 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 .eq(WbsTreeContract::getPKeyId, pkeyId));
 
         if (wbsTreeContract == null) {
-            return R.fail("该数据下无此节点!");
+            return R.fail("未获取到该表单的信息");
         }
         if (wbsTreeContract.getHtmlUrl() == null) {
-            return R.fail("请关联清表!");
+            return R.fail("htmlUrl is null");
         }
 
         String pdfPath = file_path + "/pdf//" + pkeyId + ".pdf";
@@ -1376,7 +1395,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         //获取清表信息
         ExcelTab excelTab = this.getById(wbsTreeContract.getExcelId());
         if (excelTab == null) {
-            return R.fail("失败");
+            return R.fail("未获取到清表信息");
         }
 
         Map<String, Object> DataInfo = (Map<String, Object>) getBussDataInfo(pkeyId, 0).getData();
@@ -1403,8 +1422,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         for (int i = 0; i < 10; i++) {
             CellRangeAddress mergedCell = sheet.getMergedRegion(i);
             int xx = mergedCell.getNumberOfCells();
-            if(xx>=all){
-                all=xx;
+            if (xx >= all) {
+                all = xx;
             }
         }
 
@@ -1444,7 +1463,6 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             }
         }
 
-
         //数据不为空
         if (StringUtils.isNotEmpty(wbsTreeContract.getHtmlUrl())) {
             InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(wbsTreeContract.getHtmlUrl());
@@ -1453,7 +1471,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             Document doc = Jsoup.parse(htmlString);
             Element table = doc.select("table").first();
             Elements trs = table.select("tr");
-            Elements cols = table.select("col");
+            //Elements cols = table.select("col");
 
             if (ObjectUtil.isNotEmpty(DataInfo)) {
                 for (String val : DataInfo.keySet()) {
@@ -1508,9 +1526,9 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                 Object obj = DataInfo.get(val);
                                 if (obj instanceof String[]) {
                                     String[] dataDate = (String[]) obj;
-                                    if((dataDate[0].trim()).equals((dataDate[1].trim()))){
+                                    if ((dataDate[0].trim()).equals((dataDate[1].trim()))) {
                                         myData = dataDate[0];
-                                    }else{
+                                    } else {
                                         myData = dataDate[0] + "-" + dataDate[1].trim();
                                     }
 
@@ -1581,7 +1599,6 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                         cell.setCellValue(myData);
                                     }
                                     boolean wrap = Optional.ofNullable(cell).map(Cell::getCellStyle).map(CellStyle::getWrapText).orElse(true);
-                                    ;
                                     if (!wrap) {
                                         cell.getCellStyle().setShrinkToFit(true);
                                     }
@@ -1598,7 +1615,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             queryWrapper.eq("tab_id", wbsTreeContract.getIsTypePrivatePid());
             List<TextdictInfo> textdictInfos = textdictInfoService.getBaseMapper().selectList(queryWrapper);
 
-           // table.getElementsByAttribute("dq")
+            // table.getElementsByAttribute("dq")
 
             if (textdictInfos != null && !textdictInfos.isEmpty()) {
                 for (TextdictInfo e : textdictInfos) {
@@ -1648,8 +1665,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 }
             }
         }
-        //输出流
 
+        //输出流
         FileOutputStream outputStream = new FileOutputStream(excelPath);
         workbook.write(outputStream);
 
@@ -1683,12 +1700,12 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         tableFileList.sort(Comparator.comparing(TableFile::getType));
 
         List<String> dataListPdf = new ArrayList<>();
-        if(wbsTreeContract.getIsBussShow() == 1){
+        if (wbsTreeContract.getIsBussShow() == null || wbsTreeContract.getIsBussShow() == 1) {
             dataListPdf = tableFileList.stream().filter(tableFile -> tableFile.getDomainPdfUrl() != null && (tableFile.getType() == 1 || tableFile.getType() == 2)).map(TableFile::getDomainPdfUrl).collect(Collectors.toList());
-        }else{
+        } else {
             dataListPdf = tableFileList.stream().filter(tableFile -> tableFile.getDomainPdfUrl() != null && tableFile.getType() == 2).map(TableFile::getDomainPdfUrl).collect(Collectors.toList());
         }
-//        List<String> dataListPdf = tableFileList.stream().filter(tableFile -> tableFile.getDomainPdfUrl() != null && (tableFile.getType() == 1 || tableFile.getType() == 2)).map(TableFile::getDomainPdfUrl).collect(Collectors.toList());
+        //List<String> dataListPdf = tableFileList.stream().filter(tableFile -> tableFile.getDomainPdfUrl() != null && (tableFile.getType() == 1 || tableFile.getType() == 2)).map(TableFile::getDomainPdfUrl).collect(Collectors.toList());
 
         String pdfPath2 = file_path + "/pdf//" + pkeyId + "_2.pdf";
 
@@ -1696,7 +1713,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         if (tabPdf2.exists()) {
             tabPdf2.delete();
         }
-        String fileUrl ="";
+        String fileUrl = "";
         if (dataListPdf.size() > 0) {
             FileUtils.mergePdfPublicMethods(dataListPdf, pdfPath2);
             BladeFile bladeFile2 = newIOSSClient.uploadFile(pkeyId + "2.pdf", pdfPath2);
@@ -1708,14 +1725,11 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         updateWrapper.set("pdf_url", fileUrl);
         wbsTreeContractService.update(updateWrapper);
 
-        if (outputStream != null) {
-            IoUtil.closeQuietly(outputStream);
-        }
-        if (exceInp != null) {
-            IoUtil.closeQuietly(exceInp);
-        }
-        return R.data(fileUrl);
+        //关闭流
+        IoUtil.closeQuietly(outputStream);
+        IoUtil.closeQuietly(exceInp);
 
+        return R.data(fileUrl);
     }
 
     @Override
@@ -1728,14 +1742,16 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             for (WbsTreeContract wbsInfo : wbsTreeContractList) {
                 // 隐藏的不生成pdf
 //                if (wbsInfo.getIsBussShow() == null || wbsInfo.getIsBussShow() != 2) { //
-                    if (StringUtils.isNotEmpty(wbsInfo.getPdfUrl())) {
-                        data.add(wbsInfo.getPdfUrl());
-                    } else {
-                        R bussPdfInfo = this.getBussPdfInfo(wbsInfo.getPKeyId());
-                        if (bussPdfInfo.getCode() == 200) {
+                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() + "");
                         }
                     }
+                }
 //                }
             }
         }
@@ -1745,24 +1761,25 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         if (tabpdf2.exists()) {
             tabpdf2.delete();
         }
-
-        //资料填报原始pdf合并
-        FileUtils.mergePdfPublicMethods(data, listPdf);
-        BladeFile bladeFile = this.newIOSSClient.uploadFile(nodeId + ".pdf", listPdf);
-
-        //获取当前填报节点sort
-        WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, nodeId));
-        System.out.println("wbsTreeContract==" + wbsTreeContract);
-        //获取顺序
-        int sort = 0;
-        if (ObjectUtil.isNotEmpty(wbsTreeContract)) {
-            if (wbsTreeContract.getSort() != null) {
-                sort = wbsTreeContract.getSort();
-                contractId = wbsTreeContract.getContractId();
+        if (data.size() >= 1) {
+            //资料填报原始pdf合并
+            FileUtils.mergePdfPublicMethods(data, listPdf);
+            BladeFile bladeFile = this.newIOSSClient.uploadFile(nodeId + ".pdf", listPdf);
+
+            //获取当前填报节点sort
+            WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, nodeId));
+            System.out.println("wbsTreeContract==" + wbsTreeContract);
+            //获取顺序
+            int sort = 0;
+            if (ObjectUtil.isNotEmpty(wbsTreeContract)) {
+                if (wbsTreeContract.getSort() != null) {
+                    sort = wbsTreeContract.getSort();
+                    contractId = wbsTreeContract.getContractId();
+                }
             }
+            String sql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "' , sort = " + sort + " where classify='" + classify + "' and  wbs_id='" + nodeId + "' and contract_id ='" + contractId + "' ";
+            jdbcTemplate.execute(sql);
         }
-        String sql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "' , sort = " + sort + " where classify='" + classify + "' and  wbs_id='" + nodeId + "' and contract_id ='" + contractId + "' ";
-        jdbcTemplate.execute(sql);
     }
 
     @Override

+ 29 - 35
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -287,9 +287,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                             if (g != null) {
                                 List<ItemBlock> itemBlockList = g.getList();
                                 int originSize = itemBlockList.size();
-                                /*过滤方法有问题*/
-//                                List<Long> ids = this.jdbcTemplate.queryForList("select b.p_key_id from m_wbs_tree_contract a join m_wbs_tree_contract b on (a.parent_id=b.parent_id and a.contract_id=b.contract_id) where a.p_key_id=" + tec.getCurrentNode().getPkId() + " and b.is_deleted=0 and b.node_type=6", Long.class);
-//                                itemBlockList.removeIf(ik -> !ids.contains(ik.getPkeyId()));
+                                List<Long> ids =getNodeType46().stream().map(CurrentNode::getId).collect(Collectors.toList());
+                                /*清除那些已经不存在的工序*/
+                                itemBlockList.removeIf(ik -> !ids.contains(ik.getPkeyId()));
                                 if (itemBlockList.size() > 0) {
                                     int total = itemBlockList.stream().mapToInt(ItemBlock::getSubTotal).sum();
                                     int passNum = itemBlockList.stream().mapToInt(ItemBlock::getSubPass).sum();
@@ -302,7 +302,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                     List<String> values = itemBlockList.stream().map(ItemBlock::getData).flatMap(v -> v.stream().flatMap(Collection::stream)).map(Object::toString).collect(Collectors.toList());
                                     int scale = StringUtils.getScale(values);
                                     FormulaUtils.write(t.getValue(), values.stream().map(u -> StringUtils.number2String(u, scale)).collect(Collectors.toList()), true);
-
 //                                   if(t.getValue().getEName().contains("±")){
 //                                       /*存在偏差范围则获取的是偏差值:实测-设计*/
 //                                       FormulaUtils.write(t.getValue(),itemBlockList.stream().flatMap(b->{
@@ -339,7 +338,15 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     }
 
 
-
+   public List<CurrentNode> getNodeType46(){
+        if(tec.getCurrentNode().getDivisional().size()==0){
+            List<Map<String,Object>> listMaps=this.jdbcTemplate.queryForList("select b.p_Key_id pkId,b.id from m_wbs_tree_contract a join m_wbs_tree_contract b on (a.contract_id=b.contract_id and b.ancestors like CONCAT(a.ancestors,'%')) where a.p_key_id="+tec.getCurrentNode().getPkId()+" and b.is_deleted=0 and b.node_type=6 ORDER BY b.sort");
+            if(listMaps.size()>0){
+                tec.getCurrentNode().getDivisional().addAll(listMaps.stream().map(m->BeanUtil.toBean(m,CurrentNode.class)).collect(Collectors.toList()));
+            }
+        }
+       return tec.getCurrentNode().getDivisional();
+   }
 
     public void missingFill(List<String> missingList){
         /*数据池里面没有任何元素匹配和当前依赖匹配*/
@@ -460,6 +467,8 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 }
                 FormData one = new FormData(code, eds, null, coords);
                 one.setEName(name);
+                /*备份原始数据,用于更新比较*/
+                one.init();
                 return one;
             }
             this.tec.getLog().put(FormulaLog.POSITION,code+"("+name+")");
@@ -522,24 +531,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 });
             });
         }
-    /*    tec.formDataMap.values().stream().filter(e->e.getIsCurrentNodeElement()&&e.getFormula()==null).forEach(e->{
-            *//*执行列表里不存在,且元素的名称和节点参数名称匹配成功*//*
-            total.stream().filter(p->e.getEName().contains(p.getName().replace("【水】","").trim())&&!tec.formDataList.contains(e)).findAny().ifPresent(d->{
-                Formula  formula=new Formula();
-                formula.setOutm(Formula.FULL);
-             *//*   if(RegexUtil.match(ParamElements.LEVEL_REG,d.getV().trim())){
-                    *//**//*取层级*//**//*
-                    formula.setFormula("FC.tree(trees,WP["+d.getK()+"])");
-                }else{
-                    *//**//*直接取数*//**//*
-                    formula.setFormula("WP["+d.getK()+"]");
-                }*//*
-                formula.setFormula("FC.tree(trees,WP["+d.getK()+"])");
-                e.setFormula(formula);
-                tec.getLog().append("动态绑定参数:").append(e.getEName()).append(";");
-                tec.formDataList.add(e);
-            });
-        });*/
         return result;
     }
 
@@ -1002,7 +993,10 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     result.addAll(customize);
                 }
                 tec.constantMap.put(CHECK_ITEMS,result);
-                tec.constantMap.put("CKD",tec.checkDate.stream().flatMap(k->k.getValues().stream()).map(ElementData::stringValue).filter(StringUtils::isNotEmpty).reduce((a, b) -> Comparator.<DateTime>reverseOrder().compare(new DateTime(a), new DateTime(b)) <= 0 ? a : b).orElse(null));
+                tec.constantMap.put("CKD",tec.checkDate.stream().flatMap(k->k.getValues().stream()).map(ElementData::stringValue)
+                        .filter(StringUtils::isNotEmpty)
+                        .map(FormulaUtils::range2end)
+                        .reduce((a, b) -> Comparator.<DateTime>reverseOrder().compare(new DateTime(a), new DateTime(b)) <= 0 ? a : b).orElse(null));
                 tec.summary.forEach(e->{
                     /*处理脚本*/
                     e.getFormula().setFormula(e.getFormula().getNumber());
@@ -1093,17 +1087,17 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                             eb.getList().remove(targetItem);
                         }
                     }
-//                if(c.executable()){
-//                    /*主要是获取实测值,合格率,合格数量*/
-//                    List<String> relyCode = c.getFormula().getRelyList();
-//                    if(Func.isNotEmpty(relyCode)){
-//                        List<FormData> designList=  tec.getFormDataMap().values().stream().filter(t->relyCode.contains(t.getCode())&&t.getEName().contains("设计")).collect(Collectors.toList());
-//                        if(designList.size()>0){
-//                            FormData design =designList.get(0);
-//
-//                        }
-//                    }
-//                }
+               /* if(c.executable()){
+                    *//*主要是获取实测值,合格率,合格数量*//*
+                    List<String> relyCode = c.getFormula().getRelyList();
+                    if(Func.isNotEmpty(relyCode)){
+                        List<FormData> designList=  tec.getFormDataMap().values().stream().filter(t->relyCode.contains(t.getCode())&&t.getEName().contains("设计")).collect(Collectors.toList());
+                        if(designList.size()>0){
+                            FormData design =designList.get(0);
+
+                        }
+                    }
+                }*/
                 });
                 fdb.setVal(JSON.toJSONString(elementBlockList));
                 this.formulaDataBlockService.saveOrUpdate(fdb);

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

@@ -39,8 +39,8 @@ public class TabBusstimeInfoServiceImpl extends BaseServiceImpl<TabBusstimeInfoM
 	}
 
 	@Override
-	public boolean delTabBussTimeByColId(String colId) {
-		return baseMapper.delTabBussTimeByColId(colId);
+	public boolean delTabBussTimeByColId(String tabId,String colId) {
+		return baseMapper.delTabBussTimeByColId(tabId,colId);
 	}
 
 }

+ 18 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java

@@ -10,7 +10,6 @@ import org.springblade.common.utils.BaseUtils;
 import org.springblade.core.mp.base.BaseEntity;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.base.BaseServiceImpl;
-import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.mapper.WbsParamMapper;
@@ -61,11 +60,26 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
                 if (Func.isNotEmpty(wp)) {
                     return CustomFunction.tree(nodes.stream().map(w->StringUtils.isNotEmpty(w.getFullName())?w.getFullName():w.getNodeName()).collect(Collectors.toList()), wp.getV()).toString();
                 }
-                return NOT_SET;
             }
         }
-        return null;
+        return NOT_SET;
+    }
+
+    @Override
+    public String createFileTitle(Long id, Long contractId) {
+        return NOT_SET;
     }
+
+    @Override
+    public String createFileTitle(WbsTreeContract wbsTreeContract) {
+        return NOT_SET;
+    }
+
+    @Override
+    public String createFileTitle(Long pkeyId) {
+        return NOT_SET;
+    }
+
     @Override
     public List<WbsTreeContract> tracing(@NotNull Long pkeyId){
         WbsTreeContract one = this.treeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, pkeyId));
@@ -191,7 +205,7 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
     }
 
     @Transactional(rollbackFor = Exception.class)
-    public boolean insertBatch(Collection<WbsParam> entityList, int batchSize) {
+    public void insertBatch(Collection<WbsParam> entityList, int batchSize) {
         try {
             int size = entityList.size();
             int idxLimit = Math.min(batchSize, size);
@@ -210,9 +224,7 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
             }
         } catch (Exception e) {
             log.error("保存失败", e);
-            return false;
         }
-        return true;
     }
 
 

+ 24 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -432,7 +432,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         //当前项目合同段只会存在一个角色roleId
         SaveUserInfoByProject userInfo = baseMapper.selectRoleInfo(userId, contractId, projectId);
         if (userInfo == null) {
-            throw new ServiceException("请先分配当前用户对该合同段的角色信息=" + SecureUtil.getUserId());
+            throw new ServiceException("请先分配当前用户对该合同段的角色信息");
         }
         String roleId = userInfo.getRoleId();
 
@@ -446,8 +446,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
 
         List<String> tableOwnerList = null;
         if (StringUtils.isNotEmpty(tableOwner)) {
-            String tableOwners = "";
-            //此处加载字典owner_type 固定写死 施工质检1= 1 2 3 , 监理抽检2= 4 5 6
+            String tableOwners;
+            //字典owner_type
             if (tableOwner.equals("1")) {
                 tableOwners = "1,2,3";
             } else if (tableOwner.equals("2")) {
@@ -457,11 +457,12 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             }
             tableOwnerList = Func.toStrList(tableOwners);
         }
+
         List<AppWbsTreeContractVO> resultTabs = baseMapper.selectWbsTreeContractList(tableOwnerNumbers, wbsTreeContract.getProjectId(), wbsTreeContract.getWbsId(), wbsTreeContract.getContractId(), wbsTreeContract.getId(), wbsTreeContract.getContractIdRelation(), tableOwnerList);
 
         //表单排序
-        List<AppWbsTreeContractVO> resultTabsToCopy = sortTabs(resultTabs, "__");
-        return this.sortTabs(resultTabsToCopy, "_PL_");
+        List<AppWbsTreeContractVO> resultTabsToCopy = this.sortTabs(resultTabs, "__"); //复制表排序
+        return this.sortTabs(resultTabsToCopy, "_PL_"); //频率表排序
     }
 
     /**
@@ -486,6 +487,10 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         if (tabsWithKeyword.isEmpty()) {
             return tabsWithoutKeyword;
         }
+
+        //将带有关键字的数据按照数字大小进行排序
+        tabsWithKeyword.sort(Comparator.comparingInt(this::getNumberFromNodeName));
+
         //将带有关键字的数据插入到对应表名后面
         List<AppWbsTreeContractVO> sortedTabs = new ArrayList<>();
         for (AppWbsTreeContractVO tabWithoutKeyword : tabsWithoutKeyword) {
@@ -501,6 +506,15 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return sortedTabs;
     }
 
+    private int getNumberFromNodeName(AppWbsTreeContractVO tab) {
+        String nodeName = tab.getNodeName();
+        String[] parts = nodeName.split("_");
+        if (parts.length > 1) {
+            return Integer.parseInt(parts[parts.length - 1]); //取最后一个部分作为数字
+        }
+        return Integer.MAX_VALUE;
+    }
+
     @Override
     public List<WbsTreeContract> searchParentAllNode(long primaryKeyId, Long contractId) {
         return baseMapper.searchParentAllNode(primaryKeyId, contractId);
@@ -591,10 +605,10 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 wbsTreeContract.setCreateTime(new Date());
                 wbsTreeContract.setTabGroupId(tabGroupId);
                 wbsTreeContract.setSort(wbsInfo.getSort());
-                String nodeName="";
-                if(wbsTreeContractList2.size()>=1){
+                String nodeName = "";
+                if (wbsTreeContractList2.size() >= 1) {
                     nodeName = wbsTreeContractList2.get(wbsTreeContractList2.size() - 1).getNodeName();
-                }else{
+                } else {
                     nodeName = wbsTreeContract.getNodeName();
                 }
 
@@ -1283,7 +1297,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     }
 
     /**
-     * 反向递归获取父级(父级Id=子级parentId)
+     * 构造从最底层节点获取他的所有父级,并统计出现次数(父级Id=子级parentId)
      *
      * @param result              结果集
      * @param lowestNodeParentIds 最底层节点ParentIds
@@ -1341,6 +1355,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
 
     /**
      * 反向递归处理父节点颜色
+     * (暂未解决父级颜色问题,因为按照这个方法构造出来的父级颜色,颜色会断层;目前上级统一显示蓝色,最底层填报数据显示上报审批状态的颜色)
      */
     private void recursiveParentNodeColorStatus(List<WbsTreeContractLazyVO> childNodeTBList, Map<Long, WbsTreeContractLazyVO> distinctParentNodesTBIdKeyMap, Map<Long, List<WbsTreeContractLazyVO>> allNodesParentGroup, Map<Long, WbsTreeContractLazyVO> nodeColorMap) {
         if (childNodeTBList.size() > 0) {

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

@@ -1617,6 +1617,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                         if (tabs.size() > 0) {
                             List<WbsTreeContract> wbsTreeContractList = BeanUtil.copyProperties(tabs, WbsTreeContract.class);
                             for (WbsTreeContract wbsTreeContract : wbsTreeContractList) {
+                                wbsTreeContract.setIsBussShow(1);
                                 wbsTreeContract.setIsDeleted(0);
                                 wbsTreeContract.setStatus(1);
                                 wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
@@ -1631,6 +1632,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                         if (tabs.size() > 0) {
                             List<WbsTreeContract> wbsTreeContractList = BeanUtil.copyProperties(tabs, WbsTreeContract.class);
                             for (WbsTreeContract wbsTreeContract : wbsTreeContractList) {
+                                wbsTreeContract.setIsBussShow(1);
                                 wbsTreeContract.setIsDeleted(0);
                                 wbsTreeContract.setStatus(1);
                                 wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());