zhangjie 2 vuotta sitten
vanhempi
commit
ef3045514e

+ 89 - 93
src/constants/printTemplateData.js

@@ -71,99 +71,95 @@ export const SIGN_DATA = {
   ]
 };
 
-export const PACKAGE_DATA = {
-  title: [
-    {
-      code: "semesterName",
-      name: "学期",
-      disabled: false,
-      enable: false
-    }
-  ],
-  basic: [
-    {
-      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: false,
-      enable: false
-    },
-    {
-      code: "examRoom",
-      name: "考场",
-      disabled: false,
-      enable: false
-    },
-    {
-      code: "collegeName",
-      name: "学院",
-      disabled: false,
-      enable: false
-    },
-    {
-      code: "majorName",
-      name: "专业",
-      disabled: false,
-      enable: false
-    },
-    {
-      code: "clazzName",
-      name: "班级",
-      disabled: false,
-      enable: false
-    },
-    {
-      code: "campusName",
-      name: "校区",
-      disabled: false,
-      enable: false
-    },
-    {
-      code: "examClassroomName",
-      name: "考试教室",
-      disabled: false,
-      enable: false
-    },
-    { name: "开课学院", code: "BCollege", disabled: false, enable: false },
-    { name: "派监考学院", code: "STICollege", disabled: false, enable: false },
-    { name: "上课教师", code: "CTeacher", disabled: false, enable: false },
-    {
-      code: "paperCount",
-      name: "试卷数量",
-      disabled: false,
-      enable: false
-    },
-    {
-      code: "examCount",
-      name: "应考人数",
-      disabled: true,
-      enable: true
-    },
-    {
-      code: "actualExamCount",
-      name: "实考人数",
-      disabled: true,
-      enable: true
-    }
-  ]
-};
+export const PACKAGE_DATA = [
+  {
+    code: "semesterName",
+    name: "学期",
+    disabled: false,
+    enable: false
+  },
+  {
+    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: false,
+    enable: false
+  },
+  {
+    code: "examRoom",
+    name: "考场",
+    disabled: false,
+    enable: false
+  },
+  {
+    code: "collegeName",
+    name: "学院",
+    disabled: false,
+    enable: false
+  },
+  {
+    code: "majorName",
+    name: "专业",
+    disabled: false,
+    enable: false
+  },
+  {
+    code: "clazzName",
+    name: "班级",
+    disabled: false,
+    enable: false
+  },
+  {
+    code: "campusName",
+    name: "校区",
+    disabled: false,
+    enable: false
+  },
+  {
+    code: "examClassroomName",
+    name: "考试教室",
+    disabled: false,
+    enable: false
+  },
+  { name: "开课学院", code: "BCollege", disabled: false, enable: false },
+  { name: "派监考学院", code: "STICollege", disabled: false, enable: false },
+  { name: "上课教师", code: "CTeacher", disabled: false, enable: false },
+  {
+    code: "paperCount",
+    name: "试卷数量",
+    disabled: false,
+    enable: false
+  },
+  {
+    code: "examCount",
+    name: "应考人数",
+    disabled: true,
+    enable: true
+  },
+  {
+    code: "actualExamCount",
+    name: "实考人数",
+    disabled: true,
+    enable: true
+  }
+];
 
 // acorn = {
 //   code: 200,

+ 23 - 39
src/modules/base/components/RuleExam.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="rule-exam part-box part-box-pad part-box-border">
+  <div class="rule-exam part-box part-box-pad">
     <h4 class="part-box-tips">变量印刷考务字段配置:</h4>
     <el-form
       ref="modalFormComp"
@@ -27,7 +27,7 @@
               <el-checkbox
                 v-model="field.enable"
                 class="label-item-content"
-                @change="validateExtendFields"
+                @change="checkRuleChange"
                 >{{ field.name }}</el-checkbox
               >
               <i
@@ -50,22 +50,9 @@
           step-strictly
           :controls="false"
           style="width: 100px;"
+          @change="checkRuleChange"
         ></el-input-number>
       </el-form-item>
-      <el-form-item label="是否启用入库审核:" required>
-        <el-switch v-model="modalForm.review" inactive-color="#dcdfe6">
-        </el-switch>
-      </el-form-item>
-      <el-form-item label="提交印刷方式:" required>
-        <el-radio-group v-model="modalForm.printMethod">
-          <el-radio
-            v-for="(val, key) in CONFIRM_PRINT_TYPE"
-            :key="key"
-            :label="key"
-            >{{ val }}</el-radio
-          >
-        </el-radio-group>
-      </el-form-item>
       <el-form-item>
         <el-button
           type="primary"
@@ -74,6 +61,7 @@
           @click="submit"
           >保存</el-button
         >
+        <span v-if="ruleChanged" class="tips-info tips-error">(有修改)</span>
       </el-form-item>
     </el-form>
 
@@ -84,15 +72,11 @@
 
 <script>
 import ModifyField from "../components/ModifyField";
-import { CONFIRM_PRINT_TYPE } from "@/constants/enumerate";
 import { examRuleDetail, saveExamRule } from "../api";
-import { getEnums } from "../../login/api";
 
 const initModalForm = {
   id: null,
-  review: true,
   examNumberDigit: 8,
-  printMethod: "AUTO",
   requiredFields: "[]",
   extendFields: "[]"
 };
@@ -104,7 +88,9 @@ export default {
     return {
       modalForm: { ...initModalForm },
       isSubmit: false,
-      CONFIRM_PRINT_TYPE,
+      examRule: {},
+      ruleChanged: false,
+      prevModalFrom: "",
       rules: {
         examNumberDigit: [
           {
@@ -121,40 +107,38 @@ export default {
   },
   methods: {
     async init() {
-      const requiredFields = await getEnums("REQUIRED_FIELDS");
-      const examRule = await examRuleDetail();
-      this.modalForm = Object.assign({}, initModalForm, examRule || {});
+      this.examRule = await examRuleDetail();
       this.modalForm.examNumberDigit =
-        this.modalForm.examNumberDigit || initModalForm.examNumberDigit;
+        this.examRule.examNumberDigit || initModalForm.examNumberDigit;
+      this.modalForm.requiredFields = JSON.parse(this.examRule.requiredFields);
+      if (this.modalForm.extendFields)
+        this.modalForm.extendFields = JSON.parse(this.examRule.extendFields);
+
+      if (!this.examRule.id) {
+        this.$message.warning("当前系统还没有考务规则,请修改保存!");
+      }
 
-      this.modalForm.requiredFields = requiredFields.map(item => {
-        return {
-          code: item.code,
-          name: item.desc,
-          enable: true
-        };
-      });
-      // console.log(this.modalForm.extendFields);
-      this.modalForm.extendFields = JSON.parse(this.modalForm.extendFields);
+      this.prevModalFrom = JSON.stringify(this.modalForm);
     },
-    validateRequiredFields() {
-      this.$refs.modalFormComp.validateField("requiredFields");
+    checkRuleChange() {
+      this.ruleChanged = this.prevModalFrom !== JSON.stringify(this.modalForm);
     },
-    validateExtendFields() {
-      this.$refs.modalFormComp.validateField("extendFields");
+    checkRuleExist() {
+      return !!this.examRule.id;
     },
     toAddField() {
       this.$refs.ModifyField.open();
     },
     addField(field) {
       this.modalForm.extendFields.push({ ...field });
+      this.checkRuleChange();
     },
     deleteField(field) {
       const index = this.modalForm.extendFields.findIndex(
         item => item.code === field.code
       );
       if (index !== -1) this.modalForm.extendFields.splice(index, 1);
-      this.validateExtendFields();
+      this.checkRuleChange();
     },
     async submit() {
       const valid = await this.$refs.modalFormComp.validate().catch(() => {});

+ 125 - 0
src/modules/base/components/RuleFieldEdit.vue

@@ -0,0 +1,125 @@
+<template>
+  <div class="rule-field-edit">
+    <div class="field-part field-part-left">
+      <div class="field-title">
+        <el-checkbox v-model="sourceAll">来源字段</el-checkbox>
+      </div>
+      <div class="field-body">
+        <div v-for="item in sourceList" :key="item.code" class="field-item">
+          <el-checkbox v-model="item.checked">{{ item.name }}</el-checkbox>
+        </div>
+      </div>
+    </div>
+    <div class="field-part field-part-action">
+      <div>
+        <el-button
+          size="small"
+          icon="el-icon-arrow-left"
+          @click="toLeft"
+        ></el-button>
+        <el-button
+          size="small"
+          icon="el-icon-arrow-left"
+          @click="toRight"
+        ></el-button>
+      </div>
+    </div>
+    <div class="field-part field-part-right">
+      <div class="field-title">
+        <el-checkbox v-model="targetAll">目的字段</el-checkbox>
+      </div>
+      <div class="field-body">
+        <div v-for="item in targetList" :key="item.code" class="field-item">
+          <el-checkbox v-model="item.checked">{{ item.name }}</el-checkbox>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "rule-field-edit",
+  props: {
+    value: {
+      type: Array,
+      default() {
+        return [];
+      }
+    },
+    data: {
+      type: Array,
+      default() {
+        return [];
+      }
+    }
+  },
+  data() {
+    return {
+      sourceAll: false,
+      sourceList: [],
+      targetAll: false,
+      targetList: []
+    };
+  },
+  methods: {
+    initData() {
+      const fields = this.data.map(item => {
+        return {
+          ...item,
+          checked: false
+        };
+      });
+      this.sourceList = fields.filter(item => !this.value.includes(item.code));
+      this.targetList = fields.filter(item => this.value.includes(item.code));
+    },
+    toLeft() {
+      const checkedFields = this.targetAll.filter(item => item.checked);
+      if (!checkedFields.length) {
+        this.$message.error("请选择目的字段!");
+        return;
+      }
+
+      this.sourceList.push(
+        ...checkedFields.map(item => {
+          return {
+            ...item,
+            checked: false
+          };
+        })
+      );
+      this.emitChange();
+    },
+    toRight() {
+      const checkedFields = this.sourceList.filter(item => item.checked);
+      if (!checkedFields.length) {
+        this.$message.error("请选择来源字段!");
+        return;
+      }
+
+      this.targetList.push(
+        ...checkedFields.map(item => {
+          return {
+            ...item,
+            checked: false
+          };
+        })
+      );
+      this.emitChange();
+    },
+    emitChange() {
+      const targetFields = this.targetList.map(item => {
+        return {
+          name: item.name,
+          code: item.code
+        };
+      });
+      this.$emit(
+        "input",
+        this.targetList.map(item => item.code)
+      );
+      this.$emit("change", targetFields);
+    }
+  }
+};
+</script>

+ 92 - 3
src/modules/base/components/RulePackage.vue

@@ -1,13 +1,102 @@
 <template>
-  <div class="rule-package"></div>
+  <div class="rule-package part-box part-box-pad">
+    <h4 class="part-box-tips">卷袋贴字段配置:</h4>
+    <el-form
+      ref="modalFormComp"
+      :model="modalForm"
+      :rules="rules"
+      label-width="170px"
+    >
+      <el-form-item prop="selectCodes" label="卷袋贴显示字段:">
+        <rule-field-edit
+          v-model="modalForm.selectCodes"
+          :data="fieldSources"
+        ></rule-field-edit>
+      </el-form-item>
+      <el-form-item>
+        <el-button
+          type="primary"
+          :disabled="isSubmit"
+          style="width: 140px"
+          @click="submit"
+          >保存</el-button
+        >
+      </el-form-item>
+    </el-form>
+  </div>
 </template>
 
 <script>
+import { examRuleDetail, saveExamRule } from "../api";
+import RuleFieldEdit from "./RuleFieldEdit.vue";
+
 export default {
   name: "rule-package",
+  components: {
+    RuleFieldEdit
+  },
   data() {
-    return {};
+    return {
+      isSubmit: false,
+      examRule: {},
+      fieldSources: [],
+      modalForm: {
+        selectCodes: []
+      },
+      rules: {
+        selectCodes: [
+          {
+            required: true,
+            validator: (rule, value, callback) => {
+              if (!value || !value.length) {
+                return callback(new Error(`请选择卷袋贴显示字段`));
+              }
+
+              callback();
+            },
+            trigger: "change"
+          }
+        ]
+      }
+    };
   },
-  methods: {}
+  methods: {
+    async getFields() {
+      const examRule = await examRuleDetail();
+      this.examRule = examRule;
+      let fields = [...JSON.parse(examRule.requiredFields)];
+      if (!examRule.extendFields)
+        fields.push(...JSON.parse(examRule.extendFields));
+
+      this.fieldSources = fields
+        .filter(item => item.enable)
+        .map(item => {
+          return {
+            code: item.code,
+            name: item.name
+          };
+        });
+
+      this.modalForm.selectCodes = examRule.packageScope
+        ? JSON.parse(examRule.packageScope).map(item => item.code)
+        : [];
+    },
+    async submit() {
+      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
+      if (!valid) return;
+
+      if (this.isSubmit) return;
+      this.isSubmit = true;
+      const packageScope = this.fieldSources.filter(item =>
+        this.modalForm.selectCodes.includes(item.code)
+      );
+      this.examRule.packageScope = JSON.stringify(packageScope);
+      const data = await saveExamRule(this.examRule).catch(() => {});
+      this.isSubmit = false;
+      if (!data) return;
+
+      this.$message.success("保存成功!");
+    }
+  }
 };
 </script>

+ 134 - 3
src/modules/base/components/RuleSign.vue

@@ -1,13 +1,144 @@
 <template>
-  <div class="rule-sign"></div>
+  <div class="rule-sign part-box part-box-pad">
+    <h4 class="part-box-tips">签到表字段配置:</h4>
+    <el-form
+      ref="modalFormComp"
+      :model="modalForm"
+      :rules="rules"
+      label-width="170px"
+    >
+      <el-form-item prop="basicCodes" label="签到表表头字段:">
+        <rule-field-edit
+          v-model="modalForm.basicCodes"
+          :data="basicSources"
+        ></rule-field-edit>
+      </el-form-item>
+      <el-form-item prop="tableCodes" label="签到表考生信息字段:">
+        <rule-field-edit
+          v-model="modalForm.tableCodes"
+          :data="tableSources"
+        ></rule-field-edit>
+      </el-form-item>
+      <el-form-item>
+        <el-button
+          type="primary"
+          :disabled="isSubmit"
+          style="width: 140px"
+          @click="submit"
+          >保存</el-button
+        >
+      </el-form-item>
+    </el-form>
+  </div>
 </template>
 
 <script>
+import { examRuleDetail, saveExamRule } from "../api";
+import RuleFieldEdit from "./RuleFieldEdit.vue";
+
 export default {
   name: "rule-sign",
+  components: {
+    RuleFieldEdit
+  },
   data() {
-    return {};
+    return {
+      isSubmit: false,
+      examRule: {},
+      basicSources: [],
+      tableSources: [],
+      modalForm: {
+        basicCodes: [],
+        tableCodes: []
+      },
+      stdInfoCodes: [
+        "siteNumber",
+        "studentName",
+        "studentCode",
+        "clazzName",
+        "ticketNumber"
+      ],
+      rules: {
+        basicCodes: [
+          {
+            required: true,
+            validator: (rule, value, callback) => {
+              if (!value || !value.length) {
+                return callback(new Error(`请选择签到表表头字段`));
+              }
+
+              callback();
+            },
+            trigger: "change"
+          }
+        ],
+        tableCodes: [
+          {
+            required: true,
+            validator: (rule, value, callback) => {
+              if (!value || !value.length) {
+                return callback(new Error(`请选择签到表考生信息字段`));
+              }
+
+              callback();
+            },
+            trigger: "change"
+          }
+        ]
+      }
+    };
   },
-  methods: {}
+  methods: {
+    async getFields() {
+      const examRule = await examRuleDetail();
+      this.examRule = examRule;
+      let fields = [...JSON.parse(examRule.requiredFields)];
+      if (!examRule.extendFields)
+        fields.push(...JSON.parse(examRule.extendFields));
+
+      const fieldSources = fields
+        .filter(item => item.enable)
+        .map(item => {
+          return {
+            code: item.code,
+            name: item.name
+          };
+        });
+      this.basicSources = fieldSources.filter(
+        item => !this.stdInfoCodes.includes(item.code)
+      );
+      this.tableSources = fieldSources.filter(item =>
+        this.stdInfoCodes.includes(item.code)
+      );
+
+      const signScope = examRule.signScope
+        ? JSON.parse(examRule.signScope)
+        : { basic: [], table: [] };
+      this.modalForm.basicCodes = signScope.basic.map(item => item.code);
+      this.modalForm.tableCodes = signScope.table.map(item => item.code);
+    },
+    async submit() {
+      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
+      if (!valid) return;
+
+      if (this.isSubmit) return;
+      this.isSubmit = true;
+      const baiscFields = this.basicSources.filter(item =>
+        this.modalForm.basicCodes.includes(item.code)
+      );
+      const tableFields = this.tableSources.filter(item =>
+        this.modalForm.tableCodes.includes(item.code)
+      );
+      this.examRule.signScope = JSON.stringify({
+        basic: baiscFields,
+        table: tableFields
+      });
+      const data = await saveExamRule(this.examRule).catch(() => {});
+      this.isSubmit = false;
+      if (!data) return;
+
+      this.$message.success("保存成功!");
+    }
+  }
 };
 </script>

+ 5 - 0
src/modules/base/views/CommonRule.vue

@@ -12,6 +12,7 @@
     </div>
     <component
       v-if="checkPrivilege('button', 'add')"
+      ref="RuleDetail"
       :is="curMenu.component"
     ></component>
   </div>
@@ -44,6 +45,10 @@ export default {
   },
   methods: {
     selectMenu(item) {
+      if (item.id !== "1" && !this.$refs.RuleDetail.checkRuleExist()) {
+        this.$message.error("请先保存考务规则配置!");
+        return;
+      }
       this.curMenu = item;
     }
   }