Blame view

pages/index/index.vue 23.4 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">
e2e5221c   刘淇   验证码登录
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">
1d3624b0   刘淇   首页。养护任务
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
      <view class="content-wrap">
1d3624b0   刘淇   首页。养护任务
20
21
22
23
24
25
26
        <!-- 图表区域 增加平滑动画容器 -->
        <view class="chart-wrap" v-show="showChartArea">
          <!-- 任务完成情况标题 -->
          <view class="module-title">任务完成情况</view>
  
          <!-- 任务完成情况卡片 -->
          <view class="task-chart-card">
bc215493   刘淇   考勤记录
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
            <view class="card-header">
              <view class="unit-tip">数字指标</view>
              <!-- ActionSheet 点击唤起 -->
              <view class="sort-trigger" @click="openActionSheet">
                {{ sortLabel }}
                <up-icon name="arrow-down" size="14" style="margin-left:4rpx;"></up-icon>
              </view>
              <!-- ActionSheet组件 -->
              <up-action-sheet :show="showActionSheet" :actions="actionSheetOptions" @select="handleSheetSelect"
                @close="showActionSheet = false" />
              <view class="date-picker-wrap">
                <neo-datetime-pro v-model="dateRange" type="daterange" :clearable="false" placeholder="请选择日期范围"
                  @confirm="handleDateConfirm" :max-date="maxDate" @popup-show="handlePopupShow"
                  @popup-hide="handlePopupHide" />
              </view>
            </view>
ee792d52   刘淇   动态表单
43
  
4f475013   刘淇   k线图
44
  
1d3624b0   刘淇   首页。养护任务
45
            <!-- 双折线K线图 -->
ee792d52   刘淇   动态表单
46
            <!-- <view class="chart-container">
1d3624b0   刘淇   首页。养护任务
47
48
              <uni-charts v-if="!isDatePickerOpen" type="line" :data="klineChartData" :categories="klineCategories"
                :option="klineOption" :width="chartWidth" :height="chartHeight" />
ee792d52   刘淇   动态表单
49
50
            </view> -->
  
bc215493   刘淇   考勤记录
51
52
53
54
55
56
57
            <up-grid :border="false" col="4">
              <up-grid-item v-for="(baseListItem, baseListIndex) in baseList" :key="baseListIndex">
                <view class="grid-item-icon-box">
                  <up-icon :name="baseListItem.name" size="32" color="#1677ff"></up-icon>
                  <text class="grid-num-icon">{{ baseListItem.num }}</text>
                  <text class="grid-label-icon">{{ baseListItem.title }}</text>
                </view>
ee792d52   刘淇   动态表单
58
              </up-grid-item>
bc215493   刘淇   考勤记录
59
60
            </up-grid>
  
12e66ec8   刘淇   新增树
61
62
          </view>
        </view>
12e66ec8   刘淇   新增树
63
  
1d3624b0   刘淇   首页。养护任务
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
        <view class="con-wrap">
          <view class="con-title">养护任务 </view>
  
          <!-- 手写Tab切换:胶囊分段样式 -->
          <view class="custom-tab-wrap">
            <view class="tab-capsule" :class="{ active: currentTabValue === 0 }" @click="handleTabClick(0)">
              待办事项({{ todoTotal }})
            </view>
            <view class="tab-capsule" :class="{ active: currentTabValue === 1 }" @click="handleTabClick(1)">
              已办事项({{ doneTotal }})
            </view>
          </view>
  
  
          <!-- 动态组信息文案 -->
6cc0ab0e   刘淇   养护任务
79
          <!-- <view class="tip-top" style="padding: 8px 0  0 70px;">
1d3624b0   刘淇   首页。养护任务
80
            <text>{{ tipText }}</text>
6cc0ab0e   刘淇   养护任务
81
          </view> -->
1d3624b0   刘淇   首页。养护任务
82
83
84
85
86
87
88
89
  
          <!-- 顶部进度提示栏 -->
          <view v-if="showTipHeader" class="tip-header">
            <up-icon name="checkmark-circle" color="#00b42a" size="20"></up-icon>
            <text style="color: #1677ff;">今日组内:您已经完成{{ finishNum }}项,小组均值{{ avgNum }}项</text>
          </view>
  
  
bc215493   刘淇   考勤记录
90
91
          <scroll-view class="task-list-container" scroll-y @scroll="onListScroll" @scrolltoupper="handleTouchTop"
            enhanced>
1d3624b0   刘淇   首页。养护任务
92
93
94
95
96
            <view v-if="taskList.length === 0" class="empty-box">
              <up-empty />
            </view>
            <view class="task-item" v-for="(item, index) in taskList" :key="`${item.taskName}_${index}`"
              hover-class="task-item--hover" @click="handleTaskClick(item)">
cf70629b   刘淇   养护计划 照片 自己写样式
97
              <view class="task-item__content">
1d3624b0   刘淇   首页。养护任务
98
99
                <view class="name-fixed-wrap">
                  <view class="task-item__name ">
bc215493   刘淇   考勤记录
100
                    事项{{ index + 1 }}
cf70629b   刘淇   养护计划 照片 自己写样式
101
                  </view>
1d3624b0   刘淇   首页。养护任务
102
103
                  <view class="task-name-text">
                    {{ item.taskName || '无' }}
cf70629b   刘淇   养护计划 照片 自己写样式
104
105
                  </view>
                </view>
1d3624b0   刘淇   首页。养护任务
106
107
  
                <view v-if="currentTabValue === 0" class="task-item__footer" style="padding-left:  60px;">
bc215493   刘淇   考勤记录
108
109
                  <image class="loc-icon" src="https://img.jichengshanshui.com.cn:28207/appimg/定位icon@3x.png"
                    mode="aspectFit"></image>
1d3624b0   刘淇   首页。养护任务
110
111
112
113
114
115
                  <template v-if="isWalkTextMode">
                    <text>距离当前{{ item.distance }}m ·约{{ item.estimatedWalkingMinutes }}分钟步行</text>
                  </template>
                  <template v-else>
                    <text>{{ item.distance }}m ·</text>
                    <up-icon name="star-fill" color="#ffd21d" size="20"></up-icon>
6cc0ab0e   刘淇   养护任务
116
                    <text>历史完成率{{ item.historyCompletionRate }}%</text>
1d3624b0   刘淇   首页。养护任务
117
118
                  </template>
                </view>
4f475013   刘淇   k线图
119
              </view>
4f475013   刘淇   k线图
120
            </view>
1d3624b0   刘淇   首页。养护任务
121
122
          </scroll-view>
        </view>
12e66ec8   刘淇   新增树
123
      </view>
12e66ec8   刘淇   新增树
124
    </view>
c293da23   刘淇   新园林init
125
126
  </template>
  
cf70629b   刘淇   养护计划 照片 自己写样式
127
  <script setup lang="ts">
9441e28e   刘淇   考勤打卡
128
129
  import { ref, computed, nextTick, watch } from 'vue';
  import { onShow, onUnload } from '@dcloudio/uni-app';
1d3624b0   刘淇   首页。养护任务
130
  import { useUserStore } from '@/pinia/user';
bc215493   刘淇   考勤记录
131
  import { timeFormat } from '@/uni_modules/uview-plus';
4f475013   刘淇   k线图
132
  import uniCharts from '@/components/uni-charts/uni-charts.vue';
1d3624b0   刘淇   首页。养护任务
133
134
135
136
  import { getUnreadCount } from "@/api/user";
  import {
    getTaskCompletionSummary,
    taskDetailsWithDistance,
9441e28e   刘淇   考勤打卡
137
138
139
    taskDetailsWithSmartSort,
    getCurrentOrg,
    orgTaskIndicator
1d3624b0   刘淇   首页。养护任务
140
  } from "@/api/index/index";
1d3624b0   刘淇   首页。养护任务
141
  const userStore = useUserStore();
9441e28e   刘淇   考勤打卡
142
  const deptId = computed(() => String(userStore.userInfo?.deptId ?? ''));
1d3624b0   刘淇   首页。养护任务
143
  
6cc0ab0e   刘淇   养护任务
144
  // ====================== 分组配置(多部门归属同一组) ======================
1d3624b0   刘淇   首页。养护任务
145
  type GroupItem = {
9441e28e   刘淇   考勤打卡
146
    deptIds: string[];
1d3624b0   刘淇   首页。养护任务
147
    label: string;
9441e28e   刘淇   考勤打卡
148
149
    showTipHeader: boolean;
    useWalkText: boolean;
1d3624b0   刘淇   首页。养护任务
150
  };
1d3624b0   刘淇   首页。养护任务
151
  const groupConfig: GroupItem[] = [
6cc0ab0e   刘淇   养护任务
152
153
    {
      deptIds: ['361', '363', '279', '277', '270'],
9441e28e   刘淇   考勤打卡
154
      label: '[组2 A1B2 纯效率·有提醒]',
6cc0ab0e   刘淇   养护任务
155
156
157
      showTipHeader: true,
      useWalkText: true
    },
6cc0ab0e   刘淇   养护任务
158
159
    {
      deptIds: ['252', '273', '274', '337', '359', '360'],
9441e28e   刘淇   考勤打卡
160
      label: '[组3 A2B1 个性化·无提醒]',
6cc0ab0e   刘淇   养护任务
161
162
163
      showTipHeader: false,
      useWalkText: false
    },
6cc0ab0e   刘淇   养护任务
164
165
    {
      deptIds: ['281', '272', '271', '338', '280'],
9441e28e   刘淇   考勤打卡
166
      label: '[组4 A2B2 个性化·有提醒]',
6cc0ab0e   刘淇   养护任务
167
168
169
      showTipHeader: true,
      useWalkText: false
    },
1d3624b0   刘淇   首页。养护任务
170
  ];
6cc0ab0e   刘淇   养护任务
171
172
  const defaultGroup: GroupItem = {
    deptIds: [],
9441e28e   刘淇   考勤打卡
173
    label: '[组1 A1B1 纯效率·无提醒]',
6cc0ab0e   刘淇   养护任务
174
175
176
    showTipHeader: false,
    useWalkText: true
  };
1d3624b0   刘淇   首页。养护任务
177
  const currentGroup = computed(() => {
6cc0ab0e   刘淇   养护任务
178
    const targetDept = deptId.value;
9441e28e   刘淇   考勤打卡
179
180
181
    for (const g of groupConfig) {
      if (g.deptIds.includes(targetDept)) {
        return g;
6cc0ab0e   刘淇   养护任务
182
183
      }
    }
6cc0ab0e   刘淇   养护任务
184
    return defaultGroup;
1d3624b0   刘淇   首页。养护任务
185
  });
1d3624b0   刘淇   首页。养护任务
186
187
188
189
190
  const tipText = computed(() => currentGroup.value.label);
  const showTipHeader = computed(() => currentGroup.value.showTipHeader);
  const isWalkTextMode = computed(() => currentGroup.value.useWalkText);
  const useDistanceApi = computed(() => currentGroup.value.useWalkText);
  // =========================================================================
c293da23   刘淇   新园林init
191
  
1d3624b0   刘淇   首页。养护任务
192
193
  const finishNum = ref(0);
  const avgNum = ref(0);
cf70629b   刘淇   养护计划 照片 自己写样式
194
  const msgCount = ref(0);
1d3624b0   刘淇   首页。养护任务
195
  const currentTabValue = ref(0);
1d3624b0   刘淇   首页。养护任务
196
  const dateRange = ref<string[]>([]);
5b5a4862   刘淇   按钮放大
197
  const yesterday = new Date();
1d3624b0   刘淇   首页。养护任务
198
  yesterday.setDate(yesterday.getDate() - 1);
bc215493   刘淇   考勤记录
199
200
  const maxDate = ref(timeFormat(yesterday, 'yyyy-mm-dd'));
  // const minDate = '2026-01-06';
5b5a4862   刘淇   按钮放大
201
  const isDatePickerOpen = ref(false);
5b5a4862   刘淇   按钮放大
202
203
204
  const handlePopupShow = () => {
    isDatePickerOpen.value = true;
  };
5b5a4862   刘淇   按钮放大
205
206
207
  const handlePopupHide = () => {
    isDatePickerOpen.value = false;
  };
cf70629b   刘淇   养护计划 照片 自己写样式
208
  
1d3624b0   刘淇   首页。养护任务
209
210
211
212
213
214
215
  const todoTotal = ref(0);
  const doneTotal = ref(0);
  const todoFullList = ref<any[]>([]);
  const doneFullList = ref<any[]>([]);
  const taskList = computed(() => {
    return currentTabValue.value === 0 ? todoFullList.value : doneFullList.value;
  });
1d3624b0   刘淇   首页。养护任务
216
217
  const chooseOptions = computed(() => [
    { title: `待办事项(${todoTotal.value})`, id: 'todo' },
9441e28e   刘淇   考勤打卡
218
    { title: `已办事项(${doneTotal.value})`, id: 'done' },
1d3624b0   刘淇   首页。养护任务
219
  ]);
c293da23   刘淇   新园林init
220
  
1d3624b0   刘淇   首页。养护任务
221
222
  const currentLon = ref<string>('');
  const currentLat = ref<string>('');
4f475013   刘淇   k线图
223
224
  const chartWidth = ref(0);
  const chartHeight = ref(300);
1d3624b0   刘淇   首页。养护任务
225
  const klineCategories = ref<string[]>([]);
4f475013   刘淇   k线图
226
  const klineChartData = ref([
12e66ec8   刘淇   新增树
227
    {
4570c70a   刘淇   消息中心
228
      name: '已完成任务数',
1d3624b0   刘淇   首页。养护任务
229
      data: [] as number[],
4f475013   刘淇   k线图
230
      color: '#25AF69'
12e66ec8   刘淇   新增树
231
232
    },
    {
6bce1057   刘淇   ai 大区经理
233
      name: '总任务数',
1d3624b0   刘淇   首页。养护任务
234
      data: [] as number[],
4f475013   刘淇   k线图
235
236
237
      color: '#B34C17'
    }
  ]);
4f475013   刘淇   k线图
238
239
240
  const klineOption = ref({
    grid: {
      top: '25%',
53012a16   刘淇   首页 优化
241
      left: '12%',
9441e28e   刘淇   考勤打卡
242
      right: '12%',
53012a16   刘淇   首页 优化
243
      bottom: '16%'
12e66ec8   刘淇   新增树
244
    },
4f475013   刘淇   k线图
245
    xAxis: {
1d3624b0   刘淇   首页。养护任务
246
      axisLabel: { fontSize: 12, color: '#666' }
12e66ec8   刘淇   新增树
247
    },
4f475013   刘淇   k线图
248
249
    yAxis: {
      min: 0,
1d3624b0   刘淇   首页。养护任务
250
251
      splitLine: { lineStyle: { color: '#f5f5f7' } },
      axisLabel: { fontSize: 12, color: '#666' }
12e66ec8   刘淇   新增树
252
    },
4f475013   刘淇   k线图
253
254
    tooltip: {
      trigger: 'axis',
1d3624b0   刘淇   首页。养护任务
255
      formatter: (params: any[]) => {
4570c70a   刘淇   消息中心
256
        return `${params[0].name}<br/>
9441e28e   刘淇   考勤打卡
257
258
  ${params[0].seriesName}: ${params[0].value}<br/>
  ${params[1].seriesName}: ${params[1].value}`;
4f475013   刘淇   k线图
259
260
261
262
263
      }
    },
    legend: {
      show: true,
      top: '5%',
1d3624b0   刘淇   首页。养护任务
264
      textStyle: { fontSize: 12 }
12e66ec8   刘淇   新增树
265
    }
4f475013   刘淇   k线图
266
267
  });
  
9441e28e   刘淇   考勤打卡
268
269
270
271
272
273
274
275
276
277
278
279
280
281
  const baseList = ref<Array<{ num: string; title: string }>>([]);
  const orgOptions = ref<any[]>([]);
  const value1 = ref<number | string>('');
  const showActionSheet = ref(false);
  
  watch(orgOptions, async (list) => {
    if (list.length && !value1.value) {
      value1.value = list[0].value;
      // 拿到默认组织后,拉指标
      if (dateRange.value.length === 2) {
        await fetchOrgIndicator(Number(value1.value), dateRange.value[0], dateRange.value[1]);
      }
    }
  }, { immediate: true });
ee792d52   刘淇   动态表单
282
  
9441e28e   刘淇   考勤打卡
283
284
  const actionSheetOptions = computed(() => {
    return orgOptions.value.map(opt => ({
ee792d52   刘淇   动态表单
285
286
      name: opt.label,
      value: opt.value
9441e28e   刘淇   考勤打卡
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
    }));
  });
  const sortLabel = computed(() => {
    const cur = orgOptions.value.find(i => i.value === value1.value);
    return cur?.label ?? "";
  });
  const openActionSheet = () => {
    showActionSheet.value = true;
  };
  // ActionSheet选中组织:刷新指标
  const handleSheetSelect = async (item: { name: string; value: number }) => {
    value1.value = item.value;
    showActionSheet.value = false;
    console.log('选中组织:', item.value);
    if (dateRange.value.length === 2) {
      await fetchOrgIndicator(item.value, dateRange.value[0], dateRange.value[1]);
    }
  };
4f475013   刘淇   k线图
305
  
9441e28e   刘淇   考勤打卡
306
  const userName = computed(() => userStore.userInfo?.nickname || '用户');
1d3624b0   刘淇   首页。养护任务
307
  const rpx2px = (rpx: number) => {
cf70629b   刘淇   养护计划 照片 自己写样式
308
    const systemInfo = uni.getSystemInfoSync();
1d3624b0   刘淇   首页。养护任务
309
310
311
    return Math.floor(systemInfo.screenWidth / 750 * rpx);
  };
  
9441e28e   刘淇   考勤打卡
312
  // ========== 滚动逻辑 ==========
1d3624b0   刘淇   首页。养护任务
313
  const showChartArea = ref(true);
1d3624b0   刘淇   首页。养护任务
314
  const scrollHideThreshold = rpx2px(80);
1d3624b0   刘淇   首页。养护任务
315
316
  const safeShowThreshold = rpx2px(130);
  let scrollTimer: number | null = null;
1d3624b0   刘淇   首页。养护任务
317
318
  const handleTouchTop = () => {
    showChartArea.value = true;
4f475013   刘淇   k线图
319
  };
1d3624b0   刘淇   首页。养护任务
320
321
  const onListScroll = (e: any) => {
    const scrollTop = e.detail.scrollTop;
1d3624b0   刘淇   首页。养护任务
322
    if (scrollTimer) clearTimeout(scrollTimer);
1d3624b0   刘淇   首页。养护任务
323
324
325
326
327
    if (scrollTop <= safeShowThreshold) {
      showChartArea.value = true;
    } else if (scrollTop > scrollHideThreshold) {
      showChartArea.value = false;
    }
1d3624b0   刘淇   首页。养护任务
328
329
330
331
332
333
    scrollTimer = setTimeout(() => {
      if (scrollTop <= safeShowThreshold) {
        showChartArea.value = true;
      }
    }, 100);
  };
1d3624b0   刘淇   首页。养护任务
334
335
336
  const handleTabClick = (tabIndex: number) => {
    if (currentTabValue.value === tabIndex) return;
    currentTabValue.value = tabIndex;
1d3624b0   刘淇   首页。养护任务
337
338
339
    showChartArea.value = true;
  };
  
9441e28e   刘淇   考勤打卡
340
341
342
343
344
345
346
347
348
349
350
351
352
  // ========== 公共函数:请求 orgTaskIndicator 指标接口 ==========
  const fetchOrgIndicator = async (orgId: number, beginDate: string, endDate: string) => {
    try {
      // 日期字符串转毫秒时间戳
      const beginTime = new Date(beginDate).getTime();
      const endTime = new Date(endDate).getTime();
      const res = await orgTaskIndicator({
        orgId,
        beginTime,
        endTime
      });
      console.log('orgTaskIndicator 返回:', res);
      baseList.value = [
bc215493   刘淇   考勤记录
353
354
355
356
        { num: String(res.totalCnt ?? 0), title: '应办任务数', name: 'file-text' },
        { num: String(res.doneCnt ?? 0), title: '已办任务数', name: 'checkmark-circle' },
        { num: String(res.pendingCnt ?? 0), title: '待办任务数', name: 'clock' },
        { num: String(res.overdueCnt ?? 0), title: '超时未完成', name: 'close-circle' }
9441e28e   刘淇   考勤打卡
357
      ];
bc215493   刘淇   考勤记录
358
  
9441e28e   刘淇   考勤打卡
359
360
361
362
    } catch (err) {
      console.error('orgTaskIndicator 请求失败:', err);
    }
  };
5b5a4862   刘淇   按钮放大
363
  
9441e28e   刘淇   考勤打卡
364
365
366
367
368
369
  // ========== 初始化日期范围(近7天) ==========
  const initRecent7Days = () => {
    const now = new Date();
    const end = new Date(now);
    end.setDate(end.getDate() - 1);
    const start = new Date(end);
bc215493   刘淇   考勤记录
370
    console.log(start)
9441e28e   刘淇   考勤打卡
371
    start.setDate(start.getDate() - 6);
cf70629b   刘淇   养护计划 照片 自己写样式
372
    dateRange.value = [
bc215493   刘淇   考勤记录
373
374
      timeFormat(start, 'yyyy-mm-dd'),
      timeFormat(end, 'yyyy-mm-dd')
cf70629b   刘淇   养护计划 照片 自己写样式
375
    ];
bc215493   刘淇   考勤记录
376
    console.log(dateRange.value)
1d3624b0   刘淇   首页。养护任务
377
    initChartData(dateRange.value[0], dateRange.value[1]);
4f475013   刘淇   k线图
378
379
  };
  
cf70629b   刘淇   养护计划 照片 自己写样式
380
381
382
383
384
  const getUnread = async () => {
    try {
      const res = await getUnreadCount();
      msgCount.value = res || 0;
    } catch (error) {
9441e28e   刘淇   考勤打卡
385
386
387
388
389
390
391
392
393
394
395
396
      console.error('获取未读消息失败:', error);
    }
  };
  
  // getOrg:只拉组织下拉选项,不处理指标
  const getOrg = async () => {
    try {
      const res = await getCurrentOrg();
      console.log('getCurrentOrg组织下拉:', res);
      orgOptions.value = res.options || [];
    } catch (error) {
      console.error('获取组织下拉失败:', error);
cf70629b   刘淇   养护计划 照片 自己写样式
397
398
    }
  };
4570c70a   刘淇   消息中心
399
  
1d3624b0   刘淇   首页。养护任务
400
  const initChartData = async (beginTime: string, endTime: string) => {
cf70629b   刘淇   养护计划 照片 自己写样式
401
    try {
1d3624b0   刘淇   首页。养护任务
402
      const postData = { beginTime, endTime };
cf70629b   刘淇   养护计划 照片 自己写样式
403
      const res = await getTaskCompletionSummary(postData);
1d3624b0   刘淇   首页。养护任务
404
405
      klineCategories.value = res.map((item: any) => item.currentDate);
      klineChartData.value[0].data = res.map((item: any) => item.completedNum);
9441e28e   刘淇   考勤打卡
406
      klineChartData.value[1].data = res.map((item: any) => item.countPendingNum);
cf70629b   刘淇   养护计划 照片 自己写样式
407
    } catch (error) {
9441e28e   刘淇   考勤打卡
408
      console.error('图表数据请求失败:', error);
cf70629b   刘淇   养护计划 照片 自己写样式
409
410
    }
  };
4f475013   刘淇   k线图
411
  
1d3624b0   刘淇   首页。养护任务
412
  const loadDistanceApiTask = async (lon: string, lat: string) => {
cf70629b   刘淇   养护计划 照片 自己写样式
413
    try {
1d3624b0   刘淇   首页。养护任务
414
415
      const paramsTodo = { queryType: 1, currentLon: lon, currentLat: lat };
      const paramsDone = { queryType: 2, currentLon: lon, currentLat: lat };
cf70629b   刘淇   养护计划 照片 自己写样式
416
      const [todoRes, doneRes] = await Promise.all([
1d3624b0   刘淇   首页。养护任务
417
418
        taskDetailsWithDistance(paramsTodo),
        taskDetailsWithDistance(paramsDone)
cf70629b   刘淇   养护计划 照片 自己写样式
419
      ]);
1d3624b0   刘淇   首页。养护任务
420
421
422
423
424
425
426
427
428
      todoFullList.value = todoRes?.sortedTasks || [];
      doneFullList.value = doneRes?.sortedTasks || [];
      todoTotal.value = Number(todoRes?.totalPendingTasks) || 0;
      doneTotal.value = Number(doneRes?.totalPendingTasks) || 0;
      finishNum.value = todoRes?.teamProgress?.userCompletedCount ?? 0;
      avgNum.value = doneRes?.teamProgress?.teamAverage ?? 0;
      await nextTick();
    } catch (err) {
      uni.showToast({ title: '加载任务失败', icon: 'none' });
9441e28e   刘淇   考勤打卡
429
      console.error('loadDistanceApiTask error', err);
1d3624b0   刘淇   首页。养护任务
430
431
432
433
      todoFullList.value = [];
      doneFullList.value = [];
      todoTotal.value = 0;
      doneTotal.value = 0;
cf70629b   刘淇   养护计划 照片 自己写样式
434
    }
4f475013   刘淇   k线图
435
  };
1d3624b0   刘淇   首页。养护任务
436
  const loadSmartSortTask = async (lon: string, lat: string) => {
cf70629b   刘淇   养护计划 照片 自己写样式
437
    try {
1d3624b0   刘淇   首页。养护任务
438
      const [todoRes, doneRes] = await Promise.all([
9441e28e   刘淇   考勤打卡
439
440
        taskDetailsWithSmartSort({ queryType: 1, currentLon: lon, currentLat: lat }),
        taskDetailsWithSmartSort({ queryType: 2, currentLon: lon, currentLat: lat })
1d3624b0   刘淇   首页。养护任务
441
442
443
444
445
446
447
448
449
450
      ]);
      todoFullList.value = todoRes?.sortedTasks || [];
      doneFullList.value = doneRes?.sortedTasks || [];
      todoTotal.value = Number(todoRes?.totalPendingTasks) || 0;
      doneTotal.value = Number(doneRes?.totalPendingTasks) || 0;
      finishNum.value = todoRes?.teamProgress?.userCompletedCount ?? 0;
      avgNum.value = doneRes?.teamProgress?.teamAverage ?? 0;
      await nextTick();
    } catch (err) {
      uni.showToast({ title: '加载任务失败', icon: 'none' });
9441e28e   刘淇   考勤打卡
451
      console.error('loadSmartSortTask error', err);
1d3624b0   刘淇   首页。养护任务
452
453
454
455
      todoFullList.value = [];
      doneFullList.value = [];
      todoTotal.value = 0;
      doneTotal.value = 0;
cf70629b   刘淇   养护计划 照片 自己写样式
456
457
    }
  };
1d3624b0   刘淇   首页。养护任务
458
459
460
461
462
463
464
465
466
467
  const loadAllTaskByDept = async () => {
    const loc = await getCurrentLocation();
    currentLon.value = loc.lon;
    currentLat.value = loc.lat;
    if (useDistanceApi.value) {
      await loadDistanceApiTask(loc.lon, loc.lat);
    } else {
      await loadSmartSortTask(loc.lon, loc.lat);
    }
  };
cf70629b   刘淇   养护计划 照片 自己写样式
468
  
9441e28e   刘淇   考勤打卡
469
470
  // 日期确认回调:更新图表 + 重新请求指标orgTaskIndicator
  const handleDateConfirm = async (e: string[]) => {
cf70629b   刘淇   养护计划 照片 自己写样式
471
    dateRange.value = e;
9441e28e   刘淇   考勤打卡
472
473
474
475
    await initChartData(e[0], e[1]);
    if (value1.value) {
      await fetchOrgIndicator(Number(value1.value), e[0], e[1]);
    }
4f475013   刘淇   k线图
476
  };
12e66ec8   刘淇   新增树
477
  
9441e28e   刘淇   考勤打卡
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
  const getCurrentLocation = (): Promise<{ lon: string; lat: string }> => {
    return new Promise((resolve, reject) => {
      uni.getSetting({
        success: (settingRes) => {
          if (!settingRes.authSetting['scope.userLocation']) {
            uni.authorize({
              scope: 'scope.userLocation',
              success: () => {
                uni.getLocation({
                  type: 'gcj02',
                  success: (loc) => {
                    resolve({
                      lon: loc.longitude.toFixed(6),
                      lat: loc.latitude.toFixed(6)
                    });
                  },
                  fail: (err) => {
                    uni.showToast({ title: '获取位置失败,请开启定位', icon: 'none' });
                    reject('定位失败');
                  }
                });
              },
              fail: () => {
                uni.showModal({
                  title: '需要定位权限',
                  content: '允许定位才能查看任务距离',
                  confirmText: '去设置',
                  success: (modalRes) => {
                    if (modalRes.confirm) {
                      uni.openSetting();
                    }
                  }
                });
                reject('拒绝定位');
              }
            });
          } else {
            uni.getLocation({
              type: 'gcj02',
              success: (loc) => {
                resolve({
                  lon: loc.longitude.toFixed(6),
                  lat: loc.latitude.toFixed(6)
                });
              },
              fail: (err) => {
                uni.showToast({ title: '获取位置失败,请开启定位', icon: 'none' });
                reject('定位失败');
              }
            });
          }
        },
        fail: (err) => {
          reject('获取权限设置失败');
        }
      });
    });
4f475013   刘淇   k线图
535
536
  };
  
9441e28e   刘淇   考勤打卡
537
538
539
  const handleMsgClick = () => {
    uni.navigateTo({ url: '/pages-sub/msg/msg' });
  };
1d3624b0   刘淇   首页。养护任务
540
541
542
  const handleTaskClick = (item: any) => {
    if (item.taskType == "maintain") {
      if (currentTabValue.value === 0) {
9441e28e   刘淇   考勤打卡
543
544
545
546
547
548
549
        uni.navigateTo({
          url: `/pages-sub/daily/maintain-add?planNo=${item.planNo || ''}&planTypeId=${item.planTypeId ?? ''}&businessLine=${item.busiLine ?? ''}`
        });
      } else {
        uni.navigateTo({
          url: `/pages-sub/daily/maintain-detail?planNo=${item.planNo || ''}`
        });
1d3624b0   刘淇   首页。养护任务
550
      }
cf70629b   刘淇   养护计划 照片 自己写样式
551
    }
1d3624b0   刘淇   首页。养护任务
552
553
    if (item.taskType == "inspection") {
      if (currentTabValue.value === 0) {
9441e28e   刘淇   考勤打卡
554
555
556
557
558
559
560
        uni.navigateTo({
          url: `/pages-sub/daily/inspect-add?planNo=${item.planNo}&batchNo=${item.batchNo}`
        });
      } else {
        uni.navigateTo({
          url: `/pages-sub/daily/inspect-detail?planNo=${item.planNo || ''}`
        });
1d3624b0   刘淇   首页。养护任务
561
562
563
      }
    }
  };
9441e28e   刘淇   考勤打卡
564
565
566
567
568
569
570
571
572
573
574
575
576
577
  
  onShow(async () => {
    showChartArea.value = true;
    chartWidth.value = rpx2px(750 - 60);
    chartHeight.value = rpx2px(300);
    initRecent7Days();
    getUnread();
    await getOrg(); // 拉取组织下拉列表
    await loadAllTaskByDept();
  });
  
  onUnload(() => {
    if (scrollTimer) clearTimeout(scrollTimer);
  });
c293da23   刘淇   新园林init
578
579
  </script>
  
9441e28e   刘淇   考勤打卡
580
581
  
  
12e66ec8   刘淇   新增树
582
  <style scoped lang="scss">
4f475013   刘淇   k线图
583
584
  $primary-color: #1677ff;
  $danger-color: #E53935;
4f475013   刘淇   k线图
585
586
587
588
589
  $text-color: #333;
  $text-color-light: #666;
  $text-color-placeholder: #999;
  $bg-color: #f5f5f7;
  $card-bg: #fff;
cf70629b   刘淇   养护计划 照片 自己写样式
590
591
592
593
594
  $border-radius: 16px;
  $card-radius: 5px;
  $spacing-sm: 5px;
  $spacing-md: 10px;
  $spacing-lg: 15px;
1d3624b0   刘淇   首页。养护任务
595
  $border-color: #e5e5e5;
cf70629b   刘淇   养护计划 照片 自己写样式
596
597
  
  .page-container {
1d3624b0   刘淇   首页。养护任务
598
    height: 100vh;
cf70629b   刘淇   养护计划 照片 自己写样式
599
    background-color: $bg-color;
1d3624b0   刘淇   首页。养护任务
600
601
602
    overflow: hidden;
    display: flex;
    flex-direction: column;
12e66ec8   刘淇   新增树
603
604
  }
  
12e66ec8   刘淇   新增树
605
  .user-info-bar {
1d3624b0   刘淇   首页。养护任务
606
    flex-shrink: 0;
4f475013   刘淇   k线图
607
608
    background: url("https://img.jichengshanshui.com.cn:28207/appimg/bg.jpg") no-repeat;
    background-size: 100% 100%;
24c0bbe7   刘淇   登录账号密码 加密存储
609
    padding: 80px $spacing-lg 135px;
12e66ec8   刘淇   新增树
610
611
612
613
    display: flex;
    justify-content: space-between;
    align-items: center;
    color: #fff;
12e66ec8   刘淇   新增树
614
  
4f475013   刘淇   k线图
615
    .username {
4570c70a   刘淇   消息中心
616
      font-size: 16px;
cf70629b   刘淇   养护计划 照片 自己写样式
617
      margin-bottom: 4px;
4f475013   刘淇   k线图
618
    }
bc215493   刘淇   考勤记录
619
  
4f475013   刘淇   k线图
620
    .login-desc {
cf70629b   刘淇   养护计划 照片 自己写样式
621
      font-size: 16px;
12e66ec8   刘淇   新增树
622
    }
bc215493   刘淇   考勤记录
623
  
12e66ec8   刘淇   新增树
624
625
    .msg-icon {
      position: relative;
cf70629b   刘淇   养护计划 照片 自己写样式
626
      padding: 5px;
578c1373   刘淇   样式优化
627
      top: 10px;
4f475013   刘淇   k线图
628
      border-radius: 50%;
bc215493   刘淇   考勤记录
629
  
4f475013   刘淇   k线图
630
631
632
      &--hover {
        background-color: rgba(255, 255, 255, 0.2);
      }
bc215493   刘淇   考勤记录
633
  
12e66ec8   刘淇   新增树
634
635
      .msg-badge {
        position: absolute;
578c1373   刘淇   样式优化
636
637
        top: -2px;
        right: -3px;
12e66ec8   刘淇   新增树
638
639
640
641
      }
    }
  }
  
4f475013   刘淇   k线图
642
  .content-wrap {
1d3624b0   刘淇   首页。养护任务
643
    flex: 1;
cf70629b   刘淇   养护计划 照片 自己写样式
644
    margin-top: -122px;
4f475013   刘淇   k线图
645
646
    border-radius: $border-radius $border-radius 0 0;
    background-color: $bg-color;
4f475013   刘淇   k线图
647
    overflow: hidden;
1d3624b0   刘淇   首页。养护任务
648
649
650
651
652
653
654
655
656
657
    display: flex;
    flex-direction: column;
  }
  
  .chart-wrap {
    flex-shrink: 0;
    transition: all 0.35s ease-out;
    opacity: 1;
    overflow: hidden;
  }
bc215493   刘淇   考勤记录
658
  
1d3624b0   刘淇   首页。养护任务
659
660
661
662
  .chart-wrap[hidden] {
    opacity: 0;
    height: 0;
    margin: 0;
4f475013   刘淇   k线图
663
  }
12e66ec8   刘淇   新增树
664
  
4f475013   刘淇   k线图
665
  .module-title {
cf70629b   刘淇   养护计划 照片 自己写样式
666
    padding: $spacing-lg;
578c1373   刘淇   样式优化
667
    font-size: 14px;
4f475013   刘淇   k线图
668
669
    font-weight: 600;
    color: $text-color-light;
1d3624b0   刘淇   首页。养护任务
670
    flex-shrink: 0;
4f475013   刘淇   k线图
671
672
673
674
675
676
677
  }
  
  .task-chart-card {
    background-color: $card-bg;
    border-radius: $card-radius;
    margin: 0 $spacing-lg $spacing-md;
    padding: $spacing-md;
1d3624b0   刘淇   首页。养护任务
678
    flex-shrink: 0;
bc215493   刘淇   考勤记录
679
  
12e66ec8   刘淇   新增树
680
681
682
    .card-header {
      display: flex;
      justify-content: space-between;
12e66ec8   刘淇   新增树
683
      align-items: center;
cf70629b   刘淇   养护计划 照片 自己写样式
684
      font-size: 12px;
4f475013   刘淇   k线图
685
686
      color: $text-color-placeholder;
      margin-bottom: $spacing-md;
bc215493   刘淇   考勤记录
687
  
4f475013   刘淇   k线图
688
      .date-picker-wrap {
cf70629b   刘淇   养护计划 照片 自己写样式
689
        border-radius: 3px;
4f475013   刘淇   k线图
690
        transition: background-color 0.2s;
5b5a4862   刘淇   按钮放大
691
692
        position: relative;
        z-index: 999;
bc215493   刘淇   考勤记录
693
  
4f475013   刘淇   k线图
694
695
696
        &:active {
          background-color: $bg-color;
        }
12e66ec8   刘淇   新增树
697
698
      }
    }
bc215493   刘淇   考勤记录
699
  
4f475013   刘淇   k线图
700
    .chart-container {
12e66ec8   刘淇   新增树
701
      width: 100%;
cf70629b   刘淇   养护计划 照片 自己写样式
702
      height: 150px;
4f475013   刘淇   k线图
703
704
705
      display: flex;
      align-items: center;
      justify-content: center;
12e66ec8   刘淇   新增树
706
707
    }
  }
bc215493   刘淇   考勤记录
708
  
1d3624b0   刘淇   首页。养护任务
709
710
711
712
713
714
715
716
717
718
  .con-wrap {
    border-radius: 8px;
    background-color: #fff;
    margin: 0 15px;
    flex: 1;
    min-height: 0;
    display: flex;
    flex-direction: column;
    overflow: hidden;
  }
12e66ec8   刘淇   新增树
719
  
1d3624b0   刘淇   首页。养护任务
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
  .con-title {
    padding: 10px 15px;
    border-bottom: 1px solid #f0e9e9;
    flex-shrink: 0;
  }
  
  .custom-tab-wrap {
    display: flex;
    align-items: center;
    gap: 20rpx;
    padding: 20rpx 0 20rpx 20rpx;
    background: #fff;
    flex-shrink: 0;
  }
  
  .tab-capsule {
    padding: 10rpx 20rpx;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 28rpx;
    color: #999;
    background: #f5f5f5;
    border-radius: 0;
    transition: all 0.2s ease;
    font-weight: 500;
  }
bc215493   刘淇   考勤记录
747
  
1d3624b0   刘淇   首页。养护任务
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
  .tab-capsule.active {
    color: #d4af37;
    background: #fff8dc;
  }
  
  .tip-header {
    display: flex;
    align-items: center;
    gap: 8rpx;
    padding: 12rpx 15rpx;
    background: #e6f7ff;
    font-size: 14px;
    color: #000;
    flex-shrink: 0;
  }
  
  .tip-top {
bc215493   刘淇   考勤记录
765
    padding: 8px 0 0 70px;
1d3624b0   刘淇   首页。养护任务
766
    flex-shrink: 0;
12e66ec8   刘淇   新增树
767
768
  }
  
4f475013   刘淇   k线图
769
  .task-list-container {
1d3624b0   刘淇   首页。养护任务
770
771
772
773
774
775
776
777
    width: 100%;
    height: 100%;
    padding-bottom: 300rpx;
    box-sizing: border-box;
  }
  
  .empty-box {
    padding: 60rpx 0;
cf70629b   刘淇   养护计划 照片 自己写样式
778
  }
bc215493   刘淇   考勤记录
779
  
ee792d52   刘淇   动态表单
780
781
782
783
784
785
786
  .sort-trigger {
    display: flex;
    align-items: center;
    font-size: 12px;
    color: $text-color-placeholder;
  }
  
12e66ec8   刘淇   新增树
787
  
cf70629b   刘淇   养护计划 照片 自己写样式
788
789
790
791
  .task-item {
    padding: $spacing-md;
    transition: background-color 0.2s;
    border-bottom: 1px solid $border-color;
bc215493   刘淇   考勤记录
792
  
cf70629b   刘淇   养护计划 照片 自己写样式
793
794
795
    &:last-child {
      border-bottom: none;
    }
bc215493   刘淇   考勤记录
796
  
cf70629b   刘淇   养护计划 照片 自己写样式
797
798
799
    &--hover {
      background-color: $bg-color;
    }
bc215493   刘淇   考勤记录
800
  
cf70629b   刘淇   养护计划 照片 自己写样式
801
802
803
    &__content {
      width: 100%;
    }
bc215493   刘淇   考勤记录
804
  
1d3624b0   刘淇   首页。养护任务
805
806
807
    .name-fixed-wrap {
      display: flex;
    }
bc215493   刘淇   考勤记录
808
  
1d3624b0   刘淇   首页。养护任务
809
810
811
    .task-item__name {
      width: 60px;
    }
bc215493   刘淇   考勤记录
812
813
814
815
816
817
818
819
820
821
822
823
  
    .task-name-text {
      flex: 1;
      font-size: 14px;
      color: $text-color;
      display: -webkit-box;
      -webkit-line-clamp: 2;
      -webkit-box-orient: vertical;
      overflow: hidden;
      text-overflow: ellipsis;
    }
  
cf70629b   刘淇   养护计划 照片 自己写样式
824
    &__name {
1d3624b0   刘淇   首页。养护任务
825
      font-size: 15px;
cf70629b   刘淇   养护计划 照片 自己写样式
826
      color: $text-color;
1d3624b0   刘淇   首页。养护任务
827
      display: inline-block;
cf70629b   刘淇   养护计划 照片 自己写样式
828
    }
bc215493   刘淇   考勤记录
829
  
cf70629b   刘淇   养护计划 照片 自己写样式
830
831
    &__footer {
      display: flex;
1d3624b0   刘淇   首页。养护任务
832
833
834
835
836
      align-items: flex-start;
      gap: 6rpx;
      font-size: 13px;
      color: $text-color-light;
      margin-top: $spacing-sm;
cf70629b   刘淇   养护计划 照片 自己写样式
837
      align-items: center;
cf70629b   刘淇   养护计划 照片 自己写样式
838
839
    }
  }
bc215493   刘淇   考勤记录
840
  
1d3624b0   刘淇   首页。养护任务
841
842
843
844
  .loc-icon {
    width: 20px;
    height: 20px;
  }
4f475013   刘淇   k线图
845
  
cf70629b   刘淇   养护计划 照片 自己写样式
846
847
  .urgency-tag {
    color: #7D7D7D;
12e66ec8   刘淇   新增树
848
  }
bc215493   刘淇   考勤记录
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
  
  .grid-item-icon-box {
    display:flex;
    flex-direction:column;
    align-items:center;
    padding:16rpx;
  }
  .grid-num-icon {
    font-size:40rpx;
    font-weight:600;
    color:#333;
    margin-top:8rpx;
  }
  .grid-label-icon {
    font-size:22rpx;
    color:#666;
    margin-top:4rpx;
  }
  
12e66ec8   刘淇   新增树
868
  </style>