package com.ruoyi.inspectiontask.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.R; import com.ruoyi.inspectiontask.dto.InspectionTaskDto; import com.ruoyi.inspectiontask.dto.TimingTaskDto; import com.ruoyi.inspectiontask.pojo.InspectionTask; import com.ruoyi.inspectiontask.service.InspectionTaskService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.time.LocalDateTime; /** * @author :yys * @date : 2025/9/19 10:52 */ @RestController @Api(tags = "巡检任务管理") @RequestMapping("/inspectionTask") public class InspectionTaskController extends BaseController { @Autowired private InspectionTaskService inspectionTaskService; /** * 巡检任务表表查询 */ @GetMapping("/list") @ApiOperation("巡检任务表表查询") public R> list(Page page, InspectionTaskDto inspectionTaskDto) { IPage list = inspectionTaskService.selectInspectionTaskList(page,inspectionTaskDto); return R.ok(list); } /** * 导出 */ @PostMapping("/export") @ApiOperation(value = "导出定时任务记录") public void export(HttpServletResponse response) { Page page = new Page<>(-1,-1); InspectionTaskDto timingTask = new InspectionTaskDto(); IPage list = inspectionTaskService.selectInspectionTaskList(page,timingTask); ExcelUtil util = new ExcelUtil<>(InspectionTaskDto.class); util.exportExcel(response, list.getRecords(), "导出定时任务记录"); } /** * 巡检任务表新增修改 */ @PostMapping("/addOrEditInspectionTask") @ApiOperation("巡检任务表新增修改") @Transactional(rollbackFor = Exception.class) public R addOrEditInspectionTask(@RequestBody InspectionTaskDto inspectionTaskDto) { return R.ok(inspectionTaskService.addOrEditInspectionTask(inspectionTaskDto)); } /** * 巡检任务表删除 */ @DeleteMapping("/delInspectionTask") @ApiOperation("巡检任务表删除") @Transactional(rollbackFor = Exception.class) public R remove(@RequestBody Long[] ids) { return R.ok(inspectionTaskService.delByIds(ids)); } @PostMapping("/start/{id}") @ApiOperation("启动巡检并联动采集设备") public R start(@PathVariable Long id) { InspectionTask task = inspectionTaskService.getById(id); if (task == null) return R.fail("巡检任务不存在"); if ("finished".equals(task.getTaskStatus())) return R.fail("任务已完成,无需重复启动"); if ("running".equals(task.getTaskStatus())) return R.fail("任务已在执行中"); task.setTaskStatus("running"); task.setActualStartTime(LocalDateTime.now()); task.setReportContent(null); task.setReportTime(null); inspectionTaskService.updateById(task); return R.ok(task); } @PostMapping("/finish/{id}") @ApiOperation("完成巡检并自动生成报告") public R finish(@PathVariable Long id) { InspectionTask task = inspectionTaskService.getById(id); if (task == null) return R.fail("巡检任务不存在"); if (!"running".equals(task.getTaskStatus())) return R.fail("请先开始巡检再完成"); LocalDateTime now = LocalDateTime.now(); task.setTaskStatus("finished"); task.setActualEndTime(now); task.setReportTime(now); String sourceLabel = sourceLabel(task.getDeviceSource()); String duration = "未记录"; if (task.getActualStartTime() != null) { long minutes = java.time.Duration.between(task.getActualStartTime(), now).toMinutes(); duration = minutes + " 分钟"; } StringBuilder report = new StringBuilder(); report.append("巡检报告\n") .append("任务名称:").append(nvl(task.getTaskName())).append("\n") .append("巡检区域:").append(nvl(task.getInspectionLocation())).append("\n") .append("规划路径:").append(nvl(task.getInspectionRoute())).append("\n") .append("采集终端:").append(sourceLabel).append("\n") .append("巡检人员:").append(nvl(task.getInspector())).append("\n") .append("开始时间:").append(nvl(task.getActualStartTime())).append("\n") .append("结束时间:").append(now).append("\n") .append("执行时长:").append(duration).append("\n\n") .append("巡检结论:按规划路径完成全部点位巡检,未发现需立即处置的重大异常;") .append("现场影像、设备回传与点位记录已归档。\n") .append("生成时间:").append(now); task.setReportContent(report.toString()); inspectionTaskService.updateById(task); return R.ok(task); } private static String sourceLabel(String source) { if (source == null) return "人工终端"; switch (source) { case "video": return "视频分析"; case "drone": return "无人机"; case "robot": return "巡检机器人"; case "manual": return "人工终端"; default: return source; } } private static String nvl(Object v) { return v == null ? "—" : v.toString(); } }