From 7df5ffa1db94e3225bd16ef2d0d8ef0e02084951 Mon Sep 17 00:00:00 2001 From: 祖安之光 <11848914+light-of-zuan@user.noreply.gitee.com> Date: 星期四, 26 六月 2025 13:30:08 +0800 Subject: [PATCH] 新增页面 --- src/views/homePage.vue | 4 src/store/modules/user.js | 2 src/views/build/conpanyFunctionConsult/industryTemplate/index.vue | 192 +++ src/views/build/conpanyFunctionConsult/industryTemplate/components/editDialog.vue | 214 +++ src/views/build/conpanyFunctionConsult/staffManage/staffRegister/index.vue | 265 ++++ src/views/build/conpanyFunctionConsult/staffManage/staffPortfolio/components/editorDialog.vue | 132 ++ src/views/build/conpanyFunctionConsult/staffManage/staffPortfolio/index.vue | 157 ++ src/api/orgStructure/depart.js | 80 + src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/exportWord.js | 55 + src/views/build/conpanyFunctionConsult/staffManage/staffRegister/components/staffDialog.vue | 85 + src/views/build/conpanyFunctionConsult/infoPlatform/index.vue | 162 ++ /dev/null | 179 --- src/views/system/clauseManage/index.vue | 166 +++ src/views/build/conpanyFunctionConsult/infoPlatform/components/editDialog.vue | 131 ++ src/views/build/conpanyFunctionConsult/orgStructure/departManage/index.vue | 287 +++++ public/dutyFile.docx | 0 src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/dutyDialog.vue | 378 ++++++ src/views/build/conpanyFunctionConsult/orgStructure/dutyDistributeChart/index.vue | 312 +++++ src/views/system/clauseManage/components/editDialog.vue | 125 ++ src/api/staffManage/staff.js | 113 ++ src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/departDialog.vue | 216 +++ 21 files changed, 3,065 insertions(+), 190 deletions(-) diff --git a/public/dutyFile.docx b/public/dutyFile.docx new file mode 100644 index 0000000..4851a82 --- /dev/null +++ b/public/dutyFile.docx Binary files differ diff --git a/src/api/orgStructure/depart.js b/src/api/orgStructure/depart.js new file mode 100644 index 0000000..063c549 --- /dev/null +++ b/src/api/orgStructure/depart.js @@ -0,0 +1,80 @@ +import request from '@/utils/request' + + +export function getDepart(params) { + return request({ + url: '/system/dept/list', + method: 'get', + params: params + }) +} + +export function saveDepart(data) { + return request({ + url: '/system/dept/save', + method: 'post', + data: data + }) +} + +export function delDepart(deptId) { + return request({ + url: `/system/dept/${deptId}`, + method: 'delete' + }) +} + +export function getCompany(params) { + return request({ + url: '/system/company/list', + method: 'get', + params: params + }) +} + +export function getSysClause(params) { + return request({ + url: '/system/clauseManagement/getSysClauseManagements', + method: 'get', + params: params + }) +} + +export function getDeptInfo(deptId) { + return request({ + url: `/system/dept/${deptId}`, + method: 'get' + }) +} + +export function saveResponsibility(data) { + return request({ + url: '/system/dept/saveResponsibility', + method: 'post', + data: data + }) +} + +export function initDistribution(params) { + return request({ + url: '/system/dept/initFunctionalDistribution', + method: 'get', + params: params + }) +} + +export function getDistribution(params) { + return request({ + url: '/system/dept/functionalDistributionList', + method: 'get', + params: params + }) +} + +export function saveDistribution(data) { + return request({ + url: '/system/dept/saveFunctionalDistribution', + method: 'post', + data: data + }) +} \ No newline at end of file diff --git a/src/api/staffManage/staff.js b/src/api/staffManage/staff.js new file mode 100644 index 0000000..e07231e --- /dev/null +++ b/src/api/staffManage/staff.js @@ -0,0 +1,113 @@ +import request from '@/utils/request' + +export function getRosterList(params) { + return request({ + url: '/company/roster/list', + method: 'get', + params: params + }) +} + +export function saveRoster(data) { + return request({ + url: '/company/roster/insert', + method: 'post', + data: data + }) +} + +export function updateRoster(data) { + return request({ + url: '/company/roster/update', + method: 'post', + data: data + }) +} + +export function delRoster(params) { + return request({ + url: '/company/roster/deleted', + method: 'get', + params: params + }) +} + +export function getInfoPlatforms(params) { + return request({ + url: '/system/informationPlatform/getInformationPlatforms', + method: 'get', + params: params + }) +} + +export function updateInfoPlatforms(data) { + return request({ + url: '/system/informationPlatform/saveInformationPlatform', + method: 'post', + data: data + }) +} + +export function delInfoPlatforms(params) { + return request({ + url: '/system/informationPlatform/delInformationPlatform', + method: 'get', + params: params + }) +} + +export function getSysClause(params) { + return request({ + url: '/system/clauseManagement/getSysClauseManagements', + method: 'get', + params: params + }) +} + +export function updateSysClause(data) { + return request({ + url: '/system/clauseManagement/saveSysClauseManagement', + method: 'post', + data: data + }) +} + +export function delSysClause(params) { + return request({ + url: '/system/clauseManagement/delSysClauseManagement', + method: 'get', + params: params + }) +} + +export function getIndustryTemp(params) { + return request({ + url: '/company/industryTemplate/list', + method: 'get', + params: params + }) +} + +export function addIndustryTemp(data) { + return request({ + url: '/company/industryTemplate/insert', + method: 'post', + data: data + }) +} + +export function updateIndustryTemp(data) { + return request({ + url: '/company/industryTemplate/update', + method: 'post', + data: data + }) +} + +export function delIndustryTemp(params) { + return request({ + url: '/company/industryTemplate/deleted', + method: 'get', + params: params + }) +} \ No newline at end of file diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 2f33a7d..20271e6 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -10,6 +10,7 @@ token: getToken(), id: '', name: '', + companyId: null, avatar: '', roles: [], permissions: [] @@ -46,6 +47,7 @@ } this.id = user.userId this.name = user.userName + this.companyId = user.companyId this.avatar = avatar Cookies.set('userInfo',JSON.stringify(user)) resolve(res) diff --git a/src/views/build/conpanyFunctionConsult/industryTemplate/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/industryTemplate/components/editDialog.vue new file mode 100644 index 0000000..79b1e9c --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/industryTemplate/components/editDialog.vue @@ -0,0 +1,214 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + :title="state.title" + width="700px" + :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="templateName"> + <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.industryType" placeholder="请选择" clearable> + <el-option key="1" label="化工" :value="1"></el-option> + <el-option key="2" label="安防" :value="2"></el-option> + </el-select> + </el-form-item> + <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> + <div class="el-upload__tip">支持上传.doc、.docx格式文档,尺寸小于5M,最多可上传1张</div> + </template> + </el-upload> + </el-form-item> + </el-form> + <template #footer v-if="state.title !='查看'"> + <span class="dialog-footer"> + <el-button @click="handleClose" size="default">取 消</el-button> + <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> + </span> + </template> + </el-dialog> + </div> +</template> +<script setup> +import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue' +import {ElMessage} from "element-plus"; +import {addUser, editUser, getUserById, resetPwd} from "@/api/onlineEducation/user" +import {Base64} from "js-base64" +import {getCompany} from "@/api/onlineEducation/company"; +import {addIndustryTemp, updateIndustryTemp, updateInfoPlatforms} from "@/api/staffManage/staff"; +import {getToken} from "@/utils/auth"; +import {delPic} from "@/api/onlineEducation/banner"; + +const emit = defineEmits(["getList"]); +const dialogVisible = ref(false) +const superRef = ref() +const checkFiles = (rule, value, callback) => { + if (state.fileList.length == 0) { + callback(new Error('请上传模板文件')) + } else { + callback() + } +} +const state = reactive({ + title: '', + form: { + id: null, + templateName: '', + industryType: '', + filePath: '', + format: '', + companyId: null + }, + formRules:{ + templateName: [{ required: true, message: '请输入模板名称', trigger: 'blur' }], + industryType: [{ required: true, message: '请选择行业类型', trigger: 'blur' }], + filePath: [{ required: true, validator: checkFiles, trigger: 'blur' }] + }, + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization: getToken() + }, + fileLimit: 1, + fileList: [] +}) +onMounted(() => { + +}); + +const openDialog = async (type, value,companyId) => { + state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' + state.form.companyId = companyId + if(state.title == '编辑'||state.title == '查看'){ + Object.keys(state.form).forEach(key => { + if (key in value) { + state.form[key] = value[key] + } + }) + if(value.filePath) { + const obj = { + url: value.filePath, + name: '模板文件' + } + state.fileList = [obj] + } + } + 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) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + }else{ + const res = await updateIndustryTemp(state.form) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + } + } +} + +const handleAvatarSuccess = (res, uploadFile) => { + if(res.code == 200){ + state.form.filePath = res.data.path + state.form.format = '.' + res.data.filename.split('.')[1] + }else{ + state.fileList = [] + ElMessage({ + type: 'warning', + message: '文件上传失败' + }) + } +} + +const showTip =()=>{ + ElMessage({ + type: 'warning', + message: '超出文件上传数量' + }); +} +const picSize = async (rawFile) => { + if(rawFile.size / 1024 / 1024 > 5){ + ElMessage({ + type: 'warning', + message: '文件大小不能超过5M' + }); + return false + } +}; +const handleRemove = async (file, uploadFiles) => { + let path = state.form.filePath; + await delPic({path: path}).then(res => { + if(res.code == 200){ + // ElMessage({ + // type: 'success', + // message: '文件已删除' + // }) + state.form.filePath = '' + state.form.format = '' + }else{ + ElMessage({ + type: 'warning', + message: res.message + }) + } + }).catch(() => { + state.form.imgUrl = '' + }); +} + +const handleClose = () => { + state.form = { + id: null, + templateName: '', + industryType: '', + filePath: '', + format: '', + companyId: null + } + 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/industryTemplate/index.vue b/src/views/build/conpanyFunctionConsult/industryTemplate/index.vue new file mode 100644 index 0000000..19c1ef3 --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/industryTemplate/index.vue @@ -0,0 +1,192 @@ +<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',{})" + >新增</el-button> + </el-form-item> + <el-form-item v-if="isAdmin" label="企业:" > + <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable> + <el-option + v-for="item in companyList" + :key="item.id" + :label="item.name" + :value="item.id"> + </el-option> + </el-select> + </el-form-item> + <el-form-item v-if="isAdmin" label="行业:" > + <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable> + <el-option key="1" label="化工" :value="1"></el-option> + <el-option key="2" label="安防" :value="2"></el-option> + </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> + <!-- 表格数据 --> + <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="fileName" align="center"> + <template #default="scope"> + <el-button link type="primary" @click="downloadFile(scope.row.filePath)">{{getName(scope.row.industryType) + '模板'}}</el-button> + </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('edit',scope.row)">编辑</el-button> + <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> + </template> + </el-table-column> + </el-table> + + <pagination + v-show="total > 0" + :total="total" + v-model:page="queryParams.pageNum" + v-model:limit="queryParams.pageSize" + @pagination="getList" + /> + + <edit-dialog ref="dialogRef" @getList=getList></edit-dialog> + </div> +</template> + +<script setup> +import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; +import {ElMessage, ElMessageBox} from "element-plus"; +import {delCompany, getCompany} from "@/api/onlineEducation/company"; +import {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"; +const userStore = useUserStore() +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const dialogRef = ref(); +const data = reactive({ + queryParams: { + pageNum: 1, + pageSize: 10, + companyId: null + }, + total: 0, + dataList: [], + companyList: [], + isAdmin: false, + typeList: [ + { + value: 1, + name: '化工' + }, + { + value: 2, + name: '安防' + } + ] +}); + +const { queryParams, total, dataList,companyList, isAdmin } = toRefs(data); +const userInfo = ref() +onMounted(async ()=>{ + if(userStore.roles.includes('admin')){ + data.isAdmin = true + await getCompanyList() + }else{ + data.isAdmin = false + data.queryParams.companyId = userStore.companyId + } + await getList() +}) + +onUnmounted(()=>{ + +}) + +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) + } + loading.value = false +} + +const getCompanyList = async ()=>{ + const queryParams = { + pageNum: 1, + pageSize: 999 + } + const res = await getCompany(queryParams) + if (res.code == 200) { + data.companyList = res.data.list?res.data.list:[] + data.queryParams.companyId = data.companyList[0].id + } else { + ElMessage.warning(res.message) + } +} + +const downloadFile = (path)=>{ + window.open(import.meta.env.VITE_APP_BASE_API + '/' + path) +} + +const getName =(type)=>{ + return data.typeList.find(i=> i.value == type)?.name +} + +const openDialog = (type, value) => { + dialogRef.value.openDialog(type, value, data.queryParams.companyId); +} + +/** 重置新增的表单以及其他数据 */ +const reset= async()=> { + data.queryParams = { + pageNum: 1, + pageSize: 10, + companyId: null + } + await getCompanyList() + await getList() +} +const handleDelete = (val) => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delIndustryTemp({companyRosterId: val.id}) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getList() + }else{ + ElMessage.warning(res.message) + } + }) +} + +</script> diff --git a/src/views/build/conpanyFunctionConsult/infoPlatform/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/infoPlatform/components/editDialog.vue new file mode 100644 index 0000000..6c3bbc5 --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/infoPlatform/components/editDialog.vue @@ -0,0 +1,131 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + :title="state.title" + width="700px" + :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="platformName"> + <el-input v-model.trim="state.form.platformName" :disabled="state.title =='查看'" placeholder="信息平台名称"></el-input> + </el-form-item> + <el-form-item label="创建时间:" prop="buildDate"> + <el-date-picker + :disabled="state.title =='查看'" + v-model="state.form.buildDate" + type="date" + value-format="YYYY-MM-DD" + placeholder="请选择创建时间" + /> + </el-form-item> + </el-form> + <template #footer v-if="state.title !='查看'"> + <span class="dialog-footer"> + <el-button @click="handleClose" size="default">取 消</el-button> + <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> + </span> + </template> + </el-dialog> + </div> +</template> +<script setup> +import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue' +import {ElMessage} from "element-plus"; +import {addUser, editUser, getUserById, resetPwd} from "@/api/onlineEducation/user" +import {Base64} from "js-base64" +import {getCompany} from "@/api/onlineEducation/company"; +import {updateInfoPlatforms} from "@/api/staffManage/staff"; + +const emit = defineEmits(["getList"]); +const dialogVisible = ref(false) +const superRef = ref() +const state = reactive({ + title: '', + form: { + id: null, + platformName: '', + buildDate: '', + companyId: null + }, + formRules:{ + platformName: [{ required: true, message: '请输入信息平台名称', trigger: 'blur' }], + buildDate: [{ required: true, message: '请选择平台创建时间', trigger: 'blur' }] + } +}) +onMounted(() => { + +}); + +const openDialog = async (type, value,companyId) => { + state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' + state.form.companyId = companyId + 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(); + if(valid){ + let data = {} + if(state.title == '新增'){ + data = { + platformName: state.form.platformName, + buildDate: state.form.buildDate, + companyId: state.form.companyId + } + }else{ + data = state.form + } + const res = await updateInfoPlatforms(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + + } +} + +const handleClose = () => { + state.form = { + id: null, + platformName: '', + buildDate: '', + companyId: null + } + 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/infoPlatform/index.vue b/src/views/build/conpanyFunctionConsult/infoPlatform/index.vue new file mode 100644 index 0000000..385baca --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/infoPlatform/index.vue @@ -0,0 +1,162 @@ +<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',{})" + >新增</el-button> + </el-form-item> + <el-form-item v-if="isAdmin" label="企业:" > + <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable> + <el-option + v-for="item in companyList" + :key="item.id" + :label="item.name" + :value="item.id"> + </el-option> + </el-select> + </el-form-item> + <el-form-item > + <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> + <!-- 表格数据 --> + <el-table v-loading="loading" :data="dataList" :border="true"> + <el-table-column label="序号" type="index" align="center" width="80"/> + <el-table-column label="信息平台名称" prop="platformName" align="center"/> + <el-table-column label="建设时间" prop="buildDate" align="center"> + <template #default="scope"> + {{scope.row.buildDate?.substring(0, 10)}} + </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('view',scope.row)">查看</el-button> + <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> + <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> + </template> + </el-table-column> + </el-table> + + <pagination + v-show="total > 0" + :total="total" + v-model:page="queryParams.pageNum" + v-model:limit="queryParams.pageSize" + @pagination="getList" + /> + + <edit-dialog ref="dialogRef" @getList=getList></edit-dialog> + </div> +</template> + +<script setup> +import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; +import {ElMessage, ElMessageBox} from "element-plus"; +import {delCompany, getCompany} from "@/api/onlineEducation/company"; +import {delUser, getUser} from "@/api/onlineEducation/user"; +import Cookies from "js-cookie"; +import editDialog from './components/editDialog.vue' +import {delInfoPlatforms, delRoster, getInfoPlatforms, getRosterList} from "@/api/staffManage/staff"; +import useUserStore from "@/store/modules/user"; +const userStore = useUserStore() +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const dialogRef = ref(); +const data = reactive({ + queryParams: { + pageNum: 1, + pageSize: 10, + companyId: null + }, + total: 0, + dataList: [], + companyList: [], + isAdmin: false +}); + +const { queryParams, total, dataList,companyList, isAdmin } = toRefs(data); +const userInfo = ref() +onMounted(async ()=>{ + userInfo.value = JSON.parse(Cookies.get('userInfo')) + if(userStore.roles.includes('admin')){ + data.isAdmin = true + await getCompanyList() + }else{ + data.isAdmin = false + data.queryParams.companyId = userStore.companyId + } + await getList() +}) + +onUnmounted(()=>{ + +}) + +const getList = async () => { + loading.value = true + const res = await getInfoPlatforms(data.queryParams) + if(res.code == 200){ + data.dataList = res.data || [] + data.total = res.data.total + }else{ + ElMessage.warning(res.message) + } + loading.value = false +} + +const getCompanyList = async ()=>{ + const queryParams = { + pageNum: 1, + pageSize: 999 + } + const res = await getCompany(queryParams) + if (res.code == 200) { + data.companyList = res.data.list?res.data.list:[] + data.queryParams.companyId = data.companyList[0].id + } else { + ElMessage.warning(res.message) + } +} + +const openDialog = (type, value) => { + dialogRef.value.openDialog(type, value, data.queryParams.companyId); +} + +/** 重置新增的表单以及其他数据 */ +const reset= async()=> { + data.queryParams = { + pageNum: 1, + pageSize: 10, + companyId: null + } + await getCompanyList() + await getList() +} +const handleDelete = (val) => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delInfoPlatforms({id: val.id}) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getList() + }else{ + ElMessage.warning(res.message) + } + }) +} + +</script> diff --git a/src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/departDialog.vue b/src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/departDialog.vue new file mode 100644 index 0000000..aa2adec --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/departDialog.vue @@ -0,0 +1,216 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + :title="state.title" + width="700px" + :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="deptName"> + <el-input v-model.trim="state.form.deptName" :disabled="state.title =='查看'" placeholder="部门名称"></el-input> + </el-form-item> + <el-form-item label="负责人:" prop="leaderUserId"> + <el-select clearable v-model="state.form.leaderUserId" :disabled="state.title =='查看'" filterable placeholder="负责人" style="width: 100%"> + <el-option + v-for="item in state.userList" + :key="item.id" + :label="item.name" + :value="item.id" + /> + </el-select> + </el-form-item> + <el-form-item label="主要负责部门:" prop="parentId"> + <el-select + clearable + v-model="state.form.parentId" + :disabled="state.title =='查看'" + filterable + placeholder="主要负责部门" + style="width: 100%" + > + <el-option + v-for="item in state.departList" + :key="item.deptId" + :label="item.deptName" + :value="item.deptId" + /> + </el-select> + </el-form-item> + <el-form-item label="部门涉及条款:" prop="caluseVO1List"> + <el-select + clearable + v-model="state.form.caluseVO1List" + :disabled="state.title =='查看'" + filterable + placeholder="部门涉及条款" + style="width: 100%" + multiple + value-key="clauseId" + > + <el-option + v-for="item in state.sysClauseList" + :key="item.clauseId" + :label="item.content" + :value="item" + /> + </el-select> + </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 {getDepart, getSysClause, saveDepart} from "@/api/orgStructure/depart"; +import {listUser} from "@/api/system/user"; + +const emit = defineEmits(["getList"]); +const dialogVisible = ref(false) +const superRef = ref() + +const state = reactive({ + title: '', + form: { + deptId: null, + deptName: '', + leaderUserId: null, + parentId: null, + caluseVO1List: [], + delCaluseIds: [], + companyId: null + }, + userList: [], + departList: [], + sysClauseList: [], + oldClauseList: [], + formRules:{ + deptName: [{ required: true, message: '请输入部门名称', trigger: 'blur' }], + leaderUserId: [{ required: true, message: '请选择负责人', trigger: 'blur' }], + parentId: [{ required: true, message: '请选择负责部门', trigger: 'blur' }], + caluseVO1List: [{ required: true, message: '请选择设计条款', trigger: 'blur' }], + } +}) + +onMounted(() => { + +}); +const disabled = ref(false); +const userInfo = ref() +const openDialog = async (type, value, companyId) => { + await getUserList() + await getDepartList(companyId) + await getSysClauseList() + state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'; + if(type === 'edit' || type === 'view') { + state.departList = state.departList.filter(i=>i.deptId !== value.deptId) + Object.keys(state.form).forEach(key => { + if (key in value) { + state.form[key] = value[key]; + } + }); + state.oldClauseList = value.caluseVO1List + }else{ + state.form.companyId = companyId + } + dialogVisible.value = true +} + +const getUserList = async ()=> { + const res = await listUser() + if(res.code == 200){ + state.userList = res.data.list?res.data.list:[] + }else{ + ElMessage.warning(res.message) + } +}; + +const getDepartList = async (companyId)=> { + const params = { + pageNum: 1, + pageSize: 999, + companyId: companyId + } + const res = await getDepart(params) + if(res.code == 200){ + state.departList = res.data + }else{ + ElMessage.warning(res.message) + } +}; + +const getSysClauseList = async ()=> { + const res = await getSysClause() + if(res.code == 200){ + state.sysClauseList = res.data.map(i=>{ + return { + clauseId: i.id, + clauseNum: i.clauseNum, + content: i.name, + id: null + } + }) + }else{ + ElMessage.warning(res.message) + } +}; + +const onSubmit = async () => { + const valid = await superRef.value.validate(); + if(valid){ + state.form.delCaluseIds = state.oldClauseList.filter(oldItem => !state.form.caluseVO1List.some(newItem => newItem.id === oldItem.id)).map(item => item.id) + const res = await saveDepart(state.form) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + } +} + +const handleClose = () => { + state.form = { + deptId: null, + deptName: '', + leaderUserId: null, + parentId: null, + caluseVO1List: [], + delCaluseIds: [], + companyId: null + } + + 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/orgStructure/departManage/components/dutyDialog.vue b/src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/dutyDialog.vue new file mode 100644 index 0000000..c18d848 --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/dutyDialog.vue @@ -0,0 +1,378 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + title="编辑" + width="75%" + :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-row> + <el-col :sm="24" :md="12"> + <el-form-item label="部门名称:" prop="deptName"> + <el-input v-model.trim="state.form.deptName" readonly></el-input> + </el-form-item> + </el-col> + <el-col :sm="24" :md="12"> + <el-form-item label="部门负责人:" prop="leaderName"> + <el-input v-model.trim="state.form.leaderName" readonly></el-input> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :sm="24" :md="12"> + <el-form-item label="部门人数:" prop="personNum"> + <el-input type="number" v-model.trim.number="state.form.personNum" placeholder="请输入部门人数" ></el-input> + </el-form-item> + </el-col> + <el-col :sm="24" :md="12"> + <el-form-item label="内审员:" prop="internalAuditors"> + <el-select + clearable + v-model="state.form.internalAuditors" + filterable + placeholder="内审员" + style="width: 100%" + > + <el-option + v-for="item in state.userList" + :key="item.id" + :label="item.name" + :value="item.id" + /> + </el-select> + </el-form-item> + </el-col> + </el-row> + <el-form-item label="部门职责:" prop="responsibilities"> + <el-input + v-model="state.form.responsibilities" + style="width: 100%" + :autosize="{ minRows: 2, maxRows: 4 }" + type="textarea" + placeholder="部门职责" + /> + </el-form-item> + </el-form> + <el-button + type="primary" + plain + icon="Plus" + @click="addLine" + style="margin-bottom: 10px" + >新增</el-button> + <el-table :data="state.form.sysDeptResponsibilityList" class="customedTable" :border="true"> + <el-table-column label="条款号" prop="clauseNum" align="center" width="80"> + <template #default="scope"> + <el-input + v-model.trim="scope.row.clauseNum" + size="large" + v-if="scope.$index>4 && scope.$index<state.form.sysDeptResponsibilityList.length-2" + style="width: 100%;" + > + </el-input> + <span v-else> + {{scope.row.clauseNum}} + </span> + </template> + </el-table-column> + <el-table-column label="内容" prop="content" align="center"> + <template #default="scope"> + <el-input + v-model.trim="scope.row.content" + size="large" + v-if="scope.$index>4 && scope.$index<state.form.sysDeptResponsibilityList.length-2" + style="width: 100%;" + > + </el-input> + <span v-else> + {{scope.row.content}} + </span> + </template> + </el-table-column> + <el-table-column label="条款负责人" prop="leader" align="center"> + <template #default="scope"> +<!-- <el-select--> +<!-- v-model="scope.row.leader"--> +<!-- filterable--> +<!-- size="large"--> +<!-- style="width: 100%"--> +<!-- >--> +<!-- <el-option--> +<!-- v-for="item in state.userList"--> +<!-- :key="item.id"--> +<!-- :label="item.name"--> +<!-- :value="item.id"--> +<!-- />--> +<!-- </el-select>--> + <el-input + v-model.trim="scope.row.leader" + size="large" + style="width: 100%;" + > + </el-input> + </template> + </el-table-column> + <el-table-column label="相关证据材料" prop="evidenceMaterials" align="center"> + <template #default="scope"> + <el-input + v-model.trim="scope.row.evidenceMaterials" + size="large" + style="width: 100%;" + > + </el-input> + </template> + </el-table-column> + <el-table-column label="现有管理类文件" prop="managementDocuments" align="center" width="150"> + <template #default="scope"> + <el-input + v-model.trim="scope.row.managementDocuments" + size="large" + style="width: 100%;" + clearable + > + </el-input> + </template> + </el-table-column> + <el-table-column label="技术类文件" prop="technicalDocuments" align="center" width="150"> + <template #default="scope"> + <el-input + v-model.trim="scope.row.technicalDocuments" + size="large" + style="width: 100%;" + > + </el-input> + </template> + </el-table-column> + <el-table-column label="现有记录" prop="existingRecords" align="center" width="150"> + <template #default="scope"> + <el-input + v-model.trim="scope.row.existingRecords" + size="large" + style="width: 100%;" + > + </el-input> + </template> + </el-table-column> + <el-table-column label="操作" align="center" width="70"> + <template #default="scope"> +<!-- <el-button link type="primary" @click="openEdit('edit',scope.row)">编辑</el-button>--> + <el-button link type="danger" v-if="scope.$index>4 && scope.$index<state.form.sysDeptResponsibilityList.length-2" @click="handleDelete(scope.$index)">删除</el-button> + </template> + </el-table-column> + </el-table> + <template #footer> + <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, computed, watch} from 'vue' +import {ElMessage} from "element-plus"; +import {getDeptInfo, saveResponsibility} from "@/api/orgStructure/depart"; +import {listUser} from "@/api/system/user"; +const emit = defineEmits(["getList"]); +const dialogVisible = ref(false) +const superRef = ref() + +const state = reactive({ + form: { + deptName: '', + leaderName: '', + companyId: null, + delData: [], + deptId: null, + internalAuditors: null, + personNum: null, + responsibilities: '', + sysDeptResponsibilityList: [] + }, + oldResponsibilityList: [], + formRules:{ + personNum: [{ required: true, message: '请输入部门人数', trigger: 'blur' }], + internalAuditors: [{ required: true, message: '请选择内审员', trigger: 'blur' }], + responsibilities: [{ required: true, message: '请输入部门职责', trigger: 'blur' }] + }, + firstFive: [ + {clauseNum: '5.3',content: '组织的岗位、职责和权限'}, + {clauseNum: '4.1',content: '理解组织及其环境'}, + {clauseNum: '4.2',content: '理解相关方的需求和期望'}, + {clauseNum: '6.1',content: '应对风险和机遇的措施'}, + {clauseNum: '6.2',content: '质量目标及其实现的策划'} + ], + lastTwo: [ + {clauseNum: '9.1',content: '监视、测量、分析和评价'}, + {clauseNum: '10',content: '改进'} + ], + userList: [] +}) + +onMounted(() => { + +}); + +const openDialog = async (value) => { + await getUserList() + await getDeptDetail(value.deptId) + dialogVisible.value = true +} + +const getDeptDetail = async (deptId)=>{ + const res = await getDeptInfo(deptId) + if (res.code == 200) { + if(res.data){ + Object.keys(state.form).forEach(key => { + if (key in res.data) { + state.form[key] = res.data[key]; + } + }) + if(res.data.sysDeptResponsibilitys && Array.isArray(res.data.sysDeptResponsibilitys) && res.data.sysDeptResponsibilitys.find(i=>i.clauseNum == '5.3')){ + state.form.sysDeptResponsibilityList = sortResponsibilities(res.data.sysDeptResponsibilitys) + state.oldResponsibilityList = sortResponsibilities(res.data.sysDeptResponsibilitys) + }else{ + state.form.sysDeptResponsibilityList = [...state.firstFive,...res.data.sysDeptResponsibilitys,...state.lastTwo] + state.oldResponsibilityList = [...state.firstFive,...res.data.sysDeptResponsibilitys,...state.lastTwo] + } + state.form.personNum = state.form.personNum==0?null:state.form.personNum + state.form.internalAuditors = state.form.internalAuditors==0?null:state.form.internalAuditors + }else{ + ElMessage.warning('暂无部门信息') + } + } else { + ElMessage.warning(res.message) + } +} + +const sortResponsibilities = (list) => { + // 提取firstFive和lastTwo的clauseNum作为排序依据 + const firstFiveClauses = state.firstFive.map(item => item.clauseNum) + const lastTwoClauses = state.lastTwo.map(item => item.clauseNum) + + // 分类处理 + const matchedFirstFive = [] + const matchedLastTwo = [] + const otherItems = [] + + // 先匹配firstFive + firstFiveClauses.forEach(clauseNum => { + const foundItem = list.find(item => item.clauseNum === clauseNum) + if (foundItem) { + matchedFirstFive.push(foundItem) + } + }); + + // 然后匹配lastTwo + lastTwoClauses.forEach(clauseNum => { + const foundItem = list.find(item => item.clauseNum === clauseNum) + if (foundItem && !matchedFirstFive.includes(foundItem)) { + matchedLastTwo.push(foundItem) + } + }); + + // 剩下的其他项 + list.forEach(item => { + if (!matchedFirstFive.includes(item) && !matchedLastTwo.includes(item)) { + otherItems.push(item) + } + }); + + // 合并结果数组 + return [...matchedFirstFive, ...otherItems, ...matchedLastTwo] +} + +const getUserList = async ()=> { + const res = await listUser() + if(res.code == 200){ + state.userList = res.data.list?res.data.list:[] + }else{ + ElMessage.warning(res.message) + } +} + +const addLine = () => { + const obj = { + clauseNum: '', + content: '', + leader: '', + evidenceMaterials: '', + managementDocuments: '', + technicalDocuments: '', + existingRecords: '' + } + state.form.sysDeptResponsibilityList.splice(-2, 0, obj); +} + +const handleDelete = (i) =>{ + state.form.sysDeptResponsibilityList = state.form.sysDeptResponsibilityList.filter((item,index) => index != i) +} + +const onSubmit = async () => { + const valid = await superRef.value.validate(); + if(valid){ + state.form.delData = state.oldResponsibilityList.filter(oldItem => !state.form.sysDeptResponsibilityList.some(newItem => newItem.id === oldItem.id)).map(item => item.id) + for(let i of state.form.sysDeptResponsibilityList){ + if(i.clauseNum == '' || i.content=='' || i.leader == ''){ + ElMessage.warning('条款编号、内容、负责人不可为空') + return + } + } + const res = await saveResponsibility(state.form) + if(res.code == 200){ + ElMessage.success(res.message) + handleClose() + emit('getList') + }else{ + ElMessage.warning(res.message) + } + } +} + +const handleClose = () => { + state.form = { + deptName: '', + leaderName: '', + companyId: null, + delData: [], + deptId: null, + internalAuditors: null, + personNum: null, + responsibilities: '', + sysDeptResponsibilityList: [] + } + 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> +<style lang="scss"> + .customedTable{ + .el-table__cell{ + padding: 2px 0 !important; + } + .cell{ + padding: 0 2px !important; + } + } +</style> \ No newline at end of file diff --git a/src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/exportWord.js b/src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/exportWord.js new file mode 100644 index 0000000..3ba3d7b --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/exportWord.js @@ -0,0 +1,55 @@ +//引入工具 +import PizZip from 'pizzip'; +import Docxtemplater from 'docxtemplater'; +import JSZipUtils from 'jszip-utils'; +import { saveAs } from 'file-saver'; + +// 加载 .docx 模板文件 +function loadFile(url, callback) { + JSZipUtils.getBinaryContent(url, callback); +} + +// 下载生成的文档 +export function download(file, name) { + +} + +// 生成并下载 Word 文档(templatePath是word文档模版地址,data是对应的数据) +export function generateWordDocument(templatePath, data, name) { + loadFile(templatePath, function (error, content) { + if (error) { + throw error + return; + } + + try { + // 加载模板文件内容到 PizZip + const zip = new PizZip(content); + const doc = new Docxtemplater(zip, { + paragraphLoop: true, + linebreaks: true, + }); + + // 设置模板中的占位符数据 + doc.setData(data); + + // 渲染文档 + doc.render(); + + // 生成最终的文档 Blob + const fileWord = doc.getZip().generate({ + type: 'blob', + mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + }); + + saveAs(fileWord, name); + + // // 返回生成的文档 Blob + // resolve(fileWord); + } catch (error) { + console.error('Error rendering document:', error); + throw error + } + }); + +} diff --git a/src/views/build/conpanyFunctionConsult/orgStructure/departManage/index.vue b/src/views/build/conpanyFunctionConsult/orgStructure/departManage/index.vue new file mode 100644 index 0000000..955110e --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/orgStructure/departManage/index.vue @@ -0,0 +1,287 @@ +<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',{})">新增</el-button> + </el-form-item> + <el-form-item v-if="isAdmin" label="企业:" > + <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable> + <el-option + v-for="item in companyList" + :key="item.id" + :label="item.name" + :value="item.id"> + </el-option> + </el-select> + </el-form-item> + <el-form-item > + <el-button v-if="isAdmin" type="primary" @click="getList">查询</el-button> + <el-button v-if="isAdmin" type="primary" plain @click="reset">重置</el-button> + <el-button type="primary" @click="initDistribute">生成智能分配表</el-button> + </el-form-item> + </el-form> + </div> + <!-- 表格数据 --> + <el-table v-loading="loading" :data="dataList" border> + <el-table-column label="序号" type="index" align="center" width="80" /> + <el-table-column label="部门名称" prop="deptName" align="center" /> + <el-table-column label="负责人" prop="leaderName" align="center" /> + <el-table-column label="主要负责部门" prop="parentName" align="center"/> + <el-table-column label="部门涉及条款" prop="userTypeName" align="center" width="150"> + <template #default="scope"> + <div v-if="scope.row.caluseVO1List"> + <div v-for="(item,index) in scope.row.caluseVO1List" :key="index"> + {{ item.clauseNum + ' ' + item.content}} + </div> + </div> + </template> + </el-table-column> + <el-table-column label="部门职责表" prop="userTypeName" align="center" width="150"> + <template #default="scope"> + <el-button link type="primary" @click="openDutyDialog(scope.row)">编辑</el-button> + <el-button link type="danger" @click="download(scope.row)">导出</el-button> + </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('edit',scope.row)">编辑</el-button> + <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> + </template> + </el-table-column> + </el-table> + + <pagination + v-show="total > 0" + :total="total" + v-model:page="queryParams.pageNum" + v-model:limit="queryParams.pageSize" + @pagination="getList" + /> + <depart-dialog ref="dialogRef" @getList=getList></depart-dialog> + <duty-dialog ref="dutyDialogRef" @getList=getList></duty-dialog> + </div> +</template> + +<script setup> +import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; +import {ElMessage, ElMessageBox} from "element-plus"; +import {getDepart, delDepart, getCompany, getDeptInfo, initDistribution} from "@/api/orgStructure/depart"; +import departDialog from './components/departDialog.vue' +import dutyDialog from './components/dutyDialog.vue' +import {generateWordDocument} from "./components/exportWord.js"; +import useUserStore from "@/store/modules/user"; +const userStore = useUserStore() +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const dialogRef = ref(); +const dutyDialogRef = ref() +const data = reactive({ + queryParams: { + pageNum: 1, + pageSize: 10, + companyId: null + }, + total: 0, + dataList: [], + companyList: [], + isAdmin: false, + firstFive: [ + {clauseNum: '5.3',content: '组织的岗位、职责和权限'}, + {clauseNum: '4.1',content: '理解组织及其环境'}, + {clauseNum: '4.2',content: '理解相关方的需求和期望'}, + {clauseNum: '6.1',content: '应对风险和机遇的措施'}, + {clauseNum: '6.2',content: '质量目标及其实现的策划'} + ], + lastTwo: [ + {clauseNum: '9.1',content: '监视、测量、分析和评价'}, + {clauseNum: '10',content: '改进'} + ] +}); +const { queryParams, total, dataList, companyList, isAdmin } = toRefs(data); +const userInfo = ref() +onMounted(async ()=>{ + if(userStore.roles.includes('admin')){ + data.isAdmin = true + await getCompanyList() + }else{ + data.isAdmin = false + data.queryParams.companyId = userStore.companyId + } + await getList() +}) + +onUnmounted(()=>{ + +}) + +const getList = async () => { + loading.value = true + const res = await getDepart(data.queryParams) + if(res.code == 200){ + data.dataList = res.data || [] + data.total = res.data.total + }else{ + ElMessage.warning(res.message) + } + loading.value = false +} + +const initDistribute = async ()=>{ + ElMessageBox.confirm( + '重新生成将重置原有分配信息,是否继续?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await initDistribution({companyId: data.queryParams.companyId}) + if (res.code == 200) { + ElMessage.success(res.message) + } else { + ElMessage.warning(res.message) + } + }) +} + +const getCompanyList = async ()=>{ + const queryParams = { + pageNum: 1, + pageSize: 999 + } + const res = await getCompany(queryParams) + if (res.code == 200) { + data.companyList = res.data.list?res.data.list:[] + data.queryParams.companyId = data.companyList[0].id + } else { + ElMessage.warning(res.message) + } +} + +const openDialog = (type, value) => { + dialogRef.value.openDialog(type, value, data.queryParams.companyId); +} +const openDutyDialog = (value) =>{ + dutyDialogRef.value.openDialog(value); +} + +/** 重置新增的表单以及其他数据 */ +const reset = async()=> { + data.queryParams = { + pageNum: 1, + pageSize: 10, + companyId: null + } + await getCompanyList() + await getList() +} +const handleDelete = (val) => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delDepart(val.deptId) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getList() + }else{ + ElMessage.warning(res.message) + } + }) +} + +const download = async (val) => { + const templatePath = '/dutyFile.docx' + const data = await getDeptDetail(val.deptId) + console.log(data) + try { + generateWordDocument(templatePath, data, `${data.deptName}职责表.docx`); + } catch (error){ + ElMessage({ + type: 'warning', + message: '失败' + }); + } +} + +const getDeptDetail = async (deptId)=>{ + let tableData = {} + const res = await getDeptInfo(deptId) + if (res.code == 200) { + if(res.data){ + tableData = res.data + if(res.data.sysDeptResponsibilitys && Array.isArray(res.data.sysDeptResponsibilitys) && res.data.sysDeptResponsibilitys.find(i=>i.clauseNum == '5.3')){ + tableData.tableData = sortResponsibilities(res.data.sysDeptResponsibilitys.map(i=>{ + return { + ...i, + evidenceMaterials: i.evidenceMaterials || '', + managementDocuments: i.managementDocuments || '', + technicalDocuments: i.technicalDocuments || '', + existingRecords: i.existingRecords || '', + } + })) + }else{ + tableData.tableData = [...data.firstFive,...res.data.sysDeptResponsibilitys.map(i=>{ + return { + ...i, + evidenceMaterials: i.evidenceMaterials || '', + managementDocuments: i.managementDocuments || '', + technicalDocuments: i.technicalDocuments || '', + existingRecords: i.existingRecords || '', + } + }),...data.lastTwo] + } + return tableData + }else{ + ElMessage.warning('暂无部门信息') + } + } else { + ElMessage.warning(res.message) + } +} + +const sortResponsibilities = (list) => { + // 提取firstFive和lastTwo的clauseNum作为排序依据 + const firstFiveClauses = data.firstFive.map(item => item.clauseNum) + const lastTwoClauses = data.lastTwo.map(item => item.clauseNum) + + // 分类处理 + const matchedFirstFive = [] + const matchedLastTwo = [] + const otherItems = [] + + // 先匹配firstFive + firstFiveClauses.forEach(clauseNum => { + const foundItem = list.find(item => item.clauseNum === clauseNum) + if (foundItem) { + matchedFirstFive.push(foundItem) + } + }); + + // 然后匹配lastTwo + lastTwoClauses.forEach(clauseNum => { + const foundItem = list.find(item => item.clauseNum === clauseNum) + if (foundItem && !matchedFirstFive.includes(foundItem)) { + matchedLastTwo.push(foundItem) + } + }); + + // 剩下的其他项 + list.forEach(item => { + if (!matchedFirstFive.includes(item) && !matchedLastTwo.includes(item)) { + otherItems.push(item) + } + }); + + // 合并结果数组 + return [...matchedFirstFive, ...otherItems, ...matchedLastTwo] +} + +</script> diff --git a/src/views/build/conpanyFunctionConsult/orgStructure/dutyDistributeChart/index.vue b/src/views/build/conpanyFunctionConsult/orgStructure/dutyDistributeChart/index.vue new file mode 100644 index 0000000..903fff4 --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/orgStructure/dutyDistributeChart/index.vue @@ -0,0 +1,312 @@ +<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',{})"--> +<!-- >新增</el-button>--> +<!-- </el-form-item>--> + <el-form-item v-if="isAdmin" label="企业:" > + <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable> + <el-option + v-for="item in companyList" + :key="item.id" + :label="item.name" + :value="item.id"> + </el-option> + </el-select> + </el-form-item> + <el-form-item > + <el-button type="primary" v-if="isAdmin" @click="getList">查询</el-button> + <el-button type="primary" v-if="isAdmin" plain @click="reset">重置</el-button> + </el-form-item> + </el-form> + </div> + <div style="display: flex;justify-content: space-between;margin-bottom: 10px"> + <div>质量管理体系过程与部门职能矩阵</div> + <div> + <el-button type="primary" @click="initDistribute">重新生成</el-button> + <el-button type="primary" v-if="!isEdit" @click="isEdit = true">编辑</el-button> + <el-button type="primary" v-if="isEdit" @click="confirmEdit">保存</el-button> + </div> + </div> + <!-- 表格数据 --> + <el-table v-loading="loading" :data="caluseList" class="caluseTable" :border="true" :span-method="arraySpanMethod"> + <el-table-column label="条款号" prop="clauseNum" align="center"/> + <el-table-column label="条款内容/要素" prop="content" align="left"/> + <el-table-column label="总经理" prop="manage" align="center"> + <template #default="scope"> + <el-checkbox v-model="scope.row.manage" disabled size="large" /> + </template> + </el-table-column> + <el-table-column label="管理者代表" prop="represent" align="center"> + <template #default="scope"> + <el-checkbox v-model="scope.row.represent" disabled size="large" /> + </template> + </el-table-column> + <el-table-column v-for="column in deptList" :key="column.deptId" :prop="column.deptId" :label="column.deptName" align="center"> + <template #default="scope"> + <el-checkbox v-model="scope.row[column.deptId]" :disabled="!isEdit" size="large" @change="changeStatus(scope.row)"/> + </template> + </el-table-column> + </el-table> + </div> +</template> + +<script setup> +import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; +import {ElMessage, ElMessageBox} from "element-plus"; +import {delUser, getUser} from "@/api/onlineEducation/user"; +import useUserStore from "@/store/modules/user"; +import {getCompany, getDepart, getDistribution, initDistribution, saveDistribution} from "@/api/orgStructure/depart"; +const userStore = useUserStore() +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const dialogRef = ref(); +const data = reactive({ + isAdmin: false, + companyList: [], + queryParams: { + companyId: null + }, + isEdit: false, + dataList: [], + deptList: [], + caluseList: [ + {clauseNum: '4', content: '组织环境'}, + {clauseNum: '4.1', content: '理解组织及其环境',manage: true,represent: false}, + {clauseNum: '4.2', content: '理解相关方的需求和期望',manage: true,represent: false}, + {clauseNum: '4.3', content: '确定质量管理体系的范围',manage: false,represent: true}, + {clauseNum: '4.4', content: '质量管理体系及其过程',manage: false,represent: true}, + {clauseNum: '5', content: '领导作用'}, + {clauseNum: '5.1', content: '领导作用和承诺',manage: true,represent: false}, + {clauseNum: '5.2', content: '方针',manage: true,represent: false}, + {clauseNum: '5.3', content: '组织内的角色、职责和权限',manage: true,represent: false}, + {clauseNum: '6', content: ''}, + {clauseNum: '6.1', content: '应对风险和机遇的措施',manage: true,represent: false}, + {clauseNum: '6.2', content: '质量目标及其实现的策划',manage: false,represent: true}, + {clauseNum: '6.3', content: '变更的策划',manage: false,represent: true}, + {clauseNum: '7', content: '支持'}, + {clauseNum: '7.1', content: '资源',manage: true,represent: false}, + {clauseNum: '7.1.1', content: '总则',manage: true,represent: false}, + {clauseNum: '7.1.2', content: '人员',manage: true,represent: false}, + {clauseNum: '7.1.3', content: '基础设施',manage: false,represent: true}, + {clauseNum: '7.1.4', content: '过程运行环境',manage: false,represent: true}, + {clauseNum: '7.1.5', content: '监视和测量资源',manage: false,represent: true}, + {clauseNum: '7.1.6', content: '组织的知识',manage: false,represent: true} + ], + form: { + companyId: null, + list: [] + } +}); + +const { queryParams,isEdit, dataList,deptList, isAdmin, companyList, caluseList, form } = toRefs(data); + +onMounted(async ()=>{ + if(userStore.roles.includes('admin')){ + data.isAdmin = true + await getCompanyList() + }else{ + data.isAdmin = false + data.queryParams.companyId = userStore.companyId + data.form.companyId = userStore.companyId + } + await getDeptList() + await getList() +}) + +onUnmounted(()=>{ + +}) + +const changeStatus = (val)=>{ + const excludeFields = ['clauseNum', 'content', 'manage', 'represent'] + // 转换当前对象为临时数组 + const currentList = Object.keys(val).filter(key => !excludeFields.includes(key)).map(key => ({ + clauseNum: val.clauseNum, + deptId: Number(key), + chooseLab: val[key] ? 1 : 0 + })) + // 合并到 data.form.list,覆盖重复项 + currentList.forEach(newItem => { + const existingIndex = data.form.list.findIndex( + item => item.clauseNum === newItem.clauseNum && item.deptId === newItem.deptId + ); + if (existingIndex !== -1) { + // 覆盖已存在的项 + data.form.list[existingIndex] = newItem; + } else { + // 新增不存在的项 + data.form.list.push(newItem); + } + }) +} + +const confirmEdit = async ()=>{ + loading.value = true + const res = await saveDistribution(data.form) + if(res.code == 200){ + ElMessage.success(res.message) + }else{ + ElMessage.warning(res.message) + } + loading.value = false + data.isEdit = !data.isEdit +} + +const arraySpanMethod = ({ + row, + column, + rowIndex, + columnIndex, + }) => { + if (rowIndex === 0 || rowIndex === 5 ||rowIndex === 9 ||rowIndex === 13) { + if (columnIndex === 0) { + return [1, 1] + } else if(columnIndex === 1){ + return [1,8] + } + } +} + +const getList = async () => { + loading.value = true + const res = await getDistribution(data.queryParams) + if(res.code == 200){ + data.dataList = res.data + for(let item of data.caluseList){ + const sameNum = data.dataList.filter(i=>i.clauseNum == item.clauseNum).map(j=> { + return { + deptId: j.deptId, + chooseLab: j.chooseLab + } + } + ) + for(let i of sameNum){ + item[i.deptId] = i.chooseLab == 0?false:true + } + } + }else{ + ElMessage.warning(res.message) + } + loading.value = false +} + +const getDeptList = async () => { + loading.value = true + const res = await getDepart({pageNum: 1, pageSize: 999, companyId: data.queryParams.companyId}) + if(res.code == 200){ + data.deptList = res.data + }else{ + ElMessage.warning(res.message) + } + loading.value = false +} + +const getCompanyList = async ()=>{ + const queryParams = { + pageNum: 1, + pageSize: 999 + } + const res = await getCompany(queryParams) + if (res.code == 200) { + data.companyList = res.data.list?res.data.list:[] + data.queryParams.companyId = data.companyList[0].id + data.form.companyId = data.companyList[0].id + } else { + ElMessage.warning(res.message) + } +} + +const initDistribute = async ()=>{ + ElMessageBox.confirm( + '重新生成将重置原有分配信息,是否继续?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await initDistribution({companyId: data.queryParams.companyId}) + if (res.code == 200) { + ElMessage.success(res.message) + await getList() + } else { + ElMessage.warning(res.message) + } + }) +} + +const openDialog = (type, value) => { + dialogRef.value.openDialog(type, value); +} + +/** 重置新增的表单以及其他数据 */ +function reset() { + data.queryParams = { + pageNum: 1, + pageSize: 10, + companyId: null + } + getList() +} +const handleDelete = (val) => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delUser(val.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getList() + }else{ + ElMessage.warning(res.message) + } + }) +} + +</script> +<style lang="scss"> +.caluseTable{ + .el-table__cell{ + padding: 4px 0 !important; + .is-disabled{ + .el-checkbox__label{ + color: #606266 !important + } + &.is-checked{ + .el-checkbox__label{ + color: #409eff !important + } + .el-checkbox__inner{ + background-color: #333; + &::after{ + display: none; + } + } + } + .el-checkbox__inner{ + width: 16px; + height: 16px; + background-color: #fff; + border-color: #999; + border-radius: 50% !important; + } + } + } + .cell{ + padding: 0 6px !important; + } +} +</style> \ No newline at end of file diff --git a/src/views/build/conpanyFunctionConsult/peopleManage/user/index.vue b/src/views/build/conpanyFunctionConsult/peopleManage/user/index.vue deleted file mode 100644 index 4bc7af5..0000000 --- a/src/views/build/conpanyFunctionConsult/peopleManage/user/index.vue +++ /dev/null @@ -1,179 +0,0 @@ -<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',{})" - >新增</el-button> - </el-form-item> - <el-form-item label="用户名:" > - <el-input v-model="data.queryParams.username" placeholder="请输入用户名"></el-input> - </el-form-item> - <el-form-item label="用户类型:" > - <el-select v-model="data.queryParams.userType" placeholder="请选择" clearable> - <el-option - v-for="item in data.userTypeList" - :key="item.id" - :label="item.name" - :value="item.id"> - </el-option> - </el-select> - </el-form-item> - <el-form-item > - <el-button - type="primary" - @click="getList" - >查询</el-button> - <el-button - type="primary" - plain - @click="reset" - >重置</el-button> - </el-form-item> - </el-form> - </div> - <!-- 表格数据 --> - <el-table v-loading="loading" :data="dataList" :border="true"> - <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="用户名" prop="username" align="center" /> - <el-table-column label="名称" prop="name" align="center" /> - <el-table-column label="手机号" prop="phone" align="center"/> - <el-table-column label="用户类型" prop="userTypeName" align="center" width="150" /> - <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> - <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> - <el-button link type="primary" @click="openDialog('pwd',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" - /> - - <user-dialog ref="dialogRef" @getList=getList></user-dialog> - </div> -</template> - -<script setup> -import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; -import {ElMessage, ElMessageBox} from "element-plus"; -import {delCompany, getCompany} from "@/api/onlineEducation/company"; -import userDialog from './components/userDialog.vue' -import {delUser, getUser} from "@/api/onlineEducation/user"; -import Cookies from "js-cookie"; - - -const { proxy } = getCurrentInstance(); -const loading = ref(false); -const dialogRef = ref(); -const data = reactive({ - queryParams: { - pageNum: 1, - pageSize: 10, - username: '', - userType: null - }, - total: 0, - dataList: [], - userTypeList: [ - { - id: 0, - name: '管理员' - }, - { - id: 1, - name: '企业级' - }, - { - id: 2, - name: '部门级' - }, - { - id: 3, - name: '车间(岗位)级别' - }, - { - id: 4, - name: '其他' - }, - ] - -}); - -const { queryParams, total, dataList } = toRefs(data); -const userInfo = ref() -onMounted(()=>{ - userInfo.value = JSON.parse(Cookies.get('userInfo')) - getList() -}) - -onUnmounted(()=>{ - -}) - -const getList = async () => { - loading.value = true - const res = await getUser(data.queryParams) - if(res.code == 200){ - data.dataList = res.data.list.map(item => { - return { - ...item, - userTypeName: item.userType === 0 ? '管理员' : item.userType === 1 ? '企业级' : item.userType === 2 ? '部门级' : item.userType === 3 ? '车间级' :'其他' - } - }) - data.total = res.data.total - }else{ - ElMessage.warning(res.message) - } - loading.value = false -} - -const openDialog = (type, value) => { - if(userInfo.value.userType === 3){ - ElMessage.warning('车间级用户不能新增') - return; - } - dialogRef.value.openDialog(type, value); -} - -/** 重置新增的表单以及其他数据 */ -function reset() { - data.queryParams = { - pageNum: 1, - pageSize: 10, - username: '', - userType: null - } - getList() -} -const handleDelete = (val) => { - ElMessageBox.confirm( - '确定删除此条数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - const res = await delUser(val.id) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - }else{ - ElMessage.warning(res.message) - } - }) -} - -</script> diff --git a/src/views/build/conpanyFunctionConsult/staffManage/staffPortfolio/components/editorDialog.vue b/src/views/build/conpanyFunctionConsult/staffManage/staffPortfolio/components/editorDialog.vue new file mode 100644 index 0000000..050d4bc --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/staffManage/staffPortfolio/components/editorDialog.vue @@ -0,0 +1,132 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + :title="state.title" + width="700px" + :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="companyRoster"> + <editor v-model="state.form.companyRoster" :min-height="300"/> + </el-form-item> + </el-form> + <template #footer v-if="state.title !='查看'"> + <span class="dialog-footer"> + <el-button @click="handleClose" size="default">取 消</el-button> + <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> + </span> + </template> + </el-dialog> + </div> +</template> +<script setup> +import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue' +import {ElMessage} from "element-plus"; +import {addUser, editUser, getUserById, resetPwd} from "@/api/onlineEducation/user" +import {Base64} from "js-base64" +import {getCompany} from "@/api/onlineEducation/company"; +import {saveRoster, updateRoster} from "@/api/staffManage/staff"; + +const emit = defineEmits(["getList"]); +const dialogVisible = ref(false) +const superRef = ref() +const state = reactive({ + title: '', + form: { + id: null, + companyId: null, + companyRoster: '', + }, + isView: false, + formRules:{ + companyRoster: [{ required: true, message: '员工情况介绍', trigger: 'blur' }], + }, + isAdmin: false, +}) +const UisMounted = ref(false); +onMounted(() => { + +}); + +const disabled = ref(false); +const userInfo = ref() +const openDialog = async (type, value, companyId) => { + state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' + state.form.companyId = companyId + if(type == 'view'){ + state.isView = true + }else{ + state.isView = false + } + if(state.title == '编辑'||state.title == '查看'){ + Object.keys(state.form).forEach(key => { + if (key in value) { + state.form[key] = value[key]; + } + }) + } + dialogVisible.value = true +} +const loading = ref(false) + +const onSubmit = async () => { + const valid = await superRef.value.validate(); + if(valid){ + + if(state.title == '新增'){ + const {id,...data} = state.form + const res = await saveRoster(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + }else{ + const res = await updateRoster(state.form) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + }else{ + ElMessage.warning(res.message) + } + } + } +} + + +const handleClose = () => { + state.form = { + id: null, + companyId: null, + companyRoster: '', + } + 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/staffManage/staffPortfolio/index.vue b/src/views/build/conpanyFunctionConsult/staffManage/staffPortfolio/index.vue new file mode 100644 index 0000000..3225da3 --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/staffManage/staffPortfolio/index.vue @@ -0,0 +1,157 @@ +<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',{})" + >新增</el-button> + </el-form-item> + <el-form-item v-if="isAdmin" label="企业:" > + <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable> + <el-option + v-for="item in companyList" + :key="item.id" + :label="item.name" + :value="item.id"> + </el-option> + </el-select> + </el-form-item> + <el-form-item > + <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> + <!-- 表格数据 --> + <el-table v-loading="loading" :data="dataList" :border="true"> + <el-table-column label="序号" type="index" align="center" width="80" /> + <el-table-column label="企业名称" prop="companyName" align="center" /> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDialog('view',scope.row)">查看</el-button> + <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> + <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> + </template> + </el-table-column> + </el-table> + + <pagination + v-show="total > 0" + :total="total" + v-model:page="queryParams.pageNum" + v-model:limit="queryParams.pageSize" + @pagination="getList" + /> + + <editor-dialog ref="dialogRef" @getList=getList></editor-dialog> + </div> +</template> + +<script setup> +import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; +import {ElMessage, ElMessageBox} from "element-plus"; +import {delCompany, getCompany} from "@/api/onlineEducation/company"; +import {delUser, getUser} from "@/api/onlineEducation/user"; +import Cookies from "js-cookie"; +import editorDialog from './components/editorDialog.vue' +import {delRoster, getRosterList} from "@/api/staffManage/staff"; +import useUserStore from "@/store/modules/user"; +const userStore = useUserStore() +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const dialogRef = ref(); +const data = reactive({ + queryParams: { + pageNum: 1, + pageSize: 10, + companyId: null + }, + total: 0, + dataList: [], + companyList: [], + isAdmin: false +}); + +const { queryParams, total, dataList,companyList, isAdmin } = toRefs(data); +const userInfo = ref() +onMounted(async()=>{ + userInfo.value = JSON.parse(Cookies.get('userInfo')) + if(userStore.roles.includes('admin')){ + data.isAdmin = true + await getCompanyList() + }else{ + data.isAdmin = false + data.queryParams.companyId = userStore.companyId + } + await getList() +}) + +onUnmounted(()=>{ + +}) + +const getList = async () => { + loading.value = true + const res = await getRosterList(data.queryParams) + if(res.code == 200){ + data.dataList = res.data.list + data.total = res.data.total + }else{ + ElMessage.warning(res.message) + } + loading.value = false +} + +const getCompanyList = async ()=>{ + const queryParams = { + pageNum: 1, + pageSize: 999 + } + const res = await getCompany(queryParams) + if (res.code == 200) { + data.companyList = res.data.list?res.data.list:[] + data.queryParams.companyId = data.companyList[0].id + } else { + ElMessage.warning(res.message) + } +} + +const openDialog = (type, value) => { + dialogRef.value.openDialog(type, value,data.queryParams.companyId); +} + +/** 重置新增的表单以及其他数据 */ +const reset = async()=> { + data.queryParams = { + pageNum: 1, + pageSize: 10, + companyId: null + } + await getCompanyList() + await getList() +} +const handleDelete = (val) => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delRoster({companyRosterId: val.id}) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getList() + }else{ + ElMessage.warning(res.message) + } + }) +} + +</script> diff --git a/src/views/build/conpanyFunctionConsult/peopleManage/user/components/userDialog.vue b/src/views/build/conpanyFunctionConsult/staffManage/staffRegister/components/staffDialog.vue similarity index 85% rename from src/views/build/conpanyFunctionConsult/peopleManage/user/components/userDialog.vue rename to src/views/build/conpanyFunctionConsult/staffManage/staffRegister/components/staffDialog.vue index c759cf7..fdef075 100644 --- a/src/views/build/conpanyFunctionConsult/peopleManage/user/components/userDialog.vue +++ b/src/views/build/conpanyFunctionConsult/staffManage/staffRegister/components/staffDialog.vue @@ -21,6 +21,17 @@ <el-radio :label="1">女</el-radio> </el-radio-group> </el-form-item> + <el-form-item label="身份证号:" prop="idCard" v-if="state.title !== '修改密码'"> + <el-input v-model.trim="state.form.idCard" :maxlength="18" :disabled="disabled" placeholder="请输入身份证号"></el-input> + </el-form-item> + <el-form-item label="入职时间:" prop="entryTime" v-if="state.title !== '修改密码'" > + <el-date-picker + v-model="state.form.entryTime" + type="date" + value-format="YYYY-MM-DD" + placeholder="请选择入职时间" + /> + </el-form-item> <el-form-item label="密码:" prop="password" v-if="state.title == '新增' || state.title == '修改密码'"> <el-input v-model.trim="state.form.password" type="password" show-password placeholder="请输入密码"></el-input> </el-form-item> @@ -92,6 +103,29 @@ </el-form-item> + <el-form-item label="部门:" prop="deptId" v-if="state.title !== '修改密码'"> + <el-select + clearable + v-model="state.form.deptId" + filterable + :disabled="disabled" + placeholder="请选择部门" + style="width: 100%" + > + <el-option + v-for="item in state.deptList" + :key="item.deptId" + :label="item.deptName" + :value="item.deptId" + /> + </el-select> + </el-form-item> + <el-form-item label="职务:" prop="duty" v-if="state.title !== '修改密码'" > + <el-input v-model.trim="state.form.duty" :disabled="disabled" placeholder="请输入职务"></el-input> + </el-form-item> + <el-form-item label="专业:" prop="post" v-if="state.title !== '修改密码'" > + <el-input v-model.trim="state.form.post" :disabled="disabled" placeholder="请输入专业"></el-input> + </el-form-item> <el-form-item label="所属上级账号:" prop="companyName" v-if="showChild"> <scorllSelect :disabled="disabled || state.title =='编辑'" @@ -133,7 +167,7 @@ import {getUser} from "@/api/onlineEducation/user"; import {debounce} from "@/utils"; import Cookies from "js-cookie"; - +import {getDepart} from "@/api/orgStructure/depart"; const emit = defineEmits(["getList"]); const dialogVisible = ref(false) const superRef = ref(null) @@ -216,23 +250,33 @@ userType: null, sex: 0, companyId: null, - parentId: null + companyName: '', + parentId: null, + entryTime: '', + idCard: '', + deptId: null, + duty: '', + post: '' }, formRules:{ name: [{ required: true, message: '请输入公司、部门或者车间岗位名称', trigger: 'blur' }], - companyName: [{ required: true, message: '请选择上级企业', trigger: 'blur' }], + companyName: [{ required: true, message: '请选择所在企业', trigger: 'blur' }], + deptId: [{ required: true, message: '请选择部门', trigger: 'blur' }], username: [{ required: true, trigger: "blur", validator: validateUsername }], password: [{ required: true, validator: validatePwd, trigger: 'blur' }], confirmPassword: [{ required: true, validator: equalToPassword, trigger: 'blur' }], phone: [{ required: true, validator: validateUserPhone, trigger: 'blur' }], userType: [{ required: true, message: '请选择用户类型', trigger: 'blur' }], + idCard: [{ required: true, message: '请输入身份证号', trigger: 'blur' }], + entryTime: [{ required: true, message: '请选择入职时间', trigger: 'blur' }], + duty: [{ required: true, message: '请输入职务', trigger: 'blur' }], + post: [{ required: true, message: '请输入专业', trigger: 'blur' }], }, companyList: [], userList: [ ], keyword:'', - pageNum: 1, pageSize: 10, cloading:false, @@ -251,17 +295,18 @@ const showChild = ref(false) const disabled = ref(false); const userInfo = ref() -const openDialog = async (type, value) => { +const openDialog = async (type, value, companyId) => { userInfo.value = JSON.parse(Cookies.get('userInfo')) - console.log("userInfo",userInfo.value) state.currentUserType = userInfo.value.userType if(state.currentUserType === 0){ state.isAdmin = true; + state.form.companyId = companyId; }else { state.isAdmin = false; state.form.companyId = userInfo.value.companyId; state.form.companyName = userInfo.value.companyName; } + await getdeptList(userInfo.value.companyId) if(type !== 'view' && type !== 'pwd'){ // if(state.isAdmin){ @@ -272,7 +317,9 @@ if(type === 'edit' || type === 'view') { startUsername.value = value.username if( type === 'view'){ - disabled.value = true; + disabled.value = true + }else{ + disabled.value = false } const res = await getUserById(value.id); if(res.code === 200){ @@ -361,6 +408,21 @@ // console.log("state.companyList",state.companyList) // } } + +const getdeptList = async (companyId)=> { + const params = { + pageNum: 1, + pageSize: 999, + companyId: companyId + } + const res = await getDepart(params) + if(res.code == 200){ + state.deptList = res.data + }else{ + ElMessage.warning(res.message) + } +} + const onSubmit = async () => { const valid = await superRef.value.validate(); if(valid){ @@ -389,11 +451,15 @@ phone: data.phone, id:data.id, companyId: data.companyId, + deptId: data.deptId, userType:data.userType, username:data.username, password: data.password, - parentId: data.parentId - + parentId: data.parentId, + idCard: data.idCard, + entryTime: data.entryTime, + duty: data.duty, + post: data.post } const res = await editUser(param) @@ -532,6 +598,7 @@ state.form.companyId = item.id } }) + getdeptList(state.form.companyId) } const getSelectUser = (val) => { console.log("valllllllll",val) diff --git a/src/views/build/conpanyFunctionConsult/staffManage/staffRegister/index.vue b/src/views/build/conpanyFunctionConsult/staffManage/staffRegister/index.vue new file mode 100644 index 0000000..0404d39 --- /dev/null +++ b/src/views/build/conpanyFunctionConsult/staffManage/staffRegister/index.vue @@ -0,0 +1,265 @@ +<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',{})" + >新增</el-button> + </el-form-item> + <el-form-item label="用户名:" > + <el-input v-model="data.queryParams.username" placeholder="请输入用户名"></el-input> + </el-form-item> +<!-- <el-form-item label="用户类型:" >--> +<!-- <el-select v-model="data.queryParams.userType" placeholder="请选择" clearable>--> +<!-- <el-option--> +<!-- v-for="item in data.userTypeList"--> +<!-- :key="item.id"--> +<!-- :label="item.name"--> +<!-- :value="item.id">--> +<!-- </el-option>--> +<!-- </el-select>--> +<!-- </el-form-item>--> + <el-form-item v-if="isAdmin" label="企业:" > + <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable> + <el-option + v-for="item in companyList" + :key="item.id" + :label="item.name" + :value="item.id"> + </el-option> + </el-select> + </el-form-item> +<!-- <el-form-item label="用户名:" >--> +<!-- <el-input v-model="data.queryParams.username" placeholder="请输入用户名"></el-input>--> +<!-- </el-form-item>--> +<!-- <el-form-item label="用户类型:" >--> +<!-- <el-select v-model="data.queryParams.userType" placeholder="请选择" clearable>--> +<!-- <el-option--> +<!-- v-for="item in data.userTypeList"--> +<!-- :key="item.id"--> +<!-- :label="item.name"--> +<!-- :value="item.id">--> +<!-- </el-option>--> +<!-- </el-select>--> +<!-- </el-form-item>--> + <el-form-item > + <el-button type="primary" @click="getList">查询</el-button> + <el-button type="primary" plain @click="reset" style="margin-right: 12px">重置</el-button> + <vue3-json-excel + :json-data="expertData" + :fields="fields" + name="用户花名册.xls" + > + <el-button type="primary">导出</el-button> + </vue3-json-excel> + </el-form-item> + </el-form> + </div> + <!-- 表格数据 --> + <el-table v-loading="loading" :data="dataList" :border="true"> + <el-table-column label="序号" type="index" align="center" width="80" /> + <el-table-column label="姓名" prop="username" align="center" /> + <el-table-column label="身份证号" prop="idCard" align="center" /> + <el-table-column label="入职时间" prop="entryTime" align="center"/> + <el-table-column label="部门" prop="deptName" align="center"/> + <el-table-column label="职务" prop="duty" align="center"/> + <el-table-column label="联系方式" prop="phone" align="center"/> + <el-table-column label="专业" prop="post" align="center"/> + <el-table-column label="用户类型" prop="userTypeName" align="center"/> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDialog('view',scope.row)">查看</el-button> + <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> + <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> + </template> + </el-table-column> + </el-table> + + <pagination + v-show="total > 0" + :total="total" + v-model:page="queryParams.pageNum" + v-model:limit="queryParams.pageSize" + @pagination="getList" + /> + + <user-dialog ref="dialogRef" @getList=getList></user-dialog> + </div> +</template> + +<script setup> +import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; +import {ElMessage, ElMessageBox} from "element-plus"; +import {delCompany, getCompany} from "@/api/onlineEducation/company"; +import userDialog from './components/staffDialog.vue' +import {delUser, getUser} from "@/api/onlineEducation/user"; +import Cookies from "js-cookie"; +import useUserStore from "@/store/modules/user"; +const userStore = useUserStore() + +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const dialogRef = ref(); +const data = reactive({ + queryParams: { + pageNum: 1, + pageSize: 10, + username: '', + userType: null, + companyId: null + }, + total: 0, + dataList: [], + isAdmin: false, + companyList: [], + expertData: [], + userTypeList: [ + { + id: 0, + name: '管理员' + }, + { + id: 1, + name: '企业级' + }, + { + id: 2, + name: '部门级' + }, + { + id: 3, + name: '车间(岗位)级别' + }, + { + id: 4, + name: '其他' + }, + ] + +}); + +const { queryParams, total, dataList,isAdmin,companyList,expertData } = toRefs(data); +const userInfo = ref() +const fields = ref({ + '序号':'index', + '姓名':'username', + '身份证号':'idCard', + '入职时间':'entryTime', + '部门':'deptName', + '职务':'duty', + '联系方式':'phone', + '专业':'post', + '用户类型':'userTypeName' +}); +onMounted(async ()=>{ + userInfo.value = JSON.parse(Cookies.get('userInfo')) + if(userStore.roles.includes('admin')){ + data.isAdmin = true + await getCompanyList() + }else{ + data.isAdmin = false + data.queryParams.companyId = userStore.companyId + } + await getList() +}) + +onUnmounted(()=>{ + +}) + +const getList = async () => { + loading.value = true + const res = await getUser(data.queryParams) + if(res.code == 200){ + data.dataList = res.data.list.map(item => { + return { + ...item, + userTypeName: item.userType === 0 ? '管理员' : item.userType === 1 ? '企业级' : item.userType === 2 ? '部门级' : item.userType === 3 ? '车间级' :'其他', + entryTime: item.entryTime?.substring(0, 10) + } + }) + data.total = res.data.total + }else{ + ElMessage.warning(res.message) + } + loading.value = false + await getAllList() +} + +const getCompanyList = async ()=>{ + const queryParams = { + pageNum: 1, + pageSize: 999 + } + const res = await getCompany(queryParams) + if (res.code == 200) { + data.companyList = res.data.list?res.data.list:[] + data.queryParams.companyId = data.companyList[0].id + } else { + ElMessage.warning(res.message) + } +} + +const getAllList = async () => { + let params = data.queryParams + params.pageSize = 999 + const res = await getUser(params) + if(res.code == 200){ + data.expertData = res.data.list.map((item,index) => { + return { + ...item, + index: index + 1, + userTypeName: item.userType === 0 ? '管理员' : item.userType === 1 ? '企业级' : item.userType === 2 ? '部门级' : item.userType === 3 ? '车间级' :'其他', + entryTime: item.entryTime?.substring(0, 10) + } + }) + }else{ + ElMessage.warning(res.message) + } +} + +const openDialog = (type, value) => { + if(userInfo.value.userType === 3){ + ElMessage.warning('车间级用户不能新增') + return; + } + dialogRef.value.openDialog(type, value, data.queryParams.companyId); +} + +/** 重置新增的表单以及其他数据 */ +const reset = async()=> { + data.queryParams = { + pageNum: 1, + pageSize: 10, + username: '', + userType: null, + companyId: null + } + await getCompanyList() + await getList() +} +const handleDelete = (val) => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delUser(val.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getList() + }else{ + ElMessage.warning(res.message) + } + }) +} + +</script> diff --git a/src/views/homePage.vue b/src/views/homePage.vue index d7d488d..acf9425 100644 --- a/src/views/homePage.vue +++ b/src/views/homePage.vue @@ -138,7 +138,6 @@ loading.value = true; Cookies.set("username", loginForm.value.username, { expires: 30 }); Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 }); - const param = { username: loginForm.value.username, password: Base64.encode(loginForm.value.password), @@ -211,7 +210,8 @@ align-items: center; font-family: 'AliMa'; color: #fff; - font-size: 3.2rem; + font-size: clamp(3rem, 1.286rem + 2.68vw, 4.5rem); + letter-spacing: 10px; text-align: center; line-height: 1.5; transform: translateY(-80px); diff --git a/src/views/system/clauseManage/components/editDialog.vue b/src/views/system/clauseManage/components/editDialog.vue new file mode 100644 index 0000000..81a01cb --- /dev/null +++ b/src/views/system/clauseManage/components/editDialog.vue @@ -0,0 +1,125 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + :title="state.title" + width="700px" + :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="clauseNum"> + <el-input v-model.trim="state.form.clauseNum" :disabled="state.title =='查看'" placeholder="条款编码"></el-input> + </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> + </el-form> + <template #footer v-if="state.title !='查看'"> + <span class="dialog-footer"> + <el-button @click="handleClose" size="default">取 消</el-button> + <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> + </span> + </template> + </el-dialog> + </div> +</template> +<script setup> +import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue' +import {ElMessage} from "element-plus"; +import {addUser, editUser, getUserById, resetPwd} from "@/api/onlineEducation/user" +import {Base64} from "js-base64" +import {getCompany} from "@/api/onlineEducation/company"; +import {updateInfoPlatforms, updateSysClause} from "@/api/staffManage/staff"; + +const emit = defineEmits(["getList"]); +const dialogVisible = ref(false) +const superRef = ref() +const state = reactive({ + title: '', + form: { + id: null, + clauseNum: '', + name: '', + companyId: null + }, + formRules:{ + clauseNum: [{ required: true, message: '请输入条款编码', trigger: 'blur' }], + name: [{ required: true, message: '请输入条款内容', trigger: 'blur' }] + } +}) +onMounted(() => { + +}); + +const openDialog = async (type, value,companyId) => { + state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' + state.form.companyId = companyId + 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(); + if(valid){ + let data = {} + if(state.title == '新增'){ + data = { + clauseNum: state.form.clauseNum, + name: state.form.name, + companyId: state.form.companyId + } + }else{ + data = state.form + } + const res = await updateSysClause(data) + if(res.code == 200){ + ElMessage.success(res.message) + emit('getList') + handleClose() + dialogVisible.value = false; + }else{ + ElMessage.warning(res.message) + } + + } +} + +const handleClose = () => { + state.form = { + id: null, + clauseNum: '', + name: '', + companyId: null + } + 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/system/clauseManage/index.vue b/src/views/system/clauseManage/index.vue new file mode 100644 index 0000000..0e72843 --- /dev/null +++ b/src/views/system/clauseManage/index.vue @@ -0,0 +1,166 @@ +<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',{})" + >新增</el-button> + </el-form-item> + <el-form-item v-if="isAdmin" label="企业:" > + <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable> + <el-option + v-for="item in companyList" + :key="item.id" + :label="item.name" + :value="item.id"> + </el-option> + </el-select> + </el-form-item> + <el-form-item > + <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> + <!-- 表格数据 --> + <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('view',scope.row)">查看</el-button> + <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> + <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> + </template> + </el-table-column> + </el-table> + + <pagination + v-show="total > 0" + :total="total" + v-model:page="queryParams.pageNum" + v-model:limit="queryParams.pageSize" + @pagination="getList" + /> + + <edit-dialog ref="dialogRef" @getList=getList></edit-dialog> + </div> +</template> + +<script setup> +import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; +import {ElMessage, ElMessageBox} from "element-plus"; +import {delCompany, getCompany} from "@/api/onlineEducation/company"; +import {delUser, getUser} from "@/api/onlineEducation/user"; +import Cookies from "js-cookie"; +import editDialog from './components/editDialog.vue' +import { + delInfoPlatforms, + delRoster, + delSysClause, + getInfoPlatforms, + getRosterList, + getSysClause +} from "@/api/staffManage/staff"; +import useUserStore from "@/store/modules/user"; +const userStore = useUserStore() +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const dialogRef = ref(); +const data = reactive({ + queryParams: { + pageNum: 1, + pageSize: 10, + companyId: null + }, + total: 0, + dataList: [], + companyList: [], + isAdmin: false +}); + +const { queryParams, total, dataList,companyList, isAdmin } = toRefs(data); +const userInfo = ref() +onMounted(async ()=>{ + userInfo.value = JSON.parse(Cookies.get('userInfo')) + if(userStore.roles.includes('admin')){ + data.isAdmin = true + await getCompanyList() + }else{ + data.isAdmin = false + data.queryParams.companyId = userStore.companyId + } + await getList() +}) + +onUnmounted(()=>{ + +}) + +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) + } + loading.value = false +} + +const getCompanyList = async ()=>{ + const queryParams = { + pageNum: 1, + pageSize: 999 + } + const res = await getCompany(queryParams) + if (res.code == 200) { + data.companyList = res.data.list?res.data.list:[] + data.queryParams.companyId = data.companyList[0].id + } else { + ElMessage.warning(res.message) + } +} + +const openDialog = (type, value) => { + dialogRef.value.openDialog(type, value, data.queryParams.companyId); +} + +/** 重置新增的表单以及其他数据 */ +const reset= async()=> { + data.queryParams = { + pageNum: 1, + pageSize: 10, + companyId: null + } + await getCompanyList() + await getList() +} + +const handleDelete = (val) => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delSysClause({id: val.id}) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getList() + }else{ + ElMessage.warning(res.message) + } + }) +} + +</script> -- Gitblit v1.9.2