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