dengzedong
2025-06-06 a6c5780940a159929bac909b78c3af29b823ccaa
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;
    }
}