多体系建设信息化条统-前端
zhouwx
2025-10-20 71a112b7d78698b7e4df94e6255bf302bf415b35
修改
5 files modified
4 files added
1023 ■■■■■ changed files
public/courseEvaluteExample.docx patch | view | raw | blame | history
src/api/courseEvaluate/index.js 32 ●●●●● patch | view | raw | blame | history
src/api/onlineEducation/trainPlan.js 8 ●●●●● patch | view | raw | blame | history
src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/components/dataDialog.vue 2 ●●●●● patch | view | raw | blame | history
src/views/certificatePdf.vue 2 ●●● patch | view | raw | blame | history
src/views/work/onlineEducation/courseEvaluate/components/editDialog.vue 704 ●●●●● patch | view | raw | blame | history
src/views/work/onlineEducation/courseEvaluate/index.vue 255 ●●●●● patch | view | raw | blame | history
src/views/work/selfProblems/internalAudit/auditorManage/tableList/components/editDialog.vue 16 ●●●● patch | view | raw | blame | history
src/views/work/selfProblems/internalAudit/auditorManage/tableList/index.vue 4 ●●●● patch | view | raw | blame | history
public/courseEvaluteExample.docx
Binary files differ
src/api/courseEvaluate/index.js
New file
@@ -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'
    })
}
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({
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"
    >
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
src/views/work/onlineEducation/courseEvaluate/components/editDialog.vue
New file
@@ -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>
src/views/work/onlineEducation/courseEvaluate/index.vue
New file
@@ -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>
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()
}
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"  />