zhangjie 2 жил өмнө
parent
commit
1cb46edbb9

+ 0 - 9
src/modules/base/views/StudentManage.vue

@@ -10,14 +10,6 @@
             clearable
           ></el-input>
         </el-form-item>
-        <el-form-item label="校区:">
-          <campus-select
-            v-model="filter.campusId"
-            placeholder="校区"
-            clearable
-            @change="campusChange"
-          ></campus-select>
-        </el-form-item>
         <el-form-item label="机构:">
           <college-select
             v-model="filter.collegeId"
@@ -100,7 +92,6 @@
             scope.row.phoneNumber | defaultFieldFilter
           }}</span>
         </el-table-column>
-        <el-table-column prop="campusName" label="校区"></el-table-column>
         <el-table-column prop="collegeName" label="机构"></el-table-column>
         <el-table-column prop="majorName" label="专业"></el-table-column>
         <el-table-column prop="clazz" label="班级"></el-table-column>

+ 310 - 317
src/modules/base/views/UserManage.vue

@@ -1,317 +1,310 @@
-<template>
-  <div class="user-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="用户名:" label-width="75px">
-            <el-input
-              style="width: 142px;"
-              v-model.trim="filter.loginName"
-              placeholder="用户名"
-              clearable
-            ></el-input>
-          </el-form-item>
-          <el-form-item label="姓名:" label-width="75px">
-            <el-input
-              style="width: 142px;"
-              v-model.trim="filter.realName"
-              placeholder="姓名"
-              clearable
-            ></el-input>
-          </el-form-item>
-          <el-form-item label="角色:" label-width="55px">
-            <el-select
-              v-model="filter.roleId"
-              style="width: 142px;"
-              placeholder="角色"
-              filterable
-              clearable
-            >
-              <el-option
-                v-for="item in roles"
-                :key="item.id"
-                :value="item.id"
-                :label="item.name"
-              ></el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="启用/禁用:" label-width="90px">
-            <el-select
-              v-model="filter.enable"
-              style="width: 120px;"
-              placeholder="启用/禁用"
-              clearable
-            >
-              <el-option
-                v-for="(val, key) in ABLE_TYPE"
-                :key="key"
-                :value="key * 1"
-                :label="val"
-              ></el-option>
-            </el-select>
-          </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', 'SyncUser')"
-          type="primary"
-          icon="el-icon-refresh"
-          :loading="loading"
-          @click="syncUser"
-          >同步用户</el-button
-        >
-        <el-button
-          type="success"
-          icon="el-icon-download"
-          v-if="checkPrivilege('button', 'export')"
-          ><a :href="downloadUrl" :download="dfilename">模板下载</a></el-button
-        >
-        <upload-button
-          v-if="checkPrivilege('button', 'export')"
-          btn-icon="el-icon-circle-plus-outline"
-          btn-content="导入用户"
-          btn-type="success"
-          :upload-url="uploadUrl"
-          :format="['xls', 'xlsx']"
-          accept=".xls,.xlsx"
-          @valid-error="validError"
-          @upload-success="uploadSuccess"
-        >
-        </upload-button>
-        <el-button
-          v-if="checkPrivilege('button', 'add')"
-          type="primary"
-          icon="el-icon-circle-plus-outline"
-          @click="toAdd"
-          >新增用户</el-button
-        >
-      </div>
-    </div>
-
-    <div class="part-box part-box-pad">
-      <el-table ref="TableList" :data="users">
-        <el-table-column
-          type="index"
-          label="序号"
-          width="70"
-          :index="indexMethod"
-        ></el-table-column>
-        <el-table-column prop="loginName" label="用户名"></el-table-column>
-        <el-table-column
-          prop="realName"
-          label="姓名"
-          width="120"
-        ></el-table-column>
-        <el-table-column prop="code" label="工号"></el-table-column>
-        <el-table-column
-          prop="mobileNumber"
-          label="手机号"
-          width="120"
-        ></el-table-column>
-        <el-table-column prop="orgName" label="所在机构"></el-table-column>
-        <el-table-column prop="roles" label="角色">
-          <template slot-scope="scope">
-            {{ scope.row.roles | rolesFilter }}
-          </template>
-        </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="200px">
-          <template slot-scope="scope">
-            <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', 'reset')"
-              class="btn-danger"
-              type="text"
-              @click="toResetPwd(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>
-
-    <!-- ModifyUser -->
-    <modify-user
-      ref="ModifyUser"
-      :instance="curUser"
-      :roles="roles"
-      @modified="getList"
-    ></modify-user>
-  </div>
-</template>
-
-<script>
-import ModifyUser from "../components/ModifyUser";
-import { ABLE_TYPE } from "@/constants/enumerate";
-import {
-  userListPage,
-  ableUser,
-  resetPwd,
-  userRoleListPage,
-  syncUserToEcs
-} from "../api";
-// import { logout } from "@/modules/login/api";
-import UploadButton from "../../../components/UploadButton";
-
-export default {
-  name: "user-manage",
-  components: { ModifyUser, UploadButton },
-  data() {
-    return {
-      filter: {
-        loginName: "",
-        realName: "",
-        roleId: "",
-        enable: ""
-      },
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      total: 0,
-      visible: false,
-      ABLE_TYPE,
-      roles: [],
-      users: [],
-      curUser: {},
-      loading: false,
-      // import
-      uploadUrl: "/api/admin/sys/user/import",
-      downloadUrl: "/temps/userTemplate.xlsx",
-      dfilename: "用户导入模板.xlsx"
-    };
-  },
-  mounted() {
-    this.getRoleList();
-    this.getList();
-  },
-  methods: {
-    async getRoleList() {
-      if (
-        !this.checkPrivilege("button", "add") &&
-        !this.checkPrivilege("link", "edit")
-      )
-        return;
-
-      const data = await userRoleListPage();
-      this.roles = data || [];
-      this.roles = this.roles.filter(item => item.type !== "ADMIN");
-    },
-    async getList() {
-      if (!this.checkPrivilege("list", "list")) return;
-      const datas = {
-        ...this.filter,
-        pageNumber: this.current,
-        pageSize: this.size
-      };
-      if (datas.enable !== null && datas.enable !== "")
-        datas.enable = !!datas.enable;
-      const data = await userListPage(datas);
-      this.users = data.records;
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-    },
-    toEnable(row) {
-      // 自己不可以启用/禁用自己
-      const userId = this.$ls.get("user", { id: "" }).id;
-      if (row.id === userId) {
-        this.$message.error("不可以启用/禁用自己!");
-        return;
-      }
-
-      const action = row.enable ? "禁用" : "启用";
-      this.$confirm(`确定要${action}用户【${row.realName}】吗?`, "提示", {
-        type: "warning"
-      })
-        .then(async () => {
-          const enable = !row.enable;
-          await ableUser({
-            id: row.id,
-            enable
-          });
-          row.enable = enable;
-          this.$message.success("操作成功!");
-        })
-        .catch(() => {});
-    },
-    toEdit(row) {
-      this.curUser = row;
-      this.$refs.ModifyUser.open();
-    },
-    toAdd() {
-      this.curUser = {};
-      this.$refs.ModifyUser.open();
-    },
-    async toResetPwd(row) {
-      await resetPwd(row.id);
-      this.$message.success("密码重置成功!");
-
-      // 修改自己时,会强制重新登录
-      // const userId = this.$ls.get("user", { id: "" }).id;
-      // if (row.id !== userId) return;
-      // this.toLogout();
-    },
-    async syncUser() {
-      if (this.loading) return;
-      this.loading = true;
-      const res = await syncUserToEcs().catch(() => {});
-      this.loading = false;
-
-      if (!res) return;
-      this.$message.success("同步任务已经提交!");
-    },
-    // async toLogout() {
-    //   await logout();
-    //   this.$ls.clear();
-    //   this.$router.push({ name: "Login" });
-    //   this.$message.info("您的密码已经变更,请重新登录系统!");
-    // },
-    // import
-    validError(errorData) {
-      this.$message.error(errorData.message);
-    },
-    uploadSuccess() {
-      this.getList();
-    }
-  }
-};
-</script>
+<template>
+  <div class="user-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')">
+          <!-- TODO:新增机构查询 -->
+          <el-form-item label="关键词:" label-width="75px">
+            <el-input
+              style="width: 142px;"
+              v-model.trim="filter.loginName"
+              placeholder="用户名/姓名/手机号"
+              clearable
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="角色:" label-width="55px">
+            <el-select
+              v-model="filter.roleId"
+              style="width: 142px;"
+              placeholder="角色"
+              filterable
+              clearable
+            >
+              <el-option
+                v-for="item in roles"
+                :key="item.id"
+                :value="item.id"
+                :label="item.name"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="启用/禁用:" label-width="90px">
+            <el-select
+              v-model="filter.enable"
+              style="width: 120px;"
+              placeholder="启用/禁用"
+              clearable
+            >
+              <el-option
+                v-for="(val, key) in ABLE_TYPE"
+                :key="key"
+                :value="key * 1"
+                :label="val"
+              ></el-option>
+            </el-select>
+          </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', 'SyncUser')"
+          type="primary"
+          icon="el-icon-refresh"
+          :loading="loading"
+          @click="syncUser"
+          >同步用户</el-button
+        >
+        <el-button
+          type="success"
+          icon="el-icon-download"
+          v-if="checkPrivilege('button', 'export')"
+          ><a :href="downloadUrl" :download="dfilename">模板下载</a></el-button
+        >
+        <upload-button
+          v-if="checkPrivilege('button', 'export')"
+          btn-icon="el-icon-circle-plus-outline"
+          btn-content="导入用户"
+          btn-type="success"
+          :upload-url="uploadUrl"
+          :format="['xls', 'xlsx']"
+          accept=".xls,.xlsx"
+          @valid-error="validError"
+          @upload-success="uploadSuccess"
+        >
+        </upload-button>
+        <el-button
+          v-if="checkPrivilege('button', 'add')"
+          type="primary"
+          icon="el-icon-circle-plus-outline"
+          @click="toAdd"
+          >新增用户</el-button
+        >
+      </div>
+    </div>
+
+    <div class="part-box part-box-pad">
+      <el-table ref="TableList" :data="users">
+        <el-table-column
+          type="index"
+          label="序号"
+          width="70"
+          :index="indexMethod"
+        ></el-table-column>
+        <el-table-column prop="loginName" label="用户名"></el-table-column>
+        <el-table-column
+          prop="realName"
+          label="姓名"
+          width="120"
+        ></el-table-column>
+        <el-table-column prop="code" label="工号"></el-table-column>
+        <el-table-column
+          prop="mobileNumber"
+          label="手机号"
+          width="120"
+        ></el-table-column>
+        <el-table-column prop="orgName" label="所在机构"></el-table-column>
+        <el-table-column prop="roles" label="角色">
+          <template slot-scope="scope">
+            {{ scope.row.roles | rolesFilter }}
+          </template>
+        </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="200px">
+          <template slot-scope="scope">
+            <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', 'reset')"
+              class="btn-danger"
+              type="text"
+              @click="toResetPwd(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>
+
+    <!-- ModifyUser -->
+    <modify-user
+      ref="ModifyUser"
+      :instance="curUser"
+      :roles="roles"
+      @modified="getList"
+    ></modify-user>
+  </div>
+</template>
+
+<script>
+import ModifyUser from "../components/ModifyUser";
+import { ABLE_TYPE } from "@/constants/enumerate";
+import {
+  userListPage,
+  ableUser,
+  resetPwd,
+  userRoleListPage,
+  syncUserToEcs
+} from "../api";
+// import { logout } from "@/modules/login/api";
+import UploadButton from "../../../components/UploadButton";
+
+export default {
+  name: "user-manage",
+  components: { ModifyUser, UploadButton },
+  data() {
+    return {
+      filter: {
+        loginName: "",
+        realName: "",
+        roleId: "",
+        enable: ""
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      visible: false,
+      ABLE_TYPE,
+      roles: [],
+      users: [],
+      curUser: {},
+      loading: false,
+      // import
+      uploadUrl: "/api/admin/sys/user/import",
+      downloadUrl: "/temps/userTemplate.xlsx",
+      dfilename: "用户导入模板.xlsx"
+    };
+  },
+  mounted() {
+    this.getRoleList();
+    this.getList();
+  },
+  methods: {
+    async getRoleList() {
+      if (
+        !this.checkPrivilege("button", "add") &&
+        !this.checkPrivilege("link", "edit")
+      )
+        return;
+
+      const data = await userRoleListPage();
+      this.roles = data || [];
+      this.roles = this.roles.filter(item => item.type !== "ADMIN");
+    },
+    async getList() {
+      if (!this.checkPrivilege("list", "list")) return;
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      if (datas.enable !== null && datas.enable !== "")
+        datas.enable = !!datas.enable;
+      const data = await userListPage(datas);
+      this.users = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    toEnable(row) {
+      // 自己不可以启用/禁用自己
+      const userId = this.$ls.get("user", { id: "" }).id;
+      if (row.id === userId) {
+        this.$message.error("不可以启用/禁用自己!");
+        return;
+      }
+
+      const action = row.enable ? "禁用" : "启用";
+      this.$confirm(`确定要${action}用户【${row.realName}】吗?`, "提示", {
+        type: "warning"
+      })
+        .then(async () => {
+          const enable = !row.enable;
+          await ableUser({
+            id: row.id,
+            enable
+          });
+          row.enable = enable;
+          this.$message.success("操作成功!");
+        })
+        .catch(() => {});
+    },
+    toEdit(row) {
+      this.curUser = row;
+      this.$refs.ModifyUser.open();
+    },
+    toAdd() {
+      this.curUser = {};
+      this.$refs.ModifyUser.open();
+    },
+    async toResetPwd(row) {
+      await resetPwd(row.id);
+      this.$message.success("密码重置成功!");
+
+      // 修改自己时,会强制重新登录
+      // const userId = this.$ls.get("user", { id: "" }).id;
+      // if (row.id !== userId) return;
+      // this.toLogout();
+    },
+    async syncUser() {
+      if (this.loading) return;
+      this.loading = true;
+      const res = await syncUserToEcs().catch(() => {});
+      this.loading = false;
+
+      if (!res) return;
+      this.$message.success("同步任务已经提交!");
+    },
+    // async toLogout() {
+    //   await logout();
+    //   this.$ls.clear();
+    //   this.$router.push({ name: "Login" });
+    //   this.$message.info("您的密码已经变更,请重新登录系统!");
+    // },
+    // import
+    validError(errorData) {
+      this.$message.error(errorData.message);
+    },
+    uploadSuccess() {
+      this.getList();
+    }
+  }
+};
+</script>

+ 0 - 22
src/modules/exam/views/ExamTaskManage.vue

@@ -27,14 +27,6 @@
               ></el-option>
             </el-select>
           </el-form-item>
-          <el-form-item label="题卡规则:">
-            <card-rule-select
-              ref="CardRuleSelect"
-              v-model.trim="filter.cardRuleId"
-              placeholder="题卡规则"
-              clearable
-            ></card-rule-select>
-          </el-form-item>
           <el-form-item label="课程(代码):" label-width="110px">
             <course-select
               ref="CourseSelect"
@@ -50,13 +42,6 @@
               clearable
             ></el-input>
           </el-form-item>
-          <el-form-item label="创建人:">
-            <el-input
-              v-model="filter.createName"
-              placeholder="创建人"
-              clearable
-            ></el-input>
-          </el-form-item>
           <el-form-item label="试卷编号:">
             <paper-number-select
               ref="PaperNumberSelect"
@@ -142,8 +127,6 @@
             {{ scope.row.courseName }}({{ scope.row.courseCode }})
           </template>
         </el-table-column>
-        <el-table-column prop="cardRuleName" label="题卡规则">
-        </el-table-column>
         <el-table-column
           prop="userName"
           label="命题老师"
@@ -169,11 +152,6 @@
             {{ scope.row.enable | enableFilter }}
           </template>
         </el-table-column>
-        <el-table-column
-          prop="createName"
-          label="创建人"
-          width="100"
-        ></el-table-column>
         <el-table-column prop="createTime" label="创建时间">
           <span slot-scope="scope">{{
             scope.row.createTime | timestampFilter

+ 361 - 370
src/modules/exam/views/TaskApplyManage.vue

@@ -1,370 +1,361 @@
-<template>
-  <div class="task-apply-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="审核状态:">
-            <el-select
-              v-model="filter.auditStatus"
-              style="width: 142px;"
-              placeholder="审核状态"
-              clearable
-            >
-              <el-option
-                v-for="(val, key) in AUDITING_STATUS"
-                :key="key"
-                :value="key"
-                :label="val"
-              ></el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="题卡规则:">
-            <card-rule-select
-              ref="CardRuleSelect"
-              v-model.trim="filter.cardRuleId"
-              placeholder="题卡规则"
-              clearable
-            ></card-rule-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="命题老师:">
-            <el-input
-              v-model="filter.userName"
-              placeholder="命题老师"
-              clearable
-            ></el-input>
-          </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="命题时间:">
-            <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', 'addTask')"
-          icon="el-icon-circle-plus-outline"
-          type="primary"
-          @click="toAddApply"
-        >
-          新建命题申请
-        </el-button>
-        <el-button
-          v-if="checkPrivilege('button', 'ExamTaskApplyManage')"
-          icon="el-icon-circle-plus-outline"
-          type="primary"
-          @click="toAddExamAndPrintTask"
-        >
-          新建任务
-        </el-button>
-      </div>
-    </div>
-
-    <div class="part-box part-box-pad">
-      <el-table ref="TableList" :data="examTasks">
-        <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="cardRuleName" label="题卡规则"></el-table-column>
-        <el-table-column
-          prop="userName"
-          label="命题老师"
-          width="100"
-        ></el-table-column>
-        <el-table-column prop="startTime" label="命题开始时间">
-          <span slot-scope="scope">{{
-            scope.row.startTime | timestampFilter
-          }}</span>
-        </el-table-column>
-        <el-table-column prop="endTime" label="命题结束时间">
-          <span slot-scope="scope">{{
-            scope.row.endTime | timestampFilter
-          }}</span>
-        </el-table-column>
-        <el-table-column prop="auditStatus" label="审核状态" width="100">
-          <template slot-scope="scope">
-            {{ scope.row.auditStatus | auditStatusFilter }}
-          </template>
-        </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="toPreview(scope.row)"
-              >查看详情</el-button
-            >
-            <el-button
-              v-if="
-                scope.row.auditStatus === 'START' &&
-                  checkPrivilege('link', 'edit')
-              "
-              class="btn-primary"
-              type="text"
-              @click="toEdit(scope.row)"
-              >立即申请</el-button
-            >
-            <el-button
-              v-if="
-                scope.row.flowType === 'NEW' &&
-                  scope.row.approveCount === 2 &&
-                  checkPrivilege('link', 'end')
-              "
-              class="btn-danger"
-              type="text"
-              @click="toCancel(scope.row)"
-              >撤销申请</el-button
-            >
-            <el-button
-              v-if="
-                scope.row.approveFormStatus &&
-                  checkPrivilege('link', 'download')
-              "
-              class="btn-primary"
-              type="text"
-              @click="toDownloadForm(scope.row)"
-              >下载审批表</el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
-      <div class="part-page">
-        <el-pagination
-          v-if="examTasks.length"
-          background
-          layout="total,prev, pager, next"
-          :current-page="current"
-          :total="total"
-          :page-size="size"
-          @current-change="toPage"
-        >
-        </el-pagination>
-      </div>
-    </div>
-
-    <!-- ModifyTaskApply -->
-    <modify-task-apply
-      ref="ModifyTaskApply"
-      :edit-type="editType"
-      :instance="curExamTask"
-      @modified="taskModified"
-    ></modify-task-apply>
-    <!-- CreateTaskApply -->
-    <create-task-apply
-      v-if="checkPrivilege('button', 'addTask')"
-      ref="CreateTaskApply"
-      @modified="taskModified"
-    ></create-task-apply>
-    <!-- CreateExamAndPrintTask -->
-    <create-exam-and-print-task
-      v-if="checkPrivilege('button', 'ExamTaskApplyManage')"
-      ref="CreateExamAndPrintTask"
-      @modified="taskModified"
-    ></create-exam-and-print-task>
-    <!-- PaperApproveTable -->
-    <paper-approve-table
-      :instance="curExamTask"
-      ref="PaperApproveTable"
-    ></paper-approve-table>
-  </div>
-</template>
-
-<script>
-import ModifyTaskApply from "../components/ModifyTaskApply";
-import CreateExamAndPrintTask from "../components/createExamAndPrintTask/CreateExamAndPrintTask";
-import CreateTaskApply from "../components/CreateTaskApply";
-import PaperApproveTable from "../components/PaperApproveTable";
-import { AUDITING_STATUS } from "@/constants/enumerate";
-import pickerOptions from "@/constants/datePickerOptions";
-import { taskApplyListPage, cancelOrRestartTaskApply } from "../api";
-import { mapActions } from "vuex";
-
-export default {
-  name: "task-apply-manage",
-  components: {
-    ModifyTaskApply,
-    CreateExamAndPrintTask,
-    CreateTaskApply,
-    PaperApproveTable
-  },
-  data() {
-    return {
-      filter: {
-        semesterId: "",
-        examId: "",
-        auditStatus: "",
-        reviewStatus: "",
-        cardRuleId: "",
-        courseCode: "",
-        userName: "",
-        paperNumber: "",
-        startTime: "",
-        endTime: ""
-      },
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      total: 0,
-      editType: "APPLY",
-      AUDITING_STATUS,
-      examTasks: [],
-      curExamTask: {},
-      curUserId: this.$ls.get("user", { id: "" }).id,
-      userRoles: this.$ls.get("user", { roleList: [] }).roleList,
-      // date-picker
-      createTime: [],
-      pickerOptions
-    };
-  },
-  mounted() {
-    this.initData();
-  },
-  methods: {
-    ...mapActions("exam", ["updateWaitTaskCount"]),
-    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.examTasks.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 taskApplyListPage(datas);
-      this.examTasks = data.records;
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-    },
-    toCancel(row) {
-      this.$confirm("确定要撤销当前申请吗?", "提示", {
-        type: "warning"
-      })
-        .then(async () => {
-          const data = await cancelOrRestartTaskApply({
-            id: row.id
-          }).catch(() => {});
-          if (!data) return;
-          this.$message.success("操作成功!");
-          this.getList();
-        })
-        .catch(() => {});
-    },
-    toEdit(row) {
-      this.curExamTask = row;
-      this.editType = "APPLY";
-      this.$refs.ModifyTaskApply.open();
-    },
-    toPreview(row) {
-      this.curExamTask = row;
-      this.editType = "PREVIEW";
-      this.$refs.ModifyTaskApply.open();
-    },
-    taskModified() {
-      this.getList();
-      this.updateWaitTaskCount(this.userRoles);
-    },
-    toAddApply() {
-      this.$refs.CreateTaskApply.open();
-    },
-    toAddExamAndPrintTask() {
-      this.$refs.CreateExamAndPrintTask.open();
-    },
-    toDownloadForm(row) {
-      this.curExamTask = row;
-      this.$refs.PaperApproveTable.open();
-    }
-  },
-  beforeRouteLeave(to, from, next) {
-    if (to.name === "CardEdit") {
-      this.$ls.set("cachePageInfo", {
-        page: this.current,
-        filter: this.filter,
-        curRowId: this.curExamTask.id
-      });
-    } else {
-      this.$ls.remove("cachePageInfo");
-    }
-    next();
-  }
-};
-</script>
+<template>
+  <div class="task-apply-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="审核状态:">
+            <el-select
+              v-model="filter.auditStatus"
+              style="width: 142px;"
+              placeholder="审核状态"
+              clearable
+            >
+              <el-option
+                v-for="(val, key) in AUDITING_STATUS"
+                :key="key"
+                :value="key"
+                :label="val"
+              ></el-option>
+            </el-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="命题老师:">
+            <el-input
+              v-model="filter.userName"
+              placeholder="命题老师"
+              clearable
+            ></el-input>
+          </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="命题时间:">
+            <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', 'addTask')"
+          icon="el-icon-circle-plus-outline"
+          type="primary"
+          @click="toAddApply"
+        >
+          新建命题申请
+        </el-button>
+        <el-button
+          v-if="checkPrivilege('button', 'ExamTaskApplyManage')"
+          icon="el-icon-circle-plus-outline"
+          type="primary"
+          @click="toAddExamAndPrintTask"
+        >
+          新建任务
+        </el-button>
+      </div>
+    </div>
+
+    <div class="part-box part-box-pad">
+      <el-table ref="TableList" :data="examTasks">
+        <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="userName"
+          label="命题老师"
+          width="100"
+        ></el-table-column>
+        <el-table-column prop="startTime" label="命题开始时间">
+          <span slot-scope="scope">{{
+            scope.row.startTime | timestampFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column prop="endTime" label="命题结束时间">
+          <span slot-scope="scope">{{
+            scope.row.endTime | timestampFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column prop="auditStatus" label="审核状态" width="100">
+          <template slot-scope="scope">
+            {{ scope.row.auditStatus | auditStatusFilter }}
+          </template>
+        </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="toPreview(scope.row)"
+              >查看详情</el-button
+            >
+            <el-button
+              v-if="
+                scope.row.auditStatus === 'START' &&
+                  checkPrivilege('link', 'edit')
+              "
+              class="btn-primary"
+              type="text"
+              @click="toEdit(scope.row)"
+              >立即申请</el-button
+            >
+            <el-button
+              v-if="
+                scope.row.flowType === 'NEW' &&
+                  scope.row.approveCount === 2 &&
+                  checkPrivilege('link', 'end')
+              "
+              class="btn-danger"
+              type="text"
+              @click="toCancel(scope.row)"
+              >撤销申请</el-button
+            >
+            <el-button
+              v-if="
+                scope.row.approveFormStatus &&
+                  checkPrivilege('link', 'download')
+              "
+              class="btn-primary"
+              type="text"
+              @click="toDownloadForm(scope.row)"
+              >下载审批表</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="part-page">
+        <el-pagination
+          v-if="examTasks.length"
+          background
+          layout="total,prev, pager, next"
+          :current-page="current"
+          :total="total"
+          :page-size="size"
+          @current-change="toPage"
+        >
+        </el-pagination>
+      </div>
+    </div>
+
+    <!-- ModifyTaskApply -->
+    <modify-task-apply
+      ref="ModifyTaskApply"
+      :edit-type="editType"
+      :instance="curExamTask"
+      @modified="taskModified"
+    ></modify-task-apply>
+    <!-- CreateTaskApply -->
+    <create-task-apply
+      v-if="checkPrivilege('button', 'addTask')"
+      ref="CreateTaskApply"
+      @modified="taskModified"
+    ></create-task-apply>
+    <!-- CreateExamAndPrintTask -->
+    <create-exam-and-print-task
+      v-if="checkPrivilege('button', 'ExamTaskApplyManage')"
+      ref="CreateExamAndPrintTask"
+      @modified="taskModified"
+    ></create-exam-and-print-task>
+    <!-- PaperApproveTable -->
+    <paper-approve-table
+      :instance="curExamTask"
+      ref="PaperApproveTable"
+    ></paper-approve-table>
+  </div>
+</template>
+
+<script>
+import ModifyTaskApply from "../components/ModifyTaskApply";
+import CreateExamAndPrintTask from "../components/createExamAndPrintTask/CreateExamAndPrintTask";
+import CreateTaskApply from "../components/CreateTaskApply";
+import PaperApproveTable from "../components/PaperApproveTable";
+import { AUDITING_STATUS } from "@/constants/enumerate";
+import pickerOptions from "@/constants/datePickerOptions";
+import { taskApplyListPage, cancelOrRestartTaskApply } from "../api";
+import { mapActions } from "vuex";
+
+export default {
+  name: "task-apply-manage",
+  components: {
+    ModifyTaskApply,
+    CreateExamAndPrintTask,
+    CreateTaskApply,
+    PaperApproveTable
+  },
+  data() {
+    return {
+      filter: {
+        semesterId: "",
+        examId: "",
+        auditStatus: "",
+        reviewStatus: "",
+        cardRuleId: "",
+        courseCode: "",
+        userName: "",
+        paperNumber: "",
+        startTime: "",
+        endTime: ""
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      editType: "APPLY",
+      AUDITING_STATUS,
+      examTasks: [],
+      curExamTask: {},
+      curUserId: this.$ls.get("user", { id: "" }).id,
+      userRoles: this.$ls.get("user", { roleList: [] }).roleList,
+      // date-picker
+      createTime: [],
+      pickerOptions
+    };
+  },
+  mounted() {
+    this.initData();
+  },
+  methods: {
+    ...mapActions("exam", ["updateWaitTaskCount"]),
+    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.examTasks.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 taskApplyListPage(datas);
+      this.examTasks = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    toCancel(row) {
+      this.$confirm("确定要撤销当前申请吗?", "提示", {
+        type: "warning"
+      })
+        .then(async () => {
+          const data = await cancelOrRestartTaskApply({
+            id: row.id
+          }).catch(() => {});
+          if (!data) return;
+          this.$message.success("操作成功!");
+          this.getList();
+        })
+        .catch(() => {});
+    },
+    toEdit(row) {
+      this.curExamTask = row;
+      this.editType = "APPLY";
+      this.$refs.ModifyTaskApply.open();
+    },
+    toPreview(row) {
+      this.curExamTask = row;
+      this.editType = "PREVIEW";
+      this.$refs.ModifyTaskApply.open();
+    },
+    taskModified() {
+      this.getList();
+      this.updateWaitTaskCount(this.userRoles);
+    },
+    toAddApply() {
+      this.$refs.CreateTaskApply.open();
+    },
+    toAddExamAndPrintTask() {
+      this.$refs.CreateExamAndPrintTask.open();
+    },
+    toDownloadForm(row) {
+      this.curExamTask = row;
+      this.$refs.PaperApproveTable.open();
+    }
+  },
+  beforeRouteLeave(to, from, next) {
+    if (to.name === "CardEdit") {
+      this.$ls.set("cachePageInfo", {
+        page: this.current,
+        filter: this.filter,
+        curRowId: this.curExamTask.id
+      });
+    } else {
+      this.$ls.remove("cachePageInfo");
+    }
+    next();
+  }
+};
+</script>

+ 448 - 469
src/modules/exam/views/TaskReviewManage.vue

@@ -1,469 +1,448 @@
-<template>
-  <div class="task-review-manage">
-    <div class="mb-4 tab-btns">
-      <el-button
-        v-for="(val, key) in AUDITING_TYPE"
-        :key="key"
-        size="medium"
-        :type="auditStatus == key ? 'primary' : 'default'"
-        @click="selectMenu(key)"
-        >{{ val }}</el-button
-      >
-    </div>
-    <div class="part-box part-box-filter part-box-flex">
-      <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
-        <template
-          v-if="
-            (AUDITED && checkPrivilege('condition', 'reviewCondition')) ||
-              (!AUDITED && checkPrivilege('condition', 'notReviewCondition'))
-          "
-        >
-          <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="题卡规则:">
-            <card-rule-select
-              ref="CardRuleSelect"
-              v-model.trim="filter.cardRuleId"
-              placeholder="题卡规则"
-              clearable
-            ></card-rule-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="命题老师:">
-            <question-teacher-select
-              ref="QuestionTeacherSelect"
-              v-model="filter.userId"
-              :course-code="filter.courseCode"
-              placeholder="命题老师"
-            ></question-teacher-select>
-          </el-form-item>
-          <el-form-item label="创建人:">
-            <el-input
-              v-model="filter.createName"
-              placeholder="创建人"
-              clearable
-            ></el-input>
-          </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>
-          <el-form-item label="申请时间:">
-            <el-date-picker
-              v-model="applyTime"
-              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="
-              (AUDITED && checkPrivilege('button', 'reviewSelect')) ||
-                (!AUDITED && checkPrivilege('button', 'notReviewSelect'))
-            "
-            type="primary"
-            @click="toPage(1)"
-            >查询</el-button
-          >
-        </el-form-item>
-      </el-form>
-      <div class="part-box-action" v-if="!AUDITED">
-        <el-button
-          v-if="checkPrivilege('button', 'notReviewExport')"
-          icon="el-icon-download"
-          type="success"
-          :disabled="loading"
-          @click="toExport"
-        >
-          导出审核样本
-        </el-button>
-        <!-- <el-button
-          v-if="checkPrivilege('button', 'notReviewBatchNotPass')"
-          icon="el-icon-circle-close"
-          type="danger"
-          @click="toBatchAudit(0)"
-        >
-          批量不通过
-        </el-button> -->
-        <el-button
-          v-if="checkPrivilege('button', 'notReviewBatchPass')"
-          icon="el-icon-circle-check"
-          type="primary"
-          @click="toBatchAudit(1)"
-        >
-          批量通过
-        </el-button>
-      </div>
-    </div>
-
-    <div class="part-box part-box-pad">
-      <el-table
-        ref="TableList"
-        :data="examTasks"
-        @selection-change="handleSelectionChange"
-      >
-        <el-table-column
-          v-if="!AUDITED"
-          type="selection"
-          width="55"
-          align="center"
-          :selectable="checkAbleSelected"
-        ></el-table-column>
-        <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="cardRuleName" label="题卡规则"></el-table-column>
-        <el-table-column
-          prop="userName"
-          label="命题老师"
-          width="100"
-        ></el-table-column>
-        <el-table-column prop="startTime" label="命题开始时间">
-          <span slot-scope="scope">{{
-            scope.row.startTime | timestampFilter
-          }}</span>
-        </el-table-column>
-        <el-table-column prop="endTime" label="命题结束时间">
-          <span slot-scope="scope">{{
-            scope.row.endTime | timestampFilter
-          }}</span>
-        </el-table-column>
-        <el-table-column prop="createTime" label="申请时间">
-          <template slot-scope="scope">
-            {{ scope.row.createTime | timestampFilter }}
-          </template>
-        </el-table-column>
-        <el-table-column
-          prop="createName"
-          label="创建人"
-          width="100"
-        ></el-table-column>
-        <el-table-column class-name="action-column" label="操作" width="80px">
-          <template slot-scope="scope">
-            <el-button
-              v-if="AUDITED && checkPrivilege('link', 'reviewPreview')"
-              class="btn-primary"
-              type="text"
-              @click="toPreview(scope.row)"
-              >查看详情</el-button
-            >
-            <el-button
-              v-if="
-                !AUDITED &&
-                  checkPrivilege('link', 'notReviewEdit') &&
-                  scope.row.myself
-              "
-              class="btn-primary"
-              type="text"
-              @click="toEdit(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>
-
-    <!-- ModifyTaskApply -->
-    <modify-task-apply
-      ref="ModifyTaskApply"
-      :edit-type="editType"
-      :instance="curExamTask"
-      @modified="taskModified"
-    ></modify-task-apply>
-    <!-- audit-dialog-->
-    <el-dialog
-      :visible.sync="auditDialogShow"
-      title="审核不通过"
-      width="500px"
-      :close-on-click-modal="false"
-      :close-on-press-escape="false"
-      append-to-body
-    >
-      <el-form ref="AuditForm" :rules="auditRules" :model="auditModal">
-        <el-form-item prop="reason">
-          <el-input
-            class="mb-2"
-            v-model="auditModal.reason"
-            type="textarea"
-            resize="none"
-            :rows="5"
-            :maxlength="1000"
-            clearable
-            show-word-limit
-            placeholder="建议不超过1000个字"
-          ></el-input>
-        </el-form-item>
-      </el-form>
-      <div slot="footer">
-        <el-button type="primary" @click="auditNotPass">确认</el-button>
-        <el-button type="danger" @click="auditDialogShow = false" plain
-          >取消</el-button
-        >
-      </div>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import ModifyTaskApply from "../components/ModifyTaskApply";
-import pickerOptions from "@/constants/datePickerOptions";
-import {
-  taskReviewAuditedListPage,
-  taskReviewUnauditedListPage,
-  batchUpdateTaskReview,
-  reviewSampleDataExport
-} from "../api";
-import { mapActions } from "vuex";
-
-export default {
-  name: "task-review-manage",
-  components: {
-    ModifyTaskApply
-  },
-  data() {
-    return {
-      auditStatus: "NOT_AUDITED",
-      filter: {
-        semesterId: "",
-        examId: "",
-        userId: "",
-        cardRuleId: "",
-        courseCode: "",
-        paperNumber: "",
-        startTime: null,
-        endTime: null,
-        startCreateTime: null,
-        endCreateTime: null,
-        createName: ""
-      },
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      total: 0,
-      editType: "AUDIT",
-      AUDITING_TYPE: {
-        NOT_AUDITED: "未审核",
-        AUDITED: "已审核"
-      },
-      caches: {},
-      examTasks: [],
-      curExamTask: {},
-      multipleSelection: [],
-      loading: false,
-      curUserId: this.$ls.get("user", { id: "" }).id,
-      // audit-dialog
-      auditDialogShow: false,
-      auditModal: { reason: "" },
-      auditRules: {
-        reason: [
-          { required: true, message: "请输入审核意见", trigger: "change" }
-        ]
-      },
-      // date-picker
-      createTime: [],
-      applyTime: [],
-      pickerOptions
-    };
-  },
-  computed: {
-    AUDITED() {
-      return this.auditStatus === "AUDITED";
-    }
-  },
-  mounted() {
-    this.toPage(1);
-  },
-  methods: {
-    ...mapActions("exam", ["updateWaitTaskCount"]),
-    async getList() {
-      const valid =
-        (this.AUDITED && this.checkPrivilege("list", "reviewList")) ||
-        (!this.AUDITED && this.checkPrivilege("list", "notReviewList"));
-      if (!valid) return;
-
-      const datas = {
-        ...this.filter,
-        pageNumber: this.current,
-        pageSize: this.size
-      };
-      if (this.createTime) {
-        datas.startTime = this.createTime[0];
-        datas.endTime = this.createTime[1];
-      }
-      if (this.applyTime) {
-        datas.startCreateTime = this.applyTime[0];
-        datas.endCreateTime = this.applyTime[1];
-      }
-      const func = this.AUDITED
-        ? taskReviewAuditedListPage
-        : taskReviewUnauditedListPage;
-      const data = await func(datas);
-      this.examTasks = data.records;
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-      this.multipleSelection = [];
-    },
-    handleSelectionChange(val) {
-      this.multipleSelection = val.map(item => item.id);
-      console.log(this.multipleSelection);
-    },
-    checkAbleSelected(row) {
-      return row.myself;
-    },
-    selectMenu(val) {
-      if (this.auditStatus === val) return;
-
-      this.caches[this.auditStatus] = {
-        current: this.current,
-        examTasks: this.examTasks,
-        total: this.total
-      };
-      this.auditStatus = val;
-      if (this.caches[val] && this.caches[val].examTasks) {
-        this.current = this.caches[val].current;
-        this.total = this.caches[val].total;
-        this.examTasks = this.caches[val].examTasks;
-      } else {
-        this.toPage(1);
-      }
-    },
-    toBatchAudit(isPass) {
-      if (!this.multipleSelection.length) {
-        this.$message.error("请选择要审核的记录!");
-        return;
-      }
-      const actionName = isPass ? "通过" : "不通过";
-      this.$confirm(`确定${actionName}这些申请吗?`, "提示", {
-        type: "warning"
-      })
-        .then(() => {
-          this.auditModal.reason = "";
-          if (isPass) {
-            this.auditApply("PASS", this.multipleSelection);
-          } else {
-            this.auditDialogShow = true;
-          }
-        })
-        .catch(() => {});
-    },
-    async auditNotPass() {
-      const valid = await this.$refs.AuditForm.validate().catch(() => {});
-      if (!valid) return;
-
-      await this.auditApply("NOT_PASS", this.multipleSelection);
-      this.auditDialogShow = false;
-    },
-    async auditApply(type, ids) {
-      const data = await batchUpdateTaskReview({
-        reviewStatus: type,
-        examTaskIds: ids,
-        reason: this.auditModal.reason
-      }).catch(() => {});
-      if (!data) return;
-      this.$message.success("审核成功!");
-      this.taskModified();
-    },
-    async toExport() {
-      if (!this.multipleSelection.length) {
-        this.$message.error("请选择要导出的记录!");
-        return;
-      }
-
-      if (this.loading) return;
-
-      this.loading = true;
-      const res = await reviewSampleDataExport({
-        ids: this.multipleSelection
-      }).catch(() => {});
-      this.loading = false;
-
-      if (res) {
-        this.$message.success(
-          "导出任务已提交,请在系统设置-任务管理中下载文件!"
-        );
-      } else {
-        this.$message.error("导出任务提交失败,请重新尝试!");
-      }
-    },
-    toEdit(row) {
-      this.curExamTask = { ...row, source: "REVIEW" };
-      this.editType = "AUDIT";
-      this.$refs.ModifyTaskApply.open();
-    },
-    toPreview(row) {
-      this.curExamTask = { ...row, source: "REVIEW" };
-      this.editType = "PREVIEW";
-      this.$refs.ModifyTaskApply.open();
-    },
-    taskModified() {
-      this.getList();
-      this.updateWaitTaskCount();
-    }
-  }
-};
-</script>
+<template>
+  <div class="task-review-manage">
+    <div class="mb-4 tab-btns">
+      <el-button
+        v-for="(val, key) in AUDITING_TYPE"
+        :key="key"
+        size="medium"
+        :type="auditStatus == key ? 'primary' : 'default'"
+        @click="selectMenu(key)"
+        >{{ val }}</el-button
+      >
+    </div>
+    <div class="part-box part-box-filter part-box-flex">
+      <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
+        <template
+          v-if="
+            (AUDITED && checkPrivilege('condition', 'reviewCondition')) ||
+              (!AUDITED && checkPrivilege('condition', 'notReviewCondition'))
+          "
+        >
+          <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="命题老师:">
+            <question-teacher-select
+              ref="QuestionTeacherSelect"
+              v-model="filter.userId"
+              :course-code="filter.courseCode"
+              placeholder="命题老师"
+            ></question-teacher-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>
+          <el-form-item label="申请时间:">
+            <el-date-picker
+              v-model="applyTime"
+              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="
+              (AUDITED && checkPrivilege('button', 'reviewSelect')) ||
+                (!AUDITED && checkPrivilege('button', 'notReviewSelect'))
+            "
+            type="primary"
+            @click="toPage(1)"
+            >查询</el-button
+          >
+        </el-form-item>
+      </el-form>
+      <div class="part-box-action" v-if="!AUDITED">
+        <el-button
+          v-if="checkPrivilege('button', 'notReviewExport')"
+          icon="el-icon-download"
+          type="success"
+          :disabled="loading"
+          @click="toExport"
+        >
+          导出审核样本
+        </el-button>
+        <!-- <el-button
+          v-if="checkPrivilege('button', 'notReviewBatchNotPass')"
+          icon="el-icon-circle-close"
+          type="danger"
+          @click="toBatchAudit(0)"
+        >
+          批量不通过
+        </el-button> -->
+        <el-button
+          v-if="checkPrivilege('button', 'notReviewBatchPass')"
+          icon="el-icon-circle-check"
+          type="primary"
+          @click="toBatchAudit(1)"
+        >
+          批量通过
+        </el-button>
+      </div>
+    </div>
+
+    <div class="part-box part-box-pad">
+      <el-table
+        ref="TableList"
+        :data="examTasks"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column
+          v-if="!AUDITED"
+          type="selection"
+          width="55"
+          align="center"
+          :selectable="checkAbleSelected"
+        ></el-table-column>
+        <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="userName"
+          label="命题老师"
+          width="100"
+        ></el-table-column>
+        <el-table-column prop="startTime" label="命题开始时间">
+          <span slot-scope="scope">{{
+            scope.row.startTime | timestampFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column prop="endTime" label="命题结束时间">
+          <span slot-scope="scope">{{
+            scope.row.endTime | timestampFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column prop="createTime" label="申请时间">
+          <template slot-scope="scope">
+            {{ scope.row.createTime | timestampFilter }}
+          </template>
+        </el-table-column>
+        <el-table-column class-name="action-column" label="操作" width="80px">
+          <template slot-scope="scope">
+            <el-button
+              v-if="AUDITED && checkPrivilege('link', 'reviewPreview')"
+              class="btn-primary"
+              type="text"
+              @click="toPreview(scope.row)"
+              >查看详情</el-button
+            >
+            <el-button
+              v-if="
+                !AUDITED &&
+                  checkPrivilege('link', 'notReviewEdit') &&
+                  scope.row.myself
+              "
+              class="btn-primary"
+              type="text"
+              @click="toEdit(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>
+
+    <!-- ModifyTaskApply -->
+    <modify-task-apply
+      ref="ModifyTaskApply"
+      :edit-type="editType"
+      :instance="curExamTask"
+      @modified="taskModified"
+    ></modify-task-apply>
+    <!-- audit-dialog-->
+    <el-dialog
+      :visible.sync="auditDialogShow"
+      title="审核不通过"
+      width="500px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      append-to-body
+    >
+      <el-form ref="AuditForm" :rules="auditRules" :model="auditModal">
+        <el-form-item prop="reason">
+          <el-input
+            class="mb-2"
+            v-model="auditModal.reason"
+            type="textarea"
+            resize="none"
+            :rows="5"
+            :maxlength="1000"
+            clearable
+            show-word-limit
+            placeholder="建议不超过1000个字"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer">
+        <el-button type="primary" @click="auditNotPass">确认</el-button>
+        <el-button type="danger" @click="auditDialogShow = false" plain
+          >取消</el-button
+        >
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import ModifyTaskApply from "../components/ModifyTaskApply";
+import pickerOptions from "@/constants/datePickerOptions";
+import {
+  taskReviewAuditedListPage,
+  taskReviewUnauditedListPage,
+  batchUpdateTaskReview,
+  reviewSampleDataExport
+} from "../api";
+import { mapActions } from "vuex";
+
+export default {
+  name: "task-review-manage",
+  components: {
+    ModifyTaskApply
+  },
+  data() {
+    return {
+      auditStatus: "NOT_AUDITED",
+      filter: {
+        semesterId: "",
+        examId: "",
+        userId: "",
+        cardRuleId: "",
+        courseCode: "",
+        paperNumber: "",
+        startTime: null,
+        endTime: null,
+        startCreateTime: null,
+        endCreateTime: null,
+        createName: ""
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      editType: "AUDIT",
+      AUDITING_TYPE: {
+        NOT_AUDITED: "未审核",
+        AUDITED: "已审核"
+      },
+      caches: {},
+      examTasks: [],
+      curExamTask: {},
+      multipleSelection: [],
+      loading: false,
+      curUserId: this.$ls.get("user", { id: "" }).id,
+      // audit-dialog
+      auditDialogShow: false,
+      auditModal: { reason: "" },
+      auditRules: {
+        reason: [
+          { required: true, message: "请输入审核意见", trigger: "change" }
+        ]
+      },
+      // date-picker
+      createTime: [],
+      applyTime: [],
+      pickerOptions
+    };
+  },
+  computed: {
+    AUDITED() {
+      return this.auditStatus === "AUDITED";
+    }
+  },
+  mounted() {
+    this.toPage(1);
+  },
+  methods: {
+    ...mapActions("exam", ["updateWaitTaskCount"]),
+    async getList() {
+      const valid =
+        (this.AUDITED && this.checkPrivilege("list", "reviewList")) ||
+        (!this.AUDITED && this.checkPrivilege("list", "notReviewList"));
+      if (!valid) return;
+
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      if (this.createTime) {
+        datas.startTime = this.createTime[0];
+        datas.endTime = this.createTime[1];
+      }
+      if (this.applyTime) {
+        datas.startCreateTime = this.applyTime[0];
+        datas.endCreateTime = this.applyTime[1];
+      }
+      const func = this.AUDITED
+        ? taskReviewAuditedListPage
+        : taskReviewUnauditedListPage;
+      const data = await func(datas);
+      this.examTasks = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+      this.multipleSelection = [];
+    },
+    handleSelectionChange(val) {
+      this.multipleSelection = val.map(item => item.id);
+      console.log(this.multipleSelection);
+    },
+    checkAbleSelected(row) {
+      return row.myself;
+    },
+    selectMenu(val) {
+      if (this.auditStatus === val) return;
+
+      this.caches[this.auditStatus] = {
+        current: this.current,
+        examTasks: this.examTasks,
+        total: this.total
+      };
+      this.auditStatus = val;
+      if (this.caches[val] && this.caches[val].examTasks) {
+        this.current = this.caches[val].current;
+        this.total = this.caches[val].total;
+        this.examTasks = this.caches[val].examTasks;
+      } else {
+        this.toPage(1);
+      }
+    },
+    toBatchAudit(isPass) {
+      if (!this.multipleSelection.length) {
+        this.$message.error("请选择要审核的记录!");
+        return;
+      }
+      const actionName = isPass ? "通过" : "不通过";
+      this.$confirm(`确定${actionName}这些申请吗?`, "提示", {
+        type: "warning"
+      })
+        .then(() => {
+          this.auditModal.reason = "";
+          if (isPass) {
+            this.auditApply("PASS", this.multipleSelection);
+          } else {
+            this.auditDialogShow = true;
+          }
+        })
+        .catch(() => {});
+    },
+    async auditNotPass() {
+      const valid = await this.$refs.AuditForm.validate().catch(() => {});
+      if (!valid) return;
+
+      await this.auditApply("NOT_PASS", this.multipleSelection);
+      this.auditDialogShow = false;
+    },
+    async auditApply(type, ids) {
+      const data = await batchUpdateTaskReview({
+        reviewStatus: type,
+        examTaskIds: ids,
+        reason: this.auditModal.reason
+      }).catch(() => {});
+      if (!data) return;
+      this.$message.success("审核成功!");
+      this.taskModified();
+    },
+    async toExport() {
+      if (!this.multipleSelection.length) {
+        this.$message.error("请选择要导出的记录!");
+        return;
+      }
+
+      if (this.loading) return;
+
+      this.loading = true;
+      const res = await reviewSampleDataExport({
+        ids: this.multipleSelection
+      }).catch(() => {});
+      this.loading = false;
+
+      if (res) {
+        this.$message.success(
+          "导出任务已提交,请在系统设置-任务管理中下载文件!"
+        );
+      } else {
+        this.$message.error("导出任务提交失败,请重新尝试!");
+      }
+    },
+    toEdit(row) {
+      this.curExamTask = { ...row, source: "REVIEW" };
+      this.editType = "AUDIT";
+      this.$refs.ModifyTaskApply.open();
+    },
+    toPreview(row) {
+      this.curExamTask = { ...row, source: "REVIEW" };
+      this.editType = "PREVIEW";
+      this.$refs.ModifyTaskApply.open();
+    },
+    taskModified() {
+      this.getList();
+      this.updateWaitTaskCount();
+    }
+  }
+};
+</script>

+ 353 - 336
src/modules/print/views/BusinessDataExport.vue

@@ -1,336 +1,353 @@
-<template>
-  <div class="business-data-export">
-    <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="印刷计划:">
-            <print-plan-select
-              v-model.trim="filter.printPlanIdList"
-              placeholder="印刷计划"
-              clearable
-              multiple
-              @change="printPlanChange"
-            ></print-plan-select>
-          </el-form-item>
-          <el-form-item label="课程(代码):" label-width="110px">
-            <course-select
-              v-model.trim="filter.courseCode"
-              :print-plan-id="filter.printPlanIdList"
-              placeholder="课程(代码)"
-              clearable
-            ></course-select>
-          </el-form-item>
-          <el-form-item label="试卷编号:">
-            <paper-number-select
-              ref="PaperNumberSelect"
-              v-model="filter.paperNumber"
-              :print-plan-id="filter.printPlanIdList"
-              placeholder="试卷编号"
-              clearable
-            ></paper-number-select>
-          </el-form-item>
-          <el-form-item label="考点:" label-width="55px">
-            <place-select
-              v-model.trim="filter.examPlace"
-              :print-plan-id="filter.printPlanIdList"
-              placeholder="考点"
-              clearable
-            ></place-select>
-          </el-form-item>
-          <el-form-item label="考场:" label-width="55px">
-            <room-select
-              v-model.trim="filter.examRoom"
-              :print-plan-id="filter.printPlanIdList"
-              placeholder="考场"
-              clearable
-            ></room-select>
-          </el-form-item>
-          <el-form-item label="卷袋号:" label-width="70px">
-            <el-input
-              v-model="filter.packageCode"
-              placeholder="卷袋号"
-              clearable
-            ></el-input>
-          </el-form-item>
-          <el-form-item label="考试日期:">
-            <el-date-picker
-              v-model="createTime"
-              type="daterange"
-              :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="search"
-            >查询</el-button
-          >
-        </el-form-item>
-      </el-form>
-      <div class="part-box-action">
-        <el-button
-          v-if="checkPrivilege('button', 'TempleteDownload')"
-          icon="el-icon-download"
-          type="success"
-          :loading="loading"
-          @click="toDownloadTemplate"
-        >
-          考务数据模板下载
-        </el-button>
-        <el-button
-          v-if="checkPrivilege('button', 'import')"
-          icon="el-icon-circle-plus-outline"
-          type="success"
-          @click="toUpload"
-        >
-          导入
-        </el-button>
-        <el-button
-          v-if="checkPrivilege('button', 'export')"
-          icon="el-icon-download"
-          type="primary"
-          :loading="loading"
-          @click="toExport"
-        >
-          导出查询结果
-        </el-button>
-      </div>
-    </div>
-
-    <div class="part-box part-box-pad">
-      <el-table class="mb-2" ref="TableList" :data="dataList">
-        <el-table-column
-          type="index"
-          label="序号"
-          width="70"
-          :index="indexMethod"
-        ></el-table-column>
-        <el-table-column
-          prop="printPlanName"
-          label="印刷计划"
-        ></el-table-column>
-        <el-table-column prop="examDate" label="考试日期"> </el-table-column>
-        <el-table-column prop="examTime" label="考试时间"> </el-table-column>
-        <el-table-column prop="examPlace" label="考点"> </el-table-column>
-        <el-table-column prop="examRoom" label="考场"> </el-table-column>
-        <el-table-column prop="packageCode" label="卷袋号"> </el-table-column>
-        <el-table-column prop="courseNameCode" label="课程(代码)">
-        </el-table-column>
-        <el-table-column prop="paperNumber" label="试卷编号"></el-table-column>
-        <el-table-column prop="totalSubjects" label="科次" width="80">
-        </el-table-column>
-        <el-table-column class-name="action-column" label="操作" width="100">
-          <template slot-scope="scope">
-            <el-button
-              v-if="checkPrivilege('link', 'preview')"
-              class="btn-primary"
-              type="text"
-              @click="toPreview(scope.row)"
-              >查看详情</el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
-      <div class="box-justify">
-        <div>
-          <span class="mr-2"
-            >科次总计:<i class="color-primary">{{
-              totalData.totalSubjects
-            }}</i>
-            科次</span
-          >
-          <span
-            >卷袋数量总计:<i class="color-primary">{{
-              totalData.packageCount
-            }}</i>
-            个</span
-          >
-        </div>
-        <el-pagination
-          background
-          layout="total,prev, pager, next"
-          :current-page="current"
-          :total="total"
-          :page-size="size"
-          @current-change="toPage"
-        >
-        </el-pagination>
-      </div>
-    </div>
-
-    <!-- PreviewBusinessDetail -->
-    <preview-business-detail
-      ref="PreviewBusinessDetail"
-      :instance="curRow"
-    ></preview-business-detail>
-    <!-- UploadBusinessDataDialog -->
-    <upload-business-data-dialog
-      ref="UploadBusinessDataDialog"
-      @modified="getList"
-    ></upload-business-data-dialog>
-  </div>
-</template>
-
-<script>
-import {
-  businessDataListPage,
-  businessTotalData,
-  businessTemplateDownload,
-  businessDataExport
-} from "../api";
-import PreviewBusinessDetail from "../components/PreviewBusinessDetail";
-import UploadBusinessDataDialog from "../components/UploadBusinessDataDialog";
-import { parseTimeRangeDateAndTime } from "@/plugins/utils";
-import { downloadByApi } from "@/plugins/download";
-import pickerOptions from "@/constants/datePickerOptions";
-
-export default {
-  name: "business-data-export",
-  components: { PreviewBusinessDetail, UploadBusinessDataDialog },
-  data() {
-    return {
-      filter: {
-        printPlanIdList: "",
-        courseCode: "",
-        paperNumber: "",
-        examPlace: "",
-        examRoom: "",
-        packageCode: "",
-        startDate: "",
-        endDate: ""
-      },
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      total: 0,
-      dataList: [],
-      curRow: {},
-      totalData: {},
-      curPrintPlan: {},
-      loading: false,
-      // date-picker
-      createTime: [],
-      pickerOptions,
-      // import
-      // TODO:
-      uploadUrl: "/api/admin/exam/print/data_import",
-      uploadData: {
-        type: "FILE",
-        printPlanId: ""
-      }
-    };
-  },
-  computed: {
-    canImport() {
-      return (
-        this.curPrintPlan && ["NEW", "READY"].includes(this.curPrintPlan.status)
-      );
-    }
-  },
-  mounted() {
-    this.search();
-  },
-  methods: {
-    async getList() {
-      if (!this.checkPrivilege("list", "list")) return;
-
-      const datas = {
-        ...this.filter,
-        pageNumber: this.current,
-        pageSize: this.size
-      };
-      if (this.createTime) {
-        datas.startDate = this.createTime[0];
-        datas.endDate = this.createTime[1];
-      }
-      const data = await businessDataListPage(datas);
-      this.dataList = data.records.map(item => {
-        const { date, time } = parseTimeRangeDateAndTime(
-          item.examStartTime,
-          item.examEndTime
-        );
-        item.examDate = date || "--";
-        item.examTime = time || "--";
-        return item;
-      });
-      this.total = data.total;
-    },
-    async getTotalData() {
-      const datas = {
-        ...this.filter
-      };
-      if (this.createTime) {
-        datas.startDate = this.createTime[0];
-        datas.endDate = this.createTime[1];
-      }
-      this.totalData = await businessTotalData(datas);
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-    },
-    search() {
-      this.toPage(1);
-      this.getTotalData();
-    },
-    printPlanChange() {
-      this.filter.paperNumber = "";
-      this.filter.courseCode = "";
-      this.filter.examRoom = "";
-      this.filter.examPlace = "";
-    },
-    toUpload() {
-      this.$refs.UploadBusinessDataDialog.open();
-    },
-    async toExport() {
-      // 异步导出
-      if (this.loading) return;
-
-      this.loading = true;
-      const datas = {
-        ...this.filter
-      };
-      if (this.createTime) {
-        datas.startDate = this.createTime[0];
-        datas.endDate = this.createTime[1];
-      }
-      const res = await businessDataExport(datas).catch(() => {});
-      this.loading = false;
-
-      if (res) {
-        this.$message.success(
-          "导出任务已提交,请在系统设置-任务管理中下载文件!"
-        );
-      } else {
-        this.$message.error("导出任务提交失败,请重新尝试!");
-      }
-    },
-    async toDownloadTemplate() {
-      if (this.loading) return;
-
-      this.loading = true;
-      const res = await downloadByApi(() => {
-        return businessTemplateDownload();
-      }, `考务数据模板.xlsx`).catch(e => {
-        this.$message.error(e || "下载失败,请重新尝试!");
-      });
-      this.downloading = false;
-
-      if (!res) return;
-      this.$message.success("下载成功!");
-    },
-    toPreview(row) {
-      this.curRow = { ...row };
-      this.$refs.PreviewBusinessDetail.open();
-    }
-  }
-};
-</script>
+<template>
+  <div class="business-data-export">
+    <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.trim="filter.semesterId"
+              placeholder="学期"
+              clearable
+            ></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="印刷计划:">
+            <print-plan-select
+              v-model.trim="filter.printPlanIdList"
+              placeholder="印刷计划"
+              clearable
+              multiple
+              @change="printPlanChange"
+            ></print-plan-select>
+          </el-form-item>
+          <el-form-item label="课程(代码):" label-width="110px">
+            <course-select
+              v-model.trim="filter.courseCode"
+              :print-plan-id="filter.printPlanIdList"
+              placeholder="课程(代码)"
+              clearable
+            ></course-select>
+          </el-form-item>
+          <el-form-item label="试卷编号:">
+            <paper-number-select
+              ref="PaperNumberSelect"
+              v-model="filter.paperNumber"
+              :print-plan-id="filter.printPlanIdList"
+              placeholder="试卷编号"
+              clearable
+            ></paper-number-select>
+          </el-form-item>
+          <el-form-item label="考点:" label-width="55px">
+            <place-select
+              v-model.trim="filter.examPlace"
+              :print-plan-id="filter.printPlanIdList"
+              placeholder="考点"
+              clearable
+            ></place-select>
+          </el-form-item>
+          <el-form-item label="考场:" label-width="55px">
+            <room-select
+              v-model.trim="filter.examRoom"
+              :print-plan-id="filter.printPlanIdList"
+              placeholder="考场"
+              clearable
+            ></room-select>
+          </el-form-item>
+          <el-form-item label="卷袋号:" label-width="70px">
+            <el-input
+              v-model="filter.packageCode"
+              placeholder="卷袋号"
+              clearable
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="考试日期:">
+            <el-date-picker
+              v-model="createTime"
+              type="daterange"
+              :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="search"
+            >查询</el-button
+          >
+        </el-form-item>
+      </el-form>
+      <div class="part-box-action">
+        <el-button
+          v-if="checkPrivilege('button', 'TempleteDownload')"
+          icon="el-icon-download"
+          type="success"
+          :loading="loading"
+          @click="toDownloadTemplate"
+        >
+          考务数据模板下载
+        </el-button>
+        <el-button
+          v-if="checkPrivilege('button', 'import')"
+          icon="el-icon-circle-plus-outline"
+          type="success"
+          @click="toUpload"
+        >
+          导入
+        </el-button>
+        <el-button
+          v-if="checkPrivilege('button', 'export')"
+          icon="el-icon-download"
+          type="primary"
+          :loading="loading"
+          @click="toExport"
+        >
+          导出查询结果
+        </el-button>
+      </div>
+    </div>
+
+    <div class="part-box part-box-pad">
+      <el-table class="mb-2" 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="examName" label="考试"></el-table-column>
+        <el-table-column
+          prop="printPlanName"
+          label="印刷计划"
+        ></el-table-column>
+        <el-table-column prop="examDate" label="考试日期"> </el-table-column>
+        <el-table-column prop="examTime" label="考试时间"> </el-table-column>
+        <el-table-column prop="examPlace" label="考点"> </el-table-column>
+        <el-table-column prop="examRoom" label="考场"> </el-table-column>
+        <el-table-column prop="packageCode" label="卷袋号"> </el-table-column>
+        <el-table-column prop="courseNameCode" label="课程(代码)">
+        </el-table-column>
+        <el-table-column prop="paperNumber" label="试卷编号"></el-table-column>
+        <el-table-column prop="totalSubjects" label="科次" width="80">
+        </el-table-column>
+        <el-table-column class-name="action-column" label="操作" width="100">
+          <template slot-scope="scope">
+            <el-button
+              v-if="checkPrivilege('link', 'preview')"
+              class="btn-primary"
+              type="text"
+              @click="toPreview(scope.row)"
+              >查看详情</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="box-justify">
+        <div>
+          <span class="mr-2"
+            >科次总计:<i class="color-primary">{{
+              totalData.totalSubjects
+            }}</i>
+            科次</span
+          >
+          <span
+            >卷袋数量总计:<i class="color-primary">{{
+              totalData.packageCount
+            }}</i>
+            个</span
+          >
+        </div>
+        <el-pagination
+          background
+          layout="total,prev, pager, next"
+          :current-page="current"
+          :total="total"
+          :page-size="size"
+          @current-change="toPage"
+        >
+        </el-pagination>
+      </div>
+    </div>
+
+    <!-- PreviewBusinessDetail -->
+    <preview-business-detail
+      ref="PreviewBusinessDetail"
+      :instance="curRow"
+    ></preview-business-detail>
+    <!-- UploadBusinessDataDialog -->
+    <upload-business-data-dialog
+      ref="UploadBusinessDataDialog"
+      @modified="getList"
+    ></upload-business-data-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  businessDataListPage,
+  businessTotalData,
+  businessTemplateDownload,
+  businessDataExport
+} from "../api";
+import PreviewBusinessDetail from "../components/PreviewBusinessDetail";
+import UploadBusinessDataDialog from "../components/UploadBusinessDataDialog";
+import { parseTimeRangeDateAndTime } from "@/plugins/utils";
+import { downloadByApi } from "@/plugins/download";
+import pickerOptions from "@/constants/datePickerOptions";
+
+export default {
+  name: "business-data-export",
+  components: { PreviewBusinessDetail, UploadBusinessDataDialog },
+  data() {
+    return {
+      filter: {
+        semesterId: "",
+        examId: "",
+        printPlanIdList: "",
+        courseCode: "",
+        paperNumber: "",
+        examPlace: "",
+        examRoom: "",
+        packageCode: "",
+        startDate: "",
+        endDate: ""
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      dataList: [],
+      curRow: {},
+      totalData: {},
+      curPrintPlan: {},
+      loading: false,
+      // date-picker
+      createTime: [],
+      pickerOptions,
+      // import
+      // TODO:
+      uploadUrl: "/api/admin/exam/print/data_import",
+      uploadData: {
+        type: "FILE",
+        printPlanId: ""
+      }
+    };
+  },
+  computed: {
+    canImport() {
+      return (
+        this.curPrintPlan && ["NEW", "READY"].includes(this.curPrintPlan.status)
+      );
+    }
+  },
+  mounted() {
+    this.search();
+  },
+  methods: {
+    async getList() {
+      if (!this.checkPrivilege("list", "list")) return;
+
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      if (this.createTime) {
+        datas.startDate = this.createTime[0];
+        datas.endDate = this.createTime[1];
+      }
+      const data = await businessDataListPage(datas);
+      this.dataList = data.records.map(item => {
+        const { date, time } = parseTimeRangeDateAndTime(
+          item.examStartTime,
+          item.examEndTime
+        );
+        item.examDate = date || "--";
+        item.examTime = time || "--";
+        return item;
+      });
+      this.total = data.total;
+    },
+    async getTotalData() {
+      const datas = {
+        ...this.filter
+      };
+      if (this.createTime) {
+        datas.startDate = this.createTime[0];
+        datas.endDate = this.createTime[1];
+      }
+      this.totalData = await businessTotalData(datas);
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    search() {
+      this.toPage(1);
+      this.getTotalData();
+    },
+    printPlanChange() {
+      this.filter.paperNumber = "";
+      this.filter.courseCode = "";
+      this.filter.examRoom = "";
+      this.filter.examPlace = "";
+    },
+    toUpload() {
+      this.$refs.UploadBusinessDataDialog.open();
+    },
+    async toExport() {
+      // 异步导出
+      if (this.loading) return;
+
+      this.loading = true;
+      const datas = {
+        ...this.filter
+      };
+      if (this.createTime) {
+        datas.startDate = this.createTime[0];
+        datas.endDate = this.createTime[1];
+      }
+      const res = await businessDataExport(datas).catch(() => {});
+      this.loading = false;
+
+      if (res) {
+        this.$message.success(
+          "导出任务已提交,请在系统设置-任务管理中下载文件!"
+        );
+      } else {
+        this.$message.error("导出任务提交失败,请重新尝试!");
+      }
+    },
+    async toDownloadTemplate() {
+      if (this.loading) return;
+
+      this.loading = true;
+      const res = await downloadByApi(() => {
+        return businessTemplateDownload();
+      }, `考务数据模板.xlsx`).catch(e => {
+        this.$message.error(e || "下载失败,请重新尝试!");
+      });
+      this.downloading = false;
+
+      if (!res) return;
+      this.$message.success("下载成功!");
+    },
+    toPreview(row) {
+      this.curRow = { ...row };
+      this.$refs.PreviewBusinessDetail.open();
+    }
+  }
+};
+</script>

+ 226 - 219
src/modules/print/views/PlanLinkPaper.vue

@@ -1,219 +1,226 @@
-<template>
-  <div class="plan-link-paper">
-    <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="关联状态:">
-            <el-select
-              v-model="filter.relateType"
-              style="width: 120px;"
-              placeholder="关联状态"
-              clearable
-            >
-              <el-option
-                v-for="(val, key) in RELATE_TYPE"
-                :key="key"
-                :value="key"
-                :label="val"
-              ></el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="印刷计划:">
-            <print-plan-select
-              v-model.trim="filter.printPlanIdList"
-              placeholder="印刷计划"
-              clearable
-              multiple
-              @change="printPlanChange"
-            ></print-plan-select>
-          </el-form-item>
-          <el-form-item label="课程(代码):" label-width="110px">
-            <course-select
-              v-model.trim="filter.courseCode"
-              :print-plan-id="filter.printPlanIdList"
-              placeholder="课程(代码)"
-              clearable
-            ></course-select>
-          </el-form-item>
-          <el-form-item label="试卷编号:">
-            <paper-number-select
-              ref="PaperNumberSelect"
-              v-model="filter.paperNumber"
-              :print-plan-id="filter.printPlanIdList"
-              placeholder="试卷编号"
-              clearable
-            ></paper-number-select>
-          </el-form-item>
-          <el-form-item label="题卡规则:">
-            <card-rule-select
-              ref="CardRuleSelect"
-              v-model.trim="filter.cardRuleId"
-              placeholder="题卡规则"
-              clearable
-            ></card-rule-select>
-          </el-form-item>
-          <el-form-item label="命题老师:">
-            <el-input
-              v-model="filter.userName"
-              placeholder="命题老师"
-              clearable
-            ></el-input>
-          </el-form-item>
-        </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>
-
-    <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="printPlanName"
-          label="印刷计划"
-        ></el-table-column>
-        <el-table-column prop="paperNumber" label="试卷编号"></el-table-column>
-        <el-table-column prop="courseName" label="课程(代码)">
-          <span slot-scope="scope"
-            >{{ scope.row.courseName }}({{ scope.row.courseCode }})</span
-          >
-        </el-table-column>
-        <el-table-column prop="cardRuleName" label="题卡规则">
-        </el-table-column>
-        <el-table-column prop="userName" label="命题老师" width="100">
-        </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="relatePaperType" label="关联卷型" width="100">
-          <span slot-scope="scope">{{
-            scope.row.relatePaperType | defaultFieldFilter
-          }}</span>
-        </el-table-column>
-        <el-table-column label="关联状态" width="80">
-          <span slot-scope="scope">
-            {{ scope.row.relatePaperType ? "已关联" : "未关联" }}
-          </span>
-        </el-table-column>
-        <el-table-column prop="totalSubjects" label="总科次" width="80">
-        </el-table-column>
-        <el-table-column class-name="action-column" label="操作" width="100">
-          <template slot-scope="scope">
-            <el-button
-              v-if="checkPrivilege('link', 'edit')"
-              class="btn-primary"
-              type="text"
-              @click="toEdit(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>
-
-    <!-- ModifyPlanPaper -->
-    <modify-plan-paper
-      :instance="curRow"
-      @modified="getList"
-      ref="ModifyPlanPaper"
-    ></modify-plan-paper>
-  </div>
-</template>
-
-<script>
-import { planLinkPaperListPage } from "../api";
-import ModifyPlanPaper from "../components/ModifyPlanPaper";
-
-export const RELATE_TYPE = {
-  RELATE: "已关联",
-  NOT_RELATE: "未关联"
-};
-
-export default {
-  name: "plan-link-paper",
-  components: { ModifyPlanPaper },
-  data() {
-    return {
-      filter: {
-        printPlanIdList: [],
-        courseCode: "",
-        paperNumber: "",
-        relateType: "",
-        cardRuleId: "",
-        userName: ""
-      },
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      total: 0,
-      dataList: [],
-      curRow: {},
-      RELATE_TYPE
-    };
-  },
-  mounted() {
-    this.search();
-  },
-  methods: {
-    async getList() {
-      if (!this.checkPrivilege("list", "list")) return;
-
-      const datas = {
-        ...this.filter,
-        pageNumber: this.current,
-        pageSize: this.size
-      };
-      const data = await planLinkPaperListPage(datas);
-      this.dataList = data.records;
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-    },
-    search() {
-      this.toPage(1);
-    },
-    printPlanChange() {
-      this.filter.paperNumber = "";
-      this.filter.courseCode = "";
-    },
-    toEdit(row) {
-      this.curRow = row;
-      this.$refs.ModifyPlanPaper.open();
-    }
-  }
-};
-</script>
+<template>
+  <div class="plan-link-paper">
+    <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.trim="filter.semesterId"
+              placeholder="学期"
+              clearable
+            ></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="关联状态:">
+            <el-select
+              v-model="filter.relateType"
+              style="width: 120px;"
+              placeholder="关联状态"
+              clearable
+            >
+              <el-option
+                v-for="(val, key) in RELATE_TYPE"
+                :key="key"
+                :value="key"
+                :label="val"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="印刷计划:">
+            <print-plan-select
+              v-model.trim="filter.printPlanIdList"
+              placeholder="印刷计划"
+              clearable
+              multiple
+              @change="printPlanChange"
+            ></print-plan-select>
+          </el-form-item>
+          <el-form-item label="课程(代码):" label-width="110px">
+            <course-select
+              v-model.trim="filter.courseCode"
+              :print-plan-id="filter.printPlanIdList"
+              placeholder="课程(代码)"
+              clearable
+            ></course-select>
+          </el-form-item>
+          <el-form-item label="试卷编号:">
+            <paper-number-select
+              ref="PaperNumberSelect"
+              v-model="filter.paperNumber"
+              :print-plan-id="filter.printPlanIdList"
+              placeholder="试卷编号"
+              clearable
+            ></paper-number-select>
+          </el-form-item>
+          <el-form-item label="命题老师:">
+            <el-input
+              v-model="filter.userName"
+              placeholder="命题老师"
+              clearable
+            ></el-input>
+          </el-form-item>
+        </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>
+
+    <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="examName" label="考试"></el-table-column>
+        <el-table-column
+          prop="printPlanName"
+          label="印刷计划"
+        ></el-table-column>
+        <el-table-column prop="paperNumber" label="试卷编号"></el-table-column>
+        <el-table-column prop="courseName" label="课程(代码)">
+          <span slot-scope="scope"
+            >{{ scope.row.courseName }}({{ scope.row.courseCode }})</span
+          >
+        </el-table-column>
+        <el-table-column prop="userName" label="命题老师" width="100">
+        </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="relatePaperType" label="关联卷型" width="100">
+          <span slot-scope="scope">{{
+            scope.row.relatePaperType | defaultFieldFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column label="关联状态" width="80">
+          <span slot-scope="scope">
+            {{ scope.row.relatePaperType ? "已关联" : "未关联" }}
+          </span>
+        </el-table-column>
+        <el-table-column prop="totalSubjects" label="总科次" width="80">
+        </el-table-column>
+        <el-table-column class-name="action-column" label="操作" width="100">
+          <template slot-scope="scope">
+            <el-button
+              v-if="checkPrivilege('link', 'edit')"
+              class="btn-primary"
+              type="text"
+              @click="toEdit(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>
+
+    <!-- ModifyPlanPaper -->
+    <modify-plan-paper
+      :instance="curRow"
+      @modified="getList"
+      ref="ModifyPlanPaper"
+    ></modify-plan-paper>
+  </div>
+</template>
+
+<script>
+import { planLinkPaperListPage } from "../api";
+import ModifyPlanPaper from "../components/ModifyPlanPaper";
+
+export const RELATE_TYPE = {
+  RELATE: "已关联",
+  NOT_RELATE: "未关联"
+};
+
+export default {
+  name: "plan-link-paper",
+  components: { ModifyPlanPaper },
+  data() {
+    return {
+      filter: {
+        semesterId: "",
+        examId: "",
+        printPlanIdList: [],
+        courseCode: "",
+        paperNumber: "",
+        relateType: "",
+        cardRuleId: "",
+        userName: ""
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      dataList: [],
+      curRow: {},
+      RELATE_TYPE
+    };
+  },
+  mounted() {
+    this.search();
+  },
+  methods: {
+    async getList() {
+      if (!this.checkPrivilege("list", "list")) return;
+
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      const data = await planLinkPaperListPage(datas);
+      this.dataList = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    search() {
+      this.toPage(1);
+    },
+    printPlanChange() {
+      this.filter.paperNumber = "";
+      this.filter.courseCode = "";
+    },
+    toEdit(row) {
+      this.curRow = row;
+      this.$refs.ModifyPlanPaper.open();
+    }
+  }
+};
+</script>

+ 260 - 253
src/modules/print/views/PrintPlanManage.vue

@@ -1,253 +1,260 @@
-<template>
-  <div class="print-plan-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.trim="filter.semesterId"
-              placeholder="学期"
-              clearable
-            ></semester-select>
-          </el-form-item>
-          <el-form-item label="印刷计划:">
-            <print-plan-select
-              v-model.trim="filter.printPlanIdList"
-              placeholder="印刷计划"
-              multiple
-              clearable
-            ></print-plan-select>
-          </el-form-item>
-          <el-form-item label="计划状态:">
-            <el-select
-              v-model="filter.status"
-              style="width: 142px;"
-              placeholder="计划状态"
-              clearable
-            >
-              <el-option
-                v-for="(val, key) in PRINT_PLAN_STATUS"
-                :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="search"
-            >查询</el-button
-          >
-        </el-form-item>
-      </el-form>
-      <div class="part-box-action">
-        <el-button
-          v-if="checkPrivilege('button', 'add')"
-          icon="el-icon-circle-plus-outline"
-          type="primary"
-          @click="toAdd"
-        >
-          新建印刷计划
-        </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="examName" label="考试"></el-table-column>
-        <el-table-column prop="name" label="印刷计划"></el-table-column>
-        <el-table-column prop="examStartTime" label="考试开始时间">
-          <span slot-scope="scope">{{
-            scope.row.examStartTime | timestampFilter
-          }}</span>
-        </el-table-column>
-        <el-table-column prop="examEndTime" label="考试结束时间">
-          <span slot-scope="scope">{{
-            scope.row.examEndTime | timestampFilter
-          }}</span>
-        </el-table-column>
-        <el-table-column prop="status" label="计划状态" width="100">
-          <span slot-scope="scope">
-            {{ scope.row.status | printPlanStatusFilter }}
-          </span>
-        </el-table-column>
-        <el-table-column prop="totalGates" label="总门次" width="80">
-        </el-table-column>
-        <el-table-column prop="totalSubjects" label="总科次" width="80">
-        </el-table-column>
-        <el-table-column prop="totalPackages" 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="createName" label="创建人"></el-table-column>
-        <el-table-column class-name="action-column" label="操作" width="140">
-          <template slot-scope="scope">
-            <el-button
-              v-if="checkPrivilege('link', 'preview')"
-              class="btn-primary"
-              type="text"
-              @click="toPreview(scope.row)"
-              >查看</el-button
-            >
-            <el-button
-              class="btn-primary"
-              type="text"
-              @click="toEdit(scope.row)"
-              v-if="
-                scope.row.createId === curUserId &&
-                  scope.row.status === 'NEW' &&
-                  checkPrivilege('link', 'edit')
-              "
-              >修改</el-button
-            >
-            <el-button
-              class="btn-danger"
-              type="text"
-              @click="toDelete(scope.row)"
-              v-if="
-                scope.row.createId === curUserId &&
-                  scope.row.status === 'NEW' &&
-                  checkPrivilege('link', 'delete')
-              "
-              >删除</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>
-
-    <!-- ModifyPrintPlan -->
-    <modify-print-plan
-      ref="ModifyPrintPlan"
-      :instance="curPrintPlan"
-      :edit-type="editType"
-      @modified="getList"
-    ></modify-print-plan>
-  </div>
-</template>
-
-<script>
-import { printPlanListPage, removePrintPlan } from "../api";
-import { PRINT_PLAN_STATUS } from "@/constants/enumerate";
-import pickerOptions from "@/constants/datePickerOptions";
-import ModifyPrintPlan from "../components/ModifyPrintPlan";
-
-export default {
-  name: "print-plan-manage",
-  components: { ModifyPrintPlan },
-  data() {
-    return {
-      filter: {
-        semesterId: "",
-        printPlanIdList: [],
-        status: "",
-        startTime: "",
-        endTime: ""
-      },
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      total: 0,
-      dataList: [],
-      curPrintPlan: {},
-      editType: "ADD",
-      PRINT_PLAN_STATUS,
-      curUserId: this.$ls.get("user", { id: "" }).id,
-      // date-picker
-      createTime: [],
-      pickerOptions
-    };
-  },
-  mounted() {
-    this.search();
-  },
-  methods: {
-    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 printPlanListPage(datas);
-      this.dataList = data.records;
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-    },
-    search() {
-      this.toPage(1);
-    },
-    toAdd() {
-      this.curPrintPlan = {};
-      this.editType = "ADD";
-      this.$refs.ModifyPrintPlan.open();
-    },
-    toEdit(row) {
-      this.curPrintPlan = row;
-      this.editType = "EDIT";
-      this.$refs.ModifyPrintPlan.open();
-    },
-    toPreview(row) {
-      this.curPrintPlan = row;
-      this.editType = "PREVIEW";
-      this.$refs.ModifyPrintPlan.open();
-    },
-    toDelete(row) {
-      this.$confirm(`确定要删除印刷计划【${row.name}】吗?`, "提示", {
-        type: "warning"
-      })
-        .then(async () => {
-          await removePrintPlan(row.id);
-          this.$message.success("删除成功!");
-          this.deletePageLastItem();
-        })
-        .catch(() => {});
-    }
-  }
-};
-</script>
+<template>
+  <div class="print-plan-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.trim="filter.semesterId"
+              placeholder="学期"
+              clearable
+            ></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="印刷计划:">
+            <print-plan-select
+              v-model.trim="filter.printPlanIdList"
+              placeholder="印刷计划"
+              multiple
+              clearable
+            ></print-plan-select>
+          </el-form-item>
+          <el-form-item label="计划状态:">
+            <el-select
+              v-model="filter.status"
+              style="width: 142px;"
+              placeholder="计划状态"
+              clearable
+            >
+              <el-option
+                v-for="(val, key) in PRINT_PLAN_STATUS"
+                :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="search"
+            >查询</el-button
+          >
+        </el-form-item>
+      </el-form>
+      <div class="part-box-action">
+        <el-button
+          v-if="checkPrivilege('button', 'add')"
+          icon="el-icon-circle-plus-outline"
+          type="primary"
+          @click="toAdd"
+        >
+          新建印刷计划
+        </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="examName" label="考试"></el-table-column>
+        <el-table-column prop="name" label="印刷计划"></el-table-column>
+        <el-table-column prop="examStartTime" label="考试开始时间">
+          <span slot-scope="scope">{{
+            scope.row.examStartTime | timestampFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column prop="examEndTime" label="考试结束时间">
+          <span slot-scope="scope">{{
+            scope.row.examEndTime | timestampFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column prop="status" label="计划状态" width="100">
+          <span slot-scope="scope">
+            {{ scope.row.status | printPlanStatusFilter }}
+          </span>
+        </el-table-column>
+        <el-table-column prop="totalGates" label="总门次" width="80">
+        </el-table-column>
+        <el-table-column prop="totalSubjects" label="总科次" width="80">
+        </el-table-column>
+        <el-table-column prop="totalPackages" 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="createName" label="创建人"></el-table-column>
+        <el-table-column class-name="action-column" label="操作" width="140">
+          <template slot-scope="scope">
+            <el-button
+              v-if="checkPrivilege('link', 'preview')"
+              class="btn-primary"
+              type="text"
+              @click="toPreview(scope.row)"
+              >查看</el-button
+            >
+            <el-button
+              class="btn-primary"
+              type="text"
+              @click="toEdit(scope.row)"
+              v-if="
+                scope.row.createId === curUserId &&
+                  scope.row.status === 'NEW' &&
+                  checkPrivilege('link', 'edit')
+              "
+              >修改</el-button
+            >
+            <el-button
+              class="btn-danger"
+              type="text"
+              @click="toDelete(scope.row)"
+              v-if="
+                scope.row.createId === curUserId &&
+                  scope.row.status === 'NEW' &&
+                  checkPrivilege('link', 'delete')
+              "
+              >删除</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>
+
+    <!-- ModifyPrintPlan -->
+    <modify-print-plan
+      ref="ModifyPrintPlan"
+      :instance="curPrintPlan"
+      :edit-type="editType"
+      @modified="getList"
+    ></modify-print-plan>
+  </div>
+</template>
+
+<script>
+import { printPlanListPage, removePrintPlan } from "../api";
+import { PRINT_PLAN_STATUS } from "@/constants/enumerate";
+import pickerOptions from "@/constants/datePickerOptions";
+import ModifyPrintPlan from "../components/ModifyPrintPlan";
+
+export default {
+  name: "print-plan-manage",
+  components: { ModifyPrintPlan },
+  data() {
+    return {
+      filter: {
+        semesterId: "",
+        examId: "",
+        printPlanIdList: [],
+        status: "",
+        startTime: "",
+        endTime: ""
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      dataList: [],
+      curPrintPlan: {},
+      editType: "ADD",
+      PRINT_PLAN_STATUS,
+      curUserId: this.$ls.get("user", { id: "" }).id,
+      // date-picker
+      createTime: [],
+      pickerOptions
+    };
+  },
+  mounted() {
+    this.search();
+  },
+  methods: {
+    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 printPlanListPage(datas);
+      this.dataList = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    search() {
+      this.toPage(1);
+    },
+    toAdd() {
+      this.curPrintPlan = {};
+      this.editType = "ADD";
+      this.$refs.ModifyPrintPlan.open();
+    },
+    toEdit(row) {
+      this.curPrintPlan = row;
+      this.editType = "EDIT";
+      this.$refs.ModifyPrintPlan.open();
+    },
+    toPreview(row) {
+      this.curPrintPlan = row;
+      this.editType = "PREVIEW";
+      this.$refs.ModifyPrintPlan.open();
+    },
+    toDelete(row) {
+      this.$confirm(`确定要删除印刷计划【${row.name}】吗?`, "提示", {
+        type: "warning"
+      })
+        .then(async () => {
+          await removePrintPlan(row.id);
+          this.$message.success("删除成功!");
+          this.deletePageLastItem();
+        })
+        .catch(() => {});
+    }
+  }
+};
+</script>

+ 576 - 559
src/modules/print/views/PrintTaskManage.vue

@@ -1,559 +1,576 @@
-<template>
-  <div class="print-task-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="印刷计划:">
-            <print-plan-select
-              v-model.trim="filter.printPlanId"
-              placeholder="印刷计划"
-              clearable
-              @change="printPlanChange"
-            ></print-plan-select>
-          </el-form-item>
-          <el-form-item label="印刷室:">
-            <print-room-select
-              v-model.trim="filter.printHouseId"
-              placeholder="印刷室"
-              clearable
-              @change="printPlanChange"
-            ></print-room-select>
-          </el-form-item>
-          <el-form-item label="印刷状态:">
-            <el-select
-              v-model="filter.status"
-              style="width: 120px;"
-              placeholder="印刷状态"
-              clearable
-            >
-              <el-option
-                v-for="(val, key) in PRINT_TASK_STATUS"
-                :key="key"
-                :value="key"
-                :label="val"
-              ></el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="课程(代码):" label-width="110px">
-            <course-select
-              v-model.trim="filter.courseCode"
-              :print-plan-id="filter.printPlanId"
-              placeholder="课程(代码)"
-              clearable
-            ></course-select>
-          </el-form-item>
-          <el-form-item label="试卷编号:">
-            <paper-number-select
-              ref="PaperNumberSelect"
-              v-model="filter.paperNumber"
-              :print-plan-id="filter.printPlanId"
-              placeholder="试卷编号"
-              clearable
-            ></paper-number-select>
-          </el-form-item>
-          <el-form-item label="考点:" label-width="55px">
-            <place-select
-              v-model.trim="filter.examPlace"
-              :print-plan-id="filter.printPlanId"
-              placeholder="考点"
-              clearable
-            ></place-select>
-          </el-form-item>
-          <el-form-item label="考场:" label-width="55px">
-            <room-select
-              v-model.trim="filter.examRoom"
-              :print-plan-id="filter.printPlanId"
-              placeholder="考场"
-              clearable
-            ></room-select>
-          </el-form-item>
-          <el-form-item label="考试日期:">
-            <el-date-picker
-              v-model="createTime"
-              type="daterange"
-              :picker-options="pickerOptions"
-              range-separator="至"
-              start-placeholder="考试开始日期"
-              end-placeholder="考试结束日期"
-              value-format="timestamp"
-              align="right"
-              unlink-panels
-            >
-            </el-date-picker>
-          </el-form-item>
-          <el-form-item label="打印时间:">
-            <el-date-picker
-              v-model="printTime"
-              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="search"
-            >查询</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"
-          :disabled="loading"
-          @click="toExport"
-        >
-          批量下载PDF
-        </el-button>
-      </div>
-    </div>
-    <div class="part-box part-box-pad box-justify">
-      <p>
-        <span class="mr-4"
-          >科次总计:<i class="color-primary">{{ totalInfo.totalSubjects }}</i>
-          科次</span
-        >
-        <span class="mr-4"
-          >试卷总计:<i class="color-primary">{{ totalInfo.paperCount }}</i>
-          个</span
-        >
-        <span class="mr-4"
-          >卷袋数量总计:<i class="color-primary">{{
-            totalInfo.packageCount
-          }}</i>
-          个</span
-        >
-        <span class="mr-4"
-          >A3印量总计:<i class="color-primary">{{ totalInfo.pagesA3 }}</i>
-          张</span
-        >
-        <span class="mr-4"
-          >A4印量总计:<i class="color-primary">{{ totalInfo.pagesA4 }}</i>
-          张</span
-        >
-      </p>
-      <p>
-        <span class="mr-4"
-          >A3剩余印量:<i class="color-primary">{{ totalInfo.pagesA3Left }}</i>
-          张</span
-        >
-        <span
-          >A4剩余印量:<i class="color-primary">{{ totalInfo.pagesA4Left }}</i>
-          张</span
-        >
-      </p>
-    </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
-          type="index"
-          label="序号"
-          width="60"
-          :index="indexMethod"
-        ></el-table-column>
-        <el-table-column prop="packageCode" label="卷袋编号"></el-table-column>
-        <el-table-column
-          prop="printPlanName"
-          label="印刷计划"
-        ></el-table-column>
-        <el-table-column prop="printHouseName" label="印刷室"></el-table-column>
-        <el-table-column
-          prop="examDate"
-          label="考试日期"
-          width="100"
-        ></el-table-column>
-        <el-table-column
-          prop="examTime"
-          label="考试时间"
-          width="100"
-        ></el-table-column>
-        <el-table-column prop="courseNameCode" label="课程(代码)">
-        </el-table-column>
-        <el-table-column prop="paperNumber" label="试卷编号"></el-table-column>
-        <el-table-column prop="examPlace" label="考点"></el-table-column>
-        <el-table-column prop="examRoom" label="考场"></el-table-column>
-        <el-table-column
-          prop="singlePagesA3"
-          label="单科次准印量A3(页)"
-          width="80"
-        ></el-table-column>
-        <el-table-column
-          prop="totalSubjects"
-          label="科次"
-          width="80"
-        ></el-table-column>
-        <el-table-column
-          prop="pagesA3"
-          label="A3准印量小计(页)"
-          width="80"
-        ></el-table-column>
-        <el-table-column
-          prop="pagesA4"
-          label="A4准印量小计(页)"
-          width="80"
-        ></el-table-column>
-        <el-table-column prop="status" label="印刷状态" width="80">
-          <span slot-scope="scope">{{
-            scope.row.status | printTaskStatusFilter
-          }}</span>
-        </el-table-column>
-        <el-table-column prop="validate" label="是否校验" width="80">
-          <span slot-scope="scope">{{ scope.row.validate ? "是" : "否" }}</span>
-        </el-table-column>
-        <el-table-column prop="printStartTime" label="打印开始时间" width="160">
-          <span slot-scope="scope">{{
-            scope.row.printStartTime | timestampFilter
-          }}</span>
-        </el-table-column>
-        <el-table-column prop="printEndTime" label="打印完成时间" width="160">
-          <span slot-scope="scope">{{
-            scope.row.printEndTime | timestampFilter
-          }}</span>
-        </el-table-column>
-        <el-table-column prop="normal" label="任务状态">
-          <span slot-scope="scope">{{
-            scope.row.normal ? "正常" : "作废"
-          }}</span>
-        </el-table-column>
-        <el-table-column
-          class-name="action-column"
-          label="操作"
-          width="100"
-          fixed="right"
-          align="center"
-        >
-          <template slot-scope="scope">
-            <el-button
-              v-if="checkPrivilege('link', 'download')"
-              class="btn-primary"
-              type="text"
-              @click="toViewPdf(scope.row)"
-              >查看pdf</el-button
-            >
-            <el-button
-              v-if="
-                scope.row.status === 'READY' && checkPrivilege('link', 'submit')
-              "
-              class="btn-primary"
-              type="text"
-              @click="toSubmit(scope.row)"
-              >提交印刷</el-button
-            >
-            <!-- <el-button
-              v-if="scope.row.status === 'PRINTING'"
-              class="btn-primary"
-              type="text"
-              @click="toResubmit(scope.row)"
-            >重新提交</el-button> -->
-            <el-button
-              v-if="
-                scope.row.status === 'WAITING' && checkPrivilege('link', 'end')
-              "
-              class="btn-danger"
-              type="text"
-              @click="toCancel(scope.row)"
-              >撤回提交</el-button
-            >
-            <el-button
-              v-if="
-                (scope.row.status === 'END' ||
-                  scope.row.status === 'PRINT_FINISH') &&
-                  checkPrivilege('link', 'normal')
-              "
-              :class="scope.row.normal ? 'btn-danger' : 'btn-primary'"
-              type="text"
-              @click="toNormal(scope.row)"
-              >{{ scope.row.normal ? "作废" : "恢复" }}</el-button
-            >
-            <!-- <el-button
-              class="btn-primary"
-              type="text"
-              @click="toPreview(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>
-
-    <!-- PreviewPrintTaskTemplate-->
-    <preview-print-task-template
-      :instance="curTask"
-      ref="PreviewPrintTaskTemplate"
-    ></preview-print-task-template>
-    <!-- pdf-view -->
-    <el-dialog
-      class="pdf-view-dialog"
-      :visible.sync="padViewDialogVisible"
-      title="请选择PDF类型"
-      top="10vh"
-      width="400px"
-      :close-on-click-modal="false"
-      :close-on-press-escape="false"
-      append-to-body
-    >
-      <el-button
-        v-for="item in pdfList"
-        :key="item.name"
-        type="primary"
-        size="large"
-        @click="viewPdf(item)"
-        >{{ item.type | printPdfTypeFilter }}</el-button
-      >
-      <div slot="footer"></div>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import {
-  printTaskListPage,
-  submitPrintTask,
-  resubmitPrintTask,
-  cancelPrintTask,
-  printTaskTotalInfo,
-  getPrintTaskPdf,
-  downloadPrintTaskPdf,
-  printTaskNormal
-} from "../api";
-import { PRINT_TASK_STATUS } from "@/constants/enumerate";
-import pickerOptions from "@/constants/datePickerOptions";
-import { parseTimeRangeDateAndTime } from "@/plugins/utils";
-import PreviewPrintTaskTemplate from "../components/PreviewPrintTaskTemplate";
-
-export default {
-  name: "print-task-manage",
-  components: { PreviewPrintTaskTemplate },
-  data() {
-    return {
-      filter: {
-        printPlanId: "",
-        printHouseId: "",
-        status: "",
-        courseCode: "",
-        paperNumber: "",
-        examPlace: "",
-        examRoom: "",
-        examStartTime: "",
-        examEndTime: "",
-        printStartTime: "",
-        printEndTime: ""
-      },
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      total: 0,
-      totalInfo: {},
-      dataList: [],
-      curRow: {},
-      multipleSelection: [],
-      PRINT_TASK_STATUS,
-      loading: false,
-      // view-pdf
-      padViewDialogVisible: false,
-      pdfList: [],
-      // view-template
-      curTask: {},
-      // date-picker
-      createTime: [],
-      printTime: [],
-      pickerOptions
-    };
-  },
-  mounted() {
-    this.search();
-  },
-  methods: {
-    async getList() {
-      if (!this.checkPrivilege("list", "list")) return;
-
-      const datas = {
-        ...this.filter,
-        pageNumber: this.current,
-        pageSize: this.size
-      };
-      if (this.createTime) {
-        datas.examStartTime = this.createTime[0];
-        datas.examEndTime = this.createTime[1];
-      }
-      if (this.printTime) {
-        datas.printStartTime = this.printTime[0];
-        datas.printEndTime = this.printTime[1];
-      }
-      const data = await printTaskListPage(datas);
-      this.dataList = data.records.map(item => {
-        const { date, time } = parseTimeRangeDateAndTime(
-          item.examStartTime,
-          item.examEndTime
-        );
-        item.examDate = date || "--";
-        item.examTime = time || "--";
-        return item;
-      });
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-      this.multipleSelection = [];
-    },
-    search() {
-      this.toPage(1);
-      this.getTotalInfo();
-    },
-    printPlanChange() {
-      this.filter.paperNumber = "";
-      this.filter.courseCode = "";
-      this.filter.examRoom = "";
-      this.filter.examPlace = "";
-    },
-    async getTotalInfo() {
-      const datas = {
-        ...this.filter,
-        pageNumber: this.current,
-        pageSize: this.size
-      };
-      if (this.createTime) {
-        datas.examStartTime = this.createTime[0];
-        datas.examEndTime = this.createTime[1];
-      }
-      const data = await printTaskTotalInfo(datas);
-      this.totalInfo = data || {};
-    },
-    handleSelectionChange(val) {
-      this.multipleSelection = val.map(item => item.examDetailId);
-    },
-    toPreview(row) {
-      this.curTask = row;
-      this.$refs.PreviewPrintTaskTemplate.open();
-    },
-    toSubmit(row) {
-      this.$confirm("确定提交该印刷任务吗?", "提示", {
-        type: "warning"
-      })
-        .then(async () => {
-          const data = await submitPrintTask(row.examDetailId);
-          if (!data) return;
-
-          this.$message.success("提交成功!");
-          this.getList();
-        })
-        .catch(() => {});
-    },
-    toResubmit(row) {
-      this.$confirm("确定重新提交该印刷任务吗?", "提示", {
-        type: "warning"
-      })
-        .then(async () => {
-          const data = await resubmitPrintTask({
-            id: row.examDetailId,
-            printPlanId: row.printPlanId
-          });
-          if (!data) return;
-
-          this.$message.success("提交成功!");
-          this.getList();
-        })
-        .catch(() => {});
-    },
-    toCancel(row) {
-      this.$confirm("确定撤回该印刷任务的提交吗?", "提示", {
-        type: "warning"
-      })
-        .then(async () => {
-          const data = await cancelPrintTask(row.examDetailId);
-          if (!data) return;
-
-          this.$message.success("撤回成功!");
-          this.getList();
-        })
-        .catch(() => {});
-    },
-    async toViewPdf(row) {
-      this.pdfList = [];
-      let result = true;
-      const data = await getPrintTaskPdf(row.examDetailId).catch(() => {
-        result = false;
-      });
-      if (!result) return;
-      if (!data || !data.length) {
-        this.$message.error("当前任务pdf还未生成好,请稍后再试!");
-        return;
-      }
-      if (data.length === 1) {
-        this.viewPdf(data[0]);
-      } else {
-        this.pdfList = data;
-        this.padViewDialogVisible = true;
-      }
-    },
-    viewPdf(item) {
-      window.open(item.url);
-      // this.padViewDialogVisible = false;
-    },
-    async toExport() {
-      if (this.loading) return;
-
-      if (!this.multipleSelection.length) {
-        this.$message.error("请选择要下载的记录!");
-        return;
-      }
-
-      this.loading = true;
-      const data = await downloadPrintTaskPdf(this.multipleSelection);
-      this.loading = false;
-      if (!data) return;
-
-      this.$message.success("文件下载任务提交成功!");
-    },
-    async toNormal(row) {
-      const typeName = row.normal ? "作废" : "恢复";
-      const action = await this.$confirm(
-        `确定${typeName}该印刷任务吗?`,
-        "提示",
-        {
-          type: "warning"
-        }
-      ).catch(() => {});
-      if (action !== "confirm") return;
-
-      const data = await printTaskNormal({
-        id: row.examDetailId,
-        normal: !row.normal
-      });
-      if (!data) return;
-
-      row.normal = !row.normal;
-      this.$message.success("撤回成功!");
-    }
-  }
-};
-</script>
+<template>
+  <div class="print-task-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.trim="filter.semesterId"
+              placeholder="学期"
+              clearable
+            ></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="印刷计划:">
+            <print-plan-select
+              v-model.trim="filter.printPlanId"
+              placeholder="印刷计划"
+              clearable
+              @change="printPlanChange"
+            ></print-plan-select>
+          </el-form-item>
+          <el-form-item label="印刷室:">
+            <print-room-select
+              v-model.trim="filter.printHouseId"
+              placeholder="印刷室"
+              clearable
+              @change="printPlanChange"
+            ></print-room-select>
+          </el-form-item>
+          <el-form-item label="印刷状态:">
+            <el-select
+              v-model="filter.status"
+              style="width: 120px;"
+              placeholder="印刷状态"
+              clearable
+            >
+              <el-option
+                v-for="(val, key) in PRINT_TASK_STATUS"
+                :key="key"
+                :value="key"
+                :label="val"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="课程(代码):" label-width="110px">
+            <course-select
+              v-model.trim="filter.courseCode"
+              :print-plan-id="filter.printPlanId"
+              placeholder="课程(代码)"
+              clearable
+            ></course-select>
+          </el-form-item>
+          <el-form-item label="试卷编号:">
+            <paper-number-select
+              ref="PaperNumberSelect"
+              v-model="filter.paperNumber"
+              :print-plan-id="filter.printPlanId"
+              placeholder="试卷编号"
+              clearable
+            ></paper-number-select>
+          </el-form-item>
+          <el-form-item label="考点:" label-width="55px">
+            <place-select
+              v-model.trim="filter.examPlace"
+              :print-plan-id="filter.printPlanId"
+              placeholder="考点"
+              clearable
+            ></place-select>
+          </el-form-item>
+          <el-form-item label="考场:" label-width="55px">
+            <room-select
+              v-model.trim="filter.examRoom"
+              :print-plan-id="filter.printPlanId"
+              placeholder="考场"
+              clearable
+            ></room-select>
+          </el-form-item>
+          <el-form-item label="考试日期:">
+            <el-date-picker
+              v-model="createTime"
+              type="daterange"
+              :picker-options="pickerOptions"
+              range-separator="至"
+              start-placeholder="考试开始日期"
+              end-placeholder="考试结束日期"
+              value-format="timestamp"
+              align="right"
+              unlink-panels
+            >
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item label="打印时间:">
+            <el-date-picker
+              v-model="printTime"
+              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="search"
+            >查询</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"
+          :disabled="loading"
+          @click="toExport"
+        >
+          批量下载PDF
+        </el-button>
+      </div>
+    </div>
+    <div class="part-box part-box-pad box-justify">
+      <p>
+        <span class="mr-4"
+          >科次总计:<i class="color-primary">{{ totalInfo.totalSubjects }}</i>
+          科次</span
+        >
+        <span class="mr-4"
+          >试卷总计:<i class="color-primary">{{ totalInfo.paperCount }}</i>
+          个</span
+        >
+        <span class="mr-4"
+          >卷袋数量总计:<i class="color-primary">{{
+            totalInfo.packageCount
+          }}</i>
+          个</span
+        >
+        <span class="mr-4"
+          >A3印量总计:<i class="color-primary">{{ totalInfo.pagesA3 }}</i>
+          张</span
+        >
+        <span class="mr-4"
+          >A4印量总计:<i class="color-primary">{{ totalInfo.pagesA4 }}</i>
+          张</span
+        >
+      </p>
+      <p>
+        <span class="mr-4"
+          >A3剩余印量:<i class="color-primary">{{ totalInfo.pagesA3Left }}</i>
+          张</span
+        >
+        <span
+          >A4剩余印量:<i class="color-primary">{{ totalInfo.pagesA4Left }}</i>
+          张</span
+        >
+      </p>
+    </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
+          type="index"
+          label="序号"
+          width="60"
+          :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="packageCode" label="卷袋编号"></el-table-column>
+        <el-table-column
+          prop="printPlanName"
+          label="印刷计划"
+        ></el-table-column>
+        <el-table-column prop="printHouseName" label="印刷室"></el-table-column>
+        <el-table-column
+          prop="examDate"
+          label="考试日期"
+          width="100"
+        ></el-table-column>
+        <el-table-column
+          prop="examTime"
+          label="考试时间"
+          width="100"
+        ></el-table-column>
+        <el-table-column prop="courseNameCode" label="课程(代码)">
+        </el-table-column>
+        <el-table-column prop="paperNumber" label="试卷编号"></el-table-column>
+        <el-table-column prop="examPlace" label="考点"></el-table-column>
+        <el-table-column prop="examRoom" label="考场"></el-table-column>
+        <el-table-column
+          prop="singlePagesA3"
+          label="单科次准印量A3(页)"
+          width="80"
+        ></el-table-column>
+        <el-table-column
+          prop="totalSubjects"
+          label="科次"
+          width="80"
+        ></el-table-column>
+        <el-table-column
+          prop="pagesA3"
+          label="A3准印量小计(页)"
+          width="80"
+        ></el-table-column>
+        <el-table-column
+          prop="pagesA4"
+          label="A4准印量小计(页)"
+          width="80"
+        ></el-table-column>
+        <el-table-column prop="status" label="印刷状态" width="80">
+          <span slot-scope="scope">{{
+            scope.row.status | printTaskStatusFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column prop="validate" label="是否校验" width="80">
+          <span slot-scope="scope">{{ scope.row.validate ? "是" : "否" }}</span>
+        </el-table-column>
+        <el-table-column prop="printStartTime" label="打印开始时间" width="160">
+          <span slot-scope="scope">{{
+            scope.row.printStartTime | timestampFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column prop="printEndTime" label="打印完成时间" width="160">
+          <span slot-scope="scope">{{
+            scope.row.printEndTime | timestampFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column prop="normal" label="任务状态">
+          <span slot-scope="scope">{{
+            scope.row.normal ? "正常" : "作废"
+          }}</span>
+        </el-table-column>
+        <el-table-column
+          class-name="action-column"
+          label="操作"
+          width="100"
+          fixed="right"
+          align="center"
+        >
+          <template slot-scope="scope">
+            <el-button
+              v-if="checkPrivilege('link', 'download')"
+              class="btn-primary"
+              type="text"
+              @click="toViewPdf(scope.row)"
+              >查看pdf</el-button
+            >
+            <el-button
+              v-if="
+                scope.row.status === 'READY' && checkPrivilege('link', 'submit')
+              "
+              class="btn-primary"
+              type="text"
+              @click="toSubmit(scope.row)"
+              >提交印刷</el-button
+            >
+            <!-- <el-button
+              v-if="scope.row.status === 'PRINTING'"
+              class="btn-primary"
+              type="text"
+              @click="toResubmit(scope.row)"
+            >重新提交</el-button> -->
+            <el-button
+              v-if="
+                scope.row.status === 'WAITING' && checkPrivilege('link', 'end')
+              "
+              class="btn-danger"
+              type="text"
+              @click="toCancel(scope.row)"
+              >撤回提交</el-button
+            >
+            <el-button
+              v-if="
+                (scope.row.status === 'END' ||
+                  scope.row.status === 'PRINT_FINISH') &&
+                  checkPrivilege('link', 'normal')
+              "
+              :class="scope.row.normal ? 'btn-danger' : 'btn-primary'"
+              type="text"
+              @click="toNormal(scope.row)"
+              >{{ scope.row.normal ? "作废" : "恢复" }}</el-button
+            >
+            <!-- <el-button
+              class="btn-primary"
+              type="text"
+              @click="toPreview(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>
+
+    <!-- PreviewPrintTaskTemplate-->
+    <preview-print-task-template
+      :instance="curTask"
+      ref="PreviewPrintTaskTemplate"
+    ></preview-print-task-template>
+    <!-- pdf-view -->
+    <el-dialog
+      class="pdf-view-dialog"
+      :visible.sync="padViewDialogVisible"
+      title="请选择PDF类型"
+      top="10vh"
+      width="400px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      append-to-body
+    >
+      <el-button
+        v-for="item in pdfList"
+        :key="item.name"
+        type="primary"
+        size="large"
+        @click="viewPdf(item)"
+        >{{ item.type | printPdfTypeFilter }}</el-button
+      >
+      <div slot="footer"></div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  printTaskListPage,
+  submitPrintTask,
+  resubmitPrintTask,
+  cancelPrintTask,
+  printTaskTotalInfo,
+  getPrintTaskPdf,
+  downloadPrintTaskPdf,
+  printTaskNormal
+} from "../api";
+import { PRINT_TASK_STATUS } from "@/constants/enumerate";
+import pickerOptions from "@/constants/datePickerOptions";
+import { parseTimeRangeDateAndTime } from "@/plugins/utils";
+import PreviewPrintTaskTemplate from "../components/PreviewPrintTaskTemplate";
+
+export default {
+  name: "print-task-manage",
+  components: { PreviewPrintTaskTemplate },
+  data() {
+    return {
+      filter: {
+        semesterId: "",
+        examId: "",
+        printPlanId: "",
+        printHouseId: "",
+        status: "",
+        courseCode: "",
+        paperNumber: "",
+        examPlace: "",
+        examRoom: "",
+        examStartTime: "",
+        examEndTime: "",
+        printStartTime: "",
+        printEndTime: ""
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      totalInfo: {},
+      dataList: [],
+      curRow: {},
+      multipleSelection: [],
+      PRINT_TASK_STATUS,
+      loading: false,
+      // view-pdf
+      padViewDialogVisible: false,
+      pdfList: [],
+      // view-template
+      curTask: {},
+      // date-picker
+      createTime: [],
+      printTime: [],
+      pickerOptions
+    };
+  },
+  mounted() {
+    this.search();
+  },
+  methods: {
+    async getList() {
+      if (!this.checkPrivilege("list", "list")) return;
+
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      if (this.createTime) {
+        datas.examStartTime = this.createTime[0];
+        datas.examEndTime = this.createTime[1];
+      }
+      if (this.printTime) {
+        datas.printStartTime = this.printTime[0];
+        datas.printEndTime = this.printTime[1];
+      }
+      const data = await printTaskListPage(datas);
+      this.dataList = data.records.map(item => {
+        const { date, time } = parseTimeRangeDateAndTime(
+          item.examStartTime,
+          item.examEndTime
+        );
+        item.examDate = date || "--";
+        item.examTime = time || "--";
+        return item;
+      });
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+      this.multipleSelection = [];
+    },
+    search() {
+      this.toPage(1);
+      this.getTotalInfo();
+    },
+    printPlanChange() {
+      this.filter.paperNumber = "";
+      this.filter.courseCode = "";
+      this.filter.examRoom = "";
+      this.filter.examPlace = "";
+    },
+    async getTotalInfo() {
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      if (this.createTime) {
+        datas.examStartTime = this.createTime[0];
+        datas.examEndTime = this.createTime[1];
+      }
+      const data = await printTaskTotalInfo(datas);
+      this.totalInfo = data || {};
+    },
+    handleSelectionChange(val) {
+      this.multipleSelection = val.map(item => item.examDetailId);
+    },
+    toPreview(row) {
+      this.curTask = row;
+      this.$refs.PreviewPrintTaskTemplate.open();
+    },
+    toSubmit(row) {
+      this.$confirm("确定提交该印刷任务吗?", "提示", {
+        type: "warning"
+      })
+        .then(async () => {
+          const data = await submitPrintTask(row.examDetailId);
+          if (!data) return;
+
+          this.$message.success("提交成功!");
+          this.getList();
+        })
+        .catch(() => {});
+    },
+    toResubmit(row) {
+      this.$confirm("确定重新提交该印刷任务吗?", "提示", {
+        type: "warning"
+      })
+        .then(async () => {
+          const data = await resubmitPrintTask({
+            id: row.examDetailId,
+            printPlanId: row.printPlanId
+          });
+          if (!data) return;
+
+          this.$message.success("提交成功!");
+          this.getList();
+        })
+        .catch(() => {});
+    },
+    toCancel(row) {
+      this.$confirm("确定撤回该印刷任务的提交吗?", "提示", {
+        type: "warning"
+      })
+        .then(async () => {
+          const data = await cancelPrintTask(row.examDetailId);
+          if (!data) return;
+
+          this.$message.success("撤回成功!");
+          this.getList();
+        })
+        .catch(() => {});
+    },
+    async toViewPdf(row) {
+      this.pdfList = [];
+      let result = true;
+      const data = await getPrintTaskPdf(row.examDetailId).catch(() => {
+        result = false;
+      });
+      if (!result) return;
+      if (!data || !data.length) {
+        this.$message.error("当前任务pdf还未生成好,请稍后再试!");
+        return;
+      }
+      if (data.length === 1) {
+        this.viewPdf(data[0]);
+      } else {
+        this.pdfList = data;
+        this.padViewDialogVisible = true;
+      }
+    },
+    viewPdf(item) {
+      window.open(item.url);
+      // this.padViewDialogVisible = false;
+    },
+    async toExport() {
+      if (this.loading) return;
+
+      if (!this.multipleSelection.length) {
+        this.$message.error("请选择要下载的记录!");
+        return;
+      }
+
+      this.loading = true;
+      const data = await downloadPrintTaskPdf(this.multipleSelection);
+      this.loading = false;
+      if (!data) return;
+
+      this.$message.success("文件下载任务提交成功!");
+    },
+    async toNormal(row) {
+      const typeName = row.normal ? "作废" : "恢复";
+      const action = await this.$confirm(
+        `确定${typeName}该印刷任务吗?`,
+        "提示",
+        {
+          type: "warning"
+        }
+      ).catch(() => {});
+      if (action !== "confirm") return;
+
+      const data = await printTaskNormal({
+        id: row.examDetailId,
+        normal: !row.normal
+      });
+      if (!data) return;
+
+      row.normal = !row.normal;
+      this.$message.success("撤回成功!");
+    }
+  }
+};
+</script>