2025-07-29 23:05:58 +08:00
|
|
|
|
<template>
|
|
|
|
|
|
<view class="container">
|
|
|
|
|
|
<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>
|
|
|
|
|
|
<scroll-view class="scroll-y" :scroll-y="true" @scrolltolower="lower" scrolltoupper="upper">
|
|
|
|
|
|
<view class="content">
|
|
|
|
|
|
<view class="item-list" v-for="item in list" :key="item.ticketNo+'ticket'" @click="toDetail(item.id)">
|
|
|
|
|
|
<view class="item-title" :class="item.status === 1 ? 'done' : 'undone'">工单号:{{item.ticketNo}}</view>
|
|
|
|
|
|
<view class="item-content">
|
|
|
|
|
|
<view class="item-info">工单标题:{{item.title}}</view>
|
|
|
|
|
|
<view class="item-info">问题描述:{{item.content}}</view>
|
|
|
|
|
|
<view class="item-info">工单状态:{{ticketStatusOptions[item.status]}}</view>
|
|
|
|
|
|
<view class="item-info">预期完成时间:{{item.expectedCompleteTime || '-'}}</view>
|
|
|
|
|
|
<view class="item-info">处理人:{{item.workName || '-'}}</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view v-if="list.length===0" class="no-data">暂无数据</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</scroll-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: 10
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
methods: {
|
|
|
|
|
|
changeTab(active) {
|
|
|
|
|
|
if (active === this.active) return
|
|
|
|
|
|
this.active = active
|
|
|
|
|
|
this.reset()
|
|
|
|
|
|
this.init()
|
|
|
|
|
|
},
|
|
|
|
|
|
lower() {
|
|
|
|
|
|
if (this.list.length >= this.total) {
|
|
|
|
|
|
return console.log('数据已经加载完成')
|
|
|
|
|
|
}
|
|
|
|
|
|
this.pageNum += 1;
|
|
|
|
|
|
this.init().catch(() => {
|
|
|
|
|
|
this.pageNum -= 1
|
|
|
|
|
|
})
|
|
|
|
|
|
},
|
|
|
|
|
|
init() {
|
|
|
|
|
|
//0:'待处理', 1:'已处理', 2:'处理中'
|
|
|
|
|
|
let url = `/ticket/list?pageNum=${this.pageNum}&pageSize=${this.pageSize}`
|
|
|
|
|
|
if (this.active === 'done') {
|
|
|
|
|
|
url += `&status=1`
|
|
|
|
|
|
} else {
|
|
|
|
|
|
url += `&status=0&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
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
onShow() {
|
|
|
|
|
|
this.reset()
|
|
|
|
|
|
this.init()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
|
|
|
.container {
|
|
|
|
|
|
position: relative;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uni-button:after {
|
|
|
|
|
|
border: none;
|
|
|
|
|
|
border-radius: 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.btn-list {
|
|
|
|
|
|
position: fixed;
|
|
|
|
|
|
top: 0;
|
|
|
|
|
|
left: 0;
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
z-index: 2;
|
|
|
|
|
|
|
|
|
|
|
|
.btns {
|
|
|
|
|
|
border-radius: 0;
|
|
|
|
|
|
border: none;
|
|
|
|
|
|
border-bottom: 1px solid #eee;
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
text-align: center;
|
|
|
|
|
|
font-size: 16px;
|
|
|
|
|
|
line-height: 50px;
|
|
|
|
|
|
background-color: #fff;
|
|
|
|
|
|
|
|
|
|
|
|
&.active-btn {
|
|
|
|
|
|
background-color: #3a98ff;
|
|
|
|
|
|
color: #fff;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.scroll-y {
|
|
|
|
|
|
height: calc(100vh - var(--window-bottom) - var(--window-top));
|
|
|
|
|
|
z-index: 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.content {
|
|
|
|
|
|
background-color: #ffffff;
|
|
|
|
|
|
padding: 70px 20px 60px 20px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.item-list {
|
|
|
|
|
|
border-radius: 7px;
|
|
|
|
|
|
box-shadow: 0 0 10px rgba(0, 0, 0, .1), 0 0 0 rgba(0, 0, 0, .5);
|
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
|
line-height: 24px;
|
|
|
|
|
|
margin-bottom: 20px;
|
|
|
|
|
|
border: 1px solid #eee;
|
|
|
|
|
|
|
|
|
|
|
|
.item-title {
|
|
|
|
|
|
border-radius: 7px 7px 0 0;
|
|
|
|
|
|
font-size: 16px;
|
|
|
|
|
|
border-bottom: 1px solid #eee;
|
|
|
|
|
|
padding: 10px 15px;
|
|
|
|
|
|
background-color: #FC6B69;
|
|
|
|
|
|
color: #fff;
|
|
|
|
|
|
|
|
|
|
|
|
&.done {
|
|
|
|
|
|
background-color: #05AEA3;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.item-content {
|
|
|
|
|
|
padding: 15px 15px;
|
|
|
|
|
|
|
|
|
|
|
|
.item-info {
|
|
|
|
|
|
margin-bottom: 20px;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.item-content .item-info:last-child {
|
|
|
|
|
|
margin-bottom: 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.content .item-list:last-child {
|
|
|
|
|
|
margin-bottom: 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
</style>
|