| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <h2 class="title-border">添加案卷详细记录</h2> |
| | | |
| | | <div v-if="sho"> |
| | | <h2 class="title-border">添加案卷详细记录 {当前录入了{{total}}条}</h2> |
| | | <el-form ref="form" :model="form" :rules="rules" label-width="100px"> |
| | | |
| | | <el-row> |
| | |
| | | <el-form-item label="责任者" prop="creator"> |
| | | <div class="title-search-wrapper"> |
| | | <el-input |
| | | type="textarea" |
| | | rows="1" |
| | | v-model="form.creator" |
| | | placeholder="请输入责任者" |
| | | @input="handleCreatorInput" |
| | |
| | | <el-form-item label="文件题名" prop="title"> |
| | | <div class="title-search-wrapper"> |
| | | <el-input |
| | | type="textarea" |
| | | rows="1" |
| | | v-model="form.title" |
| | | placeholder="请输入文件题名" |
| | | @input="handleTitleInput" |
| | |
| | | |
| | | </div> |
| | | |
| | | |
| | | </div> |
| | | |
| | | <div class="title-border"></div> |
| | | |
| | |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | v-if="sho" |
| | | type="success" |
| | | plain |
| | | icon="el-icon-edit" |
| | |
| | | @click="handleUpdate" |
| | | v-hasPermi="['system:materials:edit']" |
| | | >修改</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | type="warning" |
| | | plain |
| | | icon="el-icon-download" |
| | | size="mini" |
| | | @click="handleExportDir" |
| | | v-hasPermi="['system:materials:list']" |
| | | |
| | | >导出卷内目录</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | |
| | | @click="handleExport" |
| | | v-hasPermi="['system:materials:list']" |
| | | |
| | | >导出</el-button> |
| | | >导出电子文件目录</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | v-if="sho" |
| | | type="danger" |
| | | plain |
| | | icon="el-icon-delete" |
| | |
| | | |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | v-if="sho" |
| | | type="success" |
| | | plain |
| | | icon="el-icon-edit" |
| | |
| | | >导入模板下载</el-button> |
| | | </el-col> |
| | | |
| | | <el-col :span="1.5"> |
| | | <el-col v-if="sho" :span="1.5"> |
| | | |
| | | <el-upload |
| | | action="" |
| | |
| | | |
| | | <el-table v-loading="loading" :data="materialsList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="操作" align="center" width="160" class-name="small-padding "> |
| | | <el-table-column v-if="sho" label="操作" align="center" width="160" class-name="small-padding "> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="mini" |
| | |
| | | </el-table-column> |
| | | <el-table-column label="页号" sortable align="center" prop="pageNumber" /> |
| | | <el-table-column label="备注" align="center" prop="remarks" /> |
| | | <el-table-column label="页次" sortable align="center" prop="pageOrder" /> |
| | | |
| | | <!-- <el-table-column label="页次" sortable align="center" prop="pageOrder" /> |
| | | ---> |
| | | <el-table-column label="所处阶段" sortable align="center" width="180" prop="stage" /> |
| | | <el-table-column label="公开属性" sortable align="center" width="180" prop="publicity" /> |
| | | <el-table-column label="是否为附图及附件" align="center" prop="isAttachment" /> |
| | |
| | | |
| | | <el-table-column label="是否涉密及敏感信息" align="center" prop="isSensitive" /> |
| | | <el-table-column label="是否注销" align="center" prop="isCanceled" /> |
| | | <el-table-column label="格式" align="center" prop="format" /> |
| | | <!-- <el-table-column label="格式" align="center" prop="format" /> |
| | | <el-table-column label="幅面" align="center" prop="sizeType" /> |
| | | <el-table-column label="水平分辨率" align="center" prop="horizontalResolution" /> |
| | | <el-table-column label="垂直分辨率" align="center" prop="verticalResolution" /> |
| | | <el-table-column label="宽度" align="center" prop="width" /> |
| | | <el-table-column label="高度" align="center" prop="height" /> |
| | | <el-table-column label="大小" align="center" prop="fileSize" /> |
| | | <el-table-column label="大小" align="center" prop="fileSize" /> --> |
| | | <el-table-column label="附件及历史发文号" align="center" prop="attachmentHistoryNumbers" /> |
| | | |
| | | |
| | |
| | | <el-row> |
| | | <el-col :span="16"> |
| | | <el-form-item label="责任者" prop="creator"> |
| | | <el-input v-model="forms.creator" placeholder="请输入责任者" /> |
| | | <el-input type="textarea" rows="1" v-model="forms.creator" placeholder="请输入责任者" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | |
| | | </el-row> |
| | | <el-form-item label="文件题名" prop="title"> |
| | | <el-input v-model="forms.title" placeholder="请输入文件题名" /> |
| | | <el-input type="textarea" rows="1" v-model="forms.title" placeholder="请输入文件题名" /> |
| | | </el-form-item> |
| | | <el-form-item label="日期" prop="date"> |
| | | <el-input v-model="forms.date" placeholder="请输入日期 (格式:yyyy-mm-dd)" style="width: 200px;" /> |
| | |
| | | <el-form-item label="材料类型" prop="fileStyle"> |
| | | <el-select |
| | | v-model="forms.fileStyle" |
| | | |
| | | placeholder="请选择材料类型" |
| | | clearable |
| | | @change="handleFileStyleChange2" |
| | | > |
| | | <el-option |
| | | v-for="item in fileStyleOptions" |
| | |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="页号" prop="pageNumber"> |
| | | <el-form-item label="页号" prop="pageNumber" v-if="forms.fileStyle !== '其他材料'"> |
| | | <el-col :span="8"> |
| | | <el-input |
| | | v-model.number="forms.pageNumber" |
| | |
| | | placeholder="请选择日期"> |
| | | </el-date-picker> --> |
| | | </el-form-item> |
| | | <el-form-item label="档案号" prop="fileNumber"> |
| | | <el-input |
| | | v-model="queryParams.fileNumber" |
| | | placeholder="请输入档案号(支持范围搜索,如:B1.3-05-2024-0001~0003)" |
| | | clearable |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <!-- <el-form-item label="页号" prop="pageNumber"> |
| | | <el-col :span="8"> |
| | | <el-input |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | import { getFileCount,islegal, listMaterials, enload, getMaterials, delMaterials, addMaterials, updateMaterials } from "@/api/system/materials" |
| | | import {insertFile, getFileCount,islegal, listMaterials, enload, getMaterials, delMaterials, addMaterials, updateMaterials } from "@/api/system/materials" |
| | | import { getToken } from '@/utils/auth' |
| | | import store from '@/store' |
| | | import { updateStatusById } from "@/api/system/records" |
| | |
| | | name: "Materials", |
| | | data() { |
| | | return { |
| | | //是否显示相关内容 |
| | | sho: true, |
| | | totalPageCount: 0, |
| | | // 记录元素初始位置和状态 |
| | | originalOffsetLeft: 0, |
| | | originalWidth: 0, |
| | |
| | | |
| | | importDialogVisible: false, |
| | | fileList: [], |
| | | uploadUrl: process.env.VUE_APP_BASE_API +'/system/materials/upload/'+this.recordId, // 替换为实际的上传接口 |
| | | uploadUrl: process.env.VUE_APP_BASE_API +'/system/materials/uploads/'+this.recordId, // 替换为实际的上传接口 |
| | | headers: { |
| | | Authorization: 'Bearer ' + getToken() |
| | | }, |
| | | uploadParams: { |
| | | type: 'material' // 自定义上传类型 |
| | | }, |
| | | // 上传状态跟踪 |
| | | uploadSuccessCount: 0, |
| | | uploadFailCount: 0, |
| | | totalUploadFiles: 0, |
| | | // 添加材料类型选项 |
| | | fileStyleOptions: [ |
| | | { value: '文字材料', label: '文字材料' }, |
| | |
| | | { required: true, message: "页号不能为空", trigger: "blur" }, |
| | | { type: 'number', message: '页号必须为数字类型', trigger: ['blur', 'change'] }, |
| | | { pattern: /^[1-9]\d*$/, message: '请输入大于0的正整数', trigger: 'blur' }, |
| | | { validator: (rule, value, callback) => { |
| | | if (this.totalPageCount > 0 && value > this.totalPageCount) { |
| | | callback(new Error(`页号不能超过总页数${this.totalPageCount}`)); |
| | | } else { |
| | | callback(); |
| | | } |
| | | }, trigger: ['blur', 'change'] |
| | | }, |
| | | // { max: 85, message: "最大长度为85个字符", trigger: "blur" } |
| | | ], |
| | | stage: [ |
| | |
| | | created() { |
| | | //const roleId = this.$route.params && this.$route.params.roleId |
| | | const recordId = this.$route.params && this.$route.params.recordId |
| | | |
| | | this.totalPageCount = this.$route.params && this.$route.params.pageCount |
| | | |
| | | this.sho = this.$route.params && this.$route.params.sho |
| | | // 将字符串转换为布尔值 |
| | | this.sho = this.sho === true || this.sho === "true" |
| | | |
| | | //alert(this.totalPageCount) |
| | | //alert(recordId) |
| | | this.recordId = recordId; |
| | | this.uploadUrl = process.env.VUE_APP_BASE_API +'/system/materials/upload/'+this.recordId |
| | |
| | | methods: { |
| | | // 上传失败回调 |
| | | handleError(err, file, fileList) { |
| | | this.$modal.msgError("上传失败: " + err.message) |
| | | // 清除上传列表 |
| | | this.$refs.upload.clearFiles(); |
| | | // 失败计数+1 |
| | | this.uploadFailCount++; |
| | | // 检查是否所有文件都上传完成 |
| | | this.checkUploadComplete(); |
| | | }, |
| | | // 上传成功回调 |
| | | handleSuccess(response, file, fileList) { |
| | | if (response.code === 200) { |
| | | this.$modal.msgSuccess("上传成功") |
| | | // 清除上传列表 |
| | | this.$refs.upload.clearFiles(); |
| | | // 关闭上传对话框 |
| | | this.importDialogVisible = false; |
| | | // 刷新列表数据 |
| | | this.getList(); // 这里可以调用接口关联上传的文件和当前记录 |
| | | //更新档案的状态 |
| | | |
| | | // 成功计数+1 |
| | | this.uploadSuccessCount++; |
| | | } else { |
| | | // alert(234) |
| | | console.log(response) |
| | | this.$modal.msgError(response.msg) |
| | | // 失败计数+1 |
| | | this.uploadFailCount++; |
| | | } |
| | | // 检查是否所有文件都上传完成 |
| | | this.checkUploadComplete(); |
| | | }, |
| | | // 检查所有文件是否上传完成 |
| | | checkUploadComplete() { |
| | | // 当所有文件都上传完成时 |
| | | if (this.uploadSuccessCount + this.uploadFailCount === this.totalUploadFiles) { |
| | | if (this.uploadFailCount === 0) { |
| | | // 所有文件上传成功 |
| | | this.$modal.msgSuccess("所有文件上传成功"); |
| | | } else { |
| | | // 部分文件上传失败 |
| | | this.$modal.msgError(`上传完成,但有 ${this.uploadFailCount} 个文件上传失败`); |
| | | } |
| | | // 清除上传列表 |
| | | this.$refs.upload.clearFiles(); |
| | | // 关闭上传对话框 |
| | | this.importDialogVisible = false; |
| | | // 刷新列表数据 |
| | | this.getList(); |
| | | } |
| | | }, |
| | | // 打开导入对话框 |
| | | // 打开导入对话框 |
| | | handleImport() { |
| | | //生成新的记录 |
| | | insertFile(this.recordId, this.totalPageCount).then(response => { |
| | | console.log(response) |
| | | // alert(3245) |
| | | }) |
| | | this.importDialogVisible = true |
| | | }, |
| | | // 文件移除 |
| | |
| | | |
| | | |
| | | //判断页号与上传上传的文件的页号是不是一一对应的 |
| | | islegal(this.recordId).then(response => { |
| | | console.log(response.data) |
| | | var res = response.data.res |
| | | // islegal(this.recordId).then(response => { |
| | | // console.log(response.data) |
| | | // var res = response.data.res |
| | | // console.log(res) |
| | | //alert(response.data.total) |
| | | if(fileCount!==response.data.total) |
| | | if(fileCount!=this.totalPageCount) |
| | | { |
| | | this.$modal.msgWarning('请选择与记录数一致的文件') |
| | | return |
| | | } |
| | | if(res) |
| | | else |
| | | { |
| | | // 初始化上传状态计数 |
| | | this.uploadSuccessCount = 0; |
| | | this.uploadFailCount = 0; |
| | | this.totalUploadFiles = fileCount; |
| | | // 执行上传 |
| | | this.$refs.upload.submit() |
| | | this.getList() |
| | | } |
| | | else |
| | | { |
| | | this.$modal.msgError("页号不连续,请修改为连续正确的页号!") |
| | | } |
| | | }) |
| | | // else |
| | | // { |
| | | // this.$modal.msgError("页号不连续,请修改为连续正确的页号!") |
| | | // } |
| | | //}) |
| | | |
| | | }, |
| | | clearFileList() { |
| | |
| | | /** 查询【请填写功能名称】列表 */ |
| | | getList() { |
| | | this.loading = true |
| | | |
| | | // 处理档案号搜索逻辑,包括范围搜索 |
| | | const queryParams = { ...this.queryParams } |
| | | |
| | | // 检查是否包含范围搜索符号 |
| | | if (queryParams.fileNumber && queryParams.fileNumber.includes('~')) { |
| | | const rangeParts = queryParams.fileNumber.split('~') |
| | | if (rangeParts.length === 2) { |
| | | // 解析范围搜索参数 |
| | | // 保留原始fileNumber用于其他处理 |
| | | queryParams.fileNumberStart = rangeParts[0].trim() |
| | | queryParams.fileNumberEnd = rangeParts[1].trim() |
| | | } |
| | | } |
| | | |
| | | listMaterials(queryParams).then(response => { |
| | | listMaterials(this.queryParams).then(response => { |
| | | console.log(response) |
| | | this.materialsList = response.data.data |
| | | // 过滤掉visible为0的记录 |
| | | this.materialsList = response.data.data.filter(item => item.visible !== 0) |
| | | this.total = response.data.total |
| | | this.loading = false |
| | | }) |
| | |
| | | this.form.pageNumber = null; |
| | | } |
| | | }, |
| | | // 处理材料类型变化(修改表单) |
| | | handleFileStyleChange2(value) { |
| | | // 当选择'其他材料'时,将页号设置为0 |
| | | if (value === '其他材料') { |
| | | this.forms.pageNumber = null; |
| | | } |
| | | }, |
| | | |
| | | // 表单重置 |
| | | reset() { |
| | |
| | | const materialId = row.materialId || this.ids |
| | | getMaterials(materialId).then(response => { |
| | | this.forms = response.data |
| | | // 如果材料类型是"其他材料",将页号设置为0 |
| | | if (this.forms.fileStyle === '其他材料') { |
| | | this.forms.pageNumber = null; |
| | | } |
| | | this.open = true |
| | | this.title = "修改案卷详细信息" |
| | | }) |
| | |
| | | |
| | | // 保存成功后,光标跳回文件编号输入框 |
| | | this.$nextTick(() => { |
| | | this.$refs.documentNumberInput.focus(); |
| | | this.$refs.documentNumberInput.select(); |
| | | }); |
| | | this.getList() |
| | | }) |
| | | } |
| | | else |
| | | { |
| | | this.$message.error('请填写所有必填字段'); |
| | | }) |
| | | } |
| | | else |
| | | { |
| | | this.$message.error('请填写所有必填字段'); |
| | | |
| | | } |
| | | }) |
| | |
| | | if (this.forms.materialId != null) { |
| | | updateMaterials(this.forms).then(response => { |
| | | this.$modal.msgSuccess("修改成功") |
| | | // 修改成功后,光标跳回文件编号输入框 |
| | | this.$nextTick(() => { |
| | | this.$refs.documentNumberInput.focus(); |
| | | }); |
| | | |
| | | this.open = false |
| | | this.getList() |
| | | }) |
| | |
| | | this.$modal.msgSuccess("删除成功") |
| | | }).catch(() => {}) |
| | | }, |
| | | /** 导出按钮操作 - 支持导出选中行或全部数据 */ |
| | | handleExportDir() { |
| | | // 判断是否有选中的行 |
| | | if (this.ids && this.ids.length > 0) { |
| | | // 显示导出选中行的提示 |
| | | this.$message.info(`正在导出${this.ids.length}条选中的数据...`); |
| | | // 导出选中的行数据 |
| | | this.download('system/materials/exportDir', { |
| | | ids: this.ids.join(','), |
| | | // exportType: 'selected' |
| | | }, `materiaDir_selected_${new Date().getTime()}.xls`) |
| | | } else { |
| | | // 显示导出全部数据的提示 |
| | | this.$message.info('正在导出符合当前查询条件的所有数据...'); |
| | | // 没有选中行时,导出当前查询条件的数据 |
| | | this.download('system/materials/exportDir', { |
| | | ...this.queryParams |
| | | }, `materiaDir_${new Date().getTime()}.xls`) |
| | | } |
| | | }, |
| | | /** 导出按钮操作 - 支持导出选中行或全部数据 */ |
| | | handleExport() { |
| | | // 判断是否有选中的行 |
| | |
| | | this.download('system/materials/export', { |
| | | ids: this.ids.join(','), |
| | | // exportType: 'selected' |
| | | }, `materials_selected_${new Date().getTime()}.xlsx`) |
| | | }, `materials_selected_${new Date().getTime()}.xls`) |
| | | } else { |
| | | // 显示导出全部数据的提示 |
| | | this.$message.info('正在导出符合当前查询条件的所有数据...'); |
| | | // 没有选中行时,导出当前查询条件的数据 |
| | | this.download('system/materials/export', { |
| | | ...this.queryParams |
| | | }, `materials_${new Date().getTime()}.xlsx`) |
| | | }, `materials_${new Date().getTime()}.xls`) |
| | | } |
| | | }, |
| | | |
| | |
| | | { |
| | | this.download('/system/materials/model', { |
| | | |
| | | }, `materials_${new Date().getTime()}.xlsx`) |
| | | }, `materials_${new Date().getTime()}.xls`) |
| | | }, |
| | | /** 导入操作*/ |
| | | async handleImportData({file}){ |
| | |
| | | const rect = fixedRow.getBoundingClientRect(); |
| | | const parentRect = fixedRow.parentNode.getBoundingClientRect(); |
| | | |
| | | // 检查元素是否应该进入悬浮状态 |
| | | if (rect.top <= 0) { |
| | | // 记录元素的原始位置(相对于文档顶部的位置) |
| | | if (!this.originalTop) { |
| | | this.originalTop = rect.top + window.pageYOffset; |
| | | } |
| | | |
| | | // 检查元素是否应该进入悬浮状态(当滚动位置超过元素原始位置时) |
| | | if (window.pageYOffset >= this.originalTop) { |
| | | // 只在不在floating状态时添加,避免重复操作 |
| | | if (!fixedRow.classList.contains('floating')) { |
| | | // 记录元素原始的左偏移量(相对于父容器) |
| | |
| | | } |
| | | } |
| | | } else { |
| | | // 当元素回到视口顶部以上时,移除悬浮状态,恢复到文档流中 |
| | | // 当滚动位置回到元素原始位置以上时,移除悬浮状态,恢复到文档流中 |
| | | if (fixedRow.classList.contains('floating')) { |
| | | // 移除floating类 |
| | | fixedRow.classList.remove('floating'); |
| | |
| | | background-color: #fff; |
| | | } |
| | | </style> |
| | | |
| | | |
| | | |
| | | |