|
@@ -26,7 +26,7 @@
|
|
|
</view>
|
|
</view>
|
|
|
<text class="db-text">评分工单</text>
|
|
<text class="db-text">评分工单</text>
|
|
|
</view>
|
|
</view>
|
|
|
- <view class="db-box">
|
|
|
|
|
|
|
+ <view class="db-box" @click="navigateToOverdueOrders">
|
|
|
<view v-if="overdueCount > 0" class="badge"><text class="count">{{ overdueCount }}</text></view>
|
|
<view v-if="overdueCount > 0" class="badge"><text class="count">{{ overdueCount }}</text></view>
|
|
|
<view class="db-block">
|
|
<view class="db-block">
|
|
|
<view class="db-center-3">
|
|
<view class="db-center-3">
|
|
@@ -49,11 +49,14 @@
|
|
|
|
|
|
|
|
<!-- 即将超时工单列表 -->
|
|
<!-- 即将超时工单列表 -->
|
|
|
<view class="section-title-container" v-if="almostOverdueListData.length > 0">
|
|
<view class="section-title-container" v-if="almostOverdueListData.length > 0">
|
|
|
- <text class="section-title">即将超时工单</text>
|
|
|
|
|
|
|
+ <view class="section-header">
|
|
|
|
|
+ <text class="section-title">即将超时工单</text>
|
|
|
|
|
+ <text class="view-all" @click="navigateToAlmostOverdueOrders">查看全部</text>
|
|
|
|
|
+ </view>
|
|
|
</view>
|
|
</view>
|
|
|
<common-list
|
|
<common-list
|
|
|
v-if="almostOverdueListData.length > 0"
|
|
v-if="almostOverdueListData.length > 0"
|
|
|
- :dataList="almostOverdueListData"
|
|
|
|
|
|
|
+ :dataList="almostOverdueListData.slice(0, 2)"
|
|
|
:loading="almostOverdueLoading"
|
|
:loading="almostOverdueLoading"
|
|
|
:hasMore="false"
|
|
:hasMore="false"
|
|
|
:refresherEnabled="false"
|
|
:refresherEnabled="false"
|
|
@@ -64,24 +67,31 @@
|
|
|
<view class="list-item">
|
|
<view class="list-item">
|
|
|
<view class="item-container">
|
|
<view class="item-container">
|
|
|
<view class="item-header">
|
|
<view class="item-header">
|
|
|
- <text class="item-title">{{ getWorkOrderProjectNo(item) }}-{{ getPcsDeviceName(item) }}</text>
|
|
|
|
|
|
|
+ <text class="item-title">{{ getPcsDeviceName(item) }}-{{ getStationName(item) }}</text>
|
|
|
<!-- <text class="status-tag status-assigned">{{ getWorkOrderStatus(item) }}</text> -->
|
|
<!-- <text class="status-tag status-assigned">{{ getWorkOrderStatus(item) }}</text> -->
|
|
|
</view>
|
|
</view>
|
|
|
<view class="info-row">
|
|
<view class="info-row">
|
|
|
- <text class="text-gray">{{ getCreateTime(item) }}</text>
|
|
|
|
|
- <text class="text-gray">{{ getRemark(item) }}</text>
|
|
|
|
|
|
|
+ <text class="text-gray">工单编号:{{ getWorkOrderProjectNo(item) }}</text>
|
|
|
|
|
+ <text class="text-gray" :class="getRemarkClass(item)">{{ getRemark(item) }}</text>
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
+ <template #loadMore>
|
|
|
|
|
+ <view></view>
|
|
|
|
|
+ </template>
|
|
|
</common-list>
|
|
</common-list>
|
|
|
|
|
|
|
|
<!-- 超时工单列表 -->
|
|
<!-- 超时工单列表 -->
|
|
|
- <view class="section-title-container">
|
|
|
|
|
- <text class="section-title">超时工单</text>
|
|
|
|
|
|
|
+ <view class="section-title-container" v-if="overdueListData.length > 0">
|
|
|
|
|
+ <view class="section-header">
|
|
|
|
|
+ <text class="section-title">超时工单</text>
|
|
|
|
|
+ <text class="view-all" @click="navigateToOverdueOrders">查看全部</text>
|
|
|
|
|
+ </view>
|
|
|
</view>
|
|
</view>
|
|
|
<common-list
|
|
<common-list
|
|
|
- :dataList="overdueListData"
|
|
|
|
|
|
|
+ v-if="overdueListData.length > 0"
|
|
|
|
|
+ :dataList="overdueListData.slice(0, 2)"
|
|
|
:loading="overdueLoading"
|
|
:loading="overdueLoading"
|
|
|
:hasMore="false"
|
|
:hasMore="false"
|
|
|
:refresherEnabled="false"
|
|
:refresherEnabled="false"
|
|
@@ -92,16 +102,19 @@
|
|
|
<view class="list-item">
|
|
<view class="list-item">
|
|
|
<view class="item-container">
|
|
<view class="item-container">
|
|
|
<view class="item-header">
|
|
<view class="item-header">
|
|
|
- <text class="item-title">{{ getWorkOrderProjectNo(item) }}-{{ getPcsDeviceName(item) }}</text>
|
|
|
|
|
|
|
+ <text class="item-title">{{ getPcsDeviceName(item) }}-{{ getStationName(item) }}</text>
|
|
|
<!-- <text class="status-tag status-suspended">{{ getWorkOrderStatus(item) }}</text> -->
|
|
<!-- <text class="status-tag status-suspended">{{ getWorkOrderStatus(item) }}</text> -->
|
|
|
</view>
|
|
</view>
|
|
|
<view class="info-row">
|
|
<view class="info-row">
|
|
|
- <text class="text-gray">{{ getCreateTime(item) }}</text>
|
|
|
|
|
- <text class="text-gray">{{ getRemark(item) }}</text>
|
|
|
|
|
|
|
+ <text class="text-gray">工单编号:{{ getWorkOrderProjectNo(item) }}</text>
|
|
|
|
|
+ <text class="text-gray overdue-title">{{ getRemark(item) }}</text>
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
+ <template #loadMore>
|
|
|
|
|
+ <view></view>
|
|
|
|
|
+ </template>
|
|
|
</common-list>
|
|
</common-list>
|
|
|
|
|
|
|
|
</scroll-view>
|
|
</scroll-view>
|
|
@@ -117,6 +130,8 @@
|
|
|
import FlowChart from '../../components/index/flow-chart/flow-chart.uvue'
|
|
import FlowChart from '../../components/index/flow-chart/flow-chart.uvue'
|
|
|
import { getOrderList, almostOverdueList, overdueList } from '../../api/order/list'
|
|
import { getOrderList, almostOverdueList, overdueList } from '../../api/order/list'
|
|
|
import { listMobileOrderScores } from '../../api/score/index'
|
|
import { listMobileOrderScores } from '../../api/score/index'
|
|
|
|
|
+ import type { SysDictData } from '../../types/dict'
|
|
|
|
|
+ import { getDictDataByType } from '../../api/dict/index'
|
|
|
|
|
|
|
|
// 用户名
|
|
// 用户名
|
|
|
const userName = ref<string>('用户')
|
|
const userName = ref<string>('用户')
|
|
@@ -137,6 +152,52 @@
|
|
|
// 超时工单列表
|
|
// 超时工单列表
|
|
|
const overdueListData = ref<any[]>([])
|
|
const overdueListData = ref<any[]>([])
|
|
|
const overdueLoading = ref<boolean>(false)
|
|
const overdueLoading = ref<boolean>(false)
|
|
|
|
|
+
|
|
|
|
|
+ // 维保类型字典列表
|
|
|
|
|
+ const inspectionTypeList = ref<SysDictData[]>([])
|
|
|
|
|
+ // 添加字典加载状态
|
|
|
|
|
+ const dictLoaded = ref<boolean>(false)
|
|
|
|
|
+
|
|
|
|
|
+ // 获取工单状态字典列表
|
|
|
|
|
+ const loadStatusDictList = async (): Promise<void> => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ const result = await getDictDataByType('gxt_inspection_type')
|
|
|
|
|
+ const resultObj = result as UTSJSONObject
|
|
|
|
|
+
|
|
|
|
|
+ if (resultObj['code'] == 200) {
|
|
|
|
|
+ const data = resultObj['data'] as any[]
|
|
|
|
|
+ const dictData: SysDictData[] = []
|
|
|
|
|
+
|
|
|
|
|
+ if (data.length > 0) {
|
|
|
|
|
+ for (let i = 0; i < data.length; i++) {
|
|
|
|
|
+ const item = data[i] as UTSJSONObject
|
|
|
|
|
+ // 只提取需要的字段
|
|
|
|
|
+ const dictItem: SysDictData = {
|
|
|
|
|
+ dictValue: item['dictValue'] as string | null,
|
|
|
|
|
+ dictLabel: item['dictLabel'] as string | null,
|
|
|
|
|
+ dictCode: null,
|
|
|
|
|
+ dictSort: null,
|
|
|
|
|
+ dictType: null,
|
|
|
|
|
+ cssClass: null,
|
|
|
|
|
+ listClass: null,
|
|
|
|
|
+ isDefault: null,
|
|
|
|
|
+ status: null,
|
|
|
|
|
+ default: null,
|
|
|
|
|
+ createTime: null,
|
|
|
|
|
+ remark: null
|
|
|
|
|
+ }
|
|
|
|
|
+ dictData.push(dictItem)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ inspectionTypeList.value = dictData
|
|
|
|
|
+ dictLoaded.value = true
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (e: any) {
|
|
|
|
|
+ console.error('获取工单状态字典失败:', e.message)
|
|
|
|
|
+ dictLoaded.value = true
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
// 获取待接单数量
|
|
// 获取待接单数量
|
|
|
const loadAssignedCount = async (): Promise<void> => {
|
|
const loadAssignedCount = async (): Promise<void> => {
|
|
@@ -177,7 +238,7 @@
|
|
|
// 获取超时工单数量
|
|
// 获取超时工单数量
|
|
|
const loadOverdueCount = async (): Promise<void> => {
|
|
const loadOverdueCount = async (): Promise<void> => {
|
|
|
try {
|
|
try {
|
|
|
- const result = await overdueList(1, 1) // 只需要获取总数,不需要具体数据
|
|
|
|
|
|
|
+ const result = await overdueList(1, 1, '') // 只需要获取总数,不需要具体数据
|
|
|
const resultObj = result as UTSJSONObject
|
|
const resultObj = result as UTSJSONObject
|
|
|
|
|
|
|
|
if (resultObj['code'] == 200) {
|
|
if (resultObj['code'] == 200) {
|
|
@@ -193,7 +254,7 @@
|
|
|
const loadAlmostOverdueList = async (): Promise<void> => {
|
|
const loadAlmostOverdueList = async (): Promise<void> => {
|
|
|
try {
|
|
try {
|
|
|
almostOverdueLoading.value = true
|
|
almostOverdueLoading.value = true
|
|
|
- const result = await almostOverdueList(1, 5) // 获取前5条
|
|
|
|
|
|
|
+ const result = await almostOverdueList(1, 2, '') // 获取前2条
|
|
|
const resultObj = result as UTSJSONObject
|
|
const resultObj = result as UTSJSONObject
|
|
|
|
|
|
|
|
if (resultObj['code'] == 200) {
|
|
if (resultObj['code'] == 200) {
|
|
@@ -211,7 +272,7 @@
|
|
|
const loadOverdueList = async (): Promise<void> => {
|
|
const loadOverdueList = async (): Promise<void> => {
|
|
|
try {
|
|
try {
|
|
|
overdueLoading.value = true
|
|
overdueLoading.value = true
|
|
|
- const result = await overdueList(1, 5) // 获取前5条
|
|
|
|
|
|
|
+ const result = await overdueList(1, 2, '') // 获取前2条
|
|
|
const resultObj = result as UTSJSONObject
|
|
const resultObj = result as UTSJSONObject
|
|
|
|
|
|
|
|
if (resultObj['code'] == 200) {
|
|
if (resultObj['code'] == 200) {
|
|
@@ -250,6 +311,22 @@
|
|
|
// }, 500)
|
|
// }, 500)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // 跳转到超时工单列表
|
|
|
|
|
+ const navigateToOverdueOrders = (): void => {
|
|
|
|
|
+ // 跳转到超时工单页面
|
|
|
|
|
+ uni.navigateTo({
|
|
|
|
|
+ url: '/pages/order/overdue'
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 跳转到即将超时工单列表
|
|
|
|
|
+ const navigateToAlmostOverdueOrders = (): void => {
|
|
|
|
|
+ // 跳转到即将超时工单页面
|
|
|
|
|
+ uni.navigateTo({
|
|
|
|
|
+ url: '/pages/order/almostOverdue'
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
const handleCreateChannel = (showToast : boolean) => {
|
|
const handleCreateChannel = (showToast : boolean) => {
|
|
|
// #ifdef APP-ANDROID
|
|
// #ifdef APP-ANDROID
|
|
|
const manager = uni.getPushChannelManager()
|
|
const manager = uni.getPushChannelManager()
|
|
@@ -345,6 +422,12 @@
|
|
|
return orderInfoItem['pcsDeviceName'] as string != null ? orderInfoItem['pcsDeviceName'] as string : ''
|
|
return orderInfoItem['pcsDeviceName'] as string != null ? orderInfoItem['pcsDeviceName'] as string : ''
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ const getStationName = (item: any | null): string | null=> {
|
|
|
|
|
+ if (item == null) return ''
|
|
|
|
|
+ const orderInfoItem = item as UTSJSONObject
|
|
|
|
|
+ return orderInfoItem['pcsStationName'] as string != null ? orderInfoItem['pcsStationName'] as string : ''
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
const getCreateTime = (item: any | null): string|null => {
|
|
const getCreateTime = (item: any | null): string|null => {
|
|
|
if (item == null) return null
|
|
if (item == null) return null
|
|
|
const orderInfoItem = item as UTSJSONObject
|
|
const orderInfoItem = item as UTSJSONObject
|
|
@@ -355,6 +438,55 @@
|
|
|
const orderInfoItem = item as UTSJSONObject
|
|
const orderInfoItem = item as UTSJSONObject
|
|
|
return orderInfoItem['remark'] as string != null ? orderInfoItem['remark'] as string : ''
|
|
return orderInfoItem['remark'] as string != null ? orderInfoItem['remark'] as string : ''
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // 根据剩余时间获取颜色类名
|
|
|
|
|
+ const getRemarkClass = (item: any | null): string => {
|
|
|
|
|
+ if (item == null) return ''
|
|
|
|
|
+ const orderInfoItem = item as UTSJSONObject
|
|
|
|
|
+ const remark = orderInfoItem['remark'] as string
|
|
|
|
|
+
|
|
|
|
|
+ if (remark == null || remark.length === 0) return ''
|
|
|
|
|
+
|
|
|
|
|
+ // 解析备注中的剩余时间(假设格式为包含数字和小时的字符串)
|
|
|
|
|
+ // 例如:"剩余时间:5小时" 或 "还剩10小时"
|
|
|
|
|
+ const timeMatch = remark.match(/(\d+(\.\d+)?)\s*(小时|时)/)
|
|
|
|
|
+
|
|
|
|
|
+ if (timeMatch != null && timeMatch.length > 1 && timeMatch[1] != null) {
|
|
|
|
|
+ const hours = parseFloat(timeMatch[1] as string)
|
|
|
|
|
+
|
|
|
|
|
+ if (hours < 6) {
|
|
|
|
|
+ return 'time-critical' // 红色
|
|
|
|
|
+ } else if (hours < 12) {
|
|
|
|
|
+ return 'time-warning' // 橙色
|
|
|
|
|
+ } else if (hours < 24) {
|
|
|
|
|
+ return 'time-notice' // 黄色
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return ''
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 辅助函数:从 any 类型提取属性
|
|
|
|
|
+ const getOrderType = (item: any | null): string => {
|
|
|
|
|
+ if (item == null) return ''
|
|
|
|
|
+ const orderInfoItem = item as UTSJSONObject
|
|
|
|
|
+ return orderInfoItem['orderType'] == 1?"维修工单":"维保工单";
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const getInspectionType = (item: any | null): string | null => {
|
|
|
|
|
+ if (item == null) return ''
|
|
|
|
|
+ const orderInfoItem = item as UTSJSONObject
|
|
|
|
|
+ const rawStatus = orderInfoItem['inspectionType']
|
|
|
|
|
+
|
|
|
|
|
+ if (rawStatus==null) return ''
|
|
|
|
|
+ // 如果字典尚未加载,返回原始值
|
|
|
|
|
+ if (!dictLoaded.value) {
|
|
|
|
|
+ return rawStatus
|
|
|
|
|
+ }
|
|
|
|
|
+ // 查找字典中对应的标签
|
|
|
|
|
+ const dictItem = inspectionTypeList.value.find(dict => dict.dictValue == rawStatus)
|
|
|
|
|
+ return dictItem!=null ? dictItem.dictLabel : rawStatus
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
// 即将超时工单点击事件
|
|
// 即将超时工单点击事件
|
|
|
const handleAlmostOverdueItemClick = (item: any, index: number): void => {
|
|
const handleAlmostOverdueItemClick = (item: any, index: number): void => {
|
|
@@ -480,12 +612,23 @@
|
|
|
font-size: 32rpx;
|
|
font-size: 32rpx;
|
|
|
color: #333333;
|
|
color: #333333;
|
|
|
font-weight: bold;
|
|
font-weight: bold;
|
|
|
- margin-bottom: 20rpx;
|
|
|
|
|
|
|
+ // margin-bottom: 20rpx;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.section-title-container {
|
|
.section-title-container {
|
|
|
padding: 20rpx 30rpx 10rpx 30rpx;
|
|
padding: 20rpx 30rpx 10rpx 30rpx;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ .section-header {
|
|
|
|
|
+ flex-direction: row;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .view-all {
|
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
|
+ color: #165dff;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
/* 图表区域 */
|
|
/* 图表区域 */
|
|
|
.chart-section {
|
|
.chart-section {
|
|
@@ -618,6 +761,19 @@
|
|
|
color: #666;
|
|
color: #666;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /* 剩余时间颜色样式 */
|
|
|
|
|
+ .time-critical {
|
|
|
|
|
+ color: #ff4d4f; /* 红色 */
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .time-warning {
|
|
|
|
|
+ color: #fa8c16; /* 橙色 */
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .time-notice {
|
|
|
|
|
+ color: #faad14; /* 黄色 */
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
.status-tag {
|
|
.status-tag {
|
|
|
padding: 8rpx 20rpx;
|
|
padding: 8rpx 20rpx;
|
|
|
border-radius: 20rpx;
|
|
border-radius: 20rpx;
|
|
@@ -627,6 +783,11 @@
|
|
|
border: 1rpx solid;
|
|
border: 1rpx solid;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /* 已超时工单标题红色样式 */
|
|
|
|
|
+ .overdue-title {
|
|
|
|
|
+ color: #ff4d4f;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/* 待接单 */
|
|
/* 待接单 */
|
|
|
.status-assigned {
|
|
.status-assigned {
|
|
|
background-color: #ebf5ff;
|
|
background-color: #ebf5ff;
|