Blame view

pages/index/index.vue 12.5 KB
c293da23   刘淇   新园林init
1
  <template>
cf70629b   刘淇   养护计划 照片 自己写样式
2
    <view class="page-container">
12e66ec8   刘淇   新增树
3
4
5
      <!-- 用户信息栏 -->
      <view class="user-info-bar">
        <view class="user-info">
12e66ec8   刘淇   新增树
6
          <view class="user-text">
4f475013   刘淇   k线图
7
8
            <view class="username">你好{{ userName }},欢迎登录</view>
            <view class="login-desc">全域智能运营管理平台</view>
12e66ec8   刘淇   新增树
9
10
          </view>
        </view>
4f475013   刘淇   k线图
11
        <view class="msg-icon" @click="handleMsgClick" hover-class="msg-icon--hover">
cf70629b   刘淇   养护计划 照片 自己写样式
12
          <up-icon name="chat" color="#fff" size="24"/>
4f475013   刘淇   k线图
13
14
15
          <view class="msg-badge" v-if="msgCount > 0">
            <up-badge type="error" max="999" :value="msgCount"></up-badge>
          </view>
12e66ec8   刘淇   新增树
16
17
18
        </view>
      </view>
  
4f475013   刘淇   k线图
19
20
      <view class="content-wrap">
        <!-- 任务完成情况标题 -->
4570c70a   刘淇   消息中心
21
        <view class="module-title">任务完成情况</view>
4f475013   刘淇   k线图
22
23
24
25
26
  
        <!-- 任务完成情况卡片 -->
        <view class="task-chart-card">
          <view class="card-header">
            <view class="unit-tip">单位: 个</view>
cf70629b   刘淇   养护计划 照片 自己写样式
27
            <view class="date-picker-wrap">
4f475013   刘淇   k线图
28
29
30
31
32
33
              <neo-datetime-pro
                  v-model="dateRange"
                  type="daterange"
                  :clearable="false"
                  placeholder="请选择日期范围"
                  @confirm="handleDateConfirm"
cf70629b   刘淇   养护计划 照片 自己写样式
34
                  :max-date="maxDate"
4f475013   刘淇   k线图
35
36
37
38
              />
            </view>
          </view>
  
4570c70a   刘淇   消息中心
39
          <!-- 双折线K线图 -->
4f475013   刘淇   k线图
40
41
42
43
44
45
46
47
          <view class="chart-container">
            <uni-charts
                type="line"
                :data="klineChartData"
                :categories="klineCategories"
                :option="klineOption"
                :width="chartWidth"
                :height="chartHeight"
12e66ec8   刘淇   新增树
48
49
50
            />
          </view>
        </view>
12e66ec8   刘淇   新增树
51
  
cf70629b   刘淇   养护计划 照片 自己写样式
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
        <!-- 使用up-tabs组件实现Tab切换 -->
        <up-tabs
            :list="tabList"
            active-color="#0A86F4"
            inactive-color="#666"
            font-size="14px"
            line-width="40"
            line-height="3"
            @change="handleTabChange"
            class="task-tab-container"
            scrollable="false"
        ></up-tabs>
  
        <!-- z-paging分页列表 -->
        <z-paging
            ref="paging"
            v-model="currentTaskList"
            @query="queryList"
            :auto-show-system-loading="true"
            :page-size="10"
            use-page-scroll
        >
          <template #empty>
            <up-empty />
          </template>
          <view class="task-list-container">
            <view
                class="task-item"
                v-for="(item,index) in currentTaskList"
                :key="`${item.taskName}_${index}`"
                hover-class="task-item--hover"
                @click="handleTaskClick(item)"
            >
              <view class="task-item__content">
                <view class="task-item__name u-line-1">
                  {{ item.taskName || '无' }}
                </view>
                <view class="task-item__footer u-flex common-item-center common-justify-between"
                      style="font-size: 13px; margin-top: 5px;">
                  <view class="urgency-tag" >
                    紧急程度: {{ item.pressingType }}
                  </view>
                  <view style="font-size: 13px;color: #333">{{
                      timeFormat(item.busiDateTime, 'yyyy-mm-dd hh:MM:ss')
                    }}
                  </view>
                </view>
4f475013   刘淇   k线图
99
              </view>
4f475013   刘淇   k线图
100
            </view>
12e66ec8   刘淇   新增树
101
          </view>
cf70629b   刘淇   养护计划 照片 自己写样式
102
        </z-paging>
12e66ec8   刘淇   新增树
103
      </view>
12e66ec8   刘淇   新增树
104
    </view>
c293da23   刘淇   新园林init
105
106
  </template>
  
cf70629b   刘淇   养护计划 照片 自己写样式
107
108
109
110
111
  <script setup lang="ts">
  import {ref, watch, computed, reactive} from 'vue';
  import {onShow} from '@dcloudio/uni-app'
  import {useUserStore} from '@/pinia/user';
  import {timeFormat} from '@/uni_modules/uview-plus';
4f475013   刘淇   k线图
112
  import uniCharts from '@/components/uni-charts/uni-charts.vue';
cf70629b   刘淇   养护计划 照片 自己写样式
113
114
115
  import {getUnreadCount} from "@/api/user";
  import {getTaskCompletionSummary, getTaskDetails} from "@/api/index/index";
  
c293da23   刘淇   新园林init
116
  
4f475013   刘淇   k线图
117
  // ========== 2. 响应式数据 ==========
cf70629b   刘淇   养护计划 照片 自己写样式
118
119
  const msgCount = ref(0);
  const currentTab = ref('todo'); // todo:待办 done:已办
4f475013   刘淇   k线图
120
  const dateRange = ref([]);
cf70629b   刘淇   养护计划 照片 自己写样式
121
122
123
124
125
126
127
128
129
130
  const maxDate = ref(timeFormat(new Date(), 'yyyy-mm-dd'));
  
  //  Tab列表配置
  const tabList = ref([]);
  const todoTotal = ref(0); // 待办事项总数
  const doneTotal = ref(0); // 已办事项总数
  
  // 分页相关
  const paging = ref(null);
  const currentTaskList = ref([]); // 当前显示的任务列表(分页数据)
c293da23   刘淇   新园林init
131
  
4570c70a   刘淇   消息中心
132
  // 折线图数据配置
4f475013   刘淇   k线图
133
134
  const chartWidth = ref(0);
  const chartHeight = ref(300);
4570c70a   刘淇   消息中心
135
  const klineCategories = ref([]); // X轴日期
4f475013   刘淇   k线图
136
  const klineChartData = ref([
12e66ec8   刘淇   新增树
137
    {
4570c70a   刘淇   消息中心
138
      name: '已完成任务数',
4f475013   刘淇   k线图
139
140
      data: [],
      color: '#25AF69'
12e66ec8   刘淇   新增树
141
142
    },
    {
4570c70a   刘淇   消息中心
143
      name: '待完成总任务数',
4f475013   刘淇   k线图
144
145
146
147
      data: [],
      color: '#B34C17'
    }
  ]);
4570c70a   刘淇   消息中心
148
149
  
  // 图表配置
4f475013   刘淇   k线图
150
151
152
153
154
155
  const klineOption = ref({
    grid: {
      top: '25%',
      left: '15%',
      right: '8%',
      bottom: '20%'
12e66ec8   刘淇   新增树
156
    },
4f475013   刘淇   k线图
157
    xAxis: {
cf70629b   刘淇   养护计划 照片 自己写样式
158
      axisLabel: {fontSize: 12, color: '#666'}
12e66ec8   刘淇   新增树
159
    },
4f475013   刘淇   k线图
160
161
    yAxis: {
      min: 0,
cf70629b   刘淇   养护计划 照片 自己写样式
162
163
      splitLine: {lineStyle: {color: '#f5f5f7'}},
      axisLabel: {fontSize: 12, color: '#666'}
12e66ec8   刘淇   新增树
164
    },
4f475013   刘淇   k线图
165
166
167
    tooltip: {
      trigger: 'axis',
      formatter: (params) => {
4570c70a   刘淇   消息中心
168
169
        return `${params[0].name}<br/>
        ${params[0].seriesName}: ${params[0].data}<br/>
4f475013   刘淇   k线图
170
171
172
173
174
175
        ${params[1].seriesName}: ${params[1].data}`;
      }
    },
    legend: {
      show: true,
      top: '5%',
cf70629b   刘淇   养护计划 照片 自己写样式
176
      textStyle: {fontSize: 12}
12e66ec8   刘淇   新增树
177
    }
4f475013   刘淇   k线图
178
179
  });
  
4f475013   刘淇   k线图
180
181
182
  // ========== 3. 计算属性 ==========
  const userStore = useUserStore();
  const userName = computed(() => userStore.userInfo?.user?.nickname || '用户');
4f475013   刘淇   k线图
183
184
185
  
  // ========== 4. 工具函数 ==========
  const rpx2px = (rpx) => {
cf70629b   刘淇   养护计划 照片 自己写样式
186
    const systemInfo = uni.getSystemInfoSync();
4f475013   刘淇   k线图
187
188
189
    return Math.floor(rpx * (systemInfo.screenWidth / 750));
  };
  
4f475013   刘淇   k线图
190
  
cf70629b   刘淇   养护计划 照片 自己写样式
191
  const initRecent7Days = async () => {
4f475013   刘淇   k线图
192
193
194
    const now = new Date();
    const sevenDaysAgo = new Date();
    sevenDaysAgo.setDate(now.getDate() - 6);
cf70629b   刘淇   养护计划 照片 自己写样式
195
196
197
198
199
200
201
    // 格式化日期为 YYYY-MM-DD 格式
    dateRange.value = [
      timeFormat(sevenDaysAgo, 'yyyy-mm-dd'),
      timeFormat(now, 'yyyy-mm-dd')
    ];
  
    initChartData(timeFormat(sevenDaysAgo, 'yyyy-mm-dd'), timeFormat(now, 'yyyy-mm-dd'));
4f475013   刘淇   k线图
202
203
  };
  
cf70629b   刘淇   养护计划 照片 自己写样式
204
205
206
207
208
209
210
211
212
  const getUnread = async () => {
    try {
      const res = await getUnreadCount();
      msgCount.value = res || 0;
    } catch (error) {
      console.error('获取未读消息数失败:', error);
      msgCount.value = 0;
    }
  };
4570c70a   刘淇   消息中心
213
  
4f475013   刘淇   k线图
214
  /**
cf70629b   刘淇   养护计划 照片 自己写样式
215
216
217
   * 初始化图表数据
   * @param {string} beginTime 开始时间
   * @param {string} endTime 结束时间
4f475013   刘淇   k线图
218
   */
cf70629b   刘淇   养护计划 照片 自己写样式
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
  const initChartData = async (beginTime, endTime) => {
    try {
      let postData = {
        beginTime: beginTime,
        endTime: endTime
      };
      const res = await getTaskCompletionSummary(postData);
      console.log('图表数据:', res);
      klineCategories.value = res.map(item => item.currentDate);
      klineChartData.value[0].data = res.map(item => item.completedNum);
      klineChartData.value[1].data = res.map(item => item.countpendingNum);
    } catch (error) {
      console.error('获取图表数据失败:', error);
    }
  };
4f475013   刘淇   k线图
234
  
cf70629b   刘淇   养护计划 照片 自己写样式
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
  /**
   *  获取所有Tab的总数(初始化时调用)
   */
  const getAllTabTotal = async () => {
    try {
      // 同时请求待办和已办的总数(只请求第1页,每页1条,仅获取total)
      const [todoRes, doneRes] = await Promise.all([
        getTaskDetails({queryType: 1, pageNo: 1, pageSize: 1}),
        getTaskDetails({queryType: 2, pageNo: 1, pageSize: 1})
      ]);
  
      // 更新总数
      todoTotal.value = todoRes?.total || 0;
      doneTotal.value = doneRes?.total || 0;
      console.log('已办:')
      console.log(doneRes)
      tabList.value = [
        {name: `待办事项(${todoTotal.value})`},
        {name: `已办事项(${doneTotal.value})`},
      ]
      console.log('初始化总数:', {todoTotal: todoTotal.value, doneTotal: doneTotal.value});
    } catch (error) {
      console.error('获取Tab总数失败:', error);
      // 保底:如果已办请求失败,至少保证待办数据正常
    }
4f475013   刘淇   k线图
260
261
262
  };
  
  // ========== 5. 业务逻辑 ==========
cf70629b   刘淇   养护计划 照片 自己写样式
263
264
265
266
267
268
269
270
271
272
273
274
275
  /**
   *  up-tabs切换事件处理
   * @param {object} item 选中的Tab项
   */
  const handleTabChange = (item) => {
    // 解析Tab类型(todo/done)
    console.log(item)
    const newTab = item.name.includes('待办') ? 'todo' : 'done';
    if (currentTab.value === newTab) return;
  
    currentTab.value = newTab;
    // 切换标签后刷新分页数据
    paging.value?.reload();
4f475013   刘淇   k线图
276
277
  };
  
cf70629b   刘淇   养护计划 照片 自己写样式
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
  /**
   * 分页查询列表数据
   * @param {number} pageNo 页码
   * @param {number} pageSize 每页条数
   */
  const queryList = async (pageNo, pageSize) => {
    try {
      // 1:待完成 2:已完成
      const queryType = currentTab.value === 'todo' ? 1 : 2;
      const postData = {
        queryType,
        pageNo,
        pageSize,
      };
  
      const res = await getTaskDetails(postData);
      console.log(`${currentTab.value}列表数据:`, res);
  
      // 更新当前Tab的总数
      if (currentTab.value === 'todo') {
        todoTotal.value = res?.total || 0;
      } else {
        doneTotal.value = res?.total || 0;
      }
4f475013   刘淇   k线图
302
  
cf70629b   刘淇   养护计划 照片 自己写样式
303
304
305
306
307
308
309
310
311
312
      // 适配z-paging分页(注意接口返回结构是res.data.list)
      paging.value.complete(res?.list || [], res?.total || 0);
    } catch (error) {
      console.error(`加载${currentTab.value}列表失败:`, error);
      paging.value?.complete(false);
      uni.showToast({title: '加载失败,请重试', icon: 'none'});
    }
  };
  
  // 日期选择确认事件
4f475013   刘淇   k线图
313
  const handleDateConfirm = (e) => {
cf70629b   刘淇   养护计划 照片 自己写样式
314
315
316
317
318
319
320
    console.log('日期选择确认:', e);
  
    // 更新选中的日期范围
    dateRange.value = e;
  
    // 加载选择日期后的图表数据
    initChartData(e[0], e[1]);
4f475013   刘淇   k线图
321
  };
12e66ec8   刘淇   新增树
322
  
4f475013   刘淇   k线图
323
  const handleMsgClick = () => {
cf70629b   刘淇   养护计划 照片 自己写样式
324
    uni.navigateTo({url: '/pages-sub/msg/index'});
4f475013   刘淇   k线图
325
326
327
  };
  
  const handleTaskClick = (item) => {
cf70629b   刘淇   养护计划 照片 自己写样式
328
    // uni.navigateTo({url: `/pages-sub/task/detail?id=${item.id || ''}`});
4f475013   刘淇   k线图
329
330
331
  };
  
  // ========== 6. 生命周期 ==========
cf70629b   刘淇   养护计划 照片 自己写样式
332
333
  onShow(async () => {
    // 初始化图表尺寸
4f475013   刘淇   k线图
334
335
    chartWidth.value = rpx2px(750 - 60);
    chartHeight.value = rpx2px(300);
cf70629b   刘淇   养护计划 照片 自己写样式
336
337
  
    // 初始化默认日期范围(最近7天)
4f475013   刘淇   k线图
338
    initRecent7Days();
cf70629b   刘淇   养护计划 照片 自己写样式
339
340
341
342
343
344
345
346
347
  
    // 获取未读消息数
    getUnread();
    await getAllTabTotal();
  
    // 初始化分页数据(待办列表)
    if (paging.value) {
      paging.value.reload();
    }
12e66ec8   刘淇   新增树
348
  });
c293da23   刘淇   新园林init
349
350
  </script>
  
12e66ec8   刘淇   新增树
351
  <style scoped lang="scss">
4570c70a   刘淇   消息中心
352
  /* 样式变量 */
4f475013   刘淇   k线图
353
354
  $primary-color: #1677ff;
  $danger-color: #E53935;
4f475013   刘淇   k线图
355
356
357
358
359
  $text-color: #333;
  $text-color-light: #666;
  $text-color-placeholder: #999;
  $bg-color: #f5f5f7;
  $card-bg: #fff;
cf70629b   刘淇   养护计划 照片 自己写样式
360
361
362
363
364
365
366
367
  $border-radius: 16px;
  $card-radius: 5px;
  $spacing-sm: 5px;
  $spacing-md: 10px;
  $spacing-lg: 15px;
  $border-color: #e5e5e5; // 新增边框颜色变量
  
  .page-container {
12e66ec8   刘淇   新增树
368
    min-height: 100vh;
cf70629b   刘淇   养护计划 照片 自己写样式
369
    background-color: $bg-color;
12e66ec8   刘淇   新增树
370
371
  }
  
12e66ec8   刘淇   新增树
372
  .user-info-bar {
4f475013   刘淇   k线图
373
374
    background: url("https://img.jichengshanshui.com.cn:28207/appimg/bg.jpg") no-repeat;
    background-size: 100% 100%;
cf70629b   刘淇   养护计划 照片 自己写样式
375
    padding: 100px $spacing-lg 135px;
12e66ec8   刘淇   新增树
376
377
378
379
    display: flex;
    justify-content: space-between;
    align-items: center;
    color: #fff;
12e66ec8   刘淇   新增树
380
    position: relative;
4f475013   刘淇   k线图
381
    z-index: 1;
12e66ec8   刘淇   新增树
382
  
4f475013   刘淇   k线图
383
    .username {
4570c70a   刘淇   消息中心
384
      font-size: 16px;
4f475013   刘淇   k线图
385
      font-weight: 500;
cf70629b   刘淇   养护计划 照片 自己写样式
386
      margin-bottom: 4px;
4f475013   刘淇   k线图
387
    }
12e66ec8   刘淇   新增树
388
  
4f475013   刘淇   k线图
389
    .login-desc {
cf70629b   刘淇   养护计划 照片 自己写样式
390
      font-size: 16px;
12e66ec8   刘淇   新增树
391
392
393
394
    }
  
    .msg-icon {
      position: relative;
cf70629b   刘淇   养护计划 照片 自己写样式
395
      padding: 5px;
4f475013   刘淇   k线图
396
397
398
399
400
401
      border-radius: 50%;
      transition: background-color 0.2s;
  
      &--hover {
        background-color: rgba(255, 255, 255, 0.2);
      }
12e66ec8   刘淇   新增树
402
403
404
  
      .msg-badge {
        position: absolute;
cf70629b   刘淇   养护计划 照片 自己写样式
405
406
        top: -5px;
        right: -5px;
12e66ec8   刘淇   新增树
407
408
409
410
      }
    }
  }
  
4f475013   刘淇   k线图
411
  .content-wrap {
cf70629b   刘淇   养护计划 照片 自己写样式
412
    margin-top: -122px;
4f475013   刘淇   k线图
413
414
    border-radius: $border-radius $border-radius 0 0;
    background-color: $bg-color;
12e66ec8   刘淇   新增树
415
416
    position: relative;
    z-index: 2;
4f475013   刘淇   k线图
417
    overflow: hidden;
cf70629b   刘淇   养护计划 照片 自己写样式
418
    padding-bottom: $spacing-lg;
4f475013   刘淇   k线图
419
  }
12e66ec8   刘淇   新增树
420
  
4f475013   刘淇   k线图
421
  .module-title {
cf70629b   刘淇   养护计划 照片 自己写样式
422
423
    padding: $spacing-lg;
    font-size: 15px;
4f475013   刘淇   k线图
424
425
    font-weight: 600;
    color: $text-color-light;
4f475013   刘淇   k线图
426
427
428
429
430
431
432
  }
  
  .task-chart-card {
    background-color: $card-bg;
    border-radius: $card-radius;
    margin: 0 $spacing-lg $spacing-md;
    padding: $spacing-md;
12e66ec8   刘淇   新增树
433
434
435
436
  
    .card-header {
      display: flex;
      justify-content: space-between;
12e66ec8   刘淇   新增树
437
      align-items: center;
cf70629b   刘淇   养护计划 照片 自己写样式
438
      font-size: 12px;
4f475013   刘淇   k线图
439
440
      color: $text-color-placeholder;
      margin-bottom: $spacing-md;
12e66ec8   刘淇   新增树
441
  
4f475013   刘淇   k线图
442
      .date-picker-wrap {
cf70629b   刘淇   养护计划 照片 自己写样式
443
444
        padding: 2px 4px;
        border-radius: 3px;
4f475013   刘淇   k线图
445
446
447
448
449
        transition: background-color 0.2s;
  
        &:active {
          background-color: $bg-color;
        }
12e66ec8   刘淇   新增树
450
451
      }
    }
12e66ec8   刘淇   新增树
452
  
4f475013   刘淇   k线图
453
    .chart-container {
12e66ec8   刘淇   新增树
454
      width: 100%;
cf70629b   刘淇   养护计划 照片 自己写样式
455
      height: 150px;
4f475013   刘淇   k线图
456
457
458
      display: flex;
      align-items: center;
      justify-content: center;
12e66ec8   刘淇   新增树
459
460
461
    }
  }
  
cf70629b   刘淇   养护计划 照片 自己写样式
462
463
464
465
  .task-tab-container {
    position: relative;
    z-index: 4;
    margin: 0 $spacing-lg $spacing-sm;
12e66ec8   刘淇   新增树
466
467
  }
  
4f475013   刘淇   k线图
468
  .task-list-container {
4f475013   刘淇   k线图
469
    margin: 0 $spacing-lg;
cf70629b   刘淇   养护计划 照片 自己写样式
470
471
472
473
    background-color: $card-bg;
    border-radius: $card-radius;
    overflow: hidden; // 防止边框溢出圆角
  }
12e66ec8   刘淇   新增树
474
  
cf70629b   刘淇   养护计划 照片 自己写样式
475
476
477
478
479
480
481
  .task-item {
    padding: $spacing-md;
    transition: background-color 0.2s;
    border-bottom: 1px solid $border-color;
    &:last-child {
      border-bottom: none;
    }
12e66ec8   刘淇   新增树
482
  
cf70629b   刘淇   养护计划 照片 自己写样式
483
484
485
    &--hover {
      background-color: $bg-color;
    }
4f475013   刘淇   k线图
486
  
cf70629b   刘淇   养护计划 照片 自己写样式
487
488
489
    &__content {
      width: 100%;
    }
4f475013   刘淇   k线图
490
  
cf70629b   刘淇   养护计划 照片 自己写样式
491
492
493
494
495
    &__name {
      font-size: 13px;
      color: $text-color;
      margin-bottom: $spacing-sm;
    }
4f475013   刘淇   k线图
496
  
cf70629b   刘淇   养护计划 照片 自己写样式
497
498
499
500
501
502
    &__footer {
      display: flex;
      align-items: center;
      justify-content: space-between;
    }
  }
4f475013   刘淇   k线图
503
  
cf70629b   刘淇   养护计划 照片 自己写样式
504
505
506
  // 紧急程度标签样式
  .urgency-tag {
    color: #7D7D7D;
12e66ec8   刘淇   新增树
507
  
12e66ec8   刘淇   新增树
508
509
  }
  </style>