¶Ô±ÈÐÂÎļþ |
| | |
| | | <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) { |
| | | // æ ¹æ®éæ©çææ¡£IDï¼ä»ææ¡£åè¡¨ä¸æ¥æ¾å¯¹åºçææ¡£ä¿¡æ¯ |
| | | 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> |