| | |
| | | xAxis: { |
| | | type: 'value', |
| | | splitLine: { lineStyle: { color: '#E5E5E5' } }, |
| | | axisLabel: { color: '#35455aa6' }, |
| | | axisLabel: { color: '#7C8091' }, |
| | | boundaryGap: [0, 0.01], |
| | | }, |
| | | yAxis: { |
| | | type: 'category', |
| | | data: optionData.yAxisData, |
| | | axisLabel: { color: '#35455aa6' }, |
| | | axisLabel: { color: '#7C8091' }, |
| | | axisLine: { lineStyle: { color: '#D1D1D1' } }, |
| | | axisTick: { show: false }, |
| | | // 4. 确保排序后的数据从上到下显示(最大值在顶部) |
| | |
| | | </div> |
| | | </div> |
| | | <div class="status-list"> |
| | | <div v-for="(status, statusIndex) in newtitleData[item].status_map" :key="statusIndex" class="status-item" |
| | | <div |
| | | v-for="(status, statusIndex) in newtitleData[item].status_map" |
| | | :key="statusIndex" |
| | | class="status-item" |
| | | :class="getStatusStyle(test[item]?.name, statusIndex)" |
| | | :style="{ color: getStatusColor(test[item]?.name, statusIndex) }"> |
| | | <span class="indicator" :style="{ |
| | | backgroundColor: getStatusBackground(test[item]?.name, statusIndex), |
| | | color: getStatusColor(test[item]?.name, statusIndex), |
| | | }"></span> |
| | | :style="{ color: getStatusColor(test[item]?.name, statusIndex) }" |
| | | > |
| | | <span |
| | | class="indicator" |
| | | :style="{ |
| | | backgroundColor: getStatusBackground(test[item]?.name, statusIndex), |
| | | color: getStatusColor(test[item]?.name, statusIndex), |
| | | }" |
| | | ></span> |
| | | <span class="label">{{ getStatusLabel(test[item]?.name, statusIndex) }}</span> |
| | | <span class="count">{{ status }} {{ test[item]?.name === '无人机' ? '架' : '个' }}</span> |
| | | <span class="count" |
| | | >{{ status }} {{ test[item]?.name === '无人机' ? '架' : '个' }}</span |
| | | > |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { useStore } from 'vuex' |
| | | import { computed } from 'vue' |
| | | import titleImg1 from '@/assets/images/workbench/st3.png' |
| | | import titleImg2 from '@/assets/images/workbench/st4.png' |
| | | import titleImg3 from '@/assets/images/workbench/st5.png' |
| | | import titleImg4 from '@/assets/images/workbench/st6.png' |
| | | import titleImg5 from '@/assets/images/workbench/st8.png' |
| | | import titleImg6 from '@/assets/images/workbench/st9.png' |
| | | import { getStatics } from '@/api/home/index' |
| | | import { useRouter } from 'vue-router' |
| | | const router = useRouter() |
| | | const store = useStore() |
| | | import { useStore } from 'vuex'; |
| | | import { computed } from 'vue'; |
| | | import titleImg1 from '@/assets/images/workbench/st3.png'; |
| | | import titleImg2 from '@/assets/images/workbench/st4.png'; |
| | | import titleImg3 from '@/assets/images/workbench/st5.png'; |
| | | import titleImg4 from '@/assets/images/workbench/st6.png'; |
| | | import titleImg5 from '@/assets/images/workbench/st8.png'; |
| | | import titleImg6 from '@/assets/images/workbench/st9.png'; |
| | | import { getStatics } from '@/api/home/index'; |
| | | import { useRouter } from 'vue-router'; |
| | | const router = useRouter(); |
| | | const store = useStore(); |
| | | const refresh = () => { |
| | | getStaticsList() |
| | | } |
| | | getStaticsList(); |
| | | }; |
| | | const jumppage = () => { |
| | | router.push({ |
| | | path: '/device/index', |
| | | }) |
| | | path: '/device/index', |
| | | }); |
| | | }; |
| | | const userInfo = computed(() => store.getters.userInfo); |
| | | const permission = computed(() => store.getters.permission); |
| | | |
| | | } |
| | | const userInfo = computed(() => store.getters.userInfo) |
| | | const permission = computed(() => store.getters.permission) |
| | | |
| | | |
| | | const newtitleData = ref({}) |
| | | const newtitleData = ref({}); |
| | | const titleData = ref([ |
| | | { |
| | | img: titleImg1, |
| | |
| | | leisure: 0, |
| | | offline: 0, |
| | | }, |
| | | ]) |
| | | ]); |
| | | const test = { |
| | | no_move_list: { |
| | | name: '机巢', |
| | |
| | | name: '机巢保险', |
| | | img: titleImg6, |
| | | }, |
| | | } |
| | | }; |
| | | const statusSelect = { |
| | | 0: '空闲中', |
| | | 4: '作业中', |
| | | '-1': '离线中', |
| | | } |
| | | }; |
| | | const flowStatus = { |
| | | 0: '流量无忧', |
| | | 1: '流量到期', |
| | | 2: '流量不足', |
| | | } |
| | | }; |
| | | const monitorStatus = { |
| | | 0: '离线中', |
| | | 1: '在线中', |
| | | } |
| | | }; |
| | | const insureStatus = { |
| | | 0: '临近到期', |
| | | 1: '正常期限', |
| | | } |
| | | }; |
| | | // 样式配置对象 |
| | | const statusStyles = { |
| | | 机巢保险: { |
| | |
| | | 4: { class: 'success', color: '#11ce3e', background: '#11ce3e' }, |
| | | '-1': { class: 'success', color: '#bababa', background: '#bababa' }, |
| | | }, |
| | | } |
| | | }; |
| | | const getStatusStyle = (name, statusIndex) => { |
| | | // 获取样式配置,优先使用名称专属配置 |
| | | const styleConfig = statusStyles[name] || statusStyles.default |
| | | return styleConfig[statusIndex]?.class || '' |
| | | } |
| | | const styleConfig = statusStyles[name] || statusStyles.default; |
| | | return styleConfig[statusIndex]?.class || ''; |
| | | }; |
| | | |
| | | const getStatusColor = (name, statusIndex) => { |
| | | // 获取颜色配置,优先使用名称专属配置 |
| | | const styleConfig = statusStyles[name] || statusStyles.default |
| | | return styleConfig[statusIndex]?.color || '#333' |
| | | } |
| | | const styleConfig = statusStyles[name] || statusStyles.default; |
| | | return styleConfig[statusIndex]?.color || '#333'; |
| | | }; |
| | | // 新增背景颜色获取方法 |
| | | const getStatusBackground = (name, statusIndex) => { |
| | | const styleConfig = statusStyles[name] || statusStyles.default |
| | | const styleConfig = statusStyles[name] || statusStyles.default; |
| | | return ( |
| | | styleConfig[statusIndex]?.background || |
| | | styleConfig[statusIndex]?.color || // 降级使用字体颜色 |
| | | '#F0F0F0' |
| | | ) // 最终默认颜色 |
| | | } |
| | | ); // 最终默认颜色 |
| | | }; |
| | | const getStatusLabel = (itemName, statusCode) => { |
| | | switch (itemName) { |
| | | case '机巢流量': |
| | | return flowStatus[statusCode] || statusSelect[statusCode] |
| | | return flowStatus[statusCode] || statusSelect[statusCode]; |
| | | case '监控设备': |
| | | return monitorStatus[statusCode] || statusSelect[statusCode] |
| | | return monitorStatus[statusCode] || statusSelect[statusCode]; |
| | | case '机巢保险': |
| | | return insureStatus[statusCode] || statusSelect[statusCode] |
| | | return insureStatus[statusCode] || statusSelect[statusCode]; |
| | | default: |
| | | return statusSelect[statusCode] || `未知状态(${statusCode})` |
| | | return statusSelect[statusCode] || `未知状态(${statusCode})`; |
| | | } |
| | | } |
| | | }; |
| | | const getStaticsList = () => { |
| | | getStatics(userInfo.value.detail.areaCode).then(res => { |
| | | console.log('userInfo.value.detail.areaCode',permission.value); |
| | | // console.log('userInfo.value.detail.areaCode',permission.value); |
| | | if (permission.value?.device_statistics_six) { |
| | | newtitleData.value = res.data.data |
| | | return |
| | | newtitleData.value = res.data.data; |
| | | return; |
| | | } |
| | | |
| | | for (let key in res.data.data) { |
| | | if (permission.value?.device_statistics_four && (key === 'flow_type_list' || |
| | | key === 'insure_list')) continue |
| | | newtitleData.value[key] = res.data.data[key] |
| | | if ( |
| | | permission.value?.device_statistics_four && |
| | | (key === 'flow_type_list' || key === 'insure_list') |
| | | ) |
| | | continue; |
| | | newtitleData.value[key] = res.data.data[key]; |
| | | } |
| | | }) |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | const unitMap = { |
| | | drone: '架', |
| | | nest: '个', |
| | | monitor: '个', |
| | | mobile: '个', |
| | | } |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | getStaticsList() |
| | | }) |
| | | getStaticsList(); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | |
| | | |
| | | span { |
| | | margin-right: 4px; |
| | | font-weight: bold; |
| | | font-size: 16px; |
| | | color: #363636; |
| | | font-family: 'YouSheBiaoTiHei'; |
| | | } |
| | | |
| | | img { |
| | |
| | | font-weight: bold; |
| | | font-size: 36px; |
| | | color: #363636; |
| | | display: inline-block; |
| | | transform: skewX(-5deg); |
| | | font-family: 'YouSheBiaoTiHei'; |
| | | } |
| | | |
| | | span { |
| | |
| | | font-weight: bold; |
| | | font-size: 36px; |
| | | color: #363636; |
| | | display: inline-block; |
| | | transform: skewX(-5deg); |
| | | font-family: 'YouSheBiaoTiHei'; |
| | | } |
| | | |
| | | span { |
| | |
| | | <div class="status-item" v-for="(item, index) in eventTypeList" :key="index"> |
| | | <div class="statusCon"> |
| | | <div class="status-label">{{ item.name }}</div> |
| | | <div :style="{ color: item.color }" class="status-value"> |
| | | <!-- <div :style="{ color: item.color }" class="status-value"> |
| | | {{ item.value }}<span>个</span> |
| | | </div> --> |
| | | <div class="status-value"> |
| | | {{ item.value }}<span>个</span> |
| | | </div> |
| | | <div class="ratio"> |
| | |
| | | <div class="flycenter"> |
| | | <div class="centerBox"> |
| | | <div class="centerItem" v-for="(itemfly, index) in flyTypeList" :key="index"> |
| | | <div class="flyimg"><img :src="itemfly.img" alt="" />{{itemfly.name}}</div> |
| | | <div class="flydata"><span>{{itemfly.value}}</span>{{unitMap[itemfly.name]}}</div> |
| | | <div class="flyimg"><img :src="itemfly.img" alt="" />{{ itemfly.name }}</div> |
| | | <div class="flydata"> |
| | | <span>{{ itemfly.value }}</span |
| | | >{{ unitMap[itemfly.name] }} |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="lineChart"> |
| | |
| | | import * as echarts from 'echarts'; |
| | | import useEchartsResize from '@/hooks/useEchartsResize'; |
| | | import { mapGetters } from 'vuex'; |
| | | import { getJobEventByStatus, getJobEventTotal,getFly,getFlyTime } from '@/api/home/index'; |
| | | import { getJobEventByStatus, getJobEventTotal, getFly, getFlyTime } from '@/api/home/index'; |
| | | import overviewImg1 from '@/assets/images/workbench/tc1.png'; |
| | | import overviewImg2 from '@/assets/images/workbench/tc2.png'; |
| | | import overviewImg3 from '@/assets/images/workbench/tc3.png'; |
| | |
| | | import flyImg2 from '@/assets/images/workbench/fy3.png'; |
| | | import flyImg3 from '@/assets/images/workbench/fy4.png'; |
| | | import statistics from './components/statistics.vue'; |
| | | import { ElMessage } from 'element-plus' |
| | | import { ElMessage } from 'element-plus'; |
| | | let checked = ref('CURRENT_YEAR'); |
| | | let timeListStr = ['本周', '本月', '本年']; |
| | | let timeListEnum = ['CURRENT_WEEK', 'CURRENT_MONTH', 'CURRENT_YEAR']; |
| | |
| | | params.value.date_enum = item; |
| | | dateSelect.value = item; |
| | | getTypeData(); |
| | | getFlyList() |
| | | getFlyTimeList() |
| | | getFlyList(); |
| | | getFlyTimeList(); |
| | | }; |
| | | // 跳转 |
| | | const jumpshebei= ()=>{ |
| | | ElMessage.warning('加急开发中...') |
| | | } |
| | | const jumpshebei = () => { |
| | | ElMessage.warning('加急开发中...'); |
| | | }; |
| | | |
| | | const eventTypeList = ref([ |
| | | { name: '待审核', value: 0, img: overviewImg2, color: '#FF472F', status: '2', rate: 0 }, |
| | |
| | | { name: '已完成', value: 0, img: overviewImg5, color: '#0291A1', status: '4', rate: 0 }, |
| | | ]); |
| | | const keyMapping = { |
| | | '飞行时长': 'total_flight_time', |
| | | '飞行里程': 'total_flight_distance', |
| | | '任务成果': 'event_num' |
| | | 飞行时长: 'total_flight_time', |
| | | 飞行里程: 'total_flight_distance', |
| | | 任务成果: 'event_num', |
| | | }; |
| | | const unitMap = { |
| | | '飞行时长': '时', |
| | | '飞行里程': '千米', |
| | | '任务成果': '个' |
| | | 飞行时长: '时', |
| | | 飞行里程: '千米', |
| | | 任务成果: '个', |
| | | }; |
| | | const flyTypeList = ref([ |
| | | { name: '飞行时长', value: 0, img: flyImg1 }, |
| | |
| | | }; |
| | | // 飞行统计 |
| | | |
| | | const getFlyList=()=>{ |
| | | getFly(params.value).then(res=>{ |
| | | flyTypeList.value = flyTypeList.value.map(item => ({ |
| | | ...item, |
| | | value: res.data.data[keyMapping[item.name]] || 0 |
| | | })); |
| | | }) |
| | | } |
| | | const getFlyTimeList=()=>{ |
| | | getFlyTime(params.value).then(res=>{ |
| | | const resList = res?.data?.data || []; |
| | | lineCharts(resList) |
| | | }) |
| | | } |
| | | const getFlyList = () => { |
| | | getFly(params.value).then(res => { |
| | | flyTypeList.value = flyTypeList.value.map(item => ({ |
| | | ...item, |
| | | value: res.data.data[keyMapping[item.name]] || 0, |
| | | })); |
| | | }); |
| | | }; |
| | | const getFlyTimeList = () => { |
| | | getFlyTime(params.value).then(res => { |
| | | const resList = res?.data?.data || []; |
| | | lineCharts(resList); |
| | | }); |
| | | }; |
| | | // 图表 |
| | | const echartsRef = ref(null); |
| | | let { chart } = useEchartsResize(echartsRef); |
| | |
| | | legend: { |
| | | show: false, |
| | | }, |
| | | title: { |
| | | text: data.total.title, |
| | | textStyle: { |
| | | color: 'rgba(28, 31, 35, 0.80)', |
| | | fontSize: '12px', |
| | | fontWeight: 'normal', |
| | | }, |
| | | subtext: data.total.figure, |
| | | subtextStyle: { |
| | | color: '#1C1F23', |
| | | fontSize: '20px', |
| | | fontWeight: '600', |
| | | }, |
| | | top: '40%', |
| | | title: { |
| | | text: data.total.title, |
| | | textStyle: { |
| | | color: 'rgba(28, 31, 35, 0.80)', |
| | | fontSize: '12px', |
| | | fontWeight: 'normal', |
| | | }, |
| | | subtext: data.total.figure, |
| | | subtextStyle: { |
| | | color: '#1C1F23', |
| | | fontSize: '20px', |
| | | fontWeight: '600', |
| | | }, |
| | | top: '40%', |
| | | left: '53%', |
| | | textAlign: 'center', // 文本对齐 |
| | | }, |
| | | textAlign: 'center', // 文本对齐 |
| | | }, |
| | | series: [ |
| | | { |
| | | name: '', |
| | |
| | | avoidLabelOverlap: true, |
| | | left: '10%', |
| | | label: { |
| | | formatter: (params) => { |
| | | return `{a|${params.name}}: ${params.data.rate}%`; |
| | | }, |
| | | formatter: params => { |
| | | return `{a|${params.name}}: ${params.data.rate}%`; |
| | | }, |
| | | alignTo: 'labelLine', |
| | | rich: { |
| | | a: { |
| | |
| | | }; |
| | | |
| | | // 柱状图 |
| | | const lineCharts = (bardata) => { |
| | | const categories = bardata?.map(item => item.name); // x轴类别 |
| | | const flight_distance=[] |
| | | const flight_time=[] |
| | | const event_num=[] |
| | | // /遍历数据填充各系列 |
| | | const lineCharts = bardata => { |
| | | const categories = bardata?.map(item => item.name); // x轴类别 |
| | | const flight_distance = []; |
| | | const flight_time = []; |
| | | const event_num = []; |
| | | // /遍历数据填充各系列 |
| | | bardata?.forEach(period => { |
| | | let hasDuration = false, hasDistance = false, hasResult = false; |
| | | |
| | | let hasDuration = false, |
| | | hasDistance = false, |
| | | hasResult = false; |
| | | |
| | | period.data?.forEach(item => { |
| | | switch(item.name) { |
| | | switch (item.name) { |
| | | case '飞行时长': |
| | | flight_time.push(parseFloat(item.value) || 0); |
| | | hasDuration = true; |
| | |
| | | case '飞行里程': |
| | | // 转换为万公 (假设原始单位是米) |
| | | // flight_distance.push((parseFloat(item.value) / 10 || 0)); |
| | | flight_distance.push((parseFloat(item.value) || 0)); |
| | | flight_distance.push(parseFloat(item.value) || 0); |
| | | hasDistance = true; |
| | | break; |
| | | case '任务成果': |
| | |
| | | }); |
| | | |
| | | // 处理可能缺失的数据项 |
| | | if(!hasDuration) flight_time.push(0); |
| | | if(!hasDistance) flight_distance.push(0); |
| | | if(!hasResult) event_num.push(0); |
| | | if (!hasDuration) flight_time.push(0); |
| | | if (!hasDistance) flight_distance.push(0); |
| | | if (!hasResult) event_num.push(0); |
| | | }); |
| | | var option = { |
| | | tooltip: { |
| | | trigger: 'item', |
| | | axisPointer: { |
| | | type: 'shadow', |
| | | tooltip: { |
| | | trigger: 'item', |
| | | axisPointer: { |
| | | type: 'shadow', |
| | | }, |
| | | }, |
| | | grid: { |
| | | left: '2%', |
| | | right: '4%', |
| | | bottom: '14%', |
| | | top: '16%', |
| | | containLabel: true, |
| | | }, |
| | | legend: { |
| | | data: ['飞行时长', '飞行里程', '任务成果'], |
| | | left: 'center', |
| | | top: '5%', |
| | | color: '#383838', // 直接配置颜色 |
| | | itemWidth: 15, |
| | | itemHeight: 10, |
| | | itemGap: 25, |
| | | }, |
| | | xAxis: { |
| | | type: 'category', |
| | | data: categories, |
| | | axisLine: { |
| | | lineStyle: { |
| | | color: '#cdd5e2', |
| | | }, |
| | | }, |
| | | grid: { |
| | | left: '2%', |
| | | right: '4%', |
| | | bottom: '14%', |
| | | top: '16%', |
| | | containLabel: true, |
| | | axisLabel: { |
| | | interval: 0, |
| | | color: '#383838', // 直接配置颜色 |
| | | }, |
| | | legend: { |
| | | data: ['飞行时长', '飞行里程', '任务成果'], |
| | | left: 'center', |
| | | top: '5%', |
| | | textStyle: { |
| | | color: '#666666', |
| | | }, |
| | | yAxis: [ |
| | | { |
| | | type: 'log', |
| | | name: '单位:万套', |
| | | nameTextStyle: { |
| | | color: '#383838', |
| | | |
| | | }, |
| | | itemWidth: 15, |
| | | itemHeight: 10, |
| | | itemGap: 25, |
| | | }, |
| | | xAxis: { |
| | | type: 'category', |
| | | data: categories, |
| | | min: 1, |
| | | logBase: 3, |
| | | axisLine: { |
| | | show: false, |
| | | lineStyle: { |
| | | color: '#cdd5e2', |
| | | }, |
| | | }, |
| | | |
| | | axisLabel: { |
| | | interval: 0, |
| | | textStyle: { |
| | | color: '#666666', |
| | | splitLine: { |
| | | show: true, |
| | | lineStyle: { |
| | | type: 'dashed', |
| | | color: '#cdd5e2', |
| | | width: 1, |
| | | opacity: 0.5, |
| | | }, |
| | | }, |
| | | axisLabel: { |
| | | color: '#666666', // 直接配置颜色 |
| | | }, |
| | | }, |
| | | yAxis: [ |
| | | |
| | | { |
| | | type: 'log', |
| | | name: '单位:万套', |
| | | nameTextStyle: { |
| | | color: '#666666', |
| | | }, |
| | | min: 1, |
| | | logBase: 3, |
| | | axisLine: { |
| | | show: false, |
| | | lineStyle: { |
| | | color: '#cdd5e2', |
| | | }, |
| | | }, |
| | | |
| | | splitLine: { |
| | | show: true, // 显示分割线 |
| | | lineStyle: { |
| | | type: 'dashed', // 设置为虚线 |
| | | color: '#cdd5e2', // 颜色与轴线一致 |
| | | width: 1, // 线宽 |
| | | opacity: 0.5, // 透明度 |
| | | }, |
| | | }, |
| | | axisLabel: { |
| | | textStyle: { |
| | | color: '#666666', |
| | | }, |
| | | }, |
| | | axisLine: { |
| | | lineStyle: { |
| | | color: '#cdd5e2', |
| | | }, |
| | | { |
| | | type: 'log', |
| | | name: '', |
| | | nameTextStyle: { |
| | | color: '#383838', |
| | | }, |
| | | min: 1, |
| | | logBase: 3, |
| | | axisLine: { |
| | | show: false, |
| | | lineStyle: { |
| | | color: '#cdd5e2', |
| | | }, |
| | | }, |
| | | |
| | | { |
| | | type: 'log', |
| | | name: '', |
| | | nameTextStyle: { |
| | | color: '#666666', |
| | | }, |
| | | min: 1, |
| | | logBase: 3, |
| | | axisLine: { |
| | | show: false, |
| | | lineStyle: { |
| | | color: '#cdd5e2', |
| | | }, |
| | | }, |
| | | |
| | | splitLine: { |
| | | show: true, // 显示分割线 |
| | | lineStyle: { |
| | | type: 'dashed', // 设置为虚线 |
| | | color: '#cdd5e2', // 颜色与轴线一致 |
| | | width: 1, // 线宽 |
| | | opacity: 0.5, // 透明度 |
| | | }, |
| | | }, |
| | | axisLabel: { |
| | | textStyle: { |
| | | color: '#666666', |
| | | }, |
| | | }, |
| | | axisLine: { |
| | | lineStyle: { |
| | | color: '#cdd5e2', |
| | | }, |
| | | splitLine: { |
| | | show: true, |
| | | lineStyle: { |
| | | type: 'dashed', |
| | | color: '#cdd5e2', |
| | | width: 1, |
| | | opacity: 0.5, |
| | | }, |
| | | }, |
| | | ], |
| | | axisLabel: { |
| | | color: '#383838', // 直接配置颜色 |
| | | }, |
| | | } |
| | | ], |
| | | series: [ |
| | | { |
| | | name: '飞行时长', |
| | | type: 'bar', |
| | | barWidth: '12px', |
| | | itemStyle: { |
| | | normal: { |
| | | color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ |
| | | { |
| | | offset: 0, |
| | | color: '#29acff', |
| | | }, |
| | | { |
| | | offset: 1, |
| | | color: '#4bdfff', |
| | | }, |
| | | ]), |
| | | barBorderRadius: 6, |
| | | }, |
| | | color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ |
| | | { offset: 0, color: '#29acff' }, |
| | | { offset: 1, color: '#4bdfff' }, |
| | | ]), |
| | | borderRadius: 6, |
| | | }, |
| | | data: flight_time, |
| | | }, |
| | |
| | | type: 'bar', |
| | | barWidth: '12px', |
| | | itemStyle: { |
| | | normal: { |
| | | color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ |
| | | { |
| | | offset: 0, |
| | | color: '#01c871', |
| | | }, |
| | | { |
| | | offset: 1, |
| | | color: '#55f49c', |
| | | }, |
| | | ]), |
| | | barBorderRadius: 6, |
| | | }, |
| | | color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ |
| | | { offset: 0, color: '#01c871' }, |
| | | { offset: 1, color: '#55f49c' }, |
| | | ]), |
| | | borderRadius: 6, |
| | | }, |
| | | data: flight_distance, |
| | | }, |
| | | |
| | | { |
| | | name: '任务成果', |
| | | type: 'line', |
| | | yAxisIndex: 1, |
| | | yAxisIndex: 1, |
| | | smooth: true, |
| | | // symbol: 'circle', |
| | | // symbolSize: 8, |
| | | // itemStyle: { |
| | | // normal: { |
| | | // color: '#ffa43a', |
| | | // borderColor: 'rgba(255, 234, 0, 0.5)', |
| | | // borderWidth: 5, |
| | | // color: '#ffa43a', // 默认状态颜色 |
| | | // borderColor: 'rgba(255, 234, 0, 0.5)', |
| | | // borderWidth: 5, |
| | | // }, |
| | | // emphasis: { |
| | | // // 悬停状态 |
| | | // itemStyle: { |
| | | // color: '#ff8c00', // 悬停时颜色变深 |
| | | // borderWidth: 6, |
| | | // }, |
| | | // }, |
| | | lineStyle: { |
| | |
| | | |
| | | getTypeData(); |
| | | lineCharts(); |
| | | getFlyList() |
| | | getFlyTimeList() |
| | | getFlyList(); |
| | | getFlyTimeList(); |
| | | }); |
| | | </script> |
| | | |
| | |
| | | .name { |
| | | display: flex; |
| | | align-items: center; |
| | | font-weight: bold; |
| | | font-size: 16px; |
| | | color: #363636; |
| | | font-family: 'YouSheBiaoTiHei'; |
| | | span { |
| | | margin-right: 4px; |
| | | } |
| | |
| | | .card-item:nth-child(2) { |
| | | border-right: 1px solid #e5e5e5; |
| | | } |
| | | .active { |
| | | .card-item.active { |
| | | color: #1441ff; |
| | | border: 1px solid #1C5CFF; |
| | | |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | .total-number { |
| | | font-family: 'YouSheBiaoTiHei'; |
| | | |
| | | font-weight: bold; |
| | | font-size: 32px; |
| | | color: #2a54ff; |
| | |
| | | img { |
| | | width: 26px; |
| | | height: 26px; |
| | | padding: 9px 2px; |
| | | padding: 9px 10px 9px 2px; |
| | | } |
| | | .statusCon { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | padding: 9px 4px 0 4px; |
| | | // align-items: center; |
| | | padding: 9px 4px 7px 10px; |
| | | text-align: left; |
| | | .status-label { |
| | | font-weight: 400; |
| | | font-size: 14px; |
| | | text-align: left; |
| | | color: #383838; |
| | | } |
| | | .ratio { |
| | |
| | | font-size: 12px; |
| | | color: #363636; |
| | | white-space: nowrap; |
| | | text-align: left; |
| | | } |
| | | .status-value { |
| | | font-family: 'YouSheBiaoTiHei'; |
| | | font-weight: bold; |
| | | font-size: 24px; |
| | | font-size: 30px; |
| | | margin: 5px 0; |
| | | // font-style: italic; |
| | | display: inline-block; |
| | | transform: skewX(-5deg); |
| | | |
| | | span { |
| | | font-weight: 400; |
| | | font-size: 14px; |
| | |
| | | border-radius: 8px 8px 8px 8px; |
| | | border: 1px solid #ffffff; |
| | | margin-right: 16px; |
| | | img{ |
| | | width: 15px; |
| | | height: 15px; |
| | | margin-right: 5px; |
| | | img { |
| | | width: 15px; |
| | | height: 15px; |
| | | margin-right: 5px; |
| | | } |
| | | .flyimg { |
| | | display: flex; |
| | | align-items: center; |
| | | display: flex; |
| | | align-items: center; |
| | | font-weight: 400; |
| | | font-size: 14px; |
| | | color: #7C8091; |
| | | } |
| | | .flydata { |
| | | margin-top: 15px; |