package com.iailab.module.model.mcs.pre.controller.admin; import cn.hutool.core.io.FileUtil; import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.iailab.framework.common.pojo.CommonResult; import com.iailab.framework.common.pojo.PageResult; import com.iailab.framework.common.util.date.DateUtils; import com.iailab.module.model.common.enums.CommonConstant; import com.iailab.module.model.mcs.pre.dto.MmPredictItemDTO; import com.iailab.module.model.mcs.pre.entity.DmModuleEntity; import com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity; import com.iailab.module.model.mcs.pre.entity.MmPredictItemEntity; import com.iailab.module.model.mcs.pre.service.DmModuleService; import com.iailab.module.model.mcs.pre.service.MmItemOutputService; import com.iailab.module.model.mcs.pre.service.MmPredictItemService; import com.iailab.module.model.mcs.pre.vo.*; import com.iailab.module.model.mpk.common.utils.IAILModelUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.util.CollectionUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.security.PermitAll; import java.io.File; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import static com.iailab.framework.common.pojo.CommonResult.success; /** * @author PanZhibao * @date 2021年04月26日 14:42 */ @Slf4j @RestController @RequestMapping("/model/pre/item") public class MmPredictItemController { @Value("${mpk.model-file-path}") private String modelPath; @Autowired private IAILModelUtil iAILModelUtil; @Autowired private MmPredictItemService mmPredictItemService; @Autowired private DmModuleService dmModuleService; @Autowired private MmItemOutputService mmItemOutputService; private int HOUR_MINS = 60; /** * 预测项列表 */ @GetMapping("/page") @PreAuthorize("@ss.hasPermission('model:pre-item:query')") public CommonResult> page(@Validated MmPredictItemPageReqVO reqVO) { PageResult page = mmPredictItemService.queryPage(reqVO); return success(page); } @GetMapping("/list") public CommonResult> list(Map params) { List list = mmPredictItemService.list(params); return success(list); } /** * 预测项信息 */ @GetMapping("/get/{id}") @PreAuthorize("@ss.hasPermission('model:pre-item:query')") public CommonResult info(@PathVariable("id") String id) { MmPredictItemDTO predictItem = mmPredictItemService.info(id); return success(predictItem); } /** * 保存预测项 */ @PostMapping("/create") @PreAuthorize("@ss.hasPermission('model:pre-item:create')") @DSTransactional(rollbackFor = Exception.class) public CommonResult save(@RequestBody MmPredictItemDTO mmPredictItemDto) { mmPredictItemService.add(mmPredictItemDto); return success(true); } /** * 修改预测项 */ @PutMapping("/update") @PreAuthorize("@ss.hasPermission('model:pre-item:update')") @DSTransactional(rollbackFor = Exception.class) public CommonResult update(@RequestBody MmPredictItemDTO mmPredictItemDTO) { mmPredictItemService.update(mmPredictItemDTO); return success(true); } /** * 删除预测项 */ @DeleteMapping("/delete") @PreAuthorize("@ss.hasPermission('model:pre-item:delete')") @DSTransactional(rollbackFor = Exception.class) public CommonResult delete(@RequestParam("id") String id) { mmPredictItemService.deleteBatch(new String[]{id}); return success(true); } /** * 预测项列表 */ @GetMapping("/count-itemtype") public CommonResult> countItemtype(@RequestParam Map params) { List list = new ArrayList<>(); return success(list); } /** * 上传模型 */ @PermitAll @PostMapping("/upload-model") public CommonResult> uploadModel(@RequestParam("file") MultipartFile file) throws Exception { String uploadDir = modelPath + file.getOriginalFilename(); FileUtil.mkParentDirs(uploadDir); file.transferTo(new File(uploadDir)); Map result = iAILModelUtil.parseModel(uploadDir); result.put("originalFilename", file.getOriginalFilename().replace(CommonConstant.MDK_SUFFIX, "")); return success(result); } @GetMapping("/tree") public CommonResult> itemTree() { List result = new ArrayList<>(); List moduleList = dmModuleService.list(new HashMap<>()); if (CollectionUtils.isEmpty(moduleList)) { return success(result); } moduleList.forEach(item -> { PreItemOptionVO moduleOpt = new PreItemOptionVO(); moduleOpt.setId(item.getId()); moduleOpt.setLabel(item.getModulename()); List children = new ArrayList<>(); Map params = new HashMap<>(2); params.put("status", 1); params.put("moduleid", item.getId()); List itemList = mmPredictItemService.list(params); itemList.forEach(item1 -> { PreItemOptionVO chd = new PreItemOptionVO(); chd.setLabel(item1.getItemname()); chd.setId(item1.getId()); children.add(chd); }); moduleOpt.setChildren(children); result.add(moduleOpt); }); return success(result); } @GetMapping("/view-charts") public CommonResult viewCharts(@RequestParam Map params) { PreDataBarLineVO result = new PreDataBarLineVO(); List legends = new ArrayList<>(); List dataViewList = new ArrayList<>(); if (params.get("itemIds") == null) { return success(result); } List itemIdList = Arrays.asList(params.get("itemIds").toString().split(",")); Date predictTime; if (StringUtils.isBlank((String) params.get("predictTime"))) { DmModuleEntity dmModule = dmModuleService.getModuleByItemId(itemIdList.get(0)); if (dmModule != null) { predictTime = dmModule.getPredicttime(); } else { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MILLISECOND, 0); calendar.set(Calendar.SECOND, 0); predictTime = calendar.getTime(); } } else { predictTime = DateUtils.parse(params.get("predictTime").toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND); } Date startTime; if (StringUtils.isBlank((String) params.get("startTime"))) { Calendar calendar = Calendar.getInstance(); calendar.setTime(predictTime); calendar.add(Calendar.HOUR_OF_DAY, -1); startTime = calendar.getTime(); } else { startTime = DateUtils.parse(params.get("startTime").toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND); } Date endTime = null; if (StringUtils.isBlank((String) params.get("endTime"))) { Calendar calendar = Calendar.getInstance(); calendar.setTime(predictTime); calendar.add(Calendar.HOUR_OF_DAY, 1); endTime = calendar.getTime(); } else { endTime = DateUtils.parse(params.get("endTime").toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND); } for (int i = 0; i < itemIdList.size(); i++) { PreDataViewVO viewDto = new PreDataViewVO(); String itemId = itemIdList.get(i); MmItemOutputEntity mmItemOutput = mmItemOutputService.getByItemid(itemId); MmPredictItemEntity predictItem = mmPredictItemService.getById(itemId); if (predictItem == null) { log.info("itemId=" + itemId + "; is null"); continue; } try { viewDto.setItemId(itemId); viewDto.setItemName(predictItem.getItemname()); viewDto.setRealData(mmPredictItemService.getHisData(itemId, startTime, endTime)); // viewDto.setPreDataN(mmItemResultService.getData(mmItemOutput.getId(), startTime, endTime)); // viewDto.setPreDataL(mmItemResultLastPointService.getData(mmItemOutput.getId(), startTime, endTime)); // viewDto.setCurData(mmItemResultJsonService.getData(mmItemOutput.getId(), predictTime)); // viewDto.setAdjData(scheduleAdjustResultService.getData(itemId, predictTime)); legends.add(predictItem.getItemname()); List values = new ArrayList<>(); if (!CollectionUtils.isEmpty(viewDto.getRealData())) { List hisValues = new ArrayList<>(); viewDto.getRealData().forEach(item -> { values.add(Double.parseDouble(item[1].toString())); hisValues.add(Double.parseDouble(item[1].toString())); }); viewDto.setHisMax(BigDecimal.valueOf(hisValues.stream().mapToDouble(Double::doubleValue).max().getAsDouble()).setScale(2, RoundingMode.HALF_UP)); viewDto.setHisMin(BigDecimal.valueOf(hisValues.stream().mapToDouble(Double::doubleValue).min().getAsDouble()).setScale(2, RoundingMode.HALF_UP)); viewDto.setHisAvg(BigDecimal.valueOf(hisValues.stream().mapToDouble(Double::doubleValue).average().getAsDouble()).setScale(2, RoundingMode.HALF_UP)); viewDto.setHisCumulant(new BigDecimal(hisValues.stream().mapToDouble(Double::doubleValue).sum()) .divide(new BigDecimal(HOUR_MINS), 2, BigDecimal.ROUND_HALF_UP)); } if (!CollectionUtils.isEmpty(viewDto.getPreDataN())) { viewDto.getPreDataN().forEach(item -> { values.add(Double.parseDouble(item[1].toString())); }); } if (!CollectionUtils.isEmpty(viewDto.getPreDataL())) { List preValues = new ArrayList<>(); viewDto.getPreDataL().forEach(item -> { values.add(Double.parseDouble(item[1].toString())); preValues.add(Double.parseDouble(item[1].toString())); }); viewDto.setPreMax(BigDecimal.valueOf(preValues.stream().mapToDouble(Double::doubleValue).max().getAsDouble()).setScale(2, RoundingMode.HALF_UP)); viewDto.setPreMin(BigDecimal.valueOf(preValues.stream().mapToDouble(Double::doubleValue).min().getAsDouble()).setScale(2, RoundingMode.HALF_UP)); viewDto.setPreAvg(BigDecimal.valueOf(preValues.stream().mapToDouble(Double::doubleValue).average().getAsDouble()).setScale(2, RoundingMode.HALF_UP)); } if (!CollectionUtils.isEmpty(viewDto.getCurData())) { List preValues = new ArrayList<>(); viewDto.getCurData().forEach(item -> { values.add(Double.parseDouble(item[1].toString())); preValues.add(Double.parseDouble(item[1].toString())); }); viewDto.setPreCumulant(BigDecimal.valueOf(preValues.stream().mapToDouble(Double::doubleValue).sum()) .divide(new BigDecimal(HOUR_MINS), 2, RoundingMode.HALF_UP)); } if (!CollectionUtils.isEmpty(viewDto.getAdjData())) { viewDto.getAdjData().forEach(item -> { values.add(Double.parseDouble(item[1].toString())); }); } if (!CollectionUtils.isEmpty(values)) { viewDto.setMaxValue(BigDecimal.valueOf(values.stream().mapToDouble(Double::doubleValue).max().getAsDouble()).setScale(2, RoundingMode.HALF_UP)); viewDto.setMinValue(BigDecimal.valueOf(values.stream().mapToDouble(Double::doubleValue).min().getAsDouble()).setScale(2, RoundingMode.HALF_UP)); } dataViewList.add(viewDto); } catch (Exception ex) { ex.printStackTrace(); } } result.setStartTime(startTime); result.setEndTime(endTime); result.setPredictTime(predictTime); result.setCategories(DateUtils.getTimeScale(startTime, endTime, 60)); result.setLegend(legends); result.setDataViewList(dataViewList); return success(result); } }