Эх сурвалжийг харах

Merge branch 'master' of http://47.110.251.215:3000/java_org/bladex

# Conflicts:
#	blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java
#	blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java
#	blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
#	blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java
#	blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeService.java
huangtf 2 жил өмнө
parent
commit
d5904f6325
60 өөрчлөгдсөн 1986 нэмэгдсэн , 601 устгасан
  1. 2 1
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java
  2. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/InformationQuery.java
  3. 90 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/MetadataClassification.java
  4. 0 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/InformationQueryClient.java
  5. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/CopyContractTreeNodeVO.java
  6. 2 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/InformationQueryVO.java
  7. 2 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/QueryProcessDataVO.java
  8. 14 2
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaBean.java
  9. 8 2
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTree.java
  10. 4 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java
  11. 23 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ExcelEditCallback.java
  12. 5 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java
  13. 156 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO2.java
  14. 130 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeVO2.java
  15. 41 20
      blade-service/blade-business/src/main/java/org/springblade/business/controller/BusinessUserOpinionController.java
  16. 48 29
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  17. 7 3
      blade-service/blade-business/src/main/java/org/springblade/business/controller/MessageWarningController.java
  18. 80 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/MetadataController.java
  19. 75 47
      blade-service/blade-business/src/main/java/org/springblade/business/controller/NeiYeController.java
  20. 19 4
      blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionController.java
  21. 1 2
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/InformationQueryClientImpl.java
  22. 7 5
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml
  23. 20 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/MetadataClassificationMapper.java
  24. 78 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/MetadataClassificationMapper.xml
  25. 17 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IMetadataClassificationService.java
  26. 35 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java
  27. 96 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/MetadataClassificationServiceImpl.java
  28. 55 44
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  29. 30 16
      blade-service/blade-business/src/main/java/org/springblade/business/socket/WebSocket.java
  30. 9 0
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java
  31. 120 48
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  32. 250 69
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FirstController.java
  33. 34 9
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java
  34. 10 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ProjectInfoController.java
  35. 4 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java
  36. 24 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java
  37. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java
  38. 3 12
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/FormulaClientImpl.java
  39. 13 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java
  40. 8 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java
  41. 16 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  42. 6 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectInfoMapper.xml
  43. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml
  44. 5 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  45. 6 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java
  46. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeService.java
  47. 3 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java
  48. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaService.java
  49. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java
  50. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeService.java
  51. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/SaveUserInfoByProjectService.java
  52. 36 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  53. 14 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java
  54. 278 207
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  55. 21 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  56. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/SaveUserInfoByProjectServiceImpl.java
  57. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  58. 8 11
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java
  59. 51 16
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java
  60. 1 2
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

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

@@ -123,7 +123,8 @@ public class OssBuilder {
      */
     public Oss getOss(String tenantId, String code) {
         String key = StringUtils.isNotEmpty(tenantId) ? tenantId : OSS_TENANT_ID;
-
+        System.out.println("oss----"+tenantId);
+        System.out.println("oss_code=====--"+code);
         LambdaQueryWrapper<Oss> lqw = Wrappers.<Oss>query().lambda().eq(Oss::getTenantId, key);
         // 获取传参的资源编号并查询,若有则返回,若没有则调启用的配置
         String ossCode = StringUtil.isBlank(code) ? WebUtil.getParameter(OSS_PARAM_KEY) : code;

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/InformationQuery.java

@@ -119,4 +119,7 @@ public class InformationQuery extends BaseEntity {
     @ApiModelProperty("pdf路径,引用试验记录后合并的pdf")
     private String pdfTrialUrl;
 
+    @ApiModelProperty("首件关联工序资料ids")
+    private String sjRecordIds;
+
 }

+ 90 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/MetadataClassification.java

@@ -0,0 +1,90 @@
+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_metadata_classification")
+@EqualsAndHashCode(callSuper = true)
+public class MetadataClassification extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 主键id
+     */
+    private Long id;
+    /**
+     * 租户ID
+     */
+    @ApiModelProperty(value = "租户ID")
+    private String tenantId;
+
+    @ApiModelProperty("合同段ID")
+    private String contractId;
+
+    /**
+     * 元数据项
+     */
+    @ApiModelProperty(value = "元数据项")
+    private String containerName;
+
+    /**
+     * 编号
+     */
+    @ApiModelProperty(value = "编号")
+    private String code;
+    /**
+     * 字段数据类型
+     */
+    @ApiModelProperty(value = "字段数据类型")
+    private String fieldType;
+
+    /**
+     * 容器类型
+     */
+    @ApiModelProperty(value = "容器类型")
+    private Integer containerType;
+
+    /**
+     * 捕获方式
+     */
+    @ApiModelProperty(value = "捕获方式")
+    private Integer captureMode;
+
+    /**
+     * 是否必选
+     */
+    @ApiModelProperty(value = "是否必选")
+    private Integer mandatoryType;
+
+    /**
+     * 文件存储类型
+     */
+    @ApiModelProperty(value = "文件存储类型")
+    private String fileStorageType;
+
+    /**
+     * 容器实体表名称
+     */
+    @ApiModelProperty(value = "容器实体表名称")
+    private String containerInitTabName;
+
+    /**
+     * 实体表字段名
+     */
+    @ApiModelProperty(value = "实体表字段名")
+    private String fieldKey;
+
+    /**
+     * 排序
+     */
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
+
+}

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

@@ -51,5 +51,4 @@ public interface InformationQueryClient {
 
     @PostMapping(API_PREFIX + "/updateInformationQuery")
     void updateInformationQuery(@RequestParam String link, @RequestParam String classify, @RequestParam String nodeId, @RequestParam String contractId);
-
 }

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/CopyContractTreeNodeVO.java

@@ -24,6 +24,9 @@ public class CopyContractTreeNodeVO {
     @ApiModelProperty("复制到的节点PrimaryKeyId和对应的name集合(复制多份时使用)")
     private List<CopyBatch> copyBatchToPaths = new ArrayList<>();
 
+    @ApiModelProperty("所属方 1=施工 2=监理")
+    private Integer tableOwner;
+
     public void setCopyBatchToPaths(String primaryKeyId, String nodeName){
         this.copyBatchToPaths.add(new CopyBatch(primaryKeyId, nodeName));
     }

+ 2 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/InformationQueryVO.java

@@ -67,6 +67,8 @@ public class InformationQueryVO extends InformationQuery {
 
 	private String classifyType;
 
+	private Boolean isApprove;
+
 	@ApiModelProperty("上报批次")
 	private String reportNumber;
 

+ 2 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/QueryProcessDataVO.java

@@ -29,4 +29,6 @@ public class QueryProcessDataVO {
 
     private String queryType;
 
+    private String reportNumber;
+
 }

+ 14 - 2
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaBean.java

@@ -7,15 +7,22 @@ import org.springframework.beans.BeanUtils;
 /**
  * @author yangyj
  * @Date 2022/6/14 16:27
- * @description TODO
+ * @description 元素关联公式目前有六种映射关联
  */
 @Data
 public class FormulaBean {
+    /**元素库级别 关键字:elementId*/
+    public static Integer LIBRARY=0;
+    /** WBS级别 关键字: wbsId+elementId*/
     public static Integer WBS_GLOBAL=1;
+    /** WBS 节点级别 关键字:wbsId+nodeId+elementId*/
     public static Integer WBS_PART=2;
+    /**项目级别 关键字:projectId+elementId*/
     public static Integer PRO_GLOBAL=10;
+    /**项目节点级别 关键字:projectId+nodeId+elementId*/
     public static Integer PRO_PART=20;
-    public static Integer PARAM=15;
+    /**节点参数级别 关键字:projectId+nodeId+elementId*/
+    public static Integer PARAM=35;
     private Long id;
     private String formula;
     private String remark;
@@ -35,6 +42,11 @@ public class FormulaBean {
         BeanUtils.copyProperties(this,f);
         return f;
     }
+    public void checkType(){
+    }
+    public Boolean isLibrary(){
+        return LIBRARY.equals(this.scope);
+    }
     public Boolean isWbsGlobal(){
         return WBS_GLOBAL.equals(this.scope);
     }

+ 8 - 2
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTree.java

@@ -140,10 +140,16 @@ public class ArchiveTree extends BaseEntity {
     @ApiModelProperty(value = "自动立卷类型")
     private Integer archiveAutoType;
 	/**
-	* 自动立卷关联Id
+	* 自动立卷设置的节点ID
 	*/
-    @ApiModelProperty(value = "自动立卷关联Id")
+    @ApiModelProperty(value = "自动立卷设置的节点ID")
     private Long archiveAutoNodeId;
 
+    /**
+     * 是否自动立卷规则选择设置的节点 选中的节点设为1 方便页面显示列表
+     */
+    @ApiModelProperty(value = "是否为设置的节点")
+    private Integer archiveAutoSelect;
+
 
 }

+ 4 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java

@@ -136,6 +136,10 @@ public class ArchiveTreeContract extends BaseEntity {
 	*/
 	private Long archiveAutoNodeId;
 
+	/**
+	 * 是否自动立卷规则选择设置的节点 选中的节点设为1 方便页面显示列表
+	 */
+	private Integer archiveAutoSelect;
 	public ArchiveTreeContract() {
 	}
 

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

@@ -0,0 +1,23 @@
+package org.springblade.manager.entity;
+
+
+import lombok.Data;
+
+@Data
+public class ExcelEditCallback {
+    /**
+     * excel l路径
+     */
+    private String url;
+    /**
+     * 在线编辑状态
+     */
+    private Integer status;
+
+    // excel 的唯一标识
+    private Long key;
+
+    // 返回码
+    private Integer error;
+
+}

+ 5 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java

@@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;
@@ -140,5 +141,8 @@ public interface WbsTreeContractClient {
     List<WbsTreeContract> selectContractTreeAll(@RequestParam String contractId);
 
     @GetMapping(API_PREFIX + "/getContractWbsTreeByParentId")
-    List<WbsTreeContract> getContractWbsTreeByParentId(@RequestParam String parentId,@RequestParam String contractId);
+    List<WbsTreeContract> getContractWbsTreeByParentId(@RequestParam String parentId, @RequestParam String contractId);
+
+    @PostMapping(API_PREFIX + "/diySort")
+    boolean diySort(@RequestBody List<String> sortLists);
 }

+ 156 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO2.java

@@ -0,0 +1,156 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.manager.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tool.node.INode;
+import org.springblade.manager.entity.ArchiveTreeContract;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 视图实体类
+ *
+ * @author 00
+ * @since 2023-02-18
+ */
+@Data
+public class ArchiveTreeContractVO2 implements INode<ArchiveTreeContractVO2> {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键ID
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty(value = "主键id")
+	private Long id;
+
+	/**
+	 * 父节点ID
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty(value = "父级id")
+	private Long parentId;
+
+	/**
+	 * title
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty(value = "节点名称")
+	private String title;
+
+	/**
+	 * 子孙节点
+	 */
+	@JsonInclude(JsonInclude.Include.NON_EMPTY)
+	@ApiModelProperty(value = "子孙节点")
+	private List<ArchiveTreeContractVO2> children;
+
+	/**
+	 * 是否有子孙节点
+	 */
+	@JsonInclude(JsonInclude.Include.NON_EMPTY)
+	@ApiModelProperty(value = "是否有子孙节点")
+	private Boolean hasChildren;
+
+	@Override
+	public List<ArchiveTreeContractVO2> getChildren() {
+		if (this.children == null) {
+			this.children = new ArrayList<>();
+		}
+		return this.children;
+	}
+
+	/**
+	 * 内业资料类型(用于显示控制)
+	 */
+	@ApiModelProperty(value = "内业资料类型(用于显示控制)")
+	private String majorDataType;
+
+	/**
+	 * 显示层级(用于显示控制)
+	 */
+	@ApiModelProperty(value = "显示层级(用于显示控制)")
+	private String displayHierarchy;
+
+	/**
+	 * 是否为存储节点
+	 */
+	@ApiModelProperty(value = "是否为存储节点")
+	private Integer isStorageNode;
+
+	/**
+	 * 是否为显示树
+	 */
+	@ApiModelProperty(value = "是否为显示树")
+	private Integer isUploadFileDisplayConfigurationTree;
+
+	/**
+	 * 是否为竣工图 '0'否 '1'是
+	 */
+	@ApiModelProperty(value = "是否为竣工图 '0'否 '1'是")
+	private Integer isBuiltDrawing;
+
+	private Long key;
+	@JsonSerialize(
+			using = ToStringSerializer.class
+	)
+	private Long value;
+	/**
+	 * 是否显示
+	 */
+	private Integer isDisplayTree;
+
+	private String postType;
+
+	/**
+	 * 工程类型
+	 */
+	private Integer projectType;
+	/**
+	 * 关联类型
+	 */
+	private Integer storageType;
+
+	/**
+	 * 扩展类型
+	 */
+	@ApiModelProperty(value = "扩展类型")
+	private Integer extType;
+	/**
+	 * 扩展关联Id
+	 */
+	@ApiModelProperty(value = "扩展关联Id")
+	private Long extId;
+	/**
+	 * 自动立卷类型
+	 */
+	@ApiModelProperty(value = "自动立卷类型")
+	private Integer archiveAutoType;
+	/**
+	 * 自动立卷关联Id
+	 */
+	@ApiModelProperty(value = "自动立卷关联Id")
+	private Long archiveAutoNodeId;
+
+}

+ 130 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeVO2.java

@@ -0,0 +1,130 @@
+package org.springblade.manager.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.core.tool.node.INode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class ArchiveTreeVO2 implements INode<ArchiveTreeVO2> {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "主键id")
+    private Long id;
+
+    /**
+     * 父节点ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "父级id")
+    private Long parentId;
+
+    /**
+     * title
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "节点名称")
+    private String title;
+
+    /**
+     * 子孙节点
+     */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    @ApiModelProperty(value = "子孙节点")
+    private List<ArchiveTreeVO2> children;
+
+    /**
+     * 是否有子孙节点
+     */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    @ApiModelProperty(value = "是否有子孙节点")
+    private Boolean hasChildren;
+
+    @Override
+    public List<ArchiveTreeVO2> getChildren() {
+        if (this.children == null) {
+            this.children = new ArrayList<>();
+        }
+        return this.children;
+    }
+
+    /**
+     * 内业资料类型(用于显示控制)
+     */
+    @ApiModelProperty(value = "内业资料类型(用于显示控制)")
+    private String majorDataType;
+
+    /**
+     * 显示层级(用于显示控制)
+     */
+    @ApiModelProperty(value = "显示层级(用于显示控制)")
+    private String displayHierarchy;
+
+    /**
+     * 是否为存储节点
+     */
+    @ApiModelProperty(value = "是否为存储节点")
+    private Integer isStorageNode;
+
+    /**
+     * 是否为显示树
+     */
+    @ApiModelProperty(value = "是否为显示树")
+    private Integer isUploadFileDisplayConfigurationTree;
+
+    /**
+     * 是否为竣工图 '0'否 '1'是
+     */
+    @ApiModelProperty(value = "是否为竣工图 '0'否 '1'是")
+    private Integer isBuiltDrawing;
+
+    private Long key;
+    @JsonSerialize(
+            using = ToStringSerializer.class
+    )
+    private Long value;
+    /**
+     * 是否显示
+     */
+    private Integer isDisplayTree;
+
+    private String postType;
+
+    /**
+     * 工程类型
+     */
+    private Integer projectType;
+    /**
+     * 关联类型
+     */
+    private Integer storageType;
+    /**
+     * 扩展类型
+     */
+    @ApiModelProperty(value = "扩展类型")
+    private Integer extType;
+    /**
+     * 扩展关联Id
+     */
+    @ApiModelProperty(value = "扩展关联Id")
+    private Long extId;
+    /**
+     * 自动立卷类型
+     */
+    @ApiModelProperty(value = "自动立卷类型")
+    private Integer archiveAutoType;
+    /**
+     * 自动立卷关联Id
+     */
+    @ApiModelProperty(value = "自动立卷关联Id")
+    private Long archiveAutoNodeId;
+}

+ 41 - 20
blade-service/blade-business/src/main/java/org/springblade/business/controller/BusinessUserOpinionController.java

@@ -1,5 +1,6 @@
 package org.springblade.business.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@@ -14,9 +15,11 @@ import org.springblade.business.entity.UserOpinion;
 import org.springblade.business.entity.UserOpinionFile;
 import org.springblade.business.entity.UserOpinionFlow;
 import org.springblade.business.feign.MessageWarningClient;
+import org.springblade.business.service.ITaskService;
 import org.springblade.business.service.IUserOpinionFileService;
 import org.springblade.business.service.IUserOpinionFlowService;
 import org.springblade.business.service.IUserOpinionService;
+import org.springblade.business.socket.WebSocket;
 import org.springblade.business.vo.AssessmentUserVOS;
 import org.springblade.business.vo.BusinessUserOpinionVO;
 import org.springblade.business.vo.MessageWarningVO;
@@ -27,9 +30,13 @@ import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.ObjectUtil;
 import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 @RestController
@@ -46,13 +53,17 @@ public class BusinessUserOpinionController {
 
     private final MessageWarningClient messageWarningClient;
 
+    private final ITaskService iTaskService;
+
+    private final WebSocket webSocket;
+
     /**
      * isIgnore
      */
     @PostMapping("/isIgnore")
     @ApiOperationSupport(order = 5)
     @ApiOperation(value = "是否忽略")
-    public R<Boolean> isIgnore(@RequestParam String userOpinionId){
+    public R<Boolean> isIgnore(@RequestParam String userOpinionId) {
         return R.data(this.userOpinionService.update(Wrappers.<UserOpinion>lambdaUpdate().set(UserOpinion::getIsIgnore, 1).eq(UserOpinion::getId, userOpinionId)));
     }
 
@@ -62,7 +73,7 @@ public class BusinessUserOpinionController {
     @GetMapping("/queryUserAssessmentPage")
     @ApiOperationSupport(order = 4)
     @ApiOperation(value = "考核区分页")
-    public R<IPage<AssessmentUserVOS>> queryUserAssessmentPageList(AssessmentUserVOS vo){
+    public R<IPage<AssessmentUserVOS>> queryUserAssessmentPageList(AssessmentUserVOS vo) {
         Query query = new Query();
         query.setCurrent(vo.getCurrent());
         query.setSize(vo.getSize());
@@ -71,7 +82,7 @@ public class BusinessUserOpinionController {
         //总数
         Integer count = this.userOpinionFlowService.countUserAssessmentPageList(vo);
         //分页数据
-        if(StringUtils.isNotEmpty(vo.getEndTime())){
+        if (StringUtils.isNotEmpty(vo.getEndTime())) {
             //因为between的含头不含尾属性,需要给结尾时间+1
             String endTime = vo.getEndTime();
             endTime = DateUtil.format(org.apache.commons.lang.time.DateUtils.addDays(DateUtil.parse(endTime, "yyyy-MM-dd hh:mm"), 1), "yyyy-MM-dd hh:mm");
@@ -80,7 +91,7 @@ public class BusinessUserOpinionController {
         List<AssessmentUserVOS> result = this.userOpinionFlowService.queryUserAssessmentPage(vo);
         result.forEach(vos -> {
             List<UserOpinionFile> files = this.userOpinionFileService.selectUserOpinionFileByUserOpinionKey(vos.getUserOpinionId());
-            if(files != null && files.size() > 0){
+            if (files != null && files.size() > 0) {
                 vos.setFileUrlList(files.stream().map(UserOpinionFile::getFileUrl).distinct().collect(Collectors.toList()));
             }
             vos.setOperation("qufq".equals(AuthUtil.getUserName()));
@@ -94,6 +105,7 @@ public class BusinessUserOpinionController {
 
     /**
      * 获取所有工单及处理进度
+     *
      * @param query 分页信息
      * @return 结果
      */
@@ -103,12 +115,13 @@ public class BusinessUserOpinionController {
     @ApiImplicitParams({
             @ApiImplicitParam(name = "query", value = "分页信息", required = true)
     })
-    public R<IPage<BusinessUserOpinionVO>> queryBusinessUserOpinionListAll(Query query){
+    public R<IPage<BusinessUserOpinionVO>> queryBusinessUserOpinionListAll(Query query) {
         return R.data(this.userOpinionService.queryBusinessUserOpinionListAll(query));
     }
 
     /**
      * 业务人员提交环节操作
+     *
      * @return 结果
      */
     @PostMapping("/manageUserOperationStatus")
@@ -119,9 +132,9 @@ public class BusinessUserOpinionController {
             @ApiImplicitParam(name = "newNumber", value = "当前流程次数", required = true),
             @ApiImplicitParam(name = "currentLinkId", value = "当前环节ID", required = true)
     })
-    public R<Boolean> manageUserOperationStatus(@RequestParam String userOpinionId, @RequestParam Integer currentLink, @RequestParam Integer newNumber, @RequestParam String currentLinkId, String manageTime){
+    public R<Boolean> manageUserOperationStatus(@RequestParam String userOpinionId, @RequestParam Integer currentLink, @RequestParam Integer newNumber, @RequestParam String currentLinkId, String manageTime) {
 
-        if(StringUtils.isEmpty(currentLinkId)){
+        if (StringUtils.isEmpty(currentLinkId)) {
             return R.data(-1, false, "缺少currentLinkId参数");
         }
         //获取当前操作用户
@@ -135,15 +148,15 @@ public class BusinessUserOpinionController {
 
         //找到当前环节的下一环节
         Long nextLink = null, nextLinkEnd = null;
-        if(StringUtils.isEmpty(manageTime) && new Integer("3").equals(currentLink)){
+        if (StringUtils.isEmpty(manageTime) && new Integer("3").equals(currentLink)) {
             //直接提交完结
             nextLink = flowVOS.get(2).getId();
             nextLinkEnd = flowVOS.get(3).getId();
         } else {
-            for(int i = 0, l = flowVOS.size(); i < l; i ++){
-                if(new Long(currentLinkId).equals(flowVOS.get(i).getId())){
+            for (int i = 0, l = flowVOS.size(); i < l; i++) {
+                if (new Long(currentLinkId).equals(flowVOS.get(i).getId())) {
                     //找到下一个环节ID
-                    switch (i){
+                    switch (i) {
                         case 1:
                             //说明当前环节是提交"进入人工处理环节"操作
                             nextLink = flowVOS.get(i + 1).getId();
@@ -162,8 +175,8 @@ public class BusinessUserOpinionController {
 
         //将当前环节更改为已完成
         boolean result = this.userOpinionFlowService.update(Wrappers.<UserOpinionFlow>lambdaUpdate().set(UserOpinionFlow::getIsCurrent, 2).set(UserOpinionFlow::getUpdateUser, user.getUserId()).set(UserOpinionFlow::getUpdateTime, new Date()).eq(UserOpinionFlow::getId, currentLinkId));
-        if(result){
-            if(StringUtils.isEmpty(manageTime)){
+        if (result) {
+            if (StringUtils.isEmpty(manageTime)) {
                 manageTime = DateUtils.formatDate(new Date(), "yyyy-MM-dd");
             } else {
                 //更新预计时间
@@ -173,21 +186,21 @@ public class BusinessUserOpinionController {
             //内容
             String content = "";
 
-            if(nextLink != null && StringUtils.isNotEmpty(String.valueOf(nextLink))){
+            if (nextLink != null && StringUtils.isNotEmpty(String.valueOf(nextLink))) {
                 content = "用户" + userOpinion.getCreateUserName() + ",您好,您所提交的【" + userOpinion.getProblemType() + ":" + userOpinion.getOpinionContent() + "】工单服务已经进入人工处理环节,处理人:" + AuthUtil.getNickName();
 
                 //提交"进入人工处理环节"操作
                 result = this.userOpinionFlowService.update(Wrappers.<UserOpinionFlow>lambdaUpdate().set(UserOpinionFlow::getReplyContent, "预计" + manageTime + "之前完成").set(UserOpinionFlow::getUpdateTime, new Date()).set(UserOpinionFlow::getIsCurrent, new Integer("3").equals(currentLink) ? 2 : 1).eq(UserOpinionFlow::getId, nextLink));
             }
-            if(nextLinkEnd != null && StringUtils.isNotEmpty(String.valueOf(nextLinkEnd))){
+            if (nextLinkEnd != null && StringUtils.isNotEmpty(String.valueOf(nextLinkEnd))) {
                 content = "用户" + userOpinion.getCreateUserName() + ",您好,您所提交的【" + userOpinion.getProblemType() + ":" + userOpinion.getOpinionContent() + "】工单服务已解决,请及时查看,处理人:" + AuthUtil.getNickName();
 
                 //提交"已解决"操作
                 result = this.userOpinionFlowService.update(Wrappers.<UserOpinionFlow>lambdaUpdate().set(UserOpinionFlow::getUpdateTime, new Date()).set(UserOpinionFlow::getIsCurrent, 2).eq(UserOpinionFlow::getId, nextLinkEnd));
             }
 
-            try{
-                if(StringUtils.isNotEmpty(content)){
+            try {
+                if (StringUtils.isNotEmpty(content)) {
                     this.messageWarningClient.savePushUserMessageWarning(new MessageWarningVO(
                             userOpinion.getProjectId(),
                             userOpinion.getContractId(),
@@ -197,7 +210,14 @@ public class BusinessUserOpinionController {
                             0
                     ));
                 }
-            }catch (Exception e){
+
+                //通过WebSocket推送数量条数推送给反馈人
+                if (ObjectUtil.isNotEmpty(userOpinion.getProjectId()) && ObjectUtil.isNotEmpty(userOpinion.getContractId()) && ObjectUtil.isNotEmpty(userOpinion.getCreateUser())) {
+                    Map<String, String> stringMap = iTaskService.getTaskCount(userOpinion.getProjectId().toString(), userOpinion.getContractId().toString(), userOpinion.getCreateUser().toString());
+                    webSocket.sendMessageByUserId(userOpinion.getCreateUser().toString(), JSON.toJSONString(stringMap));
+                }
+
+            } catch (Exception e) {
                 e.printStackTrace();
             }
 
@@ -208,6 +228,7 @@ public class BusinessUserOpinionController {
 
     /**
      * 获取分配给当前登录用户的工单记录
+     *
      * @return 结果集
      */
     @GetMapping("/queryBusinessUserOpinionList")
@@ -217,13 +238,13 @@ public class BusinessUserOpinionController {
             @ApiImplicitParam(name = "current", value = "当前页", required = true),
             @ApiImplicitParam(name = "size", value = "当前页显示数量", required = true)
     })
-    public R<IPage<BusinessUserOpinionVO>> queryBusinessUserOpinionList(@RequestParam Integer current, @RequestParam Integer size){
+    public R<IPage<BusinessUserOpinionVO>> queryBusinessUserOpinionList(@RequestParam Integer current, @RequestParam Integer size) {
         BladeUser user = AuthUtil.getUser();
         Query query = new Query();
         query.setCurrent(current);
         query.setSize(size);
         //获取推送给当前用户的工单信息
-        return R.data(this.userOpinionService.queryBusinessUserOpinionList(String.valueOf(user.getUserId()),query));
+        return R.data(this.userOpinionService.queryBusinessUserOpinionList(String.valueOf(user.getUserId()), query));
     }
 
 }

+ 48 - 29
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -505,8 +505,8 @@ public class InformationWriteQueryController extends BladeController {
     public R<String> queryNodeStatus(@RequestParam String primaryKeyId, @RequestParam String classify) {
         //记录状态
         String status = "1";
-        //查询填报状态
-        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify).ne(InformationQuery::getType, 3));
+        //查询填报状态,type=1资料填报
+        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify).eq(InformationQuery::getType, 1));
         if (businessData != null) {
             switch (businessData.getStatus()) {
                 case 0:
@@ -561,8 +561,8 @@ public class InformationWriteQueryController extends BladeController {
     public R<String> queryNodeStatusTrial(@RequestParam String classify, @RequestParam String id) {
         //记录状态
         String status = "1";
-        //查询填报状态
-        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, id).eq(InformationQuery::getClassify, classify).ne(InformationQuery::getType, 3));
+        //查询填报状态,type=2试验
+        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, id).eq(InformationQuery::getClassify, classify).eq(InformationQuery::getType, 2));
         if (businessData != null) {
             switch (businessData.getStatus()) {
                 case 0:
@@ -1011,9 +1011,9 @@ public class InformationWriteQueryController extends BladeController {
     public R<Boolean> diySort(@RequestBody DiySortVO vo) {
         //对整棵树进行排序(资料查询需要同步显示排序)采用自增
         List<String> sortLists = vo.getSortList();
-        String id = sortLists.stream().map(String::valueOf).findAny().orElse(null);
-        WbsTreeContract wbsTreeContract = wbsTreeContractClient.getContractNodeByPrimaryKeyId(id);
 
+        /*String id = sortLists.stream().map(String::valueOf).findAny().orElse(null);
+        WbsTreeContract wbsTreeContract = wbsTreeContractClient.getContractNodeByPrimaryKeyId(id);
         //当前项目全部填报资料
         List<InformationQuery> informationQueries = informationQueryService.getBaseMapper().selectList(Wrappers.<InformationQuery>lambdaQuery()
                 .eq(InformationQuery::getProjectId, wbsTreeContract.getProjectId())
@@ -1031,7 +1031,7 @@ public class InformationWriteQueryController extends BladeController {
             List<WbsTreeContract> rootNodes = list.stream().filter(f -> ObjectUtil.isNotEmpty(f.getParentId()) && f.getParentId() == 0).collect(Collectors.toList());
             List<InformationQuery> infos = new ArrayList<>();
             int sort = 2;
-            this.diySortRecursion(list, rootNodes, sort, informationQueries, infos);
+            //this.diySortRecursion(list, rootNodes, sort, informationQueries, infos);
 
             //修改资料查询sort、节点sort
             for (InformationQuery info : infos) {
@@ -1055,13 +1055,13 @@ public class InformationWriteQueryController extends BladeController {
                     }
                 }
             }
-            return R.data(true);
-        }
-        return R.data(false);
+            */
+
+        return R.status(wbsTreeContractClient.diySort(sortLists));
     }
 
     //递归排序
-    private void diySortRecursion(List<WbsTreeContract> list, List<WbsTreeContract> rootNodes, int sort, List<InformationQuery> informationQueries, List<InformationQuery> infos) {
+    /*private void diySortRecursion(List<WbsTreeContract> list, List<WbsTreeContract> rootNodes, int sort, List<InformationQuery> informationQueries, List<InformationQuery> infos) {
         if (ObjectUtil.isNotEmpty(rootNodes)) {
             List<WbsTreeContract> parentNodes = new ArrayList<>();
             for (WbsTreeContract wbsTreeContract : list) {
@@ -1087,7 +1087,7 @@ public class InformationWriteQueryController extends BladeController {
                 this.diySortRecursion(list, parentNodes, sort, informationQueries, infos);
             }
         }
-    }
+    }*/
 
     /**
      * 复制节点
@@ -1119,7 +1119,6 @@ public class InformationWriteQueryController extends BladeController {
                 if (!contractAllNodeMap.containsKey(contractTree.getId().toString())) {
                     contractAllNodeMap.put(contractTree.getId().toString(), new ArrayList<>());
                 }
-
             });
         }
 
@@ -1161,7 +1160,6 @@ public class InformationWriteQueryController extends BladeController {
                         newData.setOldId(node.getId().toString());
                     }
 
-
                     //设置新ID
                     if (new Integer("1").equals(node.getType())) {
                         //如果是节点类型才重塑ID
@@ -1189,6 +1187,14 @@ public class InformationWriteQueryController extends BladeController {
                     newData.setPdfUrl(null);
                     newData.setCreateUser(AuthUtil.getUserId());
 
+                    //获取当前所有复制的节点的最大sort
+                    String sql = "select sort from m_wbs_tree_contract where contract_id = '" + node.getContractId() + "' and (id = '" + node.getId() + "' or old_id = '" + node.getId() + "')";
+                    List<WbsTreeContract> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+                    List<Integer> collect = query.stream().map(WbsTreeContract::getSort).collect(Collectors.toList());
+                    Integer max = collect.stream().reduce(collect.get(0), Integer::max);
+                    //设置sort
+                    newData.setSort(max);
+
                     //重塑父节点关联关系
                     this.restoreParent(newData, oldToNewIdMap);
 
@@ -1394,14 +1400,14 @@ public class InformationWriteQueryController extends BladeController {
             @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
     })
     public R<List<WbsTreeContractTreeVOS>> queryMappingStructureTree(@RequestParam String parentId, @RequestParam String contractId, @RequestParam String contractIdRelation) {
-        List<WbsTreeContractTreeVOS> result = this.queryContractTree(parentId, contractId, contractIdRelation);
+        List<WbsTreeContractTreeVOS> result = this.queryContractTree(parentId, contractId, contractIdRelation, null);
         if (result.size() == 1) {
             //只有一个子节点,继续向下
             int size;
             WbsTreeContractTreeVOS vos = result.get(0);
             do {
                 try {
-                    List<WbsTreeContractTreeVOS> childResult = this.queryContractTree(vos.getId().toString(), contractId, vos.getContractIdRelation());
+                    List<WbsTreeContractTreeVOS> childResult = this.queryContractTree(vos.getId().toString(), contractId, vos.getContractIdRelation(), null);
 
                     vos.setChildren(childResult);
                     size = childResult.size();
@@ -1683,6 +1689,14 @@ public class InformationWriteQueryController extends BladeController {
                     newData.setIsTypePrivatePid(half.getPKeyId());
                 }
 
+                //获取当前所有复制的节点的最大sort
+                String sql = "select sort from m_wbs_tree_contract where contract_id = '" + treeContract.getContractId() + "' and (id = '" + half.getId() + "' or old_id = '" + half.getId() + "')";
+                List<WbsTreeContract> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+                List<Integer> collect = query.stream().map(WbsTreeContract::getSort).collect(Collectors.toList());
+                Integer max = collect.stream().reduce(collect.get(0), Integer::max);
+                //设置sort
+                newData.setSort(max);
+
                 //设置节点名称
                 for (AddContractTreeNodeVO.Node addVO : selectList) {
                     if (half.getPKeyId().toString().equals(addVO.getPrimaryKeyId())) {
@@ -1970,9 +1984,9 @@ public class InformationWriteQueryController extends BladeController {
 
         if (!new Integer("6").equals(node.getNodeType()) && !Arrays.asList("1,2,3,4".split(",")).contains(node.getMajorDataType().toString())) {
             //不是工序,则查询当前节点下的所有填报节点
-            if (node.getParentId() == 0){
+            if (node.getParentId() == 0) {
                 String contractId = node.getContractId();
-                List<WbsTreeContract> treeS = wbsTreeContractClient.getContractWbsTreeByParentId(node.getId().toString(),contractId);
+                List<WbsTreeContract> treeS = wbsTreeContractClient.getContractWbsTreeByParentId(node.getId().toString(), contractId);
                 for (WbsTreeContract tree : treeS) {
                     List<QueryProcessDataVO> queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(tree.getId().toString(), contract.getContractType(), StringUtils.isNotEmpty(vo.getContractIdRelation()) ? vo.getContractIdRelation() : vo.getContractId().toString());
                     if (queryDataResult != null && queryDataResult.size() > 0) {
@@ -1980,7 +1994,7 @@ public class InformationWriteQueryController extends BladeController {
                         queryDataResult.clear();
                     }
                 }
-            }else {
+            } else {
                 List<QueryProcessDataVO> queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(node.getId().toString(), contract.getContractType(), StringUtils.isNotEmpty(vo.getContractIdRelation()) ? vo.getContractIdRelation() : vo.getContractId().toString());
                 if (StringUtils.isNotEmpty(vo.getIsFirst())) {
                     //如果是首件列表请求,则删掉没有标记为首件的数据
@@ -2016,7 +2030,7 @@ public class InformationWriteQueryController extends BladeController {
         if (StringUtils.isNotEmpty(primaryKeyId)) {
             parentId = primaryKeyId;
         }
-        List<WbsTreeContractTreeVOS> rootTreeNode = this.queryContractTree(parentId, contractId, contractIdRelation);
+        List<WbsTreeContractTreeVOS> rootTreeNode = this.queryContractTree(parentId, contractId, contractIdRelation, null);
         rootTreeNode.removeIf(vos -> (vos.getNodeType() != null && vos.getNodeType() == 111));
 
         return R.data(rootTreeNode);
@@ -2032,13 +2046,18 @@ public class InformationWriteQueryController extends BladeController {
     @ApiOperation(value = "获取当前合同段的划分树")
     @ApiImplicitParams(value = {
             @ApiImplicitParam(name = "parentId", value = "父节点,为空则查询第一级节点"),
-            @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
+            @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true),
+            @ApiImplicitParam(name = "classifyType", value = "所属方,监理、总监办的资料查询使用,=1施工数据(默认),=2监理数据")
     })
-    public R<List<WbsTreeContractTreeVOS>> queryContractWbsTreeByContractIdAndType(@RequestParam String primaryKeyId, @RequestParam String parentId, @RequestParam String contractId, @RequestParam String contractIdRelation) {
+    public R<List<WbsTreeContractTreeVOS>> queryContractWbsTreeByContractIdAndType(@RequestParam String primaryKeyId,
+                                                                                   @RequestParam String parentId,
+                                                                                   @RequestParam String contractId,
+                                                                                   @RequestParam String contractIdRelation,
+                                                                                   String classifyType) {
         if (StringUtils.isNotEmpty(primaryKeyId)) {
             parentId = primaryKeyId;
         }
-        return R.data(this.queryContractTree(parentId, contractId, contractIdRelation));
+        return R.data(this.queryContractTree(parentId, contractId, contractIdRelation, classifyType));
     }
 
     /**
@@ -2083,7 +2102,7 @@ public class InformationWriteQueryController extends BladeController {
             @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
     })
     public R<List<WbsTreeContractTreeVOS>> queryContractWbsTreeByFirstInfo(@RequestParam String parentId, @RequestParam String contractId, @RequestParam String contractIdRelation) {
-        List<WbsTreeContractTreeVOS> rootTreeNode = this.queryContractTree(parentId, contractId, contractIdRelation);
+        List<WbsTreeContractTreeVOS> rootTreeNode = this.queryContractTree(parentId, contractId, contractIdRelation, null);
         //查询被标记为首件的数据
         rootTreeNode = rootTreeNode.stream().filter(WbsTreeContractTreeVOS::getIsFirst).collect(Collectors.toList());
 
@@ -2093,7 +2112,7 @@ public class InformationWriteQueryController extends BladeController {
     /**
      * 查询合同段划分树公共代码
      */
-    private List<WbsTreeContractTreeVOS> queryContractTree(String parentId, String contractId, String contractIdRelation) {
+    private List<WbsTreeContractTreeVOS> queryContractTree(String parentId, String contractId, String contractIdRelation, String classifyType) {
         List<WbsTreeContractTreeVOS> rootTreeNode;
 
         //获取合同段,检查是否是监理合同段
@@ -2107,17 +2126,17 @@ public class InformationWriteQueryController extends BladeController {
                 contractIds.add(contractIdRelation);
             }
             if (contractIds.size() > 0) {
+                //原始classify=2时查不出数量统计,所以改成传1
                 if (StringUtils.isNotEmpty(parentId)) {
                     //子节点
-                    rootTreeNode = this.informationQueryService.queryContractTreeSupervision(contractIds, parentId, 1);
+                    rootTreeNode = this.informationQueryService.queryContractTreeSupervision(contractIds, parentId, Integer.parseInt(classifyType));
                 } else {
                     //根节点
-                    //classify = 2 时查不出数量统计,改成传1
-                    rootTreeNode = this.informationQueryService.queryContractTreeSupervision(contractIds, "0", 1);
+                    rootTreeNode = this.informationQueryService.queryContractTreeSupervision(contractIds, "0", Integer.parseInt(classifyType));
 
                     //设置根节点数量统计
                     for (WbsTreeContractTreeVOS root : rootTreeNode) {
-                        List<WbsTreeContractTreeVOS> rootZi = this.informationQueryService.queryContractTreeSupervision(Func.toStrList(root.getContractIdRelation()), root.getId().toString(), 1);
+                        List<WbsTreeContractTreeVOS> rootZi = this.informationQueryService.queryContractTreeSupervision(Func.toStrList(root.getContractIdRelation()), root.getId().toString(), Integer.parseInt(classifyType));
                         List<Long> collect = rootZi.stream().map(WbsTreeContractTreeVOS::getSubmitCounts).collect(Collectors.toList());
                         Long reduce = collect.stream().reduce(0L, Long::sum);
                         root.setSubmitCounts(reduce);

+ 7 - 3
blade-service/blade-business/src/main/java/org/springblade/business/controller/MessageWarningController.java

@@ -277,13 +277,16 @@ public class MessageWarningController extends BladeController {
         for (Map.Entry<String, String> entry : message) {
             String userId = entry.getKey();
             String projectAndContractId = entry.getValue();
-
-            if (StringUtils.isNotEmpty(projectAndContractId) && StringUtils.isNotEmpty(userId)) {
-
+            if (projectAndContractId.contains(",") && StringUtils.isNotEmpty(userId)) {
+                //客户端
                 String projectId = projectAndContractId.split(",")[0];
                 String contractId = projectAndContractId.split(",")[1];
                 Map<String, String> stringMap = iTaskService.getTaskCount(projectId, contractId, userId);
                 maps.add(stringMap);
+            } else {
+                //后管
+                Map<String, String> stringMap = iTaskService.getTaskCount(null, null, userId);
+                maps.add(stringMap);
             }
         }
 
@@ -292,6 +295,7 @@ public class MessageWarningController extends BladeController {
             webSocketMap.get(userId).sendMessage(JSON.toJSONString(map));
             logger.info("给用户{}重发消息{}", userId, map);
         }
+
         logger.info("定时重发消息WebSocket,reSendMessage()方法执行结束");
     }
 

+ 80 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/MetadataController.java

@@ -0,0 +1,80 @@
+package org.springblade.business.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.AllArgsConstructor;
+import org.springblade.business.entity.MetadataClassification;
+import org.springblade.business.mapper.MetadataClassificationMapper;
+import org.springblade.business.service.IMetadataClassificationService;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.validation.Valid;
+import java.util.Map;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/metadata")
+@Api(value = "元数据容器", tags = "元数据容器接口")
+public class MetadataController extends BladeController {
+    private final IMetadataClassificationService iMetadataClassificationService;
+    private final MetadataClassificationMapper metadataClassificationMapper;
+
+
+    @GetMapping("/classification/detail")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "元数据容器分类详情", notes = "传入分类类型")
+    public R<IPage<MetadataClassification>> classificationDetail(@ApiIgnore @RequestParam Map<String, Object> log, Query query) {
+        IPage<MetadataClassification> page = iMetadataClassificationService.page(Condition.getPage(query), Condition.getQueryWrapper(log, MetadataClassification.class));
+        return R.data(page);
+    }
+
+    @PostMapping("/classification/submit")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "元数据新增或修改", notes = "传入MetadataClassification")
+    public R<Object> classificationSubmit(@RequestBody MetadataClassification obj) {
+        return R.status(iMetadataClassificationService.classificationSubmit(obj));
+    }
+
+    /**
+     * 删除
+     */
+    @PostMapping("/remove")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "逻辑删除", notes = "传入ids")
+    public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+        return R.status(iMetadataClassificationService.deleteLogic(Func.toLongList(ids)));
+    }
+
+    /**
+     * 设置分类
+     */
+    @PostMapping("/allocation")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "设置分类", notes = "传入ids")
+    public R allocation(@ApiParam(value = "主键集合", required = true) @RequestParam String ids,@RequestParam String type) {
+        return R.status(iMetadataClassificationService.updateMetadataBytype(Func.toLongList(ids),type));
+    }
+
+    /**
+     * 查看没有设置当前分类的元数据容器
+     */
+    @GetMapping("/allocation/detail")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "元数据容器分类详情", notes = "传入分类类型")
+    public R<IPage<MetadataClassification>> allocationDetail(@ApiIgnore @RequestParam String fileStorage, Query query) {
+        QueryWrapper<MetadataClassification> metadata = new QueryWrapper<>();
+        metadata.lambda().ne(MetadataClassification :: getFileStorageType,fileStorage).eq(MetadataClassification::getIsDeleted,0);
+        IPage<MetadataClassification> page = iMetadataClassificationService.page(Condition.getPage(query), metadata);
+        return R.data(page);
+    }
+}

+ 75 - 47
blade-service/blade-business/src/main/java/org/springblade/business/controller/NeiYeController.java

@@ -77,10 +77,22 @@ public class NeiYeController {
                 node = this.wbsTreeContractClient.getContractWbsTreeByContractIdAndId(Long.parseLong(queryVO.getWbsIds().get(0)), Long.parseLong(contractId));
             }
             //不是工序,则查询当前节点下的所有填报节点
-            List<QueryProcessDataVO> queryDataResult;
+            List<QueryProcessDataVO> queryDataResult = new ArrayList<>();
             if(!new Integer("6").equals(node.getNodeType()) && !Arrays.asList("1,2,3,4".split(",")).contains(node.getMajorDataType().toString())){
                 //非填报节点
-                queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(node.getId().toString(), contract.getContractType(), contractId);
+                if (node.getParentId() == 0){
+                    String contractI = node.getContractId();
+                    List<WbsTreeContract> treeS = wbsTreeContractClient.getContractWbsTreeByParentId(node.getId().toString(),contractI);
+                    for (WbsTreeContract tree : treeS) {
+                        List<QueryProcessDataVO> dataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(tree.getId().toString(), contract.getContractType(), contractId);
+                        if (dataResult != null && dataResult.size() > 0) {
+                            queryDataResult.addAll(dataResult);
+                            dataResult.clear();
+                        }
+                    }
+                }else {
+                    queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(node.getId().toString(), contract.getContractType(), contractId);
+                }
             } else {
                 //填报节点
                 queryDataResult = this.informationQueryService.queryProcessDataByPrimaryKeyIdAndClassify(node.getPKeyId().toString(), contract.getContractType());
@@ -91,8 +103,14 @@ public class NeiYeController {
                 queryDataResult.removeIf(query -> StringUtils.isNotEmpty(query.getQueryType()) && "3".equals(query.getQueryType()));
                 //过滤Evaluate
                 queryDataResult.stream().forEach(qdr->{
-                    if ("2".equals(qdr.getStatus()+"")){
+                    Integer status = qdr.getStatus();
+                    if (status == null){
+                        qdr.setStatus(0);
+                        qdr.setEvaluate("false");
+                    }else if (status.equals(2)){
                         qdr.setEvaluate("true");
+                    }else {
+                        qdr.setEvaluate("false");
                     }
                 });
                 String isEvaluate = String.valueOf(queryVO.getIsEvaluate());
@@ -106,9 +124,59 @@ public class NeiYeController {
                 //审批状态
                 String taskStatus = queryVO.getTaskStatus();
                 if (!"".equals(taskStatus) && !"null".equals(taskStatus) && taskStatus != null) {
-                    Integer status = Integer.parseInt(taskStatus) - 1;
+                    Integer sta = Integer.valueOf(taskStatus) -1;
+                    queryDataResult = queryDataResult.stream()
+                            .filter(qdr->sta.equals(qdr.getStatus())).collect(Collectors.toList());
+                }
+                if (queryDataResult.size() <= 0){
+                    return R.data(300, null, "未查询到数据");
+                }
+                //过滤输入框条件
+                String queryStr = queryVO.getQueryStr();
+                if (!"".equals(queryStr) && !"null".equals(queryStr) && queryStr != null){
+                    String contractId1 = queryVO.getContractId();
+                    queryDataResult = queryDataResult.stream()
+                            .filter(qdr->{
+                                StringBuilder str = new StringBuilder();
+                                Map<String, String> map = new HashMap<>();
+                                foreachGetParent(map, idToNodeMap, qdr.getParentId(), contractId1);
+                                str.append(map.get("unitProject"));
+                                if (map.get("partProject") != null && map.get("partProject") != "")
+                                    str.append(map.get("partProject"));
+                                if (map.get("partChildProject") != null && map.get("partChildProject") != "")
+                                    str.append(map.get("partChildProject"));
+                                if (map.get("subentryProject") != null && map.get("subentryProject") != "")
+                                    str.append(map.get("subentryProject"));
+                                if (map.get("subentryChildProject") != null && map.get("subentryChildProject") != "")
+                                    str.append(map.get("subentryChildProject"));
+                                if (  qdr.getTitle() != null &&   qdr.getTitle()!= "")
+                                    str.append(qdr.getTitle());
+                                return str.toString().toUpperCase().contains(queryStr.toUpperCase())?true:false;
+                            }).collect(Collectors.toList());
+                }
+                if (queryDataResult.size() <= 0){
+                    return R.data(300, null, "未查询到数据");
+                }
+                //上报批次
+                for (QueryProcessDataVO vo : queryDataResult) {
+                    if (vo.getInformationQueryId() != null && vo.getStatus() != 0){
+                        List<Task> tasks = taskClient.queryTaskListByFormDataId(vo.getInformationQueryId());
+                        Task task = new Task();
+                        if (tasks == null || tasks.size() <= 0){
+                            task.setBatch(0);
+                        }else {
+                            tasks = tasks.stream().sorted(Comparator.comparing(e -> e.getCreateTime())).collect(Collectors.toList());
+                            task = tasks.get(tasks.size() - 1);
+                        }
+                        vo.setReportNumber(task.getBatch()+"");
+                    }else {
+                        vo.setReportNumber("0");
+                    }
+                }
+                String reportNumber = queryVO.getReportNumber();
+                if (!"".equals(reportNumber) && !"null".equals(reportNumber) && reportNumber != null) {
                     queryDataResult = queryDataResult.stream()
-                            .filter(qdr->status.equals(qdr.getStatus())).collect(Collectors.toList());
+                            .filter(qdr->reportNumber.equals(qdr.getReportNumber())).collect(Collectors.toList());
                 }
                 if (queryDataResult.size() <= 0){
                     return R.data(300, null, "未查询到数据");
@@ -147,46 +215,6 @@ public class NeiYeController {
                         }
                     }
                     //todo 当前缺少是否关联评定、是否关联试验 =================================
-                    //过滤输入框条件
-                    String queryStr = queryVO.getQueryStr();
-                    if (!"".equals(queryStr) && !"null".equals(queryStr) && queryStr != null){
-                        StringBuilder str = new StringBuilder();
-                        str.append(map.get("unitProject"));
-                        if (map.get("partProject") != null && map.get("partProject")!= "")
-                            str.append(map.get("partProject"));
-                        if (map.get("partChildProject") != null && map.get("partChildProject")!= "")
-                            str.append(map.get("partChildProject"));
-                        if (map.get("subentryProject") != null && map.get("subentryProject")!= "")
-                            str.append(map.get("subentryProject"));
-                        if (map.get("subentryChildProject") != null && map.get("subentryChildProject")!= "")
-                            str.append(map.get("subentryChildProject"));
-                        if (  vo.getTitle() != null &&   vo.getTitle()!= "")
-                            str.append(vo.getTitle());
-                        if (!str.toString().toUpperCase().contains(queryStr.toUpperCase()))
-                            continue;
-                    }
-                    //上报批次
-                    if (vo.getInformationQueryId() != null){
-                        List<Task> tasks = taskClient.queryTaskListByFormDataId(vo.getInformationQueryId());
-                        Task task;
-                        if (tasks == null || tasks.size() <= 0){
-                            task = new Task();
-                            task.setBatch(0);
-                        }else {
-                            tasks = tasks.stream().sorted(Comparator.comparing(e -> e.getCreateTime())).collect(Collectors.toList());
-                            task = tasks.get(tasks.size() - 1);
-                        }
-                        map.put("reportNumber",task.getBatch()+"");
-                        String reportNumber = queryVO.getReportNumber();
-                        if (!"".equals(reportNumber) && !"null".equals(reportNumber) && reportNumber != null) {
-                            int anInt = Integer.parseInt(reportNumber);
-                            if (task.getBatch() != anInt){
-                                continue;
-                            }
-                        }
-                    }else {
-                        map.put("reportNumber","0");
-                    }
                     //新增列表数据
                     neiYeLedgerVOList.add(new NeiYeLedgerVO(map.get("unitProject"),
                             map.get("partProject"),
@@ -199,7 +227,7 @@ public class NeiYeController {
                             new Integer("1").equals(vo.getStatus()) ? "待审批" : new Integer("2").equals(vo.getStatus()) ? "已审批" : "未上报",
                             vo.getEvaluate(),
                             "false",
-                            map.get("reportNumber")));
+                            vo.getReportNumber()));
                 }
                 //转换为page信息
                 Query query = new Query();
@@ -222,7 +250,7 @@ public class NeiYeController {
      * @param parentId 父节点
      */
     private void foreachGetParent(Map<String,String> resultMap, Map<String,WbsTreeContractTreeVOS> vosMap, String parentId, String contractId){
-        if(vosMap.containsKey(parentId) || !"0".equals(parentId.trim())){
+        if(vosMap.containsKey(parentId)){
             //存在父节点信息,获取
             WbsTreeContractTreeVOS vos = vosMap.get(parentId);
             if(new Integer("1").equals(vos.getNodeType())){

+ 19 - 4
blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionController.java

@@ -1,5 +1,6 @@
 package org.springblade.business.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -14,9 +15,8 @@ import org.springblade.business.entity.UserOpinionFile;
 import org.springblade.business.entity.UserOpinionFlow;
 import org.springblade.business.entity.UserOpinionGood;
 import org.springblade.business.feign.MessageWarningClient;
-import org.springblade.business.service.IUserOpinionFileService;
-import org.springblade.business.service.IUserOpinionFlowService;
-import org.springblade.business.service.IUserOpinionGoodService;
+import org.springblade.business.service.*;
+import org.springblade.business.socket.WebSocket;
 import org.springblade.business.vo.MessageWarningVO;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.mp.support.Condition;
@@ -26,6 +26,7 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ProjectInfo;
@@ -43,9 +44,9 @@ import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.business.entity.UserOpinion;
 import org.springblade.business.vo.UserOpinionVO;
-import org.springblade.business.service.IUserOpinionService;
 import org.springblade.core.boot.ctrl.BladeController;
 
+import java.io.IOException;
 import java.util.*;
 
 /**
@@ -80,6 +81,10 @@ public class UserOpinionController extends BladeController {
 
 	private final ProjectClient projectClient;
 
+	private final ITaskService iTaskService;
+
+	private final WebSocket webSocket;
+
 	/**
 	 * 取消点赞
 	 * @param userOpinionId 工单ID
@@ -285,6 +290,16 @@ public class UserOpinionController extends BladeController {
 					0
 			));
 
+			//通过WebSocket推送数量条数,推送到对应维护人的工单反馈中
+			if (ObjectUtil.isNotEmpty(userOpinionVo.getProjectId()) && ObjectUtil.isNotEmpty(userOpinionVo.getContractId()) && ObjectUtil.isNotEmpty(manageUser)) {
+				Map<String, String> stringMap = iTaskService.getTaskCount(userOpinionVo.getProjectId().toString(), userOpinionVo.getContractId().toString(), manageUser.toString());
+				try {
+					webSocket.sendMessageByUserId(manageUser.toString(), JSON.toJSONString(stringMap));
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+
 		}catch (Exception e){
 			e.printStackTrace();
 		}

+ 1 - 2
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/InformationQueryClientImpl.java

@@ -46,7 +46,7 @@ public class InformationQueryClientImpl implements InformationQueryClient {
     }
 
     @Override
-    public void saveData(String id, String projectId, String contractId, String classify, String link,String trialProjectName) {
+    public void saveData(String id, String projectId, String contractId, String classify, String link, String trialProjectName) {
         InformationQuery obj = new InformationQuery();
         obj.setId(SnowFlakeUtil.getId());
         obj.setWbsId(Long.valueOf(id));
@@ -68,5 +68,4 @@ public class InformationQueryClientImpl implements InformationQueryClient {
         updateWrapper.eq(InformationQuery::getContractId, contractId);
         iInformationQueryService.update(null, updateWrapper);
     }
-
 }

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

@@ -32,6 +32,7 @@
         <result column="e_visa_pdf_url" property="eVisaPdfUrl"/>
         <result column="table_id" property="tableId"/>
         <result column="link_merge_pdf_url" property="linkMergePdfUrl"/>
+        <result column="sj_record_ids" property="sjRecordIds"/>
         <result column="sort" property="sort"/>
     </resultMap>
 
@@ -172,6 +173,7 @@
         and wtc.node_type != 111
         and wtc.type = 1
         and wtc.is_deleted= '0'
+        ORDER BY wtc.sort,wtc.create_time
     </select>
 
     <select id="queryContractTree" resultMap="queryContractTreeMap">
@@ -257,7 +259,7 @@
         AND wtc.parent_id = #{parentId}
         AND wtc.node_type != 111
         AND wtc.is_deleted= '0'
-        ORDER BY wtc.sort
+        ORDER BY wtc.sort,wtc.create_time
     </select>
 
     <select id="queryProcessDataByPrimaryKeyIdAndClassify" resultMap="queryProcessDataMap">
@@ -395,8 +397,7 @@
             query.file_user_id_and_name,
             query.pdf_url,
             query.e_visa_pdf_url,
-            query.sort as qSort,
-            (select sort from m_wbs_tree_contract c where c.p_key_id = query.wbs_id ) as sort
+            query.sj_record_ids
         from
         (
             select
@@ -411,7 +412,8 @@
                 date_format(create_time,'%Y-%m-%d') as createTimes,
                 pdf_url,
                 e_visa_pdf_url,
-                wbs_id
+                wbs_id,
+                sj_record_ids
             from u_information_query
             where
                 is_deleted = 0
@@ -436,7 +438,7 @@
         <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
             and query.createTimes between #{query.startTime} and #{query.endTime}
         </if>
-        order by sort,qSort
+        order by create_time desc
         limit #{current}, #{size}
     </select>
 

+ 20 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/MetadataClassificationMapper.java

@@ -0,0 +1,20 @@
+package org.springblade.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.business.entity.MetadataClassification;
+import org.springblade.business.entity.TrialContainerClassification;
+
+import java.util.HashMap;
+import java.util.List;
+
+public interface MetadataClassificationMapper extends BaseMapper<MetadataClassification> {
+
+
+    MetadataClassification classificationDetail(@Param("type") Integer type);
+    void alterTabFiled(@Param("tabName") String containerInitTabName, @Param("fieldName") String initTabFieldName, @Param("fieldType") String fieldType, @Param("fieldLength") Integer fieldLength);
+    void updateFiledType(@Param("tabName") String containerInitTabName, @Param("fieldName") String initTabFieldName, @Param("fieldType") String fieldType, @Param("fieldLength") Integer fieldLength);
+    MetadataClassification selectMetadaOne(@Param("containerName") String containerName,@Param("code") String code,@Param("fieldKey") String fieldKey,@Param("id") Long id);
+
+    void updateMetadataBytype(@Param("ids") List<Long> ids, @Param("type") String type);
+}

+ 78 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/MetadataClassificationMapper.xml

@@ -0,0 +1,78 @@
+<?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.MetadataClassificationMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="ResultEntityMap" type="org.springblade.business.entity.MetadataClassification">
+        <result column="id" property="id"/>
+        <result column="container_name" property="containerName"/>
+        <result column="field_type" property="fieldType"/>
+        <result column="code" property="code"/>
+        <result column="container_type" property="containerType"/>
+        <result column="capture_mode" property="captureMode"/>
+        <result column="mandatory_type" property="mandatoryType"/>
+        <result column="file_storage_type" property="fileStorageType"/>
+        <result column="field_key" property="fieldKey"/>
+        <result column="container_init_tab_name" property="containerInitTabName"/>
+        <result column="sort" property="sort"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+    </resultMap>
+
+    <insert id="insertData">
+        insert into ${tabName}(id,field_calibration_time,${fieldKeys}) values(${id},#{time},${fieldValues})
+    </insert>
+
+    <update id="updateFiledType">
+        alter table ${tabName} MODIFY ${fieldName} ${fieldType}(${fieldLength})
+    </update>
+
+    <update id="alterTabFiled">
+        alter table ${tabName} add column ${fieldName} ${fieldType}(${fieldLength})
+    </update>
+
+
+    <update id="deleteTableField">
+        alter table ${tabName} drop column ${fieldName}
+    </update>
+
+    <update id="updateData">
+        update ${tabName} set field_calibration_time = #{time}
+        <if test="values != null and values != '' ">${values}</if>
+        where id = ${id}
+    </update>
+
+    <delete id="removeData">
+        delete from ${tabName} where id in
+        <foreach collection="ids" item="ids" index="ids" open="(" separator="," close=")">
+            ${ids}
+        </foreach>
+    </delete>
+
+    <select id="selectTabDataAll" resultType="java.util.HashMap">
+        select * from ${tabName} order by id
+    </select>
+
+    <select id="selectLikeByFieldKey" resultType="java.util.HashMap">
+        select * from ${tabName} where ${fieldKey} like concat('%',#{queryValue},'%') order by id limit ${current},${size}
+    </select>
+
+    <select id="classificationDetail" resultMap="ResultEntityMap">
+        select * from u_metadata_classification where file_storage_type = #{type} order by create_time desc
+    </select>
+    <select id="selectMetadaOne" resultMap="ResultEntityMap">
+        select * from u_metadata_classification where (container_name = #{containerName} or code = #{code} or field_key = #{fieldKey} )
+        <if test="id != null and id != '' ">and id != #{id} </if>
+        order by create_time desc limit 1
+    </select>
+
+    <update id="updateMetadataBytype">
+        update u_metadata_classification set file_storage_type = CONCAT(file_storage_type, ',', #{type})
+        where id in(${ids}) and locate(#{type},file_storage_type) = 0
+    </update>
+</mapper>

+ 17 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/IMetadataClassificationService.java

@@ -0,0 +1,17 @@
+package org.springblade.business.service;
+
+
+import org.springblade.business.entity.MetadataClassification;
+import org.springblade.core.mp.base.BaseService;
+
+import java.util.List;
+
+public interface IMetadataClassificationService extends BaseService<MetadataClassification> {
+
+
+    MetadataClassification classificationDetail(Integer type);
+
+    boolean classificationSubmit(MetadataClassification obj);
+
+    boolean updateMetadataBytype(List<Long> ids,String type);
+}

+ 35 - 2
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java

@@ -149,7 +149,6 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
                 //获取pdfUrl
                 List<String> pdfUrls = linkList.stream().map(query -> StringUtils.isNotEmpty(query.getEVisaPdfUrl()) ? query.getEVisaPdfUrl() : query.getPdfUrl()).distinct().collect(Collectors.toList());
 
-
                 String mergeFileName = SnowFlakeUtil.getId() + ".pdf", margePdfPath = file_path + "/pdf//" + mergeFileName;
                 //合并
                 FileUtils.mergePdfPublicMethods(pdfUrls, margePdfPath);
@@ -228,6 +227,11 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
                 this.informationQueryFileService.save(file);
             }
 
+            List<String> linkIds = linkDataList.stream().map(json -> json.getString("id")).distinct().collect(Collectors.toList());
+            if (linkIds.size() > 0) {
+                oldData.setSjRecordIds(StringUtils.join(linkIds, ","));
+            }
+
             //修改数据
             this.baseMapper.updateById(oldData);
 
@@ -266,6 +270,11 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
 
             newData.setTableId(tableId);
 
+            List<String> linkIds = linkDataList.stream().map(json -> json.getString("id")).distinct().collect(Collectors.toList());
+            if (linkIds.size() > 0) {
+                newData.setSjRecordIds(StringUtils.join(linkIds, ","));
+            }
+
             //新增附件
             InformationQueryFile file = new InformationQueryFile();
             file.setQueryId(Long.parseLong(businessId));
@@ -320,6 +329,12 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
 
                 oldData.setUpdateTime(new Date());
                 oldData.setUpdateUser(user.getUserId());
+
+                List<String> linkIds = linkDataList.stream().map(json -> json.getString("id")).distinct().collect(Collectors.toList());
+                if (linkIds.size() > 0) {
+                    oldData.setSjRecordIds(StringUtils.join(linkIds, ","));
+                }
+
                 //修改数据
                 this.baseMapper.updateById(oldData);
             } else {
@@ -349,6 +364,12 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
                 newData.setSourceType(sourceType);
                 newData.setCreateUser(user.getUserId());
                 newData.setCreateTime(new Date());
+
+                List<String> linkIds = linkDataList.stream().map(json -> json.getString("id")).distinct().collect(Collectors.toList());
+                if (linkIds.size() > 0) {
+                    newData.setSjRecordIds(StringUtils.join(linkIds, ","));
+                }
+
                 //保存数据
                 this.baseMapper.insert(newData);
             }
@@ -468,9 +489,21 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
                             this.integrationMethod(vor, linkTasks);
                         }
                         //设置上报批次
-                        //vor.setReportNumber(String.valueOf(tasks.get(0).getBatch()));
+                        vor.setReportNumber(String.valueOf(tasks.get(0).getBatch()));
                     }
                 }
+
+                //校验关联的工序节点是否全都已审批
+                if (StringUtils.isNotEmpty(vor.getSjRecordIds())) {
+                    List<InformationQuery> informationQueryList = this.baseMapper.selectBatchIds(Func.toLongList(vor.getSjRecordIds()));
+                    List<InformationQuery> collect = informationQueryList.stream().filter(f -> f.getStatus().equals(2)).collect(Collectors.toList());
+                    if (collect.size() == informationQueryList.size()) {
+                        vor.setIsApprove(true);
+                    } else {
+                        vor.setIsApprove(false);
+                    }
+                }
+
             });
             page.setRecords(voResult);
             page.setTotal(count);

+ 96 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/MetadataClassificationServiceImpl.java

@@ -0,0 +1,96 @@
+package org.springblade.business.service.impl;
+
+
+import lombok.AllArgsConstructor;
+import org.springblade.business.dto.TrialContainerClassificationDTO;
+
+import org.springblade.business.entity.MetadataClassification;
+import org.springblade.business.mapper.MetadataClassificationMapper;
+import org.springblade.business.service.IMetadataClassificationService;
+
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.constant.BladeConstant;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+
+@Service
+@AllArgsConstructor
+public class MetadataClassificationServiceImpl
+        extends BaseServiceImpl<MetadataClassificationMapper, MetadataClassification>
+        implements IMetadataClassificationService {
+
+
+    @Override
+    public MetadataClassification classificationDetail(Integer type) {
+        return baseMapper.classificationDetail(type);
+    }
+    @Override
+    public boolean classificationSubmit(MetadataClassification obj) {
+
+        try {
+            BladeUser user = AuthUtil.getUser();
+//            obj.setFileStorageType("");
+
+            if(ObjectUtil.isEmpty(obj.getId())){
+                MetadataClassification metadataClassification = baseMapper.selectMetadaOne(obj.getContainerName(), obj.getCode(),
+                        "file_key_" + obj.getCode().toLowerCase(),null);
+                if(metadataClassification != null){
+                    return false;
+                }
+                obj.setId(SnowFlakeUtil.getId());
+                obj.setCreateUser(user.getUserId());
+                obj.setCreateTime(new Date());
+                obj.setTenantId(user.getTenantId());
+                obj.setIsDeleted(BladeConstant.DB_NOT_DELETED);
+                obj.setContainerInitTabName("u_metadata_file");
+                obj.setFieldKey("file_key_"+obj.getCode().toLowerCase());
+
+                String filetype = "varchar";
+                Integer fileLength = 255;
+                if(obj.getFieldType().equals("1")){
+                    filetype = "varchar";
+                }else if(obj.getFieldType().equals("4")){
+                    filetype = "datetime";
+                    fileLength = 6;
+                }
+                int insert = baseMapper.insert(obj);
+                baseMapper.alterTabFiled(obj.getContainerInitTabName(),obj.getFieldKey(),filetype,fileLength);
+            }else{
+                MetadataClassification metadataClassification = baseMapper.selectMetadaOne(obj.getContainerName(), obj.getCode(),
+                        "file_key_" + obj.getCode().toLowerCase(),obj.getId());
+                if(metadataClassification != null){
+                    return false;
+                }
+                String filetype = "varchar";
+                Integer fileLength = 255;
+                if(obj.getFieldType().equals("1")){
+                    filetype = "varchar";
+                }else if(obj.getFieldType().equals("4")){
+                    filetype = "datetime";
+                    fileLength = 6;
+                }
+                obj.setUpdateTime(new Date());
+                obj.setUpdateUser(user.getUserId());
+                baseMapper.updateById(obj);
+                baseMapper.updateFiledType(obj.getContainerInitTabName(),obj.getFieldKey(),filetype,fileLength);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public boolean updateMetadataBytype(List<Long> ids, String type) {
+        baseMapper.updateMetadataBytype(ids,type);
+        return false;
+    }
+}

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

@@ -13,6 +13,7 @@ import org.slf4j.LoggerFactory;
 import org.springblade.business.entity.*;
 import org.springblade.business.mapper.TaskMapper;
 import org.springblade.business.service.*;
+import org.springblade.business.vo.BusinessUserOpinionVO;
 import org.springblade.business.vo.MessageWarningVO;
 import org.springblade.business.vo.TaskApprovalVO;
 import org.springblade.business.vo.TaskVO;
@@ -89,6 +90,8 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 
     private final ITaskBatchService taskBatchService;
 
+    private final UserOpinionServiceImpl userOpinionService;
+
     @Override
     public List<TaskParallel> queryApprovalUser(String formDataIds) {
         //返回结果
@@ -285,51 +288,58 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 
     @Override
     public Map<String, String> getTaskCount(String projectId, String contractId, String userId) {
-        List<Task> tasks = this.baseMapper.selectList(Wrappers.<Task>lambdaQuery()
-                .eq(Task::getProjectId, projectId)
-                .eq(Task::getContractId, contractId)
-                .eq(Task::getStatus, 1));
-
-        List<String> collect = tasks.stream().map(Task::getProcessInstanceId).collect(Collectors.toList());
-
-        long aLong = 0L;
-        if (collect.size() > 0) {
-            for (String id : collect) {
-                Long row = taskParallelService.getBaseMapper().selectCount(Wrappers.<TaskParallel>lambdaQuery()
-                        .eq(TaskParallel::getProcessInstanceId, id)
-                        .eq(TaskParallel::getStatus, 1)
-                        .eq(TaskParallel::getTaskUser, userId)
-                );
-                if (row == 1) {
-                    aLong++;
+        if (StringUtils.isNotEmpty(projectId) && StringUtils.isNotEmpty(contractId)) {
+            List<Task> tasks = this.baseMapper.selectList(Wrappers.<Task>lambdaQuery()
+                    .eq(Task::getProjectId, projectId)
+                    .eq(Task::getContractId, contractId)
+                    .eq(Task::getStatus, 1));
+
+            List<String> collect = tasks.stream().map(Task::getProcessInstanceId).collect(Collectors.toList());
+
+            long aLong = 0L;
+            if (collect.size() > 0) {
+                for (String id : collect) {
+                    Long row = taskParallelService.getBaseMapper().selectCount(Wrappers.<TaskParallel>lambdaQuery()
+                            .eq(TaskParallel::getProcessInstanceId, id)
+                            .eq(TaskParallel::getStatus, 1)
+                            .eq(TaskParallel::getTaskUser, userId)
+                    );
+                    if (row == 1) {
+                        aLong++;
+                    }
                 }
             }
-        }
 
-        List<MessageWarning> messageWarnings = messageWarningService.getBaseMapper().selectList(Wrappers.<MessageWarning>lambdaQuery()
-                .eq(MessageWarning::getProjectId, projectId)
-                .eq(MessageWarning::getContractId, contractId)
-                .eq(MessageWarning::getPushUser, userId)
-                .eq(MessageWarning::getIsRead, 0)
-        );
-
-        long messageCount1 = messageWarnings.stream().filter(f -> f.getType().equals(1)).count();
-        long messageCount2 = messageWarnings.stream().filter(f -> f.getType().equals(2)).count();
-        long messageCount3 = messageWarnings.stream().filter(f -> f.getType().equals(3)).count();
-        long messageCount4 = messageWarnings.stream().filter(f -> f.getType().equals(4)).count();
-        long messageCount5 = messageWarnings.stream().filter(f -> f.getType().equals(5)).count();
-
-        Map<String, String> map = new HashMap<>();
-        map.put("allCount", String.valueOf(aLong + messageWarnings.size()));//任务管理
-        map.put("taskCount", String.valueOf(aLong));//任务查看
-        map.put("messageCount", String.valueOf(messageWarnings.size()));//消息提醒
-        map.put("messageCount_1", String.valueOf(messageCount1));//任务催办
-        map.put("messageCount_2", String.valueOf(messageCount2));//监测预警
-        map.put("messageCount_3", String.valueOf(messageCount3));//废除通知
-        map.put("messageCount_4", String.valueOf(messageCount4));//工单反馈
-        map.put("messageCount_5", String.valueOf(messageCount5));//系统消息
-        map.put("userId", userId);
-        return map;
+            List<MessageWarning> messageWarnings = messageWarningService.getBaseMapper().selectList(Wrappers.<MessageWarning>lambdaQuery()
+                    .eq(MessageWarning::getProjectId, projectId)
+                    .eq(MessageWarning::getContractId, contractId)
+                    .eq(MessageWarning::getPushUser, userId)
+                    .eq(MessageWarning::getIsRead, 0)
+            );
+            long messageCount1 = messageWarnings.stream().filter(f -> f.getType().equals(1)).count();
+            long messageCount2 = messageWarnings.stream().filter(f -> f.getType().equals(2)).count();
+            long messageCount3 = messageWarnings.stream().filter(f -> f.getType().equals(3)).count();
+            long messageCount4 = messageWarnings.stream().filter(f -> f.getType().equals(4)).count();
+            long messageCount5 = messageWarnings.stream().filter(f -> f.getType().equals(5)).count();
+
+            Map<String, String> map = new HashMap<>();
+            map.put("allCount", String.valueOf(aLong + messageWarnings.size()));//任务管理
+            map.put("taskCount", String.valueOf(aLong));//任务查看
+            map.put("messageCount", String.valueOf(messageWarnings.size()));//消息提醒
+            map.put("messageCount_1", String.valueOf(messageCount1));//任务催办
+            map.put("messageCount_2", String.valueOf(messageCount2));//监测预警
+            map.put("messageCount_3", String.valueOf(messageCount3));//废除通知
+            map.put("messageCount_4", String.valueOf(messageCount4));//工单反馈
+            map.put("messageCount_5", String.valueOf(messageCount5));//系统消息
+            map.put("userId", userId);
+            return map;
+        } else {
+            Map<String, String> map = new HashMap<>();
+            List<BusinessUserOpinionVO> businessUserOpinionVOS = userOpinionService.getBaseMapper().queryManageUserOpinionList(userId).stream().filter(f -> f.getIsCurrent().equals(false)).collect(Collectors.toList());
+            map.put("myMessageCount", String.valueOf(businessUserOpinionVOS.size()));//后管消息区-我的消息-未处理
+            map.put("userId", userId);
+            return map;
+        }
     }
 
     /**
@@ -337,7 +347,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
      */
     @Override
     public List<String> queryBatchListTwo(String projectId, String contractId) {
-        return baseMapper.queryBatchListTwo(projectId,contractId);
+        return baseMapper.queryBatchListTwo(projectId, contractId);
     }
 
     @Override
@@ -348,7 +358,8 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
     //@Async
 
     /**
-     *  批量电签接口
+     * 批量电签接口
+     *
      * @param taskApprovalVOS
      * @param userId
      * @throws FileNotFoundException

+ 30 - 16
blade-service/blade-business/src/main/java/org/springblade/business/socket/WebSocket.java

@@ -53,8 +53,8 @@ public class WebSocket {
         this.userId = userId;
         //加入map
         webSocketMap.put(userId, this);
-        addOnlineCount();           //在线数加1
-        logger.info("用户{}连接成功,当前在线人数为{}", userId, getOnlineCount());
+        addOnlineCount();//在线数加1
+        logger.info("用户:{}连接成功,当前在线人数为{}人", userId, getOnlineCount());
         try {
             sendMessage(String.valueOf(this.session.getQueryString()));
         } catch (IOException e) {
@@ -68,7 +68,7 @@ public class WebSocket {
         webSocketMap.remove(userId);
         webSocketMessageMap.remove(userId);
         subOnlineCount(); //在线数减1
-        logger.info("用户{}关闭连接!当前在线人数为{}", userId, getOnlineCount());
+        logger.info("用户{}关闭连接!当前在线人数为{}", userId, getOnlineCount());
     }
 
     /**
@@ -78,22 +78,36 @@ public class WebSocket {
      */
     @OnMessage
     public void onMessage(String message, Session session) {
-        webSocketMessageMap.put(userId, message);
-        logger.info("来自客户端用户:{} 消息:{}", userId, message);
+        if (StringUtils.isNotEmpty(userId)) {
+            webSocketMessageMap.put(userId, message);
+            String projectId = "";
+            String contractId = "";
+            if (message.contains(",")) {
+                logger.info("来自客户端用户:{} 消息:{}", userId, message);
+                projectId = message.split(",")[0];
+                contractId = message.split(",")[1];
+            } else {
+                logger.info("来自后管用户:{} 消息:{}", userId, message);
+                userId = message;
+            }
 
-        String projectId = message.split(",")[0];
-        String contractId = message.split(",")[1];
+            Map<String, String> stringMap;
+            if (StringUtils.isNotEmpty(projectId) && StringUtils.isNotEmpty(contractId)) {
+                //客户端
+                stringMap = iTaskService.getTaskCount(projectId, contractId, userId);
+            } else {
+                //后管
+                stringMap = iTaskService.getTaskCount(null, null, userId);
+            }
 
-        Map<String, String> stringMap = null;
-        if (StringUtils.isNotEmpty(projectId) && StringUtils.isNotEmpty(contractId) && StringUtils.isNotEmpty(userId)) {
-            stringMap = iTaskService.getTaskCount(projectId, contractId, userId);
-        }
+            try {
+                webSocketMap.get(userId).sendMessage(JSON.toJSONString(stringMap));
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
 
-        //切换项目合同段,推送当前项目合同段的业务数量
-        try {
-            webSocketMap.get(userId).sendMessage(JSON.toJSONString(stringMap));
-        } catch (IOException e) {
-            e.printStackTrace();
+        } else {
+            logger.info("未获取到用户信息,接收消息失败");
         }
     }
 

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

@@ -1545,6 +1545,15 @@ public class CustomFunction {
 		}
         return "";
 	}
+	public static Object tableNames(List<String>treeNodes){
+		if(CollectionUtil.isNotEmpty(treeNodes)){
+			List<String>nodes=new ArrayList<>(treeNodes);
+           return   nodes.stream().filter(StringUtils::isNotEmpty).map(e->e.replaceAll("__\\d+$","")).distinct().collect(Collectors.joining("\n"));
+		}
+		return "";
+	}
+
+
 
 	public static Object qrate(Object design,Object dev,Object data){
 		return qrate(design,dev,data,0,1);

+ 120 - 48
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -52,6 +52,7 @@ import org.springblade.resource.feign.IOSSClient;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.resource.vo.NewBladeFile;
 import org.springblade.system.cache.ParamCache;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
@@ -284,6 +285,7 @@ public class ExcelTabController extends BladeController {
     public R putFileAttach(@RequestParam("file") MultipartFile file, Long nodeId) {
 
         String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        //String file_path = "/Users/hongchuangyanfa/Desktop/"; //ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
 
         ExcelTab detail = excelTabService.getById(nodeId);
         // 上传excel文件
@@ -450,8 +452,8 @@ public class ExcelTabController extends BladeController {
             @ApiImplicitParam(name = "tabId", value = "表Id", required = true),
     })
     public R<List<ExceTabTreVO>> saveLinkeTab(Long exceTabId, Long tabId) throws IOException {
-        //String file_path =ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        String file_path =ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        //String file_path = "C:\\Users\\泓创开发\\Desktop";
 
         // 关联 私有项目 wbs 数据信息
         WbsTreePrivate wbsTree = new WbsTreePrivate();
@@ -679,7 +681,7 @@ public class ExcelTabController extends BladeController {
 
 
     /**
-     * 清表生成html
+     * 客户端清表生成html
      */
     @GetMapping("/get-excel-html")
     @ApiOperationSupport(order = 15)
@@ -699,12 +701,90 @@ public class ExcelTabController extends BladeController {
         }
 
         File file1 = ResourceUtil.getFile(wbsTreePrivate.getHtmlUrl());
+//        File file1 = ResourceUtil.getFile("D:\\develop\\1625742323381960704.html");
+        FileInputStream fileInputStream = new FileInputStream(file1);
+        String htmlString = IoUtil.readToString(fileInputStream);
+
+        // 远程搜索配置
+        Document doc = Jsoup.parse(htmlString);
+        Element table = doc.select("table").first();
+        Elements col = doc.select("Col");
+        doc.select("Col").remove();
+        ProjectInfo projectInfo = projectInfoService.getById(wbsTreePrivate.getProjectId());
+        // 添加标题显示
+        Elements trs = table.select("tr");
+        for (int i = 1; i < 6; i++) {
+            Element tr = trs.get(i);
+            Elements tds = tr.select("td");
+            for (int j = 0; j < tds.size(); j++) {
+                Element data = tds.get(j);
+                int colspan = data.attr("COLSPAN").equals("") ? 0 : Integer.parseInt(data.attr("COLSPAN"));
+                String style = data.attr("style");
+                if (style.indexOf("font-size") >= 0) {
+                    int fontsize = Integer.parseInt(style.substring(style.indexOf("font-size:") + 10, style.indexOf(".0pt")));
+                    if (StringUtils.isNotEmpty(data.text()) && fontsize >= 12) {
+                        trs.get(i - 1).select("td").get(0).text(projectInfo.getProjectName());
+                        break;
+                    }
+                }
+            }
+        }
+        fileInputStream.close();
+        return R.data(table + "");
+    }
+
+    /**
+     * 后管清表生成html
+     */
+    @GetMapping("/get-excel-html-two")
+    @ApiOperationSupport(order = 15)
+    @ApiOperation(value = "清表生成html", notes = "清表生成html")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "pkeyId", value = "pkeyId", required = true)
+    })
+    public R getExcelHtmlTwo(Long pkeyId) throws IOException, InterruptedException {
+
+        Thread.sleep(200);
+        WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.getByPKeyId(pkeyId);
+        if (wbsTreePrivate == null) {
+            return R.fail("该数据下无此节点!");
+        }
+        if (wbsTreePrivate.getHtmlUrl() == null) {
+            return R.fail("请上传清表!");
+        }
+
+        File file1 = ResourceUtil.getFile(wbsTreePrivate.getHtmlUrl());
+//        File file1 = ResourceUtil.getFile("D:\\develop\\1613737889349238784.html");
         FileInputStream fileInputStream = new FileInputStream(file1);
         String htmlString = IoUtil.readToString(fileInputStream);
         // 解析 style
+        htmlString = htmlString.replaceAll("placeholder", "placeholderxx");
+        htmlString = htmlString.replaceAll("title", "titlexx");
+
+        // 远程搜索配置
         Document doc = Jsoup.parse(htmlString);
         Element table = doc.select("table").first();
+        Elements col = doc.select("Col");
         doc.select("Col").remove();
+        ProjectInfo projectInfo = projectInfoService.getById(wbsTreePrivate.getProjectId());
+        // 添加标题显示
+        Elements trs = table.select("tr");
+        for (int i = 1; i < 6; i++) {
+            Element tr = trs.get(i);
+            Elements tds = tr.select("td");
+            for (int j = 0; j < tds.size(); j++) {
+                Element data = tds.get(j);
+                int colspan = data.attr("COLSPAN").equals("") ? 0 : Integer.parseInt(data.attr("COLSPAN"));
+                String style = data.attr("style");
+                if (style.indexOf("font-size") >= 0) {
+                    int fontsize = Integer.parseInt(style.substring(style.indexOf("font-size:") + 10, style.indexOf(".0pt")));
+                    if (StringUtils.isNotEmpty(data.text()) && fontsize >= 12) {
+                        trs.get(i - 1).select("td").get(0).text(projectInfo.getProjectName());
+                        break;
+                    }
+                }
+            }
+        }
         fileInputStream.close();
         return R.data(table + "");
     }
@@ -911,7 +991,6 @@ public class ExcelTabController extends BladeController {
                             zikey.add(dataInfo);
                         }
                     } else { //空行
-
                         List<Map<String, String>> left = new ArrayList<>();
                         List<Map<String, String>> top = new ArrayList<>();
                         for (int k = 0; k < zikey.size(); k++) {
@@ -1056,7 +1135,7 @@ public class ExcelTabController extends BladeController {
                                     }
                                 } else {
                                     Element bforData = tds.get(j - 1);
-                                    if (!bforData.text().isEmpty()) {
+                                    if (!bforData.text().isEmpty() || bforData.html().indexOf("hc-form-checkbox-group")>=0) {
                                         if (rowspan >= 1) {
                                             data.empty().append("<el-input type='textarea' @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;'   :rows=" + rowspan * 2 + " placeholder=''> </el-input>");
                                         } else {
@@ -1302,7 +1381,6 @@ public class ExcelTabController extends BladeController {
 
 
         long newPkId = SnowFlakeUtil.getId();
-        Long id = wbsTreeContract.getId();
         wbsTreeContract.setPKeyId(newPkId);
         wbsTreeContract.setCreateTime(new Date());
         String nodeName = wbsTreeContractList2.get(0).getNodeName();
@@ -1323,40 +1401,15 @@ public class ExcelTabController extends BladeController {
         String tabName = wbsTreeContract.getInitTableName();
         // 字段查询 并去掉公式字段
 
-        String colkeys = "SELECT GROUP_CONCAT(e_key) as colkeys from m_wbs_tree a ,m_wbs_form_element b WHERE a.init_table_name = '" + tabName + "' and a.id=b.f_id and b.id not in(SELECT element_id from m_formula c where c.is_deleted=0) ";
+        String colkeys = "SELECT GROUP_CONCAT(e_key) as colkeys from m_table_info a ,m_wbs_form_element b WHERE a.tab_en_name = '"+tabName+"' and a.id=b.f_id ";
         Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(colkeys);
         colkeys = stringObjectMap.get("colkeys") + "";
-        // 复制表数据
-        String querySql = "select " + colkeys + " from " + tabName + " where p_key_id=" + pkeyId;
-        List<Map<String, Object>> dataList = jdbcTemplate.queryForList(querySql);
-        if (dataList != null && dataList.size() >= 1) {
-            Map<String, Object> dataMap2 = dataList.get(0);
-
-            dataMap2.remove("p_key_id");
-            dataMap2.remove("id");
-
-            // sql 组装
-            String sqlInfo = "";
 
-            sqlInfo = "INSERT INTO " + tabName + " ( ";
-
-            String keyStr = "id,p_key_id,";
-            String valStr = SnowFlakeUtil.getId() + "," + wbsTreeContract.getPKeyId() + ",";
-
-            for (String keys : dataMap2.keySet()) {
-                if (!(dataMap2.get(keys) + "").equals("null")) {
-                    keyStr += keys + ",";
-                    valStr += "'" + dataMap2.get(keys) + "',";
-                }
-            }
-            keyStr = keyStr.substring(0, keyStr.lastIndexOf(","));
-            valStr = valStr.substring(0, valStr.lastIndexOf(","));
+        // 复制表数据
 
-            sqlInfo = sqlInfo + keyStr + ") VALUES (" + valStr + ")";
+        String querySql = "insert into "+tabName+" (id,p_key_id,"+colkeys+") select '"+newPkId+"','"+newPkId+"'," + colkeys + " from " + tabName + " where p_key_id=" + pkeyId;
+        jdbcTemplate.execute(querySql);
 
-            //huangjn 保存成功后调用生成资料查询列表数据
-            jdbcTemplate.execute(sqlInfo);
-        }
         wbsTreeContractService.save(wbsTreeContract);
         return R.data("成功");
     }
@@ -1468,7 +1521,12 @@ public class ExcelTabController extends BladeController {
                 //优先使用电签的PDF
                 pdfUrl = stringObjectMap.get("e_visa_pdf_url");
             }
-            return R.data(pdfUrl);
+            if(StringUtils.isEmpty(pdfUrl+"")){
+                return R.fail(300,"无数据");
+            }else{
+                return R.data(pdfUrl);
+            }
+
         } else {
             return R.fail("无历史数据预览,请保存数据");
         }
@@ -1580,7 +1638,7 @@ public class ExcelTabController extends BladeController {
     })
     public R<String> getTheLogPdInfo(String theLogId, String nodePrimaryKeyId, String recordTime, String contractId) throws Exception {
         //获取配置的路径
-        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        String file_path =ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
 
         //获取对应的日志
         JSONObject theLogJson;
@@ -1594,8 +1652,12 @@ public class ExcelTabController extends BladeController {
         }
 
         if (theLogJson != null) {
-            theLogId = theLogJson.getString("id");
+//            String evPdf = theLogJson.getString("eVisaPdfUrl");
+//            if(StringUtils.isNotEmpty(evPdf)){
+//                return R.data(evPdf);
+//            }
 
+            theLogId = theLogJson.getString("id");
             //查询对应的html
             WbsTreePrivate tableNode = this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, theLogJson.getString("tableId")));
 
@@ -1617,7 +1679,7 @@ public class ExcelTabController extends BladeController {
             List<Map<String, Object>> businessDataMapList = this.getTheLogBusinessData(theLogId, nodePrimaryKeyId, recordTime, contractId).getData();
             //PDF路径
             List<String> pdfUrls = new ArrayList<>();
-
+            ProjectInfo projectInfo = projectInfoService.getById(tableNode.getProjectId());
             //处理数据
             for (Map<String, Object> dataMap : businessDataMapList) {
                 // 获取excel流 和 html流
@@ -1625,15 +1687,26 @@ public class ExcelTabController extends BladeController {
                 wb.loadFromMHtml(CommonUtil.getOSSInputStream(excelTab.getFileUrl()));
                 //获取工作表
                 Worksheet sheet = wb.getWorksheets().get(0);
-
                 // 数据不为空 &&
                 if (StringUtils.isNotEmpty(tableNode.getHtmlUrl())) {
                     File htmlFile = ResourceUtil.getFile(tableNode.getHtmlUrl());
+//                    File htmlFile = ResourceUtil.getFile("D:\\develop\\1613737889349238784.html");
                     if (htmlFile.exists()) {
                         String htmlString = IoUtil.readToString(new FileInputStream(htmlFile));
                         Document doc = Jsoup.parse(htmlString);
                         Element table = doc.select("table").first();
                         Elements trs = table.select("tr");
+                        //添加标题
+                        CellRange[] columns = sheet.getMergedCells();
+                        for (int i = 0; i < columns.length; i++) {
+                            CellRange cellRange = columns[i];
+                            System.out.println(cellRange.getStyle().getFont().getSize());
+                            if (cellRange.getStyle().getFont().getSize() >= 12) {
+                                cellRange.setText(projectInfo.getProjectName());
+                                cellRange.getStyle().getFont().setSize(20);
+                                break;
+                            }
+                        }
 
                         if (ObjectUtil.isNotEmpty(dataMap)) {
                             for (String val : dataMap.keySet()) {
@@ -1700,7 +1773,6 @@ public class ExcelTabController extends BladeController {
                                 }
                             }
                         }
-
                         // 组装电签设置
                         QueryWrapper<TextdictInfo> queryWrapper = new QueryWrapper<>();
                         queryWrapper.eq("type", 2);
@@ -1731,7 +1803,7 @@ public class ExcelTabController extends BladeController {
 
                 Long fileName = SnowFlakeUtil.getId();
                 String onePdfPath = file_path + "/pdf//" + fileName + ".pdf";
-
+//                wb.saveToFile("d://123123.xls", ExcelVersion.Version2010);
                 sheet.saveToPdf(onePdfPath);
 
                 BladeFile bladeFile = this.newIOSSClient.uploadFile(fileName + ".pdf", onePdfPath);
@@ -1871,6 +1943,8 @@ public class ExcelTabController extends BladeController {
             }
         }
 
+
+
         return R.data(resultMapList);
     }
 
@@ -2332,7 +2406,6 @@ public class ExcelTabController extends BladeController {
     @GetMapping("/getDataInfoinfoxxxxx")
     @ApiOperationSupport(order = 100)
     @ApiOperation(value = "初始化实际", notes = "初始化实际")
-
     public R getFirstExcelHtml() throws Exception {
         String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
         String sql = "SELECT * from m_excel_tab x where x.alias like '%1579401528622919682%' and parent_id in ('1582212216210829314','1582211923960115201')  and is_deleted=0 and file_type=3 ";
@@ -2569,6 +2642,7 @@ public class ExcelTabController extends BladeController {
     @ApiOperation(value = "表单填写图片上传", notes = "表单填写图片上传")
     public R addBussFile(@RequestParam MultipartFile file) {
         String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        //String file_path = "/Users/hongchuangyanfa/Desktop/";//ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
         BladeFile bladeFile = new BladeFile();
         if (file.getSize() >= 1024) {
             String filecode = SnowFlakeUtil.getId() + "";
@@ -2615,16 +2689,14 @@ public class ExcelTabController extends BladeController {
 
     /**
      * 在线excel 修改回调
-     * @param request
-     * @param response
      * @throws IOException
      */
-    @PostMapping(value = "/callbackSave", produces = "application/json;charset=UTF-8")
+    @PostMapping(value = "/callbackSave")
     @ApiOperation(value = "onlyOffice保存回调", notes = "onlyOffice保存回调")
     @ApiOperationSupport(order = 35)
     @ResponseBody
-    public void saveWord(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        excelTabService.callbackSave(request, response);
+    public ExcelEditCallback saveWord(@RequestBody ExcelEditCallback callback) {
+        return excelTabService.callbackSave(callback);
     }
 
 }

+ 250 - 69
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FirstController.java

@@ -1,5 +1,6 @@
 package org.springblade.manager.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -22,12 +23,15 @@ import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.boot.ctrl.BladeController;
+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.utils.*;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.service.*;
 import org.springblade.manager.service.impl.ContractInfoServiceImpl;
+import org.springblade.manager.service.impl.TableInfoServiceImpl;
+import org.springblade.manager.service.impl.WbsTreePrivateServiceImpl;
 import org.springblade.manager.utils.FileUtils;
 import org.springblade.resource.feign.CommonFileClient;
 import org.springblade.resource.feign.IOSSClient;
@@ -63,6 +67,7 @@ import java.util.stream.Collectors;
 public class FirstController extends BladeController {
 
     private final IWbsTreeContractService wbsTreeContractService;
+    private final WbsTreePrivateServiceImpl wbsTreePrivateService;
     private final IOSSClient iossClient;
     private final CommonFileClient commonFileClient;
     private final ITableFileService tableFileService;
@@ -73,6 +78,7 @@ public class FirstController extends BladeController {
     private final ITextdictInfoService textdictInfoService;
     private final IProjectInfoService projectInfoService;
     private final ContractInfoServiceImpl contractInfoService;
+    private final TableInfoServiceImpl tableInfoService;
 
     /**
      * 首件表单获取 html页面
@@ -216,11 +222,11 @@ public class FirstController extends BladeController {
                     }
 
                     //获取填报数据
-                    List<Map<String, Object>> businessDataMapList = this.getFirstBusinessData(firstId, tableNode.getContractId()).getData().get("data");
+                    List<Map<String, Object>> firstBusinessDataInfos = this.getFirstBusinessDataImpl2(firstId, tableNode.getContractId());
 
                     try {
                         //处理数据
-                        for (Map<String, Object> dataMap : businessDataMapList) {
+                        for (Map<String, Object> dataMap : firstBusinessDataInfos) {
                             // 获取excel流 和 html流
                             Workbook wb = new Workbook();
                             wb.loadFromMHtml(CommonUtil.getOSSInputStream(excelTab.getFileUrl()));
@@ -392,19 +398,191 @@ public class FirstController extends BladeController {
             @ApiImplicitParam(name = "firstId", value = "pkeyId", required = true),
             @ApiImplicitParam(name = "contractId", value = "contractId", required = true)
     })
-    public R<Map<String, List<Map<String, Object>>>> getFirstBusinessData(String firstId, String contractId) {
+    public R getFirstBusinessData(String firstId, String contractId) {
+        Map<String, Object> firstBusinessData = this.getFirstBusinessDataImpl(firstId, contractId);
+        if (firstBusinessData.size() > 0) {
+            return R.data(firstBusinessData);
+        }
+        return R.data(300, null, "未找到对应的业务数据");
+    }
+
+    private Map<String, Object> getFirstBusinessDataImpl(String firstId, String contractId) {
+        //数据结果
+        Map<String, Object> reData = new HashMap<>();
         if (StringUtils.isNotEmpty(firstId) && StringUtils.isNotEmpty(contractId)) {
-            //数据结果
-            Map<String, List<Map<String, Object>>> result = new HashMap<>();
-            List<Map<String, Object>> dataResult = new ArrayList<>();
-            Map<String, Object> reData = new HashMap<>();
+            WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
+                    .eq(WbsTreeContract::getContractId, contractId).eq(WbsTreeContract::getTableType, "111"));
+            if (wbsTreeContract == null) {
+                throw new ServiceException("该数据下无此节点");
+            }
+            if (wbsTreeContract.getHtmlUrl() == null) {
+                throw new ServiceException("请上传清表");
+            }
+
+            //匹配关联Title等
+            try {
+                File file1 = ResourceUtil.getFile(wbsTreeContract.getHtmlUrl());
+                String htmlString = IoUtil.readToString(new FileInputStream(file1));
+                Document doc = Jsoup.parse(htmlString);
+
+                // 模糊匹配
+                Elements dwTitle = doc.select("el-input[placeholder~=.*承包单位]");
+                Elements sgTitle = doc.select("el-input[placeholder~=^施工单位]");
+                Elements sgTitle1 = doc.select("el-input[placeholder=安装单位]");
+                sgTitle.addAll(sgTitle1);
+                Elements htdTitle = doc.select("el-input[placeholder~=.*合同段:");
+                /*Elements htdTitle1 = doc.select("el-input[placeholder~=合同名称.*]");
+                htdTitle.addAll(htdTitle1);*/
+                Elements jlTitle = doc.select("el-input[placeholder~=监理单位.*]");
+                Elements bhTitle = doc.select("el-input[placeholder~=^编号]");
+                Elements bhTitle1 = doc.select("el-input[placeholder~=合同编号.*]");
+                bhTitle.addAll(bhTitle1);
+                Elements xmTitle = doc.select("el-input[placeholder~=^项目名称]");
 
+                ContractInfo contractInfo = contractInfoService.getById(wbsTreeContract.getContractId());
+                // 施工单位名称
+                if (dwTitle.size() >= 1) {
+                    int y = Integer.parseInt(dwTitle.attr("trindex"));
+                    if (y <= 10) {
+                        reData.put(dwTitle.attr("keyName"), contractInfo.getConstructionUnitName());
+                    }
+
+                }
+                if (sgTitle.size() >= 1) {
+                    int y = Integer.parseInt(sgTitle.attr("trindex"));
+                    if (y <= 10) {
+                        reData.put(sgTitle.attr("keyName"), contractInfo.getConstructionUnitName());
+                    }
+                }
+
+                // 合同段名称
+                if (htdTitle.size() >= 1) {
+                    for (Element element : htdTitle) {
+                        int trIndex = Integer.parseInt(element.attr("trindex"));
+                        if (trIndex <= 8) {
+                            reData.put(element.attr("keyName"), contractInfo.getContractName());
+                        }
+                    }
+                }
+                // 监理单位名称
+                if (jlTitle.size() >= 1) {
+                    for (Element element : jlTitle) {
+                        int trIndex = Integer.parseInt(element.attr("trindex"));
+                        if (trIndex <= 10) {
+                            reData.put(element.attr("keyName"), contractInfo.getSupervisionUnitName());
+                        }
+                    }
+                }
+                // 编号
+                if (bhTitle.size() >= 1 && contractInfo.getIsReferenceNumber() == 1) {
+                    for (Element element : bhTitle) {
+                        int trIndex = Integer.parseInt(element.attr("trindex"));
+                        if (trIndex <= 10) {
+                            reData.put(element.attr("keyName"), contractInfo.getContractNumber());
+                        }
+                    }
+                }
+
+                // 项目名称
+                if (xmTitle.size() >= 1) {
+                    for (Element element : xmTitle) {
+                        int trIndex = Integer.parseInt(element.attr("trindex"));
+                        if (trIndex <= 6) {
+                            ProjectInfo projectInfo = projectInfoService.getById(wbsTreeContract.getProjectId());
+                            reData.put(element.attr("keyName"), projectInfo.getProjectName());
+                        }
+                    }
+                }
+
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            }
+
+            JSONObject json = this.informationQueryClient.queryFirstBusinessDataByFirstId(firstId);
+            //解析数据Data
+            if (json != null) {
+                //获取数据所在表格
+                WbsTreeContract contractNode = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, json.getString("tableId")));
+                if (ObjectUtil.isNotEmpty(contractNode)) {
+                    WbsTreePrivate wbsTreePrivate = wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery()
+                            .eq(WbsTreePrivate::getId, contractNode.getId())
+                            .eq(WbsTreePrivate::getProjectId, contractNode.getProjectId())
+                            .eq(WbsTreePrivate::getWbsId, contractNode.getWbsId())
+                            .eq(WbsTreePrivate::getTableType, 111)
+                    );
+                    if (StringUtils.isNotEmpty(wbsTreePrivate.getInitTableId())) {
+                        TableInfo tableId = tableInfoService.getBaseMapper().selectById(wbsTreePrivate.getInitTableId());
+                        if (tableId != null) {
+                            //获取填报数据
+                            List<Map<String, Object>> businessDataMapList = this.jdbcTemplate.queryForList("SELECT * FROM " + tableId.getTabEnName() + " WHERE group_id = " + json.getString("id"));
+                            if (businessDataMapList.size() > 0) {
+                                for (Map<String, Object> mysqlData : businessDataMapList) {
+                                    for (String key : mysqlData.keySet()) {
+                                        String tabVal = mysqlData.get(key) + "";
+                                        // 时间段处理
+                                        if (StringUtils.isNotEmpty(tabVal) && !tabVal.equals("null")) {
+                                            if (tabVal.indexOf("T") >= 0 && tabVal.indexOf(".000Z]") >= 0) {
+                                                String[] tabData = tabVal.split("_\\^_");
+                                                if (reData.containsKey("pickerKey")) {
+                                                    String pickerKey = reData.get("pickerKey") + "," + key + "__" + tabData[1];
+                                                    reData.put("pickerKey", pickerKey);
+                                                } else {
+                                                    reData.put("pickerKey", key + "__" + tabData[1]);
+                                                }
+                                                String sql = tabData[0];
+                                                sql = sql.replaceAll("\\[", "['");
+                                                sql = sql.replaceAll("]", "']");
+                                                sql = sql.replaceAll("000Z,", "000Z',");
+                                                sql = sql.replaceAll(", 20", ", '20");
+                                                sql = sql.replaceAll("'", "");
+                                                reData.put(key + "__" + tabData[1], sql);
+                                            } else if (tabVal.indexOf("T") >= 0 && tabVal.indexOf(".000Z") >= 0) { //时间
+                                                String[] tabData = tabVal.split("_\\^_");
+                                                reData.put(key + "__" + tabData[1], tabData[0]);
+                                            } else if (tabVal.indexOf("☆") >= 0) {
+                                                String[] mysql = tabVal.split("☆");
+                                                for (String data : mysql) {
+                                                    String[] tabData = data.split("_\\^_");
+                                                    reData.put(key + "__" + tabData[1], tabData[0]);
+                                                }
+                                            } else if (tabVal.indexOf("_^_") >= 0) {
+                                                String[] tabData = tabVal.split("_\\^_");
+                                                reData.put(key + "__" + tabData[1], tabData[0]);
+                                            } else {
+                                                reData.put(key, tabVal);
+                                            }
+                                        }
+                                    }
+                                    reData.remove("p_key_id");
+                                    reData.remove("classify");
+                                    reData.remove("contractId");
+                                    reData.remove("pkeyId");
+                                    reData.remove("projectId");
+                                }
+                                //获取关联
+                                List<Map<String, Object>> linkMapList = this.jdbcTemplate.queryForList("SELECT link_id AS id,title AS name FROM u_first_link_data WHERE first_id = " + firstId + " and is_deleted = 0");
+                                //设置关联数据
+                                reData.put("link", linkMapList);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return reData;
+    }
+
+    private List<Map<String, Object>> getFirstBusinessDataImpl2(String firstId, String contractId) {
+        List<Map<String, Object>> result = new ArrayList<>();
+        //数据结果
+        Map<String, Object> reData = new HashMap<>();
+        if (StringUtils.isNotEmpty(firstId) && StringUtils.isNotEmpty(contractId)) {
             WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getContractId, contractId).eq(WbsTreeContract::getTableType, "111"));
             if (wbsTreeContract == null) {
-                return R.fail("该数据下无此节点!");
+                throw new ServiceException("该数据下无此节点");
             }
             if (wbsTreeContract.getHtmlUrl() == null) {
-                return R.fail("请上传清表!");
+                throw new ServiceException("请上传清表");
             }
 
             //匹配关联Title等
@@ -482,10 +660,6 @@ public class FirstController extends BladeController {
                     }
                 }
 
-                //入参
-                if (reData.size() > 0){
-                    dataResult.add(reData);
-                }
             } catch (FileNotFoundException e) {
                 e.printStackTrace();
             }
@@ -494,72 +668,79 @@ public class FirstController extends BladeController {
             //解析数据Data
             if (json != null) {
                 //获取数据所在表格
-                WbsTreeContract tableNode = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, json.getString("tableId")));
-                if (tableNode != null && StringUtils.isNotEmpty(tableNode.getInitTableName())) {
-                    //获取填报数据
-                    List<Map<String, Object>> businessDataMapList = this.jdbcTemplate.queryForList("SELECT * FROM " + tableNode.getInitTableName() + " WHERE group_id = " + json.getString("id"));
-                    if (businessDataMapList.size() > 0) {
-                        for (Map<String, Object> mysqlData : businessDataMapList) {
-                            for (String key : mysqlData.keySet()) {
-                                String tabVal = mysqlData.get(key) + "";
-                                // 时间段处理
-                                if (StringUtils.isNotEmpty(tabVal) && !tabVal.equals("null")) {
-                                    if (tabVal.indexOf("T") >= 0 && tabVal.indexOf(".000Z]") >= 0) {
-                                        String[] tabData = tabVal.split("_\\^_");
-                                        if (reData.containsKey("pickerKey")) {
-                                            String pickerKey = reData.get("pickerKey") + "," + key + "__" + tabData[1];
-                                            reData.put("pickerKey", pickerKey);
-                                        } else {
-                                            reData.put("pickerKey", key + "__" + tabData[1]);
-                                        }
-                                        String sql = tabData[0];
-                                        sql = sql.replaceAll("\\[", "['");
-                                        sql = sql.replaceAll("]", "']");
-                                        sql = sql.replaceAll("000Z,", "000Z',");
-                                        sql = sql.replaceAll(", 20", ", '20");
-                                        sql = sql.replaceAll("'", "");
-                                        reData.put(key + "__" + tabData[1], sql);
-                                    } else if (tabVal.indexOf("T") >= 0 && tabVal.indexOf(".000Z") >= 0) { //时间
-                                        String[] tabData = tabVal.split("_\\^_");
-                                        reData.put(key + "__" + tabData[1], tabData[0]);
-                                    } else if (tabVal.indexOf("☆") >= 0) {
-                                        String[] mysql = tabVal.split("☆");
-                                        for (String data : mysql) {
-                                            String[] tabData = data.split("_\\^_");
-                                            reData.put(key + "__" + tabData[1], tabData[0]);
+                WbsTreeContract contractNode = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, json.getString("tableId")));
+                if (ObjectUtil.isNotEmpty(contractNode)) {
+                    WbsTreePrivate wbsTreePrivate = wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery()
+                            .eq(WbsTreePrivate::getId, contractNode.getId())
+                            .eq(WbsTreePrivate::getProjectId, contractNode.getProjectId())
+                            .eq(WbsTreePrivate::getWbsId, contractNode.getWbsId())
+                            .eq(WbsTreePrivate::getTableType, 111)
+                    );
+                    if (StringUtils.isNotEmpty(wbsTreePrivate.getInitTableId())) {
+                        TableInfo tableId = tableInfoService.getBaseMapper().selectById(wbsTreePrivate.getInitTableId());
+                        if (tableId != null) {
+                            //获取填报数据
+                            List<Map<String, Object>> businessDataMapList = this.jdbcTemplate.queryForList("SELECT * FROM " + tableId.getTabEnName() + " WHERE group_id = " + json.getString("id"));
+                            if (businessDataMapList.size() > 0) {
+                                for (Map<String, Object> mysqlData : businessDataMapList) {
+                                    for (String key : mysqlData.keySet()) {
+                                        String tabVal = mysqlData.get(key) + "";
+                                        // 时间段处理
+                                        if (StringUtils.isNotEmpty(tabVal) && !tabVal.equals("null")) {
+                                            if (tabVal.indexOf("T") >= 0 && tabVal.indexOf(".000Z]") >= 0) {
+                                                String[] tabData = tabVal.split("_\\^_");
+                                                if (reData.containsKey("pickerKey")) {
+                                                    String pickerKey = reData.get("pickerKey") + "," + key + "__" + tabData[1];
+                                                    reData.put("pickerKey", pickerKey);
+                                                } else {
+                                                    reData.put("pickerKey", key + "__" + tabData[1]);
+                                                }
+                                                String sql = tabData[0];
+                                                sql = sql.replaceAll("\\[", "['");
+                                                sql = sql.replaceAll("]", "']");
+                                                sql = sql.replaceAll("000Z,", "000Z',");
+                                                sql = sql.replaceAll(", 20", ", '20");
+                                                sql = sql.replaceAll("'", "");
+                                                reData.put(key + "__" + tabData[1], sql);
+                                            } else if (tabVal.indexOf("T") >= 0 && tabVal.indexOf(".000Z") >= 0) { //时间
+                                                String[] tabData = tabVal.split("_\\^_");
+                                                reData.put(key + "__" + tabData[1], tabData[0]);
+                                            } else if (tabVal.indexOf("☆") >= 0) {
+                                                String[] mysql = tabVal.split("☆");
+                                                for (String data : mysql) {
+                                                    String[] tabData = data.split("_\\^_");
+                                                    reData.put(key + "__" + tabData[1], tabData[0]);
+                                                }
+                                            } else if (tabVal.indexOf("_^_") >= 0) {
+                                                String[] tabData = tabVal.split("_\\^_");
+                                                reData.put(key + "__" + tabData[1], tabData[0]);
+                                            } else {
+                                                reData.put(key, tabVal);
+                                            }
                                         }
-                                    } else if (tabVal.indexOf("_^_") >= 0) {
-                                        String[] tabData = tabVal.split("_\\^_");
-                                        reData.put(key + "__" + tabData[1], tabData[0]);
-                                    } else {
-                                        reData.put(key, tabVal);
                                     }
+
+                                    reData.remove("p_key_id");
+                                    reData.remove("classify");
+                                    reData.remove("contractId");
+                                    reData.remove("pkeyId");
+                                    reData.remove("projectId");
+
                                 }
-                            }
+                                //获取关联
+                                List<Map<String, Object>> linkMapList = this.jdbcTemplate.queryForList("SELECT link_id AS id,title AS name FROM u_first_link_data WHERE first_id = " + firstId + " and is_deleted = 0");
+                                //设置关联数据
+                                reData.put("link", linkMapList);
 
-                            reData.remove("p_key_id");
-                            reData.remove("classify");
-                            reData.remove("contractId");
-                            reData.remove("pkeyId");
-                            reData.remove("projectId");
 
-                            dataResult.add(reData);
+                            }
                         }
-                        //获取关联
-                        List<Map<String, Object>> linkMapList = this.jdbcTemplate.queryForList("SELECT link_id AS id,title AS name FROM u_first_link_data WHERE first_id = " + firstId + " and is_deleted = 0");
-                        //设置关联数据
-                        result.put("link", linkMapList);
                     }
                 }
             }
-
-            //设置表格数据
-            result.put("data", dataResult);
-
-            return R.data(result);
+            result.add(reData);
         }
-
-        return R.data(300, null, "未找到对应的业务数据");
+        return result;
     }
 
 }

+ 34 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -105,13 +105,38 @@ public class FormulaController {
                      this.jdbcTemplate.batchUpdate(sql);
                      return R.success("公式已删除");
                  }
-                 return R.status(this.service.updateById(fa));
+                 this.service.updateById(fa);
+                 return R.data(fa.getId());
              }
          }
         return R.fail("保存不成功,请检查elementId、formula、scope字段是否为空");
     }
 
+    @PostMapping("/delete")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "删除元素公式", notes = "删除元素公式")
+    public R delete(@RequestParam String ids,Integer scope) {
+        if(StringUtils.isNotEmpty(ids,scope)){
+            String[] arr = ids.split(",");
+            for(String id:arr){
+                String[] sql;
+                if(this.elementFormulaMappingService.count(Wrappers.<ElementFormulaMapping>lambdaQuery().eq(ElementFormulaMapping::getFormulaId,id))>1){
+                    this.jdbcTemplate.execute("delete from m_element_formula_mapping where formula_id="+id +" and scope="+scope);
+                }else {
+                    /*假设这个公式没有别的有效关联,一并删除*/
+                    sql =new String[]{
+                            "delete from m_formula where id ="+id,
+                            "delete from m_element_formula_mapping where formula_id="+id +" and scope="+scope
+                    };
+                    this.jdbcTemplate.batchUpdate(sql);
+                }
 
+            }
+            return R.success("删除成功");
+        }
+
+        return R.fail("无效id");
+    }
 
     /**
      * 删除
@@ -121,9 +146,9 @@ public class FormulaController {
     @ApiOperation(value = "删除", notes = "传入id集合")
     public R remove(@RequestParam String ids) {
         if(StringUtils.isNotEmpty(ids)) {
-            List<Long> ids_d=Func.toLongList(ids);
-            this.elementFormulaMappingService.update(Wrappers.<ElementFormulaMapping>lambdaUpdate().set(ElementFormulaMapping::getIsDeleted, 1).in(ElementFormulaMapping::getFormulaId,ids_d));
-            return R.status(this.service.deleteLogic(ids_d));
+            List<Long> idsDel=Func.toLongList(ids);
+            this.elementFormulaMappingService.update(Wrappers.<ElementFormulaMapping>lambdaUpdate().set(ElementFormulaMapping::getIsDeleted, 1).in(ElementFormulaMapping::getFormulaId,idsDel));
+            return R.status(this.service.deleteLogic(idsDel));
         }
         return R.fail("无效id");
     }
@@ -135,16 +160,16 @@ public class FormulaController {
     @GetMapping("/detail")
     public R<FormulaBean> detail(FormulaBean f) {
         if(f.getElementId()!=null){
-            StringBuilder sb = new StringBuilder("select b.* from m_element_formula_mapping a INNER JOIN m_formula b on a.formula_id=b.id where a.element_id="+f.getElementId()+" and b.is_deleted=0  and a.scope ="+f.getScope());
+            StringBuilder sb = new StringBuilder("select b.* from m_element_formula_mapping a INNER JOIN m_formula b on a.formula_id=b.id where a.element_id="+f.getElementId()+" and b.is_deleted=0 and a.scope ="+f.getScope());
             if(Func.isNotEmpty(f.getNodeId())){
                 sb.append(" and a.node_id=").append(f.getNodeId());
             }
             if(Func.isNotEmpty(f.getProjectId())){
                 sb.append(" and a.project_id=").append(f.getProjectId());
             }
-            List<Map<String,Object>> maplist =    this.jdbcTemplate.queryForList("select b.* from m_element_formula_mapping a INNER JOIN m_formula b on a.formula_id=b.id where a.element_id="+f.getElementId()+" and b.is_deleted=0 and a.scope ="+f.getScope());
-            if(Func.isNotEmpty(maplist)){
-                return R.data(BeanUtil.toBean(maplist.get(0),FormulaBean.class));
+            List<Map<String,Object>> listMap = this.jdbcTemplate.queryForList(sb.toString());
+            if(Func.isNotEmpty(listMap)){
+                return R.data(BeanUtil.toBean(listMap.get(0),FormulaBean.class));
             }
 
         }
@@ -188,7 +213,7 @@ public class FormulaController {
                           /*取层级*/
                           formula.setFormula("FC.tree(trees,WP["+bean.getK()+"])");
                     }else{
-                        /*直接取数*/
+                           /*直接取数*/
                           formula.setFormula("WP["+bean.getK()+"]");
                     }
                     formula.setMap(JSON.toJSONString(map));

+ 10 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ProjectInfoController.java

@@ -19,6 +19,8 @@ import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.service.*;
 import org.springblade.manager.vo.*;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springblade.manager.entity.ProjectInfo;
@@ -40,6 +42,7 @@ public class ProjectInfoController extends BladeController {
     private final IWbsTreePrivateService wbsTreePrivateService;
     private final IContractInfoService iContractInfoService;
     private final SaveUserInfoByProjectService saveUserInfoByProjectService;
+    private final JdbcTemplate jdbcTemplate;
 
     /**
      * 详情
@@ -142,16 +145,17 @@ public class ProjectInfoController extends BladeController {
     @ApiOperationSupport(order = 8)
     @ApiOperation(value = "逻辑删除", notes = "传入ids")
     public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-        List<ContractInfo> infos = iContractInfoService.findContractInProject(ids);
-        if (infos.size() > 0) {
+        String sql = "select id from m_contract_info where is_deleted = 0 and p_id = " + ids;
+        List<ContractInfo> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ContractInfo.class));
+        if (query.size() > 0) {
             return R.fail("当前项目有合同段,删除失败");
         }
-        List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateService.findWbsTreePrivate(ids);
-        if (wbsTreePrivates.size() > 0) {
+        Long count1 = wbsTreePrivateService.findWbsTreePrivate(ids);
+        if (count1 > 0) {
             return R.fail("当前项目存在WBS私有树,删除失败");
         }
-        List<SaveUserInfoByProjectDTO> list = saveUserInfoByProjectService.selectList(ids);
-        if (list.size() > 0) {
+        Long count2 = saveUserInfoByProjectService.selectList(ids);
+        if (count2 > 0) {
             return R.fail("当前项目被用户关联中,删除失败");
         }
         return R.status(projectInfoService.deleteLogic(Func.toLongList(ids)));

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

@@ -291,17 +291,17 @@ public class TextdictInfoController extends BladeController {
                 element.empty().append(checkbox);
             }
         } else if (textdictInfo.getTextId().equals("date")) { // 日期--年月日时分秒
-            element.empty().append("<el-date-picker v-model=" + vmode + " type='datetime' format='YYYY年MM月DD日 HH:mm:ss' value-format='yyyy-MM-dd hh:mm:ss' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
+            element.empty().append("<el-date-picker v-model=" + vmode + " type='datetime' format='YYYY年MM月DD日 HH:mm:ss' value-format='YYYY年MM月DD日 hh:mm:ss' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
         } else if (textdictInfo.getTextId().equals("dateYMD")) { // 日期--年月日
-            element.empty().append("<el-date-picker v-model=" + vmode + " type='date' format='YYYY年MM月DD日' value-format='YYYY-MM-DD' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
+            element.empty().append("<el-date-picker v-model=" + vmode + " type='date' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
         } else if (textdictInfo.getTextId().equals("dateHMS")) { // 日期--时分秒
             element.empty().append("<el-time-picker v-model=" + vmode + " type='date' format='HH:mm:ss' value-format='HH:mm:ss' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
         } else if (textdictInfo.getTextId().equals("dateSM")) { // 日期--时分
             element.empty().append("<el-time-picker v-model=" + vmode + " type='date' format='HH:mm' value-format='HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
         } else if (textdictInfo.getTextId().equals("dateMDHM")) { // 日期--月日时分
-            element.empty().append("<el-date-picker v-model=" + vmode + " type='datetime' format='MM月DD日 HH:mm' value-format='MM-DD HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
+            element.empty().append("<el-date-picker v-model=" + vmode + " type='datetime' format='MM月DD日 HH:mm' value-format='MM月DD日 HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
         } else if (textdictInfo.getTextId().equals("dateDHM")) { // 日期--日时分
-            element.empty().append("<el-date-picker v-model=" + vmode + " type='datetime' format='DD日 HH:mm' value-format='DD HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
+            element.empty().append("<el-date-picker v-model=" + vmode + " type='datetime' format='DD日 HH:mm' value-format='DD HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
         } else if (textdictInfo.getTextId().equals("daterange")) { // 时间段
             element.empty().append("<el-date-picker  v-model=" + vmode + " type='datetimerange' placeholder=" + placeholder + "  start-placeholder='开始日期'  end-placeholder='结束日期' format='YYYY年MM月DD日' trIndex=" + trindex + " keyname=" + keyname + " weighing=" + weighing + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">");
             element.children().get(0).attr("@change", "datePickerChange($event,'" + keyname + "')");

+ 24 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java

@@ -1,10 +1,13 @@
 package org.springblade.manager.controller;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.*;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.dto.WbsTreeContractDTO2;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.WbsTreeContract;
@@ -103,4 +106,25 @@ public class WbsTreeContractController extends BladeController {
         return R.fail(200, "未查询到数据");
     }
 
+    /**
+     * 客户端删除 合同段 表
+     */
+    @PostMapping("/remove")
+    @ApiOperationSupport(order = 7)
+    @ApiOperation(value = "逻辑删除", notes = "传入ids")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "id", value = "主键id", required = true),
+            @ApiImplicitParam(name = "stats", value = "状态码", required = true)
+    })
+    public R remove(@RequestParam("id") String id,@RequestParam("stats") String stats) {
+
+        WbsTreeContract wbsTreeContract = iWbsTreeContractService.getOne(Wrappers.<WbsTreeContract>query().lambda()
+                .eq(WbsTreeContract::getPKeyId, id).eq(WbsTreeContract::getIsDeleted,0) );
+        if(StringUtils.isEmpty(wbsTreeContract.getPdfUrl()) && stats.equals("0")){
+            return R.data(300,"1","该节点下有数据");
+        }
+        return R.status(iWbsTreeContractService.remove(Wrappers.<WbsTreeContract>query().lambda()
+                .eq(WbsTreeContract::getPKeyId, id).eq(WbsTreeContract::getIsDeleted,0)));
+    }
+
 }

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

@@ -205,10 +205,10 @@ public class WbsTreeController extends BladeController {
     @ApiOperationSupport(order = 8)
     @ApiOperation(value = "根据表单id查询所有元素", notes = "传入表单id")
     @ApiImplicitParam(name = "id", value = "表单id", required = true)
-    public R<List<WbsFormElementVO>> selectFormElements(@RequestParam("id") String id, Long nodeId, String search) {
+    public R<List<WbsFormElementVO>> selectFormElements(@RequestParam("id") String id, Long nodeId, String search,Integer type) {
         List<WbsFormElementVO> wbsFormElements = null;
         if (StringUtils.isNotEmpty(id)) {
-            wbsFormElements = wbsTreeService.selectFormElements(id, nodeId);
+            wbsFormElements = wbsTreeService.selectFormElements(id, nodeId,type);
             if (wbsFormElements.size() > 0) {
                 if (StringUtils.isNotEmpty(search)) {
                     wbsFormElements = wbsFormElements.stream().filter(e -> e.getEName().contains(search)).collect(Collectors.toList());

+ 3 - 12
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/FormulaClientImpl.java

@@ -1,25 +1,17 @@
 package org.springblade.manager.feign;
 
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringPool;
-import org.springblade.manager.dto.ElementData;
-import org.springblade.manager.dto.FormData;
 import org.springblade.manager.entity.Formula;
 import org.springblade.manager.formula.KeyMapper;
 import org.springblade.manager.service.IExcelTabService;
 import org.springblade.manager.service.IFormulaService;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.RestController;
-
 import java.io.FileNotFoundException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * @author yangyj
@@ -41,10 +33,9 @@ public class FormulaClientImpl implements  FormulaClient{
         StringBuilder sb = new StringBuilder();
         try {
             Map<String,String> keysMap = this.excelTabService.getTablbCols(String.valueOf(pkId),null);
-            Map<String, Object> queryForMap = this.jdbcTemplate.queryForMap("SELECT   a.p_key_id as nodeId,b.id as fieldId,b.e_key as field,c.init_table_name as tableName  from m_wbs_tree_contract a LEFT JOIN m_wbs_form_element b on a.id=b.f_id left JOIN m_wbs_tree c on a.id=c.id where b.e_key='"+key+"' and b.is_deleted=0 and a.p_key_id = (" + pkId + ")");
-          if(Func.isNotEmpty(queryForMap)) {
-              KeyMapper keyMapper = BeanUtil.toBean(queryForMap, KeyMapper.class);
-              Formula formula = this.service.getById(keyMapper.getFormulaId());
+           Long id = this.jdbcTemplate.queryForObject("select d.formula_id from m_wbs_tree_contract a join m_table_info b on a.init_table_name=b.tab_en_name join m_wbs_form_element c on c.f_id=b.id join m_element_formula_mapping d on c.id=d.element_id where a.p_key_id="+pkId+" and c.e_key='"+key+"'  ORDER BY d.scope desc limit 1",Long.class);
+          if(Func.isNotEmpty(id)) {
+              Formula formula = this.service.getById(id);
               if(Func.isNotEmpty(formula)) {
                   formula.getRelyList().forEach(e -> {
                       sb.append(keysMap.get(e.split(StringPool.COLON)[1])).append(StringPool.COMMA);

+ 13 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java

@@ -200,13 +200,23 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
     }
 
     @Override
-    public List<WbsTreeContract> getContractWbsTreeByParentId(String parentId,String contractId) {
+    public List<WbsTreeContract> getContractWbsTreeByParentId(String parentId, String contractId) {
         LambdaQueryWrapper<WbsTreeContract> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(WbsTreeContract::getParentId,parentId);
-        wrapper.eq(WbsTreeContract::getContractId,contractId);
+        wrapper.eq(WbsTreeContract::getParentId, parentId);
+        wrapper.eq(WbsTreeContract::getContractId, contractId);
         return this.wbsTreeContractService.list(wrapper);
     }
 
+    @Override
+    public boolean diySort(List<String> sortLists) {
+        int sort = 1;
+        for (String pKeyId : sortLists) {
+            WbsTreeContract sortNode = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, pKeyId));
+            wbsTreeContractService.update(Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getSort, sort++).eq(WbsTreeContract::getPKeyId, sortNode.getPKeyId()));
+        }
+        return true;
+    }
+
     @Override
     public List<WbsTreeContractTreeVOS> queryCurrentContractLogList(String contractId) {
         ContractInfo contract = this.contractInfoService.getById(contractId);

+ 8 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java

@@ -16,7 +16,8 @@
  */
 package org.springblade.manager.mapper;
 
-import feign.Param;
+
+import org.apache.ibatis.annotations.Param;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.manager.vo.ArchiveTreeContractVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -49,4 +50,10 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
 	List<ArchiveTreeContractVO2> lazyTree2(@Param("tenantId") String tenantId, @Param("parentId") Long parentId, @Param("projectId") Long projectId);
 
 	List<ArchiveTreeContractVO2> tree2(@Param("tenantId") String tenantId, @Param("disPlayTree") Integer disPlayTree, @Param("nodeType") Integer nodeType, @Param("projectId") Long projectId);
+	/**
+	 * 自动组卷规则设置节点下所有子节点
+	 * @param treeContract
+	 * @return
+	 */
+	int updateAllSonNodeIdsForArchiveAutoRule(@Param("treeContract") ArchiveTreeContract treeContract);
 }

+ 16 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml

@@ -216,5 +216,20 @@
         OR parent_id = 0
         ORDER BY sort
     </select>
-
+    <update id="updateAllSonNodeIdsForArchiveAutoRule">
+        update m_archive_tree_contract
+        set
+            archive_auto_type= #{treeContract.archiveAutoType},
+            archive_auto_node_id = #{treeContract.archive_auto_node_id}
+        where
+            is_deleted = 0 and ancestors like concat('', #{treeContract.ancestors}, '%')
+            /*最高并卷规则不能覆盖 分类并卷规则,单独组卷规则*/
+            <if test="treeContract.archiveAutoType ==1 ">
+                and archive_auto_type != 2 and archive_auto_type != 3
+            </if>
+            /*分类并卷规则不能覆盖单独组卷规则*/
+            <if test="treeContract.archiveAutoType ==2 ">
+                and archive_auto_type != 3
+            </if>
+    </update>
 </mapper>

+ 6 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectInfoMapper.xml

@@ -56,9 +56,12 @@
     <select id="queryProjectUserAmount" resultMap="projectUserAmount">
         select
             mpi.project_alias,
-            (select count(id) end from m_project_assignment_user where project_id = mpi.id and role_id in(select id from blade_role where id = '1537247986361782274' or parent_id = '1537247986361782274')) as contractor,
-            (select count(id) end from m_project_assignment_user where project_id = mpi.id and role_id in(select id from blade_role where id = '1537246384519335938' or parent_id = '1537246384519335938')) as supervision,
-            (select count(id) end from m_project_assignment_user where project_id = mpi.id and role_id in(select id from blade_role where id = '1537246243393589249' or parent_id = '1537246243393589249')) as owner
+            (select count(1) end from m_project_assignment_user where is_deleted = 0 and project_id = mpi.id and role_id in
+                (select id from blade_role where is_deleted = 0 and (id = '1537247986361782274' or parent_id = '1537247986361782274' ))) as contractor,
+            (select count(1) end from m_project_assignment_user where is_deleted = 0 and project_id = mpi.id and role_id in
+                (select id from blade_role where is_deleted = 0 and (id = '1537246384519335938' or parent_id = '1537246384519335938'))) as supervision,
+            (select count(1) end from m_project_assignment_user where is_deleted = 0 and project_id = mpi.id and role_id in
+                (select id from blade_role where is_deleted = 0 and (id = '1537246243393589249' or parent_id = '1537246243393589249'))) as owner
         from
             m_project_info as mpi
     </select>

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

@@ -373,7 +373,7 @@
         where b.id=#{id} and a.is_deleted=0
     </select>
     <select id="selectFormElements4TableId" resultMap="wbsFormElementMap">
-        select b.id,IF(c.formula_id>0,1,0)globalFormula ,b.e_name,e_type,e_length,e_allow_deviation,e_Inspection_method,CONCAT(a.tab_en_name,':',e_key) as tableElementKey,a.tab_en_name as initTableName from (select * from m_table_info where id=#{id}) a INNER JOIN  m_wbs_form_element b on a.id =b.f_id LEFT JOIN(select element_id ,formula_id from m_element_formula_mapping where scope=1 )c on b.id=c.element_id  where b.is_deleted=0
+        select b.id,IF(c.formula_id>0,1,0)globalFormula ,b.e_name,e_type,e_length,e_allow_deviation,e_Inspection_method,CONCAT(a.tab_en_name,':',e_key) as tableElementKey,a.tab_en_name as initTableName from (select * from m_table_info where id=#{id}) a INNER JOIN  m_wbs_form_element b on a.id =b.f_id LEFT JOIN(select element_id ,formula_id from m_element_formula_mapping where scope=0 )c on b.id=c.element_id  where b.is_deleted=0
     </select>
     <select id="selectPrivateFormElements" resultMap="wbsFormElementMap">
         select  * from m_wbs_form_element a

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

@@ -608,14 +608,12 @@
 
     <!-- 项目级 表单类型分类 wbs树 -->
     <select id="tabTypeLazyTreeAll" resultMap="treeNodeResultMapTabType">
-        SELECT p_key_id as id,p_key_id as primaryKeyId,title,parent_id,fill_rate as fillRate,0 as excelIds,initTableId,
+        SELECT p_key_id as id,p_key_id as primaryKeyId,title,parent_id,fill_rate as fillRate,0 as excelIds,initTableId,initTableName,
         (SELECT dict_value from blade_dict where code='table_type' and dict_key not in(-1,0) and dict_key=table_type )
         as tabType,
         (SELECT count(1) FROM m_wbs_form_element WHERE f_id = initTableId and is_deleted=0) AS "elementTotal",
         (SELECT dict_value from blade_dict where code='owner_type' and dict_key not in(-1,0) and dict_key=table_owner )
         as tabOwner,
-        /*排序*/
-        -- (SELECT sort FROM m_wbs_node_sort c WHERE a.p_key_id = c.p_key_id) AS sort,
         (
         SELECT
         CASE WHEN count(1) > 0 THEN 1 ELSE 0 END
@@ -633,13 +631,13 @@
         ) AS "has_children"
         from (
         SELECT '12345678910' as p_key_id , '表单类型' as title, 0 as parent_id,0 as table_type,0 as fill_rate,0 as
-        table_owner,0 as initTableId
+        table_owner,0 as initTableId,0 as initTableName
         union all
         SELECT dict_key as p_key_id ,dict_value as title,'12345678910' as parent_id,0 as table_type,0 as fill_rate,0 as
-        table_owner,0 as initTableId from blade_dict where code='table_type' and dict_key not in(-1,0)
+        table_owner,0 as initTableId,0 as initTableName from blade_dict where code='table_type' and dict_key not in(-1,0)
         union all
         SELECT id as p_key_id,tab_ch_name as title,tab_type as parent_id,tab_type as table_type,fill_rate,table_owner,id
-        as initTableId from m_table_info WHERE is_deleted=0
+        as initTableId,tab_en_name as initTableName from m_table_info WHERE is_deleted=0
         ) a where 1=1
         <if test="parentId != null and parentId != ''">
             and a.parent_id = #{parentId}
@@ -647,8 +645,7 @@
         <if test="titleName != null and titleName != ''">
             and a.title like concat('%',#{titleName},'%') and LENGTH(a.p_key_id)>11
         </if>
-        /*排序*/
-        -- order by sort,title
+
     </select>
 
     <select id="selectWbsTreeContractList" resultType="org.springblade.manager.entity.WbsTreePrivate">

+ 6 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java

@@ -59,4 +59,10 @@ public interface IArchiveTreeContractService extends BaseService<ArchiveTreeCont
 	List<ArchiveTreeContractVO2> lazyTree2(String tenantId, Long parentId, Long projectId);
 
 	List<ArchiveTreeContractVO2> tree2(String tenantI,Integer disPlayTree,Integer nodeType,Long projectId);
+
+	/**
+	 *项目级立卷规则新增
+	 * @return
+	 */
+	boolean saveArchiveAutoRule(Integer archiveAutoType,String nodeIds);
 }

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

@@ -31,4 +31,8 @@ public interface IArchiveTreeService extends BaseService<ArchiveTree> {
 	boolean submitArchiveTreeSort(List<ArchiveTreeSortDTO> listSort);
 
 	List<ArchiveTree> treeList(String tenantI,Integer disPlayTree,Integer nodeType);
+	
+
+
+	boolean saveAechiveAutoRule(Integer archiveAutoType,String nodeIds);
 }

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

@@ -19,6 +19,7 @@ package org.springblade.manager.service;
 import com.alibaba.fastjson.JSONArray;
 import org.springblade.core.tool.api.R;
 import org.springblade.manager.bean.TableInfo;
+import org.springblade.manager.entity.ExcelEditCallback;
 import org.springblade.manager.entity.ExcelTab;
 import org.springblade.manager.vo.ExceTabTreVO;
 import org.springblade.manager.vo.ExcelTabVO;
@@ -26,6 +27,7 @@ import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.manager.vo.ExcelTabWbsTypeVO;
 import org.springblade.manager.vo.WbsTreeVO;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -149,8 +151,6 @@ public interface IExcelTabService extends BaseService<ExcelTab> {
 
     /**
      * 在线excel 保存回调
-     * @param request
-     * @param response
      */
-    void callbackSave(HttpServletRequest request, HttpServletResponse response) throws IOException;
+    ExcelEditCallback callbackSave(ExcelEditCallback callback) ;
 }

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

@@ -33,5 +33,5 @@ public interface IFormulaService extends BaseService<Formula> {
     void format();
 
     List<Formula> getFormulaList(List<KeyMapper> keyMapperList);
-    List<KeyMapper> getKeyMapperList(List<Long> ids);
+    List<KeyMapper> getKeyMapperList(List<Long> ids,Long projectId);
 }

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

@@ -38,7 +38,7 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
 
     int deleteLogicBypKeyId(String pKeyId);
 
-    List<WbsTreePrivate> findWbsTreePrivate(String ids);
+    Long findWbsTreePrivate(String ids);
 
     boolean updateBatchByPid(List<WbsTreePrivateDTO3> wbsTreePrivates);
 

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

@@ -33,7 +33,7 @@ public interface IWbsTreeService extends BaseService<WbsTree> {
 
     boolean removeTableById(String id);
 
-    List<WbsFormElementVO> selectFormElements(String id,Long nodeId);
+    List<WbsFormElementVO> selectFormElements(String id,Long nodeId,Integer type);
     List<WbsFormElementVO> selectFormElements4Formula(String id);
     // 项目级
     List<WbsFormElementVO> selectPrivateFormElements(String id);

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

@@ -15,7 +15,7 @@ public interface SaveUserInfoByProjectService extends BaseService<SaveUserInfoBy
 
     List<SaveUserInfoByProjectDTO> queryProjectBusinessUser(Long projectId, Long contractId);
 
-    List<SaveUserInfoByProjectDTO> selectList(String ids);
+    Long selectList(String ids);
 
     boolean deleteBatchByIdsList(List<Long> idsList);
 

+ 36 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java

@@ -122,4 +122,40 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		return ForestNodeMerger.merge(baseMapper.tree2(tenantId, disPlayTree, nodeType,projectId));
 	}
 
+	@Override
+	public boolean saveArchiveAutoRule(Integer archiveAutoType, String nodeIds) {
+		//项目级不需要考虑是否为wbs节点,已经同步出来了都属于归档树节点,直接按归档树节点处理
+
+		//步骤1保存选择节点的立卷规则。
+		String[] ids = nodeIds.split(",");
+
+		Long archiveAutoNodeId=null;
+
+		//分类并卷规则的需要生成个随机数,作为同一个分类赋值archiveAutoNodeId
+		if(archiveAutoType==2){
+			double ran=(Math.random()*100000000) + 1;
+			archiveAutoNodeId=Long.parseLong(System.currentTimeMillis()+""+ran);
+		}
+		for(String nodeId:ids){
+			long nodeIdLong = Long.parseLong(nodeId);
+			ArchiveTreeContract archiveTreeContract = baseMapper.selectById(nodeIdLong);
+			archiveTreeContract.setArchiveAutoSelect(1);
+			archiveTreeContract.setArchiveAutoType(archiveAutoType);
+			if(archiveAutoType==2){
+				//分类并卷规则 提交都是一个分类类型
+				archiveTreeContract.setArchiveAutoNodeId(archiveAutoNodeId);
+			}else{
+				//最高并卷规则 选择节点的ID
+				archiveTreeContract.setArchiveAutoNodeId(nodeIdLong);
+			}
+			baseMapper.updateById(archiveTreeContract);
+		}
+
+		//TODO 步骤2保存选择节点下所有子节点的立卷规则。注意立卷规则优先级覆盖原则。(单独组卷>分类并卷>最高并卷)
+		/*
+		* 测试覆盖
+		* */
+		return false;
+	}
+
 }

+ 14 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java

@@ -195,4 +195,18 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
     }
 
 
+    @Override
+    public boolean saveAechiveAutoRule(Integer archiveAutoType, String nodeIds) {
+        //步骤1:判断选择节点是否为wbs节点。
+        //步骤2:归档树原始节点,
+            //2.1保存选择节点的立卷规则。
+                //2.1.1 最高并卷规则的需要将选择节点的ID赋值archiveAutoNodeId
+                //2.1.2 分类并卷规则的需要生成个随机数,作为同一个分类赋值archiveAutoNodeId
+            //2.2保存选择节点下所有子节点的立卷规则。注意立卷规则优先级覆盖原则。(单独组卷>分类并卷>最高并卷)
+        //步骤3:归档树关联wbs节点
+            //TODO 关联wbs节点的立卷规则保存,涉及到能否正确同步出来。再议
+            //3.1保存选择节点的立卷规则。
+            //3.2保存选择节点下所有子节点的立卷规则。注意立卷规则优先级覆盖原则。(单独组卷>分类并卷>最高并卷)
+        return false;
+    }
 }

+ 278 - 207
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -27,9 +27,16 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.mixsmart.utils.ListUtils;
 import com.spire.xls.*;
+import com.spire.xls.CellRange;
+import com.spire.xls.Workbook;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang3.ObjectUtils;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.util.IOUtils;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
@@ -43,6 +50,7 @@ import org.springblade.business.vo.SaveContractLogVO;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.common.vo.DataVO;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.oss.model.BladeFile;
@@ -50,6 +58,7 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.*;
+import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.formula.KeyMapper;
@@ -60,15 +69,22 @@ import org.springblade.manager.utils.FileUtils;
 import org.springblade.manager.vo.*;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.cache.ParamCache;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.TransactionDefinition;
+import org.springframework.transaction.TransactionStatus;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.DefaultTransactionDefinition;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.imageio.ImageIO;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.awt.*;
+import java.awt.Color;
 import java.awt.image.BufferedImage;
 import java.io.*;
 import java.net.URL;
@@ -87,37 +103,26 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTab> implements IExcelTabService {
 
-    //客户端资料查询接口
     private final InformationQueryClient informationQueryClient;
-    // 元素信息表-
     private final IWbsTreeContractService wbsTreeContractService;
-
     private final IFormulaService formulaService;
-    private final JdbcTemplate jdbcTemplate;
 
-    private final IWbsParamService wbsParamService;
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
 
+    @Autowired
+    private DataSourceTransactionManager transactionManager1;
+    private final IWbsParamService wbsParamService;
     private final IWbsTreePrivateService wbsTreePrivateService;
-
     private final ContractLogClient contractLogClient;
-
-    // 表单字典信息表
     private final ITextdictInfoService textdictInfoService;
-
-    // Oss接口
     private final NewIOSSClient newIOSSClient;
-    // 表单附件信息
     private final ITableFileService tableFileService;
-
-    // 合同端信息
     private final IContractInfoService contractInfoService;
-
     private final IProjectInfoService projectInfoService;
-
-    // 用户操作日志信息
     private final OperationLogClient operationLogClient;
-
     private final TrialSelfInspectionRecordClient inspectionRecordClient;
+    private final TableInfoServiceImpl tableInfoService;
 
     @Override
     public IPage<ExcelTabVO> selectExcelTabPage(IPage<ExcelTabVO> page, ExcelTabVO excelTab) {
@@ -333,7 +338,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             /*每次都是部分表单提交,保证跨节点跨表取数正常,其次是反向依赖的被动刷新*/
             List<AppWbsTreeContractVO> tableAll = wbsTreeContractService.searchNodeAllTable(nodeId.toString(), "1", tableInfoList.get(0).getContractId(), tableInfoList.get(0).getProjectId());
             StopWatch stopWatch = new StopWatch();
-            List<KeyMapper> keyMappers = this.formulaService.getKeyMapperList(tableInfoList.stream().map(TableInfo::getPkeyId).filter(Func::isNotEmpty).map(Long::parseLong).collect(Collectors.toList()));
+            List<KeyMapper> keyMappers = this.formulaService.getKeyMapperList(tableInfoList.stream().map(TableInfo::getPkeyId).filter(Func::isNotEmpty).map(Long::parseLong).collect(Collectors.toList()), null);
             if (Func.isNotEmpty(keyMappers)) {
                 Map<String, Map<String, String>> coordinateMap = new HashMap<>(keyMappers.size() * 2);
                 keyMappers.forEach(e -> {
@@ -509,73 +514,50 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
     /**
      * 在线excel 编辑回调
-     *
-     * @param request
-     * @param response
      */
     @Override
-    public void callbackSave(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        PrintWriter writer = response.getWriter();
-        String body = "";
-        try {
-            Scanner scanner = new Scanner(request.getInputStream());
-            scanner.useDelimiter("\\A");
-            body = scanner.hasNext() ? scanner.next() : "";
-            scanner.close();
-        } catch (Exception ex) {
-            writer.write("get request.getInputStream error:" + ex.getMessage());
-            return;
-        }
-        if (body.isEmpty()) {
-            writer.write("empty request.getInputStream");
-            return;
-        }
-        JSONObject jsonObj = JSON.parseObject(body);
-        System.out.println("回调参数对象 =====》》》 " + jsonObj);
-        int status = (Integer) jsonObj.get("status");
+    public ExcelEditCallback callbackSave(ExcelEditCallback callback) {
+        ExcelEditCallback editCallback = new ExcelEditCallback();
+        editCallback.setError(0); //初始化返回值
+        int status = callback.getStatus();
         int saved = 0;
         //status=6,表示点击保存按钮 2 关闭保存
         if (status == 3 || status == 6) //MustSave, Corrupted
         {
             //获取url
-            String downloadUri = (String) jsonObj.get("url");
+            String downloadUri = callback.getUrl();
             downloadUri = downloadUri.replaceAll("amp;", "");
             try {
                 //获取onlyOffice缓存中的文件流
-                String fileName = request.getParameter("fileName");
-                System.out.println("====下载的文件名:" + fileName);
                 URL url = new URL(downloadUri);
                 java.net.HttpURLConnection connection = (java.net.HttpURLConnection) url.openConnection();
-                InputStream stream = connection.getInputStream();
-                if (stream == null) {
-                    throw new Exception("Stream is null");
+                InputStream inputStream = connection.getInputStream();
+                if (inputStream == null) {
+                    throw new Exception("文件为空");
                 }
-                Long tabId = jsonObj.getLong("key");
+                Long tabId = callback.getKey();
                 if (tabId == null) {
-                    throw new Exception("key不能为空");
+                    throw new Exception("excel为空");
                 }
                 //获取数据库信息
                 ExcelTab excelTab = baseMapper.selectById(tabId);
-
                 //上传新文件到文件服务器
-                byte[] officeByte = IoUtil.readToByteArray(stream);
-                BladeFile bladeFile = newIOSSClient.updateFile(officeByte, excelTab.getName());
-
+                byte[] officeByte = IoUtil.readToByteArray(inputStream);
+                BladeFile bladeFile = this.newIOSSClient.updateFile(officeByte, excelTab.getExtension());
                 //修改本地数据信息
-                excelTab.setHtmlUrl(bladeFile.getLink());
+                excelTab.setFileUrl(bladeFile.getLink());
                 //获取文件大小
                 int size = connection.getContentLength() / 1024 / 1024; //单位M
                 excelTab.setAttachSize(Long.parseLong(size + ""));
+                excelTab.setStatus(3);
                 baseMapper.updateById(excelTab);
                 connection.disconnect();
-                //根据文件编号删除文件服务器的文件
-
-            } catch (Exception ex) {
-                saved = 1;
-                ex.printStackTrace();
+            } catch (Exception e) {
+                editCallback.setError(1);
+                e.printStackTrace();
             }
         }
-        writer.write("{\"error\":" + saved + "}");
+        return editCallback;
     }
 
 
@@ -590,114 +572,146 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         if (linkProcessList == null) {
             linkProcessList = new ArrayList<>();
         }
-
         //获取数据所在数据表名
-        WbsTreeContract table = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery()
+        WbsTreeContract contractNode = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery()
                 .eq(WbsTreeContract::getContractId, tableInfoList.get(0).getContractId())
                 .eq(WbsTreeContract::getTableType, 111));
-        if (table == null) {
-            return null;
-        }
-        String tableName = table.getInitTableName();
-        if (StringUtils.isEmpty(tableName)) {
-            return null;
-        }
-
-        //获取首件记录ID
-        String firstId = tableInfoList.get(0).getFirstId();
-        if (StringUtils.isNotEmpty(firstId)) {
-            //删除掉旧数据
-            this.jdbcTemplate.execute("DELETE FROM " + tableName + " WHERE group_id = " + firstId);
-        } else {
-            firstId = SnowFlakeUtil.getId() + "";
-        }
+        if (ObjectUtil.isNotEmpty(contractNode)) {
+            WbsTreePrivate wbsTreePrivate = wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery()
+                    .eq(WbsTreePrivate::getId, contractNode.getId())
+                    .eq(WbsTreePrivate::getProjectId, contractNode.getProjectId())
+                    .eq(WbsTreePrivate::getWbsId, contractNode.getWbsId())
+                    .eq(WbsTreePrivate::getTableType, 111)
+            );
+            if (StringUtils.isNotEmpty(wbsTreePrivate.getInitTableName())) {
+                if (StringUtils.isNotEmpty(wbsTreePrivate.getInitTableId())) {
+                    org.springblade.manager.entity.TableInfo table = tableInfoService.getBaseMapper().selectById(wbsTreePrivate.getInitTableId());
+                    if (ObjectUtil.isNotEmpty(table)) {
+                        //获取首件记录ID
+                        String firstId = tableInfoList.get(0).getFirstId();
+                        if (StringUtils.isNotEmpty(firstId)) {
+                            //删除掉旧数据
+                            this.jdbcTemplate.execute("DELETE FROM " + table.getTabEnName() + " WHERE group_id = " + firstId);
+                        } else {
+                            firstId = SnowFlakeUtil.getId() + "";
+                        }
 
-        //获取上传的文件相关
-        String sourceUrl = tableInfoList.get(0).getSourceUrl(),
-                pdfUrl = tableInfoList.get(0).getPdfUrl(),
-                firstFileName = tableInfoList.get(0).getFirstFileName();
+                        //获取上传的文件相关
+                        String sourceUrl = tableInfoList.get(0).getSourceUrl(),
+                                pdfUrl = tableInfoList.get(0).getPdfUrl(),
+                                firstFileName = tableInfoList.get(0).getFirstFileName();
 
-        //新增数据
-        for (TableInfo tableInfo : tableInfoList) {
-            //获取字段信息
-            LinkedHashMap<String, String> dataMap2 = tableInfo.getDataMap();
+                        //新增数据
+                        for (TableInfo tableInfo : tableInfoList) {
+                            //获取字段信息
+                            LinkedHashMap<String, String> dataMap2 = tableInfo.getDataMap();
 
-            //拼接SQL
-            StringBuilder sql = new StringBuilder("INSERT INTO " + tableName),
-                    keySql = new StringBuilder("id, group_id"),
-                    valSql = new StringBuilder("" + SnowFlakeUtil.getId() + ", " + firstId);
+                            //拼接SQL
+                            StringBuilder sql = new StringBuilder("INSERT INTO " + table.getTabEnName()),
+                                    keySql = new StringBuilder("id, group_id"),
+                                    valSql = new StringBuilder("" + SnowFlakeUtil.getId() + ", " + firstId);
 
-            for (String key : dataMap2.keySet()) {
-                keySql.append(", ").append(key);
-                valSql.append(", '").append(dataMap2.get(key)).append("'");
-            }
+                            for (String key : dataMap2.keySet()) {
+                                keySql.append(", ").append(key);
+                                valSql.append(", '").append(dataMap2.get(key)).append("'");
+                            }
 
-            sql.append("(").append(keySql).append(")").append(" values(").append(valSql).append(")");
+                            sql.append("(").append(keySql).append(")").append(" values(").append(valSql).append(")");
 
-            //新增数据
-            try {
-                this.jdbcTemplate.execute(sql.toString());
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
+                            //新增数据
+                            try {
+                                this.jdbcTemplate.execute(sql.toString());
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            }
+                        }
 
-        //获取文件题名
-        String fileTitleNames = this.getFileTitleNames(firstNodeId);
+                        //获取文件题名
+                        String fileTitleNames = this.getFileTitleNames(linkProcessList);
 
-        try {
-            //新增或修改首件记录
-            return this.informationQueryClient.saveOrUpdateInformationQueryData(firstNodeId, table.getPKeyId() + "", firstId, StringUtils.isNotEmpty(fileTitleNames) ? fileTitleNames : "首件文件名称为空", Integer.parseInt(tableInfoList.get(0).getClassify()), 2, "true", sourceUrl, pdfUrl, firstFileName, linkProcessList);
-        } catch (Exception e) {
-            e.printStackTrace();
+                        try {
+                            //新增或修改首件记录
+                            return this.informationQueryClient.saveOrUpdateInformationQueryData(firstNodeId, contractNode.getPKeyId() + "", firstId, StringUtils.isNotEmpty(fileTitleNames) ? fileTitleNames : "首件文件名称为空", Integer.parseInt(tableInfoList.get(0).getClassify()), 2, "true", sourceUrl, pdfUrl, firstFileName, linkProcessList);
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }
+            }
         }
         return null;
     }
 
     //首件文件题名
-    private String getFileTitleNames(String firstNodeId) {
-        WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, Long.parseLong(firstNodeId)));
-        //获取到该项目的首件节点以及上级的单位工程节点、分项工程节点
-        List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateService.getBaseMapper().selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
-                .eq(WbsTreePrivate::getProjectId, wbsTreeContract.getProjectId())
-                .eq(WbsTreePrivate::getWbsId, wbsTreeContract.getWbsId())
-                .eq(WbsTreePrivate::getType, 1)
-                .and(f -> f.eq(WbsTreePrivate::getNodeType, 111).or().eq(WbsTreePrivate::getNodeType, 1).or().eq(WbsTreePrivate::getNodeType, 4))
+    private String getFileTitleNames(List<JSONObject> linkProcessList) {
+        //关联的工序资料ids
+        List<String> linkIds = linkProcessList.stream().map(json -> json.getString("id")).distinct().collect(Collectors.toList());
+        String sql = "select wbs_id from u_information_query where id in(" + StringUtils.join(linkIds, ",") + ")";
+        List<InformationQuery> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(InformationQuery.class));
+
+        //合同段树节点ids
+        List<Long> contractNodePkeyIds = query.stream().map(InformationQuery::getWbsId).collect(Collectors.toList());
+        //选择关联的工序节点信息
+        List<WbsTreeContract> wbsTreeContractNodeRecord = new ArrayList<>(wbsTreeContractService.getBaseMapper().selectList(Wrappers.<WbsTreeContract>lambdaQuery().in(WbsTreeContract::getPKeyId, contractNodePkeyIds)));
+        WbsTreeContract wbsTreeContractOne = wbsTreeContractNodeRecord.stream().findAny().orElse(null);
+        assert wbsTreeContractOne != null;
+        //单位工程、分项工程、首件节点信息
+        List<WbsTreeContract> wbsTreeContractDWFXSJList = wbsTreeContractService.getBaseMapper().selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                .eq(WbsTreeContract::getProjectId, wbsTreeContractOne.getProjectId())
+                .eq(WbsTreeContract::getContractId, wbsTreeContractOne.getContractId())
+                .eq(WbsTreeContract::getWbsId, wbsTreeContractOne.getWbsId())
+                .eq(WbsTreeContract::getType, 1)
+                .and(obj -> obj.eq(WbsTreeContract::getNodeType, 1).or().eq(WbsTreeContract::getNodeType, 4).or().eq(WbsTreeContract::getNodeType, 111))
         );
 
-        WbsTreePrivate firstNode = wbsTreePrivates.stream().filter(f -> f.getNodeType().equals(111)).findAny().orElse(null);
+        List<WbsTreeContract> dwList = wbsTreeContractDWFXSJList.stream().filter(f -> f.getNodeType().equals(1) && f.getParentId() != 0L).collect(Collectors.toList());
+
+        List<WbsTreeContract> fxList = wbsTreeContractDWFXSJList.stream().filter(f -> f.getNodeType().equals(4)).collect(Collectors.toList());
 
-        List<WbsTreePrivate> collect1 = wbsTreePrivates.stream().filter(f -> f.getNodeType().equals(1) && f.getParentId() != 0L).collect(Collectors.toList());
+        WbsTreeContract sjObj = wbsTreeContractDWFXSJList.stream().filter(f -> f.getNodeType().equals(111)).findAny().orElse(null);
 
-        List<WbsTreePrivate> collect4 = wbsTreePrivates.stream().filter(f -> f.getNodeType().equals(4)).collect(Collectors.toList());
+        List<String> ancestors = wbsTreeContractNodeRecord.stream().map(WbsTreeContract::getAncestors).collect(Collectors.toList());
 
-        StringBuilder fileTitleNames = new StringBuilder();
+        if (ObjectUtil.isNotEmpty(sjObj)) {
 
-        if (ObjectUtil.isNotEmpty(firstNode)) {
-            for (WbsTreePrivate obj1 : collect1) {
-                assert firstNode != null;
-                if (firstNode.getAncestors().contains(obj1.getId().toString())) {
-                    fileTitleNames.append(obj1.getNodeName());
+            List<String> dwTitleList = new ArrayList<>();
+            for (WbsTreeContract dw : dwList) {
+                for (String ancestorId : ancestors) {
+                    if (ancestorId.contains(dw.getId().toString())) {
+                        dwTitleList.add(dw.getNodeName());
+                    }
                 }
             }
+            String dwNames = StringUtils.join(dwTitleList.stream().distinct().collect(Collectors.toList()), "");
 
-            for (WbsTreePrivate obj4 : collect4) {
-                assert firstNode != null;
-                if (firstNode.getAncestors().contains(obj4.getId().toString())) {
-                    fileTitleNames.append(obj4.getNodeName());
-                    break;
+            List<String> fxTitleList = new ArrayList<>();
+            for (WbsTreeContract fx : fxList) {
+                for (String ancestorId : ancestors) {
+                    if (ancestorId.contains(fx.getId().toString())) {
+                        fxTitleList.add(fx.getNodeName());
+                    }
                 }
             }
+            String fxNames = StringUtils.join(fxTitleList.stream().distinct().collect(Collectors.toList()), "、");
 
-            assert firstNode != null;
-            return fileTitleNames.append(firstNode.getNodeName()).toString();
+            assert sjObj != null;
+            return dwNames + fxNames + sjObj.getNodeName();
+
+        } else {
+            return "";
         }
+    }
 
-        return "";
+
+    public TransactionStatus beginTransaction(DataSourceTransactionManager transactionManager) {
+        DefaultTransactionDefinition def = new DefaultTransactionDefinition();//事务定义类
+        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
+        TransactionStatus status = transactionManager.getTransaction(def);// 返回事务对象
+        return status;
     }
 
+
     @Override
-    @Transactional
     public R saveOrUpdateInfo(List<TableInfo> tableInfoList) {
 
         if (ListUtils.isNotEmpty(tableInfoList)) {
@@ -714,7 +728,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     String tabName = wbsTreeContract.getInitTableName();
                     // 判读修改还是 添加
                     String delSql = "delete from " + tabName + " where p_key_id=" + tableInfo.getPkeyId();
-                    jdbcTemplate.execute(delSql);
+
 
                     String sqlInfo = "";
                     LinkedHashMap<String, String> dataMap2 = tableInfo.getDataMap();
@@ -745,7 +759,16 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     updateWrapper.in("p_key_id", tableInfo.getPkeyId());
                     updateWrapper.set("is_tab_pdf", 2);
                     wbsTreeContractService.update(updateWrapper);
-                    jdbcTemplate.execute(sqlInfo);
+
+                    TransactionStatus transactionStatus = this.beginTransaction(transactionManager1);
+                    try {
+                        jdbcTemplate.execute(delSql);
+                        jdbcTemplate.execute(sqlInfo);
+                        transactionManager1.commit(transactionStatus);
+                    } catch (Exception e) {
+                        transactionManager1.rollback(transactionStatus);
+                        e.printStackTrace();
+                    }
                 }
 
                 //获取节点
@@ -941,7 +964,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             for (String key : mysqlData.keySet()) {
                 String tabVal = mysqlData.get(key) + "";
                 // 时间段处理
-                if (StringUtils.isNotEmpty(tabVal) && !tabVal.equals("null")) {
+                if (StringUtils.isNotEmpty(tabVal) && tabVal.indexOf("null") < 0) {
                     if (tabVal.indexOf("T") >= 0 && tabVal.indexOf(".000Z]") >= 0) {
                         String[] tabData = tabVal.split("_\\^_");
 
@@ -1024,8 +1047,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
     @Override
     public R getBussPdfInfo(Long pkeyId) throws Exception {
-
         String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        //String file_path = "C:\\Users\\泓创开发\\Desktop";
 
         WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
                 .eq(WbsTreeContract::getPKeyId, pkeyId));
@@ -1054,20 +1077,63 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         Map<String, Object> DataInfo = (Map<String, Object>) getBussDataInfo(pkeyId).getData();
 
         // 获取excel流 和 html流
-        Workbook wb = new Workbook();
-        wb.loadFromMHtml(CommonUtil.getOSSInputStream(excelTab.getFileUrl()));
+        InputStream exceInp = CommonUtil.getOSSInputStream(excelTab.getFileUrl());
+        org.apache.poi.ss.usermodel.Workbook workbook = WorkbookFactory.create(exceInp);
+
         //获取工作表
-        Worksheet sheet = wb.getWorksheets().get(0);
+        Sheet sheet = workbook.getSheetAt(0);
+        sheet.setForceFormulaRecalculation(true);
+
         // 标题添加
         ProjectInfo projectInfo = projectInfoService.getById(wbsTreeContract.getProjectId());
-        CellRange[] columns = sheet.getMergedCells();
-        for (int i = 0; i < columns.length; i++) {
-            CellRange cellRange = columns[i];
-            System.out.println(cellRange.getStyle().getFont().getSize());
-            if (cellRange.getStyle().getFont().getSize() >= 14) {
-                cellRange.setText(projectInfo.getProjectName());
-                cellRange.getStyle().getFont().setSize(20);
-                break;
+
+        int all = sheet.getRow(0).getLastCellNum();
+        int mergedCellCnt = sheet.getNumMergedRegions();
+        List<Map<String, Integer>> titleList = new ArrayList<>();
+        for (int i = 0; i < mergedCellCnt - 1; i++) {
+            CellRangeAddress mergedCell = sheet.getMergedRegion(i);
+            int xx = mergedCell.getNumberOfCells();
+            if (xx == all) {
+                int fisRow = mergedCell.getFirstRow();
+                int firsrCol = mergedCell.getFirstColumn();
+                Cell cell = sheet.getRow(fisRow).getCell(firsrCol);
+                short fontIndex = cell.getCellStyle().getFontIndex();
+                Font fontAt = workbook.getFontAt(fontIndex);
+                short fontHeightInPoints = fontAt.getFontHeightInPoints();
+                if (fontHeightInPoints >= 14) {
+                    Map<String, Integer> titleMap = new HashMap<>();
+                    titleMap.put("index", i);
+                    titleMap.put("x", firsrCol);
+                    titleMap.put("y", fisRow);
+                    String data = cell.getStringCellValue();
+                    if (StringUtils.isNotEmpty(data)) {
+                        titleMap.put("val", 2);
+                    } else {
+                        titleMap.put("val", 1);
+                    }
+                    titleList.add(titleMap);
+                }
+            }
+        }
+
+        //添加标题
+        System.out.println(titleList.size());
+        if (titleList != null) {
+            if (titleList.size() == 1) {
+                Map<String, Integer> titData = titleList.get(0);
+                if (titData.get("val") == 1) {
+                    Cell cell = sheet.getRow(titData.get("y")).getCell(titData.get("x"));
+                    cell.setCellValue(projectInfo.getProjectName());
+                }
+            } else if (titleList.size() >= 2) {
+                for (int i = 0; i < titleList.size(); i++) {
+                    Map<String, Integer> titData = titleList.get(i);
+                    if (titData.get("val") == 2) {
+                        Map<String, Integer> titData2 = titleList.get(i - 1);
+                        Cell cell = sheet.getRow(titData2.get("y")).getCell(titData2.get("x"));
+                        cell.setCellValue(projectInfo.getProjectName());
+                    }
+                }
             }
         }
 
@@ -1091,10 +1157,13 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
                             if (data.html().indexOf("x1") >= 0 && data.html().indexOf("y1") >= 0) {
                                 int x1 = 0;
+                                int x2 = 0;
                                 int y1 = 0;
+                                int y2 = 0;
 
                                 if (data.html().indexOf("el-tooltip") >= 0) {
                                     x1 = Integer.parseInt(data.children().get(0).children().get(0).attr("x1"));
+                                    x2 = Integer.parseInt(data.children().get(0).children().get(0).attr("x2"));
                                     y1 = Integer.parseInt(data.children().get(0).children().get(0).attr("y1"));
                                 } else {
                                     x1 = Integer.parseInt(data.children().get(0).attr("x1"));
@@ -1107,7 +1176,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                 if (myData.indexOf("T") >= 0 && myData.indexOf("-") >= 0) {
                                     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
                                     sdf.setTimeZone(TimeZone.getTimeZone("GTM+8"));
-                                    SimpleDateFormat formatStr = new SimpleDateFormat("yyyy年MM-dd");
+                                    SimpleDateFormat formatStr = new SimpleDateFormat("yyyy年MM月dd日");
                                     if (myData.indexOf(",") >= 0 && myData.indexOf("]") >= 0) {
 
                                         myData = myData.replace("[", "").replace("]", "").replaceAll("'", "");
@@ -1130,58 +1199,37 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                 //https:bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20220819/b53cb6700db369381e3b03d7737bcdec.jpg__16_1
                                 if (myData.indexOf("https") >= 0 && myData.indexOf("aliyuncs") >= 0) {
 
-                                    BufferedImage image = ImageIO.read(CommonUtil.getOSSInputStream(myData));
-
-                                    int colspan = data.attr("COLSPAN").equals("") ? 0 : Integer.parseInt(data.attr("COLSPAN"));
-                                    int rowspan = data.attr("ROWSPAN").equals("") ? 0 : Integer.parseInt(data.attr("ROWSPAN"));
-                                    int picHeight = 0;
-                                    int picWidth = 0;
-
-                                    if (rowspan == 0) {
-                                        String dataInfo = trs.get(y1).attr("height");
-                                        if (StringUtils.isEmpty(dataInfo)) {
-                                            Element firstTd = trs.get(y1 - 1).children().get(0);
-                                            String[] heg = firstTd.attr("style").split(";");
-                                            for (String str : heg) {
-                                                if (str.indexOf("height:") >= 0) {
-                                                    picHeight = Integer.parseInt(str.split(":")[1].replaceAll("px", ""));
-                                                }
-                                            }
-                                        } else {
-                                            picHeight = Integer.parseInt(dataInfo);
-                                        }
-                                    } else {
-                                        for (int i = y1; i <= (y1 + rowspan); i++) { // 跨列处理
-                                            String dataInfo = trs.get(i).attr("height");
-                                            if (StringUtils.isNotEmpty(dataInfo)) {
-                                                picHeight += Integer.parseInt(dataInfo);
-                                            }
-                                        }
-                                    }
-
-                                    if (colspan >= 1) {
-                                        for (int i = x1 - 1; i < x1 + colspan - 1; i++) {
-                                            String dataInfo = cols.get(i).attr("width").replaceAll("px", "");
-                                            if (StringUtils.isNotEmpty(dataInfo)) {
-                                                picWidth += Integer.parseInt(dataInfo);
-                                            }
-                                        }
-                                    }
+                                    InputStream imageIn = CommonUtil.getOSSInputStream(myData);
+                                    byte[] bytes = IOUtils.toByteArray(imageIn);
+                                    // 这里根据实际需求选择图片类型
+                                    int pictureIdx = workbook.addPicture(bytes, 6);
+
+                                    CreationHelper helper = workbook.getCreationHelper();
+                                    ClientAnchor anchor = helper.createClientAnchor();
+                                    anchor.setCol1(x1); // param1是列号
+                                    anchor.setCol2(x2);
+                                    anchor.setRow1(y1); // param2是行号
+                                    anchor.setRow2(y2); // param2是行号
+                                    //
+                                    Drawing drawing = sheet.createDrawingPatriarch();
+                                    anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
+                                    // 插入图片
+                                    Picture pict = drawing.createPicture(anchor, pictureIdx); // 调整图片占单元格百分比的大小,1.0就是100%
+                                    pict.resize(1, 1);
+                                    FileUtils.imageOrientation(sheet, anchor, new DataVO(x1 - 1, y1 - 1));
+
+                                } else if (myData.equals("1") && data.html().indexOf("hc-form-checkbox-group") >= 0) {
+                                    Cell cell = sheet.getRow(y1 - 1).getCell(x1 - 1);
+                                    String exceVal = cell.getStringCellValue().replaceAll(" ", "");
+                                    short fontIndex = cell.getCellStyle().getFontIndex();
+                                    Font fontAt = workbook.getFontAt(fontIndex);
+                                    fontAt.setFontName("EUDC");
+                                    cell.setCellValue(exceVal.replace("□", "\u2611"));
+                                } else {
+                                    Cell cell = sheet.getRow(y1 - 1).getCell(x1 - 1);
+                                    cell.setCellValue(myData);
 
-                                    ExcelPicture pic = sheet.getPictures().add(y1, x1, image);
-                                    pic.setAutoSize(true);
-                                    pic.setWidth(picWidth - 10);
 
-                                    System.out.println(sheet.get(y1, x1).getRowHeight());
-                                    System.out.println(sheet.get(y1, x1).getRows());
-                                    pic.setHeight(picHeight);
-                                    pic.setLeft(5);
-                                } else {
-                                    CellRange cellRange = sheet.getCellRange(y1, x1);
-                                    cellRange.getCellStyle().getExcelFont().setFontName("EUDC");
-                                    cellRange.setText(myData);
-                                    System.out.println(cellRange.getStyle().getFont().getFontName());
-                                    System.out.println("后" + cellRange.getText());
                                 }
                             }
                         }
@@ -1206,16 +1254,27 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                         }
                         int y1 = Integer.parseInt(data.children().get(0).attr("y1"));
 
-                        final CellRange cellRange = sheet.getCellRange(y1, x1);
-                        cellRange.setText(e.getId() + "");
-                        cellRange.getCellStyle().getFont().setColor(Color.white);
-
+                        Cell cell = sheet.getRow(y1 - 1).getCell(x1 - 1);
+                        cell.setCellValue(e.getId() + "");
+                        short fontIndex = cell.getCellStyle().getFontIndex();
+                        Font oldfontAt = workbook.getFontAt(fontIndex);
+
+                        Font redFont = workbook.createFont();
+                        redFont.setColor(IndexedColors.WHITE.getIndex());
+                        redFont.setFontHeightInPoints(oldfontAt.getFontHeightInPoints());
+                        redFont.setFontName(oldfontAt.getFontName());
+                        CellStyle cellStyle = workbook.createCellStyle();
+                        cellStyle.setFont(redFont);
+                        cell.setCellStyle(cellStyle);
                     }
                 }
             }
         }
 
-        wb.saveToFile(excelPath, ExcelVersion.Version2010);
+        //  wb.saveToFile(excelPath, ExcelVersion.Version2010);
+        //输出流
+        FileOutputStream outputStream = new FileOutputStream(excelPath);
+        workbook.write(outputStream);
         FileUtils.excelToPdf(excelPath, pdfPath);
         BladeFile bladeFile = newIOSSClient.uploadFile(pkeyId + ".pdf", pdfPath);
         //
@@ -1257,13 +1316,21 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         updateWrapper.in("p_key_id", pkeyId + "");
         updateWrapper.set("pdf_url", bladeFile2.getLink());
         wbsTreeContractService.update(updateWrapper);
-        wb.dispose();
+
+        if (outputStream != null) {
+            IoUtil.closeQuietly(outputStream);
+        }
+        if (exceInp != null) {
+            IoUtil.closeQuietly(exceInp);
+        }
+
         return R.data(bladeFile2.getLink());
     }
 
     @Override
     public void getBussPdfs(String nodeId, String classify, String contractId, String projectId) throws Exception {
         String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        //String file_path = "/Users/hongchuangyanfa/Desktop/";
         // 获取有权限的节点信息
         List<AppWbsTreeContractVO> wbsTreeContractList = wbsTreeContractService.searchNodeAllTable(nodeId, classify, contractId, projectId);
         List<String> data = new ArrayList<>();
@@ -1291,8 +1358,11 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         FileUtils.mergePdfPublicMethods(data, listPdf);
         BladeFile bladeFile = this.newIOSSClient.uploadFile(nodeId + ".pdf", listPdf);
 
+        //获取当前填报节点sort
+        WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, nodeId));
+
         // 合并pdf集合
-        String sql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "' where classify='" + classify + "' and  wbs_id='" + nodeId + "' and contract_id ='" + contractId + "' ";
+        String sql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "' ,sort = " + (ObjectUtil.isNotEmpty(wbsTreeContract) ? wbsTreeContract.getSort() : 0) + " where classify='" + classify + "' and  wbs_id='" + nodeId + "' and contract_id ='" + contractId + "' ";
         jdbcTemplate.execute(sql);
     }
 
@@ -1493,6 +1563,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                 if (data.html().contains("el-tooltip")) {
                                     x1 = Integer.parseInt(data.children().get(0).children().get(0).attr("x1"));
                                     y1 = Integer.parseInt(data.children().get(0).children().get(0).attr("y1"));
+
                                 } else {
                                     x1 = Integer.parseInt(data.children().get(0).attr("x1"));
                                     y1 = Integer.parseInt(data.children().get(0).attr("y1"));

+ 21 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -540,21 +540,34 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     }
 
     @Override
-    public List<KeyMapper> getKeyMapperList(List<Long> ids) {
-        List<Map<String,Object>> listMap = this.jdbcTemplate.queryForList(" select a.init_table_name as tableName,a.p_key_id as pkId ,c.e_key as field,c.e_name as eName,c.id  as fieldId ,d.scope,d.formula_id as formulaId " +
+    public List<KeyMapper> getKeyMapperList(List<Long> ids,Long projectId) {
+        List<Map<String,Object>> listMap = this.jdbcTemplate.queryForList(" select a.init_table_name as tableName,a.p_key_id as pkId ,c.e_key as field,c.e_name as eName,c.id  as fieldId   " +
                 "from m_wbs_tree_contract a " +
                 "inner join m_table_info b on a.init_table_name=b.tab_en_name " +
                 "INNER JOIN m_wbs_form_element c on b.id=c.f_id " +
-                "left join m_element_formula_mapping d on c.id=d.element_id " +
-                "where a.p_key_id in("+ids.stream().map(String::valueOf).collect(Collectors.joining(","))+")  ORDER BY a.init_table_name,d.scope");
+                "where a.p_key_id in("+ids.stream().map(String::valueOf).collect(Collectors.joining(","))+")  ORDER BY a.init_table_name");
         /*当前节点的参数可以是私有级和公有级*/
 
         if(Func.isNotEmpty(listMap)){
             /*根据元素id分组*/
-            Map<Long,List<KeyMapper>> groupList= listMap.stream().map(m->BeanUtil.toBean(m,KeyMapper.class)).collect(Collectors.groupingBy(KeyMapper::getFieldId,LinkedHashMap::new,Collectors.toList()));
-            Set<KeyMapper> set = new HashSet<>(groupList.size()*2);
-            for(Map.Entry<Long,List<KeyMapper>>entry:groupList.entrySet()){
-                entry.getValue().stream().max(Comparator.comparing(KeyMapper::getScope)).ifPresent(set::add);
+            List<KeyMapper> list= listMap.stream().map(m->BeanUtil.toBean(m,KeyMapper.class)).collect(Collectors.toList());
+            Set<KeyMapper> set = new HashSet<>(list.size()*2);
+            StringBuilder sb = new StringBuilder("select element_id elementId,formula_id formulaId,scope from m_element_formula_mapping where scope<30 and element_id in("+list.stream().map(KeyMapper::getFieldId).map(Func::toStr).collect(Collectors.joining(","))+") and is_deleted=0 ");
+            if(projectId!=null){
+                sb.append(" and project_id=").append(projectId);
+            }
+            List<Map<String,Object>> efMap= this.jdbcTemplate.queryForList(sb.toString());
+            if(Func.isNotEmpty(efMap)){
+                Map<Long,List<Map<String,Object>>> efGroup= efMap.stream().collect(Collectors.groupingBy(e->Func.toLong(e.get("elementId"))));
+                list.forEach(e->{
+                    List<Map<String,Object>> tmp = efGroup.get(e.getFieldId());
+                    if(Func.isNotEmpty(tmp)){
+                        tmp.stream().max(Comparator.comparing(oo->Func.toInt(oo.get("scope")))).ifPresent(d->{
+                            e.setFormulaId(Func.toLong(d.get("formulaId")));
+                            set.add(e);
+                        });
+                    }
+                });
             }
             if(set.size()>0){
                 return new ArrayList<>(set);

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

@@ -45,8 +45,8 @@ public class SaveUserInfoByProjectServiceImpl extends BaseServiceImpl<SaveUserIn
     }
 
     @Override
-    public List<SaveUserInfoByProjectDTO> selectList(String ids) {
-        return baseMapper.selectList(Wrappers.<SaveUserInfoByProjectDTO>query().lambda().eq(SaveUserInfoByProjectDTO::getProjectId, ids));
+    public Long selectList(String ids) {
+        return baseMapper.selectCount(Wrappers.<SaveUserInfoByProjectDTO>query().lambda().eq(SaveUserInfoByProjectDTO::getProjectId, ids));
     }
 
     @Override

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

@@ -260,8 +260,8 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     }
 
     @Override
-    public List<WbsTreePrivate> findWbsTreePrivate(String ids) {
-        return baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getProjectId, ids));
+    public Long findWbsTreePrivate(String ids) {
+        return baseMapper.selectCount(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getProjectId, ids));
     }
 
     @Override

+ 8 - 11
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -13,10 +13,7 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.*;
-import org.springblade.manager.dto.FormElementDTO;
-import org.springblade.manager.dto.WbsTreeBatchImportDTO;
-import org.springblade.manager.dto.WbsTreeContractDTO;
-import org.springblade.manager.dto.WbsTreeDTO2;
+import org.springblade.manager.dto.*;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.excel.WbsExcelBatchUtil;
 import org.springblade.manager.excel.WbsExcelUtil;
@@ -392,7 +389,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     }
 
     @Override
-    public List<WbsFormElementVO> selectFormElements(String id, Long nodeId) {
+    public List<WbsFormElementVO> selectFormElements(String id, Long nodeId,Integer type) {
         List<WbsFormElementVO> wbsFormElements = wbsTreeMapper.selectFormElements(id);
         ;
         if (Func.isEmpty(wbsFormElements)) {
@@ -405,18 +402,17 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
             if (escapeChar != null) {
                 elements.setEAllowDeviation(escapeChar);
             }
-//            if (nodeId != null && elements.getNodeId() != null && com.mixsmart.utils.StringUtils.isNotEquals(nodeId, elements.getNodeId())) {
-//                /*与当前节点不相同,则认为是跨节点取数,当然跨节点位置的标记不仅有绑定节点id一种方式*/
-//                elements.setTableElementKey(elements.getNodeId() + StringPool.COLON + elements.getTableElementKey());
-//            }
         });
         String elementIds = wbsFormElements.stream().map(WbsFormElement::getId).map(String::valueOf).collect(Collectors.joining(","));
         if (Func.isNotEmpty(elementIds)) {
-            List<Long> longs = this.jdbcTemplate.queryForList("select a.id from m_wbs_form_element a inner join m_element_formula_mapping b on a.id=b.element_id where a.id in(" + elementIds + ") and b.scope=1", Long.class);
+            /*TYPE==1就是WBS级别*/
+            Integer scopeA= com.mixsmart.utils.StringUtils.isEquals(type,1)? FormulaBean.WBS_GLOBAL:FormulaBean.PRO_GLOBAL;
+            Integer scopeB=com.mixsmart.utils.StringUtils.isEquals(type,1)? FormulaBean.WBS_PART:FormulaBean.PRO_PART;
+            List<Long> longs = this.jdbcTemplate.queryForList("select a.id from m_wbs_form_element a inner join m_element_formula_mapping b on a.id=b.element_id where a.id in(" + elementIds + ") and b.scope="+scopeA, Long.class);
             wbsFormElements.forEach(e -> {
                 e.setGlobalFormula(longs.contains(e.getId()) ? 1 : 0);
             });
-            List<Long> longs2 = this.jdbcTemplate.queryForList("select c.element_id from m_wbs_tree a INNER JOIN m_wbs_tree b on a.parent_id=b.id INNER JOIN m_element_formula_mapping c on b.id=c.node_id where  a.id=" + id + " and c.scope=10 and c.element_id in(" + elementIds + ")", Long.class);
+            List<Long> longs2 = this.jdbcTemplate.queryForList("select c.element_id from m_wbs_tree a INNER JOIN m_wbs_tree b on a.parent_id=b.id INNER JOIN m_element_formula_mapping c on b.id=c.node_id where  a.id=" + id + " and c.scope="+scopeB+" and c.element_id in(" + elementIds + ")", Long.class);
             wbsFormElements.forEach(e -> {
                 e.setIsSaveFormula(longs2.contains(e.getId()) ? 1 : 0);
             });
@@ -426,6 +422,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
 
     @Override
     public List<WbsFormElementVO> selectFormElements4Formula(String id) {
+        /*元素库查询专用*/
         return this.wbsTreeMapper.selectFormElements4TableId(id);
     }
 

+ 51 - 16
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java

@@ -5,15 +5,19 @@ import com.aspose.cells.Workbook;
 import com.itextpdf.text.Document;
 import com.itextpdf.text.pdf.PdfCopy;
 import com.itextpdf.text.pdf.PdfReader;
+import com.spire.xls.*;
 import com.sun.image.codec.jpeg.JPEGCodec;
 import com.sun.image.codec.jpeg.JPEGImageEncoder;
 import org.apache.commons.lang.StringUtils;
-import org.apache.poi.ss.usermodel.ClientAnchor;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.WorkbookFactory;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.util.IOUtils;
 import org.apache.poi.util.Units;
 import org.springblade.common.utils.CommonUtil;
+import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.common.vo.DataVO;
 import org.springblade.core.tool.utils.FileUtil;
 import org.springblade.core.tool.utils.IoUtil;
@@ -25,8 +29,7 @@ import java.awt.image.BufferedImage;
 import java.io.*;
 import java.net.URL;
 import java.net.URLEncoder;
-import java.util.Arrays;
-import java.util.List;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
@@ -297,20 +300,52 @@ public class FileUtils {
 
 
 
-/*    public static void main(String[] args) throws Exception {
-        String downloadUri="http://192.168.0.110:6831/cache/files/data/b6b30b1337cbdc522810_1914/output.xlsx/output.xlsx?md5=vJFs5dZlSpopqwWVH1PV7w&amp;expires=1675247021&amp;filename=output.xlsx";
-        downloadUri = downloadUri.replaceAll("amp;","");
-        URL url = new URL(downloadUri);
-        java.net.HttpURLConnection connection = (java.net.HttpURLConnection) url.openConnection();
-        InputStream stream = connection.getInputStream();
+    public static void main11(String[] args) throws Exception {
 
-        String excelUrl ="/Users/hongchuangyanfa/Desktop/pdf/1615164421657591808.xlsx";
+        String excelPath="/Users/hongchuangyanfa/Desktop/pdf/1625671101419880450.xlsx";
+        File file_out = ResourceUtil.getFile("/Users/hongchuangyanfa/Desktop/pdf/123.xlsx");
+        InputStream exceInp = new FileInputStream(file_out);//CommonUtil.getOSSInputStream("https://bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20230130/2d98b5a4d6270d5d4f98847216c17888.xlsx");
+        final org.apache.poi.ss.usermodel.Workbook workbook = WorkbookFactory.create(exceInp);
+        Sheet sheet = workbook.getSheetAt(0);
+        sheet.setForceFormulaRecalculation(true);
+        // fileName为图片完整路径,例:C:\images\EDG.jpg
+        InputStream ossInputStream = CommonUtil.getOSSInputStream("https://bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20230215/78c0938ed110230f3907461228e6fb45.jpg");
+        byte[] bytes = IOUtils.toByteArray(ossInputStream);
 
+        // 这里根据实际需求选择图片类型
+        int pictureIdx = workbook.addPicture(bytes,6);
 
-      //  String htmlString = IoUtil.readToString(stream);
-        File writefile = new File(excelUrl);
-        FileUtil.toFile(stream,writefile);
+        CreationHelper helper = workbook.getCreationHelper();
+        ClientAnchor anchor = helper.createClientAnchor();
+        anchor.setCol1(0); // param1是列号
+        anchor.setCol2(7);
+        anchor.setRow1(9); // param2是行号
+        anchor.setRow2(30); // param2是行号
 
+        Drawing drawing = sheet.createDrawingPatriarch();
+        anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
+        // 插入图片
+        Picture pict = drawing.createPicture(anchor, pictureIdx); // 调整图片占单元格百分比的大小,1.0就是100%
+        pict.resize(1,1);
+        FileUtils.imageOrientation(sheet, anchor, new DataVO(0, 9) );
+        FileOutputStream outputStream = new FileOutputStream(excelPath);
+        //生成一份新的excel
 
-    }*/
+        Cell cell = sheet.getRow(6).getCell(10);
+        cell.setCellValue("2023年02-08-2023年02-09");
+
+
+
+        workbook.write(outputStream);
+        if (outputStream != null) {
+            IoUtil.closeQuietly(outputStream);
+        }
+        if (exceInp != null) {
+            IoUtil.closeQuietly(exceInp);
+        }
+        if (workbook != null) {
+            IoUtil.closeQuietly(workbook);
+        }
+
+    }
 }

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

@@ -477,8 +477,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                 }
             }
             // 获取默认密码配置
-            String initPassword = ParamCache.getValue(DEFAULT_PARAM_PASSWORD);
-            user.setPassword(initPassword);
+            user.setPassword("123456"); //此处不加密,submit里面加密了
             user.setPlaintextPassword("123456");
             user.setStatus(1);
             user.setIsDeleted(0);