13 changed files with 332 additions and 38 deletions
			
			
		| @ -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); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -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); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -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)); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -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); | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -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)); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -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; | ||||||
|  | 
 | ||||||
|  | } | ||||||
					Loading…
					
					
				
		Reference in new issue