Files
emsapp/pages/ticket/list.vue
2026-02-08 21:51:10 +08:00

245 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.

<template>
<view class="container">
<view class="status-bar"></view>
<view class="page-title">工单</view>
<view class="btn-list">
<uni-row>
<uni-col :span="12">
<button type="default" class="btns" :class="{'active-btn' : active === 'undone'}"
@click="changeTab('undone')">待处理</button>
</uni-col>
<uni-col :span="12">
<button type="default" class="btns" :class="{'active-btn' : active === 'done'}"
@click="changeTab('done')">已处理</button>
</uni-col>
</uni-row>
</view>
<view v-if="list.length===0" class="no-data">暂无数据</view>
<view class="content scroll-y" v-else>
<view class="item-list" v-for="item in list" :key="item.ticketNo+'ticket'" @click="toDetail(item.id)">
<view class="item-title" :class="item.status === 3 ? 'done' : item.status === 2 ? 'doing' : 'undone'">
工单号{{item.ticketNo}}
<view class="item-status">{{ticketStatusOptions[item.status]}}</view>
</view>
<view class="item-content">
<view class="item-info">工单标题:
<text class="info-value">{{item.title}}</text>
</view>
<view class="item-info">问题描述:
<text class="info-value">{{item.content}}</text>
</view>
<view class="item-info">预期完成时间:
<text class="info-value">{{item.expectedCompleteTime || '-'}}</text>
</view>
<view class="item-info">处理人:
<text class="info-value">
{{item.workName || '-'}}
</text>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import {
mapState
} from 'vuex'
import {
listTicket
} from 'api/ems/ticket'
export default {
computed: {
...mapState({
ticketStatusOptions: (state) => state.ems.ticketStatusOptions
})
},
data() {
return {
active: 'undone',
total: 0,
list: [],
pageNum: 1,
pageSize: 20
}
},
methods: {
changeTab(active) {
if (active === this.active) return
this.active = active
this.reset()
this.init()
},
init() {
//1: '待处理', 2: '处理中', 3: '已处理'
let url = `/ticket/list?pageNum=${this.pageNum}&pageSize=${this.pageSize}`
if (this.active === 'done') {
url += `&status=3`
} else {
url += `&status=1&status=2`
}
uni.showLoading()
return listTicket(url).then(response => {
const data = JSON.parse(JSON.stringify(response?.rows || []))
this.list = this.list.concat(data)
this.total = response?.total || 0
}).finally(() => {
uni.hideLoading()
})
},
toDetail(id) {
this.$tab.navigateTo(`/pages/ticket/index?id=${id}`)
},
reset() {
this.list = []
this.total = 0
this.pageNum = 1
}
},
onReachBottom() {
if (this.list.length >= this.total) {
return console.log('数据已经加载完成')
}
this.pageNum += 1;
this.init().catch(() => {
this.pageNum -= 1
})
},
onShow() {
this.reset()
this.init()
}
}
</script>
<style scoped lang="scss">
.container {
position: relative;
background-color: #f5f6f7;
.no-data {
padding-top: 180rpx;
}
}
uni-button:after {
border: none;
border-radius: 0;
}
.btn-list {
position: fixed;
top: calc(var(--status-bar-height) + 56rpx);
left: 0;
width: 100%;
z-index: 2;
padding: 20rpx 30rpx;
background: #ffffff;
.btns {
border: none;
border-radius: 40rpx;
width: 90%;
font-size: 26rpx;
line-height: 64rpx;
color: #19242d;
background: #d9e7fc;
&.active-btn {
background: #4c7af3;
color: #fff;
}
}
}
.content {
padding: 120px 30rpx 120rpx 30rpx;
z-index: 1;
}
.page-title {
position: fixed;
top: var(--status-bar-height);
left: 0;
width: 100%;
z-index: 3;
padding: 16rpx 30rpx 10rpx;
font-size: 32rpx;
font-weight: 700;
color: #19242d;
background: #ffffff;
text-align: center;
}
// 工单列表
.item-list {
color: #4b4951;
border-radius: 14rpx;
box-shadow: 0 0 20rpx rgba(0, 0, 0, .1), 0 0 0 rgba(0, 0, 0, .5);
font-size: 26rpx;
line-height: 40rpx;
margin-bottom: 30rpx;
border: 1px solid #eee;
background: #ffffff;
// 标题
.item-title {
border-radius: 14rpx 14rpx 0 0;
border-bottom: 1px solid #eee;
padding: 20rpx 30rpx;
font-weight: 700;
position: relative;
.item-status {
position: absolute;
right: 0;
top: 0;
padding: 2rpx 20rpx;
color: #ffffff;
font-size: 22rpx;
}
&.done {
.item-status {
background-color: #30be95;
}
}
&.doing {
.item-status {
background-color: #3c68e7;
}
}
&.undone {
.item-status {
background-color: #ed7876;
}
}
}
// 内容
.item-content {
padding: 20rpx 30rpx;
font-size: 24rpx;
.item-info {
margin-bottom: 20rpx;
.info-value {
padding-left: 10rpx;
}
}
}
.item-content .item-info:last-child {
margin-bottom: 0;
}
}
.content .item-list:last-child {
margin-bottom: 0;
}
</style>