import { useEffect, useState } from 'react'; import styles from './paper.module.less'; import { message, Button, Table, InputNumber, Spin, Modal, Select } from 'antd'; import { paper, question } from '../../../../api'; import type { ColumnsType } from 'antd/es/table'; import { PlusOutlined } from '@ant-design/icons'; import { useLocation, useNavigate } from 'react-router-dom'; import { BackBartment, SelectQuestion } from '../../../../compenents'; import { ExclamationCircleFilled } from '@ant-design/icons'; import { useTranslation } from 'react-i18next'; const { confirm } = Modal; // 难度选项 const levelOptions = [ { value: null, label: '不限' }, { value: 1, label: '简单' }, { value: 2, label: '中等' }, { value: 3, label: '困难' }, ]; interface DataType { id: React.Key; admin_id: number; category_id: number; created_at: string; deleted: number; name: string; q1: number; q2: number; q3: number; q4: number; q5: number; q6: number; sort: number; updated_at: string; } interface PropInterface { type: string; } export const RendomPaper: React.FC = ({ type }) => { const { t } = useTranslation(); const navigate = useNavigate(); const result = new URLSearchParams(useLocation().search); const [spinInit, setSpinInit] = useState(false); const [init, setInit] = useState(false); const [loading, setLoading] = useState(false); const [score, setScore] = useState(0); const [passScore, setPassScore] = useState(0); const [addQuestion, setAddQuestion] = useState(false); const [list, setList] = useState([]); const [questions, setQuestions] = useState([]); const [title, setTitle] = useState(String(result.get('title'))); const [cateId, setCateId] = useState(Number(result.get('cid'))); const [id, setId] = useState(Number(result.get('id'))); const [q1, setQ1] = useState(0); const [q2, setQ2] = useState(0); const [q3, setQ3] = useState(0); const [q4, setQ4] = useState(0); const [q5, setQ5] = useState(0); const [q6, setQ6] = useState(0); const [q1Score, setQ1Score] = useState(0); const [q2Score, setQ2Score] = useState(0); const [q3Score, setQ3Score] = useState(0); const [q4Score, setQ4Score] = useState(0); const [q5Score, setQ5Score] = useState(0); const [q6Score, setQ6Score] = useState(0); const [choice, setChoice] = useState({ number: 0, score: 0, level: null as number | null, knowledge_codes: '' as string, }); const [select, setSelect] = useState({ number: 0, score: 0, missed_score: 0, level: null as number | null, knowledge_codes: '' as string, }); const [input, setInput] = useState({ number: 0, score: 0, level: null as number | null, knowledge_codes: '' as string, }); const [judge, setJudge] = useState({ number: 0, score: 0, level: null as number | null, knowledge_codes: '' as string, }); const [qa, setQa] = useState({ number: 0, score: 0, level: null as number | null, knowledge_codes: '' as string, }); const [cap, setCap] = useState({ number: 0, score: 0, missed_score: 0, level: null as number | null, knowledge_codes: '' as string, }); // 各题型的知识点选项 const [knowledgeOptions, setKnowledgeOptions] = useState>({ 1: [], 2: [], 3: [], 4: [], 5: [], 6: [], }); useEffect(() => { setCateId(Number(result.get('cid'))); setTitle(String(result.get('title'))); setId(Number(result.get('id'))); }, [result.get('cid'), result.get('title'), result.get('id')]); // 根据题库、题型、难度加载知识点列表 const loadKnowledgeCodes = async (type: number, level: number | null) => { if (questions.length === 0) return; try { const res: any = await question.getKnowledgeCodes(questions.join(','), type, level); const items = res.data || []; // 后端返回 [{code: "xxx", name: "yyy"}, ...] const options = items.map((item: { code: string; name: string }) => ({ value: item.code, label: item.name, })); setKnowledgeOptions((prev) => ({ ...prev, [type]: options })); } catch (e) { console.error('加载知识点失败', e); } }; useEffect(() => { if (id === 0) { return; } if (id > 0) { setSpinInit(true); getDetail(); } }, [id]); useEffect(() => { getQuestionList(); }, [questions]); useEffect(() => { if (list.length > 0) { let num1 = 0; let num2 = 0; let num3 = 0; let num4 = 0; let num5 = 0; let num6 = 0; list.map((item: any) => { num1 += Number(item.q1); num2 += Number(item.q2); num3 += Number(item.q3); num4 += Number(item.q4); num5 += Number(item.q5); num6 += Number(item.q6); }); setQ1(num1); setQ2(num2); setQ3(num3); setQ4(num4); setQ5(num5); setQ6(num6); } }, [list]); useEffect(() => { if (choice.number > 0 && choice.score > 0) { const value = choice.number * choice.score; setQ1Score(value); } else { setQ1Score(0); } if (select.number > 0 && select.score > 0) { const value = select.number * select.score; setQ2Score(value); } else { setQ2Score(0); } if (input.number > 0 && input.score > 0) { const value = input.number * input.score; setQ3Score(value); } else { setQ3Score(0); } if (judge.number > 0 && judge.score > 0) { const value = judge.number * judge.score; setQ4Score(value); } else { setQ4Score(0); } if (qa.number > 0 && qa.score > 0) { const value = qa.number * qa.score; setQ5Score(value); } else { setQ5Score(0); } if (cap.number > 0 && cap.score > 0) { const value = cap.number * cap.score; setQ6Score(value); } else { setQ6Score(0); } }, [choice, select, input, judge, qa, cap]); useEffect(() => { const value = q1Score + q2Score + q3Score + q4Score + q5Score + q6Score; setScore(value); }, [q1Score, q2Score, q3Score, q4Score, q5Score, q6Score]); const getDetail = () => { paper.detail(id).then((res: any) => { setPassScore(res.data.result.pass_score); const data = JSON.parse(res.data.result.extra); const arr = data.d.random_rules.source.category_ids; if (arr.length > 0) { setQuestions(arr); } const score = data.d.random_rules.score; if (score[1]) { setChoice({ number: score[1].number, score: score[1].score, level: score[1].level || null, knowledge_codes: score[1].knowledge_codes || '', }); } if (score[2]) { setSelect({ number: score[2].number, score: score[2].score, missed_score: score[2].missed_score, level: score[2].level || null, knowledge_codes: score[2].knowledge_codes || '', }); } if (score[3]) { setInput({ number: score[3].number, score: score[3].score, level: score[3].level || null, knowledge_codes: score[3].knowledge_codes || '', }); } if (score[4]) { setJudge({ number: score[4].number, score: score[4].score, level: score[4].level || null, knowledge_codes: score[4].knowledge_codes || '', }); } if (score[5]) { setQa({ number: score[5].number, score: score[5].score, level: score[5].level || null, knowledge_codes: score[5].knowledge_codes || '', }); } if (score[6]) { setCap({ number: score[6].number, score: score[6].score, missed_score: 0, level: score[6].level || null, knowledge_codes: score[6].knowledge_codes || '', }); } setSpinInit(false); setInit(false); // 预加载各题型的知识点选项(用于回显) if (arr.length > 0) { const categoryIds = arr.join(','); [1, 2, 3, 4, 5, 6].forEach((type) => { const typeScore = score[type]; if (typeScore && typeScore.knowledge_codes) { question .getKnowledgeCodes(categoryIds, type, typeScore.level || null) .then((res: any) => { const items = res.data || []; const options = items.map((item: { code: string; name: string }) => ({ value: item.code, label: item.name, })); setKnowledgeOptions((prev) => ({ ...prev, [type]: options })); }) .catch(() => {}); } }); } }); }; const getQuestionList = () => { if (init) { return; } if (questions.length === 0) { return; } setInit(true); paper .checkQuestionList(questions.join(',')) .then((res: any) => { setList(res.data.result); setInit(false); }) .catch((e) => { setInit(false); }); }; const columns: ColumnsType = [ { title: t('exam.question.columns.title1'), render: (_, record: any) => (
{record.name}
), }, { title: t('exam.question.choice.label'), width: 120, render: (_, record: any) => {record.q1}, }, { title: t('exam.question.select.label'), width: 120, render: (_, record: any) => {record.q2}, }, { title: t('exam.question.input.label'), width: 120, render: (_, record: any) => {record.q3}, }, { title: t('exam.question.judge.label'), width: 120, render: (_, record: any) => {record.q4}, }, { title: t('exam.question.qa.label'), width: 120, render: (_, record: any) => {record.q5}, }, { title: t('exam.question.cap.label'), width: 120, render: (_, record: any) => {record.q6}, }, { title: t('exam.question.columns.title4'), key: 'action', fixed: 'right', width: 120, render: (_, record) => ( ), }, ]; const delQuestion = (qid: number) => { confirm({ title: t('commen.confirmError'), icon: , content: t('exam.paper.compose.delText2'), centered: true, okText: t('commen.okText'), cancelText: t('commen.cancelText'), onOk() { const arr = [...questions]; const arr2 = [...list]; const key = arr.findIndex((i: any) => i === qid); if (key >= 0) { arr.splice(key, 1); arr2.splice(key, 1); } setQuestions(arr); setList(arr2); }, onCancel() { console.log('Cancel'); }, }); }; const selectQuestionData = (arr: any, data: any) => { setQuestions(arr); setAddQuestion(false); }; const submitHandle = () => { if (loading) { return; } if (questions.length === 0) { message.error(t('exam.paper.compose.errorText7')); return; } if ( choice.number === 0 && select.number === 0 && input.number === 0 && judge.number === 0 && qa.number === 0 && cap.number === 0 ) { message.error(t('exam.paper.compose.errorText8')); return; } if (choice.number > 0 && q1Score === 0) { message.error(t('exam.paper.compose.errorText9')); return; } if (select.number > 0 && q2Score === 0) { message.error(t('exam.paper.compose.errorText10')); return; } if (input.number > 0 && q3Score === 0) { message.error(t('exam.paper.compose.errorText11')); return; } if (judge.number > 0 && q4Score === 0) { message.error(t('exam.paper.compose.errorText12')); return; } if (qa.number > 0 && q5Score === 0) { message.error(t('exam.paper.compose.errorText13')); return; } if (cap.number > 0 && q6Score === 0) { message.error(t('exam.paper.compose.errorText14')); return; } if (score === 0) { message.error(t('exam.paper.compose.errorText15')); return; } if (passScore === 0) { message.error(t('exam.paper.compose.errorText3')); return; } const obj: any = {}; if (q1Score > 0) { obj[1] = choice; } if (q2Score > 0) { obj[2] = select; } if (q3Score > 0) { obj[3] = input; } if (q4Score > 0) { obj[4] = judge; } if (q5Score > 0) { obj[5] = qa; } if (q6Score > 0) { obj[6] = cap; } const params = { v: 'v1', d: { random_rules: { source: { category_ids: questions, }, score: obj, }, }, }; const extra = JSON.stringify(params); setLoading(true); paper.store(cateId, title, score, passScore, 1, extra).then((res: any) => { setLoading(false); message.success(t('commen.saveSuccess')); navigate(-1); }); }; const submitUpdateHandle = () => { if (loading) { return; } if (questions.length === 0) { message.error(t('exam.paper.compose.errorText7')); return; } if ( choice.number === 0 && select.number === 0 && input.number === 0 && judge.number === 0 && qa.number === 0 && cap.number === 0 ) { message.error(t('exam.paper.compose.errorText8')); return; } if (choice.number > 0 && q1Score === 0) { message.error(t('exam.paper.compose.errorText9')); return; } if (select.number > 0 && q2Score === 0) { message.error(t('exam.paper.compose.errorText10')); return; } if (input.number > 0 && q3Score === 0) { message.error(t('exam.paper.compose.errorText11')); return; } if (judge.number > 0 && q4Score === 0) { message.error(t('exam.paper.compose.errorText12')); return; } if (qa.number > 0 && q5Score === 0) { message.error(t('exam.paper.compose.errorText13')); return; } if (cap.number > 0 && q6Score === 0) { message.error(t('exam.paper.compose.errorText14')); return; } if (score === 0) { message.error(t('exam.paper.compose.errorText15')); return; } if (passScore === 0) { message.error(t('exam.paper.compose.errorText3')); return; } const obj: any = {}; if (q1Score > 0) { obj[1] = choice; } if (q2Score > 0) { obj[2] = select; } if (q3Score > 0) { obj[3] = input; } if (q4Score > 0) { obj[4] = judge; } if (q5Score > 0) { obj[5] = qa; } if (q6Score > 0) { obj[6] = cap; } const params = { v: 'v1', d: { random_rules: { source: { category_ids: questions, }, score: obj, }, }, }; const extra = JSON.stringify(params); setLoading(true); paper.questionUpdate(id, cateId, title, score, passScore, 1, extra).then((res: any) => { setLoading(false); message.success(t('commen.saveSuccess')); navigate(-1); }); }; return (
{t('exam.paper.compose.score')} {score}
{spinInit && (
)} {!spinInit && list.length > 0 ? ( <>
record.id} />
{q1 > 0 && (
* {t('exam.question.choice.label')}({t('exam.paper.compose.text1')} {q1} {t('exam.paper.compose.text2')}):
{t('exam.paper.compose.text3')} { const obj = { ...choice }; obj.number = Number(value); setChoice(obj); }} precision={0} size="large" className={styles['input']} > {t('exam.paper.compose.text2')}
{ const obj = { ...choice }; obj.score = Number(value); setChoice(obj); }} precision={0} size="large" className={styles['input']} > {t('exam.paper.compose.text4')}
难度 { const obj = { ...choice }; obj.knowledge_codes = values.join(','); setChoice(obj); }} maxTagCount="responsive" placeholder="不限" onFocus={() => loadKnowledgeCodes(1, choice.level)} />
{t('exam.paper.compose.text1')} {q1Score} {t('exam.paper.compose.text5')}
)} {q2 > 0 && (
* {t('exam.question.select.label')}({t('exam.paper.compose.text1')} {q2} {t('exam.paper.compose.text2')}):
{t('exam.paper.compose.text3')} { const obj = { ...select }; obj.number = Number(value); setSelect(obj); }} precision={0} size="large" className={styles['input']} > {t('exam.paper.compose.text2')}
{ const obj = { ...select }; obj.score = Number(value); setSelect(obj); }} precision={0} size="large" className={styles['input']} > {t('exam.paper.compose.text4')}
* {t('exam.paper.compose.text6')} { const obj = { ...select }; obj.missed_score = Number(value); setSelect(obj); }} precision={0} size="large" className={styles['input']} > {t('exam.paper.compose.text5')}
难度 { const obj = { ...select }; obj.knowledge_codes = values.join(','); setSelect(obj); }} maxTagCount="responsive" placeholder="不限" onFocus={() => loadKnowledgeCodes(2, select.level)} />
{t('exam.paper.compose.text1')} {q2Score} {t('exam.paper.compose.text5')}
)} {q3 > 0 && (
* {t('exam.question.input.label')}({t('exam.paper.compose.text1')} {q3} {t('exam.paper.compose.text2')}):
{t('exam.paper.compose.text3')} { const obj = { ...input }; obj.number = Number(value); setInput(obj); }} precision={0} size="large" className={styles['input']} > {t('exam.paper.compose.text2')}
{ const obj = { ...input }; obj.score = Number(value); setInput(obj); }} precision={0} size="large" className={styles['input']} > {t('exam.paper.compose.text4')}
难度 { const obj = { ...input }; obj.knowledge_codes = values.join(','); setInput(obj); }} maxTagCount="responsive" placeholder="不限" onFocus={() => loadKnowledgeCodes(3, input.level)} />
{t('exam.paper.compose.text1')} {q3Score} {t('exam.paper.compose.text5')}
)} {q4 > 0 && (
* {t('exam.question.judge.label')}({t('exam.paper.compose.text1')} {q4} {t('exam.paper.compose.text2')}):
{t('exam.paper.compose.text3')} { const obj = { ...judge }; obj.number = Number(value); setJudge(obj); }} precision={0} size="large" className={styles['input']} > {t('exam.paper.compose.text2')}
{ const obj = { ...judge }; obj.score = Number(value); setJudge(obj); }} precision={0} size="large" className={styles['input']} > {t('exam.paper.compose.text4')}
难度 { const obj = { ...judge }; obj.knowledge_codes = values.join(','); setJudge(obj); }} maxTagCount="responsive" placeholder="不限" onFocus={() => loadKnowledgeCodes(4, judge.level)} />
{t('exam.paper.compose.text1')} {q4Score} {t('exam.paper.compose.text5')}
)} {q5 > 0 && (
* {t('exam.question.qa.label')}({t('exam.paper.compose.text1')} {q5} {t('exam.paper.compose.text2')}):
{t('exam.paper.compose.text3')} { const obj = { ...qa }; obj.number = Number(value); setQa(obj); }} precision={0} size="large" className={styles['input']} > {t('exam.paper.compose.text2')}
{ const obj = { ...qa }; obj.score = Number(value); setQa(obj); }} precision={0} size="large" className={styles['input']} > {t('exam.paper.compose.text4')}
难度 { const obj = { ...qa }; obj.knowledge_codes = values.join(','); setQa(obj); }} maxTagCount="responsive" placeholder="不限" onFocus={() => loadKnowledgeCodes(5, qa.level)} />
{t('exam.paper.compose.text1')} {q5Score} {t('exam.paper.compose.text5')}
)} {q6 > 0 && (
* {t('exam.question.cap.label')}({t('exam.paper.compose.text1')} {q6} {t('exam.paper.compose.text2')}):
{t('exam.paper.compose.text3')} { const obj = { ...cap }; obj.number = Number(value); setCap(obj); }} precision={0} size="large" className={styles['input']} > {t('exam.paper.compose.text2')}
{ const obj = { ...cap }; obj.score = Number(value); setCap(obj); }} precision={0} size="large" className={styles['input']} > {t('exam.paper.compose.text4')}
难度 { const obj = { ...cap }; obj.knowledge_codes = values.join(','); setCap(obj); }} maxTagCount="responsive" placeholder="不限" onFocus={() => loadKnowledgeCodes(6, cap.level)} />
{t('exam.paper.compose.text1')} {q6Score} {t('exam.paper.compose.text5')}
)}
* {t('exam.paper.compose.text7')}
{ setPassScore(Number(value)); }} precision={0} size="large" className={styles['input']} > {t('exam.paper.compose.text5')}
{t('exam.paper.compose.score')} {score} {t('exam.paper.compose.text5')}
) : null} { setAddQuestion(false); }} onSelected={(arr: any, videos: any) => { selectQuestionData(arr, videos); }} > ); };