import { getRandomNumber } from '@/utils'; import { stemTypeList, questionNumberTypeList, scoreTypeList, switchOption, fontSizeList } from './common'; import { Message } from 'element-ui'; export function getOption(type = 'option', text = '') { if (type === 'reference') { return { text, }; } return { mark: getRandomNumber(), text, type: text.length > 0 ? 'text' : 'input', }; } /** * 解析智能识别数据 * @param {array} arr 智能识别数据 * @returns object */ export function analysisRecognitionTableFillData(arr) { if (arr.length === 0) return {}; // 判断 arr[0] 中是否有 - let isEnableTable = arr[0].includes('-'); // 表头 let headerNum = arr[0].split('-').length; if (isEnableTable && (headerNum < 2 || headerNum > 5)) { Message.error('填表题行数在2-5之间'); return {}; } let is_enable_table_header = switchOption[0].value; let column_number = 2; let option_header_list = []; if (isEnableTable && headerNum > 1) { is_enable_table_header = switchOption[0].value; column_number = headerNum; option_header_list = arr[0] .split('-') .map((item) => ({ mark: getRandomNumber(), text: item, width: 100 / headerNum })); arr.shift(); } else { is_enable_table_header = switchOption[1].value; } // 通过正则表达式匹配出表格内容 let matches = arr.map((str) => { return str.match(/[((](.*?)[))]/g).map((item) => item.replace(/[((](.*?)[))]/g, '$1')); }); let colNum = isEnableTable ? headerNum : matches[0].length; // 如果不启用表头,取第一行的列数 if (!isEnableTable) { column_number = colNum; } let isMate = matches.every((item) => { if (item.length !== colNum) { Message.error('填表题表格列数不匹配'); return false; } return true; }); if (!isMate) return {}; const row_number = matches.length; if (row_number < 1 || row_number > 30) { Message.error('填表题行数在1-30之间'); return {}; } const option_list = matches.map((item) => item.map((text) => getOption('option', text))); return { 'data.property.is_enable_table_header': is_enable_table_header, 'data.property.column_number': column_number, 'data.option_header_list': option_header_list, 'data.property.row_number': row_number, 'data.option_list': option_list, }; } /** * 获取填表题数据模板(防止 mark 重复) * @returns {object} 判断题数据模板 */ export function getTableFillData() { return { type: 'table_fill', // 题型 stem: '', // 题干 description: '', // 描述 analysis: '', // 解析,富文本 reference_answer: '', // 参考答案 // 参考答案表头 reference_answer_option_header_list: [ { mark: getRandomNumber(), text: '', width: 50 }, { mark: getRandomNumber(), text: '', width: 50 }, ], // 参考答案列表 reference_answer_option_list: [ Array.from({ length: 2 }, () => getOption('reference')), Array.from({ length: 2 }, () => getOption('reference')), ], option_header_list: [ { mark: getRandomNumber(), text: '', width: 50 }, { mark: getRandomNumber(), text: '', width: 50 }, ], // 选项头部 option_list: [Array.from({ length: 2 }, () => getOption()), Array.from({ length: 2 }, () => getOption())], // 选项列表 answer: { score: 1, score_type: scoreTypeList[0].value, answer_list: [], }, // 答案 // 题型属性 property: { stem_type: stemTypeList[1].value, // 题干类型 question_number: '1', // 题号 stem_question_number_font_size: fontSizeList[6], // 题干题号 is_enable_table_header: switchOption[0].value, // 是否启用表头 is_enable_description: switchOption[1].value, // 描述 is_enable_analysis: switchOption[1].value, // 是否开启解析 is_enable_reference_answer: switchOption[0].value, // 参考答案 score: 1, // 分值 score_type: scoreTypeList[0].value, // 分值类型 is_enable_number_column: switchOption[0].value, // 是否启用序号列 form_width: 800, // 表格宽度 100 - 3000 row_number: 2, // 行数 1 - 30 column_number: 2, // 列数 2 - 5 }, // 其他属性 other: { question_number_type: questionNumberTypeList[1].value, // 题号类型 }, }; }