|
|
|
@ -3,7 +3,6 @@ import { Form, Input, Button, Radio, Checkbox, Select, message, Modal, Table } f |
|
|
|
|
import { getRandomQuestions, addExamPaper, editExamPaper, getExamPaperDetail, geIndustryQuestions} from 'api/examPaper'; |
|
|
|
|
import { getList ,findIndustry} from 'api/question'; |
|
|
|
|
import { dictionary } from "../../api/dict"; |
|
|
|
|
import TextArea from "antd/es/input/TextArea"; |
|
|
|
|
|
|
|
|
|
const { Option } = Select; |
|
|
|
|
|
|
|
|
@ -14,6 +13,7 @@ interface optionsState { |
|
|
|
|
|
|
|
|
|
interface QuestionState { |
|
|
|
|
id: string; |
|
|
|
|
industryId: string; |
|
|
|
|
serviceTypeId: string; |
|
|
|
|
questionTypes: string; |
|
|
|
|
questionContent: string; |
|
|
|
@ -35,7 +35,9 @@ interface States { |
|
|
|
|
selectedParams: any; |
|
|
|
|
selectedQuestionList: QuestionState[]; |
|
|
|
|
questionSelectList: QuestionState[]; |
|
|
|
|
selectedRowKeys: string[]; // 修改为存储 id 的数组
|
|
|
|
|
selectedRowKeys: string[]; |
|
|
|
|
skipValidation: boolean, |
|
|
|
|
questionCountSum: number |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
class ExamPaperAdd extends Component<any, States> { |
|
|
|
@ -59,7 +61,9 @@ class ExamPaperAdd extends Component<any, States> { |
|
|
|
|
selectedParams: {}, |
|
|
|
|
selectedQuestionList: [], |
|
|
|
|
questionSelectList: [], |
|
|
|
|
selectedRowKeys: [] |
|
|
|
|
selectedRowKeys: [], |
|
|
|
|
skipValidation: false, |
|
|
|
|
questionCountSum: 0 |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -101,10 +105,11 @@ class ExamPaperAdd extends Component<any, States> { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 试卷详情
|
|
|
|
|
handleGetDetail = (id: any) => { |
|
|
|
|
getExamPaperDetail(id).then((res: any) => { |
|
|
|
|
handleGetDetail = async (id: any) => { |
|
|
|
|
try { |
|
|
|
|
const res = await getExamPaperDetail(id); |
|
|
|
|
if (res.data) { |
|
|
|
|
const newQuestions: QuestionState[] = res.data.data.map((questionData: any) => { |
|
|
|
|
const newQuestions = res.data.data.map((questionData: any) => { |
|
|
|
|
const options = questionData.options.split(','); |
|
|
|
|
const answerOptions = options.map((option: any) => { |
|
|
|
|
const [value, label] = option.split('.'); |
|
|
|
@ -112,6 +117,7 @@ class ExamPaperAdd extends Component<any, States> { |
|
|
|
|
}); |
|
|
|
|
return { |
|
|
|
|
id: String(questionData.id), |
|
|
|
|
industryId: String(questionData.industryId), |
|
|
|
|
serviceTypeId: String(questionData.serviceTypeId), |
|
|
|
|
questionTypes: String(questionData.questionTypes), |
|
|
|
|
questionContent: String(questionData.questionContent), |
|
|
|
@ -120,6 +126,7 @@ class ExamPaperAdd extends Component<any, States> { |
|
|
|
|
}; |
|
|
|
|
}); |
|
|
|
|
this.setState({ questions: newQuestions }); |
|
|
|
|
|
|
|
|
|
const formValues = {}; |
|
|
|
|
formValues['paperName'] = res.data.head.paperName; |
|
|
|
|
formValues['industryId'] = String(res.data.head.industryId); |
|
|
|
@ -130,15 +137,29 @@ class ExamPaperAdd extends Component<any, States> { |
|
|
|
|
formValues['paperContent'] = res.data.head.paperContent.trim() === '' ? '' : res.data.head.paperContent; |
|
|
|
|
this.formRef.current.setFieldsValue(formValues); |
|
|
|
|
} |
|
|
|
|
}).catch(() => { |
|
|
|
|
|
|
|
|
|
let res1; |
|
|
|
|
if (res.data?.head?.industryId) { |
|
|
|
|
[res1] = await Promise.all([ |
|
|
|
|
geIndustryQuestions(res.data.head.industryId) |
|
|
|
|
]); |
|
|
|
|
if (res1.data) { |
|
|
|
|
this.setState({ questionCountSum: res1.data }); |
|
|
|
|
} else { |
|
|
|
|
this.setState({ questionCountSum: 0 }); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} catch (error) { |
|
|
|
|
message.error('获取题目详情失败,请重试'); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// 随机生成
|
|
|
|
|
handleRandomQuestion = () => { |
|
|
|
|
this.setState({ skipValidation: true }); |
|
|
|
|
this.formRef.current.validateFields(['industryId', 'questionCount']) |
|
|
|
|
.then((values: any) => { |
|
|
|
|
this.setState({ skipValidation: false }); |
|
|
|
|
const data = { |
|
|
|
|
industryId: values.industryId, |
|
|
|
|
questionCount: values.questionCount |
|
|
|
@ -159,6 +180,7 @@ class ExamPaperAdd extends Component<any, States> { |
|
|
|
|
}); |
|
|
|
|
return { |
|
|
|
|
id: String(questionData.id), |
|
|
|
|
industryId: String(questionData.industryId), |
|
|
|
|
serviceTypeId: String(questionData.serviceTypeId), |
|
|
|
|
questionTypes: String(questionData.questionTypes), |
|
|
|
|
questionContent: String(questionData.questionContent), |
|
|
|
@ -176,7 +198,9 @@ class ExamPaperAdd extends Component<any, States> { |
|
|
|
|
message.error('获取随机题目失败'); |
|
|
|
|
}); |
|
|
|
|
}) |
|
|
|
|
.catch(() => { }); |
|
|
|
|
.catch(() => { |
|
|
|
|
this.setState({ skipValidation: false }); |
|
|
|
|
}); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// 手动选题
|
|
|
|
@ -251,6 +275,7 @@ class ExamPaperAdd extends Component<any, States> { |
|
|
|
|
}); |
|
|
|
|
return { |
|
|
|
|
id: String(questionData.id), |
|
|
|
|
industryId: String(questionData.industryId), |
|
|
|
|
serviceTypeId: String(questionData.serviceTypeId), |
|
|
|
|
questionTypes: String(questionData.questionTypes), |
|
|
|
|
questionContent: String(questionData.questionContent), |
|
|
|
@ -292,67 +317,42 @@ class ExamPaperAdd extends Component<any, States> { |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// 保存试卷
|
|
|
|
|
handleSaveExamPaper = () => { |
|
|
|
|
handleSaveExamPaper = async () => { |
|
|
|
|
const { isEdit, id } = this.state; |
|
|
|
|
this.formRef.current.validateFields() |
|
|
|
|
.then((values: any) => { |
|
|
|
|
const { questions } = this.state; |
|
|
|
|
if (questions === null || questions.length === 0) { |
|
|
|
|
message.error('请选择题目'); |
|
|
|
|
return; |
|
|
|
|
try { |
|
|
|
|
const values = await this.formRef.current.validateFields(); |
|
|
|
|
const { questions } = this.state; |
|
|
|
|
if (questions === null || questions.length === 0) { |
|
|
|
|
message.error('请选择题目'); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
const questionIds = questions.map(question => question.id); |
|
|
|
|
const data = { |
|
|
|
|
...values, |
|
|
|
|
id, |
|
|
|
|
questionIds |
|
|
|
|
}; |
|
|
|
|
if (isEdit === 'true') { |
|
|
|
|
const res = await editExamPaper(data); |
|
|
|
|
const success = res["success"]; |
|
|
|
|
if (success) { |
|
|
|
|
message.success('试卷更新成功'); |
|
|
|
|
this.props.history.push('/examPaperList'); |
|
|
|
|
} else { |
|
|
|
|
message.error('试卷更新失败'); |
|
|
|
|
} |
|
|
|
|
const questionIds = questions.map(question => question.id); |
|
|
|
|
const data = { |
|
|
|
|
...values, |
|
|
|
|
id, |
|
|
|
|
questionIds |
|
|
|
|
}; |
|
|
|
|
if (isEdit === 'true') { |
|
|
|
|
editExamPaper(data) |
|
|
|
|
.then((res) => { |
|
|
|
|
const success = res["success"]; |
|
|
|
|
if (success) { |
|
|
|
|
message.success('试卷更新成功'); |
|
|
|
|
this.props.history.push('/examPaperList'); |
|
|
|
|
} else { |
|
|
|
|
message.error('试卷更新失败'); |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
.catch(() => { |
|
|
|
|
message.error('试卷更新时出错,请稍后重试'); |
|
|
|
|
}) |
|
|
|
|
} else { |
|
|
|
|
const res = await addExamPaper(data); |
|
|
|
|
const success = res["success"]; |
|
|
|
|
if (success) { |
|
|
|
|
message.success('试卷保存成功'); |
|
|
|
|
this.props.history.push('/examPaperList'); |
|
|
|
|
} else { |
|
|
|
|
addExamPaper(data) |
|
|
|
|
.then((res) => { |
|
|
|
|
const success = res["success"]; |
|
|
|
|
if (success) { |
|
|
|
|
message.success('试卷保存成功'); |
|
|
|
|
this.props.history.push('/examPaperList'); |
|
|
|
|
} else { |
|
|
|
|
message.error('试卷保存失败'); |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
.catch(() => { |
|
|
|
|
message.error('试卷保存时出错,请稍后重试'); |
|
|
|
|
}) |
|
|
|
|
message.error('试卷保存失败'); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// 题目数量
|
|
|
|
|
compareQuestionCount = async (industryId: string, questionCount: number) => { |
|
|
|
|
if (industryId === null || industryId === undefined || questionCount === null || questionCount === undefined) { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
const data = { |
|
|
|
|
industryId: industryId |
|
|
|
|
}; |
|
|
|
|
const res = await geIndustryQuestions(data); |
|
|
|
|
if (res.data) { |
|
|
|
|
const dbCount = res.data; |
|
|
|
|
return questionCount <= dbCount; |
|
|
|
|
} |
|
|
|
|
} catch (error) { |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
render() { |
|
|
|
@ -364,8 +364,11 @@ class ExamPaperAdd extends Component<any, States> { |
|
|
|
|
isModalVisible, |
|
|
|
|
selectedQuestionList, |
|
|
|
|
questionSelectList, |
|
|
|
|
selectedRowKeys |
|
|
|
|
selectedRowKeys, |
|
|
|
|
skipValidation, |
|
|
|
|
questionCountSum |
|
|
|
|
} = this.state; |
|
|
|
|
|
|
|
|
|
const changePage = (current: number, pageSize: number) => { |
|
|
|
|
setTimeout(() => { |
|
|
|
|
this.setState({ page: current, num: pageSize }); |
|
|
|
@ -375,6 +378,76 @@ class ExamPaperAdd extends Component<any, States> { |
|
|
|
|
const handleListQuestion = () => { |
|
|
|
|
this.props.history.push('/examPaperList'); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// 监管行业cahnge
|
|
|
|
|
const handleIndustryChange = async (industryId: string) => { |
|
|
|
|
let flag = true; |
|
|
|
|
let dbCount = 0; |
|
|
|
|
const errorMessages = []; |
|
|
|
|
const { questionCount } = this.formRef.current.getFieldsValue(); |
|
|
|
|
if (industryId) { |
|
|
|
|
const res = await geIndustryQuestions(industryId); |
|
|
|
|
if (res.data) { |
|
|
|
|
dbCount = res.data; |
|
|
|
|
} |
|
|
|
|
this.setState({ questionCountSum: dbCount }); |
|
|
|
|
|
|
|
|
|
if (questionCount) { |
|
|
|
|
if (questionCount > dbCount){ |
|
|
|
|
errorMessages.push('输入的题目数量大于该监管行业可获取的题目数量'); |
|
|
|
|
flag = false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const { questions } = this.state |
|
|
|
|
if (questions && questions.length !== 0) { |
|
|
|
|
if (Number(questionCount) !== questions.length) { |
|
|
|
|
errorMessages.push('输入的题目数量和试题详情数量不一致'); |
|
|
|
|
} |
|
|
|
|
flag = false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (flag){ |
|
|
|
|
this.formRef.current.setFields([{ |
|
|
|
|
name: 'questionCount', |
|
|
|
|
errors: [] |
|
|
|
|
}]); |
|
|
|
|
} else { |
|
|
|
|
this.formRef.current.setFields([{ |
|
|
|
|
name: 'questionCount', |
|
|
|
|
errors: errorMessages |
|
|
|
|
}]); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// 数量cahnge
|
|
|
|
|
const handleQuestionCountChange = async () => { |
|
|
|
|
let flag = true; |
|
|
|
|
const errorMessages = []; |
|
|
|
|
const { industryId } = this.formRef.current.getFieldsValue(); |
|
|
|
|
const { questions } = this.state |
|
|
|
|
if(industryId){ |
|
|
|
|
if (questions && questions.length !== 0 ) { |
|
|
|
|
if (industryId !== questions[0].industryId) { |
|
|
|
|
errorMessages.push('监管行业ID和题目列表中的监管行业ID不一致'); |
|
|
|
|
} |
|
|
|
|
flag = false; |
|
|
|
|
} |
|
|
|
|
if (flag){ |
|
|
|
|
this.formRef.current.setFields([{ |
|
|
|
|
name: 'industryId', |
|
|
|
|
errors: [] |
|
|
|
|
}]); |
|
|
|
|
} else { |
|
|
|
|
this.formRef.current.setFields([{ |
|
|
|
|
name: 'industryId', |
|
|
|
|
errors: errorMessages |
|
|
|
|
}]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const columns: any = [ |
|
|
|
|
{ title: '序号', dataIndex: 'index', align: 'center', width: 60, |
|
|
|
|
render: (_: number, __: number, index: number) => index + 1 |
|
|
|
@ -421,9 +494,33 @@ class ExamPaperAdd extends Component<any, States> { |
|
|
|
|
<Form.Item |
|
|
|
|
label="监管行业:" |
|
|
|
|
name={`industryId`} |
|
|
|
|
rules={[{ required: true, message: '请选择监管行业' }]} |
|
|
|
|
rules={[ |
|
|
|
|
{ required: true, message: '请选择监管行业' }, |
|
|
|
|
{ |
|
|
|
|
message: '监管行业ID和题目列表中的监管行业ID不一致', |
|
|
|
|
validator: async (_, value) => { |
|
|
|
|
if (!skipValidation) { |
|
|
|
|
try { |
|
|
|
|
const { questions } = this.state |
|
|
|
|
if (questions && questions.length !== 0 ) { |
|
|
|
|
if (value !== questions[0].industryId) { |
|
|
|
|
return Promise.reject(new Error('监管行业ID和题目列表中的监管行业ID不一致')); |
|
|
|
|
} |
|
|
|
|
return Promise.resolve(); |
|
|
|
|
} |
|
|
|
|
} catch (error) { |
|
|
|
|
return Promise.reject(new Error('校验监管行业ID时出错,请稍后重试')); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
]} |
|
|
|
|
> |
|
|
|
|
<Select placeholder="请选择监管行业" style={{ width: 240 }} allowClear> |
|
|
|
|
<Select placeholder="请选择监管行业" |
|
|
|
|
style={{ width: 240 }} |
|
|
|
|
allowClear |
|
|
|
|
onChange={handleIndustryChange} |
|
|
|
|
> |
|
|
|
|
{industryDict && industryDict.length > 0? ( |
|
|
|
|
(() => { |
|
|
|
|
let rows = []; |
|
|
|
@ -449,17 +546,40 @@ class ExamPaperAdd extends Component<any, States> { |
|
|
|
|
{ |
|
|
|
|
message: '输入的题目数量大于该监管行业可获取的题目数量', |
|
|
|
|
validator: async (_, value) => { |
|
|
|
|
const { industryId } = this.formRef.current.getFieldsValue(); |
|
|
|
|
const isValid= await this.compareQuestionCount(industryId, value); |
|
|
|
|
if (!isValid) { |
|
|
|
|
return Promise.reject(new Error('输入的题目数量大于该监管行业可获取的题目数量')); |
|
|
|
|
try { |
|
|
|
|
const { industryId } = this.formRef.current.getFieldsValue(); |
|
|
|
|
if (industryId) { |
|
|
|
|
if (value > questionCountSum) { |
|
|
|
|
return Promise.reject(new Error('输入的题目数量大于该监管行业可获取的题目数量')); |
|
|
|
|
} |
|
|
|
|
return Promise.resolve(); |
|
|
|
|
} |
|
|
|
|
} catch (error) { |
|
|
|
|
return Promise.reject(new Error('校验题目数量时出错,请稍后重试')); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
message: '输入的题目数量和试题详情数量不一致', |
|
|
|
|
validator: async (_, value) => { |
|
|
|
|
try { |
|
|
|
|
if (!skipValidation) { |
|
|
|
|
const { questions } = this.state |
|
|
|
|
if (questions && questions.length !== 0 ) { |
|
|
|
|
if (Number(value) !== questions.length) { |
|
|
|
|
return Promise.reject(new Error('输入的题目数量和题目列表数量不一致')); |
|
|
|
|
} |
|
|
|
|
return Promise.resolve(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} catch (error) { |
|
|
|
|
return Promise.reject(new Error('校验题目数量时出错,请稍后重试')); |
|
|
|
|
} |
|
|
|
|
return Promise.resolve(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
]} |
|
|
|
|
> |
|
|
|
|
<Input type="number" style={{ textAlign: 'right' }} placeholder="请输入题目数量" min={1} /> |
|
|
|
|
<Input type="number" style={{ textAlign: 'right' }} placeholder="请输入题目数量" min={1} onChange={handleQuestionCountChange}/> |
|
|
|
|
</Form.Item> |
|
|
|
|
<Form.Item |
|
|
|
|
label="总分值:" |
|
|
|
|