Переглянути джерело

性能验证-报告归档树-查询方式优化

ZhuJiaHao 4 місяців тому
батько
коміт
f623fcd869

+ 5 - 0
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/components/pv/api/IExperimentalService.java

@@ -3,6 +3,7 @@ package com.lc.ibps.components.pv.api;
 import java.util.List;
 import java.util.Map;
 
+import com.lc.ibps.components.pv.persistence.entity.ExperimentalTreeNode;
 import org.hibernate.validator.constraints.NotBlank;
 import org.hibernate.validator.constraints.NotEmpty;
 import org.springframework.validation.annotation.Validated;
@@ -94,4 +95,8 @@ public interface IExperimentalService {
 															   @RequestParam(required = false) String name2,
 															   @RequestParam(required = false) String name3,
 															   @RequestParam(required = false) String name4);
+
+
+	@RequestMapping(value = "/getAllArchiveTree", method = { RequestMethod.GET })
+	public APIResult<List<ExperimentalTreeNode>> getAllArchiveTree();
 }

+ 108 - 0
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/components/pv/persistence/entity/ExperimentalDataDTO.java

@@ -0,0 +1,108 @@
+package com.lc.ibps.components.pv.persistence.entity;
+
+public class ExperimentalDataDTO {
+
+    /**
+     * 主键ID
+     */
+    private String id;
+
+    /**
+     * 结束时间(用于提取年份)
+     */
+    private String jieShuShiJian;
+
+    /**
+     * 编制部门ID
+     */
+    private String bianZhiBuMen;
+
+    /**
+     * 实验项目
+     */
+    private String shiYanXiangMu;
+
+    /**
+     * 实验仪器
+     */
+    private String shiYanYiQi;
+
+    /**
+     * 方案类型
+     */
+    private String fangAnLeiXing;
+
+    /**
+     * 流程审批
+     */
+    private String liuChengShenPi;
+
+    public ExperimentalDataDTO(String id, String jieShuShiJian, String bianZhiBuMen, String shiYanXiangMu, String shiYanYiQi, String fangAnLeiXing, String liuChengShenPi) {
+        this.id = id;
+        this.jieShuShiJian = jieShuShiJian;
+        this.bianZhiBuMen = bianZhiBuMen;
+        this.shiYanXiangMu = shiYanXiangMu;
+        this.shiYanYiQi = shiYanYiQi;
+        this.fangAnLeiXing = fangAnLeiXing;
+        this.liuChengShenPi = liuChengShenPi;
+    }
+
+    public ExperimentalDataDTO() {
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getJieShuShiJian() {
+        return jieShuShiJian;
+    }
+
+    public void setJieShuShiJian(String jieShuShiJian) {
+        this.jieShuShiJian = jieShuShiJian;
+    }
+
+    public String getBianZhiBuMen() {
+        return bianZhiBuMen;
+    }
+
+    public void setBianZhiBuMen(String bianZhiBuMen) {
+        this.bianZhiBuMen = bianZhiBuMen;
+    }
+
+    public String getShiYanXiangMu() {
+        return shiYanXiangMu;
+    }
+
+    public void setShiYanXiangMu(String shiYanXiangMu) {
+        this.shiYanXiangMu = shiYanXiangMu;
+    }
+
+    public String getShiYanYiQi() {
+        return shiYanYiQi;
+    }
+
+    public void setShiYanYiQi(String shiYanYiQi) {
+        this.shiYanYiQi = shiYanYiQi;
+    }
+
+    public String getFangAnLeiXing() {
+        return fangAnLeiXing;
+    }
+
+    public void setFangAnLeiXing(String fangAnLeiXing) {
+        this.fangAnLeiXing = fangAnLeiXing;
+    }
+
+    public String getLiuChengShenPi() {
+        return liuChengShenPi;
+    }
+
+    public void setLiuChengShenPi(String liuChengShenPi) {
+        this.liuChengShenPi = liuChengShenPi;
+    }
+}

+ 88 - 0
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/components/pv/persistence/entity/ExperimentalTreeNode.java

@@ -0,0 +1,88 @@
+package com.lc.ibps.components.pv.persistence.entity;
+
+import java.util.List;
+
+public class ExperimentalTreeNode {
+
+    /**
+     * 节点ID(确保唯一性)
+     */
+    private String id;
+
+    /**
+     * 节点显示名称
+     */
+    private String label;
+
+    /**
+     * 节点层级
+     * 1-年份, 2-部门, 3-实验项目, 4-实验仪器, 5-明细
+     */
+    private Integer level;
+
+    /**
+     * 原始数据ID(仅明细节点有值)
+     */
+    private String dataId;
+
+    /**
+     * 子节点列表
+     */
+    private List<ExperimentalTreeNode> children;
+
+    // 构造方法
+    public ExperimentalTreeNode() {}
+
+    public ExperimentalTreeNode(String id, String label, Integer level) {
+        this.id = id;
+        this.label = label;
+        this.level = level;
+    }
+
+    public ExperimentalTreeNode(String id, String label, Integer level, String dataId) {
+        this.id = id;
+        this.label = label;
+        this.level = level;
+        this.dataId = dataId;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    public void setLabel(String label) {
+        this.label = label;
+    }
+
+    public Integer getLevel() {
+        return level;
+    }
+
+    public void setLevel(Integer level) {
+        this.level = level;
+    }
+
+    public String getDataId() {
+        return dataId;
+    }
+
+    public void setDataId(String dataId) {
+        this.dataId = dataId;
+    }
+
+    public List<ExperimentalTreeNode> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<ExperimentalTreeNode> children) {
+        this.children = children;
+    }
+}

+ 1 - 1
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/components/pv/provider/ExperimentalConfigProvider.java

@@ -5,7 +5,7 @@ import java.util.stream.Collectors;
 
 import javax.annotation.Resource;
 
-import com.lc.ibps.form.dao.ExperimentalMapperDao;
+import com.lc.ibps.entrust.dao.ExperimentalMapperDao;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;

+ 220 - 5
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/components/pv/provider/ExperimentalProvider.java

@@ -1,15 +1,16 @@
 package com.lc.ibps.components.pv.provider;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import javax.annotation.Resource;
 
-import com.lc.ibps.form.dao.ExperimentalMapperDao;
+import com.lc.ibps.components.pv.persistence.entity.ExperimentalDataDTO;
+import com.lc.ibps.components.pv.persistence.entity.ExperimentalTreeNode;
+import com.lc.ibps.entrust.dao.ExperimentalMapperDao;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
@@ -174,4 +175,218 @@ public class ExperimentalProvider extends GenericProvider implements IExperiment
 
 		return apiResult;
 	}
+
+
+	@Override
+	public APIResult<List<ExperimentalTreeNode>> getAllArchiveTree() {
+
+		APIResult apiResult = new APIResult();
+
+		try {
+			List<ExperimentalTreeNode> experimentalTreeNodes = buildValidationTree();
+			apiResult.setData(experimentalTreeNodes);
+			apiResult.setMessage("查询成功");
+		} catch (Exception e) {
+			setExceptionResult(apiResult, StateEnum.ERROR.getCode(), StateEnum.ERROR.getText(), e);
+		}
+
+		return apiResult;
+	}
+
+
+
+	/**
+	 * 构建性能验证树形结构
+	 */
+	private List<ExperimentalTreeNode> buildValidationTree() {
+		try {
+			// 1. 查询所有性能验证数据
+			List<ExperimentalDataDTO> validationDataList = experimentalMapperDao.findAllValidationData();
+
+			if (validationDataList == null || validationDataList.isEmpty()) {
+				return new ArrayList<>();
+			}
+
+			// 2 部门信息转译 id -> name
+			// 2.1 提取所有部门ID并查询部门信息
+			Set<String> deptIdSet = validationDataList.stream()
+					.map(ExperimentalDataDTO::getBianZhiBuMen)
+					.filter(Objects::nonNull)
+					.collect(Collectors.toSet());
+			List<Map<String, Object>> departmentList = experimentalMapperDao.findDepartmentsByIds(new ArrayList<>(deptIdSet));
+
+			// 2.2 将部门列表转换为 Map<部门ID, 部门名称>
+			Map<String, String> deptIdToNameMap = departmentList.stream()
+					.collect(Collectors.toMap(
+							map -> (String) map.get("id"),
+							map -> (String) map.get("name"),
+							(existing, replacement) -> existing // 如果有重复key,保留现有的
+					));
+
+
+			// 3 实验项目转译 id -> name
+			// 3.1 提取多有实验项目ID并查查询实验项目名称
+			Set<String> shiYanXiangMuIdSet = validationDataList.stream()
+					.map(ExperimentalDataDTO::getShiYanXiangMu)
+					.filter(Objects::nonNull)
+					.collect(Collectors.toSet());
+			List<Map<String, Object>> shiYanXiangMuList = experimentalMapperDao.shiYanXiangMuByIds(new ArrayList<>(shiYanXiangMuIdSet));
+			// 3.2 将实验项目列表转换为 Map<实验项目ID, 实验项目名称>
+			Map<String, String> shiYanXiangMuIdToNameMap = shiYanXiangMuList.stream()
+					.collect(Collectors.toMap(
+							map -> (String) map.get("id"),
+							map -> (String) map.get("name"),
+							(existing, replacement) -> existing // 如果有重复key,保留现有的
+					));
+
+
+
+
+			// 4. 构建树形结构
+			return buildTreeStructure(validationDataList, deptIdToNameMap,shiYanXiangMuIdToNameMap);
+
+		} catch (Exception e) {
+			logger.error("",e);
+			//log.error("构建性能验证树形结构失败", e);
+			throw new RuntimeException("构建性能验证树形结构失败", e);
+		}
+	}
+
+
+
+
+	/**
+	 * 构建五层树形结构
+	 * @param dataList 性能验证明细数据(用于聚合成树结构)
+	 * @param deptIdToNameMap 部门名称id映射(用于把部门id转换为部门名称)
+	 * @param shiYanXiangMuIdToNameMap 实验项目id映射(用于把实验项目id转换为实验项目名称)
+	 * @return 五层树形结构
+	 */
+	private List<ExperimentalTreeNode> buildTreeStructure(
+			List<ExperimentalDataDTO> dataList,
+			Map<String, String> deptIdToNameMap,
+			Map<String, String> shiYanXiangMuIdToNameMap) {
+
+		// 第一层:按年份分组
+		Map<String, List<ExperimentalDataDTO>> yearGroup = dataList.stream()
+				.filter(data -> StringUtils.hasText(data.getJieShuShiJian()))
+				.collect(Collectors.groupingBy(data -> {
+					// 提取年份(前4位)
+					String endTime = data.getJieShuShiJian();
+					return endTime.length() >= 4 ? endTime.substring(0, 4) : "未知年份";
+				}));
+
+		List<ExperimentalTreeNode> rootNodes = new ArrayList<>();
+
+		// 遍历年份分组
+		for (Map.Entry<String, List<ExperimentalDataDTO>> yearEntry : yearGroup.entrySet()) {
+			String year = yearEntry.getKey();
+			List<ExperimentalDataDTO> yearDataList = yearEntry.getValue();
+
+			// 创建年份节点
+			ExperimentalTreeNode yearNode = new ExperimentalTreeNode(
+					"year_" + year, year + "年", 1);
+			yearNode.setChildren(new ArrayList<>());
+
+			// 第二层:按部门分组
+			Map<String, List<ExperimentalDataDTO>> deptGroup = yearDataList.stream()
+					.filter(data -> StringUtils.hasText(data.getBianZhiBuMen()))
+					.collect(Collectors.groupingBy(ExperimentalDataDTO::getBianZhiBuMen));
+
+			// 遍历部门分组
+			for (Map.Entry<String, List<ExperimentalDataDTO>> deptEntry : deptGroup.entrySet()) {
+				String deptId = deptEntry.getKey();
+				List<ExperimentalDataDTO> deptDataList = deptEntry.getValue();
+
+				// 获取部门名称,如果找不到则使用部门ID
+				String deptName = deptIdToNameMap.getOrDefault(deptId, "未知部门(" + deptId + ")");
+
+				// 创建部门节点
+				ExperimentalTreeNode deptNode = new ExperimentalTreeNode(
+						"dept_" + year + "_" + deptId, deptName, 2);
+				deptNode.setChildren(new ArrayList<>());
+
+				// 第三层:按实验项目分组
+				Map<String, List<ExperimentalDataDTO>> projectGroup = deptDataList.stream()
+						.filter(data -> StringUtils.hasText(data.getShiYanXiangMu()))
+						.collect(Collectors.groupingBy(ExperimentalDataDTO::getShiYanXiangMu));
+
+				// 遍历实验项目分组
+				for (Map.Entry<String, List<ExperimentalDataDTO>> projectEntry : projectGroup.entrySet()) {
+					String projecId = projectEntry.getKey();
+					List<ExperimentalDataDTO> projectDataList = projectEntry.getValue();
+
+					// 获取部门名称,如果找不到则使用部门ID
+					String projectName = shiYanXiangMuIdToNameMap.getOrDefault(projecId, "未知实验项目(" + projecId + ")");
+
+					// 创建实验项目节点
+					ExperimentalTreeNode projectNode = new ExperimentalTreeNode(
+							"project_" + year + "_" + deptId + "_" + projecId,
+							projectName, 3);
+					projectNode.setChildren(new ArrayList<>());
+
+					// 第四层:按实验仪器分组
+					Map<String, List<ExperimentalDataDTO>> instrumentGroup = projectDataList.stream()
+							.filter(data -> StringUtils.hasText(data.getShiYanYiQi()))
+							.collect(Collectors.groupingBy(ExperimentalDataDTO::getShiYanYiQi));
+
+					// 遍历实验仪器分组
+					for (Map.Entry<String, List<ExperimentalDataDTO>> instrumentEntry : instrumentGroup.entrySet()) {
+						String instrumentName = instrumentEntry.getKey();
+						List<ExperimentalDataDTO> instrumentDataList = instrumentEntry.getValue();
+
+						// 创建实验仪器节点
+						ExperimentalTreeNode instrumentNode = new ExperimentalTreeNode(
+								"instrument_" + year + "_" + deptId + "_" + projecId + "_" + instrumentName,
+								instrumentName, 4);
+						instrumentNode.setChildren(new ArrayList<>());
+
+						// 第五层:明细数据
+						for (ExperimentalDataDTO data : instrumentDataList) {
+
+							//如果流程审批时间为空,说明该数据流程还没有走完,不做为归档树的展示,忽略该数据
+							if(!StringUtils.hasText(data.getLiuChengShenPi())){
+								continue;
+							}
+
+							// 拼接显示名称:方案类型 + "_" + 流程审批前4位
+							String displayName = data.getFangAnLeiXing() + "_" +
+									(StringUtils.hasText(data.getLiuChengShenPi()) && data.getLiuChengShenPi().length() >= 4 ?
+											data.getLiuChengShenPi().substring(0, 10) : "未知");
+
+							ExperimentalTreeNode detailNode = new ExperimentalTreeNode(
+									"detail_" + data.getId(),
+									displayName,
+									5,
+									data.getId()
+							);
+							instrumentNode.getChildren().add(detailNode);
+						}
+
+						// 只有有明细数据的仪器才添加到项目节点
+						if (!instrumentNode.getChildren().isEmpty()) {
+							projectNode.getChildren().add(instrumentNode);
+						}
+					}
+
+					// 只有有仪器节点的项目才添加到部门节点
+					if (!projectNode.getChildren().isEmpty()) {
+						deptNode.getChildren().add(projectNode);
+					}
+				}
+
+				// 只有有项目节点的部门才添加到年份节点
+				if (!deptNode.getChildren().isEmpty()) {
+					yearNode.getChildren().add(deptNode);
+				}
+			}
+
+			// 只有有部门节点的年份才添加到根节点
+			if (!yearNode.getChildren().isEmpty()) {
+				rootNodes.add(yearNode);
+			}
+		}
+
+		return rootNodes;
+	}
 }

+ 25 - 1
ibps-provider-root/modules/provider-form/src/main/java/com/lc/ibps/form/dao/ExperimentalMapperDao.java → ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/entrust/dao/ExperimentalMapperDao.java

@@ -1,6 +1,7 @@
-package com.lc.ibps.form.dao;
+package com.lc.ibps.entrust.dao;
 
 
+import com.lc.ibps.components.pv.persistence.entity.ExperimentalDataDTO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -32,4 +33,27 @@ public interface ExperimentalMapperDao {
     int updateConfigforTarget(@Param("id")String id,@Param("target")String target, @Param("targetKey")String targetKey);
 
     List<String> getAllConfigIds();
+
+    /**
+     * 查询所有性能验证数据(只查询需要的字段)
+     */
+    List<ExperimentalDataDTO> findAllValidationData();
+
+
+    /**
+     * 根据部门ID列表查询部门信息,返回 Map<部门ID, 部门名称>
+     */
+    List<Map<String, Object>> findDepartmentsByIds(@Param("deptIds") List<String> deptIds);
+
+
+    /**
+     * 查询所有部门信息,返回 Map<部门ID, 部门名称>
+     */
+    List<Map<String, Object>> findAllDepartments();
+
+
+    /**
+     * 根据实验项目ID列表查询实验项目名称,返回 Map<实验项目ID, 实验项目名称>
+     */
+    List<Map<String, Object>>  shiYanXiangMuByIds(@Param("shiYanXiangMuIds") List<String> shiYanXiangMuIds);
 }

+ 48 - 1
ibps-provider-root/modules/provider-form/src/main/resources/com/lc/ibps/form/mapping/ExperimentalMapperDao.map.xml → ibps-provider-root/modules/provider-business/src/main/resources/com/lc/ibps/pv/persistence/mapping/ExperimentalMapperDao.map.xml

@@ -1,6 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.lc.ibps.form.dao.ExperimentalMapperDao">
+<mapper namespace="com.lc.ibps.entrust.dao.ExperimentalMapperDao">
+    
+    <resultMap id="ExperimentalDataResultMap" type="com.lc.ibps.components.pv.persistence.entity.ExperimentalDataDTO">
+        <result column="id_" property="id"/>
+        <result column="jie_shu_shi_jian_" property="jieShuShiJian"/>
+        <result column="bian_zhi_bu_men_" property="bianZhiBuMen"/>
+        <result column="shi_yan_xiang_mu_" property="shiYanXiangMu"/>
+        <result column="shi_yan_yi_qi_" property="shiYanYiQi"/>
+        <result column="fang_an_lei_xing_" property="fangAnLeiXing"/>
+        <result column="liu_cheng_shen_pi" property="liuChengShenPi"/>
+    </resultMap>
     <select id="treeForLevel1"  resultType="string">
         select DISTINCT left(jie_shu_shi_jian_,4) as ID_ from t_xnyzsyxx
     </select>
@@ -86,6 +96,43 @@
     <select id="getAllConfigIds" resultType="string">
         select id_ from t_xnyzpzxx
     </select>
+    
 
+    <select id="findAllValidationData" resultMap="ExperimentalDataResultMap">
+        SELECT
+        id_, jie_shu_shi_jian_, bian_zhi_bu_men_,
+        shi_yan_xiang_mu_, shi_yan_yi_qi_,
+        fang_an_lei_xing_, liu_cheng_shen_pi
+        FROM t_xnyzsyxx
+    </select>
+
+
+    <select id="findDepartmentsByIds" parameterType="string" resultType="map">
+        SELECT
+        ID_ as id,
+        NAME_ as name
+        FROM IBPS_PARTY_ENTITY
+        WHERE ID_ IN
+        <foreach collection='deptIds' item='deptId' open='(' separator=',' close=')'>
+            #{deptId}
+        </foreach>
+    </select>
+
+
+    <select id="findAllDepartments" resultType="map">
+        SELECT ID_ as id, NAME_ as name FROM IBPS_PARTY_ENTITY
+    </select>
+
+
+    <select id="shiYanXiangMuByIds"  parameterType="string" resultType="map">
+        SELECT
+        id_ as id,
+        jian_yan_xiang_mu as name
+        FROM v_nlfw
+        WHERE ID_ IN
+        <foreach collection='shiYanXiangMuIds' item='item' open='(' separator=',' close=')'>
+            #{item}
+        </foreach>
+    </select>
 
 </mapper>