| src/router/index.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/build/conpanyFunctionConsult/digitalFileDep/project/productFile/components/dataDialog.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/build/conpanyFunctionConsult/digitalFileDep/project/productFile/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/components/dataDialog.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/router/index.js
@@ -35,7 +35,7 @@ path: 'menuIndex', component: () => import('@/views/work/menuIndex/index'), name: 'MenuIndex', meta: { title: '首页', icon: 'build', affix: true } meta: { title: '首页', icon: 'druid', affix: true } } ] }, src/views/build/conpanyFunctionConsult/digitalFileDep/project/productFile/components/dataDialog.vue
对比新文件 @@ -0,0 +1,299 @@ <template> <div class="notice"> <el-dialog v-model="dialogVisible" :title="state.title" width="600px" :before-close="handleClose" :modal="false" draggable :close-on-press-escape="false" :close-on-click-modal="false" > <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" > <el-form-item label="项目名称:" prop="itemId"> <el-select v-model="state.form.itemId" filterable placeholder="请选择" clearable style="width: 100%" > <el-option v-for="item in state.projectList" :key="item.id" :label="item.itemName" :value="item.id"> </el-option> </el-select> </el-form-item> <el-form-item label="文件编号:" prop="number"> <el-input v-model.trim="state.form.number" :disabled="state.title =='查看'" placeholder="文件编号"></el-input> </el-form-item> <el-form-item label="文件名称:" prop="fileName"> <el-input v-model.trim="state.form.fileName" :disabled="state.title =='查看'" placeholder="文件名称"></el-input> </el-form-item> <!-- <el-form-item label="编写指南:" prop="erdact">--> <!-- <el-input v-model.trim="state.form.erdact" :disabled="state.title =='查看'" placeholder="编写指南"></el-input>--> <!-- </el-form-item>--> <el-form-item label="目录选择:" prop="catalogueId"> <el-cascader style="width: 100%" ref="classifyRef" v-model="state.form.catalogueId" :options="state.catalogueList" :props="state.props" clearable :show-all-levels="false" @change="handleChange" /> </el-form-item> <el-form-item label="文件:" prop="filePath"> <el-upload accept=".doc,.docx,.pdf,.png,.jpg,.jpeg" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip" :limit='state.fileLimit' v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)" > <el-button type="primary">点击上传</el-button> <template #tip> <div class="el-upload__tip">支持上传.doc、.docx、.pdf、图片格式文档,尺寸小于5M,最多可上传1份</div> </template> </el-upload> </el-form-item> </el-form> <template #footer v-if="state.title !='查看'"> <span class="dialog-footer"> <el-button @click="handleClose" size="default">取 消</el-button> <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> </span> </template> </el-dialog> </div> </template> <script setup> import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue' import {ElMessage} from "element-plus"; import {addUser, editUser, getUserById, resetPwd} from "@/api/onlineEducation/user" import {Base64} from "js-base64" import {getCompany} from "@/api/onlineEducation/company"; import {addIndustryTemp, updateIndustryTemp, updateInfoPlatforms} from "@/api/staffManage/staff"; import {getToken} from "@/utils/auth"; import {delPic} from "@/api/onlineEducation/banner"; import {addFile, editFile} from "@/api/qualityManage/range"; import {addProductFile, editProductFile, getProductSet} from "@/api/selfProblems/productFile"; import Cookies from "js-cookie"; const emit = defineEmits(["getList"]); const dialogVisible = ref(false) const superRef = ref() const state = reactive({ title: '', form: { id: null, type: 3, name: '', filePath: '', fileName: '', companyId: null, catalogueId: null, erdact: '', number: '', itemId: null }, formRules:{ number: [{ required: true, message: '请输入文件编号', trigger: 'blur' }], // fileName: [{ required: true, message: '请输入文件名称', trigger: 'blur' }], // filePath: [{ required: true, message: '请上传文件', trigger: 'blur' }], itemId: [{ required: true, message: '请选择项目', trigger: 'blur' }], catalogueId: [{ required: true, message: '请选择目录', trigger: 'blur' }] }, isAdmin: false, props: { value: 'id', label: 'mess', checkStrictly: true, emitPath: false }, companyList: [], industryList: [], uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', header: { Authorization: getToken() }, fileLimit: 1, fileList: [], projectList: [], userId: null, }) onMounted(() => { }); const openDialog = async (type, value,companyId,catalogueList,userId) => { const userInfo = JSON.parse(Cookies.get('userInfo')) state.isAdmin = userInfo.userType === 0; state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' state.form.companyId = companyId state.catalogueList = catalogueList state.form.catalogueId = findDefaultNode(state.catalogueList,'8.5') state.userId = userId if(state.title == '编辑'||state.title == '查看'){ Object.keys(state.form).forEach(key => { if (key in value) { state.form[key] = value[key] } }) if(value.filePath) { const obj = { url: value.filePath, name: value.fileName } state.fileList = [obj] } state.form.itemId = state.form.itemId == 0 ? null : state.form.itemId } await getProjectList() dialogVisible.value = true } const handleChange = ()=> { console.log(state.form.catalogueId,'id') } const getProjectList = async () => { const param = { companyId: state.form.companyId, userId: state.isAdmin ? null : state.userId } const res = await getProductSet(param); if(res.code === 200){ state.projectList = res.data }else{ ElMessage.warning(res.message) } } const findDefaultNode = (list,num)=>{ for (let node of list){ if(node.number == num) return node.id if(node.children){ const res = findDefaultNode(node.children,num) if(res) return res } } return null } const onSubmit = async () => { const valid = await superRef.value.validate(); if(valid){ if(state.title == '新增'){ const {id,...data} = state.form const res = await addProductFile(data) if(res.code == 200){ ElMessage.success(res.message) emit('getList') handleClose() dialogVisible.value = false; }else{ ElMessage.warning(res.message) } }else{ const res = await editProductFile(state.form) if(res.code == 200){ ElMessage.success(res.message) emit('getList') handleClose() dialogVisible.value = false; }else{ ElMessage.warning(res.message) } } } } const handleAvatarSuccess = (res, uploadFile) => { if(res.code == 200){ state.form.fileName = res.data.originName state.form.filePath = res.data.path }else{ state.fileList = [] ElMessage({ type: 'warning', message: '文件上传失败' }) } } const showTip =()=>{ ElMessage({ type: 'warning', message: '超出文件上传数量' }); } const picSize = async (rawFile) => { if(rawFile.size / 1024 / 1024 > 5){ ElMessage({ type: 'warning', message: '文件大小不能超过5M' }); return false } }; const handleRemove = async (file, uploadFiles) => { let path = state.form.filePath; await delPic({path: path}).then(res => { if(res.code == 200){ // ElMessage({ // type: 'success', // message: '文件已删除' // }) state.form.fileName = '' state.form.filePath = '' }else{ ElMessage({ type: 'warning', message: res.message }) } }).catch(() => { state.form.fileName = '' state.form.filePath = '' }); } const handleClose = () => { state.form = { id: null, name: '', type: 3, filePath: '', fileName: '', companyId: null, catalogueId: null, erdact: '', number: '', itemId: null } state.fileList = [] superRef.value.clearValidate(); superRef.value.resetFields() dialogVisible.value = false; } defineExpose({ openDialog }); </script> <style scoped lang="scss"> .notice{ :deep(.el-form .el-form-item__label) { font-size: 15px; } .file { display: flex; flex-direction: column; align-items: flex-start; } } </style> src/views/build/conpanyFunctionConsult/digitalFileDep/project/productFile/index.vue
对比新文件 @@ -0,0 +1,695 @@ <template> <div class="app-container"> <div style="margin-bottom: 10px"> <el-form style="display: flex;flex-wrap: wrap;"> <el-form-item> <el-button type="primary" plain icon="Plus" v-hasPermi="['productFile:add']" @click="openDataDialog('add',{})" >新增</el-button> </el-form-item> <el-form-item label="单位名称:" v-if="data.isAdmin" style="margin-left: 20px"> <el-select v-model="data.queryParams.companyName" filterable remote @change="selectValue" reserve-keyword remote-show-suffix :remote-method="getCompanyList" :loading="loadingCompany" style="width: 240px" > <el-option v-for="item in data.companyList" :key="item.id" :label="item.name" :value="item.name" /> </el-select> </el-form-item> <el-form-item style="margin-left: 15px" label="项目名称:"> <el-select v-model="data.queryParams.itemId" filterable placeholder="请选择" clearable style="width: 100%" @change="changePro" > <el-option v-for="item in data.projectList" :key="item.id" :label="item.itemName" :value="item.id"> </el-option> </el-select> </el-form-item> <el-form-item style="margin-left: 15px"> <el-button type="primary" @click="query">查询</el-button> <el-button type="primary" plain @click="reset">重置</el-button> </el-form-item> <el-form-item> <el-button style="margin-left: 15px" type="primary" @click="exportData" >导出</el-button> </el-form-item> </el-form> </div> <!-- <div class="bottom">--> <!-- <div class="left">--> <!-- <span style="font-weight: 600;font-size: 24px">目录</span>--> <!-- <div class="tree-container tree-hide-scrollbar" v-if="data.treeData">--> <!-- <el-tree--> <!-- ref="treeRef"--> <!-- :data="data.treeData"--> <!-- :props="data.defaultProps"--> <!-- :default-expand-all="true"--> <!-- :expand-on-click-node="false"--> <!-- highlight-current--> <!-- node-key="id"--> <!-- :current-node-key="currentSelectedKey"--> <!-- @node-click="handleNodeClick"--> <!-- >--> <!-- <template #default="{ node,data }">--> <!-- <el-tooltip--> <!-- :content="data.mess"--> <!-- placement="bottom"--> <!-- :disabled="!isTextOverflow(data)"--> <!-- >--> <!-- <span class="tree-text">{{ data.mess }}</span>--> <!-- </el-tooltip>--> <!-- </template>--> <!-- </el-tree>--> <!-- </div>--> <!-- <el-empty v-else description="暂无数据" />--> <!-- </div>--> <!-- <div class="right">--> <el-table style="margin:15px 0;width: 100%" :data="data.dataList" :border="true" > <el-table-column type="index" label="序号" width="80" align="center"></el-table-column> <el-table-column label="目录" prop="catalogueName" align="center" width="130" :show-overflow-tooltip="true" /> <!-- <el-table-column label="项目名称" prop="itemName" align="center" width="130" :show-overflow-tooltip="true" />--> <el-table-column label="文件编号" prop="number" align="center" /> <el-table-column label="文件名称" prop="fileNameSimple" align="center" /> <el-table-column label="文件" prop="filePath" align="center" > <template #default="scope"> <el-link v-if="scope.row.filePath" style="" type="primary" @click="openFile(scope.row.filePath)">{{scope.row.fileName}}</el-link> </template> </el-table-column> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160" > <template #default="scope"> <el-button v-if="scope.row.filePath" link type="primary" @click="downloadFile(scope.row)" v-hasPermi="['productFile:edit']">下载</el-button> <el-button link type="primary" @click="openDataDialog('edit',scope.row)" v-hasPermi="['productFile:edit']">编辑</el-button> <el-button link type="danger" @click="handleDataDelete(scope.row)" v-hasPermi="['productFile:del']">删除</el-button> </template> </el-table-column> </el-table> <div class="pag-container"> <el-pagination v-model:current-page="data.queryParams.pageNum" v-model:page-size="data.queryParams.pageSize" :page-sizes="[10,15,20,25]" layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> </div> <!-- <div style="display: flex;align-items: center;justify-content: right;margin-top: 10px">--> <!-- <el-button v-if="state.form.id && data.isAdmin" type="danger" @click="deleteData">删除</el-button>--> <!-- <el-button v-if="data.isAdmin" type="primary" @click="addData()">保存</el-button>--> <!-- </div>--> <!-- </div>--> <!-- </div>--> <dataDialog ref="dialogRef" @getList="getFileList"></dataDialog> </div> </template> <script setup> import {getCurrentInstance, nextTick, onMounted, reactive, ref, toRefs} from "vue"; import Cookies from "js-cookie"; import {ElMessage, ElMessageBox} from "element-plus"; import {getCompany} from "@/api/onlineEducation/company"; import {getToken} from "@/utils/auth"; import {delPic} from "@/api/onlineEducation/banner"; import dataDialog from "./components/dataDialog.vue" import {delSysClause} from "@/api/staffManage/staff"; import {getCatalogue} from "@/api/qualityManage/catalog"; import { addCatalogueData, addFile, delCatalogueData, delFile, editCatalogueData, getCatalogueData, getFile } from "@/api/qualityManage/range"; import axios from "axios"; import TEditor from "@/components/Tinymce/Tinymce.vue"; import {renderAsync} from "docx-preview"; import {delProductFile, getProductFilePage, getProductSet} from "@/api/selfProblems/productFile"; import {generateWordDocument} from "@/utils/exportWord"; const { proxy } = getCurrentInstance(); const loading = ref(false); const dialogRef = ref(); const treeRef = ref() const dialogRecordRef = ref(); const currentSelectedKey = ref() const loadingCompany = ref(false) const data = reactive({ queryParams: { type: 3, companyId: null, itemId: null, pageNum: 1, pageSize: 10, }, companyList: [], projectList: [], isAdmin: false, userId: null, defaultProps: { children: 'children', label: 'name', }, treeData: [], dataList: [] }); const total = ref(0); const { queryParams } = toRefs(data); onMounted(async () => { const userInfo = JSON.parse(Cookies.get('userInfo')) data.isAdmin = userInfo.userType === 0; data.userId = userInfo.id if(data.isAdmin){ await getCompanyList() data.queryParams.companyId = data.companyList[0].id data.queryParams.companyName = data.companyList[0].name }else { data.queryParams.companyId = userInfo.companyId } await getProjectList() await getList() if(data.treeData.length >0){ // state.form.catalogueId = data.treeData[0].id // currentSelectedKey.value = state.form.catalogueId await getFileList() } }) const getProjectList = async () => { const param = { companyId: data.queryParams.companyId, userId: data.isAdmin ? null : data.userId } const res = await getProductSet(param); if(res.code === 200){ data.projectList = res.data // if(res.data && res.data.length >0 ){ // data.queryParams.itemId = res.data[0].id // } }else{ ElMessage.warning(res.message) } } const getList = async () => { data.treeData = []; loading.value = true; const param = { companyId: data.queryParams.companyId, type : 3 } const res = await getCatalogue(param); if(res.code === 200){ const menu = await handleTree(res.data.data) data.treeData = menu; }else{ ElMessage.warning(res.message) } loading.value = false; } const textMeasureRef = ref(null); const getMeasureElement = () => { if (!textMeasureRef.value) { const el = document.createElement('span'); el.className = 'text-measure-element'; el.style.cssText = ` position: absolute; visibility: hidden; white-space: nowrap; font-size: 14px; /* 匹配实际字体大小 */ `; document.body.appendChild(el); textMeasureRef.value = el; } return textMeasureRef.value; }; // 判断文本是否溢出 const isTextOverflow = (text) => { const measureEl = getMeasureElement(); measureEl.textContent = text.mess; return measureEl.scrollWidth > 300; // 180px 是节点容器实际宽度 }; const handleTree = (val) => { const traverse = (nodes, currentPath = '') => { nodes.forEach((node, index) => { node.mess = `${node.number} ${node.mess}`; // 递归处理子节点(传递当前序号路径) if (node.children && node.children.length) { traverse(node.children, node.number); } }); }; traverse(val); // 从根节点开始遍历 return val; } const getCompanyList = async (val)=>{ if(val){ loadingCompany.value = true; const queryParams = { name: val } const res = await getCompany(queryParams) if (res.code == 200) { loadingCompany.value = false; data.companyList = res.data.list } else { ElMessage.warning(res.message) } }else { loadingCompany.value = true; const queryParams = { pageSize: 10, pageNum: 1, } const res = await getCompany(queryParams) if (res.code == 200) { loadingCompany.value = false; data.companyList = res.data.list } else { ElMessage.warning(res.message) } } } const selectValue = async (val) => { data.companyList.forEach(item => { if(item.name === val){ data.queryParams.companyId = item.id } }) data.projectList = [] data.queryParams.itemId = null await getProjectList() // await getList() // if(data.treeData.length >0 ){ // // state.form.catalogueId = data.treeData[0].id // // currentSelectedKey.value = state.form.catalogueId // await getFileList() // }else { // data.dataList = [] // } } const changePro = () => { } const openDataDialog = (type, value) => { dialogRef.value.openDialog(type, value, data.queryParams.companyId,data.treeData,data.userId); } const handleDataDelete = (val) => { ElMessageBox.confirm( '确定删除此条数据?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning', }) .then( async() => { const res = await delProductFile(val.id) if(res.code == 200){ ElMessage.success('数据删除成功') await getFileList() }else{ ElMessage.warning(res.message) } }) } const handleRecordDelete = (val) => { ElMessageBox.confirm( '确定删除此条数据?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning', }) .then( async() => { const res = await delFile(val.id) if(res.code == 200){ ElMessage.success('数据删除成功') await getFileList() }else{ ElMessage.warning(res.message) } }) } const reset = async () => { data.queryParams = { companyId: data.isAdmin ? null : data.queryParams.companyId, pageNum: 1, pageSize: 10, itemId: null, } data.companyList = []; data.treeData = [] if(data.isAdmin){ await getCompanyList() data.queryParams.companyId = data.companyList[0].id data.queryParams.companyName = data.companyList[0].name } await getProjectList(); await getList(); if(data.treeData.length >0 ){ await getFileList() }else { data.dataList = [] } } const query = async () => { await getList() if(data.treeData.length >0 ){ await getFileList() }else { data.dataList = [] } } const getFileList = async () => { const queryParams = { companyId: data.queryParams.companyId, type: 3, itemId: data.queryParams.itemId, pageSize: data.queryParams.pageSize, pageNum: data.queryParams.pageNum } const res = await getProductFilePage(queryParams) if (res.code == 200) { data.dataList = res.data.list.map(item => { return { ...item, fileNameSimple: item.fileName.split('.')[0] } }) total.value = res.data.total } else { ElMessage.warning(res.message) } } const handleSizeChange = (val) => { data.queryParams.pageSize = val getFileList() } const handleCurrentChange = (val) => { data.queryParams.pageNum = val getFileList() } const openFile = async(path)=>{ const ext = path.split('.').pop().toLowerCase(); if (ext === 'doc') { ElMessageBox.confirm('暂不支持线上预览.doc文件,是否下载查看?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' }).then(() => { window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank'); }).catch(() => { console.log('取消预览') }); return }else if(ext === 'pdf' || ext === 'png' || ext === 'jpg'|| ext === 'jpeg'){ window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank'); }else { try { // 1. 获取文件 const response = await fetch(import.meta.env.VITE_APP_BASE_API + '/' + path); const arrayBuffer = await response.arrayBuffer(); // 2. 创建新窗口 const win = window.open('', '_blank') win.document.write(` <!DOCTYPE html> <html> <head> <title>预览</title> <style> body { margin: 20px; font-family: Arial; } .docx-container { width: 100%; height: 100%; } </style> </head> <body> <div id="container" class="docx-container"></div> </body> </html> `); // 3. 渲染 DOCX await renderAsync(arrayBuffer, win.document.getElementById('container')); } catch (error) { console.error('预览失败:', error); alert(`预览失败: ${error.message}`); } } } const downloadFile = (e)=>{ axios.get(import.meta.env.VITE_APP_BASE_API + '/' +e.filePath,{headers:{'Content-Type': 'application/json','Authorization': `${getToken()}`},responseType: 'blob'}).then(res=>{ if (res) { const link = document.createElement('a') let blob = new Blob([res.data],{type: res.data.type}) link.style.display = "none"; link.href = URL.createObjectURL(blob); // 创建URL link.setAttribute("download", e.fileName); document.body.appendChild(link); link.click(); document.body.removeChild(link); } else { ElMessage({ type: 'warning', message: '文件读取失败' }); } }) } const showFile = (e) => { if(e.target.nodeName === 'A'){ console.log("e",e) e.preventDefault(); const file = { fileUrl: e.target.href, fileName: e.target.innerHTML } axios.get( file.fileUrl,{ headers: { 'Content-Type': 'application/json', 'Authorization':getToken(), }, responseType: 'blob' } ).then(res=>{ if (res) { const link = document.createElement('a') let blob = new Blob([res.data],{type: res.data.type}) link.style.display = "none"; link.href = URL.createObjectURL(blob); // 创建URL link.setAttribute("download", file.fileName); document.body.appendChild(link); link.click(); document.body.removeChild(link); } else { this.$message.error('获取文件失败') } // handleClose(); }) } } const exportData = () => { if(data.dataList.length == 0){ ElMessage.warning('暂无数据!') return } startGeneration() } const templatePath = '/fileProjectExample.docx' const startGeneration = async () => { let table = {} table.name = data.dataList[0].companyName const dataList = data.dataList.map((item,index) => { return{ ...item, caralog: item.catalogueName } }) const caralogList = idGroupToTree(dataList) const itemList = idGroupToTree(data.projectList) table.tableList = caralogList.map((item,index) => { return { ...item, fileList: item.children.map((f,findex) => { return{ ...f, first: findex == 0, } }) } }) try { generateWordDocument(templatePath, table, table.name+'_项目过程管控文件清单.docx'); } catch (error){ ElMessage({ type: 'warning', message: '导出失败' }); } } function idGroupToTree(data) { const groups = data.reduce((map, item) => { map.has(item.caralog) || map.set(item.caralog, []); map.get(item.caralog).push(item); return map; }, new Map()); return Array.from(groups).map(([caralog, items]) => ({ caralog, children: items })); } </script> <style scoped lang="scss"> .app-container{ .pag-container{ float: right; margin-top: 10px; } .bottom{ display: flex; width: auto; height: auto; border: 1px solid #c3c3c3; margin: 20px; .left{ //border-right: 1px solid darkgray; display: flex; min-width: 240px; height: 700px; margin: 20px 20px 20px 50px; flex-direction: column; :deep(.el-tree){ background: none; } :deep(.el-tooltip ) { color: black; text-overflow: ellipsis; overflow: hidden; word-break: break-all; white-space: nowrap; } .tree-text { display: inline-block; max-width: 300px; /* 根据实际容器宽度调整 */ white-space: nowrap; /* 强制不换行 */ overflow: hidden; /* 隐藏溢出 */ text-overflow: ellipsis; /* 显示省略号 */ } /* 可选:移除el-tree默认的节点内边距 */ .el-tree-node__content { padding-right: 5px; } .tree-container { max-width: 600px; margin-top: 20px; height: 100%; max-height: 1200px; box-shadow: 8px 0 15px rgba(0,21,41,0.08); overflow: auto; /* 确保出现滚动条 */ } /* 隐藏默认滚动条 */ .tree-hide-scrollbar::-webkit-scrollbar { width: 5px; background-color: transparent; } .tree-hide-scrollbar::-webkit-scrollbar-thumb { background-color: transparent; border-radius: 4px; } /* 鼠标悬停时显示滚动条 */ .tree-hide-scrollbar:hover::-webkit-scrollbar-thumb { background-color: #e1e1e1; } .tree-hide-scrollbar:hover::-webkit-scrollbar-track { background-color: #f5f7fa; } .tree{ max-width: 600px; margin-top: 20px; height: 800px; overflow-x: hidden; box-shadow: 8px 0 15px rgba(0,21,41,0.08) } } .right{ margin: 20px 20px 20px 10px; flex: 1; min-width: 100px; :deep(.el-form-item__label){ font-weight: 600;font-size: 20px } :deep(.el-form-item__content){ float: right; } .reviewTable { :deep(table){ border: 1px solid #ccc; text-align: center; } :deep(table td){ border: 1px solid #ccc; text-align: center; padding: 0 5px; } :deep(table th){ border: 1px solid #ccc; } } } } } </style> src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/components/dataDialog.vue
@@ -35,6 +35,18 @@ <!-- <el-form-item label="编写指南:" prop="erdact">--> <!-- <el-input v-model.trim="state.form.erdact" :disabled="state.title =='查看'" placeholder="编写指南"></el-input>--> <!-- </el-form-item>--> <el-form-item label="目录选择:" prop="catalogueId"> <el-cascader style="width: 100%" ref="classifyRef" v-model="state.form.catalogueId" :options="state.catalogueList" :props="state.props" clearable :show-all-levels="false" @change="handleChange" /> </el-form-item> <el-form-item label="文件:" prop="filePath"> <el-upload accept=".doc,.docx,.pdf,.png,.jpg,.jpeg" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip" :limit='state.fileLimit' v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)" > <el-button type="primary">点击上传</el-button> @@ -73,6 +85,7 @@ title: '', form: { id: null, type: 2, name: '', filePath: '', fileName: '', @@ -87,8 +100,15 @@ // fileName: [{ required: true, message: '请输入文件名称', trigger: 'blur' }], // filePath: [{ required: true, message: '请上传文件', trigger: 'blur' }], itemId: [{ required: true, message: '请选择项目', trigger: 'blur' }], catalogueId: [{ required: true, message: '请选择目录', trigger: 'blur' }] }, isAdmin: false, props: { value: 'id', label: 'mess', checkStrictly: true, emitPath: false }, companyList: [], industryList: [], uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', @@ -104,14 +124,15 @@ }); const openDialog = async (type, value,companyId,catalogueId,userId) => { const openDialog = async (type, value,companyId,catalogueList,userId) => { const userInfo = JSON.parse(Cookies.get('userInfo')) state.isAdmin = userInfo.userType === 0; state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' state.form.companyId = companyId state.form.catalogueId = catalogueId state.catalogueList = catalogueList // state.form.catalogueId = findDefaultNode(state.catalogueList,'8.5') state.userId = userId state.form.type = 2 if(state.title == '编辑'||state.title == '查看'){ Object.keys(state.form).forEach(key => { if (key in value) { @@ -130,6 +151,11 @@ await getProjectList() dialogVisible.value = true } const handleChange = ()=> { console.log(state.form.catalogueId,'id') } const getProjectList = async () => { const param = { companyId: state.form.companyId, @@ -142,6 +168,17 @@ ElMessage.warning(res.message) } } const findDefaultNode = (list,num)=>{ for (let node of list){ if(node.number == num) return node.id if(node.children){ const res = findDefaultNode(node.children,num) if(res) return res } } return null } const onSubmit = async () => { @@ -226,6 +263,7 @@ const handleClose = () => { state.form = { id: null, type: 2, name: '', filePath: '', fileName: '', src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/index.vue
@@ -2,6 +2,15 @@ <div class="app-container"> <div style="margin-bottom: 10px"> <el-form style="display: flex;flex-wrap: wrap;"> <el-form-item> <el-button type="primary" plain icon="Plus" v-hasPermi="['projectFile:add']" @click="openDataDialog('add',{})" >新增</el-button> </el-form-item> <el-form-item label="单位名称:" v-if="data.isAdmin" style="margin-left: 20px"> <el-select v-model="data.queryParams.companyName" @@ -51,40 +60,36 @@ </el-form-item> </el-form> </div> <div class="bottom"> <div class="left"> <span style="font-weight: 600;font-size: 24px">目录</span> <div class="tree-container tree-hide-scrollbar" v-if="data.treeData"> <el-tree ref="treeRef" :data="data.treeData" :props="data.defaultProps" :default-expand-all="true" :expand-on-click-node="false" highlight-current node-key="id" :current-node-key="currentSelectedKey" @node-click="handleNodeClick" > <template #default="{ node,data }"> <el-tooltip :content="data.mess" placement="bottom" :disabled="!isTextOverflow(data)" > <span class="tree-text">{{ data.mess }}</span> </el-tooltip> </template> </el-tree> </div> <el-empty v-else description="暂无数据" /> </div> <div class="right"> <el-form :model="state.form" size="default" ref="noticeRef" label-position="top" label-width="125px" > <el-form-item label="项目过程管控文件清单" prop="dataList"> <el-button style="margin-bottom: 10px" type="primary" @click="openDataDialog('add',{})">新增</el-button> </el-form-item> <el-table style="margin:15px 0;width: 100%" :data="state.form.dataList" :border="true" > <!-- <div class="bottom">--> <!-- <div class="left">--> <!-- <span style="font-weight: 600;font-size: 24px">目录</span>--> <!-- <div class="tree-container tree-hide-scrollbar" v-if="data.treeData">--> <!-- <el-tree--> <!-- ref="treeRef"--> <!-- :data="data.treeData"--> <!-- :props="data.defaultProps"--> <!-- :default-expand-all="true"--> <!-- :expand-on-click-node="false"--> <!-- highlight-current--> <!-- node-key="id"--> <!-- :current-node-key="currentSelectedKey"--> <!-- @node-click="handleNodeClick"--> <!-- >--> <!-- <template #default="{ node,data }">--> <!-- <el-tooltip--> <!-- :content="data.mess"--> <!-- placement="bottom"--> <!-- :disabled="!isTextOverflow(data)"--> <!-- >--> <!-- <span class="tree-text">{{ data.mess }}</span>--> <!-- </el-tooltip>--> <!-- </template>--> <!-- </el-tree>--> <!-- </div>--> <!-- <el-empty v-else description="暂无数据" />--> <!-- </div>--> <!-- <div class="right">--> <el-table style="margin:15px 0;width: 100%" :data="data.dataList" :border="true" > <el-table-column type="index" label="序号" width="80" align="center"></el-table-column> <el-table-column label="目录" prop="catalogueName" align="center" width="130" :show-overflow-tooltip="true" /> <!-- <el-table-column label="项目名称" prop="itemName" align="center" width="130" :show-overflow-tooltip="true" />--> @@ -103,7 +108,6 @@ </template> </el-table-column> </el-table> </el-form> <div class="pag-container"> <el-pagination v-model:current-page="data.queryParams.pageNum" @@ -119,8 +123,8 @@ <!-- <el-button v-if="state.form.id && data.isAdmin" type="danger" @click="deleteData">删除</el-button>--> <!-- <el-button v-if="data.isAdmin" type="primary" @click="addData()">保存</el-button>--> <!-- </div>--> </div> </div> <!-- </div>--> <!-- </div>--> <dataDialog ref="dialogRef" @getList="getFileList"></dataDialog> </div> </template> @@ -150,7 +154,6 @@ const { proxy } = getCurrentInstance(); const loading = ref(false); const noticeRef = ref(); const dialogRef = ref(); const treeRef = ref() const dialogRecordRef = ref(); @@ -173,23 +176,15 @@ label: 'name', }, treeData: [], dataList: [] }); const state = reactive({ form: { id: '', companyId: null, catalogueId: null, dataList: [], }, }) const dataList = ref([]); const total = ref(0); const { queryParams } = toRefs(data); onMounted(async () => { const userInfo = JSON.parse(Cookies.get('userInfo')) console.log("userInfo",userInfo) data.isAdmin = userInfo.userType === 0; data.userId = userInfo.id @@ -197,13 +192,11 @@ await getCompanyList() data.queryParams.companyId = data.companyList[0].id data.queryParams.companyName = data.companyList[0].name state.form.companyId = data.companyList[0].id }else { data.queryParams.companyId = userInfo.companyId state.form.companyId = userInfo.companyId } await getProjectList() await getList(); await getList() if(data.treeData.length >0){ // state.form.catalogueId = data.treeData[0].id // currentSelectedKey.value = state.form.catalogueId @@ -233,7 +226,7 @@ data.treeData = []; loading.value = true; const param = { companyId: state.form.companyId, companyId: data.queryParams.companyId, type : 3 } const res = await getCatalogue(param); @@ -312,12 +305,9 @@ } } const selectValue = async (val) => { state.form.id = '' state.form.catalogueId = null data.companyList.forEach(item => { if(item.name === val){ data.queryParams.companyId = item.id state.form.companyId = item.id } }) data.projectList = [] @@ -330,81 +320,16 @@ // // currentSelectedKey.value = state.form.catalogueId // await getFileList() // }else { // state.form.dataList = [] // data.dataList = [] // } } const changePro = () => { state.form.id = '' state.form.catalogueId = null } const handleNodeClick = async (val) => { state.form.id = '' state.form.catalogueId = val.id currentSelectedKey.value = val.id await getFileList() } const addData = async () => { if(!state.form.catalogueId){ ElMessage.warning('请先选择左侧目录!') return } const valid = await noticeRef.value.validate(); if(valid){ if(state.form.id){ //编辑 const {dataList,recordList,...data} = state.form const res = await editCatalogueData(data) if(res.code == 200){ ElMessage.success('编辑成功') await getFileList() }else{ ElMessage.warning(res.message) } }else { //新增 const {id,dataList,recordList,...data} = state.form const res = await addCatalogueData(data) if(res.code == 200){ ElMessage.success('新增成功') await getFileList() }else{ ElMessage.warning(res.message) } } } } const openDataDialog = (type, value) => { if(type =='edit'){ state.form.catalogueId = value.catalogueId } if(!state.form.catalogueId){ ElMessage.warning('请先选择左侧目录!') return } dialogRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId,data.userId); nextTick(() => { if(!currentSelectedKey.value){ state.form.catalogueId = null } }) } const openRecordDialog = (type, value) => { if(!state.form.catalogueId){ ElMessage.warning('请先选择左侧目录!') return } dialogRecordRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); dialogRef.value.openDialog(type, value, data.queryParams.companyId,data.treeData,data.userId); } const handleDataDelete = (val) => { @@ -446,25 +371,7 @@ } }) } const deleteData = () => { ElMessageBox.confirm( '确定删除此条数据?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning', }) .then( async() => { const res = await delCatalogueData(state.form.id) if(res.code == 200){ ElMessage.success('数据删除成功') await getFileList() }else{ ElMessage.warning(res.message) } }) } const reset = async () => { data.queryParams = { companyId: data.isAdmin ? null : data.queryParams.companyId, @@ -472,22 +379,19 @@ pageSize: 10, itemId: null, } state.form.id = '' state.form.catalogueId = null data.companyList = []; data.treeData = [] if(data.isAdmin){ await getCompanyList() data.queryParams.companyId = data.companyList[0].id data.queryParams.companyName = data.companyList[0].name state.form.companyId = data.companyList[0].id } await getProjectList(); await getList(); if(data.treeData.length >0 ){ await getFileList() }else { state.form.dataList = [] data.dataList = [] } @@ -497,15 +401,14 @@ if(data.treeData.length >0 ){ await getFileList() }else { state.form.dataList = [] data.dataList = [] } } const getFileList = async () => { const queryParams = { companyId: state.form.companyId, catalogueId: state.form.catalogueId, companyId: data.queryParams.companyId, type: 2, itemId: data.queryParams.itemId, pageSize: data.queryParams.pageSize, @@ -513,7 +416,7 @@ } const res = await getProductFilePage(queryParams) if (res.code == 200) { state.form.dataList = res.data.list.map(item => { data.dataList = res.data.list.map(item => { return { ...item, fileNameSimple: item.fileName.split('.')[0] @@ -629,7 +532,7 @@ } } const exportData = () => { if(state.form.dataList.length == 0){ if(data.dataList.length == 0){ ElMessage.warning('暂无数据!') return } @@ -639,9 +542,9 @@ const templatePath = '/fileProjectExample.docx' const startGeneration = async () => { let table = {} table.name = state.form.dataList[0].companyName table.name = data.dataList[0].companyName const dataList = state.form.dataList.map((item,index) => { const dataList = data.dataList.map((item,index) => { return{ ...item, caralog: item.catalogueName