Browse Source

add:历史数据查询

zhongwei
haungxing 6 months ago
parent
commit
0060d8446c
  1. 3
      hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/interactive/constants/FunctionConstants.java
  2. 9
      hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/interactive/vo/DataVO.java
  3. 1
      hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/interactive/vo/ExtraVO.java
  4. 36
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/interactive/constants/DataMethodEnum.java
  5. 40
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/interactive/constants/DateEnum.java
  6. 3
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/interactive/constants/FuncRouteEnum.java
  7. 34
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/interactive/controller/AnalyseDataController.java
  8. 16
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/interactive/service/IAnalyseDataService.java
  9. 136
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/interactive/service/impl/AnalyseDataServiceImpl.java
  10. 42
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/interactive/service/impl/ExtraResolveStrategyService.java
  11. 13
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/interactive/service/impl/InteractiveServiceImpl.java
  12. 35
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/interactive/vo/HistoryDataSearchVO.java
  13. 2
      hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/obj/mapper/ProjectContentMapper.xml

3
hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/interactive/constants/FunctionConstants.java

@ -23,7 +23,8 @@ public interface FunctionConstants {
/**选项**/ /**选项**/
CHOOSE("4"), CHOOSE("4"),
/**确认**/ /**确认**/
CONFIRM("5") CONFIRM("5"),
CHART("6");
; ;
@Getter @Getter
private String type; private String type;

9
hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/interactive/vo/DataVO.java

@ -21,12 +21,15 @@ public class DataVO implements Serializable {
@JSONField(name = "time_end") @JSONField(name = "time_end")
private String endTime; private String endTime;
/**包括:"其它"、"最大值"、"最小值"、"总和值"、"平均值"**/
private String method;
/**实时数据结果集**/ /**实时数据结果集**/
private RealDataVO real; private RealDataVO real;
private DataItemVO item; private DataItemVO item;
/**包括:"其它"、"最大值"、"最小值"、"总和值"、"平均值"**/
private String method;
@JSONField(name = "data_type")
private String dataType;
} }

1
hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/interactive/vo/ExtraVO.java

@ -39,4 +39,5 @@ public class ExtraVO implements Serializable {
@ApiModelProperty("选项") @ApiModelProperty("选项")
private List<? extends SelectionVO> selection; private List<? extends SelectionVO> selection;
} }

36
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/interactive/constants/DataMethodEnum.java

@ -0,0 +1,36 @@
package com.hnac.hzims.bigmodel.interactive.constants;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
/**
* @Author: huangxing
* @Date: 2024/05/29 08:31
*/
@AllArgsConstructor
public enum DataMethodEnum {
USUAL("详情",6,"详情"),
EARLIEST("最早值",0,"最早值"),
MAX("最大值",1,"最大值"),
MIN("最小值",2,"最小值"),
AVERAGE("平均值",3,"平均值"),
SUM("累计值/和值",4,"总和值"),
DIFFERENCE("变化值/差值",5,"变化值"),
LATEST("最新值",6,"最新值"),
;
@Getter
private String name;
@Getter
private Integer accessRule;
@Getter
private String method;
public static DataMethodEnum getEnumByMethod(String method) {
return Arrays.stream(DataMethodEnum.class.getEnumConstants())
.filter(e -> e.getMethod().equals(method))
.findFirst().orElse(null);
}
}

40
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/interactive/constants/DateEnum.java

@ -0,0 +1,40 @@
package com.hnac.hzims.bigmodel.interactive.constants;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
/**
* @Author: huangxing
* @Date: 2024/05/28 11:37
*/
@AllArgsConstructor
public enum DateEnum {
YEAR("year","年","按年",5,6),
MONTH("month","月","按月",4,5),
DAY("day","日","按日",3,3),
HOUR("hour","时","按时",2,2),
MINUTE("minute","分","按分",1,1),
SECOND("second","秒","按秒",0,0),
;
@Getter
private String code;
@Getter
private String name;
@Getter
private String dateType;
@Getter
private int order;
@Getter
private Integer saveTimeType;
public static DateEnum getDateEnumByType(String dateType) {
return Arrays.stream(DateEnum.class.getEnumConstants()).filter(d -> d.getDateType().equals(dateType)).findFirst().orElse(null);
}
public static DateEnum getDateEnumByOrder(int order) {
return Arrays.stream(DateEnum.class.getEnumConstants()).filter(d -> d.getOrder() == order).findFirst().orElse(null);
}
}

3
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/interactive/constants/FuncRouteEnum.java

@ -21,7 +21,8 @@ public enum FuncRouteEnum {
CHOOSE_FAULT("choose_fault","选择故障",null), CHOOSE_FAULT("choose_fault","选择故障",null),
CONFIRM_YK("confirm_yk","遥控确认", FunctionConstants.TypeEnum.PARAMS), CONFIRM_YK("confirm_yk","遥控确认", FunctionConstants.TypeEnum.PARAMS),
SHOW_PARAM("show_param","设备参数查询", FunctionConstants.TypeEnum.PARAMS), SHOW_PARAM("show_param","设备参数查询", FunctionConstants.TypeEnum.PARAMS),
CHOOSE_YC("choose_yc","选择遥测数据",FunctionConstants.TypeEnum.CHOOSE) CHOOSE_YC("choose_yc","选择遥测数据",FunctionConstants.TypeEnum.CHOOSE),
HISTORY_DATA("history_data","查询历史数据",FunctionConstants.TypeEnum.CHART),
; ;
@Getter @Getter
private String funcCode; private String funcCode;

34
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/interactive/controller/AnalyseDataController.java

@ -0,0 +1,34 @@
package com.hnac.hzims.bigmodel.interactive.controller;
import com.alibaba.fastjson.JSONObject;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.hnac.hzims.bigmodel.interactive.service.IAnalyseDataService;
import com.hnac.hzims.bigmodel.interactive.vo.HistoryDataSearchVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springblade.core.tool.api.R;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: huangxing
* @Date: 2024/05/29 09:22
*/
@RequestMapping("/analyse/data")
@AllArgsConstructor
@Api(value = "数据查询管理",tags = "数据查询管理")
@RestController
public class AnalyseDataController {
private final IAnalyseDataService analyseDataService;
@GetMapping("/getHistoryData")
@ApiOperation("获取历史数据")
@ApiOperationSupport(order = 1)
public R getHistoryData(@Validated HistoryDataSearchVO searchVO) {
return R.data(analyseDataService.getHistoryData(searchVO));
}
}

16
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/interactive/service/IAnalyseDataService.java

@ -0,0 +1,16 @@
package com.hnac.hzims.bigmodel.interactive.service;
import com.alibaba.fastjson.JSONObject;
import com.hnac.hzims.bigmodel.interactive.vo.AnswerVO;
import com.hnac.hzims.bigmodel.interactive.vo.ExtraVO;
import com.hnac.hzims.bigmodel.interactive.vo.HistoryDataSearchVO;
/**
* @Author: huangxing
* @Date: 2024/05/28 11:29
*/
public interface IAnalyseDataService {
ExtraVO getHistoryData(HistoryDataSearchVO searchVO);
}

136
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/interactive/service/impl/AnalyseDataServiceImpl.java

@ -0,0 +1,136 @@
package com.hnac.hzims.bigmodel.interactive.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.hnac.hzims.bigmodel.interactive.constants.DataMethodEnum;
import com.hnac.hzims.bigmodel.interactive.constants.DateEnum;
import com.hnac.hzims.bigmodel.interactive.constants.FuncRouteEnum;
import com.hnac.hzims.bigmodel.interactive.constants.FunctionConstants;
import com.hnac.hzims.bigmodel.interactive.service.IAnalyseDataService;
import com.hnac.hzims.bigmodel.interactive.vo.AnswerVO;
import com.hnac.hzims.bigmodel.interactive.vo.ExtraVO;
import com.hnac.hzims.bigmodel.interactive.vo.HistoryDataSearchVO;
import com.hnac.hzinfo.sdk.core.response.Result;
import com.hnac.hzinfo.sdk.v5.device.DeviceDataClient;
import com.hnac.hzinfo.sdk.v5.device.dto.ReductionAttrDataDTO;
import com.hnac.hzinfo.sdk.v5.device.dto.ReductionDataDTO;
import com.hnac.hzinfo.sdk.v5.device.vo.ReductionDataVO;
import lombok.AllArgsConstructor;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.temporal.ChronoUnit;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Author: huangxing
* @Date: 2024/05/28 11:29
*/
@Service
@AllArgsConstructor
public class AnalyseDataServiceImpl implements IAnalyseDataService {
private final DeviceDataClient deviceDataClient;
public static final int DATA_COUNT_MAX = 8000;
@Override
public ExtraVO getHistoryData(HistoryDataSearchVO searchVO) {
if(DataMethodEnum.USUAL.getMethod().equals(searchVO.getMethod())) {
searchVO.setDataType(DateEnum.SECOND.getDateType());
}
// 聚合数据方式处理
DateEnum dateEnum = DateEnum.getDateEnumByType(searchVO.getDataType());
searchVO.setDataType(dateEnum.getDateType());
// 获取最适配时间段
DateEnum adapterDate = this.getDateEnumByDuration(searchVO.getStartTime(), searchVO.getEndTime(), dateEnum);
searchVO.setDataType(adapterDate.getDateType());
String label = "根据数据量匹配到的取数规则为:" + adapterDate.getDateType() + "查询,查询结果如下:";
ExtraVO extraVO = new ExtraVO();
extraVO.setType(FuncRouteEnum.HISTORY_DATA.getType().getType());
extraVO.setFuncCode(FuncRouteEnum.HISTORY_DATA.getFuncCode());
extraVO.setLabel(label);
Map<String,Object> params = new HashMap<>(1);
ReductionDataVO dataVO = this.getPolymerizationData(searchVO);
List<Map> datalist = dataVO.getDataList().stream().map(m -> {
m.put("val", m.get(searchVO.getSignage()));
m.remove(searchVO.getSignage());
return m;
}).collect(Collectors.toList());
params.put("data",datalist);
params.put("deviceName",searchVO.getDeviceName());
params.put("attrName",dataVO.getFieldMap().get(searchVO.getSignage()));
params.put("stationName",searchVO.getStationName());
extraVO.setParams(params);
return extraVO;
}
private ReductionDataVO getPolymerizationData(HistoryDataSearchVO searchVO) {
DataMethodEnum enumByMethod = DataMethodEnum.getEnumByMethod(searchVO.getMethod());
Assert.isTrue(Func.isNotEmpty(enumByMethod),() -> {
throw new ServiceException("数据查询聚合方式传参有误,查询失败!");
});
// 聚合数据方式处理
DateEnum dateEnum = DateEnum.getDateEnumByType(searchVO.getDataType());
ReductionDataDTO dataDTO = new ReductionDataDTO();
ReductionAttrDataDTO reductionAttrData = new ReductionAttrDataDTO();
reductionAttrData.setSignage(searchVO.getSignage());
reductionAttrData.setAccessRules(enumByMethod.getAccessRule());
reductionAttrData.setKeepFigures(2);
dataDTO.setBeginTime(LocalDateTime.parse(searchVO.getStartTime(),DateUtil.DATETIME_FORMATTER));
dataDTO.setEndTime(LocalDateTime.parse(searchVO.getEndTime(),DateUtil.DATETIME_FORMATTER));
dataDTO.setDeviceCode(searchVO.getDeviceCode());
dataDTO.setNeedPage(false);
dataDTO.setSaveTimeType(dateEnum.getSaveTimeType());
dataDTO.setTimeInterval(1);
dataDTO.setDtos(Lists.newArrayList(reductionAttrData));
Result<ReductionDataVO> dataVO = deviceDataClient.pageDeviceCodeAndSignages(dataDTO);
Assert.isTrue(dataVO.isSuccess(),() -> {
throw new ServiceException("聚合历史数据查询失败!");
});
return dataVO.getData();
}
private DateEnum getDateEnumByDuration(String startTime,String endTime,DateEnum dateEnum) {
LocalDateTime start = LocalDateTime.parse(startTime, DateUtil.DATETIME_FORMATTER);
LocalDateTime end = LocalDateTime.parse(endTime, DateUtil.DATETIME_FORMATTER);
Duration duration = Duration.between(start, end);
int count;
switch(dateEnum) {
case YEAR:
count = Long.valueOf(ChronoUnit.YEARS.between(start.toLocalDate(), end.toLocalDate())).intValue();
break;
case MONTH:
count = Long.valueOf(ChronoUnit.MONTHS.between(start.toLocalDate(), end.toLocalDate())).intValue();
break;
case DAY:
count = Long.valueOf(ChronoUnit.DAYS.between(start.toLocalDate(), end.toLocalDate())).intValue();
break;
case HOUR:
count = Long.valueOf(duration.toHours()).intValue();
break;
case MINUTE:
count = Long.valueOf(duration.toMinutes()).intValue();
break;
case SECOND:
count = Long.valueOf(duration.getSeconds()).intValue();
break;
default:
throw new ServiceException("未找到相关时间类型,查询失败!");
}
if(count <= DATA_COUNT_MAX) {
return dateEnum;
}
else {
return getDateEnumByDuration(startTime, endTime, DateEnum.getDateEnumByOrder(dateEnum.getOrder() + 1));
}
}
}

42
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/interactive/service/impl/ExtraResolveStrategyService.java

@ -5,6 +5,8 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.hnac.hzims.bigmodel.interactive.constants.FuncRouteEnum; import com.hnac.hzims.bigmodel.interactive.constants.FuncRouteEnum;
import com.hnac.hzims.bigmodel.interactive.constants.FunctionConstants; import com.hnac.hzims.bigmodel.interactive.constants.FunctionConstants;
import com.hnac.hzims.bigmodel.interactive.constants.SearchTypeEnum;
import com.hnac.hzims.bigmodel.interactive.service.IAnalyseDataService;
import com.hnac.hzims.bigmodel.interactive.vo.*; import com.hnac.hzims.bigmodel.interactive.vo.*;
import com.hnac.hzims.bigmodel.websocket.constants.RedisKeyConstants; import com.hnac.hzims.bigmodel.websocket.constants.RedisKeyConstants;
import com.hnac.hzims.operational.station.entity.StationEntity; import com.hnac.hzims.operational.station.entity.StationEntity;
@ -44,8 +46,7 @@ public class ExtraResolveStrategyService {
private final IStationVideoTypeClient videoTypeClient; private final IStationVideoTypeClient videoTypeClient;
private final JumpRouteJoinStrategy jumpRouteJoinStrategy; private final JumpRouteJoinStrategy jumpRouteJoinStrategy;
private final DeviceClient deviceClient; private final DeviceClient deviceClient;
private final BladeLogger logger; private final IAnalyseDataService analyseDataService;
private final RedisTemplate redisTemplate;
/** /**
* 解析DFP返回extra * 解析DFP返回extra
@ -101,10 +102,6 @@ public class ExtraResolveStrategyService {
} }
private ExtraVO resolveShowParam(Map<String,Object> extra) { private ExtraVO resolveShowParam(Map<String,Object> extra) {
ExtraVO result = new ExtraVO();
result.setFuncCode(FuncRouteEnum.SHOW_PARAM.getFuncCode());
result.setType(FuncRouteEnum.SHOW_PARAM.getType().getType());
Map<String,Object> param = new HashMap(1);
DataVO data = JSONObject.parseObject(JSON.toJSONString(extra.get("data")),DataVO.class); DataVO data = JSONObject.parseObject(JSON.toJSONString(extra.get("data")),DataVO.class);
if(Func.isNotEmpty(data)) { if(Func.isNotEmpty(data)) {
if(Func.isNotEmpty(data.getReal())) { if(Func.isNotEmpty(data.getReal())) {
@ -114,21 +111,26 @@ public class ExtraResolveStrategyService {
real.setTime(DateUtil.format(date,DateUtil.PATTERN_DATETIME)); real.setTime(DateUtil.format(date,DateUtil.PATTERN_DATETIME));
} }
} }
// if(Func.isNotEmpty(data.getItem())) { if(Func.isNotEmpty(data.getItem()) && StringUtil.isNotBlank(data.getMethod())) {
// if("历史".equals(data.getType())) { if(SearchTypeEnum.HISTORY.getSearchType().equals(data.getType()) && Func.isNotEmpty(data.getItem())) {
// // 历史数据需要手动查询功能ID供前端使用 DataItemVO item = data.getItem();
// DataItemVO item = data.getItem(); HistoryDataSearchVO searchVO = new HistoryDataSearchVO();
// R<List<DeviceInstanceAttrVO>> attrR = deviceClient.getOnlineAttr(item.getDeviceId()); searchVO.setDataType(data.getDataType());
// if(attrR.isSuccess() && CollectionUtil.isNotEmpty(attrR.getData())) { searchVO.setDeviceCode(item.getDeviceId());
// List<DeviceInstanceAttrVO> attrList = attrR.getData(); searchVO.setDeviceName(item.getDeviceName());
// Optional<String> facDeviceIdOptional = attrList.stream().parallel().filter(f -> item.getSignage().equals(f.getSignage())) searchVO.setStationName(item.getProjectName());
// .map(DeviceInstanceAttrVO::getFacDeviceAttrId).findFirst(); searchVO.setMethod(data.getMethod());
// logger.info("hzims-big-model:resolveShowParam:facDeviceId",facDeviceIdOptional.orElse("")); searchVO.setSignage(item.getSignage());
// item.setAttrId(facDeviceIdOptional.orElse(null)); searchVO.setStartTime(data.getStartTime());
// } searchVO.setEndTime(data.getEndTime());
// } return analyseDataService.getHistoryData(searchVO);
// } }
} }
}
ExtraVO result = new ExtraVO();
result.setFuncCode(FuncRouteEnum.SHOW_PARAM.getFuncCode());
result.setType(FuncRouteEnum.SHOW_PARAM.getType().getType());
Map<String,Object> param = new HashMap(1);
param.put("data", data); param.put("data", data);
result.setParams(param); result.setParams(param);
return result; return result;

13
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/interactive/service/impl/InteractiveServiceImpl.java

@ -275,18 +275,7 @@ public class InteractiveServiceImpl implements IInteractiveService {
throw new ServiceException("远程调用大模型【删除对话】接口失败!"); throw new ServiceException("远程调用大模型【删除对话】接口失败!");
} }
// 移除对应reids中问题标记 // 移除对应reids中问题标记
Object json = redisTemplate.opsForValue().get(HZIMS_BIGMODEL_ASK_KEY); redisTemplate.opsForList().remove(HZIMS_BIGMODEL_ASK_KEY,1,sessionId);
if(ObjectUtil.isEmpty(json)) {
return true;
}
List<String> sessionIds = JSONObject.parseArray(json.toString(),String.class);
if(CollectionUtil.isEmpty(sessionIds)){
return true;
}
if(sessionIds.contains(sessionId)){
sessionIds.remove(sessionId);
redisTemplate.opsForValue().set(HZIMS_BIGMODEL_ASK_KEY,JSONObject.toJSONString(sessionIds));
}
return true; return true;
} }

35
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/interactive/vo/HistoryDataSearchVO.java

@ -0,0 +1,35 @@
package com.hnac.hzims.bigmodel.interactive.vo;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @Author: huangxing
* @Date: 2024/05/28 11:48
*/
@Data
public class HistoryDataSearchVO {
@NotBlank
private String startTime;
@NotBlank
private String endTime;
@NotBlank
private String deviceCode;
@NotBlank
private String signage;
@NotBlank
private String method;
private String dataType;
private String stationName;
private String deviceName;
}

2
hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/obj/mapper/ProjectContentMapper.xml

@ -3,7 +3,7 @@
<mapper namespace="com.hnac.hzinfo.inspect.obj.mapper.ProjectContentMapper"> <mapper namespace="com.hnac.hzinfo.inspect.obj.mapper.ProjectContentMapper">
<select id="getListByProjectId" resultType="com.hnac.hzinfo.inspect.obj.entity.ProjectContentEntity"> <select id="getListByProjectId" resultType="com.hnac.hzinfo.inspect.obj.entity.ProjectContentEntity">
SELECT t.*,c.code, c.name, c.description, c.check_type,c.CHECK_TYPE_SON,c.CAMERA_ADDR,c.OTHER_PARAM, c.record_type, c.CLOCK_ID, c.CAMERA_ID, c.DICT_TYPE SELECT t.*,c.code, c.name, c.description, c.check_type,c.CHECK_TYPE_SON,c.CAMERA_ADDR,c.OTHER_PARAM, c.record_type, c.CLOCK_ID, c.CAMERA_ID, c.DICT_TYPE,c.CHECK_VAL
from hz_st_re_project_content t from hz_st_re_project_content t
left JOIN hz_st_re_content c on (t.content_id=c.id) left JOIN hz_st_re_content c on (t.content_id=c.id)
where t.project_id=#{projectId} AND t.is_deleted=0 ORDER BY t.SORT DESC where t.project_id=#{projectId} AND t.is_deleted=0 ORDER BY t.SORT DESC

Loading…
Cancel
Save