浏览代码

Merge remote-tracking branch 'origin/master'

JX.Li 5 天之前
父节点
当前提交
902133d5d5
共有 32 个文件被更改,包括 1455 次插入219 次删除
  1. 27 0
      construction-ui/src/api/construction/lifeLine/eventSubject.js
  2. 840 0
      construction-ui/src/views/construction/lifeLine/eventSubject/eventDetailDialog.vue
  3. 235 181
      construction-ui/src/views/construction/lifeLine/eventSubject/index.vue
  4. 1 0
      src/main/java/com/sooka/sponest/construction/bridge/domain/BridgeInspectionTaskRecord.java
  5. 2 0
      src/main/java/com/sooka/sponest/construction/bridge/mapper/BridgeInspectionTaskRecordMapper.java
  6. 2 0
      src/main/java/com/sooka/sponest/construction/bridge/service/IBridgeInspectionTaskRecordService.java
  7. 4 0
      src/main/java/com/sooka/sponest/construction/bridge/service/impl/BridgeInspectionTaskRecordServiceImpl.java
  8. 1 0
      src/main/java/com/sooka/sponest/construction/drainage/domain/DrainageInspectionTaskRecord.java
  9. 2 0
      src/main/java/com/sooka/sponest/construction/drainage/mapper/DrainageInspectionTaskRecordMapper.java
  10. 2 0
      src/main/java/com/sooka/sponest/construction/drainage/service/IDrainageInspectionTaskRecordService.java
  11. 4 0
      src/main/java/com/sooka/sponest/construction/drainage/service/impl/DrainageInspectionTaskRecordServiceImpl.java
  12. 1 0
      src/main/java/com/sooka/sponest/construction/gas/domain/GasInspectionTaskRecord.java
  13. 2 0
      src/main/java/com/sooka/sponest/construction/gas/mapper/GasInspectionTaskRecordMapper.java
  14. 2 0
      src/main/java/com/sooka/sponest/construction/gas/service/IGasInspectionTaskRecordService.java
  15. 4 0
      src/main/java/com/sooka/sponest/construction/gas/service/impl/GasInspectionTaskRecordServiceImpl.java
  16. 57 6
      src/main/java/com/sooka/sponest/construction/heating/controller/HeatingViewController.java
  17. 2 0
      src/main/java/com/sooka/sponest/construction/heating/domain/HeatingPipeInspectionTask.java
  18. 18 3
      src/main/java/com/sooka/sponest/construction/lifeLine/event/service/impl/LifeLineEventSubjectServiceImpl.java
  19. 28 15
      src/main/java/com/sooka/sponest/construction/lifeLine/event/service/impl/LifeLineEventViewServiceImpl.java
  20. 62 0
      src/main/java/com/sooka/sponest/construction/utilityTunnel/controller/UtilityTunnelViewController.java
  21. 1 0
      src/main/java/com/sooka/sponest/construction/waterSupply/domain/WaterInspectionTaskRecord.java
  22. 2 0
      src/main/java/com/sooka/sponest/construction/waterSupply/mapper/WaterInspectionTaskRecordMapper.java
  23. 2 0
      src/main/java/com/sooka/sponest/construction/waterSupply/service/IWaterInspectionTaskRecordService.java
  24. 4 0
      src/main/java/com/sooka/sponest/construction/waterSupply/service/impl/WaterInspectionTaskRecordServiceImpl.java
  25. 35 2
      src/main/resources/mapper/construction/bridge/BridgeInspectionTaskRecordMapper.xml
  26. 33 0
      src/main/resources/mapper/construction/drainage/DrainageInspectionTaskRecordMapper.xml
  27. 33 0
      src/main/resources/mapper/construction/gas/GasInspectionTaskRecordMapper.xml
  28. 1 3
      src/main/resources/mapper/construction/gas/GasPipeMapper.xml
  29. 1 1
      src/main/resources/mapper/construction/heating/HeatingInspectionTaskRecordMapper.xml
  30. 8 2
      src/main/resources/mapper/construction/lifeLine/event/LifeLineEventSubjectMapper.xml
  31. 6 6
      src/main/resources/mapper/construction/utilityTunnel/UtilityTunnelInspectionTaskRecordMapper.xml
  32. 33 0
      src/main/resources/mapper/construction/waterSupply/WaterInspectionTaskRecordMapper.xml

+ 27 - 0
construction-ui/src/api/construction/lifeLine/eventSubject.js

@@ -42,3 +42,30 @@ export function dellifeLineEventSubject(eventId) {
     method: 'delete'
   })
 }
+
+//催办事件
+export function updateExpedite(data){
+  return request({
+    url: '/sooka-digital-construction/life-line-event-view/expediteLifeLineEvent',
+    method: 'post',
+    data: data
+  })
+}
+
+//督办事件
+export function updateSupervise(data){
+  return request({
+    url: '/sooka-digital-construction/life-line-event-view/superviseLifeLineEvent',
+    method: 'post',
+    data: data
+  })
+}
+
+//催办且督办事件
+export function updateExpediteAndSupervise(data){
+  return request({
+    url: '/sooka-digital-construction/life-line-event-view/expediteAndSuperviseLifeLineEvent',
+    method: 'post',
+    data: data
+  })
+}

+ 840 - 0
construction-ui/src/views/construction/lifeLine/eventSubject/eventDetailDialog.vue

@@ -0,0 +1,840 @@
+<template>
+  <el-dialog
+    :title="'事件详情 - ' + (detailData.eventTitle || '')"
+    :visible.sync="dialogVisible"
+    width="900px"
+    @close="handleClose"
+  >
+    <el-tabs v-model="activeTab">
+      <!-- 事件详情页签 -->
+      <el-tab-pane label="事件详情" name="detail">
+        <div class="detail-content">
+          <!-- 基本信息卡片 -->
+          <el-card class="detail-card" shadow="never">
+            <div slot="header" class="card-header">
+              <span class="card-title">基本信息</span>
+            </div>
+            <el-descriptions :column="2" size="medium">
+              <el-descriptions-item label="事件标识">
+                <span class="text-value">{{ detailData.eventId || '--' }}</span>
+              </el-descriptions-item>
+
+              <el-descriptions-item label="事件标题">
+                <span class="text-value">{{ detailData.eventTitle || '--' }}</span>
+              </el-descriptions-item>
+
+              <el-descriptions-item label="事件状态">
+                <el-tag :type="getStatusType(detailData.eventStatus)" size="small">
+                  {{ detailData.eventStatusLabel || '--' }}
+                </el-tag>
+              </el-descriptions-item>
+
+              <el-descriptions-item label="所属行业">
+                <span class="text-value">{{ detailData.industryLabel || '--' }}</span>
+              </el-descriptions-item>
+
+              <el-descriptions-item label="事件大类">
+                <span class="text-value">{{ detailData.eventTypeDlLabel || detailData.eventTypeDl || '--' }}</span>
+              </el-descriptions-item>
+
+              <el-descriptions-item label="事件小类">
+                <span class="text-value">{{ detailData.eventTypeXlLabel || detailData.eventTypeXl || '--' }}</span>
+              </el-descriptions-item>
+
+              <el-descriptions-item label="是否催办">
+                <el-tag :type="detailData.expediteStatus === '1' ? 'danger' : 'info'" size="small">
+                  {{ detailData.expediteStatus === '1' ? '已催办' : '未催办' }}
+                </el-tag>
+              </el-descriptions-item>
+
+              <el-descriptions-item label="是否督办">
+                <el-tag :type="detailData.superviseStatus === '1' ? 'warning' : 'info'" size="small">
+                  {{ detailData.superviseStatus === '1' ? '已督办' : '未督办' }}
+                </el-tag>
+              </el-descriptions-item>
+            </el-descriptions>
+          </el-card>
+
+          <!-- 位置信息卡片 -->
+          <el-card class="detail-card" shadow="never">
+            <div slot="header" class="card-header">
+              <span class="card-title">位置信息</span>
+            </div>
+            <el-descriptions :column="2" size="medium">
+              <el-descriptions-item label="经度">
+                <span class="text-value">{{ detailData.longitude || '--' }}</span>
+              </el-descriptions-item>
+
+              <el-descriptions-item label="纬度">
+                <span class="text-value">{{ detailData.latitude || '--' }}</span>
+              </el-descriptions-item>
+
+<!--              <el-descriptions-item label="事件来源">
+                <span class="text-value">{{ getEventSourceLabel(detailData.eventSource) }}</span>
+              </el-descriptions-item>-->
+
+              <el-descriptions-item label="业务ID">
+                <span class="text-value">{{ detailData.busId || '--' }}</span>
+              </el-descriptions-item>
+            </el-descriptions>
+          </el-card>
+
+          <!-- 时间信息卡片 -->
+          <el-card class="detail-card" shadow="never">
+            <div slot="header" class="card-header">
+              <span class="card-title">时间信息</span>
+            </div>
+            <el-descriptions :column="2" size="medium">
+              <el-descriptions-item label="上报时间">
+                <span class="text-value time-value">{{ formatFullTime(detailData.createTime) }}</span>
+              </el-descriptions-item>
+
+              <el-descriptions-item label="上报人">
+                <span class="text-value">{{ detailData.createName || detailData.createBy || '--' }}</span>
+              </el-descriptions-item>
+
+              <el-descriptions-item label="更新时间">
+                <span class="text-value time-value">{{ formatFullTime(detailData.updateTime) || '--' }}</span>
+              </el-descriptions-item>
+
+              <el-descriptions-item label="更新人">
+                <span class="text-value">{{ detailData.updateName || detailData.updateBy || '--' }}</span>
+              </el-descriptions-item>
+            </el-descriptions>
+          </el-card>
+
+          <!-- 事件描述卡片 -->
+          <el-card class="detail-card" shadow="never">
+            <div slot="header" class="card-header">
+              <span class="card-title">事件描述</span>
+            </div>
+            <div class="event-description">
+              <pre>{{ detailData.eventDescription || '暂无描述' }}</pre>
+            </div>
+          </el-card>
+
+          <!-- 备注信息 -->
+          <el-card v-if="detailData.remark" class="detail-card" shadow="never">
+            <div slot="header" class="card-header">
+              <span class="card-title">备注</span>
+            </div>
+            <div class="remark-content">
+              {{ detailData.remark }}
+            </div>
+          </el-card>
+        </div>
+      </el-tab-pane>
+
+      <!-- 事件日志页签 -->
+      <el-tab-pane label="事件日志" name="log">
+        <div class="log-content">
+          <el-timeline v-if="eventLogData.length > 0">
+            <el-timeline-item
+              v-for="(log, index) in sortedEventLogs"
+              :key="log.logId || index"
+              :timestamp="formatTime(log.createTime)"
+              :type="getLogType(log)"
+              :color="getLogColor(log)"
+              :icon="getLogIcon(log)"
+              placement="top"
+              size="large"
+            >
+              <el-card class="log-card" shadow="hover">
+                <!-- 日志头部 -->
+                <div class="log-header">
+                  <div class="log-user">
+                    <el-avatar size="small" :src="getUserAvatar(log)" class="user-avatar">
+                      {{ getAvatarText(log.createName || log.createBy) }}
+                    </el-avatar>
+                    <span class="user-name">{{ log.createName || log.createBy || '未知用户' }}</span>
+                    <el-tag
+                      v-if="getLogTag(log)"
+                      :type="getLogTagType(log)"
+                      size="mini"
+                      class="log-tag"
+                    >
+                      {{ getLogTag(log) }}
+                    </el-tag>
+                  </div>
+                  <span class="log-time">{{ formatFullTime(log.createTime) }}</span>
+                </div>
+
+                <!-- 日志内容 -->
+                <div class="log-body">
+                  <div class="log-text">{{ log.logContent || '--' }}</div>
+
+                  <!-- 图片附件 -->
+                  <div v-if="hasImages(log)" class="image-section">
+                    <div class="section-title">
+                      <i class="el-icon-picture"></i>
+                      <span>图片附件</span>
+                    </div>
+                    <div class="image-grid">
+                      <div
+                        v-for="(attach, imgIndex) in getImages(log)"
+                        :key="imgIndex"
+                        class="image-item"
+                        @click="handlePreviewImage(log, imgIndex)"
+                      >
+                        <el-image
+                          :src="getImageUrl(attach)"
+                          fit="cover"
+                          class="preview-image"
+                          :preview-src-list="getImagePreviewList(log)"
+                        >
+                          <div slot="error" class="image-error">
+                            <i class="el-icon-picture-outline"></i>
+                          </div>
+                          <div slot="placeholder" class="image-loading">
+                            <i class="el-icon-loading"></i>
+                          </div>
+                        </el-image>
+                        <div class="image-toolbar" v-if="getImageCount(log) > 1">
+                          <span class="image-index">{{ imgIndex + 1 }}</span>
+                        </div>
+                      </div>
+                    </div>
+                    <div class="image-count" v-if="getImageCount(log) > 1">
+                      共 {{ getImageCount(log) }} 张图片
+                    </div>
+                  </div>
+
+                  <!-- 其他附件(如果有的话) -->
+                  <div v-if="hasOtherAttachments(log)" class="attachment-section">
+                    <div class="section-title">
+                      <i class="el-icon-document"></i>
+                      <span>其他附件</span>
+                    </div>
+                    <div class="attachment-list">
+                      <div
+                        v-for="(attach, attachIndex) in getOtherAttachments(log)"
+                        :key="attachIndex"
+                        class="attachment-item"
+                        @click="handleDownloadAttach(attach)"
+                      >
+                        <i class="el-icon-document attachment-icon"></i>
+                        <span class="attachment-name">{{ getFileName(attach) }}</span>
+                        <i class="el-icon-download download-icon"></i>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+
+                <!-- 日志底部 -->
+                <div class="log-footer">
+                  <span class="log-id">日志标识: {{ log.logId }}</span>
+                </div>
+              </el-card>
+            </el-timeline-item>
+          </el-timeline>
+
+          <!-- 空状态 -->
+          <div v-else class="empty-log">
+            <el-empty
+              description="暂无事件日志"
+              image="https://shadow.elemecdn.com/app/element/hamburger.9cf7b091-55e9-11e9-a976-7f4d0b07eef6.png"
+            >
+              <el-button type="primary" size="small" @click="activeTab = 'detail'">查看事件详情</el-button>
+            </el-empty>
+          </div>
+        </div>
+      </el-tab-pane>
+    </el-tabs>
+
+    <!-- 操作按钮 -->
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="dialogVisible = false">关 闭</el-button>
+<!--      <el-button
+        type="primary"
+        v-if="hasImagesInLogs"
+        @click="handleExportImages"
+      >
+        导出所有图片
+      </el-button>-->
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  name: 'EventDetailDialog',
+
+  data() {
+    return {
+      dialogVisible: false,
+      activeTab: 'detail',
+      detailData: {},
+      eventLogData: [],
+
+      // 事件来源映射
+      eventSourceMap: {
+        'life_line_test': '生命线测试',
+        'life_line_system': '生命线系统',
+        'manual_report': '人工上报',
+        'ai_detection': 'AI检测',
+        'iot_device': '物联网设备'
+      },
+    }
+  },
+
+  computed: {
+    // 按创建时间倒序排序的事件日志
+    sortedEventLogs() {
+      return [...this.eventLogData].sort((a, b) => {
+        return new Date(b.createTime) - new Date(a.createTime)
+      })
+    },
+
+    // 检查日志中是否有图片
+    hasImagesInLogs() {
+      return this.eventLogData.some(log => this.hasImages(log))
+    },
+  },
+
+  methods: {
+    // 打开对话框
+    open(data) {
+      if (data && data.data) {
+        this.detailData = data.data.detail || {}
+        this.eventLogData = data.data.eventLog || []
+        this.dialogVisible = true
+        this.activeTab = 'detail'
+      }
+    },
+
+    // 关闭对话框
+    handleClose() {
+      this.detailData = {}
+      this.eventLogData = []
+    },
+
+    // 格式化时间(时间轴用)
+    formatTime(time) {
+      if (!time) return '--'
+      const date = new Date(time)
+      const now = new Date()
+      const diff = now - date
+
+      // 今天
+      if (date.toDateString() === now.toDateString()) {
+        return date.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' })
+      }
+
+      // 昨天
+      const yesterday = new Date(now)
+      yesterday.setDate(yesterday.getDate() - 1)
+      if (date.toDateString() === yesterday.toDateString()) {
+        return '昨天 ' + date.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' })
+      }
+
+      // 一周内
+      if (diff < 7 * 24 * 60 * 60 * 1000) {
+        const days = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
+        return days[date.getDay()] + ' ' + date.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' })
+      }
+
+      // 更早时间
+      return date.toLocaleDateString('zh-CN', { month: 'short', day: 'numeric' })
+    },
+
+    // 格式化完整时间
+    formatFullTime(time) {
+      if (!time) return '--'
+      const date = new Date(time)
+      return date.toLocaleString('zh-CN', {
+        year: 'numeric',
+        month: '2-digit',
+        day: '2-digit',
+        hour: '2-digit',
+        minute: '2-digit',
+        second: '2-digit'
+      })
+    },
+
+    // 获取事件来源标签
+    getEventSourceLabel(source) {
+      return this.eventSourceMap[source] || source || '--'
+    },
+
+    // 获取事件状态标签类型
+    getStatusType(status) {
+      const map = {
+        'event_report': 'primary',      // 上报 - 蓝色
+        'event_processing': 'warning',  // 处理中 - 橙色
+        'event_completed': 'success',   // 已完成 - 绿色
+        'event_closed': 'info',         // 已关闭 - 灰色
+        'event_cancelled': 'danger'     // 已取消 - 红色
+      }
+      return map[status] || ''
+    },
+
+    // 获取日志图标
+    getLogIcon(log) {
+      const content = log.logContent || ''
+      if (content.includes('催办')) return 'el-icon-warning'
+      if (content.includes('督办')) return 'el-icon-s-flag'
+      if (content.includes('上报')) return 'el-icon-upload'
+      if (content.includes('完成')) return 'el-icon-check'
+      return 'el-icon-chat-line-round'
+    },
+
+    // 获取日志类型(用于时间轴)
+    getLogType(log) {
+      const content = log.logContent || ''
+      if (content.includes('催办')) return 'danger'
+      if (content.includes('督办')) return 'warning'
+      if (content.includes('上报')) return 'primary'
+      if (content.includes('完成')) return 'success'
+      return ''
+    },
+
+    // 获取日志颜色
+    getLogColor(log) {
+      const content = log.logContent || ''
+      if (content.includes('催办')) return '#f56c6c'     // 红色
+      if (content.includes('督办')) return '#e6a23c'     // 橙色
+      if (content.includes('上报')) return '#409eff'     // 蓝色
+      if (content.includes('完成')) return '#67c23a'     // 绿色
+      return '#909399'                                  // 灰色
+    },
+
+    // 获取日志标签
+    getLogTag(log) {
+      const content = log.logContent || ''
+      if (content.includes('催办')) return '催办'
+      if (content.includes('督办')) return '督办'
+      if (content.includes('上报')) return '上报'
+      if (content.includes('完成')) return '完成'
+      if (content.includes('处理')) return '处理中'
+      if (content.includes('转办')) return '转办'
+      return null
+    },
+
+    // 获取日志标签类型
+    getLogTagType(log) {
+      const content = log.logContent || ''
+      if (content.includes('催办')) return 'danger'
+      if (content.includes('督办')) return 'warning'
+      if (content.includes('上报')) return 'primary'
+      if (content.includes('完成')) return 'success'
+      return 'info'
+    },
+
+    // 获取用户头像
+    getUserAvatar(log) {
+      // 这里可以根据用户信息返回头像URL
+      return ''
+    },
+
+    // 获取头像文本
+    getAvatarText(name) {
+      if (!name) return '?'
+      if (name.length >= 2) {
+        return name.substring(name.length - 2)
+      }
+      return name.charAt(0)
+    },
+
+    // 检查日志是否有图片
+    hasImages(log) {
+      const attachments = log.logAttachList || []
+      return attachments.some(item => this.isImage(item))
+    },
+
+    // 获取日志中的图片列表
+    getImages(log) {
+      const attachments = log.logAttachList || []
+      return attachments.filter(item => this.isImage(item))
+    },
+
+    // 获取图片数量
+    getImageCount(log) {
+      return this.getImages(log).length
+    },
+
+    // 获取图片预览列表
+    getImagePreviewList(log) {
+      return this.getImages(log).map(item => this.getImageUrl(item))
+    },
+
+    // 检查是否有其他附件
+    hasOtherAttachments(log) {
+      const attachments = log.logAttachList || []
+      return attachments.some(item => !this.isImage(item))
+    },
+
+    // 获取其他附件列表
+    getOtherAttachments(log) {
+      const attachments = log.logAttachList || []
+      return attachments.filter(item => !this.isImage(item))
+    },
+
+    // 判断是否为图片
+    isImage(attachment) {
+      if (!attachment) return false
+
+      // 根据你的数据结构,判断attachPath是否是图片
+      const path = attachment.attachPath || ''
+      const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp']
+
+      return imageExtensions.some(ext =>
+        path.toLowerCase().endsWith(ext)
+      )
+    },
+
+    // 获取图片URL
+    getImageUrl(attachment) {
+      if (!attachment) return ''
+      return attachment.attachPath || ''
+    },
+
+    // 获取文件名
+    getFileName(attachment) {
+      if (!attachment) return '未知文件'
+
+      // 优先使用fileName
+      if (attachment.fileName) {
+        return attachment.fileName
+      }
+
+      // 从attachPath中提取文件名
+      if (attachment.attachPath) {
+        const path = attachment.attachPath
+        const parts = path.split('/')
+        return parts[parts.length - 1]
+      }
+
+      return '未知文件'
+    },
+
+    // 预览图片
+    handlePreviewImage(log, index) {
+      const images = this.getImages(log)
+      if (images[index]) {
+        // el-image会自动处理预览,这里不需要额外操作
+      }
+    },
+
+    // 下载附件
+    handleDownloadAttach(attach) {
+      const url = this.getImageUrl(attach) || attach.attachPath
+      const fileName = this.getFileName(attach)
+
+      if (url) {
+        // 创建下载链接
+        const link = document.createElement('a')
+        link.href = url
+        link.download = fileName
+        link.target = '_blank'
+        document.body.appendChild(link)
+        link.click()
+        document.body.removeChild(link)
+      } else {
+        this.$message.warning('无法获取附件链接')
+      }
+    },
+
+    // 导出所有图片
+    handleExportImages() {
+      const allImages = []
+
+      this.eventLogData.forEach(log => {
+        const images = this.getImages(log)
+        images.forEach(img => {
+          allImages.push({
+            url: this.getImageUrl(img),
+            name: this.getFileName(img),
+            logTime: log.createTime,
+            userName: log.createName || log.createBy
+          })
+        })
+      })
+
+      if (allImages.length === 0) {
+        this.$message.warning('没有找到可导出的图片')
+        return
+      }
+
+      // 这里可以实现批量下载逻辑
+      this.$message.success(`找到 ${allImages.length} 张图片,导出功能开发中`)
+      console.log('待导出的图片列表:', allImages)
+    }
+  }
+}
+</script>
+
+<style scoped>
+.detail-content {
+  max-height: 500px;
+  overflow-y: auto;
+  padding-right: 5px;
+}
+
+.detail-card {
+  margin-bottom: 15px;
+  border-radius: 8px;
+}
+
+.detail-card:last-child {
+  margin-bottom: 0;
+}
+
+.card-header {
+  display: flex;
+  align-items: center;
+}
+
+.card-title {
+  font-weight: 600;
+  color: #303133;
+}
+
+.text-value {
+  color: #606266;
+}
+
+.time-value {
+  color: #909399;
+  font-family: monospace;
+}
+
+.event-description {
+  padding: 5px 0;
+}
+
+.event-description pre {
+  margin: 0;
+  white-space: pre-wrap;
+  word-break: break-word;
+  line-height: 1.6;
+  color: #606266;
+  font-family: inherit;
+}
+
+.remark-content {
+  color: #909399;
+  line-height: 1.6;
+}
+
+/* 日志样式 */
+.log-content {
+  max-height: 500px;
+  overflow-y: auto;
+  padding-right: 5px;
+}
+
+.log-card {
+  margin: 10px 0;
+  border: none;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1) !important;
+}
+
+.log-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 12px;
+  padding-bottom: 10px;
+  border-bottom: 1px solid #f0f0f0;
+}
+
+.log-user {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+}
+
+.user-avatar {
+  background-color: #409eff;
+  color: white;
+}
+
+.user-name {
+  font-weight: 500;
+  color: #303133;
+}
+
+.log-tag {
+  margin-left: 5px;
+}
+
+.log-time {
+  font-size: 12px;
+  color: #909399;
+}
+
+.log-body {
+  margin-bottom: 12px;
+}
+
+.log-text {
+  color: #606266;
+  line-height: 1.6;
+  margin-bottom: 15px;
+}
+
+/* 图片部分 */
+.image-section {
+  margin-top: 15px;
+}
+
+.section-title {
+  display: flex;
+  align-items: center;
+  gap: 6px;
+  margin-bottom: 10px;
+  font-size: 14px;
+  color: #303133;
+  font-weight: 500;
+}
+
+.section-title i {
+  color: #409eff;
+}
+
+.image-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
+  gap: 10px;
+}
+
+.image-item {
+  position: relative;
+  height: 100px;
+  border-radius: 6px;
+  overflow: hidden;
+  cursor: pointer;
+  transition: transform 0.2s;
+}
+
+.image-item:hover {
+  transform: scale(1.03);
+}
+
+.preview-image {
+  width: 100%;
+  height: 100%;
+  object-fit: cover;
+}
+
+.image-error,
+.image-loading {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  background-color: #f5f7fa;
+  color: #909399;
+  font-size: 24px;
+}
+
+.image-toolbar {
+  position: absolute;
+  bottom: 5px;
+  right: 5px;
+  background: rgba(0, 0, 0, 0.6);
+  color: white;
+  border-radius: 12px;
+  padding: 2px 8px;
+  font-size: 12px;
+}
+
+.image-count {
+  margin-top: 8px;
+  font-size: 12px;
+  color: #909399;
+  text-align: center;
+}
+
+/* 附件部分 */
+.attachment-section {
+  margin-top: 15px;
+}
+
+.attachment-list {
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+}
+
+.attachment-item {
+  display: flex;
+  align-items: center;
+  padding: 8px 12px;
+  background-color: #f8f9fa;
+  border-radius: 6px;
+  cursor: pointer;
+  transition: background-color 0.2s;
+}
+
+.attachment-item:hover {
+  background-color: #e9ecef;
+}
+
+.attachment-icon {
+  color: #409eff;
+  margin-right: 8px;
+}
+
+.attachment-name {
+  flex: 1;
+  font-size: 14px;
+  color: #606266;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.download-icon {
+  color: #909399;
+}
+
+.log-footer {
+  padding-top: 10px;
+  border-top: 1px solid #f0f0f0;
+}
+
+.log-id {
+  font-size: 11px;
+  color: #b0b0b0;
+}
+
+/* 空状态 */
+.empty-log {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  height: 300px;
+}
+
+/* 页脚 */
+.dialog-footer {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+/* 滚动条美化 */
+.detail-content::-webkit-scrollbar,
+.log-content::-webkit-scrollbar {
+  width: 6px;
+}
+
+.detail-content::-webkit-scrollbar-track,
+.log-content::-webkit-scrollbar-track {
+  background: #f1f1f1;
+  border-radius: 3px;
+}
+
+.detail-content::-webkit-scrollbar-thumb,
+.log-content::-webkit-scrollbar-thumb {
+  background: #c1c1c1;
+  border-radius: 3px;
+}
+
+.detail-content::-webkit-scrollbar-thumb:hover,
+.log-content::-webkit-scrollbar-thumb:hover {
+  background: #a8a8a8;
+}
+</style>

+ 235 - 181
construction-ui/src/views/construction/lifeLine/eventSubject/index.vue

@@ -1,127 +1,119 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="事件标题" prop="eventTitle">
-        <el-input
-          v-model="queryParams.eventTitle"
-          placeholder="请输入事件标题"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="事件大类" prop="eventTypeDl">
-        <el-input
-          v-model="queryParams.eventTypeDl"
-          placeholder="请输入事件大类"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="事件小类" prop="eventTypeXl">
-        <el-input
-          v-model="queryParams.eventTypeXl"
-          placeholder="请输入事件小类"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="事件来源" prop="eventSource">
-        <el-input
-          v-model="queryParams.eventSource"
-          placeholder="请输入事件来源"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="创建人" prop="createName">
-        <el-input
-          v-model="queryParams.createName"
-          placeholder="请输入创建人"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="经度" prop="longitude">
-        <el-input
-          v-model="queryParams.longitude"
-          placeholder="请输入经度"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="纬度" prop="latitude">
-        <el-input
-          v-model="queryParams.latitude"
-          placeholder="请输入纬度"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
-      </el-form-item>
-    </el-form>
+      <el-row>
+        <el-col :span="6">
+          <el-form-item label="事件标题" prop="eventTitle">
+            <el-input
+              v-model="queryParams.eventTitle"
+              placeholder="请输入事件标题"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="是否催办" prop="expediteStatus">
+            <el-select
+              v-model="queryParams.expediteStatus"
+              placeholder="请选择催办状态"
+              clearable
+              filterable
+              size="small"
+              style="width: 100%"
+            >
+              <el-option label="全部" value="" />
+              <el-option label="已催办" value="1" />
+              <el-option label="未催办" value="0" />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="是否督办" prop="superviseStatus">
+            <el-select
+              v-model="queryParams.superviseStatus"
+              placeholder="请选择督办状态"
+              clearable
+              filterable
+              size="small"
+              style="width: 100%"
+            >
+              <el-option label="全部" value="" />
+              <el-option label="已督办" value="1" />
+              <el-option label="未督办" value="0" />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="所属行业" prop="industry">
+            <el-select v-model="queryParams.industry" placeholder="请选择行业">
+              <el-option
+                v-for="dict in dict.type.lifeline_industry"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="6">
+          <el-form-item label="事件大类" prop="eventTypeDl">
+            <el-select
+              v-model="queryParams.eventTypeDl"
+              placeholder="请选择事件大类"
+              clearable
+              size="small"
+              style="width: 100%"
+              @change="handleParentTypeChange"
+            >
+              <el-option label="全部" value="" />
+              <el-option
+                v-for="item in parentEventTypes"
+                :key="item.typeId"
+                :label="item.eventTypeName"
+                :value="item.eventTypeCode"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="事件小类" prop="eventTypeXl">
+            <el-select
+              v-model="queryParams.eventTypeXl"
+              placeholder="请先选择大类"
+              clearable
+              size="small"
+              style="width: 100%"
+              :disabled="!queryParams.eventTypeDl"
+            >
+              <el-option label="全部" value="" />
+              <el-option
+                v-for="item in childEventTypes"
+                :key="item.typeId"
+                :label="item.eventTypeName"
+                :value="item.eventTypeCode"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+
+        </el-col>
+        <el-col :span="6">
+          <el-form-item>
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+          </el-form-item>
+        </el-col>
+      </el-row>
 
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAdd"
-          v-hasPermi="['sooka-digital-construction:lifeLineEventSubject:add']"
-        >新增
-        </el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="success"
-          plain
-          icon="el-icon-edit"
-          size="mini"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['sooka-digital-construction:lifeLineEventSubject:edit']"
-        >修改
-        </el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="el-icon-delete"
-          size="mini"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['sooka-digital-construction:lifeLineEventSubject:remove']"
-        >删除
-        </el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="warning"
-          plain
-          icon="el-icon-download"
-          size="mini"
-          @click="handleExport"
-          v-hasPermi="['sooka-digital-construction:lifeLineEventSubject:export']"
-        >导出
-        </el-button>
-      </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
+    </el-form>
 
-    <el-table v-loading="loading" :data="lifeLineEventSubjectList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center"/>
+    <el-table v-loading="loading" :data="lifeLineEventSubjectList">
+<!--      <el-table-column type="selection" width="55" align="center"/>-->
       <el-table-column label="事件标题" align="center" prop="eventTitle"/>
       <el-table-column label="事件描述" align="center" prop="eventDescription"/>
       <el-table-column label="事件大类" align="center" prop="eventTypeDlLabel"/>
@@ -137,18 +129,37 @@
           <el-button
             size="mini"
             type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
+            icon="el-icon-s-promotion"
+            @click="handleUpdateExpedite(scope.row.eventId)"
             v-hasPermi="['sooka-digital-construction:lifeLineEventSubject:edit']"
-          >修改
+            v-if="scope.row.expediteStatus === '0'"
+          >催办
           </el-button>
           <el-button
             size="mini"
             type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['sooka-digital-construction:lifeLineEventSubject:remove']"
-          >删除
+            icon="el-icon-view"
+            @click="handleUpdateSupervise(scope.row.eventId)"
+            v-hasPermi="['sooka-digital-construction:lifeLineEventSubject:edit']"
+            v-if="scope.row.superviseStatus === '0'"
+          >督办
+          </el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-warning-outline"
+            @click="handleUpdateExpediteAndSupervise(scope.row.eventId)"
+            v-hasPermi="['sooka-digital-construction:lifeLineEventSubject:edit']"
+            v-if="scope.row.superviseStatus === '0' && scope.row.expediteStatus === '0'"
+          >催办且督办
+          </el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-reading"
+            @click="getDetail(scope.row.eventId)"
+            v-hasPermi="['sooka-digital-construction:lifeLineEventSubject:edit']"
+          >事件详情
           </el-button>
         </template>
       </el-table-column>
@@ -162,55 +173,30 @@
       @pagination="getList"
     />
 
-    <!-- 添加或修改生命线-事件主体对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="事件标题" prop="eventTitle">
-          <el-input v-model="form.eventTitle" placeholder="请输入事件标题"/>
-        </el-form-item>
-        <el-form-item label="事件描述" prop="eventDescription">
-          <el-input v-model="form.eventDescription" type="textarea" placeholder="请输入内容"/>
-        </el-form-item>
-        <el-form-item label="事件大类" prop="eventTypeDl">
-          <el-input v-model="form.eventTypeDl" placeholder="请输入事件大类"/>
-        </el-form-item>
-        <el-form-item label="事件小类" prop="eventTypeXl">
-          <el-input v-model="form.eventTypeXl" placeholder="请输入事件小类"/>
-        </el-form-item>
-        <el-form-item label="事件来源" prop="eventSource">
-          <el-input v-model="form.eventSource" placeholder="请输入事件来源"/>
-        </el-form-item>
-        <el-form-item label="创建人" prop="createName">
-          <el-input v-model="form.createName" placeholder="请输入创建人"/>
-        </el-form-item>
-        <el-form-item label="经度" prop="longitude">
-          <el-input v-model="form.longitude" placeholder="请输入经度"/>
-        </el-form-item>
-        <el-form-item label="纬度" prop="latitude">
-          <el-input v-model="form.latitude" placeholder="请输入纬度"/>
-        </el-form-item>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
-      </div>
-    </el-dialog>
+    <event-detail-dialog ref="eventDetailDialog"/>
   </div>
 </template>
 
 <script>
+import EventDetailDialog from './eventDetailDialog.vue'
 import {
-  addlifeLineEventSubject,
-  dellifeLineEventSubject,
   getlifeLineEventSubject,
-  listlifeLineEventSubject,
-  updatelifeLineEventSubject
+  listlifeLineEventSubject, updateExpedite, updateExpediteAndSupervise,
+  updateSupervise
 } from "@/api/construction/lifeLine/eventSubject";
+import {treeselect} from "@/api/construction/lifeLine/lifeLineEventType";
 
 export default {
   name: "lifeLineEventSubject",
+  dicts: ['lifeline_industry'],
   data() {
     return {
+      // 显示用的事件类型数据
+      lifeLineEventTypeOptions:[],
+      // 父级事件类型列表(只包含第一级)
+      parentEventTypes: [],
+      // 子级事件类型列表(根据父级选择动态更新)
+      childEventTypes: [],
       // 遮罩层
       loading: true,
       // 选中数组
@@ -234,15 +220,12 @@ export default {
         pageNum: 1,
         pageSize: 10,
         eventTitle: null,
-        eventDescription: null,
         eventTypeDl: null,
         eventTypeXl: null,
-        eventSource: null,
-        createName: null,
-        longitude: null,
-        latitude: null,
+        expediteStatus: null,
         eventStatus: null,
-        expediteStatus: null
+        superviseStatus: null,
+        industry: null,
       },
       // 表单参数
       form: {},
@@ -254,10 +237,81 @@ export default {
       }
     };
   },
+  components: {
+    EventDetailDialog
+  },
   created() {
     this.getList();
+    this.getTreeselect();
   },
   methods: {
+    handleUpdateExpedite(eventId){
+      let o ={"eventId":eventId}
+      updateExpedite(o).then(res=>{
+        if(res.code === 200){
+          this.getList();
+        }
+      })
+    },
+    handleUpdateSupervise(eventId){
+      let o ={"eventId":eventId}
+      updateSupervise(o).then(res=>{
+        if(res.code === 200){
+          this.getList();
+        }
+      })
+    },
+    handleUpdateExpediteAndSupervise(eventId){
+      let o ={"eventId":eventId}
+      updateExpediteAndSupervise(o).then(res=>{
+        if(res.code === 200){
+          this.getList();
+        }
+      })
+    },
+    async getDetail(eventId){
+      getlifeLineEventSubject(eventId).then(response=>{
+        this.$refs.eventDetailDialog.open(response)
+      })
+    },
+    getTreeselect() {
+      treeselect().then(response => {
+        this.lifeLineEventTypeOptions = response.data;
+        this.initEventTypes();
+      });
+    },
+
+    initEventTypes() {
+      // 提取所有父级(第一级)事件类型
+      this.parentEventTypes = this.lifeLineEventTypeOptions.map(item => ({
+        typeId: item.typeId,
+        eventTypeCode: item.typeId,
+        eventTypeName: item.eventTypeName
+      }))
+    },
+
+    // 父级选择变化处理
+    handleParentTypeChange(value) {
+      // 清空子级选择
+      this.queryParams.eventTypeXl = ''
+      this.childEventTypes = []
+
+      if (value) {
+        // 找到选中的父级
+        const selectedParent = this.lifeLineEventTypeOptions.find(
+          item => item.typeId === value
+        )
+
+        if (selectedParent && selectedParent.children) {
+          // 提取子级选项
+          this.childEventTypes = selectedParent.children.map(child => ({
+            typeId: child.typeId,
+            eventTypeCode: child.typeId,
+            eventTypeName: child.eventTypeName
+          }))
+        }
+      }
+    },
     /** 查询生命线-事件主体列表 */
     getList() {
       this.loading = true;
@@ -302,19 +356,19 @@ export default {
       this.handleQuery();
     },
     // 多选框选中数据
-    handleSelectionChange(selection) {
+    /*handleSelectionChange(selection) {
       this.ids = selection.map(item => item.eventId)
       this.single = selection.length !== 1
       this.multiple = !selection.length
-    },
+    },*/
     /** 新增按钮操作 */
-    handleAdd() {
+    /*handleAdd() {
       this.reset();
       this.open = true;
       this.title = "添加生命线-事件主体";
-    },
+    },*/
     /** 修改按钮操作 */
-    handleUpdate(row) {
+    /*handleUpdate(row) {
       this.reset();
       const eventId = row.eventId || this.ids
       getlifeLineEventSubject(eventId).then(response => {
@@ -322,9 +376,9 @@ export default {
         this.open = true;
         this.title = "修改生命线-事件主体";
       });
-    },
+    },*/
     /** 提交按钮 */
-    submitForm() {
+    /*submitForm() {
       this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.eventId != null) {
@@ -342,9 +396,9 @@ export default {
           }
         }
       });
-    },
+    },*/
     /** 删除按钮操作 */
-    handleDelete(row) {
+    /*handleDelete(row) {
       const eventIds = row.eventId || this.ids;
       this.$modal.confirm('是否确认删除生命线-事件主体编号为"' + eventIds + '"的数据项?').then(function () {
         return dellifeLineEventSubject(eventIds);
@@ -353,13 +407,13 @@ export default {
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {
       });
-    },
+    },*/
     /** 导出按钮操作 */
-    handleExport() {
+    /*handleExport() {
       this.download('sooka-digital-construction/lifeLineEventSubject/export', {
         ...this.queryParams
       }, `lifeLineEventSubject_${new Date().getTime()}.xlsx`)
-    }
+    }*/
   }
 };
 </script>

+ 1 - 0
src/main/java/com/sooka/sponest/construction/bridge/domain/BridgeInspectionTaskRecord.java

@@ -62,6 +62,7 @@ public class BridgeInspectionTaskRecord extends BaseEntity {
      */
     @Excel(name = "巡查状态", readConverterExp = "0=:进行中;1已结束")
     private String status;
+    private String statusName;
 
     @ApiModelProperty(value = "任务轨迹", required = false)
     private String taskTrajectory;

+ 2 - 0
src/main/java/com/sooka/sponest/construction/bridge/mapper/BridgeInspectionTaskRecordMapper.java

@@ -88,4 +88,6 @@ public interface BridgeInspectionTaskRecordMapper {
 
     // 计算本次巡检距离
     public BigDecimal getDistance(Long recordId);
+
+    List<BridgeInspectionTaskRecord> selectPatrolInspectionDataList(BridgeInspectionTaskRecord bridgeInspectionTaskRecord);
 }

+ 2 - 0
src/main/java/com/sooka/sponest/construction/bridge/service/IBridgeInspectionTaskRecordService.java

@@ -76,4 +76,6 @@ public interface IBridgeInspectionTaskRecordService {
      * @date 2025/9/12 上午11:14
      */
     public List<BridgeTaskPipe> getBridgePipeByTaskIds(BridgeInspectionTaskRecord bridgeInspectionTaskRecord);
+
+    List<BridgeInspectionTaskRecord> selectPatrolInspectionDataList(BridgeInspectionTaskRecord bridgeInspectionTaskRecord);
 }

+ 4 - 0
src/main/java/com/sooka/sponest/construction/bridge/service/impl/BridgeInspectionTaskRecordServiceImpl.java

@@ -42,6 +42,10 @@ public class BridgeInspectionTaskRecordServiceImpl implements IBridgeInspectionT
     public List<BridgeInspectionTaskRecord> selectBridgeInspectionTaskRecordList(BridgeInspectionTaskRecord BridgeInspectionTaskRecord) {
         return bridgeInspectionTaskRecordMapper.selectBridgeInspectionTaskRecordList(BridgeInspectionTaskRecord);
     }
+    @Override
+    public List<BridgeInspectionTaskRecord> selectPatrolInspectionDataList(BridgeInspectionTaskRecord BridgeInspectionTaskRecord) {
+        return bridgeInspectionTaskRecordMapper.selectPatrolInspectionDataList(BridgeInspectionTaskRecord);
+    }
 
     /**
      * 新增巡检任务记录

+ 1 - 0
src/main/java/com/sooka/sponest/construction/drainage/domain/DrainageInspectionTaskRecord.java

@@ -62,6 +62,7 @@ public class DrainageInspectionTaskRecord extends BaseEntity {
      */
     @Excel(name = "巡查状态", readConverterExp = "0=:进行中;1已结束")
     private String status;
+    private String statusName;
 
     @ApiModelProperty(value = "任务轨迹", required = false)
     private String taskTrajectory;

+ 2 - 0
src/main/java/com/sooka/sponest/construction/drainage/mapper/DrainageInspectionTaskRecordMapper.java

@@ -87,4 +87,6 @@ public interface DrainageInspectionTaskRecordMapper {
     public List<DrainageTaskPipe> getDrainagePipeByTaskIds(String taskIdList);
     // 计算本次巡检距离
     public BigDecimal getDistance(Long recordId);
+
+    List<DrainageInspectionTaskRecord> selectPatrolInspectionDataList(DrainageInspectionTaskRecord drainageInspectionTaskRecord);
 }

+ 2 - 0
src/main/java/com/sooka/sponest/construction/drainage/service/IDrainageInspectionTaskRecordService.java

@@ -76,4 +76,6 @@ public interface IDrainageInspectionTaskRecordService {
      * @date 2025/9/12 上午11:14
      */
     public List<DrainageTaskPipe> getDrainagePipeByTaskIds(DrainageInspectionTaskRecord drainageInspectionTaskRecord);
+
+    List<DrainageInspectionTaskRecord> selectPatrolInspectionDataList(DrainageInspectionTaskRecord drainageInspectionTaskRecord);
 }

+ 4 - 0
src/main/java/com/sooka/sponest/construction/drainage/service/impl/DrainageInspectionTaskRecordServiceImpl.java

@@ -42,6 +42,10 @@ public class DrainageInspectionTaskRecordServiceImpl implements IDrainageInspect
     public List<DrainageInspectionTaskRecord> selectDrainageInspectionTaskRecordList(DrainageInspectionTaskRecord DrainageInspectionTaskRecord) {
         return drainageInspectionTaskRecordMapper.selectDrainageInspectionTaskRecordList(DrainageInspectionTaskRecord);
     }
+    @Override
+    public List<DrainageInspectionTaskRecord> selectPatrolInspectionDataList(DrainageInspectionTaskRecord DrainageInspectionTaskRecord) {
+        return drainageInspectionTaskRecordMapper.selectPatrolInspectionDataList(DrainageInspectionTaskRecord);
+    }
 
     /**
      * 新增巡检任务记录

+ 1 - 0
src/main/java/com/sooka/sponest/construction/gas/domain/GasInspectionTaskRecord.java

@@ -62,6 +62,7 @@ public class GasInspectionTaskRecord extends BaseEntity {
      */
     @Excel(name = "巡查状态", readConverterExp = "0=:进行中;1已结束")
     private String status;
+    private String statusName;
 
     @ApiModelProperty(value = "任务轨迹", required = false)
     private String taskTrajectory;

+ 2 - 0
src/main/java/com/sooka/sponest/construction/gas/mapper/GasInspectionTaskRecordMapper.java

@@ -87,4 +87,6 @@ public interface GasInspectionTaskRecordMapper {
     public List<GasTaskPipe> getGasPipeByTaskIds(String taskIdList);
     // 计算本次巡检距离
     public BigDecimal getDistance(Long recordId);
+
+    List<GasInspectionTaskRecord> selectPatrolInspectionDataList(GasInspectionTaskRecord gasInspectionTaskRecord);
 }

+ 2 - 0
src/main/java/com/sooka/sponest/construction/gas/service/IGasInspectionTaskRecordService.java

@@ -76,4 +76,6 @@ public interface IGasInspectionTaskRecordService {
      * @date 2025/9/12 上午11:14
      */
     public List<GasTaskPipe> getGasPipeByTaskIds(GasInspectionTaskRecord gasInspectionTaskRecord);
+
+    List<?> selectPatrolInspectionDataList(GasInspectionTaskRecord gasInspectionTaskRecord);
 }

+ 4 - 0
src/main/java/com/sooka/sponest/construction/gas/service/impl/GasInspectionTaskRecordServiceImpl.java

@@ -43,6 +43,10 @@ public class GasInspectionTaskRecordServiceImpl implements IGasInspectionTaskRec
     public List<GasInspectionTaskRecord> selectGasInspectionTaskRecordList(GasInspectionTaskRecord gasInspectionTaskRecord) {
         return gasInspectionTaskRecordMapper.selectGasInspectionTaskRecordList(gasInspectionTaskRecord);
     }
+    @Override
+    public List<GasInspectionTaskRecord> selectPatrolInspectionDataList(GasInspectionTaskRecord gasInspectionTaskRecord) {
+        return gasInspectionTaskRecordMapper.selectPatrolInspectionDataList(gasInspectionTaskRecord);
+    }
 
     /**
      * 新增巡检任务记录

+ 57 - 6
src/main/java/com/sooka/sponest/construction/heating/controller/HeatingViewController.java

@@ -8,6 +8,7 @@ import com.sooka.sponest.construction.api.vo.DeviceOnlineOfflineVO;
 import com.sooka.sponest.construction.api.vo.DeviceTypeVO;
 import com.sooka.sponest.construction.bridge.domain.*;
 import com.sooka.sponest.construction.bridge.mapper.*;
+import com.sooka.sponest.construction.bridge.service.IBridgePipeInspectionTaskService;
 import com.sooka.sponest.construction.community.domain.Community;
 import com.sooka.sponest.construction.community.service.ICommunityService;
 import com.sooka.sponest.construction.drainage.domain.*;
@@ -29,10 +30,7 @@ import com.sooka.sponest.construction.schedule.domain.DutySchedule;
 import com.sooka.sponest.construction.schedule.service.IDutyScheduleService;
 import com.sooka.sponest.construction.task.domain.Tasks;
 import com.sooka.sponest.construction.task.service.ITasksService;
-import com.sooka.sponest.construction.utilityTunnel.domain.UtilityTunnelBodyInformation;
-import com.sooka.sponest.construction.utilityTunnel.domain.UtilityTunnelHiddendanger;
-import com.sooka.sponest.construction.utilityTunnel.domain.UtilityTunnelMaintenancerepair;
-import com.sooka.sponest.construction.utilityTunnel.domain.UtilityTunnelManhole;
+import com.sooka.sponest.construction.utilityTunnel.domain.*;
 import com.sooka.sponest.construction.utilityTunnel.service.*;
 import com.sooka.sponest.construction.waterSupply.domain.*;
 import com.sooka.sponest.construction.waterSupply.service.*;
@@ -382,13 +380,66 @@ public class HeatingViewController extends BaseController {
         return getDataTable(eventSubjectService.selectEventExpediteList(queryVO));
     }
 
+
+    @Autowired
+    private IGasPipeInspectionTaskService gasPipeInspectionTaskService;
+    @Autowired
+    private IBridgePipeInspectionTaskService bridgePipeInspectionTaskService;
+    @Autowired
+    private IDrainagePipeInspectionTaskService drainagePipeInspectionTaskService;
+    @Autowired
+    private IWaterSupplyPipeInspectionTaskService waterSupplyPipeInspectionTaskService;
+    @Autowired
+    private IUtilityTunnelPipeInspectionTaskService utilityTunnelPipeInspectionTaskService;
+
     /**
      * 查询巡查巡检任务列表
      */
     @GetMapping("/selectHeatingPipeInspectionTaskList")
-    public TableDataInfo selectHeatingPipeInspectionTaskList(HeatingPipeInspectionTask HeatingPipeInspectionTask) {
+    public TableDataInfo selectHeatingPipeInspectionTaskList(HeatingPipeInspectionTask heatingPipeInspectionTask) {
         startPage();
-        List<HeatingPipeInspectionTask> list = heatingInspectionTaskService.selectHeatingPipeInspectionTaskList(HeatingPipeInspectionTask);
+        List list = new ArrayList<>();
+        String type = heatingPipeInspectionTask.getType();
+        if (type != null) {
+            switch (type){
+                case "1":
+                    list = heatingInspectionTaskService.selectHeatingPipeInspectionTaskList(heatingPipeInspectionTask);
+                    break;
+                case "2":
+                    DrainagePipeInspectionTask drainagePipeInspectionTask = new DrainagePipeInspectionTask();
+                    // 复制通用属性
+                    drainagePipeInspectionTask.setTaskName(heatingPipeInspectionTask.getTaskName());
+                    list = drainagePipeInspectionTaskService.selectDrainagePipeInspectionTaskList(drainagePipeInspectionTask);
+                    break;
+                case "3":
+                    BridgePipeInspectionTask bridgePipeInspectionTask = new BridgePipeInspectionTask();
+                    // 复制通用属性
+                    bridgePipeInspectionTask.setTaskName(heatingPipeInspectionTask.getTaskName());
+                    list = bridgePipeInspectionTaskService.selectBridgePipeInspectionTaskList(bridgePipeInspectionTask);
+                    break;
+                case "4":
+                    GasPipeInspectionTask gasPipeInspectionTask = new GasPipeInspectionTask();
+                    // 复制通用属性
+                    gasPipeInspectionTask.setTaskName(heatingPipeInspectionTask.getTaskName());
+                    list = gasPipeInspectionTaskService.selectGasPipeInspectionTaskList(gasPipeInspectionTask);
+                    break;
+                case "5":
+                    UtilityTunnelPipeInspectionTask utilityTunnelPipeInspectionTask = new UtilityTunnelPipeInspectionTask();
+                    // 复制通用属性
+                    utilityTunnelPipeInspectionTask.setTaskName(heatingPipeInspectionTask.getTaskName());
+                    list = utilityTunnelPipeInspectionTaskService.selectUtilityTunnelPipeInspectionTaskList(utilityTunnelPipeInspectionTask);
+                    break;
+                case "6":
+                    WaterSupplyPipeInspectionTask waterSupplyPipeInspectionTask = new WaterSupplyPipeInspectionTask();
+                    // 复制通用属性
+                    waterSupplyPipeInspectionTask.setTaskName(heatingPipeInspectionTask.getTaskName());
+                    list = waterSupplyPipeInspectionTaskService.selectWaterSupplyPipeInspectionTaskList(waterSupplyPipeInspectionTask);
+                    break;
+                default:
+                    // 默认情况,返回空列表
+                    break;
+            }
+        }
         return getDataTable(list);
     }
 

+ 2 - 0
src/main/java/com/sooka/sponest/construction/heating/domain/HeatingPipeInspectionTask.java

@@ -82,4 +82,6 @@ public class HeatingPipeInspectionTask extends BaseBusinessEntity {
     //查询使用字段
     private Long taskUserId;
 
+    private String type;
+
 }

+ 18 - 3
src/main/java/com/sooka/sponest/construction/lifeLine/event/service/impl/LifeLineEventSubjectServiceImpl.java

@@ -1,9 +1,12 @@
 package com.sooka.sponest.construction.lifeLine.event.service.impl;
 
 import com.ruoyi.common.core.utils.DateUtils;
+import com.ruoyi.common.core.utils.SpringUtils;
 import com.ruoyi.common.datascope.annotation.DataScopeMutiDept;
 import com.ruoyi.common.security.utils.DictUtils;
+import com.ruoyi.system.api.RemoteConfigService;
 import com.sooka.sponest.base.service.impl.BaseServiceImpl;
+import com.sooka.sponest.construction.lifeLine.event.domain.LifeLineEventAttach;
 import com.sooka.sponest.construction.lifeLine.event.domain.LifeLineEventLog;
 import com.sooka.sponest.construction.lifeLine.event.domain.LifeLineEventSubject;
 import com.sooka.sponest.construction.lifeLine.event.domain.vo.LifeLineEventSubjectVo;
@@ -57,11 +60,16 @@ public class LifeLineEventSubjectServiceImpl extends BaseServiceImpl implements
         lifeLineEventSubject.setSuperviseStatusLabel("1".equals(lifeLineEventSubject.getSuperviseStatus())? "已督办":"未督办");
         lifeLineEventSubject.setIndustryLabel(MapUtils.getString(dictCacheToMap, lifeLineEventSubject.getIndustry()));
         result.put("detail", lifeLineEventSubject);
-
+        // 获取文件服务器URL
+        String fileUrl = SpringUtils.getBean(RemoteConfigService.class).remotegetConfigKey("fileUrl").getData();
 
         List<LifeLineEventLog> lifeLineEventLogs = logMapper.selectLifeLineEventLogList(new LifeLineEventLog(eventId));
         lifeLineEventLogs.forEach(log->{
-            log.setLogAttachList(attachMapper.selectAttachListByLogId(log.getLogId()));
+            List<LifeLineEventAttach> attachList = attachMapper.selectAttachListByLogId(log.getLogId());
+            attachList.forEach(attach->{
+                attach.setAttachPath(fileUrl+attach.getAttachPath());
+            });
+            log.setLogAttachList(attachList);
         });
         result.put("eventLog", lifeLineEventLogs);
         return result;
@@ -80,9 +88,16 @@ public class LifeLineEventSubjectServiceImpl extends BaseServiceImpl implements
         List<LifeLineEventSubject> lifeLineEventSubjects = subjectMapper.selectLifeLineEventSubjectList(subjectVo);
         Map<String, Object> dictCacheToMap = DictUtils.getDictCacheToMap("lifeline_industry");
 
+        // 获取文件服务器URL
+        String fileUrl = SpringUtils.getBean(RemoteConfigService.class).remotegetConfigKey("fileUrl").getData();
+
         lifeLineEventSubjects.forEach(event -> {
             event.setEventStatusLabel(getStatusLabel(event.getEventStatus()));
-            event.setAttachList(attachMapper.selectAttachListByEventId(event.getEventId()));
+            List<LifeLineEventAttach> attachList = attachMapper.selectAttachListByEventId(event.getEventId());
+            attachList.forEach(attach->{
+                attach.setAttachPath(fileUrl + attach.getAttachPath());
+            });
+            event.setAttachList(attachList);
             event.setExpediteStatusLabel("1".equals(event.getExpediteStatus())? "已催办":"未催办");
             event.setSuperviseStatusLabel("1".equals(event.getSuperviseStatus())? "已督办":"未督办");
             event.setIndustryLabel(MapUtils.getString(dictCacheToMap, event.getIndustry()));

+ 28 - 15
src/main/java/com/sooka/sponest/construction/lifeLine/event/service/impl/LifeLineEventViewServiceImpl.java

@@ -78,20 +78,9 @@ public class LifeLineEventViewServiceImpl extends BaseServiceImpl implements ILi
         try {
             Map<String, String> resutl = new HashMap<>();
 
-            if (subjectVo.getDeptList().isEmpty()) {
-                return AjaxResult.error("事件接收部门不能为空!");
-            }
-
-            if (StringUtils.isEmpty(subjectVo.getEventTypeXl())) {
-                return AjaxResult.error("事件类型不能为空!");
-            }
-
-            if (StringUtils.isEmpty(subjectVo.getEventTitle())) {
-                return AjaxResult.error("事件标题不能为空!");
-            }
-
-            if (StringUtils.isEmpty(subjectVo.getEventDescription())) {
-                return AjaxResult.error("事件描述不能为空!");
+            AjaxResult ajaxResult = verificationInfo(subjectVo);
+            if(ajaxResult.isError()){
+                return ajaxResult;
             }
 
             //获取事件类型
@@ -314,7 +303,7 @@ public class LifeLineEventViewServiceImpl extends BaseServiceImpl implements ILi
         //同步更新业务信息
         updateBusInfoByBusId(eventData, updateEventStatus);
 
-        if(!subjectVo.getAttachList().isEmpty()){
+        if(null != subjectVo.getAttachList() && !subjectVo.getAttachList().isEmpty()){
             int i = 1;
             for (LifeLineEventAttach attach : subjectVo.getAttachList()) {
                 attach.setId(IdUtils.fastSimpleUUID());
@@ -389,6 +378,30 @@ public class LifeLineEventViewServiceImpl extends BaseServiceImpl implements ILi
         }
     }
 
+    private AjaxResult verificationInfo(LifeLineEventSubjectVo subjectVo){
+        if (subjectVo.getDeptList().isEmpty()) {
+            return AjaxResult.error("事件接收部门不能为空!");
+        }
+
+        if (StringUtils.isEmpty(subjectVo.getEventTypeXl())) {
+            return AjaxResult.error("事件类型不能为空!");
+        }
+
+        if (StringUtils.isEmpty(subjectVo.getEventTitle())) {
+            return AjaxResult.error("事件标题不能为空!");
+        }
+
+        if (StringUtils.isEmpty(subjectVo.getEventDescription())) {
+            return AjaxResult.error("事件描述不能为空!");
+        }
+
+        if(StringUtils.isEmpty(subjectVo.getLatitude()) || StringUtils.isEmpty(subjectVo.getLongitude())){
+            return AjaxResult.error("经纬度不能为空!");
+        }
+
+        return AjaxResult.success();
+    }
+
 
     /*@Override
     @DataScopeMutiDept(deptAlias = "d")

+ 62 - 0
src/main/java/com/sooka/sponest/construction/utilityTunnel/controller/UtilityTunnelViewController.java

@@ -13,6 +13,15 @@ import com.sooka.sponest.construction.heating.domain.HeatingPipe;
 import com.sooka.sponest.construction.utilityTunnel.domain.*;
 import com.sooka.sponest.construction.utilityTunnel.domain.vo.*;
 import com.sooka.sponest.construction.utilityTunnel.service.*;
+import com.sooka.sponest.construction.heating.service.IHeatingInspectionTaskRecordService;
+import com.sooka.sponest.construction.drainage.domain.DrainageInspectionTaskRecord;
+import com.sooka.sponest.construction.drainage.service.IDrainageInspectionTaskRecordService;
+import com.sooka.sponest.construction.bridge.domain.BridgeInspectionTaskRecord;
+import com.sooka.sponest.construction.bridge.service.IBridgeInspectionTaskRecordService;
+import com.sooka.sponest.construction.gas.domain.GasInspectionTaskRecord;
+import com.sooka.sponest.construction.gas.service.IGasInspectionTaskRecordService;
+import com.sooka.sponest.construction.waterSupply.domain.WaterInspectionTaskRecord;
+import com.sooka.sponest.construction.waterSupply.service.IWaterInspectionTaskRecordService;
 import com.sooka.sponest.remoteapi.service.system.RemoteSystemBaseService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -51,6 +60,16 @@ public class UtilityTunnelViewController extends BaseController {
     @Autowired
     private IUtilityTunnelPipeInspectionTaskService utilityTunnelPipeInspectionTaskService;
     @Autowired
+    private IHeatingInspectionTaskRecordService heatingInspectionTaskRecordService;
+    @Autowired
+    private IDrainageInspectionTaskRecordService drainageInspectionTaskRecordService;
+    @Autowired
+    private IBridgeInspectionTaskRecordService bridgeInspectionTaskRecordService;
+    @Autowired
+    private IGasInspectionTaskRecordService gasInspectionTaskRecordService;
+    @Autowired
+    private IWaterInspectionTaskRecordService waterInspectionTaskRecordService;
+    @Autowired
     private RemoteSystemBaseService remoteSystemBaseService;
     @Autowired
     private IUtilityTunnelDeviceMonitoringService utilityTunnelDeviceMonitoringService;
@@ -239,6 +258,49 @@ public class UtilityTunnelViewController extends BaseController {
     }
 
     /**
+     * 巡查巡检数据列表(数据) - 公共接口
+     *
+     * @param type 行业类型 1-热力,2-排水,3-桥梁,4-燃气,5-管廊,6-供水
+     */
+    @GetMapping("/selectPatrolInspectionDataList")
+    public TableDataInfo selectPatrolInspectionDataList(
+            @RequestParam(value = "type", required = true) Integer type,
+            UtilityTunnelInspectionTaskRecord utilityTunnelInspectionTaskRecord,
+            HeatingInspectionTaskRecord heatingInspectionTaskRecord,
+            DrainageInspectionTaskRecord drainageInspectionTaskRecord,
+            BridgeInspectionTaskRecord bridgeInspectionTaskRecord,
+            GasInspectionTaskRecord gasInspectionTaskRecord,
+            WaterInspectionTaskRecord waterInspectionTaskRecord) {
+        startPage();
+        List<?> list = new ArrayList<>();
+
+        switch (type) {
+            case 1: // 热力
+                list = heatingInspectionTaskRecordService.selectPatrolInspectionDataList(heatingInspectionTaskRecord);
+                break;
+            case 2: // 排水
+                list = drainageInspectionTaskRecordService.selectPatrolInspectionDataList(drainageInspectionTaskRecord);
+                break;
+            case 3: // 桥梁
+                list = bridgeInspectionTaskRecordService.selectPatrolInspectionDataList(bridgeInspectionTaskRecord);
+                break;
+            case 4: // 燃气
+                list = gasInspectionTaskRecordService.selectPatrolInspectionDataList(gasInspectionTaskRecord);
+                break;
+            case 5: // 管廊
+                list = utilityTunnelPipeInspectionTaskService.selectPatrolInspectionDataList(utilityTunnelInspectionTaskRecord);
+                break;
+            case 6: // 供水
+                list = waterInspectionTaskRecordService.selectPatrolInspectionDataList(waterInspectionTaskRecord);
+                break;
+            default:
+                return getDataTable(new ArrayList<>());
+        }
+
+        return getDataTable(list);
+    }
+
+    /**
      * 隐患上报整改统计
      */
     @GetMapping("/hiddenDangerCount")

+ 1 - 0
src/main/java/com/sooka/sponest/construction/waterSupply/domain/WaterInspectionTaskRecord.java

@@ -63,6 +63,7 @@ public class WaterInspectionTaskRecord extends BaseEntity {
      */
     @Excel(name = "巡查状态", readConverterExp = "0=:进行中;1已结束")
     private String status;
+    private String statusName;
 
     //巡检距离
     private BigDecimal distance;

+ 2 - 0
src/main/java/com/sooka/sponest/construction/waterSupply/mapper/WaterInspectionTaskRecordMapper.java

@@ -95,4 +95,6 @@ public interface WaterInspectionTaskRecordMapper {
     public int insertWaterInspectionTaskAttach(WaterInspectionTaskAttach waterInspectionTaskAttach);
     // 计算本次巡检距离
     public BigDecimal getDistance(Long recordId);
+
+    List<WaterInspectionTaskRecord> selectPatrolInspectionDataList(WaterInspectionTaskRecord waterInspectionTaskRecord);
 }

+ 2 - 0
src/main/java/com/sooka/sponest/construction/waterSupply/service/IWaterInspectionTaskRecordService.java

@@ -67,4 +67,6 @@ public interface IWaterInspectionTaskRecordService {
      * @date 2025/9/4 下午1:49
      */
     public List<WaterInspectionTaskRecord> listRecordByTaskId(WaterInspectionTaskRecord waterInspectionTaskRecord);
+
+    List<?> selectPatrolInspectionDataList(WaterInspectionTaskRecord waterInspectionTaskRecord);
 }

+ 4 - 0
src/main/java/com/sooka/sponest/construction/waterSupply/service/impl/WaterInspectionTaskRecordServiceImpl.java

@@ -40,6 +40,10 @@ public class WaterInspectionTaskRecordServiceImpl implements IWaterInspectionTas
     public List<WaterInspectionTaskRecord> selectWaterInspectionTaskRecordList(WaterInspectionTaskRecord waterInspectionTaskRecord) {
         return waterInspectionTaskRecordMapper.selectWaterInspectionTaskRecordList(waterInspectionTaskRecord);
     }
+    @Override
+    public List<WaterInspectionTaskRecord> selectPatrolInspectionDataList(WaterInspectionTaskRecord waterInspectionTaskRecord) {
+        return waterInspectionTaskRecordMapper.selectPatrolInspectionDataList(waterInspectionTaskRecord);
+    }
 
     /**
      * 新增巡检任务记录

+ 35 - 2
src/main/resources/mapper/construction/bridge/BridgeInspectionTaskRecordMapper.xml

@@ -13,6 +13,8 @@
         <result property="userName" column="user_name"/>
         <result property="status" column="status"/>
         <result property="distance" column="distance"/>
+        <result property="statusName" column="statusName"/>
+        <result property="taskName" column="task_name"/>
     </resultMap>
 
     <sql id="selectBridgeInspectionTaskRecordVo">
@@ -117,6 +119,37 @@
         ORDER BY a.start_time DESC
     </select>
 
+    <select id="selectPatrolInspectionDataList" parameterType="BridgeInspectionTaskRecord"
+            resultMap="BridgeInspectionTaskRecordResult">
+        SELECT a.id,
+        a.task_id,
+        a.start_time,
+        a.end_time,
+        a.user_id,
+        a.user_name,
+        a.status,
+        CASE
+        WHEN a.status = 0 THEN
+        '进行中'
+        WHEN a.status = 1 THEN
+        '已结束'
+        ELSE a.status
+        END AS statusName,
+        b.task_name
+        FROM bridge_inspection_task_record a
+        LEFT JOIN bridge_pipe_inspection_task b ON a.task_id = b.id
+        <where>
+            <if test="taskId != null ">and a.task_id = #{taskId}</if>
+            <if test="startTime != null ">and a.start_time = #{startTime}</if>
+            <if test="endTime != null ">and a.end_time = #{endTime}</if>
+            <if test="userId != null ">and a.user_id = #{userId}</if>
+            <if test="userName != null  and userName != ''">and a.user_name like concat('%', #{userName}, '%')</if>
+            <if test="taskName != null  and taskName != ''">and b.task_name like concat('%', #{taskName}, '%')</if>
+            <if test="status != null  and status != ''">and a.status = #{status}</if>
+        </where>
+        order by a.start_time desc
+    </select>
+
     <select id="getBridgePipeByTaskIds" parameterType="BridgeInspectionTaskRecord"
             resultType="com.sooka.sponest.construction.bridge.domain.BridgeTaskPipe">
         SELECT DISTINCT pipe_id   pipeId,
@@ -136,7 +169,7 @@
         FROM (
                  SELECT *,
                         @row_number := @row_number + 1 AS rn
-                 FROM heating_inspection_task_record_track,
+                 FROM bridge_inspection_task_record_track,
                      (SELECT @row_number := 0) r
                  WHERE record_id = #{recordId}
                  ORDER BY create_time
@@ -144,7 +177,7 @@
                  JOIN (
             SELECT *,
                    @row_number2 := @row_number2 + 1 AS rn
-            FROM heating_inspection_task_record_track,
+            FROM bridge_inspection_task_record_track,
                 (SELECT @row_number2 := 0) r
             WHERE record_id = #{recordId}
             ORDER BY create_time

+ 33 - 0
src/main/resources/mapper/construction/drainage/DrainageInspectionTaskRecordMapper.xml

@@ -13,6 +13,8 @@
         <result property="userName" column="user_name"/>
         <result property="status" column="status"/>
         <result property="distance" column="distance"/>
+        <result property="statusName" column="statusName"/>
+        <result property="taskName" column="task_name"/>
     </resultMap>
 
     <sql id="selectDrainageInspectionTaskRecordVo">
@@ -117,6 +119,37 @@
         ORDER BY a.start_time DESC
     </select>
 
+    <select id="selectPatrolInspectionDataList" parameterType="DrainageInspectionTaskRecord"
+            resultMap="DrainageInspectionTaskRecordResult">
+        SELECT a.id,
+        a.task_id,
+        a.start_time,
+        a.end_time,
+        a.user_id,
+        a.user_name,
+        a.status,
+        CASE
+        WHEN a.status = 0 THEN
+        '进行中'
+        WHEN a.status = 1 THEN
+        '已结束'
+        ELSE a.status
+        END AS statusName,
+        b.task_name
+        FROM drainage_inspection_task_record a
+        LEFT JOIN drainage_pipe_inspection_task b ON a.task_id = b.id
+        <where>
+            <if test="taskId != null ">and a.task_id = #{taskId}</if>
+            <if test="startTime != null ">and a.start_time = #{startTime}</if>
+            <if test="endTime != null ">and a.end_time = #{endTime}</if>
+            <if test="userId != null ">and a.user_id = #{userId}</if>
+            <if test="userName != null  and userName != ''">and a.user_name like concat('%', #{userName}, '%')</if>
+            <if test="taskName != null  and taskName != ''">and b.task_name like concat('%', #{taskName}, '%')</if>
+            <if test="status != null  and status != ''">and a.status = #{status}</if>
+        </where>
+        order by a.start_time desc
+    </select>
+
     <select id="getDrainagePipeByTaskIds" parameterType="DrainageInspectionTaskRecord"
             resultType="com.sooka.sponest.construction.drainage.domain.DrainageTaskPipe">
         SELECT DISTINCT pipe_id   pipeId,

+ 33 - 0
src/main/resources/mapper/construction/gas/GasInspectionTaskRecordMapper.xml

@@ -13,6 +13,8 @@
         <result property="userName" column="user_name"/>
         <result property="status" column="status"/>
         <result property="distance" column="distance"/>
+        <result property="statusName" column="statusName"/>
+        <result property="taskName" column="task_name"/>
     </resultMap>
 
     <sql id="selectGasInspectionTaskRecordVo">
@@ -116,6 +118,37 @@
         ORDER BY a.start_time DESC
     </select>
 
+    <select id="selectPatrolInspectionDataList" parameterType="GasInspectionTaskRecord"
+            resultMap="GasInspectionTaskRecordResult">
+        SELECT a.id,
+        a.task_id,
+        a.start_time,
+        a.end_time,
+        a.user_id,
+        a.user_name,
+        a.status,
+        CASE
+        WHEN a.status = 0 THEN
+        '进行中'
+        WHEN a.status = 1 THEN
+        '已结束'
+        ELSE a.status
+        END AS statusName,
+        b.task_name
+        FROM gas_inspection_task_record a
+        LEFT JOIN gas_pipe_inspection_task b ON a.task_id = b.id
+        <where>
+            <if test="taskId != null ">and a.task_id = #{taskId}</if>
+            <if test="startTime != null ">and a.start_time = #{startTime}</if>
+            <if test="endTime != null ">and a.end_time = #{endTime}</if>
+            <if test="userId != null ">and a.user_id = #{userId}</if>
+            <if test="userName != null  and userName != ''">and a.user_name like concat('%', #{userName}, '%')</if>
+            <if test="taskName != null  and taskName != ''">and b.task_name like concat('%', #{taskName}, '%')</if>
+            <if test="status != null  and status != ''">and a.status = #{status}</if>
+        </where>
+        order by a.start_time desc
+    </select>
+
     <select id="getGasPipeByTaskIds" parameterType="GasInspectionTaskRecord"
             resultType="com.sooka.sponest.construction.gas.domain.GasTaskPipe">
         SELECT DISTINCT pipe_id   pipeId,

+ 1 - 3
src/main/resources/mapper/construction/gas/GasPipeMapper.xml

@@ -361,9 +361,6 @@
         from gas_pipe a
         left join ${database_system}.sys_dept d on a.dept_id = d.dept_id
         <where>
-            <if test="deptId != null and deptId != ''">
-                and FIND_IN_SET(#{deptId}, CONCAT(d.ancestors, ',', d.dept_id))
-            </if>
             <if test="cityCode != null and cityCode != ''">
                 and a.city_code = #{cityCode}
             </if>
@@ -371,6 +368,7 @@
                 and a.district_name like concat('%', #{districtName}, '%')
             </if>
         </where>
+        ${params.dataScope}
     </select>
 
     <select id="getDeptPipeLengthByPressure"

+ 1 - 1
src/main/resources/mapper/construction/heating/HeatingInspectionTaskRecordMapper.xml

@@ -57,7 +57,7 @@
         LEFT JOIN heating_pipe_inspection_task b ON a.task_id = b.id
         <where>
             <if test="taskId != null ">and a.task_id = #{taskId}</if>
-            <if test="startTime != null ">and sa.tart_time = #{startTime}</if>
+            <if test="startTime != null ">and a.start_time = #{startTime}</if>
             <if test="endTime != null ">and a.end_time = #{endTime}</if>
             <if test="userId != null ">and a.user_id = #{userId}</if>
             <if test="userName != null  and userName != ''">and a.user_name like concat('%', #{userName}, '%')</if>

+ 8 - 2
src/main/resources/mapper/construction/lifeLine/event/LifeLineEventSubjectMapper.xml

@@ -79,8 +79,14 @@
     </select>
 
     <select id="selectLifeLineEventSubjectByEventId" parameterType="String" resultMap="LifeLineEventSubjectResult">
-        <include refid="selectLifeLineEventSubjectVo"/>
-        where event_id = #{eventId}
+        select distinct lles.*,
+                        lletD.event_type_name event_type_dl_label,
+                        lletX.event_type_name event_type_xl_label
+        from life_line_event_subject lles
+                 left join life_line_event_dept lled on lles.event_id = lled.event_id
+                 left join life_line_event_type lletD on lles.event_type_dl = lletD.type_id
+                 left join life_line_event_type lletX on lles.event_type_xl = lletX.type_id
+        where lles.event_id = #{eventId}
     </select>
 
     <insert id="insertLifeLineEventSubject" parameterType="LifeLineEventSubjectVo">

+ 6 - 6
src/main/resources/mapper/construction/utilityTunnel/UtilityTunnelInspectionTaskRecordMapper.xml

@@ -52,17 +52,17 @@
         '已结束'
         ELSE a.status
         END AS statusName,
-        b.task_name
+        b.task_name as task_name
         FROM utility_tunnel_inspection_task_record a
         LEFT JOIN utility_tunnel_inspection_task b ON a.task_id = b.id
         <where>
-            <if test="taskId != null ">and a.task_id like concat('%', #{taskId}, '%')</if>
-            <if test="startTime != null ">and a.start_time like concat('%', #{startTime}, '%')</if>
-            <if test="endTime != null ">and a.end_time like concat('%', #{endTime}, '%')</if>
-            <if test="userId != null ">and a.user_id like concat('%', #{userId}, '%')</if>
+            <if test="taskId != null ">and a.task_id = #{taskId}</if>
+            <if test="startTime != null ">and a.start_time = #{startTime}</if>
+            <if test="endTime != null ">and a.end_time = #{endTime}</if>
+            <if test="userId != null ">and a.user_id = #{userId}</if>
             <if test="userName != null  and userName != ''">and a.user_name like concat('%', #{userName}, '%')</if>
             <if test="taskName != null  and taskName != ''">and b.task_name like concat('%', #{taskName}, '%')</if>
-            <if test="status != null  and status != ''">and a.status like concat('%', #{status}, '%')</if>
+            <if test="status != null  and status != ''">and a.status = #{status}</if>
         </where>
         order by start_time desc
     </select>

+ 33 - 0
src/main/resources/mapper/construction/waterSupply/WaterInspectionTaskRecordMapper.xml

@@ -13,6 +13,8 @@
         <result property="userName" column="user_name"/>
         <result property="status" column="status"/>
         <result property="distance" column="distance"/>
+        <result property="statusName" column="statusName"/>
+        <result property="taskName" column="task_name"/>
     </resultMap>
 
     <sql id="selectWaterInspectionTaskRecordVo">
@@ -101,6 +103,37 @@
         ORDER BY a.start_time DESC
     </select>
 
+    <select id="selectPatrolInspectionDataList" parameterType="WaterInspectionTaskRecord"
+            resultMap="WaterInspectionTaskRecordResult">
+        SELECT a.id,
+        a.task_id,
+        a.start_time,
+        a.end_time,
+        a.user_id,
+        a.user_name,
+        a.status,
+        CASE
+        WHEN a.status = 0 THEN
+        '进行中'
+        WHEN a.status = 1 THEN
+        '已结束'
+        ELSE a.status
+        END AS statusName,
+        b.task_name as task_name
+        FROM water_supply_inspection_task_record a
+        LEFT JOIN water_supply_pipe_inspection_task b ON a.task_id = b.id
+        <where>
+            <if test="taskId != null ">and a.task_id = #{taskId}</if>
+            <if test="startTime != null ">and a.start_time = #{startTime}</if>
+            <if test="endTime != null ">and a.end_time = #{endTime}</if>
+            <if test="userId != null ">and a.user_id = #{userId}</if>
+            <if test="userName != null  and userName != ''">and a.user_name like concat('%', #{userName}, '%')</if>
+            <if test="taskName != null  and taskName != ''">and b.task_name like concat('%', #{taskName}, '%')</if>
+            <if test="status != null  and status != ''">and a.status = #{status}</if>
+        </where>
+        order by a.start_time desc
+    </select>
+
     <update id="updateWaterInspectionTaskRecordByUserIdAndTaskId" parameterType="WaterInspectionTaskRecord">
         update water_supply_inspection_task_record
         <trim prefix="SET" suffixOverrides=",">