forked from integrated_whb/integrated_whb_vue
				
			
			
			
			
				dev
			
			
		
		
							parent
							
								
									3213c25bc1
								
							
						
					
					
						commit
						7b110927c4
					
				
							
								
								
									
										2
									
								
								.env
								
								
								
								
							
							
						
						
									
										2
									
								
								.env
								
								
								
								
							|  | @ -1,4 +1,4 @@ | ||||||
| VITE_BASE_URL=http://192.168.0.49:8093/ | VITE_BASE_URL=http://192.168.0.55:8093/ | ||||||
| VITE_PROXY=/api/ | VITE_PROXY=/api/ | ||||||
| VITE_FILE_URL=https://file.zcloudchina.com/YTHFile | VITE_FILE_URL=https://file.zcloudchina.com/YTHFile | ||||||
| VITE_TEMPLATE_URL=https://qaaq.qhdsafety.com/file/ | VITE_TEMPLATE_URL=https://qaaq.qhdsafety.com/file/ | ||||||
|  |  | ||||||
|  | @ -19,7 +19,7 @@ | ||||||
|         "axios": "^1.6.3", |         "axios": "^1.6.3", | ||||||
|         "dayjs": "^1.11.10", |         "dayjs": "^1.11.10", | ||||||
|         "echarts": "^5.4.3", |         "echarts": "^5.4.3", | ||||||
|         "element-plus": "^2.4.4", |         "element-plus": "^2.6.1", | ||||||
|         "html2canvas": "^1.4.1", |         "html2canvas": "^1.4.1", | ||||||
|         "jspdf": "^2.5.1", |         "jspdf": "^2.5.1", | ||||||
|         "lodash-es": "^4.17.21", |         "lodash-es": "^4.17.21", | ||||||
|  |  | ||||||
|  | @ -46,6 +46,33 @@ export const getClassManagementStudentExamRecordsList = (params) => | ||||||
|   post("/stageexam/list", params); // 班级管理学员考试记录列表
 |   post("/stageexam/list", params); // 班级管理学员考试记录列表
 | ||||||
| export const getClassManagementStudentExamRecordsView = (params) => | export const getClassManagementStudentExamRecordsView = (params) => | ||||||
|   post("/stageexam/findExam", params); // 班级管理学员考试记录查看
 |   post("/stageexam/findExam", params); // 班级管理学员考试记录查看
 | ||||||
|  | 
 | ||||||
|  | export const getTrainingProgressList = (params) => | ||||||
|  |   post("/student/studentList", params); // 查询进度列表
 | ||||||
|  | 
 | ||||||
|  | export const getTrainingProgressListExportStudentRecords = (params) => | ||||||
|  |   post("/student/derivedRecord", params); // 导出学员信息
 | ||||||
|  | 
 | ||||||
|  | export const getExamdraftList = (params) => | ||||||
|  |   post("/stageexampaperCache/list", params); // 试卷草稿管理列表
 | ||||||
|  | 
 | ||||||
|  | export const setpaperQuestionCacheQuestionsAdd = (params) => | ||||||
|  |   post("/paperQuestionCache/add", params); // 草稿试卷管理试题新增
 | ||||||
|  | 
 | ||||||
|  | export const setpaperQuestionCacheQuestionsEdit = (params) => | ||||||
|  |   post("/paperQuestionCache/edit", params); // 草稿试卷管理试题修改
 | ||||||
|  | 
 | ||||||
|  | export const setpaperQuestionCacheDelete = (params) => | ||||||
|  |   post("/paperQuestionCache/delete", params); // 草稿试卷管理试题删除
 | ||||||
|  | 
 | ||||||
|  | export const setstageexampaperCacheEdit = (params) => | ||||||
|  |   post("/stageexampaperCache/edit", params); // 草稿试卷管理保存修改
 | ||||||
|  | 
 | ||||||
|  | export const setstageexampaperCacheDelete = (params) => | ||||||
|  |   post("/stageexampaperCache/delete", params); // 草稿试卷管理保存修改
 | ||||||
|  | 
 | ||||||
|  | export const setstageexampaperCacheformal = (params) => | ||||||
|  |   post("/stageexampaperCache/convertStageexam", params); // 草稿试卷管理保存修改
 | ||||||
| export const getClassManagementCurriculumList = (params) => | export const getClassManagementCurriculumList = (params) => | ||||||
|   post("/classCurriculum/list", params); // 班级管理课程列表
 |   post("/classCurriculum/list", params); // 班级管理课程列表
 | ||||||
| export const setClassManagementCurriculumDelete = (params) => | export const setClassManagementCurriculumDelete = (params) => | ||||||
|  |  | ||||||
|  | @ -24,3 +24,9 @@ export const getExamPaperManagementView = (params) => | ||||||
|   post("/stageexampaperinput/goEdit", params); // 试卷管理查看
 |   post("/stageexampaperinput/goEdit", params); // 试卷管理查看
 | ||||||
| export const getExamPaperManagementTestQuestions = (params) => | export const getExamPaperManagementTestQuestions = (params) => | ||||||
|   post("/paperQuestion/listForInherit", params); // 试卷管理试题
 |   post("/paperQuestion/listForInherit", params); // 试卷管理试题
 | ||||||
|  | 
 | ||||||
|  | export const getpaperQuestionCacheQuestions = (params) => | ||||||
|  |   post("/paperQuestionCache/list", params); // 试卷草稿管理试题
 | ||||||
|  | 
 | ||||||
|  | export const getStagexampaperCacheView = (params) => | ||||||
|  |   post("/stageexampaperCache/goEdit", params); // 试卷管理查看
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,248 @@ | ||||||
|  | <template> | ||||||
|  |   <el-dialog | ||||||
|  |     v-model="visible" | ||||||
|  |     :title="type === 'add' ? '新增' : '修改'" | ||||||
|  |     @close="fnClose" | ||||||
|  |     @open="fnQuestionTypeChange" | ||||||
|  |   > | ||||||
|  |     <el-form ref="formRef" :rules="rules" :model="form" label-width="110px"> | ||||||
|  |       <el-form-item label="试题类型" prop="QUESTIONTYPE"> | ||||||
|  |         <el-select v-model="form.QUESTIONTYPE" @change="fnQuestionTypeChange"> | ||||||
|  |           <el-option | ||||||
|  |             v-for="item in questionTypeOptions" | ||||||
|  |             :key="item.value" | ||||||
|  |             :label="item.label" | ||||||
|  |             :value="item.value" | ||||||
|  |           /> | ||||||
|  |         </el-select> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="题干" prop="QUESTIONDRY"> | ||||||
|  |         <el-input | ||||||
|  |           v-model="form.QUESTIONDRY" | ||||||
|  |           type="textarea" | ||||||
|  |           :autosize="{ minRows: 3 }" | ||||||
|  |         /> | ||||||
|  |       </el-form-item> | ||||||
|  |       <template v-if="form.QUESTIONTYPE !== '3' && form.QUESTIONTYPE !== '4'"> | ||||||
|  |         <el-form-item label="选项A" prop="OPTIONA"> | ||||||
|  |           <el-input v-model="form.OPTIONA" /> | ||||||
|  |         </el-form-item> | ||||||
|  |         <el-form-item label="选项B" prop="OPTIONB"> | ||||||
|  |           <el-input v-model="form.OPTIONB" /> | ||||||
|  |         </el-form-item> | ||||||
|  |         <el-form-item label="选项C" prop="OPTIONC"> | ||||||
|  |           <el-input v-model="form.OPTIONC" /> | ||||||
|  |         </el-form-item> | ||||||
|  |         <el-form-item label="选项D" prop="OPTIOND"> | ||||||
|  |           <el-input v-model="form.OPTIOND" /> | ||||||
|  |         </el-form-item> | ||||||
|  |       </template> | ||||||
|  |       <el-form-item label="答案" prop="ANSWER"> | ||||||
|  |         <el-select v-model="form.ANSWER"> | ||||||
|  |           <el-option | ||||||
|  |             v-for="item in answerOptions" | ||||||
|  |             :key="item.value" | ||||||
|  |             :label="item.label" | ||||||
|  |             :value="item.value" | ||||||
|  |           /> | ||||||
|  |         </el-select> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="分值" prop="SCORE"> | ||||||
|  |         <el-input-number v-model="form.SCORE" /> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="试题标签" prop="LABEL_TYPE"> | ||||||
|  |         <el-select v-model="form.LABEL_TYPE"> | ||||||
|  |           <el-option | ||||||
|  |             v-for="item in testQuestionLabels" | ||||||
|  |             :key="item.DICTIONARIES_ID" | ||||||
|  |             :label="item.NAME" | ||||||
|  |             :value="item.DICTIONARIES_ID" | ||||||
|  |           /> | ||||||
|  |         </el-select> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="关联课件名称" prop="VIDEOCOURSEWARE_ID"> | ||||||
|  |         <el-select-v2 | ||||||
|  |           v-model="form.VIDEOCOURSEWARE_ID" | ||||||
|  |           :options="associatedCoursewareName" | ||||||
|  |           filterable | ||||||
|  |           :props="{ label: 'COURSEWARENAME', value: 'VIDEOCOURSEWARE_ID' }" | ||||||
|  |         /> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="答案解析" prop="DESCR"> | ||||||
|  |         <el-input | ||||||
|  |           v-model="form.DESCR" | ||||||
|  |           type="textarea" | ||||||
|  |           :autosize="{ minRows: 3 }" | ||||||
|  |         /> | ||||||
|  |       </el-form-item> | ||||||
|  |     </el-form> | ||||||
|  |     <template #footer> | ||||||
|  |       <el-button @click="fnClose">取消</el-button> | ||||||
|  |       <el-button type="primary" @click="fnSubmit">确定</el-button> | ||||||
|  |     </template> | ||||||
|  |   </el-dialog> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script setup> | ||||||
|  | import { useVModels } from "@vueuse/core"; | ||||||
|  | import { nextTick, ref } from "vue"; | ||||||
|  | import { debounce } from "throttle-debounce"; | ||||||
|  | import useFormValidate from "@/assets/js/useFormValidate.js"; | ||||||
|  | import { ElMessage } from "element-plus"; | ||||||
|  | import { layoutFnGetTestQuestionLabels } from "@/assets/js/data_dictionary.js"; | ||||||
|  | import { | ||||||
|  |   getAssociatedCoursewareNameList, | ||||||
|  |   setpaperQuestionCacheQuestionsAdd, | ||||||
|  |   setpaperQuestionCacheQuestionsEdit, | ||||||
|  | } from "@/request/training_process_management.js"; | ||||||
|  | import { cloneDeep } from "lodash-es"; | ||||||
|  | 
 | ||||||
|  | const questionTypeOptions = [ | ||||||
|  |   { value: "1", label: "单选题" }, | ||||||
|  |   { value: "2", label: "多选题" }, | ||||||
|  |   { value: "3", label: "判断题" }, | ||||||
|  | ]; | ||||||
|  | const props = defineProps({ | ||||||
|  |   visible: { | ||||||
|  |     type: Boolean, | ||||||
|  |     required: true, | ||||||
|  |     default: false, | ||||||
|  |   }, | ||||||
|  |   form: { | ||||||
|  |     type: Object, | ||||||
|  |     required: true, | ||||||
|  |     default: () => ({}), | ||||||
|  |   }, | ||||||
|  |   type: { | ||||||
|  |     type: String, | ||||||
|  |     required: true, | ||||||
|  |     default: "", | ||||||
|  |   }, | ||||||
|  |   id: { | ||||||
|  |     type: String, | ||||||
|  |     required: true, | ||||||
|  |     default: "", | ||||||
|  |   }, | ||||||
|  |   isInherit: { | ||||||
|  |     type: Boolean, | ||||||
|  |     required: true, | ||||||
|  |     default: false, | ||||||
|  |   }, | ||||||
|  | }); | ||||||
|  | const emits = defineEmits([ | ||||||
|  |   "update:visible", | ||||||
|  |   "update:form", | ||||||
|  |   "get-data", | ||||||
|  |   "confirm", | ||||||
|  | ]); | ||||||
|  | const { visible, form } = useVModels(props, emits); | ||||||
|  | const formRef = ref(null); | ||||||
|  | const answerOptions = ref([]); | ||||||
|  | const associatedCoursewareName = ref([]); | ||||||
|  | const rules = { | ||||||
|  |   QUESTIONTYPE: [ | ||||||
|  |     { required: true, message: "请选择试题类型", trigger: "change" }, | ||||||
|  |   ], | ||||||
|  |   QUESTIONDRY: [{ required: true, message: "请输入题干", trigger: "blur" }], | ||||||
|  |   OPTIONA: [{ required: true, message: "请输入选项A", trigger: "blur" }], | ||||||
|  |   OPTIONB: [{ required: true, message: "请输入选项B", trigger: "blur" }], | ||||||
|  |   OPTIONC: [{ required: true, message: "请输入选项C", trigger: "blur" }], | ||||||
|  |   OPTIOND: [{ required: true, message: "请输入选项D", trigger: "blur" }], | ||||||
|  |   ANSWER: [{ required: true, message: "请选择答案", trigger: "change" }], | ||||||
|  |   SCORE: [{ required: true, message: "请输入分值", trigger: "blur" }], | ||||||
|  |   LABEL_TYPE: [ | ||||||
|  |     { required: true, message: "请选择试题标签", trigger: "change" }, | ||||||
|  |   ], | ||||||
|  |   VIDEOCOURSEWARE_ID: [ | ||||||
|  |     { required: true, message: "请选择关联课件名称", trigger: "change" }, | ||||||
|  |   ], | ||||||
|  | }; | ||||||
|  | const testQuestionLabels = await layoutFnGetTestQuestionLabels(); | ||||||
|  | const fnGetAssociatedCoursewareNameList = async () => { | ||||||
|  |   const resData = await getAssociatedCoursewareNameList(); | ||||||
|  |   associatedCoursewareName.value = resData.CourseWareNameList; | ||||||
|  | }; | ||||||
|  | fnGetAssociatedCoursewareNameList(); | ||||||
|  | const fnQuestionTypeChange = async () => { | ||||||
|  |   await nextTick(); | ||||||
|  |   if (form.value.QUESTIONTYPE === "1") { | ||||||
|  |     answerOptions.value = [ | ||||||
|  |       { value: "A", label: "A" }, | ||||||
|  |       { value: "B", label: "B" }, | ||||||
|  |       { value: "C", label: "C" }, | ||||||
|  |       { value: "D", label: "D" }, | ||||||
|  |     ]; | ||||||
|  |   } else if (form.value.QUESTIONTYPE === "2") { | ||||||
|  |     answerOptions.value = [ | ||||||
|  |       { value: "AB", label: "AB" }, | ||||||
|  |       { value: "AC", label: "AC" }, | ||||||
|  |       { value: "AD", label: "AD" }, | ||||||
|  |       { value: "BC", label: "BC" }, | ||||||
|  |       { value: "BD", label: "BD" }, | ||||||
|  |       { value: "CD", label: "CD" }, | ||||||
|  |       { value: "ABC", label: "ABC" }, | ||||||
|  |       { value: "ABD", label: "ABD" }, | ||||||
|  |       { value: "ACD", label: "ACD" }, | ||||||
|  |       { value: "BCD", label: "BCD" }, | ||||||
|  |       { value: "ABCD", label: "ABCD" }, | ||||||
|  |     ]; | ||||||
|  |   } else if (form.value.QUESTIONTYPE === "3") { | ||||||
|  |     answerOptions.value = [ | ||||||
|  |       { value: "A", label: "对" }, | ||||||
|  |       { value: "B", label: "错" }, | ||||||
|  |     ]; | ||||||
|  |   } else { | ||||||
|  |     answerOptions.value = []; | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | const fnClose = () => { | ||||||
|  |   formRef.value.resetFields(); | ||||||
|  |   visible.value = false; | ||||||
|  | }; | ||||||
|  | const fnSubmit = debounce( | ||||||
|  |   1000, | ||||||
|  |   async () => { | ||||||
|  |     await useFormValidate(formRef); | ||||||
|  |     if (form.value.QUESTIONTYPE === "3") { | ||||||
|  |       form.value.OPTIONA = "对"; | ||||||
|  |       form.value.OPTIONB = "错"; | ||||||
|  |       form.value.OPTIONC = ""; | ||||||
|  |       form.value.OPTIOND = ""; | ||||||
|  |     } | ||||||
|  |     let arr = []; | ||||||
|  |     if (form.value.QUESTIONTYPE === "3") { | ||||||
|  |       arr = ["#" + form.value.OPTIONA + "#", "#" + form.value.OPTIONB + "#"]; | ||||||
|  |     } else if (form.value.QUESTIONTYPE !== "4") { | ||||||
|  |       arr = [ | ||||||
|  |         "#" + form.value.OPTIONA + "#", | ||||||
|  |         "#" + form.value.OPTIONB + "#", | ||||||
|  |         "#" + form.value.OPTIONC + "#", | ||||||
|  |         "#" + form.value.OPTIOND + "#", | ||||||
|  |       ]; | ||||||
|  |     } | ||||||
|  |     const s = arr.join(",") + ","; | ||||||
|  |     for (let i = 0; i < arr.length - 1; i++) { | ||||||
|  |       if (s.replace(arr[i] + ",", "").indexOf(arr[i]) > -1) { | ||||||
|  |         ElMessage.warning("试题答案重复:" + arr[i].split("#").join("")); | ||||||
|  |         return; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if (!props.isInherit) { | ||||||
|  |       props.type === "add" | ||||||
|  |         ? await setpaperQuestionCacheQuestionsAdd({ | ||||||
|  |             ...form.value, | ||||||
|  |             STAGEEXAMPAPERINPUT_ID: props.id, | ||||||
|  |           }) | ||||||
|  |         : await setpaperQuestionCacheQuestionsEdit({ ...form.value }); | ||||||
|  |       emits("get-data"); | ||||||
|  |     } else { | ||||||
|  |       emits("confirm", cloneDeep(form.value)); | ||||||
|  |     } | ||||||
|  |     ElMessage.success("操作成功"); | ||||||
|  |     fnClose(); | ||||||
|  |   }, | ||||||
|  |   { atBegin: true } | ||||||
|  | ); | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style scoped lang="scss"></style> | ||||||
|  | @ -0,0 +1,297 @@ | ||||||
|  | <template> | ||||||
|  |   <layout-card> | ||||||
|  |     <el-divider content-position="left">试卷基本信息</el-divider> | ||||||
|  |     <el-form | ||||||
|  |       ref="formRef" | ||||||
|  |       :model="data.form" | ||||||
|  |       :rules="rules" | ||||||
|  |       label-width="100px" | ||||||
|  |     > | ||||||
|  |       <el-row> | ||||||
|  |         <el-col :span="24"> | ||||||
|  |           <el-form-item label="试卷名称" prop="EXAMNAME"> | ||||||
|  |             <el-input v-model="data.form.EXAMNAME" /> | ||||||
|  |           </el-form-item> | ||||||
|  |         </el-col> | ||||||
|  |         <el-col :span="12"> | ||||||
|  |           <el-form-item label="总分数" prop="EXAMSCORE"> | ||||||
|  |             <el-input-number v-model="data.form.EXAMSCORE" /> | ||||||
|  |           </el-form-item> | ||||||
|  |         </el-col> | ||||||
|  |         <el-col :span="12"> | ||||||
|  |           <el-form-item label="合格分数" prop="PASSSCORE"> | ||||||
|  |             <el-input-number v-model="data.form.PASSSCORE" /> | ||||||
|  |           </el-form-item> | ||||||
|  |         </el-col> | ||||||
|  |       </el-row> | ||||||
|  |     </el-form> | ||||||
|  |     <div v-if="type !== 'add'"> | ||||||
|  |       <el-divider content-position="left">试卷题目信息</el-divider> | ||||||
|  |       <el-form | ||||||
|  |         :model="searchForm" | ||||||
|  |         label-width="100px" | ||||||
|  |         @submit.prevent="fnGetData" | ||||||
|  |       > | ||||||
|  |         <el-row> | ||||||
|  |           <el-col :span="6"> | ||||||
|  |             <el-form-item label="题目内容" prop="KEYWORDS"> | ||||||
|  |               <el-input v-model="searchForm.KEYWORDS" /> | ||||||
|  |             </el-form-item> | ||||||
|  |           </el-col> | ||||||
|  |           <el-col :span="6"> | ||||||
|  |             <el-form-item label="题目类型" prop="QUESTIONTYPE"> | ||||||
|  |               <el-select v-model="searchForm.QUESTIONTYPE"> | ||||||
|  |                 <el-option | ||||||
|  |                   v-for="item in questionTypeOptions" | ||||||
|  |                   :key="item.value" | ||||||
|  |                   :label="item.label" | ||||||
|  |                   :value="item.value" | ||||||
|  |                 /> | ||||||
|  |               </el-select> | ||||||
|  |             </el-form-item> | ||||||
|  |           </el-col> | ||||||
|  |           <el-col :span="6"> | ||||||
|  |             <el-form-item label-width="10px"> | ||||||
|  |               <el-button type="primary" native-type="submit">搜索</el-button> | ||||||
|  |               <el-button native-type="reset" @click="fnGetData"> | ||||||
|  |                 重置 | ||||||
|  |               </el-button> | ||||||
|  |             </el-form-item> | ||||||
|  |           </el-col> | ||||||
|  |           <el-col :span="6"> | ||||||
|  |             <el-form-item label-width="10px" class="end"> | ||||||
|  |               <el-button type="primary" @click="fnAddOrEdit({}, '')"> | ||||||
|  |                 新增试题 | ||||||
|  |               </el-button> | ||||||
|  |             </el-form-item> | ||||||
|  |           </el-col> | ||||||
|  |         </el-row> | ||||||
|  |       </el-form> | ||||||
|  |       <div class="items mt-20 p-20"> | ||||||
|  |         <div | ||||||
|  |           v-for="(item, index) in list" | ||||||
|  |           :key="item.PAPER_QUESTION_ID" | ||||||
|  |           class="item ptb-20" | ||||||
|  |         > | ||||||
|  |           <div class="mt-10"> | ||||||
|  |             {{ index + 1 }}. | ||||||
|  |             <span v-if="item.QUESTIONTYPE === '1'"> (单选题) </span> | ||||||
|  |             <span v-if="item.QUESTIONTYPE === '2'"> (多选题) </span> | ||||||
|  |             <span v-if="item.QUESTIONTYPE === '3'"> (判断题) </span> | ||||||
|  |             {{ item.QUESTIONDRY }} | ||||||
|  |             <span class="ml-10">(题目分值:{{ item.SCORE }})</span> | ||||||
|  |           </div> | ||||||
|  |           <div class="mt-10 ml-30"> | ||||||
|  |             <el-radio-group | ||||||
|  |               v-if="item.QUESTIONTYPE === '1'" | ||||||
|  |               disabled | ||||||
|  |               :model-value="item.ANSWER" | ||||||
|  |             > | ||||||
|  |               <el-radio label="A">A.{{ item.OPTIONA }}</el-radio> | ||||||
|  |               <el-radio label="B">B.{{ item.OPTIONB }}</el-radio> | ||||||
|  |               <el-radio label="C">C.{{ item.OPTIONC }}</el-radio> | ||||||
|  |               <el-radio label="D">D.{{ item.OPTIOND }}</el-radio> | ||||||
|  |             </el-radio-group> | ||||||
|  |             <el-checkbox-group | ||||||
|  |               v-if="item.QUESTIONTYPE === '2'" | ||||||
|  |               disabled | ||||||
|  |               :model-value="item.ANSWER?.split('')" | ||||||
|  |             > | ||||||
|  |               <el-checkbox label="A">A.{{ item.OPTIONA }}</el-checkbox> | ||||||
|  |               <el-checkbox label="B">B.{{ item.OPTIONB }}</el-checkbox> | ||||||
|  |               <el-checkbox label="C">C.{{ item.OPTIONC }}</el-checkbox> | ||||||
|  |               <el-checkbox label="D">D.{{ item.OPTIOND }}</el-checkbox> | ||||||
|  |             </el-checkbox-group> | ||||||
|  |             <el-radio-group | ||||||
|  |               v-if="item.QUESTIONTYPE === '3'" | ||||||
|  |               disabled | ||||||
|  |               :model-value="item.ANSWER" | ||||||
|  |             > | ||||||
|  |               <el-radio label="A">A.{{ item.OPTIONA }}</el-radio> | ||||||
|  |               <el-radio label="B">B.{{ item.OPTIONB }}</el-radio> | ||||||
|  |             </el-radio-group> | ||||||
|  |           </div> | ||||||
|  |           <div class="flex"> | ||||||
|  |             <div> | ||||||
|  |               <div class="mt-10">答案:{{ item.ANSWER }}</div> | ||||||
|  |               <div class="mt-10">答案解析:{{ item.DESCR }}</div> | ||||||
|  |               <div class="mt-10">关联课件名称:{{ item.COURSEWARENAME }}</div> | ||||||
|  |             </div> | ||||||
|  |             <div class="tr"> | ||||||
|  |               <el-button @click="fnAddOrEdit(item, index)">编辑</el-button> | ||||||
|  |               <el-button @click="fnDelete(item.PAPER_QUESTION_ID, index)"> | ||||||
|  |                 删除 | ||||||
|  |               </el-button> | ||||||
|  |             </div> | ||||||
|  |           </div> | ||||||
|  |         </div> | ||||||
|  |       </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="mt-10 tc"> | ||||||
|  |       <el-button type="primary" @click="fnSubmit"> 保存修改 </el-button> | ||||||
|  |     </div> | ||||||
|  |     <add-test-questions | ||||||
|  |       :id="STAGEEXAMPAPERINPUT_ID" | ||||||
|  |       v-model:visible="data.addOrEditDialog.visible" | ||||||
|  |       v-model:form="data.addOrEditDialog.form" | ||||||
|  |       :type="data.addOrEditDialog.type" | ||||||
|  |       :is-inherit="type === 'inherit'" | ||||||
|  |       @get-data="fnGetDataInfo" | ||||||
|  |       @confirm="fnAddTestQuestionsConfirm" | ||||||
|  |     /> | ||||||
|  |   </layout-card> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script setup> | ||||||
|  | import { nextTick, reactive, ref } from "vue"; | ||||||
|  | import { ElMessage, ElMessageBox } from "element-plus"; | ||||||
|  | import { useRoute, useRouter } from "vue-router"; | ||||||
|  | import { debounce } from "throttle-debounce"; | ||||||
|  | import useFormValidate from "@/assets/js/useFormValidate.js"; | ||||||
|  | import { | ||||||
|  |   setpaperQuestionCacheDelete, | ||||||
|  |   setstageexampaperCacheEdit, | ||||||
|  | } from "@/request/training_process_management.js"; | ||||||
|  | import { | ||||||
|  |   getpaperQuestionCacheQuestions, | ||||||
|  |   getStagexampaperCacheView, | ||||||
|  | } from "@/request/training_resource_management.js"; | ||||||
|  | import useListData from "@/assets/js/useListData.js"; | ||||||
|  | import { cloneDeep, sumBy } from "lodash-es"; | ||||||
|  | import AddTestQuestions from "./components/add_test_questions.vue"; | ||||||
|  | 
 | ||||||
|  | const route = useRoute(); | ||||||
|  | const router = useRouter(); | ||||||
|  | const { type, STAGEEXAMPAPERINPUT_ID } = route.query; | ||||||
|  | 
 | ||||||
|  | const questionTypeOptions = [ | ||||||
|  |   { value: "1", label: "单选题" }, | ||||||
|  |   { value: "2", label: "多选题" }, | ||||||
|  |   { value: "3", label: "判断题" }, | ||||||
|  | ]; | ||||||
|  | const rules = { | ||||||
|  |   EXAMNAME: [{ required: true, message: "请输入试卷名称", trigger: "blur" }], | ||||||
|  |   EXAMSCORE: [{ required: true, message: "请输入总分数", trigger: "blur" }], | ||||||
|  |   PASSSCORE: [{ required: true, message: "请输入合格分数", trigger: "blur" }], | ||||||
|  |   fileList: [{ required: true, message: "请上传试题", trigger: "change" }], | ||||||
|  | }; | ||||||
|  | const formRef = ref(null); | ||||||
|  | const data = reactive({ | ||||||
|  |   form: { | ||||||
|  |     EXAMNAME: "", | ||||||
|  |     EXAMSCORE: 0, | ||||||
|  |     PASSSCORE: 0, | ||||||
|  |     fileList: [], | ||||||
|  |   }, | ||||||
|  |   addOrEditDialog: { | ||||||
|  |     visible: false, | ||||||
|  |     form: { | ||||||
|  |       QUESTIONTYPE: "", | ||||||
|  |       QUESTIONDRY: "", | ||||||
|  |       OPTIONA: "", | ||||||
|  |       OPTIONB: "", | ||||||
|  |       OPTIONC: "", | ||||||
|  |       OPTIOND: "", | ||||||
|  |       ANSWER: "", | ||||||
|  |       SCORE: 0, | ||||||
|  |       LABEL_TYPE: "", | ||||||
|  |       VIDEOCOURSEWARE_ID: "", | ||||||
|  |     }, | ||||||
|  |     type: "", | ||||||
|  |     index: "", | ||||||
|  |   }, | ||||||
|  | }); | ||||||
|  | const { list, searchForm, fnGetData } = useListData( | ||||||
|  |   getpaperQuestionCacheQuestions, | ||||||
|  |   { | ||||||
|  |     otherParams: { STAGEEXAMPAPERINPUT_ID }, | ||||||
|  |     immediate: false, | ||||||
|  |     usePagination: false, | ||||||
|  |   } | ||||||
|  | ); | ||||||
|  | const fnGetDataInfo = async () => { | ||||||
|  |   if (!STAGEEXAMPAPERINPUT_ID) return; | ||||||
|  |   const resData = await getStagexampaperCacheView({ STAGEEXAMPAPERINPUT_ID }); | ||||||
|  |   resData.pd.EXAMSCORE = +resData.pd.EXAMSCORE; | ||||||
|  |   resData.pd.PASSSCORE = +resData.pd.PASSSCORE; | ||||||
|  |   data.form = resData.pd; | ||||||
|  |   fnGetData(); | ||||||
|  | }; | ||||||
|  | fnGetDataInfo(); | ||||||
|  | 
 | ||||||
|  | const fnAddOrEdit = async (row, index) => { | ||||||
|  |   data.addOrEditDialog.visible = true; | ||||||
|  |   await nextTick(); | ||||||
|  |   data.addOrEditDialog.type = row.PAPER_QUESTION_ID ? "edit" : "add"; | ||||||
|  |   data.addOrEditDialog.index = index; | ||||||
|  |   if (row.PAPER_QUESTION_ID) { | ||||||
|  |     data.addOrEditDialog.form = cloneDeep(row); | ||||||
|  |     data.addOrEditDialog.form.SCORE = +row.SCORE; | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | const fnAddTestQuestionsConfirm = (value) => { | ||||||
|  |   if (data.addOrEditDialog.type === "add") list.value.push(value); | ||||||
|  |   else list.value.splice(data.addOrEditDialog.index, 1, value); | ||||||
|  |   data.form.EXAMSCORE = sumBy(list.value, (item) => +item.SCORE); | ||||||
|  | }; | ||||||
|  | const fnDelete = debounce( | ||||||
|  |   1000, | ||||||
|  |   async (PAPER_QUESTION_ID) => { | ||||||
|  |     await ElMessageBox.confirm("确定要删除吗?", { | ||||||
|  |       type: "warning", | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     await setpaperQuestionCacheDelete({ | ||||||
|  |       PAPER_QUESTION_ID, | ||||||
|  |       STAGEEXAMPAPERINPUT_ID, | ||||||
|  |     }); | ||||||
|  |     ElMessage.success("删除成功"); | ||||||
|  |     await fnGetDataInfo(); | ||||||
|  |   }, | ||||||
|  |   { atBegin: true } | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | const fnSubmit = debounce( | ||||||
|  |   1000, | ||||||
|  |   async () => { | ||||||
|  |     await useFormValidate(formRef); | ||||||
|  |     if (data.form.PASSSCORE > data.form.EXAMSCORE) { | ||||||
|  |       ElMessage.warning("合格分数不能大于总分数"); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |     await setstageexampaperCacheEdit({ | ||||||
|  |       ...data.form, | ||||||
|  |     }); | ||||||
|  |     ElMessage.success("保存成功"); | ||||||
|  |     router.back(); | ||||||
|  |   }, | ||||||
|  |   { atBegin: true } | ||||||
|  | ); | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style scoped lang="scss"> | ||||||
|  | .items { | ||||||
|  |   border: 1px solid var(--el-border-color); | ||||||
|  | 
 | ||||||
|  |   .item { | ||||||
|  |     border-bottom: 1px dashed #ebeef5; | ||||||
|  | 
 | ||||||
|  |     &:first-child { | ||||||
|  |       padding-top: 0; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     &:last-child { | ||||||
|  |       border-bottom: none; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .flex { | ||||||
|  |   display: flex; | ||||||
|  |   align-items: center; | ||||||
|  | 
 | ||||||
|  |   div { | ||||||
|  |     flex: 1; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | </style> | ||||||
|  | @ -0,0 +1,153 @@ | ||||||
|  | <template> | ||||||
|  |   <div> | ||||||
|  |     <el-card> | ||||||
|  |       <el-form | ||||||
|  |         :model="searchForm" | ||||||
|  |         label-width="100px" | ||||||
|  |         @submit.prevent="fnResetPaginationTransfer" | ||||||
|  |       > | ||||||
|  |         <el-row> | ||||||
|  |           <el-col :span="6"> | ||||||
|  |             <el-form-item label="试卷名称:"> | ||||||
|  |               <el-input v-model="searchForm.KEYWORDS" placeholder="搜索" /> | ||||||
|  |             </el-form-item> | ||||||
|  |           </el-col> | ||||||
|  |           <el-col :span="6"> | ||||||
|  |             <el-form-item label="创建时间" prop="dates"> | ||||||
|  |               <el-date-picker | ||||||
|  |                 v-model="searchForm.dates" | ||||||
|  |                 value-format="YYYY-MM-DD" | ||||||
|  |                 format="YYYY-MM-DD" | ||||||
|  |                 type="daterange" | ||||||
|  |                 range-separator="至" | ||||||
|  |                 start-placeholder="开始日期" | ||||||
|  |                 end-placeholder="结束日期" | ||||||
|  |               /> | ||||||
|  |             </el-form-item> | ||||||
|  |           </el-col> | ||||||
|  |           <el-col :span="6"> | ||||||
|  |             <el-form-item label="满分:"> | ||||||
|  |               <el-input v-model="searchForm.EXAMSCORE" placeholder="满分" /> | ||||||
|  |             </el-form-item> | ||||||
|  |           </el-col> | ||||||
|  |           <el-col :span="6"> | ||||||
|  |             <el-form-item label-width="10px"> | ||||||
|  |               <el-button type="primary" native-type="submit">搜索</el-button> | ||||||
|  |               <el-button native-type="reset" @click="fnResetPaginationTransfer"> | ||||||
|  |                 重置 | ||||||
|  |               </el-button> | ||||||
|  |             </el-form-item> | ||||||
|  |           </el-col> | ||||||
|  |         </el-row> | ||||||
|  |       </el-form> | ||||||
|  |     </el-card> | ||||||
|  |     <layout-card> | ||||||
|  |       <layout-table | ||||||
|  |         ref="tableRef" | ||||||
|  |         v-model:pagination="pagination" | ||||||
|  |         :data="list" | ||||||
|  |         @get-data="fnGetDataTransfer" | ||||||
|  |       > | ||||||
|  |         <el-table-column label="序号" width="60" fixed="left"> | ||||||
|  |           <template #default="{ $index }"> | ||||||
|  |             {{ serialNumber(pagination, $index) }} | ||||||
|  |           </template> | ||||||
|  |         </el-table-column> | ||||||
|  |         <el-table-column prop="EXAMNAME" label="试卷名称" /> | ||||||
|  |         <el-table-column prop="CREATTIME" label="上传时间" align="center" /> | ||||||
|  |         <el-table-column prop="EXAMSCORE" label="满分" align="center" /> | ||||||
|  |         <el-table-column label="试卷类型" width="150"> | ||||||
|  |           <template #default="{ row }"> | ||||||
|  |             {{ translationStatus(row.SOURCETYPE, TypeOfTestPaperList) }} | ||||||
|  |           </template> | ||||||
|  |         </el-table-column> | ||||||
|  |         <el-table-column label="操作"> | ||||||
|  |           <template #default="{ row }"> | ||||||
|  |             <el-button | ||||||
|  |               type="text" | ||||||
|  |               @click=" | ||||||
|  |                 router.push({ | ||||||
|  |                   path: '/training_process_management/examdraft_management/edit', | ||||||
|  |                   query: { | ||||||
|  |                     STAGEEXAMPAPERINPUT_ID: row.STAGEEXAMPAPERINPUT_ID, | ||||||
|  |                   }, | ||||||
|  |                 }) | ||||||
|  |               " | ||||||
|  |               >编辑</el-button | ||||||
|  |             > | ||||||
|  |             <el-button type="text" @click="fnDelete(row.STAGEEXAMPAPERINPUT_ID)" | ||||||
|  |               >删除</el-button | ||||||
|  |             > | ||||||
|  |             <el-button | ||||||
|  |               type="text" | ||||||
|  |               @click="convertStageexam(row.STAGEEXAMPAPERINPUT_ID, '0')" | ||||||
|  |               >转成正式试卷</el-button | ||||||
|  |             > | ||||||
|  |           </template> | ||||||
|  |         </el-table-column> | ||||||
|  |       </layout-table> | ||||||
|  |     </layout-card> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  | <script setup> | ||||||
|  | import useListData from "@/assets/js/useListData.js"; | ||||||
|  | import { useRouter } from "vue-router"; | ||||||
|  | import { | ||||||
|  |   getExamdraftList, | ||||||
|  |   setstageexampaperCacheDelete, | ||||||
|  |   setstageexampaperCacheformal, | ||||||
|  | } from "@/request/training_process_management.js"; | ||||||
|  | import { serialNumber, translationStatus } from "@/assets/js/utils.js"; | ||||||
|  | import { debounce } from "throttle-debounce"; | ||||||
|  | import { ElMessage, ElMessageBox } from "element-plus"; | ||||||
|  | const router = useRouter(); | ||||||
|  | 
 | ||||||
|  | const TypeOfTestPaperList = [ | ||||||
|  |   { ID: "1", NAME: "平台试卷" }, | ||||||
|  |   { ID: "2", NAME: "自建试卷" }, | ||||||
|  | ]; | ||||||
|  | 
 | ||||||
|  | const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } = | ||||||
|  |   useListData(getExamdraftList); | ||||||
|  | 
 | ||||||
|  | const fnGetDataTransfer = () => { | ||||||
|  |   fnGetData({ | ||||||
|  |     STARTTIME: searchForm.value.dates?.[0], | ||||||
|  |     ENDTIME: searchForm.value.dates?.[1], | ||||||
|  |   }); | ||||||
|  | }; | ||||||
|  | const fnResetPaginationTransfer = () => { | ||||||
|  |   fnResetPagination({ | ||||||
|  |     STARTTIME: searchForm.value.dates?.[0], | ||||||
|  |     ENDTIME: searchForm.value.dates?.[1], | ||||||
|  |   }); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const fnDelete = debounce( | ||||||
|  |   1000, | ||||||
|  |   async (STAGEEXAMPAPERINPUT_ID) => { | ||||||
|  |     await ElMessageBox.confirm("确定要删除吗?", { | ||||||
|  |       type: "warning", | ||||||
|  |     }); | ||||||
|  |     await setstageexampaperCacheDelete({ STAGEEXAMPAPERINPUT_ID }); | ||||||
|  |     ElMessage.success("删除成功"); | ||||||
|  |     fnResetPaginationTransfer(); | ||||||
|  |   }, | ||||||
|  |   { atBegin: true } | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | const convertStageexam = debounce( | ||||||
|  |   1000, | ||||||
|  |   async (STAGEEXAMPAPERINPUT_ID) => { | ||||||
|  |     await ElMessageBox.confirm("确定要转成正式试卷吗?", { | ||||||
|  |       type: "warning", | ||||||
|  |     }); | ||||||
|  |     await setstageexampaperCacheformal({ STAGEEXAMPAPERINPUT_ID }); | ||||||
|  |     ElMessage.success("转成正式试卷成功"); | ||||||
|  |     fnResetPaginationTransfer(); | ||||||
|  |   }, | ||||||
|  |   { atBegin: true } | ||||||
|  | ); | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style scoped lang="scss"></style> | ||||||
|  | @ -0,0 +1,362 @@ | ||||||
|  | <template> | ||||||
|  |   <div> | ||||||
|  |     <el-card> | ||||||
|  |       <el-form | ||||||
|  |         :model="searchForm" | ||||||
|  |         label-width="100px" | ||||||
|  |         @submit.prevent="fnResetPaginationTransfer" | ||||||
|  |       > | ||||||
|  |         <el-row> | ||||||
|  |           <el-col :span="6"> | ||||||
|  |             <el-form-item label="学员姓名" prop="STUDENT_NAME"> | ||||||
|  |               <el-input v-model="searchForm.STUDENT_NAME" /> | ||||||
|  |             </el-form-item> | ||||||
|  |           </el-col> | ||||||
|  |           <el-col :span="6"> | ||||||
|  |             <el-form-item label="班级编码" prop="CODE"> | ||||||
|  |               <el-input v-model="searchForm.CODE" /> | ||||||
|  |             </el-form-item> | ||||||
|  |           </el-col> | ||||||
|  |           <el-col :span="6"> | ||||||
|  |             <el-form-item label="班级名称" prop="KEYWORDS"> | ||||||
|  |               <el-input v-model="searchForm.KEYWORDS" /> | ||||||
|  |             </el-form-item> | ||||||
|  |           </el-col> | ||||||
|  |           <el-col :span="6"> | ||||||
|  |             <el-form-item label="开始时间" prop="TIME"> | ||||||
|  |               <el-date-picker | ||||||
|  |                 v-model="searchForm.TIME" | ||||||
|  |                 value-format="YYYY-MM-DD" | ||||||
|  |                 format="YYYY-MM-DD" | ||||||
|  |                 type="daterange" | ||||||
|  |                 range-separator="至" | ||||||
|  |                 start-placeholder="开始日期" | ||||||
|  |                 end-placeholder="结束日期" | ||||||
|  |               /> | ||||||
|  |             </el-form-item> | ||||||
|  |           </el-col> | ||||||
|  |           <el-col :span="6"> | ||||||
|  |             <el-form-item label="结束时间" prop="TIME1"> | ||||||
|  |               <el-date-picker | ||||||
|  |                 v-model="searchForm.TIME1" | ||||||
|  |                 value-format="YYYY-MM-DD" | ||||||
|  |                 format="YYYY-MM-DD" | ||||||
|  |                 type="daterange" | ||||||
|  |                 range-separator="至" | ||||||
|  |                 start-placeholder="开始日期" | ||||||
|  |                 end-placeholder="结束日期" | ||||||
|  |               /> | ||||||
|  |             </el-form-item> | ||||||
|  |           </el-col> | ||||||
|  |           <el-col :span="6"> | ||||||
|  |             <el-form-item label="入班时间" prop="TIME2"> | ||||||
|  |               <el-date-picker | ||||||
|  |                 v-model="searchForm.TIME2" | ||||||
|  |                 value-format="YYYY-MM-DD" | ||||||
|  |                 format="YYYY-MM-DD" | ||||||
|  |                 type="daterange" | ||||||
|  |                 range-separator="至" | ||||||
|  |                 start-placeholder="开始日期" | ||||||
|  |                 end-placeholder="结束日期" | ||||||
|  |               /> | ||||||
|  |             </el-form-item> | ||||||
|  |           </el-col> | ||||||
|  |           <el-col :span="6"> | ||||||
|  |             <el-form-item label="学习状态" prop="STUDYSTATE"> | ||||||
|  |               <el-select v-model="searchForm.STUDYSTATE"> | ||||||
|  |                 <el-option | ||||||
|  |                   v-for="item in studyStateList" | ||||||
|  |                   :key="item.ID" | ||||||
|  |                   :value="item.ID" | ||||||
|  |                   :label="item.NAME" | ||||||
|  |                 /> | ||||||
|  |               </el-select> | ||||||
|  |             </el-form-item> | ||||||
|  |           </el-col> | ||||||
|  |           <el-col :span="6"> | ||||||
|  |             <el-form-item label="考试状态" prop="STAGEEXAMSTATE"> | ||||||
|  |               <el-select v-model="searchForm.STAGEEXAMSTATE"> | ||||||
|  |                 <el-option | ||||||
|  |                   v-for="item in stageExamStateList" | ||||||
|  |                   :key="item.ID" | ||||||
|  |                   :value="item.ID" | ||||||
|  |                   :label="item.NAME" | ||||||
|  |                 /> | ||||||
|  |               </el-select> | ||||||
|  |             </el-form-item> | ||||||
|  |           </el-col> | ||||||
|  |           <el-col :span="6"> | ||||||
|  |             <el-form-item label-width="10px"> | ||||||
|  |               <el-button type="primary" native-type="submit">搜索</el-button> | ||||||
|  |               <el-button native-type="reset" @click="fnResetPaginationTransfer"> | ||||||
|  |                 重置 | ||||||
|  |               </el-button> | ||||||
|  |             </el-form-item> | ||||||
|  |           </el-col> | ||||||
|  |         </el-row> | ||||||
|  |       </el-form> | ||||||
|  |     </el-card> | ||||||
|  | 
 | ||||||
|  |     <layout-card> | ||||||
|  |       <div class="table_btn"> | ||||||
|  |         <el-button type="primary" @click="fnStudentRecords" | ||||||
|  |           >导出学员信息</el-button | ||||||
|  |         > | ||||||
|  |       </div> | ||||||
|  |       <layout-table | ||||||
|  |         ref="tableRef" | ||||||
|  |         v-model:pagination="pagination" | ||||||
|  |         :data="list" | ||||||
|  |         @get-data="fnGetDataTransfer" | ||||||
|  |       > | ||||||
|  |         <el-table-column label="序号" width="60" fixed="left"> | ||||||
|  |           <template #default="{ $index }"> | ||||||
|  |             {{ serialNumber(pagination, $index) }} | ||||||
|  |           </template> | ||||||
|  |         </el-table-column> | ||||||
|  |         <el-table-column | ||||||
|  |           label="学员姓名" | ||||||
|  |           prop="STUDENT_NAME" | ||||||
|  |           show-overflow-tooltip | ||||||
|  |           fixed="left" | ||||||
|  |         /> | ||||||
|  |         <el-table-column | ||||||
|  |           label="身份证号" | ||||||
|  |           prop="USER_ID_CARD" | ||||||
|  |           show-overflow-tooltip | ||||||
|  |           fixed="left" | ||||||
|  |           width="150" | ||||||
|  |         /> | ||||||
|  |         <el-table-column | ||||||
|  |           label="班级名称" | ||||||
|  |           prop="CLASS_NAME" | ||||||
|  |           show-overflow-tooltip | ||||||
|  |           width="150" | ||||||
|  |         /> | ||||||
|  |         <el-table-column | ||||||
|  |           label="班级编码" | ||||||
|  |           prop="CODE" | ||||||
|  |           show-overflow-tooltip | ||||||
|  |           width="150" | ||||||
|  |         /> | ||||||
|  |         <el-table-column | ||||||
|  |           label="部门" | ||||||
|  |           prop="DEPARTMENT_NAME" | ||||||
|  |           show-overflow-tooltip | ||||||
|  |           width="200" | ||||||
|  |         /> | ||||||
|  |         <el-table-column | ||||||
|  |           label="工种" | ||||||
|  |           prop="POST_NAME" | ||||||
|  |           show-overflow-tooltip | ||||||
|  |           width="150" | ||||||
|  |         /> | ||||||
|  |         <el-table-column | ||||||
|  |           show-overflow-tooltip | ||||||
|  |           prop="START_TIME" | ||||||
|  |           label="培训开始时间" | ||||||
|  |           width="200" | ||||||
|  |         /> | ||||||
|  |         <el-table-column | ||||||
|  |           show-overflow-tooltip | ||||||
|  |           prop="END_TIME" | ||||||
|  |           label="培训结束时间" | ||||||
|  |           align="center" | ||||||
|  |           width="100" | ||||||
|  |         /> | ||||||
|  |         <el-table-column | ||||||
|  |           show-overflow-tooltip | ||||||
|  |           prop="CREATTIME" | ||||||
|  |           label="入班时间" | ||||||
|  |           align="center" | ||||||
|  |           width="100" | ||||||
|  |         /> | ||||||
|  |         <el-table-column | ||||||
|  |           show-overflow-tooltip | ||||||
|  |           prop="CURRICULUMNAME" | ||||||
|  |           label="培训课程" | ||||||
|  |           align="center" | ||||||
|  |           width="200" | ||||||
|  |         /> | ||||||
|  |         <el-table-column | ||||||
|  |           show-overflow-tooltip | ||||||
|  |           prop="ALL_CLASSHOUR" | ||||||
|  |           label="要求学时" | ||||||
|  |           align="center" | ||||||
|  |           width="100" | ||||||
|  |         /> | ||||||
|  |         <el-table-column | ||||||
|  |           show-overflow-tooltip | ||||||
|  |           prop="COMPLETE_CLASSHOUR" | ||||||
|  |           label="已完成学时" | ||||||
|  |           align="center" | ||||||
|  |           width="100" | ||||||
|  |         /> | ||||||
|  |         <el-table-column label="学习状态" width="150"> | ||||||
|  |           <template #default="{ row }"> | ||||||
|  |             {{ translationStatus(row.STUDYSTATE, studyStateList) }} | ||||||
|  |           </template> | ||||||
|  |         </el-table-column> | ||||||
|  | 
 | ||||||
|  |         <el-table-column label="考试状态" width="150"> | ||||||
|  |           <template #default="{ row }"> | ||||||
|  |             {{ translationStatus(row.STAGEEXAMSTATE, stageExamStateList) }} | ||||||
|  |           </template> | ||||||
|  |         </el-table-column> | ||||||
|  |         <el-table-column prop="EXAMSCORE" label="考试分数" width="100" /> | ||||||
|  |         <el-table-column label="任务状态" width="150"> | ||||||
|  |           <template #default="{ row }"> | ||||||
|  |             {{ translationStatus(row.STATE, taskStatusList) }} | ||||||
|  |           </template> | ||||||
|  |         </el-table-column> | ||||||
|  |       </layout-table> | ||||||
|  |     </layout-card> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script setup> | ||||||
|  | import useListData from "@/assets/js/useListData.js"; | ||||||
|  | import { serialNumber, translationStatus } from "@/assets/js/utils.js"; | ||||||
|  | import { | ||||||
|  |   getTrainingProgressListExportStudentRecords, | ||||||
|  |   getTrainingProgressList, | ||||||
|  | } from "@/request/training_process_management.js"; | ||||||
|  | import { ElMessage, ElMessageBox } from "element-plus"; | ||||||
|  | import * as XLSX from "xlsx"; | ||||||
|  | const studyStateList = [ | ||||||
|  |   { ID: "0", NAME: "未学习" }, | ||||||
|  |   { ID: "1", NAME: "学习中" }, | ||||||
|  |   { ID: "2", NAME: "已学完" }, | ||||||
|  |   { ID: "3", NAME: "已完成" }, | ||||||
|  |   { ID: "4", NAME: "未完成" }, | ||||||
|  |   { ID: "5", NAME: "待评估" }, | ||||||
|  |   { ID: "6", NAME: "评估未合格" }, | ||||||
|  | ]; | ||||||
|  | const stageExamStateList = [ | ||||||
|  |   { ID: "0", NAME: "不考试" }, | ||||||
|  |   { ID: "1", NAME: "待考试" }, | ||||||
|  |   { ID: "2", NAME: "考试未通过" }, | ||||||
|  |   { ID: "3", NAME: "考试通过" }, | ||||||
|  |   { ID: "4", NAME: "未参加" }, | ||||||
|  | ]; | ||||||
|  | const taskStatusList = [ | ||||||
|  |   { ID: "1", NAME: "未申请" }, | ||||||
|  |   { ID: "4", NAME: "待开班" }, | ||||||
|  |   { ID: "5", NAME: "培训中" }, | ||||||
|  |   { ID: "6", NAME: "培训结束" }, | ||||||
|  | ]; | ||||||
|  | const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } = | ||||||
|  |   useListData(getTrainingProgressList); | ||||||
|  | const fnGetDataTransfer = () => { | ||||||
|  |   fnGetData({ | ||||||
|  |     STARTTIME: searchForm.value.TIME?.[0], | ||||||
|  |     ENDTIME: searchForm.value.TIME?.[1], | ||||||
|  |     OVERSTARTTIME: searchForm.value.TIME1?.[0], | ||||||
|  |     OVERENDTIME: searchForm.value.TIME1?.[1], | ||||||
|  |     CREATESTARTTIME: searchForm.value.TIME2?.[0], | ||||||
|  |     CREATENDTIME: searchForm.value.TIME2?.[1], | ||||||
|  |   }); | ||||||
|  | }; | ||||||
|  | const fnResetPaginationTransfer = () => { | ||||||
|  |   fnResetPagination({ | ||||||
|  |     STARTTIME: searchForm.value.TIME?.[0], | ||||||
|  |     ENDTIME: searchForm.value.TIME?.[1], | ||||||
|  |     OVERSTARTTIME: searchForm.value.TIME1?.[0], | ||||||
|  |     OVERENDTIME: searchForm.value.TIME1?.[1], | ||||||
|  |     CREATESTARTTIME: searchForm.value.TIME2?.[0], | ||||||
|  |     CREATENDTIME: searchForm.value.TIME2?.[1], | ||||||
|  |   }); | ||||||
|  | }; | ||||||
|  | const fnStudentRecords = async () => { | ||||||
|  |   await ElMessageBox.confirm("确定要导出查询出来所有的学员信息?", { | ||||||
|  |     type: "warning", | ||||||
|  |   }); | ||||||
|  |   const resData = await getTrainingProgressListExportStudentRecords({ | ||||||
|  |     ...searchForm.value, | ||||||
|  |     STARTTIME: searchForm.value.TIME?.[0], | ||||||
|  |     ENDTIME: searchForm.value.TIME?.[1], | ||||||
|  |     OVERSTARTTIME: searchForm.value.TIME1?.[0], | ||||||
|  |     OVERENDTIME: searchForm.value.TIME1?.[1], | ||||||
|  |     CREATESTARTTIME: searchForm.value.TIME2?.[0], | ||||||
|  |     CREATENDTIME: searchForm.value.TIME2?.[1], | ||||||
|  |   }); | ||||||
|  |   if (resData.varList.length > 0) fnExportStudentRecords(resData.varList); | ||||||
|  |   else ElMessage.warning("没有学员信息"); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const fnExportStudentRecords = (list) => { | ||||||
|  |   const tableData = [ | ||||||
|  |     [ | ||||||
|  |       "序号", | ||||||
|  |       "学员姓名", | ||||||
|  |       "身份证号", | ||||||
|  |       "班级名称", | ||||||
|  |       "班级编码", | ||||||
|  |       "部门", | ||||||
|  |       "工种", | ||||||
|  |       "培训开始时间", | ||||||
|  |       "培训结束时间", | ||||||
|  |       "入班时间", | ||||||
|  |       "培训课程", | ||||||
|  |       "要求学时", | ||||||
|  |       "已完成学时", | ||||||
|  |       "学习状态", | ||||||
|  |       "考试状态", | ||||||
|  |       "考试分数", | ||||||
|  |       "任务状态", | ||||||
|  |     ], | ||||||
|  |   ]; | ||||||
|  |   list.forEach((item, index) => { | ||||||
|  |     for (let i = 0; i < studyStateList.length; i++) { | ||||||
|  |       if (studyStateList[i].ID === item.STUDYSTATE) { | ||||||
|  |         item.STUDYSTATE = studyStateList[i].NAME; | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     for (let i = 0; i < stageExamStateList.length; i++) { | ||||||
|  |       if (stageExamStateList[i].ID === item.STAGEEXAMSTATE) { | ||||||
|  |         item.STAGEEXAMSTATE = stageExamStateList[i].NAME; | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     for (let i = 0; i < taskStatusList.length; i++) { | ||||||
|  |       if (taskStatusList[i].ID === item.STATE) { | ||||||
|  |         item.STATE = taskStatusList[i].NAME; | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if (item.COMPLETE_CLASSHOUR === "0.0") item.COMPLETE_CLASSHOUR = "0"; | ||||||
|  |     if (item.ALL_CLASSHOUR === "0.0") item.ALL_CLASSHOUR = "0"; | ||||||
|  |     tableData.push([ | ||||||
|  |       index + 1, | ||||||
|  |       item.STUDENT_NAME, | ||||||
|  |       item.USER_ID_CARD, | ||||||
|  |       item.CLASS_NAME, | ||||||
|  |       item.CODE, | ||||||
|  |       item.DEPARTMENT_NAME, | ||||||
|  |       item.POST_NAME, | ||||||
|  |       item.START_TIME, | ||||||
|  |       item.END_TIME, | ||||||
|  |       item.CREATTIME, | ||||||
|  |       item.CURRICULUMNAME, | ||||||
|  |       item.ALL_CLASSHOUR, | ||||||
|  |       item.COMPLETE_CLASSHOUR, | ||||||
|  |       item.STUDYSTATE, | ||||||
|  |       item.STAGEEXAMSTATE, | ||||||
|  |       item.EXAMSCORE, | ||||||
|  |       item.STATE, | ||||||
|  |     ]); | ||||||
|  |   }); | ||||||
|  |   const ws = XLSX.utils.aoa_to_sheet(tableData); | ||||||
|  |   const wb = XLSX.utils.book_new(); | ||||||
|  |   XLSX.utils.book_append_sheet(wb, ws, "学员信息统计"); | ||||||
|  |   XLSX.writeFile(wb, "学员信息统计表.xlsx"); | ||||||
|  |   ElMessage.success("导出成功"); | ||||||
|  | }; | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style scoped lang="scss"> | ||||||
|  | .table_btn { | ||||||
|  |   margin-bottom: 20px; | ||||||
|  | } | ||||||
|  | </style> | ||||||
		Loading…
	
		Reference in New Issue