1.治理App版本信息添加

2.准实时数据接口调整
3.设备登记调整
4.设备接入调整
This commit is contained in:
xy
2024-11-28 08:43:54 +08:00
parent d0c7edff8a
commit b6c2675311
27 changed files with 790 additions and 55 deletions

View File

@@ -5,6 +5,7 @@ import com.njcn.common.pojo.response.HttpResult;
import com.njcn.csdevice.api.fallback.WlRecordClientFallbackFactory;
import com.njcn.csdevice.pojo.param.WlRecordParam;
import com.njcn.csdevice.pojo.po.WlRecord;
import com.njcn.csdevice.pojo.vo.RecordVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
@@ -50,4 +51,7 @@ public interface WlRecordFeignClient {
@GetMapping("/getWlAssByWlId")
HttpResult<List<WlRecord>> getWlAssByWlId(@RequestParam("wlId")String wlId);
@PostMapping("/findDevBaseDataByLineId")
HttpResult<List<RecordVo>> findDevBaseDataByLineId(@RequestBody @Validated WlRecordParam.lineRecord param);
}

View File

@@ -6,6 +6,7 @@ import com.njcn.common.pojo.response.HttpResult;
import com.njcn.csdevice.api.WlRecordFeignClient;
import com.njcn.csdevice.pojo.param.WlRecordParam;
import com.njcn.csdevice.pojo.po.WlRecord;
import com.njcn.csdevice.pojo.vo.RecordVo;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@@ -63,6 +64,12 @@ public class WlRecordClientFallbackFactory implements FallbackFactory<WlRecordFe
log.error("{}异常,降级处理,异常为:{}","根据测试项id获取测试项详细条目",cause.toString());
throw new BusinessException(finalExceptionEnum);
}
@Override
public HttpResult<List<RecordVo>> findDevBaseDataByLineId(WlRecordParam.lineRecord param) {
log.error("{}异常,降级处理,异常为:{}","根据监测点id查询装置基础数据",cause.toString());
throw new BusinessException(finalExceptionEnum);
}
};
}
}

View File

@@ -1,12 +1,10 @@
package com.njcn.csdevice.pojo.param;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.Date;
/**
*
@@ -60,51 +58,12 @@ public class CsEquipmentDeliveryAuditParm {
@ApiModelProperty(value="装置接入方式")
private String devAccessMethod;
// /**
// * 装置程序版本
// */
// @ApiModelProperty(value="装置程序版本")
// private String programVersion;
// /**
// * 调试人员
// */
// @ApiModelProperty(value="调试人员")
// private String debugPerson;
//
// /**
// * 出厂日期
// */
// @ApiModelProperty(value="出厂日期")
// @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
// private Date producteTime;
//
// /**
// * 检修日期
// */
// @ApiModelProperty(value="检修日期")
// @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
// private Date checkTime;
//
// /**
// * 调试日期
// */
// @ApiModelProperty(value="调试日期")
// @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
// private Date debugTime;
/**
* 合同号
*/
@ApiModelProperty(value="合同号")
private String cntractNo;
// /**
// * 营销经理
// */
// @ApiModelProperty(value="营销经理")
// private String salesManager;
/**
* 状态
*/
@@ -128,4 +87,7 @@ public class CsEquipmentDeliveryAuditParm {
*/
@ApiModelProperty(value="模块个数")
private Integer modelNumber;
@ApiModelProperty(value="装置使用状态(0:停用 1:启用)")
private Integer usageStatus;
}

View File

@@ -99,4 +99,19 @@ public class WlRecordParam {
private String id;
}
@Data
@EqualsAndHashCode(callSuper = true)
public static class lineRecord extends WlRecordParam {
@ApiModelProperty("监测点id")
private String lineId;
@ApiModelProperty("测试项起始时间")
private String itemStartTime;
@ApiModelProperty("测试项结束时间")
private String itemEndTime;
}
}

View File

@@ -108,4 +108,10 @@ public class CsEquipmentDeliveryPO extends BaseEntity {
@TableField(value = "process")
private Integer process;
/**
* 装置使用状态(0:停用 1:启用)
*/
@TableField(value = "usage_status")
private Integer usageStatus;
}

View File

@@ -83,4 +83,7 @@ public class CsEquipmentDeliveryVO extends BaseEntity {
@ApiModelProperty(value="设备当前流程状态")
private Integer process ;
@ApiModelProperty(value="装置使用状态(0:停用 1:启用)")
private Integer usageStatus ;
}

View File

@@ -48,6 +48,9 @@ public class CsLedgerVO implements Serializable {
@ApiModelProperty(name = "type",value = "类型 项目 工程 装置 监测点")
private String type;
@ApiModelProperty(name = "lineType",value = "监测点类型 0:治理监测点 1:电能质量监测点")
private Integer lineType;
@ApiModelProperty(name = "children",value = "子节点")
private List<CsLedgerVO> children = new ArrayList<>();

View File

@@ -38,6 +38,7 @@ import springfox.documentation.annotations.ApiIgnore;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -66,10 +67,10 @@ public class EquipmentDeliveryController extends BaseController {
@ApiOperation("新增出厂设备")
@ApiImplicitParam(name = "csEquipmentDeliveryAddParm", value = "新增项目参数", required = true)
@DeviceLog(operateType = DeviceOperate.ADD)
public HttpResult<Boolean> addEquipmentDelivery(@RequestBody @Validated CsEquipmentDeliveryAddParm csEquipmentDeliveryAddParm){
public HttpResult<CsEquipmentDeliveryPO> addEquipmentDelivery(@RequestBody @Validated CsEquipmentDeliveryAddParm csEquipmentDeliveryAddParm){
String methodDescribe = getMethodDescribe("addEquipmentDelivery");
Boolean flag = csEquipmentDeliveryService.save(csEquipmentDeliveryAddParm);
if (flag){
CsEquipmentDeliveryPO po = csEquipmentDeliveryService.save(csEquipmentDeliveryAddParm);
if (Objects.nonNull(po)){
//查询mqtt用户名和密码是否存在
boolean result = mqttUserService.findMqttUser(csEquipmentDeliveryAddParm.getNdid());
if (result){
@@ -77,7 +78,7 @@ public class EquipmentDeliveryController extends BaseController {
mqttUserService.insertMqttUser(csEquipmentDeliveryAddParm.getNdid());
}
}
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, flag, methodDescribe);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, po, methodDescribe);
}

View File

@@ -168,6 +168,20 @@ public class WlRecordController extends BaseController {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
}
/**
* 删除装置测试项
*/
@OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.UPDATE)
@PostMapping("/deleteItem")
@ApiOperation("删除装置测试项")
@ApiImplicitParam(name = "id", value = "装置测试项Id", required = true)
public HttpResult<Boolean> deleteItem(@RequestParam @Validated String id) {
String methodDescribe = getMethodDescribe("deleteItem");
LogUtil.njcnDebug(log, "{}装置测试项Id为{}", methodDescribe, id);
wlRecordService.deleteItem(id);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
}
/**
* 查询测试项时间段实时数据
*/
@@ -195,6 +209,19 @@ public class WlRecordController extends BaseController {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, record, methodDescribe);
}
/**
* 根据监测点id查询装置基础数据
*/
@OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.QUERY)
@PostMapping("/findDevBaseDataByLineId")
@ApiOperation("根据监测点id查询装置基础数据")
@ApiImplicitParam(name = "param", value = "查询条件", required = true)
public HttpResult<List<RecordVo>> findDevBaseDataByLineId(@RequestBody @Validated WlRecordParam.lineRecord param) {
String methodDescribe = getMethodDescribe("findDevBaseDataByLineId");
LogUtil.njcnDebug(log, "{},查询对象为:{}", methodDescribe, param);
List<RecordVo> record = wlRecordService.findDevBaseDataByLineId(param);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, record, methodDescribe);
}
/**

View File

@@ -39,7 +39,7 @@ public interface CsEquipmentDeliveryService extends IService<CsEquipmentDelivery
* @Author: clam
* @Date: 2023/3/31
*/
Boolean save(CsEquipmentDeliveryAddParm csEquipmentDeliveryAddParm);
CsEquipmentDeliveryPO save(CsEquipmentDeliveryAddParm csEquipmentDeliveryAddParm);
/**
* @Description: AuditEquipmentDelivery
* @Param: [id]

View File

@@ -102,6 +102,7 @@ public interface IWlRecordService extends IService<WlRecord> {
*/
WlRecord findDevBaseData(WlRecordParam.Record param);
List<RecordVo> findDevBaseDataByLineId(WlRecordParam.lineRecord param);
/**
* 每日处理没有结束时间的测试基础数据
@@ -110,4 +111,5 @@ public interface IWlRecordService extends IService<WlRecord> {
List<WlRecord> getWlAssByWlId(String wlId);
void deleteItem(String id);
}

View File

@@ -40,6 +40,7 @@ import com.njcn.system.api.DicDataFeignClient;
import com.njcn.system.api.DictTreeFeignClient;
import com.njcn.system.enums.DicDataEnum;
import com.njcn.system.enums.DicTreeEnum;
import com.njcn.system.pojo.po.SysDicTreePO;
import com.njcn.system.pojo.vo.DictTreeVO;
import com.njcn.web.factory.PageFactory;
import com.njcn.web.utils.RequestUtil;
@@ -101,7 +102,7 @@ public class CsEquipmentDeliveryServiceImpl extends ServiceImpl<CsEquipmentDeliv
@Override
@Transactional(rollbackFor = {Exception.class})
public Boolean save(CsEquipmentDeliveryAddParm csEquipmentDeliveryAddParm) {
public CsEquipmentDeliveryPO save(CsEquipmentDeliveryAddParm csEquipmentDeliveryAddParm) {
boolean result;
CsEquipmentDeliveryPO po = this.queryEquipmentPOByndid (csEquipmentDeliveryAddParm.getNdid());
if(!Objects.isNull (po)){
@@ -111,6 +112,7 @@ public class CsEquipmentDeliveryServiceImpl extends ServiceImpl<CsEquipmentDeliv
BeanUtils.copyProperties (csEquipmentDeliveryAddParm,csEquipmentDeliveryPo);
csEquipmentDeliveryPo.setStatus (1);
csEquipmentDeliveryPo.setRunStatus(1);
csEquipmentDeliveryPo.setUsageStatus(1);
String code = dictTreeFeignClient.queryById(csEquipmentDeliveryAddParm.getDevType()).getData().getCode();
if (Objects.equals(DicDataEnum.PORTABLE.getCode(),code)) {
csEquipmentDeliveryPo.setProcess(4);
@@ -135,7 +137,7 @@ public class CsEquipmentDeliveryServiceImpl extends ServiceImpl<CsEquipmentDeliv
if (result) {
refreshDeviceDataCache();
}
return result;
return csEquipmentDeliveryPo;
}
@Override
@@ -370,6 +372,7 @@ public class CsEquipmentDeliveryServiceImpl extends ServiceImpl<CsEquipmentDeliv
BeanUtils.copyProperties(csEquipmentDeliveryPo, deviceManagerVo);
if (CollUtil.isNotEmpty(dataSet)) {
for (CsDataSet item : dataSet) {
//准实时数据
DeviceManagerVO.DataSetVO dataSetVO = new DeviceManagerVO.DataSetVO();
dataSetVO.setId(item.getId());
dataSetVO.setName("history".equals(type) ? "准实时数据":item.getAnotherName());
@@ -384,14 +387,14 @@ public class CsEquipmentDeliveryServiceImpl extends ServiceImpl<CsEquipmentDeliv
dataSetVo2.setType("history");
dataSetList.add(dataSetVo2);
deviceManagerVo.setDataLevel(item.getDataLevel());
//趋势数据tab
DeviceManagerVO.DataSetVO dataSetVo3 = new DeviceManagerVO.DataSetVO();
dataSetVo3.setId(item.getId());
dataSetVo3.setName("历史趋势");
dataSetVo3.setType("trenddata");
dataSetList.add(dataSetVo3);
//下面这些tab仅仅只限于设备监控的便携式设备才会有
if(DataParam.portableDevType.equals(csEquipmentDeliveryPo.getDevType())){
//趋势数据tab
DeviceManagerVO.DataSetVO dataSetVo3 = new DeviceManagerVO.DataSetVO();
dataSetVo3.setId(item.getId());
dataSetVo3.setName("历史趋势");
dataSetVo3.setType("trenddata");
dataSetList.add(dataSetVo3);
//实时数据tab
DeviceManagerVO.DataSetVO dataSetVo4 = new DeviceManagerVO.DataSetVO();
dataSetVo4.setId(item.getId());
@@ -404,6 +407,12 @@ public class CsEquipmentDeliveryServiceImpl extends ServiceImpl<CsEquipmentDeliv
dataSetVo5.setName("暂态事件");
dataSetVo5.setType("event");
dataSetList.add(dataSetVo5);
//测试项tab
DeviceManagerVO.DataSetVO dataSetVo6 = new DeviceManagerVO.DataSetVO();
dataSetVo6.setId(item.getId());
dataSetVo6.setName("测试项记录");
dataSetVo6.setType("items");
dataSetList.add(dataSetVo6);
}
}
}

View File

@@ -90,7 +90,17 @@ public class CsLedgerServiceImpl extends ServiceImpl<CsLedgerMapper, CsLedger> i
List<CsLedgerVO> finalLineList = allList.stream()
.filter(item -> item.getLevel().equals(LineBaseEnum.LINE_LEVEL.getCode()))
.sorted(Comparator.comparing(CsLedgerVO::getSort))
.peek(item -> item.setType("line"))
.peek(
item -> {
item.setType("line");
String index = item.getId().substring(item.getId().length()-1);
if (Objects.equals(index,"0")) {
item.setLineType(0);
} else {
item.setLineType(1);
}
}
)
.collect(Collectors.toList());
checkDevSetData(deviceList);
deviceList.forEach(dev -> dev.setChildren(getChildren(dev, finalLineList)));

View File

@@ -522,6 +522,25 @@ public class WlRecordServiceImpl extends ServiceImpl<WlRecordMapper, WlRecord> i
return this.getOne(lambdaQueryWrapper);
}
@Override
public List<RecordVo> findDevBaseDataByLineId(WlRecordParam.lineRecord param) {
List<RecordVo> result = new ArrayList<>();
LambdaQueryWrapper<WlRecord> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(WlRecord::getLineId,param.getLineId())
.between(WlRecord::getStartTime,param.getItemStartTime(),param.getItemEndTime())
.eq(WlRecord::getType,1)
.eq(WlRecord::getState,1).orderByDesc(WlRecord::getStartTime);
List<WlRecord> list = this.list(lambdaQueryWrapper);
if (CollUtil.isNotEmpty(list)) {
list.forEach(item->{
RecordVo vo = new RecordVo();
BeanUtils.copyProperties(item,vo);
result.add(vo);
});
}
return result;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void dayDealNoEndTimeEvent(String date) {
@@ -620,6 +639,13 @@ public class WlRecordServiceImpl extends ServiceImpl<WlRecordMapper, WlRecord> i
return this.baseMapper.getDataRecordByTestId(wlId,0);
}
@Override
public void deleteItem(String id) {
LambdaUpdateWrapper<WlRecord> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.eq(WlRecord::getId,id).set(WlRecord::getState,0);
this.update(lambdaUpdateWrapper);
}
/**
* 数据项内的时间进行覆盖:解决多个数据项的startTime及endTime之间存在时间冲突
* @param data 数据项

View File

@@ -0,0 +1,29 @@
package com.njcn.csharmonic.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @author xy
*/
@Data
public class DataParam implements Serializable {
@ApiModelProperty("起始时间")
private String startTime;
@ApiModelProperty("结束时间")
private String endTime;
@ApiModelProperty("监测点id")
private String lineId;
@ApiModelProperty("指标统计类型")
private String targetType;
@ApiModelProperty("数据标志")
private String dataLevel;
}

View File

@@ -0,0 +1,53 @@
package com.njcn.csharmonic.pojo.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.njcn.influx.utils.InstantDateSerializer;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.Instant;
/**
* @author xy
*/
@Data
public class RealTimeDataVo implements Serializable {
@ApiModelProperty("数据时间")
@JsonSerialize(using = InstantDateSerializer.class)
private Instant time;
@ApiModelProperty("指标id")
private String id;
@ApiModelProperty("指标名称")
private String name;
@ApiModelProperty("指标别名")
private String otherName;
@ApiModelProperty("相别")
private String phase;
@ApiModelProperty("单位")
private String unit;
@ApiModelProperty("排序")
private Integer sort;
@ApiModelProperty("平均值")
private Double avgValue;
@ApiModelProperty("A相值")
private Double valueA;
@ApiModelProperty("B相值")
private Double valueB;
@ApiModelProperty("C相值")
private Double valueC;
@ApiModelProperty("无相值")
private Double valueM;
}

View File

@@ -0,0 +1,56 @@
package com.njcn.csharmonic.controller;
import com.njcn.common.pojo.annotation.OperateInfo;
import com.njcn.common.pojo.enums.common.LogEnum;
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.response.HttpResult;
import com.njcn.common.utils.HttpResultUtil;
import com.njcn.csdevice.pojo.vo.RecordVo;
import com.njcn.csharmonic.param.DataParam;
import com.njcn.csharmonic.pojo.vo.RealTimeDataVo;
import com.njcn.csharmonic.service.IDataService;
import com.njcn.web.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author xy
*/
@Slf4j
@RestController
@RequestMapping("/data")
@Api(tags = "装置数据")
@AllArgsConstructor
public class DataController extends BaseController {
private final IDataService dataService;
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/realTimeData")
@ApiOperation("设备监控-》准实时数据")
@ApiImplicitParam(name = "param", value = "参数", required = true)
public HttpResult<List<RealTimeDataVo>> realTimeData(@RequestBody DataParam param) {
String methodDescribe = getMethodDescribe("realTimeData");
List<RealTimeDataVo> list = dataService.getRealTimeData(param);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/getTestData")
@ApiOperation("设备监控-》测试项数据")
@ApiImplicitParam(name = "param", value = "参数", required = true)
public HttpResult<List<RecordVo>> getTestData(@RequestBody DataParam param) {
String methodDescribe = getMethodDescribe("getTestData");
List<RecordVo> list = dataService.getTestData(param);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe);
}
}

View File

@@ -0,0 +1,16 @@
package com.njcn.csharmonic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.njcn.csdevice.pojo.po.CsDataSet;
/**
* <p>
* 数据集表 Mapper 接口
* </p>
*
* @author xuyang
* @since 2023-05-31
*/
public interface CsDataSetMapper extends BaseMapper<CsDataSet> {
}

View File

@@ -0,0 +1,26 @@
package com.njcn.csharmonic.service;
import com.njcn.csdevice.pojo.vo.RecordVo;
import com.njcn.csharmonic.param.DataParam;
import com.njcn.csharmonic.pojo.vo.RealTimeDataVo;
import java.util.List;
/**
* @author xuyang
*/
public interface IDataService {
/**
* 获取设备准实时数据
* @param param
* @return
*/
List<RealTimeDataVo> getRealTimeData(DataParam param);
/**
* 获取监测点测试项信息
*/
List<RecordVo> getTestData(DataParam param);
}

View File

@@ -0,0 +1,223 @@
package com.njcn.csharmonic.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.njcn.csdevice.api.CsLineFeignClient;
import com.njcn.csdevice.api.WlRecordFeignClient;
import com.njcn.csdevice.pojo.param.WlRecordParam;
import com.njcn.csdevice.pojo.po.CsDataSet;
import com.njcn.csdevice.pojo.po.CsLinePO;
import com.njcn.csdevice.pojo.vo.RecordVo;
import com.njcn.csdevice.utils.DataChangeUtil;
import com.njcn.csharmonic.constant.HarmonicConstant;
import com.njcn.csharmonic.mapper.CsDataSetMapper;
import com.njcn.csharmonic.param.DataParam;
import com.njcn.csharmonic.pojo.vo.RealTimeDataVo;
import com.njcn.csharmonic.service.IDataService;
import com.njcn.csharmonic.util.InfluxDbParamUtil;
import com.njcn.influx.pojo.dto.StatisticalDataDTO;
import com.njcn.influx.service.CommonService;
import com.njcn.system.api.CsStatisticalSetFeignClient;
import com.njcn.system.api.DictTreeFeignClient;
import com.njcn.system.pojo.po.EleEpdPqd;
import com.njcn.system.pojo.vo.DictTreeVO;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.text.DecimalFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
* 类的介绍:
*
* @author xuyang
* @version 1.0.0
* @createTime 2023/6/1 10:11
*/
@Service
@AllArgsConstructor
public class DataServiceImpl implements IDataService {
private final CommonService commonService;
private final CsStatisticalSetFeignClient csStatisticalSetFeignClient;
private final DictTreeFeignClient dictTreeFeignClient;
private final InfluxDbParamUtil influxDbParamUtil;
private final CsLineFeignClient csLineFeignClient;
private final CsDataSetMapper csDataSetMapper;
private final WlRecordFeignClient wlRecordFeignClient;
private final DecimalFormat df = new DecimalFormat("#0.00");
@Override
public List<RealTimeDataVo> getRealTimeData(DataParam param) {
List<RealTimeDataVo> result = new ArrayList<>();
//获取监测点使用的数据集
List<CsLinePO> finalCsLinePOList = csLineFeignClient.queryLineById(Arrays.asList(param.getLineId())).getData();
CsDataSet csDataSet = csDataSetMapper.selectOne(new LambdaQueryWrapper<CsDataSet>().eq(CsDataSet::getId,finalCsLinePOList.get(0).getDataSetId()));
Double ct = finalCsLinePOList.get(0).getCtRatio();
Double pt = finalCsLinePOList.get(0).getPtRatio();
//根据类型id获取指标分组
List<DictTreeVO> dictTreeVOList = dictTreeFeignClient.query(param.getTargetType()).getData();
if (CollUtil.isNotEmpty(dictTreeVOList)) {
dictTreeVOList = dictTreeVOList.stream().sorted(Comparator.comparing(DictTreeVO::getSort)).collect(Collectors.toList());
//根据分组获取对应指标
List<RealTimeDataVo> finalResult = result;
dictTreeVOList.forEach(item->{
List<EleEpdPqd> epdPqdList = csStatisticalSetFeignClient.queryStatisticalSelect(item.getId()).getData();
epdPqdList.forEach(item2->{
if (Objects.isNull(item2.getHarmStart())) {
RealTimeDataVo vo = getBaseData(item2,param.getLineId(),param.getDataLevel(),csDataSet.getDataLevel(),pt,ct);
if (Objects.nonNull(vo)) {
finalResult.add(vo);
}
} else if (Objects.equals(item2.getHarmStart(),2)) {
List<RealTimeDataVo> harmList = getHarmData(item2,param.getLineId());
finalResult.addAll(harmList);
} else if (Objects.equals(item2.getHarmStart(),1)) {
List<RealTimeDataVo> inuharmList = getInuHarmData(item2,param.getLineId());
finalResult.addAll(inuharmList);
}
});
});
}
if (CollUtil.isNotEmpty(result)) {
result = channelData(result);
}
return result;
}
@Override
public List<RecordVo> getTestData(DataParam param) {
WlRecordParam.lineRecord record = new WlRecordParam.lineRecord();
record.setLineId(param.getLineId());
String beginDay = LocalDateTimeUtil.format(LocalDateTimeUtil.beginOfDay(LocalDateTimeUtil.parse(param.getStartTime(), DatePattern.NORM_DATE_PATTERN)),DatePattern.NORM_DATETIME_PATTERN);
String endDay = LocalDateTimeUtil.format(LocalDateTimeUtil.endOfDay(LocalDateTimeUtil.parse(param.getEndTime(), DatePattern.NORM_DATE_PATTERN)),DatePattern.NORM_DATETIME_PATTERN);
record.setItemStartTime(beginDay);
record.setItemEndTime(endDay);
return wlRecordFeignClient.findDevBaseDataByLineId(record).getData();
}
//基础数据
public RealTimeDataVo getBaseData(EleEpdPqd item2, String lineId, String dataLevel, String csDataSetLevel,Double pt, Double ct) {
RealTimeDataVo vo = new RealTimeDataVo();
String unit;
double re;
vo.setId(item2.getId());
vo.setName(item2.getName());
StatisticalDataDTO statisticalDataDTO = commonService.getLineRtData(lineId,influxDbParamUtil.getTableNameByClassId(item2.getClassId()),item2.getName(),item2.getPhase(),"avg",influxDbParamUtil.getClDidByLineId(lineId));
if (Objects.isNull(statisticalDataDTO)) {
return null;
}
vo.setTime(statisticalDataDTO.getTime());
vo.setAvgValue(statisticalDataDTO.getValue());
vo.setPhase(item2.getPhase());
vo.setOtherName(item2.getShowName());
vo.setSort(item2.getSort());
if (Objects.equals("Primary",dataLevel)) {
if (Objects.equals("Primary",csDataSetLevel)) {
vo.setAvgValue(Double.valueOf(df.format(statisticalDataDTO.getValue())));
unit = item2.getUnit();
} else {
if (HarmonicConstant.POWER_LIST.contains(item2.getShowName())) {
re = DataChangeUtil.secondaryToPrimary(item2.getPrimaryFormula(), statisticalDataDTO.getValue(), pt, ct) / 1000;
vo.setAvgValue(Double.valueOf(df.format(re)));
unit = "k" + item2.getUnit();
} else {
vo.setAvgValue(Double.valueOf(df.format(statisticalDataDTO.getValue())));
unit = item2.getUnit();
}
}
} else {
if (Objects.equals("Primary",csDataSetLevel)) {
if (HarmonicConstant.POWER_LIST.contains(item2.getShowName())) {
re = DataChangeUtil.primaryToSecondary(item2.getPrimaryFormula(), statisticalDataDTO.getValue(), pt, ct);
vo.setAvgValue(Double.valueOf(df.format(re)));
} else {
vo.setAvgValue(Double.valueOf(df.format(statisticalDataDTO.getValue())));
}
} else {
vo.setAvgValue(Double.valueOf(df.format(statisticalDataDTO.getValue())));
}
unit = item2.getUnit();
}
vo.setUnit(unit);
if (Objects.nonNull(unit)) {
vo.setOtherName(item2.getShowName() + "(" + unit + ")");
}
return vo;
}
//谐波数据
public List<RealTimeDataVo> getHarmData(EleEpdPqd item2, String lineId) {
List<RealTimeDataVo> list = new ArrayList<>();
for (int i = item2.getHarmStart(); i <= item2.getHarmEnd(); i++) {
RealTimeDataVo vo = new RealTimeDataVo();
vo.setId(item2.getId());
vo.setName(item2.getName().concat("_").concat(Integer.toString(i)));
StatisticalDataDTO statisticalDataDTO = commonService.getLineRtData(lineId,influxDbParamUtil.getTableNameByClassId(item2.getClassId()),item2.getName().concat("_").concat(Integer.toString(i)),item2.getPhase(),"avg",influxDbParamUtil.getClDidByLineId(lineId));
vo.setTime(statisticalDataDTO.getTime());
vo.setAvgValue(Double.valueOf(df.format(statisticalDataDTO.getValue())));
vo.setPhase(item2.getPhase());
vo.setOtherName(i + "" + "(" + item2.getUnit() + ")");
vo.setSort(item2.getSort());
vo.setUnit(item2.getUnit());
list.add(vo);
}
return list;
}
//间谐波数据
public List<RealTimeDataVo> getInuHarmData(EleEpdPqd item2, String lineId) {
List<RealTimeDataVo> list = new ArrayList<>();
for (int i = item2.getHarmStart(); i <= item2.getHarmEnd(); i++) {
RealTimeDataVo vo = new RealTimeDataVo();
vo.setId(item2.getId());
vo.setName(item2.getName().concat("_").concat(Integer.toString(i)));
StatisticalDataDTO statisticalDataDTO = commonService.getLineRtData(lineId,influxDbParamUtil.getTableNameByClassId(item2.getClassId()),item2.getName().concat("_").concat(Integer.toString(i)),item2.getPhase(),"avg",influxDbParamUtil.getClDidByLineId(lineId));
vo.setTime(statisticalDataDTO.getTime());
vo.setAvgValue(Double.valueOf(df.format(statisticalDataDTO.getValue())));
vo.setPhase(item2.getPhase());
vo.setOtherName((i-0.5) + "" + "(" + item2.getUnit() + ")");
vo.setSort(item2.getSort());
vo.setUnit(item2.getUnit());
list.add(vo);
}
return list;
}
//数据格式处理
public List<RealTimeDataVo> channelData(List<RealTimeDataVo> list) {
List<RealTimeDataVo> result = new ArrayList<>();
//将list 排序,并按照排序后的结果进行有序分组
LinkedHashMap<String, List<RealTimeDataVo>> map = list.stream().sorted(Comparator.comparing(RealTimeDataVo::getSort)).collect(Collectors.groupingBy(RealTimeDataVo::getName, LinkedHashMap::new, Collectors.toList()));
map.forEach((k,v)->{
RealTimeDataVo vo = new RealTimeDataVo();
RealTimeDataVo vo1 = v.get(0);
BeanUtils.copyProperties(vo1,vo);
RealTimeDataVo phaseA = v.stream().filter(s->Objects.equals(s.getPhase(),"A") || Objects.equals(s.getPhase(),"AB")).findFirst().orElse(null);
if (Objects.nonNull(phaseA)) {
vo.setValueA(phaseA.getAvgValue());
}
RealTimeDataVo phaseB = v.stream().filter(s->Objects.equals(s.getPhase(),"B") || Objects.equals(s.getPhase(),"BC")).findFirst().orElse(null);
if (Objects.nonNull(phaseB)) {
vo.setValueB(phaseB.getAvgValue());
}
RealTimeDataVo phaseC = v.stream().filter(s->Objects.equals(s.getPhase(),"C") || Objects.equals(s.getPhase(),"CA")).findFirst().orElse(null);
if (Objects.nonNull(phaseC)) {
vo.setValueC(phaseC.getAvgValue());
}
RealTimeDataVo phaseM = v.stream().filter(s->Objects.equals(s.getPhase(),"M")).findFirst().orElse(null);
if (Objects.nonNull(phaseM)) {
vo.setValueM(phaseM.getAvgValue());
}
vo.setPhase("/");
vo.setAvgValue(null);
result.add(vo);
});
return result;
}
}

View File

@@ -0,0 +1,28 @@
package com.njcn.cssystem.pojo.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* @author xy
*/
@Data
public class AppVersionParam implements Serializable {
@ApiModelProperty("app版本信息")
@NotBlank(message = "app版本信息不能为空")
private String appVersion;
@ApiModelProperty("严重度(0:优化 1:bug调整)")
@NotNull(message = "更新严重度不能为空")
private Integer sev;
@ApiModelProperty("整改内容")
private String content;
}

View File

@@ -0,0 +1,53 @@
package com.njcn.cssystem.pojo.po;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.njcn.db.bo.BaseEntity;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
*
* </p>
*
* @author xy
* @since 2024-11-21
*/
@Getter
@Setter
@TableName("app_version")
public class AppVersion extends BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* id
*/
private String id;
/**
* app版本名称
*/
private String versionName;
/**
* 版本发布时间
*/
private LocalDateTime publishTime;
/**
* 严重度(0:优化 1:bug调整)
*/
private Integer sev;
/**
* 修改内容
*/
private String content;
}

View File

@@ -0,0 +1,26 @@
package com.njcn.cssystem.pojo.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author xy
*/
@Data
public class AppVersionVo implements Serializable {
@ApiModelProperty("app版本名称")
private String versionName;
@ApiModelProperty("版本发布时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime publishTime;
@ApiModelProperty("严重度(0:优化 1:bug调整)")
private Integer sev;
}

View File

@@ -0,0 +1,65 @@
package com.njcn.cssystem.controller.baseinfo;
import com.njcn.common.pojo.annotation.OperateInfo;
import com.njcn.common.pojo.enums.common.LogEnum;
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.response.HttpResult;
import com.njcn.common.utils.HttpResultUtil;
import com.njcn.cssystem.pojo.param.AppVersionParam;
import com.njcn.cssystem.pojo.vo.AppVersionVo;
import com.njcn.cssystem.service.IAppVersionService;
import com.njcn.web.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author xy
* @since 2024-11-21
*/
@RestController
@Slf4j
@RequestMapping("/appVersion")
@Api(tags = "app版本信息")
@AllArgsConstructor
public class AppVersionController extends BaseController {
private final IAppVersionService appVersionService;
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/add")
@ApiOperation("新增app版本信息")
@ApiImplicitParam(name = "param", value = "app版本信息", required = true)
public HttpResult<String> add(@RequestBody @Validated AppVersionParam param){
String methodDescribe = getMethodDescribe("add");
boolean result = appVersionService.add(param);
if (result) {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, "新增成功", methodDescribe);
} else {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, "新增失败", methodDescribe);
}
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/getLastData")
@ApiOperation("查询app最新版本信息")
public HttpResult<AppVersionVo> getLastData(){
String methodDescribe = getMethodDescribe("getLastData");
AppVersionVo vo = appVersionService.getLastData();
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, vo, methodDescribe);
}
}

View File

@@ -0,0 +1,16 @@
package com.njcn.cssystem.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.njcn.cssystem.pojo.po.AppVersion;
/**
* <p>
* Mapper 接口
* </p>
*
* @author xy
* @since 2024-11-21
*/
public interface AppVersionMapper extends BaseMapper<AppVersion> {
}

View File

@@ -0,0 +1,21 @@
package com.njcn.cssystem.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.njcn.cssystem.pojo.param.AppVersionParam;
import com.njcn.cssystem.pojo.po.AppVersion;
import com.njcn.cssystem.pojo.vo.AppVersionVo;
/**
* <p>
* 服务类
* </p>
*
* @author xy
* @since 2024-11-21
*/
public interface IAppVersionService extends IService<AppVersion> {
boolean add(AppVersionParam param);
AppVersionVo getLastData();
}

View File

@@ -0,0 +1,48 @@
package com.njcn.cssystem.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.cssystem.mapper.AppVersionMapper;
import com.njcn.cssystem.pojo.param.AppVersionParam;
import com.njcn.cssystem.pojo.po.AppVersion;
import com.njcn.cssystem.pojo.vo.AppVersionVo;
import com.njcn.cssystem.service.IAppVersionService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Objects;
/**
* <p>
* 服务实现类
* </p>
*
* @author xy
* @since 2024-11-21
*/
@Service
public class AppVersionServiceImpl extends ServiceImpl<AppVersionMapper, AppVersion> implements IAppVersionService {
@Override
public boolean add(AppVersionParam param) {
AppVersion appVersion = new AppVersion();
appVersion.setVersionName(param.getAppVersion());
appVersion.setPublishTime(LocalDateTime.now());
appVersion.setSev(param.getSev());
appVersion.setContent(param.getContent());
return this.save(appVersion);
}
@Override
public AppVersionVo getLastData() {
AppVersionVo vo = new AppVersionVo();
LambdaQueryWrapper<AppVersion> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.orderByDesc(AppVersion::getPublishTime).last("limit 1");
AppVersion appVersion = this.getOne(queryWrapper);
if (Objects.nonNull(appVersion)) {
BeanUtils.copyProperties(appVersion, vo);
}
return vo;
}
}