|
|
@@ -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[]>([])
|
|
|
@@ -90,34 +121,55 @@ import {checkPermi} from '../../utils/storage'
|
|
|
|
|
|
// 添加字典加载状态
|
|
|
const dictLoaded = ref<boolean>(false)
|
|
|
-
|
|
|
+
|
|
|
+ // 添加防重复请求的标志位
|
|
|
+ const isSearching = ref<boolean>(false)
|
|
|
+ // 添加防重复刷新的标志
|
|
|
+ const isRefreshing = ref<boolean>(false)
|
|
|
+ // 添加刷新时间戳,用于防抖
|
|
|
+ const lastRefreshTime = ref<number>(0)
|
|
|
+
|
|
|
const getOrderStatus = (item: any | null): string => {
|
|
|
if (item == null) return ''
|
|
|
const orderItem = item as acceptOrderInfo
|
|
|
return orderItem.workOrderStatus ?? ''
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 方法:判断当前工单是否显示操作按钮(基于 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)
|
|
|
}
|
|
|
@@ -164,23 +216,50 @@ import {checkPermi} from '../../utils/storage'
|
|
|
}
|
|
|
|
|
|
// 加载列表数据
|
|
|
- const loadData = async (isRefresh: boolean | null): Promise<void> => {
|
|
|
+ const loadData = async (isRefresh: boolean | null, disablePullDown: boolean | null): Promise<void> => {
|
|
|
+ // 防止重复请求的核心机制
|
|
|
if (loading.value) {
|
|
|
- // 如果正在加载,直接重置刷新状态
|
|
|
- refreshing.value = false
|
|
|
+ // 确保刷新状态最终被重置,防止卡死
|
|
|
+ if (isRefresh != true) {
|
|
|
+ refreshing.value = false;
|
|
|
+ }
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- try {
|
|
|
- loading.value = true
|
|
|
+ const shouldRefresh = isRefresh != null ? isRefresh : false
|
|
|
+ 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
|
|
|
+ // 即使禁用下拉刷新,也要确保刷新状态最终被重置
|
|
|
+ refreshing.value = false
|
|
|
+ } else {
|
|
|
+ // 对于加载更多操作,不需要显示下拉刷新状态
|
|
|
+ refreshing.value = false;
|
|
|
+ }
|
|
|
|
|
|
+ try {
|
|
|
// 处理默认值
|
|
|
- const shouldRefresh = isRefresh != null ? isRefresh : false
|
|
|
-
|
|
|
- if (shouldRefresh) {
|
|
|
- page.value = 1
|
|
|
- }
|
|
|
- // 调用 API,传递关键字参数
|
|
|
const searchKeyword = keyword.value.length > 0 ? keyword.value : null
|
|
|
|
|
|
const result = await pendingList(page.value, pageSize, searchKeyword)
|
|
|
@@ -249,22 +328,20 @@ import {checkPermi} from '../../utils/storage'
|
|
|
})
|
|
|
} finally {
|
|
|
loading.value = false
|
|
|
- // #ifdef WEB
|
|
|
- // Web 平台立即重置
|
|
|
- refreshing.value = false
|
|
|
- // #endif
|
|
|
- // #ifndef WEB
|
|
|
- // App 平台延迟重置刷新状态,确保 UI 更新
|
|
|
- setTimeout(() => {
|
|
|
- refreshing.value = false
|
|
|
- }, 100)
|
|
|
- // #endif
|
|
|
+ // 清除超时定时器
|
|
|
+ if (refreshTimeout != null) {
|
|
|
+ clearTimeout(refreshTimeout);
|
|
|
+ }
|
|
|
+ // 确保刷新状态能结束
|
|
|
+ if (shouldRefresh) {
|
|
|
+ refreshing.value = false;
|
|
|
+ // 使用setTimeout确保状态彻底重置
|
|
|
+ setTimeout(() => {
|
|
|
+ isRefreshing.value = false;
|
|
|
+ refreshing.value = false; // 再次确保刷新状态被重置
|
|
|
+ }, 50);
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
- // #ifdef WEB
|
|
|
- // Web 平台额外确保重置
|
|
|
- refreshing.value = false
|
|
|
- // #endif
|
|
|
}
|
|
|
|
|
|
// 辅助函数:从 any 类型提取属性
|
|
|
@@ -285,12 +362,12 @@ import {checkPermi} from '../../utils/storage'
|
|
|
const orderInfoItem = item as acceptOrderInfo
|
|
|
return orderInfoItem.pcsDeviceName
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 根据状态显示不同的时间
|
|
|
const getDisplayTime = (item: any | null): string|null => {
|
|
|
if (item == null) return null
|
|
|
const orderInfoItem = item as acceptOrderInfo
|
|
|
-
|
|
|
+
|
|
|
// 如果是"待接单"状态,显示派单时间
|
|
|
if (orderInfoItem.workOrderStatus == 'assigned') {
|
|
|
return '下发时间:' + orderInfoItem.assignTime
|
|
|
@@ -308,7 +385,7 @@ import {checkPermi} from '../../utils/storage'
|
|
|
} else if(orderInfoItem.workOrderStatus == 'completed') {
|
|
|
return '结单时间:' + orderInfoItem.updateTime
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 默认显示创建时间
|
|
|
return '创建时间:' + orderInfoItem.createTime
|
|
|
}
|
|
|
@@ -343,8 +420,63 @@ import {checkPermi} from '../../utils/storage'
|
|
|
|
|
|
// 下拉刷新
|
|
|
const handleRefresh = async (): Promise<void> => {
|
|
|
- refreshing.value = true
|
|
|
- await loadData(true as boolean | null)
|
|
|
+ console.log("handleRefresh被触发")
|
|
|
+ console.log("loading.value===",loading.value)
|
|
|
+ console.log("isRefreshing.value===",isRefreshing.value)
|
|
|
+
|
|
|
+ // 防抖处理,避免频繁触发
|
|
|
+ const now = Date.now();
|
|
|
+ if (now - lastRefreshTime.value < 1000) {
|
|
|
+ console.log("刷新操作过于频繁,忽略本次触发");
|
|
|
+ refreshing.value = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ lastRefreshTime.value = now;
|
|
|
+
|
|
|
+ // 添加防重复调用检查
|
|
|
+ if (loading.value || isRefreshing.value) {
|
|
|
+ // 如果已经在加载或正在刷新,直接重置刷新状态
|
|
|
+ refreshing.value = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log("loading.value1===",loading.value)
|
|
|
+ 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); // 使用默认的下拉刷新行为
|
|
|
+ } catch (error) {
|
|
|
+ console.error('刷新失败:', error);
|
|
|
+ refreshing.value = false;
|
|
|
+ isRefreshing.value = false;
|
|
|
+ } finally {
|
|
|
+ clearTimeout(refreshTimeout);
|
|
|
+ // 确保刷新状态最终被重置
|
|
|
+ refreshing.value = false;
|
|
|
+ isRefreshing.value = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 额外的保险机制,确保在一定时间后重置刷新标志
|
|
|
+ setTimeout(() => {
|
|
|
+ refreshing.value = false;
|
|
|
+ isRefreshing.value = false;
|
|
|
+ }, 200) // 延迟重置,确保状态完全更新
|
|
|
}
|
|
|
|
|
|
// 加载更多
|
|
|
@@ -353,23 +485,74 @@ import {checkPermi} from '../../utils/storage'
|
|
|
return
|
|
|
}
|
|
|
page.value++
|
|
|
- loadData(false as boolean | null)
|
|
|
+ loadData(false, false) // 加载更多时不涉及下拉刷新动画
|
|
|
}
|
|
|
|
|
|
// 搜索
|
|
|
const handleSearch = (): void => {
|
|
|
+ // 添加防重复调用检查
|
|
|
+ if (loading.value) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 添加防重复请求检查
|
|
|
+ if (isSearching.value) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ isSearching.value = true
|
|
|
page.value = 1
|
|
|
- loadData(true as boolean | null)
|
|
|
+ loadData(true, true) // 状态切换时禁用下拉刷新动画
|
|
|
+
|
|
|
+ // 延迟重置标志位,确保请求发送后才允许下一次搜索
|
|
|
+ setTimeout(() => {
|
|
|
+ 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({
|
|
|
@@ -380,36 +563,65 @@ 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}`
|
|
|
})
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
|
|
|
// 清空搜索
|
|
|
const clearSearch = (): void => {
|
|
|
+ // 添加防重复调用检查
|
|
|
+ if (loading.value) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 添加防重复请求检查
|
|
|
+ if (isSearching.value) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ isSearching.value = true
|
|
|
keyword.value = ""
|
|
|
page.value = 1
|
|
|
- loadData(true)
|
|
|
+ loadData(true, true) // 状态切换时禁用下拉刷新动画
|
|
|
+
|
|
|
+ // 延迟重置标志位,确保请求发送后才允许下一次搜索
|
|
|
+ setTimeout(() => {
|
|
|
+ isSearching.value = false
|
|
|
+ }, 100)
|
|
|
}
|
|
|
|
|
|
// 初始化
|
|
|
onMounted(() => {
|
|
|
+ const userInfo = getUserInfo()
|
|
|
+ if (userInfo != null) {
|
|
|
+ const userIdStr = userInfo['userId'].toString()
|
|
|
+ userId.value = userIdStr
|
|
|
+ roles.value = userInfo['roleNames'].toString()
|
|
|
+ }
|
|
|
loadStatusDictList()
|
|
|
- loadData(true as boolean | null)
|
|
|
+ loadData(true, false)
|
|
|
// 监听接单成功的事件,刷新列表
|
|
|
uni.$on('refreshOrderList', () => {
|
|
|
page.value = 1
|
|
|
- loadData(true)
|
|
|
+ loadData(true, false)
|
|
|
})
|
|
|
})
|
|
|
|
|
|
// 组件卸载前清理事件监听
|
|
|
onBeforeUnmount(() => {
|
|
|
+ // 确保所有状态都被重置
|
|
|
refreshing.value = false
|
|
|
loading.value = false
|
|
|
+ isRefreshing.value = false
|
|
|
// 移除事件监听
|
|
|
uni.$off('refreshOrderList',{})
|
|
|
})
|
|
|
@@ -463,154 +675,142 @@ import {checkPermi} from '../../utils/storage'
|
|
|
padding: 30rpx;
|
|
|
}
|
|
|
|
|
|
- .item-header {
|
|
|
- flex-direction: row;
|
|
|
- align-items: center;
|
|
|
- margin-bottom: 16rpx;
|
|
|
+ .item-header {
|
|
|
+ flex-direction: row;
|
|
|
+ align-items: flex-start;
|
|
|
+ margin-bottom: 16rpx;
|
|
|
+ justify-content: space-between;
|
|
|
+
|
|
|
+ .item-title {
|
|
|
+ font-size: 30rpx;
|
|
|
+ color: #333333;
|
|
|
+ font-weight: bold;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ flex: 0 1 75%;
|
|
|
+ min-width: 0;
|
|
|
+ }
|
|
|
|
|
|
- .item-title {
|
|
|
- flex: 1;
|
|
|
- font-size: 32rpx;
|
|
|
- color: #333333;
|
|
|
- font-weight: bold;
|
|
|
- }
|
|
|
+ .info-value {
|
|
|
+ font-size: 28rpx;
|
|
|
+ color: #999999;
|
|
|
+ margin-left: auto;
|
|
|
+ flex: 0 0 auto;
|
|
|
+ white-space: nowrap;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .info-row {
|
|
|
+ flex-direction: row;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+
|
|
|
+ .info-label {
|
|
|
+ font-size: 26rpx;
|
|
|
+ color: #666;
|
|
|
+ }
|
|
|
|
|
|
- .detail-link {
|
|
|
- font-size: 28rpx;
|
|
|
- color: #999999;
|
|
|
- }
|
|
|
- }
|
|
|
+ .info-value {
|
|
|
+ font-size: 26rpx;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .text-gray{
|
|
|
+ font-size: 26rpx;
|
|
|
+ color: #666;
|
|
|
+ }
|
|
|
|
|
|
-.item-header {
|
|
|
- flex-direction: row;
|
|
|
- align-items: flex-start;
|
|
|
- margin-bottom: 16rpx;
|
|
|
-
|
|
|
- .item-title {
|
|
|
- font-size: 30rpx;
|
|
|
- color: #333333;
|
|
|
- font-weight: bold;
|
|
|
- flex-wrap: wrap;
|
|
|
- flex: 0 1 80%;
|
|
|
- min-width: 0;
|
|
|
- }
|
|
|
-
|
|
|
- .info-value {
|
|
|
- font-size: 28rpx;
|
|
|
- color: #999999;
|
|
|
- margin-left: auto;
|
|
|
- flex: 0 0 auto;
|
|
|
- white-space: nowrap;
|
|
|
- }
|
|
|
-}
|
|
|
-.info-row {
|
|
|
- flex-direction: row;
|
|
|
- justify-content: space-between;
|
|
|
- align-items: center;
|
|
|
-
|
|
|
- .info-label {
|
|
|
- font-size: 26rpx;
|
|
|
- color: #666;
|
|
|
- }
|
|
|
-
|
|
|
- .info-value {
|
|
|
- font-size: 26rpx;
|
|
|
- }
|
|
|
-}
|
|
|
-.text-gray{
|
|
|
- font-size: 26rpx;
|
|
|
- color: #666;
|
|
|
-}
|
|
|
-
|
|
|
-.status-tag {
|
|
|
- padding: 8rpx 20rpx;
|
|
|
- border-radius: 20rpx;
|
|
|
- font-size: 24rpx;
|
|
|
- white-space: nowrap;
|
|
|
- margin-left: 20rpx;
|
|
|
- border: 1rpx solid;
|
|
|
-}
|
|
|
-
|
|
|
-/* 待接单 */
|
|
|
-.status-assigned {
|
|
|
- background-color: #ebf5ff;
|
|
|
- color: #409eff;
|
|
|
- border-color: #d8ebff;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-/* 待结单 */
|
|
|
-.status-to_finish {
|
|
|
- background-color: #fff7e6;
|
|
|
- color: #fa8c16;
|
|
|
- border-color: #ffd591;
|
|
|
-}
|
|
|
-
|
|
|
-/* 待审批 */
|
|
|
-.status-to_approve {
|
|
|
- background-color: #fff7e6;
|
|
|
- color: #fa8c16;
|
|
|
- border-color: #ffd591;
|
|
|
-}
|
|
|
-
|
|
|
-/* 已挂起 */
|
|
|
-.status-suspended {
|
|
|
- background-color: #fff2f0;
|
|
|
- color: #ff4d4f;
|
|
|
- border-color: #ffccc7;
|
|
|
-}
|
|
|
-
|
|
|
-/* 已完成 */
|
|
|
-.status-completed {
|
|
|
- background-color: #f0f9eb;
|
|
|
- color: #5cb87a;
|
|
|
- border-color: #c2e7b0;
|
|
|
-}
|
|
|
-
|
|
|
-/* 待下发 */
|
|
|
-.status-to_issue {
|
|
|
- background-color: #f4f4f5;
|
|
|
- color: #909399;
|
|
|
- border-color: #e9e9eb;
|
|
|
-}
|
|
|
-
|
|
|
-/* 已归档 */
|
|
|
-.status-archived {
|
|
|
- background-color: #f0f9eb;
|
|
|
- color: #5cb87a;
|
|
|
- border-color: #c2e7b0;
|
|
|
-}
|
|
|
-
|
|
|
-/* 退回 */
|
|
|
-.status-return {
|
|
|
- background-color: #fff2f0;
|
|
|
- color: #ff4d4f;
|
|
|
- border-color: #ffccc7;
|
|
|
-}
|
|
|
-
|
|
|
-/* 退回 */
|
|
|
-.status-accept_return {
|
|
|
- background-color: #fff2f0;
|
|
|
- color: #ff4d4f;
|
|
|
- border-color: #ffccc7;
|
|
|
-}
|
|
|
-
|
|
|
-.btn-primary {
|
|
|
- z-index: 999;
|
|
|
- border-radius: 10rpx;
|
|
|
- font-size: 24rpx;
|
|
|
- // white-space: nowrap;
|
|
|
- margin-left: 20rpx;
|
|
|
- background-color: #165DFF;
|
|
|
- line-height: 45rpx;
|
|
|
- color: #ffffff;
|
|
|
- .btn-text{
|
|
|
- color: #ffffff;
|
|
|
+ .status-tag {
|
|
|
+ padding: 8rpx 20rpx;
|
|
|
+ border-radius: 20rpx;
|
|
|
font-size: 24rpx;
|
|
|
- padding: 5px 15px;
|
|
|
+ white-space: nowrap;
|
|
|
+ // margin-left: 20rpx;
|
|
|
+ border: 1rpx solid;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 待接单 */
|
|
|
+ .status-assigned {
|
|
|
+ background-color: #ebf5ff;
|
|
|
+ color: #409eff;
|
|
|
+ border-color: #d8ebff;
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
+
|
|
|
+ /* 待结单 */
|
|
|
+ .status-to_finish {
|
|
|
+ background-color: #fff7e6;
|
|
|
+ color: #fa8c16;
|
|
|
+ border-color: #ffd591;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 待审批 */
|
|
|
+ .status-to_approve {
|
|
|
+ background-color: #fff7e6;
|
|
|
+ color: #fa8c16;
|
|
|
+ border-color: #ffd591;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 已挂起 */
|
|
|
+ .status-suspended {
|
|
|
+ background-color: #fff2f0;
|
|
|
+ color: #ff4d4f;
|
|
|
+ border-color: #ffccc7;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 已完成 */
|
|
|
+ .status-completed {
|
|
|
+ background-color: #f0f9eb;
|
|
|
+ color: #5cb87a;
|
|
|
+ border-color: #c2e7b0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 待下发 */
|
|
|
+ .status-to_issue {
|
|
|
+ background-color: #f4f4f5;
|
|
|
+ color: #909399;
|
|
|
+ border-color: #e9e9eb;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 已归档 */
|
|
|
+ .status-archived {
|
|
|
+ background-color: #f0f9eb;
|
|
|
+ color: #5cb87a;
|
|
|
+ border-color: #c2e7b0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 退回 */
|
|
|
+ .status-return {
|
|
|
+ background-color: #fff2f0;
|
|
|
+ color: #ff4d4f;
|
|
|
+ border-color: #ffccc7;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 退回 */
|
|
|
+ .status-accept_return {
|
|
|
+ background-color: #fff2f0;
|
|
|
+ color: #ff4d4f;
|
|
|
+ border-color: #ffccc7;
|
|
|
+ }
|
|
|
+
|
|
|
+ .btn-primary {
|
|
|
+ z-index: 999;
|
|
|
+ border-radius: 10rpx;
|
|
|
+ font-size: 24rpx;
|
|
|
+ // white-space: nowrap;
|
|
|
+ margin-left: 20rpx;
|
|
|
+ background-color: #165DFF;
|
|
|
+ line-height: 45rpx;
|
|
|
+ color: #ffffff;
|
|
|
+ .btn-text{
|
|
|
+ color: #ffffff;
|
|
|
+ font-size: 24rpx;
|
|
|
+ padding: 5px 15px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .btn-group {
|
|
|
+ flex-direction: row;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: flex-end;
|
|
|
+ margin-top: 20rpx;
|
|
|
+ }
|
|
|
// /* 超时 */
|
|
|
// .status-overdue {
|
|
|
// background-color: #fff2f0;
|