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<String, Object> map) {
|
BaseParam baseParam = buildParam(map, BaseParam.class);
|
PageParam<AiDiagnosisPlan, BaseParam> pageParam = new PageParam<>(baseParam, AiDiagnosisPlan.class);
|
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<AiDiagnosisPlan> 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<Long> idList = Arrays.asList(ids);
|
List<AiDiagnosisPlan> plans = aiDiagnosisPlanService.list(new LambdaQueryWrapper<AiDiagnosisPlan>()
|
.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<String, Object> map, HttpServletResponse response) throws Exception {
|
ExcelUtil.build(ExcelUtil.create(aiDiagnosisPlanService.list(new LambdaQueryWrapper<AiDiagnosisPlan>()
|
.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<String, Object> 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();
|
}
|
}
|