From 592c1750b148874737cdfba4b22b6229f9805fe6 Mon Sep 17 00:00:00 2001 From: zhouwx <1175765986@qq.com> Date: 星期三, 02 七月 2025 14:55:27 +0800 Subject: [PATCH] 新增 --- src/views/build/conpanyFunctionConsult/qualityManage/runManage/catalogRun/components/editDialog.vue | 182 + src/views/build/conpanyFunctionConsult/qualityManage/fileManage/catalogFile/index.vue | 141 src/views/build/conpanyFunctionConsult/qualityManage/performanceManage/catalogPerformance/index.vue | 141 src/views/build/conpanyFunctionConsult/qualityManage/performanceManage/performance/index.vue | 493 +++ src/views/system/industryManage/components/editDialog.vue | 9 src/views/build/conpanyFunctionConsult/qualityManage/environmentManage/catalogEnvironment/index.vue | 141 src/views/build/conpanyFunctionConsult/qualityManage/improveManage/catalogImprove/components/editDialog.vue | 182 + src/views/build/conpanyFunctionConsult/qualityManage/supportManage/support/index.vue | 493 +++ src/views/build/conpanyFunctionConsult/qualityManage/supportManage/catalogSupport/components/editDialog.vue | 182 + src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/dataDialog.vue | 50 src/api/qualityManage/range.js | 69 src/views/build/conpanyFunctionConsult/qualityManage/leaderManage/catalogLeader/components/editDialog.vue | 182 + src/views/build/conpanyFunctionConsult/qualityManage/performanceManage/catalogPerformance/components/editDialog.vue | 182 + src/views/build/conpanyFunctionConsult/qualityManage/termManage/catalogTerm/components/editDialog.vue | 182 + src/views/build/conpanyFunctionConsult/qualityManage/designManage/design/index.vue | 493 +++ src/views/system/industryManage/index.vue | 19 src/views/build/conpanyFunctionConsult/qualityManage/fileManage/catalogFile/components/editDialog.vue | 182 + src/views/build/conpanyFunctionConsult/qualityManage/environmentManage/environment/index.vue | 493 +++ src/views/build/conpanyFunctionConsult/qualityManage/improveManage/improve/index.vue | 493 +++ src/views/build/conpanyFunctionConsult/qualityManage/fileManage/file/index.vue | 493 +++ src/views/build/conpanyFunctionConsult/qualityManage/designManage/catalogDesign/components/editDialog.vue | 182 + src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/index.vue | 346 + src/views/build/conpanyFunctionConsult/qualityManage/termManage/term/index.vue | 493 +++ src/views/build/conpanyFunctionConsult/industryTemplate/index.vue | 46 src/views/build/conpanyFunctionConsult/industryTemplate/components/editDialog.vue | 22 src/views/build/conpanyFunctionConsult/qualityManage/leaderManage/catalogLeader/index.vue | 141 src/views/build/conpanyFunctionConsult/qualityManage/runManage/run/index.vue | 493 +++ src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/recordDialog.vue | 50 src/views/build/conpanyFunctionConsult/qualityManage/supportManage/catalogSupport/index.vue | 141 src/views/build/conpanyFunctionConsult/qualityManage/designManage/catalogDesign/index.vue | 141 src/views/build/conpanyFunctionConsult/qualityManage/leaderManage/leader/index.vue | 493 +++ src/views/build/conpanyFunctionConsult/qualityObjectives/objective/components/objectiveDialog.vue | 8 src/views/build/conpanyFunctionConsult/qualityManage/termManage/catalogTerm/index.vue | 141 src/views/build/conpanyFunctionConsult/qualityManage/environmentManage/catalogEnvironment/components/editDialog.vue | 182 + src/api/system/industry.js | 43 src/api/qualityManage/catalog.js | 36 src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/catalogRange/index.vue | 146 src/views/build/conpanyFunctionConsult/qualityManage/improveManage/catalogImprove/index.vue | 141 src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/catalogRange/components/editDialog.vue | 175 src/views/build/conpanyFunctionConsult/qualityManage/runManage/catalogRun/index.vue | 141 40 files changed, 7,821 insertions(+), 542 deletions(-) diff --git a/src/api/qualityManage/catalog.js b/src/api/qualityManage/catalog.js new file mode 100644 index 0000000..90c82b0 --- /dev/null +++ b/src/api/qualityManage/catalog.js @@ -0,0 +1,36 @@ +import request from '@/utils/request' + + +export function getCatalogue(params) { + return request({ + url: '/quality-target/catalogue/list', + method: 'get', + params: params + }) +} + + +export function addCatalogue(data) { + return request({ + url: '/quality-target/catalogue/insert', + method: 'post', + data: data + }) +} + +export function editCatalogue(params) { + return request({ + url: `/quality-target/catalogue/update`, + method: 'post', + data: params + }) +} + +export function delCatalogue(data) { + return request({ + url: `/quality-target/catalogue/deleted?catalogueId=${data}`, + method: 'get' + }) +} + + diff --git a/src/api/qualityManage/range.js b/src/api/qualityManage/range.js new file mode 100644 index 0000000..b66c6de --- /dev/null +++ b/src/api/qualityManage/range.js @@ -0,0 +1,69 @@ +import request from '@/utils/request' + + +export function getCatalogueData(params) { + return request({ + url: '/quality-target/catalogueData/list', + method: 'get', + params: params + }) +} + + + +export function addCatalogueData(data) { + return request({ + url: '/quality-target/catalogueData/insert', + method: 'post', + data: data + }) +} + +export function editCatalogueData(params) { + return request({ + url: `/quality-target/catalogueData/update`, + method: 'post', + data: params + }) +} + +export function delCatalogueData(data) { + return request({ + url: `/quality-target/catalogueData/deleted?catalogueDataId=${data}`, + method: 'get' + }) +} + + + +//文件 +export function getFile(params) { + return request({ + url: '/quality-target/catalogueDataFile/list', + method: 'get', + params: params + }) +} + +export function addFile(data) { + return request({ + url: '/quality-target/catalogueDataFile/insert', + method: 'post', + data: data + }) +} + +export function editFile(params) { + return request({ + url: `/quality-target/catalogueDataFile/update`, + method: 'post', + data: params + }) +} + +export function delFile(data) { + return request({ + url: `/quality-target/catalogueDataFile/deleted?dataFileId=${data}`, + method: 'get' + }) +} diff --git a/src/api/system/industry.js b/src/api/system/industry.js new file mode 100644 index 0000000..7088c08 --- /dev/null +++ b/src/api/system/industry.js @@ -0,0 +1,43 @@ +import request from '@/utils/request' + + +export function getIndustryPage(params) { + return request({ + url: '/system/industry/type/list', + method: 'get', + params: params + }) +} + +export function getIndustry(params) { + return request({ + url: '/system/industry/type/listAll', + method: 'get', + params: params + }) +} + +export function addIndustry(data) { + return request({ + url: '/system/industry/type/insert', + method: 'post', + data: data + }) +} + +export function editIndustry(params) { + return request({ + url: `/system/industry/type/update`, + method: 'post', + data: params + }) +} + +export function delIndustry(data) { + return request({ + url: `/system/industry/type/deleted?IndustryId=${data}`, + method: 'get' + }) +} + + diff --git a/src/views/build/conpanyFunctionConsult/industryTemplate/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/industryTemplate/components/editDialog.vue index 5eaddb1..a8c2cd4 100644 --- a/src/views/build/conpanyFunctionConsult/industryTemplate/components/editDialog.vue +++ b/src/views/build/conpanyFunctionConsult/industryTemplate/components/editDialog.vue @@ -23,7 +23,7 @@ <el-input v-model.trim="state.form.templateName" :disabled="state.title =='查看'" placeholder="模板名称"></el-input> </el-form-item> <el-form-item label="行业:" prop="industryType"> - <el-select v-model="state.form.industryId" placeholder="请选择" clearable style="width: 100%"> + <el-select v-model="state.form.industryType" placeholder="请选择" clearable style="width: 100%"> <el-option v-for="item in state.industryList" :key="item.id" @@ -59,6 +59,7 @@ import {addIndustryTemp, updateIndustryTemp, updateInfoPlatforms} from "@/api/staffManage/staff"; import {getToken} from "@/utils/auth"; import {delPic} from "@/api/onlineEducation/banner"; +import {getIndustry} from "@/api/system/industry"; const emit = defineEmits(["getList"]); const dialogVisible = ref(false) @@ -75,15 +76,16 @@ form: { id: null, templateName: '', - industryId: '', + industryType: '', filePath: '', + fileName: '', format: '', companyId: null }, formRules:{ companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], templateName: [{ required: true, message: '请输入模板名称', trigger: 'blur' }], - industryId: [{ required: true, message: '请选择行业类型', trigger: 'blur' }], + industryType: [{ required: true, message: '请选择行业类型', trigger: 'blur' }], filePath: [{ required: true, validator: checkFiles, trigger: 'blur' }] }, isAdmin: false, @@ -107,6 +109,7 @@ } state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' state.form.companyId = companyId + await getIndustryList() if(state.title == '编辑'||state.title == '查看'){ Object.keys(state.form).forEach(key => { if (key in value) { @@ -116,7 +119,7 @@ if(value.filePath) { const obj = { url: value.filePath, - name: '模板文件' + name: value.fileName } state.fileList = [obj] } @@ -125,6 +128,14 @@ } +const getIndustryList = async () => { + const res = await getIndustry() + if(res.code == 200){ + state.industryList = res.data.data + }else{ + ElMessage.warning(res.message) + } +} const onSubmit = async () => { const valid = await superRef.value.validate(); if(valid){ @@ -155,6 +166,7 @@ const handleAvatarSuccess = (res, uploadFile) => { if(res.code == 200){ + state.form.fileName = res.data.originName state.form.filePath = res.data.path state.form.format = '.' + res.data.filename.split('.')[1] }else{ @@ -191,6 +203,7 @@ // }) state.form.filePath = '' state.form.format = '' + state.form.fileName = '' }else{ ElMessage({ type: 'warning', @@ -208,6 +221,7 @@ templateName: '', industryType: '', filePath: '', + fileName: '', format: '', companyId: null } diff --git a/src/views/build/conpanyFunctionConsult/industryTemplate/index.vue b/src/views/build/conpanyFunctionConsult/industryTemplate/index.vue index b7b8c0f..632ba9c 100644 --- a/src/views/build/conpanyFunctionConsult/industryTemplate/index.vue +++ b/src/views/build/conpanyFunctionConsult/industryTemplate/index.vue @@ -20,8 +20,8 @@ </el-option> </el-select> </el-form-item> - <el-form-item v-if="isAdmin" label="行业:" > - <el-select v-model="data.queryParams.industryId" placeholder="请选择" clearable> + <el-form-item label="行业:" > + <el-select v-model="data.queryParams.industryType" placeholder="请选择" clearable> <el-option v-for="item in industryList" :key="item.id" @@ -40,14 +40,10 @@ <el-table v-loading="loading" :data="dataList" :border="true"> <el-table-column label="序号" type="index" align="center" width="80"/> <el-table-column label="模板名称" prop="templateName" align="center"/> - <el-table-column label="行业" prop="industryType" align="center"> - <template #default="scope"> - {{getName(scope.row.industryType)}} - </template> - </el-table-column> + <el-table-column label="行业" prop="industryName" align="center" /> <el-table-column label="模板文件" prop="fileName" align="center"> <template #default="scope"> - <el-button link type="primary" @click="downloadFile(scope.row)">{{getName(scope.row.industryType) + '模板'}}</el-button> + <el-link style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> </template> </el-table-column> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > @@ -84,6 +80,7 @@ import useUserStore from "@/store/modules/user"; import axios from "axios"; import {getToken} from "@/utils/auth"; +import {getIndustry} from "@/api/system/industry"; const userStore = useUserStore() const { proxy } = getCurrentInstance(); const loading = ref(false); @@ -93,23 +90,14 @@ pageNum: 1, pageSize: 10, companyId: null, - industryId: null + industryType: null }, total: 0, dataList: [], companyList: [], industryList: [], isAdmin: false, - typeList: [ - { - value: 1, - name: '化工' - }, - { - value: 2, - name: '安防' - } - ] + typeList: [] }); const { queryParams, total, dataList,companyList,industryList, isAdmin } = toRefs(data); @@ -123,6 +111,7 @@ data.isAdmin = false data.queryParams.companyId = userStore.companyId } + await getIndustryList() await getList() }) @@ -142,6 +131,14 @@ loading.value = false } +const getIndustryList = async () => { + const res = await getIndustry() + if(res.code == 200){ + data.industryList = res.data.data + }else{ + ElMessage.warning(res.message) + } +} const getCompanyList = async ()=>{ const queryParams = { pageNum: 1, @@ -163,7 +160,10 @@ let blob = new Blob([res.data],{type: res.data.type}) link.style.display = "none"; link.href = URL.createObjectURL(blob); // 创建URL - window.open(link.href) + link.setAttribute("download", e.fileName); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); } else { ElMessage({ type: 'warning', @@ -171,10 +171,6 @@ }); } }) -} - -const getName =(type)=>{ - return data.typeList.find(i=> i.value == type)?.name } const openDialog = (type, value) => { @@ -187,7 +183,7 @@ pageNum: 1, pageSize: 10, companyId: null, - industryId: null + industryType: null } await getCompanyList() await getList() diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/designManage/catalogDesign/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/qualityManage/designManage/catalogDesign/components/editDialog.vue new file mode 100644 index 0000000..65a9f70 --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/qualityManage/designManage/catalogDesign/components/editDialog.vue @@ -0,0 +1,182 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + :title="state.title" + width="600px" + :before-close="handleClose" + :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="parentId" > + <el-tree-select + v-model="state.form.parentId" + :data="state.menuOptions" + :props="{ value: 'id', label: 'name', children: 'children' }" + value-key="id" + placeholder="上级分支" + check-strictly + style="width: 100%" + /> + </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="mess"> + <el-input v-model.trim="state.form.mess" :disabled="state.title =='查看'" placeholder="目录名称"></el-input> + </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 {addCatalogue, editCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; + +const emit = defineEmits(["getList"]); +const dialogVisible = ref(false) +const superRef = ref() +const state = reactive({ + title: '', + form: { + id: null, + mess: '', + number:'', + parentId: null + }, + formRules:{ + mess: [{ required: true, message: '请输入目录名称', trigger: 'blur' }], + number: [{ required: true, message: '请输入序号', trigger: 'blur' }], + parentId:[{ required: true, message: '请选择上级分支', trigger: 'blur' }], + }, + isAdmin: false, + companyList: [], + menuOptions: [], + +}) +onMounted(() => { + +}); + +const openDialog = async (type, value,companyId, isAdmin,flag) => { + state.isAdmin = isAdmin + if(isAdmin){ + await getTreeselect() + } + state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' + if(state.title == '新增' && flag == 2){ + state.form.parentId = value.id + + }else if(state.title == '新增' && flag == 1 ){ + + state.form.parentId = 0 + + } + if(state.title == '编辑'||state.title == '查看'){ + Object.keys(state.form).forEach(key => { + if (key in value) { + state.form[key] = value[key] + } + }) + } + dialogVisible.value = true +} + + +const onSubmit = async () => { + const valid = await superRef.value.validate(); + console.log('state.form',state.form) + if(valid){ + if(state.title == '新增'){ + const {id,...data} = state.form + data.type = 6 + const res = await addCatalogue(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + }else{ + const {...data} = state.form + const res = await editCatalogue(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + } + } +} +const getTreeselect =async ()=> { + state.menuOptions = []; + const param = { + type: 6, + } + const res = await getCatalogue(param) + if(res.code == 200){ + const menu = { id: 0, name: "主目录", children: [] }; + menu.children = await handleTree(res.data.data) + state.menuOptions.push(menu); + }else{ + ElMessage.warning(res.message) + } +} + +const handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${node.number} ${node.mess}`; + // 递归处理子节点(传递当前序号路径) + if (node.children && node.children.length) { + traverse(node.children, node.number); + } + }); + }; + traverse(val); // 从根节点开始遍历 + return val; +} +const handleClose = () => { + state.form = { + id: null, + mess: '', + number:'', + parentId: null + } + state.isTree = false + 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> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/designManage/catalogDesign/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/designManage/catalogDesign/index.vue index b56c6ae..e80507e 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/designManage/catalogDesign/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/designManage/catalogDesign/index.vue @@ -1,11 +1,138 @@ -<script setup> - -</script> - <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 + type="primary" + plain + icon="Plus" + @click="openDialog('add','',1)" + >新增</el-button> + </el-form-item> + </el-form> + </div> + <!-- 表格数据 --> + <el-table v-loading="loading" + :data="dataList" + :border="true" + row-key="id" + :default-expand-all="true" + :tree-props="{ children: 'children'}" + > + <el-table-column label="目录名称" prop="mess" > + <template #default="scope"> + {{scope.row.number}} {{scope.row.mess}} + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDialog('add',scope.row,2)">新增</el-button> + <el-button link type="primary" @click="openDialog('edit',scope.row,null)">编辑</el-button> + <el-button link type="danger" v-if="scope.row.children && scope.row.children.length == 0" @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> -<style scoped lang="scss"> +<script setup> +import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; +import {ElMessage, ElMessageBox} from "element-plus"; +import editDialog from './components/editDialog.vue' +import useUserStore from "@/store/modules/user"; +import {delCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; +const userStore = useUserStore() +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const loadingCompany = ref(false) +const dialogRef = ref(); +const data = reactive({ + queryParams: { + pageNum: 1, + pageSize: 10, + companyId: null, + }, + total: 0, + dataList: [], + companyList: [], + industryList: [], + isAdmin: false, -</style> +}); + +const { queryParams, total, dataList,companyList,industryList, isAdmin } = toRefs(data); +const userInfo = ref() +onMounted(async ()=>{ + if(userStore.roles.includes('admin')){ + data.isAdmin = true + data.queryParams.companyId = null + }else{ + data.isAdmin = false + data.queryParams.companyId = userStore.companyId + } + await getList() + +}) + +onUnmounted(()=>{ + +}) + +const getList = async () => { + loading.value = true + const param = { + type: 6, + } + const res = await getCatalogue(param); + if(res.code === 200){ + data.dataList = res.data.data + }else{ + ElMessage.warning(res.message) + } + loading.value = false +} + +const openDialog = (type, value,flag) => { + + dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin,flag); +} + +/** 重置新增的表单以及其他数据 */ +const reset= async()=> { + data.queryParams = { + pageNum: 1, + pageSize: 10, + companyId: null, + } + await getList() +} +const handleDelete = (val) => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delCatalogue(val.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getList() + }else{ + ElMessage.warning(res.message) + } + }) +} + +</script> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/designManage/design/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/designManage/design/index.vue index 9b94650..7b091f7 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/designManage/design/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/designManage/design/index.vue @@ -1,11 +1,494 @@ -<script setup> +<template> + <div class="app-container"> + <div style="margin-bottom: 10px"> + <el-form style="display: flex;flex-wrap: wrap;"> + <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 v-if="data.isAdmin">--> + <!-- <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>--> + <!-- <el-button plain @click="reset">重置</el-button>--> + <!-- </el-form-item>--> + </el-form> + </div> + <div class="bottom"> + <div class="left"> + <span style="font-weight: 600;font-size: 24px">目录</span> + <el-tree + v-if="data.treeData" + style="max-width: 600px;margin-top: 20px" + :data="data.treeData" + :props="data.defaultProps" + :default-expand-all="true" + :expand-on-click-node="false" + highlight-current + @node-click="handleNodeClick" + ></el-tree> + <el-empty v-else description="暂无数据" /> + </div> + <div class="right"> + <el-form :model="state.form" size="default" ref="noticeRef" :rules="data.formRules" label-position="left" label-width="125px" > + <el-form-item label="具体内容" prop="content" > + <el-input v-model="state.form.content" :rows="4" type="textarea" /> + </el-form-item> + <el-form-item label="标准分析" prop="analysis" > + <el-input v-model="state.form.analysis" :rows="4" type="textarea" /> + </el-form-item> + <el-form-item label="应准备材料" prop="dataList"> + <el-button type="primary" @click="openDataDialog('add',{})">新增</el-button> + </el-form-item> + <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="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center" > + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDataDialog('edit',scope.row)" >编辑</el-button> + <el-button link type="danger" @click="handleDataDelete(scope.row)" >删除</el-button> + </template> + </el-table-column> + </el-table> + <el-form-item label="记录上传" prop="recordList"> + <el-button type="primary" @click="openRecordDialog('add',{})">新增</el-button> + </el-form-item> + <el-table style="margin-top: 15px;width: 100%" :data="state.form.recordList" :border="true" > + <el-table-column type="index" label="序号" width="80" align="center"></el-table-column> + <el-table-column label="记录名称" prop="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center"> + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openRecordDialog('edit',scope.row)" >编辑</el-button> + <el-button link type="danger" @click="handleRecordDelete(scope.row)" >删除</el-button> + </template> + </el-table-column> + </el-table> + </el-form> + <div style="display: flex;align-items: center;justify-content: right;margin-top: 10px"> + <el-button v-if="state.form.id" type="danger" @click="deleteData">删除</el-button> + <el-button type="primary" @click="addData()">保存</el-button> + </div> + </div> + </div> + <dataDialog ref="dialogRef" @getList="getFileList"></dataDialog> + <record-dialog ref="dialogRecordRef" @getList="getFileList"></record-dialog> + </div> +</template> +<script setup> +import {getCurrentInstance, 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 "@/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/dataDialog.vue" +import recordDialog from "@/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/recordDialog.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"; + +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const noticeRef = ref(); +const dialogRef = ref(); +const dialogRecordRef = ref(); +const loadingCompany = ref(false) +const data = reactive({ + queryParams: { + type: 6, + companyId: null, + }, + + formRules: { + content: [{ required: true, message: '请输入具体内容', trigger: 'blur' }], + analysis: [{ required: true, message: '请输入标准分析', trigger: 'blur' }], + dataList: [{ required: true, message: '', trigger: 'blur' }], + recordList: [{ required: true, message: '', trigger: 'blur' }] + }, + companyList: [], + isAdmin: false, + defaultProps: { + children: 'children', + label: 'name', + }, + treeData: [], + dataVisible: false, + dataTitle: '', + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization: getToken() + }, + fileLimit: 1, + fileDataList: [] + +}); +const state = reactive({ + form: { + id: '', + companyId: null, + content: '', + analysis: '', + catalogueId: null, + dataList: [], + recordList: [] + }, +}) +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; + 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 + }else { + data.queryParams.companyId = userInfo.companyId + state.form.companyId = userInfo.companyId + } + await getList(); + +}) +const getList = async () => { + data.treeData = []; + loading.value = true; + const param = { + type : 6 + } + 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 handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${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) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + data.companyList.forEach(item => { + if(item.name === val){ + data.queryParams.companyId = item.id + state.form.companyId = item.id + } + }) + if(state.form.catalogueId){ + await getCatalogDataList() + await getFileList() + } + +} + +const handleNodeClick = async (val) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + state.form.catalogueId = val.id + await getCatalogDataList() + await getFileList() +} +const getCatalogDataList = async () => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + const param = { + catalogueId: state.form.catalogueId, + companyId: state.form.companyId + } + const res = await getCatalogueData(param); + if(res.code === 200){ + // if(res.data.data && res.data.data.length >0){ + state.form.content= res.data.data[0]?.content + state.form.analysis = res.data.data[0]?.analysis + state.form.id = res.data.data[0]?.id + // } + + }else{ + ElMessage.warning(res.message) + } +} + +const addData = async () => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + if(state.form.dataList && state.form.dataList.length==0){ + ElMessage.warning('请上传应准备材料!') + return + } + if(state.form.recordList && state.form.recordList.length==0){ + 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 getCatalogDataList() + 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 getCatalogDataList() + await getFileList() + + }else{ + ElMessage.warning(res.message) + } + } + + + } +} +const openDataDialog = (type, value) => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); +} +const openRecordDialog = (type, value) => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRecordRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); +} + +const handleDataDelete = (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 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 deleteData = () => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delCatalogueData(state.form.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getCatalogDataList() + await getFileList() + }else{ + ElMessage.warning(res.message) + } + }) +} +const reset = async () => { + data.queryParams = { + companyId: '', + pageNum: 1, + pageSize: 10, + } + data.companyList = []; + 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 +} + +const getFileList = async () => { + const queryParams = { + companyId: state.form.companyId, + catalogueId: state.form.catalogueId + } + const res = await getFile(queryParams) + if (res.code == 200) { + state.form.dataList = res.data.data?.filter(i => i.type == 1) + state.form.recordList = res.data.data?.filter(i => i.type == 2) + } else { + ElMessage.warning(res.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: '文件读取失败' + }); + } + }) +} </script> -<template> -策划 -</template> - <style scoped lang="scss"> +.app-container{ + .bottom{ + display: flex; + width: auto; + height: auto; + border: 1px solid #c3c3c3; + margin: 20px; + .left{ + border-right: 1px solid darkgray; + display: flex; + min-width: 240px; + margin: 20px 20px 20px 50px; + flex-direction: column; + :deep(.el-tree){ + background: none; + } + } + .right{ + margin: 20px 20px 20px 10px; + flex: 1; + min-width: 100px; + :deep(.el-form-item__label){ + font-weight: 600;font-size: 20px + } + + } + } + +} </style> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/environmentManage/catalogEnvironment/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/qualityManage/environmentManage/catalogEnvironment/components/editDialog.vue new file mode 100644 index 0000000..e4889a9 --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/qualityManage/environmentManage/catalogEnvironment/components/editDialog.vue @@ -0,0 +1,182 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + :title="state.title" + width="600px" + :before-close="handleClose" + :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="parentId" > + <el-tree-select + v-model="state.form.parentId" + :data="state.menuOptions" + :props="{ value: 'id', label: 'name', children: 'children' }" + value-key="id" + placeholder="上级分支" + check-strictly + style="width: 100%" + /> + </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="mess"> + <el-input v-model.trim="state.form.mess" :disabled="state.title =='查看'" placeholder="目录名称"></el-input> + </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 {addCatalogue, editCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; + +const emit = defineEmits(["getList"]); +const dialogVisible = ref(false) +const superRef = ref() +const state = reactive({ + title: '', + form: { + id: null, + mess: '', + number:'', + parentId: null + }, + formRules:{ + mess: [{ required: true, message: '请输入目录名称', trigger: 'blur' }], + number: [{ required: true, message: '请输入序号', trigger: 'blur' }], + parentId:[{ required: true, message: '请选择上级分支', trigger: 'blur' }], + }, + isAdmin: false, + companyList: [], + menuOptions: [], + +}) +onMounted(() => { + +}); + +const openDialog = async (type, value,companyId, isAdmin,flag) => { + state.isAdmin = isAdmin + if(isAdmin){ + await getTreeselect() + } + state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' + if(state.title == '新增' && flag == 2){ + state.form.parentId = value.id + + }else if(state.title == '新增' && flag == 1 ){ + + state.form.parentId = 0 + + } + if(state.title == '编辑'||state.title == '查看'){ + Object.keys(state.form).forEach(key => { + if (key in value) { + state.form[key] = value[key] + } + }) + } + dialogVisible.value = true +} + + +const onSubmit = async () => { + const valid = await superRef.value.validate(); + console.log('state.form',state.form) + if(valid){ + if(state.title == '新增'){ + const {id,...data} = state.form + data.type = 4 + const res = await addCatalogue(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + }else{ + const {...data} = state.form + const res = await editCatalogue(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + } + } +} +const getTreeselect =async ()=> { + state.menuOptions = []; + const param = { + type: 4, + } + const res = await getCatalogue(param) + if(res.code == 200){ + const menu = { id: 0, name: "主目录", children: [] }; + menu.children = await handleTree(res.data.data) + state.menuOptions.push(menu); + }else{ + ElMessage.warning(res.message) + } +} + +const handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${node.number} ${node.mess}`; + // 递归处理子节点(传递当前序号路径) + if (node.children && node.children.length) { + traverse(node.children, node.number); + } + }); + }; + traverse(val); // 从根节点开始遍历 + return val; +} +const handleClose = () => { + state.form = { + id: null, + mess: '', + number:'', + parentId: null + } + state.isTree = false + 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> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/environmentManage/catalogEnvironment/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/environmentManage/catalogEnvironment/index.vue index 74e54d9..b6c2d7f 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/environmentManage/catalogEnvironment/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/environmentManage/catalogEnvironment/index.vue @@ -1,11 +1,138 @@ -<script setup> - -</script> - <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 + type="primary" + plain + icon="Plus" + @click="openDialog('add','',1)" + >新增</el-button> + </el-form-item> + </el-form> + </div> + <!-- 表格数据 --> + <el-table v-loading="loading" + :data="dataList" + :border="true" + row-key="id" + :default-expand-all="true" + :tree-props="{ children: 'children'}" + > + <el-table-column label="目录名称" prop="mess" > + <template #default="scope"> + {{scope.row.number}} {{scope.row.mess}} + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDialog('add',scope.row,2)">新增</el-button> + <el-button link type="primary" @click="openDialog('edit',scope.row,null)">编辑</el-button> + <el-button link type="danger" v-if="scope.row.children && scope.row.children.length == 0" @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> -<style scoped lang="scss"> +<script setup> +import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; +import {ElMessage, ElMessageBox} from "element-plus"; +import editDialog from './components/editDialog.vue' +import useUserStore from "@/store/modules/user"; +import {delCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; +const userStore = useUserStore() +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const loadingCompany = ref(false) +const dialogRef = ref(); +const data = reactive({ + queryParams: { + pageNum: 1, + pageSize: 10, + companyId: null, + }, + total: 0, + dataList: [], + companyList: [], + industryList: [], + isAdmin: false, -</style> +}); + +const { queryParams, total, dataList,companyList,industryList, isAdmin } = toRefs(data); +const userInfo = ref() +onMounted(async ()=>{ + if(userStore.roles.includes('admin')){ + data.isAdmin = true + data.queryParams.companyId = null + }else{ + data.isAdmin = false + data.queryParams.companyId = userStore.companyId + } + await getList() + +}) + +onUnmounted(()=>{ + +}) + +const getList = async () => { + loading.value = true + const param = { + type: 4, + } + const res = await getCatalogue(param); + if(res.code === 200){ + data.dataList = res.data.data + }else{ + ElMessage.warning(res.message) + } + loading.value = false +} + +const openDialog = (type, value,flag) => { + + dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin,flag); +} + +/** 重置新增的表单以及其他数据 */ +const reset= async()=> { + data.queryParams = { + pageNum: 1, + pageSize: 10, + companyId: null, + } + await getList() +} +const handleDelete = (val) => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delCatalogue(val.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getList() + }else{ + ElMessage.warning(res.message) + } + }) +} + +</script> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/environmentManage/environment/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/environmentManage/environment/index.vue index 7fdd112..38a28cb 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/environmentManage/environment/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/environmentManage/environment/index.vue @@ -1,11 +1,494 @@ -<script setup> +<template> + <div class="app-container"> + <div style="margin-bottom: 10px"> + <el-form style="display: flex;flex-wrap: wrap;"> + <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 v-if="data.isAdmin">--> + <!-- <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>--> + <!-- <el-button plain @click="reset">重置</el-button>--> + <!-- </el-form-item>--> + </el-form> + </div> + <div class="bottom"> + <div class="left"> + <span style="font-weight: 600;font-size: 24px">目录</span> + <el-tree + v-if="data.treeData" + style="max-width: 600px;margin-top: 20px" + :data="data.treeData" + :props="data.defaultProps" + :default-expand-all="true" + :expand-on-click-node="false" + highlight-current + @node-click="handleNodeClick" + ></el-tree> + <el-empty v-else description="暂无数据" /> + </div> + <div class="right"> + <el-form :model="state.form" size="default" ref="noticeRef" :rules="data.formRules" label-position="left" label-width="125px" > + <el-form-item label="具体内容" prop="content" > + <el-input v-model="state.form.content" :rows="4" type="textarea" /> + </el-form-item> + <el-form-item label="标准分析" prop="analysis" > + <el-input v-model="state.form.analysis" :rows="4" type="textarea" /> + </el-form-item> + <el-form-item label="应准备材料" prop="dataList"> + <el-button type="primary" @click="openDataDialog('add',{})">新增</el-button> + </el-form-item> + <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="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center" > + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDataDialog('edit',scope.row)" >编辑</el-button> + <el-button link type="danger" @click="handleDataDelete(scope.row)" >删除</el-button> + </template> + </el-table-column> + </el-table> + <el-form-item label="记录上传" prop="recordList"> + <el-button type="primary" @click="openRecordDialog('add',{})">新增</el-button> + </el-form-item> + <el-table style="margin-top: 15px;width: 100%" :data="state.form.recordList" :border="true" > + <el-table-column type="index" label="序号" width="80" align="center"></el-table-column> + <el-table-column label="记录名称" prop="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center"> + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openRecordDialog('edit',scope.row)" >编辑</el-button> + <el-button link type="danger" @click="handleRecordDelete(scope.row)" >删除</el-button> + </template> + </el-table-column> + </el-table> + </el-form> + <div style="display: flex;align-items: center;justify-content: right;margin-top: 10px"> + <el-button v-if="state.form.id" type="danger" @click="deleteData">删除</el-button> + <el-button type="primary" @click="addData()">保存</el-button> + </div> + </div> + </div> + <dataDialog ref="dialogRef" @getList="getFileList"></dataDialog> + <record-dialog ref="dialogRecordRef" @getList="getFileList"></record-dialog> + </div> +</template> +<script setup> +import {getCurrentInstance, 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 "@/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/dataDialog.vue" +import recordDialog from "@/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/recordDialog.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"; + +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const noticeRef = ref(); +const dialogRef = ref(); +const dialogRecordRef = ref(); +const loadingCompany = ref(false) +const data = reactive({ + queryParams: { + type: 4, + companyId: null, + }, + + formRules: { + content: [{ required: true, message: '请输入具体内容', trigger: 'blur' }], + analysis: [{ required: true, message: '请输入标准分析', trigger: 'blur' }], + dataList: [{ required: true, message: '', trigger: 'blur' }], + recordList: [{ required: true, message: '', trigger: 'blur' }] + }, + companyList: [], + isAdmin: false, + defaultProps: { + children: 'children', + label: 'name', + }, + treeData: [], + dataVisible: false, + dataTitle: '', + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization: getToken() + }, + fileLimit: 1, + fileDataList: [] + +}); +const state = reactive({ + form: { + id: '', + companyId: null, + content: '', + analysis: '', + catalogueId: null, + dataList: [], + recordList: [] + }, +}) +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; + 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 + }else { + data.queryParams.companyId = userInfo.companyId + state.form.companyId = userInfo.companyId + } + await getList(); + +}) +const getList = async () => { + data.treeData = []; + loading.value = true; + const param = { + type : 4 + } + 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 handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${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) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + data.companyList.forEach(item => { + if(item.name === val){ + data.queryParams.companyId = item.id + state.form.companyId = item.id + } + }) + if(state.form.catalogueId){ + await getCatalogDataList() + await getFileList() + } + +} + +const handleNodeClick = async (val) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + state.form.catalogueId = val.id + await getCatalogDataList() + await getFileList() +} +const getCatalogDataList = async () => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + const param = { + catalogueId: state.form.catalogueId, + companyId: state.form.companyId + } + const res = await getCatalogueData(param); + if(res.code === 200){ + // if(res.data.data && res.data.data.length >0){ + state.form.content= res.data.data[0]?.content + state.form.analysis = res.data.data[0]?.analysis + state.form.id = res.data.data[0]?.id + // } + + }else{ + ElMessage.warning(res.message) + } +} + +const addData = async () => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + if(state.form.dataList && state.form.dataList.length==0){ + ElMessage.warning('请上传应准备材料!') + return + } + if(state.form.recordList && state.form.recordList.length==0){ + 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 getCatalogDataList() + 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 getCatalogDataList() + await getFileList() + + }else{ + ElMessage.warning(res.message) + } + } + + + } +} +const openDataDialog = (type, value) => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); +} +const openRecordDialog = (type, value) => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRecordRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); +} + +const handleDataDelete = (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 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 deleteData = () => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delCatalogueData(state.form.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getCatalogDataList() + await getFileList() + }else{ + ElMessage.warning(res.message) + } + }) +} +const reset = async () => { + data.queryParams = { + companyId: '', + pageNum: 1, + pageSize: 10, + } + data.companyList = []; + 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 +} + +const getFileList = async () => { + const queryParams = { + companyId: state.form.companyId, + catalogueId: state.form.catalogueId + } + const res = await getFile(queryParams) + if (res.code == 200) { + state.form.dataList = res.data.data?.filter(i => i.type == 1) + state.form.recordList = res.data.data?.filter(i => i.type == 2) + } else { + ElMessage.warning(res.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: '文件读取失败' + }); + } + }) +} </script> -<template> -组织环境 -</template> - <style scoped lang="scss"> +.app-container{ + .bottom{ + display: flex; + width: auto; + height: auto; + border: 1px solid #c3c3c3; + margin: 20px; + .left{ + border-right: 1px solid darkgray; + display: flex; + min-width: 240px; + margin: 20px 20px 20px 50px; + flex-direction: column; + :deep(.el-tree){ + background: none; + } + } + .right{ + margin: 20px 20px 20px 10px; + flex: 1; + min-width: 100px; + :deep(.el-form-item__label){ + font-weight: 600;font-size: 20px + } + + } + } + +} </style> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/fileManage/catalogFile/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/qualityManage/fileManage/catalogFile/components/editDialog.vue new file mode 100644 index 0000000..3383e57 --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/qualityManage/fileManage/catalogFile/components/editDialog.vue @@ -0,0 +1,182 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + :title="state.title" + width="600px" + :before-close="handleClose" + :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="parentId" > + <el-tree-select + v-model="state.form.parentId" + :data="state.menuOptions" + :props="{ value: 'id', label: 'name', children: 'children' }" + value-key="id" + placeholder="上级分支" + check-strictly + style="width: 100%" + /> + </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="mess"> + <el-input v-model.trim="state.form.mess" :disabled="state.title =='查看'" placeholder="目录名称"></el-input> + </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 {addCatalogue, editCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; + +const emit = defineEmits(["getList"]); +const dialogVisible = ref(false) +const superRef = ref() +const state = reactive({ + title: '', + form: { + id: null, + mess: '', + number:'', + parentId: null + }, + formRules:{ + mess: [{ required: true, message: '请输入目录名称', trigger: 'blur' }], + number: [{ required: true, message: '请输入序号', trigger: 'blur' }], + parentId:[{ required: true, message: '请选择上级分支', trigger: 'blur' }], + }, + isAdmin: false, + companyList: [], + menuOptions: [], + +}) +onMounted(() => { + +}); + +const openDialog = async (type, value,companyId, isAdmin,flag) => { + state.isAdmin = isAdmin + if(isAdmin){ + await getTreeselect() + } + state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' + if(state.title == '新增' && flag == 2){ + state.form.parentId = value.id + + }else if(state.title == '新增' && flag == 1 ){ + + state.form.parentId = 0 + + } + if(state.title == '编辑'||state.title == '查看'){ + Object.keys(state.form).forEach(key => { + if (key in value) { + state.form[key] = value[key] + } + }) + } + dialogVisible.value = true +} + + +const onSubmit = async () => { + const valid = await superRef.value.validate(); + console.log('state.form',state.form) + if(valid){ + if(state.title == '新增'){ + const {id,...data} = state.form + data.type = 2 + const res = await addCatalogue(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + }else{ + const {...data} = state.form + const res = await editCatalogue(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + } + } +} +const getTreeselect =async ()=> { + state.menuOptions = []; + const param = { + type: 2, + } + const res = await getCatalogue(param) + if(res.code == 200){ + const menu = { id: 0, name: "主目录", children: [] }; + menu.children = await handleTree(res.data.data) + state.menuOptions.push(menu); + }else{ + ElMessage.warning(res.message) + } +} + +const handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${node.number} ${node.mess}`; + // 递归处理子节点(传递当前序号路径) + if (node.children && node.children.length) { + traverse(node.children, node.number); + } + }); + }; + traverse(val); // 从根节点开始遍历 + return val; +} +const handleClose = () => { + state.form = { + id: null, + mess: '', + number:'', + parentId: null + } + state.isTree = false + 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> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/fileManage/catalogFile/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/fileManage/catalogFile/index.vue index 9ecc1d3..69b45e8 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/fileManage/catalogFile/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/fileManage/catalogFile/index.vue @@ -1,11 +1,138 @@ -<script setup> - -</script> - <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 + type="primary" + plain + icon="Plus" + @click="openDialog('add','',1)" + >新增</el-button> + </el-form-item> + </el-form> + </div> + <!-- 表格数据 --> + <el-table v-loading="loading" + :data="dataList" + :border="true" + row-key="id" + :default-expand-all="true" + :tree-props="{ children: 'children'}" + > + <el-table-column label="目录名称" prop="mess" > + <template #default="scope"> + {{scope.row.number}} {{scope.row.mess}} + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDialog('add',scope.row,2)">新增</el-button> + <el-button link type="primary" @click="openDialog('edit',scope.row,null)">编辑</el-button> + <el-button link type="danger" v-if="scope.row.children && scope.row.children.length == 0" @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> -<style scoped lang="scss"> +<script setup> +import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; +import {ElMessage, ElMessageBox} from "element-plus"; +import editDialog from './components/editDialog.vue' +import useUserStore from "@/store/modules/user"; +import {delCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; +const userStore = useUserStore() +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const loadingCompany = ref(false) +const dialogRef = ref(); +const data = reactive({ + queryParams: { + pageNum: 1, + pageSize: 10, + companyId: null, + }, + total: 0, + dataList: [], + companyList: [], + industryList: [], + isAdmin: false, -</style> +}); + +const { queryParams, total, dataList,companyList,industryList, isAdmin } = toRefs(data); +const userInfo = ref() +onMounted(async ()=>{ + if(userStore.roles.includes('admin')){ + data.isAdmin = true + data.queryParams.companyId = null + }else{ + data.isAdmin = false + data.queryParams.companyId = userStore.companyId + } + await getList() + +}) + +onUnmounted(()=>{ + +}) + +const getList = async () => { + loading.value = true + const param = { + type: 2, + } + const res = await getCatalogue(param); + if(res.code === 200){ + data.dataList = res.data.data + }else{ + ElMessage.warning(res.message) + } + loading.value = false +} + +const openDialog = (type, value,flag) => { + + dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin,flag); +} + +/** 重置新增的表单以及其他数据 */ +const reset= async()=> { + data.queryParams = { + pageNum: 1, + pageSize: 10, + companyId: null, + } + await getList() +} +const handleDelete = (val) => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delCatalogue(val.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getList() + }else{ + ElMessage.warning(res.message) + } + }) +} + +</script> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/fileManage/file/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/fileManage/file/index.vue index e8a8b81..eebc47b 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/fileManage/file/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/fileManage/file/index.vue @@ -1,11 +1,494 @@ -<script setup> +<template> + <div class="app-container"> + <div style="margin-bottom: 10px"> + <el-form style="display: flex;flex-wrap: wrap;"> + <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 v-if="data.isAdmin">--> + <!-- <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>--> + <!-- <el-button plain @click="reset">重置</el-button>--> + <!-- </el-form-item>--> + </el-form> + </div> + <div class="bottom"> + <div class="left"> + <span style="font-weight: 600;font-size: 24px">目录</span> + <el-tree + v-if="data.treeData" + style="max-width: 600px;margin-top: 20px" + :data="data.treeData" + :props="data.defaultProps" + :default-expand-all="true" + :expand-on-click-node="false" + highlight-current + @node-click="handleNodeClick" + ></el-tree> + <el-empty v-else description="暂无数据" /> + </div> + <div class="right"> + <el-form :model="state.form" size="default" ref="noticeRef" :rules="data.formRules" label-position="left" label-width="125px" > + <el-form-item label="具体内容" prop="content" > + <el-input v-model="state.form.content" :rows="4" type="textarea" /> + </el-form-item> + <el-form-item label="标准分析" prop="analysis" > + <el-input v-model="state.form.analysis" :rows="4" type="textarea" /> + </el-form-item> + <el-form-item label="应准备材料" prop="dataList"> + <el-button type="primary" @click="openDataDialog('add',{})">新增</el-button> + </el-form-item> + <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="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center" > + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDataDialog('edit',scope.row)" >编辑</el-button> + <el-button link type="danger" @click="handleDataDelete(scope.row)" >删除</el-button> + </template> + </el-table-column> + </el-table> + <el-form-item label="记录上传" prop="recordList"> + <el-button type="primary" @click="openRecordDialog('add',{})">新增</el-button> + </el-form-item> + <el-table style="margin-top: 15px;width: 100%" :data="state.form.recordList" :border="true" > + <el-table-column type="index" label="序号" width="80" align="center"></el-table-column> + <el-table-column label="记录名称" prop="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center"> + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openRecordDialog('edit',scope.row)" >编辑</el-button> + <el-button link type="danger" @click="handleRecordDelete(scope.row)" >删除</el-button> + </template> + </el-table-column> + </el-table> + </el-form> + <div style="display: flex;align-items: center;justify-content: right;margin-top: 10px"> + <el-button v-if="state.form.id" type="danger" @click="deleteData">删除</el-button> + <el-button type="primary" @click="addData()">保存</el-button> + </div> + </div> + </div> + <dataDialog ref="dialogRef" @getList="getFileList"></dataDialog> + <record-dialog ref="dialogRecordRef" @getList="getFileList"></record-dialog> + </div> +</template> +<script setup> +import {getCurrentInstance, 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 "@/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/dataDialog.vue" +import recordDialog from "@/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/recordDialog.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"; + +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const noticeRef = ref(); +const dialogRef = ref(); +const dialogRecordRef = ref(); +const loadingCompany = ref(false) +const data = reactive({ + queryParams: { + type: 2, + companyId: null, + }, + + formRules: { + content: [{ required: true, message: '请输入具体内容', trigger: 'blur' }], + analysis: [{ required: true, message: '请输入标准分析', trigger: 'blur' }], + dataList: [{ required: true, message: '', trigger: 'blur' }], + recordList: [{ required: true, message: '', trigger: 'blur' }] + }, + companyList: [], + isAdmin: false, + defaultProps: { + children: 'children', + label: 'name', + }, + treeData: [], + dataVisible: false, + dataTitle: '', + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization: getToken() + }, + fileLimit: 1, + fileDataList: [] + +}); +const state = reactive({ + form: { + id: '', + companyId: null, + content: '', + analysis: '', + catalogueId: null, + dataList: [], + recordList: [] + }, +}) +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; + 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 + }else { + data.queryParams.companyId = userInfo.companyId + state.form.companyId = userInfo.companyId + } + await getList(); + +}) +const getList = async () => { + data.treeData = []; + loading.value = true; + const param = { + type : 2 + } + 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 handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${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) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + data.companyList.forEach(item => { + if(item.name === val){ + data.queryParams.companyId = item.id + state.form.companyId = item.id + } + }) + if(state.form.catalogueId){ + await getCatalogDataList() + await getFileList() + } + +} + +const handleNodeClick = async (val) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + state.form.catalogueId = val.id + await getCatalogDataList() + await getFileList() +} +const getCatalogDataList = async () => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + const param = { + catalogueId: state.form.catalogueId, + companyId: state.form.companyId + } + const res = await getCatalogueData(param); + if(res.code === 200){ + // if(res.data.data && res.data.data.length >0){ + state.form.content= res.data.data[0]?.content + state.form.analysis = res.data.data[0]?.analysis + state.form.id = res.data.data[0]?.id + // } + + }else{ + ElMessage.warning(res.message) + } +} + +const addData = async () => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + if(state.form.dataList && state.form.dataList.length==0){ + ElMessage.warning('请上传应准备材料!') + return + } + if(state.form.recordList && state.form.recordList.length==0){ + 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 getCatalogDataList() + 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 getCatalogDataList() + await getFileList() + + }else{ + ElMessage.warning(res.message) + } + } + + + } +} +const openDataDialog = (type, value) => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); +} +const openRecordDialog = (type, value) => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRecordRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); +} + +const handleDataDelete = (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 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 deleteData = () => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delCatalogueData(state.form.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getCatalogDataList() + await getFileList() + }else{ + ElMessage.warning(res.message) + } + }) +} +const reset = async () => { + data.queryParams = { + companyId: '', + pageNum: 1, + pageSize: 10, + } + data.companyList = []; + 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 +} + +const getFileList = async () => { + const queryParams = { + companyId: state.form.companyId, + catalogueId: state.form.catalogueId + } + const res = await getFile(queryParams) + if (res.code == 200) { + state.form.dataList = res.data.data?.filter(i => i.type == 1) + state.form.recordList = res.data.data?.filter(i => i.type == 2) + } else { + ElMessage.warning(res.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: '文件读取失败' + }); + } + }) +} </script> -<template> -规范性 -</template> - <style scoped lang="scss"> +.app-container{ + .bottom{ + display: flex; + width: auto; + height: auto; + border: 1px solid #c3c3c3; + margin: 20px; + .left{ + border-right: 1px solid darkgray; + display: flex; + min-width: 240px; + margin: 20px 20px 20px 50px; + flex-direction: column; + :deep(.el-tree){ + background: none; + } + } + .right{ + margin: 20px 20px 20px 10px; + flex: 1; + min-width: 100px; + :deep(.el-form-item__label){ + font-weight: 600;font-size: 20px + } + + } + } + +} </style> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/improveManage/catalogImprove/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/qualityManage/improveManage/catalogImprove/components/editDialog.vue new file mode 100644 index 0000000..b15ba9a --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/qualityManage/improveManage/catalogImprove/components/editDialog.vue @@ -0,0 +1,182 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + :title="state.title" + width="600px" + :before-close="handleClose" + :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="parentId" > + <el-tree-select + v-model="state.form.parentId" + :data="state.menuOptions" + :props="{ value: 'id', label: 'name', children: 'children' }" + value-key="id" + placeholder="上级分支" + check-strictly + style="width: 100%" + /> + </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="mess"> + <el-input v-model.trim="state.form.mess" :disabled="state.title =='查看'" placeholder="目录名称"></el-input> + </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 {addCatalogue, editCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; + +const emit = defineEmits(["getList"]); +const dialogVisible = ref(false) +const superRef = ref() +const state = reactive({ + title: '', + form: { + id: null, + mess: '', + number:'', + parentId: null + }, + formRules:{ + mess: [{ required: true, message: '请输入目录名称', trigger: 'blur' }], + number: [{ required: true, message: '请输入序号', trigger: 'blur' }], + parentId:[{ required: true, message: '请选择上级分支', trigger: 'blur' }], + }, + isAdmin: false, + companyList: [], + menuOptions: [], + +}) +onMounted(() => { + +}); + +const openDialog = async (type, value,companyId, isAdmin,flag) => { + state.isAdmin = isAdmin + if(isAdmin){ + await getTreeselect() + } + state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' + if(state.title == '新增' && flag == 2){ + state.form.parentId = value.id + + }else if(state.title == '新增' && flag == 1 ){ + + state.form.parentId = 0 + + } + if(state.title == '编辑'||state.title == '查看'){ + Object.keys(state.form).forEach(key => { + if (key in value) { + state.form[key] = value[key] + } + }) + } + dialogVisible.value = true +} + + +const onSubmit = async () => { + const valid = await superRef.value.validate(); + console.log('state.form',state.form) + if(valid){ + if(state.title == '新增'){ + const {id,...data} = state.form + data.type = 10 + const res = await addCatalogue(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + }else{ + const {...data} = state.form + const res = await editCatalogue(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + } + } +} +const getTreeselect =async ()=> { + state.menuOptions = []; + const param = { + type: 10, + } + const res = await getCatalogue(param) + if(res.code == 200){ + const menu = { id: 0, name: "主目录", children: [] }; + menu.children = await handleTree(res.data.data) + state.menuOptions.push(menu); + }else{ + ElMessage.warning(res.message) + } +} + +const handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${node.number} ${node.mess}`; + // 递归处理子节点(传递当前序号路径) + if (node.children && node.children.length) { + traverse(node.children, node.number); + } + }); + }; + traverse(val); // 从根节点开始遍历 + return val; +} +const handleClose = () => { + state.form = { + id: null, + mess: '', + number:'', + parentId: null + } + state.isTree = false + 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> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/improveManage/catalogImprove/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/improveManage/catalogImprove/index.vue index 1589964..bc483c2 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/improveManage/catalogImprove/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/improveManage/catalogImprove/index.vue @@ -1,11 +1,138 @@ -<script setup> - -</script> - <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 + type="primary" + plain + icon="Plus" + @click="openDialog('add','',1)" + >新增</el-button> + </el-form-item> + </el-form> + </div> + <!-- 表格数据 --> + <el-table v-loading="loading" + :data="dataList" + :border="true" + row-key="id" + :default-expand-all="true" + :tree-props="{ children: 'children'}" + > + <el-table-column label="目录名称" prop="mess" > + <template #default="scope"> + {{scope.row.number}} {{scope.row.mess}} + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDialog('add',scope.row,2)">新增</el-button> + <el-button link type="primary" @click="openDialog('edit',scope.row,null)">编辑</el-button> + <el-button link type="danger" v-if="scope.row.children && scope.row.children.length == 0" @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> -<style scoped lang="scss"> +<script setup> +import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; +import {ElMessage, ElMessageBox} from "element-plus"; +import editDialog from './components/editDialog.vue' +import useUserStore from "@/store/modules/user"; +import {delCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; +const userStore = useUserStore() +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const loadingCompany = ref(false) +const dialogRef = ref(); +const data = reactive({ + queryParams: { + pageNum: 1, + pageSize: 10, + companyId: null, + }, + total: 0, + dataList: [], + companyList: [], + industryList: [], + isAdmin: false, -</style> +}); + +const { queryParams, total, dataList,companyList,industryList, isAdmin } = toRefs(data); +const userInfo = ref() +onMounted(async ()=>{ + if(userStore.roles.includes('admin')){ + data.isAdmin = true + data.queryParams.companyId = null + }else{ + data.isAdmin = false + data.queryParams.companyId = userStore.companyId + } + await getList() + +}) + +onUnmounted(()=>{ + +}) + +const getList = async () => { + loading.value = true + const param = { + type: 10, + } + const res = await getCatalogue(param); + if(res.code === 200){ + data.dataList = res.data.data + }else{ + ElMessage.warning(res.message) + } + loading.value = false +} + +const openDialog = (type, value,flag) => { + + dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin,flag); +} + +/** 重置新增的表单以及其他数据 */ +const reset= async()=> { + data.queryParams = { + pageNum: 1, + pageSize: 10, + companyId: null, + } + await getList() +} +const handleDelete = (val) => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delCatalogue(val.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getList() + }else{ + ElMessage.warning(res.message) + } + }) +} + +</script> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/improveManage/improve/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/improveManage/improve/index.vue index cd79362..e878628 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/improveManage/improve/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/improveManage/improve/index.vue @@ -1,11 +1,494 @@ -<script setup> +<template> + <div class="app-container"> + <div style="margin-bottom: 10px"> + <el-form style="display: flex;flex-wrap: wrap;"> + <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 v-if="data.isAdmin">--> + <!-- <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>--> + <!-- <el-button plain @click="reset">重置</el-button>--> + <!-- </el-form-item>--> + </el-form> + </div> + <div class="bottom"> + <div class="left"> + <span style="font-weight: 600;font-size: 24px">目录</span> + <el-tree + v-if="data.treeData" + style="max-width: 600px;margin-top: 20px" + :data="data.treeData" + :props="data.defaultProps" + :default-expand-all="true" + :expand-on-click-node="false" + highlight-current + @node-click="handleNodeClick" + ></el-tree> + <el-empty v-else description="暂无数据" /> + </div> + <div class="right"> + <el-form :model="state.form" size="default" ref="noticeRef" :rules="data.formRules" label-position="left" label-width="125px" > + <el-form-item label="具体内容" prop="content" > + <el-input v-model="state.form.content" :rows="4" type="textarea" /> + </el-form-item> + <el-form-item label="标准分析" prop="analysis" > + <el-input v-model="state.form.analysis" :rows="4" type="textarea" /> + </el-form-item> + <el-form-item label="应准备材料" prop="dataList"> + <el-button type="primary" @click="openDataDialog('add',{})">新增</el-button> + </el-form-item> + <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="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center" > + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDataDialog('edit',scope.row)" >编辑</el-button> + <el-button link type="danger" @click="handleDataDelete(scope.row)" >删除</el-button> + </template> + </el-table-column> + </el-table> + <el-form-item label="记录上传" prop="recordList"> + <el-button type="primary" @click="openRecordDialog('add',{})">新增</el-button> + </el-form-item> + <el-table style="margin-top: 15px;width: 100%" :data="state.form.recordList" :border="true" > + <el-table-column type="index" label="序号" width="80" align="center"></el-table-column> + <el-table-column label="记录名称" prop="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center"> + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openRecordDialog('edit',scope.row)" >编辑</el-button> + <el-button link type="danger" @click="handleRecordDelete(scope.row)" >删除</el-button> + </template> + </el-table-column> + </el-table> + </el-form> + <div style="display: flex;align-items: center;justify-content: right;margin-top: 10px"> + <el-button v-if="state.form.id" type="danger" @click="deleteData">删除</el-button> + <el-button type="primary" @click="addData()">保存</el-button> + </div> + </div> + </div> + <dataDialog ref="dialogRef" @getList="getFileList"></dataDialog> + <record-dialog ref="dialogRecordRef" @getList="getFileList"></record-dialog> + </div> +</template> +<script setup> +import {getCurrentInstance, 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 "@/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/dataDialog.vue" +import recordDialog from "@/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/recordDialog.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"; + +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const noticeRef = ref(); +const dialogRef = ref(); +const dialogRecordRef = ref(); +const loadingCompany = ref(false) +const data = reactive({ + queryParams: { + type: 10, + companyId: null, + }, + + formRules: { + content: [{ required: true, message: '请输入具体内容', trigger: 'blur' }], + analysis: [{ required: true, message: '请输入标准分析', trigger: 'blur' }], + dataList: [{ required: true, message: '', trigger: 'blur' }], + recordList: [{ required: true, message: '', trigger: 'blur' }] + }, + companyList: [], + isAdmin: false, + defaultProps: { + children: 'children', + label: 'name', + }, + treeData: [], + dataVisible: false, + dataTitle: '', + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization: getToken() + }, + fileLimit: 1, + fileDataList: [] + +}); +const state = reactive({ + form: { + id: '', + companyId: null, + content: '', + analysis: '', + catalogueId: null, + dataList: [], + recordList: [] + }, +}) +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; + 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 + }else { + data.queryParams.companyId = userInfo.companyId + state.form.companyId = userInfo.companyId + } + await getList(); + +}) +const getList = async () => { + data.treeData = []; + loading.value = true; + const param = { + type : 10 + } + 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 handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${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) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + data.companyList.forEach(item => { + if(item.name === val){ + data.queryParams.companyId = item.id + state.form.companyId = item.id + } + }) + if(state.form.catalogueId){ + await getCatalogDataList() + await getFileList() + } + +} + +const handleNodeClick = async (val) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + state.form.catalogueId = val.id + await getCatalogDataList() + await getFileList() +} +const getCatalogDataList = async () => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + const param = { + catalogueId: state.form.catalogueId, + companyId: state.form.companyId + } + const res = await getCatalogueData(param); + if(res.code === 200){ + // if(res.data.data && res.data.data.length >0){ + state.form.content= res.data.data[0]?.content + state.form.analysis = res.data.data[0]?.analysis + state.form.id = res.data.data[0]?.id + // } + + }else{ + ElMessage.warning(res.message) + } +} + +const addData = async () => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + if(state.form.dataList && state.form.dataList.length==0){ + ElMessage.warning('请上传应准备材料!') + return + } + if(state.form.recordList && state.form.recordList.length==0){ + 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 getCatalogDataList() + 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 getCatalogDataList() + await getFileList() + + }else{ + ElMessage.warning(res.message) + } + } + + + } +} +const openDataDialog = (type, value) => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); +} +const openRecordDialog = (type, value) => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRecordRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); +} + +const handleDataDelete = (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 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 deleteData = () => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delCatalogueData(state.form.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getCatalogDataList() + await getFileList() + }else{ + ElMessage.warning(res.message) + } + }) +} +const reset = async () => { + data.queryParams = { + companyId: '', + pageNum: 1, + pageSize: 10, + } + data.companyList = []; + 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 +} + +const getFileList = async () => { + const queryParams = { + companyId: state.form.companyId, + catalogueId: state.form.catalogueId + } + const res = await getFile(queryParams) + if (res.code == 200) { + state.form.dataList = res.data.data?.filter(i => i.type == 1) + state.form.recordList = res.data.data?.filter(i => i.type == 2) + } else { + ElMessage.warning(res.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: '文件读取失败' + }); + } + }) +} </script> -<template> -改进 -</template> - <style scoped lang="scss"> +.app-container{ + .bottom{ + display: flex; + width: auto; + height: auto; + border: 1px solid #c3c3c3; + margin: 20px; + .left{ + border-right: 1px solid darkgray; + display: flex; + min-width: 240px; + margin: 20px 20px 20px 50px; + flex-direction: column; + :deep(.el-tree){ + background: none; + } + } + .right{ + margin: 20px 20px 20px 10px; + flex: 1; + min-width: 100px; + :deep(.el-form-item__label){ + font-weight: 600;font-size: 20px + } + + } + } + +} </style> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/leaderManage/catalogLeader/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/qualityManage/leaderManage/catalogLeader/components/editDialog.vue new file mode 100644 index 0000000..025ebf5 --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/qualityManage/leaderManage/catalogLeader/components/editDialog.vue @@ -0,0 +1,182 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + :title="state.title" + width="600px" + :before-close="handleClose" + :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="parentId" > + <el-tree-select + v-model="state.form.parentId" + :data="state.menuOptions" + :props="{ value: 'id', label: 'name', children: 'children' }" + value-key="id" + placeholder="上级分支" + check-strictly + style="width: 100%" + /> + </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="mess"> + <el-input v-model.trim="state.form.mess" :disabled="state.title =='查看'" placeholder="目录名称"></el-input> + </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 {addCatalogue, editCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; + +const emit = defineEmits(["getList"]); +const dialogVisible = ref(false) +const superRef = ref() +const state = reactive({ + title: '', + form: { + id: null, + mess: '', + number:'', + parentId: null + }, + formRules:{ + mess: [{ required: true, message: '请输入目录名称', trigger: 'blur' }], + number: [{ required: true, message: '请输入序号', trigger: 'blur' }], + parentId:[{ required: true, message: '请选择上级分支', trigger: 'blur' }], + }, + isAdmin: false, + companyList: [], + menuOptions: [], + +}) +onMounted(() => { + +}); + +const openDialog = async (type, value,companyId, isAdmin,flag) => { + state.isAdmin = isAdmin + if(isAdmin){ + await getTreeselect() + } + state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' + if(state.title == '新增' && flag == 2){ + state.form.parentId = value.id + + }else if(state.title == '新增' && flag == 1 ){ + + state.form.parentId = 0 + + } + if(state.title == '编辑'||state.title == '查看'){ + Object.keys(state.form).forEach(key => { + if (key in value) { + state.form[key] = value[key] + } + }) + } + dialogVisible.value = true +} + + +const onSubmit = async () => { + const valid = await superRef.value.validate(); + console.log('state.form',state.form) + if(valid){ + if(state.title == '新增'){ + const {id,...data} = state.form + data.type = 5 + const res = await addCatalogue(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + }else{ + const {...data} = state.form + const res = await editCatalogue(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + } + } +} +const getTreeselect =async ()=> { + state.menuOptions = []; + const param = { + type: 5, + } + const res = await getCatalogue(param) + if(res.code == 200){ + const menu = { id: 0, name: "主目录", children: [] }; + menu.children = await handleTree(res.data.data) + state.menuOptions.push(menu); + }else{ + ElMessage.warning(res.message) + } +} + +const handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${node.number} ${node.mess}`; + // 递归处理子节点(传递当前序号路径) + if (node.children && node.children.length) { + traverse(node.children, node.number); + } + }); + }; + traverse(val); // 从根节点开始遍历 + return val; +} +const handleClose = () => { + state.form = { + id: null, + mess: '', + number:'', + parentId: null + } + state.isTree = false + 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> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/leaderManage/catalogLeader/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/leaderManage/catalogLeader/index.vue index 8861724..2db566e 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/leaderManage/catalogLeader/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/leaderManage/catalogLeader/index.vue @@ -1,11 +1,138 @@ -<script setup> - -</script> - <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 + type="primary" + plain + icon="Plus" + @click="openDialog('add','',1)" + >新增</el-button> + </el-form-item> + </el-form> + </div> + <!-- 表格数据 --> + <el-table v-loading="loading" + :data="dataList" + :border="true" + row-key="id" + :default-expand-all="true" + :tree-props="{ children: 'children'}" + > + <el-table-column label="目录名称" prop="mess" > + <template #default="scope"> + {{scope.row.number}} {{scope.row.mess}} + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDialog('add',scope.row,2)">新增</el-button> + <el-button link type="primary" @click="openDialog('edit',scope.row,null)">编辑</el-button> + <el-button link type="danger" v-if="scope.row.children && scope.row.children.length == 0" @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> -<style scoped lang="scss"> +<script setup> +import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; +import {ElMessage, ElMessageBox} from "element-plus"; +import editDialog from './components/editDialog.vue' +import useUserStore from "@/store/modules/user"; +import {delCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; +const userStore = useUserStore() +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const loadingCompany = ref(false) +const dialogRef = ref(); +const data = reactive({ + queryParams: { + pageNum: 1, + pageSize: 10, + companyId: null, + }, + total: 0, + dataList: [], + companyList: [], + industryList: [], + isAdmin: false, -</style> +}); + +const { queryParams, total, dataList,companyList,industryList, isAdmin } = toRefs(data); +const userInfo = ref() +onMounted(async ()=>{ + if(userStore.roles.includes('admin')){ + data.isAdmin = true + data.queryParams.companyId = null + }else{ + data.isAdmin = false + data.queryParams.companyId = userStore.companyId + } + await getList() + +}) + +onUnmounted(()=>{ + +}) + +const getList = async () => { + loading.value = true + const param = { + type: 5, + } + const res = await getCatalogue(param); + if(res.code === 200){ + data.dataList = res.data.data + }else{ + ElMessage.warning(res.message) + } + loading.value = false +} + +const openDialog = (type, value,flag) => { + + dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin,flag); +} + +/** 重置新增的表单以及其他数据 */ +const reset= async()=> { + data.queryParams = { + pageNum: 1, + pageSize: 10, + companyId: null, + } + await getList() +} +const handleDelete = (val) => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delCatalogue(val.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getList() + }else{ + ElMessage.warning(res.message) + } + }) +} + +</script> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/leaderManage/leader/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/leaderManage/leader/index.vue index b0df887..ea324ba 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/leaderManage/leader/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/leaderManage/leader/index.vue @@ -1,11 +1,494 @@ -<script setup> +<template> + <div class="app-container"> + <div style="margin-bottom: 10px"> + <el-form style="display: flex;flex-wrap: wrap;"> + <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 v-if="data.isAdmin">--> + <!-- <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>--> + <!-- <el-button plain @click="reset">重置</el-button>--> + <!-- </el-form-item>--> + </el-form> + </div> + <div class="bottom"> + <div class="left"> + <span style="font-weight: 600;font-size: 24px">目录</span> + <el-tree + v-if="data.treeData" + style="max-width: 600px;margin-top: 20px" + :data="data.treeData" + :props="data.defaultProps" + :default-expand-all="true" + :expand-on-click-node="false" + highlight-current + @node-click="handleNodeClick" + ></el-tree> + <el-empty v-else description="暂无数据" /> + </div> + <div class="right"> + <el-form :model="state.form" size="default" ref="noticeRef" :rules="data.formRules" label-position="left" label-width="125px" > + <el-form-item label="具体内容" prop="content" > + <el-input v-model="state.form.content" :rows="4" type="textarea" /> + </el-form-item> + <el-form-item label="标准分析" prop="analysis" > + <el-input v-model="state.form.analysis" :rows="4" type="textarea" /> + </el-form-item> + <el-form-item label="应准备材料" prop="dataList"> + <el-button type="primary" @click="openDataDialog('add',{})">新增</el-button> + </el-form-item> + <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="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center" > + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDataDialog('edit',scope.row)" >编辑</el-button> + <el-button link type="danger" @click="handleDataDelete(scope.row)" >删除</el-button> + </template> + </el-table-column> + </el-table> + <el-form-item label="记录上传" prop="recordList"> + <el-button type="primary" @click="openRecordDialog('add',{})">新增</el-button> + </el-form-item> + <el-table style="margin-top: 15px;width: 100%" :data="state.form.recordList" :border="true" > + <el-table-column type="index" label="序号" width="80" align="center"></el-table-column> + <el-table-column label="记录名称" prop="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center"> + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openRecordDialog('edit',scope.row)" >编辑</el-button> + <el-button link type="danger" @click="handleRecordDelete(scope.row)" >删除</el-button> + </template> + </el-table-column> + </el-table> + </el-form> + <div style="display: flex;align-items: center;justify-content: right;margin-top: 10px"> + <el-button v-if="state.form.id" type="danger" @click="deleteData">删除</el-button> + <el-button type="primary" @click="addData()">保存</el-button> + </div> + </div> + </div> + <dataDialog ref="dialogRef" @getList="getFileList"></dataDialog> + <record-dialog ref="dialogRecordRef" @getList="getFileList"></record-dialog> + </div> +</template> +<script setup> +import {getCurrentInstance, 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 "@/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/dataDialog.vue" +import recordDialog from "@/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/recordDialog.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"; + +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const noticeRef = ref(); +const dialogRef = ref(); +const dialogRecordRef = ref(); +const loadingCompany = ref(false) +const data = reactive({ + queryParams: { + type: 5, + companyId: null, + }, + + formRules: { + content: [{ required: true, message: '请输入具体内容', trigger: 'blur' }], + analysis: [{ required: true, message: '请输入标准分析', trigger: 'blur' }], + dataList: [{ required: true, message: '', trigger: 'blur' }], + recordList: [{ required: true, message: '', trigger: 'blur' }] + }, + companyList: [], + isAdmin: false, + defaultProps: { + children: 'children', + label: 'name', + }, + treeData: [], + dataVisible: false, + dataTitle: '', + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization: getToken() + }, + fileLimit: 1, + fileDataList: [] + +}); +const state = reactive({ + form: { + id: '', + companyId: null, + content: '', + analysis: '', + catalogueId: null, + dataList: [], + recordList: [] + }, +}) +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; + 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 + }else { + data.queryParams.companyId = userInfo.companyId + state.form.companyId = userInfo.companyId + } + await getList(); + +}) +const getList = async () => { + data.treeData = []; + loading.value = true; + const param = { + type : 5 + } + 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 handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${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) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + data.companyList.forEach(item => { + if(item.name === val){ + data.queryParams.companyId = item.id + state.form.companyId = item.id + } + }) + if(state.form.catalogueId){ + await getCatalogDataList() + await getFileList() + } + +} + +const handleNodeClick = async (val) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + state.form.catalogueId = val.id + await getCatalogDataList() + await getFileList() +} +const getCatalogDataList = async () => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + const param = { + catalogueId: state.form.catalogueId, + companyId: state.form.companyId + } + const res = await getCatalogueData(param); + if(res.code === 200){ + // if(res.data.data && res.data.data.length >0){ + state.form.content= res.data.data[0]?.content + state.form.analysis = res.data.data[0]?.analysis + state.form.id = res.data.data[0]?.id + // } + + }else{ + ElMessage.warning(res.message) + } +} + +const addData = async () => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + if(state.form.dataList && state.form.dataList.length==0){ + ElMessage.warning('请上传应准备材料!') + return + } + if(state.form.recordList && state.form.recordList.length==0){ + 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 getCatalogDataList() + 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 getCatalogDataList() + await getFileList() + + }else{ + ElMessage.warning(res.message) + } + } + + + } +} +const openDataDialog = (type, value) => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); +} +const openRecordDialog = (type, value) => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRecordRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); +} + +const handleDataDelete = (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 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 deleteData = () => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delCatalogueData(state.form.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getCatalogDataList() + await getFileList() + }else{ + ElMessage.warning(res.message) + } + }) +} +const reset = async () => { + data.queryParams = { + companyId: '', + pageNum: 1, + pageSize: 10, + } + data.companyList = []; + 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 +} + +const getFileList = async () => { + const queryParams = { + companyId: state.form.companyId, + catalogueId: state.form.catalogueId + } + const res = await getFile(queryParams) + if (res.code == 200) { + state.form.dataList = res.data.data?.filter(i => i.type == 1) + state.form.recordList = res.data.data?.filter(i => i.type == 2) + } else { + ElMessage.warning(res.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: '文件读取失败' + }); + } + }) +} </script> -<template> -领导 -</template> - <style scoped lang="scss"> +.app-container{ + .bottom{ + display: flex; + width: auto; + height: auto; + border: 1px solid #c3c3c3; + margin: 20px; + .left{ + border-right: 1px solid darkgray; + display: flex; + min-width: 240px; + margin: 20px 20px 20px 50px; + flex-direction: column; + :deep(.el-tree){ + background: none; + } + } + .right{ + margin: 20px 20px 20px 10px; + flex: 1; + min-width: 100px; + :deep(.el-form-item__label){ + font-weight: 600;font-size: 20px + } + + } + } + +} </style> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/performanceManage/catalogPerformance/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/qualityManage/performanceManage/catalogPerformance/components/editDialog.vue new file mode 100644 index 0000000..3a02233 --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/qualityManage/performanceManage/catalogPerformance/components/editDialog.vue @@ -0,0 +1,182 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + :title="state.title" + width="600px" + :before-close="handleClose" + :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="parentId" > + <el-tree-select + v-model="state.form.parentId" + :data="state.menuOptions" + :props="{ value: 'id', label: 'name', children: 'children' }" + value-key="id" + placeholder="上级分支" + check-strictly + style="width: 100%" + /> + </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="mess"> + <el-input v-model.trim="state.form.mess" :disabled="state.title =='查看'" placeholder="目录名称"></el-input> + </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 {addCatalogue, editCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; + +const emit = defineEmits(["getList"]); +const dialogVisible = ref(false) +const superRef = ref() +const state = reactive({ + title: '', + form: { + id: null, + mess: '', + number:'', + parentId: null + }, + formRules:{ + mess: [{ required: true, message: '请输入目录名称', trigger: 'blur' }], + number: [{ required: true, message: '请输入序号', trigger: 'blur' }], + parentId:[{ required: true, message: '请选择上级分支', trigger: 'blur' }], + }, + isAdmin: false, + companyList: [], + menuOptions: [], + +}) +onMounted(() => { + +}); + +const openDialog = async (type, value,companyId, isAdmin,flag) => { + state.isAdmin = isAdmin + if(isAdmin){ + await getTreeselect() + } + state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' + if(state.title == '新增' && flag == 2){ + state.form.parentId = value.id + + }else if(state.title == '新增' && flag == 1 ){ + + state.form.parentId = 0 + + } + if(state.title == '编辑'||state.title == '查看'){ + Object.keys(state.form).forEach(key => { + if (key in value) { + state.form[key] = value[key] + } + }) + } + dialogVisible.value = true +} + + +const onSubmit = async () => { + const valid = await superRef.value.validate(); + console.log('state.form',state.form) + if(valid){ + if(state.title == '新增'){ + const {id,...data} = state.form + data.type = 9 + const res = await addCatalogue(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + }else{ + const {...data} = state.form + const res = await editCatalogue(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + } + } +} +const getTreeselect =async ()=> { + state.menuOptions = []; + const param = { + type: 9, + } + const res = await getCatalogue(param) + if(res.code == 200){ + const menu = { id: 0, name: "主目录", children: [] }; + menu.children = await handleTree(res.data.data) + state.menuOptions.push(menu); + }else{ + ElMessage.warning(res.message) + } +} + +const handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${node.number} ${node.mess}`; + // 递归处理子节点(传递当前序号路径) + if (node.children && node.children.length) { + traverse(node.children, node.number); + } + }); + }; + traverse(val); // 从根节点开始遍历 + return val; +} +const handleClose = () => { + state.form = { + id: null, + mess: '', + number:'', + parentId: null + } + state.isTree = false + 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> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/performanceManage/catalogPerformance/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/performanceManage/catalogPerformance/index.vue index 4031c53..04e18a1 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/performanceManage/catalogPerformance/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/performanceManage/catalogPerformance/index.vue @@ -1,11 +1,138 @@ -<script setup> - -</script> - <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 + type="primary" + plain + icon="Plus" + @click="openDialog('add','',1)" + >新增</el-button> + </el-form-item> + </el-form> + </div> + <!-- 表格数据 --> + <el-table v-loading="loading" + :data="dataList" + :border="true" + row-key="id" + :default-expand-all="true" + :tree-props="{ children: 'children'}" + > + <el-table-column label="目录名称" prop="mess" > + <template #default="scope"> + {{scope.row.number}} {{scope.row.mess}} + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDialog('add',scope.row,2)">新增</el-button> + <el-button link type="primary" @click="openDialog('edit',scope.row,null)">编辑</el-button> + <el-button link type="danger" v-if="scope.row.children && scope.row.children.length == 0" @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> -<style scoped lang="scss"> +<script setup> +import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; +import {ElMessage, ElMessageBox} from "element-plus"; +import editDialog from './components/editDialog.vue' +import useUserStore from "@/store/modules/user"; +import {delCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; +const userStore = useUserStore() +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const loadingCompany = ref(false) +const dialogRef = ref(); +const data = reactive({ + queryParams: { + pageNum: 1, + pageSize: 10, + companyId: null, + }, + total: 0, + dataList: [], + companyList: [], + industryList: [], + isAdmin: false, -</style> +}); + +const { queryParams, total, dataList,companyList,industryList, isAdmin } = toRefs(data); +const userInfo = ref() +onMounted(async ()=>{ + if(userStore.roles.includes('admin')){ + data.isAdmin = true + data.queryParams.companyId = null + }else{ + data.isAdmin = false + data.queryParams.companyId = userStore.companyId + } + await getList() + +}) + +onUnmounted(()=>{ + +}) + +const getList = async () => { + loading.value = true + const param = { + type: 9, + } + const res = await getCatalogue(param); + if(res.code === 200){ + data.dataList = res.data.data + }else{ + ElMessage.warning(res.message) + } + loading.value = false +} + +const openDialog = (type, value,flag) => { + + dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin,flag); +} + +/** 重置新增的表单以及其他数据 */ +const reset= async()=> { + data.queryParams = { + pageNum: 1, + pageSize: 10, + companyId: null, + } + await getList() +} +const handleDelete = (val) => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delCatalogue(val.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getList() + }else{ + ElMessage.warning(res.message) + } + }) +} + +</script> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/performanceManage/performance/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/performanceManage/performance/index.vue index 7eaa21a..483f2e3 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/performanceManage/performance/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/performanceManage/performance/index.vue @@ -1,11 +1,494 @@ -<script setup> +<template> + <div class="app-container"> + <div style="margin-bottom: 10px"> + <el-form style="display: flex;flex-wrap: wrap;"> + <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 v-if="data.isAdmin">--> + <!-- <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>--> + <!-- <el-button plain @click="reset">重置</el-button>--> + <!-- </el-form-item>--> + </el-form> + </div> + <div class="bottom"> + <div class="left"> + <span style="font-weight: 600;font-size: 24px">目录</span> + <el-tree + v-if="data.treeData" + style="max-width: 600px;margin-top: 20px" + :data="data.treeData" + :props="data.defaultProps" + :default-expand-all="true" + :expand-on-click-node="false" + highlight-current + @node-click="handleNodeClick" + ></el-tree> + <el-empty v-else description="暂无数据" /> + </div> + <div class="right"> + <el-form :model="state.form" size="default" ref="noticeRef" :rules="data.formRules" label-position="left" label-width="125px" > + <el-form-item label="具体内容" prop="content" > + <el-input v-model="state.form.content" :rows="4" type="textarea" /> + </el-form-item> + <el-form-item label="标准分析" prop="analysis" > + <el-input v-model="state.form.analysis" :rows="4" type="textarea" /> + </el-form-item> + <el-form-item label="应准备材料" prop="dataList"> + <el-button type="primary" @click="openDataDialog('add',{})">新增</el-button> + </el-form-item> + <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="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center" > + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDataDialog('edit',scope.row)" >编辑</el-button> + <el-button link type="danger" @click="handleDataDelete(scope.row)" >删除</el-button> + </template> + </el-table-column> + </el-table> + <el-form-item label="记录上传" prop="recordList"> + <el-button type="primary" @click="openRecordDialog('add',{})">新增</el-button> + </el-form-item> + <el-table style="margin-top: 15px;width: 100%" :data="state.form.recordList" :border="true" > + <el-table-column type="index" label="序号" width="80" align="center"></el-table-column> + <el-table-column label="记录名称" prop="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center"> + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openRecordDialog('edit',scope.row)" >编辑</el-button> + <el-button link type="danger" @click="handleRecordDelete(scope.row)" >删除</el-button> + </template> + </el-table-column> + </el-table> + </el-form> + <div style="display: flex;align-items: center;justify-content: right;margin-top: 10px"> + <el-button v-if="state.form.id" type="danger" @click="deleteData">删除</el-button> + <el-button type="primary" @click="addData()">保存</el-button> + </div> + </div> + </div> + <dataDialog ref="dialogRef" @getList="getFileList"></dataDialog> + <record-dialog ref="dialogRecordRef" @getList="getFileList"></record-dialog> + </div> +</template> +<script setup> +import {getCurrentInstance, 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 "@/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/dataDialog.vue" +import recordDialog from "@/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/recordDialog.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"; + +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const noticeRef = ref(); +const dialogRef = ref(); +const dialogRecordRef = ref(); +const loadingCompany = ref(false) +const data = reactive({ + queryParams: { + type: 9, + companyId: null, + }, + + formRules: { + content: [{ required: true, message: '请输入具体内容', trigger: 'blur' }], + analysis: [{ required: true, message: '请输入标准分析', trigger: 'blur' }], + dataList: [{ required: true, message: '', trigger: 'blur' }], + recordList: [{ required: true, message: '', trigger: 'blur' }] + }, + companyList: [], + isAdmin: false, + defaultProps: { + children: 'children', + label: 'name', + }, + treeData: [], + dataVisible: false, + dataTitle: '', + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization: getToken() + }, + fileLimit: 1, + fileDataList: [] + +}); +const state = reactive({ + form: { + id: '', + companyId: null, + content: '', + analysis: '', + catalogueId: null, + dataList: [], + recordList: [] + }, +}) +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; + 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 + }else { + data.queryParams.companyId = userInfo.companyId + state.form.companyId = userInfo.companyId + } + await getList(); + +}) +const getList = async () => { + data.treeData = []; + loading.value = true; + const param = { + type : 9 + } + 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 handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${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) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + data.companyList.forEach(item => { + if(item.name === val){ + data.queryParams.companyId = item.id + state.form.companyId = item.id + } + }) + if(state.form.catalogueId){ + await getCatalogDataList() + await getFileList() + } + +} + +const handleNodeClick = async (val) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + state.form.catalogueId = val.id + await getCatalogDataList() + await getFileList() +} +const getCatalogDataList = async () => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + const param = { + catalogueId: state.form.catalogueId, + companyId: state.form.companyId + } + const res = await getCatalogueData(param); + if(res.code === 200){ + // if(res.data.data && res.data.data.length >0){ + state.form.content= res.data.data[0]?.content + state.form.analysis = res.data.data[0]?.analysis + state.form.id = res.data.data[0]?.id + // } + + }else{ + ElMessage.warning(res.message) + } +} + +const addData = async () => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + if(state.form.dataList && state.form.dataList.length==0){ + ElMessage.warning('请上传应准备材料!') + return + } + if(state.form.recordList && state.form.recordList.length==0){ + 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 getCatalogDataList() + 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 getCatalogDataList() + await getFileList() + + }else{ + ElMessage.warning(res.message) + } + } + + + } +} +const openDataDialog = (type, value) => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); +} +const openRecordDialog = (type, value) => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRecordRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); +} + +const handleDataDelete = (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 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 deleteData = () => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delCatalogueData(state.form.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getCatalogDataList() + await getFileList() + }else{ + ElMessage.warning(res.message) + } + }) +} +const reset = async () => { + data.queryParams = { + companyId: '', + pageNum: 1, + pageSize: 10, + } + data.companyList = []; + 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 +} + +const getFileList = async () => { + const queryParams = { + companyId: state.form.companyId, + catalogueId: state.form.catalogueId + } + const res = await getFile(queryParams) + if (res.code == 200) { + state.form.dataList = res.data.data?.filter(i => i.type == 1) + state.form.recordList = res.data.data?.filter(i => i.type == 2) + } else { + ElMessage.warning(res.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: '文件读取失败' + }); + } + }) +} </script> -<template> -绩效 -</template> - <style scoped lang="scss"> +.app-container{ + .bottom{ + display: flex; + width: auto; + height: auto; + border: 1px solid #c3c3c3; + margin: 20px; + .left{ + border-right: 1px solid darkgray; + display: flex; + min-width: 240px; + margin: 20px 20px 20px 50px; + flex-direction: column; + :deep(.el-tree){ + background: none; + } + } + .right{ + margin: 20px 20px 20px 10px; + flex: 1; + min-width: 100px; + :deep(.el-form-item__label){ + font-weight: 600;font-size: 20px + } + + } + } + +} </style> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/catalogRange/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/catalogRange/components/editDialog.vue index dc360f7..ab01eb2 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/catalogRange/components/editDialog.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/catalogRange/components/editDialog.vue @@ -9,42 +9,23 @@ :close-on-click-modal="false" > <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" > - <el-form-item v-if="state.isAdmin" label="企业:" prop="companyId"> - <el-select - v-model="state.form.companyName" - filterable - remote - @change="selectValue" - reserve-keyword - placeholder="请输入企业名称" - remote-show-suffix - :remote-method="getCompanyList" - style="width: 100%" - > - <el-option - v-for="item in state.companyList" - :key="item.id" - :label="item.name" - :value="item.name" - /> - </el-select> - </el-form-item> - <el-form-item label="序号:" prop="num"> - <el-input v-model.trim="state.form.num" :disabled="state.title =='查看'" placeholder="序号"></el-input> - </el-form-item> - <el-form-item label="上级分支:" prop="parentId"> + <el-form-item label="上级分支:" prop="parentId" > <el-tree-select v-model="state.form.parentId" :data="state.menuOptions" - :props="{ value: 'id', label: 'label', children: 'children' }" + :props="{ value: 'id', label: 'name', children: 'children' }" value-key="id" placeholder="上级分支" check-strictly style="width: 100%" /> </el-form-item> - <el-form-item label="目录名称:" prop="name"> - <el-input v-model.trim="state.form.name" :disabled="state.title =='查看'" placeholder="目录名称"></el-input> + <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="mess"> + <el-input v-model.trim="state.form.mess" :disabled="state.title =='查看'" placeholder="目录名称"></el-input> </el-form-item> </el-form> <template #footer v-if="state.title !='查看'"> @@ -59,13 +40,7 @@ <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 {listMenu} from "@/api/system/menu"; +import {addCatalogue, editCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; const emit = defineEmits(["getList"]); const dialogVisible = ref(false) @@ -74,20 +49,19 @@ title: '', form: { id: null, - name: '', - num:'', - companyId: null, + mess: '', + number:'', parentId: null }, formRules:{ - companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], - name: [{ required: true, message: '请输入目录名称', trigger: 'blur' }], - num: [{ required: true, message: '请输入序号', trigger: 'blur' }], + mess: [{ required: true, message: '请输入目录名称', trigger: 'blur' }], + number: [{ required: true, message: '请输入序号', trigger: 'blur' }], parentId:[{ required: true, message: '请选择上级分支', trigger: 'blur' }], }, isAdmin: false, companyList: [], - menuOptions: [] + menuOptions: [], + }) onMounted(() => { @@ -96,15 +70,16 @@ const openDialog = async (type, value,companyId, isAdmin,flag) => { state.isAdmin = isAdmin if(isAdmin){ - await getCompanyList() await getTreeselect() } state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' - state.form.companyId = companyId if(state.title == '新增' && flag == 2){ state.form.parentId = value.id - }else if(state.title == '新增' && flag == 1){ + + }else if(state.title == '新增' && flag == 1 ){ + state.form.parentId = 0 + } if(state.title == '编辑'||state.title == '查看'){ Object.keys(state.form).forEach(key => { @@ -123,7 +98,8 @@ if(valid){ if(state.title == '新增'){ const {id,...data} = state.form - const res = await addIndustryTemp(data) + data.type = 1 + const res = await addCatalogue(data) if(res.code == 200){ ElMessage.success(res.message) emit('getList') @@ -133,7 +109,8 @@ ElMessage.warning(res.message) } }else{ - const res = await updateIndustryTemp(state.form) + const {...data} = state.form + const res = await editCatalogue(data) if(res.code == 200){ ElMessage.success(res.message) emit('getList') @@ -146,98 +123,44 @@ } } const getTreeselect =async ()=> { - // state.menuOptions = []; - // const res = await addIndustryTemp() - // if(res.code == 200){ - // const menu = { id: 0, name: "1范围", children: [] }; - // menu.children = response.data - // state.menuOptions.push(menu); - // }else{ - // ElMessage.warning(res.message) - // } state.menuOptions = []; - const menu = { id: 0, label: "1范围", children: [] }; - menu.children = [ - { - id: 1, - label: '1.1规范范围管理', - children: [ - { - id: 2, - label: 'Level three 1-1-1', - children: [ - { - id: 3, - label: 'Level three 1-1-1', - children: [ - { - id: 4, - label: 'Level three 1-1-1', - }, - ], - }, - ], - }, - ], - }, - { - id: 5, - label: '1.2收集需求', - }, - { - id: 6, - label: '1.3定义范围', - }, - ] + const param = { + type: 1, + } + const res = await getCatalogue(param) + if(res.code == 200){ + const menu = { id: 0, name: "主目录", children: [] }; + menu.children = await handleTree(res.data.data) state.menuOptions.push(menu); - + }else{ + ElMessage.warning(res.message) + } } +const handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${node.number} ${node.mess}`; + // 递归处理子节点(传递当前序号路径) + if (node.children && node.children.length) { + traverse(node.children, node.number); + } + }); + }; + traverse(val); // 从根节点开始遍历 + return val; +} const handleClose = () => { state.form = { id: null, - name: '', - num:'', - companyId: null, + mess: '', + number:'', parentId: null } + state.isTree = false superRef.value.clearValidate(); superRef.value.resetFields() dialogVisible.value = false; -} -const selectValue = (val) => { - state.companyList.forEach(item => { - if(item.name === val){ - state.form.companyId = item.id - } - }) -} - -const getCompanyList = async (val)=>{ - if(val){ - const queryParams = { - name: val - } - const res = await getCompany(queryParams) - if (res.code == 200) { - state.companyList = res.data.list - - } else { - ElMessage.warning(res.message) - } - }else { - const queryParams = { - pageSize: 10, - pageNum: 1, - } - const res = await getCompany(queryParams) - if (res.code == 200) { - state.companyList = res.data.list - - } else { - ElMessage.warning(res.message) - } - } } defineExpose({ openDialog diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/catalogRange/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/catalogRange/index.vue index 2d42ba2..50b2120 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/catalogRange/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/catalogRange/index.vue @@ -10,31 +10,6 @@ @click="openDialog('add','',1)" >新增</el-button> </el-form-item> - <el-form-item v-if="isAdmin" label="企业:" > - <el-select - v-model="data.queryParams.companyName" - filterable - remote - @change="selectValue" - reserve-keyword - placeholder="请输入企业名称" - 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 > - <el-button v-if="isAdmin" type="primary" @click="getList">查询</el-button> - <el-button v-if="isAdmin" type="primary" plain @click="reset">重置</el-button> - </el-form-item> </el-form> </div> <!-- 表格数据 --> @@ -42,16 +17,19 @@ :data="dataList" :border="true" row-key="id" - :default-expand-all="false" - :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" + :default-expand-all="true" + :tree-props="{ children: 'children'}" > - - <el-table-column label="目录名称" prop="label" align="center"></el-table-column> + <el-table-column label="目录名称" prop="mess" > + <template #default="scope"> + {{scope.row.number}} {{scope.row.mess}} + </template> + </el-table-column> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > <template #default="scope"> <el-button link type="primary" @click="openDialog('add',scope.row,2)">新增</el-button> <el-button link type="primary" @click="openDialog('edit',scope.row,null)">编辑</el-button> - <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> + <el-button link type="danger" v-if="scope.row.children && scope.row.children.length == 0" @click="handleDelete(scope.row)">删除</el-button> </template> </el-table-column> </el-table> @@ -69,18 +47,9 @@ <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 {delUser, getUser} from "@/api/onlineEducation/user"; -import Cookies from "js-cookie"; import editDialog from './components/editDialog.vue' - -import { - delIndustryTemp, - getIndustryTemp, -} from "@/api/staffManage/staff"; import useUserStore from "@/store/modules/user"; -import axios from "axios"; -import {getToken} from "@/utils/auth"; +import {delCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; const userStore = useUserStore() const { proxy } = getCurrentInstance(); const loading = ref(false); @@ -97,6 +66,7 @@ companyList: [], industryList: [], isAdmin: false, + }); const { queryParams, total, dataList,companyList,industryList, isAdmin } = toRefs(data); @@ -105,12 +75,12 @@ 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(()=>{ @@ -119,51 +89,15 @@ const getList = async () => { loading.value = true - // const res = await getIndustryTemp(data.queryParams) - // if(res.code == 200){ - // data.dataList = res.data.list || [] - // data.total = res.data.total - // }else{ - // ElMessage.warning(res.message) - // } - data.dataList = [ - { - parentId: 0, - id:1, - label: '1.1规范范围管理', - children: [ - { - parentId: 1, - id:2, - label: 'Level three 1-1-1', - children: [ - { - parentId: 2, - id:3, - label: 'Level three 1-1-1', - children: [ - { - parentId: 3, - id:4, - label: 'Level three 1-1-1', - }, - ], - }, - ], - }, - ], - }, - { - parentId: 0, - id:5, - label: '1.2收集需求', - }, - { - parentId: 0, - id:6, - label: '1.3定义范围', - }, - ] + const param = { + type: 1, + } + const res = await getCatalogue(param); + if(res.code === 200){ + data.dataList = res.data.data + }else{ + ElMessage.warning(res.message) + } loading.value = false } @@ -179,7 +113,6 @@ pageSize: 10, companyId: null, } - await getCompanyList() await getList() } const handleDelete = (val) => { @@ -192,7 +125,7 @@ type: 'warning', }) .then( async() => { - const res = await delIndustryTemp({companyRosterId: val.id}) + const res = await delCatalogue(val.id) if(res.code == 200){ ElMessage.success('数据删除成功') await getList() @@ -200,43 +133,6 @@ ElMessage.warning(res.message) } }) -} -const selectValue = (val) => { - data.companyList.forEach(item => { - if(item.name === val){ - data.queryParams.companyId = item.id - } - }) -} -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) - } - } } </script> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/dataDialog.vue b/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/dataDialog.vue index b71cda3..3cb634c 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/dataDialog.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/dataDialog.vue @@ -9,10 +9,10 @@ :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="templateName"> - <el-input v-model.trim="state.form.templateName" :disabled="state.title =='查看'" placeholder="材料名称"></el-input> + <el-form-item label="材料名称:" prop="name"> + <el-input v-model.trim="state.form.name" :disabled="state.title =='查看'" placeholder="材料名称"></el-input> </el-form-item> - <el-form-item label="模板文件:" prop="filePath"> + <el-form-item label="材料模板:" prop="filePath"> <el-upload accept=".doc,.docx" :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> @@ -39,6 +39,7 @@ 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"; const emit = defineEmits(["getList"]); const dialogVisible = ref(false) @@ -47,13 +48,15 @@ title: '', form: { id: null, - templateName: '', + name: '', filePath: '', - format: '', - companyId: null + fileName: '', + companyId: null, + catalogueId: null, + type:null }, formRules:{ - templateName: [{ required: true, message: '请输入材料名称', trigger: 'blur' }], + name: [{ required: true, message: '请输入材料名称', trigger: 'blur' }], }, isAdmin: false, companyList: [], @@ -69,13 +72,11 @@ }); -const openDialog = async (type, value,companyId, isAdmin, companyList) => { - state.isAdmin = isAdmin - if(isAdmin){ - state.companyList = companyList - } +const openDialog = async (type, value,companyId,catalogueId) => { state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' state.form.companyId = companyId + state.form.catalogueId = catalogueId + state.form.type = 1 if(state.title == '编辑'||state.title == '查看'){ Object.keys(state.form).forEach(key => { if (key in value) { @@ -85,7 +86,7 @@ if(value.filePath) { const obj = { url: value.filePath, - name: '模板文件' + name: value.fileName } state.fileList = [obj] } @@ -93,13 +94,12 @@ dialogVisible.value = true } - const onSubmit = async () => { const valid = await superRef.value.validate(); if(valid){ if(state.title == '新增'){ const {id,...data} = state.form - const res = await addIndustryTemp(data) + const res = await addFile(data) if(res.code == 200){ ElMessage.success(res.message) emit('getList') @@ -109,7 +109,8 @@ ElMessage.warning(res.message) } }else{ - const res = await updateIndustryTemp(state.form) + + const res = await editFile(state.form) if(res.code == 200){ ElMessage.success(res.message) emit('getList') @@ -124,8 +125,8 @@ const handleAvatarSuccess = (res, uploadFile) => { if(res.code == 200){ + state.form.fileName = res.data.originName state.form.filePath = res.data.path - state.form.format = '.' + res.data.filename.split('.')[1] }else{ state.fileList = [] ElMessage({ @@ -158,8 +159,8 @@ // type: 'success', // message: '文件已删除' // }) + state.form.fileName = '' state.form.filePath = '' - state.form.format = '' }else{ ElMessage({ type: 'warning', @@ -167,19 +168,22 @@ }) } }).catch(() => { - state.form.imgUrl = '' + state.form.fileName = '' + state.form.filePath = '' }); } const handleClose = () => { state.form = { id: null, - templateName: '', - industryType: '', + name: '', filePath: '', - format: '', - companyId: null + fileName: '', + companyId: null, + catalogueId: null, + type:null } + state.fileList = [] superRef.value.clearValidate(); superRef.value.resetFields() dialogVisible.value = false; diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/recordDialog.vue b/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/recordDialog.vue index ca300d2..3a83434 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/recordDialog.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/recordDialog.vue @@ -9,10 +9,10 @@ :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="templateName"> - <el-input v-model.trim="state.form.templateName" :disabled="state.title =='查看'" placeholder="材料名称"></el-input> + <el-form-item label="记录名称:" prop="name"> + <el-input v-model.trim="state.form.name" :disabled="state.title =='查看'" placeholder="记录名称"></el-input> </el-form-item> - <el-form-item label="模板文件:" prop="filePath"> + <el-form-item label="记录模板:" prop="filePath"> <el-upload accept=".doc,.docx" :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> @@ -39,6 +39,7 @@ 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"; const emit = defineEmits(["getList"]); const dialogVisible = ref(false) @@ -47,13 +48,15 @@ title: '', form: { id: null, - templateName: '', + name: '', filePath: '', - format: '', - companyId: null + fileName: '', + companyId: null, + catalogueId: null, + type:null }, formRules:{ - templateName: [{ required: true, message: '请输入材料名称', trigger: 'blur' }], + name: [{ required: true, message: '请输入记录名称', trigger: 'blur' }], }, isAdmin: false, companyList: [], @@ -69,13 +72,11 @@ }); -const openDialog = async (type, value,companyId, isAdmin, companyList) => { - state.isAdmin = isAdmin - if(isAdmin){ - state.companyList = companyList - } +const openDialog = async (type, value,companyId,catalogueId) => { state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' state.form.companyId = companyId + state.form.catalogueId = catalogueId + state.form.type = 2 if(state.title == '编辑'||state.title == '查看'){ Object.keys(state.form).forEach(key => { if (key in value) { @@ -85,7 +86,7 @@ if(value.filePath) { const obj = { url: value.filePath, - name: '模板文件' + name: value.fileName } state.fileList = [obj] } @@ -93,13 +94,12 @@ dialogVisible.value = true } - const onSubmit = async () => { const valid = await superRef.value.validate(); if(valid){ if(state.title == '新增'){ const {id,...data} = state.form - const res = await addIndustryTemp(data) + const res = await addFile(data) if(res.code == 200){ ElMessage.success(res.message) emit('getList') @@ -109,7 +109,8 @@ ElMessage.warning(res.message) } }else{ - const res = await updateIndustryTemp(state.form) + + const res = await editFile(state.form) if(res.code == 200){ ElMessage.success(res.message) emit('getList') @@ -124,8 +125,8 @@ const handleAvatarSuccess = (res, uploadFile) => { if(res.code == 200){ + state.form.fileName = res.data.originName state.form.filePath = res.data.path - state.form.format = '.' + res.data.filename.split('.')[1] }else{ state.fileList = [] ElMessage({ @@ -158,8 +159,8 @@ // type: 'success', // message: '文件已删除' // }) + state.form.fileName = '' state.form.filePath = '' - state.form.format = '' }else{ ElMessage({ type: 'warning', @@ -167,19 +168,22 @@ }) } }).catch(() => { - state.form.imgUrl = '' + state.form.fileName = '' + state.form.filePath = '' }); } const handleClose = () => { state.form = { id: null, - templateName: '', - industryType: '', + name: '', filePath: '', - format: '', - companyId: null + fileName: '', + companyId: null, + catalogueId: null, + type:null } + state.fileList = [] superRef.value.clearValidate(); superRef.value.resetFields() dialogVisible.value = false; diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/index.vue index a723839..1c8a67a 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/index.vue @@ -9,7 +9,6 @@ remote @change="selectValue" reserve-keyword - placeholder="请输入企业名称" remote-show-suffix :remote-method="getCompanyList" :loading="loadingCompany" @@ -23,40 +22,46 @@ /> </el-select> </el-form-item> - <el-form-item v-if="data.isAdmin"> - <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button> - <el-button plain @click="reset">重置</el-button> - </el-form-item> +<!-- <el-form-item v-if="data.isAdmin">--> +<!-- <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>--> +<!-- <el-button plain @click="reset">重置</el-button>--> +<!-- </el-form-item>--> </el-form> </div> <div class="bottom"> <div class="left"> <span style="font-weight: 600;font-size: 24px">目录</span> <el-tree + v-if="data.treeData" style="max-width: 600px;margin-top: 20px" :data="data.treeData" :props="data.defaultProps" :default-expand-all="true" :expand-on-click-node="false" + highlight-current @node-click="handleNodeClick" - /> - + ></el-tree> + <el-empty v-else description="暂无数据" /> </div> <div class="right"> - <el-form :model="data.form" size="default" ref="noticeRef" :rules="data.formRules" label-position="left" label-width="125px" > + <el-form :model="state.form" size="default" ref="noticeRef" :rules="data.formRules" label-position="left" label-width="125px" > <el-form-item label="具体内容" prop="content" > - <el-input v-model="data.form.content" :rows="4" type="textarea" /> + <el-input v-model="state.form.content" :rows="4" type="textarea" /> </el-form-item> <el-form-item label="标准分析" prop="analysis" > - <el-input v-model="data.form.analysis" :rows="4" type="textarea" /> + <el-input v-model="state.form.analysis" :rows="4" type="textarea" /> </el-form-item> <el-form-item label="应准备材料" prop="dataList"> <el-button type="primary" @click="openDataDialog('add',{})">新增</el-button> </el-form-item> - <el-table style="margin:15px 0;width: 80%" :data="data.form.dataList" :border="true" > + <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="companyName" align="center" /> - <el-table-column label="材料模板" prop="companyName" align="center" /> + <el-table-column label="材料名称" prop="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center" > + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > <template #default="scope"> <el-button link type="primary" @click="openDataDialog('edit',scope.row)" >编辑</el-button> @@ -67,10 +72,14 @@ <el-form-item label="记录上传" prop="recordList"> <el-button type="primary" @click="openRecordDialog('add',{})">新增</el-button> </el-form-item> - <el-table style="margin-top: 15px;width: 80%" :data="data.form.recordList" :border="true" > + <el-table style="margin-top: 15px;width: 100%" :data="state.form.recordList" :border="true" > <el-table-column type="index" label="序号" width="80" align="center"></el-table-column> - <el-table-column label="记录名称" prop="companyName" align="center" /> - <el-table-column label="记录模板" prop="companyName" align="center" /> + <el-table-column label="记录名称" prop="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center"> + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > <template #default="scope"> <el-button link type="primary" @click="openRecordDialog('edit',scope.row)" >编辑</el-button> @@ -79,11 +88,15 @@ </el-table-column> </el-table> </el-form> - <el-button type="primary" style="margin-top: 20px;text-align: right;float: right">保存</el-button> + <div style="display: flex;align-items: center;justify-content: right;margin-top: 10px"> + <el-button v-if="state.form.id" type="danger" @click="deleteData">删除</el-button> + <el-button type="primary" @click="addData()">保存</el-button> + </div> + </div> </div> - <dataDialog ref="dialogRef" @getList="getList"></dataDialog> - <record-dialog ref="dialogRecordRef" @getList="getList"></record-dialog> + <dataDialog ref="dialogRef" @getList="getFileList"></dataDialog> + <record-dialog ref="dialogRecordRef" @getList="getFileList"></record-dialog> </div> </template> <script setup> @@ -96,6 +109,16 @@ import dataDialog from "./components/dataDialog.vue" import recordDialog from "./components/recordDialog.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"; const { proxy } = getCurrentInstance(); const loading = ref(false); @@ -103,64 +126,25 @@ const dialogRef = ref(); const dialogRecordRef = ref(); const loadingCompany = ref(false) -const choosedData = ref([]) const data = reactive({ queryParams: { - pageNum: 1, - pageSize: 10, + type: 1, companyId: null, }, - form: { - id: '', - companyId: null, - content: '', - analysis: '', - dataList: [], - recordList: [] - }, + formRules: { content: [{ required: true, message: '请输入具体内容', trigger: 'blur' }], analysis: [{ required: true, message: '请输入标准分析', trigger: 'blur' }], - dataList: [{ required: true, message: '请输入标准分析', trigger: 'blur' }], - recordList: [{ required: true, message: '请输入标准分析', trigger: 'blur' }] + dataList: [{ required: true, message: '', trigger: 'blur' }], + recordList: [{ required: true, message: '', trigger: 'blur' }] }, companyList: [], isAdmin: false, defaultProps: { children: 'children', - label: 'label', + label: 'name', }, - treeData: [ - { - label: '1范围', - children: [ - { - label: '1.1规范范围管理', - children: [ - { - label: 'Level three 1-1-1', - children: [ - { - label: 'Level three 1-1-1', - children: [ - { - label: 'Level three 1-1-1', - }, - ], - }, - ], - }, - ], - }, - { - label: '1.2收集需求', - }, - { - label: '1.3定义范围', - }, - ], - }, - ], + treeData: [], dataVisible: false, dataTitle: '', uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', @@ -171,6 +155,17 @@ fileDataList: [] }); +const state = reactive({ + form: { + id: '', + companyId: null, + content: '', + analysis: '', + catalogueId: null, + dataList: [], + recordList: [] + }, +}) const dataList = ref([]); const total = ref(0); @@ -184,23 +179,42 @@ await getCompanyList() data.queryParams.companyId = data.companyList[0].id data.queryParams.companyName = data.companyList[0].name - data.form.companyId = data.companyList[0].id + state.form.companyId = data.companyList[0].id }else { data.queryParams.companyId = userInfo.companyId + state.form.companyId = userInfo.companyId } await getList(); + }) const getList = async () => { + data.treeData = []; loading.value = true; - // const res = await getBasic(data.queryParams); - // if(res.code === 200){ - // dataList.value = res.data.list - // total.value = res.data.total - // }else{ - // ElMessage.warning(res.message) - // } + const param = { + type : 1 + } + 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 handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${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){ @@ -232,35 +246,111 @@ } } } -const selectValue = (val) => { +const selectValue = async (val) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' data.companyList.forEach(item => { if(item.name === val){ data.queryParams.companyId = item.id + state.form.companyId = item.id } }) -} -const searchClick = () => { - getList(); -} -function reset() { - data.queryParams = { - companyId: '', - pageNum: 1, - pageSize: 10, + if(state.form.catalogueId){ + await getCatalogDataList() + await getFileList() } - choosedData.value = [] - data.companyList = []; - getList(); - getCompanyList() + } -const handleNodeClick = (val) => { - console.log('node',val) + +const handleNodeClick = async (val) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + state.form.catalogueId = val.id + await getCatalogDataList() + await getFileList() +} +const getCatalogDataList = async () => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + const param = { + catalogueId: state.form.catalogueId, + companyId: state.form.companyId + } + const res = await getCatalogueData(param); + if(res.code === 200){ + // if(res.data.data && res.data.data.length >0){ + state.form.content= res.data.data[0]?.content + state.form.analysis = res.data.data[0]?.analysis + state.form.id = res.data.data[0]?.id + // } + + }else{ + ElMessage.warning(res.message) + } +} + +const addData = async () => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + if(state.form.dataList && state.form.dataList.length==0){ + ElMessage.warning('请上传应准备材料!') + return + } + if(state.form.recordList && state.form.recordList.length==0){ + 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 getCatalogDataList() + 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 getCatalogDataList() + await getFileList() + + }else{ + ElMessage.warning(res.message) + } + } + + + } } const openDataDialog = (type, value) => { - dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList); + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); } const openRecordDialog = (type, value) => { - dialogRecordRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList); + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRecordRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); } const handleDataDelete = (val) => { @@ -273,10 +363,10 @@ type: 'warning', }) .then( async() => { - const res = await delSysClause({id: val.id}) + const res = await delFile(val.id) if(res.code == 200){ ElMessage.success('数据删除成功') - await getList() + await getFileList() }else{ ElMessage.warning(res.message) } @@ -293,14 +383,80 @@ type: 'warning', }) .then( async() => { - const res = await delSysClause({id: val.id}) + const res = await delFile(val.id) if(res.code == 200){ ElMessage.success('数据删除成功') - await getList() + await getFileList() }else{ ElMessage.warning(res.message) } }) +} +const deleteData = () => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delCatalogueData(state.form.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getCatalogDataList() + await getFileList() + }else{ + ElMessage.warning(res.message) + } + }) +} +const reset = async () => { + data.queryParams = { + companyId: '', + pageNum: 1, + pageSize: 10, + } + data.companyList = []; + 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 +} + +const getFileList = async () => { + const queryParams = { + companyId: state.form.companyId, + catalogueId: state.form.catalogueId + } + const res = await getFile(queryParams) + if (res.code == 200) { + state.form.dataList = res.data.data?.filter(i => i.type == 1) + state.form.recordList = res.data.data?.filter(i => i.type == 2) + } else { + ElMessage.warning(res.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: '文件读取失败' + }); + } + }) } </script> @@ -322,11 +478,11 @@ :deep(.el-tree){ background: none; } - } .right{ margin: 20px 20px 20px 10px; flex: 1; + min-width: 100px; :deep(.el-form-item__label){ font-weight: 600;font-size: 20px } diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/runManage/catalogRun/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/qualityManage/runManage/catalogRun/components/editDialog.vue new file mode 100644 index 0000000..912b251 --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/qualityManage/runManage/catalogRun/components/editDialog.vue @@ -0,0 +1,182 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + :title="state.title" + width="600px" + :before-close="handleClose" + :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="parentId" > + <el-tree-select + v-model="state.form.parentId" + :data="state.menuOptions" + :props="{ value: 'id', label: 'name', children: 'children' }" + value-key="id" + placeholder="上级分支" + check-strictly + style="width: 100%" + /> + </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="mess"> + <el-input v-model.trim="state.form.mess" :disabled="state.title =='查看'" placeholder="目录名称"></el-input> + </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 {addCatalogue, editCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; + +const emit = defineEmits(["getList"]); +const dialogVisible = ref(false) +const superRef = ref() +const state = reactive({ + title: '', + form: { + id: null, + mess: '', + number:'', + parentId: null + }, + formRules:{ + mess: [{ required: true, message: '请输入目录名称', trigger: 'blur' }], + number: [{ required: true, message: '请输入序号', trigger: 'blur' }], + parentId:[{ required: true, message: '请选择上级分支', trigger: 'blur' }], + }, + isAdmin: false, + companyList: [], + menuOptions: [], + +}) +onMounted(() => { + +}); + +const openDialog = async (type, value,companyId, isAdmin,flag) => { + state.isAdmin = isAdmin + if(isAdmin){ + await getTreeselect() + } + state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' + if(state.title == '新增' && flag == 2){ + state.form.parentId = value.id + + }else if(state.title == '新增' && flag == 1 ){ + + state.form.parentId = 0 + + } + if(state.title == '编辑'||state.title == '查看'){ + Object.keys(state.form).forEach(key => { + if (key in value) { + state.form[key] = value[key] + } + }) + } + dialogVisible.value = true +} + + +const onSubmit = async () => { + const valid = await superRef.value.validate(); + console.log('state.form',state.form) + if(valid){ + if(state.title == '新增'){ + const {id,...data} = state.form + data.type = 8 + const res = await addCatalogue(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + }else{ + const {...data} = state.form + const res = await editCatalogue(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + } + } +} +const getTreeselect =async ()=> { + state.menuOptions = []; + const param = { + type: 8, + } + const res = await getCatalogue(param) + if(res.code == 200){ + const menu = { id: 0, name: "主目录", children: [] }; + menu.children = await handleTree(res.data.data) + state.menuOptions.push(menu); + }else{ + ElMessage.warning(res.message) + } +} + +const handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${node.number} ${node.mess}`; + // 递归处理子节点(传递当前序号路径) + if (node.children && node.children.length) { + traverse(node.children, node.number); + } + }); + }; + traverse(val); // 从根节点开始遍历 + return val; +} +const handleClose = () => { + state.form = { + id: null, + mess: '', + number:'', + parentId: null + } + state.isTree = false + 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> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/runManage/catalogRun/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/runManage/catalogRun/index.vue index 634b5e4..e68d7db 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/runManage/catalogRun/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/runManage/catalogRun/index.vue @@ -1,11 +1,138 @@ -<script setup> - -</script> - <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 + type="primary" + plain + icon="Plus" + @click="openDialog('add','',1)" + >新增</el-button> + </el-form-item> + </el-form> + </div> + <!-- 表格数据 --> + <el-table v-loading="loading" + :data="dataList" + :border="true" + row-key="id" + :default-expand-all="true" + :tree-props="{ children: 'children'}" + > + <el-table-column label="目录名称" prop="mess" > + <template #default="scope"> + {{scope.row.number}} {{scope.row.mess}} + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDialog('add',scope.row,2)">新增</el-button> + <el-button link type="primary" @click="openDialog('edit',scope.row,null)">编辑</el-button> + <el-button link type="danger" v-if="scope.row.children && scope.row.children.length == 0" @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> -<style scoped lang="scss"> +<script setup> +import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; +import {ElMessage, ElMessageBox} from "element-plus"; +import editDialog from './components/editDialog.vue' +import useUserStore from "@/store/modules/user"; +import {delCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; +const userStore = useUserStore() +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const loadingCompany = ref(false) +const dialogRef = ref(); +const data = reactive({ + queryParams: { + pageNum: 1, + pageSize: 10, + companyId: null, + }, + total: 0, + dataList: [], + companyList: [], + industryList: [], + isAdmin: false, -</style> +}); + +const { queryParams, total, dataList,companyList,industryList, isAdmin } = toRefs(data); +const userInfo = ref() +onMounted(async ()=>{ + if(userStore.roles.includes('admin')){ + data.isAdmin = true + data.queryParams.companyId = null + }else{ + data.isAdmin = false + data.queryParams.companyId = userStore.companyId + } + await getList() + +}) + +onUnmounted(()=>{ + +}) + +const getList = async () => { + loading.value = true + const param = { + type: 8, + } + const res = await getCatalogue(param); + if(res.code === 200){ + data.dataList = res.data.data + }else{ + ElMessage.warning(res.message) + } + loading.value = false +} + +const openDialog = (type, value,flag) => { + + dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin,flag); +} + +/** 重置新增的表单以及其他数据 */ +const reset= async()=> { + data.queryParams = { + pageNum: 1, + pageSize: 10, + companyId: null, + } + await getList() +} +const handleDelete = (val) => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delCatalogue(val.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getList() + }else{ + ElMessage.warning(res.message) + } + }) +} + +</script> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/runManage/run/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/runManage/run/index.vue index 7fedae3..b911121 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/runManage/run/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/runManage/run/index.vue @@ -1,11 +1,494 @@ -<script setup> +<template> + <div class="app-container"> + <div style="margin-bottom: 10px"> + <el-form style="display: flex;flex-wrap: wrap;"> + <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 v-if="data.isAdmin">--> + <!-- <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>--> + <!-- <el-button plain @click="reset">重置</el-button>--> + <!-- </el-form-item>--> + </el-form> + </div> + <div class="bottom"> + <div class="left"> + <span style="font-weight: 600;font-size: 24px">目录</span> + <el-tree + v-if="data.treeData" + style="max-width: 600px;margin-top: 20px" + :data="data.treeData" + :props="data.defaultProps" + :default-expand-all="true" + :expand-on-click-node="false" + highlight-current + @node-click="handleNodeClick" + ></el-tree> + <el-empty v-else description="暂无数据" /> + </div> + <div class="right"> + <el-form :model="state.form" size="default" ref="noticeRef" :rules="data.formRules" label-position="left" label-width="125px" > + <el-form-item label="具体内容" prop="content" > + <el-input v-model="state.form.content" :rows="4" type="textarea" /> + </el-form-item> + <el-form-item label="标准分析" prop="analysis" > + <el-input v-model="state.form.analysis" :rows="4" type="textarea" /> + </el-form-item> + <el-form-item label="应准备材料" prop="dataList"> + <el-button type="primary" @click="openDataDialog('add',{})">新增</el-button> + </el-form-item> + <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="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center" > + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDataDialog('edit',scope.row)" >编辑</el-button> + <el-button link type="danger" @click="handleDataDelete(scope.row)" >删除</el-button> + </template> + </el-table-column> + </el-table> + <el-form-item label="记录上传" prop="recordList"> + <el-button type="primary" @click="openRecordDialog('add',{})">新增</el-button> + </el-form-item> + <el-table style="margin-top: 15px;width: 100%" :data="state.form.recordList" :border="true" > + <el-table-column type="index" label="序号" width="80" align="center"></el-table-column> + <el-table-column label="记录名称" prop="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center"> + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openRecordDialog('edit',scope.row)" >编辑</el-button> + <el-button link type="danger" @click="handleRecordDelete(scope.row)" >删除</el-button> + </template> + </el-table-column> + </el-table> + </el-form> + <div style="display: flex;align-items: center;justify-content: right;margin-top: 10px"> + <el-button v-if="state.form.id" type="danger" @click="deleteData">删除</el-button> + <el-button type="primary" @click="addData()">保存</el-button> + </div> + </div> + </div> + <dataDialog ref="dialogRef" @getList="getFileList"></dataDialog> + <record-dialog ref="dialogRecordRef" @getList="getFileList"></record-dialog> + </div> +</template> +<script setup> +import {getCurrentInstance, 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 "@/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/dataDialog.vue" +import recordDialog from "@/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/recordDialog.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"; + +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const noticeRef = ref(); +const dialogRef = ref(); +const dialogRecordRef = ref(); +const loadingCompany = ref(false) +const data = reactive({ + queryParams: { + type: 8, + companyId: null, + }, + + formRules: { + content: [{ required: true, message: '请输入具体内容', trigger: 'blur' }], + analysis: [{ required: true, message: '请输入标准分析', trigger: 'blur' }], + dataList: [{ required: true, message: '', trigger: 'blur' }], + recordList: [{ required: true, message: '', trigger: 'blur' }] + }, + companyList: [], + isAdmin: false, + defaultProps: { + children: 'children', + label: 'name', + }, + treeData: [], + dataVisible: false, + dataTitle: '', + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization: getToken() + }, + fileLimit: 1, + fileDataList: [] + +}); +const state = reactive({ + form: { + id: '', + companyId: null, + content: '', + analysis: '', + catalogueId: null, + dataList: [], + recordList: [] + }, +}) +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; + 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 + }else { + data.queryParams.companyId = userInfo.companyId + state.form.companyId = userInfo.companyId + } + await getList(); + +}) +const getList = async () => { + data.treeData = []; + loading.value = true; + const param = { + type : 8 + } + 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 handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${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) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + data.companyList.forEach(item => { + if(item.name === val){ + data.queryParams.companyId = item.id + state.form.companyId = item.id + } + }) + if(state.form.catalogueId){ + await getCatalogDataList() + await getFileList() + } + +} + +const handleNodeClick = async (val) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + state.form.catalogueId = val.id + await getCatalogDataList() + await getFileList() +} +const getCatalogDataList = async () => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + const param = { + catalogueId: state.form.catalogueId, + companyId: state.form.companyId + } + const res = await getCatalogueData(param); + if(res.code === 200){ + // if(res.data.data && res.data.data.length >0){ + state.form.content= res.data.data[0]?.content + state.form.analysis = res.data.data[0]?.analysis + state.form.id = res.data.data[0]?.id + // } + + }else{ + ElMessage.warning(res.message) + } +} + +const addData = async () => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + if(state.form.dataList && state.form.dataList.length==0){ + ElMessage.warning('请上传应准备材料!') + return + } + if(state.form.recordList && state.form.recordList.length==0){ + 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 getCatalogDataList() + 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 getCatalogDataList() + await getFileList() + + }else{ + ElMessage.warning(res.message) + } + } + + + } +} +const openDataDialog = (type, value) => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); +} +const openRecordDialog = (type, value) => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRecordRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); +} + +const handleDataDelete = (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 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 deleteData = () => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delCatalogueData(state.form.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getCatalogDataList() + await getFileList() + }else{ + ElMessage.warning(res.message) + } + }) +} +const reset = async () => { + data.queryParams = { + companyId: '', + pageNum: 1, + pageSize: 10, + } + data.companyList = []; + 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 +} + +const getFileList = async () => { + const queryParams = { + companyId: state.form.companyId, + catalogueId: state.form.catalogueId + } + const res = await getFile(queryParams) + if (res.code == 200) { + state.form.dataList = res.data.data?.filter(i => i.type == 1) + state.form.recordList = res.data.data?.filter(i => i.type == 2) + } else { + ElMessage.warning(res.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: '文件读取失败' + }); + } + }) +} </script> -<template> -运行 -</template> - <style scoped lang="scss"> +.app-container{ + .bottom{ + display: flex; + width: auto; + height: auto; + border: 1px solid #c3c3c3; + margin: 20px; + .left{ + border-right: 1px solid darkgray; + display: flex; + min-width: 240px; + margin: 20px 20px 20px 50px; + flex-direction: column; + :deep(.el-tree){ + background: none; + } + } + .right{ + margin: 20px 20px 20px 10px; + flex: 1; + min-width: 100px; + :deep(.el-form-item__label){ + font-weight: 600;font-size: 20px + } + + } + } + +} </style> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/supportManage/catalogSupport/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/qualityManage/supportManage/catalogSupport/components/editDialog.vue new file mode 100644 index 0000000..12f2550 --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/qualityManage/supportManage/catalogSupport/components/editDialog.vue @@ -0,0 +1,182 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + :title="state.title" + width="600px" + :before-close="handleClose" + :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="parentId" > + <el-tree-select + v-model="state.form.parentId" + :data="state.menuOptions" + :props="{ value: 'id', label: 'name', children: 'children' }" + value-key="id" + placeholder="上级分支" + check-strictly + style="width: 100%" + /> + </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="mess"> + <el-input v-model.trim="state.form.mess" :disabled="state.title =='查看'" placeholder="目录名称"></el-input> + </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 {addCatalogue, editCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; + +const emit = defineEmits(["getList"]); +const dialogVisible = ref(false) +const superRef = ref() +const state = reactive({ + title: '', + form: { + id: null, + mess: '', + number:'', + parentId: null + }, + formRules:{ + mess: [{ required: true, message: '请输入目录名称', trigger: 'blur' }], + number: [{ required: true, message: '请输入序号', trigger: 'blur' }], + parentId:[{ required: true, message: '请选择上级分支', trigger: 'blur' }], + }, + isAdmin: false, + companyList: [], + menuOptions: [], + +}) +onMounted(() => { + +}); + +const openDialog = async (type, value,companyId, isAdmin,flag) => { + state.isAdmin = isAdmin + if(isAdmin){ + await getTreeselect() + } + state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' + if(state.title == '新增' && flag == 2){ + state.form.parentId = value.id + + }else if(state.title == '新增' && flag == 1 ){ + + state.form.parentId = 0 + + } + if(state.title == '编辑'||state.title == '查看'){ + Object.keys(state.form).forEach(key => { + if (key in value) { + state.form[key] = value[key] + } + }) + } + dialogVisible.value = true +} + + +const onSubmit = async () => { + const valid = await superRef.value.validate(); + console.log('state.form',state.form) + if(valid){ + if(state.title == '新增'){ + const {id,...data} = state.form + data.type = 7 + const res = await addCatalogue(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + }else{ + const {...data} = state.form + const res = await editCatalogue(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + } + } +} +const getTreeselect =async ()=> { + state.menuOptions = []; + const param = { + type: 7, + } + const res = await getCatalogue(param) + if(res.code == 200){ + const menu = { id: 0, name: "主目录", children: [] }; + menu.children = await handleTree(res.data.data) + state.menuOptions.push(menu); + }else{ + ElMessage.warning(res.message) + } +} + +const handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${node.number} ${node.mess}`; + // 递归处理子节点(传递当前序号路径) + if (node.children && node.children.length) { + traverse(node.children, node.number); + } + }); + }; + traverse(val); // 从根节点开始遍历 + return val; +} +const handleClose = () => { + state.form = { + id: null, + mess: '', + number:'', + parentId: null + } + state.isTree = false + 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> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/supportManage/catalogSupport/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/supportManage/catalogSupport/index.vue index 19e9f54..9320357 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/supportManage/catalogSupport/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/supportManage/catalogSupport/index.vue @@ -1,11 +1,138 @@ -<script setup> - -</script> - <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 + type="primary" + plain + icon="Plus" + @click="openDialog('add','',1)" + >新增</el-button> + </el-form-item> + </el-form> + </div> + <!-- 表格数据 --> + <el-table v-loading="loading" + :data="dataList" + :border="true" + row-key="id" + :default-expand-all="true" + :tree-props="{ children: 'children'}" + > + <el-table-column label="目录名称" prop="mess" > + <template #default="scope"> + {{scope.row.number}} {{scope.row.mess}} + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDialog('add',scope.row,2)">新增</el-button> + <el-button link type="primary" @click="openDialog('edit',scope.row,null)">编辑</el-button> + <el-button link type="danger" v-if="scope.row.children && scope.row.children.length == 0" @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> -<style scoped lang="scss"> +<script setup> +import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; +import {ElMessage, ElMessageBox} from "element-plus"; +import editDialog from './components/editDialog.vue' +import useUserStore from "@/store/modules/user"; +import {delCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; +const userStore = useUserStore() +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const loadingCompany = ref(false) +const dialogRef = ref(); +const data = reactive({ + queryParams: { + pageNum: 1, + pageSize: 10, + companyId: null, + }, + total: 0, + dataList: [], + companyList: [], + industryList: [], + isAdmin: false, -</style> +}); + +const { queryParams, total, dataList,companyList,industryList, isAdmin } = toRefs(data); +const userInfo = ref() +onMounted(async ()=>{ + if(userStore.roles.includes('admin')){ + data.isAdmin = true + data.queryParams.companyId = null + }else{ + data.isAdmin = false + data.queryParams.companyId = userStore.companyId + } + await getList() + +}) + +onUnmounted(()=>{ + +}) + +const getList = async () => { + loading.value = true + const param = { + type: 7, + } + const res = await getCatalogue(param); + if(res.code === 200){ + data.dataList = res.data.data + }else{ + ElMessage.warning(res.message) + } + loading.value = false +} + +const openDialog = (type, value,flag) => { + + dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin,flag); +} + +/** 重置新增的表单以及其他数据 */ +const reset= async()=> { + data.queryParams = { + pageNum: 1, + pageSize: 10, + companyId: null, + } + await getList() +} +const handleDelete = (val) => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delCatalogue(val.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getList() + }else{ + ElMessage.warning(res.message) + } + }) +} + +</script> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/supportManage/support/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/supportManage/support/index.vue index 702d867..04bf7fb 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/supportManage/support/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/supportManage/support/index.vue @@ -1,11 +1,494 @@ -<script setup> +<template> + <div class="app-container"> + <div style="margin-bottom: 10px"> + <el-form style="display: flex;flex-wrap: wrap;"> + <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 v-if="data.isAdmin">--> + <!-- <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>--> + <!-- <el-button plain @click="reset">重置</el-button>--> + <!-- </el-form-item>--> + </el-form> + </div> + <div class="bottom"> + <div class="left"> + <span style="font-weight: 600;font-size: 24px">目录</span> + <el-tree + v-if="data.treeData" + style="max-width: 600px;margin-top: 20px" + :data="data.treeData" + :props="data.defaultProps" + :default-expand-all="true" + :expand-on-click-node="false" + highlight-current + @node-click="handleNodeClick" + ></el-tree> + <el-empty v-else description="暂无数据" /> + </div> + <div class="right"> + <el-form :model="state.form" size="default" ref="noticeRef" :rules="data.formRules" label-position="left" label-width="125px" > + <el-form-item label="具体内容" prop="content" > + <el-input v-model="state.form.content" :rows="4" type="textarea" /> + </el-form-item> + <el-form-item label="标准分析" prop="analysis" > + <el-input v-model="state.form.analysis" :rows="4" type="textarea" /> + </el-form-item> + <el-form-item label="应准备材料" prop="dataList"> + <el-button type="primary" @click="openDataDialog('add',{})">新增</el-button> + </el-form-item> + <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="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center" > + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDataDialog('edit',scope.row)" >编辑</el-button> + <el-button link type="danger" @click="handleDataDelete(scope.row)" >删除</el-button> + </template> + </el-table-column> + </el-table> + <el-form-item label="记录上传" prop="recordList"> + <el-button type="primary" @click="openRecordDialog('add',{})">新增</el-button> + </el-form-item> + <el-table style="margin-top: 15px;width: 100%" :data="state.form.recordList" :border="true" > + <el-table-column type="index" label="序号" width="80" align="center"></el-table-column> + <el-table-column label="记录名称" prop="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center"> + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openRecordDialog('edit',scope.row)" >编辑</el-button> + <el-button link type="danger" @click="handleRecordDelete(scope.row)" >删除</el-button> + </template> + </el-table-column> + </el-table> + </el-form> + <div style="display: flex;align-items: center;justify-content: right;margin-top: 10px"> + <el-button v-if="state.form.id" type="danger" @click="deleteData">删除</el-button> + <el-button type="primary" @click="addData()">保存</el-button> + </div> + </div> + </div> + <dataDialog ref="dialogRef" @getList="getFileList"></dataDialog> + <record-dialog ref="dialogRecordRef" @getList="getFileList"></record-dialog> + </div> +</template> +<script setup> +import {getCurrentInstance, 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 "@/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/dataDialog.vue" +import recordDialog from "@/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/recordDialog.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"; + +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const noticeRef = ref(); +const dialogRef = ref(); +const dialogRecordRef = ref(); +const loadingCompany = ref(false) +const data = reactive({ + queryParams: { + type: 7, + companyId: null, + }, + + formRules: { + content: [{ required: true, message: '请输入具体内容', trigger: 'blur' }], + analysis: [{ required: true, message: '请输入标准分析', trigger: 'blur' }], + dataList: [{ required: true, message: '', trigger: 'blur' }], + recordList: [{ required: true, message: '', trigger: 'blur' }] + }, + companyList: [], + isAdmin: false, + defaultProps: { + children: 'children', + label: 'name', + }, + treeData: [], + dataVisible: false, + dataTitle: '', + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization: getToken() + }, + fileLimit: 1, + fileDataList: [] + +}); +const state = reactive({ + form: { + id: '', + companyId: null, + content: '', + analysis: '', + catalogueId: null, + dataList: [], + recordList: [] + }, +}) +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; + 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 + }else { + data.queryParams.companyId = userInfo.companyId + state.form.companyId = userInfo.companyId + } + await getList(); + +}) +const getList = async () => { + data.treeData = []; + loading.value = true; + const param = { + type : 7 + } + 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 handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${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) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + data.companyList.forEach(item => { + if(item.name === val){ + data.queryParams.companyId = item.id + state.form.companyId = item.id + } + }) + if(state.form.catalogueId){ + await getCatalogDataList() + await getFileList() + } + +} + +const handleNodeClick = async (val) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + state.form.catalogueId = val.id + await getCatalogDataList() + await getFileList() +} +const getCatalogDataList = async () => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + const param = { + catalogueId: state.form.catalogueId, + companyId: state.form.companyId + } + const res = await getCatalogueData(param); + if(res.code === 200){ + // if(res.data.data && res.data.data.length >0){ + state.form.content= res.data.data[0]?.content + state.form.analysis = res.data.data[0]?.analysis + state.form.id = res.data.data[0]?.id + // } + + }else{ + ElMessage.warning(res.message) + } +} + +const addData = async () => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + if(state.form.dataList && state.form.dataList.length==0){ + ElMessage.warning('请上传应准备材料!') + return + } + if(state.form.recordList && state.form.recordList.length==0){ + 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 getCatalogDataList() + 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 getCatalogDataList() + await getFileList() + + }else{ + ElMessage.warning(res.message) + } + } + + + } +} +const openDataDialog = (type, value) => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); +} +const openRecordDialog = (type, value) => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRecordRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); +} + +const handleDataDelete = (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 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 deleteData = () => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delCatalogueData(state.form.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getCatalogDataList() + await getFileList() + }else{ + ElMessage.warning(res.message) + } + }) +} +const reset = async () => { + data.queryParams = { + companyId: '', + pageNum: 1, + pageSize: 10, + } + data.companyList = []; + 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 +} + +const getFileList = async () => { + const queryParams = { + companyId: state.form.companyId, + catalogueId: state.form.catalogueId + } + const res = await getFile(queryParams) + if (res.code == 200) { + state.form.dataList = res.data.data?.filter(i => i.type == 1) + state.form.recordList = res.data.data?.filter(i => i.type == 2) + } else { + ElMessage.warning(res.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: '文件读取失败' + }); + } + }) +} </script> -<template> -支持 -</template> - <style scoped lang="scss"> +.app-container{ + .bottom{ + display: flex; + width: auto; + height: auto; + border: 1px solid #c3c3c3; + margin: 20px; + .left{ + border-right: 1px solid darkgray; + display: flex; + min-width: 240px; + margin: 20px 20px 20px 50px; + flex-direction: column; + :deep(.el-tree){ + background: none; + } + } + .right{ + margin: 20px 20px 20px 10px; + flex: 1; + min-width: 100px; + :deep(.el-form-item__label){ + font-weight: 600;font-size: 20px + } + + } + } + +} </style> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/termManage/catalogTerm/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/qualityManage/termManage/catalogTerm/components/editDialog.vue new file mode 100644 index 0000000..2e50ccf --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/qualityManage/termManage/catalogTerm/components/editDialog.vue @@ -0,0 +1,182 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + :title="state.title" + width="600px" + :before-close="handleClose" + :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="parentId" > + <el-tree-select + v-model="state.form.parentId" + :data="state.menuOptions" + :props="{ value: 'id', label: 'name', children: 'children' }" + value-key="id" + placeholder="上级分支" + check-strictly + style="width: 100%" + /> + </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="mess"> + <el-input v-model.trim="state.form.mess" :disabled="state.title =='查看'" placeholder="目录名称"></el-input> + </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 {addCatalogue, editCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; + +const emit = defineEmits(["getList"]); +const dialogVisible = ref(false) +const superRef = ref() +const state = reactive({ + title: '', + form: { + id: null, + mess: '', + number:'', + parentId: null + }, + formRules:{ + mess: [{ required: true, message: '请输入目录名称', trigger: 'blur' }], + number: [{ required: true, message: '请输入序号', trigger: 'blur' }], + parentId:[{ required: true, message: '请选择上级分支', trigger: 'blur' }], + }, + isAdmin: false, + companyList: [], + menuOptions: [], + +}) +onMounted(() => { + +}); + +const openDialog = async (type, value,companyId, isAdmin,flag) => { + state.isAdmin = isAdmin + if(isAdmin){ + await getTreeselect() + } + state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' + if(state.title == '新增' && flag == 2){ + state.form.parentId = value.id + + }else if(state.title == '新增' && flag == 1 ){ + + state.form.parentId = 0 + + } + if(state.title == '编辑'||state.title == '查看'){ + Object.keys(state.form).forEach(key => { + if (key in value) { + state.form[key] = value[key] + } + }) + } + dialogVisible.value = true +} + + +const onSubmit = async () => { + const valid = await superRef.value.validate(); + console.log('state.form',state.form) + if(valid){ + if(state.title == '新增'){ + const {id,...data} = state.form + data.type = 3 + const res = await addCatalogue(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + }else{ + const {...data} = state.form + const res = await editCatalogue(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + } + } +} +const getTreeselect =async ()=> { + state.menuOptions = []; + const param = { + type: 3, + } + const res = await getCatalogue(param) + if(res.code == 200){ + const menu = { id: 0, name: "主目录", children: [] }; + menu.children = await handleTree(res.data.data) + state.menuOptions.push(menu); + }else{ + ElMessage.warning(res.message) + } +} + +const handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${node.number} ${node.mess}`; + // 递归处理子节点(传递当前序号路径) + if (node.children && node.children.length) { + traverse(node.children, node.number); + } + }); + }; + traverse(val); // 从根节点开始遍历 + return val; +} +const handleClose = () => { + state.form = { + id: null, + mess: '', + number:'', + parentId: null + } + state.isTree = false + 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> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/termManage/catalogTerm/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/termManage/catalogTerm/index.vue index 6c72333..0ffe8b7 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/termManage/catalogTerm/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/termManage/catalogTerm/index.vue @@ -1,11 +1,138 @@ -<script setup> - -</script> - <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 + type="primary" + plain + icon="Plus" + @click="openDialog('add','',1)" + >新增</el-button> + </el-form-item> + </el-form> + </div> + <!-- 表格数据 --> + <el-table v-loading="loading" + :data="dataList" + :border="true" + row-key="id" + :default-expand-all="true" + :tree-props="{ children: 'children'}" + > + <el-table-column label="目录名称" prop="mess" > + <template #default="scope"> + {{scope.row.number}} {{scope.row.mess}} + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDialog('add',scope.row,2)">新增</el-button> + <el-button link type="primary" @click="openDialog('edit',scope.row,null)">编辑</el-button> + <el-button link type="danger" v-if="scope.row.children && scope.row.children.length == 0" @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> -<style scoped lang="scss"> +<script setup> +import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; +import {ElMessage, ElMessageBox} from "element-plus"; +import editDialog from './components/editDialog.vue' +import useUserStore from "@/store/modules/user"; +import {delCatalogue, getCatalogue} from "@/api/qualityManage/catalog"; +const userStore = useUserStore() +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const loadingCompany = ref(false) +const dialogRef = ref(); +const data = reactive({ + queryParams: { + pageNum: 1, + pageSize: 10, + companyId: null, + }, + total: 0, + dataList: [], + companyList: [], + industryList: [], + isAdmin: false, -</style> +}); + +const { queryParams, total, dataList,companyList,industryList, isAdmin } = toRefs(data); +const userInfo = ref() +onMounted(async ()=>{ + if(userStore.roles.includes('admin')){ + data.isAdmin = true + data.queryParams.companyId = null + }else{ + data.isAdmin = false + data.queryParams.companyId = userStore.companyId + } + await getList() + +}) + +onUnmounted(()=>{ + +}) + +const getList = async () => { + loading.value = true + const param = { + type: 3, + } + const res = await getCatalogue(param); + if(res.code === 200){ + data.dataList = res.data.data + }else{ + ElMessage.warning(res.message) + } + loading.value = false +} + +const openDialog = (type, value,flag) => { + + dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin,flag); +} + +/** 重置新增的表单以及其他数据 */ +const reset= async()=> { + data.queryParams = { + pageNum: 1, + pageSize: 10, + companyId: null, + } + await getList() +} +const handleDelete = (val) => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delCatalogue(val.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getList() + }else{ + ElMessage.warning(res.message) + } + }) +} + +</script> diff --git a/src/views/build/conpanyFunctionConsult/qualityManage/termManage/term/index.vue b/src/views/build/conpanyFunctionConsult/qualityManage/termManage/term/index.vue index 1bc8b05..b6f8384 100644 --- a/src/views/build/conpanyFunctionConsult/qualityManage/termManage/term/index.vue +++ b/src/views/build/conpanyFunctionConsult/qualityManage/termManage/term/index.vue @@ -1,11 +1,494 @@ -<script setup> +<template> + <div class="app-container"> + <div style="margin-bottom: 10px"> + <el-form style="display: flex;flex-wrap: wrap;"> + <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 v-if="data.isAdmin">--> + <!-- <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>--> + <!-- <el-button plain @click="reset">重置</el-button>--> + <!-- </el-form-item>--> + </el-form> + </div> + <div class="bottom"> + <div class="left"> + <span style="font-weight: 600;font-size: 24px">目录</span> + <el-tree + v-if="data.treeData" + style="max-width: 600px;margin-top: 20px" + :data="data.treeData" + :props="data.defaultProps" + :default-expand-all="true" + :expand-on-click-node="false" + highlight-current + @node-click="handleNodeClick" + ></el-tree> + <el-empty v-else description="暂无数据" /> + </div> + <div class="right"> + <el-form :model="state.form" size="default" ref="noticeRef" :rules="data.formRules" label-position="left" label-width="125px" > + <el-form-item label="具体内容" prop="content" > + <el-input v-model="state.form.content" :rows="4" type="textarea" /> + </el-form-item> + <el-form-item label="标准分析" prop="analysis" > + <el-input v-model="state.form.analysis" :rows="4" type="textarea" /> + </el-form-item> + <el-form-item label="应准备材料" prop="dataList"> + <el-button type="primary" @click="openDataDialog('add',{})">新增</el-button> + </el-form-item> + <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="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center" > + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDataDialog('edit',scope.row)" >编辑</el-button> + <el-button link type="danger" @click="handleDataDelete(scope.row)" >删除</el-button> + </template> + </el-table-column> + </el-table> + <el-form-item label="记录上传" prop="recordList"> + <el-button type="primary" @click="openRecordDialog('add',{})">新增</el-button> + </el-form-item> + <el-table style="margin-top: 15px;width: 100%" :data="state.form.recordList" :border="true" > + <el-table-column type="index" label="序号" width="80" align="center"></el-table-column> + <el-table-column label="记录名称" prop="name" align="center" /> + <el-table-column label="材料模板" prop="fileName" align="center"> + <template #default="scope"> + <el-link v-if="scope.row.fileName" style="" type="primary" @click="downloadFile(scope.row)">{{scope.row.fileName}}</el-link> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openRecordDialog('edit',scope.row)" >编辑</el-button> + <el-button link type="danger" @click="handleRecordDelete(scope.row)" >删除</el-button> + </template> + </el-table-column> + </el-table> + </el-form> + <div style="display: flex;align-items: center;justify-content: right;margin-top: 10px"> + <el-button v-if="state.form.id" type="danger" @click="deleteData">删除</el-button> + <el-button type="primary" @click="addData()">保存</el-button> + </div> + </div> + </div> + <dataDialog ref="dialogRef" @getList="getFileList"></dataDialog> + <record-dialog ref="dialogRecordRef" @getList="getFileList"></record-dialog> + </div> +</template> +<script setup> +import {getCurrentInstance, 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 "@/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/dataDialog.vue" +import recordDialog from "@/views/build/conpanyFunctionConsult/qualityManage/rangeManage/range/components/recordDialog.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"; + +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const noticeRef = ref(); +const dialogRef = ref(); +const dialogRecordRef = ref(); +const loadingCompany = ref(false) +const data = reactive({ + queryParams: { + type: 3, + companyId: null, + }, + + formRules: { + content: [{ required: true, message: '请输入具体内容', trigger: 'blur' }], + analysis: [{ required: true, message: '请输入标准分析', trigger: 'blur' }], + dataList: [{ required: true, message: '', trigger: 'blur' }], + recordList: [{ required: true, message: '', trigger: 'blur' }] + }, + companyList: [], + isAdmin: false, + defaultProps: { + children: 'children', + label: 'name', + }, + treeData: [], + dataVisible: false, + dataTitle: '', + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization: getToken() + }, + fileLimit: 1, + fileDataList: [] + +}); +const state = reactive({ + form: { + id: '', + companyId: null, + content: '', + analysis: '', + catalogueId: null, + dataList: [], + recordList: [] + }, +}) +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; + 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 + }else { + data.queryParams.companyId = userInfo.companyId + state.form.companyId = userInfo.companyId + } + await getList(); + +}) +const getList = async () => { + data.treeData = []; + loading.value = true; + const param = { + 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 handleTree = (val) => { + const traverse = (nodes, currentPath = '') => { + nodes.forEach((node, index) => { + node.name = `${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) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + data.companyList.forEach(item => { + if(item.name === val){ + data.queryParams.companyId = item.id + state.form.companyId = item.id + } + }) + if(state.form.catalogueId){ + await getCatalogDataList() + await getFileList() + } + +} + +const handleNodeClick = async (val) => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + state.form.catalogueId = val.id + await getCatalogDataList() + await getFileList() +} +const getCatalogDataList = async () => { + state.form.analysis = '' + state.form.content = '' + state.form.id = '' + const param = { + catalogueId: state.form.catalogueId, + companyId: state.form.companyId + } + const res = await getCatalogueData(param); + if(res.code === 200){ + // if(res.data.data && res.data.data.length >0){ + state.form.content= res.data.data[0]?.content + state.form.analysis = res.data.data[0]?.analysis + state.form.id = res.data.data[0]?.id + // } + + }else{ + ElMessage.warning(res.message) + } +} + +const addData = async () => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + if(state.form.dataList && state.form.dataList.length==0){ + ElMessage.warning('请上传应准备材料!') + return + } + if(state.form.recordList && state.form.recordList.length==0){ + 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 getCatalogDataList() + 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 getCatalogDataList() + await getFileList() + + }else{ + ElMessage.warning(res.message) + } + } + + + } +} +const openDataDialog = (type, value) => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); +} +const openRecordDialog = (type, value) => { + if(!state.form.catalogueId){ + ElMessage.warning('请先选择左侧目录!') + return + } + dialogRecordRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId); +} + +const handleDataDelete = (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 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 deleteData = () => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delCatalogueData(state.form.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getCatalogDataList() + await getFileList() + }else{ + ElMessage.warning(res.message) + } + }) +} +const reset = async () => { + data.queryParams = { + companyId: '', + pageNum: 1, + pageSize: 10, + } + data.companyList = []; + 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 +} + +const getFileList = async () => { + const queryParams = { + companyId: state.form.companyId, + catalogueId: state.form.catalogueId + } + const res = await getFile(queryParams) + if (res.code == 200) { + state.form.dataList = res.data.data?.filter(i => i.type == 1) + state.form.recordList = res.data.data?.filter(i => i.type == 2) + } else { + ElMessage.warning(res.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: '文件读取失败' + }); + } + }) +} </script> -<template> -术语 -</template> - <style scoped lang="scss"> +.app-container{ + .bottom{ + display: flex; + width: auto; + height: auto; + border: 1px solid #c3c3c3; + margin: 20px; + .left{ + border-right: 1px solid darkgray; + display: flex; + min-width: 240px; + margin: 20px 20px 20px 50px; + flex-direction: column; + :deep(.el-tree){ + background: none; + } + } + .right{ + margin: 20px 20px 20px 10px; + flex: 1; + min-width: 100px; + :deep(.el-form-item__label){ + font-weight: 600;font-size: 20px + } + + } + } + +} </style> diff --git a/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/components/objectiveDialog.vue b/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/components/objectiveDialog.vue index 6125513..7b51a39 100644 --- a/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/components/objectiveDialog.vue +++ b/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/components/objectiveDialog.vue @@ -380,6 +380,10 @@ if(title.value === '新增'){ console.log('sta',state.form) const {id, ...data} = JSON.parse(JSON.stringify(state.form)) + if(data.qualityTargets && data.qualityTargets.length == 0){ + ElMessage.warning('请填写质量目标') + return + } const res = await addObjective(data) if(res.code === 200){ ElMessage({ @@ -395,6 +399,10 @@ dialogVisible.value = false; }else if(title.value === '编辑'){ const {...data} = JSON.parse(JSON.stringify(state.form)) + if(data.qualityTargets && data.qualityTargets.length == 0){ + ElMessage.warning('请填写质量目标') + return + } const res = await editObject(data) if(res.code === 200){ ElMessage({ diff --git a/src/views/system/industryManage/components/editDialog.vue b/src/views/system/industryManage/components/editDialog.vue index a3c2a90..a8b59ea 100644 --- a/src/views/system/industryManage/components/editDialog.vue +++ b/src/views/system/industryManage/components/editDialog.vue @@ -31,6 +31,7 @@ import {updateInfoPlatforms, updateSysClause} from "@/api/staffManage/staff"; import Cookies from "js-cookie"; import {addBasic, editBasic} from "@/api/companyInfo/basicInfo"; +import {addIndustry, editIndustry} from "@/api/system/industry"; const emit = defineEmits(["getList"]); const dialogVisible = ref(false) @@ -66,9 +67,9 @@ const onSubmit = async () => { const valid = await busRef.value.validate(); if(valid){ - if(title.value === '新增'){ + if(state.title === '新增'){ const {id, ...data} = JSON.parse(JSON.stringify(state.form)) - const res = await addBasic(data) + const res = await addIndustry(data) if(res.code === 200){ ElMessage({ type: 'success', @@ -81,9 +82,9 @@ busRef.value.clearValidate(); reset(); dialogVisible.value = false; - }else if(title.value === '编辑'){ + }else if(state.title === '编辑'){ const {...data} = JSON.parse(JSON.stringify(state.form)) - const res = await editBasic(data) + const res = await editIndustry(data) if(res.code === 200){ ElMessage({ type: 'success', diff --git a/src/views/system/industryManage/index.vue b/src/views/system/industryManage/index.vue index 01dd1b6..1b486f8 100644 --- a/src/views/system/industryManage/index.vue +++ b/src/views/system/industryManage/index.vue @@ -15,7 +15,7 @@ <!-- 表格数据 --> <el-table v-loading="loading" :data="dataList" :border="true"> <el-table-column label="序号" type="index" align="center" width="80"/> - <el-table-column label="行业名称" prop="clauseNum" align="center"/> + <el-table-column label="行业名称" prop="name" align="center"/> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > <template #default="scope"> <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> @@ -52,6 +52,7 @@ getSysClause } from "@/api/staffManage/staff"; import useUserStore from "@/store/modules/user"; +import {delIndustry, getIndustryPage} from "@/api/system/industry"; const userStore = useUserStore() const { proxy } = getCurrentInstance(); const loading = ref(false); @@ -87,13 +88,13 @@ const getList = async () => { loading.value = true - // const res = await getSysClause(data.queryParams) - // if(res.code == 200){ - // data.dataList = res.data || [] - // data.total = res.data.total - // }else{ - // ElMessage.warning(res.message) - // } + const res = await getIndustryPage(data.queryParams) + if(res.code == 200){ + data.dataList = res.data.list + data.total = res.data.total + }else{ + ElMessage.warning(res.message) + } loading.value = false } @@ -136,7 +137,7 @@ type: 'warning', }) .then( async() => { - const res = await delSysClause({id: val.id}) + const res = await delIndustry(val.id) if(res.code == 200){ ElMessage.success('数据删除成功') await getList() -- Gitblit v1.9.2