From 9e4ea4987852902539e91ec438150c1deaa89742 Mon Sep 17 00:00:00 2001 From: zhouwx <1175765986@qq.com> Date: 星期五, 25 七月 2025 17:15:04 +0800 Subject: [PATCH] 修改 --- src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectSet/index.vue | 189 +++++++++++++++++ src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectSet/components/editDialog.vue | 202 ++++++++++++++++++ src/api/selfProblems/productFile.js | 41 +++ src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/components/dataDialog.vue | 49 ++++ src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/index.vue | 121 +++++++++- public/fileProjectExample.docx | 0 6 files changed, 581 insertions(+), 21 deletions(-) diff --git a/public/fileProjectExample.docx b/public/fileProjectExample.docx index 3b74f42..2fc8502 100644 --- a/public/fileProjectExample.docx +++ b/public/fileProjectExample.docx Binary files differ diff --git a/src/api/selfProblems/productFile.js b/src/api/selfProblems/productFile.js index 28cbe39..fb45fa4 100644 --- a/src/api/selfProblems/productFile.js +++ b/src/api/selfProblems/productFile.js @@ -41,3 +41,44 @@ }) } +//项目 +export function getProductSetPage(params) { + return request({ + url: '/quality-target/item/list', + method: 'get', + params: params + }) +} +export function getProductSet(params) { + return request({ + url: '/quality-target/item/listAll', + method: 'get', + params: params + }) +} + + +export function addProductSet(data) { + return request({ + url: '/quality-target/item/insert', + method: 'post', + data: data + }) +} + +export function editProductSet(params) { + return request({ + url: `/quality-target/item/update`, + method: 'post', + data: params + }) +} + +export function delProductSet(data) { + return request({ + url: `/quality-target/item/deleted?itemId=${data}`, + method: 'get' + }) +} + + diff --git a/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/components/dataDialog.vue b/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/components/dataDialog.vue index c9a3af0..5edbdec 100644 --- a/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/components/dataDialog.vue +++ b/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/components/dataDialog.vue @@ -9,6 +9,21 @@ :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> @@ -46,7 +61,8 @@ import {getToken} from "@/utils/auth"; import {delPic} from "@/api/onlineEducation/banner"; import {addFile, editFile} from "@/api/qualityManage/range"; -import {addProductFile, editProductFile} from "@/api/selfProblems/productFile"; +import {addProductFile, editProductFile, getProductSet} from "@/api/selfProblems/productFile"; +import Cookies from "js-cookie"; const emit = defineEmits(["getList"]); const dialogVisible = ref(false) @@ -61,12 +77,14 @@ companyId: null, catalogueId: null, erdact: '', - number: '' + 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' }], }, isAdmin: false, companyList: [], @@ -76,16 +94,21 @@ Authorization: getToken() }, fileLimit: 1, - fileList: [] + fileList: [], + projectList: [], + userId: null, }) onMounted(() => { }); -const openDialog = async (type, value,companyId,catalogueId) => { +const openDialog = async (type, value,companyId,catalogueId,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.userId = userId state.form.type = 2 if(state.title == '编辑'||state.title == '查看'){ Object.keys(state.form).forEach(key => { @@ -100,8 +123,23 @@ } state.fileList = [obj] } + state.form.itemId = state.form.itemId == 0 ? null : state.form.itemId } + await getProjectList() dialogVisible.value = true +} +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 onSubmit = async () => { @@ -192,7 +230,8 @@ companyId: null, catalogueId: null, erdact: '', - number: '' + number: '', + itemId: null } state.fileList = [] superRef.value.clearValidate(); diff --git a/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/index.vue b/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/index.vue index bc5f160..e0f0bf2 100644 --- a/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/index.vue +++ b/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/index.vue @@ -22,6 +22,26 @@ /> </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" @@ -67,6 +87,7 @@ <el-table style="margin:15px 0;width: 100%" :data="state.form.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="fileName" align="center" > @@ -113,7 +134,7 @@ import axios from "axios"; import TEditor from "@/components/Tinymce/Tinymce.vue"; import {renderAsync} from "docx-preview"; -import {delProductFile, getProductFilePage} from "@/api/selfProblems/productFile"; +import {delProductFile, getProductFilePage, getProductSet} from "@/api/selfProblems/productFile"; import {generateWordDocument} from "@/utils/exportWord"; const { proxy } = getCurrentInstance(); @@ -128,9 +149,12 @@ queryParams: { type: 3, companyId: null, + itemId: null, }, companyList: [], + projectList: [], isAdmin: false, + userId: null, defaultProps: { children: 'children', label: 'name', @@ -154,6 +178,8 @@ const userInfo = JSON.parse(Cookies.get('userInfo')) console.log("userInfo",userInfo) data.isAdmin = userInfo.userType === 0; + data.userId = userInfo.id + if(data.isAdmin){ await getCompanyList() data.queryParams.companyId = data.companyList[0].id @@ -163,6 +189,7 @@ data.queryParams.companyId = userInfo.companyId state.form.companyId = userInfo.companyId } + await getProjectList() await getList(); if(data.treeData.length >0){ // state.form.catalogueId = data.treeData[0].id @@ -171,7 +198,24 @@ } + }) +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; @@ -263,15 +307,23 @@ state.form.companyId = item.id } }) - await getList() - if(data.treeData.length >0 ){ - // state.form.catalogueId = data.treeData[0].id - // currentSelectedKey.value = state.form.catalogueId - await getFileList() - }else { - state.form.dataList = [] - } + 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 { + // state.form.dataList = [] + // } + +} +const changePro = () => { + state.form.id = '' + state.form.catalogueId = null } const handleNodeClick = async (val) => { @@ -318,11 +370,21 @@ } } 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); + 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){ @@ -392,23 +454,47 @@ } const reset = async () => { data.queryParams = { - companyId: '', + companyId: data.isAdmin ? null : data.queryParams.companyId, pageNum: 1, 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(); - await getCompanyList() - data.queryParams.companyId = data.companyList[0].id - data.queryParams.companyName = data.companyList[0].name - state.form.companyId = data.companyList[0].id + if(data.treeData.length >0 ){ + await getFileList() + }else { + state.form.dataList = [] + } + + +} +const query = async () => { + await getList() + if(data.treeData.length >0 ){ + await getFileList() + }else { + state.form.dataList = [] + } + } const getFileList = async () => { const queryParams = { companyId: state.form.companyId, catalogueId: state.form.catalogueId, - type: 2 + type: 2, + itemId: data.queryParams.itemId } const res = await getProductFilePage(queryParams) if (res.code == 200) { @@ -534,6 +620,8 @@ } }) const caralogList = idGroupToTree(dataList) + const itemList = idGroupToTree(data.projectList) + table.tableList = caralogList.map((item,index) => { return { ...item, @@ -565,6 +653,7 @@ children: items })); } + </script> <style scoped lang="scss"> diff --git a/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectSet/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectSet/components/editDialog.vue new file mode 100644 index 0000000..b706a2f --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectSet/components/editDialog.vue @@ -0,0 +1,202 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + :title="title" + width="550px" + :before-close="handleClose" + :close-on-press-escape="false" + :close-on-click-modal="false" + > + <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" > + <el-form-item label="企业名称:" prop="companyId" v-if="state.isAdmin"> + <el-select v-model="state.form.companyId" filterable placeholder="请选择" @change="selectValueCom" clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin"> + <el-option + v-for="item in state.companyList" + :key="item.id" + :label="item.name" + :value="item.id"> + </el-option> + </el-select> + </el-form-item> + <el-form-item label="项目名称:" prop="itemName" > + <el-input v-model="state.form.itemName" placeholder="项目名称" :disabled="title === '查看'"/> + </el-form-item> + <el-form-item label="项目参与人员:" prop="users" > + <el-select + clearable + multiple + collapse-tags + collapse-tags-tooltip + v-model="state.students" + :disabled="state.title =='查看'" + filterable + style="width: 100%" + > + <el-option + v-for="item in state.peopleList" + :key="item.id" + :label="item.name" + :value="item.id" + /> + </el-select> + </el-form-item> + </el-form> + <template #footer v-if="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 {nextTick, onMounted, reactive, ref, toRefs} from 'vue' +import {ElMessage} from "element-plus"; +import Cookies from "js-cookie"; +import {getUser} from "@/api/onlineEducation/user"; +import {addProductSet, editProductSet} from "@/api/selfProblems/productFile"; + +const dialogVisible = ref(false); +const title = ref(""); +const busRef = ref(); +const length = ref() +const emit = defineEmits(["getList"]); +const state = reactive({ + form: { + id: '', + companyId: null, + itemName: '', + users: [] + }, + formRules:{ + companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], + itemName: [{ required: true, message: '请输入项目名称', trigger: 'blur' }], + users: [{ required: true, message: '请选择项目参与人员', trigger: 'blur' }], + }, + isAdmin: false, + companyList: [], + students: [] +}) + +onMounted(() => { + +}) +const openDialog = async (type, value,companyList) => { + const userInfo = JSON.parse(Cookies.get('userInfo')) + state.isAdmin = userInfo.userType === 0; + if(state.isAdmin){ + state.companyList = companyList + } + title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ; + if(type === 'edit' || type === 'review') { + state.form = JSON.parse(JSON.stringify(value)); + state.students = state.form.users.map(i => i.userId) + } + await getPeopleList() + dialogVisible.value = true; +} + +const onSubmit = async () => { + state.form.users = state.students.map(item => { + return { + userId: item + } + }) + const valid = await busRef.value.validate(); + if(!state.isAdmin){ + const userInfo = JSON.parse(Cookies.get('userInfo')) + state.form.companyId = userInfo.companyId + } + if(valid){ + if(title.value === '新增'){ + const {id, ...data} = JSON.parse(JSON.stringify(state.form)) + const res = await addProductSet(data) + if(res.code === 200){ + ElMessage({ + type: 'success', + message: '新增成功' + }); + }else{ + ElMessage.warning(res.message) + } + emit("getList") + busRef.value.clearValidate(); + reset(); + dialogVisible.value = false; + }else if(title.value === '编辑'){ + const {...data} = JSON.parse(JSON.stringify(state.form)) + const res = await editProductSet(data) + if(res.code === 200){ + ElMessage({ + type: 'success', + message: '编辑成功' + }); + }else{ + ElMessage.warning(res.message) + } + emit("getList") + busRef.value.clearValidate(); + reset(); + dialogVisible.value = false; + } + } +} + +const handleClose = () => { + busRef.value.clearValidate(); + reset(); + dialogVisible.value = false; + emit("getList") + +} +const getPeopleList = async ()=> { + if(state.isAdmin && !state.form.companyId && (state.form.companyId == 0 || state.form.companyId == null)){ + return + } + const queryParams = { + pageNum: 1, + pageSize: 9999, + companyId: state.form.companyId + } + const res = await getUser(queryParams) + if(res.code == 200){ + state.peopleList = res.data.list?res.data.list:[] + }else{ + ElMessage.warning(res.message) + } +}; +const selectValueCom = () => { + state.students = [] + state.form.users = [] + getPeopleList() +} +const reset = () => { + state.form = { + id: '', + companyId: null, + itemName: '', + users: [] + } + state.companyList = [] + state.students = [] +} +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> diff --git a/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectSet/index.vue b/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectSet/index.vue new file mode 100644 index 0000000..acb66a1 --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectSet/index.vue @@ -0,0 +1,189 @@ +<template> + <div class="app-container"> + <div style="display: flex;justify-content: space-between"> + <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" > + <el-form-item> + <el-button + v-if="userTpye == 0 || userTpye == 6" + type="primary" + plain + icon="Plus" + @click="openDialog('add',{})" + >新增</el-button> + </el-form-item> + <el-form-item v-if="isAdmin" label="企业:" > + <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable> + <el-option + v-for="item in companyList" + :key="item.id" + :label="item.name" + :value="item.id"> + </el-option> + </el-select> + </el-form-item> + <el-form-item v-if="isAdmin"> + <el-button type="primary" @click="getList">查询</el-button> + <el-button type="primary" plain @click="reset">重置</el-button> + </el-form-item> + </el-form> + </div> + <!-- 表格数据 --> + <el-table v-loading="loading" :data="dataList" :border="true"> + <el-table-column label="序号" type="index" align="center" width="80"/> + <el-table-column label="项目名称" prop="itemName" align="center" /> + <el-table-column label="项目参与人员" align="center" > + <template #default="scope"> + <div style="display: flex;flex-wrap: wrap;align-items: center;justify-content: center"> + <div v-for="(item,index) in scope.row.users" style="display: flex" >{{item.userName}}<div v-if="scope.row.users && index !=scope.row.users.length -1" style="margin-right: 2px"> , </div></div> + </div> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" v-if="userTpye == 0 || userTpye == 6"> + <template #default="scope"> + <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> + <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> + </template> + </el-table-column> + </el-table> + <pagination + v-show="total > 0" + :total="total" + v-model:page="queryParams.pageNum" + v-model:limit="queryParams.pageSize" + @pagination="getList" + /> + + <edit-dialog ref="dialogRef" @getList=getList></edit-dialog> + </div> +</template> + +<script setup> +import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; +import {ElMessage, ElMessageBox} from "element-plus"; +import {delCompany, getCompany} from "@/api/onlineEducation/company"; +import editDialog from './components/editDialog.vue' +import useUserStore from "@/store/modules/user"; +import {delProductSet, getProductSetPage} from "@/api/selfProblems/productFile"; +import Cookies from "js-cookie"; +const userStore = useUserStore() +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const dialogRef = ref(); + +const data = reactive({ + queryParams: { + pageNum: 1, + pageSize: 10, + companyId: null, + industryType: null, + type: '', + templateName: '' + }, + total: 0, + dataList: [], + companyList: [], + industryList: [], + isAdmin: false, + typeList: [], + exportDialog: false, + +}); +const state = reactive({ + form: { + id: null, + filePath: '', + companyId: null + }, + formRules:{ + companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], + }, + exportFileList: [], +}) + +const { queryParams, total, dataList,companyList,industryList, isAdmin } = toRefs(data); +const userTpye = ref() +onMounted(async ()=>{ + const userInfo = JSON.parse(Cookies.get('userInfo')) + userTpye.value = userInfo.userType + if(userStore.roles.includes('admin')){ + data.isAdmin = true + data.queryParams.companyId = null + await getCompanyList() + }else{ + data.isAdmin = false + data.queryParams.companyId = userStore.companyId + } + await getList() +}) + +onUnmounted(()=>{ + +}) +const getList = async () => { + loading.value = true + const res = await getProductSetPage(data.queryParams) + if(res.code == 200){ + data.dataList = res.data.list + data.total = res.data.total + }else{ + ElMessage.warning(res.message) + } + loading.value = false +} + +const getCompanyList = async ()=>{ + const queryParams = { + pageNum: 1, + pageSize: 999 + } + const res = await getCompany(queryParams) + if (res.code == 200) { + data.companyList = res.data.list?res.data.list:[] + } else { + ElMessage.warning(res.message) + } +} + +const openDialog = (type, value) => { + dialogRef.value.openDialog(type, value, data.companyList); +} +/** 重置新增的表单以及其他数据 */ +const reset= async()=> { + if(data.isAdmin){ + data.queryParams = { + pageNum: 1, + pageSize: 10, + companyId: null, + } + await getCompanyList() + }else { + data.queryParams = { + pageNum: 1, + pageSize: 10, + companyId: data.queryParams.companyId, + } + } + await getList() +} +const handleDelete = (val) => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delProductSet(val.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getList() + }else{ + ElMessage.warning(res.message) + } + }) +} + + +</script> -- Gitblit v1.9.2