From 6ed314b393720192db48ec5cf2bbddc480403600 Mon Sep 17 00:00:00 2001 From: xuhuajiao <13476289682@163.com> Date: Thu, 28 May 2026 15:07:31 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A8=E5=8D=95=E4=BC=98=E5=8C=96/=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/statistics/statistics.js | 42 ++ .../archiveUtilize/archiveSearch/index.vue | 1 + .../archiveSearch/module/resultList.vue | 33 +- .../annualReportStatistics/index.vue | 302 -------------- .../index.vue | 2 +- .../dataStatistics/index.vue | 394 ++++++------------ .../roomCollectionStatistics/index.vue | 169 ++++++++ .../usageCountStatistics/index.vue | 156 +++++++ .../utilizeRegistrationStatistics/index.vue | 156 +++++++ src/views/components/category/PreviewForm.vue | 102 ++--- 10 files changed, 732 insertions(+), 625 deletions(-) create mode 100644 src/api/statistics/statistics.js delete mode 100644 src/views/archivesStatistics/annualReportStatistics/index.vue rename src/views/archivesStatistics/{customDefinedStatistics => borrowingStatistics}/index.vue (96%) create mode 100644 src/views/archivesStatistics/roomCollectionStatistics/index.vue create mode 100644 src/views/archivesStatistics/usageCountStatistics/index.vue create mode 100644 src/views/archivesStatistics/utilizeRegistrationStatistics/index.vue diff --git a/src/api/statistics/statistics.js b/src/api/statistics/statistics.js new file mode 100644 index 0000000..c337e97 --- /dev/null +++ b/src/api/statistics/statistics.js @@ -0,0 +1,42 @@ +import request from '@/utils/request' +import qs from 'qs' + +// 总量统计 +// fondsIds=1&fondsIds=2&fondsIds=3&fondsIds=4&years=2024&years=2025&years=2026 +export function FetchTotalStatistics(params) { + return request({ + url: 'api/control/getTotalStatistics' + '?' + qs.stringify(params, { indices: false }), + method: 'get' + }) +} + +// 管理库档案年度 +export function FetchArchivedAllYear(params) { + return request({ + url: 'api/control/getArchivedAllYear' + '?' + qs.stringify(params, { indices: false }), + method: 'get' + }) +} + +// 室藏统计 +export function FetchRoomCollectionStatistics(params) { + return request({ + url: 'api/control/getRoomCollectionStatistics' + '?' + qs.stringify(params, { indices: false }), + method: 'get' + }) +} + +// 删除AI辅助著录 +// export function FetchDelAssistEnter(data) { +// return request({ +// url: 'api/ai/delAssistEnter', +// method: 'post', +// data +// }) +// } + +export default { + FetchTotalStatistics, + FetchArchivedAllYear, + FetchRoomCollectionStatistics +} diff --git a/src/views/archiveUtilize/archiveSearch/index.vue b/src/views/archiveUtilize/archiveSearch/index.vue index 8f2b04f..c76f9e0 100644 --- a/src/views/archiveUtilize/archiveSearch/index.vue +++ b/src/views/archiveUtilize/archiveSearch/index.vue @@ -366,6 +366,7 @@ export default { if (wheresql) { this.isResult = true this.$nextTick(() => { + this.$refs.resultListRef.conditionData = this.conditionData this.$refs.resultListRef.condition = wheresql this.$refs.resultListRef.getSeniorSearch(wheresql) }) diff --git a/src/views/archiveUtilize/archiveSearch/module/resultList.vue b/src/views/archiveUtilize/archiveSearch/module/resultList.vue index b58b9b0..c13846f 100644 --- a/src/views/archiveUtilize/archiveSearch/module/resultList.vue +++ b/src/views/archiveUtilize/archiveSearch/module/resultList.vue @@ -105,7 +105,7 @@
检索 “{{ keywords }}” 成功获得{{ page.total }}条结果
-
检索成功获得{{ page.total }}条结果

高级检索 点击查看检索条件

+
检索成功获得{{ page.total }}条结果

高级检索: {{ advancedSearchDisplayText }}

@@ -259,13 +259,40 @@ export default { resultData: [], classifyLoading: false, resultLoading: false, - condition: '' + condition: '', + conditionData: [] } }, computed: { ...mapGetters([ 'user' - ]) + ]), + // 格式化高级检索条件显示文案 + advancedSearchDisplayText() { + if (!this.conditionData || this.conditionData.length === 0) { + return '' + } + // 如果 condition 是数组,进行格式化 + return this.conditionData.map(item => { + if (item.field) { + // 字段条件 + let keywordDisplay = item.keyWord + if (item.symbol === '包含' || item.symbol === '不包含') { + keywordDisplay = `'%${item.keyWord}%'` + } else if (item.keyWord && isNaN(parseInt(item.keyWord))) { + keywordDisplay = `'${item.keyWord}'` + } + return `${item.field} ${item.symbol} ${keywordDisplay}` + } else if (item.connector) { + // 连接符 + return item.connector + } else if (item.bracket) { + // 括号 + return item.bracket + } + return '' + }).join(' ') + } }, watch: { filterFondsText(val) { diff --git a/src/views/archivesStatistics/annualReportStatistics/index.vue b/src/views/archivesStatistics/annualReportStatistics/index.vue deleted file mode 100644 index 2478f09..0000000 --- a/src/views/archivesStatistics/annualReportStatistics/index.vue +++ /dev/null @@ -1,302 +0,0 @@ - - - - - diff --git a/src/views/archivesStatistics/customDefinedStatistics/index.vue b/src/views/archivesStatistics/borrowingStatistics/index.vue similarity index 96% rename from src/views/archivesStatistics/customDefinedStatistics/index.vue rename to src/views/archivesStatistics/borrowingStatistics/index.vue index f810f2d..03c6d17 100644 --- a/src/views/archivesStatistics/customDefinedStatistics/index.vue +++ b/src/views/archivesStatistics/borrowingStatistics/index.vue @@ -60,7 +60,7 @@ import 'katex/dist/katex.min.css' import markdownText2 from '@/assets/test.md' export default { - name: 'CustomDefinedStatistics', + name: 'BorrowingStatistics', components: { }, data() { return { diff --git a/src/views/archivesStatistics/dataStatistics/index.vue b/src/views/archivesStatistics/dataStatistics/index.vue index e026b86..20607b4 100644 --- a/src/views/archivesStatistics/dataStatistics/index.vue +++ b/src/views/archivesStatistics/dataStatistics/index.vue @@ -1,287 +1,157 @@ diff --git a/src/views/archivesStatistics/roomCollectionStatistics/index.vue b/src/views/archivesStatistics/roomCollectionStatistics/index.vue new file mode 100644 index 0000000..9461852 --- /dev/null +++ b/src/views/archivesStatistics/roomCollectionStatistics/index.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/src/views/archivesStatistics/usageCountStatistics/index.vue b/src/views/archivesStatistics/usageCountStatistics/index.vue new file mode 100644 index 0000000..e37be74 --- /dev/null +++ b/src/views/archivesStatistics/usageCountStatistics/index.vue @@ -0,0 +1,156 @@ + + + + + diff --git a/src/views/archivesStatistics/utilizeRegistrationStatistics/index.vue b/src/views/archivesStatistics/utilizeRegistrationStatistics/index.vue new file mode 100644 index 0000000..e94601b --- /dev/null +++ b/src/views/archivesStatistics/utilizeRegistrationStatistics/index.vue @@ -0,0 +1,156 @@ + + + + + diff --git a/src/views/components/category/PreviewForm.vue b/src/views/components/category/PreviewForm.vue index 290c032..92b8477 100644 --- a/src/views/components/category/PreviewForm.vue +++ b/src/views/components/category/PreviewForm.vue @@ -22,7 +22,7 @@ :span="item.isLine || item.fieldName === 'barcode' ? 24 : 12" > - +
{{ getAutoNameUnknown(node.label) }}
+
+ {{ fieldErrors[item.fieldName] }} +
@@ -62,13 +67,11 @@ " :max="addOrUpdateForm.is_entity === 0 && (item.fieldName === 'doc_qty' || item.fieldName === 'doc_qty_now') ? 0 : null" :min="0" - :validate-event="!isDisabled" @mousewheel.native.prevent @DOMMouseScroll.native.prevent @keyup.enter.native="isRepeatHandle(item)" @input="autoAddZero(item.isFilling, item.fieldName, addOrUpdateForm[item.fieldName], item.fillingDigit)" - @blur="isRepeatHandle(item); syncEntityByQty(item)" > @@ -287,6 +290,7 @@ export default { }, rules: { }, + fieldErrors: {}, isTableType: 1, tableTitle: '字典列表', popoverTableData: [], // popover - popoverTableData @@ -458,29 +462,6 @@ export default { Vue.set(this.loadingStatus, fieldName, true) console.log(`字段${fieldName}加载状态:`, this.loadingStatus[fieldName]) - - // try { - - // // 2. 模拟接口请求(替换为真实接口) - // // const response = await new Promise((resolve) => { - // // setTimeout(() => { - // // resolve({ data: { code: 200, data: `NO-${Date.now().slice(-6)}` }}) - // // }, 2000) - // // }) - - // // // 3. 处理接口结果 - // // if (response.data.code === 200) { - // // this.inputValue = response.data.data - // // this.$message?.success('编号生成成功') || alert('生成成功') - // // } - // } catch (error) { - // console.error('接口请求失败:', error) - // this.$message?.error('生成失败') || alert('生成失败') - // } finally { - // // 4. 无论成功/失败,重置为false - // Vue.set(this.loadingStatus, fieldName, false) - // console.log('请求结束,isMaxLoading重置为:', this.isMaxLoading) - // } }, preUplpadClose() { @@ -494,24 +475,6 @@ export default { this.fileJsonString = null this.newFileCount = 0 }, - // handleSuccessResource(data, fileName, jsonArrayToSend) { - // this.minioPreResult = data - // // console.log('handleSuccessResource', filePath) - // // console.log('handleSuccessResource', fileName) - // // console.log('handleSuccessResource', jsonArrayToSend) - // // console.log('handleSuccessResource', jsonArrayToSend[0].fileJsonString) - // this.fileOriginal = fileName.join(',') - // // this.fileOriginal = fileName - - // const fileJson = JSON.parse(jsonArrayToSend[0].fileJsonString) - // fileJson[0].file_path = '/' + data.filePath - // fileJson[0].is_quote = null - // fileJson[0].last_modified = jsonArrayToSend[0].last_modified - // fileJson[0].ca_id = this.minioPreResult.caId - // fileJson[0].encryption_time = this.minioPreResult.timestamp - // fileJson[0].signature = this.minioPreResult.signature - // this.fileJsonString = JSON.stringify(fileJson) - // }, // 1. 修改文件上传成功处理方法(核心修改) handleSuccessResource(data, fileName, jsonArrayToSend) { console.log('原始fileJsonString:', this.fileJsonString) @@ -1308,6 +1271,9 @@ export default { this.addOrUpdateForm[this.treeCurrentFiled.fieldName] = val.dictionaryName } + // 清除该字段的错误信息 + this.$set(this.fieldErrors, this.treeCurrentFiled.fieldName, '') + // 重复检查 if (this.treeCurrentFiled.isRepeat) { const params = this.isDesFormType !== 'prearchiveLibrary' && this.isDesFormType !== 'mergeFile' @@ -1475,12 +1441,13 @@ export default { } if (item.fieldName === 'fonds_name' && this.isDesFormType !== 'category') { - console.log(' this.selectedCategory.fondName', this.selectedCategory.fondName) this.$set(this.addOrUpdateForm, item.fieldName, this.selectedCategory.fondName) } + console.log('item', item) + console.log('item.isRequired', item.isRequired) const rule = { required: !!item.isRequired, - message: (item.isInputClass === 'text' ? '请输入' : '请选择') + item.fieldCnName, + message: ((item.isInputClass === 'text' || item.isInputClass === 'textarea') ? '请输入' : '请选择') + item.fieldCnName, trigger: item.isInputClass === 'text' ? 'blur' : 'change' } @@ -1503,7 +1470,7 @@ export default { } if (isRequired && value === '') { - rule.message = item.isInputClass === 'text' ? `请输入${item.fieldCnName}` : `请选择${item.fieldCnName}` + rule.message = (item.isInputClass === 'text' || item.isInputClass === 'textarea') ? `请输入${item.fieldCnName}` : `请选择${item.fieldCnName}` callback(new Error(rule.message)) return } @@ -1538,7 +1505,7 @@ export default { } if (isRequired && value === '') { - rule.message = item.isInputClass === 'text' ? `请输入${item.fieldCnName}` : `请选择${item.fieldCnName}` + rule.message = (item.isInputClass === 'text' || item.isInputClass === 'textarea') ? `请输入${item.fieldCnName}` : `请选择${item.fieldCnName}` callback(new Error(rule.message)) return } @@ -1670,15 +1637,28 @@ export default { console.log('this.addOrUpdateForm', this.addOrUpdateForm) // 先验证重复字段 - // if (this.archivesType !== 'edit') { const isRepeatValid = await this.validateRepeatFieldsBeforeSubmit(formName) if (!isRepeatValid) { return false } - // } this.$nextTick(() => { this.$refs[formName].validate((valid, fields) => { + // 检查必填字段是否有值(针对 treeselect 等非 Element UI 原生组件) 保证和el-form的同时进行 + this.fieldErrors = {} + let hasRequiredError = false + const requiredFields = this.formPreviewData.filter(item => item.isRequired) + for (const item of requiredFields) { + const fieldValue = this.addOrUpdateForm[item.fieldName] + if (!fieldValue && fieldValue !== 0 && fieldValue !== false) { + // 设置错误信息 + this.$set(this.fieldErrors, item.fieldName, (item.isInputClass === 'text' || item.isInputClass === 'textarea' ? '请输入' : '请选择') + item.fieldCnName) + hasRequiredError = true + } + } + if (hasRequiredError) { + return false + } if (valid) { this.addOrUpdateForm.archive_no = originalArchiveNo delete this.addOrUpdateForm.id @@ -1701,7 +1681,6 @@ export default { 'fondsAffiliation': this.selectedDocument.fondsId } - console.log('this.fileJsonString', JSON.parse(this.fileJsonString)) console.log('params', params) prearchEdit(params).then(res => { if (res) { @@ -1723,7 +1702,6 @@ export default { 'archivesNo': this.addOrUpdateForm.archive_no, 'jsonString': JSON.stringify(this.addOrUpdateForm) } - console.log('合并成件this.selectedCategory', this.selectedCategory) console.log('params', params) FetchMergeToFile(params).then(res => { if (res.code !== 500) { @@ -1768,7 +1746,6 @@ export default { } else if (this.selectedCategory.arrangeType === 3 && this.activeIndex === 1 && (this.archivesType === 'add' || this.archivesType === 'copy')) { // 在项目下,未整理的文件只属于门类下,不属于任何项目或案卷,所以parentsId === null const fileIds = [] - console.log('this.uploadedFileData', this.uploadedFileData) if (this.uploadedFileData) { if (Array.isArray(this.uploadedFileData)) { this.uploadedFileData.forEach(item => { @@ -2017,10 +1994,6 @@ export default { * @param {String} pickerVal 面板选择的yyyyMMdd格式日期 */ handlePickerChange(item, pickerVal) { - console.log('item', item) - console.log('item.fieldName', item.fieldName) - console.log('pickerVal', pickerVal) - // 选择了具体日期(强制更新,不管是否和旧值相同) if (pickerVal) { this.$set(this.addOrUpdateForm, item.fieldName, pickerVal) @@ -2089,6 +2062,21 @@ export default { ::v-deep .vue-treeselect__control{ height: 32px !important; } + ::v-deep .treeselect-error .vue-treeselect__control { + border-color: #ff4949 !important; + } + ::v-deep .treeselect-error .vue-treeselect__control:hover { + border-color: #ff4949 !important; + } + .treeselect-error-tip { + color: #ff4949 !important; + font-size: 12px !important; + line-height: 1 !important; + padding-top: 4px !important; + position: absolute !important; + top: 100% !important; + left: 0 !important; + } ::v-deep .el-input__prefix { text-align: right; right: 5px !important;