package cn.iocoder.yudao.module.bi.controller.admin.decision; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.bi.controller.admin.decision.vo.DecisionForecastHistorySaveReqVO; import cn.iocoder.yudao.module.bi.controller.admin.decision.vo.DecisionForecastReqVO; import cn.iocoder.yudao.module.bi.controller.admin.decision.vo.DecisionForecastRespVO; import cn.iocoder.yudao.module.bi.controller.admin.decision.vo.DecisionForecastWorkOrderCreateReqVO; import cn.iocoder.yudao.module.bi.dal.dataobject.decision.BiForecastDataDO; import cn.iocoder.yudao.module.bi.service.decision.BiForecastService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - 决策支持 负荷预测") @RestController @RequestMapping("/bi/decision/forecast") @Validated public class DecisionForecastController { @Resource private BiForecastService forecastService; @GetMapping("/list") @Operation(summary = "获取预测数据") @PreAuthorize("@ss.hasPermission('bi:decision:kpi:query')") public CommonResult> getForecastList(@Valid DecisionForecastReqVO reqVO) { // 默认查最近30天 LocalDateTime endTime = LocalDateTime.now(); LocalDateTime beginTime = endTime.minusDays(30); return success(forecastService.getForecastList(reqVO.getForecastCode(), beginTime, endTime)); } @PostMapping("/history") @Operation(summary = "新增历史预测数据") @PreAuthorize("@ss.hasPermission('bi:decision:kpi:update')") public CommonResult createForecastHistory(@Valid @RequestBody DecisionForecastHistorySaveReqVO reqVO) { return success(forecastService.createForecastHistory(reqVO)); } @PostMapping("/generate") @Operation(summary = "生成预测(支持指定模型)") @PreAuthorize("@ss.hasPermission('bi:decision:kpi:query')") public CommonResult generateForecast(@RequestParam("forecastCode") String forecastCode, @RequestParam(value = "model", required = false) String model, @RequestParam(value = "window", required = false, defaultValue = "12") Integer window, @RequestParam(value = "period", required = false, defaultValue = "7") Integer period) { if (model == null || model.isBlank()) { forecastService.generateForecast(forecastCode, LocalDateTime.now()); } else { forecastService.generateForecast(forecastCode, model, window, period, LocalDateTime.now()); } return success(true); } @PostMapping("/generate-from-kpi") @Operation(summary = "基于KPI历史快照生成预测(负荷/产量/采购/回款)") @PreAuthorize("@ss.hasPermission('bi:decision:kpi:query')") public CommonResult generateKpiForecast(@RequestParam("kpiCode") String kpiCode, @RequestParam(value = "model", required = false) String model, @RequestParam(value = "window", required = false, defaultValue = "12") Integer window, @RequestParam(value = "period", required = false, defaultValue = "7") Integer period, @RequestParam(value = "periods", required = false, defaultValue = "30") Integer periods, @RequestParam(value = "intervalMinutes", required = false, defaultValue = "360") Integer intervalMinutes) { return success(forecastService.generateKpiForecast(kpiCode, model, window, period, periods, intervalMinutes)); } @PostMapping("/generate-work-order") @Operation(summary = "负荷预测联动创建生产工单") @PreAuthorize("@ss.hasPermission('bi:decision-forecast:generate-work-order')") public CommonResult generateWorkOrder(@Valid @RequestBody DecisionForecastWorkOrderCreateReqVO reqVO) { return success(forecastService.createWorkOrderFromForecast(reqVO)); } }