From ba01c8bd58bea9acbb98c2097765b939a81b21cd Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期五, 29 八月 2025 17:52:41 +0800
Subject: [PATCH] Merge branch 'refs/heads/dev_huangjin' into dev
---
src/views/fileManagement/return/index.vue | 595 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 595 insertions(+), 0 deletions(-)
diff --git a/src/views/fileManagement/return/index.vue b/src/views/fileManagement/return/index.vue
new file mode 100644
index 0000000..a95c8af
--- /dev/null
+++ b/src/views/fileManagement/return/index.vue
@@ -0,0 +1,595 @@
+<template>
+ <div class="app-container return-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-input
+ v-model="searchForm.returner"
+ 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="openReturnDia('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="returnList"
+ :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="returnDia"
+ :title="returnOperationType === 'add' ? '鏂板褰掕繕' : '缂栬緫褰掕繕'"
+ width="800px"
+ @close="closeReturnDia"
+ @keydown.enter.prevent
+ >
+ <el-form
+ :model="returnForm"
+ label-width="140px"
+ :rules="returnRules"
+ ref="returnFormRef"
+ >
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="鏂囨。锛�" prop="borrowId">
+ <el-select v-model="returnForm.borrowId" placeholder="璇烽�夋嫨鏂囨。" style="width: 100%" @change="handleDocumentChange">
+ <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-col :span="12">
+ <el-form-item label="鍊熼槄浜猴細" prop="borrower">
+ <el-input v-model="returnForm.borrower" placeholder="鍊熼槄浜哄皢鏍规嵁鏂囨。閫夋嫨鑷姩甯﹀嚭" disabled />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="褰掕繕浜猴細" prop="returner">
+ <el-input v-model="returnForm.returner" placeholder="璇疯緭鍏ュ綊杩樹汉" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="褰掕繕鏃ユ湡锛�" prop="returnDate">
+ <el-date-picker
+ v-model="returnForm.returnDate"
+ 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="dueReturnDate">
+ <el-date-picker
+ v-model="returnForm.dueReturnDate"
+ type="date"
+ placeholder="搴斿綊杩樻棩鏈熷皢鏍规嵁鏂囨。閫夋嫨鑷姩甯﹀嚭"
+ style="width: 100%"
+ format="YYYY-MM-DD"
+ value-format="YYYY-MM-DD"
+ disabled
+ />
+ </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="returnForm.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="submitReturnForm">纭</el-button>
+ <el-button @click="closeReturnDia">鍙栨秷</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 { getReturnListPage, returnDocument, deleteReturn, getDocumentList, updateBorrow, reventUpdate } from '@/api/fileManagement/return';
+
+const { proxy } = getCurrentInstance();
+
+// 鍝嶅簲寮忔暟鎹�
+const returnDia = ref(false);
+const returnOperationType = ref("");
+const tableLoading = ref(false);
+const returnList = ref([]);
+const selectedRows = ref([]);
+const documentList = ref([]); // 鏂囨。鍒楄〃
+
+// 鍒嗛〉鐩稿叧
+const pagination = reactive({
+ currentPage: 1,
+ pageSize: 10,
+ total: 0,
+});
+
+// 鏌ヨ琛ㄥ崟
+const searchForm = reactive({
+ borrowStatus: "",
+ borrower: "",
+ returner: "",
+ dateRange: []
+});
+
+// 褰掕繕琛ㄥ崟
+const returnForm = reactive({
+ id: "",
+ borrowId: "",
+ borrower: "",
+ returner: "",
+ borrowStatus: "",
+ returnDate: "",
+ dueReturnDate: "",
+ remark: ""
+});
+
+// 琛ㄥ崟楠岃瘉瑙勫垯
+const returnRules = reactive({
+ borrowId: [{ required: true, message: "璇烽�夋嫨鏂囨。", trigger: "change" }],
+ returner: [{ required: true, message: "璇疯緭鍏ュ綊杩樹汉", trigger: "blur" }],
+ returnDate: [{ required: true, message: "璇烽�夋嫨褰掕繕鏃ユ湡", trigger: "change" }]
+});
+
+// 琛ㄦ牸鍒楅厤缃�
+const tableColumns = ref([
+ {
+ label: '鏂囨。鍚嶇О',
+ prop: 'docName',
+ width: '200',
+ },
+ { label: '鍊熼槄浜�', prop: 'borrower' },
+ { label: '褰掕繕浜�', prop: 'returner' },
+ {
+ label: '鍊熼槄鐘舵��',
+ prop: 'borrowStatus',
+ 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: 'returnDate' },
+ { label: '搴斿綊杩樻棩鏈�', prop: 'dueReturnDate' },
+ { label: '澶囨敞', prop: 'remark', width: '150' },
+ {
+ dataType: "action",
+ label: "鎿嶄綔",
+ align: "center",
+ fixed: 'right',
+ width: '150',
+ operation: [
+ {
+ name: "缂栬緫",
+ type: "text",
+ clickFun: (row) => {
+ openReturnDia('edit', row)
+ },
+ },
+ {
+ name: "鍒犻櫎",
+ type: "text",
+ clickFun: (row) => {
+ handleDelete(row)
+ },
+ },
+ ],
+ }
+]);
+
+// 鍒濆鍖栨暟鎹�
+const initData = async () => {
+ await Promise.all([
+ loadDocumentList(),
+ loadReturnList()
+ ]);
+};
+
+// 鍔犺浇鏂囨。鍒楄〃
+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 loadReturnList = async () => {
+ try {
+ tableLoading.value = true;
+
+ // 鏋勫缓鏌ヨ鍙傛暟
+ const query = {
+ page: pagination.currentPage,
+ size: pagination.pageSize,
+ borrowStatus: searchForm.borrowStatus || undefined,
+ borrower: searchForm.borrower || undefined,
+ returner: searchForm.returner || 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 getReturnListPage(query);
+ if (res.code === 200) {
+ returnList.value = res.data.records || [];
+ pagination.total = res.data.total || 0;
+ } else {
+ ElMessage.error(res.msg || "鑾峰彇褰掕繕鍒楄〃澶辫触");
+ returnList.value = [];
+ pagination.total = 0;
+ }
+
+ // 閲嶇疆閫夋嫨鐘舵��
+ selectedRows.value = [];
+ } catch (error) {
+ ElMessage.error("鑾峰彇褰掕繕鍒楄〃澶辫触锛岃閲嶈瘯");
+ returnList.value = [];
+ pagination.total = 0;
+ } finally {
+ tableLoading.value = false;
+ }
+};
+
+// 鏌ヨ
+const handleSearch = () => {
+ pagination.currentPage = 1;
+ loadReturnList();
+};
+
+// 閲嶇疆鏌ヨ
+const handleReset = () => {
+ searchForm.borrowStatus = "";
+ searchForm.borrower = "";
+ searchForm.returner = "";
+ searchForm.dateRange = [];
+ pagination.currentPage = 1;
+ loadReturnList();
+ ElMessage.success("鏌ヨ鏉′欢宸查噸缃�");
+};
+
+// 鎵撳紑褰掕繕寮规
+const openReturnDia = (type, data) => {
+ returnOperationType.value = type;
+ returnDia.value = true;
+
+ if (type === "edit") {
+ // 缂栬緫妯″紡锛屽姞杞界幇鏈夋暟鎹�
+ Object.assign(returnForm, data);
+ // 缂栬緫妯″紡涓嬶紝鏂囨。閫夋嫨鍚庤嚜鍔ㄥ~鍏呭�熼槄浜哄拰搴斿綊杩樻棩鏈�
+ if (returnForm.borrowId) {
+ handleDocumentChange(returnForm.borrowId);
+ }
+ } else {
+ // 鏂板妯″紡锛屾竻绌鸿〃鍗�
+ Object.keys(returnForm).forEach(key => {
+ returnForm[key] = "";
+ });
+ // 璁剧疆榛樿鐘舵��
+ returnForm.borrowStatus = "褰掕繕";
+ // 璁剧疆褰撳墠鏃ユ湡涓哄綊杩樻棩鏈�
+ returnForm.returnDate = new Date().toISOString().split('T')[0];
+ }
+};
+
+// 鍏抽棴褰掕繕寮规
+const closeReturnDia = () => {
+ proxy.$refs.returnFormRef.resetFields();
+ returnDia.value = false;
+};
+
+// 鎻愪氦褰掕繕琛ㄥ崟
+const submitReturnForm = () => {
+ proxy.$refs.returnFormRef.validate(async (valid) => {
+ if (valid) {
+ try {
+ if (returnOperationType.value === "edit") {
+ // 缂栬緫妯″紡锛岃皟鐢ㄥ綊杩樻洿鏂版帴鍙�
+ const res = await reventUpdate({
+ id: returnForm.id,
+ documentationId: returnForm.documentationId,
+ borrower: returnForm.borrower,
+ returner: returnForm.returner,
+ borrowStatus: returnForm.borrowStatus,
+ returnDate: returnForm.returnDate,
+ dueReturnDate: returnForm.dueReturnDate,
+ remark: returnForm.remark
+ });
+
+ if (res.code === 200) {
+ ElMessage.success("缂栬緫鎴愬姛");
+ await loadReturnList();
+ closeReturnDia();
+ } else {
+ ElMessage.error(res.msg || "缂栬緫澶辫触");
+ }
+ } else {
+ // 鏂板妯″紡锛岃皟鐢ㄥ綊杩樻帴鍙�
+ const res = await returnDocument({
+ borrowId: returnForm.borrowId,
+ borrower: returnForm.borrower,
+ returner: returnForm.returner,
+ borrowStatus: returnForm.borrowStatus,
+ returnDate: returnForm.returnDate,
+ dueReturnDate: returnForm.dueReturnDate,
+ remark: returnForm.remark
+ });
+
+ if (res.code === 200) {
+ ElMessage.success("鏂板鎴愬姛");
+ await loadReturnList();
+ closeReturnDia();
+ } else {
+ ElMessage.error(res.msg || "鏂板澶辫触");
+ }
+ }
+ } catch (error) {
+ ElMessage.error("鎿嶄綔澶辫触锛岃閲嶈瘯");
+ }
+ }
+ });
+};
+
+// 鍒犻櫎褰掕繕璁板綍
+const handleDelete = (row) => {
+ ElMessageBox.confirm(
+ `纭畾瑕佸垹闄よ繖鏉″綊杩樿褰曞悧锛焋,
+ "鍒犻櫎鎻愮ず",
+ {
+ confirmButtonText: "纭",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ }
+ ).then(async () => {
+ try {
+ const res = await deleteReturn([row.id]);
+ if (res.code === 200) {
+ ElMessage.success("鍒犻櫎鎴愬姛");
+ await loadReturnList();
+ } 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 deleteReturn(selectedIds);
+ if (res.code === 200) {
+ ElMessage.success("鎵归噺鍒犻櫎鎴愬姛");
+ await loadReturnList();
+ } 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;
+ loadReturnList();
+};
+
+// 澶勭悊鏂囨。閫夋嫨鍙樺寲
+const handleDocumentChange = (documentId) => {
+ if (documentId) {
+ // 鏍规嵁閫夋嫨鐨勬枃妗D锛屼粠鏂囨。鍒楄〃涓煡鎵惧搴旂殑鏂囨。淇℃伅
+ const selectedDoc = documentList.value.find(doc => doc.id === documentId);
+ if (selectedDoc) {
+ // 鑷姩濉厖鍊熼槄浜哄拰搴斿綊杩樻棩鏈�
+ returnForm.borrower = selectedDoc.borrower || selectedDoc.borrowerName || '';
+ returnForm.dueReturnDate = selectedDoc.dueReturnDate || selectedDoc.expectedReturnDate || '';
+ }
+ } else {
+ // 娓呯┖鐩稿叧瀛楁
+ returnForm.borrower = '';
+ returnForm.dueReturnDate = '';
+ }
+};
+
+// 鐢熷懡鍛ㄦ湡
+onMounted(() => {
+ initData();
+});
+</script>
+
+<style scoped>
+.return-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