Browse Source

Merge branch 'dev' of http://219.151.181.73:3000/zhuwei/bladex into dev

laibulaizheli 1 month ago
parent
commit
7b831bc6f9
16 changed files with 312 additions and 130 deletions
  1. 1 1
      blade-common/src/main/java/org/springblade/common/utils/AsyncConfigurer.java
  2. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskSignInfoVO.java
  3. 5 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileAutoController.java
  4. 4 4
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  5. 5 5
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertConclusionServiceImpl.java
  6. 81 23
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  7. 1 1
      blade-service/blade-business/pom.xml
  8. 71 33
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ArchiveController.java
  9. 13 4
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVController.java
  10. 1 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/EVisaService.java
  11. 11 6
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVDataServiceImpl.java
  12. 32 5
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java
  13. 1 1
      blade-service/blade-manager/pom.xml
  14. 9 7
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java
  15. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  16. 72 36
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

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

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

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskSignInfoVO.java

@@ -89,4 +89,7 @@ public class TaskSignInfoVO {
     @ApiModelProperty("电签内容")
     private String signSmg;
 
+    @ApiModelProperty("是否可以签章:0-表示可以,否则就不行")
+    private Integer isSignature;
+
 }

+ 5 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileAutoController.java

@@ -339,12 +339,16 @@ ArchiveFileAutoController extends BladeController {
     @ApiOperation(value = "预览")
     public R<Object> mergePdf(@RequestParam String ids) {
         List<ArchiveFile> result = this.archiveFileClient.getArchiveFileByArchivesId(ids, "");
+        // 由于文件分解后,pdf文件会生成多个,所以需要合并
+        if(result!=null && result.size()>0){
+            result.sort(Comparator.comparing(ArchiveFile::getSort));
+        }
         List<String> pdfUrls = result.stream().map(archiveFile -> StringUtils.isNotEmpty(archiveFile.getPdfFileUrl()) ? archiveFile.getPdfFileUrl() : archiveFile.getFileUrl()).distinct().collect(Collectors.toList());
 
         //FileUtils.mergePdfPublicMethods(pdfUrls,"");
         /**
          * 案卷的只有一个文件,不合并先,需要的时候在把合并方法放出来
          * **/
-        return R.data(pdfUrls);
+        return R.data(pdfUrls.get(0));
     }
 }

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

@@ -218,7 +218,7 @@
 
     <select id="approvalFile" resultType="org.springblade.archive.vo.ArchivesAutoVO$ApprovalFile">
         <if test="archiveId!=null">
-            select * from u_archive_file where archive_id = #{archiveId} and is_element = 0 order by sort
+            select * from u_archive_file where archive_id = #{archiveId} order by sort
         </if>
     </select>
 
@@ -1172,7 +1172,7 @@
                uaa.id,uaa.name,uaa.page_n ,uaa.remark ,uaa.file_number,uaa.unit,uaa.start_date,uaa.end_date,
                 (select bdb.dict_value  from blade_dict_biz bdb WHERE bdb.is_sealed = 0 and bdb.code = 'storage_period' and bdb.dict_key = uaa.storage_time limit 1 ) as storageTimeValue
         from m_archive_tree_contract matc right join u_archives_auto uaa on matc.id = uaa.node_id
-        WHERE uaa.is_deleted = 0 and matc.is_deleted = 0 and uaa.is_apply = #{isApply} and matc.ancestors like concat("%",#{firstNode},"%")
+        WHERE uaa.is_deleted = 0 and matc.is_deleted = 0 and uaa.is_apply = #{isApply} and matc.ancestors like concat("%",#{firstNode},"%") and uaa.is_archive = 1
         order by uaa.tree_sort
     </select>
     <select id="getNodeArchives" resultType="org.springblade.archive.vo.ArchiveInspectVO">
@@ -1273,7 +1273,7 @@
         )
     </select>
     <select id="getRoutingInspection" resultType="org.springblade.archive.vo.ArchiveWarningVO">
-        select uaf.file_name ,uaf.file_url,0 as sourceType,uaf.node_id,
+        select uaf.file_name ,IF(uaf.file_url is null or uaf.file_url = '', uaf.pdf_file_url, uaf.file_url) as file_url,0 as sourceType,uaf.node_id,
                (select uaa.name from u_archives_auto uaa WHERE uaa.id = uaf.archive_id) as archive_name,
                (select GROUP_CONCAT(uai.opinion) from u_archive_inspection uai WHERE uai.file_id = uaf.id) as allopinion
         from u_archive_file uaf join m_archive_tree_contract atc on uaf.node_id  = atc.id
@@ -1284,7 +1284,7 @@
     <select id="getSpotCheck" resultType="org.springblade.archive.vo.ArchiveWarningVO">
         select GROUP_CONCAT(aei.opinion) as allopinion,aei.archive_name ,aei.node_id,1 as sourceType,
                (select uaf.file_name from u_archive_file uaf WHERE uaf.id = aei.file_id) as fileName,
-               (select uaf.file_url from u_archive_file uaf WHERE uaf.id = aei.file_id) as fileUrl
+               (select IF(uaf.file_url is null or uaf.file_url = '', uaf.pdf_file_url, uaf.file_url) as file_url from u_archive_file uaf WHERE uaf.id = aei.file_id) as fileUrl
         from m_archive_tree_contract atc join u_archive_expert_inspection aei on aei.node_id  = atc.id
         where atc.project_id  = #{projectId} and atc.is_deleted = 0 and aei.is_deleted = 0 and aei.is_pass = 0
           and atc.is_deleted = 0

+ 5 - 5
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertConclusionServiceImpl.java

@@ -243,11 +243,11 @@ public class ArchiveExpertConclusionServiceImpl extends BaseServiceImpl<ArchiveE
             throw new ServiceException("专家账号信息错误,请联系管理员");
         }
         //获取所有专家个人证书
-        List<SignPfxFile> list = baseMapper.getAllSign(userIds);
-        if (list.size() == 0 || list.size() != userIds.size()){
-            throw new ServiceException("有专家没有配置电签,请联系管理员");
-        }
-        Map<Long, SignPfxFile> map = list.stream().collect(Collectors.toMap(l -> l.getCertificateUserId(), l -> l));
+//        List<SignPfxFile> list = baseMapper.getAllSign(userIds);
+//        if (list.size() == 0 || list.size() != userIds.size()){
+//            throw new ServiceException("有专家没有配置电签,请联系管理员");
+//        }
+//        Map<Long, SignPfxFile> map = list.stream().collect(Collectors.toMap(l -> l.getCertificateUserId(), l -> l));
 
         String pdfUrl = "";
         try {

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

@@ -75,6 +75,8 @@ import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
 import org.springblade.system.user.entity.User;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -138,6 +140,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	private final IArchiveExpertConclusionService expertConclusionService;
 	private final ITraceLogService iTraceLogService;
 
+    private final JdbcTemplate jdbcTemplate;
+
 	//表格高度
 	private static int high = 20;
 	//表格宽度
@@ -378,8 +382,41 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		if (StringUtils.isNotBlank(vo.getSecretLevel())) {
 			vo.setSecretLevelValue("1".equals(vo.getSecretLevel()) ? "机密" : ("2".equals(vo.getSecretLevel()) ? "绝密" : "秘密"));
 		}
-		if (vo.getApprovalFileList() != null && vo.getApprovalFileList().size() > 0) {
-			vo.setPageNumber(vo.getApprovalFileList().size());
+		List<ArchivesAutoVO.ApprovalFile> approvalFiles = vo.getApprovalFileList();
+		ArchivesAutoVO.ApprovalFile front = null;
+		ArchivesAutoVO.ApprovalFile cataLog = null;
+		ArchivesAutoVO.ApprovalFile spare = null;
+		ArchivesAutoVO.ApprovalFile back = null;
+		if (approvalFiles != null && !approvalFiles.isEmpty()) {
+			// todo 四要素 使用名称判断
+			Map<String, List<ArchivesAutoVO.ApprovalFile>> collect = approvalFiles.stream().collect(Collectors.groupingBy(approvalFile -> {
+				if (approvalFile != null &&
+						(approvalFile.getFileName().equals("封面") || approvalFile.getFileName().equals("卷内目录") || approvalFile.getFileName().equals("卷内备考表") || approvalFile.getFileName().equals("备考表") || approvalFile.getFileName().equals("背脊"))) {
+					if (approvalFile.getFileName().equals("卷内备考表")) {
+						return "备考表";
+					}
+					return approvalFile.getFileName();
+				}
+				return "0";
+			}, Collectors.toList()));
+			List<ArchivesAutoVO.ApprovalFile> approvalFiles1 = collect.get("0");
+			if (approvalFiles1 == null) {
+				approvalFiles1 = new ArrayList<>();
+			}
+			vo.setPageNumber(approvalFiles1.size());
+			vo.setApprovalFileList(approvalFiles1);
+			if (collect.containsKey("封面")) {
+				front = collect.get("封面").stream().max(Comparator.comparing(ArchivesAutoVO.ApprovalFile::getId)).orElse(null);
+			}
+			if (collect.containsKey("卷内目录")) {
+				cataLog = collect.get("卷内目录").stream().max(Comparator.comparing(ArchivesAutoVO.ApprovalFile::getId)).orElse(null);
+			}
+			if (collect.containsKey("备考表")) {
+				spare = collect.get("备考表").stream().max(Comparator.comparing(ArchivesAutoVO.ApprovalFile::getId)).orElse(null);
+			}
+			if (collect.containsKey("背脊")) {
+				back = collect.get("背脊").stream().max(Comparator.comparing(ArchivesAutoVO.ApprovalFile::getId)).orElse(null);
+			}
 		} else {
 			vo.setPageNumber(0);
 		}
@@ -388,15 +425,12 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			// 根据 factorType 字符串生成档案号码字符串链表
 			ArchiveProjectConfig config = archiveProjectConfigService.getByProjectIdOrNew(vo.getProjectId());
 			String[] frontUrls = outUrl.split(",");
-			ArchivesAutoVO.ApprovalFile front = new ArchivesAutoVO.ApprovalFile();
-			ArchivesAutoVO.ApprovalFile cataLog = new ArchivesAutoVO.ApprovalFile();
-			ArchivesAutoVO.ApprovalFile spare = new ArchivesAutoVO.ApprovalFile();
-			ArchivesAutoVO.ApprovalFile back = new ArchivesAutoVO.ApprovalFile();
 			for (String frontUrl : frontUrls) {
 				// 封面(原r_Archives_front)增加中文"封面"匹配
-				if ((frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[0])
+				if (front == null && (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[0])
 						|| frontUrl.contains("封面"))
 						&& config.getFactorType().contains("1")) {
+					front = new ArchivesAutoVO.ApprovalFile();
 					front.setFileName("封面");
 					if(frontUrl.contains("@@@")){
 						front.setFileUrl(frontUrl.substring(0,frontUrl.indexOf("@@@")));
@@ -405,9 +439,10 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 					}
 				}
 				// 卷内目录(原r_Archives_catalog)增加中文匹配
-				else if ((frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[1])
+				else if (cataLog == null && (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[1])
 						|| frontUrl.contains("卷内目录"))
 						&& config.getFactorType().contains("2")) {
+					cataLog = new ArchivesAutoVO.ApprovalFile();
 					cataLog.setFileName("卷内目录");
 					if(frontUrl.contains("@@@")){
 						cataLog.setFileUrl(frontUrl.substring(0,frontUrl.indexOf("@@@")));
@@ -416,9 +451,10 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 					}
 				}
 				// 备考表(原r_Archives_spare)增加中文匹配
-				else if ((frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[2])
+				else if (spare == null && (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[2])
 						|| frontUrl.contains("备考表"))
 						&& config.getFactorType().contains("3")) {
+					spare = new ArchivesAutoVO.ApprovalFile();
 					spare.setFileName("备考表");
 					if(frontUrl.contains("@@@")){
 						spare.setFileUrl(frontUrl.substring(0,frontUrl.indexOf("@@@")));
@@ -427,9 +463,10 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 					}
 				}
 				// 背脊(原r_Archives_back)增加中文匹配
-				else if ((frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[3])
+				else if (back == null && (frontUrl.contains(ArchiveAutoPdfServiceImpl.ARCHIVE_NUMBER[3])
 						|| frontUrl.contains("背脊"))
 						&& config.getFactorType().contains("4")) {
+					back = new ArchivesAutoVO.ApprovalFile();
 					back.setFileName("背脊");
 					if(frontUrl.contains("@@@")){
 						back.setFileUrl(frontUrl.substring(0,frontUrl.indexOf("@@@")));
@@ -438,30 +475,49 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 					}
 				}
 			}
-			List<ArchivesAutoVO.ApprovalFile> files = vo.getApprovalFileList();
-			if (files != null && !files.isEmpty()) {
-				ArchivesAutoVO.ApprovalFile temp = files.get(0);
-				if (front.getFileUrl() != null) {
-					front.setId(temp.getId() + "_1");
+		}
+		List<ArchivesAutoVO.ApprovalFile> files = vo.getApprovalFileList();;
+		if (files != null) {
+			String tempId = null;
+			if (!files.isEmpty()) {
+				tempId = files.get(0).getId();
+			}
+			if (front != null && front.getFileUrl() != null) {
+				if (front.getId() == null && tempId != null) {
+					front.setId(tempId + "_1");
+				}
+				if (front.getId() != null) {
 					front.setPdfFileUrl(front.getFileUrl());
 					files.add(0,front);
 				}
-				if (cataLog.getFileUrl() != null) {
-					cataLog.setId(temp.getId()  + "_2");
+			}
+			if (cataLog != null && cataLog.getFileUrl() != null) {
+				if (cataLog.getId() == null && tempId != null) {
+					cataLog.setId(tempId  + "_2");
+				}
+				if (cataLog.getId() != null) {
 					cataLog.setPdfFileUrl(cataLog.getFileUrl());
-					if (front.getFileUrl() != null) {
+					if (front != null && front.getFileUrl() != null) {
 						files.add(1,cataLog);
 					} else {
 						files.add(0,cataLog);
 					}
 				}
-				if (spare.getFileUrl() != null) {
-					spare.setId(temp.getId()  + "_3");
+			}
+			if (spare != null && spare.getFileUrl() != null) {
+				if (spare.getId() == null && tempId != null) {
+					spare.setId(tempId  + "_3");
+				}
+				if (spare.getId() != null) {
 					spare.setPdfFileUrl(spare.getFileUrl());
 					files.add(spare);
 				}
-				if (back.getFileUrl() != null) {
-					back.setId(temp.getId()  + "_4");
+			}
+			if (back != null && back.getFileUrl() != null) {
+				if (back.getId() == null && tempId != null) {
+					back.setId(tempId  + "_4");
+				}
+				if (back.getId() != null) {
 					back.setPdfFileUrl(back.getFileUrl());
 					files.add(back);
 				}
@@ -4330,7 +4386,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
         String[] ids = archiveIds.split(",");
         for (String archiveId : ids) {
             ArchivesAuto auto = baseMapper.selectById(archiveId);
-            List<ArchiveFile> archiveFiles = archiveFileClient.getArchiveFileByArchiveID(Long.valueOf(archiveId));
+            String sql="select * from u_archive_file where archive_id = "+archiveId+" and is_deleted = 0 order by sort,sort_num,create_time";
+            //List<ArchiveFile> archiveFiles = archiveFileClient.getArchiveFileByArchiveID(Long.valueOf(archiveId));
+            List<ArchiveFile> archiveFiles= jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ArchiveFile.class));
             archiveAutoPdfService.buildArchiveFrontPdfs(projectId,auto,archiveFiles,true);
             baseMapper.updateById(auto);
         }

+ 1 - 1
blade-service/blade-business/pom.xml

@@ -194,7 +194,7 @@
                     <target>${java.version}</target>
                     <encoding>${project.build.sourceEncoding}</encoding>
                     <compilerArguments>
-                        <bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar;${java.home}/lib/jsse.jar
+                        <bootclasspath>${java.home}/lib/rt.jar:${java.home}/lib/jce.jar:${java.home}/lib/jsse.jar
                         </bootclasspath>
                     </compilerArguments>
                 </configuration>

+ 71 - 33
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/ArchiveController.java

@@ -22,6 +22,7 @@ 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;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
@@ -77,7 +78,7 @@ public class ArchiveController {
                     if (!aBoolean) {
 
                         if (!aBoolean) {
-                            RedisTemplate.opsForValue().set("splitpng-" + dataInfo.getArchiveId(), "1", 7200, TimeUnit.SECONDS);
+                            RedisTemplate.opsForValue().set("splitpng-" + dataInfo.getArchiveId(), "1", 600, TimeUnit.SECONDS);
                             CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
                                 try {
                                     /*===============执行批量任务===============*/
@@ -149,6 +150,10 @@ public class ArchiveController {
                 String updateSql = "update u_archives_auto set split_status=2 where id=" + archiveId;
                 jdbcTemplate.execute(updateSql);
             }
+
+            String sql = "delete from u_archive_file where id<>'"+id+"' and archive_id='"+archiveId+"'";
+            jdbcTemplate.execute(sql);
+
             RedisTemplate.delete("splitpng-" + archiveId);
         } catch (Exception e) {
             e.printStackTrace();
@@ -156,7 +161,7 @@ public class ArchiveController {
     }
 
 
-   // @Scheduled(cron = "0/30 * * * * ?")
+    @Scheduled(cron = "0/30 * * * * ?")
     public void SplitPdfInfo() {
         //执行代码
 
@@ -171,7 +176,7 @@ public class ArchiveController {
                     if (!aBoolean) {
 
                         if (!aBoolean) {
-                            RedisTemplate.opsForValue().set("splithtml-" + dataInfo.getArchiveId(), "1", 600, TimeUnit.SECONDS);
+                            RedisTemplate.opsForValue().set("splithtml-" + dataInfo.getArchiveId(), "1", 1200, TimeUnit.SECONDS);
                             CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
                                 try {
                                     /*===============执行批量任务===============*/
@@ -196,67 +201,103 @@ public class ArchiveController {
             String archiveId = taskSign.getArchiveId();
             String fileUlr = taskSign.getFileUrl();
             String firstPage = FileUtils.getSysLocalFileUrl() + "archiveSplit/";
+            String firstFileUrl = taskSign.getFirstFileUrl();
+            String firstUrl[] = firstFileUrl.split("--");
+            int basePage = Integer.parseInt(firstUrl[1]);
+            int baseStart = Integer.parseInt(firstUrl[0]);
+            String dutyUser = "";
             int bkb = 0 ;
             //将imagePath 的数据转成一个可解析的html
             String htmlUrl = pngToHtml(firstPage, archiveId,taskSign.getFirstFileUrl());
 
+
             if (htmlUrl.indexOf("_001.html") >= 0 && htmlUrl.indexOf("archiveSplit") >= 0) {
                 String htmlString = IoUtil.readToString(new FileInputStream(htmlUrl));
                 Document doc = Jsoup.parse(htmlString);
                 Element table = doc.select("table").first();
                 Elements trs = table.select("tr");
+                //由于解析已经成功,可能数据已经分解过,需要删除
+                if(trs!=null && trs.size()>=1){
+                    String sql = "delete from u_archive_file where id<>'"+taskSign.getId()+"' and archive_id='"+archiveId+"'";
+                    jdbcTemplate.execute(sql);
+                }
 
-                for (int i = 1; i <= trs.size() - 1; i++) {
+                for (int i = 0; i <= trs.size() - 1; i++) {
                     Element tr = trs.get(i);
                     String zrz = tr.select("td").get(0).text();
                     String wjtm = tr.select("td").get(1).text();
                     String rq = tr.select("td").get(2).text();
                     String ym = tr.select("td").get(3).text();
+                   if(zrz.equals("责任者") && wjtm.equals("文件题名") && rq.equals("日期")){
+                        continue;
+                   }
                     int startYm = 0;
                     int endYm = 0;
                     if(i<trs.size()-1){
                         startYm = Func.toInt(ym);
                         String enData = trs.get(i+1).select("td").get(3).text();
-                        if(enData.indexOf("-")>=0){
-                            endYm = Func.toInt(enData.split("-")[0])-1;
-                        }else{
-                            endYm = Func.toInt(enData)-1;
+                        if(enData.indexOf("页")>=0){
+                            enData = trs.get(i+2).select("td").get(3).text();
+                        }
+
+                        String[] parts = enData.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
+                        if(parts!=null && parts.length>=1){
+                            endYm = Func.toInt(parts[0]);
                         }
                     }else{
-                        if(ym.indexOf("-")>=0){
-                            String[] split = ym.split("-");
+                        String[] split = ym.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
+                        if(split!=null && split.length>=3){
                             startYm = Func.toInt(split[0]);
-                            endYm = Func.toInt(split[1]);
+                            endYm = Func.toInt(split[2]);
+                        }else{
+                            startYm = Func.toInt(split[0]);
+                            endYm = Func.toInt(split[0]);
                         }
                     }
-                    startYm = startYm + 2 ;
-                    endYm = endYm + 2 ;
-                    System.out.println(zrz + " " + wjtm + " " + rq + " " + ym);
+                    startYm = basePage+startYm ;
+                    endYm = basePage+endYm ;
+                    dutyUser = zrz;
+                    System.out.println("序号="+i+"--文件提名:"+wjtm +"--开始("+startYm+"-"+endYm+")---页数"+(endYm-startYm+1));
                     // 分解文件
                     String fmlUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_cf_00"+i+".pdf";
                     getPdfByPage(startYm,endYm,fileUlr,fmlUrl);
-                    saveDataToMysql(fmlUrl,wjtm,taskSign.getId(),endYm-startYm+1);
+                    saveDataToMysql(fmlUrl,wjtm,taskSign.getId(),endYm-startYm+1,i,zrz);
                     bkb =  endYm ;
                 }
-
             } else {
-
+                return;
             }
 
             // 添加封面信息
             String fmlUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_fm_001.pdf";
             getPdfByPage(1,1,fileUlr,fmlUrl);
-            saveDataToMysql(fmlUrl,"封面",taskSign.getId(),1);
+            saveDataToMysql(fmlUrl,"封面",taskSign.getId(),1,-4,dutyUser);
 
             // 卷内目录
             String jnmuUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_jnml_001.pdf";
-            getPdfByPage(2,2,fileUlr,jnmuUrl);
-            saveDataToMysql(jnmuUrl,"卷内目录",taskSign.getId(),1);
+            getPdfByPage(baseStart,basePage,fileUlr,jnmuUrl);
+            saveDataToMysql(jnmuUrl,"卷内目录",taskSign.getId(),1,-3,dutyUser);
 
             // 卷内备考表
             String jnbkbUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_jnbkb_001.pdf";
             getPdfByPage(bkb+1,bkb+1,fileUlr,jnbkbUrl);
-            saveDataToMysql(jnbkbUrl,"卷内备考表",taskSign.getId(),1);
+            saveDataToMysql(jnbkbUrl,"卷内备考表",taskSign.getId(),1,100,dutyUser);
+
+            // 背脊表
+            String bjbUrl = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_beiji_001.pdf";
+            String bjbUrlPng = FileUtils.getSysLocalFileUrl() + "archiveSplit/"+archiveId+"_beiji_001.png";
+            getPdfByPage(bkb+2,bkb+2,fileUlr,bjbUrl);
+
+            File bgImgFile = new File(bjbUrl);
+            if (!bgImgFile.exists()) {
+                savePdfAsImage(1, bjbUrl, bjbUrlPng);
+            }
+            String state = OcrTitle(bjbUrl,"3");
+            if(state.equals("1")){
+                saveDataToMysql(jnbkbUrl,"背脊表",taskSign.getId(),1,101,dutyUser);
+            }
+            bgImgFile.delete();
+
 
             // 修改任务状态
             String updateSql = "update u_archives_split_info set status=3 where id=" + taskSign.getId();
@@ -272,7 +313,6 @@ public class ArchiveController {
             jdbcTemplate.execute(taxkSql2);
 
             // 修改完成情况
-
             RedisTemplate.delete("splithtml-" + archiveId);
         } catch (Exception e) {
             throw new RuntimeException(e);
@@ -293,7 +333,6 @@ public class ArchiveController {
                     new InputStreamReader(process.getInputStream()));
             String htmlUrl;
             while ((htmlUrl = reader.readLine()) != null) {
-                System.out.println("222" + htmlUrl);
                 if (htmlUrl.indexOf("html文件路径") >= 0 && htmlUrl.indexOf("_001.html") >= 0 && htmlUrl.indexOf("archiveSplit") >= 0) {
                     lasHhtmlUrl = htmlUrl.replace("html文件路径", "");
                 }
@@ -311,11 +350,7 @@ public class ArchiveController {
         }
     }
 
-/*    public static void main(String[] args) {
-        String mingUrl = "/Users/hongchuangyanfa/Desktop/archiveSplit/1935941065903177728first_002.png";
-        OcrTitle(mingUrl,"1");
-    }*/
-    public static String OcrTitle(String fileUrl, String type) {
+    public String OcrTitle(String fileUrl, String type) {
         String lasHhtmlUrl = "";
         try {
             // 定义Python解释器路径和脚本路径
@@ -377,7 +412,7 @@ public class ArchiveController {
         }
     }
 
-    public void savePdfAsImage(int pageNum, String filePath, String outputPath) {
+    public static void savePdfAsImage(int pageNum, String filePath, String outputPath) {
         try (InputStream inputStream = FileUtils.getInputStreamByUrl(filePath);
              PDDocument document = PDDocument.load(inputStream)) {
 
@@ -410,7 +445,8 @@ public class ArchiveController {
         }
     }
 
-    public int saveDataToMysql(String upFileUrl,String fileName,String fileId,int filePage) {
+    public int saveDataToMysql(String upFileUrl,String fileName,String fileId,int filePage,int sort,String dutyUser) {
+
         // 获取封面信息
         long newPkId = SnowFlakeUtil.getId(); //主键Id
         File fmfile = new File(upFileUrl);
@@ -423,13 +459,13 @@ public class ArchiveController {
                         " drawing_no,cite_change_number,certification_time,e_visa_file,node_ext_id,file_type,archive_id,origin_id,filming_time,filmingor_time,tag_id,pic_code,refer_code,film_code,width,height,ftime,utime,del_time,sort,box_name,box_number,is_auto_file,is_archive,page_num, " +
                         " file_size,source_type,is_element,pdf_page_url,fid,rectification,classify,m_wbs_tree_contract_p_key_id,u_image_classification_file_id,archive_file_storage_type,node_tree_structure,date_name,archive_file_stroage_type,out_id,sort_num " +
                         "   ) " +
-                        " SELECT "+newPkId+",project_id,contract_id,node_id,file_number,'" + fileName + "',file_time,'" + FmPdfUrl + "','" + FmPdfUrl + "',"+filePage+",is_approval,is_certification,is_need_certification,duty_user,create_user,create_dept,create_time,update_user,update_time,status,is_deleted,sheet_type,sheet_source, " +
-                        "        drawing_no,cite_change_number,certification_time,e_visa_file,node_ext_id,file_type,archive_id,origin_id,filming_time,filmingor_time,tag_id,pic_code,refer_code,film_code,width,height,ftime,utime,del_time,sort,box_name,box_number,is_auto_file,is_archive,page_num, " +
+                        " SELECT "+newPkId+",project_id,contract_id,node_id,file_number,'" + fileName + "',file_time,'" + FmPdfUrl + "','" + FmPdfUrl + "',"+filePage+",is_approval,is_certification,is_need_certification,'"+dutyUser+"',create_user,create_dept,create_time,update_user,update_time,status,is_deleted,sheet_type,sheet_source, " +
+                        "        drawing_no,cite_change_number,certification_time,e_visa_file,node_ext_id,file_type,archive_id,origin_id,filming_time,filmingor_time,tag_id,pic_code,refer_code,film_code,width,height,ftime,utime,del_time,"+sort+",box_name,box_number,is_auto_file,is_archive,page_num, " +
                         "        file_size,source_type,is_element,pdf_page_url,fid,rectification,classify,m_wbs_tree_contract_p_key_id,u_image_classification_file_id,archive_file_storage_type,node_tree_structure,date_name,archive_file_stroage_type,out_id,sort_num " +
                         " from u_archive_file where id=" + fileId;
                 System.out.println(fileName + "----" + sql);
                 jdbcTemplate.execute(sql);
-                return 200;
+
             } else {
                 // 检查一下oss是否启动
                 System.out.println("oss服务未启动,无法上传文件到oss");
@@ -438,5 +474,7 @@ public class ArchiveController {
         }else{
             return 404;
         }
+        fmfile.delete();
+        return 200;
     }
 }

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

@@ -58,7 +58,7 @@ public class EVController {
     @Resource(name = "taskExecutor1")
     private ThreadPoolExecutor executor;
 
-   // @Scheduled(cron = "0/10 * * * * ?")
+    @Scheduled(cron = "0/10 * * * * ?")
     public void SignInfo() {
         //执行代码
 
@@ -71,14 +71,19 @@ public class EVController {
                 "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 ";
+                "sign_type as sigType ," +
+                "(select count(0) from u_task_parallel b INNER JOIN u_task c on b.process_instance_id = c.process_instance_id " +
+                "where c.id = JSON_UNQUOTE(JSON_EXTRACT(a.json_data, '$.taskId')) and b.is_deleted = 0 and (b.status = 1 or b.initiative = 1)) isSignature" +
+                " from u_task_batch a where is_deleted=0 GROUP BY JSON_EXTRACT(json_data, '$.formDataId'),sign_type ORDER BY sign_type DESC ";
                 //and JSON_UNQUOTE(JSON_EXTRACT(json_data,'$.taskId')) in(SELECT id from u_task where project_id =1792760669353865218 and is_deleted =0 and approval_type=1 )
         List<TaskSignInfoVO> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TaskSignInfoVO.class));
 
         if (query != null && query.size() >= 1) {
             for (TaskSignInfoVO dataInfo : query) {
-                if (executor.getQueue().size() <= 10) {
+                if(dataInfo.getSigType() == 2 && dataInfo.getIsSignature() > 0){
+                    continue;
+                }
+                if (executor.getQueue().size() <= 20) {
                     Boolean aBoolean = RedisTemplate.hasKey("sign-" + dataInfo.getFormDataId());
                     if (!aBoolean) {
                         if (dataInfo.getSigType() == 2) {
@@ -98,6 +103,10 @@ public class EVController {
                                 try {
                                     /*===============执行批量任务===============*/
                                     evDataService.signTaskBatch(dataInfo);
+                                    System.out.println("队列数量" + executor.getQueue().size());
+                                    System.out.println("活跃数量" + executor.getActiveCount());
+                                    System.out.println("总共数量" + executor.getTaskCount());
+                                    System.out.println("完成数量" + executor.getCompletedTaskCount());
                                 } catch (Exception e) {
                                     e.printStackTrace();
                                 }

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

@@ -50,5 +50,5 @@ public interface EVisaService {
 
     Object[] signPdfByAXQZ(SealPdfVO pdfVO, String loPdfurl,String outPdfUrl);
 
-    String signPdfByDFZX(HashMap<String, Object> daMa);
+    String signPdfByDFZX(HashMap<String, Object> daMa,String signPdfByDFZX,String contractId);
 }

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

@@ -129,11 +129,11 @@ public class EVDataServiceImpl implements EVDataService {
                 if (taskApp.getSigState() != 1) {
                     return;
                 }
-            } else if (taskApp.getRemarkType().equals("2")) { //东方中讯
+            } else if (taskApp.getRemarkType().equals("2") || taskApp.getRemarkType().equals("3")) { //东方中讯
                 //添加电签策略
                 List<Map<String, Object>> strategyListByDFZX = getStrategyListByDFZX(taskApp, ids);
                 //调用签字逻辑
-                String s = signTaskBatchByDFZX(strategyListByDFZX, fileUrl, taskApp.getSigType());
+                String s = signTaskBatchByDFZX(strategyListByDFZX, fileUrl, taskApp.getSigType(),taskApp.getRemarkType(),taskApp.getContractId());
                 if (s.contains("sucess")) {
                     taskApp.setLastFilePdfUrl(s.split("@@@@")[1]);
                     taskApp.setSigState(1);
@@ -492,7 +492,9 @@ public class EVDataServiceImpl implements EVDataService {
                 Integer remarkType = projectInfo.getRemarkType();
                 if (remarkType != null && Func.isNotEmpty(remarkType) && remarkType == 2) {
                     taskApp.setRemarkType("2");
-                } else {
+                }else if (remarkType != null && Func.isNotEmpty(remarkType) && remarkType == 3) {
+                    taskApp.setRemarkType("3");
+                }else {
                     taskApp.setRemarkType("1");
                 }
             }
@@ -663,7 +665,7 @@ public class EVDataServiceImpl implements EVDataService {
     }
 
     // 添加电签策略 -- 东方中讯
-    public String signTaskBatchByDFZX(List<Map<String, Object>> maps, String pdfUrl, int type) {
+    public String signTaskBatchByDFZX(List<Map<String, Object>> maps, String pdfUrl, int type,String remarkType,String contractId) {
         if (maps != null && maps.size() > 0) {
             String fileUrl = pdfUrl;
             for (Map<String, Object> dataMap : maps) {
@@ -671,7 +673,7 @@ public class EVDataServiceImpl implements EVDataService {
                 daMa.put("keyWord", dataMap.get("keyWord"));
                 daMa.put("sealId", dataMap.get("sealId"));
                 // 设置图片显示大小
-                if (type != 2) { //章
+                if (type != 2 && !remarkType.equals("3")) { //章
                     daMa.put("showHeight", 30);
                     daMa.put("showWidth", 60);
                 }
@@ -702,7 +704,10 @@ public class EVDataServiceImpl implements EVDataService {
                 } catch (Exception e) {
                     throw new RuntimeException(e);
                 }
-                String reData = eVisaService.signPdfByDFZX(daMa);
+
+
+                String reData = eVisaService.signPdfByDFZX(daMa,remarkType,contractId);
+
                 if (reData.indexOf("success@") >= 0) {
                     fileUrl = reData.split("@@@@")[1];
                 } else {

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

@@ -68,6 +68,9 @@ import org.springblade.system.cache.ParamCache;
 import org.springblade.system.user.entity.User;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
 import org.springframework.http.converter.HttpMessageConverter;
 import org.springframework.http.converter.StringHttpMessageConverter;
@@ -313,7 +316,7 @@ public class EVisaServiceImpl implements EVisaService {
                             String originalFileB64 = Base64.toBase64String(fileByte);
                             daMa.put("fileB64", originalFileB64);
                             daMa.put("lastSignFlag", false);
-                            String reData = signPdfByDFZX(daMa);
+                            String reData = signPdfByDFZX(daMa,reType,contractId);
                             if (reData.indexOf("success@") >= 0) {
                                 fileUrl = reData.split("@@@@")[1];
                             } else {
@@ -517,7 +520,7 @@ public class EVisaServiceImpl implements EVisaService {
                             String originalFileB64 = Base64.toBase64String(fileByte);
                             daMa.put("fileB64", originalFileB64);
                             daMa.put("lastSignFlag", false);
-                            String reData = signPdfByDFZX(daMa);
+                            String reData = signPdfByDFZX(daMa,"2",contractId);
                             if (reData.indexOf("success@") >= 0) {
                                 fileUrl = reData.split("@@@@")[1];
                             } else {
@@ -788,12 +791,17 @@ public class EVisaServiceImpl implements EVisaService {
      * 东方 中讯
      * @throws Exception
      */
-    public String signPdfByDFZX(HashMap<String, Object> request) {
+    public String signPdfByDFZX(HashMap<String, Object> paramsMap,String signPdfByDFZX,String contractId) {
         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://219.151.181.73:9125/FrontSys/SealServicezx/FileSignByKeyWord";
         }
+        if(signPdfByDFZX.equals("3")){
+            url = "http://113.250.191.72:9125/FrontSys/SealServicezx/FileSignByKeyWord";
+        }
+
+
         String sysLocalFileUrl = FileUtils.getSysLocalFileUrl();
         String filecode = SnowFlakeUtil.getId() + "";
         String dataFileUrl = sysLocalFileUrl + "/pdf/" + filecode + ".pdf";
@@ -802,7 +810,9 @@ public class EVisaServiceImpl implements EVisaService {
             httpRequestFactory.setConnectionRequestTimeout(30000);
             httpRequestFactory.setConnectTimeout(30000);
             httpRequestFactory.setReadTimeout(30000);
+
             RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
+
             // 设置编码格式为UTF-8
             List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();
             HttpMessageConverter<?> converterTarget = null;
@@ -818,16 +828,33 @@ public class EVisaServiceImpl implements EVisaService {
             }
             HttpMessageConverter<?> converter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
             converterList.add(1, converter);
+            HashMap<String, Object> retData;
+            if(signPdfByDFZX.equals("3")){
+                Map<String, Object> stringObj = jdbcTemplate.queryForMap("SELECT seal_project_id,seal_account_id,seal_customer_id,seal_comm_key from m_contract_info  where id = " + contractId);
+                System.out.println(contractId);
+                HttpHeaders headers = new HttpHeaders();
+                // 添加自定义头(示例:设置Authorization和Content-Type)
+                headers.add("project_id", stringObj.get("seal_project_id")+"");  // 替换为实际
+                headers.add("account_id", stringObj.get("seal_account_id")+"");  // 替换为实际
+                headers.add("customer_id", stringObj.get("seal_customer_id")+"");  // 替换为实际
+                headers.add("commKey", stringObj.get("seal_comm_key")+"");  // 替换为实际
+                headers.setContentType(MediaType.APPLICATION_JSON);  // 指定请求体为JSON格式
+
+                HttpEntity<HashMap<String, Object>> httpEntity = new HttpEntity<>(paramsMap, headers);
+
+                retData = restTemplate.postForObject(url, httpEntity, HashMap.class);
+            }else{
+                retData = restTemplate.postForObject(url, paramsMap, HashMap.class);
+            }
 
-            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();
 
             if (!"0".equals(code)) {
+                System.out.println(retData);
                 return ERROR + "@@@@" + msg;
             }
-
             String fileB642 = retData.get("fileB64").toString();
 
             FileOutputStream fout = new FileOutputStream(dataFileUrl);

+ 1 - 1
blade-service/blade-manager/pom.xml

@@ -234,7 +234,7 @@
                     <target>${java.version}</target>
                     <encoding>${project.build.sourceEncoding}</encoding>
                     <compilerArguments>
-                        <bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar;${java.home}/lib/jsse.jar
+                        <bootclasspath>${java.home}/lib/rt.jar:${java.home}/lib/jce.jar:${java.home}/lib/jsse.jar
                         </bootclasspath>
                     </compilerArguments>
                 </configuration>

+ 9 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java

@@ -619,8 +619,10 @@ public class ArchiveTreeContractSyncImpl {
                         archiveFile.setFilePage(info.getEVisaPdfPage());
                         archiveFile.setFileSize(info.getEVisaPdfSize());
                         archiveFile.setIsCertification(1);
-                        archiveFile.setCertificationTime(info.getBusinessTime());
-                        archiveFile.setFileTime(info.getBusinessTime());
+                        if (StringUtils.isNotEmpty(info.getBusinessTime())) {
+                            archiveFile.setCertificationTime(info.getBusinessTime());
+                            archiveFile.setFileTime(info.getBusinessTime());
+                        }
                         archiveFile.setSort(sort);
                         if (nodeId != null && !nodeId.toString().equals(archiveFile.getNodeId())) {
                             archiveFile.setNodeId(nodeId.toString());
@@ -688,14 +690,14 @@ public class ArchiveTreeContractSyncImpl {
             // 特殊类型处理:根据 nodeType 匹配对应的数字
             if (treeContractVO6.getNodeType() != null) {
                 switch (treeContractVO6.getNodeType()) {
-                    case 1: // 单位工程 → 匹配 2
-                        return majarDataType.contains("2");
+                    case 1: // 单位工程 → 匹配 9
+                        return majarDataType.contains("9");
                     case 2: // 分部工程 → 匹配 8
                     case 3: // 子分部工程 → 匹配 8
                         return majarDataType.contains("8");
-                    case 4: // 分项工程 → 匹配 9
-                    case 5: // 子分项工程 → 匹配 9
-                        return majarDataType.contains("9");
+                    case 4: // 分项工程 → 匹配 2
+                    case 5: // 子分项工程 → 匹配 2
+                        return majarDataType.contains("2");
                     default:
                         return majarDataType.contains(currentMajor);
                 }

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

@@ -1247,7 +1247,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     if (wbsTreeContractByP != null) {
                         //处理文件提名
                         String fileName = this.wbsParamService.createFileTitle(wbsTreeContractByP);
-                        if(wbsTreeContract.getMajorDataType()!=null&&wbsTreeContract.getMajorDataType()==6){
+                        if(wbsTreeContractByP.getMajorDataType()!=null&&wbsTreeContractByP.getMajorDataType()==4){
                             String sql1="Select sg_suffix,jl_suffix from m_project_info where id="+wbsTreeContractByP.getProjectId()+" and is_deleted=0";
                             List<ProjectInfo> query = jdbcTemplate.query(sql1, new BeanPropertyRowMapper<>(ProjectInfo.class));
                             if(query.size()>0){
@@ -1294,7 +1294,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                         .eq(WbsTreeContract::getId, wbsTreeContract.getParentId()).eq(WbsTreeContract::getContractId, wbsTreeContract.getContractId()));
                 //处理文件提名
                 fileName1= this.wbsParamService.createFileTitle(wbsTreeContractByP);
-                if(wbsTreeContract.getMajorDataType()!=null&&wbsTreeContract.getMajorDataType()==6){
+                if(wbsTreeContractByP.getMajorDataType()!=null&&wbsTreeContractByP.getMajorDataType()==4){
                     String sql1="Select sg_suffix,jl_suffix from m_project_info where id="+wbsTreeContractByP.getProjectId()+" and is_deleted=0";
                     List<ProjectInfo> query = jdbcTemplate.query(sql1, new BeanPropertyRowMapper<>(ProjectInfo.class));
                     if(query.size()>0){

+ 72 - 36
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -192,43 +192,79 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
             throw new ServiceException(StringUtil.format("当前用户 [{}] 已存在!", user.getAccount()));
         }
             //获取Role信息
-//        if (user.getProjectAndUserList().size() <= 0) {
-//            throw new ServiceException("请关联项目合同段用户类型信息");
-//        }
-//        StringBuffer stringBuffer = new StringBuffer();
-//        Set<String> set = new TreeSet<>();
-//        List<SaveUserInfoByProjectDTO> projectAndUserList = user.getProjectAndUserList();
-//        projectAndUserList.forEach(i -> {
-//            String roleId = i.getRoleId();
-//            set.add(roleId);
-//        });
-//        for (String s : set) {
-//            stringBuffer.append(s).append(",");
-//        }
-//        user.setRoleId(String.valueOf(stringBuffer.deleteCharAt(stringBuffer.length() - 1)));
-//        //user.setUserType(1); //用户平台-WEB
-//        user.setName(user.getRealName());
+        if (user.getProjectAndUserList().size() <= 0) {
+            throw new ServiceException("请关联项目合同段用户类型信息");
+        }
+        StringBuffer stringBuffer = new StringBuffer();
+        Set<String> set = new TreeSet<>();
+        List<SaveUserInfoByProjectDTO> projectAndUserList = user.getProjectAndUserList();
+            projectAndUserList.forEach(i -> {
+                String roleId = i.getRoleId();
+                set.add(roleId);
+            });
+            for (String s : set) {
+                stringBuffer.append(s).append(",");
+            }
+            user.setRoleId(String.valueOf(stringBuffer.deleteCharAt(stringBuffer.length() - 1)));
+
+       //user.setUserType(1); //用户平台-WEB
+        user.setName(user.getRealName());
         boolean b1 = save(user);
-        boolean b = submitUserDept(user);
-        return b1;
-//
-//        if (b1) {
-//            //绑定用户与部门关系
-//
-//            if (b) {
-//                //比较
-//                if (checkContractId(user.getProjectAndUserList())) {
-//                    throw new ServiceException("一个合同段只允许分配一个用户类型信息,请重新选择");
-//                }
-//                //新增用户绑定项目合同段
-//                user.getProjectAndUserList().forEach((i) -> {
-//                    i.setUserId(String.valueOf(user.getId()));
-//                });
-//                contractClient.saveUserInfoByProjectThree(user.getProjectAndUserList());
-//                return true;
-//            }
-//        }
-//        throw new ServiceException("操作失败");
+        if (b1) {
+            //绑定用户与部门关系
+             boolean b = submitUserDept(user);
+            if (b) {
+                //比较
+                if (checkContractId(user.getProjectAndUserList())) {
+                    throw new ServiceException("一个合同段只允许分配一个用户类型信息,请重新选择");
+                }
+                //新增用户绑定项目合同段
+                user.getProjectAndUserList().forEach((i) -> {
+                    i.setUserId(String.valueOf(user.getId()));
+                    ContractInfo contractInfo = contractClient.getContractById(Long.valueOf(i.getContractId()));
+                    //监理、业主、中西试验室合同段新增
+                    if (contractInfo!=null&&(contractInfo.getContractType() == 2 || contractInfo.getContractType() == 3 || contractInfo.getContractType() == 4)) {
+                        //同步到对应关联的施工合同段中
+                        String sql = "select * from m_contract_relation_jlyz where contract_id_jlyz = " + contractInfo.getId();
+                        List<String> record_SG = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ContractRelationJlyz.class)).stream().map(ContractRelationJlyz::getContractIdSg).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
+                        if (record_SG.size() > 0) {
+                           a: for (String sgId : record_SG) {
+                                //当前施工合同段所有用户角色信息
+                                String sql2 = "select * from m_project_assignment_user where contract_id = " + sgId + " and post_id is null and status = 1 and is_deleted = 0";
+                                List<SaveUserInfoByProjectDTO> userRoleInfoSG = jdbcTemplate.query(sql2, new BeanPropertyRowMapper<>(SaveUserInfoByProjectDTO.class));
+                                for (SaveUserInfoByProjectDTO sg : userRoleInfoSG) {
+                                    if (sg.getUserId().equals(i.getUserId())) {
+                                        //如果监理合同段与施工合同段中有相同的用户信息,就移除,一个用户只能存在一个合同段中
+                                        continue a;
+                                    }
+                                }
+                                //重构入参
+                                List<SaveUserInfoByProjectDTO> addList = new ArrayList<>();
+                                    SaveUserInfoByProjectDTO newObj = BeanUtil.copyProperties(i, SaveUserInfoByProjectDTO.class);
+                                    assert newObj != null;
+                                    newObj.setId(SnowFlakeUtil.getId());
+                                    newObj.setContractId(sgId);
+                                    newObj.setStatus(1);
+                                    if (ObjectUtil.isNotEmpty(SecureUtil.getUser())) {
+                                        newObj.setCreateUser(SecureUtil.getUser().getUserId());
+                                        newObj.setCreateDept(Long.parseLong(SecureUtil.getUser().getDeptId().split(",")[0]));
+                                    }
+                                    newObj.setCreateTime(new Date());
+                                    newObj.setIsRecordJlId(contractInfo.getId()); //从监理合同段关联的数据,用于删除关联时同步删除用户信息
+                                    addList.add(newObj);
+                                //保存监理数据时,同步到对应关联的施工合同段中去
+                                if (addList.size() > 0) {
+                                    contractClient.saveUserInfoByProjectThree(addList);
+                                }
+                            }
+                        }
+                    }
+                });
+                contractClient.saveUserInfoByProjectThree(user.getProjectAndUserList());
+                return true;
+            }
+        }
+        throw new ServiceException("操作失败");
     }
 
     /**