Compare commits
6 Commits
587e936554
...
2026-06
| Author | SHA1 | Date | |
|---|---|---|---|
| 274d787b04 | |||
| ac40e92c79 | |||
| 88cd32dd10 | |||
| c5c4f6e31b | |||
| 79374ea6ec | |||
| 0b950b3c35 |
@@ -51,6 +51,12 @@ public class DataComAssServiceImpl implements IDataComAssService {
|
||||
@Resource
|
||||
private PqDataVerifyFeignClient pqDataVerifyFeignClient;
|
||||
|
||||
/**
|
||||
* 查询配置 辽宁版本比较特殊,没有CP95值,采用平均值进行判断
|
||||
*/
|
||||
@Value("${version.used:master}")
|
||||
private String versionUsed;
|
||||
|
||||
@Override
|
||||
public void dataComAssHandler(CalculatedParam calculatedParam) {
|
||||
List<DataComassesDPO> list = new ArrayList<>();
|
||||
@@ -138,7 +144,7 @@ public class DataComAssServiceImpl implements IDataComAssService {
|
||||
BigDecimal hundred = BigDecimal.valueOf(100);
|
||||
//************************************电压偏差********************************************
|
||||
lineParam.setPhasicType(Arrays.asList("A", "B", "C"));
|
||||
lineParam.setValueType(Arrays.asList("AVG"));
|
||||
lineParam.setValueType(Collections.singletonList("AVG"));
|
||||
lineParam.setColumnName("vu_dev");
|
||||
lineParam.setGe("10");
|
||||
Integer vuDev1 = dataVFeignClient.getColumnNameCountRawData(lineParam).getData();
|
||||
@@ -169,6 +175,7 @@ public class DataComAssServiceImpl implements IDataComAssService {
|
||||
//************************************频率偏差********************************************
|
||||
lineParam.setColumnName("freq_dev");
|
||||
lineParam.setGe("0.3");
|
||||
lineParam.setGe(null);
|
||||
Integer freqDev1 = dataVFeignClient.getColumnNameCountRawData(lineParam).getData();
|
||||
|
||||
lineParam.setGe("0.2");
|
||||
@@ -196,8 +203,15 @@ public class DataComAssServiceImpl implements IDataComAssService {
|
||||
}
|
||||
//************************************谐波畸变率********************************************
|
||||
lineParam.setColumnName("v_thd");
|
||||
lineParam.setValueType(Arrays.asList("CP95"));
|
||||
|
||||
if("liaoning".equals(versionUsed)){
|
||||
lineParam.setValueType(Collections.singletonList("AVG"));
|
||||
}else {
|
||||
lineParam.setValueType(Collections.singletonList("CP95"));
|
||||
}
|
||||
|
||||
lineParam.setGe("6");
|
||||
lineParam.setLt(null);
|
||||
Integer vThd1 = dataVFeignClient.getColumnNameCountRawData(lineParam).getData();
|
||||
|
||||
lineParam.setGe("4");
|
||||
@@ -226,7 +240,12 @@ public class DataComAssServiceImpl implements IDataComAssService {
|
||||
|
||||
//************************************三相电压不平衡度********************************************
|
||||
lineParam.setColumnName("v_unbalance");
|
||||
if("liaoning".equals(versionUsed)){
|
||||
lineParam.setValueType(Collections.singletonList("MAX"));
|
||||
}
|
||||
lineParam.setPhasicType(Collections.singletonList("T"));
|
||||
lineParam.setGe("4");
|
||||
lineParam.setLt(null);
|
||||
Integer vUnbalance1 = dataVFeignClient.getColumnNameCountRawData(lineParam).getData();
|
||||
|
||||
lineParam.setGe("2");
|
||||
@@ -255,7 +274,9 @@ public class DataComAssServiceImpl implements IDataComAssService {
|
||||
//************************************电压波动(短时闪变)********************************************
|
||||
lineParam.setColumnName("pst");
|
||||
lineParam.setValueType(null);
|
||||
lineParam.setPhasicType(Arrays.asList("A", "B", "C"));
|
||||
lineParam.setGe("0.8");
|
||||
lineParam.setLt("1");
|
||||
Integer plt1 = dataFlickerFeignClient.getColumnNameCountRawData(lineParam).getData();
|
||||
|
||||
lineParam.setGe("0.6");
|
||||
@@ -275,11 +296,11 @@ public class DataComAssServiceImpl implements IDataComAssService {
|
||||
Integer plt5 = dataFlickerFeignClient.getColumnNameCountRawData(lineParam).getData();
|
||||
BigDecimal pltAll = BigDecimal.valueOf(plt1 + plt2 + plt3 + plt4 + plt5);
|
||||
if (pltAll.compareTo(BigDecimal.ZERO) != 0) {
|
||||
outMap.put("data_plt1", BigDecimal.valueOf(plt1).multiply(hundred).divide(pltAll, 3, RoundingMode.HALF_UP));
|
||||
outMap.put("data_plt2", BigDecimal.valueOf(plt2).multiply(hundred).divide(pltAll, 3, RoundingMode.HALF_UP));
|
||||
outMap.put("data_plt3", BigDecimal.valueOf(plt3).multiply(hundred).divide(pltAll, 3, RoundingMode.HALF_UP));
|
||||
outMap.put("data_plt4", BigDecimal.valueOf(plt4).multiply(hundred).divide(pltAll, 3, RoundingMode.HALF_UP));
|
||||
outMap.put("data_plt5", BigDecimal.valueOf(plt5).multiply(hundred).divide(pltAll, 3, RoundingMode.HALF_UP));
|
||||
outMap.put("data_pst1", BigDecimal.valueOf(plt1).multiply(hundred).divide(pltAll, 3, RoundingMode.HALF_UP));
|
||||
outMap.put("data_pst2", BigDecimal.valueOf(plt2).multiply(hundred).divide(pltAll, 3, RoundingMode.HALF_UP));
|
||||
outMap.put("data_pst3", BigDecimal.valueOf(plt3).multiply(hundred).divide(pltAll, 3, RoundingMode.HALF_UP));
|
||||
outMap.put("data_pst4", BigDecimal.valueOf(plt4).multiply(hundred).divide(pltAll, 3, RoundingMode.HALF_UP));
|
||||
outMap.put("data_pst5", BigDecimal.valueOf(plt5).multiply(hundred).divide(pltAll, 3, RoundingMode.HALF_UP));
|
||||
}
|
||||
|
||||
if (!CollUtil.isEmpty(outMap)) {
|
||||
|
||||
@@ -21,6 +21,7 @@ import com.njcn.device.biz.commApi.CommLineClient;
|
||||
import com.njcn.device.biz.pojo.dto.LineDTO;
|
||||
import com.njcn.device.pms.pojo.param.MonitorTerminalParam;
|
||||
import com.njcn.device.pq.api.LineFeignClient;
|
||||
import com.njcn.device.pq.api.UserLedgerFeignClient;
|
||||
import com.njcn.device.pq.pojo.vo.LineDetailDataVO;
|
||||
import com.njcn.event.api.EventDetailFeignClient;
|
||||
import com.njcn.event.api.TransientFeignClient;
|
||||
@@ -84,7 +85,7 @@ public class SpecialAnalysisServiceImpl implements ISpecialAnalysisService {
|
||||
@Resource
|
||||
private CommLineClient commLineClient;
|
||||
@Resource
|
||||
private UserLedgerOldFeignClient userLedgerFeignClient;
|
||||
private UserLedgerFeignClient userLedgerFeignClient;
|
||||
@Resource
|
||||
private DataLimitRateDetailFeignClient dataLimitRateDetailFeignClient;
|
||||
|
||||
|
||||
@@ -2,10 +2,7 @@ package com.njcn.dataProcess.api;
|
||||
|
||||
import com.njcn.common.pojo.constant.ServerInfo;
|
||||
import com.njcn.common.pojo.response.HttpResult;
|
||||
import com.njcn.dataProcess.api.fallback.RmpEventFeignClientFallbackFactory;
|
||||
import com.njcn.dataProcess.api.fallback.SpThroughFeignClientFallbackFactory;
|
||||
import com.njcn.dataProcess.dto.RmpEventDetailDTO;
|
||||
import com.njcn.dataProcess.param.LineCountEvaluateParam;
|
||||
import com.njcn.dataProcess.pojo.dto.RActivePowerRangeDto;
|
||||
import com.njcn.dataProcess.pojo.dto.SpThroughDto;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
|
||||
@@ -214,111 +214,111 @@ public class DataHarmpowerP {
|
||||
private Double p50;
|
||||
|
||||
//在线监测添加的字段
|
||||
@Column(name = "totPf")
|
||||
private Double totPf;
|
||||
@Column(name = "totDf")
|
||||
private Double totDf;
|
||||
@Column(name = "totP")
|
||||
@Column(name = "tot_p")
|
||||
private Double totP;
|
||||
@Column(name = "totP1")
|
||||
@Column(name = "tot_df")
|
||||
private Double totDf;
|
||||
@Column(name = "tot_pf")
|
||||
private Double totPf;
|
||||
@Column(name = "tot_tp_1")
|
||||
private Double totP1;
|
||||
@Column(name = "totP2")
|
||||
@Column(name = "tot_tp_2")
|
||||
private Double totP2;
|
||||
@Column(name = "totP3")
|
||||
@Column(name = "tot_tp_3")
|
||||
private Double totP3;
|
||||
@Column(name = "totP4")
|
||||
@Column(name = "tot_tp_4")
|
||||
private Double totP4;
|
||||
@Column(name = "totP5")
|
||||
@Column(name = "tot_tp_5")
|
||||
private Double totP5;
|
||||
@Column(name = "totP6")
|
||||
@Column(name = "tot_tp_6")
|
||||
private Double totP6;
|
||||
@Column(name = "totP7")
|
||||
@Column(name = "tot_tp_7")
|
||||
private Double totP7;
|
||||
@Column(name = "totP8")
|
||||
@Column(name = "tot_tp_8")
|
||||
private Double totP8;
|
||||
@Column(name = "totP9")
|
||||
@Column(name = "tot_tp_9")
|
||||
private Double totP9;
|
||||
@Column(name = "totP10")
|
||||
@Column(name = "tot_tp_10")
|
||||
private Double totP10;
|
||||
@Column(name = "totP11")
|
||||
@Column(name = "tot_tp_11")
|
||||
private Double totP11;
|
||||
@Column(name = "totP12")
|
||||
@Column(name = "tot_tp_12")
|
||||
private Double totP12;
|
||||
@Column(name = "totP13")
|
||||
@Column(name = "tot_tp_13")
|
||||
private Double totP13;
|
||||
@Column(name = "totP14")
|
||||
@Column(name = "tot_tp_14")
|
||||
private Double totP14;
|
||||
@Column(name = "totP15")
|
||||
@Column(name = "tot_tp_15")
|
||||
private Double totP15;
|
||||
@Column(name = "totP16")
|
||||
@Column(name = "tot_tp_16")
|
||||
private Double totP16;
|
||||
@Column(name = "totP17")
|
||||
@Column(name = "tot_tp_17")
|
||||
private Double totP17;
|
||||
@Column(name = "totP18")
|
||||
@Column(name = "tot_tp_18")
|
||||
private Double totP18;
|
||||
@Column(name = "totP19")
|
||||
@Column(name = "tot_tp_19")
|
||||
private Double totP19;
|
||||
@Column(name = "totP20")
|
||||
@Column(name = "tot_tp_20")
|
||||
private Double totP20;
|
||||
@Column(name = "totP21")
|
||||
@Column(name = "tot_tp_21")
|
||||
private Double totP21;
|
||||
@Column(name = "totP22")
|
||||
@Column(name = "tot_tp_22")
|
||||
private Double totP22;
|
||||
@Column(name = "totP23")
|
||||
@Column(name = "tot_tp_23")
|
||||
private Double totP23;
|
||||
@Column(name = "totP24")
|
||||
@Column(name = "tot_tp_24")
|
||||
private Double totP24;
|
||||
@Column(name = "totP25")
|
||||
@Column(name = "tot_tp_25")
|
||||
private Double totP25;
|
||||
@Column(name = "totP26")
|
||||
@Column(name = "tot_tp_26")
|
||||
private Double totP26;
|
||||
@Column(name = "totP27")
|
||||
@Column(name = "tot_tp_27")
|
||||
private Double totP27;
|
||||
@Column(name = "totP28")
|
||||
@Column(name = "tot_tp_28")
|
||||
private Double totP28;
|
||||
@Column(name = "totP29")
|
||||
@Column(name = "tot_tp_29")
|
||||
private Double totP29;
|
||||
@Column(name = "totP30")
|
||||
@Column(name = "tot_tp_30")
|
||||
private Double totP30;
|
||||
@Column(name = "totP31")
|
||||
@Column(name = "tot_tp_31")
|
||||
private Double totP31;
|
||||
@Column(name = "totP32")
|
||||
@Column(name = "tot_tp_32")
|
||||
private Double totP32;
|
||||
@Column(name = "totP33")
|
||||
@Column(name = "tot_tp_33")
|
||||
private Double totP33;
|
||||
@Column(name = "totP34")
|
||||
@Column(name = "tot_tp_34")
|
||||
private Double totP34;
|
||||
@Column(name = "totP35")
|
||||
@Column(name = "tot_tp_35")
|
||||
private Double totP35;
|
||||
@Column(name = "totP36")
|
||||
@Column(name = "tot_tp_36")
|
||||
private Double totP36;
|
||||
@Column(name = "totP37")
|
||||
@Column(name = "tot_tp_37")
|
||||
private Double totP37;
|
||||
@Column(name = "totP38")
|
||||
@Column(name = "tot_tp_38")
|
||||
private Double totP38;
|
||||
@Column(name = "totP39")
|
||||
@Column(name = "tot_tp_39")
|
||||
private Double totP39;
|
||||
@Column(name = "totP40")
|
||||
@Column(name = "tot_tp_40")
|
||||
private Double totP40;
|
||||
@Column(name = "totP41")
|
||||
@Column(name = "tot_tp_41")
|
||||
private Double totP41;
|
||||
@Column(name = "totP42")
|
||||
@Column(name = "tot_tp_42")
|
||||
private Double totP42;
|
||||
@Column(name = "totP43")
|
||||
@Column(name = "tot_tp_43")
|
||||
private Double totP43;
|
||||
@Column(name = "totP44")
|
||||
@Column(name = "tot_tp_44")
|
||||
private Double totP44;
|
||||
@Column(name = "totP45")
|
||||
@Column(name = "tot_tp_45")
|
||||
private Double totP45;
|
||||
@Column(name = "totP46")
|
||||
@Column(name = "tot_tp_46")
|
||||
private Double totP46;
|
||||
@Column(name = "totP47")
|
||||
@Column(name = "tot_tp_47")
|
||||
private Double totP47;
|
||||
@Column(name = "totP49")
|
||||
@Column(name = "tot_tp_49")
|
||||
private Double totP48;
|
||||
@Column(name = "totP49")
|
||||
@Column(name = "tot_tp_49")
|
||||
private Double totP49;
|
||||
@Column(name = "totP50")
|
||||
@Column(name = "tot_tp_50")
|
||||
private Double totP50;
|
||||
|
||||
|
||||
|
||||
@@ -208,107 +208,107 @@ public class DataHarmpowerQ {
|
||||
private Double q50;
|
||||
|
||||
//在线监测添加的字段
|
||||
@Column(name = "totQ")
|
||||
@Column(name = "tot_q")
|
||||
private Double totQ;
|
||||
@Column(name = "totQ1")
|
||||
@Column(name = "tot_tq_1")
|
||||
private Double totQ1;
|
||||
@Column(name = "totQ2")
|
||||
@Column(name = "tot_tq_2")
|
||||
private Double totQ2;
|
||||
@Column(name = "totQ3")
|
||||
@Column(name = "tot_tq_3")
|
||||
private Double totQ3;
|
||||
@Column(name = "totQ4")
|
||||
@Column(name = "tot_tq_4")
|
||||
private Double totQ4;
|
||||
@Column(name = "totQ5")
|
||||
@Column(name = "tot_tq_5")
|
||||
private Double totQ5;
|
||||
@Column(name = "totQ6")
|
||||
@Column(name = "tot_tq_6")
|
||||
private Double totQ6;
|
||||
@Column(name = "totQ7")
|
||||
@Column(name = "tot_tq_7")
|
||||
private Double totQ7;
|
||||
@Column(name = "totQ8")
|
||||
@Column(name = "tot_tq_8")
|
||||
private Double totQ8;
|
||||
@Column(name = "totQ9")
|
||||
@Column(name = "tot_tq_9")
|
||||
private Double totQ9;
|
||||
@Column(name = "totQ10")
|
||||
@Column(name = "tot_tq_10")
|
||||
private Double totQ10;
|
||||
@Column(name = "totQ11")
|
||||
@Column(name = "tot_tq_11")
|
||||
private Double totQ11;
|
||||
@Column(name = "totQ12")
|
||||
@Column(name = "tot_tq_12")
|
||||
private Double totQ12;
|
||||
@Column(name = "totQ13")
|
||||
@Column(name = "tot_tq_13")
|
||||
private Double totQ13;
|
||||
@Column(name = "totQ14")
|
||||
@Column(name = "tot_tq_14")
|
||||
private Double totQ14;
|
||||
@Column(name = "totQ15")
|
||||
@Column(name = "tot_tq_15")
|
||||
private Double totQ15;
|
||||
@Column(name = "totQ16")
|
||||
@Column(name = "tot_tq_16")
|
||||
private Double totQ16;
|
||||
@Column(name = "totQ17")
|
||||
@Column(name = "tot_tq_17")
|
||||
private Double totQ17;
|
||||
@Column(name = "totQ18")
|
||||
@Column(name = "tot_tq_18")
|
||||
private Double totQ18;
|
||||
@Column(name = "totQ19")
|
||||
@Column(name = "tot_tq_19")
|
||||
private Double totQ19;
|
||||
@Column(name = "totQ20")
|
||||
@Column(name = "tot_tq_20")
|
||||
private Double totQ20;
|
||||
@Column(name = "totQ21")
|
||||
@Column(name = "tot_tq_21")
|
||||
private Double totQ21;
|
||||
@Column(name = "totQ22")
|
||||
@Column(name = "tot_tq_22")
|
||||
private Double totQ22;
|
||||
@Column(name = "totQ23")
|
||||
@Column(name = "tot_tq_23")
|
||||
private Double totQ23;
|
||||
@Column(name = "totQ24")
|
||||
@Column(name = "tot_tq_24")
|
||||
private Double totQ24;
|
||||
@Column(name = "totQ25")
|
||||
@Column(name = "tot_tq_25")
|
||||
private Double totQ25;
|
||||
@Column(name = "totQ26")
|
||||
@Column(name = "tot_tq_26")
|
||||
private Double totQ26;
|
||||
@Column(name = "totQ27")
|
||||
@Column(name = "tot_tq_27")
|
||||
private Double totQ27;
|
||||
@Column(name = "totQ28")
|
||||
@Column(name = "tot_tq_28")
|
||||
private Double totQ28;
|
||||
@Column(name = "totQ29")
|
||||
@Column(name = "tot_tq_29")
|
||||
private Double totQ29;
|
||||
@Column(name = "totQ30")
|
||||
@Column(name = "tot_tq_30")
|
||||
private Double totQ30;
|
||||
@Column(name = "totQ31")
|
||||
@Column(name = "tot_tq_31")
|
||||
private Double totQ31;
|
||||
@Column(name = "totQ32")
|
||||
@Column(name = "tot_tq_32")
|
||||
private Double totQ32;
|
||||
@Column(name = "totQ33")
|
||||
@Column(name = "tot_tq_33")
|
||||
private Double totQ33;
|
||||
@Column(name = "totQ34")
|
||||
@Column(name = "tot_tq_34")
|
||||
private Double totQ34;
|
||||
@Column(name = "totQ35")
|
||||
@Column(name = "tot_tq_35")
|
||||
private Double totQ35;
|
||||
@Column(name = "totQ36")
|
||||
@Column(name = "tot_tq_36")
|
||||
private Double totQ36;
|
||||
@Column(name = "totQ37")
|
||||
@Column(name = "tot_tq_37")
|
||||
private Double totQ37;
|
||||
@Column(name = "totQ38")
|
||||
@Column(name = "tot_tq_38")
|
||||
private Double totQ38;
|
||||
@Column(name = "totQ39")
|
||||
@Column(name = "tot_tq_39")
|
||||
private Double totQ39;
|
||||
@Column(name = "totQ40")
|
||||
@Column(name = "tot_tq_40")
|
||||
private Double totQ40;
|
||||
@Column(name = "totQ41")
|
||||
@Column(name = "tot_tq_41")
|
||||
private Double totQ41;
|
||||
@Column(name = "totQ42")
|
||||
@Column(name = "tot_tq_42")
|
||||
private Double totQ42;
|
||||
@Column(name = "totQ43")
|
||||
@Column(name = "tot_tq_43")
|
||||
private Double totQ43;
|
||||
@Column(name = "totQ44")
|
||||
@Column(name = "tot_tq_44")
|
||||
private Double totQ44;
|
||||
@Column(name = "totQ45")
|
||||
@Column(name = "tot_tq_45")
|
||||
private Double totQ45;
|
||||
@Column(name = "totQ46")
|
||||
@Column(name = "tot_tq_46")
|
||||
private Double totQ46;
|
||||
@Column(name = "totQ47")
|
||||
@Column(name = "tot_tq_47")
|
||||
private Double totQ47;
|
||||
@Column(name = "totQ49")
|
||||
@Column(name = "tot_tq_49")
|
||||
private Double totQ48;
|
||||
@Column(name = "totQ49")
|
||||
@Column(name = "tot_tq_49")
|
||||
private Double totQ49;
|
||||
@Column(name = "totQ50")
|
||||
@Column(name = "tot_tq_50")
|
||||
private Double totQ50;
|
||||
|
||||
|
||||
|
||||
@@ -208,107 +208,107 @@ public class DataHarmpowerS {
|
||||
private Double s50;
|
||||
|
||||
//在线监测添加的字段
|
||||
@Column(name = "totS")
|
||||
@Column(name = "tot_s")
|
||||
private Double totS;
|
||||
@Column(name = "totS1")
|
||||
@Column(name = "tot_ts_1")
|
||||
private Double totS1;
|
||||
@Column(name = "totS2")
|
||||
@Column(name = "tot_ts_2")
|
||||
private Double totS2;
|
||||
@Column(name = "totS3")
|
||||
@Column(name = "tot_ts_3")
|
||||
private Double totS3;
|
||||
@Column(name = "totS4")
|
||||
@Column(name = "tot_ts_4")
|
||||
private Double totS4;
|
||||
@Column(name = "totS5")
|
||||
@Column(name = "tot_ts_5")
|
||||
private Double totS5;
|
||||
@Column(name = "totS6")
|
||||
@Column(name = "tot_ts_6")
|
||||
private Double totS6;
|
||||
@Column(name = "totS7")
|
||||
@Column(name = "tot_ts_7")
|
||||
private Double totS7;
|
||||
@Column(name = "totS8")
|
||||
@Column(name = "tot_ts_8")
|
||||
private Double totS8;
|
||||
@Column(name = "totS9")
|
||||
@Column(name = "tot_ts_9")
|
||||
private Double totS9;
|
||||
@Column(name = "totS10")
|
||||
@Column(name = "tot_ts_10")
|
||||
private Double totS10;
|
||||
@Column(name = "totS11")
|
||||
@Column(name = "tot_ts_11")
|
||||
private Double totS11;
|
||||
@Column(name = "totS12")
|
||||
@Column(name = "tot_ts_12")
|
||||
private Double totS12;
|
||||
@Column(name = "totS13")
|
||||
@Column(name = "tot_ts_13")
|
||||
private Double totS13;
|
||||
@Column(name = "totS14")
|
||||
@Column(name = "tot_ts_14")
|
||||
private Double totS14;
|
||||
@Column(name = "totS15")
|
||||
@Column(name = "tot_ts_15")
|
||||
private Double totS15;
|
||||
@Column(name = "totS16")
|
||||
@Column(name = "tot_ts_16")
|
||||
private Double totS16;
|
||||
@Column(name = "totS17")
|
||||
@Column(name = "tot_ts_17")
|
||||
private Double totS17;
|
||||
@Column(name = "totS18")
|
||||
@Column(name = "tot_ts_18")
|
||||
private Double totS18;
|
||||
@Column(name = "totS19")
|
||||
@Column(name = "tot_ts_19")
|
||||
private Double totS19;
|
||||
@Column(name = "totS20")
|
||||
@Column(name = "tot_ts_20")
|
||||
private Double totS20;
|
||||
@Column(name = "totS21")
|
||||
@Column(name = "tot_ts_21")
|
||||
private Double totS21;
|
||||
@Column(name = "totS22")
|
||||
@Column(name = "tot_ts_22")
|
||||
private Double totS22;
|
||||
@Column(name = "totS23")
|
||||
@Column(name = "tot_ts_23")
|
||||
private Double totS23;
|
||||
@Column(name = "totS24")
|
||||
@Column(name = "tot_ts_24")
|
||||
private Double totS24;
|
||||
@Column(name = "totS25")
|
||||
@Column(name = "tot_ts_25")
|
||||
private Double totS25;
|
||||
@Column(name = "totS26")
|
||||
@Column(name = "tot_ts_26")
|
||||
private Double totS26;
|
||||
@Column(name = "totS27")
|
||||
@Column(name = "tot_ts_27")
|
||||
private Double totS27;
|
||||
@Column(name = "totS28")
|
||||
@Column(name = "tot_ts_28")
|
||||
private Double totS28;
|
||||
@Column(name = "totS29")
|
||||
@Column(name = "tot_ts_29")
|
||||
private Double totS29;
|
||||
@Column(name = "totS30")
|
||||
@Column(name = "tot_ts_30")
|
||||
private Double totS30;
|
||||
@Column(name = "totS31")
|
||||
@Column(name = "tot_ts_31")
|
||||
private Double totS31;
|
||||
@Column(name = "totS32")
|
||||
@Column(name = "tot_ts_32")
|
||||
private Double totS32;
|
||||
@Column(name = "totS33")
|
||||
@Column(name = "tot_ts_33")
|
||||
private Double totS33;
|
||||
@Column(name = "totS34")
|
||||
@Column(name = "tot_ts_34")
|
||||
private Double totS34;
|
||||
@Column(name = "totS35")
|
||||
@Column(name = "tot_ts_35")
|
||||
private Double totS35;
|
||||
@Column(name = "totS36")
|
||||
@Column(name = "tot_ts_36")
|
||||
private Double totS36;
|
||||
@Column(name = "totS37")
|
||||
@Column(name = "tot_ts_37")
|
||||
private Double totS37;
|
||||
@Column(name = "totS38")
|
||||
@Column(name = "tot_ts_38")
|
||||
private Double totS38;
|
||||
@Column(name = "totS39")
|
||||
@Column(name = "tot_ts_39")
|
||||
private Double totS39;
|
||||
@Column(name = "totS40")
|
||||
@Column(name = "tot_ts_40")
|
||||
private Double totS40;
|
||||
@Column(name = "totS41")
|
||||
@Column(name = "tot_ts_41")
|
||||
private Double totS41;
|
||||
@Column(name = "totS42")
|
||||
@Column(name = "tot_ts_42")
|
||||
private Double totS42;
|
||||
@Column(name = "totS43")
|
||||
@Column(name = "tot_ts_43")
|
||||
private Double totS43;
|
||||
@Column(name = "totS44")
|
||||
@Column(name = "tot_ts_44")
|
||||
private Double totS44;
|
||||
@Column(name = "totS45")
|
||||
@Column(name = "tot_ts_45")
|
||||
private Double totS45;
|
||||
@Column(name = "totS46")
|
||||
@Column(name = "tot_ts_46")
|
||||
private Double totS46;
|
||||
@Column(name = "totS47")
|
||||
@Column(name = "tot_ts_47")
|
||||
private Double totS47;
|
||||
@Column(name = "totS49")
|
||||
@Column(name = "tot_ts_49")
|
||||
private Double totS48;
|
||||
@Column(name = "totS49")
|
||||
@Column(name = "tot_ts_49")
|
||||
private Double totS49;
|
||||
@Column(name = "totS50")
|
||||
@Column(name = "tot_ts_50")
|
||||
private Double totS50;
|
||||
|
||||
|
||||
|
||||
@@ -192,6 +192,7 @@ public class InfluxdbDataHarmpowerPImpl extends MppServiceImpl<RStatDataHarmPowe
|
||||
List<DataHarmpowerP> result = new ArrayList<>();
|
||||
InfluxQueryWrapper influxQueryWrapper = new InfluxQueryWrapper(DataHarmpowerP.class);
|
||||
influxQueryWrapper.samePrefixAndSuffix(InfluxDbSqlConstant.P, InfluxDbSqlConstant.P, HarmonicTimesUtil.harmonicTimesList(1, 50, 1));
|
||||
influxQueryWrapper.samePrefixAndSuffix("tot_tp_", "tot_tp_", HarmonicTimesUtil.harmonicTimesList(1, 50, 1));
|
||||
influxQueryWrapper.regular(DataHarmpowerP::getLineId, lineList)
|
||||
.select(DataHarmpowerP::getLineId)
|
||||
.select(DataHarmpowerP::getPhasicType)
|
||||
@@ -199,6 +200,9 @@ public class InfluxdbDataHarmpowerPImpl extends MppServiceImpl<RStatDataHarmPowe
|
||||
.select(DataHarmpowerP::getP)
|
||||
.select(DataHarmpowerP::getDf)
|
||||
.select(DataHarmpowerP::getPf)
|
||||
.select(DataHarmpowerP::getTotP)
|
||||
.select(DataHarmpowerP::getTotDf)
|
||||
.select(DataHarmpowerP::getTotPf)
|
||||
.select(DataHarmpowerP::getQualityFlag)
|
||||
.select(DataHarmpowerP::getAbnormalFlag)
|
||||
.between(DataHarmpowerP::getTime, startTime, endTime)
|
||||
|
||||
@@ -187,11 +187,13 @@ public class InfluxdbDataHarmpowerQImpl extends MppServiceImpl<RStatDataHarmPowe
|
||||
List<DataHarmpowerQ> result = new ArrayList<>();
|
||||
InfluxQueryWrapper influxQueryWrapper = new InfluxQueryWrapper(DataHarmpowerQ.class);
|
||||
influxQueryWrapper.samePrefixAndSuffix(InfluxDbSqlConstant.Q, InfluxDbSqlConstant.Q, HarmonicTimesUtil.harmonicTimesList(1, 50, 1));
|
||||
influxQueryWrapper.samePrefixAndSuffix("tot_tq_", "tot_tq_", HarmonicTimesUtil.harmonicTimesList(1, 50, 1));
|
||||
influxQueryWrapper.regular(DataHarmpowerQ::getLineId, lineList)
|
||||
.select(DataHarmpowerQ::getLineId)
|
||||
.select(DataHarmpowerQ::getPhasicType)
|
||||
.select(DataHarmpowerQ::getValueType)
|
||||
.select(DataHarmpowerQ::getQ)
|
||||
.select(DataHarmpowerQ::getTotQ)
|
||||
.select(DataHarmpowerQ::getQualityFlag)
|
||||
.select(DataHarmpowerQ::getAbnormalFlag)
|
||||
.between(DataHarmpowerQ::getTime, startTime, endTime)
|
||||
|
||||
@@ -187,11 +187,13 @@ public class InfluxdbDataHarmpowerSImpl extends MppServiceImpl<RStatDataHarmPowe
|
||||
List<DataHarmpowerS> result = new ArrayList<>();
|
||||
InfluxQueryWrapper influxQueryWrapper = new InfluxQueryWrapper(DataHarmpowerS.class);
|
||||
influxQueryWrapper.samePrefixAndSuffix(InfluxDbSqlConstant.S, InfluxDbSqlConstant.S, HarmonicTimesUtil.harmonicTimesList(1, 50, 1));
|
||||
influxQueryWrapper.samePrefixAndSuffix("tot_ts_", "tot_ts_", HarmonicTimesUtil.harmonicTimesList(1, 50, 1));
|
||||
influxQueryWrapper.regular(DataHarmpowerS::getLineId, lineList)
|
||||
.select(DataHarmpowerS::getLineId)
|
||||
.select(DataHarmpowerS::getPhasicType)
|
||||
.select(DataHarmpowerS::getValueType)
|
||||
.select(DataHarmpowerS::getS)
|
||||
.select(DataHarmpowerS::getTotS)
|
||||
.select(DataHarmpowerS::getQualityFlag)
|
||||
.select(DataHarmpowerS::getAbnormalFlag)
|
||||
.between(DataHarmpowerS::getTime, startTime, endTime)
|
||||
|
||||
@@ -100,12 +100,34 @@
|
||||
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||
<version>2.7.12</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.njcn</groupId>
|
||||
<artifactId>mq-spring-boot-starter</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<version>2.7.12</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.13.2</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<finalName>messageboot</finalName>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>2.22.2</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
|
||||
@@ -39,6 +39,8 @@ import java.util.concurrent.TimeUnit;
|
||||
* @createTime 2023/8/11 15:32
|
||||
*/
|
||||
@Component
|
||||
@org.springframework.boot.autoconfigure.condition.ConditionalOnProperty(
|
||||
name = "mq.type", havingValue = "rocketmq", matchIfMissing = true)
|
||||
@RocketMQMessageListener(
|
||||
topic = "LN_Topic",
|
||||
consumerGroup = "ln_consumer",
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.njcn.message.mq;
|
||||
|
||||
import com.njcn.message.messagedto.MessageDataDTO;
|
||||
import com.njcn.mq.annotation.MqListener;
|
||||
import com.njcn.stat.api.MessAnalysisFeignClient;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Collections;
|
||||
|
||||
@Component
|
||||
@ConditionalOnProperty(name = "mq.type", havingValue = "redis-stream")
|
||||
public class FrontDataMqListener {
|
||||
|
||||
@Resource
|
||||
private MessAnalysisFeignClient messAnalysisFeignClient;
|
||||
|
||||
@MqListener(topic = "LN_Topic", group = "ln_consumer")
|
||||
public void onFrontData(MessageDataDTO msg) {
|
||||
messAnalysisFeignClient.analysis(Collections.singletonList(msg));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.njcn.message.mq;
|
||||
|
||||
import com.njcn.message.constant.BusinessTopic;
|
||||
import com.njcn.message.message.RecallMessage;
|
||||
import com.njcn.mq.core.MqTemplate;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
@Component
|
||||
public class RecallMqSender {
|
||||
|
||||
@Resource
|
||||
private MqTemplate mqTemplate;
|
||||
|
||||
public void send(RecallMessage message, String nodeId) {
|
||||
mqTemplate.send(nodeId + "_" + BusinessTopic.RECALL_TOPIC, message);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,210 @@
|
||||
package com.njcn.message.mq;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.njcn.message.message.RecallMessage;
|
||||
import com.njcn.message.messagedto.MessageDataDTO;
|
||||
import com.njcn.middle.stream.autoconfig.RedisStreamAutoConfiguration;
|
||||
import com.njcn.mq.autoconfig.MqCoreAutoConfiguration;
|
||||
import com.njcn.mq.container.MqListenerRegistry;
|
||||
import com.njcn.mq.core.MqTemplate;
|
||||
import com.njcn.mq.driver.redis.RedisStreamMqDriver;
|
||||
import com.njcn.mq.driver.redis.RedisStreamMqDriverAutoConfiguration;
|
||||
import com.njcn.mq.driver.rocketmq.RocketMqDriver;
|
||||
import com.njcn.mq.driver.rocketmq.RocketMqDriverAutoConfiguration;
|
||||
import com.njcn.mq.spi.MqDriver;
|
||||
import com.njcn.stat.api.MessAnalysisFeignClient;
|
||||
import org.apache.rocketmq.spring.autoconfigure.RocketMQProperties;
|
||||
import org.apache.rocketmq.spring.core.RocketMQTemplate;
|
||||
import org.junit.jupiter.api.Assumptions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
|
||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||
import org.springframework.data.redis.connection.stream.MapRecord;
|
||||
import org.springframework.data.redis.connection.stream.ReadOffset;
|
||||
import org.springframework.data.redis.connection.stream.StreamOffset;
|
||||
import org.springframework.data.redis.connection.stream.StreamReadOptions;
|
||||
import org.springframework.data.redis.connection.stream.StreamRecords;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.Socket;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.ArgumentMatchers.anyList;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.timeout;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
/**
|
||||
* MQ starter 切片接入验证测试(ApplicationContextRunner,不启动全应用)。
|
||||
* 真实 Redis 要求:localhost:6379(docker redis-stream-it);仅上/下行收发用例需要,
|
||||
* 纯装配用例不需要(Lettuce 懒连接,不触发实际连接)。
|
||||
*
|
||||
* <p>装配一律用 {@code withConfiguration(AutoConfigurations.of(...))},让 Spring 按
|
||||
* <b>真实 autoconfig 顺序</b>(AutoConfigurationSorter)处理,与生产环境一致。以此
|
||||
* 验证 {@link MqCoreAutoConfiguration} 的 {@code @ConditionalOnBean(MqDriver)} 能在
|
||||
* 真实顺序下拿到 driver bean —— 这依赖 driver autoconfig 上的
|
||||
* {@code @AutoConfigureBefore(MqCoreAutoConfiguration.class)}。若缺该保障,按类名字母序
|
||||
* {@code com.njcn.mq.autoconfig.*} 先于 {@code com.njcn.mq.driver.*},core 会在 driver
|
||||
* bean 注册前求值条件失败,导致 MqTemplate / MqListenerRegistry 不装配。
|
||||
*/
|
||||
public class MqSliceWiringTest {
|
||||
|
||||
private static boolean redisAvailable() {
|
||||
try {
|
||||
Socket s = new Socket();
|
||||
s.connect(new InetSocketAddress("localhost", 6379), 500);
|
||||
s.close();
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/** redis-stream 模式:真实 autoconfig 顺序装 5 个 autoconfig + 业务 bean(上/下行用)。 */
|
||||
private ApplicationContextRunner redisStreamRunner() {
|
||||
return new ApplicationContextRunner()
|
||||
.withConfiguration(AutoConfigurations.of(
|
||||
RedisAutoConfiguration.class,
|
||||
RedisStreamAutoConfiguration.class,
|
||||
RedisStreamMqDriverAutoConfiguration.class,
|
||||
RocketMqDriverAutoConfiguration.class,
|
||||
MqCoreAutoConfiguration.class))
|
||||
.withUserConfiguration(FrontDataMqListener.class, RecallMqSender.class)
|
||||
.withBean(MessAnalysisFeignClient.class,
|
||||
() -> mock(MessAnalysisFeignClient.class))
|
||||
.withPropertyValues(
|
||||
"mq.type=redis-stream",
|
||||
"spring.redis.host=localhost",
|
||||
"spring.redis.port=6379");
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// 1. 装配:mq.type 二选一 + core bean 在真实 autoconfig 顺序下装配
|
||||
// ------------------------------------------------------------------
|
||||
|
||||
@Test
|
||||
void testRedisStreamDriverSelected() {
|
||||
// 纯装配检查,不依赖真实 Redis(Lettuce 懒连接)。
|
||||
new ApplicationContextRunner()
|
||||
.withConfiguration(AutoConfigurations.of(
|
||||
RedisAutoConfiguration.class,
|
||||
RedisStreamAutoConfiguration.class,
|
||||
RedisStreamMqDriverAutoConfiguration.class,
|
||||
RocketMqDriverAutoConfiguration.class,
|
||||
MqCoreAutoConfiguration.class))
|
||||
.withPropertyValues(
|
||||
"mq.type=redis-stream",
|
||||
"spring.redis.host=localhost",
|
||||
"spring.redis.port=6379")
|
||||
.run(ctx -> {
|
||||
assertThat(ctx).hasSingleBean(MqDriver.class);
|
||||
assertThat(ctx.getBean(MqDriver.class)).isInstanceOf(RedisStreamMqDriver.class);
|
||||
// 真实顺序下 core 的 @ConditionalOnBean(MqDriver) 必须命中
|
||||
assertThat(ctx).hasSingleBean(MqTemplate.class);
|
||||
assertThat(ctx).hasSingleBean(MqListenerRegistry.class);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void testRocketMqDriverSelected() {
|
||||
// rocket 测试不依赖真实 Redis;不装 RedisAutoConfiguration,redis driver 因 mq.type 不匹配而 inactive。
|
||||
new ApplicationContextRunner()
|
||||
.withConfiguration(AutoConfigurations.of(
|
||||
RedisStreamMqDriverAutoConfiguration.class,
|
||||
RocketMqDriverAutoConfiguration.class,
|
||||
MqCoreAutoConfiguration.class))
|
||||
.withBean(RocketMQTemplate.class, () -> mock(RocketMQTemplate.class))
|
||||
.withBean(RocketMQProperties.class, RocketMQProperties::new)
|
||||
.withPropertyValues("mq.type=rocketmq")
|
||||
.run(ctx -> {
|
||||
assertThat(ctx).hasSingleBean(MqDriver.class);
|
||||
assertThat(ctx.getBean(MqDriver.class)).isInstanceOf(RocketMqDriver.class);
|
||||
assertThat(ctx).hasSingleBean(MqTemplate.class);
|
||||
assertThat(ctx).hasSingleBean(MqListenerRegistry.class);
|
||||
});
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// 2. 上行(需要真实 Redis)
|
||||
// 向 LN_Topic stream XADD 一条消息,验证 FrontDataMqListener 触发了
|
||||
// messAnalysisFeignClient.analysis(...)
|
||||
// ------------------------------------------------------------------
|
||||
|
||||
@Test
|
||||
void testUpstreamFrontData() {
|
||||
Assumptions.assumeTrue(redisAvailable(), "Redis not available at localhost:6379, skipping");
|
||||
redisStreamRunner().run(ctx -> {
|
||||
StringRedisTemplate redis = ctx.getBean(StringRedisTemplate.class);
|
||||
MessAnalysisFeignClient mockClient = ctx.getBean(MessAnalysisFeignClient.class);
|
||||
|
||||
// 构造 RedisStreamMqDriver 消费时期望的字段格式
|
||||
// enc=plain → body 即为原始 JSON(参见 MessageCodec.encodeBody(json, false))
|
||||
// stream key = StreamKeyBuilder.buildStream("LN_Topic") = "LN_Topic"
|
||||
// (默认 envIsolation=false,无 env 前缀)
|
||||
MessageDataDTO dto = new MessageDataDTO();
|
||||
dto.setDataType(1);
|
||||
String json = JSON.toJSONString(dto);
|
||||
|
||||
Map<String, String> fields = new HashMap<String, String>();
|
||||
fields.put("key", "test-key-upstream-1");
|
||||
fields.put("tag", "");
|
||||
fields.put("enc", "plain");
|
||||
fields.put("body", json);
|
||||
fields.put("ts", String.valueOf(System.currentTimeMillis()));
|
||||
|
||||
// XADD 到 LN_Topic(MqListenerRegistry.start() 已在 context 启动时订阅该 stream)
|
||||
redis.opsForStream().add(
|
||||
StreamRecords.newRecord().in("LN_Topic").ofMap(fields)
|
||||
);
|
||||
|
||||
// 等待消费线程处理(blockMs 默认 2000ms,timeout=5000ms 足够)
|
||||
verify(mockClient, timeout(5000)).analysis(anyList());
|
||||
});
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// 3. 下行(需要真实 Redis)
|
||||
// 通过 RecallMqSender 发送 RecallMessage,验证 stream 内容正确
|
||||
// ------------------------------------------------------------------
|
||||
|
||||
@Test
|
||||
void testDownstreamRecall() {
|
||||
Assumptions.assumeTrue(redisAvailable(), "Redis not available at localhost:6379, skipping");
|
||||
redisStreamRunner().run(ctx -> {
|
||||
StringRedisTemplate redis = ctx.getBean(StringRedisTemplate.class);
|
||||
RecallMqSender sender = ctx.getBean(RecallMqSender.class);
|
||||
|
||||
// 清理,确保只有本次发送的消息
|
||||
redis.delete("n1_recall_Topic");
|
||||
|
||||
RecallMessage msg = new RecallMessage();
|
||||
msg.setGuid("g1");
|
||||
// MqTemplate.send("n1_recall_Topic", msg) → RedisStreamMqDriver XADD
|
||||
// stream key = StreamKeyBuilder.buildStream("n1_recall_Topic") = "n1_recall_Topic"
|
||||
sender.send(msg, "n1");
|
||||
|
||||
Long size = redis.opsForStream().size("n1_recall_Topic");
|
||||
assertThat(size).isGreaterThanOrEqualTo(1L);
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
List<MapRecord<String, Object, Object>> records =
|
||||
redis.opsForStream().read(
|
||||
StreamReadOptions.empty().count(1L),
|
||||
StreamOffset.create("n1_recall_Topic", ReadOffset.from("0-0"))
|
||||
);
|
||||
assertThat(records).isNotEmpty();
|
||||
|
||||
Map<Object, Object> firstFields = records.get(0).getValue();
|
||||
// DefaultMqTemplate.send(topic, payload) 使用 encodeBody(json, false) → enc="plain"
|
||||
// 因此 body 即为原始 JSON,无需 gzip 解压
|
||||
String body = (String) firstFields.get("body");
|
||||
RecallMessage result = JSON.parseObject(body, RecallMessage.class);
|
||||
assertThat(result.getGuid()).isEqualTo("g1");
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user