|
|
@@ -18,7 +18,7 @@
|
|
|
:hasMore="hasMore"
|
|
|
@refresh="handleRefresh"
|
|
|
@loadMore="loadMore"
|
|
|
- @itemClick="handleItemClick"
|
|
|
+ @itemClick="handleView"
|
|
|
>
|
|
|
<template #default="{ item, index }">
|
|
|
<view class="list-item">
|
|
|
@@ -31,35 +31,63 @@
|
|
|
<view class="info-label">
|
|
|
<text class="text-gray">{{ getDisplayTime(item) }}</text>
|
|
|
</view>
|
|
|
- <view class="info-value">
|
|
|
- <view
|
|
|
- v-if="getOrderStatus(item) == 'assigned' && canHandleOrder(item)"
|
|
|
- class="btn-primary info-value"
|
|
|
- @click.stop="handleItemClick(item)"
|
|
|
- >
|
|
|
- <text class="btn-text">接单</text>
|
|
|
- </view>
|
|
|
- <view
|
|
|
- v-else-if="getOrderStatus(item) == 'to_approve' && canHandleOrder(item)"
|
|
|
- class="btn-primary info-value"
|
|
|
- @click.stop="handleItemClick(item)"
|
|
|
- >
|
|
|
- <text class="btn-text">审批</text>
|
|
|
- </view>
|
|
|
- <!-- <button
|
|
|
- v-else-if="getOrderStatus(item) == 'to_finish' && canHandleOrder(item)"
|
|
|
- class="btn-primary info-value"
|
|
|
- @click.stop="handleItemClick(item)"
|
|
|
- >
|
|
|
- 挂起
|
|
|
- </button> -->
|
|
|
- <view
|
|
|
- v-else-if="getOrderStatus(item) == 'suspended' && canHandleOrder(item)"
|
|
|
- class="btn-primary info-value"
|
|
|
- @click.stop="handleItemClick(item)"
|
|
|
- >
|
|
|
- <text class="btn-text">恢复</text>
|
|
|
- </view>
|
|
|
+ </view>
|
|
|
+ <view class="btn-group">
|
|
|
+ <view
|
|
|
+ v-if="getOrderStatus(item) == 'assigned' && canHandleOrder(item,'accept')"
|
|
|
+ class="btn-primary info-value"
|
|
|
+ @click.stop="handleItemClick(item,'')"
|
|
|
+ >
|
|
|
+ <text class="btn-text">接单</text>
|
|
|
+ </view>
|
|
|
+ <view
|
|
|
+ v-if="getOrderStatus(item) == 'to_approve' && canHandleOrder(item,'')"
|
|
|
+ class="btn-primary info-value"
|
|
|
+ @click.stop="handleItemClick(item,'')"
|
|
|
+ >
|
|
|
+ <text class="btn-text">审批</text>
|
|
|
+ </view>
|
|
|
+ <view
|
|
|
+ v-if="getOrderStatus(item) == 'suspended' && canHandleOrder(item,'')"
|
|
|
+ class="btn-primary info-value"
|
|
|
+ @click.stop="handleItemClick(item,'')"
|
|
|
+ >
|
|
|
+ <text class="btn-text">恢复</text>
|
|
|
+ </view>
|
|
|
+ <view
|
|
|
+ v-if="getOrderStatus(item) == 'return' && canHandleOrder(item,'acceptReturn')"
|
|
|
+ class="btn-primary info-value"
|
|
|
+ @click.stop="handleItemClick(item,'acceptReturn')"
|
|
|
+ >
|
|
|
+ <text class="btn-text">退回</text>
|
|
|
+ </view>
|
|
|
+ <view
|
|
|
+ v-if="getOrderStatus(item) == 'assigned' && canHandleOrder(item,'acceptReturn')"
|
|
|
+ class="btn-primary info-value"
|
|
|
+ @click.stop="handleItemClick(item,'acceptReturn')"
|
|
|
+ >
|
|
|
+ <text class="btn-text">退回</text>
|
|
|
+ </view>
|
|
|
+ <view
|
|
|
+ v-if="getOrderStatus(item) == 'to_finish' && canHandleOrder(item, 'return')"
|
|
|
+ class="btn-primary info-value"
|
|
|
+ @click.stop="handleItemClick(item, 'return')"
|
|
|
+ >
|
|
|
+ <text class="btn-text">退回</text>
|
|
|
+ </view>
|
|
|
+ <view
|
|
|
+ v-if="getOrderStatus(item) == 'to_finish' && canHandleOrder(item, 'suspend')"
|
|
|
+ class="btn-primary info-value"
|
|
|
+ @click.stop="handleItemClick(item, 'suspend')"
|
|
|
+ >
|
|
|
+ <text class="btn-text">挂起</text>
|
|
|
+ </view>
|
|
|
+ <view
|
|
|
+ v-if="getOrderStatus(item) == 'to_finish' && canHandleOrder(item, 'finalize')"
|
|
|
+ class="btn-primary info-value"
|
|
|
+ @click.stop="handleItemClick(item, 'finalize')"
|
|
|
+ >
|
|
|
+ <text class="btn-text">复启</text>
|
|
|
</view>
|
|
|
</view>
|
|
|
</view>
|
|
|
@@ -75,7 +103,10 @@ import type { acceptOrderInfo } from '../../types/order'
|
|
|
import type { SysDictData } from '../../types/dict'
|
|
|
import { pendingList } from '../../api/order/list'
|
|
|
import { getDictDataByType } from '../../api/dict/index'
|
|
|
-import {checkPermi} from '../../utils/storage'
|
|
|
+import {checkPermi, getUserInfo} from '../../utils/storage'
|
|
|
+
|
|
|
+ const userId = ref<string>("")
|
|
|
+ const roles = ref<string>('')
|
|
|
|
|
|
// 列表数据
|
|
|
const dataList = ref<acceptOrderInfo[]>([])
|
|
|
@@ -105,26 +136,40 @@ import {checkPermi} from '../../utils/storage'
|
|
|
}
|
|
|
|
|
|
// 方法:判断当前工单是否显示操作按钮(基于 orderType)
|
|
|
- const canHandleOrder = (item: any | null): boolean => {
|
|
|
+ const canHandleOrder = (item: any | null, buttonType: string | ''): boolean => {
|
|
|
if (item == null) return false
|
|
|
let permit: string[] = []
|
|
|
const orderItem = item as acceptOrderInfo
|
|
|
- if(orderItem.workOrderStatus == 'assigned') {
|
|
|
- // 接单
|
|
|
- permit = orderItem.orderType == 2 ? ['gxt:maintenance:order:accept'] : ['gxt:repairOrder:accept']
|
|
|
- // } else if(orderItem.workOrderStatus == 'to_finish') {
|
|
|
- // // 挂起
|
|
|
- // permit = orderItem.orderType == 2 ? ['gxt:maintenance:order:suspend'] : ['gxt:repairOrder:suspend']
|
|
|
+ if(orderItem.workOrderStatus == 'assigned' && buttonType != '' && buttonType == "acceptReturn" && orderItem.orderType == 1) {
|
|
|
+ // 接单退回
|
|
|
+ permit = ['gxt:repairOrder:acceptReturn']
|
|
|
+ } else if(orderItem.workOrderStatus == 'assigned' && buttonType != '' && buttonType == "accept") {
|
|
|
+ // 接单
|
|
|
+ permit = orderItem.orderType == 2 ? ['gxt:maintenance:order:accept'] : ['gxt:repairOrder:accept']
|
|
|
+ } else if(orderItem.workOrderStatus == 'to_finish') {
|
|
|
+ if(buttonType != '' && buttonType == "suspend" && (orderItem.teamLeaderId == parseInt(userId.value) || roles.value.includes("管理员"))) {
|
|
|
+ // 挂起
|
|
|
+ permit = orderItem.orderType == 2 ? ['gxt:maintenance:order:suspend'] : ['gxt:repairOrder:suspend']
|
|
|
+ } else if(buttonType != '' && buttonType == "return" && orderItem.orderType == 1 && (orderItem.teamLeaderId == parseInt(userId.value) || roles.value.includes("管理员"))) {
|
|
|
+ // 退回
|
|
|
+ permit = orderItem.orderType == 2 ? ['gxt:maintenance:order:return'] : ['gxt:repairOrder:return']
|
|
|
+ } else if(buttonType != '' && buttonType == "finalize" && orderItem.orderType == 1 && (orderItem.teamLeaderId == parseInt(userId.value) || roles.value.includes("管理员"))) {
|
|
|
+ // 复启
|
|
|
+ permit = orderItem.orderType == 2 ? ['gxt:maintenance:order:finalize'] : ['gxt:repairOrder:finalize']
|
|
|
+ }
|
|
|
} else if(orderItem.workOrderStatus == 'to_approve') {
|
|
|
// 审批
|
|
|
permit = orderItem.orderType == 2 ? ['gxt:maintenance:order:approve'] : ['gxt:repairOrder:approve']
|
|
|
- } else if(orderItem.workOrderStatus == 'suspended') {
|
|
|
+ } else if(orderItem.workOrderStatus == 'suspended' && (orderItem.teamLeaderId == parseInt(userId.value) || roles.value.includes("管理员"))) {
|
|
|
// 恢复
|
|
|
permit = orderItem.orderType == 2 ? ['gxt:maintenance:order:resume'] : ['gxt:repairOrder:resume']
|
|
|
- } else {
|
|
|
- return false
|
|
|
+ } else if(orderItem.workOrderStatus == 'return') {
|
|
|
+ // 接单退回
|
|
|
+ permit = ['gxt:repairOrder:acceptReturn']
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return false
|
|
|
}
|
|
|
-
|
|
|
// const orderType = (item as acceptOrderInfo).orderType
|
|
|
return checkPermi(permit)
|
|
|
}
|
|
|
@@ -185,9 +230,24 @@ import {checkPermi} from '../../utils/storage'
|
|
|
const disablePull = disablePullDown != null ? disablePullDown : false
|
|
|
|
|
|
loading.value = true
|
|
|
+ let refreshTimeout: number | null = null;
|
|
|
+
|
|
|
if (shouldRefresh && !disablePull) {
|
|
|
page.value = 1
|
|
|
refreshing.value = true
|
|
|
+
|
|
|
+ // 添加超时机制,确保刷新动画不会一直显示
|
|
|
+ refreshTimeout = setTimeout(() => {
|
|
|
+ if (refreshing.value) {
|
|
|
+ refreshing.value = false;
|
|
|
+ isRefreshing.value = false;
|
|
|
+ console.log("刷新超时,强制结束刷新状态");
|
|
|
+ uni.showToast({
|
|
|
+ title: '刷新超时',
|
|
|
+ icon: 'none'
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, 10000); // 10秒超时
|
|
|
} else if (shouldRefresh && disablePull) {
|
|
|
// 状态切换时,重置页码但不触发动画
|
|
|
page.value = 1
|
|
|
@@ -268,12 +328,17 @@ import {checkPermi} from '../../utils/storage'
|
|
|
})
|
|
|
} finally {
|
|
|
loading.value = false
|
|
|
+ // 清除超时定时器
|
|
|
+ if (refreshTimeout != null) {
|
|
|
+ clearTimeout(refreshTimeout);
|
|
|
+ }
|
|
|
// 确保刷新状态能结束
|
|
|
if (shouldRefresh) {
|
|
|
refreshing.value = false;
|
|
|
// 使用setTimeout确保状态彻底重置
|
|
|
setTimeout(() => {
|
|
|
isRefreshing.value = false;
|
|
|
+ refreshing.value = false; // 再次确保刷新状态被重置
|
|
|
}, 50);
|
|
|
}
|
|
|
}
|
|
|
@@ -379,6 +444,20 @@ import {checkPermi} from '../../utils/storage'
|
|
|
console.log("isRefreshing.value1===",isRefreshing.value)
|
|
|
// 设置刷新标志
|
|
|
isRefreshing.value = true;
|
|
|
+ refreshing.value = true; // 确保刷新状态被设置
|
|
|
+
|
|
|
+ // 添加超时机制,确保刷新动画不会一直显示
|
|
|
+ const refreshTimeout = setTimeout(() => {
|
|
|
+ if (refreshing.value || isRefreshing.value) {
|
|
|
+ refreshing.value = false;
|
|
|
+ isRefreshing.value = false;
|
|
|
+ console.log("刷新操作超时,重置刷新状态");
|
|
|
+ uni.showToast({
|
|
|
+ title: '刷新超时',
|
|
|
+ icon: 'none'
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, 10000);
|
|
|
|
|
|
try {
|
|
|
await loadData(true, false); // 使用默认的下拉刷新行为
|
|
|
@@ -386,12 +465,18 @@ import {checkPermi} from '../../utils/storage'
|
|
|
console.error('刷新失败:', error);
|
|
|
refreshing.value = false;
|
|
|
isRefreshing.value = false;
|
|
|
+ } finally {
|
|
|
+ clearTimeout(refreshTimeout);
|
|
|
+ // 确保刷新状态最终被重置
|
|
|
+ refreshing.value = false;
|
|
|
+ isRefreshing.value = false;
|
|
|
}
|
|
|
|
|
|
- // 确保在一定时间后重置刷新标志,防止意外情况
|
|
|
+ // 额外的保险机制,确保在一定时间后重置刷新标志
|
|
|
setTimeout(() => {
|
|
|
- isRefreshing.value = false
|
|
|
- }, 100) // 延迟重置,确保状态完全更新
|
|
|
+ refreshing.value = false;
|
|
|
+ isRefreshing.value = false;
|
|
|
+ }, 200) // 延迟重置,确保状态完全更新
|
|
|
}
|
|
|
|
|
|
// 加载更多
|
|
|
@@ -424,15 +509,50 @@ import {checkPermi} from '../../utils/storage'
|
|
|
isSearching.value = false
|
|
|
}, 100)
|
|
|
}
|
|
|
+
|
|
|
+ // 点击列表查看
|
|
|
+ const handleView = (item: any | null): void => {
|
|
|
+ if (item == null) return
|
|
|
+ const orderItem = item as acceptOrderInfo
|
|
|
+ uni.navigateTo({
|
|
|
+ url: `/pages/order/detail/index?id=${orderItem.id}&orderType=${orderItem.orderType}`
|
|
|
+ })
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
// 点击列表项
|
|
|
- const handleItemClick = (item: any | null): void => {
|
|
|
+ const handleItemClick = (item: any | null, buttonType: string | ''): void => {
|
|
|
if (item == null) return
|
|
|
const orderItem = item as acceptOrderInfo
|
|
|
if(orderItem.workOrderStatus == 'assigned') {
|
|
|
- uni.navigateTo({
|
|
|
- url: `/pages/order/detail/acceptIndex?id=${orderItem.id}&orderType=${orderItem.orderType}`
|
|
|
- })
|
|
|
+ if(buttonType != '' && buttonType == "acceptReturn") {
|
|
|
+ // 跳转到退回页面
|
|
|
+ uni.navigateTo({
|
|
|
+ url: `/pages/order/detail/returnIndex?id=${orderItem.id}&orderType=${orderItem.orderType}`
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ // 跳转到接单页面
|
|
|
+ uni.navigateTo({
|
|
|
+ url: `/pages/order/detail/acceptIndex?id=${orderItem.id}&orderType=${orderItem.orderType}`
|
|
|
+ })
|
|
|
+ }
|
|
|
+ } else if(orderItem.workOrderStatus == 'to_finish') {
|
|
|
+ if(buttonType != '' && buttonType == "suspend") {
|
|
|
+ // 跳转到待结单页面
|
|
|
+ uni.navigateTo({
|
|
|
+ url: `/pages/order/detail/suspendIndex?id=${orderItem.id}&orderType=${orderItem.orderType}`
|
|
|
+ })
|
|
|
+ } else if(buttonType != '' && buttonType == "return") {
|
|
|
+ // 跳转到退回页面
|
|
|
+ uni.navigateTo({
|
|
|
+ url: `/pages/order/detail/returnIndex?id=${orderItem.id}&orderType=${orderItem.orderType}`
|
|
|
+ })
|
|
|
+ } else if(buttonType != '' && buttonType == "finalize") {
|
|
|
+ // 跳转到复启页面
|
|
|
+ uni.navigateTo({
|
|
|
+ url: `/pages/order/detail/resetIndex?id=${orderItem.id}&orderType=${orderItem.orderType}`
|
|
|
+ })
|
|
|
+ }
|
|
|
} else if(orderItem.workOrderStatus == 'to_approve') {
|
|
|
// 跳转到待审批页面
|
|
|
uni.navigateTo({
|
|
|
@@ -443,9 +563,14 @@ import {checkPermi} from '../../utils/storage'
|
|
|
uni.navigateTo({
|
|
|
url: `/pages/order/detail/resumeIndex?id=${orderItem.id}&orderType=${orderItem.orderType}`
|
|
|
})
|
|
|
+ } else if(orderItem.workOrderStatus == 'return') {
|
|
|
+ // 跳转到退回页面
|
|
|
+ uni.navigateTo({
|
|
|
+ url: `/pages/order/detail/returnIndex?id=${orderItem.id}&orderType=${orderItem.orderType}`
|
|
|
+ })
|
|
|
} else {
|
|
|
uni.navigateTo({
|
|
|
- url: `/pages/order/detail/index?id=${orderItem.id}&orderType=${orderItem.orderType}`
|
|
|
+ url: `/pages/order/detail/index?id=${orderItem.id}&orderType=${orderItem.orderType}`
|
|
|
})
|
|
|
}
|
|
|
|
|
|
@@ -476,6 +601,12 @@ import {checkPermi} from '../../utils/storage'
|
|
|
|
|
|
// 初始化
|
|
|
onMounted(() => {
|
|
|
+ const userInfo = getUserInfo()
|
|
|
+ if (userInfo != null) {
|
|
|
+ const userIdStr = userInfo['userId'].toString()
|
|
|
+ userId.value = userIdStr
|
|
|
+ roles.value = userInfo['roleNames'].toString()
|
|
|
+ }
|
|
|
loadStatusDictList()
|
|
|
loadData(true, false)
|
|
|
// 监听接单成功的事件,刷新列表
|
|
|
@@ -487,6 +618,7 @@ import {checkPermi} from '../../utils/storage'
|
|
|
|
|
|
// 组件卸载前清理事件监听
|
|
|
onBeforeUnmount(() => {
|
|
|
+ // 确保所有状态都被重置
|
|
|
refreshing.value = false
|
|
|
loading.value = false
|
|
|
isRefreshing.value = false
|
|
|
@@ -543,24 +675,6 @@ import {checkPermi} from '../../utils/storage'
|
|
|
padding: 30rpx;
|
|
|
}
|
|
|
|
|
|
- .item-header {
|
|
|
- flex-direction: row;
|
|
|
- align-items: center;
|
|
|
- margin-bottom: 16rpx;
|
|
|
-
|
|
|
- .item-title {
|
|
|
- flex: 1;
|
|
|
- font-size: 32rpx;
|
|
|
- color: #333333;
|
|
|
- font-weight: bold;
|
|
|
- }
|
|
|
-
|
|
|
- .detail-link {
|
|
|
- font-size: 28rpx;
|
|
|
- color: #999999;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
.item-header {
|
|
|
flex-direction: row;
|
|
|
align-items: flex-start;
|
|
|
@@ -690,7 +804,12 @@ import {checkPermi} from '../../utils/storage'
|
|
|
padding: 5px 15px;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+.btn-group {
|
|
|
+ flex-direction: row;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: flex-end;
|
|
|
+ margin-top: 20rpx;
|
|
|
+}
|
|
|
// /* 超时 */
|
|
|
// .status-overdue {
|
|
|
// background-color: #fff2f0;
|