فهرست منبع

Merge remote-tracking branch 'origin/master' into master

yangyj 1 سال پیش
والد
کامیت
902655b2c7
20فایلهای تغییر یافته به همراه813 افزوده شده و 228 حذف شده
  1. 6 6
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExpertScore.java
  2. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractLazyVO.java
  3. 30 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/WbsNodeDTO.java
  4. 5 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MaterialStartStatement.java
  5. 43 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/WbsFileVO.java
  6. 55 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/WbsNodeVO.java
  7. 15 8
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertConclusionServiceImpl.java
  8. 30 29
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertScoreServiceImpl.java
  9. 52 47
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.xml
  10. 17 6
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ImageClassificationFileServiceImpl.java
  11. 6 0
      blade-service/blade-meter/pom.xml
  12. 17 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MiddleMeterApplyController.java
  13. 114 96
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java
  14. 1 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MaterialStartStatementMapper.xml
  15. 15 2
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.java
  16. 70 8
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.xml
  17. 3 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IMiddleMeterApplyService.java
  18. 188 12
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MiddleMeterApplyServiceImpl.java
  19. 55 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/utils/CollectionUtils.java
  20. 85 14
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

+ 6 - 6
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExpertScore.java

@@ -52,21 +52,21 @@ public class ArchiveExpertScore extends BaseEntity {
     private String scoreItem;
 
     @ApiModelProperty("完整性")
-    private Integer integrality;
+    private BigDecimal integrality;
 
     @ApiModelProperty("完整性扣分")
-    private Integer integralityDeduction;
+    private BigDecimal integralityDeduction;
 
     @ApiModelProperty("规范性")
-    private Integer normative;
+    private BigDecimal normative;
 
     @ApiModelProperty("规范性扣分")
-    private Integer normativeDeduction;
+    private BigDecimal normativeDeduction;
 
     public ArchiveExpertScore() {
     }
 
-    public ArchiveExpertScore(Long projectId, Integer unitType, String scoreItem, Integer integrality, Integer integralityDeduction, Integer normative, Integer normativeDeduction) {
+    public ArchiveExpertScore(Long projectId, Integer unitType, String scoreItem, BigDecimal integrality, BigDecimal integralityDeduction, BigDecimal normative, BigDecimal normativeDeduction) {
         this.projectId = projectId;
         this.unitType = unitType;
         this.scoreItem = scoreItem;
@@ -76,7 +76,7 @@ public class ArchiveExpertScore extends BaseEntity {
         this.normativeDeduction = normativeDeduction;
     }
 
-    public ArchiveExpertScore(Long projectId, Long conclusionId, Integer unitType, String scoreItem, Integer integrality, Integer integralityDeduction, Integer normative, Integer normativeDeduction) {
+    public ArchiveExpertScore(Long projectId, Long conclusionId, Integer unitType, String scoreItem, BigDecimal integrality, BigDecimal integralityDeduction, BigDecimal normative, BigDecimal normativeDeduction) {
         this.projectId = projectId;
         this.conclusionId = conclusionId;
         this.unitType = unitType;

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

@@ -84,10 +84,16 @@ public class WbsTreeContractLazyVO implements Serializable {
     @ApiModelProperty(value = "是否为自定义新增节点 1=是")
     private Integer isCustom;
 
+    @ApiModelProperty(value = "子级节点-是否为自定义新增节点 1=是")
+    private Integer isCustomChild;
+
+    @ApiModelProperty(value = "排序")
     private Integer sort;
 
+    @ApiModelProperty(value = "全称")
     private String fullName;
 
+    @ApiModelProperty(value = "创建时间")
     private Date createTime;
 
 }

+ 30 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/WbsNodeDTO.java

@@ -0,0 +1,30 @@
+package org.springblade.meter.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/2/1 15:49
+ **/
+@Data
+public class WbsNodeDTO {
+    @ApiModelProperty(value = "项目id")
+    private Long projectId;
+
+    @ApiModelProperty(value = "合同id")
+    private Long contractId;
+
+    @ApiModelProperty(value = "监理合同段用合同id")
+    private Long contractIdRelation;
+
+    @ApiModelProperty(value = "WBS树节点id")
+    private Long nodeId;
+
+    @ApiModelProperty("当前页")
+    private Integer current;
+
+    @ApiModelProperty("每页的数量")
+    private Integer size;
+}

+ 5 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MaterialStartStatement.java

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 import java.time.LocalDate;
 
+import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.springblade.core.mp.base.BaseEntity;
 import lombok.Data;
@@ -35,6 +36,7 @@ import lombok.EqualsAndHashCode;
 @Data
 @TableName("s_material_start_statement")
 @EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "材料和开工报表实体类", description = "材料和开工报表实体类")
 public class MaterialStartStatement extends BaseEntity {
 
     private static final long serialVersionUID = 1L;
@@ -98,5 +100,8 @@ public class MaterialStartStatement extends BaseEntity {
     @ApiModelProperty(value = "审批状态,0未上报,1待审批,2已审批")
     private Integer approveStatus;
 
+    @ApiModelProperty(value = "pdfUrl")
+    private String rawUrl;
+
 
 }

+ 43 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/WbsFileVO.java

@@ -0,0 +1,43 @@
+package org.springblade.meter.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @Param   中间计量申请关联WBS树文件
+ * @Author wangwl
+ * @Date 2024/2/1 11:21
+ **/
+@Data
+public class WbsFileVO implements Serializable {
+
+
+    @ApiModelProperty(value = "部位名称")
+    private String partName;
+
+    @ApiModelProperty(value = "资料名称")
+    private String dataName;
+
+    @ApiModelProperty(value = "审批状态名称")
+    private String appStatusName;
+
+    @ApiModelProperty(value = "PDF路径")
+    private String pdfUrl;
+
+    @ApiModelProperty(value = "电签PDF路径")
+    private String eVisaPdfUrl;
+
+    @ApiModelProperty(value = "祖级节点")
+    private String ancestors;
+
+    @ApiModelProperty(value = "节点类型(工序)")
+    private Integer nodeType;
+
+    @ApiModelProperty(value = "当前节点名称")
+    private String nodeName;
+
+    @ApiModelProperty(value = "父节点id")
+    private Long parentId;
+}

+ 55 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/WbsNodeVO.java

@@ -0,0 +1,55 @@
+package org.springblade.meter.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+import org.springblade.core.tool.node.INode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Param   质检树使用
+ * @Author wangwl
+ * @Date 2024/2/1 14:53
+ **/
+@Data
+public class WbsNodeVO implements INode<WbsNodeVO> {
+    /**
+     * 主键ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    /**
+     * 父节点ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long parentId;
+
+    /**
+     * 子孙节点
+     */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private List<WbsNodeVO> children;
+
+    /**
+     * 是否有子孙节点
+     */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private Boolean hasChildren;
+
+    @Override
+    public List<WbsNodeVO> getChildren() {
+        if (this.children == null) {
+            this.children = new ArrayList<>();
+        }
+        return this.children;
+    }
+
+    private Integer isData;
+    private Long pId;
+    private String ancestors;
+    private String nodeName;
+}

+ 15 - 8
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertConclusionServiceImpl.java

@@ -39,6 +39,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.io.FileOutputStream;
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.util.ArrayList;
@@ -275,14 +276,16 @@ public class ArchiveExpertConclusionServiceImpl extends BaseServiceImpl<ArchiveE
         }
         vo.setPdfUrl(pdfUrl);
         vo.setList(infos);
+        System.out.println("11111111111");
         //PDF电签
         R<String> visa = eVisaClient.batchEVisa(vo);
         if (visa == null){
             throw new ServiceException("调用电签服务失败");
         }
         if (visa.getCode() == 400){
-            throw new ServiceException(visa.getMsg());
+            throw new ServiceException("调用电签服务失败:"+visa.getMsg());
         }
+        System.out.println(visa);
         //修改状态,插入结论PDF
         conclusion.setTableUrl(visa.getData());
         conclusion.setStatus(2);
@@ -318,7 +321,8 @@ public class ArchiveExpertConclusionServiceImpl extends BaseServiceImpl<ArchiveE
 //        String localFile = "C:\\Users\\泓创研发01\\Desktop\\"+conclusion.getId()+".pdf";
         String localFile = "/www/wwwroot/Users/hongchuangyanfa/Desktop/archiveCheck/"+conclusion.getId()+".pdf";
         //建立一个书写器
-        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(localFile));
+        FileOutputStream fileOutputStream = new FileOutputStream(localFile);
+        PdfWriter writer = PdfWriter.getInstance(document,fileOutputStream );
         //页尾
         MyPdfPageHelper helper = new MyPdfPageHelper();
         writer.setPageEvent(helper);
@@ -375,7 +379,7 @@ public class ArchiveExpertConclusionServiceImpl extends BaseServiceImpl<ArchiveE
                 List<ArchiveExpertScore> list = map.get(i);
                 Boolean isMark = false;
                 for (ArchiveExpertScore score : list) {
-                    if (score.getIntegralityDeduction() != 0 || score.getNormativeDeduction() != 0) {
+                    if (score.getIntegralityDeduction().compareTo(BigDecimal.ZERO) != 0 || score.getNormativeDeduction().compareTo(BigDecimal.ZERO) != 0) {
                         isMark = true;
                         break;
                     }
@@ -415,8 +419,8 @@ public class ArchiveExpertConclusionServiceImpl extends BaseServiceImpl<ArchiveE
                 document.add(twoTable);
                 //将数据放入表格中
 
-                int allScore = 0;
-                int allPoints = 0;
+                BigDecimal allScore = BigDecimal.ZERO;
+                BigDecimal allPoints = BigDecimal.ZERO;
                 for (int j = 0; j < list.size(); j++) {
                     PdfPTable dataTable = new PdfPTable(5);
                     dataTable.setWidths(floats);
@@ -428,8 +432,11 @@ public class ArchiveExpertConclusionServiceImpl extends BaseServiceImpl<ArchiveE
                     dataTable.addCell(ItextPdfUtils.pdfTableStyle7(score.getNormative() + "", size13font, 25));
                     dataTable.addCell(ItextPdfUtils.pdfTableStyle7(score.getNormativeDeduction() + "", size13font, 25));
                     document.add(dataTable);
-                    allScore += score.getIntegrality() + score.getNormative();
-                    allPoints += score.getIntegralityDeduction() + score.getNormativeDeduction();
+//                    allScore = score.getIntegrality() + score.getNormative();
+                    allScore = allScore.add(score.getIntegrality()).add(score.getNormative());
+
+//                    allPoints = score.getIntegralityDeduction() + score.getNormativeDeduction();
+                    allPoints = allPoints.add(score.getIntegralityDeduction()).add(score.getNormativeDeduction());
                 }
                 //末尾统计行
                 PdfPTable statRow = new PdfPTable(2);
@@ -437,7 +444,7 @@ public class ArchiveExpertConclusionServiceImpl extends BaseServiceImpl<ArchiveE
                 statRow.setWidthPercentage(widthPercentage);
                 PdfPCell leftCell = ItextPdfUtils.pdfTableStyle7("总得分", size13font, 25);
                 statRow.addCell(leftCell);
-                PdfPCell rightCell = ItextPdfUtils.pdfTableStyle7(allScore - allPoints + "", size13font, 25);
+                PdfPCell rightCell = ItextPdfUtils.pdfTableStyle7(allScore.subtract(allPoints) + "", size13font, 25);
                 statRow.addCell(rightCell);
                 document.add(statRow);
 

+ 30 - 29
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertScoreServiceImpl.java

@@ -25,6 +25,7 @@ import org.springframework.stereotype.Service;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -46,29 +47,29 @@ public class ArchiveExpertScoreServiceImpl extends BaseServiceImpl<ArchiveExpert
     public void saveBaseScoreInfo(Long projectId,Long conclusionId) {
         List<ArchiveExpertScore> list = new ArrayList<>();
         //业主
-        list.add(new ArchiveExpertScore(projectId,conclusionId,1,"立项审批",10,null,10,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,1,"设计审批文件",7,null,7,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,1,"招投标文件",7,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,1,"工程准备文件",5,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,1,"施工文件",4,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,1,"交、竣工文件",8,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,1,"资金管理文件",5,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,1,"照片",4,null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,1,"立项审批",new BigDecimal(10),null,new BigDecimal(10),null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,1,"设计审批文件",new BigDecimal(7),null,new BigDecimal(7),null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,1,"招投标文件",new BigDecimal(7),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,1,"工程准备文件",new BigDecimal(5),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,1,"施工文件",new BigDecimal(4),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,1,"交、竣工文件",new BigDecimal(8),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,1,"资金管理文件",new BigDecimal(5),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,1,"照片",new BigDecimal(4),null,null,null));
         //监理
-        list.add(new ArchiveExpertScore(projectId,conclusionId,2,"监理机构、制度",3,null,10,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,2,"会议纪要、往来文件、监理费用、支付报表、监理日志、总结",10,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,2,"工地试验室资质证书、延期文件、仪器标定证书",3,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,2,"试验资料",6,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,2,"质检资料",6,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,2,"质评资料",6,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,2,"安全资料",3,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,2,"监理指令及回复、旁站记录、巡视记录",9,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,2,"照片",4,null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,2,"监理机构、制度",new BigDecimal(3),null,new BigDecimal(10),null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,2,"会议纪要、往来文件、监理费用、支付报表、监理日志、总结",new BigDecimal(10),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,2,"工地试验室资质证书、延期文件、仪器标定证书",new BigDecimal(3),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,2,"试验资料",new BigDecimal(6),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,2,"质检资料",new BigDecimal(6),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,2,"质评资料",new BigDecimal(6),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,2,"安全资料",new BigDecimal(3),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,2,"监理指令及回复、旁站记录、巡视记录",new BigDecimal(9),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,2,"照片",new BigDecimal(4),null,null,null));
         //施工
-        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"设计变更及竣工图",9,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"施工准备文件",5,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"试验资料(含工地试验室资质证书、仪器标定证书等)",9,null,10,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"质检资料",10,null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"设计变更及竣工图",new BigDecimal(9),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"施工准备文件",new BigDecimal(5),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"试验资料(含工地试验室资质证书、仪器标定证书等)",new BigDecimal(9),null,new BigDecimal(10),null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"质检资料",new BigDecimal(10),null,null,null));
         list.add(new ArchiveExpertScore(projectId,conclusionId,3,"路基工程质检资料",null,null,null,null));
         list.add(new ArchiveExpertScore(projectId,conclusionId,3,"路面工程质检资料",null,null,null,null));
         list.add(new ArchiveExpertScore(projectId,conclusionId,3,"隧道工程质检资料",null,null,null,null));
@@ -76,14 +77,14 @@ public class ArchiveExpertScoreServiceImpl extends BaseServiceImpl<ArchiveExpert
         list.add(new ArchiveExpertScore(projectId,conclusionId,3,"交通与安全工程质检资料",null,null,null,null));
         list.add(new ArchiveExpertScore(projectId,conclusionId,3,"机电工程质检资料",null,null,null,null));
         list.add(new ArchiveExpertScore(projectId,conclusionId,3,"房建工程质检资料",null,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"质评资料",5,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"进度进化控制文件",3,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"安全生产、文明施工资料",2,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"施工日志、大事记",3,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"计量支付文件",5,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"会议纪要、往来文件",3,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"照片",3,null,null,null));
-        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"总结",3,null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"质评资料",new BigDecimal(5),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"进度进化控制文件",new BigDecimal(3),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"安全生产、文明施工资料",new BigDecimal(2),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"施工日志、大事记",new BigDecimal(3),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"计量支付文件",new BigDecimal(5),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"会议纪要、往来文件",new BigDecimal(3),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"照片",new BigDecimal(3),null,null,null));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"总结",new BigDecimal(3),null,null,null));
         this.saveBatch(list);
     }
 

+ 52 - 47
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.xml

@@ -73,60 +73,65 @@
 
     <select id="selectImageClassificationFilePage" resultMap="imageClassificationFileResultMap">
         select
-        files.id,
-        files.title,
-        files.text_content,
-        files.shooting_user,
-        files.shooting_time,
-        files.file_size,
-        files.image_url,
-        files.pdf_url,
-        files.type,
-        files.marge_pdf_url,
-        files.create_time
+            files.id,
+            files.title,
+            files.text_content,
+            files.shooting_user,
+            files.shooting_time,
+            files.file_size,
+            files.image_url,
+            files.pdf_url,
+            files.type,
+            files.marge_pdf_url,
+            files.create_time,
+            files.wbs_id
         from
         (
-        select
-        create_time,
-        id,
-        title,
-        text_content,
-        shooting_user,
-        shooting_time,
-        file_size,
-        image_url,
-        pdf_url,
-        marge_pdf_url,
-        type,
-        date_format(shooting_time,'%Y-%m-%d') as shootingTimeStr
-        from u_image_classification_file where is_deleted = 0
-        and project_id = #{param.projectId} and classify_id = #{param.classifyId}
-        <if test="param.contractId != null and param.contractId != ''">
-            and contract_id = #{param.contractId}
-        </if>
-        <if test="param.queryStr != null and param.queryStr != ''">
-            and (title like concat('%',#{param.queryStr},'%') OR shooting_user like concat('%',#{param.queryStr},'%'))
-        </if>
-        <if test="param.wbsIds != null and param.wbsIds.size != 0">
-            and wbs_id in
-            <foreach collection="param.wbsIds" item="webId" open="(" separator="," close=")">#{webId}</foreach>
-        </if>
-
-        <if test="param.staDate != null and param.staDate != ''">
-            <![CDATA[ and  shooting_time >= DATE_FORMAT(#{param.staDate}, '%Y-%m-%d %H:%i:%S') ]]>
-        </if>
-        <if test="param.endDate != null and param.endDate != ''">
-            <![CDATA[ and  shooting_time <= DATE_FORMAT(#{param.endDate}, '%Y-%m-%d %H:%i:%S') ]]>
-        </if>
-
-        order by shooting_time desc
-        ) as files
+            select
+                wbs_id,
+                create_time,
+                id,
+                title,
+                text_content,
+                shooting_user,
+                shooting_time,
+                file_size,
+                image_url,
+                pdf_url,
+                marge_pdf_url,
+                type,
+                date_format(shooting_time,'%Y-%m-%d') as shootingTimeStr
+            from u_image_classification_file
+            where is_deleted = 0 and status = 1
+                and project_id = #{param.projectId}
+                and classify_id = #{param.classifyId}
+            <if test="param.contractId != null and param.contractId != ''">
+                and contract_id = #{param.contractId}
+            </if>
+            <if test="param.queryStr != null and param.queryStr != ''">
+                and (title like concat('%',#{param.queryStr},'%') OR shooting_user like concat('%',#{param.queryStr},'%'))
+            </if>
+            <if test="param.wbsIds != null and param.wbsIds.size != 0">
+                and wbs_id in
+                <foreach collection="param.wbsIds" item="wbsId" open="(" separator="," close=")">
+                    #{wbsId}
+                </foreach>
+            </if>
+            <if test="param.staDate != null and param.staDate != ''">
+                <![CDATA[ and  shooting_time >= DATE_FORMAT(#{param.staDate}, '%Y-%m-%d %H:%i:%S') ]]>
+            </if>
+            <if test="param.endDate != null and param.endDate != ''">
+                <![CDATA[ and  shooting_time <= DATE_FORMAT(#{param.endDate}, '%Y-%m-%d %H:%i:%S') ]]>
+            </if>
+                order by shooting_time desc
+            ) as files
         where
-        1 = 1
+            1 = 1
         <if test="param.queryDate != null and param.queryDate != ''">
             and files.shootingTimeStr like concat('%',#{param.queryDate},'%')
         </if>
     </select>
+
     <select id="getDeleteDataByIds" resultType="org.springblade.business.entity.ImageClassificationFile">
         select * from u_image_classification_file where id in
         <foreach collection="ids" item="id" open="(" separator="," close=")">

+ 17 - 6
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ImageClassificationFileServiceImpl.java

@@ -31,10 +31,8 @@ import org.springblade.business.vo.TreeVo;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.tool.utils.ObjectUtil;
-import org.springblade.manager.entity.WbsParam;
-import org.springblade.manager.entity.WbsTree;
-import org.springblade.manager.entity.WbsTreeContract;
-import org.springblade.manager.entity.WbsTreePrivate;
+import org.springblade.manager.entity.*;
+import org.springblade.manager.feign.ImageClassificationConfigClient;
 import org.springblade.manager.feign.WbsTreeContractClient;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -55,6 +53,7 @@ import java.util.stream.Collectors;
 public class ImageClassificationFileServiceImpl extends BaseServiceImpl<ImageClassificationFileMapper, ImageClassificationFile> implements IImageClassificationFileService {
 
     private final WbsTreeContractClient wbsTreeContractClient;
+    private final ImageClassificationConfigClient classificationConfigClient;
     private final JdbcTemplate jdbcTemplate;
 
     @Override
@@ -83,9 +82,8 @@ public class ImageClassificationFileServiceImpl extends BaseServiceImpl<ImageCla
         long current = (page.getCurrent() - 1L) * page.getSize();
         if (StringUtils.isNotEmpty(imageClassificationFile.getWbsIdsStr())) {
             //查询下级节点信息
-            //imageClassificationFile.setWbsIds(JSONArray.parseArray(JSONObject.toJSONString(imageClassificationFile.getWbsIdsStr().split(",")), String.class));
             WbsTreeContract node = wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(Long.valueOf(imageClassificationFile.getWbsIdsStr()));
-            List<WbsTreeContract> wbsTreeContracts = new ArrayList<>();
+            List<WbsTreeContract> wbsTreeContracts;
             if (node.getParentId() == 0) {
                 wbsTreeContracts = wbsTreeContractClient.queryAllChild(imageClassificationFile.getContractId());
             } else {
@@ -97,6 +95,19 @@ public class ImageClassificationFileServiceImpl extends BaseServiceImpl<ImageCla
 
         //获取数据
         List<ImageClassificationFile> fileVOS = this.baseMapper.selectImageClassificationFilePage(current, page.getSize(), imageClassificationFile);
+
+        if (ObjectUtil.isNotEmpty(imageClassificationFile.getClassifyId())) {
+            List<ImageClassificationConfig> imageClassificationConfigs = classificationConfigClient.queryClassificationConfigListByIds(Collections.singletonList(imageClassificationFile.getClassifyId()));
+            if (imageClassificationConfigs.size() > 0) {
+                ImageClassificationConfig imageClassificationConfig = imageClassificationConfigs.get(0);
+                if (imageClassificationConfig.getStorageDirectoryFormat().equals(1)) {
+                    fileVOS.removeIf(f -> ObjectUtil.isEmpty(f.getWbsId()));
+                } else if (imageClassificationConfig.getStorageDirectoryFormat().equals(2)){
+                    fileVOS.removeIf(f -> ObjectUtil.isNotEmpty(f.getWbsId()));
+                }
+            }
+        }
+
         //获取总数据条数和总页数
         int totalRecords = fileVOS.size();
         int totalPages = (int) Math.ceil((double) totalRecords / page.getSize());

+ 6 - 0
blade-service/blade-meter/pom.xml

@@ -69,6 +69,12 @@
             <version>2.9.1.RELEASE</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itextpdf</artifactId>
+            <version>5.5.13</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 </project>

+ 17 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MiddleMeterApplyController.java

@@ -26,6 +26,7 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.meter.dto.MiddleMeterApplyDTO;
+import org.springblade.meter.dto.WbsNodeDTO;
 import org.springblade.meter.vo.*;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
@@ -240,4 +241,20 @@ public class MiddleMeterApplyController extends BladeController {
     public R<List<MeterInventoryVO>> getCurrentNodeAllForm(@RequestBody MiddleMeterApply middleMeterApply) {
         return R.data(middleMeterApplyService.getCurrentNodeAllForm(middleMeterApply));
     }
+
+    /**
+     * 获取当前WBS节点下的资料
+     */
+    @PostMapping("/getWbsNodeInfo")
+    @ApiOperationSupport(order = 13)
+    @ApiOperation(value = "获取WBS节点下,资料信息", notes = "返回WBS节点下,资料信息")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "contractId", value = "合同id", required = true),
+            @ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+            @ApiImplicitParam(name = "nodeId", value = "WBS树节点id", required = true)
+    })
+    public R<IPage<WbsFileVO>> getWbsNodeInfo(@RequestBody WbsNodeDTO dto){
+        IPage<WbsFileVO> iPage = middleMeterApplyService.getWbsNodeInfo(dto);
+        return R.data(iPage);
+    }
 }

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

@@ -43,7 +43,9 @@ import org.springblade.manager.feign.FormulaClient;
 import org.springblade.manager.vo.ReportResult;
 import org.springblade.meter.dto.*;
 import org.springblade.meter.entity.*;
+import org.springblade.meter.mapper.MaterialStartStatementMapper;
 import org.springblade.meter.mapper.MiddleMeterApplyMapper;
+import org.springblade.meter.service.IMaterialStartStatementService;
 import org.springblade.meter.service.impl.*;
 import org.springblade.meter.utils.CollectionUtils;
 import org.springblade.meter.vo.*;
@@ -98,6 +100,8 @@ public class TaskController extends BladeController {
     private final ChangeTokenInventoryServiceImpl changeTokenInventoryService;
     private final ChangeTokenInventoryServiceTaskImpl changeTokenInventoryServiceTask;
 
+    private final IMaterialStartStatementService materialStartStatementService;
+
     // 计量公式入口
     private final FormulaClient formulaClient;
 
@@ -2059,22 +2063,21 @@ public class TaskController extends BladeController {
     // pdf 生成
     private boolean meterPdfInfo(Task task) {
         // 材料生成pdf
-        if(task.getType()==2){
+        if (task.getType() == 2) {
             // 获取填报数据
 
             // 调用公式
-            List<ReportResult> reportResults = formulaClient.formulaExecute3(Long.parseLong(task.getContractId()), Long.parseLong(task.getFormDataId()),1);
+            List<ReportResult> reportResults = formulaClient.formulaExecute3(Long.parseLong(task.getContractId()), Long.parseLong(task.getFormDataId()), 1);
             //生成pdf
-            String fen ="SELECT * from m_wbs_tree_private WHERE project_id='"+task.getProjectId()+"' and wbs_type=3 and parent_id=(SELECT id from m_wbs_tree_private where project_id='"+task.getProjectId()+"' and is_deleted=0 and type=1 and wbs_type=3 and node_type=31)" +
+            String fen = "SELECT * from m_wbs_tree_private WHERE project_id='" + task.getProjectId() + "' and wbs_type=3 and parent_id=(SELECT id from m_wbs_tree_private where project_id='" + task.getProjectId() + "' and is_deleted=0 and type=1 and wbs_type=3 and node_type=31)" +
                     "AND type = 2 AND status = 1 and is_deleted= 0 ORDER BY sort";
-            WbsTreePrivate wbsTreePrivate = jdbcTemplate.query(fen, new BeanPropertyRowMapper<>(WbsTreePrivate.class)).stream().findAny().orElse(null);;
-
+            WbsTreePrivate wbsTreePrivate = jdbcTemplate.query(fen, new BeanPropertyRowMapper<>(WbsTreePrivate.class)).stream().findAny().orElse(null);
+            ;
 
 
         }
 
 
-
         return true;
     }
 
@@ -2442,112 +2445,127 @@ public class TaskController extends BladeController {
     }
 
 
-
-
-    @GetMapping("/meterPdfInfo22")
+    @GetMapping("/meterPdfInfo")
     @ApiOperationSupport(order = 20)
     @ApiOperation(value = "计量生成Pdf", notes = "计量生成Pdf")
-    public R meterPdfInfo22(@RequestParam String  ContractId,@RequestParam String FormDataId,@RequestParam Integer type){
+    public R meterPdfInfo(@RequestParam String ContractId, @RequestParam String FormDataId, @RequestParam Integer type) {
         String file_path = CollectionUtils.getSysLocalFileUrl();
+        String fileUrl = "";
+        Long sid = 0l;
+        MaterialStartStatement materialS = materialStartStatementService.getBaseMapper().selectOne(Wrappers.<MaterialStartStatement>lambdaQuery().eq(MaterialStartStatement::getContractId, ContractId).eq(MaterialStartStatement::getMeterPeriodId, FormDataId).eq(MaterialStartStatement::getType, 1));
+        if (materialS == null || Func.isNull(materialS)) {
+            MeterPeriod me = periodService.getById(FormDataId);
+            MaterialStartStatement data = new MaterialStartStatement();
+            data.setMeterPeriodId(Func.toLong(FormDataId));
+            data.setPrintDate(me.getFormPrintDate());
+            data.setRepaymentCause("材料预付款");
+            data.setStatementName("材料预付款--" + me.getPeriodName());
+            materialStartStatementService.addOrUpdate(data);
+            sid = data.getId();
+        } else {
+            sid = materialS.getId();
+        }
+        List<ReportResult> sul = new ArrayList<>();
         // 材料生成pdf
-        if(type==2){
-            // 获取填报数据
-            String sql = "SELECT * FROM s_material_start_statement where contract_id="+ContractId+" and type=1 and meter_period_id="+FormDataId+"";
-            Map<String, Object> dataInfo = jdbcTemplate.queryForMap(sql);
-            Long sid = Func.toLong(dataInfo.get("id"));
-            // 调用公式
-            List<ReportResult> sul = formulaClient.formulaExecute3(Long.parseLong(ContractId), sid,1);
-            if(sul!=null && sul.size()>=1){
-                for(ReportResult data:sul){
-                    Long excelId = data.getExcelId();
-                    String exSql = "SELECT * from m_excel_tab where id="+excelId+"";
-                    Map<String, Object> exMap = jdbcTemplate.queryForMap(exSql);
-                    if (exMap == null) {
-                        return R.fail("未获取到该表单的信息");
-                    }
-                    if (exMap.get("file_url") == null) {
-                        return R.fail("htmlUrl is null");
-                    }
-                    String pkeyId=sid+""+excelId;
-                    String pdfPath = file_path + "/pdf//" + pkeyId + ".pdf";
-                    String excelPath = file_path + "/pdf//" + pkeyId + ".xlsx";
 
-                    String excelUrl = exMap.get("file_url")+"";
+        sul = formulaClient.formulaExecute3(Long.parseLong(ContractId), sid, type);
+        // 获取填报数据
+        List<String> dataListPdf = new ArrayList<>();
+
+        if (sul != null && sul.size() >= 1) {
+            for (ReportResult data : sul) {
+                Long excelId = data.getExcelId();
+                String exSql = "SELECT * from m_excel_tab where id=" + excelId + "";
+                Map<String, Object> exMap = jdbcTemplate.queryForMap(exSql);
+                if (exMap == null) {
+                    return R.fail("未获取到该表单的信息");
+                }
+                if (exMap.get("file_url") == null) {
+                    return R.fail("htmlUrl is null");
+                }
+                String pkeyId = sid + "" + excelId;
+                String pdfPath = file_path + "/pdf//" + pkeyId + ".pdf";
+                String excelPath = file_path + "/pdf//" + pkeyId + ".xlsx";
 
-                    File tabPdf = null;
-                    try {
-                        tabPdf = ResourceUtil.getFile(pdfPath);
-                    } catch (FileNotFoundException e) {
-                        throw new RuntimeException(e);
-                    }
-                    if (tabPdf.exists()) {
-                        tabPdf.delete();
-                    }
+                String excelUrl = exMap.get("file_url") + "";
 
-                    List<Map<String, Object>> data1 = data.getData();
-                    //获取excel流 和 html流
-                    try {
-                        InputStream exceInp = CommonUtil.getOSSInputStream(excelUrl);
-                        Workbook workbook = null;
-                        int index = excelUrl.lastIndexOf(".");
-                        String suffix = excelUrl.substring(index).toLowerCase();
-
-                        if (".xls".equals(suffix)) {
-                            workbook = new XSSFWorkbook(exceInp);
-                        } else if (".xlsx".equals(suffix)) {
-                            workbook = new XSSFWorkbook(exceInp);
-                        }
-                        //获取工作表
-                        Sheet sheet = workbook.getSheetAt(0);
-                        sheet.setForceFormulaRecalculation(true);
-
-                        // 写入数据
-                        List<Map<String, Object>> dataData = data.getData();
-                        if(dataData!=null && dataData.size()>=1){
-                            for(Map<String, Object> dama:dataData){
-
-                                // 循环Key
-                                for(String keys:dama.keySet()){
-                                    int y1 = Func.toInt(keys.split("_")[0]);
-                                    int x1 = Func.toInt(keys.split("_")[1]);
-                                    Row row = sheet.getRow(y1 - 1);
-                                    if (row != null) {
-                                        Cell cell = row.getCell(x1 - 1);
-                                        String dataval = dama.get(keys)+"";
-                                        if(dataval.indexOf("第")>=0 && dataval.indexOf("次支付")>=0){
-                                            String datare = dataval.replace("第","").replace("次交付","");
-                                            dataval = datare.replace("次支付","");
-                                        }
-                                        cell.setCellValue(dataval);
+                File tabPdf = null;
+                try {
+                    tabPdf = ResourceUtil.getFile(pdfPath);
+                } catch (FileNotFoundException e) {
+                    throw new RuntimeException(e);
+                }
+                if (tabPdf.exists()) {
+                    tabPdf.delete();
+                }
+
+
+                //获取excel流 和 html流
+                try {
+                    InputStream exceInp = CommonUtil.getOSSInputStream(excelUrl);
+                    Workbook workbook = null;
+                    int index = excelUrl.lastIndexOf(".");
+                    String suffix = excelUrl.substring(index).toLowerCase();
+
+                    if (".xls".equals(suffix)) {
+                        workbook = new XSSFWorkbook(exceInp);
+                    } else if (".xlsx".equals(suffix)) {
+                        workbook = new XSSFWorkbook(exceInp);
+                    }
+                    //获取工作表
+                    Sheet sheet = workbook.getSheetAt(0);
+                    sheet.setForceFormulaRecalculation(true);
+
+                    // 写入数据
+                    List<Map<String, Object>> dataData = data.getData();
+                    if (dataData != null && dataData.size() >= 1) {
+                        for (Map<String, Object> dama : dataData) {
+
+                            // 循环Key
+                            for (String keys : dama.keySet()) {
+                                int y1 = Func.toInt(keys.split("_")[0]);
+                                int x1 = Func.toInt(keys.split("_")[1]);
+                                Row row = sheet.getRow(y1 - 1);
+                                if (row != null) {
+                                    Cell cell = row.getCell(x1 - 1);
+                                    String dataval = dama.get(keys) + "";
+                                    if (dataval.indexOf("第") >= 0 && dataval.indexOf("次支付") >= 0) {
+                                        String datare = dataval.replace("第", "").replace("次交付", "");
+                                        dataval = datare.replace("次支付", "");
                                     }
+                                    cell.setCellValue(dataval);
                                 }
                             }
                         }
-
-                        //输出流
-                        FileOutputStream outputStream = new FileOutputStream(excelPath);
-                        workbook.write(outputStream);
-
-                        CollectionUtils.excelToPdf(excelPath, pdfPath);
-                        BladeFile bladeFile = newIOSSClient.uploadFile(pkeyId + ".pdf", pdfPath);
-
-                        /*UpdateWrapper<WbsTreeContract> updateWrapper = new UpdateWrapper<>();
-                        updateWrapper.in("p_key_id", pkeyId + "");
-                        updateWrapper.set("pdf_url", fileUrl);
-                        updateWrapper.set("real_fill_rate", realFillRate);
-                        wbsTreeContractService.update(updateWrapper);*/
-
-                        //关闭流
-                        IoUtil.closeQuietly(outputStream);
-                        IoUtil.closeQuietly(exceInp);
-                    } catch (Exception e) {
-                        throw new RuntimeException(e);
                     }
+
+                    //输出流
+                    FileOutputStream outputStream = new FileOutputStream(excelPath);
+                    workbook.write(outputStream);
+                    CollectionUtils.excelToPdf(excelPath, pdfPath);
+                    dataListPdf.add(pdfPath);
+                    //关闭流
+                    IoUtil.closeQuietly(outputStream);
+                    IoUtil.closeQuietly(exceInp);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
                 }
             }
         }
 
-        return R.success("1234");
+        Long dataId = SnowFlakeUtil.getId();
+        String lasPdf = file_path + "/pdf//" + dataId + "_last.pdf";
+
+        if (dataListPdf.size() > 0) {
+            CollectionUtils.mergePdfPublicMethods(dataListPdf, lasPdf);
+            BladeFile bladeFile2 = newIOSSClient.uploadFile(dataId + "_last.pdf", lasPdf);
+            fileUrl = bladeFile2.getLink();
+        }
+
+        String upSql = "update s_material_start_statement set raw_url='" + fileUrl + "' where contract_id=" + ContractId + " and type=1 and meter_period_id=" + FormDataId + "";
+        jdbcTemplate.execute(upSql);
+
+        return R.success(fileUrl);
     }
 
 }

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

@@ -22,6 +22,7 @@
         <result column="repayment_cause" property="repaymentCause"/>
         <result column="calculate_date" property="calculateDate"/>
         <result column="sort" property="sort"/>
+        <result column="raw_url" property="rawUrl"/>
     </resultMap>
     <select id="page2" resultType="org.springblade.meter.entity.MaterialStartStatement">
         select *

+ 15 - 2
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.java

@@ -19,6 +19,8 @@ package org.springblade.meter.mapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.WbsTreeContract;
+import org.springblade.meter.dto.WbsNodeDTO;
 import org.springblade.meter.entity.ChangeTokenForm;
 import org.springblade.meter.entity.ChangeTokenMeter;
 import org.springblade.meter.entity.MeterTreeContract;
@@ -28,6 +30,7 @@ import org.springblade.meter.vo.*;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -69,11 +72,13 @@ public interface MiddleMeterApplyMapper extends BaseMapper<MiddleMeterApply> {
 
     BigDecimal getCurrentMeterMoney(@Param("contractId") Long contractId,@Param("contractPeriodId") Long contractPeriodId);
 
-    Integer getAllAPPly(@Param("contractId") Long contractId,@Param("contractPeriodId") Long contractPeriodId);
+    List<MiddleMeterApply> getAllAPPly(@Param("contractId") Long contractId,@Param("contractPeriodId") Long contractPeriodId);
 
     List<NodeSortVO> getLowestNodeBySort(@Param("contractId") Long contractId,@Param("nodeId") Long nodeId);
 
-    List<NodeSortVO> getAllNode(@Param("contractId") Long contractId);
+    List<WbsNodeVO> getAllNode(@Param("contractId") Long contractId);
+
+    List<WbsNodeVO> getAllNode2(@Param("dto") WbsNodeDTO dto);
 
     Set<ChangeTokenForm> getNodeToken(@Param("contractId") Long contractId,@Param("ids") List<Long> ids,@Param("nodeId") Long nodeId,@Param("bDate") String businessDate);
 
@@ -82,4 +87,12 @@ public interface MiddleMeterApplyMapper extends BaseMapper<MiddleMeterApply> {
     List<MiddleMeterApplyVO2> getAllAPPlyAndForm(@Param("ids") Set<Long> middleIds);
 
     void batchUpdateMiddle(@Param("list") List<MiddleMeterApplyVO2> vo2s);
+
+    List<WbsNodeVO> getAllChildNode(@Param("dto") WbsNodeDTO dto);
+
+    List<WbsFileVO> getNodeData(@Param("ids") List<Long> ids);
+
+    List<WbsTreeContract> getAllAncestors(@Param("ids") HashSet<Long> set, @Param("contractId") Long contractId);
+
+    WbsNodeVO getNodeInfo(@Param("pId") Long pId);
 }

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

@@ -170,15 +170,8 @@
         from s_middle_meter_apply
         where contract_id = #{contractId} and is_deleted = 0 and contract_period_id = #{contractPeriodId} and approve_status != 3
     </select>
-    <select id="getAllAPPly" resultType="java.lang.Integer">
-        select count(1)
-        from s_middle_meter_apply
-        where contract_id = #{contractId} and contract_period_id = #{contractPeriodId}
-    </select>
 
-    <select id="getAllNode" resultType="org.springblade.meter.vo.NodeSortVO">
-        SELECT id,parent_id from m_wbs_tree_private  WHERE project_id  = 1578599210897772545 and is_deleted = 0 and type != 10 and wbs_type = 1
-    </select>
+
     <select id="getLowestNodeBySort" resultType="org.springblade.meter.vo.NodeSortVO">
         SELECT id,parent_id
         FROM s_meter_tree_contract mtc
@@ -223,6 +216,75 @@
     <select id="getContractInfo" resultType="org.springblade.manager.entity.ContractInfo">
         select * from m_contract_info where id = #{contractId}
     </select>
+    <select id="getAllAPPly" resultType="org.springblade.meter.entity.MiddleMeterApply">
+        select id,  SUBSTRING_INDEX(meter_number,"-",-1) as approveStatus
+        from s_middle_meter_apply
+        where contract_id = #{contractId} and contract_period_id = #{contractPeriodId} and is_deleted = 0
+    </select>
+    <select id="getAllNode" resultType="org.springblade.meter.vo.WbsNodeVO">
+        SELECT id,parent_id,p_key_id as pId,ancestors,
+               (SELECT COUNT(1) from u_information_query uiq WHERE uiq.wbs_id = wtc.p_key_id) as isData
+        from m_wbs_tree_contract wtc
+        WHERE project_id  = 1630011899725201410 and contract_id = #{contractId} and is_deleted = 0 and type = 1
+          and (id = 1538783484087627777 or FIND_IN_SET(1538783484087627777, ancestors))
+        group by id
+        order by sort,create_time
+    </select>
+    <select id="getAllChildNode" resultType="org.springblade.meter.vo.WbsNodeVO">
+        SELECT id,parent_id,p_key_id as pId,
+               (SELECT COUNT(1) from u_information_query uiq WHERE uiq.wbs_id = wtc.p_key_id) as isData
+        from m_wbs_tree_contract wtc
+        WHERE project_id  = #{dto.projectId} and contract_id = #{dto.contractId} and is_deleted = 0 and type = 1
+          and (id = #{dto.nodeId} or FIND_IN_SET(#{dto.nodeId}, ancestors))
+        group by id
+        order by sort,create_time
+    </select>
+    <select id="getNodeData" resultType="org.springblade.meter.vo.WbsFileVO">
+        select name as dataName,pdf_url as pdfUrl,e_visa_pdf_url as eVisaPdfUrl,
+               (select node_type from m_wbs_tree_contract wtc where wtc.p_key_id = uiq.wbs_id) as nodeType,
+               (select ancestors from m_wbs_tree_contract wtc where wtc.p_key_id = uiq.wbs_id) as ancestors,
+               (select node_name from m_wbs_tree_contract wtc where wtc.p_key_id = uiq.wbs_id) as nodeName,
+               (select parent_id from m_wbs_tree_contract wtc where wtc.p_key_id = uiq.wbs_id) as parentId,
+               (CASE when status = 0 then '未上报' when status = 1 then '待审批' when status = 2 then '已审批'
+                    else '已废除' end) as appStatusName
+        from u_information_query uiq
+        where id in
+        (
+            select MAX(id) from u_information_query where  is_deleted = 0 and wbs_id in
+            <foreach collection="ids" item="id" open="(" close=")" separator=",">
+                    #{id}
+            </foreach>
+            group by wbs_id
+            order by create_time desc
+        )
+        order by FIELD(wbs_id,
+            <foreach collection="ids" item="id" separator=",">
+                #{id}
+            </foreach>
+        )
+
+    </select>
+    <select id="getAllAncestors" resultType="org.springblade.manager.entity.WbsTreeContract">
+        select * from m_wbs_tree_contract where contract_id = #{contractId} and is_deleted = 0
+        and id in
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+        group by id
+    </select>
+    <select id="getNodeInfo" resultType="org.springblade.meter.vo.WbsNodeVO">
+        SELECT id,parent_id,p_key_id as pId,
+               (SELECT COUNT(1) from u_information_query uiq WHERE uiq.wbs_id = wtc.p_key_id) as isData
+        from m_wbs_tree_contract wtc where wtc.p_key_id = #{pId}
+    </select>
+    <select id="getAllNode2" resultType="org.springblade.meter.vo.WbsNodeVO">
+        SELECT id,parent_id,p_key_id as pId,ancestors,node_name,
+               (SELECT COUNT(1) from u_information_query uiq WHERE uiq.wbs_id = wtc.p_key_id) as isData
+        from m_wbs_tree_contract wtc
+        WHERE project_id  = #{dto.projectId} and contract_id = #{dto.contractId} and is_deleted = 0 and type = 1
+        group by id
+        order by sort,create_time
+    </select>
 
 
 </mapper>

+ 3 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/IMiddleMeterApplyService.java

@@ -19,6 +19,7 @@ package org.springblade.meter.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.core.mp.support.Query;
 import org.springblade.meter.dto.MiddleMeterApplyDTO;
+import org.springblade.meter.dto.WbsNodeDTO;
 import org.springblade.meter.entity.MiddleMeterApply;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.meter.vo.*;
@@ -67,4 +68,6 @@ public interface IMiddleMeterApplyService extends BaseService<MiddleMeterApply>
     String test();
 
     List<MeterInventoryVO> getCurrentNodeAllForm(MiddleMeterApply middleMeterApply);
+
+    IPage<WbsFileVO> getWbsNodeInfo(WbsNodeDTO dto);
 }

+ 188 - 12
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MiddleMeterApplyServiceImpl.java

@@ -28,7 +28,9 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.meter.dto.MiddleMeterApplyDTO;
+import org.springblade.meter.dto.WbsNodeDTO;
 import org.springblade.meter.entity.*;
 import org.springblade.meter.mapper.MiddleMeterApplyMapper;
 import org.springblade.meter.service.*;
@@ -44,10 +46,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -129,7 +128,7 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
             //设置其他计量总数
             vo.setOtherMeterTotal(vo.getAllMeterTotal().subtract(vo.getCurrentMeterTotal()));
             //设置施工图数量是否大于合同数量
-            vo.setIsBuildThanContract(vo.getChangeTotal().compareTo(vo.getContainChangeTotal()) == 1?1:0);
+            vo.setIsBuildThanContract(vo.getChangeTotal().compareTo(vo.getContractChangeAllTotal()) == 1?1:0);
         }
         return vos;
     }
@@ -154,6 +153,8 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
         if (dto.getBusinessDate() == null){
             throw new ServiceException("新增失败,请填写业务日期");
         }
+
+        dto.setMeterNumber(this.getMeterNumber(dto));
         //保存中间计量申请,设置计量金额为0,如果存在计量清单,则统计计量清单总金额
         MiddleMeterApply apply = new MiddleMeterApply();
         Long id = SnowFlakeUtil.getId();
@@ -503,8 +504,28 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
         }
         str.append(contractMeterPeriod.getPeriodNumber()+"-");
         //获取流水号:当前合同段存在的当前计量期的申请单总数+1
-        Integer count = baseMapper.getAllAPPly(apply.getContractId(),apply.getContractPeriodId());
-        str.append(count+1);
+        List<MiddleMeterApply> allAPPly = baseMapper.getAllAPPly(apply.getContractId(), apply.getContractPeriodId());
+        if (allAPPly.size() == 0){
+            str.append(1);
+        }else {
+            List<Integer> list = allAPPly.stream().filter(l -> l.getApproveStatus() != null).map(l -> l.getApproveStatus()).sorted().collect(Collectors.toList());
+            if (list.size() == 0 || list.get(0) != 1){
+                str.append(1);
+            }else {
+                for (int i = 0; i < list.size() - 1; i++) {
+                    Integer num = list.get(i);
+                    if (num == list.get(i+1)){
+                        throw new ServiceException("计量期期号出现相同,请联系管理员");
+                    }
+                    if (++num != list.get(i+1)){
+                        str.append(num);
+                        return str.toString();
+                    }
+                }
+                str.append(list.size()+1);
+            }
+
+        }
         return str.toString();
     }
 
@@ -560,24 +581,59 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
 
     @Override
     public String test() {
-        Long contractId = 1612329251049537537L;
-        //获取当前合同下所以计量单元
-        List<NodeSortVO> vos = baseMapper.getAllNode(contractId);
+        Long contractId = 1632993681739259906L;
+        Long pId = 1644218999308812288L;
+        //获取点击的WBS节点
+        WbsNodeVO masterId = baseMapper.getNodeInfo(pId);
+        //获取当前合同下所有节点
+        List<WbsNodeVO> vos = baseMapper.getAllNode(contractId);
+//        Map<Long, WbsNodeVO> map = vos.stream().collect(Collectors.toMap(l -> l.getId(), l -> l));
+        Map<Long, List<WbsNodeVO>> map = vos.stream().collect(Collectors.groupingBy(WbsNodeVO::getParentId));
+        //获取点击节点的所有子节点
+        List<WbsNodeVO> list7 = new ArrayList<>();
+        list7.add(masterId);
+        this.getAllChild(masterId,map,list7);
         //转换为树
         Long l1 = System.currentTimeMillis();
-        List<NodeSortVO> list = ForestNodeMerger.merge(vos);
+        List<WbsNodeVO> list = ForestNodeMerger.merge(list7);
         Long l2 = System.currentTimeMillis();
         System.out.println("----------------------");
         System.out.println(l2-l1);
+        List<WbsNodeVO> list2 = new ArrayList<>();
+        for (WbsNodeVO vo : list) {
+            if (vo.getId() == 1538783484087627777L){
+                list2.add(vo);
+                break;
+            }
+        }
         //递归循环树,存在子节点就深入,不存在子节点就add后返回上一层
         List<Long> ids = new ArrayList<>();
         Long l3 = System.currentTimeMillis();
-        gatherSortNode(list,ids);
+        gatherSortNode2(list2, ids);
         Long l4 = System.currentTimeMillis();
+        //构造数据
         System.out.println("---------------");
         System.out.println(l4-l3);
         return "";
     }
+    //传入一个节点,重新计算祖级节点
+    void resetAncestor(WbsNodeVO vo, Map<Long, WbsNodeVO> map ,StringBuilder str){
+        if (!vo.getAncestors().contains(vo.getParentId()+"")){
+            resetAncestor(map.get(vo.getParentId()),map,str);
+        }else {
+            str.append(vo.getAncestors()+","+vo.getId());
+        }
+    }
+    //根据首节点,组建所有子节点
+    void getAllChild(WbsNodeVO vo,Map<Long, List<WbsNodeVO>> map,List<WbsNodeVO> list){
+        List<WbsNodeVO> vos = map.get(vo.getId());
+        if (vos != null && vos.size() != 0){
+            list.addAll(vos);
+            for (WbsNodeVO nodeVO : vos) {
+                getAllChild(nodeVO,map,list);
+            }
+        }
+    }
 
     /**
      * 获取当前节点下,当期未被计量的所有清单
@@ -596,6 +652,115 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
         return voList;
     }
 
+    /**
+     * 获取当前WBS节点下的资料
+     */
+    @Override
+    public  IPage<WbsFileVO> getWbsNodeInfo(WbsNodeDTO dto) {
+        if (dto.getCurrent() == null || dto.getSize() == null){
+            throw new ServiceException("请传入分页信息");
+        }
+        if (dto.getContractIdRelation() != null){
+            dto.setContractId(dto.getContractIdRelation());
+        }
+        //获取点击的WBS节点
+        WbsNodeVO masterId = baseMapper.getNodeInfo(dto.getNodeId());
+        Integer current = dto.getCurrent();
+        Integer size = dto.getSize();
+        Integer start = (current-1) * size;
+        Integer end = current * size;
+        //获取当前合同节点下所有节点
+//        List<WbsNodeVO> vos = baseMapper.getAllChildNode(dto);
+        //获取当前合同下所有节点
+        List<WbsNodeVO> vos = baseMapper.getAllNode2(dto);
+        Map<Long, WbsNodeVO> map2 = vos.stream().collect(Collectors.toMap(l -> l.getId(), l -> l));
+        Map<Long, List<WbsNodeVO>> map3 = vos.stream().collect(Collectors.groupingBy(WbsNodeVO::getParentId));
+        //获取点击节点的所有子节点
+        List<WbsNodeVO> list7 = new ArrayList<>();
+        list7.add(masterId);
+        this.getAllChild(masterId,map3,list7);
+
+        List<WbsNodeVO> list = ForestNodeMerger.merge(list7);
+//        List<WbsNodeVO> list2 = new ArrayList<>();
+//        for (WbsNodeVO vo : list) {
+//            if (vo.getId().equals(dto.getNodeId())){
+//                list2.add(vo);
+//                break;
+//            }
+//        }
+        if (list.size() == 0){
+            throw new ServiceException("获取首节点错误");
+        }
+        List<Long> ids = new ArrayList<>();
+        gatherSortNode2(list, ids);
+        IPage<WbsFileVO> iPage = new Page<WbsFileVO>(current,size);
+        iPage.setTotal(ids.size());
+        if (ids.size() == 0){
+            iPage.setRecords(null);
+            iPage.setPages(1);
+        }else {
+            if (ids.size() <= size){
+                iPage.setPages(1);
+            }else {
+                iPage.setPages((int) Math.ceil(new Double(ids.size()) / new Double(size)));
+                if (ids.size() < end) {
+                    ids = ids.subList(start,ids.size());
+                }else {
+                    ids = ids.subList(start,end);
+                }
+            }
+        }
+        //查询节点资料
+        List<WbsFileVO> voList = new ArrayList<>();
+        if (ids.size() != 0) {
+            voList = baseMapper.getNodeData(ids);
+            //节点划分
+            if (voList.size() != 0) {
+                StringBuilder str = new StringBuilder();
+                for (WbsFileVO vo : voList) {
+                    str.append(vo.getAncestors() + ",");
+                }
+                str.deleteCharAt(str.length() - 1);
+                List<Long> longs = Func.toLongList(str.toString());
+                HashSet<Long> set = new HashSet<>(longs);
+                List<WbsTreeContract> infoList = baseMapper.getAllAncestors(set, dto.getContractId());
+                if (infoList.size() == 0) {
+                    throw new ServiceException("未获取到节点划分信息");
+                }
+                Map<Long, WbsTreeContract> map = infoList.stream().collect(Collectors.toMap(l -> l.getId(), l -> l));
+                for (WbsFileVO vo : voList) {
+                    List<Long> longList = Func.toLongList(vo.getAncestors());
+                    Collections.reverse(longList);
+                    StringBuilder str2 = new StringBuilder();
+                    if (vo.getNodeType() == 6) {
+                        for (Long aLong : longList) {
+                            WbsTreeContract info = map.get(aLong);
+                            if (info == null){
+                                WbsNodeVO nodeVO = map2.get(vo.getParentId());
+                                str2.append(nodeVO.getNodeName() + "/");
+                                nodeVO = map2.get(nodeVO.getParentId());
+                                str2.append(nodeVO.getNodeName() + "/");
+                                break;
+                            }else {
+                                str2.append(info.getNodeName() + "/");
+                                if (info.getNodeType() == 4) {
+                                    break;
+                                }
+                            }
+
+                        }
+                        str2.deleteCharAt(str2.length() - 1);
+                    } else {
+                        str2.append(vo.getNodeName());
+                    }
+                    vo.setPartName(str2.toString());
+                }
+            }
+        }
+        iPage.setRecords(voList);
+        return iPage;
+    }
+
     //递归方法
     private void gatherSortNode(List<NodeSortVO> list,List<Long> ids){
         for (NodeSortVO vo : list) {
@@ -607,4 +772,15 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
             }
         }
     }
+    //质检WBS树专用,可能会设置条件,不重载
+    private void gatherSortNode2(List<WbsNodeVO> list,List<Long> ids){
+        for (WbsNodeVO vo : list) {
+            if (vo.getChildren().size() == 0 && vo.getIsData() > 0){
+                ids.add(vo.getPId());
+                continue;
+            }else {
+                gatherSortNode2(vo.getChildren(), ids);
+            }
+        }
+    }
 }

+ 55 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/utils/CollectionUtils.java

@@ -1,16 +1,21 @@
 package org.springblade.meter.utils;
 
 import com.aspose.cells.SaveFormat;
+import com.itextpdf.text.Document;
+import com.itextpdf.text.pdf.PdfCopy;
+import com.itextpdf.text.pdf.PdfReader;
 import org.apache.poi.ss.usermodel.PrintSetup;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.WorkbookFactory;
 import org.springblade.common.constant.CommonConstant;
+import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SystemUtils;
 import org.springblade.core.tool.utils.IoUtil;
 import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.system.cache.ParamCache;
 
 import java.io.*;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
@@ -100,4 +105,54 @@ public class CollectionUtils {
             }
         }
     }
+
+    /**
+     * 合并方法
+     */
+    public static void mergePdfPublicMethods(List<String> urlList, String localImgUrl) {
+        PdfReader reader = null;
+
+        Document doc = new Document();
+        PdfCopy pdfCopy = null;
+        try {
+            pdfCopy = new PdfCopy(doc, new FileOutputStream(localImgUrl));
+            int pageCount;
+            doc.open();
+
+            for (String urlStr : urlList) {
+                try {
+                    //获取OSS文件输入流
+                    if(urlStr.indexOf("http")>=0){
+                        reader = new PdfReader(Objects.requireNonNull(CommonUtil.getOSSInputStream(urlStr)));
+                    }else{
+                        reader = new PdfReader(Objects.requireNonNull(new FileInputStream(new File(urlStr))));
+                    }
+
+
+                    pageCount = reader.getNumberOfPages();
+
+                    for (int i = 0; i < pageCount; ++i) {
+                        int is = i + 1;
+                        pdfCopy.addPage(pdfCopy.getImportedPage(reader, is));
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                } finally {
+                    if (reader != null) {
+                        reader.close();
+                    }
+                }
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (pdfCopy != null) {
+                pdfCopy.flush();
+                pdfCopy.close();
+            }
+            doc.close();
+        }
+    }
+
 }

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

@@ -712,11 +712,23 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
             throw new ServiceException("Param error,tableOwner cannot be empty");
         }
         if (cn.hutool.core.util.ObjectUtil.isNotEmpty(contractId)) {
-            ContractInfo contractInfo = jdbcTemplate.query("SELECT contract_name,contract_type FROM m_contract_info WHERE id = " + contractId, new BeanPropertyRowMapper<>(ContractInfo.class)).stream().findAny().orElse(null);
+            ContractInfo contractInfo = jdbcTemplate.query("SELECT contract_name,contract_type FROM m_contract_info WHERE id = " + contractId,
+                    new BeanPropertyRowMapper<>(ContractInfo.class)).stream().findAny().orElse(null);
             if (contractInfo != null) {
                 /* =========================== 施工合同段 =========================== */
                 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_concrete,major_data_type,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 and b.status = 1 AND b.contract_id = " + contractId + " AND b.is_deleted = 0 ) AS hasChildren from m_wbs_tree_contract a where a.node_type != 111 and a.type = 1 and a.status = 1 and a.is_deleted = 0 and parent_id = " + (org.apache.commons.lang.StringUtils.isNotEmpty(id) ? id : 0) + " and contract_id = " + contractId + " ORDER BY a.sort,title,a.create_time";
+                    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_concrete,major_data_type,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" +
+                            " AND b.status = 1 AND b.contract_id = " + contractId + " AND b.is_deleted = 0 ) AS hasChildren," +
+                            "(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" +
+                            " AND b.status = 1 AND b.contract_id = " + contractId + " AND b.is_deleted = 0 AND is_custom = 1) AS isCustomChild " +
+                            "FROM m_wbs_tree_contract a WHERE a.node_type != 111 AND a.type = 1 AND a.status = 1 AND a.is_deleted = 0 " +
+                            "AND parent_id = " + (StringUtils.isNotEmpty(id) ? id : 0) + " AND contract_id = " + contractId + " " +
+                            "ORDER BY a.sort,title,a.create_time";
                     List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
                     if (lazyNodes.size() > 0) {
                         /*获取当前合同段节点本地缓存信息*/
@@ -815,7 +827,8 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                         contractIds.add(contractIdRelation);
                     } else {
                         //根节点时默认加载所有施工合同段的树
-                        List<ContractRelationJlyz> query = jdbcTemplate.query("SELECT contract_id_sg FROM m_contract_relation_jlyz WHERE contract_id_jlyz = " + contractId, new BeanPropertyRowMapper<>(ContractRelationJlyz.class));
+                        List<ContractRelationJlyz> query = jdbcTemplate.query("SELECT contract_id_sg FROM m_contract_relation_jlyz WHERE contract_id_jlyz = " + contractId,
+                                new BeanPropertyRowMapper<>(ContractRelationJlyz.class));
                         if (query.size() > 0) {
                             contractIds = query.stream().map(ContractRelationJlyz::getContractIdSg).map(String::valueOf).collect(Collectors.toList());
                         }
@@ -824,9 +837,22 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                         return null;
                     }
                     for (String sgContractId : contractIds) {
-                        ContractInfo sgContractInfo = jdbcTemplate.query("select contract_name from m_contract_info where id = " + sgContractId, new BeanPropertyRowMapper<>(ContractInfo.class)).stream().findAny().orElse(null);
+                        ContractInfo sgContractInfo = jdbcTemplate.query("select contract_name from m_contract_info where id = " + sgContractId,
+                                new BeanPropertyRowMapper<>(ContractInfo.class)).stream().findAny().orElse(null);
                         if (sgContractInfo != null) {
-                            List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query("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,major_data_type,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 and b.status = 1 AND b.contract_id = " + sgContractId + " AND b.is_deleted = 0 ) AS hasChildren from m_wbs_tree_contract a where a.node_type != 111 and a.type = 1 and a.status = 1 and a.is_deleted = 0 and parent_id = " + (org.apache.commons.lang.StringUtils.isNotEmpty(id) ? id : 0) + " and contract_id = " + sgContractId + " ORDER BY a.sort,title,a.create_time", new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
+                            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_concrete,major_data_type,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" +
+                                    " AND b.status = 1 AND b.contract_id = " + sgContractId + " AND b.is_deleted = 0 ) AS hasChildren," +
+                                    "(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" +
+                                    " AND b.status = 1 AND b.contract_id = " + sgContractId + " AND b.is_deleted = 0 AND is_custom = 1) AS isCustomChild " +
+                                    "FROM m_wbs_tree_contract a WHERE a.node_type != 111 AND a.type = 1 AND a.status = 1 AND a.is_deleted = 0 " +
+                                    "AND parent_id = " + (StringUtils.isNotEmpty(id) ? id : 0) + " AND contract_id = " + sgContractId + " " +
+                                    "ORDER BY a.sort,title,a.create_time";
+                            List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
                             if (lazyNodes.size() > 0) {
                                 List<WbsTreeContractLazyVO> nodesAll = this.getNodeAll(sgContractId);
                                 List<WbsTreeContractLazyVO> distinctNodesAll = nodesAll.stream()
@@ -976,11 +1002,22 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
 
     @Override
     public List<WbsTreeContractLazyVO> queryContractWbsTreeByFirstInfo(String parentId, String contractId, String contractIdRelation) {
-        ContractInfo contractInfo = jdbcTemplate.query("SELECT contract_name,contract_type FROM m_contract_info WHERE id = " + contractId, new BeanPropertyRowMapper<>(ContractInfo.class)).stream().findAny().orElse(null);
+        ContractInfo contractInfo = jdbcTemplate.query("SELECT contract_name,contract_type FROM m_contract_info WHERE id = " + contractId,
+                new BeanPropertyRowMapper<>(ContractInfo.class)).stream().findAny().orElse(null);
         if (contractInfo != null) {
             if (new Integer(1).equals(contractInfo.getContractType())) {
                 if (ObjectUtil.isEmpty(parentId)) {
-                    List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query("select 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,major_data_type,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 and b.status = 1 AND b.contract_id = " + contractId + " AND b.is_deleted = 0 ) AS hasChildren from m_wbs_tree_contract a where parent_id = 0 AND contract_id = " + contractId + " ORDER BY a.sort,title,a.create_time", new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
+                    List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query("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,major_data_type,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 " +
+                                    " AND b.status = 1 AND b.contract_id = " + contractId + " AND b.is_deleted = 0 ) AS hasChildren," +
+                                    "(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" +
+                                    " AND b.status = 1 AND b.contract_id = " + contractId + " AND b.is_deleted = 0 AND is_custom = 1) AS isCustomChild " +
+                                    "FROM m_wbs_tree_contract a WHERE parent_id = 0 AND contract_id = " + contractId + " ORDER BY a.sort,title,a.create_time",
+                            new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
                     for (WbsTreeContractLazyVO lazyNode : lazyNodes) {
                         lazyNode.setTitle(contractInfo.getContractName());
                         lazyNode.setType(lazyNode.getNodeType());
@@ -989,7 +1026,8 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                     }
                     return lazyNodes;
                 }
-                List<TreeContractFirst> query = jdbcTemplate.query("SELECT wbs_node_id FROM u_tree_contract_first WHERE is_deleted = 0 AND status = 1 AND contract_id = " + contractId, new BeanPropertyRowMapper<>(TreeContractFirst.class));
+                List<TreeContractFirst> query = jdbcTemplate.query("SELECT wbs_node_id FROM u_tree_contract_first WHERE is_deleted = 0 AND status = 1 " +
+                                "AND contract_id = " + contractId, new BeanPropertyRowMapper<>(TreeContractFirst.class));
                 if (query.size() > 0) {
                     List<WbsTreeContractLazyVO> nodeAll = this.getNodeAll(contractId);
                     List<Long> nodeIds = query.stream().map(TreeContractFirst::getWbsNodeId).collect(Collectors.toList());
@@ -997,7 +1035,17 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                     List<WbsTreeContractLazyVO> collect = firstNodes.stream().filter(f -> f.getParentId().equals(Long.parseLong(parentId))).collect(Collectors.toList());
                     List<Long> pKeyIds = collect.stream().map(WbsTreeContractLazyVO::getPKeyId).collect(Collectors.toList());
                     if (pKeyIds.size() > 0) {
-                        List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query("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,major_data_type,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 and b.status = 1 AND b.contract_id = " + contractId + " AND b.is_deleted = 0 ) AS hasChildren from m_wbs_tree_contract a where p_key_id IN (" + StringUtils.join(pKeyIds, ",") + ") ORDER BY a.sort,title,a.create_time", new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
+                        List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query("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,major_data_type,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 " +
+                                        " AND b.status = 1 AND b.contract_id = " + contractId + " AND b.is_deleted = 0 ) AS hasChildren," +
+                                        "(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" +
+                                        " AND b.status = 1 AND b.contract_id = " + contractId + " AND b.is_deleted = 0 AND is_custom = 1) AS isCustomChild " +
+                                        "FROM m_wbs_tree_contract a WHERE p_key_id IN (" + StringUtils.join(pKeyIds, ",") + ") ORDER BY a.sort,title,a.create_time",
+                                new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
                         if (lazyNodes.size() > 0) {
                             for (WbsTreeContractLazyVO lazyNodeVO : lazyNodes) {
                                 lazyNodeVO.setType(lazyNodeVO.getNodeType());
@@ -1015,7 +1063,8 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                 if (ObjectUtil.isNotEmpty(contractIdRelation) && ObjectUtil.isNotEmpty(parentId)) {
                     contractIds.add(contractIdRelation);
                 } else {
-                    List<ContractRelationJlyz> query = jdbcTemplate.query("SELECT contract_id_sg FROM m_contract_relation_jlyz WHERE contract_id_jlyz = " + contractId, new BeanPropertyRowMapper<>(ContractRelationJlyz.class));
+                    List<ContractRelationJlyz> query = jdbcTemplate.query("SELECT contract_id_sg FROM m_contract_relation_jlyz WHERE contract_id_jlyz = " + contractId,
+                            new BeanPropertyRowMapper<>(ContractRelationJlyz.class));
                     if (query.size() > 0) {
                         contractIds = query.stream().map(ContractRelationJlyz::getContractIdSg).map(String::valueOf).collect(Collectors.toList());
                     }
@@ -1024,10 +1073,12 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                     return null;
                 }
                 for (String sgContractId : contractIds) {
-                    ContractInfo sgContractInfo = jdbcTemplate.query("select contract_name from m_contract_info where id = " + sgContractId, new BeanPropertyRowMapper<>(ContractInfo.class)).stream().findAny().orElse(null);
+                    ContractInfo sgContractInfo = jdbcTemplate.query("select contract_name from m_contract_info where id = " + sgContractId,
+                            new BeanPropertyRowMapper<>(ContractInfo.class)).stream().findAny().orElse(null);
                     if (sgContractInfo != null) {
                         if (ObjectUtil.isNotEmpty(parentId)) {
-                            List<TreeContractFirst> query = jdbcTemplate.query("SELECT wbs_node_id FROM u_tree_contract_first WHERE is_deleted = 0 AND status = 1 AND contract_id = " + sgContractId, new BeanPropertyRowMapper<>(TreeContractFirst.class));
+                            List<TreeContractFirst> query = jdbcTemplate.query("SELECT wbs_node_id FROM u_tree_contract_first WHERE is_deleted = 0 AND status = 1 " +
+                                            "AND contract_id = " + sgContractId, new BeanPropertyRowMapper<>(TreeContractFirst.class));
                             if (query.size() > 0) {
                                 List<WbsTreeContractLazyVO> nodeAll = this.getNodeAll(sgContractId);
                                 List<Long> nodeIds = query.stream().map(TreeContractFirst::getWbsNodeId).collect(Collectors.toList());
@@ -1035,7 +1086,17 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                                 List<WbsTreeContractLazyVO> collect = firstNodes.stream().filter(f -> f.getParentId().equals(Long.parseLong(parentId))).collect(Collectors.toList());
                                 List<Long> pKeyIds = collect.stream().map(WbsTreeContractLazyVO::getPKeyId).collect(Collectors.toList());
                                 if (pKeyIds.size() > 0) {
-                                    List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query("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,major_data_type,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 and b.status = 1 AND b.contract_id = " + sgContractId + " AND b.is_deleted = 0 ) AS hasChildren from m_wbs_tree_contract a where p_key_id IN (" + StringUtils.join(pKeyIds, ",") + ") ORDER BY a.sort,title,a.create_time", new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
+                                    List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query("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,major_data_type," +
+                                            "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 " +
+                                            " AND b.status = 1 AND b.contract_id = " + sgContractId + " AND b.is_deleted = 0 ) AS hasChildren," +
+                                            "(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" +
+                                            " AND b.status = 1 AND b.contract_id = " + sgContractId + " AND b.is_deleted = 0 AND is_custom = 1) AS isCustomChild " +
+                                            "FROM m_wbs_tree_contract a WHERE p_key_id IN (" + StringUtils.join(pKeyIds, ",") + ") " +
+                                            "ORDER BY a.sort,title,a.create_time", new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
                                     if (lazyNodes.size() > 0) {
                                         for (WbsTreeContractLazyVO lazyNodeVO : lazyNodes) {
                                             lazyNodeVO.setType(lazyNodeVO.getNodeType());
@@ -1048,7 +1109,17 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                                 }
                             }
                         } else {
-                            List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query("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,major_data_type,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 and b.status = 1 AND b.contract_id = " + sgContractId + " AND b.is_deleted = 0 ) AS hasChildren from m_wbs_tree_contract a where parent_id = 0 AND contract_id = " + sgContractId + " ORDER BY a.sort,title,a.create_time", new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
+                            List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query("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,major_data_type," +
+                                            "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 " +
+                                            "AND b.status = 1 AND b.contract_id = " + sgContractId + " AND b.is_deleted = 0 ) AS hasChildren," +
+                                            "(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" +
+                                            " AND b.status = 1 AND b.contract_id = " + sgContractId + " AND b.is_deleted = 0 AND is_custom = 1) AS isCustomChild " +
+                                            "FROM m_wbs_tree_contract a WHERE parent_id = 0 AND contract_id = " + sgContractId + " ORDER BY a.sort,title,a.create_time",
+                                    new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
                             for (WbsTreeContractLazyVO lazyNode : lazyNodes) {
                                 lazyNode.setTitle(sgContractInfo.getContractName());
                                 lazyNode.setType(lazyNode.getNodeType());