repairWorkOrder-detail.vue 9.27 KB
<template>
	<view class="device-detail-page">
		<!-- 公共组件-每个页面必须引入 -->
		<public-module></public-module>
		<u-sticky :bgColor="bgColor">
			<u-tabs :list="list.map(item=>({...item,name:$t(item.name)}))" :current="currentTab" :lineWidth="30" @click=" handleTabClick " :activeStyle="{activeColor}"
				:inactiveStyle="inActiveColor" :scrollable="isScrollable" itemStyle="padding: 0 11px;display:flex;flex-direction:row;align-items:center;justify-content:center;height:44px" />
		</u-sticky>
		<view class="mt-3">
			<view class="basic-box" v-show="currentTab == 0">
				<view class="basic-header">
					<view class="u-flex">
						<view class="basic-text text-clip ml-2">
							{{ listDetail.orderCode }}
						</view>
						<view v-if="listDetail.status" class="basic-text-status ml-2" :style="{ color: repairType[listDetail.status].color}">
							{{ listDetail.status ? repairType[listDetail.status].name : '' }}
						</view>
					</view>
				</view>
				<view class="detail">
					<view class="detail-item">
						<view class="detail-label">{{ $t('deviceRepair.orderCode') }}</view>
						<view class="detail-value">{{ listDetail.orderCode}}</view>
					</view>
					<u-line length="90%" margin="0 auto"></u-line>
					<view class="detail-item">
						<view class="detail-label">{{ $t('deviceRepair.device') }}</view>
						<view class="detail-value">{{ listDetail.deviceInfo ? listDetail.deviceInfo.name : '' }}</view>
					</view>
					<u-line length="90%" margin="0 auto"></u-line>
					<view class="detail-item">
						<view class="detail-label">{{ $t('deviceRepair.brand') }}</view>
						<view class="detail-value">{{ listDetail.deviceInfo ? listDetail.deviceInfo.brand : '' }}</view>
					</view>
					<u-line length="90%" margin="0 auto"></u-line>
					<view class="detail-item">
						<view class="detail-label">{{ $t('deviceRepair.modelNum') }}</view>
						<view class="detail-value">{{ listDetail.deviceInfo ? listDetail.deviceInfo.modelNum :'' }}</view>
					</view>
					<u-line length="90%" margin="0 auto"></u-line>
					<view class="detail-item">
						<view class="detail-label">{{ $t('deviceRepair.specifications') }}</view>
						<view class="detail-value">{{ listDetail.deviceInfo ? listDetail.deviceInfo.specifications :'' }}</view>
					</view>
					<u-line length="90%" margin="0 auto"></u-line>
					<view class="detail-item">
						<view class="detail-label">{{ $t('deviceRepair.reportDate') }}</view>
						<view class="detail-value">{{ listDetail.reportDate }}</view>
					</view>
					<u-line length="90%" margin="0 auto"></u-line>
					<view class="detail-item">
						<view class="detail-label">{{ $t('deviceRepair.directorName') }}</view>
						<view class="detail-value">{{ listDetail.deviceInfo ? listDetail.deviceInfo.directorName : '' }}</view>
					</view>
					<u-line length="90%" margin="0 auto"></u-line>
					<view class="detail-item">
						<view class="detail-label">{{ $t('deviceRepair.reportByName') }}</view>
						<view class="detail-value">{{ listDetail.reportByName }}</view>
					</view>
					<u-line length="90%" margin="0 auto"></u-line>
					<view class="detail-item">
						<view class="detail-label">{{ $t('deviceRepair.emergency') }}</view>
						<view class="detail-value">{{ listDetail.emergency ? '是' :'否' }}</view>
					</view>
					<u-line length="90%" margin="0 auto"></u-line>
					<view class="detail-item">
						<view class="detail-label">{{ $t('deviceRepair.situationImg') }}</view>
						<view class="detail-value">
						  <image class="detail-img" v-if="listDetail.situationImg" :src="formatImage(listDetail.situationImg)"/>
						</view>
					</view>
					<u-line length="90%" margin="0 auto"></u-line>
					<view class="detail-item">
						<view class="detail-label">{{ $t('deviceMangement.description') }}</view>
						<view class="detail-value">{{ listDetail.description }}</view>
					</view>
					
				</view>
			</view>
			<view class="record-box" v-show="currentTab == 1">
				<!-- 列表分页 -->
				<mescroll-body ref="mescrollRef" @init="mescrollInit" :up="upOption" :down="downOption" @down="downCallback"
					@up="upCallback">
					<page-list :list="listData" @openDeviceDetail="openDeviceDetail"></page-list>
					<mescroll-empty v-if="!listData.length" />
				</mescroll-body>
			</view>
			
		</view>
	</view>
</template>

<script>
import fTabbar from "@/components/module/f-tabbar/f-tabbar";
import MescrollMixin from '@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js';
import api from '@/api/index.js'
import {repairType} from '@/pages/deviceRepair/enum/index.js'
import { list } from './config/data.js'
import baseUrl from '@/config/baseUrl.js'
import pageList from '@/components/common/page-list'


export default {
	mixins: [MescrollMixin], // 使用mixin (在main.js注册全局组件)
	components: {
		fTabbar,
		pageList
		
	},
	data() {
		return {
			bgColor: '#fff',
			activeColor: {
				fontWeight: 'bold',
				color: '#333',
			},
			inActiveColor: {
				color: '#999',
			},
			listDetail:{},
			list,
			currentTab: 0,
			isScrollable: false,
			repairType,
			downOption: {
				auto: false //是否在初始化后,自动执行downCallback; 默认true
			},
			upOption: {
				isBounce: false,
				auto: false // 不自动加载
			},
			page: {
				num: 0,
				size: 10
			},
			orderCode:'', //工单id
			reportBy:'', //报修人id
			repairBy:'', //维修人id
			deviceId:'', //设备id,
			listData:[]
			
		};
	},
	onUnload() {
		
	},
	async onLoad(options) {
		// 隐藏原生的tabbar
		uni.hideTabBar();
		if (getApp().getBindNot()) {
			return
		}
		let id = options.id
		const res =	await api.deviceRepairApi.getRepairWorkDetail(id)	
		if (!res) return
		this.listDetail = {...res}
		
	
	},
	onShow(){
		this.$nextTick(()=>{
			uni.setNavigationBarTitle({
				title:this.$t('menu.repairWorkOrderDetail')
			})
		})
		
		
	},
	watch: {
		currentTab: {
			immediate: true,
			handler(val) {
				if(val == 1){
					this.page.num = 1
					this.loadData(this.page.num);
				}
				
			}
		},
		
		
		
	},
	
	methods: {
		handleTabClick({index}) {
			this.currentTab = index;
		},
		
		formatImage(url) {
			// return baseUrl.baseImgUrl + url
			return window.location.origin + url
		},
		//下拉刷新
		downCallback() {
			if (getApp().getBindNot()) {
				setTimeout(() => {
					this.mescroll.endByPage(0, 0)
				}, 200)
				return
			}
			this.listData = [];
			this.page.num = 1;
			this.loadData(this.page.num);
			this.resetQuery();
		},
		//上拉加载
		upCallback() {
			if (getApp().getBindNot()) {
				setTimeout(() => {
					this.mescroll.endByPage(0, 0)
				}, 200)
				return
			}
			this.page.num += 1;
			this.loadData(this.page.num);
		},
		//获取列表
		async loadData(pageNo,params={}) {	
			try {
				let httpData = {
					page: pageNo,
					pageSize: 10,
				};
				const httpPostData = {
					orderCode:this.listDetail.orderCode, //工单id
					reportBy:this.reportBy, //报修人id
					repairBy:this.repairBy, //维修人id
		            deviceId:this.deviceId, //设备id
					deviceName:'',
					...params
				}
				const {
					total,
					items
				} = await api.deviceRepairApi.getRepairRecordApi(httpData, httpPostData)	
				
				let data = items
				let newList  = data.map((item)=>{
					return {
						id:item.id,
						title:item.code,
						child:[
							{
								label:'deviceRepair.code',
								name:item.code
							},
							{
								label:'deviceRepair.repairDate',
								name:item.repairDate
							},
							{
								label:'deviceRepair.repairName',
								name:item.repairName
							},
							{
								label:'deviceRepair.malfunctionReasonName',
								name:item.malfunctionReasonName
							},
							{
								label:'deviceRepair.repairDescription',
								name:item.description
							}
							
						],
						detail:{
							...item
						}
					}
				})
				uni.stopPullDownRefresh();
				this.mescroll.endByPage(items.length); //必传参数(当前页的数据个数, 总页数)
				if (pageNo == 1) {
					this.listData = newList;
				} else {
					this.listData = this.listData.concat(newList);
				}
					
					
			} catch {
				this.mescroll.endErr();
			}
		},
		
		
	},
};
</script>

<style lang="scss" scoped>
.device-detail-page {
	min-height: 100vh;
	background-color: #f8f9fa;
	// padding: 0 30rpx;
	.mt-3{
		// padding: 0 30rpx;
		margin-top: 0;
		.basic-box{
			margin-top: 30rpx;
			padding: 0 30rpx;
		}
		.record-box{
			// padding: 0 30rpx 0 15rpx;
		}
	}
	.basic-header {
		display: flex;
		justify-content: space-between;
		align-items: center;
		height: 140rpx;
		background-color: #fff;
		border-radius: 20rpx;
		padding-left: 40rpx;
		padding-right:20rpx;
		
	
		.basic-text {
			width: 370rpx;
		}
	
		.cu-item {
			background: #3388ff;
			border-radius: 12px;
			width: 120rpx;
			height: 48rpx;
			text-align: center;
			line-height: 40rpx;
	
			text {
				font-size: 12px;
				font-family: PingFangSC-Regular, PingFang SC;
				font-weight: 400;
				color: #ffffff;
			}
		}
	
		.basic-text-status {
			font-size: 14px;
		}
	}
	.detail {
		background-color: #fff;
		margin-top: 30rpx;
		border-radius: 20rpx;
		width: 690rpx;
	
		.detail-item {
			padding: 30rpx;
			display: flex;
			align-items: center;
	
			.detail-label {
				color: #333;
				font-size: 15px;
			}
	
			.detail-value {
				color: #666;
				font-size: 14px;
				margin-left: 30rpx;
				.detail-img{
					width: 60rpx;
					height: 60rpx;
				}
			}
		}
	}
}
</style>