Browse Source

feat(pms): 支持生产异常跳转日报筛选

- 为瑞都日报列表增加施工状态字典筛选
- 支持通过 nptName 路由参数设置施工状态
- 生产异常卡片支持点击跳转日报列表
- 跳转时同步当前异常类型和时间范围
- 保留异常原始值与中文显示名称
Zimo 1 week ago
parent
commit
41d3d7771d

+ 26 - 3
src/views/pms/iotrddailyreport/index.vue

@@ -2,7 +2,7 @@
 import { IotRdDailyReportApi } from '@/api/pms/iotrddailyreport'
 import { useTableComponents } from '@/components/ZmTable/useTableComponents'
 import { useUserStore } from '@/store/modules/user'
-import { DICT_TYPE, getDictOptions } from '@/utils/dict'
+import { DICT_TYPE, getDictOptions, getStrDictOptions } from '@/utils/dict'
 import { formatT, rangeShortcuts } from '@/utils/formatTime'
 import { useDebounceFn } from '@vueuse/core'
 import dayjs from 'dayjs'
@@ -29,6 +29,7 @@ interface Query {
   createTime?: string[]
   wellName?: string
   taskId?: number
+  rdStatus?: string
   pageNo: number
   pageSize: number
 }
@@ -53,13 +54,24 @@ const getRouteTaskName = () => {
   return typeof taskName === 'string' ? taskName : undefined
 }
 
+const getRouteRdStatus = () => {
+  const nptName = route.query.nptName
+
+  if (Array.isArray(nptName)) {
+    return nptName.find((item): item is string => typeof item === 'string')
+  }
+
+  return typeof nptName === 'string' ? nptName : undefined
+}
+
 const initQuery: Query = {
   pageNo: 1,
   pageSize: 10,
   deptId: route.query.deptId ? Number(route.query.deptId) : id,
   createTime: getRouteCreateTime(),
   taskName: getRouteTaskName(),
-  taskId: route.query.taskId ? Number(route.query.taskId) : undefined
+  taskId: route.query.taskId ? Number(route.query.taskId) : undefined,
+  rdStatus: getRouteRdStatus()
 }
 
 const query = ref<Query>({ ...initQuery })
@@ -109,6 +121,7 @@ const list = ref<ListItem[]>([])
 const total = ref(0)
 
 const loading = ref(false)
+const rdStatusOptions = getStrDictOptions(DICT_TYPE.PMS_PROJECT_RD_STATUS)
 
 const getReportDetailsDuration = (reportDetails: any[] = []) =>
   Number(reportDetails.reduce((sum, item) => sum + Number(item.duration || 0), 0).toFixed(2))
@@ -171,6 +184,7 @@ watch(
     () => query.value.deptId,
     () => query.value.contractName,
     () => query.value.taskName,
+    () => query.value.rdStatus,
     () => query.value.createTime
   ],
   () => {
@@ -180,11 +194,12 @@ watch(
 )
 
 watch(
-  () => [route.query.deptId, route.query.createTime, route.query.taskName],
+  () => [route.query.deptId, route.query.createTime, route.query.taskName, route.query.nptName],
   () => {
     query.value.deptId = route.query.deptId ? Number(route.query.deptId) : id
     query.value.createTime = getRouteCreateTime()
     query.value.taskName = getRouteTaskName()
+    query.value.rdStatus = getRouteRdStatus()
   }
 )
 
@@ -329,6 +344,14 @@ onMounted(() => {
             class="!w-300px max-w-full"
             :shortcuts="rangeShortcuts" />
         </el-form-item>
+        <el-form-item label="施工状态" prop="rdStatus">
+          <el-select
+            v-model="query.rdStatus"
+            :options="rdStatusOptions"
+            placeholder="请选择施工状态"
+            clearable
+            class="!w-180px" />
+        </el-form-item>
       </div>
       <el-form-item class="daily-report-actions shrink-0">
         <div class="flex flex-wrap items-center justify-end gap-3">

+ 20 - 3
src/views/pms/stat/rdkb/rd-exception-prompt.vue

@@ -9,9 +9,11 @@ type TimeRange = 'day' | 'month' | 'quarter' | 'year'
 
 type NptCountItem = {
   nptName: string
+  displayName: string
   teamCount: number
 }
 
+const router = useRouter()
 const activeTimeRange = ref<TimeRange>('day')
 const loading = ref(false)
 const productionList = ref<NptCountItem[]>([])
@@ -48,6 +50,16 @@ function getCreateTime(type: TimeRange) {
   return [start.format('YYYY-MM-DD HH:mm:ss'), end.format('YYYY-MM-DD HH:mm:ss')]
 }
 
+function handleProductionClick(item: NptCountItem) {
+  router.push({
+    name: 'IotRdDailyReport',
+    query: {
+      nptName: item.nptName,
+      createTime: getCreateTime(activeTimeRange.value)
+    }
+  })
+}
+
 async function loadData() {
   loading.value = true
   try {
@@ -57,7 +69,8 @@ async function loadData() {
 
     productionList.value = Array.isArray(res)
       ? res.map((item) => ({
-          nptName: getNptDisplayName(item.nptName),
+          nptName: item.nptName || '',
+          displayName: getNptDisplayName(item.nptName),
           teamCount: Number(item.teamCount || 0)
         }))
       : []
@@ -106,9 +119,13 @@ onMounted(() => {
           <div
             v-for="(item, index) in productionTopList"
             :key="item.nptName"
-            class="production-item">
+            class="production-item cursor-pointer"
+            role="button"
+            tabindex="0"
+            @click="handleProductionClick(item)"
+            @keyup.enter="handleProductionClick(item)">
             <span class="production-item__rank">{{ index + 1 }}</span>
-            <span class="production-item__name">{{ item.nptName }}</span>
+            <span class="production-item__name">{{ item.displayName }}</span>
             <span class="production-item__count">
               <span class="production-item__value">{{ item.teamCount }}</span>
               <span class="production-item__unit">个</span>