Blame view

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