From e0c6ab1bfb3492a9e6864c617d748c7a93b490dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E5=B1=95=E8=88=AA?= <2426745133@qq.com> Date: Sat, 20 Sep 2025 16:30:10 +0800 Subject: [PATCH] =?UTF-8?q?09-20-=E5=B7=A1=E6=A3=80=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OpsInspectionTaskController.java | 117 +++++++ .../inspection/domain/OpsInspectionTask.java | 92 ++++++ .../domain/bo/OpsInspectionTaskBo.java | 100 ++++++ .../domain/vo/OpsInspectionRecordVo.java | 69 +++++ .../domain/vo/OpsInspectionTaskVo.java | 110 +++++++ .../mapper/OpsInspectionTaskMapper.java | 15 + .../service/IOpsInspectionTaskService.java | 69 +++++ .../impl/OpsInspectionPlanServiceImpl.java | 32 +- .../impl/OpsInspectionTaskServiceImpl.java | 293 ++++++++++++++++++ 9 files changed, 893 insertions(+), 4 deletions(-) create mode 100644 ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/controller/OpsInspectionTaskController.java create mode 100644 ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/OpsInspectionTask.java create mode 100644 ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/bo/OpsInspectionTaskBo.java create mode 100644 ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/vo/OpsInspectionRecordVo.java create mode 100644 ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/vo/OpsInspectionTaskVo.java create mode 100644 ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/mapper/OpsInspectionTaskMapper.java create mode 100644 ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/IOpsInspectionTaskService.java create mode 100644 ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/impl/OpsInspectionTaskServiceImpl.java diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/controller/OpsInspectionTaskController.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/controller/OpsInspectionTaskController.java new file mode 100644 index 0000000..771617c --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/controller/OpsInspectionTaskController.java @@ -0,0 +1,117 @@ +package org.dromara.inspection.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.inspection.domain.vo.OpsInspectionRecordVo; +import org.dromara.inspection.service.impl.OpsInspectionTaskServiceImpl; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.inspection.domain.vo.OpsInspectionTaskVo; +import org.dromara.inspection.domain.bo.OpsInspectionTaskBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 运维-巡检计划-任务 + * 前端访问路由地址为:/inspection/task + * + * @author LionLi + * @date 2025-09-20 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/task") +public class OpsInspectionTaskController extends BaseController { + + private final OpsInspectionTaskServiceImpl opsInspectionTaskService; + + /** + * 查询运维-巡检计划-任务列表 + */ + @SaCheckPermission("inspection:task:list") + @GetMapping("/list") + public TableDataInfo list(OpsInspectionTaskBo bo, PageQuery pageQuery) { + return opsInspectionTaskService.queryPageList(bo, pageQuery); + } + + /** + * 导出运维-巡检计划-任务列表 + */ + @SaCheckPermission("inspection:task:export") + @Log(title = "运维-巡检计划-任务", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(OpsInspectionTaskBo bo, HttpServletResponse response) { + List list = opsInspectionTaskService.queryList(bo); + ExcelUtil.exportExcel(list, "运维-巡检计划-任务", OpsInspectionTaskVo.class, response); + } + + /** + * 获取运维-巡检计划-任务详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("inspection:task:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("id") Long id) { + return R.ok(opsInspectionTaskService.queryById(id)); + } + + /** + * 新增运维-巡检计划-任务 + */ + @SaCheckPermission("inspection:task:add") + @Log(title = "运维-巡检计划-任务", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody OpsInspectionTaskBo bo) { + return toAjax(opsInspectionTaskService.insertByBo(bo)); + } + + /** + * 修改运维-巡检计划-任务 + */ + @SaCheckPermission("inspection:task:edit") + @Log(title = "运维-巡检计划-任务", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody OpsInspectionTaskBo bo) { + return toAjax(opsInspectionTaskService.updateByBo(bo)); + } + + /** + * 删除运维-巡检计划-任务 + * + * @param ids 主键串 + */ + @SaCheckPermission("inspection:task:remove") + @Log(title = "运维-巡检计划-任务", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable("ids") Long[] ids) { + return toAjax(opsInspectionTaskService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 巡检记录统计 + */ + @SaCheckPermission("inspection:task:record") + @GetMapping("/record") + public R record(@RequestParam String type,@RequestParam Long projectId) { + return opsInspectionTaskService.record(type,projectId); + } + +} diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/OpsInspectionTask.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/OpsInspectionTask.java new file mode 100644 index 0000000..2caea5f --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/OpsInspectionTask.java @@ -0,0 +1,92 @@ +package org.dromara.inspection.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 运维-巡检计划-任务对象 ops_inspection_task + * + * @author LionLi + * @date 2025-09-20 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("ops_inspection_task") +public class OpsInspectionTask extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + private Long projectId; + + /** + * 任务名 + */ + private String taskName; + + /** + * 巡检对象 + */ + private String inspectionObject; + + /** + * + */ + private Date beginTime; + + /** + * + */ + private Date endTime; + + /** + * 时间段 + */ + private String timeInfo; + + /** + * 计划ID + */ + private Long planId; + + /** + * 执行人ID + */ + private Long personId; + + /** + * 进度 + */ + @TableField(exist = false) + private BigDecimal taskProgress; + + /** + * 状态 1待执行2已延期3执行中4已完成 + */ + private String taskType; + + /** + * 发现问题种类,1磁盘使用率2内存使用率3服务状态4响应时间5设备运行状态 + */ + private String problemType; + + /** + * 完成时间 + */ + private Date finishTime; + +} diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/bo/OpsInspectionTaskBo.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/bo/OpsInspectionTaskBo.java new file mode 100644 index 0000000..a8ee181 --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/bo/OpsInspectionTaskBo.java @@ -0,0 +1,100 @@ +package org.dromara.inspection.domain.bo; + +import com.baomidou.mybatisplus.annotation.TableField; +import org.dromara.inspection.domain.OpsInspectionTask; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 运维-巡检计划-任务业务对象 ops_inspection_task + * + * @author LionLi + * @date 2025-09-20 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = OpsInspectionTask.class, reverseConvertGenerate = false) +public class OpsInspectionTaskBo extends BaseEntity { + + /** + * + */ + private Long id; + + private Long projectId; + + /** + * 任务名 + */ + @NotBlank(message = "任务名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taskName; + + /** + * 巡检对象 + */ + @NotBlank(message = "巡检对象不能为空", groups = { AddGroup.class, EditGroup.class }) + private String inspectionObject; + + /** + * + */ + @NotNull(message = "不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date beginTime; + + /** + * + */ + @NotNull(message = "不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date endTime; + + /** + * 时间段 + */ + @NotBlank(message = "时间段不能为空", groups = { AddGroup.class, EditGroup.class }) + private String timeInfo; + + /** + * 计划ID + */ + @NotNull(message = "计划ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long planId; + + /** + * 执行人ID + */ + @NotNull(message = "执行人ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long personId; + + + /** + * 进度 + */ + @TableField(exist = false) + private BigDecimal taskProgress; + + /** + * 状态 1待执行2已延期3执行中4已完成 + */ + @NotNull(message = "状态不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taskType; + + /** + * 发现问题种类,1磁盘使用率2内存使用率3服务状态4响应时间5设备运行状态 + */ + private String problemType; + + /** + * 完成时间 + */ + private Date finishTime; + +} diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/vo/OpsInspectionRecordVo.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/vo/OpsInspectionRecordVo.java new file mode 100644 index 0000000..508273a --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/vo/OpsInspectionRecordVo.java @@ -0,0 +1,69 @@ +package org.dromara.inspection.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 巡检记录 + */ + +@Data +public class OpsInspectionRecordVo { + + /** + * 类型 1月 2周 3日 + */ +// private String type; + + /** + * 完成巡检数量 + */ + private Long finishInspectionCount; + + /** + * 问题梳数量 + */ + private Long problemCount; + + /** + * 已解决问题数量 + */ + private Long solvedProblemCount; + + /** + * 平均完成时间 + */ + private Long averageCompletionTime; + + /** + * 解决效率 + */ + private BigDecimal solveEfficiency; + + /** + * 磁盘使用率类型问题数量 + */ + private Long cpsyl; + + /** + * 内存使用率类型问题数量 + */ + private Long ncsyl; + + /** + * 服务状态类型问题数量 + */ + private Long fwzt; + + /** + * 响应时间类型问题数量 + */ + private Long xysj; + + /** + * 设备运行状态类型问题数量 + */ + private Long sbyxzt; + +} diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/vo/OpsInspectionTaskVo.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/vo/OpsInspectionTaskVo.java new file mode 100644 index 0000000..a37c474 --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/vo/OpsInspectionTaskVo.java @@ -0,0 +1,110 @@ +package org.dromara.inspection.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.inspection.domain.OpsInspectionTask; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.personnel.domain.vo.OpsUserVo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运维-巡检计划-任务视图对象 ops_inspection_task + * + * @author LionLi + * @date 2025-09-20 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = OpsInspectionTask.class) +public class OpsInspectionTaskVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + private Long projectId; + + /** + * 任务名 + */ + @ExcelProperty(value = "任务名") + private String taskName; + + /** + * 巡检对象 + */ + @ExcelProperty(value = "巡检对象") + private String inspectionObject; + + /** + * + */ + @ExcelProperty(value = "") + private Date beginTime; + + /** + * + */ + @ExcelProperty(value = "") + private Date endTime; + + /** + * 时间段 + */ + @ExcelProperty(value = "时间段") + private String timeInfo; + + /** + * 计划ID + */ + @ExcelProperty(value = "计划ID") + private Long planId; + + private OpsInspectionPlanVo plan; + + /** + * 执行人ID + */ + @ExcelProperty(value = "执行人ID") + private Long personId; + + private OpsUserVo person; + + /** + * 进度 + */ + private BigDecimal taskProgress; + + /** + * 状态 1待执行2已延期3执行中4已完成 + */ + private String taskType; + + /** + * 发现问题种类,1磁盘使用率2内存使用率3服务状态4响应时间5设备运行状态 + */ + private String problemType; + + private Date finishTime; + + private Date createTime; + +} diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/mapper/OpsInspectionTaskMapper.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/mapper/OpsInspectionTaskMapper.java new file mode 100644 index 0000000..ac9b53d --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/mapper/OpsInspectionTaskMapper.java @@ -0,0 +1,15 @@ +package org.dromara.inspection.mapper; + +import org.dromara.inspection.domain.OpsInspectionTask; +import org.dromara.inspection.domain.vo.OpsInspectionTaskVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 运维-巡检计划-任务Mapper接口 + * + * @author LionLi + * @date 2025-09-20 + */ +public interface OpsInspectionTaskMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/IOpsInspectionTaskService.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/IOpsInspectionTaskService.java new file mode 100644 index 0000000..e5a6d93 --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/IOpsInspectionTaskService.java @@ -0,0 +1,69 @@ +package org.dromara.inspection.service; + +import org.dromara.inspection.domain.OpsInspectionTask; +import org.dromara.inspection.domain.vo.OpsInspectionTaskVo; +import org.dromara.inspection.domain.bo.OpsInspectionTaskBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 运维-巡检计划-任务Service接口 + * + * @author LionLi + * @date 2025-09-20 + */ +public interface IOpsInspectionTaskService { + + /** + * 查询运维-巡检计划-任务 + * + * @param id 主键 + * @return 运维-巡检计划-任务 + */ + OpsInspectionTaskVo queryById(Long id); + + /** + * 分页查询运维-巡检计划-任务列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 运维-巡检计划-任务分页列表 + */ + TableDataInfo queryPageList(OpsInspectionTaskBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的运维-巡检计划-任务列表 + * + * @param bo 查询条件 + * @return 运维-巡检计划-任务列表 + */ + List queryList(OpsInspectionTaskBo bo); + + /** + * 新增运维-巡检计划-任务 + * + * @param bo 运维-巡检计划-任务 + * @return 是否新增成功 + */ + Boolean insertByBo(OpsInspectionTaskBo bo); + + /** + * 修改运维-巡检计划-任务 + * + * @param bo 运维-巡检计划-任务 + * @return 是否修改成功 + */ + Boolean updateByBo(OpsInspectionTaskBo bo); + + /** + * 校验并批量删除运维-巡检计划-任务信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/impl/OpsInspectionPlanServiceImpl.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/impl/OpsInspectionPlanServiceImpl.java index 7519622..99540c6 100644 --- a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/impl/OpsInspectionPlanServiceImpl.java +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/impl/OpsInspectionPlanServiceImpl.java @@ -10,7 +10,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.personnel.domain.OpsUser; +import org.dromara.personnel.service.impl.OpsUserServiceImpl; import org.dromara.system.api.RemoteUserService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.dromara.inspection.domain.bo.OpsInspectionPlanBo; import org.dromara.inspection.domain.vo.OpsInspectionPlanVo; @@ -35,6 +38,8 @@ public class OpsInspectionPlanServiceImpl implements IOpsInspectionPlanService { @DubboReference private RemoteUserService remoteUserService; + @Autowired + private OpsUserServiceImpl opsUserService; private final OpsInspectionPlanMapper baseMapper; @@ -46,7 +51,13 @@ public class OpsInspectionPlanServiceImpl implements IOpsInspectionPlanService { */ @Override public OpsInspectionPlanVo queryById(Long id){ - return baseMapper.selectVoById(id); + OpsInspectionPlanVo opsInspectionPlanVo = baseMapper.selectVoById(id); + if (opsInspectionPlanVo == null){ + return null; + } + List opsInspectionPlanVo1 = List.of(opsInspectionPlanVo); + setValue(opsInspectionPlanVo1); + return opsInspectionPlanVo1.getFirst(); } /** @@ -60,9 +71,7 @@ public class OpsInspectionPlanServiceImpl implements IOpsInspectionPlanService { public TableDataInfo queryPageList(OpsInspectionPlanBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - for (OpsInspectionPlanVo record : result.getRecords()) { -// remoteUserService.select(); - } + setValue(result.getRecords()); return TableDataInfo.build(result); } @@ -140,4 +149,19 @@ public class OpsInspectionPlanServiceImpl implements IOpsInspectionPlanService { } return baseMapper.deleteByIds(ids) > 0; } + + /** + * 回显信息赋值 + */ + private void setValue(List list){ + list.forEach(record -> { + OpsUser byId = opsUserService.getById(record.getPerson()); + if (byId != null){ + record.setNickName(byId.getUserName()); + }else{ + record.setNickName("未知用户"); + } + }); + } + } diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/impl/OpsInspectionTaskServiceImpl.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/impl/OpsInspectionTaskServiceImpl.java new file mode 100644 index 0000000..15f4f89 --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/impl/OpsInspectionTaskServiceImpl.java @@ -0,0 +1,293 @@ +package org.dromara.inspection.service.impl; + +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.inspection.domain.vo.OpsInspectionPlanVo; +import org.dromara.inspection.domain.vo.OpsInspectionRecordVo; +import org.dromara.personnel.domain.vo.OpsUserVo; +import org.dromara.personnel.service.impl.OpsUserServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.dromara.inspection.domain.bo.OpsInspectionTaskBo; +import org.dromara.inspection.domain.vo.OpsInspectionTaskVo; +import org.dromara.inspection.domain.OpsInspectionTask; +import org.dromara.inspection.mapper.OpsInspectionTaskMapper; +import org.dromara.inspection.service.IOpsInspectionTaskService; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * 运维-巡检计划-任务Service业务层处理 + * + * @author LionLi + * @date 2025-09-20 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class OpsInspectionTaskServiceImpl implements IOpsInspectionTaskService { + + private final OpsInspectionTaskMapper baseMapper; + @Autowired + private OpsInspectionPlanServiceImpl opsInspectionPlanService; + @Autowired + private OpsUserServiceImpl opsUserService; + + /** + * 查询运维-巡检计划-任务 + * + * @param id 主键 + * @return 运维-巡检计划-任务 + */ + @Override + public OpsInspectionTaskVo queryById(Long id){ + OpsInspectionTaskVo opsInspectionTaskVo = baseMapper.selectVoById(id); + List opsInspectionTaskVo1 = List.of(opsInspectionTaskVo); + buildEcho(opsInspectionTaskVo1); + return opsInspectionTaskVo1.getFirst(); + } + + /** + * 分页查询运维-巡检计划-任务列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 运维-巡检计划-任务分页列表 + */ + @Override + public TableDataInfo queryPageList(OpsInspectionTaskBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + buildEcho(result.getRecords()); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的运维-巡检计划-任务列表 + * + * @param bo 查询条件 + * @return 运维-巡检计划-任务列表 + */ + @Override + public List queryList(OpsInspectionTaskBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(OpsInspectionTaskBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getId() != null, OpsInspectionTask::getId, bo.getId()); + lqw.eq(bo.getPersonId()!= null, OpsInspectionTask::getPersonId, bo.getPersonId()); + lqw.orderByAsc(OpsInspectionTask::getId); + lqw.like(StringUtils.isNotBlank(bo.getTaskName()), OpsInspectionTask::getTaskName, bo.getTaskName()); + lqw.like(StringUtils.isNotBlank(bo.getInspectionObject()), OpsInspectionTask::getInspectionObject, bo.getInspectionObject()); + lqw.eq(bo.getBeginTime() != null, OpsInspectionTask::getBeginTime, bo.getBeginTime()); + lqw.eq(bo.getEndTime() != null, OpsInspectionTask::getEndTime, bo.getEndTime()); + lqw.eq(StringUtils.isNotBlank(bo.getTimeInfo()), OpsInspectionTask::getTimeInfo, bo.getTimeInfo()); + lqw.eq(bo.getPlanId() != null, OpsInspectionTask::getPlanId, bo.getPlanId()); + lqw.eq(bo.getProjectId() != null, OpsInspectionTask::getProjectId, bo.getProjectId()); + lqw.eq(bo.getTaskType() != null, OpsInspectionTask::getTaskType, bo.getTaskType()); + return lqw; + } + + /** + * 新增运维-巡检计划-任务 + * + * @param bo 运维-巡检计划-任务 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(OpsInspectionTaskBo bo) { + OpsInspectionTask add = MapstructUtils.convert(bo, OpsInspectionTask.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改运维-巡检计划-任务 + * + * @param bo 运维-巡检计划-任务 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(OpsInspectionTaskBo bo) { + OpsInspectionTask update = MapstructUtils.convert(bo, OpsInspectionTask.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(OpsInspectionTask entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除运维-巡检计划-任务信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 巡检记录统计 1月 2周 3日 + */ + public R record(String type,Long projectId){ + //从任务列表中统计 + OpsInspectionTaskBo opsInspectionTaskBo = new OpsInspectionTaskBo(); + opsInspectionTaskBo.setProjectId(projectId); + List opsInspectionTaskVos = this.queryList(opsInspectionTaskBo); + + Long cpsyl = 0L; + Long ncsyl = 0L; + Long fwzt = 0L; + Long xysj = 0L; + Long sbyxzt = 0L; + + Date startDate; + Date endDate; + + OpsInspectionRecordVo recordVo = new OpsInspectionRecordVo(); + switch ( type){ + //统计今天 + case "1" ->{ + // 设置时间范围:今天的00:00:00到23:59:59 + startDate = Date.from(LocalDateTime.of(LocalDate.now(), LocalTime.MIN).atZone(ZoneId.systemDefault()).toInstant()); + endDate = Date.from(LocalDateTime.of(LocalDate.now(), LocalTime.MAX).atZone(ZoneId.systemDefault()).toInstant()); + + } + + //统计本周 + case "2" ->{ + LocalDate today = LocalDate.now(); + LocalDate start = today.minusDays(today.getDayOfWeek().getValue() - 1); + LocalDate end = start.plusDays(6); + startDate = Date.from(start.atStartOfDay(ZoneId.systemDefault()).toInstant()); + endDate = Date.from(end.atTime(23, 59, 59).atZone(ZoneId.systemDefault()).toInstant()); + } + + //统计本月 + case "3" ->{ + LocalDate firstDay = LocalDate.now().withDayOfMonth(1); + LocalDate lastDay = firstDay.plusMonths(1).minusDays(1); + startDate = Date.from(firstDay.atStartOfDay(ZoneId.systemDefault()).toInstant()); + endDate = Date.from(lastDay.atTime(23, 59, 59).atZone(ZoneId.systemDefault()).toInstant()); + } + + default -> { + return R.fail("未知类型"); + } + } + + //完成巡检数 + Date finalStartDate = startDate; + Date finalEndDate = endDate; + + Long finishInspectionCount = (long) opsInspectionTaskVos.stream() + .filter(taskVo -> taskVo.getFinishTime().after(finalStartDate) && taskVo.getFinishTime().before(finalEndDate)) + .toList().size(); + recordVo.setFinishInspectionCount(finishInspectionCount); + + //发现问题数 通过createTime统计 + int problemCount = opsInspectionTaskVos.stream() + .filter(taskVo -> taskVo.getCreateTime().after(finalStartDate) && taskVo.getCreateTime().before(finalEndDate)) + .toList().size(); + recordVo.setProblemCount((long) problemCount); + + //已解决数 获取列表以供通用 + List list = opsInspectionTaskVos.stream() + .filter(taskVo -> taskVo.getCreateTime().after(finalStartDate) && taskVo.getCreateTime().before(finalEndDate)) + .filter(taskVo -> taskVo.getTaskType().equals("4")) + .toList(); + recordVo.setSolvedProblemCount((long) list.size()); + + // 计算总共耗时(毫秒) + long durationMillis = 0L; + for (OpsInspectionTaskVo opsInspectionTaskVo : list) { + durationMillis += opsInspectionTaskVo.getFinishTime().getTime() - opsInspectionTaskVo.getCreateTime().getTime(); + } + //赋值分钟 + recordVo.setAverageCompletionTime(TimeUnit.MILLISECONDS.toMinutes(durationMillis)/list.size()); + + //解决效率 总共问题 / 已解决数 * 100 + BigDecimal problemCountBigDecimal = BigDecimal.valueOf(recordVo.getProblemCount()); + BigDecimal solvedProblemCountBigDecimal = BigDecimal.valueOf(recordVo.getSolvedProblemCount()); + BigDecimal bigDecimal = problemCountBigDecimal.divide(solvedProblemCountBigDecimal, 2, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(0, RoundingMode.HALF_UP); + recordVo.setSolveEfficiency(bigDecimal); + + for (OpsInspectionTaskVo opsInspectionTaskVo : opsInspectionTaskVos) { + if (opsInspectionTaskVo.getCreateTime().after(startDate) && opsInspectionTaskVo.getCreateTime().before(endDate)){ + switch (opsInspectionTaskVo.getProblemType()){ + case "1" -> cpsyl++; + case "2" -> ncsyl++; + case "3" -> fwzt++; + case "4" -> xysj++; + case "5" -> sbyxzt++; + } + } + } + recordVo.setCpsyl(cpsyl); + recordVo.setNcsyl(ncsyl); + recordVo.setFwzt(fwzt); + recordVo.setXysj(xysj); + recordVo.setSbyxzt(sbyxzt); + + return R.ok(recordVo); + } + + + /** + * 构造回显信息 + */ + private void buildEcho(List taskVos) { + //TODO 回显信息 + taskVos.forEach(taskVo -> { + if (taskVo.getPlanId()!=null) { + OpsInspectionPlanVo opsInspectionPlanVo = opsInspectionPlanService.queryById(taskVo.getPlanId()); + if (opsInspectionPlanVo != null) { + taskVo.setPlan(opsInspectionPlanVo); + } + } + if (taskVo.getPersonId()!=null) { + OpsUserVo opsUserVo = opsUserService.queryById(taskVo.getPersonId()); + if (opsUserVo != null) { + taskVo.setPerson(opsUserVo); + } + } + }); + } + +}