From 71a112b7d78698b7e4df94e6255bf302bf415b35 Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: 星期一, 20 十月 2025 16:28:53 +0800
Subject: [PATCH] 修改
---
src/views/work/selfProblems/internalAudit/auditorManage/tableList/components/editDialog.vue | 16
src/views/work/onlineEducation/courseEvaluate/index.vue | 255 ++++++++++++++
src/api/courseEvaluate/index.js | 32 +
src/views/work/selfProblems/internalAudit/auditorManage/tableList/index.vue | 4
src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/components/dataDialog.vue | 2
public/courseEvaluteExample.docx | 0
src/api/onlineEducation/trainPlan.js | 8
src/views/certificatePdf.vue | 2
src/views/work/onlineEducation/courseEvaluate/components/editDialog.vue | 704 +++++++++++++++++++++++++++++++++++++++
9 files changed, 1,012 insertions(+), 11 deletions(-)
diff --git a/public/courseEvaluteExample.docx b/public/courseEvaluteExample.docx
new file mode 100644
index 0000000..770d76e
--- /dev/null
+++ b/public/courseEvaluteExample.docx
Binary files differ
diff --git a/src/api/courseEvaluate/index.js b/src/api/courseEvaluate/index.js
new file mode 100644
index 0000000..92677cd
--- /dev/null
+++ b/src/api/courseEvaluate/index.js
@@ -0,0 +1,32 @@
+import request from "@/utils/request";
+
+export function getCourseEvaluate(params) {
+ return request({
+ url: '/effectiven/list',
+ method: 'get',
+ params: params
+ })
+}
+
+export function addCourseEvaluate(data) {
+ return request({
+ url: '/effectiven/insert',
+ method: 'post',
+ data: data
+ })
+}
+
+export function editCourseEvaluate(params) {
+ return request({
+ url: `/effectiven/update`,
+ method: 'post',
+ data: params
+ })
+}
+
+export function delCourseEvaluate(data) {
+ return request({
+ url: `/effectiven/deleted?effectivenId=${data}`,
+ method: 'get'
+ })
+}
diff --git a/src/api/onlineEducation/trainPlan.js b/src/api/onlineEducation/trainPlan.js
index eccafd5..eb3ff9a 100644
--- a/src/api/onlineEducation/trainPlan.js
+++ b/src/api/onlineEducation/trainPlan.js
@@ -9,6 +9,14 @@
})
}
+export function getTrainPlanAll(params) {
+ return request({
+ url: '/course/plan/listByStatue',
+ method: 'get',
+ params: params
+ })
+}
+
export function addTrainPlan(data) {
return request({
diff --git a/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/components/dataDialog.vue b/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/components/dataDialog.vue
index b3cdfab..e583e95 100644
--- a/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/components/dataDialog.vue
+++ b/src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/components/dataDialog.vue
@@ -5,6 +5,8 @@
:title="state.title"
width="600px"
:before-close="handleClose"
+ :modal="false"
+ draggable
:close-on-press-escape="false"
:close-on-click-modal="false"
>
diff --git a/src/views/certificatePdf.vue b/src/views/certificatePdf.vue
index 90b1df7..370fa2c 100644
--- a/src/views/certificatePdf.vue
+++ b/src/views/certificatePdf.vue
@@ -32,7 +32,7 @@
if(route.query.type == 'inter'){
data.info.name = route.query.paperName
data.info.stuName = route.query.personName
- data.info.number = route.query.certifity
+ data.info.number = route.query.number
data.info.companyName = route.query.companyName
}else {
data.info = route.query
diff --git a/src/views/work/onlineEducation/courseEvaluate/components/editDialog.vue b/src/views/work/onlineEducation/courseEvaluate/components/editDialog.vue
new file mode 100644
index 0000000..904b4d1
--- /dev/null
+++ b/src/views/work/onlineEducation/courseEvaluate/components/editDialog.vue
@@ -0,0 +1,704 @@
+<template>
+ <div class="notice">
+ <el-dialog
+ v-model="dialogVisible"
+ :title="title"
+ width="900px"
+ :before-close="handleClose"
+ :close-on-press-escape="false"
+ :close-on-click-modal="false"
+ >
+ <el-form :model="state.form" size="default" ref="busRef" :rules="state.rules" label-position="right" label-width="110" >
+ <el-row :gutter="24">
+ <el-col :span="24">
+ <el-form-item label="企业名称:" prop="companyId" v-if="state.isAdmin">
+ <el-select v-model="state.form.companyId" placeholder="请选择" 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-col>
+ </el-row>
+ <el-row :gutter="24">
+ <el-col :span="24">
+ <el-form-item label="课程:" prop="planId" >
+ <el-select v-model="state.form.planId" placeholder="请选择" filterable clearable style="width: 100%" :disabled="title == '查看'">
+ <el-option
+ v-for="item in state.planList"
+ :key="item.id"
+ :label="item.trainName"
+ :value="item.id">
+ </el-option>
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="24">
+ <el-col :span="12">
+ <el-form-item label="讲师:" prop="teacherId" >
+ <el-select
+ clearable
+ v-model="state.form.teacherId"
+ :disabled="title =='查看'"
+ filterable
+ style="width: 100%"
+ >
+ <el-option
+ v-for="item in state.peopleList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="开课日期:" prop="openTime" >
+ <el-date-picker
+ :disabled="title === '查看'"
+ v-model="state.form.openTime"
+ type="date"
+ placeholder="请选择"
+ value-format="YYYY-MM-DD"
+ style="width: 100%"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="24">
+ <el-col :span="12">
+ <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-col>
+ <el-col :span="12">
+ <el-form-item label="员工:" prop="staffs" >
+ <el-select
+ clearable
+ multiple
+ collapse-tags
+ collapse-tags-tooltip
+ v-model="state.staffs"
+ :disabled="title == '查看'"
+ filterable
+ style="width: 100%"
+ >
+ <el-option
+ v-for="item in state.peopleList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="24">
+ <el-col :span="24">
+ <el-form-item label="评价表:">
+ <!--个人素养-->
+ <el-table
+ :data="state.tableData"
+ border
+ :span-method="objectSpanMethod"
+ style="width: 100%; margin-bottom: 15px;"
+ >
+
+ <el-table-column align="center">
+ <template #header>
+ <div>1、讲师的个人素养</div>
+ </template>
+ <el-table-column align="center" prop="item" min-width="150">
+ <template #header>
+ <div></div>
+ </template>
+ </el-table-column>
+ </el-table-column>
+ <el-table-column
+ align="center"
+ v-for="(col, idx) in scoreCols"
+ :key="idx"
+ >
+ <template #header>
+ <div>{{ col.label }}</div>
+ </template>
+ <el-table-column
+ align="center"
+ :prop="col.prop"
+ min-width="100"
+ >
+ <template #header>
+ <div>{{ col.score }}分</div>
+ </template>
+ <template #default="scope">
+ <el-checkbox
+
+ v-if="!scope.row.isTotal"
+ :disabled="isView"
+ v-model="scope.row[col.prop]"
+ @change="handleRadio(scope.row, col.prop,'1')"
+ />
+ <span v-if="scope.row.isTotal" style="font-size: 16px">
+ {{ scope.row.total }}分
+ </span>
+ </template>
+ </el-table-column>
+ </el-table-column>
+ </el-table>
+ <!--准备工作-->
+ <el-table
+ :data="state.tableDataWork"
+ border
+ :span-method="objectSpanMethod"
+ style="width: 100%; margin-bottom: 15px;"
+ >
+
+ <el-table-column align="center">
+ <template #header>
+ <div>2、授课前准备工作</div>
+ </template>
+ <el-table-column align="center" prop="item" min-width="150">
+ <template #header>
+ <div></div>
+ </template>
+ </el-table-column>
+ </el-table-column>
+ <el-table-column
+ align="center"
+ v-for="(col, idx) in scoreCols"
+ :key="idx"
+ >
+ <template #header>
+ <div>{{ col.label }}</div>
+ </template>
+ <el-table-column
+ align="center"
+ :prop="col.prop"
+ min-width="100"
+ >
+ <template #header>
+ <div>{{ col.score }}分</div>
+ </template>
+ <template #default="scope">
+ <el-checkbox
+
+ v-if="!scope.row.isTotal"
+ :disabled="isViewWork"
+ v-model="scope.row[col.prop]"
+ @change="handleRadio(scope.row, col.prop,'2')"
+ />
+ <span v-if="scope.row.isTotal" style="font-size: 16px">
+ {{ scope.row.total }}分
+ </span>
+ </template>
+ </el-table-column>
+ </el-table-column>
+ </el-table>
+ <!--课程内容-->
+ <el-table
+ :data="state.tableDataContent"
+ border
+ :span-method="objectSpanMethod"
+ style="width: 100%; margin-bottom: 15px;"
+ >
+
+ <el-table-column align="center">
+ <template #header>
+ <div>3、授课前准备工作</div>
+ </template>
+ <el-table-column align="center" prop="item" min-width="150">
+ <template #header>
+ <div></div>
+ </template>
+ </el-table-column>
+ </el-table-column>
+ <el-table-column
+ align="center"
+ v-for="(col, idx) in scoreCols"
+ :key="idx"
+ >
+ <template #header>
+ <div>{{ col.label }}</div>
+ </template>
+ <el-table-column
+ align="center"
+ :prop="col.prop"
+ min-width="100"
+ >
+ <template #header>
+ <div>{{ col.score }}分</div>
+ </template>
+ <template #default="scope">
+ <el-checkbox
+
+ v-if="!scope.row.isTotal"
+ :disabled="isViewContent"
+ v-model="scope.row[col.prop]"
+ @change="handleRadio(scope.row, col.prop,'3')"
+ />
+ <span v-if="scope.row.isTotal" style="font-size: 16px">
+ {{ scope.row.total }}分
+ </span>
+ </template>
+ </el-table-column>
+ </el-table-column>
+ </el-table>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="24">
+ <el-col :span="24">
+ <el-form-item label="您的建议:">
+ <el-input style="margin-top: 5px" :disabled="title === '查看'" v-model="state.form.suggest" type="textarea" :rows="4"></el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="24">
+ <el-col :span="24">
+ <el-form-item label="关于讲师:">
+ <el-input style="margin-top: 5px" :disabled="title === '查看'" v-model="state.form.aboutTeacher" type="textarea" :rows="4"></el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="24">
+ <el-col :span="24">
+ <el-form-item label="关于内容:">
+ <el-input style="margin-top: 5px" :disabled="title === '查看'" v-model="state.form.aboutContent" type="textarea" :rows="4"></el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="24">
+ <el-col :span="24">
+ <el-form-item label="关于授课形式:">
+ <el-input style="margin-top: 5px" :disabled="title === '查看'" v-model="state.form.teachForm" type="textarea" :rows="4"></el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="24">
+ <el-col :span="24">
+ <el-form-item label="其他:">
+ <el-input style="margin-top: 5px" :disabled="title === '查看'" v-model="state.form.other" type="textarea" :rows="4"></el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </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 Cookies from "js-cookie";
+import {getCompany} from "@/api/onlineEducation/company";
+import {ElMessage} from "element-plus";
+import {getUser} from "@/api/onlineEducation/user";
+import {getDept, getObject, getObjectPage} from "@/api/qualityObjectives/object";
+import {addTable, editTable, getTargetById} from "@/api/qualityObjectives/table";
+import {addNeedDiscren, editNeedDiscren} from "@/api/need/need";
+import {verifyPhone} from "@/utils/validate";
+import {developList} from "@/views/work/qualityInfo/supplierQuality/supplierList/components/qualityDatas";
+import {addDelivery, editDelivery} from "@/api/satisfiedNew/satisfiedNew";
+import {getCustomer, getCustomerAll} from "@/api/customerList";
+import {getTrainPlanAll, getTrainPlanPage} from "@/api/onlineEducation/trainPlan";
+import {getStudent} from "@/api/onlineEducation/student";
+import {addCourseEvaluate, editCourseEvaluate} from "@/api/courseEvaluate";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const selectPopperClass = "max-width-select";
+const emit = defineEmits(["getList"]);
+const dataRef = ref();
+const state = reactive({
+ form: {
+ id: '',
+ companyId: null,
+ planId: null,
+ teacherId: null,
+ deptId: null,
+ openTime: "",
+ staffs: '',
+ personalQuality: "",
+ preparatory: "",
+ courseContent: "",
+ suggest: "",
+ aboutTeacher: "",
+ aboutContent: "",
+ teachForm: "",
+ other: ""
+ },
+ rules: {
+ companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+ planId: [{ required: true, message: '请选择计划', trigger: 'blur' }],
+ teacherId: [{ required: true, message: '请选择讲师', trigger: 'blur' }],
+ deptId: [{ required: true, message: '请选择部门', trigger: 'blur' }],
+ openTime: [{ required: true, message: '请选择开课日期', trigger: 'blur' }],
+ staffs: [{ required: true, message: '请选择员工', trigger: 'blur' }],
+ },
+ staffs:[],
+ isAdmin: false,
+ companyList: [],
+ planList: [],
+ deptList: [],
+ peopleList:[],
+ supplierList: [],
+ tableData: [
+ { item: '1)礼貌礼仪/精神面貌', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '2)表达能力(语速/吐字清晰度等)', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '3)耐心程度', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '4)专业知识', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '5)幽默感', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '个人素养综合得分', isTotal: true, total: 0 }, // 综合得分行,标记isTotal以便合并
+ ],
+ tableDataWork:[
+ { item: '1)是否准时开课/结课', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '2)是否按计划授课', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '3)授课的资料、辅助工具等的准备工作', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '4)课程时间安排的合理程度', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '5)授课过程中的活动安排合理性', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '授课前准备工作得分', isTotal: true, total: 0 }, // 综合得分行,标记isTotal以便合并
+ ],
+ tableDataContent:[
+ { item: '1)课件内容正确性', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '2)授课内容能否结合实际工作', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '3)课程内容是否做到条理清晰,重点突出,描述准确', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '4)在讲授过程中能引进更多的知识和信息', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '5)有案例分析,能有效鼓励新员工参与和互动', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '6)对于学员提出问题回答的准确程度', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '课程内容得分', isTotal: true, total: 0 }, // 综合得分行,标记isTotal以便合并
+ ]
+})
+// 控制是否为“查看”模式(禁用单选框)
+const isView = ref(false);
+const isViewWork = ref(false);
+const isViewContent = ref(false);
+// 评分列配置:标签、绑定属性、分值
+const scoreCols = reactive([
+ { label: '非常好', prop: 'well', score: 5 },
+ { label: '比较好', prop: 'good', score: 4 },
+ { label: '一般', prop: 'fine', score: 3 },
+ { label: '较不好', prop: 'notGood', score: 2 },
+ { label: '不好', prop: 'bad', score: 1 },
+]);
+
+const handleRadio = (row, currentProp,type) => {
+ if(type == '1'){
+ if (isView.value) return;
+ for (const col of scoreCols) {
+ if (col.prop !== currentProp) {
+ row[col.prop] = false;
+ }
+ }
+ calculateTotalScore('1');
+ }else if(type == '2') {
+ if (isViewWork.value) return;
+ for (const col of scoreCols) {
+ if (col.prop !== currentProp) {
+ row[col.prop] = false;
+ }
+ }
+ calculateTotalScore('2');
+ }else if(type=='3'){
+ if (isViewContent.value) return;
+ for (const col of scoreCols) {
+ if (col.prop !== currentProp) {
+ row[col.prop] = false;
+ }
+ }
+ calculateTotalScore('3');
+ }
+};
+// 计算总分
+const calculateTotalScore = (type) => {
+ let data = []
+ if(type == '1'){
+ data = state.tableData
+ }else if(type == '2'){
+ data = state.tableDataWork
+ }else if(type == '3'){
+ data = state.tableDataContent
+ }
+ let total = 0;
+ let answeredCount = 0;
+ // 遍历所有评分项(除了总分行)
+ for (let i = 0; i < data.length - 1; i++) {
+ const row = data[i];
+ for (const col of scoreCols) {
+ if (row[col.prop]) {
+ total += col.score;
+ answeredCount++;
+ break;
+ }
+ }
+ }
+ data[data.length - 1].total = answeredCount > 0 ? total : 0;
+};
+
+const objectSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
+ if (row.isTotal) {
+ if (columnIndex === 0) {
+ return {
+ rowspan: 1,
+ colspan: 1,
+ };
+ }
+
+ // 第二列开始合并所有评分列
+ if (columnIndex === 1) {
+ return {
+ rowspan: 1,
+ colspan: scoreCols.length, // 动态合并所有评分列
+ style: { textAlign: 'center', fontWeight: 'bold' },
+ };
+ }
+
+ // 合并列之外的其他列不显示内容
+ if (columnIndex > 1) {
+ return {
+ rowspan: 0,
+ colspan: 0,
+ };
+ }
+ }
+
+ return { rowspan: 1, colspan: 1 };
+};
+
+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.form.companyId = value.companyId
+ state.form.companyName = value.companyName
+ state.companyList = companyList
+ }
+ 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
+ }
+ //解析json
+ state.tableData = value.personalQuality ? JSON.parse(value.personalQuality) :[]
+ state.tableDataWork = value.preparatory?JSON.parse(value.preparatory):[]
+ state.tableDataContent = value.courseContent ?JSON.parse(value.courseContent):[]
+ state.staffs = value.staffs.split(',').map(Number)
+ }
+ await getPlanList()
+ await getPeopleList()
+ 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 getPeopleList = async ()=> {
+ if(state.isAdmin && !state.form.companyId && (state.form.companyId == 0 || state.form.companyId == null)){
+ return
+ }
+ const queryParams = {
+ pageNum: 1,
+ pageSize: 9999,
+ companyId: state.form.companyId
+ }
+ const res = await getUser(queryParams)
+ if(res.code == 200){
+ state.peopleList = res.data.list?res.data.list:[]
+ }else{
+ ElMessage.warning(res.message)
+ }
+};
+const getPlanList = async ()=> {
+ if(state.isAdmin && !state.form.companyId && (state.form.companyId == 0 || state.form.companyId == null)){
+ return
+ }
+ const queryParams = {
+ companyId: state.form.companyId
+ }
+ const res = await getTrainPlanAll(queryParams);
+ if(res.code === 200){
+ state.planList = res.data.data
+ }else{
+ ElMessage.warning(res.message)
+ }
+};
+const onSubmit = async () => {
+ state.form.personalQuality = JSON.stringify(state.tableData)
+ state.form.preparatory = JSON.stringify(state.tableDataWork)
+ state.form.courseContent = JSON.stringify(state.tableDataContent)
+ state.form.staffs = state.staffs.join(',')
+ const valid = await busRef.value.validate();
+ if(valid){
+ if(title.value === '新增'){
+ console.log('sta',state.form)
+ const {id, ...data} = JSON.parse(JSON.stringify(state.form))
+ const res = await addCourseEvaluate(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 editCourseEvaluate(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 reset = () => {
+ state.form = {
+ id: '',
+ companyId: null,
+ planId: null,
+ teacherId: null,
+ deptId: null,
+ openTime: "",
+ staffs: '',
+ personalQuality: "",
+ preparatory: "",
+ courseContent: "",
+ suggest: "",
+ aboutTeacher: "",
+ aboutContent: "",
+ teachForm: "",
+ other: ""
+ }
+ state.companyList = []
+ state.tableData =[
+ { item: '1)礼貌礼仪/精神面貌', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '2)表达能力(语速/吐字清晰度等)', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '3)耐心程度', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '4)专业知识', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '5)幽默感', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '个人素养综合得分', isTotal: true, total: 0 }, // 综合得分行,标记isTotal以便合并
+ ]
+ state.tableDataWork =[
+ { item: '1)是否准时开课/结课', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '2)是否按计划授课', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '3)授课的资料、辅助工具等的准备工作', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '4)课程时间安排的合理程度', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '5)授课过程中的活动安排合理性', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '授课前准备工作得分', isTotal: true, total: 0 }, // 综合得分行,标记isTotal以便合并
+ ]
+ state.tableDataContent = [
+ { item: '1)课件内容正确性', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '2)授课内容能否结合实际工作', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '3)课程内容是否做到条理清晰,重点突出,描述准确', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '4)在讲授过程中能引进更多的知识和信息', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '5)有案例分析,能有效鼓励新员工参与和互动', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '6)对于学员提出问题回答的准确程度', well: false, good: false, fine: false, notGood: false, bad: false },
+ { item: '课程内容得分', isTotal: true, total: 0 }, // 综合得分行,标记isTotal以便合并
+ ]
+ state.staffs = []
+}
+
+
+
+const selectValueCom = async (val) => {
+ state.form.planId = null
+ state.form.teacherId = null
+ state.form.deptId = null
+ state.staffs = []
+ state.companyList.forEach(item => {
+ if(item.name === val){
+ state.form.companyId = item.id
+ }
+ })
+ await getPeopleList()
+ await getPlanList()
+ await getDeptList()
+}
+
+
+
+defineExpose({
+ openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+ :deep(.el-form .el-form-item__label) {
+ font-size: 15px;
+ }
+ :deep(.el-table .cell){
+ font-size: small;
+ }
+ .file {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ }
+}
+</style>
diff --git a/src/views/work/onlineEducation/courseEvaluate/index.vue b/src/views/work/onlineEducation/courseEvaluate/index.vue
new file mode 100644
index 0000000..18f40e8
--- /dev/null
+++ b/src/views/work/onlineEducation/courseEvaluate/index.vue
@@ -0,0 +1,255 @@
+<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" placeholder="请选择" filterable 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">
+ <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="selection" width="55" />
+ <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+ <el-table-column label="课程名称" prop="planName" align="center" />
+ <el-table-column label="操作" align="center" class-naame="small-padding fixed-width" >
+ <template #default="scope">
+ <el-button link type="primary" @click="openDialog('review',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>
+
+ <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>
+ <editDialog ref="noticeRef" @getList = "getList"></editDialog>
+ </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import editDialog from "./components/editDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {generateWordDocument} from "@/utils/exportWord";
+import {delTable, getTable} from "@/api/qualityObjectives/table";
+import {delDiscern, getDiscern} from "@/api/environment/factors";
+import {delDelivery, getDelivery} from "@/api/satisfiedNew/satisfiedNew";
+import {delCourseEvaluate, getCourseEvaluate} from "@/api/courseEvaluate";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const noticeRef = ref();
+const deptRef = ref()
+const loadingCompany = ref(false)
+const choosedData = ref([])
+const data = reactive({
+ queryParams: {
+ pageNum: 1,
+ pageSize: 10,
+ companyId: null,
+ year: '',
+ type: ''
+ },
+ companyList: [],
+ isAdmin: false,
+ dialogVisible: false,
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+ const userInfo = JSON.parse(Cookies.get('userInfo'))
+ console.log("userInfo",userInfo)
+ data.isAdmin = userInfo.userType === 0;
+ if(data.isAdmin){
+ data.queryParams.companyId = null
+ }else {
+ data.queryParams.companyId = userInfo.companyId
+ }
+ getList();
+ if(data.isAdmin){
+ getCompanyList()
+ }
+});
+const getList = async () => {
+ loading.value = true;
+ const res = await getCourseEvaluate(data.queryParams);
+ if(res.code === 200){
+ dataList.value = res.data.list
+ 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 selectValue = (val) => {
+ data.companyList.forEach(item => {
+ if(item.name === val){
+ data.queryParams.companyId = item.id
+ }
+ })
+}
+
+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()
+}
+const handleClose = () => {
+ data.dialogVisible = false
+}
+
+/** 重置新增的表单以及其他数据 */
+function reset() {
+ if(data.isAdmin){
+ data.queryParams = {
+ companyId: '',
+ pageNum: 1,
+ pageSize: 10,
+ year: '',
+ type: ''
+ }
+ choosedData.value = []
+ data.companyList = [];
+ getCompanyList()
+ }else {
+ data.queryParams = {
+ companyId: data.queryParams.companyId,
+ pageNum: 1,
+ pageSize: 10,
+ year: '',
+ type: ''
+ }
+ }
+ getList();
+
+}
+const exportData = () => {
+ if(choosedData.value && choosedData.value.length === 0){
+ ElMessage.warning('请选择需要导出的数据')
+ }else {
+ startGeneration()
+ }
+}
+const templatePath = ref('/courseEvaluteExample.docx')
+const startGeneration = async () => {
+ const data = JSON.parse(JSON.stringify(choosedData.value))
+ data.forEach(item => {
+ let tablePeople = JSON.parse(item.personalQuality)
+ item.peopleTotal = tablePeople[tablePeople.length - 1].total
+ item.tableData = tablePeople.filter((item,index) => index != tablePeople.length-1)
+
+ let tableWork = JSON.parse(item.preparatory)
+ item.workTotal = tableWork[tableWork.length - 1].total
+ item.tableDataWork = tableWork.filter((item,index) => index != tableWork.length-1)
+
+ let tableContent = JSON.parse(item.courseContent)
+ item.contentTotal = tableContent[tableContent.length - 1].total
+ item.tableDataContent = tableContent.filter((item,index) => index != tableContent.length-1)
+ try {
+ generateWordDocument(templatePath.value, item, item.planName+`_课程有效性评价表.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 delCourseEvaluate(val.id);
+ if(res.code === 200){
+ ElMessage({
+ type: 'success',
+ message: '删除成功'
+ });
+ await getList();
+ }else{
+ ElMessage.warning(res.message)
+ }
+ })
+}
+
+
+</script>
+<style lang="scss">
+.pag-container{
+ float: right;
+ margin-top: 10px;
+}
+</style>
diff --git a/src/views/work/selfProblems/internalAudit/auditorManage/tableList/components/editDialog.vue b/src/views/work/selfProblems/internalAudit/auditorManage/tableList/components/editDialog.vue
index 4939c0e..f8058d9 100644
--- a/src/views/work/selfProblems/internalAudit/auditorManage/tableList/components/editDialog.vue
+++ b/src/views/work/selfProblems/internalAudit/auditorManage/tableList/components/editDialog.vue
@@ -43,19 +43,19 @@
/>
</el-select>
</el-form-item>
- <el-form-item label="内审员证书:" prop="certifity">
+ <el-form-item label="内审员证书:" prop="paperStudentId">
<el-select
clearable
- v-model="state.form.certifity"
+ v-model="state.form.paperStudentId"
:disabled="state.title =='查看'"
filterable
style="width: 100%"
>
<el-option
v-for="item in state.certList"
- :key="item.number"
+ :key="item.paperStudentId"
:label="item.certName"
- :value="item.number"
+ :value="item.paperStudentId"
/>
</el-select>
</el-form-item>
@@ -96,7 +96,7 @@
id: null,
personId: null,
companyId: null,
- certifity: '',
+ paperStudentId: '',
amount: '',
conclusion: ''
@@ -208,7 +208,7 @@
}
const selectValueCom = (val) => {
state.form.personId = null
- state.form.certifity = ''
+ state.form.paperStudentId = ''
getPeopleList()
}
@@ -217,7 +217,7 @@
id: null,
personId: null,
companyId: null,
- certifity: '',
+ paperStudentId: '',
amount: '',
conclusion: ''
}
@@ -229,7 +229,7 @@
dialogVisible.value = false;
}
const changePerson = () =>{
- state.form.certifity = ''
+ state.form.paperStudentId = ''
getCertList()
}
diff --git a/src/views/work/selfProblems/internalAudit/auditorManage/tableList/index.vue b/src/views/work/selfProblems/internalAudit/auditorManage/tableList/index.vue
index aea8de3..4814ada 100644
--- a/src/views/work/selfProblems/internalAudit/auditorManage/tableList/index.vue
+++ b/src/views/work/selfProblems/internalAudit/auditorManage/tableList/index.vue
@@ -32,9 +32,9 @@
<el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
<el-table-column label="姓名" prop="personName" align="center" />
<el-table-column label="所属部门" prop="deptName" align="center" />
- <el-table-column label="内审员证书" prop="certifity" align="center" >
+ <el-table-column label="内审员证书" prop="paperStudentId" align="center" >
<template #default="scope">
- <el-button v-if="scope.row.certifity" type="primary" @click="downloadCert(scope.row)" link>证书</el-button>
+ <el-button v-if="scope.row.paperStudentId" type="primary" @click="downloadCert(scope.row)" link>证书</el-button>
</template>
</el-table-column>
<el-table-column label="审核经历次数" prop="amount" align="center" />
--
Gitblit v1.9.2