<route lang="json5">
|
{
|
layout: 'default',
|
needLogin: true,
|
style: {
|
navigationBarTitleText: '设备维修',
|
'app-plus': {
|
titleNView: {
|
buttons: [
|
{
|
text: '接单',
|
fontSize: '14px',
|
color: '#FFFFFF',
|
},
|
{
|
text: '',
|
fontSize: '24px',
|
color: '#FFFFFF',
|
},
|
],
|
},
|
},
|
},
|
}
|
</route>
|
<template>
|
<z-paging ref="paging" v-model="dataList" @query="queryList" show-refresher-update-time>
|
<template #top>
|
<wd-drop-menu>
|
<wd-drop-menu-item
|
v-model="resTypeId"
|
label-key="dictLabel"
|
value-key="dictValue"
|
:options="resTypeList"
|
@change="handleResType"
|
/>
|
<wd-drop-menu-item
|
v-model="status"
|
label-key="dictLabel"
|
value-key="dictValue"
|
:options="statusList"
|
@change="handleResStatu"
|
/>
|
</wd-drop-menu>
|
</template>
|
|
<view class="bg-base">
|
<wd-card type="rectangle" v-for="(item, index) in dataList" :key="item.id">
|
<template #title>
|
<view class="flex justify-between items-center">
|
<view class="flex items-center menu-title-box">
|
<view class="menu-indicator"></view>
|
<text class="ml-1 text-xs">{{ item.resCode }}</text>
|
<text class="text-color-gray ml-2 text-mini">接单:{{ item.createTime }}</text>
|
</view>
|
|
<view>
|
<wd-tag size="small" v-if="item.status === '1'" type="warning">已接单</wd-tag>
|
<wd-tag size="small" v-else-if="item.status === '2'" type="primary">维修中</wd-tag>
|
<wd-tag size="small" v-else-if="item.status === '3'" type="success">已完成</wd-tag>
|
</view>
|
</view>
|
</template>
|
<view class="flex h-[240rpx] items-center">
|
<image
|
v-if="item.reqType === '1'"
|
class="slot-img text-center"
|
src="/static/ico/ico-huiyi.png"
|
/>
|
<image
|
v-else-if="item.reqType === '2'"
|
class="slot-img text-center"
|
src="/static/ico/ico-setting.png"
|
/>
|
<image
|
v-else-if="item.reqType === '3'"
|
class="slot-img text-center"
|
src="/static/ico/ico-faxian.png"
|
/>
|
<view class="flex-1 mt-1">
|
<view class="text-color-base">
|
<template v-if="item.reqType === '1'">
|
<text>设备类型</text>
|
<text class="mx-2">|</text>
|
<text>{{ item.equName }}</text>
|
</template>
|
|
<template v-if="item.reqType === '2'">
|
<text>工具类型</text>
|
<text class="mx-2">|</text>
|
<text>{{ item.fixtureName }}</text>
|
</template>
|
|
<template v-if="item.reqType === '3'">
|
<text>其他类型</text>
|
</template>
|
<view class="text-color-gray mt-1 text-mini">
|
<text>报修人: {{ item.reqUserName }}</text>
|
</view>
|
<view class="text-color-gray mt-1 text-mini">
|
<text>报修时间: {{ item.reqTime }}</text>
|
</view>
|
|
<view class="text-color-gray mt-1 text-mini">
|
<text>维修开始: {{ item.startTime }}</text>
|
</view>
|
<view class="text-color-gray mt-1 text-mini">
|
<text>维修结束: {{ item.endTime }}</text>
|
</view>
|
<view class="text-color-gray mt-1 text-mini">
|
<text>维修人: {{ item.resUserName }}</text>
|
</view>
|
</view>
|
</view>
|
<view>
|
<!--操作工或维修工角色-->
|
<template v-if="isOperatorOrRepair()">
|
<wd-button
|
v-if="item.status === '1'"
|
size="small"
|
icon="edit-outline"
|
@click.stop="handleStartRepair(item)"
|
>
|
开始维修
|
</wd-button>
|
<wd-button
|
v-else-if="item.status === '2'"
|
size="small"
|
icon="edit-outline"
|
@click.stop="itemClick(item)"
|
>
|
维修中
|
</wd-button>
|
<view class="h-full flex flex-col" v-else-if="item.status === '3'">
|
<wd-button size="small" icon="warn-bold" @click.stop="itemClick(item)">
|
详情
|
</wd-button>
|
<wd-button
|
class="mt-4"
|
size="small"
|
icon="edit-outline"
|
@click.stop="goToFeedBack(item)"
|
>
|
查看评价
|
</wd-button>
|
</view>
|
</template>
|
|
<!--管理员角色-->
|
<template v-else-if="isLeader()">
|
<wd-button
|
v-if="item.status === '1'"
|
size="small"
|
icon="warn-bold"
|
disabled
|
@click.stop="itemClick(item)"
|
>
|
待维修
|
</wd-button>
|
<wd-button
|
v-else-if="item.status === '2'"
|
size="small"
|
icon="warn-bold"
|
disabled
|
@click.stop="itemClick(item)"
|
>
|
维修中
|
</wd-button>
|
<view class="h-full flex flex-col" v-else-if="item.status === '3'">
|
<wd-button size="small" icon="warn-bold" @click.stop="itemClick(item)">
|
详情
|
</wd-button>
|
<wd-button
|
class="mt-4"
|
size="small"
|
icon="edit-outline"
|
@click.stop="goToFeedBack(item)"
|
>
|
{{ item.fbId == null ? '写评价' : '查看评价' }}
|
</wd-button>
|
</view>
|
</template>
|
</view>
|
</view>
|
</wd-card>
|
</view>
|
</z-paging>
|
</template>
|
|
<script setup lang="ts">
|
import { onMounted, getCurrentInstance, ref } from 'vue'
|
import { useToast, useMessage } from 'wot-design-uni'
|
import { getRepairResList, addRepairRes, updateRepairRes } from '@/service/repair'
|
import { DICT_REPAIR_RES_STATUS, DICT_REPAIR_REQ_TYPE, getDictInfo } from '@/service/dict'
|
import { isLeader, isOperatorOrRepair } from '@/utils/RoleUtils'
|
import { useUserStore } from '@/store'
|
import { formatDate } from '@/utils/DateUtils'
|
const userStore = useUserStore()
|
|
const message = useMessage()
|
const toast = useToast()
|
|
/**
|
* 其他页面传过来的数据
|
* assetNo: 资产编号
|
* from: 是否是扫码进来的,如果是扫码进来,只能查询固定设备的数据
|
*/
|
interface PageParams {
|
assetNo?: string
|
from?: string
|
}
|
|
// 页面参数,上个页面传递过来的参数
|
const option = reactive<PageParams>({
|
assetNo: '',
|
from: '',
|
})
|
|
// 维修单类型
|
const resTypeId = ref<number>(-1)
|
// 维修单处理状态
|
const status = ref<number>(-1)
|
|
const isSelectRes = ref(false)
|
|
const resTypeList = ref<any>([{ dictLabel: '所有类型', dictValue: -1 }])
|
const statusList = ref<any>([{ dictLabel: '所有状态', dictValue: -1 }])
|
function handleResType({ value }) {
|
reloadData()
|
}
|
function handleResStatu({ value }) {
|
reloadData()
|
}
|
|
const paging = ref(null)
|
const dataList = ref([])
|
|
const queryList = (pageNum?: number, pageSize?: number) => {
|
const params: any = {
|
pageNum,
|
pageSize,
|
reqType: resTypeId.value,
|
status: status.value,
|
}
|
if (resTypeId.value === -1) {
|
delete params.reqType
|
}
|
if (status.value === -1) {
|
delete params.status
|
}
|
// 如果是从扫码页面过来,只能查询固定设备的数据
|
if (option?.from === 'scan') {
|
params.assetNo = option.assetNo
|
}
|
getRepairResList(params)
|
.then((res: any) => {
|
paging.value.completeByTotal(res.rows, res.total)
|
})
|
.catch((res) => {
|
paging.value.complete(false)
|
})
|
}
|
function reloadData() {
|
paging.value.reload()
|
}
|
|
/**
|
* 条目点击事件
|
* @param item
|
*/
|
function itemClick(item: any) {
|
goToDetail(item)
|
}
|
|
/**
|
* 开始维修
|
* @param item
|
*/
|
function handleStartRepair(item: any) {
|
// 确认开始修改状态为2-维修中
|
const data = Object.assign({}, item)
|
// 确认开始修改状态为2-维修中
|
data.status = '2'
|
// 设置开始维修时间
|
data.startTime = formatDate(new Date())
|
message
|
.confirm({
|
msg: '确定开始维修?',
|
title: '提示',
|
beforeConfirm: ({ resolve }) => {
|
updateRepair(data, resolve)
|
},
|
})
|
.then(() => {})
|
.catch((error) => {
|
console.log(error)
|
})
|
}
|
|
/**
|
* 更新维修工单
|
* @param data
|
* @param resolve
|
*/
|
function updateRepair(data: any, resolve: any) {
|
updateRepairRes(data)
|
.then((res: any) => {
|
resolve(true)
|
if (res?.code === 200) {
|
reloadData()
|
// 维修中状态才需要跳转
|
if (data?.status === '2') {
|
goToDetail(data)
|
}
|
}
|
})
|
.catch((res) => {
|
console.error(res)
|
})
|
}
|
|
function goToDetail(item) {
|
uni.navigateTo({
|
url: `/pages/repair/res-detail?id=${item.id}`,
|
})
|
}
|
|
function goToFeedBack(item) {
|
uni.navigateTo({
|
url: `/pages/repair/repair-fb?id=${item.id}`,
|
})
|
}
|
|
onNavigationBarButtonTap((e) => {
|
if (e.index === 0) {
|
if (isLeader()) {
|
toast.info('请登录维修工账号接单')
|
} else if (isOperatorOrRepair()) {
|
handleSelectReq()
|
}
|
}
|
})
|
|
/**
|
* 选择报修单
|
*/
|
function handleSelectReq() {
|
uni.navigateTo({
|
url: '/pages/repair/req-list',
|
events: {
|
// 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据
|
selectReq: function (data) {
|
console.error(data)
|
// 选择报修单后,修改报修单状态和新增维修工单
|
const resCode = `WXD${data.data.code.slice(3)}`
|
const deptId = userStore?.userInfo?.deptId
|
const userId = userStore?.userInfo?.userId
|
const resData = {
|
reqId: data.data.id,
|
reqCode: data.data.code,
|
reqUser: data.data.reqUser,
|
reqDept: data.data.reqDept,
|
resCode,
|
status: '1',
|
resUser: userId,
|
resDept: deptId,
|
}
|
addRepairRes(resData)
|
.then((res: any) => {
|
if (res.code === 200) {
|
toast.success(res?.msg || '操作成功')
|
reloadData()
|
} else {
|
toast.error(res?.msg || '生成维修工单失败,请重试')
|
}
|
})
|
.catch((res) => {
|
toast.error(res?.msg || '生成维修工单失败,请重试')
|
})
|
},
|
},
|
success: function (res) {
|
// 通过eventChannel向被打开页面传送数据
|
res.eventChannel.emit('OnSelectReq', { data: '维修单页面选择报修单' })
|
},
|
})
|
}
|
|
async function initData() {
|
const rList: any = await getDictInfo(DICT_REPAIR_REQ_TYPE)
|
resTypeList.value.push(...rList)
|
const sList: any = await getDictInfo(DICT_REPAIR_RES_STATUS)
|
statusList.value.push(...sList)
|
}
|
onLoad((options) => {
|
Object.assign(option, options)
|
initData()
|
uni.$on('res-list-refresh', reloadData)
|
})
|
onUnload(() => {
|
uni.$off('res-list-refresh', reloadData)
|
})
|
</script>
|
|
<style scoped lang="scss">
|
.menu-title-box {
|
height: 30rpx;
|
line-height: 30rpx;
|
}
|
|
.slot-img {
|
width: 72rpx;
|
height: 72rpx;
|
margin-right: 24rpx;
|
}
|
.text-mini {
|
font-size: 22rpx;
|
}
|
|
.menu-indicator {
|
width: 6rpx;
|
height: 22rpx;
|
border-radius: 10rpx;
|
background-color: $uni-color-primary;
|
}
|
:deep(.wd-card__title-content) {
|
padding: 16rpx !important;
|
}
|
:deep(.wd-card__content) {
|
padding: 16rpx !important;
|
}
|
:deep(.wd-card__footer) {
|
padding: 10rpx !important;
|
}
|
</style>
|