Просмотр исходного кода

feat:燃气管网-基础数据管理

null 1 месяц назад
Родитель
Сommit
f0c168fafa
43 измененных файлов с 1865 добавлено и 0 удалено
  1. 72 0
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/alarm/AlarmController.java
  2. 81 0
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/basic/EquipmentController.java
  3. 121 0
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/basic/GisController.java
  4. 79 0
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/basic/ManholeController.java
  5. 65 0
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/basic/MonitorPointController.java
  6. 81 0
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/basic/PipeNetworkController.java
  7. 72 0
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/basic/RepairRecordController.java
  8. 102 0
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/hidden/HazardController.java
  9. 85 0
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/monitor/RealtimeMonitorController.java
  10. 72 0
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/risk/RiskController.java
  11. 2 0
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/system/SysDictDataController.java
  12. 103 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/HazardHiddenAccount.java
  13. 71 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/ManholeBase.java
  14. 57 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/PipeRepairRecord.java
  15. 72 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/RiskAssessment.java
  16. 58 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/StationVideoDevice.java
  17. 31 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/dto/HazardPageInDTO.java
  18. 28 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/dto/ManholePageInDTO.java
  19. 25 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/dto/MonitorPointPageInDTO.java
  20. 34 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/dto/PipeNetworkPageInDTO.java
  21. 25 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/dto/RepairRecordPageInDTO.java
  22. 25 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/dto/RiskPageInDTO.java
  23. 9 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/mapper/HazardHiddenAccountMapper.java
  24. 9 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/mapper/ManholeBaseMapper.java
  25. 9 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/mapper/MonitorPointMapper.java
  26. 9 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/mapper/PipeNetworkBaseMapper.java
  27. 9 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/mapper/PipeRepairRecordMapper.java
  28. 9 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/mapper/RiskAssessmentMapper.java
  29. 9 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/mapper/StationVideoDeviceMapper.java
  30. 22 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/HazardHiddenAccountService.java
  31. 15 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/ManholeBaseService.java
  32. 11 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/MonitorPointService.java
  33. 15 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/PipeNetworkBaseService.java
  34. 15 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/PipeRepairRecordService.java
  35. 16 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/RiskAssessmentService.java
  36. 11 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/StationVideoDeviceService.java
  37. 93 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/HazardHiddenAccountServiceImpl.java
  38. 38 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/ManholeBaseServiceImpl.java
  39. 27 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/MonitorPointServiceImpl.java
  40. 40 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/PipeNetworkBaseServiceImpl.java
  41. 37 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/PipeRepairRecordServiceImpl.java
  42. 73 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/RiskAssessmentServiceImpl.java
  43. 28 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/StationVideoDeviceServiceImpl.java

+ 72 - 0
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/alarm/AlarmController.java

@@ -0,0 +1,72 @@
+package com.zksy.web.controller.alarm;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zksy.base.alarm.domain.AlarmData;
+import com.zksy.base.alarm.service.AlarmDataService;
+import com.zksy.common.annotation.Anonymous;
+import com.zksy.common.annotation.Log;
+import com.zksy.common.core.domain.AjaxResult;
+import com.zksy.common.enums.BusinessType;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+
+@Slf4j
+@RestController
+@RequestMapping("/api/alarm")
+@Api(tags = "监测预警")
+public class AlarmController {
+
+    @Autowired
+    private AlarmDataService service;
+
+    @GetMapping("/findByPage")
+    @ApiOperation("报警分页查询")
+    @Anonymous
+    public AjaxResult findByPage(@ApiParam("页码") long pageNum,
+                                  @ApiParam("每页条数") long pageSize,
+                                  @RequestParam(required = false) String warningType,
+                                  @RequestParam(required = false) Integer alarmStatus) {
+        Page<AlarmData> page = service.findByPage(pageNum, pageSize, null, warningType, null, alarmStatus);
+        return AjaxResult.success(page);
+    }
+
+    @GetMapping("/getById/{id}")
+    @ApiOperation("根据ID查询报警")
+    @Anonymous
+    public AjaxResult getById(@PathVariable String id) {
+        AlarmData entity = service.getById(id);
+        return entity != null ? AjaxResult.success(entity) : AjaxResult.error("报警信息不存在");
+    }
+
+    @PutMapping("/handle/{alarmId}")
+    @ApiOperation("处理报警")
+    @Log(title = "处理报警", businessType = BusinessType.UPDATE)
+    public AjaxResult handle(@PathVariable String alarmId,
+                              @RequestParam String handleUser,
+                              @RequestParam(required = false) String handleRemark) {
+        AlarmData entity = service.getById(alarmId);
+        if (entity == null) {
+            return AjaxResult.error("报警信息不存在");
+        }
+        entity.setAlarmStatus(1);
+        entity.setHandleTime(LocalDateTime.now());
+        entity.setHandleUser(handleUser);
+        entity.setHandleRemark(handleRemark);
+        entity.setUpdateTime(LocalDateTime.now());
+        boolean updated = service.updateById(entity);
+        return updated ? AjaxResult.success("处理成功") : AjaxResult.error("处理失败");
+    }
+
+    @GetMapping("/active-points")
+    @ApiOperation("获取未处理报警点位(报警一张图)")
+    @Anonymous
+    public AjaxResult getActivePoints() {
+        return AjaxResult.success(service.getAlarmDataList(null, null, null, 0));
+    }
+}

+ 81 - 0
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/basic/EquipmentController.java

@@ -0,0 +1,81 @@
+package com.zksy.web.controller.basic;
+
+import com.zksy.base.domain.EquipmentBase;
+import com.zksy.base.domain.EquipmentPointRel;
+import com.zksy.base.domain.EquipmentStatus;
+import com.zksy.base.service.EquipmentBaseService;
+import com.zksy.base.service.EquipmentStatusService;
+import com.zksy.base.mapper.EquipmentPointRelMapper;
+import com.zksy.base.mapper.EquipmentStatusMapper;
+import com.zksy.common.annotation.Anonymous;
+import com.zksy.common.core.domain.AjaxResult;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Slf4j
+@RestController
+@RequestMapping("/api/equipment")
+@Api(tags = "监测设备管理")
+public class EquipmentController {
+
+    @Autowired
+    private EquipmentBaseService equipmentBaseService;
+
+    @Autowired
+    private EquipmentStatusMapper equipmentStatusMapper;
+
+    @Autowired
+    private EquipmentPointRelMapper equipmentPointRelMapper;
+
+    @GetMapping("/status/{equipmentId}")
+    @ApiOperation("获取设备实时运行状态")
+    @Anonymous
+    public AjaxResult getEquipmentStatus(@PathVariable String equipmentId) {
+        LambdaQueryWrapper<EquipmentStatus> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(EquipmentStatus::getEquipmentId, equipmentId);
+        EquipmentStatus status = equipmentStatusMapper.selectOne(wrapper);
+        return status != null ? AjaxResult.success(status) : AjaxResult.error("设备状态信息不存在");
+    }
+
+    @GetMapping("/abnormal")
+    @ApiOperation("异常设备列表(关联报警统计)")
+    @Anonymous
+    public AjaxResult getAbnormalList() {
+        LambdaQueryWrapper<EquipmentStatus> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(EquipmentStatus::getAlarmStatus, 1);
+        List<EquipmentStatus> list = equipmentStatusMapper.selectList(wrapper);
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/point-rel/{equipmentId}")
+    @ApiOperation("获取设备关联的测点")
+    @Anonymous
+    public AjaxResult getPointRelByEquipment(@PathVariable String equipmentId) {
+        LambdaQueryWrapper<EquipmentPointRel> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(EquipmentPointRel::getEquipmentId, equipmentId);
+        List<EquipmentPointRel> list = equipmentPointRelMapper.selectList(wrapper);
+        return AjaxResult.success(list);
+    }
+
+    @PostMapping("/point-rel/save")
+    @ApiOperation("新增设备测点关联")
+    @Anonymous
+    public AjaxResult savePointRel(@RequestBody EquipmentPointRel rel) {
+        boolean saved = equipmentPointRelMapper.insert(rel) > 0;
+        return saved ? AjaxResult.success("关联成功") : AjaxResult.error("关联失败");
+    }
+
+    @DeleteMapping("/point-rel/delete")
+    @ApiOperation("删除设备测点关联")
+    @Anonymous
+    public AjaxResult deletePointRel(@RequestParam String relId) {
+        boolean deleted = equipmentPointRelMapper.deleteById(relId) > 0;
+        return deleted ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
+    }
+}

+ 121 - 0
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/basic/GisController.java

@@ -0,0 +1,121 @@
+package com.zksy.web.controller.basic;
+
+import com.zksy.base.domain.EquipmentBase;
+import com.zksy.base.domain.ManholeBase;
+import com.zksy.base.domain.PipeNetworkBase;
+import com.zksy.base.service.EquipmentBaseService;
+import com.zksy.base.service.ManholeBaseService;
+import com.zksy.base.service.PipeNetworkBaseService;
+import com.zksy.common.annotation.Anonymous;
+import com.zksy.common.core.domain.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@RestController
+@RequestMapping("/api/gis")
+@Api(tags = "GIS一张图")
+public class GisController {
+
+    @Autowired
+    private PipeNetworkBaseService pipeNetworkService;
+
+    @Autowired
+    private ManholeBaseService manholeService;
+
+    @Autowired
+    private EquipmentBaseService equipmentService;
+
+    @GetMapping("/pipe-lines")
+    @ApiOperation("获取管网GeoJSON数据")
+    @Anonymous
+    public AjaxResult getPipeLines(@RequestParam(required = false) String networkType,
+                                    @RequestParam(required = false) String status) {
+        List<PipeNetworkBase> list = pipeNetworkService.list();
+        List<Map<String, Object>> features = new ArrayList<>();
+        for (PipeNetworkBase pipe : list) {
+            if (pipe.getLongitude() == null || pipe.getLatitude() == null) continue;
+            Map<String, Object> feature = new HashMap<>();
+            feature.put("type", "Feature");
+            Map<String, Object> props = new HashMap<>();
+            props.put("networkId", pipe.getNetworkId());
+            props.put("networkName", pipe.getNetworkName());
+            props.put("networkType", pipe.getNetworkType());
+            props.put("networkCode", pipe.getNetworkCode());
+            props.put("status", pipe.getStatus());
+            props.put("material", pipe.getMaterial());
+            feature.put("properties", props);
+            Map<String, Object> geometry = new HashMap<>();
+            geometry.put("type", "Point");
+            geometry.put("coordinates", new double[]{pipe.getLongitude().doubleValue(), pipe.getLatitude().doubleValue()});
+            feature.put("geometry", geometry);
+            features.add(feature);
+        }
+        Map<String, Object> geojson = new HashMap<>();
+        geojson.put("type", "FeatureCollection");
+        geojson.put("features", features);
+        return AjaxResult.success(geojson);
+    }
+
+    @GetMapping("/manholes")
+    @ApiOperation("获取窨井点位")
+    @Anonymous
+    public AjaxResult getManholes() {
+        List<ManholeBase> list = manholeService.list();
+        List<Map<String, Object>> features = new ArrayList<>();
+        for (ManholeBase m : list) {
+            if (m.getLongitude() == null || m.getLatitude() == null) continue;
+            Map<String, Object> feature = new HashMap<>();
+            feature.put("type", "Feature");
+            Map<String, Object> props = new HashMap<>();
+            props.put("manholeId", m.getManholeId());
+            props.put("manholeName", m.getManholeName());
+            props.put("manholeCode", m.getManholeCode());
+            props.put("status", m.getStatus());
+            feature.put("properties", props);
+            Map<String, Object> geometry = new HashMap<>();
+            geometry.put("type", "Point");
+            geometry.put("coordinates", new double[]{m.getLongitude().doubleValue(), m.getLatitude().doubleValue()});
+            feature.put("geometry", geometry);
+            features.add(feature);
+        }
+        Map<String, Object> geojson = new HashMap<>();
+        geojson.put("type", "FeatureCollection");
+        geojson.put("features", features);
+        return AjaxResult.success(geojson);
+    }
+
+    @GetMapping("/equipments")
+    @ApiOperation("获取设备点位")
+    @Anonymous
+    public AjaxResult getEquipments(@RequestParam(required = false) String equipmentTypeId) {
+        List<EquipmentBase> list = equipmentService.list();
+        List<Map<String, Object>> features = new ArrayList<>();
+        for (EquipmentBase e : list) {
+            if (e.getLongitude() == null || e.getLatitude() == null) continue;
+            Map<String, Object> feature = new HashMap<>();
+            feature.put("type", "Feature");
+            Map<String, Object> props = new HashMap<>();
+            props.put("equipmentId", e.getEquipmentId());
+            props.put("equipmentName", e.getEquipmentName());
+            props.put("equipmentCode", e.getEquipmentCode());
+            props.put("equipmentTypeId", e.getEquipmentTypeId());
+            feature.put("properties", props);
+            Map<String, Object> geometry = new HashMap<>();
+            geometry.put("type", "Point");
+            geometry.put("coordinates", new double[]{e.getLongitude().doubleValue(), e.getLatitude().doubleValue()});
+            feature.put("geometry", geometry);
+            features.add(feature);
+        }
+        Map<String, Object> geojson = new HashMap<>();
+        geojson.put("type", "FeatureCollection");
+        geojson.put("features", features);
+        return AjaxResult.success(geojson);
+    }
+}

+ 79 - 0
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/basic/ManholeController.java

@@ -0,0 +1,79 @@
+package com.zksy.web.controller.basic;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zksy.base.domain.ManholeBase;
+import com.zksy.base.dto.ManholePageInDTO;
+import com.zksy.base.service.ManholeBaseService;
+import com.zksy.common.annotation.Anonymous;
+import com.zksy.common.annotation.Log;
+import com.zksy.common.core.domain.AjaxResult;
+import com.zksy.common.enums.BusinessType;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Slf4j
+@RestController
+@RequestMapping("/api/manhole")
+@Api(tags = "窨井管理")
+public class ManholeController {
+
+    @Autowired
+    private ManholeBaseService service;
+
+    @GetMapping("/findByPage")
+    @ApiOperation("窨井分页查询")
+    @Anonymous
+    public AjaxResult findByPage(ManholePageInDTO dto) {
+        Page<ManholeBase> page = service.findByPage(dto);
+        return AjaxResult.success(page);
+    }
+
+    @GetMapping("/getById/{id}")
+    @ApiOperation("根据ID查询窨井")
+    @Anonymous
+    public AjaxResult getById(@PathVariable String id) {
+        ManholeBase entity = service.getById(id);
+        return entity != null ? AjaxResult.success(entity) : AjaxResult.error("窨井信息不存在");
+    }
+
+    @GetMapping("/options")
+    @ApiOperation("窨井下拉选项")
+    @Anonymous
+    public AjaxResult options() {
+        return AjaxResult.success(service.getOptions());
+    }
+
+    @GetMapping("/list")
+    @ApiOperation("窨井列表(全量,用于地图展示)")
+    @Anonymous
+    public AjaxResult list() {
+        return AjaxResult.success(service.list());
+    }
+
+    @PostMapping("/save")
+    @ApiOperation("新增窨井")
+    @Log(title = "新增窨井信息", businessType = BusinessType.INSERT)
+    public AjaxResult save(@RequestBody ManholeBase entity) {
+        boolean saved = service.save(entity);
+        return saved ? AjaxResult.success("新增成功", saved) : AjaxResult.error("新增失败");
+    }
+
+    @PutMapping("/updateById")
+    @ApiOperation("修改窨井")
+    @Log(title = "修改窨井信息", businessType = BusinessType.UPDATE)
+    public AjaxResult updateById(@RequestBody ManholeBase entity) {
+        boolean updated = service.updateById(entity);
+        return updated ? AjaxResult.success("修改成功", updated) : AjaxResult.error("修改失败");
+    }
+
+    @DeleteMapping("/deleteById")
+    @ApiOperation("删除窨井")
+    @Log(title = "删除窨井信息", businessType = BusinessType.DELETE)
+    public AjaxResult deleteById(@RequestParam String id) {
+        boolean deleted = service.removeById(id);
+        return deleted ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
+    }
+}

+ 65 - 0
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/basic/MonitorPointController.java

@@ -0,0 +1,65 @@
+package com.zksy.web.controller.basic;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zksy.base.domain.MonitorPoint;
+import com.zksy.base.dto.MonitorPointPageInDTO;
+import com.zksy.base.service.MonitorPointService;
+import com.zksy.common.annotation.Anonymous;
+import com.zksy.common.annotation.Log;
+import com.zksy.common.core.domain.AjaxResult;
+import com.zksy.common.enums.BusinessType;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Slf4j
+@RestController
+@RequestMapping("/api/monitor-point")
+@Api(tags = "监测点管理")
+public class MonitorPointController {
+
+    @Autowired
+    private MonitorPointService service;
+
+    @GetMapping("/findByPage")
+    @ApiOperation("监测点分页查询")
+    @Anonymous
+    public AjaxResult findByPage(MonitorPointPageInDTO dto) {
+        Page<MonitorPoint> page = service.findByPage(dto);
+        return AjaxResult.success(page);
+    }
+
+    @GetMapping("/getById/{id}")
+    @ApiOperation("根据ID查询监测点")
+    @Anonymous
+    public AjaxResult getById(@PathVariable String id) {
+        MonitorPoint entity = service.getById(id);
+        return entity != null ? AjaxResult.success(entity) : AjaxResult.error("监测点信息不存在");
+    }
+
+    @PostMapping("/save")
+    @ApiOperation("新增监测点")
+    @Log(title = "新增监测点", businessType = BusinessType.INSERT)
+    public AjaxResult save(@RequestBody MonitorPoint entity) {
+        boolean saved = service.save(entity);
+        return saved ? AjaxResult.success("新增成功", saved) : AjaxResult.error("新增失败");
+    }
+
+    @PutMapping("/updateById")
+    @ApiOperation("修改监测点")
+    @Log(title = "修改监测点", businessType = BusinessType.UPDATE)
+    public AjaxResult updateById(@RequestBody MonitorPoint entity) {
+        boolean updated = service.updateById(entity);
+        return updated ? AjaxResult.success("修改成功", updated) : AjaxResult.error("修改失败");
+    }
+
+    @DeleteMapping("/deleteById")
+    @ApiOperation("删除监测点")
+    @Log(title = "删除监测点", businessType = BusinessType.DELETE)
+    public AjaxResult deleteById(@RequestParam String id) {
+        boolean deleted = service.removeById(id);
+        return deleted ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
+    }
+}

+ 81 - 0
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/basic/PipeNetworkController.java

@@ -0,0 +1,81 @@
+package com.zksy.web.controller.basic;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zksy.base.domain.PipeNetworkBase;
+import com.zksy.base.dto.PipeNetworkPageInDTO;
+import com.zksy.base.service.PipeNetworkBaseService;
+import com.zksy.common.annotation.Anonymous;
+import com.zksy.common.annotation.Log;
+import com.zksy.common.core.domain.AjaxResult;
+import com.zksy.common.enums.BusinessType;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Slf4j
+@RestController
+@RequestMapping("/api/pipe-network")
+@Api(tags = "燃气管网基础数据")
+public class PipeNetworkController {
+
+    @Autowired
+    private PipeNetworkBaseService service;
+
+    @GetMapping("/findByPage")
+    @ApiOperation("管网分页查询")
+    @Anonymous
+    public AjaxResult findByPage(PipeNetworkPageInDTO dto) {
+        Page<PipeNetworkBase> page = service.findByPage(dto);
+        return AjaxResult.success(page);
+    }
+
+    @GetMapping("/getById/{id}")
+    @ApiOperation("根据ID查询管网")
+    @Anonymous
+    public AjaxResult getById(@PathVariable String id) {
+        PipeNetworkBase entity = service.getById(id);
+        return entity != null ? AjaxResult.success(entity) : AjaxResult.error("管网信息不存在");
+    }
+
+    @GetMapping("/options")
+    @ApiOperation("管网下拉选项")
+    @Anonymous
+    public AjaxResult options() {
+        return AjaxResult.success(service.getOptions());
+    }
+
+    @PostMapping("/save")
+    @ApiOperation("新增管网")
+    @Log(title = "新增管网基础数据", businessType = BusinessType.INSERT)
+    public AjaxResult save(@RequestBody PipeNetworkBase entity) {
+        boolean saved = service.save(entity);
+        return saved ? AjaxResult.success("新增成功", saved) : AjaxResult.error("新增失败");
+    }
+
+    @PutMapping("/updateById")
+    @ApiOperation("修改管网")
+    @Log(title = "修改管网基础数据", businessType = BusinessType.UPDATE)
+    public AjaxResult updateById(@RequestBody PipeNetworkBase entity) {
+        boolean updated = service.updateById(entity);
+        return updated ? AjaxResult.success("修改成功", updated) : AjaxResult.error("修改失败");
+    }
+
+    @DeleteMapping("/deleteById")
+    @ApiOperation("删除管网")
+    @Log(title = "删除管网基础数据", businessType = BusinessType.DELETE)
+    public AjaxResult deleteById(@RequestParam String id) {
+        boolean deleted = service.removeById(id);
+        return deleted ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
+    }
+
+    @GetMapping("/export")
+    @ApiOperation("导出Excel")
+    @Anonymous
+    public AjaxResult exportData(@RequestParam(required = false) String networkName,
+                                  @RequestParam(required = false) String status) {
+        // TODO: 实现Excel导出
+        return AjaxResult.success("导出功能待实现");
+    }
+}

+ 72 - 0
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/basic/RepairRecordController.java

@@ -0,0 +1,72 @@
+package com.zksy.web.controller.basic;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zksy.base.domain.PipeRepairRecord;
+import com.zksy.base.dto.RepairRecordPageInDTO;
+import com.zksy.base.service.PipeRepairRecordService;
+import com.zksy.common.annotation.Anonymous;
+import com.zksy.common.annotation.Log;
+import com.zksy.common.core.domain.AjaxResult;
+import com.zksy.common.enums.BusinessType;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Slf4j
+@RestController
+@RequestMapping("/api/repair-record")
+@Api(tags = "燃气管网维修记录")
+public class RepairRecordController {
+
+    @Autowired
+    private PipeRepairRecordService service;
+
+    @GetMapping("/findByPage")
+    @ApiOperation("维修记录分页查询")
+    @Anonymous
+    public AjaxResult findByPage(RepairRecordPageInDTO dto) {
+        Page<PipeRepairRecord> page = service.findByPage(dto);
+        return AjaxResult.success(page);
+    }
+
+    @GetMapping("/getById/{id}")
+    @ApiOperation("根据ID查询维修记录")
+    @Anonymous
+    public AjaxResult getById(@PathVariable String id) {
+        PipeRepairRecord entity = service.getById(id);
+        return entity != null ? AjaxResult.success(entity) : AjaxResult.error("维修记录不存在");
+    }
+
+    @GetMapping("/list-by-network/{networkId}")
+    @ApiOperation("按管网ID查询历史维修记录")
+    @Anonymous
+    public AjaxResult listByNetworkId(@PathVariable String networkId) {
+        return AjaxResult.success(service.listByNetworkId(networkId));
+    }
+
+    @PostMapping("/save")
+    @ApiOperation("新增维修记录")
+    @Log(title = "新增维修记录", businessType = BusinessType.INSERT)
+    public AjaxResult save(@RequestBody PipeRepairRecord entity) {
+        boolean saved = service.save(entity);
+        return saved ? AjaxResult.success("新增成功", saved) : AjaxResult.error("新增失败");
+    }
+
+    @PutMapping("/updateById")
+    @ApiOperation("修改维修记录")
+    @Log(title = "修改维修记录", businessType = BusinessType.UPDATE)
+    public AjaxResult updateById(@RequestBody PipeRepairRecord entity) {
+        boolean updated = service.updateById(entity);
+        return updated ? AjaxResult.success("修改成功", updated) : AjaxResult.error("修改失败");
+    }
+
+    @DeleteMapping("/deleteById")
+    @ApiOperation("删除维修记录")
+    @Log(title = "删除维修记录", businessType = BusinessType.DELETE)
+    public AjaxResult deleteById(@RequestParam String id) {
+        boolean deleted = service.removeById(id);
+        return deleted ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
+    }
+}

+ 102 - 0
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/hidden/HazardController.java

@@ -0,0 +1,102 @@
+package com.zksy.web.controller.hidden;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zksy.base.domain.HazardHiddenAccount;
+import com.zksy.base.dto.HazardPageInDTO;
+import com.zksy.base.service.HazardHiddenAccountService;
+import com.zksy.common.annotation.Anonymous;
+import com.zksy.common.annotation.Log;
+import com.zksy.common.core.domain.AjaxResult;
+import com.zksy.common.enums.BusinessType;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Slf4j
+@RestController
+@RequestMapping("/api/hazard")
+@Api(tags = "隐患台账管理")
+public class HazardController {
+
+    @Autowired
+    private HazardHiddenAccountService service;
+
+    @GetMapping("/page")
+    @ApiOperation("隐患分页查询")
+    @Anonymous
+    public AjaxResult page(HazardPageInDTO dto) {
+        Page<HazardHiddenAccount> result = service.findByPage(dto);
+        return AjaxResult.success(result);
+    }
+
+    @GetMapping("/getById/{id}")
+    @ApiOperation("根据ID查询隐患")
+    @Anonymous
+    public AjaxResult getById(@PathVariable String id) {
+        HazardHiddenAccount entity = service.getById(id);
+        return entity != null ? AjaxResult.success(entity) : AjaxResult.error("隐患信息不存在");
+    }
+
+    @PostMapping("/save")
+    @ApiOperation("新增隐患")
+    @Log(title = "新增隐患台账", businessType = BusinessType.INSERT)
+    public AjaxResult save(@RequestBody HazardHiddenAccount entity) {
+        boolean saved = service.save(entity);
+        return saved ? AjaxResult.success("新增成功", saved) : AjaxResult.error("新增失败");
+    }
+
+    @PutMapping("/updateById")
+    @ApiOperation("修改隐患")
+    @Log(title = "修改隐患台账", businessType = BusinessType.UPDATE)
+    public AjaxResult updateById(@RequestBody HazardHiddenAccount entity) {
+        boolean updated = service.updateById(entity);
+        return updated ? AjaxResult.success("修改成功", updated) : AjaxResult.error("修改失败");
+    }
+
+    @DeleteMapping("/deleteById")
+    @ApiOperation("删除隐患")
+    @Log(title = "删除隐患台账", businessType = BusinessType.DELETE)
+    public AjaxResult deleteById(@RequestParam String id) {
+        boolean deleted = service.removeById(id);
+        return deleted ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
+    }
+
+    @PutMapping("/submit/{hazardId}")
+    @ApiOperation("隐患报送")
+    @Log(title = "隐患报送", businessType = BusinessType.UPDATE)
+    public AjaxResult submit(@PathVariable String hazardId) {
+        boolean submitted = service.submitHazard(hazardId);
+        return submitted ? AjaxResult.success("报送成功") : AjaxResult.error("报送失败");
+    }
+
+    @GetMapping("/map-points")
+    @ApiOperation("获取未闭环隐患点位(隐患一张图)")
+    @Anonymous
+    public AjaxResult getMapPoints() {
+        return AjaxResult.success(service.getActiveMapPoints());
+    }
+
+    @GetMapping("/statistics/type")
+    @ApiOperation("按隐患类型统计")
+    @Anonymous
+    public AjaxResult statisticsByType() {
+        return AjaxResult.success(service.statisticsByType());
+    }
+
+    @GetMapping("/statistics/status")
+    @ApiOperation("按整改状态统计")
+    @Anonymous
+    public AjaxResult statisticsByStatus() {
+        return AjaxResult.success(service.statisticsByStatus());
+    }
+
+    @GetMapping("/export")
+    @ApiOperation("隐患导出Excel")
+    @Anonymous
+    public AjaxResult exportData() {
+        // TODO: 实现Excel导出
+        return AjaxResult.success("导出功能待实现");
+    }
+}

+ 85 - 0
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/monitor/RealtimeMonitorController.java

@@ -0,0 +1,85 @@
+package com.zksy.web.controller.monitor;
+
+import com.zksy.base.domain.StationVideoDevice;
+import com.zksy.base.service.EquipmentBaseService;
+import com.zksy.base.service.StationVideoDeviceService;
+import com.zksy.common.annotation.Anonymous;
+import com.zksy.common.core.domain.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+@Slf4j
+@RestController
+@RequestMapping("/api/monitor")
+@Api(tags = "实时监测看板")
+public class RealtimeMonitorController {
+
+    @Autowired
+    private StationVideoDeviceService videoDeviceService;
+
+    @Autowired
+    private EquipmentBaseService equipmentService;
+
+    @GetMapping("/pressure-history")
+    @ApiOperation("压力历史曲线")
+    @Anonymous
+    public AjaxResult getPressureHistory(@RequestParam(required = false) String pointId,
+                                          @RequestParam(defaultValue = "24") Integer hours) {
+        // TODO: 从监测数据表获取真实压力历史数据
+        List<Map<String, Object>> mockData = new ArrayList<>();
+        long now = System.currentTimeMillis();
+        for (int i = hours; i >= 0; i--) {
+            Map<String, Object> point = new HashMap<>();
+            point.put("time", System.currentTimeMillis() - i * 3600000L);
+            point.put("value", 0.3 + Math.random() * 0.4);
+            mockData.add(point);
+        }
+        return AjaxResult.success(mockData);
+    }
+
+    @GetMapping("/flow-history")
+    @ApiOperation("流量历史曲线")
+    @Anonymous
+    public AjaxResult getFlowHistory(@RequestParam(required = false) String pointId,
+                                      @RequestParam(defaultValue = "24") Integer hours) {
+        // TODO: 从监测数据表获取真实流量历史数据
+        List<Map<String, Object>> mockData = new ArrayList<>();
+        for (int i = hours; i >= 0; i--) {
+            Map<String, Object> point = new HashMap<>();
+            point.put("time", System.currentTimeMillis() - i * 3600000L);
+            point.put("value", 50 + Math.random() * 100);
+            mockData.add(point);
+        }
+        return AjaxResult.success(mockData);
+    }
+
+    @GetMapping("/gas-alarm-latest")
+    @ApiOperation("最新10条气体浓度报警")
+    @Anonymous
+    public AjaxResult getGasAlarmLatest() {
+        // TODO: 从alarm_data表获取最新报警数据
+        return AjaxResult.success(new ArrayList<>());
+    }
+
+    @GetMapping("/video-list")
+    @ApiOperation("获取视频设备列表")
+    @Anonymous
+    public AjaxResult getVideoList() {
+        return AjaxResult.success(videoDeviceService.list());
+    }
+
+    @GetMapping("/points-with-latest-data")
+    @ApiOperation("获取测点最新数据")
+    @Anonymous
+    public AjaxResult getPointsWithLatestData() {
+        // TODO: 从监测数据表获取各测点最新数据
+        List<Map<String, Object>> mockData = new ArrayList<>();
+        return AjaxResult.success(mockData);
+    }
+}

+ 72 - 0
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/risk/RiskController.java

@@ -0,0 +1,72 @@
+package com.zksy.web.controller.risk;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zksy.base.domain.RiskAssessment;
+import com.zksy.base.dto.RiskPageInDTO;
+import com.zksy.base.service.RiskAssessmentService;
+import com.zksy.common.annotation.Anonymous;
+import com.zksy.common.annotation.Log;
+import com.zksy.common.core.domain.AjaxResult;
+import com.zksy.common.enums.BusinessType;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Slf4j
+@RestController
+@RequestMapping("/api/risk")
+@Api(tags = "管网风险评估")
+public class RiskController {
+
+    @Autowired
+    private RiskAssessmentService service;
+
+    @GetMapping("/findByPage")
+    @ApiOperation("风险评估分页查询")
+    @Anonymous
+    public AjaxResult findByPage(RiskPageInDTO dto) {
+        Page<RiskAssessment> page = service.findByPage(dto);
+        return AjaxResult.success(page);
+    }
+
+    @GetMapping("/{riskId}")
+    @ApiOperation("风险评估详情")
+    @Anonymous
+    public AjaxResult getById(@PathVariable String riskId) {
+        RiskAssessment entity = service.getById(riskId);
+        return entity != null ? AjaxResult.success(entity) : AjaxResult.error("风险评估信息不存在");
+    }
+
+    @PostMapping("/save")
+    @ApiOperation("新增风险评估")
+    @Log(title = "新增风险评估", businessType = BusinessType.INSERT)
+    public AjaxResult save(@RequestBody RiskAssessment entity) {
+        boolean saved = service.save(entity);
+        return saved ? AjaxResult.success("新增成功", saved) : AjaxResult.error("新增失败");
+    }
+
+    @PutMapping("/updateById")
+    @ApiOperation("修改风险评估")
+    @Log(title = "修改风险评估", businessType = BusinessType.UPDATE)
+    public AjaxResult updateById(@RequestBody RiskAssessment entity) {
+        boolean updated = service.updateById(entity);
+        return updated ? AjaxResult.success("修改成功", updated) : AjaxResult.error("修改失败");
+    }
+
+    @DeleteMapping("/deleteById")
+    @ApiOperation("删除风险评估")
+    @Log(title = "删除风险评估", businessType = BusinessType.DELETE)
+    public AjaxResult deleteById(@RequestParam String id) {
+        boolean deleted = service.removeById(id);
+        return deleted ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
+    }
+
+    @GetMapping("/four-color-map")
+    @ApiOperation("管线风险评估四色图数据")
+    @Anonymous
+    public AjaxResult getFourColorMap() {
+        return AjaxResult.success(service.getFourColorMapData());
+    }
+}

+ 2 - 0
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/system/SysDictDataController.java

@@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+import com.zksy.common.annotation.Anonymous;
 import com.zksy.common.annotation.Log;
 import com.zksy.common.core.controller.BaseController;
 import com.zksy.common.core.domain.AjaxResult;
@@ -72,6 +73,7 @@ public class SysDictDataController extends BaseController
     /**
      * 根据字典类型查询字典数据信息
      */
+    @Anonymous
     @GetMapping(value = "/type/{dictType}")
     public AjaxResult dictType(@PathVariable String dictType)
     {

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

@@ -0,0 +1,103 @@
+package com.zksy.base.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * 隐患台账表
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("hazard_hidden_account")
+public class HazardHiddenAccount {
+
+    @TableId(value = "hazard_id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty("隐患ID")
+    private String hazardId;
+
+    @ApiModelProperty("隐患编号")
+    private String hazardNo;
+
+    @ApiModelProperty("关联管网设施ID")
+    private String networkId;
+
+    @ApiModelProperty("关联设备ID")
+    private String equipmentId;
+
+    @ApiModelProperty("隐患类型")
+    private String hazardType;
+
+    @ApiModelProperty("隐患等级")
+    private String hazardLevel;
+
+    @ApiModelProperty("隐患描述")
+    private String hazardDesc;
+
+    @ApiModelProperty("隐患来源")
+    private String hazardSource;
+
+    @ApiModelProperty("状态")
+    private String hazardStatus;
+
+    @ApiModelProperty("上报单位")
+    private String reportUnit;
+
+    @ApiModelProperty("上报时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime reportTime;
+
+    @ApiModelProperty("整改方案")
+    private String rectifyPlan;
+
+    @ApiModelProperty("整改期限")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate rectifyDeadline;
+
+    @ApiModelProperty("整改责任人")
+    private String rectifyPerson;
+
+    @ApiModelProperty("整改反馈")
+    private String rectifyFeedback;
+
+    @ApiModelProperty("核查人")
+    private String verifyPerson;
+
+    @ApiModelProperty("核查时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime verifyTime;
+
+    @ApiModelProperty("是否已报送")
+    private Integer isSubmitted;
+
+    @ApiModelProperty("报送时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime submitTime;
+
+    @ApiModelProperty("经度")
+    private BigDecimal longitude;
+
+    @ApiModelProperty("纬度")
+    private BigDecimal latitude;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime updateTime;
+}

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

@@ -0,0 +1,71 @@
+package com.zksy.base.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 窨井基础信息表
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("manhole_base")
+public class ManholeBase {
+
+    @TableId(value = "manhole_id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty("窨井ID")
+    private String manholeId;
+
+    @ApiModelProperty("窨井编码")
+    private String manholeCode;
+
+    @ApiModelProperty("窨井名称")
+    private String manholeName;
+
+    @ApiModelProperty("关联管网设施ID")
+    private String networkId;
+
+    @ApiModelProperty("位置描述")
+    private String location;
+
+    @ApiModelProperty("经度")
+    private BigDecimal longitude;
+
+    @ApiModelProperty("纬度")
+    private BigDecimal latitude;
+
+    @ApiModelProperty("窨井深度(米)")
+    private BigDecimal manholeDepth;
+
+    @ApiModelProperty("形状")
+    private String manholeShape;
+
+    @ApiModelProperty("材质")
+    private String material;
+
+    @ApiModelProperty("权属单位")
+    private String ownershipUnit;
+
+    @ApiModelProperty("状态")
+    private String status;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime updateTime;
+}

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

@@ -0,0 +1,57 @@
+package com.zksy.base.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * 燃气管网维修记录表
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("pipe_repair_record")
+public class PipeRepairRecord {
+
+    @TableId(value = "repair_id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty("维修记录ID")
+    private String repairId;
+
+    @ApiModelProperty("关联管网设施ID")
+    private String networkId;
+
+    @ApiModelProperty("维修日期")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate repairDate;
+
+    @ApiModelProperty("维修类型")
+    private String repairType;
+
+    @ApiModelProperty("维修内容")
+    private String repairContent;
+
+    @ApiModelProperty("维修单位")
+    private String repairCompany;
+
+    @ApiModelProperty("维修费用(元)")
+    private BigDecimal repairCost;
+
+    @ApiModelProperty("维修负责人")
+    private String repairPerson;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+}

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

@@ -0,0 +1,72 @@
+package com.zksy.base.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 燃气管网风险评估表
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("risk_assessment")
+public class RiskAssessment {
+
+    @TableId(value = "risk_id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty("风险评估ID")
+    private String riskId;
+
+    @ApiModelProperty("关联管网设施ID")
+    private String networkId;
+
+    @ApiModelProperty("风险等级")
+    private String riskLevel;
+
+    @ApiModelProperty("风险评分")
+    private BigDecimal riskScore;
+
+    @ApiModelProperty("风险颜色")
+    private String riskColor;
+
+    @ApiModelProperty("评估模型名称/版本")
+    private String assessmentModel;
+
+    @ApiModelProperty("评估时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime assessmentTime;
+
+    @ApiModelProperty("评估人")
+    private String assessmentPerson;
+
+    @ApiModelProperty("风险构成要素")
+    private String riskFactors;
+
+    @ApiModelProperty("周边防护目标")
+    private String protectiveTargets;
+
+    @ApiModelProperty("周边危险源")
+    private String hazardSources;
+
+    @ApiModelProperty("历史维修记录摘要")
+    private String repairHistorySummary;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime updateTime;
+}

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

@@ -0,0 +1,58 @@
+package com.zksy.base.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+/**
+ * 场站视频监控设备表
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("station_video_device")
+public class StationVideoDevice {
+
+    @TableId(value = "video_id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty("视频设备ID")
+    private String videoId;
+
+    @ApiModelProperty("关联场站ID")
+    private String stationId;
+
+    @ApiModelProperty("摄像头名称")
+    private String deviceName;
+
+    @ApiModelProperty("设备编码")
+    private String deviceCode;
+
+    @ApiModelProperty("视频流地址")
+    private String videoUrl;
+
+    @ApiModelProperty("安装位置描述")
+    private String location;
+
+    @ApiModelProperty("状态")
+    private String status;
+
+    @ApiModelProperty("厂商")
+    private String manufacturer;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    @ApiModelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime updateTime;
+}

+ 31 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/dto/HazardPageInDTO.java

@@ -0,0 +1,31 @@
+package com.zksy.base.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "隐患分页查询入参", description = "隐患分页查询入参")
+public class HazardPageInDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "隐患类型")
+    private String hazardType;
+
+    @ApiModelProperty(value = "隐患级别")
+    private String hazardLevel;
+
+    @ApiModelProperty(value = "隐患状态")
+    private String hazardStatus;
+
+    @ApiModelProperty(value = "是否已报送:0-未报送 1-已报送")
+    private Integer isSubmitted;
+
+    @ApiModelProperty(value = "当前记录起始索引", required = true)
+    private Long pageNum;
+
+    @ApiModelProperty(value = "每页显示记录数", required = true)
+    private Long pageSize;
+}

+ 28 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/dto/ManholePageInDTO.java

@@ -0,0 +1,28 @@
+package com.zksy.base.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "窨井分页查询入参", description = "窨井分页查询入参")
+public class ManholePageInDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "窨井名称")
+    private String manholeName;
+
+    @ApiModelProperty(value = "窨井编码")
+    private String manholeCode;
+
+    @ApiModelProperty(value = "状态")
+    private String status;
+
+    @ApiModelProperty(value = "当前记录起始索引", required = true)
+    private Long pageNum;
+
+    @ApiModelProperty(value = "每页显示记录数", required = true)
+    private Long pageSize;
+}

+ 25 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/dto/MonitorPointPageInDTO.java

@@ -0,0 +1,25 @@
+package com.zksy.base.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "监测点分页查询入参", description = "监测点分页查询入参")
+public class MonitorPointPageInDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "监测点名称")
+    private String pointName;
+
+    @ApiModelProperty(value = "监测点类型")
+    private String pointType;
+
+    @ApiModelProperty(value = "当前记录起始索引", required = true)
+    private Long pageNum;
+
+    @ApiModelProperty(value = "每页显示记录数", required = true)
+    private Long pageSize;
+}

+ 34 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/dto/PipeNetworkPageInDTO.java

@@ -0,0 +1,34 @@
+package com.zksy.base.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "管网分页查询入参", description = "管网分页查询入参")
+public class PipeNetworkPageInDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "管网名称")
+    private String networkName;
+
+    @ApiModelProperty(value = "管理单位")
+    private String managementUnit;
+
+    @ApiModelProperty(value = "管网级别")
+    private String networkLevel;
+
+    @ApiModelProperty(value = "材质")
+    private String material;
+
+    @ApiModelProperty(value = "状态")
+    private String status;
+
+    @ApiModelProperty(value = "当前记录起始索引", required = true)
+    private Long pageNum;
+
+    @ApiModelProperty(value = "每页显示记录数", required = true)
+    private Long pageSize;
+}

+ 25 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/dto/RepairRecordPageInDTO.java

@@ -0,0 +1,25 @@
+package com.zksy.base.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "维修记录分页查询入参", description = "维修记录分页查询入参")
+public class RepairRecordPageInDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "管网ID")
+    private String networkId;
+
+    @ApiModelProperty(value = "维修类型")
+    private String repairType;
+
+    @ApiModelProperty(value = "当前记录起始索引", required = true)
+    private Long pageNum;
+
+    @ApiModelProperty(value = "每页显示记录数", required = true)
+    private Long pageSize;
+}

+ 25 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/dto/RiskPageInDTO.java

@@ -0,0 +1,25 @@
+package com.zksy.base.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "风险评估分页查询入参", description = "风险评估分页查询入参")
+public class RiskPageInDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "管网ID")
+    private String networkId;
+
+    @ApiModelProperty(value = "风险等级")
+    private String riskLevel;
+
+    @ApiModelProperty(value = "当前记录起始索引", required = true)
+    private Long pageNum;
+
+    @ApiModelProperty(value = "每页显示记录数", required = true)
+    private Long pageSize;
+}

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

@@ -0,0 +1,9 @@
+package com.zksy.base.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zksy.base.domain.HazardHiddenAccount;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface HazardHiddenAccountMapper extends BaseMapper<HazardHiddenAccount> {
+}

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

@@ -0,0 +1,9 @@
+package com.zksy.base.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zksy.base.domain.ManholeBase;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface ManholeBaseMapper extends BaseMapper<ManholeBase> {
+}

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

@@ -0,0 +1,9 @@
+package com.zksy.base.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zksy.base.domain.MonitorPoint;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface MonitorPointMapper extends BaseMapper<MonitorPoint> {
+}

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

@@ -0,0 +1,9 @@
+package com.zksy.base.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zksy.base.domain.PipeNetworkBase;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface PipeNetworkBaseMapper extends BaseMapper<PipeNetworkBase> {
+}

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

@@ -0,0 +1,9 @@
+package com.zksy.base.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zksy.base.domain.PipeRepairRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface PipeRepairRecordMapper extends BaseMapper<PipeRepairRecord> {
+}

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

@@ -0,0 +1,9 @@
+package com.zksy.base.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zksy.base.domain.RiskAssessment;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface RiskAssessmentMapper extends BaseMapper<RiskAssessment> {
+}

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

@@ -0,0 +1,9 @@
+package com.zksy.base.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zksy.base.domain.StationVideoDevice;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface StationVideoDeviceMapper extends BaseMapper<StationVideoDevice> {
+}

+ 22 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/HazardHiddenAccountService.java

@@ -0,0 +1,22 @@
+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.HazardHiddenAccount;
+import com.zksy.base.dto.HazardPageInDTO;
+
+import java.util.List;
+import java.util.Map;
+
+public interface HazardHiddenAccountService extends IService<HazardHiddenAccount> {
+
+    Page<HazardHiddenAccount> findByPage(HazardPageInDTO dto);
+
+    boolean submitHazard(String hazardId);
+
+    List<HazardHiddenAccount> getActiveMapPoints();
+
+    List<Map<String, Object>> statisticsByType();
+
+    List<Map<String, Object>> statisticsByStatus();
+}

+ 15 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/ManholeBaseService.java

@@ -0,0 +1,15 @@
+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.ManholeBase;
+import com.zksy.base.dto.ManholePageInDTO;
+
+import java.util.List;
+
+public interface ManholeBaseService extends IService<ManholeBase> {
+
+    Page<ManholeBase> findByPage(ManholePageInDTO dto);
+
+    List<ManholeBase> getOptions();
+}

+ 11 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/MonitorPointService.java

@@ -0,0 +1,11 @@
+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.MonitorPoint;
+import com.zksy.base.dto.MonitorPointPageInDTO;
+
+public interface MonitorPointService extends IService<MonitorPoint> {
+
+    Page<MonitorPoint> findByPage(MonitorPointPageInDTO dto);
+}

+ 15 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/PipeNetworkBaseService.java

@@ -0,0 +1,15 @@
+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.PipeNetworkBase;
+import com.zksy.base.dto.PipeNetworkPageInDTO;
+
+import java.util.List;
+
+public interface PipeNetworkBaseService extends IService<PipeNetworkBase> {
+
+    Page<PipeNetworkBase> findByPage(PipeNetworkPageInDTO dto);
+
+    List<PipeNetworkBase> getOptions();
+}

+ 15 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/PipeRepairRecordService.java

@@ -0,0 +1,15 @@
+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.PipeRepairRecord;
+import com.zksy.base.dto.RepairRecordPageInDTO;
+
+import java.util.List;
+
+public interface PipeRepairRecordService extends IService<PipeRepairRecord> {
+
+    Page<PipeRepairRecord> findByPage(RepairRecordPageInDTO dto);
+
+    List<PipeRepairRecord> listByNetworkId(String networkId);
+}

+ 16 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/RiskAssessmentService.java

@@ -0,0 +1,16 @@
+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.RiskAssessment;
+import com.zksy.base.dto.RiskPageInDTO;
+
+import java.util.List;
+import java.util.Map;
+
+public interface RiskAssessmentService extends IService<RiskAssessment> {
+
+    Page<RiskAssessment> findByPage(RiskPageInDTO dto);
+
+    List<Map<String, Object>> getFourColorMapData();
+}

+ 11 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/StationVideoDeviceService.java

@@ -0,0 +1,11 @@
+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.StationVideoDevice;
+
+public interface StationVideoDeviceService extends IService<StationVideoDevice> {
+
+    Page<StationVideoDevice> findByPage(long pageNum, long pageSize,
+                                        String deviceName, String stationId, String status);
+}

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

@@ -0,0 +1,93 @@
+package com.zksy.base.service.impl;
+
+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.HazardHiddenAccount;
+import com.zksy.base.dto.HazardPageInDTO;
+import com.zksy.base.mapper.HazardHiddenAccountMapper;
+import com.zksy.base.service.HazardHiddenAccountService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class HazardHiddenAccountServiceImpl extends ServiceImpl<HazardHiddenAccountMapper, HazardHiddenAccount>
+        implements HazardHiddenAccountService {
+
+    @Override
+    public Page<HazardHiddenAccount> findByPage(HazardPageInDTO dto) {
+        Page<HazardHiddenAccount> page = new Page<>(dto.getPageNum(), dto.getPageSize());
+        LambdaQueryWrapper<HazardHiddenAccount> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(dto.getHazardType() != null && !dto.getHazardType().isEmpty(), HazardHiddenAccount::getHazardType, dto.getHazardType());
+        wrapper.eq(dto.getHazardLevel() != null && !dto.getHazardLevel().isEmpty(), HazardHiddenAccount::getHazardLevel, dto.getHazardLevel());
+        wrapper.eq(dto.getHazardStatus() != null && !dto.getHazardStatus().isEmpty(), HazardHiddenAccount::getHazardStatus, dto.getHazardStatus());
+        wrapper.eq(dto.getIsSubmitted() != null, HazardHiddenAccount::getIsSubmitted, dto.getIsSubmitted());
+        wrapper.orderByDesc(HazardHiddenAccount::getCreateTime);
+        return this.page(page, wrapper);
+    }
+
+    @Override
+    @Transactional
+    public boolean submitHazard(String hazardId) {
+        HazardHiddenAccount hazard = this.getById(hazardId);
+        if (hazard == null) {
+            return false;
+        }
+        hazard.setIsSubmitted(1);
+        hazard.setSubmitTime(LocalDateTime.now());
+        return this.updateById(hazard);
+    }
+
+    @Override
+    public List<HazardHiddenAccount> getActiveMapPoints() {
+        LambdaQueryWrapper<HazardHiddenAccount> wrapper = new LambdaQueryWrapper<>();
+        wrapper.ne(HazardHiddenAccount::getHazardStatus, "3");
+        wrapper.isNotNull(HazardHiddenAccount::getLongitude);
+        wrapper.isNotNull(HazardHiddenAccount::getLatitude);
+        wrapper.select(HazardHiddenAccount::getHazardId, HazardHiddenAccount::getHazardNo,
+                HazardHiddenAccount::getHazardType, HazardHiddenAccount::getHazardLevel,
+                HazardHiddenAccount::getHazardStatus, HazardHiddenAccount::getHazardDesc,
+                HazardHiddenAccount::getLongitude, HazardHiddenAccount::getLatitude,
+                HazardHiddenAccount::getRectifyFeedback, HazardHiddenAccount::getReportTime);
+        return this.list(wrapper);
+    }
+
+    @Override
+    public List<Map<String, Object>> statisticsByType() {
+        List<HazardHiddenAccount> list = this.list();
+        Map<String, Long> grouped = list.stream()
+                .collect(Collectors.groupingBy(h -> h.getHazardType() != null ? h.getHazardType() : "未知", Collectors.counting()));
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (Map.Entry<String, Long> entry : grouped.entrySet()) {
+            Map<String, Object> item = new HashMap<>();
+            item.put("name", entry.getKey());
+            item.put("value", entry.getValue());
+            result.add(item);
+        }
+        return result;
+    }
+
+    @Override
+    public List<Map<String, Object>> statisticsByStatus() {
+        List<HazardHiddenAccount> list = this.list();
+        Map<String, Long> grouped = list.stream()
+                .collect(Collectors.groupingBy(h -> h.getHazardStatus() != null ? h.getHazardStatus() : "未知", Collectors.counting()));
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (Map.Entry<String, Long> entry : grouped.entrySet()) {
+            Map<String, Object> item = new HashMap<>();
+            item.put("name", entry.getKey());
+            item.put("value", entry.getValue());
+            result.add(item);
+        }
+        return result;
+    }
+}

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

@@ -0,0 +1,38 @@
+package com.zksy.base.service.impl;
+
+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.ManholeBase;
+import com.zksy.base.dto.ManholePageInDTO;
+import com.zksy.base.mapper.ManholeBaseMapper;
+import com.zksy.base.service.ManholeBaseService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Slf4j
+@Service
+public class ManholeBaseServiceImpl extends ServiceImpl<ManholeBaseMapper, ManholeBase>
+        implements ManholeBaseService {
+
+    @Override
+    public Page<ManholeBase> findByPage(ManholePageInDTO dto) {
+        Page<ManholeBase> page = new Page<>(dto.getPageNum(), dto.getPageSize());
+        LambdaQueryWrapper<ManholeBase> wrapper = new LambdaQueryWrapper<>();
+        wrapper.like(dto.getManholeName() != null && !dto.getManholeName().isEmpty(), ManholeBase::getManholeName, dto.getManholeName());
+        wrapper.like(dto.getManholeCode() != null && !dto.getManholeCode().isEmpty(), ManholeBase::getManholeCode, dto.getManholeCode());
+        wrapper.eq(dto.getStatus() != null && !dto.getStatus().isEmpty(), ManholeBase::getStatus, dto.getStatus());
+        wrapper.orderByDesc(ManholeBase::getCreateTime);
+        return this.page(page, wrapper);
+    }
+
+    @Override
+    public List<ManholeBase> getOptions() {
+        LambdaQueryWrapper<ManholeBase> wrapper = new LambdaQueryWrapper<>();
+        wrapper.select(ManholeBase::getManholeId, ManholeBase::getManholeName, ManholeBase::getManholeCode);
+        wrapper.orderByAsc(ManholeBase::getManholeName);
+        return this.list(wrapper);
+    }
+}

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

@@ -0,0 +1,27 @@
+package com.zksy.base.service.impl;
+
+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.MonitorPoint;
+import com.zksy.base.dto.MonitorPointPageInDTO;
+import com.zksy.base.mapper.MonitorPointMapper;
+import com.zksy.base.service.MonitorPointService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class MonitorPointServiceImpl extends ServiceImpl<MonitorPointMapper, MonitorPoint>
+        implements MonitorPointService {
+
+    @Override
+    public Page<MonitorPoint> findByPage(MonitorPointPageInDTO dto) {
+        Page<MonitorPoint> page = new Page<>(dto.getPageNum(), dto.getPageSize());
+        LambdaQueryWrapper<MonitorPoint> wrapper = new LambdaQueryWrapper<>();
+        wrapper.like(dto.getPointName() != null && !dto.getPointName().isEmpty(), MonitorPoint::getPointName, dto.getPointName());
+        wrapper.eq(dto.getPointType() != null && !dto.getPointType().isEmpty(), MonitorPoint::getPointType, dto.getPointType());
+        wrapper.orderByDesc(MonitorPoint::getCreateTime);
+        return this.page(page, wrapper);
+    }
+}

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

@@ -0,0 +1,40 @@
+package com.zksy.base.service.impl;
+
+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.PipeNetworkBase;
+import com.zksy.base.dto.PipeNetworkPageInDTO;
+import com.zksy.base.mapper.PipeNetworkBaseMapper;
+import com.zksy.base.service.PipeNetworkBaseService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Slf4j
+@Service
+public class PipeNetworkBaseServiceImpl extends ServiceImpl<PipeNetworkBaseMapper, PipeNetworkBase>
+        implements PipeNetworkBaseService {
+
+    @Override
+    public Page<PipeNetworkBase> findByPage(PipeNetworkPageInDTO dto) {
+        Page<PipeNetworkBase> page = new Page<>(dto.getPageNum(), dto.getPageSize());
+        LambdaQueryWrapper<PipeNetworkBase> wrapper = new LambdaQueryWrapper<>();
+        wrapper.like(dto.getNetworkName() != null && !dto.getNetworkName().isEmpty(), PipeNetworkBase::getNetworkName, dto.getNetworkName());
+        wrapper.like(dto.getManagementUnit() != null && !dto.getManagementUnit().isEmpty(), PipeNetworkBase::getManagementUnit, dto.getManagementUnit());
+        wrapper.eq(dto.getNetworkLevel() != null && !dto.getNetworkLevel().isEmpty(), PipeNetworkBase::getNetworkLevel, dto.getNetworkLevel());
+        wrapper.like(dto.getMaterial() != null && !dto.getMaterial().isEmpty(), PipeNetworkBase::getMaterial, dto.getMaterial());
+        wrapper.eq(dto.getStatus() != null && !dto.getStatus().isEmpty(), PipeNetworkBase::getStatus, dto.getStatus());
+        wrapper.orderByDesc(PipeNetworkBase::getCreateTime);
+        return this.page(page, wrapper);
+    }
+
+    @Override
+    public List<PipeNetworkBase> getOptions() {
+        LambdaQueryWrapper<PipeNetworkBase> wrapper = new LambdaQueryWrapper<>();
+        wrapper.select(PipeNetworkBase::getNetworkId, PipeNetworkBase::getNetworkName, PipeNetworkBase::getNetworkCode);
+        wrapper.orderByAsc(PipeNetworkBase::getNetworkName);
+        return this.list(wrapper);
+    }
+}

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

@@ -0,0 +1,37 @@
+package com.zksy.base.service.impl;
+
+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.PipeRepairRecord;
+import com.zksy.base.dto.RepairRecordPageInDTO;
+import com.zksy.base.mapper.PipeRepairRecordMapper;
+import com.zksy.base.service.PipeRepairRecordService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Slf4j
+@Service
+public class PipeRepairRecordServiceImpl extends ServiceImpl<PipeRepairRecordMapper, PipeRepairRecord>
+        implements PipeRepairRecordService {
+
+    @Override
+    public Page<PipeRepairRecord> findByPage(RepairRecordPageInDTO dto) {
+        Page<PipeRepairRecord> page = new Page<>(dto.getPageNum(), dto.getPageSize());
+        LambdaQueryWrapper<PipeRepairRecord> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(dto.getNetworkId() != null && !dto.getNetworkId().isEmpty(), PipeRepairRecord::getNetworkId, dto.getNetworkId());
+        wrapper.eq(dto.getRepairType() != null && !dto.getRepairType().isEmpty(), PipeRepairRecord::getRepairType, dto.getRepairType());
+        wrapper.orderByDesc(PipeRepairRecord::getRepairDate);
+        return this.page(page, wrapper);
+    }
+
+    @Override
+    public List<PipeRepairRecord> listByNetworkId(String networkId) {
+        LambdaQueryWrapper<PipeRepairRecord> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(PipeRepairRecord::getNetworkId, networkId);
+        wrapper.orderByDesc(PipeRepairRecord::getRepairDate);
+        return this.list(wrapper);
+    }
+}

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

@@ -0,0 +1,73 @@
+package com.zksy.base.service.impl;
+
+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.PipeNetworkBase;
+import com.zksy.base.domain.RiskAssessment;
+import com.zksy.base.dto.RiskPageInDTO;
+import com.zksy.base.mapper.PipeNetworkBaseMapper;
+import com.zksy.base.mapper.RiskAssessmentMapper;
+import com.zksy.base.service.RiskAssessmentService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class RiskAssessmentServiceImpl extends ServiceImpl<RiskAssessmentMapper, RiskAssessment>
+        implements RiskAssessmentService {
+
+    @Autowired
+    private PipeNetworkBaseMapper pipeNetworkBaseMapper;
+
+    @Override
+    public Page<RiskAssessment> findByPage(RiskPageInDTO dto) {
+        Page<RiskAssessment> page = new Page<>(dto.getPageNum(), dto.getPageSize());
+        LambdaQueryWrapper<RiskAssessment> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(dto.getNetworkId() != null && !dto.getNetworkId().isEmpty(), RiskAssessment::getNetworkId, dto.getNetworkId());
+        wrapper.eq(dto.getRiskLevel() != null && !dto.getRiskLevel().isEmpty(), RiskAssessment::getRiskLevel, dto.getRiskLevel());
+        wrapper.orderByDesc(RiskAssessment::getAssessmentTime);
+        return this.page(page, wrapper);
+    }
+
+    @Override
+    public List<Map<String, Object>> getFourColorMapData() {
+        List<RiskAssessment> riskList = this.list(new LambdaQueryWrapper<RiskAssessment>()
+                .orderByDesc(RiskAssessment::getAssessmentTime));
+
+        Set<String> networkIds = riskList.stream()
+                .map(RiskAssessment::getNetworkId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+
+        List<PipeNetworkBase> pipeList = new ArrayList<>();
+        if (!networkIds.isEmpty()) {
+            pipeList = pipeNetworkBaseMapper.selectBatchIds(networkIds);
+        }
+        Map<String, PipeNetworkBase> pipeMap = pipeList.stream()
+                .collect(Collectors.toMap(PipeNetworkBase::getNetworkId, p -> p, (k1, k2) -> k1));
+
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (RiskAssessment risk : riskList) {
+            Map<String, Object> item = new HashMap<>();
+            item.put("riskId", risk.getRiskId());
+            item.put("networkId", risk.getNetworkId());
+            item.put("riskLevel", risk.getRiskLevel());
+            item.put("riskScore", risk.getRiskScore());
+            item.put("riskColor", risk.getRiskColor());
+            PipeNetworkBase pipe = pipeMap.get(risk.getNetworkId());
+            if (pipe != null) {
+                item.put("networkName", pipe.getNetworkName());
+                item.put("longitude", pipe.getLongitude());
+                item.put("latitude", pipe.getLatitude());
+                item.put("networkCode", pipe.getNetworkCode());
+            }
+            result.add(item);
+        }
+        return result;
+    }
+}

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

@@ -0,0 +1,28 @@
+package com.zksy.base.service.impl;
+
+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.StationVideoDevice;
+import com.zksy.base.mapper.StationVideoDeviceMapper;
+import com.zksy.base.service.StationVideoDeviceService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class StationVideoDeviceServiceImpl extends ServiceImpl<StationVideoDeviceMapper, StationVideoDevice>
+        implements StationVideoDeviceService {
+
+    @Override
+    public Page<StationVideoDevice> findByPage(long pageNum, long pageSize,
+                                               String deviceName, String stationId, String status) {
+        Page<StationVideoDevice> page = new Page<>(pageNum, pageSize);
+        LambdaQueryWrapper<StationVideoDevice> wrapper = new LambdaQueryWrapper<>();
+        wrapper.like(deviceName != null && !deviceName.isEmpty(), StationVideoDevice::getDeviceName, deviceName);
+        wrapper.eq(stationId != null && !stationId.isEmpty(), StationVideoDevice::getStationId, stationId);
+        wrapper.eq(status != null && !status.isEmpty(), StationVideoDevice::getStatus, status);
+        wrapper.orderByDesc(StationVideoDevice::getCreateTime);
+        return this.page(page, wrapper);
+    }
+}