zhangjie 4 سال پیش
والد
کامیت
984bde6245
30فایلهای تغییر یافته به همراه819 افزوده شده و 80 حذف شده
  1. 1 1
      package.json
  2. 17 3
      src/assets/styles/element-ui-costom.scss
  3. 19 1
      src/assets/styles/pages.scss
  4. 22 4
      src/constants/enumerate.js
  5. 8 0
      src/constants/navs.js
  6. 2 2
      src/modules/analyze/views/ScoreAnalyze.vue
  7. 1 1
      src/modules/base/components/ModifyCourse.vue
  8. 1 1
      src/modules/base/components/ResetPwd.vue
  9. 2 2
      src/modules/base/views/CourseManage.vue
  10. 4 4
      src/modules/card/components/PagePropEdit.vue
  11. 1 1
      src/modules/card/components/PaperParams.vue
  12. 2 2
      src/modules/card/components/RightClickMenu.vue
  13. 1 1
      src/modules/card/components/TopicElementEdit.vue
  14. 20 15
      src/modules/card/components/common/ElementResize.vue
  15. 0 1
      src/modules/card/components/elementEdit/ExplainChildrenElement.vue
  16. 17 3
      src/modules/card/views/CardDesign.vue
  17. 17 0
      src/modules/exam-center/api.js
  18. 24 0
      src/modules/exam-center/router.js
  19. 65 7
      src/modules/exam-center/views/CardManage.vue
  20. 2 3
      src/modules/exam-center/views/DoneTaskDetail.vue
  21. 43 3
      src/modules/exam-center/views/ExamManage.vue
  22. 100 9
      src/modules/exam-center/views/ExamModify.vue
  23. 175 0
      src/modules/exam-center/views/ExamTaskAudit.vue
  24. 152 0
      src/modules/exam-center/views/ExamTaskAuditEdit.vue
  25. 50 0
      src/modules/exam-center/views/ExamTaskDetail.vue
  26. 65 10
      src/modules/exam-center/views/WaitTaskDetail.vue
  27. 2 2
      src/modules/example/views/DataManage.vue
  28. 2 2
      src/modules/score-paper/views/ClassPaper.vue
  29. 2 0
      src/plugins/axios.js
  30. 2 2
      src/views/Home.vue

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "teachcloud-platform-web",
-  "version": "0.1.0",
+  "version": "0.2.0",
   "scripts": {
     "start": "npm run serve",
     "serve": "vue-cli-service serve",

+ 17 - 3
src/assets/styles/element-ui-costom.scss

@@ -50,8 +50,7 @@
 }
 .el-dialog__footer {
   background-color: #f6f6f6;
-  padding-left: 100px;
-  text-align: left;
+  text-align: center;
   .el-button {
     width: 100px;
     border-radius: 10px;
@@ -222,6 +221,10 @@
   &.btn-table-icon {
     padding: 0;
     min-width: 10px;
+    > i {
+      width: 20px;
+      height: 20px;
+    }
 
     &:hover {
       transform: scale(1.2);
@@ -409,11 +412,22 @@
     }
   }
   &__btns {
-    text-align: center;
+    position: relative;
+    height: 75px;
     padding: 20px;
 
     > .el-button {
       width: 85px;
+      position: absolute;
+      left: 50%;
+      top: 20px;
+
+      &:first-child {
+        margin-left: 5px;
+      }
+      &:last-child {
+        margin-left: -90px;
+      }
     }
   }
 }

+ 19 - 1
src/assets/styles/pages.scss

@@ -14,7 +14,7 @@
     h2 {
       float: left;
 
-      span:first-child {
+      span:not(:last-child) {
         margin-right: 50px;
       }
     }
@@ -26,6 +26,23 @@
       color: $--color-text-primary !important;
     }
   }
+  .task-audit {
+    margin-bottom: 20px;
+
+    &-history {
+      color: $--color-text-regular;
+      margin-left: 5px;
+      cursor: pointer;
+      > i {
+        margin-top: -3px;
+        margin-left: -6px;
+      }
+
+      &:hover {
+        color: $--color-text-primary;
+      }
+    }
+  }
   .task-body {
     padding: 25px;
     position: relative;
@@ -74,6 +91,7 @@
       margin-right: 10px;
     }
   }
+
   .task-action {
     text-align: right;
     .el-button--default {

+ 22 - 4
src/constants/enumerate.js

@@ -9,11 +9,19 @@ export const GENDER_TYPE = {
   MALE: "男",
   FEMALE: "女"
 };
+// 是 / 否
+export const BOOLEAN_TYPE = {
+  0: "否",
+  1: "是"
+};
+
 // 打印状态
 export const PRINT_STATUS = {
-  0: "未打印",
-  1: "打印中",
-  2: "已打印",
+  0: "未开始",
+  1: "命题中",
+  2: "待打印",
+  3: "打印中",
+  4: "已打印",
   9: "无"
 };
 // 撤回状态
@@ -77,6 +85,15 @@ export const PAPER_TYPE = {
   1: "填涂"
 };
 
+export const PRINT_CONTENT_TYPE = {
+  examPaper: "试卷",
+  answerSheet: "答题卡",
+  signIn: "签到表",
+  paperSticker: "卷袋贴"
+};
+
+export const PAPER_TYPE_FIELDS = ["A", "B"];
+
 export const MENU_ROUTER_DICT = {
   basic: "base",
   userManager: "UserManage",
@@ -88,5 +105,6 @@ export const MENU_ROUTER_DICT = {
   cardManager: "CardManage",
   printManager: "PrintManage",
   cardAuditingManager: "CardAudit",
-  courseManager: "CourseManage"
+  courseManager: "CourseManage",
+  examTaskAudit: "ExamTaskAudit"
 };

+ 8 - 0
src/constants/navs.js

@@ -31,6 +31,10 @@ const navs = [
             title: "考场详情",
             router: "ExamRomeDetail"
           },
+          {
+            title: "考场任务详情",
+            router: "ExamTaskDetail"
+          },
           {
             title: "考生详情",
             router: "ExamRomeStudentDetail"
@@ -66,6 +70,10 @@ const navs = [
       {
         title: "题卡审核",
         router: "CardAudit"
+      },
+      {
+        title: "考试任务审核",
+        router: "ExamTaskAudit"
       }
     ]
   },

+ 2 - 2
src/modules/analyze/views/ScoreAnalyze.vue

@@ -169,8 +169,8 @@ export default {
     },
     toDelete(row) {
       this.$confirm("确定要删除当前学校吗?", "删除警告", {
-        cancelButtonClass: "el-button--primary",
-        confirmButtonClass: "el-button--default-act",
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
         type: "warning"
       })
         .then(async () => {

+ 1 - 1
src/modules/base/components/ModifyCourse.vue

@@ -33,10 +33,10 @@
       </el-form-item>
     </el-form>
     <div slot="footer">
-      <el-button type="danger" @click="cancel" plain>取消</el-button>
       <el-button type="primary" :disabled="isSubmit" @click="submit"
         >确认</el-button
       >
+      <el-button type="danger" @click="cancel" plain>取消</el-button>
     </div>
   </el-dialog>
 </template>

+ 1 - 1
src/modules/base/components/ResetPwd.vue

@@ -45,10 +45,10 @@
       </el-form-item>
     </el-form>
     <div slot="footer">
-      <el-button @click="cancel">取消</el-button>
       <el-button type="primary" :disabled="isSubmit" @click="submit"
         >确认</el-button
       >
+      <el-button @click="cancel">取消</el-button>
     </div>
   </el-dialog>
 </template>

+ 2 - 2
src/modules/base/views/CourseManage.vue

@@ -120,8 +120,8 @@ export default {
     },
     toDelete(row) {
       this.$confirm("确定要删除当前科目吗?", "提示", {
-        cancelButtonClass: "el-button--primary",
-        confirmButtonClass: "el-button--default-act",
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
         type: "warning"
       }).then(async () => {
         await deleteCourse(row.id);

+ 4 - 4
src/modules/card/components/PagePropEdit.vue

@@ -134,8 +134,8 @@ export default {
         "此操作会导致当前题卡编辑的所有元素清空, 是否继续?",
         "提示",
         {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
+          cancelButtonClass: "el-button--danger is-plain",
+          confirmButtonClass: "el-button--primary",
           type: "warning"
         }
       )
@@ -166,8 +166,8 @@ export default {
     },
     modifyPageSize(pageSize) {
       this.$confirm("此操作将会重置当前页面所有元素信息, 是否继续?", "提示", {
-        cancelButtonClass: "el-button--primary",
-        confirmButtonClass: "el-button--default-act",
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
         type: "warning"
       })
         .then(() => {

+ 1 - 1
src/modules/card/components/PaperParams.vue

@@ -112,8 +112,8 @@
       </div>
     </div>
     <div slot="footer" style="text-align: right;">
-      <el-button type="danger" @click="cancel" plain>取消</el-button>
       <el-button type="primary" @click="submit">确认</el-button>
+      <el-button type="danger" @click="cancel" plain>取消</el-button>
     </div>
   </el-dialog>
 </template>

+ 2 - 2
src/modules/card/components/RightClickMenu.vue

@@ -102,8 +102,8 @@ export default {
     toDelete() {
       this.visible = false;
       this.$confirm("确定要删除当前元素吗?", "提示", {
-        cancelButtonClass: "el-button--primary",
-        confirmButtonClass: "el-button--default-act",
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
         type: "warning"
       })
         .then(() => {

+ 1 - 1
src/modules/card/components/TopicElementEdit.vue

@@ -15,7 +15,7 @@
       :active="['b']"
       :move="false"
       :min-height="20"
-      fit-parent
+      :fit-parent="['w']"
       @on-click="activeCurElement"
       @resize-over="resizeOver"
       v-else

+ 20 - 15
src/modules/card/components/common/ElementResize.vue

@@ -77,8 +77,10 @@ export default {
       }
     },
     fitParent: {
-      type: Boolean,
-      default: false
+      type: Array,
+      default() {
+        return ["w", "h"];
+      }
     }
   },
   data() {
@@ -124,6 +126,12 @@ export default {
           "element-resize-init": this.initOver
         }
       ];
+    },
+    fitParentTypeWidth() {
+      return this.fitParent.includes("w");
+    },
+    fitParentTypeHeight() {
+      return this.fitParent.includes("h");
     }
   },
   created() {
@@ -162,7 +170,6 @@ export default {
       this.initOver = true;
     },
     checkValidSizePos(sizePos) {
-      // TODO:设置校验模式,w or h,改变高度只校验高度,改变宽高校验所有
       if (
         sizePos.w < this.minWidth ||
         (this.maxWidth !== 0 && sizePos.w > this.maxWidth)
@@ -183,20 +190,18 @@ export default {
         h: this.$el.offsetParent.offsetHeight
       };
 
-      if (this.fitParent) {
-        if (sizePos.x < 0 || elOffsetTop < 0) return false;
+      if (!this.fitParent.length) return true;
 
-        if (this.positionType === "relative") {
-          return elOffsetTop + sizePos.h <= this.parentNodeSize.h;
-        } else {
-          return (
-            sizePos.x + sizePos.w <= this.parentNodeSize.w &&
-            elOffsetTop + sizePos.h <= this.parentNodeSize.h
-          );
-        }
-      }
+      if (sizePos.x < 0 || elOffsetTop < 0) return false;
+
+      const wValid =
+        !this.fitParentTypeWidth ||
+        sizePos.x + sizePos.w <= this.parentNodeSize.w;
+      const hValid =
+        !this.fitParentTypeHeight ||
+        elOffsetTop + sizePos.h <= this.parentNodeSize.h;
 
-      return true;
+      return wValid && hValid;
     },
     getLeftSize(left) {
       return {

+ 0 - 1
src/modules/card/components/elementEdit/ExplainChildrenElement.vue

@@ -4,7 +4,6 @@
       v-model="elemData"
       :class="{ 'element-resize-act': curElement.id === data.id }"
       :active="active"
-      fit-parent
       @change="elementChange"
       @on-click="activeCurElement"
     >

+ 17 - 3
src/modules/card/views/CardDesign.vue

@@ -2,7 +2,7 @@
   <div class="card-design">
     <div class="design-top">
       <div class="design-top-logo">
-        <h1><i class="icon icon-back" @click="goback"></i>答题卡制作</h1>
+        <h1><i class="icon icon-back" @click="toExit"></i>答题卡制作</h1>
       </div>
       <div class="design-top-info">
         <div class="info-help"><i class="icon icon-help"></i>帮助</div>
@@ -574,8 +574,8 @@ export default {
         return false;
       }
       this.$confirm("确定要提交当前题卡吗?", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
         type: "warning"
       })
         .then(() => {
@@ -604,6 +604,20 @@ export default {
           this.$message.error("提交失败,请重新尝试!");
         }
       };
+    },
+    toExit() {
+      this.$confirm("是否要保存当前题卡?", "提示", {
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
+        type: "warning"
+      })
+        .then(async () => {
+          await this.toSave();
+          this.goback();
+        })
+        .catch(() => {
+          this.goback();
+        });
     }
   },
   beforeDestroy() {

+ 17 - 0
src/modules/exam-center/api.js

@@ -49,6 +49,9 @@ export const uploadExam = datas => {
     return $post("/api/print/exam/exam/add", datas);
   }
 };
+export const examTaskDetail = examId => {
+  return $get("/api/print/exam/exam/detailProgress", { examId });
+};
 export const examRoomDetail = datas => {
   return $get("/api/print/exam/exam/listExamDetailPage", datas);
 };
@@ -92,6 +95,9 @@ export const courseByUser = () => {
 export const changeCardStatus = ({ cardId, cardStatus }) => {
   return $post("/api/print/card/card/changeCardStatus", { cardId, cardStatus });
 };
+export const updateCardDetail = datas => {
+  return $post("/api/print/card/card/updateCardDetail", datas);
+};
 
 // print-manage
 export const printTaskListPage = datas => {
@@ -109,6 +115,17 @@ export const schoolList = () => {
   return $get("/api/print/card/card/listSchools", {});
 };
 
+// exam-task-audit
+export const examTaskListPage = datas => {
+  return $get("/api/print/exam/taskAudit/listByConditions", datas);
+};
+export const auditExamTask = datas => {
+  return $post("/api/print/exam/taskAudit/audit", datas);
+};
+export const examTaskAudtiHistory = taskId => {
+  return $get("/api/print/exam/taskAudit/listHis", { taskId });
+};
+
 // custom upload-file
 export const customUpload = options => {
   let formData = new FormData();

+ 24 - 0
src/modules/exam-center/router.js

@@ -6,9 +6,12 @@ import DoneTask from "./views/DoneTask.vue";
 import DoneTaskDetail from "./views/DoneTaskDetail.vue";
 import ExamManage from "./views/ExamManage.vue";
 import ExamModify from "./views/ExamModify.vue";
+import ExamTaskDetail from "./views/ExamTaskDetail.vue";
 import ExamRomeDetail from "./views/ExamRomeDetail.vue";
 import ExamRomeStudentDetail from "./views/ExamRomeStudentDetail.vue";
 import CardManage from "./views/CardManage.vue";
+import ExamTaskAudit from "./views/ExamTaskAudit.vue";
+import ExamTaskAuditEdit from "./views/ExamTaskAuditEdit.vue";
 
 export default [
   {
@@ -50,6 +53,14 @@ export default [
       relate: "ExamManage/ExamEdit"
     }
   },
+  {
+    path: "/exam-center/exam-task-detail/:examId?",
+    name: "ExamTaskDetail",
+    component: ExamTaskDetail,
+    meta: {
+      relate: "ExamManage/ExamTaskDetail"
+    }
+  },
   {
     path: "/exam-center/exam-room-detail/:examId?",
     name: "ExamRomeDetail",
@@ -88,5 +99,18 @@ export default [
     meta: {
       relate: "WaitTask/WaitTaskDetail"
     }
+  },
+  {
+    path: "/exam-center/exam-task-audit",
+    name: "ExamTaskAudit",
+    component: ExamTaskAudit
+  },
+  {
+    path: "/exam-center/exam-task-audit-edit/:taskId",
+    name: "ExamTaskAuditEdit",
+    component: ExamTaskAuditEdit,
+    meta: {
+      relate: "ExamTaskAudit/ExamTaskAuditEdit"
+    }
   }
 ];

+ 65 - 7
src/modules/exam-center/views/CardManage.vue

@@ -139,8 +139,11 @@ import {
   copyCard,
   deleteCard,
   changeCardStatus,
-  changeOperateStatus
+  changeOperateStatus,
+  updateCardDetail
 } from "../api";
+import { cardConfigInfos, cardTempDetail } from "@/modules/card/api";
+import { transformField } from "@/modules/card/enumerate";
 import CardOptionDialog from "../components/CardOptionDialog";
 
 export default {
@@ -208,17 +211,72 @@ export default {
       // 暂时不做了
     },
     async toCopy(row) {
-      await copyCard(row.id);
-      this.$message.success("复制成功!");
+      // 复制题卡
+      const cardInfo = await copyCard(row.id);
+      // 判断规则是否更新:获取最新规则,比对题卡规则判断规则是否更新
+      const tempData = await cardTempDetail(cardInfo.cardId);
+      const cont = JSON.parse(tempData.content);
+      const info = await cardConfigInfos();
+      const sysCardConfig = transformField(info);
+      const cardConfigIsChange = this.compareCardConfig(
+        sysCardConfig,
+        cont.cardConfig
+      );
+
+      if (cardConfigIsChange) {
+        // 更新题卡数据结构,主要是卡头数据
+        const newCardConfig = Object.assign({}, cont.cardConfig, sysCardConfig);
+        cont.pages.forEach((page, pindex) => {
+          // 奇数页
+          if (!(pindex % 2)) {
+            page.columns[0].elements[0] = Object.assign(
+              page.columns[0].elements[0],
+              newCardConfig
+            );
+          }
+        });
+        // 保存题卡数据结构
+        cont.cardConfig = newCardConfig;
+        const datas = {
+          id: cardInfo.cardDetailId,
+          content: JSON.stringify(cont)
+        };
+        await updateCardDetail(datas);
+        this.$message({
+          type: "warning",
+          message: "复制成功!当前系统题卡规则有修改,请重新编辑新复制的题卡!",
+          duration: 4000
+        });
+      } else {
+        this.$message.success("复制成功!");
+      }
+
       this.getList();
     },
+    compareCardConfig(sysConfig, curConfig) {
+      let isChange = false;
+      Object.keys(sysConfig).forEach(key => {
+        let isSame = true;
+        if (key === "schoolName") {
+          isSame = true;
+        } else if (key === "businessParams" || key === "noticeHead") {
+          isSame =
+            JSON.stringify(sysConfig[key]) === JSON.stringify(curConfig[key]);
+        } else {
+          isSame = sysConfig[key] === curConfig[key];
+        }
+        console.log(`${key}:${isSame}`);
+        isChange = isChange || !isSame;
+      });
+      return isChange;
+    },
     toPrint(row) {
       this.$confirm(
         "一旦准备印刷,题卡将不可再编辑,确定要提交印刷吗?",
         "警告",
         {
-          cancelButtonClass: "el-button--primary",
-          confirmButtonClass: "el-button--default-act",
+          cancelButtonClass: "el-button--danger is-plain",
+          confirmButtonClass: "el-button--primary",
           type: "warning"
         }
       )
@@ -234,8 +292,8 @@ export default {
     },
     toDelete(row) {
       this.$confirm("确定要删除当前题卡吗?", "删除警告", {
-        cancelButtonClass: "el-button--primary",
-        confirmButtonClass: "el-button--default-act",
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
         type: "warning"
       })
         .then(async () => {

+ 2 - 3
src/modules/exam-center/views/DoneTaskDetail.vue

@@ -71,7 +71,6 @@ export default {
   data() {
     return {
       taskId: this.$route.params.taskId,
-      PAPER_TYPE_FIELDS: ["A", "B"],
       task: {},
       pTypeEnable: false,
       paperAttachments: [],
@@ -101,8 +100,8 @@ export default {
     },
     toRevoke() {
       this.$confirm("确定要撤回当前任务吗?", "提示", {
-        cancelButtonClass: "el-button--primary",
-        confirmButtonClass: "el-button--default-act",
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
         type: "warning"
       }).then(async () => {
         await revokeDoneTask(this.task);

+ 43 - 3
src/modules/exam-center/views/ExamManage.vue

@@ -31,6 +31,19 @@
               :label="val"
             ></el-option>
           </el-select>
+          <el-popover
+            class="tips-icon"
+            placement="bottom-start"
+            width="350"
+            trigger="hover"
+          >
+            <p>未开始:所有命题任务都未有暂存动作和提交动作。</p>
+            <p>命题中:有部分命题任务已提交或已暂存。</p>
+            <p>待打印:所有命题任务均已提交,等待打印员打印。</p>
+            <p>打印中:正在打印中。</p>
+            <p>已打印:打印完成。</p>
+            <i class="el-icon-question" slot="reference"></i>
+          </el-popover>
         </el-form-item>
         <el-form-item label="打印时间:">
           <el-date-picker
@@ -69,8 +82,15 @@
         <el-table-column prop="createTime" label="创建时间"></el-table-column>
         <el-table-column prop="printStatus" label="打印状态"></el-table-column>
         <el-table-column prop="endTime" label="完成时间"></el-table-column>
-        <el-table-column label="操作" align="center" width="120">
+        <el-table-column label="操作" align="center" width="185">
           <template slot-scope="scope">
+            <el-button
+              class="btn-table-icon"
+              type="text"
+              icon="icon icon-modify"
+              @click="toTaskDetail(scope.row)"
+              title="任务详情"
+            ></el-button>
             <el-button
               class="btn-table-icon"
               type="text"
@@ -85,6 +105,14 @@
               @click="toDelete(scope.row)"
               title="删除"
             ></el-button>
+            <!-- TODO:打印状态为已打印时可见 -->
+            <el-button
+              class="btn-table-icon"
+              type="text"
+              icon="icon icon-download-act"
+              @click="toExport(scope.row)"
+              title="导出打印数量"
+            ></el-button>
             <el-button
               class="btn-table-icon"
               type="text"
@@ -171,8 +199,8 @@ export default {
         ? "当前已有命题老师上传试卷或答题卡,确定要删除此条考试任务吗?"
         : "确定要删除此条考试任务吗?";
       this.$confirm(msg, "提示", {
-        cancelButtonClass: "el-button--primary",
-        confirmButtonClass: "el-button--default-act",
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
         type: "warning"
       }).then(async () => {
         await deleteExam(row.id);
@@ -193,6 +221,18 @@ export default {
         }
       });
     },
+    toTaskDetail(row) {
+      console.log(row);
+      this.$router.push({
+        name: "ExamTaskDetail",
+        params: {
+          examId: row.id
+        }
+      });
+    },
+    toExport(row) {
+      console.log(row);
+    },
     toDetail(row) {
       this.$router.push({
         name: "ExamRomeDetail",

+ 100 - 9
src/modules/exam-center/views/ExamModify.vue

@@ -33,7 +33,10 @@
         </el-button>
       </el-form-item>
       <el-form-item label="考试开始时间:">
-        <p class="form-item-content">{{ modalForm.beginTime }}</p>
+        <p class="form-item-content" v-if="modalForm.beginTime">
+          {{ modalForm.beginTime }}
+        </p>
+        <p class="color-info" v-else>请上传考务文件</p>
       </el-form-item>
       <el-form-item prop="printTime" label="打印时间:">
         <el-date-picker
@@ -44,12 +47,44 @@
         >
         </el-date-picker>
       </el-form-item>
+      <el-form-item prop="printContent" label="打印内容:">
+        <el-checkbox
+          v-model="printContentCheckAll"
+          @change="handleCheckAllChange"
+          >全选</el-checkbox
+        >
+        <el-checkbox-group
+          v-model="modalForm.printContent"
+          @change="handleCheckedChange"
+        >
+          <el-checkbox
+            v-for="(val, key) in PRINT_CONTENT_TYPE"
+            :label="key"
+            :key="key"
+            >{{ val }}</el-checkbox
+          >
+        </el-checkbox-group>
+      </el-form-item>
+      <el-form-item
+        prop="review"
+        label="试卷内容是否复核:"
+        v-if="printContentIncludeExamPaper"
+      >
+        <el-radio-group v-model="modalForm.review">
+          <el-radio
+            v-for="(val, key) in BOOLEAN_TYPE"
+            :key="key"
+            :label="key * 1"
+            >{{ val }}</el-radio
+          >
+        </el-radio-group>
+      </el-form-item>
       <el-form-item prop="backup" label="备用方式:">
         <el-radio-group v-model="modalForm.backup">
           <el-radio
             v-for="(val, key) in RESERVE_TYPE"
             :key="key"
-            :label="key"
+            :label="key * 1"
             >{{ val }}</el-radio
           >
         </el-radio-group>
@@ -131,7 +166,11 @@
 </template>
 
 <script>
-import { RESERVE_TYPE } from "@/constants/enumerate";
+import {
+  RESERVE_TYPE,
+  BOOLEAN_TYPE,
+  PRINT_CONTENT_TYPE
+} from "@/constants/enumerate";
 import { uploadExam, examDetail } from "../api";
 import BusinessData from "../components/BusinessData";
 import UploadFileView from "../components/UploadFileView";
@@ -154,6 +193,18 @@ export default {
         callback();
       }
     };
+    const printContentValidator = (rule, value, callback) => {
+      if (!value.length) {
+        callback(new Error("请选择打印内容"));
+      } else if (
+        !value.includes("examPaper") &&
+        !value.includes("answerSheet")
+      ) {
+        callback(new Error("试卷和答题卡必须选择一个"));
+      } else {
+        callback();
+      }
+    };
 
     return {
       examId: this.$route.params.examId,
@@ -161,7 +212,9 @@ export default {
         examName: "",
         beginTime: "",
         printTime: "",
-        backup: "0",
+        printContent: [],
+        backup: 0,
+        review: 0,
         backupCard: "",
         examCodeTemp: "",
         attachmentId: ""
@@ -195,6 +248,13 @@ export default {
             trigger: "change"
           }
         ],
+        review: [
+          {
+            required: true,
+            message: "请选择是否复核",
+            trigger: "change"
+          }
+        ],
         backupCard: [
           {
             required: true,
@@ -202,6 +262,12 @@ export default {
             trigger: "change"
           }
         ],
+        printContent: [
+          {
+            required: true,
+            validator: printContentValidator
+          }
+        ],
         teacher: [
           {
             required: true,
@@ -210,6 +276,10 @@ export default {
         ]
       },
       RESERVE_TYPE,
+      BOOLEAN_TYPE,
+      PRINT_CONTENT_TYPE,
+      printContentAll: Object.keys(PRINT_CONTENT_TYPE),
+      printContentCheckAll: false,
       courses: [],
       isSubmit: false,
       downloadUrl: this.GLOBAL.domain + "/temps/考务导入模版.xlsx",
@@ -223,6 +293,9 @@ export default {
   computed: {
     isEdit() {
       return !!this.examId;
+    },
+    printContentIncludeExamPaper() {
+      return this.modalForm.printContent.includes("examPaper");
     }
   },
   mounted() {
@@ -235,8 +308,11 @@ export default {
     async getExamDetail() {
       const data = await examDetail(this.examId);
       this.modalForm = Object.assign({}, this.modalForm, data.tcPExam);
-      this.modalForm.backup += "";
+      this.modalForm.printContent = this.printContentAll.filter(
+        key => data.tcPExam[key]
+      );
       this.courses = data.userCourses;
+      this.handleCheckedChange();
       this.$refs.UploadFileView.setAttachmentName(
         `${data.tcPAttachment.name}${data.tcPAttachment.type}`
       );
@@ -253,14 +329,29 @@ export default {
     checkTeacherSelected() {
       return !this.courses.some(course => !course.teacherId);
     },
+    handleCheckAllChange(val) {
+      this.modalForm.printContent = val ? this.printContentAll : [];
+    },
+    handleCheckedChange() {
+      this.printContentCheckAll =
+        this.modalForm.printContent.length === this.printContentAll.length;
+    },
     async save() {
-      const valid = await this.$refs["ModalForm"].validate().catch(() => {});
-      if (!valid) return;
+      // const valid = await this.$refs["ModalForm"].validate().catch(() => {});
+      // if (!valid) return;
 
       if (this.isSubmit) return;
       this.isSubmit = true;
+      let tcPExam = {
+        ...this.modalForm
+      };
+      delete tcPExam.printContent;
+      this.printContentAll.map(key => {
+        tcPExam[key] = this.modalForm.printContent.includes(key) ? 1 : 0;
+      });
+
       const datas = {
-        tcPExam: this.modalForm,
+        tcPExam,
         tcPExamCourseUsers: this.courses.map(course => {
           return {
             courseName: course.courseName,
@@ -296,7 +387,7 @@ export default {
       this.$refs["ModalForm"].validateField("examCodeTemp");
 
       this.courses = data.userCourses.map(item => {
-        item.teacherId = "";
+        item.teacherId = item.users.length === 1 ? item.users[0].id + "" : "";
         return item;
       });
     }

+ 175 - 0
src/modules/exam-center/views/ExamTaskAudit.vue

@@ -0,0 +1,175 @@
+<template>
+  <div class="exam-task-audit">
+    <div class="part-box part-box-filter">
+      <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
+        <el-form-item label="考试名称:">
+          <el-select
+            v-model="filter.examId"
+            style="width: 193px;"
+            placeholder="请选择"
+            clearable
+          >
+            <el-option
+              v-for="item in exams"
+              :key="item.id"
+              :value="item.id"
+              :label="item.name"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="状态:">
+          <el-select
+            v-model="filter.auditingStatus"
+            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-width="0px">
+          <el-button type="primary" icon="icon icon-search" @click="toPage(1)"
+            >查询</el-button
+          >
+        </el-form-item>
+      </el-form>
+    </div>
+
+    <div class="part-box">
+      <el-table
+        ref="TableList"
+        :data="dataList"
+        :row-class-name="tableRowClassName"
+        border
+        stripe
+      >
+        <el-table-column prop="examCode" label="考试ID"></el-table-column>
+        <el-table-column prop="examName" label="考试名称"></el-table-column>
+        <el-table-column label="科目名称(编码)">
+          <template slot-scope="scope">
+            <span
+              >{{ scope.row.courseName
+              }}<i v-if="scope.row.courseCode"
+                >({{ scope.row.courseCode }})</i
+              ></span
+            >
+          </template>
+        </el-table-column>
+        <el-table-column prop="title" label="试卷"></el-table-column>
+        <el-table-column prop="printTime" label="答题卡"></el-table-column>
+        <el-table-column prop="overTime" label="任务截止日期"></el-table-column>
+        <el-table-column prop="overTime" label="剩余时间"></el-table-column>
+        <el-table-column
+          prop="auditingStatusName"
+          label="审核状态"
+        ></el-table-column>
+        <el-table-column label="操作" align="center" width="120">
+          <template slot-scope="scope">
+            <el-button
+              class="btn-table-icon"
+              type="text"
+              icon="icon icon-edit"
+              @click="toDetail(scope.row)"
+              title="审核"
+            ></el-button>
+            <el-button
+              class="btn-table-icon"
+              type="text"
+              icon="icon icon-circle-right"
+              @click="toDetail(scope.row)"
+              title="详情"
+            ></el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="part-page">
+        <el-pagination
+          background
+          layout="prev, pager, next"
+          :current-page="current"
+          :total="total"
+          :page-size="size"
+          @current-change="toPage"
+        >
+        </el-pagination>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { AUDITING_STATUS } from "@/constants/enumerate";
+import { examTaskListPage, examList } from "../api";
+
+export default {
+  name: "exam-task-audit",
+  data() {
+    return {
+      filter: {
+        auditingStatus: "",
+        examId: ""
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      AUDITING_STATUS,
+      exams: [],
+      dataList: [
+        {
+          id: "111",
+          taskId: "1"
+        }
+      ]
+    };
+  },
+  mounted() {
+    // this.init();
+  },
+  methods: {
+    init() {
+      this.getList();
+      this.getExamList();
+    },
+    async getList() {
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      const data = await examTaskListPage(datas);
+      this.dataList = data.records;
+      this.total = data.total;
+      // cardStatus '处理节点,0:设计题卡,1:提交印刷,2:已完成
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    tableRowClassName({ row }) {
+      return row.warning ? "row-danger" : "";
+    },
+    async getExamList() {
+      const data = await examList();
+      this.exams = data.map(item => {
+        return {
+          id: item.id,
+          name: item.examName
+        };
+      });
+    },
+    toDetail(row) {
+      this.$router.push({
+        name: "ExamTaskAuditEdit",
+        params: {
+          taskId: row.taskId
+        }
+      });
+    }
+  }
+};
+</script>

+ 152 - 0
src/modules/exam-center/views/ExamTaskAuditEdit.vue

@@ -0,0 +1,152 @@
+<template>
+  <div class="exam-task-audit-edit task-detail">
+    <div class="task-title">
+      <h2>
+        <span>考试名称: {{ task.examName }} </span>
+        <span>科目名称:{{ task.courseName }}</span>
+      </h2>
+    </div>
+    <div class="task-body">
+      <table class="table">
+        <tr>
+          <th>试卷类型</th>
+          <th>试卷文件</th>
+          <th>答题卡</th>
+        </tr>
+        <tr v-for="(attachment, index) in paperAttachments" :key="index">
+          <td>{{ attachment.name }}卷</td>
+          <td class="td-link">
+            <span @click="downloadPaper(attachment)" title="点击下载试卷">
+              <i class="icon icon-download-act"></i>{{ attachment.filename }}
+            </span>
+          </td>
+          <td
+            class="td-link"
+            :rowspan="pTypeEnable ? paperAttachments.length : 1"
+            v-if="index === 0"
+          >
+            <span @click="toPreviewCard" title="点击预览答题卡内容">{{
+              task.cardName
+            }}</span>
+          </td>
+        </tr>
+      </table>
+
+      <!-- task-form -->
+      <el-form
+        ref="ModalForm"
+        :model="modalForm"
+        :rules="rules"
+        label-width="180px"
+        style="min-width:800px;"
+      >
+        <el-form-item prop="result" label="审核结果:">
+          <el-radio-group v-model="modalForm.result">
+            <el-radio
+              v-for="(val, key) in AUDIT_TYPE"
+              :key="key"
+              :label="key * 1"
+              >{{ val }}</el-radio
+            >
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item prop="content" label="审核意见:">
+          <el-input
+            type="textarea"
+            style="width: 439px;"
+            v-model.trim="modalForm.content"
+            placeholder="请输入审核意见"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" :disabled="isSubmit" @click="save"
+            >提交</el-button
+          >
+          <el-button @click="goback">取消</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+  </div>
+</template>
+
+<script>
+import { doneTaskDetail } from "../api";
+import { attachmentPreview } from "../../login/api";
+
+export default {
+  name: "exam-task-audit-edit",
+  data() {
+    return {
+      taskId: this.$route.params.taskId,
+      task: {},
+      pTypeEnable: false,
+      paperAttachments: [],
+      curAttachment: {},
+      isSubmit: false,
+      AUDIT_TYPE: {
+        1: "通过",
+        2: "不通过"
+      },
+      modalForm: { result: 1, content: "" },
+      rules: {
+        result: [
+          {
+            required: true,
+            message: "请选择审核结果",
+            trigger: "change"
+          }
+        ],
+        content: [
+          {
+            required: true,
+            message: "请输入审核意见",
+            trigger: "change"
+          }
+        ]
+      }
+    };
+  },
+  // mounted() {
+  //   this.getData();
+  // },
+  methods: {
+    async getData() {
+      const data = await doneTaskDetail(this.taskId);
+      const nameCode = data.courseNameCode.split(/\(|\)/);
+      this.task = Object.assign(this.task, data, {
+        courseName: nameCode[0],
+        courseCode: nameCode[1]
+      });
+      this.pTypeEnable = this.task.enablePaperType.split(",").length > 1;
+      this.parsePaperAttachment();
+    },
+    parsePaperAttachment() {
+      const paperAttachment =
+        this.task.paperAttachmentId && JSON.parse(this.task.paperAttachmentId);
+      if (!paperAttachment) return;
+
+      this.paperAttachments = paperAttachment.paper;
+    },
+    async downloadPaper(attachment) {
+      const data = await attachmentPreview(attachment.attachmentId);
+      window.open(data.path);
+    },
+    toPreviewCard() {
+      window.open(
+        this.getRouterPath({
+          name: "CardPreview",
+          params: {
+            cardId: this.task.cardId,
+            viewType: "view"
+          }
+        })
+      );
+    },
+    async save() {
+      const valid = await this.$refs["ModalForm"].validate().catch(() => {});
+      if (!valid) return;
+    }
+  }
+};
+</script>

+ 50 - 0
src/modules/exam-center/views/ExamTaskDetail.vue

@@ -0,0 +1,50 @@
+<template>
+  <div class="exam-task-detail task-detail">
+    <div class="task-title">
+      <h2>
+        <span>考试名称:{{ examInfo.examName }}</span>
+        <span>考试开始时间:{{ examInfo.examStartTime }}</span>
+        <span>考试打印时间:{{ examInfo.examPrintTime }}</span>
+      </h2>
+      <div class="task-title-infos">
+        <el-button @click="goback">返回</el-button>
+      </div>
+    </div>
+
+    <div class="task-body">
+      <el-table :data="dataList" border stripe>
+        <el-table-column prop="courseName" label="科目名称"></el-table-column>
+        <el-table-column prop="teacherName" label="命题老师"></el-table-column>
+        <el-table-column prop="examState" label="状态"></el-table-column>
+      </el-table>
+    </div>
+  </div>
+</template>
+
+<script>
+import { examTaskDetail } from "../api";
+
+export default {
+  name: "exam-task-detail",
+  data() {
+    return {
+      examId: this.$route.params.examId,
+      dataList: [],
+      examInfo: {}
+    };
+  },
+  created() {
+    this.init();
+  },
+  methods: {
+    init() {
+      this.getData();
+    },
+    async getData() {
+      const data = await examTaskDetail(this.examId);
+      this.dataList = data.records;
+      this.examInfo = data;
+    }
+  }
+};
+</script>

+ 65 - 10
src/modules/exam-center/views/WaitTaskDetail.vue

@@ -15,12 +15,12 @@
       <table class="table">
         <tr>
           <th>试卷类型</th>
-          <th>试卷文件</th>
-          <th>答题卡</th>
+          <th v-if="task.examPaper">试卷文件</th>
+          <th v-if="task.answerSheet">答题卡</th>
         </tr>
         <tr v-for="(attachment, index) in curPaperAttachments" :key="index">
           <td>{{ attachment.name }}卷</td>
-          <td class="td-link">
+          <td class="td-link" v-if="task.examPaper">
             <span @click="toUpload(attachment)" title="点击上传试卷">
               <i
                 :class="[
@@ -38,7 +38,7 @@
           <td
             class="td-link"
             :rowspan="pTypeEnable ? curPaperAttachments.length : 1"
-            v-if="index === 0"
+            v-if="index === 0 && task.answerSheet"
           >
             <span @click="toCreateCard"
               ><i class="icon icon-plus-act"></i>{{ cardTodoName }}</span
@@ -47,6 +47,16 @@
         </tr>
       </table>
 
+      <div class="task-audit" v-if="task.review && task.auditStatus === 0">
+        <p>
+          <span>打回意见:</span
+          ><span class="color-danger">{{ task.remark }}</span>
+          <span class="task-audit-history" @click="modalIsShow = true"
+            >历史意见 <i class="el-icon-caret-right"></i>
+          </span>
+        </p>
+      </div>
+
       <div class="task-action">
         <el-button type="primary" style="width:105px;" @click="toSubmit"
           >确认提交</el-button
@@ -56,6 +66,23 @@
       </div>
     </div>
 
+    <!-- audit msg history -->
+    <el-dialog
+      :visible.sync="modalIsShow"
+      title="历史意见"
+      top="10vh"
+      width="600px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      append-to-body
+    >
+      <el-table :data="auditHistory" border stripe>
+        <el-table-column prop="createTime" label="时间"></el-table-column>
+        <el-table-column prop="remark" label="意见"></el-table-column>
+      </el-table>
+      <div slot="footer"></div>
+    </el-dialog>
+
     <!-- upload-paper-dialog -->
     <upload-paper-dialog
       :paper-attachment="curAttachment"
@@ -75,9 +102,15 @@
 
 <script>
 import { mapActions } from "vuex";
-import { waitTaskDetail, saveWaitTask, submitWaitTask } from "../api";
+import {
+  waitTaskDetail,
+  saveWaitTask,
+  submitWaitTask,
+  examTaskAudtiHistory
+} from "../api";
 import UploadPaperDialog from "../components/UploadPaperDialog";
 import CardOptionDialog from "../components/CardOptionDialog";
+import { PAPER_TYPE_FIELDS } from "@/constants/enumerate";
 
 export default {
   name: "wait-task-detail",
@@ -88,7 +121,7 @@ export default {
   data() {
     return {
       taskId: this.$route.params.taskId,
-      PAPER_TYPE_FIELDS: ["A", "B"],
+      PAPER_TYPE_FIELDS,
       task: {
         id: "",
         taskId: "",
@@ -96,12 +129,28 @@ export default {
         paperAttachmentId: "",
         cardId: "",
         cardSource: "",
-        refCardId: ""
+        refCardId: "",
+        examPaper: 1,
+        answerSheet: 1,
+        signIn: 0,
+        paperSticker: 0,
+        review: 1,
+        auditStatus: 0,
+        remark:
+          "这是按税法二,的啊ad框架,安大街开始的罚款案件发,发生的叫法卡是的罚款是安抚,继发技术附件发卡上开发发顺丰,发斯蒂芬咖啡机大法级法师打发斯蒂芬阿道夫。"
       },
       pTypeEnable: false,
       paperAttachments: [],
       curPaperAttachments: [],
-      curAttachment: {}
+      curAttachment: {},
+      // audit history
+      modalIsShow: false,
+      auditHistory: [
+        {
+          createTime: "2020-01-15 15:15:15",
+          remark: "这是很航的阿克苏就按"
+        }
+      ]
     };
   },
   computed: {
@@ -140,6 +189,12 @@ export default {
         this.task.enablePaperType.split(",").length > 1;
       this.parsePaperAttachment();
       this.pTypeEnableChange(this.pTypeEnable);
+
+      if (this.task.review && this.task.auditStatus === 0)
+        this.getHistoryList();
+    },
+    async getHistoryList() {
+      this.auditHistory = await examTaskAudtiHistory(this.taskId);
     },
     parsePaperAttachment() {
       const paperAttachment =
@@ -251,8 +306,8 @@ export default {
         "任务确定提交后,则不可更改试卷及答题卡内容,确定提交该任务?",
         "提示",
         {
-          cancelButtonClass: "el-button--primary",
-          confirmButtonClass: "el-button--default-act",
+          cancelButtonClass: "el-button--danger is-plain",
+          confirmButtonClass: "el-button--primary",
           type: "warning"
         }
       ).then(async () => {

+ 2 - 2
src/modules/example/views/DataManage.vue

@@ -169,8 +169,8 @@ export default {
     },
     toDelete(row) {
       this.$confirm("确定要删除当前学校吗?", "删除警告", {
-        cancelButtonClass: "el-button--primary",
-        confirmButtonClass: "el-button--default-act",
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
         type: "warning"
       })
         .then(async () => {

+ 2 - 2
src/modules/score-paper/views/ClassPaper.vue

@@ -169,8 +169,8 @@ export default {
     },
     toDelete(row) {
       this.$confirm("确定要删除当前学校吗?", "删除警告", {
-        cancelButtonClass: "el-button--primary",
-        confirmButtonClass: "el-button--default-act",
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
         type: "warning"
       })
         .then(async () => {

+ 2 - 0
src/plugins/axios.js

@@ -52,6 +52,8 @@ const errorDataCallback = error => {
     message = "身份验证失效,请重新登录";
     MessageBox.confirm(message, "重新登陆?", {
       type: "warning",
+      cancelButtonClass: "el-button--danger is-plain",
+      confirmButtonClass: "el-button--primary",
       closeOnClickModal: false,
       closeOnPressEscape: false,
       showClose: false,

+ 2 - 2
src/views/Home.vue

@@ -320,8 +320,8 @@ export default {
     },
     toLogout() {
       this.$confirm("确定要退出登录吗?", "提示", {
-        cancelButtonClass: "el-button--primary",
-        confirmButtonClass: "el-button--default-act",
+        cancelButtonClass: "el-button--danger is-plain",
+        confirmButtonClass: "el-button--primary",
         type: "warning"
       })
         .then(() => {