Jelajahi Sumber

接口调试

zhangjie 2 tahun lalu
induk
melakukan
1921c0d1af

+ 14 - 2
src/assets/styles/element-ui-costom.scss

@@ -79,6 +79,18 @@
       padding: 70px 20px 20px;
     }
   }
+  .el-dialog {
+    background: $--color-background;
+    .el-dialog__body {
+      padding: 20px;
+    }
+    .el-dialog__header {
+      background-color: #fff;
+    }
+    .el-dialog__footer {
+      display: none;
+    }
+  }
 }
 
 // .opacity-dialog
@@ -242,8 +254,8 @@
   margin-left: 5px;
 }
 .el-button--small {
-  padding-top: 8px;
-  padding-bottom: 8px;
+  padding-top: 9px;
+  padding-bottom: 9px;
   font-size: 12px;
 }
 .el-button--text {

+ 14 - 0
src/assets/styles/pages.scss

@@ -1072,3 +1072,17 @@
     display: inline-block;
   }
 }
+// ecs-exam-select
+.ecs-exam-select {
+  display: inline-block;
+  vertical-align: middle;
+  .el-select .el-input__inner {
+    border-top-right-radius: 0;
+    border-bottom-right-radius: 0;
+    width: 300px;
+  }
+  .el-button {
+    border-top-left-radius: 0;
+    border-bottom-left-radius: 0;
+  }
+}

+ 5 - 12
src/components/base/EcsExamSelect.vue

@@ -5,14 +5,14 @@
       :placeholder="placeholder"
       filterable
       :clearable="clearable"
-      :disabled="disabled"
+      :disabled="disabled || loading"
       @change="select"
     >
       <el-option
         v-for="item in optionList"
-        :key="item.id"
-        :value="item.id"
-        :label="item.name"
+        :key="item.examId"
+        :value="item.examId"
+        :label="`${item.examId}-${item.examName}`"
       >
       </el-option>
     </el-select>
@@ -73,16 +73,9 @@ export default {
       this.$emit("input", this.selected);
       this.$emit(
         "change",
-        this.optionList.find(item => item.id === this.selected)
+        this.optionList.find(item => item.examId === this.selected)
       );
     }
   }
 };
 </script>
-
-<style>
-.ecs-exam-select {
-  display: inline-block;
-  vertical-align: middle;
-}
-</style>

+ 35 - 2
src/components/base/SemesterSelect.vue

@@ -27,7 +27,15 @@ export default {
     disabled: { type: Boolean, default: false },
     placeholder: { type: String, default: "请选择学期" },
     value: { type: [Number, String], default: "" },
-    clearable: { type: Boolean, default: true }
+    clearable: { type: Boolean, default: true },
+    manualFetch: {
+      type: Boolean,
+      default: false
+    },
+    selectDefault: {
+      type: Boolean,
+      default: false
+    }
   },
   data() {
     return {
@@ -44,13 +52,38 @@ export default {
     }
   },
   created() {
-    this.search();
+    if (!this.manualFetch) this.search();
   },
   methods: {
     async search() {
       this.optionList = [];
       const res = await semesterQuery({});
       this.optionList = res;
+
+      if (!this.selectDefault) return;
+
+      if (this.value) {
+        const option = this.optionList.find(item => item.id === this.value);
+        if (option) {
+          this.$emit("input", this.value);
+          this.$emit("change", option);
+        } else {
+          this.selectFirst();
+        }
+      } else {
+        this.selectFirst();
+      }
+    },
+    selectFirst() {
+      if (!this.optionList.length) {
+        this.selected = "";
+        this.$emit("input", this.selected);
+        this.$emit("change", {});
+        return;
+      }
+      this.selected = this.optionList[0].id;
+      this.$emit("input", this.selected);
+      this.$emit("change", this.optionList[0]);
     },
     select() {
       this.$emit("input", this.selected);

+ 15 - 0
src/constants/enumerate.js

@@ -31,3 +31,18 @@ export const PRIVILEGE_TYPE = {
   MENU: "菜单",
   URL: "操作"
 };
+
+// data task status
+export const DATA_TASK_STATUS = {
+  INIT: "未开始",
+  RUNNING: "进行中",
+  FINISH: "已完成"
+};
+export const DATA_TASK_TYPE = {
+  WHU_TEACH_DATA: "同步武大考务数据",
+  CLOUD_MARKING_STUDENT_SCORE: "同步云阅卷考生成绩"
+};
+export const DATA_TASK_RESULT = {
+  SUCCESS: "成功",
+  ERROR: "失败"
+};

+ 15 - 0
src/modules/base/api.js

@@ -99,6 +99,21 @@ export const ecsDataList = datas => {
 export const syncEcsData = datas => {
   return $postParam("/api/cloud_marking_score/sync_student_score", datas);
 };
+// ecs-data-manage
+export const dataTaskList = datas => {
+  return $postParam("/api/sync_task/page", datas);
+  // status(非必填):INIT("未开始"),RUNNING("进行中"),FINISH("已完成");
+  // type(必填):WHU_TEACH_DATA("同步武大考务数据"),CLOUD_MARKING_STUDENT_SCORE("同步云阅卷考生成绩");
+  // result(非必填):SUCCESS("成功"),ERROR("失败");
+};
+export const dataReturnList = datas => {
+  return $postParam("/api/cloud_marking_score_foreign/page", datas);
+};
+export const downloadDataReturn = datas => {
+  return $postParam("/api/cloud_marking_score_foreign/download_score", datas, {
+    responseType: "blob"
+  });
+};
 
 // common
 export const uploadFile = datas => {

+ 154 - 0
src/modules/base/components/DataTaskDialog.vue

@@ -0,0 +1,154 @@
+<template>
+  <el-dialog
+    class="data-task-dialog page-dialog"
+    :visible.sync="modalIsShow"
+    title="数据任务进度"
+    top="10vh"
+    width="900px"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    @open="visibleChange"
+  >
+    <div class="part-box part-box-pad">
+      <el-table ref="TableList" :data="dataList">
+        <el-table-column
+          type="index"
+          label="序号"
+          width="50"
+          :index="indexMethod"
+        ></el-table-column>
+        <!-- <el-table-column prop="type" label="类别" width="140">
+          <span slot-scope="scope">
+            {{ scope.row.type | dataTaskTypeFilter }}
+          </span>
+        </el-table-column> -->
+        <el-table-column prop="status" label="状态" width="100">
+          <span slot-scope="scope">
+            {{ scope.row.status | dataTaskStatusFilter }}
+          </span>
+        </el-table-column>
+        <el-table-column prop="result" label="结果" width="80">
+          <span slot-scope="scope">
+            {{ scope.row.result | dataTaskResultFilter }}
+          </span>
+        </el-table-column>
+        <el-table-column prop="createTime" label="创建时间" width="170">
+          <span slot-scope="scope">{{
+            scope.row.createTime | timestampFilter
+          }}</span>
+        </el-table-column>
+        <el-table-column prop="createName" label="创建人"></el-table-column>
+        <el-table-column prop="errorResult" label="失败原因"></el-table-column>
+        <el-table-column
+          class-name="action-column"
+          label="操作"
+          width="160px"
+          align="center"
+          fixed="right"
+        >
+          <template slot-scope="scope">
+            <el-button
+              v-if="scope.row.reportFile"
+              class="btn-primary"
+              type="text"
+              :disabled="loading"
+              @click="toDonwload(scope.row.reportFile)"
+              >导出日志</el-button
+            >
+            <el-button
+              v-if="scope.row.resultFile"
+              class="btn-primary"
+              type="text"
+              :disabled="loading"
+              @click="toDonwload(scope.row.resultFile)"
+              >下载文件</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="part-page">
+        <el-pagination
+          background
+          layout="total,prev, pager, next"
+          :current-page="current"
+          :total="total"
+          :page-size="size"
+          @current-change="toPage"
+        >
+        </el-pagination>
+      </div>
+    </div>
+
+    <div slot="footer"></div>
+  </el-dialog>
+</template>
+
+<script>
+import { dataTaskList } from "../api";
+import { downloadByUrl } from "@/plugins/download";
+
+export default {
+  name: "data-task-dialog",
+  props: {
+    taskType: {
+      type: String,
+      default: ""
+    }
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      filter: {
+        type: "", // WHU_TEACH_DATA("同步武大考务数据"),CLOUD_MARKING_STUDENT_SCORE("同步云阅卷考生成绩");
+        status: "", // INIT("未开始"),RUNNING("进行中"),FINISH("已完成");
+        result: "" // SUCCESS("成功"),ERROR("失败");
+      },
+      dataList: [],
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      loading: false
+    };
+  },
+  methods: {
+    visibleChange() {
+      this.filter.type = this.taskType;
+      this.toPage(1);
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    async getList() {
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      const data = await dataTaskList(datas);
+      this.dataList = data.records.map(item => {
+        item.reportFile = item.txtFilePath;
+        item.resultFile = item.importFilePath || item.exportFilePath || "";
+        return item;
+      });
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    toDonwload(url) {
+      if (url.endsWith(".txt")) {
+        window.open(url);
+        return;
+      }
+
+      downloadByUrl(url);
+      this.$message.success("文件开始成功!");
+    }
+  }
+};
+</script>

+ 125 - 3
src/modules/base/views/DataReturnManage.vue

@@ -1,15 +1,137 @@
 <template>
   <div class="data-return-manage">
-    data-return-manage
+    <div class="part-box part-box-filter part-box-flex">
+      <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
+        <el-form-item prop="semesterId" label="学期:">
+          <semester-select
+            ref="SemesterSelect"
+            v-model="filter.semesterId"
+            :clearable="false"
+            manual-fetch
+            select-default
+          ></semester-select>
+        </el-form-item>
+        <el-form-item prop="examTypeId" label="考试类型:">
+          <exam-type-select v-model="filter.examTypeId"></exam-type-select>
+        </el-form-item>
+        <el-form-item label="考试:">
+          <ecs-exam-select v-model="filter.examId"></ecs-exam-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="toPage(1)">查询</el-button>
+        </el-form-item>
+      </el-form>
+      <div class="part-box-action">
+        <el-button type="primary" icon="el-icon-download" @click="toDownload"
+          >下载</el-button
+        >
+      </div>
+    </div>
+    <div class="part-box part-box-pad">
+      <el-table ref="TableList" :data="dataList">
+        <el-table-column
+          type="index"
+          label="序号"
+          width="70"
+          :index="indexMethod"
+        ></el-table-column>
+        <el-table-column prop="semesterName" label="学期"></el-table-column>
+        <el-table-column prop="examTypeName" label="考试类型"></el-table-column>
+        <el-table-column prop="examName" label="考试"></el-table-column>
+        <el-table-column prop="userName" label="操作人"> </el-table-column>
+        <el-table-column prop="createTime" label="操作时间">
+          <span slot-scope="scope">{{
+            scope.row.createTime | timestampFilter
+          }}</span>
+        </el-table-column>
+      </el-table>
+      <div class="part-page">
+        <el-pagination
+          background
+          layout="total,prev, pager, next"
+          :current-page="current"
+          :total="total"
+          :page-size="size"
+          :page-sizes="[20, 50, 100]"
+          @current-change="toPage"
+        >
+        </el-pagination>
+      </div>
+    </div>
+
+    <!-- DataTaskDialog -->
+    <data-task-dialog
+      ref="DataTaskDialog"
+      task-type="CLOUD_MARKING_STUDENT_SCORE"
+    ></data-task-dialog>
   </div>
 </template>
 
 <script>
+import { dataReturnList, downloadDataReturn } from "../api";
+import DataTaskDialog from "../components/DataTaskDialog.vue";
+import { downloadByApi } from "@/plugins/download";
+
 export default {
   name: "data-return-manage",
+  components: { DataTaskDialog },
   data() {
-    return {};
+    return {
+      filter: {
+        semesterId: "",
+        examTypeId: "",
+        examId: ""
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      dataList: [],
+      downloading: false
+    };
   },
-  methods: {}
+  async mounted() {
+    await this.$refs.SemesterSelect.search();
+    this.getList();
+  },
+  methods: {
+    async getList() {
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+
+      const data = await dataReturnList(datas);
+      this.dataList = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    async toDownload() {
+      if (
+        !this.filter.semesterId ||
+        !this.filter.examTypeId ||
+        !this.filter.examId
+      ) {
+        this.$message.error("学期、考试以及考试类型必选!");
+        return;
+      }
+
+      if (this.downloading) return;
+      this.downloading = true;
+
+      const res = await downloadByApi(() => {
+        return downloadDataReturn(this.filter);
+      }).catch(e => {
+        this.$message.error(e || "下载失败,请重新尝试!");
+      });
+      this.downloading = false;
+
+      if (!res) return;
+      this.$message.success("下载成功!");
+    }
+  }
 };
 </script>

+ 30 - 15
src/modules/base/views/EcsDataManage.vue

@@ -3,7 +3,13 @@
     <div class="part-box part-box-filter part-box-flex">
       <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
         <el-form-item prop="semesterId" label="学期:">
-          <semester-select v-model="filter.semesterId"></semester-select>
+          <semester-select
+            ref="SemesterSelect"
+            v-model="filter.semesterId"
+            :clearable="false"
+            manual-fetch
+            select-default
+          ></semester-select>
         </el-form-item>
         <el-form-item prop="examTypeId" label="考试类型:">
           <exam-type-select v-model="filter.examTypeId"></exam-type-select>
@@ -16,10 +22,7 @@
         </el-form-item>
       </el-form>
       <div class="part-box-action">
-        <el-button
-          type="primary"
-          icon="el-icon-circle-plus-outline"
-          @click="toSync"
+        <el-button type="primary" icon="el-icon-refresh-left" @click="toSync"
           >同步</el-button
         >
         <el-button type="success" icon="el-icon-s-order" @click="toSyncResult"
@@ -35,14 +38,15 @@
           width="70"
           :index="indexMethod"
         ></el-table-column>
-        <el-table-column prop="semesterName" label="学期"></el-table-column>
-        <el-table-column prop="examTypeName" label="考试类型"></el-table-column>
-        <el-table-column prop="examName" label="考试"></el-table-column>
-        <el-table-column prop="userName" label="操作人"> </el-table-column>
-        <el-table-column prop="createTime" label="操作时间">
-          <span slot-scope="scope">{{
-            scope.row.createTime | timestampFilter
-          }}</span>
+        <el-table-column prop="college" label="学院"></el-table-column>
+        <el-table-column prop="className" label="班级"></el-table-column>
+        <el-table-column prop="name" label="学生"> </el-table-column>
+        <el-table-column prop="studentCode" label="学号"> </el-table-column>
+        <el-table-column prop="subjectName" label="科目"> </el-table-column>
+        <el-table-column prop="subjectCode" label="科目代码"> </el-table-column>
+        <el-table-column prop="totalScore" label="总分" width="80">
+        </el-table-column>
+        <el-table-column prop="status" label="状态" width="80">
         </el-table-column>
       </el-table>
       <div class="part-page">
@@ -58,14 +62,22 @@
         </el-pagination>
       </div>
     </div>
+
+    <!-- DataTaskDialog -->
+    <data-task-dialog
+      ref="DataTaskDialog"
+      task-type="CLOUD_MARKING_STUDENT_SCORE"
+    ></data-task-dialog>
   </div>
 </template>
 
 <script>
 import { ecsDataList, syncEcsData } from "../api";
+import DataTaskDialog from "../components/DataTaskDialog.vue";
 
 export default {
   name: "ecs-data-manage",
+  components: { DataTaskDialog },
   data() {
     return {
       filter: {
@@ -79,7 +91,8 @@ export default {
       dataList: []
     };
   },
-  mounted() {
+  async mounted() {
+    await this.$refs.SemesterSelect.search();
     this.getList();
   },
   methods: {
@@ -110,7 +123,9 @@ export default {
       });
       this.$message.success("任务提交成功!");
     },
-    toSyncResult() {}
+    toSyncResult() {
+      this.$refs.DataTaskDialog.open();
+    }
   }
 };
 </script>

+ 7 - 0
src/plugins/filters.js

@@ -1,5 +1,6 @@
 import Vue from "vue";
 import { formatDate } from "../plugins/utils";
+import { DATA_TASK_STATUS, DATA_TASK_RESULT } from "../constants/enumerate";
 
 const DEFAULT_FIELD = "--";
 
@@ -17,3 +18,9 @@ Vue.filter("timestampFilter", function(val) {
     ? formatDate("YYYY-MM-DD HH:mm:ss", new Date(val * 1))
     : DEFAULT_FIELD;
 });
+Vue.filter("dataTaskStatusFilter", function(val) {
+  return DATA_TASK_STATUS[val] || DEFAULT_FIELD;
+});
+Vue.filter("dataTaskResultFilter", function(val) {
+  return DATA_TASK_RESULT[val] || DEFAULT_FIELD;
+});