import React from 'react'; import { Tabs, Form, Tag, InputNumber, Radio, Row, Col, Checkbox, Icon, Input, Button, List, Cascader } from 'antd'; import './index.less'; import DragList from '@src/components/DragList'; import Editor from '@src/components/Editor'; import Page from '@src/containers/Page'; import Block from '@src/components/Block'; import Select from '@src/components/Select'; import { getMap, formatFormError, formatTreeData } from '@src/services/Tools'; import { asyncSMessage, asyncGet } from '@src/services/AsyncTools'; import { QuestionType, QuestionDifficult, QuestionStyleType, QuestionRadioDirection } from '../../../../Constant'; import QuestionNoList from '../../../components/QuestionNoList'; import { System } from '../../../stores/system'; import { Question } from '../../../stores/question'; import { Examination } from '../../../stores/examination'; import { Exercise } from '../../../stores/exercise'; const QuestionStyleTypeMap = getMap(QuestionStyleType, 'value', 'label'); export default class extends Page { constructor(props) { super(props); this.placeList = []; this.placeSetting = null; this.associationContent = []; this.uuid = []; this.examinationStructMap = {}; this.exerciseStructMap = {}; } init() { Promise.all([ Exercise.allStruct().then(result => { this.exerciseStructMap = getMap(result, 'id'); return { value: 'exercise', key: 'exercise', label: '练习', title: '练习', children: formatTreeData(result.map(row => { row.title = `${row.titleZh}/${row.titleEn}`; return row; }), 'id', 'title', 'parentId') }; }), Examination.allStruct().then(result => { this.examinationStructMap = getMap(result, 'id'); return { value: 'examination', key: 'examination', label: '模考', title: '模考', children: formatTreeData(result.map(row => { row.title = `${row.titleZh}/${row.titleEn}`; return row; }), 'id', 'title', 'parentId') }; }), ]).then(result => { console.log(result); this.setState({ moduleStructData: result }); }); } initData() { const { id } = this.params; const { form } = this.props; let handler; if (id) { handler = Question.get({ id }).then(result => { result.content = result.content || { questions: [], steps: [] }; result.keyword = result.keyword || []; return result; }); } else { handler = Promise.resolve({ content: { number: 1, type: 'single', typeset: 'one', questions: [], steps: [] } }); } handler.then(result => { this.uuid[0] = -1; result.content.questions.forEach((row, index) => { const keys = []; this.uuid[index] = 0; if (row.select && row.select.length > 0) { for (; this.uuid[index] < row.select.length; this.uuid[index] += 1) { keys.push(this.uuid[index]); form.getFieldDecorator(`content.questions[${index}].select[${this.uuid}]`); form.getFieldDecorator(`content.questions[${index}].answer[${this.uuid}]`); } const answerMap = {}; row.answer.forEach(r => { answerMap[r] = true; }); row.answer = row.select.map(r => answerMap[r] || false); } else if (row.answer && row.answer.length > 0) { for (; this.uuid[index] < row.answer.length; this.uuid[index] += 1) { keys.push(this.uuid); form.getFieldDecorator(`content.questions[${index}].answer[${this.uuid}]`); } } form.getFieldDecorator(`content.questions[${index}].keys`); row.keys = keys; return row; }); result.content.steps.forEach((row, index) => { form.getFieldDecorator(`content.steps[${index}].title`); form.getFieldDecorator(`content.steps[${index}].stem`); }); form.getFieldDecorator('content.step'); form.getFieldDecorator('content.number'); form.setFieldsValue(result); return result; }) .then((result) => { this.setState({ associationContentIds: result.associationContent || [] }); console.log(result.questionNoIds); if (result.questionNoIds && result.questionNoIds.length > 0) { return Question.listNo({ ids: result.questionNoIds }).then(list => { this.setState({ questionNos: list }); }); } return null; }); } refreshPlace(type) { let handler = null; if (this.placeSetting) { handler = Promise.resolve(this.placeSetting); } else { handler = System.getPlace(); } handler.then(result => { this.placeSetting = result; this.placeList = result[type] || []; }); } addNo() { const { form } = this.props; form.validateFields(['moduleStruct', 'questionNo'], (err) => { if (!err) { const data = form.getFieldsValue(['id', 'moduleStruct', 'questionNo']); data.moduleStruct = data.moduleStruct.map(row => row); data.module = data.moduleStruct.shift(); const node = data.moduleStruct[data.moduleStruct.length - 1]; let nodeString; switch (data.module) { case 'exercise': nodeString = this.exerciseStructMap[node].titleEn; break; case 'examination': nodeString = this.examinationStructMap[node].titleEn; break; default: } data.questionId = data.id || 0; delete data.id; data.no = data.questionNo; data.no = `${nodeString}-${data.no}`; delete data.questionNo; Question.addNo(data).then((result) => { const { questionNos = [] } = this.state; questionNos.push(result); this.setState({ questionNos }); form.setFieldsValue({ moduleStruct: [], questionNo: '' }); asyncSMessage('保存成功'); }).catch((e) => { if (e.result) form.setFields(formatFormError(data, e.result)); }); } }); } removeNo(noId) { let { questionNos } = this.state; questionNos = questionNos.filter(row => row.id !== noId); Question.delNo({ id: noId }).then(() => { this.setState({ questionNos }); }); } changeType(type) { const { getFieldValue, setFieldsValue, getFieldDecorator } = this.props.form; const number = getFieldValue('content.number'); // const keys = []; this.uuid = []; for (let index = 0; index < Number(number); index += 1) { this.uuid[index] = 0; switch (type) { case 'double': getFieldDecorator(`content.questions[${index}].direction`); setFieldsValue({ [`content.questions[${index}].direction`]: 'landscape' }); break; default: } } } removeQuestion(index, k) { const { form } = this.props; const keys = form.getFieldValue(`content.questions[${index}].keys`); if (keys.length === 1) { return; } form.setFieldsValue({ [`content.questions[${index}].keys`]: keys.filter(key => key !== k), }); } addQuestion(index) { const { form } = this.props; const keys = form.getFieldValue(`content.questions[${index}].keys`) || []; this.uuid[index] += 1; const nextKeys = keys.concat(this.uuid[index]); form.setFieldsValue({ [`content.questions[${index}].keys`]: nextKeys, }); } orderQuestion(index, oldIndex, newIndex) { const { form } = this.props; const keys = form.getFieldValue(`content.questions[${index}].keys`) || []; const tmp = keys[oldIndex]; keys[oldIndex] = keys[newIndex]; keys[newIndex] = tmp; form.setFieldsValue({ [`content.questions[${index}].keys`]: keys, }); } changeQuestion(index, k, value) { const { form } = this.props; let answer = form.getFieldValue(`content.answer[${index}].single`) || []; answer = answer.map(() => !value); answer[k] = !!value; form.setFieldsValue({ [`content.answer[${index}].single`]: answer }); } changeDouble(index, k, o, value) { const { form } = this.props; const direction = form.getFieldValue(`content.questions[${index}].direction`); let answer = form.getFieldValue(`content.answer[${index}].double`) || []; switch (direction) { case 'landscape': answer[k] = answer[k].map(() => !value); if (o >= 0) { answer[k][o] = !!value; } break; case 'portrait': answer = answer.map((row) => { row[o] = !value; return row; }); if (o >= 0) { answer[k][o] = !!value; } break; default: } form.setFieldsValue({ [`content.answer[${index}].double`]: answer }); } submit() { const { form } = this.props; const fields = ['type', 'place', 'difficult', 'content', 'answer', 'stem', 'keyword', 'questionNoIds', 'officialContent', 'qxContent', 'associationContent']; form.validateFields(fields, (err) => { if (!err) { const data = form.getFieldsValue(fields); let handler; data.associationContent = this.state.associationContent.map(row => row.id); data.description = data.stem.replace(/<[^>]+>/g, ''); data.content.questions = data.content.questions.map(row => { row.select = row.select.filter(r => r); return row; }); data.answer.questions = data.answer.questions.map(row => { if (row.single) row.single = row.single.filter(r => r); if (row.double) row.double = row.double.filter(r => r); return row; }); if (data.id) { handler = Question.add(data); } else { handler = Question.edit(data); } handler.then(() => { asyncSMessage('保存成功'); }).catch((e) => { if (e.result) form.setFields(formatFormError(data, e.result)); }); } }); } searchStem() { const { form } = this.props; const content = form.getFieldValue('stem').replace(/<[^>]+>/g, ''); Question.searchStem({ content }) .then(result => { if (result.list.length > 0) { asyncGet(() => import('../../../components/SimilarQuestionNo'), { title: '找到可匹配题目', questionNos: result.list, modal: true }, (questionNo) => { this.inited = false; linkTo(`/subject/question/${questionNo.questionId}`); return Promise.resolve(); }); } else { asyncSMessage('无可匹配题目'); } }); } renderBase() { const { getFieldDecorator } = this.props.form; return

题干信息

{getFieldDecorator('id')()} {getFieldDecorator('stem', { })( { const range = quill.getSelection(true); quill.insertText(range.index, '#table#'); }, select: (quill) => { const range = quill.getSelection(true); quill.insertText(range.index, '#select#'); }, }, }, }} placeholder='请输入内容' onUpload={(file) => System.uploadImage(file)} />, )} {getFieldDecorator('content.step', { normalize: (value, preValue) => { if (value === undefined || value === '' || value === null) return preValue; if (Math.abs(value - preValue) > 1) return preValue; return value; }, })( , )} 行 {getFieldDecorator('content.table.row')( , )} 列 {getFieldDecorator('content.table.col')( , )} {this.renderTable()}
; } renderTable() { const { getFieldDecorator, getFieldValue } = this.props.form; const row = Number(getFieldValue('content.table.row')); const col = Number(getFieldValue('content.table.col')); const table = []; if (row === 0 || col === 0) return table; const span = 100 / col; const colums = []; for (let i = 0; i < col; i += 1) { colums.push(
{getFieldDecorator(`content.table.header[${i}]`)()}
); } table.push({colums}); for (let index = 0; index < row; index += 1) { const cols = []; for (let i = 0; i < col; i += 1) { cols.push(
{getFieldDecorator(`content.table.data[${index}][${i}]`)()}
); } table.push({cols}); } return table; } renderStep() { const { getFieldDecorator, getFieldValue } = this.props.form; const number = getFieldValue('content.step'); const result = []; for (let index = 0; index < Number(number); index += 1) { result.push(

递进层次 {index + 1}

{getFieldDecorator(`content.steps[${index}].title`, { rules: [ { required: true, message: '请输入标题' }, ], })( , )} {getFieldDecorator(`content.steps[${index}].stem`, { })( , )}
); } return result; } renderIdentity() { const { questionNos = [] } = this.state; const { getFieldDecorator } = this.props.form; return

题目身份

{getFieldDecorator('questionNoIds', { rules: [{ required: true, message: '添加关联题目ID', }], })()} {questionNos.map((no, index) => { return { this.removeNo(no.id); }}> {no.no} ; })} {getFieldDecorator('moduleStruct', { rules: [{ required: true, message: '选择题目编号关系', }], })( { this.setState({ moduleStruct: value }); }} placeholder='选择' options={this.state.moduleStructData} />)} {getFieldDecorator('questionNo', { rules: [{ required: true, message: '输入编号', }], })( { this.setState({ questionNo: value }); }} />)} {getFieldDecorator('keyword')( { this.refreshPlace(v); }} />, )} {getFieldDecorator('place', { rules: [ { required: true, message: '请选择考点' }, ], })( , )}
; } renderStyle() { const { getFieldDecorator } = this.props.form; return

题目样式

{getFieldDecorator('content.type', { rules: [ { required: true, message: '请选择类型' }, ], })( , )} {keys.length > 1 ? ( this.removeQuestion(index, k)} /> ) : null} )} />, , ]; } renderSelectDouble(index) { const { getFieldDecorator, getFieldValue } = this.props.form; getFieldDecorator(`content.questions[${index}].keys`); const keys = getFieldValue(`content.questions[${index}].keys`) || []; return [ {getFieldDecorator(`content.questions[${index}].direction`)( , )} {getFieldDecorator(`content.questions[${index}].second`)( , )} , { this.orderQuestion(index, oldIndex, newIndex); }} renderItem={(k) => ( ]}> {getFieldDecorator(`answer.questions[${index}].double[${k}][0]`, { valuePropName: 'checked', })( { this.changeDouble(index, k, 0, value); }} />, )} {getFieldDecorator(`answer.questions[${index}].double[${k}][1]`, { valuePropName: 'checked', })( { this.changeDouble(index, k, 1, value); }} />, )} )} />, , ]; } renderSelectInline(index) { return this.renderSelectSingle(index); } renderOffical() { const { getFieldDecorator } = this.props.form; return {getFieldDecorator('officalContent', { })( , )} ; } renderQX() { const { getFieldDecorator } = this.props.form; return
{getFieldDecorator('qxContent', { })( , )}
; } renderAssociation() { const { getFieldDecorator, setFieldsValue } = this.props.form; return

题源联想

{getFieldDecorator('associationContent')(