From cfe0b79fbea0fb1d7a5a796e71ada7d3b7812046 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期一, 15 十二月 2025 22:31:33 +0800
Subject: [PATCH] feat: 企业微信发送微信小程序cetd
---
app/pages/index.vue | 1634 +++++++++++++++++++++++++++++++++------------------------
1 files changed, 948 insertions(+), 686 deletions(-)
diff --git a/app/pages/index.vue b/app/pages/index.vue
index 16b1513..f1e687a 100644
--- a/app/pages/index.vue
+++ b/app/pages/index.vue
@@ -5,25 +5,45 @@
<view class="user-info-content">
<view class="user-details">
<view class="user-info-row">
- <text class="user-name">{{ userName || '鏈櫥褰�' }}</text>
- <text class="separator" v-if="currentUser.branchCompanyName">|</text>
+ <text class="user-name">{{ userName || "鏈櫥褰�" }}</text>
+ <text class="separator" v-if="currentUser.branchCompanyName"
+ >|</text
+ >
<view class="branch-company" v-if="currentUser.branchCompanyName">
- <uni-icons type="location" size="16" color="#666" style="margin-right: 4rpx;"></uni-icons>
+ <uni-icons
+ type="location"
+ size="16"
+ color="#666"
+ style="margin-right: 4rpx"
+ ></uni-icons>
<text>{{ currentUser.branchCompanyName }}</text>
</view>
<text class="separator" v-if="boundVehicle">|</text>
- <view class="vehicle-info" @click.stop="goToBindVehicle" v-if="boundVehicle">
+ <view
+ class="vehicle-info"
+ @click.stop="goToBindVehicle"
+ v-if="boundVehicle"
+ >
<text>{{ boundVehicle }}</text>
- <uni-icons
- type="loop"
- size="16"
+ <uni-icons
+ type="loop"
+ size="16"
color="#007AFF"
- style="margin-left: 4rpx;"
+ style="margin-left: 4rpx"
></uni-icons>
</view>
</view>
- <view class="bind-vehicle-btn" v-if="!boundVehicle" @click="goToBindVehicle">
- <uni-icons type="plus-filled" size="16" color="#007AFF" style="margin-right: 4rpx;"></uni-icons>
+ <view
+ class="bind-vehicle-btn"
+ v-if="!boundVehicle"
+ @click="goToBindVehicle"
+ >
+ <uni-icons
+ type="plus-filled"
+ size="16"
+ color="#007AFF"
+ style="margin-right: 4rpx"
+ ></uni-icons>
<text>缁戝畾杞︾墝</text>
</view>
</view>
@@ -36,9 +56,30 @@
<uni-icons type="chat" size="24" color="#007AFF"></uni-icons>
</view>
<view class="message-text">娑堟伅涓績</view>
- <view class="unread-dot" v-if="unreadMessageCount > 0">{{ unreadMessageCount }}</view>
+ <view class="unread-dot" v-if="unreadMessageCount > 0">{{
+ unreadMessageCount
+ }}</view>
<view class="arrow">
<uni-icons type="arrowright" size="16" color="#999"></uni-icons>
+ </view>
+ </view>
+
+ <!-- 璁㈤槄閫氱煡鎻愮ず鍗$墖锛堟湭璁㈤槄鏃舵樉绀猴級 -->
+ <view
+ class="subscribe-banner"
+ v-if="!hasSubscribed"
+ @click="clickConfirmsubscribeTaskNotify"
+ >
+ <view class="banner-icon">
+ <uni-icons type="bell" size="28" color="#ff9500"></uni-icons>
+ </view>
+ <view class="banner-content">
+ <view class="banner-title">寮�鍚换鍔¢�氱煡</view>
+ <view class="banner-desc">鍙婃椂鎺ユ敹浠诲姟鍒嗛厤鍜岀姸鎬佹洿鏂版彁閱�</view>
+ </view>
+ <view class="banner-action">
+ <text>绔嬪嵆寮�鍚�</text>
+ <uni-icons type="arrowright" size="16" color="#007AFF"></uni-icons>
</view>
</view>
@@ -54,17 +95,38 @@
<view class="task-main" @click="viewTaskDetail(task)">
<!-- 浠诲姟澶撮儴锛氭爣棰樺拰鐘舵�佹爣绛� -->
<view class="task-header">
- <view class="task-title">{{ getTaskTypeText(task.type) }} - {{ task.vehicle }}</view>
- <view class="task-status" :class="getStatusClass(task.taskStatus)">
+ <view class="task-title"
+ >{{ getTaskTypeText(task.type) }} - {{ task.vehicle }}</view
+ >
+ <view
+ class="task-status"
+ :class="
+ task.taskStatus === 'PENDING'
+ ? 'status-pending'
+ : task.taskStatus === 'DEPARTING'
+ ? 'status-departing'
+ : task.taskStatus === 'ARRIVED'
+ ? 'status-arrived'
+ : task.taskStatus === 'RETURNING'
+ ? 'status-returning'
+ : task.taskStatus === 'COMPLETED'
+ ? 'status-completed'
+ : task.taskStatus === 'CANCELLED'
+ ? 'status-cancelled'
+ : task.taskStatus === 'IN_PROGRESS'
+ ? 'status-in-progress'
+ : 'status-default'
+ "
+ >
{{ getStatusText(task.status) }}
</view>
</view>
-
+
<!-- 浠诲姟缂栧彿鍗曠嫭涓�琛� -->
<view class="task-code-row">
- <text class="task-code">{{ task.taskNo }}</text>
+ <text class="task-code">{{ task.showTaskCode }}</text>
</view>
-
+
<!-- 浠诲姟璇︾粏淇℃伅 -->
<view class="task-info">
<view class="info-row">
@@ -89,65 +151,65 @@
</view>
</view>
</view>
-
+
<!-- 鎿嶄綔鎸夐挳 -->
<view class="task-actions">
<!-- 寰呭鐞嗙姸鎬�: 鏄剧ず鍑哄彂銆佸彇娑� -->
<template v-if="task.taskStatus === 'PENDING'">
- <button
- class="action-btn primary"
+ <button
+ class="action-btn primary"
@click="handleTaskAction(task, 'depart')"
>
鍑哄彂
</button>
- <button
- class="action-btn cancel"
+ <button
+ class="action-btn cancel"
@click="handleTaskAction(task, 'cancel')"
>
鍙栨秷
</button>
</template>
-
+
<!-- 鍑哄彂涓姸鎬�: 鏄剧ず宸插埌杈俱�佸己鍒剁粨鏉� -->
<template v-else-if="task.taskStatus === 'DEPARTING'">
- <button
- class="action-btn primary"
+ <button
+ class="action-btn primary"
@click="handleTaskAction(task, 'arrive')"
>
宸插埌杈�
</button>
- <button
- class="action-btn cancel"
+ <button
+ class="action-btn cancel"
@click="handleTaskAction(task, 'forceCancel')"
>
寮哄埗缁撴潫
</button>
</template>
-
+
<!-- 宸插埌杈剧姸鎬�: 鏄剧ず宸茶繑绋� -->
<template v-else-if="task.taskStatus === 'ARRIVED'">
- <button
- class="action-btn primary"
+ <button
+ class="action-btn primary"
@click="handleTaskAction(task, 'return')"
>
宸茶繑绋�
</button>
</template>
-
+
<!-- 杩旂▼涓姸鎬�: 鏄剧ず宸插畬鎴� -->
<template v-else-if="task.taskStatus === 'RETURNING'">
- <button
- class="action-btn primary"
+ <button
+ class="action-btn primary"
@click="handleTaskAction(task, 'complete')"
>
宸插畬鎴�
</button>
</template>
-
+
<!-- 宸插畬鎴�/宸插彇娑�: 涓嶆樉绀烘寜閽� -->
</view>
</view>
-
+
<view class="no-data" v-if="runningTasks.length === 0">
<uni-icons type="info" size="40" color="#ccc"></uni-icons>
<text>鏆傛棤姝e湪杩愯鐨勪换鍔�</text>
@@ -158,143 +220,244 @@
</template>
<script>
- import { mapState } from 'vuex'
- import { getMyTasks, changeTaskStatus } from '@/api/task'
- import { getUserProfile } from '@/api/system/user'
- import { getUserBoundVehicle } from '@/api/vehicle'
-
- export default {
- data() {
- return {
- // 鐢ㄦ埛缁戝畾鐨勮溅杈嗕俊鎭�
- boundVehicle: '',
- boundVehicleId: null,
-
- // 娑堟伅鏁版嵁
- messages: [],
-
- // 姝e湪杩愯鐨勪换鍔″垪琛�
- taskList: [],
- loading: false
- }
+import { mapState } from "vuex";
+import { getMyTasks, changeTaskStatus } from "@/api/task";
+import { getUserProfile } from "@/api/system/user";
+import { getUserBoundVehicle } from "@/api/vehicle";
+import { getUnreadCount } from "@/api/message";
+import { formatDateTime } from "@/utils/common";
+import subscribeManager from "@/utils/subscribe";
+
+export default {
+ data() {
+ return {
+ // 鐢ㄦ埛缁戝畾鐨勮溅杈嗕俊鎭�
+ boundVehicle: "",
+ boundVehicleId: null,
+
+ // 娑堟伅鏁版嵁
+ messages: [],
+ unreadMessageCount: 0,
+
+ // 姝e湪杩愯鐨勪换鍔″垪琛�
+ taskList: [],
+ loading: false,
+
+ // 璁㈤槄鐘舵��
+ hasSubscribed: false,
+ };
+ },
+ computed: {
+ ...mapState({
+ userName: (state) => state.user.nickName,
+ currentUser: (state) => state.user,
+ }),
+
+ // 姝e湪杩愯鐨勪换鍔★紙寰呭鐞嗗拰鍚勭澶勭悊涓殑浠诲姟锛�
+ runningTasks() {
+ return this.taskList.filter((task) => {
+ // 鍖呭惈寰呭鐞嗐�佸嚭鍙戜腑銆佸凡鍒拌揪銆佽繑绋嬩腑绛夋墍鏈夋湭瀹屾垚鐨勭姸鎬�
+ return [
+ "PENDING",
+ "DEPARTING",
+ "ARRIVED",
+ "RETURNING",
+ "IN_PROGRESS",
+ ].includes(task.taskStatus);
+ });
},
- computed: {
- ...mapState({
- userName: state => state.user.nickName,
- currentUser: state => state.user
- }),
-
- // 姝e湪杩愯鐨勪换鍔★紙寰呭鐞嗗拰鍚勭澶勭悊涓殑浠诲姟锛�
- runningTasks() {
- return this.taskList.filter(task => {
- // 鍖呭惈寰呭鐞嗐�佸嚭鍙戜腑銆佸凡鍒拌揪銆佽繑绋嬩腑绛夋墍鏈夋湭瀹屾垚鐨勭姸鎬�
- return ['PENDING', 'DEPARTING', 'ARRIVED', 'RETURNING', 'IN_PROGRESS'].includes(task.taskStatus)
- });
- },
-
- // 鏈娑堟伅鏁伴噺
- unreadMessageCount() {
- return this.messages.filter(message => !message.read).length;
- }
- },
- onLoad() {
- // 鍔犺浇鐢ㄦ埛缁戝畾杞﹁締淇℃伅
- this.loadUserVehicle()
- // 鍔犺浇姝e湪杩愯鐨勪换鍔�
- this.loadRunningTasks()
- },
- onShow() {
- // 姣忔鏄剧ず椤甸潰鏃跺埛鏂颁换鍔″垪琛ㄥ拰缁戝畾杞﹁締
- this.loadUserVehicle()
- this.loadRunningTasks()
- },
- onPullDownRefresh() {
- // 涓嬫媺鍒锋柊
- this.loadRunningTasks()
- setTimeout(() => {
- uni.stopPullDownRefresh()
- }, 1000)
- },
- methods: {
- // 鍔犺浇鐢ㄦ埛缁戝畾鐨勮溅杈嗕俊鎭�
- loadUserVehicle() {
- const userId = this.currentUser.userId
- if (!userId) {
- console.error('鐢ㄦ埛鏈櫥褰曪紝鏃犳硶鑾峰彇缁戝畾杞﹁締淇℃伅')
- this.boundVehicle = ''
- this.boundVehicleId = null
- return
- }
-
- getUserBoundVehicle(userId).then(response => {
- if (response.code === 200 && response.data) {
- const vehicle = response.data
- this.boundVehicle = vehicle.vehicleNumber || '鏈煡杞︾墝'
- this.boundVehicleId = vehicle.vehicleId
- console.log('鐢ㄦ埛缁戝畾杞﹁締:', this.boundVehicle)
+ },
+ onLoad() {
+ // 妫�鏌ョ敤鎴锋槸鍚﹀凡鐧诲綍
+ const userId = this.currentUser.userId;
+ if (!userId) {
+ console.log("鐢ㄦ埛鏈櫥褰曪紝璺宠繃鍔犺浇鏁版嵁");
+ return;
+ }
+
+ // 妫�鏌ヨ闃呯姸鎬侊紙鍏堟鏌ユ湰鍦帮紝鍚庨潰浼氭鏌ュ井淇″畼鏂圭姸鎬侊級
+ this.hasSubscribed = true;//subscribeManager.checkLocalSubscribeStatus();
+
+ // 鑷姩璁㈤槄锛堝鏋滄湭璁㈤槄鍒欐樉绀虹‘璁ゅ脊绐楋級
+ // this.autoSubscribeOnLaunch();
+
+ // 鍔犺浇鐢ㄦ埛缁戝畾杞﹁締淇℃伅
+ this.loadUserVehicle();
+ // 鍔犺浇姝e湪杩愯鐨勪换鍔�
+ this.loadRunningTasks();
+ // 鍔犺浇鏈娑堟伅鏁伴噺
+ this.loadUnreadMessageCount();
+ },
+ onShow() {
+ // 妫�鏌ョ敤鎴锋槸鍚﹀凡鐧诲綍
+ const userId = this.currentUser.userId;
+ if (!userId) {
+ console.log("鐢ㄦ埛鏈櫥褰曪紝璺宠繃鍔犺浇鏁版嵁");
+ return;
+ }
+
+ // 姣忔鏄剧ず椤甸潰鏃跺埛鏂颁换鍔″垪琛ㄣ�佺粦瀹氳溅杈嗗拰娑堟伅鏁伴噺
+ this.loadUserVehicle();
+ this.loadRunningTasks();
+ this.loadUnreadMessageCount();
+ },
+ onPullDownRefresh() {
+ // 涓嬫媺鍒锋柊
+ this.loadRunningTasks();
+ setTimeout(() => {
+ uni.stopPullDownRefresh();
+ }, 1000);
+ },
+ methods: {
+ // 鑷姩璁㈤槄锛堝皬绋嬪簭鍚姩鏃惰皟鐢級
+ autoSubscribeOnLaunch() {
+ subscribeManager.autoSubscribe()
+ .then((result) => {
+ if (result.skipped) {
+ console.log('鐢ㄦ埛宸茶闃咃紝鏃犻渶閲嶅璁㈤槄');
+ this.hasSubscribed = true;
+ } else if (result.success) {
+ this.hasSubscribed = true;
+ console.log('鑷姩璁㈤槄鎴愬姛');
} else {
- this.boundVehicle = ''
- this.boundVehicleId = null
+ // 璁㈤槄澶辫触鎴栬鎷掔粷锛屾洿鏂扮姸鎬�
+ this.hasSubscribed = false;
}
- }).catch(error => {
- console.error('鑾峰彇缁戝畾杞﹁締淇℃伅澶辫触:', error)
- this.boundVehicle = ''
- this.boundVehicleId = null
+
+ // 濡傛灉杩斿洖浜嗙姸鎬佷俊鎭紝杈撳嚭璇︾粏鐘舵��
+ if (result.status) {
+ console.log('璇︾粏璁㈤槄鐘舵�侊細', result.status);
+ }
})
- },
-
- // 鍔犺浇鐢ㄦ埛淇℃伅锛堜繚鐣欎互鍏煎涔嬪墠鐨勪唬鐮侊級
- loadUserProfile() {
- const userId = this.currentUser.userId
- if (!userId) {
- console.error('鐢ㄦ埛鏈櫥褰曪紝鏃犳硶鑾峰彇鐢ㄦ埛淇℃伅')
- return
- }
-
- getUserProfile().then(response => {
- const userInfo = response.data || response
+ .catch((error) => {
+ console.log('鑷姩璁㈤槄鍙栨秷鎴栧け璐ワ細', error);
+ this.hasSubscribed = false;
+ });
+ },
+
+ // 鍔犺浇鐢ㄦ埛缁戝畾鐨勮溅杈嗕俊鎭�
+ loadUserVehicle() {
+ const userId = this.currentUser.userId;
+ if (!userId) {
+ console.error("鐢ㄦ埛鏈櫥褰曪紝鏃犳硶鑾峰彇缁戝畾杞﹁締淇℃伅");
+ this.boundVehicle = "";
+ this.boundVehicleId = null;
+ return;
+ }
+
+ getUserBoundVehicle(userId)
+ .then((response) => {
+ if (response.code === 200 && response.data) {
+ const vehicle = response.data;
+ this.boundVehicle = vehicle.vehicleNumber || "鏈煡杞︾墝";
+ this.boundVehicleId = vehicle.vehicleId;
+ console.log("鐢ㄦ埛缁戝畾杞﹁締:", this.boundVehicle);
+ } else {
+ this.boundVehicle = "";
+ this.boundVehicleId = null;
+ }
+ })
+ .catch((error) => {
+ console.error("鑾峰彇缁戝畾杞﹁締淇℃伅澶辫触:", error);
+ this.boundVehicle = "";
+ this.boundVehicleId = null;
+ });
+ },
+
+ // 鍔犺浇鏈娑堟伅鏁伴噺
+ loadUnreadMessageCount() {
+ // 妫�鏌ョ敤鎴锋槸鍚﹀凡鐧诲綍
+ const userId = this.currentUser.userId;
+ if (!userId) {
+ console.log("鐢ㄦ埛鏈櫥褰曪紝璺宠繃鑾峰彇鏈娑堟伅鏁伴噺");
+ return;
+ }
+
+ getUnreadCount()
+ .then((response) => {
+ if (response.code === 200) {
+ this.unreadMessageCount = response.data || 0;
+ // 鏇存柊TabBar寰芥爣
+ this.updateTabBarBadge(this.unreadMessageCount);
+ }
+ })
+ .catch((error) => {
+ console.error("鑾峰彇鏈娑堟伅鏁伴噺澶辫触:", error);
+ });
+ },
+
+ // 鏇存柊TabBar寰芥爣
+ updateTabBarBadge(count) {
+ if (count > 0) {
+ uni.setTabBarBadge({
+ index: 3, // 娑堟伅椤甸潰鍦╰abBar涓殑绱㈠紩
+ text: count > 99 ? "99+" : count.toString(),
+ });
+ } else {
+ uni.removeTabBarBadge({
+ index: 3,
+ });
+ }
+ },
+
+ // 鍔犺浇鐢ㄦ埛淇℃伅锛堜繚鐣欎互鍏煎涔嬪墠鐨勪唬鐮侊級
+ loadUserProfile() {
+ const userId = this.currentUser.userId;
+ if (!userId) {
+ console.error("鐢ㄦ埛鏈櫥褰曪紝鏃犳硶鑾峰彇鐢ㄦ埛淇℃伅");
+ return;
+ }
+
+ getUserProfile()
+ .then((response) => {
+ const userInfo = response.data || response;
// 鑾峰彇鐢ㄦ埛缁戝畾鐨勮溅杈嗕俊鎭�
if (userInfo.boundVehicle) {
- this.boundVehicle = userInfo.boundVehicle.vehicleNumber
- this.boundVehicleId = userInfo.boundVehicle.vehicleId
+ this.boundVehicle = userInfo.boundVehicle.vehicleNumber;
+ this.boundVehicleId = userInfo.boundVehicle.vehicleId;
}
- }).catch(error => {
- console.error('鑾峰彇鐢ㄦ埛淇℃伅澶辫触:', error)
})
- },
-
- // 鍔犺浇姝e湪杩愯鐨勪换鍔�
- loadRunningTasks() {
- const userId = this.currentUser.userId
- if (!userId) {
- console.error('鐢ㄦ埛鏈櫥褰曪紝鏃犳硶鍔犺浇浠诲姟鍒楄〃')
- return
- }
-
- this.loading = true
- // 浣跨敤 /task/my 鎺ュ彛鑾峰彇褰撳墠鐢ㄦ埛鐩稿叧鐨勬墍鏈変换鍔★紙鐢ㄦ埛鍒涘缓銆佸垎閰嶇粰鐢ㄦ埛銆佹墽琛屼汉鏄敤鎴凤級
- getMyTasks().then(response => {
- this.loading = false
+ .catch((error) => {
+ console.error("鑾峰彇鐢ㄦ埛淇℃伅澶辫触:", error);
+ });
+ },
+
+ // 鍔犺浇姝e湪杩愯鐨勪换鍔�
+ loadRunningTasks() {
+ const userId = this.currentUser.userId;
+ if (!userId) {
+ console.error("鐢ㄦ埛鏈櫥褰曪紝鏃犳硶鍔犺浇浠诲姟鍒楄〃");
+ return;
+ }
+
+ this.loading = true;
+ // 浣跨敤 /task/my 鎺ュ彛鑾峰彇褰撳墠鐢ㄦ埛鐩稿叧鐨勬墍鏈変换鍔★紙鐢ㄦ埛鍒涘缓銆佸垎閰嶇粰鐢ㄦ埛銆佹墽琛屼汉鏄敤鎴凤級
+ getMyTasks()
+ .then((response) => {
+ this.loading = false;
// 鏍规嵁鍚庣杩斿洖鐨勬暟鎹粨鏋勮繘琛岃В鏋�
- const data = response.data || response.rows || response || []
+ const data = response.data || response.rows || response || [];
// 杩囨护鍑烘湭瀹屾垚鐨勪换鍔�
- const allTasks = Array.isArray(data) ? data : []
+ const allTasks = Array.isArray(data) ? data : [];
this.taskList = allTasks
- .filter(task => {
+ .filter((task) => {
// 鍙樉绀烘湭瀹屾垚鍜屾湭鍙栨秷鐨勪换鍔�
- return task.taskStatus !== 'COMPLETED' && task.taskStatus !== 'CANCELLED'
+ return (
+ task.taskStatus !== "COMPLETED" &&
+ task.taskStatus !== "CANCELLED"
+ );
})
- .map(task => {
+ .map((task) => {
// 浠巃ssignedVehicles鏁扮粍涓幏鍙栬溅杈嗕俊鎭�
- let vehicleInfo = '鏈垎閰嶈溅杈�'
+ let vehicleInfo = "鏈垎閰嶈溅杈�";
if (task.assignedVehicles && task.assignedVehicles.length > 0) {
- const firstVehicle = task.assignedVehicles[0]
- vehicleInfo = firstVehicle.vehicleNo || '鏈煡杞︾墝'
+ const firstVehicle = task.assignedVehicles[0];
+ vehicleInfo = firstVehicle.vehicleNo || "鏈煡杞︾墝";
if (task.assignedVehicles.length > 1) {
- vehicleInfo += ` 绛�${task.assignedVehicles.length}杈哷
+ vehicleInfo += ` 绛�${task.assignedVehicles.length}杈哷;
}
}
-
+
return {
...task,
// 鏍煎紡鍖栨樉绀哄瓧娈�
@@ -302,579 +465,678 @@
type: task.taskType,
vehicle: vehicleInfo,
vehicleList: task.assignedVehicles || [],
- startLocation: this.formatAddress(task.departureAddress || task.startLocation || '鏈缃�'),
- endLocation: this.formatAddress(task.destinationAddress || task.endLocation || '鏈缃�'),
- startTime: task.plannedStartTime ? this.formatDateTime(task.plannedStartTime) : '鏈缃�',
- assignee: task.assigneeName || '鏈垎閰�',
- taskNo: task.taskCode || '鏈煡缂栧彿',
- status: this.convertStatus(task.taskStatus) // 杞崲鐘舵�佹牸寮忎互鍏煎鏃I
- }
- })
- }).catch(error => {
- this.loading = false
- console.error('鍔犺浇浠诲姟鍒楄〃澶辫触:', error)
+ startLocation: this.formatAddress(
+ task.departureAddress || task.startLocation || "鏈缃�"
+ ),
+ endLocation: this.formatAddress(
+ task.destinationAddress || task.endLocation || "鏈缃�"
+ ),
+ startTime: task.plannedStartTime
+ ? formatDateTime(task.plannedStartTime, "YYYY-MM-DD HH:mm")
+ : "鏈缃�",
+ assignee: task.assigneeName || "鏈垎閰�",
+ taskNo: task.taskCode || "鏈煡缂栧彿",
+ status: this.convertStatus(task.taskStatus), // 杞崲鐘舵�佹牸寮忎互鍏煎鏃I
+ };
+ });
})
- },
-
- // 鏍煎紡鍖栨棩鏈熸椂闂�
- formatDateTime(dateTime) {
- if (!dateTime) return ''
- const date = new Date(dateTime)
- return date.toLocaleString('zh-CN', {
- year: 'numeric',
- month: '2-digit',
- day: '2-digit',
- hour: '2-digit',
- minute: '2-digit'
- })
- },
-
- // 鏍煎紡鍖栧湴鍧� - 鍙樉绀�-鍓嶉潰鐨勯儴鍒�
- formatAddress(address) {
- if (!address) return '鏈缃�'
- const dashIndex = address.indexOf('-')
- if (dashIndex > 0) {
- return address.substring(0, dashIndex)
- }
- return address
- },
-
- // 杞崲鐘舵�佹牸寮忥紙灏嗘暟鎹簱鐘舵�佽浆鎹负UI浣跨敤鐨勭姸鎬侊級
- convertStatus(dbStatus) {
- const statusMap = {
- 'PENDING': 'pending',
- 'DEPARTING': 'processing',
- 'ARRIVED': 'processing',
- 'RETURNING': 'processing',
- 'IN_PROGRESS': 'processing',
- 'COMPLETED': 'completed',
- 'CANCELLED': 'cancelled'
- }
- return statusMap[dbStatus] || 'pending'
- },
- // 璺宠浆鍒扮粦瀹氳溅杈嗛〉闈�
- goToBindVehicle() {
- // 璺宠浆鍒扮粦瀹氳溅杈嗙殑椤甸潰
- this.$tab.navigateTo('/pages/bind-vehicle');
- },
-
- // 璺宠浆鍒版秷鎭〉闈�
- goToMessages() {
- this.$tab.switchTab('/pages/message/index');
- },
-
- // 鏌ョ湅浠诲姟璇︽儏
- viewTaskDetail(task) {
- // 璺宠浆鍒颁换鍔¤鎯呴〉闈� - 浣跨敤taskId
- this.$tab.navigateTo(`/pages/task/detail?id=${task.taskId || task.id}`);
- },
-
- // 澶勭悊浠诲姟鎿嶄綔
- handleTaskAction(task, action) {
- switch (action) {
- case 'depart':
- // 鍑哄彂 -> 鐘舵�佸彉涓哄嚭鍙戜腑
- this.$modal.confirm('纭畾瑕佸嚭鍙戝悧锛�').then(() => {
- this.updateTaskStatus(task.taskId, 'DEPARTING', '浠诲姟宸插嚭鍙�')
- }).catch(() => {});
- break;
-
- case 'cancel':
- // 鍙栨秷 -> 浜屾纭鍚庣姸鎬佸彉涓哄凡鍙栨秷
- this.$modal.confirm('纭畾瑕佸彇娑堟浠诲姟鍚楋紵').then(() => {
- this.updateTaskStatus(task.taskId, 'CANCELLED', '浠诲姟宸插彇娑�')
- }).catch(() => {});
- break;
-
- case 'arrive':
- // 宸插埌杈� -> 鐘舵�佸彉涓哄凡鍒拌揪
- this.$modal.confirm('纭宸插埌杈剧洰鐨勫湴锛�').then(() => {
- this.updateTaskStatus(task.taskId, 'ARRIVED', '宸插埌杈剧洰鐨勫湴')
- }).catch(() => {});
- break;
-
- case 'forceCancel':
- // 寮哄埗缁撴潫 -> 鐘舵�佸彉涓哄凡鍙栨秷
- this.$modal.confirm('纭畾瑕佸己鍒剁粨鏉熸浠诲姟鍚楋紵').then(() => {
- this.updateTaskStatus(task.taskId, 'CANCELLED', '浠诲姟宸插己鍒剁粨鏉�')
- }).catch(() => {});
- break;
-
- case 'return':
- // 宸茶繑绋� -> 鐘舵�佸彉涓鸿繑绋嬩腑
- this.$modal.confirm('纭寮�濮嬭繑绋嬶紵').then(() => {
- this.updateTaskStatus(task.taskId, 'RETURNING', '宸插紑濮嬭繑绋�')
- }).catch(() => {});
- break;
-
- case 'complete':
- // 宸插畬鎴� -> 鐘舵�佸彉涓哄凡瀹屾垚
- this.$modal.confirm('纭浠诲姟宸插畬鎴愶紵').then(() => {
- this.updateTaskStatus(task.taskId, 'COMPLETED', '浠诲姟宸插畬鎴�')
- }).catch(() => {});
- break;
- }
- },
-
- // 鏇存柊浠诲姟鐘舵��
- updateTaskStatus(taskId, status, remark) {
- // 鑾峰彇GPS浣嶇疆淇℃伅
- this.getLocationAndUpdateStatus(taskId, status, remark)
- },
-
- // 鑾峰彇浣嶇疆淇℃伅骞舵洿鏂扮姸鎬�
- getLocationAndUpdateStatus(taskId, status, remark) {
- const that = this
-
- // 浣跨敤uni.getLocation鑾峰彇GPS浣嶇疆
- uni.getLocation({
- type: 'gcj02',
- geocode: true,
- altitude: true,
- success: function(res) {
- console.log('GPS瀹氫綅鎴愬姛:', res)
-
- const statusData = {
- taskStatus: status,
- remark: remark,
- latitude: res.latitude,
- longitude: res.longitude,
- locationAddress: res.address ? res.address.street || res.address.poiName || '' : '',
- locationProvince: res.address ? res.address.province || '' : '',
- locationCity: res.address ? res.address.city || '' : '',
- locationDistrict: res.address ? res.address.district || '' : '',
- gpsAccuracy: res.accuracy,
- altitude: res.altitude,
- speed: res.speed,
- heading: res.direction || res.heading
- }
-
- changeTaskStatus(taskId, statusData).then(response => {
- that.$modal.showToast('鐘舵�佹洿鏂版垚鍔�')
- that.loadRunningTasks()
- }).catch(error => {
- console.error('鏇存柊浠诲姟鐘舵�佸け璐�:', error)
- that.$modal.showToast('鐘舵�佹洿鏂板け璐ワ紝璇烽噸璇�')
+ .catch((error) => {
+ this.loading = false;
+ console.error("鍔犺浇浠诲姟鍒楄〃澶辫触:", error);
+ });
+ },
+
+ // 鏍煎紡鍖栧湴鍧� - 鍙樉绀�-鍓嶉潰鐨勯儴鍒�
+ formatAddress(address) {
+ if (!address) return "鏈缃�";
+ const dashIndex = address.indexOf("-");
+ if (dashIndex > 0) {
+ return address.substring(0, dashIndex);
+ }
+ return address;
+ },
+
+ // 杞崲鐘舵�佹牸寮忥紙灏嗘暟鎹簱鐘舵�佽浆鎹负UI浣跨敤鐨勭姸鎬侊級
+ convertStatus(dbStatus) {
+ const statusMap = {
+ PENDING: "pending",
+ DEPARTING: "processing",
+ ARRIVED: "processing",
+ RETURNING: "processing",
+ IN_PROGRESS: "processing",
+ COMPLETED: "completed",
+ CANCELLED: "cancelled",
+ };
+ return statusMap[dbStatus] || "pending";
+ },
+ // 璺宠浆鍒扮粦瀹氳溅杈嗛〉闈�
+ goToBindVehicle() {
+ // 璺宠浆鍒扮粦瀹氳溅杈嗙殑椤甸潰
+ this.$tab.navigateTo("/pages/bind-vehicle");
+ },
+
+ // 璺宠浆鍒版秷鎭〉闈�
+ goToMessages() {
+ this.$tab.switchTab("/pages/message/index");
+ },
+
+ // 鏌ョ湅浠诲姟璇︽儏
+ viewTaskDetail(task) {
+ // 璺宠浆鍒颁换鍔¤鎯呴〉闈� - 浣跨敤taskId
+ this.$tab.navigateTo(`/pagesTask/detail?id=${task.taskId || task.id}`);
+ },
+
+ // 澶勭悊浠诲姟鎿嶄綔
+ handleTaskAction(task, action) {
+ switch (action) {
+ case "depart":
+ // 鍑哄彂 -> 鐘舵�佸彉涓哄嚭鍙戜腑
+ this.$modal
+ .confirm("纭畾瑕佸嚭鍙戝悧锛�")
+ .then(() => {
+ this.updateTaskStatus(task.taskId, "DEPARTING", "浠诲姟宸插嚭鍙�");
})
- },
- fail: function(err) {
- console.error('GPS瀹氫綅澶辫触:', err)
-
- that.$modal.confirm('GPS瀹氫綅澶辫触锛屾槸鍚︾户缁洿鏂扮姸鎬侊紵').then(() => {
+ .catch(() => {});
+ break;
+
+ case "cancel":
+ // 鍙栨秷 -> 浜屾纭鍚庣姸鎬佸彉涓哄凡鍙栨秷
+ this.$modal
+ .confirm("纭畾瑕佸彇娑堟浠诲姟鍚楋紵")
+ .then(() => {
+ this.updateTaskStatus(task.taskId, "CANCELLED", "浠诲姟宸插彇娑�");
+ })
+ .catch(() => {});
+ break;
+
+ case "arrive":
+ // 宸插埌杈� -> 鐘舵�佸彉涓哄凡鍒拌揪
+ this.$modal
+ .confirm("纭宸插埌杈剧洰鐨勫湴锛�")
+ .then(() => {
+ this.updateTaskStatus(task.taskId, "ARRIVED", "宸插埌杈剧洰鐨勫湴");
+ })
+ .catch(() => {});
+ break;
+
+ case "forceCancel":
+ // 寮哄埗缁撴潫 -> 鐘舵�佸彉涓哄凡鍙栨秷
+ this.$modal
+ .confirm("纭畾瑕佸己鍒剁粨鏉熸浠诲姟鍚楋紵")
+ .then(() => {
+ this.updateTaskStatus(task.taskId, "CANCELLED", "浠诲姟宸插己鍒剁粨鏉�");
+ })
+ .catch(() => {});
+ break;
+
+ case "return":
+ // 宸茶繑绋� -> 鐘舵�佸彉涓鸿繑绋嬩腑
+ this.$modal
+ .confirm("纭寮�濮嬭繑绋嬶紵")
+ .then(() => {
+ this.updateTaskStatus(task.taskId, "RETURNING", "宸插紑濮嬭繑绋�");
+ })
+ .catch(() => {});
+ break;
+
+ case "complete":
+ // 宸插畬鎴� -> 鐘舵�佸彉涓哄凡瀹屾垚
+ this.$modal
+ .confirm("纭浠诲姟宸插畬鎴愶紵")
+ .then(() => {
+ this.updateTaskStatus(task.taskId, "COMPLETED", "浠诲姟宸插畬鎴�");
+ })
+ .catch(() => {});
+ break;
+ }
+ },
+
+ // 鏇存柊浠诲姟鐘舵��
+ updateTaskStatus(taskId, status, remark) {
+ // 鑾峰彇GPS浣嶇疆淇℃伅
+ this.getLocationAndUpdateStatus(taskId, status, remark);
+ },
+
+ // 鑾峰彇浣嶇疆淇℃伅骞舵洿鏂扮姸鎬�
+ getLocationAndUpdateStatus(taskId, status, remark) {
+ const that = this;
+
+ // 浣跨敤uni.getLocation鑾峰彇GPS浣嶇疆
+ uni.getLocation({
+ type: "gcj02",
+ geocode: true,
+ altitude: true,
+ success: function (res) {
+ console.log("GPS瀹氫綅鎴愬姛:", res);
+
+ const statusData = {
+ taskStatus: status,
+ remark: remark,
+ latitude: res.latitude,
+ longitude: res.longitude,
+ locationAddress: res.address
+ ? res.address.street || res.address.poiName || ""
+ : "",
+ locationProvince: res.address ? res.address.province || "" : "",
+ locationCity: res.address ? res.address.city || "" : "",
+ locationDistrict: res.address ? res.address.district || "" : "",
+ gpsAccuracy: res.accuracy,
+ altitude: res.altitude,
+ speed: res.speed,
+ heading: res.direction || res.heading,
+ };
+
+ changeTaskStatus(taskId, statusData)
+ .then((response) => {
+ that.$modal.showToast("鐘舵�佹洿鏂版垚鍔�");
+ that.loadRunningTasks();
+ })
+ .catch((error) => {
+ console.error("鏇存柊浠诲姟鐘舵�佸け璐�:", error);
+ that.$modal.showToast("鐘舵�佹洿鏂板け璐ワ紝璇烽噸璇�");
+ });
+ },
+ fail: function (err) {
+ console.error("GPS瀹氫綅澶辫触:", err);
+
+ that.$modal
+ .confirm("GPS瀹氫綅澶辫触锛屾槸鍚︾户缁洿鏂扮姸鎬侊紵")
+ .then(() => {
const statusData = {
taskStatus: status,
- remark: remark
- }
-
- changeTaskStatus(taskId, statusData).then(response => {
- that.$modal.showToast('鐘舵�佹洿鏂版垚鍔�')
- that.loadRunningTasks()
- }).catch(error => {
- console.error('鏇存柊浠诲姟鐘舵�佸け璐�:', error)
- that.$modal.showToast('鐘舵�佹洿鏂板け璐ワ紝璇烽噸璇�')
- })
- }).catch(() => {})
+ remark: remark,
+ };
+
+ changeTaskStatus(taskId, statusData)
+ .then((response) => {
+ that.$modal.showToast("鐘舵�佹洿鏂版垚鍔�");
+ that.loadRunningTasks();
+ })
+ .catch((error) => {
+ console.error("鏇存柊浠诲姟鐘舵�佸け璐�:", error);
+ that.$modal.showToast("鐘舵�佹洿鏂板け璐ワ紝璇烽噸璇�");
+ });
+ })
+ .catch(() => {});
+ },
+ });
+ },
+
+ // 鑾峰彇鐘舵�佹牱寮忕被
+ getStatusClass(status) {
+ const statusClassMap = {
+ PENDING: "status-pending",
+ DEPARTING: "status-departing",
+ ARRIVED: "status-arrived",
+ RETURNING: "status-returning",
+ COMPLETED: "status-completed",
+ CANCELLED: "status-cancelled",
+ IN_PROGRESS: "status-in-progress",
+ };
+ return statusClassMap[status] || "status-default";
+ },
+
+ getStatusText(status) {
+ // 鏀寔鏂版棫涓ょ鐘舵�佹牸寮�
+ const statusMap = {
+ // 鏂版牸寮忥紙鏁版嵁搴撶姸鎬侊級
+ PENDING: "寰呭鐞�",
+ DEPARTING: "鍑哄彂涓�",
+ ARRIVED: "宸插埌杈�",
+ RETURNING: "杩旂▼涓�",
+ COMPLETED: "宸插畬鎴�",
+ CANCELLED: "宸插彇娑�",
+ IN_PROGRESS: "澶勭悊涓�",
+ // 鏃ф牸寮忥紙UI鐘舵�侊級
+ pending: "寰呭鐞�",
+ processing: "澶勭悊涓�",
+ completed: "宸插畬鎴�",
+ };
+ return statusMap[status] || "鏈煡";
+ },
+
+ getTaskTypeText(type) {
+ const typeMap = {
+ // 鏂版牸寮忥紙鏁版嵁搴撶被鍨嬶級
+ MAINTENANCE: "缁翠慨淇濆吇",
+ FUEL: "鍔犳补",
+ OTHER: "鍏朵粬",
+ EMERGENCY_TRANSFER: "杞繍浠诲姟",
+ WELFARE: "绂忕杞�",
+ // 鏃ф牸寮忥紙UI绫诲瀷锛�
+ maintenance: "缁翠慨淇濆吇",
+ refuel: "鍔犳补",
+ inspection: "宸℃",
+ emergency: "杞繍浠诲姟",
+ welfare: "绂忕杞�",
+ };
+ return typeMap[type] || "鏈煡绫诲瀷";
+ },
+
+ clickConfirmsubscribeTaskNotify() {
+ subscribeManager.subscribeWithConfirm()
+ .then((result) => {
+ if (result.success) {
+ this.hasSubscribed = true;
}
})
- },
-
- // 鑾峰彇鐘舵�佹牱寮忕被
- getStatusClass(status) {
- const statusClassMap = {
- 'PENDING': 'status-pending',
- 'DEPARTING': 'status-departing',
- 'ARRIVED': 'status-arrived',
- 'RETURNING': 'status-returning',
- 'COMPLETED': 'status-completed',
- 'CANCELLED': 'status-cancelled',
- 'IN_PROGRESS': 'status-in-progress'
- }
- return statusClassMap[status] || 'status-default'
- },
-
- getStatusText(status) {
- // 鏀寔鏂版棫涓ょ鐘舵�佹牸寮�
- const statusMap = {
- // 鏂版牸寮忥紙鏁版嵁搴撶姸鎬侊級
- 'PENDING': '寰呭鐞�',
- 'DEPARTING': '鍑哄彂涓�',
- 'ARRIVED': '宸插埌杈�',
- 'RETURNING': '杩旂▼涓�',
- 'COMPLETED': '宸插畬鎴�',
- 'CANCELLED': '宸插彇娑�',
- 'IN_PROGRESS': '澶勭悊涓�',
- // 鏃ф牸寮忥紙UI鐘舵�侊級
- 'pending': '寰呭鐞�',
- 'processing': '澶勭悊涓�',
- 'completed': '宸插畬鎴�'
- }
- return statusMap[status] || '鏈煡'
- },
-
- getTaskTypeText(type) {
- const typeMap = {
- // 鏂版牸寮忥紙鏁版嵁搴撶被鍨嬶級
- 'MAINTENANCE': '缁翠慨淇濆吇',
- 'FUEL': '鍔犳补',
- 'OTHER': '鍏朵粬',
- 'EMERGENCY_TRANSFER': '鎬ユ晳杞繍',
- 'WELFARE': '绂忕杞�',
- // 鏃ф牸寮忥紙UI绫诲瀷锛�
- 'maintenance': '缁翠慨淇濆吇',
- 'refuel': '鍔犳补',
- 'inspection': '宸℃',
- 'emergency': '鎬ユ晳杞繍',
- 'welfare': '绂忕杞�'
- }
- return typeMap[type] || '鏈煡绫诲瀷'
- }
- }
- }
+ .catch((error) => {
+ console.log('璁㈤槄鍙栨秷鎴栧け璐ワ細', error);
+ });
+ },
+
+ // 璁㈤槄浠诲姟閫氱煡锛堢洿鎺ヨ皟鐢紝涓嶆樉绀虹‘璁ゅ脊绐楋級
+ subscribeTaskNotify() {
+ subscribeManager.subscribeDirect()
+ .then((result) => {
+ if (result.success) {
+ this.hasSubscribed = true;
+ }
+ })
+ .catch((error) => {
+ console.log('璁㈤槄澶辫触锛�', error);
+ });
+ },
+ },
+};
</script>
<style lang="scss">
- .home-container {
- padding: 20rpx;
- background-color: #f5f5f5;
- height: 100vh;
- display: flex;
- flex-direction: column;
- // 闅愯棌婊氬姩鏉′絾淇濇寔婊氬姩鍔熻兘
- ::-webkit-scrollbar {
- display: none;
- width: 0 !important;
- height: 0 !important;
- background: transparent;
- }
-
- // Firefox婊氬姩鏉¢殣钘�
- * {
- scrollbar-width: none; /* Firefox */
- }
-
- // IE/Edge婊氬姩鏉¢殣钘�
- * {
- -ms-overflow-style: none; /* IE 10+ */
- }
+.home-container {
+ padding: 20rpx;
+ background-color: #f5f5f5;
+ height: 100vh;
+ display: flex;
+ flex-direction: column;
+ // 闅愯棌婊氬姩鏉′絾淇濇寔婊氬姩鍔熻兘
+ ::-webkit-scrollbar {
+ display: none;
+ width: 0 !important;
+ height: 0 !important;
+ background: transparent;
}
-
- // 鐢ㄦ埛淇℃伅鍖哄煙
- .user-info-section {
- background-color: white;
- border-radius: 15rpx;
- padding: 30rpx;
- margin-bottom: 20rpx;
- box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
- flex-shrink: 0; // 闃叉鏀剁缉
-
- .user-info-content {
- display: flex;
- justify-content: space-between;
- align-items: center;
-
- .user-details {
- flex: 1;
-
- .user-info-row {
- display: flex;
- align-items: center;
- flex-wrap: wrap;
- margin-bottom: 12rpx;
-
- .user-name {
- font-size: 32rpx;
- font-weight: bold;
- color: #333;
- }
-
- .separator {
- margin: 0 12rpx;
- color: #ddd;
- font-size: 28rpx;
- }
-
- .branch-company {
- font-size: 26rpx;
- color: #666;
- display: flex;
- align-items: center;
- }
-
- .vehicle-info {
- font-size: 26rpx;
- color: #007AFF;
- display: flex;
- align-items: center;
- }
+
+ // Firefox婊氬姩鏉¢殣钘�
+ * {
+ scrollbar-width: none; /* Firefox */
+ }
+
+ // IE/Edge婊氬姩鏉¢殣钘�
+ * {
+ -ms-overflow-style: none; /* IE 10+ */
+ }
+}
+
+// 鐢ㄦ埛淇℃伅鍖哄煙
+.user-info-section {
+ background-color: white;
+ border-radius: 15rpx;
+ padding: 30rpx;
+ margin-bottom: 20rpx;
+ box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
+ flex-shrink: 0; // 闃叉鏀剁缉
+
+ .user-info-content {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .user-details {
+ flex: 1;
+
+ .user-info-row {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ margin-bottom: 12rpx;
+
+ .user-name {
+ font-size: 32rpx;
+ font-weight: bold;
+ color: #333;
}
-
- .bind-vehicle-btn {
+
+ .separator {
+ margin: 0 12rpx;
+ color: #ddd;
+ font-size: 28rpx;
+ }
+
+ .branch-company {
font-size: 26rpx;
- color: #007AFF;
+ color: #666;
display: flex;
align-items: center;
-
- &:active {
- opacity: 0.7;
- }
+ }
+
+ .vehicle-info {
+ font-size: 26rpx;
+ color: #007aff;
+ display: flex;
+ align-items: center;
+ }
+ }
+
+ .bind-vehicle-btn {
+ font-size: 26rpx;
+ color: #007aff;
+ display: flex;
+ align-items: center;
+
+ &:active {
+ opacity: 0.7;
}
}
}
}
-
- // 娑堟伅鍏ュ彛
- .message-entry {
+}
+
+// 娑堟伅鍏ュ彛
+.message-entry {
+ display: flex;
+ align-items: center;
+ background-color: white;
+ border-radius: 15rpx;
+ padding: 30rpx;
+ margin-bottom: 20rpx;
+ box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
+ position: relative;
+
+ .message-icon {
+ margin-right: 20rpx;
+ }
+
+ .message-text {
+ flex: 1;
+ font-size: 32rpx;
+ color: #333;
+ }
+
+ .unread-dot {
+ position: absolute;
+ top: 15rpx;
+ right: 60rpx;
+ background-color: #ff4d4f;
+ color: white;
+ border-radius: 50%;
+ width: 32rpx;
+ height: 32rpx;
display: flex;
align-items: center;
- background-color: white;
- border-radius: 15rpx;
- padding: 30rpx;
- margin-bottom: 20rpx;
- box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
- position: relative;
-
- .message-icon {
- margin-right: 20rpx;
- }
-
- .message-text {
- flex: 1;
- font-size: 32rpx;
- color: #333;
- }
-
- .unread-dot {
- position: absolute;
- top: 15rpx;
- right: 60rpx;
- background-color: #ff4d4f;
- color: white;
- border-radius: 50%;
- width: 32rpx;
- height: 32rpx;
- display: flex;
- align-items: center;
- justify-content: center;
- font-size: 20rpx;
- }
-
- .arrow {
- margin-left: 20rpx;
- }
+ justify-content: center;
+ font-size: 20rpx;
}
-
- // 姝e湪杩愯鐨勪换鍔℃爣棰�
- .running-tasks-header {
- margin-bottom: 20rpx;
- flex-shrink: 0; // 闃叉鏀剁缉
-
- .header-title {
- font-size: 36rpx;
+
+ .arrow {
+ margin-left: 20rpx;
+ }
+}
+
+// 璁㈤槄閫氱煡妯箙
+.subscribe-banner {
+ display: flex;
+ align-items: center;
+ background: linear-gradient(135deg, #fff9e6 0%, #fff3e0 100%);
+ border-radius: 15rpx;
+ padding: 30rpx;
+ margin-bottom: 20rpx;
+ box-shadow: 0 2rpx 10rpx rgba(255, 149, 0, 0.1);
+ border: 1rpx solid #ffe0b2;
+
+ .banner-icon {
+ margin-right: 20rpx;
+ flex-shrink: 0;
+ }
+
+ .banner-content {
+ flex: 1;
+
+ .banner-title {
+ font-size: 30rpx;
font-weight: bold;
color: #333;
+ margin-bottom: 8rpx;
+ }
+
+ .banner-desc {
+ font-size: 24rpx;
+ color: #666;
+ line-height: 1.4;
}
}
-
- // 姝e湪杩愯鐨勪换鍔″垪琛�
- .running-tasks-section {
- flex: 1;
+
+ .banner-action {
+ display: flex;
+ align-items: center;
+ padding: 12rpx 24rpx;
background-color: white;
- border-radius: 15rpx;
- padding: 30rpx;
- box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
- // 闅愯棌婊氬姩鏉′絾淇濇寔婊氬姩鍔熻兘
- ::-webkit-scrollbar {
- display: none;
- width: 0 !important;
- height: 0 !important;
- background: transparent;
+ border-radius: 30rpx;
+ flex-shrink: 0;
+
+ text {
+ font-size: 26rpx;
+ color: #007aff;
+ margin-right: 4rpx;
}
-
- // Firefox婊氬姩鏉¢殣钘�
- * {
- scrollbar-width: none; /* Firefox */
- }
-
- // IE/Edge婊氬姩鏉¢殣钘�
- * {
- -ms-overflow-style: none; /* IE 10+ */
- }
-
- .task-list {
- .task-item {
- background-color: #fafafa;
- border-radius: 15rpx;
- margin-bottom: 30rpx;
- overflow: hidden;
-
- .task-main {
- padding: 30rpx;
- border-bottom: 1rpx solid #f0f0f0;
-
- // 浠诲姟澶撮儴锛氭爣棰樺拰鐘舵��
- .task-header {
- display: flex;
- justify-content: space-between;
- align-items: flex-start;
- margin-bottom: 15rpx;
-
- .task-title {
- flex: 1;
- font-size: 32rpx;
- font-weight: bold;
- padding-right: 20rpx;
- line-height: 1.4;
- }
-
- .task-status {
- padding: 8rpx 20rpx;
- border-radius: 30rpx;
- font-size: 24rpx;
- white-space: nowrap;
- flex-shrink: 0;
-
- // 寰呭鐞� - 姗欒壊
- &.status-pending {
- background-color: #fff3e0;
- color: #ff9500;
- }
-
- // 鍑哄彂涓� - 钃濊壊
- &.status-departing {
- background-color: #e3f2fd;
- color: #007AFF;
- }
-
- // 宸插埌杈� - 绱壊
- &.status-arrived {
- background-color: #f3e5f5;
- color: #9c27b0;
- }
-
- // 杩旂▼涓� - 闈掕壊
- &.status-returning {
- background-color: #e0f2f1;
- color: #009688;
- }
-
- // 宸插畬鎴� - 缁胯壊
- &.status-completed {
- background-color: #e8f5e9;
- color: #34C759;
- }
-
- // 宸插彇娑� - 鐏拌壊
- &.status-cancelled {
- background-color: #f5f5f5;
- color: #999;
- }
-
- // 澶勭悊涓� (鍏煎鏃ф暟鎹�) - 钃濊壊
- &.status-in-progress {
- background-color: #e3f2fd;
- color: #007AFF;
- }
-
- // 榛樿鏍峰紡
- &.status-default {
- background-color: #f5f5f5;
- color: #666;
- }
- }
+ }
+
+ &:active {
+ opacity: 0.9;
+ }
+}
+
+// 姝e湪杩愯鐨勪换鍔℃爣棰�
+.running-tasks-header {
+ margin-bottom: 20rpx;
+ flex-shrink: 0; // 闃叉鏀剁缉
+
+ .header-title {
+ font-size: 36rpx;
+ font-weight: bold;
+ color: #333;
+ }
+}
+
+// 姝e湪杩愯鐨勪换鍔″垪琛�
+.running-tasks-section {
+ flex: 1;
+ background-color: white;
+ border-radius: 15rpx;
+ padding: 30rpx;
+ box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
+ // 闅愯棌婊氬姩鏉′絾淇濇寔婊氬姩鍔熻兘
+ ::-webkit-scrollbar {
+ display: none;
+ width: 0 !important;
+ height: 0 !important;
+ background: transparent;
+ }
+
+ // Firefox婊氬姩鏉¢殣钘�
+ * {
+ scrollbar-width: none; /* Firefox */
+ }
+
+ // IE/Edge婊氬姩鏉¢殣钘�
+ * {
+ -ms-overflow-style: none; /* IE 10+ */
+ }
+
+ .task-list {
+ .task-item {
+ background-color: #fafafa;
+ border-radius: 15rpx;
+ margin-bottom: 30rpx;
+ overflow: hidden;
+
+ .task-main {
+ padding: 30rpx;
+ border-bottom: 1rpx solid #f0f0f0;
+
+ // 浠诲姟澶撮儴锛氭爣棰樺拰鐘舵��
+ .task-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ margin-bottom: 15rpx;
+
+ .task-title {
+ flex: 1;
+ font-size: 32rpx;
+ font-weight: bold;
+ padding-right: 20rpx;
+ line-height: 1.4;
}
-
- // 浠诲姟缂栧彿鍗曠嫭涓�琛�
- .task-code-row {
- margin-bottom: 15rpx;
- padding: 10rpx 0;
- border-bottom: 1rpx dashed #e0e0e0;
-
- .task-code {
- font-size: 28rpx;
- color: #333;
- font-weight: 500;
- font-family: monospace;
+
+ .task-status {
+ padding: 8rpx 20rpx;
+ border-radius: 30rpx;
+ font-size: 24rpx;
+ white-space: nowrap;
+ flex-shrink: 0;
+
+ // 寰呭鐞� - 姗欒壊
+ &.status-pending {
+ background-color: #fff3e0;
+ color: #ff9500;
}
- }
-
- .task-info {
- .info-row {
- display: flex;
- margin-bottom: 15rpx;
-
- &:last-child {
- margin-bottom: 0;
- }
-
- .info-item {
- flex: 1;
- display: flex;
-
- .label {
- font-size: 26rpx;
- color: #666;
- margin-right: 10rpx;
- white-space: nowrap;
- }
-
- .value {
- font-size: 26rpx;
- flex: 1;
- word-break: break-all;
- }
- }
+
+ // 鍑哄彂涓� - 钃濊壊
+ &.status-departing {
+ background-color: #e3f2fd;
+ color: #007aff;
+ }
+
+ // 宸插埌杈� - 绱壊
+ &.status-arrived {
+ background-color: #f3e5f5;
+ color: #9c27b0;
+ }
+
+ // 杩旂▼涓� - 闈掕壊
+ &.status-returning {
+ background-color: #e0f2f1;
+ color: #009688;
+ }
+
+ // 宸插畬鎴� - 缁胯壊
+ &.status-completed {
+ background-color: #e8f5e9;
+ color: #34c759;
+ }
+
+ // 宸插彇娑� - 鐏拌壊
+ &.status-cancelled {
+ background-color: #f5f5f5;
+ color: #999;
+ }
+
+ // 澶勭悊涓� (鍏煎鏃ф暟鎹�) - 钃濊壊
+ &.status-in-progress {
+ background-color: #e3f2fd;
+ color: #007aff;
+ }
+
+ // 榛樿鏍峰紡
+ &.status-default {
+ background-color: #f5f5f5;
+ color: #666;
}
}
}
-
- .task-actions {
- display: flex;
- padding: 20rpx;
-
- .action-btn {
- flex: 1;
- height: 70rpx;
- border-radius: 10rpx;
- font-size: 26rpx;
- margin: 0 5rpx;
- background-color: #f0f0f0;
+
+ // 浠诲姟缂栧彿鍗曠嫭涓�琛�
+ .task-code-row {
+ margin-bottom: 15rpx;
+ padding: 10rpx 0;
+ border-bottom: 1rpx dashed #e0e0e0;
+
+ .task-code {
+ font-size: 28rpx;
color: #333;
-
- &.primary {
- background-color: #007AFF;
- color: white;
- }
-
- &.cancel {
- background-color: #ff3b30;
- color: white;
- }
-
- &.disabled {
- opacity: 0.5;
- }
-
- &:first-child {
- margin-left: 0;
- }
-
+ font-weight: 500;
+ font-family: monospace;
+ }
+ }
+
+ .task-info {
+ .info-row {
+ display: flex;
+ margin-bottom: 15rpx;
+
&:last-child {
- margin-right: 0;
+ margin-bottom: 0;
+ }
+
+ .info-item {
+ flex: 1;
+ display: flex;
+
+ .label {
+ font-size: 26rpx;
+ color: #666;
+ margin-right: 10rpx;
+ white-space: nowrap;
+ }
+
+ .value {
+ font-size: 26rpx;
+ flex: 1;
+ word-break: break-all;
+ }
}
}
}
}
-
- .no-data {
- text-align: center;
- padding: 100rpx 0;
- color: #999;
-
- text {
- display: block;
- margin-top: 20rpx;
+
+ .task-actions {
+ display: flex;
+ padding: 20rpx;
+
+ .action-btn {
+ flex: 1;
+ height: 70rpx;
+ border-radius: 10rpx;
+ font-size: 26rpx;
+ margin: 0 5rpx;
+ background-color: #f0f0f0;
+ color: #333;
+
+ &.primary {
+ background-color: #007aff;
+ color: white;
+ }
+
+ &.cancel {
+ background-color: #ff3b30;
+ color: white;
+ }
+
+ &.disabled {
+ opacity: 0.5;
+ }
+
+ &:first-child {
+ margin-left: 0;
+ }
+
+ &:last-child {
+ margin-right: 0;
+ }
}
+ }
+ }
+
+ .no-data {
+ text-align: center;
+ padding: 100rpx 0;
+ color: #999;
+
+ text {
+ display: block;
+ margin-top: 20rpx;
}
}
}
+}
</style>
\ No newline at end of file
--
Gitblit v1.9.1