From db42d47f5692ef64e5436c5a6d29dcb537b44596 Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期一, 26 一月 2026 16:36:13 +0800
Subject: [PATCH] 浪潮对接单点登录:mis调整
---
src/views/fileManagement/bookshelf/index.vue | 688 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 688 insertions(+), 0 deletions(-)
diff --git a/src/views/fileManagement/bookshelf/index.vue b/src/views/fileManagement/bookshelf/index.vue
new file mode 100644
index 0000000..2689900
--- /dev/null
+++ b/src/views/fileManagement/bookshelf/index.vue
@@ -0,0 +1,688 @@
+<template>
+ <div class="sample">
+ <div class="main-content" v-if="!isDetail">
+ <div class="search">
+ <div class="search_thing">
+ <div class="search_label">浠撳簱鍚嶇О锛�</div>
+ <div class="search_input">
+ <el-select v-model="entity.warehouseId" placeholder="閫夋嫨浠撳簱" size="small" @change="warehouseChange">
+ <el-option v-for="item in warehouse" :key="item.id" :label="item.label" :value="item.id">
+ </el-option>
+ </el-select>
+ </div>
+ </div>
+ <div class="search_thing">
+ <div class="search_label">璐ф灦锛�</div>
+ <div class="search_input">
+ <el-select v-model="entity.shelfId" placeholder="閫夋嫨璐ф灦" size="small" @change="handleShelf">
+ <el-option v-for="item in shelf" :key="item.id" :label="item.label" :value="item.id">
+ </el-option>
+ </el-select>
+ </div>
+ </div>
+ <!-- <div class="search_thing">
+ <el-button size="small" @click="handleShelf(entity.shelfId,'')">閲嶇疆</el-button>
+ <el-button size="small" type="primary" @click="handleShelf(entity.shelfId)">鏌ヨ</el-button>
+ </div> -->
+ <div class="btns">
+ <el-button size="small" style="color:#3A7BFA" @click="keepVisible=true">缁存姢</el-button>
+ <el-button size="small" style="color:#3A7BFA" @click="warehouseVisible=true,isEdit=false">娣诲姞浠撳簱</el-button>
+ <el-button size="small" style="color:#3A7BFA" @click="shelvesVisible=true,isEdit=false"
+ :disabled="entity.warehouseId==null">娣诲姞璐ф灦</el-button>
+ </div>
+ </div>
+ <div class="table" v-loading="tableLoading">
+ <table class="tables" style="table-layout:fixed;" v-if="tableList.length>0">
+ <tbody>
+ <tr v-for="(item,index) in tableList" :key="index">
+ <td v-for="(m,i) in item" :key="i" class="content">
+ <h4 v-if="m.row!=undefined">{{ m.row }} - {{ m.col }}</h4>
+ <ul>
+ <el-tooltip
+ effect="dark"
+ placement="top"
+ v-for="(n,j) in m.documentationDtoList"
+ :key="j">
+ <template #content><span>{{ n.docName }}</span>
+ <span> [{{ n.docNumber }}]</span></template>
+ <li class="green"
+ @click="handelDetail(n)">
+ <i></i>
+ <span>{{ n.docName }}</span>
+ <span> [{{ n.docNumber }}] <span :style="{ color: getStatusColor(n.docStatus) }">锛坽{ n.docStatus }}锛�</span></span>
+ </li>
+ </el-tooltip>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td v-for="(item,index) in rowList" :key="index" style="background: ghostwhite;height: 20px;">{{ item }}
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <span v-else style="color: rgb(144, 147, 153);display: inline-block;position: absolute;top: 60%;left: 50%;transform: translate(-50%,-50%);">鏆傛棤鏁版嵁</span>
+ </div>
+ </div>
+ <Detail v-else @hanldeBack="isDetail=false" :current="current" />
+
+ <!-- 搴撲綅缁存姢瀵硅瘽妗� -->
+ <el-dialog v-model="keepVisible" title="搴撲綅缁存姢" width="350px" :append-to-body="true">
+ <el-tree :data="warehouse" ref="tree" node-key="id"
+ highlight-current v-if="keepVisible"
+ empty-text="鏆傛棤鏁版嵁">
+ <template #default="{ node, data }">
+ <div class="custom-tree-node" style="width: 100%;">
+ <el-row style="width: 100%;display: flex;align-items: center;">
+ <el-col :span="14">
+ <span>
+ <el-icon v-if="node.level < 2" class="folder-icon">
+ <FolderOpened />
+ </el-icon>
+ <el-icon v-else class="file-icon">
+ <Document />
+ </el-icon>
+ {{ data.label }}
+ </span>
+ </el-col>
+ <el-col :span="10" v-if="node.level<3">
+ <el-button type="link" size="small" :icon="Edit" @click.stop="handleEdit(data,node.level)">
+ </el-button>
+ <el-button type="danger" size="small" :icon="Delete" @click.stop="handleDelete(data,node.level)">
+ </el-button>
+ </el-col>
+ </el-row>
+ </div>
+ </template>
+ </el-tree>
+ <template #footer>
+ <span class="dialog-footer">
+ <el-button @click="keepVisible = false">鍙� 娑�</el-button>
+ <el-button type="primary" @click="keepVisible = false" >纭� 瀹�</el-button>
+ </span>
+ </template>
+ </el-dialog>
+
+ <!-- 浠撳簱鏂板/淇敼瀵硅瘽妗� -->
+ <el-dialog v-model="warehouseVisible" :title="isEdit?'浠撳簱淇敼':'浠撳簱鏂板'" width="350px">
+ <el-row>
+ <el-col class="search_thing" :span="24">
+ <div class="search_label"><span class="required-span">* </span>浠撳簱鍚嶇О锛�</div>
+ <div class="search_input">
+ <el-input v-model="name" size="small" @keyup.enter="confirmWarehouse"></el-input>
+ </div>
+ </el-col>
+ </el-row>
+ <template #footer>
+ <span class="dialog-footer">
+ <el-button @click="warehouseVisible = false">鍙� 娑�</el-button>
+ <el-button type="primary" @click="confirmWarehouse" :loading="upLoadWarehouse">纭� 瀹�</el-button>
+ </span>
+ </template>
+ </el-dialog>
+
+ <!-- 璐ф灦鏂板/淇敼瀵硅瘽妗� -->
+ <el-dialog v-model="shelvesVisible" :title="isEdit?'璐ф灦淇敼':'璐ф灦鏂板'" width="350px">
+ <el-row>
+ <el-col class="search_thing" :span="24">
+ <div class="search_label"><span class="required-span">* </span>璐ф灦鍚嶇О锛�</div>
+ <div class="search_input">
+ <el-input v-model="shelves.name" size="small"></el-input>
+ </div>
+ </el-col>
+ </el-row>
+ <el-row>
+ <el-col class="search_thing" :span="24">
+ <div class="search_label"><span class="required-span">* </span>璐ф灦灞傛暟锛�</div>
+ <div class="search_input">
+ <el-input v-model="shelves.row" size="small"></el-input>
+ </div>
+ </el-col>
+ </el-row>
+ <el-row>
+ <el-col class="search_thing" :span="24">
+ <div class="search_label"><span class="required-span">* </span>璐ф灦鍒楁暟锛�</div>
+ <div class="search_input">
+ <el-input v-model="shelves.col" size="small"></el-input>
+ </div>
+ </el-col>
+ </el-row>
+ <template #footer>
+ <span class="dialog-footer">
+ <el-button @click="shelvesVisible = false">鍙� 娑�</el-button>
+ <el-button type="primary" @click="confirmShelves" :loading="upLoadShelves">纭� 瀹�</el-button>
+ </span>
+ </template>
+ </el-dialog>
+
+
+ </div>
+</template>
+
+<script setup>
+import { ref, reactive, onMounted, watch } from 'vue'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { Edit, Delete, FolderOpened, Document } from '@element-plus/icons-vue'
+import { getWarehouseList, addWarehouse, updateWarehouse, deleteWarehouse, getWarehouseStructure, addShelf, updateShelf, deleteShelf } from '@/api/fileManagement/bookshelf'
+import Detail from './detail.vue'
+
+// 鍝嶅簲寮忔暟鎹�
+const entity = reactive({
+ warehouseId: null,
+ shelfId: null
+})
+
+const warehouse = ref([])
+const shelf = ref([])
+const keepVisible = ref(false)
+const warehouseVisible = ref(false)
+const shelvesVisible = ref(false)
+const upLoadWarehouse = ref(false)
+const upLoadShelves = ref(false)
+const tableList = ref([])
+const rowList = ref([])
+const value = ref('')
+const name = ref('')
+const shelves = reactive({})
+const isEdit = ref(false)
+const isDetail = ref(false)
+const currentEdit = ref(null)
+const tableLoading = ref(false)
+const current = ref({})
+
+// 妯℃澘寮曠敤
+const organization = ref(null)
+
+// 鐩戝惉鍣�
+watch(isEdit, (newVal) => {
+ if (!newVal) {
+ Object.keys(shelves).forEach(key => delete shelves[key])
+ }
+})
+
+// 鏂规硶
+
+const selectList = async () => {
+ // 杩欓噷闇�瑕佹浛鎹负瀹為檯鐨凙PI璋冪敤
+ const res = await getWarehouseList()
+ warehouse.value = res.data
+
+ if (warehouse.value.length == 0) {
+ entity.warehouseId = ''
+ entity.shelfId = ''
+ tableList.value = []
+ }
+
+
+
+ if (!entity.warehouseId && warehouse.value.length > 0) {
+ entity.warehouseId = warehouse.value[0].id
+ warehouseChange(entity.warehouseId)
+ if (shelf.value.length > 0) {
+ entity.shelfId = shelf.value[0].id
+ handleShelf(entity.shelfId)
+ } else {
+ tableList.value = []
+ }
+ } else if (warehouse.value.length > 0) {
+ warehouseChange(entity.warehouseId)
+ if (shelf.value.length > 0) {
+ entity.shelfId = shelf.value[0].id
+ handleShelf(entity.shelfId)
+ } else {
+ tableList.value = []
+ }
+ }
+}
+
+const confirmWarehouse = () => {
+ if (!name.value) {
+ ElMessage.error('璇峰~鍐欎粨搴撳悕绉�')
+ return
+ }
+ upLoadWarehouse.value = true
+
+ if (currentEdit.value && currentEdit.value.id) {
+ // 淇敼浠撳簱
+ // 杩欓噷闇�瑕佹浛鎹负瀹為檯鐨凙PI璋冪敤
+ updateWarehouse({
+ id: currentEdit.value.id,
+ warehouseName: name.value
+ }).then(res => {
+ upLoadWarehouse.value = false
+ warehouseVisible.value = false
+ currentEdit.value = null
+ ElMessage.success('淇敼鎴愬姛')
+ selectList()
+ name.value = ''
+ warehouseChange(entity.warehouseId)
+ })
+
+ } else {
+ // 鏂板浠撳簱
+ // 杩欓噷闇�瑕佹浛鎹负瀹為檯鐨凙PI璋冪敤
+ addWarehouse({
+ warehouseName: name.value
+ }).then(res => {
+ upLoadWarehouse.value = false
+ warehouseVisible.value = false
+ ElMessage.success('娣诲姞鎴愬姛')
+ selectList()
+ name.value = ''
+ warehouseChange(entity.warehouseId)
+ })
+ }
+}
+
+const confirmShelves = () => {
+ if (!shelves.name) {
+ ElMessage.error('璇峰~鍐欒揣鏋跺悕绉�')
+ return
+ }
+ if (!shelves.row) {
+ ElMessage.error('璇峰~鍐欒揣鏋跺眰鏁�')
+ return
+ }
+ if (!shelves.col) {
+ ElMessage.error('璇峰~鍐欒揣鏋跺垪鏁�')
+ return
+ }
+ upLoadShelves.value = true
+
+ if (currentEdit.value && currentEdit.value.id) {
+ // 淇敼
+ updateShelf({
+ id: currentEdit.value.id,
+ name: shelves.name,
+ row: Number(shelves.row),
+ col: Number(shelves.col),
+ warehouseId: entity.warehouseId
+ }).then(res => {
+ upLoadShelves.value = false
+ shelvesVisible.value = false
+ ElMessage.success('淇敼鎴愬姛')
+ selectList()
+ currentEdit.value = {}
+ }).catch(err => {
+ upLoadShelves.value = false
+ shelvesVisible.value = false
+ ElMessage.error('淇敼澶辫触')
+ })
+
+ } else {
+ // 鏂板
+ // 杩欓噷闇�瑕佹浛鎹负瀹為檯鐨凙PI璋冪敤
+ addShelf({
+ name: shelves.name,
+ row: Number(shelves.row),
+ col: Number(shelves.col),
+ warehouseId: entity.warehouseId
+ }).then(res => {
+ upLoadShelves.value = false
+ shelvesVisible.value = false
+ ElMessage.success('娣诲姞鎴愬姛')
+ selectList()
+ Object.keys(shelves).forEach(key => delete shelves[key])
+ }).catch(err => {
+ upLoadShelves.value = false
+ shelvesVisible.value = false
+ ElMessage.error('娣诲姞澶辫触')
+ })
+ }
+ warehouseChange(entity.warehouseId)
+}
+
+
+
+const handleDelete = (row, level) => {
+ ElMessageBox.confirm('鏄惁鍒犻櫎褰撳墠鏁版嵁?', "璀﹀憡", {
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ type: "warning"
+ }).then(() => {
+ if (level == 1) {
+ // 鍒犻櫎浠撳簱
+ deleteWarehouse([row.id]).then(res => {
+ ElMessage.success('鍒犻櫎鎴愬姛')
+ selectList()
+ })
+ } else {
+ // 鍒犻櫎璐ф灦
+ deleteShelf({
+ id: row.id
+ }).then(res => {
+ ElMessage.success('鍒犻櫎鎴愬姛')
+ selectList()
+ })
+ }
+ warehouseChange(entity.warehouseId)
+ }).catch(() => {})
+}
+
+const handleEdit = (data, level) => {
+ isEdit.value = true
+ if (level == 1) {
+ warehouseVisible.value = true
+ currentEdit.value = data
+ name.value = data.label
+ } else {
+ shelvesVisible.value = true
+ currentEdit.value = data
+ Object.assign(shelves, {
+ name: data.label,
+ row: data.row,
+ col: data.col,
+ warehouseId: data.warehouseId
+ })
+ }
+}
+
+const handelDetail = (row) => {
+ current.value = row
+ isDetail.value = true
+}
+
+// 鏍规嵁鏂囨。鐘舵�佽繑鍥炲搴旂殑棰滆壊
+const getStatusColor = (status) => {
+ if (status === '姝e父') {
+ return '#34BD66' // 缁胯壊
+ } else if (status === '鍊熷嚭') {
+ return '#F56C6C' // 绾㈣壊
+ }
+ return '#606266' // 榛樿棰滆壊
+}
+
+const warehouseChange = (val) => {
+tableList.value = []
+let map = warehouse.value.find(a => {
+ return a && a.id === val ? a : null
+})
+if (map && map.children) {
+ shelf.value = map.children
+ entity.shelfId = ''
+} else {
+ shelf.value = []
+}
+currentEdit.value = null
+}
+
+const handleShelf = async(e) => {
+ if (e) {
+ tableLoading.value = true
+ let data = []
+ const res = await getWarehouseStructure({warehouseGoodsShelvesId:e})
+ if(res.code == 200){
+ data = res.data.map(m=>{
+ m.books = m.documentationDtoList|[]
+ return m
+ })
+ }else{
+ ElMessage.error(res.message)
+ }
+ setTimeout(() => {
+ tableLoading.value = false
+ let set = new Set()
+ tableList.value = []
+ let arr = []
+
+ if (data && data.length > 0) {
+ data.forEach(m => {
+ if (m && m.row && m.col) {
+ set.add(m.col)
+ if (arr.length > 0) {
+ if (arr.find(n => n.row == m.row)) {
+ arr.push(m)
+ } else {
+ tableList.value.push(arr)
+ arr = []
+ arr.push(m)
+ }
+ } else {
+ arr.push(m)
+ }
+ }
+ })
+
+ if (arr.length > 0) {
+ tableList.value.push(arr)
+ }
+ }
+
+ rowList.value = []
+ for (let i = 0; i < set.size; i++) {
+ rowList.value.push(`${i + 1} 鍒梎)
+ }
+ console.log(6666, tableList.value,rowList.value,data)
+ }, 1000)
+ }
+}
+
+
+
+// 鐢熷懡鍛ㄦ湡
+onMounted(() => {
+ selectList()
+})
+</script>
+
+<style scoped>
+ .main-content {
+ width: 100%;
+ height: 100%;
+ padding: 20px;
+ box-sizing: border-box;
+ }
+
+ .title {
+ height: 20px;
+ line-height: 20px;
+ margin-bottom: 20px;
+ }
+
+ .search {
+ background-color: #fff;
+ height: 80px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 0 20px;
+ border-radius: 8px;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ margin-bottom: 20px;
+ }
+
+ .search_thing {
+ display: flex;
+ align-items: center;
+ height: 50px;
+ margin-right: 20px;
+ }
+
+ .search_label {
+ width: 90px;
+ font-size: 14px;
+ text-align: right;
+ color: #606266;
+ font-weight: 500;
+ margin-right: 10px;
+ }
+
+ .search_input {
+ width: 200px;
+ }
+
+ .table {
+ background-color: #fff;
+ width: 100%;
+ height: calc(100% - 100px);
+ padding: 20px;
+ overflow-y: auto;
+ border-radius: 8px;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ }
+
+ .el-form-item {
+ margin-bottom: 16px;
+ }
+
+ .btns {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ }
+
+ .tables {
+ width: 100%;
+ height: 100%;
+ border-collapse: collapse;
+ border: 1px solid #e4e7ed;
+ }
+
+ .tables th {
+ font-size: 14px;
+ border: 1px solid #e4e7ed;
+ background-color: #fafafa;
+ padding: 8px;
+ font-weight: 500;
+ }
+
+ .tables td {
+ font-size: 12px;
+ text-align: center;
+ vertical-align: top;
+ border: 1px solid #e4e7ed;
+ padding: 8px;
+ box-sizing: border-box;
+ height: 120px;
+ background-color: #fff;
+ }
+
+ .tables ul {
+ list-style-type: none;
+ }
+
+ .tables ul li {
+ border-radius: 3px;
+ padding: 4px 10px;
+ box-sizing: border-box;
+ margin-bottom: 5px;
+ font-size: 12px;
+ display: flex;
+ align-items: center;
+ justify-content: start;
+ color: #333333;
+ cursor: pointer;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+
+ .tables h4 {
+ color: #999999;
+ font-size: 14px;
+ font-weight: 400;
+ padding: 6px 0;
+ }
+
+ .tables i {
+ display: inline-block;
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ margin-right: 6px;
+ }
+
+ li:hover {
+ background: rgba(58, 123, 250, 0.18);
+ }
+
+ li:hover i {
+ background: #3A7BFA;
+ }
+
+ li:hover .num {
+ color: #3A7BFA;
+ }
+
+ .green {
+ background: #E0F6EA;
+ }
+
+ .green i {
+ background: #34BD66;
+ }
+
+ .green .num {
+ color: #34BD66;
+ }
+
+ .el-dialog {
+ position: relative;
+ }
+
+ .shaoma {
+ display: flex;
+ align-items: center;
+ font-size: 14px;
+ color: #3A7BFA;
+ position: absolute;
+ top: 23px;
+ right: 54px;
+ cursor: pointer;
+ }
+
+ .folder-icon {
+ color: #409eff;
+ font-size: 16px;
+ margin-right: 6px;
+ }
+
+ .file-icon {
+ color: #67c23a;
+ font-size: 16px;
+ margin-right: 6px;
+ }
+
+ .node_i {
+ color: orange;
+ font-size: 18px;
+ }
+
+ .custom-tree-node .el-button {
+ opacity: 0;
+ }
+
+ .custom-tree-node:hover .el-button {
+ opacity: 1;
+ }
+
+ :deep(.el-loading-mask) {
+ z-index: 10;
+ }
+
+ .required-span {
+ color: #f56c6c;
+ }
+
+ .table-row {
+ border-bottom: 1px solid #e4e7ed;
+ }
+
+ .table-row:last-child {
+ border-bottom: none;
+ }
+
+ .column-header {
+ background-color: #fafafa !important;
+ font-weight: 500;
+ color: #606266;
+ }
+
+ .content {
+ transition: background-color 0.2s ease;
+ }
+
+ .content:hover {
+ background-color: #f5f7fa;
+ }
+</style>
--
Gitblit v1.9.3