|
|
@@ -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;
|
|
|
+ }
|
|
|
}
|