package com.estate.expert.admin.initdata; import com.alibaba.fastjson.JSONObject; import com.estate.expert.admin.domain.standard.expert.ExpertFunc; import com.estate.expert.admin.domain.standard.expert.matrix.CompareMatrix; import com.estate.expert.admin.domain.standard.expert.system.SysExpert; import com.estate.expert.admin.domain.standard.hierachy.HierarchyData; import com.estate.expert.admin.domain.standard.model.system.SysModel; import com.estate.expert.admin.io.processor.impl.matrix.MembershipMatrixProcessor; 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.service.expert.DeviceExpertService; import com.estate.expert.admin.service.expert.SysExpertService; import com.estate.expert.admin.service.model.DeviceModelService; import com.estate.expert.admin.service.model.SystemModelService; import com.estate.expert.admin.utils.tree.TreeNode; import com.estate.expert.admin.utils.tree.TreeRoot; import lombok.Builder; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.apache.poi.ss.usermodel.*; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.TreeMap; /** * 导入专家 **/ @Builder @Slf4j public class ImportExpertJob { private HierarchyService hierarchyService; private SystemModelService systemModelService; private DeviceModelService deviceModelService; private DeviceExpertService deviceExpertService; private SysExpertService sysExpertService; private UserService userService; public void createDefaultExpert() { sysExpertService.createDefaultExpert(); deviceExpertService.createDefaultExpert(); } public void importSystemExpert() throws IOException { var model = systemModelService.getByName("衡泰专家"); String path = ImportUtil.docsRoot("/衡泰专家/对比矩阵/"); for (File file : FileUtils.listFiles(new File(path), new String[]{"xlsx"}, true)) { String expertName = file.getName().replace(".xlsx", ""); var expert = loadExpert(expertName, ImportUtil.docsRoot("/衡泰专家"), model); expert.setName(expertName + "专家D"); sysExpertService.add(userService.getSystemUser(), expert); } } private SysExpert loadExpert(String name, String rootPath, SysModel model) throws IOException { var expert = new SysExpert(); expert.setName(name); expert.setModel(model); expert.setExpertInquiryWeight(1.0f); expert.setMatrixWeight(1.0f); expert.setMembershipWeight(1.0f); expert.setExpertFuncs(List.of(ExpertFunc.FUZZY_FUNC, ExpertFunc.SCORE_FUNC)); var hierarchy = systemModelService.getHierarchyTree(model.getId()); // 导入关键数据 expert.setCompareMatrixMap(loadCompareMatrixMap(hierarchy,rootPath + "/对比矩阵/" + name + ".xlsx")); expert.setMembershipMatrix(new MembershipMatrixProcessor().loadFromWorkbook(rootPath + "/隶属度/" + name + ".xlsx")); return expert; } private Map loadCompareMatrixMap(TreeRoot hierarchy, String filePath) { Map fuzzyFuncMatrix = new TreeMap<>(); try { FileInputStream fileInputStream = new FileInputStream(filePath); Workbook workbook = WorkbookFactory.create(fileInputStream); int numberOfSheets = workbook.getNumberOfSheets(); for (int i = 0; i < numberOfSheets; i++) { var node = sheetNameToTreeNode(hierarchy, workbook.getSheetName(i)); //print node children names var childrenNames = node.getChildren().values().stream().map(TreeNode::getName).toList(); log.info("node:{}", childrenNames); var data = loadSingleCompareMatrix(workbook, i); fuzzyFuncMatrix.put(node.getPath(), data); } } catch (Exception e) { log.error("read excel error, filePath:{}", filePath, e); } return fuzzyFuncMatrix; } TreeNode sheetNameToTreeNode(TreeRoot hierarchy, String sheetName){ String[] split = sheetName.split("_"); var hierarchyPath = "/" + split[1].replace("-", "/"); return hierarchy.getByNamePath(hierarchyPath); } private CompareMatrix loadSingleCompareMatrix(Workbook workbook, int i) { // 该sheet的内容是level & 层级名称对应的下级层级的二维矩阵数据 Sheet sheet = workbook.getSheetAt(i); // 读取0行的1列到n列的数据,拼成数组, 作为indexCols Row indexRow = sheet.getRow(0); int totalCols = indexRow.getLastCellNum(); String[] indexCols = new String[totalCols-1]; for (int m = 1; m < totalCols; m++) { indexCols[m-1] = indexRow.getCell(m).getStringCellValue(); } log.info("indexCols:{}", JSONObject.toJSONString(indexCols)); // 1行1列到n行n列的数据, 拼成二维数组, 作为matrix_values int totalRows = sheet.getLastRowNum(); float[][] matrixValues = new float[totalRows][totalCols-1]; for (int n = 1; n <= totalRows; n++) { Row dataRow = sheet.getRow(n); for (int k = 1; k < totalCols; k++) { Cell cell = dataRow.getCell(k); matrixValues[n - 1][k-1] = (float) cell.getNumericCellValue(); } } log.info("matrixValues:{}", JSONObject.toJSONString(matrixValues)); return new CompareMatrix(indexCols, matrixValues); } public void testLoadSingleFuzzyFuncMatrix() { String filePath = ImportUtil.docsRoot("/衡泰专家/对比矩阵/衡泰通用01.xlsx"); try { FileInputStream fileInputStream = new FileInputStream(filePath); Workbook workbook = WorkbookFactory.create(fileInputStream); loadSingleCompareMatrix(workbook, 0); } catch (Exception e) { log.error("read excel error, filePath:{}", filePath, e); } } }