无人机管理后台前端(已迁走)
张含笑
2025-11-22 ad41dc64ac1a23160ad58f9aa56eafec18f74217
feat:受理添加条件
2 files modified
107 ■■■■■ changed files
src/views/tickets/ticket.vue 87 ●●●●● patch | view | raw | blame | history
src/views/tickets/ticketComponent/TicketDetailDialog.vue 20 ●●●● patch | view | raw | blame | history
src/views/tickets/ticket.vue
@@ -154,17 +154,17 @@
        >
          <el-table-column type="selection" width="55" v-if="permissionList.reviewBtn || permissionList.exportBtn" />
          <el-table-column type="index" label="序号" width="60" />
          <el-table-column prop="event_num" label="工单编号" width="170">
          <el-table-column prop="orderNumber" label="工单编号" width="170">
            <template #default="{ row }">
              <el-tooltip-copy :content="row.event_num" :showCopyText="true" textAlign="left">
                {{ row.event_num }}
              <el-tooltip-copy :content="row.orderNumber" :showCopyText="true" textAlign="left">
                {{ row.orderNumber }}
              </el-tooltip-copy>
            </template>
          </el-table-column>
          <el-table-column prop="event_name" label="工单名称" width="150" show-overflow-tooltip>
          <el-table-column prop="orderName" label="工单名称" width="150" show-overflow-tooltip>
            <template #default="{ row }">
              <el-tooltip-copy :content="row.event_name" :showCopyText="true" textAlign="left">
                {{ row.event_name }}
              <el-tooltip-copy :content="row.orderName" :showCopyText="true" textAlign="left">
                {{ row.orderName }}
              </el-tooltip-copy>
            </template>
          </el-table-column>
@@ -173,7 +173,7 @@
          
          <el-table-column prop="startTime" label="发起任务时间" width="160" show-overflow-tooltip />
          
          <el-table-column prop="ai_types" label="关联算法" show-overflow-tooltip />
          <el-table-column prop="aiType" label="关联算法" show-overflow-tooltip />
          
          <el-table-column prop="type" label="工单类型" width="110" show-overflow-tooltip>
            <template #default="{ row }">
@@ -665,9 +665,7 @@
  currentDetail.value.processingDetail = currentDetail.value.processing_details
  currentDetail.value.showQR = false
  currentDetail.value.latAndLon = _.round(currentDetail.value.location[0], 6) + ',' + _.round(currentDetail.value.location[1], 6)
 console.log('currentDetail.value',currentDetail.value);
 getStepInfoData(currentDetail.value.orderNumber)
  getStepInfoData(currentDetail.value.orderNumber)
}
// 更新当前详情数据
@@ -676,6 +674,19 @@
}
// 受理并派发
function handleApproveAndDispatch(detail) {
if(!detail.orderName){
   ElMessage.error('请填写工单名称');
      return;
}
if(!detail.aiType){
   ElMessage.error('请选择关联算法');
      return;
}
if(!detail.content){
   ElMessage.error('请填写工单内容');
      return;
}
  currentDetail.value = detail
  dispatchDialogVisible.value = true
}
@@ -745,7 +756,7 @@
    console.error('加载下拉框数据失败:', error)
  }
}
// 获取表格数据
// 获取表格数据
async function fetchTableData() {
  if (isFetching.value) return
  isFetching.value = true
@@ -788,19 +799,18 @@
      const longitude = Number(item.longitude) || 0
      const latitude = Number(item.latitude) || 0
      return {
      ...item,
        id: item.id,
        // orderNumber: item.event_num,
        // orderName: item.event_name,
        orderNumber: item.event_num,
        orderName: item.event_name,
        department: departments.value.find(d => d.value === item.dept_id)?.label || item.dept_name,
        startTime: item.job_create_time || '/',
        // aiType: item.ai_types,
        // content: item.content,
        aiType: item.ai_types,
        content: item.content,
        type: item.work_order_type_dict_key,
        keyData: !isNaN(longitude) && !isNaN(latitude)
          ? `${longitude.toFixed(6)}, ${latitude.toFixed(6)}`
          : '未知位置',
        // address: item.address,
        address: item.address,
        creator: item.event_num?.slice(0, 2) === 'AI' ? '智飞agent' : item.create_user,
        handler: item.update_user || '未分配',
        status: Number(item.status || 0),
@@ -817,7 +827,6 @@
      }
    })
console.log('tableData.value',tableData.value);
    page.total = total || 0
    if (isShowInfo.value) {
@@ -839,7 +848,9 @@
    algorithms2.value = []
    return
  }
  const matchedCategory = allAlgorithms.value.find(category => category.dict_key === typeValue)
  if (!matchedCategory || !matchedCategory.algorithms || matchedCategory.algorithms.length === 0) {
    algorithms2.value = []
    return
@@ -882,7 +893,7 @@
  }
  return colorMap[String(status)] || ''
}
// 获取tab数据
async function fetchTabCounts() {
 const statusListVal = statusList.value;
  const params = {
@@ -909,7 +920,7 @@
    })
  }
}
// tab切换
function handleTabChange(tab) {
  activeTab.value = tab.props?.name || tab.name
  
@@ -931,7 +942,6 @@
  fetchTableData()
  fetchTabCounts()
}
// 清空
function handleReset() {
  dictKey.value = ''
  Object.assign(filters, {
@@ -951,22 +961,26 @@
function handleKeyWords() {
  router.replace({})
}
// 分页
async function handleCurrentChange(val) {
  page.currentPage = val
  await nextTick()
  await fetchTableData()
}
async function sizeChange(val) {
  page.pageSize = val
  page.currentPage = 1
  await nextTick()
  await fetchTableData()
}
function handleAdd() {
  editFormData.value = null
  dialogVisible.value = true
}
async function getStepInfoData(val) {
  try {
    const orderNum = val
@@ -999,6 +1013,7 @@
    }
    return true
  } catch (error) {
    console.error('获取步骤信息失败:', error)
    if (activeTab.value === 'myTickets') {
      const statusArr = workType.value === 1 ? ['3', '4'] : fixedStatuses.value
      stepInfos.value = statusArr.map(status => ({
@@ -1014,8 +1029,6 @@
}
async function handleViewDetail(row) {
console.log('row',row);
  currentIndex.value = tableData.value.findIndex(item => item.id === row.id)
  workType.value = row.work_type !== undefined ? Number(row.work_type) : 0
  const detailData = {
@@ -1027,7 +1040,7 @@
    job_name: row.job_name || '',
  }
  await getStepInfoData(row.event_num)
  await getStepInfoData(row.orderNumber)
  currentDetail.value.status = row.status
 
  currentDetail.value = {
@@ -1035,6 +1048,8 @@
    showQR: false,
    latAndLon: _.round(detailData.location[0], 6) + ',' + _.round(detailData.location[1], 6),
  }
console.log('currentDetail.value',currentDetail.value);
  detailVisible.value = true
  handleTypeChange(currentDetail.value.type)
}
@@ -1090,6 +1105,7 @@
    ]
    export_json_to_excel(headers, exportData, '工单数据')
    console.log('数据导出成功')
  } catch (error) {
    console.error('导出失败:', error)
  } finally {
@@ -1102,11 +1118,11 @@
  const latitude = Number(item.latitude) || Number(item.location?.[1]) || 0
  return {
    工单编号:  item.event_num || '',
    工单名称: item.event_name || '',
    工单编号: item.orderNumber || item.event_num || '',
    工单名称: item.orderName || item.event_name || '',
    所属部门: item.department || item.dept_name || '',
    发起时间: item.startTime || item.create_time || '',
    关联算法: item.ai_types || '',
    关联算法: item.aiType || item.ai_types || '',
    工单内容: item.address || item.content || '',
    工单类型: types.value.find(t => t.value === (item.type || item.work_order_type_dict_key))?.label || '',
    经纬度: !isNaN(longitude) && !isNaN(latitude)
@@ -1150,6 +1166,7 @@
// 删除方法
function handleDelete(row) {
  console.log('删除工单:', row)
}
// 添加选择变化处理方法
@@ -1213,15 +1230,18 @@
    }
    // 在Vue 3中需要使用ElMessageBox.confirm
    const data = {
      id: currentItem.id,
      status: currentItem.status,
      isPass: 0,
      eventNum: currentItem.event_num,
      eventNum: currentItem.orderNumber,
    }
    const response = await flowEvent(data)
    if (response.data.code === 0) {
      console.log('工单审核通过')
      const newSelections = [...selections.value]
      newSelections.splice(currentImageIndex.value - 1, 1)
@@ -1273,12 +1293,14 @@
      id: currentItem.id,
      status: currentItem.status,
      isPass: 1,
      eventNum: currentItem.event_num,
      eventName: currentItem.event_name,
      eventNum: currentItem.orderNumber,
      eventName: currentItem.orderName,
    }
    const response = await flowEvent(data)
    if (response.data.code === 0) {
      console.log('工单审核不通过')
      const newSelections = [...selections.value]
      newSelections.splice(currentImageIndex.value - 1, 1)
      selections.value = newSelections
@@ -1385,11 +1407,11 @@
// 导出工单报表
function exportTheTick(row) {
  const params = {
    num: row.event_num
    num: row.orderNumber
  }
  exportTheTicket(params).then(res => {
    const elink = document.createElement('a')
    elink.download = row.event_name + '.docx'
    elink.download = row.orderName + '.docx'
    elink.style.display = 'none'
    const blob = new Blob([res.data])
    elink.href = URL.createObjectURL(blob)
@@ -1397,6 +1419,7 @@
    elink.click()
    document.body.removeChild(elink)
  })
  console.log('数据导出成功')
}
// 生命周期
src/views/tickets/ticketComponent/TicketDetailDialog.vue
@@ -11,9 +11,9 @@
    <div class="detail-container">
      <div class="detail-top-title">
        <div class="event-title-center event-orderNumber">
          {{ currentDetail.event_num || '工单编号' }}
          {{ currentDetail.orderNumber || '工单编号' }}
        </div>
        <div class="event-title-center">{{ currentDetail.event_name || '事件名称' }}</div>
        <div class="event-title-center">{{ currentDetail.orderName || '事件名称' }}</div>
      </div>
      <div v-if="totalTime" class="event-total-time">总耗时:{{ totalTime }}</div>   
      <!-- 工单状态流程 -->
@@ -77,7 +77,7 @@
                "
              >
                <el-input
                  v-model="currentDetail.event_name"
                  v-model="currentDetail.orderName"
                  placeholder="请输入工单名称"
                  class="required-input"
                />
@@ -90,7 +90,7 @@
                "
              >
                <el-select
                  v-model="currentDetail.ai_types"
                  v-model="currentDetail.aiType"
                  placeholder="请选择关联算法"
                  class="required-input"
                >
@@ -391,7 +391,7 @@
import { ElMessage} from 'element-plus';
const store = useStore()
const userInfo = computed(() => store.state.user.userInfo)
// console.log('userInfo',userInfo.value);
console.log('userInfo',userInfo.value);
// 定义props
const props = defineProps({
  modelValue: {
@@ -476,7 +476,7 @@
})
const formattedDetailFields = computed(() => {
  const fields = [
    { label: '工单名称', value: props.currentDetail.event_name },
    { label: '工单名称', value: props.currentDetail.orderName },
    {
      label: '工单类型',
      value: props.types.find(t => t.value === props.currentDetail.type)?.label || props.currentDetail.type,
@@ -487,7 +487,7 @@
    { label: '事件地址', value: props.currentDetail.address || props.currentDetail.latAndLon },
    {
      label: '关联算法',
      value: props.algorithms.find(t => t.value === props.currentDetail.ai_types)?.label || props.currentDetail.ai_types,
      value: props.algorithms.find(t => t.value === props.currentDetail.aiType)?.label || props.currentDetail.aiType,
    },
    { label: '发起单位', value: props.currentDetail.department },
    { label: '发起任务时间', value: props.currentDetail.startTime },
@@ -549,7 +549,7 @@
const loadStepInfo = async () => {
  try {
    const stepResponse = await getStepInfo(props.currentDetail.event_num);
    const stepResponse = await getStepInfo(props.currentDetail.orderNumber);
    const steps = Array.isArray(stepResponse.data.data)
      ? stepResponse.data.data
      : stepResponse.data.data?.steps || [];
@@ -676,7 +676,7 @@
      id: props.currentDetail.id,
      status: props.currentDetail.status,
      isPass: 0,
      eventNum: props.currentDetail.event_num,
      eventNum: props.currentDetail.orderNumber,
    };
    const response = await flowEvent(data);
@@ -747,7 +747,7 @@
      id: props.currentDetail.id,
      status: props.currentDetail.status,
      processingDetails: props.currentDetail.processingDetail,
      eventNum: props.currentDetail.event_num,
      eventNum: props.currentDetail.orderNumber,
    };
    const file = props.currentDetail.photos?.[0]?.raw || null;