谐波溯源翻译成java 第一版本,写完技术监督再回来优化

This commit is contained in:
2024-05-20 15:00:17 +08:00
parent 9a6c4e7244
commit f03fc1d1cf
8 changed files with 952 additions and 106 deletions

View File

@@ -18,10 +18,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.advance.enums.AdvanceResponseEnum;
import com.njcn.advance.mapper.responsibility.RespDataMapper;
import com.njcn.advance.model.responsibility.CacheQvvrData;
import com.njcn.advance.model.responsibility.HKDataStruct;
import com.njcn.advance.model.responsibility.PDataStruct;
import com.njcn.advance.model.responsibility.QvvrStruct;
import com.njcn.advance.model.responsibility.*;
import com.njcn.advance.pojo.bo.responsibility.*;
import com.njcn.advance.pojo.dto.responsibility.CustomerData;
import com.njcn.advance.pojo.dto.responsibility.CustomerResponsibility;
@@ -31,10 +28,10 @@ import com.njcn.advance.pojo.param.ResponsibilityCalculateParam;
import com.njcn.advance.pojo.param.ResponsibilitySecondCalParam;
import com.njcn.advance.pojo.po.responsibility.RespData;
import com.njcn.advance.pojo.po.responsibility.RespDataResult;
import com.njcn.advance.pojo.po.responsibility.RespUserData;
import com.njcn.advance.service.responsibility.IRespDataResultService;
import com.njcn.advance.service.responsibility.IRespDataService;
import com.njcn.advance.service.responsibility.IRespUserDataService;
import com.njcn.advance.utils.ResponsibilityAlgorithm;
import com.njcn.advance.utils.ResponsibilityCallDllOrSo;
import com.njcn.common.pojo.enums.common.DataStateEnum;
import com.njcn.common.pojo.exception.BusinessException;
@@ -104,7 +101,7 @@ public class RespDataServiceImpl extends ServiceImpl<RespDataMapper, RespData> i
//没有排序参数默认根据sort字段排序没有排序字段的根据updateTime更新时间排序
queryWrapper.orderBy(true, false, "pqs_resp_data.create_time");
}
queryWrapper.between("pqs_resp_data.create_time", queryParam.getSearchBeginTime(), queryParam.getSearchEndTime());
queryWrapper.between("pqs_resp_data.create_time",DateUtil.beginOfDay(DateUtil.parse(queryParam.getSearchBeginTime())), DateUtil.endOfDay(DateUtil.parse(queryParam.getSearchEndTime())));
}
queryWrapper.eq("pqs_resp_data.state", DataStateEnum.ENABLE.getCode());
Page<RespDataDTO> page = this.baseMapper.page(new Page<>(PageFactory.getPageNum(queryParam), PageFactory.getPageSize(queryParam)), queryWrapper);
@@ -185,69 +182,67 @@ public class RespDataServiceImpl extends ServiceImpl<RespDataMapper, RespData> i
names.add(userName);
}
//然后开始组装数据
PDataStruct[] pData = new PDataStruct[QvvrStruct.MAX_P_NUM];
float[][] pData = new float[QvvrDataEntity.MAX_P_NUM][QvvrDataEntity.MAX_P_NODE];
for (int i = 0; i < names.size(); i++) {
//当前某用户测量节点的所有数据
List<UserDataExcel> userDataExcelBodies1 = originalPData.get(names.get(i));
for (int k = 0; k < userDataExcelBodies1.size(); k++) {
PDataStruct pDataStruct = pData[k];
float[] pDataStruct = pData[k];
if (pDataStruct == null) {
pDataStruct = new PDataStruct();
pDataStruct = new float[QvvrDataEntity.MAX_P_NODE];
}
float[] p = pDataStruct.getP();
float[] p = pDataStruct;
p[i] = userDataExcelBodies1.get(k).getWork().floatValue();
pData[k] = pDataStruct;
}
}
//至此功率数据也组装完毕,调用友谊提供的接口
QvvrStruct qvvrStruct = null;
try {
qvvrStruct = new QvvrStruct();
} catch (Exception exception) {
exception.printStackTrace();
}
qvvrStruct.cal_flag = 0;
qvvrStruct.p_node = pNode;
qvvrStruct.p_num = pNum;
qvvrStruct.win = win;
qvvrStruct.harm_num = harmNum;
qvvrStruct.harm_mk = harmMk;
qvvrStruct.p_data = pData;
qvvrStruct.harm_data = respHarmData.getHarmData();
ResponsibilityCallDllOrSo responsibilityCallDllOrSo = new ResponsibilityCallDllOrSo("harm_response");
responsibilityCallDllOrSo.setPath();
ResponsibilityCallDllOrSo.ResponsibilityLibrary responsibilityLibrary = ResponsibilityCallDllOrSo.ResponsibilityLibrary.INSTANTCE;
try {
responsibilityLibrary.harm_response(qvvrStruct);
} catch (Exception exception) {
exception.printStackTrace();
}
QvvrDataEntity qvvrDataEntity = new QvvrDataEntity();
qvvrDataEntity.calFlag = 0;
qvvrDataEntity.pNode = pNode;
qvvrDataEntity.pNum = pNum;
qvvrDataEntity.win = win;
qvvrDataEntity.harmNum = harmNum;
qvvrDataEntity.harmMk = harmMk;
qvvrDataEntity.pData = pData;
qvvrDataEntity.harmData = respHarmData.getHarmData();
// ResponsibilityCallDllOrSo responsibilityCallDllOrSo = new ResponsibilityCallDllOrSo("harm_response");
// responsibilityCallDllOrSo.setPath();
// ResponsibilityCallDllOrSo.ResponsibilityLibrary responsibilityLibrary = ResponsibilityCallDllOrSo.ResponsibilityLibrary.INSTANTCE;
// try {
// responsibilityLibrary.harm_response(qvvrStruct);
// } catch (Exception exception) {
// exception.printStackTrace();
// }
ResponsibilityAlgorithm responsibilityAlgorithm = new ResponsibilityAlgorithm();
qvvrDataEntity = responsibilityAlgorithm.getResponsibilityResult(qvvrDataEntity);
//至此接口调用结束,开始组装动态责任数据和用户责任量化结果
//首先判断cal_ok的标识位是否为1为0表示程序没有计算出结果
if (qvvrStruct.cal_ok == 0) {
if (qvvrDataEntity.calOk == 0) {
throw new BusinessException(AdvanceResponseEnum.RESPONSIBILITY_PARAMETER_ERROR);
}
//没问题后,先玩动态责任数据
CustomerData[] customerDatas = new CustomerData[qvvrStruct.p_node];
PDataStruct[] fKdata/*无背景的动态责任数据*/ = qvvrStruct.getFKdata();
CustomerData[] customerDatas = new CustomerData[qvvrDataEntity.pNode];
float[][] fKdata/*无背景的动态责任数据*/ = qvvrDataEntity.getFKData();
//第一个时间节点是起始时间+win窗口得到的时间
Date sTime = DateUtil.parse(dateStr.get(0).concat(" 00:00:00"), DatePattern.NORM_DATETIME_PATTERN);
Calendar calendar = Calendar.getInstance();
calendar.setTime(sTime);
calendar.add(Calendar.MINUTE, (win - 1) * userIntervalTime);
List<Long> timeDatas = new ArrayList<>();
for (int i = 0; i < qvvrStruct.p_num - qvvrStruct.win; i++) {
for (int i = 0; i < qvvrDataEntity.pNum - qvvrDataEntity.win; i++) {
calendar.add(Calendar.MINUTE, userIntervalTime);
//一个时间点所有的用户数据
PDataStruct fKdatum = fKdata[i];
for (int k = 0; k < qvvrStruct.p_node; k++) {
float[] fKdatum = fKdata[i];
for (int k = 0; k < qvvrDataEntity.pNode; k++) {
CustomerData customerData = customerDatas[k];
if (null == customerData) {
customerData = new CustomerData();
customerData.setCustomerName(names.get(k));
}
List<Float> valueDatas = customerData.getValueDatas();
Float valueTemp = fKdatum.getP()[k];
Float valueTemp = fKdatum[k];
if (valueTemp.isNaN()) {
valueTemp = 0.0f;
}
@@ -273,7 +268,7 @@ public class RespDataServiceImpl extends ServiceImpl<RespDataMapper, RespData> i
customerDataTemp.put(name, customerData);
}
//动态数据组装完成后,开始组装责任数据
List<CustomerResponsibility> customerResponsibilities = getCustomerResponsibilityData(names, qvvrStruct.sumFKdata, qvvrStruct.p_node);
List<CustomerResponsibility> customerResponsibilities = getCustomerResponsibilityData(names, qvvrDataEntity.sumFKdata, qvvrDataEntity.pNode);
//根据前十的用户数据,获取这些用户的动态责任数据
List<CustomerData> customerData = new ArrayList<>();
for (CustomerResponsibility customerResponsibility : customerResponsibilities) {
@@ -378,9 +373,10 @@ public class RespDataServiceImpl extends ServiceImpl<RespDataMapper, RespData> i
String customerPath = fileStorageUtil.uploadStream(customerStream, OssPath.RESPONSIBILITY_USER_RESULT_DATA, FileUtil.generateFileName("json"));
respDataResult.setUserDetailData(customerPath);
//调用qvvr生成的中间数据
CacheQvvrData cacheQvvrData = new CacheQvvrData(qvvrStruct.getP_node(), qvvrStruct.getHarm_num(), qvvrStruct.getHarm_data(), qvvrStruct.FKdata, qvvrStruct.HKdata, names, userIntervalTime, qvvrStruct.win, userIntervalTime, respHarmData.getHarmTime());
JSONObject cacheQvvrDataDataJson = (JSONObject) JSONObject.toJSON(cacheQvvrData);
InputStream cacheQvvrDataStream = IoUtil.toStream(cacheQvvrDataDataJson.toString(), CharsetUtil.UTF_8);
CacheQvvrData cacheQvvrData = new CacheQvvrData(qvvrDataEntity.getPNode(), qvvrDataEntity.getHarmNum(), qvvrDataEntity.getHarmData(), qvvrDataEntity.fKData, qvvrDataEntity.hKData, names, userIntervalTime, qvvrDataEntity.win, userIntervalTime, respHarmData.getHarmTime());
// JSONObject cacheQvvrDataDataJson = (JSONObject) JSONObject.toJSON(cacheQvvrData);
String cacheJson = PubUtils.obj2json(cacheQvvrData);
InputStream cacheQvvrDataStream = IoUtil.toStream(cacheJson, CharsetUtil.UTF_8);
String cacheQvvrDataPath = fileStorageUtil.uploadStream(cacheQvvrDataStream, OssPath.RESPONSIBILITY_USER_RESULT_DATA, FileUtil.generateFileName("json"));
respDataResult.setQvvrData(cacheQvvrDataPath);
//用户前10数据存储
@@ -422,7 +418,9 @@ public class RespDataServiceImpl extends ServiceImpl<RespDataMapper, RespData> i
try {
InputStream fileStream = fileStorageUtil.getFileStream(respDataResultTemp.getQvvrData());
String qvvrDataStr = IoUtil.read(fileStream, CharsetUtil.UTF_8);
cacheQvvrData = JSONObject.parseObject(qvvrDataStr, CacheQvvrData.class);
// cacheQvvrData = JSONObject.parseObject(qvvrDataStr, CacheQvvrData.class);
cacheQvvrData = PubUtils.json2obj(qvvrDataStr,CacheQvvrData.class);
} catch (Exception exception) {
throw new BusinessException(AdvanceResponseEnum.RESP_RESULT_DATA_NOT_FOUND);
}
@@ -443,25 +441,25 @@ public class RespDataServiceImpl extends ServiceImpl<RespDataMapper, RespData> i
//间隔中的时间长度
int minus = timeEndIndex - timeStartIndex + 1;
//组装参数
QvvrStruct qvvrStruct = new QvvrStruct();
qvvrStruct.cal_flag = 1;
qvvrStruct.p_node = cacheQvvrData.getPNode();
qvvrStruct.harm_mk = responsibilitySecondCalParam.getLimitValue();
qvvrStruct.win = win;
QvvrDataEntity qvvrDataEntity = new QvvrDataEntity();
qvvrDataEntity.calFlag = 1;
qvvrDataEntity.pNode = cacheQvvrData.getPNode();
qvvrDataEntity.harmMk = responsibilitySecondCalParam.getLimitValue();
qvvrDataEntity.win = win;
int resNum;
PDataStruct[] FKdata = new PDataStruct[9600];
HKDataStruct[] HKdata = new HKDataStruct[9600];
float[][] FKdata = new float[9600][QvvrDataEntity.MAX_P_NODE];
float[][] HKdata = new float[9600][QvvrDataEntity.MAX_P_NODE + 1];
float[] harmData = new float[1440 * 100];
PDataStruct[] fKdataOriginal = cacheQvvrData.getFKdata();
HKDataStruct[] hKdataOriginal = cacheQvvrData.getHKdata();
float[][] fKdataOriginal = cacheQvvrData.getFKData();
float[][] hKdataOriginal = cacheQvvrData.getHKData();
float[] harmDataOriginal = cacheQvvrData.getHarmData();
//如果起始索引与截止索引的差值等于时间轴的长度,则说明用户没有选择限值时间,直接带入全部的原始数据,参与计算即可
if (minus == times.size()) {
qvvrStruct.harm_num = cacheQvvrData.getHarmNum();
qvvrStruct.res_num = cacheQvvrData.getHarmNum() - cacheQvvrData.getWin();
qvvrStruct.setFKdata(cacheQvvrData.getFKdata());
qvvrStruct.setHKdata(cacheQvvrData.getHKdata());
qvvrStruct.harm_data = cacheQvvrData.getHarmData();
qvvrDataEntity.harmNum = cacheQvvrData.getHarmNum();
qvvrDataEntity.resNum = cacheQvvrData.getHarmNum() - cacheQvvrData.getWin();
qvvrDataEntity.setFKData(cacheQvvrData.getFKData());
qvvrDataEntity.setHKData(cacheQvvrData.getHKData());
qvvrDataEntity.harmData = cacheQvvrData.getHarmData();
} else {
if (win == 4) {
//当窗口为4时,两个时间限制范围在最小公倍数为15时最起码有5个有效时间点在最小公倍数为30时最起码有3个有效时间点
@@ -497,33 +495,39 @@ public class RespDataServiceImpl extends ServiceImpl<RespDataMapper, RespData> i
} else {
throw new BusinessException(AdvanceResponseEnum.CALCULATE_INTERVAL_ERROR);
}
qvvrStruct.res_num = resNum;
qvvrStruct.harm_num = minus;
qvvrDataEntity.resNum = resNum;
qvvrDataEntity.harmNum = minus;
//因为限值时间实际是含头含尾的所以harmNum需要索引差值+1
for (int i = timeStartIndex; i <= timeEndIndex; i++) {
harmData[i - timeStartIndex] = harmDataOriginal[i];
}
qvvrStruct.harm_data = harmData;
qvvrDataEntity.harmData = harmData;
//FKData与HKData的值则等于resNum
for (int i = timeStartIndex; i < timeStartIndex + resNum; i++) {
FKdata[i - timeStartIndex] = fKdataOriginal[i];
HKdata[i - timeStartIndex] = hKdataOriginal[i];
}
qvvrStruct.setFKdata(FKdata);
qvvrStruct.setHKdata(HKdata);
qvvrDataEntity.setFKData(FKdata);
qvvrDataEntity.setHKData(HKdata);
}
ResponsibilityCallDllOrSo responsibilityCallDllOrSo = new ResponsibilityCallDllOrSo("harm_response");
responsibilityCallDllOrSo.setPath();
ResponsibilityCallDllOrSo.ResponsibilityLibrary responsibilityLibrary = ResponsibilityCallDllOrSo.ResponsibilityLibrary.INSTANTCE;
responsibilityLibrary.harm_response(qvvrStruct);
if (qvvrStruct.cal_ok == 0) {
// ResponsibilityCallDllOrSo responsibilityCallDllOrSo = new ResponsibilityCallDllOrSo("harm_response");
// responsibilityCallDllOrSo.setPath();
// ResponsibilityCallDllOrSo.ResponsibilityLibrary responsibilityLibrary = ResponsibilityCallDllOrSo.ResponsibilityLibrary.INSTANTCE;
// responsibilityLibrary.harm_response(qvvrStruct);
// if (qvvrStruct.cal_ok == 0) {
// throw new BusinessException(AdvanceResponseEnum.RESPONSIBILITY_PARAMETER_ERROR);
// }
ResponsibilityAlgorithm responsibilityAlgorithm = new ResponsibilityAlgorithm();
qvvrDataEntity = responsibilityAlgorithm.getResponsibilityResult(qvvrDataEntity);
if (qvvrDataEntity.calOk == 0) {
throw new BusinessException(AdvanceResponseEnum.RESPONSIBILITY_PARAMETER_ERROR);
}
//没问题后,先玩动态责任数据
List<String> names = cacheQvvrData.getNames();
CustomerData[] customerDatas = new CustomerData[qvvrStruct.p_node];
PDataStruct[] fKdata/*无背景的动态责任数据*/ = qvvrStruct.getFKdata();
CustomerData[] customerDatas = new CustomerData[qvvrDataEntity.pNode];
float[][] fKdata/*无背景的动态责任数据*/ = qvvrDataEntity.getFKData();
//第一个时间节点是起始时间+win窗口得到的时间
Date sTime = new Date();
sTime.setTime(times.get(timeStartIndex));
@@ -531,18 +535,18 @@ public class RespDataServiceImpl extends ServiceImpl<RespDataMapper, RespData> i
calendar.setTime(sTime);
calendar.add(Calendar.MINUTE, (win - 1) * minMultiple);
List<Long> timeDatas = new ArrayList<>();
for (int i = 0; i < qvvrStruct.harm_num - qvvrStruct.win; i++) {
for (int i = 0; i < qvvrDataEntity.harmNum - qvvrDataEntity.win; i++) {
calendar.add(Calendar.MINUTE, minMultiple);
//一个时间点所有的用户数据
PDataStruct fKdatum = fKdata[i];
for (int k = 0; k < qvvrStruct.p_node; k++) {
float[] fKdatum = fKdata[i];
for (int k = 0; k < qvvrDataEntity.pNode; k++) {
CustomerData customerData = customerDatas[k];
if (null == customerData) {
customerData = new CustomerData();
customerData.setCustomerName(names.get(k));
}
List<Float> valueDatas = customerData.getValueDatas();
Float valueTemp = fKdatum.getP()[k];
Float valueTemp = fKdatum[k];
if (valueTemp.isNaN()) {
valueTemp = 0.0f;
}
@@ -568,8 +572,8 @@ public class RespDataServiceImpl extends ServiceImpl<RespDataMapper, RespData> i
customerDataTemp.put(name, customerData);
}
//调用程序接口后,首先组装责任量化结果
float[] sumFKdata = qvvrStruct.sumFKdata;
List<CustomerResponsibility> customerResponsibilities = getCustomerResponsibilityData(names, sumFKdata, qvvrStruct.p_node);
float[] sumFKdata = qvvrDataEntity.sumFKdata;
List<CustomerResponsibility> customerResponsibilities = getCustomerResponsibilityData(names, sumFKdata, qvvrDataEntity.pNode);
//根据前十的用户数据,获取这些用户的动态责任数据
List<CustomerData> customerData = new ArrayList<>();