|
|
@@ -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;
|