package com.estate.expert.admin.initdata; import com.estate.expert.admin.domain.standard.hierachy.Hierarchy; import com.estate.expert.admin.domain.standard.hierachy.HierarchyData; import com.estate.expert.admin.initdata.common.ImportUtil; import com.estate.expert.admin.service.HierarchyService; import com.estate.expert.admin.service.UserService; import com.estate.expert.admin.utils.tree.SimpleTreeRoot; import com.estate.expert.admin.utils.tree.TreeNode; import lombok.Builder; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.*; import java.io.File; import java.io.FileInputStream; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; @Builder @Slf4j public class ImportHierarchyJob { private UserService userService; private HierarchyService hierarchyService; public void importDepartments() { var root = new TreeNode("成都信立隆"); root.addChild("技术部"); root.addChild("人事部"); root.addChild("设备部"); root.addChild("后勤部"); var hierarchy = new Hierarchy(); hierarchy.setName("部门"); hierarchy.setContent(new SimpleTreeRoot<>(root)); hierarchyService.add(userService.getSystemUser(), hierarchy); } // 导入标准层级数据 public void importSystemHierarchyData() { File rootFolder = new File(ImportUtil.docsRoot("/综合体系-标准-层级")); importHierarchy("综合体系", rootFolder, 0); } // 导入设备层级数据 public void importDeviceHierarchyData() { File rootFolder = new File(ImportUtil.docsRoot("/设备体系-标准-层级")); importHierarchy("设备体系", rootFolder, 0); } // 导入实测实量层级数据 public void importMeasureHierarchyData() { File rootFolder = new File(ImportUtil.docsRoot("/实测实量-标准-规则管理")); importHierarchy("实测实量体系", rootFolder, 1); } private void importHierarchy(String name, File folder, int mode) { var root = processFolder(folder, mode,null, null); var hierarchy = new Hierarchy(); hierarchy.setName(name); hierarchy.setContent(new SimpleTreeRoot<>(root)); hierarchyService.add(userService.getSystemUser(), hierarchy); } /** * 递归处理文件夹 */ private TreeNode processFolder(File folder, int mode, TreeNode parent, Map dataMap) { var name = folder.getName(); TreeNode node = null; if (parent == null) { node = new TreeNode<>(name, new HierarchyData(100f, 1f)); } else { node = parent.addChild(name, dataMap.get(name)); } var dm = mode == 0 ? loadHierarchyData(folder) : loadMeasureData(folder); for (var key : dm.keySet()) { var subFolder = new File(folder, key); if(!subFolder.exists()){ log.error("未找到文件夹: {}", subFolder.getAbsolutePath()); continue; } processFolder(subFolder, mode, node, dm); } return node; } /** * 从data.xlsx文件中读取层级数据 */ private Map loadHierarchyData(File folder) { // 读取 Excel 文件 File excelFile = new File(folder, "data.xlsx"); // Map SortedMap map = new TreeMap<>(); if (excelFile.exists()) { try (FileInputStream fis = new FileInputStream(excelFile)) { Workbook workbook = WorkbookFactory.create(fis); Sheet sheet = workbook.getSheetAt(0); for (Row row : sheet) { Cell levelNameCell = row.getCell(0); String levelName = levelNameCell.getStringCellValue(); if (StringUtils.isBlank(levelName)) { continue; } HierarchyData data = loadWeightData(row); map.put(levelName, data); } } catch (Exception e) { e.printStackTrace(); } } return map; } private Map loadMeasureData(File folder) { // Map SortedMap map = new TreeMap<>(); // 读取目录下的子目录 var subFolders = folder.listFiles(); if (subFolders == null) { return map; } for (File subFolder : subFolders) { if (subFolder.isDirectory()) { map.put(subFolder.getName(), null); } } return map; } private HierarchyData loadWeightData(Row row){ Cell scoreCell = row.getCell(1); Cell weightCell = row.getCell(2); var score = Float.parseFloat(scoreCell.getStringCellValue()); var weight = Float.parseFloat(weightCell.getStringCellValue()); return new HierarchyData(score, weight); } }