| <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 @click.stop="copyID(item.id)"> | |
|             <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.showpiece.position }}</text> | |
|             </view> | |
|           </view> | |
|           <view class="detail-row"> | |
|             <view class="detail-item"> | |
|               <text class="detail-label">报修人</text> | |
|               <text class="detail-value">{{ item.malfunctionName_dictText }}</text> | |
|             </view> | |
|             <view class="detail-item"> | |
|               <text class="detail-label">报修日期</text> | |
|               <text class="detail-value">{{ item.malfunctionDate }}</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: { | |
|     copyID(id) { | |
|       uni.setClipboardData({ | |
|         data: id, | |
|         success: () => { | |
|           uni.showToast({ | |
|             title: '复制成功', | |
|             icon: 'success' | |
|           }) | |
|         } | |
|       }) | |
|     }, | |
|     mixinSetParams(){ | |
|       return { | |
|         urgency: this.urgency?.value || '', | |
|         status: this.status?.value || '' | |
|       } | |
|     }, | |
|     navigateToDetail(item) { | |
|       uni.navigateTo({ | |
|         url: '/subPages/repair/maintainSubmit?id=' + item.id + '&showpieceId=' + item.showpieceId | |
|       }) | |
|     }, | |
|     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> |