浏览代码

新增自定义节点相关

Signed-off-by: liuyc <56808083@qq.com>
liuyc 1 年之前
父节点
当前提交
2da199ac8f
共有 22 个文件被更改,包括 722 次插入66 次删除
  1. 29 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialSummaryRecordDTO.java
  2. 32 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialSummaryRecordPageDTO.java
  3. 40 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialSummaryRecord.java
  4. 22 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialSummaryRecordVO.java
  5. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/TrialSummaryReflectionSaveDTO.java
  6. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/TrialSummaryExcelTabReflection.java
  7. 6 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/PrivateTreeVO.java
  8. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SelectedTabVO.java
  9. 9 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateAddVO.java
  10. 143 40
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  11. 0 10
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  12. 276 5
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialSummaryController.java
  13. 7 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSummaryRecordMapper.java
  14. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSummaryRecordMapper.xml
  15. 7 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialSummaryRecordService.java
  16. 14 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSummaryRecordServiceImpl.java
  17. 66 0
      blade-service/blade-business/src/main/java/org/springblade/business/utils/InMemoryMultipartFile.java
  18. 26 0
      blade-service/blade-business/src/main/java/org/springblade/business/utils/PdfGenerator.java
  19. 5 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TrialSummaryClassificationConfigurationController.java
  20. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/ITrialSummaryClassificationConfigurationService.java
  21. 3 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/TrialSummaryClassificationConfigurationServiceImpl.java
  22. 15 4
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

+ 29 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialSummaryRecordDTO.java

@@ -0,0 +1,29 @@
+package org.springblade.business.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TrialSummaryRecordDTO implements Serializable {
+
+    @ApiModelProperty(value = "合同段ID")
+    private Long contractId;
+
+    @ApiModelProperty(value = "汇总类别ID")
+    private Long classId;
+
+    @ApiModelProperty(value = "检测类型")
+    private Integer detectionType;
+
+    @ApiModelProperty(value = "单位类型")
+    private Integer unitType;
+
+    @ApiModelProperty(value = "汇总开始时间,格式yyyy-MM-dd")
+    private String startDate;
+
+    @ApiModelProperty(value = "汇总结束时间,格式yyyy-MM-dd")
+    private String endDate;
+
+}

+ 32 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TrialSummaryRecordPageDTO.java

@@ -0,0 +1,32 @@
+package org.springblade.business.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TrialSummaryRecordPageDTO implements Serializable {
+
+    @ApiModelProperty(value = "合同段ID")
+    private Long contractId;
+
+    @ApiModelProperty(value = "汇总分类ID")
+    private Long classId;
+
+    @ApiModelProperty(value = "检测类型")
+    private Integer detectionType;
+
+    @ApiModelProperty(value = "汇总开始时间,格式yyyy-MM-dd")
+    private String startDate;
+
+    @ApiModelProperty(value = "汇总结束时间,格式yyyy-MM-dd")
+    private String endDate;
+
+    @ApiModelProperty(value = "每页条数")
+    private Integer size;
+
+    @ApiModelProperty(value = "当前页码")
+    private Integer current;
+
+}

+ 40 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialSummaryRecord.java

@@ -0,0 +1,40 @@
+package org.springblade.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+@Data
+@TableName("u_trial_summary_record")
+@EqualsAndHashCode(callSuper = true)
+public class TrialSummaryRecord extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "合同段ID")
+    private Long contractId;
+
+    @ApiModelProperty(value = "汇总分类ID")
+    private Long classId;
+
+    @ApiModelProperty(value = "汇总编号")
+    private String summaryNumber;
+
+    @ApiModelProperty(value = "汇总开始时间")
+    private String startDate;
+
+    @ApiModelProperty(value = "汇总结束时间")
+    private String endDate;
+
+    @ApiModelProperty(value = "单位类型")
+    private Integer unitType;
+
+    @ApiModelProperty(value = "检测类型")
+    private Integer detectionType;
+
+    @ApiModelProperty(value = "pdf路径")
+    private String pdfUrl;
+
+}

+ 22 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialSummaryRecordVO.java

@@ -0,0 +1,22 @@
+package org.springblade.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.business.entity.TrialSummaryRecord;
+
+@Data
+public class TrialSummaryRecordVO extends TrialSummaryRecord {
+
+    @ApiModelProperty(value = "汇总类别名称")
+    private String classIdName;
+
+    @ApiModelProperty(value = "检测类型名称")
+    private String detectionTypeName;
+
+    @ApiModelProperty(value = "汇总日期")
+    private String summaryDateName;
+
+    @ApiModelProperty(value = "单位类型名称")
+    private String unitTypeName;
+
+}

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/TrialSummaryReflectionSaveDTO.java

@@ -21,9 +21,15 @@ public class TrialSummaryReflectionSaveDTO implements Serializable {
         @ApiModelProperty(value = "试验表的p_key_id")
         @ApiModelProperty(value = "试验表的p_key_id")
         private Long trialTabId;
         private Long trialTabId;
 
 
+        @ApiModelProperty(value = "试验表的实体表名")
+        private String trialTabName;
+
         @ApiModelProperty(value = "试验表下的元素id")
         @ApiModelProperty(value = "试验表下的元素id")
         private Long elementId;
         private Long elementId;
 
 
+        @ApiModelProperty(value = "试验表下的元素eKey")
+        private String elementKey;
+
         @ApiModelProperty(value = "对应html的坐标信息")
         @ApiModelProperty(value = "对应html的坐标信息")
         private String htmlKeyName;
         private String htmlKeyName;
     }
     }

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/TrialSummaryExcelTabReflection.java

@@ -16,9 +16,15 @@ public class TrialSummaryExcelTabReflection implements Serializable {
     @ApiModelProperty(value = "试验表的p_key_id")
     @ApiModelProperty(value = "试验表的p_key_id")
     private Long trialTabId;
     private Long trialTabId;
 
 
+    @ApiModelProperty(value = "试验表的实体表名")
+    private String trialTabName;
+
     @ApiModelProperty(value = "试验表下的元素id")
     @ApiModelProperty(value = "试验表下的元素id")
     private Long elementId;
     private Long elementId;
 
 
+    @ApiModelProperty(value = "试验表下的元素eKey")
+    private String elementKey;
+
     @ApiModelProperty(value = "对应html的坐标信息")
     @ApiModelProperty(value = "对应html的坐标信息")
     private String htmlKeyName;
     private String htmlKeyName;
 
 

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

@@ -1,5 +1,6 @@
 package org.springblade.manager.vo;
 package org.springblade.manager.vo;
 
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 
 
@@ -9,9 +10,13 @@ import java.util.List;
 @Data
 @Data
 public class PrivateTreeVO implements Serializable {
 public class PrivateTreeVO implements Serializable {
 
 
-    @ApiModelProperty(value = "主键id")
+    @ApiModelProperty(value = "主键id,name1")
+    @JsonProperty(value = "pKeyId")
     private Long pKeyId;
     private Long pKeyId;
 
 
+    @ApiModelProperty(value = "主键id,name2")
+    private Long primaryKeyId;
+
     @ApiModelProperty(value = "id")
     @ApiModelProperty(value = "id")
     private Long id;
     private Long id;
 
 

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SelectedTabVO.java

@@ -17,4 +17,7 @@ public class SelectedTabVO implements Serializable {
     @ApiModelProperty(value = "表单名称")
     @ApiModelProperty(value = "表单名称")
     private String tabName;
     private String tabName;
 
 
+    @ApiModelProperty(value = "表单实体名称")
+    private String tabInitName;
+
 }
 }

+ 9 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateAddVO.java

@@ -0,0 +1,9 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+import org.springblade.manager.entity.WbsTreePrivate;
+
+@Data
+public class WbsTreePrivateAddVO extends WbsTreePrivate {
+    private Integer low;
+}

+ 143 - 40
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -48,6 +48,7 @@ import org.springblade.manager.entity.*;
 import org.springblade.manager.feign.*;
 import org.springblade.manager.feign.*;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springblade.manager.vo.WbsTreeContractVO8;
 import org.springblade.manager.vo.WbsTreeContractVO8;
+import org.springblade.manager.vo.WbsTreePrivateAddVO;
 import org.springblade.producer.bean.PushMessage;
 import org.springblade.producer.bean.PushMessage;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.cache.ParamCache;
 import org.springblade.system.cache.ParamCache;
@@ -59,6 +60,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.PreparedStatementSetter;
 import org.springframework.jdbc.core.RowMapper;
 import org.springframework.jdbc.core.RowMapper;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
@@ -3029,10 +3031,10 @@ public class InformationWriteQueryController extends BladeController {
         //先获取当前节点的信息
         //先获取当前节点的信息
         WbsTreeContract treeContract = this.wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(Long.parseLong(vo.getCurrentNodePrimaryKeyId()));
         WbsTreeContract treeContract = this.wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(Long.parseLong(vo.getCurrentNodePrimaryKeyId()));
         if (treeContract == null) {
         if (treeContract == null) {
-            //未找到节点信息,说明可能是缓存,那么清除缓存
             informationQueryService.delAsyncWbsTree(vo.getContractId());
             informationQueryService.delAsyncWbsTree(vo.getContractId());
             throw new ServiceException("该节点为缓存信息,请重试");
             throw new ServiceException("该节点为缓存信息,请重试");
         }
         }
+
         //半选
         //半选
         List<AddContractTreeNodeVO.Node> halfSelectedNodeList = vo.getHalfSelectedList();
         List<AddContractTreeNodeVO.Node> halfSelectedNodeList = vo.getHalfSelectedList();
         //全选
         //全选
@@ -3046,7 +3048,7 @@ public class InformationWriteQueryController extends BladeController {
         List<WbsTreePrivate> query = new ArrayList<>();
         List<WbsTreePrivate> query = new ArrayList<>();
         List<String> pKeyIds = selectList.stream().map(AddContractTreeNodeVO.Node::getPrimaryKeyId).collect(Collectors.toList());
         List<String> pKeyIds = selectList.stream().map(AddContractTreeNodeVO.Node::getPrimaryKeyId).collect(Collectors.toList());
         //所有相关节点集合
         //所有相关节点集合
-        List<WbsTreePrivate> selectedNodeList = new ArrayList<>();
+        List<WbsTreePrivateAddVO> selectedNodeList = new ArrayList<>();
 
 
         //检查新增类型
         //检查新增类型
         if ("1".equals(vo.getSaveType())) {
         if ("1".equals(vo.getSaveType())) {
@@ -3059,12 +3061,11 @@ public class InformationWriteQueryController extends BladeController {
                     return R.data(null);
                     return R.data(null);
                 }
                 }
                 //检查当前操作的节点是否是填报节点,如果是则需要查询相关联表格
                 //检查当前操作的节点是否是填报节点,如果是则需要查询相关联表格
-                List<WbsTreePrivate> submitNodeList = selectedNodeList.stream().filter(treeContract1 -> Arrays.asList("1,2,3,4".split(",")).contains(treeContract1.getMajorDataType().toString())).distinct().collect(Collectors.toList());
-
-                List<WbsTreePrivate> childList = new ArrayList<>();
-                if (submitNodeList.size() > 0) {
+                List<Long> lowNodeIds = selectedNodeList.stream().filter(f -> f.getLow() == 0).map(WbsTreePrivateAddVO::getId).collect(Collectors.toList()); //最底层节点id
+                List<WbsTreePrivateAddVO> childList = new ArrayList<>();
+                if (lowNodeIds.size() > 0) {
                     //只取原始表
                     //只取原始表
-                    this.foreachQueryChild(submitNodeList, childList);
+                    this.foreachQueryChild(lowNodeIds, childList, treeContract);
                     //将表格数据设置
                     //将表格数据设置
                     selectedNodeList.addAll(childList);
                     selectedNodeList.addAll(childList);
                 }
                 }
@@ -3090,12 +3091,11 @@ public class InformationWriteQueryController extends BladeController {
                     return R.data(null);
                     return R.data(null);
                 }
                 }
                 //检查当前操作的节点是否是填报节点,如果是则需要查询相关联表格
                 //检查当前操作的节点是否是填报节点,如果是则需要查询相关联表格
-                List<WbsTreePrivate> submitNodeList = selectedNodeList.stream().filter(treePrivate -> Arrays.asList("1,2,3,4".split(",")).contains(treePrivate.getMajorDataType().toString())).distinct().collect(Collectors.toList());
-
-                List<WbsTreePrivate> childList = new ArrayList<>();
-                if (submitNodeList.size() > 0) {
+                List<Long> lowNodeIds = selectedNodeList.stream().filter(f -> f.getLow() == 0).map(WbsTreePrivateAddVO::getId).collect(Collectors.toList()); //最底层节点id
+                List<WbsTreePrivateAddVO> childList = new ArrayList<>();
+                if (lowNodeIds.size() > 0) {
                     //只取原始表
                     //只取原始表
-                    this.foreachQueryChild(submitNodeList, childList);
+                    this.foreachQueryChild(lowNodeIds, childList, treeContract);
                     //将表格数据设置
                     //将表格数据设置
                     selectedNodeList.addAll(childList);
                     selectedNodeList.addAll(childList);
                 }
                 }
@@ -3169,10 +3169,24 @@ public class InformationWriteQueryController extends BladeController {
                         }
                         }
                     }
                     }
                     if (var) {
                     if (var) {
-                        //同节点
-                        newData.setParentId(OldIdToNewIdMap.containsKey(half.getParentId()) ? OldIdToNewIdMap.get(half.getParentId())
-                                : treeContract.getId().equals(half.getParentId()) || treeContract.getOldId().equals(half.getParentId().toString()) ? treeContract.getId()
-                                : SnowFlakeUtil.getId());
+                        if (ObjectUtil.isNotEmpty(treeContract.getIsCustom()) && treeContract.getIsCustom().equals(1)) {
+                            //自定义节点(非根节点才处理)
+                            if (!newData.getParentId().equals(0L)) {
+                                newData.setParentId(OldIdToNewIdMap.containsKey(half.getParentId())
+                                        ? OldIdToNewIdMap.get(half.getParentId()) : treeContract.getId().equals(half.getParentId())
+                                        ||
+                                        treeContract.getOldId().equals(half.getParentId().toString())
+                                        ? treeContract.getId() : SnowFlakeUtil.getId());
+                            }
+                        } else {
+                            //非自定义节点
+                            //同节点
+                            newData.setParentId(OldIdToNewIdMap.containsKey(half.getParentId())
+                                    ? OldIdToNewIdMap.get(half.getParentId()) : treeContract.getId().equals(half.getParentId())
+                                    ||
+                                    treeContract.getOldId().equals(half.getParentId().toString())
+                                    ? treeContract.getId() : SnowFlakeUtil.getId());
+                        }
                     }
                     }
 
 
                 } else {
                 } else {
@@ -3218,7 +3232,7 @@ public class InformationWriteQueryController extends BladeController {
                 //设置节点名称
                 //设置节点名称
                 newData.setFullName(ObjectUtil.isNotEmpty(idAndNodeNameMaps.get(half.getId())) ? idAndNodeNameMaps.get(half.getId()) : half.getFullName());
                 newData.setFullName(ObjectUtil.isNotEmpty(idAndNodeNameMaps.get(half.getId())) ? idAndNodeNameMaps.get(half.getId()) : half.getFullName());
 
 
-                //重塑父节点关联关系
+                /*//重塑父节点关联关系
                 String ancestors = newData.getAncestors();
                 String ancestors = newData.getAncestors();
                 if (StringUtils.isNotEmpty(ancestors)) {
                 if (StringUtils.isNotEmpty(ancestors)) {
                     //重组后的链表
                     //重组后的链表
@@ -3235,7 +3249,7 @@ public class InformationWriteQueryController extends BladeController {
                     }
                     }
                     //将新链表设置进对象中
                     //将新链表设置进对象中
                     newData.setAncestors(stringBuilder.substring(1));
                     newData.setAncestors(stringBuilder.substring(1));
-                }
+                }*/
 
 
                 //设置到保存集合中
                 //设置到保存集合中
                 saveList.add(newData);
                 saveList.add(newData);
@@ -3248,19 +3262,97 @@ public class InformationWriteQueryController extends BladeController {
             }
             }
         }
         }
         treeContract.setNodeName(vo.getAllSelectedList().get(0).getNodeName());
         treeContract.setNodeName(vo.getAllSelectedList().get(0).getNodeName());
+
+        /*如果是自定义新增节点处进行新增,那么需要把根节点替换为该节点*/
+        List<WbsTreeContract> customResult = new ArrayList<>();
+        if (ObjectUtil.isNotEmpty(treeContract.getIsCustom()) && treeContract.getIsCustom().equals(1)) {
+            saveList.removeIf(obj -> obj.getParentId().equals(0L)); //删除根节点
+
+            List<WbsTreeContract> roots = root(saveList); //选择多个根节点(多个顶层)
+            if (roots.size() > 0) {
+                for (WbsTreeContract root : roots) {
+                    List<WbsTreeContract> resultChild = new ArrayList<>();
+                    child(resultChild, saveList, root); //获取当前根节点对应子级节点
+                    resultChild.add(0, root);
+                    List<WbsTreeContract> sortList = sort(resultChild, root.getPKeyId()); //排序
+                    Map<Long, String> ancestorsMap = new HashMap<>();
+                    for (WbsTreeContract wbsTreeContract : sortList) { //重新赋值
+                        if (wbsTreeContract.getPKeyId().equals(root.getPKeyId())) { //根节点
+                            wbsTreeContract.setParentId(treeContract.getId());
+                            wbsTreeContract.setAncestors(treeContract.getAncestors() + "," + wbsTreeContract.getParentId());
+                            ancestorsMap.put(wbsTreeContract.getId(), wbsTreeContract.getAncestors());
+                        }
+
+                        if (ObjectUtil.isEmpty(wbsTreeContract.getAncestors())) { //子级
+                            String parentAncestors = ancestorsMap.getOrDefault(wbsTreeContract.getParentId(), null);
+                            if (ObjectUtil.isNotEmpty(parentAncestors)) {
+                                wbsTreeContract.setAncestors(parentAncestors + "," + wbsTreeContract.getParentId());
+                                ancestorsMap.put(wbsTreeContract.getId(), wbsTreeContract.getAncestors());
+                            }
+                        }
+
+                        customResult.add(wbsTreeContract);
+                    }
+                }
+            }
+        }
+        if (customResult.size() > 0) {
+            saveList.clear();
+            saveList.addAll(customResult);
+        }
+
         R<Boolean> booleanR = this.saveOrCopyNodeTree(saveList, saveLedger, 2, treeContract);
         R<Boolean> booleanR = this.saveOrCopyNodeTree(saveList, saveLedger, 2, treeContract);
 
 
-        //获取电签信息、默认信息
         List<WbsTreeContract> nowTabs = saveList.stream().filter(f -> new Integer(2).equals(f.getType())).collect(Collectors.toList());
         List<WbsTreeContract> nowTabs = saveList.stream().filter(f -> new Integer(2).equals(f.getType())).collect(Collectors.toList());
-        this.updateTextDictInfos(nowTabs, oldTabIds, vo.getProjectId());
+        this.updateTextDictInfos(nowTabs, oldTabIds, vo.getProjectId());//获取电签信息、默认信息
 
 
-        //更新缓存
-        /*informationQueryService.delAsyncWbsTree(treeContract.getContractId());*/
         iUserClient.clearContractLocalCacheAndRedisCache();
         iUserClient.clearContractLocalCacheAndRedisCache();
 
 
         return booleanR;
         return booleanR;
     }
     }
 
 
+    private void child(List<WbsTreeContract> resultChild, List<WbsTreeContract> nodeAll, WbsTreeContract root) {
+        for (WbsTreeContract node : nodeAll) {
+            if (Objects.equals(node.getParentId(), root.getId())) {
+                resultChild.add(node);
+                child(resultChild, nodeAll, node);
+            }
+        }
+    }
+
+    private List<WbsTreeContract> sort(List<WbsTreeContract> inputList, Long rootPKeyId) {
+        List<WbsTreeContract> sortedList = new ArrayList<>();
+        for (WbsTreeContract wbsTreeContract : inputList) {
+            wbsTreeContract.setAncestors(null);
+            if (wbsTreeContract.getPKeyId().equals(rootPKeyId)) {
+                buildTree(wbsTreeContract, inputList, sortedList, 1);
+            }
+        }
+        return sortedList;
+    }
+
+    private void buildTree(WbsTreeContract contract, List<WbsTreeContract> inputList, List<WbsTreeContract> sortedList, int level) {
+        sortedList.add(contract);
+        for (WbsTreeContract child : inputList) {
+            if (contract.getId().equals(child.getParentId())) {
+                buildTree(child, inputList, sortedList, level + 1);
+            }
+        }
+    }
+
+    private List<WbsTreeContract> root(List<WbsTreeContract> saveList) {
+        List<WbsTreeContract> roots = new ArrayList<>();
+        Set<Long> allIds = saveList.stream().map(WbsTreeContract::getId).collect(Collectors.toSet());
+        for (WbsTreeContract node : saveList) {
+            Long parentId = node.getParentId();
+            if (parentId == null || !allIds.contains(parentId)) {
+                roots.add(node);
+            }
+        }
+        return roots;
+    }
+
+
     @Async
     @Async
     public void updateTextDictInfos(List<WbsTreeContract> nowTabs, List<Long> oldTabIds, String projectId) {
     public void updateTextDictInfos(List<WbsTreeContract> nowTabs, List<Long> oldTabIds, String projectId) {
         if (oldTabIds.size() > 0) {
         if (oldTabIds.size() > 0) {
@@ -3284,14 +3376,20 @@ public class InformationWriteQueryController extends BladeController {
         }
         }
     }
     }
 
 
-    private List<WbsTreePrivate> unifiedCode
+    private List<WbsTreePrivateAddVO> unifiedCode
             (List<AddContractTreeNodeVO.Node> allSelectedNodeList, WbsTreeContract treeContract, String
             (List<AddContractTreeNodeVO.Node> allSelectedNodeList, WbsTreeContract treeContract, String
                     saveType, List<WbsTreePrivate> queryResultP) {
                     saveType, List<WbsTreePrivate> queryResultP) {
         //获取项目节点树的主键
         //获取项目节点树的主键
         List<Long> halfSelectedList = allSelectedNodeList.stream().map(AddContractTreeNodeVO.Node::getPrimaryKeyId).map(Long::parseLong).distinct().collect(Collectors.toList());
         List<Long> halfSelectedList = allSelectedNodeList.stream().map(AddContractTreeNodeVO.Node::getPrimaryKeyId).map(Long::parseLong).distinct().collect(Collectors.toList());
 
 
         //获取项目对应的合同段的树原始节点的信息
         //获取项目对应的合同段的树原始节点的信息
-        List<WbsTreePrivate> query = jdbcTemplate.query("select * from m_wbs_tree_private where p_key_id in(" + StringUtils.join(halfSelectedList, ",") + ")", new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+        List<WbsTreePrivateAddVO> query = jdbcTemplate.query("select *," +
+                        "(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.is_deleted = 0 AND b.project_id = " + treeContract.getProjectId() +
+                        " AND b.wbs_id = " + treeContract.getWbsId() + " AND b.wbs_type = " + treeContract.getWbsType() + ") AS low " +
+                        " FROM m_wbs_tree_private a WHERE p_key_id IN (" + StringUtils.join(halfSelectedList, ",") + ")",
+                new BeanPropertyRowMapper<>(WbsTreePrivateAddVO.class));
+
         if (query.size() > 0) {
         if (query.size() > 0) {
             //返回结果集,匹配节点名称使用
             //返回结果集,匹配节点名称使用
             queryResultP.addAll(query);
             queryResultP.addAll(query);
@@ -3413,14 +3511,15 @@ public class InformationWriteQueryController extends BladeController {
     /**
     /**
      * 处理半选集合
      * 处理半选集合
      */
      */
-    private void disposeHalfSelectList(@RequestBody WbsTreeContract
-                                               treeContract, List<AddContractTreeNodeVO.Node> allSelectedNodeList, List<WbsTreePrivate> selectedNodeList, List<WbsTreePrivate> queryResultP) {
+    private void disposeHalfSelectList(@RequestBody WbsTreeContract treeContract, List<AddContractTreeNodeVO.Node> allSelectedNodeList,
+                                       List<WbsTreePrivateAddVO> selectedNodeList, List<WbsTreePrivate> queryResultP) {
         if (allSelectedNodeList != null && allSelectedNodeList.size() > 0) {
         if (allSelectedNodeList != null && allSelectedNodeList.size() > 0) {
             //获取主键
             //获取主键
             List<Long> allSelectedList = allSelectedNodeList.stream().map(AddContractTreeNodeVO.Node::getPrimaryKeyId).map(Long::parseLong).distinct().collect(Collectors.toList());
             List<Long> allSelectedList = allSelectedNodeList.stream().map(AddContractTreeNodeVO.Node::getPrimaryKeyId).map(Long::parseLong).distinct().collect(Collectors.toList());
 
 
             //获取项目对应的合同段的树原始节点的信息
             //获取项目对应的合同段的树原始节点的信息
-            List<WbsTreePrivate> query = jdbcTemplate.query("select * from m_wbs_tree_private where p_key_id in(" + StringUtils.join(allSelectedList, ",") + ")", new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+            List<WbsTreePrivateAddVO> query = jdbcTemplate.query("select * from m_wbs_tree_private where p_key_id in(" + StringUtils.join(allSelectedList, ",") + ")",
+                    new BeanPropertyRowMapper<>(WbsTreePrivateAddVO.class));
             if (query.size() > 0) {
             if (query.size() > 0) {
                 //返回结果集,匹配节点名称使用
                 //返回结果集,匹配节点名称使用
                 queryResultP.addAll(query);
                 queryResultP.addAll(query);
@@ -3440,19 +3539,19 @@ public class InformationWriteQueryController extends BladeController {
     /**
     /**
      * 循环查询子节点
      * 循环查询子节点
      *
      *
-     * @param parentList 父节点集合
-     * @param childList  保存集合
+     * @param childList       保存集合
+     * @param parentIdsList   最底层节点ids
+     * @param wbsTreeContract 选择节点
      */
      */
-    private void foreachQueryChild(List<WbsTreePrivate> parentList, List<WbsTreePrivate> childList) {
-        for (WbsTreePrivate parent : parentList) {
-            //只获取原始表
-            List<WbsTreePrivate> childS = jdbcTemplate.query("select * from m_wbs_tree_private where parent_id = " + parent.getId() + " and project_id = " + parent.getProjectId() + " and wbs_id = " + parent.getWbsId() + " and is_deleted = 0 and status = 1", new BeanPropertyRowMapper<>(WbsTreePrivate.class));
-            if (childS.size() > 0) {
-                //添加入结果集
-                childList.addAll(childS);
-                //继续向下检查子集
-                this.foreachQueryChild(childS, childList);
-            }
+    private void foreachQueryChild(List<Long> parentIdsList, List<WbsTreePrivateAddVO> childList, WbsTreeContract wbsTreeContract) {
+        List<WbsTreePrivateAddVO> childS = jdbcTemplate.query("select * from m_wbs_tree_private" +
+                " where parent_id in(" + StringUtils.join(parentIdsList, ",") + ")" +
+                " and project_id = " + wbsTreeContract.getProjectId() +
+                " and wbs_id = " + wbsTreeContract.getWbsId() +
+                " and wbs_type = " + wbsTreeContract.getWbsType() +
+                " and is_deleted = 0 and status = 1", new BeanPropertyRowMapper<>(WbsTreePrivateAddVO.class));
+        if (childS.size() > 0) {
+            childList.addAll(childS);
         }
         }
     }
     }
 
 
@@ -3927,7 +4026,11 @@ public class InformationWriteQueryController extends BladeController {
             obj.setWbsId(parentNode.getWbsId());
             obj.setWbsId(parentNode.getWbsId());
             obj.setNodeName(dto.getNodeName());
             obj.setNodeName(dto.getNodeName());
             obj.setFullName(dto.getNodeName());
             obj.setFullName(dto.getNodeName());
-            obj.setNodeType(dto.getNodeType());
+
+            if (ObjectUtil.isNotEmpty(parentNode.getNodeType())) {
+                obj.setNodeType(parentNode.getNodeType().equals(6) ? 6 : parentNode.getNodeType() + 1);
+            }
+
             obj.setPartitionCode(dto.getPartitionCode());
             obj.setPartitionCode(dto.getPartitionCode());
             obj.setParentId(parentNode.getId());
             obj.setParentId(parentNode.getId());
             obj.setAncestors(parentNode.getAncestors() + "," + parentNode.getId());
             obj.setAncestors(parentNode.getAncestors() + "," + parentNode.getId());

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

@@ -31,7 +31,6 @@ import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.mp.support.Query;
-import org.springblade.core.redis.cache.BladeRedis;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.secure.utils.SecureUtil;
@@ -97,7 +96,6 @@ public class TaskController extends BladeController {
     private final IUserClient userClient;
     private final IUserClient userClient;
     private final ArchiveAutoClient archiveClient;
     private final ArchiveAutoClient archiveClient;
     private final ArchiveExpertConclusionClient conclusionClient;
     private final ArchiveExpertConclusionClient conclusionClient;
-    private final BladeRedis bladeRedis;
 
 
     /**
     /**
      * 记录短信验证码超时时间
      * 记录短信验证码超时时间
@@ -403,14 +401,6 @@ public class TaskController extends BladeController {
             throw new ServiceException("未获取到任务人信息,操作失败");
             throw new ServiceException("未获取到任务人信息,操作失败");
         }
         }
 
 
-        /*加锁*/
-        String redisValue = bladeRedis.get("archive:approve:user:" + SecureUtil.getUserId());
-        if (StringUtils.isNotEmpty(redisValue) && redisValue.equals("1")) {
-            return R.fail(400, "请勿重复提交,3秒后再尝试");
-        }
-        bladeRedis.set("archive:approve:user:" + SecureUtil.getUserId(), "1");
-        bladeRedis.expire("archive:approve:user:" + SecureUtil.getUserId(), 3);
-
         //预设流程,获取对应任务人id
         //预设流程,获取对应任务人id
         String resultString = "";
         String resultString = "";
         if (ObjectUtil.isNotEmpty(archiveTaskBatchReportDTO.getFixedFlowId())) {
         if (ObjectUtil.isNotEmpty(archiveTaskBatchReportDTO.getFixedFlowId())) {

+ 276 - 5
blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialSummaryController.java

@@ -1,19 +1,50 @@
 package org.springblade.business.controller;
 package org.springblade.business.controller;
 
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.springblade.business.dto.TrialSummaryRecordDTO;
+import org.springblade.business.dto.TrialSummaryRecordPageDTO;
+import org.springblade.business.entity.TrialSelfInspectionRecord;
+import org.springblade.business.entity.TrialSummaryRecord;
+import org.springblade.business.service.impl.TrialSelfInspectionRecordServiceImpl;
+import org.springblade.business.service.impl.TrialSummaryRecordServiceImpl;
+import org.springblade.business.utils.PdfGenerator;
+import org.springblade.business.vo.TrialSummaryRecordVO;
+import org.springblade.common.constant.CommonConstant;
+import org.springblade.common.utils.CommonUtil;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.*;
+import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.TrialSummaryClassificationConfiguration;
 import org.springblade.manager.entity.TrialSummaryClassificationConfiguration;
+import org.springblade.manager.entity.TrialSummaryExcelTabReflection;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.resource.feign.NewIOSSClient;
+import org.springblade.system.cache.ParamCache;
+import org.springblade.system.entity.Dict;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 
-import java.util.List;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.function.Function;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 
 @RestController
 @RestController
 @AllArgsConstructor
 @AllArgsConstructor
@@ -23,12 +54,252 @@ public class TrialSummaryController {
 
 
     private final JdbcTemplate jdbcTemplate;
     private final JdbcTemplate jdbcTemplate;
     private final NewIOSSClient newIOSSClient;
     private final NewIOSSClient newIOSSClient;
+    private final TrialSummaryRecordServiceImpl trialSummaryRecordServiceImpl;
+    private final TrialSelfInspectionRecordServiceImpl trialSelfInspectionRecordServiceImpl;
 
 
-    @PostMapping("/list")
+    @GetMapping("/contract/list")
     @ApiOperationSupport(order = 1)
     @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "合同段下拉框", notes = "传入当前登陆选择的合同段id、项目id")
+    public R<Object> list(@RequestParam String contractId, @RequestParam String projectId) {
+        ContractInfo contractInfo = jdbcTemplate.query(
+                "SELECT * FROM m_contract_info WHERE is_deleted = 0 AND status = 1 AND id = ?",
+                new Object[]{contractId},
+                new BeanPropertyRowMapper<>(ContractInfo.class)
+        ).stream().findAny().orElse(null);
+        if (contractInfo != null && contractInfo.getContractType() == 4) {
+            List<ContractInfo> contractInfoList = jdbcTemplate.query(
+                    "SELECT * FROM m_contract_info WHERE is_deleted = 0 AND status = 1 AND p_id = ? ORDER BY create_time",
+                    new Object[]{projectId},
+                    new BeanPropertyRowMapper<>(ContractInfo.class)
+            );
+            return R.data(contractInfoList);
+        }
+        return R.data(contractInfo);
+    }
+
+    @GetMapping("/list")
+    @ApiOperationSupport(order = 2)
     @ApiOperation(value = "汇总分类列表", notes = "")
     @ApiOperation(value = "汇总分类列表", notes = "")
     public R<List<TrialSummaryClassificationConfiguration>> list() {
     public R<List<TrialSummaryClassificationConfiguration>> list() {
         return R.data(jdbcTemplate.query("SELECT * FROM m_trial_summary_classification_configuration WHERE is_deleted = 0 AND status = 1 ORDER BY sort,create_time", new BeanPropertyRowMapper<>(TrialSummaryClassificationConfiguration.class)));
         return R.data(jdbcTemplate.query("SELECT * FROM m_trial_summary_classification_configuration WHERE is_deleted = 0 AND status = 1 ORDER BY sort,create_time", new BeanPropertyRowMapper<>(TrialSummaryClassificationConfiguration.class)));
     }
     }
 
 
+    @PostMapping("/page")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "分页查询", notes = "传入TrialSummaryRecordPageDTO")
+    public R<IPage<TrialSummaryRecordVO>> page(@RequestBody TrialSummaryRecordPageDTO dto) {
+        if (ObjectUtil.isEmpty(dto.getClassId()) || ObjectUtil.isEmpty(dto.getContractId())
+                || ObjectUtil.isEmpty(dto.getSize()) || ObjectUtil.isEmpty(dto.getCurrent())) {
+            throw new ServiceException("入参异常");
+        }
+
+        int current = dto.getCurrent();
+        int size = dto.getSize();
+        List<Object> params = new ArrayList<>();
+        StringBuilder sqlString = new StringBuilder("SELECT * FROM u_trial_summary_record WHERE 1=1 AND is_deleted = 0 AND status = 1");
+        sqlString.append(" AND contract_id = ? AND class_id = ?");
+        params.add(dto.getContractId());
+        params.add(dto.getClassId());
+
+        if (ObjectUtil.isNotEmpty(dto.getDetectionType())) {
+            sqlString.append(" AND detection_type = ?");
+            params.add(dto.getDetectionType());
+        }
+        if (ObjectUtil.isNotEmpty(dto.getStartDate()) && ObjectUtil.isNotEmpty(dto.getEndDate())) {
+            sqlString.append(" AND start_date >= ? AND end_date <= ?");
+            params.add(dto.getStartDate());
+            params.add(dto.getEndDate());
+        }
+
+        String sqlCount = sqlString.toString().replace("*", "count(1)");
+        Optional<Integer> totalCountOptional = Optional.ofNullable(jdbcTemplate.queryForObject(sqlCount, Integer.class, params.toArray()));
+        int totalCount = totalCountOptional.orElse(0);
+
+        if (totalCount == 0) {
+            return null;
+        }
+
+        sqlString.append(" ORDER BY create_time LIMIT ? OFFSET ?;");
+        params.add(size);
+        params.add((current - 1) * size);
+        String sqlPage = sqlString.toString();
+        List<TrialSummaryRecord> resultList = jdbcTemplate.query(
+                sqlPage,
+                new BeanPropertyRowMapper<>(TrialSummaryRecord.class),
+                params.toArray()
+        );
+
+        Map<Long, TrialSummaryClassificationConfiguration> classificationConfigurationMap = this.list().getData().stream().collect(Collectors.toMap(TrialSummaryClassificationConfiguration::getId, Function.identity()));
+        Map<String, Dict> dictMap = jdbcTemplate.query("SELECT dict_key,dict_value FROM blade_dict WHERE is_deleted = 0 AND code = 'trial_detection_category'", new BeanPropertyRowMapper<>(Dict.class)).stream().collect(Collectors.toMap(Dict::getDictKey, Function.identity()));
+
+        IPage<TrialSummaryRecordVO> page = new Page<>(current, size);
+        List<TrialSummaryRecordVO> collect = resultList.stream()
+                .map(obj -> {
+                    TrialSummaryRecordVO vo = new TrialSummaryRecordVO();
+                    BeanUtil.copyProperties(obj, vo);
+                    vo.setClassIdName(classificationConfigurationMap.get(obj.getClassId()).getClassName());
+                    vo.setDetectionTypeName(dictMap.get(obj.getDetectionType().toString()).getDictValue());
+                    vo.setSummaryDateName(obj.getStartDate() + "~" + obj.getEndDate());
+                    vo.setUnitTypeName(obj.getUnitType().equals(1) ? "施工" : "监理");
+                    return vo;
+                }).collect(Collectors.toList());
+        page.setRecords(collect);
+        page.setTotal(totalCount);
+        return R.data(page);
+    }
+
+    @PostMapping("/save")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "新增", notes = "传入TrialSummaryRecordDTO")
+    public R<Object> save(@RequestBody TrialSummaryRecordDTO dto) throws Exception {
+        if (ObjectUtil.isEmpty(dto.getClassId()) || ObjectUtil.isEmpty(dto.getContractId()) || ObjectUtil.isEmpty(dto.getDetectionType())
+                || ObjectUtil.isEmpty(dto.getUnitType()) || ObjectUtil.isEmpty(dto.getStartDate()) || ObjectUtil.isEmpty(dto.getEndDate())) {
+            throw new ServiceException("入参异常");
+        }
+
+        String sn = this.build(dto);
+        if (ObjectUtil.isEmpty(sn)) {
+            throw new ServiceException("汇总编号构造异常");
+        }
+
+        String sql_1 = "SELECT * FROM m_trial_summary_classification_configuration WHERE is_deleted = 0 AND status = 1 AND id = ?";
+        TrialSummaryClassificationConfiguration classC = jdbcTemplate.query(sql_1, new Object[]{dto.getClassId()}, new BeanPropertyRowMapper<>(TrialSummaryClassificationConfiguration.class)).stream().findAny().orElse(null);
+        if (classC != null && ObjectUtil.isNotEmpty(classC.getExcelId())
+                && ObjectUtil.isNotEmpty(classC.getHtmlUrl())
+                && ObjectUtil.isNotEmpty(classC.getTrialTreeIds())) {
+
+            LocalDate startDate = LocalDate.parse(dto.getStartDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+            LocalDate endDate = LocalDate.parse(dto.getEndDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+            List<TrialSelfInspectionRecord> records = trialSelfInspectionRecordServiceImpl.getBaseMapper().selectList(Wrappers.<TrialSelfInspectionRecord>lambdaQuery()
+                    .in(TrialSelfInspectionRecord::getNodeId, Func.toLongList(classC.getTrialTreeIds()))
+                    .eq(TrialSelfInspectionRecord::getContractId, dto.getContractId())
+                    .eq(TrialSelfInspectionRecord::getDetectionCategory, dto.getDetectionType())
+                    .between(TrialSelfInspectionRecord::getReportDate, startDate, endDate)
+            );
+
+            //TODO 会存在多个相同表,取数据应该取多组相同数据records的id对应实体表的group_id;生成的新的pdf数据还要入库,就是每个框框都要入库,后续其他接口还要使用
+
+
+            String sql_2 = "SELECT * FROM m_trial_summary_excel_tab_reflection WHERE excel_id = ?";
+            List<TrialSummaryExcelTabReflection> excelTabReflections = jdbcTemplate.query(sql_2, new Object[]{classC.getExcelId()}, new BeanPropertyRowMapper<>(TrialSummaryExcelTabReflection.class));
+            Map<String, List<TrialSummaryExcelTabReflection>> maps = excelTabReflections.stream()
+                    .collect(Collectors.groupingBy(
+                            reflection -> reflection.getTrialTabName() + "##" + reflection.getTrialTabId()
+                    ));
+            Map<String, Object> map = new HashMap<>();
+            for (Map.Entry<String, List<TrialSummaryExcelTabReflection>> entry : maps.entrySet()) {
+                String tabName = entry.getKey().split("##")[0];
+                String tabPkeyId = entry.getKey().split("##")[1];
+
+                List<TrialSummaryExcelTabReflection> value = entry.getValue();
+                Map<String, String> elementKeyWithHtmlKeyNameMap = value.stream().collect(Collectors.toMap(TrialSummaryExcelTabReflection::getElementKey, TrialSummaryExcelTabReflection::getHtmlKeyName));
+                Set<String> elementKeys = elementKeyWithHtmlKeyNameMap.keySet();
+
+                String sql_3 = "SELECT " + String.join(",", elementKeys) + " FROM " + tabName + " WHERE p_key_id = " + tabPkeyId + " ";
+                Map<String, Object> tabDataMap = jdbcTemplate.queryForMap(sql_3);
+
+                for (String elementKey : elementKeys) {
+                    String htmlKeyName = elementKeyWithHtmlKeyNameMap.getOrDefault(elementKey, null);
+                    if (ObjectUtil.isEmpty(htmlKeyName)) {
+                        continue;
+                    }
+                    Object tabData = tabDataMap.getOrDefault(elementKey, null);
+                    map.put(htmlKeyName, tabData);
+                }
+            }
+
+            String htmlString = this.html(classC.getHtmlUrl());
+            String assign = this.replace(htmlString, map);
+            MultipartFile pdfFile = PdfGenerator.generatePdf(assign);
+            if (pdfFile != null) {
+                BladeFile bladeFile = newIOSSClient.uploadFileByInputStream(pdfFile);
+                if (bladeFile != null) {
+                    TrialSummaryRecord obj = BeanUtil.copyProperties(dto, TrialSummaryRecord.class);
+                    if (obj != null) {
+                        obj.setSummaryNumber(sn);
+                        obj.setPdfUrl(bladeFile.getLink());
+                        if (trialSummaryRecordServiceImpl.save(obj)) {
+                            return R.success("操作成功");
+                        }
+                    }
+                }
+            }
+        }
+        return R.fail("操作失败");
+    }
+
+    private String html(String fileUrl) throws Exception {
+        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        String sys_file_net_url = ParamCache.getValue(CommonConstant.SYS_FILE_NET_URL);
+        File file1 = ResourceUtil.getFile(fileUrl);
+        InputStream fileInputStream;
+        if (file1.exists()) {
+            fileInputStream = new FileInputStream(file1);
+        } else {
+            String path = sys_file_net_url + fileUrl.replaceAll("//", "/").replaceAll(file_path, "");
+            fileInputStream = CommonUtil.getOSSInputStream(path);
+        }
+        String htmlString = IoUtil.readToString(fileInputStream);
+        htmlString = htmlString.replaceAll("placeholder", "placeholderxx");
+        Document doc = Jsoup.parse(htmlString);
+        return doc.select("table").first() + "";
+    }
+
+    private String replace(String template, Map<String, Object> values) {
+        String patternString = "\\{(\\w+)}";
+        Pattern pattern = Pattern.compile(patternString);
+        Matcher matcher = pattern.matcher(template);
+        StringBuffer result = new StringBuffer();
+        while (matcher.find()) {
+            String key = matcher.group(1);
+            if (values.containsKey(key)) {
+                matcher.appendReplacement(result, values.get(key).toString());
+            }
+        }
+        matcher.appendTail(result);
+        return result + "";
+    }
+
+    private String build(TrialSummaryRecordDTO dto) {
+        List<TrialSummaryRecord> trialSummaryRecords = trialSummaryRecordServiceImpl.getBaseMapper().selectList(Wrappers.<TrialSummaryRecord>lambdaQuery()
+                .select(TrialSummaryRecord::getSummaryNumber)
+                .eq(TrialSummaryRecord::getClassId, dto.getClassId())
+                .eq(TrialSummaryRecord::getContractId, dto.getContractId())
+        );
+
+        if (trialSummaryRecords.isEmpty()) {
+            return "HZ-0001";
+        }
+
+        Pattern pattern = Pattern.compile("HZ-(\\d+)");
+        int maxNumber = trialSummaryRecords.stream()
+                .map(TrialSummaryRecord::getSummaryNumber)
+                .map(pattern::matcher)
+                .filter(Matcher::find)
+                .map(matcher -> Integer.parseInt(matcher.group(1)))
+                .max(Integer::compareTo)
+                .orElse(0);
+        int newNumber = maxNumber + 1;
+        if (newNumber > 9999) {
+            throw new RuntimeException("已达到编号上限");
+        }
+        return String.format("HZ-%04d", newNumber);
+    }
+
+    @PostMapping("/remove")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "删除", notes = "传入page接口的id,英文逗号字符串拼接成ids")
+    public R<Object> remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+        return R.status(trialSummaryRecordServiceImpl.deleteLogic(Func.toLongList(ids)));
+    }
+
+    @PostMapping("/download")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "下载", notes = "")
+    public R<Object> download() {
+        //TODO
+        return null;
+    }
+
+
 }
 }

+ 7 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSummaryRecordMapper.java

@@ -0,0 +1,7 @@
+package org.springblade.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.business.entity.TrialSummaryRecord;
+
+public interface TrialSummaryRecordMapper extends BaseMapper<TrialSummaryRecord> {
+}

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

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.business.mapper.TrialSummaryRecordMapper">
+
+</mapper>

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

@@ -0,0 +1,7 @@
+package org.springblade.business.service;
+
+import org.springblade.business.entity.TrialSummaryRecord;
+import org.springblade.core.mp.base.BaseService;
+
+public interface ITrialSummaryRecordService extends BaseService<TrialSummaryRecord> {
+}

+ 14 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSummaryRecordServiceImpl.java

@@ -0,0 +1,14 @@
+package org.springblade.business.service.impl;
+
+import lombok.AllArgsConstructor;
+import org.springblade.business.entity.TrialSummaryRecord;
+import org.springblade.business.mapper.TrialSummaryRecordMapper;
+import org.springblade.business.service.ITrialSummaryRecordService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class TrialSummaryRecordServiceImpl extends BaseServiceImpl<TrialSummaryRecordMapper, TrialSummaryRecord> implements ITrialSummaryRecordService {
+
+}

+ 66 - 0
blade-service/blade-business/src/main/java/org/springblade/business/utils/InMemoryMultipartFile.java

@@ -0,0 +1,66 @@
+package org.springblade.business.utils;
+
+import org.springframework.core.io.Resource;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class InMemoryMultipartFile implements MultipartFile {
+
+    private final byte[] content;
+    private final String name;
+
+    public InMemoryMultipartFile(byte[] content, String name) {
+        this.content = content;
+        this.name = name;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String getOriginalFilename() {
+        return name;
+    }
+
+    @Override
+    public String getContentType() {
+        return "application/pdf";
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return content.length == 0;
+    }
+
+    @Override
+    public long getSize() {
+        return content.length;
+    }
+
+    @Override
+    public byte[] getBytes() {
+        return content;
+    }
+
+    @Override
+    public InputStream getInputStream() throws IOException {
+        return new ByteArrayInputStream(content);
+    }
+
+    @Override
+    public Resource getResource() {
+        return MultipartFile.super.getResource();
+    }
+
+    @Override
+    public void transferTo(File dest) throws IOException, IllegalStateException {
+
+    }
+
+}

+ 26 - 0
blade-service/blade-business/src/main/java/org/springblade/business/utils/PdfGenerator.java

@@ -0,0 +1,26 @@
+package org.springblade.business.utils;
+
+import org.springframework.web.multipart.MultipartFile;
+import org.xhtmlrenderer.pdf.ITextRenderer;
+
+import java.io.ByteArrayOutputStream;
+
+public class PdfGenerator {
+
+    public static MultipartFile generatePdf(String htmlString) {
+        try {
+            ITextRenderer renderer = new ITextRenderer();
+            renderer.setDocumentFromString(htmlString);
+            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+            renderer.layout();
+            renderer.createPDF(outputStream);
+            byte[] pdfBytes = outputStream.toByteArray();
+            renderer.finishPDF();
+            return new InMemoryMultipartFile(pdfBytes, "output.pdf");
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+}

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

@@ -104,7 +104,7 @@ public class TrialSummaryClassificationConfigurationController extends BladeCont
     @ApiOperationSupport(order = 7)
     @ApiOperationSupport(order = 7)
     @ApiOperation(value = "试验树全加载", notes = "传入项目id、classId=page接口数据id")
     @ApiOperation(value = "试验树全加载", notes = "传入项目id、classId=page接口数据id")
     @RequestMapping(value = "/tree", method = RequestMethod.GET)
     @RequestMapping(value = "/tree", method = RequestMethod.GET)
-    public R<TrialTreeVO> tree(@RequestParam String projectId, @RequestParam String classId) {
+    public R<List<TrialTreeVO>> tree(@RequestParam String projectId, @RequestParam String classId) {
         return R.data(iTrialSummaryClassificationConfigurationService.tree(projectId, classId));
         return R.data(iTrialSummaryClassificationConfigurationService.tree(projectId, classId));
     }
     }
 
 
@@ -176,6 +176,7 @@ public class TrialSummaryClassificationConfigurationController extends BladeCont
                     vo.setPKeyId(wbsTreePrivate.getPKeyId());
                     vo.setPKeyId(wbsTreePrivate.getPKeyId());
                     vo.setId(wbsTreePrivate.getId());
                     vo.setId(wbsTreePrivate.getId());
                     vo.setTabName(ObjectUtil.isNotEmpty(wbsTreePrivate.getFullName()) ? wbsTreePrivate.getFullName() : wbsTreePrivate.getNodeName());
                     vo.setTabName(ObjectUtil.isNotEmpty(wbsTreePrivate.getFullName()) ? wbsTreePrivate.getFullName() : wbsTreePrivate.getNodeName());
+                    vo.setTabInitName(wbsTreePrivate.getInitTableName());
                     list.add(vo);
                     list.add(vo);
                 }
                 }
                 return R.data(list);
                 return R.data(list);
@@ -235,7 +236,7 @@ public class TrialSummaryClassificationConfigurationController extends BladeCont
                     paramsDel.addAll(keyNameList);
                     paramsDel.addAll(keyNameList);
                     jdbcTemplate.update(sqlDel, paramsDel.toArray());
                     jdbcTemplate.update(sqlDel, paramsDel.toArray());
 
 
-                    String sqlInsert = "INSERT INTO m_trial_summary_excel_tab_reflection(id,excel_id,trial_tab_id,element_id,html_key_name) VALUES (?,?,?,?,?)";
+                    String sqlInsert = "INSERT INTO m_trial_summary_excel_tab_reflection(id,excel_id,trial_tab_id,element_id,html_key_name,trial_tab_name,element_key) VALUES (?,?,?,?,?,?,?)";
                     List<Object[]> batchArgs = new ArrayList<>();
                     List<Object[]> batchArgs = new ArrayList<>();
                     for (TrialSummaryReflectionSaveDTO.ReflectionBean reflectionBean : reflectionBeanList) {
                     for (TrialSummaryReflectionSaveDTO.ReflectionBean reflectionBean : reflectionBeanList) {
                         Object[] paramsInsert = {
                         Object[] paramsInsert = {
@@ -244,6 +245,8 @@ public class TrialSummaryClassificationConfigurationController extends BladeCont
                                 reflectionBean.getTrialTabId(),
                                 reflectionBean.getTrialTabId(),
                                 reflectionBean.getElementId(),
                                 reflectionBean.getElementId(),
                                 reflectionBean.getHtmlKeyName(),
                                 reflectionBean.getHtmlKeyName(),
+                                reflectionBean.getTrialTabName(),
+                                reflectionBean.getElementKey()
                         };
                         };
                         batchArgs.add(paramsInsert);
                         batchArgs.add(paramsInsert);
                     }
                     }

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

@@ -9,6 +9,7 @@ import org.springblade.manager.vo.TrialTreeVO;
 
 
 import java.io.FileNotFoundException;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.IOException;
+import java.util.List;
 
 
 public interface ITrialSummaryClassificationConfigurationService extends BaseService<TrialSummaryClassificationConfiguration> {
 public interface ITrialSummaryClassificationConfigurationService extends BaseService<TrialSummaryClassificationConfiguration> {
 
 
@@ -22,6 +23,6 @@ public interface ITrialSummaryClassificationConfigurationService extends BaseSer
 
 
     boolean relevancy(TrialSummaryClassificationConfigurationRelevancyDTO dto) throws IOException;
     boolean relevancy(TrialSummaryClassificationConfigurationRelevancyDTO dto) throws IOException;
 
 
-    TrialTreeVO tree(String projectId, String classId);
+    List<TrialTreeVO> tree(String projectId, String classId);
 
 
 }
 }

+ 3 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/TrialSummaryClassificationConfigurationServiceImpl.java

@@ -191,7 +191,7 @@ public class TrialSummaryClassificationConfigurationServiceImpl
     }
     }
 
 
     @Override
     @Override
-    public TrialTreeVO tree(String projectId, String classId) {
+    public List<TrialTreeVO> tree(String projectId, String classId) {
         List<WbsTreePrivate> wbsTreePrivatesNodes = wbsTreePrivateServiceImpl.getBaseMapper().selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
         List<WbsTreePrivate> wbsTreePrivatesNodes = wbsTreePrivateServiceImpl.getBaseMapper().selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
                 .select(WbsTreePrivate::getId, WbsTreePrivate::getPKeyId, WbsTreePrivate::getParentId, WbsTreePrivate::getNodeName)
                 .select(WbsTreePrivate::getId, WbsTreePrivate::getPKeyId, WbsTreePrivate::getParentId, WbsTreePrivate::getNodeName)
                 .eq(WbsTreePrivate::getProjectId, projectId)
                 .eq(WbsTreePrivate::getProjectId, projectId)
@@ -202,7 +202,7 @@ public class TrialSummaryClassificationConfigurationServiceImpl
         return buildTree(wbsTreePrivatesNodes, classId);
         return buildTree(wbsTreePrivatesNodes, classId);
     }
     }
 
 
-    private TrialTreeVO buildTree(List<WbsTreePrivate> wbsTreePrivatesNodes, String classId) {
+    private List<TrialTreeVO> buildTree(List<WbsTreePrivate> wbsTreePrivatesNodes, String classId) {
         List<TrialTreeVO> trialTreeVOS = BeanUtil.copyProperties(wbsTreePrivatesNodes, TrialTreeVO.class);
         List<TrialTreeVO> trialTreeVOS = BeanUtil.copyProperties(wbsTreePrivatesNodes, TrialTreeVO.class);
         if (!trialTreeVOS.isEmpty()) {
         if (!trialTreeVOS.isEmpty()) {
             TrialSummaryClassificationConfiguration classificationConfiguration = baseMapper.selectById(classId);
             TrialSummaryClassificationConfiguration classificationConfiguration = baseMapper.selectById(classId);
@@ -214,7 +214,7 @@ public class TrialSummaryClassificationConfigurationServiceImpl
             Map<Long, List<TrialTreeVO>> map = trialTreeVOS.stream().collect(Collectors.groupingBy(TrialTreeVO::getParentId));
             Map<Long, List<TrialTreeVO>> map = trialTreeVOS.stream().collect(Collectors.groupingBy(TrialTreeVO::getParentId));
             List<TrialTreeVO> list = trialTreeVOS.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
             List<TrialTreeVO> list = trialTreeVOS.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
             buildChildNodes(list, map, trialTreeNodePKeyIds);
             buildChildNodes(list, map, trialTreeNodePKeyIds);
-            return trialTreeVOS.get(0);
+            return list;
         }
         }
         return null;
         return null;
     }
     }

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

@@ -1068,17 +1068,27 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
 
 
     @Override
     @Override
     public List<PrivateTreeVO> treePrivate(String projectId) {
     public List<PrivateTreeVO> treePrivate(String projectId) {
-        String sql = "SELECT id,p_key_id,parent_id,node_name FROM m_wbs_tree_private WHERE project_id = ? AND wbs_type = 1 AND type = 1 AND status = 1 AND is_deleted = 0";
-        List<WbsTreePrivate> wbsTreePrivatesNodes = jdbcTemplate.query(sql, new Object[]{projectId}, new BeanPropertyRowMapper<>(WbsTreePrivate.class));
-        return buildTree(wbsTreePrivatesNodes);
+        String sql = "SELECT id,p_key_id,parent_id,node_name,sort FROM m_wbs_tree_private WHERE project_id = ? " +
+                "AND wbs_type = 1 AND type = 1 AND status = 1 AND is_deleted = 0 AND node_type != 111 ORDER BY sort";
+        List<WbsTreePrivate> wbsTreePrivatesNodes = jdbcTemplate.query(sql, new Object[]{projectId},
+                new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+        return buildTree(wbsTreePrivatesNodes, projectId);
     }
     }
 
 
-    private List<PrivateTreeVO> buildTree(List<WbsTreePrivate> wbsTreePrivatesNodes) {
+    private List<PrivateTreeVO> buildTree(List<WbsTreePrivate> wbsTreePrivatesNodes, String projectId) {
         List<PrivateTreeVO> privateTreeVOS = BeanUtil.copyProperties(wbsTreePrivatesNodes, PrivateTreeVO.class);
         List<PrivateTreeVO> privateTreeVOS = BeanUtil.copyProperties(wbsTreePrivatesNodes, PrivateTreeVO.class);
         if (!privateTreeVOS.isEmpty()) {
         if (!privateTreeVOS.isEmpty()) {
             Map<Long, List<PrivateTreeVO>> map = privateTreeVOS.stream().collect(Collectors.groupingBy(PrivateTreeVO::getParentId));
             Map<Long, List<PrivateTreeVO>> map = privateTreeVOS.stream().collect(Collectors.groupingBy(PrivateTreeVO::getParentId));
             List<PrivateTreeVO> list = privateTreeVOS.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
             List<PrivateTreeVO> list = privateTreeVOS.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
             buildChildNodes(list, map);
             buildChildNodes(list, map);
+            for (PrivateTreeVO privateTreeVO : list) {
+                if (privateTreeVO.getParentId().equals(0L)) {
+                    jdbcTemplate.query("SELECT project_name FROM m_project_info WHERE id = " + projectId,
+                            new BeanPropertyRowMapper<>(ProjectInfo.class))
+                            .stream().findAny().ifPresent(projectInfo -> privateTreeVO.setNodeName(projectInfo.getProjectName()));
+                    break;
+                }
+            }
             return list;
             return list;
         }
         }
         return null;
         return null;
@@ -1086,6 +1096,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
 
 
     private void buildChildNodes(List<PrivateTreeVO> list, Map<Long, List<PrivateTreeVO>> map) {
     private void buildChildNodes(List<PrivateTreeVO> list, Map<Long, List<PrivateTreeVO>> map) {
         for (PrivateTreeVO privateTreeVO : list) {
         for (PrivateTreeVO privateTreeVO : list) {
+            privateTreeVO.setPrimaryKeyId(privateTreeVO.getPKeyId());
             List<PrivateTreeVO> childrenList = map.getOrDefault(privateTreeVO.getId(), null);
             List<PrivateTreeVO> childrenList = map.getOrDefault(privateTreeVO.getId(), null);
             if (childrenList != null && childrenList.size() > 0) {
             if (childrenList != null && childrenList.size() > 0) {
                 privateTreeVO.setChildren(childrenList);
                 privateTreeVO.setChildren(childrenList);