xiang13487 3 недель назад
Родитель
Сommit
d12e5913b7
36 измененных файлов с 1881 добавлено и 0 удалено
  1. 73 0
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/manhole/MaintenanceDataStatController.java
  2. 84 0
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/manhole/MaintenanceTaskController.java
  3. 70 0
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/manhole/TerminalFaultController.java
  4. 89 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/MaintenanceDataStat.java
  5. 117 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/MaintenanceTask.java
  6. 83 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/MaintenanceTaskDetail.java
  7. 121 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/TerminalFault.java
  8. 20 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/mapper/MaintenanceDataStatMapper.java
  9. 20 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/mapper/MaintenanceTaskDetailMapper.java
  10. 20 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/mapper/MaintenanceTaskMapper.java
  11. 20 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/mapper/TerminalFaultMapper.java
  12. 40 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/MaintenanceDataStatService.java
  13. 13 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/MaintenanceTaskDetailService.java
  14. 45 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/MaintenanceTaskService.java
  15. 37 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/TerminalFaultService.java
  16. 178 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/MaintenanceDataStatServiceImpl.java
  17. 24 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/MaintenanceTaskDetailServiceImpl.java
  18. 180 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/MaintenanceTaskServiceImpl.java
  19. 116 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/TerminalFaultServiceImpl.java
  20. 27 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/in/MaintenanceDataStatQueryInDTO.java
  21. 34 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/in/MaintenanceDataStatTrendInDTO.java
  22. 68 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/in/MaintenanceTaskDispatchInDTO.java
  23. 39 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/in/MaintenanceTaskPageInDTO.java
  24. 30 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/in/MaintenanceTaskProcessInDTO.java
  25. 30 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/in/TerminalFaultHandleInDTO.java
  26. 49 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/in/TerminalFaultPageInDTO.java
  27. 30 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/out/AbnormalTerminalTrendOutDTO.java
  28. 34 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/out/CaseRateTrendOutDTO.java
  29. 18 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/out/MaintenanceDataStatOutDTO.java
  30. 18 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/out/MaintenanceTaskDetailOutDTO.java
  31. 23 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/out/MaintenanceTaskOutDTO.java
  32. 18 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/out/TerminalFaultOutDTO.java
  33. 26 0
      pipe-network-service/zksy-system/src/main/resources/mapper/MaintenanceDataStatMapper.xml
  34. 24 0
      pipe-network-service/zksy-system/src/main/resources/mapper/MaintenanceTaskDetailMapper.xml
  35. 31 0
      pipe-network-service/zksy-system/src/main/resources/mapper/MaintenanceTaskMapper.xml
  36. 32 0
      pipe-network-service/zksy-system/src/main/resources/mapper/TerminalFaultMapper.xml

+ 73 - 0
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/manhole/MaintenanceDataStatController.java

@@ -0,0 +1,73 @@
+package com.zksy.web.controller.manhole;
+
+
+import com.zksy.base.service.MaintenanceDataStatService;
+import com.zksy.common.annotation.Anonymous;
+import com.zksy.common.core.controller.BaseController;
+import com.zksy.common.core.domain.AjaxResult2;
+import com.zksy.manhole.dto.in.MaintenanceDataStatQueryInDTO;
+import com.zksy.manhole.dto.in.MaintenanceDataStatTrendInDTO;
+import com.zksy.manhole.dto.out.AbnormalTerminalTrendOutDTO;
+import com.zksy.manhole.dto.out.CaseRateTrendOutDTO;
+import com.zksy.manhole.dto.out.MaintenanceDataStatOutDTO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 窨井盖监测系统-数据统计Controller
+ * 
+ * @author xianggx
+ * @date 2026-05-06
+ */
+@RestController
+@RequestMapping("/manhole/maintenanceDataStat")
+@Api(tags = "窨井盖监测系统-数据统计")
+public class MaintenanceDataStatController extends BaseController
+{
+    @Autowired
+    private MaintenanceDataStatService maintenanceDataStatService;
+
+    /**
+     * 根据日期查询运维数据统计
+     */
+    @Anonymous
+    @PostMapping(value = "/queryByDate")
+    @ApiOperation(value = "根据日期查询运维数据统计")
+    public AjaxResult2<MaintenanceDataStatOutDTO> queryByDate(@RequestBody MaintenanceDataStatQueryInDTO queryInDTO)
+    {
+        MaintenanceDataStatOutDTO outDTO = maintenanceDataStatService.queryByDate(queryInDTO);
+        if(outDTO == null){
+            return AjaxResult2.error("该日期的统计数据不存在");
+        }
+        return AjaxResult2.success(outDTO);
+    }
+
+    /**
+     * 周度/月度 异常终端设备数量趋势分析
+     */
+    @Anonymous
+    @PostMapping(value = "/abnormalTerminalTrend")
+    @ApiOperation(value = "周度/月度 异常终端设备数量趋势分析")
+    public AjaxResult2<List<AbnormalTerminalTrendOutDTO>> abnormalTerminalTrend(@RequestBody MaintenanceDataStatTrendInDTO inDTO)
+    {
+        return AjaxResult2.success(maintenanceDataStatService.abnormalTerminalTrend(inDTO));
+    }
+
+    /**
+     * 周度/月度 案件处置率、案件延期率趋势分析
+     */
+    @Anonymous
+    @PostMapping(value = "/caseRateTrend")
+    @ApiOperation(value = "周度/月度 案件处置率、案件延期率趋势分析")
+    public AjaxResult2<List<CaseRateTrendOutDTO>> caseRateTrend(@RequestBody MaintenanceDataStatTrendInDTO inDTO)
+    {
+        return AjaxResult2.success(maintenanceDataStatService.caseRateTrend(inDTO));
+    }
+}

+ 84 - 0
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/manhole/MaintenanceTaskController.java

@@ -0,0 +1,84 @@
+package com.zksy.web.controller.manhole;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zksy.base.service.MaintenanceTaskService;
+import com.zksy.common.annotation.Anonymous;
+import com.zksy.common.core.controller.BaseController;
+import com.zksy.common.core.domain.AjaxResult;
+import com.zksy.common.core.domain.AjaxResult2;
+import com.zksy.manhole.dto.in.MaintenanceTaskDispatchInDTO;
+import com.zksy.manhole.dto.in.MaintenanceTaskPageInDTO;
+import com.zksy.manhole.dto.in.MaintenanceTaskProcessInDTO;
+import com.zksy.manhole.dto.out.MaintenanceTaskOutDTO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 窨井盖监测系统-运维任务管理Controller
+ * 
+ * @author xianggx
+ * @date 2026-05-06
+ */
+@RestController
+@RequestMapping("/manhole/maintenanceTask")
+@Api(tags = "窨井盖监测系统-运维任务管理")
+public class MaintenanceTaskController extends BaseController
+{
+    @Autowired
+    private MaintenanceTaskService maintenanceTaskService;
+
+    /**
+     * 分页查询运维任务列表
+     */
+    @Anonymous
+    @PostMapping(value = "/findByPage")
+    @ApiOperation(value = "分页查询运维任务列表")
+    public AjaxResult2<Page<MaintenanceTaskOutDTO>> findByPage(@RequestBody MaintenanceTaskPageInDTO pageInDTO)
+    {
+        return AjaxResult2.success(maintenanceTaskService.findByPage(pageInDTO));
+    }
+
+    /**
+     * 获取运维任务详情
+     */
+    @Anonymous
+    @GetMapping(value = "/getById/{id}")
+    @ApiOperation(value = "获取运维任务详情")
+    public AjaxResult2<MaintenanceTaskOutDTO> getById(@PathVariable("id") Long id)
+    {
+        MaintenanceTaskOutDTO outDTO = maintenanceTaskService.getDetailById(id);
+        if(outDTO == null){
+            return AjaxResult2.error("运维任务ID不存在");
+        }
+        return AjaxResult2.success(outDTO);
+    }
+
+    /**
+     * 批量下发运维任务
+     */
+    @Anonymous
+    @PostMapping(value = "/batchDispatch")
+    @ApiOperation(value = "批量下发运维任务")
+    public AjaxResult batchDispatch(@RequestBody MaintenanceTaskDispatchInDTO inDTO)
+    {
+        boolean result = maintenanceTaskService.batchDispatch(inDTO);
+        return result ? AjaxResult.success("下发成功", result)
+                : AjaxResult.error("下发失败", result);
+    }
+
+    /**
+     * 处理运维任务
+     */
+    @Anonymous
+    @PostMapping(value = "/processTask")
+    @ApiOperation(value = "处理运维任务")
+    public AjaxResult processTask(@RequestBody MaintenanceTaskProcessInDTO inDTO)
+    {
+        boolean result = maintenanceTaskService.processTask(inDTO);
+        return result ? AjaxResult.success("处理成功", result)
+                : AjaxResult.error("处理失败", result);
+    }
+}

+ 70 - 0
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/manhole/TerminalFaultController.java

@@ -0,0 +1,70 @@
+package com.zksy.web.controller.manhole;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zksy.base.service.TerminalFaultService;
+import com.zksy.common.annotation.Anonymous;
+import com.zksy.common.core.controller.BaseController;
+import com.zksy.common.core.domain.AjaxResult;
+import com.zksy.common.core.domain.AjaxResult2;
+import com.zksy.manhole.dto.in.TerminalFaultHandleInDTO;
+import com.zksy.manhole.dto.in.TerminalFaultPageInDTO;
+import com.zksy.manhole.dto.out.TerminalFaultOutDTO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 窨井盖监测系统-故障管理Controller
+ * 
+ * @author xianggx
+ * @date 2026-05-06
+ */
+@RestController
+@RequestMapping("/manhole/terminalFault")
+@Api(tags = "窨井盖监测系统-故障管理")
+public class TerminalFaultController extends BaseController
+{
+    @Autowired
+    private TerminalFaultService terminalFaultService;
+
+    /**
+     * 分页查询终端故障列表
+     */
+    @Anonymous
+    @PostMapping(value = "/findByPage")
+    @ApiOperation(value = "分页查询终端故障列表")
+    public AjaxResult2<Page<TerminalFaultOutDTO>> findByPage(@RequestBody TerminalFaultPageInDTO pageInDTO)
+    {
+        return AjaxResult2.success(terminalFaultService.findByPage(pageInDTO));
+    }
+
+    /**
+     * 获取终端故障详情
+     */
+    @Anonymous
+    @GetMapping(value = "/getById/{id}")
+    @ApiOperation(value = "获取终端故障详情")
+    public AjaxResult2<TerminalFaultOutDTO> getById(@PathVariable("id") Long id)
+    {
+        TerminalFaultOutDTO outDTO = terminalFaultService.getDetailById(id);
+        if(outDTO == null){
+            return AjaxResult2.error("故障ID不存在");
+        }
+        return AjaxResult2.success(outDTO);
+    }
+
+    /**
+     * 处置终端故障
+     */
+    @Anonymous
+    @PostMapping(value = "/handleFault")
+    @ApiOperation(value = "处置终端故障")
+    public AjaxResult handleFault(@RequestBody TerminalFaultHandleInDTO inDTO)
+    {
+        boolean result = terminalFaultService.handleFault(inDTO);
+        return result ? AjaxResult.success("处置成功", result)
+                : AjaxResult.error("处置失败", result);
+    }
+}

+ 89 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/MaintenanceDataStat.java

@@ -0,0 +1,89 @@
+package com.zksy.base.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 运维数据统计表
+ * @TableName maintenance_data_stat
+ */
+@TableName(value ="maintenance_data_stat")
+@Data
+@ApiModel(value = "运维数据统计入参", description = "运维数据统计入参")
+public class MaintenanceDataStat implements Serializable {
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 统计ID
+     */
+    @ApiModelProperty(value = "统计ID")
+    @TableId(type = IdType.AUTO)
+    private Long statId;
+
+    /**
+     * 统计日期(唯一索引)
+     */
+    @ApiModelProperty(value = "统计日期")
+    private Date statDate;
+
+    /**
+     * 所属运维部门ID
+     */
+    @ApiModelProperty(value = "所属运维部门ID")
+    private Long deptId;
+
+    /**
+     * 终端设备总数
+     */
+    @ApiModelProperty(value = "终端设备总数")
+    private Integer totalTerminal;
+
+    /**
+     * 异常终端设备数量
+     */
+    @ApiModelProperty(value = "异常终端设备数量")
+    private Integer abnormalTerminal;
+
+    /**
+     * 案件总数
+     */
+    @ApiModelProperty(value = "案件总数")
+    private Integer totalCase;
+
+    /**
+     * 案件处置率(%)
+     */
+    @ApiModelProperty(value = "案件处置率(%)")
+    private BigDecimal caseDisposalRate;
+
+    /**
+     * 案件延期率(%)
+     */
+    @ApiModelProperty(value = "案件延期率(%)")
+    private BigDecimal caseDelayRate;
+
+    /**
+     * 平均处置时长(小时)
+     */
+    @ApiModelProperty(value = "平均处置时长(小时)")
+    private BigDecimal avgDisposalTime;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date createTime;
+}

+ 117 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/MaintenanceTask.java

@@ -0,0 +1,117 @@
+package com.zksy.base.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 运维任务主表
+ * @TableName maintenance_task
+ */
+@TableName(value ="maintenance_task")
+@Data
+@ApiModel(value = "运维任务入参", description = "运维任务入参")
+public class MaintenanceTask implements Serializable {
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 运维任务ID
+     */
+    @ApiModelProperty(value = "运维任务ID")
+    @TableId(type = IdType.AUTO)
+    private Long taskId;
+
+    /**
+     * 任务编号(唯一索引,格式:TS+年月日+流水号)
+     */
+    @ApiModelProperty(value = "任务编号")
+    private String taskNo;
+
+    /**
+     * 所属施工单位/运维部门ID
+     */
+    @ApiModelProperty(value = "运维部门ID")
+    private Long deptId;
+
+    /**
+     * 派单人ID
+     */
+    @ApiModelProperty(value = "派单人ID")
+    private Long dispatchUserId;
+
+    /**
+     * 接收维护人员ID
+     */
+    @ApiModelProperty(value = "接收维护人员ID")
+    private Long receiveUserId;
+
+    /**
+     * 任务详细描述
+     */
+    @ApiModelProperty(value = "任务详细描述")
+    private String taskDesc;
+
+    /**
+     * 任务优先级:1-严重 2-一般
+     */
+    @ApiModelProperty(value = "任务优先级:1-严重 2-一般")
+    private Integer taskLevel;
+
+    /**
+     * 任务状态:1-待下发 2-待接收 3-处理中 4-待验收 5-已完成 6-已驳回 7-已延期
+     */
+    @ApiModelProperty(value = "任务状态:1-待下发 2-待接收 3-处理中 4-待验收 5-已完成 6-已驳回 7-已延期")
+    private Integer taskStatus;
+
+    /**
+     * 计划开始时间
+     */
+    @ApiModelProperty(value = "计划开始时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date planStartTime;
+
+    /**
+     * 计划结束时间
+     */
+    @ApiModelProperty(value = "计划结束时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date planEndTime;
+
+    /**
+     * 实际开始时间
+     */
+    @ApiModelProperty(value = "实际开始时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date realStartTime;
+
+    /**
+     * 实际结束时间
+     */
+    @ApiModelProperty(value = "实际结束时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date realEndTime;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date updateTime;
+}

+ 83 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/MaintenanceTaskDetail.java

@@ -0,0 +1,83 @@
+package com.zksy.base.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 运维任务明细表
+ * @TableName maintenance_task_detail
+ */
+@TableName(value ="maintenance_task_detail")
+@Data
+@ApiModel(value = "运维任务明细入参", description = "运维任务明细入参")
+public class MaintenanceTaskDetail implements Serializable {
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 运维任务明细ID
+     */
+    @ApiModelProperty(value = "运维任务明细ID")
+    @TableId(type = IdType.AUTO)
+    private Long detailId;
+
+    /**
+     * 关联运维任务ID
+     */
+    @ApiModelProperty(value = "关联运维任务ID")
+    private Long taskId;
+
+    /**
+     * 设备ID
+     */
+    @ApiModelProperty(value = "设备ID")
+    private String deviceId;
+
+    /**
+     * 设备编码
+     */
+    @ApiModelProperty(value = "设备编码")
+    private String deviceCode;
+
+    /**
+     * 关联报警ID
+     */
+    @ApiModelProperty(value = "关联报警ID")
+    private String alarmId;
+
+    /**
+     * 报警描述
+     */
+    @ApiModelProperty(value = "报警描述")
+    private String alarmDesc;
+
+    /**
+     * 明细状态:1-待处理 2-处理中 3-已完成 4-已驳回
+     */
+    @ApiModelProperty(value = "明细状态:1-待处理 2-处理中 3-已完成 4-已驳回")
+    private Integer detailStatus;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date updateTime;
+}

+ 121 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/TerminalFault.java

@@ -0,0 +1,121 @@
+package com.zksy.base.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 终端故障表
+ * @TableName terminal_fault
+ */
+@TableName(value ="terminal_fault")
+@Data
+@ApiModel(value = "终端故障入参", description = "终端故障入参")
+public class TerminalFault implements Serializable {
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 故障ID
+     */
+    @ApiModelProperty(value = "故障ID")
+    @TableId(type = IdType.AUTO)
+    private Long faultId;
+
+    /**
+     * 故障编号(唯一索引,格式:FT+年月日+流水号)
+     */
+    @ApiModelProperty(value = "故障编号")
+    private String faultNo;
+
+    /**
+     * 关联终端设备ID
+     */
+    @ApiModelProperty(value = "关联终端设备ID")
+    private String deviceId;
+
+    /**
+     * 设备编码
+     */
+    @ApiModelProperty(value = "设备编码")
+    private String deviceCode;
+
+    /**
+     * 关联报警ID
+     */
+    @ApiModelProperty(value = "关联报警ID")
+    private String alarmId;
+
+    /**
+     * 故障等级:1-严重 2-一般
+     */
+    @ApiModelProperty(value = "故障等级:1-严重 2-一般")
+    private Integer faultLevel;
+
+    /**
+     * 故障详细描述
+     */
+    @ApiModelProperty(value = "故障详细描述")
+    private String faultDesc;
+
+    /**
+     * 故障来源:1-设备报警 2-人工上报 3-巡检发现
+     */
+    @ApiModelProperty(value = "故障来源:1-设备报警 2-人工上报 3-巡检发现")
+    private Integer faultSource;
+
+    /**
+     * 故障状态:1-未处理 2-处理中 3-已修复 4-已返厂 5-已报废
+     */
+    @ApiModelProperty(value = "故障状态:1-未处理 2-处理中 3-已修复 4-已返厂 5-已报废")
+    private Integer faultStatus;
+
+    /**
+     * 故障发生时间
+     */
+    @ApiModelProperty(value = "故障发生时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date happenTime;
+
+    /**
+     * 处理人ID
+     */
+    @ApiModelProperty(value = "处理人ID")
+    private Long handleUserId;
+
+    /**
+     * 处理完成时间
+     */
+    @ApiModelProperty(value = "处理完成时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date handleTime;
+
+    /**
+     * 最终处理结果
+     */
+    @ApiModelProperty(value = "最终处理结果")
+    private String handleResult;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date updateTime;
+}

+ 20 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/mapper/MaintenanceDataStatMapper.java

@@ -0,0 +1,20 @@
+package com.zksy.base.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zksy.base.domain.MaintenanceDataStat;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @author Administrator
+* @description 针对表【maintenance_data_stat(运维数据统计表)】的数据库操作Mapper
+* @createDate 2026-06-26 14:11:51
+* @Entity com.zksy.base.domain.MaintenanceDataStat
+*/
+@Mapper
+public interface MaintenanceDataStatMapper extends BaseMapper<MaintenanceDataStat> {
+
+}
+
+
+
+

+ 20 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/mapper/MaintenanceTaskDetailMapper.java

@@ -0,0 +1,20 @@
+package com.zksy.base.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zksy.base.domain.MaintenanceTaskDetail;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @author Administrator
+* @description 针对表【maintenance_task_detail(运维任务明细表)】的数据库操作Mapper
+* @createDate 2026-06-26 14:11:51
+* @Entity com.zksy.base.domain.MaintenanceTaskDetail
+*/
+@Mapper
+public interface MaintenanceTaskDetailMapper extends BaseMapper<MaintenanceTaskDetail> {
+
+}
+
+
+
+

+ 20 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/mapper/MaintenanceTaskMapper.java

@@ -0,0 +1,20 @@
+package com.zksy.base.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zksy.base.domain.MaintenanceTask;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @author Administrator
+* @description 针对表【maintenance_task(运维任务主表)】的数据库操作Mapper
+* @createDate 2026-06-26 14:11:51
+* @Entity com.zksy.base.domain.MaintenanceTask
+*/
+@Mapper
+public interface MaintenanceTaskMapper extends BaseMapper<MaintenanceTask> {
+
+}
+
+
+
+

+ 20 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/mapper/TerminalFaultMapper.java

@@ -0,0 +1,20 @@
+package com.zksy.base.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zksy.base.domain.TerminalFault;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @author Administrator
+* @description 针对表【terminal_fault(终端故障表)】的数据库操作Mapper
+* @createDate 2026-06-26 14:36:18
+* @Entity com.zksy.base.domain.TerminalFault
+*/
+@Mapper
+public interface TerminalFaultMapper extends BaseMapper<TerminalFault> {
+
+}
+
+
+
+

+ 40 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/MaintenanceDataStatService.java

@@ -0,0 +1,40 @@
+package com.zksy.base.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zksy.base.domain.MaintenanceDataStat;
+import com.zksy.manhole.dto.in.MaintenanceDataStatQueryInDTO;
+import com.zksy.manhole.dto.in.MaintenanceDataStatTrendInDTO;
+import com.zksy.manhole.dto.out.AbnormalTerminalTrendOutDTO;
+import com.zksy.manhole.dto.out.CaseRateTrendOutDTO;
+import com.zksy.manhole.dto.out.MaintenanceDataStatOutDTO;
+
+import java.util.List;
+
+/**
+* @author Administrator
+* @description 针对表【maintenance_data_stat(运维数据统计表)】的数据库操作Service
+* @createDate 2026-06-26 14:11:51
+*/
+public interface MaintenanceDataStatService extends IService<MaintenanceDataStat> {
+
+    /**
+     * 根据日期查询运维数据统计
+     * @param queryInDTO
+     * @return
+     */
+    MaintenanceDataStatOutDTO queryByDate(MaintenanceDataStatQueryInDTO queryInDTO);
+
+    /**
+     * 周度/月度 异常终端设备数量趋势分析
+     * @param inDTO
+     * @return
+     */
+    List<AbnormalTerminalTrendOutDTO> abnormalTerminalTrend(MaintenanceDataStatTrendInDTO inDTO);
+
+    /**
+     * 周度/月度 案件处置率、案件延期率趋势分析
+     * @param inDTO
+     * @return
+     */
+    List<CaseRateTrendOutDTO> caseRateTrend(MaintenanceDataStatTrendInDTO inDTO);
+}

+ 13 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/MaintenanceTaskDetailService.java

@@ -0,0 +1,13 @@
+package com.zksy.base.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zksy.base.domain.MaintenanceTaskDetail;
+
+/**
+* @author Administrator
+* @description 针对表【maintenance_task_detail(运维任务明细表)】的数据库操作Service
+* @createDate 2026-06-26 14:11:51
+*/
+public interface MaintenanceTaskDetailService extends IService<MaintenanceTaskDetail> {
+
+}

+ 45 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/MaintenanceTaskService.java

@@ -0,0 +1,45 @@
+package com.zksy.base.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zksy.base.domain.MaintenanceTask;
+import com.zksy.manhole.dto.in.MaintenanceTaskDispatchInDTO;
+import com.zksy.manhole.dto.in.MaintenanceTaskPageInDTO;
+import com.zksy.manhole.dto.in.MaintenanceTaskProcessInDTO;
+import com.zksy.manhole.dto.out.MaintenanceTaskOutDTO;
+
+/**
+* @author Administrator
+* @description 针对表【maintenance_task(运维任务主表)】的数据库操作Service
+* @createDate 2026-06-26 14:11:51
+*/
+public interface MaintenanceTaskService extends IService<MaintenanceTask> {
+
+    /**
+     * 分页查询运维任务列表
+     * @param pageInDTO
+     * @return
+     */
+    Page<MaintenanceTaskOutDTO> findByPage(MaintenanceTaskPageInDTO pageInDTO);
+
+    /**
+     * 获取运维任务详情
+     * @param taskId
+     * @return
+     */
+    MaintenanceTaskOutDTO getDetailById(Long taskId);
+
+    /**
+     * 批量下发运维任务
+     * @param inDTO
+     * @return
+     */
+    boolean batchDispatch(MaintenanceTaskDispatchInDTO inDTO);
+
+    /**
+     * 处理运维任务
+     * @param inDTO
+     * @return
+     */
+    boolean processTask(MaintenanceTaskProcessInDTO inDTO);
+}

+ 37 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/TerminalFaultService.java

@@ -0,0 +1,37 @@
+package com.zksy.base.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zksy.base.domain.TerminalFault;
+import com.zksy.manhole.dto.in.TerminalFaultHandleInDTO;
+import com.zksy.manhole.dto.in.TerminalFaultPageInDTO;
+import com.zksy.manhole.dto.out.TerminalFaultOutDTO;
+
+/**
+* @author Administrator
+* @description 针对表【terminal_fault(终端故障表)】的数据库操作Service
+* @createDate 2026-06-26 14:36:18
+*/
+public interface TerminalFaultService extends IService<TerminalFault> {
+
+    /**
+     * 分页查询终端故障列表
+     * @param pageInDTO
+     * @return
+     */
+    Page<TerminalFaultOutDTO> findByPage(TerminalFaultPageInDTO pageInDTO);
+
+    /**
+     * 获取终端故障详情
+     * @param faultId
+     * @return
+     */
+    TerminalFaultOutDTO getDetailById(Long faultId);
+
+    /**
+     * 处置终端故障
+     * @param inDTO
+     * @return
+     */
+    boolean handleFault(TerminalFaultHandleInDTO inDTO);
+}

+ 178 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/MaintenanceDataStatServiceImpl.java

@@ -0,0 +1,178 @@
+package com.zksy.base.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zksy.base.domain.MaintenanceDataStat;
+import com.zksy.base.mapper.MaintenanceDataStatMapper;
+import com.zksy.base.service.MaintenanceDataStatService;
+import com.zksy.common.exception.ServiceException;
+import com.zksy.manhole.dto.in.MaintenanceDataStatQueryInDTO;
+import com.zksy.manhole.dto.in.MaintenanceDataStatTrendInDTO;
+import com.zksy.manhole.dto.out.AbnormalTerminalTrendOutDTO;
+import com.zksy.manhole.dto.out.CaseRateTrendOutDTO;
+import com.zksy.manhole.dto.out.MaintenanceDataStatOutDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.WeekFields;
+import java.util.*;
+
+/**
+* @author Administrator
+* @description 针对表【maintenance_data_stat(运维数据统计表)】的数据库操作Service实现
+* @createDate 2026-06-26 14:11:51
+*/
+@Slf4j
+@Service
+public class MaintenanceDataStatServiceImpl extends ServiceImpl<MaintenanceDataStatMapper, MaintenanceDataStat>
+    implements MaintenanceDataStatService{
+
+    /**
+     * 根据日期查询运维数据统计
+     * @param queryInDTO
+     * @return
+     */
+    @Override
+    public MaintenanceDataStatOutDTO queryByDate(MaintenanceDataStatQueryInDTO queryInDTO) {
+        log.info("根据日期查询运维数据统计-入参:{}", queryInDTO);
+        LambdaQueryWrapper<MaintenanceDataStat> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(queryInDTO.getStatDate() != null, MaintenanceDataStat::getStatDate, queryInDTO.getStatDate())
+                .eq(queryInDTO.getDeptId() != null, MaintenanceDataStat::getDeptId, queryInDTO.getDeptId());
+        MaintenanceDataStat stat = this.getOne(queryWrapper);
+        if(stat == null){
+            return null;
+        }
+        return BeanUtil.copyProperties(stat, MaintenanceDataStatOutDTO.class);
+    }
+
+    /**
+     * 周度/月度 异常终端设备数量趋势分析
+     * @param inDTO
+     * @return
+     */
+    @Override
+    public List<AbnormalTerminalTrendOutDTO> abnormalTerminalTrend(MaintenanceDataStatTrendInDTO inDTO) {
+        log.info("周度/月度 异常终端设备数量趋势分析-入参:{}", inDTO);
+        List<MaintenanceDataStat> statList = queryStatList(inDTO);
+        if(CollUtil.isEmpty(statList)){
+            return new ArrayList<>();
+        }
+        // 按周度/月度分组
+        Map<String, List<MaintenanceDataStat>> groupedMap = groupByPeriod(statList, inDTO.getTrendType());
+        List<AbnormalTerminalTrendOutDTO> result = new ArrayList<>();
+        for(Map.Entry<String, List<MaintenanceDataStat>> entry : groupedMap.entrySet()){
+            List<MaintenanceDataStat> periodList = entry.getValue();
+            AbnormalTerminalTrendOutDTO outDTO = new AbnormalTerminalTrendOutDTO();
+            outDTO.setTrendLabel(entry.getKey());
+            // 取该周期内第一条记录的统计日期作为代表日期
+            outDTO.setStatDate(periodList.get(0).getStatDate());
+            // 计算平均异常终端设备数量
+            double avgAbnormal = periodList.stream()
+                    .filter(s -> s.getAbnormalTerminal() != null)
+                    .mapToInt(MaintenanceDataStat::getAbnormalTerminal)
+                    .average()
+                    .orElse(0);
+            outDTO.setAbnormalTerminal((int) Math.round(avgAbnormal));
+            result.add(outDTO);
+        }
+        // 按趋势标签排序
+        result.sort(Comparator.comparing(AbnormalTerminalTrendOutDTO::getTrendLabel));
+        return result;
+    }
+
+    /**
+     * 周度/月度 案件处置率、案件延期率趋势分析
+     * @param inDTO
+     * @return
+     */
+    @Override
+    public List<CaseRateTrendOutDTO> caseRateTrend(MaintenanceDataStatTrendInDTO inDTO) {
+        log.info("周度/月度 案件处置率/延期率趋势分析-入参:{}", inDTO);
+        List<MaintenanceDataStat> statList = queryStatList(inDTO);
+        if(CollUtil.isEmpty(statList)){
+            return new ArrayList<>();
+        }
+        // 按周度/月度分组
+        Map<String, List<MaintenanceDataStat>> groupedMap = groupByPeriod(statList, inDTO.getTrendType());
+        List<CaseRateTrendOutDTO> result = new ArrayList<>();
+        for(Map.Entry<String, List<MaintenanceDataStat>> entry : groupedMap.entrySet()){
+            List<MaintenanceDataStat> periodList = entry.getValue();
+            CaseRateTrendOutDTO outDTO = new CaseRateTrendOutDTO();
+            outDTO.setTrendLabel(entry.getKey());
+            outDTO.setStatDate(periodList.get(0).getStatDate());
+            // 计算平均案件处置率
+            double avgDisposalRate = periodList.stream()
+                    .filter(s -> s.getCaseDisposalRate() != null)
+                    .mapToDouble(s -> s.getCaseDisposalRate().doubleValue())
+                    .average()
+                    .orElse(0);
+            outDTO.setCaseDisposalRate(BigDecimal.valueOf(avgDisposalRate).setScale(2, RoundingMode.HALF_UP));
+            // 计算平均案件延期率
+            double avgDelayRate = periodList.stream()
+                    .filter(s -> s.getCaseDelayRate() != null)
+                    .mapToDouble(s -> s.getCaseDelayRate().doubleValue())
+                    .average()
+                    .orElse(0);
+            outDTO.setCaseDelayRate(BigDecimal.valueOf(avgDelayRate).setScale(2, RoundingMode.HALF_UP));
+            result.add(outDTO);
+        }
+        // 按趋势标签排序
+        result.sort(Comparator.comparing(CaseRateTrendOutDTO::getTrendLabel));
+        return result;
+    }
+
+    /**
+     * 查询统计数据列表(公共方法)
+     * @param inDTO
+     * @return
+     */
+    private List<MaintenanceDataStat> queryStatList(MaintenanceDataStatTrendInDTO inDTO) {
+        if(inDTO.getTrendType() == null){
+            throw new ServiceException("趋势类型不能为空");
+        }
+        LambdaQueryWrapper<MaintenanceDataStat> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.ge(inDTO.getStartDate() != null, MaintenanceDataStat::getStatDate, inDTO.getStartDate())
+                .le(inDTO.getEndDate() != null, MaintenanceDataStat::getStatDate, inDTO.getEndDate())
+                .eq(inDTO.getDeptId() != null, MaintenanceDataStat::getDeptId, inDTO.getDeptId())
+                .orderByAsc(MaintenanceDataStat::getStatDate);
+        return this.list(queryWrapper);
+    }
+
+    /**
+     * 按周度/月度分组
+     * @param statList
+     * @param trendType 1-周度 2-月度
+     * @return
+     */
+    private Map<String, List<MaintenanceDataStat>> groupByPeriod(List<MaintenanceDataStat> statList, Integer trendType) {
+        Map<String, List<MaintenanceDataStat>> groupedMap = new LinkedHashMap<>();
+        WeekFields weekFields = WeekFields.of(Locale.getDefault());
+        DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("yyyy-MM");
+        for(MaintenanceDataStat stat : statList){
+            LocalDate localDate = stat.getStatDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+            String key;
+            if(trendType == 1){
+                // 周度:yyyy-Www
+                int weekYear = localDate.get(weekFields.weekBasedYear());
+                int weekNum = localDate.get(weekFields.weekOfWeekBasedYear());
+                key = String.format("%d-W%02d", weekYear, weekNum);
+            } else {
+                // 月度:yyyy-MM
+                key = localDate.format(monthFormatter);
+            }
+            groupedMap.computeIfAbsent(key, k -> new ArrayList<>()).add(stat);
+        }
+        return groupedMap;
+    }
+}
+
+
+
+

+ 24 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/MaintenanceTaskDetailServiceImpl.java

@@ -0,0 +1,24 @@
+package com.zksy.base.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zksy.base.domain.MaintenanceTaskDetail;
+import com.zksy.base.mapper.MaintenanceTaskDetailMapper;
+import com.zksy.base.service.MaintenanceTaskDetailService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+* @author Administrator
+* @description 针对表【maintenance_task_detail(运维任务明细表)】的数据库操作Service实现
+* @createDate 2026-06-26 14:11:51
+*/
+@Slf4j
+@Service
+public class MaintenanceTaskDetailServiceImpl extends ServiceImpl<MaintenanceTaskDetailMapper, MaintenanceTaskDetail>
+    implements MaintenanceTaskDetailService{
+
+}
+
+
+
+

+ 180 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/MaintenanceTaskServiceImpl.java

@@ -0,0 +1,180 @@
+package com.zksy.base.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zksy.base.domain.MaintenanceTask;
+import com.zksy.base.domain.MaintenanceTaskDetail;
+import com.zksy.base.mapper.MaintenanceTaskMapper;
+import com.zksy.base.service.MaintenanceTaskDetailService;
+import com.zksy.base.service.MaintenanceTaskService;
+import com.zksy.common.exception.ServiceException;
+import com.zksy.manhole.dto.in.MaintenanceTaskDispatchInDTO;
+import com.zksy.manhole.dto.in.MaintenanceTaskPageInDTO;
+import com.zksy.manhole.dto.in.MaintenanceTaskProcessInDTO;
+import com.zksy.manhole.dto.out.MaintenanceTaskDetailOutDTO;
+import com.zksy.manhole.dto.out.MaintenanceTaskOutDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Random;
+
+/**
+* @author Administrator
+* @description 针对表【maintenance_task(运维任务主表)】的数据库操作Service实现
+* @createDate 2026-06-26 14:11:51
+*/
+@Slf4j
+@Service
+public class MaintenanceTaskServiceImpl extends ServiceImpl<MaintenanceTaskMapper, MaintenanceTask>
+    implements MaintenanceTaskService{
+
+    @Autowired
+    private MaintenanceTaskDetailService maintenanceTaskDetailService;
+
+    /**
+     * 分页查询运维任务列表
+     * @param pageInDTO
+     * @return
+     */
+    @Override
+    public Page<MaintenanceTaskOutDTO> findByPage(MaintenanceTaskPageInDTO pageInDTO) {
+        log.info("分页查询运维任务列表-入参:{}", pageInDTO);
+        Page<MaintenanceTask> page = new Page<>(pageInDTO.getPageNum(), pageInDTO.getPageSize());
+        LambdaQueryWrapper<MaintenanceTask> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.like(StringUtils.isNotEmpty(pageInDTO.getTaskNo()), MaintenanceTask::getTaskNo, pageInDTO.getTaskNo())
+                .eq(pageInDTO.getDeptId() != null, MaintenanceTask::getDeptId, pageInDTO.getDeptId())
+                .eq(pageInDTO.getReceiveUserId() != null, MaintenanceTask::getReceiveUserId, pageInDTO.getReceiveUserId())
+                .eq(pageInDTO.getTaskLevel() != null, MaintenanceTask::getTaskLevel, pageInDTO.getTaskLevel())
+                .eq(pageInDTO.getTaskStatus() != null, MaintenanceTask::getTaskStatus, pageInDTO.getTaskStatus())
+                .orderByDesc(MaintenanceTask::getUpdateTime);
+        Page<MaintenanceTask> rs = this.page(page, queryWrapper);
+        List<MaintenanceTaskOutDTO> outDTOList = BeanUtil.copyToList(rs.getRecords(), MaintenanceTaskOutDTO.class);
+        Page<MaintenanceTaskOutDTO> outPage = new Page<>(pageInDTO.getPageNum(), pageInDTO.getPageSize(), rs.getTotal());
+        outPage.setRecords(outDTOList);
+        return outPage;
+    }
+
+    /**
+     * 获取运维任务详情
+     * @param taskId
+     * @return
+     */
+    @Override
+    public MaintenanceTaskOutDTO getDetailById(Long taskId) {
+        log.info("获取运维任务详情-入参:{}", taskId);
+        MaintenanceTask maintenanceTask = this.getById(taskId);
+        if(maintenanceTask == null){
+            return null;
+        }
+        MaintenanceTaskOutDTO outDTO = BeanUtil.copyProperties(maintenanceTask, MaintenanceTaskOutDTO.class);
+        // 查询运维任务明细列表
+        List<MaintenanceTaskDetail> detailList = maintenanceTaskDetailService.list(new LambdaQueryWrapper<MaintenanceTaskDetail>()
+                .eq(MaintenanceTaskDetail::getTaskId, taskId)
+                .orderByAsc(MaintenanceTaskDetail::getCreateTime));
+        if(CollUtil.isNotEmpty(detailList)){
+            List<MaintenanceTaskDetailOutDTO> detailOutDTOList = BeanUtil.copyToList(detailList, MaintenanceTaskDetailOutDTO.class);
+            outDTO.setDetailList(detailOutDTOList);
+        }
+        return outDTO;
+    }
+
+    /**
+     * 批量下发运维任务(新增运维任务主表 + 明细表)
+     * @param inDTO
+     * @return
+     */
+    @Override
+    public boolean batchDispatch(MaintenanceTaskDispatchInDTO inDTO) {
+        log.info("批量下发运维任务-入参:{}", inDTO);
+        if(inDTO.getDispatchUserId() == null){
+            throw new ServiceException("派单人ID不能为空");
+        }
+        if(inDTO.getReceiveUserId() == null){
+            throw new ServiceException("接收维护人员ID不能为空");
+        }
+        List<MaintenanceTaskDispatchInDTO.DispatchDetailInDTO> detailList = inDTO.getDetailList();
+        if(CollUtil.isEmpty(detailList)){
+            throw new ServiceException("设备报警明细列表不能为空");
+        }
+        // 新增运维任务主表
+        MaintenanceTask task = BeanUtil.copyProperties(inDTO, MaintenanceTask.class);
+        task.setTaskNo(generateTaskNo());
+        // 初始状态:2-待接收
+        task.setTaskStatus(2);
+        this.save(task);
+        // 批量新增运维任务明细表
+        List<MaintenanceTaskDetail> taskDetailList = new ArrayList<>();
+        for(MaintenanceTaskDispatchInDTO.DispatchDetailInDTO detailInDTO : detailList){
+            MaintenanceTaskDetail detail = BeanUtil.copyProperties(detailInDTO, MaintenanceTaskDetail.class);
+            detail.setTaskId(task.getTaskId());
+            // 明细初始状态:1-待处理
+            detail.setDetailStatus(1);
+            taskDetailList.add(detail);
+        }
+        return maintenanceTaskDetailService.saveBatch(taskDetailList);
+    }
+
+    /**
+     * 生成运维任务编号
+     * @return
+     */
+    public static String generateTaskNo() {
+        // 1. 获取当前时间,格式为14位年月日时分秒
+        String currentDateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
+        // 2. 生成4位随机数,不足补0
+        String randomNum = String.format("%04d", new Random().nextInt(10000));
+        // 3. 拼接完整编号:TS+年月日时分秒+随机数
+        return "TS" + currentDateTime + randomNum;
+    }
+
+    /**
+     * 处理运维任务
+     * @param inDTO
+     * @return
+     */
+    @Override
+    public boolean processTask(MaintenanceTaskProcessInDTO inDTO) {
+        log.info("处理运维任务-入参:{}", inDTO);
+        MaintenanceTask task = this.getById(inDTO.getTaskId());
+        if(task == null){
+            throw new ServiceException("运维任务ID不存在");
+        }
+        if(inDTO.getProcessType() == null){
+            throw new ServiceException("处理类型不能为空");
+        }
+        MaintenanceTask entity = new MaintenanceTask();
+        entity.setTaskId(inDTO.getTaskId());
+        if(inDTO.getProcessType() == 1){
+            // 1-接收任务:待接收 -> 处理中
+            entity.setTaskStatus(3);
+            entity.setRealStartTime(new Date());
+        } else if(inDTO.getProcessType() == 2){
+            // 2-提交验收:处理中 -> 待验收
+            entity.setTaskStatus(4);
+        } else if(inDTO.getProcessType() == 3){
+            // 3-验收通过:待验收 -> 已完成
+            entity.setTaskStatus(5);
+            entity.setRealEndTime(new Date());
+        } else if(inDTO.getProcessType() == 4){
+            // 4-驳回:待验收 -> 已驳回
+            entity.setTaskStatus(6);
+        } else {
+            throw new ServiceException("处理类型不合法");
+        }
+        return this.updateById(entity);
+    }
+}
+
+
+
+

+ 116 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/TerminalFaultServiceImpl.java

@@ -0,0 +1,116 @@
+package com.zksy.base.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zksy.base.domain.TerminalFault;
+import com.zksy.base.mapper.TerminalFaultMapper;
+import com.zksy.base.service.TerminalFaultService;
+import com.zksy.common.exception.ServiceException;
+import com.zksy.manhole.dto.in.TerminalFaultHandleInDTO;
+import com.zksy.manhole.dto.in.TerminalFaultPageInDTO;
+import com.zksy.manhole.dto.out.TerminalFaultOutDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+* @author Administrator
+* @description 针对表【terminal_fault(终端故障表)】的数据库操作Service实现
+* @createDate 2026-06-26 14:36:18
+*/
+@Slf4j
+@Service
+public class TerminalFaultServiceImpl extends ServiceImpl<TerminalFaultMapper, TerminalFault>
+    implements TerminalFaultService{
+
+    /**
+     * 分页查询终端故障列表
+     * @param pageInDTO
+     * @return
+     */
+    @Override
+    public Page<TerminalFaultOutDTO> findByPage(TerminalFaultPageInDTO pageInDTO) {
+        log.info("分页查询终端故障列表-入参:{}", pageInDTO);
+        Page<TerminalFault> page = new Page<>(pageInDTO.getPageNum(), pageInDTO.getPageSize());
+        LambdaQueryWrapper<TerminalFault> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.like(StringUtils.isNotEmpty(pageInDTO.getFaultNo()), TerminalFault::getFaultNo, pageInDTO.getFaultNo())
+                .eq(StringUtils.isNotEmpty(pageInDTO.getDeviceId()), TerminalFault::getDeviceId, pageInDTO.getDeviceId())
+                .eq(pageInDTO.getFaultLevel() != null, TerminalFault::getFaultLevel, pageInDTO.getFaultLevel())
+                .eq(pageInDTO.getFaultSource() != null, TerminalFault::getFaultSource, pageInDTO.getFaultSource())
+                .eq(pageInDTO.getFaultStatus() != null, TerminalFault::getFaultStatus, pageInDTO.getFaultStatus())
+                .ge(pageInDTO.getStartTime() != null, TerminalFault::getHappenTime, pageInDTO.getStartTime())
+                .le(pageInDTO.getEndTime() != null, TerminalFault::getHappenTime, pageInDTO.getEndTime())
+                .orderByDesc(TerminalFault::getUpdateTime);
+        Page<TerminalFault> rs = this.page(page, queryWrapper);
+        List<TerminalFaultOutDTO> outDTOList = BeanUtil.copyToList(rs.getRecords(), TerminalFaultOutDTO.class);
+        Page<TerminalFaultOutDTO> outPage = new Page<>(pageInDTO.getPageNum(), pageInDTO.getPageSize(), rs.getTotal());
+        outPage.setRecords(outDTOList);
+        return outPage;
+    }
+
+    /**
+     * 获取终端故障详情
+     * @param faultId
+     * @return
+     */
+    @Override
+    public TerminalFaultOutDTO getDetailById(Long faultId) {
+        log.info("获取终端故障详情-入参:{}", faultId);
+        TerminalFault terminalFault = this.getById(faultId);
+        if(terminalFault == null){
+            return null;
+        }
+        return BeanUtil.copyProperties(terminalFault, TerminalFaultOutDTO.class);
+    }
+
+    /**
+     * 处置终端故障
+     * @param inDTO
+     * @return
+     */
+    @Override
+    public boolean handleFault(TerminalFaultHandleInDTO inDTO) {
+        log.info("处置终端故障-入参:{}", inDTO);
+        TerminalFault fault = this.getById(inDTO.getFaultId());
+        if(fault == null){
+            throw new ServiceException("故障ID不存在");
+        }
+        if(inDTO.getHandleType() == null){
+            throw new ServiceException("处置类型不能为空");
+        }
+        TerminalFault entity = new TerminalFault();
+        entity.setFaultId(inDTO.getFaultId());
+        entity.setHandleUserId(inDTO.getHandleUserId());
+        if(inDTO.getHandleType() == 1){
+            // 1-开始处理:未处理 -> 处理中
+            entity.setFaultStatus(2);
+        } else if(inDTO.getHandleType() == 2){
+            // 2-已修复:-> 已修复
+            entity.setFaultStatus(3);
+            entity.setHandleTime(new Date());
+            entity.setHandleResult(inDTO.getHandleResult());
+        } else if(inDTO.getHandleType() == 3){
+            // 3-已返厂:-> 已返厂
+            entity.setFaultStatus(4);
+            entity.setHandleTime(new Date());
+            entity.setHandleResult(inDTO.getHandleResult());
+        } else if(inDTO.getHandleType() == 4){
+            // 4-已报废:-> 已报废
+            entity.setFaultStatus(5);
+            entity.setHandleTime(new Date());
+            entity.setHandleResult(inDTO.getHandleResult());
+        } else {
+            throw new ServiceException("处置类型不合法");
+        }
+        return this.updateById(entity);
+    }
+}
+
+
+
+

+ 27 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/in/MaintenanceDataStatQueryInDTO.java

@@ -0,0 +1,27 @@
+package com.zksy.manhole.dto.in;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 根据日期查询运维数据统计-入参
+ *
+ * @author xianggx
+ */
+@Data
+@ApiModel(value = "根据日期查询运维数据统计-入参", description = "根据日期查询运维数据统计-入参")
+public class MaintenanceDataStatQueryInDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "统计日期", required = true)
+    @JsonFormat(locale = "zh", pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date statDate;
+
+    @ApiModelProperty(value = "运维部门ID")
+    private Long deptId;
+}

+ 34 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/in/MaintenanceDataStatTrendInDTO.java

@@ -0,0 +1,34 @@
+package com.zksy.manhole.dto.in;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 周度/月度趋势分析-入参
+ *
+ * @author xianggx
+ */
+@Data
+@ApiModel(value = "周度/月度趋势分析-入参", description = "周度/月度趋势分析-入参")
+public class MaintenanceDataStatTrendInDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "趋势类型:1-周度 2-月度", required = true)
+    private Integer trendType;
+
+    @ApiModelProperty(value = "统计开始日期", required = true)
+    @JsonFormat(locale = "zh", pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date startDate;
+
+    @ApiModelProperty(value = "统计结束日期", required = true)
+    @JsonFormat(locale = "zh", pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date endDate;
+
+    @ApiModelProperty(value = "运维部门ID")
+    private Long deptId;
+}

+ 68 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/in/MaintenanceTaskDispatchInDTO.java

@@ -0,0 +1,68 @@
+package com.zksy.manhole.dto.in;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 批量下发运维任务-入参
+ *
+ * @author xianggx
+ */
+@Data
+@ApiModel(value = "批量下发运维任务-入参", description = "批量下发运维任务-入参")
+public class MaintenanceTaskDispatchInDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "运维部门ID", required = true)
+    private Long deptId;
+
+    @ApiModelProperty(value = "派单人ID", required = true)
+    private Long dispatchUserId;
+
+    @ApiModelProperty(value = "接收维护人员ID", required = true)
+    private Long receiveUserId;
+
+    @ApiModelProperty(value = "任务详细描述", required = true)
+    private String taskDesc;
+
+    @ApiModelProperty(value = "任务优先级:1-严重 2-一般", required = true)
+    private Integer taskLevel;
+
+    @ApiModelProperty(value = "计划开始时间")
+    @JsonFormat(locale = "zh", pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date planStartTime;
+
+    @ApiModelProperty(value = "计划结束时间")
+    @JsonFormat(locale = "zh", pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date planEndTime;
+
+    @ApiModelProperty(value = "设备报警明细列表", required = true)
+    private List<DispatchDetailInDTO> detailList;
+
+    /**
+     * 设备报警明细-入参
+     */
+    @Data
+    @ApiModel(value = "设备报警明细-入参", description = "设备报警明细-入参")
+    public static class DispatchDetailInDTO implements Serializable {
+        private static final long serialVersionUID = 1L;
+
+        @ApiModelProperty(value = "设备ID", required = true)
+        private String deviceId;
+
+        @ApiModelProperty(value = "设备编码")
+        private String deviceCode;
+
+        @ApiModelProperty(value = "关联报警ID")
+        private String alarmId;
+
+        @ApiModelProperty(value = "报警描述")
+        private String alarmDesc;
+    }
+}

+ 39 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/in/MaintenanceTaskPageInDTO.java

@@ -0,0 +1,39 @@
+package com.zksy.manhole.dto.in;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 分页查询运维任务列表-入参
+ *
+ * @author xianggx
+ */
+@Data
+@ApiModel(value = "分页查询运维任务列表-入参", description = "分页查询运维任务列表-入参")
+public class MaintenanceTaskPageInDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "任务编号")
+    private String taskNo;
+
+    @ApiModelProperty(value = "运维部门ID")
+    private Long deptId;
+
+    @ApiModelProperty(value = "接收维护人员ID")
+    private Long receiveUserId;
+
+    @ApiModelProperty(value = "任务优先级:1-严重 2-一般")
+    private Integer taskLevel;
+
+    @ApiModelProperty(value = "任务状态:1-待下发 2-待接收 3-处理中 4-待验收 5-已完成 6-已驳回 7-已延期")
+    private Integer taskStatus;
+
+    @ApiModelProperty(value = "当前记录起始索引", required = true)
+    private Long pageNum;
+
+    @ApiModelProperty(value = "每页显示记录数", required = true)
+    private Long pageSize;
+}

+ 30 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/in/MaintenanceTaskProcessInDTO.java

@@ -0,0 +1,30 @@
+package com.zksy.manhole.dto.in;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 处理运维任务-入参
+ *
+ * @author xianggx
+ */
+@Data
+@ApiModel(value = "处理运维任务-入参", description = "处理运维任务-入参")
+public class MaintenanceTaskProcessInDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "运维任务ID", required = true)
+    private Long taskId;
+
+    @ApiModelProperty(value = "处理类型:1-接收任务 2-提交验收 3-验收通过 4-驳回", required = true)
+    private Integer processType;
+
+    @ApiModelProperty(value = "处理描述", required = true)
+    private String processDesc;
+
+    @ApiModelProperty(value = "操作人ID", required = true)
+    private Long operUserId;
+}

+ 30 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/in/TerminalFaultHandleInDTO.java

@@ -0,0 +1,30 @@
+package com.zksy.manhole.dto.in;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 处置终端故障-入参
+ *
+ * @author xianggx
+ */
+@Data
+@ApiModel(value = "处置终端故障-入参", description = "处置终端故障-入参")
+public class TerminalFaultHandleInDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "故障ID", required = true)
+    private Long faultId;
+
+    @ApiModelProperty(value = "处置类型:1-开始处理 2-已修复 3-已返厂 4-已报废", required = true)
+    private Integer handleType;
+
+    @ApiModelProperty(value = "处理结果描述")
+    private String handleResult;
+
+    @ApiModelProperty(value = "处理人ID", required = true)
+    private Long handleUserId;
+}

+ 49 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/in/TerminalFaultPageInDTO.java

@@ -0,0 +1,49 @@
+package com.zksy.manhole.dto.in;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 分页查询终端故障列表-入参
+ *
+ * @author xianggx
+ */
+@Data
+@ApiModel(value = "分页查询终端故障列表-入参", description = "分页查询终端故障列表-入参")
+public class TerminalFaultPageInDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "故障编号")
+    private String faultNo;
+
+    @ApiModelProperty(value = "关联终端设备ID")
+    private String deviceId;
+
+    @ApiModelProperty(value = "故障等级:1-严重 2-一般")
+    private Integer faultLevel;
+
+    @ApiModelProperty(value = "故障来源:1-设备报警 2-人工上报 3-巡检发现")
+    private Integer faultSource;
+
+    @ApiModelProperty(value = "故障状态:1-未处理 2-处理中 3-已修复 4-已返厂 5-已报废")
+    private Integer faultStatus;
+
+    @ApiModelProperty(value = "故障发生开始时间")
+    @JsonFormat(locale = "zh", pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startTime;
+
+    @ApiModelProperty(value = "故障发生结束时间")
+    @JsonFormat(locale = "zh", pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endTime;
+
+    @ApiModelProperty(value = "当前记录起始索引", required = true)
+    private Long pageNum;
+
+    @ApiModelProperty(value = "每页显示记录数", required = true)
+    private Long pageSize;
+}

+ 30 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/out/AbnormalTerminalTrendOutDTO.java

@@ -0,0 +1,30 @@
+package com.zksy.manhole.dto.out;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 异常终端设备数量趋势分析-出参
+ *
+ * @author xianggx
+ */
+@Data
+@ApiModel(value = "异常终端设备数量趋势分析-出参", description = "异常终端设备数量趋势分析-出参")
+public class AbnormalTerminalTrendOutDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "趋势标签(如 2026-W26 或 2026-06)")
+    private String trendLabel;
+
+    @ApiModelProperty(value = "统计日期")
+    @JsonFormat(locale = "zh", pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date statDate;
+
+    @ApiModelProperty(value = "异常终端设备数量(平均值)")
+    private Integer abnormalTerminal;
+}

+ 34 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/out/CaseRateTrendOutDTO.java

@@ -0,0 +1,34 @@
+package com.zksy.manhole.dto.out;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 案件处置率/延期率趋势分析-出参
+ *
+ * @author xianggx
+ */
+@Data
+@ApiModel(value = "案件处置率/延期率趋势分析-出参", description = "案件处置率/延期率趋势分析-出参")
+public class CaseRateTrendOutDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "趋势标签(如 2026-W26 或 2026-06)")
+    private String trendLabel;
+
+    @ApiModelProperty(value = "统计日期")
+    @JsonFormat(locale = "zh", pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date statDate;
+
+    @ApiModelProperty(value = "案件处置率(%)")
+    private BigDecimal caseDisposalRate;
+
+    @ApiModelProperty(value = "案件延期率(%)")
+    private BigDecimal caseDelayRate;
+}

+ 18 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/out/MaintenanceDataStatOutDTO.java

@@ -0,0 +1,18 @@
+package com.zksy.manhole.dto.out;
+
+import com.zksy.base.domain.MaintenanceDataStat;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 运维数据统计-出参
+ *
+ * @author xianggx
+ */
+@Data
+@ApiModel(value = "运维数据统计-出参", description = "运维数据统计-出参")
+public class MaintenanceDataStatOutDTO extends MaintenanceDataStat implements Serializable {
+    private static final long serialVersionUID = 1L;
+}

+ 18 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/out/MaintenanceTaskDetailOutDTO.java

@@ -0,0 +1,18 @@
+package com.zksy.manhole.dto.out;
+
+import com.zksy.base.domain.MaintenanceTaskDetail;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 运维任务明细-出参
+ *
+ * @author xianggx
+ */
+@Data
+@ApiModel(value = "运维任务明细-出参", description = "运维任务明细-出参")
+public class MaintenanceTaskDetailOutDTO extends MaintenanceTaskDetail implements Serializable {
+    private static final long serialVersionUID = 1L;
+}

+ 23 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/out/MaintenanceTaskOutDTO.java

@@ -0,0 +1,23 @@
+package com.zksy.manhole.dto.out;
+
+import com.zksy.base.domain.MaintenanceTask;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 运维任务详情-出参
+ *
+ * @author xianggx
+ */
+@Data
+@ApiModel(value = "运维任务详情-出参", description = "运维任务详情-出参")
+public class MaintenanceTaskOutDTO extends MaintenanceTask implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "运维任务明细列表")
+    private List<MaintenanceTaskDetailOutDTO> detailList;
+}

+ 18 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/out/TerminalFaultOutDTO.java

@@ -0,0 +1,18 @@
+package com.zksy.manhole.dto.out;
+
+import com.zksy.base.domain.TerminalFault;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 终端故障详情-出参
+ *
+ * @author xianggx
+ */
+@Data
+@ApiModel(value = "终端故障详情-出参", description = "终端故障详情-出参")
+public class TerminalFaultOutDTO extends TerminalFault implements Serializable {
+    private static final long serialVersionUID = 1L;
+}

+ 26 - 0
pipe-network-service/zksy-system/src/main/resources/mapper/MaintenanceDataStatMapper.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zksy.base.mapper.MaintenanceDataStatMapper">
+
+    <resultMap id="BaseResultMap" type="com.zksy.base.domain.MaintenanceDataStat">
+            <id property="statId" column="stat_id" jdbcType="BIGINT"/>
+            <result property="statDate" column="stat_date" jdbcType="DATE"/>
+            <result property="deptId" column="dept_id" jdbcType="BIGINT"/>
+            <result property="totalTerminal" column="total_terminal" jdbcType="INTEGER"/>
+            <result property="abnormalTerminal" column="abnormal_terminal" jdbcType="INTEGER"/>
+            <result property="totalCase" column="total_case" jdbcType="INTEGER"/>
+            <result property="caseDisposalRate" column="case_disposal_rate" jdbcType="DECIMAL"/>
+            <result property="caseDelayRate" column="case_delay_rate" jdbcType="DECIMAL"/>
+            <result property="avgDisposalTime" column="avg_disposal_time" jdbcType="DECIMAL"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        stat_id,stat_date,dept_id,
+        total_terminal,abnormal_terminal,total_case,
+        case_disposal_rate,case_delay_rate,avg_disposal_time,
+        create_time
+    </sql>
+</mapper>

+ 24 - 0
pipe-network-service/zksy-system/src/main/resources/mapper/MaintenanceTaskDetailMapper.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zksy.base.mapper.MaintenanceTaskDetailMapper">
+
+    <resultMap id="BaseResultMap" type="com.zksy.base.domain.MaintenanceTaskDetail">
+            <id property="detailId" column="detail_id" jdbcType="BIGINT"/>
+            <result property="taskId" column="task_id" jdbcType="BIGINT"/>
+            <result property="deviceId" column="device_id" jdbcType="VARCHAR"/>
+            <result property="deviceCode" column="device_code" jdbcType="VARCHAR"/>
+            <result property="alarmId" column="alarm_id" jdbcType="VARCHAR"/>
+            <result property="alarmDesc" column="alarm_desc" jdbcType="VARCHAR"/>
+            <result property="detailStatus" column="detail_status" jdbcType="TINYINT"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        detail_id,task_id,device_id,
+        device_code,alarm_id,alarm_desc,
+        detail_status,create_time,update_time
+    </sql>
+</mapper>

+ 31 - 0
pipe-network-service/zksy-system/src/main/resources/mapper/MaintenanceTaskMapper.xml

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zksy.base.mapper.MaintenanceTaskMapper">
+
+    <resultMap id="BaseResultMap" type="com.zksy.base.domain.MaintenanceTask">
+            <id property="taskId" column="task_id" jdbcType="BIGINT"/>
+            <result property="taskNo" column="task_no" jdbcType="VARCHAR"/>
+            <result property="deptId" column="dept_id" jdbcType="BIGINT"/>
+            <result property="dispatchUserId" column="dispatch_user_id" jdbcType="BIGINT"/>
+            <result property="receiveUserId" column="receive_user_id" jdbcType="BIGINT"/>
+            <result property="taskDesc" column="task_desc" jdbcType="VARCHAR"/>
+            <result property="taskLevel" column="task_level" jdbcType="TINYINT"/>
+            <result property="taskStatus" column="task_status" jdbcType="TINYINT"/>
+            <result property="planStartTime" column="plan_start_time" jdbcType="TIMESTAMP"/>
+            <result property="planEndTime" column="plan_end_time" jdbcType="TIMESTAMP"/>
+            <result property="realStartTime" column="real_start_time" jdbcType="TIMESTAMP"/>
+            <result property="realEndTime" column="real_end_time" jdbcType="TIMESTAMP"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        task_id,task_no,dept_id,
+        dispatch_user_id,receive_user_id,task_desc,
+        task_level,task_status,plan_start_time,
+        plan_end_time,real_start_time,real_end_time,
+        create_time,update_time
+    </sql>
+</mapper>

+ 32 - 0
pipe-network-service/zksy-system/src/main/resources/mapper/TerminalFaultMapper.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zksy.base.mapper.TerminalFaultMapper">
+
+    <resultMap id="BaseResultMap" type="com.zksy.base.domain.TerminalFault">
+            <id property="faultId" column="fault_id" jdbcType="BIGINT"/>
+            <result property="faultNo" column="fault_no" jdbcType="VARCHAR"/>
+            <result property="deviceId" column="device_id" jdbcType="VARCHAR"/>
+            <result property="deviceCode" column="device_code" jdbcType="VARCHAR"/>
+            <result property="alarmId" column="alarm_id" jdbcType="VARCHAR"/>
+            <result property="faultLevel" column="fault_level" jdbcType="TINYINT"/>
+            <result property="faultDesc" column="fault_desc" jdbcType="VARCHAR"/>
+            <result property="faultSource" column="fault_source" jdbcType="TINYINT"/>
+            <result property="faultStatus" column="fault_status" jdbcType="TINYINT"/>
+            <result property="happenTime" column="happen_time" jdbcType="TIMESTAMP"/>
+            <result property="handleUserId" column="handle_user_id" jdbcType="BIGINT"/>
+            <result property="handleTime" column="handle_time" jdbcType="TIMESTAMP"/>
+            <result property="handleResult" column="handle_result" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        fault_id,fault_no,device_id,
+        device_code,alarm_id,fault_level,
+        fault_desc,fault_source,fault_status,
+        happen_time,handle_user_id,handle_time,
+        handle_result,create_time,update_time
+    </sql>
+</mapper>