|
@@ -0,0 +1,166 @@
|
|
|
+import { reactive } from "vue";
|
|
|
+
|
|
|
+export interface Store {
|
|
|
+ setting: Setting;
|
|
|
+ groups: Array<Group>;
|
|
|
+ status: {
|
|
|
+ personCount: number; //个人评卷数量
|
|
|
+ markedCount: number; //总评卷数量
|
|
|
+ totalCount: number; //总数量
|
|
|
+ problemCount: number; //问题卷数量
|
|
|
+ arbitrateCount: number; //待仲裁卷数量
|
|
|
+ };
|
|
|
+ tasks: Array<Task>; // 保持数量为3
|
|
|
+ currentTask: Task; // 用来切换task,还有回看
|
|
|
+ markResults: Array<MarkResult>;
|
|
|
+}
|
|
|
+
|
|
|
+interface Setting {
|
|
|
+ examType: "SCAN_IMAGE" | "MULTI_MEDIA"; // 扫描图片或者多媒体,多媒体只允许 common mode
|
|
|
+ mode: "TRACK" | "COMMON"; //模式 TRACK/COMMON
|
|
|
+ forceMode: boolean; //强制模式切换
|
|
|
+ sheetView: boolean; //是否显示原图功能
|
|
|
+ sheetConfig: [SingleSheetConfig]; //原图遮盖规则
|
|
|
+ fileServer: string; //图片服务地址
|
|
|
+ marker: { id: number; name: string }; //评卷员信息
|
|
|
+ subject: {
|
|
|
+ //科目信息(试卷和答案功能)
|
|
|
+ name: string;
|
|
|
+ code: string;
|
|
|
+ answerUrl: string;
|
|
|
+ paperUrl: string;
|
|
|
+ };
|
|
|
+ forceSpecialTag: boolean; //强制标记是否开启 forceTag
|
|
|
+ uiSetting: {
|
|
|
+ "score.board.collapse": boolean;
|
|
|
+ };
|
|
|
+ statusValue: "TRIAL" | "FORMAL" | "FINISH"; //只显示试评名称 TRIAL("试评"), FORMAL("正评"), FINISH("结束")
|
|
|
+ problemTypes: [{ id: number; name: string }]; //问题卷类型
|
|
|
+ groupNumber: number; //评卷分组
|
|
|
+ topCount: number; //限制提示数量
|
|
|
+ splitConfig: Array<number>; //使用裁切整图时的裁切配置 [0,1]|[0,0.3,0.25,0.55],
|
|
|
+ prefetchCount: number; //预加载任务数量
|
|
|
+ startTime: number; //评卷开始时间
|
|
|
+ endTime: number; //评卷结束时间
|
|
|
+}
|
|
|
+
|
|
|
+interface SingleSheetConfig {
|
|
|
+ i: number; // index of sheets
|
|
|
+ w: number; // width
|
|
|
+ h: number; // height
|
|
|
+ x: number; // x 左上角为 (0, 0)
|
|
|
+ y: number; // y 左上角为 (0, 0)
|
|
|
+}
|
|
|
+
|
|
|
+interface Group {
|
|
|
+ markerId: number;
|
|
|
+ number: number;
|
|
|
+ title: string;
|
|
|
+ markedCount: number; //总评卷数量
|
|
|
+ totalCount: number; //总数量
|
|
|
+}
|
|
|
+
|
|
|
+interface Task {
|
|
|
+ libraryId: number;
|
|
|
+ studentId: number;
|
|
|
+ secretNumber: string;
|
|
|
+ studentName: string; //后端处理是否显示
|
|
|
+ studentCode: string;
|
|
|
+ examNumber: string;
|
|
|
+ subject: { name: string; code: string };
|
|
|
+ sliceUrls: Array<string>; //裁切图url
|
|
|
+ sliceConfig: Array<PictureSlice>; //最高显示优先级
|
|
|
+ jsonUrl: string; // sliceUrls为空,则是多媒体阅卷,显示JSON
|
|
|
+ questionList: Array<Question>;
|
|
|
+ currentQuestion: number; // 前端添加和使用的属性; 通过index去questionList去定位question,然后找到大题号、小题号
|
|
|
+ specialTagList: Array<SpecialTag>;
|
|
|
+
|
|
|
+ sheetUrls: Array<string>; //原图url
|
|
|
+ objectiveScore: number; //客观分 复核也用到
|
|
|
+
|
|
|
+ markerScore: number; // 评卷总分
|
|
|
+ markTime: number; //评卷时间
|
|
|
+ self: boolean; // 是否自评,暂时用不着
|
|
|
+ previous: boolean; // 是否回评
|
|
|
+ rejected: boolean; // 是否是打回
|
|
|
+}
|
|
|
+
|
|
|
+interface Question {
|
|
|
+ groupNumber: number; // 分组序号
|
|
|
+ mainNumber: number; // 大题号
|
|
|
+ subNumber: string; // 小题号
|
|
|
+ intervalScore: number; // 分数间隔
|
|
|
+ defaultScore: number;
|
|
|
+ minScore: number;
|
|
|
+ maxScore: number;
|
|
|
+ title: string; // 题目名称
|
|
|
+ trackList: Array<Track>; // 轨迹列表
|
|
|
+ score: number; //得分;null的值时是为打回时可以被修改的;null也是从未评分过的情况,要通过rejected来判断
|
|
|
+}
|
|
|
+
|
|
|
+interface Track {
|
|
|
+ mainNumber: number; // 大题号
|
|
|
+ subNumber: string; // 小题号,当前api中只有number // 特殊标记中没有
|
|
|
+ offsetIndex: number; // 第几张图
|
|
|
+ offsetX: number; // 左上角为原点
|
|
|
+ offsetY: number;
|
|
|
+ positionX: number; // 相对slice的位置比例
|
|
|
+ positionY: number;
|
|
|
+ score: number;
|
|
|
+}
|
|
|
+
|
|
|
+interface SpecialTag {
|
|
|
+ offsetIndex: number; // 第几张图
|
|
|
+ offsetX: number; // 左上角为原点
|
|
|
+ offsetY: number;
|
|
|
+ positionX: number; // 相对slice的位置比例
|
|
|
+ positionY: number;
|
|
|
+ tagName: string; // 特殊标记的字符串,勾叉
|
|
|
+}
|
|
|
+
|
|
|
+interface PictureSlice {
|
|
|
+ i: number;
|
|
|
+ w: number;
|
|
|
+ h: number;
|
|
|
+ x: number;
|
|
|
+ y: number;
|
|
|
+}
|
|
|
+
|
|
|
+interface MarkResult {
|
|
|
+ libraryId: number;
|
|
|
+ studentId: number;
|
|
|
+ statusValue: string;
|
|
|
+ spent: number; // 毫秒单位
|
|
|
+
|
|
|
+ // 轨迹 or 键盘
|
|
|
+ markerScore: number;
|
|
|
+ trackList: Array<Track>;
|
|
|
+ scoreList: Array<number>;
|
|
|
+ specialTagList: Array<SpecialTag>; // 轨迹和键盘都需要
|
|
|
+
|
|
|
+ // 问题卷
|
|
|
+ problem: boolean;
|
|
|
+ problemTypeId: number;
|
|
|
+}
|
|
|
+
|
|
|
+const obj = {
|
|
|
+ setting: {
|
|
|
+ mode: "TRACK",
|
|
|
+ },
|
|
|
+} as Store;
|
|
|
+
|
|
|
+/** 保存setting和task */
|
|
|
+export function saveSetting(settingRes: Setting) {
|
|
|
+ store.setting = settingRes;
|
|
|
+}
|
|
|
+
|
|
|
+/** 切换评分模式 */
|
|
|
+export function toggleMode() {
|
|
|
+ store.setting.mode = store.setting.mode === "TRACK" ? "COMMON" : "TRACK";
|
|
|
+ // 切换模式会清除当前任务的打分
|
|
|
+}
|
|
|
+
|
|
|
+/** 给当前任务评分 */
|
|
|
+export function markScore() {}
|
|
|
+
|
|
|
+export const store = reactive(obj);
|