diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/controller/OpsInspectionTestPlanController.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/controller/OpsInspectionTestPlanController.java new file mode 100644 index 0000000..df469ef --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/controller/OpsInspectionTestPlanController.java @@ -0,0 +1,106 @@ +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.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.OpsInspectionTestPlanVo; +import org.dromara.inspection.domain.bo.OpsInspectionTestPlanBo; +import org.dromara.inspection.service.IOpsInspectionTestPlanService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 运维-巡检-试验计划 + * 前端访问路由地址为:/inspection/testPlan + * + * @author LionLi + * @date 2025-09-20 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/testPlan") +public class OpsInspectionTestPlanController extends BaseController { + + private final IOpsInspectionTestPlanService opsInspectionTestPlanService; + + /** + * 查询运维-巡检-试验计划列表 + */ + @SaCheckPermission("inspection:testPlan:list") + @GetMapping("/list") + public TableDataInfo list(OpsInspectionTestPlanBo bo, PageQuery pageQuery) { + return opsInspectionTestPlanService.queryPageList(bo, pageQuery); + } + + /** + * 导出运维-巡检-试验计划列表 + */ + @SaCheckPermission("inspection:testPlan:export") + @Log(title = "运维-巡检-试验计划", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(OpsInspectionTestPlanBo bo, HttpServletResponse response) { + List list = opsInspectionTestPlanService.queryList(bo); + ExcelUtil.exportExcel(list, "运维-巡检-试验计划", OpsInspectionTestPlanVo.class, response); + } + + /** + * 获取运维-巡检-试验计划详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("inspection:testPlan:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("id") Long id) { + return R.ok(opsInspectionTestPlanService.queryById(id)); + } + + /** + * 新增运维-巡检-试验计划 + */ + @SaCheckPermission("inspection:testPlan:add") + @Log(title = "运维-巡检-试验计划", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody OpsInspectionTestPlanBo bo) { + return toAjax(opsInspectionTestPlanService.insertByBo(bo)); + } + + /** + * 修改运维-巡检-试验计划 + */ + @SaCheckPermission("inspection:testPlan:edit") + @Log(title = "运维-巡检-试验计划", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody OpsInspectionTestPlanBo bo) { + return toAjax(opsInspectionTestPlanService.updateByBo(bo)); + } + + /** + * 删除运维-巡检-试验计划 + * + * @param ids 主键串 + */ + @SaCheckPermission("inspection:testPlan:remove") + @Log(title = "运维-巡检-试验计划", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable("ids") Long[] ids) { + return toAjax(opsInspectionTestPlanService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/controller/OpsInspectionTestTaskController.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/controller/OpsInspectionTestTaskController.java new file mode 100644 index 0000000..c5da462 --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/controller/OpsInspectionTestTaskController.java @@ -0,0 +1,116 @@ +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.service.impl.OpsInspectionTestTaskServiceImpl; +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.OpsInspectionTestTaskVo; +import org.dromara.inspection.domain.bo.OpsInspectionTestTaskBo; +import org.dromara.inspection.service.IOpsInspectionTestTaskService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 运维-巡检-试验任务 + * 前端访问路由地址为:/inspection/testTask + * + * @author LionLi + * @date 2025-09-20 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/testTask") +public class OpsInspectionTestTaskController extends BaseController { + + private final OpsInspectionTestTaskServiceImpl opsInspectionTestTaskService; + + /** + * 查询运维-巡检-试验任务列表 + */ + @SaCheckPermission("inspection:testTask:list") + @GetMapping("/list") + public TableDataInfo list(OpsInspectionTestTaskBo bo, PageQuery pageQuery) { + return opsInspectionTestTaskService.queryPageList(bo, pageQuery); + } + + /** + * 导出运维-巡检-试验任务列表 + */ + @SaCheckPermission("inspection:testTask:export") + @Log(title = "运维-巡检-试验任务", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(OpsInspectionTestTaskBo bo, HttpServletResponse response) { + List list = opsInspectionTestTaskService.queryList(bo); + ExcelUtil.exportExcel(list, "运维-巡检-试验任务", OpsInspectionTestTaskVo.class, response); + } + + /** + * 获取运维-巡检-试验任务详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("inspection:testTask:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("id") Long id) { + return R.ok(opsInspectionTestTaskService.queryById(id)); + } + + /** + * 新增运维-巡检-试验任务 + */ + @SaCheckPermission("inspection:testTask:add") + @Log(title = "运维-巡检-试验任务", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody OpsInspectionTestTaskBo bo) { + return toAjax(opsInspectionTestTaskService.insertByBo(bo)); + } + + /** + * 修改运维-巡检-试验任务 + */ + @SaCheckPermission("inspection:testTask:edit") + @Log(title = "运维-巡检-试验任务", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody OpsInspectionTestTaskBo bo) { + return toAjax(opsInspectionTestTaskService.updateByBo(bo)); + } + + /** + * 删除运维-巡检-试验任务 + * + * @param ids 主键串 + */ + @SaCheckPermission("inspection:testTask:remove") + @Log(title = "运维-巡检-试验任务", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable("ids") Long[] ids) { + return toAjax(opsInspectionTestTaskService.deleteWithValidByIds(List.of(ids), true)); + } + + @SaCheckPermission("inspection:testTask:record") + @GetMapping("/record") + public R record(@RequestParam Long projectId){ + return opsInspectionTestTaskService.record(projectId); + } + + + +} diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/OpsInspectionTestPlan.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/OpsInspectionTestPlan.java new file mode 100644 index 0000000..672a61e --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/OpsInspectionTestPlan.java @@ -0,0 +1,109 @@ +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.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 运维-巡检-试验计划对象 ops_inspection_test_plan + * + * @author LionLi + * @date 2025-09-20 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("ops_inspection_test_plan") +public class OpsInspectionTestPlan extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 电站ID + */ + private Long projectId; + + /** + * 计划名称 + */ + private String planName; + + /** + * 计划编号 + */ + private String planCode; + + /** + * 实验对象类型,1安全试验2网络实验3性能试验4 + */ + private String testObject; + + /** + * + */ + private Date beginTime; + + /** + * + */ + private Date endTime; + + /** + * 试验目的与预期结果 + */ + private String testInfo; + + /** + * 实验环境 + */ + private String testSetting; + + /** + * 负责人ID + */ + private Long personCharge; + + /** + * 参与人员IDS + */ + private String personIds; + + /** + * 自定义检查项 + */ + private String inspectionItems; + + /** + * 实验步骤 + */ + private String testStep; + + /** + * 所需资源与设备 + */ + private String testDevice; + + /** + * 风险评估与应对措施 + */ + private String testSolutions; + + /** + * 申请状态 1已批准2进行中3已完成4草稿5未通过 + */ + private String testStatus; + + //1启动2停止 + private String testPlanType; +} diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/OpsInspectionTestTask.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/OpsInspectionTestTask.java new file mode 100644 index 0000000..643edfe --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/OpsInspectionTestTask.java @@ -0,0 +1,147 @@ +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.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 运维-巡检-试验任务对象 ops_inspection_test_task + * + * @author LionLi + * @date 2025-09-20 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("ops_inspection_test_task") +public class OpsInspectionTestTask extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 项目ID(电站ID) + */ + private Long projectId; + + /** + * 任务名称 + */ + private String taskName; + + /** + * 测试对象 + */ + private String testObject; + + /** + * + */ + private Date beginTime; + + /** + * + */ + private Date endTime; + + /** + * + */ + private String timeInfo; + + /** + * 执行人员 + */ + private Long person; + + /** + * 状态,1待执行2暂停3失败4执行中5已完成 + */ + private String status; + + /** + * 关联测试计划ID + */ + private Long testPlanId; + + /** + * 试验环境 + */ + private String testSetting; + + /** + * 开始时间 + */ + private Date planBeginTime; + + /** + * 进度 + */ + private Long progress; + + /** + * 失败原因 + */ + private String failReason; + + /** + * 失败时间 + */ + private Date failTime; + + /** + * 失败阶段 + */ + private Long failPhase; + + /** + * 失败原因分析 + */ + private String faileAnalyze; + + /** + * 改进建议 + */ + private String faileTips; + + /** + * 试验时长(分钟) + */ + private Long testLongTime; + + /** + * 结果 + */ + private String testFinal; + + /** + * 结果详情 + */ + private String finalInfo; + + /** + * 暂停原因 + */ + private String pauseFor; + + /** + * 暂停时间 + */ + private Date pauseTime; + + /** + * 计划完成时间 + */ + private Date planFinishTime; + +} diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/bo/OpsInspectionTestPlanBo.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/bo/OpsInspectionTestPlanBo.java new file mode 100644 index 0000000..ca9ce04 --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/bo/OpsInspectionTestPlanBo.java @@ -0,0 +1,121 @@ +package org.dromara.inspection.domain.bo; + +import org.dromara.inspection.domain.OpsInspectionTestPlan; +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.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 运维-巡检-试验计划业务对象 ops_inspection_test_plan + * + * @author LionLi + * @date 2025-09-20 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = OpsInspectionTestPlan.class, reverseConvertGenerate = false) +public class OpsInspectionTestPlanBo extends BaseEntity { + + /** + * + */ + private Long id; + + /** + * 电站ID + */ + @NotNull(message = "电站ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long projectId; + + /** + * 计划名称 + */ + @NotBlank(message = "计划名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String planName; + + /** + * 计划编号 + */ + @NotBlank(message = "计划编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String planCode; + + /** + * 实验对象类型,1安全试验2网络实验3性能试验4 + */ + @NotBlank(message = "实验对象类型,1安全试验2网络实验3性能试验4不能为空", groups = { AddGroup.class, EditGroup.class }) + private String testObject; + + /** + * + */ + @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 testInfo; + + /** + * 实验环境 + */ + @NotBlank(message = "实验环境不能为空", groups = { AddGroup.class, EditGroup.class }) + private String testSetting; + + /** + * 负责人ID + */ + @NotNull(message = "负责人ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long personCharge; + + /** + * 参与人员IDS + */ + @NotBlank(message = "参与人员IDS不能为空", groups = { AddGroup.class, EditGroup.class }) + private String personIds; + + /** + * 自定义检查项 + */ +// @NotBlank(message = "自定义检查项不能为空", groups = { AddGroup.class, EditGroup.class }) + private String inspectionItems; + + /** + * 实验步骤 + */ + private String testStep; + + /** + * 所需资源与设备 + */ + private String testDevice; + + /** + * 风险评估与应对措施 + */ + @NotBlank(message = "风险评估与应对措施不能为空", groups = { AddGroup.class, EditGroup.class }) + private String testSolutions; + + /** + * 申请状态 1已批准2进行中3已完成4草稿5未通过 + */ + @NotBlank(message = "状态不能为空", groups = { AddGroup.class, EditGroup.class }) + private String testStatus; + + //1启动2停止 + private String testPlanType; + +} diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/bo/OpsInspectionTestTaskBo.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/bo/OpsInspectionTestTaskBo.java new file mode 100644 index 0000000..8dd8cf6 --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/bo/OpsInspectionTestTaskBo.java @@ -0,0 +1,154 @@ +package org.dromara.inspection.domain.bo; + +import org.dromara.inspection.domain.OpsInspectionTestTask; +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.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 运维-巡检-试验任务业务对象 ops_inspection_test_task + * + * @author LionLi + * @date 2025-09-20 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = OpsInspectionTestTask.class, reverseConvertGenerate = false) +public class OpsInspectionTestTaskBo extends BaseEntity { + + /** + * + */ + private Long id; + + /** + * 项目ID(电站ID) + */ + @NotNull(message = "项目ID(电站ID)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long projectId; + + /** + * 任务名称 + */ + @NotBlank(message = "任务名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taskName; + + /** + * 测试对象 + */ + @NotBlank(message = "测试对象不能为空", groups = { AddGroup.class, EditGroup.class }) + private String testObject; + + /** + * + */ + @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; + + /** + * 执行人员 + */ + @NotNull(message = "执行人员不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long person; + + /** + * 状态,1待执行2暂停3失败4执行中5已完成 + */ + @NotBlank(message = "状态,1待执行2暂停3失败4执行中5已完成不能为空", groups = { AddGroup.class, EditGroup.class }) + private String status; + + /** + * 关联测试计划ID + */ + @NotNull(message = "关联测试计划ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long testPlanId; + + /** + * 试验环境 + */ + private String testSetting; + + /** + * 开始时间 + */ + private Date planBeginTime; + + /** + * 进度 + */ + private Long progress; + + /** + * 失败原因 + */ + private String failReason; + + /** + * 失败时间 + */ + private Date failTime; + + /** + * 失败阶段 + */ + private Long failPhase; + + /** + * 失败原因分析 + */ + private String faileAnalyze; + + /** + * 改进建议 + */ + private String faileTips; + + /** + * 试验时长(分钟) + */ + private Long testLongTime; + + /** + * 结果 + */ + private String testFinal; + + /** + * 结果详情 + */ + private String finalInfo; + + /** + * 暂停原因 + */ + private String pauseFor; + + /** + * 暂停时间 + */ + private Date pauseTime; + + /** + * 计划完成时间 + */ + private Date planFinishTime; + +} diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/vo/OpsInspectionTestPlanVo.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/vo/OpsInspectionTestPlanVo.java new file mode 100644 index 0000000..49b0624 --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/vo/OpsInspectionTestPlanVo.java @@ -0,0 +1,141 @@ +package org.dromara.inspection.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.inspection.domain.OpsInspectionItem; +import org.dromara.inspection.domain.OpsInspectionTestPlan; +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.OpsUser; +import org.dromara.personnel.domain.vo.OpsUserVo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * 运维-巡检-试验计划视图对象 ops_inspection_test_plan + * + * @author LionLi + * @date 2025-09-20 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = OpsInspectionTestPlan.class) +public class OpsInspectionTestPlanVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 电站ID + */ + @ExcelProperty(value = "电站ID") + private Long projectId; + + /** + * 计划名称 + */ + @ExcelProperty(value = "计划名称") + private String planName; + + /** + * 计划编号 + */ + @ExcelProperty(value = "计划编号") + private String planCode; + + /** + * 实验对象类型,1安全试验2网络实验3性能试验4 + */ + @ExcelProperty(value = "实验对象类型,1安全试验2网络实验3性能试验4") + private String testObject; + + /** + * + */ + @ExcelProperty(value = "") + private Date beginTime; + + /** + * + */ + @ExcelProperty(value = "") + private Date endTime; + + /** + * 试验目的与预期结果 + */ + @ExcelProperty(value = "试验目的与预期结果") + private String testInfo; + + /** + * 实验环境 + */ + @ExcelProperty(value = "实验环境") + private String testSetting; + + /** + * 负责人ID + */ + @ExcelProperty(value = "负责人ID") + private Long personCharge; + + private OpsUserVo person; + + /** + * 参与人员IDS + */ + @ExcelProperty(value = "参与人员IDS") + private String personIds; + + private List persons; + + /** + * 自定义检查项 + */ + @ExcelProperty(value = "自定义检查项") + private String inspectionItems; + + private List inspectionItemList; + + /** + * 实验步骤 + */ + @ExcelProperty(value = "实验步骤") + private String testStep; + + /** + * 所需资源与设备 + */ + @ExcelProperty(value = "所需资源与设备") + private String testDevice; + + /** + * 风险评估与应对措施 + */ + @ExcelProperty(value = "风险评估与应对措施") + private String testSolutions; + + /** + * 申请状态 1已批准2进行中3已完成4草稿5未通过 + */ + @ExcelProperty(value = "状态") + private String testStatus; + + //1启动2停止 + private String testPlanType; + +} diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/vo/OpsInspectionTestTaskRecord.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/vo/OpsInspectionTestTaskRecord.java new file mode 100644 index 0000000..4360419 --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/vo/OpsInspectionTestTaskRecord.java @@ -0,0 +1,45 @@ +package org.dromara.inspection.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class OpsInspectionTestTaskRecord { + + /** + * 本月完成数 + */ + private Long finishCount; + + /** + * 上月增加数 + */ + private BigDecimal finishCountAdd; + + /** + * 本月通过率 + */ + private BigDecimal passValue; + + /** + * 通过增长率 + */ + private BigDecimal passValueAdd; + + /** + * 待分析数 + */ + private Long failCount; + + /** + * 平均测试时间 + */ + private Long averageTestTime; + + /** + * 平均测试时间数增长率 + */ + private BigDecimal averageTestTimeAdd; + +} diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/vo/OpsInspectionTestTaskVo.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/vo/OpsInspectionTestTaskVo.java new file mode 100644 index 0000000..c8f8f29 --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/domain/vo/OpsInspectionTestTaskVo.java @@ -0,0 +1,181 @@ +package org.dromara.inspection.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.inspection.domain.OpsInspectionTestTask; +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_test_task + * + * @author LionLi + * @date 2025-09-20 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = OpsInspectionTestTask.class) +public class OpsInspectionTestTaskVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 项目ID(电站ID) + */ + @ExcelProperty(value = "项目ID(电站ID)") + private Long projectId; + + /** + * 任务名称 + */ + @ExcelProperty(value = "任务名称") + private String taskName; + + /** + * 测试对象 + */ + @ExcelProperty(value = "测试对象") + private String testObject; + + /** + * + */ + @ExcelProperty(value = "开始时间") + private Date beginTime; + + /** + * + */ + @ExcelProperty(value = "结束时间") + private Date endTime; + + /** + * + */ + @ExcelProperty(value = "时间段") + private String timeInfo; + + /** + * 执行人员 + */ + @ExcelProperty(value = "执行人员") + private Long person; + + private OpsUserVo personInfo; + + /** + * 状态,1待执行2暂停3失败4执行中5已完成 + */ + @ExcelProperty(value = "状态,1待执行2暂停3失败4执行中5已完成") + private String status; + + /** + * 关联测试计划ID + */ + @ExcelProperty(value = "关联测试计划ID") + private Long testPlanId; + + private OpsInspectionTestPlanVo testPlan; + + /** + * 试验环境 + */ + @ExcelProperty(value = "试验环境") + private String testSetting; + + /** + * 开始时间 + */ + @ExcelProperty(value = "开始时间") + private Date planBeginTime; + + /** + * 进度 + */ + @ExcelProperty(value = "进度") + private Long progress; + + /** + * 失败原因 + */ + @ExcelProperty(value = "失败原因") + private String failReason; + + /** + * 失败时间 + */ + @ExcelProperty(value = "失败时间") + private Date failTime; + + /** + * 失败阶段 + */ + @ExcelProperty(value = "失败阶段") + private Long failPhase; + + /** + * 失败原因分析 + */ + @ExcelProperty(value = "失败原因分析") + private String faileAnalyze; + + /** + * 改进建议 + */ + @ExcelProperty(value = "改进建议") + private String faileTips; + + /** + * 试验时长(分钟) + */ + @ExcelProperty(value = "试验时长(分钟)") + private Long testLongTime; + + /** + * 结果 + */ + @ExcelProperty(value = "结果") + private String testFinal; + + /** + * 结果详情 + */ + @ExcelProperty(value = "结果详情") + private String finalInfo; + + /** + * 暂停原因 + */ + @ExcelProperty(value = "暂停原因") + private String pauseFor; + + /** + * 暂停时间 + */ + @ExcelProperty(value = "暂停时间") + private Date pauseTime; + + /** + * 计划完成时间 + */ + private Date planFinishTime; + +} diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/mapper/OpsInspectionTestPlanMapper.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/mapper/OpsInspectionTestPlanMapper.java new file mode 100644 index 0000000..f5f2405 --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/mapper/OpsInspectionTestPlanMapper.java @@ -0,0 +1,15 @@ +package org.dromara.inspection.mapper; + +import org.dromara.inspection.domain.OpsInspectionTestPlan; +import org.dromara.inspection.domain.vo.OpsInspectionTestPlanVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 运维-巡检-试验计划Mapper接口 + * + * @author LionLi + * @date 2025-09-20 + */ +public interface OpsInspectionTestPlanMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/mapper/OpsInspectionTestTaskMapper.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/mapper/OpsInspectionTestTaskMapper.java new file mode 100644 index 0000000..3447d7c --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/mapper/OpsInspectionTestTaskMapper.java @@ -0,0 +1,15 @@ +package org.dromara.inspection.mapper; + +import org.dromara.inspection.domain.OpsInspectionTestTask; +import org.dromara.inspection.domain.vo.OpsInspectionTestTaskVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 运维-巡检-试验任务Mapper接口 + * + * @author LionLi + * @date 2025-09-20 + */ +public interface OpsInspectionTestTaskMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/IOpsInspectionTestPlanService.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/IOpsInspectionTestPlanService.java new file mode 100644 index 0000000..8c0e119 --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/IOpsInspectionTestPlanService.java @@ -0,0 +1,69 @@ +package org.dromara.inspection.service; + +import org.dromara.inspection.domain.OpsInspectionTestPlan; +import org.dromara.inspection.domain.vo.OpsInspectionTestPlanVo; +import org.dromara.inspection.domain.bo.OpsInspectionTestPlanBo; +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 IOpsInspectionTestPlanService { + + /** + * 查询运维-巡检-试验计划 + * + * @param id 主键 + * @return 运维-巡检-试验计划 + */ + OpsInspectionTestPlanVo queryById(Long id); + + /** + * 分页查询运维-巡检-试验计划列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 运维-巡检-试验计划分页列表 + */ + TableDataInfo queryPageList(OpsInspectionTestPlanBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的运维-巡检-试验计划列表 + * + * @param bo 查询条件 + * @return 运维-巡检-试验计划列表 + */ + List queryList(OpsInspectionTestPlanBo bo); + + /** + * 新增运维-巡检-试验计划 + * + * @param bo 运维-巡检-试验计划 + * @return 是否新增成功 + */ + Boolean insertByBo(OpsInspectionTestPlanBo bo); + + /** + * 修改运维-巡检-试验计划 + * + * @param bo 运维-巡检-试验计划 + * @return 是否修改成功 + */ + Boolean updateByBo(OpsInspectionTestPlanBo 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/IOpsInspectionTestTaskService.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/IOpsInspectionTestTaskService.java new file mode 100644 index 0000000..ae4cbcb --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/IOpsInspectionTestTaskService.java @@ -0,0 +1,69 @@ +package org.dromara.inspection.service; + +import org.dromara.inspection.domain.OpsInspectionTestTask; +import org.dromara.inspection.domain.vo.OpsInspectionTestTaskVo; +import org.dromara.inspection.domain.bo.OpsInspectionTestTaskBo; +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 IOpsInspectionTestTaskService { + + /** + * 查询运维-巡检-试验任务 + * + * @param id 主键 + * @return 运维-巡检-试验任务 + */ + OpsInspectionTestTaskVo queryById(Long id); + + /** + * 分页查询运维-巡检-试验任务列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 运维-巡检-试验任务分页列表 + */ + TableDataInfo queryPageList(OpsInspectionTestTaskBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的运维-巡检-试验任务列表 + * + * @param bo 查询条件 + * @return 运维-巡检-试验任务列表 + */ + List queryList(OpsInspectionTestTaskBo bo); + + /** + * 新增运维-巡检-试验任务 + * + * @param bo 运维-巡检-试验任务 + * @return 是否新增成功 + */ + Boolean insertByBo(OpsInspectionTestTaskBo bo); + + /** + * 修改运维-巡检-试验任务 + * + * @param bo 运维-巡检-试验任务 + * @return 是否修改成功 + */ + Boolean updateByBo(OpsInspectionTestTaskBo 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/OpsInspectionTaskServiceImpl.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/impl/OpsInspectionTaskServiceImpl.java index 15f4f89..1416be4 100644 --- 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 @@ -240,14 +240,21 @@ public class OpsInspectionTaskServiceImpl implements IOpsInspectionTaskService { durationMillis += opsInspectionTaskVo.getFinishTime().getTime() - opsInspectionTaskVo.getCreateTime().getTime(); } //赋值分钟 - recordVo.setAverageCompletionTime(TimeUnit.MILLISECONDS.toMinutes(durationMillis)/list.size()); + if (list.isEmpty()){ + recordVo.setAverageCompletionTime(0L); + }else { + recordVo.setAverageCompletionTime(TimeUnit.MILLISECONDS.toMinutes(durationMillis) / list.size()); + } - //解决效率 总共问题 / 已解决数 * 100 + //解决效率 已解决数 / 总共数量 * 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); - + if (solvedProblemCountBigDecimal.compareTo(BigDecimal.ZERO) == 0 || problemCountBigDecimal.compareTo(BigDecimal.ZERO) == 0){ + recordVo.setSolveEfficiency(BigDecimal.valueOf(0)); + }else { + BigDecimal bigDecimal = solvedProblemCountBigDecimal.divide(problemCountBigDecimal, 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()){ diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/impl/OpsInspectionTestPlanServiceImpl.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/impl/OpsInspectionTestPlanServiceImpl.java new file mode 100644 index 0000000..6133bcc --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/impl/OpsInspectionTestPlanServiceImpl.java @@ -0,0 +1,201 @@ +package org.dromara.inspection.service.impl; + +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.OpsInspectionItemVo; +import org.dromara.personnel.domain.OpsUser; +import org.dromara.personnel.domain.bo.OpsUserBo; +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.OpsInspectionTestPlanBo; +import org.dromara.inspection.domain.vo.OpsInspectionTestPlanVo; +import org.dromara.inspection.domain.OpsInspectionTestPlan; +import org.dromara.inspection.mapper.OpsInspectionTestPlanMapper; +import org.dromara.inspection.service.IOpsInspectionTestPlanService; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 运维-巡检-试验计划Service业务层处理 + * + * @author LionLi + * @date 2025-09-20 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class OpsInspectionTestPlanServiceImpl implements IOpsInspectionTestPlanService { + + @Autowired + private OpsUserServiceImpl opsUserService; + @Autowired + private OpsInspectionItemServiceImpl inspectionItemService; + + private final OpsInspectionTestPlanMapper baseMapper; + + /** + * 查询运维-巡检-试验计划 + * + * @param id 主键 + * @return 运维-巡检-试验计划 + */ + @Override + public OpsInspectionTestPlanVo queryById(Long id){ + OpsInspectionTestPlanVo opsInspectionTestPlanVo = baseMapper.selectVoById(id); + List opsInspectionTestPlanVo1 = List.of(opsInspectionTestPlanVo); + setValue(opsInspectionTestPlanVo1); + return opsInspectionTestPlanVo1.getFirst(); + } + + /** + * 分页查询运维-巡检-试验计划列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 运维-巡检-试验计划分页列表 + */ + @Override + public TableDataInfo queryPageList(OpsInspectionTestPlanBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + setValue(result.getRecords()); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的运维-巡检-试验计划列表 + * + * @param bo 查询条件 + * @return 运维-巡检-试验计划列表 + */ + @Override + public List queryList(OpsInspectionTestPlanBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(OpsInspectionTestPlanBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(OpsInspectionTestPlan::getId); + lqw.eq(bo.getProjectId() != null, OpsInspectionTestPlan::getProjectId, bo.getProjectId()); + lqw.like(StringUtils.isNotBlank(bo.getPlanName()), OpsInspectionTestPlan::getPlanName, bo.getPlanName()); + lqw.eq(StringUtils.isNotBlank(bo.getPlanCode()), OpsInspectionTestPlan::getPlanCode, bo.getPlanCode()); + lqw.eq(StringUtils.isNotBlank(bo.getTestObject()), OpsInspectionTestPlan::getTestObject, bo.getTestObject()); + lqw.eq(bo.getBeginTime() != null, OpsInspectionTestPlan::getBeginTime, bo.getBeginTime()); + lqw.eq(bo.getEndTime() != null, OpsInspectionTestPlan::getEndTime, bo.getEndTime()); + lqw.eq(StringUtils.isNotBlank(bo.getTestInfo()), OpsInspectionTestPlan::getTestInfo, bo.getTestInfo()); + lqw.eq(StringUtils.isNotBlank(bo.getTestSetting()), OpsInspectionTestPlan::getTestSetting, bo.getTestSetting()); + lqw.eq(bo.getPersonCharge() != null, OpsInspectionTestPlan::getPersonCharge, bo.getPersonCharge()); + lqw.eq(StringUtils.isNotBlank(bo.getPersonIds()), OpsInspectionTestPlan::getPersonIds, bo.getPersonIds()); + lqw.eq(StringUtils.isNotBlank(bo.getInspectionItems()), OpsInspectionTestPlan::getInspectionItems, bo.getInspectionItems()); + lqw.eq(StringUtils.isNotBlank(bo.getTestStep()), OpsInspectionTestPlan::getTestStep, bo.getTestStep()); + lqw.eq(StringUtils.isNotBlank(bo.getTestDevice()), OpsInspectionTestPlan::getTestDevice, bo.getTestDevice()); + lqw.eq(StringUtils.isNotBlank(bo.getTestSolutions()), OpsInspectionTestPlan::getTestSolutions, bo.getTestSolutions()); + return lqw; + } + + /** + * 新增运维-巡检-试验计划 + * + * @param bo 运维-巡检-试验计划 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(OpsInspectionTestPlanBo bo) { + OpsInspectionTestPlan add = MapstructUtils.convert(bo, OpsInspectionTestPlan.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改运维-巡检-试验计划 + * + * @param bo 运维-巡检-试验计划 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(OpsInspectionTestPlanBo bo) { + OpsInspectionTestPlan update = MapstructUtils.convert(bo, OpsInspectionTestPlan.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(OpsInspectionTestPlan entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除运维-巡检-试验计划信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 处理回显数据 + */ + public void setValue(List list){ + for (OpsInspectionTestPlanVo opsInspectionTestPlanVo : list) { + + if(opsInspectionTestPlanVo.getPersonCharge()!=null) { + OpsUserVo byId = opsUserService.queryById(opsInspectionTestPlanVo.getPersonCharge()); + if (byId != null) { + opsInspectionTestPlanVo.setPerson(byId); + } + } + + if (opsInspectionTestPlanVo.getPersonIds() != null){ + String[] split = opsInspectionTestPlanVo.getPersonIds().split(","); + List opsUserVos = new ArrayList<>(); + for (String s : split) { + OpsUserVo opsUserVo = opsUserService.queryById(Long.parseLong(s)); + if (opsUserVo != null){ + opsUserVos.add(opsUserVo); + } + } + opsInspectionTestPlanVo.setPersons(opsUserVos); + } + +// if (opsInspectionTestPlanVo.getInspectionItems()!=null){ +// String[] split = opsInspectionTestPlanVo.getInspectionItems().split(","); +// List opsInspectionItemVos = new ArrayList<>(); +// for (String s : split) { +// OpsInspectionItemVo opsInspectionItemVo = inspectionItemService.queryById(Long.parseLong(s)); +// if (opsInspectionItemVo != null){ +// opsInspectionItemVos.add(opsInspectionItemVo); +// } +// } +// } + + } + } + +} diff --git a/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/impl/OpsInspectionTestTaskServiceImpl.java b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/impl/OpsInspectionTestTaskServiceImpl.java new file mode 100644 index 0000000..9195e01 --- /dev/null +++ b/ruoyi-modules/xny-ops/src/main/java/org/dromara/inspection/service/impl/OpsInspectionTestTaskServiceImpl.java @@ -0,0 +1,276 @@ +package org.dromara.inspection.service.impl; + +import lombok.Data; +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.OpsInspectionTestPlanVo; +import org.dromara.inspection.domain.vo.OpsInspectionTestTaskRecord; +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.OpsInspectionTestTaskBo; +import org.dromara.inspection.domain.vo.OpsInspectionTestTaskVo; +import org.dromara.inspection.domain.OpsInspectionTestTask; +import org.dromara.inspection.mapper.OpsInspectionTestTaskMapper; +import org.dromara.inspection.service.IOpsInspectionTestTaskService; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 运维-巡检-试验任务Service业务层处理 + * + * @author LionLi + * @date 2025-09-20 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class OpsInspectionTestTaskServiceImpl implements IOpsInspectionTestTaskService { + + private final OpsInspectionTestTaskMapper baseMapper; + @Autowired + private OpsUserServiceImpl opsUserService; + @Autowired + private OpsInspectionTestPlanServiceImpl opsInspectionTestPlanService; + + /** + * 查询运维-巡检-试验任务 + * + * @param id 主键 + * @return 运维-巡检-试验任务 + */ + @Override + public OpsInspectionTestTaskVo queryById(Long id){ + OpsInspectionTestTaskVo opsInspectionTestTaskVo = baseMapper.selectVoById(id); + List opsInspectionTestTaskVo1 = List.of(opsInspectionTestTaskVo); + setValue(opsInspectionTestTaskVo1); + return opsInspectionTestTaskVo1.getFirst(); + } + + /** + * 分页查询运维-巡检-试验任务列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 运维-巡检-试验任务分页列表 + */ + @Override + public TableDataInfo queryPageList(OpsInspectionTestTaskBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + setValue(result.getRecords()); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的运维-巡检-试验任务列表 + * + * @param bo 查询条件 + * @return 运维-巡检-试验任务列表 + */ + @Override + public List queryList(OpsInspectionTestTaskBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(OpsInspectionTestTaskBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(OpsInspectionTestTask::getId); + lqw.eq(bo.getProjectId() != null, OpsInspectionTestTask::getProjectId, bo.getProjectId()); + lqw.like(StringUtils.isNotBlank(bo.getTaskName()), OpsInspectionTestTask::getTaskName, bo.getTaskName()); + lqw.eq(StringUtils.isNotBlank(bo.getTestObject()), OpsInspectionTestTask::getTestObject, bo.getTestObject()); + lqw.eq(bo.getBeginTime() != null, OpsInspectionTestTask::getBeginTime, bo.getBeginTime()); + lqw.eq(bo.getEndTime() != null, OpsInspectionTestTask::getEndTime, bo.getEndTime()); + lqw.eq(StringUtils.isNotBlank(bo.getTimeInfo()), OpsInspectionTestTask::getTimeInfo, bo.getTimeInfo()); + lqw.eq(bo.getPerson() != null, OpsInspectionTestTask::getPerson, bo.getPerson()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), OpsInspectionTestTask::getStatus, bo.getStatus()); + lqw.eq(bo.getTestPlanId() != null, OpsInspectionTestTask::getTestPlanId, bo.getTestPlanId()); + lqw.eq(StringUtils.isNotBlank(bo.getTestSetting()), OpsInspectionTestTask::getTestSetting, bo.getTestSetting()); + lqw.eq(bo.getPlanBeginTime() != null, OpsInspectionTestTask::getPlanBeginTime, bo.getPlanBeginTime()); + lqw.eq(bo.getProgress() != null, OpsInspectionTestTask::getProgress, bo.getProgress()); + lqw.eq(StringUtils.isNotBlank(bo.getFailReason()), OpsInspectionTestTask::getFailReason, bo.getFailReason()); + lqw.eq(bo.getFailTime() != null, OpsInspectionTestTask::getFailTime, bo.getFailTime()); + lqw.eq(bo.getFailPhase() != null, OpsInspectionTestTask::getFailPhase, bo.getFailPhase()); + lqw.eq(StringUtils.isNotBlank(bo.getFaileAnalyze()), OpsInspectionTestTask::getFaileAnalyze, bo.getFaileAnalyze()); + lqw.eq(StringUtils.isNotBlank(bo.getFaileTips()), OpsInspectionTestTask::getFaileTips, bo.getFaileTips()); + lqw.eq(bo.getTestLongTime() != null, OpsInspectionTestTask::getTestLongTime, bo.getTestLongTime()); + lqw.eq(StringUtils.isNotBlank(bo.getTestFinal()), OpsInspectionTestTask::getTestFinal, bo.getTestFinal()); + lqw.eq(StringUtils.isNotBlank(bo.getFinalInfo()), OpsInspectionTestTask::getFinalInfo, bo.getFinalInfo()); + lqw.eq(StringUtils.isNotBlank(bo.getPauseFor()), OpsInspectionTestTask::getPauseFor, bo.getPauseFor()); + lqw.eq(bo.getPauseTime() != null, OpsInspectionTestTask::getPauseTime, bo.getPauseTime()); + return lqw; + } + + /** + * 新增运维-巡检-试验任务 + * + * @param bo 运维-巡检-试验任务 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(OpsInspectionTestTaskBo bo) { + OpsInspectionTestTask add = MapstructUtils.convert(bo, OpsInspectionTestTask.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改运维-巡检-试验任务 + * + * @param bo 运维-巡检-试验任务 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(OpsInspectionTestTaskBo bo) { + OpsInspectionTestTask update = MapstructUtils.convert(bo, OpsInspectionTestTask.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(OpsInspectionTestTask entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除运维-巡检-试验任务信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 处理回显信息 + */ + private void setValue(List list){ + for (OpsInspectionTestTaskVo opsInspectionTestTaskVo : list) { + if(opsInspectionTestTaskVo.getPerson()!= null){ + OpsUserVo opsUserVo = opsUserService.queryById(opsInspectionTestTaskVo.getPerson()); + if (opsUserVo != null){ + opsInspectionTestTaskVo.setPersonInfo(opsUserVo); + } + } + + + if (opsInspectionTestTaskVo.getTestPlanId() != null){ + OpsInspectionTestPlanVo opsInspectionTestPlanVo = opsInspectionTestPlanService.queryById(opsInspectionTestTaskVo.getTestPlanId()); + if (opsInspectionTestPlanVo != null){ + opsInspectionTestTaskVo.setTestPlan(opsInspectionTestPlanVo); + } + } + } + } + + + /** + * 统计记录 + */ + public R record(Long projectId){ + + LocalDate firstDay = LocalDate.now().withDayOfMonth(1); + LocalDate lastDay = firstDay.plusMonths(1).minusDays(1); + Date startDate = Date.from(firstDay.atStartOfDay(ZoneId.systemDefault()).toInstant()); + Date endDate = Date.from(lastDay.atTime(23, 59, 59).atZone(ZoneId.systemDefault()).toInstant()); + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(OpsInspectionTestTask::getProjectId,projectId); + + OpsInspectionTestTaskBo opsInspectionTestTaskBo = new OpsInspectionTestTaskBo(); + opsInspectionTestTaskBo.setProjectId(projectId); + + List list = queryList(opsInspectionTestTaskBo); + if (list==null || list.isEmpty()){ + return R.fail("没有数据"); + } + OpsInspectionTestTaskRecord record = new OpsInspectionTestTaskRecord(); + + //完成实验数 + Long finishCount = 0L; + //待分析记录 + Long failCount = 0L; + //总共完成时间 + Long totalTestTime = 0L; + + for (OpsInspectionTestTaskVo opsInspectionTestTaskVo : list) { + if (opsInspectionTestTaskVo.getPlanFinishTime().after(startDate) && opsInspectionTestTaskVo.getPlanFinishTime().before(endDate) && opsInspectionTestTaskVo.getStatus().equals("5")){ + finishCount++; + totalTestTime += opsInspectionTestTaskVo.getPlanFinishTime().getTime() - opsInspectionTestTaskVo.getPlanBeginTime().getTime(); + } + if (opsInspectionTestTaskVo.getPlanFinishTime().after(startDate) && opsInspectionTestTaskVo.getPlanFinishTime().before(endDate) && opsInspectionTestTaskVo.getStatus().equals("3")){ + failCount++; + } + } + record.setFinishCount(finishCount); + record.setFailCount(failCount); + record.setPassValue(BigDecimal.valueOf(finishCount).divide(BigDecimal.valueOf(list.size()), 2, RoundingMode.HALF_UP).multiply(new BigDecimal("100"))); + record.setAverageTestTime(totalTestTime/finishCount); + + //统计上一月的数据 + firstDay = LocalDate.now().minusMonths(1).withDayOfMonth(1); + lastDay = firstDay.plusMonths(1).minusDays(1); + Date finalEndDate = Date.from(firstDay.atStartOfDay(ZoneId.systemDefault()).toInstant()); + Date finalStartDate = Date.from(lastDay.atTime(23, 59, 59).atZone(ZoneId.systemDefault()).toInstant()); + + List lastMounth = list.stream().filter(testTaskVo -> testTaskVo.getPlanBeginTime().before(finalEndDate) && testTaskVo.getPlanFinishTime().after(finalStartDate)) + .toList(); + + //完成实验数 + finishCount = 0L; + //待分析记录 + failCount = 0L; + //总共完成时间 + totalTestTime = 0L; + + + for (OpsInspectionTestTaskVo opsInspectionTestTaskVo : lastMounth) { + if (opsInspectionTestTaskVo.getPlanFinishTime().after(startDate) && opsInspectionTestTaskVo.getPlanFinishTime().before(endDate) && opsInspectionTestTaskVo.getStatus().equals("5")){ + finishCount++; + totalTestTime += opsInspectionTestTaskVo.getPlanFinishTime().getTime() - opsInspectionTestTaskVo.getPlanBeginTime().getTime(); + } + } + + Long finishCount1 = totalTestTime/ finishCount; + //完成数增长率 + record.setFinishCountAdd(BigDecimal.valueOf(finishCount / record.getFinishCount()).multiply(new BigDecimal("100"))); + //通过率 + record.setPassValueAdd(BigDecimal.valueOf(finishCount).divide(BigDecimal.valueOf(lastMounth.size()), 2, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).divide(record.getPassValue(),2, RoundingMode.HALF_UP).multiply(new BigDecimal("100"))); + //时长增长率 + record.setAverageTestTimeAdd(BigDecimal.valueOf((totalTestTime/finishCount) / record.getAverageTestTime())); + + return R.ok(record); + } + + +}