240 lines
4.9 KiB
Vue
240 lines
4.9 KiB
Vue
<script setup>
|
||
import { computed } from 'vue'
|
||
|
||
/** 车辆过户详版(与 H5 CQCXG4I1Z:data.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>
|