zhangjie 1 年之前
父節點
當前提交
863b690eff

+ 4 - 1
card/assets/styles/card-design.scss

@@ -402,12 +402,15 @@
 
   .control-right {
     padding: 20px 20px 20px 0;
-    width: 240px;
     text-align: right;
     flex-grow: 0;
     .el-button {
       min-width: 75px;
     }
+    .tips-info {
+      display: inline-block;
+      margin-right: 10px;
+    }
   }
   .control-left {
     padding: 20px 0 20px 20px;

+ 7 - 0
card/components/CardDesign.vue

@@ -80,6 +80,9 @@
           >
         </div>
         <div class="control-right">
+          <div v-if="hasUnsubmitCont" class="tips-info tips-error">
+            <i class="el-icon-warning"></i>有未提交数据
+          </div>
           <el-button
             type="success"
             :loading="isSubmit"
@@ -299,6 +302,7 @@ export default {
       columnWidth: 0,
       isSubmit: false,
       canSave: false,
+      hasUnsubmitCont: false,
     };
   },
   computed: {
@@ -544,6 +548,9 @@ export default {
     unloading() {
       this.isSubmit = false;
     },
+    updateUnsubmitStatus(status) {
+      this.hasUnsubmitCont = status;
+    },
   },
 };
 </script>

+ 1 - 0
card/mixins/exchange.js

@@ -391,6 +391,7 @@ export default {
       return JSON.stringify(
         {
           version: CARD_VERSION,
+          cardType: "STANDARD",
           cardConfig,
           pages: npages,
         },

+ 1 - 0
card/modules/free/cardFormatTransform.js

@@ -314,6 +314,7 @@ export function getPageModel({ cardConfig, pages }) {
   return JSON.stringify(
     {
       version: CARD_VERSION,
+      cardType: "FREE",
       cardConfig,
       pages: npages,
     },

+ 7 - 0
card/modules/free/components/CardFreeDesign.vue

@@ -94,6 +94,9 @@
           <el-button icon="el-icon-plus" @click="toAddPage"></el-button>
         </div>
         <div class="control-right">
+          <div v-if="hasUnsubmitCont" class="tips-info tips-error">
+            <i class="el-icon-warning"></i>有未提交数据
+          </div>
           <el-button
             type="success"
             :loading="isSubmit"
@@ -251,6 +254,7 @@ export default {
       columnWidth: 0,
       isSubmit: false,
       canSave: false,
+      hasUnsubmitCont: false,
     };
   },
   computed: {
@@ -408,6 +412,9 @@ export default {
     unloading() {
       this.isSubmit = false;
     },
+    updateUnsubmitStatus(status) {
+      this.hasUnsubmitCont = status;
+    },
   },
 };
 </script>

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

@@ -494,6 +494,10 @@ body {
   font-size: 14px;
   line-height: 20px;
   color: $--color-text-gray-2;
+
+  > i {
+    margin-right: 2px;
+  }
 }
 .tips-dark {
   color: $--color-text-gray;

+ 15 - 2
src/modules/base/components/ModifyExam.vue

@@ -15,13 +15,14 @@
       :model="modalForm"
       :rules="rules"
       :key="modalForm.id"
-      label-width="100px"
+      label-width="130px"
     >
       <el-form-item prop="name" label="考试名称:">
         <el-input
           v-model.trim="modalForm.name"
           placeholder="请输入考试名称"
           clearable
+          :disabled="isEdit"
         ></el-input>
         <p class="tips-info">示例:期末考试/期中考试/模拟考试</p>
       </el-form-item>
@@ -33,6 +34,16 @@
           style="width: 100%"
         ></semester-select>
       </el-form-item>
+      <el-form-item prop="autoSyncStudent" label="考务数据自动同步:">
+        <el-radio-group v-model="modalForm.autoSyncStudent">
+          <el-radio
+            v-for="item in OPEN_STATUS"
+            :key="item.label"
+            :label="item.value"
+            >{{ item.label }}</el-radio
+          >
+        </el-radio-group>
+      </el-form-item>
       <el-form-item prop="category" label="考试类型:">
         <el-radio-group v-model="modalForm.category">
           <el-radio v-for="(val, key) in EXAM_TYPE" :key="key" :label="key">{{
@@ -73,7 +84,7 @@
 
 <script>
 import { updateExam } from "../api";
-import { EXAM_TYPE, EXAM_MODE_TYPE } from "@/constants/enumerate";
+import { EXAM_TYPE, OPEN_STATUS, EXAM_MODE_TYPE } from "@/constants/enumerate";
 
 const initModalForm = {
   id: null,
@@ -81,6 +92,7 @@ const initModalForm = {
   semesterId: "",
   category: "OFFLINE",
   examModel: "MODEL1",
+  autoSyncStudent: false,
 };
 
 export default {
@@ -107,6 +119,7 @@ export default {
       isSubmit: false,
       modalForm: { ...initModalForm },
       EXAM_TYPE,
+      OPEN_STATUS,
       EXAM_MODE_TYPE,
       rules: {
         name: [

+ 3 - 4
src/modules/base/views/CardRuleManage.vue

@@ -73,10 +73,9 @@
           label="题卡规则名称"
           min-width="200"
         ></el-table-column>
-        <el-table-column prop="remark" label="备注">
-          <span slot-scope="scope">{{
-            scope.row.remark | defaultFieldFilter
-          }}</span>
+        <el-table-column prop="examNumberStyle" label="考号版式">
+        </el-table-column>
+        <el-table-column prop="examNubmerDigit" label="考号位数">
         </el-table-column>
         <el-table-column prop="enable" label="启用/禁用" width="100">
           <template slot-scope="scope">

+ 13 - 1
src/modules/base/views/ExamManage.vue

@@ -60,6 +60,17 @@
             {{ scope.row.category | examTypeFilter }}
           </span>
         </el-table-column>
+        <el-table-column prop="examModel" label="业务模式" width="100">
+          <template slot-scope="scope">
+            <el-tooltip
+              effect="dark"
+              :content="EXAM_MODE_TYPE[scope.row.examModel]"
+              placement="top-start"
+            >
+              <span>{{ scope.row.examModel }}</span>
+            </el-tooltip>
+          </template>
+        </el-table-column>
         <el-table-column prop="createTime" label="创建时间" width="170">
           <span slot-scope="scope">{{
             scope.row.createTime | timestampFilter
@@ -144,7 +155,7 @@
 
 <script>
 import { examListQuery, deleteExam, ableExam } from "../api";
-import { ABLE_TYPE } from "@/constants/enumerate";
+import { ABLE_TYPE, EXAM_MODE_TYPE } from "@/constants/enumerate";
 import ModifyExam from "../components/ModifyExam";
 import ModifyExamConfigDetail from "../components/ModifyExamConfigDetail";
 
@@ -158,6 +169,7 @@ export default {
         enable: "",
       },
       ABLE_TYPE,
+      EXAM_MODE_TYPE,
       current: 1,
       size: this.GLOBAL.pageSize,
       total: 0,

+ 1 - 0
src/modules/base/views/PrintPlanPushManage.vue

@@ -130,6 +130,7 @@
           type="selection"
           width="55"
           align="center"
+          fixed="left"
         ></el-table-column>
         <el-table-column prop="name" label="课程名称(代码)" min-width="180">
           <span slot-scope="scope"

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

@@ -35,13 +35,13 @@
         </el-table-column>
         <el-table-column class-name="action-column" label="操作" width="140">
           <template slot-scope="scope">
-            <el-button
+            <!-- <el-button
               v-if="checkPrivilege('link', 'edit')"
               class="btn-primary"
               type="text"
               @click="toEdit(scope.row)"
               >编辑</el-button
-            >
+            > -->
             <el-button
               v-if="checkPrivilege('link', 'enable')"
               :class="scope.row.enable ? 'btn-danger' : 'btn-primary'"

+ 13 - 2
src/modules/card/views/CardEdit.vue

@@ -31,6 +31,7 @@ import { examRuleDetail } from "../../base/api";
 import { getEnums } from "../../login/api";
 import { UNDERTAKING_BODY } from "../../../../card/enumerate";
 import timeMixin from "@/mixins/timeMixin";
+import { MD5 } from "@/plugins/md5";
 
 export default {
   name: "card-edit",
@@ -57,6 +58,7 @@ export default {
       cardPreviewUrl: "",
       canSave: false,
       dataReady: false,
+      lastStageCardContent: "",
       // card-preview-dialog
       viewType: "view",
       cardData: null,
@@ -80,6 +82,7 @@ export default {
     this.cardId = this.cardId || this.prepareTcPCard.id;
     this.cardType = this.prepareTcPCard.type || "CUSTOM";
     this.initCard();
+    this.openAutoSave();
   },
   methods: {
     openAutoSave() {
@@ -123,9 +126,12 @@ export default {
     async getCardTempDetail() {
       const detData = await cardDetail(this.cardId);
       // 可能存在题卡内容没有记录的情况
-      if (detData.content) {
-        this.cardContent = JSON.parse(detData.content);
+      if (detData.content || detData.stageContent) {
+        // TODO:
+        const content = detData.stageContent || detData.content;
+        this.cardContent = JSON.parse(content);
         this.cardName = detData.title;
+        this.lastStageCardContent = content;
       } else {
         let cardConfig = await this.getCardConfig();
         // 没有题卡内容时,直接创建新的内容
@@ -228,9 +234,13 @@ export default {
     async toSave(datas) {
       let cardInfo = this.getCardInfo(datas);
       cardInfo.status = "STAGE";
+      if (MD5(cardInfo.content) === MD5(this.lastStageCardContent)) return;
+
       const result = await saveCard(cardInfo, this.getRequestConfig()).catch(
         () => {}
       );
+      this.lastStageCardContent = cardInfo.content;
+      this.$refs.CardDesign.updateUnsubmitStatus(true);
       if (!result) return;
       this.cardId = result;
       this.$ls.set("cardId", this.cardId);
@@ -279,6 +289,7 @@ export default {
         this.cardName = "";
         this.cardId = result;
         this.$ls.set("cardId", this.cardId);
+        this.$refs.CardDesign.updateUnsubmitStatus(false);
         this.$message.success("提交成功!");
         this.goback();
       } else {

+ 4 - 0
src/plugins/filters.js

@@ -22,6 +22,7 @@ import {
   CARD_CREATE_METHOD_TYPE,
   FLOW_APPROVE_OPERATION_TYPE,
   ANALYSIS_BATCH_STATUS,
+  EXAM_NUMBER_STYLE,
   FLOW_TYPE,
 } from "../constants/enumerate";
 import { formatDate } from "../plugins/utils";
@@ -120,3 +121,6 @@ Vue.filter("flowTypeFilter", function (val) {
 Vue.filter("analysisBatchStatusFilter", function (val) {
   return ANALYSIS_BATCH_STATUS[val] || DEFAULT_FIELD;
 });
+Vue.filter("examNumberStyleFilter", function (val) {
+  return EXAM_NUMBER_STYLE[val] || DEFAULT_FIELD;
+});