8 changed files with 745 additions and 43 deletions
-
8src/views/archivesManage/managementLibrary/anjuan/tableList.vue
-
2src/views/archivesManage/managementLibrary/mixins/index.js
-
75src/views/archivesManage/managementLibrary/module/collectHeader.vue
-
30src/views/collectReorganizi/collectionLibrary/module/collectHeader.vue
-
101src/views/collectReorganizi/collectionLibrary/module/uploadOriginal/embedUpload.vue
-
35src/views/components/category/PreviewForm.vue
-
461src/views/prearchiveLibrary/advancedSearchModal.vue
-
76src/views/prearchiveLibrary/index.vue
@ -0,0 +1,461 @@ |
|||
<template> |
|||
<el-dialog |
|||
:visible.sync="visible" |
|||
title="高级检索" |
|||
width="1000px" |
|||
:close-on-click-modal="false" |
|||
:modal-append-to-body="false" |
|||
append-to-body |
|||
:before-close="handleClose" |
|||
> |
|||
<div class="advanced-search-modal"> |
|||
<el-form ref="form" inline :model="form" :rules="rules" size="small" label-width="70px"> |
|||
<el-form-item label="字段名" prop="field"> |
|||
<el-select v-model="form.field" value-key="id" style="width: 200px;"> |
|||
<el-option v-for="item in fieldOptions" :key="item.id" :label="item.label" :value="item" /> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item label="运算符" prop="symbol"> |
|||
<el-select v-model="form.symbol" value-key="value" placeholder="请选择" style="width: 200px;"> |
|||
<el-option |
|||
v-for="item in symbolOptions" |
|||
:key="item.value" |
|||
:label="item.label" |
|||
:value="item" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item label="检索值" prop="keyWord" :rules="getKeywordRules"> |
|||
<el-input v-model="form.keyWord" :type="inputType" style="width: 200px;" /> |
|||
</el-form-item> |
|||
</el-form> |
|||
<div class="advanced-btn"> |
|||
<el-button size="mini" @click="addConditionData"><i class="iconfont icon-xinzeng" />新增</el-button> |
|||
<el-button class="filter-refresh" size="mini" icon="el-icon-refresh-left" @click="resetQuery">重置</el-button> |
|||
</div> |
|||
<div class="search-condition"> |
|||
<h4> 检索条件</h4> |
|||
<div class="condition-main"> |
|||
<div class="condition-left"> |
|||
<el-button size="mini" :disabled="currentIndex===null" @click="deltCurrent(currentIndex)"><i class="iconfont icon-shanchu" />删除</el-button> |
|||
<el-button size="mini" icon="el-icon-top" :disabled="currentIndex === 0" @click="moveUp(currentIndex)">上移</el-button> |
|||
<el-button size="mini" icon="el-icon-bottom" :disabled="currentIndex === conditionData.length - 1" @click="moveDown(currentIndex)">下移</el-button> |
|||
</div> |
|||
<ul id="condition-container-modal" class="condition-content"> |
|||
<li v-for="(item, index) in conditionData" :id="'modal-element-id-' + index" :key="index" :class="currentIndex===index ? 'active': ''" @click="selectCurrent(index)"> |
|||
<span style="color:#0348F3">{{ item.field }}</span> |
|||
<span style="color:#ED4A41; margin:0 4px">{{ item.symbol }}</span> |
|||
<span v-if="item.symbol && (item.symbol === '包含'|| item.symbol === '不包含')" class="keyword-style"><i>'%</i>{{ item.keyWord }}<i>%'</i></span> |
|||
<span v-else-if="item.keyWord && isNaN(parseInt(item.keyWord))" class="keyword-style"><i>'</i>{{ item.keyWord }}<i>'</i></span> |
|||
<span v-else class="keyword-style">{{ item.keyWord }}</span> |
|||
<span>{{ item.connector }}</span> |
|||
<span>{{ item.bracket }}</span> |
|||
</li> |
|||
</ul> |
|||
<div class="condition-right"> |
|||
<el-button v-for="(item,index) in connectorList" :key="index" type="primary" size="mini" @click="addConnector(item)">{{ item }}</el-button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div slot="footer" class="dialog-footer"> |
|||
<el-button @click="handleClose">取消</el-button> |
|||
<el-button type="primary" @click="handleSearch">检索</el-button> |
|||
</div> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script> |
|||
import { FetchDoeditDocument } from '@/api/prearchiveLibrary/prearchiveLibrary' |
|||
|
|||
export default { |
|||
name: 'AdvancedSearchModal', |
|||
props: { |
|||
visible: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
selectedDocument: { |
|||
type: Object, |
|||
default: () => ({}) |
|||
}, |
|||
initialConditions: { |
|||
type: Array, |
|||
default: () => [] |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
form: { |
|||
field: null, |
|||
symbol: null, |
|||
keyWord: null |
|||
}, |
|||
fieldOptions: [], |
|||
symbolOptions: [ |
|||
{ |
|||
label: '包含', |
|||
value: 'like' |
|||
}, |
|||
{ |
|||
label: '不包含', |
|||
value: 'not like' |
|||
}, |
|||
{ |
|||
label: '等于', |
|||
value: '=' |
|||
}, |
|||
{ |
|||
label: '不等于', |
|||
value: '!=' |
|||
}, |
|||
{ |
|||
label: '为空', |
|||
value: 'is null' |
|||
}, |
|||
{ |
|||
label: '不为空', |
|||
value: 'is not null' |
|||
}, |
|||
{ |
|||
label: '大于', |
|||
value: '>' |
|||
}, |
|||
{ |
|||
label: '大于等于', |
|||
value: '>=' |
|||
}, |
|||
{ |
|||
label: '小于', |
|||
value: '<' |
|||
}, |
|||
{ |
|||
label: '小于等于', |
|||
value: '<=' |
|||
} |
|||
], |
|||
rules: { |
|||
field: [ |
|||
{ required: true, message: '请选择字段名', trigger: 'change' } |
|||
], |
|||
symbol: [ |
|||
{ required: true, message: '请选择运算符', trigger: 'change' } |
|||
] |
|||
}, |
|||
conditionData: [], |
|||
currentIndex: null, |
|||
connectorList: ['并且', '或者', '(', ')'] |
|||
} |
|||
}, |
|||
computed: { |
|||
getKeywordRules() { |
|||
if ((this.form.symbol && this.form.symbol.label === '为空') || (this.form.symbol && this.form.symbol.label === '不为空')) { |
|||
return [] |
|||
} else { |
|||
return [{ required: true, message: '请输入检索值', trigger: 'blur' }] |
|||
} |
|||
}, |
|||
inputType() { |
|||
if ( |
|||
this.form.symbol && |
|||
(this.form.symbol.label === '大于' || |
|||
this.form.symbol.label === '大于等于' || |
|||
this.form.symbol.label === '小于' || |
|||
this.form.symbol.label === '小于等于') |
|||
) { |
|||
return 'number' |
|||
} else { |
|||
return 'text' |
|||
} |
|||
} |
|||
}, |
|||
watch: { |
|||
visible(newVal) { |
|||
if (!newVal) { |
|||
this.resetQuery() |
|||
this.conditionData = [] |
|||
this.currentIndex = null |
|||
} else { |
|||
this.getFieldCommon() |
|||
if (this.initialConditions && this.initialConditions.length > 0) { |
|||
this.conditionData = JSON.parse(JSON.stringify(this.initialConditions)) |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
mounted() { |
|||
this.getFieldCommon() |
|||
}, |
|||
methods: { |
|||
resetQuery() { |
|||
if (this.$refs.form) { |
|||
this.$refs.form.resetFields() |
|||
} |
|||
}, |
|||
addConditionData() { |
|||
this.$refs.form.validate((valid) => { |
|||
if (valid) { |
|||
const newConditionData = {} |
|||
newConditionData.field = this.form.field.label |
|||
newConditionData.fieldName = this.form.field.value |
|||
newConditionData.symbol = this.form.symbol.label |
|||
newConditionData.symbolCode = this.form.symbol.value |
|||
newConditionData.keyWord = this.form.keyWord |
|||
this.conditionData.push(newConditionData) |
|||
this.$nextTick(() => { |
|||
const container = document.getElementById('condition-container-modal') |
|||
container.scrollTop = container.scrollHeight |
|||
}) |
|||
} |
|||
}) |
|||
}, |
|||
moveUp(index) { |
|||
if (index > 0) { |
|||
const temp = this.conditionData[index] |
|||
this.conditionData[index] = this.conditionData[index - 1] |
|||
this.conditionData[index - 1] = temp |
|||
this.currentIndex = index - 1 |
|||
} |
|||
const targetElement = document.getElementById('modal-element-id-' + this.currentIndex) |
|||
if (targetElement) { |
|||
targetElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' }) |
|||
} |
|||
}, |
|||
moveDown(index) { |
|||
if (index < this.conditionData.length - 1) { |
|||
const temp = this.conditionData[index] |
|||
this.conditionData[index] = this.conditionData[index + 1] |
|||
this.conditionData[index + 1] = temp |
|||
this.currentIndex = index + 1 |
|||
} |
|||
const targetElement = document.getElementById('modal-element-id-' + this.currentIndex) |
|||
if (targetElement) { |
|||
targetElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' }) |
|||
} |
|||
}, |
|||
deltCurrent(index) { |
|||
this.conditionData.splice(index, 1) |
|||
this.currentIndex = null |
|||
}, |
|||
selectCurrent(index) { |
|||
if (this.currentIndex === index) { |
|||
this.currentIndex = null |
|||
} else { |
|||
this.currentIndex = index |
|||
} |
|||
}, |
|||
addConnector(item) { |
|||
const newConditionData = {} |
|||
if (item === '并且' || item === '或者') { |
|||
newConditionData.connector = item |
|||
} else { |
|||
newConditionData.bracket = item |
|||
} |
|||
this.conditionData.push(newConditionData) |
|||
this.$nextTick(() => { |
|||
const container = document.getElementById('condition-container-modal') |
|||
container.scrollTop = container.scrollHeight |
|||
}) |
|||
}, |
|||
getFieldCommon() { |
|||
console.log('selectedDocument', this.selectedDocument) |
|||
const params = { |
|||
documentId: this.selectedDocument.id, |
|||
archivesId: null |
|||
} |
|||
console.log('params', params) |
|||
FetchDoeditDocument(params).then((data) => { |
|||
const showFiledAll = data.showFiled.filter(item => item.isSequence).sort((a, b) => a.isSequence - b.isSequence) |
|||
this.fieldOptions = showFiledAll |
|||
.filter(item => item.fieldName !== 'fonds_no' && item.fieldName !== 'fonds_name') |
|||
.map(item => { |
|||
return { |
|||
id: item.id, |
|||
label: item.fieldCnName, |
|||
value: item.fieldName |
|||
} |
|||
}) |
|||
}) |
|||
}, |
|||
checkConditions(conditionData) { |
|||
let brackets = 0 |
|||
let fields = 0 |
|||
let connectors = 0 |
|||
let previousTokenType = null |
|||
let hasValidConditionBetweenBrackets = false |
|||
|
|||
for (var i = 0; i < conditionData.length; i++) { |
|||
const condition = conditionData[i] |
|||
let currentTokenType = '' |
|||
|
|||
if (condition.hasOwnProperty('bracket')) { |
|||
currentTokenType = 'bracket' |
|||
brackets++ |
|||
} else if (condition.hasOwnProperty('field')) { |
|||
currentTokenType = 'field' |
|||
fields++ |
|||
if (brackets > 0) { |
|||
hasValidConditionBetweenBrackets = true |
|||
} |
|||
} else if (condition.hasOwnProperty('connector')) { |
|||
currentTokenType = 'connector' |
|||
connectors++ |
|||
} |
|||
|
|||
if (previousTokenType && currentTokenType) { |
|||
if ((previousTokenType === 'field' && currentTokenType === 'field') || |
|||
(previousTokenType === 'connector' && currentTokenType === 'connector')) { |
|||
this.$message({ message: '条件之间缺少或且连接符', type: 'error', offset: 8 }) |
|||
return null |
|||
} |
|||
} |
|||
previousTokenType = currentTokenType |
|||
} |
|||
|
|||
if (brackets > 0 && !hasValidConditionBetweenBrackets) { |
|||
this.$message({ message: '请输入有效条件', type: 'error', offset: 8 }) |
|||
return null |
|||
} else if (brackets > 0 && brackets % 2 !== 0) { |
|||
this.$message({ message: '括号不对称', type: 'error', offset: 8 }) |
|||
return null |
|||
} else if (fields === 0) { |
|||
this.$message({ message: '请输入有效条件', type: 'error', offset: 8 }) |
|||
return null |
|||
} else if (fields === 1 || connectors === fields - 1) { |
|||
const wheresql = this.conditionData.map(obj => { |
|||
if (obj.field) { |
|||
if (obj.symbol === '包含' || obj.symbol === '不包含') { |
|||
return obj.fieldName + ' ' + obj.symbolCode + " '%" + obj.keyWord + "%'" |
|||
} else if (obj.keyWord && isNaN(parseInt(obj.keyWord))) { |
|||
return obj.fieldName + ' ' + obj.symbolCode + " '" + obj.keyWord + "'" |
|||
} else { |
|||
return obj.fieldName + ' ' + obj.symbolCode + ' ' + obj.keyWord |
|||
} |
|||
} else if (obj.connector === '并且') { |
|||
return 'and' |
|||
} else if (obj.connector === '或者') { |
|||
return 'or' |
|||
} else { |
|||
return obj.bracket |
|||
} |
|||
}).join(' ') |
|||
return wheresql |
|||
} else { |
|||
this.$message({ message: '条件之间缺少或且连接符', type: 'error', offset: 8 }) |
|||
return null |
|||
} |
|||
}, |
|||
handleSearch() { |
|||
const wheresql = this.checkConditions(this.conditionData) |
|||
console.log('wheresql', wheresql) |
|||
if (wheresql) { |
|||
const conditions = JSON.parse(JSON.stringify(this.conditionData)) |
|||
// 保存到 localStorage |
|||
localStorage.setItem('advancedSearchConditions', JSON.stringify(conditions)) |
|||
localStorage.setItem('advancedSearchSql', wheresql) |
|||
// 发送 SQL 条件和原始条件数据(用于显示文案) |
|||
this.$emit('search', { |
|||
sql: wheresql, |
|||
conditions: conditions |
|||
}) |
|||
} |
|||
}, |
|||
handleClose() { |
|||
this.$emit('update:visible', false) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang='scss' scoped> |
|||
.advanced-search-modal { |
|||
.el-form--inline .el-form-item { |
|||
margin-right: 20px !important; |
|||
} |
|||
.advanced-btn { |
|||
display: flex; |
|||
justify-content: center; |
|||
margin-top: 15px; |
|||
.el-button { |
|||
margin-right: 10px; |
|||
} |
|||
} |
|||
.search-condition { |
|||
padding: 18px; |
|||
margin-top: 20px; |
|||
background: #F6F9FF; |
|||
border-radius: 3px; |
|||
border: 1px dashed #DCDFE6; |
|||
h4 { |
|||
margin: 0 0 17px 0; |
|||
padding-left: 25px; |
|||
color: #0C0E1E; |
|||
font-size: 14px; |
|||
font-weight: bold; |
|||
} |
|||
} |
|||
.condition-main { |
|||
display: flex; |
|||
justify-content: center; |
|||
flex-wrap: nowrap; |
|||
.condition-left { |
|||
display: flex; |
|||
flex-direction: column; |
|||
justify-content: center; |
|||
.el-button { |
|||
width: 76px; |
|||
margin: 5px 0; |
|||
::v-deep i.el-icon-top, |
|||
::v-deep i.el-icon-bottom { |
|||
font-size: 16px; |
|||
font-weight: bold; |
|||
} |
|||
} |
|||
} |
|||
.condition-content { |
|||
width: 500px; |
|||
height: 160px; |
|||
margin: 0 10px; |
|||
padding: 0; |
|||
background: #E6E8ED; |
|||
overflow: hidden; |
|||
overflow-y: scroll; |
|||
li { |
|||
display: flex; |
|||
justify-content: center; |
|||
flex-wrap: nowrap; |
|||
height: 32px; |
|||
line-height: 32px; |
|||
font-size: 14px; |
|||
text-align: center; |
|||
background-color: #fff; |
|||
border-bottom: 1px solid #E6E8ED; |
|||
cursor: default; |
|||
&:hover, |
|||
&:focus, |
|||
&.active { |
|||
background-color: #E8F2FF; |
|||
} |
|||
.keyword-style { |
|||
color: #2ECAAC; |
|||
i { |
|||
font-style: normal; |
|||
color: #545B65; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
.condition-right { |
|||
display: flex; |
|||
flex-direction: column; |
|||
justify-content: center; |
|||
.el-button { |
|||
width: 64px; |
|||
margin: 5px 0; |
|||
background-color: #0348F3; |
|||
color: #fff; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</style> |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue