Files
qncV4uni-app/src/components/report/blocks/VehicleBlockQCXG4I1Z.vue
2026-05-16 15:47:07 +08:00

240 lines
4.9 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<script setup>
import { computed } from 'vue'
/** 车辆过户详版(与 H5 CQCXG4I1Zdata.retdata[] */
const props = defineProps({
blockTitle: { type: String, default: '' },
apiId: { type: String, default: '' },
payload: { default: null },
queryParams: { type: Object, default: () => ({}) },
})
const rawList = computed(() => {
const p = props.payload
if (!p || typeof p !== 'object')
return []
return Array.isArray(p.retdata) ? p.retdata : []
})
const transfers = computed(() =>
rawList.value.map((item) => {
const changeMonth = item.changeMonth
let changeMonthFormatted = '-'
if (changeMonth === '近一年内过户') {
changeMonthFormatted = '近一年内过户'
}
else if (typeof changeMonth === 'string' && changeMonth.length === 6) {
const y = changeMonth.slice(0, 4)
const m = changeMonth.slice(4, 6)
changeMonthFormatted = `${y}${m}`
}
else if (changeMonth) {
changeMonthFormatted = String(changeMonth)
}
let intervalText = '-'
if (item.transYear || item.transMonth) {
const years = item.transYear ? `${item.transYear}` : ''
const months = item.transMonth ? `${item.transMonth}个月` : ''
intervalText = `${years}${months}` || '-'
}
return {
...item,
changeMonthFormatted,
intervalText,
}
}),
)
const totalTimes = computed(() => {
if (!transfers.value.length)
return ''
const last = transfers.value[transfers.value.length - 1]
return last.transTimeSum ?? ''
})
</script>
<template>
<view class="root">
<view class="head">
<text class="title">{{ props.blockTitle || '车辆过户详版查询' }}</text>
<text class="sub">按时间轴展示过户与车牌变更</text>
<view v-if="totalTimes" class="tag">
<text class="tag-l">总过户次数</text>
<text class="tag-v">{{ totalTimes }} </text>
</view>
</view>
<view v-if="transfers.length" class="list">
<view v-for="(item, index) in transfers" :key="index" class="item">
<view class="item-h">
<text class="date">{{ item.changeMonthFormatted }}</text>
<text class="cnt"> {{ item.transTimeSum }} 次过户</text>
</view>
<view class="plates">
<view class="plate">
<text class="lab">过户前车牌</text>
<text class="num">{{ item.oldCp || '未知' }}</text>
<text v-if="item.cityBefore" class="city">所在城市{{ item.cityBefore }}</text>
</view>
<text class="arrow"></text>
<view class="plate">
<text class="lab">过户后车牌</text>
<text class="num">{{ item.newCp || '未知' }}</text>
<text v-if="item.cityAfter" class="city">所在城市{{ item.cityAfter }}</text>
</view>
</view>
<text class="gap">距上次过户{{ item.intervalText }}</text>
<text class="vin">VIN{{ item.vin || '-' }}</text>
</view>
</view>
<view v-else class="empty">
<text class="t">暂无过户明细</text>
</view>
</view>
</template>
<style scoped lang="scss">
.root {
width: 100%;
}
.head {
background: linear-gradient(135deg, #eef2ff 0%, #e0e7ff 100%);
border-radius: 16rpx;
padding: 20rpx;
margin-bottom: 16rpx;
}
.title {
display: block;
font-size: 30rpx;
font-weight: 700;
color: #312e81;
}
.sub {
display: block;
margin-top: 8rpx;
font-size: 24rpx;
color: #4338ca;
}
.tag {
margin-top: 12rpx;
background: rgba(255, 255, 255, 0.9);
border-radius: 12rpx;
padding: 12rpx 16rpx;
display: inline-flex;
flex-direction: column;
}
.tag-l {
font-size: 22rpx;
color: #86909c;
}
.tag-v {
font-size: 30rpx;
font-weight: 700;
color: #312e81;
}
.list {
display: flex;
flex-direction: column;
gap: 16rpx;
}
.item {
background: #f7f8fa;
border-radius: 16rpx;
padding: 20rpx;
border: 1rpx solid #e5e6eb;
}
.item-h {
display: flex;
justify-content: space-between;
margin-bottom: 12rpx;
}
.date {
font-size: 28rpx;
font-weight: 700;
color: #1d2129;
}
.cnt {
font-size: 24rpx;
color: #86909c;
}
.plates {
display: flex;
align-items: stretch;
gap: 12rpx;
}
.plate {
flex: 1;
background: #fff;
border-radius: 12rpx;
padding: 12rpx;
border: 1rpx solid #e5e6eb;
}
.lab {
display: block;
font-size: 22rpx;
color: #86909c;
}
.num {
display: block;
margin-top: 6rpx;
font-size: 28rpx;
font-weight: 700;
color: #1d2129;
}
.city {
display: block;
margin-top: 6rpx;
font-size: 22rpx;
color: #4e5969;
}
.arrow {
align-self: center;
font-size: 28rpx;
color: #1768ff;
}
.gap {
display: block;
margin-top: 12rpx;
font-size: 24rpx;
color: #4e5969;
}
.vin {
display: block;
margin-top: 8rpx;
font-size: 24rpx;
color: #1d2129;
font-family: ui-monospace, monospace;
}
.empty {
padding: 40rpx;
text-align: center;
}
.t {
font-size: 26rpx;
color: #86909c;
}
</style>