三拍:工单页高级检索

由于一开始使用的是查询四个表的所有结果后进行过滤,因此在着使用过滤的方法不使用sql的模糊查询

<template>
  <div class="all-orders-container">
    <el-card class="orders-card">
      <template #header>
        <div class="card-header">
          <span>工单管理</span>
          <div class="header-right">
            <!-- 添加过滤输入框 -->
            <el-input
              v-model="filters.orderId"
              placeholder="工单号"
              clearable
              style="width: 120px; margin-right: 15px;"
              @clear="handleFilter"
              @change="handleFilter"
            />
            <el-input
              v-model="filters.deviceId"
              placeholder="设备ID"
              clearable
              style="width: 120px; margin-right: 15px;"
              @clear="handleFilter"
              @change="handleFilter"
            />
            <el-select v-model="currentType" @change="handleTypeChange" style="margin-right: 15px;width: 120px">
              <el-option label="全部" value="all" />
              <el-option label="巡检工单" value="inspection" />
              <el-option label="保养工单" value="maintenance" />
              <el-option label="检测工单" value="testing" />
              <el-option label="维修工单" value="repair" />
            </el-select>
            <el-button type="primary" @click="refreshOrders">刷新</el-button>
          </div>
        </div>
      </template>

      <el-table :data="orderList" style="width: 100%" v-loading="loading">
        <el-table-column prop="orderId" label="工单号" width="120" />
        <el-table-column prop="deviceId" label="设备ID" width="120" />
        <el-table-column prop="engineerId" label="工程师ID" width="120" />
        <el-table-column prop="description" label="描述" />
        <el-table-column prop="orderType" label="工单类型" width="100">
          <template #default="scope">
            <el-tag>{{ getOrderTypeText(scope.row.orderType) }}</el-tag>
          </template>
        </el-table-column>
        <el-table-column prop="status" label="状态" width="100">
          <template #default="scope">
            <el-tag :type="getStatusType(scope.row.status)">
              {{ getStatusText(scope.row.status) }}
            </el-tag>
          </template>
        </el-table-column>
        <el-table-column label="操作" width="200" fixed="right">
          <template #default="scope">
            <el-button 
              size="small" 
              type="primary"
              @click="handleViewDetail(scope.row)"
            >
              查看详情
            </el-button>
          </template>
        </el-table-column>
        <el-table-column prop="deviceType" label="设备类型" width="120" />
        <el-table-column prop="deviceLocation" label="设备位置" width="120" />
      </el-table>
    </el-card>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { ElMessage } from 'element-plus'
import { getAllOrders as getInspectionOrders } from '@/api/inspectionOrder'
import { getAllOrders as getMaintenanceOrders } from '@/api/maintenanceOrder'
import { getAllOrders as getTestingOrders } from '@/api/testingOrder'
import { getRepairOrderList } from '@/api/repairOrder'
import { getFault } from '@/api/deviceFault'
import { getDevice } from '@/api/device'
import { getPlanById as getInspectionPlan } from '@/api/inspection'
import { getPlanById as getMaintenancePlan } from '@/api/maintenance'
import { getPlanById as getTestingPlan } from '@/api/testing'

const router = useRouter()
const loading = ref(false)
const orderList = ref([])
const currentType = ref('all')

// 获取工单列表
// 在 script setup 中添加获取用户信息的逻辑
const getCurrentUserId = () => {
  const userInfo = localStorage.getItem('userInfo')
  if (userInfo) {
    try {
      const user = JSON.parse(userInfo)
      return user.id
    } catch (error) {
      console.error('解析用户信息失败:', error)
      return null
    }
  }
  return null
}

// 修改 fetchOrders 函数中的工单处理逻辑
// const fetchOrders = async () => {
//   loading.value = true
//   try {
//     let orders = []
//     const currentUserId = getCurrentUserId()
    
//     if (!currentUserId) {
//       ElMessage.warning('未获取到用户信息')
//       return
//     }

//     if (currentType.value === 'all' || currentType.value === 'inspection') {
//       const inspectionRes = await getInspectionOrders()
//       if (inspectionRes.code === 200) {
//         const inspectionOrders = await Promise.all(inspectionRes.data
//           .filter(order => order.engineerId === currentUserId)  // 筛选当前用户的工单
//           .map(async (order) => {
//             try {
//               // 获取巡检计划
//               const planRes = await getInspectionPlan(order.planId)
//               if (planRes.code === 200 && planRes.data) {
//                 // 获取设备信息
//                 const deviceRes = await getDevice(planRes.data.deviceId)
//                 return {
//                   ...order,
//                   orderType: 'inspection',
//                   description: order.inspectionDesc,
//                   deviceId: planRes.data.deviceId,
//                   deviceType: deviceRes.data?.deviceType || '未知',
//                   deviceLocation: deviceRes.data?.location || '未知'
//                 }
//               }
//               return {
//                 ...order,
//                 orderType: 'inspection',
//                 description: order.inspectionDesc
//               }
//             } catch (error) {
//               console.error('获取巡检设备信息失败:', error)
//               return {
//                 ...order,
//                 orderType: 'inspection',
//                 description: order.inspectionDesc
//               }
//             }
//           }))
//         orders = orders.concat(inspectionOrders)
//       }
//     }

//     if (currentType.value === 'all' || currentType.value === 'maintenance') {
//       const maintenanceRes = await getMaintenanceOrders()
//       if (maintenanceRes.code === 200) {
//         const maintenanceOrders = await Promise.all(maintenanceRes.data
//           .filter(order => order.engineerId === currentUserId)  // 筛选当前用户的工单
//           .map(async (order) => {
//             try {
//               const planRes = await getMaintenancePlan(order.planId)
//               if (planRes.code === 200 && planRes.data) {
//                 const deviceRes = await getDevice(planRes.data.deviceId)
//                 return {
//                   ...order,
//                   orderType: 'maintenance',
//                   description: order.maintenanceDesc,
//                   deviceId: planRes.data.deviceId,
//                   deviceType: deviceRes.data?.deviceType || '未知',
//                   deviceLocation: deviceRes.data?.location || '未知'
//                 }
//               }
//               return {
//                 ...order,
//                 orderType: 'maintenance',
//                 description: order.maintenanceDesc
//               }
//             } catch (error) {
//               console.error('获取保养设备信息失败:', error)
//               return {
//                 ...order,
//                 orderType: 'maintenance',
//                 description: order.maintenanceDesc
//               }
//             }
//           }))
//         orders = orders.concat(maintenanceOrders)
//       }
//     }

//     if (currentType.value === 'all' || currentType.value === 'testing') {
//       const testingRes = await getTestingOrders()
//       if (testingRes.code === 200) {
//         const testingOrders = await Promise.all(testingRes.data
//           .filter(order => order.engineerId === currentUserId)  // 筛选当前用户的工单
//           .map(async (order) => {
//             try {
//               const planRes = await getTestingPlan(order.planId)
//               if (planRes.code === 200 && planRes.data) {
//                 const deviceRes = await getDevice(planRes.data.deviceId)
//                 return {
//                   ...order,
//                   orderType: 'testing',
//                   description: order.testingDesc,
//                   deviceId: planRes.data.deviceId,
//                   deviceType: deviceRes.data?.deviceType || '未知',
//                   deviceLocation: deviceRes.data?.location || '未知'
//                 }
//               }
//               return {
//                 ...order,
//                 orderType: 'testing',
//                 description: order.testingDesc
//               }
//             } catch (error) {
//               console.error('获取检测设备信息失败:', error)
//               return {
//                 ...order,
//                 orderType: 'testing',
//                 description: order.testingDesc
//               }
//             }
//           }))
//         orders = orders.concat(testingOrders)
//       }
//     }

//     if (currentType.value === 'all' || currentType.value === 'repair') {
//       const repairRes = await getRepairOrderList()
//       if (repairRes.code === 200) {
//         const repairOrders = await Promise.all(repairRes.data
//           .filter(order => order.engineerId === currentUserId)  // 筛选当前用户的工单
//           .map(async (order) => {
//             try {
//               const faultRes = await getFault(order.faultId)
//               if (faultRes.data?.deviceId) {
//                 const deviceRes = await getDevice(faultRes.data.deviceId)
//                 return {
//                   ...order,
//                   orderType: 'repair',
//                   deviceId: faultRes.data.deviceId,
//                   description: faultRes.data?.faultDesc || order.repairDesc,
//                   deviceType: deviceRes.data?.deviceType || '未知',
//                   deviceLocation: deviceRes.data?.location || '未知'
//                 }
//               }
//               return {
//                 ...order,
//                 orderType: 'repair',
//                 description: order.repairDesc
//               }
//             } catch (error) {
//               return {
//                 ...order,
//                 orderType: 'repair',
//                 description: order.repairDesc
//               }
//             }
//           }))
//         orders = orders.concat(repairOrders)
//       }
//     }

//     orderList.value = orders
    
//     if (orders.length === 0) {
//       ElMessage.info('暂无工单数据')
//     }
//   } catch (error) {
//     console.error('获取工单列表失败:', error)
//     ElMessage.error('获取工单列表失败')
//   } finally {
//     loading.value = false
//   }
// }

// 处理工单类型切换
const handleTypeChange = () => {
  // 清空过滤条件
  filters.value = {
    orderId: '',
    deviceId: ''
  }
  // 重新获取数据
  fetchOrders()
}

// 修改刷新函数
const refreshOrders = () => {
  // 清空过滤条件
  filters.value = {
    orderId: '',
    deviceId: ''
  }
  // 重置工单类型为全部
  currentType.value = 'all'
  // 重新获取数据
  fetchOrders()
}

// 获取工单类型显示文本
const getOrderTypeText = (type) => {
  const typeMap = {
    'inspection': '巡检工单',
    'maintenance': '保养工单',
    'testing': '检测工单',
    'repair': '维修工单'
  }
  return typeMap[type] || type
}

// 获取状态标签类型
const getStatusType = (status) => {
  const statusMap = {
    '待处理': 'warning',
    '处理中': 'primary',
    '已完成': 'success',
    'pending': 'warning',
    'processing': 'primary',
    'completed': 'success'
  }
  return statusMap[status] || 'info'
}

// 获取状态显示文本
const getStatusText = (status) => {
  const statusMap = {
    'pending': '待处理',
    'processing': '处理中',
    'completed': '已完成'
  }
  return statusMap[status] || status
}

// 查看详情
const handleViewDetail = (row) => {
  const routeMap = {
    'inspection': '/inspection-detail',
    'maintenance': '/maintenance-detail',
    'testing': '/testing-detail',
    'repair': '/work-detail'  // 已经正确设置为 work-detail
  }
  const route = routeMap[row.orderType]
  if (route) {
    router.push(`${route}/${row.orderId}`)
  }
}

onMounted(() => {
  fetchOrders()
})

// 添加 filters ref
const filters = ref({
  orderId: '',
  deviceId: ''
})

// 添加过滤方法
const filterOrders = (orders) => {
  if (!orders) return []
  return orders.filter(order => {
    const orderIdMatch = !filters.value.orderId || 
      (order.orderId && order.orderId.toString().toLowerCase().includes(filters.value.orderId.toLowerCase()))
    const deviceIdMatch = !filters.value.deviceId || 
      (order.deviceId && order.deviceId.toString().toLowerCase().includes(filters.value.deviceId.toLowerCase()))
    return orderIdMatch && deviceIdMatch
  })
}

// 添加过滤处理函数
// const handleFilter = () => {
//   fetchOrders()
// }

// 修改 fetchOrders 函数末尾的数据处理部分
const fetchOrders = async () => {
  loading.value = true
  try {
    let orders = []
    const currentUserId = getCurrentUserId()
    
    if (!currentUserId) {
      ElMessage.warning('未获取到用户信息')
      return
    }

    if (currentType.value === 'all' || currentType.value === 'inspection') {
      const inspectionRes = await getInspectionOrders()
      if (inspectionRes.code === 200) {
        const inspectionOrders = await Promise.all(inspectionRes.data
          .filter(order => order.engineerId === currentUserId)  // 筛选当前用户的工单
          .map(async (order) => {
            try {
              // 获取巡检计划
              const planRes = await getInspectionPlan(order.planId)
              if (planRes.code === 200 && planRes.data) {
                // 获取设备信息
                const deviceRes = await getDevice(planRes.data.deviceId)
                return {
                  ...order,
                  orderType: 'inspection',
                  description: order.inspectionDesc,
                  deviceId: planRes.data.deviceId,
                  deviceType: deviceRes.data?.deviceType || '未知',
                  deviceLocation: deviceRes.data?.location || '未知'
                }
              }
              return {
                ...order,
                orderType: 'inspection',
                description: order.inspectionDesc
              }
            } catch (error) {
              console.error('获取巡检设备信息失败:', error)
              return {
                ...order,
                orderType: 'inspection',
                description: order.inspectionDesc
              }
            }
          }))
        orders = orders.concat(inspectionOrders)
      }
    }

    if (currentType.value === 'all' || currentType.value === 'maintenance') {
      const maintenanceRes = await getMaintenanceOrders()
      if (maintenanceRes.code === 200) {
        const maintenanceOrders = await Promise.all(maintenanceRes.data
          .filter(order => order.engineerId === currentUserId)  // 筛选当前用户的工单
          .map(async (order) => {
            try {
              const planRes = await getMaintenancePlan(order.planId)
              if (planRes.code === 200 && planRes.data) {
                const deviceRes = await getDevice(planRes.data.deviceId)
                return {
                  ...order,
                  orderType: 'maintenance',
                  description: order.maintenanceDesc,
                  deviceId: planRes.data.deviceId,
                  deviceType: deviceRes.data?.deviceType || '未知',
                  deviceLocation: deviceRes.data?.location || '未知'
                }
              }
              return {
                ...order,
                orderType: 'maintenance',
                description: order.maintenanceDesc
              }
            } catch (error) {
              console.error('获取保养设备信息失败:', error)
              return {
                ...order,
                orderType: 'maintenance',
                description: order.maintenanceDesc
              }
            }
          }))
        orders = orders.concat(maintenanceOrders)
      }
    }

    if (currentType.value === 'all' || currentType.value === 'testing') {
      const testingRes = await getTestingOrders()
      if (testingRes.code === 200) {
        const testingOrders = await Promise.all(testingRes.data
          .filter(order => order.engineerId === currentUserId)  // 筛选当前用户的工单
          .map(async (order) => {
            try {
              const planRes = await getTestingPlan(order.planId)
              if (planRes.code === 200 && planRes.data) {
                const deviceRes = await getDevice(planRes.data.deviceId)
                return {
                  ...order,
                  orderType: 'testing',
                  description: order.testingDesc,
                  deviceId: planRes.data.deviceId,
                  deviceType: deviceRes.data?.deviceType || '未知',
                  deviceLocation: deviceRes.data?.location || '未知'
                }
              }
              return {
                ...order,
                orderType: 'testing',
                description: order.testingDesc
              }
            } catch (error) {
              console.error('获取检测设备信息失败:', error)
              return {
                ...order,
                orderType: 'testing',
                description: order.testingDesc
              }
            }
          }))
        orders = orders.concat(testingOrders)
      }
    }

    if (currentType.value === 'all' || currentType.value === 'repair') {
      const repairRes = await getRepairOrderList()
      if (repairRes.code === 200) {
        const repairOrders = await Promise.all(repairRes.data
          .filter(order => order.engineerId === currentUserId)  // 筛选当前用户的工单
          .map(async (order) => {
            try {
              const faultRes = await getFault(order.faultId)
              if (faultRes.data?.deviceId) {
                const deviceRes = await getDevice(faultRes.data.deviceId)
                return {
                  ...order,
                  orderType: 'repair',
                  deviceId: faultRes.data.deviceId,
                  description: faultRes.data?.faultDesc || order.repairDesc,
                  deviceType: deviceRes.data?.deviceType || '未知',
                  deviceLocation: deviceRes.data?.location || '未知'
                }
              }
              return {
                ...order,
                orderType: 'repair',
                description: order.repairDesc
              }
            } catch (error) {
              return {
                ...order,
                orderType: 'repair',
                description: order.repairDesc
              }
            }
          }))
        orders = orders.concat(repairOrders)
      }
    }

    // 存储原始数据
    const allOrders = orders

    // 应用过滤器
    orderList.value = allOrders.filter(order => {
      const orderIdMatch = !filters.value.orderId || 
        (order.orderId && order.orderId.toString().toLowerCase().includes(filters.value.orderId.toLowerCase()))
      const deviceIdMatch = !filters.value.deviceId || 
        (order.deviceId && order.deviceId.toString().toLowerCase().includes(filters.value.deviceId.toLowerCase()))
      return orderIdMatch && deviceIdMatch
    })
    
    if (orderList.value.length === 0) {
      ElMessage.info('暂无匹配的工单数据')
    }
  } catch (error) {
    console.error('获取工单列表失败:', error)
    ElMessage.error('获取工单列表失败')
  } finally {
    loading.value = false
  }
}

// 修改过滤处理函数
const handleFilter = () => {
  // 直接对当前数据进行过滤,不重新获取数据
  if (orderList.value) {
    orderList.value = orderList.value.filter(order => {
      const orderIdMatch = !filters.value.orderId || 
        (order.orderId && order.orderId.toString().toLowerCase().includes(filters.value.orderId.toLowerCase()))
      const deviceIdMatch = !filters.value.deviceId || 
        (order.deviceId && order.deviceId.toString().toLowerCase().includes(filters.value.deviceId.toLowerCase()))
      return orderIdMatch && deviceIdMatch
    })
  }
}

// 修改刷新函数
// const refreshOrders = () => {
//   // 清空过滤条件
//   filters.value = {
//     orderId: '',
//     deviceId: ''
//   }
//   // 重新获取数据
//   fetchOrders()
// }
</script>

<style scoped>
.all-orders-container {
  padding: 20px;
}

.orders-card {
  margin-bottom: 20px;
}

.card-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.header-right {
  display: flex;
  align-items: center;
}
</style>
posted @ 2025-05-16 20:36  QixunQiu  阅读(14)  评论(0)    收藏  举报