无人机管理后台前端(已迁走)
罗广辉
2025-07-21 24ed311c46eaaebdfa6f226998306093d923cb56
Merge remote-tracking branch 'origin/dev' into dev
9 files modified
240 ■■■■ changed files
src/views/job/components/SearchBox.vue 41 ●●●●● patch | view | raw | blame | history
src/views/job/components/TaskAlgorithmBusiness.vue 9 ●●●●● patch | view | raw | blame | history
src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue 71 ●●●● patch | view | raw | blame | history
src/views/job/components/TaskTop/TaskIndustry.vue 12 ●●●● patch | view | raw | blame | history
src/views/tickets/ticket.vue 8 ●●●● patch | view | raw | blame | history
src/views/wel/components/flightStatistics.vue 81 ●●●● patch | view | raw | blame | history
src/views/wel/components/flyratio.vue 6 ●●●● patch | view | raw | blame | history
src/views/wel/components/proportionStatic.vue 6 ●●●● patch | view | raw | blame | history
src/views/wel/components/taskOutcome.vue 6 ●●●● patch | view | raw | blame | history
src/views/job/components/SearchBox.vue
@@ -57,9 +57,21 @@
            </div>
          </div>
        </el-form-item>
        <div class="more" v-if="isExpand" @click="toggleExpand">收起</div>
        <div class="more" v-else @click="toggleExpand">更多</div>
        <div class="search-btn" :style="{ bottom: isExpand ? '5px' : '-3px' }">
          <div class="btn clear" @click="handleReset">
            <img src="@/assets/images/task/clear.png" />重置
          </div>
          <div class="btn search" @click="handleSearch">
            <img src="@/assets/images/task/search.png" />搜索
          </div>
          <!-- <div class="btn add" @click="addTask"><img src="@/assets/images/task/add.png"/>新增</div> -->
        </div>
        <el-form-item label="任务算法:" v-if="isExpand" class="taskAlgorithm">
          <TaskAlgorithmBusiness
            :setWidth="222"
          ref="algorithmRef"
            :setWidth="160"
            :showAlgorithm="true"
            @algorithmChange="algorithmChange"
          />
@@ -108,17 +120,6 @@
            <el-option label="临时任务" :value="0" />
          </el-select>
        </el-form-item>
        <div class="more" v-if="isExpand" @click="toggleExpand">收起</div>
        <div class="more" v-else @click="toggleExpand">更多</div>
        <div class="search-btn" :style="{ bottom: isExpand ? '5px' : '-3px' }">
          <div class="btn search" @click="handleSearch">
            <img src="@/assets/images/task/search.png" />搜索
          </div>
          <div class="btn clear" @click="handleReset">
            <img src="@/assets/images/task/clear.png" />清空
          </div>
          <!-- <div class="btn add" @click="addTask"><img src="@/assets/images/task/add.png"/>新增</div> -->
        </div>
      </div>
    </el-form>
  </div>
@@ -136,6 +137,8 @@
const store = useStore();
const userAreaCode = computed(() => store.getters.userInfo.detail.areaCode);
const selectedAreaCode = computed(() => store.state.user.selectedAreaCode);
const algorithmRef = ref(null)
const isExpand = ref(false);
const toggleExpand = () => {
  isExpand.value = !isExpand.value;
@@ -282,6 +285,8 @@
  searchForm.date_enum = 'TODAY';
  searchForm.area_code = userAreaCode.value;
  checked.value = 'today';
  signDevice_sn.value = ''
    algorithmRef.value?.clear()
  handleNodeClick({ id: userAreaCode.value });
  handleSearch();
};
@@ -360,7 +365,7 @@
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 20px 12px; // 设置行间距和列间距
    gap: 20px 15px; // 设置行间距和列间距
    .more {
      cursor: pointer;
@@ -369,16 +374,17 @@
      color: #1c5cff;
      line-height: 32px;
      font-size: 16px;
      margin: 0 28px;
    }
    .search-btn {
      position: absolute;
      right: 0;
      // position: absolute;
      // right: 0;
      display: flex;
      justify-content: space-between;
      cursor: pointer;
      font-size: 14px;
      font-size: 14px;
      .btn {
        width: 80px;
        height: 32px;
@@ -387,6 +393,7 @@
        display: flex;
        justify-content: center;
        align-items: center;
        // margin-left: px;
        img {
          width: 14px;
          height: 14px;
src/views/job/components/TaskAlgorithmBusiness.vue
@@ -77,6 +77,15 @@
    emit('businessChange', value)
}
const clear = () => {
    ai_types.value = [] // 清空算法选择
    handleAlgorithmChange(ai_types.value)
}
defineExpose({
    clear,
})
onMounted(() => {
    requestDictionary()
})
src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue
@@ -17,6 +17,7 @@
                <el-table-column prop="ai_type_str" label="关联算法" show-overflow-tooltip align="center" />
                <el-table-column label="任务状态" align="center">
                    <template #default="scope">
                        <div class="base_f_c_c">
                        <span :style="{
                            color:
                                scope.row.status === 1
@@ -33,6 +34,16 @@
                        }">
                            {{ scope.row.status ? getStatusText(scope.row.status) : '' }}
                        </span>
                        <el-tooltip
                                class="item"
                                effect="dark"
                                :content="scope.row.reason"
                                placement="top"
                                popper-class="reasonNotFly ztzf-tooltip-box1"
                            >
                                <el-icon v-if="scope.row.status === 5 && scope.row.reason" color="#FF4848"><QuestionFilled /></el-icon>
                            </el-tooltip>
                        </div>
                    </template>
                </el-table-column>
                <el-table-column prop="is_circle_job" label="任务类型" align="center">
@@ -50,43 +61,25 @@
                <el-table-column prop="creator_name" label="创建人" align="center" show-overflow-tooltip />
                <el-table-column label="操作" width="200" align="center">
                    <template #default="scope">
                        <div
                            v-if="scope.row.status === 2"
                            class="btnItem"
                            link
                            type="primary"
                            @click="turnBack(scope.row)"
                        >
                        <!-- <el-button type="text" @click="rejectDetail(row.id)">驳回原因</el-button> -->
                        <el-button icon="el-icon-back" v-if="scope.row.status === 2" type="text"
                            @click="turnBack(scope.row)">
                            返航
                        </div>
                        <div
                            v-if="scope.row.status === 1"
                            class="btnItem"
                            link
                            type="primary"
                            @click="cancelTask(scope.row)"
                        >
                        </el-button>
                        <el-button icon="el-icon-close" v-if="scope.row.status === 1" type="text"
                            @click="cancelTask(scope.row)">
                            取消任务
                        </div>
                        <div class="btnItem" link type="primary" @click="handleDetail(scope.row)">查看</div>
                        </el-button>
                        <el-button icon="el-icon-view" type="text" @click="handleDetail(scope.row)">查看</el-button>
                    </template>
                </el-table-column>
            </el-table>
        </div>
        <div class="pagination">
            <el-pagination
                class="ztzf-pagination"
                popper-class="custom-pagination-dropdown"
                background
                :page-sizes="[10, 20, 30, 40,50,100]"
                :size="size"
                v-model:current-page="jobListParams.current"
                v-model:page-size="jobListParams.size"
                layout="total, sizes, prev, pager, next, jumper"
                :total="total"
                @size-change="handleSizeChange"
                @current-change="handleCurrentChange"
            />
            <el-pagination class="ztzf-pagination" popper-class="custom-pagination-dropdown" background
                :page-sizes="[10, 20, 30, 40, 50, 100]" :size="size" v-model:current-page="jobListParams.current"
                v-model:page-size="jobListParams.size" layout="total, sizes, prev, pager, next, jumper" :total="total"
                @size-change="handleSizeChange" @current-change="handleCurrentChange" />
        </div>
    </div>
    <!-- 添加任务 -->
@@ -113,7 +106,7 @@
import DeviceJobDetails from '../DeviceJobDetails.vue'
import CancelTaskDialog from '../CancelTaskDialog.vue'
import { useStore } from 'vuex'
import { cloneDeep } from 'lodash';
import { cloneDeep } from 'lodash'
const store = useStore()
const singleUavHome = computed(() => store.state.home.singleUavHome)
const jobListParams = reactive({
@@ -130,14 +123,14 @@
// 获取任务列表
const getJobList = () => {
  const apiParams = {
    ...cloneDeep(jobListParams),
    searchParams: {
      ...cloneDeep(jobListParams.searchParams),
      status_list: jobListParams.searchParams.status || undefined,
      status: undefined,
    },
  }
    const apiParams = {
        ...cloneDeep(jobListParams),
        searchParams: {
            ...cloneDeep(jobListParams.searchParams),
            status_list: jobListParams.searchParams.status || undefined,
            status: undefined,
        },
    }
    jobList(apiParams).then(res => {
        if (res.data.code !== 0) return
        jobListData.value = res.data.data.records
src/views/job/components/TaskTop/TaskIndustry.vue
@@ -39,24 +39,24 @@
            name: '机巢事件统计',
            type: 'pie',
            // roseType: 'radius',
            radius: ['40%', '70%'],
            radius: ['36%', '60%'],
            // center: ['50%', '45%'],
            // radius: '70%', // 设置饼图的半径
            center: ['50%', '50%'], // 调整饼图位置
            center: ['50%', '36%'], // 调整饼图位置
            data: [],
            label: {
                show: true,
                position: 'outside',
                formatter: '{c}',
                fontSize: 12,
                color: '#fff',
                color: '#000',
            },
            labelLine: {
                show: true,
                length: 5,
                length2: 8,
                length: 10,
                length2: 10,
                lineStyle: {
                    color: '#fff',
                    color: '#000',
                },
            },
        },
src/views/tickets/ticket.vue
@@ -1457,10 +1457,10 @@
      if (status === -1 || status === '-1') return ''
      // 状态颜色映射
      const colorMap = {
        0: '#ffb6b6', // 待处理-淡红
        3: '#e57373', // 处理中-更淡红
        2: '#faad14', // 待审核-橙色
        4: '#a0cfff', // 已完成-淡蓝
        0: '#FF7411', // 待处理-淡红
        3: '#FFC300', // 处理中-更淡红
        2: '#FF472F', // 待审核-橙色
        4: '#0291A1', // 已完成-淡蓝
      }
      return colorMap[String(status)] || ''
    },
src/views/wel/components/flightStatistics.vue
@@ -67,21 +67,16 @@
const unitMap = {
  飞行时长: '小时',
  飞行里程: '公里',
  //   任务成果: '个',
};
const flyTypeList = ref([
  { name: '飞行时长', value: 0, img: flyImg1, key: 'hour_count' },
  { name: '飞行里程', value: 0, img: flyImg2, key: 'flight_mileage' },
  //   { name: '任务成果', value: 0, img: flyImg3 },
]);
// 飞行统计
const getFlyList = () => {
  // getFly(params.value).then(res => {
  //   flyTypeList.value = flyTypeList.value.map(item => ({
  //     ...item,
  //     value: res.data.data[keyMapping[item.name]] || 0,
  //   }));
  // });
  tongjiNestApi(flyparams.value).then(res => {
    flyTypeList.value = flyTypeList.value.map(item => ({
@@ -94,18 +89,19 @@
const getFlyTimeList = () => {
  getFlyTime(params.value).then(res => {
    const resList = res?.data?.data || [];
    console.log('飞行',resList);
    lineCharts(resList);
  });
};
const refresh = () => {
  params.value.date_enum = 'CURRENT_YEAR';
  checked.value = 'CURRENT_YEAR';
  dateSelect.value = 'CURRENT_YEAR';
  getFlyList();
  getFlyTimeList();
};
let timeClick = (item, index) => {
  checked.value = item;
  params.value.date_enum = item;
  dateSelect.value = item;
@@ -187,41 +183,40 @@
    },
    yAxis: [
      {
        type: 'log',
        name: '单位:小时',
    type: 'value',
    name: '单位:小时',
    nameTextStyle: {
      color: '#383838',
      fontSize: '1.2rem',
    },
    axisLine: {
      show: false,
      lineStyle: {
        color: '#cdd5e2',
      },
    },
    splitLine: {
      show: true,
      lineStyle: {
        type: 'dashed',
        color: '#cdd5e2',
        width: 1,
        opacity: 0.5,
      },
    },
    axisLabel: {
      color: '#666666',
    }
  },
      {
        type: 'value',
        name: '单位:公里',
        nameTextStyle: {
          color: '#383838',
          fontSize: '1.2rem',
        },
        min: 1,
        logBase: 3,
        axisLine: {
          show: false,
          lineStyle: {
            color: '#cdd5e2',
          },
        },
        splitLine: {
          show: true,
          lineStyle: {
            type: 'dashed',
            color: '#cdd5e2',
            width: 1,
            opacity: 0.5,
          },
        },
        axisLabel: {
          color: '#666666', // 直接配置颜色
        },
      },
      {
        type: 'log',
        name: '单位:公里',
        nameTextStyle: {
          color: '#383838',
        },
        min: 1,
        logBase: 3,
        axisLine: {
          show: false,
          lineStyle: {
src/views/wel/components/flyratio.vue
@@ -52,9 +52,9 @@
  },
});
const refresh = () => {
  params.value.date_enum = 'CURRENT_YEAR';
  checked.value = 'CURRENT_YEAR';
  dateSelect.value = 'CURRENT_YEAR';
  // params.value.date_enum = 'CURRENT_YEAR';
  // checked.value = 'CURRENT_YEAR';
  // dateSelect.value = 'CURRENT_YEAR';
getIndustryJobNumPieChart();
};
let timeClick = (item, index) => {
src/views/wel/components/proportionStatic.vue
@@ -84,9 +84,9 @@
  });
};
const refresh = () => {
  params.value.date_enum = 'CURRENT_YEAR';
  checked.value = 'CURRENT_YEAR';
  dateSelect.value = 'CURRENT_YEAR';
  // params.value.date_enum = 'CURRENT_YEAR';
  // checked.value = 'CURRENT_YEAR';
  // dateSelect.value = 'CURRENT_YEAR';
  getTypeData();
};
src/views/wel/components/taskOutcome.vue
@@ -40,9 +40,9 @@
const totalNum = ref(0)
const dateSelect = ref('CURRENT_YEAR');
const refresh = () => {
  params.value.dateEnum = 'CURRENT_YEAR';
  checked.value = 'CURRENT_YEAR';
  dateSelect.value = 'CURRENT_YEAR';
  // params.value.dateEnum = 'CURRENT_YEAR';
  // checked.value = 'CURRENT_YEAR';
  // dateSelect.value = 'CURRENT_YEAR';
  getBarChartData(params.value);
};
let timeClick = (item, index) => {