Prechádzať zdrojové kódy

印刷管理接口调试

zhangjie 4 rokov pred
rodič
commit
140da87128

+ 10 - 1
src/assets/styles/element-ui-costom.scss

@@ -89,6 +89,10 @@
   &.form-info {
   &.form-info {
     .el-form-item {
     .el-form-item {
       margin-bottom: 0;
       margin-bottom: 0;
+
+      .el-form-item__label {
+        color: $--color-text-regular;
+      }
     }
     }
   }
   }
 }
 }
@@ -319,7 +323,7 @@
     }
     }
     &.is-disabled.is-checked {
     &.is-disabled.is-checked {
       .el-checkbox__inner {
       .el-checkbox__inner {
-        opacity: 0.6;
+        opacity: 0.8;
       }
       }
     }
     }
   }
   }
@@ -353,6 +357,11 @@
         border-color: $--color-border;
         border-color: $--color-border;
       }
       }
     }
     }
+    &.is-disabled.is-checked {
+      .el-radio__inner {
+        opacity: 0.8;
+      }
+    }
   }
   }
   .el-radio__label {
   .el-radio__label {
     color: $--color-text-regular !important;
     color: $--color-text-regular !important;

+ 5 - 0
src/assets/styles/pages.scss

@@ -19,6 +19,11 @@
       border-left: 0;
       border-left: 0;
       border-top: 0;
       border-top: 0;
       padding: 10px;
       padding: 10px;
+
+      i {
+        display: inline-block;
+        vertical-align: middle;
+      }
     }
     }
     tr:nth-of-type(even) {
     tr:nth-of-type(even) {
       background-color: $--color-background;
       background-color: $--color-background;

+ 2 - 5
src/constants/enumerate.js

@@ -1,14 +1,11 @@
+export const SYS_ADMIN_NAME = "sysadmin";
+
 // 启用/禁用
 // 启用/禁用
 export const ABLE_TYPE = {
 export const ABLE_TYPE = {
   0: "禁用",
   0: "禁用",
   1: "启用"
   1: "启用"
 };
 };
 
 
-// 性别
-export const GENDER_TYPE = {
-  MALE: "男",
-  FEMALE: "女"
-};
 // 是 / 否
 // 是 / 否
 export const BOOLEAN_TYPE = {
 export const BOOLEAN_TYPE = {
   0: "否",
   0: "否",

+ 0 - 3
src/modules/base/components/ModifyRole.vue

@@ -48,13 +48,10 @@
             <el-tree
             <el-tree
               :data="menus"
               :data="menus"
               show-checkbox
               show-checkbox
-              default-expand-all
               node-key="id"
               node-key="id"
               ref="MenuTree"
               ref="MenuTree"
               highlight-current
               highlight-current
               :props="defaultProps"
               :props="defaultProps"
-              check-on-click-node
-              :expand-on-click-node="false"
               @check-change="checkChange"
               @check-change="checkChange"
             >
             >
               <span class="custom-tree-node" slot-scope="{ node, data }">
               <span class="custom-tree-node" slot-scope="{ node, data }">

+ 1 - 0
src/modules/base/components/RuleBusiness.vue

@@ -125,6 +125,7 @@ export default {
           enable: true
           enable: true
         };
         };
       });
       });
+      console.log(this.modalForm.extendFields);
       this.modalForm.extendFields = JSON.parse(this.modalForm.extendFields);
       this.modalForm.extendFields = JSON.parse(this.modalForm.extendFields);
     },
     },
     validateRequiredFields() {
     validateRequiredFields() {

+ 1 - 1
src/modules/base/views/MenuManage.vue

@@ -15,7 +15,7 @@
       >
       >
         <span class="custom-tree-node" slot-scope="{ node, data }">
         <span class="custom-tree-node" slot-scope="{ node, data }">
           <span
           <span
-            ><i class="el-icon-s-check" v-if="data.type === 'LINK'"></i>
+            ><i class="el-icon-link" v-if="data.type === 'URL'"></i>
             {{ node.label }}</span
             {{ node.label }}</span
           >
           >
           <span>
           <span>

+ 4 - 1
src/modules/base/views/RoleManage.vue

@@ -121,7 +121,7 @@
 </template>
 </template>
 
 
 <script>
 <script>
-import { ABLE_TYPE } from "@/constants/enumerate";
+import { ABLE_TYPE, SYS_ADMIN_NAME } from "@/constants/enumerate";
 import { menuList, roleListPage, ableRole, deleteRole } from "../api";
 import { menuList, roleListPage, ableRole, deleteRole } from "../api";
 import { getEnums } from "../../login/api";
 import { getEnums } from "../../login/api";
 import ModifyRole from "../components/ModifyRole";
 import ModifyRole from "../components/ModifyRole";
@@ -160,9 +160,12 @@ export default {
       this.menus = await menuList();
       this.menus = await menuList();
     },
     },
     async getRoleTypes() {
     async getRoleTypes() {
+      const loginName = this.$ls.get("user", { loginName: "" }).loginName;
       const data = await getEnums("ROLE_TYPE");
       const data = await getEnums("ROLE_TYPE");
       let ROLE_TYPE = {};
       let ROLE_TYPE = {};
       data.forEach(element => {
       data.forEach(element => {
+        if (loginName !== SYS_ADMIN_NAME && element.name === "CUSTOMER") return;
+
         ROLE_TYPE[element.name] = element.desc;
         ROLE_TYPE[element.name] = element.desc;
       });
       });
       this.ROLE_TYPE = ROLE_TYPE;
       this.ROLE_TYPE = ROLE_TYPE;

+ 7 - 0
src/modules/exam/api.js

@@ -68,6 +68,13 @@ export const taskPaperListPage = datas => {
 export const ableTaskPaper = ({ id, enable }) => {
 export const ableTaskPaper = ({ id, enable }) => {
   return $post("/api/admin/exam/task/paper_enable", { id, enable });
   return $post("/api/admin/exam/task/paper_enable", { id, enable });
 };
 };
+export const downloadPaper = examTaskId => {
+  return $postParam(
+    "/api/admin/exam/task/paper_download",
+    { examTaskId },
+    { responseType: "blob" }
+  );
+};
 
 
 // card
 // card
 export const cardForSelectList = datas => {
 export const cardForSelectList = datas => {

+ 7 - 5
src/modules/exam/components/ApplyContent.vue

@@ -41,7 +41,8 @@
               @click="downloadPaper(attachment)"
               @click="downloadPaper(attachment)"
               title="点击下载试卷"
               title="点击下载试卷"
             >
             >
-              <i class="icon icon-download-act"></i>{{ attachment.filename }}
+              <i class="icon icon-download-act"></i>
+              <i>{{ attachment.filename }}</i>
             </span>
             </span>
           </td>
           </td>
           <td
           <td
@@ -52,9 +53,10 @@
             <span v-if="IS_APPLY" @click="toCreateOrViewCard"
             <span v-if="IS_APPLY" @click="toCreateOrViewCard"
               ><i class="icon icon-plus-act"></i>{{ cardTodoName }}</span
               ><i class="icon icon-plus-act"></i>{{ cardTodoName }}</span
             >
             >
-            <span v-else @click="toViewCard"
-              >查看题卡 <i class="icon icon-circle-right"></i
-            ></span>
+            <span v-else @click="toViewCard">
+              <i class="icon icon-circle-right"></i>
+              <i>查看题卡</i>
+            </span>
           </td>
           </td>
           <td v-if="IS_APPLY">
           <td v-if="IS_APPLY">
             <el-button
             <el-button
@@ -372,7 +374,7 @@ export default {
       this.$emit("cancel");
       this.$emit("cancel");
     },
     },
     downloadPaper(attachment) {
     downloadPaper(attachment) {
-      window.open(attachment.path);
+      window.open(attachment.url);
     },
     },
     cardConfirm(data) {
     cardConfirm(data) {
       this.curTaskApply = this.$objAssign(this.curTaskApply, data);
       this.curTaskApply = this.$objAssign(this.curTaskApply, data);

+ 94 - 0
src/modules/exam/components/PreviewTaskPaper.vue

@@ -0,0 +1,94 @@
+<template>
+  <el-dialog
+    class="preview-task-paper task-detail"
+    :visible.sync="modalIsShow"
+    title="卷库预览"
+    top="10vh"
+    width="900px"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    @open="visibleChange"
+  >
+    <div class="part-box part-box-pad part-box-border">
+      <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>
+              <i>{{ attachment.filename }}</i>
+            </span>
+          </td>
+          <td
+            class="td-link"
+            :rowspan="paperAttachments.length"
+            v-if="index === 0"
+          >
+            <span @click="toViewCard">
+              <i class="icon icon-circle-right"></i>
+              <i>查看题卡</i>
+            </span>
+          </td>
+        </tr>
+      </table>
+    </div>
+
+    <div slot="footer"></div>
+  </el-dialog>
+</template>
+
+<script>
+import { taskApplyDetail } from "../api";
+
+export default {
+  name: "preview-task-paper",
+  props: {
+    instance: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      paperAttachments: []
+    };
+  },
+  methods: {
+    async visibleChange() {
+      const data = await taskApplyDetail(this.instance.id);
+      this.paperAttachments = data.paperAttachmentIds
+        ? JSON.parse(data.paperAttachmentIds)
+        : [];
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    downloadPaper(attachment) {
+      window.open(attachment.url);
+    },
+    toViewCard() {
+      window.open(
+        this.getRouterPath({
+          name: "CardPreview",
+          params: {
+            cardId: this.curTaskApply.cardId,
+            viewType: "view"
+          }
+        })
+      );
+    }
+  }
+};
+</script>

+ 28 - 18
src/modules/exam/views/TaskPaperManage.vue

@@ -111,14 +111,6 @@
               @click="toEnable(scope.row)"
               @click="toEnable(scope.row)"
               :title="scope.row.enable ? '禁用' : '启用'"
               :title="scope.row.enable ? '禁用' : '启用'"
             ></el-button>
             ></el-button>
-            <el-button
-              v-if="scope.row.status === 'STAGE' || scope.row.status === 'NEW'"
-              class="btn-table-icon"
-              type="text"
-              icon="icon icon-edit"
-              @click="toEdit(scope.row)"
-              :title="scope.row.status === 'NEW' ? '更改' : '指派'"
-            ></el-button>
             <el-button
             <el-button
               class="btn-table-icon"
               class="btn-table-icon"
               type="text"
               type="text"
@@ -130,6 +122,7 @@
               class="btn-table-icon"
               class="btn-table-icon"
               type="text"
               type="text"
               icon="icon icon-download-act"
               icon="icon icon-download-act"
+              :disabled="loading"
               @click="toDownload(scope.row)"
               @click="toDownload(scope.row)"
               title="下载"
               title="下载"
             ></el-button>
             ></el-button>
@@ -148,15 +141,24 @@
         </el-pagination>
         </el-pagination>
       </div>
       </div>
     </div>
     </div>
+
+    <!-- PreviewTaskPaper -->
+    <preview-task-paper
+      :instance="curPaper"
+      ref="PreviewTaskPaper"
+    ></preview-task-paper>
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
-import { taskPaperListPage, ableTaskPaper } from "../api";
+import { taskPaperListPage, ableTaskPaper, downloadPaper } from "../api";
 import pickerOptions from "@/constants/datePickerOptions";
 import pickerOptions from "@/constants/datePickerOptions";
+import { downloadBlob } from "@/plugins/utils";
+import PreviewTaskPaper from "../components/PreviewTaskPaper";
 
 
 export default {
 export default {
   name: "task-paper-manage",
   name: "task-paper-manage",
+  components: { PreviewTaskPaper },
   data() {
   data() {
     return {
     return {
       filter: {
       filter: {
@@ -170,6 +172,7 @@ export default {
       total: 0,
       total: 0,
       papers: [],
       papers: [],
       curPaper: {},
       curPaper: {},
+      loading: false,
       // date-picker
       // date-picker
       createTime: [],
       createTime: [],
       pickerOptions
       pickerOptions
@@ -235,18 +238,25 @@ export default {
         })
         })
         .catch(() => {});
         .catch(() => {});
     },
     },
-    toEdit(row) {
-      this.curPaper = row;
-      this.editType = "EDIT";
-      this.$refs.ModifyExamTask.open();
-    },
     toPreview(row) {
     toPreview(row) {
       this.curPaper = row;
       this.curPaper = row;
-      this.editType = "PREVIEW";
-      this.$refs.ModifyExamTask.open();
+      this.$refs.PreviewTaskPaper.open();
     },
     },
-    toDownload(row) {
-      console.log(row);
+    async toDownload(row) {
+      if (this.loading) return;
+
+      this.loading = true;
+      const res = await downloadBlob(() => {
+        return downloadPaper(row.id);
+      }, `${row.paperNumber}-${Date.now()}.zip`).catch(() => {});
+
+      this.loading = false;
+
+      if (res) {
+        this.$message.success("文件下载成功!");
+      } else {
+        this.$message.error("文件下载失败,请重新尝试!");
+      }
     }
     }
   }
   }
 };
 };

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

@@ -34,11 +34,22 @@ export const businessDataListPage = datas => {
 export const businessTotalData = datas => {
 export const businessTotalData = datas => {
   return $postParam("/api/admin/exam/print/data_total", datas);
   return $postParam("/api/admin/exam/print/data_total", datas);
 };
 };
+export const businessTemplateDownload = () => {
+  return $postParam(
+    "/api/admin/exam/print/template_download",
+    {},
+    { responseType: "blob" }
+  );
+};
 
 
 // business-data-detail
 // business-data-detail
 export const businessDataDetailListPage = datas => {
 export const businessDataDetailListPage = datas => {
   return $postParam("/api/admin/exam/print/data_detail", datas);
   return $postParam("/api/admin/exam/print/data_detail", datas);
 };
 };
+// 通过 examDetailId 查询考务明细记录
+export const businessDataDetailListPageById = datas => {
+  return $postParam("/api/admin/exam/print/data_detail_list", datas);
+};
 
 
 // plan-link-paper
 // plan-link-paper
 export const planLinkPaperListPage = datas => {
 export const planLinkPaperListPage = datas => {

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

@@ -463,6 +463,9 @@ export default {
         };
         };
         this.modalForm.variableContent = val.variableContent.map(transformInfo);
         this.modalForm.variableContent = val.variableContent.map(transformInfo);
         this.modalForm.ordinaryContent = val.ordinaryContent.map(transformInfo);
         this.modalForm.ordinaryContent = val.ordinaryContent.map(transformInfo);
+        this.modalForm.printContent = val.printContent
+          ? val.printContent.split(",")
+          : [];
       } else {
       } else {
         this.modalForm = { ...initModalForm };
         this.modalForm = { ...initModalForm };
         this.createTime = [];
         this.createTime = [];
@@ -505,8 +508,12 @@ export default {
           backupCount: item.backupCount
           backupCount: item.backupCount
         };
         };
       };
       };
-      datas.variableContent = this.modalForm.variableContent.map(transformInfo);
-      datas.ordinaryContent = this.modalForm.ordinaryContent.map(transformInfo);
+      datas.variableContent = JSON.stringify(
+        this.modalForm.variableContent.map(transformInfo)
+      );
+      datas.ordinaryContent = JSON.stringify(
+        this.modalForm.ordinaryContent.map(transformInfo)
+      );
       const data = await updatePrintPlan(datas).catch(() => {});
       const data = await updatePrintPlan(datas).catch(() => {});
       this.isSubmit = false;
       this.isSubmit = false;
       if (!data) return;
       if (!data) return;

+ 170 - 0
src/modules/print/components/PreviewBusinessDetail.vue

@@ -0,0 +1,170 @@
+<template>
+  <el-dialog
+    class="preview-business-detail"
+    :visible.sync="modalIsShow"
+    title="详情数据"
+    top="10vh"
+    width="900px"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    @open="visibleChange"
+  >
+    <div class="part-box part-box-pad part-box-border">
+      <el-form ref="modalFormComp" class="form-info" label-width="100px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="印刷计划:">
+              <span>{{ modalForm.printPlanName }}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="卷袋号:">
+              <span>{{ modalForm.packageCode }}</span>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="考试日期:">
+              <span>{{ modalForm.examStartTime }}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="考试时间:">
+              <span>{{ modalForm.examEndTime }}</span>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="考点:">
+              <span>{{ modalForm.examPlace }}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="考场:">
+              <span>{{ modalForm.examRoom }}</span>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="课程(代码):">
+              <span>{{ modalForm.courseNameCode }}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="试卷编号:">
+              <span>{{ modalForm.paperNumber }}</span>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </div>
+
+    <div class="part-box">
+      <el-table ref="TableList" :data="dataList" border stripe>
+        <el-table-column
+          type="index"
+          label="序号"
+          width="50"
+          align="center"
+          :index="indexMethod"
+        ></el-table-column>
+        <el-table-column prop="courseNameCode" label="课程(代码)">
+        </el-table-column>
+        <!-- <el-table-column prop="specialty" 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="ticketNumber" label="考号"> </el-table-column>
+        <el-table-column prop="studentCode" label="学号"> </el-table-column>
+        <el-table-column prop="studentName" label="姓名"> </el-table-column>
+      </el-table>
+    </div>
+    <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 slot="footer"></div>
+  </el-dialog>
+</template>
+
+<script>
+import { businessDataDetailListPageById } from "../api";
+
+const initModalForm = {
+  id: "",
+  courseNameCode: "",
+  examDetailCourseIds: "",
+  examEndTime: "",
+  examPlace: "",
+  examRoom: "",
+  examStartTime: "",
+  packageCode: null,
+  paperNumber: "",
+  printPlanId: "",
+  printPlanName: "",
+  totalSubjects: 0
+};
+
+export default {
+  name: "preview-business-detail",
+  props: {
+    instance: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      isSubmit: false,
+      modalForm: {},
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      dataList: []
+    };
+  },
+  methods: {
+    visibleChange() {
+      if (this.instance.id !== this.modalForm.id) this.toPage(1);
+
+      this.modalForm = this.$objAssign(initModalForm, this.instance);
+    },
+    async getList() {
+      const datas = {
+        examDetailId: this.instance.id,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      const data = await businessDataDetailListPageById(datas);
+      this.dataList = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    }
+  }
+};
+</script>

+ 5 - 6
src/modules/print/views/BusinessDataDetail.vue

@@ -38,10 +38,10 @@
             clearable
             clearable
           ></room-select>
           ></room-select>
         </el-form-item>
         </el-form-item>
-        <el-form-item label="考生:" label-width="55px">
+        <el-form-item label="卷袋号:" label-width="70px">
           <el-input
           <el-input
-            v-model="filter.studentParams"
-            placeholder="考生/学号/姓名"
+            v-model="filter.packageCode"
+            placeholder="请输入"
             clearable
             clearable
           ></el-input>
           ></el-input>
         </el-form-item>
         </el-form-item>
@@ -113,12 +113,11 @@ export default {
       current: 1,
       current: 1,
       size: this.GLOBAL.pageSize,
       size: this.GLOBAL.pageSize,
       total: 0,
       total: 0,
-      dataList: []
+      dataList: [],
+      curBusiness: null
     };
     };
   },
   },
   created() {
   created() {
-    const curBusiness = this.$ls.get("curBusiness");
-    if (curBusiness) this.filter = this.$objAssign(this.filter, curBusiness);
     this.search();
     this.search();
   },
   },
   methods: {
   methods: {

+ 51 - 18
src/modules/print/views/BusinessDataExport.vue

@@ -39,10 +39,10 @@
             clearable
             clearable
           ></room-select>
           ></room-select>
         </el-form-item>
         </el-form-item>
-        <el-form-item label="考生:" label-width="55px">
+        <el-form-item label="卷袋号:" label-width="70px">
           <el-input
           <el-input
-            v-model="filter.studentParams"
-            placeholder="考生/学号/姓名"
+            v-model="filter.packageCode"
+            placeholder="请输入"
             clearable
             clearable
           ></el-input>
           ></el-input>
         </el-form-item>
         </el-form-item>
@@ -53,10 +53,12 @@
         </el-form-item>
         </el-form-item>
       </el-form>
       </el-form>
       <div class="part-box-action">
       <div class="part-box-action">
-        <el-button icon="icon icon-download-act">
-          <a :href="downloadUrl" download="考务数据模板.xlsx"
-            >考务数据模板下载</a
-          >
+        <el-button
+          icon="icon icon-download-act"
+          :loading="loading"
+          @click="toDownloadTemplate"
+        >
+          考务数据模板下载
         </el-button>
         </el-button>
         <el-button icon="icon icon-download" type="primary" @click="toExport">
         <el-button icon="icon icon-download" type="primary" @click="toExport">
           导出查询结果
           导出查询结果
@@ -99,12 +101,13 @@
             scope.row.examEndTime | timestampFilter
             scope.row.examEndTime | timestampFilter
           }}</span>
           }}</span>
         </el-table-column>
         </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="卷袋号" width="80">
+        </el-table-column>
         <el-table-column prop="courseNameCode" label="课程(代码)">
         <el-table-column prop="courseNameCode" label="课程(代码)">
         </el-table-column>
         </el-table-column>
         <el-table-column prop="paperNumber" 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="packageCount" label="卷袋数" width="80">
-        </el-table-column>
         <el-table-column prop="totalSubjects" label="科次" width="80">
         <el-table-column prop="totalSubjects" label="科次" width="80">
         </el-table-column>
         </el-table-column>
         <el-table-column
         <el-table-column
@@ -148,16 +151,28 @@
       >
       >
       </el-pagination>
       </el-pagination>
     </div>
     </div>
+
+    <!-- PreviewBusinessDetail -->
+    <preview-business-detail
+      ref="PreviewBusinessDetail"
+      :instance="curRow"
+    ></preview-business-detail>
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
-import { businessDataListPage, businessTotalData } from "../api";
+import {
+  businessDataListPage,
+  businessTotalData,
+  businessTemplateDownload
+} from "../api";
 import UploadButton from "@/components/UploadButton";
 import UploadButton from "@/components/UploadButton";
+import PreviewBusinessDetail from "../components/PreviewBusinessDetail";
+import { downloadBlob } from "@/plugins/utils";
 
 
 export default {
 export default {
   name: "business-data-export",
   name: "business-data-export",
-  components: { UploadButton },
+  components: { UploadButton, PreviewBusinessDetail },
   data() {
   data() {
     return {
     return {
       filter: {
       filter: {
@@ -166,7 +181,7 @@ export default {
         paperNumber: "",
         paperNumber: "",
         examPlace: "",
         examPlace: "",
         examRoom: "",
         examRoom: "",
-        studentParams: ""
+        packageCode: ""
       },
       },
       current: 1,
       current: 1,
       size: this.GLOBAL.pageSize,
       size: this.GLOBAL.pageSize,
@@ -175,11 +190,12 @@ export default {
       curRow: {},
       curRow: {},
       totalData: {},
       totalData: {},
       curPrintPlan: {},
       curPrintPlan: {},
+      loading: false,
       // import
       // import
-      downloadUrl: "/temps/考务数据模板.xlsx",
-      uploadUrl: "/api/admin/sys/user/import",
+      uploadUrl: "/api/admin/exam/print/data_import",
       uploadData: {
       uploadData: {
-        type: "FILE"
+        type: "FILE",
+        printPlanId: ""
       }
       }
     };
     };
   },
   },
@@ -217,6 +233,7 @@ export default {
     },
     },
     planChange(plan) {
     planChange(plan) {
       this.curPrintPlan = plan;
       this.curPrintPlan = plan;
+      this.uploadData.printPlanId = plan.id;
     },
     },
     uplaodError(errorData) {
     uplaodError(errorData) {
       this.$notify.error({ title: "错误提示", message: errorData.message });
       this.$notify.error({ title: "错误提示", message: errorData.message });
@@ -226,9 +243,25 @@ export default {
       this.getList();
       this.getList();
     },
     },
     toExport() {},
     toExport() {},
+    async toDownloadTemplate() {
+      if (this.loading) return;
+
+      this.loading = true;
+      const res = await downloadBlob(() => {
+        return businessTemplateDownload();
+      }, `考务数据模板.xlsx`).catch(() => {});
+
+      this.loading = false;
+
+      if (res) {
+        this.$message.success("文件下载成功!");
+      } else {
+        this.$message.error("文件下载失败,请重新尝试!");
+      }
+    },
     toPreview(row) {
     toPreview(row) {
-      this.$ls.set("curBusiness", this.$objAssign(this.filter, row));
-      this.$router.push({ name: "BusinessDataDetail" });
+      this.curRow = { ...row };
+      this.$refs.PreviewBusinessDetail.open();
     }
     }
   }
   }
 };
 };

+ 9 - 12
src/modules/print/views/PrintTaskManage.vue

@@ -97,11 +97,11 @@
           个</span
           个</span
         >
         >
         <span class="mr-4"
         <span class="mr-4"
-          >A3印量计:<i class="color-primary">{{ totalInfo.pageA3 }}</i>
+          >A3印量计:<i class="color-primary">{{ totalInfo.pageA3 }}</i>
           张</span
           张</span
         >
         >
         <span class="mr-4"
         <span class="mr-4"
-          >A4印量计:<i class="color-primary">{{ totalInfo.pageA4 }}</i>
+          >A4印量计:<i class="color-primary">{{ totalInfo.pageA4 }}</i>
           张</span
           张</span
         >
         >
       </p>
       </p>
@@ -163,13 +163,7 @@
         <el-table-column prop="examRoom" label="考场"></el-table-column>
         <el-table-column prop="examRoom" label="考场"></el-table-column>
         <el-table-column
         <el-table-column
           prop="pageA3"
           prop="pageA3"
-          label="单科次A3(页)"
-          width="110"
-        ></el-table-column>
-        <el-table-column
-          prop="pageA4"
-          label="单科次A4(页)"
-          width="110"
+          label="单科次准印量A3(页)"
         ></el-table-column>
         ></el-table-column>
         <el-table-column
         <el-table-column
           prop="totalSubjects"
           prop="totalSubjects"
@@ -177,9 +171,12 @@
           width="80"
           width="80"
         ></el-table-column>
         ></el-table-column>
         <el-table-column
         <el-table-column
-          prop="totalPages"
-          label="印刷小计"
-          width="80"
+          prop="pageA3"
+          label="A3准印量小计(页)"
+        ></el-table-column>
+        <el-table-column
+          prop="pageA4"
+          label="A4准印量小计(页)"
         ></el-table-column>
         ></el-table-column>
         <el-table-column prop="status" label="印刷状态" width="80">
         <el-table-column prop="status" label="印刷状态" width="80">
           <span slot-scope="scope">{{
           <span slot-scope="scope">{{

+ 5 - 1
src/plugins/axios.js

@@ -44,7 +44,7 @@ const errorCallback = error => {
 const errorDataCallback = error => {
 const errorDataCallback = error => {
   let message = error.message || "数据错误";
   let message = error.message || "数据错误";
 
 
-  if (error.code === 4010006) {
+  if (error.code === 4010006 || error.code === 5000012) {
     if (unauthMsgBoxIsShow) return error;
     if (unauthMsgBoxIsShow) return error;
     unauthMsgBoxIsShow = true;
     unauthMsgBoxIsShow = true;
     message = "身份验证失效,请重新登录";
     message = "身份验证失效,请重新登录";
@@ -123,6 +123,8 @@ const $postParam = (url, datas, config = {}) => {
   return axios
   return axios
     .post(url, {}, config)
     .post(url, {}, config)
     .then(rep => {
     .then(rep => {
+      if (config["responseType"] === "blob") return rep;
+
       return successCallback(rep.data);
       return successCallback(rep.data);
     })
     })
     .catch(error => {
     .catch(error => {
@@ -146,6 +148,8 @@ const $post = (url, datas, config = {}) => {
   return axios
   return axios
     .post(url, sqDatas, config)
     .post(url, sqDatas, config)
     .then(rep => {
     .then(rep => {
+      if (config["responseType"] === "blob") return rep;
+
       return successCallback(rep.data);
       return successCallback(rep.data);
     })
     })
     .catch(error => {
     .catch(error => {

+ 21 - 0
src/plugins/utils.js

@@ -108,6 +108,26 @@ function download(option) {
   });
   });
 }
 }
 
 
+/**
+ * 文件流下载
+ * @param {Function} fetchFunc 下载程序,返回promise
+ * @param {String} fileName 保存的文件名
+ */
+async function downloadBlob(fetchFunc, fileName) {
+  const res = await fetchFunc().catch(() => {});
+  if (!res) return;
+
+  const blobUrl = URL.createObjectURL(new Blob([res.data]));
+  let a = document.createElement("a");
+  a.download = fileName;
+  a.href = blobUrl;
+  document.body.appendChild(a);
+  a.click();
+  a.parentNode.removeChild(a);
+
+  return true;
+}
+
 /**
 /**
  * 构建图表btn
  * 构建图表btn
  * @param {Function} h createElement
  * @param {Function} h createElement
@@ -260,6 +280,7 @@ export {
   deepCopy,
   deepCopy,
   objAssign,
   objAssign,
   download,
   download,
+  downloadBlob,
   tableAction,
   tableAction,
   randomCode,
   randomCode,
   qsParams,
   qsParams,