对比新文件 |
| | |
| | | import request from '@/utils/request' |
| | | |
| | | |
| | | export function getTrainPlanPage(params) { |
| | | return request({ |
| | | url: '/course/plan/list', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | |
| | | export function addTrainPlan(data) { |
| | | return request({ |
| | | url: '/course/plan/insert', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | export function editTrainPlan(params) { |
| | | return request({ |
| | | url: `/course/plan/update`, |
| | | method: 'post', |
| | | data: params |
| | | }) |
| | | } |
| | | |
| | | export function delTrainPlan(data) { |
| | | return request({ |
| | | url: `/course/plan/deleted?trainPlanId=${data}`, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | |
| | |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="240"> |
| | | <template #default="scope"> |
| | | <div v-if="data.isAdmin"> |
| | | <div v-if="data.isAdmin || data.userType == 6"> |
| | | <div v-if="scope.row.state !== 3"> |
| | | <el-button link type="primary" v-if="scope.row.state == 1" @click="openApprove(scope.row)">审核</el-button> |
| | | <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> |
| | |
| | | id: 3, |
| | | name: '审批不通过' |
| | | }, |
| | | ] |
| | | ], |
| | | userType: null |
| | | }); |
| | | |
| | | const { queryParams, total, dataList } = toRefs(data); |
| | |
| | | } |
| | | const userInfo = JSON.parse(Cookies.get('userInfo')) |
| | | console.log("userInfo",userInfo) |
| | | data.userType = userInfo.userType |
| | | if(userInfo.userType === 0){ |
| | | data.isAdmin = true; |
| | | }else { |
| | |
| | | <div v-for="(item,index) in state.singleList" :key="index" style="margin-left: 15px;margin-top: 10px"> |
| | | <div style="display: flex;flex-direction: column;"> |
| | | <div style="margin-top: 10px;display: flex"> |
| | | <span style="font-size: 15px">题目{{index+1}}:</span> |
| | | <span style="margin-left: 10px;font-size: 16px">{{item.title}}</span> |
| | | <span style="font-size: 15px;width: 66px">题目{{index+1}}:</span> |
| | | <span style="font-size: 16px">{{item.title}}</span> |
| | | </div> |
| | | <div style="display: flex;margin-left: 10%;margin-top: 15px"> |
| | | <div v-for="single in item.content.items"> |
| | |
| | | <el-input v-model.trim="state.form.courseName" :disabled="disabled" placeholder="请输入课程名称" ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="培训等级:" prop="level" > |
| | | <el-input v-model.trim="state.form.level" :disabled="disabled" placeholder="请输入培训等级" ></el-input> |
| | | <el-select |
| | | v-model="state.form.level" |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="item in state.levelList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id" |
| | | /> |
| | | </el-select> |
| | | <!-- <el-input v-model.trim="state.form.level" :disabled="disabled" placeholder="请输入培训等级" ></el-input>--> |
| | | </el-form-item> |
| | | <el-form-item label="要求课时(分):" prop="period" > |
| | | <el-input v-model.trim="state.form.period" :disabled="disabled" placeholder="请输入要求课时(分)" ></el-input> |
| | |
| | | <el-radio :label="0">不合格</el-radio> |
| | | <el-radio :label="1">合格</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="培训记录:" prop="passed" > |
| | | <el-upload accept=".jpg,.jpeg,.png,.doc,.docx,.pdf,.xls,xlsx,ppt,pptx" style="width: 100%" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip" 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">尺寸小于5M,最多可上传1份</div>--> |
| | | <!-- </template>--> |
| | | </el-upload> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer v-if="state.title !='查看'"> |
| | |
| | | import {addStudent, checkStuIdNo, checkStuPhone, editStudent} from "@/api/onlineEducation/student"; |
| | | import {addRecord, editRecord} from "@/api/onlineEducation/examRecord"; |
| | | import {getCompany} from "@/api/onlineEducation/company"; |
| | | import {delPic} from "@/api/onlineEducation/banner"; |
| | | import {getToken} from "@/utils/auth"; |
| | | |
| | | const emit = defineEmits(["getList"]); |
| | | const dialogVisible = ref(false) |
| | |
| | | passed: 0, |
| | | studentName: '', |
| | | courseName: '', |
| | | companyId: null |
| | | companyId: null, |
| | | files: [] |
| | | |
| | | }, |
| | | formRules:{ |
| | |
| | | companyPageNum: 1, // 当前页码 |
| | | companyPageSize: 10, // 每页显示的数量 |
| | | hasMoreItems: null, // 是否还有更多选项 |
| | | levelList: [ |
| | | { |
| | | id: 1, |
| | | name: '公司级' |
| | | }, |
| | | { |
| | | id: 2, |
| | | name: '部门级' |
| | | }, |
| | | ], |
| | | uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', |
| | | header: { |
| | | Authorization: getToken() |
| | | }, |
| | | |
| | | }) |
| | | onMounted(() => { |
| | |
| | | if( type === 'view'){ |
| | | disabled.value = true; |
| | | } |
| | | state.form = value |
| | | |
| | | state.form = JSON.parse(JSON.stringify(value)) |
| | | state.form.studentId = value.student.id |
| | | state.form.studentName = value.student.name |
| | | state.fileList = value.files.map(i => { |
| | | return { |
| | | name: i.fileName, |
| | | path: i.filePath |
| | | } |
| | | }) |
| | | // state.form.studentName = value.company.name; |
| | | console.log("ba",state.form) |
| | | } |
| | |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }else if(state.title == '编辑'){ |
| | | const {id, name, phone, sex, companyId, empno, post, duty, idNo} = state.form |
| | | const data = {id, name, phone, sex, companyId, empno, post, duty, idNo} |
| | | const {...data} = state.form |
| | | const res = await editRecord(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | |
| | | state.stuPageNum = 1; |
| | | state.stuPageSize = 10; |
| | | state.studentList = []; |
| | | state.fileList = [] |
| | | superRef.value.clearValidate(); |
| | | superRef.value.resetFields() |
| | | dialogVisible.value = false; |
| | |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | const handleAvatarSuccess = (response,uploadFile) => { |
| | | if(response.code == 200){ |
| | | state.form.files = state.fileList.map(item => { |
| | | return { |
| | | fileName: item.response ? item.response?.data.originName: item.name, |
| | | filePath: item.response ? item.response?.data.path: item.path |
| | | } |
| | | }) |
| | | }else{ |
| | | // state.fileList = [] |
| | | // state.form.files = [] |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: res.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) => { |
| | | state.form.files = state.fileList.map(item => { |
| | | return { |
| | | fileName: item.response ? item.response?.data.originName: item.name, |
| | | filePath: item.response ? item.response?.data.path: item.path |
| | | } |
| | | }) |
| | | // let path = state.form.filePath; |
| | | // await delPic({path: path}).then(res => { |
| | | // if(res.code == 200){ |
| | | // // ElMessage({ |
| | | // // type: 'success', |
| | | // // message: '文件已删除' |
| | | // // }) |
| | | // state.form.fileName = '' |
| | | // state.form.filePath = '' |
| | | // }else{ |
| | | // ElMessage({ |
| | | // type: 'warning', |
| | | // message: res.message |
| | | // }) |
| | | // } |
| | | // }).catch(() => { |
| | | // state.form.fileName = '' |
| | | // state.form.filePath = '' |
| | | // }); |
| | | } |
| | | |
| | | |
| | | defineExpose({ |
| | |
| | | <el-table-column label="课程名称" prop="courseName" align="center"/> |
| | | <el-table-column label="培训等级" prop="level" align="center"> |
| | | <template #default="scope"> |
| | | <span>{{scope.row.sex == 1 ? '公司级':scope.row.sex == 2 ? '部门级' : '车间级'}}</span> |
| | | <span>{{scope.row.level == 1 ? '公司级':scope.row.level == 2 ? '部门级' : '车间级'}}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="要求课时(分)" prop="period" align="center"/> |
| | |
| | | <el-table-column label="是否合格" prop="passed" align="center"> |
| | | <template #default="scope"> |
| | | <span>{{scope.row.passed == 0 ? '不合格':'合格'}}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="培训记录" prop="passed" align="center" width="130"> |
| | | <template #default="scope"> |
| | | <div v-for="item in scope.row.files" style="display: flex;flex-direction: column"> |
| | | <el-link type="primary" @click="openFile(item.filePath)">{{item.fileName}}</el-link> |
| | | </div> |
| | | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120"> |
| | | <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> |
| | |
| | | import {delUser, getUser} from "@/api/onlineEducation/user"; |
| | | import Cookies from "js-cookie"; |
| | | import {delStudent, getStudent} from "@/api/onlineEducation/student"; |
| | | import {getRecord} from "@/api/onlineEducation/examRecord"; |
| | | import {delRecord, getRecord} from "@/api/onlineEducation/examRecord"; |
| | | import {renderAsync} from "docx-preview"; |
| | | |
| | | |
| | | const { proxy } = getCurrentInstance(); |
| | |
| | | const dialogRef = ref(); |
| | | const data = reactive({ |
| | | queryParams: { |
| | | companyId: null, |
| | | companyName: '', |
| | | courseName: '', |
| | | pageNum: 1, |
| | |
| | | console.log("userInfo",userInfo) |
| | | if(userInfo.userType === 0){ |
| | | data.isAdmin = true; |
| | | // data.queryParams.companyId = null |
| | | }else { |
| | | data.isAdmin = false; |
| | | // data.queryParams.companyId = userInfo.companyId |
| | | } |
| | | await getList() |
| | | }) |
| | |
| | | type: 'warning', |
| | | }) |
| | | .then( async() => { |
| | | const res = await delStudent(val.id) |
| | | const res = await delRecord(val.id) |
| | | if(res.code == 200){ |
| | | ElMessage.success('数据删除成功') |
| | | await getList() |
| | |
| | | } |
| | | }) |
| | | } |
| | | const openFile = async(path)=>{ |
| | | const ext = path.split('.').pop().toLowerCase(); |
| | | if (ext === 'doc' || ext === 'xls' || ext === 'xlsx') { |
| | | ElMessageBox.confirm(`暂不支持线上预览.${ext}文件,是否下载查看?`, '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' }).then(() => { |
| | | window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank'); |
| | | }).catch(() => { |
| | | console.log('取消预览') |
| | | }); |
| | | return |
| | | }else if(ext === 'pdf' || ext === 'jpg'|| ext === 'jpeg' || ext === 'png' ){ |
| | | window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank'); |
| | | }else{ |
| | | try { |
| | | // 1. 获取文件 |
| | | const response = await fetch(import.meta.env.VITE_APP_BASE_API + '/' + path); |
| | | const arrayBuffer = await response.arrayBuffer(); |
| | | // 2. 创建新窗口 |
| | | const win = window.open('', '_blank'); |
| | | win.document.write(` |
| | | <!DOCTYPE html> |
| | | <html> |
| | | <head> |
| | | <title>预览</title> |
| | | <style> |
| | | body { margin: 20px; font-family: Arial; } |
| | | .docx-container { width: 100%; height: 100%; } |
| | | </style> |
| | | </head> |
| | | <body> |
| | | <div id="container" class="docx-container"></div> |
| | | </body> |
| | | </html> |
| | | `); |
| | | // 3. 渲染 DOCX |
| | | await renderAsync(arrayBuffer, win.document.getElementById('container')); |
| | | |
| | | } catch (error) { |
| | | console.error('预览失败:', error); |
| | | alert(`预览失败: ${error.message}`); |
| | | } |
| | | } |
| | | } |
| | | |
| | | </script> |
对比新文件 |
| | |
| | | <template> |
| | | <div class="notice"> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="title" |
| | | width="600px" |
| | | :before-close="handleClose" |
| | | :close-on-press-escape="false" |
| | | :close-on-click-modal="false" |
| | | > |
| | | <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="130px" > |
| | | <el-form-item label="企业名称:" prop="companyId" v-if="state.isAdmin"> |
| | | <el-select |
| | | v-model="state.form.companyId" |
| | | filterable |
| | | clearable |
| | | style="width: 100%" |
| | | :disabled="title == '查看' || title == '编辑' || !state.isAdmin" |
| | | @change="selectValueCom" |
| | | > |
| | | <el-option |
| | | v-for="item in state.companyList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="时间:" prop="trainTime" > |
| | | <el-date-picker |
| | | v-model="state.form.trainTime" |
| | | type="date" |
| | | placeholder="请选择" |
| | | style="width: 100%" |
| | | value-format="YYYY-MM-DD" |
| | | :disabled="title == '查看'" |
| | | |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="课程名称:" prop="trainName" > |
| | | <el-input v-model="state.form.trainName" placeholder="课程名称" :disabled="title === '查看'"/> |
| | | </el-form-item> |
| | | <el-form-item label="组织部门:" prop="deptId" > |
| | | <el-select |
| | | v-model="state.form.deptId" |
| | | placeholder="请选择部门" |
| | | filterable |
| | | clearable |
| | | style="width: 100%" |
| | | :disabled="title == '查看'" |
| | | > |
| | | <el-option |
| | | v-for="item in state.deptList" |
| | | :key="item.deptId" |
| | | :label="item.deptName" |
| | | :value="item.deptId"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="参训对象:" prop="trainObject" > |
| | | <el-input v-model="state.form.trainObject" placeholder="参训对象" :disabled="title === '查看'"/> |
| | | </el-form-item> |
| | | <el-form-item label="人数:" prop="num" > |
| | | <el-input v-model="state.form.num" placeholder="人数" @input="state.form.num = state.form.num.replace(/[^0-9]/g,'')" :disabled="title === '查看'"/> |
| | | </el-form-item> |
| | | <el-form-item label="课时:" prop="hour" > |
| | | <el-input v-model="state.form.hour" |
| | | placeholder="课时" |
| | | @input="state.form.hour = state.form.hour |
| | | .replace(/[^0-9.]/g, '') |
| | | .replace(/(\..*)\./g, '$1') |
| | | .replace(/^(-?\d+\.?\d*).*/, '$1')" |
| | | :disabled="title === '查看'"/> |
| | | </el-form-item> |
| | | <el-form-item label="费用预算(元):" prop="money" > |
| | | <el-input v-model="state.form.money" |
| | | placeholder="费用预算(元)" |
| | | @input="state.form.money = state.form.money |
| | | .replace(/[^0-9.]/g, '') |
| | | .replace(/(\..*)\./g, '$1') |
| | | .replace(/^(-?\d+\.?\d*).*/, '$1')" |
| | | :disabled="title === '查看'"/> |
| | | </el-form-item> |
| | | <el-form-item label="培训形式:" prop="modality" > |
| | | <el-input v-model="state.form.modality" placeholder="培训形式" :disabled="title === '查看'"/> |
| | | </el-form-item> |
| | | <el-form-item label="是否已完成:" prop="status" > |
| | | <el-radio-group v-model="state.form.status"> |
| | | <el-radio :label="0">是</el-radio> |
| | | <el-radio :label="1">否</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer v-if="title !== '查看'"> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="handleClose" size="default">取 消</el-button> |
| | | <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | <script setup> |
| | | import {onMounted, reactive, ref, toRefs} from 'vue' |
| | | import Editor from "@/components/Editor/index.vue"; |
| | | import {ElMessage} from "element-plus"; |
| | | import {addNotice} from "@/api/backManage/notice"; |
| | | import {addDict, editDict, getDictDetail} from "@/api/backManage/evaluate"; |
| | | import {addCompany, checkName, distributeCompany, editCompany, getCompany} from "@/api/onlineEducation/company"; |
| | | import {verifyPhone} from "@/utils/validate"; |
| | | import {addBasic, editBasic} from "@/api/companyInfo/basicInfo"; |
| | | import Cookies from "js-cookie"; |
| | | import {getUser} from "@/api/onlineEducation/user"; |
| | | import {addScenario, editScenario} from "@/api/selfProblems/scenario"; |
| | | import {addTrainPlan, editTrainPlan} from "@/api/onlineEducation/trainPlan"; |
| | | import {getDept} from "@/api/qualityObjectives/object"; |
| | | |
| | | const dialogVisible = ref(false); |
| | | const title = ref(""); |
| | | const busRef = ref(); |
| | | const length = ref() |
| | | const emit = defineEmits(["getList"]); |
| | | const state = reactive({ |
| | | form: { |
| | | id: '', |
| | | companyId: null, |
| | | trainName: "", |
| | | trainTime: "", |
| | | deptId: null, |
| | | trainObject: "", |
| | | num: "", |
| | | hour: "", |
| | | money: "", |
| | | modality: "", |
| | | status: 3, |
| | | }, |
| | | formRules:{ |
| | | companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], |
| | | trainName: [{ required: true, message: '请输入课程名称', trigger: 'blur' }], |
| | | trainTime:[{ required: true, message: '请选择日期', trigger: 'blur' }], |
| | | }, |
| | | isAdmin: false, |
| | | companyList: [], |
| | | deptList: [], |
| | | }) |
| | | |
| | | onMounted(() => { |
| | | |
| | | }) |
| | | const openDialog = async (type, value,companyList) => { |
| | | |
| | | const userInfo = JSON.parse(Cookies.get('userInfo')) |
| | | state.isAdmin = userInfo.userType === 0; |
| | | state.form.companyName = userInfo.companyName |
| | | state.form.companyId = userInfo.companyId |
| | | if(state.isAdmin){ |
| | | state.companyList = companyList |
| | | state.form.companyId = value.companyId |
| | | state.form.companyName = value.companyName |
| | | } |
| | | title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ; |
| | | if(type === 'edit' || type === 'review') { |
| | | state.form = JSON.parse(JSON.stringify(value)); |
| | | if(state.isAdmin){ |
| | | state.form.companyId = value.companyId |
| | | state.form.companyName = value.companyName |
| | | } |
| | | } |
| | | await getDeptList() |
| | | dialogVisible.value = true; |
| | | } |
| | | |
| | | const getDeptList = async () =>{ |
| | | if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){ |
| | | return |
| | | } |
| | | const param = { |
| | | pageNum: 1, |
| | | pageSize: 999, |
| | | companyId: state.form.companyId |
| | | } |
| | | const res = await getDept(param) |
| | | if(res.code === 200){ |
| | | state.deptList = res.data |
| | | } |
| | | } |
| | | const onSubmit = async () => { |
| | | const valid = await busRef.value.validate(); |
| | | if(!state.isAdmin){ |
| | | const userInfo = JSON.parse(Cookies.get('userInfo')) |
| | | state.form.companyId = userInfo.companyId |
| | | } |
| | | if(valid){ |
| | | if(title.value === '新增'){ |
| | | const {id, ...data} = JSON.parse(JSON.stringify(state.form)) |
| | | const res = await addTrainPlan(data) |
| | | if(res.code === 200){ |
| | | ElMessage({ |
| | | type: 'success', |
| | | message: '新增成功' |
| | | }); |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | emit("getList") |
| | | busRef.value.clearValidate(); |
| | | reset(); |
| | | dialogVisible.value = false; |
| | | }else if(title.value === '编辑'){ |
| | | const {...data} = JSON.parse(JSON.stringify(state.form)) |
| | | const res = await editTrainPlan(data) |
| | | if(res.code === 200){ |
| | | ElMessage({ |
| | | type: 'success', |
| | | message: '编辑成功' |
| | | }); |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | emit("getList") |
| | | busRef.value.clearValidate(); |
| | | reset(); |
| | | dialogVisible.value = false; |
| | | } |
| | | } |
| | | } |
| | | |
| | | const handleClose = () => { |
| | | busRef.value.clearValidate(); |
| | | reset(); |
| | | dialogVisible.value = false; |
| | | emit("getList") |
| | | |
| | | } |
| | | const selectValueCom = (val) => { |
| | | state.form.deptId = null |
| | | getDeptList() |
| | | } |
| | | const reset = () => { |
| | | state.form = { |
| | | id: '', |
| | | companyId: null, |
| | | trainName: "", |
| | | trainTime: "", |
| | | deptId: null, |
| | | trainObject: "", |
| | | num: "", |
| | | hour: "", |
| | | money: "", |
| | | modality: "", |
| | | status: 3, |
| | | } |
| | | state.companyList = [] |
| | | state.deptList = [] |
| | | } |
| | | 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="margin-bottom: 10px"> |
| | | <el-form style="display: flex;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="企业名称:" v-if="data.isAdmin" style="margin-left: 20px"> |
| | | <el-select v-model="data.queryParams.companyId" filterable placeholder="请选择" clearable> |
| | | <el-option |
| | | v-for="item in data.companyList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item v-if="data.isAdmin"> |
| | | <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button> |
| | | <el-button plain @click="reset">重置</el-button> |
| | | </el-form-item> |
| | | <el-form-item style="margin-left: 15px"> |
| | | <vue3-json-excel |
| | | :json-data="dataList" |
| | | :fields="data.isAdmin ? fieldsAdmin : fields" |
| | | name="培训计划表.xlsx" |
| | | > |
| | | <el-button type="primary">导出</el-button> |
| | | </vue3-json-excel> |
| | | <!-- <el-button--> |
| | | <!-- type="primary"--> |
| | | <!-- @click="exportData"--> |
| | | <!-- >导出</el-button>--> |
| | | </el-form-item> |
| | | |
| | | </el-form> |
| | | </div> |
| | | <!-- 表格数据 --> |
| | | <el-table v-loading="loading" :data="dataList" :border="true" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="index" label="序号" width="80" align="center"></el-table-column> |
| | | <el-table-column label="企业名称" v-if="data.isAdmin" prop="companyName" align="center" /> |
| | | <el-table-column label="时间" prop="trainTime" align="center" /> |
| | | <el-table-column label="课程名称" prop="trainName" align="center" /> |
| | | <el-table-column label="组织部门" prop="deptName" align="center" /> |
| | | <el-table-column label="参训对象" prop="trainObject" align="center" /> |
| | | <el-table-column label="人数" prop="num" align="center" /> |
| | | <el-table-column label="课时" prop="hour" align="center" /> |
| | | <el-table-column label="费用预算(元)" prop="money" align="center" /> |
| | | <el-table-column label="培训形式" prop="modality" align="center" /> |
| | | <el-table-column label="是否已完成" prop="status" align="center"> |
| | | <template #default="scope"> |
| | | <span>{{scope.row.status == 0 ? '是' :scope.row.status == 1 ?'否': ''}}</span> |
| | | </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> |
| | | |
| | | <div class="pag-container"> |
| | | <el-pagination |
| | | v-model:current-page="data.queryParams.pageNum" |
| | | v-model:page-size="data.queryParams.pageSize" |
| | | :page-sizes="[10,15,20,25]" |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :total="total" |
| | | @size-change="handleSizeChange" |
| | | @current-change="handleCurrentChange" |
| | | /> |
| | | </div> |
| | | <trainDialog ref="noticeRef" @getList = "getList"></trainDialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue"; |
| | | import trainDialog from "./components/trainDialog.vue" |
| | | import {ElMessage, ElMessageBox} from "element-plus"; |
| | | import {getCompany} from "@/api/onlineEducation/company"; |
| | | import Cookies from "js-cookie"; |
| | | import {generateWordDocument} from "@/utils/exportWord"; |
| | | import {delBasic, getBasic} from "@/api/companyInfo/basicInfo"; |
| | | import {delScenario, getScenarioPage} from "@/api/selfProblems/scenario"; |
| | | import {delTrainPlan, getTrainPlanPage} from "@/api/onlineEducation/trainPlan"; |
| | | |
| | | const { proxy } = getCurrentInstance(); |
| | | const loading = ref(false); |
| | | const noticeRef = ref(); |
| | | const loadingCompany = ref(false) |
| | | const choosedData = ref([]) |
| | | const data = reactive({ |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | companyId: null, |
| | | }, |
| | | companyList: [], |
| | | isAdmin: false, |
| | | expertData: [] |
| | | }); |
| | | const dataList = ref([]); |
| | | const total = ref(0); |
| | | |
| | | const { queryParams } = toRefs(data); |
| | | const fieldsAdmin = ref({ |
| | | '企业名称': 'companyName', |
| | | '时间':'trainTime', |
| | | '课程名称':'trainName', |
| | | '组织部门':'deptName', |
| | | '参训对象':'trainObject', |
| | | '人数':'num', |
| | | '课时':'hour', |
| | | '费用预算(元)':'money', |
| | | '培训形式':'modality', |
| | | '是否已完成':'statusName', |
| | | }); |
| | | const fields = ref({ |
| | | '时间':'trainTime', |
| | | '课程名称':'trainName', |
| | | '组织部门':'deptName', |
| | | '参训对象':'trainObject', |
| | | '人数':'num', |
| | | '课时':'hour', |
| | | '费用预算(元)':'money', |
| | | '培训形式':'modality', |
| | | '是否已完成':'statusName', |
| | | }); |
| | | onMounted(() => { |
| | | const userInfo = JSON.parse(Cookies.get('userInfo')) |
| | | console.log("userInfo",userInfo) |
| | | data.isAdmin = userInfo.userType === 0; |
| | | if(data.isAdmin){ |
| | | data.queryParams.companyId = null |
| | | getCompanyList() |
| | | }else { |
| | | data.queryParams.companyId = userInfo.companyId |
| | | } |
| | | getList(); |
| | | }); |
| | | const getList = async () => { |
| | | loading.value = true; |
| | | const res = await getTrainPlanPage(data.queryParams); |
| | | if(res.code === 200){ |
| | | dataList.value = res.data.list.map(item => { |
| | | return { |
| | | ...item, |
| | | trainTime: item.trainTime.substring(0,10), |
| | | statusName: item.status == 0 ? '是' : item.status == 1 ? '否' : '' |
| | | } |
| | | }) |
| | | total.value = res.data.total |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | loading.value = false; |
| | | |
| | | } |
| | | |
| | | const searchClick = () => { |
| | | getList(); |
| | | } |
| | | const openDialog = (type, value) => { |
| | | noticeRef.value.openDialog(type, value,data.companyList); |
| | | } |
| | | |
| | | const getCompanyList = async ()=>{ |
| | | const queryParams = { |
| | | pageNum: 1, |
| | | pageSize: 999 |
| | | } |
| | | const res = await getCompany(queryParams) |
| | | if (res.code == 200) { |
| | | data.companyList = res.data.list?res.data.list:[] |
| | | } else { |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const handleSizeChange = (val) => { |
| | | data.queryParams.pageSize = val |
| | | getList() |
| | | } |
| | | const handleCurrentChange = (val) => { |
| | | data.queryParams.pageNum = val |
| | | getList() |
| | | } |
| | | |
| | | /** 重置新增的表单以及其他数据 */ |
| | | function reset() { |
| | | data.queryParams = { |
| | | companyId: '', |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | } |
| | | choosedData.value = [] |
| | | data.companyList = []; |
| | | getList(); |
| | | getCompanyList() |
| | | } |
| | | const exportData = () => { |
| | | if(choosedData.value && choosedData.value.length === 0){ |
| | | ElMessage.warning('请选择需要导出的数据') |
| | | }else { |
| | | startGeneration() |
| | | } |
| | | } |
| | | const templatePath = '/scenarioExample.docx' |
| | | const startGeneration = async () => { |
| | | choosedData.value.forEach(item => { |
| | | try { |
| | | item.title = item.year+'年度内部审核策划方案' |
| | | generateWordDocument(templatePath, item, item.companyName+ '_' + item.title +'.docx'); |
| | | } catch (error){ |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: '导出失败' |
| | | }); |
| | | } |
| | | }) |
| | | } |
| | | |
| | | const handleSelectionChange = (val) => { |
| | | choosedData.value = val |
| | | } |
| | | const handleDelete = (val) => { |
| | | ElMessageBox.confirm( |
| | | '确定删除此条数据?', |
| | | '提示', |
| | | { |
| | | confirmButtonText: '确定', |
| | | cancelButtonText: '取消', |
| | | type: 'warning', |
| | | }) |
| | | .then( async() => { |
| | | const res = await delTrainPlan(val.id); |
| | | if(res.code === 200){ |
| | | ElMessage({ |
| | | type: 'success', |
| | | message: '删除成功' |
| | | }); |
| | | getList(); |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | </script> |
| | | <style lang="scss"> |
| | | .pag-container{ |
| | | float: right; |
| | | margin-top: 10px; |
| | | } |
| | | </style> |
| | |
| | | <el-input v-model="state.form.user" :disabled="title === '查看'"/> |
| | | </el-form-item> |
| | | <el-form-item label="联系电话:" prop="phone" > |
| | | <el-input v-model="state.form.phone" :disabled="title === '查看'"/> |
| | | <el-input v-model="state.form.phone" @input="state.form.phone= state.form.phone.replace(/[^0-9-]/g,'')" :disabled="title === '查看'"/> |
| | | </el-form-item> |
| | | <el-form-item label="备注:" prop="remark" > |
| | | <el-input v-model="state.form.remark" :disabled="title === '查看'"/> |
| | |
| | | const busRef = ref(); |
| | | const length = ref() |
| | | const emit = defineEmits(["getList"]); |
| | | const validatePhone = (rule, value, callback)=>{ |
| | | if(value === ''){ |
| | | callback(new Error('请输入手机号')) |
| | | }else{ |
| | | if(!verifyPhone(value)){ |
| | | callback(new Error('手机号格式有误')) |
| | | }else{ |
| | | callback() |
| | | } |
| | | } |
| | | } |
| | | // const validatePhone = (rule, value, callback)=>{ |
| | | // if(value === ''){ |
| | | // callback(new Error('请输入手机号')) |
| | | // }else{ |
| | | // if(!verifyPhone(value)){ |
| | | // callback(new Error('手机号格式有误')) |
| | | // }else{ |
| | | // callback() |
| | | // } |
| | | // } |
| | | // } |
| | | |
| | | const state = reactive({ |
| | | form: { |
| | |
| | | supplierName: [{ required: true, message: '请输入供应商名称', trigger: 'blur' }], |
| | | supplierAddr:[{ required: true, message: '请输入地址', trigger: 'blur' }], |
| | | user: [{ required: true, message: '请输入联系人', trigger: 'blur' }], |
| | | phone: [{ required: true, validator: validatePhone, trigger: 'blur' }], |
| | | phone: [{ required: true, message: '请输入联系电话', trigger: 'blur' }], |
| | | merito: [{ required: true, message: '请输入主营产品', trigger: 'blur' }], |
| | | }, |
| | | isAdmin: false, |
| | |
| | | <el-form style="display: flex;flex-wrap: wrap;"> |
| | | <el-form-item> |
| | | <el-button |
| | | v-if="data.userType ==0 || data.userType == 1" |
| | | v-if="data.userType ==0 || data.userType == 6" |
| | | type="primary" |
| | | plain |
| | | icon="Plus" |