package com.estate.expert.admin.io.processor.impl.matrix;
|
|
import com.estate.expert.admin.domain.standard.expert.matrix.MembershipMatrix;
|
import com.estate.expert.admin.domain.standard.expert.matrix.MembershipMatrixRowDto;
|
import com.estate.expert.admin.enums.BizResultCode;
|
import com.estate.expert.admin.io.processor.DataProcessorBase;
|
import org.apache.poi.ss.usermodel.Row;
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
|
/**
|
* 隶属度矩阵处理器
|
*
|
* 用于处理隶属度矩阵信息的读取和写入
|
*/
|
public class MembershipMatrixProcessor extends DataProcessorBase<MembershipMatrix> {
|
|
public static void validate(float[][][][][] values){
|
BizResultCode.PARAM_ERROR.check(values == null);
|
// 验证矩阵的维度是否正确
|
BizResultCode.MATRIX_SIZE_ERROR.check(values.length != 10);
|
|
int lv1 = 0;
|
for (float[][][][] value : values) {
|
int lv2 = 0;
|
BizResultCode.MATRIX_SIZE_ERROR.check(value.length != 10);
|
|
for (float[][][] floats : value) {
|
int lv3 = 0;
|
BizResultCode.MATRIX_SIZE_ERROR.check(floats.length != 10);
|
|
for (float[][] aFloat : floats) {
|
int lv4 = 0;
|
BizResultCode.MATRIX_SIZE_ERROR.check(aFloat.length != 10);
|
|
for (float[] v : aFloat) {
|
BizResultCode.MATRIX_SIZE_ERROR.check(v.length != 5);
|
var sum = v[0] + v[1] + v[2] + v[3] + v[4];
|
BizResultCode.NUMBER_NON_NEGATIVE.check(v[0] < 0);
|
BizResultCode.MEMBERSHIP_MATRIX_ERROR.check(Math.abs(sum - 1) > 0.001,
|
"隶属度矩阵每一行的和应该等于1, 错误行:" + lv1 + "-" + lv2 + "-" + lv3 + "-" + lv4);
|
|
lv4++;
|
}
|
lv3++;
|
}
|
lv2++;
|
}
|
lv1++;
|
}
|
}
|
|
public static void validateRow(MembershipMatrixRowDto row){
|
BizResultCode.PARAM_ERROR.check(row == null);
|
BizResultCode.INDEX_RANGE_ERROR.check(row.getP1() < 0 || row.getP1() > 9);
|
BizResultCode.NUMBER_NON_NEGATIVE.check(row.getP2() < 0 || row.getP2() > 9);
|
BizResultCode.NUMBER_NON_NEGATIVE.check(row.getP3() < 0 || row.getP3() > 9);
|
BizResultCode.NUMBER_NON_NEGATIVE.check(row.getP4() < 0 || row.getP4() > 9);
|
var sum = row.getV0() + row.getV1() + row.getV2() + row.getV3() + row.getV4();
|
BizResultCode.NUMBER_NON_NEGATIVE.check(row.getV0() < 0);
|
BizResultCode.NUMBER_NON_NEGATIVE.check(row.getV1() < 0);
|
BizResultCode.NUMBER_NON_NEGATIVE.check(row.getV2() < 0);
|
BizResultCode.NUMBER_NON_NEGATIVE.check(row.getV3() < 0);
|
BizResultCode.NUMBER_NON_NEGATIVE.check(row.getV4() < 0);
|
BizResultCode.MEMBERSHIP_MATRIX_ERROR.check(Math.abs(sum - 1) > 0.001, "隶属度矩阵每一行的和应该等于1, 错误行:" + row);
|
}
|
|
@Override
|
protected String[] getHeaders() {
|
return new String [] {
|
"四级隐患", "三级隐患", "二级隐患", "一级隐患",
|
"可忽略", "可容忍", "可接受", "不可接受", "拒绝接受"
|
};
|
}
|
|
@Override
|
public String getName() {
|
return "隶属度矩阵";
|
}
|
|
@Override
|
protected MembershipMatrix parseSheet(XSSFSheet sheet) {
|
var matrix = new float[10][10][10][10][5];
|
|
int rowCount = sheet.getLastRowNum() + 1;
|
BizResultCode.PARAM_ERROR.check(10001 != rowCount);
|
|
for (int i = 1; i < rowCount; i++) {
|
Row row = sheet.getRow(i);
|
int fourth = (int) row.getCell(0).getNumericCellValue();
|
int third = (int) row.getCell(1).getNumericCellValue();
|
int second = (int) row.getCell(2).getNumericCellValue();
|
int first = (int) row.getCell(3).getNumericCellValue();
|
String canIgnore = String.valueOf(row.getCell(4).getNumericCellValue());
|
String canEndure = String.valueOf(row.getCell(5).getNumericCellValue());
|
String canAccept = String.valueOf(row.getCell(6).getNumericCellValue());
|
String canNotAccept = String.valueOf(row.getCell(7).getNumericCellValue());
|
String reject = String.valueOf(row.getCell(8).getNumericCellValue());
|
|
matrix[first][second][third][fourth][0] = Float.parseFloat(canIgnore);
|
matrix[first][second][third][fourth][1] = Float.parseFloat(canEndure);
|
matrix[first][second][third][fourth][2] = Float.parseFloat(canAccept);
|
matrix[first][second][third][fourth][3] = Float.parseFloat(canNotAccept);
|
matrix[first][second][third][fourth][4] = Float.parseFloat(reject);
|
|
var v = matrix[first][second][third][fourth];
|
var sum = matrix[first][second][third][fourth][0] + matrix[first][second][third][fourth][1] + matrix[first][second][third][fourth][2] + matrix[first][second][third][fourth][3] + matrix[first][second][third][fourth][4];
|
if(Math.abs(sum - 1) > 0.001){
|
BizResultCode.MEMBERSHIP_MATRIX_ERROR.check(true, "隶属度矩阵每一行的和应该等于1, 错误行:" + i);
|
}
|
}
|
return new MembershipMatrix(null, matrix);
|
}
|
|
@Override
|
protected void writeSheet(XSSFSheet sheet, MembershipMatrix data) {
|
var matrix = data.getData();
|
for (int i = 0; i < 10; i++) {
|
for (int j = 0; j < 10; j++) {
|
for (int k = 0; k < 10; k++) {
|
for (int l = 0; l < 10; l++) {
|
var row = sheet.createRow(sheet.getLastRowNum() + 1);
|
row.createCell(0).setCellValue(l);
|
row.createCell(1).setCellValue(k);
|
row.createCell(2).setCellValue(j);
|
row.createCell(3).setCellValue(i);
|
row.createCell(4).setCellValue(matrix[i][j][k][l][0]);
|
row.createCell(5).setCellValue(matrix[i][j][k][l][1]);
|
row.createCell(6).setCellValue(matrix[i][j][k][l][2]);
|
row.createCell(7).setCellValue(matrix[i][j][k][l][3]);
|
row.createCell(8).setCellValue(matrix[i][j][k][l][4]);
|
}
|
}
|
}
|
}
|
}
|
}
|