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