<template>
|
|
<view class="maintain-container">
|
|
<!-- 顶部选择器区域 -->
|
|
<view class="selector-section">
|
|
<!-- 紧急程度选择器 -->
|
|
<view class="selector-item" @click="openUrgencyPicker">
|
|
<text class="selector-label" :class="{ active: urgency }">{{ urgency.label || '紧急状态' }}</text>
|
|
<uv-icon name="arrow-down-fill" size="14" :color="urgency ? '#C70019' : '#000'"></uv-icon>
|
|
</view>
|
|
|
|
<!-- 维修状态选择器 -->
|
|
<view class="selector-item" @click="openStatusPicker">
|
|
<text class="selector-label" :class="{ active: status }">{{ status.label || '维修状态' }}</text>
|
|
<uv-icon name="arrow-down-fill" size="14" :color="status ? '#C70019' : '#000'"></uv-icon>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 产品列表 -->
|
|
<view class="product-list">
|
|
<view class="product-item" v-for="(item, index) in list" :key="index" @click="navigateToDetail(item)">
|
|
<!-- 产品ID和状态标签 -->
|
|
<view class="item-header">
|
|
<view >
|
|
<text class="item-id">{{ item.id }}</text>
|
|
<img src="@/static/copy.png" alt="复制图标" class="item-icon">
|
|
</view>
|
|
<view class="status-tag" :class="[getStatusClass(item.status)]">
|
|
<text class="status-text">{{ item.status_dictText }}</text>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 中间那条下划线 -->
|
|
<view class="item-border" />
|
|
|
|
<!-- 产品标题 -->
|
|
<view class="item-title">
|
|
<text class="title-text">{{ item.showpieceId_dictText }}</text>
|
|
</view>
|
|
|
|
<!-- 产品详情 -->
|
|
<view class="item-details">
|
|
<view class="detail-row">
|
|
<view class="detail-item">
|
|
<text class="detail-label">展品编号</text>
|
|
<text class="detail-value">{{ item.showpieceId }}</text>
|
|
</view>
|
|
<view class="detail-item">
|
|
<text class="detail-label">紧急程度</text>
|
|
<text class="detail-value">{{ item.urgency_dictText }}</text>
|
|
</view>
|
|
</view>
|
|
<view class="detail-row">
|
|
<view class="detail-item">
|
|
<text class="detail-label">展品位置</text>
|
|
<text class="detail-value">{{ item.position }}</text>
|
|
</view>
|
|
</view>
|
|
<view class="detail-row">
|
|
<view class="detail-item">
|
|
<text class="detail-label">报修人</text>
|
|
<text class="detail-value">{{ item.reporterName }}</text>
|
|
</view>
|
|
<view class="detail-item">
|
|
<text class="detail-label">报修日期</text>
|
|
<text class="detail-value">{{ item.firstDate }}</text>
|
|
</view>
|
|
</view>
|
|
<view class="detail-row">
|
|
<view class="detail-item full-width">
|
|
<text class="detail-label">故障描述</text>
|
|
<text class="detail-value">{{ item.malfunctionDesc }}</text>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 操作按钮 -->
|
|
<view class="item-actions">
|
|
<button class="item-actions-button">立即维修</button>
|
|
</view>
|
|
</view>
|
|
<!-- 空状态 -->
|
|
</view>
|
|
<uv-empty v-if="!list.length" icon="/static/暂无搜索结果.png" />
|
|
|
|
<!-- 紧急程度选择器 -->
|
|
<uv-picker
|
|
ref="urgencyPicker"
|
|
v-model="urgencyShow"
|
|
:columns="urgencyColumns"
|
|
keyName="label"
|
|
mode="selector"
|
|
@confirm="onUrgencyConfirm"
|
|
confirmColor="#C70019"
|
|
></uv-picker>
|
|
|
|
<!-- 维修状态选择器 -->
|
|
<uv-picker
|
|
ref="statusPicker"
|
|
v-model="statusShow"
|
|
:columns="statusColumns"
|
|
keyName="label"
|
|
mode="selector"
|
|
@confirm="onStatusConfirm"
|
|
confirmColor="#C70019"
|
|
></uv-picker>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import ListMixin from '@/mixins/list'
|
|
|
|
export default {
|
|
mixins: [ListMixin],
|
|
data() {
|
|
return {
|
|
urgency: null,
|
|
status: null,
|
|
urgencyShow: false,
|
|
statusShow: false,
|
|
mixinListApi: 'exhibit.queryMalfunctionList',
|
|
urgencyColumns: [
|
|
[
|
|
{
|
|
label: '全部',
|
|
value: ''
|
|
},
|
|
{
|
|
label: '一般',
|
|
value: '0'
|
|
},
|
|
{
|
|
label: '紧急',
|
|
value: '1'
|
|
},
|
|
]
|
|
],
|
|
statusColumns: [
|
|
[
|
|
{
|
|
label: '全部',
|
|
value: ''
|
|
},
|
|
{
|
|
label: '故障中',
|
|
value: '0'
|
|
},
|
|
{
|
|
label: '维修中',
|
|
value: '1'
|
|
},
|
|
{
|
|
label: '已解决',
|
|
value: '2'
|
|
}
|
|
]
|
|
],
|
|
}
|
|
},
|
|
methods: {
|
|
mixinSetParams(){
|
|
return {
|
|
urgency: this.urgency?.value || '',
|
|
status: this.status?.value || ''
|
|
}
|
|
},
|
|
navigateToDetail(item) {
|
|
uni.navigateTo({
|
|
url: '/subPages/repair/maintainSubmit?id=' + item.id
|
|
})
|
|
},
|
|
openUrgencyPicker() {
|
|
this.$refs.urgencyPicker.open()
|
|
},
|
|
openStatusPicker() {
|
|
this.$refs.statusPicker.open()
|
|
},
|
|
onUrgencyConfirm(e) {
|
|
this.urgency = e.value[0]
|
|
console.log('选择紧急程度:', e)
|
|
this.initPage()
|
|
this.getList(true)
|
|
// TODO: 根据紧急程度筛选
|
|
},
|
|
onStatusConfirm(e) {
|
|
this.status = e.value[0]
|
|
console.log('选择维修状态:', e)
|
|
this.initPage()
|
|
this.getList(true)
|
|
// TODO: 根据状态筛选
|
|
},
|
|
getStatusClass(status) {
|
|
switch(status) {
|
|
case '维修中':
|
|
return 'status-repairing'
|
|
case '故障中':
|
|
return 'status-fault'
|
|
case '已解决':
|
|
return 'status-resolved'
|
|
default:
|
|
return ''
|
|
}
|
|
},
|
|
handleRepair(item) {
|
|
console.log('立即维修:', item)
|
|
// TODO: 处理维修逻辑
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.maintain-container {
|
|
background-color: #fff;
|
|
min-height: 100vh;
|
|
}
|
|
|
|
.selector-section {
|
|
display: flex;
|
|
padding: 34rpx 41rpx;
|
|
// background-color: #fff;
|
|
gap: 58rpx;
|
|
|
|
.selector-item {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 9rpx;
|
|
cursor: pointer;
|
|
|
|
.selector-label {
|
|
font-size: 28rpx;
|
|
color: #000;
|
|
|
|
&.active {
|
|
color: $primary-color;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.product-list {
|
|
padding: 20rpx 32rpx;
|
|
|
|
.product-item {
|
|
background-color: #fff;
|
|
border-radius: 15rpx;
|
|
padding: 30rpx 30rpx 20rpx;
|
|
margin-bottom: 24rpx;
|
|
box-shadow: 0rpx 3rpx 6rpx 0rpx rgba(0,0,0,0.16);
|
|
|
|
.item-header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
margin-bottom: 13.5rpx;
|
|
|
|
.item-icon {
|
|
width: 25.5rpx;
|
|
height: 25.5rpx;
|
|
}
|
|
|
|
.item-id {
|
|
font-size: 28rpx;
|
|
margin-right: 20rpx;
|
|
color: $secondary-text-color;
|
|
}
|
|
|
|
|
|
.status-tag {
|
|
border-radius: 15rpx;
|
|
width: 135rpx;
|
|
height: 57rpx;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
.status-text {
|
|
font-size: 28rpx;
|
|
}
|
|
|
|
&.status-repairing {
|
|
background-color: #ffffca;
|
|
color: #CE7C62;
|
|
}
|
|
|
|
&.status-fault {
|
|
background-color: #fccec7;
|
|
color: #b82222;
|
|
}
|
|
|
|
&.status-resolved {
|
|
background-color: #cfffca;
|
|
color: #528828;
|
|
}
|
|
}
|
|
}
|
|
|
|
.item-border {
|
|
border-bottom: 1rpx solid $secondary-text-color;
|
|
// background-color: #E5E5E5;
|
|
margin-bottom: 26.5rpx;
|
|
opacity: 0.22;
|
|
}
|
|
|
|
.item-title {
|
|
margin-bottom: 37rpx;
|
|
|
|
.title-text {
|
|
font-size: 30rpx;
|
|
color: $primary-text-color;
|
|
font-weight: bold;
|
|
}
|
|
}
|
|
|
|
.item-details {
|
|
margin-bottom: 52rpx;
|
|
|
|
.detail-row {
|
|
display: flex;
|
|
margin-bottom: 25rpx;
|
|
|
|
&:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.detail-item {
|
|
flex: 1;
|
|
display: flex;
|
|
align-items: flex-start;
|
|
margin-right: 35rpx;
|
|
|
|
&.full-width {
|
|
flex: 1 1 100%;
|
|
margin-right: 0;
|
|
}
|
|
|
|
&:last-child {
|
|
margin-right: 0;
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.detail-label {
|
|
font-size: 22rpx;
|
|
color: $secondary-text-color;
|
|
margin-right: 19rpx;
|
|
flex-shrink: 0;
|
|
min-width: 95rpx;
|
|
}
|
|
|
|
.detail-value {
|
|
font-size: 22rpx;
|
|
color: $primary-text-color;
|
|
flex: 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.item-actions {
|
|
display: flex;
|
|
justify-content: center;
|
|
.item-actions-button {
|
|
width: 378rpx;
|
|
height: 78rpx;
|
|
background-color: $primary-color;
|
|
color: #fff;
|
|
font-size: 28rpx;
|
|
border-radius: 39rpx;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style>
|