package com.vincent.rsf.server.system.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.common.SnowflakeIdWorker; import com.vincent.rsf.server.ai.service.diagnosis.AiDiagnosisPlanRunnerService; import com.vincent.rsf.server.common.annotation.OperationLog; import com.vincent.rsf.server.common.domain.BaseParam; import com.vincent.rsf.server.common.domain.PageParam; import com.vincent.rsf.server.common.utils.ExcelUtil; import com.vincent.rsf.server.system.entity.AiDiagnosisPlan; import com.vincent.rsf.server.system.service.AiDiagnosisPlanService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Map; @RestController public class AiDiagnosisPlanController extends BaseController { @Autowired private AiDiagnosisPlanService aiDiagnosisPlanService; @Autowired private AiDiagnosisPlanRunnerService aiDiagnosisPlanRunnerService; @Autowired private ThreadPoolTaskScheduler taskScheduler; @Autowired private SnowflakeIdWorker snowflakeIdWorker; @PreAuthorize("hasAuthority('system:aiDiagnosisPlan:list')") @PostMapping("/aiDiagnosisPlan/page") public R page(@RequestBody Map map) { BaseParam baseParam = buildParam(map, BaseParam.class); PageParam pageParam = new PageParam<>(baseParam, AiDiagnosisPlan.class); com.baomidou.mybatisplus.core.conditions.query.QueryWrapper wrapper = pageParam.buildWrapper(true); wrapper.eq("tenant_id", getTenantId()); return R.ok().add(aiDiagnosisPlanService.page(pageParam, wrapper)); } @PreAuthorize("hasAuthority('system:aiDiagnosisPlan:list')") @GetMapping("/aiDiagnosisPlan/{id}") public R get(@PathVariable("id") Long id) { AiDiagnosisPlan plan = aiDiagnosisPlanService.getTenantPlan(getTenantId(), id); if (plan == null) { return R.error("plan not found"); } return R.ok().add(plan); } @PreAuthorize("hasAuthority('system:aiDiagnosisPlan:save')") @OperationLog("Create AiDiagnosisPlan") @PostMapping("/aiDiagnosisPlan/save") public R save(@RequestBody AiDiagnosisPlan plan) { if (Cools.isEmpty(plan.getPlanName()) || Cools.isEmpty(plan.getCronExpr())) { return R.error("计划名称和Cron表达式不能为空"); } if (!aiDiagnosisPlanService.validateCron(plan.getCronExpr())) { return R.error("Cron表达式不合法"); } Date now = new Date(); plan.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); plan.setTenantId(getTenantId()); plan.setSceneCode(Cools.isEmpty(plan.getSceneCode()) ? "system_diagnose" : plan.getSceneCode()); plan.setRunningFlag(0); plan.setStatus(plan.getStatus() == null ? 1 : plan.getStatus()); plan.setNextRunTime(Integer.valueOf(1).equals(plan.getStatus()) ? aiDiagnosisPlanService.calculateNextRunTime(plan.getCronExpr(), now) : null); plan.setCreateBy(getLoginUserId()); plan.setCreateTime(now); plan.setUpdateBy(getLoginUserId()); plan.setUpdateTime(now); if (!aiDiagnosisPlanService.save(plan)) { return R.error("Save Fail"); } return R.ok("Save Success").add(plan); } @PreAuthorize("hasAuthority('system:aiDiagnosisPlan:update')") @OperationLog("Update AiDiagnosisPlan") @PostMapping("/aiDiagnosisPlan/update") public R update(@RequestBody AiDiagnosisPlan plan) { AiDiagnosisPlan existed = aiDiagnosisPlanService.getTenantPlan(getTenantId(), plan.getId()); if (existed == null) { return R.error("plan not found"); } if (Cools.isEmpty(plan.getPlanName()) || Cools.isEmpty(plan.getCronExpr())) { return R.error("计划名称和Cron表达式不能为空"); } if (!aiDiagnosisPlanService.validateCron(plan.getCronExpr())) { return R.error("Cron表达式不合法"); } plan.setTenantId(getTenantId()); plan.setSceneCode(Cools.isEmpty(plan.getSceneCode()) ? existed.getSceneCode() : plan.getSceneCode()); plan.setRunningFlag(existed.getRunningFlag()); plan.setLastResult(existed.getLastResult()); plan.setLastDiagnosisId(existed.getLastDiagnosisId()); plan.setLastRunTime(existed.getLastRunTime()); plan.setLastMessage(existed.getLastMessage()); plan.setNextRunTime(Integer.valueOf(1).equals(plan.getStatus()) ? aiDiagnosisPlanService.calculateNextRunTime(plan.getCronExpr(), new Date()) : null); plan.setCreateBy(existed.getCreateBy()); plan.setCreateTime(existed.getCreateTime()); plan.setUpdateBy(getLoginUserId()); plan.setUpdateTime(new Date()); if (!aiDiagnosisPlanService.updateById(plan)) { return R.error("Update Fail"); } return R.ok("Update Success").add(plan); } @PreAuthorize("hasAuthority('system:aiDiagnosisPlan:remove')") @OperationLog("Delete AiDiagnosisPlan") @PostMapping("/aiDiagnosisPlan/remove/{ids}") public R remove(@PathVariable Long[] ids) { List idList = Arrays.asList(ids); List plans = aiDiagnosisPlanService.list(new LambdaQueryWrapper() .eq(AiDiagnosisPlan::getTenantId, getTenantId()) .in(AiDiagnosisPlan::getId, idList)); if (plans.size() != idList.size() || !aiDiagnosisPlanService.removeByIds(idList)) { return R.error("Delete Fail"); } return R.ok("Delete Success").add(ids); } @PreAuthorize("hasAuthority('system:aiDiagnosisPlan:list')") @PostMapping("/aiDiagnosisPlan/export") public void export(@RequestBody Map map, HttpServletResponse response) throws Exception { ExcelUtil.build(ExcelUtil.create(aiDiagnosisPlanService.list(new LambdaQueryWrapper() .eq(AiDiagnosisPlan::getTenantId, getTenantId())), AiDiagnosisPlan.class), response); } @PreAuthorize("hasAuthority('system:aiDiagnosisPlan:update')") @OperationLog("Run AiDiagnosisPlan") @PostMapping("/ai/diagnosis-plan/run") public R run(@RequestBody Map map) { Long id = Long.valueOf(String.valueOf(map.get("id"))); AiDiagnosisPlan plan = aiDiagnosisPlanService.getTenantPlan(getTenantId(), id); if (plan == null) { return R.error("plan not found"); } if (Integer.valueOf(1).equals(plan.getRunningFlag())) { return R.error("计划正在执行中"); } Date nextRunTime = Integer.valueOf(1).equals(plan.getStatus()) ? aiDiagnosisPlanService.calculateNextRunTime(plan.getCronExpr(), new Date()) : null; boolean acquired = aiDiagnosisPlanService.acquireForExecution( plan.getId(), getLoginUserId(), "手动执行中", nextRunTime ); if (!acquired) { return R.error("计划正在执行中"); } taskScheduler.execute(() -> aiDiagnosisPlanRunnerService.runPlan(plan.getId(), true)); return R.ok(); } }