Files
property-resident-side/property-uniapp-project/pageSubPack/service-list/complaintsDetail.vue
2026-07-30 15:35:02 +08:00

265 lines
5.2 KiB
Vue

<template>
<view class="contentStyle">
<!-- <view class="status-bar"></view>
<uni-nav-bar title="投诉详情" backgroundColor="transparent" :border="false" left-icon="left" @clickLeft="goBack">
</uni-nav-bar> -->
<!-- 表单区域 -->
<scroll-view class="page" scroll-y>
<view class="page-container">
<!-- 投诉状态 -->
<view class="status-section">
<view class="section-title">
<text class="title-line"></text>
<text class="title-text">投诉状态</text>
</view>
<text class="status-value" :class="statusClass">{{ statusText }}</text>
</view>
<view class="completedDesc" v-if="detail.status === '2' && detail.handleContent">
{{ detail.handleContent }}
</view>
<!-- 投诉详情 -->
<view class="detail-section">
<view class="section-title">
<text class="title-line"></text>
<text class="title-text">投诉详情</text>
</view>
<view class="info-item">
<text class="info-label">投诉类型</text>
<text class="info-value">{{ detail.typeName}}</text>
</view>
<view class="info-item desc-item">
<text class="info-label">问题描述</text>
<text class="info-value desc-value">{{ detail.problemDes }}</text>
</view>
<view class="info-item">
<text class="info-label">投诉人姓名</text>
<text class="info-value">{{ detail.complaintName }}</text>
</view>
<view class="info-item">
<text class="info-label">手机号码</text>
<text class="info-value">{{ detail.phone}}</text>
</view>
<view class="photo-section" v-if="photoList.length > 0">
<text class="photo-label">问题照片</text>
<view class="photo-list">
<image v-for="(img, index) in photoList" :key="index" :src="img" mode="aspectFill"
class="photo-item" @click="previewImage(index)"></image>
</view>
</view>
</view>
</view>
</scroll-view>
</view>
</template>
<script setup>
import { ref, computed } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
import { getComplainDetail } from '../api/apiSub.js'
const id = ref('')
const detail = ref({})
const photoList = ref([])
// 状态映射
const statusMap = {
'0': { text: '待处理', class: 'pending' },
'1': { text: '处理中', class: 'processing' },
'2': { text: '已完成', class: 'completed' }
}
const statusText = computed(() => {
return statusMap[detail.value.status]?.text || '待处理'
})
const statusClass = computed(() => {
return statusMap[detail.value.status]?.class || 'pending'
})
onLoad((option) => {
id.value = option.id || ''
if (id.value) {
detailData()
}
})
// 获取详情
const detailData = async () => {
try {
const res = await getComplainDetail({ id: id.value })
if (res.code === 200 && res.data) {
detail.value = res.data
// 图片URL逗号分隔转数组
if (res.data.problemImageUrl) {
photoList.value = res.data.problemImageUrl.split(',').filter(url => url.trim())
} else {
photoList.value = []
}
} else {
uni.showToast({ title: res.msg || '获取失败', icon: 'none' })
}
} catch (err) {
uni.showToast({ title: typeof err === 'string' ? err.msg : '网络异常', icon: 'none' })
}
}
// 预览图片
const previewImage = (index) => {
uni.previewImage({
current: photoList.value[index],
urls: photoList.value
})
}
// 返回
const goBack = () => {
uni.navigateTo({
url: '/pageSubPack/service-list/complaintsSuggestionsIndex'
})
}
</script>
<style lang="scss">
page {
background: #fff;
}
</style>
<style scoped>
.contentStyle {
display: flex;
flex-direction: column;
height: 100vh;
}
.page {
flex: 1;
overflow-y: auto;
padding: 0px 40rpx;
box-sizing: border-box;
}
.page-container {}
.section-title {
display: flex;
align-items: center;
margin-bottom: 20rpx;
}
.title-line {
width: 8rpx;
height: 36rpx;
background-color: #007AFF;
margin-right: 12rpx;
border-radius: 4rpx;
}
.title-text {
font-size: 32rpx;
font-weight: bold;
color: #333333;
}
.status-section {
display: flex;
justify-content: space-between;
align-items: center;
padding-bottom: 20rpx;
border-bottom: 1rpx solid #eeeeee;
margin-bottom: 30rpx;
}
.completedDesc {
color: #2F77FD;
font-size: 28rpx;
margin-bottom: 30rpx;
}
.status-value {
font-size: 32rpx;
color: #007AFF;
font-weight: 500;
}
.info-item {
display: flex;
padding: 24rpx 0;
border-bottom: 1rpx solid #eeeeee;
align-items: flex-start;
}
.info-label {
width: 220rpx;
font-size: 28rpx;
color: #333333;
flex-shrink: 0;
line-height: 1.5;
}
.info-value {
flex: 1;
font-size: 28rpx;
color: #000;
line-height: 1.5;
}
.desc-item {
align-items: flex-start;
}
.desc-value {
white-space: pre-line;
word-break: break-all;
}
.photo-section {
padding: 24rpx 0;
}
.photo-label {
display: block;
font-size: 30rpx;
color: #666666;
margin-bottom: 20rpx;
}
.photo-list {
display: flex;
flex-wrap: wrap;
gap: 20rpx;
margin: 10rpx 0px 20rpx 0px;
}
.photo-item {
width: calc(33.333% - 14rpx);
height: 66px;
object-fit: cover;
}
.pending {
color: #2F77FD;
}
.processing {
color: #2F77FD;
}
.completed {
color: #999999;
}
.status-bar {
width: 100vw;
height: 46px;
}
</style>