import React, { useEffect, useRef, useState } from 'react'; import { history, useParams, useRequest } from 'umi'; import { ModalForm, ProFormInstance } from '@ant-design/pro-form'; import { ProFormRadio } from '@ant-design/pro-form'; import ProForm, { StepsForm, ProFormText, ProFormDatePicker, ProFormSelect, ProFormTextArea, ProFormCheckbox, ProFormDateRangePicker, } from '@ant-design/pro-form'; import ProCard from '@ant-design/pro-card'; import { Button, Checkbox, Col, Divider, Dropdown, Form, Input, List, Menu, message, Modal, Radio, Row, Space, Table, Typography, Upload } from 'antd'; import { PageContainer } from '@ant-design/pro-layout'; import ProDescriptions from '@ant-design/pro-descriptions'; import styles from './index.less' import { saveRules, querySubjectList, queryRulesView, queryTempQuestionList, saveQuestionTypeScore, queryRulesPaper, updateScore } from '../../service'; import { queryCourseView } from '@/pages/course/option/service'; import { queryQuestionList, queryQuestionById, queryQuestionType } from '@/pages/questionbank/service'; import { PlusOutlined, DownOutlined, DeleteOutlined, DownloadOutlined, UploadOutlined, EyeInvisibleOutlined, EyeOutlined, EditOutlined, ArrowDownOutlined, ArrowUpOutlined } from '@ant-design/icons'; import ProList from '@ant-design/pro-list'; import { autoPaper, manualPaper, updatePaper } from '../service'; import ProTable, { EditableProTable } from '@ant-design/pro-table'; import QuestionSelector from '../../components/QuestionSelector'; import ScoreSetter from '../../components/ScoreSetter'; import AutoSelector from '../components/AutoSelector'; import { ConsoleMessage } from 'puppeteer-core'; import { getSubjectInfo } from '@/pages/course/subject/service'; import { forEach } from 'lodash'; /** * 保存选题 * * @param values */ const handleAppend = async (rules_id: number, rows: any[]) => { const hide = message.loading('正在添加'); try { const questions: { question_id: any; }[] = []; rows?.forEach((item)=>{ questions.push({question_id: item?.id}) }) const _data = await manualPaper({ question_count: questions?.length || 0, questions: JSON.stringify(questions), rules_id: Number(rules_id) }); hide(); message.success('添加成功'); return _data; } catch (error) { hide(); message.error('添加失败请重试!'); return false; } }; /** * 保存选题试卷 * * @param values */ const handleUpdatePaper = async ( rules_id: number, paper_uuid: number, paper_id: number) => { const hide = message.loading('正在保存'); try { const _data = { rules_id: Number(rules_id), paper_uuid: paper_uuid, paper_id: paper_id } if(paper_id === 0){ delete _data.paper_id; } await updatePaper(_data); hide(); message.success('保存成功'); return true; } catch (error) { hide(); message.error('保存失败请重试!'); return false; } }; const labels = ['A','B','C','D','E','F','G','H','I','J','K'] // 模拟考试规则维护 export default () => { const [selectorModalVisible, handleSelectorModalVisible] = useState(false); const [scoreModalVisible, handleScoreModalVisible] = useState(false); const [autoModalVisible, handleAutoModalVisible] = useState(false); const [subjectId, setSubjectId] = useState(0); // 关联主题id const [subjectName, setSubjectName] = useState(''); // 关联主题name const [questionTypeValues, setQuestionTypeValues] = useState([]); // 题型数据[{count:0, score:0, score_harf:0}] const [uuidPaper, setUuidPaper] = useState(0); const [createType, setCreateType] = useState(1); // 组卷类型 const [rulesName, setRulesName] = useState(''); // 组卷类型 const [sumScore, setSumScore] = useState(0); // 总分 const [passScore, setPassScore] = useState(0); // 通过分数线 const [typeQuestionCount, setTypeQuestionCount] = useState([0, 0, 0]); // 临时卷 各题型数量 const formRef = useRef(); const selectorRef = useRef(); const setterRef = useRef(); const autoRef = useRef(); const [currentStep, setCurrentStep] = useState(0); const params = useParams(); const [questionType, setQuestionType] = useState([]); // 题型 const [scoreValues, SetscoreValues] = useState([]); // 分值 [{"question_type": "0","score": "3","score_harf": "0"},] const [paperInfo, setPaperInfo] = useState({}) /** 获取题型 */ const { data: questionTypeData } = useRequest(() => { return queryQuestionType(); },{ formatResult: (result) => { return result.list; } }); useEffect(() => { setQuestionType(questionTypeData || []); return ()=>{ /** 退出当前页面清空Map */ //parsingMap.clear(); } }, [questionTypeData]); /** 组卷,查询试题临时表(当前选题列表) */ const { data: questions, run } = useRequest(async (params) => { console.log('questions', questions) const _data = await queryTempQuestionList(params); return _data; },{ manual: true, formatResult: (result) => { return result?.table_List; }}); /** 从临时表中计算各题型数量 */ useEffect(() => { let _data = [0, 0, 0]; // 当前仅支持 单选 / 多选 / 判断 的顺序 console.log('questions-info', questions) questions?.forEach((item)=>{ _data[Number(item?.question_type)] += 1 }) setTypeQuestionCount(_data); return ()=>{ /** 退出当前页面清空Map */ //parsingMap.clear(); } }, [questions]); // const { data: paperData, run: runPaper } = useRequest(async (params) => { console.log('paperData', paperData) /** * rules_id: params?.id, page_number: value.current, page_size: value.pageSize */ return queryRulesPaper(params); },{ manual: true, formatResult: (result) => { return result?.question_list; }}); useEffect(() => { console.log('paperData2', paperData) if(paperData?.length > 0){ console.log('paperData[0]', paperData[0]) setPaperInfo(paperData[0]) } console.log('PaperInfo', paperInfo) }, [paperData]); console.log(params, 'params'); let ruleData = {} if (params?.id) { //console.log(JSON.stringify(params), "878"); const { data } = useRequest(async () => { return queryRulesView(params); },{ formatResult: (result) => { return result?.bean; }}); ruleData = data } console.log(ruleData, 'ruleData'); return ( formRef={formRef} onFinish={async (e) => { message.success('提交成功'); }} formProps={{ layout: "horizontal", labelCol: { span: 8 }, wrapperCol: { span: 12 }, validateMessages: { required: '此项为必填项', }, }} > name="base" title="模拟考试基本信息" stepProps={{ description: false, }} onFinish={async (fileds) => { if (params?.id) { fileds = { ...fileds, id: params.id } } await saveRules({ ...fileds, b_use: 0, rules_type: 0, }); //run({paper_uuid:1}); // 获取当前选题列表 // console.log('模拟考试基本信息', fileds) setSubjectId(fileds?.subject_id) // 设置当前关联主题 setRulesName(fileds?.rules_name) // 设置模拟考试规则名称 console.log('fileds', fileds) console.log('formRef', formRef.current?.getFieldValue('')) // await waitTime(2000); setCurrentStep(1) // 设置步骤号 return true; }} > {ruleData && ( <> { return querySubjectList().then(({ data }) => { console.log(data, 'querySubjectList') return data.list.map((item) => { if(item?.subject_id === ruleData?.subject_id){ setSubjectName(item?.subject_name) // 设置关联主题名称 console.log('label::', item?.subject_name) } return { label: item?.subject_name, value: item?.subject_id, }; }); }); }} onChange={(value)=>{ console.log('on change', value) }} rules={[{ required: true, message: '请选择主题' }]} name="subject_id" label="关联主题" /> )} name="object" title="组卷" stepProps={{ description: false, }} onFinish={async () => { console.log(formRef.current?.getFieldsValue()); setCurrentStep(2) // 设置步骤号 runPaper({rules_id: params?.id }) return true; }} >
{rulesName} {/** 一旦录入另一项将禁用,清空组卷后可选另一项 */} { setCreateType(Number(e?.target?.value)) console.log('value', e?.target?.value) //handleAutoModalVisible(true); // 显示系统组卷窗口 }} style={{ marginBottom: 16, }}> 手动组卷 系统组卷 { questions && questions.map((item, idx)=>( item &&
{idx+1}. {item?.question_stem} {(item?.question_type === 0) && // 单选题
{item?.answers && item?.answers.map((anster, k)=>(
{anster?.is_true === '0' && {labels[k]} } {anster?.is_true === '1' && {labels[k]} } {anster?.answer}
))}
} {(item?.question_type === 1) && // 多选题
{item?.answers && item?.answers.map((anster, k)=>(
{anster?.is_true === '0' && {labels[k]} } {anster?.is_true === '1' && {labels[k]} } {anster?.answer}
))}
} {(item?.question_type === 2) && // 判断选题
{item?.answers && item?.answers.map((anster, k)=>(
{anster?.is_true === '0' && {labels[k]} } {anster?.is_true === '1' && {labels[k]} } {anster?.answer}
))}
}
))}
试卷信息与设置 共 { '-' } 题 { '-' } 分 { questionType.map((item)=>{ return {item?.name} 共 { typeQuestionCount[Number(item.code)] } 题 { '-' } 分 } )}
{ console.log(formRef.current?.getFieldsValue()); // 跳转到指定路由 history.push('/examinationrules/normal'); return true; }} > {currentStep === 2 && { const result = await queryRulesView(params) console.log('queryRulesView', result) const subjectInfo = await getSubjectInfo({subject_id: result.bean.subject_id}) console.log('subjectInfo', subjectInfo) return {data: {...result.bean, subject_name: subjectInfo.data.subject_name}}; }} extra={false} > (`${text} 分钟`)} /> { {/** 需要从试卷 或 临时试卷 中读取 需要处理 */} return 共 0 道题, {paperInfo?.sum_score} 分 单选: 0 道题 单选: 0 道题 单选: 0 道题 通过线 {paperInfo?.pass_score} 分 }} /> }
{ console.log('v::::', values.name); const rows = selectorRef?.current?.getSelectedRows() console.log('rows::::', rows); const {code, data: paper, msg} = await handleAppend(Number(params?.id), rows) console.log('paper', paper) setUuidPaper(paper?.paper_uuid) console.log('paper_uuid', paper?.paper_uuid) run({ paper_uuid: paper?.paper_uuid, page_size: 1000, page_number: 1 }); // 获取当前选题列表 // message.success('提交成功'); handleSelectorModalVisible(false) return true; }} > {selectorModalVisible && } { // 需要处理 //console.log('111') //const values = autoRef?.current?.getData() //console.log('2222') //const {code, data: paper, msg} = await autoPaper({rules_id: Number(params?.id), auto_param: JSON.stringify(values)}) //console.log('paper', paper) //setUuidPaper(paper?.paper_uuid) // message.success('提交成功'); handleAutoModalVisible(false) return true; }} > {autoModalVisible && } { console.log('typeQuestionCount', typeQuestionCount) const values = setterRef.current?.getData() // 获取题型分值数据 const passSocre = setterRef.current?.getValue() // 获取通过分数线 console.log('批量设置分值v::::2', values); // 题型分数 const {code, data: paper, msg} = await saveQuestionTypeScore({rules_id:Number(params?.id), type_score: JSON.stringify(values)}) // 总分及通过分 let _sumScore = 0; values?.forEach((item)=>{ console.log('item--',item) _sumScore += item?.score }) //console.log('_sumScore', _sumScore) //console.log('passScore',passScore) console.log('sumScore',sumScore) const {success} = await updateScore({rules_id:Number(params?.id), pass_socre: passSocre, sum_score: _sumScore}) setSumScore(_sumScore) console.log('paper', paper) // setUuidPaper(paper?.paper_uuid) // message.success('提交成功'); handleScoreModalVisible(false) return true; }} >
); };