Commit ea172f23 by liucan

fix:修改状态监控数字显示格式

parent e584b822
const formatExactLargeNum = (num: number | string | null) => { const formatExactLargeNum = (num: number | string | null) => {
if (num === null || num === undefined) return ""; if (num === null || num === undefined) return ''
if (typeof num !== "number" && typeof num !== "string") return num; if (typeof num !== 'number' && typeof num !== 'string') return num
const parsedNum = typeof num === "string" ? Number(num.replace(/,/g, "")) : num; const parsedNum = typeof num === 'string' ? Number(num.replace(/,/g, '')) : num
if (isNaN(parsedNum)) return num; if (isNaN(parsedNum)) return num
// 如果大于 100 万 或大于 1 亿,使用科学计数法 const absNum = Math.abs(parsedNum)
if (Math.abs(parsedNum) > 1_000_000) {
return parsedNum.toExponential(2); if (absNum >= 100_000_000) {
return (parsedNum / 100_000_000).toFixed(2) + '亿'
} else if (absNum >= 10_000) {
return (parsedNum / 10_000).toFixed(2) + '万'
} else { } else {
return parsedNum.toLocaleString("en-US", { return parsedNum.toLocaleString('en-US', {
useGrouping: true, useGrouping: true,
maximumFractionDigits: 0, maximumFractionDigits: 2,
minimumFractionDigits: 0, minimumFractionDigits: 0
}); })
} }
}; }
export default formatExactLargeNum; export default formatExactLargeNum
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<div class="left"> <div class="left">
<div> <div>
<span style="color: white">目标名称:</span> <span style="color: white">目标名称:</span>
<el-input placeholder="请输入目标名称:" v-model="searchTargetName" style="width: 180px" /> <el-input placeholder="请输入目标名称" v-model="searchTargetName" style="width: 180px" />
</div> </div>
<div> <div>
<span style="color: white">采集时间:</span> <span style="color: white">采集时间:</span>
...@@ -54,12 +54,12 @@ ...@@ -54,12 +54,12 @@
<el-table-column property="data.station" label="站点名称" width="88" show-overflow-tooltip /> <el-table-column property="data.station" label="站点名称" width="88" show-overflow-tooltip />
<el-table-column property="data.distance" label="距离" show-overflow-tooltip> <el-table-column property="data.distance" label="距离" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
{{ scope.row.data.distance === null ? "-" : scope.row.data.distance }} {{ scope.row.data.distance === null ? '-' : scope.row.data.distance }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column property="data.roundTripLightTime" label="往返光时" show-overflow-tooltip> <el-table-column property="data.roundTripLightTime" label="往返光时" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
{{ scope.row.data.roundTripLightTime === null ? "-" : scope.row.data.roundTripLightTime }} {{ scope.row.data.roundTripLightTime === null ? '-' : scope.row.data.roundTripLightTime }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column property="data.boa" label="行动开始时间" show-overflow-tooltip> <el-table-column property="data.boa" label="行动开始时间" show-overflow-tooltip>
...@@ -72,19 +72,19 @@ ...@@ -72,19 +72,19 @@
{{ formatTimestamp(scope.row.data.bot) }} {{ formatTimestamp(scope.row.data.bot) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column property="data.plan_txt" label="跟踪结束时间" show-overflow-tooltip> <el-table-column property="data.plan_txt" label="跟踪开始时间" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
{{ formatTimestamp(scope.row.data.eoa) }} {{ formatTimestamp(scope.row.data.eot) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column property="data.plan_txt" label="跟踪开始时间" show-overflow-tooltip> <el-table-column property="data.plan_txt" label="跟踪结束时间" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
{{ formatTimestamp(scope.row.data.eot) }} {{ formatTimestamp(scope.row.data.eoa) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="目标在线状态" width="110" show-overflow-tooltip> <el-table-column label="目标在线状态" width="110" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
{{ scope.row.data.target?.[scope.row.data.mission] === "true" ? "是" : "否" }} {{ scope.row.data.target?.[scope.row.data.mission] === 'true' ? '是' : '否' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column property="crawl_time" label="采集时间" /> <el-table-column property="crawl_time" label="采集时间" />
...@@ -137,11 +137,11 @@ ...@@ -137,11 +137,11 @@
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="item-title">目标尺寸:</span> <span class="item-title">目标尺寸:</span>
<span class="item">{{ targetDimension ?? "--" }}</span> <span class="item">{{ targetDimension ?? '--' }}</span>
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="item-title">发射质量:</span> <span class="item-title">发射质量:</span>
<span class="item">{{ targetLaunchMass ?? "--" }}</span> <span class="item">{{ targetLaunchMass ?? '--' }}</span>
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="item-title">干质量:</span> <span class="item-title">干质量:</span>
...@@ -167,7 +167,7 @@ ...@@ -167,7 +167,7 @@
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="item-title">发射站点:</span> <span class="item-title">发射站点:</span>
<span class="item">{{ targetLaunchLocation ?? "--" }}</span> <span class="item">{{ targetLaunchLocation ?? '--' }}</span>
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="item-title">轨道周期:</span> <span class="item-title">轨道周期:</span>
...@@ -175,23 +175,23 @@ ...@@ -175,23 +175,23 @@
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="item-title">相关仪器:</span> <span class="item-title">相关仪器:</span>
<span class="item">{{ targetInstruments ?? "--" }}</span> <span class="item">{{ targetInstruments ?? '--' }}</span>
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="item-title">服役日期:</span> <span class="item-title">服役日期:</span>
<span class="item">{{ targetServiceDate ?? "--" }}</span> <span class="item">{{ targetServiceDate ?? '--' }}</span>
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="item-title">是否为核心任务:</span> <span class="item-title">是否为核心任务:</span>
<span class="item">{{ targetIsCoreMission ?? "--" }}</span> <span class="item">{{ targetIsCoreMission ?? '--' }}</span>
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="item-title">太阳风速:</span> <span class="item-title">太阳风速:</span>
<span class="item">{{ targetSolarWindSpeed ?? "--" }}</span> <span class="item">{{ targetSolarWindSpeed ?? '--' }}</span>
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="item-title">太阳通量密度:</span> <span class="item-title">太阳通量密度:</span>
<span class="item">{{ targetSolarFluxDensity ?? "--" }}</span> <span class="item">{{ targetSolarFluxDensity ?? '--' }}</span>
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="item-title">轨道倾角:</span> <span class="item-title">轨道倾角:</span>
...@@ -270,7 +270,7 @@ ...@@ -270,7 +270,7 @@
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="item-title">站点气压:</span> <span class="item-title">站点气压:</span>
<span class="item">{{ stationPressure === "" ? "--" : stationPressure }}</span> <span class="item">{{ stationPressure === '' ? '--' : stationPressure }}</span>
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="item-title">站点天气情况:</span> <span class="item-title">站点天气情况:</span>
...@@ -328,11 +328,11 @@ ...@@ -328,11 +328,11 @@
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="item-title">站点温度:</span> <span class="item-title">站点温度:</span>
<span class="item">{{ stationTemperature === "" ? "--" : stationTemperature }}</span> <span class="item">{{ stationTemperature === '' ? '--' : stationTemperature }}</span>
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="item-title">站点湿度:</span> <span class="item-title">站点湿度:</span>
<span class="item">{{ stationHumidity === "" ? "--" : stationHumidity }}</span> <span class="item">{{ stationHumidity === '' ? '--' : stationHumidity }}</span>
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
...@@ -348,307 +348,307 @@ ...@@ -348,307 +348,307 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, ref } from "vue"; import { onMounted, ref } from 'vue'
import Pagination from "@/components/pagination/index.vue"; import Pagination from '@/components/pagination/index.vue'
import exportDialog from "@/components/Export/index.vue"; import exportDialog from '@/components/Export/index.vue'
import { getESAList, getESAMissionDetail, getESAStationDetail } from "@/api/spiderData"; import { getESAList, getESAMissionDetail, getESAStationDetail } from '@/api/spiderData'
import { ElMessage } from "element-plus"; import { ElMessage } from 'element-plus'
// ElConfigProvider 组件 // ElConfigProvider 组件
import { ElConfigProvider } from "element-plus"; import { ElConfigProvider } from 'element-plus'
// 引入中文包 // 引入中文包
import zhCn from "element-plus/es/locale/lang/zh-cn"; import zhCn from 'element-plus/es/locale/lang/zh-cn'
import TableSearch from "@/components/TableSearch.vue"; import TableSearch from '@/components/TableSearch.vue'
defineOptions({ name: "Pagination" }); defineOptions({ name: 'Pagination' })
// 更改分页文字 // 更改分页文字
zhCn.el.pagination.total = "共 `{total} 条`"; zhCn.el.pagination.total = '共 `{total} 条`'
zhCn.el.pagination.goto = "跳至"; zhCn.el.pagination.goto = '跳至'
zhCn.el.pagination.pagesize = "条/页"; zhCn.el.pagination.pagesize = '条/页'
zhCn.el.pagination.pageClassifier = "页"; zhCn.el.pagination.pageClassifier = '页'
// 查找字段 // 查找字段
const searchTargetName = ref(""); const searchTargetName = ref('')
const searchTimeValue = ref(""); const searchTimeValue = ref('')
const searchStation = ref(""); const searchStation = ref('')
const showDeleteDialog = ref(false); const showDeleteDialog = ref(false)
const detailVisibleValue = ref(false); const detailVisibleValue = ref(false)
const stationVisibleValue = ref(false); const stationVisibleValue = ref(false)
// 目标详情信息 // 目标详情信息
const targetName = ref(""); const targetName = ref('')
// 任务类型 // 任务类型
const targetMissionType = ref(""); const targetMissionType = ref('')
// 目标运行轨道 // 目标运行轨道
const targetOrbit = ref(""); const targetOrbit = ref('')
// 目标尺寸 // 目标尺寸
const targetDimension = ref(""); const targetDimension = ref('')
// 目标发射质量 // 目标发射质量
const targetLaunchMass = ref(""); const targetLaunchMass = ref('')
// 目标干质量 // 目标干质量
const targetDryMass = ref(""); const targetDryMass = ref('')
// 近地点 // 近地点
const targetPerigee = ref(""); const targetPerigee = ref('')
// 远地点 // 远地点
const targetApogee = ref(""); const targetApogee = ref('')
// 目标功率 // 目标功率
const targetPower = ref(""); const targetPower = ref('')
// 轨道倾角 // 轨道倾角
const targetInclination = ref(""); const targetInclination = ref('')
// 轨道周期 // 轨道周期
const targetPeriod = ref(""); const targetPeriod = ref('')
// 发射日期 // 发射日期
const targetLaunchDate = ref(""); const targetLaunchDate = ref('')
// 发射站点 // 发射站点
const targetLaunchLocation = ref(""); const targetLaunchLocation = ref('')
// 相关仪器 // 相关仪器
const targetInstruments = ref(""); const targetInstruments = ref('')
// 服役日期 // 服役日期
const targetServiceDate = ref(""); const targetServiceDate = ref('')
// 是否为核心任务 // 是否为核心任务
const targetIsCoreMission = ref(""); const targetIsCoreMission = ref('')
// 太阳风速 // 太阳风速
const targetSolarWindSpeed = ref(""); const targetSolarWindSpeed = ref('')
// 太阳通量密度 // 太阳通量密度
const targetSolarFluxDensity = ref(""); const targetSolarFluxDensity = ref('')
// 是否在仪表盘中显示 // 是否在仪表盘中显示
// const targetIsShowInDashboard = ref('') // const targetIsShowInDashboard = ref('')
// 目标类型 // 目标类型
const targetType = ref(""); const targetType = ref('')
// 描述 // 描述
const targetDescription = ref(""); const targetDescription = ref('')
// 站点详情信息 // 站点详情信息
// 站点名称 // 站点名称
const stationName = ref(""); const stationName = ref('')
// 站点所在国家 // 站点所在国家
const stationCountry = ref(""); const stationCountry = ref('')
// 站点经度 // 站点经度
const stationLongitude = ref(""); const stationLongitude = ref('')
// 站点纬度 // 站点纬度
const stationLatitude = ref(""); const stationLatitude = ref('')
// 站点海拔高度 // 站点海拔高度
const stationAltitude = ref(""); const stationAltitude = ref('')
// 站点直径 // 站点直径
const stationDiameter = ref(""); const stationDiameter = ref('')
// 天线方位角速度 // 天线方位角速度
const stationAzimuthSpeed = ref(""); const stationAzimuthSpeed = ref('')
// 天线俯仰角速度 // 天线俯仰角速度
const stationElevationSpeed = ref(""); const stationElevationSpeed = ref('')
// 天线信号频段 // 天线信号频段
const stationBand = ref(""); const stationBand = ref('')
// TMTC标准 // TMTC标准
const stationTMTC = ref(""); const stationTMTC = ref('')
// 信号频率与定时 // 信号频率与定时
const stationFrequencyAndTiming = ref(""); const stationFrequencyAndTiming = ref('')
// 天气 // 天气
const stationWeather = ref(""); const stationWeather = ref('')
// 上行信号S频段极化 // 上行信号S频段极化
const stationUplinkSPolarization = ref(""); const stationUplinkSPolarization = ref('')
// 上行信号S频段等效全向辐射功率 // 上行信号S频段等效全向辐射功率
const stationUplinkSEirp = ref(""); const stationUplinkSEirp = ref('')
// 上行信号X频段极化 // 上行信号X频段极化
const stationUplinkXPolarization = ref(""); const stationUplinkXPolarization = ref('')
// 上行信号X频段等效全向辐射功率 // 上行信号X频段等效全向辐射功率
const stationUplinkXEirp = ref(""); const stationUplinkXEirp = ref('')
// 上行信号Ka频段极化 // 上行信号Ka频段极化
const stationUplinkKaPolarization = ref(""); const stationUplinkKaPolarization = ref('')
// 上行信号Ka频段等效全向辐射功率 // 上行信号Ka频段等效全向辐射功率
const stationUplinkKaEirp = ref(""); const stationUplinkKaEirp = ref('')
// 下行信号S频段极化 // 下行信号S频段极化
const stationDownlinkSPolarization = ref(""); const stationDownlinkSPolarization = ref('')
// 下行信号S频段G/T比 // 下行信号S频段G/T比
const stationDownlinkSGt = ref(""); const stationDownlinkSGt = ref('')
// 下行信号X频段极化 // 下行信号X频段极化
const stationDownlinkXPolarization = ref(""); const stationDownlinkXPolarization = ref('')
// 下行信号X频段G/T比 // 下行信号X频段G/T比
const stationDownlinkXGt = ref(""); const stationDownlinkXGt = ref('')
// 下行信号Ka频段极化 // 下行信号Ka频段极化
const stationDownlinkKaPolarization = ref(""); const stationDownlinkKaPolarization = ref('')
// 下行信号Ka频段G/T比 // 下行信号Ka频段G/T比
const stationDownlinkKaGt = ref(""); const stationDownlinkKaGt = ref('')
// 温度 // 温度
const stationTemperature = ref(""); const stationTemperature = ref('')
// 气压 // 气压
const stationPressure = ref(""); const stationPressure = ref('')
// 湿度 // 湿度
const stationHumidity = ref(""); const stationHumidity = ref('')
// 站点类型 // 站点类型
const stationType = ref(""); const stationType = ref('')
// 描述 // 描述
const stationDescription = ref(""); const stationDescription = ref('')
// 查看esa站点详情的方法 // 查看esa站点详情的方法
const handleStationDetails = async (id: any) => { const handleStationDetails = async (id: any) => {
try { try {
const res = await getESAStationDetail({ name: id }); const res = await getESAStationDetail({ name: id })
// 1. 初始化清空数据 // 1. 初始化清空数据
stationName.value = ""; stationName.value = ''
stationCountry.value = ""; stationCountry.value = ''
stationLongitude.value = ""; stationLongitude.value = ''
stationLatitude.value = ""; stationLatitude.value = ''
stationAltitude.value = ""; stationAltitude.value = ''
stationDiameter.value = ""; stationDiameter.value = ''
stationAzimuthSpeed.value = ""; stationAzimuthSpeed.value = ''
stationElevationSpeed.value = ""; stationElevationSpeed.value = ''
stationBand.value = ""; stationBand.value = ''
stationTMTC.value = ""; stationTMTC.value = ''
stationFrequencyAndTiming.value = ""; stationFrequencyAndTiming.value = ''
stationWeather.value = ""; stationWeather.value = ''
stationUplinkSPolarization.value = ""; stationUplinkSPolarization.value = ''
stationUplinkSEirp.value = ""; stationUplinkSEirp.value = ''
stationUplinkXPolarization.value = ""; stationUplinkXPolarization.value = ''
stationUplinkXEirp.value = ""; stationUplinkXEirp.value = ''
stationUplinkKaPolarization.value = ""; stationUplinkKaPolarization.value = ''
stationUplinkKaEirp.value = ""; stationUplinkKaEirp.value = ''
stationDownlinkSPolarization.value = ""; stationDownlinkSPolarization.value = ''
stationDownlinkSGt.value = ""; stationDownlinkSGt.value = ''
stationDownlinkXPolarization.value = ""; stationDownlinkXPolarization.value = ''
stationDownlinkXGt.value = ""; stationDownlinkXGt.value = ''
stationDownlinkKaPolarization.value = ""; stationDownlinkKaPolarization.value = ''
stationDownlinkKaGt.value = ""; stationDownlinkKaGt.value = ''
stationTemperature.value = ""; stationTemperature.value = ''
stationPressure.value = ""; stationPressure.value = ''
stationHumidity.value = ""; stationHumidity.value = ''
stationType.value = ""; stationType.value = ''
stationDescription.value = ""; stationDescription.value = ''
// 2.判断 data 是否存在且非空 // 2.判断 data 是否存在且非空
if (!res?.data?.data || res.data.data.length === 0) { if (!res?.data?.data || res.data.data.length === 0) {
ElMessage.warning("未查询到该站点的详细信息"); ElMessage.warning('未查询到该站点的详细信息')
return; return
} }
// 3. 安全赋值 // 3. 安全赋值
const stationData = res.data.data[0]; const stationData = res.data.data[0]
stationName.value = stationData.name || ""; stationName.value = stationData.name || ''
stationCountry.value = stationData.country || ""; stationCountry.value = stationData.country || ''
stationLongitude.value = stationData.longitude || ""; stationLongitude.value = stationData.longitude || ''
stationLatitude.value = stationData.latitude || ""; stationLatitude.value = stationData.latitude || ''
stationAltitude.value = stationData.altitude || ""; stationAltitude.value = stationData.altitude || ''
stationDiameter.value = stationData.diameter || ""; stationDiameter.value = stationData.diameter || ''
stationAzimuthSpeed.value = stationData.antennaSpeedAzimuth || ""; stationAzimuthSpeed.value = stationData.antennaSpeedAzimuth || ''
stationElevationSpeed.value = stationData.antennaSpeedElevation || ""; stationElevationSpeed.value = stationData.antennaSpeedElevation || ''
stationBand.value = stationData.band || ""; stationBand.value = stationData.band || ''
stationTMTC.value = stationData.tmtcStandards || ""; stationTMTC.value = stationData.tmtcStandards || ''
stationFrequencyAndTiming.value = stationData.frequencyAndTiming || ""; stationFrequencyAndTiming.value = stationData.frequencyAndTiming || ''
stationWeather.value = stationData.weather === null ? "--" : stationData.weather || "--"; stationWeather.value = stationData.weather === null ? '--' : stationData.weather || '--'
stationUplinkSPolarization.value = stationUplinkSPolarization.value =
stationData.uplinkSBandPolarization === null ? "--" : stationData.uplinkSBandPolarization || "--"; stationData.uplinkSBandPolarization === null ? '--' : stationData.uplinkSBandPolarization || '--'
stationUplinkSEirp.value = stationData.uplinkSBandEirp === null ? "--" : stationData.uplinkSBandEirp || "--"; stationUplinkSEirp.value = stationData.uplinkSBandEirp === null ? '--' : stationData.uplinkSBandEirp || '--'
stationUplinkXPolarization.value = stationUplinkXPolarization.value =
stationData.uplinkXBandPolarization === null ? "--" : stationData.uplinkXBandPolarization || "--"; stationData.uplinkXBandPolarization === null ? '--' : stationData.uplinkXBandPolarization || '--'
stationUplinkXEirp.value = stationData.uplinkXBandEirp === null ? "--" : stationData.uplinkXBandEirp || "--"; stationUplinkXEirp.value = stationData.uplinkXBandEirp === null ? '--' : stationData.uplinkXBandEirp || '--'
stationUplinkKaPolarization.value = stationUplinkKaPolarization.value =
stationData.uplinkKaBandPolarization === null ? "--" : stationData.uplinkKaBandPolarization || "--"; stationData.uplinkKaBandPolarization === null ? '--' : stationData.uplinkKaBandPolarization || '--'
stationUplinkKaEirp.value = stationData.uplinkKaBandEirp === null ? "--" : stationData.uplinkKaBandEirp || "--"; stationUplinkKaEirp.value = stationData.uplinkKaBandEirp === null ? '--' : stationData.uplinkKaBandEirp || '--'
stationDownlinkSPolarization.value = stationDownlinkSPolarization.value =
stationData.downlinkSBandPolarization === null ? "--" : stationData.downlinkSBandPolarization || "--"; stationData.downlinkSBandPolarization === null ? '--' : stationData.downlinkSBandPolarization || '--'
stationDownlinkSGt.value = stationData.downlinkSBandGT === null ? "--" : stationData.downlinkSBandGT || "--"; stationDownlinkSGt.value = stationData.downlinkSBandGT === null ? '--' : stationData.downlinkSBandGT || '--'
stationDownlinkXPolarization.value = stationDownlinkXPolarization.value =
stationData.downlinkXBandPolarization === null ? "--" : stationData.downlinkXBandPolarization || "--"; stationData.downlinkXBandPolarization === null ? '--' : stationData.downlinkXBandPolarization || '--'
stationDownlinkXGt.value = stationData.downlinkXBandGT === null ? "--" : stationData.downlinkXBandGT || "--"; stationDownlinkXGt.value = stationData.downlinkXBandGT === null ? '--' : stationData.downlinkXBandGT || '--'
stationDownlinkKaPolarization.value = stationDownlinkKaPolarization.value =
stationData.downlinkKaBandPolarization === null ? "--" : stationData.downlinkKaBandPolarization || "--"; stationData.downlinkKaBandPolarization === null ? '--' : stationData.downlinkKaBandPolarization || '--'
stationDownlinkKaGt.value = stationData.downlinkKaBandGT === null ? "--" : stationData.downlinkKaBandGT || "--"; stationDownlinkKaGt.value = stationData.downlinkKaBandGT === null ? '--' : stationData.downlinkKaBandGT || '--'
stationTemperature.value = stationData.temperature || ""; stationTemperature.value = stationData.temperature || ''
stationPressure.value = stationData.airPressure || ""; stationPressure.value = stationData.airPressure || ''
stationHumidity.value = stationData.humidity || ""; stationHumidity.value = stationData.humidity || ''
stationType.value = stationData.type || ""; stationType.value = stationData.type || ''
// 处理描述信息(避免 description 为 undefined 时报错) // 处理描述信息(避免 description 为 undefined 时报错)
if (Array.isArray(stationData.description)) { if (Array.isArray(stationData.description)) {
stationDescription.value = stationData.description.join(""); stationDescription.value = stationData.description.join('')
} else { } else {
stationDescription.value = stationData.description || "--"; stationDescription.value = stationData.description || '--'
} }
stationVisibleValue.value = true; stationVisibleValue.value = true
} catch (error) { } catch (error) {
ElMessage.error("查询站点详情失败,请稍后重试"); ElMessage.error('查询站点详情失败,请稍后重试')
console.error("站点详情查询错误:", error); console.error('站点详情查询错误:', error)
} }
}; }
const tableData = ref([]); const tableData = ref([])
const pageObj = ref({ const pageObj = ref({
total: 0, total: 0,
pageSize: 10, pageSize: 10,
pageNo: 1, pageNo: 1
}); })
const formatTimestamp = (timestamp: any) => { const formatTimestamp = (timestamp: any) => {
if (!timestamp || typeof timestamp !== "number" || timestamp <= 0) { if (!timestamp || typeof timestamp !== 'number' || timestamp <= 0) {
return "--"; return '--'
} }
const msTimestamp = String(timestamp).length === 10 ? timestamp * 1000 : timestamp; const msTimestamp = String(timestamp).length === 10 ? timestamp * 1000 : timestamp
const date = new Date(msTimestamp); const date = new Date(msTimestamp)
if (isNaN(date.getTime())) { if (isNaN(date.getTime())) {
return "--"; return '--'
} }
const year = date.getFullYear(); const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, "0"); const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, "0"); const day = String(date.getDate()).padStart(2, '0')
const hour = String(date.getHours()).padStart(2, "0"); const hour = String(date.getHours()).padStart(2, '0')
const minute = String(date.getMinutes()).padStart(2, "0"); const minute = String(date.getMinutes()).padStart(2, '0')
const second = String(date.getSeconds()).padStart(2, "0"); const second = String(date.getSeconds()).padStart(2, '0')
return `${year}-${month}-${day} ${hour}:${minute}:${second}`; return `${year}-${month}-${day} ${hour}:${minute}:${second}`
}; }
// 查看esa任务详情的方法 // 查看esa任务详情的方法
const handleMissionDetails = async (id: any) => { const handleMissionDetails = async (id: any) => {
const res = await getESAMissionDetail({ name: id }); const res = await getESAMissionDetail({ name: id })
// 防止残留数据 // 防止残留数据
targetDescription.value = ""; targetDescription.value = ''
// 字段赋值 // 字段赋值
targetName.value = res.data.data[0].name; targetName.value = res.data.data[0].name
targetMissionType.value = res.data.data[0].type; targetMissionType.value = res.data.data[0].type
targetOrbit.value = res.data.data[0].orbitsAround; targetOrbit.value = res.data.data[0].orbitsAround
targetDimension.value = res.data.data[0].dimensions; targetDimension.value = res.data.data[0].dimensions
targetLaunchMass.value = res.data.data[0].launchMass; targetLaunchMass.value = res.data.data[0].launchMass
targetDryMass.value = res.data.data[0].dryMass; targetDryMass.value = res.data.data[0].dryMass
targetPerigee.value = res.data.data[0].perigee; targetPerigee.value = res.data.data[0].perigee
targetApogee.value = res.data.data[0].apogee; targetApogee.value = res.data.data[0].apogee
targetPower.value = res.data.data[0].power; targetPower.value = res.data.data[0].power
targetInclination.value = res.data.data[0].inclination; targetInclination.value = res.data.data[0].inclination
targetLaunchDate.value = formatTimestamp(res.data.data[0].launchDate); targetLaunchDate.value = formatTimestamp(res.data.data[0].launchDate)
targetLaunchLocation.value = res.data.data[0].launchSite; targetLaunchLocation.value = res.data.data[0].launchSite
targetPeriod.value = res.data.data[0].period; targetPeriod.value = res.data.data[0].period
targetInstruments.value = res.data.data[0].instruments; targetInstruments.value = res.data.data[0].instruments
targetServiceDate.value = formatTimestamp(res.data.data[0].enteredService); targetServiceDate.value = formatTimestamp(res.data.data[0].enteredService)
targetIsCoreMission.value = res.data.data[0].coreMission; targetIsCoreMission.value = res.data.data[0].coreMission
targetSolarWindSpeed.value = res.data.data[0].solarWindSpeed; targetSolarWindSpeed.value = res.data.data[0].solarWindSpeed
targetSolarFluxDensity.value = res.data.data[0].solarFluxDensity; targetSolarFluxDensity.value = res.data.data[0].solarFluxDensity
for (let i = 0; i < res.data.data[0].description.length; i++) { for (let i = 0; i < res.data.data[0].description.length; i++) {
targetDescription.value += res.data.data[0].description[i]; targetDescription.value += res.data.data[0].description[i]
} }
detailVisibleValue.value = true; detailVisibleValue.value = true
}; }
//表格loading标记 //表格loading标记
const tableLoading = ref(false); const tableLoading = ref(false)
//重置搜索条件 //重置搜索条件
const resetForm = () => { const resetForm = () => {
searchStation.value = ""; searchStation.value = ''
searchTargetName.value = ""; searchTargetName.value = ''
searchTimeValue.value = ""; searchTimeValue.value = ''
getData(); getData()
}; }
// 获取esa数据列表的方法 // 获取esa数据列表的方法
const getData = async () => { const getData = async () => {
tableLoading.value = true; tableLoading.value = true
const res = await getESAList({ const res = await getESAList({
spacecraft: searchTargetName.value, spacecraft: searchTargetName.value,
station: searchStation.value, station: searchStation.value,
times: searchTimeValue.value, times: searchTimeValue.value,
page: pageObj.value.pageNo, page: pageObj.value.pageNo,
size: pageObj.value.pageSize, size: pageObj.value.pageSize
}); })
pageObj.value.total = res.data.total; pageObj.value.total = res.data.total
tableData.value = res.data.list; tableData.value = res.data.list
tableLoading.value = false; tableLoading.value = false
}; }
const handleClose = () => { const handleClose = () => {
detailVisibleValue.value = false; detailVisibleValue.value = false
}; }
onMounted(() => { onMounted(() => {
getData(); getData()
}); })
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
...@@ -668,7 +668,7 @@ onMounted(() => { ...@@ -668,7 +668,7 @@ onMounted(() => {
/* 工具栏样式 */ /* 工具栏样式 */
.toolbarStyle { .toolbarStyle {
background-image: url("@/assets/picture/box3.png"); background-image: url('@/assets/picture/box3.png');
background-size: 100% 100%; background-size: 100% 100%;
background-repeat: no-repeat; background-repeat: no-repeat;
} }
......
...@@ -9,21 +9,21 @@ ...@@ -9,21 +9,21 @@
<div class="wordStyle"> <div class="wordStyle">
<span>总数据量(条):</span> <span>总数据量(条):</span>
<span class="total-num" v-if="totalDataNumber !== null">{{ <span class="total-num" v-if="totalDataNumber !== null">{{
formatExactLargeNum(totalDataNumber) ?? "--" formatExactLargeNum(totalDataNumber) ?? '--'
}}</span> }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
<div class="wordStyle"> <div class="wordStyle">
<span>采集的页面数量(个):</span> <span>采集的页面数量(个):</span>
<span class="total-num" v-if="totalPageNumber !== null"> <span class="total-num" v-if="totalPageNumber !== null">
{{ formatExactLargeNum(totalPageNumber) ?? "--" }}</span {{ formatExactLargeNum(totalPageNumber) ?? '--' }}</span
> >
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
<div class="wordStyle"> <div class="wordStyle">
<span>采集的目标数量(个):</span> <span>采集的目标数量(个):</span>
<span class="total-num" v-if="totalTargetNumber !== null"> <span class="total-num" v-if="totalTargetNumber !== null">
{{ formatExactLargeNum(totalTargetNumber) ?? "--" }}</span {{ formatExactLargeNum(totalTargetNumber) ?? '--' }}</span
> >
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
...@@ -36,17 +36,12 @@ ...@@ -36,17 +36,12 @@
<div class="items"> <div class="items">
<div class="wordStyle"> <div class="wordStyle">
<span>任务执行成功统计(个):</span> <span>任务执行成功统计(个):</span>
<span class="total-num" v-if="successTask !== null">{{ formatExactLargeNum(successTask) ?? "--" }}</span> <span class="total-num" v-if="successTask !== null">{{ formatExactLargeNum(successTask) ?? '--' }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
<div class="wordStyle"> <div class="wordStyle">
<span>任务执行失败统计(个):</span> <span>任务执行失败统计(个):</span>
<span class="total-num" v-if="failTask !== null">{{ formatExactLargeNum(failTask) ?? "--" }}</span> <span class="total-num" v-if="failTask !== null">{{ formatExactLargeNum(failTask) ?? '--' }}</span>
<span class="loading" v-else></span>
</div>
<div class="wordStyle">
<span>任务异常数统计(个):</span>
<span class="total-num" v-if="unusualTask !== null">{{ formatExactLargeNum(unusualTask) ?? "--" }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
</div> </div>
...@@ -58,17 +53,16 @@ ...@@ -58,17 +53,16 @@
<div class="items"> <div class="items">
<div class="wordStyle"> <div class="wordStyle">
<span>平均成功率:</span> <span>平均成功率:</span>
<span class="total-num" v-if="speed !== null"> {{ speed ?? "--" }}</span> <span class="total-num" v-if="speed !== null">
{{ `${Number(Math.floor(speed * 100) / 100).toFixed(2)}%` }}</span
>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
<div class="wordStyle"> <div class="wordStyle">
<span>平均错误率: </span> <span>平均错误率: </span>
<span class="total-num" v-if="errorRate !== null">{{ errorRate ?? "--" }}</span> <span class="total-num" v-if="errorRate !== null">{{
<span class="loading" v-else></span> `${Number(Math.ceil(errorRate * 100) / 100).toFixed(2)}%`
</div> }}</span>
<div class="wordStyle">
<span>平均异常率:</span>
<span class="total-num" v-if="unusualRate !== null">{{ unusualRate ?? "--" }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
</div> </div>
...@@ -77,73 +71,73 @@ ...@@ -77,73 +71,73 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { useRouter } from "vue-router"; import { useRouter } from 'vue-router'
import { getStatsDataList, getSpiderTaskList, getPerformanceList } from "@/api/staticData"; import { getStatsDataList, getSpiderTaskList, getPerformanceList } from '@/api/staticData'
import { onMounted, ref } from "vue"; import { onMounted, ref } from 'vue'
import formatExactLargeNum from "@/utils/formatExactLargeNum"; import formatExactLargeNum from '@/utils/formatExactLargeNum'
import { useSlideStateStore } from "@/store/slideState"; import { useSlideStateStore } from '@/store/slideState'
import { storeToRefs } from "pinia"; import { storeToRefs } from 'pinia'
const slideStateStore = useSlideStateStore(); const slideStateStore = useSlideStateStore()
const { slideState } = storeToRefs(slideStateStore); const { slideState } = storeToRefs(slideStateStore)
const router = useRouter(); const router = useRouter()
const totalDataNumber = ref(null); const totalDataNumber = ref(null)
const totalPageNumber = ref(null); const totalPageNumber = ref(null)
const totalTargetNumber = ref(null); const totalTargetNumber = ref(null)
const successTask = ref(null); const successTask = ref(null)
const failTask = ref(null); const failTask = ref(null)
const unusualTask = ref(null); const unusualTask = ref(null)
const speed = ref(null); const speed = ref(null)
const errorRate = ref(null); const errorRate = ref(null)
const unusualRate = ref(null); const unusualRate = ref(null)
const goToAllDataPage = () => { const goToAllDataPage = () => {
router.push({ router.push({
path: "/osDataDisplay/list", path: '/osDataDisplay/list',
query: { query: {
jump: "yes", jump: 'yes',
mode: "DSN数据", mode: 'DSN数据'
}, }
}); })
}; }
const goToTaskRecordPage = () => { const goToTaskRecordPage = () => {
router.push({ router.push({
path: "/osTaskRecord/list", path: '/osTaskRecord/list',
query: { query: {
jump: "yes", jump: 'yes',
mode: "状态监控", mode: '状态监控'
}, }
}); })
}; }
// 获取数据统计数据的方法 // 获取数据统计数据的方法
const getData = async () => { const getData = async () => {
const staticData = await getStatsDataList({}); const staticData = await getStatsDataList({})
const spiderTask = await getSpiderTaskList({}); const spiderTask = await getSpiderTaskList({})
const performance = await getPerformanceList({}); const performance = await getPerformanceList({})
totalDataNumber.value = staticData.data.totalData; totalDataNumber.value = staticData.data.totalData
totalPageNumber.value = staticData.data.ituPage; totalPageNumber.value = staticData.data.ituPage
totalTargetNumber.value = staticData.data.spaceTrackItemCount; totalTargetNumber.value = staticData.data.spaceTrackItemCount
successTask.value = spiderTask.data.successCount; successTask.value = spiderTask.data.successCount
failTask.value = spiderTask.data.failCount; failTask.value = spiderTask.data.failCount
unusualTask.value = spiderTask.data.exceptionCount; unusualTask.value = spiderTask.data.exceptionCount
speed.value = performance.data.success; speed.value = performance.data.success
errorRate.value = performance.data.error; errorRate.value = performance.data.error
unusualRate.value = performance.data.exception; unusualRate.value = performance.data.exception
}; }
//sidebarStatus //sidebarStatus
onMounted(() => { onMounted(() => {
getData(); getData()
}); })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.dataCard { .dataCard {
background-image: url("@/assets/picture/box2.png"); background-image: url('@/assets/picture/box2.png');
background-size: 100% 100%; background-size: 100% 100%;
background-repeat: no-repeat; background-repeat: no-repeat;
// background: #c6ebfc; // background: #c6ebfc;
...@@ -221,22 +215,37 @@ onMounted(() => { ...@@ -221,22 +215,37 @@ onMounted(() => {
aspect-ratio: 2; aspect-ratio: 2;
margin-right: 30px; margin-right: 30px;
--_g: no-repeat radial-gradient(circle closest-side, #4edaff 90%, #0000); --_g: no-repeat radial-gradient(circle closest-side, #4edaff 90%, #0000);
background: var(--_g) 0% 50%, var(--_g) 50% 50%, var(--_g) 100% 50%; background:
var(--_g) 0% 50%,
var(--_g) 50% 50%,
var(--_g) 100% 50%;
background-size: calc(100% / 3) 50%; background-size: calc(100% / 3) 50%;
animation: l3 1s infinite linear; animation: l3 1s infinite linear;
} }
@keyframes l3 { @keyframes l3 {
20% { 20% {
background-position: 0% 0%, 50% 50%, 100% 50%; background-position:
0% 0%,
50% 50%,
100% 50%;
} }
40% { 40% {
background-position: 0% 100%, 50% 0%, 100% 50%; background-position:
0% 100%,
50% 0%,
100% 50%;
} }
60% { 60% {
background-position: 0% 50%, 50% 100%, 100% 0%; background-position:
0% 50%,
50% 100%,
100% 0%;
} }
80% { 80% {
background-position: 0% 50%, 50% 50%, 100% 100%; background-position:
0% 50%,
50% 50%,
100% 100%;
} }
} }
</style> </style>
...@@ -9,27 +9,27 @@ ...@@ -9,27 +9,27 @@
<div class="wordStyle"> <div class="wordStyle">
<span>DSN爬虫任务数(个):</span> <span>DSN爬虫任务数(个):</span>
<span class="total-num" v-if="dsnTotalTaskNumber !== null">{{ <span class="total-num" v-if="dsnTotalTaskNumber !== null">{{
formatExactLargeNum(dsnTotalTaskNumber) ?? "--" formatExactLargeNum(dsnTotalTaskNumber) ?? '--'
}}</span> }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
<div class="wordStyle"> <div class="wordStyle">
<span>任务执行成功统计(个):</span> <span>任务执行成功统计(个):</span>
<span class="total-num" v-if="dsnTaskSuccessNumber !== null">{{ <span class="total-num" v-if="dsnTaskSuccessNumber !== null">{{
formatExactLargeNum(dsnTaskSuccessNumber) ?? "--" formatExactLargeNum(dsnTaskSuccessNumber) ?? '--'
}}</span> }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
<div class="wordStyle"> <div class="wordStyle">
<span>任务执行失败统计(个):</span> <span>任务执行失败统计(个):</span>
<span class="total-num" v-if="dsnTaskFailNumber !== null">{{ <span class="total-num" v-if="dsnTaskFailNumber !== null">{{
formatExactLargeNum(dsnTaskFailNumber) ?? "--" formatExactLargeNum(dsnTaskFailNumber) ?? '--'
}}</span> }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
<div class="wordStyle"> <div class="wordStyle">
<span>错误率: </span> <span>错误率: </span>
<span class="total-num" v-if="dsnErrorRate !== null">{{ dsnErrorRate ?? "--" }}</span> <span class="total-num" v-if="dsnErrorRate !== null">{{ Number(dsnErrorRate).toFixed(2) + '%' }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
</div> </div>
...@@ -42,27 +42,27 @@ ...@@ -42,27 +42,27 @@
<div class="wordStyle"> <div class="wordStyle">
<span>ITU爬虫任务数(个):</span> <span>ITU爬虫任务数(个):</span>
<span class="total-num" v-if="ituTotalTaskNumber !== null">{{ <span class="total-num" v-if="ituTotalTaskNumber !== null">{{
formatExactLargeNum(ituTotalTaskNumber) ?? "--" formatExactLargeNum(ituTotalTaskNumber) ?? '--'
}}</span> }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
<div class="wordStyle"> <div class="wordStyle">
<span>ITU爬取成功数据统计(个):</span> <span>任务执行成功统计(个):</span>
<span class="total-num" v-if="ituTaskSuccessNumber !== null">{{ <span class="total-num" v-if="ituTaskSuccessNumber !== null">{{
formatExactLargeNum(ituTaskSuccessNumber) ?? "--" formatExactLargeNum(ituTaskSuccessNumber) ?? '--'
}}</span> }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
<div class="wordStyle"> <div class="wordStyle">
<span>ITU爬取失败数据统计(个):</span> <span>任务执行失败统计(个):</span>
<span class="total-num" v-if="ituTaskFailNumber !== null">{{ <span class="total-num" v-if="ituTaskFailNumber !== null">{{
formatExactLargeNum(ituTaskFailNumber) ?? "--" formatExactLargeNum(ituTaskFailNumber) ?? '--'
}}</span> }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
<div class="wordStyle"> <div class="wordStyle">
<span>错误率:</span> <span>错误率:</span>
<span class="total-num" v-if="ituErrorRate !== null">{{ ituErrorRate ?? "--" }}</span> <span class="total-num" v-if="ituErrorRate !== null">{{ Number(ituErrorRate).toFixed(2) + '%' }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
</div> </div>
...@@ -75,27 +75,27 @@ ...@@ -75,27 +75,27 @@
<div class="wordStyle"> <div class="wordStyle">
<span>ST爬虫任务数(个):</span> <span>ST爬虫任务数(个):</span>
<span class="total-num" v-if="stTotalTaskNumber !== null">{{ <span class="total-num" v-if="stTotalTaskNumber !== null">{{
formatExactLargeNum(stTotalTaskNumber) ?? "--" formatExactLargeNum(stTotalTaskNumber) ?? '--'
}}</span> }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
<div class="wordStyle"> <div class="wordStyle">
<span>任务执行成功统计(个):</span> <span>任务执行成功统计(个):</span>
<span class="total-num" v-if="stTaskSuccessNumber !== null">{{ <span class="total-num" v-if="stTaskSuccessNumber !== null">{{
formatExactLargeNum(stTaskSuccessNumber) ?? "--" formatExactLargeNum(stTaskSuccessNumber) ?? '--'
}}</span> }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
<div class="wordStyle"> <div class="wordStyle">
<span>任务执行失败统计(个):</span> <span>任务执行失败统计(个):</span>
<span class="total-num" v-if="stTaskFailNumber !== null">{{ <span class="total-num" v-if="stTaskFailNumber !== null">{{
formatExactLargeNum(stTaskFailNumber) ?? "--" formatExactLargeNum(stTaskFailNumber) ?? '--'
}}</span> }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
<div class="wordStyle"> <div class="wordStyle">
<span>错误率:</span> <span>错误率:</span>
<span class="total-num" v-if="stErrorRate !== null">{{ stErrorRate ?? "--" }}</span> <span class="total-num" v-if="stErrorRate !== null">{{ Number(stErrorRate).toFixed(2) + '%' }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
</div> </div>
...@@ -107,24 +107,24 @@ ...@@ -107,24 +107,24 @@
<div class="items"> <div class="items">
<div class="wordStyle"> <div class="wordStyle">
<span>ESA爬虫任务数(个):</span> <span>ESA爬虫任务数(个):</span>
<span class="total-num" v-if="esaTotalCount !== null">{{ formatExactLargeNum(esaTotalCount) ?? "--" }}</span> <span class="total-num" v-if="esaTotalCount !== null">{{ formatExactLargeNum(esaTotalCount) ?? '--' }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
<div class="wordStyle"> <div class="wordStyle">
<span>任务执行成功统计(个):</span> <span>任务执行成功统计(个):</span>
<span class="total-num" v-if="esaSuccessCount !== null">{{ <span class="total-num" v-if="esaSuccessCount !== null">{{
formatExactLargeNum(esaSuccessCount) ?? "--" formatExactLargeNum(esaSuccessCount) ?? '--'
}}</span> }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
<div class="wordStyle"> <div class="wordStyle">
<span>任务执行失败统计(个):</span> <span>任务执行失败统计(个):</span>
<span class="total-num" v-if="esaFailCount !== null">{{ formatExactLargeNum(esaFailCount) ?? "--" }}</span> <span class="total-num" v-if="esaFailCount !== null">{{ formatExactLargeNum(esaFailCount) ?? '--' }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
<div class="wordStyle"> <div class="wordStyle">
<span>错误率:</span> <span>错误率:</span>
<span class="total-num" v-if="esaErrorRate !== null">{{ esaErrorRate ?? "--" }}</span> <span class="total-num" v-if="esaErrorRate !== null">{{ Number(esaErrorRate).toFixed(2) + '%' }}</span>
<span class="loading" v-else></span> <span class="loading" v-else></span>
</div> </div>
</div> </div>
...@@ -133,109 +133,116 @@ ...@@ -133,109 +133,116 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { useRouter } from "vue-router"; import { useRouter } from 'vue-router'
import { getAllSpiderTaskStatistics } from "@/api/staticData"; import { getAllSpiderTaskStatistics } from '@/api/staticData'
import { onMounted, ref } from "vue"; import { onMounted, ref } from 'vue'
import { getAllTaskStatistics, getSpiderTaskList } from "@/api/spiderTask"; import { getAllTaskStatistics, getSpiderTaskList } from '@/api/spiderTask'
import { useSlideStateStore } from "@/store/slideState"; import { useSlideStateStore } from '@/store/slideState'
import { storeToRefs } from "pinia"; import { storeToRefs } from 'pinia'
import formatExactLargeNum from "@/utils/formatExactLargeNum"; import formatExactLargeNum from '@/utils/formatExactLargeNum'
const slideStateStore = useSlideStateStore(); const slideStateStore = useSlideStateStore()
const { slideState } = storeToRefs(slideStateStore); const { slideState } = storeToRefs(slideStateStore)
const router = useRouter(); const router = useRouter()
const dsnTotalTaskNumber = ref(null); const dsnTotalTaskNumber = ref(null)
const dsnTaskSuccessNumber = ref(null); const dsnTaskSuccessNumber = ref(null)
const dsnTaskFailNumber = ref(null); const dsnTaskFailNumber = ref(null)
const dsnErrorRate = ref(null); const dsnErrorRate = ref(null)
const ituTotalTaskNumber = ref(null); const ituTotalTaskNumber = ref(null)
const ituTaskSuccessNumber = ref(null); const ituTaskSuccessNumber = ref(null)
const ituTaskFailNumber = ref(null); const ituTaskFailNumber = ref(null)
const ituErrorRate = ref(null); const ituErrorRate = ref(null)
const stTotalTaskNumber = ref(null); const stTotalTaskNumber = ref(null)
const stTaskSuccessNumber = ref(null); const stTaskSuccessNumber = ref(null)
const stTaskFailNumber = ref(null); const stTaskFailNumber = ref(null)
const stErrorRate = ref(null); const stErrorRate = ref(null)
const esaTotalCount = ref(null); const esaTotalCount = ref(null)
const esaSuccessCount = ref(null); const esaSuccessCount = ref(null)
const esaErrorRate = ref(null); const esaErrorRate = ref(null)
const esaFailCount = ref(null); const esaFailCount = ref(null)
const goToDSNTaskRecordPage = () => { const goToDSNTaskRecordPage = () => {
router.push({ router.push({
path: "/osTaskInformation/list", path: '/osTaskInformation/list',
query: { query: {
spiderType: "dsn_now", spiderType: 'dsn_now',
jump: "yes", jump: 'yes',
page: "statusMonitor", page: 'statusMonitor'
}, }
}); })
}; }
const goToITUTaskRecordPage = () => { const goToITUTaskRecordPage = () => {
router.push({ router.push({
path: "/osTaskInformation/list", path: '/osTaskInformation/list',
query: { query: {
spiderType: "itu_space_explorer", spiderType: 'itu_space_explorer',
jump: "yes", jump: 'yes',
page: "statusMonitor", page: 'statusMonitor'
}, }
}); })
}; }
const goToSTTaskRecordPage = () => { const goToSTTaskRecordPage = () => {
router.push({ router.push({
path: "/osTaskInformation/list", path: '/osTaskInformation/list',
query: { query: {
spiderType: "space_track", spiderType: 'space_track',
jump: "yes", jump: 'yes',
page: "statusMonitor", page: 'statusMonitor'
}, }
}); })
}; }
const goToESATaskRecordPage = () => { const goToESATaskRecordPage = () => {
router.push({ router.push({
path: "/osTaskInformation/list", path: '/osTaskInformation/list',
query: { query: {
spiderType: "es_track_transmission", spiderType: 'es_track_transmission',
jump: "yes", jump: 'yes',
page: "statusMonitor", page: 'statusMonitor'
}, }
}); })
}; }
// 获取任务统计数据的方法 // 获取任务统计数据的方法
const getData = async () => { const getData = async () => {
const res = await getAllSpiderTaskStatistics({}); const res = await getAllSpiderTaskStatistics({})
const stTask = await getSpiderTaskList({ spiders: "itu_space_explorer" }); const tasks = [
const allTask = await getAllTaskStatistics(); getSpiderTaskList({ spiders: 'itu_space_explorer' }),
getSpiderTaskList({ spiders: 'dsn_now' }),
getSpiderTaskList({ spiders: 'es_track_transmission' }),
getSpiderTaskList({ spiders: 'space_track' })
]
dsnTotalTaskNumber.value = allTask.data.dsn_now.totalCount; const [ituTask, dsnTask, esaTask, stTask] = await Promise.all(tasks)
dsnTaskSuccessNumber.value = res.data.dsn_now.successCount; const allTask = await getAllTaskStatistics()
dsnTaskFailNumber.value = res.data.dsn_now.failCount;
dsnErrorRate.value = res.data.dsn_now.errorRate; dsnTotalTaskNumber.value = dsnTask.data.length
ituTotalTaskNumber.value = allTask.data.itu_space_explorer?.totalCount; dsnTaskSuccessNumber.value = res.data.dsn_now.successCount
ituTaskSuccessNumber.value = res.data.itu_space_explorer?.successCount; dsnTaskFailNumber.value = res.data.dsn_now.failCount
ituTaskFailNumber.value = res.data.itu_space_explorer?.failCount; dsnErrorRate.value = res.data.dsn_now.errorRate
ituErrorRate.value = res.data.itu_space_explorer?.errorRate; ituTotalTaskNumber.value = ituTask.data.length
stTotalTaskNumber.value = allTask.data.space_track?.totalCount; ituTaskSuccessNumber.value = res.data.itu_space_explorer?.successCount
stTaskSuccessNumber.value = res.data.space_track?.successCount; ituTaskFailNumber.value = res.data.itu_space_explorer?.failCount
stTaskFailNumber.value = res.data.space_track?.failCount; ituErrorRate.value = res.data.itu_space_explorer?.errorRate
stErrorRate.value = res.data.space_track?.errorRate; stTotalTaskNumber.value = stTask.data.length
esaTotalCount.value = res.data.es_track_transmission?.totalCount; stTaskSuccessNumber.value = res.data.space_track?.successCount
esaSuccessCount.value = res.data.es_track_transmission?.successCount; stTaskFailNumber.value = res.data.space_track?.failCount
esaFailCount.value = res.data.es_track_transmission?.failCount; stErrorRate.value = res.data.space_track?.errorRate
esaErrorRate.value = res.data.es_track_transmission?.errorRate; esaTotalCount.value = esaTask.data.length
}; esaSuccessCount.value = res.data.es_track_transmission?.successCount
esaFailCount.value = res.data.es_track_transmission?.failCount
esaErrorRate.value = res.data.es_track_transmission?.errorRate
}
onMounted(() => { onMounted(() => {
getData(); getData()
}); })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.dataCard { .dataCard {
background-image: url("@/assets/picture/box2.png"); background-image: url('@/assets/picture/box2.png');
background-size: 100% 100%; background-size: 100% 100%;
background-repeat: no-repeat; background-repeat: no-repeat;
width: 275px; width: 275px;
...@@ -298,22 +305,37 @@ onMounted(() => { ...@@ -298,22 +305,37 @@ onMounted(() => {
aspect-ratio: 2; aspect-ratio: 2;
margin-right: 30px; margin-right: 30px;
--_g: no-repeat radial-gradient(circle closest-side, #4edaff 90%, #0000); --_g: no-repeat radial-gradient(circle closest-side, #4edaff 90%, #0000);
background: var(--_g) 0% 50%, var(--_g) 50% 50%, var(--_g) 100% 50%; background:
var(--_g) 0% 50%,
var(--_g) 50% 50%,
var(--_g) 100% 50%;
background-size: calc(100% / 3) 50%; background-size: calc(100% / 3) 50%;
animation: l3 1s infinite linear; animation: l3 1s infinite linear;
} }
@keyframes l3 { @keyframes l3 {
20% { 20% {
background-position: 0% 0%, 50% 50%, 100% 50%; background-position:
0% 0%,
50% 50%,
100% 50%;
} }
40% { 40% {
background-position: 0% 100%, 50% 0%, 100% 50%; background-position:
0% 100%,
50% 0%,
100% 50%;
} }
60% { 60% {
background-position: 0% 50%, 50% 100%, 100% 0%; background-position:
0% 50%,
50% 100%,
100% 0%;
} }
80% { 80% {
background-position: 0% 50%, 50% 50%, 100% 100%; background-position:
0% 50%,
50% 50%,
100% 100%;
} }
} }
......
...@@ -50,27 +50,32 @@ ...@@ -50,27 +50,32 @@
:cell-style="{ textAlign: 'center' }" :cell-style="{ textAlign: 'center' }"
> >
<el-table-column property="number" label="序号" width="55" type="index" /> <el-table-column property="number" label="序号" width="55" type="index" />
<el-table-column label="任务名称" show-overflow-tooltip>
<template #default="scope">
{{ JSON.parse(scope.row.options).jobName }}
</template>
</el-table-column>
<el-table-column property="spider" label="所属爬虫" show-overflow-tooltip /> <el-table-column property="spider" label="所属爬虫" show-overflow-tooltip />
<el-table-column property="schedule_mode" label="调度模式" show-overflow-tooltip /> <el-table-column property="schedule_mode" label="调度模式" show-overflow-tooltip />
<el-table-column property="run_status" label="调度状态" show-overflow-tooltip> <el-table-column property="run_status" label="调度状态" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
{{ "已完成" }} {{ scope.row.status ? '已完成' : '未完成' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="错误消息" show-overflow-tooltip> <el-table-column label="错误消息" show-overflow-tooltip>
<!-- 当错误消息为空时默认值为'-' --> <!-- 当错误消息为空时默认值为'-' -->
<template #default="scope"> <template #default="scope">
{{ scope.row.message || "-" }} {{ scope.row.message || '-' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column property="run_status" label="运行状态" show-overflow-tooltip> <el-table-column property="run_status" label="运行状态" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
{{ scope.row.run_status === "unknown" ? "已结束" : scope.row.run_status }} {{ scope.row.run_status === 'unknown' ? '已结束' : scope.row.run_status }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="运行耗时/ms"> <el-table-column label="运行耗时/ms">
<template #default="scope"> <template #default="scope">
{{ scope.row.duration == 0 ? "-" : scope.row.duration }} {{ scope.row.duration == 0 ? '-' : scope.row.duration }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column property="create_time" label="采集时间" width="200" show-overflow-tooltip /> <el-table-column property="create_time" label="采集时间" width="200" show-overflow-tooltip />
...@@ -90,126 +95,123 @@ ...@@ -90,126 +95,123 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted } from "vue"; import { ref, onMounted } from 'vue'
import Pagination from "@/components/pagination/index.vue"; import Pagination from '@/components/pagination/index.vue'
import { useRoute } from "vue-router"; import { useRoute } from 'vue-router'
import { useRouter } from "vue-router"; import { useRouter } from 'vue-router'
import { getSpiderTaskRecord } from "@/api/spiderTask.ts"; import { getSpiderTaskRecord } from '@/api/spiderTask.ts'
import { ElMessage } from "element-plus"; import MenuTitle from '@/components/MenuTitle.vue'
import MenuTitle from "@/components/MenuTitle.vue"; import TableSearch from '@/components/TableSearch.vue'
import TableSearch from "@/components/TableSearch.vue";
//时间处理库 //时间处理库
import dayjs from "dayjs"; import dayjs from 'dayjs'
// ElConfigProvider 组件 // ElConfigProvider 组件
import { ElConfigProvider } from "element-plus"; import { ElConfigProvider } from 'element-plus'
// 引入中文包 // 引入中文包
import zhCn from "element-plus/es/locale/lang/zh-cn"; import zhCn from 'element-plus/es/locale/lang/zh-cn'
defineOptions({ name: "Pagination" }); defineOptions({ name: 'Pagination' })
// 更改分页文字 // 更改分页文字
zhCn.el.pagination.total = "共 `{total} 条`"; zhCn.el.pagination.total = '共 `{total} 条`'
zhCn.el.pagination.goto = "跳至"; zhCn.el.pagination.goto = '跳至'
zhCn.el.pagination.pagesize = "条/页"; zhCn.el.pagination.pagesize = '条/页'
zhCn.el.pagination.pageClassifier = "页"; zhCn.el.pagination.pageClassifier = '页'
const route = useRoute(); const route = useRoute()
const router = useRouter(); const router = useRouter()
//初始数据为近七天 //初始数据为近七天
const timeValue = ref<string[]>([]); const timeValue = ref<string[]>([])
const tableData = ref([]); const tableData = ref([])
const pageObj = ref({ const pageObj = ref({
total: 10, total: 10,
pageSize: 10, pageSize: 10,
pageNo: 1, pageNo: 1,
pagerCount: 5, pagerCount: 5
}); })
const goToStatus = () => { const goToStatus = () => {
if (route.query.mode === "状态监控") { if (route.query.mode === '状态监控') {
router.push({ router.push({
path: "/osStatus/list", path: '/osStatus/list'
}); })
} else { } else {
router.push({ router.push({
path: "/osTaskInformation/list", path: '/osTaskInformation/list'
}); })
} }
}; }
const spideOptions = [ const spideOptions = [
{ {
label: "dsn_now", label: 'dsn_now',
value: "dsn_now", value: 'dsn_now'
}, },
{ {
label: "itu_space_expolorer", label: 'itu_space_expolorer',
value: "itu_space_expolorer", value: 'itu_space_expolorer'
}, },
{ {
label: "space_track", label: 'space_track',
value: "space_track", value: 'space_track'
}, },
{ {
label: "es_track_transmission", label: 'es_track_transmission',
value: "es_track_transmission", value: 'es_track_transmission'
}, }
]; ]
//表单loading标记 //表单loading标记
const tableLoading = ref(false); const tableLoading = ref(false)
//重置查询 //重置查询
const resetQuery = () => { const resetQuery = () => {
timeValue.value = []; timeValue.value = []
spidername.value = ""; spidername.value = ''
getData(); getData()
}; }
// 获取任务执行记录列表 // 获取任务执行记录列表
const getData = async () => { const getData = async () => {
let resTime: any[] = []; let resTime: any[] = []
resTime.push(dayjs().subtract(7, "day").format("YYYY-MM-DD HH:mm:ss")); resTime.push(dayjs().subtract(7, 'day').format('YYYY-MM-DD HH:mm:ss'))
resTime.push(dayjs().format("YYYY-MM-DD HH:mm:ss")); resTime.push(dayjs().format('YYYY-MM-DD HH:mm:ss'))
tableLoading.value = true; tableLoading.value = true
const res = await getSpiderTaskRecord({ const res = await getSpiderTaskRecord({
page: pageObj.value.pageNo, page: pageObj.value.pageNo,
size: pageObj.value.pageSize, size: pageObj.value.pageSize,
status: "total", status: 'total',
times: resTime, times: resTime
}); })
pageObj.value.total = res.data.total; pageObj.value.total = res.data.total
tableData.value = res.data.list; tableData.value = res.data.list
tableLoading.value = false; tableLoading.value = false
}; }
const spidername = ref(""); const spidername = ref('')
//查询数据的方法 //查询数据的方法
const searchData = async () => { const searchData = async () => {
let resTime: any[] = []; let resTime: any[] = []
if (timeValue.value.length !== 0) { if (timeValue.value.length !== 0) {
const startTime = timeValue.value[0]; const startTime = timeValue.value[0]
const endTime = timeValue.value[1]; const endTime = timeValue.value[1]
resTime.push(dayjs(startTime).format("YYYY-MM-DD HH:mm:ss")); resTime.push(dayjs(startTime).format('YYYY-MM-DD HH:mm:ss'))
resTime.push(dayjs(endTime).format("YYYY-MM-DD HH:mm:ss")); resTime.push(dayjs(endTime).format('YYYY-MM-DD HH:mm:ss'))
} }
tableLoading.value = true; tableLoading.value = true
const res = await getSpiderTaskRecord({ const res = await getSpiderTaskRecord({
page: pageObj.value.pageNo, page: pageObj.value.pageNo,
size: pageObj.value.pageSize, size: pageObj.value.pageSize,
status: "total", status: 'total',
spider: spidername.value, spider: spidername.value,
times: resTime, times: resTime
}); })
pageObj.value.total = res.data.total; pageObj.value.total = res.data.total
tableData.value = res.data.list; tableData.value = res.data.list
console.log(tableData.value); tableLoading.value = false
}
tableLoading.value = false;
};
onMounted(() => { onMounted(() => {
getData(); getData()
}); })
</script> </script>
<style scoped> <style scoped>
...@@ -218,7 +220,7 @@ onMounted(() => { ...@@ -218,7 +220,7 @@ onMounted(() => {
} }
/* 工具栏样式 */ /* 工具栏样式 */
.toolbarStyle { .toolbarStyle {
background-image: url("@/assets/picture/box3.png"); background-image: url('@/assets/picture/box3.png');
background-size: 100% 100%; background-size: 100% 100%;
background-repeat: no-repeat; background-repeat: no-repeat;
} }
...@@ -244,7 +246,7 @@ onMounted(() => { ...@@ -244,7 +246,7 @@ onMounted(() => {
} }
.backStyle { .backStyle {
background-image: url("@/assets/picture/back.png"); background-image: url('@/assets/picture/back.png');
background-size: 100% 100%; background-size: 100% 100%;
background-repeat: no-repeat; background-repeat: no-repeat;
height: 5vh; height: 5vh;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment