This commit is contained in:
Mrx
2026-06-04 18:04:21 +08:00
parent c9102f2d51
commit 483fdec6a2
26 changed files with 1282 additions and 193 deletions

View File

@@ -0,0 +1,73 @@
/**
* 解包车辆报告业务体:兼容 BaseReport 传入的 data 仍带一层 { apiID, data } 或 JSON 字符串
*/
export function unwrapVehiclePayload(raw, depth = 0) {
if (raw == null || depth > 5)
return raw
if (typeof raw === 'string') {
const s = raw.trim()
if (!s)
return null
try {
return unwrapVehiclePayload(JSON.parse(s), depth + 1)
}
catch {
return raw
}
}
if (Array.isArray(raw))
return raw
if (typeof raw !== 'object')
return raw
const hasApiWrapper = ('apiID' in raw || 'apiId' in raw) && 'data' in raw
if (hasApiWrapper)
return unwrapVehiclePayload(raw.data ?? raw, depth + 1)
if (typeof raw.data === 'string' || (raw.data && typeof raw.data === 'object' && !Array.isArray(raw.data))) {
const inner = raw.data
const onlyDataKey = Object.keys(raw).length <= 2 && 'data' in raw
if (onlyDataKey || (typeof inner === 'object' && inner && !Array.isArray(inner) && Object.keys(inner).length > 0 && !('list' in raw) && !('vehicleCount' in raw) && !('carNum' in raw)))
return unwrapVehiclePayload(inner, depth + 1)
}
return raw
}
/** 解析为数组直连数组、list、record、retdata 等 */
export function payloadAsArray(raw) {
const p = unwrapVehiclePayload(raw)
if (!p)
return []
if (Array.isArray(p))
return p
if (typeof p !== 'object')
return []
if (Array.isArray(p.list))
return p.list
if (Array.isArray(p.record))
return p.record
if (Array.isArray(p.retdata))
return p.retdata
if (typeof p.data === 'string') {
try {
const parsed = JSON.parse(p.data)
return Array.isArray(parsed) ? parsed : []
}
catch {
return []
}
}
return []
}
/** 解析为对象 */
export function payloadAsObject(raw) {
const p = unwrapVehiclePayload(raw)
if (!p || typeof p !== 'object' || Array.isArray(p))
return {}
return p
}

View File

@@ -0,0 +1,73 @@
/** 车辆报告共用车牌颜色、车辆类型、日期里程文案 */
export const PLATE_COLOR_LABELS = {
0: '蓝色',
1: '黄色',
2: '黑色',
3: '白色',
4: '渐变绿',
5: '黄绿双拼',
6: '蓝白渐变',
7: '临牌',
11: '绿色',
12: '红色',
}
export function plateColorLabel(c) {
const n = Number(c)
if (Number.isNaN(n))
return '—'
return PLATE_COLOR_LABELS[n] ?? '其他'
}
const VEHICLE_TYPE_LABELS = {
1: '一型客车',
2: '二型客车',
3: '三型客车',
4: '四型客车',
11: '一型货车',
12: '二型货车',
13: '三型货车',
14: '四型货车',
15: '五型货车',
16: '六型货车',
21: '一型专项作业车',
22: '二型专项作业车',
23: '三型专项作业车',
24: '四型专项作业车',
25: '五型专项作业车',
26: '六型专项作业车',
}
export function vehicleTypeLabel(t) {
if (t == null || t === '')
return '—'
const n = Number(t)
if (!Number.isNaN(n) && VEHICLE_TYPE_LABELS[n])
return VEHICLE_TYPE_LABELS[n]
return String(t)
}
export function formatDateZh(val) {
if (!val)
return '-'
const m = String(val).match(/^(\d{4})-(\d{2})-(\d{2})/)
if (m)
return `${m[1]}${m[2]}${m[3]}`
return String(val)
}
export function formatMileageKm(val) {
if (val !== 0 && !val)
return '-'
const num = Number(val)
if (Number.isNaN(num))
return `${val} km`
return `${num.toLocaleString()} km`
}
export function maskName(name) {
if (!name)
return '-'
return name.length > 1 ? `${name[0]}${'*'.repeat(name.length - 1)}` : '*'
}

View File

@@ -0,0 +1,44 @@
import { unwrapVehiclePayload } from './vehiclePayload'
/**
* 规范 query_data 单项,供 BaseReport 使用:{ data: { apiID, data: 业务体 } }
*/
export function normalizeVehicleReportItem(item) {
if (!item || typeof item !== 'object')
return item
const outer = item.data
if (outer == null)
return item
let apiID = ''
let payload = outer
if (typeof outer === 'object' && !Array.isArray(outer)) {
apiID = String(outer.apiID ?? outer.apiId ?? '')
if ('data' in outer)
payload = outer.data
}
payload = unwrapVehiclePayload(payload)
if (!apiID && payload && typeof payload === 'object' && !Array.isArray(payload)) {
apiID = String(payload.apiID ?? payload.apiId ?? '')
if (apiID && 'data' in payload)
payload = unwrapVehiclePayload(payload.data)
}
return {
...item,
data: {
apiID: apiID || '',
data: payload,
},
}
}
export function normalizeVehicleReportData(items) {
if (!Array.isArray(items))
return []
return items.map(normalizeVehicleReportItem)
}