zhangjie пре 1 година
родитељ
комит
a8a4d32f4a

+ 6 - 0
src/constants/enumerate.js

@@ -353,3 +353,9 @@ export const QUESTION_SCORE_TYPE = {
   ALL: "任选给分",
   LEAK: "漏选给分",
 };
+
+// mark
+export const MARK_MODE_TYPE = {
+  TRACK: "轨迹模式",
+  COMMON: "普通模式",
+};

+ 17 - 0
src/modules/mark/api.js

@@ -0,0 +1,17 @@
+import { $postParam, $post } from "@/plugins/axios";
+
+// mark-entrance
+export const markTaskListPage = (datas) => {
+  return $postParam("/api/admin/mark/entrance/list", datas);
+};
+
+// mark-setting
+export const markSettingListPage = (datas) => {
+  return $postParam("/api/admin/mark/setting/list", datas);
+};
+export const markSettingDetail = (datas) => {
+  return $postParam("/api/admin/mark/setting/paper/get", datas);
+};
+export const markSettingSave = (datas) => {
+  return $post("/api/admin/mark/setting/paper/save", datas);
+};

+ 210 - 0
src/modules/mark/components/ModifyMarkSetting.vue

@@ -0,0 +1,210 @@
+<template>
+  <el-dialog
+    class="modify-mark-setting"
+    :visible.sync="modalIsShow"
+    title="评卷设置"
+    top="10px"
+    width="600px"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    destroy-on-close
+    @open="visibleChange"
+  >
+    <el-form
+      ref="modalFormComp"
+      :model="modalForm"
+      :rules="rules"
+      :key="modalForm.paperNumber"
+      label-position="top"
+    >
+      <el-form-item prop="markMode" label="评卷模式:">
+        <el-select v-model="modalForm.markMode">
+          <el-option
+            v-for="(val, key) in MARK_MODE_TYPE"
+            :key="key"
+            :value="key"
+            :label="val"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="markStartTime" label="评卷时间:">
+        <el-date-picker
+          v-model="markTime"
+          type="datetimerange"
+          :picker-options="pickerOptions"
+          range-separator="至"
+          start-placeholder="评卷开始日期"
+          end-placeholder="评卷结束日期"
+          value-format="timestamp"
+          align="right"
+          unlink-panels
+          @change="dateChange"
+        >
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="小助手原卷:">
+        <el-checkbox v-model="modalForm.sheetView"></el-checkbox>
+      </el-form-item>
+      <el-form-item label="评卷是否显示客观分:">
+        <el-checkbox v-model="modalForm.showObjectiveScore"></el-checkbox>
+      </el-form-item>
+      <el-form-item label="评卷提交自动定位:">
+        <el-checkbox v-model="modalForm.mainTitle"></el-checkbox>
+      </el-form-item>
+      <el-form-item prop="passScore" label="及格分:">
+        <el-input-number
+          style="width: 125px"
+          v-model="modalForm.passScore"
+          :min="1"
+          :max="200"
+          :step="1"
+          step-strictly
+          :controls="false"
+        ></el-input-number>
+      </el-form-item>
+      <el-form-item prop="excellentScore" label="优秀分:">
+        <el-input-number
+          style="width: 125px"
+          v-model="modalForm.excellentScore"
+          :min="1"
+          :max="200"
+          :step="1"
+          step-strictly
+          :controls="false"
+        ></el-input-number>
+      </el-form-item>
+      <el-form-item prop="pictureConfig" label="原图遮盖:">
+        <el-button class="btn-primary" type="text" @click="toSetPictureConfig"
+          >设置</el-button
+        >
+      </el-form-item>
+    </el-form>
+    <div slot="footer">
+      <el-button type="primary" :disabled="isSubmit" @click="submit"
+        >确认</el-button
+      >
+      <el-button @click="cancel">取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { markSettingSave, markSettingDetail } from "../api";
+import { MARK_MODE_TYPE } from "@/constants/enumerate";
+import pickerOptions from "@/constants/datePickerOptions";
+
+const initModalForm = {
+  examId: null,
+  paperNumber: "",
+  markMode: "",
+  markStartTime: "",
+  markEndTime: "",
+  sheetView: "",
+  showObjectiveScore: "",
+  mainTitle: "",
+  passScore: null,
+  excellentScore: null,
+  pictureConfig: "",
+};
+
+export default {
+  name: "modify-mark-setting",
+  props: {
+    instance: {
+      type: Object,
+      default() {
+        return {};
+      },
+    },
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      isSubmit: false,
+      MARK_MODE_TYPE,
+      modalForm: { ...initModalForm },
+      rules: {
+        markMode: [
+          {
+            required: true,
+            message: "请选择评卷模式",
+            trigger: "change",
+          },
+        ],
+        markStartTime: [
+          {
+            required: true,
+            message: "请设置评卷时间",
+            trigger: "change",
+          },
+        ],
+        passScore: [
+          {
+            required: true,
+            message: "请设置及格分",
+            trigger: "change",
+          },
+        ],
+        excellentScore: [
+          {
+            required: true,
+            message: "请设置优秀分",
+            trigger: "change",
+          },
+        ],
+      },
+      // date-picker
+      markTime: [],
+      pickerOptions,
+    };
+  },
+  methods: {
+    async initData(val) {
+      const res = await markSettingDetail({
+        examId: this.instance.examId,
+        paperNumber: this.instance.paperNumber,
+      });
+      this.modalForm = this.$objAssign(initModalForm, res || {});
+    },
+    visibleChange() {
+      this.initData(this.instance);
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    dateChange() {
+      if (this.markTime) {
+        this.modalForm.markStartTime = this.markTime[0];
+        this.modalForm.markEndTime = this.markTime[1];
+      } else {
+        this.modalForm.markStartTime = "";
+        this.modalForm.markEndTime = "";
+      }
+    },
+    toSetPictureConfig() {
+      // TODO:
+    },
+    async submit() {
+      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
+      if (!valid) return;
+
+      if (this.isSubmit) return;
+      this.isSubmit = true;
+      const data = await markSettingSave(this.modalForm).catch(() => {
+        this.isSubmit = false;
+      });
+
+      if (!data) return;
+
+      this.isSubmit = false;
+      this.$message.success("修改成功!");
+      this.$emit("modified");
+      this.cancel();
+    },
+  },
+};
+</script>

+ 10 - 0
src/modules/mark/router.js

@@ -0,0 +1,10 @@
+// print
+import MarkEntrance from "./views/MarkEntrance.vue";
+
+export default [
+  {
+    path: "/mark/mark-entrance",
+    name: "MarkEntrance",
+    component: MarkEntrance,
+  },
+];

+ 138 - 0
src/modules/mark/views/MarkEntrance.vue

@@ -0,0 +1,138 @@
+<template>
+  <div class="mark-entrance">
+    <div class="part-box part-box-filter part-box-flex">
+      <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
+        <template v-if="checkPrivilege('condition', 'condition')">
+          <secp-select
+            v-model="filter"
+            @semester-default="search"
+          ></secp-select>
+        </template>
+        <el-form-item label-width="0px">
+          <el-button
+            v-if="checkPrivilege('button', 'select')"
+            type="primary"
+            @click="search"
+            >查询</el-button
+          >
+        </el-form-item>
+      </el-form>
+      <div class="part-box-action"></div>
+    </div>
+
+    <div class="part-box part-box-pad">
+      <el-table ref="TableList" :data="dataList">
+        <el-table-column
+          type="index"
+          label="序号"
+          width="70"
+          :index="indexMethod"
+        ></el-table-column>
+        <el-table-column prop="courseName" label="课程(代码)" min-width="200">
+          <template slot-scope="scope">
+            {{ scope.row.courseName }}({{ scope.row.courseCode }})
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="paperNumber"
+          label="试卷编号"
+          min-width="100"
+        ></el-table-column>
+        <el-table-column
+          prop="groupQuestions"
+          label="评阅题目"
+          min-width="200"
+        ></el-table-column>
+        <el-table-column
+          prop="markedCount"
+          label="已评"
+          width="80"
+        ></el-table-column>
+        <el-table-column
+          prop="leftCount"
+          label="未评"
+          width="80"
+        ></el-table-column>
+        <el-table-column prop="percent" label="评卷进度" width="100">
+          <span slot-scope="scope"> {{ scope.row.percent || 0 }}%</span>
+        </el-table-column>
+        <el-table-column
+          class-name="action-column"
+          label="操作"
+          width="140"
+          fixed="right"
+        >
+          <template slot-scope="scope">
+            <el-button
+              v-if="checkPrivilege('link', 'preview')"
+              class="btn-primary"
+              type="text"
+              @click="toMark(scope.row)"
+              >点击评卷</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="part-page">
+        <el-pagination
+          background
+          layout="total, sizes, prev, pager, next, jumper"
+          :pager-count="5"
+          :current-page="current"
+          :total="total"
+          :page-size="size"
+          @current-change="toPage"
+          @size-change="pageSizeChange"
+        >
+        </el-pagination>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { markTaskListPage } from "../api";
+
+export default {
+  name: "mark-entrance",
+  data() {
+    return {
+      filter: {
+        semesterId: "",
+        examId: "",
+        courseCode: "",
+        paperNumber: "",
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      dataList: [],
+      curUserId: this.$ls.get("user", { id: "" }).id,
+    };
+  },
+  methods: {
+    async getList() {
+      if (!this.checkPrivilege("list", "list")) return;
+
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size,
+      };
+      const data = await markTaskListPage(datas);
+      this.dataList = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    search() {
+      this.toPage(1);
+    },
+    toMark(row) {
+      // TODO:去阅卷
+    },
+  },
+};
+</script>

+ 13 - 0
src/modules/mark/views/MarkManage.vue

@@ -0,0 +1,13 @@
+<template>
+  <div class="mark-manage">mark-manage</div>
+</template>
+
+<script>
+export default {
+  name: "mark-manage",
+  data() {
+    return {};
+  },
+  methods: {},
+};
+</script>

+ 189 - 0
src/modules/mark/views/MarkSetting.vue

@@ -0,0 +1,189 @@
+<template>
+  <div class="mark-setting">
+    <div class="part-box part-box-filter part-box-flex">
+      <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
+        <template v-if="checkPrivilege('condition', 'condition')">
+          <secp-select
+            v-model="filter"
+            @semester-default="search"
+          ></secp-select>
+        </template>
+        <el-form-item label="状态">
+          <el-select
+            v-model="filter.groupStatus"
+            style="width: 120px"
+            placeholder="状态"
+            clearable
+          >
+            <el-option :value="1">已提交</el-option>
+            <el-option :value="0">未提交</el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label-width="0px">
+          <el-button
+            v-if="checkPrivilege('button', 'select')"
+            type="primary"
+            @click="search"
+            >查询</el-button
+          >
+        </el-form-item>
+      </el-form>
+      <div class="part-box-action">
+        <el-button
+          v-if="checkPrivilege('button', 'add')"
+          type="primary"
+          :disabled="!multipleSelection.length"
+          @click="toBatchModifySetting"
+        >
+          评卷设置
+        </el-button>
+      </div>
+    </div>
+
+    <div class="part-box part-box-pad">
+      <el-table
+        ref="TableList"
+        :data="dataList"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column
+          type="selection"
+          width="55"
+          align="center"
+        ></el-table-column>
+        <el-table-column prop="courseName" label="课程(代码)" min-width="200">
+          <template slot-scope="scope">
+            {{ scope.row.courseName }}({{ scope.row.courseCode }})
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="paperNumber"
+          label="试卷编号"
+          min-width="140"
+        ></el-table-column>
+        <el-table-column
+          prop="groupStatus"
+          label="状态"
+          width="120"
+        ></el-table-column>
+        <el-table-column prop="markMode" label="评卷模式" width="120">
+          <template slot-scope="scope">
+            {{ scope.row.markMode | markModeTypeFilter }}
+          </template>
+        </el-table-column>
+        <el-table-column
+          class-name="action-column"
+          label="操作"
+          width="200"
+          fixed="right"
+        >
+          <template slot-scope="scope">
+            <el-button
+              v-if="checkPrivilege('link', 'Submit')"
+              class="btn-primary"
+              type="text"
+              :disabled="scope.row.taskStatus === 'RUNNING'"
+              @click="toSetParams(scope.row)"
+              >评卷参数设置</el-button
+            >
+            <el-button
+              v-if="checkPrivilege('link', 'Submit')"
+              class="btn-primary"
+              type="text"
+              :disabled="scope.row.taskStatus === 'RUNNING'"
+              @click="toModifySetting(scope.row)"
+              >评卷设置</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="part-page">
+        <el-pagination
+          background
+          layout="total, sizes, prev, pager, next, jumper"
+          :pager-count="5"
+          :current-page="current"
+          :total="total"
+          :page-size="size"
+          @current-change="toPage"
+          @size-change="pageSizeChange"
+        >
+        </el-pagination>
+      </div>
+    </div>
+    <!-- ModifyMarkSetting -->
+    <modify-mark-setting
+      ref="ModifyMarkSetting"
+      :instance="curRow"
+      @modified="getList"
+    ></modify-mark-setting>
+  </div>
+</template>
+
+<script>
+import { markSettingListPage } from "../api";
+import ModifyMarkSetting from "../components/ModifyMarkSetting.vue";
+
+export default {
+  name: "mark-setting",
+  components: { ModifyMarkSetting },
+  data() {
+    return {
+      filter: {
+        semesterId: "",
+        examId: "",
+        courseCode: "",
+        paperNumber: "",
+        groupStatus: null,
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      dataList: [],
+      curRow: {},
+      multipleSelection: [],
+    };
+  },
+  methods: {
+    async getList() {
+      if (!this.checkPrivilege("list", "list")) return;
+
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size,
+      };
+      if (datas.groupStatus !== null && datas.groupStatus !== "")
+        datas.groupStatus = !!datas.groupStatus;
+
+      const data = await markSettingListPage(datas);
+      this.dataList = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    search() {
+      this.toPage(1);
+    },
+    handleSelectionChange(val) {
+      this.multipleSelection = val.map((item) => item.id);
+    },
+    toSetParams(row) {
+      // TODO:去设置参数
+      console.log(row);
+    },
+    toModifySetting(row) {
+      this.curRow = row;
+      this.$refs.ModifyMarkSetting.open();
+    },
+    toBatchModifySetting() {
+      if (!this.multipleSelection.length) {
+        this.$message.error("请选择数据");
+        return;
+      }
+    },
+  },
+};
+</script>

+ 13 - 0
src/modules/mark/views/ScoreCheck.vue

@@ -0,0 +1,13 @@
+<template>
+  <div class="mark-check">mark-check</div>
+</template>
+
+<script>
+export default {
+  name: "mark-check",
+  data() {
+    return {};
+  },
+  methods: {},
+};
+</script>

+ 4 - 0
src/plugins/filters.js

@@ -24,6 +24,7 @@ import {
   ANALYSIS_BATCH_STATUS,
   EXAM_NUMBER_STYLE,
   FLOW_TYPE,
+  MARK_MODE_TYPE,
 } from "../constants/enumerate";
 import { formatDate } from "../plugins/utils";
 
@@ -124,3 +125,6 @@ Vue.filter("analysisBatchStatusFilter", function (val) {
 Vue.filter("examNumberStyleFilter", function (val) {
   return EXAM_NUMBER_STYLE[val] || DEFAULT_FIELD;
 });
+Vue.filter("markModeTypeFilter", function (val) {
+  return MARK_MODE_TYPE[val] || DEFAULT_FIELD;
+});

+ 2 - 0
src/router.js

@@ -12,6 +12,7 @@ import exam from "./modules/exam/router";
 import print from "./modules/print/router";
 import stmms from "./modules/stmms/router";
 import analysis from "./modules/analysis/router";
+import mark from "./modules/mark/router";
 // card part
 import card from "./modules/card/router";
 // admin
@@ -62,6 +63,7 @@ let router = new Router({
         ...print,
         ...stmms,
         ...analysis,
+        ...mark,
       ],
     },
     { ...login },