96 lines
3.0 KiB
Vue
96 lines
3.0 KiB
Vue
|
|
<template>
|
|||
|
|
<view class="detail-page">
|
|||
|
|
<uni-section class="mb-10" title="打卡详情" type="line"></uni-section>
|
|||
|
|
|
|||
|
|
<uni-card isShadow>
|
|||
|
|
<view class="detail-row">
|
|||
|
|
<text class="label">巡检点:</text>
|
|||
|
|
<text class="value">{{ detail.inspectionPoint || '-' }}</text>
|
|||
|
|
</view>
|
|||
|
|
<view class="detail-row">
|
|||
|
|
<text class="label">巡检人:</text>
|
|||
|
|
<text class="value">{{ detail.inspectorUser || detail.inspectorName || '-' }}</text>
|
|||
|
|
</view>
|
|||
|
|
<view class="detail-row">
|
|||
|
|
<text class="label">打卡时间:</text>
|
|||
|
|
<text class="value">{{ formatDate(detail.inspectionTime) }}</text>
|
|||
|
|
</view>
|
|||
|
|
<view class="detail-row" v-if="detail.remark">
|
|||
|
|
<text class="label">备注:</text>
|
|||
|
|
<text class="value">{{ detail.remark }}</text>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view v-if="images.length" class="img-group">
|
|||
|
|
<image v-for="(img, idx) in images" :key="idx" :src="imageUrl(img)" mode="aspectFill" class="img" @click="previewImage(idx)" />
|
|||
|
|
</view>
|
|||
|
|
</uni-card>
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
import { getRecord } from '@/api/inspection/record.js'
|
|||
|
|
import config from '@/config'
|
|||
|
|
export default {
|
|||
|
|
data() {
|
|||
|
|
return {
|
|||
|
|
id: null,
|
|||
|
|
detail: {},
|
|||
|
|
images: []
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
onLoad(query) {
|
|||
|
|
this.id = query.id
|
|||
|
|
this.fetchDetail()
|
|||
|
|
},
|
|||
|
|
methods: {
|
|||
|
|
async fetchDetail() {
|
|||
|
|
if (!this.id) {
|
|||
|
|
uni.showToast({ title: '缺少记录ID', icon: 'none' })
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
try {
|
|||
|
|
const res = await getRecord(this.id)
|
|||
|
|
this.detail = (res && res.data) ? res.data : {}
|
|||
|
|
this.images = this.resolveImages(this.detail.inspectionImg || this.detail.clockInImg || this.detail.signImg)
|
|||
|
|
} catch (e) {
|
|||
|
|
console.error('fetch record detail error', e)
|
|||
|
|
uni.showToast({ title: '加载失败', icon: 'none' })
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
resolveImages(imgs) {
|
|||
|
|
if (!imgs) return []
|
|||
|
|
if (Array.isArray(imgs)) return imgs
|
|||
|
|
if (typeof imgs === 'string') return imgs.split(',').filter(Boolean)
|
|||
|
|
return []
|
|||
|
|
},
|
|||
|
|
imageUrl(path) {
|
|||
|
|
if (!path) return ''
|
|||
|
|
if (/^https?:\/\//.test(path)) return path
|
|||
|
|
return `${config.baseUrl}${path.startsWith('/') ? path : '/' + path}`
|
|||
|
|
},
|
|||
|
|
previewImage(index = 0) {
|
|||
|
|
if (!this.images.length) return
|
|||
|
|
uni.previewImage({
|
|||
|
|
current: index,
|
|||
|
|
urls: this.images.map(this.imageUrl)
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
formatDate(dateStr) {
|
|||
|
|
if (!dateStr) return '-'
|
|||
|
|
const d = new Date(dateStr)
|
|||
|
|
if (isNaN(d.getTime())) return dateStr
|
|||
|
|
const pad = n => (n < 10 ? ('0' + n) : n)
|
|||
|
|
return `${d.getFullYear()}-${pad(d.getMonth()+1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style scoped>
|
|||
|
|
.detail-page { padding: 10px; }
|
|||
|
|
.detail-row { display: flex; margin-bottom: 8px; }
|
|||
|
|
.label { color: #666; width: 80px; }
|
|||
|
|
.value { color: #333; }
|
|||
|
|
.img-group { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 12px; }
|
|||
|
|
.img { width: 100px; height: 100px; border-radius: 6px; background: #f5f5f5; }
|
|||
|
|
</style>
|