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

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

yangyj 1 жил өмнө
parent
commit
e30f8cf7e2
41 өөрчлөгдсөн 1829 нэмэгдсэн , 258 устгасан
  1. 13 2
      blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java
  2. 50 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/dto/ArchiveTaskDTO.java
  3. 44 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveTaskPageVO.java
  4. 17 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/ArchiveTaskBatchRepealDTO.java
  5. 35 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/ArchiveTaskBatchReportDTO.java
  6. 51 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/BusinessTaskDTO.java
  7. 43 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TaskArchiveDTO.java
  8. 15 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TaskArchiveOuterLayerDTO.java
  9. 1 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/Task.java
  10. 16 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ArchiveFileTaskPDFVO.java
  11. 53 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/BusinessTaskPageVO.java
  12. 7 0
      blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/feign/EVisaClient.java
  13. 46 0
      blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/vo/TaskArchiveDTO.java
  14. 5 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/TextdictInfo.java
  15. 12 6
      blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/CheckedTreeVO.java
  16. 7 1
      blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/GrantTreeVO.java
  17. 6 0
      blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/GrantVO.java
  18. 4 0
      blade-service/blade-archive/pom.xml
  19. 3 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileAutoController.java
  20. 1 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java
  21. 310 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileTaskController.java
  22. 1 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  23. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ContractLogController.java
  24. 545 28
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  25. 11 11
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml
  26. 7 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITaskService.java
  27. 74 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  28. 6 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/feign/EVisaClientImpl.java
  29. 5 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/EVisaService.java
  30. 162 14
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java
  31. 59 7
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/PDFUtils.java
  32. 17 13
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/AppVersionDetailController.java
  33. 49 60
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java
  34. 5 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/TextdictInfoMapper.xml
  35. 28 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  36. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  37. 0 65
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ExcelInfoUtils.java
  38. 45 13
      blade-service/blade-system/src/main/java/org/springblade/system/controller/MenuController.java
  39. 7 1
      blade-service/blade-system/src/main/java/org/springblade/system/controller/RoleController.java
  40. 18 8
      blade-service/blade-system/src/main/java/org/springblade/system/service/IRoleService.java
  41. 47 6
      blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java

+ 13 - 2
blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java

@@ -156,8 +156,11 @@ public class BladeUserDetailsServiceImpl implements UserDetailsService {
                     || user.getUserType().contains(("3"))
                     || user.getUserType().contains(("4"))
                     || user.getUserType().contains(("5"))
-                    || user.getUserType().contains(("6"))) {
-                if (!("1,2,3,4,5,6").equals(user.getUserType())) {
+                    || user.getUserType().contains(("6"))
+                    || user.getUserType().contains(("7"))
+                    || user.getUserType().contains(("8"))
+            ) {
+                if (!("1,2,3,4,5,6,7,8").equals(user.getUserType())) {
                     //如果不是全部权限,那么分批校验登陆平台权限
                     this.judgeLoginPermission(user);
                 }
@@ -268,6 +271,12 @@ public class BladeUserDetailsServiceImpl implements UserDetailsService {
                 case "lar":
                     result = "6"; //lar = 征拆系统
                     break;
+                case "measure":
+                    result = "7"; //measure = 计量系统
+                    break;
+                case "secure":
+                    result = "8"; //secure = 安全
+                    break;
             }
         }
 
@@ -277,6 +286,8 @@ public class BladeUserDetailsServiceImpl implements UserDetailsService {
                 || (("4").equals(result) && user.getUserType().contains("4")) //后管
                 || (("5").equals(result)) // 成本管控系统
                 || (("6").equals(result)) // 征拆系统
+                || (("7").equals(result)) // 计量系统
+                || (("8").equals(result)) // 安全
         ) {
             //放行
             return;

+ 50 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/dto/ArchiveTaskDTO.java

@@ -0,0 +1,50 @@
+package org.springblade.archive.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 档案-任务管理page分页查询DTO
+ */
+@Data
+public class ArchiveTaskDTO implements Serializable {
+
+    @ApiModelProperty(value = "选择菜单类型,1=待办,2=已办,3=我发起的")
+    private Integer selectedType;
+
+    @ApiModelProperty(value = "任务类型")
+    private Integer typeValue;
+
+    @ApiModelProperty(value = "任务状态")
+    private Integer statusValue;
+
+    @ApiModelProperty(value = "当前用户登陆选择的项目id")
+    private Long projectIdValue;
+
+    @ApiModelProperty(value = "下拉框合同段id")
+    private Long contractIdValue;
+
+    @ApiModelProperty(value = "当前用户登陆选择的合同段id(监理合同段使用)")
+    private Long currentContractId;
+
+    @ApiModelProperty(value = "上报批次")
+    private Integer batchValue;
+
+    @ApiModelProperty(value = "开始时间")
+    private String startTimeValue;
+
+    @ApiModelProperty(value = "结束时间")
+    private String endTimeValue;
+
+    @ApiModelProperty(value = "关键字查询输入框")
+    private String queryValue;
+
+    @ApiModelProperty(value = "每页条数")
+    private Integer size;
+
+    @ApiModelProperty(value = "当前页码")
+    private Integer current;
+
+}

+ 44 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveTaskPageVO.java

@@ -0,0 +1,44 @@
+package org.springblade.archive.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ArchiveTaskPageVO implements Serializable {
+
+    @ApiModelProperty(value = "任务id")
+    private Long id;
+
+    @ApiModelProperty(value = "任务名称")
+    private String taskName;
+
+    @ApiModelProperty(value = "任务类型")
+    private String taskTypeName;
+
+    @ApiModelProperty(value = "任务状态")
+    private String taskStatusName;
+
+    @ApiModelProperty(value = "开始时间")
+    private String startTime;
+
+    @ApiModelProperty(value = "限时时间")
+    private String endTime;
+
+    @ApiModelProperty(value = "任务描述")
+    private String taskDesc;
+
+    @ApiModelProperty(value = "上报人")
+    private String taskReportUserName;
+
+    @ApiModelProperty(value = "签字人员")
+    private String taskApproveUserNames;
+
+    @ApiModelProperty(value = "电签状态")
+    private String eVisaStatus;
+
+    @ApiModelProperty(value = "电签状态描述")
+    private String eVisaContents;
+
+}

+ 17 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/ArchiveTaskBatchRepealDTO.java

@@ -0,0 +1,17 @@
+package org.springblade.business.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ArchiveTaskBatchRepealDTO implements Serializable {
+
+    @ApiModelProperty(value = "数据类型,=1表示档案文件收集处的废除;=2时表示任务审批处的废除")
+    private Integer type;
+
+    @ApiModelProperty(value = "数据ids,type=1时表示档案收集数据的ids;type=2时表示审批任务的ids;字符串逗号分割拼接")
+    private String ids;
+
+}

+ 35 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/ArchiveTaskBatchReportDTO.java

@@ -0,0 +1,35 @@
+package org.springblade.business.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ArchiveTaskBatchReportDTO implements Serializable {
+
+    @ApiModelProperty(value = "档案上报的业务数据ids,字符串逗号分割拼接")
+    private String dataIds;
+
+    @ApiModelProperty(value = "项目id")
+    private String projectId;
+
+    @ApiModelProperty(value = "合同段id")
+    private String contractId;
+
+    @ApiModelProperty(value = "上报批次")
+    private Integer batch;
+
+    @ApiModelProperty(value = "任务名")
+    private String taskName;
+
+    @ApiModelProperty(value = "任务人ids,字符串逗号分割拼接")
+    private String userIds;
+
+    @ApiModelProperty(value = "任务描述")
+    private String taskContent;
+
+    @ApiModelProperty("限定审批时间(天)")
+    private Integer restrictDay;
+
+}

+ 51 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/BusinessTaskDTO.java

@@ -0,0 +1,51 @@
+package org.springblade.business.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * 资料填报 - 任务管理page分页查询DTO
+ */
+@Data
+public class BusinessTaskDTO implements Serializable {
+
+    @ApiModelProperty(value = "选择菜单类型,1=待办,2=已办,3=我发起的")
+    private Integer selectedType;
+
+    @ApiModelProperty(value = "任务类型")
+    private Integer typeValue;
+
+    @ApiModelProperty(value = "任务状态")
+    private Integer statusValue;
+
+    @ApiModelProperty(value = "当前用户登陆选择的项目id")
+    private Long projectIdValue;
+
+    @ApiModelProperty(value = "下拉框合同段id")
+    private Long contractIdValue;
+
+    @ApiModelProperty(value = "当前用户登陆选择的合同段id")
+    private Long currentContractId;
+
+    @ApiModelProperty(value = "上报批次")
+    private Integer batchValue;
+
+    @ApiModelProperty(value = "开始时间")
+    private String startTimeValue;
+
+    @ApiModelProperty(value = "结束时间")
+    private String endTimeValue;
+
+    @ApiModelProperty(value = "关键字查询输入框")
+    private String queryValue;
+
+    @ApiModelProperty(value = "每页条数")
+    private Integer size;
+
+    @ApiModelProperty(value = "当前页码")
+    private Integer current;
+
+}

+ 43 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TaskArchiveDTO.java

@@ -0,0 +1,43 @@
+package org.springblade.business.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 档案审批DTO
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class TaskArchiveDTO implements Serializable {
+
+    @ApiModelProperty("所选taskId")
+    private String taskId;
+
+    @ApiModelProperty("同意传OK(大写),废除可传非OK外任意字符或传空")
+    private String flag;
+
+    @ApiModelProperty("审批意见")
+    private String comment;
+
+    @ApiModelProperty("签章定位集合")
+    private List<Sign> sealStrategy;
+
+    @Data
+    public static class Sign {
+        @ApiModelProperty("签章地址url")
+        private String url;
+        @ApiModelProperty("page页码")
+        private String page;
+        @ApiModelProperty("lx")
+        private String lx;
+        @ApiModelProperty("ly")
+        private String ly;
+    }
+
+}

+ 15 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TaskArchiveOuterLayerDTO.java

@@ -0,0 +1,15 @@
+package org.springblade.business.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class TaskArchiveOuterLayerDTO implements Serializable {
+
+    @ApiModelProperty("档案批量审批入参集合")
+    private List<TaskArchiveDTO> taskArchiveDtoList;
+
+}

+ 1 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/Task.java

@@ -120,7 +120,7 @@ public class Task extends BaseEntity {
     /**
      * 上报类型,1填报资料,2工程文件
      */
-    @ApiModelProperty("上报类型,1填报资料,2工程文件,3日志资料")
+    @ApiModelProperty("上报类型,1填报资料,2工程文件,3日志资料,4档案")
     private Integer approvalType;
 
     @ApiModelProperty("项目ID")

+ 16 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ArchiveFileTaskPDFVO.java

@@ -0,0 +1,16 @@
+package org.springblade.business.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ArchiveFileTaskPDFVO implements Serializable {
+
+    private Long id;
+
+    private String pdfUrl;
+
+    private String fileName;
+
+}

+ 53 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/BusinessTaskPageVO.java

@@ -0,0 +1,53 @@
+package org.springblade.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class BusinessTaskPageVO implements Serializable {
+
+    @ApiModelProperty(value = "任务id")
+    private Long id;
+
+    @ApiModelProperty(value = "任务名称")
+    private String taskName;
+
+    @ApiModelProperty(value = "任务类型")
+    private String taskTypeName;
+
+    @ApiModelProperty(value = "任务状态")
+    private String taskStatusName;
+
+    @ApiModelProperty(value = "开始时间")
+    private String startTime;
+
+    @ApiModelProperty(value = "限时时间")
+    private String endTime;
+
+    @ApiModelProperty(value = "任务描述")
+    private String taskDesc;
+
+    @ApiModelProperty(value = "上报人")
+    private String taskReportUserName;
+
+    @ApiModelProperty(value = "签字人员")
+    private String taskApproveUserNames;
+
+    @ApiModelProperty(value = "电签状态")
+    private String eVisaStatus;
+
+    @ApiModelProperty(value = "电签状态描述")
+    private String eVisaContents;
+
+    @ApiModelProperty(value = "上报类型")
+    private Integer approvalType;
+
+    @ApiModelProperty(value = "数据来源id")
+    private String formDataId;
+
+    @ApiModelProperty(value = "流程实例id")
+    private String processInstanceId;
+
+}

+ 7 - 0
blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/feign/EVisaClient.java

@@ -4,6 +4,7 @@ import org.springblade.common.constant.EVisaConstant;
 import org.springblade.evisa.vo.CertBeanVO;
 import org.springblade.evisa.vo.EVisaMakeSealVO;
 import org.springblade.evisa.vo.EVisaTaskApprovalVO;
+import org.springblade.evisa.vo.TaskArchiveDTO;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -31,6 +32,12 @@ public interface EVisaClient {
     @PostMapping(API_PREFIX + "/eVisa")
     String eVisa(@RequestBody EVisaTaskApprovalVO task);
 
+    /**
+     * 电签(自定义签章)
+     */
+    @PostMapping(API_PREFIX + "/eVisa/custom")
+    void eVisaCustom(@RequestBody org.springblade.evisa.vo.TaskArchiveDTO eVisaObj);
+
     /**
      * 创建印模
      */

+ 46 - 0
blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/vo/TaskArchiveDTO.java

@@ -0,0 +1,46 @@
+package org.springblade.evisa.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 档案审批DTO
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class TaskArchiveDTO implements Serializable {
+
+    @ApiModelProperty("所选taskId")
+    private String taskId;
+
+    @ApiModelProperty("同意传OK(大写),废除可传非OK外任意字符或传空")
+    private String flag;
+
+    @ApiModelProperty("审批意见")
+    private String comment;
+
+    //1=审批任务,2=认证
+    private Integer type;
+
+    @ApiModelProperty("签章定位集合")
+    private List<Sign> sealStrategy;
+
+    @Data
+    public static class Sign {
+        @ApiModelProperty("签章地址url")
+        private String url;
+        @ApiModelProperty("page页码")
+        private String page;
+        @ApiModelProperty("lx")
+        private String lx;
+        @ApiModelProperty("ly")
+        private String ly;
+    }
+
+}

+ 5 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/TextdictInfo.java

@@ -92,6 +92,11 @@ public class TextdictInfo implements Serializable {
      */
     private double pyzby;
 
+    /**
+     * excelId
+     */
+    private String excelId;
+
     /**
      * 是否删除
      */

+ 12 - 6
blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/CheckedTreeVO.java

@@ -27,14 +27,20 @@ public class CheckedTreeVO implements Serializable {
     //表单
     private List<String> tableOwners;
 
-    private List<String> dataScope;
-
-    private List<String> apiScope;
-
-    // 内控系统
+    //内控系统
     private List<String> hacMenu;
 
-    // 征拆系统
+    //征拆系统
     private List<String> larMenu;
 
+    //计量系统
+    private List<String> measureMenu;
+
+    //安全系统
+    private List<String> secureMenu;
+
+    private List<String> dataScope;
+
+    private List<String> apiScope;
+
 }

+ 7 - 1
blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/GrantTreeVO.java

@@ -26,12 +26,18 @@ public class GrantTreeVO implements Serializable {
     //档案菜单
     private List<TreeNodeVO> archivesMenu;
 
-    // 内控系统
+    //内控系统
     private List<TreeNodeVO> hacMenu;
 
     //征拆系统
     private List<TreeNodeVO> larMenu;
 
+    //计量系统
+    private List<TreeNodeVO> measureMenu;
+
+    //安全系统
+    private List<TreeNodeVO> secureMenu;
+
     //数据
     private List<TreeNodeVO> dataScope;
 

+ 6 - 0
blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/GrantVO.java

@@ -33,6 +33,12 @@ public class GrantVO implements Serializable {
     @ApiModelProperty(value = "menuArchivesIds集合-征拆")
     private List<String> menularIds;
 
+    @ApiModelProperty(value = "menuMeasureIds集合-计量")
+    private List<String> menuMeasureIds;
+
+    @ApiModelProperty(value = "menuSecureIds集合-安全")
+    private List<String> menuSecureIds;
+
     @ApiModelProperty(value = "topMenuIds集合")
     private List<Long> topMenuIds;
 

+ 4 - 0
blade-service/blade-archive/pom.xml

@@ -132,6 +132,10 @@
             <version>2.9.1.RELEASE</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 3 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileAutoController.java

@@ -96,6 +96,9 @@ ArchiveFileAutoController extends BladeController {
                             saveVo.setSourceType(2);
                             saveVo.setProjectId(archive.getProjectId() == null ? "" : archive.getProjectId().toString());
                             saveVo.setContractId(archive.getContractId() == null ? "" : archive.getContractId().toString());
+                            saveVo.setIsElement(0);
+                            saveVo.setDutyUser(archive.getUnit());
+                            saveVo.setFileName(archive.getName());
                             list.add(saveVo);
                             if (saveVo.getFilePage() != null && !saveVo.getFilePage().equals("")) {
                                 pageN = pageN + saveVo.getFilePage();

+ 1 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java

@@ -4,7 +4,6 @@ import com.alibaba.excel.util.DateUtils;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.*;
@@ -25,7 +24,6 @@ import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.evisa.feign.EVisaClient;
-import org.springblade.manager.entity.ArchiveTree;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.feign.ArchiveTreeContractClient;
@@ -367,7 +365,7 @@ public class ArchiveFileController extends BladeController {
     public R getDutyUser(Long contractId, Long projectId) {
         ContractInfo contractById = null;
         if (contractId == null || contractId == -1) {
-            if(projectId == null || projectId == -1){
+            if (projectId == null || projectId == -1) {
                 return R.data(null);
             }
             List<Long> longs = new ArrayList<>();

+ 310 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileTaskController.java

@@ -0,0 +1,310 @@
+package org.springblade.archive.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.itextpdf.text.Image;
+import com.itextpdf.text.Rectangle;
+import com.itextpdf.text.pdf.PdfReader;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.apache.poi.util.IOUtils;
+import org.springblade.archive.dto.ArchiveTaskDTO;
+import org.springblade.archive.vo.ArchiveTaskPageVO;
+import org.springblade.business.entity.ArchiveFile;
+import org.springblade.business.entity.Task;
+import org.springblade.business.entity.TaskParallel;
+import org.springblade.business.feign.ArchiveFileClient;
+import org.springblade.common.utils.CommonUtil;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.evisa.feign.EVisaClient;
+import org.springblade.evisa.vo.TaskArchiveDTO;
+import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.ContractRelationJlyz;
+import org.springblade.manager.entity.SignPfxFile;
+import org.springblade.manager.feign.SignPfxClient;
+import org.springblade.system.user.entity.User;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.*;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/archiveTask")
+@Api(value = "档案涉及任务相关接口", tags = "档案涉及任务相关接口")
+public class ArchiveFileTaskController extends BladeController {
+
+    private final JdbcTemplate jdbcTemplate;
+    private final SignPfxClient signPfxClient;
+    private final EVisaClient eVisaClient;
+
+    /**
+     * 批量认证(水印图片签章默认认证电签)
+     */
+    @PostMapping("/batchCertification")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "批量认证(水印图片签章默认认证电签)")
+    public R<Boolean> batchCertification(@RequestParam String ids) throws Exception {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser()) || ObjectUtil.isEmpty(SecureUtil.getUserId()) || SecureUtil.getUserId().equals(-1L)) {
+            throw new ServiceException("未获取到当前登陆的用户信息,操作失败");
+        }
+        if (StringUtils.isNotEmpty(ids)) {
+            //获取档案文件
+            List<ArchiveFile> archiveFileList = jdbcTemplate.query("select * from u_archive_file where id in(" + ids + ")", new BeanPropertyRowMapper<>(ArchiveFile.class));
+            if (archiveFileList.size() > 0) {
+                //固定水印图片章
+                String pngQzUrl = "https://bladex-chongqing-info.oss-cn-hangzhou.aliyuncs.com//upload/20230911/5b42583d931664b785ebf481c37d17bc.png";
+                for (ArchiveFile archiveFile : archiveFileList) {
+                    String pdfUrl = StringUtils.isNotEmpty(archiveFile.getEVisaFile()) ? archiveFile.getEVisaFile() : archiveFile.getPdfFileUrl();
+                    if (StringUtils.isEmpty(pdfUrl)) {
+                        continue;
+                    }
+                    InputStream ossInputStreamPNG = CommonUtil.getOSSInputStream(pngQzUrl);
+                    InputStream ossInputStreamPDF = CommonUtil.getOSSInputStream(pdfUrl);
+                    PdfReader reader = null;
+                    Image img = null;
+                    if (ossInputStreamPDF != null && ossInputStreamPNG != null) {
+                        reader = new PdfReader(ossInputStreamPDF);
+                        img = Image.getInstance(IOUtils.toByteArray(ossInputStreamPNG));
+                    }
+                    if (reader != null) {
+                        //封装签章定位入参dto
+                        org.springblade.evisa.vo.TaskArchiveDTO eVISATaskArchiveDTO = new TaskArchiveDTO();
+                        //每条档案业务数据对应的pdf签章集合
+                        List<TaskArchiveDTO.Sign> signList = new ArrayList<>();
+
+                        for (int i = 1; i <= reader.getNumberOfPages(); i++) {
+                            //计算当前页居中的位置坐标 TODO(有问题,坐标点不对,后续再算)
+                            Rectangle pageSize = reader.getPageSize(i);
+                            float x = (pageSize.getLeft() + pageSize.getRight()) / 2 - (img.getScaledWidth() / 2);
+                            float y = (pageSize.getTop() + pageSize.getBottom()) / 2 - (img.getScaledHeight() / 2);
+
+                            //构造签章对象
+                            TaskArchiveDTO.Sign sign = new TaskArchiveDTO.Sign();
+                            sign.setLx(String.valueOf(x)); //x轴
+                            sign.setLy(String.valueOf(y)); //y轴
+                            sign.setPage(String.valueOf(i)); //页码
+                            sign.setUrl(pngQzUrl); //签章图片url
+                            signList.add(sign);
+                        }
+                        eVISATaskArchiveDTO.setSealStrategy(signList);
+
+                        //TODO ============= 电签认证 =============
+                        eVISATaskArchiveDTO.setTaskId(archiveFile.getId().toString());
+                        eVISATaskArchiveDTO.setType(2); //认证
+                        this.eVisaClient.eVisaCustom(eVISATaskArchiveDTO);
+                    }
+                }
+                return R.data(true);
+            }
+        }
+        return R.data(300, false, "没有找到证书文件或PDF文件");
+    }
+
+
+    /**
+     * 检查任务人是否存在签字证书信息
+     */
+    @PostMapping("/checkTaskUserCertificateInfo")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "检查任务人是否存在签字证书信息", notes = "传入用户userIds,字符串逗号分割拼接")
+    public R<Object> checkTaskUserCertificateInfo(@RequestParam String userIds) {
+        if (StringUtils.isNotEmpty(userIds)) {
+            Set<String> notCertificateUserInfoSet = new HashSet<>();
+            String[] split = userIds.split(",");
+            for (String userId : split) {
+                //获取用户的证书信息
+                List<SignPfxFile> userPfxList = this.signPfxClient.querySignPfxByUserIdOrContractId(userId, "");
+                if (userPfxList == null || userPfxList.size() <= 0) {
+                    notCertificateUserInfoSet.add(userId);
+                }
+            }
+            if (notCertificateUserInfoSet.size() > 0) {
+                Map<Long, String> nameMap = jdbcTemplate.query("select id,name from blade_user where is_deleted = 0", new BeanPropertyRowMapper<>(User.class)).stream().collect(Collectors.toMap(User::getId, User::getName, (key1, key2) -> key1));
+                List<String> names = new ArrayList<>();
+                for (String userId : notCertificateUserInfoSet) {
+                    String name = nameMap.get(Long.parseLong(userId));
+                    if (name != null) {
+                        names.add(name);
+                    }
+                }
+                throw new ServiceException("未获取到用户【" + StringUtils.join(names, "、") + "】的签字证书信息");
+            }
+        }
+        return R.data(true);
+    }
+
+    /**
+     * 档案-任务管理-任务查看分页查询
+     */
+    @PostMapping("/page")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "档案-任务管理-任务查看分页查询", notes = "传入ArchiveTaskDTO")
+    public R<IPage<ArchiveTaskPageVO>> page(@RequestBody ArchiveTaskDTO dto) {
+        int current = dto.getCurrent();
+        int size = dto.getSize();
+        //封装入参SQL
+        List<Object> params = new ArrayList<>();
+        StringBuilder sqlString = new StringBuilder("SELECT * FROM u_task WHERE 1=1 AND approval_type = 4"); //approval_type = 4 表示档案任务
+        if (ObjectUtil.isNotEmpty(dto.getTypeValue())) {
+            sqlString.append(" AND type = ?");
+            params.add(dto.getTypeValue());
+        }
+        if (ObjectUtil.isNotEmpty(dto.getStatusValue())) {
+            sqlString.append(" AND status = ?");
+            params.add(dto.getStatusValue());
+        }
+
+        ContractInfo contractInfo = jdbcTemplate.queryForObject("select contract_type from m_contract_info where id = " + dto.getCurrentContractId(), new BeanPropertyRowMapper<>(ContractInfo.class));
+        if (contractInfo != null && contractInfo.getContractType().equals(1)) {
+            //施工合同段正常查询
+            if (ObjectUtil.isNotEmpty(dto.getContractIdValue())) {
+                sqlString.append(" AND contract_id = ?");
+                params.add(dto.getContractIdValue());
+            } else {
+                //如果合同段id=null,那么查询当前项目下所有合同段任务
+                if (ObjectUtil.isNotEmpty(dto.getProjectIdValue())) {
+                    sqlString.append(" AND project_id = ?");
+                    params.add(dto.getProjectIdValue());
+                } else {
+                    throw new ServiceException("未获取到项目信息,请联系管理员");
+                }
+            }
+        } else if (contractInfo != null && (contractInfo.getContractType().equals(2) || contractInfo.getContractType().equals(3))) {
+            //如果是监理合同段,那么默认查询关联的全部施工合同段+本身任务
+            List<ContractRelationJlyz> contractRelationJLYZ = jdbcTemplate.query("select contract_id_sg from m_contract_relation_jlyz where contract_id_jlyz = " + dto.getCurrentContractId(), new BeanPropertyRowMapper<>(ContractRelationJlyz.class));
+            Set<Long> ids = contractRelationJLYZ.stream().map(ContractRelationJlyz::getContractIdSg).collect(Collectors.toSet());
+            ids.add(dto.getCurrentContractId()); //把监理本身也加入查询
+            sqlString.append(" AND contract_id in(").append(StringUtils.join(ids, ",")).append(")");
+        }
+
+        if (ObjectUtil.isNotEmpty(dto.getBatchValue())) {
+            sqlString.append(" AND batch = ?");
+            params.add(dto.getBatchValue());
+        }
+        if (StringUtils.isNotBlank(dto.getStartTimeValue()) && StringUtils.isNotBlank(dto.getEndTimeValue())) {
+            sqlString.append(" AND start_time >= ?")
+                    .append(dto.getStartTimeValue())
+                    .append(" AND end_time <= ?");
+            params.add(dto.getStartTimeValue());
+            params.add(dto.getEndTimeValue());
+        }
+        if (StringUtils.isNotBlank(dto.getQueryValue())) {
+            sqlString.append(" AND task_name LIKE ?");
+            params.add("%" + dto.getQueryValue() + "%");
+        }
+        if (ObjectUtil.isNotEmpty(dto.getSelectedType())) {
+            sqlString.append(" AND (");
+            if (dto.getSelectedType().equals(1)) { //待办页面
+
+                //如果是待办页面,且 任务状态下拉框 选择的是 待审批状态 的任务,那么才查询数据
+                if (ObjectUtil.isNotEmpty(dto.getStatusValue()) && dto.getStatusValue().equals(1)) {
+                    sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status = ? AND u_task_parallel.task_user = ?)");
+                    params.add(1);
+                    params.add(SecureUtil.getUserId());
+
+                    //如果是待办页面,且 任务状态下拉框 选择的不是 待审批状态 的任务,那么直接返回null
+                } else if (ObjectUtil.isNotEmpty(dto.getStatusValue()) && !dto.getStatusValue().equals(1)) {
+                    return null;
+
+                    //如果是待办页面,没选择 任务状态下拉框,那么就默认查询 待审批状态 任务
+                } else if (ObjectUtil.isEmpty(dto.getStatusValue())) {
+                    sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status = ? AND u_task_parallel.task_user = ?)");
+                    params.add(1);
+                    params.add(SecureUtil.getUserId());
+                    sqlString.append(" AND status = 1");
+                }
+
+            } else if (dto.getSelectedType().equals(2)) { //已办页面
+                sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status = ? AND u_task_parallel.task_user = ?)");
+                //当前自己的任务必须是已审批,才视为已办
+                params.add(2);
+                params.add(SecureUtil.getUserId());
+
+            } else if (dto.getSelectedType().equals(3)) { //我发起页面
+                sqlString.append("report_user = ?");
+                params.add(SecureUtil.getUserId());
+            }
+            sqlString.append(")");
+        }
+
+        //总数量
+        String sqlCount = sqlString.toString().replace("*", "count(1)");
+        Optional<Integer> totalCountOptional = Optional.ofNullable(jdbcTemplate.queryForObject(sqlCount, Integer.class, params.toArray()));
+        int totalCount = totalCountOptional.orElse(0);
+
+        //分页
+        sqlString.append(" ORDER BY create_time DESC LIMIT ? OFFSET ?");
+        params.add(size);
+        params.add((current - 1) * size);
+
+        //执行SQL获取数据
+        String sqlPage = sqlString.toString();
+        List<Task> resultList = jdbcTemplate.query(
+                sqlPage,
+                new BeanPropertyRowMapper<>(Task.class),
+                params.toArray()
+        );
+
+        //获取任务详情信息Map
+        Set<String> processInstanceIds = resultList.stream().map(Task::getProcessInstanceId).collect(Collectors.toSet());
+        Map<String, List<TaskParallel>> taskParallelGroupMap = new HashMap<>();
+        if (processInstanceIds.size() > 0) {
+            StringJoiner joiner = new StringJoiner(",", "'", "'");
+            processInstanceIds.forEach(joiner::add);
+            String joinedIds = joiner.toString();
+            taskParallelGroupMap = jdbcTemplate.query("select process_instance_id,task_user_name,e_visa_status,e_visa_content from u_task_parallel where process_instance_id in(" + joinedIds + ") order by id", new BeanPropertyRowMapper<>(TaskParallel.class)).stream().collect(Collectors.groupingBy(TaskParallel::getProcessInstanceId));
+        }
+        Map<String, List<TaskParallel>> finalTaskParallelGroupMap = taskParallelGroupMap;
+
+        //获取用户信息Map
+        Map<Long, String> nameMap = jdbcTemplate.query("select id,name from blade_user where is_deleted = 0", new BeanPropertyRowMapper<>(User.class)).stream().collect(Collectors.toMap(User::getId, User::getName, (key1, key2) -> key1));
+
+        //解析page分页数据
+        IPage<ArchiveTaskPageVO> page = new Page<>(current, size);
+        List<ArchiveTaskPageVO> pageList = resultList.stream()
+                .map(task -> {
+                    ArchiveTaskPageVO vo = new ArchiveTaskPageVO();
+                    vo.setId(task.getId());
+                    vo.setTaskName(task.getTaskName());
+                    vo.setTaskTypeName(task.getType().equals(1) ? "普通任务" : task.getType().equals(2) ? "验收任务" : "移交任务");
+                    vo.setTaskStatusName(task.getStatus().equals(1) ? "待审批" : task.getStatus().equals(2) ? "已审批" : "已废除");
+                    vo.setStartTime(task.getStartTime());
+                    vo.setEndTime(task.getEndTime());
+                    vo.setTaskDesc(task.getTaskContent());
+                    vo.setTaskReportUserName(nameMap.get(Long.parseLong(task.getReportUser())));
+                    List<TaskParallel> taskParallelList = finalTaskParallelGroupMap.get(task.getProcessInstanceId());
+                    if (taskParallelList != null && taskParallelList.size() > 0) {
+                        List<String> names = taskParallelList.stream().map(TaskParallel::getTaskUserName).collect(Collectors.toList());
+                        if (names.size() > 0) {
+                            vo.setTaskApproveUserNames(StringUtils.join(names, ","));
+                        }
+                        Set<Integer> eVisaStatus = taskParallelList.stream().map(TaskParallel::getEVisaStatus).collect(Collectors.toSet());
+                        if (eVisaStatus.size() > 0) {
+                            vo.setEVisaStatus(StringUtils.join(eVisaStatus, "、"));
+                        }
+                        Set<String> eVisaContents = taskParallelList.stream().map(TaskParallel::getEVisaContent).collect(Collectors.toSet());
+                        if (eVisaContents.size() > 0) {
+                            vo.setEVisaContents(StringUtils.join(eVisaContents, "、"));
+                        }
+                    }
+                    return vo;
+                })
+                .collect(Collectors.toList());
+        page.setRecords(pageList);
+        page.setTotal(totalCount);
+        return R.data(page);
+    }
+
+}

+ 1 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -154,7 +154,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//根据用户在当前合同段的权限,判断返回
 		BladeUser user = AuthUtil.getUser();
 		String name = baseMapper.getUserRoleName(vo.getProjectId(),vo.getContractId(),user.getUserId());
-		if (name.contains("超级管理员") || contractType == 3) {
+		if ((StringUtils.isNotBlank(name) && name.contains("超级管理员")) || contractType == 3) {
 			vo.setContractId(null);
 		}
 		if (StringUtils.isNotBlank(vo.getNodeIds())) {

+ 2 - 2
blade-service/blade-business/src/main/java/org/springblade/business/controller/ContractLogController.java

@@ -310,9 +310,9 @@ public class ContractLogController extends BladeController {
                     userId = json.getLong("userId");
                 }
                 //如果ids为空,说明是填报页上报,那么需要根据 nodePrimaryKeyId 和 recordTime 获取当前用户的填写记录
-                ContractLog log = this.contractLogService.getOne(Wrappers.<ContractLog>lambdaQuery().eq(ContractLog::getWbsNodeId, nodePrimaryKeyId)
+                ContractLog log = this.contractLogService.getBaseMapper().selectList(Wrappers.<ContractLog>lambdaQuery().eq(ContractLog::getWbsNodeId, nodePrimaryKeyId)
                         .eq(ContractLog::getRecordTime, recordTime).eq(ContractLog::getContractId, startTaskVO.getContractId())
-                        .eq(ContractLog::getCreateUser, userId));
+                        .eq(ContractLog::getCreateUser, userId)).stream().findAny().orElse(null);
                 if (log == null) {
                     return R.fail("未找到业务数据");
                 }

+ 545 - 28
blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java

@@ -5,22 +5,30 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
-import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.time.DateUtils;
 import org.jetbrains.annotations.NotNull;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springblade.archive.dto.ArchiveTaskDTO;
+import org.springblade.archive.vo.ArchiveTaskPageVO;
+import org.springblade.business.dto.*;
 import org.springblade.business.entity.*;
 import org.springblade.business.service.*;
 import org.springblade.business.socket.WebSocket;
-import org.springblade.business.vo.BatchTaskVO;
-import org.springblade.business.vo.TaskApprovalVO;
-import org.springblade.business.vo.TaskQueryVO;
-import org.springblade.common.utils.CommonUtil;
+import org.springblade.business.vo.*;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.BladeUser;
@@ -32,6 +40,7 @@ import org.springblade.core.tool.jackson.JsonUtil;
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.evisa.feign.EVisaClient;
 import org.springblade.flow.core.entity.BladeFlow;
 import org.springblade.flow.core.feign.NewFlowClient;
 import org.springblade.flow.core.vo.SendPageVO;
@@ -42,22 +51,17 @@ import org.springblade.resource.feign.CommonFileClient;
 import org.springblade.resource.feign.NewISmsClient;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
+import org.springblade.system.user.entity.User;
 import org.springframework.beans.BeanUtils;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.web.bind.annotation.*;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.springblade.business.vo.TaskVO;
-import org.springblade.core.boot.ctrl.BladeController;
 
-import javax.annotation.Resource;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.time.Duration;
 import java.util.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ThreadPoolExecutor;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -73,31 +77,21 @@ import java.util.stream.Collectors;
 @Api(value = "任务审核主表", tags = "任务审核主表接口")
 public class TaskController extends BladeController {
 
+    private static final Logger log = LoggerFactory.getLogger(TaskController.class);
     private final JdbcTemplate jdbcTemplate;
-
     private final ITaskService taskService;
-
     private final ITaskParallelService taskParallelService;
-
     private final NewFlowClient newFlowClient;
-
     private final IDictBizClient dictBizClient;
-
     private final NewISmsClient newSmsClient;
-
     private final IDefaultConfigService defaultConfigService;
-
     private final ITaskBatchService taskBatchService;
-
     private final ITaskService iTaskService;
-
     private final WebSocket webSocket;
-
     private final CommonFileClient commonFileClient;
-
     private final ContractClient contractClient;
-
     private final IInformationQueryService informationQueryService;
+    private final EVisaClient eVisaClient;
 
     /**
      * 记录短信验证码超时时间
@@ -302,7 +296,7 @@ public class TaskController extends BladeController {
     }
 
     /**
-     * 批量审批
+     * 批量审批(质检、试验 平行审批)
      */
     @PostMapping("/batch-complete-approval-task")
     @ApiOperationSupport(order = 8)
@@ -365,6 +359,359 @@ public class TaskController extends BladeController {
         return R.data(false);
     }
 
+    /**
+     * 批量上报-档案
+     */
+    @PostMapping("/batch-report-task-archive")
+    @ApiOperationSupport(order = 8)
+    @ApiOperation(value = "批量上报-档案")
+    public R<Object> batchReportTaskArchive(@RequestBody ArchiveTaskBatchReportDTO archiveTaskBatchReportDTO) throws IOException {
+        if (ObjectUtil.isEmpty(archiveTaskBatchReportDTO.getUserIds())
+                || ObjectUtil.isEmpty(archiveTaskBatchReportDTO.getDataIds())
+                || ObjectUtil.isEmpty(archiveTaskBatchReportDTO.getBatch())
+                || ObjectUtil.isEmpty(archiveTaskBatchReportDTO.getProjectId())
+                || ObjectUtil.isEmpty(archiveTaskBatchReportDTO.getContractId())
+                || ObjectUtil.isEmpty(archiveTaskBatchReportDTO.getRestrictDay())) {
+            throw new ServiceException("请求入参数据为空,操作失败");
+        }
+
+        Map<Long, String> nameMap = jdbcTemplate.query("select id,name from blade_user where is_deleted = 0", new BeanPropertyRowMapper<>(User.class)).stream().collect(Collectors.toMap(User::getId, User::getName, (key1, key2) -> key1));
+        Map<Long, String> fileNameMaps = jdbcTemplate.query("select id,file_name from u_archive_file where file_name is not null and id in (" + archiveTaskBatchReportDTO.getDataIds() + ")", new BeanPropertyRowMapper<>(ArchiveFile.class)).stream().collect(Collectors.toMap(ArchiveFile::getId, ArchiveFile::getFileName, (obj1, obj2) -> obj1));
+        String[] archiveIds = archiveTaskBatchReportDTO.getDataIds().split(",");
+        if (archiveIds.length > 0) {
+            for (String archiveId : archiveIds) {
+                //创建task审批任务
+                Long processInstanceId = SnowFlakeUtil.getId();
+                Task task = new Task();
+                task.setId(SnowFlakeUtil.getId());
+                Date nowTime = new Date();
+                task.setStartTime(DateUtil.format(nowTime, "yyyy-MM-dd"));
+                task.setEndTime(DateUtil.format(DateUtils.addDays(nowTime, archiveTaskBatchReportDTO.getRestrictDay()), "yyyy-MM-dd"));
+
+                task.setProcessDefinitionId(SnowFlakeUtil.getId().toString());
+                task.setProcessInstanceId(processInstanceId.toString()); //实例id
+
+                task.setReportUser(AuthUtil.getUserId().toString());
+                task.setReportUserName(AuthUtil.getNickName());
+
+                task.setCreateUser(AuthUtil.getUserId());
+                task.setCreateTime(nowTime);
+                task.setUpdateTime(nowTime);
+                task.setUpdateUser(AuthUtil.getUserId());
+                task.setCreateDept(null);
+
+                task.setTaskContent(ObjectUtil.isNotEmpty(archiveTaskBatchReportDTO.getTaskContent()) ? archiveTaskBatchReportDTO.getTaskContent() : null);
+                task.setTaskUser(null);
+                task.setFormDataId(archiveId); //数据指向
+                task.setTaskName(ObjectUtil.isNotEmpty(fileNameMaps.get(Long.parseLong(archiveId))) ? fileNameMaps.get(Long.parseLong(archiveId)) : "未获取到档案文件任务名");
+                task.setContractId(archiveTaskBatchReportDTO.getContractId());
+                task.setProjectId(archiveTaskBatchReportDTO.getProjectId());
+                task.setBatch(archiveTaskBatchReportDTO.getBatch());
+                task.setType(1);
+                task.setApprovalType(4); //档案审批
+                task.setFixedFlowId(0L);
+                task.setStatus(1); //待审批
+                task.setIsDeleted(0);
+                task.setTrialSelfInspectionRecordId(null);
+
+                taskService.save(task);
+
+                //创建任务相关信息
+                String[] userIds = archiveTaskBatchReportDTO.getUserIds().split(",");
+                for (String userId : userIds) {
+                    TaskParallel taskParallel = new TaskParallel();
+                    taskParallel.setId(SnowFlakeUtil.getId());
+                    taskParallel.setProcessInstanceId(processInstanceId.toString());
+                    taskParallel.setParallelProcessInstanceId(SnowFlakeUtil.getId().toString());
+                    taskParallel.setTaskUser(userId);
+                    if (nameMap.get(Long.parseLong(userId)) != null) {
+                        taskParallel.setTaskUserName(nameMap.get(Long.parseLong(userId)));
+                    }
+                    taskParallel.setInitiative(1);
+                    taskParallel.setCreateUser(AuthUtil.getUserId());
+                    taskParallel.setCreateTime(nowTime);
+                    taskParallel.setUpdateTime(nowTime);
+                    taskParallel.setUpdateUser(AuthUtil.getUserId());
+                    taskParallel.setCreateDept(null);
+                    taskParallel.setStatus(1);
+                    taskParallel.setIsDeleted(0);
+                    taskParallelService.save(taskParallel);
+                }
+
+                //修改档案业务数据任务状态为待审批
+                jdbcTemplate.execute("update u_archive_file set status = 1 where id = " + archiveId);
+            }
+
+            //WebSocket推送
+            if (ObjectUtil.isNotEmpty(AuthUtil.getUserId())) {
+                Map<String, String> webSocketMessageMap = WebSocket.getWebSocketMessageMap();
+                Set<Map.Entry<String, String>> message = webSocketMessageMap.entrySet();
+                for (Map.Entry<String, String> entry : message) {
+                    String userId = entry.getKey();
+                    if (userId.equals(AuthUtil.getUserId().toString())) { //只推送当前用户
+                        String projectAndContractId = entry.getValue();
+                        if (StringUtils.isNotEmpty(projectAndContractId) && StringUtils.isNotEmpty(userId)) {
+                            String projectId = projectAndContractId.split(",")[0];
+                            String contractId = projectAndContractId.split(",")[1];
+                            Map<String, String> stringMap = iTaskService.getTaskCountArchive(projectId, contractId, userId);
+                            webSocket.sendMessageByUserId(AuthUtil.getUserId().toString(), JSON.toJSONString(stringMap));
+                        }
+                    }
+                }
+            }
+            return R.success("上报成功");
+        }
+        return R.fail("操作失败");
+    }
+
+    /**
+     * 批量撤销(废除)-档案
+     */
+    @PostMapping("/batch-repeal-task-archive")
+    @ApiOperationSupport(order = 8)
+    @ApiOperation(value = "批量撤销(废除)-档案")
+    public R<Object> batchRepealTaskArchive(@RequestBody ArchiveTaskBatchRepealDTO repealDTO) throws IOException {
+        if (repealDTO.getType().equals(1)) { //文件收集废除
+            String[] archiveIds = repealDTO.getIds().split(",");
+            for (String archiveId : archiveIds) {
+                //判断现在的数据是否是待审批数据,只有待审批数据才能撤销
+                ArchiveFile archiveFile = jdbcTemplate.queryForObject("select * from u_archive_file where id = " + archiveId, new BeanPropertyRowMapper<>(ArchiveFile.class));
+                if (archiveFile != null && archiveFile.getStatus().equals(1)) {
+                    //修改档案文件收集业务数据状态=已废除
+                    jdbcTemplate.execute("update u_archive_file set status = 3 where id = " + archiveId);
+                    Task task = jdbcTemplate.queryForObject("select id,status,process_instance_id from u_task where form_data_id = " + archiveId, new BeanPropertyRowMapper<>(Task.class));
+                    if (task != null && task.getStatus().equals(1)) {
+                        //待审批审批任务=已废除
+                        jdbcTemplate.execute("update u_task set status = 3 where id = " + task.getId());
+                        //审批任务详情=已废除
+                        jdbcTemplate.execute("update u_task_parallel set status = 3 where process_instance_id = " + task.getProcessInstanceId());
+                    }
+                }
+            }
+            //WebSocket推送
+            if (ObjectUtil.isNotEmpty(AuthUtil.getUserId())) {
+                Map<String, String> webSocketMessageMap = WebSocket.getWebSocketMessageMap();
+                Set<Map.Entry<String, String>> message = webSocketMessageMap.entrySet();
+                for (Map.Entry<String, String> entry : message) {
+                    String userId = entry.getKey();
+                    if (userId.equals(AuthUtil.getUserId().toString())) { //只推送当前用户
+                        String projectAndContractId = entry.getValue();
+                        if (StringUtils.isNotEmpty(projectAndContractId) && StringUtils.isNotEmpty(userId)) {
+                            String projectId = projectAndContractId.split(",")[0];
+                            String contractId = projectAndContractId.split(",")[1];
+                            Map<String, String> stringMap = iTaskService.getTaskCountArchive(projectId, contractId, userId);
+                            webSocket.sendMessageByUserId(AuthUtil.getUserId().toString(), JSON.toJSONString(stringMap));
+                        }
+                    }
+                }
+            }
+            return R.success("操作成功");
+        } else if (repealDTO.getType().equals(2)) { //任务审批废除
+            String[] taskIds = repealDTO.getIds().split(",");
+            for (String taskId : taskIds) {
+                Task task = jdbcTemplate.queryForObject("select id,status,process_instance_id,form_data_id from u_task where id = " + taskId, new BeanPropertyRowMapper<>(Task.class));
+                if (task != null && task.getStatus().equals(1)) {
+                    //待审批审批任务=已废除
+                    jdbcTemplate.execute("update u_task set status = 3 where id = " + task.getId());
+                    //审批任务详情=已废除
+                    jdbcTemplate.execute("update u_task_parallel set status = 3 where process_instance_id = " + task.getProcessInstanceId());
+                    //修改档案文件收集业务数据状态
+                    jdbcTemplate.execute("update u_archive_file set status = 3 where id = " + task.getFormDataId());
+                }
+            }
+            //WebSocket推送
+            if (ObjectUtil.isNotEmpty(AuthUtil.getUserId())) {
+                Map<String, String> webSocketMessageMap = WebSocket.getWebSocketMessageMap();
+                Set<Map.Entry<String, String>> message = webSocketMessageMap.entrySet();
+                for (Map.Entry<String, String> entry : message) {
+                    String userId = entry.getKey();
+                    if (userId.equals(AuthUtil.getUserId().toString())) { //只推送当前用户
+                        String projectAndContractId = entry.getValue();
+                        if (StringUtils.isNotEmpty(projectAndContractId) && StringUtils.isNotEmpty(userId)) {
+                            String projectId = projectAndContractId.split(",")[0];
+                            String contractId = projectAndContractId.split(",")[1];
+                            Map<String, String> stringMap = iTaskService.getTaskCountArchive(projectId, contractId, userId);
+                            webSocket.sendMessageByUserId(AuthUtil.getUserId().toString(), JSON.toJSONString(stringMap));
+                        }
+                    }
+                }
+            }
+            return R.success("操作成功");
+        }
+        return R.fail(400, "操作失败");
+    }
+
+    /**
+     * 批量审批(档案 垂直审批)
+     */
+    @PostMapping("/batch-complete-approval-task-archive")
+    @ApiOperationSupport(order = 8)
+    @ApiOperation(value = "批量审批(档案 垂直审批)")
+    public R<Boolean> batchCompleteApprovalTaskArchive(@RequestBody TaskArchiveOuterLayerDTO taskArchiveOuterLayerDTO) throws IOException {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser()) || ObjectUtil.isEmpty(SecureUtil.getUserId()) || SecureUtil.getUserId().equals(-1L)) {
+            throw new ServiceException("未获取到当前登陆的用户信息,操作失败");
+        }
+
+        String flag = taskArchiveOuterLayerDTO.getTaskArchiveDtoList().stream().map(TaskArchiveDTO::getFlag).findAny().orElse(null);
+        if (StringUtils.isEmpty(flag)) {
+            throw new ServiceException("请选择审批操作类型,【同意】或【废除任务】");
+        }
+
+        //同意审批
+        if (flag.equals("OK")) {
+            //检查审批人是否符合顺序
+            this.checkArchiveTaskUserByCurrent(taskArchiveOuterLayerDTO.getTaskArchiveDtoList());
+
+            //构造业务数据,修改业务数据
+            for (TaskArchiveDTO taskArchiveDTO : taskArchiveOuterLayerDTO.getTaskArchiveDtoList()) {
+                if (StringUtils.isNotEmpty(taskArchiveDTO.getTaskId())) {
+                    //通过checkArchiveTaskUserByCurrent检查,说明当前登陆用户是该条任务的审批人,修改审批任务状态
+                    Task task = jdbcTemplate.queryForObject("select process_instance_id,form_data_id from u_task where id = " + taskArchiveDTO.getTaskId(), new BeanPropertyRowMapper<>(Task.class));
+                    if (task != null) {
+                        //获取审批任务关联用户的详情
+                        List<TaskParallel> taskParallels = jdbcTemplate.query("select id,process_instance_id,task_user,task_user_name from u_task_parallel where process_instance_id = '" + task.getProcessInstanceId() + "'", new BeanPropertyRowMapper<>(TaskParallel.class));
+                        if (taskParallels.size() > 0) {
+                            //当前用户任务
+                            TaskParallel taskParallelCurrentUser = taskParallels.stream().filter(f -> f.getTaskUser().equals(SecureUtil.getUserId().toString())).findAny().orElse(null);
+                            if (taskParallelCurrentUser != null) {
+                                //修改当前用户任务为已审批
+                                jdbcTemplate.execute("update u_task_parallel set status = 2 where id = " + taskParallelCurrentUser.getId());
+                            }
+                        }
+
+                        //TODO ============ 档案电签推送(每个人都要电签,按照顺序) ============
+                        org.springblade.evisa.vo.TaskArchiveDTO eVisaObj = new org.springblade.evisa.vo.TaskArchiveDTO();
+                        BeanUtils.copyProperties(taskArchiveDTO, eVisaObj);
+                        eVisaObj.setType(1); //审批
+                        this.eVisaClient.eVisaCustom(eVisaObj);
+
+                        //获取最新任务状态,判断是否存在未完成的审批任务(最后一个人审批完成);如果没有就闭环,修改审批任务状态、业务数据状态
+                        List<TaskParallel> taskParallelsNow = jdbcTemplate.query("select status from u_task_parallel where process_instance_id = '" + task.getProcessInstanceId() + "'", new BeanPropertyRowMapper<>(TaskParallel.class));
+                        List<TaskParallel> pendingApprovalTask = taskParallelsNow.stream().filter(f -> f.getStatus() != 2).collect(Collectors.toList());
+                        if (pendingApprovalTask.size() == 0) {
+                            //修改审批任务状态
+                            jdbcTemplate.execute("update u_task set status = 2 where id = " + taskArchiveDTO.getTaskId());
+                            //修改业务数据状态
+                            jdbcTemplate.execute("update u_archive_file set status = 2 where id = " + task.getFormDataId());
+                        }
+                    }
+                }
+            }
+
+            //WebSocket推送
+            if (ObjectUtil.isNotEmpty(AuthUtil.getUserId())) {
+                Map<String, String> webSocketMessageMap = WebSocket.getWebSocketMessageMap();
+                Set<Map.Entry<String, String>> message = webSocketMessageMap.entrySet();
+                for (Map.Entry<String, String> entry : message) {
+                    String userId = entry.getKey();
+                    if (userId.equals(AuthUtil.getUserId().toString())) { //只推送当前用户
+                        String projectAndContractId = entry.getValue();
+                        if (StringUtils.isNotEmpty(projectAndContractId) && StringUtils.isNotEmpty(userId)) {
+                            String projectId = projectAndContractId.split(",")[0];
+                            String contractId = projectAndContractId.split(",")[1];
+                            Map<String, String> stringMap = iTaskService.getTaskCountArchive(projectId, contractId, userId);
+                            webSocket.sendMessageByUserId(AuthUtil.getUserId().toString(), JSON.toJSONString(stringMap));
+                        }
+                    }
+                }
+            }
+            return R.data(true);
+
+        } else {
+            //废除任务
+            List<String> taskIds = taskArchiveOuterLayerDTO.getTaskArchiveDtoList().stream().map(TaskArchiveDTO::getTaskId).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
+            ArchiveTaskBatchRepealDTO dto = new ArchiveTaskBatchRepealDTO();
+            dto.setType(2);
+            dto.setIds(StringUtils.join(taskIds, ","));
+            R<Object> objectR = this.batchRepealTaskArchive(dto);
+            if (objectR.getCode() == 200) {
+                //WebSocket推送
+                if (ObjectUtil.isNotEmpty(AuthUtil.getUserId())) {
+                    Map<String, String> webSocketMessageMap = WebSocket.getWebSocketMessageMap();
+                    Set<Map.Entry<String, String>> message = webSocketMessageMap.entrySet();
+                    for (Map.Entry<String, String> entry : message) {
+                        String userId = entry.getKey();
+                        if (userId.equals(AuthUtil.getUserId().toString())) { //只推送当前用户
+                            String projectAndContractId = entry.getValue();
+                            if (StringUtils.isNotEmpty(projectAndContractId) && StringUtils.isNotEmpty(userId)) {
+                                String projectId = projectAndContractId.split(",")[0];
+                                String contractId = projectAndContractId.split(",")[1];
+                                Map<String, String> stringMap = iTaskService.getTaskCountArchive(projectId, contractId, userId);
+                                webSocket.sendMessageByUserId(AuthUtil.getUserId().toString(), JSON.toJSONString(stringMap));
+                            }
+                        }
+                    }
+                }
+                return R.data(true);
+            } else if (objectR.getCode() == 400) {
+                return R.data(false);
+            }
+        }
+        return R.data(false);
+    }
+
+    /**
+     * 批量审批-获取档案审批任务对应业务数据的pdf信息
+     */
+    @PostMapping("/getArchiveFileTaskPdfs")
+    @ApiOperationSupport(order = 8)
+    @ApiOperation(value = "批量审批-获取档案审批任务对应业务数据的pdf信息", notes = "传入任务id,封装成taskIds,字符串逗号分割拼接")
+    public R<List<ArchiveFileTaskPDFVO>> getArchiveFileTaskPdfs(@RequestParam String taskIds) {
+        if (StringUtils.isNotEmpty(taskIds)) {
+            List<Task> taskList = jdbcTemplate.query("select form_data_id from u_task where approval_type = 4 and id in(" + taskIds + ")", new BeanPropertyRowMapper<>(Task.class));
+            Set<String> formDataIds = taskList.stream().map(Task::getFormDataId).collect(Collectors.toSet());
+            if (formDataIds.size() > 0) {
+                List<ArchiveFile> archiveFiles = jdbcTemplate.query("select id,file_name,pdf_file_url,e_visa_file from u_archive_file where id in(" + StringUtils.join(formDataIds, ",") + ")", new BeanPropertyRowMapper<>(ArchiveFile.class));
+                List<ArchiveFileTaskPDFVO> collect = archiveFiles.stream()
+                        .map(obj -> {
+                            ArchiveFileTaskPDFVO vo = new ArchiveFileTaskPDFVO();
+                            vo.setId(obj.getId());
+                            vo.setPdfUrl(ObjectUtil.isNotEmpty(obj.getEVisaFile()) ? obj.getEVisaFile() : obj.getPdfFileUrl());
+                            vo.setFileName(obj.getFileName());
+                            return vo;
+                        }).collect(Collectors.toList());
+                return R.data(collect);
+            }
+        }
+        return R.data(null);
+    }
+
+    /**
+     * 检查档案审批是否按照顺序审批
+     *
+     * @param taskArchiveDTOList
+     */
+    private void checkArchiveTaskUserByCurrent(List<TaskArchiveDTO> taskArchiveDTOList) {
+        for (TaskArchiveDTO taskArchiveDTO : taskArchiveDTOList) {
+            if (ObjectUtil.isNotEmpty(taskArchiveDTO.getTaskId())) {
+                Task task = jdbcTemplate.queryForObject("select process_instance_id,task_name from u_task where id = '" + taskArchiveDTO.getTaskId() + "'", new BeanPropertyRowMapper<>(Task.class));
+                if (ObjectUtil.isNotEmpty(task)) {
+                    List<TaskParallel> taskParallelList = jdbcTemplate.query("select id,process_instance_id,task_user,task_user_name,status from u_task_parallel where process_instance_id ='" + task.getProcessInstanceId() + "'", new BeanPropertyRowMapper<>(TaskParallel.class));
+                    taskParallelList.sort(Comparator.comparing(TaskParallel::getId)); //根据id排序
+                    Map<String, List<TaskParallel>> taskParallelGroup = taskParallelList.stream().collect(Collectors.groupingBy(TaskParallel::getProcessInstanceId));
+                    for (Map.Entry<String, List<TaskParallel>> taskObj : taskParallelGroup.entrySet()) {
+                        //获取当前审批人前面的审批人信息
+                        List<TaskParallel> frontTaskUser = new LinkedList<>();
+                        for (TaskParallel taskParallel : taskObj.getValue()) {
+                            Long userId = SecureUtil.getUserId();
+                            if (!userId.toString().equals(taskParallel.getTaskUser())) {
+                                frontTaskUser.add(taskParallel);
+                            } else {
+                                //如果是当前的审批人,那么直接跳过
+                                break;
+                            }
+                        }
+                        List<TaskParallel> resultTaskStatus = frontTaskUser.stream().filter(f -> !f.getStatus().equals(2)).collect(Collectors.toList());
+                        if (resultTaskStatus.size() > 0) {
+                            String names = resultTaskStatus.stream().map(TaskParallel::getTaskUserName).collect(Collectors.joining("、"));
+                            throw new ServiceException("当前任务【" + task.getTaskName() + "】还有【" + names + "】未完成审批,请您稍后再试");
+                        }
+                    }
+                }
+            }
+        }
+    }
+
     /**
      * 获取当前合同段的上报批次
      *
@@ -413,7 +760,7 @@ public class TaskController extends BladeController {
     @ApiOperationSupport(order = 6)
     @ApiOperation(value = "获取任务类型或任务状态")
     public R<List<DictBiz>> queryTaskTypeOrStatus(String typeOrStatus, BladeUser bladeUser) {
-        return R.data(jdbcTemplate.query("select dict_key, dict_value from blade_dict_biz where code = '" + typeOrStatus + "' and tenant_id="+bladeUser.getTenantId()+" and parent_id > 0 and is_sealed = 0 and is_deleted = 0 order by sort", new BeanPropertyRowMapper<>(DictBiz.class)));
+        return R.data(jdbcTemplate.query("select dict_key, dict_value from blade_dict_biz where code = '" + typeOrStatus + "' and tenant_id=" + bladeUser.getTenantId() + " and parent_id > 0 and is_sealed = 0 and is_deleted = 0 order by sort", new BeanPropertyRowMapper<>(DictBiz.class)));
     }
 
     /**
@@ -483,7 +830,7 @@ public class TaskController extends BladeController {
         this.integrationMethod(queryVO, masterTaskMap, parallelMap, parallelProcessInstanceIds, "1");
 
         //如果为空直接返回
-        if (masterTaskMap.size() == 0 && parallelMap.size() == 0) {
+        if (masterTaskMap.size() == 0 && parallelMap.size() == 0 && ObjectUtil.isNotEmpty(queryVO.getContractId()) && ObjectUtil.isNotEmpty(queryVO.getProjectId())) {
             this.sendsWebSocketCount(null, 2, queryVO);
             return R.data(null);
         }
@@ -495,9 +842,9 @@ public class TaskController extends BladeController {
         R<IPage<TaskVO>> iPageR = this.integrationMethod(queryVO, rObject, masterTaskMap, parallelMap, true);
 
         //推送
-        if (ObjectUtil.isNotEmpty(iPageR.getData()) && ObjectUtil.isNotEmpty(iPageR.getData().getRecords())) {
+        if (ObjectUtil.isNotEmpty(iPageR.getData()) && ObjectUtil.isNotEmpty(iPageR.getData().getRecords()) && ObjectUtil.isNotEmpty(queryVO.getContractId()) && ObjectUtil.isNotEmpty(queryVO.getProjectId())) {
             this.sendsWebSocketCount(iPageR, 1, queryVO);
-        } else {
+        } else if (ObjectUtil.isNotEmpty(queryVO.getContractId()) && ObjectUtil.isNotEmpty(queryVO.getProjectId())) {
             this.sendsWebSocketCount(null, 2, queryVO);
         }
         return iPageR;
@@ -513,6 +860,10 @@ public class TaskController extends BladeController {
      */
     @Async
     public void sendsWebSocketCount(R<IPage<TaskVO>> iPageR, int type, TaskQueryVO queryVO) throws IOException {
+        if (ObjectUtil.isEmpty(queryVO.getCurrentContractId())) {
+            //如果getCurrentContractId=null,那么表示是APP的待办查询(web端不为null)
+            queryVO.setCurrentContractId(queryVO.getContractId());
+        }
         if (type == 1) {
             Map<String, String> stringMap = iTaskService.getTaskCount(queryVO.getProjectId(), queryVO.getCurrentContractId(), SecureUtil.getUserId().toString());
             stringMap.put("taskCount", String.valueOf(iPageR.getData().getTotal()));
@@ -716,4 +1067,170 @@ public class TaskController extends BladeController {
         return this.taskService.startApproval(taskVO) ? R.data(200, true, "操作成功") : R.data(200, false, "操作失败,请联系管理员");
     }
 
+    /**
+     * 资料填报-任务管理-任务查看分页查询
+     */
+    @PostMapping("/page")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "资料填报-任务管理-任务查看分页查询", notes = "传入BusinessTaskDTO")
+    public R<IPage<BusinessTaskPageVO>> page(@RequestBody BusinessTaskDTO dto) {
+        int current = dto.getCurrent();
+        int size = dto.getSize();
+        //封装入参SQL
+        List<Object> params = new ArrayList<>();
+        StringBuilder sqlString = new StringBuilder("SELECT * FROM u_task WHERE 1=1 AND approval_type != 4"); //approval_type != 4 非档案的任务就是1填报资料,2工程文件,3日志资料
+        if (ObjectUtil.isNotEmpty(dto.getTypeValue())) {
+            sqlString.append(" AND type = ?");
+            params.add(dto.getTypeValue());
+        }
+        if (ObjectUtil.isNotEmpty(dto.getStatusValue())) {
+            sqlString.append(" AND status = ?");
+            params.add(dto.getStatusValue());
+        }
+
+        ContractInfo contractInfo = jdbcTemplate.queryForObject("select contract_type from m_contract_info where id = " + dto.getCurrentContractId(), new BeanPropertyRowMapper<>(ContractInfo.class));
+        if (contractInfo != null && contractInfo.getContractType().equals(1)) {
+            //施工合同段正常查询
+            if (ObjectUtil.isNotEmpty(dto.getContractIdValue())) {
+                sqlString.append(" AND contract_id = ?");
+                params.add(dto.getContractIdValue());
+            } else {
+                //如果合同段id=null,那么查询当前项目下所有合同段任务
+                if (ObjectUtil.isNotEmpty(dto.getProjectIdValue())) {
+                    sqlString.append(" AND project_id = ?");
+                    params.add(dto.getProjectIdValue());
+                } else {
+                    throw new ServiceException("未获取到项目信息,请联系管理员");
+                }
+            }
+        } else if (contractInfo != null && (contractInfo.getContractType().equals(2) || contractInfo.getContractType().equals(3))) {
+            //如果是监理合同段,那么默认查询关联的全部施工合同段+本身任务
+            List<ContractRelationJlyz> contractRelationJLYZ = jdbcTemplate.query("select contract_id_sg from m_contract_relation_jlyz where contract_id_jlyz = " + dto.getCurrentContractId(), new BeanPropertyRowMapper<>(ContractRelationJlyz.class));
+            Set<Long> ids = contractRelationJLYZ.stream().map(ContractRelationJlyz::getContractIdSg).collect(Collectors.toSet());
+            ids.add(dto.getCurrentContractId()); //把监理本身也加入查询
+            sqlString.append(" AND contract_id in(").append(StringUtils.join(ids, ",")).append(")");
+        }
+
+        if (ObjectUtil.isNotEmpty(dto.getBatchValue())) {
+            sqlString.append(" AND batch = ?");
+            params.add(dto.getBatchValue());
+        }
+        if (StringUtils.isNotBlank(dto.getStartTimeValue()) && StringUtils.isNotBlank(dto.getEndTimeValue())) {
+            sqlString.append(" AND start_time >= ?")
+                    .append(dto.getStartTimeValue())
+                    .append(" AND end_time <= ?");
+            params.add(dto.getStartTimeValue());
+            params.add(dto.getEndTimeValue());
+        }
+        if (StringUtils.isNotBlank(dto.getQueryValue())) {
+            sqlString.append(" AND task_name LIKE ?");
+            params.add("%" + dto.getQueryValue() + "%");
+        }
+        if (ObjectUtil.isNotEmpty(dto.getSelectedType())) {
+            sqlString.append(" AND (");
+            if (dto.getSelectedType().equals(1)) { //待办页面
+
+                //如果是待办页面,且 任务状态下拉框 选择的是 待审批状态 的任务,那么才查询数据
+                if (ObjectUtil.isNotEmpty(dto.getStatusValue()) && dto.getStatusValue().equals(1)) {
+                    sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status = ? AND u_task_parallel.task_user = ?)");
+                    params.add(1);
+                    params.add(SecureUtil.getUserId());
+
+                    //如果是待办页面,且 任务状态下拉框 选择的不是 待审批状态 的任务,那么直接返回null
+                } else if (ObjectUtil.isNotEmpty(dto.getStatusValue()) && !dto.getStatusValue().equals(1)) {
+                    return null;
+
+                    //如果是待办页面,没选择 任务状态下拉框,那么就默认查询 待审批状态 任务
+                } else if (ObjectUtil.isEmpty(dto.getStatusValue())) {
+                    sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status = ? AND u_task_parallel.task_user = ?)");
+                    params.add(1);
+                    params.add(SecureUtil.getUserId());
+                    sqlString.append(" AND status = 1");
+                }
+
+            } else if (dto.getSelectedType().equals(2)) { //已办页面
+                sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status = ? AND u_task_parallel.task_user = ?)");
+                //当前自己的任务必须是已审批,才视为已办
+                params.add(2);
+                params.add(SecureUtil.getUserId());
+
+            } else if (dto.getSelectedType().equals(3)) { //我发起页面
+                sqlString.append("report_user = ?");
+                params.add(SecureUtil.getUserId());
+            }
+            sqlString.append(")");
+        }
+
+        //总数量
+        String sqlCount = sqlString.toString().replace("*", "count(1)");
+        Optional<Integer> totalCountOptional = Optional.ofNullable(jdbcTemplate.queryForObject(sqlCount, Integer.class, params.toArray()));
+        int totalCount = totalCountOptional.orElse(0);
+
+        //分页
+        sqlString.append(" ORDER BY create_time DESC LIMIT ? OFFSET ?");
+        params.add(size);
+        params.add((current - 1) * size);
+
+        //执行SQL获取数据
+        String sqlPage = sqlString.toString();
+        List<Task> resultList = jdbcTemplate.query(
+                sqlPage,
+                new BeanPropertyRowMapper<>(Task.class),
+                params.toArray()
+        );
+
+        //获取任务详情信息Map
+        Set<String> processInstanceIds = resultList.stream().map(Task::getProcessInstanceId).collect(Collectors.toSet());
+        Map<String, List<TaskParallel>> taskParallelGroupMap = new HashMap<>();
+        if (processInstanceIds.size() > 0) {
+            StringJoiner joiner = new StringJoiner(",", "'", "'");
+            processInstanceIds.forEach(joiner::add);
+            String joinedIds = joiner.toString();
+            taskParallelGroupMap = jdbcTemplate.query("select process_instance_id,task_user_name,e_visa_status,e_visa_content from u_task_parallel where process_instance_id in(" + joinedIds + ") order by id", new BeanPropertyRowMapper<>(TaskParallel.class)).stream().collect(Collectors.groupingBy(TaskParallel::getProcessInstanceId));
+        }
+        Map<String, List<TaskParallel>> finalTaskParallelGroupMap = taskParallelGroupMap;
+
+        //获取用户信息Map
+        Map<Long, String> nameMap = jdbcTemplate.query("select id,name from blade_user where is_deleted = 0", new BeanPropertyRowMapper<>(User.class)).stream().collect(Collectors.toMap(User::getId, User::getName, (key1, key2) -> key1));
+
+        //解析page分页数据
+        IPage<BusinessTaskPageVO> page = new Page<>(current, size);
+        List<BusinessTaskPageVO> pageList = resultList.stream()
+                .map(task -> {
+                    BusinessTaskPageVO vo = new BusinessTaskPageVO();
+                    vo.setId(task.getId());
+                    vo.setTaskName(task.getTaskName());
+                    vo.setTaskTypeName(task.getType().equals(1) ? "普通任务" : task.getType().equals(2) ? "验收任务" : "移交任务");
+                    vo.setTaskStatusName(task.getStatus().equals(1) ? "待审批" : task.getStatus().equals(2) ? "已审批" : "已废除");
+                    vo.setStartTime(task.getStartTime());
+                    vo.setEndTime(task.getEndTime());
+                    vo.setTaskDesc(task.getTaskContent());
+                    vo.setTaskReportUserName(nameMap.get(Long.parseLong(task.getReportUser())));
+                    vo.setApprovalType(task.getApprovalType());
+                    vo.setFormDataId(task.getFormDataId());
+                    vo.setProcessInstanceId(task.getProcessInstanceId());
+                    List<TaskParallel> taskParallelList = finalTaskParallelGroupMap.get(task.getProcessInstanceId());
+                    if (taskParallelList != null && taskParallelList.size() > 0) {
+                        List<String> names = taskParallelList.stream().map(TaskParallel::getTaskUserName).collect(Collectors.toList());
+                        if (names.size() > 0) {
+                            vo.setTaskApproveUserNames(StringUtils.join(names, ","));
+                        }
+                        Set<Integer> eVisaStatus = taskParallelList.stream().map(TaskParallel::getEVisaStatus).collect(Collectors.toSet());
+                        if (eVisaStatus.size() > 0) {
+                            vo.setEVisaStatus(StringUtils.join(eVisaStatus, "、"));
+                        }
+                        Set<String> eVisaContents = taskParallelList.stream().map(TaskParallel::getEVisaContent).collect(Collectors.toSet());
+                        if (eVisaContents.size() > 0) {
+                            vo.setEVisaContents(StringUtils.join(eVisaContents, "、"));
+                        }
+                    }
+                    return vo;
+                })
+                .collect(Collectors.toList());
+        page.setRecords(pageList);
+        page.setTotal(totalCount);
+        return R.data(page);
+    }
+
+
 }

+ 11 - 11
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml

@@ -138,17 +138,17 @@
         <if test="vo.rectification != null and vo.rectification != ''">
             and u.rectification = #{vo.rectification}
         </if>
-        <choose>
-            <when test="vo.isArchive != null and vo.isArchive != ''">
-                and u.is_auto_file = #{vo.isArchive}
-            </when>
-            <when test="vo.archiveId != null and vo.archiveId != ''">
-                and 1=1
-            </when>
-            <otherwise>
-                and (u.is_auto_file is null or u.is_auto_file != 1)
-            </otherwise>
-        </choose>
+<!--        <choose>-->
+<!--            <when test="vo.isArchive != null and vo.isArchive != ''">-->
+<!--                and u.is_auto_file = #{vo.isArchive}-->
+<!--            </when>-->
+<!--            <when test="vo.archiveId != null and vo.archiveId != ''">-->
+<!--                and 1=1-->
+<!--            </when>-->
+<!--            <otherwise>-->
+<!--                and (u.is_auto_file is null or u.is_auto_file != 1)-->
+<!--            </otherwise>-->
+<!--        </choose>-->
         <if test="vo.nodeIds != null and vo.nodeIds != ''">
             and u.node_id in
             <foreach collection="vo.nodeIdArray" item="nodeId" open="(" separator="," close=")">

+ 7 - 2
blade-service/blade-business/src/main/java/org/springblade/business/service/ITaskService.java

@@ -63,10 +63,15 @@ public interface ITaskService extends BaseService<Task> {
     Boolean abolishTask(Task task);
 
     /**
-     * 获取任务数量
+     * 获取任务数量 - 非档案,其他任务
      */
     Map<String, String> getTaskCount(String projectId, String contractId, String userId);
 
+    /**
+     * 获取任务数量 - 档案任务
+     */
+    Map<String, String> getTaskCountArchive(String projectId, String contractId, String userId);
+
     /**
      * 获取当前合同段有哪些上报批次
      */
@@ -87,5 +92,5 @@ public interface ITaskService extends BaseService<Task> {
     /**
      * 清除废除任务是的业务数据
      */
-    void delArchiveFileBusinessData(Long projectId,Long wbsId);
+    void delArchiveFileBusinessData(Long projectId, Long wbsId);
 }

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

@@ -372,6 +372,14 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
         return true;
     }
 
+    /**
+     * 非档案任务
+     *
+     * @param projectId
+     * @param contractId
+     * @param userId
+     * @return
+     */
     @Override
     public Map<String, String> getTaskCount(String projectId, String contractId, String userId) {
         if (StringUtils.isNotEmpty(projectId) && StringUtils.isNotEmpty(contractId)) {
@@ -379,7 +387,72 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                     .select(Task::getProcessInstanceId)
                     .eq(Task::getProjectId, projectId)
                     .eq(Task::getContractId, contractId)
-                    .eq(Task::getStatus, 1)); //只获取待办任务数量
+                    .eq(Task::getStatus, 1) //只获取待办任务数量
+                    .ne(Task::getApprovalType, 4));//不等于4,不查档案的任务,档案单独处理
+
+            //任务主表相关数量
+            List<String> taskCountIds = tasks.stream().map(Task::getProcessInstanceId).collect(Collectors.toList());
+
+            //任务附表中当前用户的相关任务数量
+            long taskAllCount = 0;
+            if (taskCountIds.size() > 0) {
+                taskAllCount = taskParallelService.getBaseMapper().selectCount(Wrappers.<TaskParallel>lambdaQuery()
+                        .in(TaskParallel::getProcessInstanceId, taskCountIds)
+                        .eq(TaskParallel::getTaskUser, userId)
+                        .eq(TaskParallel::getStatus, 1));
+            }
+
+            //未读消息提醒数量
+            List<MessageWarning> messageWarnings = messageWarningService.getBaseMapper().selectList(Wrappers.<MessageWarning>lambdaQuery()
+                    .select(MessageWarning::getType)
+                    .eq(MessageWarning::getProjectId, projectId)
+                    .eq(MessageWarning::getContractId, contractId)
+                    .eq(MessageWarning::getPushUser, userId)
+                    .eq(MessageWarning::getIsRead, 0)
+            );
+
+            long messageCount1 = messageWarnings.stream().filter(f -> f.getType().equals(1)).count();
+            long messageCount2 = messageWarnings.stream().filter(f -> f.getType().equals(2)).count();
+            long messageCount3 = messageWarnings.stream().filter(f -> f.getType().equals(3)).count();
+            long messageCount4 = messageWarnings.stream().filter(f -> f.getType().equals(4)).count();
+            long messageCount5 = messageWarnings.stream().filter(f -> f.getType().equals(5)).count();
+            Map<String, String> map = new HashMap<>();
+            map.put("allCount", String.valueOf(taskAllCount + messageWarnings.size()));//任务管理
+            map.put("taskCount", String.valueOf(taskAllCount));//任务查看
+            map.put("messageCount", String.valueOf(messageWarnings.size()));//消息提醒
+            map.put("messageCount_1", String.valueOf(messageCount1));//任务催办
+            map.put("messageCount_2", String.valueOf(messageCount2));//监测预警
+            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;
+        }
+    }
+
+    /**
+     * 档案任务相关
+     *
+     * @param projectId
+     * @param contractId
+     * @param userId
+     * @return
+     */
+    @Override
+    public Map<String, String> getTaskCountArchive(String projectId, String contractId, String userId) {
+        if (StringUtils.isNotEmpty(projectId) && StringUtils.isNotEmpty(contractId)) {
+            List<Task> tasks = this.baseMapper.selectList(Wrappers.<Task>lambdaQuery()
+                    .select(Task::getProcessInstanceId)
+                    .eq(Task::getProjectId, projectId)
+                    .eq(Task::getContractId, contractId)
+                    .eq(Task::getStatus, 1) //只获取待办任务数量
+                    .eq(Task::getApprovalType, 4));//只查询档案的任务,档案单独处理
 
             //任务主表相关数量
             List<String> taskCountIds = tasks.stream().map(Task::getProcessInstanceId).collect(Collectors.toList());

+ 6 - 0
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/feign/EVisaClientImpl.java

@@ -8,6 +8,7 @@ import org.springblade.evisa.service.EVisaService;
 import org.springblade.evisa.vo.CertBeanVO;
 import org.springblade.evisa.vo.EVisaMakeSealVO;
 import org.springblade.evisa.vo.EVisaTaskApprovalVO;
+import org.springblade.evisa.vo.TaskArchiveDTO;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
@@ -46,6 +47,11 @@ public class EVisaClientImpl implements EVisaClient {
         return this.eVisaService.eVisa(task);
     }
 
+    @Override
+    public void eVisaCustom(org.springblade.evisa.vo.TaskArchiveDTO eVisaObj) {
+        this.eVisaService.eVisaCustom(eVisaObj);
+    }
+
     @Override
     public String createSeal(EVisaMakeSealVO vo) {
         return this.eVisaService.createSeal(vo);

+ 5 - 0
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/EVisaService.java

@@ -23,6 +23,11 @@ public interface EVisaService {
      */
     String eVisa(EVisaTaskApprovalVO task);
 
+    /**
+     * 电签(档案-批量自定义)
+     */
+    void eVisaCustom(org.springblade.evisa.vo.TaskArchiveDTO eVisaObj);
+
     /**
      * 创建印模
      */

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

@@ -31,6 +31,8 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springblade.business.entity.ArchiveFile;
+import org.springblade.business.entity.Task;
 import org.springblade.business.feign.TaskClient;
 import org.springblade.business.vo.TaskApprovalVO;
 import org.springblade.common.constant.CommonConstant;
@@ -39,15 +41,14 @@ import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.FileUtil;
-import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.evisa.redissionUtil.DistributedRedisLock;
 import org.springblade.evisa.service.EVisaService;
 import org.springblade.evisa.utils.PDFUtils;
-import org.springblade.evisa.vo.EVisaMakeSealVO;
-import org.springblade.evisa.vo.EVisaTaskApprovalVO;
-import org.springblade.evisa.vo.SealPdfVO;
-import org.springblade.evisa.vo.SealStrategyVO;
+import org.springblade.evisa.vo.*;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.SignPfxFile;
 import org.springblade.manager.feign.ContractClient;
@@ -61,8 +62,6 @@ import org.springframework.http.converter.HttpMessageConverter;
 import org.springframework.http.converter.StringHttpMessageConverter;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
-import org.springframework.jdbc.core.namedparam.SqlParameterSource;
 import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.stereotype.Service;
 import org.springframework.web.client.RestTemplate;
@@ -239,14 +238,14 @@ public class EVisaServiceImpl implements EVisaService {
                 String ids = String.join(",", eVisaConfigList);
                 String sqlinfo = "SELECT a.id,a.pyzbx,a.pyzby,b.signature_file_url,b.id as sfId,b.certificate_password,b.certificate_user_name from m_textdict_info a ,m_sign_pfx_file b where a.sig_role_id = b.pfx_type and b.project_contract_role like '%" + contractId + "%' and a.is_deleted=0 and b.is_deleted=0 and a.type=6 and a.id in(" + ids + ")";
                 List<Map<String, Object>> maps = jdbcTemplate.queryForList(sqlinfo);
-
+                System.out.println("合同-"+contractId+"--"+sqlinfo);
 
                 //准备签章策略
                 List<SealStrategyVO> sealStrategyVOS = new ArrayList<>();
                 for (Map<String, Object> eVisaConfig : maps) {
                     //设置签章策略
                     SealStrategyVO vo = new SealStrategyVO();
-                    vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + eVisaConfig.get("id"));
+                    vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + eVisaConfig.get("sfId"));
                     vo.setSealPassword(eVisaConfig.get("certificate_password")+"");
                     vo.setSealPerson(eVisaConfig.get("certificate_user_name")+"" + System.currentTimeMillis());
                     //设置签字文件
@@ -320,8 +319,6 @@ public class EVisaServiceImpl implements EVisaService {
         System.out.println(AuthUtil.getUserId().toString());
         if (DistributedRedisLock.acquire(AuthUtil.getUserId().toString(), batch)) {
             try {
-
-
                 //准备签章策略
                 List<SealStrategyVO> sealStrategyVOS = new ArrayList<>();
                 for (JSONObject eVisaConfig : eVisaConfigList) {
@@ -406,12 +403,13 @@ public class EVisaServiceImpl implements EVisaService {
         }
 
         //上锁
-        //if (DistributedRedisLock.acquire(task.getUserId().toString(), batch)) {*/
+        //if (DistributedRedisLock.acquire(task.getUserId().toString(), batch)) {
         try {
             //获取需要签章的数据
             List<TaskApprovalVO.ApprovalFile> files = taskFile.getApprovalFileList();
             //这里的文件只会是一张拼接好的PDF
             for (TaskApprovalVO.ApprovalFile file : files) {
+
                 if (file.getFileName().contains("(关联试验文件)") || file.getFileName().contains("(关联试验工程部位信息文件)") || file.getFileName().contains("(原材料检测报告)")) {
                     //TODO ============== 试验相关的关联文件不电签 liuYC 2023-03-17 ==============
                     continue;
@@ -425,9 +423,9 @@ public class EVisaServiceImpl implements EVisaService {
                 }
                 String contractId = this.taskClient.queryTaskContractId(task.getParallelProcessInstanceId());
                 String ids = String.join(",", eVisaConfigList);
-                String sqlinfo = " SELECT a.id,a.pyzbx ,a.pyzby,(SELECT signature_file_url from m_sign_pfx_file where is_register=1 and certificate_user_id='" + task.getUserId() + "' and is_deleted=0  ) as signature_file_url from m_textdict_info a where a.id in (" + ids + ")  and sig_role_id in (SELECT DISTINCT c.role_id from m_project_assignment_user c  where c.contract_id=" + contractId + " and user_id=" + task.getUserId() + " and a.is_deleted=0 )";
+                String sqlinfo = " SELECT a.id,a.pyzbx ,a.pyzby,(SELECT signature_file_url from m_sign_pfx_file where is_register=1 and certificate_user_id='" + task.getUserId() + "' and is_deleted=0  ) as signature_file_url from m_textdict_info a where  a.type =2 and a.id in (" + ids + ")  and sig_role_id in (SELECT DISTINCT c.role_id from m_project_assignment_user c  where c.contract_id=" + contractId + " and user_id=" + task.getUserId() + " and c.is_deleted=0 )";
                 List<Map<String, Object>> maps = jdbcTemplate.queryForList(sqlinfo);
-                System.out.println("user-id"+task.getUserId()+"--SQL="+sqlinfo);
+                System.out.println("个人-user-id"+task.getUserId()+"--SQL="+sqlinfo);
                 if (maps == null || maps.size() <= 0) {
                     //没有签章,不执行电签
                     RedisTemplate.delete("sign-" + task.getFormDataId());
@@ -484,6 +482,156 @@ public class EVisaServiceImpl implements EVisaService {
         return resultMessage;
     }
 
+    /**
+     * 自定义签章-电签信息
+     *
+     * @param taskArchiveDTO
+     */
+    public void eVisaCustom(org.springblade.evisa.vo.TaskArchiveDTO taskArchiveDTO) {
+        //type=1表示任务审批自定义签章,type=2表示认证电签签章(不涉及审批任务)
+        if (taskArchiveDTO.getSealStrategy().size() > 0 && taskArchiveDTO.getType() == 1) {
+            //获取档案任务
+            Task task = jdbcTemplate.queryForObject("select form_data_id from u_task where id = " + taskArchiveDTO.getTaskId(), new BeanPropertyRowMapper<>(Task.class));
+            if (task != null) {
+                //获取档案任务的文件信息
+                ArchiveFile archiveFile = jdbcTemplate.queryForObject("select pdf_file_url,e_visa_file from u_archive_file where id = " + task.getFormDataId(), new BeanPropertyRowMapper<>(ArchiveFile.class));
+                if (archiveFile != null && archiveFile.getPdfFileUrl() != null) {
+                    String signPdfUrl;
+                    if (ObjectUtil.isNotEmpty(archiveFile.getEVisaFile())) {
+                        //如果e_visa_file有值,那么证明之前有过其他人进行电签,那么获取e_visa_file进行追加电签
+                        signPdfUrl = archiveFile.getEVisaFile();
+                    } else {
+                        //否则使用原始pdf_file_url电签
+                        signPdfUrl = archiveFile.getPdfFileUrl();
+                    }
+
+                    try {
+                        //准备签章策略
+                        SealPdfVO pdfVO = new SealPdfVO();
+                        //获取当前用户的CA签字体证书信息、封装签章位置信息
+                        List<TaskArchiveDTO.Sign> signList = taskArchiveDTO.getSealStrategy();
+                        List<SealStrategyVO> sealStrategyVOS = new ArrayList<>();
+                        for (TaskArchiveDTO.Sign index : signList) {
+                            if (ObjectUtil.isNotEmpty(index.getUrl())) { //CA签字体证书不为空才签章
+                                SealStrategyVO signVO = new SealStrategyVO();
+                                signVO.setIsCenterCoordinate("1"); //左上角为原点
+                                signVO.setSealCode(EVisaConstant.SIGN_SEAL_CODE + SecureUtil.getUserId());
+                                signVO.setSealPassword(SecureUtil.getUserId().toString().substring(0, EVisaConstant.USER_ID_SUB));
+                                signVO.setSealPerson(SecureUtil.getNickName());
+
+                                //位置信息
+                                signVO.setImageUrl(index.getUrl()); //CA签字体
+                                signVO.setSealType("2");//坐标签章
+                                signVO.setLx(index.getLx()); //x轴
+                                signVO.setLy(index.getLy()); //y轴
+                                signVO.setPage(index.getPage()); //page页码
+                                sealStrategyVOS.add(signVO);
+                            }
+                        }
+                        pdfVO.setStrategyVoList(sealStrategyVOS);
+
+                        //获取档案pdfUrl
+                        byte[] fileByte = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(signPdfUrl));
+
+                        //TODO ========== 执行电签 ==========
+                        Object[] result = this.signPdfByAXQZ(pdfVO, fileByte);
+
+                        //返回结果集
+                        if (result != null) {
+                            if (result[0] != null) {
+                                byte[] byteArray = IOUtils.toByteArray(new ByteArrayInputStream((byte[]) result[0]));
+
+                                /*String dataUrl = "C:\\pdfFiles\\" + SnowFlakeUtil.getId() + ".pdf";
+                                File file1 = new File(dataUrl);
+                                FileUtils.writeByteArrayToFile(file1, byteArray);*/
+
+                                BladeFile bladeFile = this.newIOSSClient.updateFile(byteArray, SnowFlakeUtil.getId() + ".pdf");
+                                if (bladeFile != null) {
+                                    //更新最新的电签pdfUrl
+                                    jdbcTemplate.execute("update u_archive_file set e_visa_file = '" + bladeFile.getLink() + "' where id = " + task.getFormDataId());
+                                    String successMsg = SUCCESS + "@@@@" + bladeFile.getLink();
+                                    logger.info(successMsg);
+                                }
+                            }
+                        }
+                    } catch (Exception e) {
+                        logger.error(e.getMessage());
+                        e.printStackTrace();
+                    }
+                }
+            }
+        } else if (taskArchiveDTO.getSealStrategy().size() > 0 && taskArchiveDTO.getType() == 2) {
+            //此时的taskArchiveDTO.taskId=档案数据业务id(档案认证不涉及审批流任务)
+            //获取档案任务的文件信息(这里根据id再查询一次,入参的时候不想重新构造入参的dto了)
+            ArchiveFile archiveFile = jdbcTemplate.queryForObject("select pdf_file_url,e_visa_file from u_archive_file where id = " + taskArchiveDTO.getTaskId(), new BeanPropertyRowMapper<>(ArchiveFile.class));
+            if (archiveFile != null && archiveFile.getPdfFileUrl() != null) {
+                String signPdfUrl;
+                if (ObjectUtil.isNotEmpty(archiveFile.getEVisaFile())) {
+                    //如果e_visa_file有值,那么证明之前有过其他人进行电签,那么获取e_visa_file进行追加电签
+                    signPdfUrl = archiveFile.getEVisaFile();
+                } else {
+                    //否则使用原始pdf_file_url电签
+                    signPdfUrl = archiveFile.getPdfFileUrl();
+                }
+
+                try {
+                    //准备签章策略
+                    SealPdfVO pdfVO = new SealPdfVO();
+                    //获取当前用户的CA签字体证书信息、封装签章位置信息
+                    List<TaskArchiveDTO.Sign> signList = taskArchiveDTO.getSealStrategy();
+                    List<SealStrategyVO> sealStrategyVOS = new ArrayList<>();
+                    for (TaskArchiveDTO.Sign index : signList) {
+                        if (ObjectUtil.isNotEmpty(index.getUrl())) { //CA签字体证书不为空才签章
+                            SealStrategyVO signVO = new SealStrategyVO();
+                            signVO.setIsCenterCoordinate("1"); //左上角为原点
+                            signVO.setSealCode(EVisaConstant.SIGN_SEAL_CODE + SecureUtil.getUserId());
+                            signVO.setSealPassword(SecureUtil.getUserId().toString().substring(0, EVisaConstant.USER_ID_SUB));
+                            signVO.setSealPerson(SecureUtil.getNickName());
+
+                            //位置信息
+                            signVO.setImageUrl(index.getUrl()); //CA签字体
+                            signVO.setSealType("2");//坐标签章
+                            signVO.setLx(index.getLx()); //x轴
+                            signVO.setLy(index.getLy()); //y轴
+                            signVO.setPage(index.getPage()); //page页码
+                            sealStrategyVOS.add(signVO);
+                        }
+                    }
+                    pdfVO.setStrategyVoList(sealStrategyVOS);
+
+                    //获取档案pdfUrl
+                    byte[] fileByte = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(signPdfUrl));
+
+                    //TODO ========== 执行电签 ==========
+                    Object[] result = this.signPdfByAXQZ(pdfVO, fileByte);
+
+                    //返回结果集
+                    if (result != null) {
+                        if (result[0] != null) {
+                            byte[] byteArray = IOUtils.toByteArray(new ByteArrayInputStream((byte[]) result[0]));
+
+                            /*String dataUrl = "C:\\pdfFiles\\" + SnowFlakeUtil.getId() + ".pdf";
+                            File file1 = new File(dataUrl);
+                            FileUtils.writeByteArrayToFile(file1, byteArray);*/
+
+                            BladeFile bladeFile = this.newIOSSClient.updateFile(byteArray, SnowFlakeUtil.getId() + ".pdf");
+                            if (bladeFile != null) {
+                                //更新最新的认证电签pdfUrl
+                                jdbcTemplate.execute("update u_archive_file set is_certification = 1,e_visa_file = '" + bladeFile.getLink() + "',certification_time = '" + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss") + "' where id = " + taskArchiveDTO.getTaskId());
+                                String successMsg = SUCCESS + "@@@@" + bladeFile.getLink();
+                                logger.info(successMsg);
+                            }
+                        }
+                    }
+                } catch (Exception e) {
+                    logger.error(e.getMessage());
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+
     /**
      * 东方 中讯
      *

+ 59 - 7
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/PDFUtils.java

@@ -1,6 +1,9 @@
 package org.springblade.evisa.utils;
 
 import com.spire.pdf.PdfDocument;
+import com.spire.pdf.PdfPageBase;
+import com.spire.pdf.general.find.PdfTextFind;
+import com.spire.pdf.general.find.PdfTextFindCollection;
 import com.spire.pdf.utilities.PdfTable;
 import com.spire.pdf.utilities.PdfTableExtractor;
 
@@ -13,6 +16,7 @@ import java.util.List;
 
 
 public class PDFUtils {
+/*
     public static List<String> getPdfSignIds(String pdfUrl) {
         PdfDocument pdf = new PdfDocument();
         List<String> eVisaConfigList = new ArrayList<>();
@@ -35,6 +39,7 @@ public class PDFUtils {
                             for (int j = 0; j < column; j++) {
                                 //获取表格中的文本内容
                                 String text = table.getText(i, j);
+                                System.out.println(text);
                                 String textVal[] = text.split(" ");
                                 for (String textStr : textVal) {
                                     if (textStr.length() >= 15 && Func.isNumeric(textStr)) {
@@ -52,14 +57,61 @@ public class PDFUtils {
         }
         return eVisaConfigList;
     }
+*/
 
-    public static void main1231(String[] args) {
-        //getPdfSignIds("https://bladex-chongqing-info.oss-cn-hangzhou.aliyuncs.com//upload/20230911/c8cab7dd0eebf9b11579223e860d0320.pdf");
+
+    public static List<String> getPdfSignIds(String pdfUrl) {
+        PdfDocument pdf = new PdfDocument();
+        List<String> eVisaConfigList = new ArrayList<>();
+        try {
+            InputStream ossInputStream = CommonUtil.getOSSInputStream(pdfUrl);
+            //加载PDF文档
+            pdf.loadFromStream(ossInputStream);
+
+            for(int i= 0;i<pdf.getPages().getCount();i++){
+                PdfPageBase page = pdf.getPages().get(i);
+                PdfTextFindCollection allText = page.findAllText();
+                PdfTextFind[] finds = allText.getFinds();
+                for(int k=0;k<finds.length;k++){
+                    String textStr = finds[k].getMatchText();
+                    if (textStr.length() >= 15 && Func.isNumeric(textStr)) {
+                        System.out.println(textStr);
+                        eVisaConfigList.add(textStr);
+                    }
+                }
+            }
+            ossInputStream.close();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return eVisaConfigList;
+    }
+
+    public static void main123(String[] args) {
+        String pdfUrl= "https://bladex-chongqing-info.oss-cn-hangzhou.aliyuncs.com//upload/20230913/0193a0611867a1828164bb0abc65584c.pdf";
         List<String> eVisaConfigList = new ArrayList<>();
-        eVisaConfigList.add("1235677");
-        eVisaConfigList.add("123567722");
-        System.out.println(eVisaConfigList.toArray());
-        System.out.println(Func.toStr(eVisaConfigList));
-        System.out.println(String.join(",", eVisaConfigList));
+        try {
+            PdfDocument pdf = new PdfDocument();
+            InputStream ossInputStream = CommonUtil.getOSSInputStream(pdfUrl);
+            //加载PDF文档
+            pdf.loadFromStream(ossInputStream);
+
+            for(int i= 0;i<pdf.getPages().getCount();i++){
+                PdfPageBase page = pdf.getPages().get(i);
+               // System.out.println( page.extractText(true));
+                String text= page.extractText(false);
+                PdfTextFindCollection allText = page.findAllText();
+                PdfTextFind[] finds = allText.getFinds();
+                for(int k=0;k<finds.length;k++){
+                    String textStr = finds[k].getMatchText();
+                    if (textStr.length() >= 15 && Func.isNumeric(textStr)) {
+                        System.out.println(textStr);
+                        eVisaConfigList.add(textStr);
+                    }
+                }
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
     }
 }

+ 17 - 13
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/AppVersionDetailController.java

@@ -12,6 +12,7 @@ import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.mp.base.BaseEntity;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.entity.AppVersion;
 import org.springblade.manager.entity.AppVersionDetail;
 import org.springblade.manager.service.IAppVersionDetailService;
@@ -36,14 +37,17 @@ public class AppVersionDetailController extends BladeController {
     @GetMapping("/getNewVersion")
     @ApiOperationSupport(order = 2)
     @ApiOperation(value = "获取最新版本", notes = "传入版本id与软件类型1安卓2IOS")
-    public R<AppVersionDetail> getNewVersion(String platform,Integer softwareType,Integer fileType){
+    public R<AppVersionDetail> getNewVersion(String platform, Integer softwareType, Integer fileType) {
         AppVersion one = versionService.getOne(new LambdaQueryWrapper<AppVersion>().eq(AppVersion::getPlatform, platform));
-        return R.data(versionDetailService.getOne(new LambdaQueryWrapper<AppVersionDetail>()
-                            .eq(AppVersionDetail::getVersionId,one.getId())
-                            .eq(AppVersionDetail::getSoftwareType,softwareType)
-                            .eq(AppVersionDetail::getFileType,fileType)
-                            .orderByDesc(AppVersionDetail::getUpdateDate)
-                            .last("limit 1")));
+        LambdaQueryWrapper<AppVersionDetail> queryWrapper = new LambdaQueryWrapper<>();
+        if (ObjectUtil.isNotEmpty(fileType)) {
+            queryWrapper.eq(AppVersionDetail::getFileType, fileType);
+        }
+        queryWrapper.eq(AppVersionDetail::getVersionId, one.getId())
+                .eq(AppVersionDetail::getSoftwareType, softwareType)
+                .orderByDesc(AppVersionDetail::getUpdateDate)
+                .last("limit 1");
+        return R.data(versionDetailService.getOne(queryWrapper));
     }
 
 
@@ -54,7 +58,7 @@ public class AppVersionDetailController extends BladeController {
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "新增", notes = "传入版本信息")
     @Transactional
-    public R add(@RequestBody AppVersionDetail detail){
+    public R add(@RequestBody AppVersionDetail detail) {
         detail.setUpdateDate(LocalDateTime.now());
         versionDetailService.save(detail);
         AppVersion appVersion = new AppVersion();
@@ -71,10 +75,10 @@ public class AppVersionDetailController extends BladeController {
     @GetMapping("/page")
     @ApiOperationSupport(order = 2)
     @ApiOperation(value = "分页", notes = "传入版本id与分页信息")
-    public R<IPage<AppVersionDetail>> page(Long versionId,Query query){
-        IPage<AppVersionDetail> page = new Page<>(query.getCurrent(),query.getSize());
+    public R<IPage<AppVersionDetail>> page(Long versionId, Query query) {
+        IPage<AppVersionDetail> page = new Page<>(query.getCurrent(), query.getSize());
         IPage<AppVersionDetail> iPage = versionDetailService.page(page,
-                new LambdaQueryWrapper<AppVersionDetail>().eq(AppVersionDetail::getVersionId,versionId).orderByDesc(BaseEntity::getCreateTime));
+                new LambdaQueryWrapper<AppVersionDetail>().eq(AppVersionDetail::getVersionId, versionId).orderByDesc(BaseEntity::getCreateTime));
         return R.data(iPage);
     }
 
@@ -84,7 +88,7 @@ public class AppVersionDetailController extends BladeController {
     @PostMapping("/update")
     @ApiOperationSupport(order = 3)
     @ApiOperation(value = "修改", notes = "传入版本详情")
-    public R update(@RequestBody AppVersionDetail detail){
+    public R update(@RequestBody AppVersionDetail detail) {
         versionDetailService.updateById(detail);
         return R.data("修改成功");
     }
@@ -95,7 +99,7 @@ public class AppVersionDetailController extends BladeController {
     @GetMapping("/delete")
     @ApiOperationSupport(order = 4)
     @ApiOperation(value = "删除", notes = "传入id")
-    public R page(Long id){
+    public R page(Long id) {
         versionDetailService.removeById(id);
         return R.data("删除成功");
     }

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

@@ -528,112 +528,101 @@ public class TextdictInfoController extends BladeController {
             throw new ServiceException("请勿重复提交,请3秒后再尝试");
         }
         JSONArray jsonArray = dataInfo.getJSONArray("dataInfo");
-        Long tableId = dataInfo.getLong("tabId"); //节点pkid
 
+        // -------- 移除所有html 的dqid -----
+        Long tableId = dataInfo.getLong("tabId"); //节点pkid
         //当前清表信息
         WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.getByPKeyId(tableId);
-
-        //获取当前项目下引用相同模板的元素表信息
-        List<WbsTreePrivate> wbsTreePrivatesEqual = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
-                .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
-                .eq(WbsTreePrivate::getExcelId, wbsTreePrivate.getExcelId()));
-//                .eq(WbsTreePrivate::getStatus, 1));
-        List<Long> pKeyIds = wbsTreePrivatesEqual.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
-        String ids = StringUtils.join(pKeyIds, ",");
-        if (StringUtils.isNotEmpty(ids)) {
-            //删除引用当前模板所有电签信息
-            String delSql = "delete from m_textdict_info where tab_id in(" + ids + ") and type in(2,6)";
-            jdbcTemplate.execute(delSql);
-        }
-
-        // 读取html页面信息
-
         InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(wbsTreePrivate.getHtmlUrl());
         String htmlString = IoUtil.readToString(inputStreamByUrl);
-
         // 样式集合
         Document doc = Jsoup.parse(htmlString);
-
         //解析
         Element table = doc.select("table").first();
         Elements trs = table.select("tr");
-
+        //解析
         Elements onlyInfo = doc.select("[:readonly]");
         if (onlyInfo != null && onlyInfo.size() >= 1) {
             for (Element element : onlyInfo) {
                 element.removeAttr(":readonly");
             }
         }
-
         Elements tryInfo = doc.select("td[dqid]");
         if (tryInfo != null && tryInfo.size() >= 1) {
             for (Element element : tryInfo) {
                 element.removeAttr("dqid");
             }
         }
-
         if (jsonArray == null || jsonArray.size() == 0) {
             return R.success("操作成功");
         }
 
-        //当前项目下引用相同清表,同步保存电签信息
-        for (Long pKeyId : pKeyIds) {
-            for (int i = 0; i < jsonArray.size(); i++) {
-                JSONObject jsonObject = jsonArray.getJSONObject(i);
-                TextdictInfo textdictInfo = new TextdictInfo();
-                String[] trtd = jsonObject.getString("colKey").split("__")[1].split("_");
-                Element element = trs.get(Integer.parseInt(trtd[0])).select("td").get(Integer.parseInt(trtd[1]));
+        //删除历史数据
+        String delSql = "delete from m_textdict_info where tab_id in(SELECT p_key_id from m_wbs_tree_contract where p_key_id!='"+tableId+"' and  project_id="+wbsTreePrivate.getProjectId()+" and excel_id="+wbsTreePrivate.getExcelId()+") and type in(2,6) and excel_id is null";
+        jdbcTemplate.execute(delSql);
 
-                String id = element.children().get(0).attr("keyname");
+        // ------- 查询数据库是否存在 该该电签信息 ---------
+        for (int i = 0; i < jsonArray.size(); i++) {
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            TextdictInfo textdictInfo = new TextdictInfo();
 
-                textdictInfo.setId(SnowFlakeUtil.getId());
-                textdictInfo.setName("电签位置配置");
-                textdictInfo.setType(jsonObject.getInteger("type"));
-                textdictInfo.setColKey(id);
-                textdictInfo.setSigRoleId(jsonObject.getString("sigRoleId"));
-
-                textdictInfo.setTabId(pKeyId.toString());
+            String[] trtd = jsonObject.getString("colKey").split("__")[1].split("_");
+            Element element = trs.get(Integer.parseInt(trtd[0])).select("td").get(Integer.parseInt(trtd[1]));
 
-                textdictInfo.setColName(jsonObject.getString("colName"));
-                textdictInfo.setSigRoleName(jsonObject.getString("sigRoleName"));
-                textdictInfo.setPyzbx(jsonObject.getDouble("pyzbx"));
-                textdictInfo.setPyzby(jsonObject.getDouble("pyzby"));
+            String id = element.children().get(0).attr("keyname");
+            if(jsonObject.containsKey("id")){
+                textdictInfo.setId(jsonObject.getLong("id"));
+            }else{
+                textdictInfo.setId(SnowFlakeUtil.getId());
                 textdictInfo.setIsDeleted(0);
-                textdictInfoService.saveOrUpdate(textdictInfo);
-
-                element.removeAttr("dqId");
-                element.attr("dqId", textdictInfo.getId() + "");
-                if (jsonObject.getInteger("type") == 2) { //个人签字 不能用户输入
-                    if (element.html().indexOf("el-tooltip") >= 0) {
-                        element.children().get(0).children().get(0).attr(":readonly", "true");
-                    } else {
-                        element.children().get(0).attr(":readonly", "true");
-                    }
+            }
+            textdictInfo.setName("电签位置配置");
+            textdictInfo.setType(jsonObject.getInteger("type"));
+            textdictInfo.setColKey(id);
+            textdictInfo.setSigRoleId(jsonObject.getString("sigRoleId"));
+
+            textdictInfo.setTabId(tableId.toString());
+            textdictInfo.setExcelId(wbsTreePrivate.getExcelId()+"");
+
+            textdictInfo.setColName(jsonObject.getString("colName"));
+            textdictInfo.setSigRoleName(jsonObject.getString("sigRoleName"));
+            textdictInfo.setPyzbx(jsonObject.getDouble("pyzbx"));
+            textdictInfo.setPyzby(jsonObject.getDouble("pyzby"));
+            textdictInfoService.saveOrUpdate(textdictInfo);
+            element.removeAttr("dqId");
+            element.attr("dqId", textdictInfo.getId() + "");
+            if (jsonObject.getInteger("type") == 2) { //个人签字 不能用户输入
+                if (element.html().indexOf("el-tooltip") >= 0) {
+                    element.children().get(0).children().get(0).attr(":readonly", "true");
+                } else {
+                    element.children().get(0).attr(":readonly", "true");
                 }
             }
         }
 
-        //写入excel
-        FileUtils.getSysLocalFileUrl();
         File writeFile = new File(wbsTreePrivate.getHtmlUrl());
         FileUtil.writeToFile(writeFile, doc.html(), Boolean.parseBoolean("UTF-8"));
 
         String str1 = wbsTreePrivate.getHtmlUrl().replace("Desktop//privateUrl", "Desktop/privateUrl");
         String replace = str1.replace("\\", "\\\\");
-        if (StringUtils.isNotEmpty(ids)) {
-            //修改所有节点的htmlUrl
-            String updateSqlP = "update m_wbs_tree_private set html_url = '" + replace + "' where p_key_id in (" + ids + ")";
-            jdbcTemplate.execute(updateSqlP);
-        }
+
+        //修改同几点的数据
+        String updateSqlP = "update m_wbs_tree_private set html_url = '" + replace + "' where p_key_id in (SELECT p_key_id from m_wbs_tree_contract where project_id="+wbsTreePrivate.getProjectId()+" and excel_id="+wbsTreePrivate.getExcelId()+")";
+        jdbcTemplate.execute(updateSqlP);
+
+        List<WbsTreePrivate> wbsTreePrivatesEqual = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                .eq(WbsTreePrivate::getExcelId, wbsTreePrivate.getExcelId()));
 
         //修改对应合同段的htmlUrl,当前项目下对应合同段的节点
         List<Long> cIdsList = wbsTreePrivatesEqual.stream().map(WbsTreePrivate::getId).distinct().collect(Collectors.toList());
+
         List<Long> cPkeyIds = wbsTreeContractService.getBaseMapper().selectList(Wrappers.<WbsTreeContract>lambdaQuery()
                 .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
                 .eq(WbsTreeContract::getExcelId, wbsTreePrivate.getExcelId())
-//                .eq(WbsTreeContract::getStatus, 1)
                 .in(WbsTreeContract::getId, cIdsList)).stream().map(WbsTreeContract::getPKeyId).collect(Collectors.toList());
         String cPkeyIdsStr = StringUtils.join(cPkeyIds, ",");
+
         if (StringUtils.isNotEmpty(cPkeyIdsStr)) {
             String updateSqlC = "update m_wbs_tree_contract set html_url = '" + replace + "' where p_key_id in (" + cPkeyIdsStr + ")";
             jdbcTemplate.execute(updateSqlC);
@@ -646,7 +635,7 @@ public class TextdictInfoController extends BladeController {
     }
 
     /**
-     * 保存电签
+     * 保存默认值
      */
     @PostMapping("/save_defaulVal")
     @ApiOperationSupport(order = 7)

+ 5 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/TextdictInfoMapper.xml

@@ -16,15 +16,17 @@
         <result column="sig_role_name" property="sigRoleName"/>
         <result column="pyzbx" property="pyzbx"/>
         <result column="pyzby" property="pyzby"/>
+        <result column="pyzby" property="pyzby"/>
+        <result column="excel_id" property="excelId"/>
     </resultMap>
 
     <select id="selectTextdictInfoPage" resultMap="textdictInfoResultMap">
-        select * from m_textdict_info where is_deleted = 0 and tab_id=#{param2.tabId}
+        select distinct * from m_textdict_info where is_deleted = 0
         <if test="param2.type== 2 ">
-            and type in('2','6')
+            and type in('2','6')    and (excel_id=#{param2.excelId} or tab_id=#{param2.tabId})
         </if>
         <if test="param2.type!= 2 ">
-            and type =#{param2.type}
+            and type =#{param2.type} and tab_id=#{param2.tabId}
         </if>
     </select>
 

+ 28 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -15,17 +15,19 @@ import com.mixsmart.utils.FormulaUtils;
 import com.mixsmart.utils.ListUtils;
 import com.mixsmart.utils.RegexUtils;
 import com.spire.xls.FileFormat;
-import com.spire.xls.Worksheet;
 import lombok.AllArgsConstructor;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang3.ObjectUtils;
+import org.apache.poi.hssf.usermodel.HSSFRichTextString;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.usermodel.Font;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.util.IOUtils;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
@@ -1403,7 +1405,16 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
         //获取excel流 和 html流
         InputStream exceInp = CommonUtil.getOSSInputStream(excelTab.getFileUrl());
-        Workbook workbook = WorkbookFactory.create(exceInp);
+
+        Workbook workbook=null;
+        int index = excelTab.getFileUrl().lastIndexOf(".");
+        String suffix = excelTab.getFileUrl().substring(index);
+
+        if (".xls".equals(suffix)) {
+            workbook = new HSSFWorkbook(exceInp);
+        } else if (".xlsx".equals(suffix)) {
+            workbook = new XSSFWorkbook(exceInp);
+        }
 
         //获取工作表
         Sheet sheet = workbook.getSheetAt(0);
@@ -1633,12 +1644,21 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                 redFont.setColor(IndexedColors.WHITE.getIndex()); //设置字体颜色
                                 redFont.setFontHeightInPoints(Short.valueOf("1"));//设置字体大小
                                 redFont.setFontName(oldfontAt.getFontName());//设置字体
-                                CellStyle newStyle = workbook.createCellStyle(); //创建单元格样式
-                                newStyle.cloneStyleFrom(cell.getCellStyle());
-                                newStyle.setFont(redFont);
-                                newStyle.setShrinkToFit(true);
-                                cell.setCellStyle(newStyle);
-                                cell.setCellValue(dqid);
+                                String CellValue = cell.getStringCellValue().trim();
+
+                               /* if(CellValue!=null && StringUtils.isNotEmpty(CellValue)){
+                                    RichTextString ts= new HSSFRichTextString(CellValue + "--"+dqid);
+                                   // ts.applyFont(0,CellValue.length(),oldfontAt);
+                                 //   ts.applyFont(10,ts.length(),redFont);
+                                    cell.setCellValue(ts);
+                                }else{*/
+                                    CellStyle newStyle = workbook.createCellStyle(); //创建单元格样式
+                                    newStyle.cloneStyleFrom(cell.getCellStyle());
+                                    newStyle.setFont(redFont);
+                                    newStyle.setShrinkToFit(true);
+                                    cell.setCellStyle(newStyle);
+                                    cell.setCellValue(dqid);
+                              //  }
                             }
                         }
                     }

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

@@ -384,6 +384,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             updateWrapper1
                     .eq(WbsTreePrivate::getPKeyId, pKeyId)
                     .set(WbsTreePrivate::getStatus, wbsTreePrivate.getStatus());
+            Integer statusPrivate = wbsTreePrivate.getStatus();
             baseMapper.update(null, updateWrapper1);
 
             //修改当前项目下所有合同段的该表状态
@@ -394,11 +395,10 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             );
             if (wbsTreeContracts.size() > 0) {
                 for (WbsTreeContract wbsTreeContract : wbsTreeContracts) {
-                    wbsTreeContract.setStatus(wbsTreeContract.getStatus() == 1 ? 0 : 1);
                     LambdaUpdateWrapper<WbsTreeContract> updateWrapper2 = new LambdaUpdateWrapper<>();
                     updateWrapper2
                             .eq(WbsTreeContract::getPKeyId, wbsTreeContract.getPKeyId())
-                            .set(WbsTreeContract::getStatus, wbsTreeContract.getStatus());
+                            .set(WbsTreeContract::getStatus, statusPrivate);
                     wbsTreeContractMapper.update(null, updateWrapper2);
                 }
             }

+ 0 - 65
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ExcelInfoUtils.java

@@ -9,7 +9,6 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.WorkbookFactory;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
@@ -32,70 +31,6 @@ import java.util.Map;
 
 public class ExcelInfoUtils {
 
-    public static void main1234(String[] args) throws Exception {
-        String fileUrl = "/Users/hongchuangyanfa/Downloads/29ed5438d62d301bf290b908acf3bdbb.xlsx";
-        InputStream exceInp = new FileInputStream(new File(fileUrl));
-
-        org.apache.poi.ss.usermodel.Workbook workbook = WorkbookFactory.create(exceInp);
-
-        //获取工作表
-        Sheet sheet = workbook.getSheetAt(0);
-        sheet.setForceFormulaRecalculation(true);
-
-        Row row = sheet.getRow(34);
-
-        Cell cell = sheet.getRow(34).getCell(1);
-
-        System.out.println(cell.getStringCellValue());
-        // 解析原始excel
-        Workbook wb = new Workbook();
-        wb.loadFromMHtml(fileUrl);
-        Worksheet sheet2 = wb.getWorksheets().get(0);
-
-        CellRange cellRange = sheet2.getCellRange(35, 2);
-        System.out.println(cellRange.getText());
-
-        //sheet.saveToHtml("/Users/hongchuangyanfa/Desktop/pdf/test.html");
-    }
-
-    public static void main123(String[] args) throws FileNotFoundException {
-        String excelUrl = "/Users/hongchuangyanfa/Downloads/C10.28隧道注浆施工记录表(1).xlsx";
-        String old_html = "/Users/hongchuangyanfa/Desktop/pdf/old_html.html";
-        String old_xlsx = "/Users/hongchuangyanfa/Desktop/pdf/old_html.xlsx";
-        File file = new File(excelUrl);
-        InputStream fileInputStream = new FileInputStream(file);
-      //  excelInfo(fileInputStream,old_xlsx,old_html,"1");
-
-
-        // 解析原始excel
-        Workbook wb = new Workbook();
-        wb.loadFromMHtml(excelUrl);
-        Worksheet sheet = wb.getWorksheets().get(0);
-
-        CellRange[] mergedCells = sheet.getCells();
-        for(int i=0;i<mergedCells.length;i++){
-            CellRange oldcell =mergedCells[i];
-           // sheet.get(oldcell.getRow(),oldcell.getColumn()).getDataValidation().setErrorMessage("");
-          //  sheet.get(oldcell.getRow(),oldcell.getColumn(),oldcell.getLastRow(),oldcell.getLastColumn()).getDataValidation().setErrorMessage("");
-            oldcell.getDataValidation().setErrorMessage("");
-        }
-
-        CellRange[] mergedCells1 = sheet.getMergedCells();
-        for(int i=0;i<mergedCells1.length;i++) {
-            CellRange oldcell = mergedCells1[i];
-            oldcell.getDataValidation().setErrorMessage(i+"");
-        }
-
-        CellRange[] cells = sheet.getCells();
-        for(int i=0;i< cells.length;i++){
-            CellRange oldcell = cells[i];
-            System.out.println(oldcell.getRow()+"---"+oldcell.getColumn()+"---="+oldcell.getText()+"---x="+oldcell.getDataValidation().getErrorMessage());
-        }
-
-        String new_html = "/Users/hongchuangyanfa/Desktop/pdf/new_html.html";
-        String new_xlsx = "/Users/hongchuangyanfa/Desktop/pdf/new_html.xlsx";
-       // excelInfo(old_xlsx,new_xlsx,new_html);
-    }
 
     public static void excelInfo(InputStream inputStream, String excelURL, String htmlUrl,String type) {
         try {

+ 45 - 13
blade-service/blade-system/src/main/java/org/springblade/system/controller/MenuController.java

@@ -231,6 +231,9 @@ public class MenuController extends BladeController {
         List<TreeNodeVO> treeMenuArchives = new ArrayList<>(); //档案
         List<TreeNodeVO> treeMenuHac = new ArrayList<>(); //内控系统
         List<TreeNodeVO> treeMenuLar = new ArrayList<>(); //征拆系统
+        List<TreeNodeVO> treeMenuMeasure = new ArrayList<>(); //计量
+        List<TreeNodeVO> treeMenuSecure = new ArrayList<>(); //安全
+
         //获取所有菜单
         List<TreeNodeVO> treeNodesAll = menuService.grantTree(user);
         //获取AuthClient
@@ -258,17 +261,29 @@ public class MenuController extends BladeController {
                         }
                     }
                     if (("hac").equals(authClient.getClientId())) {
-                        //档案
+                        //内控
                         if (treeNode.getSysId().equals(authClient.getId())) {
                             treeMenuHac.add(treeNode);
                         }
                     }
                     if (("lar").equals(authClient.getClientId())) {
-                        //档案
+                        //征拆
                         if (treeNode.getSysId().equals(authClient.getId())) {
                             treeMenuLar.add(treeNode);
                         }
                     }
+                    if (("measure").equals(authClient.getClientId())) {
+                        //计量
+                        if (treeNode.getSysId().equals(authClient.getId())) {
+                            treeMenuMeasure.add(treeNode);
+                        }
+                    }
+                    if (("secure").equals(authClient.getClientId())) {
+                        //安全
+                        if (treeNode.getSysId().equals(authClient.getId())) {
+                            treeMenuSecure.add(treeNode);
+                        }
+                    }
                     //TODO 其他菜单权限
                 }
             }
@@ -291,6 +306,10 @@ public class MenuController extends BladeController {
         //表单
         List<DictVO02> ownerType = dictService.getList2("owner_type");
         vo.setTableOwners(ownerType);
+        //计量
+        vo.setMeasureMenu(treeMenuMeasure);
+        //安全
+        vo.setSecureMenu(treeMenuSecure);
 
         return R.data(vo);
     }
@@ -309,25 +328,38 @@ public class MenuController extends BladeController {
         //客户端
         vo.setUsermenu(menuService.roleTreeKeys(roleIds));
 
+        //表单
+        List<WbsTableOwnerRole> wbsTableOwnerRoles = roleMapper.selectRoleAndTableOwnerListByRoleId(Long.valueOf(roleIds));
+        List<String> collect = wbsTableOwnerRoles.stream().map(WbsTableOwnerRole::getTableOwnerNumber).collect(Collectors.toList());
+        vo.setTableOwners(collect);
+
         //档案
         vo.setArchivesMenu(menuService.roleTreeKeys(roleIds));
 
-        //数据源
-        vo.setDataScope(menuService.dataScopeTreeKeys(roleIds));
+        //内控系统
+        vo.setHacMenu(menuService.roleTreeKeys(roleIds));
 
-        //接口
-        vo.setApiScope(menuService.apiScopeTreeKeys(roleIds));
+        //征拆系统
+        vo.setLarMenu(menuService.roleTreeKeys(roleIds));
 
-        // 内控系统
-        vo.setHacMenu(menuService.apiScopeTreeKeys(roleIds));
+        //计量系统
+        vo.setMeasureMenu(menuService.roleTreeKeys(roleIds));
+
+        //安全系统
+        vo.setSecureMenu(menuService.roleTreeKeys(roleIds));
 
+        /*不清楚为什么其他开发要用menuService.apiScopeTreeKeys(roleIds)
+         * 现在把内控、征拆改为menuService.roleTreeKeys(roleIds)*/
+        /*//内控系统
+        vo.setHacMenu(menuService.apiScopeTreeKeys(roleIds));
         //征拆系统
-        vo.setLarMenu(menuService.apiScopeTreeKeys(roleIds));
+        vo.setLarMenu(menuService.apiScopeTreeKeys(roleIds));*/
 
-        //表单
-        List<WbsTableOwnerRole> wbsTableOwnerRoles = roleMapper.selectRoleAndTableOwnerListByRoleId(Long.valueOf(roleIds));
-        List<String> collect = wbsTableOwnerRoles.stream().map(WbsTableOwnerRole::getTableOwnerNumber).collect(Collectors.toList());
-        vo.setTableOwners(collect);
+        /*暂时没有使用到下面的数据源、接口菜单*/
+        /*//数据源
+        vo.setDataScope(menuService.dataScopeTreeKeys(roleIds));
+        //接口
+        vo.setApiScope(menuService.apiScopeTreeKeys(roleIds));*/
 
         return R.data(vo);
     }

+ 7 - 1
blade-service/blade-system/src/main/java/org/springblade/system/controller/RoleController.java

@@ -187,7 +187,13 @@ public class RoleController extends BladeController {
     public R grant(@RequestBody GrantVO grantVO) {
         CacheUtil.clear(SYS_CACHE);
         CacheUtil.clear(SYS_CACHE, Boolean.FALSE);
-        boolean temp = roleService.grant(grantVO.getRoleIds(), grantVO.getMenuIds(), grantVO.getMenuClientIds(), grantVO.getDataScopeIds(), grantVO.getApiScopeIds(), grantVO.getTableOwners(), grantVO.getMenuArchivesIds(), grantVO.getMenuHacIds(), grantVO.getMenularIds());
+        boolean temp = roleService.grant(grantVO.getRoleIds()
+                , grantVO.getMenuIds(), grantVO.getMenuClientIds()
+                , grantVO.getDataScopeIds(), grantVO.getApiScopeIds()
+                , grantVO.getTableOwners(), grantVO.getMenuArchivesIds()
+                , grantVO.getMenuHacIds(), grantVO.getMenularIds()
+                , grantVO.getMenuMeasureIds(), grantVO.getMenuSecureIds()
+        );
         return R.status(temp);
     }
 

+ 18 - 8
blade-service/blade-system/src/main/java/org/springblade/system/service/IRoleService.java

@@ -56,15 +56,25 @@ public interface IRoleService extends IService<Role> {
     /**
      * 权限配置
      *
-     * @param roleIds       角色id集合
-     * @param menuIds       菜单id集合
-     * @param menuClientIds 客户端菜单id集合
-     * @param tableOwners   表单id集合
-     * @param dataScopeIds  数据权限id集合
-     * @param apiScopeIds   接口权限id集合
-     * @return 是否成功
+     * @param roleIds
+     * @param menuIds
+     * @param menuClientIds
+     * @param dataScopeIds
+     * @param apiScopeIds
+     * @param tableOwners
+     * @param menuArchivesIds
+     * @param menuHacIds
+     * @param menuLarIds
+     * @param menuMeasureIds
+     * @param menuSecureIds
+     * @return
      */
-    boolean grant(@NotEmpty List<Long> roleIds, List<String> menuIds, List<String> menuClientIds, List<Long> dataScopeIds, List<Long> apiScopeIds, List<Long> tableOwners, List<String> menuArchivesIds, List<String> menuHacIds, List<String> menuLarIds);
+    boolean grant(@NotEmpty List<Long> roleIds, List<String> menuIds, List<String> menuClientIds
+            , List<Long> dataScopeIds, List<Long> apiScopeIds
+            , List<Long> tableOwners, List<String> menuArchivesIds
+            , List<String> menuHacIds, List<String> menuLarIds
+            , List<String> menuMeasureIds, List<String> menuSecureIds
+    );
 
     /**
      * 获取角色ID

+ 47 - 6
blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java

@@ -87,11 +87,23 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean grant(@NotEmpty List<Long> roleIds, List<String> menuIds, List<String> menuClientIds, List<Long> dataScopeIds, List<Long> apiScopeIds, List<Long> tableOwners, List<String> menuArchivesIds, List<String> menuHacIds, List<String> menuLarIds) {
-        return grantRoleMenu(roleIds, menuIds, menuClientIds, menuArchivesIds, menuHacIds, menuLarIds) && grantDataScope(roleIds, dataScopeIds) && grantApiScope(roleIds, apiScopeIds) && submitRoleAndTableOwner(roleIds, tableOwners);
+    public boolean grant(@NotEmpty List<Long> roleIds, List<String> menuIds, List<String> menuClientIds
+            , List<Long> dataScopeIds, List<Long> apiScopeIds
+            , List<Long> tableOwners, List<String> menuArchivesIds
+            , List<String> menuHacIds, List<String> menuLarIds
+            , List<String> menuMeasureIds, List<String> menuSecureIds) {
+
+        return grantRoleMenu(roleIds, menuIds, menuClientIds, menuArchivesIds, menuHacIds, menuLarIds, menuMeasureIds, menuSecureIds)
+                && grantDataScope(roleIds, dataScopeIds)
+                && grantApiScope(roleIds, apiScopeIds)
+                && submitRoleAndTableOwner(roleIds, tableOwners);
     }
 
-    private boolean grantRoleMenu(List<Long> roleIds, List<String> menuIds, List<String> menuClientIds, List<String> menuArchivesIds, List<String> menuHacIds, List<String> menuLarIds) {
+    private boolean grantRoleMenu(List<Long> roleIds
+            , List<String> menuIds, List<String> menuClientIds, List<String> menuArchivesIds
+            , List<String> menuHacIds, List<String> menuLarIds
+            , List<String> menuMeasureIds, List<String> menuSecureIds
+    ) {
         // 防止越权配置超管角色
         Long administratorCount = baseMapper.selectCount(Wrappers.<Role>query().lambda().eq(Role::getRoleAlias, RoleConstant.ADMINISTRATOR).in(Role::getId, roleIds));
         if (!AuthUtil.isAdministrator() && administratorCount > 0L) {
@@ -156,9 +168,32 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
                 roleMenus.add(roleMenu);
             }));
         }
+
+        // 组装配置-计量
+        if (menuMeasureIds != null && menuMeasureIds.size() >= 1) {
+            roleIds.forEach(roleId -> menuMeasureIds.forEach(menuIdC -> {
+                RoleMenu roleMenu = new RoleMenu();
+                roleMenu.setRoleId(roleId);
+                roleMenu.setMenuId(Long.valueOf(menuIdC.split("---")[0]));
+                roleMenu.setStatus(menuIdC.split("---")[1]);
+                roleMenus.add(roleMenu);
+            }));
+        }
+
+        // 组装配置-安全
+        if (menuSecureIds != null && menuSecureIds.size() >= 1) {
+            roleIds.forEach(roleId -> menuSecureIds.forEach(menuIdC -> {
+                RoleMenu roleMenu = new RoleMenu();
+                roleMenu.setRoleId(roleId);
+                roleMenu.setMenuId(Long.valueOf(menuIdC.split("---")[0]));
+                roleMenu.setStatus(menuIdC.split("---")[1]);
+                roleMenus.add(roleMenu);
+            }));
+        }
+
         // 新增配置
-        boolean b = roleMenuService.saveBatch(roleMenus);
-        System.out.println("ddd");
+        roleMenuService.saveBatch(roleMenus);
+
         // 递归设置下属角色菜单集合
         if (menuIds != null && menuIds.size() >= 1) {
             recursionRoleMenu(roleIds, menuIds);
@@ -175,6 +210,12 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
         if (menuLarIds != null && menuLarIds.size() >= 1) {
             recursionRoleMenu(roleIds, menuLarIds); //征拆
         }
+        if (menuMeasureIds != null && menuMeasureIds.size() >= 1) {
+            recursionRoleMenu(roleIds, menuMeasureIds); //计量
+        }
+        if (menuSecureIds != null && menuSecureIds.size() >= 1) {
+            recursionRoleMenu(roleIds, menuSecureIds); //安全
+        }
 
         return true;
     }
@@ -187,7 +228,7 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
             String id = split[0]; //id
             menuIds.add(Long.valueOf(id));
         }
-        //
+
         for (Long roleId : roleIds) {
             List<Role> roleList = roleMapper.getRoleDeptInfoByParentId(roleId + "");
             roleList.forEach(role -> {