Merge remote-tracking branch 'origin/dev' into dev
| | |
| | | </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" |
| | | /> |
| | |
| | | <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> |
| | |
| | | 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; |
| | |
| | | searchForm.date_enum = 'TODAY'; |
| | | searchForm.area_code = userAreaCode.value; |
| | | checked.value = 'today'; |
| | | signDevice_sn.value = '' |
| | | algorithmRef.value?.clear() |
| | | handleNodeClick({ id: userAreaCode.value }); |
| | | handleSearch(); |
| | | }; |
| | |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | align-items: center; |
| | | gap: 20px 12px; // 设置行间距和列间距 |
| | | gap: 20px 15px; // 设置行间距和列间距 |
| | | |
| | | .more { |
| | | cursor: pointer; |
| | |
| | | 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; |
| | |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | // margin-left: px; |
| | | img { |
| | | width: 14px; |
| | | height: 14px; |
| | |
| | | emit('businessChange', value) |
| | | } |
| | | |
| | | const clear = () => { |
| | | ai_types.value = [] // 清空算法选择 |
| | | handleAlgorithmChange(ai_types.value) |
| | | } |
| | | |
| | | defineExpose({ |
| | | clear, |
| | | }) |
| | | |
| | | onMounted(() => { |
| | | requestDictionary() |
| | | }) |
| | |
| | | <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 |
| | |
| | | }"> |
| | | {{ 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"> |
| | |
| | | <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> |
| | | <!-- 添加任务 --> |
| | |
| | | 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({ |
| | |
| | | |
| | | // 获取任务列表 |
| | | 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 |
| | |
| | | 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', |
| | | }, |
| | | }, |
| | | }, |
| | |
| | | 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)] || '' |
| | | }, |
| | |
| | | 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 => ({ |
| | |
| | | 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; |
| | |
| | | }, |
| | | 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: { |
| | |
| | | }, |
| | | }); |
| | | 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) => { |
| | |
| | | }); |
| | | }; |
| | | 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(); |
| | | }; |
| | | |
| | |
| | | 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) => { |