完成责任量化功能

This commit is contained in:
2023-07-26 11:20:12 +08:00
parent ae00d7671d
commit c3f8592160
104 changed files with 4709 additions and 1670 deletions

View File

@@ -0,0 +1,52 @@
package com.njcn.advance.enums;
import lombok.Getter;
/**
* @author hongawen
* @version 1.0.0
* @date 2021年04月13日 10:50
*/
@Getter
public enum AdvanceResponseEnum {
ANALYSIS_USER_DATA_ERROR("A0101","解析用采数据内容失败"),
INTERNAL_ERROR("A0101","系统内部异常"),
USER_DATA_EMPTY("A0101","用采数据内容为空"),
USER_DATA_NOT_FOUND("A0101","未找到用采数据"),
RESP_DATA_NOT_FOUND("A0101","未找到责任划分数据"),
WIN_TIME_ERROR("A0101","限值时间小于窗口"),
CALCULATE_INTERVAL_ERROR("A0101","对齐计算间隔值非法"),
RESP_RESULT_DATA_NOT_FOUND("A0101","未找到责任划分缓存数据"),
USER_DATA_P_NODE_PARAMETER_ERROR("A0101","无用采用户或所有用户的完整性均不满足条件"),
RESPONSIBILITY_PARAMETER_ERROR("A0101","调用接口程序计算失败,参数非法")
;
private final String code;
private final String message;
AdvanceResponseEnum(String code, String message) {
this.code = code;
this.message = message;
}
public static String getCodeByMsg(String msg){
for (AdvanceResponseEnum userCodeEnum : AdvanceResponseEnum.values()) {
if (userCodeEnum.message.equalsIgnoreCase(msg)) {
return userCodeEnum.code;
}
}
return "";
}
}

View File

@@ -0,0 +1,48 @@
package com.njcn.advance.pojo.bo.responsibility;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
/**
* 当根据动态责任数据获取用户责任量化结果时,将需要的一些参数进行缓存
* 比如 harmNum,pNode,HKData,FKData,HarmData,监测点的测量间隔,win窗口最小公倍数
* 以及FKData每个时间点的p对应的用户List<name>
*
* @author hongawen
* @Date: 2019/4/29 16:06
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CacheQvvrData implements Serializable {
private int pNode;
private int harmNum;
private float[] harmData;
private PDataStruct[] FKdata;
private HKDataStruct[] HKdata;
private List<String> names;
private int lineInterval;
private int win;
//最小公倍数
private int minMultiple;
//横轴时间
private List<Long> times;
}

View File

@@ -0,0 +1,37 @@
package com.njcn.advance.pojo.bo.responsibility;
import lombok.Data;
import java.io.Serializable;
import java.util.*;
/**
* 处理用采原始数据得到的一个结果
*
* @author hongawen
* @Date: 2019/4/26 15:57
*/
@Data
public class DealDataResult implements Serializable {
/***
* String 户号@监测点号@户名
* String yyyy-MM-dd
* Date 数据的详细日期
* UserDataExcel 数据详细信息
* 先以测量局号分组,再以该测量局号下每个日期分组
*/
private Map<String, Map<String, Map<Date, UserDataExcel>>> totalData = new HashMap<>();
private List<String> dates = new ArrayList<>();
/***
* String 户号@监测点号@户名
* String yyyy-MM-dd
* UserDataExcel 数据详细信息
* 先以测量局号分组,再以该测量局号下每个日期分组
*/
private Map<String, Map<String, List<UserDataExcel>>> totalListData = new HashMap<>();
}

View File

@@ -0,0 +1,31 @@
package com.njcn.advance.pojo.bo.responsibility;
import com.njcn.advance.pojo.po.responsibility.RespUserDataIntegrity;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* 针对天处理用采数据的结果实体
* @author hongawen
* @Date: 2019/4/19 14:38
*/
@Data
public class DealUserDataResult implements Serializable {
//处理好的数据
private List<UserDataExcel> completed = new ArrayList<>();
//因当日完整性不足90没有处理直接返回
private List<UserDataExcel> lack = new ArrayList<>();
//完整性不足时,用户信息描述
private String detail;
//完整性不足的具体信息
private RespUserDataIntegrity respUserDataIntegrity;
}

View File

@@ -0,0 +1,37 @@
package com.njcn.advance.pojo.bo.responsibility;
import com.sun.jna.Structure;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
@Data
@NoArgsConstructor
public class HKDataStruct extends Structure implements Serializable {
public float hk[] = new float[QvvrStruct.MAX_P_NODE + 1];
@Override
protected List getFieldOrder() {
return null;
}
public HKDataStruct(double[] hk) {
for (int i = 0; i < hk.length; i++) {
this.hk[i] = (float) hk[i];
}
}
public static class ByReference extends HKDataStruct implements Structure.ByReference {
public ByReference(double[] p) {
super(p);
}
}
public static class ByValue extends HKDataStruct implements Structure.ByValue {
public ByValue(double[] p) {
super(p);
}
}
}

View File

@@ -0,0 +1,41 @@
package com.njcn.advance.pojo.bo.responsibility;
import com.sun.jna.Structure;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
@Data
@NoArgsConstructor
public class PDataStruct extends Structure implements Serializable {
public float p[] = new float[QvvrStruct.MAX_P_NODE];
@Override
protected List getFieldOrder() {
return null;
}
public PDataStruct(double[] p) {
for (int i = 0; i < p.length; i++) {
this.p[i] = (float) p[i];
}
}
public static class ByReference extends PDataStruct implements Structure.ByReference {
public ByReference(double[] p) {
super(p);
}
}
public static class ByValue extends PDataStruct implements Structure.ByValue {
public ByValue(double[] p) {
super(p);
}
}
}

View File

@@ -0,0 +1,200 @@
package com.njcn.advance.pojo.bo.responsibility;
import com.sun.jna.Structure;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
public class QvvrStruct extends Structure implements Serializable {
public static final int MAX_P_NODE= 200; //功率节点个数限制按200个限制
public static final int MAX_P_NUM= 96 * 100; //功率数据按15分钟间隔100天处理
public static final int MAX_HARM_NUM= 1440 * 100; //谐波数据按一分钟间隔100天处理
public static final int MAX_WIN_LEN=96 * 10; //按15分钟算10天
public static final int MIN_WIN_LEN = 4; //按15分钟算1小时
//输入参数
public int cal_flag; //计算标志0默认用电压和功率数据计算相关系数和责任1用代入的动态相关系数计算责任
public int harm_num; //谐波数据个数
public int p_num; //功率数据个数
public int p_node; //功率负荷节点数
public int win; //数据窗大小
public int res_num; //代入的责任数据个数
public float harm_mk; //谐波电压门槛
public float harm_data[]; //谐波数据序列
public PDataStruct p_data[]; //功率数据序列
public PDataStruct sim_data[]; //动态相关系数数据序列,可作为输入或者输出
public PDataStruct FKdata[]; //不包含背景动态谐波责任数据序列,可作为输入或者输出
public HKDataStruct HKdata[]; //包含背景动态谐波责任数据序列,可作为输入或者输出
public float Core[]; //典则相关系数
public float BjCore[]; //包含背景典则相关系数
//输出结果
public int cal_ok; //是否计算正确标志置位0表示未计算置位1表示计算完成
public float sumFKdata[];//不包含背景谐波责任
public float sumHKdata[];//包含背景谐波责任
public QvvrStruct() {
cal_flag = 0;
harm_data = new float[MAX_HARM_NUM];
p_data = new PDataStruct[MAX_P_NUM];
sim_data = new PDataStruct[MAX_P_NUM];
FKdata = new PDataStruct[MAX_P_NUM];
HKdata = new HKDataStruct[MAX_P_NUM];
Core = new float[MAX_P_NUM];
BjCore = new float[MAX_P_NUM];
sumFKdata = new float[MAX_P_NODE];
sumHKdata = new float[MAX_P_NODE + 1];
}
public static class ByReference extends QvvrStruct implements Structure.ByReference {
}
public static class ByValue extends QvvrStruct implements Structure.ByValue {
}
public PDataStruct[] getFKdata() {
return FKdata;
}
public void setFKdata(PDataStruct[] FKdata) {
this.FKdata = FKdata;
}
public HKDataStruct[] getHKdata() {
return HKdata;
}
public void setHKdata(HKDataStruct[] HKdata) {
this.HKdata = HKdata;
}
public float[] getSumFKdata() {
return sumFKdata;
}
public void setSumFKdata(float[] sumFKdata) {
this.sumFKdata = sumFKdata;
}
public float[] getSumHKdata() {
return sumHKdata;
}
public void setSumHKdata(float[] sumHKdata) {
this.sumHKdata = sumHKdata;
}
public int getCal_flag() {
return cal_flag;
}
public void setCal_flag(int cal_flag) {
this.cal_flag = cal_flag;
}
public int getHarm_num() {
return harm_num;
}
public void setHarm_num(int harm_num) {
this.harm_num = harm_num;
}
public float getHarm_mk() {
return harm_mk;
}
public void setHarm_mk(float harm_mk) {
this.harm_mk = harm_mk;
}
public float[] getHarm_data() {
return harm_data;
}
public void setHarm_data(float[] harm_data) {
this.harm_data = harm_data;
}
public float[] getCore() {
return Core;
}
public void setCore(float[] core) {
Core = core;
}
public float[] getBjCore() {
return BjCore;
}
public void setBjCore(float[] bjCore) {
BjCore = bjCore;
}
public int getCal_ok() {
return cal_ok;
}
public void setCal_ok(int cal_ok) {
this.cal_ok = cal_ok;
}
public int getP_num() {
return p_num;
}
public void setP_num(int p_num) {
this.p_num = p_num;
}
public int getP_node() {
return p_node;
}
public void setP_node(int p_node) {
this.p_node = p_node;
}
public int getWin() {
return win;
}
public void setWin(int win) {
this.win = win;
}
public int getRes_num() {
return res_num;
}
public void setRes_num(int res_num) {
this.res_num = res_num;
}
public PDataStruct[] getP_data() {
return p_data;
}
public void setP_data(PDataStruct[] p_data) {
this.p_data = p_data;
}
public PDataStruct[] getSim_data() {
return sim_data;
}
public void setSim_data(PDataStruct[] sim_data) {
this.sim_data = sim_data;
}
@Override
protected List getFieldOrder() {
return Arrays.asList(new String[]{"sumFKdata", "sumHKdata"});
}
}

View File

@@ -0,0 +1,47 @@
package com.njcn.advance.pojo.bo.responsibility;
import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 提取用采数据或者将用采数据写进excel的实体类
*
* @author hongawen
* @date 2019/4/11 10:43
*/
@Data
public class UserDataExcel implements Serializable, Comparable<UserDataExcel> {
@Excel(name = "时间")
private String time;
@Excel(name = "瞬时功率")
private BigDecimal work;
@Excel(name = "户号")
private String userId;
@Excel(name = "测量点局号")
private String line;
@Excel(name = "户名")
private String userName;
@Override
public int compareTo(UserDataExcel o) {
if (DateUtil.parse(this.time, DatePattern.NORM_DATETIME_PATTERN).getTime() > DateUtil.parse(o.getTime(), DatePattern.NORM_DATETIME_PATTERN).getTime()) {
return 1;
} else if (DateUtil.parse(this.time, DatePattern.NORM_DATETIME_PATTERN).getTime() == DateUtil.parse(o.getTime(), DatePattern.NORM_DATETIME_PATTERN).getTime()) {
return 0;
}
return -1;
}
}

View File

@@ -0,0 +1,27 @@
package com.njcn.advance.pojo.dto.responsibility;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* @author hongawen
* @Date: 2019/4/3 13:34
*/
@Data
public class CustomerData implements Serializable {
/***
* 用户名称
*/
private String customerName;
/***
* 每时刻的数据
*/
private List<Float> valueDatas=new ArrayList<>();
}

View File

@@ -0,0 +1,28 @@
package com.njcn.advance.pojo.dto.responsibility;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author hongawen
* @Date: 2019/4/3 13:35
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CustomerResponsibility implements Serializable {
/***
* 用户名
*/
private String customerName;
/***
* 责任值
*/
private float responsibilityData;
}

View File

@@ -0,0 +1,29 @@
package com.njcn.advance.pojo.dto.responsibility;
import com.njcn.advance.pojo.po.responsibility.RespData;
import lombok.Data;
import java.io.Serializable;
/**
* @author hongawen
* @version 1.0.0
* @date 2023年07月24日 17:49
*/
@Data
public class RespDataDTO extends RespData implements Serializable {
private String userDataName;
private String gdName;
private String subName;
private String devName;
private String ip;
private String lineName;
}

View File

@@ -0,0 +1,53 @@
package com.njcn.advance.pojo.dto.responsibility;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* 谐波责任量化最终结果,包括动态数据和责任量化结果
*
* @author hongawen
* @Date: 2019/4/3 15:00
*/
@Data
public class ResponsibilityResult implements Serializable {
/***
* 限值
*/
private String limitValue;
/***
* 指定起始时间
*/
private String limitSTime;
/***
* 指定结束时间
*/
private String limitETime;
/***
* 责任划分结果存库数据
*/
private String responsibilityDataIndex;
/***
* 每个用户的详细时刻的责任数据
*/
private List<CustomerData> datas;
/***
* 时间轴
*/
private List<Long> timeDatas=new ArrayList<>();
/***
* 用户责任的表格数据
*/
private List<CustomerResponsibility> responsibilities;
}

View File

@@ -0,0 +1,50 @@
package com.njcn.advance.pojo.param;
import com.njcn.common.pojo.constant.PatternRegex;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import java.io.Serializable;
/**
* @author hongawen
* @version 1.0.0
* @date 2023年07月21日 10:20
*/
@Data
public class ResponsibilityCalculateParam implements Serializable {
@ApiModelProperty("开始时间")
@NotBlank(message = "参数不能为空")
@Pattern(regexp = PatternRegex.TIME_FORMAT, message = "时间格式错误")
private String searchBeginTime;
@ApiModelProperty("结束时间")
@NotBlank(message = "参数不能为空")
@Pattern(regexp = PatternRegex.TIME_FORMAT, message = "时间格式错误")
private String searchEndTime;
@NotBlank(message = "参数不能为空")
@ApiModelProperty("监测点索引")
private String lineId;
@NotBlank(message = "参数不能为空")
@ApiModelProperty("用采数据索引")
private String userDataId;
@Min(0)
@Max(1)
@ApiModelProperty("0-电流 1-电压")
private int type;
@Min(2)
@Max(50)
@ApiModelProperty("谐波次数")
private Integer time;
}

View File

@@ -0,0 +1,46 @@
package com.njcn.advance.pojo.param;
import com.njcn.common.pojo.constant.PatternRegex;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import java.io.Serializable;
/**
* @author hongawen
* @version 1.0.0
* @date 2023年07月24日 15:47
*/
@Data
public class ResponsibilitySecondCalParam implements Serializable {
@NotBlank(message = "参数不能为空")
@ApiModelProperty("责任数据索引")
private String resDataId;
@Min(2)
@Max(50)
@ApiModelProperty("谐波次数")
private Integer time;
@Min(0)
@Max(1)
@ApiModelProperty("0-电流 1-电压")
private int type;
@ApiModelProperty("限值")
private float limitValue;
@ApiModelProperty("开始时间(yyyy-MM-dd HH:mm:ss)")
@NotBlank(message = "参数不能为空")
private String limitStartTime;
@ApiModelProperty("结束时间(yyyy-MM-dd HH:mm:ss)")
@NotBlank(message = "参数不能为空")
private String limitEndTime;
}

View File

@@ -0,0 +1,19 @@
package com.njcn.advance.pojo.param;
import com.njcn.web.pojo.param.BaseParam;
import lombok.Data;
import java.io.Serializable;
/**
* @author hongawen
* @version 1.0.0
* @date 2023年07月25日 14:14
*/
@Data
public class UserDataIntegrityParam extends BaseParam implements Serializable {
private String userDataId;
}

View File

@@ -0,0 +1,57 @@
package com.njcn.advance.pojo.po.responsibility;
import com.baomidou.mybatisplus.annotation.TableName;
import com.njcn.db.bo.BaseEntity;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
/**
*
* @author hongawen
* @since 2023-07-21
*/
@Getter
@Setter
@TableName("pqs_resp_data")
public class RespData extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 责任量化数据结果
*/
private String id;
/**
* 监测点索引
*/
private String lineId;
/**
* 用采数据索引
*/
private String userDataId;
/**
* 谐波类型(谐波电压、谐波电流)
*/
private String dataType;
/**
* 谐波次数
*/
private String dataTimes;
/**
* 计算的时间窗口
*/
private String timeWindow;
/**
* 状态0 删除 1正常
*/
private Integer state;
}

View File

@@ -0,0 +1,82 @@
package com.njcn.advance.pojo.po.responsibility;
import com.baomidou.mybatisplus.annotation.TableName;
import com.njcn.db.bo.BaseEntity;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;
/**
* <p>
*
* </p>
*
* @author hongawen
* @since 2023-07-24
*/
@Getter
@Setter
@TableName("pqs_resp_data_result")
public class RespDataResult extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 责任划分结果数据文件保存记录表
*/
private String id;
/**
* 责任划分结果表id
*/
private String resDataId;
/**
* 限值
*/
private Float limitValue;
/***
* 起始时间
*/
private Date startTime;
/***
* 结束时间
*/
private Date endTime;
/**
* 谐波次数
*/
private Integer time;
/**
* 用户责任数据地址
*/
private String userDetailData;
/**
* 用户责任时间数据地址
*/
private String timeData;
/**
* 前10用户的每刻对应的责任数据地址
*/
private String userResponsibility;
/**
* 调用高级算法后的数据结果地址,提供二次计算
*/
private String qvvrData;
/**
* 状态0 删除 1正常
*/
private Integer state;
}

View File

@@ -0,0 +1,60 @@
package com.njcn.advance.pojo.po.responsibility;
import com.baomidou.mybatisplus.annotation.TableName;
import com.njcn.db.bo.BaseEntity;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
/**
*
* @author hongawen
* @since 2023-07-13
*/
@Getter
@Setter
@TableName("pqs_resp_user_data")
public class RespUserData extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 用采数据表id
*/
private String id;
/**
* 用采数据名称
*/
private String name;
/**
* 起始日期
*/
private LocalDate startTime;
/**
* 截止日期
*/
private LocalDate endTime;
/**
* 0 存在数据不完整的1 存在数据完整
*/
private Integer integrity = 1;
/**
* 用采数据存放地址
*/
private String dataPath;
/**
* 状态0 删除 1正常
*/
private Integer state;
}

View File

@@ -0,0 +1,64 @@
package com.njcn.advance.pojo.po.responsibility;
import com.baomidou.mybatisplus.annotation.TableName;
import com.njcn.db.bo.BaseEntity;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
/**
*
* @author hongawen
* @since 2023-07-13
*/
@Getter
@Setter
@TableName("pqs_resp_user_data_integrity")
public class RespUserDataIntegrity extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 用采数据完整不足表Id
*/
private String id;
/**
* 用采数据表id
*/
private String userDataId;
/**
* 用户名称
*/
private String userName;
/**
* 用户户号
*/
private String userNo;
/**
* 测量点局号
*/
private String lineNo;
/**
* 数据不完整的日期
*/
private LocalDate lackDate;
/**
* 完整率低于90%会记录)
*/
private BigDecimal integrity;
/**
* 状态0 删除 1正常
*/
private Integer state;
}