Browse Source

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

huangtf 1 year ago
parent
commit
946329eccb
28 changed files with 547 additions and 247 deletions
  1. 1 1
      blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java
  2. 3 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/DatumPoint.java
  3. 16 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TreeCodeUpdate.java
  4. 67 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TreeCodeUpdateAspect.java
  5. 1 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/DatumPointVo.java
  6. 5 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClient.java
  7. 3 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClientFallBack.java
  8. 16 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  9. 6 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java
  10. 15 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  11. 3 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveOfflineVersionInfoService.java
  12. 3 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  13. 1 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveOfflineVersionInfoServiceImpl.java
  14. 107 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  15. 6 9
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  16. 5 74
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  17. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/DatumPointMapper.xml
  18. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITaskService.java
  19. 82 4
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  20. 13 0
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java
  21. 0 21
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java
  22. 22 118
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java
  23. 4 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java
  24. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ITurnPointCalculator.java
  25. 9 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/LevelInfo.java
  26. 9 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsParamService.java
  27. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  28. 142 14
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java

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

@@ -112,7 +112,7 @@ public class CommonUtil {
      */
     public static InputStream getOSSInputStream(String urlStr) throws Exception {
         //获取OSS文件流
-        urlStr = replaceOssUrl(urlStr);
+//        urlStr = replaceOssUrl(urlStr);
         URL imageUrl = new URL(urlStr);
         try {
             HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();

+ 3 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/DatumPoint.java

@@ -8,7 +8,7 @@ import org.springblade.core.tenant.mp.TenantEntity;
 /**
  * @author yangyj
  * @Date 2022/6/7 15:32
- * @description TODO
+ * @description 测站点
  */
 @Data
 @TableName("t_om_datum_point")
@@ -19,6 +19,8 @@ public class DatumPoint extends TenantEntity {
     private Double y;
     private Double h;
     private String level;
+    /**里程信息,用于转点估算距离*/
+    private String milestone;
     private String remark;
     private Integer type;
     private Long projectId;

+ 16 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TreeCodeUpdate.java

@@ -0,0 +1,16 @@
+package org.springblade.business.entity;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author yangyj
+ * @Description treeCode刷新标记
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface TreeCodeUpdate {
+    String name() default "";
+}

+ 67 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TreeCodeUpdateAspect.java

@@ -0,0 +1,67 @@
+package org.springblade.business.entity;
+
+
+import lombok.RequiredArgsConstructor;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author yangyj
+ * @Date 2023/10/27 10:39
+ * @description treeCode刷新标识
+ */
+@Aspect
+@Component
+@RequiredArgsConstructor
+public class TreeCodeUpdateAspect {
+    private final StringRedisTemplate redisTemplate;
+    private final JdbcTemplate  jdbcTemplate;
+
+    @Pointcut("@annotation(org.springblade.business.entity.TreeCodeUpdate)")
+    public void p(){};
+
+    @Around("p()")
+    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
+        Object result = null;
+        try {
+            Object[] args = joinPoint.getArgs();
+             Map<String,Object> paramsMap=  BeanUtil.toMap(args[0]);
+            String  tcu= this.redisTemplate.opsForValue().get("tcu");
+            if(paramsMap.containsKey("contractId")){
+                  if(Func.isNotBlank(tcu)){
+                      tcu=tcu+","+paramsMap.get("contractId");
+                  }
+             }else if(paramsMap.containsKey("needCopyPrimaryKeyId")){
+                List<Map<String,Object>> listMap=  jdbcTemplate.queryForList("select contract_id contractId from m_wbs_tree_contract where p_key_id ="+paramsMap.get("needCopyPrimaryKeyId"));
+                if(listMap.size()>0){
+                    if(Func.isNotBlank(tcu)){
+                        tcu=tcu+","+listMap.get(0).get("contractId");
+                    }else{
+                        tcu=listMap.get(0).get("contractId").toString();
+                    }
+                }
+             }
+            if(tcu!=null) {
+                this.redisTemplate.opsForValue().set("tcu", tcu);
+            }
+            result= joinPoint.proceed();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        /*System.out.println("treeCode刷新标识:执行一次就+1,后台定时检查到超阈值则执行刷新");*/
+        return result;
+    }
+
+
+
+}

+ 1 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/DatumPointVo.java

@@ -16,5 +16,6 @@ public class DatumPointVo {
     private Double y;
     private Double h;
     private String level;
+    private String milestone;
     private String remark;
 }

+ 5 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClient.java

@@ -6,8 +6,11 @@ import org.springblade.manager.entity.ExcelTab;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import javax.servlet.http.HttpServletRequest;
+
 import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;
 
 @FeignClient(value = APPLICATION_NAME_PREFIX + "manager", fallback = ExcelTabClientFallBack.class)
@@ -50,6 +53,7 @@ public interface ExcelTabClient {
     R synPDFInfo(@RequestParam String contractId,
                  @RequestParam String nodeIds,
                  @RequestParam String classify,
-                 @RequestParam String projectId) throws Exception;
+                 @RequestParam String projectId,
+                 @RequestHeader("Blade-Auth") String header) throws Exception;
 
 }

+ 3 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClientFallBack.java

@@ -9,6 +9,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Component;
 
+import javax.servlet.http.HttpServletRequest;
+
 @Component
 public class ExcelTabClientFallBack implements ExcelTabClient {
 
@@ -40,7 +42,7 @@ public class ExcelTabClientFallBack implements ExcelTabClient {
     }
 
     @Override
-    public R synPDFInfo(String contractId, String nodeIds, String classify, String projectId) throws Exception {
+    public R synPDFInfo(String contractId, String nodeIds, String classify, String projectId,String authorization) throws Exception {
         return null;
     }
 

+ 16 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -19,10 +19,12 @@ package org.springblade.archive.controller;
 import cn.hutool.core.text.split.SplitIter;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 
 import lombok.SneakyThrows;
@@ -34,6 +36,7 @@ import org.springblade.archive.utils.CallBgrsjk;
 import org.springblade.archive.utils.FileUtils;
 import org.springblade.archive.vo.CheckoutVO;
 import org.springblade.business.entity.ArchiveFile;
+import org.springblade.business.entity.InformationQuery;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.mp.support.Condition;
@@ -49,6 +52,7 @@ import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.ProjectClient;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -59,6 +63,7 @@ import org.springblade.archive.service.IArchivesAutoService;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -644,4 +649,15 @@ public class ArchivesAutoController extends BladeController {
 		List<CheckoutVO> list = archivesAutoService.getArchivesAutoViewByUnit(unitType,projectId);
 		return R.data(list);
 	}
+
+	/**
+	 * 批量下载档案
+	 */
+	@PostMapping(value = "/batchDownloadFileToZip", produces = {
+		MediaType.APPLICATION_OCTET_STREAM_VALUE, MediaType.APPLICATION_JSON_VALUE})
+	@ApiOperationSupport(order = 19)
+	@ApiOperation(value = "批量下载档案")
+	public void batchDownloadFileToZip(String ids, HttpServletResponse response) {
+		archivesAutoService.batchDownloadFileToZip(ids,response);
+	}
 }

+ 6 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java

@@ -17,6 +17,7 @@
 package org.springblade.archive.mapper;
 
 import org.apache.ibatis.annotations.MapKey;
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.archive.dto.ArchivesAutoDTO;
 import org.springblade.archive.entity.ArchivesAuto;
@@ -24,6 +25,7 @@ import org.springblade.archive.vo.ArchivesAutoVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.archive.vo.ArchivesAutoVO2;
+import org.springblade.business.entity.ArchiveFile;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.user.entity.User;
@@ -157,4 +159,8 @@ public interface ArchivesAutoMapper extends BaseMapper<ArchivesAuto> {
     List<ArchiveTreeContract> getUnitNodeByProjectId(@Param("projectId") Long projectId);
 
 	List<ArchivesAutoVO2> getUnitAllArchive(@Param("node") String node);
+
+    List<ArchiveFile> batchSearchArchiveFile(@Param("ids") List<Long> longs);
+
+	List<ArchivesAuto> getArchives(@Param("ids") List<Long> longs);
 }

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

@@ -942,6 +942,21 @@
         from (select * from m_archive_tree_contract WHERE is_deleted = 0 and ancestors like concat('%',#{node},'%')) atc
                  join u_archives_auto uaa on atc.id = uaa.node_id  and uaa.is_deleted = 0
     </select>
+    <select id="batchSearchArchiveFile" resultType="org.springblade.business.entity.ArchiveFile">
+        select id,file_name,pdf_file_url,archive_id,project_id FROM u_archive_file
+        WHERE is_element = 0 and is_deleted = 0 and archive_id in
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
+    <select id="getArchives" resultType="org.springblade.archive.entity.ArchivesAuto">
+        select id,name
+        from u_archives_auto
+        where   id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
 
 
     <update id="splitFiles">

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

@@ -14,4 +14,7 @@ public interface IArchiveOfflineVersionInfoService extends BaseService<ArchiveOf
     public void metadataToSqlite(Long projectId) ;
 
     int getPackStatus();
+
+    void packageZip2(String zipUrl,String packUrl) throws Exception ;
+
 }

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

@@ -28,6 +28,7 @@ import org.springblade.system.entity.DictBiz;
 import org.springblade.system.user.entity.User;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
@@ -104,4 +105,6 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 	R searchInfo(MultipartFile file) throws IOException;
 
     List<CheckoutVO> getArchivesAutoViewByUnit(Integer unitType, Long projectId);
+
+    void batchDownloadFileToZip(String ids, HttpServletResponse response);
 }

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

@@ -109,7 +109,7 @@ public class ArchiveOfflineVersionInfoServiceImpl extends BaseServiceImpl<Archiv
      * @param
      * @throws Exception
      */
-    public static void packageZip2(String zipUrl,String packUrl) throws Exception {
+    public void packageZip2(String zipUrl,String packUrl) throws Exception {
         // 要被压缩的文件夹
         File folder = new File(zipUrl);
         if (!folder.exists() && !folder.isDirectory()) {

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

@@ -32,6 +32,7 @@ import org.apache.commons.lang.StringUtils;
 import org.springblade.archive.entity.ArchiveProjectConfig;
 import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.service.IArchiveAutoPdfService;
+import org.springblade.archive.service.IArchiveOfflineVersionInfoService;
 import org.springblade.archive.service.IArchiveProjectConfigService;
 import org.springblade.archive.utils.ArchiveTreeUtil;
 import org.springblade.archive.utils.FileTransJavaDemo;
@@ -82,9 +83,14 @@ import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.ExecutorService;
@@ -120,6 +126,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 	private final MetadataClassificationClient metadataClassificationClient;
 
+	private final IArchiveOfflineVersionInfoService versionInfoService;
+
 
 	@Override
 	public IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto) {
@@ -2322,4 +2330,103 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		}
 		return null;
 	}
+
+	@Override
+	public void batchDownloadFileToZip(String ids, HttpServletResponse response) {
+		List<Long> longs = Func.toLongList(ids);
+		//获取档案下的文件
+		List<ArchiveFile> result = baseMapper.batchSearchArchiveFile(longs);
+		//判断是否存在文件
+		if (result != null && result.size() > 0) {
+			//获取选择的案卷,只要id和文件提名字段
+			Map<Long, String> nameMap = baseMapper.getArchives(longs).stream().filter(l -> StringUtils.isNotBlank(l.getName())).collect(Collectors.toMap(l -> l.getId(), l -> l.getName()));
+			//默认下载地址
+			String defaultDir = "/www/wwwroot/Users/hongchuangyanfa/Desktop/archiveDownload";
+			//项目下地址
+			String projectDir = defaultDir+"/" + result.get(0).getProjectId();
+			File file = new File(projectDir);
+			//获取项目名称
+			ProjectInfo projectInfo = projectClient.getById(result.get(0).getProjectId());
+			//判断文件夹是否存在,存在则该项目正在下载打包,不存在则生成
+			if (file.exists()) {
+				throw new ServiceException("当前项目正在下载档案,请稍后再试");
+			} else {
+				file.mkdir();
+			}
+			//删除掉pdfUrl为空的数据
+			result.removeIf(query -> StringUtils.isEmpty(query.getPdfFileUrl()));
+			//按照档案id分组
+			Map<Long, List<ArchiveFile>> map = result.stream().collect(Collectors.groupingBy(ArchiveFile::getArchiveId));
+			try {
+				//为每个档案分别设置
+				for (Long archiveId : map.keySet()) {
+					String initName = nameMap.get(archiveId);
+					String[] split = initName.split(")");
+					String name = split[split.length-1];
+					String archiveDir = projectDir + "/" + name;
+					//创建档案文件夹
+					File file2 = new File(archiveDir);
+					file2.mkdir();
+					//组卷,下载PDF
+					String mergeArchivesFile = this.getMergeArchivesFile(archiveId);
+					InputStream file_out2 = CommonUtil.getOSSInputStream(mergeArchivesFile);
+					if (file_out2 != null) {
+						CommonUtil.inputStreamToFile(file_out2, new File(archiveDir+"/" + name+".pdf"));
+						file_out2.close();
+					}
+
+					//下载卷内文件
+					String archiveFileDir = archiveDir + "/" + "卷内文件";
+					File file3 = new File(archiveFileDir);
+					file3.mkdir();
+					List<ArchiveFile> files = map.get(archiveId);
+					for (ArchiveFile archiveFile : files) {
+						String fileUrl = archiveFile.getPdfFileUrl();
+						String initFileName = archiveFile.getFileName();
+						if (initFileName.length() > 100){
+							initFileName = initFileName.substring(0,100);
+						}
+						String fileName = "/" + initFileName+".pdf";
+						InputStream file_out = CommonUtil.getOSSInputStream(fileUrl);
+						if (file_out != null) {
+							CommonUtil.inputStreamToFile(file_out, new File(archiveFileDir + fileName));
+							file_out.close();
+						}
+					}
+				}
+				//下载完成,打包文件
+				this.packageZip2(defaultDir,projectDir,projectInfo.getId());
+				String zipFile = defaultDir + "/"+projectInfo.getId()+".zip";
+				Path path = Paths.get(zipFile);
+				response.setContentType("application/octet-stream");
+				response.setHeader("Content-Disposition", "attachment;filename="+projectInfo.getProjectName());
+				// 获取文件内容流并写入响应
+				Files.copy(path, response.getOutputStream());
+
+			}catch (Exception e){
+				throw new ServiceException(e.getMessage());
+			}
+		}
+	}
+
+	/**
+	 * 压缩指定路径下的文件夹-直接执行linux命令,多线程,速度快几十倍
+	 *
+	 * @param
+	 * @throws Exception
+	 */
+	public void packageZip2(String defaultDir,String projectDir,Long id) throws Exception {
+		// 要被压缩的文件夹
+		File folder = new File(defaultDir);
+		if (!folder.exists() && !folder.isDirectory()) {
+			folder.mkdirs();
+		}
+		// 执行脚本文件
+		// 多条命令执行
+		String[] cmds = {"/bin/sh", "-c", "cd "+defaultDir+" && zip -q -r "+projectDir+".zip "+id};
+		System.out.println("开始执行命令:" + Arrays.toString(cmds));
+		//主要在这步写入后调用命令
+		Process process = Runtime.getRuntime().exec(cmds);
+		process.waitFor();
+	}
 }

+ 6 - 9
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -44,7 +44,6 @@ import org.springblade.manager.dto.RangeInfo;
 import org.springblade.manager.dto.RangeJson;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.feign.*;
-import org.springblade.manager.vo.WbsTreeContractLazyVO;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springblade.manager.vo.WbsTreeContractVO8;
 import org.springblade.resource.feign.NewIOSSClient;
@@ -58,10 +57,6 @@ import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.RowMapper;
 import org.springframework.scheduling.annotation.Async;
-import org.springframework.transaction.TransactionStatus;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
@@ -72,8 +67,6 @@ import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 import java.util.*;
 import java.util.function.Function;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 /**
@@ -1377,6 +1370,7 @@ public class InformationWriteQueryController extends BladeController {
     @PostMapping("/copyContractTreeNode")
     @ApiOperationSupport(order = 15)
     @ApiOperation(value = "复制节点(新)")
+    @TreeCodeUpdate(name = "pkeyId_${vo.primaryKeyId}")
     public R<Boolean> copyContractTreeNode(@RequestBody CopyContractTreeNodeVO vo) {
         //表单所属方
         String tabOwner = "";
@@ -1467,7 +1461,7 @@ public class InformationWriteQueryController extends BladeController {
                     //newData.setIsBussShow(1);
                     //初始化表格是否上传附件,默认未上传
                     newData.setTabFileType(1);
-                    //初始化单表是否可以预览,默认不能
+                    //初始化单表是否可以预览,默认
                     newData.setIsTabPdf(1);
                     //初始化PDF路径
                     newData.setPdfUrl(null);
@@ -2960,6 +2954,7 @@ public class InformationWriteQueryController extends BladeController {
     @PostMapping("/saveContractTreeNode")
     @ApiOperationSupport(order = 10)
     @ApiOperation(value = "新增节点及其子节点")
+    @TreeCodeUpdate(name="contractId_${vo.contractId}")
     public R<Boolean> saveContractTreeNode(@RequestBody AddContractTreeNodeVO vo) {
         //先获取当前节点的信息
         WbsTreeContract treeContract = this.wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(Long.parseLong(vo.getCurrentNodePrimaryKeyId()));
@@ -3139,8 +3134,10 @@ public class InformationWriteQueryController extends BladeController {
                 newData.setContractIdRelation(treeContract.getContractIdRelation());
                 newData.setContractType(treeContract.getContractType());
                 newData.setCreateTime(new Date());
-                if (half.getType() != null && new Integer("2").equals(half.getType())) {
+                if(Optional.ofNullable(half.getNodeType()).orElse(7)<=6){
                     newData.setIsTypePrivatePid(half.getPKeyId());
+                }
+                if (half.getType() != null && new Integer("2").equals(half.getType())) {
                     //2023年8月1日14:41:03更改需求,isBussShow默认=1
                     newData.setIsBussShow(1);
                 }

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

@@ -63,6 +63,7 @@ import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.text.SimpleDateFormat;
@@ -1600,81 +1601,11 @@ public class TaskController extends BladeController {
     @PostMapping("/reSigningEVisa")
     @ApiOperationSupport(order = 3)
     @ApiOperation(value = "任务管理-一键重签", notes = "传入taskIds、下拉框的contractId、projectId")
-    public R<Object> reSigningEVisa(@RequestParam String taskIds, @RequestParam String contractId, @RequestParam String projectId) {
-        if (ObjectUtil.isEmpty(taskIds)) {
-            throw new ServiceException("请选择至少一条任务进行重签");
-        }
-        List<Task> taskList = jdbcTemplate.query("select * from u_task where id in(" + taskIds + ")", new BeanPropertyRowMapper<>(Task.class));
-        if (taskList.size() > 0) {
-            List<String> dataIdList = taskList.stream().map(Task::getFormDataId).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
-            List<InformationQuery> informationQueryList = jdbcTemplate.query("select * from u_information_query where id in(" + StringUtils.join(dataIdList, ",") + ")", new BeanPropertyRowMapper<>(InformationQuery.class));
-            if (informationQueryList.size() > 0) {
-                List<Long> nodePKeyIdList = informationQueryList.stream().map(InformationQuery::getWbsId).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
-                if (nodePKeyIdList.size() > 0) {
-                    try {
-                        //重新保存
-                        long startTime_1 = System.currentTimeMillis();
-                        R result = this.saveNodePdf(StringUtils.join(nodePKeyIdList, ","), contractId, projectId);
-                        long endTime_1 = System.currentTimeMillis();
-                        long executionTime_1 = endTime_1 - startTime_1;
-                        log.info("saveNodePdf执行时间:" + executionTime_1 + " 毫秒");
-
-                        //重新电签
-                        if (result != null && "成功".equals(result.getData())) {
-                            List<TaskApprovalVO> taskApprovalVOS = new ArrayList<>();
-                            //获取任务详情信息Map
-                            Set<String> processInstanceIds = taskList.stream().map(Task::getProcessInstanceId).collect(Collectors.toSet());
-                            Map<String, List<TaskParallel>> taskParallelGroupMap = new HashMap<>();
-                            if (processInstanceIds.size() > 0) {
-                                String resultIds = processInstanceIds.stream()
-                                        .map(id -> "'" + id + "'")
-                                        .collect(Collectors.joining(","));
-                                taskParallelGroupMap = jdbcTemplate.query("select parallel_process_instance_id,process_instance_id,e_visa_status,task_user,task_user_name,status from u_task_parallel where process_instance_id in(" + resultIds + ") order by id", new BeanPropertyRowMapper<>(TaskParallel.class)).stream().collect(Collectors.groupingBy(TaskParallel::getProcessInstanceId));
-                            }
-                            Map<String, List<TaskParallel>> finalTaskParallelGroupMap = taskParallelGroupMap;
-
-                            for (Task task : taskList) {
-                                List<TaskParallel> taskParallelList = finalTaskParallelGroupMap.get(task.getProcessInstanceId());
-                                for (TaskParallel taskParallel : taskParallelList) {
-                                    //待审批的不进行重签, 存在待审批,但是电签状态是失败的
-                                    if (!(new Integer(1)).equals(taskParallel.getStatus()) || (taskParallel.getEVisaStatus() != null && taskParallel.getEVisaStatus() == 99)) {
-                                        TaskApprovalVO approvalVO = new TaskApprovalVO();
-                                        approvalVO.setTaskId(task.getId().toString());
-                                        approvalVO.setFlag("OK");
-                                        approvalVO.setComment("重新发起电签");
-                                        approvalVO.setApprovalType(1);
-                                        approvalVO.setFormDataId(task.getFormDataId());
-                                        approvalVO.setParallelProcessInstanceId(taskParallel.getParallelProcessInstanceId());
-                                        approvalVO.setYsNickName(taskParallel.getTaskUserName());
-                                        approvalVO.setUserId(Long.parseLong(taskParallel.getTaskUser()));
-                                        taskApprovalVOS.add(approvalVO);
-                                    }
-                                }
-                            }
-                            long startTime_2 = System.currentTimeMillis();
-                            taskService.batchCompleteApprovalTask(taskApprovalVOS);
-                            long endTime_2 = System.currentTimeMillis();
-                            long executionTime_2 = endTime_2 - startTime_2;
-                            log.info("batchCompleteApprovalTask执行时间:" + executionTime_2 + " 毫秒");
-
-                            return R.success("任务已经成功提交重签,请耐心等待!");
-                        } else {
-                            throw new ServiceException("重新保存PDF信息失败");
-                        }
-
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                        throw new ServiceException("重新保存PDF信息失败,原因:" + e.getMessage());
-                    }
-                }
-            }
-        }
-        return R.fail("未获取到任务信息,操作失败!");
+    public R<Object> reSigningEVisa(@RequestParam String taskIds, @RequestParam String contractId, @RequestParam String projectId, HttpServletRequest request) {
+        String header = request.getHeader("Blade-Auth");
+        taskService.reSigningEVisa(taskIds,contractId,projectId,header );
+        return R.success("任务已经成功提交重签,请耐心等待!");
     }
 
-    @Async
-    R saveNodePdf(String nodePKeyIds, String contractId, String projectId) throws Exception {
-        return excelTabClient.synPDFInfo(contractId, nodePKeyIds, "1", projectId);
-    }
 
 }

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

@@ -18,6 +18,7 @@
         <result column="y" property="y"/>
         <result column="h" property="h"/>
         <result column="level" property="level"/>
+        <result column="milestone" property="milestone"/>
         <result column="remark" property="remark"/>
         <result column="type" property="type"/>
         <result column="projectId" property="project_id"/>

+ 5 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/ITaskService.java

@@ -21,7 +21,9 @@ import org.springblade.business.entity.TaskParallel;
 import org.springblade.business.vo.TaskApprovalVO;
 import org.springblade.business.vo.TaskVO;
 import org.springblade.core.mp.base.BaseService;
+import org.springframework.scheduling.annotation.Async;
 
+import javax.servlet.http.HttpServletRequest;
 import java.io.FileNotFoundException;
 import java.util.List;
 import java.util.Map;
@@ -93,4 +95,7 @@ public interface ITaskService extends BaseService<Task> {
      * 清除废除任务是的业务数据
      */
     void delArchiveFileBusinessData(Long projectId, Long wbsId);
+
+    @Async
+    void reSigningEVisa(String taskIds, String contractId, String projectId,String header);
 }

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

@@ -44,10 +44,7 @@ import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.entity.TabBusstimeInfo;
 import org.springblade.manager.entity.WbsTreeContract;
-import org.springblade.manager.feign.ArchiveTreeContractClient;
-import org.springblade.manager.feign.ContractClient;
-import org.springblade.manager.feign.ProjectClient;
-import org.springblade.manager.feign.WbsTreeContractClient;
+import org.springblade.manager.feign.*;
 import org.springblade.manager.vo.AppWbsTreeContractVO;
 import org.springblade.resource.feign.CommonFileClient;
 import org.springblade.system.user.cache.UserCache;
@@ -61,8 +58,10 @@ import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.RequestHeader;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import java.io.FileNotFoundException;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
@@ -121,6 +120,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 
     private final ArchiveAutoClient archiveAutoClient;
 
+    private final ExcelTabClient excelTabClient;
 
     @Autowired
     StringRedisTemplate RedisTemplate;
@@ -1299,4 +1299,82 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
         }
     }
 
+    @Override
+    public void reSigningEVisa(String taskIds, String contractId, String projectId,String header) {
+        if (ObjectUtil.isEmpty(taskIds)) {
+            throw new ServiceException("请选择至少一条任务进行重签");
+        }
+        List<Task> taskList = jdbcTemplate.query("select * from u_task where id in(" + taskIds + ")", new BeanPropertyRowMapper<>(Task.class));
+        if (taskList.size() > 0) {
+            List<String> dataIdList = taskList.stream().map(Task::getFormDataId).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
+            List<InformationQuery> informationQueryList = jdbcTemplate.query("select * from u_information_query where id in(" + StringUtils.join(dataIdList, ",") + ")", new BeanPropertyRowMapper<>(InformationQuery.class));
+            if (informationQueryList.size() > 0) {
+                List<Long> nodePKeyIdList = informationQueryList.stream().map(InformationQuery::getWbsId).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
+                if (nodePKeyIdList.size() > 0) {
+                    try {
+                        //重新保存
+                        long startTime_1 = System.currentTimeMillis();
+                        R result = this.saveNodePdf(StringUtils.join(nodePKeyIdList, ","), contractId, projectId,header);
+                        long endTime_1 = System.currentTimeMillis();
+                        long executionTime_1 = endTime_1 - startTime_1;
+                        log.info("saveNodePdf执行时间:" + executionTime_1 + " 毫秒");
+
+                        //重新电签
+                        if (result != null && "成功".equals(result.getData())) {
+
+                            List<TaskApprovalVO> taskApprovalVOS = new ArrayList<>();
+                            //获取任务详情信息Map
+                            Set<String> processInstanceIds = taskList.stream().map(Task::getProcessInstanceId).collect(Collectors.toSet());
+                            Map<String, List<TaskParallel>> taskParallelGroupMap = new HashMap<>();
+                            if (processInstanceIds.size() > 0) {
+                                String resultIds = processInstanceIds.stream()
+                                        .map(id -> "'" + id + "'")
+                                        .collect(Collectors.joining(","));
+                                taskParallelGroupMap = jdbcTemplate.query("select parallel_process_instance_id,process_instance_id,e_visa_status,task_user,task_user_name,status from u_task_parallel where process_instance_id in(" + resultIds + ") order by id", new BeanPropertyRowMapper<>(TaskParallel.class)).stream().collect(Collectors.groupingBy(TaskParallel::getProcessInstanceId));
+                            }
+                            Map<String, List<TaskParallel>> finalTaskParallelGroupMap = taskParallelGroupMap;
+
+                            for (Task task : taskList) {
+                                List<TaskParallel> taskParallelList = finalTaskParallelGroupMap.get(task.getProcessInstanceId());
+                                for (TaskParallel taskParallel : taskParallelList) {
+                                    //待审批的不进行重签, 存在待审批,但是电签状态是失败的
+                                    if (!(new Integer(1)).equals(taskParallel.getStatus()) || (taskParallel.getEVisaStatus() != null && taskParallel.getEVisaStatus() == 99)) {
+                                        TaskApprovalVO approvalVO = new TaskApprovalVO();
+                                        approvalVO.setTaskId(task.getId().toString());
+                                        approvalVO.setFlag("OK");
+                                        approvalVO.setComment("重新发起电签");
+                                        approvalVO.setApprovalType(1);
+                                        approvalVO.setFormDataId(task.getFormDataId());
+                                        approvalVO.setParallelProcessInstanceId(taskParallel.getParallelProcessInstanceId());
+                                        approvalVO.setYsNickName(taskParallel.getTaskUserName());
+                                        approvalVO.setUserId(Long.parseLong(taskParallel.getTaskUser()));
+                                        taskApprovalVOS.add(approvalVO);
+                                    }
+                                }
+                            }
+                            long startTime_2 = System.currentTimeMillis();
+                            this.batchCompleteApprovalTask(taskApprovalVOS);
+                            long endTime_2 = System.currentTimeMillis();
+                            long executionTime_2 = endTime_2 - startTime_2;
+                            log.info("batchCompleteApprovalTask执行时间:" + executionTime_2 + " 毫秒");
+
+                            throw new ServiceException("任务已经成功提交重签,请耐心等待!");
+                        } else {
+                            throw new ServiceException("重新保存PDF信息失败");
+                        }
+
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        throw new ServiceException("重新保存PDF信息失败,原因:" + e.getMessage());
+                    }
+                }
+            }
+        }
+        throw new ServiceException("未获取到任务信息,操作失败!");
+    }
+
+    R saveNodePdf(String nodePKeyIds, String contractId, String projectId,String header) throws Exception {
+        return excelTabClient.synPDFInfo(contractId, nodePKeyIds, "1", projectId,header);
+    }
+
 }

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

@@ -1,8 +1,19 @@
 package com.mixsmart.utils;
 
 
+import cn.hutool.json.JSONObject;
 import cn.hutool.log.StaticLog;
 import com.jfireel.expression.Expression;
+import org.apache.http.*;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
 import org.apache.poi.hssf.usermodel.HSSFDataFormatter;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.*;
@@ -34,6 +45,7 @@ import org.springblade.manager.dto.LocalVariable;
 import org.springblade.manager.entity.Formula;
 import org.springblade.manager.formula.NodeTable;
 import org.springblade.manager.utils.FileUtils;
+import reactor.core.publisher.Mono;
 
 import java.awt.*;
 import java.awt.Font;
@@ -841,4 +853,5 @@ public static Map<String,List<Long>> relatedPages(List<FormData> curFormDatas ,L
         treeCodeSplit(s).forEach(System.out::println);
     }*/
 
+
 }

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

@@ -880,27 +880,6 @@ public class FormulaController {
            }
            System.out.println("刷新结束");
        }
-
-      /*  String sql ="select p_key_id pkeyId ,id,old_id originId,full_name fullName,node_name nodeName  from m_wbs_tree_contract where contract_id=? and node_type in(6,4) and major_data_type in(2,3,4) AND is_deleted=0 and is_type_private_pid is null";
-        List<Map<String,Object>> listMaps=this.jdbcTemplate.queryForList(sql,contractId);
-        if(listMaps.size()>0){
-           Map<Long,List<Map<String,Object>>> group=listMaps.stream().collect(Collectors.groupingBy(m->{Object id=m.get("id");Object originId=m.get("originId");if(originId!=null){
-                        return Long.parseLong(originId.toString());
-                    }else{
-                        return Long.parseLong(id.toString());
-                    }}));
-           String sql2="select node_name nodeName,p_key_id pkeyId,id from m_wbs_tree_private where id in ("+group.keySet().stream().map(Objects::toString).collect(Collectors.joining(","))+") and project_id=?";
-           List<Map<String,Object>> privateListMap= this.jdbcTemplate.queryForList(sql2,projectId);
-           if(privateListMap.size()>0){
-               Map<Long,Long> kkm=privateListMap.stream().collect(Collectors.toMap(s->Long.parseLong(s.get("id").toString()),s->Long.parseLong(s.get("pkeyId").toString())));
-               System.out.println(kkm.size());
-               *//*{id,pkeyId}*//*
-               Set<Long> set = new HashSet<>(group.keySet());
-               set.removeAll(kkm.keySet());
-               System.out.println("剩余数量:"+set.size());
-           }
-
-        }*/
       return    R.success("成功");
     }
 

+ 22 - 118
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java

@@ -1,7 +1,6 @@
 package org.springblade.manager.controller;
 
 import cn.hutool.core.date.StopWatch;
-import cn.hutool.log.StaticLog;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -31,9 +30,7 @@ import org.springblade.manager.vo.ParamBean;
 import org.springblade.manager.vo.ParamSearch;
 import org.springblade.manager.wrapper.WbsParamWrapper;
 import org.springframework.beans.BeanUtils;
-import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.StringRedisTemplate;
-import org.springframework.data.redis.serializer.RedisSerializer;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.web.bind.annotation.*;
@@ -133,26 +130,8 @@ public class WbsParamController {
                         }
                         if (!elementMap.isEmpty()) {
                             List<Map<String, Object>> finalElementMap = elementMap;
-                           // List<Map<String,Object>> formulaIdAndKmaps=this.jdbcTemplate.queryForList("select a.id,b.k from m_formula a join m_wbs_param b on a.param_id=b.id where b.k in ("+entityList.stream().map(WbsParam::getK).collect(Collectors.joining("','","'","'"))+") AND b.type=0");
                            Map<String,Long> fkMap=this.service.formulaIdKeyMap(entityList.stream().map(WbsParam::getK).collect(Collectors.toList()));
                             entityList.forEach(e -> {
-//                                Formula formula = new Formula();
-//                                formula.setOutm(Formula.FULL);
-//                                formula.setParamId(e.getId());
-//                                Map<String, String> keyMap = new HashMap<>();
-//                                keyMap.put("name", e.getName());
-//                                keyMap.put("id", e.getId().toString());
-//                                tmpMap.put(e.getK(), keyMap);
-//                                if (RegexUtil.match(ParamElements.LEVEL_REG, e.getV().trim())) {
-//                                    /*取层级*/
-//                                    formula.setFormula("FC.tree(trees,WP[" + e.getK() + "])");
-//                                } else {
-//                                    /*直接取数*/
-//                                    formula.setFormula("WP[" + e.getK() + "]");
-//                                }
-//                                formula.setMap(JSON.toJSONString(tmpMap));
-//                                this.formulaService.save(formula);
-//                                tmpMap.clear();
                                 finalElementMap.forEach(m -> {
                                     if (StringUtils.handleNull(m.get("name")).contains(e.getName())) {
                                         ElementFormulaMapping efm = new ElementFormulaMapping();
@@ -594,128 +573,53 @@ public class WbsParamController {
         return R.fail("项目Id格式有问题");
     }
 
+    /*检查指定节点的文件提名*/
+    @GetMapping("/file-title-check")
+    public R<Object> titleCheck(Long pkeyId){
+        return R.data(this.service.createFileTitle(pkeyId));
+    }
 
     /**按合同段或者项目刷入m_wbs_tree_contract的treeCode*/
     @GetMapping("/tree-code")
     public R<Object> treeCode(Long contractId,Long projectId) {
-        StopWatch stopWatch = new StopWatch();
-        stopWatch.start("treeCode刷新");
-        Set<Long> contractIds=new HashSet<>();
-        if(projectId!=null){
-            contractIds= new HashSet<>(this.jdbcTemplate.queryForList(" select id from m_contract_info where p_id="+projectId+" and is_deleted=0 ",Long.class));
-        }else if( contractId!=null){
-            contractIds.add(contractId);
-        }
-        if(contractIds.size()>0){
-            this.treeCodeUpdate(contractIds);
-            stopWatch.stop();
-            return R.success((stopWatch.getLastTaskName()+"执行用时:"+stopWatch.getTotalTimeMillis()));
-        }
-        return R.fail("执行失败");
+        return this.service.treeCode(contractId,projectId);
     }
 
     /*把所有项目的合同段都刷新treeCode*/
     @GetMapping("/tree-code-all")
     public R<Object> treeCodeAll() {
-            return this.treeCodeUpdateProjectAllForJob();
+            return this.service.treeCodeUpdateProjectAllForJob();
     }
 
-
-
+/*每天固定时间刷新treeCode*/
     @Scheduled(cron = " 0 0 3,13 * * ?")
     public  void job(){
         System.out.println("treeCode刷新任务开始"+ LocalDateTime.now());
         if(!Optional.ofNullable(System.getProperty("os.name")).orElse(StringPool.EMPTY).equals("Linux")){
-              this.treeCodeUpdateProjectAllForJob();
+              this.service.treeCodeUpdateProjectAllForJob();
         }
     }
 
-
-    public void builder(Long id,List<String>sqlList){
-        List<Map<String,Object>> treeNodeList= this.jdbcTemplate.queryForList("select node_name name,p_key_id value, id, parent_id parentId from m_wbs_tree_contract where contract_id="+id+" and is_deleted=0 and type=1 ");
-        if(treeNodeList.size()>0){
-            Map<Long,TreeNode<Long>> treeNodeMap = new HashMap<>(treeNodeList.size()*2);
-            Long topId=null;
-            for (Map<String,Object> map:treeNodeList){
-                TreeNode<Long> treeNode = new TreeNode<>();
-                treeNode.setId(Long.parseLong(map.get("id").toString()));
-                treeNode.setParentId(Long.parseLong(map.get("parentId").toString()));
-                treeNode.setValue(Long.parseLong(map.get("value").toString()));
-                treeNode.setName(map.get("name").toString());
-                if(treeNode.getParentId().equals(0L)){
-                    topId=treeNode.getId();
-                }
-                treeNodeMap.put(treeNode.getId(),treeNode);
+    @Scheduled(fixedDelay = 30000)
+    public  void monitor(){
+        /*System.out.println("treeCode刷新检测"+ LocalDateTime.now());*/
+        try {
+            String tcu= this.redisTemplate.opsForValue().get("tcu");
+            if(Func.isNotBlank(tcu)){
+                assert tcu != null;
+                Arrays.stream(tcu.split(",")).filter(StringUtils::isNumber).distinct().forEach(id->{
+                    this.service.treeCode(Long.parseLong(id),null);
+                });
+                this.redisTemplate.delete("tcu");
             }
-            Map<Long,List<TreeNode<Long>>> group= treeNodeMap.values().stream().collect(Collectors.groupingBy(TreeNode::getParentId));
-            group.forEach((k,v)->{
-                TreeNode<Long> tmp = treeNodeMap.get(k);
-                if(tmp!=null) {
-                    tmp.setChildren(v);
-                }
-            });
-            sqlBuilder2(treeNodeMap.get(topId),sqlList,ZERO);
-        }
-    }
-
-    public void treeCodeUpdate(Set<Long> contractIds){
-        List<String>sqlList=new ArrayList<>();
-        contractIds.forEach(id->{
-            builder(id,sqlList);
-        });
-        if(sqlList.size()>0){
-            List<List<String>> sqlListSeg = BaseUtils.splitList(sqlList, 250);
-            sqlListSeg.parallelStream().forEach(sql->{
-                try {
-                    String joinSql=String.join(";",sql);
-                    this.jdbcTemplate.execute(joinSql);
-                }catch (Exception e){
-                    e.printStackTrace();
-                }
-            });
+        }catch (Exception e){
+            e.printStackTrace();
         }
-    }
 
-    /**批量任務*/
-    public R<Object> treeCodeUpdateProjectAllForJob(){
-        StopWatch stopWatch = new StopWatch();
-        stopWatch.start("全部项目treeCode刷新");
-        Set<Long>  contractIds= new HashSet<>(this.jdbcTemplate.queryForList(" select id from m_contract_info where  is_deleted=0 ",Long.class));
-        if(contractIds.size()>0){
-            this.treeCodeUpdate(contractIds);
-            stopWatch.stop();
-            return R.success((stopWatch.getLastTaskName()+"执行用时:"+stopWatch.getTotalTimeMillis()));
-        }
-        return R.fail("执行失败");
     }
 
-    static String ZERO="0";
-    public void sqlBuilder(TreeNode<Long> top, List<Object[]>paramList, String treeCode){
-            if(top!=null){
-                paramList.add(new Object[]{treeCode,top.getValue()});
-                if(top.hasChildren()){
-                     for(int i=0;i<top.getChildren().size();i++){
-                         TreeNode<Long> child=top.getChildren().get(i);
-                         int base=ZERO.equals(treeCode)?100:1000;
-                         sqlBuilder(child,paramList,treeCode+String.valueOf(base+i).substring(1));
-                     }
-                }
-            }
 
-    }
-    public void sqlBuilder2(TreeNode<Long> top, List<String>sqlList, String treeCode){
-        if(top!=null){
-            sqlList.add("update m_wbs_tree_contract set tree_code ='"+treeCode+"' where p_key_id="+top.getValue());
-            if(top.hasChildren()){
-                for(int i=0;i<top.getChildren().size();i++){
-                    TreeNode<Long> child=top.getChildren().get(i);
-                    int base=ZERO.equals(treeCode)?100:1000;
-                    sqlBuilder2(child,sqlList,treeCode+String.valueOf(base+i).substring(1));
-                }
-            }
-        }
 
-    }
 
 
 

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

@@ -25,8 +25,11 @@ import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.web.bind.annotation.RequestHeader;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
 import java.io.File;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -124,7 +127,7 @@ public class ExcelTabClientImpl implements ExcelTabClient {
     }
 
     @Override
-    public R synPDFInfo(String contractId, String nodeIds, String classify, String projectId) throws Exception {
+    public R synPDFInfo(String contractId, String nodeIds, String classify, String projectId, String authorization) throws Exception {
         return excelTabController.synPDFInfo(contractId, nodeIds, classify, projectId);
     }
 

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ITurnPointCalculator.java

@@ -19,6 +19,7 @@ import static org.springblade.manager.formula.TurnPoint.*;
 public interface ITurnPointCalculator {
     Long VERSION=202310121730L;
      String ZD_REG="(?i)zd\\d+";
+     /*核心计算*/
     static List<TurnPoint> create(List<Map<String, Object>> data, LinkedHashMap<String, String> configMap,LevelInfo levelInfo) {
         /*1.验证数据的合理性,如果已经合理则不需要计算
         * 2.尝试补充数据,如果不合理则重新生成转点,并用正尺方式生成

+ 9 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/LevelInfo.java

@@ -56,6 +56,8 @@ public class LevelInfo implements  Cloneable {
 
     /**测量数据是否可推导*/
     private boolean persist=false;
+    /**是否开启距离转点模式,宝北项目隧道一个仪高点只能测量两百米范围的测点,超过就必须进行转点,所有需要配合桩号距离判断*/
+    private boolean distance=false;
 
     public Double getBmdSj() {
         return bmdSj;
@@ -178,4 +180,11 @@ public class LevelInfo implements  Cloneable {
            this.closeZd=new ArrayList<>();
     }
 
+    public boolean isDistance() {
+        return distance;
+    }
+
+    public void setDistance(boolean distance) {
+        this.distance = distance;
+    }
 }

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

@@ -1,6 +1,7 @@
 package org.springblade.manager.service;
 
 import org.springblade.core.mp.base.BaseService;
+import org.springblade.core.tool.api.R;
 import org.springblade.manager.entity.Formula;
 import org.springblade.manager.entity.WbsParam;
 import org.springblade.manager.entity.WbsTreeContract;
@@ -8,6 +9,7 @@ import org.springblade.manager.entity.WbsTreeContract;
 import javax.validation.constraints.NotNull;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * @author yangyj
@@ -40,5 +42,12 @@ public interface IWbsParamService extends BaseService<WbsParam> {
     Map<String,Long> formulaIdKeyMap(List<String> ks);
     /**指定key的formulaId映射*/
     Long formulaId(String k);
+    /**指定key的formulaId映射*/
     Map<String, Formula> formulaKeyMap(List<String> ks);
+    /**根据合同段集合刷新*/
+     void treeCodeUpdate(Set<Long> contractIds);
+    /**全部项目刷新*/
+     R<Object> treeCodeUpdateProjectAllForJob();
+    /**指定合同段或者项目 ,合同段id,projectId项目id , R<Object> 返回信息*/
+     R<Object> treeCode(Long contractId,Long projectId);
 }

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

@@ -1915,7 +1915,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     contractId = wbsTreeContract.getContractId();
                 }
             }
-            String sql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "' , sort = " + sort + " where classify='" + classify + "' and  wbs_id='" + nodeId + "' and contract_id ='" + contractId + "' ";
+            String sql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "' , sort = " + sort +",e_visa_pdf_url = null" +" where classify='" + classify + "' and  wbs_id='" + nodeId + "' and contract_id ='" + contractId + "' ";
             jdbcTemplate.execute(sql);
         }
     }

+ 142 - 14
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java

@@ -4,13 +4,16 @@ import cn.hutool.core.date.StopWatch;
 import cn.hutool.log.StaticLog;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.mixsmart.utils.CustomFunction;
+import com.mixsmart.utils.FormulaUtils;
 import com.mixsmart.utils.StringUtils;
 import lombok.AllArgsConstructor;
 import org.springblade.common.utils.BaseUtils;
 import org.springblade.core.mp.base.BaseEntity;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.dto.TreeNode;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.mapper.WbsParamMapper;
 import org.springblade.manager.service.IElementFormulaMappingService;
@@ -82,22 +85,38 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
         WbsTreeContract one = this.treeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, pkeyId));
         if (one != null) {
             List<WbsTreeContract> list = new ArrayList<>();
-            list.add(one);
-            int max = 20;
-            int loop = 0;
-            String parentId = one.getParentId().toString();
-            while (loop < max && StringUtils.isNotEquals(0, parentId)) {
-                WbsTreeContract next = this.treeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getContractId, one.getContractId()).eq(WbsTreeContract::getId, parentId));
-                if(next!=null) {
-                    parentId = next.getParentId().toString();
-                    list.add(next);
-                    loop++;
-                }else{
-                    loop=max;
+            if(Func.isNotBlank(one.getTreeCode())){
+                List<String> treeCodes= FormulaUtils.treeCodeSplit(one.getTreeCode());
+                treeCodes.remove(0);
+                List<WbsTreeContract> chains = this.treeContractService.list(Wrappers.<WbsTreeContract>lambdaQuery().in(WbsTreeContract::getTreeCode,treeCodes).eq(WbsTreeContract::getContractId,one.getContractId()));
+                Long parentId=one.getParentId();
+                Collections.reverse(chains);
+                for(WbsTreeContract t:chains){
+                    /*由于treeCode的刷新时效性,还需要筛选*/
+                    if(t.getId().equals(parentId)){
+                        list.add(t);
+                        parentId=t.getParentId();
+                    }
+                }
+                list.add(one);
+            }else {
+                list.add(one);
+                int max = 20;
+                int loop = 0;
+                String parentId = one.getParentId().toString();
+                while (loop < max && StringUtils.isNotEquals(0, parentId)) {
+                    WbsTreeContract next = this.treeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getContractId, one.getContractId()).eq(WbsTreeContract::getId, parentId));
+                    if (next != null) {
+                        parentId = next.getParentId().toString();
+                        list.add(next);
+                        loop++;
+                    } else {
+                        loop = max;
+                    }
                 }
+                Collections.reverse(list);
+                list.remove(0);
             }
-            Collections.reverse(list);
-            list.remove(0);
             return list;
         }
         return new ArrayList<>();
@@ -265,6 +284,115 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
         }
         return result;
     }
+
+    public void builder(Long id,List<String>sqlList){
+        List<Map<String,Object>> treeNodeList= this.jdbcTemplate.queryForList("select node_name name,p_key_id value, id, parent_id parentId from m_wbs_tree_contract where contract_id="+id+" and is_deleted=0 and type=1 ");
+        if(treeNodeList.size()>0){
+            Map<Long, TreeNode<Long>> treeNodeMap = new HashMap<>(treeNodeList.size()*2);
+            Long topId=null;
+            for (Map<String,Object> map:treeNodeList){
+                TreeNode<Long> treeNode = new TreeNode<>();
+                treeNode.setId(Long.parseLong(map.get("id").toString()));
+                treeNode.setParentId(Long.parseLong(map.get("parentId").toString()));
+                treeNode.setValue(Long.parseLong(map.get("value").toString()));
+                treeNode.setName(map.get("name").toString());
+                if(treeNode.getParentId().equals(0L)){
+                    topId=treeNode.getId();
+                }
+                treeNodeMap.put(treeNode.getId(),treeNode);
+            }
+            Map<Long,List<TreeNode<Long>>> group= treeNodeMap.values().stream().collect(Collectors.groupingBy(TreeNode::getParentId));
+            group.forEach((k,v)->{
+                TreeNode<Long> tmp = treeNodeMap.get(k);
+                if(tmp!=null) {
+                    tmp.setChildren(v);
+                }
+            });
+            sqlBuilder2(treeNodeMap.get(topId),sqlList,ZERO);
+        }
+    }
+
+    @Override
+    public void treeCodeUpdate(Set<Long> contractIds){
+        List<String>sqlList=new ArrayList<>();
+        contractIds.forEach(id->{
+            try {
+                builder(id, sqlList);
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+        });
+        if(sqlList.size()>0){
+            List<List<String>> sqlListSeg = BaseUtils.splitList(sqlList, 250);
+            sqlListSeg.parallelStream().forEach(sql->{
+                try {
+                    String joinSql=String.join(";",sql);
+                    this.jdbcTemplate.execute(joinSql);
+                }catch (Exception e){
+                    e.printStackTrace();
+                }
+            });
+        }
+    }
+
+    /**刷新所有有效合同段treeCode*/
+    @Override
+    public R<Object> treeCodeUpdateProjectAllForJob(){
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start("全部项目treeCode刷新");
+        Set<Long>  contractIds= new HashSet<>(this.jdbcTemplate.queryForList(" select id from m_contract_info where  is_deleted=0 ",Long.class));
+        if(contractIds.size()>0){
+            this.treeCodeUpdate(contractIds);
+            stopWatch.stop();
+            return R.success((stopWatch.getLastTaskName()+"执行用时:"+stopWatch.getTotalTimeMillis()));
+        }
+        return R.fail("执行失败");
+    }
+
+    static String ZERO="0";
+    public void sqlBuilder(TreeNode<Long> top, List<Object[]>paramList, String treeCode){
+        if(top!=null){
+            paramList.add(new Object[]{treeCode,top.getValue()});
+            if(top.hasChildren()){
+                for(int i=0;i<top.getChildren().size();i++){
+                    TreeNode<Long> child=top.getChildren().get(i);
+                    int base=ZERO.equals(treeCode)?100:1000;
+                    sqlBuilder(child,paramList,treeCode+String.valueOf(base+i).substring(1));
+                }
+            }
+        }
+    }
+    public void sqlBuilder2(TreeNode<Long> top, List<String>sqlList, String treeCode){
+        if(top!=null){
+            sqlList.add("update m_wbs_tree_contract set tree_code ='"+treeCode+"' where p_key_id="+top.getValue());
+            if(top.hasChildren()){
+                for(int i=0;i<top.getChildren().size();i++){
+                    TreeNode<Long> child=top.getChildren().get(i);
+                    int base=ZERO.equals(treeCode)?100:1000;
+                    sqlBuilder2(child,sqlList,treeCode+String.valueOf(base+i).substring(1));
+                }
+            }
+        }
+
+    }
+    @Override
+    public R<Object> treeCode(Long contractId,Long projectId) {
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start("treeCode刷新");
+        Set<Long> contractIds=new HashSet<>();
+        if(projectId!=null){
+            contractIds= new HashSet<>(this.jdbcTemplate.queryForList(" select id from m_contract_info where p_id="+projectId+" and is_deleted=0 ",Long.class));
+        }else if( contractId!=null){
+            contractIds.add(contractId);
+        }
+        if(contractIds.size()>0){
+            this.treeCodeUpdate(contractIds);
+            stopWatch.stop();
+            return R.success((stopWatch.getLastTaskName()+"执行用时:"+stopWatch.getTotalTimeMillis()));
+        }
+        return R.fail("执行失败");
+    }
+
 }