工作端小程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

291 lines
7.0 KiB

<!-- 报事记录 -->
<template>
<scroll-view
class="content"
scroll-y="true"
refresher-enabled
:refresher-triggered="isRefreshing"
@refresherrefresh="refreshData"
@scrolltolower="loadMore"
>
<view class="conItem" v-for="(item, index) in repairList" :key="index">
<view class="conItemTitle">
<image :src="srcUrl(item.feedbackType)" class="titleImg"></image>
<text class="titleName">{{ feedbackTypeText(item.feedbackType) }}</text>
</view>
<view class="conItemCon">
<view class="repairInfo">
<view class="infoRow">
<text class="label">问题描述</text>
<text class="value">{{ item.faultDescribe }}</text>
</view>
<view class="infoRow">
<text class="label">图片/视频</text>
<view
class="image-preview-item"
v-for="(u, t) in item.images"
:key="t"
@click="previewImage(item.images, t)"
>
<image
:src="u.url"
class="problemImage"
mode="aspectFill"
></image>
</view>
</view>
<view class="infoRow">
<text class="label">报事人</text>
<text class="value">{{ item.graduateName }}</text>
</view>
<view class="infoRow">
<text class="label">报事人电话</text>
<text class="value">{{ item.telephone }}</text>
</view>
<view class="infoRow">
<text class="label">上报时间</text>
<text class="value">{{ item.createTime }}</text>
</view>
</view>
<view class="actionButtons">
<button class="btn process" @click="handleProcess(item)">处理</button>
<!-- <button class="btn dispatch" @click="handleDispatch(item)">
派单
</button> -->
</view>
</view>
</view>
<view style="text-align: center" v-if="isLoading">加载中...</view>
<view v-else-if="repairList.length <= 0" class="no-data"> 暂无数据~ </view>
</scroll-view>
</template>
<script>
import { listReport } from "@/pages/api";
export default {
data() {
return {
isRefreshing: false,
feedbackTypeOptions: [
{ value: 1, label: "安全问题", url: "/static/img/维修列表里.png" },
{ value: 2, label: "卫生问题", url: "/static/img/列表里图标.png" },
{ value: 3, label: "服务问题", url: "/static/img/问题投诉列表里.png" },
{ value: 4, label: "噪音问题", url: "/static/img/列表里图标.png" },
{ value: 5, label: "体验问题", url: "/static/img/列表里图标.png" },
{ value: 6, label: "其他", url: "/static/img/问题投诉列表里.png" },
],
noMore: false,
isLoading: false,
repairList: [],
form: {
pageNum: 1,
pageSize: 10,
},
total: "",
};
},
onLoad() {
this.getList();
},
computed: {
processStatusText() {
return (state) => {
switch (state) {
case 0:
return "待处理";
case 1:
return "处理中";
case 2:
return "已处理";
case 3:
return "不予处理";
default:
return "";
}
};
},
feedbackTypeText() {
return (type) => {
const feedbackTypeObj = this.feedbackTypeOptions.find(
(item) => item.value === type
);
return feedbackTypeObj ? feedbackTypeObj.label : "";
};
},
srcUrl() {
return (type) => {
const feedbackTypeObj = this.feedbackTypeOptions.find(
(item) => item.value === type
);
return feedbackTypeObj ? feedbackTypeObj.url : "";
};
},
},
methods: {
// 报事列表
async getList() {
const res = await listReport(this.form);
if (res.code === 200) {
this.repairList = res.rows;
this.total = res.total;
if (res.total <= this.form.pageSize * this.form.pageNum) {
this.noMore = true;
}
this.isLoading = false;
this.isRefreshing = false;
if (this.form.pageNum == 1) {
this.repairList = res.rows;
} else {
this.repairList = [...this.repairList, ...res.rows];
}
}
},
refreshData() {
this.isRefreshing = true;
this.noMore = false; // 新增
this.repairList = [];
this.form.pageNum = 1; // 重置页码到第一页
this.getList();
},
// 加载更多数据(分页)
loadMore() {
if (this.isLoading || this.noMore) return; // 新增 noMore 判断
this.isLoading = true;
this.form.pageNum++;
this.getList();
},
previewImage(item, index) {
uni.previewImage({
current: index,
urls: item.map((item) => item.url),
success: (res) => {
console.log("预览成功");
},
fail: (err) => {
console.log("预览失败", err);
},
});
},
handleProcess(item) {
uni.navigateTo({
url: `/pagesA/bsPage/bsHandle?id=${item.id}`,
});
},
handleDispatch(item) {
console.log("派单", item);
// 派单逻辑
},
},
};
</script>
<style lang="scss" scoped>
.content {
width: 100%;
height: 100vh;
background-color: rgba(248, 248, 248, 1);
padding: 20rpx;
box-sizing: border-box;
}
.conItem {
width: 100%;
border-radius: 10rpx;
background-color: rgba(255, 255, 255, 1);
margin-bottom: 20rpx;
padding: 20rpx;
box-sizing: border-box;
}
.conItemTitle {
display: flex;
width: 100%;
margin-bottom: 20rpx;
align-items: center;
}
.titleImg {
width: 38rpx;
height: 38rpx;
}
.titleName {
color: rgba(0, 0, 0, 1);
font-size: 28rpx;
text-align: left;
margin-left: 10rpx;
font-weight: bold;
}
.conItemCon {
width: 100%;
}
.repairInfo {
width: 100%;
background-color: rgba(249, 249, 249, 1);
padding: 20rpx;
box-sizing: border-box;
border-radius: 10rpx;
}
.infoRow {
display: flex;
align-items: flex-start;
margin-bottom: 15rpx;
line-height: 1.5;
flex-wrap: wrap;
}
.label {
color: #a9afba;
font-size: 28rpx;
min-width: 156rpx;
flex-shrink: 0;
text-align: right;
}
.value {
color: rgba(0, 0, 0, 1);
font-size: 26rpx;
flex: 1;
}
.problemImage {
width: 120rpx;
height: 120rpx;
border-radius: 8rpx;
margin-top: 5rpx;
margin-right: 10rpx;
margin-bottom: 10rpx;
}
.actionButtons {
display: flex;
justify-content: flex-end;
align-items: center;
margin-top: 20rpx;
margin-left: auto;
gap: 20rpx;
width: fit-content;
}
.btn {
width: 130rpx;
height: 52rpx;
line-height: 46rpx;
border-radius: 52rpx;
background-color: rgba(255, 255, 255, 1);
color: rgba(8, 179, 179, 1);
font-size: 28rpx;
text-align: center;
font-family: AlibabaPuHui-regular;
border: 2rpx solid rgba(8, 179, 179, 1);
}
.dispatch {
border-color: #ff8c00;
color: #ff8c00;
}
</style>