zhangjie 4 년 전
부모
커밋
aacb406745

+ 2 - 1
src/assets/styles/base.less

@@ -285,8 +285,9 @@ h3.account-title {
 }
 .chart-box .chart-none {
   padding-top: 150px;
-  font-size: 30px;
+  font-size: 20px;
   text-align: center;
+  color: @dark-color-lighter;
 }
 .chart-box .chart-title {
   margin: 0;

+ 15 - 0
src/assets/styles/home.less

@@ -152,3 +152,18 @@
     }
   }
 }
+// 404 page
+.not-found {
+  &-body {
+    padding: 200px 20px 0;
+    text-align: center;
+    color: #555;
+
+    > h1 {
+      font-size: 100px;
+    }
+    p {
+      font-size: 16px;
+    }
+  }
+}

+ 6 - 0
src/assets/styles/main.less

@@ -572,3 +572,9 @@
     }
   }
 }
+
+// print page for export
+.print-box {
+  width: 210mm;
+  height: 297mm;
+}

+ 4 - 0
src/assets/styles/mark.less

@@ -181,6 +181,10 @@
     height: 90px;
     text-align: center;
   }
+  .task-tips {
+    font-size: 18px;
+    color: @dark-color-light;
+  }
   .task-action {
     overflow: hidden;
     > button {

+ 0 - 29
src/components/EchartRender.vue

@@ -343,8 +343,6 @@ export default {
     },
     getBarGroupOption(datas) {
       if (!datas.names.length) return;
-      const onePageMaxBarNum = 20;
-      const barNum = datas.names.length * datas.dataList.length;
       const xAxis = datas.dataList.map(function(item) {
         return item.name;
       });
@@ -360,15 +358,6 @@ export default {
           itemStyle: {
             barBorderRadius: 2
           }
-          // label: {
-          //   show: true,
-          //   position: "top",
-          //   fontSize: 12,
-          //   color: "#333",
-          //   formatter: function(params) {
-          //     return params.value.toFixed(2) + "%";
-          //   }
-          // }
         };
       });
 
@@ -443,24 +432,6 @@ export default {
         series: series
       };
 
-      if (barNum > onePageMaxBarNum) {
-        const zoomInitRange = Math.floor((onePageMaxBarNum * 100) / barNum);
-        options.grid.bottom = "18%";
-        options.dataZoom = [
-          {
-            type: "inside",
-            start: 0,
-            end: zoomInitRange
-          },
-          {
-            type: "slider",
-            start: 0,
-            end: zoomInitRange,
-            bottom: "0%"
-          }
-        ];
-      }
-
       return options;
     },
     getLineGroupOption(datas) {

+ 1 - 1
src/components/UploadButton.vue

@@ -131,7 +131,7 @@ export default {
 
       if (!this.autoUpload) {
         this.file = file;
-        return false;
+        return Promise.reject();
       }
 
       this.loading = true;

+ 1 - 1
src/modules/client-set/ClientAccountSet.vue

@@ -141,7 +141,7 @@ export default {
         loginName: row.loginName,
         enabled: !row.enabled
       });
-      row.enabled = !row.enabled;
+      this.users[row._index].enabled = !row.enabled;
     },
     toDelete(row) {
       this.$Modal.confirm({

+ 89 - 0
src/modules/exports/QualityAnalysisExport.vue

@@ -0,0 +1,89 @@
+<template>
+  <div class="quality-analysis-export">
+    <div class="print-box">
+      <h1>阅卷质量分析</h1>
+      <div class="quality-info">
+        <p>科目:速写</p>
+        <p>开始时间:速写</p>
+        <p>结束时间:速写</p>
+      </div>
+      <div class="print-chart">
+        <div class="print-chart-title"></div>
+        <div class="print-chart-body"></div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import {
+  levelsPropReport,
+  deviationReport,
+  distanceReport,
+  callbackReport
+} from "@/api";
+// import EchartRender from "@/components/EchartRender";
+import { filterObjNull } from "@/plugins/utils";
+
+export default {
+  name: "quality-analysis-export",
+  // components: { EchartRender },
+  data() {
+    return {};
+  },
+  methods: {
+    parseGroupBarData(datas) {
+      if (!datas.length) {
+        return { names: [], dataList: [] };
+      }
+      var names = datas[0].data.map(function(item) {
+        return item.markerName;
+      });
+      var dataList = datas.map(function(item) {
+        return {
+          name: item.name,
+          data: item.data.map(function(elem) {
+            return elem.prop;
+          })
+        };
+      });
+      return {
+        names: names,
+        dataList: dataList
+      };
+    },
+    parseBarData(datas) {
+      var names = [];
+      var dataList = [];
+      datas.map(function(item, index) {
+        names[index] = item.userName;
+        dataList[index] = item.sumCount;
+      });
+      return {
+        names: names,
+        dataList: dataList
+      };
+    },
+    async toSearch() {
+      const datas = filterObjNull({
+        ...this.filter
+      });
+      const requests = [
+        levelsPropReport(datas),
+        deviationReport(datas),
+        distanceReport(datas),
+        callbackReport(datas)
+      ];
+      const data = await Promise.all(requests);
+
+      this.levelsPropReportData = this.parseGroupBarData(data[0]);
+
+      this.deviationReportData = this.parseBarData(data[1]);
+
+      this.distanceReportData = this.parseBarData(data[2]);
+
+      this.callbackReportData = this.parseBarData(data[3]);
+    }
+  }
+};
+</script>

+ 1 - 0
src/modules/grading/GradingOperation.vue

@@ -248,6 +248,7 @@ export default {
       const datas = {
         ...this.filter,
         ...this.typeFilter[this.curStep.type],
+        workId: this.workId,
         page: this.current - 1,
         size: this.size
       };

+ 2 - 2
src/modules/grading/GradingProgress.vue

@@ -11,7 +11,7 @@
           >正评任务创建</Button
         >
         <Button
-          type="success"
+          type="warning"
           shape="circle"
           icon="recode-white icon"
           @click="toTryGrading"
@@ -248,7 +248,7 @@ export default {
     },
     toExportGrading() {
       window.open(
-        `${this.GLOBAL.domain}/api/export/paper/${this.curSubject.workId}/${this.curSubject.subject}/oneClickLevel`
+        `${this.GLOBAL.domain}/api/export/paper/${this.curSubject.workId}/${this.curSubject.subject}/oneClick`
       );
     }
   }

+ 37 - 13
src/modules/grading/components/ModifyUnformalGradingTask.vue

@@ -6,7 +6,7 @@
     :mask-closable="false"
     @on-visible-change="visibleChange"
   >
-    <div class="task-body">
+    <div class="task-body" v-if="!unformalGradingIsRunning">
       <upload-button
         btn-icon="md-cloud-upload"
         :btn-content="uploadBtnName"
@@ -29,19 +29,24 @@
         >
       </upload-button>
     </div>
+    <div class="task-body" v-else>
+      <p class="task-tips">当前已经开始试评</p>
+    </div>
     <div class="task-action" slot="footer">
       <Button
         shape="circle"
         type="error"
         :disabled="isSubmit"
         @click="toOverTask"
+        v-if="unformalGradingIsRunning"
         >结束并清空数据</Button
       >
       <Button shape="circle" @click="cancel">取消</Button>
       <Button
         shape="circle"
         type="primary"
-        :disabled="isSubmit"
+        :disabled="isSubmit || !uploadFileIsSuccess"
+        v-if="!unformalGradingIsRunning"
         @click="toStartTask"
         >开始试评</Button
       >
@@ -70,7 +75,9 @@ export default {
       isSubmit: false,
       uploadData: {},
       uploadBtnName: "导入考生数据",
-      uploadUrl: this.GLOBAL.domain + "/api/import/students/batchAllForTrial"
+      uploadUrl: this.GLOBAL.domain + "/api/import/students/batchAllForTrial",
+      uploadFileIsSuccess: false,
+      unformalGradingIsRunning: false
     };
   },
   created() {
@@ -82,7 +89,10 @@ export default {
   methods: {
     visibleChange(visible) {
       if (visible) {
-        console.log("try");
+        this.uploadFileIsSuccess = false;
+        this.isSubmit = false;
+        this.unformalGradingIsRunning =
+          this.curSubject.stage == "LEVEL" && this.curSubject.test === 2;
       }
     },
     cancel() {
@@ -99,14 +109,17 @@ export default {
     },
     uploadSuccess(response) {
       this.uploadBtnName = "导入考生数据";
-      console.log(response);
+      this.uploadFileIsSuccess = true;
     },
     async toStartTask() {
       if (this.isSubmit) return;
       this.isSubmit = true;
-      const data = await createTryGradingTask(this.uploadData).catch(() => {});
+      let result = true;
+      await createTryGradingTask(this.uploadData).catch(() => {
+        result = false;
+      });
       this.isSubmit = false;
-      if (!data) return;
+      if (!result) return;
 
       this.$Message.success("发布任务成功!");
       this.$emit("modified");
@@ -115,13 +128,24 @@ export default {
     async toOverTask() {
       if (this.isSubmit) return;
       this.isSubmit = true;
-      const data = await finishTryGradingTask(this.data).catch(() => {});
-      this.isSubmit = false;
-      if (!data) return;
 
-      this.$Message.success("操作成功!");
-      this.$emit("modified");
-      this.cancel();
+      this.$Modal.confirm({
+        content: "确定要结束试评任务并清空所有试评数据吗?",
+        onOk: async () => {
+          const data = await finishTryGradingTask(
+            this.uploadData
+          ).catch(() => {});
+          this.isSubmit = false;
+          if (!data) return;
+
+          this.$Message.success("操作成功!");
+          this.$emit("modified");
+          this.cancel();
+        },
+        onCancel: () => {
+          this.isSubmit = false;
+        }
+      });
     }
   }
 };

+ 1 - 1
src/modules/main/PaperManage.vue

@@ -129,7 +129,7 @@ export default {
       },
       SORT_RULE_TYPE,
       CAFA_EXCEPTION_TYPE,
-      paperType: "0",
+      paperType: null,
       current: 1,
       size: this.GLOBAL.pageSize,
       total: 0,

+ 10 - 2
src/modules/main/StudentManage.vue

@@ -31,7 +31,7 @@
           <Select
             v-model="filter.areaCode"
             @on-change="areaChange"
-            placeholder="选择考区"
+            placeholder="考区"
           >
             <Option
               v-for="area in cascadeList"
@@ -116,7 +116,6 @@
             size="small"
             class="btn-form-search"
             type="primary"
-            :disabled="!filter.areaCode || !filter.school || !filter.examRoom"
             @click="toPage(1)"
             >查询</Button
           >
@@ -337,6 +336,14 @@ export default {
       this.total = data.totalCount;
     },
     toPage(page) {
+      if (
+        !this.filter.areaCode ||
+        !this.filter.school ||
+        !this.filter.examRoom
+      ) {
+        this.$Message.error("请选择考区、学校和考场!");
+        return;
+      }
       this.current = page;
       this.getList();
     },
@@ -361,6 +368,7 @@ export default {
       );
       this.schools = curArea.schools;
       this.rooms = [];
+      this.filter.school = null;
       this.filter.examRoom = null;
       if (curArea.schools.length === 1) {
         this.filter.school = curArea.schools[0].school;

+ 89 - 14
src/modules/mark-set/ExportPaper.vue

@@ -18,23 +18,51 @@
               </Select>
             </FormItem>
             <FormItem>
-              <Select v-model="scoreFilter.areaCode" placeholder="考点">
-                <Option value=""></Option>
+              <Select
+                v-model="scoreFilter.areaCode"
+                @on-change="areaChange"
+                placeholder="考点"
+              >
+                <Option
+                  v-for="area in cascadeList"
+                  :key="area.areaCode"
+                  :value="area.areaCode"
+                  :label="area.areaName"
+                ></Option>
               </Select>
             </FormItem>
             <FormItem>
-              <Select v-model="scoreFilter.schoolId" placeholder="学校">
-                <Option value=""></Option>
+              <Select
+                v-model="scoreFilter.school"
+                @on-change="schoolChange"
+                placeholder="学校"
+              >
+                <Option
+                  v-for="(item, index) in schools"
+                  :key="index"
+                  :value="item.school"
+                  :label="item.school"
+                ></Option>
               </Select>
             </FormItem>
             <FormItem>
               <Select v-model="scoreFilter.examRoom" placeholder="考场">
-                <Option value=""></Option>
+                <Option
+                  v-for="(room, index) in rooms"
+                  :key="index"
+                  :value="room"
+                  :label="room"
+                ></Option>
               </Select>
             </FormItem>
             <FormItem>
-              <Select v-model="scoreFilter.subjectId" placeholder="科目">
-                <Option value=""></Option>
+              <Select v-model="scoreFilter.subject" placeholder="科目">
+                <Option
+                  v-for="(subject, index) in subjects"
+                  :key="index"
+                  :value="subject.subject"
+                  :label="subject.name"
+                ></Option>
               </Select>
             </FormItem>
             <FormItem>
@@ -94,12 +122,22 @@
             </FormItem>
             <FormItem>
               <Select v-model="renameFilter.areaCode" placeholder="考点">
-                <Option value=""></Option>
+                <Option
+                  v-for="area in cascadeList"
+                  :key="area.areaCode"
+                  :value="area.areaCode"
+                  :label="area.areaName"
+                ></Option>
               </Select>
             </FormItem>
             <FormItem>
-              <Select v-model="renameFilter.subjectId" placeholder="科目">
-                <Option value=""></Option>
+              <Select v-model="renameFilter.subject" placeholder="科目">
+                <Option
+                  v-for="(subject, index) in subjects"
+                  :key="index"
+                  :value="subject.subject"
+                  :label="subject.name"
+                ></Option>
               </Select>
             </FormItem>
             <br />
@@ -118,18 +156,20 @@
 </template>
 
 <script>
+import { subjectList, areaSchoolRoomCascadeList } from "@/api";
 import { IMAGE_TYPE, EXPORT_IMAGE_NAME_TYPE } from "@/constants/enumerate";
 
 export default {
   name: "export-paper",
   data() {
     return {
+      workId: this.$route.params.workId,
       scoreFilter: {
         imageType: "",
         areaCode: "",
         examRoom: "",
-        schoolID: "",
-        subjectId: "",
+        school: "",
+        subject: "",
         nameRule: "",
         startNumber: null,
         endNumber: null
@@ -137,13 +177,48 @@ export default {
       renameFilter: {
         imageType: "",
         areaCode: "",
-        subjectId: ""
+        subject: ""
       },
       IMAGE_TYPE,
-      EXPORT_IMAGE_NAME_TYPE
+      EXPORT_IMAGE_NAME_TYPE,
+      subjects: [],
+      cascadeList: [],
+      schools: [],
+      rooms: []
     };
   },
+  mounted() {
+    this.getAreaList();
+    this.getSubjects();
+  },
   methods: {
+    async getAreaList() {
+      this.cascadeList = await areaSchoolRoomCascadeList(this.workId);
+    },
+    async getSubjects() {
+      const data = await subjectList(this.workId);
+      this.subjects = data.filter(item => item.enable);
+    },
+    areaChange() {
+      const curArea = this.cascadeList.find(
+        item => item.areaCode === this.scoreFilter.areaCode
+      );
+      this.schools = curArea.schools;
+      this.rooms = [];
+      this.scoreFilter.examRoom = null;
+      this.scoreFilter.school = null;
+      if (curArea.schools.length === 1) {
+        this.scoreFilter.school = curArea.schools[0].school;
+        this.schoolChange();
+      }
+    },
+    schoolChange() {
+      const curSchool = this.schools.find(
+        item => item.school === this.scoreFilter.school
+      );
+      this.rooms = curSchool.rooms;
+      this.scoreFilter.examRoom = null;
+    },
     toExport(type) {
       console.log(this[`${type}Filter`]);
     }

+ 1 - 0
src/modules/mark/MarkOperation.vue

@@ -248,6 +248,7 @@ export default {
       const datas = {
         ...this.filter,
         ...this.typeFilter[this.curStep.type],
+        workId: this.workId,
         page: this.current - 1,
         size: this.size
       };

+ 5 - 2
src/views/404.vue

@@ -1,6 +1,9 @@
 <template>
-  <div class="not-found">
-    not-found -- 404
+  <div class="not-found login-home">
+    <div class="not-found-body">
+      <h1>404</h1>
+      <p>您要的页面不见了~</p>
+    </div>
   </div>
 </template>