Ver código fonte

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

huangtf 5 meses atrás
pai
commit
9d35540f7d
42 arquivos alterados com 1851 adições e 1199 exclusões
  1. 1 1
      blade-common/src/main/java/org/springblade/common/utils/AsyncConfigurer.java
  2. 6 3
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java
  3. 6 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO2.java
  4. 6 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ScrSignInfoVO.java
  5. 3 1
      blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/vo/CertBeanVO.java
  6. 22 0
      blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/vo/SignKeyVO.java
  7. 8 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ProjectInfo.java
  8. 9 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ApiTaskPageVo.java
  9. 11 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/config/sqliteConfig.java
  10. 6 6
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveOfflineVersionInfoController.java
  11. 2 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  12. 12 7
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveOfflineVersionInfoServiceImpl.java
  13. 35 9
      blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileUtils.java
  14. 618 596
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  15. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml
  16. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/FixedFlowLinkMapper.xml
  17. 36 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ArchiveFileServiceImpl.java
  18. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/FixedFlowServiceImpl.java
  19. 4 4
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVController.java
  20. 3 2
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ScrController.java
  21. 2 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/feign/EVisaClientImpl.java
  22. 98 82
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVDataServiceImpl.java
  23. 2 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java
  24. 68 43
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/ScrDataServiceImpl.java
  25. 10 2
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/PdfAddimgUtil.java
  26. 12 9
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/PdfSignatureInfo.java
  27. 289 300
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  28. 172 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  29. 0 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java
  30. 13 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java
  31. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java
  32. 6 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java
  33. 24 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  34. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java
  35. 127 72
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  36. 149 21
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/APIController.java
  37. 9 3
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java
  38. 1 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/InterimPayCertificateMapper.xml
  39. 1 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.xml
  40. 63 18
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/InterimPayCertificateItemServiceImpl.java
  41. 0 1
      blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java
  42. 11 1
      blade-service/blade-user/src/main/java/org/springblade/system/user/controller/WbsTreeController.java

+ 1 - 1
blade-common/src/main/java/org/springblade/common/utils/AsyncConfigurer.java

@@ -15,7 +15,7 @@ public class AsyncConfigurer {
     /**
      * cpu 核心数量
      */
-    public static final int cpuNum = 2 ;//Runtime.getRuntime().availableProcessors();
+    public static final int cpuNum = 5 ;//Runtime.getRuntime().availableProcessors();
 
     /**
      * 线程池配置

+ 6 - 3
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java

@@ -86,9 +86,12 @@ public class OssBuilder {
     public OssTemplateRe template(String code) {
         String tenantId = AuthUtil.getTenantId();
         Oss oss = getOss(tenantId, code);
-     //   oss.setEndpoint("http://183.247.216.148:9000/");
-        oss.setEndpoint("https://oss-cn-shenzhen.aliyuncs.com/");
-
+        String sys_isonline = ParamCache.getValue(CommonConstant.SYS_ISONLINE);
+        if(sys_isonline.equals("20")){
+            oss.setEndpoint("http://183.247.216.148:9000/");
+        }else{
+            oss.setEndpoint("https://oss-cn-shenzhen.aliyuncs.com/");
+        }
         Oss ossCached = ossPool.get(tenantId);
         OssTemplateRe template = templatePool.get(tenantId);
         // 若为空或者不一致,则重新加载

+ 6 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO2.java

@@ -32,4 +32,10 @@ public class ArchivesAutoVO2  {
 
     private String ancestors;
 
+    private String unit;
+
+    private String startDate;
+
+    private String endDate;
+
 }

+ 6 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ScrSignInfoVO.java

@@ -33,4 +33,10 @@ public class ScrSignInfoVO implements Serializable {
     @ApiModelProperty("流程节点Id")
     private String processInstanceId;
 
+    @ApiModelProperty("电签类型1:安心签 东方中讯")
+    private String remarkType;
+
+    @ApiModelProperty("电签状态 1待审批 2已审批 3废除")
+    private String status;
+
 }

+ 3 - 1
blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/vo/CertBeanVO.java

@@ -11,8 +11,10 @@ public class CertBeanVO {
     private String issuerDn = "";
     private String notBefore = "";
     private String notAfter = "";
-
     private String pdfUrl;
+    private String time;
+    private String result;
+
 
     private List<CertBeanVO> certBeanVOList;
 

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

@@ -0,0 +1,22 @@
+package org.springblade.evisa.vo;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class SignKeyVO {
+
+    /**
+     * pdf上签字key
+     */
+    private List<String> eVisaConfigList;
+    /**
+     * key来源对象
+     */
+    private Map<String,String> dataMap;
+
+}

+ 8 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ProjectInfo.java

@@ -102,6 +102,7 @@ public class ProjectInfo extends BaseEntity {
      */
     @ApiModelProperty(value = "节点状态")
     private Integer state;
+
     /**
      * 是否开启电签
      */
@@ -191,4 +192,11 @@ public class ProjectInfo extends BaseEntity {
     @ApiModelProperty(value = "wbs私有树引用wbs模板类型-计量")
     private String referenceWbsTemplateTypeMeter;
 
+        /**
+     * 模板引用 1模版节点 2底层节点
+     */
+    @ApiModelProperty(value = "模板引用 1.模版节点 2.底层节点")
+    private Integer templateType;
+
+
 }

+ 9 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ApiTaskPageVo.java

@@ -33,4 +33,13 @@ public class ApiTaskPageVo {
     @ApiModelProperty(value = "意见信息")
     private MeterApproveOpinion meterApproveOpinion;
 
+    @ApiModelProperty(value = "开始时间")
+    private String startTime;
+
+    @ApiModelProperty(value = "限时时间")
+    private String endTime;
+
+    @ApiModelProperty(value = "上报人")
+    private String taskReportUserName;
+
 }

+ 11 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/config/sqliteConfig.java

@@ -1,6 +1,8 @@
 package org.springblade.archive.config;
 
 import com.alibaba.druid.pool.DruidDataSource;
+import io.micrometer.core.instrument.binder.system.FileDescriptorMetrics;
+import org.springblade.archive.utils.FileUtils;
 import org.springframework.stereotype.Component;
 
 import javax.sql.DataSource;
@@ -12,10 +14,18 @@ import javax.sql.DataSource;
  **/
 @Component
 public class sqliteConfig {
+    private final FileDescriptorMetrics fileDescriptorMetrics;
+
+    public sqliteConfig(FileDescriptorMetrics fileDescriptorMetrics) {
+        this.fileDescriptorMetrics = fileDescriptorMetrics;
+    }
+
     public DataSource dataSource() {
         DruidDataSource ds = new DruidDataSource();
 //        ds.setUrl("jdbc:sqlite:D:\\BaiduNetdiskDownload\\bladeX后端开发手册\\data");
-        ds.setUrl("jdbc:sqlite:/www/wwwroot/Users/hongchuangyanfa/Desktop/localArchive/localClient/data");
+        String fileUrl = FileUtils.getSysLocalFileUrl();
+        ds.setUrl("jdbc:sqlite:"+fileUrl+"/localArchive/data");
+      //  ds.setUrl("jdbc:sqlite:/www/wwwroot/Users/hongchuangyanfa/Desktop/localArchive/localClient/data");
         ds.setDriverClassName("org.sqlite.JDBC");
         return ds;
     }

+ 6 - 6
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveOfflineVersionInfoController.java

@@ -44,12 +44,12 @@ public class ArchiveOfflineVersionInfoController {
     @ApiOperation(value = "打包数据")
     @GetMapping("/packData")
     public R<String> packData(Long projectId) throws Exception {
-//        //先获取状态,同时只能有一个项目打包
-//        offlineVersionInfoService.getPackStatus();
-//        //异步调用自动打包上传,完成后修改数据库信息
-//        offlineVersionInfoService.packData(projectId);
-//        return R.data("最新数据后台自动打包中,打包完成后会更新打包日期");
-        return R.data("暂时停止使用离线档案,请联系管理员");
+        //先获取状态,同时只能有一个项目打包
+        offlineVersionInfoService.getPackStatus();
+        //异步调用自动打包上传,完成后修改数据库信息
+        offlineVersionInfoService.packData(projectId);
+        return R.data("最新数据后台自动打包中,打包完成后会更新打包日期");
+        //return R.data("暂时停止使用离线档案,请联系管理员");
     }
 
     /**

+ 2 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml

@@ -440,7 +440,7 @@
     <select id="getListByProjectId" resultType="org.springblade.archive.dto.ArchivesAutoDTO">
         select *
         from u_archives_auto
-        where project_id = #{projectId} and is_deleted = 0;
+        where project_id = #{projectId} and is_deleted = 0 limit 1;
     </select>
     <select id="pageByArchivesAuto" resultMap="archivesAutoResultMap">
         select uaa.*
@@ -1033,7 +1033,7 @@
     <select id="getUnitAllArchive2" resultType="org.springblade.archive.vo.ArchivesAutoVO2">
         select
                concat(matc.ancestors,',',matc.id)  as ancestors,
-               uaa.id,uaa.name,uaa.page_n ,uaa.remark ,uaa.file_number,
+               uaa.id,uaa.name,uaa.page_n ,uaa.remark ,uaa.file_number,uaa.unit,uaa.start_date,uaa.end_date,
                 (select bdb.dict_value  from blade_dict_biz bdb WHERE bdb.is_sealed = 0 and bdb.code = 'storage_period' and bdb.dict_key = uaa.storage_time limit 1 ) as storageTimeValue
         from m_archive_tree_contract matc right join u_archives_auto uaa on matc.id = uaa.node_id
         WHERE uaa.is_deleted = 0 and matc.is_deleted = 0 and uaa.is_apply = #{isApply} and matc.ancestors like concat("%",#{firstNode},"%")

+ 12 - 7
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveOfflineVersionInfoServiceImpl.java

@@ -67,9 +67,10 @@ public class ArchiveOfflineVersionInfoServiceImpl extends BaseServiceImpl<Archiv
 //        String localUrl = "/www/wwwroot/localClient/local_archives/alilib";
 //        String packUrl = "/www/wwwroot/localClient";
 //        String zipUrl = "/www/wwwroot/localClient.zip";
-        String localUrl = "/www/wwwroot/Users/hongchuangyanfa/Desktop/localArchive/localClient/local_archives/alilib";
-        String packUrl = "/www/wwwroot/Users/hongchuangyanfa/Desktop/localArchive";
-        String zipUrl = "/www/wwwroot/Users/hongchuangyanfa/Desktop/localArchive/"+projectId;
+        String fileUrl = FileUtils.getSysLocalFileUrl();
+        String localUrl = fileUrl+"localArchive/pdf";
+        String packUrl = fileUrl+"localArchive";
+        String zipUrl = fileUrl+"localArchive/"+projectId;
         //清空url的文件夹
         CommonUtil.deleteDir(localUrl);
         //导入档案到sqlite
@@ -150,7 +151,9 @@ public class ArchiveOfflineVersionInfoServiceImpl extends BaseServiceImpl<Archiv
                     pstm.setString(8, m.getFileStorageType());
                     pstm.setString(9, m.getContainerInitTabName());
                     pstm.setString(10, m.getFieldKey());
-                    pstm.setLong(11, m.getIsType());
+
+                  //  pstm.setLong(11, m.getIsType());
+                    pstm.setLong(11, 1);
                     //添加批处理
                     pstm.addBatch();
                     if (i % 1000 == 0) {
@@ -288,7 +291,7 @@ public class ArchiveOfflineVersionInfoServiceImpl extends BaseServiceImpl<Archiv
     public void fileToSqlite(Long projectId) throws Exception {
         List<ArchiveFile> list = fileClient.getListByProjectId(projectId);
         if (list != null && list.size() > 0) {
-            String localUrl = "/www/wwwroot/Users/hongchuangyanfa/Desktop/localArchive/localClient/local_archives/alilib/";
+            String localUrl = FileUtils.getSysLocalFileUrl()+"localArchive/pdf/";
             for (ArchiveFile file : list) {
 //                if (StringUtil.isNotBlank(file.getFileUrl())) {
 //                    String fileUrl = file.getFileUrl();
@@ -304,7 +307,9 @@ public class ArchiveOfflineVersionInfoServiceImpl extends BaseServiceImpl<Archiv
                     String fileName = pdfFileUrl.substring(pdfFileUrl.lastIndexOf('/') + 1);
                     InputStream file_out = CommonUtil.getOSSInputStream(pdfFileUrl);
                     if (file_out != null) {
-                        CommonUtil.inputStreamToFile(file_out, new File(localUrl + fileName));
+                       String localFileUrl = localUrl + fileName;
+                        File lofile=new File(localFileUrl);
+                        CommonUtil.inputStreamToFile(file_out, lofile);
                         file.setPdfFileUrl(fileName);
                     }
                 }
@@ -400,7 +405,7 @@ public class ArchiveOfflineVersionInfoServiceImpl extends BaseServiceImpl<Archiv
     public void autoToSqlite(Long projectId) {
         List<ArchivesAutoDTO> list = autoMapper.getListByProjectId(projectId);
         if (list != null && list.size() > 0) {
-            String localUrl = "/www/wwwroot/Users/hongchuangyanfa/Desktop/localArchive/localClient/local_archives/alilib/";
+            String localUrl = "/www/wwwroot/Users/hongchuangyanfa/Desktop/localArchive/pdf/";
             //拼接档案里文件的pdf设置allPdf
 //            for (ArchivesAutoDTO dto : list) {
 //                List<ArchiveFile> files = fileClient.getArchiveFileByArchivesId(dto.getId() + "", "");

+ 35 - 9
blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileUtils.java

@@ -130,6 +130,41 @@ public class FileUtils {
         }
     }
 
+    public static String getSysLocalFileUrl() {
+        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        String sys_isonline = ParamCache.getValue(CommonConstant.SYS_ISONLINE);
+
+        if (sys_isonline.equals("1")) { //正式环境
+            if (SystemUtils.isMacOs()) {
+                file_path = "/Users/hongchuangyanfa/Desktop/";
+            } else if (SystemUtils.isWindows()) {
+                file_path = "C://upload//";
+            }
+        } else if (sys_isonline.equals("2")) { //109测试环境
+            if (SystemUtils.isMacOs()) {
+                file_path = "/www/wwwroot/Users/hongchuangyanfa/Desktop/";
+            } else if (SystemUtils.isWindows()) {
+                file_path = "C://upload//";
+            }
+        } else if (sys_isonline.equals("20")) { //183
+            if (SystemUtils.isLinux()) {
+                file_path = "/home/www/wwwroot/Users/hongchuangyanfa/Desktop/";
+            } else if (SystemUtils.isMacOs()) {
+                file_path = "/Users/hongchuangyanfa/Desktop/";
+            } else if (SystemUtils.isWindows()) {
+                file_path = "C://upload//";
+            }
+        } else {  //本地环境
+            if (SystemUtils.isMacOs()) {
+                file_path = "/Users/hongchuangyanfa/Desktop/";
+            } else if (SystemUtils.isWindows()) {
+                file_path = "C://upload//";
+            }
+        }
+        return file_path;
+    }
+
+
     /**
      * 压缩图片
      */
@@ -773,15 +808,6 @@ public class FileUtils {
         return ossPath;
     }
 
-    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;
-    }
 
     public static void main11(String[] args) {
        /* SpeechRecognizerDemo demo = new SpeechRecognizerDemo(appKey, id, secret, url);

Diferenças do arquivo suprimidas por serem muito extensas
+ 618 - 596
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java


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

@@ -331,7 +331,7 @@
     <select id="getListByProjectId" resultType="org.springblade.business.entity.ArchiveFile">
         select *
         from u_archive_file
-        where project_id = #{projectId} and is_deleted = 0;
+        where project_id = #{projectId} and is_deleted = 0 LIMIT 10;
     </select>
     <select id="getAllArchiveFileByContractType" resultType="org.springblade.business.vo.ArchiveFileVO">
         SELECT uaf.*, matc.tree_code as 'contractType'

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/FixedFlowLinkMapper.xml

@@ -31,7 +31,7 @@
     </update>
 
     <select id="selectFixedFlowLink" resultMap="fixedFlowLinkResultMap">
-        select id, fixed_flow_link_user, fixed_flow_link_user_name
+        select id, fixed_flow_link_user, fixed_flow_link_user_name,fixed_flow_link_type
         from u_fixed_flow_link
         where is_deleted = 0
           and fixed_flow_id = #{fixedFlowId}

+ 36 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ArchiveFileServiceImpl.java

@@ -6,6 +6,8 @@ import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.archive.feign.ArchiveInspectionInfoClient;
 import org.springblade.business.entity.ArchiveFile;
+import org.springblade.business.entity.Task;
+import org.springblade.business.entity.TaskParallel;
 import org.springblade.business.vo.ArchiveFileVO;
 import org.springblade.business.mapper.ArchiveFileMapper;
 import org.springblade.business.service.IArchiveFileService;
@@ -16,6 +18,8 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
@@ -38,6 +42,8 @@ public class ArchiveFileServiceImpl extends BaseServiceImpl<ArchiveFileMapper, A
 
     private ExecutorService executorService;
     private final ArchiveInspectionInfoClient archiveInspectionInfoClient;
+    private final JdbcTemplate   jdbcTemplate;
+
 
     @Override
     public IPage<ArchiveFileVO> selectArchiveFilePage(ArchiveFileVO vo) {
@@ -162,10 +168,39 @@ public class ArchiveFileServiceImpl extends BaseServiceImpl<ArchiveFileMapper, A
             if (Func.isNotEmpty(vo.getIsNeedCertification()) && vo.getIsNeedCertification() == 0){
                 vo.setIsCertification(1);
             }
-            //循环查看是否把需要审批改为不需要审批,  不可能把不需要审批改为需要审批
+            //循环查看是否把需要审批改为不需要审批,  不可能把不需要审批改为需要审批 ,0不需要,1需要
             if (vo.getStatus() == 0 && vo.getIsApproval() == 0) {
                 vo.setStatus(2);
             }
+            if(vo.getIsApproval() == 1){
+                Set<String> aopParamsSet = new HashSet<>();
+                //判断现在的数据是否是待审批数据,只有上报状态、未认证状态的数据才能撤销
+                ArchiveFile archiveFile = jdbcTemplate.queryForObject("select * from u_archive_file where id = " + vo.getId(), new BeanPropertyRowMapper<>(ArchiveFile.class));
+                if (archiveFile != null) {
+                    if (archiveFile.getIsApproval() != null && archiveFile.getIsApproval() == 0) {
+                        //此文件为不需要审批文件,所以没有任务信息,直接修改状态
+                        jdbcTemplate.execute("update u_archive_file set status = 3,is_certification = 0,e_visa_file = null where id = " + vo.getId());
+                    } else {
+                        /*此处任务会查询出多条,因为存在多次废除任务,那么form_data_id指向同一个id,所以在新增的时候去重判断,status=1或2,有且只有一条*/
+                        Task task = jdbcTemplate.query("select id,status,process_instance_id from u_task where task_create_timestamp is not null and status in (1,2) and form_data_id = '" + vo.getId() + "'", new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
+                        if (task != null) {
+                            //修改档案文件收集业务数据状态=已废除
+                            jdbcTemplate.execute("update u_archive_file set status = 3,is_certification = 0,e_visa_file = null where id = " + vo.getId());
+                            //待审批审批任务=已废除
+                            jdbcTemplate.execute("update u_task set status = 3 where id = " + task.getId());
+                            //审批任务详情=已废除
+                            jdbcTemplate.execute("update u_task_parallel set status = 3 where process_instance_id = '" + task.getProcessInstanceId() + "'");
+                            /*通知*/
+                            List<TaskParallel> taskParallelList = jdbcTemplate.query("SELECT task_user FROM u_task_parallel WHERE process_instance_id = '" + task.getProcessInstanceId() + "'", new BeanPropertyRowMapper<>(TaskParallel.class));
+                            for (TaskParallel taskParallel : taskParallelList) {
+                                String param = taskParallel.getTaskUser() + "," + vo.getProjectId() + "," + vo.getContractId();
+                                aopParamsSet.add(param);
+                            }
+                        }
+                    }
+                }
+                vo.setStatus(0);
+            }
         }
         this.updateBatchById(JSONArray.parseArray(JSONObject.toJSONString(list), ArchiveFile.class));
     }

+ 1 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/FixedFlowServiceImpl.java

@@ -62,6 +62,7 @@ public class FixedFlowServiceImpl extends BaseServiceImpl<FixedFlowMapper, Fixed
                 links.forEach(link -> linkJoin.append(",").append(link.getFixedFlowLinkUserName()));
                 //去掉第一个逗号
                 vos.setLinkUserJoinString(linkJoin.substring(1));
+                vos.setFixedFlowLinkList(links);
             }
         });
         //设置总数

+ 4 - 4
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVController.java

@@ -56,18 +56,18 @@ public class EVController {
     @Resource(name = "taskExecutor1")
     private ThreadPoolExecutor executor;
 
-   // @Scheduled(cron = "0/10 * * * * ?")
+    @Scheduled(cron = "0/10 * * * * ?")
     public void SignInfo() {
         //执行代码
         log.info("扫描开始");
-        String sql = "SELECT *  from u_task_batch where  is_deleted=0 GROUP BY JSON_EXTRACT(json_data, '$.formDataId') ORDER BY sign_type ASC LIMIT 30  ";
+        String sql = "SELECT *  from u_task_batch where  is_deleted=0 GROUP BY JSON_EXTRACT(json_data, '$.formDataId')  ORDER BY sign_type ASC LIMIT 30  ";
 
         //String sql = "SELECT * from u_task_batch where is_deleted=0 and id=1871438158680403970 ORDER BY sign_type ASC ";
 
         List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
         if (maps != null && maps.size() >= 1 ) {
             for (Map<String, Object> dataInfo : maps) {
-                if (executor.getQueue().size()<=50 ) {
+                if (executor.getQueue().size()<=20 ) {
                     String jsonData = dataInfo.get("json_data") + "";
                     String signFormat = dataInfo.get("sign_format") + "";
                     String sigType = dataInfo.get("sign_type") + "";
@@ -82,7 +82,7 @@ public class EVController {
                     taskSignInfoVO.setSignFormat(signFormat);
                     if(sigType.equals("2")){
                         taskSignInfoVO.setSigType(2);
-                      String sql12 = "SELECT a.* from u_task a,u_task_parallel b where a.process_instance_id=b.process_instance_id and b.initiative=1 and  a.is_deleted=0 and b.is_deleted=0 and a.`status` in(1,2) and a.id="+taskSignInfoVO.getTaskId()+"";
+                      String sql12 = "SELECT a.* from u_task a,u_task_parallel b where a.process_instance_id=b.process_instance_id and b.initiative=1 and  a.is_deleted=0 and b.is_deleted=0 and a.`status` in(1,2) and a.id='"+taskSignInfoVO.getTaskId()+"'";
                       List<Map<String, Object>> maps12 = jdbcTemplate.queryForList(sql12);
                       if(maps12!=null && maps12.size()>=1){
                           jdbcTemplate.execute("delete from u_task_batch where id="+taskBatchId+"");

+ 3 - 2
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ScrController.java

@@ -45,13 +45,14 @@ public class ScrController {
     @Resource(name = "taskExecutor1")
     private ThreadPoolExecutor executor;
 
-   // @Scheduled(cron = "0/10 * * * * ?")
+    @Scheduled(cron = "0/10 * * * * ?")
     public void SignInfo() {
         //执行代码
 
         // 质检SQL
         //String sql = "SELECT a.id as ,a.e_visa_pdf_url,b.process_instance_id,a.contract_id,a.project_id from u_information_query a ,u_task b  where a.id=1848624592908722177 and a.`status` in(1,2) and a.is_deleted=0 and a.e_visa_pdf_url is not null  and b.form_data_id = a.id and b.`status` in(1,2) ";
-        String sql = "SELECT a.id ,a.e_visa_pdf_url,b.process_instance_id,a.contract_id,a.project_id  from u_information_query a ,u_task b  where a.id=1848624592908722177 and a.`status` in(1,2) and a.is_deleted=0 and a.e_visa_pdf_url is not null  and b.form_data_id = a.id and b.`status` in(1,2) ";
+        //String sql = "SELECT a.id ,a.e_visa_pdf_url,b.process_instance_id,a.contract_id,a.project_id,c.remark_type,b.status  from u_information_query a ,u_task b ,m_project_info c where a.id=1876454170165248000 and c.id=a.project_id and  (a.update_time > DATE_SUB(NOW(), INTERVAL 3 DAY) or a.create_time > DATE_SUB(NOW(), INTERVAL 3 DAY)) and a.`status` in(1,2) and a.is_deleted=0 and a.e_visa_pdf_url is not null  and b.form_data_id = a.id and b.`status` in(1,2) ";
+        String sql = "SELECT a.id ,a.e_visa_pdf_url,b.process_instance_id,a.contract_id,a.project_id,c.remark_type,b.status  from u_information_query a ,u_task b ,m_project_info c where a.id=1876454170165248000 and c.id=a.project_id  and a.`status` in(1,2) and a.is_deleted=0 and a.e_visa_pdf_url is not null  and b.form_data_id = a.id and b.`status` in(1,2) ";
 
         List<ScrSignInfoVO> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ScrSignInfoVO.class));
         if (query != null && query.size() >= 1 ) {

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

@@ -20,6 +20,8 @@ public class EVisaClientImpl implements EVisaClient {
     @Override
     public CertBeanVO onlineCheckSeal(String pdfUrl) {
         List<CertBean> beans = this.eVisaService.onlineCheckSeal(pdfUrl);
+
+
         if (beans != null && beans.size() > 0) {
             //设置返回参数
             CertBeanVO reVO = new CertBeanVO();

+ 98 - 82
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVDataServiceImpl.java

@@ -75,90 +75,106 @@ public class EVDataServiceImpl implements EVDataService {
     @Override
     public void signTaskBatch(TaskSignInfoVO taskApp) {
         //获取pdf 文件
-        this.getSignPdfInfo(taskApp);
-        if (taskApp.getSigState() != 1) {
-            return;
-        }
-
-        this.addSignatureTaskBatch(taskApp);
-
-        String fileUrl = CommonUtil.replaceOssUrl(taskApp.getSignPdfUrl());
-        List<String> eVisaConfigList = PDFUtils.getPdfSignIds(fileUrl, taskApp);
-        if (eVisaConfigList == null || eVisaConfigList.size() == 0) {
-            //没有电签配置,默认当前任务为不签字审批,返回成功
-            taskApp.setSigState(2);
-            taskApp.setSignSmg("pdf未获取到关键字Id");
-            SignBackPdfInfo(taskApp);
-            return;
-        }
-        // 获取pdf上的电签Ids
-        String ids = String.join(",", eVisaConfigList);
-        if (taskApp.getRemarkType().equals("1")) { //安心签
-            //添加电签策略
-            List<SealStrategyVO> strategyListByAXQ = getStrategyListByAXQ(taskApp, ids);
-            if(strategyListByAXQ==null || Func.isEmpty(strategyListByAXQ) || strategyListByAXQ.size()==0){
-                List<Map<String, Object>> mapList = jdbcTemplate.queryForList("SELECT * from m_textdict_info where type=6  and is_deleted=0 and id in(" + ids + ")");
-                if(mapList!=null && mapList.size()>0){
-                    taskApp.setSigState(2);
-                    taskApp.setSignSmg("未获取到签字证书信息");
-                }else{
-                    if(taskApp.getSigType()==1){
-                        taskApp.setSigState(2);
-                        taskApp.setSignSmg("未获取到签字证书信息");
-                    }else if(taskApp.getSigType()==2){
-                        taskApp.setSigState(1);
-                        taskApp.setSignSmg("签字成功");
-                        taskApp.setLastFilePdfUrl(taskApp.getSignPdfUrl());
-                    }
-                }
-                SignBackPdfInfo(taskApp);
-                return;
-            }
-
-            //调用签字逻辑
-            signTaskBatchByAXQZ(strategyListByAXQ, taskApp);
+        if (taskApp.getFlag().equals("OK")) {
+            this.getSignPdfInfo(taskApp);
             if (taskApp.getSigState() != 1) {
                 return;
             }
-            // 回归处理
-            SignBackPdfInfo(taskApp);
-            if (taskApp.getSigState() != 1) {
+            this.addSignatureTaskBatch(taskApp);
+            String fileUrl = CommonUtil.replaceOssUrl(taskApp.getSignPdfUrl());
+            List<String> eVisaConfigList = PDFUtils.getPdfSignIds(fileUrl, taskApp);
+            if (eVisaConfigList == null || eVisaConfigList.size() == 0) {
+                //没有电签配置,默认当前任务为不签字审批,返回成功
+                taskApp.setSigState(2);
+                taskApp.setSignSmg("pdf未获取到关键字Id");
+                SignBackPdfInfo(taskApp);
                 return;
             }
-        } else if (taskApp.getRemarkType().equals("2")) { //东方中讯
-            //添加电签策略
-            List<Map<String, Object>> strategyListByDFZX = getStrategyListByDFZX(taskApp, ids);
-            //调用签字逻辑
-            String s = signTaskBatchByDFZX(strategyListByDFZX, fileUrl,taskApp.getSigType());
-            if (s.contains("sucess")) {
-                taskApp.setLastFilePdfUrl(s.split("@@@@")[1]);
-                taskApp.setSigState(1);
-                taskApp.setSignSmg("电签成功");
-            } else {
-                taskApp.setSigState(2);
-                taskApp.setSignSmg("电签中失败");
+            // 获取pdf上的电签Ids
+            String ids = String.join(",", eVisaConfigList);
+            if (taskApp.getRemarkType().equals("1")) { //安心签
+                //添加电签策略
+                List<SealStrategyVO> strategyListByAXQ = getStrategyListByAXQ(taskApp, ids);
+                if (strategyListByAXQ == null || Func.isEmpty(strategyListByAXQ) || strategyListByAXQ.size() == 0) {
+                    List<Map<String, Object>> mapList = jdbcTemplate.queryForList("SELECT * from m_textdict_info where type=6  and is_deleted=0 and id in(" + ids + ")");
+                    if (mapList != null && mapList.size() > 0) {
+                        taskApp.setSigState(2);
+                        taskApp.setSignSmg("未获取到签字证书信息");
+                    } else {
+                        if (taskApp.getSigType() == 1) {
+                            taskApp.setSigState(2);
+                            taskApp.setSignSmg("未获取到签字证书信息");
+                        } else if (taskApp.getSigType() == 2) {
+                            taskApp.setSigState(1);
+                            taskApp.setSignSmg("签字成功");
+                            taskApp.setLastFilePdfUrl(taskApp.getSignPdfUrl());
+                        }
+                    }
+                    SignBackPdfInfo(taskApp);
+                    return;
+                }
+
+                //调用签字逻辑
+                signTaskBatchByAXQZ(strategyListByAXQ, taskApp);
+                if (taskApp.getSigState() != 1) {
+                    return;
+                }
+                // 回归处理
+                SignBackPdfInfo(taskApp);
+                if (taskApp.getSigState() != 1) {
+                    return;
+                }
+            } else if (taskApp.getRemarkType().equals("2")) { //东方中讯
+                //添加电签策略
+                List<Map<String, Object>> strategyListByDFZX = getStrategyListByDFZX(taskApp, ids);
+                //调用签字逻辑
+                String s = signTaskBatchByDFZX(strategyListByDFZX, fileUrl, taskApp.getSigType());
+                if (s.contains("sucess")) {
+                    taskApp.setLastFilePdfUrl(s.split("@@@@")[1]);
+                    taskApp.setSigState(1);
+                    taskApp.setSignSmg("电签成功");
+                } else {
+                    taskApp.setSigState(2);
+                    taskApp.setSignSmg("电签中失败");
+                    SignBackPdfInfo(taskApp);
+                }
+                // 回归处理
                 SignBackPdfInfo(taskApp);
             }
-            // 回归处理
-            SignBackPdfInfo(taskApp);
+        } else{ //废除
+            // 修改 主 任务 u_task 表 状态改为3
+            String up_task_par = "update u_task_parallel set status=3 where parallel_process_instance_id='"+taskApp.getParallelProcessInstanceId()+"'";
+            String up_task = "update u_task set status=3 where id='"+taskApp.getTaskId()+"'";
+            this.jdbcTemplate.execute("delete from u_task_batch where id="+taskApp.getId());
+            jdbcTemplate.execute(up_task_par);
+            jdbcTemplate.execute(up_task);
+
+            if(taskApp.getApprovalType() == 3){
+                jdbcTemplate.execute("update u_contract_log set status=0 where id='"+taskApp.getFormDataId()+"'");
+            }else if (taskApp.getApprovalType()==8) {
+                this.jdbcTemplate.execute("update u_entrust_info set status=1 where id=(SELECT wbs_id from u_information_query where id='"+taskApp.getFormDataId()+"')");
+            }else {
+                jdbcTemplate.execute("update u_information_query set e_visa_pdf_url='',status=0 where id='"+taskApp.getFormDataId()+"'");
+            }
+            RedisTemplate.delete("sign-" + taskApp.getFormDataId());
         }
     }
 
 
     public void addSignatureTaskBatch(TaskSignInfoVO taskApp) {
         // 添加签字任务
-        if(taskApp.getSigType()==1){
-            String sql = "SELECT * from u_task_batch where JSON_EXTRACT(json_data, '$.taskId')="+taskApp.getTaskId()+" and sign_type=2";
+        if (taskApp.getSigType() == 1) {
+            String sql = " SELECT * from u_task_batch where sign_type=2 and (JSON_EXTRACT(json_data, '$.taskId')='" + taskApp.getTaskId() + "' or JSON_EXTRACT(json_data, '$.taskId')=" + taskApp.getTaskId() + ")";
             List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
-            String id = SnowFlakeUtil.getId()+"";
-            if(maps==null || maps.size()==0){
-                String sql2 ="INSERT into u_task_batch(id,task_parallel_id,json_data,create_user,create_dept,create_time,update_user,update_time,status,is_deleted,nick_name,sign_format,sign_type)" +
-                        "SELECT "+id+" as id,task_parallel_id,json_data,create_user,create_dept,create_time,update_user,update_time,status,is_deleted,nick_name,sign_format,2 as sign_type from u_task_batch where id="+taskApp.getId()+"";
+            String id = SnowFlakeUtil.getId() + "";
+            if (maps == null || maps.size() == 0) {
+                String sql2 = "INSERT into u_task_batch(id,task_parallel_id,json_data,create_user,create_dept,create_time,update_user,update_time,status,is_deleted,nick_name,sign_format,sign_type)" +
+                        "SELECT " + id + " as id,task_parallel_id,json_data,create_user,create_dept,create_time,update_user,update_time,status,is_deleted,nick_name,sign_format,2 as sign_type from u_task_batch where id=" + taskApp.getId() + "";
                 jdbcTemplate.execute(sql2);
             }
         }
         // 计量签字时,需要 把 审计的任务改为已经审批
-        if(taskApp.getApprovalType()==5 || taskApp.getApprovalType()==6 || taskApp.getApprovalType()==7){
+        if (taskApp.getApprovalType() == 5 || taskApp.getApprovalType() == 6 || taskApp.getApprovalType() == 7) {
             String UPSqlJL = " update u_task_parallel a set a.e_visa_status=1,e_visa_content='电签成功',initiative=2 where sort in( SELECT a.fixed_flow_branch_sort from u_task b,u_fixed_flow_link a where b.`status` in(1,2) and b.id='" + taskApp.getTaskId() + "' and a.fixed_flow_id=b.fixed_flow_id and a.flow_task_type=2 ) and a.process_instance_id in(SELECT process_instance_id from u_task b where b.`status` in(1,2) and b.id='" + taskApp.getTaskId() + "')";
             jdbcTemplate.execute(UPSqlJL);
         }
@@ -197,7 +213,7 @@ public class EVDataServiceImpl implements EVDataService {
                         }
 
                         FileUtils.mergePdfPublicMethods(datainfo, listPdf);
-                        if("20".equals(sys_isonline) || SystemUtils.isWindows() || SystemUtils.isMacOs()){
+                        if ("20".equals(sys_isonline) || SystemUtils.isWindows() || SystemUtils.isMacOs()) {
                             BladeFile bladeFile = this.newIOSSClient.uploadFile(taskApp.getFormDataId() + ".pdf", listPdf);
                             if (bladeFile != null && Func.isNotEmpty(bladeFile.getLink())) {
                                 nodePdfUrl = bladeFile.getLink();
@@ -217,14 +233,14 @@ public class EVDataServiceImpl implements EVDataService {
                     String pdfTrialUrlPosition = "";
                     if ("2".equals(taskApp.getPdfDataType())) {
                         String taskStatus = "";
-                        if (taskApp.getSigState() == 1 && taskApp.getSigType()==1) {
+                        if (taskApp.getSigState() == 1 && taskApp.getSigType() == 1) {
                             taskStatus = "待审批";
-                        } else if (taskApp.getSigState() == 1 && taskApp.getSigType()==2) {
+                        } else if (taskApp.getSigState() == 1 && taskApp.getSigType() == 2) {
                             taskStatus = "已审批";
                         } else if (taskApp.getSigState() == 3) {
                             taskStatus = "已废除";
                         }
-                        String updTrial = "update u_trial_self_inspection_record set status="+taskApp.getSigType()+", task_status='" + taskStatus + "',pdf_url='" + taskApp.getLastFilePdfUrl() + "' where id=(select b.trial_self_inspection_record_id from u_task b,u_task_parallel c where b.process_instance_id=c.process_instance_id and b.is_deleted=0 and c.is_deleted=0 and b.status in(1,2) and parallel_process_instance_id='" + taskApp.getParallelProcessInstanceId() + "')";
+                        String updTrial = "update u_trial_self_inspection_record set status=" + taskApp.getSigType() + ", task_status='" + taskStatus + "',pdf_url='" + taskApp.getLastFilePdfUrl() + "' where id=(select b.trial_self_inspection_record_id from u_task b,u_task_parallel c where b.process_instance_id=c.process_instance_id and b.is_deleted=0 and c.is_deleted=0 and b.status in(1,2) and parallel_process_instance_id='" + taskApp.getParallelProcessInstanceId() + "')";
                         jdbcTemplate.execute(updTrial);
 
                         /**
@@ -357,7 +373,7 @@ public class EVDataServiceImpl implements EVDataService {
                     } else if ("3".equals(type)) {
                         //首件,首件的资料由三个部分组成:封面、关联资料、总结报告
                         if (StringUtils.isNotEmpty(eVisaPdfUrl) || StringUtils.isNotEmpty(pdfUrl)) {
-                            String url = eVisaPdfUrl.length()>=10 ? eVisaPdfUrl : pdfUrl;
+                            String url = eVisaPdfUrl.length() >= 10 ? eVisaPdfUrl : pdfUrl;
                             String s = getHppsToHttp(url);
                             taskApp.setSignPdfUrl(s);
                         }
@@ -368,7 +384,7 @@ public class EVDataServiceImpl implements EVDataService {
                 String eVisaPdfUrl = map.get("pdf_file_url") + ""; //签字的PDF路径
                 String pdfUrl = map.get("file_url") + ""; //合并后的PDF路径
                 if (StringUtils.isNotEmpty(eVisaPdfUrl) || StringUtils.isNotEmpty(pdfUrl)) {
-                    String url = eVisaPdfUrl.length()>=10 ? eVisaPdfUrl : pdfUrl;
+                    String url = eVisaPdfUrl.length() >= 10 ? eVisaPdfUrl : pdfUrl;
                     taskApp.setSignPdfUrl(url);
                 }
             } else if (taskApp.getApprovalType() == 3) {
@@ -376,7 +392,7 @@ public class EVDataServiceImpl implements EVDataService {
                 String eVisaPdfUrl = map.get("e_visa_pdf_url") + ""; //签字的PDF路径
                 String pdfUrl = map.get("pdf_url") + ""; //合并后的PDF路径
                 if (StringUtils.isNotEmpty(eVisaPdfUrl) || StringUtils.isNotEmpty(pdfUrl)) {
-                    String url = eVisaPdfUrl.length()>=10 ? eVisaPdfUrl : pdfUrl;
+                    String url = eVisaPdfUrl.length() >= 10 ? eVisaPdfUrl : pdfUrl;
                     taskApp.setSignPdfUrl(url);
                 }
             } else if (taskApp.getApprovalType() == 4) { //档案走自定义 搓章的问题
@@ -440,9 +456,9 @@ public class EVDataServiceImpl implements EVDataService {
         String sqlinfo = " SELECT * from ( SELECT a.id as keyWord,a.project_id,a.pyzbx ,a.pyzby,(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=" + task.getContractId() + " and user_id=" + task.getUserId() + " and c.is_deleted=0 ) ) x where x.sealId is not null ";
         if (task.getSigType() == 2) {
             sqlinfo = "SELECT a.id as keyWord,a.pyzbx,a.pyzby,b.certificate_number as sealId from m_textdict_info a ,m_sign_pfx_file b where a.sig_role_id = b.pfx_type and b.project_contract_role like '%" + task.getContractId() + "%' and a.is_deleted=0 and b.is_deleted=0 and a.type=6 and a.id in(" + ids + ")";
-            System.out.println("东方中讯--签章--"+sqlinfo);
-        }else{
-            System.out.println("东方中讯--签字--"+sqlinfo);
+            System.out.println("东方中讯--签章--" + sqlinfo);
+        } else {
+            System.out.println("东方中讯--签字--" + sqlinfo);
         }
 
         List<Map<String, Object>> maps2 = jdbcTemplate.queryForList(sqlinfo);
@@ -474,11 +490,11 @@ public class EVDataServiceImpl implements EVDataService {
     // 添加电签策略 -- 安心签
     public List<SealStrategyVO> getStrategyListByAXQ(TaskSignInfoVO task, String ids) {
         List<SealStrategyVO> sealStrategyVOS = new ArrayList<>();
-        String sqlinfo = "SELECT * from ( SELECT DISTINCT a.id,a.pyzbx ,a.pyzby,a.project_id,(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, (SELECT wide from m_sign_pfx_file where is_register=1 and certificate_user_id='" + task.getUserId() + "' and is_deleted=0  ) as wide ,(SELECT high from m_sign_pfx_file where is_register=1 and certificate_user_id='"+task.getUserId()+"' and is_deleted=0  ) as high 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=" + task.getContractId() + " and user_id=" + task.getUserId() + " and c.is_deleted=0 ) ) x where x.signature_file_url is not null and x.project_id="+task.getProjectId()+" ";
+        String sqlinfo = "SELECT * from ( SELECT DISTINCT a.id,a.pyzbx ,a.pyzby,a.project_id,(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, (SELECT wide from m_sign_pfx_file where is_register=1 and certificate_user_id='" + task.getUserId() + "' and is_deleted=0  ) as wide ,(SELECT high from m_sign_pfx_file where is_register=1 and certificate_user_id='" + task.getUserId() + "' and is_deleted=0  ) as high 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=" + task.getContractId() + " and user_id=" + task.getUserId() + " and c.is_deleted=0 ) ) x where x.signature_file_url is not null and x.project_id=" + task.getProjectId() + " ";
         if (task.getSigType() == 2) {
-            sqlinfo = "SELECT a.id,a.pyzbx,a.pyzby,b.signature_file_url,b.id as sfId,a.project_id,b.certificate_password,b.certificate_user_name,b.certificate_number ,b.wide,b.high from m_textdict_info a ,m_sign_pfx_file b where a.sig_role_id = b.pfx_type and b.project_contract_role like '%" + task.getContractId() + "%' and a.is_deleted=0 and b.is_deleted=0 and a.type=6 and a.id in(" + ids + ") and a.project_id="+task.getProjectId()+"";
+            sqlinfo = "SELECT a.id,a.pyzbx,a.pyzby,b.signature_file_url,b.id as sfId,a.project_id,b.certificate_password,b.certificate_user_name,b.certificate_number ,b.wide,b.high from m_textdict_info a ,m_sign_pfx_file b where a.sig_role_id = b.pfx_type and b.project_contract_role like '%" + task.getContractId() + "%' and a.is_deleted=0 and b.is_deleted=0 and a.type=6 and a.id in(" + ids + ") and a.project_id=" + task.getProjectId() + "";
             System.out.println("安心签--签章--=" + sqlinfo);
-        }else{
+        } else {
             System.out.println("安心签--签字--=" + sqlinfo);
         }
         List<Map<String, Object>> maps2 = jdbcTemplate.queryForList(sqlinfo);
@@ -554,7 +570,7 @@ public class EVDataServiceImpl implements EVDataService {
     }
 
     // 添加电签策略 -- 东方中讯
-    public String signTaskBatchByDFZX(List<Map<String, Object>> maps, String pdfUrl,int type) {
+    public String signTaskBatchByDFZX(List<Map<String, Object>> maps, String pdfUrl, int type) {
         if (maps != null && maps.size() > 0) {
             String fileUrl = pdfUrl;
             for (Map<String, Object> dataMap : maps) {
@@ -562,7 +578,7 @@ public class EVDataServiceImpl implements EVDataService {
                 daMa.put("keyWord", dataMap.get("keyWord"));
                 daMa.put("sealId", dataMap.get("sealId"));
                 // 设置图片显示大小
-                if(type!=2){ //章
+                if (type != 2) { //章
                     daMa.put("showHeight", 30);
                     daMa.put("showWidth", 60);
                 }
@@ -713,7 +729,7 @@ public class EVDataServiceImpl implements EVDataService {
 
     public String getHppsToHttp(String url) {
         String sys_isonline = ParamCache.getValue(CommonConstant.SYS_ISONLINE);
-        if (Func.isNotEmpty(sys_isonline) &&url.contains("https:") && sys_isonline.equals("20")) {
+        if (Func.isNotEmpty(sys_isonline) && url.contains("https:") && sys_isonline.equals("20")) {
             return url.replace("https:", "http:");
         }
         return url;

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

@@ -1732,6 +1732,7 @@ public class EVisaServiceImpl implements EVisaService {
             CompoundSealPdfListDetachedResponse compoundSealPdfListDetachedResponse = (CompoundSealPdfListDetachedResponse) responseDto;
             ResponseHead responseHead = compoundSealPdfListDetachedResponse.getHead();
             CompoundSealPdfListDetachedResponseBody responseBody = compoundSealPdfListDetachedResponse.getBody();
+
             if (ClientConstants.CODE_SUCCESS.equals(responseHead.getCode())) {
                 List<PdfBean4Response> pdfBeanList = responseBody.getPdfBeans();
                 if (pdfBeanList != null && pdfBeanList.size() > 0) {
@@ -1740,6 +1741,7 @@ public class EVisaServiceImpl implements EVisaService {
                 }
             } else {
                 logger.info("【电签模块】{}", "签章响应Response:" + compoundSealPdfListDetachedResponse);
+                System.out.println("签章响应Response:" + compoundSealPdfListDetachedResponse);
                 logger.info("【电签模块】{}", "签章响应code:" + responseHead.getCode());
                 result[0] = null;
                 result[1] = compoundSealPdfListDetachedResponse.toString();

+ 68 - 43
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/ScrDataServiceImpl.java

@@ -11,9 +11,11 @@ import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.evisa.service.ScrDataService;
 import org.springblade.evisa.utils.PdfAddimgUtil;
+import org.springblade.evisa.vo.SignKeyVO;
 import org.springblade.manager.vo.PDFIndexInfo;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
+
 import java.io.*;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -28,7 +30,7 @@ public class ScrDataServiceImpl implements ScrDataService {
     @Override
     public void sctTaskBatch(ScrSignInfoVO taskApp) throws Exception {
         // 电签检查
-
+        this.sctTaskBatch2(taskApp);
     }
 
     /**
@@ -45,11 +47,17 @@ public class ScrDataServiceImpl implements ScrDataService {
         byte[] pdfData = CommonUtil.InputStreamToBytes(inputStream);
 
         PDDocument document = PDDocument.load(inputStream2);
-        List<String> positions = PdfAddimgUtil.getPdfSignIds(pdfUrl);
+        SignKeyVO pdfSignIds = PdfAddimgUtil.getPdfSignIds(pdfUrl);
+        List<String> positions = pdfSignIds.getEVisaConfigList();
+        Map<String, String> dataMap = pdfSignIds.getDataMap();
 
         List<String> sucess = new ArrayList<>();
         String ids = String.join(",", positions);
-        List<Map<String, Object>> strategyListByDFZX = getStrategyListByDFZX(taskApp,ids);
+        List<Map<String, Object>> strategyListByDFZX = getStrategyListByDFZX(taskApp, ids);
+        if(strategyListByDFZX==null || strategyListByDFZX.size()==0){
+            System.out.println("为获取到签字的关键字");
+            return;
+        }
 
         positions = strategyListByDFZX.stream().map(map -> map.get("keyWord").toString()).collect(Collectors.toList());
         String keyWord = String.join(",", positions);
@@ -59,8 +67,8 @@ public class ScrDataServiceImpl implements ScrDataService {
         List<Map<String, Object>> list2 = strategyListByDFZX.stream().collect(
                 Collectors.collectingAndThen(
                         Collectors.toCollection(
-                                () ->new TreeSet<>(Comparator.comparing(m->m.get("keyWord").toString()))
-                        ),ArrayList::new
+                                () -> new TreeSet<>(Comparator.comparing(m -> m.get("keyWord").toString()))
+                        ), ArrayList::new
                 )
         );
 
@@ -80,68 +88,85 @@ public class ScrDataServiceImpl implements ScrDataService {
                     float imgX = rect.getLowerLeftX() + imgW / 2;
                     float imgY = rect.getLowerLeftY() + imgH / 2;
                     List<PDFIndexInfo> pdfIndexInfos = groupBy.get((i + 1) + ".0");
-
-                    for (PDFIndexInfo pdfInfo : pdfIndexInfos) {
-                        String pkeyid = pdfInfo.getPkeyid();
-
-                        float[] dataInfo = pdfInfo.getDataInfo();
-
-                        float keyX = dataInfo[1];
-                        float keyY = dataInfo[2];
-
-                        float pageHeight = page.getMediaBox().getHeight();
-                        float pageWidth = page.getMediaBox().getWidth();
-
-                        float keyw = keyX * pageWidth;
-                        float keyh = pageHeight - keyY * pageHeight;
-
-                        List<Map<String, Object>> mapList = newMap.get(pkeyid);
-                        if(mapList!=null && mapList.size()>=0){
-                            Map<String, Object> map = mapList.get(0);
-                            Float pyzbx = Func.toFloat(map.get("pyzbx"));
-                            Float pyzby = Func.toFloat(map.get("pyzby"));
-                            keyw = keyw + pyzbx;
-                            keyh = keyh + pyzby;
-                        }
-
-                        if (Math.abs(imgX - keyw) <= threshold && Math.abs(imgY - keyh) <= threshold) {
-                            sucess.add(pkeyid);
-                            break;
+                    if (pdfIndexInfos!=null && pdfIndexInfos.size() > 0) {
+                        for (PDFIndexInfo pdfInfo : pdfIndexInfos) {
+                            String pkeyid = pdfInfo.getPkeyid();
+
+                            float[] dataInfo = pdfInfo.getDataInfo();
+
+                            float keyX = dataInfo[1];
+                            float keyY = dataInfo[2];
+
+                            float pageHeight = page.getMediaBox().getHeight();
+                            float pageWidth = page.getMediaBox().getWidth();
+
+                            float keyw = keyX * pageWidth ;
+                            float keyh = pageHeight - keyY * pageHeight;
+
+                            List<Map<String, Object>> mapList = newMap.get(pkeyid);
+                            String keyData = dataMap.get(pkeyid);
+                            if (mapList != null && mapList.size() >= 0) {
+                                Map<String, Object> map = mapList.get(0);
+                                Float pyzbx = Func.toFloat(map.get("pyzbx"));
+                                Float pyzby = Func.toFloat(map.get("pyzby"));
+                                if(taskApp.getRemarkType().equals("2")){ //东方中讯
+                                    if(imgH>=100){ //个人签字
+                                        keyw = keyw + pyzbx - 20;
+                                        keyh = keyh + pyzby - 15;
+                                    }else{
+                                        keyw = keyw + pyzbx + 10;
+                                        keyh = keyh + pyzby;
+                                        if(keyData.indexOf("||")>0){
+                                            keyw += 10;
+                                        }
+                                    }
+                                }else{
+                                    keyw = keyw + pyzbx +5;
+                                    keyh = keyh + pyzby;
+                                }
+                            }
+                            if (Math.abs(imgX - keyw) <= threshold && Math.abs(imgY - keyh) <= threshold) {
+                                sucess.add(pkeyid);
+                                System.out.println("keyid="+pkeyid+"imgX:" + imgX + " keyw:" + keyw + " imgY:" + imgY + " keyh:" + keyh+"-imgH-"+imgH);
+                                break;
+                            }
                         }
                     }
                 }
             }
         }
-
         Set<String> differentElements = new HashSet<>(positions);
         // 使用retainAll方法来移除两个集合中相同的元素,留下不同的元素
         differentElements.removeAll(sucess);
 
-        System.out.println("总共:"+positions.size()+"-剩下-"+differentElements.size());
+        System.out.println(taskApp.getId() +"-"+"总共:" + positions.size() + "-剩下-" + differentElements.size());
     }
 
 
     // 添加电签策略 -- 东方中讯
-    public List<Map<String, Object>> getStrategyListByDFZX(ScrSignInfoVO taskApp,String ids) {
+    public List<Map<String, Object>> getStrategyListByDFZX(ScrSignInfoVO taskApp, String ids) {
         List<Map<String, Object>> maps = new ArrayList<>();
         List<Map<String, Object>> maps2 = new ArrayList<>();
         String sql = "select * from u_task_parallel where process_instance_id = '" + taskApp.getProcessInstanceId() + "' and initiative=2 and status=2";
         List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql);
-        if(mapList!=null && mapList.size()>0){
-            for(Map<String, Object> task : mapList){
+        if (mapList != null && mapList.size() > 0) {
+            for (Map<String, Object> task : mapList) {
                 String taskUserId = Func.toStr(task.get("task_user"));
-                String sqlinfo = " SELECT * from ( SELECT a.id as keyWord,a.project_id,a.pyzbx ,a.pyzby,(SELECT acc_code from blade_user where id='" + taskUserId + "' 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=" + taskApp.getContractId() + " and user_id=" + taskUserId + " and c.is_deleted=0 ) ) x where x.sealId is not null ";
+                String sqlinfo = " SELECT * from ( SELECT a.id as keyWord,a.project_id,a.pyzbx ,a.pyzby,(SELECT acc_code from blade_user where id='" + taskUserId + "' 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=" + taskApp.getContractId() + " and user_id=" + taskUserId + " and c.is_deleted=0 ) ) x where x.sealId is not null and x.project_id='" + taskApp.getProjectId() + "'";
+                System.out.println("扫描-签字-sql=" + sqlinfo);
                 List<Map<String, Object>> maps3 = jdbcTemplate.queryForList(sqlinfo);
                 maps2.addAll(maps3);
             }
         }
         // 添加章
-        String sqlinfo = "SELECT a.id as keyWord,a.pyzbx,a.pyzby,b.certificate_number as sealId from m_textdict_info a ,m_sign_pfx_file b where a.sig_role_id = b.pfx_type and b.project_contract_role like '%" + taskApp.getContractId() + "%' and a.is_deleted=0 and b.is_deleted=0 and a.type=6 and a.id in(" + ids + ")";
-        List<Map<String, Object>> maps3 = jdbcTemplate.queryForList(sqlinfo);
-        if(mapList!=null && mapList.size()>0){
-            maps2.addAll(maps3);
+        if (taskApp.getStatus().equals("2")) {
+            String sqlinfo = "SELECT a.id as keyWord,a.pyzbx,a.pyzby,b.certificate_number as sealId from m_textdict_info a ,m_sign_pfx_file b where a.sig_role_id = b.pfx_type and b.project_contract_role like '%" + taskApp.getContractId() + "%' and a.is_deleted=0 and b.is_deleted=0 and a.type=6 and a.id in(" + ids + ") and a.project_id=" + taskApp.getProjectId() + "";
+            System.out.println("扫描-签章-sql=" + sqlinfo);
+            List<Map<String, Object>> maps3 = jdbcTemplate.queryForList(sqlinfo);
+            if (mapList != null && mapList.size() > 0) {
+                maps2.addAll(maps3);
+            }
         }
-
         Map<String, List<Map<String, Object>>> peopleByAge = maps2.stream()
                 .collect(Collectors.groupingBy(hada -> (Func.toStr(hada.get("keyWord")))));
         for (String keyId : peopleByAge.keySet()) {

+ 10 - 2
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/PdfAddimgUtil.java

@@ -12,11 +12,13 @@ import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ResourceUtil;
+import org.springblade.evisa.vo.SignKeyVO;
 import org.springblade.manager.vo.PDFIndexInfo;
 import org.springblade.system.cache.ParamCache;
 
 import java.io.*;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -389,8 +391,11 @@ public class PdfAddimgUtil {
         return path;
     }
 
-    public static List<String>  getPdfSignIds(String pdfUrl) {
+
+    public static SignKeyVO getPdfSignIds(String pdfUrl) {
+        SignKeyVO signKeyVO = new SignKeyVO();
         List<String> eVisaConfigList = new ArrayList<>();
+        Map<String,String> dataMap = new HashMap<>();
         InputStream inputStream;
         try  {
             if(pdfUrl.indexOf("http")>=0){
@@ -416,13 +421,16 @@ public class PdfAddimgUtil {
                     }
                     if (txt.length() >= 15 && Func.isNumeric(txt)) {
                         eVisaConfigList.add(txt);
+                        dataMap.put(txt,textStr);
                     }
                 }
             }
 
             List<String> unique = eVisaConfigList.stream().distinct().collect(Collectors.toList());
             document.close();
-            return unique;
+            signKeyVO.setEVisaConfigList(unique);
+            signKeyVO.setDataMap(dataMap);
+            return signKeyVO;
         }catch (Exception e){
             e.printStackTrace();
             return null;

+ 12 - 9
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/PdfSignatureInfo.java

@@ -8,6 +8,7 @@ import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.evisa.vo.SignKeyVO;
 import org.springblade.manager.vo.PDFIndexInfo;
 
 import java.io.File;
@@ -22,8 +23,8 @@ public class PdfSignatureInfo{
 
 
     //
-    public static void main11(String[] args) throws IOException {
-        String pdfUrl = "/Users/hongchuangyanfa/Downloads/727dd864f9569e802692294f9b8fbb97.pdf";
+    public static void main123(String[] args) throws IOException {
+        String pdfUrl = "/Users/hongchuangyanfa/Downloads/037128298ffe28b74ee32781fb2d5a6c.pdf";
         PDDocument document = PDDocument.load(new File(pdfUrl));
         for (int i=0 ;i<document.getPages().getCount();i++) {
             PDPage page = document.getPage(i);
@@ -35,14 +36,14 @@ public class PdfSignatureInfo{
                     float imgW = rect.getWidth();
                     float imgH = rect.getHeight();
                     float imgX = rect.getLowerLeftX() + imgW / 2;
-                    float imgY = rect.getLowerLeftY() + imgH / 2;
+                    float imgY = rect.getLowerLeftY()+ imgH / 2;
 
                     System.out.println("imgX:"+imgX+"--imgY:"+imgY+"--imgW:"+imgW+"--imgH:"+imgH);
                 }
             }
         }
 
-        String ids = "1847105950746411008";
+        String ids = "1881525426422022144";
         byte[] pdfData = CommonUtil.InputStreamToBytes(new FileInputStream(new File(pdfUrl)));
         List<PDFIndexInfo> pdfIndexInfo = PdfAddimgUtil.findKeywordPostions(pdfData, ids);
         for (PDFIndexInfo pdfInfo : pdfIndexInfo) {
@@ -55,16 +56,17 @@ public class PdfSignatureInfo{
             float pageHeight = page.getMediaBox().getHeight();
             float pageWidth = page.getMediaBox().getWidth();
 
-            float keyw = keyX * pageWidth + (-15);
-            float keyh = pageHeight - keyY * pageHeight + 36;
+            float keyw = keyX * pageWidth +10;
+            float keyh = pageHeight - keyY * pageHeight-5;
             System.out.println("pkeyid:"+pkeyid+"--keyw:"+keyw+"--keyh:"+keyh);
+
         }
     }
 
 
 
-    public static void main2(String[] args) throws Exception {
-        String pdfUrl = "/Users/hongchuangyanfa/Downloads/277af927eb766a06186397d46fd9c4ce.pdf";
+    public static void main23(String[] args) throws Exception {
+        String pdfUrl = "/Users/hongchuangyanfa/Downloads/6790a9294ea79afb7514d14b5d77c3fd.pdf";
         //阈值
         int threshold = 5 ;
         File file = new File(pdfUrl);
@@ -73,7 +75,8 @@ public class PdfSignatureInfo{
         byte[] pdfData = CommonUtil.InputStreamToBytes(new FileInputStream(new File(pdfUrl)));
 
         PDDocument document = PDDocument.load(new File(pdfUrl));
-        List<String> positions = PdfAddimgUtil.getPdfSignIds(pdfUrl);
+        SignKeyVO pdfSignIds = PdfAddimgUtil.getPdfSignIds(pdfUrl);
+        List<String> positions = pdfSignIds.getEVisaConfigList();
 
         List<String> sucess = new ArrayList<>();
         String ids = String.join(",", positions);

Diferenças do arquivo suprimidas por serem muito extensas
+ 289 - 300
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java


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

@@ -1,5 +1,6 @@
 package org.springblade.manager.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@@ -20,6 +21,7 @@ import org.springblade.core.tool.support.Kv;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.manager.dto.NameRuleDto;
 import org.springblade.manager.dto.WbsTreePrivateDTO2;
 import org.springblade.manager.dto.WbsTreePrivateDTO3;
 import org.springblade.manager.entity.*;
@@ -56,6 +58,7 @@ public class WbsTreePrivateController extends BladeController {
     private final IWbsFormElementService wbsFormElementService;
     private final IExcelTabService iExcelTabService;
     private final JdbcTemplate jdbcTemplate;
+    private final IWbsParamService iWbsParamService;
 
     /**
      * 保存项目日志划分
@@ -785,13 +788,10 @@ public class WbsTreePrivateController extends BladeController {
     @ApiOperationSupport(order = 30)
     @ApiOperation(value = "节点关联", notes = "节点关联")
     @RequestMapping(value = "/link-node-tree", method = RequestMethod.POST)
-    public R linkNodeTree(@RequestParam String pkeyid,@RequestParam String nodeids) {
+    public R linkNodeTree(@RequestParam String pkeyid, @RequestParam(required = false) String nodeids) {
         if(pkeyid==null || StringUtil.isEmpty(pkeyid) ){
             return R.fail("pkeyid不能为null");
         }
-        if(nodeids==null || StringUtil.isEmpty(nodeids) ){
-            return R.fail("nodeids不能为null");
-        }
         int i = wbsTreePrivateService.linkNodeTreeInfo(pkeyid, nodeids);
         return R.success("操作成功");
     }
@@ -829,4 +829,172 @@ public class WbsTreePrivateController extends BladeController {
         return wbsTreePrivateService.getExcelHtmlEntrust(nodeId,contractId);
     }
 
+//    @GetMapping("/getNameRule")
+//    @ApiOperationSupport(order = 33)
+//    @ApiOperation(value = "获取题名规则",notes = "获取题名规则")
+//    public R<List<NameRuleVo>> getNameRule(@RequestParam Long projectId){
+//        List<WbsParamVo2> list = iWbsParamService.selectNameRule(projectId);
+//        if(list.size()>0){
+//            Map<Long, List<WbsParamVo2>> map = list.stream()
+//                .collect(Collectors.groupingBy(WbsParamVo2::getNameId));
+//            List<NameRuleVo> vos=new ArrayList<>();
+//            for (Map.Entry<Long, List<WbsParamVo2>> entry : map.entrySet()) {
+//                NameRuleVo vo = new NameRuleVo();
+//                vo.setNameId(entry.getKey());
+//                vo.setNameVaule(entry.getValue().get(0).getV());
+//                vo.setNameRule(getNameRuleV1(entry.getValue().get(0).getV()));
+//                vo.setType(entry.getValue().get(0).getNameType());
+//                List<NameRuleVo1>vo1s=new ArrayList<>();
+//                for (WbsParamVo2 param : entry.getValue()) {
+//                    vo1s.add(new NameRuleVo1(param.getNodeId(),param.getNodeName()));
+//                }
+//                vo.setList(vo1s);
+//                vos.add(vo);
+//            }
+//            return R.data(vos);
+//        }
+//        return R.success("暂无题名规则");
+//    }
+//
+//    @GetMapping("/getTitleRange")
+//    @ApiOperationSupport(order = 33)
+//    @ApiOperation(value = "获取题名范围",notes = "获取题名范围")
+//    public R<List<TitleRangeVo>> getTitleRange(@RequestParam String projectId){
+//        List<WbsTreePrivate>list=wbsTreeService.getTitleRange(projectId);
+//        List<WbsParam> list1 = iWbsParamService.getBaseMapper().selectList(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getK, "FILE_TITLE").eq(WbsParam::getProjectId, projectId));
+//        if(list1.size()>0){
+//            List<Long> longs = list1.stream().map(l -> l.getNodeId()).collect(Collectors.toList());
+//            //判断是否已经被选中
+//            for (WbsTreePrivate wbsTreePrivate : list) {
+//                if(longs.contains(wbsTreePrivate.getId())){
+//                    wbsTreePrivate.setStatus(11);
+//                }
+//            }
+//        }
+//        return R.data(list.stream()
+//            .map(wbsTreePrivate -> {
+//                TitleRangeVo titleRangeVo = new TitleRangeVo();
+//                titleRangeVo.setId(wbsTreePrivate.getId());
+//                titleRangeVo.setNodeName(wbsTreePrivate.getNodeName());
+//                titleRangeVo.setStatus(wbsTreePrivate.getStatus());
+//                return titleRangeVo;
+//            })
+//            .collect(Collectors.toList()));
+//    }
+//
+//    @PostMapping("/saveOrUpdateNameRule")
+//    @ApiOperationSupport(order = 34)
+//    @ApiOperation(value = "新增或修改文件题名规则",notes = "新增或修改题名规则")
+//    public R saveOrUpdateNameRule(@RequestBody List<NameRuleDto> nameRuleDtos){
+//        if(nameRuleDtos!=null){
+//            for (NameRuleDto dto : nameRuleDtos) {
+//                WbsParam param = new WbsParam();
+//                param.setName("文件题名");
+//                param.setK("FILE_TITLE");
+//                param.setV(sortNameRule(dto.getNameRule()));
+//                param.setType(11);
+//                param.setProjectId(dto.getProjectId());
+//                param.setNameId(SnowFlakeUtil.getId());
+//                param.setNameType(dto.getType());
+//                //如果nameID不为空,先删除在保存
+//                if(dto.getNameId()!=null){
+//                    iWbsParamService.getBaseMapper().delete(new QueryWrapper<WbsParam>().eq("name_id",dto.getNameId()));
+//                }
+//                if(dto.getType()==1){
+//                    List<WbsTreePrivate>list=wbsTreeService.getTitleRange(dto.getProjectId()+"");
+//                    if(list.size()>0){
+//                        dto.setNodeId(list.stream()
+//                            .map(item -> String.valueOf(item.getId()))
+//                            .collect(Collectors.joining(",")));
+//                    }
+//                }
+//                String[] nodeIds = dto.getNodeId().split(",");
+//                if(nodeIds.length>0){
+//                    for (String nodeId : nodeIds) {
+//                        WbsParam p=new WbsParam();
+//                        BeanUtils.copyProperties(param,p);
+//                        p.setNodeId(Long.parseLong(nodeId));
+//                        iWbsParamService.getBaseMapper().insert(p);
+//                    }
+//                }else {
+//                    return R.fail("操作失败");
+//                }
+//            }
+//            return R.success("操作成功");
+//        }
+//        return R.fail("操作失败");
+//    }
+//
+//
+//
+//    /**
+//     * 删除文件题名规则
+//     * @return
+//     */
+//    @GetMapping("/deletedNameRule")
+//    @ApiOperationSupport(order = 35)
+//    @ApiOperation(value = "删除文件题名规则",notes = "删除文件题名规则")
+//    public R deletedNameRule(@RequestParam Long nameId){
+//        if(nameId!=null){
+//            int result = iWbsParamService.getBaseMapper().delete(new QueryWrapper<WbsParam>().eq("name_id", nameId));
+//            if(result>=1){
+//                return R.success("操作成功");
+//            }
+//        }
+//        return R.fail("操作失败");
+//    }
+//
+//    /**
+//     * 对文件题名规则排序
+//     * @return
+//     */
+//    public String sortNameRule(String rule){
+//        String[] codes = rule.split("-");
+//        Arrays.sort(codes, Comparator.comparingInt(s -> Integer.parseInt(s.substring(1))));
+//        return String.join("-", codes);
+//    }
+//    /**
+//     * 根据文件题名规则转换成C0-C6形式
+//     * @param string
+//     * @return
+//     */
+//    public String getNameRuleV(String string){
+//        // 定义工程名称到C格式的映射
+//        Map<String, String> mapping = new HashMap<>();
+//        mapping.put("单位工程", "C0");
+//        mapping.put("子单位工程", "C1");
+//        mapping.put("分部工程", "C2");
+//        mapping.put("子分部工程", "C3");
+//        mapping.put("分项工程", "C4");
+//        mapping.put("子分项工程", "C5");
+//        mapping.put("工序", "C6");
+//        // 将输入字符串分割成列表
+//        List<String> list = Arrays.asList(string.split(","));
+//        return list.stream()
+//            .map(mapping::get)
+//            .collect(Collectors.joining("-"));
+//    }
+//
+//    /**
+//     * 根据C0-C6转换成文件题名
+//     * @param string
+//     * @return
+//     */
+//    public String getNameRuleV1(String string){
+//        // 定义工程名称到C格式的映射
+//        Map<String, String> mapping = new HashMap<>();
+//        mapping.put("C0", "单位工程");
+//        mapping.put("C1", "子单位工程");
+//        mapping.put("C2", "分部工程");
+//        mapping.put("C3", "子分部工程");
+//        mapping.put("C4", "分项工程");
+//        mapping.put("C5", "子分项工程");
+//        mapping.put("C6", "工序");
+//        // 将输入字符串分割成列表
+//        List<String> list = Arrays.asList(string.split("-"));
+//        return list.stream()
+//            .map(mapping::get)
+//            .collect(Collectors.joining(","));
+//    }
+
 }

+ 0 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java

@@ -150,7 +150,6 @@ public class ExcelTabClientImpl implements ExcelTabClient {
                         }
                     }
                 }
-
             } else if (isBatchSave == 1) {
                 //------多表PDF保存------
                 pdfUrl = excelTabService.getBussPDFSTrial(nodeId, tableType, String.valueOf(type), contractId, projectId, id, tabIds, dto);

+ 13 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java

@@ -929,7 +929,14 @@ public class ExecutorMeter extends FormulaExecutor {
                    xj.setAmount(v.stream().map(e->BaseUtils.str2BigDecimal(e.getAmount())).reduce(BigDecimal.ZERO,BigDecimal::add).toPlainString());
                    xj.setTotal(v.stream().map(e->BaseUtils.str2BigDecimal(e.getTotal())).reduce(BigDecimal.ZERO,BigDecimal::add).toPlainString());
                    /*materialSum=StringUtils.number2String(xj.getTotal(),0);*/
-                   tmp.add(xj);
+                    AtomicBoolean flag=new AtomicBoolean(false);
+                    if(rowSize%tmp.size()==0){
+                        int num=isLast.get()?2:1;
+                        for (int i = 0; i < rowSize-num; i++) {
+                            tmp.add(new MaterialsArrival());
+                        }
+                    }
+                    tmp.add(xj);
                    dataList.addAll(tmp);
                    if(isLast.get()){
                        /*最后一条*/
@@ -939,6 +946,11 @@ public class ExecutorMeter extends FormulaExecutor {
                        hj.setAmount(list.stream().map(e->BaseUtils.str2BigDecimal(e.getAmount())).reduce(BigDecimal.ZERO,BigDecimal::add).toPlainString());
                        hj.setTotal(list.stream().map(e->BaseUtils.str2BigDecimal(e.getTotal())).reduce(BigDecimal.ZERO,BigDecimal::add).toPlainString());
                        materialSum=StringUtils.number2String(hj.getTotal(),0);
+                       if(capacity%tmp.size()==0){
+                           for (int i = 0; i < capacity-1; i++) {
+                               dataList.add(new MaterialsArrival());
+                           }
+                       }
                        dataList.add(hj);
                    }
                });

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

@@ -379,7 +379,7 @@ public class TableElementConverter implements ITableElementConverter {
         public void convert() {
               /*模版选择*/
               for(NodeTable nt:tableAll){
-                  if("m_20240222111932_1760504568283660288".equals(nt.getInitTableName())||"m_20240222093331_1760477888294944768".equals(nt.getInitTableName())||"m_20240222110914_1760501976056987648".equals(nt.getInitTableName())||"m_20240222101436_1760488226289614848".equals(nt.getInitTableName())){
+                  if("m_20240222111932_1760504568283660288".equals(nt.getInitTableName())||"m_20240222093331_1760477888294944768".equals(nt.getInitTableName())||"m_20240222110914_1760501976056987648".equals(nt.getInitTableName())||"m_20240222101436_1760488226289614848".equals(nt.getInitTableName())||"m_20240222101754_1760489057181237248".equals(nt.getInitTableName())){
                       meterInfo.setTemplate(MeterInfo.MB_ZJ);
                       break;
                   } else if("m_20240717141943_1813458542720450560".equals(nt.getInitTableName())){

+ 6 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java

@@ -13,7 +13,7 @@ import java.util.Set;
 public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
     List<WbsTreePrivate> selectAll(Integer wbsType);
 
-    List<WbsTreePrivateVO> tree(@Param("wbsId") String wbsId, @Param("projectId") String projectId, @Param("wbsType") Integer wbsType);
+    List<WbsTreePrivateVO> tree(@Param("wbsId") String wbsId, @Param("projectId") String projectId, @Param("wbsType") Integer wbsType, @Param("parentId") Integer parentId);
 
     List<WbsTreeVO2> tree2(@Param("wbsId") String wbsId, @Param("projectId") String projectId, @Param("wbsType") Integer wbsType);
 
@@ -121,9 +121,13 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
 
     WbsTreePrivate getProjectOpinionNode(@Param("projectId") Long projectId,@Param("id") Long id);
 
-    List<Long> linkNodeTreeBynodeId(@Param("pkeyid") String pkeyid);
+    List<Long> linkNodeTreeBynodeId(@Param("pkeyid") String pkeyid,@Param("nodeType") Integer nodeType);
 
     void batchUpdateIsAddConceal(@Param("private") WbsTreePrivate wbsTreePrivate,@Param("pId") Long pId);
 
     List<ArchiveSyncLogVO> getContractAllLog(@Param("contractId") Long contractId);
+
+    int cancelLinkNodeTreeInfoByJL(@Param("pkeyId")String pkeyId);
+
+    int cancelLinkNodeTreeInfoByYZ(@Param("pkeyId")String pkeyId);
 }

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

@@ -426,6 +426,9 @@
         <if test="wbsType != null and wbsType != ''">
             and wbs_type = #{wbsType}
         </if>
+        <if test="parentId != null and parentId != ''">
+            and parent_id = 0
+        </if>
         ORDER BY sort
     </select>
 
@@ -880,6 +883,20 @@
         from m_table_info
         WHERE id = #{pKeyId}
     </delete>
+    <update id="cancelLinkNodeTreeInfoByJL">
+        UPDATE m_wbs_tree_private
+        SET jler_tree_id = NULL
+        WHERE jler_tree_id = #{pkeyId}
+          AND is_deleted = 0
+          AND `type` = 1;
+    </update>
+    <update id="cancelLinkNodeTreeInfoByYZ">
+        UPDATE m_wbs_tree_private
+        SET yzer_tree_id = NULL
+        WHERE yzer_tree_id = #{pkeyId}
+          AND is_deleted = 0
+          AND `type` = 1;
+    </update>
 
     <update id="linkNodeTreeInfoByYZ" >
         <foreach collection="list" item="item" separator=";" >
@@ -900,7 +917,13 @@
     </update>
 
     <select id="linkNodeTreeBynodeId" resultType="java.lang.Long" >
-        select p_key_id from m_wbs_tree_private where (yzer_tree_id = #{pkeyid} or jler_tree_id = #{pkeyid})  and `type` = 1 and is_deleted = 0
+        select p_key_id from m_wbs_tree_private where `type` = 1 and is_deleted = 0
+        <if test="nodeType != null and nodeType != '' and nodeType==1">
+          and  yzer_tree_id = #{pkeyid}
+        </if>
+        <if test="nodeType != null and nodeType != '' and nodeType==2">
+          and  jler_tree_id = #{pkeyid}
+        </if>
     </select>
     <select id="getContractAllLog" resultType="org.springblade.manager.vo.ArchiveSyncLogVO">
         select id,create_user_name,record_time,file_name,pdf_url,e_visa_pdf_url,create_user,create_time,

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

@@ -107,4 +107,6 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
     List<ArchiveSyncLogVO> getContractAllLog(Long contractId);
 
     void diGuiWbs(int i);
+
+    WbsTreePrivateVO tree3(String wbsId, String projectId);
 }

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

@@ -63,6 +63,7 @@ import java.util.function.BiPredicate;
 import java.util.function.BinaryOperator;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 @Service
 @AllArgsConstructor
@@ -87,14 +88,21 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     @Override
     public List<WbsTreePrivateVO> tree(String wbsId, String projectId) {
         WbsInfo wbsInfo = wbsInfoMapper.selectOne(Wrappers.<WbsInfo>query().lambda().eq(WbsInfo::getId, wbsId));
+        String sql="select * from m_project_info where id="+projectId;
+        ProjectInfo projectInfo = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(ProjectInfo.class));
+        Integer parentId = null;
+        if(projectInfo.getTemplateType()!=null&&projectInfo.getTemplateType()==2){
+            parentId=1;
+        }
         if (wbsInfo != null) {
+            List<WbsTreePrivateVO> tree = baseMapper.tree(wbsId, projectId, wbsInfo.getWbsType(),parentId);
             //公有引用
-            return ForestNodeMerger.merge(baseMapper.tree(wbsId, projectId, wbsInfo.getWbsType()));
+            return ForestNodeMerger.merge(tree);
         } else {
             //私有引用`
             WbsTreePrivate nodeRoot = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getWbsId, wbsId).eq(WbsTreePrivate::getProjectId, projectId).eq(WbsTreePrivate::getParentId, 0L));
             if (nodeRoot != null) {
-                return ForestNodeMerger.merge(baseMapper.tree(wbsId, projectId, Integer.valueOf(nodeRoot.getWbsType())));
+                return ForestNodeMerger.merge(baseMapper.tree(wbsId, projectId, Integer.valueOf(nodeRoot.getWbsType()),parentId));
             }
         }
         return null;
@@ -1530,9 +1538,14 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                 if (("public").equals(projectInfo.getReferenceWbsTemplateType())) {
                     /*-------------------------------------质检公有引用同步--------------------------------------------*/
                     //获取当前节点对应的公有引用树下的元素表
-                    WbsTree wbsTree = wbsTreeMapper.selectOne(Wrappers.<WbsTree>lambdaQuery().select(WbsTree::getAncestors, WbsTree::getWbsId, WbsTree::getId).eq(WbsTree::getId, wbsTreePrivate.getId()));
-
+                    List<WbsTree> wbsTrees = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery()
+                        .select(WbsTree::getAncestors, WbsTree::getWbsId, WbsTree::getId)
+                        .and(wq -> wq.eq(WbsTree::getId, wbsTreePrivate.getId())
+                            .or()
+                            .eq(WbsTree::getId, wbsTreePrivate.getTreePId()))
+                    );
                     List<WbsTree> wbsTreesPublicTables;
+                    WbsTree wbsTree = wbsTrees.get(0);
                     if (wbsTree.getAncestors().equals("0")) {
                         //根节点
                         wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
@@ -1551,7 +1564,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
 
                     //获取当前项目树下的元素表 节点
                     List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestors)
+                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestors,WbsTreePrivate::getTreePId)
                                     .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
                                     .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
                             /*.eq(WbsTreePrivate::getStatus, 1)*/
@@ -1567,9 +1580,15 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     }
 
                     //获取新增的公有元素表addPublicTable
-                    List<WbsTree> addPublicTable = wbsTreesPublicTables.stream().filter(f ->
-                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
-
+//                    List<WbsTree> addPublicTable = wbsTreesPublicTables.stream().filter(f ->
+//                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
+                    Set<Long> privateIdsAndPids = wbsTreePrivatesProjectTables.stream()
+                        .flatMap(p -> Stream.of(p.getId(), p.getTreePId()))
+                        .collect(Collectors.toSet());
+                      // 过滤 wbsTreesPublicTables
+                    List<WbsTree> addPublicTable = wbsTreesPublicTables.stream()
+                        .filter(f -> !privateIdsAndPids.contains(f.getId()))
+                        .collect(Collectors.toList());
                     //判断当前新增的表在项目的wbs树中是否存在上级节点,存在表示可以新增,不存在表示不新增
                     List<WbsTree> addPublicTables = addPublicTable.stream().filter(node ->
                             wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
@@ -1952,66 +1971,66 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                 }
             }
 
-            //同步到合同段(合同段中可能不存在原始节点(那么分配wsb处就同步不成功),但合同段存在新增、复制的节点,所以单独处理)
-            if (!insertDataPrivateList.isEmpty()) {
-                Map<Long, List<WbsTreePrivate>> tabParentNodesGroup = insertDataPrivateList.stream().collect(Collectors.groupingBy(WbsTreePrivate::getParentId));
-                Set<Long> longs = tabParentNodesGroup.keySet();
-                //获取当前项目下合同段 新增、复制、原始节点
-                List<WbsTreeContract> addOrCopyOrYsNodes = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
-                        .select(WbsTreeContract::getId, WbsTreeContract::getContractId, WbsTreeContract::getOldId)
-                        .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
-                        .and(obj -> obj.in(WbsTreeContract::getOldId, longs).or().in(WbsTreeContract::getId, longs))
-                );
-                List<WbsTreeContract> newAddOrCopyOrYsNodes = addOrCopyOrYsNodes.stream().distinct().collect(Collectors.toList());
-                for (WbsTreeContract addOrCopyOrYsNode : newAddOrCopyOrYsNodes) {
-                    if (StringUtils.isNotEmpty(addOrCopyOrYsNode.getOldId())) {
-                        //复制、新增节点
-                        //合同段节点的oldId=当前表的parentId,也就是说当前表的父级节点=合同段复制、新增出来节点
-                        List<WbsTreePrivate> tabs = tabParentNodesGroup.get(Long.parseLong(addOrCopyOrYsNode.getOldId()));
-                        if (tabs.size() > 0) {
-                            List<WbsTreeContract> wbsTreeContractList = BeanUtil.copyProperties(tabs, WbsTreeContract.class);
-                            for (WbsTreeContract wbsTreeContract : wbsTreeContractList) {
-                                wbsTreeContract.setIsBussShow(1);
-                                wbsTreeContract.setIsDeleted(0);
-                                wbsTreeContract.setStatus(1);
-
-                                wbsTreeContract.setIsTypePrivatePid(wbsTreeContract.getPKeyId()); //记录原始表的pKeyId
-
-                                wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
-                                wbsTreeContract.setParentId(addOrCopyOrYsNode.getId());
-                                wbsTreeContract.setContractId(addOrCopyOrYsNode.getContractId());
-                            }
-                            insertDataContractList.addAll(wbsTreeContractList);
-                        }
-                    } else {
-                        //原始节点id=表parentId
-                        List<WbsTreePrivate> tabs = tabParentNodesGroup.get((addOrCopyOrYsNode.getId()));
-                        if (tabs.size() > 0) {
-                            List<WbsTreeContract> wbsTreeContractList = BeanUtil.copyProperties(tabs, WbsTreeContract.class);
-                            for (WbsTreeContract wbsTreeContract : wbsTreeContractList) {
-                                wbsTreeContract.setIsBussShow(1);
-                                wbsTreeContract.setIsDeleted(0);
-                                wbsTreeContract.setStatus(1);
-
-                                wbsTreeContract.setIsTypePrivatePid(wbsTreeContract.getPKeyId()); //记录原始表的pKeyId
-
-                                wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
-                                wbsTreeContract.setParentId(addOrCopyOrYsNode.getId());
-                                wbsTreeContract.setContractId(addOrCopyOrYsNode.getContractId());
-                            }
-                            insertDataContractList.addAll(wbsTreeContractList);
-                        }
-                    }
-                }
-            }
-
-            //新增同步到合同段
-            if (!insertDataContractList.isEmpty()) {
-                List<List<WbsTreeContract>> partition = Lists.partition(insertDataContractList, 1000);
-                for (List<WbsTreeContract> wbsTreeContracts : partition) {
-                    wbsTreeContractService.insertBatch(wbsTreeContracts, 1000);
-                }
-            }
+//            //同步到合同段(合同段中可能不存在原始节点(那么分配wsb处就同步不成功),但合同段存在新增、复制的节点,所以单独处理)
+//            if (!insertDataPrivateList.isEmpty()) {
+//                Map<Long, List<WbsTreePrivate>> tabParentNodesGroup = insertDataPrivateList.stream().collect(Collectors.groupingBy(WbsTreePrivate::getParentId));
+//                Set<Long> longs = tabParentNodesGroup.keySet();
+//                //获取当前项目下合同段 新增、复制、原始节点
+//                List<WbsTreeContract> addOrCopyOrYsNodes = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+//                        .select(WbsTreeContract::getId, WbsTreeContract::getContractId, WbsTreeContract::getOldId)
+//                        .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
+//                        .and(obj -> obj.in(WbsTreeContract::getOldId, longs).or().in(WbsTreeContract::getId, longs))
+//                );
+//                List<WbsTreeContract> newAddOrCopyOrYsNodes = addOrCopyOrYsNodes.stream().distinct().collect(Collectors.toList());
+//                for (WbsTreeContract addOrCopyOrYsNode : newAddOrCopyOrYsNodes) {
+//                    if (StringUtils.isNotEmpty(addOrCopyOrYsNode.getOldId())) {
+//                        //复制、新增节点
+//                        //合同段节点的oldId=当前表的parentId,也就是说当前表的父级节点=合同段复制、新增出来节点
+//                        List<WbsTreePrivate> tabs = tabParentNodesGroup.get(Long.parseLong(addOrCopyOrYsNode.getOldId()));
+//                        if (tabs.size() > 0) {
+//                            List<WbsTreeContract> wbsTreeContractList = BeanUtil.copyProperties(tabs, WbsTreeContract.class);
+//                            for (WbsTreeContract wbsTreeContract : wbsTreeContractList) {
+//                                wbsTreeContract.setIsBussShow(1);
+//                                wbsTreeContract.setIsDeleted(0);
+//                                wbsTreeContract.setStatus(1);
+//
+//                                wbsTreeContract.setIsTypePrivatePid(wbsTreeContract.getPKeyId()); //记录原始表的pKeyId
+//
+//                                wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
+//                                wbsTreeContract.setParentId(addOrCopyOrYsNode.getId());
+//                                wbsTreeContract.setContractId(addOrCopyOrYsNode.getContractId());
+//                            }
+//                            insertDataContractList.addAll(wbsTreeContractList);
+//                        }
+//                    } else {
+//                        //原始节点id=表parentId
+//                        List<WbsTreePrivate> tabs = tabParentNodesGroup.get((addOrCopyOrYsNode.getId()));
+//                        if (tabs.size() > 0) {
+//                            List<WbsTreeContract> wbsTreeContractList = BeanUtil.copyProperties(tabs, WbsTreeContract.class);
+//                            for (WbsTreeContract wbsTreeContract : wbsTreeContractList) {
+//                                wbsTreeContract.setIsBussShow(1);
+//                                wbsTreeContract.setIsDeleted(0);
+//                                wbsTreeContract.setStatus(1);
+//
+//                                wbsTreeContract.setIsTypePrivatePid(wbsTreeContract.getPKeyId()); //记录原始表的pKeyId
+//
+//                                wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
+//                                wbsTreeContract.setParentId(addOrCopyOrYsNode.getId());
+//                                wbsTreeContract.setContractId(addOrCopyOrYsNode.getContractId());
+//                            }
+//                            insertDataContractList.addAll(wbsTreeContractList);
+//                        }
+//                    }
+//                }
+//            }
+//
+//            //新增同步到合同段
+//            if (!insertDataContractList.isEmpty()) {
+//                List<List<WbsTreeContract>> partition = Lists.partition(insertDataContractList, 1000);
+//                for (List<WbsTreeContract> wbsTreeContracts : partition) {
+//                    wbsTreeContractService.insertBatch(wbsTreeContracts, 1000);
+//                }
+//            }
             return true;
         }
         return false;
@@ -2945,7 +2964,10 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
 
     @Override
     public int linkNodeTreeInfo(String pkeyId, String nodeIds) {
-        List<String> strList = Func.toStrList(nodeIds);
+        List<String> strList=new ArrayList<>();
+        if(nodeIds!=null&&!nodeIds.equals("")){
+            strList= Func.toStrList(nodeIds);
+        }
         String sqlInfo = "SELECT * from m_wbs_tree_private where id = (SELECT parent_id from m_wbs_tree_private c where p_key_id='"+pkeyId+"')";
         List<Map<String, Object>> maps = jdbcTemplate.queryForList(sqlInfo);
         Integer nodeType = 1;
@@ -2962,15 +2984,38 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             }
         }
         if(nodeType==2){
-           return baseMapper.linkNodeTreeInfoByJL(pkeyId, strList) ;
+            if(strList.size()==0){
+                //取消关联
+                     return baseMapper.cancelLinkNodeTreeInfoByJL(pkeyId) ;
+            }else {
+                return baseMapper.linkNodeTreeInfoByJL(pkeyId, strList) ;
+            }
         }else{
+            if(strList.size()==0){
+                return baseMapper.cancelLinkNodeTreeInfoByYZ(pkeyId) ;
+            }
             return baseMapper.linkNodeTreeInfoByYZ(pkeyId, strList) ;
         }
     }
 
     @Override
     public List<Long> linkNodeTreeBynodeId(String pkeyId) {
-        return baseMapper.linkNodeTreeBynodeId(pkeyId);
+        String sqlInfo = "SELECT * from m_wbs_tree_private where id = (SELECT parent_id from m_wbs_tree_private c where p_key_id='"+pkeyId+"')";
+        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sqlInfo);
+        Integer nodeType = 1;
+        if(maps!=null && maps.size()>=1){
+            for(Map<String, Object> map:maps){
+                String dataType = map.get("node_type")+"";
+                if(dataType.equals("1000")){ //业主委托单
+                    nodeType = 1;
+                    break;
+                }else if(dataType.equals("1001")){ //监理委托单
+                    nodeType = 2;
+                    break;
+                }
+            }
+        }
+        return baseMapper.linkNodeTreeBynodeId(pkeyId,nodeType);
     }
 
     @Override
@@ -3006,9 +3051,19 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             }
         }
         System.out.println(Colour.RED.getCode()+"第"+i+"次递归完成======================================================================================="+Colour.RESET.getCode());
+    }
 
-
+    @Override
+    public WbsTreePrivateVO tree3(String wbsId, String projectId) {
+        WbsInfo wbsInfo = wbsInfoMapper.selectOne(Wrappers.<WbsInfo>query().lambda().eq(WbsInfo::getId, wbsId));
+        WbsTreePrivateVO vo=new WbsTreePrivateVO();
+        vo.setId(wbsInfo.getId());
+        vo.setHasChildren(false);
+        vo.setProjectName(wbsInfo.getWbsName());
+        vo.setWbsType(wbsInfo.getWbsType()+"");
+        return vo;
     }
+
     public  List<WbsTreePrivate> findAllContract(WbsTreePrivate wbsTreePrivate){
         QueryWrapper<WbsTreePrivate> wbsTreeContractQueryWrapper = new QueryWrapper<>();
         wbsTreeContractQueryWrapper.select("p_key_id","id","p_id","wbs_id","project_id","parent_id","ancestors");

+ 149 - 21
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/APIController.java

@@ -7,9 +7,12 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
+import org.springblade.business.entity.FixedFlowLink;
 import org.springblade.business.entity.Task;
+import org.springblade.business.entity.TaskParallel;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.ObjectUtil;
@@ -23,16 +26,15 @@ import org.springblade.meter.mapper.MeterApproveOpinionMapper;
 import org.springblade.meter.mapper.MiddleMeterApplyTaskMapper;
 import org.springblade.meter.mapper.StartPayMeterFormTaskMapper;
 import org.springblade.meter.vo.ApiTaskPageVo;
+import org.springblade.system.user.entity.User;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.SingleColumnRowMapper;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -59,9 +61,9 @@ public class APIController {
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "获取任务列表", notes = "ApiTaskPageDto")
     public R<IPage<ApiTaskPageVo>> apiPage(@RequestBody ApiTaskPageDto dto) {
-        if (ObjectUtil.isEmpty(dto.getProjectId()) || ObjectUtil.isEmpty(dto.getContractId())) {
-            throw new ServiceException("未获取到当前项目或合同段信息");
-        }
+//        if (ObjectUtil.isEmpty(dto.getProjectId()) || ObjectUtil.isEmpty(dto.getContractId())) {
+//            throw new ServiceException("未获取到当前项目或合同段信息");
+//        }
         if(dto.getCurrent()==null){
             dto.setCurrent(1);
         }
@@ -73,22 +75,23 @@ public class APIController {
         int size = dto.getSize();
         List<Object> params = new ArrayList<>();
         StringBuilder sqlString = new StringBuilder("SELECT * FROM u_task WHERE 1=1 AND is_deleted = 0 AND approval_type in (5,6,7,8) "); //approval_type = 5 计量任务
+        if(dto.getContractId()!=null&&dto.getProjectId()!=null){
+            ContractInfo contractInfo = jdbcTemplate.queryForObject("select contract_type from m_contract_info where id = " + dto.getContractId(), new BeanPropertyRowMapper<>(ContractInfo.class));
+            if (contractInfo != null && Arrays.asList(1, 4).contains(contractInfo.getContractType())) {
+                /*施工、计量合同段(总承包合同段)按照项目id、合同段id正常查询*/
+                if (ObjectUtil.isNotEmpty(dto.getProjectId()) && ObjectUtil.isNotEmpty(dto.getContractId())) {
+                    sqlString.append(" AND project_id = ? AND contract_id = ?");
+                    params.add(dto.getProjectId());
+                    params.add(dto.getContractId());
+                }
 
-        ContractInfo contractInfo = jdbcTemplate.queryForObject("select contract_type from m_contract_info where id = " + dto.getContractId(), new BeanPropertyRowMapper<>(ContractInfo.class));
-        if (contractInfo != null && Arrays.asList(1, 4).contains(contractInfo.getContractType())) {
-            /*施工、计量合同段(总承包合同段)按照项目id、合同段id正常查询*/
-            if (ObjectUtil.isNotEmpty(dto.getProjectId()) && ObjectUtil.isNotEmpty(dto.getContractId())) {
-                sqlString.append(" AND project_id = ? AND contract_id = ?");
-                params.add(dto.getProjectId());
-                params.add(dto.getContractId());
+            } else if (contractInfo != null && Arrays.asList(2, 3).contains(contractInfo.getContractType())) {
+                /*监理、业主(指挥部)合同段,默认查询当前项目下所有关联的合同段*/
+                List<ContractRelationJlyz> contractRelationJLYZ = jdbcTemplate.query("select contract_id_sg from m_contract_relation_jlyz where contract_id_jlyz = " + dto.getContractId(), new BeanPropertyRowMapper<>(ContractRelationJlyz.class));
+                Set<Long> ids = contractRelationJLYZ.stream().map(ContractRelationJlyz::getContractIdSg).collect(Collectors.toSet());
+                ids.add(Long.parseLong(dto.getContractId())); //把本身合同段也加入查询
+                sqlString.append(" AND contract_id in(").append(StringUtils.join(ids, ",")).append(")");
             }
-
-        } else if (contractInfo != null && Arrays.asList(2, 3).contains(contractInfo.getContractType())) {
-            /*监理、业主(指挥部)合同段,默认查询当前项目下所有关联的合同段*/
-            List<ContractRelationJlyz> contractRelationJLYZ = jdbcTemplate.query("select contract_id_sg from m_contract_relation_jlyz where contract_id_jlyz = " + dto.getContractId(), new BeanPropertyRowMapper<>(ContractRelationJlyz.class));
-            Set<Long> ids = contractRelationJLYZ.stream().map(ContractRelationJlyz::getContractIdSg).collect(Collectors.toSet());
-            ids.add(Long.parseLong(dto.getContractId())); //把本身合同段也加入查询
-            sqlString.append(" AND contract_id in(").append(StringUtils.join(ids, ",")).append(")");
         }
         if (ObjectUtil.isNotEmpty(dto.getSelectedType())) {
             sqlString.append(" AND (");
@@ -122,6 +125,8 @@ public class APIController {
         String sqlPage = sqlString.toString();
         List<Task> resultList = jdbcTemplate.query(sqlPage, new BeanPropertyRowMapper<>(Task.class), params.toArray());
 
+        /*获取用户信息Map*/
+        Map<Long, String> nameMap = jdbcTemplate.query("select id,name from blade_user where is_deleted = 0", new BeanPropertyRowMapper<>(User.class)).stream().collect(Collectors.toMap(User::getId, User::getName, (key1, key2) -> key1));
         /*解析page分页数据*/
         IPage<ApiTaskPageVo> page = new Page<>(current, size);
         List<ApiTaskPageVo> pageList = resultList.stream().map(task -> {
@@ -129,6 +134,9 @@ public class APIController {
             vo.setTaskId(task.getId());
             vo.setTaskName(task.getTaskName());
             vo.setTaskStatusName(task.getStatus().equals(1) ? "待审批" : task.getStatus().equals(2) ? "已审批" : "已废除");
+            vo.setStartTime(task.getStartTime());
+            vo.setEndTime(task.getEndTime());
+            vo.setTaskReportUserName(nameMap.get(Long.parseLong(task.getReportUser())));
             String sql="";
             if(task.getMeterTaskType()!=null&&task.getMeterTaskType()==1){
                 sql="Select raw_url From s_interim_pay_certificate where contract_period_id="+task.getFormDataId()+" and is_deleted=0";
@@ -187,4 +195,124 @@ public class APIController {
         page.setTotal(totalCount);
         return R.data(page);
     }
+
+    /**
+     * 第三方对接 获取任务流程状态
+     * @param taskId
+     * @return
+     */
+    @GetMapping("/task/getTaskProcessInfo")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "获取任务流程状态", notes = "taskId")
+    public R<List<Map<String, Object>>> getTaskProcessInfo(Long taskId){
+        Task task = jdbcTemplate.query("SELECT * FROM u_task WHERE id = ?", new Object[]{taskId}, new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
+        if(task!=null){
+            List<Map<String, Object>> taskProcessInfo = new LinkedList<>();
+            /*左侧任务流程信息*/
+            List<TaskParallel> taskParallels = jdbcTemplate.query("SELECT * FROM u_task_parallel WHERE process_instance_id = ? ORDER BY sort", new Object[]{task.getProcessInstanceId()}, new BeanPropertyRowMapper<>(TaskParallel.class));
+            //排名第一就是第一人
+            if (taskParallels.size() == 0) {
+                throw new ServiceException("未获取到任务流程信息");
+            }
+            /*上报人*/
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            Map<String, Object> taskUserOne = new LinkedHashMap<>();
+            taskUserOne.put("name", task.getReportUserName());
+            taskUserOne.put("date", sdf.format(task.getCreateTime()));
+            taskUserOne.put("status", "2");
+            taskUserOne.put("flowValue", "上报");
+            taskProcessInfo.add(0, taskUserOne);
+
+            //判断当前用户所属流程,如果为审计流程则类型1显示Excel,如果是后面流程则类型2显示PDF,没有PDF则类型3
+            Integer currentUserFlow = null;
+            List<Integer> auditFlow = new ArrayList<>();
+            /*预设流程(平行、顺序审批)*/
+            if (ObjectUtil.isNotEmpty(task.getFixedFlowId()) && !task.getFixedFlowId().equals(0L)) {
+                List<FixedFlowLink> query = jdbcTemplate.query("SELECT * FROM u_fixed_flow_link WHERE fixed_flow_id = ? order by fixed_flow_branch_sort ", new Object[]{task.getFixedFlowId()}, new BeanPropertyRowMapper<>(FixedFlowLink.class));
+                //查看流程中是否存在审计流程
+                for (FixedFlowLink link : query) {
+//                    if (StringUtils.isNotBlank(link.getFixedFlowLink()) && link.getFixedFlowLink().contains("审计")) {
+                    if (link.getFlowTaskType() == 2) {
+                        auditFlow.add(link.getFixedFlowBranchSort());
+                    }
+                }
+                //校验当前用户在第几流程
+                //Map<Long, Integer> collect = query.stream().collect(Collectors.toMap(l -> l.getFixedFlowLinkUser(), l -> l.getFixedFlowBranchSort()));
+                //Integer sort = collect.get(AuthUtil.getUserId());
+                for (int i = 0; i < query.size(); i++) {
+                    FixedFlowLink flowLink= query.get(i);
+                    TaskParallel taskParallel = taskParallels.get(i);
+                    if(flowLink.getFixedFlowLinkUser().equals(AuthUtil.getUserId()) &&taskParallel.getStatus()==1 ){
+                        // 为空则代表是上报人,直接显示当前结果
+                        currentUserFlow = flowLink.getFixedFlowBranchSort();
+                        break;
+                    }
+                }
+
+                Map<String, List<FixedFlowLink>> group = query.stream().collect(Collectors.groupingBy(obj -> obj.getFixedFlowLink() + "@@@" + obj.getFixedFlowLinkType(), LinkedHashMap::new, Collectors.toList()));
+                for (Map.Entry<String, List<FixedFlowLink>> stringListEntry : group.entrySet()) {
+                    Map<String, Object> m = new LinkedHashMap<>();
+                    m.put("taskBranchName", stringListEntry.getKey().split("@@@")[0]);
+                    m.put("taskBranchType", stringListEntry.getKey().split("@@@")[1]);
+
+                    List<FixedFlowLink> value = stringListEntry.getValue();
+                    if (stringListEntry.getKey().split("@@@")[1].equals("1")) {
+                        value.sort(Comparator.comparingInt(FixedFlowLink::getFixedFlowLinkSort));
+                    }
+                    List<String> userIds = value.stream().map(fen -> fen.getFixedFlowLinkUser()+"-"+fen.getFixedFlowBranchSort()).collect(Collectors.toList());
+
+                    List<Map<String, String>> userList = new LinkedList<>();
+                    for (int i = 0; i < taskParallels.size(); i++) {
+                        TaskParallel taskParallel = taskParallels.get(i);
+                        String userO = taskParallel.getTaskUser()+"-"+taskParallel.getSort();
+                        if (userIds.contains(userO)) {
+                            Map<String, String> taskUserOther = new LinkedHashMap<>();
+                            taskUserOther.put("name", taskParallel.getTaskUserName());
+                            if (taskParallel.getStatus().equals(2) || taskParallel.getStatus().equals(3)) {
+                                taskUserOther.put("date", sdf.format(taskParallel.getCreateTime()));
+                            }
+                            taskUserOther.put("status", taskParallel.getStatus().toString());
+                            if (i == taskParallels.size() - 1) {
+                                taskUserOther.put("flowValue", (taskParallel.getStatus().equals(2) ? "同意" : taskParallel.getStatus().equals(1) ? "待审批" : "已废除") + "</br></br>结束流程");
+                            } else {
+                                taskUserOther.put("flowValue", taskParallel.getStatus().equals(2) ? "同意" : taskParallel.getStatus().equals(1) ? "待审批" : "已废除");
+                            }
+                            userList.add(taskUserOther);
+                        }
+                    }
+                    m.put("userList", userList);
+
+                    String var = "1";
+                    List<String> statusList = userList.stream().map(user -> user.get("status")).filter(Objects::nonNull).collect(Collectors.toList());
+                    if (statusList.stream().allMatch("2"::equals)) {
+                        var = "2";
+                    }
+                    m.put("taskBranchStatus", var);
+
+                    taskProcessInfo.add(m);
+                }
+                    return  R.data(200,taskProcessInfo,"操作成功");
+
+                /*非预设流程(默认顺序审批)*/
+            } else if (ObjectUtil.isEmpty(task.getFixedFlowId()) || task.getFixedFlowId().equals(0L)) {
+                for (int i = 0; i < taskParallels.size(); i++) {
+                    TaskParallel taskParallel = taskParallels.get(i);
+                    Map<String, Object> taskUserOther = new LinkedHashMap<>();
+                    taskUserOther.put("name", taskParallel.getTaskUserName());
+                    if (taskParallel.getStatus().equals(2) || taskParallel.getStatus().equals(3)) {
+                        taskUserOther.put("date", sdf.format(taskParallel.getUpdateTime()));
+                    }
+                    taskUserOther.put("status", taskParallel.getStatus().toString());
+                    if (i == taskParallels.size() - 1) {
+                        taskUserOther.put("flowValue", (taskParallel.getStatus().equals(2) ? "同意" : taskParallel.getStatus().equals(1) ? "待审批" : "已废除") + "</br></br>结束流程");
+                    } else {
+                        taskUserOther.put("flowValue", taskParallel.getStatus().equals(2) ? "同意" : taskParallel.getStatus().equals(1) ? "待审批" : "已废除");
+                    }
+                    taskProcessInfo.add(taskUserOther);
+                }
+                return  R.data(200,taskProcessInfo,"操作成功");
+            }
+        }
+        return R.data(200,null,"操作成功");
+    }
 }

+ 9 - 3
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java

@@ -438,6 +438,8 @@ public class TaskController extends BladeController {
                     periodService.update(Wrappers.<MeterPeriod>lambdaUpdate().set(MeterPeriod::getApproveStatus, 1).eq(MeterPeriod::getId, approvalDTO.getPeriodId()));
                     //修改报表状态,如果不存在则创建报表,因为任务要查看报表
                     this.updateStatement(Long.valueOf(approvalDTO.getPeriodId()),2,1);
+                    //发送短信
+                    interimPayCertificateItemService.sendJLSmg(taskId);
                     return R.data(200, aopParamsSet, "操作成功");
                 }
 
@@ -504,6 +506,8 @@ public class TaskController extends BladeController {
                     periodService.update(Wrappers.<MeterPeriod>lambdaUpdate().set(MeterPeriod::getApproveStatus, 1).eq(MeterPeriod::getId, approvalDTO.getPeriodId()));
                     //修改报表状态,如果不存在则创建报表,因为任务要查看报表
                     this.updateStatement(Long.valueOf(approvalDTO.getPeriodId()),3,1);
+                    //发送短信
+                    interimPayCertificateItemService.sendJLSmg(taskId);
                     return R.data(200, aopParamsSet, "操作成功");
                 }
             } else if (approvalDTO.getType().equals(4)) {
@@ -2842,6 +2846,8 @@ public class TaskController extends BladeController {
             }
 
             interimPayCertificateService.taskMeterPdfInfo2(task.getId()+"",reportId,task.getMeterTaskType() - 1);
+            //发送短信
+            interimPayCertificateItemService.sendJLSmg(task.getId());
             return R.data(200, aopParamsSet, "操作成功");
         }
         return R.fail("操作失败");
@@ -4468,15 +4474,15 @@ public class TaskController extends BladeController {
     @Transactional
     public void addSignTaskBatch(Report report) {
         try {
-            String selSql = "select * from  u_task_parallel a where a.process_instance_id = (select b.process_instance_id from u_task b where  b.`status` in(1,2) and b.form_data_id=" + report.getPeriodId() +  ") and a.status=1 and a.e_visa_status is NULL and a.e_visa_content is null ";
+            String selSql = "select * from u_task_parallel a where a.process_instance_id = (select b.process_instance_id from u_task b where  b.`status` in(1,2) and b.form_data_id='"+report.getPeriodId()+"') and a.status=1 and a.e_visa_status is NULL and a.e_visa_content is null ";
             List<Map<String, Object>> mapList = jdbcTemplate.queryForList(selSql);
             if(Func.isEmpty(mapList) || mapList.size()==0) {
                 // 修改个人电签状态
-                String UPSql = "update u_task_parallel a set a.e_visa_status=null,e_visa_content=null,initiative=1 where a.process_instance_id = (select b.process_instance_id from u_task b where  b.`status` in(1,2) and b.form_data_id=" + report.getPeriodId() + ") ";
+                String UPSql = "update u_task_parallel a set a.e_visa_status=null,e_visa_content=null,initiative=1 where a.process_instance_id = (select b.process_instance_id from u_task b where  b.`status` in(1,2) and b.form_data_id='" + report.getPeriodId() + "') ";
                 String UPSqlJL = " update u_task_parallel a set a.e_visa_status=1,e_visa_content='电签成功',initiative=2 where sort in( SELECT a.fixed_flow_branch_sort from u_task b,u_fixed_flow_link a where b.`status` in(1,2) and b.form_data_id='" + report.getPeriodId() + "' and a.fixed_flow_id=b.fixed_flow_id and a.flow_task_type=2 ) and a.process_instance_id in(SELECT process_instance_id from u_task b where b.`status` in(1,2) and b.form_data_id='" + report.getPeriodId() + "')";
                 String DeSql = "delete from u_task_batch where task_parallel_id in(select b.process_instance_id from u_task b where b.`status` in(1,2) and b.form_data_id=" + report.getPeriodId() + ")";
                 //删除以前存在的电签
-                String sql = "insert INTO u_task_batch(id,task_parallel_id,json_data,create_user,create_dept,create_time,update_user,update_time,status,is_deleted,nick_name,sign_format,sign_type) " + " SELECT a.id,a.process_instance_id,json_object('approvalFileList',json_array(),'approvalType',b.approval_type,'comment','','flag','OK','formDataId',b.form_data_id,'parallelProcessInstanceId',a.parallel_process_instance_id,'pass',true,'taskId',b.id) as  json_data,a.task_user,a.create_dept,a.create_time,a.update_user,a.update_time,1 as status,0 as is_deleted,a.task_user_name as nick_name ,1 as sign_format,1 as sign_type from u_task_parallel a,u_task b,u_fixed_flow_link c where b.`status` in(1,2) and  a.process_instance_id=b.process_instance_id and c.flow_task_type!=2 and a.sort = c.fixed_flow_branch_sort and c.fixed_flow_id=b.fixed_flow_id and b.form_data_id= '" + report.getPeriodId() + "'";
+                String sql = "insert into u_task_batch(id,task_parallel_id,json_data,create_user,create_dept,create_time,update_user,update_time,status,is_deleted,nick_name,sign_format,sign_type) " + " SELECT a.id,a.process_instance_id,json_object('approvalFileList',json_array(),'approvalType',b.approval_type,'comment','','flag','OK','formDataId',b.form_data_id,'parallelProcessInstanceId',a.parallel_process_instance_id,'pass',true,'taskId',b.id) as  json_data,a.task_user,a.create_dept,a.create_time,a.update_user,a.update_time,1 as status,0 as is_deleted,a.task_user_name as nick_name ,1 as sign_format,1 as sign_type from u_task_parallel a,u_task b,u_fixed_flow_link c where b.`status` in(1,2) and  a.process_instance_id=b.process_instance_id and c.flow_task_type!=2 and a.sort = c.fixed_flow_branch_sort and c.fixed_flow_id=b.fixed_flow_id and b.form_data_id= '" + report.getPeriodId() + "'";
 
                 jdbcTemplate.execute(DeSql);
                 jdbcTemplate.execute(UPSql);

+ 1 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/InterimPayCertificateMapper.xml

@@ -33,7 +33,7 @@
     </select>
     <select id="page2" resultType="org.springblade.meter.vo.InterimPayCertificateVO">
         select IFNULL(pre_pdf_url,raw_url) as pre_pdf_url,sipc.*,
-               (select id from u_task where form_data_id = sipc.contract_period_id and is_deleted = 0 and status in (1,2) limit 1) as taskId
+               (select id from u_task where form_data_id = CONVERT(sipc.contract_period_id, CHAR) and is_deleted = 0 and status in (1,2) limit 1) as taskId
         from s_interim_pay_certificate sipc
         where contract_id = #{pay.contractId} and is_deleted = 0
         order by create_time desc

+ 1 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.xml

@@ -301,7 +301,7 @@
         order by sort,create_time
     </select>
     <select id="getNodeData" resultType="org.springblade.meter.vo.WbsFileVO">
-        select name as dataName,IFNULL(node_pdf_url,pdf_url) as pdfUrl,e_visa_pdf_url as eVisaPdfUrl, uiq.id as selectId,
+        select name as dataName,IFNULL(node_pdf_url,pdf_url) as pdfUrl,IFNULL(node_pdf_url,e_visa_pdf_url) as eVisaPdfUrl, uiq.id as selectId,
                (select node_type from m_wbs_tree_contract wtc where wtc.p_key_id = uiq.wbs_id) as nodeType,
                (select IFNULL(ancestors,wtc.id) from m_wbs_tree_contract wtc where wtc.p_key_id = uiq.wbs_id) as ancestors,
                (select node_name from m_wbs_tree_contract wtc where wtc.p_key_id = uiq.wbs_id) as nodeName,

+ 63 - 18
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/InterimPayCertificateItemServiceImpl.java

@@ -9,6 +9,7 @@ import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.meter.entity.InterimPayCertificateItem;
 import org.springblade.meter.mapper.InterimPayCertificateItemMapper;
 import org.springblade.meter.service.IInterimPayCertificateItemService;
+import org.springblade.meter.utils.MeMsgUtils;
 import org.springblade.meter.vo.MonthlyReportVo;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
@@ -28,11 +29,12 @@ import java.util.Map;
 public class InterimPayCertificateItemServiceImpl extends BaseServiceImpl<InterimPayCertificateItemMapper, InterimPayCertificateItem> implements IInterimPayCertificateItemService {
 
     private final JdbcTemplate jdbcTemplate;
+
     @Override
     @Transactional
     public void addInterimPayCertificateItem(Long certificateId, List<MonthlyReportVo> values) {
-        if(!values.isEmpty()){
-            List<InterimPayCertificateItem>list=new ArrayList<>();
+        if (!values.isEmpty()) {
+            List<InterimPayCertificateItem> list = new ArrayList<>();
             for (int i = 0; i < values.size(); i++) {
                 MonthlyReportVo vo = values.get(i);
                 InterimPayCertificateItem item = new InterimPayCertificateItem();
@@ -40,13 +42,13 @@ public class InterimPayCertificateItemServiceImpl extends BaseServiceImpl<Interi
                 item.setSort(i);
                 item.setFormName(vo.getChapterSeq());
                 item.setChapterSeq(vo.getFormName());
-                item.setContractAmount(vo.getCurrentMeterMoney()==null?null:vo.getCurrentMeterMoney().toString());
-                item.setRevisedTotal(vo.getChangeMeterMoney()==null?null:vo.getChangeMeterMoney().toString());
-                item.setRevisedAmount(vo.getAfterCurrentMeterMoney()==null?null:vo.getAfterCurrentMeterMoney().toString());
-                item.setCurrentPeriodEndPay(vo.getNowEndMoney()==null?null:vo.getNowEndMoney().toString());
-                item.setPreviousPeriodEndPay(vo.getBeforeEndMoney()==null?null:vo.getBeforeEndMoney().toString());
-                item.setCurrentPeriodPay(vo.getNowMoney()==null?null:vo.getNowMoney().toString());
-                if(vo.getFormName().equals("其他扣款")||vo.getFormName().equals("其他费用")){
+                item.setContractAmount(vo.getCurrentMeterMoney() == null ? null : vo.getCurrentMeterMoney().toString());
+                item.setRevisedTotal(vo.getChangeMeterMoney() == null ? null : vo.getChangeMeterMoney().toString());
+                item.setRevisedAmount(vo.getAfterCurrentMeterMoney() == null ? null : vo.getAfterCurrentMeterMoney().toString());
+                item.setCurrentPeriodEndPay(vo.getNowEndMoney() == null ? null : vo.getNowEndMoney().toString());
+                item.setPreviousPeriodEndPay(vo.getBeforeEndMoney() == null ? null : vo.getBeforeEndMoney().toString());
+                item.setCurrentPeriodPay(vo.getNowMoney() == null ? null : vo.getNowMoney().toString());
+                if (vo.getFormName().equals("其他扣款") || vo.getFormName().equals("其他费用")) {
                     item.setNoApply(1);
                 }
                 list.add(item);
@@ -57,26 +59,69 @@ public class InterimPayCertificateItemServiceImpl extends BaseServiceImpl<Interi
 
     @Override
     public void updateInterimPayCertificateItem(List<InterimPayCertificateItem> list4) {
-        if(!list4.isEmpty()){
+        if (!list4.isEmpty()) {
             updateBatchById(list4);
         }
     }
 
     @Override
     public InterimPayCertificateItem selectItem(String cts, Long id) {
-        QueryWrapper wrapper=new QueryWrapper();
-        wrapper.eq("chapter_seq",cts);
-        wrapper.eq("certificate_id",id);
+        QueryWrapper wrapper = new QueryWrapper();
+        wrapper.eq("chapter_seq", cts);
+        wrapper.eq("certificate_id", id);
         InterimPayCertificateItem item = baseMapper.selectOne(wrapper);
-        return item==null?new InterimPayCertificateItem():item;
+        return item == null ? new InterimPayCertificateItem() : item;
     }
 
     @Override
     public void sendJLSmg(Long taskId) {
         //发送短信
-        jdbcTemplate.queryForMap("select  * from u_task where id=" + taskId + " ");
-
-
-
+        Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap("select  * from u_task where id=" + taskId + " ");
+        if (stringObjectMap != null) {
+            String fixedFlowId = stringObjectMap.get("fixed_flow_id")+"";
+            String processInstanceId =  stringObjectMap.get("process_instance_id")+"";
+            if (fixedFlowId != null && processInstanceId.length() > 8) {
+                String smgUser = "SELECT a.id,fixed_flow_link_type,c.phone,fixed_flow_link_sort from u_task_parallel a ,u_fixed_flow_link b,blade_user c where a.sort=b.fixed_flow_branch_sort and a.process_instance_id='" + processInstanceId + "' and a.status=1 and b.fixed_flow_id='" + fixedFlowId + "' and a.task_user=c.id ORDER BY a.sort";
+                List<Map<String, Object>> mapList = jdbcTemplate.queryForList(smgUser);
+                if (mapList != null && mapList.size() >= 1) {
+                    String fixedFlowLinkType = mapList.get(0).get("fixed_flow_link_type") + "";
+                    String fixedFlowLinkSort = mapList.get(0).get("fixed_flow_link_sort") + "";
+                    List<String> phoneList = new ArrayList<>();
+                    if(fixedFlowLinkType.equals("2")){ //平行
+                        for(Map<String, Object> data:mapList){
+                            String fixedFlowLinkSort1 = data.get("fixed_flow_link_sort") + "";
+                            if(fixedFlowLinkSort1.equals(fixedFlowLinkSort)){
+                                phoneList.add(data.get("phone")+"");
+                            }
+                        }
+                    }else { //垂直
+                        String phone = mapList.get(0).get("phone") + "";
+                        phoneList.add(phone);
+                    }
+                    if(phoneList!=null && phoneList.size()>0){
+                        for(String phone:phoneList){
+                            for (int i = 1; i <= 3; i++) {
+                                boolean b = MeMsgUtils.sendMsg(phone);
+                                if (b) {
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                }
+            } else { //自定义流程
+                String smgUser = "SELECT a.id,b.phone,a.sort from u_task_parallel a,blade_user b where a.process_instance_id='" + processInstanceId + "' and a.status=1 and a.task_user=b.id ORDER BY a.sort ";
+                List<Map<String, Object>> mapList = jdbcTemplate.queryForList(smgUser);
+                if (mapList != null && mapList.size() >= 1) {
+                    String phone = mapList.get(0).get("phone") + "";
+                    for (int i = 1; i <= 3; i++) {
+                        boolean b = MeMsgUtils.sendMsg(phone);
+                        if (b) {
+                            return;
+                        }
+                    }
+                }
+            }
+        }
     }
 }

+ 0 - 1
blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java

@@ -534,7 +534,6 @@ public class UserController {
         }
         QueryWrapper<User> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("account", account);
-        // queryWrapper.eq("password", tokenPw);
         queryWrapper.eq("sys_type", 2);
         User userInfo = userService.getOne(queryWrapper);
         if (userInfo == null) {

+ 11 - 1
blade-service/blade-user/src/main/java/org/springblade/system/user/controller/WbsTreeController.java

@@ -14,12 +14,15 @@ import org.springblade.business.vo.InformationQueryVO;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.vo.PrivateTreeVO2;
 import org.springblade.manager.vo.WbsTreeContractLazyVO;
 import org.springblade.system.user.service.IUserService;
 import org.springblade.system.user.vo.InformationQueryVO1;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
@@ -33,6 +36,7 @@ public class WbsTreeController extends BladeController {
     @Autowired
     StringRedisTemplate redisTemplate;
     private final IUserService iUserService;
+    private final JdbcTemplate jdbcTemplate;
 
     /**
      * 客户端懒加载获取合同段树(统计颜色、填报数量)
@@ -61,7 +65,13 @@ public class WbsTreeController extends BladeController {
         List<WbsTreeContractLazyVO> vos;
         String dataInfoId = "";
         if (("1").equals(classifyType)) {
-            dataInfoId = contractId + "_" + parentId + "_" + classifyType + "_" + tableOwner;
+            String sql="Select * from m_contract_relation_jlyz where contract_id_jlyz="+contractId;
+            List<ContractRelationJlyz> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ContractRelationJlyz.class));
+            if(query!=null&&query.size()>1){
+                dataInfoId = contractIdRelation + "_" + parentId + "_" + "1" + "_" + tableOwner;
+            }else {
+                dataInfoId = contractId + "_" + parentId + "_" + classifyType + "_" + tableOwner;
+            }
         } else if (("2").equals(classifyType)) {
             dataInfoId = contractIdRelation + "_" + parentId + "_" + "1" + "_" + tableOwner;
         }

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff