Просмотр исходного кода

Merge branch 'master' of http://121.41.40.202:3000/zhuwei/bladex

huangtf 1 год назад
Родитель
Сommit
ef6ed814f4
30 измененных файлов с 811 добавлено и 365 удалено
  1. 3 3
      blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java
  2. 5 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskApprovalVO.java
  3. 2 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/TreeNode.java
  4. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreeContract.java
  5. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ContractTreeDrawingsController.java
  6. 70 53
      blade-service/blade-business/src/main/java/org/springblade/business/controller/EVisaTaskCheckController.java
  7. 46 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  8. 21 13
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  9. 4 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskBatchMapper.java
  10. 4 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskBatchMapper.xml
  11. 3 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITaskBatchService.java
  12. 7 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskBatchServiceImpl.java
  13. 26 5
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  14. 99 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVisaController.java
  15. 162 100
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java
  16. 52 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/FileUtils.java
  17. 21 0
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java
  18. 7 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  19. 31 12
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java
  20. 7 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java
  21. 110 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java
  22. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/TextdictInfoMapper.java
  23. 7 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/TextdictInfoMapper.xml
  24. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  25. 19 9
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  26. 48 144
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  27. 7 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/SignPfxFileServiceImpl.java
  28. 26 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/TextdictInfoServiceImpl.java
  29. 12 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ExcelInfoUtils.java
  30. 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;
     }
 

+ 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;
+
 }

+ 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, ",") + ") ";

+ 46 - 0
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;
@@ -3763,4 +3764,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("操作成功");
+    }
+
 }

+ 21 - 13
blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java

@@ -1408,10 +1408,15 @@ public class TaskController extends BladeController {
         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日志资料
 
         if (StringUtils.isNotBlank(dto.getStartTimeValue()) && StringUtils.isNotBlank(dto.getEndTimeValue())) {
-            sqlString.append(" AND start_time >= ?")
-                    .append(" AND end_time <= ?");
-            params.add(dto.getStartTimeValue());
-            params.add(dto.getEndTimeValue());
+            if (dto.getStartTimeValue().equals(dto.getEndTimeValue())) {
+                sqlString.append(" AND start_time = ?");
+                params.add(dto.getStartTimeValue());
+            } else {
+                sqlString.append(" AND start_time >= ?")
+                        .append(" AND end_time <= ?");
+                params.add(dto.getStartTimeValue());
+                params.add(dto.getEndTimeValue());
+            }
         }
 
         if (StringUtils.isNotBlank(dto.getQueryValue())) {
@@ -1548,15 +1553,18 @@ public class TaskController extends BladeController {
                             for (Task task : taskList) {
                                 List<TaskParallel> taskParallelList = finalTaskParallelGroupMap.get(task.getProcessInstanceId());
                                 for (TaskParallel taskParallel : taskParallelList) {
-                                    TaskApprovalVO approvalVO = new TaskApprovalVO();
-                                    approvalVO.setTaskId(task.getId().toString());
-                                    approvalVO.setFlag("OK");
-                                    approvalVO.setComment("重新发起电签");
-                                    approvalVO.setApprovalType(1);
-                                    approvalVO.setFormDataId(task.getFormDataId());
-                                    approvalVO.setParallelProcessInstanceId(taskParallel.getParallelProcessInstanceId());
-                                    approvalVO.setYsNickName(taskParallel.getTaskUserName());
-                                    taskApprovalVOS.add(approvalVO);
+                                    //待审批的不进行重签
+                                    if (!(new Integer(1)).equals(taskParallel.getStatus())) {
+                                        TaskApprovalVO approvalVO = new TaskApprovalVO();
+                                        approvalVO.setTaskId(task.getId().toString());
+                                        approvalVO.setFlag("OK");
+                                        approvalVO.setComment("重新发起电签");
+                                        approvalVO.setApprovalType(1);
+                                        approvalVO.setFormDataId(task.getFormDataId());
+                                        approvalVO.setParallelProcessInstanceId(taskParallel.getParallelProcessInstanceId());
+                                        approvalVO.setYsNickName(taskParallel.getTaskUserName());
+                                        taskApprovalVOS.add(approvalVO);
+                                    }
                                 }
                             }
                             long startTime_2 = System.currentTimeMillis();

+ 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();
+    }
 }

+ 26 - 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 {
             //废除,遵循只要某一个分支流程废除,则主流程废除、其它分支流程均自动结束
@@ -1071,6 +1087,11 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             for (String iId : list) {
                 //获取
                 InformationQuery queryinfo = informationQueryService.getById(iId);
+                if (StringUtils.isNotBlank(queryinfo.getFileUserIdAndName())){
+                    String userIdAndName = queryinfo.getFileUserIdAndName();
+                    String[] split = userIdAndName.split("-");
+                    userId = Long.parseLong(split[0]);
+                }
 
                 List<AppWbsTreeContractVO> WbsTreeContract = wbsTreeContractClient.searchNodeAllTableInfo(queryinfo.getWbsId() + "", queryinfo.getClassify() + "", queryinfo.getContractId() + "", queryinfo.getProjectId() + "", userId);
                 List<String> collect = new ArrayList<>();

+ 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("成功");
     }
+
 }

+ 31 - 12
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -509,19 +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));
-                parentId = next.getParentId().toString();
-                list.add(Func.isNotBlank(next.getNodeName()) ? next.getNodeName() : next.getFullName());
-                loop++;
+            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++;
+                }
+                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>
 
 

+ 19 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -1342,7 +1342,9 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 for (Element element : bhtitle) {
                     int trindex = Integer.parseInt(element.attr("trindex"));
                     if (trindex <= 10) {
-                        reData.put(element.attr("keyName"), node.getPartitionCode() == null ? "" : node.getPartitionCode());
+                        if (StringUtils.isNotBlank(node.getPartitionCode())) {
+                            reData.put(element.attr("keyName"), node.getPartitionCode());
+                        }
                     }
                 }
             }
@@ -1511,8 +1513,6 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         Map<String, Object> DataInfo = (Map<String, Object>) getBussDataInfo(pkeyId, 0).getData();
         //真实填报率
         Integer realFillRate = 0;
-        //获取已经填报的数据
-        Long fillNumbers = DataInfo.keySet().stream().filter(e -> e.contains("__")).count();
 
         //获取excel流 和 html流
         InputStream exceInp = CommonUtil.getOSSInputStream(excelTab.getFileUrl());
@@ -1589,20 +1589,30 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         //数据不为空
         if (StringUtils.isNotEmpty(wbsTreeContract.getHtmlUrl())) {
             InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(wbsTreeContract.getHtmlUrl());
-//            InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\1578963584895942656.html");
+//            InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\1693464012966068224.html");
             String htmlString = IoUtil.readToString(inputStreamByUrl);
 
             Document doc = Jsoup.parse(htmlString);
             Element table = doc.select("table").first();
             //计算填报率
-            Long keySize = table.getElementsByAttribute("v-model").stream().count();
+            List<String> keyList = table.getElementsByAttribute("v-model").stream()
+                    .map(l -> {
+                        String attr = l.attr("v-model");
+                        System.out.println(attr);
+                        String[] split = attr.split("\\.");
+                        return split[1];
+                    })
+                    .collect(Collectors.toList());
             Long sigSize = table.getElementsByAttribute(":readonly").stream().count();
-            if (fillNumbers != 0 && keySize != 0){
+            int keySize = keyList.size();
+            List<String> fills = DataInfo.keySet().stream().filter(e -> e.contains("__") && e.contains("key")).collect(Collectors.toList());
+            if (fills.size() != 0 && keyList != null && keyList.size() != 0){
                 if (keySize == sigSize){
                     realFillRate = 100;
-                }else {
-                    keySize = keySize - sigSize;
-                    Double v = fillNumbers.doubleValue() / keySize.doubleValue() * 100;
+                }else if (keySize > sigSize) {
+                    keySize = keySize - sigSize.intValue();
+                    keyList.retainAll(fills);
+                    Double v = new Double(keyList.size()) / new Double(keySize) * 100;
                     realFillRate = v.intValue();
                 }
             }

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

@@ -1973,113 +1973,10 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                          }
                      }
                  }
+                 formula.setFormula(f);
                  if(f.contains("quantity")){
-                     /*聚合*/
-              /*       Matcher m = RegexUtils.matcher(FC_REG+"(quantity)\\(([^)]+)\\)",f);
-                     while (m.find()) {
-                         Object data=null;
-                         List<String> codeList = FormulaUtils.getCodeList(m.group(2));
-                       {
-                             FormData dataFd=tec.formDataMap.get(codeList.get(0));
-                             String designStr=codeList.get(1);
-                             FormData designFd=tec.formDataMap.get(designStr);
-                             String devStr=StringUtils.isNotEmpty(formula.getDev())?formula.getDev():fd.getEAllowDeviation();
-                             if(StringUtils.isEmpty(devStr)){
-                                 *//*数据库找不到的情况就读取Excel*//*
-                                 if(tec.wkbMap.isEmpty()){
-                                     *//*初始化*//*
-                                    List<String> tableNames4Excel=  tec.getFormDataList().stream().filter(FormData::executable).filter(e->e.info().contains("quantity")).map(FormData::getTableName).distinct().collect(Collectors.toList());
-                                    if(!tableNames4Excel.isEmpty()){
-                                        List<String> ids =tec.getTableAll().stream().filter(e->tableNames4Excel.contains(e.getInitTableName())).map(NodeTable::getPKeyId).map(String::valueOf).collect(Collectors.toList());
-                                        List<Map<String,Object>> listMaps=  this.jdbcTemplate.queryForList("select a.p_key_id pkeyId,a.init_table_name tableName,b.file_url url from m_wbs_tree_contract a join m_excel_tab b on a.excel_id=b.id where a.p_key_id in("+String.join(",",ids)+")");
-                                        listMaps.forEach(mp->{
-                                            try {
-                                                Workbook wb = WorkbookFactory.create(Objects.requireNonNull(CommonUtil.getOSSInputStream(StringUtils.handleNull(mp.get("url")))));
-                                                tec.wkbMap.put(mp.get("pkeyId").toString(),wb);
-                                            } catch (Exception e) {
-                                                e.printStackTrace();
-                                            }
-                                        });
-                                    }
-                                 }
-                                Optional<NodeTable> nodeTableOp =tec.getTableAll().stream().filter(e->e.getInitTableName().equals(fd.getTableName())).findFirst();
-                                 if(nodeTableOp.isPresent()){
-                                     Workbook wb = tec.wkbMap.get(nodeTableOp.get().getPKeyId().toString());
-                                     if(wb!=null){
-                                         Cell deCell=null;
-                                         Sheet sheet = wb.getSheetAt(0);
-                                         outerLoop: for(int y=3;y<35;y++){
-                                             for(int x=0;x<35;x++){
-                                                 Row row = sheet.getRow(y);
-                                                 Cell cell=  row.getCell(x);
-                                                 String sv=StringUtils.handleNull(FormulaUtils.getValue(cell)).replaceAll("[^\u4e00-\u9fa5]+","");
-                                                 if(sv.contains("规定")&&sv.contains("偏差")){
-                                                     deCell=cell;
-                                                     break outerLoop;
-                                                 }
-                                             }
-                                         }
-                                         if(deCell!=null) {
-                                             int min = 0;
-                                             Optional<Integer> op = fd.getCoordsList().stream().map(Coords::getY).distinct().min(Comparator.comparingInt(e -> e));
-                                             if (op.isPresent()) {
-                                                 min = op.get();
-                                             }
-                                             Row row = sheet.getRow(min);
-                                             Cell cell = row.getCell(deCell.getColumnIndex());
-                                             devStr = FormulaUtils.getValue(cell).toString();
-                                         }
-                                     }
-                                 }
-                             }
-                             if(CustomFunction.containsZH(devStr)||StringUtils.isEmpty(devStr)||StringUtils.handleNull(devStr).contains("/")){
-                                 devStr="±100000";
-                             }
-                             if(devStr.contains("E[")){
-                                List<String> codes= getCodeByEl(devStr);
-                                Map<String,Object> map = new HashMap<>();
-                                boolean isNull=false;
-                                for (String c:codes){
-                                    FormData ffd= tec.getFormDataMap().get(c);
-                                    if(ffd.empty()){
-                                        isNull=true;
-                                        break;
-                                    } else{
-                                        map.put("E["+c+"]",ffd.getRawValue().stream().filter(StringUtils::isNotEmpty).findFirst().orElse(null)) ;
-                                    }
-                                }
-                               if(isNull){
-                                   devStr="±100000";
-                               }
-                               devStr= Arrays.stream(devStr.replaceAll("^\\[|\\]$","").split(",")).map(s->map.getOrDefault(s,s)).map(StringUtils::handleNull).collect(Collectors.joining(","));
-                             }
-                             *//*设计值可以是数值类型,或空(等效0)*//*
-                             if(dataFd!=null){
-                                    List<Object> values= dataFd.getRawValue();
-                                    boolean nonNumeric=values.stream().filter(StringUtils::isNotEmpty).anyMatch(e->!StringUtils.isNumber(e));
-                                 if(nonNumeric){
-                                   data=values.stream().filter(StringUtils::isNotEmpty).count();
-                                 }else if(designFd!=null){
-                                     if(dataFd.getValues().stream().map(ElementData::getValue).anyMatch(StringUtils::isNotEmpty)&&(designFd.getValues().size()>1||designFd.getValues().stream().map(ElementData::getValue).anyMatch(StringUtils::isEmpty))){
-                                         *//*多少个设计值暂时默认全部合格,满足绝大部分结果*//*
-                                         data=dataFd.getValues().stream().map(ElementData::getValue).filter(StringUtils::isNotEmpty).count();
-                                     }else{
-                                         List<Object>  result =  CustomFunction.b445check(dataFd.getValues().stream().map(ElementData::getValue).collect(Collectors.toList()),designFd.getValues().stream().map(ElementData::getValue).collect(Collectors.toList()),devStr,1 );
-                                         data=result.get(1);
-                                     }
-                                 }else if(BaseUtils.isNumber(designStr)) {
-                                     List<Object> result = CustomFunction.b445check(dataFd.getValues().stream().map(ElementData::getValue).collect(Collectors.toList()), 0, devStr, 1);
-                                     data = result.get(1);
-                                 }
-                             }
-                         }
-                         f = f.replace(m.group(),putDataWithKey(BaseUtils.isNumber(data)?Double.parseDouble(data.toString()):data));
-                     }
-                     fd.getFormula().setFormula(f);
-                     formula.setScale(1);*/
                      quantity(formula,fd,f);
                  }
-                 formula.setFormula(f);
              }catch (Exception e){
                  tec.getLog().put(FormulaLog.OTHER,e.getMessage());
                  e.printStackTrace();
@@ -2362,10 +2259,14 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             fds.removeIf(f->f.getCoordsList().size()!=1);
             /*工序节点*/
             WbsTreeContract node = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getId, wtc.getParentId()).eq(WbsTreeContract::getContractId,wtc.getContractId()));
+            Long privatePkeyId=node.getIsTypePrivatePid();
             /*项目节点*/
-            WbsTreePrivate wtp = this.wtpId(node.getPKeyId());
+            if(privatePkeyId==null) {
+                WbsTreePrivate wtp = this.wtpId(node.getPKeyId());
+                privatePkeyId=wtp.getPKeyId();
+            }
             /*WBS*/
-            WbsTreePrivate publicWtp = this.getOriginWtp(wtp.getPKeyId());
+            WbsTreePrivate publicWtp = this.getOriginWtp(privatePkeyId);
 
             Map<String,Object> result = new HashMap<>(100);
             List<WbsParam> total = new ArrayList<>();
@@ -2373,7 +2274,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             if(Func.isNotEmpty(wpsPublic)){
                 total.addAll(wpsPublic);
             }
-            List<WbsParam> wpsPrivate = this.wpService.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId,wtp.getPKeyId()).eq(WbsParam::getType,1));
+            List<WbsParam> wpsPrivate = this.wpService.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId,privatePkeyId).eq(WbsParam::getType,1));
             if(Func.isNotEmpty(wpsPrivate)){
                 total.addAll(wpsPrivate);
             }
@@ -2382,25 +2283,25 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 for(WbsParam p:total){
                     result.put(p.getK(),p.getV());
                 }
+            }else{
+                return;
             }
-          Map<Long,String> paramIdKeyMap=  total.stream().collect(Collectors.toMap(WbsParam::getId,WbsParam::getK));
             /*元素动态绑定*/
             Map<String,Formula> formulaIdMap = this.wpService.formulaKeyMap(total.stream().map(WbsParam::getK).collect(Collectors.toList()));
             /*获取已配置节点公式*/
-            if(Func.isNotEmpty(total)){
-                List<ElementFormulaMapping> mappingList =  this.elementFormulaMappingService.list(Wrappers.<ElementFormulaMapping>lambdaQuery().in(ElementFormulaMapping::getParamId,total.stream().map(WbsParam::getId).collect(Collectors.toList())));
-                if(Func.isNotEmpty(mappingList)){
-                    fds.forEach(e->{
-                        mappingList.stream().filter(m->StringUtils.isEquals(m.getElementId(),e.getId())).findAny().ifPresent(d->{
-                            String key = paramIdKeyMap.get(d.getParamId());
-                            Formula formula=formulaIdMap.computeIfAbsent(key,k->this.getById(d.getFormulaId()));
-                            if(formula!=null){
-                                e.setFormulaId(formula.getId());
-                                e.setFormula(formula);
-                            }
-                        });
+            Map<Long,String> paramIdKeyMap=  total.stream().collect(Collectors.toMap(WbsParam::getId,WbsParam::getK));
+            List<ElementFormulaMapping> mappingList =  this.elementFormulaMappingService.list(Wrappers.<ElementFormulaMapping>lambdaQuery().in(ElementFormulaMapping::getParamId,total.stream().map(WbsParam::getId).collect(Collectors.toList())));
+            if(Func.isNotEmpty(mappingList)){
+                fds.forEach(e->{
+                    mappingList.stream().filter(m->StringUtils.isEquals(m.getElementId(),e.getId())).findAny().ifPresent(d->{
+                        String key = paramIdKeyMap.get(d.getParamId());
+                        Formula formula=formulaIdMap.computeIfAbsent(key,k->this.getById(d.getFormulaId()));
+                        if(formula!=null){
+                            e.setFormulaId(formula.getId());
+                            e.setFormula(formula);
+                        }
                     });
-                }
+                });
             }
             /*检查是否可以自动绑定参数公式*/
             List<FormData> notFormulaFds=fds.stream().filter(f->f.getFormulaId()==null).collect(Collectors.toList());
@@ -2421,31 +2322,34 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     });
                 });
             }
-            /*执行结果放回数据集合*/
-            Map<String,Object> currentMap = new HashMap<>(30);
-            /*获取祖先联链*/
-            List<WbsTreeContract> nodes =this.wpService.tracing(node.getPKeyId());
-            currentMap.put(CHAIN,nodes.stream().map(e->StringUtils.isNotEmpty(e.getFullName())?e.getFullName():e.getNodeName()).collect(Collectors.toList()));
-            /*节点参数*/
-            currentMap.put(WP,result);
-            fds.forEach(fd->{
-                if(fd.executable()){
-                    String tmp =fd.getFormula().getFormula().replaceAll("[\\s]+","");
-                    tmp = tmp.replace(FC, CustomFunction.CLASS_CALL);
-                    if(tmp.contains("WP[")){
-                        Matcher am = AP.matcher(tmp);
-                        while (am.find()){
-                            tmp = tmp.replace(am.group(),am.group(1)+"['"+am.group(2)+"']");
+            fds.removeIf(f->f.getFormula()==null);
+            if(fds.size()>0) {
+                /*执行结果放回数据集合*/
+                Map<String, Object> currentMap = new HashMap<>(30);
+                /*获取祖先联链*/
+                List<WbsTreeContract> nodes = this.wpService.tracing(node.getPKeyId());
+                currentMap.put(CHAIN, nodes.stream().map(e -> StringUtils.isNotEmpty(e.getFullName()) ? e.getFullName() : e.getNodeName()).collect(Collectors.toList()));
+                /*节点参数*/
+                currentMap.put(WP, result);
+                fds.forEach(fd -> {
+                    if (fd.executable()) {
+                        String tmp = fd.getFormula().getFormula().replaceAll("[\\s]+", "");
+                        tmp = tmp.replace(FC, CustomFunction.CLASS_CALL);
+                        if (tmp.contains("WP[")) {
+                            Matcher am = AP.matcher(tmp);
+                            while (am.find()) {
+                                tmp = tmp.replace(am.group(), am.group(1) + "['" + am.group(2) + "']");
+                            }
+                        }
+                        Object data = Expression.parse(tmp).calculate(currentMap);
+                        if (StringUtils.isNotEmpty(data)) {
+                            Coords coords = fd.getCoordsList().get(0);
+                            /*计算结果放回结果集 */
+                            dataMap.put(fd.getKey() + "__" + coords.getY() + "_" + coords.getX(), data);
                         }
                     }
-                    Object data =Expression.parse(tmp).calculate(currentMap);
-                    if(StringUtils.isNotEmpty(data)){
-                        Coords coords=fd.getCoordsList().get(0);
-                        /*计算结果放回结果集 */
-                        dataMap.put(fd.getKey()+"__"+coords.getY()+"_"+coords.getX(),data);
-                    }
-                }
-            });
+                });
+            }
             stopWatch.stop();
             long totalTime = stopWatch.getTotalTimeMillis();
             StaticLog.info("表单公式执行用时:{}", totalTime);

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

@@ -120,7 +120,12 @@ public class SignPfxFileServiceImpl extends BaseServiceImpl<SignPfxFileMapper, S
                 makeSeal.setSealName(EVisaConstant.SIGN_SEAL_NAME + user.getAccount());
                 makeSeal.setSealPassword(user.getId().toString().substring(0, EVisaConstant.USER_ID_SUB));
                 //注册印模
-                return R.data(this.pfxMakeSeal(makeSeal, "个人签名印章", id.toString()));
+                Boolean seal = this.pfxMakeSeal(makeSeal, "个人签名印章", id.toString());
+                if (seal == true){
+                    return R.data(true);
+                }else {
+                    return R.data(-1, false, "创建印模失败");
+                }
             }
 
         } else {
@@ -154,7 +159,7 @@ public class SignPfxFileServiceImpl extends BaseServiceImpl<SignPfxFileMapper, S
             }
         }
 
-        return R.data(false);
+        return R.data(-1, false, "注册失败");
     }
 
     /**

+ 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);
     }
 

+ 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;