|
@@ -1,81 +1,144 @@
|
|
|
<template>
|
|
|
<div>
|
|
|
- <div class="tw-bg-white tw-p-5 tw-rounded-xl tw-mb-5">
|
|
|
- <span class="tw-mr-4"></span>
|
|
|
- <ProjectCourseSelect
|
|
|
- :project-id="projectId"
|
|
|
- v-model:value="courseId"
|
|
|
- disabled
|
|
|
- />
|
|
|
- <span class="tw-mr-4"></span>
|
|
|
-
|
|
|
- <div class="tw-mt-4">
|
|
|
- <a-button @click="goBack">返回</a-button>
|
|
|
- </div>
|
|
|
-
|
|
|
- <template v-for="(item, index) in data" :key="index">
|
|
|
- <ProjectCourseSelect
|
|
|
- :project-id="projectId"
|
|
|
- v-model:value="item.courseId"
|
|
|
- disabled
|
|
|
- />
|
|
|
- <h3>等距({{ scoreGap }}分)分组频数分布</h3>
|
|
|
- <!-- TODO: 将下面的逻辑抽离到JS中,再将分段完成 -->
|
|
|
- <table>
|
|
|
- <tr>
|
|
|
- <th>分数段</th>
|
|
|
- <th>频数</th>
|
|
|
- <th>频率(%)</th>
|
|
|
- <th>累计频数</th>
|
|
|
- <th>累计频数(%)</th>
|
|
|
- </tr>
|
|
|
- <tr v-for="(item2, index) in item.totalScore / scoreGap" :key="index">
|
|
|
- <td>{{ (item2 - 1) * scoreGap }}-</td>
|
|
|
- <td>
|
|
|
- {{
|
|
|
- item.scoreRangeAcc[item2 * scoreGap] -
|
|
|
- item.scoreRangeAcc[(item2 - 1) * scoreGap]
|
|
|
- }}
|
|
|
- </td>
|
|
|
- <td>
|
|
|
- {{
|
|
|
- (item.scoreRangeAcc[item2 * scoreGap] -
|
|
|
- item.scoreRangeAcc[(item2 - 1) * scoreGap]) /
|
|
|
- item.scoreRangeTotal
|
|
|
- }}
|
|
|
- </td>
|
|
|
- <td>{{ item.scoreRangeAcc[item2 * scoreGap] }}</td>
|
|
|
- <td>
|
|
|
- {{ item.scoreRangeAcc[item2 * scoreGap] / item.scoreRangeTotal }}
|
|
|
- </td>
|
|
|
- </tr>
|
|
|
- <tr v-if="item.totalScore % scoreGap">
|
|
|
- <td>
|
|
|
- {{
|
|
|
- item.scoreRangeAcc[item.scoreRangeAcc.length - 1] -
|
|
|
- item.scoreRangeAcc[
|
|
|
- item.scoreRangeAcc.length - 1 - (item.totalScore % scoreGap)
|
|
|
- ]
|
|
|
- }}
|
|
|
- </td>
|
|
|
- <td>
|
|
|
- {{
|
|
|
- (item.scoreRangeAcc[item.scoreRangeAcc.length - 1] -
|
|
|
+ <div class="tw-bg-white tw-rounded-xl">
|
|
|
+ <div class="tw-mt-4"></div>
|
|
|
+
|
|
|
+ <a-collapse v-model:activeKey="activeKey">
|
|
|
+ <a-collapse-panel
|
|
|
+ v-for="(item, index) in data"
|
|
|
+ :key="index"
|
|
|
+ :header="item.courseName + '(' + item.courseCode + ')'"
|
|
|
+ >
|
|
|
+ <div class="tw-flex tw-justify-between tw-items-center tw-my-4">
|
|
|
+ <h3 class="section-title">等距({{ scoreGap }}分)分组频数分布</h3>
|
|
|
+ <a-button @click="openModal1">说明</a-button>
|
|
|
+ </div>
|
|
|
+ <!-- TODO: 将下面的逻辑抽离到JS中,再将分段完成 -->
|
|
|
+ <table class="custom-table">
|
|
|
+ <tr>
|
|
|
+ <th>分数段</th>
|
|
|
+ <th>频数</th>
|
|
|
+ <th>频率(%)</th>
|
|
|
+ <th>累计频数</th>
|
|
|
+ <th>累计频数(%)</th>
|
|
|
+ </tr>
|
|
|
+ <tr
|
|
|
+ v-for="(item2, index) in item.totalScore / scoreGap"
|
|
|
+ :key="index"
|
|
|
+ >
|
|
|
+ <td>{{ (item2 - 1) * scoreGap }}-</td>
|
|
|
+ <td>
|
|
|
+ {{
|
|
|
+ item.scoreRangeAcc[item2 * scoreGap] -
|
|
|
+ item.scoreRangeAcc[(item2 - 1) * scoreGap]
|
|
|
+ }}
|
|
|
+ </td>
|
|
|
+ <td>
|
|
|
+ {{
|
|
|
+ (item.scoreRangeAcc[item2 * scoreGap] -
|
|
|
+ item.scoreRangeAcc[(item2 - 1) * scoreGap]) /
|
|
|
+ item.scoreRangeTotal
|
|
|
+ }}
|
|
|
+ </td>
|
|
|
+ <td>{{ item.scoreRangeAcc[item2 * scoreGap] }}</td>
|
|
|
+ <td>
|
|
|
+ {{
|
|
|
+ item.scoreRangeAcc[item2 * scoreGap] / item.scoreRangeTotal
|
|
|
+ }}
|
|
|
+ </td>
|
|
|
+ </tr>
|
|
|
+ <tr v-if="item.totalScore % scoreGap">
|
|
|
+ <td>
|
|
|
+ {{
|
|
|
+ item.scoreRangeAcc[item.scoreRangeAcc.length - 1] -
|
|
|
item.scoreRangeAcc[
|
|
|
item.scoreRangeAcc.length - 1 - (item.totalScore % scoreGap)
|
|
|
- ]) /
|
|
|
- item.scoreRangeTotal
|
|
|
- }}
|
|
|
- </td>
|
|
|
- <td>{{ item.scoreRangeAcc[item.scoreRangeAcc.length - 1] }}</td>
|
|
|
- <td>100%</td>
|
|
|
- </tr>
|
|
|
- </table>
|
|
|
-
|
|
|
- <h3>科目分数线分组的频数分布</h3>
|
|
|
- <a-button @click="openRangeConfigModal(item)">分段设置</a-button>
|
|
|
- <div v-if="item.rangeConfig"></div>
|
|
|
- </template>
|
|
|
+ ]
|
|
|
+ }}
|
|
|
+ </td>
|
|
|
+ <td>
|
|
|
+ {{
|
|
|
+ (item.scoreRangeAcc[item.scoreRangeAcc.length - 1] -
|
|
|
+ item.scoreRangeAcc[
|
|
|
+ item.scoreRangeAcc.length -
|
|
|
+ 1 -
|
|
|
+ (item.totalScore % scoreGap)
|
|
|
+ ]) /
|
|
|
+ item.scoreRangeTotal
|
|
|
+ }}
|
|
|
+ </td>
|
|
|
+ <td>{{ item.scoreRangeAcc[item.scoreRangeAcc.length - 1] }}</td>
|
|
|
+ <td>100%</td>
|
|
|
+ </tr>
|
|
|
+ </table>
|
|
|
+
|
|
|
+ <div class="tw-flex tw-justify-between tw-items-center tw-my-4">
|
|
|
+ <h3 class="section-title">科目分数线分组的频数分布</h3>
|
|
|
+ <div class="tw-flex tw-gap-2">
|
|
|
+ <a-button @click="openRangeConfigModal(item)">分段设置</a-button>
|
|
|
+ <a-button @click="openModal2">说明</a-button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-if="item.rangeConfig">
|
|
|
+ <table class="custom-table">
|
|
|
+ <tr>
|
|
|
+ <th>分数段</th>
|
|
|
+ <th>频数</th>
|
|
|
+ <th>频率(%)</th>
|
|
|
+ <th>累计频数</th>
|
|
|
+ <th>累计频数(%)</th>
|
|
|
+ </tr>
|
|
|
+ <tr v-for="(item2, index) in item.rangeConfig" :key="index">
|
|
|
+ <td>
|
|
|
+ {{ scoreTitle(item.rangeConfig[index]) }}
|
|
|
+ </td>
|
|
|
+ <td>
|
|
|
+ {{
|
|
|
+ (item.rangeConfig[index + 1]
|
|
|
+ ? item.scoreRangeAcc[
|
|
|
+ item.rangeConfig[index + 1].baseScore +
|
|
|
+ item.rangeConfig[index + 1].adjustScore
|
|
|
+ ]
|
|
|
+ : 0) -
|
|
|
+ item.scoreRangeAcc[item2.baseScore + item2.adjustScore] ||
|
|
|
+ 0
|
|
|
+ }}
|
|
|
+ </td>
|
|
|
+ <td>
|
|
|
+ {{
|
|
|
+ ((item.rangeConfig[index + 1]
|
|
|
+ ? item.scoreRangeAcc[
|
|
|
+ item.rangeConfig[index + 1].baseScore +
|
|
|
+ item.rangeConfig[index + 1].adjustScore
|
|
|
+ ]
|
|
|
+ : 0) -
|
|
|
+ item.scoreRangeAcc[item2.baseScore + item2.adjustScore] ||
|
|
|
+ 0) / item.scoreRangeTotal
|
|
|
+ }}
|
|
|
+ </td>
|
|
|
+ <td>
|
|
|
+ {{
|
|
|
+ item2.baseScore + item2.adjustScore >=
|
|
|
+ item.scoreRangeAcc.length
|
|
|
+ ? item.scoreRangeAcc[item.scoreRangeAcc.length - 1]
|
|
|
+ : item.scoreRangeAcc[item2.baseScore + item2.adjustScore]
|
|
|
+ }}
|
|
|
+ </td>
|
|
|
+ <td>
|
|
|
+ {{
|
|
|
+ item2.baseScore + item2.adjustScore >=
|
|
|
+ item.scoreRangeAcc.length
|
|
|
+ ? 1
|
|
|
+ : item.scoreRangeAcc[
|
|
|
+ item2.baseScore + item2.adjustScore
|
|
|
+ ] / item.scoreRangeTotal
|
|
|
+ }}
|
|
|
+ </td>
|
|
|
+ </tr>
|
|
|
+ </table>
|
|
|
+ </div>
|
|
|
+ </a-collapse-panel>
|
|
|
+ </a-collapse>
|
|
|
</div>
|
|
|
|
|
|
<CommonRangeConfig
|
|
@@ -90,8 +153,7 @@
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
import { useMainStore } from "@/store";
|
|
|
-import { goBack } from "@/utils/utils";
|
|
|
-import { watch, onMounted, ref, toRaw, computed, reactive } from "vue-demi";
|
|
|
+import { onMounted } from "vue-demi";
|
|
|
import { useRoute } from "vue-router";
|
|
|
import {
|
|
|
getSasCourseList,
|
|
@@ -99,6 +161,9 @@ import {
|
|
|
} from "@/api/allAnalysisPage";
|
|
|
import EventBus from "@/plugins/eventBus";
|
|
|
import { message } from "ant-design-vue";
|
|
|
+import { RANGE_POINT_TYPE } from "@/constants/constants";
|
|
|
+
|
|
|
+let activeKey = $ref(["0"]);
|
|
|
|
|
|
const store = useMainStore();
|
|
|
|
|
@@ -118,6 +183,16 @@ async function fetchData() {
|
|
|
v.scoreRange = Object.values(JSON.parse(v.scoreRange || "{}"));
|
|
|
return v;
|
|
|
});
|
|
|
+ res.data = res.data.map((v: any) => {
|
|
|
+ v.rangeConfig = JSON.parse(v.rangeConfig || "0") || [
|
|
|
+ {
|
|
|
+ type: "ZERO",
|
|
|
+ baseScore: 0,
|
|
|
+ adjustScore: 0,
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ return v;
|
|
|
+ });
|
|
|
res.data = res.data.map((v: { scoreRange: number[] }) => {
|
|
|
let acc = 0;
|
|
|
v.scoreRangeAcc = v.scoreRange.map((_v, i, a) => {
|
|
@@ -151,13 +226,7 @@ let rangeConfigRef = $ref(null);
|
|
|
|
|
|
const openRangeConfigModal = (item: any) => {
|
|
|
selectedCourseId = item.courseId;
|
|
|
- selectedRangeConfig = JSON.parse(item.rangeConfig || "0") || [
|
|
|
- {
|
|
|
- type: "ZERO",
|
|
|
- baseScore: 0,
|
|
|
- adjustScore: 0,
|
|
|
- },
|
|
|
- ];
|
|
|
+ selectedRangeConfig = JSON.parse(JSON.stringify(item.rangeConfig));
|
|
|
// @ts-ignore
|
|
|
rangeConfigRef.showModal();
|
|
|
};
|
|
@@ -169,5 +238,31 @@ async function handleRangeConfigUpdate(rangeConfig: any) {
|
|
|
rangeConfig: JSON.stringify(rangeConfig),
|
|
|
});
|
|
|
message.success({ content: "操作成功" });
|
|
|
+ window.location.reload();
|
|
|
+}
|
|
|
+
|
|
|
+function scoreTitle(rangeConfig: any) {
|
|
|
+ if (!rangeConfig) return false;
|
|
|
+ if (rangeConfig.type === "ZERO") return "0-";
|
|
|
+
|
|
|
+ return `${rangeConfig.baseScore + rangeConfig.adjustScore}(${
|
|
|
+ RANGE_POINT_TYPE[rangeConfig.type]
|
|
|
+ }${rangeConfig.adjustScore > 0 ? "+" : ""}${rangeConfig.adjustScore})-`;
|
|
|
+}
|
|
|
+
|
|
|
+function openModal1() {
|
|
|
+ EventBus.emit("SHOW_SETTING", "DESCRIBE02");
|
|
|
+}
|
|
|
+
|
|
|
+function openModal2() {
|
|
|
+ EventBus.emit("SHOW_SETTING", "DESCRIBE03");
|
|
|
}
|
|
|
</script>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.section-title {
|
|
|
+ color: #212534;
|
|
|
+ font-size: 16px;
|
|
|
+ font-weight: 700;
|
|
|
+}
|
|
|
+</style>
|