处理依赖冲突问题

自定义报表问题处理
This commit is contained in:
2023-09-07 14:51:22 +08:00
parent 82fa9cd90a
commit b5d442e93e
15 changed files with 153 additions and 177 deletions

View File

@@ -1,322 +0,0 @@
package com.njcn.web.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author yexb(创建)-----denghuajun(移植使用)
* @version 1.0
* @date 2018/8/23 16:02
*/
//因素集U={频率偏差、电网谐波、电压波动与闪变、电压偏差、电压暂降、三相不平衡}
//评判级分为5个等级Q = {很差,较差,合格,良好,优质}
/* 电压偏差 电网谐波 三相不平衡 频率偏差 电压波动 电压暂降
(偏差绝对值/%) (电压总谐波畸变率%) (不平衡度/%) (偏差绝对值/Hz) (短时闪变值) (暂降幅度%)
第1 级 10 6..0 4.0 0.3 0.8 90
第2 级 710 4.06.0 2..04.0 0.20.3 0.60.8 4090
第3 级 47 2.04.0 1.02.0 0.10.2 0.40.6 2040
第4 级 24 1.02.0 0.51.0 0.050.1 0.20.4 1020
第5 级 02 01.0 00.5 00.05 00.2 010
*/
@Component
public class ComAssesUtil {
// 日志记录
private static final Logger logger = LoggerFactory.getLogger(ComAssesUtil.class);
private static final int ST_QT_NUM = 6;//系统评价指标数目
private static final int GRADE_NUM = 5;//指标分级数目
private static final int METHOD_NUM = 5;//评估方法数
private static final int METHOD_IDX1 = 0;//层次分析法
private static final int METHOD_IDX2 = 1;//优序图法
private static final int METHOD_IDX3 = 2;//专家打分法
private static final int METHOD_IDX4 = 3;//熵权法
private static final int METHOD_IDX5 = 4;//变异系数法
private static final int IDX_FREQ = 0;//频率
private static final int IDX_UTHD = 1;//电压畸变率
private static final int IDX_FLICK = 2;//电压闪变
private static final int IDX_UDEV = 3;//电压偏差
private static final int IDX_EVT = 4;//电压暂降
private static final int IDX_UBPH = 5;//电压不平衡
private static final int MAX_DATA_TYPE = 5;//5种统计数据
private static final int MAX_DATA_NUM = 1440 * 31;//最大统计数据个数
private static final int MAX_EVT_NUM = 1000;//最大暂态事件个数
//3种主观赋权法直接摘录文档中计算好的最终评估权重
//层次分析法
private float W1[] = {0.38f, 0.22f, 0.13f, 0.12f, 0.08f, 0.07f};
//优序图法
private float W2[] = {0.28f, 0.24f, 0.19f, 0.14f, 0.10f, 0.05f};
//专家打分法
private float W3[] = {0.39f, 0.26f, 0.12f, 0.09f, 0.07f, 0.07f};
//数据评估矩阵
private float Assess[][];
//权重矩阵
private float Weight[][];
float A[];
// 综合评估程序,返回值为评估分
public float GetComAsses(float in_data[][]) {
float fResult = 0.0f;//返回最终评分
try{
//实例化所有参数
Assess = new float[ST_QT_NUM][GRADE_NUM];
Weight = new float[ST_QT_NUM][METHOD_NUM];
A = new float[ST_QT_NUM];
float B[] = new float[GRADE_NUM];
int i, j;
float sum1, sum2;
Assess = in_data;//给评估矩阵赋值,此值直接从相应的数据库中获取
//W1-W3为主观赋权直接从文档上摘录赋权
for (i = 0; i < ST_QT_NUM; i++) {
Weight[i][METHOD_IDX1] = W1[i];
Weight[i][METHOD_IDX2] = W2[i];
Weight[i][METHOD_IDX3] = W3[i];
}
//熵权法求W4
if (getSqf()) {
//变异系数法求W5
if (getBysxf()) {
//G和F得出综合权重A
if (getZhqzf()) {
A[0] = 0.28f;A[1] = 0.23f;A[2] = 0.13f;A[3] = 0.16f;A[4] = 0.08f;A[5] = 0.12f;
for (i = 0; i < GRADE_NUM; i++) {
B[i] = 0;
for (j = 0; j < ST_QT_NUM; j++) {
B[i] += A[j] * Assess[j][i];
}
}
sum1 = 0;
sum2 = 0;
for (i = 0; i < GRADE_NUM; i++) {
sum1 += (i + 1) * B[i];
sum2 += B[i];
}
fResult = sum1 / sum2;
}
}
}
fResult = FloatUtils.get2Float(fResult);
}catch (Exception e){
//Todo
}
return fResult;
}
/**
* 大批量的监测点的综合得分获取平均值
* @param pqsComasses 批量数据
*/
public float getAllComAss(List<PqsComasses> pqsComasses) {
float allData=0f;
for(int i=0;i<pqsComasses.size();i++){
PqsComasses tempPqs=pqsComasses.get(i);
//组合二维数组
float f1[][]={{tempPqs.getFreqDev1().floatValue(),tempPqs.getFreqDev2().floatValue(),tempPqs.getFreqDev3().floatValue()
,tempPqs.getFreqDev4().floatValue(),tempPqs.getFreqDev5().floatValue()}
,{tempPqs.getVThd1().floatValue(),tempPqs.getVThd2().floatValue(),tempPqs.getVThd3().floatValue(),tempPqs.getVThd4().floatValue(),tempPqs.getVThd5().floatValue(),}
,{tempPqs.getDataPlt1().floatValue(),tempPqs.getDataPlt2().floatValue(),tempPqs.getDataPlt3().floatValue(),tempPqs.getDataPlt4().floatValue(),tempPqs.getDataPlt5().floatValue()}
,{tempPqs.getVuDev1().floatValue(),tempPqs.getVuDev2().floatValue(),tempPqs.getVuDev3().floatValue(),tempPqs.getVuDev4().floatValue(),tempPqs.getVuDev5().floatValue(),}
,{tempPqs.getVUnbalance1().floatValue(),tempPqs.getVUnbalance2().floatValue(),tempPqs.getVUnbalance3().floatValue(),tempPqs.getVUnbalance4().floatValue(),tempPqs.getVUnbalance5().floatValue(),}
,{tempPqs.getEvent1().floatValue(),tempPqs.getEvent2().floatValue(),tempPqs.getEvent3().floatValue(),tempPqs.getEvent4().floatValue(),tempPqs.getEvent5().floatValue(),}};
//获取该值返回的数据
float temp=GetComAsses(f1);
allData+=temp;
}
float aveData=allData/pqsComasses.size();
return FloatUtils.get2Float(aveData);
}
//熵权法求权重
private boolean getSqf() {
boolean blSqfFlag = true;
try {
int i, j;
float k, m;
float sum[] = new float[ST_QT_NUM];
float e[] = new float[ST_QT_NUM];
float d[] = new float[ST_QT_NUM];
//计算第j个指标的熵值e(j)
m = GRADE_NUM;
//k = (1/1.6094379124341);
k = (float) (1 / ((Math.log(m)) / Math.log(2.7183)));
for (i = 0; i < ST_QT_NUM; i++) {
sum[i] = 0;
for (j = 0; j < GRADE_NUM; j++) {
if (Assess[i][j] != 0) {
sum[i] += Assess[i][j] * (Math.log(Assess[i][j]) / Math.log(2.7183));
}
}
e[i] = -k * sum[i];
}
for (i = 0; i < ST_QT_NUM; i++) {
d[i] = 1 - e[i];
}
sum[0] = 0;
for (i = 0; i < ST_QT_NUM; i++) {
sum[0] += d[i];
}
for (i = 0; i < ST_QT_NUM; i++) {
Weight[i][METHOD_IDX4] = d[i] / sum[0];
}
} catch (Exception e) {
logger.error(e.getMessage());
blSqfFlag = false;
}
return blSqfFlag;
}
//变异系数法求权重
private boolean getBysxf() {
boolean blBysxfFlag = true;
try {
float avg_f[] = new float[ST_QT_NUM];//平均值
float std_f[] = new float[ST_QT_NUM];//标准差
float byxs[] = new float[ST_QT_NUM];//变异系数
float sum;
int i, j;
for (i = 0; i < ST_QT_NUM; i++) {
avg_f[i] = 0;
std_f[i] = 0;
byxs[i] = 0;
}
//求平均值
for (i = 0; i < ST_QT_NUM; i++) {
sum = 0;
for (j = 0; j < GRADE_NUM; j++) {
sum += Assess[i][j];
}
avg_f[i] = sum / GRADE_NUM;
}
//求标准差
for (i = 0; i < ST_QT_NUM; i++) {
sum = 0;
for (j = 0; j < GRADE_NUM; j++) {
sum += Math.pow((Assess[i][j] - avg_f[i]), 2);
}
std_f[i] = (float) (Math.sqrt(sum / GRADE_NUM));
}
//求变异系数
for (i = 0; i < ST_QT_NUM; i++) {
if (avg_f[i] < 0) {
avg_f[i] = 0 - avg_f[i];
}
byxs[i] = std_f[i] / avg_f[i];
}
sum = 0;
for (i = 0; i < ST_QT_NUM; i++) {
sum += byxs[i];
}
for (i = 0; i < ST_QT_NUM; i++) {
Weight[i][METHOD_IDX5] = byxs[i] / sum;
}
} catch (Exception e) {
logger.error(e.getMessage());
blBysxfFlag = false;
}
return blBysxfFlag;
}
//求综合权重,主观权重和客观权重占比相等各自50%
private boolean getZhqzf() {
float D[] = new float[ST_QT_NUM];
float e[] = new float[ST_QT_NUM];
float C[][] = new float[ST_QT_NUM][ST_QT_NUM];
float C1[][] = new float[ST_QT_NUM][ST_QT_NUM];
float tmp1[] = new float[ST_QT_NUM];
float tmp2[] = new float[ST_QT_NUM];
boolean blZhqzfFlag = true;
try {
int i, j, k;
float t1, t2;
//求C
for (i = 0; i < ST_QT_NUM; i++) {
tmp1[i] = 0;
for (j = 0; j < GRADE_NUM; j++) {
tmp1[i] += 2 * METHOD_NUM * Math.pow(Assess[i][j], 2);
}
}
for (i = 0; i < ST_QT_NUM; i++) {
for (j = 0; j < ST_QT_NUM; j++) {
if (i == j) {
C[i][j] = tmp1[i];
}
else {
C[i][j] = 0;
}
}
}
//求C的逆矩阵C1,由于C是对角矩阵简化矩阵求逆
for (i = 0; i < ST_QT_NUM; i++) {
for (j = 0; j < ST_QT_NUM; j++) {
if (i == j) {
C1[i][j] = (float) 1.0 / C[i][j];
}
else {
C1[i][j] = 0;
}
}
}
//求D
for (i = 0; i < ST_QT_NUM; i++) {
tmp1[i] = 0;
for (k = 0; k < METHOD_NUM; k++) {
tmp1[i] += Weight[i][k];
}
tmp2[i] = 0;
for (j = 0; j < GRADE_NUM; j++) {
tmp2[i] += tmp1[i] * Math.pow(Assess[i][j], 2);
}
D[i] = 2 * tmp2[i];
}
//e赋值
for (i = 0; i < ST_QT_NUM; i++) {
e[i] = 1;
}
//计算eT*C1
for (i = 0; i < ST_QT_NUM; i++) {
tmp1[i] = 0;
for (j = 0; j < ST_QT_NUM; j++) {
tmp1[i] += e[i] * C1[j][i];
}
}
t1 = 0;
for (i = 0; i < ST_QT_NUM; i++) {
t1 += tmp1[i] * e[i];
}
t2 = 0;
for (i = 0; i < ST_QT_NUM; i++) {
t2 += tmp1[i] * D[i];
}
for (i = 0; i < ST_QT_NUM; i++) {
e[i] = e[i] * ((1 - t2) / t1);
}
for (i = 0; i < ST_QT_NUM; i++) {
D[i] = D[i] + e[i];
}
//求A
for (i = 0; i < ST_QT_NUM; i++) {
A[i] = 0;
for (j = 0; j < ST_QT_NUM; j++) {
A[i] += C1[i][j] * D[j];
}
}
} catch (Exception ex) {
logger.error(ex.getMessage());
blZhqzfFlag = false;
}
return blZhqzfFlag;
}
}

View File

@@ -1,110 +0,0 @@
package com.njcn.web.utils;
import lombok.Data;
import org.influxdb.annotation.Column;
import org.influxdb.annotation.Measurement;
import java.io.Serializable;
import java.time.Instant;
import java.time.LocalDateTime;
@Data
@Measurement(name = "pqs_comasses")
public class PqsComasses implements Serializable {
@Column(name = "time")
private Instant timeid;
@Column(name = "line_id")
private String lineid;
@Column(name = "freq_dev1")
private Double freqDev1;
@Column(name = "freq_dev2")
private Double freqDev2;
@Column(name = "freq_dev3")
private Double freqDev3;
@Column(name = "freq_dev4")
private Double freqDev4;
@Column(name = "freq_dev5")
private Double freqDev5;
@Column(name = "vu_dev1")
private Double vuDev1;
@Column(name = "vu_dev2")
private Double vuDev2;
@Column(name = "vu_dev3")
private Double vuDev3;
@Column(name = "vu_dev4")
private Double vuDev4;
@Column(name = "vu_dev5")
private Double vuDev5;
@Column(name = "data_plt1")
private Double dataPlt1;
//电压闪变等级2
@Column(name = "data_plt2")
private Double dataPlt2;
//电压闪变等级3
@Column(name = "data_plt3")
private Double dataPlt3;
//电压闪变等级4
@Column(name = "data_plt4")
private Double dataPlt4;
//电压闪变等级5
@Column(name = "data_plt5")
private Double dataPlt5;
@Column(name = "v_unbalance1")
private Double vUnbalance1;
@Column(name = "v_unbalance2")
private Double vUnbalance2;
@Column(name = "v_unbalance3")
private Double vUnbalance3;
@Column(name = "v_unbalance4")
private Double vUnbalance4;
@Column(name = "v_unbalance5")
private Double vUnbalance5;
@Column(name = "v_thd1")
private Double vThd1;
@Column(name = "v_thd2")
private Double vThd2;
@Column(name = "v_thd3")
private Double vThd3;
@Column(name = "v_thd4")
private Double vThd4;
@Column(name = "v_thd5")
private Double vThd5;
@Column(name = "event1")
private Double event1;
@Column(name = "event2")
private Double event2;
@Column(name = "event3")
private Double event3;
@Column(name = "event4")
private Double event4;
@Column(name = "event5")
private Double event5;
}