已重命名1个文件
已修改2个文件
已添加17个文件
已删除1个文件
对比新文件 |
| | |
| | | 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 |
| | | }) |
| | | } |
对比新文件 |
| | |
| | | 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 |
| | | }) |
| | | } |
| | |
| | | token: getToken(), |
| | | id: '', |
| | | name: '', |
| | | companyId: null, |
| | | avatar: '', |
| | | roles: [], |
| | | permissions: [] |
| | |
| | | } |
| | | this.id = user.userId |
| | | this.name = user.userName |
| | | this.companyId = user.companyId |
| | | this.avatar = avatar |
| | | Cookies.set('userInfo',JSON.stringify(user)) |
| | | resolve(res) |
对比新文件 |
| | |
| | | <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> |
对比新文件 |
| | |
| | | <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> |
对比新文件 |
| | |
| | | <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> |
对比新文件 |
| | |
| | | <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> |
对比新文件 |
| | |
| | | <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> |
对比新文件 |
| | |
| | | <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> |
对比新文件 |
| | |
| | | //引入工具 |
| | | 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 |
| | | } |
| | | }); |
| | | |
| | | } |
对比新文件 |
| | |
| | | <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> |
对比新文件 |
| | |
| | | <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> |
对比新文件 |
| | |
| | | <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> |
对比新文件 |
| | |
| | | <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> |
文件名从 src/views/build/conpanyFunctionConsult/peopleManage/user/components/userDialog.vue 修改 |
| | |
| | | <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> |
| | |
| | | |
| | | |
| | | </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 =='编辑'" |
| | |
| | | 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) |
| | |
| | | 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, |
| | |
| | | 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){ |
| | |
| | | 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){ |
| | |
| | | // 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){ |
| | |
| | | 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) |
| | |
| | | state.form.companyId = item.id |
| | | } |
| | | }) |
| | | getdeptList(state.form.companyId) |
| | | } |
| | | const getSelectUser = (val) => { |
| | | console.log("valllllllll",val) |
对比新文件 |
| | |
| | | <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> |
| | |
| | | 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), |
| | |
| | | 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); |
对比新文件 |
| | |
| | | <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> |
对比新文件 |
| | |
| | | <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> |