liujie
2026-01-21 8d1d546ad729da0e809e17e8161376adcc662c96
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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]);
                    }
                }
            }
        }
    }
}