index.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. export interface MarkStore {
  2. setting: Setting;
  3. groups: Array<Group>;
  4. status: {
  5. /** 为false时不更新以下count字段 */
  6. valid: boolean;
  7. /** 个人评卷数量 */
  8. personCount: number;
  9. /** 总评卷数量 */
  10. markedCount: number;
  11. /** 总数量 */
  12. totalCount: number;
  13. /** 问题卷数量 */
  14. problemCount: number;
  15. /** 待仲裁卷数量 */
  16. arbitrateCount: number;
  17. };
  18. /** 保持数量为3(prefetchCount) */
  19. tasks: Array<Task>;
  20. /** 用来切换task,还有回看 */
  21. currentTask?: Task;
  22. currentQuestion?: Question;
  23. currentScore?: number;
  24. currentSpecialTag?: string;
  25. /** 是否打开回评侧边栏 */
  26. historyOpen: boolean;
  27. historyTasks: Array<Task>;
  28. /** 删除这些轨迹 */
  29. removeScoreTracks: Array<Track>;
  30. /** 聚焦这些tracks */
  31. focusTracks: Array<Track>;
  32. message: string | null;
  33. maxModalZIndex: number;
  34. /** 缩略图设置滚动到宽度的百分比 */
  35. minimapScrollToX?: number;
  36. /** 缩略图设置滚动到高度的百分比 */
  37. minimapScrollToY?: number;
  38. /** 是否显示全卷 */
  39. allPaperModal: boolean;
  40. /** 是否显示原卷 */
  41. sheetViewModal: boolean;
  42. /** 是否全局遮盖 */
  43. globalMask: boolean;
  44. }
  45. export interface Setting {
  46. /** 扫描图片或者多媒体,多媒体只允许 common mode */
  47. examType: "SCAN_IMAGE" | "MULTI_MEDIA";
  48. /** 阅卷模式 TRACK | COMMON */
  49. mode: "TRACK" | "COMMON";
  50. /** 是否允许模式切换,true为不允许 */
  51. forceMode: boolean;
  52. /** 是否显示原图功能 */
  53. sheetView: boolean;
  54. /** 原图遮盖规则 */
  55. sheetConfig: Array<SingleSheetConfig>;
  56. /** 是否开启全零分 */
  57. enableAllZero: boolean;
  58. /** 图片服务地址 */
  59. fileServer: string;
  60. /** 评卷员姓名 */
  61. userName: string;
  62. subject: {
  63. /** 科目信息(试卷和答案功能)*/
  64. name: string;
  65. code: string;
  66. answerUrl: string;
  67. paperUrl: string;
  68. questions: Array<RichTextQuestion>;
  69. };
  70. /** 强制标记是否开启 */
  71. forceSpecialTag: boolean;
  72. uiSetting: UISetting;
  73. /** 只显示试评名称 TRIAL("试评"), FORMAL("正评"), FINISH("结束"): 结束状态不会在评卷端出现 */
  74. statusValue: "TRIAL" | "FORMAL";
  75. /** 问题卷类型 */
  76. problemTypes: Array<{ id: number; name: string }> | [];
  77. /** 当前评卷分组号 */
  78. groupNumber: number;
  79. /** 当前评卷分组名称 */
  80. groupTitle: string;
  81. /** 推荐老师评卷的数量,到达这个数量提示老师 */
  82. topCount: number;
  83. /** 使用裁切整图时的裁切配置 [0,1]|[0,0.3,0.25,0.55], */
  84. splitConfig: Array<number>;
  85. /** 预加载任务数量 */
  86. prefetchCount: number;
  87. /** 评卷开始时间 */
  88. startTime: number;
  89. /** 评卷结束时间 */
  90. endTime: number;
  91. /** 是否是未选做类型 */
  92. selective: boolean;
  93. }
  94. // setting for admin page
  95. export interface AdminPageSetting {
  96. /** 扫描图片或者多媒体,多媒体只允许 common mode */
  97. examType: "SCAN_IMAGE" | "MULTI_MEDIA";
  98. /** 图片服务地址 */
  99. fileServer: string;
  100. /** 管理员姓名 */
  101. userName: string;
  102. subject: {
  103. /** 科目信息(试卷和答案功能) */
  104. name: string;
  105. code: string;
  106. answerUrl: string;
  107. paperUrl: string;
  108. questions: Array<RichTextQuestion>;
  109. };
  110. /** 使用裁切整图时的裁切配置 [0,1]|[0,0.3,0.25,0.55], */
  111. splitConfig: Array<number>;
  112. }
  113. export interface AdminPageSettingForImport extends AdminPageSetting {
  114. studentIds: number[];
  115. tagIds: number[];
  116. inspectCount: number;
  117. message: string;
  118. }
  119. interface SingleSheetConfig {
  120. /** index of sheets */
  121. i: number;
  122. /** 覆盖区域的width */
  123. w: number;
  124. /** 覆盖区域的height */
  125. h: number;
  126. /** 从哪里开始覆盖 左上角为 (0, 0) */
  127. x: number;
  128. /** 从哪里开始覆盖 左上角为 (0, 0) */
  129. y: number;
  130. }
  131. export interface Group {
  132. markerId: number;
  133. number: number;
  134. title: string;
  135. /** 总评卷数量 */
  136. markedCount: number;
  137. /** 总数量 */
  138. totalCount: number;
  139. }
  140. export interface Task {
  141. libraryId: number;
  142. studentId: number;
  143. secretNumber: string;
  144. /** 后端处理是否显示 */
  145. studentName: string;
  146. studentCode: string;
  147. examNumber: string;
  148. subject?: {
  149. /** 一般不要用此处的subject,优先用setting.subject */
  150. name: string;
  151. code: string;
  152. answerUrl: string;
  153. paperUrl: string;
  154. questions: Array<RichTextQuestion>;
  155. };
  156. /** 裁切图url */
  157. sliceUrls: Array<string>;
  158. /** 最高显示优先级,有sliceConfig就用sliceConfig,否则使用sheetConfig */
  159. sliceConfig: Array<PictureSlice>;
  160. /** sliceUrls为空,则是多媒体阅卷,显示JSON */
  161. jsonUrl: string;
  162. questionList: Array<Question>;
  163. specialTagList: Array<SpecialTag>;
  164. /** 原图url */
  165. sheetUrls: Array<string>;
  166. /** 客观分 复核也用到 */
  167. objectiveScore: number;
  168. /** 评卷总分 */
  169. markerScore: number;
  170. /** 评卷时间 */
  171. markerTime: number;
  172. /** 复核有用 */
  173. inspectTime?: number;
  174. /** 是否自评,暂时用不着 */
  175. self: boolean;
  176. /** 是否回评 */
  177. previous: boolean;
  178. /** 是否是打回 */
  179. rejected: boolean;
  180. message: string | null;
  181. /** 评卷结果,在task第一次被访问时自动添加,watch currentTask */
  182. markResult: MarkResult;
  183. /** 前端自用,用于标记阅卷开始时间和计算spent */
  184. __markStartTime: number;
  185. }
  186. export interface Question {
  187. /** 分组序号 */
  188. groupNumber: number;
  189. /** 大题号 */
  190. mainNumber: number;
  191. /** 小题号 */
  192. subNumber: string;
  193. /** 分数间隔 */
  194. intervalScore: number;
  195. defaultScore: number;
  196. minScore: number;
  197. maxScore: number;
  198. /** 题目名称 */
  199. title: string;
  200. /** 轨迹列表 */
  201. trackList: Array<Track>;
  202. /** 得分;null的值时是为打回时可以被评卷修改的;null也是从未评分过的情况,要通过rejected来判断 */
  203. score: number | null;
  204. /** question 在 task 里面的 index ,用来对应 scoreList 的 score */
  205. __index: number;
  206. }
  207. export interface Track {
  208. /** 大题号 */
  209. mainNumber: number;
  210. /** 小题号,当前api中只有number // 特殊标记中没有 */
  211. subNumber: string;
  212. /** 前端使用,暂时用不着,赋0 */
  213. number: number;
  214. /** 第几张图 */
  215. offsetIndex: number;
  216. /** 左上角为原点 */
  217. offsetX: number;
  218. offsetY: number;
  219. /** 相对slice的位置比例 */
  220. positionX: number;
  221. positionY: number;
  222. score: number;
  223. }
  224. export interface SpecialTag {
  225. /** 第几张图 */
  226. offsetIndex: number;
  227. /** 左上角为原点 */
  228. offsetX: number;
  229. offsetY: number;
  230. /** 相对slice的位置比例 */
  231. positionX: number;
  232. positionY: number;
  233. /** 特殊标记的字符串,勾叉 */
  234. tagName: string;
  235. }
  236. export interface PictureSlice {
  237. /** 从1开始 */
  238. i: number;
  239. w: number;
  240. h: number;
  241. x: number;
  242. y: number;
  243. }
  244. export interface UISetting {
  245. "score.board.collapse": boolean;
  246. /** 0.2 gap */
  247. "answer.paper.scale": number;
  248. "normal.mode": "keyboard" | "mouse";
  249. "paper.modal": boolean;
  250. "answer.modal": boolean;
  251. "minimap.modal": boolean;
  252. "specialTag.modal": boolean;
  253. "shortCut.modal": boolean;
  254. /** 0.1 gap */
  255. "score.fontSize.scale": number;
  256. }
  257. export interface MarkResult {
  258. libraryId: number;
  259. studentId: number;
  260. statusValue: string;
  261. /** 毫秒单位 */
  262. spent: number;
  263. // 轨迹 or 键盘
  264. markerScore: number | null;
  265. trackList: Array<Track>;
  266. scoreList: Array<number | null>;
  267. /** 轨迹和键盘都需要 */
  268. specialTagList: Array<SpecialTag>;
  269. /** 问题卷 */
  270. problem: boolean;
  271. problemTypeId: number;
  272. /** 当前task是否为学生未选做 */
  273. unselective: boolean;
  274. }
  275. /** 前端自用,用来渲染裁切图 */
  276. export interface SliceImage {
  277. /** 当前是 ObjectURL , 因为 DataURL 性能太差 */
  278. url: string;
  279. indexInSliceUrls: number;
  280. trackList: Array<Track>;
  281. tagList: Array<SpecialTag>;
  282. // originalImageWidth: number; // 为了兼容原图还原轨迹而添加的属性,当前CommonMarkBody用不到
  283. // originalImageHeight: number; // 为了兼容原图还原轨迹而添加的属性,当前CommonMarkBody用不到
  284. sliceImageWidth: number;
  285. sliceImageHeight: number;
  286. /** 裁切图在原图中的左上角的x偏移量 */
  287. dx: number;
  288. /** 裁切图在原图中的左上角的y偏移量 */
  289. dy: number;
  290. /** 在多个图片从高至低排列中累积的高度 */
  291. accumTopHeight: number;
  292. /** 当前裁切图有效宽度,大小不一的裁切图时有用。
  293. * 为了能让多张图统一比例的缩放,所以将所有的图的宽度设为一样了。 */
  294. effectiveWidth: number;
  295. }
  296. export type MarkHistoryOrderBy =
  297. | "markerTime"
  298. | "inspectTime"
  299. | "markerScore"
  300. | "seceretNumber"
  301. | undefined;
  302. export type MarkHistorySortField = "ASC" | "DESC" | undefined;
  303. export interface HistoryQueryParams {
  304. /** 从1开始 */
  305. pageNumber?: number;
  306. pageSize?: number;
  307. order?: MarkHistoryOrderBy;
  308. sort?: MarkHistorySortField;
  309. secretNumber?: string | null;
  310. subjectCode?: string;
  311. groupNumber?: string;
  312. markerId?: string;
  313. markerScore?: string;
  314. }
  315. export interface GetHistory {
  316. (historyQuery: HistoryQueryParams): any;
  317. }
  318. export interface CommonResponse {
  319. /** 请求是否成功 */
  320. success: boolean;
  321. /** 错误消息 */
  322. message: string;
  323. }
  324. /** 仲裁用:评卷明细 */
  325. export interface MarkDetail {
  326. markerName: string;
  327. markerTime: number;
  328. totalScore: number;
  329. scoreList: string;
  330. }
  331. //#region 多媒体评卷
  332. export interface RichTextQuestion {
  333. /** 题目的综合题号 1-2-4 */
  334. unionOrder: string;
  335. body: RichTextJSON;
  336. parentBody: RichTextJSON | null;
  337. answer: Array<RichTextJSON> | null;
  338. objective: boolean | null;
  339. options: Array<{ number: number; body: RichTextJSON }>;
  340. }
  341. export interface RichTextJSON {
  342. sections: RichTextSectionJSON[];
  343. }
  344. export interface RichTextSectionJSON {
  345. blocks: RichTextBlockJSON[];
  346. }
  347. export interface RichTextBlockJSON {
  348. type: "text" | "image" | "audio" | "cloze";
  349. value: string;
  350. param: {
  351. underline: boolean;
  352. bold: boolean;
  353. italic: boolean;
  354. width: string;
  355. height: string;
  356. } | null;
  357. }
  358. export interface StudentAnswer {
  359. mainNumber: number;
  360. subNumber: string;
  361. subIndex: string;
  362. answer: Array<RichTextJSON> | null;
  363. }
  364. /** 云平台试卷格式 */
  365. export type ECSPaperJSON = {
  366. mainNumber: number;
  367. subNumber: string;
  368. body: RichTextJSON;
  369. parentBody: RichTextJSON | null;
  370. answer: RichTextJSON;
  371. }[];
  372. /** 在线考试平台试卷格式 */
  373. export type OExamPaperJSON = OExamPaperJSONQuestionList[];
  374. interface OExamPaperJSONQuestionList {
  375. /** 大题号 */
  376. number: number;
  377. questions: OExamPaperJSONQuestion[];
  378. }
  379. interface OExamPaperJSONQuestion {
  380. number: number;
  381. body: RichTextJSON;
  382. answer: RichTextJSON[] | null;
  383. objective: boolean | null;
  384. options: Array<{ number: number; body: RichTextJSON }>;
  385. subQuestions: OExamPaperJSONQuestion[] | null;
  386. }
  387. //#endregion