2021-07-21 22:46:08 +08:00
|
|
|
|
import { unitTypes } from '@/utils/constants'
|
2022-02-28 15:24:47 +08:00
|
|
|
|
import _ from 'lodash'
|
2021-07-21 22:46:08 +08:00
|
|
|
|
|
|
|
|
|
|
const numberUnit = ['', 'K', 'M', 'G', 'T', 'P', 'E']
|
|
|
|
|
|
const byteUnit = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB']
|
2022-04-06 14:48:46 +08:00
|
|
|
|
const bpsUnit = ['bps', 'Kbps', 'Mbps', 'Gbps', 'Tbps', 'Pbps', 'Ebps']
|
2022-10-12 11:11:22 +08:00
|
|
|
|
const qpsUnit = ['qps', 'Kqps', 'Mqps', 'Gqps', 'Tqps', 'Pqps', 'Eqps']
|
2021-07-21 22:46:08 +08:00
|
|
|
|
const timeUnit = [ // 时间单位步进倍数,以ms为基数
|
|
|
|
|
|
{ unit: 'ms', step: 1 },
|
|
|
|
|
|
{ unit: 's', step: 1000 },
|
|
|
|
|
|
{ unit: 'm', step: 60 },
|
|
|
|
|
|
{ unit: 'h', step: 60 },
|
|
|
|
|
|
{ unit: 'd', step: 24 }
|
|
|
|
|
|
]
|
|
|
|
|
|
function asciiCompute (num, ascii = 1000, units, dot = 2) {
|
|
|
|
|
|
if (!num && num !== 0 && num !== '0') {
|
|
|
|
|
|
return ['', '']
|
|
|
|
|
|
}
|
|
|
|
|
|
num = Number(num)
|
|
|
|
|
|
let carry = 0
|
|
|
|
|
|
if (num > 1) {
|
|
|
|
|
|
const log = Math.log(num) / Math.log(ascii)
|
|
|
|
|
|
carry = parseInt(log)
|
|
|
|
|
|
num = num / Math.pow(ascii, carry)
|
|
|
|
|
|
}
|
|
|
|
|
|
if (Number.isInteger(num)) {
|
|
|
|
|
|
return [num, units[carry]]
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return [num.toFixed(dot), units[carry]]
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function numberUnitConvert (value, sourceUnit, targetUnit, dot = 2) {
|
|
|
|
|
|
return asciiCompute(value, 1000, numberUnit, dot)
|
|
|
|
|
|
}
|
2022-04-06 14:48:46 +08:00
|
|
|
|
export function bpsUnitConvert (value, sourceUnit, targetUnit, dot = 2) {
|
|
|
|
|
|
return asciiCompute(value, 1000, bpsUnit, dot)
|
|
|
|
|
|
}
|
2022-10-12 11:11:22 +08:00
|
|
|
|
export function qpsUnitConvert (value, sourceUnit, targetUnit, dot = 2) {
|
|
|
|
|
|
return asciiCompute(value, 1000, qpsUnit, dot)
|
|
|
|
|
|
}
|
2022-04-06 14:48:46 +08:00
|
|
|
|
export function byteUnitConvert (value, unitType, sourceUnit = 'B', targetUnit, dot = 2) {
|
2021-07-21 22:46:08 +08:00
|
|
|
|
return asciiCompute(value, 1024, byteUnit, dot)
|
|
|
|
|
|
}
|
|
|
|
|
|
/* 时间单位转换,例如将ms转为h */
|
|
|
|
|
|
export function timeUnitFormatter (time, sourceUnit = 'ms', targetUnit, dot = 2) {
|
2022-02-28 15:24:47 +08:00
|
|
|
|
if (!_.isNumber(time) || time === 0) {
|
|
|
|
|
|
return [0, sourceUnit]
|
|
|
|
|
|
}
|
2021-07-21 22:46:08 +08:00
|
|
|
|
let sourceIndex = -1
|
|
|
|
|
|
let targetIndex = -1
|
|
|
|
|
|
timeUnit.forEach((t, i) => {
|
|
|
|
|
|
sourceUnit === t.unit && (sourceIndex = i)
|
|
|
|
|
|
targetUnit && targetUnit === t.unit && (targetIndex = i)
|
|
|
|
|
|
})
|
|
|
|
|
|
let multi = 1
|
|
|
|
|
|
let result = parseFloat(time)
|
|
|
|
|
|
if (targetIndex < 0) {
|
|
|
|
|
|
while (sourceIndex < timeUnit.length - 1 && result > timeUnit[sourceIndex + 1].step) {
|
|
|
|
|
|
sourceIndex++
|
|
|
|
|
|
multi = timeUnit[sourceIndex].step
|
|
|
|
|
|
result /= multi
|
|
|
|
|
|
}
|
2022-10-12 22:08:34 +08:00
|
|
|
|
return [multi === 1 ? result.toFixed(0) : result.toFixed(dot), timeUnit[sourceIndex].unit]
|
2021-07-21 22:46:08 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
timeUnit.forEach((s, i) => {
|
|
|
|
|
|
if (i <= targetIndex) {
|
|
|
|
|
|
multi *= s.step
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
result /= multi
|
|
|
|
|
|
return [result.toFixed(dot), targetUnit]
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* 单位转换,返回转换后的[value, unit] */
|
2021-10-11 19:12:52 +08:00
|
|
|
|
// unitType = time / number / byte / percent
|
2021-07-21 22:46:08 +08:00
|
|
|
|
export default function unitConvert (value, unitType, sourceUnit, targetUnit, dot = 2) {
|
2021-08-09 13:38:32 +08:00
|
|
|
|
if (unitType === unitTypes.string) {
|
2021-08-09 14:25:43 +08:00
|
|
|
|
if (value) {
|
|
|
|
|
|
if (typeof value === 'string') {
|
|
|
|
|
|
return [value, '']
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return ['-', '']
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return ['-', '']
|
|
|
|
|
|
}
|
2021-08-09 13:38:32 +08:00
|
|
|
|
}
|
2021-08-13 09:39:02 +08:00
|
|
|
|
if (!value && value !== 0) {
|
2021-07-21 22:46:08 +08:00
|
|
|
|
return ['-', '']
|
|
|
|
|
|
} else {
|
|
|
|
|
|
switch (unitType) {
|
|
|
|
|
|
case unitTypes.time: {
|
|
|
|
|
|
return timeUnitFormatter(value, sourceUnit, targetUnit, dot)
|
|
|
|
|
|
}
|
2022-04-06 13:37:20 +08:00
|
|
|
|
case unitTypes.percent: {
|
2022-04-06 14:48:46 +08:00
|
|
|
|
const r = (value * 100).toFixed(dot)
|
|
|
|
|
|
if (_.isNaN(r)) {
|
|
|
|
|
|
return ['-', '']
|
2022-04-06 15:04:55 +08:00
|
|
|
|
} else if (r == 0) {
|
|
|
|
|
|
return [0, '%']
|
2022-04-06 14:48:46 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
return [r, '%']
|
|
|
|
|
|
}
|
2022-04-06 13:37:20 +08:00
|
|
|
|
}
|
2021-07-21 22:46:08 +08:00
|
|
|
|
case unitTypes.number: {
|
|
|
|
|
|
return numberUnitConvert(value, sourceUnit, targetUnit, dot)
|
|
|
|
|
|
}
|
2022-04-06 14:48:46 +08:00
|
|
|
|
case unitTypes.bps: {
|
|
|
|
|
|
return bpsUnitConvert(value, sourceUnit, targetUnit, dot)
|
|
|
|
|
|
}
|
2021-07-21 22:46:08 +08:00
|
|
|
|
case unitTypes.byte: {
|
2022-04-06 14:48:46 +08:00
|
|
|
|
return byteUnitConvert(value, unitType, sourceUnit, targetUnit, dot)
|
2021-07-21 22:46:08 +08:00
|
|
|
|
}
|
2022-10-12 11:11:22 +08:00
|
|
|
|
case unitTypes.qps: {
|
|
|
|
|
|
return qpsUnitConvert(value, sourceUnit, targetUnit, dot)
|
|
|
|
|
|
}
|
2021-07-21 22:46:08 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function getUnitType (column) {
|
|
|
|
|
|
if (column) {
|
|
|
|
|
|
switch (column.toLowerCase()) {
|
|
|
|
|
|
case 'time': {
|
|
|
|
|
|
return unitTypes.time
|
|
|
|
|
|
}
|
|
|
|
|
|
case 'bytes': {
|
|
|
|
|
|
return unitTypes.byte
|
|
|
|
|
|
}
|
|
|
|
|
|
case 'sessions':
|
|
|
|
|
|
default: {
|
|
|
|
|
|
return unitTypes.number
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return unitTypes.number
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2021-10-11 19:12:52 +08:00
|
|
|
|
|
|
|
|
|
|
/* 单位转换,返回转换后的[value, unit],type=time时若value<1ms,返回<1ms,type=percent时若value<0.01%,返回<0.01% */
|
2023-12-11 11:28:47 +08:00
|
|
|
|
export function valueToRangeValue (value, unitType,sourceUnit, targetUnit, dot) {
|
|
|
|
|
|
const values = unitConvert(value, unitType,sourceUnit, targetUnit, dot)
|
2023-08-04 16:00:29 +08:00
|
|
|
|
if (values[0] === '-') {
|
|
|
|
|
|
return values
|
|
|
|
|
|
}
|
2021-10-11 19:12:52 +08:00
|
|
|
|
if (values[0] || values[0] === 0) {
|
|
|
|
|
|
switch (unitType) {
|
|
|
|
|
|
case unitTypes.time: {
|
|
|
|
|
|
if (values[0] < 1) {
|
|
|
|
|
|
return ['<1', 'ms']
|
|
|
|
|
|
}
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
|
|
|
|
|
case unitTypes.percent: {
|
|
|
|
|
|
if (values[0] < 0.01) {
|
2022-04-06 14:48:46 +08:00
|
|
|
|
return ['<0.01', '%']
|
2021-10-11 19:12:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
2022-08-21 22:11:53 +08:00
|
|
|
|
case unitTypes.bps: {
|
|
|
|
|
|
if (values[0] < 0.01) {
|
|
|
|
|
|
return ['<0.01', 'bps']
|
|
|
|
|
|
}
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
2022-10-25 18:41:27 +08:00
|
|
|
|
case unitTypes.qps: {
|
|
|
|
|
|
if (values[0] < 0.01) {
|
|
|
|
|
|
return ['<0.01', 'qps']
|
|
|
|
|
|
}
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
2023-08-04 11:00:37 +08:00
|
|
|
|
case unitTypes.number: {
|
|
|
|
|
|
if (values[0] < 0.01) {
|
|
|
|
|
|
return ['<0.01', '']
|
|
|
|
|
|
}
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
2021-10-11 19:12:52 +08:00
|
|
|
|
default: break
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return values
|
|
|
|
|
|
}
|