设备监控实时数据相关接口调整(格式与前端不兼容)

This commit is contained in:
guofeihu
2024-07-26 13:56:39 +08:00
parent e27667c364
commit 777abc0824
13 changed files with 444 additions and 160 deletions

View File

@@ -1,7 +1,9 @@
package com.njcn.csdevice.constant;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -21,8 +23,18 @@ public interface DataParam {
//统计类型配置-便携式设备-稳态指标的ID(用于某些业务判断)
String portableDevStatisticalId = "bce2dfdfb46c4d96e92584def276d1c8";
//统计类型配置-便携式设备-稳态指标-实时数据-指标的ID(用于某些业务判断)
String portableDevStatisticaTrendlId = "91f4cbe168f97b680192aa133c6e2e78";
//统计类型配置-便携式设备-稳态指标下的三个分组ID 对应国标限值字段
Map<String,String> overlimitsGroup = new HashMap<String,String>(){{
put("6d5470f509ca271d7108a86e83bb283f","uharm");
put("ae31115b83f02f03a0d3bd65cb017121","inuharm");
put("8dc260f16280184e2b57d26668dc00b1","iharm");
}};
//便携式设备默认统计方式
String portableDevStatisticalMethods = "min";
String portableDevStatisticalMethods = "cp95";
//DecimalFormat格式化
String DecimalFormatStr = "#0.0000";
@@ -53,4 +65,10 @@ public interface DataParam {
String wlRecordUpload = "Offline_Data_Upload";
String dataStr = "data";
String nameStr = "name";
String phaseStr = "phase";
}

View File

@@ -12,6 +12,7 @@ import com.njcn.csdevice.pojo.vo.CsGroupVO;
import com.njcn.csdevice.pojo.vo.DataGroupTemplateVO;
import com.njcn.csdevice.service.ICsGroupService;
import com.njcn.csharmonic.param.CommonStatisticalQueryParam;
import com.njcn.csharmonic.pojo.vo.ThdDataTdVO;
import com.njcn.csharmonic.pojo.vo.ThdDataVO;
import com.njcn.system.pojo.po.EleEpdPqd;
import com.njcn.system.pojo.vo.EleEpdPqdListVO;
@@ -95,11 +96,22 @@ public class CsGroupController extends BaseController {
@ApiOperation("查询实时数据中实时趋势")
@ApiImplicitParams({
@ApiImplicitParam(name = "devId", value = "设备ID", required = true),
@ApiImplicitParam(name = "lineId", value = "监测点id", required = true)
@ApiImplicitParam(name = "lineId", value = "监测点id", required = true),
@ApiImplicitParam(name = "groupId", value = "指标分组ID", required = false)
})
public HttpResult<List<ThdDataVO>> getDeviceTrendData(@RequestParam("devId") String devId, @RequestParam(value = "lineId")String lineId){
public HttpResult<List<ThdDataTdVO>> getDeviceTrendData(@RequestParam("devId") String devId, @RequestParam(value = "lineId")String lineId,
@RequestParam(value = "groupId",required = false)String groupId){
String methodDescribe = getMethodDescribe("getDeviceTrendData");
List<ThdDataVO> list = csGroupService.getDeviceTrendData(devId,lineId);
List<ThdDataTdVO> list = csGroupService.getDeviceTrendData(devId,lineId,groupId);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@GetMapping("/getDeviceTrendDataGroup")
@ApiOperation("查询实时数据中实时趋势中指标分组")
public HttpResult<List<ThdDataTdVO>> getDeviceTrendDataGroup(){
String methodDescribe = getMethodDescribe("getDeviceTrendDataGroup");
List<ThdDataTdVO> list = csGroupService.getDeviceTrendDataGroup();
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe);
}
@@ -107,9 +119,9 @@ public class CsGroupController extends BaseController {
@PostMapping("/getDeviceHarmonicSpectrumData")
@ApiOperation("查询实时数据中谐波频谱")
@ApiImplicitParam(name = "commonStatisticalQueryParam",required = true)
public HttpResult<List<ThdDataVO>> getDeviceHarmonicSpectrumData(@RequestBody CommonStatisticalQueryParam commonStatisticalQueryParam){
public HttpResult<List<ThdDataTdVO.ThdDataSpectrumVOData>> getDeviceHarmonicSpectrumData(@RequestBody CommonStatisticalQueryParam commonStatisticalQueryParam){
String methodDescribe = getMethodDescribe("getDeviceHarmonicSpectrumData");
List<ThdDataVO> list = csGroupService.getDeviceHarmonicSpectrumData(commonStatisticalQueryParam);
List<ThdDataTdVO.ThdDataSpectrumVOData> list = csGroupService.getDeviceHarmonicSpectrumData(commonStatisticalQueryParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe);
}

View File

@@ -19,7 +19,6 @@ import com.njcn.system.api.DicDataFeignClient;
import com.njcn.system.pojo.po.DictData;
import com.njcn.web.pojo.param.BaseParam;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.apache.poi.ss.usermodel.Workbook;
@@ -27,8 +26,6 @@ import org.springframework.web.bind.annotation.*;
import com.njcn.web.controller.BaseController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
@@ -40,7 +37,7 @@ import java.util.stream.Stream;
/**
* <p>
* 便携式基础数据导入 前端控制器
* 离线数据导入 前端控制器
* </p>
*
* @author guofeihu
@@ -48,7 +45,7 @@ import java.util.stream.Stream;
*/
@RestController
@RequestMapping("/portableOfflLog")
@Api(tags = " 出厂设备")
@Api(tags = " 离线数据导入")
@AllArgsConstructor
public class PortableOfflLogController extends BaseController {
@@ -74,14 +71,14 @@ public class PortableOfflLogController extends BaseController {
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/queryPage")
@ApiOperation("便携式设备解析列表")
@ApiImplicitParam(name = "baseParam", value = "查询参数", required = true)
public HttpResult<Page<PortableOfflLog>> queryPage(@RequestBody BaseParam baseParam){
String methodDescribe = getMethodDescribe("queryPage");
Page<PortableOfflLog> list = iPortableOfflLogService.queryPage(baseParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe);
}
@ApiOperation("批量导入便携式设备信息")
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@ApiOperation("离线数据导入")
@PostMapping(value = "importEquipment")
public HttpResult<String> importEquipment(@RequestParam("devId") String devId
, @RequestParam("lineId") String lineId, @RequestParam("paths") String paths,HttpServletRequest request) {

View File

@@ -7,6 +7,7 @@ import com.njcn.csdevice.pojo.po.CsGroup;
import com.njcn.csdevice.pojo.vo.CsGroupVO;
import com.njcn.csdevice.pojo.vo.DataGroupTemplateVO;
import com.njcn.csharmonic.param.CommonStatisticalQueryParam;
import com.njcn.csharmonic.pojo.vo.ThdDataTdVO;
import com.njcn.csharmonic.pojo.vo.ThdDataVO;
import com.njcn.system.pojo.po.EleEpdPqd;
import com.njcn.system.pojo.vo.EleEpdPqdListVO;
@@ -51,13 +52,19 @@ public interface ICsGroupService extends IService<CsGroup> {
* 查询实时数据中实时趋势
* @return
*/
List<ThdDataVO> getDeviceTrendData(String devId,String lineId);
List<ThdDataTdVO> getDeviceTrendData(String devId, String lineId,String groupId);
/**
* 查询实时数据中实时趋势中指标分组
* @return
*/
List<ThdDataTdVO> getDeviceTrendDataGroup();
/**
* 查询实时数据中实时趋势
* @return
*/
List<ThdDataVO> getDeviceHarmonicSpectrumData(CommonStatisticalQueryParam commonStatisticalQueryParam);
List<ThdDataTdVO.ThdDataSpectrumVOData> getDeviceHarmonicSpectrumData(CommonStatisticalQueryParam commonStatisticalQueryParam);
/**
* 查询稳态指标并按照指标名称分组(A、B、...)

View File

@@ -8,7 +8,7 @@ import com.njcn.web.pojo.param.BaseParam;
/**
* <p>
* 便携式基础数据导入 服务类
* 离线数据导入 服务类
* </p>
*
* @author guofeihu

View File

@@ -30,7 +30,10 @@ import com.njcn.csdevice.pojo.vo.EnergyTemplateVO;
import com.njcn.csdevice.service.ICsDataArrayService;
import com.njcn.csdevice.service.ICsGroupService;
import com.njcn.csharmonic.param.CommonStatisticalQueryParam;
import com.njcn.csharmonic.pojo.vo.ThdDataTdVO;
import com.njcn.csharmonic.pojo.vo.ThdDataVO;
import com.njcn.device.biz.pojo.po.Overlimit;
import com.njcn.device.pq.api.OverLimitClient;
import com.njcn.event.api.EventDetailFeignClient;
import com.njcn.event.pojo.po.RmpEventDetailPO;
import com.njcn.influx.pojo.bo.CommonQueryParam;
@@ -53,6 +56,8 @@ import lombok.Data;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
@@ -62,6 +67,8 @@ import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static com.njcn.csdevice.constant.DataParam.overlimitsGroup;
/**
* <p>
* 数据分组表 服务实现类
@@ -102,6 +109,8 @@ public class CsGroupServiceImpl extends ServiceImpl<CsGroupMapper, CsGroup> impl
private final EleEvtFeignClient eleEvtFeignClient;
private final OverLimitClient overLimitClient;
@Override
@Transactional(rollbackFor = Exception.class)
public List<CsGroupVO> getGroupData(String dataSet) {
@@ -297,11 +306,16 @@ public class CsGroupServiceImpl extends ServiceImpl<CsGroupMapper, CsGroup> impl
eleEpdPqds.addAll(css.getEleEpdPqdVOS());
});
eleEpdPqds.forEach(epdPqd->{
String frequency = "";
if(epdPqd.getHarmStart() != null && epdPqd.getHarmEnd() != null){
frequency = "_" + epdPqd.getHarmStart().intValue();
}
String finalFrequency = frequency;
List<CommonQueryParam> commonQueryParams = finalCsLinePOList.stream().map(temp -> {
CommonQueryParam commonQueryParam = new CommonQueryParam();
commonQueryParam.setLineId(temp.getLineId());
commonQueryParam.setTableName(getTableNameByClassId(epdPqd.getClassId()));
commonQueryParam.setColumnName(epdPqd.getName());
commonQueryParam.setColumnName(epdPqd.getName()+ finalFrequency);
commonQueryParam.setPhasic(epdPqd.getPhase());
commonQueryParam.setDataType(commonStatisticalQueryParam.getValueType() == null ? DataParam.portableDevStatisticalMethods:commonStatisticalQueryParam.getValueType());
commonQueryParam.setProcess(data1.get(0).getProcess()+"");
@@ -355,7 +369,7 @@ public class CsGroupServiceImpl extends ServiceImpl<CsGroupMapper, CsGroup> impl
filter(dataSetDTO -> Objects.equals(dataSetDTO.getName(), DataParam.EvtParamPhase)).
collect(Collectors.toList());
if(CollectionUtil.isEmpty(evtParamPhase)){
temp.setPhaseType("-");
temp.setPhaseType(null);
}else {
temp.setPhaseType(evtParamPhase.get(0).getValue()+(Objects.isNull(evtParamPhase.get(0).getUnit())?"":evtParamPhase.get(0).getUnit()));
}
@@ -391,102 +405,184 @@ public class CsGroupServiceImpl extends ServiceImpl<CsGroupMapper, CsGroup> impl
}
@Override
public List<ThdDataVO> getDeviceTrendData(String devId, String lineId) {
List<ThdDataVO> result = new ArrayList();
public List<ThdDataTdVO> getDeviceTrendData(String devId, String lineId,String groupId) {
List<ThdDataTdVO> data = new ArrayList();
List<Overlimit> overlimits = overLimitClient.getOverLimitByLineIds(Arrays.asList(lineId)).getData();
List<CsLinePO> finalCsLinePOList = csLineFeignClient.queryLineById(Arrays.asList(lineId)).getData();
List<CsEquipmentDeliveryDTO> data1 = equipmentFeignClient.queryDeviceById(Stream.of(devId.toString()).collect(Collectors.toList())).getData();
//便携式设备稳态指标
CsStatisticalSetVO csStatisticalSetVO = csStatisticalSetFeignClient.queryStatistical(DataParam.portableDevStatisticalId).getData();
List<EleEpdPqd> eleEpdPqds = new ArrayList<>();
List<CsEquipmentDeliveryDTO> data1 = equipmentFeignClient.queryDeviceById(Stream.of(devId).collect(Collectors.toList())).getData();
//便携式设备-稳态指标-实时数据-指标
CsStatisticalSetVO csStatisticalSetVO = csStatisticalSetFeignClient.queryStatistical(DataParam.portableDevStatisticaTrendlId).getData();
csStatisticalSetVO.getSelectedList().forEach(css->{
for(EleEpdPqd epdPqd : css.getEleEpdPqdVOS()){
if(epdPqd.getHarmStart() != null && epdPqd.getHarmEnd() != null){
eleEpdPqds.add(epdPqd);
if(groupId != null && !groupId.equals(css.getDataType())){
}else{
ThdDataTdVO thdDataTdVO = new ThdDataTdVO();
thdDataTdVO.setId(css.getDataType());
thdDataTdVO.setGroupName(css.getDataTypeName());
List<Map<String,Object>> thdDataVOS = new ArrayList<>();
List<ThdDataTdVO.ThdDataTdVOData> thdDataTdVODatas = new ArrayList<>();
for(EleEpdPqd epd : css.getEleEpdPqdVOS()){
if(epd.getHarmStart() != null && epd.getHarmEnd() != null){
Map<String,Object> map = new HashMap<>();
List<ThdDataVO> result = new ArrayList();
List<EleEpdPqd> eleEpdPqds = new ArrayList<>();
eleEpdPqds.add(epd);
eleEpdPqds.forEach(epdPqd->{
for (int i = epdPqd.getHarmStart().intValue(); i < epdPqd.getHarmEnd().intValue(); i++) {
String index = i+"";
List<CommonQueryParam> commonQueryParams = finalCsLinePOList.stream().map(temp -> {
CommonQueryParam commonQueryParam = new CommonQueryParam();
commonQueryParam.setLineId(temp.getLineId());
commonQueryParam.setTableName(getTableNameByClassId(epdPqd.getClassId()));
commonQueryParam.setColumnName(epdPqd.getName()+"_"+index);
commonQueryParam.setPhasic(epdPqd.getPhase());
commonQueryParam.setDataType(DataParam.portableDevStatisticalMethods);
commonQueryParam.setProcess(data1.get(0).getProcess()+"");
commonQueryParam.setClDid(getClDidByLineId(temp.getLineId()));
return commonQueryParam;
}).collect(Collectors.toList());
List<StatisticalDataDTO> deviceRtData = commonService.getDeviceRtData(commonQueryParams);
List<ThdDataVO> collect1 = deviceRtData.stream().map(temp -> {
ThdDataVO vo = new ThdDataVO();
vo.setLineId(temp.getLineId());
vo.setPhase(temp.getPhaseType());
String position = finalCsLinePOList.stream().filter(csLinePO -> Objects.equals(csLinePO.getLineId(), vo.getLineId())).collect(Collectors.toList()).get(0).getPosition();
vo.setPosition(position);
vo.setTime(temp.getTime());
vo.setStatMethod(temp.getValueType());
vo.setStatisticalData(Double.valueOf(df.format(temp.getValue())));
vo.setStatisticalIndex(epdPqd.getId());
vo.setUnit(epdPqd.getUnit());
vo.setStatisticalName(epdPqd.getName());
vo.setAnotherName(epdPqd.getShowName());
vo.setFrequency(index);
return vo;
}).collect(Collectors.toList());
result.addAll(collect1);
}
});
map.put(DataParam.dataStr,result);
map.put(DataParam.nameStr,epd.getPhase()+epd.getShowName());
map.put(DataParam.phaseStr,epd.getPhase());
thdDataVOS.add(map);
for(ThdDataVO thdDataVO : result){
ThdDataTdVO.ThdDataTdVOData thdDataTdVOData = new ThdDataTdVO.ThdDataTdVOData();
BeanUtils.copyProperties(thdDataVO,thdDataTdVOData);
if(!overlimits.isEmpty()){
thdDataTdVOData.setInternationalValue(getOverlimitsByGroup(overlimits.get(0).getClass(),css.getDataType(),thdDataVO.getFrequency(),overlimits.get(0)));
}
thdDataTdVODatas.add(thdDataTdVOData);
}
}
}
thdDataTdVO.setThdDataVOS(thdDataVOS);
thdDataTdVO.setThdDataTdVODatas(thdDataTdVODatas);
data.add(thdDataTdVO);
}
});
eleEpdPqds.forEach(epdPqd->{
for (int i = epdPqd.getHarmStart().intValue(); i < epdPqd.getHarmEnd().intValue(); i++) {
String index = i+"";
List<CommonQueryParam> commonQueryParams = finalCsLinePOList.stream().map(temp -> {
CommonQueryParam commonQueryParam = new CommonQueryParam();
commonQueryParam.setLineId(temp.getLineId());
commonQueryParam.setTableName(getTableNameByClassId(epdPqd.getClassId()));
commonQueryParam.setColumnName(epdPqd.getName()+"_"+index);
commonQueryParam.setPhasic(epdPqd.getPhase());
commonQueryParam.setDataType(DataParam.portableDevStatisticalMethods);
commonQueryParam.setProcess(data1.get(0).getProcess()+"");
commonQueryParam.setClDid(getClDidByLineId(temp.getLineId()));
return commonQueryParam;
}).collect(Collectors.toList());
List<StatisticalDataDTO> deviceRtData = commonService.getDeviceRtData(commonQueryParams);
List<ThdDataVO> collect1 = deviceRtData.stream().map(temp -> {
ThdDataVO vo = new ThdDataVO();
vo.setLineId(temp.getLineId());
vo.setPhase(temp.getPhaseType());
String position = finalCsLinePOList.stream().filter(csLinePO -> Objects.equals(csLinePO.getLineId(), vo.getLineId())).collect(Collectors.toList()).get(0).getPosition();
vo.setPosition(position);
vo.setTime(temp.getTime());
vo.setStatMethod(temp.getValueType());
vo.setStatisticalData(Double.valueOf(df.format(temp.getValue())));
vo.setStatisticalIndex(epdPqd.getId());
vo.setUnit(epdPqd.getUnit());
vo.setStatisticalName(epdPqd.getName());
vo.setAnotherName(epdPqd.getShowName());
vo.setFrequency(index);
return vo;
}).collect(Collectors.toList());
result.addAll(collect1);
return data;
}
//根据指标分组获取对应的国标幅值
private Object getOverlimitsByGroup(Class clazz,String groupId,String frequency,Overlimit overlimit){
try {
String name = DataParam.overlimitsGroup.get(groupId);
if(name == null){
return null;
}
});
return result;
Field field = clazz.getDeclaredField(name+frequency);
field.setAccessible(true);
return field.get(overlimit);
} catch (Exception e) {
return null;
}
}
@Override
public List<ThdDataVO> getDeviceHarmonicSpectrumData(CommonStatisticalQueryParam commonStatisticalQueryParam) {
public List<ThdDataTdVO> getDeviceTrendDataGroup() {
List<ThdDataTdVO> data = new ArrayList();
//便携式设备-稳态指标-实时数据-指标
CsStatisticalSetVO csStatisticalSetVO = csStatisticalSetFeignClient.queryStatistical(DataParam.portableDevStatisticaTrendlId).getData();
csStatisticalSetVO.getSelectedList().forEach(css->{
ThdDataTdVO thdDataTdVO = new ThdDataTdVO();
thdDataTdVO.setId(css.getDataType());
thdDataTdVO.setGroupName(css.getDataTypeName());
data.add(thdDataTdVO);
});
return data;
}
@Override
public List<ThdDataTdVO.ThdDataSpectrumVOData> getDeviceHarmonicSpectrumData(CommonStatisticalQueryParam commonStatisticalQueryParam) {
formatQueryParamList(commonStatisticalQueryParam);
List<ThdDataVO> result = new ArrayList();
List<ThdDataTdVO.ThdDataSpectrumVOData> thdDataSpectrumVODatas = new ArrayList<>();
List<CsEquipmentDeliveryDTO> data1 = equipmentFeignClient.queryDeviceById(Stream.of(commonStatisticalQueryParam.getDevId()).collect(Collectors.toList())).getData();
List<CsLinePO> finalCsLinePOList = csLineFeignClient.queryLineById(Arrays.asList(commonStatisticalQueryParam.getLineId())).getData();
if(commonStatisticalQueryParam.getList() != null && commonStatisticalQueryParam.getList().size() > 0){
for (CommonStatisticalQueryParam param : commonStatisticalQueryParam.getList()){
if(param.getStatisticalId() == null){
continue;
}
List<EleEpdPqd> eleEpdPqds = csStatisticalSetFeignClient.queryStatisticalSelect(param.getStatisticalId()).getData();
ThdDataTdVO.ThdDataSpectrumVOData thdDataSpectrumVOData = new ThdDataTdVO.ThdDataSpectrumVOData();
List<ThdDataVO> result = new ArrayList();
eleEpdPqds.forEach(epdPqd->{
List<CommonQueryParam> commonQueryParams = finalCsLinePOList.stream().map(temp -> {
CommonQueryParam commonQueryParam = new CommonQueryParam();
commonQueryParam.setLineId(temp.getLineId());
commonQueryParam.setTableName(getTableNameByClassId(epdPqd.getClassId()));
commonQueryParam.setColumnName(epdPqd.getName()+ (param.getFrequency() == null ? "":"_"+param.getFrequency()));
commonQueryParam.setPhasic(epdPqd.getPhase());
commonQueryParam.setDataType(commonStatisticalQueryParam.getValueType());
commonQueryParam.setProcess(data1.get(0).getProcess()+"");
commonQueryParam.setClDid(getClDidByLineId(temp.getLineId()));
return commonQueryParam;
}).collect(Collectors.toList());
List<StatisticalDataDTO> deviceRtData = commonService.getDeviceRtData(commonQueryParams);
List<ThdDataVO> collect1 = deviceRtData.stream().map(temp -> {
ThdDataVO vo = new ThdDataVO();
vo.setLineId(temp.getLineId());
vo.setPhase(temp.getPhaseType());
String position = finalCsLinePOList.stream().filter(csLinePO -> Objects.equals(csLinePO.getLineId(), vo.getLineId())).collect(Collectors.toList()).get(0).getPosition();
vo.setPosition(position);
vo.setTime(temp.getTime());
vo.setStatMethod(temp.getValueType());
vo.setStatisticalData(Double.valueOf(df.format(temp.getValue())));
vo.setStatisticalIndex(epdPqd.getId());
vo.setUnit(epdPqd.getUnit());
vo.setStatisticalName(epdPqd.getName());
vo.setAnotherName(epdPqd.getShowName());
return vo;
}).collect(Collectors.toList());
result.addAll(collect1);
if(epdPqd.getHarmStart() != null && epdPqd.getHarmEnd() != null){
thdDataSpectrumVOData.setShowName(getShowName(param.getStatisticalId()));
for (int i = epdPqd.getHarmStart().intValue(); i < epdPqd.getHarmEnd().intValue(); i++) {
String index = i+"";
List<CommonQueryParam> commonQueryParams = finalCsLinePOList.stream().map(temp -> {
CommonQueryParam commonQueryParam = new CommonQueryParam();
commonQueryParam.setLineId(temp.getLineId());
commonQueryParam.setTableName(getTableNameByClassId(epdPqd.getClassId()));
commonQueryParam.setColumnName(epdPqd.getName()+"_"+index);
commonQueryParam.setPhasic(epdPqd.getPhase());
commonQueryParam.setDataType(DataParam.portableDevStatisticalMethods);
commonQueryParam.setProcess(data1.get(0).getProcess()+"");
commonQueryParam.setClDid(getClDidByLineId(temp.getLineId()));
return commonQueryParam;
}).collect(Collectors.toList());
List<StatisticalDataDTO> deviceRtData = commonService.getDeviceRtData(commonQueryParams);
List<ThdDataVO> collect1 = deviceRtData.stream().map(temp -> {
ThdDataVO vo = new ThdDataVO();
vo.setLineId(temp.getLineId());
vo.setPhase(temp.getPhaseType());
String position = finalCsLinePOList.stream().filter(csLinePO -> Objects.equals(csLinePO.getLineId(), vo.getLineId())).collect(Collectors.toList()).get(0).getPosition();
vo.setPosition(position);
vo.setTime(temp.getTime());
vo.setStatMethod(temp.getValueType());
vo.setStatisticalData(Double.valueOf(df.format(temp.getValue())));
vo.setStatisticalIndex(epdPqd.getId());
vo.setUnit(epdPqd.getUnit());
vo.setStatisticalName(epdPqd.getName());
vo.setAnotherName(epdPqd.getShowName());
vo.setFrequency(index);
return vo;
}).collect(Collectors.toList());
result.addAll(collect1);
}
}
});
thdDataSpectrumVOData.setThdDataVOS(result);
thdDataSpectrumVODatas.add(thdDataSpectrumVOData);
}
}
return result;
return thdDataSpectrumVODatas;
}
private String getShowName(String statisticalId){
CsStatisticalSetVO csStatisticalSetVO = csStatisticalSetFeignClient.queryStatistical(DataParam.portableDevStatisticaTrendlId).getData();
for(EleEpdPqdListVO eleEpdPqdListVO : csStatisticalSetVO.getSelectedList()){
if(statisticalId.equals(eleEpdPqdListVO.getDataType())){
return eleEpdPqdListVO.getDataTypeName();
}
}
csStatisticalSetVO = csStatisticalSetFeignClient.queryStatistical(DataParam.portableDevStatisticalId).getData();
for(EleEpdPqdListVO eleEpdPqdListVO : csStatisticalSetVO.getSelectedList()){
if(statisticalId.equals(eleEpdPqdListVO.getDataType())){
return eleEpdPqdListVO.getDataTypeName();
}
}
return null;
}
@Override

View File

@@ -2,7 +2,6 @@ package com.njcn.csdevice.service.impl;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.gson.Gson;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.csdevice.constant.DataParam;
import com.njcn.csdevice.mapper.PortableOfflLogMapper;
@@ -11,25 +10,28 @@ import com.njcn.csdevice.service.IPortableOfflLogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.csdevice.param.UploadDataParam;
import com.njcn.csharmonic.api.OfflineDataUploadFeignClient;
import com.njcn.csharmonic.offline.constant.OfflineConstant;
import com.njcn.csharmonic.offline.log.vo.NewTaglogbuffer;
import com.njcn.csharmonic.offline.mincfg.tagComtradeCfg;
import com.njcn.csharmonic.offline.vo.Response;
import com.njcn.influx.pojo.po.cs.PqdData;
import com.njcn.oss.utils.FileStorageUtil;
import com.njcn.system.api.DicDataFeignClient;
import com.njcn.system.pojo.po.DictData;
import com.njcn.web.pojo.param.BaseParam;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* <p>
* 便携式基础数据导入 服务实现类
* 离线数据导入 服务实现类
* </p>
*
* @author guofeihu
@@ -48,38 +50,40 @@ public class PortableOfflLogServiceImpl extends ServiceImpl<PortableOfflLogMappe
@Override
public Page<PortableOfflLog> queryPage(BaseParam baseParam) {
Page<PortableOfflLog> returnpage = new Page<> (baseParam.getPageNum(), baseParam.getPageSize ());
if(baseParam.getSearchBeginTime()!=null) baseParam.setSearchBeginTime(baseParam.getSearchBeginTime()+" 00:00:00");
if(baseParam.getSearchEndTime()!=null) baseParam.setSearchEndTime(baseParam.getSearchEndTime()+" 23:59:59");
if(baseParam.getSearchBeginTime()!=null) baseParam.setSearchBeginTime(baseParam.getSearchBeginTime()+DataParam.startTime);
if(baseParam.getSearchEndTime()!=null) baseParam.setSearchEndTime(baseParam.getSearchEndTime()+DataParam.endTime);
returnpage = this.getBaseMapper().queryPage(returnpage,baseParam);
return returnpage;
}
@Override
@Transactional(rollbackFor = {Exception.class})
public void importEquipment(UploadDataParam uploadDataParam) {
//获取离线上传对应的字典规则
//获取离线上传对应的字典规则(字典用来控制上传的文件夹名称,其中字典的name代表名称,code代表该文件夹下对应的解析规则且code不能更改)
List<DictData> dictDatas = dicDataFeignClient.getDicDataByTypeCode(DataParam.wlRecordUpload).getData();
List<Response> responses = new ArrayList<>();
List<MultipartFile> files = uploadDataParam.getFiles();
List<String> paths = uploadDataParam.getPaths();
//便利每个文件夹
for(DictData dictData : dictDatas){
List<MultipartFile> fileList = new ArrayList<>();
for (int i = 0; i < files.size(); i++) {
if(paths.get(i).indexOf(dictData.getName())!=-1){
fileList.add(files.get(i));
}
for(MultipartFile file : uploadDataParam.getFiles()){
//获取每个文件夹下对应的文件信息
if(checkPrevsFolder(file.getOriginalFilename(),dictData.getName())!=null) fileList.add(file);
}
if(!fileList.isEmpty()){
//将当前文件夹下的文件统一解析
byte[] resp = offlineDataUploadFeignClient.uploadAnalysis(fileList,dictData.getCode()).getData();
//解析的返回的是复杂对象所以直接转成byte数组
ByteArrayInputStream bis = new ByteArrayInputStream(resp);
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(bis);
Object obj = ois.readObject();
//实际返回的是List<Response> 也即:该文件夹下所有解析的文件对应的结果集
List<Response> response = (List<Response>) obj;
responses.addAll(response);
} catch (Exception e) {
e.printStackTrace();
throw new BusinessException("数据集对象转字节数组失败");
throw new BusinessException(OfflineConstant.BYTETODATA_FAIL);
} finally {
try {
ois.close();
@@ -91,6 +95,8 @@ public class PortableOfflLogServiceImpl extends ServiceImpl<PortableOfflLogMappe
}
}
//min文件夹下的文件是否解析过
boolean minFlag = true;
//开始上传文件、记录上传日志、解析的文件结果入库
//最外层便利所有文件确保所有文件都上传及记录上传日志
for(MultipartFile file : uploadDataParam.getFiles()){
@@ -98,34 +104,71 @@ public class PortableOfflLogServiceImpl extends ServiceImpl<PortableOfflLogMappe
PortableOfflLog portableOfflLog = new PortableOfflLog();
portableOfflLog.setName(file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("/")+1));
portableOfflLog.setPath(file.getOriginalFilename());
portableOfflLog.setDataPath(fileStorageUtil.uploadMultipart(file, DataParam.wlRecordPath+uploadDataParam.getDevId()+"/"+uploadDataParam.getLineId()+"/"));
portableOfflLog.setDataPath(fileStorageUtil.uploadMultipart(file, DataParam.wlRecordPath+uploadDataParam.getDevId()+"/"+uploadDataParam.getLineId()+"/"+getFolderName()+"/"));
portableOfflLog.setLogsIndex(IdUtil.simpleUUID());
portableOfflLog.setState(1);
portableOfflLog.setState(0);
//默认总条数及入库数为0(防止解析的数据重复插入及上传的文件目录路径错误)
portableOfflLog.setAllCount(0);
portableOfflLog.setRealCount(0);
//开始匹配解析的文件结果入库
for(Response response : responses){
//当前文件匹配到解析结果
if(file.getOriginalFilename().indexOf(response.getFilename())!=-1){
//设置当前文件总条数
//portableOfflLog.setAllCount(allCount);
//min解析结果较为特殊所有的文件解析后只有一条结果
if(OfflineConstant.MIN.equals(response.getFilename()) && checkPrevsFolder(file.getOriginalFilename(),OfflineConstant.MIN)!=null){
List<PqdData> pqdData = (List<PqdData>) response.getObj();
if(response.getState() != null){
portableOfflLog.setState(response.getState());
}
if(pqdData != null && !pqdData.isEmpty()){
portableOfflLog.setState(1);
portableOfflLog.setAllCount(pqdData.size());
if(minFlag){
//min结果集解析入库后就不需要在解析了
minFlag = false;
portableOfflLog.setRealCount(pqdData.size());
}
}
}else if(file.getOriginalFilename().equals(response.getFilename())){
//判断当前解析的数据属于哪种结果(目前来说三种:comtrade、log、min)
if(checkPrevsFolder(file.getOriginalFilename(),OfflineConstant.COMTRADE)!=null){
if(response.getState() != null){
portableOfflLog.setState(response.getState());
}
tagComtradeCfg tagComtradeCfg = (tagComtradeCfg) response.getObj();
if(tagComtradeCfg != null){
portableOfflLog.setState(1);
portableOfflLog.setAllCount(1);
portableOfflLog.setRealCount(1);
}
}
if(checkPrevsFolder(file.getOriginalFilename(),OfflineConstant.LOG)!=null){
if(response.getState() != null){
portableOfflLog.setState(response.getState());
}
List<NewTaglogbuffer> newTaglogbuffers = (List<NewTaglogbuffer>) response.getObj();
if(newTaglogbuffers != null && !newTaglogbuffers.isEmpty()){
portableOfflLog.setState(1);
portableOfflLog.setAllCount(newTaglogbuffers.size());
portableOfflLog.setRealCount(newTaglogbuffers.size());
}
}
}
}
this.baseMapper.insert(portableOfflLog);
}
}
private static <T> T convertToObj(LinkedHashMap<String,Object> map,Class<T> clazz) throws Exception{
T obj = clazz.newInstance();
for(Map.Entry<String,Object> entry : map.entrySet()){
String fieldName = entry.getKey();
Object fieldValue = entry.getValue();
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(obj,fieldValue);
//根据文件全路径(包含文件夹)解析文件的分类
private String checkPrevsFolder(String filePath,String type){
List<String> paths = Arrays.asList(filePath.split("/"));
if(paths.contains(type)){
return type;
}
return obj;
return null;
}
private String getFolderName(){
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
return sdf.format(calendar.getTime());
}
}

View File

@@ -0,0 +1,19 @@
package com.njcn.csharmonic.offline.constant;
public interface OfflineConstant {
String COMTRADE = "comtrade";
String MIN = "min";
String LOG = "log";
String BYTETODATA_FAIL = "字节数组转结果集失败";
String DATATOBYTE_FAIL = "结果集转字节数组失败";
String BIN = ".bin";
String CFG = ".cfg";
}

View File

@@ -70,39 +70,39 @@ public class AnalyseComtradeCfg {
List<PqdData> pqdData = new ArrayList<>();
HashMap hashMapA = new HashMap<>();
hashMapA.put("phasic_type","A");
hashMapA.put("value_type",valueType);
hashMapA.put("phaseType","A");
hashMapA.put("valueType",valueType);
hashMapA.put("time",dateTime.toInstant());
HashMap hashMapB = new HashMap<>();
hashMapB.put("phasic_type","B");
hashMapB.put("value_type",valueType);
hashMapB.put("phaseType","B");
hashMapB.put("valueType",valueType);
hashMapB.put("time",dateTime.toInstant());
HashMap hashMapC = new HashMap<>();
hashMapC.put("phasic_type","C");
hashMapC.put("value_type",valueType);
hashMapC.put("phaseType","C");
hashMapC.put("valueType",valueType);
hashMapC.put("time",dateTime.toInstant());
HashMap hashMapM = new HashMap<>();
hashMapM.put("phasic_type","M");
hashMapM.put("value_type",valueType);
hashMapM.put("phaseType","M");
hashMapM.put("valueType",valueType);
hashMapM.put("time",dateTime.toInstant());
HashMap hashMapAB = new HashMap<>();
hashMapAB.put("phasic_type","AB");
hashMapAB.put("value_type",valueType);
hashMapAB.put("phaseType","AB");
hashMapAB.put("valueType",valueType);
hashMapAB.put("time",dateTime.toInstant());
HashMap hashMapBC = new HashMap<>();
hashMapBC.put("phasic_type","BC");
hashMapBC.put("value_type",valueType);
hashMapBC.put("phaseType","BC");
hashMapBC.put("valueType",valueType);
hashMapBC.put("time",dateTime.toInstant());
HashMap hashMapCA = new HashMap<>();
hashMapCA.put("phasic_type","CA");
hashMapCA.put("value_type",valueType);
hashMapCA.put("phaseType","CA");
hashMapCA.put("valueType",valueType);
hashMapCA.put("time",dateTime.toInstant());
@@ -297,17 +297,26 @@ public class AnalyseComtradeCfg {
hashMapB.put("pq_Plt",ulFlicker[1]);
hashMapC.put("pq_Plt",ulFlicker[2]);
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
PqdData pqdDataA = mapper.convertValue(hashMapA, PqdData.class);
PqdData pqdDataB = mapper.convertValue(hashMapB, PqdData.class);
PqdData pqdDataC = mapper.convertValue(hashMapC, PqdData.class);
PqdData pqdDataM = mapper.convertValue(hashMapM, PqdData.class);
PqdData pqdDataAB = mapper.convertValue(hashMapAB, PqdData.class);
PqdData pqdDataBC = mapper.convertValue(hashMapBC, PqdData.class);
PqdData pqdDataCA = mapper.convertValue(hashMapCA, PqdData.class);
pqdData.add(pqdDataA);
pqdData.add(pqdDataB);
pqdData.add(pqdDataC);
pqdData.add(pqdDataM);
pqdData.add(pqdDataAB);
pqdData.add(pqdDataBC);
pqdData.add(pqdDataCA);
return pqdData;

View File

@@ -82,39 +82,39 @@ public class AnalyseComtradeCfg1 {
List<PqdData> pqdData = new ArrayList<>();
HashMap hashMapA = new HashMap<>();
hashMapA.put("phasic_type","A");
hashMapA.put("value_type",valueType);
hashMapA.put("phaseType","A");
hashMapA.put("valueType",valueType);
hashMapA.put("time",dateTime.toInstant());
HashMap hashMapB = new HashMap<>();
hashMapB.put("phasic_type","B");
hashMapB.put("value_type",valueType);
hashMapB.put("phaseType","B");
hashMapB.put("valueType",valueType);
hashMapB.put("time",dateTime.toInstant());
HashMap hashMapC = new HashMap<>();
hashMapC.put("phasic_type","C");
hashMapC.put("value_type",valueType);
hashMapC.put("phaseType","C");
hashMapC.put("valueType",valueType);
hashMapC.put("time",dateTime.toInstant());
HashMap hashMapM = new HashMap<>();
hashMapM.put("phasic_type","M");
hashMapM.put("value_type",valueType);
hashMapM.put("phaseType","M");
hashMapM.put("valueType",valueType);
hashMapM.put("time",dateTime.toInstant());
HashMap hashMapAB = new HashMap<>();
hashMapAB.put("phasic_type","AB");
hashMapAB.put("value_type",valueType);
hashMapAB.put("phaseType","AB");
hashMapAB.put("valueType",valueType);
hashMapAB.put("time",dateTime.toInstant());
HashMap hashMapBC = new HashMap<>();
hashMapBC.put("phasic_type","BC");
hashMapBC.put("value_type",valueType);
hashMapBC.put("phaseType","BC");
hashMapBC.put("valueType",valueType);
hashMapBC.put("time",dateTime.toInstant());
HashMap hashMapCA = new HashMap<>();
hashMapCA.put("phasic_type","CA");
hashMapCA.put("value_type",valueType);
hashMapCA.put("phaseType","CA");
hashMapCA.put("valueType",valueType);
hashMapCA.put("time",dateTime.toInstant());
@@ -315,11 +315,19 @@ public class AnalyseComtradeCfg1 {
PqdData pqdDataB = mapper.convertValue(hashMapB, PqdData.class);
PqdData pqdDataC = mapper.convertValue(hashMapC, PqdData.class);
PqdData pqdDataM = mapper.convertValue(hashMapM, PqdData.class);
PqdData pqdDataAB = mapper.convertValue(hashMapAB, PqdData.class);
PqdData pqdDataBC = mapper.convertValue(hashMapBC, PqdData.class);
PqdData pqdDataCA = mapper.convertValue(hashMapCA, PqdData.class);
pqdData.add(pqdDataA);
pqdData.add(pqdDataB);
pqdData.add(pqdDataC);
pqdData.add(pqdDataM);
pqdData.add(pqdDataAB);
pqdData.add(pqdDataBC);
pqdData.add(pqdDataCA);
return pqdData;

View File

@@ -10,6 +10,9 @@ public class Response implements Serializable {
@ApiModelProperty("文件名")
private String filename;
@ApiModelProperty("解析结果状态(0-未解析 1-解析成功 2-解析失败 3-文件不存在)")
private Integer state;
@ApiModelProperty("解析后数据")
private Object obj;

View File

@@ -0,0 +1,51 @@
package com.njcn.csharmonic.pojo.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
* <p>
* 设备监控-实时数据
* </p>
*
* @author guofeihu
* @since 2024-07-26
*/
@Data
public class ThdDataTdVO{
@ApiModelProperty("id")
private String id;
@ApiModelProperty("指标分组名称")
private String groupName;
@ApiModelProperty("该分组下的各个指标的谐坡次数对应值")
private List<Map<String,Object>> thdDataVOS;
@ApiModelProperty("该指标下的谐坡次数对应值")
private List<ThdDataTdVOData> thdDataTdVODatas;
@Data
public static class ThdDataTdVOData extends ThdDataVO{
@ApiModelProperty(value = "国标限值名称")
private String international = "国标限值";
@ApiModelProperty(value = "国标限值")
private Object internationalValue;
}
@Data
public static class ThdDataSpectrumVOData{
@ApiModelProperty(value = "指标名称")
private String showName;
@ApiModelProperty(value = "国标限值")
private List<ThdDataVO> thdDataVOS;
}
}

View File

@@ -1,6 +1,7 @@
package com.njcn.csharmonic.service.impl;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.csharmonic.offline.constant.OfflineConstant;
import com.njcn.csharmonic.offline.log.Log;
import com.njcn.csharmonic.offline.log.vo.NewTaglogbuffer;
import com.njcn.csharmonic.offline.mincfg.AnalyseComtradeCfg;
@@ -8,6 +9,7 @@ import com.njcn.csharmonic.offline.mincfg.tagComtradeCfg;
import com.njcn.csharmonic.offline.vo.Response;
import com.njcn.csharmonic.service.OfflineDataUploadService;
import com.njcn.influx.pojo.po.cs.PqdData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayOutputStream;
@@ -23,6 +25,7 @@ import java.util.List;
* @version 1.0.0
* @createTime 2024/7/22 13:56
*/
@Slf4j
@Service
public class OfflineDataUploadServiceImpl implements OfflineDataUploadService {
@@ -34,21 +37,39 @@ public class OfflineDataUploadServiceImpl implements OfflineDataUploadService {
List<Response> responses = new ArrayList<>();
//min解析较为特殊需要同时解析所有文件
if(!files.isEmpty() && "min".equals(type)){
if(!files.isEmpty() && OfflineConstant.MIN.equals(type)){
Response response = new Response();
response.setFilename("min");
List<PqdData> pqdData = AnalyseComtradeCfg.processDirectory(files);
response.setFilename(OfflineConstant.MIN);
List<PqdData> pqdData = null;
try {
pqdData = AnalyseComtradeCfg.processDirectory(files);
} catch (Exception e) {
log.error("min文件夹下的数据文件解析失败");
response.setState(2);
}
response.setObj(pqdData);
responses.add(response);
}else{
for(MultipartFile file : files){
Response response = new Response();
response.setFilename(file.getOriginalFilename());
if("comtrade".equals(type) && file.getOriginalFilename().indexOf(".cfg") != -1) {
tagComtradeCfg tagComtradeCfg = AnalyseComtradeCfg.analyseComtradeCfg(file);
if(OfflineConstant.COMTRADE.equals(type) && file.getOriginalFilename().indexOf(OfflineConstant.CFG) != -1) {
tagComtradeCfg tagComtradeCfg = null;
try {
tagComtradeCfg = AnalyseComtradeCfg.analyseComtradeCfg(file);
} catch (Exception e) {
log.error("当前文件:{},解析失败",file.getOriginalFilename());
response.setState(2);
}
response.setObj(tagComtradeCfg);
}else if("log".equals(type) && file.getOriginalFilename().indexOf(".bin") != -1){
List<NewTaglogbuffer> newTaglogbuffers = Log.convertLog(file);
}else if(OfflineConstant.LOG.equals(type) && file.getOriginalFilename().indexOf(OfflineConstant.BIN) != -1){
List<NewTaglogbuffer> newTaglogbuffers = null;
try {
newTaglogbuffers = Log.convertLog(file);
} catch (Exception e) {
log.error("当前文件:{},解析失败",file.getOriginalFilename());
response.setState(2);
}
response.setObj(newTaglogbuffers);
}
responses.add(response);
@@ -59,7 +80,7 @@ public class OfflineDataUploadServiceImpl implements OfflineDataUploadService {
bytes = baos.toByteArray();
} catch (IOException e) {
e.printStackTrace();
throw new BusinessException("数据集对象转字节数组失败");
throw new BusinessException(OfflineConstant.DATATOBYTE_FAIL);
} finally {
oos.close();
baos.close();