|
@@ -1,68 +1,22 @@
|
|
<template>
|
|
<template>
|
|
<el-dialog
|
|
<el-dialog
|
|
|
|
+ custom-class="statistics-dialog"
|
|
title="试卷结构分析"
|
|
title="试卷结构分析"
|
|
:visible.sync="modalIsShow"
|
|
:visible.sync="modalIsShow"
|
|
:modal="true"
|
|
:modal="true"
|
|
fullscreen
|
|
fullscreen
|
|
append-to-body
|
|
append-to-body
|
|
- custom-class="side-dialog"
|
|
|
|
@open="getData"
|
|
@open="getData"
|
|
>
|
|
>
|
|
- <el-form label-width="90px">
|
|
|
|
- <el-form-item label="整卷属性">
|
|
|
|
- <div class="topic-set-list">
|
|
|
|
- <div
|
|
|
|
- v-for="(paperTag, tagIndex) in paperData.tags"
|
|
|
|
- :key="tagIndex"
|
|
|
|
- class="topic-set"
|
|
|
|
- >
|
|
|
|
- <div class="topic-set-title">{{ paperTag.tag }}</div>
|
|
|
|
- <div class="topic-set-content">
|
|
|
|
- {{ paperTag.content }}
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
|
|
+ <div class="statistics">
|
|
|
|
+ <div class="statistics-part">
|
|
|
|
+ <div class="statistics-head">
|
|
|
|
+ <h2>组成结构</h2>
|
|
</div>
|
|
</div>
|
|
- </el-form-item>
|
|
|
|
- <el-form-item label="组成结构">
|
|
|
|
- <el-table :data="paperData.data" border>
|
|
|
|
- <el-table-column
|
|
|
|
- v-for="(colval, colIndex) in paperData.head"
|
|
|
|
- :key="colIndex"
|
|
|
|
- >
|
|
|
|
- <template slot="header">
|
|
|
|
- <span style="margin-left: 10px">{{ colval }}</span>
|
|
|
|
- </template>
|
|
|
|
- <template slot-scope="scope">
|
|
|
|
- <span style="margin-left: 10px">{{ scope.row[colIndex] }}</span>
|
|
|
|
- </template>
|
|
|
|
- </el-table-column>
|
|
|
|
- </el-table>
|
|
|
|
- </el-form-item>
|
|
|
|
- </el-form>
|
|
|
|
-
|
|
|
|
- <!-- <el-form>
|
|
|
|
- <el-form-item label="统计维度">
|
|
|
|
- <el-select v-model="type" @change="getPaperData">
|
|
|
|
- <el-option label="题数" value="count"></el-option>
|
|
|
|
- <el-option label="分值" value="score"></el-option>
|
|
|
|
- </el-select>
|
|
|
|
- </el-form-item>
|
|
|
|
- </el-form> -->
|
|
|
|
- <el-form label-width="90px" style="margin-top: 40px">
|
|
|
|
- <el-form-item label="题型分布">
|
|
|
|
- <el-select v-model="type" @change="getPaperData">
|
|
|
|
- <el-option label="题数" value="count"></el-option>
|
|
|
|
- <el-option label="分值" value="score"></el-option>
|
|
|
|
- </el-select>
|
|
|
|
- <el-table
|
|
|
|
- :data="paperData2.data"
|
|
|
|
- border
|
|
|
|
- :span-method="objectSpanMethod"
|
|
|
|
- style="margin-top: 10px"
|
|
|
|
- >
|
|
|
|
- <el-table-column label="题型" align="center">
|
|
|
|
|
|
+ <div class="statistics-body">
|
|
|
|
+ <el-table :data="paperData.data" border>
|
|
<el-table-column
|
|
<el-table-column
|
|
- v-for="(colval, colIndex) in headFirst2"
|
|
|
|
|
|
+ v-for="(colval, colIndex) in paperData.head"
|
|
:key="colIndex"
|
|
:key="colIndex"
|
|
>
|
|
>
|
|
<template slot="header">
|
|
<template slot="header">
|
|
@@ -72,50 +26,94 @@
|
|
<span style="margin-left: 10px">{{ scope.row[colIndex] }}</span>
|
|
<span style="margin-left: 10px">{{ scope.row[colIndex] }}</span>
|
|
</template>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table-column>
|
|
- </el-table-column>
|
|
|
|
- <el-table-column label="大题" align="center">
|
|
|
|
- <el-table-column
|
|
|
|
- v-for="(colval, colIndex) in headSecond2"
|
|
|
|
- :key="colIndex"
|
|
|
|
- >
|
|
|
|
- <template slot="header">
|
|
|
|
- <span style="margin-left: 10px">{{ colval }}</span>
|
|
|
|
- </template>
|
|
|
|
- <template slot-scope="scope">
|
|
|
|
- <span style="margin-left: 10px">{{
|
|
|
|
- scope.row[colIndex + 2]
|
|
|
|
- }}</span>
|
|
|
|
- </template>
|
|
|
|
- </el-table-column>
|
|
|
|
- </el-table-column>
|
|
|
|
- </el-table>
|
|
|
|
- </el-form-item>
|
|
|
|
- </el-form>
|
|
|
|
|
|
+ </el-table>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <div class="statistics-part">
|
|
|
|
+ <div class="statistics-head">
|
|
|
|
+ <h2>按题型统计</h2>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="statistics-body stat-type-body">
|
|
|
|
+ <div class="stat-type-table">
|
|
|
|
+ <el-table :data="paperQuestionData" border>
|
|
|
|
+ <el-table-column label="题型" prop="paperDetailName" width="120">
|
|
|
|
+ </el-table-column>
|
|
|
|
+ <el-table-column label="试题数量">
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
+ <span>
|
|
|
|
+ {{ scope.row.questionCount }} (
|
|
|
|
+ {{
|
|
|
|
+ scope.row.questionDifficultInfo
|
|
|
|
+ .map(
|
|
|
|
+ (item) =>
|
|
|
|
+ `${item.difficultLevel}:${item.questionCount}`
|
|
|
|
+ )
|
|
|
|
+ .join(",")
|
|
|
|
+ }})
|
|
|
|
+ </span>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ </el-table>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="stat-type-chart">
|
|
|
|
+ <v-chart
|
|
|
|
+ v-if="paperQuestionChartOption"
|
|
|
|
+ :option="paperQuestionChartOption"
|
|
|
|
+ ></v-chart>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
|
|
- <!-- <h2 style="color: #262626; margin-bottom: 10px">知识点</h2> -->
|
|
|
|
- <!-- <el-form>
|
|
|
|
- <el-form-item label="可选属性">
|
|
|
|
- <property-select
|
|
|
|
- v-model="coursePropertyId"
|
|
|
|
- :course-id="courseId"
|
|
|
|
- @change="getPaperData"
|
|
|
|
- >
|
|
|
|
- </property-select>
|
|
|
|
- </el-form-item>
|
|
|
|
- </el-form> -->
|
|
|
|
|
|
+ <div class="statistics-part">
|
|
|
|
+ <div class="statistics-head">
|
|
|
|
+ <h2>按难度统计</h2>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="statistics-body stat-type-body">
|
|
|
|
+ <div class="stat-type-table">
|
|
|
|
+ <el-table :data="paperDifficultData" border>
|
|
|
|
+ <el-table-column label="难度" prop="difficultLevel" width="80">
|
|
|
|
+ </el-table-column>
|
|
|
|
+ <el-table-column label="试题数量">
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
+ <span>
|
|
|
|
+ {{ scope.row.questionCount }} (
|
|
|
|
+ {{
|
|
|
|
+ scope.row.paperDetailInfo
|
|
|
|
+ .map(
|
|
|
|
+ (item) =>
|
|
|
|
+ `${item.paperDetailName}:${item.questionCount}`
|
|
|
|
+ )
|
|
|
|
+ .join(",")
|
|
|
|
+ }})
|
|
|
|
+ </span>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ </el-table>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="stat-type-chart">
|
|
|
|
+ <v-chart
|
|
|
|
+ v-if="paperDifficultChartOption"
|
|
|
|
+ :option="paperDifficultChartOption"
|
|
|
|
+ ></v-chart>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
|
|
- <el-form label-width="90px" style="margin-top: 40px">
|
|
|
|
- <el-form-item label="蓝图分布">
|
|
|
|
- <el-table
|
|
|
|
- :data="paperData3.data"
|
|
|
|
- style="width: 100%"
|
|
|
|
- border
|
|
|
|
- :span-method="objectSpanMethod3"
|
|
|
|
- >
|
|
|
|
- <el-table-column label="蓝图属性" align="center">
|
|
|
|
|
|
+ <div class="statistics-part">
|
|
|
|
+ <div class="statistics-head">
|
|
|
|
+ <h2>按知识点统计</h2>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="statistics-body">
|
|
|
|
+ <el-table
|
|
|
|
+ :data="paperData3.data"
|
|
|
|
+ style="width: 100%"
|
|
|
|
+ border
|
|
|
|
+ :span-method="objectSpanMethod3"
|
|
|
|
+ >
|
|
<el-table-column
|
|
<el-table-column
|
|
v-for="(colval, colIndex) in headFirst3"
|
|
v-for="(colval, colIndex) in headFirst3"
|
|
- :key="colIndex"
|
|
|
|
|
|
+ :key="`first${colIndex}`"
|
|
>
|
|
>
|
|
<template slot="header">
|
|
<template slot="header">
|
|
<span style="margin-left: 10px">{{ colval }}</span>
|
|
<span style="margin-left: 10px">{{ colval }}</span>
|
|
@@ -124,11 +122,9 @@
|
|
<span style="margin-left: 10px">{{ scope.row[colIndex] }}</span>
|
|
<span style="margin-left: 10px">{{ scope.row[colIndex] }}</span>
|
|
</template>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table-column>
|
|
- </el-table-column>
|
|
|
|
- <el-table-column label="大题" align="center">
|
|
|
|
<el-table-column
|
|
<el-table-column
|
|
v-for="(colval, colIndex) in headSecond3"
|
|
v-for="(colval, colIndex) in headSecond3"
|
|
- :key="colIndex"
|
|
|
|
|
|
+ :key="`second${colIndex}`"
|
|
>
|
|
>
|
|
<template slot="header">
|
|
<template slot="header">
|
|
<span style="margin-left: 10px">{{ colval }}</span>
|
|
<span style="margin-left: 10px">{{ colval }}</span>
|
|
@@ -139,15 +135,20 @@
|
|
}}</span>
|
|
}}</span>
|
|
</template>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table-column>
|
|
- </el-table-column>
|
|
|
|
- </el-table>
|
|
|
|
- </el-form-item>
|
|
|
|
- </el-form>
|
|
|
|
|
|
+ </el-table>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
</el-dialog>
|
|
</el-dialog>
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<script>
|
|
<script>
|
|
-import { paperBaseInfoApi, paperQtypeInfoApi, paperBlueInfoApi } from "../api";
|
|
|
|
|
|
+import {
|
|
|
|
+ paperBaseInfoApi,
|
|
|
|
+ paperQuestionTypeInfoApi,
|
|
|
|
+ paperDifficultTypeInfoApi,
|
|
|
|
+ paperBlueInfoApi,
|
|
|
|
+} from "../api";
|
|
export default {
|
|
export default {
|
|
name: "PaperStructInfo",
|
|
name: "PaperStructInfo",
|
|
props: {
|
|
props: {
|
|
@@ -168,9 +169,10 @@ export default {
|
|
head: [],
|
|
head: [],
|
|
},
|
|
},
|
|
type: "count",
|
|
type: "count",
|
|
- paperData2: { head: [] },
|
|
|
|
- headFirst2: [],
|
|
|
|
- headSecond2: [],
|
|
|
|
|
|
+ paperQuestionData: [],
|
|
|
|
+ paperQuestionChartOption: null,
|
|
|
|
+ paperDifficultData: [],
|
|
|
|
+ paperDifficultChartOption: null,
|
|
paperData3: { head: [], data: [] },
|
|
paperData3: { head: [], data: [] },
|
|
headFirst3: [],
|
|
headFirst3: [],
|
|
headSecond3: [],
|
|
headSecond3: [],
|
|
@@ -190,40 +192,77 @@ export default {
|
|
this.getPaperData3();
|
|
this.getPaperData3();
|
|
},
|
|
},
|
|
async getPaperData() {
|
|
async getPaperData() {
|
|
- const res = await paperQtypeInfoApi({
|
|
|
|
|
|
+ const qres = await paperQuestionTypeInfoApi({
|
|
paperId: this.paperId,
|
|
paperId: this.paperId,
|
|
- type: this.type,
|
|
|
|
|
|
+ rootOrgId: this.$store.state.user.rootOrgId,
|
|
});
|
|
});
|
|
- this.paperData2 = res.data;
|
|
|
|
- this.headFirst2 = this.paperData2.head.slice(0, 2);
|
|
|
|
- this.headSecond2 = this.paperData2.head.slice(2);
|
|
|
|
- },
|
|
|
|
- objectSpanMethod({ rowIndex, columnIndex }) {
|
|
|
|
- // console.log(row, column);
|
|
|
|
- if (columnIndex === 0 && rowIndex === 0) {
|
|
|
|
- return {
|
|
|
|
- rowspan: 5,
|
|
|
|
- colspan: 1,
|
|
|
|
- };
|
|
|
|
- }
|
|
|
|
- if (columnIndex === 0 && rowIndex > 0 && rowIndex < 5) {
|
|
|
|
|
|
+ this.paperQuestionData = qres.data;
|
|
|
|
+ const qData = this.paperQuestionData.map((item) => {
|
|
return {
|
|
return {
|
|
- rowspan: 0,
|
|
|
|
- colspan: 0,
|
|
|
|
|
|
+ value: item.questionCount,
|
|
|
|
+ name: item.paperDetailName,
|
|
};
|
|
};
|
|
- }
|
|
|
|
- if (columnIndex === 0 && rowIndex === 5) {
|
|
|
|
- return {
|
|
|
|
- rowspan: 4,
|
|
|
|
- colspan: 1,
|
|
|
|
- };
|
|
|
|
- }
|
|
|
|
- if (columnIndex === 0 && rowIndex > 5 && rowIndex < 9) {
|
|
|
|
|
|
+ });
|
|
|
|
+ this.paperQuestionChartOption = this.getChartOption(qData);
|
|
|
|
+
|
|
|
|
+ const dres = await paperDifficultTypeInfoApi({
|
|
|
|
+ paperId: this.paperId,
|
|
|
|
+ rootOrgId: this.$store.state.user.rootOrgId,
|
|
|
|
+ });
|
|
|
|
+ this.paperDifficultData = dres.data;
|
|
|
|
+
|
|
|
|
+ const dData = this.paperDifficultData.map((item) => {
|
|
return {
|
|
return {
|
|
- rowspan: 0,
|
|
|
|
- colspan: 0,
|
|
|
|
|
|
+ value: item.questionCount,
|
|
|
|
+ name: item.difficultLevel,
|
|
};
|
|
};
|
|
- }
|
|
|
|
|
|
+ });
|
|
|
|
+ this.paperDifficultChartOption = this.getChartOption(dData);
|
|
|
|
+ },
|
|
|
|
+ getChartOption(data) {
|
|
|
|
+ const option = {
|
|
|
|
+ color: [
|
|
|
|
+ "#265dff",
|
|
|
|
+ "#14c9c8",
|
|
|
|
+ "#f7ba1f",
|
|
|
|
+ "#722ed1",
|
|
|
|
+ "#5470c6",
|
|
|
|
+ "#91cc75",
|
|
|
|
+ "#fac858",
|
|
|
|
+ "#ee6666",
|
|
|
|
+ "#73c0de",
|
|
|
|
+ "#3ba272",
|
|
|
|
+ "#fc8452",
|
|
|
|
+ "#9a60b4",
|
|
|
|
+ "#ea7ccc",
|
|
|
|
+ ],
|
|
|
|
+ tooltip: {
|
|
|
|
+ trigger: "item",
|
|
|
|
+ },
|
|
|
|
+ legend: {
|
|
|
|
+ orient: "vertical",
|
|
|
|
+ left: "right",
|
|
|
|
+ itemHeight: 10,
|
|
|
|
+ },
|
|
|
|
+ series: [
|
|
|
|
+ {
|
|
|
|
+ name: "Access From",
|
|
|
|
+ type: "pie",
|
|
|
|
+ radius: "90%",
|
|
|
|
+ data,
|
|
|
|
+ label: { show: false },
|
|
|
|
+ emphasis: {
|
|
|
|
+ itemStyle: {
|
|
|
|
+ shadowBlur: 10,
|
|
|
|
+ shadowOffsetX: 0,
|
|
|
|
+ shadowColor: "rgba(0, 0, 0, 0.5)",
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ ],
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ return option;
|
|
},
|
|
},
|
|
async getPaperData3() {
|
|
async getPaperData3() {
|
|
// if (!this.coursePropertyId) return;
|
|
// if (!this.coursePropertyId) return;
|