From 2082dea4977d47618c8d7ad4dd9bb847f5cf1b17 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 28 四月 2026 09:47:14 +0800
Subject: [PATCH] 升级apppro 1.迁移档案管理功能

---
 src/api/fileManagement/statistics.js      |   75 ++
 src/api/fileManagement/borrow.js          |   47 +
 src/pages.json                            |   28 
 src/pages/fileManagement/borrow/index.vue |  262 ++++++++
 src/pages/fileManagement/borrow/edit.vue  |  333 +++++++++++
 src/pages/works.vue                       |   38 
 src/utils/versionUpgrade.js               |    6 
 src/api/fileManagement/return.js          |   61 ++
 src/pages/fileManagement/return/index.vue |  262 ++++++++
 src/api/fileManagement/document.js        |  189 ++++++
 src/api/fileManagement/bookshelf.js       |  129 ++++
 src/pages/fileManagement/return/edit.vue  |  313 ++++++++++
 12 files changed, 1,729 insertions(+), 14 deletions(-)

diff --git a/src/api/fileManagement/bookshelf.js b/src/api/fileManagement/bookshelf.js
new file mode 100644
index 0000000..eb3a88f
--- /dev/null
+++ b/src/api/fileManagement/bookshelf.js
@@ -0,0 +1,129 @@
+import request from "@/utils/request";
+
+/**
+ * 涔︽灦绠$悊鐩稿叧API鎺ュ彛
+ * 鍖呭惈浠撳簱绠$悊銆佽揣鏋剁鐞嗐�佸浘涔︾鐞嗙瓑鍔熻兘鐨勬帴鍙�
+ */
+
+/**
+ * 鑾峰彇浠撳簱鍒楄〃
+ * @description 鑾峰彇鎵�鏈変粨搴撶殑鍩烘湰淇℃伅鍒楄〃
+ * @returns {Promise} 杩斿洖浠撳簱鍒楄〃鏁版嵁
+ */
+export function getWarehouseList() {
+  return request({
+    url: "/warehouse/tree",
+    method: "get",
+  });
+}
+
+/**
+ * 鏂板浠撳簱
+ * @description 鍒涘缓鏂扮殑浠撳簱璁板綍
+ * @param {Object} data 浠撳簱淇℃伅瀵硅薄锛屽寘鍚粨搴撳悕绉扮瓑瀛楁
+ * @returns {Promise} 杩斿洖鏂板缁撴灉
+ */
+export function addWarehouse(data) {
+  return request({
+    url: "/warehouse/add",
+    method: "post",
+    data,
+  });
+}
+
+/**
+ * 鏇存柊浠撳簱淇℃伅
+ * @description 淇敼鐜版湁浠撳簱鐨勫熀鏈俊鎭�
+ * @param {Object} data 浠撳簱淇℃伅瀵硅薄锛屽繀椤诲寘鍚粨搴揑D
+ * @returns {Promise} 杩斿洖鏇存柊缁撴灉
+ */
+export function updateWarehouse(data) {
+  return request({
+    url: "/warehouse/update",
+    method: "put",
+    data,
+  });
+}
+
+/**
+ * 鍒犻櫎浠撳簱
+ * @description 鏍规嵁浠撳簱ID鍒犻櫎鎸囧畾鐨勪粨搴撹褰�
+ * @param {string|number} id 浠撳簱ID
+ * @returns {Promise} 杩斿洖鍒犻櫎缁撴灉
+ */
+export function deleteWarehouse(data) {
+  return request({
+    url: `/warehouse/delete/`,
+    method: "delete",
+    data,
+  });
+}
+
+/**
+ * 鑾峰彇璐ф灦鍒楄〃
+ * @description 鏍规嵁浠撳簱ID鑾峰彇璇ヤ粨搴撲笅鐨勬墍鏈夎揣鏋朵俊鎭�
+ * @param {string|number} warehouseId 浠撳簱ID
+ * @returns {Promise} 杩斿洖璐ф灦鍒楄〃鏁版嵁
+ */
+export function getShelfList(warehouseId) {
+  return request({
+    url: `/shelf/list/${warehouseId}`,
+    method: "get",
+  });
+}
+
+/**
+ * 鏂板璐ф灦
+ * @description 鍦ㄦ寚瀹氫粨搴撲笅鍒涘缓鏂扮殑璐ф灦璁板綍
+ * @param {Object} data 璐ф灦淇℃伅瀵硅薄锛屽寘鍚揣鏋跺悕绉般�佸眰鏁般�佸垪鏁扮瓑瀛楁
+ * @returns {Promise} 杩斿洖鏂板缁撴灉
+ */
+export function addShelf(data) {
+  return request({
+    url: "/warehouse/goodsShelves/add",
+    method: "post",
+    data,
+  });
+}
+
+/**
+ * 鏇存柊璐ф灦淇℃伅
+ * @description 淇敼鐜版湁璐ф灦鐨勫熀鏈俊鎭�
+ * @param {Object} data 璐ф灦淇℃伅瀵硅薄锛屽繀椤诲寘鍚揣鏋禝D
+ * @returns {Promise} 杩斿洖鏇存柊缁撴灉
+ */
+export function updateShelf(data) {
+  return request({
+    url: "/warehouse/goodsShelves/update",
+    method: "put",
+    data,
+  });
+}
+
+/**
+ * 鍒犻櫎璐ф灦
+ * @description 鏍规嵁璐ф灦ID鍒犻櫎鎸囧畾鐨勮揣鏋惰褰曪紝鍚庣瑕佹眰浼犲叆 ID 鏁扮粍锛堟敮鎸佹壒閲忥級
+ * @param {Array<string|number>} data 璐ф灦ID鏁扮粍
+ * @returns {Promise} 杩斿洖鍒犻櫎缁撴灉
+ */
+export function deleteShelf(data) {
+  return request({
+    url: `/warehouse/goodsShelves/delete/`,
+    method: "delete",
+    data,
+  });
+}
+
+/**
+ * 鑾峰彇浠撳簱缁撴瀯
+ * @description 鑾峰彇鎸囧畾浠撳簱鐨勫畬鏁寸粨鏋勪俊鎭紝鍖呮嫭璐ф灦銆佸眰鏁般�佸垪鏁扮瓑
+ * @param {string|number} warehouseId 浠撳簱ID
+ * @returns {Promise} 杩斿洖浠撳簱鐨勫畬鏁寸粨鏋勬暟鎹�
+ */
+export function getWarehouseStructure(data) {
+  return request({
+    url: `/warehouse/goodsShelvesRowcol/list`,
+    method: "get",
+    params: data,
+  });
+}
diff --git a/src/api/fileManagement/borrow.js b/src/api/fileManagement/borrow.js
new file mode 100644
index 0000000..1f4c72c
--- /dev/null
+++ b/src/api/fileManagement/borrow.js
@@ -0,0 +1,47 @@
+import request from "@/utils/request";
+
+// 鏂囨。鍊熼槄绠$悊鐩稿叧鎺ュ彛
+
+// 鑾峰彇鏂囨。鍒楄〃锛堢敤浜庡�熼槄涔︾睄閫夋嫨锛�
+export function getDocumentList() {
+  return request({
+    url: "/documentation/list",
+    method: "get",
+  });
+}
+
+// 鍊熼槄鍒嗛〉鏌ヨ
+export function getBorrowList(params) {
+  return request({
+    url: "/documentationBorrowManagement/listPage",
+    method: "get",
+    params: params,
+  });
+}
+
+// 鏂板鍊熼槄
+export function addBorrow(data) {
+  return request({
+    url: "/documentationBorrowManagement/add",
+    method: "post",
+    data: data,
+  });
+}
+
+// 鏇存柊鍊熼槄
+export function updateBorrow(data) {
+  return request({
+    url: "/documentationBorrowManagement/update",
+    method: "put",
+    data: data,
+  });
+}
+
+// 鍒犻櫎鍊熼槄
+export function deleteBorrow(ids) {
+  return request({
+    url: "/documentationBorrowManagement/delete",
+    method: "delete",
+    data: ids,
+  });
+}
diff --git a/src/api/fileManagement/document.js b/src/api/fileManagement/document.js
new file mode 100644
index 0000000..f3d5f4f
--- /dev/null
+++ b/src/api/fileManagement/document.js
@@ -0,0 +1,189 @@
+import request from "@/utils/request";
+
+// 鑾峰彇鍒嗙被鏍�
+export function getCategoryTree() {
+  return request({
+    url: "/warehouse/documentClassification/getList",
+    method: "get",
+  });
+}
+
+// 鏂板鍒嗙被
+export function addCategory(data) {
+  return request({
+    url: "/warehouse/documentClassification/add",
+    method: "post",
+    data: {
+      category: data.category,
+      parentId: data.parentId,
+    },
+  });
+}
+
+// 淇敼鍒嗙被
+export function updateCategory(data) {
+  return request({
+    url: "/warehouse/documentClassification/update",
+    method: "put",
+    data: {
+      id: data.id,
+      category: data.category,
+    },
+  });
+}
+
+// 鍒犻櫎鍒嗙被
+export function deleteCategory(ids) {
+  return request({
+    url: "/warehouse/documentClassification/delete",
+    method: "delete",
+    data: ids,
+  });
+}
+
+// 鑾峰彇鏂囨。鍒楄〃锛堝垎椤碉級
+export function getDocumentList(query) {
+  return request({
+    url: "/documentation/listPage",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鏂板鏂囨。
+export function addDocument(data) {
+  return request({
+    url: "/documentation/add",
+    method: "post",
+    data: data,
+  });
+}
+
+// 淇敼鏂囨。
+export function updateDocument(data) {
+  return request({
+    url: "/documentation/update",
+    method: "put",
+    data: data,
+  });
+}
+
+// 鍒犻櫎鏂囨。
+export function deleteDocument(ids) {
+  return request({
+    url: "/documentation/delete",
+    method: "delete",
+    data: ids,
+  });
+}
+
+// 鑾峰彇鏂囨。璇︽儏
+export function getDocumentDetail(id) {
+  return request({
+    url: "/document/" + id,
+    method: "get",
+  });
+}
+
+// 鎼滅储鏂囨。
+export function searchDocument(query) {
+  return request({
+    url: "/document/search",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鑾峰彇浠撳簱缁撴瀯
+export function getWarehouseStructure() {
+  return request({
+    url: "/document/warehouse/structure",
+    method: "get",
+  });
+}
+
+// 闄勪欢绠$悊鐩稿叧鎺ュ彛
+// 娣诲姞闄勪欢
+export function addDocumentationFile(data) {
+  return request({
+    url: "/documentation/documentationFile/add",
+    method: "post",
+    data: data,
+  });
+}
+
+// 鑾峰彇闄勪欢鍒楄〃
+export function getDocumentationFileList(params) {
+  return request({
+    url: "/documentation/documentationFile/listPage",
+    method: "get",
+    params: params,
+  });
+}
+
+// 鍒犻櫎闄勪欢
+export function deleteDocumentationFile(ids) {
+  return request({
+    url: "/documentation/documentationFile/del",
+    method: "delete",
+    data: ids,
+  });
+}
+
+// 鏂囨。鍊熼槄绠$悊鐩稿叧鎺ュ彛
+export function getBorrowList(params) {
+  return request({
+    url: "/documentationBorrowManagement/listPage",
+    method: "get",
+    params: params,
+  });
+}
+
+export function addBorrow(data) {
+  return request({
+    url: "/documentationBorrowManagement/add",
+    method: "post",
+    data: data,
+  });
+}
+
+export function updateBorrow(data) {
+  return request({
+    url: "/documentationBorrowManagement/update",
+    method: "put",
+    data: data,
+  });
+}
+
+export function deleteBorrow(ids) {
+  return request({
+    url: "/documentationBorrowManagement/delete",
+    method: "delete",
+    data: ids,
+  });
+}
+
+// 缁熻鐩稿叧鎺ュ彛
+// 鑾峰彇鎬讳綋缁熻鏁版嵁
+export function getDocumentationOverview() {
+  return request({
+    url: "/documentation/overview",
+    method: "get",
+  });
+}
+
+// 鑾峰彇鍒嗙被缁熻鏁版嵁
+export function getDocumentationCategoryStats() {
+  return request({
+    url: "/documentation/category",
+    method: "get",
+  });
+}
+
+// 鑾峰彇鐘舵�佺粺璁℃暟鎹�
+export function getDocumentationStatusStats() {
+  return request({
+    url: "/documentation/status",
+    method: "get",
+  });
+}
diff --git a/src/api/fileManagement/return.js b/src/api/fileManagement/return.js
new file mode 100644
index 0000000..9021ac9
--- /dev/null
+++ b/src/api/fileManagement/return.js
@@ -0,0 +1,61 @@
+import request from "@/utils/request";
+
+// 鍒嗛〉鏌ヨ褰掕繕璁板綍
+export function getReturnListPage(query) {
+  return request({
+    url: "/documentationBorrowManagement/listPageReturn",
+    method: "get",
+    params: query,
+  });
+}
+
+// 褰掕繕鎿嶄綔
+export function returnDocument(data) {
+  return request({
+    url: "/documentationBorrowManagement/revent",
+    method: "put",
+    data: data,
+  });
+}
+
+// 鍒犻櫎褰掕繕璁板綍
+export function deleteReturn(ids) {
+  return request({
+    url: "/documentationBorrowManagement/reventDelete",
+    method: "delete",
+    data: ids,
+  });
+}
+//鏍规嵁涔︾睄id鏌ヨ鍊熼槄璁板綍
+export function getBorrowListByDocumentationId(id) {
+  return request({
+    url: "/documentationBorrowManagement/getByDocumentationId/"+id,
+    method: "get"
+  });
+}
+
+// 鏇存柊鍊熼槄璁板綍
+export function updateBorrow(data) {
+  return request({
+    url: "/documentationBorrowManagement/update",
+    method: "put",
+    data: data,
+  });
+}
+
+// 褰掕繕鏇存柊
+export function reventUpdate(data) {
+  return request({
+    url: "/documentationBorrowManagement/reventUpdate",
+    method: "put",
+    data: data,
+  });
+}
+
+// 鑾峰彇鏂囨。鍒楄〃
+export function getDocumentList() {
+  return request({
+    url: "/documentationBorrowManagement/list",
+    method: "get",
+  });
+}
diff --git a/src/api/fileManagement/statistics.js b/src/api/fileManagement/statistics.js
new file mode 100644
index 0000000..d77375c
--- /dev/null
+++ b/src/api/fileManagement/statistics.js
@@ -0,0 +1,75 @@
+import request from "@/utils/request";
+
+// 鑾峰彇妗f鎬讳綋缁熻
+export function getDocumentStatistics() {
+  return request({
+    url: "/fileManagement/statistics/overview",
+    method: "get",
+  });
+}
+
+// 鑾峰彇妗f鍒嗙被缁熻
+export function getCategoryStatistics() {
+  return request({
+    url: "/fileManagement/statistics/category",
+    method: "get",
+  });
+}
+
+// 鑾峰彇妗f鐘舵�佺粺璁�
+export function getStatusStatistics() {
+  return request({
+    url: "/fileManagement/statistics/status",
+    method: "get",
+  });
+}
+
+// 鑾峰彇妗f鍊熼槄缁熻
+export function getBorrowStatistics() {
+  return request({
+    url: "/fileManagement/statistics/borrow",
+    method: "get",
+  });
+}
+
+// 鑾峰彇妗f骞村害缁熻
+export function getYearStatistics() {
+  return request({
+    url: "/fileManagement/statistics/year",
+    method: "get",
+  });
+}
+
+// 鑾峰彇妗f浣嶇疆缁熻
+export function getLocationStatistics() {
+  return request({
+    url: "/fileManagement/statistics/location",
+    method: "get",
+  });
+}
+
+// 鑾峰彇妗f瓒嬪娍缁熻
+export function getTrendStatistics(params) {
+  return request({
+    url: "/fileManagement/statistics/trend",
+    method: "get",
+    params: params,
+  });
+}
+
+// 鑾峰彇妗f鍊熼槄鎺掕
+export function getBorrowRanking() {
+  return request({
+    url: "/fileManagement/statistics/borrowRanking",
+    method: "get",
+  });
+}
+
+// 鑾峰彇妗f鍒嗙被璇︽儏缁熻
+export function getCategoryDetailStatistics(categoryId) {
+  return request({
+    url: `/fileManagement/statistics/categoryDetail/${categoryId}`,
+    method: "get",
+  });
+}
+
diff --git a/src/pages.json b/src/pages.json
index e52db8a..cbd1ada 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -1143,6 +1143,34 @@
       "style": {
         "navigationBarTitleText": "娑堟伅涓績"
       }
+    },
+    {
+      "path": "pages/fileManagement/borrow/index",
+      "style": {
+        "navigationBarTitleText": "鍊熼槄绠$悊",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/fileManagement/borrow/edit",
+      "style": {
+        "navigationBarTitleText": "鍊熼槄鐧昏",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/fileManagement/return/index",
+      "style": {
+        "navigationBarTitleText": "褰掕繕绠$悊",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/fileManagement/return/edit",
+      "style": {
+        "navigationBarTitleText": "褰掕繕鐧昏",
+        "navigationStyle": "custom"
+      }
     }
   ],
   "subPackages": [
diff --git a/src/pages/fileManagement/borrow/edit.vue b/src/pages/fileManagement/borrow/edit.vue
new file mode 100644
index 0000000..1338a6f
--- /dev/null
+++ b/src/pages/fileManagement/borrow/edit.vue
@@ -0,0 +1,333 @@
+<template>
+  <view class="borrow-edit">
+    <PageHeader :title="pageTitle" @back="goBack" />
+
+    <up-form
+      ref="formRef"
+      :model="form"
+      :rules="rules"
+      label-width="110"
+    >
+      <up-form-item label="鍊熼槄浜�" prop="borrower" required>
+        <up-input
+          v-model="form.borrower"
+          placeholder="璇疯緭鍏ュ�熼槄浜�"
+          clearable
+          :disabled="isReturned"
+        />
+      </up-form-item>
+
+      <up-form-item label="鍊熼槄涔︾睄" prop="documentationId" required>
+        <up-input
+          v-model="displayDocName"
+          placeholder="璇烽�夋嫨鍊熼槄涔︾睄"
+          readonly
+          :disabled="isEdit"
+          @click="!isEdit && (showDocPicker = true)"
+        />
+        <template #right>
+          <up-icon v-if="!isEdit" name="arrow-right" @click="showDocPicker = true"></up-icon>
+        </template>
+      </up-form-item>
+
+      <up-form-item label="鍊熼槄鏃ユ湡" prop="borrowDate" required>
+        <up-input
+          v-model="form.borrowDate"
+          placeholder="璇烽�夋嫨鍊熼槄鏃ユ湡"
+          readonly
+          @click="!isReturned && (showBorrowDatePicker = true)"
+          :disabled="isReturned"
+        />
+        <template #right>
+          <up-icon name="arrow-right" @click="!isReturned && (showBorrowDatePicker = true)"></up-icon>
+        </template>
+      </up-form-item>
+
+      <up-form-item label="搴斿綊杩樻棩鏈�" prop="dueReturnDate" required>
+        <up-input
+          v-model="form.dueReturnDate"
+          placeholder="璇烽�夋嫨搴斿綊杩樻棩鏈�"
+          readonly
+          @click="!isReturned && (showDueDatePicker = true)"
+          :disabled="isReturned"
+        />
+        <template #right>
+          <up-icon name="arrow-right" @click="!isReturned && (showDueDatePicker = true)"></up-icon>
+        </template>
+      </up-form-item>
+
+      <up-form-item label="鍊熼槄鐩殑" prop="borrowPurpose" required>
+        <up-input
+          v-model="form.borrowPurpose"
+          placeholder="璇疯緭鍏ュ�熼槄鐩殑"
+          clearable
+          :disabled="isReturned"
+        />
+      </up-form-item>
+
+      <up-form-item label="澶囨敞">
+        <up-textarea
+          v-model="form.remark"
+          placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
+          height="80"
+          border="none"
+          :disabled="isReturned"
+        />
+      </up-form-item>
+    </up-form>
+
+    <FooterButtons
+      v-if="!isReturned"
+      :loading="loading"
+      :confirmText="isEdit ? '淇濆瓨' : '鏂板'"
+      @cancel="goBack"
+      @confirm="handleSubmit"
+    />
+
+    <!-- 鍊熼槄鏃ユ湡閫夋嫨鍣� -->
+    <up-popup :show="showBorrowDatePicker" mode="bottom" @close="showBorrowDatePicker = false">
+      <up-datetime-picker
+        :show="true"
+        v-model="borrowDateValue"
+        @confirm="onBorrowDateConfirm"
+        @cancel="showBorrowDatePicker = false"
+        mode="date"
+      />
+    </up-popup>
+
+    <!-- 搴斿綊杩樻棩鏈熼�夋嫨鍣� -->
+    <up-popup :show="showDueDatePicker" mode="bottom" @close="showDueDatePicker = false">
+      <up-datetime-picker
+        :show="true"
+        v-model="dueReturnDateValue"
+        @confirm="onDueDateConfirm"
+        @cancel="showDueDatePicker = false"
+        mode="date"
+      />
+    </up-popup>
+
+    <!-- 鏂囨。閫夋嫨鍣� -->
+    <up-action-sheet
+      :show="showDocPicker"
+      :actions="documentOptions"
+      title="閫夋嫨鍊熼槄涔︾睄"
+      @select="onDocSelect"
+      @close="showDocPicker = false"
+    />
+  </view>
+</template>
+
+<script setup>
+import { ref, computed, onMounted } from "vue";
+import { onLoad } from "@dcloudio/uni-app";
+import PageHeader from "@/components/PageHeader.vue";
+import FooterButtons from "@/components/FooterButtons.vue";
+import { addBorrow, updateBorrow, getDocumentList } from "@/api/fileManagement/borrow";
+
+const formRef = ref();
+const loading = ref(false);
+const borrowId = ref("");
+const isEdit = ref(false);
+
+// 寮圭獥鏄剧ず鐘舵��
+const showDocPicker = ref(false);
+const showBorrowDatePicker = ref(false);
+const showDueDatePicker = ref(false);
+
+// 鏁版嵁
+const documentList = ref([]);
+const borrowDateValue = ref(Date.now());
+const dueReturnDateValue = ref(Date.now());
+const displayDocName = ref(""); // 鐢ㄤ簬鏄剧ず鐨勬枃妗e悕绉�
+
+const form = ref({
+  id: "",
+  documentationId: "",
+  borrower: "",
+  borrowPurpose: "",
+  borrowDate: "",
+  dueReturnDate: "",
+  remark: "",
+  borrowStatus: "",
+});
+
+const rules = {
+  borrower: [{ required: true, message: "璇疯緭鍏ュ�熼槄浜�", trigger: "blur" }],
+  documentationId: [{ required: true, message: "璇烽�夋嫨鍊熼槄涔︾睄", trigger: "change" }],
+  borrowPurpose: [{ required: true, message: "璇疯緭鍏ュ�熼槄鐩殑", trigger: "blur" }],
+  borrowDate: [{ required: true, message: "璇烽�夋嫨鍊熼槄鏃ユ湡", trigger: "change" }],
+  dueReturnDate: [{ required: true, message: "璇烽�夋嫨搴斿綊杩樻棩鏈�", trigger: "change" }],
+};
+
+// 椤甸潰鏍囬
+const pageTitle = computed(() => {
+  if (isEdit.value) {
+    return form.value.borrowStatus === "褰掕繕" ? "鍊熼槄璇︽儏" : "缂栬緫鍊熼槄";
+  }
+  return "鏂板鍊熼槄";
+});
+
+// 鏄惁宸插綊杩�
+const isReturned = computed(() => {
+  return form.value.borrowStatus === "褰掕繕";
+});
+
+// 鏂囨。閫夐」锛堜粎鏂板妯″紡浣跨敤锛�
+const documentOptions = computed(() => {
+  return documentList.value.map((item) => ({
+    name: item.docName || item.name,
+    id: item.id,
+  }));
+});
+
+// 杩斿洖涓婁竴椤�
+const goBack = () => {
+  uni.removeStorageSync("borrowEditData");
+  uni.navigateBack();
+};
+
+// 鍔犺浇鏂囨。鍒楄〃锛堜粎鏂板妯″紡闇�瑕侊級
+const loadDocumentList = async () => {
+  try {
+    const res = await getDocumentList();
+    if (res.code === 200) {
+      documentList.value = res.data || [];
+    }
+  } catch (error) {
+    console.error("鑾峰彇鏂囨。鍒楄〃澶辫触", error);
+  }
+};
+
+// 鏂囨。閫夋嫨纭
+const onDocSelect = (e) => {
+  form.value.documentationId = e.id;
+  displayDocName.value = e.name;
+  showDocPicker.value = false;
+};
+
+// 鍊熼槄鏃ユ湡纭
+const onBorrowDateConfirm = (e) => {
+  const date = new Date(e.value);
+  form.value.borrowDate = formatDate(date);
+  showBorrowDatePicker.value = false;
+};
+
+// 搴斿綊杩樻棩鏈熺‘璁�
+const onDueDateConfirm = (e) => {
+  const date = new Date(e.value);
+  form.value.dueReturnDate = formatDate(date);
+  showDueDatePicker.value = false;
+};
+
+// 鏍煎紡鍖栨棩鏈�
+const formatDate = (date) => {
+  const year = date.getFullYear();
+  const month = String(date.getMonth() + 1).padStart(2, "0");
+  const day = String(date.getDate()).padStart(2, "0");
+  return `${year}-${month}-${day}`;
+};
+
+// 鎻愪氦琛ㄥ崟
+const handleSubmit = () => {
+  // 濡傛灉宸插綊杩橈紝绂佹鎻愪氦
+  if (isReturned.value) {
+    uni.showToast({ title: "宸插綊杩樼殑鍊熼槄璁板綍涓嶈兘缂栬緫", icon: "none" });
+    return;
+  }
+
+  formRef.value
+    .validate()
+    .then(async () => {
+      try {
+        loading.value = true;
+
+        if (isEdit.value) {
+          // 缂栬緫妯″紡
+          const res = await updateBorrow({
+            id: form.value.id,
+            borrower: form.value.borrower,
+            borrowPurpose: form.value.borrowPurpose,
+            borrowDate: form.value.borrowDate,
+            dueReturnDate: form.value.dueReturnDate,
+            remark: form.value.remark,
+          });
+
+          if (res.code === 200) {
+            uni.showToast({ title: "缂栬緫鎴愬姛", icon: "success" });
+            setTimeout(() => {
+              goBack();
+            }, 1500);
+          } else {
+            uni.showToast({ title: res.msg || "缂栬緫澶辫触", icon: "none" });
+          }
+        } else {
+          // 鏂板妯″紡
+          const res = await addBorrow({
+            documentationId: form.value.documentationId,
+            borrower: form.value.borrower,
+            borrowPurpose: form.value.borrowPurpose,
+            borrowDate: form.value.borrowDate,
+            dueReturnDate: form.value.dueReturnDate,
+            borrowStatus: "鍊熼槄",
+            remark: form.value.remark,
+          });
+
+          if (res.code === 200) {
+            uni.showToast({ title: "鏂板鎴愬姛", icon: "success" });
+            setTimeout(() => {
+              goBack();
+            }, 1500);
+          } else {
+            uni.showToast({ title: res.msg || "鏂板澶辫触", icon: "none" });
+          }
+        }
+      } catch (error) {
+        uni.showToast({ title: "鎿嶄綔澶辫触", icon: "none" });
+      } finally {
+        loading.value = false;
+      }
+    })
+    .catch(() => {
+      // 楠岃瘉澶辫触
+    });
+};
+
+// 椤甸潰鍔犺浇
+onLoad((options) => {
+  if (options.id) {
+    // 缂栬緫妯″紡
+    isEdit.value = true;
+    borrowId.value = options.id;
+
+    // 浠� storage 鑾峰彇缂栬緫鏁版嵁
+    const editDataStr = uni.getStorageSync("borrowEditData");
+    if (editDataStr) {
+      try {
+        const data = JSON.parse(editDataStr);
+        Object.assign(form.value, data);
+        borrowDateValue.value = new Date(data.borrowDate).getTime();
+        dueReturnDateValue.value = new Date(data.dueReturnDate).getTime();
+        // 鐩存帴浣跨敤浼犻�掔殑鏂囨。鍚嶇О鏄剧ず锛屽皾璇曞涓彲鑳界殑瀛楁鍚�
+        displayDocName.value = data.docName || data.documentationName || data.fileName || data.name || "";
+      } catch (e) {
+        console.error("瑙f瀽缂栬緫鏁版嵁澶辫触", e);
+      }
+    }
+  } else {
+    // 鏂板妯″紡锛屽姞杞芥枃妗e垪琛ㄥ苟璁剧疆榛樿鏃ユ湡
+    loadDocumentList();
+    const today = new Date();
+    form.value.borrowDate = formatDate(today);
+    borrowDateValue.value = today.getTime();
+  }
+});
+</script>
+
+<style lang="scss">
+@import "@/static/scss/form-common.scss";
+
+.borrow-edit {
+  min-height: 100vh;
+  background: #f5f5f5;
+}
+</style>
diff --git a/src/pages/fileManagement/borrow/index.vue b/src/pages/fileManagement/borrow/index.vue
new file mode 100644
index 0000000..b051137
--- /dev/null
+++ b/src/pages/fileManagement/borrow/index.vue
@@ -0,0 +1,262 @@
+<template>
+  <view class="sales-account">
+    <!-- 浣跨敤閫氱敤椤甸潰澶撮儴缁勪欢 -->
+    <PageHeader title="鍊熼槄绠$悊" @back="goBack" />
+
+    <!-- 鎼滅储鍜岀瓫閫夊尯鍩� -->
+    <view class="search-section">
+      <view class="search-bar">
+        <view class="search-input">
+          <up-input
+            class="search-text"
+            placeholder="璇疯緭鍏ュ�熼槄浜烘悳绱�"
+            v-model="searchForm.borrower"
+            @change="getList"
+            clearable
+          />
+        </view>
+        <view class="filter-button" @click="getList">
+          <up-icon name="search" size="24" color="#999"></up-icon>
+        </view>
+      </view>
+    </view>
+
+    <!-- 鍊熼槄鍒楄〃 -->
+    <view class="ledger-list" v-if="borrowList.length > 0">
+      <view v-for="(item, index) in borrowList" :key="index">
+        <view class="ledger-item">
+          <view class="item-header">
+            <view class="item-left">
+              <view class="document-icon">
+                <up-icon name="file-text" size="16" color="#ffffff"></up-icon>
+              </view>
+              <text class="item-id">{{ item.docName || '-' }}</text>
+            </view>
+            <view class="item-tag" :class="getStatusClass(item.borrowStatus)">
+              <text class="tag-text">{{ item.borrowStatus }}</text>
+            </view>
+          </view>
+          <up-divider></up-divider>
+          <view class="item-details">
+            <view class="detail-row">
+              <text class="detail-label">鍊熼槄浜�</text>
+              <text class="detail-value">{{ item.borrower || '-' }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">鍊熼槄鐩殑</text>
+              <text class="detail-value">{{ item.borrowPurpose || '-' }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">鍊熼槄鏃ユ湡</text>
+              <text class="detail-value">{{ item.borrowDate || '-' }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">搴斿綊杩樻棩鏈�</text>
+              <text class="detail-value">{{ item.dueReturnDate || '-' }}</text>
+            </view>
+            <view class="detail-row" v-if="item.remark">
+              <text class="detail-label">澶囨敞</text>
+              <text class="detail-value">{{ item.remark }}</text>
+            </view>
+          </view>
+          <up-divider></up-divider>
+          <view class="detail-buttons">
+            <u-button
+              v-if="item.borrowStatus !== '褰掕繕'"
+              class="detail-button"
+              size="small"
+              type="primary"
+              @click.stop="goEdit(item)"
+            >
+              缂栬緫
+            </u-button>
+            <u-button
+              v-if="item.borrowStatus !== '褰掕繕'"
+              class="detail-button"
+              size="small"
+              type="error"
+              plain
+              @click.stop="handleDelete(item)"
+            >
+              鍒犻櫎
+            </u-button>
+            <u-button
+              v-if="item.borrowStatus === '褰掕繕'"
+              class="detail-button"
+              size="small"
+              type="primary"
+              plain
+              @click.stop="goView(item)"
+            >
+              鏌ョ湅
+            </u-button>
+          </view>
+        </view>
+      </view>
+    </view>
+
+    <view v-else class="no-data">
+      <text>鏆傛棤鍊熼槄璁板綍</text>
+    </view>
+
+    <!-- 娴姩鎿嶄綔鎸夐挳 -->
+    <view class="fab-button" @click="goAdd">
+      <up-icon name="plus" size="24" color="#ffffff"></up-icon>
+    </view>
+  </view>
+</template>
+
+<script setup>
+import { ref, reactive } from "vue";
+import { onShow } from "@dcloudio/uni-app";
+import PageHeader from "@/components/PageHeader.vue";
+import { getBorrowList, deleteBorrow } from "@/api/fileManagement/borrow";
+
+// 鏌ヨ琛ㄥ崟
+const searchForm = reactive({
+  borrower: "",
+});
+
+// 鍊熼槄鍒楄〃鏁版嵁
+const borrowList = ref([]);
+
+// 鍒嗛〉鐩稿叧
+const pagination = reactive({
+  currentPage: 1,
+  pageSize: 10,
+  total: 0,
+});
+
+// 杩斿洖涓婁竴椤�
+const goBack = () => {
+  uni.navigateBack();
+};
+
+// 鑾峰彇鐘舵�佹牱寮忕被
+const getStatusClass = (status) => {
+  if (status === "褰掕繕") return "tag-success";
+  if (status === "鍊熼槄") return "tag-warning";
+  return "tag-default";
+};
+
+// 鍔犺浇鍊熼槄鍒楄〃
+const getList = async () => {
+  uni.showLoading({ title: "鍔犺浇涓�...", mask: true });
+
+  const query = {
+    page: -1,
+    size: -1,
+    borrower: searchForm.borrower || undefined,
+  };
+
+  try {
+    const res = await getBorrowList(query);
+    if (res.code === 200) {
+      borrowList.value = res.data.records || [];
+      pagination.total = res.data.total || 0;
+    } else {
+      uni.showToast({ title: res.msg || "鑾峰彇鍊熼槄鍒楄〃澶辫触", icon: "none" });
+      borrowList.value = [];
+    }
+  } catch (error) {
+    uni.showToast({ title: "鑾峰彇鍊熼槄鍒楄〃澶辫触", icon: "none" });
+    borrowList.value = [];
+  } finally {
+    uni.hideLoading();
+  }
+};
+
+// 璺宠浆鍒版柊澧為〉闈�
+const goAdd = () => {
+  uni.navigateTo({
+    url: "/pages/fileManagement/borrow/edit",
+  });
+};
+
+// 璺宠浆鍒扮紪杈戦〉闈�
+const goEdit = (item) => {
+  uni.setStorageSync("borrowEditData", JSON.stringify(item));
+  uni.navigateTo({
+    url: `/pages/fileManagement/borrow/edit?id=${item.id}`,
+  });
+};
+
+// 璺宠浆鍒版煡鐪嬮〉闈紙宸插綊杩樿褰曪級
+const goView = (item) => {
+  uni.setStorageSync("borrowEditData", JSON.stringify(item));
+  uni.navigateTo({
+    url: `/pages/fileManagement/borrow/edit?id=${item.id}`,
+  });
+};
+
+// 鍒犻櫎
+const handleDelete = (row) => {
+  uni.showModal({
+    title: "鍒犻櫎纭",
+    content: "閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�",
+    confirmText: "纭",
+    cancelText: "鍙栨秷",
+    success: async (res) => {
+      if (res.confirm) {
+        try {
+          uni.showLoading({ title: "鍒犻櫎涓�...", mask: true });
+          const result = await deleteBorrow([row.id]);
+          if (result.code === 200) {
+            uni.showToast({ title: "鍒犻櫎鎴愬姛", icon: "success" });
+            getList();
+          } else {
+            uni.showToast({ title: result.msg || "鍒犻櫎澶辫触", icon: "none" });
+          }
+        } catch (error) {
+          uni.showToast({ title: "鍒犻櫎澶辫触", icon: "none" });
+        } finally {
+          uni.hideLoading();
+        }
+      }
+    },
+  });
+};
+
+onShow(() => {
+  getList();
+});
+</script>
+
+<style scoped lang="scss">
+@import "@/styles/sales-common.scss";
+
+// 鏍囩鏍峰紡
+.item-tag {
+  border-radius: 4px;
+  padding: 2px 8px;
+
+  &.tag-success {
+    background: #4caf50;
+  }
+
+  &.tag-warning {
+    background: #ff9800;
+  }
+
+  &.tag-default {
+    background: #9e9e9e;
+  }
+}
+
+.tag-text {
+  font-size: 11px;
+  color: #ffffff;
+  font-weight: 500;
+}
+
+// 鎸夐挳鏍峰紡
+.detail-buttons {
+  padding: 12px 0;
+  display: flex;
+  gap: 12px;
+}
+
+.detail-button {
+  flex: 1;
+}
+</style>
diff --git a/src/pages/fileManagement/return/edit.vue b/src/pages/fileManagement/return/edit.vue
new file mode 100644
index 0000000..e0f9e86
--- /dev/null
+++ b/src/pages/fileManagement/return/edit.vue
@@ -0,0 +1,313 @@
+<template>
+  <view class="return-edit">
+    <PageHeader :title="pageTitle" @back="goBack" />
+
+    <up-form
+      ref="formRef"
+      :model="form"
+      :rules="rules"
+      label-width="110"
+    >
+      <up-form-item label="鏂囨。" prop="borrowId" required>
+        <up-input
+          v-model="displayDocName"
+          placeholder="璇烽�夋嫨鏂囨。"
+          readonly
+          :disabled="isEdit"
+          @click="!isEdit && (showDocPicker = true)"
+        />
+        <template #right>
+          <up-icon v-if="!isEdit" name="arrow-right" @click="showDocPicker = true"></up-icon>
+        </template>
+      </up-form-item>
+
+      <up-form-item label="鍊熼槄浜�" prop="borrower">
+        <up-input
+          v-model="form.borrower"
+          placeholder="閫夋嫨鏂囨。鍚庤嚜鍔ㄥ甫鍑�"
+          disabled
+        />
+      </up-form-item>
+
+      <up-form-item label="褰掕繕浜�" prop="returner" required>
+        <up-input
+          v-model="form.returner"
+          placeholder="璇疯緭鍏ュ綊杩樹汉"
+          clearable
+          :disabled="isReturned"
+        />
+      </up-form-item>
+
+      <up-form-item label="褰掕繕鏃ユ湡" prop="returnDate" required>
+        <up-input
+          v-model="form.returnDate"
+          placeholder="璇烽�夋嫨褰掕繕鏃ユ湡"
+          readonly
+          @click="!isReturned && (showReturnDatePicker = true)"
+          :disabled="isReturned"
+        />
+        <template #right>
+          <up-icon name="arrow-right" @click="!isReturned && (showReturnDatePicker = true)"></up-icon>
+        </template>
+      </up-form-item>
+
+      <up-form-item label="搴斿綊杩樻棩鏈�" prop="dueReturnDate">
+        <up-input
+          v-model="form.dueReturnDate"
+          placeholder="閫夋嫨鏂囨。鍚庤嚜鍔ㄥ甫鍑�"
+          disabled
+        />
+      </up-form-item>
+
+      <up-form-item label="澶囨敞璇存槑" prop="remark">
+        <up-textarea
+          v-model="form.remark"
+          placeholder="璇疯緭鍏ュ娉ㄨ鏄�"
+          height="80"
+          border="none"
+          :disabled="isReturned"
+        />
+      </up-form-item>
+    </up-form>
+
+    <FooterButtons
+      v-if="!isReturned"
+      :loading="loading"
+      :confirmText="isEdit ? '淇濆瓨' : '鏂板'"
+      @cancel="goBack"
+      @confirm="handleSubmit"
+    />
+
+    <!-- 鏂囨。閫夋嫨鍣� -->
+    <up-action-sheet
+      :show="showDocPicker"
+      :actions="documentOptions"
+      title="閫夋嫨鏂囨。"
+      @select="onDocSelect"
+      @close="showDocPicker = false"
+    />
+
+    <!-- 褰掕繕鏃ユ湡閫夋嫨鍣� -->
+    <up-popup :show="showReturnDatePicker" mode="bottom" @close="showReturnDatePicker = false">
+      <up-datetime-picker
+        :show="true"
+        v-model="returnDateValue"
+        @confirm="onReturnDateConfirm"
+        @cancel="showReturnDatePicker = false"
+        mode="date"
+      />
+    </up-popup>
+  </view>
+</template>
+
+<script setup>
+import { ref, computed, onMounted } from "vue";
+import { onLoad } from "@dcloudio/uni-app";
+import PageHeader from "@/components/PageHeader.vue";
+import FooterButtons from "@/components/FooterButtons.vue";
+import { returnDocument, reventUpdate, getDocumentList } from "@/api/fileManagement/return";
+
+const formRef = ref();
+const loading = ref(false);
+const returnId = ref("");
+const isEdit = ref(false);
+
+// 寮圭獥鏄剧ず鐘舵��
+const showDocPicker = ref(false);
+const showReturnDatePicker = ref(false);
+
+// 鏁版嵁
+const documentList = ref([]);
+const returnDateValue = ref(Date.now());
+const displayDocName = ref(""); // 鐢ㄤ簬鏄剧ず鐨勬枃妗e悕绉�
+
+const form = ref({
+  id: "",
+  borrowId: "",
+  documentationId: "",
+  borrower: "",
+  returner: "",
+  borrowStatus: "",
+  returnDate: "",
+  dueReturnDate: "",
+  remark: "",
+});
+
+const rules = {
+  borrowId: [{ required: true, message: "璇烽�夋嫨鏂囨。", trigger: "change" }],
+  returner: [{ required: true, message: "璇疯緭鍏ュ綊杩樹汉", trigger: "blur" }],
+  returnDate: [{ required: true, message: "璇烽�夋嫨褰掕繕鏃ユ湡", trigger: "change" }],
+};
+
+// 椤甸潰鏍囬
+const pageTitle = computed(() => {
+  if (isEdit.value) {
+    return form.value.borrowStatus === "褰掕繕" ? "褰掕繕璇︽儏" : "缂栬緫褰掕繕";
+  }
+  return "鏂板褰掕繕";
+});
+
+// 鏄惁宸插綊杩�
+const isReturned = computed(() => {
+  return form.value.borrowStatus === "褰掕繕";
+});
+
+// 鏂囨。閫夐」锛堜粎鏂板妯″紡浣跨敤锛�
+const documentOptions = computed(() => {
+  return documentList.value.map((item) => ({
+    name: item.docName || item.name,
+    id: item.id,
+    borrower: item.borrower,
+    dueReturnDate: item.dueReturnDate,
+  }));
+});
+
+// 杩斿洖涓婁竴椤�
+const goBack = () => {
+  uni.removeStorageSync("returnEditData");
+  uni.navigateBack();
+};
+
+// 鍔犺浇鏂囨。鍒楄〃锛堜粎鏂板妯″紡闇�瑕侊級
+const loadDocumentList = async () => {
+  try {
+    const res = await getDocumentList();
+    if (res.code === 200) {
+      documentList.value = res.data || [];
+    }
+  } catch (error) {
+    console.error("鑾峰彇鏂囨。鍒楄〃澶辫触", error);
+  }
+};
+
+// 鏂囨。閫夋嫨纭
+const onDocSelect = (e) => {
+  form.value.borrowId = e.id;
+  form.value.documentationId = e.id;
+  displayDocName.value = e.name;
+  // 鑷姩甯﹀嚭鍊熼槄浜哄拰搴斿綊杩樻棩鏈�
+  form.value.borrower = e.borrower || "";
+  form.value.dueReturnDate = e.dueReturnDate || "";
+  showDocPicker.value = false;
+};
+
+// 褰掕繕鏃ユ湡纭
+const onReturnDateConfirm = (e) => {
+  const date = new Date(e.value);
+  form.value.returnDate = formatDate(date);
+  showReturnDatePicker.value = false;
+};
+
+// 鏍煎紡鍖栨棩鏈�
+const formatDate = (date) => {
+  const year = date.getFullYear();
+  const month = String(date.getMonth() + 1).padStart(2, "0");
+  const day = String(date.getDate()).padStart(2, "0");
+  return `${year}-${month}-${day}`;
+};
+
+// 鎻愪氦琛ㄥ崟
+const handleSubmit = () => {
+  // 濡傛灉宸插綊杩橈紝绂佹鎻愪氦
+  if (isReturned.value) {
+    uni.showToast({ title: "宸插綊杩樼殑璁板綍涓嶈兘缂栬緫", icon: "none" });
+    return;
+  }
+
+  formRef.value
+    .validate()
+    .then(async () => {
+      try {
+        loading.value = true;
+
+        if (isEdit.value) {
+          // 缂栬緫妯″紡
+          const res = await reventUpdate({
+            id: form.value.id,
+            documentationId: form.value.documentationId,
+            borrower: form.value.borrower,
+            returner: form.value.returner,
+            borrowStatus: form.value.borrowStatus,
+            returnDate: form.value.returnDate,
+            dueReturnDate: form.value.dueReturnDate,
+            remark: form.value.remark,
+          });
+
+          if (res.code === 200) {
+            uni.showToast({ title: "缂栬緫鎴愬姛", icon: "success" });
+            setTimeout(() => {
+              goBack();
+            }, 1500);
+          } else {
+            uni.showToast({ title: res.msg || "缂栬緫澶辫触", icon: "none" });
+          }
+        } else {
+          // 鏂板妯″紡
+          const res = await returnDocument({
+            borrowId: form.value.borrowId,
+            borrower: form.value.borrower,
+            returner: form.value.returner,
+            borrowStatus: "褰掕繕",
+            returnDate: form.value.returnDate,
+            dueReturnDate: form.value.dueReturnDate,
+            remark: form.value.remark,
+          });
+
+          if (res.code === 200) {
+            uni.showToast({ title: "鏂板鎴愬姛", icon: "success" });
+            setTimeout(() => {
+              goBack();
+            }, 1500);
+          } else {
+            uni.showToast({ title: res.msg || "鏂板澶辫触", icon: "none" });
+          }
+        }
+      } catch (error) {
+        uni.showToast({ title: "鎿嶄綔澶辫触", icon: "none" });
+      } finally {
+        loading.value = false;
+      }
+    })
+    .catch(() => {
+      // 楠岃瘉澶辫触
+    });
+};
+
+// 椤甸潰鍔犺浇
+onLoad((options) => {
+  if (options.id) {
+    // 缂栬緫妯″紡
+    isEdit.value = true;
+    returnId.value = options.id;
+
+    // 浠� storage 鑾峰彇缂栬緫鏁版嵁
+    const editDataStr = uni.getStorageSync("returnEditData");
+    if (editDataStr) {
+      try {
+        const data = JSON.parse(editDataStr);
+        Object.assign(form.value, data);
+        returnDateValue.value = new Date(data.returnDate).getTime();
+        // 鐩存帴浣跨敤浼犻�掔殑 docName 鏄剧ず
+        displayDocName.value = data.docName || "";
+      } catch (e) {
+        console.error("瑙f瀽缂栬緫鏁版嵁澶辫触", e);
+      }
+    }
+  } else {
+    // 鏂板妯″紡锛屽姞杞芥枃妗e垪琛ㄥ苟璁剧疆榛樿鏃ユ湡
+    loadDocumentList();
+    const today = new Date();
+    form.value.returnDate = formatDate(today);
+    returnDateValue.value = today.getTime();
+  }
+});
+</script>
+
+<style lang="scss">
+@import "@/static/scss/form-common.scss";
+
+.return-edit {
+  min-height: 100vh;
+  background: #f5f5f5;
+}
+</style>
diff --git a/src/pages/fileManagement/return/index.vue b/src/pages/fileManagement/return/index.vue
new file mode 100644
index 0000000..3c8aeb4
--- /dev/null
+++ b/src/pages/fileManagement/return/index.vue
@@ -0,0 +1,262 @@
+<template>
+  <view class="sales-account">
+    <!-- 浣跨敤閫氱敤椤甸潰澶撮儴缁勪欢 -->
+    <PageHeader title="褰掕繕绠$悊" @back="goBack" />
+
+    <!-- 鎼滅储鍜岀瓫閫夊尯鍩� -->
+    <view class="search-section">
+      <view class="search-bar">
+        <view class="search-input">
+          <up-input
+            class="search-text"
+            placeholder="璇疯緭鍏ュ�熼槄浜烘悳绱�"
+            v-model="searchForm.borrower"
+            @change="getList"
+            clearable
+          />
+        </view>
+        <view class="filter-button" @click="getList">
+          <up-icon name="search" size="24" color="#999"></up-icon>
+        </view>
+      </view>
+    </view>
+
+    <!-- 褰掕繕鍒楄〃 -->
+    <view class="ledger-list" v-if="returnList.length > 0">
+      <view v-for="(item, index) in returnList" :key="index">
+        <view class="ledger-item">
+          <view class="item-header">
+            <view class="item-left">
+              <view class="document-icon">
+                <up-icon name="file-text" size="16" color="#ffffff"></up-icon>
+              </view>
+              <text class="item-id">{{ item.docName || '-' }}</text>
+            </view>
+            <view class="item-tag" :class="getStatusClass(item.borrowStatus)">
+              <text class="tag-text">{{ item.borrowStatus }}</text>
+            </view>
+          </view>
+          <up-divider></up-divider>
+          <view class="item-details">
+            <view class="detail-row">
+              <text class="detail-label">鍊熼槄浜�</text>
+              <text class="detail-value">{{ item.borrower || '-' }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">褰掕繕浜�</text>
+              <text class="detail-value">{{ item.returner || '-' }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">褰掕繕鏃ユ湡</text>
+              <text class="detail-value">{{ item.returnDate || '-' }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">搴斿綊杩樻棩鏈�</text>
+              <text class="detail-value">{{ item.dueReturnDate || '-' }}</text>
+            </view>
+            <view class="detail-row" v-if="item.remark">
+              <text class="detail-label">澶囨敞</text>
+              <text class="detail-value">{{ item.remark }}</text>
+            </view>
+          </view>
+          <up-divider></up-divider>
+          <view class="detail-buttons">
+            <u-button
+              v-if="item.borrowStatus !== '褰掕繕'"
+              class="detail-button"
+              size="small"
+              type="primary"
+              @click.stop="goEdit(item)"
+            >
+              缂栬緫
+            </u-button>
+            <u-button
+              v-if="item.borrowStatus !== '褰掕繕'"
+              class="detail-button"
+              size="small"
+              type="error"
+              plain
+              @click.stop="handleDelete(item)"
+            >
+              鍒犻櫎
+            </u-button>
+            <u-button
+              v-if="item.borrowStatus === '褰掕繕'"
+              class="detail-button"
+              size="small"
+              type="primary"
+              plain
+              @click.stop="goView(item)"
+            >
+              鏌ョ湅
+            </u-button>
+          </view>
+        </view>
+      </view>
+    </view>
+
+    <view v-else class="no-data">
+      <text>鏆傛棤褰掕繕璁板綍</text>
+    </view>
+
+    <!-- 娴姩鎿嶄綔鎸夐挳 -->
+    <view class="fab-button" @click="goAdd">
+      <up-icon name="plus" size="24" color="#ffffff"></up-icon>
+    </view>
+  </view>
+</template>
+
+<script setup>
+import { ref, reactive } from "vue";
+import { onShow } from "@dcloudio/uni-app";
+import PageHeader from "@/components/PageHeader.vue";
+import { getReturnListPage, deleteReturn } from "@/api/fileManagement/return";
+
+// 鏌ヨ琛ㄥ崟
+const searchForm = reactive({
+  borrower: "",
+});
+
+// 褰掕繕鍒楄〃鏁版嵁
+const returnList = ref([]);
+
+// 鍒嗛〉鐩稿叧
+const pagination = reactive({
+  currentPage: 1,
+  pageSize: 10,
+  total: 0,
+});
+
+// 杩斿洖涓婁竴椤�
+const goBack = () => {
+  uni.navigateBack();
+};
+
+// 鑾峰彇鐘舵�佹牱寮忕被
+const getStatusClass = (status) => {
+  if (status === "褰掕繕") return "tag-success";
+  if (status === "鍊熼槄") return "tag-warning";
+  return "tag-default";
+};
+
+// 鍔犺浇褰掕繕鍒楄〃
+const getList = async () => {
+  uni.showLoading({ title: "鍔犺浇涓�...", mask: true });
+
+  const query = {
+    page: -1,
+    size: -1,
+    borrower: searchForm.borrower || undefined,
+  };
+
+  try {
+    const res = await getReturnListPage(query);
+    if (res.code === 200) {
+      returnList.value = res.data.records || [];
+      pagination.total = res.data.total || 0;
+    } else {
+      uni.showToast({ title: res.msg || "鑾峰彇褰掕繕鍒楄〃澶辫触", icon: "none" });
+      returnList.value = [];
+    }
+  } catch (error) {
+    uni.showToast({ title: "鑾峰彇褰掕繕鍒楄〃澶辫触", icon: "none" });
+    returnList.value = [];
+  } finally {
+    uni.hideLoading();
+  }
+};
+
+// 璺宠浆鍒版柊澧為〉闈�
+const goAdd = () => {
+  uni.navigateTo({
+    url: "/pages/fileManagement/return/edit",
+  });
+};
+
+// 璺宠浆鍒扮紪杈戦〉闈�
+const goEdit = (item) => {
+  uni.setStorageSync("returnEditData", JSON.stringify(item));
+  uni.navigateTo({
+    url: `/pages/fileManagement/return/edit?id=${item.id}`,
+  });
+};
+
+// 璺宠浆鍒版煡鐪嬮〉闈紙宸插綊杩樿褰曪級
+const goView = (item) => {
+  uni.setStorageSync("returnEditData", JSON.stringify(item));
+  uni.navigateTo({
+    url: `/pages/fileManagement/return/edit?id=${item.id}`,
+  });
+};
+
+// 鍒犻櫎
+const handleDelete = (row) => {
+  uni.showModal({
+    title: "鍒犻櫎纭",
+    content: "閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�",
+    confirmText: "纭",
+    cancelText: "鍙栨秷",
+    success: async (res) => {
+      if (res.confirm) {
+        try {
+          uni.showLoading({ title: "鍒犻櫎涓�...", mask: true });
+          const result = await deleteReturn([row.id]);
+          if (result.code === 200) {
+            uni.showToast({ title: "鍒犻櫎鎴愬姛", icon: "success" });
+            getList();
+          } else {
+            uni.showToast({ title: result.msg || "鍒犻櫎澶辫触", icon: "none" });
+          }
+        } catch (error) {
+          uni.showToast({ title: "鍒犻櫎澶辫触", icon: "none" });
+        } finally {
+          uni.hideLoading();
+        }
+      }
+    },
+  });
+};
+
+onShow(() => {
+  getList();
+});
+</script>
+
+<style scoped lang="scss">
+@import "@/styles/sales-common.scss";
+
+// 鏍囩鏍峰紡
+.item-tag {
+  border-radius: 4px;
+  padding: 2px 8px;
+
+  &.tag-success {
+    background: #4caf50;
+  }
+
+  &.tag-warning {
+    background: #ff9800;
+  }
+
+  &.tag-default {
+    background: #9e9e9e;
+  }
+}
+
+.tag-text {
+  font-size: 11px;
+  color: #ffffff;
+  font-weight: 500;
+}
+
+// 鎸夐挳鏍峰紡
+.detail-buttons {
+  padding: 12px 0;
+  display: flex;
+  gap: 12px;
+}
+
+.detail-button {
+  flex: 1;
+}
+</style>
diff --git a/src/pages/works.vue b/src/pages/works.vue
index 8d37e74..b4400c7 100644
--- a/src/pages/works.vue
+++ b/src/pages/works.vue
@@ -271,16 +271,13 @@
 
 <script setup>
   import { ref, onMounted, nextTick, reactive, computed } from "vue";
-  import { onShow } from "@dcloudio/uni-app";
   import { userLoginFacotryList } from "@/api/login";
   import { getProductWorkOrderById } from "@/api/productionManagement/productionReporting";
-  import { createVersionUpgradeChecker } from "@/utils/versionUpgrade";
   import DownloadProgressMask from "@/components/DownloadProgressMask.vue";
   import modal from "@/plugins/modal";
   import useUserStore from "@/store/modules/user";
 
   const userStore = useUserStore();
-  const { triggerVersionCheck } = createVersionUpgradeChecker({ logPrefix: "[version-works]" });
   const show = ref(false);
   const factoryList = ref([]);
   const factoryListTem = ref([]);
@@ -337,6 +334,10 @@
       icon: "/static/images/icon/caigouguanli.svg",
       label: "閲囪喘閫�璐�",
     },
+    {
+      icon: "/static/images/icon/gongyingshangdangan.svg",
+      label: "渚涘簲鍟嗘。妗�",
+    },
   ]);
 
   // 璐㈠姟绠$悊鍔熻兘鏁版嵁
@@ -391,9 +392,13 @@
   const archiveManagementItems = reactive([
     {
       icon: "/static/images/icon/gongyingshangdangan.svg",
-      label: "渚涘簲鍟嗘。妗�",
+      label: "鍊熼槄鐧昏",
     },
-  ]);
+    {
+      icon: "/static/images/icon/hetongguanli.svg",
+      label: "褰掕繕鐧昏",
+    }
+  ])
 
   // 鍞悗鏈嶅姟鍔熻兘鏁版嵁
   const afterSalesServiceItems = reactive([
@@ -923,6 +928,16 @@
           url: "/pages/customerService/afterSalesHandling/index",
         });
         break;
+      case "鍊熼槄鐧昏":
+        uni.navigateTo({
+          url: "/pages/fileManagement/borrow/index",
+        });
+        break;
+      case "褰掕繕鐧昏":
+        uni.navigateTo({
+          url: "/pages/fileManagement/return/index",
+        });
+        break;
       default:
         uni.showToast({
           title: `鐐瑰嚮浜�${item.label}`,
@@ -1111,7 +1126,7 @@
     // 瀹氫箟鑿滃崟閰嶇疆鏄犲皠
     const menuMapping = {
       collaboration: { target: collaborationItems, specialMapping: { "瑙勭珷鍒跺害": "瑙勭珷鍒跺害绠$悊" } },
-      archiveManagement: { target: archiveManagementItems, specialMapping: { "渚涘簲鍟嗘。妗�": "渚涘簲鍟嗙鐞�" } },
+      purchase: { specialMapping: { "渚涘簲鍟嗘。妗�": "渚涘簲鍟嗙鐞�" } },
     };
     console.log(allowedMenuTitles)
     // 閫氱敤杩囨护鍑芥暟
@@ -1128,9 +1143,8 @@
 
     // 杩囨护鍚勪釜妯″潡
     filterArray(marketingItems);
-    filterArray(purchaseItems);
+    filterArray(purchaseItems, menuMapping.purchase.specialMapping);
     filterArray(financeManagementItems);
-    filterArray(archiveManagementItems, menuMapping.archiveManagement.specialMapping);
     filterArray(collaborationItems, menuMapping.collaboration.specialMapping);
     filterArray(safetyItems);
     filterArray(humanResourcesItems);
@@ -1138,13 +1152,13 @@
     filterArray(qualityItems);
     filterArray(productionItems);
     filterArray(equipmentItems);
+    filterArray(archiveManagementItems);
   };
 
   // 妫�鏌ユā鍧楁槸鍚︽湁鑿滃崟椤归渶瑕佹樉绀�
   const hasMarketingItems = computed(() => marketingItems.length > 0);
   const hasPurchaseItems = computed(() => purchaseItems.length > 0);
   const hasFinanceManagementItems = computed(() => financeManagementItems.length > 0);
-  const hasArchiveManagementItems = computed(() => archiveManagementItems.length > 0);
   const hasAfterSalesServiceItems = computed(() => afterSalesServiceItems.length > 0);
   const hasCollaborationItems = computed(() => collaborationItems.length > 0);
   const hasSafetyItems = computed(() => safetyItems.length > 0);
@@ -1153,9 +1167,9 @@
   const hasWarehouseLogisticsItems = computed(() => warehouseLogisticsItems.length > 0);
   const hasProductionItems = computed(() => productionItems.length > 0);
   const hasEquipmentItems = computed(() => equipmentItems.length > 0);
+  const hasArchiveManagementItems = computed(() => archiveManagementItems.length > 0);
 
   onMounted(() => {
-    triggerVersionCheck("onMounted");
     // 姣忔杩涘叆棣栭〉閮藉己鍒跺埛鏂扮敤鎴蜂俊鎭拰璺敱鏉冮檺锛屼笉鍋氭湰鍦扮紦瀛樺垽鏂�
     userStore.getInfo().then(() => {
       userStore
@@ -1170,10 +1184,6 @@
     getUserLoginFacotryList();
     // 鍚姩閫氱煡鐘舵�佸畾鏃跺櫒
     startStatusTimer();
-  });
-
-  onShow(() => {
-    triggerVersionCheck("onShow");
   });
 </script>
 
diff --git a/src/utils/versionUpgrade.js b/src/utils/versionUpgrade.js
index e0c818a..6008dbf 100644
--- a/src/utils/versionUpgrade.js
+++ b/src/utils/versionUpgrade.js
@@ -1,6 +1,7 @@
 import config from "@/config";
 import { getAllVersion } from "@/api/viewIndex";
 import bus from "@/plugins/bus";
+let hasTriggeredVersionCheckInSession = false;
 
 function compareVersion(v1, v2) {
   const s1 = String(v1 || "").replace(/[^\d.]/g, "").split(".").map((n) => Number(n) || 0);
@@ -264,12 +265,17 @@
   let lastVersionCheckAt = 0;
 
   const triggerVersionCheck = async (from = "unknown") => {
+    if (hasTriggeredVersionCheckInSession) {
+      console.log(`${logPrefix} 璺宠繃鐗堟湰妫�鏌ワ紝鏈浼氳瘽宸叉娴嬭繃锛屾潵婧�=${from}`);
+      return;
+    }
     const now = Date.now();
     if (now - lastVersionCheckAt < throttleMs) {
       console.log(`${logPrefix} 璺宠繃閲嶅妫�鏌ワ紝鏉ユ簮=${from}`);
       return;
     }
     lastVersionCheckAt = now;
+    hasTriggeredVersionCheckInSession = true;
     console.log(`${logPrefix} 瑙﹀彂鐗堟湰妫�鏌ワ紝鏉ユ簮=${from}`);
     const currentVersion = await getCurrentVersion(logPrefix);
     await checkAppVersionUpgrade(logPrefix, currentVersion);

--
Gitblit v1.9.3