forked from drone/command-center-dashboard

张含笑
2025-04-17 04cd5b43197a8831c1e1637acf96bacb7a7116fa
Merge remote-tracking branch 'origin/master'
9 files modified
11 files renamed
199 ■■■■ changed files
src/assets/images/home/useUavHome/eventAggregationImg.png patch | view | raw | blame | history
src/components/CurrentTaskDetails/ControlComPass/ControlComPass.vue 6 ●●●● patch | view | raw | blame | history
src/components/CurrentTaskDetails/ControlPanel/BaseControl.vue patch | view | raw | blame | history
src/components/CurrentTaskDetails/ControlPanel/ControlPanel.vue 2 ●●● patch | view | raw | blame | history
src/components/CurrentTaskDetails/CurrentTaskDetails.vue 27 ●●●●● patch | view | raw | blame | history
src/components/CurrentTaskDetails/RealTimeMap.vue patch | view | raw | blame | history
src/components/CurrentTaskDetails/TaskDetailsHead.vue patch | view | raw | blame | history
src/components/CurrentTaskDetails/TaskDetailsLeft.vue patch | view | raw | blame | history
src/components/CurrentTaskDetails/TaskDetailsRight.vue 2 ●●● patch | view | raw | blame | history
src/components/DeviceJobDetails/DeviceJobDetails.vue 17 ●●●●● patch | view | raw | blame | history
src/components/DeviceJobDetails/DeviceJobDetailsMap.vue patch | view | raw | blame | history
src/components/DeviceJobDetails/JobRelatedEvents.vue 5 ●●●●● patch | view | raw | blame | history
src/store/modules/task.js 2 ●●●●● patch | view | raw | blame | history
src/views/SignMachineNest/MachineRight/MachineStatus/MachineTableDetails/DeviceJob/DeviceJob.vue 11 ●●●●● patch | view | raw | blame | history
src/views/TaskManage/SearchBox.vue 62 ●●●● patch | view | raw | blame | history
src/views/TaskManage/TaskIntermediateContent/AddTask.vue 1 ●●●● patch | view | raw | blame | history
src/views/TaskManage/TaskIntermediateContent/TaskIntermediateContent.vue 6 ●●●● patch | view | raw | blame | history
src/views/TaskManage/TaskTop/TaskEvent.vue 1 ●●●● patch | view | raw | blame | history
src/views/TaskManage/TaskTop/TaskIndustry.vue 48 ●●●●● patch | view | raw | blame | history
src/views/TaskManage/components/TaskAlgorithmBusiness.vue 9 ●●●●● patch | view | raw | blame | history
src/assets/images/home/useUavHome/eventAggregationImg.png

src/components/CurrentTaskDetails/ControlComPass/ControlComPass.vue
File was renamed from src/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/ControlComPass/ControlComPass.vue
@@ -3,7 +3,7 @@
    <div class="left-img" :data-text="`${attitude_pitch}°`">
      <div class="scaleImg">
        <p class="scale" :style="{ top: 45 + ScaleTop + 'px' }"></p>
        <img src="@/assets/images/rightmapidentification.png" />
        <img src="../../../assets/images/rightmapidentification.png" />
      </div>
    </div>
    <div class="instrument-center">
@@ -14,13 +14,13 @@
        </div>
      </div>
      <div class="center-show">
        <img src="@/assets/images/mapidentification.png" />
        <img src="../../../assets/images/mapidentification.png" />
      </div>
      <div class="rotat-btn"></div>
    </div>
    <div class="right-img" :data-text="`${height}m`">
      <div class="ident-arrow">
        <img src="@/assets/images/leftmapidentification.png" />
        <img src="../../../assets/images/leftmapidentification.png" />
        <div class="arrow-box" :style="{ bottom: realHeight }">
          <div class="arrow"></div>
        </div>
src/components/CurrentTaskDetails/ControlPanel/BaseControl.vue
src/components/CurrentTaskDetails/ControlPanel/ControlPanel.vue
File was renamed from src/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/ControlPanel/ControlPanel.vue
@@ -141,7 +141,7 @@
} from '@element-plus/icons-vue'
import controlCenterImg from '@/assets/images/taskManagement/taskIntermediateContent/controlCenter.png'
import BaseControl from '@/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/ControlPanel/BaseControl.vue'
import BaseControl from '@/components/CurrentTaskDetails/ControlPanel/BaseControl.vue'
import EventBus from '@/event-bus'
import dayjs from 'dayjs'
src/components/CurrentTaskDetails/CurrentTaskDetails.vue
File was renamed from src/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/CurrentTaskDetails.vue
@@ -34,14 +34,14 @@
import { liveStart } from '@/api/home/machineNest'
import { getJobDetails } from '@/api/home/task'
import RealTimeMap from '@/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/RealTimeMap.vue'
import RealTimeMap from '@/components/CurrentTaskDetails/RealTimeMap.vue'
import { getWebsocketUrl } from '@/websocket/util/config'
import { useConnectWebSocket } from '@/utils/websocket/connect-websocket'
import { EBizCode } from '@/utils/staticData/enums'
import ControlPanel from '@/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/ControlPanel/ControlPanel.vue'
import TaskDetailsHead from '@/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/TaskDetailsHead.vue'
import TaskDetailsLeft from '@/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/TaskDetailsLeft.vue'
import TaskDetailsRight from '@/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/TaskDetailsRight.vue'
import ControlPanel from '@/components/CurrentTaskDetails/ControlPanel/ControlPanel.vue'
import TaskDetailsHead from '@/components/CurrentTaskDetails/TaskDetailsHead.vue'
import TaskDetailsLeft from '@/components/CurrentTaskDetails/TaskDetailsLeft.vue'
import TaskDetailsRight from '@/components/CurrentTaskDetails/TaskDetailsRight.vue'
import { ElMessage } from 'element-plus'
import EventBus from '@/event-bus'
@@ -51,13 +51,7 @@
provide('lineQuality', lineQuality)
const isShow = defineModel('show')
const props = defineProps({
    rowData: {
        // 任务列表row数据
        type: Object,
        default: () => ({}),
    },
})
const props = defineProps(['id'])
const currentLiveUrl = ref('')
const machineNestUrl = ref('')
const droneLiveUrl = ref('')
@@ -106,7 +100,8 @@
// 获取任务详情获取航线文件
const getTaskDetails = () => {
    getJobDetails({ wayLineJobInfoId: props.rowData.id }).then(async res => {
    if (!props.id) ElMessage.warning('请检查是否传入id')
    getJobDetails({ wayLineJobInfoId: props.id }).then(async res => {
        taskDetails.value = res.data.data
        currentLiveUrl.value = await getDeviceLiveUrl()
        taskDetails.value.workspace_id = taskDetails.value.way_lines[0]?.workspace_id
@@ -170,7 +165,7 @@
    .el-dialog {
        border-radius: 40px;
        position: relative;
        margin-top: 38px;
        margin-top: 25px;
        width: 1782px;
        height: 1002px;
        padding: 0;
@@ -187,8 +182,8 @@
            .el-dialog__headerbtn {
                position: absolute;
                right: -40px;
                top: -40px;
                right: -30px;
                top: -30px;
                .el-dialog__close {
                    font-size: 30px;
src/components/CurrentTaskDetails/RealTimeMap.vue
src/components/CurrentTaskDetails/TaskDetailsHead.vue
src/components/CurrentTaskDetails/TaskDetailsLeft.vue
src/components/CurrentTaskDetails/TaskDetailsRight.vue
File was renamed from src/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/TaskDetailsRight.vue
@@ -16,7 +16,7 @@
</template>
<script setup>
import droneImg from '@/assets/images/taskManagement/taskIntermediateContent/droneImg.png'
import BaseControl from '@/views/TaskManage/TaskIntermediateContent/CurrentTaskDetails/ControlPanel/BaseControl.vue'
import BaseControl from '@/components/CurrentTaskDetails/ControlPanel/BaseControl.vue'
const taskDetails = inject('taskDetails')
src/components/DeviceJobDetails/DeviceJobDetails.vue
File was renamed from src/views/SignMachineNest/MachineRight/MachineStatus/MachineTableDetails/DeviceJob/DeviceJobDetails/DeviceJobDetails.vue
@@ -27,7 +27,7 @@
                        <div class="itemValue">{{ flystatus ? flystatus :'' }}</div>
                    </div>
                </div>
                <JobRelatedEvents v-if="isShow" />
                <JobRelatedEvents v-if="props.wayLineJodInfoId" />
                <div class="devicetitle" v-if="isShow">
                    <p>
                        任务成果
@@ -101,7 +101,12 @@
const mediaType = ref('')
const total = ref(0)
const achievementList = ref([])
const wayLineJodInfoId = inject('wayLineJodInfoId')
const props = defineProps(['wayLineJodInfoId'])
const wayLineJodInfoId = computed(()=> props.wayLineJodInfoId)
provide('wayLineJodInfoId',wayLineJodInfoId)
const getAchievement = () => {
    getJobInfoFiles({ jobInfoId: wayLineJodInfoId.value }).then(res => {
        for (let i = 0; i < res.data.data.length; i++) {
@@ -132,11 +137,9 @@
    })
}
watch(isShow, (newValue, oldValue) => {
    if (newValue) {
        getDetails()
        getAchievement()
    }
onMounted(() => {
    getDetails()
    getAchievement()
})
</script>
src/components/DeviceJobDetails/DeviceJobDetailsMap.vue
src/components/DeviceJobDetails/JobRelatedEvents.vue
File was renamed from src/views/SignMachineNest/MachineRight/MachineStatus/MachineTableDetails/DeviceJob/DeviceJobDetails/JobRelatedEvents.vue
@@ -20,7 +20,7 @@
                    <div class="processing" v-if="scope.row.status === 3">处理中</div>
                    <div class="done" v-if="scope.row.status === 4">已完成</div>
                    <div class="ended" v-if="scope.row.status === 5">已完结</div>
                </template>
            </el-table-column>
            <el-table-column label="操作" width="80">
@@ -67,13 +67,14 @@
}
const wayLineJodInfoId = inject('wayLineJodInfoId')
const getList = () => {
    params.value.wayLineJodInfoId = wayLineJodInfoId.value
    getDeviceEventList(params.value, sizeParams.value).then(res => {
        const resData = res?.data?.data || {}
        list.value = resData.records
        total.value = resData.total
    })
}
src/store/modules/task.js
@@ -8,8 +8,6 @@
  actions: {},
  mutations: {
    setTaskSearchParams: (state, data) => {
      console.log(data)
            // setStore({ name: 'taskSearchParams', content: data })
            state.taskSearchParams = data;
        },
  },
src/views/SignMachineNest/MachineRight/MachineStatus/MachineTableDetails/DeviceJob/DeviceJob.vue
@@ -36,7 +36,7 @@
        <el-pagination
        class="ztzf-pagination"
            background
            v-model:current-page="sizeParams.current"
            v-model:page-size="sizeParams.size"
            layout=" prev, pager, next, jumper"
@@ -45,11 +45,15 @@
        />
    </div>
    <DeviceJobDetails v-model:show="deviceJobDetailsShow" />
    <DeviceJobDetails
        v-if="deviceJobDetailsShow"
        v-model:show="deviceJobDetailsShow"
        :wayLineJodInfoId="wayLineJodInfoId"
    />
</template>
<script setup>
import { useStore } from 'vuex'
import DeviceJobDetails from './DeviceJobDetails/DeviceJobDetails.vue'
import DeviceJobDetails from '@/components/DeviceJobDetails/DeviceJobDetails.vue'
import { getDeviceJobList } from '@/api/home/task'
const list = ref([])
@@ -65,7 +69,6 @@
const total = ref(0)
const deviceJobDetailsShow = ref(false)
const wayLineJodInfoId = ref(null)
provide('wayLineJodInfoId', wayLineJodInfoId)
const viewJob = row => {
    wayLineJodInfoId.value = row.id
    deviceJobDetailsShow.value = true
src/views/TaskManage/SearchBox.vue
@@ -40,7 +40,7 @@
          </div>
        </el-form-item>
        <el-form-item label="任务算法:" v-if="isExpand">
          <TaskAlgorithmBusiness :setWidth="200" :showAlgorithm="true" @algorithmChange="algorithmChange"/>
          <TaskAlgorithmBusiness :setWidth="186" :showAlgorithm="true" @algorithmChange="algorithmChange"/>
        </el-form-item>
        <el-form-item label="所属部门:" v-if="isExpand">
          <el-select class="ztzf-select" v-model="searchForm.create_dept" placeholder="请选择部门" clearable>
@@ -53,7 +53,7 @@
          </el-select>
        </el-form-item>
        <el-form-item label="任务类型:" v-if="isExpand">
          <TaskAlgorithmBusiness :setWidth="200" :showBusiness="true" @businessChange="businessChange"/>
          <TaskAlgorithmBusiness :setWidth="186" :showBusiness="true" @businessChange="businessChange"/>
        </el-form-item>
        <div class="more" v-if="isExpand" @click="toggleExpand">收起</div>
        <div class="more" v-else @click="toggleExpand">更多</div>
@@ -84,7 +84,7 @@
  ai_types: [], // 算法类型
  area_code: '', // 区域code
  create_dept: '', // 创建部门
  date_enum: '', // 日期枚举,可用值:TODAY,CURRENT_WEEK,CURRENT_MONTH,CURRENT_YEAR
  date_enum: 'TODAY', // 日期枚举,可用值:TODAY,CURRENT_WEEK,CURRENT_MONTH,CURRENT_YEAR
  device_sn: '', // 设备编号
  end_date: null, // 结束时间
  industry_type: '', // 行业key
@@ -102,30 +102,6 @@
];
const emit = defineEmits(['search','addTask']);
const handleSearch = () => {
  // 提交至store
  let params = {
    ...searchForm,
    start_date: dateRange.value.length ? `${dateRange.value[0]} 00:00:00` : null,
    end_date: dateRange.value.length ? `${dateRange.value[1]} 23:59:59` : null
  }
  store.commit('setTaskSearchParams', params);
  emit('search', params);
};
const handleReset = () => {
  dateRange.value = null;
  Object.keys(searchForm).forEach(key => {
    searchForm[key] = '';
  });
  handleSearch();
};
// 新增任务
const addTask = () => {
  emit('addTask');
};
const algorithmChange = (val) => {
  searchForm.ai_types = val;
@@ -160,6 +136,7 @@
};
const deptChange = (value) => {
  // 处理机巢数据
  searchForm.device_sn = '';
  machineData.value = '';
  machineData.value = deptTreeData.value.find(item => item.area_code === value)?.devices || [];
  // 所属部门重新请求值
@@ -193,13 +170,42 @@
  // model.value = dateRanges[item];
  // emit('change', dateRanges[item],timeListEnum[index]);
  searchForm.date_enum = timeListEnum[index];
  handleSearch();
};
// 搜索
const handleSearch = () => {
  if (!dateRange.value) { dateRange.value = []; }
  // 提交至store
  let params = {
    ...searchForm,
    start_date: dateRange.value.length ? `${dateRange?.value[0]} 00:00:00` : null,
    end_date: dateRange.value.length ? `${dateRange?.value[1]} 23:59:59` : null
  }
  store.commit('setTaskSearchParams', params);
  emit('search', params);
};
// 重置
const handleReset = () => {
  dateRange.value = [];
  Object.keys(searchForm).forEach(key => {
    searchForm[key] = '';
  });
  searchForm.ai_types = [];
  searchForm.date_enum = 'TODAY';
  checked.value = 'today';
  handleSearch();
};
// 新增任务
const addTask = () => {
  emit('addTask');
};
onMounted(() => {
  // requestDictionary();
  getDeptsByAreaCode();
  requestDockInfo();
  // 查询一次
  handleSearch();
});
</script>
src/views/TaskManage/TaskIntermediateContent/AddTask.vue
@@ -8,6 +8,7 @@
        :width="pxToRem(1500)"
        :close-on-click-modal="false"
        :destroy-on-close="true"
        @close="cancel"
    >
        <!-- <el-divider content-position="left">新建任务</el-divider> -->
        <div class="task-contain">
src/views/TaskManage/TaskIntermediateContent/TaskIntermediateContent.vue
@@ -59,13 +59,13 @@
  <!-- 添加任务 -->
  <AddTask v-model:show="isShowAddTask" @refresh="searchClick"/>
  <!-- 当前任务详情 -->
  <CurrentTaskDetails v-if="isShowCurrentTaskDetails"  v-model:show="isShowCurrentTaskDetails" :rowData="rowData"/>
  <CurrentTaskDetails v-if="isShowCurrentTaskDetails"  v-model:show="isShowCurrentTaskDetails" :id="rowData.id"/>
</template>
<script setup>
import SearchBox from '../SearchBox.vue';
import AddTask from './AddTask.vue';
import CurrentTaskDetails from './CurrentTaskDetails/CurrentTaskDetails.vue';
import CurrentTaskDetails from '@/components/CurrentTaskDetails/CurrentTaskDetails.vue';
import { jobList } from '@/api/home/task';
import { ElMessage } from 'element-plus'
@@ -105,7 +105,7 @@
        if (row.status === 2 || row.status === 1){
            rowData.value = row? row : {};
            isShowCurrentTaskDetails.value = true;
        }else{
        } else{
            ElMessage.warning('todo 跳历史任务详情')
        }
    }else{
src/views/TaskManage/TaskTop/TaskEvent.vue
@@ -117,7 +117,6 @@
// 添加监听
watch(() => store.state.task.taskSearchParams, (newVal) => {
  console.log(newVal, '1111');
  if (newVal) {
    getJobEventBar(newVal);
  }
src/views/TaskManage/TaskTop/TaskIndustry.vue
@@ -1,7 +1,7 @@
<!-- 任务算法统计 -->
 <template>
  <div class="task-industry">
    <div class="title">任务算法统计</div>
    <div class="title">任务算法类型</div>
    <div class="chart" ref="chartRef"></div>
  </div>
 </template>
@@ -41,13 +41,14 @@
      roseType: 'radius',
      radius: ['20%', '70%'],
      center: ['50%', '45%'],
      data: [
        { name: '国土类', value: 0, itemStyle: { color: '#3D7FFF' } },
        { name: '城管类', value: 0, itemStyle: { color: '#8277E9' } },
        { name: '消防类', value: 0, itemStyle: { color: '#FFB77E' } },
        { name: '林业类', value: 0, itemStyle: { color: '#44D7B6' } },
        { name: '公安类', value: 0, itemStyle: { color: '#62F4FF' } }
      ],
      data: [],
      // [
      //   { name: '国土类', value: 0, itemStyle: { color: '#3D7FFF' } },
      //   { name: '城管类', value: 0, itemStyle: { color: '#8277E9' } },
      //   { name: '消防类', value: 0, itemStyle: { color: '#FFB77E' } },
      //   { name: '林业类', value: 0, itemStyle: { color: '#44D7B6' } },
      //   { name: '公安类', value: 0, itemStyle: { color: '#62F4FF' } }
      // ],
      label: {
        show: true,
        position: 'outside',
@@ -71,36 +72,19 @@
const getIndustryJobNumPieChart = (value) => {
  industryJobNumPieChart(value).then(res => {
    if (res.data.code !== 0) return;
    option.series[0].data.forEach(item => {
      const matchData = res.data.data.find(d => d.name === item.name);
      if (matchData) {
        item.value = matchData.value;
      }
    });
    option.series[0].data = res.data.data;
    // forEach(item => {
    //   const matchData = res.data.data.find(d => d.name === item.name);
    //   if (matchData) {
    //     item.value = matchData.value;
    //   }
    // });
    chart.value.setOption(option);
  });
};
// 获取行业统计数据
// const getIndustryJobNumPieChart = () => {
//   industryJobNumPieChart().then(res => {
//     if (res.data.code !== 0) return;
//     const data = res.data.data.map(item => ({
//       name: item.name,
//       value: item.value,
//       itemStyle: {
//         color: getRandomColor()
//       }
//     }));
//     option.series[0].data = data;
//     chart.value.setOption(option);
//   });
// };
// 添加监听
watch(() => store.state.task.taskSearchParams, (newVal) => {
  console.log(newVal, '2222');
  if (newVal) {
    getIndustryJobNumPieChart(newVal);
  }
src/views/TaskManage/components/TaskAlgorithmBusiness.vue
@@ -1,12 +1,12 @@
<!-- 关联算法和综合业务 -->
<template>
  <div class="task-algorithm" v-if="showAlgorithm">
    <el-select class="ztzf-select" :style="{ width:setWidth +'px' }" v-model="ai_types" multiple collapse-tags collapse-tags-tooltip placeholder="请选择算法" clearable @change="handleAlgorithmChange">
    <el-select class="ztzf-select" :style="{ width: pxToRem(setWidth) }" v-model="ai_types" multiple collapse-tags collapse-tags-tooltip placeholder="请选择算法" clearable @change="handleAlgorithmChange">
      <el-option v-for="item in taskAlgorithm" :key="item.id" :label="item.dictValue" :value="item.dictKey" />
    </el-select>
  </div>
  <div class="task-business" v-if="showBusiness">
    <el-select class="ztzf-select" :style="{ width:setWidth +'px' }" v-model="industry_type" placeholder="请选择类型" clearable @change="handleBusinessChange">
    <el-select class="ztzf-select" :style="{ width: pxToRem(setWidth) }" v-model="industry_type" placeholder="请选择类型" clearable @change="handleBusinessChange">
      <el-option v-for="item in taskBusiness" :key="item.id" :label="item.dictValue" :value="item.dictKey" />
    </el-select>
  </div>
@@ -14,7 +14,8 @@
<script setup>
import { getMultipleDictionary } from '@/api/system/dictbiz'
import { getMultipleDictionary } from '@/api/system/dictbiz';
import { pxToRem } from '@/utils/rem'
// 接收父组件传参
const props = defineProps({
@@ -27,7 +28,7 @@
    default: false
  },
  setWidth: {
    type: String,
    type: Number,
    default: '100%'
  }
});