tableFill.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import { getRandomNumber } from '@/utils';
  2. import { stemTypeList, questionNumberTypeList, scoreTypeList, switchOption, fontSizeList } from './common';
  3. import { Message } from 'element-ui';
  4. export function getOption(type = 'option', text = '') {
  5. if (type === 'reference') {
  6. return {
  7. text,
  8. };
  9. }
  10. return {
  11. mark: getRandomNumber(),
  12. text,
  13. type: text.length > 0 ? 'text' : 'input',
  14. };
  15. }
  16. /**
  17. * 解析智能识别数据
  18. * @param {array} arr 智能识别数据
  19. * @returns object
  20. */
  21. export function analysisRecognitionTableFillData(arr) {
  22. if (arr.length === 0) return {};
  23. // 判断 arr[0] 中是否有 -
  24. let isEnableTable = arr[0].includes('-');
  25. // 表头
  26. let headerNum = arr[0].split('-').length;
  27. if (isEnableTable && (headerNum < 2 || headerNum > 5)) {
  28. Message.error('填表题行数在2-5之间');
  29. return {};
  30. }
  31. let is_enable_table_header = switchOption[0].value;
  32. let column_number = 2;
  33. let option_header_list = [];
  34. if (isEnableTable && headerNum > 1) {
  35. is_enable_table_header = switchOption[0].value;
  36. column_number = headerNum;
  37. option_header_list = arr[0]
  38. .split('-')
  39. .map((item) => ({ mark: getRandomNumber(), text: item, width: 100 / headerNum }));
  40. arr.shift();
  41. } else {
  42. is_enable_table_header = switchOption[1].value;
  43. }
  44. // 通过正则表达式匹配出表格内容
  45. let matches = arr.map((str) => {
  46. return str.match(/[((](.*?)[))]/g).map((item) => item.replace(/[((](.*?)[))]/g, '$1'));
  47. });
  48. let colNum = isEnableTable ? headerNum : matches[0].length;
  49. // 如果不启用表头,取第一行的列数
  50. if (!isEnableTable) {
  51. column_number = colNum;
  52. }
  53. let isMate = matches.every((item) => {
  54. if (item.length !== colNum) {
  55. Message.error('填表题表格列数不匹配');
  56. return false;
  57. }
  58. return true;
  59. });
  60. if (!isMate) return {};
  61. const row_number = matches.length;
  62. if (row_number < 1 || row_number > 30) {
  63. Message.error('填表题行数在1-30之间');
  64. return {};
  65. }
  66. const option_list = matches.map((item) => item.map((text) => getOption('option', text)));
  67. return {
  68. 'data.property.is_enable_table_header': is_enable_table_header,
  69. 'data.property.column_number': column_number,
  70. 'data.option_header_list': option_header_list,
  71. 'data.property.row_number': row_number,
  72. 'data.option_list': option_list,
  73. };
  74. }
  75. /**
  76. * 获取填表题数据模板(防止 mark 重复)
  77. * @returns {object} 判断题数据模板
  78. */
  79. export function getTableFillData() {
  80. return {
  81. type: 'table_fill', // 题型
  82. stem: '', // 题干
  83. description: '', // 描述
  84. analysis: '', // 解析,富文本
  85. reference_answer: '', // 参考答案
  86. // 参考答案表头
  87. reference_answer_option_header_list: [
  88. { mark: getRandomNumber(), text: '', width: 50 },
  89. { mark: getRandomNumber(), text: '', width: 50 },
  90. ],
  91. // 参考答案列表
  92. reference_answer_option_list: [
  93. Array.from({ length: 2 }, () => getOption('reference')),
  94. Array.from({ length: 2 }, () => getOption('reference')),
  95. ],
  96. option_header_list: [
  97. { mark: getRandomNumber(), text: '', width: 50 },
  98. { mark: getRandomNumber(), text: '', width: 50 },
  99. ], // 选项头部
  100. option_list: [Array.from({ length: 2 }, () => getOption()), Array.from({ length: 2 }, () => getOption())], // 选项列表
  101. answer: {
  102. score: 1,
  103. score_type: scoreTypeList[0].value,
  104. answer_list: [],
  105. }, // 答案
  106. // 题型属性
  107. property: {
  108. stem_type: stemTypeList[1].value, // 题干类型
  109. question_number: '1', // 题号
  110. stem_question_number_font_size: fontSizeList[6], // 题干题号
  111. is_enable_table_header: switchOption[0].value, // 是否启用表头
  112. is_enable_description: switchOption[1].value, // 描述
  113. is_enable_analysis: switchOption[1].value, // 是否开启解析
  114. is_enable_reference_answer: switchOption[0].value, // 参考答案
  115. score: 1, // 分值
  116. score_type: scoreTypeList[0].value, // 分值类型
  117. is_enable_number_column: switchOption[0].value, // 是否启用序号列
  118. form_width: 800, // 表格宽度 100 - 3000
  119. row_number: 2, // 行数 1 - 30
  120. column_number: 2, // 列数 2 - 5
  121. },
  122. // 其他属性
  123. other: {
  124. question_number_type: questionNumberTypeList[1].value, // 题号类型
  125. },
  126. };
  127. }