Commit 696f2d424187a37d5ebe0c3873a664212006ef52
1 parent
b0cd2598
fix:报表导出问题
Showing
6 changed files
with
440 additions
and
258 deletions
src/components/exportDia.vue
... | ... | @@ -26,6 +26,7 @@ |
26 | 26 | <ul v-show="exportType == 2"> |
27 | 27 | <p class="export-tit">选择学生</p> |
28 | 28 | <el-table |
29 | + ref="multipleTable" | |
29 | 30 | :data="exportStudent" |
30 | 31 | @selection-change="handleSelectionChange" |
31 | 32 | :max-height="300" |
... | ... | @@ -38,11 +39,21 @@ |
38 | 39 | ></el-table-column> |
39 | 40 | <el-table-column label="班名" align="center"> |
40 | 41 | <template slot-scope="scoped"> |
41 | - <span v-if="scoped.row.classRank || scoped.row.rank">{{ | |
42 | - scoped.row.classRank || scoped.row.rank | |
43 | - }}</span> | |
42 | + <span | |
43 | + v-if=" | |
44 | + scoped.row.classRank || | |
45 | + scoped.row.rank || | |
46 | + scoped.row['classRank多科汇总'] | |
47 | + " | |
48 | + >{{ | |
49 | + scoped.row.classRank || | |
50 | + scoped.row.rank || | |
51 | + scoped.row["classRank多科汇总"] | |
52 | + }}</span | |
53 | + > | |
44 | 54 | <span v-else>{{ |
45 | - scoped.row.examList && scoped.row.examList[0].classRank | |
55 | + (scoped.row.examList && scoped.row.examList[0].classRank) || | |
56 | + (scoped.row.datalist && scoped.row.datalist[0].classRank) | |
46 | 57 | }}</span> |
47 | 58 | </template> |
48 | 59 | </el-table-column> |
... | ... | @@ -54,8 +65,11 @@ |
54 | 65 | <span v-else-if="!isNaN(scoped.row.scoringRate)"> |
55 | 66 | {{ scoped.row.scoringRate }}% |
56 | 67 | </span> |
68 | + <span v-else-if="scoped.row['score多科汇总']"> | |
69 | + {{ Number(scoped.row["score多科汇总"]) }} | |
70 | + </span> | |
57 | 71 | <span v-else>{{ |
58 | - scoped.row.examList && scoped.row.examList[0].score | |
72 | + Number(scoped.row.examList && scoped.row.examList[0].score) | |
59 | 73 | }}</span> |
60 | 74 | </template></el-table-column |
61 | 75 | > |
... | ... | @@ -107,12 +121,17 @@ export default { |
107 | 121 | handler: function (nVal) { |
108 | 122 | if (nVal) { |
109 | 123 | this.downType = 1; |
124 | + this.exportType = 1; | |
125 | + this.multipleSelection = []; | |
110 | 126 | } |
111 | 127 | }, |
112 | 128 | immediate: true, |
113 | 129 | }, |
114 | 130 | }, |
115 | 131 | methods: { |
132 | + cancelSelection() { | |
133 | + this.$refs.multipleTable.clearSelection(); | |
134 | + }, | |
116 | 135 | changeDownType() { |
117 | 136 | this.exportType = 1; |
118 | 137 | }, |
... | ... | @@ -131,6 +150,7 @@ export default { |
131 | 150 | }); |
132 | 151 | } |
133 | 152 | this.$emit("exportData", this.downType == 1 ? null : studentIds); |
153 | + this.cancelSelection(); | |
134 | 154 | }, |
135 | 155 | cancel() { |
136 | 156 | if (this.exportType == 2) { | ... | ... |
src/views/basic/ask/analysis.vue
... | ... | @@ -3,56 +3,110 @@ |
3 | 3 | <back-box> |
4 | 4 | <template slot="title"> |
5 | 5 | <span>{{ |
6 | - types == 1 ? "单课分析" : | |
7 | - types == 2 ? `${className}-${subjectNames[0]}汇总分析` : | |
8 | - `${className}-多科汇总分析` }}</span> | |
6 | + types == 1 | |
7 | + ? "单课分析" | |
8 | + : types == 2 | |
9 | + ? `${className}-${subjectNames[0]}汇总分析` | |
10 | + : `${className}-多科汇总分析` | |
11 | + }}</span> | |
9 | 12 | </template> |
10 | 13 | </back-box> |
11 | 14 | <div class="page-content"> |
12 | 15 | <div class="tab-box"> |
13 | - <span class="tab-item" v-for="(item, index) in tabList" :key="index" :class="type == item.value ? 'active' : ''" | |
14 | - @click="setType(item.value)">{{ item.name }}</span> | |
16 | + <span | |
17 | + class="tab-item" | |
18 | + v-for="(item, index) in tabList" | |
19 | + :key="index" | |
20 | + :class="type == item.value ? 'active' : ''" | |
21 | + @click="setType(item.value)" | |
22 | + >{{ item.name }}</span | |
23 | + > | |
15 | 24 | </div> |
16 | 25 | <div v-loading="loading"> |
17 | 26 | <div id="print-content"> |
18 | - | |
19 | 27 | <!-- 学生答题情况 --> |
20 | 28 | <Detail v-if="type == 1" :types="types" :detail="detail" :id="id" /> |
21 | 29 | <!-- 学生答题情况 --> |
22 | 30 | <Example v-if="type == 1" :types="types" :tableData="tableData" /> |
23 | 31 | <!-- 学生问答 --> |
24 | - <AnswerQustion v-if="type == 2" :types="types" :tableData="tableData" :subjectNames="subjectNames" /> | |
32 | + <AnswerQustion | |
33 | + v-if="type == 2" | |
34 | + :types="types" | |
35 | + :tableData="tableData" | |
36 | + :subjectNames="subjectNames" | |
37 | + /> | |
25 | 38 | <!-- 学生互动表现 --> |
26 | 39 | <Interact v-if="type == 3" :types="types" :tableData="tableData" /> |
27 | 40 | <!-- 签到明细 --> |
28 | 41 | <Report v-if="type == 4" :tableData="tableData" /> |
29 | 42 | </div> |
30 | 43 | <div class="pagination-box" v-show="type == 1"> |
31 | - <el-pagination small="" layout="total,prev, pager, next" :hide-on-single-page="true" :total="total" | |
32 | - @current-change="changePage" :current-page="page" :page-size="size"> | |
44 | + <el-pagination | |
45 | + small="" | |
46 | + layout="total,prev, pager, next" | |
47 | + :hide-on-single-page="true" | |
48 | + :total="total" | |
49 | + @current-change="changePage" | |
50 | + :current-page="page" | |
51 | + :page-size="size" | |
52 | + > | |
33 | 53 | </el-pagination> |
34 | 54 | </div> |
35 | 55 | <p class="down"> |
36 | - <el-button @click="openDown" type="primary" plain round icon="fa fa-cloud-download">导出报表</el-button> | |
37 | - <el-button v-if="!this.$store.getters.code" @click="print" type="primary" plain round | |
38 | - icon="el-icon-printer">打印</el-button> | |
56 | + <el-button | |
57 | + v-if="types == 1" | |
58 | + @click="exportData" | |
59 | + type="primary" | |
60 | + plain | |
61 | + round | |
62 | + icon="fa fa-cloud-download" | |
63 | + >导出报表</el-button | |
64 | + > | |
65 | + <el-button | |
66 | + v-else | |
67 | + @click="openDown" | |
68 | + type="primary" | |
69 | + plain | |
70 | + round | |
71 | + icon="fa fa-cloud-download" | |
72 | + >导出报表</el-button | |
73 | + > | |
74 | + <el-button | |
75 | + v-if="!this.$store.getters.code" | |
76 | + @click="print" | |
77 | + type="primary" | |
78 | + plain | |
79 | + round | |
80 | + icon="el-icon-printer" | |
81 | + >打印</el-button | |
82 | + > | |
39 | 83 | </p> |
40 | 84 | </div> |
41 | - <ExportDia :exportStudent="exportStudent" :diaShow="diaShow" @cancel="cancel" @exportData="exportData" :type="types==3?'雷达图':'折线图'"/> | |
85 | + <ExportDia | |
86 | + :exportStudent="exportStudent" | |
87 | + :diaShow="diaShow" | |
88 | + @cancel="cancel" | |
89 | + @exportData="exportData" | |
90 | + :type="types == 3 ? '雷达图' : '折线图'" | |
91 | + /> | |
42 | 92 | </div> |
43 | 93 | </div> |
44 | 94 | </template> |
45 | 95 | |
46 | 96 | <script> |
47 | 97 | import { downloadFile, tablePrint } from "@/utils"; |
48 | -import Detail from "./components/detail.vue" | |
49 | -import Example from "./components/example.vue" | |
50 | -import AnswerQustion from "./components/answerQustion.vue" | |
51 | -import Interact from "./components/interact.vue" | |
52 | -import Report from "./components/report.vue" | |
98 | +import Detail from "./components/detail.vue"; | |
99 | +import Example from "./components/example.vue"; | |
100 | +import AnswerQustion from "./components/answerQustion.vue"; | |
101 | +import Interact from "./components/interact.vue"; | |
102 | +import Report from "./components/report.vue"; | |
53 | 103 | export default { |
54 | 104 | components: { |
55 | - Detail, Example, AnswerQustion, Interact, Report | |
105 | + Detail, | |
106 | + Example, | |
107 | + AnswerQustion, | |
108 | + Interact, | |
109 | + Report, | |
56 | 110 | }, |
57 | 111 | data() { |
58 | 112 | return { |
... | ... | @@ -79,32 +133,37 @@ export default { |
79 | 133 | this.role = |
80 | 134 | this.$store.getters.info.showRole || |
81 | 135 | this.$store.getters.info.permissions[0].role; |
82 | - this.types = Number(this.$route.query.types) | |
83 | - this.className = this.$route.query.className | |
84 | - const queryData = JSON.parse(this.$route.query.params) | |
85 | - this.classId = queryData.classId | |
86 | - console.log(this.$route.query) | |
87 | - this.subjectNames = this.$route.query.subjectNames.split(',') | |
136 | + this.types = Number(this.$route.query.types); | |
137 | + this.className = this.$route.query.className; | |
138 | + const queryData = JSON.parse(this.$route.query.params); | |
139 | + this.classId = queryData.classId; | |
140 | + console.log(this.$route.query); | |
141 | + this.subjectNames = this.$route.query.subjectNames.split(","); | |
88 | 142 | if (this.types == 1) { |
89 | - this.tabList = [{ name: "答题表现", value: 1 }, | |
90 | - { name: "学生问答表现", value: 2 }, | |
91 | - { name: "学生互动表现", value: 3 }, | |
92 | - { name: "签到明细", value: 4 },] | |
143 | + this.tabList = [ | |
144 | + { name: "答题表现", value: 1 }, | |
145 | + { name: "学生问答表现", value: 2 }, | |
146 | + { name: "学生互动表现", value: 3 }, | |
147 | + { name: "签到明细", value: 4 }, | |
148 | + ]; | |
93 | 149 | } else if (this.types == 2) { |
94 | - this.tabList = [{ name: "答题表现", value: 1 }, | |
95 | - { name: "学生问答表现", value: 2 }, | |
96 | - { name: "学生互动表现", value: 3 }] | |
150 | + this.tabList = [ | |
151 | + { name: "答题表现", value: 1 }, | |
152 | + { name: "学生问答表现", value: 2 }, | |
153 | + { name: "学生互动表现", value: 3 }, | |
154 | + ]; | |
97 | 155 | } else if (this.types == 3) { |
98 | 156 | this.tabList = [ |
99 | 157 | { name: "学生问答表现", value: 2 }, |
100 | - { name: "学生互动表现", value: 3 }] | |
158 | + { name: "学生互动表现", value: 3 }, | |
159 | + ]; | |
101 | 160 | } |
102 | - this.type = this.tabList[0].value | |
103 | - this.id = JSON.parse(this.$route.query.id) | |
161 | + this.type = this.tabList[0].value; | |
162 | + this.id = JSON.parse(this.$route.query.id); | |
104 | 163 | this.status = this.$route.query.status ? this.$route.query.status : 0; |
105 | 164 | this._QueryData(); |
106 | - this.types != 1 ?this._QueryDataQuestionRank():''; | |
107 | - this.types != 3 ? this.periodDetail() : ''; | |
165 | + this.types != 1 ? this._QueryDataQuestionRank() : ""; | |
166 | + this.types != 3 ? this.periodDetail() : ""; | |
108 | 167 | }, |
109 | 168 | methods: { |
110 | 169 | print() { |
... | ... | @@ -141,9 +200,10 @@ export default { |
141 | 200 | this._QueryData(); |
142 | 201 | }, |
143 | 202 | async periodDetail() { |
144 | - const periodDetail = this.role == "ROLE_PERSONAL" ? | |
145 | - this.$request.pPeriodDetail : | |
146 | - this.$request.periodDetail; | |
203 | + const periodDetail = | |
204 | + this.role == "ROLE_PERSONAL" | |
205 | + ? this.$request.pPeriodDetail | |
206 | + : this.$request.periodDetail; | |
147 | 207 | let { data, info, status } = await periodDetail({ |
148 | 208 | periodIds: this.id, |
149 | 209 | }); |
... | ... | @@ -164,42 +224,54 @@ export default { |
164 | 224 | let query = {}; |
165 | 225 | if (this.role == "ROLE_PERSONAL") { |
166 | 226 | if (this.types == 1) { |
167 | - query.page = this.page | |
168 | - query.size = this.size | |
169 | - queryData = this.type == 1 | |
170 | - ? this.$request.pPeriodQuestionReport | |
171 | - : this.$request.pPeriodStudentReport; | |
172 | - | |
173 | - } | |
174 | - else if (this.types == 2) { | |
175 | - queryData = this.type == 1 | |
176 | - ? this.$request.pPeriodQuestionReport | |
177 | - : this.type == 2 ? this.$request.phaseAnswerReport : this.$request.phaseInteractiveReport; | |
227 | + query.page = this.page; | |
228 | + query.size = this.size; | |
229 | + queryData = | |
230 | + this.type == 1 | |
231 | + ? this.$request.pPeriodQuestionReport | |
232 | + : this.$request.pPeriodStudentReport; | |
233 | + } else if (this.types == 2) { | |
234 | + queryData = | |
235 | + this.type == 1 | |
236 | + ? this.$request.pPeriodQuestionReport | |
237 | + : this.type == 2 | |
238 | + ? this.$request.phaseAnswerReport | |
239 | + : this.$request.phaseInteractiveReport; | |
178 | 240 | } else if (this.types == 3) { |
179 | - queryData = this.type == 2 ? this.$request.pPhaseAnswerReport : this.$request.pPhaseInteractiveReport; | |
241 | + queryData = | |
242 | + this.type == 2 | |
243 | + ? this.$request.pPhaseAnswerReport | |
244 | + : this.$request.pPhaseInteractiveReport; | |
180 | 245 | } |
181 | 246 | } else { |
182 | 247 | if (this.types == 1) { |
183 | - query.page = this.page | |
184 | - query.size = this.size | |
185 | - queryData = this.type == 1 | |
186 | - ? this.$request.periodQuestionReport | |
187 | - : this.$request.periodStudentReport; | |
248 | + query.page = this.page; | |
249 | + query.size = this.size; | |
250 | + queryData = | |
251 | + this.type == 1 | |
252 | + ? this.$request.periodQuestionReport | |
253 | + : this.$request.periodStudentReport; | |
188 | 254 | } else if (this.types == 2) { |
189 | - queryData = this.type == 1 | |
190 | - ? this.$request.periodQuestionReport | |
191 | - : this.type == 2 ? this.$request.phaseAnswerReport : this.$request.phaseInteractiveReport; | |
255 | + queryData = | |
256 | + this.type == 1 | |
257 | + ? this.$request.periodQuestionReport | |
258 | + : this.type == 2 | |
259 | + ? this.$request.phaseAnswerReport | |
260 | + : this.$request.phaseInteractiveReport; | |
192 | 261 | } else if (this.types == 3) { |
193 | - queryData = this.type == 2 ? this.$request.cTPhaseAnswerReport : this.$request.cTPhaseInteractiveReport; | |
262 | + queryData = | |
263 | + this.type == 2 | |
264 | + ? this.$request.cTPhaseAnswerReport | |
265 | + : this.$request.cTPhaseInteractiveReport; | |
194 | 266 | } |
195 | 267 | } |
196 | 268 | if (this.types == 1) { |
197 | - query.periodId = this.id[0] | |
198 | - query.type = this.type - 1 | |
269 | + query.periodId = this.id[0]; | |
270 | + query.type = this.type - 1; | |
199 | 271 | } else { |
200 | - query.periodIds = this.id | |
272 | + query.periodIds = this.id; | |
201 | 273 | if (this.types == 3) { |
202 | - query.subjectNames = this.subjectNames | |
274 | + query.subjectNames = this.subjectNames; | |
203 | 275 | } |
204 | 276 | } |
205 | 277 | this.loading = true; |
... | ... | @@ -209,7 +281,7 @@ export default { |
209 | 281 | }); |
210 | 282 | this.loading = false; |
211 | 283 | if (status === 0) { |
212 | - this.tableData = data?.list || [] | |
284 | + this.tableData = data?.list || []; | |
213 | 285 | this.total = data.count; |
214 | 286 | } else { |
215 | 287 | this.$message.error(info); |
... | ... | @@ -218,15 +290,15 @@ export default { |
218 | 290 | async _QueryDataQuestionRank() { |
219 | 291 | let queryData; |
220 | 292 | let query = {}; |
221 | - | |
222 | - query.periodIds = this.id | |
223 | - if (this.types == 2) { | |
224 | - queryData = this.$request.phaseAnswerReport | |
225 | - } else if (this.types == 3) { | |
226 | - queryData = this.$request.cTPhaseAnswerReport | |
227 | - } | |
293 | + | |
294 | + query.periodIds = this.id; | |
295 | + if (this.types == 2) { | |
296 | + queryData = this.$request.phaseAnswerReport; | |
297 | + } else if (this.types == 3) { | |
298 | + queryData = this.$request.cTPhaseAnswerReport; | |
299 | + } | |
228 | 300 | if (this.types != 1) { |
229 | - query.classId = this.classId | |
301 | + query.classId = this.classId; | |
230 | 302 | } |
231 | 303 | this.loading = true; |
232 | 304 | let { data, info, status } = await queryData({ |
... | ... | @@ -234,15 +306,15 @@ export default { |
234 | 306 | ...query, |
235 | 307 | }); |
236 | 308 | this.loading = false; |
237 | - console.log(data) | |
309 | + console.log(data); | |
238 | 310 | if (status === 0) { |
239 | - this.exportStudent = data?.list && [...data?.list] || [] | |
311 | + this.exportStudent = (data?.list && [...data?.list]) || []; | |
240 | 312 | } else { |
241 | 313 | this.$message.error(info); |
242 | 314 | } |
243 | 315 | }, |
244 | 316 | |
245 | - //导出 | |
317 | + //导出 | |
246 | 318 | openDown() { |
247 | 319 | this.diaShow = true; |
248 | 320 | }, |
... | ... | @@ -252,39 +324,48 @@ export default { |
252 | 324 | async exportData(arr) { |
253 | 325 | if (this.exportLoading == true) return; |
254 | 326 | this.exportLoading = true; |
255 | - let studentIds = arr | |
327 | + let studentIds = arr; | |
256 | 328 | let query = {}; |
257 | - if(studentIds != null){ | |
329 | + if (studentIds != null) { | |
258 | 330 | if (studentIds.length > 0) { |
259 | - query.studentIds = studentIds | |
331 | + query.studentIds = studentIds; | |
260 | 332 | } else { |
261 | - query.studentIds = [] | |
333 | + query.studentIds = []; | |
262 | 334 | } |
263 | 335 | } |
264 | - let exportPeriodReport = "" | |
336 | + let exportPeriodReport = ""; | |
265 | 337 | if (this.types == 1) { |
266 | - query.periodId = this.id[0] | |
267 | - exportPeriodReport = this.role == "ROLE_PERSONAL" ? this.$request.pExportPeriodReport : this.$request.exportPeriodReport | |
268 | - } else if(this.types == 2){ | |
269 | - query.periodIds = this.id | |
270 | - exportPeriodReport = this.role == "ROLE_PERSONAL" ?this.$request.pExportPhaseAnswerReport:this.$request.exportPhaseAnswerReport | |
271 | - }else{ | |
272 | - query.periodIds = this.id | |
273 | - exportPeriodReport = this.$request.cTExportPhaseAnswerReport | |
338 | + query.periodId = this.id[0]; | |
339 | + exportPeriodReport = | |
340 | + this.role == "ROLE_PERSONAL" | |
341 | + ? this.$request.pExportPeriodReport | |
342 | + : this.$request.exportPeriodReport; | |
343 | + } else if (this.types == 2) { | |
344 | + query.periodIds = this.id; | |
345 | + exportPeriodReport = | |
346 | + this.role == "ROLE_PERSONAL" | |
347 | + ? this.$request.pExportPhaseAnswerReport | |
348 | + : this.$request.exportPhaseAnswerReport; | |
349 | + } else { | |
350 | + query.periodIds = this.id; | |
351 | + exportPeriodReport = this.$request.cTExportPhaseAnswerReport; | |
274 | 352 | } |
275 | 353 | const data = await exportPeriodReport({ |
276 | 354 | classId: this.classId, |
277 | - ...query | |
355 | + ...query, | |
278 | 356 | }); |
279 | 357 | this.exportLoading = false; |
280 | 358 | if (data) { |
281 | - this.cancel() | |
359 | + this.cancel(); | |
282 | 360 | let blob = new Blob([data], { |
283 | 361 | type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", |
284 | 362 | }); |
285 | - let name = this.types == 1 ? "随堂问-单课时报表.xlsx" : | |
286 | - this.types == 2 ? `随堂问-${this.className}-${this.subjectNames[0]}汇总分析报表.xlsx` : | |
287 | - `随堂问-${this.className}-多科汇总分析报表.xlsx` | |
363 | + let name = | |
364 | + this.types == 1 | |
365 | + ? "随堂问-单课时报表.xlsx" | |
366 | + : this.types == 2 | |
367 | + ? `随堂问-${this.className}-${this.subjectNames[0]}汇总分析报表.xlsx` | |
368 | + : `随堂问-${this.className}-多科汇总分析报表.xlsx`; | |
288 | 369 | downloadFile(this.status ? "随堂问-已归档单课时报表.xlsx" : name, blob); |
289 | 370 | } else { |
290 | 371 | this.$message.error("下载失败"); |
... | ... | @@ -351,7 +432,6 @@ div::-webkit-scrollbar-thumb { |
351 | 432 | } |
352 | 433 | |
353 | 434 | .el-dialog { |
354 | - | |
355 | 435 | .down-item { |
356 | 436 | font-size: 15px; |
357 | 437 | margin-bottom: 10px; | ... | ... |
src/views/basic/setUp/teacher.vue
... | ... | @@ -538,13 +538,14 @@ export default { |
538 | 538 | async created() { |
539 | 539 | this.code = this.$store.getters.csCode; |
540 | 540 | this._QueryData(4); |
541 | - await this._QueryDataGrade(); | |
541 | + await this._QueryDataGrade(1); //筛选用 | |
542 | + await this._QueryDataGrade(2); //配置角色用 | |
542 | 543 | // this._RoleList(); |
543 | 544 | }, |
544 | 545 | methods: { |
545 | 546 | async changeType() { |
546 | 547 | this.query.gradeClassSub = []; |
547 | - this.query.type = 0; | |
548 | + // this.query.type = 0; | |
548 | 549 | this.query.teacherName = ""; |
549 | 550 | this.query.phone = ""; |
550 | 551 | if (this.query.classType === 0) { |
... | ... | @@ -554,7 +555,7 @@ export default { |
554 | 555 | } |
555 | 556 | |
556 | 557 | this._QueryData(6); |
557 | - await this._QueryDataGrade(); | |
558 | + await this._QueryDataGrade(1); | |
558 | 559 | }, |
559 | 560 | //选择删除 |
560 | 561 | handleCheckAllChange(val) { |
... | ... | @@ -982,10 +983,14 @@ export default { |
982 | 983 | this.$message.error(info); |
983 | 984 | } |
984 | 985 | }, |
985 | - async _QueryDataGrade() { | |
986 | + async _QueryDataGrade(type) { | |
987 | + let query = {}; | |
988 | + if (type == 1) { | |
989 | + query.type = this.query.classType; | |
990 | + } | |
986 | 991 | //年级数据 |
987 | 992 | const { data, status, info } = await this.$request.gradeList({ |
988 | - type: this.query.classType, | |
993 | + ...query, | |
989 | 994 | }); |
990 | 995 | if (status === 0) { |
991 | 996 | this.classList = []; |
... | ... | @@ -1000,23 +1005,9 @@ export default { |
1000 | 1005 | label: items, |
1001 | 1006 | }; |
1002 | 1007 | }); |
1003 | - // 学校-年级 | |
1004 | - this.gradeClassList.push({ | |
1005 | - value: item.grade, | |
1006 | - label: item.gradeName, | |
1007 | - id: item.grade, | |
1008 | - children: item.classList.map((clazz) => { | |
1009 | - return { | |
1010 | - value: clazz.id, | |
1011 | - label: clazz.className, | |
1012 | - id: clazz.id, | |
1013 | - }; | |
1014 | - }), | |
1015 | - }); | |
1016 | - | |
1017 | - if (this.query.classType == 0) { | |
1018 | - //学校-年级-科目 | |
1019 | - this.gradeClassSubList.push({ | |
1008 | + if (type == 2) { | |
1009 | + // 学校-年级 | |
1010 | + this.gradeClassList.push({ | |
1020 | 1011 | value: item.grade, |
1021 | 1012 | label: item.gradeName, |
1022 | 1013 | id: item.grade, |
... | ... | @@ -1025,29 +1016,10 @@ export default { |
1025 | 1016 | value: clazz.id, |
1026 | 1017 | label: clazz.className, |
1027 | 1018 | id: clazz.id, |
1028 | - children: [...subList], | |
1029 | - }; | |
1030 | - }), | |
1031 | - }); | |
1032 | - //学校-科目-班级 | |
1033 | - this.gradeSubListClass.push({ | |
1034 | - value: item.grade, | |
1035 | - label: item.gradeName, | |
1036 | - id: item.grade, | |
1037 | - children: item.subjectNames.map((items) => { | |
1038 | - return { | |
1039 | - value: items, | |
1040 | - label: items, | |
1041 | - children: item.classList.map((clazz) => { | |
1042 | - return { | |
1043 | - value: clazz.id, | |
1044 | - label: clazz.className, | |
1045 | - }; | |
1046 | - }), | |
1047 | 1019 | }; |
1048 | 1020 | }), |
1049 | 1021 | }); |
1050 | - } else { | |
1022 | + | |
1051 | 1023 | let subjectNames = item.classList.map((clazz) => { |
1052 | 1024 | return { |
1053 | 1025 | value: clazz.subjectName, |
... | ... | @@ -1061,32 +1033,72 @@ export default { |
1061 | 1033 | }; |
1062 | 1034 | }); |
1063 | 1035 | |
1064 | - //学校-年级-科目 | |
1065 | - this.gradeClassSubList.push({ | |
1036 | + //学校-科目-班级 | |
1037 | + this.gradeSubListClass.push({ | |
1066 | 1038 | value: item.grade, |
1067 | 1039 | label: item.gradeName, |
1068 | 1040 | id: item.grade, |
1069 | - children: item.classList.map((clazz) => { | |
1041 | + children: item.subjectNames.map((items) => { | |
1042 | + let child = []; | |
1043 | + item.classList.map((clazz) => { | |
1044 | + if (clazz.subjectName) { | |
1045 | + if (items == clazz.subjectName) { | |
1046 | + child.push({ | |
1047 | + value: clazz.id, | |
1048 | + label: clazz.className, | |
1049 | + }); | |
1050 | + } | |
1051 | + } else { | |
1052 | + child.push({ | |
1053 | + value: clazz.id, | |
1054 | + label: clazz.className, | |
1055 | + }); | |
1056 | + } | |
1057 | + }); | |
1070 | 1058 | return { |
1071 | - value: clazz.id, | |
1072 | - label: clazz.className, | |
1073 | - id: clazz.id, | |
1074 | - children: [ | |
1075 | - { | |
1076 | - value: clazz.subjectName, | |
1077 | - label: clazz.subjectName, | |
1078 | - }, | |
1079 | - ], | |
1059 | + value: items, | |
1060 | + label: items, | |
1061 | + children: child, | |
1080 | 1062 | }; |
1081 | 1063 | }), |
1082 | 1064 | }); |
1083 | - | |
1084 | - this.gradeSubListClass.push({ | |
1085 | - value: item.grade, | |
1086 | - label: item.gradeName, | |
1087 | - id: item.grade, | |
1088 | - children: subjectNames, | |
1089 | - }); | |
1065 | + } else { | |
1066 | + if (this.query.classType == 0) { | |
1067 | + //学校-年级-科目 | |
1068 | + this.gradeClassSubList.push({ | |
1069 | + value: item.grade, | |
1070 | + label: item.gradeName, | |
1071 | + id: item.grade, | |
1072 | + children: item.classList.map((clazz) => { | |
1073 | + return { | |
1074 | + value: clazz.id, | |
1075 | + label: clazz.className, | |
1076 | + id: clazz.id, | |
1077 | + children: [...subList], | |
1078 | + }; | |
1079 | + }), | |
1080 | + }); | |
1081 | + } else { | |
1082 | + //学校-年级-科目 | |
1083 | + this.gradeClassSubList.push({ | |
1084 | + value: item.grade, | |
1085 | + label: item.gradeName, | |
1086 | + id: item.grade, | |
1087 | + children: item.classList.map((clazz) => { | |
1088 | + return { | |
1089 | + value: clazz.id, | |
1090 | + label: clazz.className, | |
1091 | + id: clazz.id, | |
1092 | + children: [ | |
1093 | + { | |
1094 | + value: clazz.subjectName, | |
1095 | + label: clazz.subjectName, | |
1096 | + }, | |
1097 | + ], | |
1098 | + }; | |
1099 | + }), | |
1100 | + }); | |
1101 | + } | |
1090 | 1102 | } |
1091 | 1103 | |
1092 | 1104 | let classList = item.classList.map((clazz) => { | ... | ... |
src/views/basic/test/components/multipleSubTest.vue
... | ... | @@ -2,47 +2,111 @@ |
2 | 2 | <div class="table-box" ref="main" v-loading="loading"> |
3 | 3 | <div id="print-content"> |
4 | 4 | <!-- 多科多卷 --> |
5 | - <el-table :data="tableData" :max-height="tableMaxHeight" border style="width: 100%"> | |
6 | - <el-table-column prop="studentCode" label="学号" align="center" fixed></el-table-column> | |
5 | + <el-table | |
6 | + :data="tableData" | |
7 | + :max-height="tableMaxHeight" | |
8 | + border | |
9 | + style="width: 100%" | |
10 | + > | |
11 | + <el-table-column | |
12 | + prop="studentCode" | |
13 | + label="学号" | |
14 | + align="center" | |
15 | + fixed | |
16 | + ></el-table-column> | |
7 | 17 | |
8 | 18 | <el-table-column prop="studentName" label="姓名" fixed align="center"> |
9 | - <template slot-scope="scoped"><span class="click-b" @click="toPortrait(scoped.row)"> | |
19 | + <template slot-scope="scoped" | |
20 | + ><span class="click-b" @click="toPortrait(scoped.row)"> | |
10 | 21 | {{ scoped.row.studentName }} |
11 | - </span></template> | |
22 | + </span></template | |
23 | + > | |
12 | 24 | </el-table-column> |
13 | - <el-table-column align="center" v-for="(item, index) in answerList" :key="index" :label="item"> | |
14 | - <el-table-column :prop="'examCount' + item" label="测练数" align="center" | |
15 | - :class-name="index % 2 == 0 ? 'bg' : ''"></el-table-column> | |
16 | - <el-table-column :prop="'participationCount' + item" label="参与数" align="center" | |
17 | - :class-name="index % 2 == 0 ? 'bg' : ''"></el-table-column> | |
18 | - <el-table-column :prop="'score' + item" label="总分" align="center" | |
19 | - :class-name="index % 2 == 0 ? 'bg' : ''"></el-table-column> | |
20 | - <el-table-column :prop="'classRank' + item" label="班名" align="center" | |
21 | - :class-name="index % 2 == 0 ? 'bg' : ''"></el-table-column> | |
25 | + <el-table-column | |
26 | + align="center" | |
27 | + v-for="(item, index) in answerList" | |
28 | + :key="index" | |
29 | + :label="item" | |
30 | + > | |
31 | + <el-table-column | |
32 | + :prop="'examCount' + item" | |
33 | + label="测练数" | |
34 | + align="center" | |
35 | + :class-name="index % 2 == 0 ? 'bg' : ''" | |
36 | + ></el-table-column> | |
37 | + <el-table-column | |
38 | + :prop="'participationCount' + item" | |
39 | + label="参与数" | |
40 | + align="center" | |
41 | + :class-name="index % 2 == 0 ? 'bg' : ''" | |
42 | + ></el-table-column> | |
43 | + <el-table-column | |
44 | + :prop="'score' + item" | |
45 | + label="总分" | |
46 | + align="center" | |
47 | + :class-name="index % 2 == 0 ? 'bg' : ''" | |
48 | + ></el-table-column> | |
49 | + <el-table-column | |
50 | + :prop="'classRank' + item" | |
51 | + label="班名" | |
52 | + align="center" | |
53 | + :class-name="index % 2 == 0 ? 'bg' : ''" | |
54 | + ></el-table-column> | |
22 | 55 | </el-table-column> |
23 | 56 | <el-table-column label="查看雷达图" align="center"> |
24 | 57 | <template slot-scope="scoped"> |
25 | - <el-button @click="openChart(scoped.row)" type="primary" size="mini" circle | |
26 | - icon="el-icon-arrow-right"></el-button> | |
58 | + <el-button | |
59 | + @click="openChart(scoped.row)" | |
60 | + type="primary" | |
61 | + size="mini" | |
62 | + circle | |
63 | + icon="el-icon-arrow-right" | |
64 | + ></el-button> | |
27 | 65 | </template> |
28 | 66 | </el-table-column> |
29 | 67 | </el-table> |
30 | 68 | </div> |
31 | 69 | <div class="down"> |
32 | - <el-button @click="openDown" type="primary" plain round icon="fa fa-cloud-download">导出报表</el-button> | |
33 | - <el-button v-if="!this.$store.getters.code" @click="print" type="primary" plain round | |
34 | - icon="el-icon-printer">打印</el-button> | |
70 | + <el-button | |
71 | + @click="openDown" | |
72 | + type="primary" | |
73 | + plain | |
74 | + round | |
75 | + icon="fa fa-cloud-download" | |
76 | + >导出报表</el-button | |
77 | + > | |
78 | + <el-button | |
79 | + v-if="!this.$store.getters.code" | |
80 | + @click="print" | |
81 | + type="primary" | |
82 | + plain | |
83 | + round | |
84 | + icon="el-icon-printer" | |
85 | + >打印</el-button | |
86 | + > | |
35 | 87 | </div> |
36 | - <el-dialog class="chart-dia" :visible.sync="chartDia" :title="chartTitle" width="800"> | |
88 | + <el-dialog | |
89 | + class="chart-dia" | |
90 | + :visible.sync="chartDia" | |
91 | + :title="chartTitle" | |
92 | + width="800" | |
93 | + > | |
37 | 94 | <div class="chart-box"> |
38 | 95 | <RadarChart id="radarChart" :params="chartData" /> |
39 | 96 | </div> |
40 | 97 | </el-dialog> |
41 | - <ExportDia :exportStudent="exportStudent" :diaShow="diaShow" @cancel="cancel" @exportData="exportData" type="雷达图"/> | |
98 | + <ExportDia | |
99 | + :exportStudent="exportStudent" | |
100 | + :diaShow="diaShow" | |
101 | + @cancel="cancel" | |
102 | + @exportData="exportData" | |
103 | + lastLabel="总分" | |
104 | + type="雷达图" | |
105 | + /> | |
42 | 106 | </div> |
43 | 107 | </template> |
44 | 108 | <script> |
45 | -import RadarChart from "@/components/charts/radarChart" | |
109 | +import RadarChart from "@/components/charts/radarChart"; | |
46 | 110 | |
47 | 111 | import { downloadFile, tablePrint } from "@/utils"; |
48 | 112 | export default { |
... | ... | @@ -65,37 +129,38 @@ export default { |
65 | 129 | chartData: { |
66 | 130 | indicator: [ |
67 | 131 | { |
68 | - name: '', max: 100, | |
132 | + name: "", | |
133 | + max: 100, | |
69 | 134 | axisLabel: { |
70 | 135 | show: true, |
71 | 136 | showMaxLabel: true, |
72 | 137 | }, |
73 | 138 | }, |
74 | 139 | ], |
75 | - seriesData: [] | |
140 | + seriesData: [], | |
76 | 141 | }, |
77 | 142 | chartDia: false, |
78 | 143 | chartTitle: "", |
79 | 144 | |
80 | 145 | //导出相关 |
81 | 146 | diaShow: false, |
82 | - exportStudent: [] | |
83 | - } | |
147 | + exportStudent: [], | |
148 | + }; | |
84 | 149 | }, |
85 | 150 | computed: { |
86 | 151 | subjectList: function () { |
87 | - return this.subjectName?.split(",") | |
88 | - } | |
152 | + return this.subjectName?.split(","); | |
153 | + }, | |
89 | 154 | }, |
90 | 155 | created() { |
91 | - this.phaseExamReport() | |
156 | + this.phaseExamReport(); | |
92 | 157 | }, |
93 | 158 | mounted() { |
94 | 159 | this.tableMaxHeight = this.$refs.main.offsetHeight; |
95 | 160 | }, |
96 | 161 | methods: { |
97 | 162 | print() { |
98 | - tablePrint("print-content", this.title + this.tabList[this.type]); | |
163 | + tablePrint("print-content", this.subjectName + "汇总报表"); | |
99 | 164 | }, |
100 | 165 | toPortrait(obj) { |
101 | 166 | //暂时不上线 |
... | ... | @@ -135,63 +200,61 @@ export default { |
135 | 200 | }, |
136 | 201 | //查看雷达图 |
137 | 202 | openChart(obj) { |
138 | - | |
139 | - this.chartTitle = obj.studentName + '-多科-多课时作答表现图' | |
203 | + this.chartTitle = obj.studentName + "-多科-多课时作答表现图"; | |
140 | 204 | let max = 0; |
141 | - const dataList = obj.dataList.slice(1, obj.dataList.length) | |
142 | - let subjectList = dataList.map(item => { | |
143 | - let score = Number(item.highestScore || item.score) | |
144 | - max = score > max ? score : max | |
145 | - return item.subjectName | |
146 | - }) | |
147 | - max += 10 | |
148 | - max = max > 150 ? 150 : max | |
205 | + const dataList = obj.dataList.slice(1, obj.dataList.length); | |
206 | + let subjectList = dataList.map((item) => { | |
207 | + let score = Number(item.highestScore || item.score); | |
208 | + max = score > max ? score : max; | |
209 | + return item.subjectName; | |
210 | + }); | |
211 | + max += 10; | |
212 | + max = max > 150 ? 150 : max; | |
149 | 213 | this.chartData = { |
150 | 214 | indicator: [ |
151 | 215 | { |
152 | - name: '', max: max, | |
216 | + name: "", | |
217 | + max: max, | |
153 | 218 | axisLabel: { |
154 | 219 | show: true, |
155 | 220 | showMaxLabel: true, |
156 | 221 | }, |
157 | 222 | }, |
158 | 223 | ], |
159 | - seriesData: [] | |
160 | - } | |
224 | + seriesData: [], | |
225 | + }; | |
161 | 226 | subjectList.map((item, index) => { |
162 | 227 | if (index < 1) { |
163 | - this.chartData.indicator[index].name = item | |
164 | - this.chartData.indicator[index].max = max | |
228 | + this.chartData.indicator[index].name = item; | |
229 | + this.chartData.indicator[index].max = max; | |
165 | 230 | } else { |
166 | - this.chartData.indicator.push({ name: item, max: max }) | |
231 | + this.chartData.indicator.push({ name: item, max: max }); | |
167 | 232 | } |
168 | - }) | |
233 | + }); | |
169 | 234 | // 为了美观 |
170 | 235 | if (this.chartData.indicator.length < 3) { |
171 | - let num = this.chartData.indicator.length | |
236 | + let num = this.chartData.indicator.length; | |
172 | 237 | for (let i = 0; i < 6; i++) { |
173 | 238 | if (i >= num) { |
174 | - this.chartData.indicator.push({ name: "", max: max }) | |
239 | + this.chartData.indicator.push({ name: "", max: max }); | |
175 | 240 | } |
176 | 241 | } |
177 | 242 | } |
178 | 243 | this.chartData.seriesData = [ |
179 | 244 | { |
180 | - value: dataList.map(item => item.highestScore), | |
181 | - name: '班级最高分' | |
245 | + value: dataList.map((item) => item.highestScore), | |
246 | + name: "班级最高分", | |
182 | 247 | }, |
183 | 248 | { |
184 | - value: dataList.map(item => item.avgScore), | |
185 | - name: '班平均分' | |
249 | + value: dataList.map((item) => item.avgScore), | |
250 | + name: "班平均分", | |
186 | 251 | }, |
187 | 252 | { |
188 | - value: dataList.map(item => item.score), | |
189 | - name: '本人得分' | |
253 | + value: dataList.map((item) => item.score), | |
254 | + name: "本人得分", | |
190 | 255 | }, |
191 | - ] | |
192 | - this.chartDia = true | |
193 | - | |
194 | - | |
256 | + ]; | |
257 | + this.chartDia = true; | |
195 | 258 | }, |
196 | 259 | async phaseExamReport() { |
197 | 260 | this.loading = true; |
... | ... | @@ -222,7 +285,7 @@ export default { |
222 | 285 | }; |
223 | 286 | }); |
224 | 287 | this.answerList = [...subjectName]; |
225 | - this.exportStudent = [...this.tableData] | |
288 | + this.exportStudent = [...this.tableData]; | |
226 | 289 | } else { |
227 | 290 | this.$message.error(info); |
228 | 291 | } |
... | ... | @@ -237,21 +300,20 @@ export default { |
237 | 300 | async exportData(arr) { |
238 | 301 | if (this.exportLoading == true) return; |
239 | 302 | this.exportLoading = true; |
240 | - let studentIds = arr | |
303 | + let studentIds = arr; | |
241 | 304 | let query = {}; |
242 | - if(studentIds != null){ | |
305 | + if (studentIds != null) { | |
243 | 306 | if (studentIds.length > 0) { |
244 | - query.studentIds = studentIds | |
307 | + query.studentIds = studentIds; | |
245 | 308 | } else { |
246 | - query.studentIds = [] | |
309 | + query.studentIds = []; | |
247 | 310 | } |
248 | 311 | } |
249 | 312 | |
250 | - | |
251 | 313 | const data = await this.$request.cTExportPhaseExamReport({ |
252 | 314 | classId: this.classId, |
253 | 315 | examIds: this.ids, |
254 | - ...query | |
316 | + ...query, | |
255 | 317 | }); |
256 | 318 | this.exportLoading = false; |
257 | 319 | if (data) { |
... | ... | @@ -265,12 +327,12 @@ export default { |
265 | 327 | blob |
266 | 328 | ); |
267 | 329 | this.$message.success("下载成功"); |
268 | - this.cancel() | |
330 | + this.cancel(); | |
269 | 331 | } else { |
270 | 332 | this.$message.error("下载失败"); |
271 | 333 | } |
272 | 334 | }, |
273 | - } | |
335 | + }, | |
274 | 336 | }; |
275 | 337 | </script> |
276 | 338 | <style lang="scss" scoped> | ... | ... |
src/views/basic/test/components/scoreSet.vue
... | ... | @@ -178,36 +178,44 @@ export default { |
178 | 178 | if (status === 0) { |
179 | 179 | let studentList = data.students || []; |
180 | 180 | this.questionList = data?.questionList || []; |
181 | + if (this.questionList.length == 0) { | |
182 | + this.questionList = Object.keys(studentList[0].scoreMap).map( | |
183 | + (item) => { | |
184 | + return { | |
185 | + questionId: item, | |
186 | + questionScore: 20, | |
187 | + }; | |
188 | + } | |
189 | + ); | |
190 | + } | |
181 | 191 | this.tableData = |
182 | - (this.questionList.length && | |
183 | - studentList.map((item) => { | |
184 | - item.all = item.all || 0; //总分 | |
185 | - item.object = item.object || 0; //客观题分数 | |
186 | - item.subject = item.subject || 0; //主观题分数 | |
187 | - if (!item.scoreMap) item.scoreMap = {}; | |
188 | - this.questionList.map((question) => { | |
189 | - let keys = question.questionId; | |
190 | - if (!item.scoreMap[keys]) { | |
191 | - if (item.scoreMap[keys] == 0) { | |
192 | - item.scoreMap[keys] = 0; | |
193 | - } else { | |
194 | - item.scoreMap[keys] = ""; | |
195 | - } | |
192 | + studentList.map((item) => { | |
193 | + item.all = item.all || 0; //总分 | |
194 | + item.object = item.object || 0; //客观题分数 | |
195 | + item.subject = item.subject || 0; //主观题分数 | |
196 | + if (!item.scoreMap) item.scoreMap = {}; | |
197 | + this.questionList.map((question) => { | |
198 | + let keys = question.questionId; | |
199 | + if (!item.scoreMap[keys]) { | |
200 | + if (item.scoreMap[keys] == 0) { | |
201 | + item.scoreMap[keys] = 0; | |
196 | 202 | } else { |
197 | - let num = Number(item.scoreMap[keys]); | |
198 | - item.scoreMap[keys] = num; | |
199 | - // item.score += num | |
200 | - // if (question.questionType == 5) { | |
201 | - // item.subjectiveScore += num | |
202 | - // } else { | |
203 | - // item.objectiveScore += num | |
204 | - // } | |
203 | + item.scoreMap[keys] = ""; | |
205 | 204 | } |
206 | - }); | |
205 | + } else { | |
206 | + let num = Number(item.scoreMap[keys]); | |
207 | + item.scoreMap[keys] = num; | |
208 | + // item.score += num | |
209 | + // if (question.questionType == 5) { | |
210 | + // item.subjectiveScore += num | |
211 | + // } else { | |
212 | + // item.objectiveScore += num | |
213 | + // } | |
214 | + } | |
215 | + }); | |
207 | 216 | |
208 | - return item; | |
209 | - })) || | |
210 | - []; | |
217 | + return item; | |
218 | + }) || []; | |
211 | 219 | this.setTableHeight(); |
212 | 220 | } else { |
213 | 221 | this.$message.error(info); | ... | ... |
src/views/examinationPaper/add.vue
... | ... | @@ -2022,9 +2022,9 @@ export default { |
2022 | 2022 | id: item.tagId, |
2023 | 2023 | }; |
2024 | 2024 | }) || []; |
2025 | - if (this.type != 2) { | |
2026 | - this.form.tagId = this.answerTypeList[0]?.id || ""; | |
2027 | - } | |
2025 | + // if (this.type != 2) { | |
2026 | + // this.form.tagId = this.answerTypeList[0]?.id || ""; | |
2027 | + // } | |
2028 | 2028 | } else { |
2029 | 2029 | this.$message.error(info); |
2030 | 2030 | } | ... | ... |