Browse Source

电签提交

zhuwei 6 days ago
parent
commit
6a11539449
32 changed files with 756 additions and 431 deletions
  1. 2 2
      blade-common/src/main/java/org/springblade/common/utils/AsyncConfigurer.java
  2. 3 2
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java
  3. 0 117
      blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/LargeFileEndpoint.java
  4. 3 2
      blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/NewIOSSClientImpl.java
  5. 4 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskSignInfoVO.java
  6. 1 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/config/sqliteConfig.java
  7. 12 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java
  8. 14 7
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileTaskController.java
  9. 3 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveOfflineVersionInfoMapper.java
  10. 5 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveOfflineVersionInfoMapper.xml
  11. 1 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  12. 40 43
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveOfflineVersionInfoServiceImpl.java
  13. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  14. 40 25
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/MetadataClassificationServiceImpl.java
  15. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  16. 24 25
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVController.java
  17. 3 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVisaController.java
  18. 3 7
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ScrController.java
  19. 150 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/synDataController.java
  20. 127 106
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVDataServiceImpl.java
  21. 10 9
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java
  22. 4 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/PDFUtils.java
  23. 3 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/SignFtpUtil.java
  24. 204 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/SignFtpUtilBy210.java
  25. 0 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java
  26. 0 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  27. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java
  28. 1 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  29. 0 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  30. 91 63
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  31. 2 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/utils/MeMsgUtils.java
  32. 3 2
      blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java

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

@@ -15,7 +15,7 @@ public class AsyncConfigurer {
     /**
      * cpu 核心数量
      */
-    public static final int cpuNum = 5 ;//Runtime.getRuntime().availableProcessors();
+    public static final int cpuNum = 1 ;//Runtime.getRuntime().availableProcessors();
 
     /**
      * 线程池配置
@@ -24,7 +24,7 @@ public class AsyncConfigurer {
     @Bean("taskExecutor1")
     public ThreadPoolExecutor getAsyncExecutor() {
         return new ThreadPoolMonitor(cpuNum
-                , 10
+                , 15
                 , 180
                 , TimeUnit.SECONDS
                 , new LinkedBlockingQueue<>(2000)

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

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

+ 0 - 117
blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/LargeFileEndpoint.java

@@ -127,123 +127,6 @@ public class LargeFileEndpoint {
         return R.success("删除成功");
     }
 
-/*
-
-    */
-/**
-     * @return
-     * @throws Exception
-     **//*
-
-    @SneakyThrows
-    @PostMapping("/upload-file1234")
-    public R uploadByfile123(@RequestParam(value = "file", required = false) MultipartFile file,
-                             @RequestParam(value = "identifier", required = false) String identifier,
-                             @RequestParam(value = "chunkNumber", required = false) Integer chunkNumber,
-                             @RequestParam(value = "chunkSize", required = false) Integer chunkSize,
-                             @RequestParam(value = "currentChunkSize", required = false) String currentChunkSize,
-                             @RequestParam(value = "filename", required = false) String filename,
-                             @RequestParam(value = "relativePath", required = false) String relativePath,
-                             @RequestParam(value = "totalChunks", required = false) Integer totalChunks,
-                             @RequestParam(value = "totalSize", required = false) String totalSize,
-                             @RequestParam(value = "objectType", required = false) String objectType) {
-
-        // 文件上传
-        String taskKey = "upload/20221220/" + filename;
-        UmsAdminLoginLogDO param = new UmsAdminLoginLogDO();
-        if (file == null && totalChunks >= 0 && StringUtils.isNotEmpty(identifier)) {
-            // 请求阿里云oss获取分片唯一ID
-            String ossSlicesId = this.getUploadId(taskKey);
-            RedisTemplate.opsForValue().set(identifier, ossSlicesId);
-            return R.fail("没有文件");
-        }
-
-        String uploadId = RedisTemplate.opsForValue().get(identifier);
-
-        UmsAdminLoginLogDO redisParam = (UmsAdminLoginLogDO) CacheUtil.get("oss", "PartETag", uploadId);
-        if (redisParam != null) {
-            param.setPartETags(redisParam.getPartETags());
-        }
-
-        Map<Integer, PartETag> partETags = param.getPartETags();
-
-        UploadPartRequest request = new UploadPartRequest();
-        request.setInputStream(file.getInputStream());
-        request.setBucketName(bucketName);
-        request.setPartNumber(chunkNumber);
-        request.setPartSize(Long.parseLong(currentChunkSize));
-        request.setKey(filename);
-        request.setMd5Digest(identifier);
-        request.setUploadId(uploadId);
-
-        try {
-            UploadPartResult uploadPartResult = ossBuilder.template().uploadPart(request);
-            PartETag partETag = uploadPartResult.getPartETag();
-            partETags.put(chunkNumber, partETag);
-            //分片编号等于总片数的时候合并文件,如果符合条件则合并文件,否则继续等待
-            if (chunkNumber == totalChunks) {
-                //合并文件,注意:partETags必须是所有分片的所以必须存入redis,然后取出放入集合
-                String url = this.completePartUploadFile(filename, uploadId,
-                        new ArrayList<>(partETags.values()));
-                //oss地址返回后存入并清除redis
-                RedisTemplate.delete(uploadId);
-                return R.data(url);
-            } else {
-                RedisTemplate.opsForHash().putAll(uploadId, partETags);
-                CacheUtil.put("oss", "PartETag", uploadId, param);
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        return R.data("");
-    }
-
-    */
-/**
-     * 分块上传完成获取结果
-     *//*
-
-    public String completePartUploadFile(String fileKey, String uploadId, List<PartETag> partETags) {
-        CompleteMultipartUploadRequest request = new CompleteMultipartUploadRequest(bucketName, fileKey, uploadId,
-                partETags);
-        ossBuilder.template().completeMultipartUpload(request);
-        String downLoadUrl = getDownloadUrl(fileKey, bucketName);
-        return downLoadUrl;
-    }
-
-    */
-/**
-     * 获取bucket文件的下载链接
-     *
-     * @param pathFile   首字母不带/的路径和文件
-     * @param bucketName
-     * @return 上报返回null, 成功返回地址
-     *//*
-
-    public String getDownloadUrl(String pathFile, String bucketName) {
-        if (bucketName == null || "".equals(bucketName)) {
-            bucketName = bucketName;
-        }
-        StringBuffer url = new StringBuffer();
-        url.append("http://").append(bucketName).append(endpoint).append("/");
-        if (pathFile != null && !"".equals(pathFile)) {
-            url.append(pathFile);
-        }
-        return url.toString();
-    }
-
-    public String getUploadId(String fileKey) {
-        InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, fileKey);
-        // 初始化分片
-        InitiateMultipartUploadResult unrest = ossBuilder.template().initiateMultipartUpload(request);
-        // 返回uploadId,它是分片上传事件的唯一标识,您可以根据这个ID来发起相关的操作,如取消分片上传、查询分片上传等。
-        String uploadId = unrest.getUploadId();
-        return uploadId;
-    }
-
-*/
-
     /**
      * @return
      * @throws Exception-----------------------------------------------------------------------

+ 3 - 2
blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/NewIOSSClientImpl.java

@@ -86,8 +86,9 @@ public class NewIOSSClientImpl implements NewIOSSClient {
     public BladeFile uploadFile(String fileName, String localFileUrl) {
         try {
             //获取文件流
-            InputStream inputStream = new FileInputStream(new File(localFileUrl));
-            return this.ossBuilder.template().putFile(fileName, inputStream);
+            InputStream inputStream = new FileInputStream(localFileUrl);
+            BladeFile bladeFile = this.ossBuilder.template().putFile(fileName, inputStream);
+            return bladeFile;
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 4 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskSignInfoVO.java

@@ -37,7 +37,7 @@ public class TaskSignInfoVO {
     private String comment;
 
     @ApiModelProperty("用户ID")
-    private Long userId;
+    private String userId;
 
     @ApiModelProperty("签字人名")
     private String nickName;
@@ -63,6 +63,9 @@ public class TaskSignInfoVO {
     @ApiModelProperty("数据类型")
     private String pdfDataType;
 
+    @ApiModelProperty("taskBatch的主键Id")
+    private String batchIds;
+
     /**
      * 获取是否通过
      */

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

@@ -22,10 +22,8 @@ public class sqliteConfig {
 
     public DataSource dataSource() {
         DruidDataSource ds = new DruidDataSource();
-//        ds.setUrl("jdbc:sqlite:D:\\BaiduNetdiskDownload\\bladeX后端开发手册\\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.setUrl("jdbc:sqlite:"+fileUrl+"/localArchiveFile/localArchive/data");
         ds.setDriverClassName("org.sqlite.JDBC");
         return ds;
     }

+ 12 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java

@@ -123,6 +123,18 @@ public class ArchiveFileController extends BladeController {
         return R.data(true);
     }
 
+    /**
+     * 批量新增
+     */
+    @PostMapping("/getMetaFileById")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "重新获取文件的元数据")
+    public R<Boolean> getMetaFileById(@RequestParam Long fileId) {
+        metadataClassificationClient.createMetadataFile(fileId, 0);
+        return R.success("成功");
+    }
+
+
     /**
      * 分页
      */

+ 14 - 7
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileTaskController.java

@@ -8,6 +8,8 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
 import org.springblade.archive.dto.ArchiveTaskDTO;
 import org.springblade.archive.vo.ArchiveTaskPageVO;
 import org.springblade.business.entity.ArchiveFile;
@@ -65,7 +67,7 @@ public class ArchiveFileTaskController extends BladeController {
             List<ArchiveFile> archiveFileList = jdbcTemplate.query("select * from u_archive_file where id in(" + ids + ")", new BeanPropertyRowMapper<>(ArchiveFile.class));
             if (archiveFileList.size() > 0) {
                 //固定水印图片章
-                String pngQzUrl = "https://bladex-chongqing-info.oss-cn-hangzhou.aliyuncs.com//upload/20230911/5b42583d931664b785ebf481c37d17bc.png";
+                String pngQzUrl = "https://blade-oss-chongqing.oss-cn-shenzhen.aliyuncs.com//upload/20250221/7686a428dd1fe2cc7086dae94f0b3a9d.png";
                 for (ArchiveFile archiveFile : archiveFileList) {
                     if (Arrays.asList(1, 2).contains(archiveFile.getStatus())) {
                         throw new ServiceException("只有【未上报 或 已废除】状态的业务数据才能认证!");
@@ -80,22 +82,27 @@ public class ArchiveFileTaskController extends BladeController {
                     }
 
                     InputStream ossInputStreamPDF = CommonUtil.getOSSInputStream(pdfUrl);
-                    PdfReader reader = null;
+                    PDDocument document = null;
                     if (ossInputStreamPDF != null) {
-                        reader = new PdfReader(ossInputStreamPDF);
+                        document = PDDocument.load(ossInputStreamPDF);
                     }
-                    if (reader != null) {
+
+
+
+                    if (document != null) {
                         //封装签章定位入参dto
                         org.springblade.evisa.vo.TaskArchiveDTO eVISATaskArchiveDTO = new TaskArchiveDTO();
                         //每条档案业务数据对应的pdf签章集合
                         List<TaskArchiveDTO.Sign> signList = new ArrayList<>();
-                        for (int i = 1; i <= reader.getNumberOfPages(); i++) {
+                       // for (int i = 0; i < document.getPages().getCount(); i++) {
                             //构造签章对象
                             TaskArchiveDTO.Sign sign = new TaskArchiveDTO.Sign();
-                            sign.setPage(String.valueOf(i)); //页码
+                            sign.setPage("1"); //页码
                             sign.setUrl(pngQzUrl); //签章图片url
+                            sign.setLx("100");
+                            sign.setLy("100");
                             signList.add(sign);
-                        }
+                       // }
                         eVISATaskArchiveDTO.setSealStrategy(signList);
                         eVISATaskArchiveDTO.setTaskId(archiveFile.getId().toString());
                         eVISATaskArchiveDTO.setType(2); //认证

+ 3 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveOfflineVersionInfoMapper.java

@@ -5,6 +5,7 @@ import org.apache.ibatis.annotations.Param;
 import org.springblade.archive.entity.ArchiveOfflineVersionInfo;
 import org.springblade.business.entity.MetadataClassification;
 import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.entity.ProjectInfo;
 
 import java.util.HashMap;
 import java.util.List;
@@ -26,4 +27,6 @@ public interface ArchiveOfflineVersionInfoMapper extends BaseMapper<ArchiveOffli
     void updateById2(@Param("info") ArchiveOfflineVersionInfo info);
 
     List<ArchiveTreeContract> getListByProjectId(@Param("projectId") Long projectId);
+
+    ProjectInfo getProjectInfo(@Param("projectId") Long projectId);
 }

+ 5 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveOfflineVersionInfoMapper.xml

@@ -37,4 +37,9 @@
         from m_archive_tree_contract
         where project_id=#{projectId} and is_deleted = 0 order by tree_sort asc;
     </select>
+    <select id="getProjectInfo" resultType="org.springblade.manager.entity.ProjectInfo">
+        select * from m_project_info where id = #{projectId} and is_deleted = 0;
+    </select>
+
+
 </mapper>

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

@@ -553,7 +553,7 @@
     <select id="getListByProjectId" resultType="org.springblade.archive.dto.ArchivesAutoDTO">
         select *
         from u_archives_auto
-        where project_id = #{projectId} and is_deleted = 0 limit 1;
+        where project_id = #{projectId} and is_deleted = 0;
     </select>
     <select id="pageByArchivesAuto" resultMap="archivesAutoResultMap">
         select uaa.*

+ 40 - 43
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveOfflineVersionInfoServiceImpl.java

@@ -1,5 +1,6 @@
 package org.springblade.archive.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import lombok.AllArgsConstructor;
 import org.springblade.archive.config.sqliteConfig;
 import org.springblade.archive.dto.ArchivesAutoDTO;
@@ -19,6 +20,7 @@ import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.feign.ArchiveTreeContractClient;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springframework.scheduling.annotation.Async;
@@ -26,6 +28,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.Statement;
@@ -64,15 +68,15 @@ public class ArchiveOfflineVersionInfoServiceImpl extends BaseServiceImpl<Archiv
         info.setProjectId(projectId);
         info.setUploadDate(LocalDateTime.now());
         infoMapper.insert(info);
-//        String localUrl = "/www/wwwroot/localClient/local_archives/alilib";
-//        String packUrl = "/www/wwwroot/localClient";
-//        String zipUrl = "/www/wwwroot/localClient.zip";
         String fileUrl = FileUtils.getSysLocalFileUrl();
-        String localUrl = fileUrl+"localArchive/pdf";
-        String packUrl = fileUrl+"localArchive";
-        String zipUrl = fileUrl+"localArchive/"+projectId;
+        String localUrl = fileUrl+"localArchiveFile/localArchive/pdf";
+        String packUrl = fileUrl+"localArchiveFile/";
+        String zipUrl = fileUrl+"localArchiveFile/"+projectId;
+
         //清空url的文件夹
         CommonUtil.deleteDir(localUrl);
+        // 将项目信息 写入json文件
+        this.setProjectInfo(projectId);
         //导入档案到sqlite
         this.autoToSqlite(projectId);
         System.out.println("导入档案到sqlite");
@@ -89,17 +93,13 @@ public class ArchiveOfflineVersionInfoServiceImpl extends BaseServiceImpl<Archiv
         this.metadataFieldToSqlite();
         System.out.println("导入元数据通用字段");
         //打包文件
-//        CommonUtil.packageZip(packUrl,zipUrl);
         this.packageZip2(zipUrl,packUrl);
         System.out.println("打包文件完成");
         //上传文件
-//        File zipFile = ResourceUtil.getFile(zipUrl);
-        //BladeFile bladeFile = ossBuilder.template().putFile("localClient.zip",new FileInputStream(zipFile));
-//        BladeFile bladeFile = newIOSSClient.uploadFile("localClient.zip", zipUrl);
-        info.setFileUrl("http://fileinfo.hczcxx.cn/localArchive/"+projectId+"/localArchive.zip");
-        info.setFileName("localArchive.zip");
+        info.setFileUrl("http://fileinfo.hczcxx.cn/localArchiveFile/"+projectId+"/localArchive.hczc");
+        info.setFileName("localArchive.hczc");
         info.setUploadDate(LocalDateTime.now());
-        File file = new File(zipUrl+"/localArchive.zip");
+        File file = new File(zipUrl+"/localArchive.hczc");
         info.setFileSize(file.length()+"");
         baseMapper.updateById2(info);
     }
@@ -116,13 +116,20 @@ public class ArchiveOfflineVersionInfoServiceImpl extends BaseServiceImpl<Archiv
         if (!folder.exists() && !folder.isDirectory()) {
             folder.mkdirs();
         }
+        String zipUrlUrl = zipUrl+"/" + "localArchive.zip";
+        String hczcUrlUrl = zipUrl+"/" + "localArchive.hczc";
         // 执行脚本文件
         // 多条命令执行
-        String[] cmds = {"/bin/sh", "-c", "cd "+packUrl+" && zip -q -r "+zipUrl+"/localArchive.zip localClient"};
+        String[] cmds = {"/bin/sh", "-c", "cd "+packUrl+" && zip -q -r "+zipUrlUrl+" localArchive"};
         System.out.println("开始执行命令:" + Arrays.toString(cmds));
         //主要在这步写入后调用命令
         Process process = Runtime.getRuntime().exec(cmds);
         process.waitFor();
+
+        File zipFile = new File(zipUrlUrl);
+        File hczcFile = new File(hczcUrlUrl);
+
+        boolean b = zipFile.renameTo(hczcFile);
     }
 
     public void metadataFieldToSqlite() {
@@ -291,17 +298,8 @@ 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 = FileUtils.getSysLocalFileUrl()+"localArchive/pdf/";
+            String localUrl = FileUtils.getSysLocalFileUrl()+"localArchiveFile/localArchive/pdf/";
             for (ArchiveFile file : list) {
-//                if (StringUtil.isNotBlank(file.getFileUrl())) {
-//                    String fileUrl = file.getFileUrl();
-//                    String fileName = fileUrl.substring(fileUrl.lastIndexOf('/') + 1);
-//                    InputStream file_out = CommonUtil.getOSSInputStream(fileUrl);
-//                    if (file_out != null) {
-//                        CommonUtil.inputStreamToFile(file_out, new File(localUrl + fileName));
-//                        file.setFileUrl(fileName);
-//                    }
-//                }
                 if (StringUtil.isNotBlank(file.getPdfFileUrl())) {
                     String pdfFileUrl = file.getPdfFileUrl();
                     String fileName = pdfFileUrl.substring(pdfFileUrl.lastIndexOf('/') + 1);
@@ -360,6 +358,7 @@ public class ArchiveOfflineVersionInfoServiceImpl extends BaseServiceImpl<Archiv
     }
 
     public void contractToSqlite(Long projectId) {
+
         List<ArchiveTreeContract> list = baseMapper.getListByProjectId(projectId);
         if (list != null && list.size() > 0) {
             try {
@@ -402,28 +401,26 @@ public class ArchiveOfflineVersionInfoServiceImpl extends BaseServiceImpl<Archiv
         }
     }
 
+    public void setProjectInfo(Long projectId) {
+        ProjectInfo projectInfo = baseMapper.getProjectInfo(projectId);
+        JSONObject obj = new JSONObject();
+        obj.put("key", projectInfo.getId());
+        obj.put("name", projectInfo.getProjectName());
+
+        // 指定文件路径
+        String filePath = FileUtils.getSysLocalFileUrl()+"localArchive/dataInfo/config.json";
+        try (FileWriter file = new FileWriter(filePath)) {
+            // 将JSONObject写入文件
+            file.write(obj.toString());
+            file.flush();
+            System.out.println("JSON对象已成功写入文件。");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
     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/pdf/";
-            //拼接档案里文件的pdf设置allPdf
-//            for (ArchivesAutoDTO dto : list) {
-//                List<ArchiveFile> files = fileClient.getArchiveFileByArchivesId(dto.getId() + "", "");
-//                if (files != null && files.size() > 0) {
-//                    List<String> urlList = new ArrayList<>();
-//                    for (ArchiveFile file : files) {
-//                        if (StringUtil.isNotBlank(file.getPdfFileUrl())) {
-//                            urlList.add(file.getPdfFileUrl());
-//                        }
-//                    }
-//                    if (urlList.size() > 0) {
-//                        Long id = SnowFlakeUtil.getId();
-//                        FileUtils.mergePdfPublicMethods(urlList, localUrl + id + ".pdf");
-//                        dto.setAllFilePdf(id + ".pdf");
-//                    }
-//                }
-//
-//            }
             try {
                 Connection conn = data.dataSource().getConnection();
                 //清空数据

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

@@ -1908,7 +1908,7 @@ public class TaskController extends BladeController {
         //获取节点pdf ,先获取formData集合
         List<String> queryIds = resultList.stream().map(l -> l.getFormDataId()).collect(Collectors.toList());
         String join = StringUtils.join(queryIds, ",");
-        Map<Long, String> query = jdbcTemplate.query("select id ,e_visa_pdf_url from u_information_query where is_deleted = 0 and id in ( " + join + ")", new BeanPropertyRowMapper<>(InformationQuery.class)).stream().collect(Collectors.toMap(InformationQuery::getId, l -> StringUtils.isBlank(l.getEVisaPdfUrl()) ? "" : l.getEVisaPdfUrl()));
+        Map<Long, String> query = jdbcTemplate.query("select * from (select id ,IFNULL(e_visa_pdf_url,pdf_url) as e_visa_pdf_url ,is_deleted from u_information_query union select id ,IFNULL(e_visa_pdf_url,pdf_url) as e_visa_pdf_url,is_deleted from u_contract_log )c  where c.is_deleted = 0 and c.id in ( " + join + ")", new BeanPropertyRowMapper<>(InformationQuery.class)).stream().collect(Collectors.toMap(InformationQuery::getId, l -> StringUtils.isBlank(l.getEVisaPdfUrl()) ? "" : l.getEVisaPdfUrl()));
 
         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         List<BusinessTaskFailedPageVO> pageList = resultList.stream()

+ 40 - 25
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/MetadataClassificationServiceImpl.java

@@ -402,13 +402,22 @@ public class MetadataClassificationServiceImpl
             /**垂直分辨率**/
 //            keyValue.put("垂直分辨率", byId.getReferCode());
 
-            /**格式名称**/
-            keyValue.put("格式名称", byId.getFileUrl().substring(byId.getFileUrl().lastIndexOf(".") + 1));
-            /**存储位置**/
-            keyValue.put("存储位置", byId.getFileUrl());
-            /**计算机文件名**/
-            String substring = byId.getFileUrl().substring(byId.getFileUrl().lastIndexOf("/") + 1, byId.getFileUrl().lastIndexOf("."));
-            keyValue.put("计算机文件名", substring);
+
+            String fileUrl = byId.getFileUrl();
+            if(fileUrl!=null && Func.isNotEmpty(fileUrl)){
+                /**格式名称**/
+               if (fileUrl.contains(".")) {
+                   keyValue.put("格式名称", fileUrl.substring(fileUrl.lastIndexOf(".") + 1));
+               } else {
+                   keyValue.put("格式名称", "");
+               }
+                /**存储位置**/
+                keyValue.put("存储位置", fileUrl);
+                /**计算机文件名**/
+                String substring = fileUrl.substring(fileUrl.lastIndexOf("/") + 1, fileUrl.lastIndexOf("."));
+                keyValue.put("计算机文件名", substring);
+            }
+
             /**计算机文件大小**/
             keyValue.put("计算机文件大小", byId.getFileSize());
             /**扫描分辨率 300dpi**/
@@ -432,7 +441,9 @@ public class MetadataClassificationServiceImpl
             }
 
             /**业务事项**/
-            keyValue.put("业务事项", StorageTypeEnum.getByCode(archiveTreeContractById.getStorageType()));
+            if (archiveTreeContractById.getStorageType() != null && Func.isNotEmpty(archiveTreeContractById.getStorageType())) {
+                keyValue.put("业务事项", StorageTypeEnum.getByCode(archiveTreeContractById.getStorageType()));
+            }
             /**单位工程**/
             keyValue.put("单位工程", StringUtils.isNotBlank(unitProjectString.toString()) ? unitProjectString.substring(0, unitProjectString.length()-1) : null);
             /**单位工程编码**/
@@ -540,23 +551,27 @@ public class MetadataClassificationServiceImpl
                                  StringBuffer itemizedProjectIdString){
         // 判断archiveTreeContract中displayHierarchy属性值
         String displayHierarchy = archiveTreeContract.getDisplayHierarchy();
-        String nodeName = archiveTreeContract.getNodeName();
-        Long id = archiveTreeContract.getId();
-        if(displayHierarchy.equals("1")){// 单位工程
-            unitProjectString.append(nodeName);
-            unitProjectString.append("/");
-            unitProjectIdString.append(id);
-            unitProjectIdString.append("/");
-        }else if(displayHierarchy.equals("2")){// 分部工程
-            divisionProjectString.append(nodeName);
-            divisionProjectString.append("/");
-            divisionProjectIdString.append(id);
-            divisionProjectIdString.append("/");
-        }else if(displayHierarchy.equals("4")){// 分项工程
-            itemizedProjectString.append(nodeName);
-            itemizedProjectString.append("/");
-            itemizedProjectIdString.append(id);
-            itemizedProjectIdString.append("/");
+        if(displayHierarchy!=null && Func.isNotEmpty(displayHierarchy)) {
+
+
+            String nodeName = archiveTreeContract.getNodeName();
+            Long id = archiveTreeContract.getId();
+            if (displayHierarchy.equals("1")) {// 单位工程
+                unitProjectString.append(nodeName);
+                unitProjectString.append("/");
+                unitProjectIdString.append(id);
+                unitProjectIdString.append("/");
+            } else if (displayHierarchy.equals("2")) {// 分部工程
+                divisionProjectString.append(nodeName);
+                divisionProjectString.append("/");
+                divisionProjectIdString.append(id);
+                divisionProjectIdString.append("/");
+            } else if (displayHierarchy.equals("4")) {// 分项工程
+                itemizedProjectString.append(nodeName);
+                itemizedProjectString.append("/");
+                itemizedProjectIdString.append(id);
+                itemizedProjectIdString.append("/");
+            }
         }
     }
 }

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

@@ -1925,7 +1925,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                                 approvalVO.setTaskId(task.getId().toString());
                                 approvalVO.setFlag("OK");
                                 approvalVO.setComment("重新发起电签");
-                                approvalVO.setApprovalType(1);
+                                approvalVO.setApprovalType(task.getApprovalType());
                                 approvalVO.setFormDataId(task.getFormDataId());
                                 approvalVO.setParallelProcessInstanceId(taskParallel.getParallelProcessInstanceId());
                                 approvalVO.setYsNickName(taskParallel.getTaskUserName());

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

@@ -8,6 +8,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.business.entity.Task;
 import org.springblade.business.feign.TaskClient;
+import org.springblade.business.vo.ScrSignInfoVO;
 import org.springblade.business.vo.TaskApprovalVO;
 import org.springblade.business.vo.TaskSignInfoVO;
 import org.springblade.common.utils.SystemUtils;
@@ -17,6 +18,7 @@ import org.springblade.evisa.service.EVisaService;
 import org.springblade.evisa.vo.EVisaTaskApprovalVO;
 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.scheduling.annotation.Scheduled;
 import org.springframework.transaction.annotation.Transactional;
@@ -59,44 +61,41 @@ public class EVController {
     @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 and id=1871438158680403970 ORDER BY sign_type ASC ";
+        String sql = "SELECT GROUP_CONCAT(id) as id, JSON_UNQUOTE(JSON_EXTRACT(json_data, '$.taskId')) as taskId," +
+                "GROUP_CONCAT(JSON_EXTRACT(json_data, '$.parallelProcessInstanceId')) as parallelProcessInstanceId," +
+                "JSON_UNQUOTE(JSON_EXTRACT(json_data, '$.formDataId')) as formDataId," +
+                "JSON_EXTRACT(json_data, '$.approvalType') as approvalType," +
+                "JSON_UNQUOTE(JSON_EXTRACT(json_data, '$.flag')) as flag," +
+                "GROUP_CONCAT(create_user) as userId," +
+                "GROUP_CONCAT(nick_name) as nickName," +
+                "sign_type as sigType" +
+                " from u_task_batch where is_deleted=0 GROUP BY JSON_EXTRACT(json_data, '$.formDataId'),sign_type ORDER BY sign_type ASC ";
+
+        List<TaskSignInfoVO> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TaskSignInfoVO.class));
 
-        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
-        if (maps != null && maps.size() >= 1 ) {
-            for (Map<String, Object> dataInfo : maps) {
+        if (query != null && query.size() >= 1 ) {
+            for (TaskSignInfoVO dataInfo : query) {
                 if (executor.getQueue().size()<=20 ) {
-                    String jsonData = dataInfo.get("json_data") + "";
-                    String signFormat = dataInfo.get("sign_format") + "";
-                    String sigType = dataInfo.get("sign_type") + "";
-                    TaskSignInfoVO taskSignInfoVO = JSON.parseObject(jsonData, TaskSignInfoVO.class);
-                    String taskBatchId = dataInfo.get("id").toString();
-                    Long userId = Long.valueOf(dataInfo.get("create_user") + "");
-                    String nickName = dataInfo.get("nick_name") + "";
-                    Boolean aBoolean = RedisTemplate.hasKey("sign-" + taskSignInfoVO.getFormDataId());
-                    taskSignInfoVO.setId(taskBatchId);
-                    taskSignInfoVO.setUserId(userId);
-                    taskSignInfoVO.setNickName(nickName);
-                    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()+"'";
+                    Boolean aBoolean = RedisTemplate.hasKey("sign-" + dataInfo.getFormDataId());
+                    if(dataInfo.getSigType()==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='"+dataInfo.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+"");
+                          jdbcTemplate.execute("delete from u_task_batch where id="+dataInfo.getId()+"");
                           aBoolean = true;
                       }
-                    }else{
-                        taskSignInfoVO.setSigType(1);
+                    }else {
+                        dataInfo.setSigType(1);
                     }
                     if (!aBoolean) {
-                        RedisTemplate.opsForValue().set("sign-" + taskSignInfoVO.getFormDataId(), "1",1800, TimeUnit.SECONDS);
+                        RedisTemplate.opsForValue().set("sign-" + dataInfo.getFormDataId(), "1",7200, TimeUnit.SECONDS);
                         CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
                             try {
                                 /*===============执行批量任务===============*/
-                                evDataService.signTaskBatch(taskSignInfoVO);
+                                evDataService.signTaskBatch(dataInfo);
                             } catch (Exception e) {
                                 e.printStackTrace();
                             }

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

@@ -7,6 +7,7 @@ import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.business.entity.Task;
+import org.springblade.business.feign.MessageWarningClient;
 import org.springblade.business.feign.TaskClient;
 import org.springblade.business.vo.TaskApprovalVO;
 import org.springblade.common.utils.SystemUtils;
@@ -56,6 +57,8 @@ public class EVisaController {
 
     private final TaskClient taskClient;
 
+    private final MessageWarningClient messageWarningClient;
+
 
     // 电签主类
 

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

@@ -45,14 +45,10 @@ 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,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) ";
+        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=1878990827573747714 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 ) {
@@ -62,7 +58,7 @@ public class ScrController {
                     Boolean aBoolean = RedisTemplate.hasKey("sign-" + nodeId);
 
                     if (!aBoolean) {
-                        RedisTemplate.opsForValue().set("sign-" + nodeId, "1",1800, TimeUnit.SECONDS);
+                        RedisTemplate.opsForValue().set("sign-" + nodeId, "1",3600, TimeUnit.SECONDS);
                         CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
                             try {
                                 /*===============执行批量任务===============*/

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

@@ -0,0 +1,150 @@
+package org.springblade.evisa.controller;
+
+
+import io.swagger.annotations.Api;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+import org.springblade.core.tool.utils.FileUtil;
+import org.springblade.core.tool.utils.IoUtil;
+import org.springblade.evisa.utils.SignFtpUtilBy210;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+
+/**
+ * 清表基础数据表 控制器
+ *
+ * @author BladeX
+ * @since 2022-05-18
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/evisaInfo")
+@Api(value = "电签类", tags = "电签类接口")
+@Slf4j
+public class synDataController {
+
+    @Autowired
+    StringRedisTemplate RedisTemplate;
+
+    // jdbc
+    private final JdbcTemplate jdbcTemplate;
+
+
+    // 线程池
+    @Resource(name = "taskExecutor1")
+    private ThreadPoolExecutor executor;
+
+
+
+    // 默认值定时器操作
+    //@Scheduled(cron = "0/10 * * * * ?")
+    public void SignInfo() {
+        //执行代码
+        log.info("扫描开始");
+        String sql = "SELECT MAX(p_key_id) as p_key_id,html_url from m_wbs_tree_private22 where type=2 and is_deleted=0 and wbs_type=1 and html_url is not null  GROUP BY html_url LIMIT 30";
+        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
+        if (maps != null && maps.size() >= 1) {//&& SystemUtils.isLinux()
+            for (Map<String, Object> dataInfo : maps) {
+                if (executor.getQueue().size()<=40 ) {
+                    String pKeyId = dataInfo.get("p_key_id").toString();
+                    String htmlUrl = dataInfo.get("html_url") + "";
+                    Boolean aBoolean = RedisTemplate.hasKey("sign-" + pKeyId);
+
+                    if (!aBoolean) {
+                        RedisTemplate.opsForValue().set("sign-" + pKeyId, "1",100, TimeUnit.SECONDS);
+                        CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
+                            try {
+                                /*===============执行批量任务===============*/
+                                this.checkIsExsitTaskBatch(pKeyId,htmlUrl );
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            }
+                        }, executor);
+                    }
+                }
+            }
+        }
+        System.out.println("队列数量" + executor.getQueue().size());
+        System.out.println("活跃数量" + executor.getActiveCount());
+        System.out.println("总共数量" + executor.getTaskCount());
+        System.out.println("完成数量" + executor.getCompletedTaskCount());
+    }
+
+    // 逻辑处理
+    private void checkIsExsitTaskBatch(String pKeyId, String htmlUrl) throws FileNotFoundException {
+        String textSql  = "SELECT * from m_textdict_info where tab_id='"+pKeyId+"' and type=4";
+        List<Map<String, Object>> mapList = jdbcTemplate.queryForList(textSql);
+        if(mapList.size()>=1){
+            String reHtml = "";
+            String htmlName = "";
+            if(htmlUrl.indexOf("hongchuangyanfa/Desktop")>=0){
+                reHtml = htmlUrl.substring(htmlUrl.lastIndexOf("hongchuangyanfa/Desktop/")+24,htmlUrl.length());
+            }
+            htmlName = htmlUrl.substring(htmlUrl.lastIndexOf("/")+1,htmlUrl.length());
+            String localUrl = "/Users/hongchuangyanfa/Desktop/pdf/"+htmlName;
+            SignFtpUtilBy210.downloadFile(localUrl, reHtml);
+
+            //读取html页面信息
+            InputStream inputStreamByUrl = new FileInputStream(new File(localUrl));
+            String htmlString = IoUtil.readToString(inputStreamByUrl);
+
+            //样式集合
+            Document doc = Jsoup.parse(htmlString);
+            //解析
+            Element table = doc.select("table").first();
+            if(table!=null) {
+                Elements trs = table.select("tr");
+                for (Map<String, Object> dataText : mapList) {
+                    String trindex = dataText.get("col_key") + "";
+                    String sigRoleName = dataText.get("sig_role_name") + "";
+
+                    Elements elementsByAttribute = table.getElementsByAttributeValue("keyname", trindex);
+                    if (elementsByAttribute.size() >= 1) {
+                        for (Element element : elementsByAttribute) {
+                            if (element.html().indexOf("el-input") >= 0) {
+                                if (!element.hasAttr("defText")) {
+                                    element.children().removeAttr("defText");
+                                    element.children().attr("defText", sigRoleName);
+                                }
+
+                            } else {
+                                if (!element.hasAttr("defText")) {
+                                    element.children().removeAttr("defText");
+                                    element.attr("defText", sigRoleName);
+                                }
+                            }
+                            File writeFile = new File(localUrl);
+                            FileUtil.writeToFile(writeFile, doc.html(), Boolean.parseBoolean("UTF-8"));
+                        }
+                    }
+                }
+                SignFtpUtilBy210.uploadFile(localUrl,reHtml);
+            }
+        }
+        String upSql  = "update m_wbs_tree_private22 set is_deleted=10 where p_key_id='"+pKeyId+"'";
+        jdbcTemplate.execute(upSql);
+        RedisTemplate.delete("sign-" + pKeyId);
+    }
+
+}

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

@@ -8,6 +8,7 @@ import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.business.entity.InformationQuery;
 import org.springblade.business.entity.TrialSelfInspectionRecord;
+import org.springblade.business.feign.MessageWarningClient;
 import org.springblade.business.feign.TaskClient;
 import org.springblade.business.vo.TaskSignInfoVO;
 import org.springblade.business.vo.TrialRawMaterialSelfRecord;
@@ -65,13 +66,14 @@ public class EVDataServiceImpl implements EVDataService {
     @Autowired
     StringRedisTemplate RedisTemplate;
     @Autowired
-    private StartEventListener startEventListener;
+     private final MessageWarningClient messageWarningClient;
 
     /**
      * 电签主要流程
      *
      * @param taskApp
      */
+
     @Override
     public void signTaskBatch(TaskSignInfoVO taskApp) {
         //获取pdf 文件
@@ -145,7 +147,7 @@ public class EVDataServiceImpl implements EVDataService {
             // 修改 主 任务 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());
+            this.jdbcTemplate.execute("delete from u_task_batch where id in("+taskApp.getId()+")");
             jdbcTemplate.execute(up_task_par);
             jdbcTemplate.execute(up_task);
 
@@ -157,6 +159,8 @@ public class EVDataServiceImpl implements EVDataService {
                 jdbcTemplate.execute("update u_information_query set e_visa_pdf_url='',status=0 where id='"+taskApp.getFormDataId()+"'");
             }
             RedisTemplate.delete("sign-" + taskApp.getFormDataId());
+            // 添加废除通知
+            //messageWarningClient.
         }
     }
 
@@ -168,8 +172,13 @@ public class EVDataServiceImpl implements EVDataService {
             List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
             String id = SnowFlakeUtil.getId() + "";
             if (maps == null || maps.size() == 0) {
+                String batchId = taskApp.getId();
+                if(taskApp.getId().indexOf(",")>=0){
+                    batchId = taskApp.getId().split(",")[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() + "";
+                        "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=" + batchId + "";
                 jdbcTemplate.execute(sql2);
             }
         }
@@ -183,7 +192,7 @@ public class EVDataServiceImpl implements EVDataService {
     // 获取pdf 文件
     @Transactional
     public void SignBackPdfInfo(TaskSignInfoVO taskApp) {
-        Integer totalCount = this.jdbcTemplate.queryForObject("select exe_count from u_task_parallel where parallel_process_instance_id='" + taskApp.getParallelProcessInstanceId() + "'", Integer.class);
+        Integer totalCount = this.jdbcTemplate.queryForObject("select min(exe_count) as exe_count from u_task_parallel where parallel_process_instance_id in(" + taskApp.getParallelProcessInstanceId() + ")", Integer.class);
         //上报类型: 1填报资料,2工程文件,3日志资料
         //档案:4档案数据 ,
         //计量: 5中间计量申请,6材料计量单 ,7开工预付款计量单, 8变更令
@@ -313,23 +322,23 @@ public class EVDataServiceImpl implements EVDataService {
                     updateSql = "update u_information_query set e_visa_pdf_url='" + taskApp.getLastFilePdfUrl() + "',status=" + taskApp.getSigType() + " where id='" + taskApp.getFormDataId() + "'";
                 }
                 this.jdbcTemplate.execute(updateSql);
-                this.jdbcTemplate.execute("update u_task_parallel set e_visa_status=1,e_visa_content='" + taskApp.getSignSmg() + "' , status=2 , initiative=2 ,update_time=SYSDATE() where parallel_process_instance_id='" + taskApp.getParallelProcessInstanceId() + "'");
+                this.jdbcTemplate.execute("update u_task_parallel set e_visa_status=1,e_visa_content='" + taskApp.getSignSmg() + "' , status=2 , initiative=2 ,update_time=SYSDATE() where parallel_process_instance_id in(" + taskApp.getParallelProcessInstanceId() + ")");
                 this.jdbcTemplate.execute("update u_task set status=" + taskApp.getSigType() + " ,update_time=SYSDATE() where id='" + taskApp.getTaskId() + "'");
-                this.jdbcTemplate.execute("delete from u_task_batch where id=" + taskApp.getId());
+                this.jdbcTemplate.execute("delete from u_task_batch where id in(" + taskApp.getId()+")");
 
             } else { //签字失败
-                this.jdbcTemplate.execute("update u_task_parallel set exe_count=(exe_count+1), e_visa_status=99,e_visa_content='" + taskApp.getSignSmg() + "' ,update_time=SYSDATE() where parallel_process_instance_id='" + taskApp.getParallelProcessInstanceId() + "'");
+                this.jdbcTemplate.execute("update u_task_parallel set exe_count=(exe_count+1), e_visa_status=99,e_visa_content='" + taskApp.getSignSmg() + "' ,update_time=SYSDATE() where parallel_process_instance_id in (" + taskApp.getParallelProcessInstanceId() + ")");
                 this.jdbcTemplate.execute("update u_task set status=1 ,update_time=SYSDATE() where id='" + taskApp.getTaskId() + "'");
                 if (totalCount >= 3) {
-                    this.jdbcTemplate.execute("delete from u_task_batch where id=" + taskApp.getId());
+                    this.jdbcTemplate.execute("delete from u_task_batch where id in(" + taskApp.getId()+")");
                 }
             }
             RedisTemplate.delete("sign-" + taskApp.getFormDataId());
         } catch (Exception e) {
             taskApp.setSigState(2);
             taskApp.setSignSmg("修改业务数据异常-请联系开发人员");
-            SignBackPdfInfo(taskApp);
             e.printStackTrace();
+            SignBackPdfInfo(taskApp);
         }
     }
 
@@ -353,7 +362,7 @@ public class EVDataServiceImpl implements EVDataService {
                     if ("1".equals(type)) {
                         String approvalPdf = eVisaPdfUrl.length() >= 10 ? eVisaPdfUrl : pdfUrl;
                         approvalPdf = pdfTrialUrl.length() >= 10 ? pdfTrialUrl : approvalPdf;
-                        approvalPdf = pdfTrialUrl.length() >= 10 ? pdfTrialUrlPosition : approvalPdf;
+                        approvalPdf = pdfTrialUrlPosition.length() >= 10 ? pdfTrialUrlPosition : approvalPdf;
                         taskApp.setSignPdfUrl(getHppsToHttp(approvalPdf));
                     } else if ("2".equals(type)) {
                         if (StringUtils.isNotEmpty(eVisaPdfUrl) || StringUtils.isNotEmpty(pdfUrl)) {
@@ -400,7 +409,6 @@ public class EVDataServiceImpl implements EVDataService {
             } else if (taskApp.getApprovalType() == 5) {
                 map = this.jdbcTemplate.queryForMap("select * from s_interim_pay_certificate where  is_deleted=0 and contract_period_id = " + taskApp.getFormDataId());
                 taskApp.setSignPdfUrl(map.get("raw_url") + "");
-
             } else if (taskApp.getApprovalType() == 6 || taskApp.getApprovalType() == 7) {
                 map = this.jdbcTemplate.queryForMap("select * from  s_material_start_statement where is_deleted=0 and meter_period_id = " + taskApp.getFormDataId());
                 taskApp.setSignPdfUrl(map.get("raw_url") + "");
@@ -453,118 +461,129 @@ public class EVDataServiceImpl implements EVDataService {
     // 添加电签策略 -- 东方中讯
     public List<Map<String, Object>> getStrategyListByDFZX(TaskSignInfoVO task, String ids) {
 
-        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);
-        }
-
-        List<Map<String, Object>> maps2 = jdbcTemplate.queryForList(sqlinfo);
+        String[] strArray = Func.toStrArray(task.getUserId());
+        String[] userNames = Func.toStrArray(task.getNickName());
         List<Map<String, Object>> maps = new ArrayList<>();
-        Map<String, List<Map<String, Object>>> peopleByAge = maps2.stream()
-                .collect(Collectors.groupingBy(hada -> (Func.toStr(hada.get("keyWord")))));
-
-        for (String keyId : peopleByAge.keySet()) {
-            int exId = 0;
-            List<Map<String, Object>> keyList = peopleByAge.get(keyId);
-            if (keyList != null && keyList.size() == 1) {
-                maps.addAll(keyList);
-                exId = 1;
-            } else if (keyList != null && keyList.size() >= 2) {
-                for (Map<String, Object> datax : keyList) {
-                    if ((datax.get("project_id") + "").equals(task.getProjectId())) {
-                        maps.add(datax);
+        if(strArray!=null && strArray.length>0) {
+            for (int i = 0; i < strArray.length; i++) {
+                String sqlinfo = " SELECT * from ( SELECT a.id as keyWord,a.project_id,a.pyzbx ,a.pyzby,(SELECT acc_code from blade_user where id='" + strArray[i] + "' 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=" + strArray[i] + " 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);
+                }
+                List<Map<String, Object>> maps2 = jdbcTemplate.queryForList(sqlinfo);
+                Map<String, List<Map<String, Object>>> peopleByAge = maps2.stream()
+                        .collect(Collectors.groupingBy(hada -> (Func.toStr(hada.get("keyWord")))));
+                for (String keyId : peopleByAge.keySet()) {
+                    int exId = 0;
+                    List<Map<String, Object>> keyList = peopleByAge.get(keyId);
+                    if (keyList != null && keyList.size() == 1) {
+                        maps.addAll(keyList);
                         exId = 1;
+                    } else if (keyList != null && keyList.size() >= 2) {
+                        for (Map<String, Object> datax : keyList) {
+                            if ((datax.get("project_id") + "").equals(task.getProjectId())) {
+                                maps.add(datax);
+                                exId = 1;
+                            }
+                        }
+                    }
+                    if (exId == 0) {
+                        maps.add(keyList.get(0));
                     }
                 }
             }
-            if (exId == 0) {
-                maps.add(keyList.get(0));
-            }
         }
         return maps;
     }
 
     // 添加电签策略 -- 安心签
     public List<SealStrategyVO> getStrategyListByAXQ(TaskSignInfoVO task, String ids) {
+        // 获取任务所有的人签字的信息
+        String[] strArray = Func.toStrArray(task.getUserId());
+        String[] userNames = Func.toStrArray(task.getNickName());
         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() + " ";
-        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() + "";
-            System.out.println("安心签--签章--=" + sqlinfo);
-        } else {
-            System.out.println("安心签--签字--=" + sqlinfo);
-        }
-        List<Map<String, Object>> maps2 = jdbcTemplate.queryForList(sqlinfo);
-        if (maps2 == null && maps2.size() <= 0) {
-            return sealStrategyVOS;
-        }
 
-        List<Map<String, Object>> maps = new ArrayList<>();
-        Map<String, List<Map<String, Object>>> peopleByAge = maps2.stream()
-                .collect(Collectors.groupingBy(hada -> (Func.toStr(hada.get("id")))));
-
-        for (String keyId : peopleByAge.keySet()) {
-            int exId = 0;
-            List<Map<String, Object>> keyList = peopleByAge.get(keyId);
-            if (keyList != null && keyList.size() == 1) {
-                maps.addAll(keyList);
-                exId = 1;
-            } else if (keyList != null && keyList.size() >= 2) {
-                for (Map<String, Object> datax : keyList) {
-                    if ((datax.get("project_id") + "").equals(task.getProjectId())) {
-                        maps.add(datax);
-                        exId = 1;
-                    }
+        if(strArray!=null && strArray.length>0){
+            for (int i =0 ;i < strArray.length;i++) {
+                String userId =strArray[i];
+                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='" + userId + "' and is_deleted=0  ) as signature_file_url, (SELECT wide from m_sign_pfx_file where is_register=1 and certificate_user_id='" + userId + "' and is_deleted=0  ) as wide ,(SELECT high from m_sign_pfx_file where is_register=1 and certificate_user_id='" + userId + "' 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=" + userId + " and c.is_deleted=0 ) ) x where x.signature_file_url is not null ";
+                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 + ") ";
+                    System.out.println("安心签--签章--=" + sqlinfo);
+                } else {
+                    System.out.println("安心签--签字--=" + sqlinfo);
                 }
-            }
-            if (exId == 0) {
-                maps.add(keyList.get(0));
-            }
-        }
+                List<Map<String, Object>> maps2 = jdbcTemplate.queryForList(sqlinfo);
+
+                if (maps2 != null && maps2.size() > 0) {
+                    List<Map<String, Object>> maps = new ArrayList<>();
+                    Map<String, List<Map<String, Object>>> peopleByAge = maps2.stream()
+                            .collect(Collectors.groupingBy(hada -> (Func.toStr(hada.get("id")))));
+
+                    for (String keyId : peopleByAge.keySet()) {
+                        int exId = 0;
+                        List<Map<String, Object>> keyList = peopleByAge.get(keyId);
+                        if (keyList != null && keyList.size() == 1) {
+                            maps.addAll(keyList);
+                            exId = 1;
+                        } else if (keyList != null && keyList.size() >= 2) {
+                            for (Map<String, Object> datax : keyList) {
+                                if ((datax.get("project_id") + "").equals(task.getProjectId())) {
+                                    maps.add(datax);
+                                    exId = 1;
+                                }
+                            }
+                        }
+                        if (exId == 0) {
+                            maps.add(keyList.get(0));
+                        }
+                    }
 
-        if (maps == null || maps.size() <= 0) {
-            return sealStrategyVOS;
-        }
-        //准备签章策略
-
-        for (Map<String, Object> eVisaConfig : maps) {
-            //设置签章策略
-            SealStrategyVO vo = new SealStrategyVO();
-            if (task.getSigType() == 1) {
-                String userId = task.getUserId() + "";
-                vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + userId);
-                if (userId.length() <= EVisaConstant.USER_ID_SUB) {
-                    vo.setSealPassword(task.getUserId().toString());
-                } else {
-                    vo.setSealPassword(task.getUserId().toString().substring(0, EVisaConstant.USER_ID_SUB));
+                    if (maps == null || maps.size() <= 0) {
+                        break;
+                    }
+
+                    //准备签章策略
+                    for (Map<String, Object> eVisaConfig : maps) {
+                        //设置签章策略
+                        SealStrategyVO vo = new SealStrategyVO();
+                        if (task.getSigType() == 1) {
+                            vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + userId);
+                            if (userId.length() <= EVisaConstant.USER_ID_SUB) {
+                                vo.setSealPassword(userId.toString());
+                            } else {
+                                vo.setSealPassword(userId.substring(0, EVisaConstant.USER_ID_SUB));
+                            }
+                            vo.setSealPerson(userNames[i]);
+                            //设置签字文件
+                            vo.setImageUrl(eVisaConfig.get("signature_file_url") + "");
+                            vo.setSealType("3");
+                            vo.setKeyword(eVisaConfig.get("id") + "");
+                            vo.setOffSetX(eVisaConfig.get("pyzbx") + "");
+                            vo.setOffSetY(eVisaConfig.get("pyzby") + "");
+                            vo.setHeight(eVisaConfig.get("high") + "");
+                            vo.setWidth(eVisaConfig.get("wide") + "");
+                        } else if (task.getSigType() == 2) {
+                            vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + eVisaConfig.get("sfId"));
+                            vo.setSealPassword(eVisaConfig.get("certificate_password") + "");
+                            vo.setSealPerson(eVisaConfig.get("certificate_user_name") + "" + System.currentTimeMillis());
+                            //设置签字文件
+                            vo.setImageUrl(eVisaConfig.get("signature_file_url") + "");
+                            vo.setSealType("3");
+                            vo.setCompanySeal(true);
+                            vo.setKeyword(eVisaConfig.get("id") + "");
+                            vo.setOffSetX(eVisaConfig.get("pyzbx") + "");
+                            vo.setOffSetY(eVisaConfig.get("pyzby") + "");
+                            vo.setHeight(eVisaConfig.get("high") + "");
+                            vo.setWidth(eVisaConfig.get("wide") + "");
+                        }
+                        sealStrategyVOS.add(vo);
+                    }
                 }
-                vo.setSealPerson(task.getNickName());
-                //设置签字文件
-                vo.setImageUrl(eVisaConfig.get("signature_file_url") + "");
-                vo.setSealType("3");
-                vo.setKeyword(eVisaConfig.get("id") + "");
-                vo.setOffSetX(eVisaConfig.get("pyzbx") + "");
-                vo.setOffSetY(eVisaConfig.get("pyzby") + "");
-                vo.setHeight(eVisaConfig.get("high") + "");
-                vo.setWidth(eVisaConfig.get("wide") + "");
-            } else if (task.getSigType() == 2) {
-                vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + eVisaConfig.get("sfId"));
-                vo.setSealPassword(eVisaConfig.get("certificate_password") + "");
-                vo.setSealPerson(eVisaConfig.get("certificate_user_name") + "" + System.currentTimeMillis());
-                //设置签字文件
-                vo.setImageUrl(eVisaConfig.get("signature_file_url") + "");
-                vo.setSealType("3");
-                vo.setCompanySeal(true);
-                vo.setKeyword(eVisaConfig.get("id") + "");
-                vo.setOffSetX(eVisaConfig.get("pyzbx") + "");
-                vo.setOffSetY(eVisaConfig.get("pyzby") + "");
-                vo.setHeight(eVisaConfig.get("high") + "");
-                vo.setWidth(eVisaConfig.get("wide") + "");
             }
-            sealStrategyVOS.add(vo);
         }
         return sealStrategyVOS;
     }
@@ -714,9 +733,11 @@ public class EVDataServiceImpl implements EVDataService {
             return;
         } else {
             BladeFile bladeFile = this.newIOSSClient.uploadFile(SnowFlakeUtil.getId() + ".pdf", fileUrl);
+            System.out.println("OSS上传=" + bladeFile);
             if (bladeFile != null) {
                 taskApp.setLastFilePdfUrl(bladeFile.getLink());
                 taskApp.setSignSmg("电签成功");
+
             } else {
                 taskApp.setSigState(2);
                 taskApp.setSignSmg("上传OSS失败" + fileUrl);

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

@@ -745,7 +745,8 @@ public class EVisaServiceImpl implements EVisaService {
                             //位置信息
                             signVO.setImageUrl(index.getUrl()); //固定签章
                             signVO.setSealType("2");//坐标签章
-
+                            signVO.setLx(index.getLx()); //x轴
+                            signVO.setLy(index.getLy()); //y轴
                             signVO.setPage(index.getPage()); //page页码
                             sealStrategyVOS.add(signVO);
                         }
@@ -789,7 +790,11 @@ public class EVisaServiceImpl implements EVisaService {
      * @throws Exception
      */
     public String signPdfByDFZX(HashMap<String, Object> request) {
-        String url = "http://39.108.216.210:9125/FrontSys/SealServicezx/FileSignByKeyWord";
+        String url = "http://localhost:9125/FrontSys/SealServicezx/FileSignByKeyWord";
+        String sys_isonline = ParamCache.getValue(CommonConstant.SYS_ISONLINE);
+        if ("20".equals(sys_isonline) || SystemUtils.isWindows() || SystemUtils.isMacOs()) {
+            url = "http://39.108.216.210:9125/FrontSys/SealServicezx/FileSignByKeyWord";
+        }
 
         String sysLocalFileUrl = FileUtils.getSysLocalFileUrl();
         String filecode = SnowFlakeUtil.getId() + "";
@@ -817,7 +822,7 @@ public class EVisaServiceImpl implements EVisaService {
             converterList.add(1, converter);
 
             HashMap<String, Object> retData = restTemplate.postForObject(url, request, HashMap.class);
-
+            System.out.println("东方中讯uRL"+url);
             String code = retData.get("code").toString();
             String msg = retData.get("msg").toString();
 
@@ -1209,18 +1214,14 @@ public class EVisaServiceImpl implements EVisaService {
 
                 if (vo.getSealType().equals("2")) {
                     //设置PDF坐标原点,签章图片定位点,默认为PDF左下角,签章图片定位为左下角
-                    if (StringUtils.isNotEmpty(vo.getIsCenterCoordinate())) {
+                   if (StringUtils.isNotEmpty(vo.getIsCenterCoordinate())) {
                         sealStrategy.setIsCenterCoordinate(vo.getIsCenterCoordinate());
                     }
 
                     //认证,设置签章位置居中
                     if (typeGenerate == 2) {
                         //居中
-                        Rectangle page = reader.getPageSize(Integer.parseInt(vo.getPage()));
-                        float x = (page.getLeft() + page.getRight()) / 2;
-                        float y = (page.getTop() + page.getBottom()) / 2;
-                        sealStrategy.setSignWithCoordinate(vo.getPage(), String.valueOf(x), String.valueOf(y));
-
+                        sealStrategy.setSignWithCoordinate(vo.getPage(), String.valueOf(vo.getLx()), String.valueOf(vo.getLy()));
                         //批量审批,设置自定义坐标位置
                     } else if (typeGenerate == 1) {
                         //重新计算,解决偏差值问题

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

@@ -71,6 +71,10 @@ public class PDFUtils {
         }
     }
 
+    public static void main1(String[] args) {
+        String pdfUrl = "/Users/hongchuangyanfa/Downloads/bacb5814950ae9268f67904912c571d0.pdf";
+        getPdfSignIds(pdfUrl);
+    }
 
     public static List<String>  getPdfSignIds(String pdfUrl) {
         List<String> eVisaConfigList = new ArrayList<>();
@@ -106,7 +110,6 @@ public class PDFUtils {
                         eVisaConfigList.add(txt);
                     }
                 }
-
             }
 
             List<String> unique = eVisaConfigList.stream().distinct().collect(Collectors.toList());

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

@@ -107,6 +107,7 @@ public class SignFtpUtil {
         FTPClient ftpClinet = SignFtpUtil.getFTPClinet();
         try {
             try {
+                System.out.println("上传文件中.....文件路径:" + remoteFilePath);
                 boolean done = ftpClinet.storeFile(remoteFilePath, inputStream);
                 if (done) {
                     return 1;
@@ -200,6 +201,7 @@ public class SignFtpUtil {
         FTPClient ftpClinet = SignFtpUtil.getFTPClinet();
         try {
             // 上传文件
+            System.out.println("下载文件中.....路径:" + remoteFilePath);
             OutputStream outputStream = new FileOutputStream(new File(localFilePath));
             try {
                 boolean done = ftpClinet.retrieveFile(remoteFilePath, outputStream);
@@ -226,4 +228,5 @@ public class SignFtpUtil {
             }
         }
     }
+
 }

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

@@ -0,0 +1,204 @@
+package org.springblade.evisa.utils;
+
+import org.apache.commons.net.ftp.FTP;
+import org.apache.commons.net.ftp.FTPClient;
+import org.springblade.common.constant.CommonConstant;
+import org.springblade.common.utils.SystemUtils;
+import org.springblade.system.cache.ParamCache;
+
+import java.io.*;
+
+public class SignFtpUtilBy210 {
+
+    // -外网
+   // private static final String SERVER = "47.115.117.246";
+    // 内网210
+    private static String SERVER = "39.108.216.210";
+    private static final int PORT = 201;
+    private static final String USER = "admin";
+    private static final String PASS = "k4CrzczpMjCRt7SA";
+    private static final int CONNECT_TIMEOUT = 900000; // 30秒
+    private static final int DATA_TIMEOUT = 90000; // 30秒
+
+    /**
+     *  获取ftp 客户端
+     * @return
+     */
+    public static FTPClient getFTPClinet() {
+        FTPClient ftp = new FTPClient();
+        try {
+            ftp.setControlEncoding("UTF-8");
+            // 设置连接超时时间
+            ftp.setConnectTimeout(CONNECT_TIMEOUT);
+            // 设置数据传输超时时间
+            ftp.setDataTimeout(DATA_TIMEOUT);
+            // 连接到FTP服务器
+            System.out.println("ftp上传ip地址:"+SERVER);
+            ftp.connect(SERVER, PORT);
+            ftp.setControlEncoding("UTF-8");
+            ftp.enterLocalPassiveMode();
+            ftp.setFileType(FTP.BINARY_FILE_TYPE);
+            ftp.enterLocalPassiveMode();//被动模式
+            //登录
+            boolean loginS = ftp.login(USER, PASS);
+            if (!loginS) {
+                return null;
+            } else {
+                return ftp;
+            }
+        } catch (IOException e) {
+            System.out.println("ftp连接失败");
+            return null;
+        }
+    }
+
+    public static int uploadFile(String localFilePath, String remoteFilePath) {
+        FTPClient ftpClinet = SignFtpUtilBy210.getFTPClinet();
+        try {
+            // 检查本地文件是否存在
+            File localFile = new File(localFilePath);
+            if (!localFile.exists()) {
+                return 2;
+            }
+
+            // 检查远程路径是否存在,不存在则创建
+            String remoteDir = remoteFilePath.substring(0, remoteFilePath.lastIndexOf("/"));
+            if (!ftpClinet.changeWorkingDirectory(remoteDir)) {
+                if (!ftpClinet.makeDirectory(remoteDir)) {
+                    return 6; // 创建目录失败
+                }
+                if (!ftpClinet.changeWorkingDirectory(remoteDir)) {
+                    return 7; // 切换目录失败
+                }
+            }
+
+            // 上传文件
+            FileInputStream inputStream = new FileInputStream(localFile);
+            try {
+                boolean done = ftpClinet.storeFile(remoteFilePath, inputStream);
+                if (done) {
+                    return 1;
+                } else {
+                    return 3;
+                }
+            } finally {
+                inputStream.close();
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+            return 4;
+        } finally {
+            try {
+                if (ftpClinet.isConnected()) {
+                    ftpClinet.logout();
+                    ftpClinet.disconnect();
+                }
+            } catch (IOException ex) {
+                ex.printStackTrace();
+                return 5;
+            }
+        }
+    }
+
+    /**
+     *  删除FTP文件
+     * @return
+     */
+    public static int FTPDeleteDir(String remoteFilePath) {
+        FTPClient ftpClinet = SignFtpUtilBy210.getFTPClinet();
+        try {
+            if (ftpClinet.deleteFile(remoteFilePath)) {
+                return 1;
+            } else {
+                return 2;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 2;
+        } finally {
+            try {
+                if (ftpClinet.isConnected()) {
+                    ftpClinet.logout();
+                    ftpClinet.disconnect();
+                }
+                return 1;
+            } catch (IOException ex) {
+                ex.printStackTrace();
+                return 5;
+            }
+        }
+    }
+    /**
+     *  创建文件路径
+     * @return
+     */
+    public static int FTPCreateDir(String remoteFilePath) {
+        FTPClient ftpClinet = SignFtpUtilBy210.getFTPClinet();
+        try {
+            if (ftpClinet.makeDirectory(remoteFilePath)) {
+                return 1;
+            } else {
+                return 2;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 2;
+        } finally {
+            try {
+                if (ftpClinet.isConnected()) {
+                    ftpClinet.logout();
+                    ftpClinet.disconnect();
+                }
+                return 1;
+            } catch (IOException ex) {
+                ex.printStackTrace();
+                return 5;
+            }
+        }
+    }
+
+
+    /**
+     *  下载
+     * @return
+     */
+    public static int downloadFile(String localFilePath, String remoteFilePath) {
+        // 设置连接超时时间
+        FTPClient ftpClinet = SignFtpUtilBy210.getFTPClinet();
+        try {
+            // 上传文件
+            System.out.println("下载文件中.....路径:" + remoteFilePath);
+            OutputStream outputStream = new FileOutputStream(new File(localFilePath));
+            try {
+                boolean done = ftpClinet.retrieveFile(remoteFilePath, outputStream);
+                if (done) {
+                    return 1;
+                } else {
+                    return 3;
+                }
+            } finally {
+                outputStream.close();
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+            return 4;
+        } finally {
+            try {
+                if (ftpClinet.isConnected()) {
+                    ftpClinet.logout();
+                    ftpClinet.disconnect();
+                }
+            } catch (IOException ex) {
+                ex.printStackTrace();
+                return 5;
+            }
+        }
+    }
+
+/*    public static void main(String[] args) {
+         String remoteFilePath = "/excel/1578970915729833985.html";
+         String localFilePath = "/Users/hongchuangyanfa/Desktop/pdf/1578970915729833985.html";
+        int i = uploadFile(localFilePath,remoteFilePath);
+        System.out.println(i);
+    }*/
+}

+ 0 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java

@@ -253,14 +253,6 @@ public class ArchiveTreeContractController extends BladeController {
             @ApiImplicitParam(name = "contractId", value = "合同段id", required = true)
     })
     public R<List<ArchiveTreeContractVO2>> lazyTree(Long parentId, Long projectId, Long contractId) {
-//		if (projectId == null) {tree = {ArrayList@17448}  size = 1
-//			projectId = 1578599210897772545L;
-//		}
-//        int i = 0;
-//        if (i == 1){
-//            archiveTreeContractService.writeBusinessData(1853317890158100515L,1853316182172528641L,null,1);
-//        }
-
 
         List<ArchiveTreeContractVO2> tree = archiveTreeContractService.lazyTree2(AuthUtil.getTenantId(), parentId, projectId, contractId);
         if (tree != null && tree.size() > 0) {

+ 0 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -554,7 +554,6 @@ public class ExcelTabController extends BladeController {
         updateWrapper.set("excel_id", exceTabId);
 
         // 复制模版htmlURL
-        //File file_in = ResourceUtil.getFile("C:\\Users\\泓创开发\\Desktop\\fsdownload\\1717821792510279680.html");
         File file_in = ResourceUtil.getFile(excelTab.getHtmlUrl());
         String filecode = SnowFlakeUtil.getId() + "";
         String thmlUrl = file_path + "/privateUrlCopy/" + aPrivate.getProjectId()+"/"+filecode + ".html";

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -416,6 +416,7 @@ public class FormulaController {
         String key = fo.getKey().replaceAll("__[\\d_]+", "");
         ContractInfo contract = this.contractInfoService.getById(fo.getContractId());
         WbsTreeContract parent = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getId,fo.getParentId()).eq(WbsTreeContract::getContractId,fo.getContractId()).last("limit 1"));
+
         List<KeyMapper> kms = this.service.getKeyMapperList(Collections.singletonList(fo.getPkeyId()), contract.getPId(), parent.getPKeyId().toString(), ExecuteType.INSPECTION);
         KeyMapper keyMapper = null;
         if (Func.isNotEmpty(kms)) {

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

@@ -4023,13 +4023,12 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                             if(dqid.contains("||")){
                                 String[] split = dqid.split("\\|\\|");
                                 for (String singleDqid : split) {
-                                    cell.setCellValue(singleDqid);
                                     sign.add(singleDqid);
                                 }
                             }else {
-                                cell.setCellValue(dqid);
                                 sign.add(dqid);
                             }
+                            cell.setCellValue(dqid);
                         }
                     }
                 }

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

@@ -4626,7 +4626,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     "and is_deleted=0 " + " and (scope=0 or (scope=1 and wbs_id=" + wbsId + ") or(scope=2  and wbs_id=" + wbsId + " and node_id=" + nodeIdWbs + ")or (scope =10 and project_id = " + projectId + ") or (scope=20 and project_id =" + projectId + " and node_id=" + nodeIdPrivate + "))");
             setFormula(list, efMap);
             /*节点参数公式*/
-
             //
             String sys_isonline = ParamCache.getValue(CommonConstant.SYS_ISONLINE);
             if ("20".equals(sys_isonline)) {

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

@@ -1585,16 +1585,17 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     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());
+                  //  List<WbsTree> addPublicTables = addPublicTable.stream().filter(node ->
+                   //         wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
                     //构造
-                    List<Long> ids = addPublicTables.stream().map(WbsTree::getId).collect(Collectors.toList());
+                    List<Long> ids = addPublicTable.stream().map(WbsTree::getId).collect(Collectors.toList());
                     if (ids.size() > 0) {
                         List<WbsTree> resultDataList = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery().in(WbsTree::getId, ids));
                         for (WbsTree tree : resultDataList) {
@@ -1605,7 +1606,9 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                 dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
                                 dataPrivate.setFullName(dataPrivate.getNodeName());
                                 dataPrivate.setInitTableId(tree.getInitTableId().toString());
+                                dataPrivate.setTreePId(tree.getId());
                                 dataPrivate.setIsAddConceal(0);
+                                dataPrivate.setParentId(wbsTreePrivate.getId());
                                 insertDataPrivateList.add(dataPrivate);//新增
                             }
                         }
@@ -1971,66 +1974,91 @@ 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()) {
+                //
+                for (WbsTreePrivate treePrivate :insertDataPrivateList){
+                    WbsTreePrivate treePrivateP = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getId, treePrivate.getParentId()).eq(WbsTreePrivate::getProjectId, treePrivate.getProjectId()).eq(WbsTreePrivate::getWbsId, treePrivate.getWbsId()));
+                    List<WbsTreeContract> addOrCo = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                            .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
+                            .eq(WbsTreeContract::getIsTypePrivatePid, treePrivateP.getPKeyId())
+                            .eq(WbsTreeContract::getIsDeleted, 0)
+
+                    );
+                    if (addOrCo.size() > 0) {
+                        for(WbsTreeContract addwbsTreeC : addOrCo){
+                            WbsTreeContract wbsTreeContract= BeanUtil.copyProperties(treePrivate, WbsTreeContract.class);
+                                wbsTreeContract.setIsBussShow(1);
+                                wbsTreeContract.setIsDeleted(0);
+                                wbsTreeContract.setStatus(1);
+                                wbsTreeContract.setIsTypePrivatePid(treePrivate.getPKeyId()); //记录原始表的pKeyId
+                                wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
+                                wbsTreeContract.setParentId(addwbsTreeC.getId());
+                                wbsTreeContract.setContractId(addwbsTreeC.getContractId());
+                            insertDataContractList.add(wbsTreeContract);
+                        }
+                    }
+                }
+
+                /*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;

+ 2 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/utils/MeMsgUtils.java

@@ -22,7 +22,8 @@ public class MeMsgUtils {
 
     public static boolean sendMsg(String phone) {
         HttpClient httpClient = HttpClientBuilder.create().build();
-        String url = "http://183.247.216.148:7030/tz_server/sms/sendSmsContent";
+
+        String url = "http://152.168.2.16:7030/tz_server/sms/sendSmsContent";
 
         HttpPost httpPost = new HttpPost(url);
 

+ 3 - 2
blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java

@@ -208,7 +208,7 @@ public class UserController {
             projectAndUserList.add(data);
             user.setProjectAndUserList(projectAndUserList);
         } else if (ObjectUtil.isNotEmpty(user.getSysId()) && user.getSysId().equals("40")) {
-            user.setUserType("1,2,3,7");
+            user.setUserType("1,2,7");
             user.setPassword("123456");
             user.setPlaintextPassword("123456");
             user.setTenantId("000000");
@@ -219,7 +219,8 @@ public class UserController {
             SaveUserInfoByProjectDTO data = new SaveUserInfoByProjectDTO();
             data.setContractId("1714919227250950146");
             data.setProjectId("1750070685257990145");
-            data.setRoleId("1538760412710289409");
+          //  data.setRoleId("1538760412710289409"); 管理员
+            data.setRoleId("1537249581371707394");
             projectAndUserList.add(data);
             user.setProjectAndUserList(projectAndUserList);
         } else if (ObjectUtil.isNotEmpty(user.getSysId()) && user.getSysId().equals("50")) {