From 75a462f8ee30491f05d29ccac1b65d31e835957b Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期三, 20 八月 2025 15:57:14 +0800
Subject: [PATCH] 档案管理调整

---
 src/views/fileManagement/borrow/index.vue |  584 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 584 insertions(+), 0 deletions(-)

diff --git a/src/views/fileManagement/borrow/index.vue b/src/views/fileManagement/borrow/index.vue
new file mode 100644
index 0000000..9a9ee81
--- /dev/null
+++ b/src/views/fileManagement/borrow/index.vue
@@ -0,0 +1,584 @@
+<template>
+  <div class="app-container borrow-view">
+    <!-- 鏌ヨ鍖哄煙 -->
+    <div class="search-container">
+      <el-form :model="searchForm" :inline="true" class="search-form">
+                 <el-form-item label="鍊熼槄鐘舵�侊細">
+           <el-select v-model="searchForm.borrowStatus" placeholder="璇烽�夋嫨鍊熼槄鐘舵��" clearable style="width: 150px">
+             <el-option label="鍊熼槄" value="鍊熼槄" />
+             <el-option label="褰掕繕" value="褰掕繕" />
+           </el-select>
+         </el-form-item>
+        <el-form-item label="鍊熼槄浜猴細">
+          <el-input
+            v-model="searchForm.borrower"
+            placeholder="璇疯緭鍏ュ�熼槄浜�"
+            clearable
+            style="width: 200px"
+          />
+        </el-form-item>
+        <el-form-item label="鍊熼槄鏃ユ湡鑼冨洿锛�">
+          <el-date-picker
+            v-model="searchForm.dateRange"
+            type="daterange"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡"
+            format="YYYY-MM-DD"
+            value-format="YYYY-MM-DD"
+            style="width: 300px"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="handleSearch">
+            <el-icon><Search /></el-icon>
+            鏌ヨ
+          </el-button>
+          <el-button @click="handleReset">
+            <el-icon><Refresh /></el-icon>
+            閲嶇疆
+          </el-button>
+        </el-form-item>
+        <el-form-item style="margin-left: auto;">
+          <el-button type="primary" @click="openBorrowDia('add')">
+            <el-icon><Plus /></el-icon>
+            鏂板鍊熼槄
+          </el-button>
+          <el-button
+            type="danger"
+            @click="handleBatchDelete"
+            :disabled="selectedRows.length === 0"
+          >
+            <el-icon><Delete /></el-icon>
+            鎵归噺鍒犻櫎 ({{ selectedRows.length }})
+          </el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+
+    <!-- 琛ㄦ牸鍖哄煙 -->
+    <div class="table-container">
+      <PIMTable
+        :table-data="borrowList"
+        :column="tableColumns"
+        :is-selection="true"
+        :border="true"
+        :table-loading="tableLoading"
+        :page="{
+          current: pagination.currentPage,
+          size: pagination.pageSize,
+          total: pagination.total,
+          layout: 'total, sizes, prev, pager, next, jumper'
+        }"
+        @selection-change="handleSelectionChange"
+        @pagination="handlePagination"
+      />
+    </div>
+
+    <!-- 鍊熼槄鏂板/缂栬緫瀵硅瘽妗� -->
+    <el-dialog
+      v-model="borrowDia"
+      :title="borrowOperationType === 'add' ? '鏂板鍊熼槄' : '缂栬緫鍊熼槄'"
+      width="800px"
+      @close="closeBorrowDia"
+      @keydown.enter.prevent
+    >
+      <el-form
+        :model="borrowForm"
+        label-width="140px"
+        :rules="borrowRules"
+        ref="borrowFormRef"
+      >
+        <el-row :gutter="20">
+          
+        </el-row>
+        
+                 <el-row :gutter="20">
+           <el-col :span="12">
+             <el-form-item label="鍊熼槄浜猴細" prop="borrower">
+               <el-input v-model="borrowForm.borrower" placeholder="璇疯緭鍏ュ�熼槄浜�" />
+             </el-form-item>
+           </el-col>
+           <el-col :span="12">
+             <el-form-item label="鍊熼槄涔︾睄锛�" prop="documentationId">
+               <el-select v-model="borrowForm.documentationId" placeholder="璇烽�夋嫨鍊熼槄涔︾睄" style="width: 100%">
+                 <el-option 
+                   v-for="item in documentList" 
+                   :key="item.id" 
+                   :label="item.docName || item.name" 
+                   :value="item.id"
+                 />
+               </el-select>
+             </el-form-item>
+           </el-col>
+         </el-row>
+        
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鍊熼槄鏃ユ湡锛�" prop="borrowDate">
+              <el-date-picker
+                v-model="borrowForm.borrowDate"
+                type="date"
+                placeholder="閫夋嫨鍊熼槄鏃ユ湡"
+                style="width: 100%"
+                format="YYYY-MM-DD"
+                value-format="YYYY-MM-DD"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="搴斿綊杩樻棩鏈燂細" prop="dueReturnDate">
+              <el-date-picker
+                v-model="borrowForm.dueReturnDate"
+                type="date"
+                placeholder="閫夋嫨搴斿綊杩樻棩鏈�"
+                style="width: 100%"
+                format="YYYY-MM-DD"
+                value-format="YYYY-MM-DD"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        
+                 <el-row :gutter="20">
+           <el-col :span="24">
+             <el-form-item label="鍊熼槄鐩殑锛�" prop="borrowPurpose">
+               <el-input v-model="borrowForm.borrowPurpose" placeholder="璇疯緭鍏ュ�熼槄鐩殑" />
+             </el-form-item>
+           </el-col>
+         </el-row>
+        
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="澶囨敞锛�" prop="remark">
+              <el-input
+                v-model="borrowForm.remark"
+                type="textarea"
+                :rows="3"
+                placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitBorrowForm">纭</el-button>
+          <el-button @click="closeBorrowDia">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, onMounted, getCurrentInstance } from "vue";
+import { ElMessageBox, ElMessage } from "element-plus";
+import { Search, Refresh, Plus, Delete } from '@element-plus/icons-vue';
+import PIMTable from '@/components/PIMTable/PIMTable.vue';
+import { getBorrowList, addBorrow, updateBorrow, deleteBorrow, getDocumentList } from '@/api/fileManagement/borrow';
+
+const { proxy } = getCurrentInstance();
+
+// 鍝嶅簲寮忔暟鎹�
+const borrowDia = ref(false);
+const borrowOperationType = ref("");
+const tableLoading = ref(false);
+const borrowList = ref([]);
+const selectedRows = ref([]);
+const documentList = ref([]); // 鏂囨。鍒楄〃锛岀敤浜庡�熼槄涔︾睄閫夋嫨
+
+// 鍒嗛〉鐩稿叧
+const pagination = reactive({
+  currentPage: 1,
+  pageSize: 10,
+  total: 0,
+});
+
+// 鏌ヨ琛ㄥ崟
+const searchForm = reactive({
+  documentationId: "",
+  borrowStatus: "",
+  borrower: "",
+  returnerId: "",
+  dateRange: []
+});
+
+// 鍊熼槄琛ㄥ崟
+const borrowForm = reactive({
+  id: "",
+  documentationId: "",
+  borrower: "",
+  returnerId: "",
+  borrowPurpose: "",
+  borrowDate: "",
+  dueReturnDate: "",
+  returnDate: "",
+  borrowStatus: "",
+  remark: ""
+});
+
+// 琛ㄥ崟楠岃瘉瑙勫垯
+const borrowRules = reactive({
+  documentationId: [{ required: true, message: "璇烽�夋嫨鍊熼槄涔︾睄", trigger: "change" }],
+  borrower: [{ required: true, message: "璇疯緭鍏ュ�熼槄浜�", trigger: "blur" }],
+  borrowPurpose: [{ required: true, message: "璇疯緭鍏ュ�熼槄鐩殑", trigger: "blur" }],
+  borrowDate: [{ required: true, message: "璇烽�夋嫨鍊熼槄鏃ユ湡", trigger: "change" }],
+  dueReturnDate: [{ required: true, message: "璇烽�夋嫨搴斿綊杩樻棩鏈�", trigger: "change" }],
+  borrowStatus: [{ required: true, message: "璇烽�夋嫨鍊熼槄鐘舵��", trigger: "change" }]
+});
+
+// 琛ㄦ牸鍒楅厤缃�
+const tableColumns = ref([
+  { 
+    label: '鏂囨。鍚嶇О', 
+    prop: 'documentationId',
+    width: '200',
+    formatData: (params) => {
+      if (!params) return '-';
+      const doc = documentList.value.find(item => item.id === params);
+      return doc ? (doc.docName || doc.name) : params;
+    }
+  },
+  { label: '鍊熼槄浜�', prop: 'borrower' },
+  { label: '鍊熼槄鐩殑', prop: 'borrowPurpose' },
+  { label: '鍊熼槄鏃ユ湡', prop: 'borrowDate' },
+  { label: '搴斿綊杩樻棩鏈�', prop: 'dueReturnDate' },
+  { 
+    label: '鍊熼槄鐘舵��', 
+    prop: 'borrowStatus', 
+    width: '100',
+    dataType: 'tag',
+    formatData: (params) => {
+      if (params === null || params === undefined || params === '') return '-';
+      return params;
+    },
+         formatType: (params) => {
+       if (params === '褰掕繕') return 'success';
+       if (params === '鍊熼槄') return 'warning';
+       return 'info';
+     }
+  },
+  { label: '澶囨敞', prop: 'remark', width: '150' },
+  { 
+    dataType: "action",
+    label: "鎿嶄綔",
+    align: "center",
+    fixed: 'right',
+    width: '150',
+    operation: [
+      {
+        name: "缂栬緫",
+        type: "text",
+        clickFun: (row) => {
+          openBorrowDia('edit', row)
+        },
+      },
+      {
+        name: "鍒犻櫎",
+        type: "text",
+        clickFun: (row) => {
+          handleDelete(row)
+        },
+      },
+    ],
+  }
+]);
+
+// 鍒濆鍖栨暟鎹�
+const initData = async () => {
+  await Promise.all([
+    loadDocumentList(),
+    loadBorrowList()
+  ]);
+};
+
+// 鍔犺浇鏂囨。鍒楄〃
+const loadDocumentList = async () => {
+  try {
+    const res = await getDocumentList();
+    if (res.code === 200) {
+      documentList.value = res.data || [];
+    } else {
+      ElMessage.error(res.msg || "鑾峰彇鏂囨。鍒楄〃澶辫触");
+      documentList.value = [];
+    }
+  } catch (error) {
+    ElMessage.error("鑾峰彇鏂囨。鍒楄〃澶辫触锛岃閲嶈瘯");
+    documentList.value = [];
+  }
+};
+
+// 鍔犺浇鍊熼槄鍒楄〃
+const loadBorrowList = async () => {
+  try {
+    tableLoading.value = true;
+    
+    // 鏋勫缓鏌ヨ鍙傛暟
+    const query = {
+      page: pagination.currentPage,
+      size: pagination.pageSize,
+      documentationId: searchForm.documentationId || undefined,
+      borrowStatus: searchForm.borrowStatus || undefined,
+      borrower: searchForm.borrower || undefined,
+      returnerId: searchForm.returnerId || undefined,
+      entryDateStart: searchForm.dateRange && searchForm.dateRange.length > 0 ? searchForm.dateRange[0] : undefined,
+      entryDateEnd: searchForm.dateRange && searchForm.dateRange.length > 1 ? searchForm.dateRange[1] : undefined
+    };
+    
+    // 绉婚櫎undefined鐨勫弬鏁�
+    Object.keys(query).forEach(key => {
+      if (query[key] === undefined) {
+        delete query[key];
+      }
+    });
+    
+    const res = await getBorrowList(query);
+    if (res.code === 200) {
+      borrowList.value = res.data.records || [];
+      pagination.total = res.data.total || 0;
+    } else {
+      ElMessage.error(res.msg || "鑾峰彇鍊熼槄鍒楄〃澶辫触");
+      borrowList.value = [];
+      pagination.total = 0;
+    }
+    
+    // 閲嶇疆閫夋嫨鐘舵��
+    selectedRows.value = [];
+  } catch (error) {
+    ElMessage.error("鑾峰彇鍊熼槄鍒楄〃澶辫触锛岃閲嶈瘯");
+    borrowList.value = [];
+    pagination.total = 0;
+  } finally {
+    tableLoading.value = false;
+  }
+};
+
+// 鏌ヨ
+const handleSearch = () => {
+  pagination.currentPage = 1;
+  loadBorrowList();
+};
+
+// 閲嶇疆鏌ヨ
+const handleReset = () => {
+  searchForm.documentationId = "";
+  searchForm.borrowStatus = "";
+  searchForm.borrower = "";
+  searchForm.returnerId = "";
+  searchForm.dateRange = [];
+  pagination.currentPage = 1;
+  loadBorrowList();
+  ElMessage.success("鏌ヨ鏉′欢宸查噸缃�");
+};
+
+// 鎵撳紑鍊熼槄寮规
+const openBorrowDia = (type, data) => {
+  borrowOperationType.value = type;
+  borrowDia.value = true;
+  
+  if (type === "edit") {
+    // 缂栬緫妯″紡锛屽姞杞界幇鏈夋暟鎹�
+    Object.assign(borrowForm, data);
+  } else {
+    // 鏂板妯″紡锛屾竻绌鸿〃鍗�
+    Object.keys(borrowForm).forEach(key => {
+      borrowForm[key] = "";
+    });
+         // 璁剧疆榛樿鐘舵��
+     borrowForm.borrowStatus = "鍊熼槄";
+    // 璁剧疆褰撳墠鏃ユ湡涓哄�熼槄鏃ユ湡
+    borrowForm.borrowDate = new Date().toISOString().split('T')[0];
+  }
+};
+
+// 鍏抽棴鍊熼槄寮规
+const closeBorrowDia = () => {
+  proxy.$refs.borrowFormRef.resetFields();
+  borrowDia.value = false;
+};
+
+// 鎻愪氦鍊熼槄琛ㄥ崟
+const submitBorrowForm = () => {
+  proxy.$refs.borrowFormRef.validate(async (valid) => {
+    if (valid) {
+      try {
+        if (borrowOperationType.value === "edit") {
+          // 缂栬緫妯″紡锛屾洿鏂扮幇鏈夋暟鎹�
+          const res = await updateBorrow({
+            borrower:borrowForm.borrower,
+            id: borrowForm.id,
+            borrowPurpose: borrowForm.borrowPurpose,
+            borrowDate: borrowForm.borrowDate,
+            dueReturnDate: borrowForm.dueReturnDate,
+            returnDate: borrowForm.returnDate,
+            remark: borrowForm.remark
+          });
+          
+          if (res.code === 200) {
+            ElMessage.success("缂栬緫鎴愬姛");
+            await loadBorrowList();
+            closeBorrowDia();
+          } else {
+            ElMessage.error(res.msg || "缂栬緫澶辫触");
+          }
+        } else {
+          // 鏂板妯″紡锛屾坊鍔犳柊鏁版嵁
+          const res = await addBorrow({
+            documentationId: borrowForm.documentationId,
+            borrower: borrowForm.borrower,
+            returnerId: borrowForm.returnerId,
+            borrowPurpose: borrowForm.borrowPurpose,
+            borrowDate: borrowForm.borrowDate,
+            dueReturnDate: borrowForm.dueReturnDate,
+            returnDate: borrowForm.returnDate,
+            borrowStatus: borrowForm.borrowStatus,
+            remark: borrowForm.remark
+          });
+          
+          if (res.code === 200) {
+            ElMessage.success("鏂板鎴愬姛");
+            await loadBorrowList();
+            closeBorrowDia();
+          } else {
+            ElMessage.error(res.msg || "鏂板澶辫触");
+          }
+        }
+      } catch (error) {
+        ElMessage.error("鎿嶄綔澶辫触锛岃閲嶈瘯");
+      }
+    }
+  });
+};
+
+// 鍒犻櫎鍊熼槄璁板綍
+const handleDelete = (row) => {
+  ElMessageBox.confirm(
+    `纭畾瑕佸垹闄よ繖鏉″�熼槄璁板綍鍚楋紵`,
+    "鍒犻櫎鎻愮ず",
+    {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    }
+  ).then(async () => {
+    try {
+      const res = await deleteBorrow([row.id]);
+      if (res.code === 200) {
+        ElMessage.success("鍒犻櫎鎴愬姛");
+        await loadBorrowList();
+      } else {
+        ElMessage.error(res.msg || "鍒犻櫎澶辫触");
+      }
+    } catch (error) {
+      ElMessage.error("鍒犻櫎澶辫触锛岃閲嶈瘯");
+    }
+  }).catch(() => {
+    ElMessage.info("宸插彇娑堝垹闄�");
+  });
+};
+
+// 鎵归噺鍒犻櫎
+const handleBatchDelete = () => {
+  if (selectedRows.value.length === 0) {
+    ElMessage.warning("璇烽�夋嫨瑕佸垹闄ょ殑璁板綍");
+    return;
+  }
+  
+  ElMessageBox.confirm(
+    `纭畾瑕佸垹闄ら�変腑鐨� ${selectedRows.value.length} 鏉″�熼槄璁板綍鍚楋紵`,
+    "鎵归噺鍒犻櫎鎻愮ず",
+    {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    }
+  ).then(async () => {
+    try {
+      const selectedIds = selectedRows.value.map(row => row.id);
+      const res = await deleteBorrow(selectedIds);
+      if (res.code === 200) {
+        ElMessage.success("鎵归噺鍒犻櫎鎴愬姛");
+        await loadBorrowList();
+      } else {
+        ElMessage.error(res.msg || "鎵归噺鍒犻櫎澶辫触");
+      }
+    } catch (error) {
+      ElMessage.error("鎵归噺鍒犻櫎澶辫触锛岃閲嶈瘯");
+    }
+  }).catch(() => {
+    ElMessage.info("宸插彇娑堝垹闄�");
+  });
+};
+
+// 閫夋嫨鍙樺寲浜嬩欢
+const handleSelectionChange = (selection) => {
+  selectedRows.value = selection;
+};
+
+// 澶勭悊鍒嗛〉鍙樺寲
+const handlePagination = (current, size) => {
+  pagination.currentPage = current;
+  pagination.pageSize = size;
+  loadBorrowList();
+};
+
+// 鐢熷懡鍛ㄦ湡
+onMounted(() => {
+  initData();
+});
+</script>
+
+<style scoped>
+.borrow-view {
+  padding: 20px;
+}
+
+.search-container {
+  background: #ffffff;
+  padding: 20px;
+  border-radius: 8px;
+  margin-bottom: 20px;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+}
+
+.search-form {
+  margin: 0;
+}
+
+.table-container {
+  background: #ffffff;
+  border-radius: 8px;
+  overflow: hidden;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+}
+
+.empty-data {
+  text-align: center;
+  color: #909399;
+  padding: 40px;
+  font-size: 14px;
+}
+
+.dialog-footer {
+  text-align: right;
+}
+
+:deep(.el-form-item__label) {
+  font-weight: 500;
+  color: #303133;
+}
+
+:deep(.el-input__wrapper) {
+  box-shadow: 0 0 0 1px #dcdfe6 inset;
+}
+
+:deep(.el-input__wrapper:hover) {
+  box-shadow: 0 0 0 1px #c0c4cc inset;
+}
+
+:deep(.el-input__wrapper.is-focus) {
+  box-shadow: 0 0 0 1px #409eff inset;
+}
+</style>

--
Gitblit v1.9.3