Przeglądaj źródła

接单成功,异常上报成功,UI初步调整,订单详情优化

Huanyi 1 miesiąc temu
rodzic
commit
3a260b686d
100 zmienionych plików z 1250 dodań i 231 usunięć
  1. 36 18
      .idea/workspace.xml
  2. 16 0
      api/archieves/pet/index.js
  3. 23 0
      api/fulfiller.js
  4. 11 0
      api/service.js
  5. 16 0
      api/system/dict/index.js
  6. 115 0
      components/custom-tabbar/index.vue
  7. 3 1
      manifest.json
  8. 1 0
      pages.json
  9. 6 50
      pages/home/index.vue
  10. 34 7
      pages/home/logic.js
  11. 2 4
      pages/home/style.css
  12. 1 0
      pages/mine/index.vue
  13. 5 0
      pages/mine/logic.js
  14. 83 26
      pages/orders/anomaly.vue
  15. 233 82
      pages/orders/detail-logic.js
  16. 283 8
      pages/orders/detail-style.css
  17. 65 4
      pages/orders/detail.vue
  18. 8 24
      pages/orders/index.vue
  19. 30 7
      pages/orders/logic.js
  20. BIN
      unpackage/cache/apk/__UNI__76F5C47_cm.apk
  21. 1 0
      unpackage/cache/apk/apkurl
  22. 0 0
      unpackage/cache/apk/cmManifestCache.json
  23. 4 0
      unpackage/cache/certdata
  24. 4 0
      unpackage/cache/cloudcertificate/certini
  25. BIN
      unpackage/cache/cloudcertificate/package.keystore
  26. 15 0
      unpackage/cache/wgt/__UNI__76F5C47/__uniappautomator.js
  27. 31 0
      unpackage/cache/wgt/__UNI__76F5C47/__uniappchooselocation.js
  28. BIN
      unpackage/cache/wgt/__UNI__76F5C47/__uniapperror.png
  29. 31 0
      unpackage/cache/wgt/__UNI__76F5C47/__uniappopenlocation.js
  30. 31 0
      unpackage/cache/wgt/__UNI__76F5C47/__uniapppicker.js
  31. 6 0
      unpackage/cache/wgt/__UNI__76F5C47/__uniappquill.js
  32. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/__uniappquillimageresize.js
  33. 31 0
      unpackage/cache/wgt/__UNI__76F5C47/__uniappscan.js
  34. BIN
      unpackage/cache/wgt/__UNI__76F5C47/__uniappsuccess.png
  35. 24 0
      unpackage/cache/wgt/__UNI__76F5C47/__uniappview.html
  36. 4 0
      unpackage/cache/wgt/__UNI__76F5C47/app-config-service.js
  37. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/app-config.js
  38. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/app-service.js
  39. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/app.css
  40. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/manifest.json
  41. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/home/index.css
  42. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/home/work-status.css
  43. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/login/login.css
  44. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/login/reset-pwd-set.css
  45. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/login/reset-pwd-verify.css
  46. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/index.css
  47. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/level/index.css
  48. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/message/detail.css
  49. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/message/index.css
  50. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/message/order.css
  51. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/message/system.css
  52. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/order-stats.css
  53. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/points/detail.css
  54. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/points/index.css
  55. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/rewards-all.css
  56. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/rewards.css
  57. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/about/index.css
  58. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/auth/edit.css
  59. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/auth/index.css
  60. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/bank/index.css
  61. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/index.css
  62. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/notification/index.css
  63. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/profile/edit-name.css
  64. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/profile/index.css
  65. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/security/change-password.css
  66. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/security/change-phone.css
  67. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/security/index.css
  68. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/wallet/bill.css
  69. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/mine/wallet/index.css
  70. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/orders/anomaly.css
  71. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/orders/detail.css
  72. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/orders/index.css
  73. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/recruit/auth.css
  74. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/recruit/form.css
  75. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/recruit/landing.css
  76. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/recruit/qualifications.css
  77. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/pages/recruit/success.css
  78. BIN
      unpackage/cache/wgt/__UNI__76F5C47/static/dog.png
  79. BIN
      unpackage/cache/wgt/__UNI__76F5C47/static/header.png
  80. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/bell.png
  81. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/bell.svg
  82. 5 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/bell_linear.svg
  83. 4 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/bell_outline.svg
  84. 6 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/calendar.svg
  85. 4 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/camera_grey.svg
  86. 0 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/car.png
  87. 1 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/car.svg
  88. 3 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/chevron_right.svg
  89. 3 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/chevron_right_dark.svg
  90. 3 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/chevron_right_gold.svg
  91. 4 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/clock.svg
  92. 4 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/close_gray.svg
  93. 3 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/crown.svg
  94. 4 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/diamond_white.svg
  95. 6 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/file.svg
  96. 5 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/headset_green.svg
  97. 4 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/headset_linear.svg
  98. 7 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/icon_order_msg.svg
  99. 4 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/icon_system_msg.svg
  100. 4 0
      unpackage/cache/wgt/__UNI__76F5C47/static/icons/location.svg

+ 36 - 18
.idea/workspace.xml

@@ -6,8 +6,21 @@
   <component name="ChangeListManager">
     <list default="true" id="e5f5f697-2bd4-4205-922a-fb106cdbbdf5" name="Changes" comment="1.完成app样式调整">
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/pages/mine/settings/auth/edit.vue" beforeDir="false" afterPath="$PROJECT_DIR$/pages/mine/settings/auth/edit.vue" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/utils/config.js" beforeDir="false" afterPath="$PROJECT_DIR$/utils/config.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/manifest.json" beforeDir="false" afterPath="$PROJECT_DIR$/manifest.json" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/pages.json" beforeDir="false" afterPath="$PROJECT_DIR$/pages.json" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/pages/home/index.vue" beforeDir="false" afterPath="$PROJECT_DIR$/pages/home/index.vue" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/pages/home/logic.js" beforeDir="false" afterPath="$PROJECT_DIR$/pages/home/logic.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/pages/mine/index.vue" beforeDir="false" afterPath="$PROJECT_DIR$/pages/mine/index.vue" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/pages/mine/logic.js" beforeDir="false" afterPath="$PROJECT_DIR$/pages/mine/logic.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/pages/orders/index.vue" beforeDir="false" afterPath="$PROJECT_DIR$/pages/orders/index.vue" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/pages/orders/logic.js" beforeDir="false" afterPath="$PROJECT_DIR$/pages/orders/logic.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/dev/app-plus/app-config-service.js" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/dev/app-plus/app-config-service.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/dev/app-plus/app-service.js" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/dev/app-plus/app-service.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/dev/app-plus/manifest.json" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/dev/app-plus/manifest.json" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/dev/app-plus/pages/home/index.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/dev/app-plus/pages/home/index.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/dev/app-plus/pages/mine/index.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/dev/app-plus/pages/mine/index.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/dev/app-plus/pages/orders/index.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/dev/app-plus/pages/orders/index.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/unpackage/dist/dev/app-plus/pages/recruit/form.css" beforeDir="false" afterPath="$PROJECT_DIR$/unpackage/dist/dev/app-plus/pages/recruit/form.css" afterDir="false" />
     </list>
     <list id="6ae23f6a-53fe-4817-a1d7-106bcf184c18" name="New changelist" comment="不想提交的文件" />
     <option name="SHOW_DIALOG" value="false" />
@@ -16,6 +29,11 @@
     <option name="LAST_RESOLUTION" value="IGNORE" />
   </component>
   <component name="Git.Settings">
+    <option name="RECENT_BRANCH_BY_REPOSITORY">
+      <map>
+        <entry key="$PROJECT_DIR$" value="master" />
+      </map>
+    </option>
     <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
   </component>
   <component name="KubernetesApiPersistence">{}</component>
@@ -41,23 +59,23 @@
     <option name="showLibraryContents" value="true" />
     <option name="showMembers" value="true" />
   </component>
-  <component name="PropertiesComponent">{
-  &quot;keyToString&quot;: {
-    &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
-    &quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
-    &quot;git-widget-placeholder&quot;: &quot;master&quot;,
-    &quot;kotlin-language-version-configured&quot;: &quot;true&quot;,
-    &quot;last_opened_file_path&quot;: &quot;D:/windsurfProject/petSystem/pet-system-fulfiller-app&quot;,
-    &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
-    &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
-    &quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
-    &quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
-    &quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
-    &quot;settings.editor.selected.configurable&quot;: &quot;MavenSettings&quot;,
-    &quot;ts.external.directory.path&quot;: &quot;D:\\Idea\\IntelliJ IDEA 2024.3.5\\plugins\\javascript-plugin\\jsLanguageServicesImpl\\external&quot;,
-    &quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
+  <component name="PropertiesComponent"><![CDATA[{
+  "keyToString": {
+    "RunOnceActivity.ShowReadmeOnStart": "true",
+    "RunOnceActivity.git.unshallow": "true",
+    "git-widget-placeholder": "dev/shenliang",
+    "kotlin-language-version-configured": "true",
+    "last_opened_file_path": "D:/windsurfProject/petSystem/pet-system-fulfiller-app",
+    "node.js.detected.package.eslint": "true",
+    "node.js.detected.package.tslint": "true",
+    "node.js.selected.package.eslint": "(autodetect)",
+    "node.js.selected.package.tslint": "(autodetect)",
+    "nodejs_package_manager_path": "npm",
+    "settings.editor.selected.configurable": "MavenSettings",
+    "ts.external.directory.path": "D:\\Idea\\IntelliJ IDEA 2024.3.5\\plugins\\javascript-plugin\\jsLanguageServicesImpl\\external",
+    "vue.rearranger.settings.migration": "true"
   }
-}</component>
+}]]></component>
   <component name="SharedIndexes">
     <attachedChunks>
       <set>

+ 16 - 0
api/archieves/pet/index.js

@@ -0,0 +1,16 @@
+/**
+ * 宠物档案 API
+ * @author steelwei
+ */
+import request from '@/utils/request'
+
+/**
+ * 获取宠物档案详情
+ * @param {number} id 宠物ID
+ */
+export function getPetDetail(id) {
+    return request({
+        url: `/archieves/pet/${id}`,
+        method: 'GET'
+    })
+}

+ 23 - 0
api/fulfiller.js

@@ -329,3 +329,26 @@ export function clockIn(data) {
     data
   })
 }
+
+/**
+ * 异常上报
+ * @param {Object} data - { orderId, photos, type, content }
+ */
+export function uploadAnamaly(data) {
+  return request({
+    url: '/fulfiller/anamaly/upload',
+    method: 'POST',
+    data
+  })
+}
+
+/**
+ * 获取订单异常记录列表
+ * @param {number} orderId - 订单ID
+ */
+export function getAnomalyList(orderId) {
+  return request({
+    url: `/fulfiller/anamaly/listOnOrder?orderId=${orderId}`,
+    method: 'GET'
+  })
+}

+ 11 - 0
api/service.js

@@ -13,3 +13,14 @@ export function getServiceList() {
     method: 'GET'
   })
 }
+
+/**
+ * 获取服务类型详情(含打卡备注)
+ * @param {number} id 服务类型ID
+ */
+export function getServiceDetail(id) {
+  return request({
+    url: `/service/list/${id}`,
+    method: 'GET'
+  })
+}

+ 16 - 0
api/system/dict/index.js

@@ -0,0 +1,16 @@
+/**
+ * 系统字典 API
+ * @author steelwei
+ */
+import request from '@/utils/request'
+
+/**
+ * 根据字典类型获取字典数据
+ * @param {string} dictType 字典类型
+ */
+export function getDictDataByType(dictType) {
+    return request({
+        url: `/system/dict/data/type/${dictType}`,
+        method: 'GET'
+    })
+}

+ 115 - 0
components/custom-tabbar/index.vue

@@ -0,0 +1,115 @@
+<template>
+  <view class="custom-tabbar">
+    <view class="tabbar-border"></view>
+    <view class="tabbar-list">
+      <view
+        class="tabbar-item"
+        v-for="(item, index) in list"
+        :key="index"
+        @click="switchTab(item.pagePath)"
+      >
+        <image
+          class="tabbar-icon"
+          :src="currentPath === item.pagePath ? item.selectedIconPath : item.iconPath"
+        ></image>
+        <view
+          class="tabbar-text"
+          :class="{'tabbar-text-active': currentPath === item.pagePath}"
+        >
+          {{ item.text }}
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup>
+import { ref } from 'vue';
+
+const props = defineProps({
+  currentPath: {
+    type: String,
+    required: true
+  }
+});
+
+const list = ref([
+  {
+    pagePath: "pages/home/index",
+    text: "任务中心",
+    iconPath: "/static/tabbar/home.svg",
+    selectedIconPath: "/static/tabbar/home-active.svg"
+  },
+  {
+    pagePath: "pages/orders/index",
+    text: "我的订单",
+    iconPath: "/static/tabbar/order.svg",
+    selectedIconPath: "/static/tabbar/order-active.svg"
+  },
+  {
+    pagePath: "pages/mine/index",
+    text: "我的",
+    iconPath: "/static/tabbar/mine.svg",
+    selectedIconPath: "/static/tabbar/mine-active.svg"
+  }
+]);
+
+const switchTab = (path) => {
+  if (props.currentPath === path) return;
+  uni.switchTab({
+    url: '/' + path
+  });
+};
+</script>
+
+<style scoped>
+.custom-tabbar {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 50px;
+  background-color: #ffffff;
+  display: flex;
+  flex-direction: column;
+  z-index: 999;
+  padding-bottom: env(safe-area-inset-bottom);
+}
+
+.tabbar-border {
+  height: 1px;
+  background-color: rgba(0, 0, 0, 0.1);
+  transform: scaleY(0.5);
+}
+
+.tabbar-list {
+  display: flex;
+  flex: 1;
+  align-items: center;
+  justify-content: space-around;
+}
+
+.tabbar-item {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  height: 100%;
+  flex: 1;
+}
+
+.tabbar-icon {
+  width: 24px;
+  height: 24px;
+  margin-bottom: 2px;
+}
+
+.tabbar-text {
+  font-size: 10px;
+  color: #999999;
+}
+
+.tabbar-text-active {
+  color: #FF5722;
+}
+</style>

+ 3 - 1
manifest.json

@@ -41,7 +41,9 @@
                 ]
             },
             /* ios打包配置 */
-            "ios" : {},
+            "ios" : {
+                "dSYMs" : false
+            },
             /* SDK配置 */
             "sdkConfigs" : {}
         }

+ 1 - 0
pages.json

@@ -253,6 +253,7 @@
 		"backgroundColor": "#F8F8F8"
 	},
 	"tabBar": {
+		"custom": true,
 		"color": "#999999",
 		"selectedColor": "#FF5722",
 		"backgroundColor": "#ffffff",

+ 6 - 50
pages/home/index.vue

@@ -75,24 +75,6 @@
                     <text class="count">- ({{ taskList.length }}单)</text>
                 </view>
                 <view class="filter-options">
-                    <view class="filter-item" :class="{ active: currentFilter === 'distance' }"
-                        @click="setFilter('distance')">
-                        距离
-                        <view class="sort-icon">
-                            <view class="up"
-                                :class="{ active: currentFilter === 'distance' && sortDistance === 'asc' }"></view>
-                            <view class="down"
-                                :class="{ active: currentFilter === 'distance' && sortDistance === 'desc' }"></view>
-                        </view>
-                    </view>
-                    <view class="filter-item" :class="{ active: currentFilter === 'time' }" @click="setFilter('time')">
-                        时间
-                        <view class="sort-icon">
-                            <view class="up" :class="{ active: currentFilter === 'time' && sortTime === 'asc' }"></view>
-                            <view class="down" :class="{ active: currentFilter === 'time' && sortTime === 'desc' }">
-                            </view>
-                        </view>
-                    </view>
                     <view class="dropdown" @click="showFilterDropdown">
                         <text>筛选条件</text>
                         <text class="arrow-down">﹀</text>
@@ -116,23 +98,6 @@
                     </view>
                 </view>
 
-                <view class="filter-section">
-                    <text class="section-title">距离</text>
-                    <view class="options-grid">
-                        <view class="option-btn" :class="{ active: tempFilter.distance === '全部' }"
-                            @click="selectDistance('全部')">全部</view>
-                        <view class="option-btn" :class="{ active: tempFilter.distance === '2公里内' }"
-                            @click="selectDistance('2公里内')">2公里内</view>
-                        <view class="option-btn" :class="{ active: tempFilter.distance === '5公里内' }"
-                            @click="selectDistance('5公里内')">5公里内</view>
-                        <view class="option-btn" :class="{ active: tempFilter.distance === '10公里内' }"
-                            @click="selectDistance('10公里内')">10公里内</view>
-                        <view class="option-btn" :class="{ active: tempFilter.distance === '20公里内' }"
-                            @click="selectDistance('20公里内')">20公里内</view>
-                        <view class="option-btn" :class="{ active: tempFilter.distance === '50公里内' }"
-                            @click="selectDistance('50公里内')">50公里内</view>
-                    </view>
-                </view>
 
                 <view class="filter-section">
                     <text class="section-title">金额</text>
@@ -160,7 +125,7 @@
         <!-- 列表容器 -->
         <block v-if="workStatus === 'working'">
             <!-- 任务列表 -->
-            <scroll-view scroll-y class="task-list">
+            <view class="task-list">
                 <view class="task-card" v-for="(item, index) in taskList" :key="index" @click="goToDetail(item)">
                     <view class="card-header">
                         <view class="type-badge">
@@ -180,7 +145,6 @@
                                 <text class="pet-name">{{ item.petName }}</text>
                                 <text class="pet-breed">品种: {{ item.petBreed }}</text>
                             </view>
-                            <view class="pet-profile-btn" @click.stop="showPetProfile(item)">宠物档案</view>
                         </view>
 
                         <view class="route-info">
@@ -192,10 +156,7 @@
                                         <text class="addr-title">{{ item.startLocation }}</text>
                                         <text class="addr-desc">{{ item.startAddress }}</text>
                                     </view>
-                                    <view class="distance-tag">
-                                        <text>{{ item.startDistance }}</text>
-                                        <image class="nav-arrow" src="/static/icons/nav_arrow.svg"></image>
-                                    </view>
+                                    <image class="nav-arrow" src="/static/icons/nav_arrow.svg" style="flex-shrink: 0; align-self: center;"></image>
                                 </view>
 
                                 <view class="route-item" @click.stop="openNavigation(item, 'end')">
@@ -204,10 +165,7 @@
                                         <text class="addr-title">{{ item.endLocation }}</text>
                                         <text class="addr-desc">{{ item.endAddress }}</text>
                                     </view>
-                                    <view class="distance-tag">
-                                        <text>{{ item.endDistance }}</text>
-                                        <image class="nav-arrow" src="/static/icons/nav_arrow.svg"></image>
-                                    </view>
+                                    <image class="nav-arrow" src="/static/icons/nav_arrow.svg" style="flex-shrink: 0; align-self: center;"></image>
                                 </view>
                             </template>
                             <template v-else>
@@ -217,10 +175,7 @@
                                         <text class="addr-title">{{ item.endLocation }}</text>
                                         <text class="addr-desc">{{ item.endAddress }}</text>
                                     </view>
-                                    <view class="distance-tag">
-                                        <text>{{ item.endDistance }}</text>
-                                        <image class="nav-arrow" src="/static/icons/nav_arrow.svg"></image>
-                                    </view>
+                                    <image class="nav-arrow" src="/static/icons/nav_arrow.svg" style="flex-shrink: 0; align-self: center;"></image>
                                 </view>
                                 <view class="service-content" v-if="item.serviceContent">
                                     <text class="content-label">服务内容:</text>
@@ -243,7 +198,7 @@
                 </view>
                 <!-- Padding for safe area/tabbar -->
                 <view style="height: 120rpx;"></view>
-            </scroll-view>
+            </view>
         </block>
 
         <!-- 休息中空状态 -->
@@ -379,6 +334,7 @@
             <view class="nav-sheet-item cancel" @click="closeNavModal">取消</view>
         </view>
     </view>
+    <custom-tabbar currentPath="pages/home/index"></custom-tabbar>
 </template>
 
 <script>

+ 34 - 7
pages/home/logic.js

@@ -1,8 +1,12 @@
 import { getMyProfile, getPendingOrders, acceptOrder, getOrderCount } from '@/api/fulfiller'
 import { getServiceList } from '@/api/service'
 import { isLoggedIn } from '@/utils/auth'
+import customTabbar from '@/components/custom-tabbar/index.vue'
 
 export default {
+    components: {
+        customTabbar
+    },
     data() {
         return {
             taskList: [],
@@ -47,19 +51,43 @@ export default {
     onPageScroll(e) {
         this.scrollTop = e.scrollTop;
     },
-    onLoad() {
+    async onLoad() {
         // Initial load
         this.checkWorkStatus();
-        this.loadServiceList();
+        await this.loadServiceList();
         this.loadTaskList();
     },
     onShow() {
+        uni.hideTabBar()
         this.checkWorkStatus();
         if (isLoggedIn()) {
             this.loadProfile()
             this.loadOrderStats()
         }
     },
+    async onPullDownRefresh() {
+        this.checkWorkStatus();
+
+        try {
+            await this.loadServiceList();
+
+            const tasks = [
+                this.loadTaskList()
+            ];
+
+            if (isLoggedIn()) {
+                tasks.push(this.loadProfile());
+                tasks.push(this.loadOrderStats());
+            }
+
+            await Promise.all(tasks);
+        } catch (err) {
+            console.error('刷新异常:', err);
+        } finally {
+            uni.stopPullDownRefresh();
+            uni.showToast({ title: '刷新成功', icon: 'success' });
+        }
+    },
     methods: {
         async loadProfile() {
             if (this.profileLoading) return
@@ -213,8 +241,7 @@ export default {
         confirmFilter() {
             this.activeFilter = { ...this.tempFilter };
             this.isFilterShow = false;
-            uni.showToast({ title: '筛选已生效', icon: 'none' });
-            // Add filtering logic here if needed
+            this.loadTaskList();
         },
         closeFilter() {
             this.isFilterShow = false;
@@ -257,7 +284,7 @@ export default {
         transformOrder(item) {
             const service = this.serviceList.find(s => s.id === item.service)
             const serviceText = service?.name || '未知'
-            const serviceIcon = service?.icon || ''
+            const serviceIcon = service?.iconUrl || ''
             const mode = service?.mode || 0
             const isRoundTrip = mode === 1
             return {
@@ -266,7 +293,7 @@ export default {
                 typeText: serviceText,
                 typeIcon: serviceIcon,
                 price: (item.price / 100).toFixed(2),
-                timeLabel: isRoundTrip ? '取货时间' : '服务时间',
+                timeLabel: '服务时间',
                 time: item.serviceTime,
                 petAvatar: '/static/dog.png',
                 petName: item.petName,
@@ -282,7 +309,7 @@ export default {
                 startLocation: isRoundTrip ? item.fromAddress : '',
                 startAddress: isRoundTrip ? item.fromAddress : '',
                 startDistance: '0km',
-                endLocation: item.customerName + ' ' + item.customerPhone,
+                endLocation: (item.customerName || item.contact || '') + ' ' + (item.customerPhone || ''),
                 endAddress: item.toAddress,
                 endDistance: '0km',
                 serviceContent: '',

+ 2 - 4
pages/home/style.css

@@ -465,16 +465,14 @@ page {
 .route-item {
     display: flex;
     align-items: flex-start;
-    padding-bottom: 12rpx;
-    /* Radically reduced for compactness */
+    padding-bottom: 20rpx;
     position: relative;
     width: 100%;
 }
 
 /* 路线项底部的间隔 */
 .route-item:not(:last-child) {
-    margin-bottom: 5rpx;
-    /* Radically reduced for compactness */
+    margin-bottom: 16rpx;
 }
 
 .route-item:last-child {

+ 1 - 0
pages/mine/index.vue

@@ -172,6 +172,7 @@
             </view>
         </view>
     </view>
+    <custom-tabbar currentPath="pages/mine/index"></custom-tabbar>
 </template>
 
 <script>

+ 5 - 0
pages/mine/logic.js

@@ -1,8 +1,12 @@
 import { logout as logoutApi } from '@/api/auth'
 import { getMyProfile } from '@/api/fulfiller'
 import { clearAuth, isLoggedIn } from '@/utils/auth'
+import customTabbar from '@/components/custom-tabbar/index.vue'
 
 export default {
+    components: {
+        customTabbar
+    },
     data() {
         return {
             showServicePopup: false,
@@ -12,6 +16,7 @@ export default {
         }
     },
     onShow() {
+        uni.hideTabBar()
         if (isLoggedIn()) {
             this.loadProfile()
         }

+ 83 - 26
pages/orders/anomaly.vue

@@ -11,7 +11,7 @@
                 </view>
                 <view class="ano-type-row" @click="openTypeSheet">
                     <text class="ano-type-val" :class="{ 'placeholder': !selectedType }">
-                        {{ selectedType || '其他异常' }}
+                        {{ selectedType || '请选择异常类型' }}
                     </text>
                     <image class="ano-right-arrow" src="/static/icons/right_arrow_orange.svg"></image>
                 </view>
@@ -41,7 +41,7 @@
                 <view class="ano-photo-grid">
                     <!-- 已上传图片 -->
                     <view class="ano-photo-item" v-for="(img, idx) in photoList" :key="idx">
-                        <image class="ano-photo-preview" :src="img" mode="aspectFill"></image>
+                        <image class="ano-photo-preview" :src="img.url || img.localPath || img" mode="aspectFill"></image>
                         <view class="ano-photo-del" @click="removePhoto(idx)">×</view>
                     </view>
                     <!-- 添加按钮 -->
@@ -72,9 +72,9 @@
                         :key="idx"
                         @click="selectType(type)"
                     >
-                        <text :class="['ano-sheet-item-text', { 'selected': selectedType === type }]">{{ type }}</text>
+                        <text :class="['ano-sheet-item-text', { 'selected': selectedTypeValue === type.value }]">{{ type.label }}</text>
                         <image
-                            v-if="selectedType === type"
+                            v-if="selectedTypeValue === type.value"
                             class="ano-check-icon"
                             src="/static/icons/right_arrow_orange.svg"
                         ></image>
@@ -87,29 +87,58 @@
 </template>
 
 <script>
+import { getDictDataByType } from '@/api/system/dict/index'
+import { uploadFile, uploadAnamaly } from '@/api/fulfiller'
+
 export default {
     data() {
         return {
-            // 已选异常类型
-            selectedType: '其他异常',
+            orderId: '',
+            // 已选异常类型(dictValue)
+            selectedTypeValue: '',
+            // 已选异常类型标签(dictLabel,用于显示)
+            selectedTypeLabel: '',
             // 异常描述
             anomalyDesc: '',
-            // 照片列表
+            // 照片列表(含 url 和 ossId)
             photoList: [],
             // 是否显示类型选择器
             showTypeSheet: false,
-            // 异常类型列表
-            anomalyTypes: [
-                '无法联系用户',
-                '地址错误',
-                '宠物身体异常',
-                '设施损坏',
-                '用户拒收',
-                '其他异常'
-            ]
+            // 异常类型字典列表(从后端获取)
+            anomalyTypes: []
         };
     },
+    onLoad(options) {
+        if (options.orderId) {
+            this.orderId = options.orderId
+        }
+        this.loadAnomalyTypes()
+    },
+    computed: {
+        // 当前选中的类型显示文本
+        selectedType() {
+            return this.selectedTypeLabel || ''
+        }
+    },
     methods: {
+        /**
+         * 加载异常类型字典数据
+         */
+        async loadAnomalyTypes() {
+            try {
+                const res = await getDictDataByType('flf_anamaly_type')
+                if (res.data && Array.isArray(res.data)) {
+                    this.anomalyTypes = res.data.map(item => ({
+                        label: item.dictLabel,
+                        value: item.dictValue,
+                        dictCode: item.dictCode
+                    }))
+                    console.log('异常类型字典:', this.anomalyTypes)
+                }
+            } catch (err) {
+                console.error('获取异常类型字典失败:', err)
+            }
+        },
         // 打开类型选择器
         openTypeSheet() {
             this.showTypeSheet = true;
@@ -120,17 +149,35 @@ export default {
         },
         // 选择异常类型
         selectType(type) {
-            this.selectedType = type;
+            this.selectedTypeValue = type.value;
+            this.selectedTypeLabel = type.label;
             this.closeTypeSheet();
         },
-        // 选择照片
+        // 选择照片并上传
         choosePhoto() {
             uni.chooseImage({
                 count: 5 - this.photoList.length,
                 sizeType: ['compressed'],
                 sourceType: ['album', 'camera'],
-                success: (res) => {
-                    this.photoList = [...this.photoList, ...res.tempFilePaths].slice(0, 5);
+                success: async (res) => {
+                    uni.showLoading({ title: '上传中...' });
+                    try {
+                        for (const filePath of res.tempFilePaths) {
+                            const uploadRes = await uploadFile(filePath);
+                            if (uploadRes.code === 200) {
+                                this.photoList.push({
+                                    url: uploadRes.data.url,
+                                    ossId: uploadRes.data.ossId,
+                                    localPath: filePath
+                                });
+                            }
+                        }
+                        uni.hideLoading();
+                    } catch (err) {
+                        uni.hideLoading();
+                        console.error('上传失败:', err);
+                        uni.showToast({ title: '上传失败', icon: 'none' });
+                    }
                 }
             });
         },
@@ -139,8 +186,8 @@ export default {
             this.photoList.splice(idx, 1);
         },
         // 提交上报
-        submitAnomaly() {
-            if (!this.selectedType) {
+        async submitAnomaly() {
+            if (!this.selectedTypeValue) {
                 uni.showToast({ title: '请选择异常类型', icon: 'none' });
                 return;
             }
@@ -148,15 +195,25 @@ export default {
                 uni.showToast({ title: '请上传现场照片', icon: 'none' });
                 return;
             }
-            // 模拟提交
-            uni.showLoading({ title: '提交中...' });
-            setTimeout(() => {
+            const data = {
+                orderId: this.orderId,
+                type: this.selectedTypeValue,
+                content: this.anomalyDesc,
+                photos: this.photoList.map(p => p.ossId)
+            }
+            try {
+                uni.showLoading({ title: '提交中...' });
+                await uploadAnamaly(data);
                 uni.hideLoading();
                 uni.showToast({ title: '上报成功', icon: 'success' });
                 setTimeout(() => {
                     uni.navigateBack();
                 }, 1500);
-            }, 1000);
+            } catch (err) {
+                uni.hideLoading();
+                console.error('异常上报失败:', err);
+                uni.showToast({ title: '提交失败,请重试', icon: 'none' });
+            }
         }
     }
 };

+ 233 - 82
pages/orders/detail-logic.js

@@ -1,17 +1,27 @@
-import { getOrderInfo, getOrderLogs, uploadFile, clockIn } from '@/api/fulfiller'
-import { getServiceList } from '@/api/service'
+import { getOrderInfo, getOrderLogs, uploadFile, clockIn, getAnomalyList } from '@/api/fulfiller'
+import { getServiceList, getServiceDetail } from '@/api/service'
+import { getDictDataByType } from '@/api/system/dict/index'
+import { getPetDetail } from '@/api/archieves/pet/index'
 
 export default {
     data() {
         return {
             orderId: null,
+            pageLoading: true, // 页面数据加载中
             orderType: 1,
             orderStatus: 2,
+            serviceId: null, // 当前订单的服务类型ID
+            petId: null, // 当前订单关联的宠物ID
+            petDetail: null, // 宠物档案详情
 
-            stepsPickup: ['到达打卡', '确认出发', '送达打卡'],
-            stepsWalkWash: ['到达打卡', '开始服务', '服务结束'],
+            // 从后端 clockInRemark 解析出的打卡步骤列表
+            // 格式: [{step:1, title:'到达打卡', remark:'照片视频二选一即可'}, ...]
+            clockInSteps: [],
 
-            currentStep: 1,
+            // 当前应执行的打卡信息(从 clockInSteps 中取出)
+            currentClockIn: null,
+
+            currentStep: 0,
 
             orderDetail: {
                 type: 1,
@@ -49,52 +59,57 @@ export default {
             sumSigner: '张*哥',
 
             showPetRemarkInput: false,
-            petRemarkText: ''
+            petRemarkText: '',
+
+            showAnomalyModal: false,
+            anomalyList: [],
+            anomalyTypeDict: []
         }
     },
     computed: {
+        // 从 clockInSteps 中提取 title 数组作为打卡步骤名(内部逻辑用)
         steps() {
-            return this.orderType === 1 ? this.stepsPickup : this.stepsWalkWash;
+            if (this.clockInSteps.length > 0) {
+                return this.clockInSteps.map(s => s.title)
+            }
+            // 兜底:如果 clockInSteps 未加载则使用默认
+            return this.orderType === 1
+                ? ['到达打卡', '确认出发', '送达打卡']
+                : ['到达打卡', '开始服务', '服务结束']
+        },
+        // 顶部进度条展示用:已接单 -> 各打卡步骤 -> 订单完成
+        progressSteps() {
+            return ['已接单', ...this.steps, '订单完成']
+        },
+        // 进度条当前激活索引(= currentStep + 1,因为首位是"已接单")
+        progressIndex() {
+            // 已接单是第0步,始终已完成;打卡步骤从索引1开始
+            return this.currentStep + 1
         },
         displayStatusText() {
-            if (this.currentStep === 4) return '待商家确认';
             if (this.currentStep >= this.steps.length) return '已完成';
-            let status = this.steps[this.currentStep];
-            if (status === '已完成' || status === '完成') return '已完成';
-            if (status === '已拒绝') return '已拒绝';
-            if (status === '接单') {
-                return this.orderType === 1 ? '待接送' : '待服务';
+            // 判断是否在服务中
+            if (this.currentStep > 0) {
+                return this.orderType === 1 ? '配送中' : '服务中';
             }
-            // 对于其他活跃状态 (出发, 到达, 送达, 开始, 结束)
-            return this.orderType === 1 ? '配送中' : '服务中';
+            return this.orderType === 1 ? '待接送' : '待服务';
         },
         currentStatusText() {
-            if (this.currentStep === 4) return '待确认';
             return this.currentStep >= this.steps.length ? '已完成' : this.steps[this.currentStep];
         },
+        // 按钮文本:使用 clockInSteps 中对应步骤的 title
         currentTaskTitle() {
-            if (this.currentStep === 4) return '待商家确认';
             if (this.currentStep >= this.steps.length) return '订单已完成';
-            let action = this.steps[this.currentStep];
-            if (action === '到达打卡') return '到达打卡';
-            if (action === '开始服务') return '开始服务';
-            if (action === '确认出发') return '确认出发';
-            if (action === '送达打卡' || action === '服务结束') return '服务完成';
-            return action;
+            if (this.currentClockIn) {
+                return this.currentClockIn.title;
+            }
+            return this.steps[this.currentStep] || '打卡';
         },
+        // 任务描述小字:使用 clockInSteps 中对应步骤的 remark
         currentTaskDesc() {
-            if (this.currentStep === 4) return '服务已提交,请等待商家确认完成后即可结束订单';
             if (this.currentStep >= this.steps.length) return '感谢您的服务,请注意休息';
-            let action = this.steps[this.currentStep];
-            if (action === '到达打卡') {
-                return '打卡穿着工装消毒站门口的照片或视频';
-            }
-            if (this.orderType === 1) {
-                if (action === '确认出发') return '拍摄宠物上车/出发时的状态照片或视频';
-                if (action === '送达打卡') return '打卡确认送达的照片或视频';
-            } else {
-                if (action === '开始服务') return '开始服务并拍摄照片 or 视频';
-                if (action === '服务结束') return '服务完成拍摄照片或视频';
+            if (this.currentClockIn && this.currentClockIn.remark) {
+                return this.currentClockIn.remark;
             }
             return '请按要求提交照片或视频及备注';
         }
@@ -103,8 +118,17 @@ export default {
         if (options.id) {
             this.orderId = options.id
         }
-        await this.loadServiceList()
-        await this.loadOrderDetail()
+        this.pageLoading = true
+        try {
+            // 先加载字典
+            await this.loadAnomalyTypeDict()
+            // 先获取服务列表(用于匹配服务类型名称等)
+            await this.loadServiceList()
+            // 获取订单详情(内部会拿到 serviceId,然后加载服务详情获取 clockInRemark)
+            await this.loadOrderDetail()
+        } finally {
+            this.pageLoading = false
+        }
     },
     methods: {
         async loadServiceList() {
@@ -115,6 +139,28 @@ export default {
                 console.error('获取服务类型失败:', err)
             }
         },
+        /**
+         * 根据服务类型ID获取服务详情,解析 clockInRemark 为打卡步骤
+         */
+        async loadServiceDetail(serviceId) {
+            try {
+                const res = await getServiceDetail(serviceId)
+                const serviceInfo = res.data
+                if (serviceInfo && serviceInfo.clockInRemark) {
+                    try {
+                        const parsed = JSON.parse(serviceInfo.clockInRemark)
+                        if (Array.isArray(parsed) && parsed.length > 0) {
+                            this.clockInSteps = parsed
+                            console.log('解析打卡步骤:', this.clockInSteps)
+                        }
+                    } catch (parseErr) {
+                        console.error('解析 clockInRemark 失败:', parseErr)
+                    }
+                }
+            } catch (err) {
+                console.error('获取服务类型详情失败:', err)
+            }
+        },
         async loadOrderDetail() {
             if (!this.orderId) {
                 console.log('订单ID缺失')
@@ -132,7 +178,21 @@ export default {
                     return
                 }
                 console.log('订单数据:', order)
+                this.serviceId = order.service
+                this.petId = order.usrPet || null
                 this.transformOrderData(order)
+
+                // 根据订单的服务类型ID获取服务详情(含 clockInRemark)
+                if (this.serviceId) {
+                    await this.loadServiceDetail(this.serviceId)
+                }
+
+                // 加载宠物档案详情
+                if (this.petId) {
+                    await this.loadPetDetail(this.petId)
+                }
+
+                // 加载订单日志并根据 step 确定当前进度
                 await this.loadOrderLogs()
             } catch (err) {
                 console.error('获取订单详情失败:', err)
@@ -144,9 +204,8 @@ export default {
                 const res = await getOrderLogs(this.orderId)
                 const logs = res.data || []
                 console.log('订单日志:', logs)
-                if (logs.length > 0) {
-                    console.log('第一条日志详情:', JSON.stringify(logs[0]))
-                }
+
+                // 渲染进度日志列表
                 const progressLogs = logs.filter(log => log.logType === 1)
                 this.orderDetail.progressLogs = progressLogs.map(log => ({
                     status: log.title || '',
@@ -155,37 +214,45 @@ export default {
                     remark: log.content || ''
                 }))
 
-                // 根据打卡日志的 actionType 确定下一步骤。规则:最新的打卡记录是什么,下一步就往后延。
-                // 仅筛选打卡类型的日志(logType: 1),并按时间倒序排列,取最新的一条作为当前进度的基准
-                const validLogs = logs.filter(log => log.logType === 1 && log.actionType !== undefined)
+                // 根据打卡日志的 step 确定下一步骤
+                // 查找最新的一条打卡日志(logType=1),取其 step,下一步为 step+1
+                const validLogs = logs.filter(log => log.logType === 1 && log.step !== undefined && log.step !== null)
                     .sort((a, b) => new Date(b.createTime).getTime() - new Date(a.createTime).getTime())
 
                 if (validLogs.length > 0) {
                     const latestLog = validLogs[0]
-                    const actionType = latestLog.actionType
+                    const latestStep = latestLog.step
+                    console.log('最新打卡日志 step:', latestStep)
 
-                    // 如果日志显示待商家确认,则为无需打卡
-                    if (latestLog.actionType >= 7) {
-                        this.currentStep = 4 // 无需打卡状态
-                    } else if (actionType === 7) {
-                        this.currentStep = 3 // 已完成
-                    } else if (actionType === 6) {
-                        this.currentStep = 2 // 当前应进行:送达打卡/服务结束
-                    } else if (actionType === 4) {
-                        this.currentStep = 1 // 当前应进行:确认出发/开始服务
-                    } else if (actionType === 2 || actionType === 3) {
-                        this.currentStep = 0 // 已接单,当前应进行:到达打卡
+                    // 在 clockInSteps 中找到该 step 对应的索引,然后 +1 得到下一步
+                    const stepIndex = this.clockInSteps.findIndex(s => s.step === latestStep)
+                    if (stepIndex >= 0) {
+                        this.currentStep = stepIndex + 1
                     } else {
-                        this.currentStep = 0
+                        // 兜底:直接按 step 值推算
+                        this.currentStep = latestStep
                     }
                 } else {
                     this.currentStep = 0
                 }
-                console.log('根据最新日志推算的当前步骤:', this.currentStep)
+
+                // 更新当前打卡信息
+                this.updateCurrentClockIn()
+                console.log('根据最新日志推算的当前步骤:', this.currentStep, '当前打卡信息:', this.currentClockIn)
             } catch (err) {
                 console.error('获取订单日志失败:', err)
             }
         },
+        /**
+         * 根据 currentStep 更新当前打卡信息
+         */
+        updateCurrentClockIn() {
+            if (this.currentStep < this.clockInSteps.length) {
+                this.currentClockIn = this.clockInSteps[this.currentStep]
+            } else {
+                this.currentClockIn = null
+            }
+        },
         transformOrderData(order) {
             const mode = order.mode || 0
             const isRoundTrip = mode === 1
@@ -215,6 +282,74 @@ export default {
                 ]
             }
         },
+        /**
+         * 根据宠物ID获取宠物档案详情
+         */
+        async loadPetDetail(petId) {
+            try {
+                const res = await getPetDetail(petId)
+                const pet = res.data
+                if (pet) {
+                    this.petDetail = pet
+                    // 同步更新订单详情中的宠物信息
+                    this.orderDetail.petAvatar = pet.avatarUrl || '/static/dog.png'
+                    this.orderDetail.petName = pet.name || this.orderDetail.petName
+                    this.orderDetail.petBreed = pet.breed || this.orderDetail.petBreed
+                    console.log('宠物档案:', pet)
+                }
+            } catch (err) {
+                console.error('获取宠物档案失败:', err)
+            }
+        },
+        /**
+         * 加载异常记录列表
+         */
+        async loadAnomalyList() {
+            if (!this.orderId) return
+            try {
+                const res = await getAnomalyList(this.orderId)
+                const list = res.data || []
+                // 过滤和转换
+                this.anomalyList = list.map(item => {
+                    // 映射类型
+                    const dict = this.anomalyTypeDict.find(d => d.value === item.type)
+                    return {
+                        ...item,
+                        typeLabel: dict ? dict.label : item.type,
+                        // 确保有图片数组供展示,如果后端没返 photoUrls,尝试兼容
+                        photoUrls: item.photoUrls || []
+                    }
+                })
+            } catch (err) {
+                console.error('获取异常列表失败:', err)
+            }
+        },
+        async loadAnomalyTypeDict() {
+            try {
+                const res = await getDictDataByType('flf_anamaly_type')
+                this.anomalyTypeDict = res.data.map(item => ({
+                    label: item.dictLabel,
+                    value: item.dictValue
+                }))
+            } catch (err) {
+                console.error('获取异常字典失败:', err)
+            }
+        },
+        openAnomalyModal() {
+            this.showAnomalyModal = true
+            this.loadAnomalyList()
+        },
+        closeAnomalyModal() {
+            this.showAnomalyModal = false
+        },
+        getAnomalyStatusLabel(status) {
+            const map = {
+                0: '待审核',
+                1: '已通过',
+                2: '已驳回'
+            }
+            return map[status] || '未知'
+        },
         updateStepByStatus() {
             if (this.orderStatus === 2) {
                 this.currentStep = 0
@@ -227,23 +362,46 @@ export default {
             }
         },
         showPetProfile() {
-            // Use orderDetail basic info and mock the rest
-            this.currentPetInfo = {
-                ...this.orderDetail,
-                petGender: 'M',
-                petAge: '2岁',
-                petWeight: '15kg',
-                petPersonality: '活泼亲人,精力旺盛',
-                petHobby: '喜欢追飞盘,爱吃肉干',
-                petRemark: '肠胃较弱,不能乱喂零食;出门易爆冲,请拉紧牵引绳。',
-                petTags: ['拉响警报', '不能吃鸡肉', '精力旺盛'],
-                petLogs: [
-                    { date: '2026-02-09 14:00', content: '今天遛弯拉了两次粑粑,精神状态很好。', recorder: '王阿姨' },
-                    { date: '2026-02-08 10:30', content: '有些挑食,剩了小半碗狗粮。', recorder: '李师傅' },
-                    { date: '2026-02-05 09:00', content: '建档。', recorder: '系统记录' }
-                ]
-            };
-            this.showPetModal = true;
+            const pet = this.petDetail
+            if (pet) {
+                // 使用后端返回的真实宠物数据
+                this.currentPetInfo = {
+                    petAvatar: pet.avatarUrl || '/static/dog.png',
+                    petName: pet.name || '',
+                    petBreed: pet.breed || '',
+                    petGender: pet.gender === 1 ? 'M' : (pet.gender === 2 ? 'F' : ''),
+                    petAge: pet.age ? pet.age + '岁' : '未知',
+                    petWeight: pet.weight ? pet.weight + 'kg' : '未知',
+                    petPersonality: pet.personality || pet.cutePersonality || '无',
+                    petHobby: '',
+                    petRemark: pet.remark || '无',
+                    petTags: (pet.tags || []).map(t => t.name),
+                    petLogs: [],
+                    // 额外信息
+                    petSize: pet.size || '',
+                    petIsSterilized: pet.isSterilized,
+                    petHealthStatus: pet.healthStatus || '',
+                    petAllergies: pet.allergies || '',
+                    petMedicalHistory: pet.medicalHistory || '',
+                    petVaccineStatus: pet.vaccineStatus || '',
+                    ownerName: pet.ownerName || '',
+                    ownerPhone: pet.ownerPhone || ''
+                }
+            } else {
+                // 兜底:如果宠物档案未加载成功,使用订单中的基本信息
+                this.currentPetInfo = {
+                    ...this.orderDetail,
+                    petGender: '',
+                    petAge: '未知',
+                    petWeight: '未知',
+                    petPersonality: '无',
+                    petHobby: '',
+                    petRemark: '无',
+                    petTags: [],
+                    petLogs: []
+                }
+            }
+            this.showPetModal = true
         },
         closePetProfile() {
             this.showPetModal = false;
@@ -378,15 +536,8 @@ export default {
 
                 console.log('准备打卡,ossIds:', ossIds);
 
-                const currentAction = this.steps[this.currentStep];
-                let clockInType = 4;
-                if (currentAction === '到达打卡') {
-                    clockInType = 4;
-                } else if (currentAction === '确认出发' || currentAction === '开始服务') {
-                    clockInType = 6;
-                } else if (currentAction === '送达打卡' || currentAction === '服务结束') {
-                    clockInType = 7;
-                }
+                // 使用 clockInSteps 中对应步骤的 step 值作为打卡 type
+                const clockInType = this.currentClockIn ? this.currentClockIn.step : (this.currentStep + 1);
 
                 const clockInData = {
                     orderId: this.orderId,

+ 283 - 8
pages/orders/detail-style.css

@@ -7,6 +7,80 @@ page {
     padding-bottom: 200rpx;
 }
 
+/* 骨架屏加载动画 */
+.loading-container {
+    padding: 30rpx;
+}
+
+.skeleton-header {
+    background: linear-gradient(135deg, #FF9800 0%, #FF5722 100%);
+    border-radius: 20rpx;
+    padding: 40rpx;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 20rpx;
+}
+
+.skeleton-progress {
+    background: linear-gradient(135deg, #FF9800 0%, #FF5722 100%);
+    border-radius: 0 0 20rpx 20rpx;
+    margin-top: -40rpx;
+    padding: 30rpx 40rpx 40rpx;
+    display: flex;
+    justify-content: space-around;
+    margin-bottom: 25rpx;
+}
+
+.skeleton-circle {
+    width: 40rpx;
+    height: 40rpx;
+    border-radius: 50%;
+    background-color: rgba(255, 255, 255, 0.3);
+}
+
+.skeleton-card {
+    background-color: #fff;
+    border-radius: 20rpx;
+    padding: 30rpx;
+    margin-bottom: 25rpx;
+    box-shadow: 0 5rpx 20rpx rgba(0, 0, 0, 0.03);
+}
+
+.skeleton-line {
+    border-radius: 8rpx;
+    background-color: #f0f0f0;
+}
+
+/* 骨架屏闪光动画 */
+.skeleton-ani {
+    background: linear-gradient(90deg, #f0f0f0 25%, #e8e8e8 37%, #f0f0f0 63%);
+    background-size: 400% 100%;
+    animation: skeleton-loading 1.4s ease infinite;
+}
+
+.skeleton-header .skeleton-ani {
+    background: linear-gradient(90deg, rgba(255, 255, 255, 0.2) 25%, rgba(255, 255, 255, 0.35) 37%, rgba(255, 255, 255, 0.2) 63%);
+    background-size: 400% 100%;
+    animation: skeleton-loading 1.4s ease infinite;
+}
+
+.skeleton-progress .skeleton-ani {
+    background: linear-gradient(90deg, rgba(255, 255, 255, 0.2) 25%, rgba(255, 255, 255, 0.35) 37%, rgba(255, 255, 255, 0.2) 63%);
+    background-size: 400% 100%;
+    animation: skeleton-loading 1.4s ease infinite;
+}
+
+@keyframes skeleton-loading {
+    0% {
+        background-position: 100% 50%;
+    }
+
+    100% {
+        background-position: 0 50%;
+    }
+}
+
 /* 顶部动态状态区 */
 .detail-header {
     background: linear-gradient(135deg, #FF9800 0%, #FF5722 100%);
@@ -42,19 +116,50 @@ page {
     padding: 0 10rpx;
 }
 
+/* 默认步骤:未完成,半透明 */
 .step-item {
     display: flex;
     flex-direction: column;
     align-items: center;
     flex: 1;
     position: relative;
-    opacity: 0.6;
+    opacity: 0.5;
+}
+
+/* 已完成步骤:高亮 */
+.step-item.done {
+    opacity: 1;
 }
 
+.step-item.done .step-circle {
+    background-color: #fff;
+    color: #FF5722;
+    font-weight: bold;
+}
+
+.step-item.done .step-text {
+    font-weight: 500;
+}
+
+/* 当前步骤:最强调 */
 .step-item.active {
     opacity: 1;
 }
 
+.step-item.active .step-circle {
+    background-color: #fff;
+    color: #FF5722;
+    font-weight: bold;
+    width: 48rpx;
+    height: 48rpx;
+    font-size: 24rpx;
+    box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.15);
+}
+
+.step-item.active .step-text {
+    font-weight: bold;
+}
+
 .step-circle-wrapper {
     position: relative;
     width: 100%;
@@ -63,26 +168,23 @@ page {
     margin-bottom: 10rpx;
 }
 
+/* 默认圆圈:半透明 */
 .step-circle {
     width: 40rpx;
     height: 40rpx;
     border-radius: 50%;
     background-color: rgba(255, 255, 255, 0.3);
-    color: #fff;
+    color: rgba(255, 255, 255, 0.8);
     font-size: 20rpx;
     display: flex;
     justify-content: center;
     align-items: center;
     position: relative;
     z-index: 2;
+    transition: all 0.2s;
 }
 
-.step-item.active .step-circle {
-    background-color: #fff;
-    color: #FF5722;
-    font-weight: bold;
-}
-
+/* 连接线 */
 .step-line {
     position: absolute;
     top: 50%;
@@ -96,6 +198,7 @@ page {
 
 .step-line.active-line {
     background-color: #fff;
+    height: 3rpx;
 }
 
 .step-text {
@@ -280,6 +383,15 @@ page {
     margin-left: 6rpx;
 }
 
+.record-history-row {
+    margin-top: 30rpx;
+    padding-top: 25rpx;
+    border-top: 1px dashed #f0f0f0;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+}
+
 /* 地址展现复用图标逻辑 */
 .addr-row {
     position: relative;
@@ -744,6 +856,13 @@ page {
     color: #333;
 }
 
+.um-remark-hint {
+    display: block;
+    font-size: 24rpx;
+    color: #FF9800;
+    margin-top: 12rpx;
+}
+
 .um-grid {
     display: flex;
     flex-wrap: wrap;
@@ -1384,4 +1503,160 @@ page {
 
 .pm-log-recorder.system {
     color: #999;
+}
+
+/* 弹窗遮罩 */
+.modal-mask {
+    position: fixed;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background-color: rgba(0, 0, 0, 0.5);
+    z-index: 999;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
+/* 异常记录弹窗 */
+.anomaly-modal-content {
+    width: 650rpx;
+    background-color: #fff;
+    border-radius: 20rpx;
+    padding: 30rpx;
+    position: relative;
+    max-height: 80vh;
+    display: flex;
+    flex-direction: column;
+}
+
+.am-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 30rpx;
+    padding-bottom: 20rpx;
+    border-bottom: 1px solid #f5f5f5;
+}
+
+.am-title {
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #333;
+}
+
+.am-scroll-list {
+    flex: 1;
+}
+
+.am-item {
+    padding: 24rpx;
+    background-color: #F9FAFB;
+    border-radius: 12rpx;
+    margin-bottom: 24rpx;
+}
+
+.am-item-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 16rpx;
+}
+
+.am-item-type {
+    font-size: 28rpx;
+    font-weight: bold;
+    color: #333;
+}
+
+.am-item-status {
+    font-size: 22rpx;
+    padding: 4rpx 16rpx;
+    border-radius: 20rpx;
+}
+
+.am-item-status.status-0 {
+    background-color: #FFF3E0;
+    color: #FF9800;
+}
+
+.am-item-status.status-1 {
+    background-color: #E8F5E9;
+    color: #4CAF50;
+}
+
+.am-item-status.status-2 {
+    background-color: #FFEBEE;
+    color: #F44336;
+}
+
+.am-item-content {
+    font-size: 26rpx;
+    color: #666;
+    line-height: 1.6;
+    display: block;
+    margin-bottom: 16rpx;
+}
+
+.am-item-photos {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 12rpx;
+    margin-bottom: 20rpx;
+}
+
+.am-photo {
+    width: 130rpx;
+    height: 130rpx;
+    border-radius: 8rpx;
+}
+
+.am-audit-box {
+    margin-top: 20rpx;
+    padding-top: 20rpx;
+    border-top: 1px dashed #E0E0E0;
+}
+
+.am-audit-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 8rpx;
+}
+
+.am-audit-label {
+    font-size: 24rpx;
+    font-weight: bold;
+    color: #333;
+}
+
+.am-audit-time {
+    font-size: 22rpx;
+    color: #999;
+}
+
+.am-audit-remark {
+    font-size: 24rpx;
+    color: #666;
+    line-height: 1.5;
+}
+
+.empty-list {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    padding: 100rpx 0;
+}
+
+.empty-icon {
+    width: 200rpx;
+    height: 200rpx;
+    margin-bottom: 20rpx;
+    opacity: 0.5;
+}
+
+.empty-text {
+    font-size: 26rpx;
+    color: #999;
 }

+ 65 - 4
pages/orders/detail.vue

@@ -1,5 +1,24 @@
 <template>
     <view class="detail-container">
+        <!-- 加载动画 -->
+        <view class="loading-container" v-if="pageLoading">
+            <!-- 顶部骨架 -->
+            <view class="skeleton-header">
+                <view class="skeleton-line skeleton-ani" style="width: 30%; height: 36rpx;"></view>
+                <view class="skeleton-line skeleton-ani" style="width: 20%; height: 36rpx;"></view>
+            </view>
+            <view class="skeleton-progress">
+                <view class="skeleton-circle skeleton-ani" v-for="i in 4" :key="i"></view>
+            </view>
+            <!-- 卡片骨架 -->
+            <view class="skeleton-card" v-for="j in 3" :key="'c'+j">
+                <view class="skeleton-line skeleton-ani" style="width: 60%; height: 28rpx; margin-bottom: 20rpx;"></view>
+                <view class="skeleton-line skeleton-ani" style="width: 90%; height: 24rpx; margin-bottom: 14rpx;"></view>
+                <view class="skeleton-line skeleton-ani" style="width: 75%; height: 24rpx;"></view>
+            </view>
+        </view>
+
+        <template v-else>
         <!-- 顶部动态状态区 -->
         <view class="detail-header">
             <view class="status-row">
@@ -8,11 +27,11 @@
             </view>
             <!-- 进度条区域 -->
             <view class="progress-bar">
-                <view class="step-item" v-for="(step, index) in steps" :key="index"
-                    :class="{ 'active': index === currentStep }">
+                <view class="step-item" v-for="(step, index) in progressSteps" :key="index"
+                    :class="{ 'active': index === progressIndex, 'done': index < progressIndex }">
                     <view class="step-circle-wrapper">
                         <!-- Connecting Line before circle, except first item -->
-                        <view class="step-line" v-if="index !== 0" :class="{ 'active-line': index <= currentStep }">
+                        <view class="step-line" v-if="index !== 0" :class="{ 'active-line': index <= progressIndex }">
                         </view>
                         <view class="step-circle">{{ index + 1 }}</view>
                     </view>
@@ -51,7 +70,7 @@
                         <text class="si-label">服务时间</text>
                         <text class="si-val">{{ orderDetail.time }}</text>
                     </view>
-                    <view class="si-action record-btn">
+                    <view class="si-action record-btn" @tap.stop="openAnomalyModal">
                         <text>异常记录</text>
                         <image class="record-arrow" src="/static/icons/right_arrow_orange.svg"></image>
                     </view>
@@ -111,6 +130,13 @@
                         <text class="si-val">{{ orderDetail.remark || '无' }}</text>
                     </view>
                 </view>
+                <view class="si-row record-history-row" @tap.stop="openAnomalyModal">
+                    <view class="si-content">
+                        <text class="si-label">异常记录</text>
+                        <text class="si-val">查看历史异常记录</text>
+                    </view>
+                    <image class="record-arrow" src="/static/icons/right_arrow_orange.svg"></image>
+                </view>
             </view>
 
             <!-- 打卡任务 -->
@@ -193,6 +219,7 @@
             </view>
         </view>
 
+
         <!-- 宠物档案弹窗 -->
         <view class="pet-modal-mask" v-if="showPetModal" @click="closePetProfile">
             <view class="pet-modal-content" @click.stop>
@@ -303,6 +330,7 @@
             <view class="upload-modal-content" @click.stop>
                 <view class="um-header">
                     <text class="um-title">上传图或视频 ({{ modalMediaList.length }}/5)</text>
+                    <text class="um-remark-hint" v-if="currentClockIn && currentClockIn.remark">要求:{{ currentClockIn.remark }}</text>
                 </view>
                 <view class="um-body">
                     <view class="um-grid">
@@ -370,6 +398,39 @@
             </view>
         </view>
 
+        <!-- 异常记录弹窗 -->
+        <view class="modal-mask" v-if="showAnomalyModal" @click="closeAnomalyModal">
+            <view class="anomaly-modal-content" @click.stop>
+                <view class="am-header">
+                    <text class="am-title">历史异常记录</text>
+                    <view class="close-icon-btn" @click="closeAnomalyModal">×</view>
+                </view>
+                <scroll-view scroll-y class="am-scroll-list">
+                    <view class="empty-list" v-if="anomalyList.length === 0">
+                        <image class="empty-icon" src="/static/empty-rest.png" mode="aspectFit"></image>
+                        <text class="empty-text">暂无异常记录</text>
+                    </view>
+                    <view class="am-item" v-for="(item, index) in anomalyList" :key="index">
+                        <view class="am-item-header">
+                            <text class="am-item-type">{{ item.typeLabel }}</text>
+                            <text class="am-item-status" :class="'status-' + item.status">{{ getAnomalyStatusLabel(item.status) }}</text>
+                        </view>
+                        <text class="am-item-content">{{ item.content }}</text>
+                        <view class="am-item-photos" v-if="item.photos && item.photos.length > 0">
+                            <image class="am-photo" v-for="(photoUrl, pIdx) in item.photoUrls" :key="pIdx" :src="photoUrl" mode="aspectFill"></image>
+                        </view>
+                        <view class="am-audit-box" v-if="item.status !== 0">
+                            <view class="am-audit-header">
+                                <text class="am-audit-label">{{ item.status === 1 ? '审核通过' : '驳回理由' }}</text>
+                                <text class="am-audit-time">{{ item.auditTime }}</text>
+                            </view>
+                            <text class="am-audit-remark">{{ item.auditRemark || '无' }}</text>
+                        </view>
+                    </view>
+                </scroll-view>
+            </view>
+        </view>
+        </template>
     </view>
 </template>
 

+ 8 - 24
pages/orders/index.vue

@@ -74,7 +74,7 @@
         </view><!-- end sticky-header -->
 
         <!-- 订单列表 -->
-        <scroll-view scroll-y class="order-list">
+        <view class="order-list">
             <view class="order-card" v-for="(item, index) in orderList" :key="index" @click="goToDetail(item)">
                 <view class="card-header">
                     <view class="type-badge">
@@ -100,39 +100,28 @@
                             <text class="pet-name">{{ item.petName }}</text>
                             <text class="pet-breed">品种: {{ item.petBreed }}</text>
                         </view>
-                        <view class="pet-profile-btn" @click.stop="showPetProfile(item)">宠物档案</view>
                     </view>
 
                     <!-- 路线信息 (完全复用 Home 样式) -->
                     <view class="route-info">
                         <template v-if="item.type === 1">
                             <view class="route-item" @click.stop="openNavigation(item, 'start')">
-                                <view class="icon-circle start"></view>
+                                <view class="icon-circle start"></view>
                                 <view class="route-line-vertical"></view>
                                 <view class="address-box">
                                     <text class="addr-title">{{ item.startLocation }}</text>
                                     <text class="addr-desc">{{ item.startAddress }}</text>
                                 </view>
-                                <view class="distance-tag">
-                                    <text class="distance-text">{{ item.startDistance }}</text>
-                                    <view class="nav-icon-circle">
-                                        <image class="nav-arrow" src="/static/icons/nav_arrow.svg"></image>
-                                    </view>
-                                </view>
+                                <image class="nav-arrow" src="/static/icons/nav_arrow.svg" style="flex-shrink: 0; align-self: center;"></image>
                             </view>
 
                             <view class="route-item" @click.stop="openNavigation(item, 'end')">
-                                <view class="icon-circle end"></view>
+                                <view class="icon-circle end">送</view>
                                 <view class="address-box">
                                     <text class="addr-title">{{ item.endLocation }}</text>
                                     <text class="addr-desc">{{ item.endAddress }}</text>
                                 </view>
-                                <view class="distance-tag">
-                                    <text class="distance-text">{{ item.endDistance }}</text>
-                                    <view class="nav-icon-circle">
-                                        <image class="nav-arrow" src="/static/icons/nav_arrow.svg"></image>
-                                    </view>
-                                </view>
+                                <image class="nav-arrow" src="/static/icons/nav_arrow.svg" style="flex-shrink: 0; align-self: center;"></image>
                             </view>
                         </template>
                         <template v-else>
@@ -142,12 +131,7 @@
                                     <text class="addr-title">{{ item.endLocation }}</text>
                                     <text class="addr-desc">{{ item.endAddress }}</text>
                                 </view>
-                                <view class="distance-tag">
-                                    <text class="distance-text">{{ item.endDistance }}</text>
-                                    <view class="nav-icon-circle">
-                                        <image class="nav-arrow" src="/static/icons/nav_arrow.svg"></image>
-                                    </view>
-                                </view>
+                                <image class="nav-arrow" src="/static/icons/nav_arrow.svg" style="flex-shrink: 0; align-self: center;"></image>
                             </view>
                             <view class="service-content" v-if="item.serviceContent">
                                 <text class="content-label">服务内容:</text>
@@ -181,7 +165,7 @@
             <!-- 已加载完提示文字 -->
             <view class="loading-text">已加载完</view>
             <view style="height: 160rpx;"></view>
-        </scroll-view>
+        </view>
         <view class="call-mask" v-if="activeCallItem" @click="closeCallMenu"></view>
     </view>
 
@@ -283,7 +267,7 @@
             <view class="nav-sheet-item cancel" @click="closeNavModal">取消</view>
         </view>
     </view>
-
+    <custom-tabbar currentPath="pages/orders/index"></custom-tabbar>
 </template>
 
 <script>

+ 30 - 7
pages/orders/logic.js

@@ -1,7 +1,11 @@
 import { getMyOrders } from '@/api/fulfiller'
 import { getServiceList } from '@/api/service'
+import customTabbar from '@/components/custom-tabbar/index.vue'
 
 export default {
+    components: {
+        customTabbar
+    },
     data() {
         return {
             currentTab: 0,
@@ -37,8 +41,17 @@ export default {
         await this.loadOrders()
     },
     onShow() {
+        uni.hideTabBar()
         this.loadOrders()
     },
+    async onPullDownRefresh() {
+        try {
+            await this.loadServiceList()
+            await this.loadOrders()
+        } finally {
+            uni.stopPullDownRefresh()
+        }
+    },
     watch: {
         currentTab() {
             this.loadOrders()
@@ -87,7 +100,7 @@ export default {
         transformOrder(order, tabIndex) {
             const service = this.serviceList.find(s => s.id === order.service)
             const serviceText = service?.name || '未知'
-            const serviceIcon = service?.icon || '/static/icons/car.svg'
+            const serviceIcon = service?.iconUrl || ''
             const mode = service?.mode || 0
             const isRoundTrip = mode === 1
 
@@ -109,7 +122,7 @@ export default {
                 typeIcon: serviceIcon,
                 statusText: statusText,
                 price: (order.price / 100).toFixed(2),
-                timeLabel: isRoundTrip ? '取货时间' : '服务时间',
+                timeLabel: '服务时间',
                 time: order.serviceTime || '',
                 petAvatar: '/static/dog.png',
                 petName: order.petName || '',
@@ -267,20 +280,30 @@ export default {
         resetTimeFilter() {
             this.hasTimeFilter = false;
             this.selectedDateRange = [];
-            uni.showToast({ title: '已重置服务时间', icon: 'none' });
+            this.startServiceTime = '';
+            this.endServiceTime = '';
             this.closeDropdown();
+            this.loadOrders();
         },
         confirmTimeFilter() {
             if (this.selectedDateRange.length === 0) {
                 uni.showToast({ title: '请先选择日期', icon: 'none' });
                 return;
             }
-            let text = this.selectedDateRange.length === 2 ?
-                `${this.selectedDateRange[0]}日-${this.selectedDateRange[1]}日` :
-                `${this.selectedDateRange[0]}日`;
-            uni.showToast({ title: '已应用: ' + text, icon: 'none' });
+            // 构建时间范围参数
+            const year = this.currentMonth.replace(/[^0-9]/g, '').substring(0, 4);
+            const month = this.currentMonth.replace(/[^0-9]/g, '').substring(4);
+            const pad = (n) => String(n).padStart(2, '0');
+            if (this.selectedDateRange.length === 2) {
+                this.startServiceTime = `${year}-${pad(month)}-${pad(this.selectedDateRange[0])} 00:00:00`;
+                this.endServiceTime = `${year}-${pad(month)}-${pad(this.selectedDateRange[1])} 23:59:59`;
+            } else {
+                this.startServiceTime = `${year}-${pad(month)}-${pad(this.selectedDateRange[0])} 00:00:00`;
+                this.endServiceTime = `${year}-${pad(month)}-${pad(this.selectedDateRange[0])} 23:59:59`;
+            }
             this.hasTimeFilter = true;
             this.closeDropdown();
+            this.loadOrders();
         },
         getMainActionText(item) {
             return '查看详情';

BIN
unpackage/cache/apk/__UNI__76F5C47_cm.apk


+ 1 - 0
unpackage/cache/apk/apkurl

@@ -0,0 +1 @@
+https://app.liuyingyong.cn/build/download/bc056990-1d12-11f1-8857-5dd7a04169c7

Plik diff jest za duży
+ 0 - 0
unpackage/cache/apk/cmManifestCache.json


+ 4 - 0
unpackage/cache/certdata

@@ -0,0 +1,4 @@
+andrCertfile=D:/Code/HBuilderX/plugins/app-safe-pack/Test.keystore
+andrCertAlias=android
+andrCertPass=ep/Tdjka4Y7WYqDB6/S7dw==
+storePassword=ep/Tdjka4Y7WYqDB6/S7dw==

+ 4 - 0
unpackage/cache/cloudcertificate/certini

@@ -0,0 +1,4 @@
+[General]
+andrCertfile=package.keystore
+andrCertAlias=__UNI__76F5C47
+andrCertPass="OfajwCIrlmjSKTkC6V6NIA=="

BIN
unpackage/cache/cloudcertificate/package.keystore


Plik diff jest za duży
+ 15 - 0
unpackage/cache/wgt/__UNI__76F5C47/__uniappautomator.js


Plik diff jest za duży
+ 31 - 0
unpackage/cache/wgt/__UNI__76F5C47/__uniappchooselocation.js


BIN
unpackage/cache/wgt/__UNI__76F5C47/__uniapperror.png


Plik diff jest za duży
+ 31 - 0
unpackage/cache/wgt/__UNI__76F5C47/__uniappopenlocation.js


Plik diff jest za duży
+ 31 - 0
unpackage/cache/wgt/__UNI__76F5C47/__uniapppicker.js


Plik diff jest za duży
+ 6 - 0
unpackage/cache/wgt/__UNI__76F5C47/__uniappquill.js


Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/__uniappquillimageresize.js


Plik diff jest za duży
+ 31 - 0
unpackage/cache/wgt/__UNI__76F5C47/__uniappscan.js


BIN
unpackage/cache/wgt/__UNI__76F5C47/__uniappsuccess.png


+ 24 - 0
unpackage/cache/wgt/__UNI__76F5C47/__uniappview.html

@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <title>View</title>
+    <link rel="icon" href="data:,">
+    <link rel="stylesheet" href="app.css" />
+    <script>var __uniConfig = {"globalStyle":{},"darkmode":false}</script>
+    <script>
+      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
+        CSS.supports('top: constant(a)'))
+      document.write(
+        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
+    </script>
+  </head>
+  <body>
+    <div id="app"></div>
+    <script src="uni-app-view.umd.js"></script>
+    
+    
+    
+  </body>
+</html>

Plik diff jest za duży
+ 4 - 0
unpackage/cache/wgt/__UNI__76F5C47/app-config-service.js


+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/app-config.js

@@ -0,0 +1 @@
+(function(){})();

Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/app-service.js


Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/app.css


Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/manifest.json


Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/home/index.css


+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/home/work-status.css

@@ -0,0 +1 @@
+body{background-color:#fff}.container{display:flex;flex-direction:column;align-items:center;padding-top:3.125rem}.signboard-container{position:relative;width:12.5rem;height:9.375rem;display:flex;justify-content:center;margin-bottom:1.875rem}.rope{position:absolute;top:0;width:6.25rem;height:3.125rem;border-top:.125rem solid #FFC107;border-radius:50% 50% 0 0/100% 100% 0 0;z-index:1}.nail{position:absolute;top:-.3125rem;width:.75rem;height:.75rem;background-color:#ffc107;border-radius:50%;z-index:2;box-shadow:0 .0625rem .125rem rgba(0,0,0,.2)}.board{position:absolute;top:2.5rem;width:11.25rem;height:6.25rem;background-color:#ff7043;border-radius:.625rem;display:flex;justify-content:center;align-items:center;box-shadow:0 .3125rem #e64a19;transition:all .3s}.board.resting{background-color:#bdbdbd;box-shadow:0 .3125rem #9e9e9e}.board-inner{width:8.75rem;height:3.75rem;background-color:#fff;border-radius:.3125rem;display:flex;justify-content:center;align-items:center;transform:rotate(-2deg)}.status-text{font-size:1.5rem;font-weight:700;color:#ff5722}.board.resting .status-text{color:#757575}.screw{position:absolute;width:.5rem;height:.5rem;background-color:#fff;border-radius:50%;opacity:.8}.top-left{top:.625rem;left:.625rem}.top-right{top:.625rem;right:.625rem}.bottom-left{bottom:.625rem;left:.625rem}.bottom-right{bottom:.625rem;right:.625rem}.status-desc{margin-bottom:3.125rem;color:#333;font-size:.9375rem;font-weight:500}.action-area{width:80%;display:flex;flex-direction:column;align-items:center}.action-btn{width:100%;height:2.75rem;line-height:2.75rem;border-radius:1.375rem;color:#fff;font-size:1rem;font-weight:700;margin-bottom:.9375rem;border:none}.action-btn:after{border:none}.action-btn.stop{background:linear-gradient(90deg,#ff9800,#ff5722);box-shadow:0 .3125rem .625rem rgba(255,87,34,.3)}.action-btn.stopped{background-color:#e0e0e0;color:#999;box-shadow:none}.tips{font-size:.75rem;color:#999;text-align:center;line-height:1.5}

Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/login/login.css


+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/login/reset-pwd-set.css

@@ -0,0 +1 @@
+body{background-color:#fff}.reset-container{padding:1.25rem}.tip-text{font-size:.875rem;color:#666;margin-bottom:1.875rem}.input-form{margin-bottom:2.5rem}.input-row{padding:.9375rem 0}.pwd-input{font-size:.9375rem;width:100%;color:#333}.divider{height:1px;background-color:#eee}.confirm-btn{background:linear-gradient(90deg,#ff6f00,#ff5722);color:#fff;font-size:1rem;font-weight:700;border-radius:.25rem;height:2.75rem;line-height:2.75rem}.confirm-btn:after{border:none}

+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/login/reset-pwd-verify.css

@@ -0,0 +1 @@
+body{background-color:#fff}.reset-container{padding:1.25rem}.tip-text{font-size:.875rem;color:#666;margin-bottom:1.875rem;line-height:1.5}.input-group{display:flex;align-items:center;border-bottom:1px solid #f0f0f0;padding-bottom:.625rem;margin-bottom:1.875rem}.label{font-size:.9375rem;color:#333;width:3.75rem}.input-wrapper{flex:1;display:flex;align-items:center;justify-content:space-between}.code-input{flex:1;font-size:.9375rem;color:#333}.get-code-btn{background-color:#f8f8f8;padding:.3125rem .625rem;border-radius:.25rem}.btn-text{font-size:.8125rem;color:#ff5722}.next-btn{background:linear-gradient(90deg,#ff6f00,#ff5722);color:#fff;font-size:1rem;font-weight:700;border-radius:.25rem;height:2.75rem;line-height:2.75rem}.next-btn:after{border:none}

Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/index.css


Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/level/index.css


+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/message/detail.css

@@ -0,0 +1 @@
+body{background-color:#fff;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.nav-bar{position:fixed;top:0;left:0;width:100%;height:2.75rem;padding-top:var(--status-bar-height);background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding:0 .9375rem;box-sizing:border-box;z-index:100;border-bottom:.03125rem solid #f5f5f5}.nav-placeholder{height:calc(2.75rem + var(--status-bar-height))}.back-icon{width:1.25rem;height:1.25rem}.nav-title{font-size:1.0625rem;font-weight:700;color:#333}.nav-right{width:1.25rem}.detail-content{padding:1.25rem .9375rem}.detail-title{font-size:1.25rem;font-weight:700;color:#333;display:block;margin-bottom:.625rem}.detail-time{font-size:.75rem;color:#999;display:block;margin-bottom:1.25rem}.detail-body{font-size:.9375rem;color:#333;line-height:1.8}.detail-footer{margin-top:1.875rem;text-align:center}.divider{height:.03125rem;background-color:#eee;margin-bottom:.9375rem}.footer-text{font-size:.8125rem;color:#ccc}

+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/message/index.css

@@ -0,0 +1 @@
+body{background-color:#fff;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.nav-bar{position:fixed;top:0;left:0;width:100%;height:2.75rem;background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding:0 .9375rem;padding-top:var(--status-bar-height);box-sizing:border-box;z-index:100;border-bottom:.03125rem solid #f5f5f5}.nav-placeholder{height:calc(2.75rem + var(--status-bar-height))}.back-icon{width:1.25rem;height:1.25rem}.nav-title{font-size:1.0625rem;font-weight:700;color:#333}.nav-right{width:1.25rem;display:flex;justify-content:flex-end}.more-dots{display:flex;gap:.125rem}.dot{width:.1875rem;height:.1875rem;background-color:#333;border-radius:50%}.message-list{padding:0 .9375rem}.message-item{display:flex;align-items:center;padding:.9375rem 0;border-bottom:.03125rem solid #f5f5f5}.icon-wrapper{position:relative;margin-right:.9375rem}.msg-icon{width:3rem;height:3rem;border-radius:50%}.red-dot-badge{position:absolute;top:0;right:0;width:.5rem;height:.5rem;background-color:#ff3b30;border-radius:50%;border:.0625rem solid #fff}.content-wrapper{flex:1;display:flex;flex-direction:column}.top-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:.3125rem}.msg-title{font-size:.875rem;font-weight:700;color:#333}.msg-time{font-size:.75rem;color:#999}.msg-preview{font-size:.8125rem;color:#666;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;width:15.625rem}

+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/message/order.css

@@ -0,0 +1 @@
+body{background-color:#f5f6fa;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.nav-bar{position:fixed;top:0;left:0;width:100%;height:2.75rem;padding-top:var(--status-bar-height);background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding:0 .9375rem;box-sizing:border-box;z-index:100}.nav-placeholder{height:calc(2.75rem + var(--status-bar-height))}.back-icon{width:1.25rem;height:1.25rem}.nav-title{font-size:1.0625rem;font-weight:700;color:#333}.nav-right{width:1.25rem}.msg-group{padding:.625rem .9375rem}.date-label{text-align:center;font-size:.75rem;color:#ccc;margin:.625rem 0}.msg-card{background-color:#fff;border-radius:.5rem;padding:.9375rem;margin-bottom:.625rem;box-shadow:0 .125rem .3125rem rgba(0,0,0,.02)}.card-header{display:flex;align-items:center;margin-bottom:.5rem}.card-title{font-size:.875rem;font-weight:700;color:#333}.red-dot{width:.375rem;height:.375rem;background-color:#ff3b30;border-radius:50%;margin-left:.3125rem}.card-body{margin-bottom:.75rem;padding-bottom:.75rem;border-bottom:.03125rem solid #f5f5f5}.msg-text{font-size:.8125rem;color:#666;line-height:1.5}.card-footer{display:flex;justify-content:space-between;align-items:center}.order-id{font-size:.75rem;color:#999}.arrow-icon{width:.75rem;height:.75rem;opacity:.3}

+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/message/system.css

@@ -0,0 +1 @@
+body{background-color:#f5f6fa;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.nav-bar{position:fixed;top:0;left:0;width:100%;height:2.75rem;padding-top:var(--status-bar-height);background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding:0 .9375rem;box-sizing:border-box;z-index:100}.nav-placeholder{height:calc(2.75rem + var(--status-bar-height))}.back-icon{width:1.25rem;height:1.25rem}.nav-title{font-size:1.0625rem;font-weight:700;color:#333}.nav-right{width:1.25rem}.sys-msg-list{padding:.625rem .9375rem}.date-label{text-align:center;font-size:.75rem;color:#ccc;margin:.9375rem 0 .625rem}.sys-card{background-color:#fff;border-radius:.5rem;padding:.9375rem;margin-bottom:.625rem;box-shadow:0 .0625rem .25rem rgba(0,0,0,.02)}.sys-header{display:flex;align-items:center;margin-bottom:.5rem}.sys-title{font-size:.875rem;font-weight:700;color:#333}.red-dot{width:.3125rem;height:.3125rem;background-color:#ff3b30;border-radius:50%;margin-left:.3125rem}.sys-content{margin-bottom:.75rem}.sys-text{font-size:.8125rem;color:#666;line-height:1.6}.sys-footer{display:flex;justify-content:space-between;align-items:center;border-top:.03125rem solid #f5f5f5;padding-top:.625rem}.sys-time{font-size:.75rem;color:#999}.check-more{display:flex;align-items:center;font-size:.75rem;color:#999}.arrow-icon-small{width:.625rem;height:.625rem;margin-left:.125rem;opacity:.5}

Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/order-stats.css


Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/points/detail.css


Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/points/index.css


+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/rewards-all.css

@@ -0,0 +1 @@
+body{background-color:#f7f8fa}.container{min-height:100vh;background-color:#f7f8fa}.tab-bar{display:flex;background-color:#fff;padding:0 .9375rem}.tab-item{padding:.5625rem .5rem 0;font-size:.875rem;color:#999;display:flex;flex-direction:column;align-items:center}.tab-item:first-child{padding-left:0}.tab-item.active{color:#ff9800;font-weight:700}.tab-line{width:1rem;height:.09375rem;background-color:#ff9800;border-radius:.0625rem;margin-top:.25rem;align-self:center}.main-scroll{flex:1;padding:.5rem 0}.month-group{background-color:#fff;border-radius:.5rem;padding:0 .75rem;margin:0 .9375rem .5rem;overflow:hidden}.month-header{display:flex;align-items:center;padding:.625rem 0;border-bottom:.03125rem solid #f5f5f5}.month-title{font-size:.9375rem;font-weight:700;color:#333;margin-right:.375rem}.month-summary{display:flex}.month-sum-text{font-size:.6875rem;color:#999;margin-right:.3125rem}.record-item{display:flex;align-items:center;padding:.75rem 0;border-bottom:.03125rem solid #f9f9f9}.ri-icon{width:2.25rem;height:2.25rem;border-radius:50%;background-color:#fff3e0;display:flex;align-items:center;justify-content:center;margin-right:.625rem;flex-shrink:0}.ri-icon.ri-penalty{background-color:#fafafa}.ri-icon-text{font-size:.9375rem;color:#ff9800;font-weight:700}.ri-icon.ri-penalty .ri-icon-text{color:#ccc}.ri-content{flex:1}.ri-title-row{display:flex;align-items:center;margin-bottom:.1875rem}.ri-date{font-size:.8125rem;color:#333;font-weight:700;margin-right:.3125rem}.ri-title{font-size:.8125rem;color:#333}.ri-desc{font-size:.75rem;color:#999}.ri-right{display:flex;flex-direction:column;align-items:flex-end;margin-left:.5rem}.ri-amount{font-size:.9375rem;font-weight:700;margin-bottom:.125rem}.ri-amount.positive{color:#ff5722}.ri-amount.negative{color:#333}.ri-status{font-size:.6875rem}.ri-status.pending{color:#ff9800}.ri-status.credited,.ri-status.deducted{color:#999}

Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/rewards.css


+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/about/index.css

@@ -0,0 +1 @@
+body{background-color:#f8f8f8;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.custom-header{position:fixed;top:0;left:0;width:100%;height:2.75rem;padding-top:var(--status-bar-height);background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding-left:.9375rem;padding-right:.9375rem;box-sizing:border-box;z-index:100}.header-placeholder{height:calc(2.75rem + var(--status-bar-height))}.back-icon{width:1.25rem;height:1.25rem}.header-title{font-size:1rem;font-weight:700;color:#333}.header-right{width:1.25rem}.container{padding:.625rem .9375rem}.logo-area{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:1.875rem 0}.app-logo{width:5rem;height:5rem;border-radius:.9375rem;margin-bottom:.625rem}.app-name{font-size:1.125rem;font-weight:700;color:#333;margin-bottom:.3125rem}.app-version{font-size:.875rem;color:#999}.group-card{background-color:#fff;border-radius:.625rem;padding:0 .9375rem}.list-item{display:flex;justify-content:space-between;align-items:center;height:3.125rem;border-bottom:1px solid #F5F5F5}.list-item.no-border{border-bottom:none}.item-title{font-size:.875rem;color:#333}.item-right{display:flex;align-items:center}.arrow-icon{width:.875rem;height:.875rem;opacity:.5;margin-left:.3125rem}.badge-yellow{width:1.125rem;height:1.125rem;background-color:#ffc107;color:#fff;font-size:.75rem;line-height:1.125rem;text-align:center;border-radius:.1875rem}

Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/auth/edit.css


Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/auth/index.css


+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/bank/index.css

@@ -0,0 +1 @@
+body{background-color:#f8f8f8;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.custom-header{position:fixed;top:0;left:0;width:100%;height:2.75rem;padding-top:var(--status-bar-height);background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding-left:.9375rem;padding-right:.9375rem;box-sizing:content-box;z-index:100}.header-placeholder{height:calc(2.75rem + var(--status-bar-height))}.back-icon{width:1.25rem;height:1.25rem}.header-title{font-size:.875rem;font-weight:700;color:#333}.header-right{width:1.25rem}.container{padding:.9375rem}.bank-card{background:linear-gradient(135deg,#e53935,#c62828);border-radius:.625rem;padding:1.25rem;color:#fff;margin-bottom:1.875rem;position:relative;overflow:hidden;box-shadow:0 .3125rem .9375rem rgba(229,57,53,.3)}.card-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.875rem;position:relative;z-index:2}.bank-info{display:flex;align-items:center}.bank-icon-circle{width:1.875rem;height:1.875rem;background-color:#fff;border-radius:50%;display:flex;align-items:center;justify-content:center;margin-right:.625rem}.bank-icon-text{color:#c62828;font-weight:700;font-size:1rem}.bank-name{font-size:1rem;font-weight:700}.card-type{font-size:.75rem;border:1px solid rgba(255,255,255,.6);padding:.125rem .375rem;border-radius:.25rem}.card-number{font-size:1.5rem;font-family:monospace;letter-spacing:.125rem;position:relative;z-index:2;text-shadow:0 .0625rem .125rem rgba(0,0,0,.2)}.card-bg-circle{position:absolute;top:-1.5625rem;right:-1.5625rem;width:9.375rem;height:9.375rem;background-color:rgba(255,255,255,.1);border-radius:50%;z-index:1}.action-btn{background-color:#ff5722;color:#fff;font-size:1rem;border-radius:1.375rem;height:2.75rem;line-height:2.75rem;margin-bottom:.9375rem}.security-tip{display:flex;align-items:center;justify-content:center;font-size:.75rem;color:#999}.shield-icon{width:.75rem;height:.75rem;margin-right:.3125rem}

+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/index.css

@@ -0,0 +1 @@
+body{background-color:#f8f8f8;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.custom-header{position:fixed;top:0;left:0;width:100%;height:2.75rem;padding-top:var(--status-bar-height);background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding-left:.9375rem;padding-right:.9375rem;box-sizing:content-box;z-index:100}.header-placeholder{height:calc(2.75rem + var(--status-bar-height))}.back-icon{width:1.25rem;height:1.25rem}.header-title{font-size:.875rem;font-weight:700;color:#333}.header-right{width:1.25rem}.container{padding:.625rem .9375rem}.group-card{background-color:#fff;border-radius:.625rem;padding:0 .9375rem;margin-bottom:.9375rem}.list-item{display:flex;justify-content:space-between;align-items:center;height:3.125rem;border-bottom:1px solid #F5F5F5}.list-item.no-border{border-bottom:none}.item-title{font-size:.875rem;color:#333}.item-right{display:flex;align-items:center}.arrow-icon{width:.875rem;height:.875rem;opacity:.5;margin-left:.3125rem}.tag-status{font-size:.6875rem;color:#4caf50;background-color:#f1f8e9;padding:.125rem .3125rem;border-radius:.1875rem;margin-right:.1875rem}.item-value{font-size:.875rem;color:#999}.item-column{display:flex;flex-direction:column}.item-row-left{display:flex;align-items:center}.item-subtitle{font-size:.75rem;color:#999;margin-left:.625rem;margin-top:0}

+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/notification/index.css

@@ -0,0 +1 @@
+body{background-color:#f8f8f8;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.custom-header{position:fixed;top:0;left:0;width:100%;height:2.75rem;padding-top:var(--status-bar-height);background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding-left:.9375rem;padding-right:.9375rem;box-sizing:border-box;z-index:100}.header-placeholder{height:calc(2.75rem + var(--status-bar-height))}.back-icon{width:1.25rem;height:1.25rem}.header-title{font-size:1rem;font-weight:700;color:#333}.header-right{width:1.25rem}.container{padding:.625rem .9375rem}.group-card{background-color:#fff;border-radius:.625rem;padding:0 .9375rem;margin-bottom:.625rem}.list-item{display:flex;justify-content:space-between;align-items:center;height:3.125rem;border-bottom:1px solid #F5F5F5}.list-item.no-border{border-bottom:none}.item-title{font-size:.875rem;color:#333}.tips-text{font-size:.75rem;color:#999;padding-left:.3125rem}

+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/profile/edit-name.css

@@ -0,0 +1 @@
+body{background-color:#f8f8f8}.custom-header{position:fixed;top:0;left:0;width:100%;height:2.75rem;padding-top:var(--status-bar-height);background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding-left:.9375rem;padding-right:.9375rem;box-sizing:content-box;z-index:100}.header-placeholder{height:calc(2.75rem + var(--status-bar-height))}.back-icon{width:1.25rem;height:1.25rem}.header-title{font-size:.875rem;font-weight:700;color:#333}.header-right{width:1.25rem}.container{padding:.625rem .9375rem}.form-card{background-color:#fff;border-radius:.625rem;padding:0 .9375rem;margin-bottom:.9375rem}.form-item{display:flex;align-items:center;padding:.9375rem 0;border-bottom:1px solid #F5F5F5}.form-item.no-border{border-bottom:none}.form-label{width:5rem;font-size:.875rem;color:#333}.form-input{flex:1;font-size:.875rem;color:#333}.placeholder{color:#999}.btn-area{padding:1.25rem 0}.submit-btn{background-color:#ff5722;color:#fff;font-size:1rem;border-radius:1.375rem;height:2.75rem;line-height:2.75rem;border:none}.tips{padding:.625rem .9375rem}.tips-text{display:block;font-size:.75rem;color:#999;line-height:1.25rem}

Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/profile/index.css


+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/security/change-password.css

@@ -0,0 +1 @@
+body{background-color:#f8f8f8}.custom-header{position:fixed;top:0;left:0;width:100%;height:2.75rem;padding-top:var(--status-bar-height);background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding-left:.9375rem;padding-right:.9375rem;box-sizing:content-box;z-index:100}.header-placeholder{height:calc(2.75rem + var(--status-bar-height))}.back-icon{width:1.25rem;height:1.25rem}.header-title{font-size:.875rem;font-weight:700;color:#333}.header-right{width:1.25rem}.container{padding:.625rem .9375rem}.form-card{background-color:#fff;border-radius:.625rem;padding:0 .9375rem;margin-bottom:.9375rem}.form-item{display:flex;align-items:center;padding:.9375rem 0;border-bottom:1px solid #F5F5F5}.form-item.no-border{border-bottom:none}.form-label{width:5rem;font-size:.875rem;color:#333}.form-input{flex:1;font-size:.875rem;color:#333}.placeholder{color:#999}.btn-area{padding:1.25rem 0}.submit-btn{background-color:#ff5722;color:#fff;font-size:1rem;border-radius:1.375rem;height:2.75rem;line-height:2.75rem;border:none}

+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/security/change-phone.css

@@ -0,0 +1 @@
+body{background-color:#f8f8f8}.custom-header{position:fixed;top:0;left:0;width:100%;height:2.75rem;padding-top:var(--status-bar-height);background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding-left:.9375rem;padding-right:.9375rem;box-sizing:content-box;z-index:100}.header-placeholder{height:calc(2.75rem + var(--status-bar-height))}.back-icon{width:1.25rem;height:1.25rem}.header-title{font-size:.875rem;font-weight:700;color:#333}.header-right{width:1.25rem}.container{padding:.625rem .9375rem}.form-card{background-color:#fff;border-radius:.625rem;padding:0 .9375rem;margin-bottom:.9375rem}.form-item{display:flex;align-items:center;padding:.9375rem 0;border-bottom:1px solid #F5F5F5}.form-item.no-border{border-bottom:none}.form-label{width:5rem;font-size:.875rem;color:#333}.form-input{flex:1;font-size:.875rem;color:#333}.placeholder{color:#999}.code-btn{width:5.625rem;height:1.875rem;line-height:1.875rem;background-color:#ff5722;color:#fff;font-size:.75rem;border-radius:.9375rem;padding:0;margin-left:.625rem}.code-btn[disabled]{background-color:#ccc}.btn-area{padding:1.25rem 0}.submit-btn{background-color:#ff5722;color:#fff;font-size:1rem;border-radius:1.375rem;height:2.75rem;line-height:2.75rem;border:none}.tips{padding:.625rem .9375rem}.tips-text{display:block;font-size:.75rem;color:#999;line-height:1.25rem}

+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/settings/security/index.css

@@ -0,0 +1 @@
+body{background-color:#f8f8f8;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.custom-header{position:fixed;top:0;left:0;width:100%;height:2.75rem;padding-top:var(--status-bar-height);background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding-left:.9375rem;padding-right:.9375rem;box-sizing:content-box;z-index:100}.header-placeholder{height:calc(2.75rem + var(--status-bar-height))}.back-icon{width:1.25rem;height:1.25rem}.header-title{font-size:.875rem;font-weight:700;color:#333}.header-right{width:1.25rem}.container{padding:.625rem .9375rem}.section-title-security{font-size:.75rem;color:#999;margin-bottom:.625rem;margin-top:.625rem;padding-left:.3125rem}.group-card{background-color:#fff;border-radius:.625rem;padding:0 .9375rem;margin-bottom:.9375rem}.list-item{display:flex;justify-content:space-between;align-items:center;height:3.125rem;border-bottom:1px solid #F5F5F5}.list-item.no-border{border-bottom:none}.item-title{font-size:.875rem;color:#333}.item-right{display:flex;align-items:center}.arrow-icon{width:.875rem;height:.875rem;opacity:.5;margin-left:.3125rem}.item-value{font-size:.875rem;color:#999}

Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/wallet/bill.css


Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/mine/wallet/index.css


Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/orders/anomaly.css


Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/orders/detail.css


Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/orders/index.css


+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/recruit/auth.css

@@ -0,0 +1 @@
+body{background-color:#f8f8f8;font-family:-apple-system,BlinkMacSystemFont,Helvetica Neue,Helvetica,Segoe UI,Arial,Roboto,PingFang SC,miui,Hiragino Sans GB,Microsoft Yahei,sans-serif}.auth-container{padding:.625rem .625rem 6.25rem}.top-tip{font-size:.75rem;color:#666;margin-bottom:.625rem;padding:0 .3125rem}.form-card{background-color:#fff;border-radius:.625rem;padding:0 .9375rem;margin-bottom:.625rem}.form-item{display:flex;align-items:center;height:3.125rem;border-bottom:none}.label{width:5rem;font-size:.8125rem;font-weight:700;color:#333}.input-area{flex:1;font-size:.8125rem;color:#333}.input-placeholder{color:#ccc;font-size:.8125rem}.read-only-text{color:#333;font-size:.8125rem}.card-label{font-size:.8125rem;color:#333;font-weight:700}.next-btn{background:linear-gradient(90deg,#ff6f00,#ff5722);color:#fff;font-size:.875rem;font-weight:700;height:2.8125rem;line-height:2.8125rem;border-radius:1.40625rem;box-shadow:0 .3125rem .625rem rgba(255,87,34,.2)}.gray-input-box{flex:1;height:2.1875rem;background-color:#f8f8f8;border-radius:.25rem;display:flex;align-items:center;padding:0 .625rem}.arrow-right{width:.75rem;height:.75rem;margin-left:auto}.upload-card{background-color:#fff;border-radius:.625rem;padding:1.25rem 0;margin-bottom:.625rem;display:flex;flex-direction:column;align-items:center;justify-content:center}.upload-box{width:18.75rem;height:11.25rem;background-color:#f8f8f8;border:.0625rem dashed #eee;border-radius:.375rem;display:flex;flex-direction:column;align-items:center;justify-content:center;margin-bottom:.625rem;position:relative;overflow:hidden}.camera-icon{width:2rem;height:2rem;margin-bottom:.46875rem}.upload-text{font-size:.8125rem;color:#ccc}.preview-img{width:100%;height:100%}.footer-btn-area{margin-top:1.875rem;padding:0 .625rem}

Plik diff jest za duży
+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/recruit/form.css


+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/recruit/landing.css

@@ -0,0 +1 @@
+body{background-color:#ff9800}.container{min-height:100vh;display:flex;flex-direction:column;position:relative}.nav-bar{height:2.75rem;display:flex;align-items:center;padding:0 .9375rem}.back-icon{font-size:1.875rem;color:#fff;font-weight:700;width:1.875rem;height:1.875rem;line-height:1.75rem;text-align:center;display:block}.header-area{padding:1.25rem 1.25rem .625rem;color:#fff;text-align:center}.main-title{font-size:1.5rem;font-weight:700;display:block;margin-bottom:.625rem}.sub-title{font-size:1rem;opacity:.9;display:block}.content-card{background-color:#fff;border-radius:.9375rem;margin:1.25rem .9375rem;padding:1.875rem 1.25rem;display:flex;flex-direction:column;box-shadow:0 .3125rem .9375rem rgba(0,0,0,.1)}.benefit-item{display:flex;align-items:center;margin-bottom:1.875rem}.icon-circle{width:2.5rem;height:2.5rem;border-radius:50%;display:flex;align-items:center;justify-content:center;margin-right:.9375rem;flex-shrink:0;color:#fff;font-weight:700}.icon-money{background-color:#26a69a}.icon-loc{background-color:#2979ff}.icon-clock{background-color:#ff7043}.icon-text{font-size:1.25rem}.info{flex:1}.item-title{font-size:1rem;font-weight:700;color:#333;margin-bottom:.25rem;display:block}.item-desc{font-size:.8125rem;color:#666;line-height:1.6;display:block}.footer-area{margin-top:auto;padding:.625rem 1.25rem 2.5rem;display:flex;flex-direction:column;align-items:center}.join-btn{width:100%;height:2.8125rem;line-height:2.8125rem;background:#fff;color:#ff5722;font-size:1.0625rem;font-weight:700;border-radius:1.40625rem;box-shadow:0 .3125rem .625rem rgba(0,0,0,.1)}.join-btn:after{border:none}.faq{margin-top:.9375rem;color:#fff;font-size:.8125rem;display:flex;align-items:center}.help-icon{width:.9375rem;height:.9375rem;border:1px solid #fff;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:.625rem;margin-right:.3125rem;color:#fff}

+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/recruit/qualifications.css

@@ -0,0 +1 @@
+body{background-color:#f8f8f8;padding-bottom:6.25rem;font-family:-apple-system,BlinkMacSystemFont,Helvetica Neue,Helvetica,Segoe UI,Arial,Roboto,PingFang SC,miui,Hiragino Sans GB,Microsoft Yahei,sans-serif}.qual-container{padding:.625rem}.top-tip{font-size:.75rem;color:#666;margin-bottom:.625rem;padding:0 .3125rem;line-height:1.5}.empty-state{display:flex;flex-direction:column;align-items:center;padding-top:3.125rem;padding-bottom:1.875rem}.empty-tip{font-size:.9375rem;color:#999;margin-bottom:1.25rem}.back-btn{width:9.375rem;height:2.5rem;line-height:2.5rem;border:.0625rem solid #FF5722;color:#ff5722;background-color:#fff;border-radius:1.25rem;font-size:.9375rem}.qual-card{background-color:#fff;border-radius:.625rem;padding:.9375rem;margin-bottom:.625rem}.card-title{font-size:.875rem;font-weight:700;color:#333;margin-bottom:.9375rem}.upload-wrapper{display:flex;flex-wrap:wrap}.img-item{width:6.25rem;height:6.25rem;position:relative;margin-right:.625rem;margin-bottom:.625rem}.upload-box{width:6.25rem;height:6.25rem;background-color:#f8f8f8;border:.0625rem dashed #eee;border-radius:.375rem;display:flex;flex-direction:column;align-items:center;justify-content:center;margin-bottom:.625rem}.plus-icon{font-size:1.875rem;color:#ccc;font-weight:300;margin-bottom:.3125rem}.upload-text{font-size:.75rem;color:#999}.preview-img{width:100%;height:100%;border-radius:.375rem}.delete-btn{position:absolute;top:-.3125rem;right:-.3125rem;width:1.125rem;height:1.125rem;background-color:#ff5722;border-radius:50%;color:#fff;font-size:.75rem;display:flex;align-items:center;justify-content:center;z-index:10;border:.0625rem solid #fff}.footer-actions{margin-top:1.875rem;padding:0 .625rem}.submit-btn{background:linear-gradient(90deg,#ff6f00,#ff5722);color:#fff;font-size:.875rem;font-weight:700;height:2.8125rem;line-height:2.8125rem;border-radius:1.40625rem;box-shadow:0 .3125rem .625rem rgba(255,87,34,.2)}.submit-btn:after{border:none}

+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/pages/recruit/success.css

@@ -0,0 +1 @@
+body{background-color:#fff;font-family:-apple-system,BlinkMacSystemFont,Helvetica Neue,Helvetica,Segoe UI,Arial,Roboto,PingFang SC,miui,Hiragino Sans GB,Microsoft Yahei,sans-serif}.success-container{padding:1.875rem 1.25rem;display:flex;flex-direction:column;align-items:center}.icon-area{margin-top:1.875rem;margin-bottom:.9375rem;display:flex;flex-direction:column;align-items:center}.success-icon{width:3.75rem;height:3.75rem;margin-bottom:.625rem}.main-title{font-size:1.125rem;font-weight:700;color:#333}.sub-tip{font-size:.8125rem;color:#ff5722;margin-bottom:1.875rem;text-align:center}.info-card{width:100%;background-color:#fff;border:.0625rem dashed #eee;border-radius:.375rem;padding:1.25rem;box-sizing:border-box;margin-bottom:3.125rem}.info-item{display:flex;margin-bottom:.78125rem;font-size:.875rem}.info-item:last-child{margin-bottom:0}.label{min-width:5rem;color:#999}.value{color:#333;font-weight:700}.footer-btn{width:7.5rem;height:2.5rem;line-height:2.5rem;background:linear-gradient(90deg,#ff6f00,#ff5722);color:#fff;font-size:.875rem;font-weight:700;border-radius:.25rem;text-align:center;margin-top:auto}

BIN
unpackage/cache/wgt/__UNI__76F5C47/static/dog.png


BIN
unpackage/cache/wgt/__UNI__76F5C47/static/header.png


+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/bell.png

@@ -0,0 +1 @@
+x

+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/bell.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#333" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 8a6 6 0 0 0-6-6 6 6 0 0 0-6 6c0 7-3 9-3 9h18s-3-2-3-9"></path><path d="M13.73 21a2 2 0 0 1-3.46 0"></path></svg>

+ 5 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/bell_linear.svg

@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M12 21.5C12.8284 21.5 13.5 20.8284 13.5 20H10.5C10.5 20.8284 11.1716 21.5 12 21.5Z" stroke="#333333" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M18 16V10.5C18 7.46243 15.3137 5 12 5C8.6863 5 6 7.46243 6 10.5V16L4 18V19H20V18L18 16Z" stroke="#333333" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M12 5V3" stroke="#333333" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>

+ 4 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/bell_outline.svg

@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#555555" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
+    <path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"></path>
+    <path d="M13.73 21a2 2 0 0 1-3.46 0"></path>
+</svg>

+ 6 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/calendar.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#666666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
+    <rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect>
+    <line x1="16" y1="2" x2="16" y2="6"></line>
+    <line x1="8" y1="2" x2="8" y2="6"></line>
+    <line x1="3" y1="10" x2="21" y2="10"></line>
+</svg>

+ 4 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/camera_grey.svg

@@ -0,0 +1,4 @@
+<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M14.5 4H9.5L8 7H4C3.46957 7 2.96086 7.21071 2.58579 7.58579C2.21071 7.96086 2 8.46957 2 9V19C2 19.5304 2.21071 20.0391 2.58579 20.4142C2.96086 20.7893 3.46957 21 4 21H20C20.5304 21 21.0391 20.7893 21.4142 20.4142C21.7893 20.0391 22 19.5304 22 19V9C22 8.46957 21.7893 7.96086 21.4142 7.58579C21.0391 7.21071 20.5304 7 20 7H16L14.5 4Z" stroke="#999999" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M12 18C14.2091 18 16 16.2091 16 14C16 11.7909 14.2091 10 12 10C9.79086 10 8 11.7909 8 14C8 16.2091 9.79086 18 12 18Z" stroke="#999999" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>

+ 0 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/car.png


+ 1 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/car.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="orange" stroke="white" stroke-width="1"><path d="M18.92 6.01C18.72 5.42 18.16 5 17.5 5h-11c-.66 0-1.21.42-1.42 1.01L3 12v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zM6.5 16c-.83 0-1.5-.67-1.5-1.5S5.67 13 6.5 13s1.5.67 1.5 1.5S7.33 16 6.5 16zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM5 11l1.5-4.5h11L19 11H5z"/></svg>

+ 3 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/chevron_right.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#CCCCCC" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
+    <polyline points="9 18 15 12 9 6"></polyline>
+</svg>

+ 3 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/chevron_right_dark.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#666666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
+    <polyline points="9 18 15 12 9 6"></polyline>
+</svg>

+ 3 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/chevron_right_gold.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#FFE082" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
+    <polyline points="9 18 15 12 9 6"></polyline>
+</svg>

+ 4 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/clock.svg

@@ -0,0 +1,4 @@
+<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21Z" stroke="#999999" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M12 7V12L15 15" stroke="#999999" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>

+ 4 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/close_gray.svg

@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M18 6L6 18" stroke="#999999" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M6 6L18 18" stroke="#999999" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>

+ 3 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/crown.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#FDD835" stroke="#FFA000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
+    <path d="M2 4l3 12h14l3-12-6 7-4-7-4 7-6-7zm3 16h14"></path>
+</svg>

+ 4 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/diamond_white.svg

@@ -0,0 +1,4 @@
+<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+<circle cx="16" cy="16" r="16" fill="white" fill-opacity="0.2"/>
+<path d="M16 8L19 16L16 24L13 16L16 8Z" fill="white"/>
+</svg>

+ 6 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/file.svg

@@ -0,0 +1,6 @@
+<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M14 2H6C5.46957 2 4.96086 2.21071 4.58579 2.58579C4.21071 2.96086 4 3.46957 4 4V20C4 20.5304 4.21071 21.0391 4.58579 21.4142C4.96086 21.7893 5.46957 22 6 22H18C18.5304 22 19.0391 21.7893 19.4142 21.4142C19.7893 21.0391 20 20.5304 20 20V8L14 2Z" stroke="#999999" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M14 2V8H20" stroke="#999999" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M8 13H16" stroke="#999999" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M8 17H16" stroke="#999999" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>

+ 5 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/headset_green.svg

@@ -0,0 +1,5 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <path d="M42 24C42 14.0589 33.9411 6 24 6C14.0589 6 6 14.0589 6 24V29C6 31.2091 7.79086 33 10 33H12C14.2091 33 16 31.2091 16 29V24C16 21.7909 14.2091 20 12 20H10C10.0342 16.3683 12.918 10 24 10C35.082 10 37.9658 16.3683 38 20H36C33.7909 20 32 21.7909 32 24V29C32 31.2091 33.7909 33 36 33H38C38.0009 33 38.0018 32.9999 38.0026 32.9998C37.8973 35.8083 35.8926 38.3845 31.9091 39.5L34 43.1232C40.0915 41.2292 41.9705 36.9038 41.9993 33.0253C42 33.0169 42 33.0084 42 33V24Z" fill="#7CB342"/>
+  <rect x="34" y="22" width="6" height="8" rx="2" fill="#7CB342"/>
+  <rect x="8" y="22" width="6" height="8" rx="2" fill="#7CB342"/>
+</svg>

+ 4 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/headset_linear.svg

@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M19 14V17C19 18.66 17.66 20 16 20H15.5C15.22 20 15 19.78 15 19.5V14.5C15 14.22 15.22 14 15.5 14H19ZM5 14H8.5C8.78 14 9 14.22 9 14.5V19.5C9 19.78 8.78 20 8.5 20H8C6.34 20 5 18.66 5 17V14Z" stroke="#333333" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M19 14V10C19 6.13 15.87 3 12 3C8.13 3 5 6.13 5 10V14" stroke="#333333" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>

+ 7 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/icon_order_msg.svg

@@ -0,0 +1,7 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<circle cx="24" cy="24" r="24" fill="#FF6B6B"/>
+<rect x="15" y="13" width="18" height="22" rx="2" fill="white"/>
+<path d="M19 18H29" stroke="#FF6B6B" stroke-width="2" stroke-linecap="round"/>
+<path d="M19 23H29" stroke="#FF6B6B" stroke-width="2" stroke-linecap="round"/>
+<path d="M19 28H25" stroke="#FF6B6B" stroke-width="2" stroke-linecap="round"/>
+</svg>

+ 4 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/icon_system_msg.svg

@@ -0,0 +1,4 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<circle cx="24" cy="24" r="24" fill="#4285F4"/>
+<path d="M24 35C25.65 35 27 33.66 27 32H21C21 33.66 22.34 35 24 35ZM30 28V22C30 18.23 27.67 15.11 24 14.15V13C24 11.9 23.1 11 22 11C20.9 11 20 11.9 20 13V14.15C16.33 15.11 14 18.23 14 22V28L12 30V31H36V30L34 28Z" fill="white"/>
+</svg>

+ 4 - 0
unpackage/cache/wgt/__UNI__76F5C47/static/icons/location.svg

@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#666666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
+    <path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"></path>
+    <circle cx="12" cy="10" r="3"></circle>
+</svg>

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików