Ver Código Fonte

Merge branch 'master' of http://39.164.159.226:3000/hnsh-smart-steward/smart-steward-mobile

chenxiaochao 3 semanas atrás
pai
commit
cad74acff6

+ 21 - 0
src/api/schedule/task.ts

@@ -0,0 +1,21 @@
1
+import { http } from '@/http/http'
2
+
3
+enum Api {
4
+  base = '/scheduleTasks/tasks',
5
+}
6
+
7
+export function transferTask(data: any) {
8
+  return http.put(`${Api.base}/forward`, data, {
9
+    successMessageMode: 'message',
10
+  })
11
+}
12
+// 关闭任务
13
+export function closeTask(data: any) {
14
+  return http.put(`${Api.base}/cancel`, data, {
15
+    successMessageMode: 'message',
16
+  })
17
+}
18
+
19
+export function getTaskDetail(id: number) {
20
+  return http.get(`${Api.base}/${id}`)
21
+}

+ 91 - 35
src/pages/schedule/details/index.vue

@@ -2,50 +2,82 @@
2 2
   <view class="details-box">
3 3
     <!-- 标题区域 -->
4 4
     <view class="details-box-title">
5
-      <view class="details-box-title-text">巡站日检 AI</view>
5
+      <view class="details-box-title-text">
6
+        巡站日检 AI
7
+      </view>
6 8
     </view>
7 9
 
8 10
     <!-- 标签区域 -->
9 11
     <view class="tags-box">
10
-      <view class="tag tag-mandatory">必做</view>
11
-      <view class="tag tag-authorize">可授权</view>
12
-      <view class="tag tag-time">按时完成</view>
12
+      <view class="tag tag-mandatory">
13
+        必做
14
+      </view>
15
+      <view class="tag tag-authorize">
16
+        可授权
17
+      </view>
18
+      <view class="tag tag-time">
19
+        按时完成
20
+      </view>
13 21
     </view>
14 22
 
15 23
     <!-- 任务描述 -->
16 24
     <view class="section">
17
-      <view class="section-title">任务描述</view>
25
+      <view class="section-title">
26
+        任务描述
27
+      </view>
18 28
       <view class="task-description">
19
-        <view class="task-item">1、每日到站第一事,巡视油站;</view>
20
-        <view class="task-item">2、了解人、财、物情况;</view>
21
-        <view class="task-item"
22
-          >3、可随手解决当场解决,其他后续跟进,直到解决;</view
23
-        >
24
-        <view class="task-item"
25
-          >4、检查标识识:AI的不需要人为判断异常,默认正常即可。</view
26
-        >
29
+        <view class="task-item">
30
+          1、每日到站第一事,巡视油站;
31
+        </view>
32
+        <view class="task-item">
33
+          2、了解人、财、物情况;
34
+        </view>
35
+        <view class="task-item">
36
+          3、可随手解决当场解决,其他后续跟进,直到解决;
37
+        </view>
38
+        <view class="task-item">
39
+          4、检查标识识:AI的不需要人为判断异常,默认正常即可。
40
+        </view>
27 41
       </view>
28 42
     </view>
29 43
 
30 44
     <!-- 标准指引 -->
31 45
     <view class="section">
32
-      <view class="section-title">标准指引</view>
46
+      <view class="section-title">
47
+        标准指引
48
+      </view>
33 49
       <view class="standard-guide">
34 50
         <view class="guide-item">
35
-          <view class="guide-label">执行人</view>
36
-          <view class="guide-value">李玫玮(站长)</view>
51
+          <view class="guide-label">
52
+            执行人
53
+          </view>
54
+          <view class="guide-value">
55
+            李玫玮(站长)
56
+          </view>
37 57
         </view>
38 58
         <view class="guide-item">
39
-          <view class="guide-label">计划时间</view>
40
-          <view class="guide-value">12月5日</view>
59
+          <view class="guide-label">
60
+            计划时间
61
+          </view>
62
+          <view class="guide-value">
63
+            12月5日
64
+          </view>
41 65
         </view>
42 66
         <view class="guide-item">
43
-          <view class="guide-label">任务时间</view>
44
-          <view class="guide-value">12月5日 00:00-12月5日 18:00</view>
67
+          <view class="guide-label">
68
+            任务时间
69
+          </view>
70
+          <view class="guide-value">
71
+            12月5日 00:00-12月5日 18:00
72
+          </view>
45 73
         </view>
46 74
         <view class="guide-item">
47
-          <view class="guide-label">完成时间</view>
48
-          <view class="guide-value">12月5日</view>
75
+          <view class="guide-label">
76
+            完成时间
77
+          </view>
78
+          <view class="guide-value">
79
+            12月5日
80
+          </view>
49 81
         </view>
50 82
       </view>
51 83
     </view>
@@ -57,19 +89,25 @@
57 89
         class="arrow"
58 90
         :name="isExpanded ? 'arrow-up' : 'arrow-down'"
59 91
         size="20px"
60
-      ></wd-icon>
92
+      />
61 93
     </view>
62 94
 
63 95
     <!-- 更多内容(默认隐藏) -->
64
-    <view class="more-content" v-if="isExpanded">
96
+    <view v-if="isExpanded" class="more-content">
65 97
       <view class="section">
66
-        <view class="section-title">注意事项</view>
98
+        <view class="section-title">
99
+          注意事项
100
+        </view>
67 101
         <view class="notice-content">
68
-          <view class="notice-item"
69
-            >• 巡视过程中请注意安全,佩戴好防护装备</view
70
-          >
71
-          <view class="notice-item">• 发现异常情况请及时记录并上报</view>
72
-          <view class="notice-item">• 确保所有检查项目都已完成并签字确认</view>
102
+          <view class="notice-item">
103
+            • 巡视过程中请注意安全,佩戴好防护装备
104
+          </view>
105
+          <view class="notice-item">
106
+            • 发现异常情况请及时记录并上报
107
+          </view>
108
+          <view class="notice-item">
109
+            • 确保所有检查项目都已完成并签字确认
110
+          </view>
73 111
         </view>
74 112
       </view>
75 113
     </view>
@@ -85,9 +123,12 @@
85 123
     </view>
86 124
   </view>
87 125
 </template>
126
+
88 127
 <script setup lang="ts">
89 128
 import { ref } from 'vue'
90
-import { useRouter } from 'vue-router'
129
+import { useRoute, useRouter } from 'vue-router'
130
+
131
+import { getTaskDetail } from '@/api/schedule/task'
91 132
 
92 133
 // 定义页面配置,注册路由
93 134
 definePage({
@@ -98,28 +139,43 @@ definePage({
98 139
 const isExpanded = ref(false)
99 140
 const router = useRouter()
100 141
 
142
+const route = useRoute()
143
+const taskId = ref(Number(route.params.id))
144
+
101 145
 // 切换更多内容显示/隐藏
102
-const toggleMore = () => {
146
+function toggleMore() {
103 147
   isExpanded.value = !isExpanded.value
104 148
 }
105 149
 
106 150
 // 查看详情按钮点击事件
107
-const viewDetails1 = () => {
151
+function viewDetails1() {
108 152
   uni.navigateTo({
109 153
     url: '/pages/schedule/details/taskmanagement/index1',
110 154
   })
111 155
 }
112 156
 // 查看详情按钮点击事件2
113
-const viewDetails2 = () => {
157
+function viewDetails2() {
114 158
   uni.navigateTo({
115 159
     url: '/pages/schedule/details/taskmanagement/index2',
116 160
   })
117 161
 }
118
-const viewDetails3 = () => {
162
+function viewDetails3() {
119 163
   uni.navigateTo({
120 164
     url: '/pages/schedule/details/taskdetails/index',
121 165
   })
122 166
 }
167
+
168
+async function init() {
169
+  const res = await getTaskDetail(taskId.value)
170
+  taskInfo.value = res
171
+  if (!taskInfo.value.status) {
172
+    taskInfo.value.status = 0
173
+  }
174
+}
175
+
176
+onMounted(async () => {
177
+  await init()
178
+})
123 179
 </script>
124 180
 
125 181
 <style lang="scss" scoped>

+ 96 - 60
src/pages/schedule/view/components/day/index.vue

@@ -1,7 +1,7 @@
1 1
 <script setup lang="ts">
2 2
 // @ts-ignore
3
-import { ref, computed, defineEmits, onMounted, defineProps, watch } from 'vue'
4
-const emit = defineEmits(['handletabs'])
3
+import { computed, defineEmits, defineProps, onMounted, ref, watch } from 'vue'
4
+
5 5
 const props = defineProps({
6 6
   overduedaylist: {
7 7
     type: Array,
@@ -16,7 +16,8 @@ const props = defineProps({
16 16
     default: '',
17 17
   },
18 18
 })
19
-//props.selectedDate:Thu Jan 29 2026 18:47:27 GMT+0800 (中国标准时间)
19
+const emit = defineEmits(['handletabs'])
20
+// props.selectedDate:Thu Jan 29 2026 18:47:27 GMT+0800 (中国标准时间)
20 21
 // console.log(props.selectedDate)
21 22
 // console.log(new Date(props.selectedDate))
22 23
 watch(
@@ -25,7 +26,7 @@ watch(
25 26
     if (newVal) {
26 27
       console.log(newVal)
27 28
     }
28
-  }
29
+  },
29 30
 )
30 31
 
31 32
 const tab = ref<string>('全部')
@@ -67,7 +68,7 @@ const overduelist = computed(() => {
67 68
         const currentDate = new Date(
68 69
           now.getFullYear(),
69 70
           now.getMonth(),
70
-          now.getDate()
71
+          now.getDate(),
71 72
         )
72 73
 
73 74
         // 解析任务截止日期
@@ -75,13 +76,14 @@ const overduelist = computed(() => {
75 76
         const deadlineDate = new Date(
76 77
           taskDate.getFullYear(),
77 78
           taskDate.getMonth(),
78
-          taskDate.getDate()
79
+          taskDate.getDate(),
79 80
         )
80 81
 
81 82
         // 计算天数差(毫秒转天数)
82 83
         const timeDiff = currentDate.getTime() - deadlineDate.getTime()
83 84
         overduedays = Math.ceil(timeDiff / (1000 * 3600 * 24))
84
-      } catch (error) {
85
+      }
86
+      catch (error) {
85 87
         console.error('日期解析错误:', error)
86 88
         overduedays = 0
87 89
       }
@@ -95,7 +97,8 @@ const overduelist = computed(() => {
95 97
 
96 98
 // 今日任务
97 99
 const todaylist = computed(() => {
98
-  if (!props.selectedDate || props.todoaskslist.length === 0) return []
100
+  if (!props.selectedDate || props.todoaskslist.length === 0)
101
+    return []
99 102
   // 解析选中日期,处理不同格式
100 103
   let selected: Date
101 104
   try {
@@ -106,15 +109,18 @@ const todaylist = computed(() => {
106 109
         // @ts-ignore
107 110
         const [year, month, day] = props.selectedDate.split('-').map(Number)
108 111
         selected = new Date(year, month - 1, day)
109
-      } else {
112
+      }
113
+      else {
110 114
         // 其他字符串格式,直接转换
111 115
         selected = new Date(props.selectedDate)
112 116
       }
113
-    } else {
117
+    }
118
+    else {
114 119
       // 已经是 Date 对象
115 120
       selected = new Date(props.selectedDate)
116 121
     }
117
-  } catch (error) {
122
+  }
123
+  catch (error) {
118 124
     console.error('选中日期解析错误:', error)
119 125
     selected = new Date() // 失败时使用当前日期
120 126
   }
@@ -125,16 +131,18 @@ const todaylist = computed(() => {
125 131
 
126 132
   return props.todoaskslist
127 133
     .filter((item: any) => {
128
-      if (!item.displayDate) return false
134
+      if (!item.displayDate)
135
+        return false
129 136
       try {
130 137
         const taskDate = new Date(item.displayDate)
131 138
         return (
132
-          taskDate.getFullYear() === selectedYear &&
133
-          taskDate.getMonth() === selectedMonth &&
134
-          taskDate.getDate() === selectedDay &&
135
-          item.isOverdue !== '1' // 排除逾期任务
139
+          taskDate.getFullYear() === selectedYear
140
+          && taskDate.getMonth() === selectedMonth
141
+          && taskDate.getDate() === selectedDay
142
+          && item.isOverdue !== '1' // 排除逾期任务
136 143
         )
137
-      } catch (error) {
144
+      }
145
+      catch (error) {
138 146
         console.error('任务日期解析错误:', error)
139 147
         return false
140 148
       }
@@ -149,7 +157,7 @@ const todaylist = computed(() => {
149 157
           // 计算剩余时间(毫秒转天、小时、分钟)
150 158
           const days = Math.floor(timeDiff / (1000 * 3600 * 24))
151 159
           const hours = Math.floor(
152
-            (timeDiff % (1000 * 3600 * 24)) / (1000 * 3600)
160
+            (timeDiff % (1000 * 3600 * 24)) / (1000 * 3600),
153 161
           )
154 162
           const minutes = Math.floor((timeDiff % (1000 * 3600)) / (1000 * 60))
155 163
 
@@ -179,24 +187,29 @@ const todaylist = computed(() => {
179 187
             remainingTime.dayobj.day += `还剩${days}天截止`
180 188
             remainingTime.dayobj.topbackcolor = '#86909C'
181 189
             remainingTime.dayobj.mainbackcolor = '#F1F1F1'
182
-          } else if (days > 0) {
190
+          }
191
+          else if (days > 0) {
183 192
             remainingTime.dayobj.day += `还剩${days}天截止`
184 193
             if (days >= 30) {
185 194
               remainingTime.dayobj.topbackcolor = '#86909C'
186 195
               remainingTime.dayobj.mainbackcolor = '#F1F1F1'
187
-            } else {
196
+            }
197
+            else {
188 198
               remainingTime.dayobj.topbackcolor = '#215ACD'
189 199
               remainingTime.dayobj.mainbackcolor = '#E4EDFF'
190 200
             }
191
-          } else if (hours > 0) {
201
+          }
202
+          else if (hours > 0) {
192 203
             remainingTime.hours.hour += `还剩${hours}小时截止`
193 204
             remainingTime.hours.topbackcolor = '#FF9428'
194 205
             remainingTime.hours.mainbackcolor = '#FFEAD6'
195
-          } else if (minutes > 0) {
206
+          }
207
+          else if (minutes > 0) {
196 208
             remainingTime.minutes.minute += `还剩${minutes}分钟截止`
197 209
             remainingTime.minutes.topbackcolor = '#FF9428'
198 210
             remainingTime.minutes.mainbackcolor = '#FFEAD6'
199
-          } else {
211
+          }
212
+          else {
200 213
             remainingTime.default.topbackcolor = '#339169'
201 214
             remainingTime.default.mainbackcolor = '#D6EFE6'
202 215
           }
@@ -205,7 +218,8 @@ const todaylist = computed(() => {
205 218
             remainingTime,
206 219
             timeDiff,
207 220
           }
208
-        } catch (error) {
221
+        }
222
+        catch (error) {
209 223
           console.error('日期解析错误:', error)
210 224
           return {
211 225
             ...item,
@@ -221,7 +235,8 @@ const todaylist = computed(() => {
221 235
 
222 236
 // 明日任务列表
223 237
 const tomorrowlist = computed(() => {
224
-  if (!props.selectedDate || props.todoaskslist.length === 0) return []
238
+  if (!props.selectedDate || props.todoaskslist.length === 0)
239
+    return []
225 240
 
226 241
   // 解析选中日期,处理不同格式
227 242
   let selected: Date
@@ -233,15 +248,18 @@ const tomorrowlist = computed(() => {
233 248
         // @ts-ignore
234 249
         const [year, month, day] = props.selectedDate.split('-').map(Number)
235 250
         selected = new Date(year, month - 1, day)
236
-      } else {
251
+      }
252
+      else {
237 253
         // 其他字符串格式,直接转换
238 254
         selected = new Date(props.selectedDate)
239 255
       }
240
-    } else {
256
+    }
257
+    else {
241 258
       // 已经是 Date 对象
242 259
       selected = new Date(props.selectedDate)
243 260
     }
244
-  } catch (error) {
261
+  }
262
+  catch (error) {
245 263
     console.error('选中日期解析错误:', error)
246 264
     selected = new Date() // 失败时使用当前日期
247 265
   }
@@ -256,16 +274,18 @@ const tomorrowlist = computed(() => {
256 274
 
257 275
   return props.todoaskslist
258 276
     .filter((item: any) => {
259
-      if (!item.displayDate) return false
277
+      if (!item.displayDate)
278
+        return false
260 279
       try {
261 280
         const taskDate = new Date(item.displayDate)
262 281
         return (
263
-          taskDate.getFullYear() === tomorrowYear &&
264
-          taskDate.getMonth() === tomorrowMonth &&
265
-          taskDate.getDate() === tomorrowDay &&
266
-          item.isOverdue !== '1' // 排除逾期任务
282
+          taskDate.getFullYear() === tomorrowYear
283
+          && taskDate.getMonth() === tomorrowMonth
284
+          && taskDate.getDate() === tomorrowDay
285
+          && item.isOverdue !== '1' // 排除逾期任务
267 286
         )
268
-      } catch (error) {
287
+      }
288
+      catch (error) {
269 289
         console.error('任务日期解析错误:', error)
270 290
         return false
271 291
       }
@@ -280,7 +300,7 @@ const tomorrowlist = computed(() => {
280 300
           // 计算剩余时间(毫秒转天、小时、分钟)
281 301
           const days = Math.floor(timeDiff / (1000 * 3600 * 24))
282 302
           const hours = Math.floor(
283
-            (timeDiff % (1000 * 3600 * 24)) / (1000 * 3600)
303
+            (timeDiff % (1000 * 3600 * 24)) / (1000 * 3600),
284 304
           )
285 305
           const minutes = Math.floor((timeDiff % (1000 * 3600)) / (1000 * 60))
286 306
 
@@ -311,19 +331,23 @@ const tomorrowlist = computed(() => {
311 331
             if (days >= 30) {
312 332
               remainingTime.dayobj.topbackcolor = '#86909C'
313 333
               remainingTime.dayobj.mainbackcolor = '#F1F1F1'
314
-            } else {
334
+            }
335
+            else {
315 336
               remainingTime.dayobj.topbackcolor = '#215ACD'
316 337
               remainingTime.dayobj.mainbackcolor = '#E4EDFF'
317 338
             }
318
-          } else if (hours > 0) {
339
+          }
340
+          else if (hours > 0) {
319 341
             remainingTime.hours.hour += `还剩${hours}小时截止`
320 342
             remainingTime.hours.topbackcolor = '#FF9428'
321 343
             remainingTime.hours.mainbackcolor = '#FFEAD6'
322
-          } else if (minutes > 0) {
344
+          }
345
+          else if (minutes > 0) {
323 346
             remainingTime.minutes.minute += `还剩${minutes}分钟截止`
324 347
             remainingTime.minutes.topbackcolor = '#FF9428'
325 348
             remainingTime.minutes.mainbackcolor = '#FFEAD6'
326
-          } else {
349
+          }
350
+          else {
327 351
             remainingTime.default.topbackcolor = '#339169'
328 352
             remainingTime.default.mainbackcolor = '#D6EFE6'
329 353
           }
@@ -332,7 +356,8 @@ const tomorrowlist = computed(() => {
332 356
             remainingTime,
333 357
             timeDiff,
334 358
           }
335
-        } catch (error) {
359
+        }
360
+        catch (error) {
336 361
           console.error('日期解析错误:', error)
337 362
           return {
338 363
             ...item,
@@ -356,27 +381,28 @@ const filList = computed(() => {
356 381
 })
357 382
 
358 383
 // 跳转到任务详情页
359
-const goTaskDetail = (taskId: number) => {
384
+function goTaskDetail(taskId: number) {
360 385
   uni.navigateTo({
361 386
     url: `/pages/schedule/details/index?id=${taskId}`,
362 387
   })
363 388
 }
364
-const handleClick = (item: string) => {
389
+function handleClick(item: string) {
365 390
   tab.value = item
366 391
   emit('handletabs', tab.value)
367 392
 }
368 393
 </script>
394
+
369 395
 <template>
370 396
   <view class="box-day">
371 397
     <view class="tab">
372 398
       <view
373 399
         v-for="item in tabs"
374 400
         :key="item"
375
-        :class="['tab-item', { 'tab-item-active': tab === item }]"
401
+        class="tab-item" :class="[{ 'tab-item-active': tab === item }]"
376 402
         @click="handleClick(item)"
377 403
       >
378 404
         {{ item }}
379
-        <view class="tab-item-line" v-if="tab === item" />
405
+        <view v-if="tab === item" class="tab-item-line" />
380 406
       </view>
381 407
     </view>
382 408
     <view
@@ -392,7 +418,9 @@ const handleClick = (item: string) => {
392 418
     >
393 419
       <!-- 已逾期 -->
394 420
       <view>
395
-        <view class="title">已逾期({{ filList['已逾期'].length }})</view>
421
+        <view class="title">
422
+          已逾期({{ filList['已逾期'].length }})
423
+        </view>
396 424
         <view
397 425
           v-for="task in filList['已逾期']"
398 426
           :key="task.id"
@@ -419,19 +447,23 @@ const handleClick = (item: string) => {
419 447
                     : authStatusMap[task?.authStatus || 'null']?.name
420 448
                 }}
421 449
               </view>
422
-              <view class="list_dev_right_bottom" style="color: #d85e3e">{{
423
-                task.overduedays
424
-              }}</view>
450
+              <view class="list_dev_right_bottom" style="color: #d85e3e">
451
+                {{
452
+                  task.overduedays
453
+                }}
454
+              </view>
425 455
             </view>
426 456
           </view>
427 457
         </view>
428
-        <view v-if="filList['已逾期'].length === 0" class="no-data"
429
-          >暂无数据</view
430
-        >
458
+        <view v-if="filList['已逾期'].length === 0" class="no-data">
459
+          暂无数据
460
+        </view>
431 461
       </view>
432 462
       <!-- 今日 -->
433 463
       <view>
434
-        <view class="title">今日({{ filList['今日'].length }})</view>
464
+        <view class="title">
465
+          今日({{ filList['今日'].length }})
466
+        </view>
435 467
         <view
436 468
           v-for="task in filList['今日']"
437 469
           :key="task.id"
@@ -497,13 +529,15 @@ const handleClick = (item: string) => {
497 529
             </view>
498 530
           </view>
499 531
         </view>
500
-        <view v-if="filList['今日'].length === 0" class="no-data"
501
-          >暂无数据</view
502
-        >
532
+        <view v-if="filList['今日'].length === 0" class="no-data">
533
+          暂无数据
534
+        </view>
503 535
       </view>
504 536
       <!-- 明日 -->
505 537
       <view>
506
-        <view class="title">明日({{ filList['明日'].length }})</view>
538
+        <view class="title">
539
+          明日({{ filList['明日'].length }})
540
+        </view>
507 541
         <view
508 542
           v-for="task in filList['明日']"
509 543
           :key="task.id"
@@ -569,9 +603,9 @@ const handleClick = (item: string) => {
569 603
             </view>
570 604
           </view>
571 605
         </view>
572
-        <view v-if="filList['明日'].length === 0" class="no-data"
573
-          >暂无数据</view
574
-        >
606
+        <view v-if="filList['明日'].length === 0" class="no-data">
607
+          暂无数据
608
+        </view>
575 609
       </view>
576 610
       <view
577 611
         style="
@@ -580,11 +614,13 @@ const handleClick = (item: string) => {
580 614
           font-weight: 400;
581 615
           margin: 0 auto;
582 616
         "
583
-        >- 加载完毕 -</view
584 617
       >
618
+        - 加载完毕 -
619
+      </view>
585 620
     </view>
586 621
   </view>
587 622
 </template>
623
+
588 624
 <style lang="scss" scoped>
589 625
 .box-day {
590 626
   padding-left: 8px;

+ 1 - 1
tsconfig.json

@@ -7,7 +7,7 @@
7 7
     ],
8 8
     "baseUrl": ".",
9 9
     "module": "esnext",
10
-    "moduleResolution": "bundler",
10
+    "moduleResolution": "node",
11 11
     "paths": {
12 12
       "@/*": [
13 13
         "./src/*"