【前端】智能库房综合管理系统前端项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

708 lines
25 KiB

<template>
<div v-loading="searchLoading" class="search-main">
<div class="head-container">
<h2 v-if="this.$route.path.indexOf('dashboard') === -1">模糊检索</h2>
<div v-if="isHomeSearch" class="search-header">
<el-checkbox-group v-model="checkList" @change="handleCategoryTypes">
<el-checkbox v-for="item in categoryTypesOptions" :key="item.value" :label="item.value">{{ item.label }}</el-checkbox>
</el-checkbox-group>
</div>
<div class="search-input">
<el-input v-model="keywords" placeholder="请输入内容" class="input-with-select" style="width:50%;" @keyup.enter.native="dimSearch">
<el-select
slot="prepend"
v-model="select"
multiple
collapse-tags
placeholder="请选择"
@change="handleChose"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-button slot="append" icon="el-icon-search" @click="handleSearch" />
</el-input>
</div>
<div v-if=" this.$route.path.indexOf('dashboard') === -1 && select.length" style="width:50%; margin:10px auto; font-size: 12px; color: #fff; text-align: left;">
<p style="margin-left: 20px;">检索条件: <span v-for="(option, index) in select" :key="index">{{ getSelectLabel(option) }}{{ index !== select.length - 1 ? ', ' : '' }}</span></p>
</div>
</div>
<div v-if="this.$route.path.indexOf('dashboard') === -1" class="search-result">
<div v-show="isShow" class="search-title">
<el-button v-if="resNum !== 0" class="lending-btn iconfont" :disabled="selections.length === 0" type="primary" @click="handleLending"><svg-icon icon-class="jieyue" class="svg-arc-style" />借阅</el-button>
<p v-else class="search-res-left">检索结果</p>
<p :class="{'search-res-num' : resNum !== 0 }">本次检索结果共计{{ resNum }}条数据</p>
<el-checkbox v-if="resNum !== 0" v-model="fixedStatusBar">隐藏状态栏</el-checkbox>
</div>
<div v-show="resNum > 0">
<el-table
ref="table"
v-loading="loading"
class="archives-table"
:data="tableData"
style="width: 100%;"
height="calc(100vh - 534px)"
@cell-dblclick="handleDbClick"
@select-all="selectAll"
@row-click="clickRowHandler"
@select="handleCurrentChange"
>
<el-table-column :selectable="checkboxT" type="selection" align="center" width="55" />
<el-table-column prop="category_type" label="门类级别" align="center" min-width="100">
<template slot-scope="scope">
<span v-if="scope.row.category_type === 5" style="width:56px">文件级</span>
<span v-if="scope.row.category_type === 4" style="width:56px">卷内级</span>
<span v-if="scope.row.category_type === 3" style="width:56px">案卷级</span>
</template>
</el-table-column>
<el-table-column prop="category_name" label="门类名称" align="center" show-overflow-tooltip min-width="170" />
<el-table-column prop="child" label="子条数目" align="center" width="100" />
<el-table-column prop="archive_no" label="档号" align="center" show-overflow-tooltip min-width="220" />
<el-table-column prop="maintitle" label="题名" show-overflow-tooltip align="center" min-width="240" />
<el-table-column prop="doc_no" label="发文字号" show-overflow-tooltip width="140" align="center" />
<el-table-column prop="serial_no" label="序号" width="100" align="center" />
<el-table-column prop="fonds_no" label="全宗号" align="center" min-width="180" />
<el-table-column prop="archive_year" label="年度" align="center" min-width="100" />
<el-table-column prop="security_class" label="密级" align="center" min-width="100" />
<el-table-column prop="retention" label="保管期限" align="center" min-width="100" />
<el-table-column prop="arrive_class" label="收发类别" width="140" align="center" />
<el-table-column prop="temp_no" label="临时卷号" show-overflow-tooltip width="140" align="center" />
<el-table-column prop="created_date" label="成文日期" align="center" min-width="180" />
<el-table-column prop="case_name" label="盒名称" show-overflow-tooltip align="center" min-width="200" />
<el-table-column prop="folder_location_details" label="所在位置" align="center" min-width="300">
<template slot-scope="scope">
<span v-if="!scope.row.folder_location_details">-</span>
<span v-else>
<el-tag effect="dark">{{ scope.row.folder_location_details }}</el-tag>
</span>
</template>
</el-table-column>
<!-- 未绑 / 已绑 -->
<el-table-column label="标签" width="100" align="center" :fixed="fixedStatusBar ? false : 'right' ">
<template slot-scope="scope">
<span v-if="scope.row.category_type !== 3" :class="['row-state', 'row-binding', scope.row.tag_no ? 'state-active' : '' ]">{{ scope.row.tag_no ? '已绑': '未绑' }}</span>
</template>
</el-table-column>
<!-- state-active 已装/已入/已借/已绑 -->
<!-- 未装 / 已装 -->
<el-table-column label="装盒" width="100" align="center" :fixed="fixedStatusBar ? false : 'right' ">
<template slot-scope="scope">
<span v-if="scope.row.category_type !== 3" :class="['row-state', 'row-packing', scope.row.case_name ? 'state-active' : '' ]">{{ scope.row.case_name ? '已装': '未装' }}</span>
</template>
</el-table-column>
<!-- is_storage 为空的情况下即没装盒 / 0 未入 / 1 待入 / 2 已入 / 3 待出-->
<!-- <span class="row-state row-warehousing">{{ storageTxt[scope.$index] }}</span> -->
<el-table-column label="入库" width="100" align="center" :fixed="fixedStatusBar ? false : 'right' ">
<template slot-scope="scope">
<span v-if="scope.row.category_type !== 3" :class="['row-state', 'row-warehousing', (storageTxt[scope.$index] === '已入' )? 'state-active' : '' ]">{{ storageTxt[scope.$index] }}</span>
</template>
</el-table-column>
<!-- is_borrow 4 已归还 / 为空 - 未加入待借列表 - 在库 / 2 待借阅(在待借列表/借出确认列表) - 待借 / 1待登记 - 不可借-用“—” 表示 / 3 待归还 - 已借 -->
<el-table-column label="借阅" width="100" align="center" :fixed="fixedStatusBar ? false : 'right' ">
<template slot-scope="scope">
<span v-if="scope.row.category_type !== 3" :class="['row-state', 'row-lending', (borrowTxt[scope.$index] === '已借' )? 'state-active' : '' ]">{{ borrowTxt[scope.$index] }}</span>
</template>
</el-table-column>
</el-table>
<el-pagination :page-size.sync="page.size" :total="page.total" :current-page.sync="page.page" style="margin-top: 8px;" layout="total, prev, pager, next, sizes" @size-change="sizeChangeHandler($event)" @current-change="pageChangeHandler" />
</div>
<!-- 详情 -->
<!-- <detailDialog ref="detailDom" @openCol="openCol" /> -->
<ArchivesInfo ref="archivesInfo" :category-id="categoryId" :arc-id="arcId" />
<!-- 借阅 -->
<el-dialog title="借阅" :visible.sync="lengingVisible" :close-on-click-modal="false" :before-close="handleClose">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<div class="dialog-delt">
<p><span>确定将当前档案加入借阅列表?</span></p>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click.native="handleLendingConfirm">确定</el-button>
</div>
</div>
</el-dialog>
</div>
</div>
</template>
<script>
import ArchivesInfo from '../../archivesManage/archivesList/module/archivesInfo/index'
// import detailDialog from './module/detailDialog.vue'
// , FetchArchivesDetails, FetchArchivesMetadata
import { getCategoryTree } from '@/api/category/category'
import { querySeniorArchives } from '@/api/archivesManage/archivesList'
import { FetchIsExistBorrow, FetchAddArchivesWaitRegister } from '@/api/archivesManage/lendManage'
import CallExternal from '@/api/storeManage/deviceManage/device'
export default {
name: 'ArchivesSearch',
components: { ArchivesInfo },
provide() {
return {
recycleMain: this
}
},
props: {
isHomeSearch: {
type: Boolean,
default: true
}
},
data() {
return {
categoryTree: null,
categoryId: null,
arcId: null,
loading: false,
tableData: [],
selections: [],
storageTxt: [],
borrowTxt: [],
fixedStatusBar: false,
searchLoading: false,
lengingVisible: false,
keywords: '',
select: ['maintitle'],
options: [
{ value: 'maintitle', label: '题名' },
{ value: 'archive_no', label: '档号' },
{ value: 'responsibleby', label: '责任者' },
{ value: 'doc_no', label: '发文字号' },
{ value: 'record_type', label: '文种' },
{ value: 'fonds_no', label: '全宗号' },
{ value: 'archive_year', label: '年度' },
{ value: 'security_class', label: '密级' },
{ value: 'retention', label: '保管期限' },
{ value: 'case_name', label: '盒名称' }
],
page: {
total: 0,
size: 10,
page: 1
},
resNum: 0,
isShow: false,
params: {
criteria: null,
query: null,
page: null,
size: null
},
homeSearchWords: '',
homeSearchSelect: [],
openLocation: null,
deviceData: null,
checkList: [3, 4, 5],
categoryTypesOptions: [
{
label: '案卷级',
value: 3
},
{
label: '卷内级',
value: 4
},
{
label: '文件级',
value: 5
}
]
}
},
async created() {
await this.getDeviceListAll()
},
mounted() {
this.getCateMenu()
if (localStorage.getItem('homeSearchWords') !== null) {
this.keywords = localStorage.getItem('homeSearchWords')
const homeSearchSelect = localStorage.getItem('homeSearchSelect')
const homeSearchSelectArray = JSON.parse(homeSearchSelect)
this.select = homeSearchSelectArray
this.dimSearch()
}
},
methods: {
handleChose(val) {
if (val.length < 1) {
this.$nextTick(() => {
this.select = ['maintitle'] // 重新设置 v-model 的值
})
return
}
},
handleCategoryTypes(val) {
if (val.length < 1) {
this.$nextTick(() => {
this.checkList = [3] // 重新设置 v-model 的值
})
return
}
},
getSelectLabel(option) {
const selectedOption = this.options.find((c) => c.value === option)
return selectedOption ? selectedOption.label : ''
},
checkboxT(row, rowIndex) {
return row.category_type !== 3
},
// table - 全选
selectAll(val) {
this.selections = val
},
// table - 当前选中得row
clickRowHandler(row) {
if (row.category_type !== 3) {
this.$refs.table.clearSelection()
this.$refs.table.toggleRowSelection(row)
this.selections = []
this.selections.push(row)
}
},
// 触发单选
handleCurrentChange(selection, row) {
this.selections = selection
},
getCateMenu() {
getCategoryTree().then(res => {
this.categoryTree = res
console.log('this.categoryTree', this.categoryTree)
})
},
findItemById(data, id) {
if (Array.isArray(data)) {
for (const item of data) {
const result = this.findItemById(item, id)
if (result) return result
}
} else if (typeof data === 'object') {
if (data.id === id) {
return data
} else {
if (data.children && data.children.length > 0) {
return this.findItemById(data.children, id)
}
}
}
return null
},
// 双击详情
handleDbClick(row) {
console.log(this.$refs.archivesInfo)
this.categoryId = row.category_id
this.arcId = row.archives_id
const currentCategory = this.findItemById(this.categoryTree, row.category_id)
console.log(currentCategory.isType)
if (currentCategory.isType === 3) {
this.$refs.archivesInfo.isHasFile = false
this.$refs.archivesInfo.isTidOrBorrow = true
} else {
this.$refs.archivesInfo.isHasFile = true
this.$refs.archivesInfo.isTidOrBorrow = false
}
this.$refs.archivesInfo.isDetailsInfo = true
this.$refs.archivesInfo.detailTitle = '档案详情'
this.$refs.archivesInfo.archivesInfoVisible = true
this.$refs.archivesInfo.archivesTabIndex = 0
this.$refs.archivesInfo.getDetial(row.archives_id, row.category_id)
// const params = {
// 'categoryId': row.category_id,
// 'archivesId': row.archives_id
// }
// FetchArchivesDetails(params).then(res => {
// if (res) {
// const rowData = {}
// res.forEach(item => {
// rowData[item.fieldName] = item.context
// })
// // 是否显示开架按钮
// if (rowData.folder_location !== null) {
// this.openLocation = rowData.folder_location
// this.$refs.detailDom.isShowOpen = true
// } else {
// this.openLocation = null
// this.$refs.detailDom.isShowOpen = false
// }
// this.$refs.detailDom.rowData = rowData
// // 元数据
// FetchArchivesMetadata(params).then(res => {
// this.$refs.detailDom.xmlStr = res
// })
// this.$refs.detailDom.detailVisible = true
// }
// })
},
// 首页 / 搜索页切换操作
handleSearch() {
if (this.select.length === 0) {
this.$message.warning('请选择检索条件!')
return
}
if (this.$route.path.indexOf('dashboard') !== -1) {
this.$router.push('/archivesManage/archivesSearch')
localStorage.setItem('homeSearchWords', this.keywords)
localStorage.setItem('homeSearchSelect', JSON.stringify(this.select))
// localStorage.setItem('homeSearchCheckbox', JSON.stringify([3, 4, 5]))
} else {
this.dimSearch()
}
},
// 搜索
dimSearch() {
this.searchLoading = true
this.loading = true
// const homeSearchCheckbox = JSON.parse(localStorage.getItem('homeSearchCheckbox'))
// if (homeSearchCheckbox) {
// this.checkList = homeSearchCheckbox
// }
const arr = this.keywords.trim() // 去空格
if (arr.length === 0) { // 无关键词时无数据
this.tableData = []
this.resNum = 0
this.isShow = false
this.page.total = 0
this.page.size = 10
this.page.page = 1
localStorage.removeItem('homeSearchWords')
localStorage.removeItem('homeSearchSelect')
this.searchLoading = false
// localStorage.removeItem('homeSearchCheckbox')
} else {
this.params.categoryTypes = this.checkList.join(',')
this.params.criteria = this.select.join(',')
this.params.query = this.keywords.replace(/\s+/ig, ' ')
this.params.page = this.page.page - 1
this.params.size = this.page.size
this.doQuery(this.params)
}
},
// 调用搜索接口
doQuery(params) {
querySeniorArchives(params).then(res => {
this.loading = false
this.searchLoading = false
this.tableData = res.content
this.tableData.forEach((item, index) => {
// 入库状态
if (item.is_storage === 0) {
this.storageTxt[index] = '未入'
if (item.is_borrow === '') {
this.borrowTxt[index] = '-'
}
} else if (item.is_storage === 1) {
this.storageTxt[index] = '待入'
if (item.is_borrow === '') {
this.borrowTxt[index] = '-'
}
} else if (item.is_storage === 2) {
this.storageTxt[index] = '已入'
if (item.is_borrow === '') {
this.borrowTxt[index] = '在库'
}
} else if (item.is_storage === 3) {
this.storageTxt[index] = '待出'
if (item.is_borrow === '') {
this.borrowTxt[index] = '-'
}
} else if (item.is_storage === null) {
this.storageTxt[index] = '未入'
if (item.is_borrow === '') {
this.borrowTxt[index] = '-'
}
}
// 借阅状态
if (item.is_borrow === 1) {
this.borrowTxt[index] = '待借'
} else if (item.is_borrow === 2) {
this.borrowTxt[index] = '待借'
} else if (item.is_borrow === 3) {
this.borrowTxt[index] = '已借'
} else if (item.is_borrow === null) {
this.borrowTxt[index] = '在库'
}
})
this.page.total = res.totalElements
this.resNum = res.totalElements
this.isShow = true
localStorage.removeItem('homeSearchWords')
localStorage.removeItem('homeSearchSelect')
})
},
// 每页条数改变
sizeChangeHandler(e) {
this.loading = true
this.page.size = e
this.page.page = 1
this.params.size = e
this.params.page = 0
this.doQuery(this.params)
this.loading = false
},
// 当前页改变
pageChangeHandler(e) {
this.loading = true
this.page.page = e
this.params.page = e - 1
this.doQuery(this.params)
this.loading = false
},
// 获取密集架相关信息
getDeviceListAll() {
const params = {
sort: 'sequence,asc',
storeroomId: 'D6490DA3D4261E8C26D0E3'
}
CallExternal.getDeviceList(params).then(data => {
data.content.map(item => {
if (item.deviceTypeId.name === '密集架') { // 写死状态
this.deviceData = item
}
})
})
},
// 开架
openCol() {
const loactionArray = this.openLocation.split(' ')
const location = this.openLocation.split(' ')[loactionArray.length - 1]
const pattern = /(\d+)区(\d+)列(\d+)节(\d+)层/
const matches = location.match(pattern)
let areaNumber
let colNumber
let leNumber
let divNumber
let zyNumber
if (matches !== null) {
areaNumber = matches[1]
colNumber = matches[2]
leNumber = matches[3]
divNumber = matches[4]
}
const last_char = location.length - 1
if (location[last_char] === '右') {
zyNumber = '2'
} else {
zyNumber = '1'
}
const params = {
deviceId: this.deviceData.id,
quNo: areaNumber, // 区
colNo: colNumber, // 列
leNo: leNumber, // 节
divNo: divNumber, // 层
zyNo: zyNumber // 左右 1左 2右
}
console.log(params)
CallExternal.FetchCallExternalOpenCol(params).then(res => {
if (res.success && res.success === '0') {
this.$message.success('开架执行成功')
} else {
this.$message.error(res.msg)
}
}).catch((error) => {
console.log(error)
this.$message.error('连接失败')
})
},
// 借阅
handleLending() {
const index = this.selections.findIndex((item) => item.is_storage === 0 || item.is_storage === '' || item.is_storage === 1)
const index2 = this.selections.findIndex((item) => item.is_borrow === 3)
const index3 = this.selections.findIndex((item) => item.is_storage === 3)
if (index !== -1) {
this.$message.error('所选档案还未入库不能借阅')
return false
}
if (index3 !== -1) {
this.$message.error('待出档案不可借阅')
return false
}
if (index2 !== -1) {
this.$message.error('当前档案已借出,还未归还')
return false
}
const params = this.selections.map(item => {
return item.archives_id
})
FetchIsExistBorrow(params).then(data => {
if (data.length === 0) {
this.lengingVisible = true
} else if (data.length === this.selections.length) {
this.$message.error('所选档案不可借阅')
} else {
this.$message.error('部分档案不可借阅')
}
})
},
// 确认借阅
handleLendingConfirm() {
const params = this.selections.map(item => {
return item.archives_id
})
FetchAddArchivesWaitRegister(params).then(data => {
if (data.length !== 0) {
this.$message.success('借阅成功')
this.lengingVisible = false
this.params.categoryTypes = this.checkList.join(',')
this.params.criteria = this.select.join(',')
this.params.query = this.keywords.replace(/\s+/ig, ' ')
this.params.page = this.page.page - 1
this.params.size = this.page.size
this.doQuery(this.params)
this.selections = []
}
})
},
// 关闭
handleClose(done) {
this.lengingVisible = false
done()
}
}
}
</script>
<style lang="scss" scoped>
@import "~@/assets/styles/archives-manage.scss";
.search-main{
width: 100%;
}
.head-container{
padding: 80px 0 30px 0;
text-align: center;
h2{
color: #fff;
margin-bottom: 30px;
}
}
.search-header{
width: 50%;
text-align: left;
margin: 0 auto 10px auto;
::v-deep .el-checkbox-group{
margin-left: 15px;
.el-checkbox__label{
color: #fff;
}
}
}
.search-area {
height: 100%;
margin: 0;
display: flex;
align-items: center;
justify-content: center;
& .search-input {
& .el-select .el-input {
width: 130px;
}
}
}
// 补充不生效
::v-deep .el-input-group {
height: 42px;
& > input {
height: 42px;
border: 1px solid #339cff;
background-color: #021941;
&::placeholder {
color: #fff;
}
}
}
::v-deep .el-input-group__prepend {
width: 125px;
background-color: #339cff;
border: 1px solid #339cff;
border-radius: 34px 0 0 34px;
border-right: 0;
}
::v-deep .el-input__inner {
color: #fff;
}
::v-deep .el-input-group__prepend div.el-select .el-input__inner{
color: #fff;
text-align: center;
}
::v-deep .el-input-group__append {
width: 72px;
left: -20px;
text-align: center;
background-color: #339cff;
border: 1px solid #339cff;
border-radius: 34px;
& i {
font-size: 25px;
color: #fff;
}
}
//检索结果
.search-result{
padding: 0 20px;
color: #fff;
.search-title{
padding:0 20px;
display: flex;
justify-content: space-between;
margin-bottom: 20px;
line-height: 32px;
.search-res-left{
flex: 1;
}
.search-res-num{
flex: 1;
text-align: right;
margin-right: 30px;
}
.el-button{
margin-right: 20px;
}
::v-deep .el-checkbox{
.el-checkbox__label{
color: #fff;
}
}
}
}
::v-deep ::-webkit-scrollbar-corner{
background: transparent;
}
::v-deep .el-select__tags{
max-width: 100% !important;
}
::v-deep .el-tag.el-tag--info{
font-size: 14px;
color: #fff;
background-color: transparent !important;
border: none !important;
margin: 0 auto !important;
.el-tag__close{
color: #fff;
display: none;
}
&:nth-child(2){
display: none;
margin: 6px 0 4px -4px !important;
}
}
.lending-btn{
border-color: #F65163;
background-color: #F65163;
&.is-disabled{
color: #666;
border-color:#7A2831;
background-color: #7A2831;
}
}
</style>