瀏覽代碼

科组长筛选栏调整

zhangjie 3 年之前
父節點
當前提交
1b972b25c8

+ 7 - 10
src/assets/styles/base.less

@@ -136,18 +136,15 @@ body {
 
   &-head {
     margin-bottom: 20px;
-    &::after {
-      content: "";
-      display: block;
-      visibility: hidden;
-      clear: both;
-    }
+    display: flex;
+    align-items: stretch;
+    justify-content: space-between;
 
-    &-left {
-      float: left;
-    }
     &-right {
-      float: right;
+      padding-bottom: 10px;
+      white-space: nowrap;
+      display: flex;
+      align-items: flex-end;
     }
   }
 }

+ 41 - 36
src/assets/styles/marker.less

@@ -23,8 +23,8 @@
   .header-part {
     display: inline-block;
     vertical-align: top;
-    padding: 0 15px;
-    margin-left: 10px;
+    padding: 0 10px;
+    margin-left: 5px;
     background: @color-background;
     border-radius: 5px;
     cursor: pointer;
@@ -97,7 +97,7 @@
     }
   }
   .header-history {
-    margin-right: 10px;
+    margin-right: 5px;
   }
   .header-user {
     display: inline-block;
@@ -144,41 +144,45 @@
     }
   }
 }
-// marker-page
-.marker-page {
-  &-set {
-    > * {
-      display: inline-block;
-      vertical-align: middle;
-    }
-    .ivu-input-number {
-      width: 80px;
-      min-width: 0;
-      border-color: @color-text;
-      background-color: @color-text-act;
-      input {
-        box-shadow: none;
-        background-color: @color-text-act;
-      }
+.header-filter-body {
+  .filter-part {
+    padding: 15px 0 7px;
+
+    &:not(:last-child) {
+      border-bottom: 1px dashed @color-text;
     }
-    > span:first-child {
-      width: 80px;
-      text-align: right;
+
+    &-title {
+      line-height: 1;
+      margin-bottom: 10px;
     }
   }
-  &-btn {
-    height: 24px;
-    line-height: 24px;
-    padding: 0 10px;
-    background-color: @color-background-light;
-    border-radius: 5px;
-    margin-left: 5px;
-    cursor: pointer;
 
-    &:hover {
-      background-color: @color-act1;
-      color: @color-text-act;
-    }
+  .filter-select {
+    display: inline-block;
+    vertical-align: top;
+    width: 100px;
+    min-width: auto;
+    margin-right: 10px;
+    margin-bottom: 8px;
+  }
+  .filter-input {
+    display: inline-block;
+    vertical-align: top;
+    width: 150px;
+    margin-right: 10px;
+    margin-bottom: 8px;
+  }
+  .filter-btn {
+    display: inline-block;
+    vertical-align: top;
+    width: 60px;
+    height: 30px;
+  }
+  .filter-label {
+    display: inline-block;
+    vertical-align: top;
+    line-height: 32px;
   }
 }
 
@@ -522,7 +526,8 @@
       }
     }
   }
-
+}
+.dark-mark {
   // iview-ui
   .ivu-btn-primary {
     color: @color-text-act;
@@ -765,7 +770,7 @@
     }
   }
   .ivu-poptip-inner {
-    background-color: @color-background;
+    background-color: @color-background-light2;
     color: @color-text;
 
     box-shadow: 0 1px 10px rgba(0, 0, 0, 0.5);

+ 1 - 0
src/assets/styles/variables.less

@@ -24,6 +24,7 @@
 // marker
 @color-background: #2c2e3e;
 @color-background-light: #3d3f55;
+@color-background-light2: #34364b;
 @color-act1: #155b92;
 @color-act2: #cc4635;
 @color-act3: #f9dbc4;

+ 4 - 4
src/modules/grading/components/GradeAction.vue

@@ -256,10 +256,10 @@ export default {
           arbitrate: ["search", "gradeHis"]
         },
         MARK_LEADER: {
-          undo: ["search", "gradeList", "gradeInfo"],
-          done: ["search", "gradeList", "gradeHis", "gradeInfo"],
-          reject: ["search", "gradeList", "gradeInfo", "gradeHis"],
-          arbitrate: ["search", "gradeList", "gradeHis"]
+          undo: ["gradeList", "gradeInfo"],
+          done: ["gradeList", "gradeHis", "gradeInfo"],
+          reject: ["gradeList", "gradeInfo", "gradeHis"],
+          arbitrate: ["gradeList", "gradeHis"]
         },
         MARKER: {
           done: ["gradeList", "gradeInfo"],

+ 7 - 1
src/modules/grading/leader/LeaderGrading.vue

@@ -11,11 +11,14 @@
       @to-history="toHistory"
       @to-standard="toStandard"
       @to-statistics="toStatistics"
+      @on-code-search="serachPaperByCode"
+      @on-mark-search="serachPaperByCode"
     ></marker-header>
 
     <div
       :class="[
         'marker-action',
+        'dark-mark',
         { 'marker-action-fullscreen': isFullscreenMarking }
       ]"
       v-show="!multipleGradingList.length"
@@ -26,7 +29,6 @@
         :params-set="paramsSet"
         :key="curPaper.key"
         @on-leader-level="leaderSelectLevel"
-        @on-code-search="serachPaperByCode"
         ref="GradeAction"
         v-if="curPaper.id"
       ></grade-action>
@@ -506,6 +508,10 @@ export default {
       this.setPage({ current: 1, total: 1, totalPage: 1 });
       this.selectPaper(0);
     },
+    async serachMarkPaper(params) {
+      console.log(params);
+      // TODO:
+    },
     async leaderSelectLevel(levelInfo, markers) {
       // 唯一权限时,直接操作
       if (levelInfo.markLeaderOnlyRight && !this.paramsSet.leaderConfirm) {

+ 1 - 0
src/modules/grading/marker/MarkerGrading.vue

@@ -12,6 +12,7 @@
     <div
       :class="[
         'marker-action',
+        'dark-mark',
         { 'marker-action-fullscreen': isFullscreenMarking }
       ]"
       v-show="!multipleGradingList.length"

+ 117 - 7
src/modules/grading/marker/MarkerHeader.vue

@@ -48,18 +48,24 @@
           <span>{{ page.current }}</span
           ><span>/</span><span>{{ page.totalPage }}</span>
         </div>
-        <div class="marker-page" slot="content">
-          <div class="marker-page-set">
-            <span>页面跳转:</span>
+        <div class="header-filter-body dark-mark" slot="content">
+          <div class="filter-part-body">
+            <span class="filter-label">页面跳转:</span>
             <InputNumber
-              size="small"
+              class="filter-input"
               :min="1"
               :max="page.totalPage"
               :step="1"
               :precision="0"
               v-model="pageNo"
             ></InputNumber>
-            <div class="marker-page-btn" @click="pageNoSet">跳转</div>
+            <Button
+              type="primary"
+              size="small"
+              class="filter-btn"
+              @click="pageNoSet"
+              >跳转</Button
+            >
           </div>
         </div>
       </Poptip>
@@ -110,6 +116,76 @@
         </div>
         全选
       </div>
+      <Poptip
+        v-if="IS_MARK_LEADER"
+        popper-class="marker-popper"
+        placement="bottom"
+        trigger="click"
+        transfer
+      >
+        <div class="header-part header-filter">
+          筛选 <Icon type="ios-arrow-down"></Icon>
+        </div>
+        <div class="header-filter-body dark-mark" slot="content">
+          <!-- 查询标记 -->
+          <div class="filter-part">
+            <h4 class="filter-part-title">查询标记试卷</h4>
+            <div class="filter-part-body">
+              <Select
+                class="filter-select"
+                v-model="markFilter.markerId"
+                placeholder="评卷员"
+              >
+                <Option
+                  v-for="item in markers"
+                  :key="item.key"
+                  :value="item.key"
+                  :label="item.val"
+                ></Option>
+              </Select>
+              <Button
+                type="primary"
+                size="small"
+                class="filter-btn"
+                @click="searchMarkFilter"
+                >查询</Button
+              >
+            </div>
+          </div>
+          <!-- 查询密号 -->
+          <div class="filter-part">
+            <h4 class="filter-part-title">密号查询试卷</h4>
+            <div class="filter-part-body">
+              <Select
+                class="filter-select"
+                v-model="codeFilter.codeType"
+                placeholder="密号类型"
+              >
+                <Option
+                  v-for="item in codeTypes"
+                  :key="item.key"
+                  :value="item.key"
+                  :label="item.val"
+                ></Option>
+              </Select>
+              <Input
+                class="filter-input"
+                v-model.trim="codeFilter.code"
+                placeholder="输入密号"
+                clearable
+              >
+              </Input>
+              <Button
+                type="primary"
+                size="small"
+                class="filter-btn"
+                @click="searchCodeFilter"
+                >查询</Button
+              >
+            </div>
+          </div>
+        </div>
+      </Poptip>
       <div class="header-part header-step">
         <Dropdown
           placement="bottom"
@@ -190,6 +266,7 @@
 import { mapState, mapMutations } from "vuex";
 import { areaList, logout } from "@/api";
 import ResetPwd from "@/modules/login/ResetPwd";
+import { CODE_TYPE } from "@/constants/enumerate";
 
 export default {
   name: "marker-header",
@@ -218,7 +295,16 @@ export default {
       pageVisible: false,
       pageSizeList: [2, 3, 4, 6, 8, 9, 10, 12, 15, 16, 20, 24],
       pageNo: 1,
-      allSelected: false
+      allSelected: false,
+      codeTypes: [],
+      codeFilter: {
+        codeType: "examNumber",
+        code: ""
+      },
+      markers: [],
+      markFilter: {
+        markerId: ""
+      }
     };
   },
   computed: {
@@ -245,6 +331,15 @@ export default {
     this.filter.subject = subjectId[1];
     this.getAreaList();
     document.addEventListener("keydown", this.keyEvent);
+
+    this.codeTypes = Object.entries(CODE_TYPE)
+      .map(([key, val]) => {
+        return {
+          key,
+          val
+        };
+      })
+      .filter(item => item.key !== "examNumber");
   },
   methods: {
     ...mapMutations("marker", ["setPage", "setAreas"]),
@@ -264,10 +359,10 @@ export default {
       }
     },
     keyEvent(e) {
-      e.preventDefault();
       if (!e.altKey && !e.shiftKey && !e.repeat) {
         // 左右键切换分页
         if (e.code === "ArrowLeft") {
+          e.preventDefault();
           if (e.ctrlKey) {
             this.toFirstPage();
           } else {
@@ -277,6 +372,7 @@ export default {
         }
 
         if (e.code === "ArrowRight") {
+          e.preventDefault();
           if (e.ctrlKey) {
             this.toLastPage();
           } else {
@@ -344,6 +440,20 @@ export default {
       this.pageVisible = false;
       this.$emit("page-set-change", this.page);
     },
+    searchCodeFilter() {
+      if (!this.codeFilter.code || !this.codeFilter.codeType) {
+        this.$Message.error("请设置密号类型和密号!");
+        return;
+      }
+      this.$emit("on-code-search", this.codeFilter);
+    },
+    searchMarkFilter() {
+      if (!this.markFilter.markerId) {
+        this.$Message.error("请选择评卷员!");
+        return;
+      }
+      this.$emit("on-mark-search", this.markFilter);
+    },
     userClick(name) {
       if (!name) return;
       this[name]();

+ 1 - 1
src/modules/grading/marker/MarkerImageView.vue

@@ -34,7 +34,7 @@
           </div>
         </div>
         <div class="image-action">
-          <div class="image-action-li" @click="toMark">
+          <div class="image-action-li" title="标记" @click="toMark">
             <Icon :class="{ 'mark-act': image.isMark }" type="md-bookmark" />
           </div>
           <div class="image-action-li" @click="toRotate">

+ 115 - 97
src/modules/main/PaperManage.vue

@@ -1,102 +1,113 @@
 <template>
   <div class="paper-manage page-container-flex">
-    <div class="part-box part-box-filter">
-      <Form ref="FilterForm" label-position="left" inline>
-        <FormItem>
-          <Select
-            v-model="filter.subject"
-            @on-change="subjectChange"
-            placeholder="科目"
-          >
-            <Option
-              v-for="(item, index) in subjects"
-              :key="index"
-              :value="item.subject"
-              :label="item.name"
-            ></Option>
-          </Select>
-        </FormItem>
-        <FormItem>
-          <Select v-model="filter.areaCode" placeholder="选择考区" clearable>
-            <Option
-              v-for="area in areas"
-              :key="area.id"
-              :value="area.areaCode"
-              :label="area.areaName"
-            ></Option>
-          </Select>
-        </FormItem>
-        <FormItem>
-          <Input
-            v-model="filter.startNumber"
-            type="text"
-            placeholder="输入开始编号"
-            clearable
-          />
-        </FormItem>
-        <FormItem>
-          <Input
-            v-model="filter.endNumber"
-            type="text"
-            placeholder="输入结束编号"
-            clearable
-          />
-        </FormItem>
-        <FormItem>
-          <Select
-            v-model="paperType"
-            @on-change="typeChange"
-            placeholder="类型"
-          >
-            <Option
-              v-for="(val, key) in CAFA_EXCEPTION_TYPE"
-              :key="key"
-              :value="key"
-              :label="val"
-            ></Option>
-          </Select>
-        </FormItem>
-        <FormItem>
-          <Select
-            v-model="filter.scanUserId"
-            placeholder="选择采集账号"
-            clearable
-          >
-            <Option
-              v-for="user in scanUsers"
-              :key="user.id"
-              :value="user.name"
-              :label="user.name"
-            ></Option>
-          </Select>
-        </FormItem>
-        <FormItem>
-          <Input
-            v-model.trim="filter.studentName"
-            placeholder="输入姓名"
-            clearable
-          ></Input>
-        </FormItem>
-        <FormItem>
-          <Select v-model="filter.sortBy" placeholder="排序方式" clearable>
-            <Option
-              v-for="(val, key) in SORT_RULE_TYPE"
-              :key="key"
-              :value="key"
-              :label="val"
-            ></Option>
-          </Select>
-        </FormItem>
-        <FormItem>
-          <Button
-            size="small"
-            class="btn-form-search"
-            type="primary"
-            @click="toPage(1)"
-            >查询</Button
-          >
-        </FormItem>
-      </Form>
+    <div class="part-box part-box-filter part-box-head">
+      <div class="part-box-head-left">
+        <Form ref="FilterForm" label-position="left" inline>
+          <FormItem>
+            <Select
+              v-model="filter.subject"
+              @on-change="subjectChange"
+              placeholder="科目"
+            >
+              <Option
+                v-for="(item, index) in subjects"
+                :key="index"
+                :value="item.subject"
+                :label="item.name"
+              ></Option>
+            </Select>
+          </FormItem>
+          <FormItem>
+            <Select v-model="filter.areaCode" placeholder="选择考区" clearable>
+              <Option
+                v-for="area in areas"
+                :key="area.id"
+                :value="area.areaCode"
+                :label="area.areaName"
+              ></Option>
+            </Select>
+          </FormItem>
+          <FormItem>
+            <Input
+              v-model="filter.startNumber"
+              type="text"
+              placeholder="输入开始编号"
+              clearable
+            />
+          </FormItem>
+          <FormItem>
+            <Input
+              v-model="filter.endNumber"
+              type="text"
+              placeholder="输入结束编号"
+              clearable
+            />
+          </FormItem>
+          <FormItem>
+            <Select
+              v-model="paperType"
+              @on-change="typeChange"
+              placeholder="类型"
+            >
+              <Option
+                v-for="(val, key) in CAFA_EXCEPTION_TYPE"
+                :key="key"
+                :value="key"
+                :label="val"
+              ></Option>
+            </Select>
+          </FormItem>
+          <FormItem>
+            <Select
+              v-model="filter.scanUserId"
+              placeholder="选择采集账号"
+              clearable
+            >
+              <Option
+                v-for="user in scanUsers"
+                :key="user.id"
+                :value="user.name"
+                :label="user.name"
+              ></Option>
+            </Select>
+          </FormItem>
+          <FormItem>
+            <Input
+              v-model.trim="filter.studentName"
+              placeholder="输入姓名"
+              clearable
+            ></Input>
+          </FormItem>
+          <FormItem>
+            <Select v-model="filter.sortBy" placeholder="排序方式" clearable>
+              <Option
+                v-for="(val, key) in SORT_RULE_TYPE"
+                :key="key"
+                :value="key"
+                :label="val"
+              ></Option>
+            </Select>
+          </FormItem>
+          <FormItem>
+            <Button
+              size="small"
+              class="btn-form-search"
+              type="primary"
+              @click="toPage(1)"
+              >查询</Button
+            >
+          </FormItem>
+        </Form>
+      </div>
+      <div class="part-box-head-right">
+        <Button
+          type="success"
+          shape="circle"
+          icon="upload-white icon"
+          @click="toExportMark"
+          >导出标记试卷</Button
+        >
+      </div>
     </div>
 
     <image-action-list
@@ -275,6 +286,13 @@ export default {
         this.filter[val] = typeToField[this.paperType] === val ? true : null;
       });
     },
+    toExportMark() {
+      window.open(
+        this.urlAddAuthor(
+          `${this.GLOBAL.domain}/api/export/paper/${this.filter.workId}/mark`
+        )
+      );
+    },
     // paper view
     toReview(index) {
       this.selectPaper(index);

+ 1 - 0
src/modules/mark/leader/LeaderMarking.vue

@@ -14,6 +14,7 @@
     <div
       :class="[
         'marker-action',
+        'dark-mark',
         { 'marker-action-fullscreen': isFullscreenMarking }
       ]"
     >

+ 1 - 0
src/modules/mark/marker/MarkerMarking.vue

@@ -14,6 +14,7 @@
     <div
       :class="[
         'marker-action',
+        'dark-mark',
         { 'marker-action-fullscreen': isFullscreenMarking }
       ]"
     >