zhangjie 3 yıl önce
ebeveyn
işleme
cdb54b16d1

+ 8 - 0
src/modules/analysis/components/ModifyBaseConfig.vue

@@ -188,6 +188,14 @@ export default {
       this.curStep = ind;
     },
     modified() {
+      if (
+        this.curStep === this.steps.length - 1 &&
+        this.steps[this.curStep].status === "process"
+      ) {
+        this.cancel();
+        return;
+      }
+
       this[this.steps[this.curStep].fetchFunc]();
       this.steps[this.curStep].status = "success";
       if (

+ 5 - 3
src/modules/analysis/components/baseConfig/ModifyAbilityDim.vue

@@ -50,8 +50,10 @@
         <el-input
           v-model.trim="modalForm.interpretation"
           type="textarea"
-          :autosize="{ minRows: 2, maxRows: 5 }"
+          :autosize="{ minRows: 3, maxRows: 5 }"
           placeholder="请输入一级维度术语解释"
+          maxlength="100"
+          show-word-limit
         ></el-input>
       </el-form-item>
     </el-form>
@@ -147,8 +149,8 @@ export default {
             trigger: "change"
           },
           {
-            max: 50,
-            message: "一级能力维度字数不能超过50",
+            max: 30,
+            message: "一级能力维度字数不能超过30",
             trigger: "change"
           },
           {

+ 9 - 7
src/modules/analysis/components/baseConfig/ModifyKnowledgeDim.vue

@@ -66,8 +66,10 @@
         <el-input
           v-model.trim="modalForm.interpretation"
           type="textarea"
-          :autosize="{ minRows: 2, maxRows: 5 }"
+          :autosize="{ minRows: 3, maxRows: 5 }"
           placeholder="请输入一级维度术语解释"
+          maxlength="100"
+          show-word-limit
         ></el-input>
       </el-form-item>
     </el-form>
@@ -265,8 +267,8 @@ export default {
             trigger: "change"
           },
           {
-            max: 50,
-            message: "一级知识维度字数不能超过50",
+            max: 30,
+            message: "一级知识维度字数不能超过30",
             trigger: "change"
           },
           {
@@ -289,8 +291,8 @@ export default {
             trigger: "change"
           },
           {
-            max: 50,
-            message: "二级知识维度字数不能超过50",
+            max: 30,
+            message: "二级知识维度字数不能超过30",
             trigger: "change"
           },
           {
@@ -301,8 +303,8 @@ export default {
         codeSecond: [
           {
             required: true,
-            pattern: /^[A-Z][0-9]{1,}$/,
-            message: "二级维度编号只能是大写字母+数字",
+            pattern: /^[A-Z][0-9]{1,4}$/,
+            message: "二级维度编号只能是大写字母+数字,长度不能超过5",
             trigger: "change"
           },
           {

+ 395 - 395
src/modules/exam/views/TaskPaperManage.vue

@@ -1,395 +1,395 @@
-<template>
-  <div class="task-paper-manage">
-    <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')">
-          <el-form-item label="学期:">
-            <semester-select v-model="filter.semesterId"></semester-select>
-          </el-form-item>
-          <el-form-item label="考试:">
-            <exam-select
-              v-model="filter.examId"
-              :semester-id="filter.semesterId"
-            ></exam-select>
-          </el-form-item>
-          <el-form-item label="课程(代码):" label-width="110px">
-            <course-select
-              ref="CourseSelect"
-              v-model.trim="filter.courseCode"
-              placeholder="课程(代码)"
-              clearable
-            ></course-select>
-          </el-form-item>
-          <el-form-item label="试卷编号:">
-            <paper-number-select
-              ref="PaperNumberSelect"
-              v-model="filter.paperNumber"
-              placeholder="试卷编号"
-              clearable
-            ></paper-number-select>
-          </el-form-item>
-          <el-form-item label="题卡规则:">
-            <card-rule-select
-              v-model="filter.cardRuleId"
-              placeholder="题卡规则"
-              clearable
-            ></card-rule-select>
-          </el-form-item>
-          <el-form-item label="题卡创建类型:">
-            <el-select
-              v-model="filter.makeMethod"
-              placeholder="题卡创建类型"
-              clearable
-            >
-              <el-option
-                v-for="(val, key) in CARD_SOURCE_TYPE"
-                :key="key"
-                :value="key"
-                :label="val"
-              >
-              </el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="入库时间:">
-            <el-date-picker
-              v-model="createTime"
-              type="datetimerange"
-              :picker-options="pickerOptions"
-              range-separator="至"
-              start-placeholder="入库开始时间"
-              end-placeholder="入库结束时间"
-              value-format="timestamp"
-              align="right"
-              unlink-panels
-            >
-            </el-date-picker>
-          </el-form-item>
-        </template>
-        <el-form-item label-width="0px">
-          <el-button
-            v-if="checkPrivilege('button', 'select')"
-            type="primary"
-            @click="toPage(1)"
-            >查询</el-button
-          >
-        </el-form-item>
-      </el-form>
-      <div class="part-box-action">
-        <el-button
-          v-if="checkPrivilege('button', 'BatchDownload')"
-          icon="el-icon-download"
-          type="primary"
-          :loading="loading"
-          @click="toBatchExport"
-        >
-          批量下载试卷题卡
-        </el-button>
-      </div>
-    </div>
-
-    <div class="part-box part-box-pad">
-      <el-table ref="TableList" :data="papers">
-        <el-table-column
-          type="index"
-          label="序号"
-          width="70"
-          :index="indexMethod"
-        ></el-table-column>
-        <el-table-column prop="semesterName" label="学期"></el-table-column>
-        <el-table-column prop="examName" label="考试"></el-table-column>
-        <el-table-column prop="paperNumber" label="试卷编号"></el-table-column>
-        <el-table-column prop="courseName" label="课程(代码)">
-          <template slot-scope="scope">
-            {{ scope.row.courseName }}({{ scope.row.courseCode }})
-          </template>
-        </el-table-column>
-        <el-table-column
-          prop="paperType"
-          label="卷型"
-          width="100"
-        ></el-table-column>
-        <el-table-column
-          prop="userName"
-          label="命题老师"
-          width="100"
-        ></el-table-column>
-        <el-table-column prop="createTime" label="入库时间">
-          <span slot-scope="scope">{{
-            scope.row.createTime | timestampFilter
-          }}</span>
-        </el-table-column>
-        <el-table-column prop="exposedPaperType" label="已曝光" width="100">
-          <span slot-scope="scope">{{
-            scope.row.exposedPaperType | defaultFieldFilter
-          }}</span>
-        </el-table-column>
-        <el-table-column prop="unexposedPaperType" label="未曝光" width="100">
-          <span slot-scope="scope">{{
-            scope.row.unexposedPaperType | defaultFieldFilter
-          }}</span>
-        </el-table-column>
-        <el-table-column prop="cardRuleName" label="题卡规则"></el-table-column>
-        <el-table-column prop="makeMethod" label="题卡创建类型">
-          <span slot-scope="scope">{{
-            scope.row.makeMethod | cardSourceTypeFilter
-          }}</span>
-        </el-table-column>
-        <el-table-column prop="enable" label="启用/禁用" width="100">
-          <template slot-scope="scope">
-            {{ scope.row.enable | enableFilter }}
-          </template>
-        </el-table-column>
-        <el-table-column class-name="action-column" label="操作" width="180px">
-          <template slot-scope="scope">
-            <el-button
-              v-if="checkPrivilege('link', 'preview')"
-              class="btn-primary"
-              type="text"
-              @click="toPreview(scope.row)"
-              >查看</el-button
-            >
-            <el-button
-              v-if="checkPrivilege('link', 'edit')"
-              class="btn-primary"
-              type="text"
-              @click="toEdit(scope.row)"
-              >修改</el-button
-            >
-            <el-button
-              v-if="checkPrivilege('link', 'enable')"
-              :class="scope.row.enable ? 'btn-danger' : 'btn-primary'"
-              type="text"
-              @click="toEnable(scope.row)"
-              >{{ scope.row.enable ? "禁用" : "启用" }}</el-button
-            >
-            <el-button
-              v-if="checkPrivilege('link', 'download')"
-              class="btn-primary"
-              type="text"
-              :disabled="loading"
-              @click="toDownload(scope.row)"
-              >下载</el-button
-            >
-            <el-button
-              v-if="checkPrivilege('link', 'publish')"
-              class="btn-primary"
-              type="text"
-              @click="toPublishPrintTask(scope.row)"
-              >发布印刷任务</el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
-      <div class="part-page">
-        <el-pagination
-          v-if="papers.length"
-          background
-          layout="total,prev, pager, next"
-          :current-page="current"
-          :total="total"
-          :page-size="size"
-          @current-change="toPage"
-        >
-        </el-pagination>
-      </div>
-    </div>
-
-    <!-- ModifyTaskPaper -->
-    <modify-task-paper
-      :instance="curPaper"
-      :edit-type="editType"
-      ref="ModifyTaskPaper"
-      @modified="getList"
-    ></modify-task-paper>
-    <!-- PublishPrintTask -->
-    <publish-print-task
-      :instance="curPaper"
-      ref="PublishPrintTask"
-    ></publish-print-task>
-  </div>
-</template>
-
-<script>
-import {
-  taskPaperListPage,
-  ableTaskPaper,
-  downloadPaper,
-  paperAndCardBatchExport
-} from "../api";
-import pickerOptions from "@/constants/datePickerOptions";
-import { downloadByApi } from "@/plugins/download";
-import { CARD_SOURCE_TYPE } from "@/constants/enumerate";
-import ModifyTaskPaper from "../components/ModifyTaskPaper";
-import PublishPrintTask from "../components/PublishPrintTask";
-
-export default {
-  name: "task-paper-manage",
-  components: { ModifyTaskPaper, PublishPrintTask },
-  data() {
-    return {
-      filter: {
-        semesterId: "",
-        examId: "",
-        courseCode: "",
-        paperNumber: "",
-        cardRuleId: "",
-        makeMethod: "",
-        startTime: "",
-        endTime: ""
-      },
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      total: 0,
-      papers: [],
-      curPaper: {},
-      loading: false,
-      editType: "EDIT",
-      CARD_SOURCE_TYPE,
-      IS_QUESTION_TEACHER: this.$ls
-        .get("user", { roleList: [] })
-        .roleList.includes("QUESTION_TEACHER"),
-      IS_EXAM_TEACHER: this.$ls
-        .get("user", { roleList: [] })
-        .roleList.includes("EXAM_TEACHER"),
-      // date-picker
-      createTime: [],
-      pickerOptions
-    };
-  },
-  mounted() {
-    this.initData();
-  },
-  methods: {
-    async initData() {
-      const cachePageInfo = this.$ls.get("cachePageInfo");
-      if (cachePageInfo) {
-        this.filter = this.$objAssign(this.filter, cachePageInfo.filter);
-        if (this.filter.startTime && this.filter.endTime)
-          this.createTime = [this.filter.startTime, this.filter.endTime];
-        this.current = cachePageInfo.page;
-        await this.getList();
-
-        this.$nextTick(() => {
-          const curRow = this.papers.find(
-            item => item.id === cachePageInfo.curRowId
-          );
-          if (!curRow) return;
-          this.toEdit(curRow);
-        });
-      } else {
-        this.toPage(1);
-      }
-      this.$ls.remove("cachePageInfo");
-    },
-    async getList() {
-      if (!this.checkPrivilege("list", "list")) return;
-
-      const datas = {
-        ...this.filter,
-        pageNumber: this.current,
-        pageSize: this.size
-      };
-      if (this.createTime) {
-        datas.startTime = this.createTime[0];
-        datas.endTime = this.createTime[1];
-      }
-      const data = await taskPaperListPage(datas);
-      this.papers = data.records;
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-    },
-    async toEnable(row) {
-      const msgs = [
-        ["命题任务禁用后,会触发试卷关联解除,您确定要禁用命题任务吗?"],
-        [
-          "命题任务启用后,触发试卷关联校验,若能匹配则自动关联试卷,您确定要启用命题任务吗?"
-        ]
-      ];
-      const msg = row.enable ? msgs[0] : msgs[1];
-      const msgHtml = msg
-        .map(item => `<p class="text-left">${item}</p>`)
-        .join("");
-      this.$confirm(msgHtml, "提示", {
-        dangerouslyUseHTMLString: true,
-        type: "warning"
-      })
-        .then(async () => {
-          const enable = !row.enable;
-          await ableTaskPaper({
-            id: row.id,
-            enable
-          });
-          row.enable = enable;
-          this.$message.success("操作成功!");
-        })
-        .catch(() => {});
-    },
-    toEdit(row) {
-      this.curPaper = row;
-      this.editType = "EDIT";
-      this.$refs.ModifyTaskPaper.open();
-    },
-    toPreview(row) {
-      this.curPaper = row;
-      this.editType = "PREVIEW";
-      this.$refs.ModifyTaskPaper.open();
-    },
-    toPublishPrintTask(row) {
-      this.curPaper = row;
-      this.$refs.PublishPrintTask.open();
-    },
-    async toDownload(row) {
-      if (this.loading) return;
-
-      this.loading = true;
-      const res = await downloadByApi(() => {
-        return downloadPaper(row.id);
-      }, `${row.paperNumber}-${Date.now()}.zip`).catch(e => {
-        this.$message.error(e || "下载失败,请重新尝试!");
-      });
-      this.downloading = false;
-
-      if (!res) return;
-      this.$message.success("下载成功!");
-    },
-    async toBatchExport() {
-      // 异步导出
-      if (this.loading) return;
-
-      this.loading = true;
-      let datas = {
-        ...this.filter
-      };
-      if (this.createTime) {
-        datas.startTime = this.createTime[0];
-        datas.endTime = this.createTime[1];
-      }
-      const res = await paperAndCardBatchExport(datas).catch(() => {});
-      this.loading = false;
-
-      if (res) {
-        this.$message.success(
-          "导出任务已提交,请在系统设置-任务管理中下载文件!"
-        );
-      } else {
-        this.$message.error("导出任务提交失败,请重新尝试!");
-      }
-    }
-  },
-  beforeRouteLeave(to, from, next) {
-    if (to.name === "CardEdit") {
-      this.$ls.set("cachePageInfo", {
-        page: this.current,
-        filter: this.filter,
-        curRowId: this.curPaper.id
-      });
-    } else {
-      this.$ls.remove("cachePageInfo");
-    }
-    next();
-  }
-};
-</script>
+<template>
+  <div class="task-paper-manage">
+    <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')">
+          <el-form-item label="学期:">
+            <semester-select v-model="filter.semesterId"></semester-select>
+          </el-form-item>
+          <el-form-item label="考试:">
+            <exam-select
+              v-model="filter.examId"
+              :semester-id="filter.semesterId"
+            ></exam-select>
+          </el-form-item>
+          <el-form-item label="课程(代码):" label-width="110px">
+            <course-select
+              ref="CourseSelect"
+              v-model.trim="filter.courseCode"
+              placeholder="课程(代码)"
+              clearable
+            ></course-select>
+          </el-form-item>
+          <el-form-item label="试卷编号:">
+            <paper-number-select
+              ref="PaperNumberSelect"
+              v-model="filter.paperNumber"
+              placeholder="试卷编号"
+              clearable
+            ></paper-number-select>
+          </el-form-item>
+          <el-form-item label="题卡规则:">
+            <card-rule-select
+              v-model="filter.cardRuleId"
+              placeholder="题卡规则"
+              clearable
+            ></card-rule-select>
+          </el-form-item>
+          <el-form-item label="题卡创建类型:">
+            <el-select
+              v-model="filter.makeMethod"
+              placeholder="题卡创建类型"
+              clearable
+            >
+              <el-option
+                v-for="(val, key) in CARD_SOURCE_TYPE"
+                :key="key"
+                :value="key"
+                :label="val"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="入库时间:">
+            <el-date-picker
+              v-model="createTime"
+              type="datetimerange"
+              :picker-options="pickerOptions"
+              range-separator="至"
+              start-placeholder="入库开始时间"
+              end-placeholder="入库结束时间"
+              value-format="timestamp"
+              align="right"
+              unlink-panels
+            >
+            </el-date-picker>
+          </el-form-item>
+        </template>
+        <el-form-item label-width="0px">
+          <el-button
+            v-if="checkPrivilege('button', 'select')"
+            type="primary"
+            @click="toPage(1)"
+            >查询</el-button
+          >
+        </el-form-item>
+      </el-form>
+      <div class="part-box-action">
+        <el-button
+          v-if="checkPrivilege('button', 'BatchDownload')"
+          icon="el-icon-download"
+          type="primary"
+          :loading="loading"
+          @click="toBatchExport"
+        >
+          批量下载试卷题卡
+        </el-button>
+      </div>
+    </div>
+
+    <div class="part-box part-box-pad">
+      <el-table ref="TableList" :data="papers">
+        <el-table-column
+          type="index"
+          label="序号"
+          width="70"
+          :index="indexMethod"
+        ></el-table-column>
+        <el-table-column prop="semesterName" label="学期"></el-table-column>
+        <el-table-column prop="examName" label="考试"></el-table-column>
+        <el-table-column prop="paperNumber" label="试卷编号"></el-table-column>
+        <el-table-column prop="courseName" label="课程(代码)">
+          <template slot-scope="scope">
+            {{ scope.row.courseName }}({{ scope.row.courseCode }})
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="paperType"
+          label="卷型"
+          width="100"
+        ></el-table-column>
+        <el-table-column
+          prop="userName"
+          label="命题老师"
+          width="100"
+        ></el-table-column>
+        <el-table-column prop="createTime" label="入库时间">
+          <span slot-scope="scope">{{
+            scope.row.createTime | timestampFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column prop="exposedPaperType" label="已曝光" width="100">
+          <span slot-scope="scope">{{
+            scope.row.exposedPaperType | defaultFieldFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column prop="unexposedPaperType" label="未曝光" width="100">
+          <span slot-scope="scope">{{
+            scope.row.unexposedPaperType | defaultFieldFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column prop="cardRuleName" label="题卡规则"></el-table-column>
+        <el-table-column prop="makeMethod" label="题卡创建类型">
+          <span slot-scope="scope">{{
+            scope.row.makeMethod | cardSourceTypeFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column prop="enable" label="启用/禁用" width="100">
+          <template slot-scope="scope">
+            {{ scope.row.enable | enableFilter }}
+          </template>
+        </el-table-column>
+        <el-table-column class-name="action-column" label="操作" width="180px">
+          <template slot-scope="scope">
+            <el-button
+              v-if="checkPrivilege('link', 'preview')"
+              class="btn-primary"
+              type="text"
+              @click="toPreview(scope.row)"
+              >查看</el-button
+            >
+            <el-button
+              v-if="checkPrivilege('link', 'edit')"
+              class="btn-primary"
+              type="text"
+              @click="toEdit(scope.row)"
+              >修改</el-button
+            >
+            <el-button
+              v-if="checkPrivilege('link', 'enable')"
+              :class="scope.row.enable ? 'btn-danger' : 'btn-primary'"
+              type="text"
+              @click="toEnable(scope.row)"
+              >{{ scope.row.enable ? "禁用" : "启用" }}</el-button
+            >
+            <el-button
+              v-if="checkPrivilege('link', 'download')"
+              class="btn-primary"
+              type="text"
+              :disabled="loading"
+              @click="toDownload(scope.row)"
+              >下载</el-button
+            >
+            <el-button
+              v-if="checkPrivilege('link', 'publish')"
+              class="btn-primary"
+              type="text"
+              @click="toPublishPrintTask(scope.row)"
+              >发布印刷任务</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="part-page">
+        <el-pagination
+          v-if="papers.length"
+          background
+          layout="total,prev, pager, next"
+          :current-page="current"
+          :total="total"
+          :page-size="size"
+          @current-change="toPage"
+        >
+        </el-pagination>
+      </div>
+    </div>
+
+    <!-- ModifyTaskPaper -->
+    <modify-task-paper
+      :instance="curPaper"
+      :edit-type="editType"
+      ref="ModifyTaskPaper"
+      @modified="getList"
+    ></modify-task-paper>
+    <!-- PublishPrintTask -->
+    <publish-print-task
+      :instance="curPaper"
+      ref="PublishPrintTask"
+    ></publish-print-task>
+  </div>
+</template>
+
+<script>
+import {
+  taskPaperListPage,
+  ableTaskPaper,
+  downloadPaper,
+  paperAndCardBatchExport
+} from "../api";
+import pickerOptions from "@/constants/datePickerOptions";
+import { downloadByApi } from "@/plugins/download";
+import { CARD_SOURCE_TYPE } from "@/constants/enumerate";
+import ModifyTaskPaper from "../components/ModifyTaskPaper";
+import PublishPrintTask from "../components/PublishPrintTask";
+
+export default {
+  name: "task-paper-manage",
+  components: { ModifyTaskPaper, PublishPrintTask },
+  data() {
+    return {
+      filter: {
+        semesterId: "",
+        examId: "",
+        courseCode: "",
+        paperNumber: "",
+        cardRuleId: "",
+        makeMethod: "",
+        startTime: "",
+        endTime: ""
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      papers: [],
+      curPaper: {},
+      loading: false,
+      editType: "EDIT",
+      CARD_SOURCE_TYPE,
+      IS_QUESTION_TEACHER: this.$ls
+        .get("user", { roleList: [] })
+        .roleList.includes("QUESTION_TEACHER"),
+      IS_EXAM_TEACHER: this.$ls
+        .get("user", { roleList: [] })
+        .roleList.includes("EXAM_TEACHER"),
+      // date-picker
+      createTime: [],
+      pickerOptions
+    };
+  },
+  mounted() {
+    this.initData();
+  },
+  methods: {
+    async initData() {
+      const cachePageInfo = this.$ls.get("cachePageInfo");
+      if (cachePageInfo) {
+        this.filter = this.$objAssign(this.filter, cachePageInfo.filter);
+        if (this.filter.startTime && this.filter.endTime)
+          this.createTime = [this.filter.startTime, this.filter.endTime];
+        this.current = cachePageInfo.page;
+        await this.getList();
+
+        this.$nextTick(() => {
+          const curRow = this.papers.find(
+            item => item.id === cachePageInfo.curRowId
+          );
+          if (!curRow) return;
+          this.toEdit(curRow);
+        });
+      } else {
+        this.toPage(1);
+      }
+      this.$ls.remove("cachePageInfo");
+    },
+    async getList() {
+      if (!this.checkPrivilege("list", "list")) return;
+
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      if (this.createTime) {
+        datas.startTime = this.createTime[0];
+        datas.endTime = this.createTime[1];
+      }
+      const data = await taskPaperListPage(datas);
+      this.papers = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    async toEnable(row) {
+      const msgs = [
+        ["命题任务禁用后,会触发试卷关联解除,您确定要禁用命题任务吗?"],
+        [
+          "命题任务启用后,触发试卷关联校验,若能匹配则自动关联试卷,您确定要启用命题任务吗?"
+        ]
+      ];
+      const msg = row.enable ? msgs[0] : msgs[1];
+      const msgHtml = msg
+        .map(item => `<p class="text-left">${item}</p>`)
+        .join("");
+      this.$confirm(msgHtml, "提示", {
+        dangerouslyUseHTMLString: true,
+        type: "warning"
+      })
+        .then(async () => {
+          const enable = !row.enable;
+          await ableTaskPaper({
+            id: row.id,
+            enable
+          });
+          row.enable = enable;
+          this.$message.success("操作成功!");
+        })
+        .catch(() => {});
+    },
+    toEdit(row) {
+      this.curPaper = row;
+      this.editType = "EDIT";
+      this.$refs.ModifyTaskPaper.open();
+    },
+    toPreview(row) {
+      this.curPaper = row;
+      this.editType = "PREVIEW";
+      this.$refs.ModifyTaskPaper.open();
+    },
+    toPublishPrintTask(row) {
+      this.curPaper = row;
+      this.$refs.PublishPrintTask.open();
+    },
+    async toDownload(row) {
+      if (this.loading) return;
+
+      this.loading = true;
+      const res = await downloadByApi(() => {
+        return downloadPaper(row.id);
+      }, `${row.paperNumber}-${Date.now()}.zip`).catch(e => {
+        this.$message.error(e || "下载失败,请重新尝试!");
+      });
+      this.loading = false;
+
+      if (!res) return;
+      this.$message.success("下载成功!");
+    },
+    async toBatchExport() {
+      // 异步导出
+      if (this.loading) return;
+
+      this.loading = true;
+      let datas = {
+        ...this.filter
+      };
+      if (this.createTime) {
+        datas.startTime = this.createTime[0];
+        datas.endTime = this.createTime[1];
+      }
+      const res = await paperAndCardBatchExport(datas).catch(() => {});
+      this.loading = false;
+
+      if (res) {
+        this.$message.success(
+          "导出任务已提交,请在系统设置-任务管理中下载文件!"
+        );
+      } else {
+        this.$message.error("导出任务提交失败,请重新尝试!");
+      }
+    }
+  },
+  beforeRouteLeave(to, from, next) {
+    if (to.name === "CardEdit") {
+      this.$ls.set("cachePageInfo", {
+        page: this.current,
+        filter: this.filter,
+        curRowId: this.curPaper.id
+      });
+    } else {
+      this.$ls.remove("cachePageInfo");
+    }
+    next();
+  }
+};
+</script>

+ 284 - 275
src/modules/stmms/views/ScoreArchive.vue

@@ -1,275 +1,284 @@
-<template>
-  <div class="score-archive">
-    <div class="part-box part-box-filter part-box-flex">
-      <el-form ref="FilterForm" label-position="left" inline>
-        <template v-if="checkPrivilege('condition', 'condition')">
-          <el-form-item label="学期:">
-            <semester-select v-model="filter.semesterId"></semester-select>
-          </el-form-item>
-          <el-form-item label="考试:">
-            <exam-select
-              v-model="filter.examId"
-              :semester-id="filter.semesterId"
-            ></exam-select>
-          </el-form-item>
-          <el-form-item label="班级:">
-            <class-select
-              v-model="filter.clazzId"
-              type="ALL_CLAZZ"
-              placeholder="班级"
-            ></class-select>
-          </el-form-item>
-          <el-form-item label="课程:">
-            <course-select
-              v-model="filter.courseCode"
-              placeholder="课程"
-              filterable
-              clearable
-            ></course-select>
-          </el-form-item>
-        </template>
-        <el-form-item label-width="0px">
-          <el-button
-            v-if="checkPrivilege('button', 'select')"
-            type="primary"
-            :disabled="!filter.semesterId || !filter.courseCode"
-            @click="toPage(1)"
-            >查询</el-button
-          >
-        </el-form-item>
-      </el-form>
-      <div class="part-box-action">
-        <el-button
-          type="success"
-          icon="el-icon-refresh"
-          :loading="syncLoading"
-          :disabled="!filter.semesterId || !filter.examId"
-          @click="toSync"
-          >同步</el-button
-        >
-        <el-button
-          v-if="checkPrivilege('button', 'BatchDownload')"
-          type="primary"
-          icon="el-icon-download"
-          :loading="loading"
-          :disabled="!filter.semesterId || !filter.courseCode"
-          @click="toDownloadAll"
-          >一键下载</el-button
-        >
-        <el-button
-          v-if="checkPrivilege('button', 'export')"
-          type="primary"
-          icon="el-icon-download"
-          :loading="exportLoading"
-          :disabled="!filter.semesterId || !filter.courseCode"
-          @click="toExport"
-          >成绩导出</el-button
-        >
-      </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="semesterName" label="考试时间"></el-table-column>
-        <el-table-column prop="name" label="姓名" width="120"></el-table-column>
-        <el-table-column prop="studentCode" label="学号"></el-table-column>
-        <el-table-column prop="orgName" label="院系"></el-table-column>
-        <el-table-column prop="majorName" label="专业"></el-table-column>
-        <el-table-column prop="clazzName" label="班级"></el-table-column>
-        <el-table-column prop="courseName" label="课程名"></el-table-column>
-        <el-table-column
-          prop="totalScore"
-          label="成绩"
-          width="80"
-        ></el-table-column>
-        <el-table-column class-name="action-column" label="操作" width="160px">
-          <template slot-scope="scope">
-            <el-button
-              v-if="checkPrivilege('link', 'Preview')"
-              class="btn-primary"
-              type="text"
-              @click="toViewPaper(scope.row)"
-              >查看原卷</el-button
-            >
-            <el-button
-              v-if="checkPrivilege('link', 'download')"
-              class="btn-primary"
-              type="text"
-              :disabled="downloading"
-              @click="toDownload(scope.row)"
-              >下载</el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
-      <div class="part-page">
-        <el-pagination
-          background
-          layout="total,prev, pager, next"
-          :current-page="current"
-          :total="total"
-          :page-size="size"
-          @current-change="toPage"
-        >
-        </el-pagination>
-      </div>
-    </div>
-
-    <!-- image-preview -->
-    <simple-image-preview
-      :cur-image="curImage"
-      @on-prev="toPrevImage"
-      @on-next="toNextImage"
-      ref="SimpleImagePreview"
-    ></simple-image-preview>
-  </div>
-</template>
-
-<script>
-import {
-  scoreListPage,
-  scoreExport,
-  scoreBatchDownload,
-  scoreDownload,
-  scoreSync,
-  scorePreview
-} from "../api";
-// import { downloadPaper } from "../components/downloadPaper";
-import { downloadByApi } from "@/plugins/download";
-import SimpleImagePreview from "@/components/SimpleImagePreview";
-
-export default {
-  name: "score-archive",
-  components: { SimpleImagePreview },
-  data() {
-    return {
-      filter: {
-        semesterId: "",
-        examId: "",
-        clazzId: "",
-        courseCode: ""
-      },
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      total: 0,
-      dataList: [],
-      curImage: {},
-      curRow: {},
-      curPapers: [],
-      downloading: false,
-      syncLoading: false,
-      exportLoading: false,
-      loading: false,
-      // img view
-      curImageIndex: 0,
-      imageList: []
-    };
-  },
-  mounted() {
-    // this.getList();
-  },
-  methods: {
-    async getList() {
-      if (!this.checkPrivilege("list", "list")) return;
-      const datas = {
-        ...this.filter,
-        pageNumber: this.current,
-        pageSize: this.size
-      };
-      const data = await scoreListPage(datas);
-      this.dataList = data.records;
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-    },
-    async toSync() {
-      if (this.syncLoading) return;
-      this.syncLoading = true;
-      const res = await scoreSync({
-        semesterId: this.filter.semesterId,
-        courseCode: this.filter.courseCode,
-        examId: this.filter.examId
-      }).catch(() => {});
-      this.syncLoading = false;
-      if (!res) return;
-      this.$message.success("同步任务已经提交");
-    },
-    async toDownloadAll() {
-      if (this.loading) return;
-      this.loading = true;
-      const res = await scoreBatchDownload(this.filter).catch(() => {});
-      this.loading = false;
-      if (!res) return;
-      this.$message.success("下载任务已经提交");
-    },
-    async toExport() {
-      if (this.exportLoading) return;
-      this.exportLoading = true;
-      const res = await scoreExport(this.filter).catch(() => {});
-      this.exportLoading = false;
-      if (!res) return;
-      this.$message.success("导出任务已经提交");
-    },
-    async toDownload(row) {
-      if (this.downloading) return;
-      this.downloading = true;
-
-      const res = await downloadByApi(() => {
-        return scoreDownload(row.id);
-      }).catch(e => {
-        this.$message.error(e || "下载失败,请重新尝试!");
-      });
-      this.downloading = false;
-
-      if (!res) return;
-      this.$message.success("下载成功!");
-    },
-    // img view
-    async toViewPaper(row) {
-      const res = await scorePreview(row.id).catch(() => {});
-      if (!res) return;
-
-      if (!res.length) {
-        this.$message.error("原卷缺失!");
-        return;
-      }
-
-      this.curImageIndex = 0;
-      this.imageList = res.map((item, index) => {
-        return { url: item, name: index + 1 };
-      });
-      this.selectImage(this.curImageIndex);
-      this.$refs.SimpleImagePreview.open();
-    },
-    selectImage(index) {
-      this.curImage = this.imageList[index];
-    },
-    toPrevImage() {
-      if (this.curImageIndex === 0) {
-        this.curImageIndex = this.imageList.length - 1;
-      } else {
-        this.curImageIndex--;
-      }
-
-      this.selectImage(this.curImageIndex);
-    },
-    toNextImage() {
-      if (this.curImageIndex === this.imageList.length - 1) {
-        this.curImageIndex = 0;
-      } else {
-        this.curImageIndex++;
-      }
-
-      this.selectImage(this.curImageIndex);
-    }
-  }
-};
-</script>
+<template>
+  <div class="score-archive">
+    <div class="part-box part-box-filter part-box-flex">
+      <el-form ref="FilterForm" label-position="left" inline>
+        <template v-if="checkPrivilege('condition', 'condition')">
+          <el-form-item label="学期:">
+            <semester-select v-model="filter.semesterId"></semester-select>
+          </el-form-item>
+          <el-form-item label="考试:">
+            <exam-select
+              v-model="filter.examId"
+              :semester-id="filter.semesterId"
+            ></exam-select>
+          </el-form-item>
+          <el-form-item label="班级:">
+            <class-select
+              v-model="filter.clazzId"
+              type="ALL_CLAZZ"
+              placeholder="班级"
+            ></class-select>
+          </el-form-item>
+          <el-form-item label="课程:">
+            <course-select
+              v-model="filter.courseCode"
+              placeholder="课程"
+              filterable
+              clearable
+            ></course-select>
+          </el-form-item>
+        </template>
+        <el-form-item label-width="0px">
+          <el-button
+            v-if="checkPrivilege('button', 'select')"
+            type="primary"
+            :disabled="!filter.semesterId || !filter.courseCode"
+            @click="toPage(1)"
+            >查询</el-button
+          >
+        </el-form-item>
+      </el-form>
+      <div class="part-box-action">
+        <el-button
+          type="success"
+          icon="el-icon-refresh"
+          :loading="syncLoading"
+          :disabled="!filter.semesterId || !filter.examId"
+          @click="toSync"
+          >同步</el-button
+        >
+        <el-button
+          v-if="checkPrivilege('button', 'BatchDownload')"
+          type="primary"
+          icon="el-icon-download"
+          :loading="loading"
+          :disabled="!filter.semesterId || !filter.courseCode"
+          @click="toDownloadAll"
+          >一键下载</el-button
+        >
+        <el-button
+          v-if="checkPrivilege('button', 'export')"
+          type="primary"
+          icon="el-icon-download"
+          :loading="exportLoading"
+          :disabled="!filter.semesterId || !filter.courseCode"
+          @click="toExport"
+          >成绩导出</el-button
+        >
+      </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="semesterName" label="考试时间"></el-table-column>
+        <el-table-column prop="name" label="姓名" width="120"></el-table-column>
+        <el-table-column prop="studentCode" label="学号"></el-table-column>
+        <el-table-column prop="orgName" label="院系"></el-table-column>
+        <el-table-column prop="majorName" label="专业"></el-table-column>
+        <el-table-column prop="clazzName" label="班级"></el-table-column>
+        <el-table-column prop="courseName" label="课程名"></el-table-column>
+        <el-table-column
+          prop="totalScore"
+          label="成绩"
+          width="80"
+        ></el-table-column>
+        <el-table-column class-name="action-column" label="操作" width="160px">
+          <template slot-scope="scope">
+            <el-button
+              v-if="checkPrivilege('link', 'Preview')"
+              class="btn-primary"
+              type="text"
+              @click="toViewPaper(scope.row, 'sheet')"
+              >原图</el-button
+            >
+            <el-button
+              v-if="checkPrivilege('link', 'Preview')"
+              class="btn-primary"
+              type="text"
+              @click="toViewPaper(scope.row, 'track')"
+              >轨迹图</el-button
+            >
+            <el-button
+              v-if="checkPrivilege('link', 'download')"
+              class="btn-primary"
+              type="text"
+              :disabled="downloading"
+              @click="toDownload(scope.row)"
+              >下载</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="part-page">
+        <el-pagination
+          background
+          layout="total,prev, pager, next"
+          :current-page="current"
+          :total="total"
+          :page-size="size"
+          @current-change="toPage"
+        >
+        </el-pagination>
+      </div>
+    </div>
+
+    <!-- image-preview -->
+    <simple-image-preview
+      :cur-image="curImage"
+      @on-prev="toPrevImage"
+      @on-next="toNextImage"
+      ref="SimpleImagePreview"
+    ></simple-image-preview>
+  </div>
+</template>
+
+<script>
+import {
+  scoreListPage,
+  scoreExport,
+  scoreBatchDownload,
+  scoreDownload,
+  scoreSync,
+  scorePreview
+} from "../api";
+// import { downloadPaper } from "../components/downloadPaper";
+import { downloadByApi } from "@/plugins/download";
+import SimpleImagePreview from "@/components/SimpleImagePreview";
+
+export default {
+  name: "score-archive",
+  components: { SimpleImagePreview },
+  data() {
+    return {
+      filter: {
+        semesterId: "",
+        examId: "",
+        clazzId: "",
+        courseCode: ""
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      dataList: [],
+      curImage: {},
+      curRow: {},
+      curPapers: [],
+      downloading: false,
+      syncLoading: false,
+      exportLoading: false,
+      loading: false,
+      // img view
+      curImageIndex: 0,
+      imageList: []
+    };
+  },
+  mounted() {
+    // this.getList();
+  },
+  methods: {
+    async getList() {
+      if (!this.checkPrivilege("list", "list")) return;
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      const data = await scoreListPage(datas);
+      this.dataList = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    async toSync() {
+      if (this.syncLoading) return;
+      this.syncLoading = true;
+      const res = await scoreSync({
+        semesterId: this.filter.semesterId,
+        courseCode: this.filter.courseCode,
+        examId: this.filter.examId
+      }).catch(() => {});
+      this.syncLoading = false;
+      if (!res) return;
+      this.$message.success("同步任务已经提交");
+    },
+    async toDownloadAll() {
+      if (this.loading) return;
+      this.loading = true;
+      const res = await scoreBatchDownload(this.filter).catch(() => {});
+      this.loading = false;
+      if (!res) return;
+      this.$message.success("下载任务已经提交");
+    },
+    async toExport() {
+      if (this.exportLoading) return;
+      this.exportLoading = true;
+      const res = await scoreExport(this.filter).catch(() => {});
+      this.exportLoading = false;
+      if (!res) return;
+      this.$message.success("导出任务已经提交");
+    },
+    async toDownload(row) {
+      if (this.downloading) return;
+      this.downloading = true;
+
+      const res = await downloadByApi(() => {
+        return scoreDownload(row.id);
+      }).catch(e => {
+        this.$message.error(e || "下载失败,请重新尝试!");
+      });
+      this.downloading = false;
+
+      if (!res) return;
+      this.$message.success("下载成功!");
+    },
+    // img view
+    async toViewPaper(row, viewType) {
+      const res = await scorePreview(row.id).catch(() => {});
+      if (!res) return;
+
+      const dataList = viewType === "sheet" ? res.sheetUrls : res.trailUrls;
+
+      if (!dataList || !dataList.length) {
+        this.$message.error("数据缺失!");
+        return;
+      }
+
+      this.curImageIndex = 0;
+      this.imageList = dataList.map((item, index) => {
+        return { url: item, name: index + 1 };
+      });
+      this.selectImage(this.curImageIndex);
+      this.$refs.SimpleImagePreview.open();
+    },
+    selectImage(index) {
+      this.curImage = this.imageList[index];
+    },
+    toPrevImage() {
+      if (this.curImageIndex === 0) {
+        this.curImageIndex = this.imageList.length - 1;
+      } else {
+        this.curImageIndex--;
+      }
+
+      this.selectImage(this.curImageIndex);
+    },
+    toNextImage() {
+      if (this.curImageIndex === this.imageList.length - 1) {
+        this.curImageIndex = 0;
+      } else {
+        this.curImageIndex++;
+      }
+
+      this.selectImage(this.curImageIndex);
+    }
+  }
+};
+</script>