zhangjie %!s(int64=2) %!d(string=hai) anos
pai
achega
86354b1a5d

+ 144 - 0
src/constants/printTemplateData.js

@@ -0,0 +1,144 @@
+export const SIGN_DATA = {
+  header: [
+    {
+      code: "courseName",
+      name: "课程",
+      disabled: true,
+      enable: true
+    },
+    {
+      code: "paperNumber",
+      name: "试卷编号",
+      disabled: false,
+      enable: true
+    },
+    {
+      code: "examTime",
+      name: "考试时间",
+      disabled: true,
+      enable: true
+    },
+    {
+      code: "examTime",
+      name: "考试地点",
+      disabled: true,
+      enable: true
+    },
+    {
+      code: "examTime",
+      name: "应考人数",
+      disabled: true,
+      enable: true
+    },
+    {
+      code: "examTime",
+      name: "实考人数",
+      disabled: true,
+      enable: true
+    }
+  ],
+  body: [
+    {
+      code: "studentName",
+      name: "姓名",
+      disabled: false,
+      enable: true
+    },
+    {
+      code: "studentCode",
+      name: "学号",
+      disabled: false,
+      enable: true
+    },
+    {
+      code: "clazzName",
+      name: "班级",
+      disabled: false,
+      enable: false
+    },
+    {
+      code: "ticketNumber",
+      name: "考号",
+      disabled: false,
+      enable: false
+    }
+  ]
+};
+
+export const PACKAGE_DATA = [
+  {
+    code: "examDate",
+    name: "考试日期",
+    disabled: true,
+    enable: true
+  },
+  {
+    code: "examTime",
+    name: "考试时间",
+    disabled: true,
+    enable: true
+  },
+  {
+    code: "courseCode",
+    name: "课程代码",
+    disabled: true,
+    enable: true
+  },
+  {
+    code: "paperNumber",
+    name: "试卷编号",
+    disabled: true,
+    enable: true
+  },
+  {
+    code: "examPlace",
+    name: "考点",
+    disabled: true,
+    enable: true
+  },
+  {
+    code: "examRoom",
+    name: "考场",
+    disabled: true,
+    enable: true
+  },
+  {
+    code: "collegeName",
+    name: "学院",
+    disabled: false,
+    enable: false
+  },
+  {
+    code: "majorName",
+    name: "专业",
+    disabled: false,
+    enable: false
+  },
+  {
+    code: "clazzName",
+    name: "班级",
+    disabled: false,
+    enable: false
+  }
+];
+
+// acorn = {
+//   code: 200,
+//   message: "成功",
+//   data: [
+//     { name: "STUDENT_CODE", ordinal: 0, code: "studentCode", desc: "学号" },
+//     { name: "TICKET_NUMBER", ordinal: 1, code: "ticketNumber", desc: "考号" },
+//     { name: "SITE_NUMBER", ordinal: 2, code: "siteNumber", desc: "座位号" },
+//     { name: "STUDENT_NAME", ordinal: 3, code: "studentName", desc: "姓名" },
+//     { name: "COURSE_CODE", ordinal: 4, code: "courseCode", desc: "课程代码" },
+//     { name: "COURSE_NAME", ordinal: 5, code: "courseName", desc: "课程名称" },
+//     { name: "PAPER_NUMBER", ordinal: 6, code: "paperNumber", desc: "试卷编号" },
+//     { name: "EXAM_PLACE", ordinal: 7, code: "examPlace", desc: "考点" },
+//     { name: "EXAM_ROOM", ordinal: 8, code: "examRoom", desc: "考场" },
+//     { name: "EXAM_DATE", ordinal: 9, code: "examDate", desc: "考试日期" },
+//     { name: "EXAM_TIME", ordinal: 10, code: "examTime", desc: "考试时间" },
+//     { name: "COLLEGE_NAME", ordinal: 11, code: "collegeName", desc: "学院" },
+//     { name: "MAJOR_NAME", ordinal: 12, code: "majorName", desc: "专业" },
+//     { name: "CLAZZ_NAME", ordinal: 13, code: "clazzName", desc: "班级" }
+//   ]
+// };

+ 38 - 1
src/modules/base/components/ModifyPrintTemplate.vue

@@ -59,7 +59,41 @@
           ></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item prop="attachmentId" label="上传模板文件:">
+      <el-form-item
+        v-if="modalForm.classify === 'SIGN'"
+        label="显示字段:"
+        required
+      >
+        <el-checkbox
+          v-for="field in signDatas.header"
+          :key="field.code"
+          v-model="field.enable"
+          :disabled="field.disabled"
+          >{{ field.name }}</el-checkbox
+        >
+        <el-divider></el-divider>
+        <el-checkbox
+          v-for="field in signDatas.body"
+          :key="field.code"
+          v-model="field.enable"
+          :disabled="field.disabled"
+          >{{ field.name }}</el-checkbox
+        >
+      </el-form-item>
+      <el-form-item
+        v-else-if="modalForm.classify === 'PACKAGE'"
+        label="显示字段:"
+        required
+      >
+        <el-checkbox
+          v-for="field in packageDatas"
+          :key="field.code"
+          v-model="field.enable"
+          :disabled="field.disabled"
+          >{{ field.name }}</el-checkbox
+        >
+      </el-form-item>
+      <el-form-item v-else prop="attachmentId" label="上传模板文件:">
         <upload-file-view
           :upload-data="uploadData"
           :upload-url="uploadUrl"
@@ -85,6 +119,7 @@ import { updateTemplate } from "../api";
 import { attachmentDetail } from "../../login/api";
 import UploadFileView from "@/components/UploadFileView";
 import { TEMPLATE_TYPE } from "@/constants/enumerate";
+import { PACKAGE_DATA, SIGN_DATA } from "@/constants/printTemplateData";
 
 const initModalForm = {
   id: null,
@@ -167,6 +202,8 @@ export default {
         ]
       },
       TEMPLATE_TYPE,
+      packageDatas: [...PACKAGE_DATA],
+      signDatas: { ...SIGN_DATA },
       // upload
       uploadUrl: "/api/admin/common/file/upload",
       uploadData: {

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

@@ -6,11 +6,11 @@
         <el-button
           type="success"
           icon="el-icon-download"
-          v-if="checkPrivilege('button', 'export')"
+          v-if="checkPrivilege('button', 'import')"
           ><a :href="downloadUrl" :download="dfilename">模板下载</a></el-button
         >
         <upload-button
-          v-if="checkPrivilege('button', 'export')"
+          v-if="checkPrivilege('button', 'import')"
           btn-icon="el-icon-circle-plus-outline"
           btn-content="导入组织架构"
           btn-type="success"

+ 74 - 21
src/modules/exam/components/createExamAndPrintTask/InfoPrintTask.vue

@@ -92,7 +92,36 @@
             }}份,备用{{ packageInfos.paperBackupCount }}份)
           </p>
         </div>
-        <el-button type="primary" @click="toAdd">新增考试对象</el-button>
+        <div>
+          <el-button
+            v-if="checkPrivilege('button', 'ExamTaskStudentObjectImport')"
+            type="success"
+            icon="el-icon-download"
+            ><a :href="downloadUrl" :download="dfilename"
+              >模板下载</a
+            ></el-button
+          >
+          <upload-button
+            v-if="checkPrivilege('button', 'ExamTaskStudentObjectImport')"
+            btn-icon="el-icon-circle-plus-outline"
+            btn-content="批量导入"
+            btn-type="success"
+            :upload-url="uploadUrl"
+            :upload-data="uploadData"
+            :format="['xls', 'xlsx']"
+            accept=".xls,.xlsx"
+            @valid-error="validError"
+            @upload-success="uploadSuccess"
+          >
+          </upload-button>
+          <el-button
+            v-if="checkPrivilege('button', 'ExamTaskStudentObject')"
+            type="primary"
+            :disabled="studentUploaded && tableData.length"
+            @click="toAdd"
+            >新增考试对象</el-button
+          >
+        </div>
       </div>
       <el-table ref="TableList" :data="tableData" border>
         <el-table-column type="index" width="50" label="卷袋序号">
@@ -189,7 +218,7 @@
     <!-- ModifyExamStudent -->
     <modify-exam-student
       ref="ModifyExamStudent"
-      :selected-ids="selectedStudentIds"
+      :disabled-ids="disabledStudentIds"
       :course-id="infoExamTask.courseId"
       @modified="examStudentModified"
     ></modify-exam-student>
@@ -208,10 +237,11 @@ import { listTaskPrintHouse } from "../../api";
 import ModifyExamStudent from "./ModifyExamStudent";
 import PreviewTaskStudent from "./PreviewTaskStudent";
 import { mapState, mapMutations } from "vuex";
+import UploadButton from "@/components/UploadButton";
 
 export default {
   name: "info-print-task",
-  components: { ModifyExamStudent, PreviewTaskStudent },
+  components: { ModifyExamStudent, PreviewTaskStudent, UploadButton },
   data() {
     return {
       modalForm: {
@@ -235,11 +265,20 @@ export default {
         paperBackupCount: 0
       },
       selectedStudentIds: [],
+      disabledStudentIds: [],
       examStudentList: [],
       // date-picker
       curCreateTime: [],
       createDate: "",
-      createTime: []
+      createTime: [],
+      // import
+      uploadUrl: "/api/admin/exam/task/exam_task_exam_student_import",
+      uploadData: {
+        examObjectType: "IMPORT_STUDENT"
+      },
+      downloadUrl: "/temps/studentTemplate.xlsx",
+      dfilename: "学生导入模板.xlsx",
+      studentUploaded: false
     };
   },
   computed: {
@@ -429,7 +468,7 @@ export default {
         return;
       }
 
-      this.selectedStudentIds = this.getTabelStudentIds();
+      this.disabledStudentIds = this.getTabelStudentIds();
       this.$refs.ModifyExamStudent.open();
     },
     getTabelStudentIds() {
@@ -445,6 +484,7 @@ export default {
       let modalFormData = { ...this.modalForm };
       delete modalFormData.printHouseId;
       let data = {
+        id: "",
         examPlace: "",
         examRoom: "",
         classId: "",
@@ -465,22 +505,24 @@ export default {
       return data;
     },
     examStudentModified(selectedStudents) {
-      let tableMap = {};
-      const initTableRow = this.getInitTableRow();
-      this.tableData.forEach(item => {
-        tableMap[item.classId] = item;
+      if (this.studentUploaded) {
+        this.tableData = [];
+        this.studentUploaded = false;
+      }
+      let examTaskStudentObjectParamList = [];
+      selectedStudents.forEach(item => {
+        examTaskStudentObjectParamList.push(...item.children);
       });
-
-      this.tableData = selectedStudents.map(item => {
-        const prevData = tableMap[item.classId] || initTableRow;
-        return this.$objAssign(prevData, {
-          backupCount: this.infoExamPrintPlan.backupCount,
-          classId: item.classId,
-          className: item.className,
-          studentCount: item.children.length,
-          examTaskStudentObjectParamList: item.children
-        });
+      let tableRow = this.$objAssign(this.getInitTableRow(), {
+        id: this.$randomCode(),
+        classId: selectedStudents.map(item => item.classId).join(),
+        className: selectedStudents.map(item => item.className).join(),
+        backupCount: this.infoExamPrintPlan.backupCount,
+        studentCount: examTaskStudentObjectParamList.length,
+        examTaskStudentObjectParamList
       });
+      this.tableData.push(tableRow);
+
       this.updatePackageInfos();
     },
     toDelete(row) {
@@ -490,16 +532,27 @@ export default {
       this.updatePackageInfos();
     },
     toViewStudent(row) {
-      console.log(row);
+      // console.log(row);
       this.examStudentList = row.examTaskStudentObjectParamList.map(item => {
         return {
           id: item.studentId,
           studentName: item.studentName,
           studentCode: item.studentCode,
-          className: row.className
+          className: item.basicClazzName
         };
       });
       this.$refs.PreviewTaskStudent.open();
+    },
+    // import
+    validError(errorData) {
+      this.$message.error(errorData.message);
+    },
+    uploadSuccess(res) {
+      this.studentUploaded = true;
+      console.log(res.data);
+      this.$message.success("导入成功!");
+      // this.getStudents("BASIC_CLAZZ_STUDENT");
+      // const selectedUsers = this.parseStudentData(res.data);
     }
   }
 };

+ 27 - 60
src/modules/exam/components/createExamAndPrintTask/ModifyExamStudent.vue

@@ -16,30 +16,13 @@
         :key="key"
         size="medium"
         :type="examObjectType === key ? 'primary' : 'default'"
+        :disabled="selectedExamObjectType && selectedExamObjectType !== key"
         @click="selectMenu(key)"
         >{{ val }}
       </el-button>
     </div>
 
-    <div v-if="isExportType">
-      <el-button type="success" icon="el-icon-download"
-        ><a :href="downloadUrl" :download="dfilename">模板下载</a></el-button
-      >
-      <upload-button
-        btn-icon="el-icon-circle-plus-outline"
-        btn-content="批量导入"
-        btn-type="success"
-        :upload-url="uploadUrl"
-        :upload-data="uploadData"
-        :format="['xls', 'xlsx']"
-        accept=".xls,.xlsx"
-        @valid-error="validError"
-        @upload-success="uploadSuccess"
-      >
-      </upload-button>
-    </div>
-
-    <el-row v-else type="flex" :gutter="10">
+    <el-row type="flex" :gutter="10">
       <el-col :span="12">
         <h3 class="user-part-title">班级/学生</h3>
         <div class="user-tree">
@@ -80,12 +63,9 @@
         </div>
       </el-col>
     </el-row>
-    <p v-show="!selectValid" class="tips-info tips-error"></p>
 
     <div slot="footer">
-      <el-button type="primary" :disabled="!selectValid" @click="submit"
-        >确认</el-button
-      >
+      <el-button type="primary" @click="submit">确认</el-button>
       <el-button @click="cancel">取消</el-button>
     </div>
   </el-dialog>
@@ -93,18 +73,16 @@
 
 <script>
 import { uploadOrFindExamTaskStudent } from "../../api";
-import UploadButton from "@/components/UploadButton";
 
 const EXAM_OBJECT_TYPE = {
   TEACH_CLAZZ_STUDENT: "我教课程选择",
-  BASIC_CLAZZ_STUDENT: "学生库选择",
-  IMPORT_STUDENT: "批量导入"
+  BASIC_CLAZZ_STUDENT: "学生库选择"
 };
 
 export default {
   name: "modify-exam-student",
   props: {
-    selectedIds: {
+    disabledIds: {
       type: Array,
       default() {
         return [];
@@ -115,7 +93,7 @@ export default {
       default: ""
     }
   },
-  components: { UploadButton },
+  components: {},
   data() {
     return {
       modalIsShow: false,
@@ -125,27 +103,16 @@ export default {
         TEACH_CLAZZ_STUDENT: [],
         BASIC_CLAZZ_STUDENT: []
       },
+      selectedExamObjectType: null,
       userTree: [],
       selectedUsers: [],
-      selectValid: true,
       defaultProps: {
         children: "children",
-        label: "label"
-      },
-      // import
-      uploadUrl: "/api/admin/exam/task/find_exam_task_student_object",
-      uploadData: {
-        examObjectType: "IMPORT_STUDENT"
-      },
-      downloadUrl: "/temps/studentTemplate.xlsx",
-      dfilename: "学生导入模板.xlsx"
+        label: "label",
+        disabled: "disabled"
+      }
     };
   },
-  computed: {
-    isExportType() {
-      return this.examObjectType === "IMPORT_STUDENT";
-    }
-  },
   methods: {
     async getStudents(examObjectType) {
       let datas = {
@@ -172,30 +139,34 @@ export default {
         nitem.children = item.studentInfoList.map(elem => {
           return {
             ...elem,
+            disabled: this.disabledIds.includes(elem.id),
             isUser: true,
             id: elem.studentId,
             label: elem.studentName,
             studentClazzType: item.studentClazzType
           };
         });
+        nitem.disabled = !nitem.children.some(elem => !elem.disabled);
 
         return nitem;
       });
     },
     selectMenu(val) {
       this.examObjectType = val;
+      this.$refs.UserTree.setCheckedKeys([]);
       if (val === "IMPORT_STUDENT") return;
 
       this.selectedUsers = [];
 
       if (this.dataTree[val].length) {
         this.userTree = this.dataTree[val];
+        this.updateUserTreeDisableInfo();
       } else {
         this.getStudents();
       }
     },
     checkChange() {
-      console.log("check click");
+      // console.log("check click");
       let selectedKeys = this.$refs.UserTree.getCheckedKeys(true);
       let selectedUsers = [];
       this.userTree.forEach(item => {
@@ -212,7 +183,7 @@ export default {
       this.selectedUsers = selectedUsers;
     },
     removeSelectStudent(node) {
-      console.log("node remove");
+      // console.log("node remove");
       this.$refs.UserSelectedTree.remove(node);
       let selectedUserIds = [];
       this.selectedUsers.forEach(item => {
@@ -227,9 +198,16 @@ export default {
       if (this.examObjectType === "TEACH_CLAZZ_STUDENT") {
         await this.getStudents();
       }
-      this.$refs.UserTree.setCheckedKeys(this.selectedIds);
-      this.$nextTick(() => {
-        this.checkChange();
+      this.selectedUsers = [];
+      this.$refs.UserTree.setCheckedKeys([]);
+      this.updateUserTreeDisableInfo();
+    },
+    updateUserTreeDisableInfo() {
+      this.userTree.forEach(item => {
+        item.children.forEach(elem => {
+          elem.disabled = this.disabledIds.includes(elem.id);
+        });
+        item.disabled = !item.children.some(elem => !elem.disabled);
       });
     },
     cancel() {
@@ -238,23 +216,12 @@ export default {
     open() {
       this.modalIsShow = true;
     },
-    // import
-    validError(errorData) {
-      this.$message.error(errorData.message);
-    },
-    uploadSuccess(res) {
-      // console.log(res);
-      this.$message.success("导入成功!");
-      this.getStudents("BASIC_CLAZZ_STUDENT");
-      const selectedUsers = this.parseStudentData(res.data);
-      this.$emit("modified", selectedUsers);
-      this.cancel();
-    },
     submit() {
       if (!this.selectedUsers.length) {
         this.$message.error("请选择考试对象");
         return;
       }
+      this.selectedExamObjectType = this.examObjectType;
       this.$emit("modified", this.selectedUsers);
       this.cancel();
     }

+ 1 - 0
src/views/HomePage.vue

@@ -127,6 +127,7 @@ export default {
 
       // 代办任务判断
       if (this.privilegeMap["WaitTask"]) {
+        this.hasWaitTaskPrivilege = true;
         this.getWaitTaskData();
       }
     },