From 3282e95db0207ee133d1e98d9771dec9d83b0fc4 Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期四, 02 四月 2026 16:24:38 +0800
Subject: [PATCH] 2026.4.2 新增专题管理功能

---
 pages/supervision/rank-result-proxy.js                    |   25 +
 pages/supervision/topic-proxy.js                          |  241 ++++++++++++++++++
 pages/supervision/rank-result.wxml                        |   48 +++
 pages/selfpatrol/publish/index.wxml                       |    2 
 pages/inspection/problems-proxy.js                        |   20 +
 pages/supervision/rank-result.wxss                        |   43 +++
 components/gallery/index.wxss                             |    4 
 components/gallery/index.wxml                             |    2 
 pages/supervision/index.json                              |    4 
 model/ledger/ledgerSummary.js                             |    1 
 pages/enterprise/detail/components/ledger-stat/index.js   |    5 
 pages/supervision/index.js                                |   42 +-
 pages/enterprise/detail/components/ledger-stat/index.wxml |    2 
 components/filter/index.wxml                              |    4 
 pages/supervision/index.wxml                              |   39 --
 pages/selfpatrol/components/patrol-record/index.wxss      |   24 +
 config/index.js                                           |    4 
 pages/selfpatrol/components/patrol-record/index.wxml      |   12 
 pages/supervision/index.wxss                              |   10 
 components/enterprise-rank-result/index.wxss              |    7 
 components/enterprise-rank-result/index.wxml              |   66 +---
 project.private.config.json                               |   21 +
 pages/enterprise/detail/index.js                          |   10 
 pages/enterprise/detail/index.wxml                        |    6 
 components/gallery/index.js                               |    5 
 components/picker/location-picker/index.wxml              |    2 
 pages/selfpatrol/components/patrol-record/index.js        |   10 
 behaviors/picker/scene/template-scene.wxml                |    3 
 components/picker/location-picker/index.wxss              |    2 
 pages/supervision/topic.wxss                              |   33 ++
 pages/supervision/topic.wxml                              |   29 ++
 services/config/fetchConfig.js                            |   18 +
 project.config.json                                       |   12 
 33 files changed, 631 insertions(+), 125 deletions(-)

diff --git a/behaviors/picker/scene/template-scene.wxml b/behaviors/picker/scene/template-scene.wxml
index b70cdc1..86dfd20 100644
--- a/behaviors/picker/scene/template-scene.wxml
+++ b/behaviors/picker/scene/template-scene.wxml
@@ -1,5 +1,8 @@
 <!-- <template name="scene-picker"> -->
+<import src="/behaviors/picker/template-selector.wxml" />
+
 <block wx:if="{{sceneMode == 0}}">
+  <template is="picker-selector" data="{{key: 'scene', value: sceneText}}" />
   <t-picker
     visible="{{sceneVisible}}"
     value="{{sceneValue}}"
diff --git a/components/enterprise-rank-result/index.wxml b/components/enterprise-rank-result/index.wxml
index 1e13a7a..d172880 100644
--- a/components/enterprise-rank-result/index.wxml
+++ b/components/enterprise-rank-result/index.wxml
@@ -1,47 +1,23 @@
-<view class="enterprise-info__wrap" bind:tap="handCellClick">
-  <view slot="image" class="enterprise-info__img">
-    <view class="enterprise-info__img__score"> {{item.score}} </view>
-    <view class="enterprise-info__img__text"> 鑷瘎 </view>
-    <t-tag
-      max-width="{{130}}"
-      shape="square"
-      size="small"
-      theme="default"
-      variant="light-outline"
-      >{{item.updateTime}}</t-tag
-    >
-  </view>
-  <view class="enterprise-info__main">
-    <view slot="title" class="enterprise-info__title"> {{item.name}} </view>
-    <t-divider />
-    <view slot="description" class="enterprise-info__tag">
-      <t-tag
-        max-width="{{130}}"
-        shape="square"
-        size="small"
-        theme="success"
-        variant="light-outline"
-        disabled
-        >杩愯惀涓�</t-tag
-      >
-      <t-tag
-        t-class="t-class-tag"
-        max-width="{{130}}"
-        shape="square"
-        size="medium"
-        theme="default"
-        variant="light"
-        >{{item.district}}</t-tag
-      >
-      <t-tag
-        t-class="t-class-tag"
-        max-width="{{130}}"
-        shape="square"
-        size="medium"
-        theme="default"
-        variant="light"
-        >{{item.sceneType}}</t-tag
-      >
+<view class="enterprise-info__wrap">
+  <view class="enterprise-info__top" bind:tap="handCellClick">
+    <view slot="image" class="enterprise-info__img">
+      <view class="enterprise-info__img__score"> {{item.score}} </view>
+      <view class="enterprise-info__img__text"> 鑷瘎 </view>
+      <t-tag max-width="{{130}}" shape="square" size="small" theme="default" variant="light-outline">{{item.updateTime}}
+      </t-tag>
+    </view>
+    <view class="enterprise-info__main">
+      <view slot="title" class="enterprise-info__title"> {{item.name}} </view>
+      <t-divider />
+      <view slot="description" class="enterprise-info__tag">
+        <t-tag max-width="{{130}}" shape="square" size="small" theme="success" variant="light-outline" disabled>杩愯惀涓�
+        </t-tag>
+        <t-tag t-class="t-class-tag" max-width="{{130}}" shape="square" size="medium" theme="default" variant="light">
+          {{item.district}}</t-tag>
+        <t-tag t-class="t-class-tag" max-width="{{130}}" shape="square" size="medium" theme="default" variant="light">
+          {{item.sceneType}}</t-tag>
+      </view>
     </view>
   </view>
-</view>
+  <slot></slot>
+</view>
\ No newline at end of file
diff --git a/components/enterprise-rank-result/index.wxss b/components/enterprise-rank-result/index.wxss
index c4ea8a7..1fb9f14 100644
--- a/components/enterprise-rank-result/index.wxss
+++ b/components/enterprise-rank-result/index.wxss
@@ -5,13 +5,16 @@
   box-shadow: var(--td-shadow-4);
   padding: var(--td-spacer-1);
   margin-top: var(--td-spacer);
-  display: flex;
 }
 
-.enterprise-info__wrap:active {
+.enterprise-info__top:active {
   background-color: var(--td-gray-color-1);
 }
 
+.enterprise-info__top {
+  display: flex;
+}
+
 .enterprise-info__img {
   display: block;
 }
diff --git a/components/filter/index.wxml b/components/filter/index.wxml
index 94d15a8..21b04a6 100644
--- a/components/filter/index.wxml
+++ b/components/filter/index.wxml
@@ -1,6 +1,6 @@
 <import src="/behaviors/picker/template-selector.wxml" />
 
-<t-sticky>
+<!-- <t-sticky> -->
   <view class="filter-wrap">
     <view class="filter-item" bind:tap="handleSort">
       <text style="color: {{sorts !== '' ? color : '' }}">璇勫垎</text>
@@ -33,7 +33,7 @@
   <view class="filter-wrap-2">
     <include src="/behaviors/picker/scene/template-scene.wxml" />
   </view>
-</t-sticky>
+<!-- </t-sticky> -->
 
 <include src="/behaviors/picker/time/template-time.wxml" />
 <!-- 绛涢�夊脊妗� -->
diff --git a/components/gallery/index.js b/components/gallery/index.js
index 4597a51..e3b2f7c 100644
--- a/components/gallery/index.js
+++ b/components/gallery/index.js
@@ -55,6 +55,11 @@
     extClass: {
       type: String,
       value: ''
+    },
+    // 鏄惁搴曢儴绌哄嚭瀹夊叏璺濈
+    safeBottom :{
+      type: Boolean,
+      value: true
     }
   },
   data: {
diff --git a/components/gallery/index.wxml b/components/gallery/index.wxml
index 1d74a1f..b259d4f 100644
--- a/components/gallery/index.wxml
+++ b/components/gallery/index.wxml
@@ -1,6 +1,6 @@
 <!--component/mygallery/mygallery.wxml-->
 <page-container show="{{show}}">
-  <view class="fyui-gallery {{show ? 'fyui-gallery_show' : ''}} {{extClass}}">
+  <view class="fyui-gallery {{show ? 'fyui-gallery_show' : ''}} {{extClass}} {{safeBottom ? 'safe-bottom' : ''}}">
     <t-icon wx:if="{{showRemark}}" class="fyui-gallery__close" name="close" color="white" size="26" bindtap="hideGallery"></t-icon>
     <view class="fyui-gallery__info" wx:if="{{true}}">{{current+1}} / {{currentImgs.length}}</view>
     <swiper class="fyui-gallery__img__wrp" bindtap="toggle" indicator-dots="{{false}}" bindanimationfinish="change" current="{{current}}" autoplay="{{false}}" duration="{{500}}">
diff --git a/components/gallery/index.wxss b/components/gallery/index.wxss
index 5b1635a..8dfe294 100644
--- a/components/gallery/index.wxss
+++ b/components/gallery/index.wxss
@@ -18,6 +18,10 @@
   flex-wrap: nowrap
 }
 
+.safe-bottom {
+  bottom: calc(env(safe-area-inset-bottom) + 96rpx);
+}
+
 .fyui-gallery_show {
   display: flex
 }
diff --git a/components/picker/location-picker/index.wxml b/components/picker/location-picker/index.wxml
index 56b2b4b..d1f9ac3 100644
--- a/components/picker/location-picker/index.wxml
+++ b/components/picker/location-picker/index.wxml
@@ -46,7 +46,7 @@
       data-key="province"
       bindtap="showCascader"
     >
-      <text>{{_.defaultSelectOption(provinceText)}}</text>
+      <text class="picker-selector__text">{{_.defaultSelectOption(provinceText)}}</text>
       <t-icon name="caret-down-small" size="36rpx" color="{{color}}" />
     </view>
     <view
diff --git a/components/picker/location-picker/index.wxss b/components/picker/location-picker/index.wxss
index d22fd52..98b88ef 100644
--- a/components/picker/location-picker/index.wxss
+++ b/components/picker/location-picker/index.wxss
@@ -15,7 +15,7 @@
   color: rgba(51, 51, 51, 1);
 }
 
-.picker-selector>text {
+.picker-selector .picker-selector__text {
   white-space: nowrap;
   text-overflow: ellipsis;
   overflow: hidden;
diff --git a/config/index.js b/config/index.js
index 4551236..f3d8c5e 100644
--- a/config/index.js
+++ b/config/index.js
@@ -1,6 +1,6 @@
 // 瀹堟硶鑷姪灏忕▼搴�
-const baseUrl = 'http://192.168.0.103:8082';
-// const baseUrl = 'https://fyami.com.cn';
+// const baseUrl = 'http://192.168.0.103:8082';
+const baseUrl = 'https://fyami.com.cn';
 
 // 瀹堟硶鑷姪灏忕▼搴忓浘鐗�
 const bu = 'https://fyami.com.cn';
diff --git a/model/ledger/ledgerSummary.js b/model/ledger/ledgerSummary.js
index d15d07e..e4f669a 100644
--- a/model/ledger/ledgerSummary.js
+++ b/model/ledger/ledgerSummary.js
@@ -44,6 +44,7 @@
       m.upload++;
     }
     m.children.push({
+      subTypeId: s.ledgerSubTypeId,
       name: s.ledgerName,
       icon: s.iconUrl,
       upload: s.upLoad,
diff --git a/pages/enterprise/detail/components/ledger-stat/index.js b/pages/enterprise/detail/components/ledger-stat/index.js
index d6ef077..0dca41f 100644
--- a/pages/enterprise/detail/components/ledger-stat/index.js
+++ b/pages/enterprise/detail/components/ledger-stat/index.js
@@ -47,8 +47,13 @@
         });
       }
     },
+    // 鍙充笂瑙掓寜閽偣鍑讳簨浠�
     noteClick() {
       this.triggerEvent('noteClick');
     },
+    // 鍏蜂綋鏌愪釜鍙拌处鐐瑰嚮浜嬩欢
+    ledgerClick(e) {
+      this.triggerEvent('ledgerClick', e.currentTarget.dataset.ledger);
+    }
   },
 });
diff --git a/pages/enterprise/detail/components/ledger-stat/index.wxml b/pages/enterprise/detail/components/ledger-stat/index.wxml
index ed5d861..84c3cee 100644
--- a/pages/enterprise/detail/components/ledger-stat/index.wxml
+++ b/pages/enterprise/detail/components/ledger-stat/index.wxml
@@ -67,6 +67,8 @@
               >
                 <view
                   class="enterprise-info__ledger-wrap {{(child.upload || !child.needUpdate) ? 'enterprise-info__ledger-wrap__disable' : ''}}"
+                  data-ledger="{{child}}"
+                  bind:tap="ledgerClick"
                 >
                   <view class="enterprise-info__ledger-item__left">
                     <text
diff --git a/pages/enterprise/detail/index.js b/pages/enterprise/detail/index.js
index 5dcb3d8..a1202de 100644
--- a/pages/enterprise/detail/index.js
+++ b/pages/enterprise/detail/index.js
@@ -126,13 +126,21 @@
     }
   },
 
-  navToLedger(e) {
+  navToLedgerHistory(e) {
     const { mode } = e.currentTarget.dataset;
     wx.navigateTo({
       url: `/pages/enterprise/ledger/history/index?userId=${this.data.enterprise.id}&sceneTypeId=${this.data.enterprise.sceneTypeId}&time=${this.data.monthValue}&mode=${mode}`,
     });
   },
 
+  navToLedgerDetail(e) {
+    const ledger = e.detail;
+    console.log('navToLedgerDetail', ledger);
+    wx.navigateTo({
+      url: `/pages/enterprise/ledger/detail/index`,
+    });
+  },
+
   navToPromise() {
     // wx.navigateTo({
     //   url: `/pages/enterprise/promise/history/index?userId=${this.data.enterprise.id}`,
diff --git a/pages/enterprise/detail/index.wxml b/pages/enterprise/detail/index.wxml
index ffb0110..596d2bf 100644
--- a/pages/enterprise/detail/index.wxml
+++ b/pages/enterprise/detail/index.wxml
@@ -50,7 +50,8 @@
       loading="{{loadStatus == 1}}"
       value="{{selfCheckInfo}}"
       data-mode="1"
-      bind:noteClick="navToLedger"
+      bind:noteClick="navToLedgerHistory"
+      bind:ledgerClick="navToLedgerDetail"
     ></t-ledger-stat>
     <t-ledger-stat
       title="鍙拌处绠$悊"
@@ -58,7 +59,8 @@
       loading="{{loadStatus == 1}}"
       value="{{ledgerInfo}}"
       data-mode="2"
-      bind:noteClick="navToLedger"
+      bind:noteClick="navToLedgerHistory"
+      bind:ledgerClick="navToLedgerDetail"
     ></t-ledger-stat>
     <t-assessment-stat
       title="鑷祴鑷瘎"
diff --git a/pages/inspection/problems-proxy.js b/pages/inspection/problems-proxy.js
index 80fb2fa..c8fb781 100644
--- a/pages/inspection/problems-proxy.js
+++ b/pages/inspection/problems-proxy.js
@@ -25,7 +25,17 @@
         label: {
           show: true,
           position: 'inside',
-          formatter: '{d}%',
+          // formatter: '{d}%',
+          formatter: function (params) {
+            let perStr = params.percent + '';
+            if (perStr.indexOf('.') != -1) {
+              let percent = params.percent.toFixed(1); // 淇濈暀涓や綅灏忔暟
+              return `${percent}%`;
+            } else {
+              let percent = params.percent.toFixed(0);
+              return `${percent}%`;
+            }
+          },
         },
       },
     ],
@@ -94,7 +104,7 @@
     },
 
     summaryAnalysis(data) {
-      const {time, inspection: v} = this.data
+      const { time, inspection: v } = this.data;
       // 缁勫悎琛屾斂鍖哄垝
       let loc = '';
       loc += v.provinceName ? v.provinceName : '';
@@ -102,7 +112,7 @@
       loc += v.districtName ? `${v.districtName}` : '';
       loc += v.townName ? `${v.townName}` : '';
       // 鏃堕棿
-      const timeText = dayjs(time).format('YYYY骞碝M鏈�')
+      const timeText = dayjs(time).format('YYYY骞碝M鏈�');
 
       // 鎬荤粨
       let summaryText = '';
@@ -113,7 +123,9 @@
         totalC += p.changeCount;
       });
       const cPer = totalP == 0 ? '--' : Math.round((totalC / totalP) * 1000) / 10 + '%';
-      summaryText = `${loc+timeText}鍏卞彂鐜�${data.length}绉嶇被鍨嬮棶棰橈紝闂鎬昏${totalP}涓紝鏁存敼鐜�${cPer}`;
+      summaryText = `${loc + timeText}鍏卞彂鐜�${
+        data.length
+      }绉嶇被鍨嬮棶棰橈紝闂鎬昏${totalP}涓紝鏁存敼鐜�${cPer}`;
       this.setData({ summaryText });
     },
   },
diff --git a/pages/selfpatrol/components/patrol-record/index.js b/pages/selfpatrol/components/patrol-record/index.js
index 6a3a8ed..1cb0a5f 100644
--- a/pages/selfpatrol/components/patrol-record/index.js
+++ b/pages/selfpatrol/components/patrol-record/index.js
@@ -13,6 +13,14 @@
     },
     item: {
       type: Object,
+      observer(value) {
+        if (value.path1 && value.path1.length > 0) {
+          this.setData({
+            picPath: value.path1[0],
+            leftPic: value.path1.length - 1,
+          });
+        }
+      },
     },
   },
 
@@ -20,7 +28,7 @@
    * 缁勪欢鐨勫垵濮嬫暟鎹�
    */
   data: {
-    indexText: '01.'
+    indexText: '01.',
   },
 
   /**
diff --git a/pages/selfpatrol/components/patrol-record/index.wxml b/pages/selfpatrol/components/patrol-record/index.wxml
index 5cc815c..4cfc7e3 100644
--- a/pages/selfpatrol/components/patrol-record/index.wxml
+++ b/pages/selfpatrol/components/patrol-record/index.wxml
@@ -19,7 +19,7 @@
       <text slot="error">鏈彁浜�</text>
     </t-image>
     <block wx:else>
-      <t-image
+      <!-- <t-image
         wx:for="{{item.path1}}"
         wx:key="index"
         wx:for-item="urlItem"
@@ -30,7 +30,17 @@
         height="80rpx"
         shape="round"
         aria-label="{{item.ledgerName}}"
+      /> -->
+      <t-image
+        t-class="t-class-image"
+        src="{{picPath}}"
+        mode="aspectFill"
+        width="80rpx"
+        height="80rpx"
+        shape="round"
+        aria-label="{{item.ledgerName}}"
       />
+      <view wx:if="{{leftPic > 0}}" class="left-pic">+{{leftPic}}</view>
     </block>
   </view>
 </view>
diff --git a/pages/selfpatrol/components/patrol-record/index.wxss b/pages/selfpatrol/components/patrol-record/index.wxss
index 5869f1a..3f27550 100644
--- a/pages/selfpatrol/components/patrol-record/index.wxss
+++ b/pages/selfpatrol/components/patrol-record/index.wxss
@@ -16,7 +16,7 @@
   position: relative;
 }
 
-.patrol-unfinished::after {
+/* .patrol-unfinished::after {
   content: '';
   position: absolute;
   bottom: 0;
@@ -26,14 +26,14 @@
   border-right: var(--ei-triangle-border) solid var(--td-error-color-6);
   border-top: var(--ei-triangle-border) solid transparent;
   border-left: var(--ei-triangle-border) solid transparent;
-}
+} */
 
 .patrol-finished {
   position: relative;
   opacity: 0.7;
 }
 
-.patrol-finished::after {
+/* .patrol-finished::after {
   content: '';
   position: absolute;
   bottom: 0;
@@ -43,12 +43,14 @@
   border-right: var(--ei-triangle-border) solid var(--td-success-color-6);
   border-top: var(--ei-triangle-border) solid transparent;
   border-left: var(--ei-triangle-border) solid transparent;
-}
+} */
 
 .patrol-record-text-wrap {
   width: 50%;
   display: flex;
   gap: 4px;
+  align-items: baseline;
+  flex: 1;
 }
 
 .patrol-record-img-wrap {
@@ -69,4 +71,18 @@
 .t-class-image {
   border: 1px solid rgba(0, 0, 0, 0.1);
   font-size: var(--td-font-size-s);
+}
+
+.left-pic {
+  position: absolute;
+  right: 4px;
+  bottom: 4px;
+  background-color: rgba(250, 250, 250, 0.705);
+  border: 1px solid rgba(0, 0, 0, 0.452);
+  border-radius: 6px;
+  font-size: 12px;
+  line-height: 12px;
+  width: 14px;
+  height: 14px;
+  padding: 2px;
 }
\ No newline at end of file
diff --git a/pages/selfpatrol/publish/index.wxml b/pages/selfpatrol/publish/index.wxml
index 85125d8..ad00b2f 100644
--- a/pages/selfpatrol/publish/index.wxml
+++ b/pages/selfpatrol/publish/index.wxml
@@ -140,7 +140,7 @@
         size="extra-small"
         bindtap="onSelfPatrolPickerChange"
       >
-        <!-- {{selectedPatrolTypes[patrolPopupIndex].selectedCount > 0 ? '(' + selectedPatrolTypes[patrolPopupIndex].selectedCount + ')' : ''}} -->
+        {{selectedPatrolTypes[patrolPopupIndex].selectedCount > 0 ? '(' + selectedPatrolTypes[patrolPopupIndex].selectedCount + ')' : ''}}
         纭畾
       </t-button>
     </view>
diff --git a/pages/supervision/index.js b/pages/supervision/index.js
index 5cb0c66..7ce8c53 100644
--- a/pages/supervision/index.js
+++ b/pages/supervision/index.js
@@ -1,11 +1,13 @@
 // pages/supervision/index.js
 import { useLoading } from '../../behaviors/loading';
+import { useTopic } from './topic-proxy.js';
+import { useRankResult } from './rank-result-proxy.js';
 import { fetchGradeList } from '../../services/enterprise/fetchAssessment';
 import { sceneTypeList } from '../../common/dataSceneTypes';
 import dayjs from 'dayjs';
 
 Page({
-  behaviors: [useLoading],
+  behaviors: [useLoading, useTopic, useRankResult],
   /**
    * 椤甸潰鐨勫垵濮嬫暟鎹�
    */
@@ -49,21 +51,16 @@
   init() {
     this.optionsCount++;
     // 鍖呮嫭鏃堕棿銆佸満鏅被鍨嬨�佸尯鍩熶笁涓�夐」锛屽叏閮ㄨ幏鍙栧垵濮嬪�煎悗锛屾墽琛屽姞杞�
-    if (this.optionsCount == 3) this._startLoad();
+    if (this.optionsCount == 3) {
+      // 鍒濆鍖栦笓棰樼鐞嗙殑閫夐」
+      this.initselectedTopics();
+      this._startLoad();
+    }
   },
 
   _fetchData(page) {
-    let {
-      province,
-      city,
-      district,
-      town,
-      area,
-      management,
-      sorts,
-      sceneType,
-      period,
-    } = this.data.searchOptions;
+    let { province, city, district, town, area, management, sorts, sceneType, period } =
+      this.data.searchOptions;
     return fetchGradeList({
       page,
       data: {
@@ -78,10 +75,12 @@
         sceneTypes: [sceneType],
       },
     }).then(res => {
+      const startIndex = page == 1 ? 0 : this.data.searchResult.length
       this.setData({
-        searchResult:
-          page == 1 ? res.data : this.data.searchResult.concat(res.data),
+        searchResult: page == 1 ? res.data : this.data.searchResult.concat(res.data),
       });
+      // 鑾峰彇涓撻鐩稿叧鐨勫彴璐︿俊鎭�
+      this.fetchTopicLedgers(startIndex);
       return res.head;
     });
   },
@@ -100,8 +99,10 @@
     const { timeValue } = e.detail;
     const p = dayjs(timeValue);
     const period = `${p.year()}/${p.month() + 1}-${p.month() + 1}`;
+    const time = p.format('YYYY-MM-DD');
     this.setData({
       ['searchOptions.period']: period,
+      ['searchOptions.time']: time,
     });
   },
   initTime(e) {
@@ -126,6 +127,8 @@
   },
   handleScenePickerChange(e) {
     this.setSceneValue(e);
+    // 鍒濆鍖栦笓棰樼鐞嗙殑閫夐」
+    this.initselectedTopics();
     this._startLoad();
   },
 
@@ -144,14 +147,7 @@
 
   setPopupValue(e) {
     const { searchOptions } = this.data;
-    const {
-      provinceText,
-      cityText,
-      districtText,
-      townText,
-      areaText,
-      managementText,
-    } = e.detail;
+    const { provinceText, cityText, districtText, townText, areaText, managementText } = e.detail;
     searchOptions.province = provinceText;
     searchOptions.city = cityText;
     searchOptions.district = districtText;
diff --git a/pages/supervision/index.json b/pages/supervision/index.json
index 13b9335..c367989 100644
--- a/pages/supervision/index.json
+++ b/pages/supervision/index.json
@@ -10,6 +10,8 @@
     "load-more": "/components/load-more/index",
     "t-empty-page": "/components/empty-page/index",
     "enterprise-rank-result": "/components/enterprise-rank-result/index",
-    "scene-picker": "/components/scene-picker/index"
+    "scene-picker": "/components/scene-picker/index",
+    "patrol-record": "../selfpatrol/components/patrol-record/index",
+    "my-gallery": "/components/gallery/index"
   }
 }
\ No newline at end of file
diff --git a/pages/supervision/index.wxml b/pages/supervision/index.wxml
index 0d3d56f..f5ac3d0 100644
--- a/pages/supervision/index.wxml
+++ b/pages/supervision/index.wxml
@@ -5,40 +5,25 @@
     <view class="supervision-search" bind:tap="navToSearchPage">
       <t-search placeholder="{{placeholder}}" leftIcon="search" disabled> </t-search>
     </view>
-    <filter
-      sceneMode="{{1}}"
-      bind:sortsChange="handleSortsChange"
-      bind:timeInitValue="initTime"
-      bind:timePickerChange="handleTimePickerChange"
-      bind:sceneInitValue="initScene"
-      bind:scenePickerChange="handleScenePickerChange"
-      bind:showFilterPopup="showFilterPopup"
-    >
-      <filter-popup-2
-        slot="filterPopup"
-        show="{{show}}"
-        bind:showFilterPopupClose="showFilterPopupClose"
-        bind:initValue="initPopup"
-        bind:reset="onPopupSearch"
-        bind:confirm="onPopupSearch"
-      >
-      </filter-popup-2>
-    </filter>
+    <t-sticky>
+      <filter sceneMode="{{1}}" bind:sortsChange="handleSortsChange" bind:timeInitValue="initTime"
+        bind:timePickerChange="handleTimePickerChange" bind:sceneInitValue="initScene"
+        bind:scenePickerChange="handleScenePickerChange" bind:showFilterPopup="showFilterPopup">
+        <filter-popup-2 slot="filterPopup" show="{{show}}" bind:showFilterPopupClose="showFilterPopupClose"
+          bind:initValue="initPopup" bind:reset="onPopupSearch" bind:confirm="onPopupSearch">
+        </filter-popup-2>
+      </filter>
+      <include src="./topic.wxml" />
+    </t-sticky>
   </view>
 
   <view class="page-container">
     <template is="pulldown-loading" wx:if="{{pageLoading && searchResult.length != 0}}" />
     <block wx:if="{{searchResult.length > 0}}">
-      <enterprise-rank-result
-        wx:for="{{searchResult}}"
-        wx:key="index"
-        wx:for-index="index"
-        result="{{item}}"
-        bind:click="handCellClick"
-      ></enterprise-rank-result>
+      <include src="./rank-result.wxml" />
     </block>
     <t-empty-page wx:elif="{{!pageLoading}}" description="鏃犺嚜璇勮褰�" />
     <load-more list-is-empty="{{!searchResult.length}}" status="{{loadStatus}}" bind:retry="_startLoad" />
   </view>
   <view class="page-footer"></view>
-</view>
+</view>
\ No newline at end of file
diff --git a/pages/supervision/index.wxss b/pages/supervision/index.wxss
index 80a870c..2d25412 100644
--- a/pages/supervision/index.wxss
+++ b/pages/supervision/index.wxss
@@ -1,4 +1,7 @@
 /* pages/supervision/index.wxss */
+@import './topic.wxss';
+@import './rank-result.wxss';
+
 .page .page-header {
   /* background: linear-gradient(var(--td-primary-color-7), var(--td-primary-color-4));
   min-height: 380rpx;
@@ -13,6 +16,13 @@
   padding-top: 1px;
 }
 
+.supervision__loading{
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  height: 50rpx;
+}
+
 .fy-loading {
   text-align: center;
   background-color: transparent;
diff --git a/pages/supervision/rank-result-proxy.js b/pages/supervision/rank-result-proxy.js
new file mode 100644
index 0000000..988e0ae
--- /dev/null
+++ b/pages/supervision/rank-result-proxy.js
@@ -0,0 +1,25 @@
+/**
+ * 鎺掑悕鍒楄〃
+ */
+export const useRankResult = Behavior({
+  data: {},
+  methods: {
+    ledgerClick() {},
+    previewImage(e) {
+      const { index1, index2 } = e.currentTarget.dataset;
+      const ledger = this.data.searchResult[index1].topics[index2].detail;
+      if (ledger.ledgerFinished) {
+        const previewTitle = ledger.ledgerName;
+        const previewRemark = ledger.remark1;
+        const previewImageUrls = ledger.path1;
+        this.setData({
+          previewImageUrls,
+          previewRemark,
+          previewTitle,
+          previewCurrent: 0,
+          showPreview: true,
+        });
+      }
+    },
+  },
+});
diff --git a/pages/supervision/rank-result.wxml b/pages/supervision/rank-result.wxml
new file mode 100644
index 0000000..cbef2c3
--- /dev/null
+++ b/pages/supervision/rank-result.wxml
@@ -0,0 +1,48 @@
+<wxs src="../enterprise/detail/components/utils.wxs" module="_" />
+
+<enterprise-rank-result wx:for="{{searchResult}}" wx:key="index" wx:for-index="index" result="{{item}}"
+ bind:click="handCellClick">
+ <view wx:if="{{item.topicLoading}}" class="supervision__loading">
+  <t-loading theme="dots" size="50rpx" />
+ </view>
+ <block wx:elif="{{item.topics.length > 0}}">
+  <t-divider />
+  <!-- <view wx:for="{{item.topics}}" wx:key="index2" wx:for-item="item2" wx:for-index="index2">
+   {{item2.ledgerName}}
+  </view> -->
+  <t-collapse default-expand-all>
+   <t-collapse-panel header="鍙拌处涓婁紶鎯呭喌" value="0" t-class-header="t-class-collapse-panel-header"
+    t-class-content="t-class-collapse-panel-content" expandIcon
+    style="--td-cell-title-color: var(--td-text-color-primary)">
+    <view slot="content">
+     <block wx:for="{{item.topics}}" wx:for-index="index2" wx:key="index2" wx:for-item="item2">
+      <!-- <view
+       class="enterprise-info__ledger-wrap {{(item2.upload || !item2.needUpdate) ? 'enterprise-info__ledger-wrap__disable' : ''}}"
+       data-ledger="{{item2}}" bind:tap="ledgerClick"> -->
+
+      <patrol-record item="{{item2.detail}}" index="{{index2}}" data-index1="{{index}}" data-index2="{{index2}}"
+       bindtap="previewImage">
+      </patrol-record>
+      <!-- <view class="enterprise-info__ledger-item__left">
+        <text style="color: {{item2.needUpdate ? ' var(--td-error-color);' : 'transparent;'}}">*</text>
+        {{item2.ledgerName}}
+       </view>
+       <view class="enterprise-info__ledger-item__right">
+        {{item2.upload ? '鉁�' : '鉁�'}}
+       </view>
+       <view class="enterprise-info__ledger-item__right">
+        {{item2.onTime ? '鍑嗘椂' : (item2.upload ? '瓒呮椂' : '-')}}
+       </view> -->
+      <!-- </view> -->
+
+      <t-divider />
+     </block>
+    </view>
+   </t-collapse-panel>
+  </t-collapse>
+ </block>
+</enterprise-rank-result>
+
+<my-gallery safeBottom="{{true}}" hide-on-click="{{true}}" show-delete="{{false}}" show="{{showPreview}}"
+ img-urls="{{previewImageUrls}}" current="{{previewCurrent}}" title="{{previewTitle}}" remark="{{previewRemark}}">
+</my-gallery>
\ No newline at end of file
diff --git a/pages/supervision/rank-result.wxss b/pages/supervision/rank-result.wxss
new file mode 100644
index 0000000..c71d8cd
--- /dev/null
+++ b/pages/supervision/rank-result.wxss
@@ -0,0 +1,43 @@
+.enterprise-info__ledger-wrap {
+ display: flex;
+ /* color: var(--td-error-color); */
+ font-size: var(--td-font-size-base);
+}
+
+.enterprise-info__ledger-wrap__disable {
+ color: var(--td-text-color-disabled);
+}
+
+.enterprise-info__ledger-wrap__header {
+ color: var(--td-text-color-secondary);
+ /* border-bottom: 1rpx solid var(--td-gray-color-1); */
+ margin-bottom: var(--td-spacer);
+}
+
+.enterprise-info__ledger-wrap .enterprise-info__ledger-item__left,
+.enterprise-info__ledger-item__right {
+ display: flex;
+ align-items: center;
+ margin-right: 2px;
+ flex: 3;
+}
+
+.enterprise-info__ledger-item__right {
+ justify-content: center;
+ flex: 1;
+}
+
+.t-class-divider {
+ margin: 0 !important;
+}
+
+.t-class-collapse-panel-header {
+ padding: 0 !important;
+ padding-top: var(--td-spacer) !important;
+ padding-bottom: var(--td-spacer) !important;
+ /* font-weight: 600 !important; */
+}
+
+.t-class-collapse-panel-content {
+ padding: 0 !important;
+}
\ No newline at end of file
diff --git a/pages/supervision/topic-proxy.js b/pages/supervision/topic-proxy.js
new file mode 100644
index 0000000..a43408e
--- /dev/null
+++ b/pages/supervision/topic-proxy.js
@@ -0,0 +1,241 @@
+import { fetchLedgerType } from '../../services/enterprise/fetchLedger';
+import { fetchLedgerDetail } from '../../services/enterprise/fetchLedger';
+import { toLabel } from '../../common/dataSceneTypes';
+
+/**
+ * 鍙拌处涓撻绠$悊
+ */
+export const useTopic = Behavior({
+  data: {
+    // 涓撻閫夋嫨寮瑰嚭妗�
+    popupVisible: false,
+    // 鎸夊満鏅被鍨嬪垎绫荤殑鍙拌处閫夋嫨鎯呭喌
+    selectedTopics: {},
+    // 涓撻瀵瑰簲鐨勫彴璐︿俊鎭姞杞界姸鎬�
+    topicLoading: false,
+  },
+  methods: {
+    /**
+     * 鍒濆鍖栧綋鍓嶅満鏅被鍨嬩笅鐨勫彲閫夊彴璐﹂�夐」锛�
+     * 鍒濆鍖栭粯璁ら�夋嫨鐨勪笓棰橈紙鍙拌处绫诲瀷锛夛紝
+     * @param {Function} callback 鍙�夌殑鍥炶皟鍑芥暟
+     */
+    initselectedTopics(callback) {
+      const { selectedTopics } = this.data;
+      const { sceneType } = this.data.searchOptions;
+      if (selectedTopics[sceneType] == undefined || selectedTopics[sceneType].length == 0) {
+        fetchLedgerType({ sceneType: parseInt(sceneType) }).then(res => {
+          // 閫夋嫨鍓嶄笁涓彴璐︿负榛樿涓撻
+          let count = 3;
+          for (let i = 0; i < 3; i++) {
+            if (i >= res.length) break;
+            res[i].selected = {
+              color: 'green',
+              count: '鉁�',
+              shape: 'square',
+            };
+          }
+          selectedTopics[sceneType] = {
+            sceneType,
+            sceneTypeText: toLabel(sceneType),
+            topicText: '璇烽�夋嫨涓撻',
+            allLedgerTypes: res,
+            selectedLedgers: [],
+            checkAll: false,
+            selectedCount: 0,
+          };
+          this.setData({ selectedTopics });
+          this.refreshSelectedLedger();
+          if (typeof callback === 'function') {
+            callback();
+          }
+        });
+      } else {
+        if (typeof callback === 'function') {
+          callback();
+        }
+      }
+    },
+    // 鏄剧ず寮瑰嚭妗�
+    showPopUp() {
+      this.initselectedTopics(() => this.setData({ popupVisible: true }));
+    },
+    // 鐩戝惉寮瑰嚭妗嗙姸鎬佸彉鍖栵紝渚嬪閫氳繃鐐瑰嚮澶栭儴閬僵灞傚叧闂脊鍑烘鏃�
+    onPopupVisibleChange(e) {
+      const { visible } = e.detail;
+      this.setData({ popupVisible: visible });
+      if (!visible) {
+        this.closePatrolList();
+      }
+    },
+    // 鍙栨秷骞跺叧闂彴璐︾被鍒�夋嫨寮瑰嚭妗�
+    closePatrolList() {
+      const { selectedTopics } = this.data;
+      const { sceneType } = this.data.searchOptions;
+      const { allLedgerTypes, selectedLedgers } = selectedTopics[sceneType];
+      allLedgerTypes.forEach(p => {
+        if (selectedLedgers.indexOf(p.ledgerSubTypeId) == -1) {
+          p.selected = false;
+        } else {
+          p.selected = {
+            color: 'green',
+            count: '鉁�',
+            shape: 'square',
+          };
+        }
+      });
+      this.setData({
+        [`selectedTopics.${sceneType}.allLedgerTypes`]: allLedgerTypes,
+        popupVisible: false,
+      });
+      this._isCheckAll();
+    },
+    // 閫夋嫨鍙拌处绫诲埆
+    choseLedgerType(e) {
+      const { index } = e.currentTarget.dataset;
+      const { selectedTopics } = this.data;
+      const { sceneType } = this.data.searchOptions;
+      const { allLedgerTypes, selectedLedgers } = selectedTopics[sceneType];
+      let { selected, ledgerSubTypeId } = allLedgerTypes[index];
+      if (selected) {
+        selected = null;
+      } else {
+        selected = {
+          color: 'green',
+          count: '鉁�',
+          shape: 'square',
+        };
+      }
+      this.setData({
+        [`selectedTopics.${sceneType}.allLedgerTypes[${index}].selected`]: selected,
+      });
+      this._isCheckAll();
+    },
+    // 鍏ㄩ��
+    onCheckAll(e) {
+      const { checked } = e.detail;
+      const { selectedTopics } = this.data;
+      const { sceneType } = this.data.searchOptions;
+      const { allLedgerTypes } = selectedTopics[sceneType];
+      allLedgerTypes.forEach(p => {
+        if (checked) {
+          p.selected = {
+            color: 'green',
+            count: '鉁�',
+            shape: 'square',
+          };
+        } else {
+          p.selected = null;
+        }
+      });
+      this.setData({ [`selectedTopics.${sceneType}.allLedgerTypes`]: allLedgerTypes });
+      this._isCheckAll();
+    },
+    /**
+     * 鍏ㄩ�夊垽鏂�
+     * 鏍规嵁鐢ㄦ埛閫夋嫨鐨勬儏鍐碉紝鍒ゆ柇鏄惁宸茬粡鍏ㄩ�夛紝鏇存柊鍏ㄩ�夊彉閲忕姸鎬�
+     */
+    _isCheckAll() {
+      const { selectedTopics } = this.data;
+      const { sceneType } = this.data.searchOptions;
+      const { allLedgerTypes } = selectedTopics[sceneType];
+      // 鍒ゆ柇鏄惁鍏ㄩ�変腑
+      const p = allLedgerTypes.filter(v => {
+        return v.selected == undefined || v.selected == null || v.selected == false;
+      });
+      this.setData({
+        [`selectedTopics.${sceneType}.selectedCount`]: allLedgerTypes.length - p.length,
+        [`selectedTopics.${sceneType}.checkAll`]: p.length == 0,
+      });
+    },
+    // 鍒锋柊閫夋嫨缁撴灉
+    refreshSelectedLedger() {
+      const { selectedTopics } = this.data;
+      const { sceneType } = this.data.searchOptions;
+      const { allLedgerTypes, selectedLedgers } = selectedTopics[sceneType];
+      let topicText = '';
+      allLedgerTypes.forEach(p => {
+        const i = selectedLedgers.indexOf(p.ledgerSubTypeId);
+        if (p.selected) {
+          if (i == -1) {
+            selectedLedgers.push(p.ledgerSubTypeId);
+          }
+          if (topicText != '') {
+            topicText += '銆�';
+          }
+          topicText += p.ledgerName;
+        } else {
+          if (i != -1) {
+            selectedLedgers.splice(i, 1);
+          }
+        }
+      });
+      if (topicText == '') {
+        topicText = '鐐瑰嚮閫夋嫨';
+      } else if (selectedLedgers.length == allLedgerTypes.length) {
+        topicText = '宸查�夊叏閮ㄧ被鍒�';
+      } else if (topicText.length > 9) {
+        topicText = topicText.substring(0, 10);
+        topicText += `...绛�${selectedLedgers.length}涓被鍒玚;
+      }
+      this.setData({
+        [`selectedTopics.${sceneType}.selectedLedgers`]: selectedLedgers,
+        [`selectedTopics.${sceneType}.topicText`]: topicText,
+      });
+    },
+    /**
+     * 鍙拌处绫诲埆閫夋嫨浜嬩欢
+     * 鍦ㄧ敤鎴风偣鍑诲脊鍑烘鐨勨�滅‘瀹氣�濇寜閽悗锛屽皢[allLedgerTypes]閫変腑鐨勫彴璐︽洿鏂板埌[selectedLedgers]鍒楄〃涓紝
+     * 鍏抽棴寮瑰嚭妗嗭紝骞朵笖瑙﹀彂鑾峰彇鍙拌处淇℃伅鐨勫嚱鏁�
+     */
+    onLedgerPickerChange() {
+      this.refreshSelectedLedger();
+      this.setData({ popupVisible: false });
+      this.fetchTopicLedgers();
+    },
+    /**
+     * 鑾峰彇涓撻鐩稿叧鐨勫彴璐︿俊鎭�
+     * @param {Int} startIndex 闇�瑕佽幏鍙栧彴璐︿俊鎭殑璧峰绱㈠紩
+     */
+    fetchTopicLedgers(startIndex) {
+      this.setData({ topicLoading: true });
+      // 纭畾鎵�閫夌殑鍙拌处绫诲瀷
+      const { selectedTopics } = this.data;
+      const { sceneType, time } = this.data.searchOptions;
+      const { allLedgerTypes, selectedLedgers } = selectedTopics[sceneType];
+      const _selectedLedgers = allLedgerTypes.filter(v => {
+        return selectedLedgers.indexOf(v.ledgerSubTypeId) != -1;
+      });
+
+      if (_selectedLedgers.length == 0) {
+        searchResult.forEach(e => {
+          e.topics = [];
+        });
+      } else {
+        const { searchResult } = this.data;
+        const alltask = [];
+        for (let i = startIndex ? startIndex : 0; i < searchResult.length; i++) {
+          const e = searchResult[i];
+          this.setData({ [`searchResult[${i}].topicLoading`]: true });
+          const t = fetchLedgerDetail({ userId: e.userId, sceneType, time }).then(res => {
+            const topics = [];
+            _selectedLedgers.forEach(l => {
+              const ledger = res.data.find(r => r.ledgerSubTypeId == l.ledgerSubTypeId);
+              const detail = ledger ? ledger : { ledgerName: l.ledgerName };
+              topics.push({ ...l, detail });
+            });
+            this.setData({
+              [`searchResult[${i}].topicLoading`]: false,
+              [`searchResult[${i}].topics`]: topics,
+            });
+          });
+          alltask.push(t);
+        }
+        Promise.all(alltask).finally(() => {
+          this.setData({ topicLoading: false });
+          console.log('searchResult', this.data.searchResult);
+        });
+      }
+    },
+  },
+});
diff --git a/pages/supervision/topic.wxml b/pages/supervision/topic.wxml
new file mode 100644
index 0000000..6e77dee
--- /dev/null
+++ b/pages/supervision/topic.wxml
@@ -0,0 +1,29 @@
+<view bind:tap="showPopUp" class='topic-text'>
+  <text>涓撻绠$悊锛歿{selectedTopics[searchOptions.sceneType].topicText}}</text>
+  <t-icon name="caret-down-small" size="36rpx" color="black'" />
+</view>
+
+<t-popup visible="{{popupVisible}}" bind:visible-change="onPopupVisibleChange" placement="bottom">
+  <view class="popup-btn-group">
+    <t-button block="{{false}}" t-class="t-class-button" theme="default" size="extra-small" bindtap="closePatrolList">鍙栨秷
+    </t-button>
+    <view style="display: flex; align-items: center">
+      <t-checkbox t-class="t-class-checkbox" t-class-border="t-class-border-checkbox"
+        t-class-content="t-class-content-checkbox" t-class-label="t-class-label-checkbox" placement="right" borderless
+        icon="rectangle" block="{{true}}" label="鍏ㄩ��" checked="{{selectedTopics[searchOptions.sceneType].checkAll}}"
+        bind:change="onCheckAll" />
+      <t-button block="{{false}}" t-class="t-class-button" theme="primary" size="extra-small"
+        bindtap="onLedgerPickerChange">
+        {{selectedTopics[searchOptions.sceneType].selectedCount > 0 ? '(' + selectedTopics[searchOptions.sceneType].selectedCount + ')' : ''}}
+        纭畾
+      </t-button>
+    </view>
+  </view>
+  <scroll-view style="height: 70vh" scroll-y="{{true}}">
+    <t-grid column="{{4}}" theme="card">
+      <t-grid-item wx:for="{{selectedTopics[searchOptions.sceneType].allLedgerTypes}}" wx:key="index"
+        class="{{item.selected ? 'patrol-task-item-selected' : 'patrol-task-item'}}" badge-props="{{ item.selected }}"
+        text="{{item.ledgerName}}" image="{{item.iconUrl}}" data-index="{{index}}" bindtap="choseLedgerType" />
+    </t-grid>
+  </scroll-view>
+</t-popup>
\ No newline at end of file
diff --git a/pages/supervision/topic.wxss b/pages/supervision/topic.wxss
new file mode 100644
index 0000000..39bb63d
--- /dev/null
+++ b/pages/supervision/topic.wxss
@@ -0,0 +1,33 @@
+.topic-text {
+ display: flex;
+ padding: 8px;
+ align-items: center;
+ color: rgba(51, 51, 51, 1);
+ background-color: #fff;
+}
+
+.popup-btn-group {
+ display: flex;
+ justify-content: space-between;
+ padding: 0 var(--td-spacer-2);
+ /* background-color: aqua; */
+ align-items: center;
+}
+
+.t-class-checkbox {
+ /* background-color: tomato !important; */
+ /* padding: initial !important; */
+ text-align: end;
+}
+
+.t-class-button {
+ margin: initial !important;
+}
+
+.patrol-task-item {
+ opacity: 0.5;
+}
+
+.patrol-task-item-selected {
+ opacity: 1;
+}
\ No newline at end of file
diff --git a/project.config.json b/project.config.json
index 77d5cdd..417ce2d 100644
--- a/project.config.json
+++ b/project.config.json
@@ -33,7 +33,13 @@
       "outputPath": ""
     },
     "condition": false,
-    "ignoreUploadUnusedFiles": true
+    "ignoreUploadUnusedFiles": true,
+    "compileWorklet": false,
+    "localPlugins": false,
+    "disableUseStrict": false,
+    "useCompilerPlugins": false,
+    "swc": false,
+    "disableSWC": true
   },
   "compileType": "miniprogram",
   "condition": {},
@@ -45,5 +51,7 @@
   "packOptions": {
     "ignore": [],
     "include": []
-  }
+  },
+  "libVersion": "3.15.0",
+  "simulatorPluginLibVersion": {}
 }
\ No newline at end of file
diff --git a/project.private.config.json b/project.private.config.json
index dee57ef..551518c 100644
--- a/project.private.config.json
+++ b/project.private.config.json
@@ -1,9 +1,24 @@
 {
   "description": "椤圭洰绉佹湁閰嶇疆鏂囦欢銆傛鏂囦欢涓殑鍐呭灏嗚鐩� project.config.json 涓殑鐩稿悓瀛楁銆傞」鐩殑鏀瑰姩浼樺厛鍚屾鍒版鏂囦欢涓�傝瑙佹枃妗o細https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
-  "projectname": "ep-law-abiding-manage-weixin",
+  "projectname": "ep-law-abiding-manage",
   "setting": {
     "compileHotReLoad": true,
-    "urlCheck": true
+    "urlCheck": true,
+    "coverView": true,
+    "lazyloadPlaceholderEnable": false,
+    "skylineRenderEnable": false,
+    "preloadBackgroundData": false,
+    "autoAudits": false,
+    "useApiHook": true,
+    "showShadowRootInWxmlPanel": true,
+    "useStaticServer": false,
+    "useLanDebug": false,
+    "showES6CompileOption": false,
+    "checkInvalidKey": true,
+    "ignoreDevUnusedFiles": true,
+    "bigPackageSizeSupport": false,
+    "useIsolateContext": true
   },
-  "libVersion": "3.11.2"
+  "libVersion": "3.15.0",
+  "condition": {}
 }
\ No newline at end of file
diff --git a/services/config/fetchConfig.js b/services/config/fetchConfig.js
index cf2b0a4..88c3096 100644
--- a/services/config/fetchConfig.js
+++ b/services/config/fetchConfig.js
@@ -41,4 +41,20 @@
   });
 }
 
-export { fetchSceneTypes, fetchUserConfig };
+/**
+ * 鑾峰彇鐢ㄦ埛鐨勪笟鍔″睘鎬ч厤缃俊鎭紙渚嬪鍙拌处涓婃姤鏃ユ湡锛岃嚜宸℃煡鏄惁闇�瑕佹壙璇虹瓑锛�
+ */
+function fetchUserSetting({ userId }) {
+  return get({
+    url: `/config/user/setting`,
+    params: {
+      userId: userId,
+    },
+  }).then(res => {
+    if (res.data.success) {
+      app.globalData.userSetting = res.data.data;
+    }
+  });
+}
+
+export { fetchSceneTypes, fetchUserConfig, fetchUserSetting };

--
Gitblit v1.9.3