ソースを参照

Merge remote-tracking branch 'origin/master'

liuyc 1 年間 前
コミット
0d7bef27db
34 ファイル変更802 行追加252 行削除
  1. 3 3
      blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java
  2. 3 2
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/BusinessTaskFailedDTO.java
  3. 5 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskApprovalVO.java
  4. 2 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/TreeNode.java
  5. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreeContract.java
  6. 3 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveAutoPdfService.java
  7. 25 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java
  8. 6 6
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  9. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ContractTreeDrawingsController.java
  10. 70 53
      blade-service/blade-business/src/main/java/org/springblade/business/controller/EVisaTaskCheckController.java
  11. 81 24
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  12. 18 7
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  13. 4 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskBatchMapper.java
  14. 4 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskBatchMapper.xml
  15. 3 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITaskBatchService.java
  16. 7 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskBatchServiceImpl.java
  17. 21 5
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  18. 99 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVisaController.java
  19. 162 100
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java
  20. 52 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/FileUtils.java
  21. 21 0
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java
  22. 7 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  23. 30 14
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java
  24. 7 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java
  25. 110 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java
  26. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/TextdictInfoMapper.java
  27. 7 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/TextdictInfoMapper.xml
  28. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  29. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java
  30. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  31. 26 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/TextdictInfoServiceImpl.java
  32. 0 9
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java
  33. 12 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ExcelInfoUtils.java
  34. 1 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ExcelInfoUtils2.java

+ 3 - 3
blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java

@@ -504,7 +504,7 @@ public class CommonUtil {
     }
 
     public static String replaceOssUrl(String url) {
-       /* String osName = System.getProperty("os.name");
+      /*  String osName = System.getProperty("os.name");
         if (osName != null && osName.toLowerCase().contains("linux")) {
             // 如果当前操作系统是Linux系统
             Map<String, String> envMap = System.getenv();
@@ -512,9 +512,9 @@ public class CommonUtil {
                 // 如果当前环境变量不包含linuxtesttest,则替换URL中的oss路径
                 url = url.replace("oss-cn-hangzhou.aliyuncs.com", "oss-cn-hangzhou-internal.aliyuncs.com");
             }
-        }
+        }*/
         //后续删除
-        System.out.println("replaceOssUrl " + url);*/
+        System.out.println("replaceOssUrl " + url);
         return url;
     }
 

+ 3 - 2
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/BusinessTaskFailedDTO.java

@@ -17,8 +17,8 @@ public class BusinessTaskFailedDTO implements Serializable {
     @ApiModelProperty(value = "合同段id")
     private String contractId;
 
-    @ApiModelProperty(value = "电签状态")
-    private String eVisaStatus;
+    @ApiModelProperty(value = "电签状态1电签失败2电签成功,默认显示失败")
+    private Integer visaStatus;
 
     @ApiModelProperty(value = "开始时间")
     private String startTimeValue;
@@ -35,4 +35,5 @@ public class BusinessTaskFailedDTO implements Serializable {
     @ApiModelProperty(value = "当前页码")
     private Integer current;
 
+
 }

+ 5 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskApprovalVO.java

@@ -9,6 +9,8 @@ import java.util.List;
 @Data
 public class TaskApprovalVO {
 
+    @ApiModelProperty("id")
+    private String id;
     /**
      * 待审批列表中(TaskVO)对应的taskId字段值
      */
@@ -45,6 +47,9 @@ public class TaskApprovalVO {
     @ApiModelProperty("重签对应的原始签字人名")
     private String ysNickName;
 
+    @ApiModelProperty("电签类型")
+    private String remarkType;
+
     @ApiModelProperty("附件信息")
     private List<ApprovalFile> approvalFileList = new ArrayList<>();
 

+ 2 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/TreeNode.java

@@ -14,7 +14,8 @@ public class TreeNode<T> {
        private Long id;
        private Long parentId;
        private T value;
-       private List<T> children=new ArrayList<>();
+       private String name;
+       private List<TreeNode<T>> children=new ArrayList<>();
        public boolean hasChildren(){
           return !children.isEmpty();
        }

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

@@ -270,4 +270,10 @@ public class WbsTreeContract extends BaseEntity {
     @ApiModelProperty(value = "实际填报率")
     private Integer realFillRate;
 
+    /**
+     * 查询索引
+     */
+    @ApiModelProperty(value = "查询索引")
+    private String treeCode;
+
 }

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

@@ -14,7 +14,7 @@ public interface IArchiveAutoPdfService {
     public void test1();
 
     //生成四要素,信息会写入archivesAuto
-    void buildArchiveFrontPdfs(Long projectId, ArchivesAuto archivesAuto, List<ArchiveFile> archiveFileList);
+    void buildArchiveFrontPdfs(Long projectId, ArchivesAuto archivesAuto, List<ArchiveFile> archiveFileList,boolean bBuildFront );
 
     //打码,信息写入waitArchiveFiles
     void builtFilePageNo(ArchivesAuto archivesAuto, List<ArchiveFile> waitArchiveFiles);
@@ -27,6 +27,8 @@ public interface IArchiveAutoPdfService {
 
     //只刷新档号
     boolean refreshFileNumber(ArchivesAuto archive, String fileNumber);
+    //强制刷新档号
+    boolean refreshFileNumberForce(ArchivesAuto archive,String fileNumber);
 
     //合并pdf
     String MergePdfAndUpload(List<String> urlList, String fileName, String filePath, Long projectId);

+ 25 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java

@@ -210,7 +210,7 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
         for (int i = 0; i < 20;i++) {
             archiveFiles.add(archiveFile);
         }
-        buildArchiveFrontPdfs(projectId,archivesAuto,archiveFiles);
+        buildArchiveFrontPdfs(projectId,archivesAuto,archiveFiles,true);
     }
 
 
@@ -220,7 +220,12 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
      * @param archivesAuto, 会更新起始时间和结束时间,所以调用后要更新
      * @param archiveFileList
      */
-    public void buildArchiveFrontPdfs(Long projectId, ArchivesAuto archivesAuto,List<ArchiveFile> archiveFileList) {
+    public void buildArchiveFrontPdfs(Long projectId, ArchivesAuto archivesAuto,List<ArchiveFile> archiveFileList,
+                                      boolean bBuildFront) {
+
+        if (bBuildFront == false) {
+            return;
+        }
         // 调用 getByProjectIdOrNew 方法获取 ArchiveProjectConfig 对象,并从中取得 factorType 的值
         ArchiveProjectConfig config = archiveProjectConfigService.getByProjectIdOrNew(projectId);
 
@@ -824,7 +829,24 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
 
         List<ArchiveFile> archiveFiles = archiveFileClient.getArchiveFileByArchiveID(archive.getId());
 
-        buildArchiveFrontPdfs(projectId,archive,archiveFiles);
+        buildArchiveFrontPdfs(projectId,archive,archiveFiles,true);
+
+        return true;
+    }
+
+    /**
+     * 刷新档号
+     * @param archive
+     * @param fileNumber
+     */
+    public boolean refreshFileNumberForce(ArchivesAuto archive,String fileNumber) {
+        //没变化则不用刷新,强制刷新
+        Long projectId = archive.getProjectId();
+        archive.setFileNumber(fileNumber);
+
+        List<ArchiveFile> archiveFiles = archiveFileClient.getArchiveFileByArchiveID(archive.getId());
+
+        buildArchiveFrontPdfs(projectId,archive,archiveFiles,true);
 
         return true;
     }

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

@@ -1108,7 +1108,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		Long archivesAutoId = archivesAuto.getId();
 
 		//封面和生成文件页码
-		archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles);
+		archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles,false);
 
 		builtFilePageNo(archivesAuto,waitArchiveFiles);//生成文件页码
 
@@ -1163,7 +1163,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		ArchivesAuto archivesAuto = builtArchives(node,pageN,fileN,startDate,endDate,archiveName);
 
 		//2.生成文件页码
-		archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles);
+		archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles,false);
 
 		builtFilePageNo(archivesAuto,waitArchiveFiles);
 
@@ -1211,7 +1211,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		ArchivesAuto archivesAuto = builtArchives(node,pageN,fileN,startDate,endDate,archiveName);
 
 		//2.封面和生成文件页码
-		archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles);
+		archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles,false);
 
 		builtFilePageNo(archivesAuto,waitArchiveFiles);
 
@@ -1266,7 +1266,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		ArchivesAuto archivesAuto = builtArchives(node,pageN,fileN,startDate,endDate,boxName);
 
 		//2.封面和生成文件页码
-		archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles);
+		archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles,false);
 
 		builtFilePageNo(archivesAuto,waitArchiveFiles);
 
@@ -1726,7 +1726,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 				}
 
 				String fileNumber = fileNumberPrefix +"_"+ index;
-				if (archiveAutoPdfService.refreshFileNumber(archivesAuto,fileNumber)){
+				if (archiveAutoPdfService.refreshFileNumberForce(archivesAuto,fileNumber)){
 					changeList.add(archivesAuto);
 				}
 				index++;
@@ -1927,7 +1927,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			Long archivesAutoId = archivesAuto.getId();
 
 			//封面和生成文件页码
-			archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles);
+			archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(),archivesAuto,waitArchiveFiles,true);
 
 			builtFilePageNo(archivesAuto,waitArchiveFiles);//生成文件页码
 

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/controller/ContractTreeDrawingsController.java

@@ -62,7 +62,7 @@ public class ContractTreeDrawingsController extends BladeController {
             @ApiImplicitParam(name = "fileUrl", value = "文件url", required = true),
             @ApiImplicitParam(name = "id", value = "节点的drawingsId")
     })
-    public R<String> saveOrUpdateContractTreeDrawings(@RequestParam String primaryKeyId, @RequestParam String fileUrl, @RequestParam String id) {
+    public R<String> saveOrUpdateContractTreeDrawings(@RequestParam String primaryKeyId, @RequestParam String fileUrl,String id) {
         //当前提交用户
         BladeUser user = AuthUtil.getUser();
         if (!"-1".equals(id) && StringUtils.isNotEmpty(id)) {

+ 70 - 53
blade-service/blade-business/src/main/java/org/springblade/business/controller/EVisaTaskCheckController.java

@@ -64,6 +64,8 @@ public class EVisaTaskCheckController {
 
     private final JdbcTemplate jdbcTemplate;
 
+    private final ProjectClient projectClient;
+
 
     /**
      * 检查所选的流程环节处理人是否具有审批权限(三大填报页、日志列表的批量上报、首件列表的批量上报)
@@ -83,36 +85,36 @@ public class EVisaTaskCheckController {
         if (json.containsKey("customFlowUserList") && !json.getJSONArray("customFlowUserList").isEmpty()) {
             //获取对应表格的所有电签配置
             String tableOwner = json.getString("tableOwner");
-            if (StringUtils.isBlank(tableOwner)){
+            if (StringUtils.isBlank(tableOwner)) {
                 tableOwner = json.getString("classifyType");
             }
             //查询当前节点的PDF
             InformationQuery node = informationQueryService.getOne(new LambdaQueryWrapper<InformationQuery>()
-                    .eq(InformationQuery::getWbsId,json.getString("nodeId"))
-                    .eq(InformationQuery::getClassify,tableOwner));
+                    .eq(InformationQuery::getWbsId, json.getString("nodeId"))
+                    .eq(InformationQuery::getClassify, tableOwner));
 
-            if (node == null || StringUtils.isBlank(node.getPdfUrl())){
-                return  R.fail(300, "当前节点还未生成PDF,不能上报");
+            if (node == null || StringUtils.isBlank(node.getPdfUrl())) {
+                return R.fail(300, "当前节点还未生成PDF,不能上报");
             }
             //获取审批人
             List<Long> customFlowUserList = json.getJSONArray("customFlowUserList").toJavaList(Long.class);
             //获取这些审批人在资料合同段的权限
-            List<JSONObject> userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(customFlowUserList, node.getContractId()+"");
+            List<JSONObject> userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(customFlowUserList, node.getContractId() + "");
             if (userRoleList == null || userRoleList.size() <= 0) {
                 //查看项目下是否有监理合同段关联资料合同段
                 Long contractId = jdbcTemplate.queryForObject("SELECT id from m_contract_info mci WHERE contract_type = 2 \n" +
-                        "and id in (SELECT contract_id_jlyz  FROM m_contract_relation_jlyz WHERE contract_id_sg = " + node.getContractId()+")",Long.class);
+                        "and id in (SELECT contract_id_jlyz  FROM m_contract_relation_jlyz WHERE contract_id_sg = " + node.getContractId() + ")", Long.class);
                 if (contractId == null) {
                     return R.data(300, false, "所选审批人均未找到当前表格所需要的签字岗位,请联系服务人员处理");
                 }
-                userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(customFlowUserList, contractId+"");
-                if (userRoleList == null || userRoleList.size() <= 0){
+                userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(customFlowUserList, contractId + "");
+                if (userRoleList == null || userRoleList.size() <= 0) {
                     return R.data(300, false, "所选审批人均未找到当前表格所需要的签字岗位,请联系服务人员处理");
                 }
             }
 
             //获取电签配置
-            List<JSONObject> jsonList = this.queryTableEVisaConfig(json,node.getPdfUrl());
+            List<JSONObject> jsonList = this.queryTableEVisaConfig(json, node.getPdfUrl());
             if (jsonList == null) {
                 return R.data(300, false, "未找到符合电签配置的相关流程,请重新保存后上报");
             }
@@ -161,35 +163,35 @@ public class EVisaTaskCheckController {
             //获取审批人
             List<Long> customFlowUserList = json.getJSONArray("customFlowUserList").toJavaList(Long.class);
             //获取电签配置,先获取所有节点的infoIds
-            List<Long> list = Func.toLongList( json.getString("infoIds"));
-            if (list == null || list.size() <= 0){
-                return R.fail( "请选择一条数据");
+            List<Long> list = Func.toLongList(json.getString("infoIds"));
+            if (list == null || list.size() <= 0) {
+                return R.fail("请选择一条数据");
             }
             List<InformationQuery> infoList = informationQueryService.list(new LambdaQueryWrapper<InformationQuery>()
                     .in(InformationQuery::getId, list));
-            if (infoList == null || infoList.size() <= 0){
+            if (infoList == null || infoList.size() <= 0) {
                 return R.fail("没有获取到当前所有资料的上报信息");
             }
             //获取这些审批人在资料合同段的权限
-            List<JSONObject> userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(customFlowUserList, infoList.get(0).getContractId()+"");
+            List<JSONObject> userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(customFlowUserList, infoList.get(0).getContractId() + "");
             if (userRoleList == null || userRoleList.size() <= 0) {
                 //查看当前项目下是否有监理合同段关联资料合同段
                 Long contractId = jdbcTemplate.queryForObject("SELECT id from m_contract_info mci WHERE contract_type = 2 \n" +
-                        "and id in (SELECT contract_id_jlyz  FROM m_contract_relation_jlyz WHERE contract_id_sg = " + json.getString("contractId")+")",Long.class);
+                        "and id in (SELECT contract_id_jlyz  FROM m_contract_relation_jlyz WHERE contract_id_sg = " + json.getString("contractId") + ")", Long.class);
                 if (contractId == null) {
-                    return R.fail( "所选审批人均未找到当前表格所需要的签字岗位,请联系服务人员处理");
+                    return R.fail("所选审批人均未找到当前表格所需要的签字岗位,请联系服务人员处理");
                 }
-                userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(customFlowUserList, contractId+"");
-                if (userRoleList == null || userRoleList.size() <= 0){
+                userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(customFlowUserList, contractId + "");
+                if (userRoleList == null || userRoleList.size() <= 0) {
                     return R.fail("所选审批人均未找到当前表格所需要的签字岗位,请联系服务人员处理");
                 }
             }
 
             Map<String, Set<String>> userNameFail = new HashMap<>();
             for (InformationQuery info : infoList) {
-                List<JSONObject> jsonList = this.queryTableEVisaConfig(json,info.getPdfUrl());
+                List<JSONObject> jsonList = this.queryTableEVisaConfig(json, info.getPdfUrl());
                 if (jsonList == null || jsonList.size() <= 0) {
-                    return R.fail( info.getName() + ":未找到电签配置");
+                    return R.fail(info.getName() + ":未找到电签配置");
                 }
 
                 //汇总电签配置的审批角色
@@ -255,18 +257,18 @@ public class EVisaTaskCheckController {
 
         //获取对应表格的所有电签配置
         String tableOwner = json.getString("tableOwner");
-        if (StringUtils.isBlank(tableOwner)){
+        if (StringUtils.isBlank(tableOwner)) {
             tableOwner = json.getString("classifyType");
         }
         //查询当前节点的PDF
         InformationQuery node = informationQueryService.getOne(new LambdaQueryWrapper<InformationQuery>()
-                .eq(InformationQuery::getWbsId,json.getString("nodeId"))
-                .eq(InformationQuery::getClassify,tableOwner));
+                .eq(InformationQuery::getWbsId, json.getString("nodeId"))
+                .eq(InformationQuery::getClassify, tableOwner));
 
-        if (node == null || StringUtils.isBlank(node.getPdfUrl())){
-            return  R.fail(300, "当前节点还未生成PDF,不能上报");
+        if (node == null || StringUtils.isBlank(node.getPdfUrl())) {
+            return R.fail(300, "当前节点还未生成PDF,不能上报");
         }
-        List<JSONObject> jsonList = this.queryTableEVisaConfig(json,node.getPdfUrl());
+        List<JSONObject> jsonList = this.queryTableEVisaConfig(json, node.getPdfUrl());
 
         if (jsonList == null || jsonList.size() == 0) {
             return R.fail(300, "未找到符合电签配置的相关流程,请重新保存再上报");
@@ -286,13 +288,13 @@ public class EVisaTaskCheckController {
             List<Long> ids = flowLink.stream().map(l -> l.getFixedFlowLinkUser()).collect(Collectors.toList());
 
             //获取这些人资料合同段下的权限
-            List<JSONObject> userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(flowLink.stream().map(FixedFlowLink::getFixedFlowLinkUser).distinct().collect(Collectors.toList()), node.getContractId()+"");
+            List<JSONObject> userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(flowLink.stream().map(FixedFlowLink::getFixedFlowLinkUser).distinct().collect(Collectors.toList()), node.getContractId() + "");
             if (userRoleList == null || userRoleList.size() <= 0) {
                 //查看当前项目下是否有监理合同段关联此合同段
                 String sql = "SELECT id from m_contract_info mci WHERE contract_type = 2 and id in (SELECT contract_id_jlyz  FROM m_contract_relation_jlyz WHERE contract_id_sg = " + node.getContractId() + ")";
                 ContractInfo contractInfo = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ContractInfo.class)).stream().findAny().orElse(null);
                 if (contractInfo != null) {
-                    userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(ids, contractInfo.getId()+"");
+                    userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(ids, contractInfo.getId() + "");
                 }
             }
             if (userRoleList == null) {
@@ -307,7 +309,7 @@ public class EVisaTaskCheckController {
                             next.setDisabled(true);
                             //设置提示信息
                             String name = jdbcTemplate.queryForObject(" select name from blade_user WHERE id = " + userRole.get("userId"), String.class);
-                            next.setTips(name+"没有电签权限,请检查电签配置或查看表单是否隐藏");
+                            next.setTips(name + "没有电签权限,请检查电签配置或查看表单是否隐藏");
                             break;
                         }
                     }
@@ -356,22 +358,22 @@ public class EVisaTaskCheckController {
         List<FixedFlowVO> flowList = flowPage.getRecords();
 
         //获取电签配置,先获取所有节点的infoIds
-        List<Long> list = Func.toLongList( json.getString("infoIds"));
-        if (list == null || list.size() <= 0){
+        List<Long> list = Func.toLongList(json.getString("infoIds"));
+        if (list == null || list.size() <= 0) {
             return R.fail("请选择一条数据");
         }
         List<InformationQuery> infoList = informationQueryService.list(new LambdaQueryWrapper<InformationQuery>()
                 .in(InformationQuery::getId, list));
-        Map<String,List<String>> map = new HashMap<>();
+        Map<String, List<String>> map = new HashMap<>();
         for (InformationQuery info : infoList) {
-            List<JSONObject> jsonList = this.queryTableEVisaConfig(json,info.getPdfUrl());
+            List<JSONObject> jsonList = this.queryTableEVisaConfig(json, info.getPdfUrl());
             if (jsonList == null || jsonList.size() <= 0) {
                 return R.fail("资料没有配置电签,请尝试重新保存再上报");
             }
 
             //汇总电签配置的审批角色
             List<String> eVisaRoleList = jsonList.stream().map(jsonObject -> jsonObject.getString("sigRoleId")).distinct().collect(Collectors.toList());
-            map.put(info.getWbsId()+"",eVisaRoleList);
+            map.put(info.getWbsId() + "", eVisaRoleList);
         }
 
 
@@ -386,13 +388,13 @@ public class EVisaTaskCheckController {
 
 
             //获取这些人资料合同段下的权限
-            List<JSONObject> userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(flowLink.stream().map(FixedFlowLink::getFixedFlowLinkUser).distinct().collect(Collectors.toList()),infoList.get(0).getContractId()+"" );
+            List<JSONObject> userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(flowLink.stream().map(FixedFlowLink::getFixedFlowLinkUser).distinct().collect(Collectors.toList()), infoList.get(0).getContractId() + "");
             if (userRoleList == null || userRoleList.size() <= 0) {
                 //查看当前项目下是否有监理合同段关联此合同段
                 String sql = "SELECT id from m_contract_info mci WHERE contract_type = 2 and id in (SELECT contract_id_jlyz  FROM m_contract_relation_jlyz WHERE contract_id_sg = " + infoList.get(0).getContractId() + ")";
                 ContractInfo contractInfo = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ContractInfo.class)).stream().findAny().orElse(null);
                 if (contractInfo != null) {
-                    userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(ids, contractInfo.getId()+"");
+                    userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(ids, contractInfo.getId() + "");
                 }
             }
             if (userRoleList == null) {
@@ -425,23 +427,38 @@ public class EVisaTaskCheckController {
     @GetMapping("/checkFlowUserIsExistPfxFile")
     @ApiOperationSupport(order = 4)
     @ApiOperation(value = "检查当前审批人是否存在证书")
-    public R<Boolean> checkTaskUserIsExistPfxFile() {
+    public R<Boolean> checkTaskUserIsExistPfxFile(@RequestParam String projectId) {
         //获取当前审批人的证书
-        List<SignPfxFile> signPfxFiles = this.signPfxClient.querySignPfxByUserIdOrContractId(AuthUtil.getUserId().toString(), "");
-        if (signPfxFiles != null && signPfxFiles.size() > 0) {
-            SignPfxFile signPfxFile = signPfxFiles.get(0);
-            if (StringUtils.isEmpty(signPfxFile.getCertificateFileUrl())) {
-                return R.data(300, false, "当前用户未配置签字证书,请联系维护人员处理");
-            }
-            if (!new Integer("1").equals(signPfxFile.getIsRegister())) {
-                return R.data(300, false, "当前用户的证书未注册,请联系维护人员处理");
-            }
-            if (StringUtils.isEmpty(signPfxFile.getSignatureFileUrl())) {
-                return R.data(300, false, "当前用户未配置签字体,请联系维护人员处理");
+        if (projectId != null && StringUtils.isNotEmpty(projectId)) {
+
+            ProjectInfo projectInfo = projectClient.getById(projectId);
+            if (projectInfo.getRemarkType() == 2) {
+                User data = userClient.userInfoById(AuthUtil.getUserId()).getData();
+                if(StringUtils.isNotEmpty(data.getAccCode())){
+                    return R.data(true);
+                }else{
+                    return R.data(300, false, "当前用户未找到签字证书,请联系维护人员处理");
+                }
+            } else {
+                List<SignPfxFile> signPfxFiles = this.signPfxClient.querySignPfxByUserIdOrContractId(AuthUtil.getUserId().toString(), "");
+                if (signPfxFiles != null && signPfxFiles.size() > 0) {
+                    SignPfxFile signPfxFile = signPfxFiles.get(0);
+                    if (StringUtils.isEmpty(signPfxFile.getCertificateFileUrl())) {
+                        return R.data(300, false, "当前用户未配置签字证书,请联系维护人员处理");
+                    }
+                    if (!new Integer("1").equals(signPfxFile.getIsRegister())) {
+                        return R.data(300, false, "当前用户的证书未注册,请联系维护人员处理");
+                    }
+                    if (StringUtils.isEmpty(signPfxFile.getSignatureFileUrl())) {
+                        return R.data(300, false, "当前用户未配置签字体,请联系维护人员处理");
+                    }
+                    return R.data(true);
+                }
             }
-            return R.data(true);
+            return R.data(300, false, "当前用户未找到签字证书,请联系维护人员处理");
+        } else {
+            return R.data(300, false, "projectId不能位null");
         }
-        return R.data(300, false, "当前用户未找到签字证书,请联系维护人员处理");
     }
 
     /**
@@ -574,7 +591,7 @@ public class EVisaTaskCheckController {
     /**
      * 获取表格的电签配置
      */
-    private List<JSONObject> queryTableEVisaConfig(JSONObject json,String eVisaPDFUrl) {
+    private List<JSONObject> queryTableEVisaConfig(JSONObject json, String eVisaPDFUrl) {
         List<JSONObject> jsonList;
         if (json.containsKey("theLogPrimaryKeyId") && StringUtils.isNotEmpty(json.getString("theLogPrimaryKeyId"))) {
             //日志,需要先获取对应的表格
@@ -592,7 +609,7 @@ public class EVisaTaskCheckController {
         } else {
             //资料填报
             List<String> ids = PDFUtil.getPdfSignIds(eVisaPDFUrl);
-            if (ids == null || ids.size() == 0){
+            if (ids == null || ids.size() == 0) {
                 return null;
             }
             String sql = "select * from m_textdict_info where id in(" + StringUtils.join(ids, ",") + ") ";

+ 81 - 24
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -58,6 +58,7 @@ import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.RowMapper;
 import org.springframework.scheduling.annotation.Async;
+import org.springframework.transaction.TransactionStatus;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
@@ -1835,31 +1836,42 @@ public class InformationWriteQueryController extends BladeController {
         if (wtc != null) {
             try {
                 String tableName = wtc.getInitTableName();
-                if (parent == null) {
-                    parent = this.wbsTreeContractClient.getContractWbsTreeByContractIdAndId(wtc.getParentId(), Long.parseLong(wtc.getContractId()));
-                }
-                if (checkG8(tableName) && !ekvMap.containsKey(tableName)) {
-                    List<Map<String, Object>> listMaps = this.jdbcTemplate.queryForList("select rely from m_formula where number ='TURN_POINT' limit 1");
-                    if (listMaps.size() > 0) {
-                        String rely = listMaps.get(0).get("rely").toString();
-                        ekvMap.put(tableName, Arrays.stream(rely.split("[,]")).skip(1).map(e -> e.split(":")[1]).collect(Collectors.toMap(e -> e, e -> "null")));
-                    }
-                } else {
-                    FormulaOption formulaOption = this.formulaClient.option(parent.getPKeyId());
-                    if (formulaOption != null) {
-                        JSONObject root = JSON.parseObject(formulaOption.getVal());
-                        JSONObject table = (JSONObject) root.computeIfAbsent(wtc.getInitTableName(), (k) -> new JSONObject());
-                        Map<String, String> map = ekvMap.computeIfAbsent(wtc.getInitTableName(), K -> new HashMap<>());
-                        table.forEach((k, v) -> {
-                            if (!k.contains("@")) {
-                                /*元素级别*/
-                                JSONObject elementJson = (JSONObject) v;
-                                JSONArray rgJson = elementJson.getJSONArray(RangeInfo.RG);
-                                if (rgJson != null) {
-                                    map.put(k, rgJson.toJSONString());
+                if(!ekvMap.containsKey(tableName)) {
+                    Map<String, String> map = ekvMap.computeIfAbsent(wtc.getInitTableName(), K -> new HashMap<>());
+                    if (parent == null) {
+                        parent = this.wbsTreeContractClient.getContractWbsTreeByContractIdAndId(wtc.getParentId(), Long.parseLong(wtc.getContractId()));
+                    }
+                    /*节点公式*/
+                    List<Map<String, Object>> paramKey = this.jdbcTemplate.queryForList("select DISTINCT b.e_key ek from m_table_info a  join m_wbs_form_element b on a.id=b.f_id  join m_element_formula_mapping c on b.id = c.element_id where a.tab_en_name='" + tableName + "' and b.is_deleted=0 and c.scope=35 ");
+                    if (paramKey.size() > 0) {
+                        map.putAll(paramKey.stream().map(m -> m.get("ek").toString()).collect(Collectors.toMap(s -> s, s -> StringPool.NULL)));
+                    }
+                    /*G8肯定不会用右键生成数据*/
+                    if (checkG8(tableName)) {
+                        List<Map<String, Object>> listMaps = this.jdbcTemplate.queryForList("select rely from m_formula where number ='TURN_POINT' limit 1");
+                        if (listMaps.size() > 0) {
+                            String rely = listMaps.get(0).get("rely").toString();
+                            /* Map<String, String> map = ekvMap.computeIfAbsent(wtc.getInitTableName(), K -> new HashMap<>());*/
+                            map.putAll(Arrays.stream(rely.split("[,]")).skip(1).map(e -> e.split(":")[1]).collect(Collectors.toMap(e -> e, e -> StringPool.NULL)));
+                            /*ekvMap.put(tableName, Arrays.stream(rely.split("[,]")).skip(1).map(e -> e.split(":")[1]).collect(Collectors.toMap(e -> e, e -> "null")));*/
+                        }
+                    } else {
+                        FormulaOption formulaOption = this.formulaClient.option(parent.getPKeyId());
+                        if (formulaOption != null) {
+                            JSONObject root = JSON.parseObject(formulaOption.getVal());
+                            JSONObject table = (JSONObject) root.computeIfAbsent(wtc.getInitTableName(), (k) -> new JSONObject());
+                            /*Map<String, String> map = ekvMap.computeIfAbsent(wtc.getInitTableName(), K -> new HashMap<>());*/
+                            table.forEach((k, v) -> {
+                                if (!k.contains("@")) {
+                                    /*元素级别*/
+                                    JSONObject elementJson = (JSONObject) v;
+                                    JSONArray rgJson = elementJson.getJSONArray(RangeInfo.RG);
+                                    if (rgJson != null) {
+                                        map.put(k, rgJson.toJSONString());
+                                    }
                                 }
-                            }
-                        });
+                            });
+                        }
                     }
                 }
                 return ekvMap.getOrDefault(tableName, new HashMap<>());
@@ -3763,4 +3775,49 @@ public class InformationWriteQueryController extends BladeController {
         return R.data(rootTreeNode);
     }
 
+
+    /**
+     * 获取节点机构下 queryinfo 的ids
+     */
+    @PostMapping("/get_queryinfo_ids")
+    @ApiOperationSupport(order = 29)
+    @ApiOperation(value = "分页")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "ids", value = "ids", required = true)
+    })
+    public R<String> getQueryInfoIds(String  ids) {
+        List<String> strList = Func.toStrList(ids);
+        for(String da : strList) {
+            InformationQueryVO vo = new InformationQueryVO();
+            vo.setWbsId(Long.parseLong(da));
+            vo.setClassifyType("1");
+            vo.setContractId(1630017379264610305L);
+            vo.setCurrent(1);
+            vo.setProjectId(1630011899725201410L);
+            vo.setSize(1000);
+            vo.setTaskStatus("1");
+
+            R<IPage<InformationQueryVO>> page = this.page(vo);
+            List<InformationQueryVO> records = page.getData().getRecords();
+            String sqll = " insert into node_by_query_id ( node_id, quer_id) values ( ?,?)  ";
+            String delSql = "delete from node_by_query_id where node_id=" + vo.getWbsId();
+            List<Object[]> list = new ArrayList<>();
+            if (records != null && records.size() >= 1) {
+                for (InformationQueryVO informationQueryVO : records) {
+                    list.add(new Object[]{vo.getWbsId(), informationQueryVO.getId()});
+                }
+            }
+            try {
+                //删除
+                jdbcTemplate.execute(delSql);
+                //新增
+                jdbcTemplate.batchUpdate(sqll, list);
+
+            } catch (Exception e) {
+                throw new RuntimeException("字段过长,新增失败");
+            }
+        }
+        return R.data("操作成功");
+    }
+
 }

+ 18 - 7
blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java

@@ -1405,7 +1405,8 @@ public class TaskController extends BladeController {
 
         //封装入参SQL
         List<Object> params = new ArrayList<>();
-        StringBuilder sqlString = new StringBuilder("SELECT * FROM u_task WHERE 1=1 AND status = 1 AND approval_type != 4 AND contract_id = " + dto.getContractId()); //approval_type != 4 非档案的任务就是1填报资料,2工程文件,3日志资料
+        Integer eVisaStatus = dto.getVisaStatus();
+        StringBuilder sqlString = new StringBuilder("SELECT * FROM u_task WHERE 1=1 AND status = " + eVisaStatus + " AND approval_type != 4 AND contract_id = " + dto.getContractId()); //approval_type != 4 非档案的任务就是1填报资料,2工程文件,3日志资料
 
         if (StringUtils.isNotBlank(dto.getStartTimeValue()) && StringUtils.isNotBlank(dto.getEndTimeValue())) {
             if (dto.getStartTimeValue().equals(dto.getEndTimeValue())) {
@@ -1424,11 +1425,21 @@ public class TaskController extends BladeController {
             params.add("%" + dto.getQueryValue() + "%");
         }
 
-        if (StringUtils.isNotBlank(dto.getEVisaUserName())) {
-            sqlString.append(" AND EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.e_visa_status = 99 AND u_task_parallel.status != 3 AND u_task_parallel.task_user_name LIKE ?)");
-            params.add("%" + dto.getEVisaUserName() + "%");
-        } else {
-            sqlString.append(" AND EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.e_visa_status = 99 AND u_task_parallel.status != 3)");
+        //根据每个审批人的情况判断是否成功
+        if (eVisaStatus == 1) {
+            if (StringUtils.isNotBlank(dto.getEVisaUserName())) {
+                sqlString.append(" AND EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.e_visa_status = 99 AND u_task_parallel.status != 3 AND u_task_parallel.task_user_name LIKE ?)");
+                params.add("%" + dto.getEVisaUserName() + "%");
+            } else {
+                sqlString.append(" AND EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.e_visa_status = 99 AND u_task_parallel.status != 3)");
+            }
+        }else {
+            if (StringUtils.isNotBlank(dto.getEVisaUserName())) {
+                sqlString.append(" AND EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.e_visa_status = 1 AND u_task_parallel.status = 2 AND u_task_parallel.task_user_name LIKE ?)");
+                params.add("%" + dto.getEVisaUserName() + "%");
+            } else {
+                sqlString.append(" AND EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.e_visa_status = 1 AND u_task_parallel.status = 2)");
+            }
         }
 
         //总数量
@@ -1474,7 +1485,7 @@ public class TaskController extends BladeController {
                     vo.setStartTime(task.getStartTime());
                     vo.setEndTime(task.getEndTime());
                     vo.setTaskStatusName(task.getStatus().equals(1) ? "待审批" : task.getStatus().equals(2) ? "已审批" : "已废除");
-                    vo.setEVisaStatusName("电签失败");
+                    vo.setEVisaStatusName(eVisaStatus == 1 ? "电签失败" : "电签成功");
                     vo.setTaskReportUserName(nameMap.get(Long.parseLong(task.getReportUser())));
                     List<TaskParallel> taskParallelList = finalTaskParallelGroupMap.get(task.getProcessInstanceId());
                     if (taskParallelList != null && taskParallelList.size() > 0) {

+ 4 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskBatchMapper.java

@@ -20,6 +20,8 @@ import io.lettuce.core.dynamic.annotation.Param;
 import org.springblade.business.entity.TaskBatch;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
+import java.util.List;
+
 /**
  * Mapper 接口
  *
@@ -32,4 +34,6 @@ public interface TaskBatchMapper extends BaseMapper<TaskBatch> {
 
     void deletedTaskBatchByTaskParallelId(@Param("taskParallelId") String taskParallelId);
 
+    List<TaskBatch>  queryDataInfo();
+
 }

+ 4 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskBatchMapper.xml

@@ -25,4 +25,8 @@
         DELETE FROM u_task_batch WHERE task_parallel_id = #{taskParallelId}
     </delete>
 
+    <select id="queryDataInfo" resultMap="taskBatchResultMap">
+        SELECT * from u_task_batch  WHERE is_deleted =4  LIMIT 50
+    </select>
+
 </mapper>

+ 3 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/ITaskBatchService.java

@@ -33,4 +33,7 @@ public interface ITaskBatchService extends BaseService<TaskBatch> {
 
     void deletedTaskBatchByTaskParallelId(String taskParallelId);
 
+
+    List<TaskBatch> queryDataInfo();
+
 }

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

@@ -22,6 +22,8 @@ import org.springblade.business.service.ITaskBatchService;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * 服务实现类
  *
@@ -40,4 +42,9 @@ public class TaskBatchServiceImpl extends BaseServiceImpl<TaskBatchMapper, TaskB
     public void deletedTaskBatchByTaskParallelId(String taskParallelId) {
         this.baseMapper.deletedTaskBatchByTaskParallelId(taskParallelId);
     }
+
+    @Override
+    public List<TaskBatch> queryDataInfo() {
+        return baseMapper.queryDataInfo();
+    }
 }

+ 21 - 5
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -212,6 +212,10 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 
         InformationQuery query = this.informationQueryService.getById(formDataId);
         if (query != null) {
+            // 添加项目Id
+            ProjectInfo projectInfo = this.projectClient.getById(query.getProjectId() + "");
+            vo.setRemarkType(projectInfo.getRemarkType()+"");
+
             if (new Integer("3").equals(query.getType())) {
                 //首件,首件的资料由三个部分组成:封面、关联资料、总结报告
                 if (StringUtils.isNotEmpty(query.getEVisaPdfUrl()) || StringUtils.isNotEmpty(query.getPdfUrl())) {
@@ -571,8 +575,13 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
     public void SignInfo() {
         //执行代码
         logger.debug("扫描开始");
-        List<TaskBatch> maps = taskBatchService.getBaseMapper().selectList(Wrappers.<TaskBatch>lambdaQuery().eq(TaskBatch::getIsDeleted, 0));
-        if (maps != null && maps.size() >= 1) {
+
+      //  List<TaskBatch> maps = taskBatchService.getBaseMapper().selectList(Wrappers.<TaskBatch>lambdaQuery().eq(TaskBatch::getIsDeleted, 0)).stream().limit(50).collect(Collectors.toList());
+
+        List<TaskBatch> maps = taskBatchService.queryDataInfo();
+
+
+        if (maps != null && maps.size() >= 1 && executor.getQueue().size()<=0) {
             for (TaskBatch dataInfo : maps) {
                 String jsonData = dataInfo.getJsonData();
                 TaskApprovalVO taskApprovalVO = JSON.parseObject(jsonData, TaskApprovalVO.class);
@@ -606,10 +615,11 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
     private void checkIsExsitTaskBatch(TaskApprovalVO taskApprovalVO, String batchId, Long userId, String nickName) throws FileNotFoundException {
         logger.info("【任务审核】当前批次开始电签。批次ID:" + batchId);
         //执行电签
-        System.out.println("队数量" + executor.getQueue().size());
+        System.out.println("队数量" + executor.getQueue().size());
         System.out.println("活跃数量" + executor.getActiveCount());
         System.out.println("总共数量" + executor.getTaskCount());
         System.out.println("完成数量" + executor.getCompletedTaskCount());
+        taskApprovalVO.setId(batchId);
         taskApprovalVO.setUserId(userId);
         taskApprovalVO.setNickName(nickName);
         RedisTemplate.opsForValue().set("sign-" + taskApprovalVO.getFormDataId(), "1", 60, TimeUnit.SECONDS);
@@ -661,7 +671,12 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             //todo ============================ 执行电签区域 ============================
 
             //电签状态分为success/notPfxOrFile/error,当状态为error时就需要重新提交请求
-            if ("success".equals(eVisaStatus) || eVisaStatus.contains("success")) {
+            if(eVisaStatus==null || StringUtils.isEmpty(eVisaStatus)){
+                this.taskBatchService.update(Wrappers.<TaskBatch>lambdaUpdate()
+                        .set(TaskBatch::getIsDeleted, 4)
+                        .eq(TaskBatch::getId, taskApprovalVO.getId())
+                );
+            }else if ("success".equals(eVisaStatus) || eVisaStatus.contains("success")) {
                 //审批通过会返回签章成功的文件,需要设置替换
                 //完成/审批当前分支流程
                 this.newFlowClient.completeApprovalTask(taskId, parallelProcessInstanceId, comment).getData();
@@ -725,7 +740,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                         .set(TaskParallel::getUpdateTime, new Date())
                         .eq(TaskParallel::getParallelProcessInstanceId, parallelProcessInstanceId)
                 );
-
+                this.taskBatchService.deletedById(taskApprovalVO.getId());
             } else {
                 //notPfxOrFile,没有证书或证书文件过期等
                 //修改
@@ -735,6 +750,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                         .set(TaskParallel::getUpdateTime, new Date())
                         .eq(TaskParallel::getParallelProcessInstanceId, parallelProcessInstanceId)
                 );
+                this.taskBatchService.deletedById(taskApprovalVO.getId());
             }
         } else {
             //废除,遵循只要某一个分支流程废除,则主流程废除、其它分支流程均自动结束

+ 99 - 0
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVisaController.java

@@ -0,0 +1,99 @@
+package org.springblade.evisa.controller;
+
+import io.swagger.annotations.*;
+import lombok.AllArgsConstructor;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Set;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.OperatingSystemMXBean;
+/**
+ * 清表基础数据表 控制器
+ *
+ * @author BladeX
+ * @since 2022-05-18
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/evisaInfo")
+@Api(value = "电签类", tags = "电签类接口")
+public class EVisaController {
+
+    @Autowired
+    StringRedisTemplate RedisTemplate;
+
+    // 线程池中初始线程个数
+    private final static Integer CORE_POOL_SIZE =20;
+    // 线程池中允许的最大线程数
+    private final static Integer MAXIMUM_POOL_SIZE = 30;
+    // 当线程数大于初始线程时。终止多余的空闲线程等待新任务的最长时间
+    private final static Long KEEP_ALIVE_TIME = 10L;
+    // 任务缓存队列 ,即线程数大于初始线程数时先进入队列中等待,此数字可以稍微设置大点,避免线程数超过最大线程数时报错。或者直接用无界队列
+    private final static LinkedBlockingQueue<Runnable> WORK_QUEUE = new LinkedBlockingQueue<Runnable>();
+    ThreadPoolExecutor threadPoolExecutor = null;
+    // 自定义线程池,开发推荐使用
+    public static ThreadPoolExecutor ITDragonThreadPoolExecutor() {
+        // 构建一个,初始线程数量为3,最大线程数据为8,等待时间10分钟 ,队列长度为5 的线程池
+        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
+                CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.MINUTES, WORK_QUEUE);
+        return threadPoolExecutor;
+    }
+
+  //  @Scheduled(cron = "0 */3 * * * ?")
+    public void StartEvisInfo() {
+        if(threadPoolExecutor==null){
+            threadPoolExecutor = ITDragonThreadPoolExecutor();
+        }
+
+        for (int i = 0; i < 10; i++) {	// 执行8个任务,若超过MAXIMUM_POOL_SIZE则会报错 RejectedExecutionException
+            RedisTemplate.opsForValue().set("sign-" + i, "1", 63, TimeUnit.SECONDS);
+        }
+        System.out.println("完成");
+    }
+
+    @Scheduled(cron = "0 */1 * * * ?")
+    public void runEvisInfo() {
+
+        Set<String> keys = RedisTemplate.keys("sign-*");
+        System.out.println(keys.size());
+    }
+
+    static class MyRunnableTest implements Runnable {
+        private Integer num;	// 正在执行的任务数
+        public MyRunnableTest(Integer num) {
+            this.num = num;
+        }
+        public void run() {
+            System.out.println("正在执行的MyRunnable " + num);
+            try {
+                Thread.sleep(1000);// 模拟执行事务需要耗时
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            System.out.println("MyRunnable " + num + "执行完毕");
+        }
+    }
+
+
+
+
+        public static void main2(String[] args) {
+            OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();
+            double cpuUsage = operatingSystemMXBean.getSystemLoadAverage();
+            System.out.println("CPU Usage: " + cpuUsage);
+        }
+
+
+}

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

@@ -29,7 +29,6 @@ import cfca.paperless.dto.response.tx40.VerifyPdfSealResponse;
 import cn.hutool.core.io.file.FileReader;
 import com.alibaba.fastjson.JSONObject;
 import lombok.AllArgsConstructor;
-import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.pdfbox.pdmodel.PDDocument;
@@ -46,11 +45,10 @@ 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.ObjectUtil;
+import org.springblade.core.tool.utils.*;
 import org.springblade.evisa.redissionUtil.DistributedRedisLock;
 import org.springblade.evisa.service.EVisaService;
+import org.springblade.evisa.utils.FileUtils;
 import org.springblade.evisa.utils.PDFUtils;
 import org.springblade.evisa.vo.*;
 import org.springblade.manager.entity.ContractInfo;
@@ -411,6 +409,7 @@ public class EVisaServiceImpl implements EVisaService {
         try {
             //获取需要签章的数据
             List<TaskApprovalVO.ApprovalFile> files = taskFile.getApprovalFileList();
+
             //这里的文件只会是一张拼接好的PDF
             for (TaskApprovalVO.ApprovalFile file : files) {
 
@@ -427,52 +426,100 @@ 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.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);
-                if (maps == null || maps.size() <= 0) {
-                    //没有签章,不执行电签
-                    RedisTemplate.delete("sign-" + task.getFormDataId());
-                    return NOT_PFX_OR_FILE;
-                }
-                //准备签章策略
-                List<SealStrategyVO> sealStrategyVOS = new ArrayList<>();
-                for (Map<String, Object> eVisaConfig : maps) {
-                    //设置签章策略
-                    SealStrategyVO vo = new SealStrategyVO();
-                    vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + task.getUserId());
-                    vo.setSealPassword(task.getUserId().toString().substring(0, EVisaConstant.USER_ID_SUB));
-                    vo.setSealPerson(task.getNickName());
-                    //设置签字文件
-                    vo.setImageUrl(eVisaConfig.get("signature_file_url") + "");
-                    vo.setSealType("3");
-                    vo.setKeyword(eVisaConfig.get("id") + "");
-                    vo.setOffSetX(eVisaConfig.get("pyzbx") + "");
-                    vo.setOffSetY(eVisaConfig.get("pyzby") + "");
-                    sealStrategyVOS.add(vo);
-                }
-                SealPdfVO pdfVO = new SealPdfVO();
-                pdfVO.setStrategyVoList(sealStrategyVOS);
 
-                //获取字节
-                byte[] fileByte = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(pdfUrl));
-                //执行电签
-                Object[] result = this.signPdfByAXQZ(pdfVO, fileByte);
-                if (result != null) {
-                    if (result[0] != null) {
-                        MultipartFile newFiles = new MockMultipartFile("file", SnowFlakeUtil.getId() + ".pdf", "text/plain", IOUtils.toByteArray(new ByteArrayInputStream((byte[]) result[0])));
-                        //重新上传
-                        BladeFile bladeFile = this.newIOSSClient.uploadFileByInputStream(newFiles);
-                        if (bladeFile != null) {
-                            resultMessage = SUCCESS + "@@@@" + bladeFile.getLink();
+                //判断电签类型
+
+                if (taskFile.getRemarkType().equals("2")) {//东方 中讯 daMap.put("keyWord","1673632651551965184");
+
+                    String sqlinfo = " SELECT a.id as keyWord,(SELECT acc_code from blade_user where id='" + task.getUserId() + "' and is_deleted=0  ) as sealId 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 )";
+                    System.out.println("东方中讯-个人-user-id" + task.getUserId() + "--SQL=" + sqlinfo);
+                    List<Map<String, Object>> maps = jdbcTemplate.queryForList(sqlinfo);
+                    if(maps != null && !maps.isEmpty()){
+                        String fileUrl = pdfUrl;
+                        for(Map<String, Object> dataMap : maps){
+                            HashMap<String,Object> daMa = new HashMap<>();
+                            daMa.put("keyWord",dataMap.get("keyWord"));
+                            daMa.put("sealId",dataMap.get("sealId"));
+
+                            byte[] fileByte;
+                            if(fileUrl.indexOf("aliyuncs.com")>=0){
+                                fileByte = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(fileUrl));
+                            }else {
+                                FileReader fileReader = new FileReader(fileUrl);
+                                fileByte = fileReader.readBytes();
+                            }
+
+                            String originalFileB64 = Base64.toBase64String(fileByte);
+                            daMa.put("fileB64", originalFileB64);
+                            daMa.put("lastSignFlag", false);
+                            String reData =  signPdfByDFZX(daMa);
+                            if(reData.indexOf("success@")>=0){
+                                fileUrl = reData.split("@@@@")[1];
+                            }
+                        }
+                        if(fileUrl.indexOf("aliyuncs.com")>=0){
+                            return E_VISA_ERROR;
+                        }else{
+                            BladeFile bladeFile = this.newIOSSClient.uploadFile(fileUrl.substring(fileUrl.lastIndexOf("/")+1,fileUrl.length()),fileUrl);
+                            if (bladeFile != null) {
+                                System.out.println("pdf上传="+bladeFile.getLink());
+                                return SUCCESS + "@@@@" + bladeFile.getLink();
+                            } else {
+                                return E_VISA_ERROR;
+                            }
+                        }
+                    }else{
+                        RedisTemplate.delete("sign-" + task.getFormDataId());
+                        return SUCCESS + "@@@@" + taskFile.getApprovalFileList().get(0).getFileUrl();
+                    }
+                } else { //安心签证
+                    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);
+                    if (maps == null || maps.size() <= 0) {
+                        //没有签章,不执行电签
+                        RedisTemplate.delete("sign-" + task.getFormDataId());
+                        return NOT_PFX_OR_FILE;
+                    }
+                    //准备签章策略
+                    List<SealStrategyVO> sealStrategyVOS = new ArrayList<>();
+                    for (Map<String, Object> eVisaConfig : maps) {
+                        //设置签章策略
+                        SealStrategyVO vo = new SealStrategyVO();
+                        vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + task.getUserId());
+                        vo.setSealPassword(task.getUserId().toString().substring(0, EVisaConstant.USER_ID_SUB));
+                        vo.setSealPerson(task.getNickName());
+                        //设置签字文件
+                        vo.setImageUrl(eVisaConfig.get("signature_file_url") + "");
+                        vo.setSealType("3");
+                        vo.setKeyword(eVisaConfig.get("id") + "");
+                        vo.setOffSetX(eVisaConfig.get("pyzbx") + "");
+                        vo.setOffSetY(eVisaConfig.get("pyzby") + "");
+                        sealStrategyVOS.add(vo);
+                    }
+                    SealPdfVO pdfVO = new SealPdfVO();
+                    pdfVO.setStrategyVoList(sealStrategyVOS);
+
+                    //获取字节
+                    byte[] fileByte = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(pdfUrl));
+                    //执行电签
+                    Object[] result = this.signPdfByAXQZ(pdfVO, fileByte);
+                    if (result != null) {
+                        if (result[0] != null) {
+                            MultipartFile newFiles = new MockMultipartFile("file", SnowFlakeUtil.getId() + ".pdf", "text/plain", IOUtils.toByteArray(new ByteArrayInputStream((byte[]) result[0])));
+                            //重新上传
+                            BladeFile bladeFile = this.newIOSSClient.uploadFileByInputStream(newFiles);
+                            if (bladeFile != null) {
+                                resultMessage = SUCCESS + "@@@@" + bladeFile.getLink();
+                            } else {
+                                resultMessage = E_VISA_ERROR;
+                            }
                         } else {
-                            resultMessage = E_VISA_ERROR;
+                            resultMessage = E_VISA_ERROR + "####" + result[2];
                         }
                     } else {
-                        resultMessage = E_VISA_ERROR + "####" + result[2];
+                        resultMessage = E_VISA_ERROR;
                     }
-                } else {
-                    resultMessage = E_VISA_ERROR;
                 }
             }
         } catch (Exception e) {
@@ -543,11 +590,6 @@ public class EVisaServiceImpl implements EVisaService {
                         //返回结果集
                         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);*/
-
                                 MultipartFile newFiles = new MockMultipartFile("file", SnowFlakeUtil.getId() + ".pdf", "text/plain", IOUtils.toByteArray(new ByteArrayInputStream((byte[]) result[0])));
                                 BladeFile bladeFile = this.newIOSSClient.uploadFileByInputStream(newFiles);
                                 if (bladeFile != null) {
@@ -596,10 +638,6 @@ public class EVisaServiceImpl implements EVisaService {
                             signVO.setImageUrl(index.getUrl()); //固定签章
                             signVO.setSealType("2");//坐标签章
 
-                            /*xy坐标后面构造签章策略时再计算
-                            signVO.setLx(index.getLx()); //x轴
-                            signVO.setLy(index.getLy()); //y轴*/
-
                             signVO.setPage(index.getPage()); //page页码
                             sealStrategyVOS.add(signVO);
                         }
@@ -638,67 +676,91 @@ public class EVisaServiceImpl implements EVisaService {
         }
     }
 
+  /*  public static void main(String[] args) throws Exception {
+        String pdfPath ="/Users/hongchuangyanfa/Downloads/d2cf9f4ee9bef0cad6c1105e86b3ab09.pdf";
+        String sealId ="0ff724e095fc4a16b9c9c25ebe44e68f";
+        String formDataId ="vv";
+        List<Map<String,Object>> maps = new ArrayList<>();
+        Map<String,Object> daMap = new HashMap<>();
+        daMap.put("keyWord","1715216098053324800");
+        daMap.put("sealId",sealId);
+        maps.add(daMap);
+
+        Map<String,Object> daMap2 = new HashMap<>();
+        daMap2.put("keyWord","1673632651463884");
+        daMap2.put("sealId",sealId);
+        maps.add(daMap2);
+
+        String fileUrl =pdfPath;
+        for(int i=0;i<maps.size();i++){
+            HashMap daMa  = (HashMap) maps.get(i);
+            FileReader fileReader = new FileReader(fileUrl);
+            String originalFileB64 = Base64.toBase64String(fileReader.readBytes());
+            daMa.put("fileB64", originalFileB64);
+
+            daMa.put("lastSignFlag", false);
+
+            if(maps.size()==1){
+                 signPdfByDFZX(daMa);
+            }else{
+              String reData =  signPdfByDFZX(daMa);
+              if(reData.indexOf("success@")>=0){
+                  fileUrl = reData.split("@@@@")[1];
+              }
 
+            }
+            System.out.println(fileUrl);
+        }
+    }*/
     /**
      * 东方 中讯
      *
      * @throws Exception
      */
-    public static void signPdfByDFZX(SealPdfVO pdfVO, byte[] fileByte) throws Exception {
-        String url = "http://192.168.0.120:9125/FrontSys/SealServicezx/FileSignByPoint";
-        HashMap<String, Object> request = new HashMap<>();
-        String picFilePath = "/Users/hongchuangyanfa/Desktop/pdf/1606191494346047488.pdf".toLowerCase();//测试文件的绝对路径
-
-        FileReader fileReader = new FileReader(picFilePath);
-        String originalFileB64 = Base64.toBase64String(fileReader.readBytes());
-        request.put("sealId", "abb54d49555b479b8216b0f3b03bf41f");
-        request.put("fileB64", originalFileB64);
-        request.put("pointX", 100);
-        request.put("pointY", 100);
-        request.put("showHeight", 1000);
-        request.put("showWidth", 600);
-        request.put("lastSignFlag", false);
-
-        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
-        httpRequestFactory.setConnectionRequestTimeout(30000);
-        httpRequestFactory.setConnectTimeout(30000);
-        httpRequestFactory.setReadTimeout(30000);
-        RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
-        // 设置编码格式为UTF-8
-        List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();
-        HttpMessageConverter<?> converterTarget = null;
-        for (HttpMessageConverter<?> item : converterList) {
-            if (item.getClass() == StringHttpMessageConverter.class) {
-                converterTarget = item;
-                break;
+    public static String signPdfByDFZX(HashMap<String, Object> request)  {
+        String url = "http://47.110.251.215:9125/FrontSysGs/SealServicezx/FileSignByKeyWord";
+        String sysLocalFileUrl = FileUtils.getSysLocalFileUrl();
+        String filecode = SnowFlakeUtil.getId() + "";
+        String dataFileUrl = sysLocalFileUrl+"/pdf/"+filecode+".pdf";
+        try {
+            HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
+            httpRequestFactory.setConnectionRequestTimeout(30000);
+            httpRequestFactory.setConnectTimeout(30000);
+            httpRequestFactory.setReadTimeout(30000);
+            RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
+            // 设置编码格式为UTF-8
+            List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();
+            HttpMessageConverter<?> converterTarget = null;
+            for (HttpMessageConverter<?> item : converterList) {
+                if (item.getClass() == StringHttpMessageConverter.class) {
+                    converterTarget = item;
+                    break;
+                }
             }
-        }
 
-        if (converterTarget != null) {
-            converterList.remove(converterTarget);
-        }
-        HttpMessageConverter<?> converter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
-        converterList.add(1, converter);
+            if (converterTarget != null) {
+                converterList.remove(converterTarget);
+            }
+            HttpMessageConverter<?> converter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
+            converterList.add(1, converter);
 
-        HashMap<String, Object> retData = restTemplate.postForObject(url, request, HashMap.class);
+            HashMap<String, Object> retData = restTemplate.postForObject(url, request, HashMap.class);
 
-        String code = retData.get("code").toString();
-        String msg = retData.get("msg").toString();
+            String code = retData.get("code").toString();
+            String msg = retData.get("msg").toString();
 
-        if (!"0".equals(code)) {
-            return;
-        }
+            if (!"0".equals(code)) {
+                return ERROR + "@@@@" + msg;
+            }
 
-        String fileB64 = retData.get("fileB64").toString();
+            String fileB642 = retData.get("fileB64").toString();
 
-        try {
-            FileOutputStream fout = new FileOutputStream(picFilePath.replace(".pdf", "-签名后.pdf"));
-            fout.write(Base64.decode(fileB64));//生成base64字符串格式文件
+            FileOutputStream fout = new FileOutputStream(dataFileUrl);
+            fout.write(Base64.decode(fileB642));//生成base64字符串格式文件
             fout.close();
-            System.out.println("文件保存成功");
+            return SUCCESS + "@@@@" + dataFileUrl;
         } catch (Exception e) {
-            System.out.println("文件保存失败");
-            e.printStackTrace();
+            return  ERROR + "@@@@异常出错";
         }
     }
 

+ 52 - 0
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/FileUtils.java

@@ -0,0 +1,52 @@
+package org.springblade.evisa.utils;
+
+
+
+import org.springblade.common.constant.CommonConstant;
+import org.springblade.common.utils.CommonUtil;
+
+import org.springblade.common.utils.SystemUtils;
+
+import org.springblade.system.cache.ParamCache;
+
+import java.io.*;
+
+
+public class FileUtils {
+
+    // 获取本地 或 远程工作流ParamCache
+    public static InputStream getInputStreamByUrl(String fileUrl) throws Exception {
+        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        String sys_file_net_url = ParamCache.getValue(CommonConstant.SYS_FILE_NET_URL);
+
+        File file1 = new File(fileUrl);
+        InputStream fileInputStream = null;
+        if (file1.exists()) {
+            fileInputStream = new FileInputStream(file1);
+        } else {
+            String path = sys_file_net_url + fileUrl.replaceAll("//", "/").replaceAll(file_path, "");
+            fileInputStream = CommonUtil.getOSSInputStream(path);
+        }
+        return fileInputStream;
+    }
+
+    public static String getNetUrl(String fileUrl){
+        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        String sys_file_net_url = ParamCache.getValue(CommonConstant.SYS_FILE_NET_URL);
+
+       String path = sys_file_net_url + fileUrl.replaceAll("//", "/").replaceAll(file_path, "");
+
+        return path;
+    }
+
+    public static String getSysLocalFileUrl() {
+        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        if (SystemUtils.isMacOs()) {
+            file_path = "/Users/hongchuangyanfa/Desktop/";
+        } else if (SystemUtils.isWindows()) {
+            file_path = "C://upload";
+        }
+        return file_path;
+    }
+
+}

+ 21 - 0
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -818,6 +818,27 @@ public static Map<String,List<Long>> relatedPages(List<FormData> curFormDatas ,L
        return false;
   }
 
+  /**分割treeCode*/
+  public  static  List<String> treeCodeSplit(String treeCode){
+     List<String> result = new ArrayList<>();
+     if(Func.isNotBlank(treeCode)){
+          /*字符总长度*/
+          int max =treeCode.length(),
+          /*累计字符长度字符*/
+           sum=0,
+          /*第几次循环*/
+           count=0;
+         do{
+           result.add(treeCode.substring(0, sum+=Math.min(3,++count)));
+         }while (sum<max&&count<MAX_LOOP);
+     }
+     return result;
+  }
 
+/*    public static void main(String[] args) {
+       // String s="003000004001000003";
+        String s="0";
+        treeCodeSplit(s).forEach(System.out::println);
+    }*/
 
 }

+ 7 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -306,14 +306,15 @@ public class ExcelTabController extends BladeController {
         String filecode = SnowFlakeUtil.getId() + "";
         String thmlUrl = file_path + filecode + ".html";
         String exceUrl = file_path + filecode + "123.xlsx";
+
         ExcelInfoUtils.excelInfo(file.getInputStream(), exceUrl, thmlUrl, "1");
         // 上传excel文件
         BladeFile bladeFile = newIOSSClient.uploadFile(file.getOriginalFilename(), exceUrl);
         // 解析原始excel
 
-        BladeFile bladeFileR = newIOSSClient.uploadFileByInputStream(file);
+      //  BladeFile bladeFileR = newIOSSClient.uploadFileByInputStream(file);
         detail.setExtension(file.getOriginalFilename());
-        detail.setFileUrl(bladeFileR.getLink());
+        detail.setFileUrl(bladeFile.getLink());
         detail.setFileType(3); // 表示为清表信息  1 表示祖节点  2 表示为节点信息 3 表示清表
         detail.setHtmlUrl(thmlUrl);
         excelTabService.saveOrUpdate(detail);
@@ -1785,7 +1786,7 @@ public class ExcelTabController extends BladeController {
     @ApiImplicitParams(value = {
             @ApiImplicitParam(name = "id", value = "id", required = true)
     })
-    public R getExcelHtmlByCol(Long id) throws IOException, InterruptedException {
+    public R getExcelHtmlByCol(Long id) throws Exception {
         ExcelTab detail = excelTabService.getById(id);
         if (detail == null) {
             return R.fail("该数据下无此节点!");
@@ -1794,12 +1795,12 @@ public class ExcelTabController extends BladeController {
             return R.fail("请上传清表!");
         }
 
-        File file1 = ResourceUtil.getFile(detail.getHtmlUrl());
-        FileInputStream fileInputStream = new FileInputStream(file1);
+        InputStream fileInputStream = FileUtils.getInputStreamByUrl(detail.getHtmlUrl());
         String htmlString = IoUtil.readToString(fileInputStream);
         // 解析 style
         Document doc = Jsoup.parse(htmlString);
         Element table = doc.select("table").first();
+        table.select("table").attr("min-width","-webkit-fill-available");
         doc.select("Col").remove();
         fileInputStream.close();
         return R.data(table + "");
@@ -3937,4 +3938,5 @@ public class ExcelTabController extends BladeController {
         }
         return R.data("成功");
     }
+
 }

+ 30 - 14
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -509,22 +509,38 @@ public class FormulaController {
         WbsTreeContract one = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, pkeyId));
         if (one != null) {
             List<String> list = new ArrayList<>();
-            list.add(Func.isNotBlank(one.getFullName()) ? one.getFullName() : one.getNodeName());
-            int max = 20;
-            int loop = 0;
-            String parentId = one.getParentId().toString();
-            while (loop < max && StringUtils.isNotEquals(0, parentId)) {
-                WbsTreeContract next = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getContractId, one.getContractId()).eq(WbsTreeContract::getId, parentId));
-                if(next==null){
-                    return R.fail("断链");
+            if(Func.isNotBlank(one.getTreeCode())){
+                List<String> treeCodes= FormulaUtils.treeCodeSplit(one.getTreeCode());
+                treeCodes.remove(treeCodes.size()-1);
+                List<WbsTreeContract> chains = this.wbsTreeContractService.list(Wrappers.<WbsTreeContract>lambdaQuery().in(WbsTreeContract::getTreeCode,treeCodes).eq(WbsTreeContract::getContractId,one.getContractId()));
+                if(chains.size()>0){
+                    chains.add(one);
+                    chains.remove(0);
+                    ContractInfo info = contractInfoService.getById(one.getContractId());
+                    list.add(info.getContractName());
+                    chains.forEach(next->{
+                        list.add(Func.isNotBlank(next.getFullName()) ? next.getFullName() : next.getNodeName());
+                    });
+                }
+            }else{
+                list.add(Func.isNotBlank(one.getFullName()) ? one.getFullName() : one.getNodeName());
+                int max = 20;
+                int loop = 0;
+                String parentId = one.getParentId().toString();
+                while (loop < max && StringUtils.isNotEquals(0, parentId)) {
+                    WbsTreeContract next = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getContractId, one.getContractId()).eq(WbsTreeContract::getId, parentId));
+                    if(next==null){
+                        return R.fail("断链");
+                    }
+                    parentId = next.getParentId().toString();
+                    list.add(Func.isNotBlank(next.getFullName()) ? next.getFullName() : next.getNodeName());
+                    loop++;
                 }
-                parentId = next.getParentId().toString();
-                list.add(Func.isNotBlank(next.getFullName()) ? next.getFullName() : next.getNodeName());
-                loop++;
+                ContractInfo info = contractInfoService.getById(one.getContractId());
+                Collections.reverse(list);
+                list.set(0, info.getContractName());
             }
-            ContractInfo info = contractInfoService.getById(one.getContractId());
-            Collections.reverse(list);
-            list.set(0, info.getContractName());
+
             final String[] indent = {"-"};
             String result = list.stream()
                     .map(item -> {

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

@@ -421,12 +421,14 @@ public class TextdictInfoController extends BladeController {
 
         List<WbsTreePrivate> wbsTreePrivatesEqual = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
                 .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                .eq(WbsTreePrivate::getType, 2)
+                .eq(WbsTreePrivate::getIsDeleted, 0)
                 .eq(WbsTreePrivate::getExcelId, wbsTreePrivate.getExcelId()));
         List<Long> pKeyIds = wbsTreePrivatesEqual.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
         String ids = StringUtils.join(pKeyIds, ",");
 
         //删除历史数据
-        String delSql = "delete from m_textdict_info where tab_id in("+ids+") and type in(2,6) and excel_id is null";
+        String delSql = "delete from m_textdict_info where (tab_id in(SELECT p_key_id from m_wbs_tree_private where project_id='"+wbsTreePrivate.getProjectId()+"' and excel_id='"+wbsTreePrivate.getExcelId()+"' and type=2 and is_deleted=0) or excel_id="+wbsTreePrivate.getExcelId()+") and project_id="+wbsTreePrivate.getProjectId()+" and type in(2,6) ";
         jdbcTemplate.execute(delSql);
 
         // ------- 查询数据库是否存在 该该电签信息 ---------
@@ -476,8 +478,10 @@ public class TextdictInfoController extends BladeController {
         String replace = str1.replace("\\", "\\\\");
 
         //修改同几点的数据
-        String updateSqlP = "update m_wbs_tree_private set html_url = '" + replace + "' where p_key_id in ("+ids+") and project_id="+wbsTreePrivate.getProjectId()+"";
-        jdbcTemplate.execute(updateSqlP);
+        if(ids!=null){
+            String updateSqlP = "update m_wbs_tree_private set html_url = '" + replace + "' where p_key_id in ("+ids+") and project_id="+wbsTreePrivate.getProjectId()+"";
+            jdbcTemplate.execute(updateSqlP);
+        }
 
 
 

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

@@ -21,9 +21,8 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.core.tool.utils.Func;
-import org.springblade.core.tool.utils.RegexUtil;
 import org.springblade.manager.dto.FormulaBean;
-import org.springblade.manager.dto.ParamElements;
+import org.springblade.manager.dto.TreeNode;
 import org.springblade.manager.dto.WbsParamBean;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.service.*;
@@ -35,6 +34,7 @@ import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 import springfox.documentation.annotations.ApiIgnore;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 /**
@@ -588,4 +588,112 @@ public class WbsParamController {
     }
 
 
+    /**按合同段或者项目刷入m_wbs_tree_contract的treeCode*/
+    @GetMapping("/tree-code")
+    public R<Object> treeCode(Long contractId,Long projectId) {
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start("treeCode刷新");
+        List<Long> contractIds= new ArrayList<>();
+        if(projectId!=null){
+            contractIds= this.jdbcTemplate.queryForList(" select id from m_contract_info where p_id="+projectId+" and is_deleted=0 ",Long.class);
+        }else if( contractId!=null){
+            contractIds.add(contractId);
+        }
+        if(contractIds.size()>0){
+             for(Long id:contractIds){
+                    batchUpdate(id,true);
+             }
+            stopWatch.stop();
+            return R.success((stopWatch.getLastTaskName()+"执行用时:"+stopWatch.getTotalTimeMillis()));
+        }
+        return R.fail("项目Id格式有问题");
+
+    }
+
+    public void batchUpdate(Long id,boolean fast){
+        List<Map<String,Object>> treeNodeList= this.jdbcTemplate.queryForList("select node_name name,p_key_id value, id, parent_id parentId from m_wbs_tree_contract where contract_id="+id+" and is_deleted=0 and type=1 ");
+        if(treeNodeList.size()>0){
+            Map<Long,TreeNode<Long>> treeNodeMap = new HashMap<>(treeNodeList.size()*2);
+            Long topId=null;
+            for (Map<String,Object> map:treeNodeList){
+                TreeNode<Long> treeNode = new TreeNode<>();
+                treeNode.setId(Long.parseLong(map.get("id").toString()));
+                treeNode.setParentId(Long.parseLong(map.get("parentId").toString()));
+                treeNode.setValue(Long.parseLong(map.get("value").toString()));
+                treeNode.setName(map.get("name").toString());
+                if(treeNode.getParentId().equals(0L)){
+                    topId=treeNode.getId();
+                }
+                treeNodeMap.put(treeNode.getId(),treeNode);
+            }
+            Map<Long,List<TreeNode<Long>>> group= treeNodeMap.values().stream().collect(Collectors.groupingBy(TreeNode::getParentId));
+            group.forEach((k,v)->{
+                TreeNode<Long> tmp = treeNodeMap.get(k);
+                if(tmp!=null) {
+                    tmp.setChildren(v);
+                }
+            });
+            TreeNode<Long> top = treeNodeMap.get(topId);
+            if(fast){
+                List<String>sqlList=new ArrayList<>();
+                sqlBuilder2(top,sqlList,ZERO);
+                if(sqlList.size()>0){
+                    List<List<String>> sqlListSeg = BaseUtils.splitList(sqlList, 250);
+                    sqlListSeg.parallelStream().forEach(sql->{
+                        try {
+                            String joinSql=String.join(";",sql);
+                            this.jdbcTemplate.execute(joinSql);
+                        }catch (Exception e){
+                            e.printStackTrace();
+                        }
+                    });
+                }
+            }else{
+                List<Object[]> paramList = new ArrayList<>();
+                sqlBuilder(top,paramList,ZERO);
+                if(!paramList.isEmpty()){
+                    List<List<Object[]>> paramListSplit=BaseUtils.splitList(paramList,1000);
+                    String sqlTemplate="update m_wbs_tree_contract set tree_code = ? where p_key_id = ?";
+                    paramListSplit.parallelStream().forEach(sql->{
+                        try {
+                            this.jdbcTemplate.batchUpdate(sqlTemplate,sql);
+                        }catch (Exception e){
+                            e.printStackTrace();
+                        }
+                    });
+                }
+            }
+        }
+    }
+
+    static String ZERO="0";
+    public void sqlBuilder(TreeNode<Long> top, List<Object[]>paramList, String treeCode){
+            if(top!=null){
+                paramList.add(new Object[]{treeCode,top.getValue()});
+                if(top.hasChildren()){
+                     for(int i=0;i<top.getChildren().size();i++){
+                         TreeNode<Long> child=top.getChildren().get(i);
+                         int base=ZERO.equals(treeCode)?100:1000;
+                         sqlBuilder(child,paramList,treeCode+String.valueOf(base+i).substring(1));
+                     }
+                }
+            }
+
+    }
+    public void sqlBuilder2(TreeNode<Long> top, List<String>sqlList, String treeCode){
+        if(top!=null){
+            sqlList.add("update m_wbs_tree_contract set tree_code ='"+treeCode+"' where p_key_id="+top.getValue());
+            if(top.hasChildren()){
+                for(int i=0;i<top.getChildren().size();i++){
+                    TreeNode<Long> child=top.getChildren().get(i);
+                    int base=ZERO.equals(treeCode)?100:1000;
+                    sqlBuilder2(child,sqlList,treeCode+String.valueOf(base+i).substring(1));
+                }
+            }
+        }
+
+    }
+
+
+
 }

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

@@ -44,4 +44,7 @@ public interface TextdictInfoMapper extends EasyBaseMapper<TextdictInfo> {
 
     TextdictInfoVO selectTextdictInfoById(@Param("id") String id);
 
+
+    List<TextdictInfoVO> selectTextdictInfoByExcelId(IPage page, TextdictInfoVO textdictInfo);
+
 }

+ 7 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/TextdictInfoMapper.xml

@@ -24,13 +24,13 @@
     <select id="selectTextdictInfoPage" resultMap="textdictInfoResultMap">
         select distinct * from m_textdict_info where is_deleted = 0
         <if test="param2.type== 2 ">
-            and type in('2','6')    and (excel_id=#{param2.excelId} or tab_id=#{param2.tabId})
+            and type in('2','6')    and  (tab_id=#{param2.tabId} or excel_id=#{param2.excelId})
         </if>
         <if test="param2.type!= 2 ">
             and type =#{param2.type} and tab_id=#{param2.tabId}
         </if>
         <if test="param2.projectId!=null and param2.projectId!='' ">
-            and project_id=(SELECT project_id from m_wbs_tree_private where p_key_id=#{param2.tabId} )
+            and project_id=#{param2.projectId}
         </if>
     </select>
 
@@ -38,4 +38,9 @@
         select  *,(SELECT parent_id from blade_role c where c.id=b.sig_role_id) as parentRoleId from m_textdict_info b where is_deleted = 0 and id=#{id}
     </select>
 
+    <select id="selectTextdictInfoByExcelId" resultMap="textdictInfoResultMap">
+        select distinct * from m_textdict_info where is_deleted = 0
+        and type in('2','6')
+        and id in( SELECT max(id) from m_textdict_info where excel_id=#{param2.excelId} and type in(2,6) GROUP BY col_key )
+    </select>
 </mapper>

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

@@ -51,6 +51,7 @@
         <result column="is_concealed_works_node" property="isConcealedWorksNode"/>
         <result column="is_ele" property="isEle"/>
         <result column="tab_group_id" property="tabGroupId"/>
+        <result column="tree_code" property="treeCode"/>
     </resultMap>
 
 

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

@@ -453,6 +453,7 @@ public class ArTreeContractInitServiceImpl {
 //            }else {
 //                archiveTree.setParentId(wbsTreeVO2.getParentId());
 //            }
+            archiveTree.setFromId(wbsTreeVO2.getId());
             if (StringUtils.isNotEmpty(wbsTreeVO2.getOldId())) {
                 archiveTree.setFromId(Long.parseLong(wbsTreeVO2.getOldId()));
             }

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

@@ -2261,7 +2261,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             WbsTreeContract node = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getId, wtc.getParentId()).eq(WbsTreeContract::getContractId,wtc.getContractId()));
             Long privatePkeyId=node.getIsTypePrivatePid();
             /*项目节点*/
-            if(privatePkeyId==null) {
+            if(!(privatePkeyId!=null&&privatePkeyId>0)) {
                 WbsTreePrivate wtp = this.wtpId(node.getPKeyId());
                 privatePkeyId=wtp.getPKeyId();
             }

+ 26 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/TextdictInfoServiceImpl.java

@@ -16,10 +16,19 @@
  */
 package org.springblade.manager.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.IoUtil;
 import org.springblade.manager.entity.TextdictInfo;
 import org.springblade.manager.entity.WbsTreePrivate;
+import org.springblade.manager.mapper.WbsTreePrivateMapper;
+import org.springblade.manager.utils.FileUtils;
 import org.springblade.manager.vo.TextdictDataInfoVO;
 import org.springblade.manager.vo.TextdictInfoVO;
 import org.springblade.manager.mapper.TextdictInfoMapper;
@@ -29,6 +38,8 @@ import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
@@ -42,16 +53,25 @@ import java.util.List;
  */
 @Service
 public class TextdictInfoServiceImpl extends ServiceImpl<TextdictInfoMapper, TextdictInfo> implements ITextdictInfoService {
-
+    @Resource
+    private WbsTreePrivateMapper wbsTreePrivateMapper;
     @Override
     public IPage<TextdictInfoVO> selectTextdictInfoPage(IPage<TextdictInfoVO> page, TextdictInfoVO textdictInfo) {
-        textdictInfo.setProjectId("123456");
-        List<TextdictInfoVO> textdict = baseMapper.selectTextdictInfoPage(page, textdictInfo);
-        if(textdict==null || textdict.isEmpty()){
-            textdictInfo.setProjectId("");
+        List<TextdictInfoVO> textdict = new ArrayList<>();
+
+        if(textdictInfo.getType()==2){
+            WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
+                    .eq(WbsTreePrivate::getPKeyId, Func.toLong(textdictInfo.getTabId()))
+                    .eq(WbsTreePrivate::getIsDeleted, 0));
+            // 通过项目Id 和excel 进行匹配
+            textdictInfo.setProjectId(wbsTreePrivate.getProjectId());
+            textdict = baseMapper.selectTextdictInfoPage(page, textdictInfo);
+            if(textdict==null || textdict.size()<=0){ //用excel 进行匹配
+                textdict = baseMapper.selectTextdictInfoByExcelId(page, textdictInfo);
+            }
+        }else{
             textdict = baseMapper.selectTextdictInfoPage(page, textdictInfo);
         }
-
         return page.setRecords(textdict);
     }
 

+ 0 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java

@@ -140,15 +140,6 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
                 result.put("待删除参数", removeWpIds.size());
                 result.put("待删除中间关联", removeMapingIds.size());
                 result.put("待删除公式", removeFormulaIds.size());
-//                if(removeWpIds.size()>0) {
-//                    this.deleteLogic(removeWpIds);
-//                }
-//                if(removeMapingIds.size()>0){
-//                    this.elementFormulaMappingService.deleteLogic(removeMapingIds);
-//                }
-//                if(removeFormulaIds.size()>0){
-//                    this.formulaService.deleteLogic(removeFormulaIds);
-//                }
                 if(removeWpIds.size()>0) {
                     batchDel(this,removeWpIds);
                 }

+ 12 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ExcelInfoUtils.java

@@ -18,6 +18,7 @@ import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.tool.utils.FileUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.IoUtil;
+import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.manager.vo.DateFormat;
 
 import java.io.File;
@@ -42,10 +43,20 @@ public class ExcelInfoUtils {
             Workbook wb = new Workbook();
             wb.loadFromMHtml(inputStream);
             Worksheet sheet = wb.getWorksheets().get(0);
-
             HTMLOptions options = new HTMLOptions();
             options.setImageEmbedded(true);
 
+            // 校验excel 是否正常
+            sheet.saveToHtml(htmlUrl, options);
+            File file1 = ResourceUtil.getFile(htmlUrl);
+            String htmlString = IoUtil.readToString(new FileInputStream(file1));
+            Document doc = Jsoup.parse(htmlString);
+            Element table = doc.select("table").first();
+            Elements trs = table.select("tr");
+            Elements cols = table.select("Col");
+            sheet.deleteRow(trs.size()+1,sheet.getRows().length - trs.size());
+            sheet.deleteColumn(cols.size()+1,sheet.getColumns().length - cols.size());
+            file1.delete();
             //复制一份
             wb.saveToFile(excelURL,FileFormat.Version2013);
             // 操作

+ 1 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ExcelInfoUtils2.java

@@ -1,8 +1,6 @@
 package org.springblade.manager.utils;
 
-import com.spire.pdf.PdfDocument;
-import com.spire.pdf.utilities.PdfTable;
-import com.spire.pdf.utilities.PdfTableExtractor;
+
 import com.spire.xls.CellRange;
 import com.spire.xls.FileFormat;
 import com.spire.xls.Workbook;