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/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