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