From a6c5780940a159929bac909b78c3af29b823ccaa Mon Sep 17 00:00:00 2001
From: dengzedong <dengzedong@email>
Date: 星期五, 06 六月 2025 18:10:37 +0800
Subject: [PATCH] 建议快照 建议处理时间

---
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotRecordServiceImpl.java |  239 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 239 insertions(+), 0 deletions(-)

diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotRecordServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotRecordServiceImpl.java
index 0292557..f1488bf 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotRecordServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotRecordServiceImpl.java
@@ -1,10 +1,45 @@
 package com.iailab.module.model.mcs.sche.service.impl;
 
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.iailab.framework.common.service.impl.BaseServiceImpl;
+import com.iailab.framework.common.util.object.BeanUtils;
+import com.iailab.framework.common.util.object.ConvertUtils;
+import com.iailab.module.data.api.ind.IndItemApi;
+import com.iailab.module.data.api.ind.dto.ApiIndItemQueryDTO;
+import com.iailab.module.data.api.ind.dto.ApiIndItemValueDTO;
+import com.iailab.module.data.api.plan.PlanItemApi;
+import com.iailab.module.data.api.point.DataPointApi;
+import com.iailab.module.data.api.point.dto.ApiPointValueDTO;
+import com.iailab.module.data.api.point.dto.ApiPointValueQueryDTO;
+import com.iailab.module.data.common.ApiDataQueryDTO;
+import com.iailab.module.data.common.ApiDataValueDTO;
+import com.iailab.module.model.api.mcs.dto.PreDataBarLineReqVO;
+import com.iailab.module.model.api.mcs.dto.PreDataBarLineRespVO;
+import com.iailab.module.model.api.mcs.dto.StSuggestSnapshotRecordRespVO;
+import com.iailab.module.model.common.enums.DataCategoryEnum;
+import com.iailab.module.model.common.utils.DateUtils;
+import com.iailab.module.model.mcs.pre.service.MmItemResultService;
 import com.iailab.module.model.mcs.sche.dao.StSuggestSnapshotRecordDao;
+import com.iailab.module.model.mcs.sche.entity.StScheduleSuggestEntity;
 import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotRecordEntity;
+import com.iailab.module.model.mcs.sche.service.StScheduleSuggestService;
+import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotConfDetService;
+import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotConfMainService;
 import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotRecordService;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetRespVO;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainRespVO;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordSaveReqVO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.*;
+
+import static com.iailab.module.model.common.utils.DateUtils.DATE_TIME_PATTERN;
 
 
 /**
@@ -13,4 +48,208 @@
 @Service
 public class StSuggestSnapshotRecordServiceImpl extends BaseServiceImpl<StSuggestSnapshotRecordDao, StSuggestSnapshotRecordEntity>
         implements StSuggestSnapshotRecordService {
+    @Autowired
+    private DataPointApi dataPointApi;
+
+    @Autowired
+    private IndItemApi indItemApi;
+
+    @Autowired
+    private PlanItemApi planItemApi;
+
+    @Autowired
+    private MmItemResultService mmItemResultService;
+
+    @Autowired
+    private StSuggestSnapshotConfMainService stSuggestSnapshotConfMainService;
+
+    @Autowired
+    private StSuggestSnapshotConfDetService stSuggestSnapshotConfDetService;
+
+    @Autowired
+    private StScheduleSuggestService stScheduleSuggestService;
+
+    @Override
+    @DSTransactional(rollbackFor = Exception.class)
+    public void create(StSuggestSnapshotRecordSaveReqVO createReqVO) {
+        StSuggestSnapshotRecordEntity entity = BeanUtils.toBean(createReqVO, StSuggestSnapshotRecordEntity.class);
+        entity.setId(UUID.randomUUID().toString());
+        baseDao.insert(entity);
+    }
+
+    @Override
+    @DSTransactional(rollbackFor = Exception.class)
+    public void update(StSuggestSnapshotRecordSaveReqVO updateReqVO) {
+        StSuggestSnapshotRecordEntity entity = BeanUtils.toBean(updateReqVO, StSuggestSnapshotRecordEntity.class);
+        baseDao.updateById(entity);
+    }
+
+    @Override
+    @DSTransactional(rollbackFor = Exception.class)
+    public void delete(String id) {
+        baseDao.deleteById(id);
+    }
+
+    @Override
+    public List<StSuggestSnapshotRecordRespVO> getListBySuggestId(String suggestId) {
+        QueryWrapper<StSuggestSnapshotRecordEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("suggest_id",  suggestId);
+        queryWrapper.orderByAsc("sort");
+        return ConvertUtils.sourceToTarget(baseDao.selectList(queryWrapper), StSuggestSnapshotRecordRespVO.class);
+    }
+
+    @Override
+    public void createSnapshotRecord(String modelId, String scheduleObj,Date scheduleTime, String suggestId) {
+        if (StringUtils.isBlank(modelId) || StringUtils.isBlank(scheduleObj) || StringUtils.isBlank(suggestId)) {
+            log.error("生成快照失败,参数错误!modelId:" + modelId + ",scheduleObj:" + scheduleObj + ",suggestId:" + suggestId);
+            return;
+        }
+        //获取调度建议快照配置表信息
+        StSuggestSnapshotConfMainRespVO confMain = stSuggestSnapshotConfMainService.getByModelIdAndScheduleObj(modelId, scheduleObj);
+        if (confMain == null) {
+            log.error("生成快照失败,confMain is null!modelId:" + modelId + ",scheduleObj:" + scheduleObj);
+            return;
+        }
+        List<StSuggestSnapshotConfDetRespVO> confDetList = stSuggestSnapshotConfDetService.getByConfId(confMain.getId());
+        if (CollectionUtils.isEmpty(confDetList)) {
+            log.error("生成快照失败,confDetList is empty!modelId:" + modelId + ",scheduleObj:" + scheduleObj);
+            return;
+        }
+        confDetList.forEach(confDet -> {
+            StSuggestSnapshotRecordSaveReqVO snapshotRecordSaveReqVO = new StSuggestSnapshotRecordSaveReqVO();
+            snapshotRecordSaveReqVO.setSuggestId(suggestId);
+            snapshotRecordSaveReqVO.setModelId(modelId);
+            snapshotRecordSaveReqVO.setDataNo(confDet.getDataNo());
+            snapshotRecordSaveReqVO.setDataType(confDet.getDataType());
+            snapshotRecordSaveReqVO.setDataName(confDet.getDataName());
+            snapshotRecordSaveReqVO.setScheduleTime(scheduleTime);
+            snapshotRecordSaveReqVO.setSort(confDet.getSort());
+            snapshotRecordSaveReqVO.setLimitH(confDet.getLimitH());
+            snapshotRecordSaveReqVO.setLimitL(confDet.getLimitL());
+            snapshotRecordSaveReqVO.setSort(confDet.getSort());
+            //计算开始时间,开始时间为当前调度时间减去快照配置表配置的左侧时间长度
+            LocalDateTime localStartDateTime =  scheduleTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().minusMinutes(confDet.getLeftLength() ==  null ? 60 : confDet.getLeftLength());
+            Date startTime = Date.from(localStartDateTime.atZone(ZoneId.systemDefault()).toInstant());
+            snapshotRecordSaveReqVO.setStartTime(startTime);
+            //计算结束时间,结束时间为当前调度时间加上快照配置表配置的右侧时间长度
+            LocalDateTime localEndDateTime =  scheduleTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().plusMinutes(confDet.getRightLength() ==  null ? 60 : confDet.getLeftLength());
+            Date endTime = Date.from(localEndDateTime.atZone(ZoneId.systemDefault()).toInstant());
+            snapshotRecordSaveReqVO.setEndTime(endTime);
+            this.create(snapshotRecordSaveReqVO);
+        });
+    }
+
+    @Override
+    public List<StSuggestSnapshotRecordRespVO> getChartData(List<StSuggestSnapshotRecordRespVO> reqList) {
+        Map<String,StScheduleSuggestEntity> suggestInfos = new HashMap<>(reqList.size());
+        reqList.forEach(item -> {
+            List<Object[]> dataList = new ArrayList<>();
+            if(DataCategoryEnum.DATAPOINT.getCode().equals(item.getDataType())){
+                ApiPointValueQueryDTO queryDTO = new ApiPointValueQueryDTO();
+                queryDTO.setPointNo(item.getDataNo());
+                queryDTO.setStart(item.getStartTime());
+                queryDTO.setEnd(item.getEndTime());
+                List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(queryDTO);
+                if (valueList != null && !valueList.isEmpty()){
+                    for (ApiPointValueDTO apiPointValueDTO : valueList) {
+                        Object[] data = new Object[2];
+                        data[0] = DateUtils.format(apiPointValueDTO.getT(), DATE_TIME_PATTERN);
+                        data[1] = apiPointValueDTO.getV();
+                        dataList.add(data);
+                    }
+                }
+            } else if (DataCategoryEnum.IND.getCode().equals(item.getDataType())) {
+                ApiIndItemQueryDTO queryDTO = new ApiIndItemQueryDTO();
+                queryDTO.setItemNo(item.getDataNo());
+                queryDTO.setStart(item.getStartTime());
+                queryDTO.setEnd(item.getEndTime());
+                List<ApiIndItemValueDTO> valueList = indItemApi.queryIndItemHistoryValue(queryDTO);
+                if (valueList != null && !valueList.isEmpty()){
+                    for (ApiIndItemValueDTO apiIndItemValueDTO : valueList) {
+                        Object[] data = new Object[2];
+                        data[0] = apiIndItemValueDTO.getDataTime();
+                        data[1] = apiIndItemValueDTO.getDataValue();
+                        dataList.add(data);
+                    }
+                }
+            } else if (DataCategoryEnum.PLAN.getCode().equals(item.getDataType())) {
+                ApiDataQueryDTO queryDTO = new ApiDataQueryDTO();
+                queryDTO.setItemNo(item.getDataNo());
+                queryDTO.setStart(item.getStartTime());
+                queryDTO.setEnd(item.getEndTime());
+                List<ApiDataValueDTO> valueList = planItemApi.queryPlanItemHistoryValue(queryDTO);
+                if (valueList != null && !valueList.isEmpty()){
+                    for (ApiDataValueDTO apiDataValueDTO : valueList) {
+                        Object[] data = new Object[2];
+                        data[0] = DateUtils.format(apiDataValueDTO.getDataTime(), DATE_TIME_PATTERN);
+                        data[1] = apiDataValueDTO.getDataValue();
+                        dataList.add(data);
+                    }
+                }
+            } else if (DataCategoryEnum.PREDICT_ITEM_N.getCode().equals(item.getDataType())) {
+                dataList = getPreDataList(item, "N");
+            }else if (DataCategoryEnum.PREDICT_ITEM_L.getCode().equals(item.getDataType())) {
+                dataList = getPreDataList(item, "L");
+            }else if (DataCategoryEnum.PREDICT_ITEM_C.getCode().equals(item.getDataType())) {
+                dataList = getPreDataList(item, "C");
+            }
+            item.setDataList(dataList);
+
+//             越界时间
+//            if (!CollectionUtils.isEmpty(dataList)) {
+//                List<String> overLimitTimes = new ArrayList<>();
+//                dataList.forEach(data -> {
+//                    BigDecimal value = new BigDecimal(data[1].toString());
+//                    if ((item.getLimitH() != null &&value.compareTo(item.getLimitH()) >= 0) || (item.getLimitL() != null && value.compareTo(item.getLimitL()) <= 0)) {
+//                        overLimitTimes.add(data[0].toString());
+//                    }
+//                });
+//                item.setOverLimitTimes(overLimitTimes);
+//            }
+
+            // 建议处理时间
+            String suggestId = item.getSuggestId();
+            StScheduleSuggestEntity suggestInfo;
+            if (suggestInfos.containsKey(suggestId)) {
+                suggestInfo = suggestInfos.get(suggestId);
+            }else {
+                suggestInfo = stScheduleSuggestService.getInfo(suggestId);
+                suggestInfos.put(suggestId,suggestInfo);
+            }
+            item.setStatus(suggestInfo.getStatus());
+            item.setHandleTime(suggestInfo.getHandleTime());
+        });
+        return reqList;
+    }
+
+    @Override
+    public List<StSuggestSnapshotRecordRespVO> getAllChartData(String suggestId) {
+        List<StSuggestSnapshotRecordRespVO> records = this.getListBySuggestId(suggestId);
+        if (CollectionUtils.isEmpty(records)) {
+            return new ArrayList<>();
+        }
+        return this.getChartData(records);
+    }
+
+    private List<Object[]> getPreDataList(StSuggestSnapshotRecordRespVO resVo, String type){
+        List<Object[]> dataList = new ArrayList<>();
+        PreDataBarLineReqVO reqVO  = new PreDataBarLineReqVO();
+        List<String> outIds = new ArrayList<>();
+        outIds.add(resVo.getDataNo());
+        reqVO.setOutIds(outIds);
+        reqVO.setStartTime(resVo.getStartTime());
+        reqVO.setEndTime(resVo.getEndTime());
+        PreDataBarLineRespVO result = mmItemResultService.getPreDataCharts(reqVO);
+        if (result == null || result.getDataViewList() == null || result.getDataViewList().isEmpty()){
+            return dataList;
+        }
+        if ("N".equals(type) && result.getDataViewList().get(0).getPreDataN()!=null){
+            dataList = result.getDataViewList().get(0).getPreDataN();
+        }else if ("L".equals(type) && result.getDataViewList().get(0).getPreDataL()!=null){
+            dataList = result.getDataViewList().get(0).getPreDataL();
+        }else if ("C".equals(type) && result.getDataViewList().get(0).getCurData()!=null){
+            dataList = result.getDataViewList().get(0).getCurData();
+        }
+        return dataList;
+    }
 }
\ No newline at end of file

--
Gitblit v1.9.3