Browse Source

feat: 补考新需求

zhangjie 1 năm trước cách đây
mục cha
commit
5d0cd38115

+ 11 - 0
src/assets/styles/base.scss

@@ -431,6 +431,17 @@ body {
     margin-left: 10px;
   }
 }
+.big-btns {
+  display: flex;
+  justify-content: space-between;
+  align-content: center;
+
+  .el-button {
+    padding: 40px;
+    font-size: 30px;
+    min-width: 200px;
+  }
+}
 
 .cont-link {
   color: $--color-primary;

+ 12 - 1
src/components/base/ExamSelect.vue

@@ -29,6 +29,7 @@ export default {
     value: { type: [Number, String], default: "" },
     clearable: { type: Boolean, default: true },
     semesterId: { type: String, default: "" },
+    category: { type: String, default: "" },
     enable: { type: Boolean, default: null },
   },
   data() {
@@ -51,6 +52,13 @@ export default {
         this.$emit("change", {});
       }
     },
+    category(val, oldval) {
+      if (val !== oldval) {
+        this.search();
+        this.$emit("input", "");
+        this.$emit("change", {});
+      }
+    },
   },
   created() {
     this.search();
@@ -60,7 +68,10 @@ export default {
       this.optionList = [];
       if (!this.semesterId) return;
 
-      let data = { semesterId: this.semesterId };
+      let data = {
+        semesterId: this.semesterId,
+        category: this.category || undefined,
+      };
       if (this.enable !== null) data.enable = this.enable;
       const res = await conditionListExam(data);
       this.optionList = res;

+ 2 - 2
src/constants/enumerate.js

@@ -117,8 +117,8 @@ export const SYNC_PRINT_STATUS = {
 
 // 考试
 export const EXAM_TYPE = {
-  OFFLINE: "线下考试",
-  ONLINE: "线上考试",
+  FORMAL: "正式考试",
+  MAKEUP: "补考",
 };
 
 export const EXAM_MODE_TYPE = {

+ 2 - 1
src/modules/base/api.js

@@ -22,9 +22,10 @@ export const conditionListSemester = (datas) => {
   return $postParam("/api/admin/basic/condition/list_semester", datas);
 };
 // exam
-export const conditionListExam = ({ semesterId, enable }) => {
+export const conditionListExam = ({ semesterId, category, enable }) => {
   return $postParam("/api/admin/basic/condition/list_exam", {
     semesterId,
+    category,
     enable,
   });
 };

+ 14 - 5
src/modules/base/components/ModifyExam.vue

@@ -45,19 +45,21 @@
         </el-radio-group>
       </el-form-item>
       <el-form-item prop="category" label="考试类型:">
-        <el-radio-group v-model="modalForm.category">
+        <el-radio-group v-model="modalForm.category" @change="categoryChange">
           <el-radio v-for="(val, key) in EXAM_TYPE" :key="key" :label="key">{{
             val
           }}</el-radio>
         </el-radio-group>
         <div class="tips-info">
           <p>说明:</p>
-          <p>线下考试指纸笔传统考试,需要印刷试卷/题卡</p>
-          <p>线上考试指无纸化考试,如网考/机考</p>
+          <p>正式考试:需要提交试卷/答题卡,需要印刷试卷/题卡</p>
+          <p>
+            补考:不需要提交试卷,从期末考试选择未曝光卷型输入印刷份数生成印刷任务
+          </p>
         </div>
       </el-form-item>
       <el-form-item
-        v-if="modalForm.category === 'OFFLINE'"
+        v-if="modalForm.category === 'FORMAL'"
         prop="examModel"
         label=""
       >
@@ -90,7 +92,7 @@ const initModalForm = {
   id: null,
   name: "",
   semesterId: "",
-  category: "OFFLINE",
+  category: "FORMAL",
   examModel: "MODEL1",
   autoSyncStudent: false,
 };
@@ -175,6 +177,13 @@ export default {
     open() {
       this.modalIsShow = true;
     },
+    categoryChange() {
+      if (this.modalForm.category === "MAKEUP") {
+        this.modalForm.examModel === "MODEL2";
+      } else {
+        this.modalForm.examModel === "MODEL1";
+      }
+    },
     async submit() {
       const valid = await this.$refs.modalFormComp.validate().catch(() => {});
       if (!valid) return;

+ 2 - 5
src/modules/base/views/ExamManage.vue

@@ -96,10 +96,7 @@
               >编辑</el-button
             >
             <el-button
-              v-if="
-                checkPrivilege('link', 'Set') &&
-                scope.row.category === 'OFFLINE'
-              "
+              v-if="checkPrivilege('link', 'Set')"
               class="btn-primary"
               type="text"
               @click="toEditConfig(scope.row)"
@@ -209,7 +206,7 @@ export default {
       this.$refs.ModifyExam.open();
     },
     examModified({ isEdit, exam }) {
-      if (!isEdit && exam.category === "OFFLINE") {
+      if (!isEdit) {
         this.toEditConfig(exam);
       }
       this.getList();

+ 2 - 2
src/modules/exam/views/StatisticsManage.vue

@@ -24,10 +24,10 @@
             @change="facultyChange"
           ></college-select>
         </el-form-item>
-        <el-form-item label="开课学院:">
+        <el-form-item label="教研室:">
           <el-select
             v-model="filter.teachingRoomId"
-            placeholder="开课学院"
+            placeholder="教研室"
             filterable
             clearable
           >

+ 6 - 0
src/modules/print/api.js

@@ -30,6 +30,12 @@ export const finishPrintPlan = (id) => {
 export const printPlanTemplateList = (datas) => {
   return $postParam("/api/admin/exam/print/get_template", datas);
 };
+export const printPlanBkDetailListPage = (datas) => {
+  return $postParam("/api/admin/exam/print/list_makeup_task", datas);
+};
+export const printPlanBkDetailUpdate = (datas) => {
+  return $post("/api/admin/exam/print/save_makeup_task", datas);
+};
 // business-data-export
 export const businessDataListPage = (datas) => {
   return $postParam("/api/admin/exam/print/data_list", datas);

+ 5 - 2
src/modules/print/components/ModifyPrintPlan.vue

@@ -52,6 +52,7 @@
           <exam-select
             v-model="modalForm.examId"
             :semester-id="modalForm.semesterId"
+            :category="modalForm.category"
             class="width-full"
             @change="examChange"
           ></exam-select>
@@ -267,6 +268,7 @@ import {
   PRINT_BACKUP_TYPE,
   PAPER_BACKUP_TYPE,
   TEMPLATE_CLASSIFY,
+  EXAM_TYPE,
 } from "@/constants/enumerate";
 import { deepCopy } from "@/plugins/utils";
 import { updatePrintPlan, printPlanTemplateList } from "../api";
@@ -280,6 +282,7 @@ const initModalForm = {
   examEndTime: "",
   semesterId: "",
   examId: "",
+  category: "FORMAL",
   printContent: [],
   backupMethod: "ROOM",
   backupCount: 1,
@@ -337,7 +340,7 @@ export default {
         PREVIEW: "印刷计划详情",
         EDIT: "编辑印刷计划",
       };
-      return names[this.editType];
+      return `${names[this.editType]}-${EXAM_TYPE[this.modalForm.category]}`;
     },
     editable() {
       return this.editType !== "PREVIEW";
@@ -599,7 +602,7 @@ export default {
         this.checkSelectAll();
       } else {
         this.allSelected = false;
-        let modalForm = deepCopy(initModalForm);
+        let modalForm = this.$objAssign(deepCopy(initModalForm), val);
         modalForm.variableContent = modalForm.variableContent.filter(
           (item) => this.templateSources[item.type]
         );

+ 345 - 0
src/modules/print/components/PrintPlanBkDetail.vue

@@ -0,0 +1,345 @@
+<template>
+  <div>
+    <el-dialog
+      class="print-plan-detail page-dialog"
+      :visible.sync="modalIsShow"
+      :title="title"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      append-to-body
+      fullscreen
+      @open="visibleChange"
+    >
+      <div class="part-box part-box-filter part-box-flex">
+        <el-form
+          ref="FilterForm"
+          label-position="left"
+          label-width="85px"
+          inline
+        >
+          <el-form-item label="学期:">
+            <semester-select
+              v-model.trim="filter.semesterId"
+              placeholder="学期"
+              :clearable="false"
+            ></semester-select>
+          </el-form-item>
+          <el-form-item label="考试:">
+            <exam-select
+              v-model="filter.examId"
+              :semester-id="filter.semesterId"
+              category="FORMAL"
+              :clearable="false"
+            ></exam-select>
+          </el-form-item>
+          <el-form-item label="开课学院:">
+            <college-select
+              v-model.trim="filter.collegeId"
+              :semester-id="filter.semesterId"
+              placeholder="开课学院"
+              clearable
+              @change="facultyChange"
+            ></college-select>
+          </el-form-item>
+          <el-form-item label="课程(代码):" label-width="110px">
+            <course-select
+              v-model.trim="filter.courseCode"
+              :semester-id="filter.semesterId"
+              :exam-id="filter.examId"
+              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"
+              :exam-id="filter.examId"
+              :course-code="filter.courseCode"
+              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>
+          <el-form-item label-width="0px">
+            <el-button type="primary" @click="search">查询</el-button>
+          </el-form-item>
+        </el-form>
+        <div class="part-box-action">
+          <el-button type="primary" @click="toBatchEdit">批量提交</el-button>
+        </div>
+      </div>
+
+      <div class="part-box part-box-pad">
+        <el-table
+          ref="TableList"
+          :data="dataList"
+          @selection-change="handleSelectionChange"
+        >
+          <el-table-column
+            type="selection"
+            width="55"
+            align="center"
+            :selectable="rowSelectable"
+          ></el-table-column>
+          <el-table-column
+            type="index"
+            label="序号"
+            width="70"
+            :index="indexMethod"
+          ></el-table-column>
+          <!-- <el-table-column
+            prop="semesterName"
+            label="学期"
+            min-width="160"
+          ></el-table-column>
+          <el-table-column
+            prop="examName"
+            label="考试"
+            min-width="160"
+          ></el-table-column> -->
+          <el-table-column
+            prop="courseName"
+            label="课程(代码)"
+            min-width="200"
+          >
+            <span slot-scope="scope"
+              >{{ scope.row.courseName }}({{ scope.row.courseCode }})</span
+            >
+          </el-table-column>
+          <el-table-column
+            prop="paperNumber"
+            label="试卷编号"
+            min-width="160"
+          ></el-table-column>
+          <el-table-column prop="userName" label="命题老师" min-width="100">
+            <span slot-scope="scope"
+              >{{ scope.row.realName }}({{ scope.row.loginName }})</span
+            >
+          </el-table-column>
+          <el-table-column
+            prop="exposedPaperType"
+            label="已曝光类型"
+            width="100"
+          >
+            <span slot-scope="scope">{{
+              scope.row.exposedPaperType | defaultFieldFilter
+            }}</span>
+          </el-table-column>
+          <el-table-column
+            prop="unexposedPaperType"
+            label="未曝光类型"
+            width="100"
+          >
+            <span slot-scope="scope">{{
+              scope.row.unexposedPaperType | defaultFieldFilter
+            }}</span>
+          </el-table-column>
+          <el-table-column
+            class-name="action-column"
+            label="印刷份数"
+            width="120"
+            fixed="right"
+          >
+            <template slot-scope="scope">
+              <el-input-number
+                v-model="scope.row.totalSubjects"
+                class="width-80"
+                :min="1"
+                :max="99999"
+                :step="1"
+                step-strictly
+                :controls="false"
+                :disabled="scope.row.status === 'FINISH'"
+              ></el-input-number>
+            </template>
+          </el-table-column>
+          <el-table-column
+            class-name="action-column"
+            label="备份份数"
+            width="120"
+            fixed="right"
+          >
+            <template slot-scope="scope">
+              <el-input-number
+                v-model="scope.row.backupCount"
+                class="width-80"
+                :min="1"
+                :max="99999"
+                :step="1"
+                step-strictly
+                :controls="false"
+                :disabled="scope.row.status === 'FINISH'"
+              ></el-input-number>
+            </template>
+          </el-table-column>
+          <el-table-column
+            class-name="action-column"
+            label="操作"
+            width="80"
+            fixed="right"
+          >
+            <template slot-scope="scope">
+              <el-button
+                class="btn-primary"
+                type="text"
+                :disabled="scope.row.status === 'FINISH'"
+                @click="toEdit(scope.row)"
+                >提交</el-button
+              >
+            </template>
+          </el-table-column>
+        </el-table>
+        <div class="part-page">
+          <el-pagination
+            background
+            layout="total, sizes, prev, pager, next, jumper"
+            :pager-count="5"
+            :current-page="current"
+            :total="total"
+            :page-size="size"
+            @current-change="toPage"
+            @size-change="pageSizeChange"
+          >
+          </el-pagination>
+        </div>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { printPlanBkDetailListPage, printPlanBkDetailUpdate } from "../api";
+
+export default {
+  name: "print-plan-bk-detail",
+  props: {
+    plan: {
+      type: Object,
+      default() {
+        return {};
+      },
+    },
+  },
+  computed: {
+    title() {
+      return `印刷计划详情-${this.plan.name}`;
+    },
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      filter: {
+        semesterId: "",
+        examId: "",
+        printPlanId: "",
+        courseCode: "",
+        paperNumber: "",
+        userName: "",
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      dataList: [],
+      curRow: {},
+      totalInfo: {},
+      multipleSelection: [],
+    };
+  },
+  methods: {
+    visibleChange() {
+      this.filter = {
+        semesterId: "",
+        examId: "",
+        printPlanId: this.plan.id,
+        courseCode: "",
+        paperNumber: "",
+        userName: "",
+      };
+      this.size = this.GLOBAL.pageSize;
+      this.dataList = [];
+      this.totalInfo = {};
+      // this.search();
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    async getList() {
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size,
+      };
+      const data = await printPlanBkDetailListPage(datas);
+      this.dataList = data.records.map((item) => {
+        if (!item.totalSubjects) item.totalSubjects = undefined;
+        if (!item.backupCount) item.backupCount = 1;
+        return item;
+      });
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    search() {
+      this.toPage(1);
+    },
+    handleSelectionChange(val) {
+      this.multipleSelection = val;
+    },
+    rowSelectable(row) {
+      return row.status !== "FINISH";
+    },
+    facultyChange(val) {
+      console.log(val);
+    },
+    toEdit(row) {
+      if (row.status === "FINISH") return;
+      if (!row.totalSubjects) {
+        this.$message.error("请输入印刷份数");
+        return;
+      }
+      this.updateData([row]);
+    },
+    toBatchEdit() {
+      const datas = this.multipleSelection.filter(
+        (item) => item.totalSubjects && item.status !== "FINISH"
+      );
+      if (!datas.length) {
+        this.$message.error("当前没有需要提交的数据");
+        return;
+      }
+      this.updateData(this.multipleSelection);
+    },
+    async updateData(dataList) {
+      const datas = {
+        printPlanId: this.plan.id,
+        list: dataList.map((item) => {
+          return {
+            examId: item.examId,
+            courseCode: item.courseCode,
+            courseName: item.courseName,
+            paperNumber: item.paperNumber,
+            totalSubjects: item.totalSubjects,
+            backupCount: item.backupCount,
+          };
+        }),
+      };
+      const res = await printPlanBkDetailUpdate(datas).catch(() => {});
+      if (!res) return;
+      this.$message.success("提交成功!");
+    },
+  },
+};
+</script>

+ 41 - 6
src/modules/print/views/PrintPlanManage.vue

@@ -62,7 +62,7 @@
           v-if="checkPrivilege('button', 'add')"
           icon="el-icon-circle-plus-outline"
           type="primary"
-          @click="toAdd"
+          @click="modalIsShow = true"
         >
           新增
         </el-button>
@@ -194,19 +194,47 @@
       ref="PrintPlanDetail"
       :plan="curPrintPlan"
     ></print-plan-detail>
+    <!-- PrintPlanBkDetail -->
+    <print-plan-bk-detail
+      v-if="checkPrivilege('link', 'preview')"
+      ref="PrintPlanBkDetail"
+      :plan="curPrintPlan"
+    ></print-plan-bk-detail>
+    <!-- print-type-dialog -->
+    <el-dialog
+      :visible.sync="modalIsShow"
+      title="新建印刷计划"
+      top="10vh"
+      width="500px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      append-to-body
+    >
+      <div class="big-btns">
+        <el-button
+          v-for="(val, key) in EXAM_TYPE"
+          :key="key"
+          type="primary"
+          @click="toAdd(key)"
+          >{{ val }}</el-button
+        >
+      </div>
+      <div slot="footer"></div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
 import { printPlanListPage, removePrintPlan, finishPrintPlan } from "../api";
-import { PRINT_PLAN_STATUS } from "@/constants/enumerate";
+import { PRINT_PLAN_STATUS, EXAM_TYPE } from "@/constants/enumerate";
 import pickerOptions from "@/constants/datePickerOptions";
 import ModifyPrintPlan from "../components/ModifyPrintPlan";
 import PrintPlanDetail from "../components/PrintPlanDetail.vue";
+import PrintPlanBkDetail from "../components/PrintPlanBkDetail.vue";
 
 export default {
   name: "print-plan-manage",
-  components: { ModifyPrintPlan, PrintPlanDetail },
+  components: { ModifyPrintPlan, PrintPlanDetail, PrintPlanBkDetail },
   data() {
     return {
       filter: {
@@ -225,6 +253,8 @@ export default {
       editType: "ADD",
       PRINT_PLAN_STATUS,
       curUserId: this.$ls.get("user", { id: "" }).id,
+      modalIsShow: false,
+      EXAM_TYPE,
       // date-picker
       createTime: [],
       pickerOptions,
@@ -257,8 +287,9 @@ export default {
     search() {
       this.toPage(1);
     },
-    toAdd() {
-      this.curPrintPlan = {};
+    toAdd(category) {
+      this.modalIsShow = false;
+      this.curPrintPlan = { category };
       this.editType = "ADD";
       this.$refs.ModifyPrintPlan.open();
     },
@@ -269,7 +300,11 @@ export default {
     },
     toPreview(row) {
       this.curPrintPlan = row;
-      this.$refs.PrintPlanDetail.open();
+      if (row.category === "FORMAL") {
+        this.$refs.PrintPlanDetail.open();
+      } else {
+        this.$refs.PrintPlanBkDetail.open();
+      }
     },
     toDelete(row) {
       this.$confirm(`确定要删除印刷计划【${row.name}】吗?`, "提示", {