Browse Source

Merge branch 'master' of http://47.110.251.215:3000/java_org/bladex

huangtf 2 years ago
parent
commit
07c8c9bcec

+ 4 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExaminingReport.java

@@ -24,6 +24,10 @@ public class ArchiveExaminingReport extends BaseEntity {
     @ApiModelProperty(value = "检测文档PDF路径")
     @ApiModelProperty(value = "检测文档PDF路径")
     private String reportPdfUrl;
     private String reportPdfUrl;
 
 
+    //状态为0代表详情还没开始
+    @ApiModelProperty(value = "文档详情状态")
+    private Integer reportDetailStatus;
+
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "检测时间")
     @ApiModelProperty(value = "检测时间")
     private LocalDateTime examiningTime;
     private LocalDateTime examiningTime;

+ 6 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java

@@ -81,6 +81,11 @@ public interface ArchiveFileClient {
     @PostMapping(API_PREFIX + "/batchDeleteArchiveFile")
     @PostMapping(API_PREFIX + "/batchDeleteArchiveFile")
     void batchDeleteArchiveFile(@RequestBody List<Long> ids);
     void batchDeleteArchiveFile(@RequestBody List<Long> ids);
 
 
+    /**
+     * 获取节点下未归档的文件
+     * @param nodeId
+     * @return
+     */
     @PostMapping(API_PREFIX + "/getListByNodeID")
     @PostMapping(API_PREFIX + "/getListByNodeID")
-    List<ArchiveFile> getListByNodeID(@RequestParam String nodeId,@RequestParam Integer isArchive);
+    List<ArchiveFile> getListByNodeID(@RequestParam String nodeId);
 }
 }

+ 18 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -17,6 +17,8 @@
 package org.springblade.archive.controller;
 package org.springblade.archive.controller;
 
 
 import cn.hutool.core.text.split.SplitIter;
 import cn.hutool.core.text.split.SplitIter;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import io.swagger.annotations.*;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
@@ -29,6 +31,8 @@ import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.feign.ArchiveTreeContractClient;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -41,6 +45,7 @@ import org.springblade.core.boot.ctrl.BladeController;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 
 /**
 /**
  *  控制器
  *  控制器
@@ -57,6 +62,7 @@ public class ArchivesAutoController extends BladeController {
 	private final IArchivesAutoService archivesAutoService;
 	private final IArchivesAutoService archivesAutoService;
 
 
 	private final IArchiveAutoPdfService archiveAutoPdfService;
 	private final IArchiveAutoPdfService archiveAutoPdfService;
+	private final ArchiveTreeContractClient archiveTreeContractClient;
 
 
 	/**
 	/**
 	 * 详情
 	 * 详情
@@ -87,8 +93,18 @@ public class ArchivesAutoController extends BladeController {
 	@GetMapping("/page")
 	@GetMapping("/page")
 	@ApiOperationSupport(order = 3)
 	@ApiOperationSupport(order = 3)
 	@ApiOperation(value = "分页", notes = "传入archivesAuto")
 	@ApiOperation(value = "分页", notes = "传入archivesAuto")
-	public R<IPage<ArchivesAutoVO>> page(ArchivesAutoVO archivesAuto, Query query) {
-		IPage<ArchivesAutoVO> pages = archivesAutoService.selectArchivesAutoPage(Condition.getPage(query), archivesAuto);
+	public R<IPage<ArchivesAutoVO>> page(ArchivesAutoVO queryVo, Query query) {
+//		IPage<ArchivesAutoVO> pages = archivesAutoService.selectArchivesAutoPage(Condition.getPage(query), archivesAuto);
+		if(queryVo.getNodeIds() == null || queryVo.getNodeIds().equals("")){
+			return  R.data(null);
+		}
+		List<ArchiveTreeContract> archiveTreeContracts = this.archiveTreeContractClient.queryAllChildByAncestors(queryVo.getNodeIds());
+		if(archiveTreeContracts != null && archiveTreeContracts.size() > 0){
+			List<String> ids = JSONArray.parseArray(JSONObject.toJSONString(archiveTreeContracts.stream().map(ArchiveTreeContract::getId).distinct().collect(Collectors.toList())), String.class);
+			ids.add(queryVo.getNodeIds());
+			queryVo.setNodeIdArray(ids);
+		}
+		IPage<ArchivesAutoVO> pages = archivesAutoService.selectArchivesAutoFilePage(queryVo);
 		return R.data(pages);
 		return R.data(pages);
 	}
 	}
 
 

+ 17 - 15
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExaminingReportImpl.java

@@ -56,29 +56,23 @@ public class ArchiveExaminingReportImpl extends BaseServiceImpl<ArchiveExamining
     @Async
     @Async
     @Override
     @Override
     public void pushStatusBySocket(Long userId,Long id) throws IOException, InterruptedException {
     public void pushStatusBySocket(Long userId,Long id) throws IOException, InterruptedException {
-        Integer status=1;
-        Date date = new Date();
+        Integer statusR = 1;
+        Integer statusD = 0;
         //获取检测状态,如果正在检测,则数据变化时发送
         //获取检测状态,如果正在检测,则数据变化时发送
         do {
         do {
             Thread.sleep(4000L);
             Thread.sleep(4000L);
             //判断报告状态
             //判断报告状态
             ArchiveExaminingReport report = this.getById(id);
             ArchiveExaminingReport report = this.getById(id);
             Integer reportStatus = report.getStatus();
             Integer reportStatus = report.getStatus();
+            Integer detailStatus = report.getReportDetailStatus();
             //判断详情状态
             //判断详情状态
-            ArchiveExaminingReportDetail detail = detailService.getOne(new LambdaQueryWrapper<ArchiveExaminingReportDetail>()
-                    .eq(ArchiveExaminingReportDetail::getReportId, id)
-                    .orderByDesc(ArchiveExaminingReportDetail::getCreateTime)
-                    .last("limit 1"));
-            if (detail == null){
-                detail = new ArchiveExaminingReportDetail();
-                detail.setCreateTime(date);
-            }
-            if (reportStatus != status || detail.getCreateTime() != date){
+
+            if (reportStatus != statusR || detailStatus != statusD){
                 webSocketServer.sendMessagesToArchive(userId+"","true");
                 webSocketServer.sendMessagesToArchive(userId+"","true");
-                status = reportStatus;
-                date = detail.getCreateTime();
+                statusR = reportStatus;
+                statusD = detailStatus;
             }
             }
-        }while (status != 4);
+        }while (statusR != 4);
 
 
     }
     }
 
 
@@ -121,6 +115,8 @@ public class ArchiveExaminingReportImpl extends BaseServiceImpl<ArchiveExamining
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对电子档案封装包规范性检测", 0, "无", 0));
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对电子档案封装包规范性检测", 0, "无", 0));
             detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
             detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_AUTHENTICITY,
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对电子档案封装包电子前面有效性检测", 0, "无", 0));
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对电子档案封装包电子前面有效性检测", 0, "无", 0));
+            report.setReportDetailStatus(1);
+            this.updateById(report);
         }
         }
         if (StringUtils.isNotBlank(vo.getIntegrality()) && "1".equals(vo.getIntegrality())) {
         if (StringUtils.isNotBlank(vo.getIntegrality()) && "1".equals(vo.getIntegrality())) {
             Thread.sleep(5000L);
             Thread.sleep(5000L);
@@ -147,6 +143,8 @@ public class ArchiveExaminingReportImpl extends BaseServiceImpl<ArchiveExamining
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对信息包元数据完整性检测", 0, "无", 0));
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对信息包元数据完整性检测", 0, "无", 0));
             detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
             detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_INTEGRALITY,
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对信息包内容数据完整性检测", 0, "无", 0));
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对信息包内容数据完整性检测", 0, "无", 0));
+            report.setReportDetailStatus(2);
+            this.updateById(report);
         }
         }
             //可用性
             //可用性
         if (StringUtils.isNotBlank(vo.getUsability()) && "1".equals(vo.getUsability())) {
         if (StringUtils.isNotBlank(vo.getUsability()) && "1".equals(vo.getUsability())) {
@@ -167,6 +165,8 @@ public class ArchiveExaminingReportImpl extends BaseServiceImpl<ArchiveExamining
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对信息包中包含的内容数据格式合规性检测", 0, "无", 0));
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对信息包中包含的内容数据格式合规性检测", 0, "无", 0));
             detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
             detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_USABILITY,
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对备份数据可恢复性检测", 0, "无", 0));
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对备份数据可恢复性检测", 0, "无", 0));
+            report.setReportDetailStatus(3);
+            this.updateById(report);
         }
         }
             //安全性
             //安全性
         if (StringUtils.isNotBlank(vo.getSecurity()) && "1".equals(vo.getSecurity())) {
         if (StringUtils.isNotBlank(vo.getSecurity()) && "1".equals(vo.getSecurity())) {
@@ -175,12 +175,14 @@ public class ArchiveExaminingReportImpl extends BaseServiceImpl<ArchiveExamining
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对系统环境中是否安装杀毒软件检测", 0, "无", 0));
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对系统环境中是否安装杀毒软件检测", 0, "无", 0));
             detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_SECURITY,
             detailService.save(new ArchiveExaminingReportDetail(vo.getProjectId(), id, ArchiveConstant.ARCHIVE_EXAMINING_SECURITY,
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对病毒感染检测", 0, "无", 0));
                     ArchiveConstant.ARCHIVE_EXAMINING_STANDARD + "对病毒感染检测", 0, "无", 0));
+            report.setReportDetailStatus(4);
+            this.updateById(report);
         }
         }
         //生成报告,生成PDF
         //生成报告,生成PDF
         report.setStatus(3);
         report.setStatus(3);
         this.updateById(report);
         this.updateById(report);
         String url = this.generateReportPdf(id);
         String url = this.generateReportPdf(id);
-        Thread.sleep(3000L);
+        Thread.sleep(5000L);
         //完成
         //完成
         report.setReportPdfUrl(url);
         report.setReportPdfUrl(url);
         report.setStatus(4);
         report.setStatus(4);

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

@@ -663,7 +663,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			int specification = Integer.parseInt(specificationStr);
 			int specification = Integer.parseInt(specificationStr);
 			int specificationSize=specification*10;
 			int specificationSize=specification*10;
 			//步骤3:查询节点下的未组卷文件
 			//步骤3:查询节点下的未组卷文件
-			List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString(),0);
+			List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString());
 			//步骤4:遍历未归档文件
 			//步骤4:遍历未归档文件
 			//待组卷文件集合
 			//待组卷文件集合
 			List<ArchiveFile> waitArchiveFiles = new ArrayList<>();
 			List<ArchiveFile> waitArchiveFiles = new ArrayList<>();
@@ -758,7 +758,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			//根据分组ID来创建唯一案卷
 			//根据分组ID来创建唯一案卷
 			Long archiveAutoGroupId=node.getArchiveAutoGroupId();
 			Long archiveAutoGroupId=node.getArchiveAutoGroupId();
 			//步骤2:查询节点下的未归档文件
 			//步骤2:查询节点下的未归档文件
-			List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString(),0);
+			List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString());
 			//步骤3:遍历未归档文件
 			//步骤3:遍历未归档文件
 			if(archiveFiles!=null){
 			if(archiveFiles!=null){
 				for(ArchiveFile file:archiveFiles){
 				for(ArchiveFile file:archiveFiles){
@@ -843,7 +843,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			}
 			}
 
 
 			//步骤3.2:查询出当前节点未组卷的文件
 			//步骤3.2:查询出当前节点未组卷的文件
-			List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString(),0);
+			List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString());
 			//步骤3.3:遍历未组卷文件
 			//步骤3.3:遍历未组卷文件
 			int archiveFilesSize=0;
 			int archiveFilesSize=0;
 			for(ArchiveFile file:archiveFiles){
 			for(ArchiveFile file:archiveFiles){

+ 2 - 2
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java

@@ -203,8 +203,8 @@ public class ArchiveFileClientImpl implements ArchiveFileClient {
     }
     }
 
 
     @Override
     @Override
-    public List<ArchiveFile> getListByNodeID(String nodeId,Integer isArchive) {
-        List<ArchiveFile> files = fileMapper.getListByNodeID(nodeId, isArchive);
+    public List<ArchiveFile> getListByNodeID(String nodeId) {
+        List<ArchiveFile> files = fileMapper.getListByNodeID(nodeId);
         return files;
         return files;
     }
     }
 
 

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

@@ -75,5 +75,5 @@ public interface ArchiveFileMapper extends BaseMapper<ArchiveFile> {
 
 
     List<ArchiveFile> getAllArchiveFileByArchiveIds(@Param("ids") List<String> ids);
     List<ArchiveFile> getAllArchiveFileByArchiveIds(@Param("ids") List<String> ids);
 
 
-	public List<ArchiveFile> getListByNodeID(@Param("nodeId") String nodeId,@Param("isArchive")Integer isArchive);
+	public List<ArchiveFile> getListByNodeID(@Param("nodeId") String nodeId);
 }
 }

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

@@ -112,6 +112,9 @@
         <if test="vo.contractId != null and vo.contractId != ''">
         <if test="vo.contractId != null and vo.contractId != ''">
             and contract_id = #{vo.contractId}
             and contract_id = #{vo.contractId}
         </if>
         </if>
+        <if test="vo.archive_id != null and vo.archive_id != ''">
+            and archive_id = #{vo.archive_id}
+        </if>
         <if test="vo.nodeIds != null and vo.nodeIds != ''">
         <if test="vo.nodeIds != null and vo.nodeIds != ''">
             and node_id in
             and node_id in
             <foreach collection="vo.nodeIdArray" item="nodeId" open="(" separator="," close=")">
             <foreach collection="vo.nodeIdArray" item="nodeId" open="(" separator="," close=")">
@@ -302,7 +305,7 @@
         select * from u_archive_file
         select * from u_archive_file
         where
         where
           node_id = #{nodeId} and
           node_id = #{nodeId} and
-          is_archive = #{isArchive} and
+          ( is_archive = 0 OR is_archive IS NULL )  and
           is_deleted = 0
           is_deleted = 0
           order by sort
           order by sort
     </select>
     </select>

+ 28 - 5
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -323,13 +323,36 @@ public class FormulaUtils {
     }
     }
 
 
     /**从元素名称中解析项目名称*/
     /**从元素名称中解析项目名称*/
-    public static final  Set<String> EX_WORD=new HashSet<String>(){{add("或");}};
     public static  String parseItemName(String eName){
     public static  String parseItemName(String eName){
-        String[] candidate= StringUtils.handleNull(eName).replaceAll("[\\t\\n\\s+]","").split("[((_]");
-        if(candidate.length>0){
-            return Arrays.stream(candidate).map(s->s.replaceAll("[^\\u4e00-\\u9fa5]+","").replaceAll("(在合格标准内|满足设计要求|质量评定|评定|判定|项目|总数|抽测|实测|偏差|设计|合格)[率值]?","")).filter(s->!EX_WORD.contains(s)&&StringUtils.isNotEmpty(s)).collect(Collectors.joining());
+        if (StringUtils.isEmpty(eName)) {
+            return eName;
         }
         }
-        return eName;
+
+        String str = eName.replaceAll("\\s", "");
+        Pattern pattern = Pattern.compile("[((_]");
+        String[] candidate = pattern.split(str);
+
+        String regex = "[^\\u4e00-\\u9fa5]+";
+        Pattern p = Pattern.compile(regex);
+
+        return Arrays.stream(candidate)
+                .map(s -> filterString(s, p))
+                .filter(s -> !isContainKeywords(s))
+                .collect(Collectors.joining());
+    }
+
+    private static String filterString(String s, Pattern p) {
+        Matcher matcher = p.matcher(s);
+        return matcher.replaceAll("").replaceAll(getRegex(), "");
+    }
+    private static String getRegex() {
+        return "(在合格标准内|满足设计要求|质量评定|评定|判定|项目|总数|抽测|实测|偏差|设计|合格)[率值]?";
+    }
+
+
+    private static boolean isContainKeywords(String s) {
+        List<String> keywords = Arrays.asList("或", "每", "个");
+        return keywords.stream().anyMatch(s::contains);
     }
     }
 
 
     public static byte[] compress(String data) throws IOException {
     public static byte[] compress(String data) throws IOException {

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

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.mixsmart.utils.CustomFunction;
 import com.mixsmart.utils.CustomFunction;
+import com.mixsmart.utils.FormulaUtils;
 import com.mixsmart.utils.ListUtils;
 import com.mixsmart.utils.ListUtils;
 import com.mixsmart.utils.StringUtils;
 import com.mixsmart.utils.StringUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
@@ -25,6 +26,7 @@ import org.springblade.manager.entity.*;
 import org.springblade.manager.formula.KeyMapper;
 import org.springblade.manager.formula.KeyMapper;
 import org.springblade.manager.service.*;
 import org.springblade.manager.service.*;
 import org.springblade.manager.service.impl.FormulaServiceImpl;
 import org.springblade.manager.service.impl.FormulaServiceImpl;
+import org.springblade.manager.vo.AppWbsTreeContractVO;
 import org.springblade.manager.wrapper.FormulaWrapper;
 import org.springblade.manager.wrapper.FormulaWrapper;
 import org.springframework.dao.EmptyResultDataAccessException;
 import org.springframework.dao.EmptyResultDataAccessException;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -53,7 +55,6 @@ public class FormulaController {
     private final IContractInfoService contractInfoService;
     private final IContractInfoService contractInfoService;
     private final ITextdictInfoService textdictInfoService;
     private final ITextdictInfoService textdictInfoService;
     private final IFormulaOptionService formulaOptionService;
     private final IFormulaOptionService formulaOptionService;
-
     // 合同段服务-
     // 合同段服务-
     private final IWbsTreeContractService wbsTreeContractService;
     private final IWbsTreeContractService wbsTreeContractService;
     /**
     /**
@@ -427,5 +428,50 @@ public class FormulaController {
 
 
 
 
 
 
+    @GetMapping("/tracing")
+    @ApiOperationSupport(order = 10)
+    public R<Object> tracing(Long pkeyId){
+       WbsTreeContract one= this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId,pkeyId));
+       if(one!=null){
+         List<String> list = new ArrayList<>();
+         list.add(Func.isNotBlank(one.getFullName())?one.getFullName():one.getNodeName());
+         int max=20;
+         int loop=0;
+         String parentId= one.getParentId().toString();
+         while (loop<max&&StringUtils.isNotEquals(0,parentId)){
+             WbsTreeContract next= this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getContractId,one.getContractId()).eq(WbsTreeContract::getId,parentId));
+             parentId=next.getParentId().toString();
+             list.add(Func.isNotBlank(next.getNodeName())?next.getNodeName():next.getFullName());
+             loop++;
+         }
+         ContractInfo info=  contractInfoService.getById(one.getContractId());
+         Collections.reverse(list);
+         list.set(0,info.getContractName());
+           final String[] indent = {"-"};
+           String result = list.stream()
+                   .map(item -> {
+                       String line = indent[0] + item;
+                       indent[0] += "  ";
+                       return line;
+                   })
+                   .collect(Collectors.joining("\n"));
+           System.out.println(result);
+         return R.data(result);
+       }
+        return R.fail("无数据");
+    }
+
+
+    @GetMapping("/item-matching")
+    @ApiOperationSupport(order = 10)
+    public R<Object> matching(String tableName ,String search){
+            String sql="select a.tab_ch_name tb,b.e_name en,b.id,b.e_key ek from m_table_info a join m_wbs_form_element b on b.f_id=a.id where b.is_deleted=0 and a.tab_en_name=? and b.e_name like ?";
+            List<Map<String,Object>> result = this.jdbcTemplate.queryForList(sql, tableName,"%"+search+"%");
+            Map<String,Object> map = new HashMap<>();
+            map.put("解析前", result.stream().map(e-> StringUtils.handleNull(e.get("en"))).collect(Collectors.toList()));
+            map.put("解析后", result.stream().map(e-> FormulaUtils.parseItemName(StringUtils.handleNull(e.get("en")))).collect(Collectors.toList()));
+            return R.data(map);
+    }
+
 
 
 }
 }

+ 25 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -123,7 +123,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         CurrentNode one=this.tec.getCurrentNode();
         CurrentNode one=this.tec.getCurrentNode();
         Long id =one.getId();
         Long id =one.getId();
         Long primaryKeyId=one.getPkId();
         Long primaryKeyId=one.getPkId();
-//        tec.constantMap=tec.getConstantMap();
         tec.formDataList=list;
         tec.formDataList=list;
         tec.constantMap.put("contractId",contractId);
         tec.constantMap.put("contractId",contractId);
         keyWord(tec.constantMap);
         keyWord(tec.constantMap);
@@ -193,19 +192,37 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     }
     }
 
 
     public  FormulaDataBlock findFdb(){
     public  FormulaDataBlock findFdb(){
-        AppWbsTreeContractVO one =tec.getTableAll().get(0);
-        List<String> ancestor=new ArrayList<>(Arrays.asList(one.getAncestors().split(",")));
-        Collections.reverse(ancestor);
-        FormulaDataBlock fdb=  this.formulaDataBlockService.queryOption(Long.parseLong(one.getContractId()),Long.parseLong(ancestor.get(1)),0);
+        /*查找第一个包含分项评定子节点的父节点*/
+        Long ancestor=findFirstParentId();
+        FormulaDataBlock fdb=  this.formulaDataBlockService.queryOption(tec.getContractId(),ancestor,0);
         if(fdb==null){
         if(fdb==null){
             fdb=new FormulaDataBlock();
             fdb=new FormulaDataBlock();
             fdb.setContractId(tec.getContractId());
             fdb.setContractId(tec.getContractId());
-            fdb.setSwId(Long.parseLong(ancestor.get(1)));
+            fdb.setSwId(ancestor);
             fdb.setType(0);
             fdb.setType(0);
             fdb.setVal("[]");
             fdb.setVal("[]");
         }
         }
         return fdb;
         return fdb;
     }
     }
+
+    public Long findFirstParentId(){
+        int max=10;
+        int loop=0;
+        Long parentId= tec.getCurrentNode().getParentId();
+        while (loop<max&&StringUtils.isNotEquals(0,parentId)){
+            List<WbsTreeContract> list= this.wbsTreeContractService.list(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getContractId,tec.getContractId()).eq(WbsTreeContract::getParentId,parentId));
+            if(list.stream().anyMatch(e->StringUtils.isEquals(2,e.getMajorDataType()))){
+                loop=10;
+            }else{
+                /*往上一层找*/
+                WbsTreeContract next= this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getContractId,tec.getContractId()).eq(WbsTreeContract::getId,parentId));
+                parentId=next.getParentId();
+            }
+            loop++;
+        }
+        return parentId;
+    }
+
     public void assessmentForm(){
     public void assessmentForm(){
         if(tec.getTableAll().stream().anyMatch(e->StringUtils.isEquals(e.getTableType(),5))){
         if(tec.getTableAll().stream().anyMatch(e->StringUtils.isEquals(e.getTableType(),5))){
             /*评定节点*/
             /*评定节点*/
@@ -217,11 +234,13 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     String eName=e.getEName();
                     String eName=e.getEName();
                     if(eName.contains("实测")&&!eName.contains("平均")&&!eName.contains("率")&&!eName.contains("判")){
                     if(eName.contains("实测")&&!eName.contains("平均")&&!eName.contains("率")&&!eName.contains("判")){
                         String point  =FormulaUtils.parseItemName(eName);
                         String point  =FormulaUtils.parseItemName(eName);
+                        /*评定匹配检验单的元素用相似匹配*/
                         Measurement measurement = itemsMap.computeIfAbsent(point,k->new Measurement(point));
                         Measurement measurement = itemsMap.computeIfAbsent(point,k->new Measurement(point));
                         measurement.setValue(e);
                         measurement.setValue(e);
                     }
                     }
                 });
                 });
                 if(itemsMap.size()>0){
                 if(itemsMap.size()>0){
+                    /*表内用同行匹配*/
                     tec.getFormDataMap().values().stream()
                     tec.getFormDataMap().values().stream()
                             .filter(v -> v.getEName().contains("率") || v.getEName().contains("判"))
                             .filter(v -> v.getEName().contains("率") || v.getEName().contains("判"))
                             .forEach(v -> {
                             .forEach(v -> {