Quellcode durchsuchen

评定汇总接口以及编辑标准分类单元名称

chenr vor 4 Monaten
Ursprung
Commit
8b0025f229
22 geänderte Dateien mit 1109 neuen und 14 gelöschten Zeilen
  1. 24 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/CustomAddContractNodeDTO.java
  2. 33 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/CustomAddContractNodeDTO2.java
  3. 17 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/EvaluateDate.java
  4. 302 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/WbsTreeContractDto1.java
  5. 11 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/WbsTreeDTO.java
  6. 33 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/Classifcation.java
  7. 14 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTree.java
  8. 23 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreeContract.java
  9. 17 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreePrivate.java
  10. 19 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractLazyVO.java
  11. 68 4
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  12. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  13. 13 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java
  14. 11 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java
  15. 3 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  16. 5 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  17. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaService.java
  18. 0 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  19. 463 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  20. 18 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  21. 31 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java
  22. 1 1
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

+ 24 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/CustomAddContractNodeDTO.java

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.Date;
 
 @Data
 public class CustomAddContractNodeDTO implements Serializable {
@@ -20,4 +21,27 @@ public class CustomAddContractNodeDTO implements Serializable {
     @ApiModelProperty(value = "划分编号")
     private String partitionCode;
 
+    @ApiModelProperty(value = "1 水利工程 2 数字化上传")
+    private Integer nodeClass;
+
+    @ApiModelProperty(value ="是否含单元评定 0否 1是 默认否")
+    private Integer isClassifition;
+
+    @ApiModelProperty(value = "标准分类")
+    private Integer className;
+
+    @ApiModelProperty(value = "单元名称")
+    private Integer unitName;
+
+    @ApiModelProperty(value = "优良个数 默认1")
+    private Integer excellentNum;
+
+    @ApiModelProperty(value = "单元个数默认1")
+    private Integer unitNum;
+
+    @ApiModelProperty(value = "自定义数字化节点的时间")
+    private Date digitizeTime;
+
+
+
 }

+ 33 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/CustomAddContractNodeDTO2.java

@@ -0,0 +1,33 @@
+package org.springblade.business.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class CustomAddContractNodeDTO2 implements Serializable {
+    @ApiModelProperty(required = true, value = "当前选择新增节点的primaryKeyId")
+    private String primaryKeyId;
+
+    @ApiModelProperty(required = true, value = "节点名称")
+    private String nodeName;
+
+    @ApiModelProperty(required = true, value = "节点类型")
+    private Integer nodeType;
+
+    @ApiModelProperty(value = "划分编号")
+    private String partitionCode;
+
+    @ApiModelProperty(value ="是否含单元评定")
+    private Integer isClassifition;
+
+    @ApiModelProperty(value = "标准分类")
+    private Integer className;
+
+    @ApiModelProperty(value = "单元名称")
+    private Integer unitName;
+
+    @ApiModelProperty(value = "优良个数")
+    private Integer excellentNum;
+}

+ 17 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/EvaluateDate.java

@@ -0,0 +1,17 @@
+package org.springblade.manager.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.models.auth.In;
+import lombok.Data;
+
+@Data
+public class EvaluateDate {
+    @ApiModelProperty(value = "单元工程种类")
+    private String unitName;
+    @ApiModelProperty(value = "单元工程个数")
+    private Integer unitNum;
+    @ApiModelProperty(value = "合格个数")
+    private Integer qualifiedNum;
+    @ApiModelProperty(value = "优良个数")
+    private Integer excellentNum;
+}

+ 302 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/WbsTreeContractDto1.java

@@ -0,0 +1,302 @@
+package org.springblade.manager.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.springblade.manager.entity.WbsTreeContract;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class WbsTreeContractDto1{
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @ApiModelProperty(value = "主键id")
+    private Long pKeyId;
+
+    /**
+     * wbsId
+     */
+    @ApiModelProperty(name = "wbsId", value = "wbsId", required = true)
+    private String wbsId;
+
+    /**
+     * wbsType
+     */
+    @ApiModelProperty(name = "wbsType", value = "wbsType")
+    private Integer wbsType;
+
+    /**
+     * 项目Id
+     */
+    @JsonProperty(value = "projectId")
+    @ApiModelProperty(name = "projectId", value = "项目Id", required = true)
+    private String projectId;
+
+    /**
+     * 合同Id
+     */
+    @JsonProperty(value = "contractId")
+    @ApiModelProperty(name = "contractId", value = "合同Id", required = true)
+    private String contractId;
+
+    /**
+     * 合同段类型
+     */
+    @ApiModelProperty(name = "contractType", value = "合同段类型")
+    private Integer contractType;
+
+    /**
+     * 合同段关联id(监理、业主合同关联施工合同id)
+     */
+    @ApiModelProperty(name = "contractIdRelation", value = "合同段关联id(监理、业主合同关联施工合同id)")
+    private String contractIdRelation;
+
+    /**
+     * 租户id
+     */
+    @ApiModelProperty(value = "租户id")
+    private String tenantId;
+
+    /**
+     * 父主键
+     */
+    @ApiModelProperty(value = "父主键id")
+    private Long parentId;
+
+    /**
+     * 节点类型
+     */
+    @ApiModelProperty(value = "节点类型")
+    private Integer nodeType;
+
+    /**
+     * '1'节点 '2'表单
+     */
+    @ApiModelProperty(value = "'1'节点 '2'表单")
+    private Integer type;
+
+    /**
+     * 节点名称
+     */
+    @ApiModelProperty(value = "节点名称")
+    private String nodeName;
+    /**
+     * 节点全称
+     */
+    @ApiModelProperty(value = "节点全称")
+    private String fullName;
+
+    /**
+     * 表单类型
+     */
+    @ApiModelProperty(value = "表单类型")
+    private Integer tableType;
+
+    /**
+     * 排序
+     */
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
+
+    /**
+     * 祖级列表
+     */
+    @ApiModelProperty(value = "祖级id列表")
+    private String ancestors;
+
+    /**
+     * 备注
+     */
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 唯一编号
+     */
+    @ApiModelProperty(value = "唯一编号")
+    private String uniqueCode;
+
+    /**
+     * 划分编号
+     */
+    @ApiModelProperty(value = "划分编号")
+    private String partitionCode;
+
+    /**
+     * 是否是实验节点 '0'否 '1'是
+     */
+    @ApiModelProperty(value = "实验节点")
+    private Integer isExpernode;
+
+    /**
+     * 是否有混泥土 '0'否 '1'是
+     */
+    @ApiModelProperty(value = "混泥土")
+    private Integer isConcrete;
+
+    /**
+     * 表单所属方
+     */
+    @ApiModelProperty(value = "表单所属方")
+    private String tableOwner;
+
+    /**
+     * 内业资料类型
+     */
+    @ApiModelProperty(value = "内业资料类型")
+    private Integer majorDataType;
+
+    /**
+     * 初始化实体表名
+     */
+    @ApiModelProperty(value = "初始化实体表名")
+    private String initTableName;
+
+
+    /**
+     * 是否关联清表 '0'否 '1'是
+     */
+    @ApiModelProperty(value = "是否关联清表 '0'否 '1'是")
+    private Integer isLinkTable;
+
+    /**
+     * 清表Id
+     */
+    @ApiModelProperty(name = "excel_id", value = "excel_id")
+    private Long excelId;
+
+    /**
+     * html路径
+     */
+    @ApiModelProperty(value = "html路径")
+    private String htmlUrl;
+
+    /**
+     * html路径
+     */
+    @ApiModelProperty(value = "pdf路径")
+    private String pdfUrl;
+
+    /**
+     * 用户端是否隐藏
+     */
+
+    @ApiModelProperty(name = "is_buss_show", value = "is_buss_show")
+    private Integer isBussShow;
+
+
+    @ApiModelProperty(value = "原id,如果当前字段有数据则说明这条数据是复制节点")
+    private String oldId;
+
+    /**
+     * 表单是否上传附件1否
+     */
+    @ApiModelProperty(value = "表单是否上传附件1否 2是")
+    private Integer tabFileType;
+
+    /**
+     * 表单是否上传附件1否
+     */
+    @ApiModelProperty(value = "是否复制表 1否 2是")
+    private Integer isCopeTab;
+
+    /**
+     * 是否能预览pdf
+     */
+    @ApiModelProperty(value = "是否能预览pdf 1否 2是")
+    private Integer isTabPdf;
+
+    /**
+     * type=2,映射私有pKeyId
+     */
+    @ApiModelProperty(value = "type=2,映射私有pKeyId")
+    private Long isTypePrivatePid;
+
+    /**
+     * 填报率百分比
+     */
+    @ApiModelProperty(value = "填报率百分比")
+    private String fillRate;
+
+    /**
+     * 节点导入是否识别成功 '0'否 '1'是
+     */
+    @ApiModelProperty(value = "节点导入是否识别成功 '0'否 '1'是")
+    private Integer isImportIdentificationNode;
+
+    /**
+     * 导入wbs划分匹配字段
+     */
+    @ApiModelProperty(value = "导入wbs划分匹配字段")
+    private String importMatchingInfo;
+
+    /**
+     * 是否为隐蔽工程节点 '0'否 '1'是
+     */
+    @ApiModelProperty(value = "是否为隐蔽工程节点 '0'否 '1'是")
+    private Integer isConcealedWorksNode;
+
+    /**
+     * 配合试验比ids
+     */
+    @ApiModelProperty(value = "配合比试验ids")
+    private String mixRatioTestIds;
+
+    /**
+     * 是否为引用元素
+     */
+    @ApiModelProperty(value = "是否为引用元素 1是 2否")
+    private Integer isEle;
+
+    /**
+     * 数据分组
+     */
+    @ApiModelProperty(value = "数据分组Id")
+    private Long tabGroupId;
+
+    /**
+     * 填报率
+     */
+    @ApiModelProperty(value = "实际填报率")
+    private Integer realFillRate;
+
+    /**
+     * 查询索引
+     */
+    @ApiModelProperty(value = "查询索引")
+    private String treeCode;
+
+    @ApiModelProperty(value = "是否为自定义新增节点 1=是")
+    private Integer isCustom;
+
+    @ApiModelProperty(value = "是否采用排序0否1是")
+    private Integer isUseSort;
+
+    @ApiModelProperty(value = "1 水利工程 2是数字化")
+    private Integer nodeClass;
+
+    @ApiModelProperty(value ="是否含单元评定 0否 1是 默认否")
+    private Integer isClassifition;
+
+    @ApiModelProperty(value = "标准分类")
+    private String className;
+
+    @ApiModelProperty(value = "单元名称")
+    private String unitName;
+
+    @ApiModelProperty(value = "优良个数")
+    private Integer excellentNum;
+
+    @ApiModelProperty(value = "子节点")
+    private List<WbsTreeContractDto1> Children=new ArrayList<>();
+}

+ 11 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/WbsTreeDTO.java

@@ -111,4 +111,15 @@ public class WbsTreeDTO extends WbsTree {
     @ApiModelProperty(value = "表单所属方")
     private String tableOwner;
 
+    /**
+     * 标准分类
+     */
+    @ApiModelProperty(value = "标准分类")
+    private Integer className;
+
+    /**
+     * 单元名称
+     */
+    @ApiModelProperty(value = "单元名称")
+    private Integer unitName;
 }

+ 33 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/Classifcation.java

@@ -0,0 +1,33 @@
+package org.springblade.manager.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@TableName("m_classifcation")
+@EqualsAndHashCode
+public class Classifcation {
+    private static final long serialVersionUID = 1L;
+    /**
+     * id
+     */
+    @TableField("id")
+    private Integer id;
+    /**
+     * 标准分类
+     */
+    @TableField("class_name")
+    private String className;
+    /**
+     * 单元名称
+     */
+    @TableField("unit_name")
+    private String unitName;
+    /**
+     * 分类编号
+     */
+    @TableField("type")
+    private Integer type;
+}

+ 14 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTree.java

@@ -177,4 +177,18 @@ public class WbsTree extends BaseEntity {
     @ApiModelProperty(value = "委托单Id")
     private Long erTreeId;
 
+    /**
+     * 标准分类
+     */
+    @ApiModelProperty(value = "标准分类")
+    private Integer className;
+
+    /**
+     * 单元名称
+     */
+    @ApiModelProperty(value = "单元名称")
+    private Integer unitName;
+
+    @ApiModelProperty(value = "是否包含单元评定")
+    private Integer isClassifition;
 }

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

@@ -9,6 +9,8 @@ import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 import org.springblade.core.mp.base.BaseEntity;
 
+import java.util.Date;
+
 @Data
 @TableName("m_wbs_tree_contract")
 @EqualsAndHashCode(callSuper = true)
@@ -282,4 +284,25 @@ public class WbsTreeContract extends BaseEntity {
     @ApiModelProperty(value = "是否采用排序0否1是")
     private Integer isUseSort;
 
+    @ApiModelProperty(value = "1 水利工程 2是数字化")
+    private Integer nodeClass;
+
+    @ApiModelProperty(value ="是否含单元评定 0否 1是 默认否")
+    private Integer isClassifition;
+
+    @ApiModelProperty(value = "标准分类")
+    private Integer className;
+
+    @ApiModelProperty(value = "单元名称")
+    private Integer unitName;
+
+    @ApiModelProperty(value = "优良个数")
+    private Integer excellentNum;
+
+    @ApiModelProperty(value = "单元个数")
+    private Integer unitNum;
+
+    @ApiModelProperty(value = "自定义数字化节点的上传时间")
+    private Date digitizeTime;
+
 }

+ 17 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreePrivate.java

@@ -231,4 +231,21 @@ public class WbsTreePrivate extends BaseEntity {
 
     @ApiModelProperty(value = "是否在客户端新增时隐藏,0否1是")
     private Integer isAddConceal;
+
+    /**
+     * 标准分类
+     */
+    @ApiModelProperty(value = "标准分类")
+    private Integer className;
+
+    /**
+     * 单元名称
+     */
+    @ApiModelProperty(value = "单元名称")
+    private Integer unitName;
+
+    @ApiModelProperty(value = "是否包含单元评定")
+    private Integer isClassifition;
+
+
 }

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

@@ -3,6 +3,7 @@ package org.springblade.manager.vo;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.bouncycastle.asn1.x509.V2AttributeCertificateInfoGenerator;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -99,4 +100,22 @@ public class WbsTreeContractLazyVO implements Serializable {
     @ApiModelProperty(value = "创建时间")
     private Date createTime;
 
+    @ApiModelProperty(value = "标准分类")
+    private Integer className;
+
+    @ApiModelProperty(value = "单元名称")
+    private Integer unitName;
+
+    @ApiModelProperty(value = "单元个数")
+    private Integer unitNum;
+
+    @ApiModelProperty(value = "1自定义水利 2自定义数字化")
+    private Integer nodeClass;
+
+    @ApiModelProperty(value = "优良个数")
+    private Integer excellentNum;
+
+    @ApiModelProperty(value = "是否含单元评定0否1是")
+    private Integer isClassifition;
+
 }

+ 68 - 4
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -18,6 +18,7 @@ import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springblade.business.dto.CustomAddContractNodeDTO;
+import org.springblade.business.dto.CustomAddContractNodeDTO2;
 import org.springblade.business.entity.*;
 import org.springblade.business.feign.MessageWarningClient;
 import org.springblade.business.feign.OperationLogClient;
@@ -2663,12 +2664,12 @@ public class InformationWriteQueryController extends BladeController {
             @ApiImplicitParam(name = "partitionCode", value = "划分编号")
     })
     public R<Boolean> updateContractNodeParameter(@RequestParam Long pKeyId, @RequestParam String
-            nodeName, @RequestParam String partitionCode) {
+            nodeName, @RequestParam String partitionCode,@RequestParam(required=false) Integer className,
+             @RequestParam(required = false) Integer unitName,@RequestParam(required = false)Integer unitNum,@RequestParam(required = false)Integer excellentNum) {
         WbsTreeContract node = new WbsTreeContract();
         node.setPKeyId(pKeyId);
         node.setNodeName(nodeName);
         node.setPartitionCode(partitionCode);
-
         //只允许修改节点名称
         if (StringUtils.isEmpty(node.getNodeName()) || "null".equals(String.valueOf(node.getPKeyId())) || StringUtils.isEmpty(String.valueOf(node.getPKeyId()))) {
             return R.data(-1, false, "缺少参数");
@@ -2676,6 +2677,36 @@ public class InformationWriteQueryController extends BladeController {
 
         WbsTreeContract queries = this.wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(pKeyId);
 
+        if(ObjectUtil.isNotEmpty(className)||ObjectUtil.isNotEmpty(unitName)){
+            //查询当前节点的是否是子节点,以及当前节点父节点是否包含单元评定
+            String child="SELECT * FROM m_wbs_tree_contract WHERE parent_id="+queries.getId()+" AND is_deleted=0";
+           List<WbsTreeContract> childList = jdbcTemplate.query(child, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+           if(childList.size()>0){
+               for (WbsTreeContract wbsTreeContract : childList) {
+                   if(ObjectUtil.isEmpty(wbsTreeContract.getInitTableName())){
+                       return R.fail("当前节点存在子节点,不能设置标准分类和单元名称");
+                   }
+               }
+
+           }
+           String father="SELECT * FROM m_wbs_tree_contract WHERE id="+queries.getParentId();
+            WbsTreeContract fatherNode = jdbcTemplate.queryForObject(father, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+            if(ObjectUtil.isNotEmpty(fatherNode)){
+                if(fatherNode.getIsClassifition()==Integer.valueOf(1)){
+                    return R.fail("当前节点的父节点包含单元评定");
+                }
+            }
+        }
+        if(ObjectUtil.isNotEmpty(unitName)&&ObjectUtil.isNotEmpty(className)){
+            node.setIsClassifition(1);
+            node.setClassName(className);
+            node.setUnitName(unitName);
+            if(queries.getNodeClass()==Integer.valueOf(2)){
+                node.setExcellentNum(excellentNum);
+                node.setUnitNum(unitNum);
+            }
+        }
+
         //保存操作记录
         try {
             JSONObject json = new JSONObject();
@@ -3872,10 +3903,15 @@ public class InformationWriteQueryController extends BladeController {
         }
         WbsTreeContract parentNode = wbsTreeContractClient.getContractNodeByPrimaryKeyId(dto.getPrimaryKeyId());
         if (parentNode != null) {
+            if(parentNode.getNodeClass()==Integer.valueOf(2)){
+                throw new ServiceException("当前新增节点的父节点不能是自定义数字化上传节点");
+            }
+            if(parentNode.getIsClassifition()==Integer.valueOf(1)){
+                throw new ServiceException("当前新增节点的父节点不能包含单元评定");
+            }
             if (parentNode.getNodeType() < parentNode.getNodeType()) {
                 throw new ServiceException("当前新增选择的节点类型不能大于父级节点类型");
             }
-
             WbsTreeContract obj = new WbsTreeContract();
             obj.setPKeyId(SnowFlakeUtil.getId());
             obj.setId(SnowFlakeUtil.getId());
@@ -3886,7 +3922,6 @@ public class InformationWriteQueryController extends BladeController {
             obj.setWbsId(parentNode.getWbsId());
             obj.setNodeName(dto.getNodeName());
             obj.setFullName(dto.getNodeName());
-
             if (ObjectUtil.isNotEmpty(parentNode.getNodeType())) {
                 if (parentNode.getParentId().equals(0L)) {
                     obj.setNodeType(1);
@@ -3917,6 +3952,35 @@ public class InformationWriteQueryController extends BladeController {
                 obj.setTenantId(SecureUtil.getTenantId());
             }
 
+            if(dto.getNodeClass()==Integer.valueOf(2)){
+                if(dto.getIsClassifition()==1){
+                    if(parentNode.getNodeClass()==Integer.valueOf(2)){
+                        throw new ServiceException("当前节点的父节点已经是数字化上传节点");
+                    }
+                    if(ObjectUtil.isEmpty(dto.getClassName())){
+                        throw new ServiceException("请选择标准分类");
+                    }else {
+                        if(ObjectUtil.isEmpty(dto.getUnitName())){
+                            throw new ServiceException("请选择单元名称");
+                        }
+                    }
+                    if(ObjectUtil.isNotEmpty(dto.getClassName())&&ObjectUtil.isNotEmpty(dto.getUnitName())){
+                        obj.setClassName(dto.getClassName());
+                        obj.setUnitName(dto.getUnitName());
+                        obj.setIsClassifition(dto.getIsClassifition());
+                        obj.setExcellentNum(dto.getExcellentNum());
+                        obj.setUnitNum(dto.getUnitNum());
+
+                    }else {
+                        throw new ServiceException("标准分类或单元名称选择有误");
+                    }
+                }
+                obj.setNodeClass(dto.getNodeClass());
+                if(ObjectUtil.isEmpty(dto.getDigitizeTime())){
+                    throw new ServiceException("请选择节点时间");
+                }
+                obj.setDigitizeTime(dto.getDigitizeTime());
+            }
             if (wbsTreeContractClient.saveBatch(Collections.singletonList(obj))) {
                 informationQueryService.delAsyncWbsTree(parentNode.getContractId());
                 return R.success("操作成功");

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

@@ -855,7 +855,8 @@ public class ExcelTabController extends BladeController {
         ExcelTab dataInfo = excelTabService.getById(wbsTreePrivate.getExcelId());
         // 添加标题显示
         Elements trs = table.select("tr");
-        if( Func.isNotEmpty(dataInfo) && dataInfo.getTabType()!=100L) {
+        //这句代码在正式环境要加上
+        if( Func.isNotEmpty(dataInfo)&& dataInfo.getTabType()!=100L) {
             for (int i = 1; i < 6; i++) {
                 Element tr = trs.get(i);
                 Elements tds = tr.select("td");

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

@@ -858,13 +858,25 @@ public class FormulaController {
         return false;
     }
 
-
+    //原评定汇总(2024-10-10之前) 公路评定
     @GetMapping("/evaluate")
     public R<Object> evaluate(@NotNull(message="tablePkeyId 不能为空") Long tablePkeyId){
          BiFunction<String,String,List<Map<String, Object>>> bif= this.service.getTableNamePkIdsMaps();
          return this.service.evaluate(tablePkeyId);
     }
 
+    //评定汇总(2024-10-10之后) 水利评定
+    @GetMapping("/newEvaluate")
+    public R<Object> newEvaluate(@NotNull(message = "tablePkeyId 不能为空") Long tablePkeyId) {
+        return this.service.newEvaluate(tablePkeyId);
+    }
+
+    //根据项目ID判断是否是水利项目
+    @GetMapping("/isWaterProject")
+    public R<Boolean> isWaterProject(@NotNull(message = "projectId 不能为空") Long projectId){
+        return R.data(this.service.isWaterProject(projectId));
+    }
+
     /*根据p_key_id 获取各个元素的执行公式*/
     @GetMapping("/formulaForNode")
     public R<Object> formulaForNode(@NotNull Long pkeyId,String tableName,String elementName){

+ 11 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java

@@ -10,6 +10,7 @@ import lombok.AllArgsConstructor;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.tool.node.ForestNodeMerger;
+import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.mapper.WbsTreeContractMapper;
 import org.springblade.manager.service.IContractInfoService;
@@ -145,10 +146,20 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
 //        if (StringUtils.isNotEmpty(node.getPartitionCode())) {
             wrappers.set(WbsTreeContract::getPartitionCode, node.getPartitionCode());
 //        }
+        if(StringUtils.isNotEmpty(node.getClassName())){
+            wrappers.set(WbsTreeContract::getClassName,node.getClassName());
+            wrappers.set(WbsTreeContract::getUnitName,node.getUnitName());
+            wrappers.set(WbsTreeContract::getIsClassifition,node.getIsClassifition());
+        }
+        if(ObjectUtil.isNotEmpty(node.getExcellentNum())&&ObjectUtil.isNotEmpty(node.getUnitNum())){
+            wrappers.set(WbsTreeContract::getExcellentNum,node.getExcellentNum());
+            wrappers.set(WbsTreeContract::getUnitNum,node.getUnitNum());
+        }
         if (StringUtils.isNotEmpty(node.getSort()) && CommonUtil.checkBigDecimal(node.getSort())) {
             wrappers.set(WbsTreeContract::getSort, node.getSort());
         }
 
+
         return this.wbsTreeContractService.update(wrappers.eq(WbsTreeContract::getPKeyId, node.getPKeyId()));
     }
 

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

@@ -216,10 +216,12 @@
     <update id="updateByCondition1">
         UPDATE m_wbs_tree_contract
         SET node_type = #{wbsTP.nodeType}
+        <if test="wbsTP.isClassifition!=null and wbsTP.isClassifition!='' and wbsTP.isClassifition=1">
+        ,is_classifition=#{wbsTP.isClassifition},class_name=#{wbsTP.className},unit_name=#{wbsTP.unitName}
+        </if>
         WHERE project_id = #{wbsTP.projectId}
           AND is_type_private_pid = #{wbsTP.pKeyId}
     </update>
-
     <update id="updateByCondition2">
         UPDATE m_wbs_tree_contract
         SET is_deleted = 0

+ 5 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

@@ -205,6 +205,11 @@
             is_add_conceal     = #{wbsTP.isAddConceal},
             status             = 1,
             is_deleted         = 0
+            <if test="wbsTP.className!=null and wbsTP.className!=''">
+                ,class_name         =#{wbsTP.className},
+                unit_name          =#{wbsTP.unitName},
+                is_classifition    =#{wbsTP.isClassifition}
+            </if>
         where p_key_id = #{pKeyId}
     </update>
 

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

@@ -97,4 +97,5 @@ public interface IFormulaService extends BaseService<Formula> {
     /**获取当前节点的所有元素单元格坐标,可以按表和元素名筛选*/
     R<Object>analyzeForm(Long pkeyId,String elementName,Integer type);
 
+
 }

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

@@ -1145,8 +1145,6 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     String tabName = wbsTreeContract.getInitTableName();
                     // 判读修改还是 添加
                     String delSql = "delete from " + tabName + " where p_key_id=" + tableInfo.getPkeyId();
-
-
                     String sqlInfo = "";
                     LinkedHashMap<String, String> dataMap2 = tableInfo.getDataMap();
                     /*检查发现有p_key_id缺失的情况,导致表单数据丢失,所以强制覆盖*/

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

@@ -8,9 +8,11 @@ import cn.hutool.log.StaticLog;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.jfireel.expression.Expression;
 import com.mixsmart.utils.*;
+import jdk.nashorn.internal.ir.WhileNode;
 import lombok.RequiredArgsConstructor;
 import org.apache.poi.ss.usermodel.*;
 import org.jsoup.Jsoup;
@@ -43,7 +45,9 @@ import org.springblade.meter.feign.CertificateItemClient;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
+import org.springframework.dao.EmptyResultDataAccessException;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Async;
@@ -76,7 +80,6 @@ import java.util.stream.Stream;
 @RequiredArgsConstructor
 @Lazy
 public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula> implements IFormulaService {
-
         private final IWbsParamService wpService;
         private final FormulaStrategyFactory formulaStrategyFactory;
         private final IWbsTreeContractService wbsTreeContractService;
@@ -91,6 +94,10 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         private final WbsTreeContractMapper wbsTreeContractMapper;
         private final IFormulaDao formulaDao;
         private final CertificateItemClient certificateItemClient;
+        @Autowired
+        @Lazy
+        private   IExcelTabService  excelTabService;
+
 
 
         public final static String WP="WP";
@@ -105,7 +112,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         public final static String E="E";
     /**公式参数*/
     public final static String FMOT="OP";
-    
+
     /**是否使用表单公式*/
     public final static  boolean isForm=true;
 
@@ -3377,9 +3384,463 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         return reData;
     }
 
+    //递归查询 子节点
+    private List<WbsTreeContract> getAllChildNodes(WbsTreeContract fatherNode,List<WbsTreeContract>childrenNodes) {
+
+        String sql="SELECT * FROM m_wbs_tree_contract WHERE parent_id="+fatherNode.getId()+" AND is_deleted=0";
+        List<WbsTreeContract> childs = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+        if(childs.size()>0){
+            childrenNodes.addAll(childs);
+        }
+        for (WbsTreeContract child : childs) {
+            getAllChildNodes(child,childrenNodes);
+        }
+        return childrenNodes;
+    }
+
+    public String findUnitName(Integer unitName){
+        String sql="SELECT unit_name from m_classifcation where id="+unitName;
+        return jdbcTemplate.queryForObject(sql, String.class);
+    }
+
+    //根据ID获取父节点,判断是否是自定义数字化节点
+    public Boolean findFatherNode(Long id){
+        String sql="SELECT node_class from m_wbs_tree_contract WHERE id="+id;
+        Integer nodeClass = jdbcTemplate.queryForObject(sql, Integer.class);
+        if(ObjectUtil.isNotEmpty(nodeClass)){
+            if(nodeClass.equals(2)){
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public R<Object> newEvaluate(Long tablePkeyId) {
+        //先根据表单查出节点 然后查出父节点
+        if(StringUtils.isNumber(tablePkeyId)){
+             String queryParentNodeID="SELECT * from m_wbs_tree_contract WHERE p_key_id="+tablePkeyId;
+             WbsTreeContract wbsTreeContract1= jdbcTemplate.queryForObject(queryParentNodeID, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+             if(ObjectUtil.isEmpty(wbsTreeContract1)){
+                 return R.fail("表单不存在");
+             }
+             if(wbsTreeContract1.getIsCopeTab()==Integer.valueOf(2)){
+                 return R.fail("该表不能评定汇总");
+             }
+             try {
+                 String biaodan="SELECT id from "+wbsTreeContract1.getInitTableName()+" where p_key_id="+wbsTreeContract1.getPKeyId();
+                 Long l = jdbcTemplate.queryForObject(biaodan, Long.class);
+             }catch (EmptyResultDataAccessException e){
+                 return R.fail("请先保存本表后再评定汇总");
+             }
+
+            String queryParentNode="SELECT * FROM m_wbs_tree_contract WHERE id="+wbsTreeContract1.getParentId();
+            WbsTreeContract wbsTreeContract = jdbcTemplate.queryForObject(queryParentNode, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+            if(ObjectUtil.isEmpty(wbsTreeContract)){
+                return R.fail("节点不存在");
+            }else {
+                if(!wbsTreeContract.getNodeName().contains("评定")){
+                    return R.fail("该节点不能评定");
+                }
+            }
+            String queryProjectInfo="SELECT project_grade FROM m_project_info WHERE id="+wbsTreeContract.getProjectId();
+            String projectGrade = jdbcTemplate.queryForObject(queryProjectInfo, String.class);
+            if(StringUtils.isEmpty(projectGrade)){
+                return R.fail("该项目不为水利项目");
+            }else {
+                if(!projectGrade.equals("6")){
+                    return R.fail("该项目不为水利项目");
+                }
+            }
+            //如果已评定并且有复制表,先删除所有的复制表
+            String queryNode="SELECT * from m_wbs_tree_contract where parent_id="+wbsTreeContract1.getParentId();
+            List<WbsTreeContract> queryNodes = jdbcTemplate.query(queryNode, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+            if(queryNodes.size()>1){
+                for (WbsTreeContract node : queryNodes) {
+                    if(node.getNodeName().indexOf("分部工程施工质量评定表_")>=0){
+                        excelTabService.removeBussTabInfoById(node.getPKeyId().toString());
+                    }
+                }
+            }
+            //查询当前节点的父节点
+            String queryFatherNodes="SELECT * from m_wbs_tree_contract where id="+wbsTreeContract.getParentId();
+            WbsTreeContract fatherNode = jdbcTemplate.queryForObject(queryFatherNodes, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+            //当前节点的父节点所有的子节点
+            List<WbsTreeContract> childrenNodes=new ArrayList<>();
+             childrenNodes = getAllChildNodes(fatherNode,childrenNodes);
+            List<WbsTreeContract> list=new ArrayList<>();
+            //筛选出所有包含单元评定的节点
+            if(childrenNodes.size()>0){
+                for (WbsTreeContract childrenNode : childrenNodes) {
+                    if(ObjectUtil.isNotEmpty(childrenNode.getIsClassifition())){
+                        if(childrenNode.getIsClassifition()==Integer.valueOf(1)){
+                            list.add(childrenNode);
+                        }
+                    }
+                }
+            }
+            if(list.size()==0){
+                return R.success("成功");
+            }
+            //单元工程种类  <单元名称,个数>
+            Map<String,Integer> maps=new HashMap<>();
+            for (WbsTreeContract treeContract : list) {
+                String unitName = findUnitName(treeContract.getUnitName());
+                //如果包含单元名称就在原来的数量上加1,同时判断如果是自定义的节点就加自定义节点的单元数量
+                if(maps.containsKey(unitName)){
+                    if(treeContract.getNodeClass()==Integer.valueOf(2)){
+                        if(ObjectUtil.isNotEmpty(treeContract.getUnitNum())){
+                            maps.put(unitName,maps.get(unitName)+treeContract.getUnitNum());
+                        }
+
+                    }else {
+                        maps.put(unitName,maps.get(unitName)+1);
+                    }
+                }else {
+                //不包含就放进map 同时判断是否是自定义的节点
+                    if(treeContract.getNodeClass()==Integer.valueOf(2)){
+                     if(ObjectUtil.isNotEmpty(treeContract.getUnitNum())){
+                         maps.put(unitName,treeContract.getUnitNum());
+                     }
+                    }else{
+                     maps.put(unitName, 1);
+                    }
+                }
+            }
+            //筛选出自定义数字化节点包含单元评定的节点
+            List<WbsTreeContract>list1=new ArrayList<>();
+            for (WbsTreeContract childrenNode : childrenNodes) {
+                if(childrenNode.getStatus()==Integer.valueOf(1)){
+                    if(ObjectUtil.isNotEmpty(childrenNode.getNodeClass())){
+                        if(childrenNode.getNodeClass()==Integer.valueOf(2)){
+                            if(ObjectUtil.isNotEmpty(childrenNode.getIsClassifition())){
+                                if(childrenNode.getIsClassifition()==Integer.valueOf(1)){
+                                    list1.add(childrenNode);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            //自定义数字化节点 <单元名称,优良个数>
+            Map<String,Integer>maps1=new HashMap<>();
+            if(list1.size()>0){
+                for (WbsTreeContract treeContract : list1) {
+                    String unitName = findUnitName(treeContract.getUnitName());
+                    if(maps1.containsKey(unitName)){
+                        maps1.put(unitName,maps1.get(unitName)+treeContract.getExcellentNum());
+                    }else {
+                        maps1.put(unitName,treeContract.getExcellentNum());
+                    }
+                }
+            }
+            //水利工程 拿到除了自定义数字化上传节点以外的其他所有节点的表单
+            List<WbsTreeContract>list2=new ArrayList<>();
+            for (WbsTreeContract childrenNode : childrenNodes) {
+                if(childrenNode.getStatus()==Integer.valueOf(1)){
+                    if(ObjectUtil.isNotEmpty(childrenNode.getInitTableName())){
+                        //判断表单父节点是否是自定义数字化节点
+                        if(!findFatherNode(childrenNode.getParentId())){
+                            list2.add(childrenNode);
+                        }
+                    }
+                }
+            }
+
+            //拿到所有水利工程的表单,去循环查找表单中的元素,包含了评定等级的个数
+            Map<String,Integer>maps2=new HashMap<>();
+            if(list2.size()>0){
+                for (WbsTreeContract treeContract : list2) {
+                    String tableInfoSql="SELECT id from m_table_info Where tab_en_name="+ "'"+treeContract.getInitTableName()+"'";
+                    Long id = jdbcTemplate.queryForObject(tableInfoSql, Long.class);
+                    if(ObjectUtil.isEmpty(id)){
+                        continue;
+                    }
+                    String elementSql="SELECT * from m_wbs_form_element where f_id="+id;
+                    List<WbsFormElement> elements = jdbcTemplate.query(elementSql, new BeanPropertyRowMapper<>(WbsFormElement.class));
+                    List<String>keys=new ArrayList<>();
+                    //筛选出所有表单配置了评定等级的key
+                    if(elements!=null&&elements.size()>0){
+                        for (WbsFormElement element : elements) {
+                            if(element.getDynamicDict()==Integer.valueOf(600)){
+                                keys.add(element.getEKey());
+                            }
+                        }
+                    }
+                    if(keys!=null&&keys.size()>0){
+                        //将拿到的key 去表单中查找元素 优良个数
+                        String querySql = "select * from " + wbsTreeContract.getInitTableName() + " where p_key_id=" + treeContract.getPKeyId();
+                        List<Map<String, Object>> dataIn = jdbcTemplate.queryForList(querySql);
+                        if(dataIn != null && dataIn.size() >= 1){
+                            Map<String, Object> mysqlData = dataIn.get(0);
+                            for (String key : mysqlData.keySet()) {
+                                for (String s : keys) {
+                                    if(s.equals(key)){
+                                        String tabVal = mysqlData.get(key) + "";
+                                        if(tabVal.indexOf("优良")>=0){
+                                            String sql="Select unit_name from m_wbs_tree_contract where id="+treeContract.getParentId();
+                                            Integer unitName = jdbcTemplate.queryForObject(sql, Integer.class);
+                                            String unitName1 = findUnitName(unitName);
+                                            if(maps2.containsKey(unitName1)){
+                                                maps2.put(unitName1,maps2.get(unitName1)+1);
+                                            }else {
+                                                maps2.put(unitName1,1);
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            // 合并两个Map <单元名称,优良个数>
+            Map<String, Integer> result = mergeMaps(maps1, maps2);
+            List<EvaluateDate> evaluateDates=new ArrayList<>();
+            for(String unitName:maps.keySet()){
+                EvaluateDate e = new EvaluateDate();
+                e.setUnitName(unitName);
+                e.setUnitNum(maps.get(unitName));
+                e.setQualifiedNum(maps.get(unitName));
+                evaluateDates.add(e);
+            }
+            if(evaluateDates.size()>0){
+                for (EvaluateDate evaluateDate : evaluateDates) {
+                    for (String unitName : result.keySet()) {
+                        if(unitName.equals(evaluateDate.getUnitName())){
+                            evaluateDate.setExcellentNum(result.get(unitName));
+                        }
+                    }
+                }
+            }
+            try {
+                Document document = null;
+                InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(wbsTreeContract1.getHtmlUrl());
+                String htmlString = IoUtil.readToString(inputStreamByUrl);
+                Document doc = Jsoup.parse(htmlString);
+                document = doc;
+                Elements unitNames = doc.select("el-input[placeholder~=单元工程种类]");
+                Elements unitNums = doc.select("el-input[placeholder~=单元工程个数]");
+                Elements qualifiedNums = doc.select("el-input[placeholder~=合格个数]");
+                Elements excellentNums = doc.select("el-input[placeholder~=其中优良个数]");
+
+                Map<String, Object> reData=new HashMap<>();
+                List<String[]>unitNamesString=new ArrayList<>();
+                List<String[]>unitNumsString=new ArrayList<>();
+                List<String[]>qualifiedNumsString=new ArrayList<>();
+                List<String[]>excellentNumString=new ArrayList<>();
+                for (Element unitName : unitNames) {
+                    String keyName = unitName.attr("keyName");
+                    String[] s = keyName.split("__");
+                    unitNamesString.add(s);
+                }
+                for (Element unitNum : unitNums) {
+                    String keyName = unitNum.attr("keyName");
+                    String[] s = keyName.split("__");
+                    unitNumsString.add(s);
+                }
+                for (Element qualifiedNum : qualifiedNums) {
+                    String keyName = qualifiedNum.attr("keyName");
+                    String[] s = keyName.split("__");
+                    qualifiedNumsString.add(s);
+                }
+                for (Element excellentNum : excellentNums) {
+                    String keyName = excellentNum.attr("keyName");
+                    String[] s = keyName.split("__");
+                    excellentNumString.add(s);
+                }
+                StringBuilder unitNameResult= new StringBuilder();
+                StringBuilder unitNumResult= new StringBuilder();
+                StringBuilder qualifiedNumResult= new StringBuilder();
+                StringBuilder excellentNumResult= new StringBuilder();
+                    for(int i=0;i<evaluateDates.size();i++){
+                        if(i>=8){
+                            break;
+                        }
+                        String[] strings1 = unitNamesString.get(i);
+                        unitNameResult.append("☆").append(evaluateDates.get(i).getUnitName()).append("_^_").append(strings1[1]);
+                        String[] strings2=unitNumsString.get(i);
+                        unitNumResult.append("☆").append(evaluateDates.get(i).getUnitNum()).append("_^_").append(strings2[1]);
+                        String[] strings3=qualifiedNumsString.get(i);
+                        qualifiedNumResult.append("☆").append(evaluateDates.get(i).getQualifiedNum()).append("_^_").append(strings3[1]);
+                        String[] strings4=excellentNumString.get(i);
+                        if(ObjectUtil.isNotEmpty(evaluateDates.get(i).getExcellentNum())){
+                            excellentNumResult.append("☆").append(evaluateDates.get(i).getExcellentNum()).append("_^_").append(strings4[1]);
+                        }
+                    }
+                    String[] strings1 = unitNamesString.get(0);
+                    String[] strings2=unitNumsString.get(0);
+                    String[] strings3=qualifiedNumsString.get(0);
+                    String[] strings4=excellentNumString.get(0);
+                    unitNameResult.deleteCharAt(0);
+                    unitNumResult.deleteCharAt(0);
+                    qualifiedNumResult.deleteCharAt(0);
+                    if(ObjectUtil.isNotEmpty(excellentNumResult)){
+                        excellentNumResult.deleteCharAt(0);
+                    }
+                    reData.put(strings1[0],unitNameResult);
+                    reData.put(strings2[0],unitNumResult);
+                    reData.put(strings3[0],qualifiedNumResult);
+                    if(excellentNumResult.length()>0){
+                        reData.put(strings4[0],excellentNumResult);
+                    }
+
+                  for (String key : reData.keySet()) {
+                    String sql1="Update "+wbsTreeContract1.getInitTableName()+" SET "+key+"="+ "'"+reData.get(key)+"'"+" WHERE p_key_id="+wbsTreeContract1.getPKeyId();
+                    jdbcTemplate.update(sql1);
+                  }
+                  if(evaluateDates.size()<=8){
+                      return R.success("成功");
+                  }else {
+                      int j;
+                      if(evaluateDates.size()%8==0){
+                          j=evaluateDates.size()/8;
+                      }else {
+                          j=evaluateDates.size()/8+1;
+                      }
+                      j=j-1;
+                      for (int x=0;x<j;x++){
+                          WbsTreeContract wbsTreeContract2 = this.copeBussTab(wbsTreeContract1.getPKeyId());
+                          evaluateDates.subList(0, 8).clear();
+                          unitNameResult. setLength(0);
+                          unitNumResult.setLength(0);
+                          qualifiedNumResult.setLength(0);
+                          if(ObjectUtil.isNotEmpty(excellentNumResult)){
+                              excellentNumResult.setLength(0);
+                          }
+                          for(int i=0;i<evaluateDates.size();i++){
+                              if(i>=8){
+                                  break;
+                              }
+                              String[] strings11 = unitNamesString.get(i);
+                              unitNameResult.append("☆").append(evaluateDates.get(i).getUnitName()).append("_^_").append(strings11[1]);
+                              String[] strings22=unitNumsString.get(i);
+                              unitNumResult.append("☆").append(evaluateDates.get(i).getUnitNum()).append("_^_").append(strings22[1]);
+                              String[] strings33=qualifiedNumsString.get(i);
+                              qualifiedNumResult.append("☆").append(evaluateDates.get(i).getQualifiedNum()).append("_^_").append(strings33[1]);
+                              String[] strings44=excellentNumString.get(i);
+                              if(ObjectUtil.isNotEmpty(evaluateDates.get(i).getExcellentNum())){
+                                  excellentNumResult.append("☆").append(evaluateDates.get(i).getExcellentNum()).append("_^_").append(strings44[1]);
+                              }
+                          }
+                          String[] strings11 = unitNamesString.get(0);
+                          String[] strings22=unitNumsString.get(0);
+                          String[] strings33=qualifiedNumsString.get(0);
+                          String[] strings44=excellentNumString.get(0);
+                          unitNameResult.deleteCharAt(0);
+                          unitNumResult.deleteCharAt(0);
+                          qualifiedNumResult.deleteCharAt(0);
+                          if(ObjectUtil.isNotEmpty(excellentNumResult)){
+                              excellentNumResult.deleteCharAt(0);
+                          }
+                          reData.put(strings11[0],unitNameResult);
+                          reData.put(strings22[0],unitNumResult);
+                          reData.put(strings33[0],qualifiedNumResult);
+                          if(excellentNumResult.length()>0){
+                              reData.put(strings44[0],excellentNumResult);
+                          }
+                          for (String key : reData.keySet()) {
+                              String sql1="Update "+wbsTreeContract2.getInitTableName()+" SET "+key+"="+ "'"+reData.get(key)+"'"+" WHERE p_key_id="+wbsTreeContract2.getPKeyId();
+                              jdbcTemplate.update(sql1);
+                          }
+                      }
+                      return R.success("成功");
+                  }
+
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+        }
+        return R.fail("失败");
+    }
+
+    public Map<String, Integer> mergeMaps(Map<String, Integer> map1, Map<String, Integer> map2) {
+        Map<String, Integer> result = new HashMap<>();
 
+        // 将map1的所有键值对添加到result中
+        for (Map.Entry<String, Integer> entry : map1.entrySet()) {
+            result.put(entry.getKey(), entry.getValue());
+        }
 
+        // 遍历map2,对于每个键
+        for (Map.Entry<String, Integer> entry : map2.entrySet()) {
+            String key = entry.getKey();
+            Integer value = entry.getValue();
 
+            // 如果键在result中已经存在,则将值相加
+            if (result.containsKey(key)) {
+                result.put(key, result.get(key) + value);
+            } else {
+                // 如果键在result中不存在,则直接添加
+                result.put(key, value);
+            }
+        }
+        return result;
+    }
+    public Boolean isWaterProject(Long projectId) {
+        String queryProjectInfo="SELECT project_grade FROM m_project_info WHERE id="+projectId;
+        String projectGrade = jdbcTemplate.queryForObject(queryProjectInfo, String.class);
+        if(StringUtils.isEmpty(projectGrade)){
+            return false;
+        }else {
+            if(!projectGrade.equals("6")){
+                return false;
+            }
+        }
+        return true;
+    }
+    public WbsTreeContract copeBussTab(Long pkeyId) {
+        WbsTreeContract wbsInfo = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
+            .eq(WbsTreeContract::getPKeyId, pkeyId));
+
+        List<WbsTreeContract> wbsTreeContractList = wbsTreeContractService.getBaseMapper().selectList(Wrappers.<WbsTreeContract>query().lambda()
+            .eq(WbsTreeContract::getId, wbsInfo.getId())
+            .eq(WbsTreeContract::getContractId, wbsInfo.getContractId())
+            .eq(WbsTreeContract::getParentId, wbsInfo.getParentId()));
+        List<WbsTreeContract> wbsTreeContractList2 = wbsTreeContractList.stream().sorted(Comparator.comparing(WbsTreeContract::getCreateTime).reversed()).collect(Collectors.toList());
+        long tabGroupId = SnowFlakeUtil.getId();
+
+        long newPkId = SnowFlakeUtil.getId();
+        WbsTreeContract wbsTreeContract = new WbsTreeContract();
+        BeanUtil.copy(wbsInfo, wbsTreeContract);
+        wbsTreeContract.setPKeyId(newPkId);
+        wbsTreeContract.setCreateTime(new Date());
+        wbsTreeContract.setTabGroupId(tabGroupId);
+        String nodeName = wbsTreeContractList2.get(0).getNodeName();
+
+        if (nodeName.indexOf("__") >= 0) {
+            String[] oldName = nodeName.split("__");
+            nodeName = oldName[0] + "__" + (Integer.parseInt(oldName[1]) + 1);
+        } else {
+            nodeName = nodeName + "__" + 1;
+        }
+        System.out.println("cr");
+        wbsTreeContract.setNodeName(nodeName);
+        wbsTreeContract.setIsCopeTab(2);
+        wbsTreeContract.setIsTabPdf(1); // pdf 不能预览
+        wbsTreeContract.setIsBussShow(1); // 是否隐藏表
+        wbsTreeContract.setTabFileType(1);//没有上传附件
+        wbsTreeContract.setPdfUrl("");
+
+        String tabName = wbsTreeContract.getInitTableName();
+        // 字段查询 并去掉公式字段
+
+        String colkeys = "SELECT GROUP_CONCAT(COLUMN_NAME) as colkeys from information_schema.COLUMNS c where c.table_name='" + tabName + "' and COLUMN_NAME not in('id','p_key_id')";
+        Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(colkeys);
+        colkeys = stringObjectMap.get("colkeys") + "";
+        // 复制表数据
+
+        String querySql = "insert into " + tabName + " (id,p_key_id," + colkeys + ") select '" + newPkId + "','" + newPkId + "'," + colkeys + " from " + tabName + " where p_key_id=" + pkeyId;
+        jdbcTemplate.execute(querySql);
+        wbsTreeContractService.save(wbsTreeContract);
+        for (WbsTreeContract wbsTreeCont : wbsTreeContractList2) {
+            UpdateWrapper<WbsTreeContract> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.in("p_key_id", wbsTreeCont.getPKeyId() + "");
+            updateWrapper.set("tab_group_id", tabGroupId);
+            wbsTreeContractService.update(updateWrapper);
+        }
+        return wbsTreeContract;
+    }
 }
 
 

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

@@ -120,6 +120,24 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         if (wbsTreePrivate.getPKeyId() != null) {
             Long pKeyId = wbsTreePrivate.getPKeyId();
             wbsTreePrivate.setFullName(wbsTreePrivate.getNodeName());
+           //选择了一个,必须选择另一个
+            if((wbsTreePrivate.getClassName()!=null&&wbsTreePrivate.getUnitName()==null)||(wbsTreePrivate.getClassName()==null&&wbsTreePrivate.getUnitName()!=null)){
+                throw new ServiceException("标准分类,单元名称不能为空");
+            }
+            //如果className,unitName不为空,则要判断该节点是否是最小节点
+            if(ObjectUtil.isNotEmpty(wbsTreePrivate.getClassName())&&ObjectUtil.isNotEmpty(wbsTreePrivate.getUnitName())){
+            QueryWrapper<WbsTreePrivate>wrapper=new QueryWrapper<>();
+            wrapper.eq("parent_id",wbsTreePrivate.getId()).eq("is_deleted",0);
+            //查出当前节点所有子节点。如果子节点中没有节点,说明是最小节点
+                List<WbsTreePrivate> wbsTreePrivates = baseMapper.selectList(wrapper);
+                if(wbsTreePrivates.size()>0){
+                    //过滤出所有不为表单的节点,大于0,则不是最小节点
+                    if(wbsTreePrivates.stream().filter(o->o.getInitTableName()==null).collect(Collectors.toList()).size()>0){
+                        throw new ServiceException("该节点不是最小节点不能设置标准分类和单元名称");
+                    }
+                }
+                wbsTreePrivate.setIsClassifition(1);
+            }
             int row = baseMapper.updateByPKeyId(pKeyId, wbsTreePrivate);
             /** 同步当前节点下所有节点的新增是否隐藏*/
             //如果父节点为隐藏,则子节点不能修改为显示

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

@@ -1,5 +1,6 @@
 package org.springblade.manager.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.google.common.collect.Lists;
@@ -119,6 +120,25 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
             String ancestors = parent.getAncestors() + StringPool.COMMA + wbsTree.getParentId();
             wbsTree.setAncestors(ancestors);
         }
+        //判断是否是叶子节点,只有业主节点才能编辑标准分类 单元名称
+        //选择了一个,必须选择另一个
+        if((wbsTree.getClassName()!=null&&wbsTree.getUnitName()==null)||(wbsTree.getClassName()==null&&wbsTree.getUnitName()!=null)){
+            throw new ServiceException("标准分类,单元名称不能为空");
+        }
+        //如果className,unitName不为空,则要判断该节点是否是最小节点
+        if(ObjectUtil.isNotEmpty(wbsTree.getClassName())&&ObjectUtil.isNotEmpty(wbsTree.getUnitName())){
+            QueryWrapper<WbsTree> wrapper=new QueryWrapper<>();
+            wrapper.eq("parent_id",wbsTree.getId()).eq("is_deleted",0);
+            //查出当前节点所有子节点。如果子节点中没有节点,说明是最小节点
+            List<WbsTree> wbsTrees = baseMapper.selectList(wrapper);
+            if(wbsTrees.size()>0){
+                //过滤出所有不为表单的节点,大于0,则不是最小节点
+                if(wbsTrees.stream().filter(o->o.getInitTableName()==null).collect(Collectors.toList()).size()>0){
+                    throw new ServiceException("该节点不是最小节点不能设置标准分类和单元名称");
+                }
+            }
+            wbsTree.setIsClassifition(1);
+        }
         if (wbsTree.getMajorDataType() == null) {
             wbsTree.setMajorDataType(0);
         }
@@ -148,8 +168,17 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
             }
             wbsTree.setSort(sort + 1);
         }
-
-        return saveOrUpdate(wbsTree);
+        boolean b = saveOrUpdate(wbsTree);
+        if(b){
+            if(wbsTree.getIsClassifition()==Integer.valueOf(1)){
+                String updateSql="UPDATE m_wbs_tree_private SET class_name="+wbsTree.getClassName()+",unit_name="+wbsTree.getUnitName()+",is_classifition="+wbsTree.getIsClassifition();
+                int update = jdbcTemplate.update(updateSql);
+                if(update!=1){
+                    b=false;
+                }
+            }
+        }
+        return b;
     }
 
     public boolean submit2(FormElementDTO fd) {

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

@@ -723,7 +723,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                 if (new Integer(1).equals(contractInfo.getContractType())) {
                     String sql = "SELECT is_custom,p_key_id,contract_id," +
                             "(SELECT id FROM u_contract_tree_drawings WHERE process_id = p_key_id AND is_deleted = 0 limit 1) AS drawingsId," +
-                            "id,parent_id,node_type,type,wbs_type,is_buss_show as isBussShow,is_concrete,major_data_type,partition_code,old_id,contract_id_relation,is_concealed_works_node," +
+                            "id,parent_id,node_type,type,wbs_type,is_buss_show as isBussShow,is_concrete,major_data_type,class_name,unit_name,node_class,unit_num,excellent_num,is_classifition,partition_code,old_id,contract_id_relation,is_concealed_works_node," +
                             "CASE (SELECT count(1) FROM u_tree_contract_first AS tcf WHERE tcf.is_deleted = 0 AND tcf.wbs_node_id = a.p_key_id) " +
                             "WHEN 0 THEN 'false' ELSE 'true' END AS isFirst,IFNULL(if(length(trim(full_name))>0,full_name,node_name),node_name) AS title," +
                             "(SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND b.type = 1" +