浏览代码

feat: 移除无用文件

zhangjie 1 年之前
父节点
当前提交
71b6a373e6
共有 55 个文件被更改,包括 14 次插入12923 次删除
  1. 0 193
      src/modules/course/api.js
  2. 0 901
      src/modules/course/components/TargetReportDetail.vue
  3. 0 333
      src/modules/course/components/data.js
  4. 0 3313
      src/modules/course/components/data.json
  5. 0 150
      src/modules/course/components/profession/AddProfessionalCourse.vue
  6. 0 117
      src/modules/course/components/profession/ModifyProfessional.vue
  7. 0 117
      src/modules/course/components/profession/ModifyRequirement.vue
  8. 0 97
      src/modules/course/components/profession/ModifyRequirementNode.vue
  9. 0 131
      src/modules/course/components/profession/ProfessionalCourse.vue
  10. 0 88
      src/modules/course/components/profession/ProfessionalDetail.vue
  11. 0 261
      src/modules/course/components/profession/ProfessionalMatrix.vue
  12. 0 164
      src/modules/course/components/profession/ProfessionalRequirement.vue
  13. 0 266
      src/modules/course/components/score/EndScoreManage.vue
  14. 0 146
      src/modules/course/components/score/ModifyEndScore.vue
  15. 0 135
      src/modules/course/components/score/ModifyNormalScore.vue
  16. 0 205
      src/modules/course/components/score/NormalScoreManage.vue
  17. 0 128
      src/modules/course/components/score/SelectBlueDimensionDialog.vue
  18. 0 268
      src/modules/course/components/score/SetBlueDialog.vue
  19. 0 107
      src/modules/course/components/score/SyncPaperDialog.vue
  20. 0 105
      src/modules/course/components/score/TargetScoreDetail.vue
  21. 0 18
      src/modules/course/router.js
  22. 0 165
      src/modules/course/views/ProfessionalCertification.vue
  23. 0 129
      src/modules/course/views/TargetReportManage.vue
  24. 0 149
      src/modules/course/views/TargetScoreManage.vue
  25. 0 119
      src/modules/exam/components/WaitTaskAudit.vue
  26. 0 111
      src/modules/exam/components/WaitTaskExam.vue
  27. 0 130
      src/modules/exam/components/WaitTaskExamTask.vue
  28. 7 9
      src/modules/exam/components/taskApply/ModifyTaskApply.vue
  29. 2 7
      src/modules/exam/components/taskApply/TaskFlow.vue
  30. 3 3
      src/modules/exam/components/taskApply/TaskInfo.vue
  31. 2 7
      src/modules/exam/components/taskApply/TaskPaper.vue
  32. 0 6
      src/modules/exam/router.js
  33. 0 13
      src/modules/exam/views/DoneTask.vue
  34. 0 37
      src/modules/stmms/api.js
  35. 0 104
      src/modules/stmms/components/markParam/AnswerPopover.vue
  36. 0 432
      src/modules/stmms/components/markParam/MarkPaperGroup.vue
  37. 0 462
      src/modules/stmms/components/markParam/MarkPaperStructure.vue
  38. 0 240
      src/modules/stmms/components/markParam/MarkParamMarker.vue
  39. 0 144
      src/modules/stmms/components/markParam/MarkParamMarkerLeader.vue
  40. 0 269
      src/modules/stmms/components/markParam/MarkParamObjectiveAnswer.vue
  41. 0 322
      src/modules/stmms/components/markParam/MarkParamStructure.vue
  42. 0 125
      src/modules/stmms/components/markParam/MarkParamUploadAnswer.vue
  43. 0 55
      src/modules/stmms/components/markParam/MarkStatus.vue
  44. 0 155
      src/modules/stmms/components/markParam/ModifyMarkArea.vue
  45. 0 349
      src/modules/stmms/components/markParam/ModifyMarkParams.vue
  46. 0 532
      src/modules/stmms/components/markParam/ModifyMarkerQuestion.vue
  47. 0 104
      src/modules/stmms/components/markParam/ModifyPaperMarker.vue
  48. 0 276
      src/modules/stmms/components/markParam/areaCropper/AreaCropper.vue
  49. 0 77
      src/modules/stmms/components/markParam/areaCropper/ElementItem.vue
  50. 0 669
      src/modules/stmms/components/markParam/areaCropper/ElementResize.vue
  51. 0 49
      src/modules/stmms/components/markParam/areaCropper/move-ele.js
  52. 0 186
      src/modules/stmms/components/markParam/markPaperClass.vue
  53. 0 84
      src/modules/stmms/components/markParam/store.js
  54. 0 6
      src/modules/stmms/router.js
  55. 0 155
      src/modules/stmms/views/UploadStructure.vue

+ 0 - 193
src/modules/course/api.js

@@ -1,113 +1,5 @@
 import { $postParam, $post } from "@/plugins/axios";
 
-// 成绩管理列表
-export const targetScoreListPage = (datas) => {
-  return $postParam("/api/admin/course/degree/score/list", datas);
-};
-// 成绩管理-平时成绩 ------------------->
-// 成绩管理-导入平时成绩-下载模版
-export const scoreTemplateDownload = (datas) => {
-  return $postParam(
-    "/api/admin/course/degree/usual_score/template_download",
-    datas,
-    {
-      responseType: "blob",
-    }
-  );
-};
-// 成绩管理-平时成绩列表
-export const normalScoreListPage = (datas) => {
-  return $postParam("/api/admin/course/degree/usual_score/list", datas);
-};
-// 成绩管理-平时成绩编辑
-export const normalScoreEdit = (datas) => {
-  return $post("/api/admin/course/degree/usual_score/edit", datas);
-};
-// 成绩管理-平时成绩保存
-export const normalScoreSave = (datas) => {
-  return $post("/api/admin/course/degree/usual_score/save", datas);
-};
-// 成绩管理-平时成绩启用/禁用
-export const normalScoreEnable = (datas) => {
-  return $postParam("/api/admin/course/degree/usual_score/enable", datas);
-};
-// 成绩管理-期末成绩 ------------------->
-// 成绩管理-导入期末成绩-下载模版
-export const endScoreTemplateDownload = (datas) => {
-  return $postParam(
-    "/api/admin/course/degree/final_score/template_download",
-    datas,
-    {
-      responseType: "blob",
-    }
-  );
-};
-// 成绩管理-期末成绩列表
-export const endScoreListPage = (datas) => {
-  return $postParam("/api/admin/course/degree/final_score/list", datas);
-};
-// 成绩管理-期末成绩编辑
-export const endScoreEdit = (datas) => {
-  return $post("/api/admin/course/degree/final_score/edit", datas);
-};
-// 成绩管理-期末成绩保存
-export const endScoreSave = (datas) => {
-  return $post("/api/admin/course/degree/final_score/save", datas);
-};
-// 成绩管理-期末成绩同步
-export const endScoreSync = (datas) => {
-  return $postParam("/api/admin/course/degree/final_score/sync", datas);
-};
-// 成绩管理-期末成绩启用/禁用
-export const endScoreEnable = (datas) => {
-  return $postParam("/api/admin/course/degree/final_score/enable", datas);
-};
-// 成绩管理-试卷蓝图详情
-export const endScorePaperPositiveDetail = (datas) => {
-  return $postParam(
-    "/api/admin/course/degree/final_score/paper_struct/query",
-    datas
-  );
-};
-// 成绩管理-保存试卷蓝图
-export const endScorePaperPositiveSave = (datas) => {
-  return $post("/api/admin/course/degree/final_score/paper_struct/save", datas);
-};
-// 成绩管理-同步试卷蓝图
-export const endScorePaperPositiveSync = (datas) => {
-  return $postParam(
-    "/api/admin/course/degree/final_score/paper_struct_dimension/sync",
-    datas
-  );
-};
-// 成绩管理-同步选择试卷
-export const endScoreSyncPaperList = (datas) => {
-  return $postParam("/api/admin/course/degree/final_score/choose_paper", datas);
-};
-
-// 报告管理 ------------------->
-export const targetReportListPage = (datas) => {
-  return $postParam("/api/admin/course/degree/report/list", datas);
-};
-// 报告管理-查看报告
-export const targetReportDetail = (datas) => {
-  return $postParam("/api/admin/course/degree/report/view", datas);
-};
-// 报告管理-保存报告
-export const targetReportSave = (datas) => {
-  return $post("/api/admin/course/degree/report/save", datas);
-};
-// 报告管理-导出报告
-export const exportTargetReport = (datas) => {
-  return $postParam("/api/admin/course/degree/report/export", datas, {
-    responseType: "blob",
-  });
-};
-// 报告管理-报告数据发生变化
-export const targetReportChangeCheck = (datas) => {
-  return $postParam("/api/admin/course/degree/report/change", datas);
-};
-
 // 文档管理 ------------------->
 export const courseDocumentListPage = (datas) => {
   return $postParam("/api/admin/mark/archive/document/list", datas);
@@ -134,88 +26,3 @@ export const documentSave = (datas) => {
 export const documentDelete = (id) => {
   return $postParam("/api/admin/mark/archive/document/delete", { id });
 };
-
-// 专业管理 ------------------->
-// 专业管理-列表查询
-export const professionalListPage = (datas) => {
-  return $postParam("/api/admin/professional/certification/page", datas);
-};
-// 专业管理-新增编辑
-export const professionalSave = (datas) => {
-  return $post("/api/admin/professional/certification/save", datas);
-};
-
-// 专业管理-课程管理
-// 专业管理-课程管理-列表查询
-export const professionalCourseListPage = (datas) => {
-  return $postParam("/api/admin/professional/certification/course/list", datas);
-};
-// 专业管理-课程管理-课程选择
-export const professionalCourseQueryList = (datas) => {
-  return $postParam(
-    "/api/admin/professional/certification/course/query_list",
-    datas
-  );
-};
-// 专业管理-课程管理-保存
-export const professionalCourseSave = (datas) => {
-  return $post("/api/admin/professional/certification/course/save", datas);
-};
-// 专业管理-课程管理-排序
-export const professionalCourseSort = (datas) => {
-  return $post("/api/admin/professional/certification/course/sort", datas);
-};
-// 专业管理-课程管理-删除
-export const professionalCourseRemove = (id) => {
-  return $postParam("/api/admin/professional/certification/course/remove", {
-    id,
-  });
-};
-
-// 专业管理-毕业要求管理
-// 专业管理-毕业要求管理-列表查询
-export const professionalRequirementListPage = (datas) => {
-  return $postParam(
-    "/api/admin/professional/certification/requirement/list",
-    datas
-  );
-};
-// 专业管理-毕业要求管理-保存
-export const professionalRequirementSave = (datas) => {
-  return $post("/api/admin/professional/certification/requirement/save", datas);
-};
-// 专业管理-毕业要求管理-排序
-export const professionalRequirementSort = (datas) => {
-  return $post("/api/admin/professional/certification/requirement/sort", datas);
-};
-// 专业管理-毕业要求管理-删除
-export const professionalRequirementRemove = (id) => {
-  return $postParam(
-    "/api/admin/professional/certification/requirement/remove",
-    {
-      id,
-    }
-  );
-};
-
-// 专业管理-毕业支撑矩阵
-// 专业管理-毕业支撑矩阵-列表查询
-export const professionalMatrixDetail = (datas) => {
-  return $postParam("/api/admin/professional/certification/matrix/get", datas);
-};
-// 专业管理-毕业支撑矩阵-保存
-export const professionalMatrixSave = (datas) => {
-  return $post("/api/admin/professional/certification/matrix/save", datas, {
-    silence: true,
-  });
-};
-// 专业管理-毕业支撑矩阵-下载
-export const professionalMatrixDownload = (professionalId) => {
-  return $postParam(
-    "/api/admin/professional/certification/matrix/download",
-    { professionalId },
-    {
-      responseType: "blob",
-    }
-  );
-};

+ 0 - 901
src/modules/course/components/TargetReportDetail.vue

@@ -1,901 +0,0 @@
-<template>
-  <el-dialog
-    class="page-dialog"
-    :visible.sync="modalIsShow"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    :show-close="false"
-    append-to-body
-    fullscreen
-    @opened="initData"
-  >
-    <div slot="title" class="box-justify">
-      <div>
-        报告详情<span class="color-gray ml-2"
-          >{{ course.courseName }}({{ course.courseCode }})</span
-        >
-      </div>
-      <div>
-        <el-button type="primary" :loading="downloading" @click="toSave"
-          >保存报告</el-button
-        >
-        <el-button type="primary" :loading="downloading" @click="toExport"
-          >导出报告</el-button
-        >
-        <el-button type="danger" @click="cancel">退出</el-button>
-      </div>
-    </div>
-    <div v-if="modalIsShow">
-      <!-- base info -->
-      <div class="page-head">
-        <h2>
-          <span>课程基本情况</span>
-        </h2>
-      </div>
-      <div class="part-box part-box-pad">
-        <table class="table table-tiny">
-          <colgroup>
-            <col width="100" />
-            <col />
-            <col width="100" />
-            <col />
-            <col width="100" />
-            <col />
-            <col width="100" />
-            <col />
-          </colgroup>
-          <tr>
-            <td class="td-bg">课程编码</td>
-            <td>{{ commonInfo.courseCode }}</td>
-            <td class="td-bg">课程名称</td>
-            <td>{{ commonInfo.courseName }}</td>
-            <td class="td-bg">课程类别</td>
-            <td>
-              <el-input
-                v-model="courseBasicInfo.courseType"
-                placeholder="请填写课程类别"
-                size="small"
-                :maxlength="30"
-              ></el-input>
-            </td>
-            <td class="td-bg">学分</td>
-            <td>
-              <el-input-number
-                v-model="courseBasicInfo.credit"
-                placeholder="请录入学分"
-                size="small"
-                :min="0"
-                :max="999"
-                :controls="false"
-                style="width: 100px"
-              ></el-input-number>
-            </td>
-          </tr>
-          <tr>
-            <td class="td-bg">考核方式</td>
-            <td>
-              <el-input
-                v-model="courseBasicInfo.evaluationMode"
-                placeholder="请填写考核方式"
-                size="small"
-                :maxlength="30"
-              ></el-input>
-            </td>
-            <td class="td-bg">开课时间</td>
-            <td>{{ courseBasicInfo.openTime }}</td>
-            <td class="td-bg">授课对象</td>
-            <td>{{ courseBasicInfo.teachingObject }}</td>
-            <td class="td-bg">学时</td>
-            <td>
-              <el-input-number
-                v-model="courseBasicInfo.period"
-                placeholder="请录入学时"
-                :min="0"
-                :max="999"
-                :controls="false"
-                size="small"
-                style="width: 100px"
-              ></el-input-number>
-            </td>
-          </tr>
-          <tr>
-            <td class="td-bg">选课人数</td>
-            <td>
-              <el-input-number
-                v-model="courseBasicInfo.selectionCount"
-                placeholder="请录入选课人数"
-                :min="0"
-                :max="999"
-                :controls="false"
-                size="small"
-                style="width: 125px"
-              ></el-input-number>
-            </td>
-            <td class="td-bg">参评人数</td>
-            <td>{{ courseBasicInfo.participantCount }}</td>
-            <td class="td-bg">课程目标达成度期望值</td>
-            <td colspan="3">
-              <el-select
-                v-model="courseBasicInfo.courseDegree"
-                size="small"
-                style="width: 100%"
-              >
-                <el-option
-                  v-for="item in expectancyList"
-                  :key="item"
-                  :value="item"
-                  :label="item"
-                ></el-option>
-              </el-select>
-            </td>
-          </tr>
-          <tr>
-            <td class="td-bg">任课老师</td>
-            <td>{{ courseBasicInfo.teacher }}</td>
-            <td class="td-bg">评价负责人</td>
-            <td>
-              <el-input
-                v-model="courseBasicInfo.director"
-                placeholder="请填写评价负责人姓名"
-                size="small"
-                :maxlength="30"
-              ></el-input>
-            </td>
-            <td class="td-bg">评价参与人</td>
-            <td colspan="3">
-              <el-input
-                v-model="courseBasicInfo.participant"
-                placeholder="请填写评价人姓名"
-                size="small"
-                :maxlength="30"
-              ></el-input>
-            </td>
-          </tr>
-        </table>
-      </div>
-
-      <div class="page-head">
-        <h2>
-          <span>课程目标考核分布</span>
-          <el-popover
-            popper-class="el-popper-dark"
-            placement="right-start"
-            width="500"
-            trigger="hover"
-          >
-            <i class="el-icon-question" slot="reference"></i>
-            <div>
-              <p>
-                课程目标分布会自动按题库系统里试卷下试题标记的属性内容进行显示
-              </p>
-            </div>
-          </el-popover>
-        </h2>
-      </div>
-      <div class="part-box part-box-pad">
-        <el-table :data="questionInfoTable">
-          <el-table-column
-            label="试题号"
-            prop="name"
-            width="140"
-            align="center"
-            fixed="left"
-          ></el-table-column>
-          <el-table-column
-            label="合计"
-            prop="totalScore"
-            width="100"
-            align="center"
-            fixed="left"
-          ></el-table-column>
-          <el-table-column
-            v-for="struct in paperStructs"
-            :key="struct.mainNumber"
-            :label="struct.mainNumber"
-            align="center"
-          >
-            <el-table-column
-              v-for="subNumber in struct.subNumbers"
-              :key="subNumber"
-              :label="subNumber"
-              :prop="`${struct.mainNumber}_${subNumber}`"
-              align="center"
-            >
-            </el-table-column>
-          </el-table-column>
-        </el-table>
-        <div class="chart-box" style="height: 300px; margin-top: 20px">
-          <v-chart
-            v-if="questionInfoChartOption"
-            :option="questionInfoChartOption"
-          ></v-chart>
-        </div>
-      </div>
-
-      <div class="page-head">
-        <h2>
-          <span>课程目标达成评价结果</span>
-          <el-popover
-            popper-class="el-popper-dark"
-            placement="right-start"
-            width="500"
-            trigger="hover"
-          >
-            <i class="el-icon-question" slot="reference"></i>
-            <div>
-              <p>1.评价依据:填写通过考核什么内容实现课程目标的评价;</p>
-              <p>2.目标分值:对应考核环节的满分;</p>
-              <p>
-                3.权重:对应考核环节在对应的课程目标中的权重,目标下各项权重相加等于1;
-              </p>
-              <p>4.实际平均分:为参与评价的学生在该环节的平均分;</p>
-              <p>5.目标达成评价值:∑(实际平均分/目标分值*权重);</p>
-              <p>6.整体课程目标达成评价值:为课程分目标达成评价值的最小值。</p>
-            </div>
-          </el-popover>
-        </h2>
-      </div>
-      <div class="part-box part-box-pad">
-        <h4 class="part-title">课程考核成绩评价结果</h4>
-
-        <table class="table">
-          <tr class="td-bg">
-            <th>课程目标</th>
-            <th>评价依据</th>
-            <th>评价环节</th>
-            <th>权重</th>
-            <th>目标分值</th>
-            <th>实际平均分</th>
-            <th>目标达成评价值</th>
-          </tr>
-
-          <template v-for="item in courseTargetList">
-            <tr
-              v-for="(evaluation, eindex) in item.evaluationList"
-              :key="`${item.targetId}-${eindex}`"
-            >
-              <td
-                v-if="!eindex"
-                :rowspan="item.evaluationList.length"
-                style="width: 240px"
-              >
-                {{ item.targetName }}
-              </td>
-              <td v-if="!eindex" :rowspan="item.evaluationList.length">
-                <p
-                  v-for="edesc in item.graduationRequirementPoint.split('\n')"
-                  :key="edesc"
-                >
-                  {{ edesc }}
-                </p>
-              </td>
-              <td style="width: 140px">{{ evaluation.evaluation }}</td>
-
-              <td
-                v-if="!eindex"
-                style="width: 80px"
-                :rowspan="item.evaluationList.length - 1"
-              >
-                {{ item.normalTargetWeight }}
-              </td>
-              <td
-                v-else-if="eindex === item.evaluationList.length - 1"
-                style="width: 80px"
-              >
-                {{ evaluation.targetWeight }}
-              </td>
-
-              <td style="width: 100px">{{ evaluation.targetScore }}</td>
-              <td style="width: 100px">{{ evaluation.targetAvgScore }}</td>
-              <td
-                v-if="!eindex"
-                :rowspan="item.evaluationList.length"
-                style="width: 140px"
-              >
-                {{ item.evaluationValue }}
-              </td>
-            </tr>
-          </template>
-          <tr>
-            <td colspan="6">课程总目标</td>
-            <td>{{ courseTargetValue }}</td>
-          </tr>
-        </table>
-
-        <div class="chart-box" style="height: 400px; margin-top: 20px">
-          <v-chart
-            v-if="courseTargetListChartOption"
-            :option="courseTargetListChartOption"
-          ></v-chart>
-        </div>
-
-        <h4 class="part-title">课程考核成绩评价明细结果</h4>
-
-        <el-table
-          :data="studentScoreTable"
-          :span-method="studentScoreSpanMethod"
-        >
-          <el-table-column
-            label="姓名"
-            prop="name"
-            min-width="120"
-            align="center"
-            fixed="left"
-          ></el-table-column>
-          <el-table-column
-            label="学号"
-            prop="studentCode"
-            width="100"
-            align="center"
-            fixed="left"
-          ></el-table-column>
-          <el-table-column
-            v-for="(target, tindex) in courseTargets"
-            :key="tindex"
-            :label="target.targetName"
-            align="center"
-          >
-            <el-table-column width="140" align="center">
-              <template slot="header">
-                期末考试({{ target.finalWeight | percentFilter }})
-              </template>
-              <el-table-column
-                label="期末成绩"
-                :prop="`${target.targetId}-final`"
-                width="140"
-                align="center"
-              >
-              </el-table-column>
-            </el-table-column>
-            <el-table-column min-width="120" align="center">
-              <template slot="header">
-                平时考试({{ target.usualWeight | percentFilter }})
-              </template>
-              <el-table-column
-                v-for="work in target.usualWorks"
-                :key="`${target.targetId}${work}`"
-                :label="work"
-                :prop="`${target.targetId}-usual-${work}`"
-                min-width="100"
-                align="center"
-              >
-              </el-table-column>
-            </el-table-column>
-          </el-table-column>
-          <el-table-column
-            label="学生成绩"
-            prop="score"
-            align="center"
-            width="100"
-          ></el-table-column>
-        </el-table>
-      </div>
-    </div>
-
-    <div slot="footer"></div>
-  </el-dialog>
-</template>
-
-<script>
-// import { reportData } from "./data";
-import {
-  targetReportDetail,
-  exportTargetReport,
-  targetReportSave,
-  targetReportChangeCheck,
-} from "../api";
-import { downloadByApi } from "@/plugins/download";
-import { calcSum } from "@/plugins/utils";
-
-export default {
-  name: "target-report-detail",
-  props: {
-    course: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  filters: {
-    percentFilter(val) {
-      const num = val || 0;
-      const perc = num % 10 ? 2 : 1;
-      return ((num || 0) / 100).toFixed(perc);
-    },
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      expectancyList: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
-      commonInfo: {},
-      courseBasicInfo: {},
-      paperStructs: [],
-      questionInfoTable: [],
-      courseTargetList: [],
-      courseTargetValue: 0.67,
-      questionInfoChartOption: null,
-      courseTargetListChartOption: null,
-
-      courseTargets: [],
-      targetColumnCounts: [],
-      studentScoreTable: [],
-      downloading: false,
-    };
-  },
-  methods: {
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    resetData() {
-      this.commonInfo = {};
-      this.courseBasicInfo = {};
-      this.paperStructs = [];
-      this.questionInfoTable = [];
-      this.courseTargetList = [];
-      this.courseTargetValue = 0.67;
-      this.questionInfoChartOption = null;
-      this.courseTargetListChartOption = null;
-      this.courseTargets = [];
-      this.targetColumnCounts = [];
-      this.studentScoreTable = [];
-      this.downloading = false;
-    },
-    buildData(data) {
-      this.commonInfo = data.commonInfo;
-      this.courseBasicInfo = data.courseBasicInfo;
-
-      this.courseTargetValue =
-        data.courseEvaluationResultInfo.targetEvaluationSumValue;
-      this.courseTargetList = data.courseEvaluationResultInfo.targetList.map(
-        (target) => {
-          target.normalTargetWeight = calcSum(
-            target.evaluationList.slice(0, -1).map((elem) => elem.targetWeight)
-          );
-          return target;
-        }
-      );
-
-      const {
-        courseEvaluationSpreadInfo: { questionInfo, scoreList },
-      } = data;
-      this.parsePaperStructs(questionInfo);
-      this.parseQuestionInfoTable(questionInfo);
-      this.questionInfoChartOption = this.getQuestionInfoChartOption(scoreList);
-      this.courseTargetListChartOption = this.getCourseTargetListChartOption();
-
-      let examStudentList =
-        data.courseEvaluationResultDetailInfo.examStudentList;
-      examStudentList.pop();
-      examStudentList.splice(examStudentList.length - 2, 1);
-
-      this.parseCourseTargets(examStudentList);
-      this.parseStudentScoreTable(examStudentList);
-    },
-    async initData() {
-      this.resetData();
-
-      await this.checkChange();
-      const data = await targetReportDetail({
-        examId: this.course.examId,
-        courseId: this.course.courseId,
-        teachCourseId: this.course.teachCourseId,
-      });
-      this.buildData(data);
-    },
-    async checkChange() {
-      const res = await targetReportChangeCheck({
-        examId: this.course.examId,
-        courseId: this.course.courseId,
-        teachCourseId: this.course.teachCourseId,
-        report: true,
-      });
-
-      if (res.courseTargetChange) {
-        this.$notify.warning("课程目标与已保存不一致,请重新设置权重!");
-      }
-      if (res.evaluationChange) {
-        this.$notify.warning(
-          "评价方式与已保存不一致,请重新设置权重及导入新的平时成绩!"
-        );
-      }
-      if (res.targetScoreChange) {
-        this.$notify.warning(res.targetScoreChangeStr);
-      }
-    },
-    parsePaperStructs(questionInfo) {
-      if (!questionInfo || !questionInfo.length) return;
-
-      const structMap = {};
-      questionInfo.forEach((item) => {
-        if (!structMap[item.mainNumber]) {
-          structMap[item.mainNumber] = [];
-        }
-        structMap[item.mainNumber].push(item.subNumber + "");
-      });
-      this.paperStructs = Object.keys(structMap).map((mainNumber) => {
-        return {
-          mainNumber,
-          subNumbers: structMap[mainNumber],
-        };
-      });
-    },
-    parseQuestionInfoTable(questionInfo) {
-      const targetMap = {};
-      const tData = {
-        name: "目标分值",
-        totalScore: calcSum(questionInfo.map((item) => item.score || 0)),
-      };
-      questionInfo.forEach((question) => {
-        const qno = `${question.mainNumber}_${question.subNumber}`;
-        tData[qno] = question.score;
-
-        question.targetList.forEach((target) => {
-          if (!targetMap[target.targetId]) {
-            targetMap[target.targetId] = {
-              name: target.targetName,
-              totalScore: 0,
-            };
-          }
-
-          if (target.dimensionList.length) {
-            targetMap[target.targetId][qno] = question.score;
-            targetMap[target.targetId].totalScore += question.score;
-          } else {
-            targetMap[target.targetId][qno] = "";
-          }
-        });
-      });
-
-      this.questionInfoTable = [tData, ...Object.values(targetMap)];
-    },
-    getQuestionInfoChartOption(scoreList) {
-      const scoreRange = scoreList.scoreRange.map((item) => {
-        return {
-          name: `${item.minScore}~${item.maxScore}`,
-          value: item.rate,
-        };
-      });
-      scoreRange.unshift({
-        name: "不及格",
-        value: scoreList.failRate,
-      });
-
-      let options = {
-        color: ["#556dff", "#3A5AE5"],
-        title: {
-          text: "成绩分布图",
-          left: "center",
-        },
-        grid: {
-          left: 40,
-          top: 60,
-          right: 80,
-          bottom: 40,
-          containLabel: true,
-        },
-        xAxis: {
-          type: "category",
-          name: "成绩(分)",
-          nameTextStyle: {
-            color: "#363D59",
-          },
-          data: scoreRange.map((item) => item.name),
-          axisLabel: {
-            color: "#6F7482",
-            interval: 0,
-            fontSize: 12,
-            margin: 12,
-          },
-          axisLine: {
-            show: true,
-            lineStyle: {
-              color: "#EFF0F5",
-            },
-          },
-          splitLine: {
-            show: false,
-          },
-          axisTick: {
-            show: false,
-          },
-          axisPointer: {
-            type: "shadow",
-          },
-        },
-        yAxis: {
-          type: "value",
-          name: "百分比(%)",
-          nameTextStyle: {
-            color: "#363D59",
-          },
-          axisLabel: {
-            color: "#6F7482",
-          },
-          axisLine: {
-            lineStyle: {
-              color: "#EFF0F5",
-            },
-          },
-          splitLine: {
-            lineStyle: {
-              color: "#EFF0F5",
-            },
-          },
-        },
-        series: [
-          {
-            name: "占比",
-            type: "bar",
-            barWidth: 60,
-            data: scoreRange.map((item) => item.value),
-            label: {
-              show: true,
-              formatter: "{c}%",
-              position: "top",
-            },
-          },
-        ],
-      };
-      return options;
-    },
-    getCourseTargetListChartOption() {
-      let options = {
-        color: ["#556dff", "#f59a23"],
-        title: {
-          text: "课程目标达成评价值",
-          left: "center",
-        },
-        grid: {
-          left: 40,
-          top: 40,
-          right: 80,
-          bottom: 30,
-          containLabel: true,
-        },
-        legend: {
-          top: 0,
-          data: ["期望值", "达成值"],
-          itemWidth: 12,
-          itemHeight: 4,
-          itemGap: 22,
-          right: 40,
-        },
-        xAxis: {
-          type: "category",
-          name: "课程目标",
-          nameTextStyle: {
-            color: "#363D59",
-          },
-          data: this.courseTargetList.map((item) => item.targetName),
-          axisLabel: {
-            color: "#6F7482",
-            interval: 0,
-            fontSize: 12,
-            margin: 12,
-          },
-          axisLine: {
-            show: true,
-            lineStyle: {
-              color: "#EFF0F5",
-            },
-          },
-          splitLine: {
-            show: false,
-          },
-          axisTick: {
-            show: false,
-          },
-          axisPointer: {
-            type: "shadow",
-          },
-        },
-        yAxis: {
-          type: "value",
-          name: "期望值",
-          min: 0,
-          max: 1,
-          interval: 0.1,
-          nameTextStyle: {
-            color: "#363D59",
-          },
-          axisLabel: {
-            color: "#6F7482",
-          },
-          axisLine: {
-            lineStyle: {
-              color: "#EFF0F5",
-            },
-          },
-          splitLine: {
-            lineStyle: {
-              color: "#EFF0F5",
-            },
-          },
-        },
-        series: [
-          {
-            name: "达成值",
-            type: "bar",
-            barWidth: 60,
-            data: this.courseTargetList.map((item) => item.evaluationValue),
-            label: {
-              show: true,
-              position: "top",
-            },
-          },
-          {
-            name: "期望值",
-            type: "line",
-            symbol: "none",
-            data: this.courseTargetList.map(
-              (item) => this.courseBasicInfo.courseDegree || 0
-            ),
-          },
-        ],
-      };
-      return options;
-    },
-    parseCourseTargets(examStudentList) {
-      if (!examStudentList || !examStudentList.length) return;
-
-      const targetList = examStudentList[0].targetList;
-      const targetVals = {};
-      this.courseTargetList.forEach((target) => {
-        targetVals[target.targetId] = target.evaluationValue;
-      });
-
-      let tColumnCounts = [];
-      this.courseTargets = targetList.map((target) => {
-        const ntarget = {
-          targetId: target.targetId,
-          targetName: target.targetName,
-          finalWeight: target.finalScore.targetWeight,
-          usualWeight: target.usualScore.targetWeight,
-          evaluationValue: targetVals[target.targetId],
-        };
-        ntarget.finalDimensions = ["期末成绩"];
-        ntarget.usualWorks = target.usualScore.scoreList.map(
-          (item) => item.evaluation
-        );
-        tColumnCounts.push(
-          ntarget.finalDimensions.length + ntarget.usualWorks.length
-        );
-        return ntarget;
-      });
-
-      let tCount = 0;
-      this.targetColumnCounts = tColumnCounts.map((item) => {
-        tCount += item;
-        return tCount;
-      });
-    },
-    parseStudentScoreTable(examStudentList) {
-      const lastIndex = examStudentList.length - 1;
-      const studentScoreTable = examStudentList.map((student, sindex) => {
-        const nitem = {
-          name: student.name,
-          studentCode: student.studentCode,
-          score: student.score,
-        };
-
-        const finalScoreKey =
-          lastIndex === sindex ? "matrixAvgScore" : "targetScoreSum";
-        const workScoreKey = lastIndex === sindex ? "matrixAvgScore" : "score";
-
-        student.targetList.forEach((target, index) => {
-          nitem[`${target.targetId}-final`] = target.finalScore[finalScoreKey];
-
-          target.usualScore.scoreList.forEach((work) => {
-            nitem[`${target.targetId}-usual-${work.evaluation}`] =
-              work[workScoreKey];
-          });
-        });
-        return nitem;
-      });
-
-      const targetData = {
-        name: "课程目标达成度",
-        score: "",
-      };
-      this.courseTargets.forEach((target) => {
-        targetData[`${target.targetId}-final`] = target.evaluationValue;
-      });
-      studentScoreTable.push(targetData);
-
-      const fTarget = this.courseTargets[0];
-      studentScoreTable.push({
-        name: "课程达成度",
-        [`${fTarget.targetId}-final`]: this.courseTargetValue,
-      });
-      this.studentScoreTable = studentScoreTable;
-    },
-    studentScoreSpanMethod({ row, column, rowIndex, columnIndex }) {
-      const lineCount = this.studentScoreTable.length - 1;
-      const maxTargetColumnCount = this.targetColumnCounts.slice(-1)[0];
-      if (rowIndex === lineCount) {
-        if (columnIndex === 0) {
-          return [1, 2];
-        } else if (columnIndex === 2) {
-          return [1, maxTargetColumnCount + 1];
-        } else {
-          return [0, 0];
-        }
-      }
-      if (rowIndex === lineCount - 1) {
-        const colsMap = {};
-        const targetColumns = [0, ...this.targetColumnCounts.slice(0, -1)];
-        targetColumns.map((item, index) => {
-          colsMap[item] = this.targetColumnCounts[index] - item;
-        });
-        if (columnIndex === 0) {
-          return [1, 2];
-        } else {
-          if (targetColumns.includes(columnIndex - 2)) {
-            return [1, colsMap[columnIndex - 2]];
-          } else if (columnIndex < maxTargetColumnCount + 2) {
-            return [0, 0];
-          } else {
-            return [1, 1];
-          }
-        }
-      }
-      if (rowIndex === lineCount - 2) {
-        if (columnIndex === 0) {
-          return [1, 2];
-        } else if (columnIndex === 1) {
-          return [0, 0];
-        } else {
-          return [1, 1];
-        }
-      }
-    },
-    async toSave() {
-      if (this.downloading) return;
-      this.downloading = true;
-
-      const res = await targetReportSave({
-        examId: this.course.examId,
-        courseName: this.course.courseName,
-        courseId: this.course.courseId,
-        teachCourseId: this.course.teachCourseId,
-        ...this.courseBasicInfo,
-      }).catch(() => {});
-      this.downloading = false;
-
-      if (!res) return;
-      this.$message.success("保存成功!");
-      this.initData();
-    },
-    async toExport() {
-      if (this.downloading) return;
-      this.downloading = true;
-
-      const res = await downloadByApi(() => {
-        const datas = {
-          examId: this.course.examId,
-          courseId: this.course.courseId,
-          teachCourseId: this.course.teachCourseId,
-        };
-        return exportTargetReport(datas);
-      }).catch((e) => {
-        this.$message.error(e || "下载失败,请重新尝试!");
-      });
-      this.downloading = false;
-
-      if (!res) return;
-      this.$message.success("下载成功!");
-    },
-  },
-};
-</script>
-
-<style scoped>
-.td-bg {
-  color: #8b8fa1;
-  font-weight: 500;
-}
-</style>

+ 0 - 333
src/modules/course/components/data.js

@@ -1,333 +0,0 @@
-const courseTargetList = [
-  {
-    targetId: "1",
-    targetName: "课程目标1",
-    evaluationDesc:
-      "系统掌握高等数学中的基本概念、基本方法、基本技巧(A1)\n熟练掌握求极限的基本方法与技巧、判断函数的连续性(A2)\n熟练掌握求导数的基本方法与技巧(A3)\n熟练掌握求不定积分与定积分的基本方法与技巧(A4)\n掌握一阶及二阶微分方程的解法(A5)\n熟练掌握多元函数极限的求法、偏导数及全微分的求法,复合函数求导的基本方法与技巧(A6)\n熟练掌握多元函数积分学的基本方法与解题技巧(A7)\n掌握级数敛散性判别法,简单的幂级数求和函数及函数展开成幂级数(A8)",
-    evaluationValue: 0.67,
-    evaluationList: [
-      {
-        name: "平时作业",
-        weight: "10%",
-        score: 40,
-        avg: 25.93,
-      },
-      {
-        name: "期中考查",
-        weight: "20%",
-        score: 5,
-        avg: 4.23,
-      },
-      {
-        name: "期末考试",
-        weight: "70%",
-        score: 10,
-        avg: 7.82,
-      },
-    ],
-  },
-  {
-    targetId: "2",
-    targetName: "课程目标2",
-    evaluationDesc:
-      "掌握数列极限、函数极限的基本概念、性质并会求极限(B1)\n微分中值定理的证明及其应用(B2)\n隐函数求导(B3)\n幂级数求和函数及函数展开成幂级数(B4)",
-    evaluationValue: 0.75,
-    evaluationList: [
-      {
-        name: "平时作业",
-        weight: "10%",
-        score: 40,
-        avg: 27.93,
-      },
-      {
-        name: "期中考查",
-        weight: "20%",
-        score: 5,
-        avg: 4.23,
-      },
-      {
-        name: "期末考试",
-        weight: "70%",
-        score: 10,
-        avg: 7.82,
-      },
-    ],
-  },
-  {
-    targetId: "3",
-    targetName: "课程目标3",
-    evaluationDesc:
-      "掌握微分的应用、微分中值定理的应用、函数的图形与性态、求函数的极值与最值(C1)\n掌握定积分几何应用(C2)\n掌握多元函数微分学的应用(C3)\n熟练掌握二重积分(C4)",
-    evaluationValue: 0.82,
-    evaluationList: [
-      {
-        name: "平时作业",
-        weight: "10%",
-        score: 40,
-        avg: 32.93,
-      },
-      {
-        name: "期中考查",
-        weight: "20%",
-        score: 5,
-        avg: 4.23,
-      },
-      {
-        name: "期末考试",
-        weight: "70%",
-        score: 10,
-        avg: 8.82,
-      },
-    ],
-  },
-];
-const structs = [
-  {
-    subQuestionCount: 15,
-    score: 2,
-  },
-  {
-    subQuestionCount: 5,
-    score: 2,
-  },
-  {
-    subQuestionCount: 6,
-    score: 5,
-  },
-  {
-    subQuestionCount: 3,
-    score: 10,
-  },
-];
-const questionInfo = [];
-structs.forEach((item, index) => {
-  for (let i = 0; i < item.subQuestionCount; i++) {
-    questionInfo.push({
-      mainNumber: index + 1,
-      subNumber: i + 1,
-      score: item.score,
-      targetList: getQuestionInfoTarget(),
-    });
-  }
-});
-
-function getQuestionInfoTarget() {
-  const targets = getRandamItems(courseTargetList, getRandomNum(2, 1));
-  return targets.map((item) => {
-    return {
-      targetId: item.targetId,
-      targetName: item.targetName,
-      dimensionList: [1],
-    };
-  });
-}
-
-const dimensionNames = [
-  "A1",
-  "A2",
-  "A3",
-  "A4",
-  "B1",
-  "B2",
-  "B3",
-  "C1",
-  "C2",
-  "C3",
-  "C4",
-];
-const workNames = ["作业1", "作业2", "作业3", "作业4", "作业5"];
-const students = [
-  "周晓",
-  "张华",
-  "李佳",
-  "徐琦",
-  "陈真",
-  "李阳",
-  "张五",
-  "赵明",
-];
-function getRandomNum(num, minnum = 0) {
-  return Math.ceil(Math.random() * (num - minnum)) + minnum;
-}
-
-function getRandamItems(list, num) {
-  const sources = [...list];
-  if (!num || num >= list.length) return sources;
-
-  let no = num;
-  let data = [];
-  while (no) {
-    const ind = getRandomNum(sources.length);
-    data.push(sources[ind - 1]);
-    sources.splice(ind - 1, 1);
-    no--;
-  }
-  return data;
-}
-
-const courseStructs = courseTargetList.map((target) => {
-  const endRate = getRandomNum(10, 2);
-  return {
-    targetId: target.targetId,
-    targetName: target.targetName,
-    evaluationValue: target.evaluationValue,
-    endExam: "期末考试",
-    endDimensions: getRandamItems(dimensionNames, 4),
-    endRate: endRate / 10,
-    normalExam: "平时考试",
-    normalWorks: getRandamItems(workNames, 3),
-    normalRate: (10 - endRate) / 10,
-  };
-});
-
-const examStudentList = [...getRandamItems(students, 4), "平均分"].map(
-  (item, index) => {
-    const targetList = courseStructs.map((target) => {
-      const ntarget = {
-        targetId: target.targetId,
-        targetName: target.targetName,
-        evaluationValue: target.evaluationValue,
-      };
-      ntarget.finalScore = {
-        weight: target.endRate,
-        dimensionList: target.endDimensions.map((ditem) => {
-          return {
-            dimensionId: ditem,
-            dimensionCode: ditem,
-            dimensionName: ditem,
-            dimensionScore: getRandomNum(5),
-          };
-        }),
-      };
-      ntarget.usualScore = {
-        weight: target.normalRate,
-        scoreList: target.normalWorks.map((witem) => {
-          return {
-            name: witem,
-            score: getRandomNum(100),
-          };
-        }),
-      };
-      return ntarget;
-    });
-
-    const nitem = {
-      name: item,
-      studentCode: "082001" + index,
-      score: getRandomNum(100),
-      targetList,
-    };
-    return nitem;
-  }
-);
-
-export const reportData = {
-  commonInfo: {
-    //公共信息
-    examId: "1",
-    courseCode: "1001",
-    couserName: "数学",
-    paperNumber: "1235678909",
-  },
-  courseBasicInfo: {
-    //课程基本情况
-    credit: 2,
-    period: 60,
-    courseType: "",
-    evaluationMode: "",
-    openTime: "2022-2023学年第2学期",
-    teachingObject: "2019级生物科学2班",
-    selectionCount: null,
-    participantCount: 45,
-    courseDegree: 0.5,
-    teacher: "李老师",
-    director: "评价责任人",
-    participant: "评价参与人",
-  },
-  courseEvaluationSpreadInfo: {
-    questionInfo,
-    scoreList: {
-      failCount: 1,
-      failRate: 160,
-      scoreRange: [
-        {
-          studentCount: 6,
-          minScore: 1,
-          maxScore: 9.5,
-          rate: 144,
-        },
-        {
-          studentCount: 7,
-          minScore: 10,
-          maxScore: 19.5,
-          rate: 168,
-        },
-        {
-          studentCount: 0,
-          minScore: 20,
-          maxScore: 29.5,
-          rate: 0,
-        },
-        {
-          studentCount: 0,
-          minScore: 30,
-          maxScore: 39.5,
-          rate: 0,
-        },
-        {
-          studentCount: 0,
-          minScore: 40,
-          maxScore: 49.5,
-          rate: 0,
-        },
-        {
-          studentCount: 0,
-          minScore: 50,
-          maxScore: 59.5,
-          rate: 0,
-        },
-        {
-          studentCount: 0,
-          minScore: 60,
-          maxScore: 69.5,
-          rate: 0,
-        },
-        {
-          studentCount: 0,
-          minScore: 70,
-          maxScore: 79.5,
-          rate: 0,
-        },
-        {
-          studentCount: 0,
-          minScore: 80,
-          maxScore: 89.5,
-          rate: 0,
-        },
-        {
-          studentCount: 0,
-          minScore: 90,
-          maxScore: 100,
-          rate: 0,
-        },
-      ],
-    },
-  },
-  courseEvaluationResultInfo: {
-    target: "课程总目标",
-    targetValue: 0.89,
-    targetList: courseTargetList,
-  },
-  courseEvaluationResultDetailInfo: {
-    examStudentList,
-    courseTargetList: courseTargetList.map((item) => {
-      return {
-        targetId: item.targetId,
-        targetName: item.targetName,
-        usualScore: getRandomNum(10, 5) / 10,
-        finalScore: getRandomNum(10, 5) / 10,
-      };
-    }),
-  },
-};
-// console.log(reportData);

+ 0 - 3313
src/modules/course/components/data.json

@@ -1,3313 +0,0 @@
-{
-  "code": 200,
-  "message": "成功",
-  "data": {
-    "commonInfo": {
-      "examId": "460482797140705280",
-      "courseCode": "0400",
-      "courseName": "微观经济学1",
-      "paperNumber": "0400-001"
-    },
-    "courseBasicInfo": {
-      "courseType": null,
-      "credit": "0",
-      "period": "0",
-      "evaluationMode": null,
-      "openTime": "2023第一学期",
-      "teachingObject": "123,20市场营销(专升本)01班,20建筑工程技术(扩)01班",
-      "selectionCount": 0,
-      "participantCount": 0,
-      "courseDegree": null,
-      "teacher": "命题  老师1,命题老师2,教务处老师1",
-      "director": null,
-      "participant": null
-    },
-    "courseEvaluationSpreadInfo": {
-      "questionInfo": [
-        {
-          "mainNumber": 1,
-          "subNumber": 1,
-          "score": 0,
-          "courseTargetName": "测试课程目标1",
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "dimensionList": [
-                {
-                  "dimensionId": "10001",
-                  "dimensionCode": "A1",
-                  "dimensionName": "第一节 映射与函数"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 40
-            }
-          ]
-        },
-        {
-          "mainNumber": 1,
-          "subNumber": 2,
-          "score": 3,
-          "courseTargetName": "测试课程目标1",
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "dimensionList": [
-                {
-                  "dimensionId": "10002",
-                  "dimensionCode": "A2",
-                  "dimensionName": "第二节 数列的极限"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 40
-            }
-          ]
-        },
-        {
-          "mainNumber": 1,
-          "subNumber": 3,
-          "score": 3,
-          "courseTargetName": "测试课程目标2",
-          "targetList": [
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "dimensionList": [
-                {
-                  "dimensionId": "20002",
-                  "dimensionCode": "B2",
-                  "dimensionName": "第二节 代数与方程式"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 29
-            }
-          ]
-        },
-        {
-          "mainNumber": 1,
-          "subNumber": 4,
-          "score": 3,
-          "courseTargetName": "测试课程目标2",
-          "targetList": [
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "dimensionList": [
-                {
-                  "dimensionId": "20001",
-                  "dimensionCode": "B1",
-                  "dimensionName": "第二节 函数的排列"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 29
-            }
-          ]
-        },
-        {
-          "mainNumber": 1,
-          "subNumber": 5,
-          "score": 3,
-          "courseTargetName": "测试课程目标1",
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "dimensionList": [
-                {
-                  "dimensionId": "10003",
-                  "dimensionCode": "A3",
-                  "dimensionName": "第三节 函数的极限"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 40
-            }
-          ]
-        },
-        {
-          "mainNumber": 1,
-          "subNumber": 6,
-          "score": 3,
-          "courseTargetName": "测试课程目标1",
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "dimensionList": [
-                {
-                  "dimensionId": "10004",
-                  "dimensionCode": "A4",
-                  "dimensionName": "测试A4"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 40
-            }
-          ]
-        },
-        {
-          "mainNumber": 1,
-          "subNumber": 7,
-          "score": 3,
-          "courseTargetName": "测试课程目标2",
-          "targetList": [
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "dimensionList": [
-                {
-                  "dimensionId": "20001",
-                  "dimensionCode": "B1",
-                  "dimensionName": "第二节 函数的排列"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 29
-            }
-          ]
-        },
-        {
-          "mainNumber": 1,
-          "subNumber": 8,
-          "score": 3,
-          "courseTargetName": "测试课程目标2",
-          "targetList": [
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "dimensionList": [
-                {
-                  "dimensionId": "20003",
-                  "dimensionCode": "B3",
-                  "dimensionName": "测试B3"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 29
-            }
-          ]
-        },
-        {
-          "mainNumber": 1,
-          "subNumber": 9,
-          "score": 3,
-          "courseTargetName": "测试课程目标2",
-          "targetList": [
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "dimensionList": [
-                {
-                  "dimensionId": "20004",
-                  "dimensionCode": "B4",
-                  "dimensionName": "测试B4"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 29
-            }
-          ]
-        },
-        {
-          "mainNumber": 1,
-          "subNumber": 10,
-          "score": 3,
-          "courseTargetName": "测试课程目标1",
-          "targetList": [
-            {
-              "targetId": "3",
-              "targetName": "测试课程目标3",
-              "graduationRequirement": "测试毕业要求3",
-              "dimensionList": [
-                {
-                  "dimensionId": "30001",
-                  "dimensionCode": "C1",
-                  "dimensionName": "测试C1"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 40
-            }
-          ]
-        },
-        {
-          "mainNumber": 2,
-          "subNumber": 1,
-          "score": 3,
-          "courseTargetName": "测试课程目标1",
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "dimensionList": [
-                {
-                  "dimensionId": "10001",
-                  "dimensionCode": "A1",
-                  "dimensionName": "第一节 映射与函数"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 40
-            }
-          ]
-        },
-        {
-          "mainNumber": 2,
-          "subNumber": 2,
-          "score": 3,
-          "courseTargetName": "测试课程目标2",
-          "targetList": [
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "dimensionList": [
-                {
-                  "dimensionId": "20001",
-                  "dimensionCode": "B1",
-                  "dimensionName": "第二节 函数的排列"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 29
-            }
-          ]
-        },
-        {
-          "mainNumber": 2,
-          "subNumber": 3,
-          "score": 3,
-          "courseTargetName": "测试课程目标3",
-          "targetList": [
-            {
-              "targetId": "3",
-              "targetName": "测试课程目标3",
-              "graduationRequirement": "测试毕业要求3",
-              "dimensionList": [
-                {
-                  "dimensionId": "30001",
-                  "dimensionCode": "C1",
-                  "dimensionName": "测试C1"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 0
-            }
-          ]
-        },
-        {
-          "mainNumber": 2,
-          "subNumber": 4,
-          "score": 3,
-          "courseTargetName": "测试课程目标3",
-          "targetList": [
-            {
-              "targetId": "3",
-              "targetName": "测试课程目标3",
-              "graduationRequirement": "测试毕业要求3",
-              "dimensionList": [
-                {
-                  "dimensionId": "30002",
-                  "dimensionCode": "C2",
-                  "dimensionName": "测试C2"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 0
-            }
-          ]
-        },
-        {
-          "mainNumber": 2,
-          "subNumber": 5,
-          "score": 3,
-          "courseTargetName": "测试课程目标3",
-          "targetList": [
-            {
-              "targetId": "3",
-              "targetName": "测试课程目标3",
-              "graduationRequirement": "测试毕业要求3",
-              "dimensionList": [
-                {
-                  "dimensionId": "30003",
-                  "dimensionCode": "C3",
-                  "dimensionName": "测试C3"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 0
-            }
-          ]
-        },
-        {
-          "mainNumber": 2,
-          "subNumber": 6,
-          "score": 3,
-          "courseTargetName": "测试课程目标3",
-          "targetList": [
-            {
-              "targetId": "3",
-              "targetName": "测试课程目标3",
-              "graduationRequirement": "测试毕业要求3",
-              "dimensionList": [
-                {
-                  "dimensionId": "30004",
-                  "dimensionCode": "C4",
-                  "dimensionName": "测试C4"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 0
-            }
-          ]
-        },
-        {
-          "mainNumber": 2,
-          "subNumber": 7,
-          "score": 3,
-          "courseTargetName": "测试课程目标1",
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "dimensionList": [
-                {
-                  "dimensionId": "10004",
-                  "dimensionCode": "A4",
-                  "dimensionName": "测试A4"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 40
-            }
-          ]
-        },
-        {
-          "mainNumber": 2,
-          "subNumber": 8,
-          "score": 3,
-          "courseTargetName": "测试课程目标1",
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "dimensionList": [
-                {
-                  "dimensionId": "10004",
-                  "dimensionCode": "A4",
-                  "dimensionName": "测试A4"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 40
-            }
-          ]
-        },
-        {
-          "mainNumber": 2,
-          "subNumber": 9,
-          "score": 3,
-          "courseTargetName": "测试课程目标1",
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "dimensionList": [
-                {
-                  "dimensionId": "10005",
-                  "dimensionCode": "A5",
-                  "dimensionName": "测试A5"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 40
-            }
-          ]
-        },
-        {
-          "mainNumber": 2,
-          "subNumber": 10,
-          "score": 3,
-          "courseTargetName": "测试课程目标2",
-          "targetList": [
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "dimensionList": [
-                {
-                  "dimensionId": "20004",
-                  "dimensionCode": "B4",
-                  "dimensionName": "测试A4"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 29
-            }
-          ]
-        },
-        {
-          "mainNumber": 3,
-          "subNumber": 1,
-          "score": 4,
-          "courseTargetName": "测试课程目标3",
-          "targetList": [
-            {
-              "targetId": "3",
-              "targetName": "测试课程目标3",
-              "graduationRequirement": "测试毕业要求3",
-              "dimensionList": [
-                {
-                  "dimensionId": "30005",
-                  "dimensionCode": "C5",
-                  "dimensionName": "测试C5"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 0
-            }
-          ]
-        },
-        {
-          "mainNumber": 3,
-          "subNumber": 2,
-          "score": 4,
-          "courseTargetName": "测试课程目标3",
-          "targetList": [
-            {
-              "targetId": "3",
-              "targetName": "测试课程目标3",
-              "graduationRequirement": "测试毕业要求3",
-              "dimensionList": [
-                {
-                  "dimensionId": "30006",
-                  "dimensionCode": "C6",
-                  "dimensionName": "测试C6"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 0
-            }
-          ]
-        },
-        {
-          "mainNumber": 3,
-          "subNumber": 3,
-          "score": 4,
-          "courseTargetName": "测试课程目标1",
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "dimensionList": [
-                {
-                  "dimensionId": "10006",
-                  "dimensionCode": "A6",
-                  "dimensionName": "测试A6"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 40
-            }
-          ]
-        },
-        {
-          "mainNumber": 3,
-          "subNumber": 4,
-          "score": 4,
-          "courseTargetName": "测试课程目标2",
-          "targetList": [
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "dimensionList": [
-                {
-                  "dimensionId": "20005",
-                  "dimensionCode": "B5",
-                  "dimensionName": "测试B5"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 29
-            }
-          ]
-        },
-        {
-          "mainNumber": 3,
-          "subNumber": 5,
-          "score": 4,
-          "courseTargetName": "测试课程目标2",
-          "targetList": [
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "dimensionList": [
-                {
-                  "dimensionId": "20006",
-                  "dimensionCode": "B6",
-                  "dimensionName": "测试B6"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 29
-            }
-          ]
-        },
-        {
-          "mainNumber": 4,
-          "subNumber": 1,
-          "score": 4,
-          "courseTargetName": "测试课程目标3",
-          "targetList": [
-            {
-              "targetId": "3",
-              "targetName": "测试课程目标3",
-              "graduationRequirement": "测试毕业要求3",
-              "dimensionList": [
-                {
-                  "dimensionId": "30006",
-                  "dimensionCode": "C6",
-                  "dimensionName": "测试C6"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 0
-            }
-          ]
-        },
-        {
-          "mainNumber": 4,
-          "subNumber": 2,
-          "score": 4,
-          "courseTargetName": "测试课程目标3",
-          "targetList": [
-            {
-              "targetId": "3",
-              "targetName": "测试课程目标3",
-              "graduationRequirement": "测试毕业要求3",
-              "dimensionList": [
-                {
-                  "dimensionId": "30007",
-                  "dimensionCode": "C7",
-                  "dimensionName": "测试C7"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 0
-            }
-          ]
-        },
-        {
-          "mainNumber": 4,
-          "subNumber": 3,
-          "score": 4,
-          "courseTargetName": "测试课程目标1",
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "dimensionList": [
-                {
-                  "dimensionId": "10007",
-                  "dimensionCode": "A7",
-                  "dimensionName": "测试A7"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 40
-            }
-          ]
-        },
-        {
-          "mainNumber": 4,
-          "subNumber": 4,
-          "score": 4,
-          "courseTargetName": "测试课程目标1",
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "dimensionList": [
-                {
-                  "dimensionId": "10008",
-                  "dimensionCode": "A8",
-                  "dimensionName": "测试A8"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 40
-            }
-          ]
-        },
-        {
-          "mainNumber": 4,
-          "subNumber": 5,
-          "score": 4,
-          "courseTargetName": "测试课程目标1",
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "dimensionList": [
-                {
-                  "dimensionId": "10008",
-                  "dimensionCode": "A8",
-                  "dimensionName": "测试A8"
-                },
-                {
-                  "dimensionId": "10002",
-                  "dimensionCode": "A2",
-                  "dimensionName": "第二节 数列的极限"
-                }
-              ],
-              "dimensionScoreSum": 0,
-              "finalScoreQuestionScoreSum": 40
-            }
-          ]
-        }
-      ],
-      "scoreList": {
-        "failCount": 4,
-        "failRate": 44,
-        "scoreRange": [
-          {
-            "studentCount": 5,
-            "minScore": 60,
-            "maxScore": 69.5,
-            "rate": 55
-          },
-          {
-            "studentCount": 2,
-            "minScore": 70,
-            "maxScore": 79.5,
-            "rate": 22
-          },
-          {
-            "studentCount": 0,
-            "minScore": 80,
-            "maxScore": 89.5,
-            "rate": 0
-          },
-          {
-            "studentCount": 0,
-            "minScore": 90,
-            "maxScore": 99.5,
-            "rate": 0
-          },
-          {
-            "studentCount": 0,
-            "minScore": 100,
-            "maxScore": 109.5,
-            "rate": 0
-          },
-          {
-            "studentCount": 0,
-            "minScore": 110,
-            "maxScore": 120,
-            "rate": 0
-          }
-        ]
-      }
-    },
-    "courseEvaluationResultInfo": {
-      "weightSettingSign": "501094268694167552",
-      "targetEvaluationSumValue": 0.54,
-      "targetList": [
-        {
-          "targetId": "500310435677863936",
-          "targetName": "测试课程目标1",
-          "graduationRequirement": "测试毕业要求1",
-          "graduationRequirementPoint": "向量及其线性运算(A1),点的坐标与向量坐标(A2),向量的乘法运算(A3),平面(A4),不定积分的概念(B1),换元积分法(B2),重积分的概念与性质(C1),直角坐标系下二重积分的计算(C2)",
-          "targetSumWeight": 40,
-          "targetSumScore": 40,
-          "evaluationValue": 0.58,
-          "evaluationList": [
-            {
-              "targetId": "500310435677863936",
-              "evaluationId": "500310618323025920",
-              "evaluation": "作业1-1",
-              "evaluationDesc": "测试平时作业1-1",
-              "targetWeight": 7.5,
-              "targetScore": 3,
-              "targetAvgScore": 2.08,
-              "score": 0,
-              "originalTargetScore": 10,
-              "originalTargetWeight": 25
-            },
-            {
-              "targetId": "500310435677863936",
-              "evaluationId": "500310689512947712",
-              "evaluation": "作业1-2",
-              "evaluationDesc": "测试平时作业1-2",
-              "targetWeight": 7.5,
-              "targetScore": 3,
-              "targetAvgScore": 2.2,
-              "score": 0,
-              "originalTargetScore": 10,
-              "originalTargetWeight": 25
-            },
-            {
-              "targetId": "500310435677863936",
-              "evaluationId": "500310737437065216",
-              "evaluation": "作业1-3",
-              "evaluationDesc": "测试平时作业1-3",
-              "targetWeight": 7.5,
-              "targetScore": 3,
-              "targetAvgScore": 2.65,
-              "score": 0,
-              "originalTargetScore": 10,
-              "originalTargetWeight": 25
-            },
-            {
-              "targetId": "500310435677863936",
-              "evaluationId": "500310821620940800",
-              "evaluation": "作业1-4",
-              "evaluationDesc": "测试平时作业1-4",
-              "targetWeight": 7.5,
-              "targetScore": 3,
-              "targetAvgScore": 2.35,
-              "score": 0,
-              "originalTargetScore": 10,
-              "originalTargetWeight": 25
-            },
-            {
-              "targetId": "500310435677863936",
-              "evaluationId": "500274127358132224",
-              "evaluation": "期末考试",
-              "evaluationDesc": "按阅卷功能模块里的卷面成绩计算",
-              "targetWeight": 70,
-              "targetScore": 28,
-              "targetAvgScore": 13.87,
-              "score": 0,
-              "originalTargetScore": 40,
-              "originalTargetWeight": 100
-            }
-          ],
-          "dimensionScoreSum": 41,
-          "dimensionPoint": "第一节 映射与函数,第二节 数列的极限,第三节 函数的极限,测试A4,测试A5,测试A6,测试A7,测试A8",
-          "finalScoreQuestionScoreSum": 0
-        },
-        {
-          "targetId": "500311416511660032",
-          "targetName": "测试课程目标2",
-          "graduationRequirement": "测试毕业要求2",
-          "graduationRequirementPoint": "对弧长的曲线积分(D1),对坐标的曲线积分(D2),任意项级数(E3),函数项级数(E4),多元函数的高阶偏导数(F5),隐函数的求导法则(F6)",
-          "targetSumWeight": 60,
-          "targetSumScore": 60,
-          "evaluationValue": 0.54,
-          "evaluationList": [
-            {
-              "targetId": "500311416511660032",
-              "evaluationId": "500310891598708736",
-              "evaluation": "作业2-1",
-              "evaluationDesc": "测试平时作业2-1",
-              "targetWeight": 6,
-              "targetScore": 3.6,
-              "targetAvgScore": 3.17,
-              "score": 0,
-              "originalTargetScore": 12,
-              "originalTargetWeight": 20
-            },
-            {
-              "targetId": "500311416511660032",
-              "evaluationId": "500310950931333120",
-              "evaluation": "作业2-2",
-              "evaluationDesc": "测试平时作业2-2",
-              "targetWeight": 6,
-              "targetScore": 3.6,
-              "targetAvgScore": 3.31,
-              "score": 0,
-              "originalTargetScore": 12,
-              "originalTargetWeight": 20
-            },
-            {
-              "targetId": "500311416511660032",
-              "evaluationId": "500310988852035584",
-              "evaluation": "作业2-3",
-              "evaluationDesc": "测试平时作业2-3",
-              "targetWeight": 6,
-              "targetScore": 3.6,
-              "targetAvgScore": 3.07,
-              "score": 0,
-              "originalTargetScore": 12,
-              "originalTargetWeight": 20
-            },
-            {
-              "targetId": "500311416511660032",
-              "evaluationId": "500311017624961024",
-              "evaluation": "作业2-4",
-              "evaluationDesc": "测试平时作业2-4",
-              "targetWeight": 6,
-              "targetScore": 3.6,
-              "targetAvgScore": 3.09,
-              "score": 0,
-              "originalTargetScore": 12,
-              "originalTargetWeight": 20
-            },
-            {
-              "targetId": "500311416511660032",
-              "evaluationId": "500311052316049408",
-              "evaluation": "作业2-5",
-              "evaluationDesc": "测试平时作业2-5",
-              "targetWeight": 3,
-              "targetScore": 1.8,
-              "targetAvgScore": 1.42,
-              "score": 0,
-              "originalTargetScore": 6,
-              "originalTargetWeight": 10
-            },
-            {
-              "targetId": "500311416511660032",
-              "evaluationId": "500311081336438784",
-              "evaluation": "作业2-6",
-              "evaluationDesc": "测试平时作业2-6",
-              "targetWeight": 3,
-              "targetScore": 1.8,
-              "targetAvgScore": 1.48,
-              "score": 0,
-              "originalTargetScore": 6,
-              "originalTargetWeight": 10
-            },
-            {
-              "targetId": "500311416511660032",
-              "evaluationId": "500274127358132224",
-              "evaluation": "期末考试",
-              "evaluationDesc": "按阅卷功能模块里的卷面成绩计算",
-              "targetWeight": 70,
-              "targetScore": 42,
-              "targetAvgScore": 16.96,
-              "score": 0,
-              "originalTargetScore": 60,
-              "originalTargetWeight": 100
-            }
-          ],
-          "dimensionScoreSum": 29,
-          "dimensionPoint": "第二节 函数的排列,第二节 代数与方程式,测试B3,测试A4,测试B5,测试B6",
-          "finalScoreQuestionScoreSum": 0
-        }
-      ]
-    },
-    "courseEvaluationResultDetailInfo": {
-      "examStudentList": [
-        {
-          "name": "测试考生1",
-          "studentCode": "20240001",
-          "administrativeClass": "123",
-          "score": 52,
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "targetSumWeight": 40,
-              "targetSumScore": 40,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 28,
-                "targetScoreSum": 19.5,
-                "targetMatrixSumScore": 13.65
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310618323025920",
-                    "evaluation": "作业1-1",
-                    "evaluationDesc": "测试平时作业1-1",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 25,
-                    "matrixScore": 0.75
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310689512947712",
-                    "evaluation": "作业1-2",
-                    "evaluationDesc": "测试平时作业1-2",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 30,
-                    "matrixScore": 0.9
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310737437065216",
-                    "evaluation": "作业1-3",
-                    "evaluationDesc": "测试平时作业1-3",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 100,
-                    "matrixScore": 3
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310821620940800",
-                    "evaluation": "作业1-4",
-                    "evaluationDesc": "测试平时作业1-4",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 65,
-                    "matrixScore": 1.95
-                  }
-                ]
-              }
-            },
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "targetSumWeight": 60,
-              "targetSumScore": 60,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 42,
-                "targetScoreSum": 23,
-                "targetMatrixSumScore": 16.1
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310891598708736",
-                    "evaluation": "作业2-1",
-                    "evaluationDesc": "测试平时作业2-1",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 90,
-                    "matrixScore": 3.24
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310950931333120",
-                    "evaluation": "作业2-2",
-                    "evaluationDesc": "测试平时作业2-2",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 3.6
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310988852035584",
-                    "evaluation": "作业2-3",
-                    "evaluationDesc": "测试平时作业2-3",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 3.6
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311017624961024",
-                    "evaluation": "作业2-4",
-                    "evaluationDesc": "测试平时作业2-4",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 70,
-                    "matrixScore": 2.52
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311052316049408",
-                    "evaluation": "作业2-5",
-                    "evaluationDesc": "测试平时作业2-5",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 85,
-                    "matrixScore": 1.53
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311081336438784",
-                    "evaluation": "作业2-6",
-                    "evaluationDesc": "测试平时作业2-6",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 85,
-                    "matrixScore": 1.53
-                  }
-                ]
-              }
-            }
-          ]
-        },
-        {
-          "name": "测试考生2",
-          "studentCode": "20240002",
-          "administrativeClass": "123",
-          "score": 53,
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "targetSumWeight": 40,
-              "targetSumScore": 40,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 28,
-                "targetScoreSum": 19.5,
-                "targetMatrixSumScore": 13.65
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310618323025920",
-                    "evaluation": "作业1-1",
-                    "evaluationDesc": "测试平时作业1-1",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 30,
-                    "matrixScore": 0.9
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310689512947712",
-                    "evaluation": "作业1-2",
-                    "evaluationDesc": "测试平时作业1-2",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 82,
-                    "matrixScore": 2.46
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310737437065216",
-                    "evaluation": "作业1-3",
-                    "evaluationDesc": "测试平时作业1-3",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 99,
-                    "matrixScore": 2.97
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310821620940800",
-                    "evaluation": "作业1-4",
-                    "evaluationDesc": "测试平时作业1-4",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 85,
-                    "matrixScore": 2.55
-                  }
-                ]
-              }
-            },
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "targetSumWeight": 60,
-              "targetSumScore": 60,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 42,
-                "targetScoreSum": 23,
-                "targetMatrixSumScore": 16.1
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310891598708736",
-                    "evaluation": "作业2-1",
-                    "evaluationDesc": "测试平时作业2-1",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 92,
-                    "matrixScore": 3.31
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310950931333120",
-                    "evaluation": "作业2-2",
-                    "evaluationDesc": "测试平时作业2-2",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 72,
-                    "matrixScore": 2.59
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310988852035584",
-                    "evaluation": "作业2-3",
-                    "evaluationDesc": "测试平时作业2-3",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 67,
-                    "matrixScore": 2.41
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311017624961024",
-                    "evaluation": "作业2-4",
-                    "evaluationDesc": "测试平时作业2-4",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 85,
-                    "matrixScore": 3.06
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311052316049408",
-                    "evaluation": "作业2-5",
-                    "evaluationDesc": "测试平时作业2-5",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 85,
-                    "matrixScore": 1.53
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311081336438784",
-                    "evaluation": "作业2-6",
-                    "evaluationDesc": "测试平时作业2-6",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 85,
-                    "matrixScore": 1.53
-                  }
-                ]
-              }
-            }
-          ]
-        },
-        {
-          "name": "测试考生3",
-          "studentCode": "20240003",
-          "administrativeClass": "123",
-          "score": 53,
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "targetSumWeight": 40,
-              "targetSumScore": 40,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 28,
-                "targetScoreSum": 21,
-                "targetMatrixSumScore": 14.7
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310618323025920",
-                    "evaluation": "作业1-1",
-                    "evaluationDesc": "测试平时作业1-1",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 40,
-                    "matrixScore": 1.2
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310689512947712",
-                    "evaluation": "作业1-2",
-                    "evaluationDesc": "测试平时作业1-2",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 64,
-                    "matrixScore": 1.92
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310737437065216",
-                    "evaluation": "作业1-3",
-                    "evaluationDesc": "测试平时作业1-3",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 100,
-                    "matrixScore": 3
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310821620940800",
-                    "evaluation": "作业1-4",
-                    "evaluationDesc": "测试平时作业1-4",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 37,
-                    "matrixScore": 1.11
-                  }
-                ]
-              }
-            },
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "targetSumWeight": 60,
-              "targetSumScore": 60,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 42,
-                "targetScoreSum": 23,
-                "targetMatrixSumScore": 16.1
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310891598708736",
-                    "evaluation": "作业2-1",
-                    "evaluationDesc": "测试平时作业2-1",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 90,
-                    "matrixScore": 3.24
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310950931333120",
-                    "evaluation": "作业2-2",
-                    "evaluationDesc": "测试平时作业2-2",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 95,
-                    "matrixScore": 3.42
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310988852035584",
-                    "evaluation": "作业2-3",
-                    "evaluationDesc": "测试平时作业2-3",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 97,
-                    "matrixScore": 3.49
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311017624961024",
-                    "evaluation": "作业2-4",
-                    "evaluationDesc": "测试平时作业2-4",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 78,
-                    "matrixScore": 2.81
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311052316049408",
-                    "evaluation": "作业2-5",
-                    "evaluationDesc": "测试平时作业2-5",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 62,
-                    "matrixScore": 1.12
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311081336438784",
-                    "evaluation": "作业2-6",
-                    "evaluationDesc": "测试平时作业2-6",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 92,
-                    "matrixScore": 1.66
-                  }
-                ]
-              }
-            }
-          ]
-        },
-        {
-          "name": "测试考生4",
-          "studentCode": "20240004",
-          "administrativeClass": "123",
-          "score": 55,
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "targetSumWeight": 40,
-              "targetSumScore": 40,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 28,
-                "targetScoreSum": 21,
-                "targetMatrixSumScore": 14.7
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310618323025920",
-                    "evaluation": "作业1-1",
-                    "evaluationDesc": "测试平时作业1-1",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 50,
-                    "matrixScore": 1.5
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310689512947712",
-                    "evaluation": "作业1-2",
-                    "evaluationDesc": "测试平时作业1-2",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 89,
-                    "matrixScore": 2.67
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310737437065216",
-                    "evaluation": "作业1-3",
-                    "evaluationDesc": "测试平时作业1-3",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 74,
-                    "matrixScore": 2.22
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310821620940800",
-                    "evaluation": "作业1-4",
-                    "evaluationDesc": "测试平时作业1-4",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 54,
-                    "matrixScore": 1.62
-                  }
-                ]
-              }
-            },
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "targetSumWeight": 60,
-              "targetSumScore": 60,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 42,
-                "targetScoreSum": 26,
-                "targetMatrixSumScore": 18.2
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310891598708736",
-                    "evaluation": "作业2-1",
-                    "evaluationDesc": "测试平时作业2-1",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 78,
-                    "matrixScore": 2.81
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310950931333120",
-                    "evaluation": "作业2-2",
-                    "evaluationDesc": "测试平时作业2-2",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 95,
-                    "matrixScore": 3.42
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310988852035584",
-                    "evaluation": "作业2-3",
-                    "evaluationDesc": "测试平时作业2-3",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 55,
-                    "matrixScore": 1.98
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311017624961024",
-                    "evaluation": "作业2-4",
-                    "evaluationDesc": "测试平时作业2-4",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 85,
-                    "matrixScore": 3.06
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311052316049408",
-                    "evaluation": "作业2-5",
-                    "evaluationDesc": "测试平时作业2-5",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 98,
-                    "matrixScore": 1.76
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311081336438784",
-                    "evaluation": "作业2-6",
-                    "evaluationDesc": "测试平时作业2-6",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 78,
-                    "matrixScore": 1.4
-                  }
-                ]
-              }
-            }
-          ]
-        },
-        {
-          "name": "测试考生5",
-          "studentCode": "20240005",
-          "administrativeClass": "123",
-          "score": 58,
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "targetSumWeight": 40,
-              "targetSumScore": 40,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 28,
-                "targetScoreSum": 21,
-                "targetMatrixSumScore": 14.7
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310618323025920",
-                    "evaluation": "作业1-1",
-                    "evaluationDesc": "测试平时作业1-1",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 60,
-                    "matrixScore": 1.8
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310689512947712",
-                    "evaluation": "作业1-2",
-                    "evaluationDesc": "测试平时作业1-2",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 80,
-                    "matrixScore": 2.4
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310737437065216",
-                    "evaluation": "作业1-3",
-                    "evaluationDesc": "测试平时作业1-3",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 87,
-                    "matrixScore": 2.61
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310821620940800",
-                    "evaluation": "作业1-4",
-                    "evaluationDesc": "测试平时作业1-4",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 82,
-                    "matrixScore": 2.46
-                  }
-                ]
-              }
-            },
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "targetSumWeight": 60,
-              "targetSumScore": 60,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 42,
-                "targetScoreSum": 27.5,
-                "targetMatrixSumScore": 19.25
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310891598708736",
-                    "evaluation": "作业2-1",
-                    "evaluationDesc": "测试平时作业2-1",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 90,
-                    "matrixScore": 3.24
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310950931333120",
-                    "evaluation": "作业2-2",
-                    "evaluationDesc": "测试平时作业2-2",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 78,
-                    "matrixScore": 2.81
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310988852035584",
-                    "evaluation": "作业2-3",
-                    "evaluationDesc": "测试平时作业2-3",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 99,
-                    "matrixScore": 3.56
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311017624961024",
-                    "evaluation": "作业2-4",
-                    "evaluationDesc": "测试平时作业2-4",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 58,
-                    "matrixScore": 2.09
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311052316049408",
-                    "evaluation": "作业2-5",
-                    "evaluationDesc": "测试平时作业2-5",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 85,
-                    "matrixScore": 1.53
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311081336438784",
-                    "evaluation": "作业2-6",
-                    "evaluationDesc": "测试平时作业2-6",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 91,
-                    "matrixScore": 1.64
-                  }
-                ]
-              }
-            }
-          ]
-        },
-        {
-          "name": "测试考生6",
-          "studentCode": "20240006",
-          "administrativeClass": "123",
-          "score": 59,
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "targetSumWeight": 40,
-              "targetSumScore": 40,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 28,
-                "targetScoreSum": 21,
-                "targetMatrixSumScore": 14.7
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310618323025920",
-                    "evaluation": "作业1-1",
-                    "evaluationDesc": "测试平时作业1-1",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 70,
-                    "matrixScore": 2.1
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310689512947712",
-                    "evaluation": "作业1-2",
-                    "evaluationDesc": "测试平时作业1-2",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 71,
-                    "matrixScore": 2.13
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310737437065216",
-                    "evaluation": "作业1-3",
-                    "evaluationDesc": "测试平时作业1-3",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 93,
-                    "matrixScore": 2.79
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310821620940800",
-                    "evaluation": "作业1-4",
-                    "evaluationDesc": "测试平时作业1-4",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 85,
-                    "matrixScore": 2.55
-                  }
-                ]
-              }
-            },
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "targetSumWeight": 60,
-              "targetSumScore": 60,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 42,
-                "targetScoreSum": 29,
-                "targetMatrixSumScore": 20.3
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310891598708736",
-                    "evaluation": "作业2-1",
-                    "evaluationDesc": "测试平时作业2-1",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 58,
-                    "matrixScore": 2.09
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310950931333120",
-                    "evaluation": "作业2-2",
-                    "evaluationDesc": "测试平时作业2-2",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 82,
-                    "matrixScore": 2.95
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310988852035584",
-                    "evaluation": "作业2-3",
-                    "evaluationDesc": "测试平时作业2-3",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 3.6
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311017624961024",
-                    "evaluation": "作业2-4",
-                    "evaluationDesc": "测试平时作业2-4",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 85,
-                    "matrixScore": 3.06
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311052316049408",
-                    "evaluation": "作业2-5",
-                    "evaluationDesc": "测试平时作业2-5",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 79,
-                    "matrixScore": 1.42
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311081336438784",
-                    "evaluation": "作业2-6",
-                    "evaluationDesc": "测试平时作业2-6",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 85,
-                    "matrixScore": 1.53
-                  }
-                ]
-              }
-            }
-          ]
-        },
-        {
-          "name": "刘雨杭",
-          "studentCode": "K20208042",
-          "administrativeClass": "20建筑工程技术(扩)01班",
-          "score": 52,
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "targetSumWeight": 40,
-              "targetSumScore": 40,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 28,
-                "targetScoreSum": 12,
-                "targetMatrixSumScore": 8.4
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310618323025920",
-                    "evaluation": "作业1-1",
-                    "evaluationDesc": "测试平时作业1-1",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 100,
-                    "matrixScore": 3
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310689512947712",
-                    "evaluation": "作业1-2",
-                    "evaluationDesc": "测试平时作业1-2",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 80,
-                    "matrixScore": 2.4
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310737437065216",
-                    "evaluation": "作业1-3",
-                    "evaluationDesc": "测试平时作业1-3",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 100,
-                    "matrixScore": 3
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310821620940800",
-                    "evaluation": "作业1-4",
-                    "evaluationDesc": "测试平时作业1-4",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 100,
-                    "matrixScore": 3
-                  }
-                ]
-              }
-            },
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "targetSumWeight": 60,
-              "targetSumScore": 60,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 42,
-                "targetScoreSum": 23,
-                "targetMatrixSumScore": 16.1
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310891598708736",
-                    "evaluation": "作业2-1",
-                    "evaluationDesc": "测试平时作业2-1",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 3.6
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310950931333120",
-                    "evaluation": "作业2-2",
-                    "evaluationDesc": "测试平时作业2-2",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 3.6
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310988852035584",
-                    "evaluation": "作业2-3",
-                    "evaluationDesc": "测试平时作业2-3",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 3.6
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311017624961024",
-                    "evaluation": "作业2-4",
-                    "evaluationDesc": "测试平时作业2-4",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 3.6
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311052316049408",
-                    "evaluation": "作业2-5",
-                    "evaluationDesc": "测试平时作业2-5",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 60,
-                    "matrixScore": 1.08
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311081336438784",
-                    "evaluation": "作业2-6",
-                    "evaluationDesc": "测试平时作业2-6",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 53,
-                    "matrixScore": 0.95
-                  }
-                ]
-              }
-            }
-          ]
-        },
-        {
-          "name": "王義阳",
-          "studentCode": "K20208080",
-          "administrativeClass": "20建筑工程技术(扩)01班",
-          "score": 51,
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "targetSumWeight": 40,
-              "targetSumScore": 40,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 28,
-                "targetScoreSum": 15,
-                "targetMatrixSumScore": 10.5
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310618323025920",
-                    "evaluation": "作业1-1",
-                    "evaluationDesc": "测试平时作业1-1",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 100,
-                    "matrixScore": 3
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310689512947712",
-                    "evaluation": "作业1-2",
-                    "evaluationDesc": "测试平时作业1-2",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 70,
-                    "matrixScore": 2.1
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310737437065216",
-                    "evaluation": "作业1-3",
-                    "evaluationDesc": "测试平时作业1-3",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 60,
-                    "matrixScore": 1.8
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310821620940800",
-                    "evaluation": "作业1-4",
-                    "evaluationDesc": "测试平时作业1-4",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 100,
-                    "matrixScore": 3
-                  }
-                ]
-              }
-            },
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "targetSumWeight": 60,
-              "targetSumScore": 60,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 42,
-                "targetScoreSum": 23,
-                "targetMatrixSumScore": 16.1
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310891598708736",
-                    "evaluation": "作业2-1",
-                    "evaluationDesc": "测试平时作业2-1",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 90,
-                    "matrixScore": 3.24
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310950931333120",
-                    "evaluation": "作业2-2",
-                    "evaluationDesc": "测试平时作业2-2",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 3.6
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310988852035584",
-                    "evaluation": "作业2-3",
-                    "evaluationDesc": "测试平时作业2-3",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 60,
-                    "matrixScore": 2.16
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311017624961024",
-                    "evaluation": "作业2-4",
-                    "evaluationDesc": "测试平时作业2-4",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 3.6
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311052316049408",
-                    "evaluation": "作业2-5",
-                    "evaluationDesc": "测试平时作业2-5",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 60,
-                    "matrixScore": 1.08
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311081336438784",
-                    "evaluation": "作业2-6",
-                    "evaluationDesc": "测试平时作业2-6",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 75,
-                    "matrixScore": 1.35
-                  }
-                ]
-              }
-            }
-          ]
-        },
-        {
-          "name": "刘雪蕾",
-          "studentCode": "Z20310143",
-          "administrativeClass": "20市场营销(专升本)01班",
-          "score": 64,
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "targetSumWeight": 40,
-              "targetSumScore": 40,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 28,
-                "targetScoreSum": 30.5,
-                "targetMatrixSumScore": 21.35
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310618323025920",
-                    "evaluation": "作业1-1",
-                    "evaluationDesc": "测试平时作业1-1",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 95,
-                    "matrixScore": 2.85
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310689512947712",
-                    "evaluation": "作业1-2",
-                    "evaluationDesc": "测试平时作业1-2",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 80,
-                    "matrixScore": 2.4
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310737437065216",
-                    "evaluation": "作业1-3",
-                    "evaluationDesc": "测试平时作业1-3",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 100,
-                    "matrixScore": 3
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310821620940800",
-                    "evaluation": "作业1-4",
-                    "evaluationDesc": "测试平时作业1-4",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 85,
-                    "matrixScore": 2.55
-                  }
-                ]
-              }
-            },
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "targetSumWeight": 60,
-              "targetSumScore": 60,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 42,
-                "targetScoreSum": 23,
-                "targetMatrixSumScore": 16.1
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310891598708736",
-                    "evaluation": "作业2-1",
-                    "evaluationDesc": "测试平时作业2-1",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 90,
-                    "matrixScore": 3.24
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310950931333120",
-                    "evaluation": "作业2-2",
-                    "evaluationDesc": "测试平时作业2-2",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 95,
-                    "matrixScore": 3.42
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310988852035584",
-                    "evaluation": "作业2-3",
-                    "evaluationDesc": "测试平时作业2-3",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 3.6
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311017624961024",
-                    "evaluation": "作业2-4",
-                    "evaluationDesc": "测试平时作业2-4",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 85,
-                    "matrixScore": 3.06
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311052316049408",
-                    "evaluation": "作业2-5",
-                    "evaluationDesc": "测试平时作业2-5",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 85,
-                    "matrixScore": 1.53
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311081336438784",
-                    "evaluation": "作业2-6",
-                    "evaluationDesc": "测试平时作业2-6",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 85,
-                    "matrixScore": 1.53
-                  }
-                ]
-              }
-            }
-          ]
-        },
-        {
-          "name": "金文希",
-          "studentCode": "Z20310230",
-          "administrativeClass": "20市场营销(专升本)01班",
-          "score": 57,
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "targetSumWeight": 40,
-              "targetSumScore": 40,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 28,
-                "targetScoreSum": 19.5,
-                "targetMatrixSumScore": 13.65
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310618323025920",
-                    "evaluation": "作业1-1",
-                    "evaluationDesc": "测试平时作业1-1",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 91,
-                    "matrixScore": 2.73
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310689512947712",
-                    "evaluation": "作业1-2",
-                    "evaluationDesc": "测试平时作业1-2",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 82,
-                    "matrixScore": 2.46
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310737437065216",
-                    "evaluation": "作业1-3",
-                    "evaluationDesc": "测试平时作业1-3",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 99,
-                    "matrixScore": 2.97
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310821620940800",
-                    "evaluation": "作业1-4",
-                    "evaluationDesc": "测试平时作业1-4",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 77,
-                    "matrixScore": 2.31
-                  }
-                ]
-              }
-            },
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "targetSumWeight": 60,
-              "targetSumScore": 60,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 42,
-                "targetScoreSum": 23,
-                "targetMatrixSumScore": 16.1
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310891598708736",
-                    "evaluation": "作业2-1",
-                    "evaluationDesc": "测试平时作业2-1",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 92,
-                    "matrixScore": 3.31
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310950931333120",
-                    "evaluation": "作业2-2",
-                    "evaluationDesc": "测试平时作业2-2",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 95,
-                    "matrixScore": 3.42
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310988852035584",
-                    "evaluation": "作业2-3",
-                    "evaluationDesc": "测试平时作业2-3",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 3.6
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311017624961024",
-                    "evaluation": "作业2-4",
-                    "evaluationDesc": "测试平时作业2-4",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 98,
-                    "matrixScore": 3.53
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311052316049408",
-                    "evaluation": "作业2-5",
-                    "evaluationDesc": "测试平时作业2-5",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 78,
-                    "matrixScore": 1.4
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311081336438784",
-                    "evaluation": "作业2-6",
-                    "evaluationDesc": "测试平时作业2-6",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 99,
-                    "matrixScore": 1.78
-                  }
-                ]
-              }
-            }
-          ]
-        },
-        {
-          "name": "黄春森",
-          "studentCode": "Z20310777",
-          "administrativeClass": "20市场营销(专升本)01班",
-          "score": 54,
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "targetSumWeight": 40,
-              "targetSumScore": 40,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 28,
-                "targetScoreSum": 18,
-                "targetMatrixSumScore": 12.6
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310618323025920",
-                    "evaluation": "作业1-1",
-                    "evaluationDesc": "测试平时作业1-1",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 100,
-                    "matrixScore": 3
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310689512947712",
-                    "evaluation": "作业1-2",
-                    "evaluationDesc": "测试平时作业1-2",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 80,
-                    "matrixScore": 2.4
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310737437065216",
-                    "evaluation": "作业1-3",
-                    "evaluationDesc": "测试平时作业1-3",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 60,
-                    "matrixScore": 1.8
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310821620940800",
-                    "evaluation": "作业1-4",
-                    "evaluationDesc": "测试平时作业1-4",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 90,
-                    "matrixScore": 2.7
-                  }
-                ]
-              }
-            },
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "targetSumWeight": 60,
-              "targetSumScore": 60,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 42,
-                "targetScoreSum": 23,
-                "targetMatrixSumScore": 16.1
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310891598708736",
-                    "evaluation": "作业2-1",
-                    "evaluationDesc": "测试平时作业2-1",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 3.6
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310950931333120",
-                    "evaluation": "作业2-2",
-                    "evaluationDesc": "测试平时作业2-2",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 3.6
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310988852035584",
-                    "evaluation": "作业2-3",
-                    "evaluationDesc": "测试平时作业2-3",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 60,
-                    "matrixScore": 2.16
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311017624961024",
-                    "evaluation": "作业2-4",
-                    "evaluationDesc": "测试平时作业2-4",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 3.6
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311052316049408",
-                    "evaluation": "作业2-5",
-                    "evaluationDesc": "测试平时作业2-5",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 90,
-                    "matrixScore": 1.62
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311081336438784",
-                    "evaluation": "作业2-6",
-                    "evaluationDesc": "测试平时作业2-6",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 75,
-                    "matrixScore": 1.35
-                  }
-                ]
-              }
-            }
-          ]
-        },
-        {
-          "name": "目标分",
-          "studentCode": "目标分",
-          "administrativeClass": null,
-          "score": 100,
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "targetSumWeight": 40,
-              "targetSumScore": 40,
-              "targetMatrixAvgScore": 23.1,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 28,
-                "matrixAvgScore": 13.87,
-                "targetScoreSum": 19.5,
-                "targetMatrixSumScore": 152.6
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310618323025920",
-                    "evaluation": "作业1-1",
-                    "evaluationDesc": "测试平时作业1-1",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 25,
-                    "matrixScore": 22.83,
-                    "matrixAvgScore": 2.08
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310689512947712",
-                    "evaluation": "作业1-2",
-                    "evaluationDesc": "测试平时作业1-2",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 30,
-                    "matrixScore": 24.24,
-                    "matrixAvgScore": 2.2
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310737437065216",
-                    "evaluation": "作业1-3",
-                    "evaluationDesc": "测试平时作业1-3",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 100,
-                    "matrixScore": 29.16,
-                    "matrixAvgScore": 2.65
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310821620940800",
-                    "evaluation": "作业1-4",
-                    "evaluationDesc": "测试平时作业1-4",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 65,
-                    "matrixScore": 25.8,
-                    "matrixAvgScore": 2.35
-                  }
-                ]
-              }
-            },
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "targetSumWeight": 60,
-              "targetSumScore": 60,
-              "targetMatrixAvgScore": 32.5,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 42,
-                "matrixAvgScore": 16.96,
-                "targetScoreSum": 23,
-                "targetMatrixSumScore": 186.55
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310891598708736",
-                    "evaluation": "作业2-1",
-                    "evaluationDesc": "测试平时作业2-1",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 90,
-                    "matrixScore": 34.92,
-                    "matrixAvgScore": 3.17
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310950931333120",
-                    "evaluation": "作业2-2",
-                    "evaluationDesc": "测试平时作业2-2",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 36.43,
-                    "matrixAvgScore": 3.31
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310988852035584",
-                    "evaluation": "作业2-3",
-                    "evaluationDesc": "测试平时作业2-3",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 33.76,
-                    "matrixAvgScore": 3.07
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311017624961024",
-                    "evaluation": "作业2-4",
-                    "evaluationDesc": "测试平时作业2-4",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 70,
-                    "matrixScore": 33.99,
-                    "matrixAvgScore": 3.09
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311052316049408",
-                    "evaluation": "作业2-5",
-                    "evaluationDesc": "测试平时作业2-5",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 85,
-                    "matrixScore": 15.6,
-                    "matrixAvgScore": 1.42
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311081336438784",
-                    "evaluation": "作业2-6",
-                    "evaluationDesc": "测试平时作业2-6",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 85,
-                    "matrixScore": 16.25,
-                    "matrixAvgScore": 1.48
-                  }
-                ]
-              }
-            }
-          ]
-        },
-        {
-          "name": "平均分",
-          "studentCode": "平均分",
-          "administrativeClass": null,
-          "score": 55.6,
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "targetSumWeight": 40,
-              "targetSumScore": 40,
-              "targetMatrixAvgScore": 23.1,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 28,
-                "matrixAvgScore": 13.87,
-                "targetScoreSum": 19.5,
-                "targetMatrixSumScore": 152.6
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310618323025920",
-                    "evaluation": "作业1-1",
-                    "evaluationDesc": "测试平时作业1-1",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 25,
-                    "matrixScore": 22.83,
-                    "matrixAvgScore": 2.08
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310689512947712",
-                    "evaluation": "作业1-2",
-                    "evaluationDesc": "测试平时作业1-2",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 30,
-                    "matrixScore": 24.24,
-                    "matrixAvgScore": 2.2
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310737437065216",
-                    "evaluation": "作业1-3",
-                    "evaluationDesc": "测试平时作业1-3",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 100,
-                    "matrixScore": 29.16,
-                    "matrixAvgScore": 2.65
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310821620940800",
-                    "evaluation": "作业1-4",
-                    "evaluationDesc": "测试平时作业1-4",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 65,
-                    "matrixScore": 25.8,
-                    "matrixAvgScore": 2.35
-                  }
-                ]
-              }
-            },
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "targetSumWeight": 60,
-              "targetSumScore": 60,
-              "targetMatrixAvgScore": 32.5,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 42,
-                "matrixAvgScore": 16.96,
-                "targetScoreSum": 23,
-                "targetMatrixSumScore": 186.55
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310891598708736",
-                    "evaluation": "作业2-1",
-                    "evaluationDesc": "测试平时作业2-1",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 90,
-                    "matrixScore": 34.92,
-                    "matrixAvgScore": 3.17
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310950931333120",
-                    "evaluation": "作业2-2",
-                    "evaluationDesc": "测试平时作业2-2",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 36.43,
-                    "matrixAvgScore": 3.31
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310988852035584",
-                    "evaluation": "作业2-3",
-                    "evaluationDesc": "测试平时作业2-3",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 33.76,
-                    "matrixAvgScore": 3.07
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311017624961024",
-                    "evaluation": "作业2-4",
-                    "evaluationDesc": "测试平时作业2-4",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 70,
-                    "matrixScore": 33.99,
-                    "matrixAvgScore": 3.09
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311052316049408",
-                    "evaluation": "作业2-5",
-                    "evaluationDesc": "测试平时作业2-5",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 85,
-                    "matrixScore": 15.6,
-                    "matrixAvgScore": 1.42
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311081336438784",
-                    "evaluation": "作业2-6",
-                    "evaluationDesc": "测试平时作业2-6",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 85,
-                    "matrixScore": 16.25,
-                    "matrixAvgScore": 1.48
-                  }
-                ]
-              }
-            }
-          ]
-        },
-        {
-          "name": "各课程目标平均分",
-          "studentCode": "各课程目标平均分",
-          "administrativeClass": null,
-          "score": 0,
-          "targetList": [
-            {
-              "targetId": "500310435677863936",
-              "targetName": "测试课程目标1",
-              "graduationRequirement": "测试毕业要求1",
-              "targetSumWeight": 40,
-              "targetSumScore": 40,
-              "targetMatrixAvgScore": 23.1,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 28,
-                "matrixAvgScore": 13.87,
-                "targetScoreSum": 19.5,
-                "targetMatrixSumScore": 152.6
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310618323025920",
-                    "evaluation": "作业1-1",
-                    "evaluationDesc": "测试平时作业1-1",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 25,
-                    "matrixScore": 22.83,
-                    "matrixAvgScore": 2.08
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310689512947712",
-                    "evaluation": "作业1-2",
-                    "evaluationDesc": "测试平时作业1-2",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 30,
-                    "matrixScore": 24.24,
-                    "matrixAvgScore": 2.2
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310737437065216",
-                    "evaluation": "作业1-3",
-                    "evaluationDesc": "测试平时作业1-3",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 100,
-                    "matrixScore": 29.16,
-                    "matrixAvgScore": 2.65
-                  },
-                  {
-                    "targetId": "500310435677863936",
-                    "evaluationId": "500310821620940800",
-                    "evaluation": "作业1-4",
-                    "evaluationDesc": "测试平时作业1-4",
-                    "targetWeight": 7.5,
-                    "targetScore": 3,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 12,
-                    "score": 65,
-                    "matrixScore": 25.8,
-                    "matrixAvgScore": 2.35
-                  }
-                ]
-              }
-            },
-            {
-              "targetId": "500311416511660032",
-              "targetName": "测试课程目标2",
-              "graduationRequirement": "测试毕业要求2",
-              "targetSumWeight": 60,
-              "targetSumScore": 60,
-              "targetMatrixAvgScore": 32.5,
-              "finalScore": {
-                "evaluationId": "500274127358132224",
-                "evaluation": "期末考试",
-                "targetWeight": 70,
-                "targetScore": 42,
-                "matrixAvgScore": 16.96,
-                "targetScoreSum": 23,
-                "targetMatrixSumScore": 186.55
-              },
-              "usualScore": {
-                "targetWeight": 30,
-                "scoreList": [
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310891598708736",
-                    "evaluation": "作业2-1",
-                    "evaluationDesc": "测试平时作业2-1",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 90,
-                    "matrixScore": 34.92,
-                    "matrixAvgScore": 3.17
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310950931333120",
-                    "evaluation": "作业2-2",
-                    "evaluationDesc": "测试平时作业2-2",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 36.43,
-                    "matrixAvgScore": 3.31
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500310988852035584",
-                    "evaluation": "作业2-3",
-                    "evaluationDesc": "测试平时作业2-3",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 100,
-                    "matrixScore": 33.76,
-                    "matrixAvgScore": 3.07
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311017624961024",
-                    "evaluation": "作业2-4",
-                    "evaluationDesc": "测试平时作业2-4",
-                    "targetWeight": 6,
-                    "targetScore": 3.6,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 70,
-                    "matrixScore": 33.99,
-                    "matrixAvgScore": 3.09
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311052316049408",
-                    "evaluation": "作业2-5",
-                    "evaluationDesc": "测试平时作业2-5",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 85,
-                    "matrixScore": 15.6,
-                    "matrixAvgScore": 1.42
-                  },
-                  {
-                    "targetId": "500311416511660032",
-                    "evaluationId": "500311081336438784",
-                    "evaluation": "作业2-6",
-                    "evaluationDesc": "测试平时作业2-6",
-                    "targetWeight": 3,
-                    "targetScore": 1.8,
-                    "targetSumWeight": 30,
-                    "targetSumScore": 18,
-                    "score": 85,
-                    "matrixScore": 16.25,
-                    "matrixAvgScore": 1.48
-                  }
-                ]
-              }
-            }
-          ]
-        }
-      ]
-    }
-  }
-}

+ 0 - 150
src/modules/course/components/profession/AddProfessionalCourse.vue

@@ -1,150 +0,0 @@
-<template>
-  <el-dialog
-    :visible.sync="modalIsShow"
-    title="选择课程"
-    top="10vh"
-    width="800px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    @opened="visibleChange"
-  >
-    <el-form ref="FilterForm" label-position="left" inline label-width="0px">
-      <el-form-item>
-        <org-select v-model="filter.orgId" placeholder="开课学院"></org-select>
-      </el-form-item>
-
-      <el-form-item>
-        <el-button type="primary" :disabled="!canSearch" @click="getList"
-          >查询</el-button
-        >
-      </el-form-item>
-    </el-form>
-
-    <el-table
-      ref="TableList"
-      :data="dataList"
-      border
-      max-height="500px"
-      @selection-change="handleSelectionChange"
-    >
-      <el-table-column
-        type="selection"
-        fixed="left"
-        width="55"
-        align="center"
-        :selectable="(row) => row.canSelect"
-      ></el-table-column>
-      <el-table-column
-        type="index"
-        label="序号"
-        width="70"
-        :index="indexMethod"
-      ></el-table-column>
-      <el-table-column
-        prop="courseName"
-        label="课程名称"
-        min-width="120"
-      ></el-table-column>
-      <el-table-column
-        prop="courseCode"
-        label="课程编码"
-        min-width="120"
-      ></el-table-column>
-      <el-table-column
-        prop="orgName"
-        label="开课学院"
-        min-width="120"
-      ></el-table-column>
-    </el-table>
-
-    <div slot="footer">
-      <el-button type="primary" :disabled="isSubmit" @click="submit"
-        >确认</el-button
-      >
-      <el-button @click="cancel">取消</el-button>
-    </div>
-  </el-dialog>
-</template>
-
-<script>
-import { professionalCourseQueryList, professionalCourseSave } from "../../api";
-
-export default {
-  name: "professional-course-add",
-  props: {
-    rowData: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  computed: {
-    canSearch() {
-      return this.filter.orgId;
-    },
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      filter: {
-        professionalId: "",
-        orgId: "",
-      },
-      isSubmit: false,
-      dataList: [],
-      multipleSelection: [],
-    };
-  },
-  methods: {
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    visibleChange() {
-      this.filter.orgId = this.rowData.orgId;
-      this.filter.professionalId = this.rowData.id;
-      this.getList();
-      this.$nextTick(() => {
-        this.$refs.TableList?.clearSelection();
-      });
-    },
-    async getList() {
-      this.dataList = [];
-      const data = await professionalCourseQueryList(this.filter);
-      this.dataList = data || [];
-    },
-    handleSelectionChange(val) {
-      this.multipleSelection = val;
-    },
-    async submit() {
-      if (!this.multipleSelection.length) {
-        this.$message.error("请选择课程!");
-        return;
-      }
-
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-      const data = await professionalCourseSave({
-        professionalId: this.rowData.id,
-        courses: this.multipleSelection.map((item) => {
-          return {
-            courseId: item.courseId,
-            courseName: item.courseName,
-          };
-        }),
-      }).catch(() => {});
-      this.isSubmit = false;
-
-      if (!data) return;
-      this.multipleSelection = [];
-      this.$message.success("选择成功!");
-      this.$emit("modified");
-      this.cancel();
-    },
-  },
-};
-</script>

+ 0 - 117
src/modules/course/components/profession/ModifyProfessional.vue

@@ -1,117 +0,0 @@
-<template>
-  <el-dialog
-    :visible.sync="modalIsShow"
-    :title="title"
-    top="10vh"
-    width="500px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    @open="visibleChange"
-  >
-    <el-form
-      ref="modalFormComp"
-      :model="modalForm"
-      :key="modalForm.id"
-      :rules="rules"
-      label-width="100px"
-    >
-      <el-form-item prop="name" label="专业名称:">
-        <el-input
-          v-model.trim="modalForm.name"
-          placeholder="专业名称"
-          clearable
-        ></el-input>
-      </el-form-item>
-      <el-form-item prop="orgId" label="所属学院:">
-        <org-select
-          v-model="modalForm.orgId"
-          placeholder="所属学院"
-          :filter-param="{ orgId: instance.orgId, withoutPrintingRoom: true }"
-        ></org-select>
-      </el-form-item>
-    </el-form>
-    <div slot="footer">
-      <el-button type="primary" :disabled="isSubmit" @click="submit"
-        >确认</el-button
-      >
-      <el-button @click="cancel">取消</el-button>
-    </div>
-  </el-dialog>
-</template>
-
-<script>
-import { professionalSave } from "../../api";
-
-const initModalForm = {
-  id: null,
-  orgId: "",
-  name: "",
-};
-
-export default {
-  name: "ModifyProfessional",
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      modalForm: { ...initModalForm },
-      rules: {
-        name: [
-          { required: true, message: "请输入专业名称", trigger: "change" },
-          {
-            message: "专业名称不能超过30个字",
-            max: 30,
-            trigger: "change",
-          },
-        ],
-        orgId: [
-          { required: true, message: "请选择所属学院", trigger: "change" },
-        ],
-      },
-    };
-  },
-  computed: {
-    isEdit() {
-      return !!this.instance.id;
-    },
-    title() {
-      return (this.isEdit ? "编辑" : "新增") + "专业";
-    },
-  },
-  methods: {
-    visibleChange() {
-      this.modalForm = this.$objAssign(initModalForm, this.instance);
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    async submit() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-      const data = await professionalSave(this.modalForm).catch(() => {});
-      this.isSubmit = false;
-
-      if (!data) return;
-
-      this.$message.success("修改成功!");
-      this.$emit("modified");
-      this.cancel();
-    },
-  },
-};
-</script>

+ 0 - 117
src/modules/course/components/profession/ModifyRequirement.vue

@@ -1,117 +0,0 @@
-<template>
-  <el-dialog
-    :visible.sync="modalIsShow"
-    :title="title"
-    top="10vh"
-    width="600px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    @open="visibleChange"
-  >
-    <el-form
-      ref="modalFormComp"
-      :model="modalForm"
-      :rules="rules"
-      label-width="90px"
-    >
-      <el-form-item prop="name" label="毕业要求:">
-        <el-input
-          v-model.trim="modalForm.name"
-          placeholder="请输入毕业要求"
-          clearable
-        ></el-input>
-      </el-form-item>
-    </el-form>
-    <div slot="footer">
-      <el-button type="primary" :disabled="isSubmit" @click="submit"
-        >确认</el-button
-      >
-      <el-button @click="cancel">取消</el-button>
-    </div>
-  </el-dialog>
-</template>
-
-<script>
-import { professionalRequirementSave } from "../../api";
-
-const initModalForm = {
-  id: null,
-  professionalId: "",
-  name: "",
-  sortNum: "",
-  nodeCount: 0,
-};
-
-export default {
-  name: "modify-requirement",
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  computed: {
-    isEdit() {
-      return !!this.instance.id;
-    },
-    title() {
-      return (this.isEdit ? "编辑" : "新增") + "毕业要求";
-    },
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      modalForm: { ...initModalForm },
-      rules: {
-        name: [
-          {
-            required: true,
-            message: "请输入毕业要求",
-            trigger: "change",
-          },
-          {
-            message: "毕业要求不能超过30个字",
-            max: 30,
-            trigger: "change",
-          },
-        ],
-      },
-    };
-  },
-  methods: {
-    initData(val) {
-      this.modalForm = this.$objAssign(initModalForm, val);
-    },
-    visibleChange() {
-      this.initData(this.instance);
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    async submit() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-      let datas = { ...this.modalForm };
-      if (!this.isEdit) datas.nodeCount = undefined;
-      const data = await professionalRequirementSave(datas).catch(() => {});
-      this.isSubmit = false;
-
-      if (!data) return;
-
-      this.$message.success(this.title + "成功!");
-      this.$emit("modified");
-      this.cancel();
-    },
-  },
-};
-</script>

+ 0 - 97
src/modules/course/components/profession/ModifyRequirementNode.vue

@@ -1,97 +0,0 @@
-<template>
-  <el-dialog
-    :visible.sync="modalIsShow"
-    :title="title"
-    top="10vh"
-    width="400px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    @open="visibleChange"
-  >
-    <el-form ref="modalFormComp" :model="modalForm" label-width="80px">
-      <el-form-item label="子节点数:">
-        <el-input-number
-          v-model="modalForm.nodeCount"
-          :min="0"
-          :max="10"
-          :step="1"
-          step-strictly
-          :controls="false"
-        ></el-input-number>
-      </el-form-item>
-    </el-form>
-    <div slot="footer">
-      <el-button type="primary" :disabled="isSubmit" @click="submit"
-        >确认</el-button
-      >
-      <el-button @click="cancel">取消</el-button>
-    </div>
-  </el-dialog>
-</template>
-
-<script>
-import { professionalRequirementSave } from "../../api";
-
-const initModalForm = {
-  id: null,
-  professionalId: "",
-  name: "",
-  sortNum: "",
-  nodeCount: 0,
-};
-
-export default {
-  name: "modify-requirement-node",
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  computed: {
-    isEdit() {
-      return !!this.instance.nodeCount;
-    },
-    title() {
-      return (this.isEdit ? "编辑" : "新增") + "子节点";
-    },
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      modalForm: { ...initModalForm },
-    };
-  },
-  methods: {
-    initData(val) {
-      this.modalForm = this.$objAssign(initModalForm, val);
-    },
-    visibleChange() {
-      this.initData(this.instance);
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    async submit() {
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-      let datas = { ...this.modalForm };
-      const data = await professionalRequirementSave(datas).catch(() => {});
-      this.isSubmit = false;
-
-      if (!data) return;
-
-      this.$message.success("操作成功!");
-      this.$emit("modified");
-      this.cancel();
-    },
-  },
-};
-</script>

+ 0 - 131
src/modules/course/components/profession/ProfessionalCourse.vue

@@ -1,131 +0,0 @@
-<template>
-  <div class="professional-course">
-    <div class="box-justify part-box part-box-pad">
-      <div>
-        <p class="tips-info">请根据开设专业选择课程</p>
-      </div>
-      <div>
-        <el-button v-if="canEdit" type="primary" @click="toAdd"
-          >选择课程</el-button
-        >
-      </div>
-    </div>
-
-    <div class="part-box part-box-pad">
-      <drag-table
-        :data="dataList"
-        :columns="columns"
-        :drag-enable="canEdit"
-        @sort-change="sortChange"
-      >
-        <template #course="{ row }">
-          {{ row.courseName }}({{ row.courseCode }})
-        </template>
-        <template #action="{ row }">
-          <el-button class="btn-danger" type="text" @click="toDelete(row)"
-            >删除</el-button
-          >
-        </template>
-      </drag-table>
-    </div>
-
-    <!-- AddProfessionalCourse -->
-    <add-professional-course
-      v-if="canEdit"
-      ref="AddProfessionalCourse"
-      :row-data="rowData"
-      @modified="getList"
-    ></add-professional-course>
-  </div>
-</template>
-
-<script>
-import {
-  professionalCourseListPage,
-  professionalCourseRemove,
-  professionalCourseSort,
-} from "../../api";
-
-import AddProfessionalCourse from "./AddProfessionalCourse.vue";
-import DragTable from "@/components/DragTable.vue";
-
-export default {
-  name: "professional-course",
-  components: {
-    AddProfessionalCourse,
-    DragTable,
-  },
-  props: {
-    rowData: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      dataList: [],
-      columns: [],
-      canEdit: false,
-    };
-  },
-  created() {
-    this.canEdit = this.checkPrivilege("link", "canEditCourse");
-    this.columns = [
-      {
-        label: "序号",
-        prop: "$index",
-        width: 60,
-      },
-      {
-        label: "课程(代码)",
-        prop: "course",
-      },
-    ];
-    if (this.canEdit) {
-      this.columns.push({
-        label: "操作",
-        prop: "action",
-        className: "action-column",
-        width: 100,
-      });
-    }
-  },
-  mounted() {
-    this.getList();
-  },
-  methods: {
-    async getList() {
-      const data = await professionalCourseListPage({
-        professionalId: this.rowData.id,
-      });
-      this.dataList = data || [];
-    },
-    async sortChange(data) {
-      const res = await professionalCourseSort(
-        data.map((item) => {
-          return { id: item.id, sortNum: item.sortNum };
-        })
-      ).catch(() => {});
-      if (!res) {
-        await this.getList();
-      }
-    },
-    toAdd() {
-      this.$refs.AddProfessionalCourse.open();
-    },
-    toDelete(row) {
-      this.$confirm(`确定要删除课程【${row.courseName}】吗?`, "提示", {
-        type: "warning",
-      })
-        .then(async () => {
-          await professionalCourseRemove(row.id);
-          this.$message.success("删除成功!");
-          this.getList();
-        })
-        .catch(() => {});
-    },
-  },
-};
-</script>

+ 0 - 88
src/modules/course/components/profession/ProfessionalDetail.vue

@@ -1,88 +0,0 @@
-<template>
-  <div class="professional-detail">
-    <el-dialog
-      class="page-dialog"
-      :visible.sync="modalIsShow"
-      :close-on-click-modal="false"
-      :close-on-press-escape="false"
-      append-to-body
-      fullscreen
-      @close="closeHandle"
-    >
-      <div slot="title">{{ rowData.name }}</div>
-      <div class="mb-4 tab-btns">
-        <el-button
-          v-for="tab in tabs"
-          :key="tab.val"
-          size="medium"
-          :type="curTab == tab.val ? 'primary' : 'default'"
-          @click="selectMenu(tab.val)"
-          >{{ tab.name }}
-        </el-button>
-      </div>
-
-      <div v-if="modalIsShow">
-        <component :is="curTab" :row-data="rowData"></component>
-      </div>
-
-      <div slot="footer"></div>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import ProfessionalCourse from "./ProfessionalCourse.vue";
-import ProfessionalRequirement from "./ProfessionalRequirement.vue";
-import ProfessionalMatrix from "./ProfessionalMatrix.vue";
-
-export default {
-  name: "professional-detail",
-  components: {
-    ProfessionalCourse,
-    ProfessionalRequirement,
-    ProfessionalMatrix,
-  },
-  props: {
-    rowData: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      curTab: "ProfessionalCourse",
-      tabs: [
-        {
-          name: "课程管理",
-          val: "ProfessionalCourse",
-        },
-        {
-          name: "毕业要求管理",
-          val: "ProfessionalRequirement",
-        },
-        {
-          name: "毕业支撑矩阵",
-          val: "ProfessionalMatrix",
-        },
-      ],
-    };
-  },
-  methods: {
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    selectMenu(tab) {
-      this.curTab = tab;
-    },
-    closeHandle() {
-      this.curTab = "ProfessionalCourse";
-    },
-  },
-};
-</script>

+ 0 - 261
src/modules/course/components/profession/ProfessionalMatrix.vue

@@ -1,261 +0,0 @@
-<template>
-  <div class="professional-matrix">
-    <div class="box-justify part-box part-box-pad">
-      <div>
-        <p class="tips-info">{{ rowData.name }}毕业要求支撑矩阵管理</p>
-      </div>
-      <div>
-        <el-button type="success" :loading="loading" @click="toDownload"
-          >下载</el-button
-        >
-      </div>
-    </div>
-
-    <div class="part-box part-box-pad">
-      <el-table :data="dataList" border :cell-style="cellStyleHandle">
-        <el-table-column label="课程名称" min-width="200" fixed="left">
-          <template slot-scope="scope">
-            {{ scope.row.courseName }}
-          </template>
-        </el-table-column>
-        <el-table-column label="毕业要求" align="center">
-          <template v-if="hasSubRequirements">
-            <el-table-column
-              v-for="(column, cindex) in columns"
-              :key="cindex"
-              :label="column.name"
-              align="center"
-            >
-              <el-table-column
-                v-for="subr in column.subRequirements"
-                :key="subr.name"
-                :label="subr.name === 'null' ? '' : subr.name"
-                align="center"
-              >
-                <template slot-scope="scope">
-                  <el-input-number
-                    v-if="scope.row.canEdit"
-                    v-model="scope.row[`${column.name}_${subr.name}`].value"
-                    class="width-50"
-                    :min="0"
-                    :max="1"
-                    :step="0.01"
-                    step-strictly
-                    :controls="false"
-                    @change="
-                      () =>
-                        unitChange(
-                          scope.row,
-                          `${column.name}_${subr.name}`,
-                          subr.columnIndex
-                        )
-                    "
-                  ></el-input-number>
-                  <span v-else>{{
-                    scope.row[`${column.name}_${subr.name}`].value
-                  }}</span>
-                </template>
-              </el-table-column>
-            </el-table-column>
-          </template>
-
-          <template v-else>
-            <el-table-column
-              v-for="(column, cindex) in columns"
-              :key="cindex"
-              :label="column.name"
-              align="center"
-            >
-              <template slot-scope="scope">
-                <el-input-number
-                  v-if="scope.row.canEdit"
-                  v-model="scope.row[`${column.name}_null`].value"
-                  class="width-50"
-                  :min="0"
-                  :max="1"
-                  :step="0.01"
-                  step-strictly
-                  :controls="false"
-                  @change="
-                    () =>
-                      unitChange(
-                        scope.row,
-                        `${column.name}_null`,
-                        column.columnIndex
-                      )
-                  "
-                ></el-input-number>
-                <span v-else>{{ scope.row[`${column.name}_null`].value }}</span>
-              </template>
-            </el-table-column>
-          </template>
-        </el-table-column>
-      </el-table>
-    </div>
-  </div>
-</template>
-
-<script>
-import {
-  professionalMatrixDetail,
-  professionalMatrixSave,
-  professionalMatrixDownload,
-} from "../../api";
-import { downloadByApi } from "@/plugins/download";
-import { calcSum } from "@/plugins/utils";
-
-export default {
-  name: "professional-matrix",
-  props: {
-    rowData: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      dataList: [],
-      columns: [],
-      hasSubRequirements: false,
-      loading: false,
-      errorIndexs: [],
-    };
-  },
-  mounted() {
-    this.getList();
-  },
-  methods: {
-    async getList() {
-      const res = await professionalMatrixDetail({
-        professionalId: this.rowData.id,
-      });
-      const tableData = res || [];
-      this.dataList = tableData.map((item, index) => {
-        if (!index) this.parseColumns(item.requirements);
-
-        const nitem = {
-          courseId: item.courseId,
-          courseName: item.courseName,
-          canEdit: item.canEdit,
-        };
-        item.requirements.forEach((requirement) => {
-          requirement.subRequirements.forEach((subr) => {
-            nitem[`${requirement.name}_${subr.name + ""}`] = {
-              id: subr.id,
-              value: subr.content || undefined,
-            };
-          });
-        });
-
-        return nitem;
-      });
-    },
-    parseColumns(requirements) {
-      this.hasSubRequirements = requirements.some(
-        (item) => item.subRequirements[0].name !== null
-      );
-      if (!this.hasSubRequirements) {
-        this.columns = requirements.map((item, index) => {
-          return { name: item.name, columnIndex: index + 1 };
-        });
-        return;
-      }
-
-      let cindex = 0;
-      this.columns = requirements.map((item) => {
-        return {
-          name: item.name,
-          subRequirements: item.subRequirements.map((subr) => {
-            return {
-              name: subr.name + "",
-              columnIndex: ++cindex,
-            };
-          }),
-        };
-      });
-    },
-    updateErrorIndexs([rowIndex, columnIndex]) {
-      const pos = this.errorIndexs.findIndex((item) => item[1] === columnIndex);
-      if (pos !== -1) {
-        this.errorIndexs.splice(pos, 1);
-      }
-
-      this.errorIndexs.push([rowIndex, columnIndex]);
-    },
-    clearErrorIndexs(columnIndex) {
-      this.errorIndexs = this.errorIndexs.filter(
-        (item) => item[1] !== columnIndex
-      );
-    },
-    async unitChange(row, key, columnIndex) {
-      const [fieldName, nodeName] = key.split("_");
-      const totalVal = calcSum(
-        this.dataList.map((item) => item[key].value || 0)
-      );
-      if (totalVal > 1) {
-        const columnName =
-          nodeName === "null" ? fieldName : `${fieldName}:${nodeName}`;
-        this.$message.error(`${columnName}列总和大于1,当前修改值将不会保存!`);
-
-        const rowIndex = this.dataList.findIndex(
-          (item) => item.courseId === row.courseId
-        );
-
-        this.updateErrorIndexs([rowIndex, columnIndex]);
-        return;
-      }
-
-      let saveData = [];
-      const curColumnHasError = this.errorIndexs.some(
-        (item) => item[1] === columnIndex
-      );
-      if (curColumnHasError) {
-        saveData = this.dataList.map((item) => {
-          return {
-            id: item[key].id,
-            content: item[key].value,
-          };
-        });
-      } else {
-        saveData = [
-          {
-            id: row[key].id,
-            content: row[key].value,
-          },
-        ];
-      }
-
-      this.clearErrorIndexs(columnIndex);
-      await professionalMatrixSave(saveData);
-    },
-    cellStyleHandle({ rowIndex, columnIndex }) {
-      if (!this.errorIndexs.length) return;
-      if (
-        this.errorIndexs.some(
-          (item) => rowIndex === item[0] && columnIndex === item[1]
-        )
-      ) {
-        return {
-          backgroundColor: "#fde2e2",
-        };
-      }
-    },
-    async toDownload(row) {
-      if (this.loading) return;
-      this.loading = true;
-
-      const res = await downloadByApi(() => {
-        return professionalMatrixDownload(this.rowData.id);
-      }, "").catch((e) => {
-        this.$message.error(e || "下载失败,请重新尝试!");
-      });
-      this.loading = false;
-
-      if (!res) return;
-      this.$message.success("下载成功!");
-    },
-  },
-};
-</script>

+ 0 - 164
src/modules/course/components/profession/ProfessionalRequirement.vue

@@ -1,164 +0,0 @@
-<template>
-  <div class="professional-requirement">
-    <div class="box-justify part-box part-box-pad">
-      <div>
-        <p class="tips-info">
-          如果采用线下阅卷,请先导入试卷结构后再按模版导入期末成绩
-        </p>
-      </div>
-      <div>
-        <el-button v-if="canEdit" type="primary" @click="toAdd"
-          >新增毕业要求</el-button
-        >
-      </div>
-    </div>
-
-    <div class="part-box part-box-pad">
-      <drag-table
-        :data="dataList"
-        :columns="columns"
-        :drag-enable="canEdit"
-        @sort-change="sortChange"
-      >
-        <template #action="{ row }">
-          <el-button class="btn-primary" type="text" @click="toEditNode(row)"
-            >子节点</el-button
-          >
-          <el-button class="btn-primary" type="text" @click="toEdit(row)"
-            >编辑</el-button
-          >
-          <el-button
-            :disabled="!!row.code"
-            class="btn-danger"
-            type="text"
-            @click="toDelete(row)"
-            >删除</el-button
-          >
-        </template>
-      </drag-table>
-    </div>
-
-    <!-- ModifyRequirement -->
-    <modify-requirement
-      v-if="canEdit"
-      ref="ModifyRequirement"
-      :instance="curRow"
-      @modified="getList"
-    ></modify-requirement>
-    <!-- ModifyRequirementNode -->
-    <modify-requirement-node
-      v-if="canEdit"
-      ref="ModifyRequirementNode"
-      :instance="curRow"
-      @modified="getList"
-    ></modify-requirement-node>
-  </div>
-</template>
-
-<script>
-import {
-  professionalRequirementListPage,
-  professionalRequirementRemove,
-  professionalRequirementSort,
-} from "../../api";
-
-import ModifyRequirement from "./ModifyRequirement.vue";
-import ModifyRequirementNode from "./ModifyRequirementNode.vue";
-import DragTable from "@/components/DragTable.vue";
-
-export default {
-  name: "professional-requirement",
-  components: {
-    ModifyRequirement,
-    ModifyRequirementNode,
-    DragTable,
-  },
-  props: {
-    rowData: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      dataList: [],
-      curRow: {},
-      columns: [],
-      canEdit: false,
-    };
-  },
-  created() {
-    this.canEdit = this.checkPrivilege("link", "canEditRequirement");
-    this.columns = [
-      {
-        label: "序号",
-        prop: "$index",
-        width: 60,
-      },
-      {
-        label: "毕业要求",
-        prop: "name",
-      },
-      {
-        label: "子节点",
-        prop: "nodeCount",
-      },
-    ];
-    if (this.canEdit) {
-      this.columns.push({
-        label: "操作",
-        prop: "action",
-        className: "action-column",
-        width: 160,
-      });
-    }
-  },
-  mounted() {
-    this.getList();
-  },
-  methods: {
-    async getList() {
-      const data = await professionalRequirementListPage({
-        professionalId: this.rowData.id,
-      });
-      this.dataList = data || [];
-    },
-    async sortChange(data) {
-      const res = await professionalRequirementSort(
-        data.map((item) => {
-          return { id: item.id, sortNum: item.sortNum };
-        })
-      ).catch(() => {});
-      if (!res) {
-        await this.getList();
-      }
-    },
-    toAdd() {
-      this.curRow = { professionalId: this.rowData.id };
-      this.$refs.ModifyRequirement.open();
-    },
-    toEdit(row) {
-      this.curRow = { ...row, professionalId: this.rowData.id };
-      this.$refs.ModifyRequirement.open();
-    },
-    toEditNode(row) {
-      this.curRow = { ...row, professionalId: this.rowData.id };
-      this.$refs.ModifyRequirementNode.open();
-    },
-    toDelete(row) {
-      if (row.code) return;
-      this.$confirm(`确定要删除毕业要求【${row.name}】吗?`, "提示", {
-        type: "warning",
-      })
-        .then(async () => {
-          await professionalRequirementRemove(row.id);
-          this.$message.success("删除成功!");
-          this.getList();
-        })
-        .catch(() => {});
-    },
-  },
-};
-</script>

+ 0 - 266
src/modules/course/components/score/EndScoreManage.vue

@@ -1,266 +0,0 @@
-<template>
-  <div class="end-score-manage">
-    <div class="part-box part-box-pad box-justify">
-      <p></p>
-      <div>
-        <el-button
-          type="success"
-          :loading="syncing"
-          :disabled="importing"
-          @click="toSync"
-          >同步成绩</el-button
-        >
-        <el-button
-          type="success"
-          :loading="importing"
-          :disabled="syncing"
-          @click="toImportPaperStruct"
-          >导入试卷结构</el-button
-        >
-        <el-button
-          type="success"
-          :loading="importing"
-          :disabled="syncing"
-          @click="toImportEndScore"
-          >导入期末成绩</el-button
-        >
-        <el-button type="success" @click="toSetBlue">设置试卷蓝图</el-button>
-      </div>
-    </div>
-    <div class="part-box part-box-pad">
-      <el-table :data="dataList">
-        <el-table-column type="index" label="序号" width="70"></el-table-column>
-        <el-table-column prop="name" label="姓名" width="140"></el-table-column>
-        <el-table-column
-          prop="studentCode"
-          label="学号"
-          width="140"
-        ></el-table-column>
-        <el-table-column prop="score" label="成绩" width="80">
-        </el-table-column>
-        <el-table-column prop="scoreDetailContent" label="成绩明细">
-        </el-table-column>
-        <el-table-column class-name="action-column" label="操作" width="120px">
-          <template slot-scope="scope">
-            <el-button
-              class="btn-primary"
-              type="text"
-              @click="toEdit(scope.row)"
-              >编辑</el-button
-            >
-            <el-button
-              :class="scope.row.enable ? 'btn-danger' : 'btn-primary'"
-              type="text"
-              @click="toEnable(scope.row)"
-              >{{ scope.row.enable ? "禁用" : "启用" }}</el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
-      <div class="part-page">
-        <el-pagination
-          background
-          layout="total, sizes, prev, pager, next, jumper"
-          :pager-count="5"
-          :current-page="current"
-          :total="total"
-          :page-size="size"
-          @current-change="toPage"
-          @size-change="pageSizeChange"
-        >
-        </el-pagination>
-      </div>
-    </div>
-
-    <!-- ModifyEndScore -->
-    <modify-end-score
-      ref="ModifyEndScore"
-      :instance="curRow"
-      @modified="getList"
-    ></modify-end-score>
-    <!-- ImportEndScore -->
-    <import-file
-      ref="ImportEndScore"
-      title="导入期末成绩"
-      :upload-url="upload.score.uploadUrl"
-      :upload-data="filter"
-      :format="['xls', 'xlsx']"
-      :download-handle="downloadHandle"
-      :download-filename="upload.score.dfilename"
-      :auto-upload="false"
-      :uploading="uploading"
-      @upload-success="uploadSuccess"
-      @upload-error="uploadError"
-    ></import-file>
-    <!-- ImportPaperStruct -->
-    <import-file
-      ref="ImportPaperStruct"
-      title="导入试卷结构"
-      :upload-url="upload.paper.uploadUrl"
-      :upload-data="filter"
-      :format="['xls', 'xlsx']"
-      :download-handle="() => downloadTemplate('paperStruct')"
-      :download-filename="upload.paper.dfilename"
-      :auto-upload="false"
-      :uploading="uploading"
-      @upload-success="uploadSuccess"
-      @upload-error="uploadError"
-    ></import-file>
-    <!-- SetBlueDialog -->
-    <set-blue-dialog ref="SetBlueDialog" :course="course"> </set-blue-dialog>
-    <!-- select papers -->
-    <sync-paper-dialog
-      ref="SyncPaperDialog"
-      :course="filter"
-      @modified="getList"
-    ></sync-paper-dialog>
-  </div>
-</template>
-
-<script>
-import {
-  endScoreListPage,
-  endScoreEnable,
-  endScoreTemplateDownload,
-} from "../../api";
-import ModifyEndScore from "./ModifyEndScore.vue";
-import SetBlueDialog from "./SetBlueDialog.vue";
-import ImportFile from "@/components/ImportFile.vue";
-import SyncPaperDialog from "./SyncPaperDialog.vue";
-import { downloadByApi } from "@/plugins/download";
-import templateDownload from "@/mixins/templateDownload";
-
-export default {
-  name: "end-score-manage",
-  components: { ModifyEndScore, SetBlueDialog, ImportFile, SyncPaperDialog },
-  mixins: [templateDownload],
-  props: {
-    course: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      filter: {
-        cultureProgramId: "",
-        courseId: "",
-        teachCourseId: "",
-      },
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      total: 0,
-      dataList: [],
-      curRow: {},
-      syncing: false,
-      importing: false,
-      // import
-      upload: {
-        score: {
-          uploadUrl: "/api/admin/course/degree/final_score/import",
-          dfilename: "期末成绩导入模板.xlsx",
-        },
-        paper: {
-          uploadUrl: "/api/admin/course/degree/final_score/paper_struct/import",
-          dfilename: "试卷结构导入模板.xlsx",
-        },
-      },
-      downloading: false,
-    };
-  },
-  mounted() {
-    this.filter = this.$objAssign(this.filter, this.course);
-    this.toPage(1);
-  },
-  methods: {
-    async getList() {
-      const datas = {
-        ...this.filter,
-        pageNumber: this.current,
-        pageSize: this.size,
-      };
-      const data = await endScoreListPage(datas);
-      this.dataList = data.records.map((item) => {
-        const nitem = { ...item };
-        if (item.scoreDetail) {
-          nitem.scoreDetail = JSON.parse(item.scoreDetail);
-          nitem.scoreDetailContent = nitem.scoreDetail
-            .map((item) => item.score)
-            .join();
-        }
-
-        return nitem;
-      });
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-    },
-    toImportEndScore() {
-      this.$refs.ImportEndScore.open();
-    },
-    toImportPaperStruct() {
-      this.$refs.ImportPaperStruct.open();
-    },
-    toSync() {
-      this.$refs.SyncPaperDialog.open();
-    },
-    toSetBlue() {
-      this.$refs.SetBlueDialog.open();
-    },
-    toEdit(row) {
-      this.curRow = { ...row, teachCourseId: this.course.teachCourseId };
-      this.$refs.ModifyEndScore.open();
-    },
-    uploading() {
-      this.importing = true;
-    },
-    uploadSuccess({ data }) {
-      this.importing = false;
-      const msg = `${data.success},错误:${data.error}`;
-      this.$message.success(msg);
-      this.getList();
-    },
-    uploadError() {
-      this.importing = false;
-    },
-    async downloadHandle() {
-      if (this.downloading) return;
-      this.downloading = true;
-
-      const res = await downloadByApi(() => {
-        return endScoreTemplateDownload(this.filter);
-      }).catch((e) => {
-        this.$message.error(e || "下载失败,请重新尝试!");
-      });
-      this.downloading = false;
-
-      if (!res) return;
-      this.$message.success("下载成功!");
-    },
-    async toEnable(row) {
-      const action = row.enable ? "禁用" : "启用";
-      const confirm = await this.$confirm(
-        `确定要${action}考生【${row.name}】的成绩吗?`,
-        "提示",
-        {
-          type: "warning",
-        }
-      ).catch(() => {});
-      if (confirm !== "confirm") return;
-
-      const enable = !row.enable;
-      await endScoreEnable({
-        id: row.id,
-        enable,
-        teachCourseId: this.course.teachCourseId,
-      });
-      row.enable = enable;
-      this.$message.success("操作成功!");
-    },
-  },
-};
-</script>

+ 0 - 146
src/modules/course/components/score/ModifyEndScore.vue

@@ -1,146 +0,0 @@
-<template>
-  <el-dialog
-    :visible.sync="modalIsShow"
-    title="期末成绩编辑"
-    top="10vh"
-    width="550px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    @open="visibleChange"
-  >
-    <el-form
-      ref="modalFormComp"
-      :model="modalForm"
-      :key="modalForm.id"
-      label-width="100px"
-    >
-      <el-form-item
-        prop="name"
-        label="考生姓名:"
-        :rules="{
-          required: true,
-          message: '考生姓名不能为空,最多30字符',
-          max: 30,
-          trigger: 'change',
-        }"
-      >
-        <el-input
-          v-model.trim="modalForm.name"
-          placeholder="考生姓名"
-          clearable
-        ></el-input>
-      </el-form-item>
-      <el-form-item label="考生学号:">
-        {{ modalForm.studentCode }}
-      </el-form-item>
-      <el-form-item label="成绩:">
-        {{ totalScore }}
-      </el-form-item>
-      <el-form-item
-        v-for="(item, index) in modalForm.scoreDetail"
-        :key="index"
-        :label="`${item.name}:`"
-        :prop="`scoreDetail.${index}.score`"
-        :rules="{
-          required: true,
-          message: '分数不能为空',
-          trigger: 'change',
-        }"
-      >
-        <el-input-number
-          v-model="item.score"
-          class="width-80"
-          size="small"
-          :min="0"
-          :max="1000"
-          :step="0.01"
-          step-strictly
-          :controls="false"
-        >
-        </el-input-number>
-      </el-form-item>
-    </el-form>
-    <div slot="footer">
-      <el-button type="primary" :disabled="isSubmit" @click="submit"
-        >确认</el-button
-      >
-      <el-button @click="cancel">取消</el-button>
-    </div>
-  </el-dialog>
-</template>
-
-<script>
-import { calcSum, deepCopy } from "@/plugins/utils";
-import { endScoreSave } from "../../api";
-
-const initModalForm = {
-  id: null,
-  name: "",
-  studentCode: "",
-  score: "",
-  scoreDetail: [],
-  teachCourseId: "",
-};
-
-export default {
-  name: "ModifyEndScore",
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      modalForm: { ...initModalForm },
-    };
-  },
-  computed: {
-    totalScore() {
-      return calcSum(this.modalForm.scoreDetail.map((item) => item.score || 0));
-    },
-  },
-  methods: {
-    visibleChange() {
-      this.modalForm = this.$objAssign(initModalForm, this.instance);
-      this.modalForm.scoreDetail = deepCopy(this.instance.scoreDetail);
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    async submit() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-      const scoreDetail = this.modalForm.scoreDetail.map((item) => {
-        return { score: item.score + "", name: item.name };
-      });
-      const datas = {
-        id: this.modalForm.id,
-        name: this.modalForm.name,
-        teachCourseId: this.modalForm.teachCourseId,
-        score: this.totalScore,
-        scoreDetail: JSON.stringify(scoreDetail),
-      };
-      const data = await endScoreSave(datas).catch(() => {});
-      this.isSubmit = false;
-
-      if (!data) return;
-
-      this.$message.success("修改成功!");
-      this.$emit("modified");
-      this.cancel();
-    },
-  },
-};
-</script>

+ 0 - 135
src/modules/course/components/score/ModifyNormalScore.vue

@@ -1,135 +0,0 @@
-<template>
-  <el-dialog
-    :visible.sync="modalIsShow"
-    title="平时成绩编辑"
-    top="10vh"
-    width="550px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    @open="visibleChange"
-  >
-    <el-form
-      ref="modalFormComp"
-      :model="modalForm"
-      :key="modalForm.id"
-      label-width="100px"
-    >
-      <el-form-item
-        prop="name"
-        label="考生姓名:"
-        :rules="{
-          required: true,
-          message: '考生姓名不能为空,最多30字符',
-          max: 30,
-          trigger: 'change',
-        }"
-      >
-        <el-input
-          v-model.trim="modalForm.name"
-          placeholder="考生姓名"
-          clearable
-        ></el-input>
-      </el-form-item>
-      <el-form-item label="考生学号:">
-        {{ modalForm.studentCode }}
-      </el-form-item>
-      <el-form-item
-        v-for="(item, index) in modalForm.normalScore"
-        :key="index"
-        :label="`${item.name}:`"
-        :prop="`normalScore.${index}.score`"
-        :rules="{
-          required: true,
-          message: '分数不能为空',
-          trigger: 'change',
-        }"
-      >
-        <el-input-number
-          v-model="item.score"
-          class="width-80"
-          size="small"
-          :min="0"
-          :max="1000"
-          :step="0.01"
-          step-strictly
-          :controls="false"
-        >
-        </el-input-number>
-      </el-form-item>
-    </el-form>
-    <div slot="footer">
-      <el-button type="primary" :disabled="isSubmit" @click="submit"
-        >确认</el-button
-      >
-      <el-button @click="cancel">取消</el-button>
-    </div>
-  </el-dialog>
-</template>
-
-<script>
-import { deepCopy } from "@/plugins/utils";
-import { normalScoreSave } from "../../api";
-
-const initModalForm = {
-  id: null,
-  name: "",
-  studentCode: "",
-  normalScore: [],
-};
-
-export default {
-  name: "ModifyNormalScore",
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      modalForm: { ...initModalForm },
-    };
-  },
-  methods: {
-    visibleChange() {
-      this.modalForm = this.$objAssign(initModalForm, this.instance);
-      this.modalForm.normalScore = deepCopy(this.instance.normalScore);
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    async submit() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-
-      const normalScore = this.modalForm.normalScore.map((item) => {
-        return { score: item.score + "", name: item.name };
-      });
-      const datas = {
-        id: this.modalForm.id,
-        name: this.modalForm.name,
-        score: JSON.stringify(normalScore),
-      };
-      const data = await normalScoreSave(datas).catch(() => {});
-      this.isSubmit = false;
-
-      if (!data) return;
-
-      this.$message.success("修改成功!");
-      this.$emit("modified");
-      this.cancel();
-    },
-  },
-};
-</script>

+ 0 - 205
src/modules/course/components/score/NormalScoreManage.vue

@@ -1,205 +0,0 @@
-<template>
-  <div class="normal-score-manage">
-    <div class="part-box part-box-pad box-justify">
-      <p>请根据权重管理里权重项导入相应的平时成绩</p>
-      <div>
-        <el-button type="success" @click="toImport">导入平时成绩</el-button>
-      </div>
-    </div>
-    <div class="part-box part-box-pad">
-      <el-table :data="dataList">
-        <el-table-column type="index" label="序号" width="70"></el-table-column>
-        <el-table-column
-          prop="name"
-          label="姓名"
-          minWidth="140"
-        ></el-table-column>
-        <el-table-column
-          prop="studentCode"
-          label="学号"
-          minWidth="140"
-        ></el-table-column>
-        <template v-for="(item, index) in normalScoreItems">
-          <el-table-column :key="index" :label="item">
-            <template slot-scope="scope">
-              {{ scope.row[item] }}
-            </template>
-          </el-table-column>
-        </template>
-        <el-table-column class-name="action-column" label="操作" width="120px">
-          <template slot-scope="scope">
-            <el-button
-              class="btn-primary"
-              type="text"
-              @click="toEdit(scope.row)"
-              >编辑</el-button
-            >
-            <el-button
-              :class="scope.row.enable ? 'btn-danger' : 'btn-primary'"
-              type="text"
-              @click="toEnable(scope.row)"
-              >{{ scope.row.enable ? "禁用" : "启用" }}</el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
-      <div class="part-page">
-        <el-pagination
-          background
-          layout="total, sizes, prev, pager, next, jumper"
-          :pager-count="5"
-          :current-page="current"
-          :total="total"
-          :page-size="size"
-          @current-change="toPage"
-          @size-change="pageSizeChange"
-        >
-        </el-pagination>
-      </div>
-    </div>
-
-    <!-- ModifyNormalScore -->
-    <modify-normal-score
-      ref="ModifyNormalScore"
-      :instance="curRow"
-      @modified="getList"
-    ></modify-normal-score>
-    <!-- ImportFile -->
-    <import-file
-      ref="ImportFile"
-      title="导入平时成绩"
-      :upload-url="uploadUrl"
-      :upload-data="filter"
-      :format="['xls', 'xlsx']"
-      :download-handle="downloadHandle"
-      :download-filename="dfilename"
-      :auto-upload="false"
-      @upload-success="uploadSuccess"
-    ></import-file>
-  </div>
-</template>
-
-<script>
-import {
-  normalScoreListPage,
-  normalScoreEnable,
-  scoreTemplateDownload,
-} from "../../api";
-import ModifyNormalScore from "./ModifyNormalScore.vue";
-import ImportFile from "@/components/ImportFile.vue";
-import { downloadByApi } from "@/plugins/download";
-
-export default {
-  name: "normal-score-manage",
-  components: { ModifyNormalScore, ImportFile },
-  props: {
-    course: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      filter: {
-        cultureProgramId: "",
-        courseId: "",
-        teachCourseId: "",
-      },
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      total: 0,
-      dataList: [],
-      curRow: {},
-      normalScoreItems: [],
-      // import
-      uploadUrl: "/api/admin/course/degree/usual_score/import",
-      dfilename: "平时成绩导入模板.xlsx",
-      downloading: false,
-    };
-  },
-  async mounted() {
-    this.filter = this.$objAssign(this.filter, this.course);
-    await this.toPage(1);
-  },
-  methods: {
-    async getList() {
-      const datas = {
-        ...this.filter,
-        pageNumber: this.current,
-        pageSize: this.size,
-      };
-      const data = await normalScoreListPage(datas);
-      this.dataList = data.records.map((item) => {
-        const nitem = { ...item };
-        if (!item.score) {
-          return nitem;
-        }
-
-        nitem.normalScore = JSON.parse(item.score);
-        nitem.normalScore.forEach((sItem) => {
-          nitem[sItem.name] = sItem.score;
-        });
-        return nitem;
-      });
-      this.total = data.total;
-
-      const score = data.records[0]?.score;
-      if (score) {
-        this.normalScoreItems = JSON.parse(score).map((item) => item.name);
-      }
-    },
-    async toPage(page) {
-      this.current = page;
-      await this.getList();
-    },
-    toImport() {
-      this.$refs.ImportFile.open();
-    },
-    toEdit(row) {
-      this.curRow = { ...row };
-      this.$refs.ModifyNormalScore.open();
-    },
-    uploadSuccess({ data }) {
-      const msg = `${data.success},错误:${data.error}`;
-      this.$message.success(msg);
-      this.getList();
-    },
-    async downloadHandle() {
-      if (this.downloading) return;
-      this.downloading = true;
-
-      const res = await downloadByApi(() => {
-        return scoreTemplateDownload(this.filter);
-      }).catch((e) => {
-        this.$message.error(e || "下载失败,请重新尝试!");
-      });
-      this.downloading = false;
-
-      if (!res) return;
-      this.$message.success("下载成功!");
-    },
-    async toEnable(row) {
-      const action = row.enable ? "禁用" : "启用";
-      const confirm = await this.$confirm(
-        `确定要${action}考生【${row.name}】的成绩吗?`,
-        "提示",
-        {
-          type: "warning",
-        }
-      ).catch(() => {});
-      if (confirm !== "confirm") return;
-
-      const enable = !row.enable;
-      await normalScoreEnable({
-        id: row.id,
-        enable,
-        teachCourseId: this.course.teachCourseId,
-      });
-      row.enable = enable;
-      this.$message.success("操作成功!");
-    },
-  },
-};
-</script>

+ 0 - 128
src/modules/course/components/score/SelectBlueDimensionDialog.vue

@@ -1,128 +0,0 @@
-<template>
-  <el-dialog
-    class="select-blue-dimension-dialog"
-    :visible.sync="modalIsShow"
-    title="选择知识点"
-    top="10vh"
-    width="600px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    @opened="visibleChange"
-  >
-    <el-tree
-      v-if="treeData.length"
-      ref="treeRef"
-      :data="treeData"
-      show-checkbox
-      check-on-click-node
-      node-key="id"
-      :props="defaultProps"
-      @check-change="updateTreeStatus"
-    >
-    </el-tree>
-
-    <div slot="footer">
-      <el-button type="primary" @click="submit">确认</el-button>
-      <el-button @click="cancel">取消</el-button>
-    </div>
-  </el-dialog>
-</template>
-
-<script>
-export default {
-  name: "select-blue-dimension-dialog",
-  props: {
-    selectedData: {
-      type: Array,
-      default() {
-        return [];
-      },
-    },
-    treeData: {
-      type: Array,
-      default() {
-        return [];
-      },
-    },
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      defaultProps: {
-        children: "children",
-        label: "name",
-      },
-    };
-  },
-  methods: {
-    visibleChange() {
-      this.$refs.treeRef.setCheckedKeys(this.selectedData);
-
-      this.$nextTick(() => {
-        this.updateTreeStatus();
-      });
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    updateTreeStatus() {
-      const selectedNodes = this.$refs.treeRef.getCheckedNodes(false, true);
-      const targetNodes = selectedNodes.filter(
-        (item) => item.children && item.children.length
-      );
-      const selectTargetId = targetNodes.length ? targetNodes[0].id : "";
-
-      this.treeData.forEach((item) => {
-        item.disabled = selectTargetId ? item.id !== selectTargetId : false;
-        item.children.forEach((elem) => {
-          elem.disabled = item.disabled;
-        });
-      });
-    },
-    submit() {
-      const selectedNodes = this.$refs.treeRef.getCheckedNodes(false, true);
-
-      if (!selectedNodes.length) {
-        this.$message.error("请选择知识点");
-        return;
-      }
-
-      const targetNodes = selectedNodes.filter(
-        (item) => item.children && item.children.length
-      );
-      if (targetNodes.length > 1) {
-        this.$message.error("只能选择一个课程目标的知识点");
-        return;
-      }
-
-      const dimensionIds = selectedNodes
-        .filter((item) => !item.children)
-        .map((item) => item.id);
-
-      this.$emit(
-        "confirm",
-        targetNodes.map((item) => {
-          return {
-            targetId: item.id,
-            targetName: item.name,
-            dimensionList: item.children
-              .filter((ditem) => dimensionIds.includes(ditem.id))
-              .map((dimension) => {
-                return {
-                  dimensionId: dimension.id,
-                  dimensionCode: dimension.code,
-                  dimensionName: dimension.name,
-                };
-              }),
-          };
-        })
-      );
-      this.cancel();
-    },
-  },
-};
-</script>

+ 0 - 268
src/modules/course/components/score/SetBlueDialog.vue

@@ -1,268 +0,0 @@
-<template>
-  <div>
-    <el-dialog
-      :visible.sync="modalIsShow"
-      title="设置试卷蓝图"
-      top="10px"
-      width="660px"
-      :close-on-click-modal="false"
-      :close-on-press-escape="false"
-      append-to-body
-      @open="visibleChange"
-    >
-      <div class="mb-2 box-justify">
-        <div class="box-grow mr-2">
-          <span v-for="(target, index) in treeData" :key="target.id">
-            <span>{{ target.name }}占比</span>
-            <span
-              v-if="targetRates[target.id]"
-              :class="[
-                'mlr-1',
-                targetRates[target.id].valid ? 'color-success' : 'color-danger',
-              ]"
-              >{{ targetRates[target.id].rate }}%</span
-            >
-            <span>({{ target.totalWeight || 0 }}%)</span>
-            <span>{{ index === treeData.length - 1 ? "。" : "," }}</span>
-          </span>
-        </div>
-        <el-button type="primary" :loading="loading" @click="toSync"
-          >同步</el-button
-        >
-      </div>
-      <el-table :data="dataList" border height="400">
-        <el-table-column
-          prop="mainNumber"
-          label="大题号"
-          width="80px"
-        ></el-table-column>
-        <el-table-column
-          prop="subNumber"
-          label="小题号"
-          width="80px"
-        ></el-table-column>
-        <el-table-column
-          prop="score"
-          label="小题满分"
-          width="80px"
-        ></el-table-column>
-        <el-table-column prop="courseTargetName" label="所属课程目标">
-        </el-table-column>
-        <!-- <el-table-column prop="dimensionList" label="知识点">
-          <template slot-scope="scope">
-            <template v-for="target in scope.row.targetList">
-              <p
-                v-for="item in target.dimensionList"
-                :key="`${target.targetId}_${item.dimensionId}`"
-              >
-                {{ item.dimensionName }}
-              </p>
-            </template>
-          </template>
-        </el-table-column> -->
-        <el-table-column class-name="action-column" label="操作" width="110px">
-          <template slot-scope="scope">
-            <el-button
-              class="btn-primary"
-              type="text"
-              @click="toLink(scope.row)"
-              >关联知识点</el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
-      <div slot="footer">
-        <el-button type="primary" :disabled="isSubmit" @click="submit"
-          >确认</el-button
-        >
-        <el-button @click="cancel">取消</el-button>
-      </div>
-    </el-dialog>
-
-    <!-- 设置知识点 -->
-    <select-blue-dimension-dialog
-      ref="SelectBlueDimensionDialog"
-      :tree-data="treeData"
-      :selected-data="selectedData"
-      @confirm="dimensionSelected"
-    ></select-blue-dimension-dialog>
-  </div>
-</template>
-
-<script>
-import { calcSum } from "@/plugins/utils";
-import { courseTargetList } from "../../../base/api";
-import {
-  endScorePaperPositiveDetail,
-  endScorePaperPositiveSave,
-  endScorePaperPositiveSync,
-} from "../../api";
-import SelectBlueDimensionDialog from "./SelectBlueDimensionDialog.vue";
-
-export default {
-  name: "SetBlueDialog",
-  components: { SelectBlueDimensionDialog },
-  props: {
-    course: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      dataList: [],
-      curRow: {},
-      selectedData: [],
-      treeData: [],
-      targetRates: {},
-      loading: false,
-    };
-  },
-  watch: {
-    course: {
-      immediate: true,
-      handler(val, oldVal) {
-        if (!val) return;
-        if (val !== oldVal) this.getTree();
-      },
-    },
-  },
-  methods: {
-    async getTree() {
-      const data = await courseTargetList({
-        teachCourseId: this.course.teachCourseId,
-      });
-      this.treeData = (data || []).map((item) => {
-        return {
-          id: item.id,
-          name: item.targetName,
-          totalWeight: item.totalWeight,
-          disabled: false,
-          children: item.dimensionList.map((elem) => {
-            return { ...elem, disabled: false };
-          }),
-        };
-      });
-    },
-    async getBlueDetail() {
-      const res = await endScorePaperPositiveDetail({
-        cultureProgramId: this.course.cultureProgramId,
-        courseId: this.course.courseId,
-        teachCourseId: this.course.teachCourseId,
-      });
-      this.dataList = res || [];
-      this.updateTargetRates();
-    },
-    visibleChange() {
-      this.getBlueDetail();
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    async toSync() {
-      if (this.loading) return;
-      this.loading = true;
-
-      const res = await endScorePaperPositiveSync({
-        cultureProgramId: this.course.cultureProgramId,
-        courseId: this.course.courseId,
-        teachCourseId: this.course.teachCourseId,
-        paperNumber: this.dataList[0]?.paperNumber,
-      }).catch(() => {});
-      this.loading = false;
-      if (!res) return;
-
-      this.$message.success(`${res.success},错误:${res.error}`);
-      this.getBlueDetail();
-    },
-    checkData() {
-      const valid = !this.dataList.some(
-        (item) => !item.targetList || !item.targetList.length
-      );
-
-      if (!valid) {
-        this.$message.error("还有小题未设置知识点,请完成设置!");
-        return;
-      }
-
-      const unvalidTargets = [];
-      Object.keys(this.targetRates).forEach((tid) => {
-        const target = this.targetRates[tid];
-        if (!target.valid) unvalidTargets.push(target.name);
-      });
-      if (unvalidTargets.length) {
-        this.$message.error(`${unvalidTargets.join("、")}占比不符合要求`);
-        return;
-      }
-
-      return true;
-    },
-    toLink(row) {
-      this.curRow = row;
-      this.selectedData = [];
-      row.targetList.forEach((target) => {
-        target.dimensionList.forEach((dimension) => {
-          this.selectedData.push(dimension.dimensionId);
-        });
-      });
-      this.$refs.SelectBlueDimensionDialog.open();
-    },
-    dimensionSelected(targetList) {
-      this.curRow.targetList = targetList;
-      this.curRow.courseTargetName = targetList[0].targetName;
-      this.updateTargetRates();
-    },
-    updateTargetRates() {
-      const scoreData = {};
-      this.dataList.forEach((item) => {
-        if (!item.targetList || !item.targetList.length) return;
-        const targetId = item.targetList[0].targetId;
-        if (!scoreData[targetId]) scoreData[targetId] = 0;
-        scoreData[targetId] += item.score;
-      });
-      const totalScore = calcSum(this.dataList.map((item) => item.score));
-
-      const targetRates = {};
-      this.treeData.forEach((target) => {
-        const targetScore = scoreData[target.id] || 0;
-        const rate = !totalScore ? 0 : (100 * targetScore) / totalScore;
-        targetRates[target.id] = {
-          rate: Number.isInteger(rate) ? rate : rate.toFixed(2),
-          valid: rate == target.totalWeight,
-          name: target.name,
-        };
-      });
-      this.targetRates = targetRates;
-    },
-    async submit() {
-      if (!this.checkData()) {
-        return;
-      }
-
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-      const datas = {
-        cultureProgramId: this.course.cultureProgramId,
-        courseId: this.course.courseId,
-        teachCourseId: this.course.teachCourseId,
-        paperStruct: this.dataList,
-      };
-      const data = await endScorePaperPositiveSave(datas).catch(() => {});
-      this.isSubmit = false;
-
-      if (!data) return;
-
-      this.$message.success("修改成功!");
-      this.$emit("modified");
-      this.cancel();
-    },
-  },
-};
-</script>

+ 0 - 107
src/modules/course/components/score/SyncPaperDialog.vue

@@ -1,107 +0,0 @@
-<template>
-  <el-dialog
-    :visible.sync="modalIsShow"
-    title="同步成绩"
-    top="10vh"
-    width="500px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    @open="visibleChange"
-  >
-    <el-form ref="modalFormComp" :model="modalForm" label-width="60px">
-      <el-form-item
-        prop="paperNumber"
-        label="试卷:"
-        :rules="{
-          required: true,
-          message: '请选择试卷',
-          trigger: 'change',
-        }"
-      >
-        <el-select
-          v-model="modalForm.paperNumber"
-          placeholder="选择试卷"
-          clearable
-          class="width-full"
-        >
-          <el-option
-            v-for="paper in papers"
-            :key="paper.paperNumber"
-            :value="paper.paperNumber"
-            :label="paper.paperNumber"
-          ></el-option>
-        </el-select>
-      </el-form-item>
-    </el-form>
-    <div slot="footer">
-      <el-button type="primary" :disabled="isSubmit" @click="submit"
-        >确认</el-button
-      >
-      <el-button @click="cancel">取消</el-button>
-    </div>
-  </el-dialog>
-</template>
-
-<script>
-import { endScoreSyncPaperList, endScoreSync } from "../../api";
-
-export default {
-  name: "SyncPaperDialog",
-  props: {
-    course: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      isSubmit: false,
-      modalForm: { paperNumber: "" },
-      papers: [],
-    };
-  },
-  methods: {
-    async getPapers() {
-      if (this.papers.length) return;
-      const res = await endScoreSyncPaperList(this.course);
-      this.papers = res || [];
-    },
-    visibleChange() {
-      this.getPapers();
-      this.modalForm = { paperNumber: "" };
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    async submit() {
-      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
-      if (!valid) return;
-
-      if (this.isSubmit) return;
-      this.isSubmit = true;
-
-      const datas = {
-        cultureProgramId: this.course.cultureProgramId,
-        courseId: this.course.courseId,
-        teachCourseId: this.course.teachCourseId,
-        paperNumber: this.modalForm.paperNumber,
-      };
-      const res = await endScoreSync(datas).catch(() => {});
-      this.isSubmit = false;
-
-      if (!res) return;
-
-      this.$message.success(`${res.success},错误:${res.error}`);
-      this.$emit("modified");
-      this.cancel();
-    },
-  },
-};
-</script>

+ 0 - 105
src/modules/course/components/score/TargetScoreDetail.vue

@@ -1,105 +0,0 @@
-<template>
-  <div class="target-score-detail">
-    <el-dialog
-      class="page-dialog"
-      :visible.sync="modalIsShow"
-      :close-on-click-modal="false"
-      :close-on-press-escape="false"
-      append-to-body
-      fullscreen
-      @open="checkChange"
-    >
-      <div slot="title">
-        成绩管理<span class="color-gray ml-2"
-          >{{ course.courseName }}({{ course.courseCode }})</span
-        >
-      </div>
-      <div class="mb-4 tab-btns">
-        <el-button
-          v-for="tab in tabs"
-          :key="tab.val"
-          size="medium"
-          :type="curTab == tab.val ? 'primary' : 'default'"
-          @click="selectMenu(tab.val)"
-          >{{ tab.name }}
-        </el-button>
-      </div>
-
-      <div v-if="modalIsShow">
-        <component :is="curTab" :course="course"></component>
-      </div>
-
-      <div slot="footer"></div>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import NormalScoreManage from "./NormalScoreManage.vue";
-import EndScoreManage from "./EndScoreManage.vue";
-import { targetReportChangeCheck } from "../../api";
-
-export default {
-  name: "target-score-detail",
-  components: {
-    NormalScoreManage,
-    EndScoreManage,
-  },
-  props: {
-    course: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      curTab: "NormalScoreManage",
-      tabs: [
-        {
-          name: "平时成绩管理",
-          val: "NormalScoreManage",
-        },
-        {
-          name: "期末成绩管理",
-          val: "EndScoreManage",
-        },
-      ],
-    };
-  },
-  methods: {
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    selectMenu(tab) {
-      this.curTab = tab;
-    },
-    async checkChange() {
-      const res = await targetReportChangeCheck({
-        cultureProgramId: this.course.cultureProgramId,
-        courseId: this.course.courseId,
-        paperNumber: this.course.paperNumber,
-        teachCourseId: this.course.teachCourseId,
-        report: false,
-      });
-
-      if (res.courseTargetChange) {
-        this.$notify.warning("课程目标与已保存不一致,请重新设置权重!");
-      }
-      if (res.evaluationChange) {
-        this.$notify.warning(
-          "评价方式与已保存不一致,请重新设置权重及导入新的平时成绩!"
-        );
-      }
-      if (res.targetScoreChange) {
-        this.$notify.warning(res.targetScoreChangeStr);
-      }
-    },
-  },
-};
-</script>

+ 0 - 18
src/modules/course/router.js

@@ -1,27 +1,9 @@
-import TargetScoreManage from "./views/TargetScoreManage.vue";
-import TargetReportManage from "./views/TargetReportManage.vue";
 import CourseDocumentManage from "./views/CourseDocumentManage.vue";
-import ProfessionalCertification from "./views/ProfessionalCertification.vue";
 
 export default [
-  {
-    path: "/course/target-score-manage",
-    name: "CourseTargetScoreManage",
-    component: TargetScoreManage,
-  },
-  {
-    path: "/course/target-report-manage",
-    name: "CourseTargetReportManage",
-    component: TargetReportManage,
-  },
   {
     path: "/course/course-document-manage",
     name: "CourseDocumentManage",
     component: CourseDocumentManage,
   },
-  {
-    path: "/course/professional-certification",
-    name: "ProfessionalCertification",
-    component: ProfessionalCertification,
-  },
 ];

+ 0 - 165
src/modules/course/views/ProfessionalCertification.vue

@@ -1,165 +0,0 @@
-<template>
-  <div class="target-score-manage">
-    <div class="part-box part-box-filter part-box-flex">
-      <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
-        <template v-if="checkPrivilege('condition', 'condition')">
-          <el-form-item label="专业名称:">
-            <el-input
-              v-model.trim="filter.name"
-              placeholder="专业名称"
-              clearable
-            ></el-input>
-          </el-form-item>
-          <el-form-item label="所属学院:">
-            <org-select
-              v-model="filter.orgId"
-              placeholder="所属学院"
-              :filter-param="{ orgId: userOrgId, withoutPrintingRoom: true }"
-            ></org-select>
-          </el-form-item>
-        </template>
-        <el-form-item label-width="0px">
-          <el-button
-            v-if="checkPrivilege('button', 'select')"
-            type="primary"
-            @click="search"
-            >查询</el-button
-          >
-        </el-form-item>
-      </el-form>
-      <div class="part-box-action">
-        <el-button
-          v-if="checkPrivilege('button', 'add')"
-          type="primary"
-          icon="el-icon-add"
-          @click="toAdd"
-          >新增</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="name" label="专业"> </el-table-column>
-        <el-table-column prop="orgName" label="所属学院"> </el-table-column>
-        <el-table-column prop="createName" label="创建人">
-          <span slot-scope="scope">
-            {{ scope.row.userName }}({{ scope.row.loginName }})
-          </span>
-        </el-table-column>
-        <!-- <el-table-column prop="createTime" label="创建时间">
-          <span slot-scope="scope">
-            {{ scope.row.createTime | timestampFilter }}
-          </span>
-        </el-table-column> -->
-        <el-table-column
-          class-name="action-column"
-          label="操作"
-          width="100"
-          fixed="right"
-        >
-          <template slot-scope="scope">
-            <el-button
-              v-if="checkPrivilege('link', 'CertificationManage')"
-              class="btn-primary"
-              type="text"
-              @click="toDetail(scope.row)"
-              >管理</el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
-      <div class="part-page">
-        <el-pagination
-          background
-          layout="total, sizes, prev, pager, next, jumper"
-          :pager-count="5"
-          :current-page="current"
-          :total="total"
-          :page-size="size"
-          @current-change="toPage"
-          @size-change="pageSizeChange"
-        >
-        </el-pagination>
-      </div>
-    </div>
-    <!-- ProfessionalDetail -->
-    <professional-detail
-      v-if="checkPrivilege('link', 'CertificationManage')"
-      ref="ProfessionalDetail"
-      :row-data="curRow"
-    ></professional-detail>
-    <!-- ModifyProfessional -->
-    <modify-professional
-      v-if="checkPrivilege('button', 'add')"
-      ref="ModifyProfessional"
-      :instance="curRow"
-      @modified="getList"
-    ></modify-professional>
-  </div>
-</template>
-
-<script>
-import { professionalListPage } from "../api";
-import ProfessionalDetail from "../components/profession/ProfessionalDetail.vue";
-import ModifyProfessional from "../components/profession/ModifyProfessional.vue";
-
-export default {
-  name: "professional-manage",
-  components: { ProfessionalDetail, ModifyProfessional },
-  data() {
-    return {
-      filter: {
-        orgId: "",
-        name: "",
-      },
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      total: 0,
-      dataList: [],
-      curRow: {},
-      userOrgId: this.$ls.get("orgId", ""),
-    };
-  },
-  mounted() {
-    this.toPage(1);
-  },
-  methods: {
-    async getList() {
-      if (!this.checkPrivilege("list", "list")) return;
-
-      const datas = {
-        ...this.filter,
-        pageNumber: this.current,
-        pageSize: this.size,
-      };
-      const data = await professionalListPage(datas);
-      this.dataList = data.records;
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-    },
-    search() {
-      this.toPage(1);
-    },
-    toAdd() {
-      this.curRow = {
-        orgId: this.userOrgId,
-      };
-      this.$refs.ModifyProfessional.open();
-    },
-    toDetail(row) {
-      this.curRow = row;
-      this.$refs.ProfessionalDetail.open();
-    },
-  },
-};
-</script>

+ 0 - 129
src/modules/course/views/TargetReportManage.vue

@@ -1,129 +0,0 @@
-<template>
-  <div class="target-report-manage">
-    <div class="part-box part-box-filter part-box-flex">
-      <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
-        <template v-if="checkPrivilege('condition', 'condition')">
-          <secp-select
-            v-model="filter"
-            defaultSelectExam
-            @exam-default="search"
-          ></secp-select>
-        </template>
-        <el-form-item label-width="0px">
-          <el-button
-            v-if="checkPrivilege('button', 'select')"
-            type="primary"
-            @click="search"
-            >查询</el-button
-          >
-        </el-form-item>
-      </el-form>
-    </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 label="课程(代码)">
-          <template slot-scope="scope">
-            {{ scope.row.courseName | defaultFieldFilter }}({{
-              scope.row.courseCode | defaultFieldFilter
-            }})
-          </template>
-        </el-table-column>
-        <el-table-column prop="userName" label="创建人">
-          <span slot-scope="scope">
-            {{ scope.row.userName }}({{ scope.row.userLoginName }})
-          </span>
-        </el-table-column>
-        <el-table-column
-          class-name="action-column"
-          label="操作"
-          width="140"
-          fixed="right"
-        >
-          <template slot-scope="scope">
-            <el-button
-              v-if="checkPrivilege('link', 'View')"
-              class="btn-primary"
-              type="text"
-              @click="toDetail(scope.row)"
-              >查看报告</el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
-      <div class="part-page">
-        <el-pagination
-          background
-          layout="total, sizes, prev, pager, next, jumper"
-          :pager-count="5"
-          :current-page="current"
-          :total="total"
-          :page-size="size"
-          @current-change="toPage"
-          @size-change="pageSizeChange"
-        >
-        </el-pagination>
-      </div>
-    </div>
-    <!-- TargetReportDetail -->
-    <target-report-detail
-      ref="TargetReportDetail"
-      :course="curRow"
-    ></target-report-detail>
-  </div>
-</template>
-
-<script>
-import { targetReportListPage } from "../api";
-import TargetReportDetail from "../components/TargetReportDetail.vue";
-
-export default {
-  name: "target-report-manage",
-  components: { TargetReportDetail },
-  data() {
-    return {
-      filter: {
-        semesterId: "",
-        examId: "",
-        courseId: "",
-      },
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      total: 0,
-      dataList: [],
-      curRow: {},
-    };
-  },
-  methods: {
-    async getList() {
-      if (!this.checkPrivilege("list", "list")) return;
-
-      const datas = {
-        ...this.filter,
-        pageNumber: this.current,
-        pageSize: this.size,
-      };
-      const data = await targetReportListPage(datas);
-      this.dataList = data.records;
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-    },
-    search() {
-      this.toPage(1);
-    },
-    toDetail(row) {
-      this.curRow = row;
-      this.$refs.TargetReportDetail.open();
-    },
-  },
-};
-</script>

+ 0 - 149
src/modules/course/views/TargetScoreManage.vue

@@ -1,149 +0,0 @@
-<template>
-  <div class="target-score-manage">
-    <div class="part-box part-box-filter part-box-flex">
-      <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
-        <template v-if="checkPrivilege('condition', 'condition')">
-          <el-form-item label="培养方案:">
-            <training-plan-select
-              v-model="filter.cultureProgramId"
-              placeholder="培养方案"
-              @change="trainingPlanChange"
-            ></training-plan-select>
-          </el-form-item>
-          <el-form-item label="学期:">
-            <semester-select
-              v-model="filter.semesterId"
-              placeholder="学期"
-            ></semester-select>
-          </el-form-item>
-          <el-form-item label="课程:">
-            <training-plan-course-select
-              v-model="filter.courseId"
-              placeholder="课程"
-              :professional-id="filter.professionalId"
-              :culture-program-id="filter.cultureProgramId"
-            ></training-plan-course-select>
-          </el-form-item>
-        </template>
-        <el-form-item label-width="0px">
-          <el-button
-            v-if="checkPrivilege('button', 'select')"
-            type="primary"
-            @click="search"
-            >查询</el-button
-          >
-        </el-form-item>
-      </el-form>
-    </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 label="课程(代码)">
-          <template slot-scope="scope">
-            {{ scope.row.courseName | defaultFieldFilter }}({{
-              scope.row.courseCode | defaultFieldFilter
-            }})
-          </template>
-        </el-table-column>
-        <el-table-column prop="userName" label="创建人">
-          <span slot-scope="scope">
-            {{ scope.row.userName }}({{ scope.row.userLoginName }})
-          </span>
-        </el-table-column>
-        <el-table-column
-          class-name="action-column"
-          label="操作"
-          width="100"
-          fixed="right"
-        >
-          <template slot-scope="scope">
-            <el-button
-              v-if="checkPrivilege('link', 'Score')"
-              class="btn-primary"
-              type="text"
-              @click="toDetail(scope.row)"
-              >管理成绩</el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
-      <div class="part-page">
-        <el-pagination
-          background
-          layout="total, sizes, prev, pager, next, jumper"
-          :pager-count="5"
-          :current-page="current"
-          :total="total"
-          :page-size="size"
-          @current-change="toPage"
-          @size-change="pageSizeChange"
-        >
-        </el-pagination>
-      </div>
-    </div>
-    <!-- TargetScoreDetail -->
-    <target-score-detail
-      ref="TargetScoreDetail"
-      :course="curRow"
-    ></target-score-detail>
-  </div>
-</template>
-
-<script>
-import { targetScoreListPage } from "../api";
-import TargetScoreDetail from "../components/score/TargetScoreDetail.vue";
-
-export default {
-  name: "target-score-manage",
-  components: { TargetScoreDetail },
-  data() {
-    return {
-      filter: {
-        semesterId: "",
-        professionalId: "",
-        cultureProgramId: "",
-        courseId: "",
-      },
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      total: 0,
-      dataList: [],
-      curRow: {},
-    };
-  },
-  methods: {
-    async getList() {
-      if (!this.checkPrivilege("list", "list")) return;
-
-      const datas = {
-        ...this.filter,
-        pageNumber: this.current,
-        pageSize: this.size,
-      };
-      const data = await targetScoreListPage(datas);
-      this.dataList = data.records;
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-    },
-    search() {
-      this.toPage(1);
-    },
-    trainingPlanChange(val) {
-      this.filter.professionalId = val?.professionalId;
-    },
-    toDetail(row) {
-      this.curRow = row;
-      this.$refs.TargetScoreDetail.open();
-    },
-  },
-};
-</script>

+ 0 - 119
src/modules/exam/components/WaitTaskAudit.vue

@@ -1,119 +0,0 @@
-<template>
-  <div class="wait-task-audit part-box part-box-pad part-box-border">
-    <div class="task-head part-box part-box-flex">
-      <h3>
-        审核待办(<span class="color-danger">{{ total }}</span
-        >)
-      </h3>
-      <div>
-        <i class="el-icon-s-fold"></i>
-      </div>
-    </div>
-    <div class="task-list">
-      <div v-for="task in tasks" :key="task.id" class="task-item">
-        <p>
-          <span>试卷编号:</span>
-          <span>{{ task.paperNumber }}</span>
-        </p>
-        <p>
-          <span>课程(代码):</span>
-          <span>{{ task.courseName }}({{ task.courseCode }})</span>
-        </p>
-        <p>
-          <span>命题结束时间:</span>
-          <span>{{ task.endTime | timestampFilter }}</span>
-        </p>
-        <p>
-          <span>命题老师:</span>
-          <span>{{ task.userName }}</span>
-        </p>
-        <p>
-          <span>提交时间:</span>
-          <span>{{ task.createTime | timestampFilter }}</span>
-        </p>
-        <div class="part-box-flex">
-          <el-tag :type="task.residueTips.status" effect="dark">
-            {{ task.residueTips.title }}
-          </el-tag>
-          <span class="task-action" @click="toDo(task)"
-            >立即处理 <i class="el-icon-arrow-right"></i
-          ></span>
-        </div>
-      </div>
-    </div>
-    <div class="text-center">
-      <el-pagination
-        background
-        layout="total, sizes, prev, pager, next, jumper"
-        :pager-count="5"
-        :current-page="current"
-        :total="total"
-        :page-size="size"
-        @current-change="toPage"
-        @size-change="pageSizeChange"
-      >
-      </el-pagination>
-    </div>
-
-    <!-- ModifyTaskApply -->
-    <modify-task-apply
-      ref="ModifyTaskApply"
-      :type="editType"
-      :row-data="curTask"
-      @modified="modified"
-    ></modify-task-apply>
-  </div>
-</template>
-
-<script>
-import ModifyTaskApply from "./taskApply/ModifyTaskApply.vue";
-import { waitTaskReviewListPage } from "../api";
-import { residueFloorTime } from "@/plugins/utils";
-import { TASK_WARNING_TIME } from "@/constants/enumerate";
-
-export default {
-  name: "wait-task-audit",
-  components: { ModifyTaskApply },
-  data() {
-    return {
-      total: 0,
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      tasks: [],
-      curTask: {},
-      editType: "AUDIT",
-    };
-  },
-  mounted() {
-    this.getList();
-  },
-  methods: {
-    async getList() {
-      const datas = {
-        pageNumber: this.current,
-        pageSize: this.size,
-      };
-      const data = await waitTaskReviewListPage(datas);
-      this.tasks = data.records.map((item) => {
-        item.residueTips = residueFloorTime(
-          item.endTime - item.systemCurrentTime,
-          TASK_WARNING_TIME
-        );
-        return item;
-      });
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-    },
-    toDo(task) {
-      this.curTask = { ...task, source: "REVIEW" };
-      this.$refs.ModifyTaskApply.open();
-    },
-    modified() {
-      this.$emit("update-list");
-    },
-  },
-};
-</script>

+ 0 - 111
src/modules/exam/components/WaitTaskExam.vue

@@ -1,111 +0,0 @@
-<template>
-  <div class="wait-task-exam part-box part-box-pad part-box-border">
-    <div class="task-head part-box part-box-flex">
-      <h3>
-        命题分配待办(<span class="color-danger">{{ total }}</span
-        >)
-      </h3>
-      <div>
-        <i class="el-icon-s-fold"></i>
-      </div>
-    </div>
-    <div class="task-list">
-      <div v-for="task in tasks" :key="task.id" class="task-item">
-        <p>
-          <span>试卷编号:</span>
-          <span>{{ task.paperNumber }}</span>
-        </p>
-        <p>
-          <span>课程(代码):</span>
-          <span>{{ task.courseName }}({{ task.courseCode }})</span>
-        </p>
-        <p>
-          <span>命题结束时间:</span>
-          <span>{{ task.endTime | timestampFilter }}</span>
-        </p>
-        <div class="part-box-flex">
-          <el-tag :type="task.residueTips.status" effect="dark">
-            {{ task.residueTips.title }}
-          </el-tag>
-          <span class="task-action" @click="toDo(task)"
-            >立即处理 <i class="el-icon-arrow-right"></i
-          ></span>
-        </div>
-      </div>
-    </div>
-    <div class="text-center">
-      <el-pagination
-        background
-        layout="total, sizes, prev, pager, next, jumper"
-        :pager-count="5"
-        :current-page="current"
-        :total="total"
-        :page-size="size"
-        @current-change="toPage"
-        @size-change="pageSizeChange"
-      >
-      </el-pagination>
-    </div>
-
-    <!-- ModifyExamTask -->
-    <modify-exam-task
-      ref="ModifyExamTask"
-      :instance="curTask"
-      :edit-type="editType"
-      @modified="modified"
-    ></modify-exam-task>
-  </div>
-</template>
-
-<script>
-import { waitExamTaskNewListPage } from "../api";
-import ModifyExamTask from "./ModifyExamTask";
-import { residueFloorTime } from "@/plugins/utils";
-import { TASK_WARNING_TIME } from "@/constants/enumerate";
-
-export default {
-  name: "wait-task-exam",
-  components: { ModifyExamTask },
-  data() {
-    return {
-      total: 0,
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      tasks: [],
-      curTask: {},
-      editType: "EDIT",
-    };
-  },
-  mounted() {
-    this.getList();
-  },
-  methods: {
-    async getList() {
-      const datas = {
-        pageNumber: this.current,
-        pageSize: this.size,
-      };
-      const data = await waitExamTaskNewListPage(datas);
-      this.tasks = data.records.map((item) => {
-        item.residueTips = residueFloorTime(
-          item.endTime - item.systemCurrentTime,
-          TASK_WARNING_TIME
-        );
-        return item;
-      });
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-    },
-    toDo(task) {
-      this.curTask = task;
-      this.$refs.ModifyExamTask.open();
-    },
-    modified() {
-      this.$emit("update-list");
-    },
-  },
-};
-</script>

+ 0 - 130
src/modules/exam/components/WaitTaskExamTask.vue

@@ -1,130 +0,0 @@
-<template>
-  <div class="wait-task-exam-task part-box part-box-pad part-box-border">
-    <div class="task-head part-box part-box-flex">
-      <h3>
-        命题待办(<span class="color-danger">{{ total }}</span
-        >)
-      </h3>
-      <div>
-        <i class="el-icon-s-fold"></i>
-      </div>
-    </div>
-    <div class="task-list">
-      <div v-for="task in tasks" :key="task.id" class="task-item">
-        <p>
-          <span>试卷编号:</span>
-          <span>{{ task.paperNumber }}</span>
-        </p>
-        <p>
-          <span>课程(代码):</span>
-          <span>{{ task.courseName }}({{ task.courseCode }})</span>
-        </p>
-        <p>
-          <span>命题结束时间:</span>
-          <span>{{ task.endTime | timestampFilter }}</span>
-        </p>
-        <div class="part-box-flex">
-          <el-tag :type="task.residueTips.status" effect="dark">
-            {{ task.residueTips.title }}
-          </el-tag>
-          <span class="task-action" @click="toDo(task)"
-            >立即处理 <i class="el-icon-arrow-right"></i
-          ></span>
-        </div>
-      </div>
-    </div>
-    <div class="text-center">
-      <el-pagination
-        v-if="tasks.length"
-        background
-        layout="total, sizes, prev, pager, next, jumper"
-        :pager-count="5"
-        :current-page="current"
-        :total="total"
-        :page-size="size"
-        @current-change="toPage"
-        @size-change="pageSizeChange"
-      >
-      </el-pagination>
-    </div>
-
-    <!-- ModifyTaskApply -->
-    <modify-task-apply
-      ref="ModifyTaskApply"
-      :type="editType"
-      :row-data="curTask"
-      @modified="modified"
-    ></modify-task-apply>
-  </div>
-</template>
-
-<script>
-import { waitExamTaskListPage } from "../api";
-import ModifyTaskApply from "./taskApply/ModifyTaskApply.vue";
-import { residueFloorTime } from "@/plugins/utils";
-import { TASK_WARNING_TIME } from "@/constants/enumerate";
-
-export default {
-  name: "wait-task-exam-task",
-  components: { ModifyTaskApply },
-  data() {
-    return {
-      total: 0,
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      tasks: [],
-      curTask: {},
-      editType: "APPLY",
-    };
-  },
-  mounted() {
-    this.initData();
-  },
-  methods: {
-    async initData() {
-      const cachePageInfo = this.$ls.get("cachePageInfo");
-      if (cachePageInfo) {
-        this.current = cachePageInfo.page;
-        await this.getList();
-
-        this.$nextTick(() => {
-          const curRow = this.tasks.find(
-            (item) => item.id === cachePageInfo.curRowId
-          );
-          if (!curRow) return;
-          this.toDo(curRow);
-        });
-      } else {
-        this.toPage(1);
-      }
-      this.$ls.remove("cachePageInfo");
-    },
-    async getList() {
-      const datas = {
-        pageNumber: this.current,
-        pageSize: this.size,
-      };
-      const data = await waitExamTaskListPage(datas);
-      this.tasks = data.records.map((item) => {
-        item.residueTips = residueFloorTime(
-          item.endTime - item.systemCurrentTime,
-          TASK_WARNING_TIME
-        );
-        return item;
-      });
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-    },
-    toDo(task) {
-      this.curTask = task;
-      this.$refs.ModifyTaskApply.open();
-    },
-    modified() {
-      this.$emit("update-list");
-    },
-  },
-};
-</script>

+ 7 - 9
src/modules/exam/components/taskApply/ModifyTaskApply.vue

@@ -38,10 +38,13 @@
 </template>
 
 <script>
-import { mapStates, mapMutations } from "vuex";
-import { examRuleDetail } from "../../base/api";
+import { mapState, mapMutations } from "vuex";
+import {
+  taskFlowApproverExchange,
+  taskFlowApprover,
+  examRuleDetail,
+} from "../../../base/api";
 import { taskApplyDetail, updateTaskApply } from "../../api";
-import { taskFlowApproverExchange, taskFlowApprover } from "../../base/api";
 import { COMMON_CARD_RULE_ID } from "@/constants/enumerate";
 
 import TaskInfo from "./TaskInfo.vue";
@@ -132,12 +135,7 @@ export default {
     },
   },
   computed: {
-    ...mapStates("exam", [
-      "editType",
-      "examTask",
-      "curTaskApply",
-      "taskStatus",
-    ]),
+    ...mapState("exam", ["editType", "examTask", "curTaskApply", "taskStatus"]),
     title() {
       // editType为主
       if (this.editType) {

+ 2 - 7
src/modules/exam/components/taskApply/TaskFlow.vue

@@ -228,7 +228,7 @@
 </template>
 
 <script>
-import { mapStates, mapMutations } from "vuex";
+import { mapState, mapMutations } from "vuex";
 import {
   taskFlowDetail,
   taskFlowNodeInfo,
@@ -309,12 +309,7 @@ export default {
     };
   },
   computed: {
-    ...mapStates("exam", [
-      "editType",
-      "examTask",
-      "curTaskApply",
-      "taskStatus",
-    ]),
+    ...mapState("exam", ["editType", "examTask", "curTaskApply", "taskStatus"]),
   },
   methods: {
     ...mapMutations("exam", ["setEditType", "setExamTask", "setCurTaskApply"]),

+ 3 - 3
src/modules/exam/components/taskApply/TaskInfo.vue

@@ -95,8 +95,8 @@
 </template>
 
 <script>
-import { mapStates } from "vuex";
-import { taskApplyExamObject } from "../api";
+import { mapState } from "vuex";
+import { taskApplyExamObject } from "../../api";
 import { parseTimeRangeDateAndTime } from "@/plugins/utils";
 
 export default {
@@ -110,7 +110,7 @@ export default {
     };
   },
   computed: {
-    ...mapStates("exam", ["editType", "examTask"]),
+    ...mapState("exam", ["editType", "examTask"]),
     IS_MODEL2() {
       return this.examTask.examModel === "MODEL2";
     },

+ 2 - 7
src/modules/exam/components/taskApply/TaskPaper.vue

@@ -387,7 +387,7 @@
 </template>
 
 <script>
-import { mapStates, mapMutations } from "vuex";
+import { mapState, mapMutations } from "vuex";
 
 import { cardForSelectList } from "../../api";
 import { attachmentPreview } from "../../../login/api";
@@ -439,12 +439,7 @@ export default {
     };
   },
   computed: {
-    ...mapStates("exam", [
-      "editType",
-      "examTask",
-      "curTaskApply",
-      "taskStatus",
-    ]),
+    ...mapState("exam", ["editType", "examTask", "curTaskApply", "taskStatus"]),
     IS_TIKU_TAB() {
       return this.curTab === "tiku";
     },

+ 0 - 6
src/modules/exam/router.js

@@ -1,6 +1,5 @@
 // exam
 import WaitTask from "./views/WaitTask.vue";
-import DoneTask from "./views/DoneTask.vue";
 import ExamTaskManage from "./views/ExamTaskManage.vue";
 import TaskApplyManage from "./views/TaskApplyManage.vue";
 import TaskReviewManage from "./views/TaskReviewManage.vue";
@@ -17,11 +16,6 @@ export default [
     name: "WaitTask",
     component: WaitTask,
   },
-  {
-    path: "/exam/done-task",
-    name: "DoneTask",
-    component: DoneTask,
-  },
   {
     path: "/exam/exam-task-manage",
     name: "ExamTaskManage",

+ 0 - 13
src/modules/exam/views/DoneTask.vue

@@ -1,13 +0,0 @@
-<template>
-  <div class="DoneTask">DoneTask</div>
-</template>
-
-<script>
-export default {
-  name: "DoneTask",
-  data() {
-    return {};
-  },
-  methods: {},
-};
-</script>

+ 0 - 37
src/modules/stmms/api.js

@@ -5,43 +5,6 @@ export const examStructureClassListPage = (datas) => {
   return $postParam("/api/admin/exam/structure/list_user_class", datas);
 };
 
-// upload structure
-export const examStructureListPage = (datas) => {
-  return $postParam("/api/admin/exam/structure/list", datas);
-};
-export const examStructureUpload = (datas) => {
-  return $post("/api/admin/exam/structure/upload", datas);
-};
-export const examStructureUploadAnswer = (datas) => {
-  return $post("/api/admin/exam/structure/upload_answer", datas);
-};
-export const examStructurePreviewStructure = (id) => {
-  return $postParam("/api/admin/exam/structure/preview_structure", { id });
-};
-export const examStructureFindJpg = (datas) => {
-  return $postParam("/api/admin/exam/structure/find_jpg_file", datas);
-};
-export const examStructureSubmit = (datas) => {
-  return $post("/api/admin/exam/structure/submit", datas);
-};
-export const updateObjectiveAnswer = (datas) => {
-  return $post("/api/admin/exam/structure/update_objective_answer", datas);
-};
-export const examBindMarkLeader = (datas) => {
-  return $post("/api/admin/exam/structure/bind_mark_leader", datas);
-};
-export const examBindMarker = (datas) => {
-  return $post("/api/admin/exam/structure/bind_marker", datas);
-};
-export const examTransferUser = (datas) => {
-  return $postParam("/api/admin/exam/structure/transfer", datas);
-};
-export const examSecretaryList = (datas = {}) => {
-  return $postParam("/api/admin/exam/structure/list_secretary", datas);
-};
-export const examStructureStatus = (id) => {
-  return $postParam("/api/admin/exam/structure/get_structure_status", { id });
-};
 // score-archive
 export const scoreListPage = (datas) => {
   return $postParam("/api/admin/sync/score/list", datas);

+ 0 - 104
src/modules/stmms/components/markParam/AnswerPopover.vue

@@ -1,104 +0,0 @@
-<template>
-  <el-popover
-    placement="left-start"
-    popper-class="answer-popover"
-    width="310"
-    trigger="hover"
-  >
-    <el-radio-group v-model="bAnswer" @change="bAnswerChange">
-      <el-radio v-for="item in radioList" :key="item.code" :label="item.code">{{
-        item.name
-      }}</el-radio>
-    </el-radio-group>
-    <div class="answer-divider"></div>
-    <el-checkbox-group v-model="oAnswer" @change="oAnswerChange">
-      <el-checkbox v-for="item in choiceList" :key="item" :label="item">{{
-        item
-      }}</el-checkbox>
-    </el-checkbox-group>
-    <el-button slot="reference" :type="answer ? 'primary' : 'default'" plain>{{
-      answerDisplay || "请设置答案"
-    }}</el-button>
-  </el-popover>
-</template>
-
-<script>
-const RADIO_LIST = [
-  {
-    name: "√",
-    code: "true",
-  },
-  {
-    name: "×",
-    code: "false",
-  },
-];
-const RADIOS = RADIO_LIST.map((item) => item.code);
-const RADIO_DICT = {};
-RADIO_LIST.forEach((item) => (RADIO_DICT[item.code] = item.name));
-
-export default {
-  name: "answer-popover",
-  props: {
-    value: {
-      type: String,
-    },
-  },
-  data() {
-    return {
-      answer: "",
-      oAnswer: [],
-      bAnswer: null,
-      choiceList: "abcdefghijklmnopqrstuvwxyz".toUpperCase().split(""),
-      radioList: RADIO_LIST,
-    };
-  },
-  watch: {
-    value: {
-      immediate: true,
-      handler(val) {
-        if (val === this.answer) return;
-
-        if (RADIOS.includes(val)) {
-          this.bAnswer = val;
-        } else {
-          this.oAnswer = val.split("");
-        }
-        this.updateAnswer();
-      },
-    },
-  },
-  computed: {
-    answerDisplay() {
-      if (this.bAnswer) {
-        return RADIO_DICT[this.bAnswer];
-      }
-      return [...this.oAnswer].sort((a, b) => (a < b ? -1 : 1)).join("");
-    },
-  },
-  methods: {
-    oAnswerChange(val) {
-      if (val) this.bAnswer = null;
-      this.updateAnswer();
-      this.emitChange();
-    },
-    bAnswerChange(val) {
-      if (val) this.oAnswer = [];
-      this.updateAnswer();
-      this.emitChange();
-    },
-    updateAnswer() {
-      if (this.bAnswer) {
-        this.answer = this.bAnswer;
-        return;
-      }
-      this.oAnswer.sort((a, b) => (a < b ? -1 : 1));
-      this.answer = this.oAnswer.join("");
-    },
-    emitChange() {
-      this.$emit("input", this.answer);
-      this.$emit("change", this.answer);
-    },
-  },
-};
-</script>

+ 0 - 432
src/modules/stmms/components/markParam/MarkPaperGroup.vue

@@ -1,432 +0,0 @@
-<template>
-  <div class="mark-paper-marker">
-    <div class="box-justify part-box part-box-pad">
-      <div>
-        <p class="tips-info">1.请点击右上角新增按钮创建评卷分组;</p>
-        <p class="tips-info">
-          2.如果采用整卷批阅,请将全部主观题选上,然后选择评卷老师。如果采用流水阅卷,请选择试题勾选对应的评卷老师;
-        </p>
-        <p class="tips-info tips-error">3.开始阅卷后不允许删除评卷分组!</p>
-      </div>
-      <div>
-        <mark-status field="group"></mark-status>
-        <el-button class="ml-2" type="primary" @click="toAdd">新增</el-button>
-      </div>
-    </div>
-
-    <div class="part-box part-box-pad">
-      <el-table :data="groupInfo" border>
-        <el-table-column type="index" width="50"> </el-table-column>
-        <el-table-column label="评卷员">
-          <template slot-scope="scope">
-            <el-tag
-              v-for="user in scope.row.markerList"
-              :key="user.id"
-              class="tag-spin"
-              size="medium"
-            >
-              {{ user.name }}({{ user.orgName }})
-            </el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column label="评卷方式">
-          <template slot-scope="scope">
-            <el-radio-group v-model="scope.row.doubleRate">
-              <el-radio
-                v-for="(val, key) in MARK_TYPE"
-                :key="key"
-                :label="key * 1"
-                >{{ val }}</el-radio
-              >
-            </el-radio-group>
-            <span v-if="scope.row.doubleRate === 1">
-              仲裁阀值:<el-input-number
-                v-model="scope.row.arbitrateThreshold"
-                class="width-80"
-                size="small"
-                :min="0"
-                :max="999999"
-                :step="0.01"
-                step-strictly
-                :controls="false"
-              >
-              </el-input-number>
-            </span>
-          </template>
-        </el-table-column>
-        <el-table-column label="评阅题目">
-          <template slot-scope="scope">
-            {{ scope.row.questions | questionsFilter }}
-          </template>
-        </el-table-column>
-        <el-table-column label="评卷区" width="80" align="center">
-          <template slot-scope="scope">
-            <i
-              v-if="scope.row.pictureConfigList.length"
-              class="el-icon-success color-success"
-            ></i>
-          </template>
-        </el-table-column>
-        <el-table-column class-name="action-column" label="操作" width="160px">
-          <template slot-scope="scope">
-            <el-button
-              class="btn-primary"
-              type="text"
-              @click="toEdit(scope.row)"
-              >编辑</el-button
-            >
-            <el-button
-              class="btn-primary"
-              type="text"
-              :disabled="!paperList.length"
-              @click="toSetArea(scope.row)"
-              >评卷区</el-button
-            >
-            <el-button
-              class="btn-danger"
-              type="text"
-              @click="toDelete(scope.row)"
-              >删除</el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
-    </div>
-    <mark-paper-class
-      v-if="
-        checkPrivilege('button', 'OpenClassReading', 'UploadStructure') &&
-        dataReady
-      "
-      ref="MarkPaperClass"
-      :datas="{
-        groupInfo,
-        classInfo: datas.classInfo,
-        basicPaperInfo: datas.basicPaperInfo,
-      }"
-    ></mark-paper-class>
-
-    <!-- ModifyMarkerQuestion -->
-    <modify-marker-question
-      ref="ModifyMarkerQuestion"
-      :course-id="datas.basicPaperInfo.courseId"
-      :instance="curGroupInfo"
-      :disabled-question-ids="disabledQuestionIds"
-      :paper-structure="subjectiveQuestionList"
-      @modified="groupModified"
-    ></modify-marker-question>
-    <!-- ModifyMarkArea -->
-    <modify-mark-area
-      ref="ModifyMarkArea"
-      :base-info="datas.basicPaperInfo"
-      :group="curGroupInfo"
-      :paper-list="paperList"
-      @modified="areaModified"
-    ></modify-mark-area>
-  </div>
-</template>
-
-<script>
-import MarkStatus from "./MarkStatus.vue";
-import ModifyMarkerQuestion from "./ModifyMarkerQuestion.vue";
-import ModifyMarkArea from "./ModifyMarkArea.vue";
-import markPaperClass from "./markPaperClass.vue";
-import { examStructureFindJpg } from "../../api";
-import { cardDetail } from "../../../card/api";
-
-export default {
-  name: "mark-paper-group",
-  components: {
-    ModifyMarkerQuestion,
-    ModifyMarkArea,
-    MarkStatus,
-    markPaperClass,
-  },
-  props: {
-    datas: {
-      type: Object,
-      default() {
-        return {
-          basicPaperInfo: {},
-          paperStructureInfo: [],
-          groupInfo: [],
-          classInfo: [],
-        };
-      },
-    },
-  },
-  data() {
-    return {
-      questionCount: 0,
-      groupQuestionCount: 0,
-      groupInfo: [],
-      disabledQuestionIds: [],
-      curGroupInfo: {},
-      subjectiveQuestionList: [],
-      subjectiveQuestionCount: 0,
-      objectiveQuestionCount: 0,
-      MARK_TYPE: {
-        0: "单评",
-        1: "双评",
-      },
-      paperList: [],
-      cardPages: [],
-      dataReady: false,
-    };
-  },
-  filters: {
-    questionsFilter(val) {
-      return val
-        .map((item) => `${item.mainNumber}-${item.subNumber}`)
-        .join(",");
-    },
-  },
-  mounted() {
-    this.initData();
-    this.getPaperList();
-    this.getCardPages();
-  },
-  methods: {
-    async getPaperList() {
-      this.paperList = [];
-      const data = await examStructureFindJpg({
-        examId: this.datas.basicPaperInfo.examId,
-        courseId: this.datas.basicPaperInfo.courseId,
-        paperNumber: this.datas.basicPaperInfo.paperNumber,
-        paperType: this.datas.basicPaperInfo.paperType,
-      });
-      const papers = data || [];
-      papers.sort((a, b) => a.index - b.index);
-      this.paperList = papers.map((paper) => {
-        return {
-          imgUrl: paper.path,
-          areas: [],
-        };
-      });
-    },
-    async getCardPages() {
-      const detData = await cardDetail(this.datas.basicPaperInfo.cardId);
-      const cardContent = JSON.parse(detData.content);
-      this.cardPages = cardContent.pages;
-    },
-    initData() {
-      this.groupInfo = this.datas.groupInfo.map((item, index) => {
-        return { ...item, groupNumber: index + 1 };
-      });
-      this.questionCount = this.datas.paperStructureInfo.length;
-      this.updateDisableQuestionIds();
-
-      this.subjectiveQuestionList = this.datas.paperStructureInfo.filter(
-        (item) => item.qType === "subjective"
-      );
-      this.subjectiveQuestionCount = this.subjectiveQuestionList.length;
-      this.objectiveQuestionCount =
-        this.questionCount - this.subjectiveQuestionCount;
-
-      this.dataReady = true;
-      this.$emit("on-ready");
-    },
-    updateDisableQuestionIds(filterId) {
-      let groupInfo = this.groupInfo;
-      if (filterId)
-        groupInfo = this.groupInfo.filter((item) => item.id !== filterId);
-      let disabledQuestionIds = [];
-      groupInfo.forEach((item) => {
-        disabledQuestionIds = [
-          ...disabledQuestionIds,
-          ...item.questions.map((item) => item.id),
-        ];
-      });
-      this.disabledQuestionIds = disabledQuestionIds;
-      if (!filterId) this.groupQuestionCount = disabledQuestionIds.length;
-    },
-    updateGroupNumber() {
-      this.groupInfo.forEach((group, index) => {
-        group.groupNumber = index + 1;
-      });
-    },
-    toAdd() {
-      this.updateDisableQuestionIds();
-      if (this.groupQuestionCount === this.subjectiveQuestionCount) {
-        this.$message.error("当前已经没有主观题目可供设置!");
-        return;
-      }
-
-      this.curGroupInfo = {
-        id: this.$randomCode(),
-        groupNumber: null,
-        markerList: [],
-        doubleRate: 0,
-        arbitrateThreshold: 1,
-        questions: [],
-        pictureConfigList: [],
-      };
-      this.$refs.ModifyMarkerQuestion.open();
-    },
-    toEdit(row) {
-      this.curGroupInfo = row;
-      this.updateDisableQuestionIds(row.id);
-      this.$refs.ModifyMarkerQuestion.open();
-    },
-    toSetArea(row) {
-      this.curGroupInfo = row;
-      this.$refs.ModifyMarkArea.open();
-    },
-    toDelete(row) {
-      const pos = this.groupInfo.findIndex((item) => item.id === row.id);
-      this.groupInfo.splice(pos, 1);
-      this.updateDisableQuestionIds();
-      this.updateGroupNumber();
-    },
-    groupModified(row) {
-      const pos = this.groupInfo.findIndex((item) => item.id === row.id);
-      if (!row.pictureConfigList.length) {
-        row.pictureConfigList = this.autoParsePictureConfigList(row.questions);
-      }
-
-      if (pos === -1) {
-        this.groupInfo.push(row);
-      } else {
-        this.groupInfo.splice(pos, 1, row);
-      }
-      this.updateDisableQuestionIds();
-      this.updateGroupNumber();
-
-      // 分班阅卷相关
-      this.$refs.MarkPaperClass && this.$refs.MarkPaperClass.groupChange();
-    },
-    autoParsePictureConfigList(questions) {
-      if (!questions.length) return [];
-      let pictureConfigList = [];
-      const structs = questions.map(
-        (item) => `${item.mainNumber}_${item.subNumber}`
-      );
-      this.cardPages.forEach((page, pindex) => {
-        page.exchange.answer_area.forEach((area) => {
-          const [x, y, w, h] = area.area;
-          const qStruct = `${area.main_number}_${area.sub_number}`;
-
-          const pConfig = {
-            i: pindex + 1,
-            x,
-            y,
-            w,
-            h,
-            qStruct,
-          };
-
-          if (typeof area.sub_number === "number") {
-            if (!structs.includes(qStruct)) return;
-            pictureConfigList.push(pConfig);
-            return;
-          }
-          // 复合区域处理,比如填空题,多个小题合并为一个区域
-          if (typeof area.sub_number === "string") {
-            const areaStructs = area.sub_number
-              .split(",")
-              .map((subNumber) => `${area.main_number}_${subNumber}`);
-            if (
-              structs.some((struct) => areaStructs.includes(struct)) &&
-              !pictureConfigList.find((item) => item.qStruct === qStruct)
-            ) {
-              pictureConfigList.push(pConfig);
-            }
-          }
-        });
-      });
-      pictureConfigList.forEach((item) => {
-        delete item.qStruct;
-      });
-
-      // 合并相邻区域
-      pictureConfigList.sort((a, b) => {
-        return a.i - b.i || a.x - b.x || a.y - b.y;
-      });
-      let combinePictureConfigList = [];
-      let prevConfig = null;
-      pictureConfigList.forEach((item, index) => {
-        if (!index) {
-          prevConfig = { ...item };
-          combinePictureConfigList.push(prevConfig);
-          return;
-        }
-
-        if (
-          prevConfig.i === item.i &&
-          prevConfig.y + prevConfig.h >= item.y &&
-          prevConfig.w === item.w &&
-          prevConfig.x === item.x
-        ) {
-          prevConfig.h = item.y + item.h - prevConfig.y;
-        } else {
-          prevConfig = { ...item };
-          combinePictureConfigList.push(prevConfig);
-        }
-      });
-      // console.log(combinePictureConfigList);
-      // 自动扩展区域。
-      let scaleRate = 0.002;
-      combinePictureConfigList = combinePictureConfigList.map((item) => {
-        return {
-          i: item.i,
-          x: item.x - scaleRate,
-          y: item.y - scaleRate,
-          w: item.w + 2 * scaleRate,
-          h: item.h + 2 * scaleRate,
-        };
-      });
-
-      return combinePictureConfigList;
-    },
-    areaModified(row) {
-      const pos = this.groupInfo.findIndex((item) => item.id === row.id);
-      if (pos === -1) return;
-      this.groupInfo.splice(pos, 1, row);
-    },
-    checkData() {
-      let errorMessages = [];
-
-      if (this.subjectiveQuestionCount > this.groupQuestionCount) {
-        errorMessages.push("当前还有题目未设置分组");
-      }
-
-      this.groupInfo.forEach((item, index) => {
-        if (item.doubleRate === 1 && !item.arbitrateThreshold) {
-          errorMessages.push(`序号${index + 1}设置中,仲裁阀值不能为空`);
-        }
-      });
-
-      // if (this.$refs.MarkPaperClass) {
-      //   errorMessages.push(...this.$refs.MarkPaperClass.checkData());
-      // }
-
-      if (errorMessages.length) {
-        this.$message.error(errorMessages.join("。"));
-        return;
-      }
-
-      this.updateData();
-      this.$emit("next-step");
-    },
-    getData() {
-      let data = {
-        groupInfo: this.groupInfo.map((item) => {
-          return { ...item };
-        }),
-      };
-
-      if (this.$refs.MarkPaperClass) {
-        const { openClassReading, classInfo } =
-          this.$refs.MarkPaperClass.getData();
-        data.classInfo = classInfo;
-        data.basicPaperInfo = Object.assign(this.datas.basicPaperInfo, {
-          openClassReading,
-        });
-      }
-      return data;
-    },
-    updateData() {
-      this.$emit("data-change", this.getData());
-    },
-  },
-};
-</script>

+ 0 - 462
src/modules/stmms/components/markParam/MarkPaperStructure.vue

@@ -1,462 +0,0 @@
-<template>
-  <div class="mark-paper-structure">
-    <div class="box-justify part-box part-box-pad">
-      <div>
-        <p class="tips-info">
-          1.请确认展示的试卷结构与提交的试卷、答题卡是否一致?
-        </p>
-        <p class="tips-info">2.请补充所有题目的小题分值,并确认试卷总分!</p>
-        <p class="tips-info tips-error">
-          3.开始阅卷后不允许修改试卷结构,请确认清楚后再提交!
-        </p>
-      </div>
-      <div>
-        <mark-status field="structure"></mark-status>
-      </div>
-    </div>
-
-    <div class="part-box part-box-pad mb-0">
-      <el-table
-        ref="TableList"
-        :data="tableData"
-        border
-        :row-class-name="getRowClassName"
-      >
-        <el-table-column width="50" align="center">
-          <template slot-scope="scope" v-if="scope.row.mainFirstSub">
-            <div
-              :class="[
-                'expand-btn',
-                { 'expand-btn-unexpand': !scope.row.expandSub },
-              ]"
-              @click="switchExpandSub(scope.row)"
-            >
-              <i
-                :class="scope.row.expandSub ? 'el-icon-minus' : 'el-icon-plus'"
-              ></i>
-            </div>
-          </template>
-        </el-table-column>
-        <template v-if="structureCanEdit">
-          <el-table-column prop="mainTitle" label="大题名称">
-            <span slot-scope="scope" v-if="scope.row.mainFirstSub">
-              <el-input
-                v-model.trim="scope.row.mainTitle"
-                size="small"
-                :maxlength="32"
-                clearable
-                @change="mainTitleChange(scope.row)"
-              ></el-input>
-            </span>
-          </el-table-column>
-          <el-table-column prop="type" label="题型" width="120">
-            <template slot-scope="scope" v-if="scope.row.mainFirstSub">
-              <el-select
-                v-model="scope.row.type"
-                placeholder="请选择"
-                class="width-full"
-                @change="qTypeChange(scope.row)"
-              >
-                <el-option
-                  v-for="item in QUESTION_TYPE_LIST"
-                  :key="item.code"
-                  :value="item.code"
-                  :label="item.name"
-                >
-                </el-option>
-              </el-select>
-            </template>
-          </el-table-column>
-          <el-table-column label="选项个数" width="100">
-            <template
-              slot-scope="scope"
-              v-if="scope.row.type <= 2 && scope.row.mainFirstSub"
-            >
-              <el-input-number
-                v-model="scope.row.optionCount"
-                class="width-full"
-                size="small"
-                :min="2"
-                :max="26"
-                :step="1"
-                step-strictly
-                :controls="false"
-                @change="optionCountChange(scope.row)"
-              ></el-input-number>
-            </template>
-          </el-table-column>
-        </template>
-        <template v-else>
-          <el-table-column prop="mainTitle" label="大题名称">
-            <span slot-scope="scope" v-if="scope.row.mainFirstSub">
-              {{ scope.row.mainTitle }}
-            </span>
-          </el-table-column>
-          <el-table-column prop="typeName" label="题型" width="120">
-            <template slot-scope="scope" v-if="scope.row.mainFirstSub">
-              {{ scope.row.typeName }}
-            </template>
-          </el-table-column>
-        </template>
-        <el-table-column label="每题分值" width="100">
-          <template slot-scope="scope" v-if="scope.row.mainFirstSub">
-            <el-input-number
-              v-model="scoresPerTopic[scope.row.mainId]"
-              class="width-full"
-              size="small"
-              :min="0.5"
-              :max="500"
-              :step="0.5"
-              step-strictly
-              :controls="false"
-              @change="(val) => scorePerTopicChange(val, scope.row)"
-            ></el-input-number>
-          </template>
-        </el-table-column>
-        <el-table-column prop="mainNumber" label="大题号" width="80">
-          <template slot-scope="scope" v-if="scope.row.mainFirstSub">
-            <span>{{ scope.row.mainNumber }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column
-          prop="subNumber"
-          label="小题号"
-          width="80"
-        ></el-table-column>
-        <el-table-column prop="totalScore" label="小题满分" width="105">
-          <template slot-scope="scope">
-            <el-input-number
-              v-model="scope.row.totalScore"
-              class="width-80"
-              size="small"
-              :min="0.5"
-              :max="500"
-              :step="0.5"
-              step-strictly
-              :controls="false"
-            ></el-input-number>
-          </template>
-        </el-table-column>
-        <el-table-column
-          v-if="structureCanEdit"
-          class-name="action-column"
-          label="操作"
-          width="200px"
-        >
-          <template slot-scope="scope">
-            <el-button
-              class="btn-primary"
-              type="text"
-              @click="toAddMain(scope.row)"
-              >新增大题</el-button
-            >
-            <el-button
-              class="btn-primary"
-              type="text"
-              @click="toAddSub(scope.row)"
-              >新增小题</el-button
-            >
-            <el-button
-              :disabled="tableData.length <= 1"
-              class="btn-danger"
-              type="text"
-              @click="toDeleteSub(scope.row)"
-              >删除</el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
-    </div>
-    <div class="total-info">
-      试卷总分:<span>{{ paperTotalScore }}</span
-      >分
-    </div>
-  </div>
-</template>
-
-<script>
-import { calcSum } from "@/plugins/utils";
-import { QUESTION_TYPE_LIST } from "@/constants/enumerate";
-import MarkStatus from "./MarkStatus.vue";
-
-export default {
-  name: "mark-paper-structure",
-  components: { MarkStatus },
-  props: {
-    datas: {
-      type: Object,
-      default() {
-        return {
-          structureCanEdit: true,
-          basicPaperInfo: {},
-          paperStructureInfo: [],
-          groupInfo: [],
-        };
-      },
-    },
-  },
-  data() {
-    return {
-      tableData: [],
-      QUESTION_TYPE_LIST,
-      Q_TYPE: {
-        objective: "客观题",
-        subjective: "主观题",
-      },
-      scoresPerTopic: {},
-    };
-  },
-  computed: {
-    paperTotalScore() {
-      return calcSum(this.tableData.map((item) => item.totalScore || 0));
-    },
-    structureCanEdit() {
-      return !!this.datas.structureCanEdit;
-    },
-  },
-  mounted() {
-    this.initData();
-  },
-  methods: {
-    initData() {
-      let curMainId = null;
-      let scoresPerTopic = {};
-      this.tableData = this.datas.paperStructureInfo.map((item) => {
-        if (curMainId !== item.mainId) {
-          curMainId = item.mainId;
-          scoresPerTopic[curMainId] = undefined;
-        }
-        return { ...item };
-      });
-      this.scoresPerTopic = scoresPerTopic;
-
-      if (!this.tableData.length && this.structureCanEdit) {
-        this.createMain();
-      }
-
-      this.$emit("on-ready");
-    },
-    createMain() {
-      this.tableData.push({
-        id: this.$randomCode(),
-        qType: "objective",
-        mainId: this.$randomCode(),
-        mainTitle: "",
-        mainNumber: 1,
-        subNumber: 1,
-        type: null,
-        typeName: "",
-        optionCount: undefined,
-        totalScore: undefined,
-        mainFirstSub: true,
-        expandSub: true,
-      });
-    },
-    getRowClassName({ row }) {
-      let classNames = [];
-      if (row.mainFirstSub) {
-        classNames.push("row-main-first-sub");
-      }
-      if (!row.mainFirstSub && !row.expandSub) {
-        classNames.push("row-unexpand-sub");
-      }
-      return classNames.join(" ");
-    },
-    getNextMainStartPos(startPos, curMainId) {
-      let nextMainStartPos = null;
-      for (let i = startPos, len = this.tableData.length; i < len; i++) {
-        const element = this.tableData[i];
-        if (element.mainId !== curMainId) {
-          nextMainStartPos = i;
-          return nextMainStartPos;
-        }
-      }
-      if (nextMainStartPos === null) return this.tableData.length;
-    },
-    toAddMain(row) {
-      const startPos = this.tableData.findIndex((item) => item.id === row.id);
-      let nextMainStartPos = this.getNextMainStartPos(startPos, row.mainId);
-      this.tableData.splice(nextMainStartPos, 0, {
-        id: this.$randomCode(),
-        qType: row.qType,
-        mainId: this.$randomCode(),
-        mainTitle: "",
-        mainNumber: row.mainNumber + 1,
-        subNumber: 1,
-        type: null,
-        typeName: "",
-        optionCount: undefined,
-        totalScore: row.totalScore,
-        mainFirstSub: true,
-        expandSub: true,
-      });
-      this.updateMainData();
-    },
-    updateMainData() {
-      let curMainNumber = 0,
-        curMainId = null;
-      this.tableData.forEach((item) => {
-        if (item.mainId !== curMainId) {
-          curMainId = item.mainId;
-          curMainNumber++;
-        }
-        item.mainNumber = curMainNumber;
-      });
-    },
-    toAddSub(row) {
-      const subPos = this.tableData.findIndex((item) => item.id === row.id);
-      this.tableData.splice(subPos + 1, 0, {
-        id: this.$randomCode(),
-        qType: row.qType,
-        mainId: row.mainId,
-        mainTitle: row.mainTitle,
-        mainNumber: row.mainNumber,
-        subNumber: row.subNumber + 1,
-        type: row.type,
-        typeName: row.typeName,
-        optionCount: row.optionCount,
-        totalScore: row.totalScore,
-        mainFirstSub: false,
-        expandSub: row.expandSub,
-      });
-      this.updateSubData(row.mainId);
-    },
-    updateSubData(mainId) {
-      this.tableData
-        .filter((item) => item.mainId === mainId)
-        .forEach((item, index) => {
-          item.subNumber = index + 1;
-        });
-    },
-    toDeleteSub(row) {
-      const subPos = this.tableData.findIndex((item) => item.id === row.id);
-      this.tableData.splice(subPos, 1);
-
-      this.tableData
-        .filter((item) => item.mainId === row.mainId)
-        .forEach((item, index) => {
-          item.mainFirstSub = !index;
-        });
-      this.updateSubData(row.mainId);
-      this.updateMainData();
-    },
-    switchExpandSub(row) {
-      row.expandSub = !row.expandSub;
-      this.tableData
-        .filter((item) => item.mainId === row.mainId && !item.mainFirstSub)
-        .forEach((item) => (item.expandSub = row.expandSub));
-    },
-    mainTitleChange(row) {
-      this.tableData
-        .filter((item) => item.mainId === row.mainId && !item.mainFirstSub)
-        .forEach((item) => (item.mainTitle = row.mainTitle));
-    },
-    qTypeChange(row) {
-      const curQt = this.QUESTION_TYPE_LIST.find(
-        (item) => item.code === row.type
-      );
-      if (!curQt) return;
-
-      this.tableData
-        .filter((item) => item.mainId === row.mainId)
-        .forEach((item) => {
-          item.type = curQt.code;
-          item.typeName = curQt.name;
-          item.qType = curQt.qType;
-          item.optionCount = curQt.optionCount;
-        });
-    },
-    optionCountChange(row) {
-      if (!row.optionCount) return;
-
-      this.tableData
-        .filter((item) => item.mainId === row.mainId && !item.mainFirstSub)
-        .forEach((item) => {
-          item.optionCount = row.optionCount;
-        });
-    },
-    scorePerTopicChange(val, row) {
-      if (!val) return;
-      this.tableData
-        .filter((item) => item.mainId === row.mainId)
-        .forEach((item) => (item.totalScore = val));
-    },
-    checkData() {
-      // if (
-      //   this.tableData.some(item => item.qType === "objective") &&
-      //   this.tableData[0].qType !== "objective"
-      // ) {
-      //   this.$message.error("请保持客观题在前,主观题在后!");
-      //   return;
-      // }
-
-      // const objectiveNos = this.tableData
-      //   .filter(item => item.mainFirstSub && item.qType === "objective")
-      //   .map(item => item.mainNumber);
-      // const unValid = objectiveNos.some(
-      //   (no, index) => objectiveNos[0] + index !== no
-      // );
-      // if (unValid) {
-      //   this.$message.error("请保持主客观题题号连续");
-      //   return;
-      // }
-
-      let errorMessages = [];
-      this.tableData.forEach((item) => {
-        let errorMsg = ``;
-        if (item.mainFirstSub) {
-          let errorFields = [];
-          if (!item.mainTitle) {
-            errorFields.push("大题名称");
-          }
-          if (!item.mainNumber) {
-            errorFields.push("大题号");
-          }
-          if (!item.optionCount && item.type <= 2) {
-            errorFields.push("选项个数");
-          }
-          if (errorFields.length) {
-            errorMsg += `${errorFields.join("、")}不能为空,`;
-          }
-        }
-
-        let errorFields = [];
-        if (!item.subNumber) {
-          errorFields.push("小题号");
-        }
-        if (!item.totalScore) {
-          errorFields.push("小题满分");
-        }
-        if (errorFields.length) {
-          errorMsg += `第${item.subNumber}小题,${errorFields.join(
-            "、"
-          )}不能为空,`;
-        }
-
-        if (errorMsg) {
-          errorMsg = `第${item.mainNumber}大题,${errorMsg}`;
-          errorMessages.push(errorMsg);
-        }
-      });
-
-      if (errorMessages.length) {
-        this.$message.error(errorMessages.join("。"));
-        return;
-      }
-
-      this.updateData();
-      this.$emit("next-step");
-    },
-    getData() {
-      return this.tableData.map((item) => {
-        return { ...item };
-      });
-    },
-    updateData() {
-      this.$emit("data-change", {
-        paperStructureInfo: this.getData(),
-      });
-    },
-  },
-};
-</script>

+ 0 - 240
src/modules/stmms/components/markParam/MarkParamMarker.vue

@@ -1,240 +0,0 @@
-<template>
-  <div class="mark-paper-marker">
-    <div class="mark-body">
-      <div class="box-justify part-box part-box-pad">
-        <div>
-          <p class="tips-info">
-            1.评卷过程中需要增加评卷员,可以在需要增加分组下绑定评卷员
-          </p>
-        </div>
-        <div>
-          <mark-status field="marker"></mark-status>
-        </div>
-      </div>
-
-      <div class="part-box part-box-pad">
-        <el-table :data="groupInfo" border>
-          <el-table-column type="index" width="50"> </el-table-column>
-          <el-table-column label="评卷员">
-            <template slot-scope="scope">
-              <el-tag
-                v-for="user in scope.row.markerList"
-                :key="user.id"
-                class="tag-spin"
-                size="medium"
-              >
-                {{ user.name }}({{ user.orgName }})
-              </el-tag>
-            </template>
-          </el-table-column>
-          <el-table-column label="评阅题目">
-            <template slot-scope="scope">
-              {{ scope.row.questions | questionsFilter }}
-            </template>
-          </el-table-column>
-          <el-table-column
-            class-name="action-column"
-            label="操作"
-            width="160px"
-          >
-            <template slot-scope="scope">
-              <el-button
-                class="btn-primary"
-                type="text"
-                @click="toEdit(scope.row)"
-                >编辑</el-button
-              >
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-
-      <mark-paper-class
-        v-if="
-          checkPrivilege('button', 'OpenClassReading', 'UploadStructure') &&
-          dataReady
-        "
-        ref="MarkPaperClass"
-        :datas="{
-          groupInfo,
-          classInfo: markParamInfos.classInfo,
-          basicPaperInfo: markParamInfos.basicPaperInfo,
-        }"
-      ></mark-paper-class>
-    </div>
-
-    <div class="text-center mt-2">
-      <el-button type="primary" :disabled="loading" @click="submit"
-        >提交</el-button
-      >
-      <el-button @click="cancel">取消</el-button>
-    </div>
-
-    <!-- ModifyMarkerQuestion -->
-    <modify-marker-question
-      ref="ModifyMarkerQuestion"
-      :course-id="markParamInfos.basicPaperInfo.courseId"
-      :instance="curGroupInfo"
-      :disabled-question-ids="disabledQuestionIds"
-      :paper-structure="subjectiveQuestionList"
-      :can-select-question="false"
-      @modified="groupModified"
-    ></modify-marker-question>
-  </div>
-</template>
-
-<script>
-import { mapState, mapMutations } from "vuex";
-import ModifyMarkerQuestion from "./ModifyMarkerQuestion";
-import MarkStatus from "./MarkStatus.vue";
-import markPaperClass from "./markPaperClass.vue";
-import { examBindMarker } from "../../api";
-
-export default {
-  name: "mark-paper-marker",
-  components: { ModifyMarkerQuestion, MarkStatus, markPaperClass },
-  data() {
-    return {
-      questionCount: 0,
-      groupQuestionCount: 0,
-      groupInfo: [],
-      disabledQuestionIds: [],
-      curGroupInfo: {},
-      subjectiveQuestionList: [],
-      subjectiveQuestionCount: 0,
-      objectiveQuestionCount: 0,
-      MARK_TYPE: {
-        0: "单评",
-        1: "双评",
-      },
-      paperList: [],
-      cardPages: [],
-      loading: false,
-      dataReady: false,
-    };
-  },
-  filters: {
-    questionsFilter(val) {
-      return val
-        .map((item) => `${item.mainNumber}-${item.subNumber}`)
-        .join(",");
-    },
-  },
-  computed: {
-    ...mapState("markParam", ["markParamInfos"]),
-  },
-  mounted() {
-    this.initData();
-  },
-  methods: {
-    ...mapMutations("markParam", ["setMarkParamInfos"]),
-    initData() {
-      this.groupInfo = this.markParamInfos.groupInfo.map((item, index) => {
-        return { ...item, groupNumber: index + 1 };
-      });
-      this.questionCount = this.markParamInfos.paperStructureInfo.length;
-      this.updateDisableQuestionIds();
-
-      this.subjectiveQuestionList =
-        this.markParamInfos.paperStructureInfo.filter(
-          (item) => item.qType === "subjective"
-        );
-      this.subjectiveQuestionCount = this.subjectiveQuestionList.length;
-      this.objectiveQuestionCount =
-        this.questionCount - this.subjectiveQuestionCount;
-      this.dataReady = true;
-    },
-    updateDisableQuestionIds(filterId) {
-      let groupInfo = this.groupInfo;
-      if (filterId)
-        groupInfo = this.groupInfo.filter((item) => item.id !== filterId);
-      let disabledQuestionIds = [];
-      groupInfo.forEach((item) => {
-        disabledQuestionIds = [
-          ...disabledQuestionIds,
-          ...item.questions.map((item) => item.id),
-        ];
-      });
-      this.disabledQuestionIds = disabledQuestionIds;
-      if (!filterId) this.groupQuestionCount = disabledQuestionIds.length;
-    },
-    updateGroupNumber() {
-      this.groupInfo.forEach((group, index) => {
-        group.groupNumber = index + 1;
-      });
-    },
-    toEdit(row) {
-      this.curGroupInfo = row;
-      this.updateDisableQuestionIds(row.id);
-      this.$refs.ModifyMarkerQuestion.open();
-    },
-    async groupModified(row) {
-      const pos = this.groupInfo.findIndex((item) => item.id === row.id);
-      if (pos === -1) return;
-      this.groupInfo.splice(pos, 1, row);
-
-      this.updateDisableQuestionIds();
-      this.updateGroupNumber();
-
-      // 分班阅卷相关
-      this.$refs.MarkPaperClass && this.$refs.MarkPaperClass.groupChange();
-    },
-    async submit() {
-      if (!this.checkData()) return;
-
-      if (this.loading) return;
-      this.loading = true;
-
-      let datas = {
-        paperStructureId: this.markParamInfos.basicPaperInfo.id,
-        groupInfo: this.groupInfo,
-      };
-      if (this.$refs.MarkPaperClass) {
-        const { openClassReading, classInfo } =
-          this.$refs.MarkPaperClass.getData();
-        datas.classInfo = classInfo;
-        datas.openClassReading = openClassReading;
-      }
-      const res = await examBindMarker(datas).catch(() => {});
-      this.loading = false;
-      if (!res) return;
-
-      let ndata = {
-        groupInfo: this.groupInfo,
-      };
-      if (datas["classInfo"]) {
-        ndata.classInfo = datas.classInfo;
-        ndata.basicPaperInfo = Object.assign(
-          this.markParamInfos.basicPaperInfo,
-          {
-            openClassReading: datas.openClassReading,
-          }
-        );
-      }
-      this.setMarkParamInfos(ndata);
-      this.$message.success("提交成功!");
-      this.$emit("confirm");
-    },
-    checkData() {
-      let errorMessages = [];
-
-      if (this.subjectiveQuestionCount > this.groupQuestionCount) {
-        errorMessages.push("当前还有题目未设置评卷员");
-      }
-
-      // if (this.$refs.MarkPaperClass) {
-      //   errorMessages.push(...this.$refs.MarkPaperClass.checkData());
-      // }
-      if (errorMessages.length) {
-        this.$message.error(errorMessages.join("。"));
-        return;
-      }
-
-      return true;
-    },
-    cancel() {
-      this.$emit("cancel");
-    },
-  },
-};
-</script>

+ 0 - 144
src/modules/stmms/components/markParam/MarkParamMarkerLeader.vue

@@ -1,144 +0,0 @@
-<template>
-  <div class="mark-param-marker-leader">
-    <div class="box-justify part-box part-box-pad">
-      <div>
-        <p class="tips-info">
-          1.科组长支持查看该课程下全部学生的成绩及查看分析报告!
-        </p>
-        <p class="tips-info">2.支持绑定多个科组长!</p>
-      </div>
-      <div>
-        <mark-status field="markerLeader"></mark-status>
-      </div>
-    </div>
-
-    <div class="part-box part-box-pad">
-      <table class="table">
-        <colgroup>
-          <col />
-          <col width="100" />
-        </colgroup>
-        <tr>
-          <th>科组长</th>
-          <th>操作</th>
-        </tr>
-        <tr>
-          <td>
-            <el-tag
-              v-for="user in users"
-              :key="user.id"
-              closable
-              size="medium"
-              :disable-transitions="false"
-              class="mb-1 mr-1"
-              @close="toDeleteUser(user)"
-            >
-              {{ user.label }}
-            </el-tag>
-          </td>
-          <td>
-            <el-button class="btn-primary" type="text" @click="toEdit"
-              >编辑</el-button
-            >
-          </td>
-        </tr>
-      </table>
-    </div>
-
-    <div class="text-center">
-      <el-button type="primary" :disabled="loading" @click="submit"
-        >提交</el-button
-      >
-      <el-button @click="cancel">取消</el-button>
-    </div>
-
-    <select-type-user
-      ref="SelectTypeUser"
-      special-privilege="SUBJECT_HEADER"
-      dialog-title="选择科组长"
-      :user-ids="curMarkLeaders"
-      :user-limit-count="0"
-      @confirm="userSelected"
-    ></select-type-user>
-  </div>
-</template>
-
-<script>
-import { examBindMarkLeader } from "../../api";
-import SelectTypeUser from "../SelectTypeUser.vue";
-import { mapState, mapMutations } from "vuex";
-import MarkStatus from "./MarkStatus.vue";
-
-export default {
-  name: "mark-param-marker-leader",
-  components: { SelectTypeUser, MarkStatus },
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      loading: false,
-      users: [],
-    };
-  },
-  computed: {
-    ...mapState("markParam", ["markLeader", "markParamInfos"]),
-    curMarkLeaders() {
-      return this.users.map((item) => item.id);
-    },
-  },
-  mounted() {
-    this.users = this.markLeader.map((item) => {
-      return { ...item };
-    });
-  },
-  methods: {
-    ...mapMutations("markParam", ["setMarkLeader"]),
-    toDeleteUser(user) {
-      this.users = this.users.filter((item) => item.id !== user.id);
-    },
-    userSelected(users) {
-      this.users = users;
-    },
-    toEdit() {
-      this.$refs.SelectTypeUser.open();
-    },
-    async submit() {
-      if (!this.users.length) {
-        this.$message.error("请选择科组长");
-        return;
-      }
-
-      if (this.loading) return;
-      this.loading = true;
-
-      const markLeader = this.users.map((item) => {
-        return {
-          id: item.id,
-          name: item.name,
-          orgName: item.orgName,
-          loginName: item.loginName,
-          label: item.label,
-        };
-      });
-      const res = await examBindMarkLeader({
-        id: this.markParamInfos.basicPaperInfo.id,
-        markLeader,
-      }).catch(() => {});
-      this.loading = false;
-      if (!res) return;
-      this.setMarkLeader(markLeader);
-      this.$message.success("绑定成功!");
-      this.$emit("confirm");
-    },
-    cancel() {
-      this.$emit("cancel");
-    },
-  },
-};
-</script>

+ 0 - 269
src/modules/stmms/components/markParam/MarkParamObjectiveAnswer.vue

@@ -1,269 +0,0 @@
-<template>
-  <div class="mark-param-objective-answer">
-    <div class="box-justify part-box part-box-pad">
-      <div>
-        <p class="tips-info">1.请录入客观题标答;</p>
-        <p class="tips-info">
-          2.多选题请根据需求设置判分策略,目前支持漏选给半分,任选给半分或者不设置,不设置时表示与标答一致得分,否则不得分。
-        </p>
-      </div>
-      <div>
-        <mark-status field="objective"></mark-status>
-      </div>
-    </div>
-
-    <div class="part-box part-box-pad">
-      <p class="tips-info mb-1">
-        <i class="el-icon-warning"></i> 客观题标答只能输入大写字母ABCDE...
-        ,判断题正确请输入A,错误输入B
-      </p>
-      <el-table
-        ref="TableList"
-        :data="tableData"
-        border
-        :row-class-name="getRowClassName"
-      >
-        <el-table-column width="50" align="center">
-          <template slot-scope="scope" v-if="scope.row.mainFirstSub">
-            <div
-              :class="[
-                'expand-btn',
-                { 'expand-btn-unexpand': !scope.row.expandSub },
-              ]"
-              @click="switchExpandSub(scope.row)"
-            >
-              <i
-                :class="scope.row.expandSub ? 'el-icon-minus' : 'el-icon-plus'"
-              ></i>
-            </div>
-          </template>
-        </el-table-column>
-        <el-table-column prop="mainTitle" label="大题名称">
-          <span slot-scope="scope" v-if="scope.row.mainFirstSub">
-            {{ scope.row.mainTitle }}
-          </span>
-        </el-table-column>
-        <el-table-column prop="typeName" label="题型" width="120">
-          <template slot-scope="scope" v-if="scope.row.mainFirstSub">
-            {{ scope.row.typeName }}
-          </template>
-        </el-table-column>
-        <el-table-column prop="mainNumber" label="大题号" width="80">
-          <template slot-scope="scope" v-if="scope.row.mainFirstSub">
-            <span>{{ scope.row.mainNumber }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column
-          prop="subNumber"
-          label="小题号"
-          width="80"
-        ></el-table-column>
-        <!-- <el-table-column prop="totalScore" label="小题满分" width="105">
-        </el-table-column> -->
-        <el-table-column label="答案" width="200px" class-name="answer-column">
-          <div
-            slot-scope="scope"
-            :class="['el-form-item', { 'is-error': scope.row.error }]"
-          >
-            <div class="el-form-item__content">
-              <el-input
-                v-model.trim="scope.row.answer"
-                :placeholder="
-                  scope.row.type === 3 ? 'A:正确,B:错误' : '请输入答案'
-                "
-                :maxlength="scope.row.optionCount"
-                clearable
-                @change="validateAnswer(scope.row)"
-              ></el-input>
-              <div v-if="scope.row.error" class="el-form-item__error">
-                {{ scope.row.errMsg }}
-              </div>
-            </div>
-          </div>
-        </el-table-column>
-        <el-table-column label="判分规则" width="140px">
-          <template v-if="scope.row.type === 2" slot-scope="scope">
-            <el-select v-model="scope.row.objectivePolicy">
-              <el-option
-                v-for="(val, key) in QUESTION_SCORE_TYPE"
-                :key="key"
-                :value="key"
-                :label="val"
-              ></el-option>
-            </el-select>
-          </template>
-        </el-table-column>
-      </el-table>
-    </div>
-
-    <div class="text-center">
-      <el-button type="primary" :disabled="loading" @click="submit"
-        >提交</el-button
-      >
-      <el-button @click="cancel">取消</el-button>
-    </div>
-  </div>
-</template>
-
-<script>
-import { QUESTION_SCORE_TYPE } from "@/constants/enumerate";
-import { updateObjectiveAnswer } from "../../api";
-import { mapState, mapMutations } from "vuex";
-import MarkStatus from "./MarkStatus.vue";
-
-export default {
-  name: "modify-objective-answer",
-  components: { MarkStatus },
-  data() {
-    return {
-      loading: false,
-      tableData: [],
-      QUESTION_SCORE_TYPE,
-      abc: "abcdefghijklmnopqrstuvwxyz".toUpperCase(),
-    };
-  },
-  computed: {
-    ...mapState("markParam", ["objectiveStructure", "markParamInfos"]),
-  },
-  mounted() {
-    this.initData();
-  },
-  methods: {
-    ...mapMutations("markParam", ["setObjectiveStructure"]),
-    initData() {
-      let objectiveStructure = this.objectiveStructure.length
-        ? this.objectiveStructure
-        : [];
-      let objectiveAnswerMap = {};
-      objectiveStructure.forEach((item) => {
-        objectiveAnswerMap[
-          `${item.type}_${item.mainNumber}_${item.subNumber}`
-        ] = {
-          answer: item.answer,
-          objectivePolicy: item.objectivePolicy,
-        };
-      });
-      let curMainNumber = null;
-      this.tableData = this.markParamInfos.paperStructureInfo
-        .filter((item) => item.qType === "objective")
-        .map((item) => {
-          let nitem = { ...item };
-          if (nitem.mainNumber !== curMainNumber) {
-            curMainNumber = nitem.mainNumber;
-            nitem.mainFirstSub = true;
-          } else {
-            nitem.mainFirstSub = false;
-          }
-          const cacheVal =
-            objectiveAnswerMap[
-              `${item.type}_${item.mainNumber}_${item.subNumber}`
-            ] || {};
-          nitem.expandSub = true;
-          nitem.answer = cacheVal.answer || "";
-          nitem.objectivePolicy = cacheVal.objectivePolicy || "NONE";
-          nitem.error = false;
-          nitem.errMsg = "";
-          return nitem;
-        });
-    },
-    getRowClassName({ row }) {
-      let classNames = [];
-      if (row.mainFirstSub) {
-        classNames.push("row-main-first-sub");
-      }
-      if (!row.mainFirstSub && !row.expandSub) {
-        classNames.push("row-unexpand-sub");
-      }
-      return classNames.join(" ");
-    },
-    switchExpandSub(row) {
-      row.expandSub = !row.expandSub;
-      this.tableData
-        .filter((item) => item.mainId === row.mainId && !item.mainFirstSub)
-        .forEach((item) => (item.expandSub = row.expandSub));
-    },
-    validateAnswer(row) {
-      if (!row.answer) {
-        row.error = true;
-        row.errMsg = "不能为空";
-        return;
-      }
-
-      if (!/^[A-Z]{1,26}$/.test(row.answer)) {
-        row.error = true;
-        row.errMsg = "只能输入英文大写字母";
-        return;
-      }
-
-      const validAnswers = this.abc.substring(0, row.optionCount);
-      // 单选题 判断题
-      if (row.type === 1 || row.type === 3) {
-        if (
-          row.answer.length !== 1 ||
-          row.answer.split("").some((item) => !validAnswers.includes(item))
-        ) {
-          row.error = true;
-          row.errMsg = `只能输入${validAnswers}中的一个`;
-          return;
-        }
-      }
-
-      // 多选题
-      if (row.type === 2) {
-        if (row.answer.length <= 1) {
-          row.error = true;
-          row.errMsg = `答案必须为多个`;
-          return;
-        }
-        if (row.answer.split("").some((item) => !validAnswers.includes(item))) {
-          row.error = true;
-          row.errMsg = `只能输入${validAnswers}中的字符`;
-          return;
-        }
-
-        const ansSet = new Set(row.answer.split(""));
-        if (ansSet.size !== row.answer.length) {
-          row.error = true;
-          row.errMsg = "答案不能重复";
-          return;
-        }
-      }
-
-      row.error = false;
-      row.errMsg = "";
-    },
-    checkData() {
-      this.tableData.forEach((item) => {
-        this.validateAnswer(item);
-      });
-
-      return !this.tableData.some((item) => item.error);
-    },
-    async submit() {
-      if (!this.checkData()) return;
-
-      if (this.loading) return;
-      this.loading = true;
-      const datas = {
-        id: this.markParamInfos.basicPaperInfo.id,
-        objectiveStructure: this.tableData.map((item) => {
-          let nitem = { ...item };
-          delete nitem.errMsg;
-          delete nitem.error;
-          return nitem;
-        }),
-      };
-      const data = await updateObjectiveAnswer(datas).catch(() => {});
-      this.loading = false;
-      if (!data) return;
-
-      this.setObjectiveStructure(datas.objectiveStructure);
-      this.$message.success("编辑成功!");
-      this.$emit("confirm");
-    },
-    cancel() {
-      this.$emit("cancel");
-    },
-  },
-};
-</script>

+ 0 - 322
src/modules/stmms/components/markParam/MarkParamStructure.vue

@@ -1,322 +0,0 @@
-<template>
-  <div class="mark-param-structure">
-    <div class="mark-body" v-if="dataReady">
-      <component
-        :is="currentComponent"
-        :ref="currentComponent"
-        :datas="infos"
-        @next-step="toNext"
-        @on-ready="compReady"
-        @data-change="dataChange"
-      ></component>
-    </div>
-
-    <div class="text-center">
-      <el-button
-        v-if="!isFirstStep"
-        type="primary"
-        :disabled="loading"
-        @click="prevStep"
-        >上一步</el-button
-      >
-      <el-button
-        v-if="isLastStep"
-        type="primary"
-        :disabled="loading"
-        @click="nextStep"
-        >提交</el-button
-      >
-      <el-button v-else type="primary" @click="nextStep" :disabled="loading"
-        >下一步</el-button
-      >
-      <el-button @click="cancel">取消</el-button>
-    </div>
-
-    <div slot="footer"></div>
-  </div>
-</template>
-
-<script>
-import { mapState, mapMutations } from "vuex";
-
-import MarkPaperGroup from "./MarkPaperGroup.vue";
-import MarkPaperStructure from "./MarkPaperStructure.vue";
-import { examStructureSubmit } from "../../api";
-import { calcSum, deepCopy } from "@/plugins/utils";
-
-const STEPS_LIST = [
-  {
-    name: "structure",
-    title: "试卷结构",
-    desc: "请按试卷填写相应试卷结构信息",
-  },
-  {
-    name: "group",
-    title: "评卷分组",
-    desc: "请设置评卷分组",
-  },
-];
-
-export default {
-  name: "mark-param-structure",
-  components: { MarkPaperGroup, MarkPaperStructure },
-  data() {
-    return {
-      infos: {
-        basicPaperInfo: {},
-        paperStructureInfo: [],
-        groupInfo: [],
-        paperStat: {},
-        structureCanEdit: true,
-      },
-      // step
-      steps: STEPS_LIST,
-      current: 0,
-      loading: false,
-      dataReady: false,
-    };
-  },
-  computed: {
-    ...mapState("markParam", ["markParamInfos", "objectiveStructure"]),
-    currentComponent() {
-      return `mark-paper-${this.steps[this.current].name}`;
-    },
-    isFirstStep() {
-      return this.current === 0;
-    },
-    isLastStep() {
-      return this.current === this.lastStep;
-    },
-    lastStep() {
-      return this.steps.length - 1;
-    },
-  },
-  mounted() {
-    this.initData();
-  },
-  methods: {
-    ...mapMutations("markParam", [
-      "setMarkParamInfos",
-      "setObjectiveStructure",
-    ]),
-    async initData() {
-      this.current = 0;
-      this.loading = false;
-      const {
-        structureCanEdit,
-        paperStructureInfo,
-        groupInfo,
-        classInfo,
-        basicPaperInfo,
-      } = this.markParamInfos;
-
-      this.infos = {
-        structureCanEdit,
-        paperStructureInfo: deepCopy(paperStructureInfo),
-        groupInfo: deepCopy(groupInfo),
-        classInfo: deepCopy(classInfo),
-        basicPaperInfo: this.getBaseInfo(basicPaperInfo),
-        paperStat: this.statPaperStructure(paperStructureInfo),
-      };
-      this.dataReady = true;
-    },
-    getBaseInfo(baseInfo) {
-      return this.$objAssign(
-        {
-          id: null,
-          examPaperStructureId: baseInfo.id,
-          examId: null,
-          cardId: null,
-          thirdRelateId: null,
-          thirdRelateName: "",
-          courseName: "",
-          courseId: "",
-          paperNumber: null,
-          paperType: "",
-          sequence: null,
-          openClassReading: null,
-          status: "",
-        },
-        baseInfo
-      );
-    },
-    statPaperStructure(paperStructureInfo) {
-      const questionCount = paperStructureInfo.length;
-
-      const subjectiveQuestionCount = paperStructureInfo.filter(
-        (item) => item.qType === "subjective"
-      ).length;
-
-      return {
-        questionCount,
-        paperTotalScore: calcSum(
-          paperStructureInfo.map((item) => item.totalScore || 0)
-        ),
-        subjectiveQuestionCount,
-        objectiveQuestionCount: questionCount - subjectiveQuestionCount,
-        structChanged: false,
-      };
-    },
-    prevStep() {
-      if (this.isFirstStep) return;
-      this.$refs[this.currentComponent].updateData();
-      this.current -= 1;
-      if (this.steps[this.current].name === "structure") {
-        this.$notify({
-          title: "警告",
-          message: "修改试卷结构会清空已经设置的评卷员,需要重新设置!",
-          type: "warning",
-          duration: 5000,
-        });
-      }
-    },
-    nextStep() {
-      this.$refs[this.currentComponent].checkData();
-    },
-    toNext() {
-      if (this.isLastStep) {
-        this.submit();
-      } else {
-        const paperStat = this.infos.paperStat;
-
-        let tipsContent = `本试卷共${paperStat.questionCount}道小题,客观题${paperStat.objectiveQuestionCount}道,主观题${paperStat.subjectiveQuestionCount}道,总分为${paperStat.paperTotalScore}分。`;
-        if (paperStat.structChanged) {
-          tipsContent += "试卷结构有变动,评卷员将被清空。";
-        }
-        if (paperStat.subjectiveQuestionCount) {
-          this.$confirm(`${tipsContent}确定要下一步吗?`, "提示", {
-            type: "warning",
-          })
-            .then(() => {
-              this.current += 1;
-            })
-            .catch(() => {});
-        } else {
-          // 没有主观题,可以直接提交,不需要设置评卷员分组
-          this.$confirm(`${tipsContent}, 是否立即提交?`, "提示", {
-            type: "warning",
-          })
-            .then(() => {
-              this.submit();
-            })
-            .catch(() => {});
-        }
-      }
-    },
-    getPaperStructData(paperStructureInfo) {
-      let originStruct = [];
-      let group = [];
-      let curMainId = null;
-      let curQType = null;
-      paperStructureInfo.forEach((item) => {
-        if (curMainId !== item.mainId) {
-          curMainId = item.mainId;
-          curQType = item.qType[0];
-          if (group.length) originStruct.push(`${curQType}${group.length}`);
-          group = [];
-        }
-        group.push(item);
-      });
-      if (group.length) originStruct.push(`${curQType}${group.length}`);
-      return originStruct;
-    },
-    dataChange(data) {
-      if (data.paperStructureInfo) {
-        data.paperStat = this.statPaperStructure(data.paperStructureInfo);
-      }
-      if (data.paperStructureInfo && this.infos.paperStructureInfo.length) {
-        // 检验试卷结构是否有变化
-        const originStruct = this.getPaperStructData(
-          this.infos.paperStructureInfo
-        );
-        const curStruct = this.getPaperStructData(data.paperStructureInfo);
-        if (curStruct.join("") !== originStruct.join("")) {
-          data.groupInfo = [];
-          data.classInfo = [];
-          data.paperStat.structChanged = true;
-        } else {
-          // 更新分组中的试题信息
-          const paperMap = {};
-          data.paperStructureInfo.forEach((item) => {
-            paperMap[`${item.mainNumber}-${item.subNumber}`] = item;
-          });
-          const groupInfo = this.infos.groupInfo.map((group) => {
-            let ngroup = { ...group };
-            ngroup.questions = ngroup.questions.map((q) => {
-              return { ...paperMap[`${q.mainNumber}-${q.subNumber}`] };
-            });
-            return ngroup;
-          });
-          data.groupInfo = groupInfo;
-        }
-      }
-
-      Object.entries(data).forEach(([key, val]) => {
-        this.infos[key] = val;
-      });
-    },
-    compReady(type = false) {
-      this.loading = type;
-    },
-    async submit() {
-      if (this.loading) return;
-      const hasGroupNoPic = this.infos.groupInfo.some(
-        (item) => !item.pictureConfigList.length
-      );
-      if (hasGroupNoPic) {
-        const confirm = await this.$confirm(
-          `当前评卷员分组中存在没有设置评卷区的分组, 确定要提交吗?`,
-          "提示",
-          {
-            type: "warning",
-          }
-        ).catch(() => {});
-        if (confirm !== "confirm") return;
-      }
-
-      this.loading = true;
-      const datas = {
-        structureCanEdit: this.infos.structureCanEdit,
-        basicPaperInfo: this.infos.basicPaperInfo,
-        paperStructureInfo: {
-          objectiveQuestionList: this.infos.paperStructureInfo.filter(
-            (item) => item.qType === "objective"
-          ),
-          subjectiveQuestionList: this.infos.paperStructureInfo.filter(
-            (item) => item.qType === "subjective"
-          ),
-        },
-        groupInfo: this.infos.groupInfo,
-        classInfo: this.infos.classInfo,
-      };
-      const res = await examStructureSubmit(datas).catch(() => false);
-      this.loading = false;
-
-      if (!res) return;
-      // 判断客观题数据结构是否变化
-      const cacheStruct = this.getPaperStructData(this.objectiveStructure);
-      const curStruct = this.getPaperStructData(
-        datas.paperStructureInfo.objectiveQuestionList
-      );
-      if (curStruct.join("") !== cacheStruct.join("")) {
-        this.setObjectiveStructure([]);
-      }
-
-      this.infos.basicPaperInfo.id = res;
-      const infos = {
-        ...this.infos,
-        basicPaperInfo: Object.assign(
-          this.markParamInfos.basicPaperInfo,
-          this.infos.basicPaperInfo
-        ),
-      };
-      this.setMarkParamInfos(infos);
-      this.$message.success("提交成功!");
-      this.$emit("confirm");
-    },
-    cancel() {
-      this.$emit("cancel");
-    },
-  },
-};
-</script>

+ 0 - 125
src/modules/stmms/components/markParam/MarkParamUploadAnswer.vue

@@ -1,125 +0,0 @@
-<template>
-  <div class="mark-param-upload-answer">
-    <div class="box-justify part-box part-box-pad">
-      <div>
-        <p class="tips-info">1.主观题标答请上传PDF文档;</p>
-        <p class="tips-info">
-          2.主观题标答文档上传后,在评卷界面小助手里可以打开进行查看,作为评卷参考;
-        </p>
-        <p class="tips-info">3.支持重复提交,以最后一次提交标答文件为准。</p>
-      </div>
-      <div>
-        <mark-status field="answerFile"></mark-status>
-      </div>
-    </div>
-    <div class="part-box part-box-pad">
-      <el-form ref="modalFormComp" :model="infos" label-width="50px">
-        <div class="part-box">
-          <h3 class="mb-2">
-            卷型{{ markParamInfos.basicPaperInfo.paperType }}
-          </h3>
-          <el-form-item prop="file" label="标答:">
-            <select-file
-              :format="fileFormat"
-              :disabled="loading"
-              @file-change="fileChange"
-            ></select-file>
-            <p v-if="infos.errorMsg" class="tips-info tips-error">
-              {{ infos.errorMsg }}
-            </p>
-          </el-form-item>
-          <el-form-item v-if="answerFileUrl">
-            <span
-              class="cont-link"
-              title="点击查看已上传标答文件"
-              @click="toViewAnswer"
-            >
-              <i class="el-icon-document mr-1"></i>{{ answerFileName }}
-            </span>
-          </el-form-item>
-        </div>
-      </el-form>
-    </div>
-    <div class="text-center">
-      <el-button type="primary" :disabled="loading" @click="submit"
-        >确认</el-button
-      >
-      <el-button @click="cancel">取消</el-button>
-    </div>
-  </div>
-</template>
-
-<script>
-import { mapState, mapMutations } from "vuex";
-import { examStructureUploadAnswer } from "../../api";
-import SelectFile from "@/components/SelectFile.vue";
-import MarkStatus from "./MarkStatus.vue";
-
-export default {
-  name: "mark-param-upload-answer",
-  components: { SelectFile, MarkStatus },
-  data() {
-    return {
-      modalIsShow: false,
-      loading: false,
-      infos: { file: null, md5: null, errorMsg: null },
-      fileFormat: ["pdf"],
-    };
-  },
-  computed: {
-    ...mapState("markParam", ["markParamInfos"]),
-    answerFileName() {
-      return `${this.markParamInfos.basicPaperInfo.courseName}-标答文件`;
-    },
-    answerFileUrl() {
-      const { paperType, paperAnswer } = this.markParamInfos.basicPaperInfo;
-      if (!paperAnswer) return;
-      const paperAnswerInfo = JSON.parse(paperAnswer);
-      const paper = paperAnswerInfo.find(
-        (item) => item.paperType === paperType
-      );
-      return paper ? paper.answerUrl : "";
-    },
-  },
-  methods: {
-    ...mapMutations("markParam", ["setMarkParamInfos"]),
-    toViewAnswer() {
-      window.open(this.answerFileUrl);
-    },
-    fileChange(data) {
-      if (data.errorMsg) {
-        this.infos.file = null;
-        this.infos.md5 = null;
-        this.infos.errorMsg = data.errorMsg;
-      } else {
-        this.infos.file = data.file;
-        this.infos.md5 = data.md5;
-        this.infos.errorMsg = null;
-      }
-    },
-    async submit() {
-      if (!this.infos.file) {
-        this.$message.error("请选择标答文件");
-        return;
-      }
-
-      if (this.loading) return;
-      this.loading = true;
-
-      let formData = new FormData();
-      formData.append("id", this.markParamInfos.basicPaperInfo.id);
-      formData.append(`file`, this.infos.file);
-      formData.append(`md5`, this.infos.md5);
-      const data = await examStructureUploadAnswer(formData).catch(() => {});
-      this.loading = false;
-      if (!data) return;
-
-      this.$message.success("上传成功!");
-      this.$emit("confirm");
-    },
-    cancel() {
-      this.$emit("cancel");
-    },
-  },
-};
-</script>

+ 0 - 55
src/modules/stmms/components/markParam/MarkStatus.vue

@@ -1,55 +0,0 @@
-<template>
-  <div class="mark-status">
-    <template v-if="status">
-      <span>
-        <i
-          :class="[
-            'el-icon-success',
-            status.save ? 'color-success' : 'color-danger',
-          ]"
-        ></i>
-        提交{{ status.save ? "成功" : "失败" }}
-      </span>
-      <span>
-        <i
-          :class="[
-            'el-icon-success',
-            status.sync ? 'color-success' : 'color-danger',
-          ]"
-        ></i>
-        同步{{ status.sync ? "成功" : "失败" }}
-      </span>
-    </template>
-  </div>
-</template>
-
-<script>
-import { mapState } from "vuex";
-
-export default {
-  name: "mark-status",
-  props: {
-    field: {
-      type: String,
-      default: "",
-    },
-  },
-  data() {
-    return {};
-  },
-  computed: {
-    ...mapState("markParam", ["markStatus"]),
-    status() {
-      return this.markStatus[this.field];
-    },
-  },
-  methods: {},
-};
-</script>
-
-<style scoped>
-.mark-status {
-  display: inline-block;
-  vertical-align: middle;
-}
-</style>

+ 0 - 155
src/modules/stmms/components/markParam/ModifyMarkArea.vue

@@ -1,155 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-mark-area"
-    :visible.sync="modalIsShow"
-    top="0"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    fullscreen
-    :show-close="false"
-    @open="visibleChange"
-  >
-    <div class="box-justify" slot="title">
-      <h2 class="el-dialog__title">设置分组评卷区域</h2>
-      <div>
-        <el-button type="success" @click="confirm">确定</el-button>
-        <el-button @click="cancel">取消</el-button>
-      </div>
-    </div>
-    <div class="tips-info">
-      <i class="el-icon-warning"></i>
-      按住鼠标左键拖动,框选评卷区域。可以设置多个评卷区域。当不设置评卷区域时,评卷时将展示答题卡所有答题区。
-    </div>
-    <div v-if="modalIsShow" class="area-container">
-      <area-cropper
-        v-for="(paper, index) in papers"
-        :id="`area-cropper-${index}`"
-        :imgUrl="paper.imgUrl"
-        ref="AreaCropper"
-        :key="paper.imgUrl"
-        :paper="paper"
-        @curarea-change="cropperCurareaChange"
-        @change="(areas) => areaChange(index, areas)"
-        @paper-load="() => areaPaperLoaded(index)"
-      ></area-cropper>
-    </div>
-
-    <div slot="footer"></div>
-  </el-dialog>
-</template>
-
-<script>
-import AreaCropper from "./areaCropper/AreaCropper.vue";
-
-export default {
-  name: "modify-mark-area",
-  components: { AreaCropper },
-  props: {
-    baseInfo: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-    group: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-    paperList: {
-      type: Array,
-      default() {
-        return [];
-      },
-    },
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      papers: [],
-      paperLoadedList: [],
-    };
-  },
-  methods: {
-    visibleChange() {
-      this.paperLoadedList = [];
-      this.papers = this.paperList.map((paper) => {
-        let npaper = { ...paper };
-        npaper.areas = [];
-        return npaper;
-      });
-      this.group.pictureConfigList.forEach((config) => {
-        const index = config.i - 1;
-        this.papers[index].areas.push({ ...config });
-      });
-    },
-    areaPaperLoaded(paperIndex) {
-      if (this.paperLoadedList.includes(paperIndex)) return;
-      this.paperLoadedList.push(paperIndex);
-      if (this.paperLoadedList.length === this.paperList.length) {
-        this.scrollToFirstArea();
-      }
-    },
-    scrollToFirstArea() {
-      if (!this.group.pictureConfigList.length) return;
-      let paperIndexs = this.group.pictureConfigList.map((item) => item.i - 1);
-      paperIndexs.sort((a, b) => a - b);
-      const firstPaperIndex = paperIndexs[0];
-
-      this.$nextTick(() => {
-        const areaCropperDom = document.getElementById(
-          `area-cropper-${firstPaperIndex}`
-        );
-        let areaItems = areaCropperDom.querySelectorAll(".element-resize");
-        let firstAreaItem = null;
-        let topNum = 9999;
-        for (let i = 0; i < areaItems.length; i++) {
-          const element = areaItems[i];
-          if (element.offsetTop < topNum) {
-            topNum = element.offsetTop;
-            firstAreaItem = element;
-          }
-        }
-        // console.log(firstAreaItem);
-        const scrollTop =
-          areaCropperDom.offsetTop + firstAreaItem.offsetTop - 100;
-        this.$el.querySelector(".el-dialog").scrollTop = scrollTop;
-      });
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    areaChange(index, areas) {
-      this.papers[index].areas = areas;
-    },
-    cropperCurareaChange(area) {
-      this.$refs.AreaCropper.forEach((cropper) => {
-        cropper.curareaChange(area);
-      });
-    },
-    confirm() {
-      let areas = [];
-      this.papers.forEach((paper, pindex) => {
-        if (!paper.areas.length) return;
-        paper.areas.forEach((area) => {
-          let narea = { i: pindex + 1 };
-          if (!area.isFull) {
-            narea = { ...narea, x: area.x, y: area.y, w: area.w, h: area.h };
-          }
-          areas.push(narea);
-        });
-      });
-      this.$emit(
-        "modified",
-        Object.assign({}, this.group, { pictureConfigList: areas })
-      );
-      this.cancel();
-    },
-  },
-};
-</script>

+ 0 - 349
src/modules/stmms/components/markParam/ModifyMarkParams.vue

@@ -1,349 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-mark-params"
-    :visible.sync="modalIsShow"
-    top="0"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    :show-close="false"
-    append-to-body
-    fullscreen
-    @open="initData"
-  >
-    <div slot="title">
-      <h2 class="el-dialog__title">评卷参数设置</h2>
-      <span
-        >课程名称:{{ instance.courseName }}({{ instance.courseCode }})</span
-      >
-      <button class="el-dialog__headerbtn" @click="cancel"></button>
-    </div>
-
-    <div class="mb-4 tab-btns">
-      <el-button
-        v-for="tab in tabs"
-        :key="tab.val"
-        size="medium"
-        :type="curTab == tab.val ? 'primary' : 'default'"
-        :disabled="!basicInfoIsSave && tab.val !== 'structure'"
-        @click="selectMenu(tab.val)"
-        >{{ tab.name }}
-      </el-button>
-    </div>
-
-    <div v-if="dataReady">
-      <component
-        :is="currentComponent"
-        def="MarkParamRef"
-        @cancel="cancel"
-        @confirm="confirm"
-      ></component>
-    </div>
-    <div slot="footer"></div>
-  </el-dialog>
-</template>
-
-<script>
-import { mapState, mapMutations } from "vuex";
-import MarkParamStructure from "./MarkParamStructure.vue";
-import MarkParamMarker from "./MarkParamMarker.vue";
-import MarkParamMarkerLeader from "./MarkParamMarkerLeader.vue";
-import MarkParamObjectiveAnswer from "./MarkParamObjectiveAnswer.vue";
-import MarkParamUploadAnswer from "./MarkParamUploadAnswer.vue";
-import { cardDetail } from "../../../card/api";
-import { examStructureStatus } from "../../api";
-
-export default {
-  name: "modify-mark-params",
-  components: {
-    MarkParamStructure,
-    MarkParamMarker,
-    MarkParamMarkerLeader,
-    MarkParamObjectiveAnswer,
-    MarkParamUploadAnswer,
-  },
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      dataReady: false,
-      // step
-      curTab: "structure",
-      tabs: [
-        {
-          name: "评卷参数设置",
-          val: "structure",
-        },
-        {
-          name: "科组长设置",
-          val: "marker-leader",
-        },
-        {
-          name: "评卷员管理",
-          val: "marker",
-        },
-        {
-          name: "客观题标答设置",
-          val: "objective-answer",
-        },
-        {
-          name: "主观题标答设置",
-          val: "upload-answer",
-        },
-      ],
-      current: 0,
-    };
-  },
-  computed: {
-    ...mapState("markParam", ["markParamInfos"]),
-    currentComponent() {
-      return `mark-param-${this.curTab}`;
-    },
-    isFirstStep() {
-      return this.current === 0;
-    },
-    isLastStep() {
-      return this.current === this.lastStep;
-    },
-    lastStep() {
-      return this.tabs.length - 1;
-    },
-    basicInfoIsSave() {
-      return !!this.markParamInfos.basicPaperInfo.id;
-    },
-  },
-  watch: {
-    curTab() {
-      this.updateMarkStatus();
-    },
-  },
-  methods: {
-    ...mapMutations("markParam", [
-      "setMarkParamInfos",
-      "setObjectiveStructure",
-      "setMarkStatus",
-      "setMarkLeader",
-      "initStore",
-    ]),
-    async initData() {
-      const basicPaperInfo = {
-        ...this.instance,
-        openClassReading: !!this.instance.openClassReading,
-      };
-
-      if (this.instance.paperInfoJson) {
-        const { paperStructureInfo, groupInfo, classInfo, structureCanEdit } =
-          JSON.parse(this.instance.paperInfoJson);
-        const infos = {
-          structureCanEdit,
-          paperStructureInfo: [
-            ...paperStructureInfo.objectiveQuestionList,
-            ...paperStructureInfo.subjectiveQuestionList,
-          ],
-          groupInfo: groupInfo || [],
-          classInfo: classInfo || [],
-          basicPaperInfo,
-        };
-        this.setMarkParamInfos(infos);
-      } else {
-        const detData = await cardDetail(this.instance.cardId);
-        const cardContent = JSON.parse(detData.content);
-        let infos = { basicPaperInfo, structureCanEdit: true };
-        if (
-          (detData.type === "GENERIC" && detData.createMethod === "STANDARD") ||
-          detData.type === "CUSTOM"
-        ) {
-          infos.structureCanEdit = false;
-          infos.paperStructureInfo = this.parsePaperStructureFromCard(
-            cardContent.pages
-          );
-        }
-        // console.log(infos);
-        this.setMarkParamInfos(infos);
-      }
-
-      if (this.instance.status) {
-        const data = JSON.parse(this.instance.status);
-        this.setMarkStatus(data);
-      }
-
-      if (this.instance.markLeader) {
-        const data = JSON.parse(this.instance.markLeader);
-        this.setMarkLeader(data);
-      }
-
-      const objectiveStructure = JSON.parse(
-        this.instance.objectiveStructure || "[]"
-      );
-      this.setObjectiveStructure(objectiveStructure);
-
-      this.selectMenu("structure");
-      this.dataReady = true;
-    },
-    async updateMarkStatus() {
-      if (!this.markParamInfos.basicPaperInfo.id) return;
-      const res = await examStructureStatus(
-        this.markParamInfos.basicPaperInfo.id
-      ).catch(() => {});
-      if (!res) return;
-
-      const data = JSON.parse(res);
-      this.setMarkStatus(data);
-    },
-    parsePaperStructureFromCard(pages) {
-      let structData = [];
-      let curTopicId = 0;
-      pages.forEach((page) => {
-        page.columns.forEach((column) => {
-          column.elements.forEach((topic) => {
-            if (!topic.parent) return;
-            if (curTopicId === topic.parent.id) return;
-
-            curTopicId = topic.parent.id;
-            let questionsCount = 1,
-              startNumber = 1;
-            if (topic.type === "COMPOSITION") {
-              // 相同大题号的作文题合并处理
-              const compositionData = structData.find(
-                (struct) =>
-                  struct.cardTopicType === "COMPOSITION" &&
-                  struct.mainNumber === topic.parent.topicNo * 1
-              );
-              if (compositionData) return;
-            } else {
-              questionsCount = topic.parent.questionsCount;
-              startNumber = topic.parent.startNumber || 1;
-            }
-            const typeInfo = this.getQuestionType(topic);
-            if (!typeInfo) return;
-
-            let data = {
-              mainNumber: topic.parent.topicNo * 1,
-              mainTitle: topic.parent.topicName,
-              questionsCount,
-              startNumber,
-              cardTopicType: topic.type,
-              ...typeInfo,
-            };
-            if (topic.type === "FILL_QUESTION") {
-              data.optionCount = topic.optionCount;
-            }
-            structData.push(data);
-          });
-        });
-      });
-      // console.log(structData);
-      let structure = [];
-      let mainIds = {};
-      structData.forEach((struct) => {
-        const { startNumber, questionsCount, qType, mainNumber, mainTitle } =
-          struct;
-        if (!mainIds[mainNumber]) {
-          mainIds[mainNumber] = this.$randomCode();
-        }
-        for (let i = 0; i < questionsCount; i++) {
-          structure.push({
-            id: this.$randomCode(),
-            qType,
-            mainId: mainIds[mainNumber],
-            mainTitle,
-            mainNumber,
-            subNumber: startNumber + i,
-            type: struct.type,
-            typeName: struct.typeName,
-            optionCount: struct.optionCount || null,
-            totalScore: undefined,
-            mainFirstSub: false,
-            expandSub: true,
-          });
-        }
-      });
-      structure.sort(
-        (a, b) => a.mainNumber - b.mainNumber || a.subNumber - b.subNumber
-      );
-      let curMainId = null;
-      structure.forEach((item) => {
-        if (curMainId !== item.mainId) {
-          curMainId = item.mainId;
-          item.mainFirstSub = true;
-        }
-      });
-      return structure;
-    },
-    getQuestionType(topic) {
-      // const questionType = {
-      //   1: "SINGLE_ANSWER_QUESTION",
-      //   2: "MULTIPLE_ANSWER_QUESTION",
-      //   3: "BOOL_ANSWER_QUESTION",
-      //   4: "FILL_BLANK_QUESTION",
-      //   5: "TEXT_ANSWER_QUESTION",
-      // };
-      if (topic.type === "COMPOSITION" || topic.type === "EXPLAIN") {
-        return {
-          type: 5,
-          typeName: "解答题",
-          qType: "subjective",
-        };
-      }
-      if (topic.type === "FILL_LINE") {
-        return {
-          type: 4,
-          typeName: "填空题",
-          qType: "subjective",
-        };
-      }
-      if (topic.type === "FILL_QUESTION") {
-        if (topic.isBoolean)
-          return {
-            type: 3,
-            typeName: "判断题",
-            qType: "objective",
-          };
-        if (topic.isMultiply)
-          return {
-            type: 2,
-            typeName: "多选题",
-            qType: "objective",
-          };
-        return {
-          type: 1,
-          typeName: "单选题",
-          qType: "objective",
-        };
-      }
-      return;
-    },
-    selectMenu(val) {
-      this.curTab = val;
-      this.current = this.tabs.findIndex((item) => item.val === val);
-    },
-    async cancel() {
-      const res = await this.$confirm("确定要退出阅卷参数编辑吗?", "提示", {
-        type: "warning",
-      }).catch(() => {});
-      if (res !== "confirm") return;
-
-      this.initStore();
-      this.dataReady = false;
-      this.$emit("modified");
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    confirm() {
-      if (this.isLastStep) {
-        this.selectMenu(this.tabs[0].val);
-      } else {
-        this.selectMenu(this.tabs[this.current + 1].val);
-      }
-    },
-  },
-};
-</script>

+ 0 - 532
src/modules/stmms/components/markParam/ModifyMarkerQuestion.vue

@@ -1,532 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-marker-question"
-    :visible.sync="modalIsShow"
-    append-to-body
-    top="20px"
-    width="900px"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    :show-close="false"
-    @opened="visibleChange"
-  >
-    <div slot="title"></div>
-
-    <el-row type="flex" :gutter="10">
-      <el-col :span="12">
-        <div class="marker-box">
-          <div class="user-title">评卷员</div>
-          <div class="user-search">
-            <el-input
-              v-model="filterLabel"
-              placeholder="请输入评卷员名称"
-              clearable
-              size="mini"
-              prefix-icon="el-icon-search"
-              @input="labelChange"
-            ></el-input>
-          </div>
-          <div class="user-types">
-            <div
-              :class="['user-type', { 'is-active': userType === 'org' }]"
-              @click="switchUserType('org')"
-            >
-              组织架构
-            </div>
-            <div
-              :class="['user-type', { 'is-active': userType === 'course' }]"
-              @click="switchUserType('course')"
-            >
-              课程
-            </div>
-          </div>
-          <div class="user-tree">
-            <el-tree
-              ref="UserTree"
-              :data="userTree"
-              node-key="id"
-              :default-checked-keys="selectedUserIds"
-              :props="defaultProps"
-              default-expand-all
-            >
-              <span class="custom-tree-node" slot-scope="{ node, data }">
-                <el-checkbox
-                  v-if="data.isUser"
-                  v-model="node.checked"
-                  @change="(val) => userChange(val, data)"
-                >
-                  {{ node.label }}({{ data.loginName }})
-                </el-checkbox>
-                <span v-else>{{ node.label }}</span>
-                <div title="全选" @click.stop>
-                  <el-checkbox
-                    v-if="!data.isUser && data.children.length"
-                    v-model="data.selected"
-                    @change="(checked) => selectNodeAll(checked, data)"
-                  ></el-checkbox>
-                </div>
-              </span>
-            </el-tree>
-          </div>
-        </div>
-      </el-col>
-      <el-col :span="12">
-        <div class="marker-box marker-box-uq">
-          <el-form
-            ref="modalFormRef"
-            :rules="rules"
-            :model="{}"
-            label-width="100px"
-            label-position="top"
-          >
-            <el-form-item prop="users" label="已选评卷员:">
-              <el-tag
-                v-for="user in selectedUsers"
-                :key="user.id"
-                closable
-                :disable-transitions="false"
-                @close="toDeleteUser(user)"
-              >
-                {{ user.name }}({{ user.orgName }})
-              </el-tag>
-            </el-form-item>
-            <el-form-item
-              prop="questions"
-              :label="canSelectQuestion ? '选择评卷题目:' : '评卷题目:'"
-            >
-              <div class="marker-paper-struct">
-                <div
-                  v-for="mainItem in paperStructs"
-                  :key="mainItem.mainId"
-                  class="struct-item"
-                >
-                  <div class="struct-header box-justify">
-                    <h4>{{ mainItem.mainNumber }}、{{ mainItem.mainTitle }}</h4>
-                    <el-checkbox
-                      v-if="
-                        canSelectQuestion &&
-                        mainItem.children &&
-                        mainItem.children.length
-                      "
-                      v-model="mainItem.selected"
-                      title="全选"
-                      @change="
-                        (checked) => selectQuestionAll(checked, mainItem)
-                      "
-                    ></el-checkbox>
-                  </div>
-                  <div
-                    v-if="mainItem.children && mainItem.children.length"
-                    class="struct-questions"
-                  >
-                    <template v-if="canSelectQuestion">
-                      <el-checkbox
-                        v-for="question in mainItem.children"
-                        :key="question.id"
-                        v-model="question.selected"
-                        :disabled="question.disabled"
-                        @change="questionChange"
-                      >
-                        {{ question.subNumber }}
-                      </el-checkbox>
-                    </template>
-                    <template v-else>
-                      <template v-for="question in mainItem.children">
-                        <el-tag v-if="question.selected" :key="question.id">{{
-                          question.subNumber
-                        }}</el-tag>
-                      </template>
-                    </template>
-                  </div>
-                </div>
-              </div>
-            </el-form-item>
-          </el-form>
-        </div>
-      </el-col>
-    </el-row>
-
-    <div class="marker-footer">
-      <el-button type="primary" @click="confirm">确认</el-button>
-      <el-button @click="cancel">取消</el-button>
-    </div>
-
-    <div slot="footer"></div>
-  </el-dialog>
-</template>
-
-<script>
-import { deepCopy } from "../../../../plugins/utils";
-import { organizationList } from "../../../base/api";
-
-export default {
-  name: "modify-marker-question",
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-    disabledQuestionIds: {
-      type: Array,
-      default() {
-        return [];
-      },
-    },
-    paperStructure: {
-      type: Array,
-      default() {
-        return [];
-      },
-    },
-    courseId: {
-      type: String,
-      default: "",
-    },
-    canSelectQuestion: {
-      type: Boolean,
-      default: true,
-    },
-  },
-  data() {
-    const usersValidator = (rule, value, callback) => {
-      if (!this.selectedUserIds.length) {
-        callback(new Error("请选择评卷员"));
-      } else {
-        callback();
-      }
-    };
-    const questionsValidator = (rule, value, callback) => {
-      if (!this.selectedQuestionIds.length) {
-        callback(new Error("请选择试题"));
-      } else {
-        callback();
-      }
-    };
-
-    return {
-      modalIsShow: false,
-      filterLabel: "",
-      userType: "course",
-      courseUsers: [],
-      orgUsers: [],
-      userTree: [],
-      userList: [],
-      selectedUsers: [],
-      selectedUserIds: [],
-      selectedQuestions: [],
-      selectedQuestionIds: [],
-      paperStructs: [],
-      defaultProps: {
-        children: "children",
-        label: "label",
-      },
-      rules: {
-        users: [
-          {
-            required: true,
-            validator: usersValidator,
-            trigger: "change",
-          },
-        ],
-        questions: [
-          {
-            required: true,
-            validator: questionsValidator,
-            trigger: "change",
-          },
-        ],
-      },
-    };
-  },
-  mounted() {
-    this.getOrgData();
-  },
-  methods: {
-    visibleChange() {
-      this.parseStructs();
-      this.filterLabel = "";
-      this.userType = "course";
-      this.selectedQuestions = this.instance.questions;
-      this.selectedQuestionIds = this.selectedQuestions.map((item) => item.id);
-      this.selectedUsers = this.instance.markerList.map((item) => {
-        return { ...item };
-      });
-      this.selectedUserIds = this.instance.markerList.map((item) => item.id);
-      this.labelChange();
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-    // user
-    switchUserType(type) {
-      this.filterLabel = "";
-      this.userType = type;
-
-      this.userTree =
-        type === "org" ? deepCopy(this.orgUsers) : deepCopy(this.courseUsers);
-      this.$refs.UserTree.setCheckedKeys(this.selectedUserIds);
-    },
-    async getOrgData() {
-      let params = {
-        specialPrivilege: "MARKER",
-      };
-      if (this.courseId) params.courseId = this.courseId;
-      const data = await organizationList(params);
-      this.parseUserData(data);
-      this.getUserList();
-    },
-    parseUserData(data) {
-      const parseUser = (list) => {
-        return list.map((item) => {
-          // org
-          let nitem = {
-            id: item.id,
-            label: item.name,
-            isUser: false,
-            selected: false,
-            children: [],
-          };
-
-          if (item["children"] && item["children"].length) {
-            nitem.children = [...nitem.children, ...parseUser(item.children)];
-          }
-          // user
-          if (item["sysUserList"] && item["sysUserList"].length) {
-            let sysUserList = item.sysUserList;
-            const users = sysUserList.map((user) => {
-              const nuser = {
-                id: user.id,
-                userId: user.id,
-                label: user.realName,
-                name: user.realName,
-                orgName: item.name,
-                loginName: user.loginName,
-                selected: false,
-                isUser: true,
-              };
-              return nuser;
-            });
-            nitem.children = [...nitem.children, ...users];
-          }
-
-          if (item["courseUserList"] && item["courseUserList"].length) {
-            nitem.courseUserList = item.courseUserList.map((user) => {
-              return {
-                id: user.id,
-                userId: user.id,
-                label: user.realName,
-                name: user.realName,
-                orgName: user.orgName,
-                loginName: user.loginName,
-                selected: false,
-                isUser: true,
-              };
-            });
-          }
-          return nitem;
-        });
-      };
-      this.orgUsers = parseUser(data);
-      this.userTree = deepCopy(this.orgUsers);
-      if (this.courseId && this.orgUsers[0].courseUserList) {
-        this.courseUsers = deepCopy(this.orgUsers[0].courseUserList);
-      }
-      this.getUserList();
-    },
-    getUserList() {
-      let userList = [];
-      const fetchUser = (users) => {
-        users.forEach((item) => {
-          if (item["children"] && item["children"].length) {
-            fetchUser(item.children);
-          } else {
-            if (item.isUser) {
-              let nitem = { ...item };
-              nitem.label = `${nitem.name}(${nitem.orgName})`;
-              userList.push(nitem);
-            }
-          }
-        });
-      };
-      fetchUser(this.orgUsers);
-
-      this.userList = userList;
-    },
-    labelChange() {
-      if (!this.filterLabel) {
-        this.switchUserType(this.userType);
-      } else {
-        const escapeRegexpString = (value = "") =>
-          String(value).replace(/[|\\{}()[\]^$+*?.]/g, "\\$&");
-        const reg = new RegExp(escapeRegexpString(this.filterLabel), "i");
-
-        if (this.userType === "org") {
-          this.userTree = this.userList.filter((item) => reg.test(item.name));
-        } else {
-          this.userTree = this.courseUsers.filter((item) =>
-            reg.test(item.name)
-          );
-        }
-      }
-      this.$refs.UserTree.setCheckedKeys(this.selectedUserIds);
-    },
-    selectNodeAll(checked, data) {
-      let users = [];
-      const getUserIds = (list) => {
-        list.forEach((item) => {
-          item.selected = checked;
-          if (item.children && item.children.length) {
-            getUserIds(item.children);
-          } else {
-            if (item.isUser) users.push(item);
-          }
-        });
-      };
-      getUserIds(data.children);
-
-      const userIds = users.map((u) => u.id);
-      const selectedUserIds = this.selectedUsers.map((item) => item.id);
-
-      let deleteUserIds = [];
-      userIds.forEach((userId, uindex) => {
-        const userPos = selectedUserIds.indexOf(userId);
-        const includeUser = userPos !== -1;
-        if (checked) {
-          if (!includeUser) this.selectedUsers.push(users[uindex]);
-        } else {
-          if (includeUser) {
-            deleteUserIds.push(userId);
-          }
-        }
-      });
-      this.selectedUsers = this.selectedUsers.filter(
-        (u) => !deleteUserIds.includes(u.id)
-      );
-      this.selectedUserIds = this.selectedUsers.map((item) => item.id);
-      this.$refs.UserTree.setCheckedKeys(this.selectedUserIds);
-      this.$refs.modalFormRef.validateField("users");
-    },
-    updateSelectedUsersFromUserIds() {
-      this.selectedUsers = this.userList.filter((user) =>
-        this.selectedUserIds.includes(user.id)
-      );
-    },
-    userChange(checked, user) {
-      if (checked) {
-        this.selectedUsers.push(user);
-      } else {
-        this.selectedUsers = this.selectedUsers.filter(
-          (item) => item.id !== user.id
-        );
-      }
-      this.selectedUserIds = this.selectedUsers.map((item) => item.id);
-      this.$refs.modalFormRef.validateField("users");
-    },
-    toDeleteUser(user) {
-      const pos = this.selectedUsers.findIndex((item) => item.id === user.id);
-      this.selectedUsers.splice(pos, 1);
-      this.selectedUserIds = this.selectedUsers.map((item) => item.id);
-      this.$refs.UserTree.setCheckedKeys(this.selectedUserIds);
-      this.$refs.modalFormRef.validateField("users");
-    },
-    // question
-    parseStructs() {
-      this.selectedQuestionIds = this.instance.questions.map((q) => q.id);
-      let paperStructs = [];
-      let struct = null;
-      this.paperStructure.forEach((item) => {
-        if (item.mainFirstSub) {
-          if (struct) paperStructs.push(struct);
-          struct = {
-            mainId: item.mainId,
-            mainTitle: item.mainTitle,
-            mainNumber: item.mainNumber,
-            selected: false,
-            children: [],
-          };
-        }
-        struct.children.push({
-          ...item,
-          disabled: this.disabledQuestionIds.includes(item.id),
-          selected: this.selectedQuestionIds.includes(item.id),
-        });
-      });
-      if (struct) paperStructs.push(struct);
-      this.paperStructs = paperStructs;
-    },
-    selectQuestionAll(checked, mainItem) {
-      mainItem.children.forEach((q) => {
-        if (!q.disabled) q.selected = checked;
-      });
-      this.questionChange();
-    },
-    updateSelectedQuestions() {
-      let selectedQuestions = [];
-      let selectedQuestionIds = [];
-      this.paperStructs.forEach((s) => {
-        s.children.forEach((q) => {
-          if (q.selected && !q.disabled) {
-            selectedQuestions.push(q);
-            selectedQuestionIds.push(q.id);
-          }
-        });
-      });
-      this.selectedQuestions = selectedQuestions;
-      this.selectedQuestionIds = selectedQuestionIds;
-    },
-    questionChange() {
-      this.updateSelectedQuestions();
-      this.$refs.modalFormRef.validateField("questions");
-    },
-    getQuestionStruct(questions) {
-      let structs = questions.map((item) => {
-        return {
-          mainNumber: item.mainNumber,
-          subNumber: item.subNumber,
-        };
-      });
-      structs.sort(
-        (a, b) => a.mainNumber - b.mainNumber || a.subNumber - b.subNumber
-      );
-      return structs
-        .map((item) => `${item.mainNumber}_${item.subNumber}`)
-        .join();
-    },
-    // confirm
-    async confirm() {
-      const valid = await this.$refs.modalFormRef.validate().catch(() => {});
-      if (!valid) return;
-
-      let datas = { ...this.instance };
-      datas.markerList = this.selectedUsers.map((item) => {
-        return {
-          id: item.id,
-          name: item.name,
-          loginName: item.loginName,
-          orgName: item.orgName,
-        };
-      });
-      datas.questions = this.selectedQuestions.map((item) => {
-        let nitem = { ...item };
-        delete nitem.disabled;
-        delete nitem.selected;
-        return nitem;
-      });
-      // 评卷题目变动时,清空评卷区
-      if (
-        this.getQuestionStruct(this.instance.questions) !==
-        this.getQuestionStruct(datas.questions)
-      ) {
-        datas.pictureConfigList = [];
-      }
-      this.$emit("modified", datas);
-      this.cancel();
-    },
-  },
-};
-</script>

+ 0 - 104
src/modules/stmms/components/markParam/ModifyPaperMarker.vue

@@ -1,104 +0,0 @@
-<template>
-  <el-dialog
-    class="modify-mark-params"
-    :visible.sync="modalIsShow"
-    title="评卷员设置"
-    top="0"
-    :close-on-click-modal="false"
-    :close-on-press-escape="false"
-    append-to-body
-    fullscreen
-    @open="visibleChange"
-    @close="dialogClose"
-  >
-    <div class="mark-body" v-if="dataReady">
-      <mark-paper-marker
-        ref="MarkPaperMarker"
-        :datas="infos"
-        only-marker
-      ></mark-paper-marker>
-    </div>
-
-    <div slot="footer"></div>
-  </el-dialog>
-</template>
-
-<script>
-import MarkPaperMarker from "./MarkParamMarker.vue";
-// import paramData from "./paramData";
-import { calcSum } from "@/plugins/utils";
-
-export default {
-  name: "modify-paper-marker",
-  components: { MarkPaperMarker },
-  props: {
-    instance: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      modalIsShow: false,
-      infos: {
-        basicPaperInfo: {},
-        paperStructureInfo: [],
-        groupInfo: [],
-        paperStat: {},
-      },
-      dataReady: false,
-    };
-  },
-  methods: {
-    dialogClose() {
-      this.dataReady = false;
-      this.$emit("close");
-    },
-    visibleChange() {
-      if (!this.instance.paperInfoJson) return;
-
-      const { paperStructureInfo, groupInfo } = JSON.parse(
-        this.instance.paperInfoJson
-      );
-      this.infos = {
-        paperStructureInfo: [
-          ...paperStructureInfo.objectiveQuestionList,
-          ...paperStructureInfo.subjectiveQuestionList,
-        ],
-        groupInfo,
-        basicPaperInfo: { ...this.instance },
-      };
-      this.infos.paperStat = this.statPaperStructure(
-        this.infos.paperStructureInfo
-      );
-
-      this.dataReady = true;
-    },
-    statPaperStructure(paperStructureInfo) {
-      const questionCount = paperStructureInfo.length;
-
-      const subjectiveQuestionCount = paperStructureInfo.filter(
-        (item) => item.qType === "subjective"
-      ).length;
-
-      return {
-        questionCount,
-        paperTotalScore: calcSum(
-          paperStructureInfo.map((item) => item.totalScore || 0)
-        ),
-        subjectiveQuestionCount,
-        objectiveQuestionCount: questionCount - subjectiveQuestionCount,
-        structChanged: false,
-      };
-    },
-    cancel() {
-      this.modalIsShow = false;
-    },
-    open() {
-      this.modalIsShow = true;
-    },
-  },
-};
-</script>

+ 0 - 276
src/modules/stmms/components/markParam/areaCropper/AreaCropper.vue

@@ -1,276 +0,0 @@
-<template>
-  <div class="area-cropper">
-    <div class="cropper-img">
-      <img
-        v-if="paper.imgUrl"
-        ref="imgDom"
-        :src="paper.imgUrl"
-        @load="imgLoad"
-      />
-    </div>
-    <div
-      class="cropper-areas"
-      v-move-ele.prevent="{
-        moveStart: ($event) => {
-          boxMouseDown($event);
-        },
-        moveElement: (pos, $event) => {
-          boxMove($event);
-        },
-        moveStop: () => {
-          boxMoveStop();
-        },
-      }"
-    >
-      <area-item
-        v-for="area in areas"
-        :key="area.key"
-        :data="area"
-        :cur-element="curArea"
-        @del-element="removeArea"
-        @act-element="actCurArea"
-        @resize-over="modifyArea"
-      ></area-item>
-      <!-- 拖动选框 -->
-      <div
-        v-if="selectionStyles.w"
-        class="area-selection"
-        :style="{
-          width: selectionStyles.w + 'px',
-          height: selectionStyles.h + 'px',
-          top: selectionStyles.y + 'px',
-          left: selectionStyles.x + 'px',
-        }"
-      ></div>
-    </div>
-  </div>
-</template>
-
-<script>
-import MoveEle from "./move-ele";
-import AreaItem from "./ElementItem.vue";
-import { randomCode } from "@/plugins/utils";
-
-export default {
-  name: "area-cropper",
-  components: { AreaItem },
-  directives: { MoveEle },
-  props: {
-    paper: {
-      type: Object,
-      default() {
-        return {
-          imgUrl: "",
-          areas: [],
-        };
-      },
-    },
-  },
-  data() {
-    return {
-      areas: [],
-      initArea: { id: null, i: 0, x: 0, y: 0, w: 0, h: 0, zIndex: 0 },
-      curArea: {},
-      selectionStartPos: { x: 0, y: 0 },
-      selectionStyles: { x: 0, y: 0, w: 0, h: 0 },
-      IS_SELECT_ACTION: false,
-      imgDisplayWidth: 0,
-      imgDisplayHeight: 0,
-    };
-  },
-  mounted() {
-    window.addEventListener("resize", this.windowResizeEvent);
-    document.addEventListener("keydown", this.keyEvent);
-  },
-  methods: {
-    getMax(arr) {
-      return Math.max.apply(null, arr);
-    },
-    toFixed(num, precision = 2) {
-      return num.toFixed(precision) * 1;
-    },
-    imgLoad() {
-      this.transformPicConfig(this.paper.areas);
-      this.$emit("paper-load");
-    },
-    windowResizeEvent() {
-      const { clientWidth, clientHeight } = this.$refs.imgDom;
-      const hRate = clientHeight / this.imgDisplayHeight;
-      const wRate = clientWidth / this.imgDisplayWidth;
-      this.areas = this.areas.map((area) => {
-        return Object.assign({}, area, {
-          key: `key-${randomCode()}`,
-          x: area.x * wRate,
-          y: area.y * hRate,
-          w: area.w * wRate,
-          h: area.h * hRate,
-        });
-      });
-      this.imgDisplayWidth = clientWidth;
-      this.imgDisplayHeight = clientHeight;
-    },
-    keyEvent(e) {
-      if (
-        e.code === "Delete" &&
-        !e.ctrlKey &&
-        !e.altKey &&
-        !e.shiftKey &&
-        !e.repeat
-      ) {
-        if (!this.curArea.id) return;
-        e.preventDefault();
-        this.removeArea(this.curArea);
-        return;
-      }
-    },
-    transformPicConfig(areas) {
-      const { clientWidth, clientHeight } = this.$refs.imgDom;
-
-      this.areas = areas.map((area, index) => {
-        let narea = {
-          id: `id-${randomCode()}`,
-          key: `key-${randomCode()}`,
-          zIndex: index + 99,
-        };
-        if (Object.keys(area).join("") === "i") {
-          narea = {
-            ...narea,
-            x: 0,
-            y: 0,
-            w: clientWidth,
-            h: clientHeight,
-          };
-        } else {
-          narea = {
-            ...narea,
-            x: area.x * clientWidth,
-            y: area.y * clientHeight,
-            w: area.w * clientWidth,
-            h: area.h * clientHeight,
-          };
-        }
-        return narea;
-      });
-      this.imgDisplayWidth = clientWidth;
-      this.imgDisplayHeight = clientHeight;
-    },
-    addArea(data) {
-      let area = Object.assign({}, this.initArea, data);
-      const maxZIndex = this.areas.length
-        ? this.getMax(this.areas.map((elem) => elem.zIndex))
-        : 0;
-      area.id = `id-${randomCode()}`;
-      area.key = `key-${randomCode()}`;
-      area.zIndex = maxZIndex + 1;
-      this.areas.push(area);
-      this.actCurArea(area);
-      this.emitChange();
-    },
-    modifyArea(area) {
-      const pos = this.areas.findIndex((elem) => elem.id === area.id);
-      this.areas.splice(pos, 1, area);
-      this.actCurArea(area);
-      this.emitChange();
-    },
-    removeArea(area) {
-      const pos = this.areas.findIndex((elem) => elem.id === area.id);
-      this.areas.splice(pos, 1);
-      if (this.areas.length) this.actCurArea(this.areas[0]);
-      this.emitChange();
-    },
-    actCurArea(area) {
-      this.curArea = area;
-      this.$emit("curarea-change", area);
-    },
-    curareaChange(area) {
-      if (area.id !== this.curArea.id) this.curArea = {};
-    },
-    emitChange() {
-      const { clientWidth, clientHeight } = this.$refs.imgDom;
-
-      const areas = this.areas.map((item) => {
-        return {
-          id: item.id,
-          x: this.toFixed(item.x / clientWidth, 4),
-          y: this.toFixed(item.y / clientHeight),
-          w: this.toFixed(item.w / clientWidth, 4),
-          h: this.toFixed(item.h / clientHeight),
-          // 是否覆盖整个页面,允许2px的误差
-          isFull:
-            item.x <= 2 &&
-            item.y <= 2 &&
-            item.w + 2 >= clientWidth &&
-            item.h + 2 >= clientHeight,
-        };
-      });
-
-      this.$emit("change", areas);
-    },
-    getOffsetInfo(dom, endParentClass = "cropper-areas") {
-      let parentNode = dom;
-      let parentNodeClass = parentNode.getAttribute("class") || "";
-      let offsetTop = 0,
-        offsetLeft = 0;
-      while (!parentNodeClass.includes(endParentClass)) {
-        if (parentNode.offsetParent) {
-          offsetTop += parentNode.offsetTop;
-          offsetLeft += parentNode.offsetLeft;
-          parentNode = parentNode.offsetParent;
-        } else {
-          offsetTop += parentNode.clientTop;
-          offsetLeft += parentNode.clientLeft;
-          parentNode = parentNode.parentNode;
-        }
-        parentNodeClass = parentNode.getAttribute("class") || "";
-      }
-      return {
-        offsetLeft,
-        offsetTop,
-      };
-    },
-    boxMouseDown($event) {
-      const { offsetLeft: x, offsetTop: y } = this.getOffsetInfo($event.target);
-      this.selectionStartPos.x = x + $event.offsetX;
-      this.selectionStartPos.y = y + $event.offsetY;
-    },
-    boxMove($event) {
-      const { offsetLeft: x, offsetTop: y } = this.getOffsetInfo($event.target);
-      const selectionEndPos = {
-        x: x + $event.offsetX,
-        y: y + $event.offsetY,
-      };
-      const sPos = {
-        x: Math.min(this.selectionStartPos.x, selectionEndPos.x),
-        y: Math.min(this.selectionStartPos.y, selectionEndPos.y),
-      };
-      const ePos = {
-        x: Math.max(this.selectionStartPos.x, selectionEndPos.x),
-        y: Math.max(this.selectionStartPos.y, selectionEndPos.y),
-      };
-
-      this.selectionStyles = {
-        ...sPos,
-        w: ePos.x - sPos.x,
-        h: ePos.y - sPos.y,
-      };
-      this.IS_SELECT_ACTION = true;
-    },
-    boxMoveStop() {
-      if (
-        this.IS_SELECT_ACTION &&
-        this.selectionStyles.w > 20 &&
-        this.selectionStyles.h > 20
-      )
-        this.addArea(this.selectionStyles);
-
-      this.selectionStyles = { x: 0, y: 0, w: 0, h: 0 };
-      this.selectionStartPos = { x: 0, y: 0 };
-      this.IS_SELECT_ACTION = false;
-    },
-  },
-  beforeDestroy() {
-    window.removeEventListener("resize", this.windowResizeEvent);
-    document.removeEventListener("keydown", this.keyEvent);
-  },
-};
-</script>

+ 0 - 77
src/modules/stmms/components/markParam/areaCropper/ElementItem.vue

@@ -1,77 +0,0 @@
-<template>
-  <div class="element-item">
-    <element-resize
-      v-model="elemData"
-      :class="{ 'element-resize-act': curElement.id === data.id }"
-      :active="active"
-      :element-pk="data.id"
-      :style="{ zIndex: data.zIndex }"
-      isCompact
-      @resize-over="resizeOver"
-      @on-click="activeCurElement"
-    >
-      <div class="element-item-body" :style="styles" :id="data.id"></div>
-      <div class="element-delete" @click="toDelete">
-        <i class="el-icon-error"></i>
-      </div>
-    </element-resize>
-  </div>
-</template>
-
-<script>
-import ElementResize from "./ElementResize";
-import { objAssign } from "@/plugins/utils";
-
-export default {
-  name: "element-item",
-  components: {
-    ElementResize,
-  },
-  props: {
-    data: {
-      type: Object,
-    },
-    curElement: {
-      type: Object,
-      default() {
-        return {};
-      },
-    },
-  },
-  data() {
-    return {
-      elemData: {
-        x: 0,
-        y: 0,
-        w: 0,
-        h: 0,
-      },
-      styles: {},
-      active: ["r", "rb", "b", "lb", "l", "lt", "t", "rt"],
-    };
-  },
-  created() {
-    this.init();
-  },
-  methods: {
-    init() {
-      this.elemData = objAssign(this.elemData, this.data);
-      this.styles = {
-        left: this.data.x + "px",
-        top: this.data.y + "px",
-        width: this.data.w + "px",
-        height: this.data.h + "px",
-      };
-    },
-    resizeOver() {
-      this.$emit("resize-over", Object.assign({}, this.data, this.elemData));
-    },
-    activeCurElement() {
-      this.$emit("act-element", this.data);
-    },
-    toDelete() {
-      this.$emit("del-element", this.data);
-    },
-  },
-};
-</script>

+ 0 - 669
src/modules/stmms/components/markParam/areaCropper/ElementResize.vue

@@ -1,669 +0,0 @@
-<template>
-  <div
-    :class="classes"
-    :style="styles"
-    v-move-ele.prevent.stop="{
-      moveStart,
-      moveElement,
-      moveStop: moveElementOver,
-    }"
-  >
-    <slot></slot>
-    <div class="resize-control">
-      <div
-        v-for="(control, index) in controlPoints"
-        :key="index"
-        :class="control.classes"
-        v-move-ele.prevent.stop="{
-          moveElement: control.movePoint,
-          moveStop: control.movePointOver,
-        }"
-      ></div>
-      <div class="control-line control-line-left"></div>
-      <div class="control-line control-line-right"></div>
-      <div class="control-line control-line-top"></div>
-      <div class="control-line control-line-bottom"></div>
-    </div>
-  </div>
-</template>
-
-<script>
-import MoveEle from "./move-ele";
-
-export default {
-  name: "element-resize",
-  directives: { MoveEle },
-  props: {
-    value: {
-      type: Object,
-      required: true,
-    },
-    active: {
-      type: Array,
-      default() {
-        return ["r", "rb", "b", "lb", "l", "lt", "t", "rt"];
-      },
-    },
-    move: {
-      type: Boolean,
-      default: true,
-    },
-    minWidth: {
-      type: Number,
-      default: 60,
-      validator(val) {
-        return val >= 0;
-      },
-    },
-    maxWidth: {
-      type: Number,
-      default: 0,
-      validator(val) {
-        return val >= 0;
-      },
-    },
-    minHeight: {
-      type: Number,
-      default: 40,
-      validator(val) {
-        return val >= 0;
-      },
-    },
-    maxHeight: {
-      type: Number,
-      default: 0,
-      validator(val) {
-        return val >= 0;
-      },
-    },
-    fitParent: {
-      type: Array,
-      default() {
-        return ["w", "h"];
-      },
-    },
-    isCompact: {
-      type: Boolean,
-      default: false,
-    },
-    elementPk: {
-      type: String,
-      default: "",
-    },
-  },
-  data() {
-    return {
-      sizePosOrigin: {
-        x: 0,
-        y: 0,
-        w: 0,
-        h: 0,
-      },
-      offsetTopOrigin: 0,
-      sizePos: {
-        x: 0,
-        y: 0,
-        w: 0,
-        h: 0,
-      },
-      lastSizePos: {},
-      initOver: false,
-      controlPoints: [],
-      positionType: "static",
-      parentNodeSize: {
-        w: 0,
-        h: 0,
-      },
-      validSizePos: {},
-      points: {},
-    };
-  },
-  computed: {
-    styles() {
-      return this.initOver
-        ? {
-            left: this.sizePos.x + "px",
-            top: this.sizePos.y + "px",
-            width: this.sizePos.w + "px",
-            height: this.sizePos.h + "px",
-            position: this.positionType,
-          }
-        : {};
-    },
-    classes() {
-      return [
-        "element-resize",
-        {
-          "element-resize-move": this.move,
-          "element-resize-init": this.initOver,
-          "element-resize-compact": this.isCompact,
-        },
-      ];
-    },
-    fitParentTypeWidth() {
-      return this.fitParent.includes("w");
-    },
-    fitParentTypeHeight() {
-      return this.fitParent.includes("h");
-    },
-  },
-  created() {
-    this.initControlPoints();
-  },
-  mounted() {
-    this.initSize();
-  },
-  methods: {
-    initControlPoints() {
-      const posName = {
-        l: "Left",
-        r: "Right",
-        t: "Top",
-        b: "Bottom",
-      };
-      this.controlPoints = this.active.map((type) => {
-        const posFullName = type
-          .split("")
-          .map((item) => {
-            return posName[item];
-          })
-          .join("");
-        return {
-          classes: ["control-point", `control-point-${type}`],
-          movePoint: this[`move${posFullName}Point`],
-          movePointOver: this.moveOver,
-        };
-      });
-    },
-    initSize() {
-      const resizeDom = this.$el.childNodes[0];
-      this.positionType = window.getComputedStyle(resizeDom).position;
-      this.sizePos = { ...this.value };
-      this.lastSizePos = { ...this.value };
-      this.sizePosOrigin = { ...this.value };
-      if (this.positionType === "relative")
-        this.offsetTopOrigin = this.$el.offsetTop;
-      this.initValidSizePos();
-      this.initOver = true;
-    },
-    initValidSizePos() {
-      const s = this.sizePosOrigin;
-      const points = {
-        rt: {
-          x: s.x + s.w,
-          y: s.y,
-        },
-        lt: {
-          x: s.x,
-          y: s.y,
-        },
-        lb: {
-          x: s.x,
-          y: s.y + s.h,
-        },
-        rb: {
-          x: s.x + s.w,
-          y: s.y + s.h,
-        },
-      };
-      const action = {
-        rt: () => {
-          const point = points.rt;
-          return {
-            min: {
-              x: point.x - this.minWidth,
-              y: point.y,
-            },
-            max: {
-              x: point.x - this.maxWidth,
-              y: point.y,
-            },
-          };
-        },
-        lt: () => {
-          const point = points.lt;
-          return {
-            min: {
-              x: point.x,
-              y: point.y,
-            },
-            max: {
-              x: point.x,
-              y: point.y,
-            },
-          };
-        },
-        lb: () => {
-          const point = points.lb;
-          return {
-            min: {
-              x: point.x,
-              y: point.y - this.minHeight,
-            },
-            max: {
-              x: point.x,
-              y: point.y - this.maxHeight,
-            },
-          };
-        },
-        rb: () => {
-          const point = points.rb;
-          return {
-            min: {
-              x: point.x - this.minWidth,
-              y: point.y - this.minHeight,
-            },
-            max: {
-              x: point.x - this.maxWidth,
-              y: point.y - this.maxHeight,
-            },
-          };
-        },
-      };
-
-      this.validSizePos = {
-        rt: action.rt(),
-        lt: action.lt(),
-        lb: action.lb(),
-        rb: action.rb(),
-      };
-    },
-    fetchValidSizePos(sizePos, actionType) {
-      const staticPointConfig = {
-        left: "rt",
-        "left-bottom": "rt",
-        bottom: "lt",
-        "right-bottom": "lt",
-        right: "lb",
-        "right-top": "lb",
-        top: "rb",
-        "left-top": "rb",
-      };
-      const validSizePos = this.validSizePos[staticPointConfig[actionType]];
-
-      if (sizePos.w <= this.minWidth) {
-        sizePos.w = this.minWidth;
-        sizePos.x = validSizePos.min.x;
-      } else if (this.maxWidth !== 0 && sizePos.w >= this.maxWidth) {
-        sizePos.w = this.maxWidth;
-        sizePos.x = validSizePos.max.x;
-      }
-
-      if (sizePos.h <= this.minHeight) {
-        sizePos.h = this.minHeight;
-        sizePos.y = validSizePos.min.y;
-      } else if (this.maxHeight !== 0 && sizePos.h >= this.maxHeight) {
-        sizePos.h = this.maxHeight;
-        sizePos.y = validSizePos.max.y;
-      }
-
-      if (!this.fitParent.length) {
-        this.lastSizePos = { ...sizePos };
-        return sizePos;
-      }
-
-      // 不同的定位方式,计算方式有差异
-      this.parentNodeSize = {
-        w: this.$el.offsetParent.offsetWidth,
-        h: this.$el.offsetParent.offsetHeight,
-      };
-
-      if (this.fitParentTypeWidth) {
-        if (sizePos.x <= 0) {
-          sizePos.x = 0;
-          if (actionType.includes("left")) sizePos.w = this.lastSizePos.w;
-        }
-
-        if (sizePos.x + sizePos.w > this.parentNodeSize.w) {
-          sizePos.x = this.lastSizePos.x;
-          sizePos.w = this.parentNodeSize.w - sizePos.x;
-        }
-      }
-
-      if (this.fitParentTypeHeight) {
-        if (this.positionType === "relative") {
-          const elOffsetTop = this.$el.offsetTop;
-          if (this.sizePosOrigin.y - sizePos.y >= this.offsetTopOrigin) {
-            sizePos.h = this.lastSizePos.h;
-            sizePos.y = this.sizePosOrigin.y - this.offsetTopOrigin;
-          }
-          if (elOffsetTop + sizePos.h >= this.parentNodeSize.h) {
-            sizePos.y = this.lastSizePos.y;
-            sizePos.h = this.lastSizePos.h;
-          }
-        } else {
-          if (sizePos.y <= 0) {
-            sizePos.y = 0;
-            if (actionType.includes("top")) sizePos.h = this.lastSizePos.h;
-          }
-          if (sizePos.y + sizePos.h > this.parentNodeSize.h) {
-            sizePos.y = this.lastSizePos.y;
-            sizePos.h = this.parentNodeSize.h - sizePos.y;
-          }
-        }
-      }
-      this.lastSizePos = { ...sizePos };
-      return sizePos;
-    },
-    getLeftSize(left) {
-      return {
-        w: -left + this.sizePosOrigin.w,
-        x: left + this.sizePosOrigin.x,
-      };
-    },
-    getRightSize(left) {
-      return {
-        w: left + this.sizePosOrigin.w,
-      };
-    },
-    getTopSize(top) {
-      return {
-        h: -top + this.sizePosOrigin.h,
-        y: top + this.sizePosOrigin.y,
-      };
-    },
-    getBottomSize(top) {
-      return {
-        h: top + this.sizePosOrigin.h,
-      };
-    },
-    moveLeftPoint({ left }) {
-      console.log(this.sizePosOrigin);
-      const sp = { ...this.sizePos, ...this.getLeftSize(left) };
-      this.sizePos = { ...this.fetchValidSizePos(sp, "left") };
-      this.emitChange();
-    },
-    moveRightPoint({ left }) {
-      const sp = { ...this.sizePos, ...this.getRightSize(left) };
-      this.sizePos = { ...this.fetchValidSizePos(sp, "right") };
-      this.emitChange();
-    },
-    moveTopPoint({ top }) {
-      const sp = { ...this.sizePos, ...this.getTopSize(top) };
-      this.sizePos = { ...this.fetchValidSizePos(sp, "top") };
-      this.emitChange();
-    },
-    moveBottomPoint({ top }) {
-      const sp = { ...this.sizePos, ...this.getBottomSize(top) };
-      this.sizePos = { ...this.fetchValidSizePos(sp, "bottom") };
-      this.emitChange();
-    },
-    moveLeftTopPoint({ left, top }) {
-      const sp = {
-        ...this.sizePos,
-        ...this.getLeftSize(left),
-        ...this.getTopSize(top),
-      };
-      this.sizePos = { ...this.fetchValidSizePos(sp, "left-top") };
-      this.emitChange();
-    },
-    moveRightTopPoint({ left, top }) {
-      const sp = {
-        ...this.sizePos,
-        ...this.getRightSize(left),
-        ...this.getTopSize(top),
-      };
-      this.sizePos = { ...this.fetchValidSizePos(sp, "right-top") };
-      this.emitChange();
-    },
-    moveLeftBottomPoint({ left, top }) {
-      const sp = {
-        ...this.sizePos,
-        ...this.getLeftSize(left),
-        ...this.getBottomSize(top),
-      };
-      this.sizePos = { ...this.fetchValidSizePos(sp, "left-bottom") };
-      this.emitChange();
-    },
-    moveRightBottomPoint({ left, top }) {
-      const sp = {
-        ...this.sizePos,
-        ...this.getRightSize(left),
-        ...this.getBottomSize(top),
-      };
-      this.sizePos = { ...this.fetchValidSizePos(sp, "right-bottom") };
-      this.emitChange();
-    },
-    moveOver() {
-      this.sizePosOrigin = { ...this.sizePos };
-      this.lastSizePos = { ...this.sizePos };
-      if (this.positionType === "relative")
-        this.offsetTopOrigin = this.$el.offsetTop < 0 ? 0 : this.$el.offsetTop;
-
-      this.initValidSizePos();
-      this.$emit("resize-over", this.sizePos);
-    },
-    moveStart() {
-      this.$emit("on-click");
-    },
-    moveElement({ left, top }) {
-      if (!this.move) return;
-
-      const sp = {
-        ...this.sizePos,
-        ...{
-          x: left + this.sizePosOrigin.x,
-          y: top + this.sizePosOrigin.y,
-        },
-      };
-      this.sizePos = { ...this.fetchValidSizePos(sp, "move") };
-      this.emitChange();
-    },
-    moveElementOver() {
-      if (!this.move) return;
-      this.moveOver();
-    },
-    emitChange() {
-      this.$emit("input", this.sizePos);
-      this.$emit("change", this.sizePos);
-    },
-  },
-};
-</script>
-
-<style lang="scss" scope>
-.element-resize {
-  position: static;
-  z-index: auto;
-  background: #fff;
-  box-sizing: content-box;
-
-  &-move {
-    cursor: move;
-  }
-
-  &-init {
-    > div:first-child {
-      width: 100% !important;
-      height: 100% !important;
-      position: relative !important;
-      top: 0 !important;
-      left: 0 !important;
-      overflow: hidden;
-    }
-  }
-  .control-point {
-    position: absolute;
-    width: 8px;
-    height: 8px;
-    border-radius: 50%;
-    background: #3a5ae5;
-    z-index: 99;
-    &-l {
-      left: 0;
-      top: 50%;
-      width: 5px;
-      height: 20px;
-      margin-top: -10px;
-      margin-left: -3px;
-      border-radius: 0;
-      padding-top: 3px;
-      cursor: w-resize;
-      text-align: center;
-      color: #fff;
-
-      &::before {
-        content: ".";
-        display: block;
-        font-size: 16px;
-        line-height: 1;
-        margin-top: -9px;
-      }
-      &::after {
-        content: ".";
-        display: block;
-        font-size: 16px;
-        line-height: 1;
-        margin-top: -9px;
-      }
-    }
-    &-lt {
-      left: 0;
-      top: 0;
-      margin-top: -5px;
-      margin-left: -5px;
-      cursor: nw-resize;
-    }
-    &-lb {
-      left: 0;
-      bottom: 0;
-      margin-bottom: -5px;
-      margin-left: -5px;
-      cursor: sw-resize;
-    }
-    &-r {
-      right: 0;
-      top: 50%;
-      width: 5px;
-      height: 20px;
-      margin-top: -10px;
-      margin-right: -3px;
-      cursor: e-resize;
-      border-radius: 0;
-      padding-top: 3px;
-      text-align: center;
-      color: #fff;
-
-      &::before {
-        content: ".";
-        display: block;
-        font-size: 16px;
-        line-height: 1;
-        margin-top: -9px;
-      }
-      &::after {
-        content: ".";
-        display: block;
-        font-size: 16px;
-        line-height: 1;
-        margin-top: -9px;
-      }
-    }
-    &-rt {
-      right: 0;
-      top: 0;
-      margin-top: -5px;
-      margin-right: -5px;
-      cursor: ne-resize;
-    }
-    &-rb {
-      right: 0;
-      bottom: 0;
-      margin-bottom: -5px;
-      margin-right: -5px;
-      cursor: se-resize;
-    }
-    &-t {
-      left: 50%;
-      top: 0;
-      width: 30px;
-      height: 5px;
-      border-radius: 0;
-      margin-top: -3px;
-      margin-left: -15px;
-      cursor: n-resize;
-      text-align: center;
-      color: #fff;
-      &::before {
-        content: "...";
-        display: inline-block;
-        vertical-align: top;
-        font-size: 16px;
-        line-height: 1;
-        margin-top: -10px;
-      }
-    }
-    &-b {
-      left: 50%;
-      bottom: 0;
-      width: 30px;
-      height: 5px;
-      border-radius: 0;
-      margin-bottom: -3px;
-      margin-left: -15px;
-      cursor: s-resize;
-      text-align: center;
-      color: #fff;
-
-      &::before {
-        content: "...";
-        display: inline-block;
-        vertical-align: top;
-        font-size: 16px;
-        line-height: 1;
-        margin-top: -10px;
-      }
-    }
-  }
-  .control-line {
-    position: absolute;
-    z-index: 98;
-
-    &-left {
-      height: 100%;
-      left: -1px;
-      top: 0;
-      border-left: 1px solid #3a5ae5;
-    }
-    &-right {
-      height: 100%;
-      right: -1px;
-      top: 0;
-      border-left: 1px solid #3a5ae5;
-    }
-    &-top {
-      width: 100%;
-      left: 0;
-      top: -1px;
-      border-top: 1px solid #3a5ae5;
-    }
-    &-bottom {
-      width: 100%;
-      left: 0;
-      bottom: -1px;
-      border-top: 1px solid #3a5ae5;
-    }
-  }
-
-  &-compact {
-    .control-line {
-      &-left {
-        left: 0;
-        border-left: 1px solid #bbb;
-      }
-      &-right {
-        right: 0;
-        border-left: 1px solid #bbb;
-      }
-      &-top {
-        top: 0;
-        border-top: 1px solid #bbb;
-      }
-      &-bottom {
-        bottom: 0;
-        border-top: 1px solid #bbb;
-      }
-    }
-  }
-}
-</style>

+ 0 - 49
src/modules/stmms/components/markParam/areaCropper/move-ele.js

@@ -1,49 +0,0 @@
-module.exports = {
-  inserted(el, { value, modifiers }) {
-    let [_x, _y] = [0, 0];
-    // 只允许鼠标左键触发
-    let moveHandle = function (e) {
-      if (e.button !== 0) return;
-      if (modifiers.prevent) {
-        e.preventDefault();
-      }
-      if (modifiers.stop) {
-        e.stopPropagation();
-      }
-
-      let left = e.pageX - _x;
-      let top = e.pageY - _y;
-
-      value.moveElement({ left, top }, e);
-    };
-
-    let upHandle = function (e) {
-      if (e.button !== 0) return;
-      if (modifiers.prevent) {
-        e.preventDefault();
-      }
-      if (modifiers.stop) {
-        e.stopPropagation();
-      }
-      value.moveStop && value.moveStop(e);
-      document.removeEventListener("mousemove", moveHandle);
-      document.removeEventListener("mouseup", upHandle);
-    };
-
-    el.addEventListener("mousedown", function (e) {
-      if (e.button !== 0) return;
-      if (modifiers.prevent) {
-        e.preventDefault();
-      }
-      if (modifiers.stop) {
-        e.stopPropagation();
-      }
-      _x = e.pageX;
-      _y = e.pageY;
-      value.moveStart && value.moveStart(e);
-
-      document.addEventListener("mousemove", moveHandle);
-      document.addEventListener("mouseup", upHandle);
-    });
-  },
-};

+ 0 - 186
src/modules/stmms/components/markParam/markPaperClass.vue

@@ -1,186 +0,0 @@
-<template>
-  <div class="mark-paper-class">
-    <div class="box-justify mb-2">
-      <div>
-        <span>分班阅卷:</span>
-        <el-switch
-          v-model="openClassReading"
-          @change="openClassReadingChange"
-        ></el-switch>
-      </div>
-      <mark-status
-        v-if="openClassReading"
-        class="mr-4"
-        field="markerClass"
-      ></mark-status>
-    </div>
-
-    <div v-if="openClassReading" class="part-box part-box-pad">
-      <el-table :data="markerClassList" border>
-        <el-table-column type="index" width="50"> </el-table-column>
-        <el-table-column label="评卷员" width="200">
-          <template slot-scope="scope">
-            <el-tag class="tag-spin" size="medium">
-              {{ scope.row.name }}({{ scope.row.orgName }})
-            </el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column label="评卷班级">
-          <template slot-scope="scope">
-            <el-tag
-              v-for="item in scope.row.className"
-              :key="item"
-              size="medium"
-              type="info"
-              class="mb-1 mr-1"
-            >
-              {{ item }}
-            </el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column class-name="action-column" label="操作" width="100">
-          <template slot-scope="scope">
-            <el-button
-              class="btn-primary"
-              type="text"
-              @click="toEditClass(scope.row)"
-              >选择班级</el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
-    </div>
-
-    <!-- SelectClassByCourse -->
-    <select-class-by-course
-      ref="SelectClassByCourse"
-      :filter-data="{
-        examId: datas.basicPaperInfo.examId,
-        paperNumber: datas.basicPaperInfo.paperNumber,
-      }"
-      :selected-ids="selectedClassIds"
-      :disable-ids="disabledClassIds"
-      @confirm="classSelected"
-    ></select-class-by-course>
-  </div>
-</template>
-
-<script>
-import SelectClassByCourse from "../SelectClassByCourse.vue";
-import MarkStatus from "./MarkStatus.vue";
-
-export default {
-  name: "mark-paper-class",
-  components: {
-    SelectClassByCourse,
-    MarkStatus,
-  },
-  props: {
-    datas: {
-      type: Object,
-      default() {
-        return {
-          classInfo: [],
-          groupInfo: [],
-          basicPaperInfo: {},
-        };
-      },
-    },
-  },
-  data() {
-    return {
-      openClassReading: false,
-      markerClassList: [],
-      curMarkClass: {},
-      selectedClassIds: [],
-      disabledClassIds: [],
-      casheMarkerClass: {},
-    };
-  },
-  mounted() {
-    this.initData();
-  },
-  methods: {
-    initData() {
-      this.openClassReading = this.datas.basicPaperInfo.openClassReading;
-      if (!this.openClassReading) return;
-
-      this.markerClassList = this.datas.classInfo.map((item) => {
-        let nitem = { ...item };
-        nitem.className = nitem.className ? nitem.className.split(",") : [];
-        return nitem;
-      });
-      this.updateCasheMarkerClass();
-      this.initMarkerClassList();
-    },
-    groupChange() {
-      if (!this.openClassReading) return;
-      this.updateCasheMarkerClass();
-      this.initMarkerClassList();
-    },
-    openClassReadingChange(val) {
-      if (val) {
-        this.initMarkerClassList();
-      } else {
-        this.updateCasheMarkerClass();
-        this.markerClassList = [];
-      }
-    },
-    initMarkerClassList() {
-      let markerClassList = [];
-      let markIds = [];
-      this.datas.groupInfo.forEach((group) => {
-        group.markerList.forEach((marker) => {
-          if (markIds.includes(marker.id)) return;
-          markIds.push(marker.id);
-          markerClassList.push({
-            id: marker.id,
-            loginName: marker.loginName,
-            name: marker.name,
-            orgName: marker.orgName,
-            className: this.casheMarkerClass[marker.id] || [],
-          });
-        });
-      });
-      this.markerClassList = markerClassList;
-    },
-    updateCasheMarkerClass() {
-      let casheMarkerClass = {};
-      this.markerClassList.forEach((item) => {
-        casheMarkerClass[item.id] = item.className;
-      });
-      this.casheMarkerClass = casheMarkerClass;
-    },
-    toEditClass(row) {
-      this.curMarkClass = row;
-      this.selectedClassIds = row.className;
-      this.$refs.SelectClassByCourse.open();
-    },
-    classSelected(className) {
-      this.curMarkClass.className = className;
-    },
-    checkData() {
-      let errorMessages = [];
-      if (!this.openClassReading) return errorMessages;
-
-      this.markerClassList.forEach((item) => {
-        if (!item.className.length) {
-          errorMessages.push(`评卷员${item.name}的阅卷班级没有设置`);
-        }
-      });
-
-      return errorMessages;
-    },
-    getData() {
-      return {
-        openClassReading: this.openClassReading,
-        classInfo: this.markerClassList.map((item) => {
-          let nitem = { ...item };
-          nitem.className = item.className.join();
-          return nitem;
-        }),
-      };
-    },
-  },
-};
-</script>

+ 0 - 84
src/modules/stmms/components/markParam/store.js

@@ -1,84 +0,0 @@
-import { deepCopy } from "@/plugins/utils";
-
-const initMarkStatus = {
-  structure: {
-    save: false,
-    sync: false,
-  },
-  group: {
-    save: false,
-    sync: false,
-  },
-  markerClass: {
-    save: false,
-    sync: false,
-  },
-  objective: {
-    save: false,
-    sync: false,
-  },
-  markerLeader: {
-    save: false,
-    sync: false,
-  },
-  marker: {
-    save: false,
-    sync: false,
-  },
-  answerFile: {
-    save: false,
-    sync: false,
-  },
-};
-
-const state = {
-  markParamInfos: {
-    basicPaperInfo: {},
-    groupInfo: [],
-    classInfo: [],
-    paperStructureInfo: [],
-    structureCanEdit: false,
-  },
-  objectiveStructure: [],
-  markStatus: deepCopy(initMarkStatus),
-  markLeader: [],
-};
-
-const mutations = {
-  setMarkParamInfos(state, data) {
-    state.markParamInfos = Object.assign(
-      {},
-      state.markParamInfos,
-      deepCopy(data)
-    );
-  },
-  setObjectiveStructure(state, objectiveStructure) {
-    state.objectiveStructure = objectiveStructure;
-  },
-  setMarkStatus(state, markStatus) {
-    Object.keys(initMarkStatus).forEach((k) => {
-      state.markStatus[k] = markStatus[k] || null;
-    });
-  },
-  setMarkLeader(state, markLeader) {
-    state.markLeader = markLeader;
-  },
-  initStore(state) {
-    state.markParamInfos = {
-      basicPaperInfo: {},
-      groupInfo: [],
-      classInfo: [],
-      paperStructureInfo: [],
-      structureCanEdit: false,
-    };
-    state.objectiveStructure = [];
-    state.markStatus = deepCopy(initMarkStatus);
-    state.markLeader = [];
-  },
-};
-
-export default {
-  namespaced: true,
-  state,
-  mutations,
-};

+ 0 - 6
src/modules/stmms/router.js

@@ -1,7 +1,6 @@
 import MarkerLogin from "./views/MarkerLogin.vue";
 import ScoreArchive from "./views/ScoreArchive.vue";
 import ScoreSync from "./views/ScoreSync.vue";
-import UploadStructure from "./views/UploadStructure.vue";
 import SyncManage from "./views/SyncManage.vue";
 import QuestionLibraryManage from "./views/QuestionLibraryManage.vue";
 
@@ -21,11 +20,6 @@ export default [
     name: "ScoreSync",
     component: ScoreSync,
   },
-  {
-    path: "/stmms-cloud/upload-structure",
-    name: "UploadStructure",
-    component: UploadStructure,
-  },
   {
     path: "/stmms-cloud/sync-manage",
     name: "SyncManage",

+ 0 - 155
src/modules/stmms/views/UploadStructure.vue

@@ -1,155 +0,0 @@
-<template>
-  <div class="upload-structure">
-    <div class="part-box part-box-filter part-box-flex">
-      <el-form ref="FilterForm" label-position="left" inline>
-        <template v-if="checkPrivilege('condition', 'condition')">
-          <el-form-item label="学期:">
-            <semester-select
-              v-model="filter.semesterId"
-              default-select
-              :clearable="false"
-              @default-selected="getList"
-            ></semester-select>
-          </el-form-item>
-          <el-form-item label="考试:">
-            <exam-select
-              v-model="filter.examId"
-              :semester-id="filter.semesterId"
-            ></exam-select>
-          </el-form-item>
-        </template>
-        <el-form-item label-width="0px">
-          <el-button
-            v-if="checkPrivilege('button', 'select')"
-            type="primary"
-            @click="toPage(1)"
-            >查询</el-button
-          >
-        </el-form-item>
-      </el-form>
-    </div>
-    <div class="part-box part-box-pad">
-      <el-table ref="TableList" :data="dataList">
-        <el-table-column
-          prop="thirdRelateId"
-          label="云阅卷考试"
-          min-width="160"
-        >
-          <span slot-scope="scope">
-            {{ scope.row.thirdRelateId }}({{
-              scope.row.thirdRelateName | defaultFieldFilter
-            }})
-          </span></el-table-column
-        >
-        <el-table-column prop="courseName" label="课程(代码)" min-width="200">
-          <span slot-scope="scope">
-            {{ scope.row.courseName }}({{ scope.row.courseCode }})
-          </span>
-        </el-table-column>
-        <el-table-column
-          prop="paperNumber"
-          label="试卷编号"
-          min-width="160"
-        ></el-table-column>
-        <el-table-column
-          prop="paperType"
-          label="试卷类型"
-          width="100"
-        ></el-table-column>
-        <el-table-column prop="thirdRelateId" label="命题老师" min-width="160">
-          <span slot-scope="scope">
-            {{ scope.row.loginName }}({{ scope.row.realName }})
-          </span></el-table-column
-        >
-        <el-table-column
-          class-name="action-column"
-          label="操作"
-          width="160px"
-          fixed="right"
-        >
-          <template slot-scope="scope">
-            <el-button
-              v-if="checkPrivilege('link', 'Submit')"
-              class="btn-primary"
-              type="text"
-              :disabled="scope.row.taskStatus === 'RUNNING'"
-              @click="toSetParams(scope.row)"
-              >评卷参数设置</el-button
-            >
-          </template>
-        </el-table-column>
-      </el-table>
-      <div class="part-page">
-        <el-pagination
-          background
-          layout="total, sizes, prev, pager, next, jumper"
-          :pager-count="5"
-          :current-page="current"
-          :total="total"
-          :page-size="size"
-          @current-change="toPage"
-          @size-change="pageSizeChange"
-        >
-        </el-pagination>
-      </div>
-    </div>
-
-    <ModifyMarkParams
-      ref="ModifyMarkParams"
-      :instance="curTask"
-      @modified="getList"
-    />
-  </div>
-</template>
-
-<script>
-import { examStructureListPage } from "../api";
-import ModifyMarkParams from "../components/markParam/ModifyMarkParams";
-
-export default {
-  name: "upload-structure",
-  components: {
-    ModifyMarkParams,
-  },
-  data() {
-    return {
-      filter: {
-        semesterId: "",
-        examId: "",
-      },
-      current: 1,
-      size: this.GLOBAL.pageSize,
-      total: 0,
-      dataList: [],
-      curTask: {},
-      curMarkLeaders: [],
-    };
-  },
-  methods: {
-    delayUpdateList() {
-      setTimeout(() => {
-        this.getList();
-      }, 1000);
-    },
-    async getList() {
-      if (!this.checkPrivilege("list", "list")) return;
-      const datas = {
-        ...this.filter,
-        pageNumber: this.current,
-        pageSize: this.size,
-      };
-      const data = await examStructureListPage(datas);
-      this.dataList = data.records;
-      this.total = data.total;
-    },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-    },
-    toSetParams(row) {
-      this.curTask = row;
-      this.$refs.ModifyMarkParams.open();
-    },
-  },
-};
-</script>