Commit 8ea67428e9a73e9555b5ba4894572f3ac64a11d3

Authored by 梁保满
1 parent 6d7bd862

飞书bug

src/api/axios.js
... ... @@ -71,7 +71,6 @@ service.interceptors.response.use(
71 71  
72 72 if (status === 403 || status === 401) {
73 73 if (data.status === 999) {
74   - debugger
75 74 console.log(data.data)
76 75 if (data.data) {
77 76 window.location.href = data.data;
... ...
src/components/setAnswer.vue
... ... @@ -356,10 +356,10 @@ export default {
356 356 }
357 357 },
358 358 async saveAnswer() {
359   - let questionList = [];
360   - for (let i = 0; i < this.FormQuestionList.length; i++) {
361   - if (this.FormQuestionList[i].qusType) {
362   - this.FormQuestionList.splice(i, 1);
  359 + let questionList = [...this.FormQuestionList];
  360 + for (let i = 0; i < questionList.length; i++) {
  361 + if (questionList[i].qusType) {
  362 + questionList.splice(i, 1);
363 363 i--;
364 364 }
365 365 }
... ...
src/components/upload.vue
... ... @@ -30,14 +30,8 @@
30 30 export default {
31 31 name: "downUpData",
32 32 props: {
33   - id: {
34   - type: String,
35   - default: "",
36   - },
37   - examId: {
38   - type: String,
39   - default: "",
40   - },
  33 + id: "",
  34 + examId: "",
41 35 url: {
42 36 type: String,
43 37 default: "",
... ...
src/views/analysis/index.vue
... ... @@ -185,6 +185,7 @@ export default {
185 185 //中国式星期天是一周的最后一天
186 186 day = 7;
187 187 }
  188 + day--
188 189 let aTime = new Date().getTime() - 24 * 60 * 60 * 1000 * day;
189 190 that.query.startDay = formatDate(new Date(aTime), "yyyy-MM-dd");
190 191 that.query.endDay = formatDate(new Date(), "yyyy-MM-dd");
... ...
src/views/ask/analysis.vue
... ... @@ -77,12 +77,12 @@
77 77 align="center"
78 78 ></el-table-column>
79 79 <el-table-column
80   - prop="canyu"
  80 + prop="participationRate"
81 81 label="班级参与度"
82 82 sortable
83 83 align="center"
84 84 ><template slot-scope="scoped"
85   - >{{ scoped.row.canyu }}%</template
  85 + >{{ scoped.row.participationRate }}%</template
86 86 ></el-table-column
87 87 >
88 88 <el-table-column
... ... @@ -107,21 +107,22 @@
107 107 prop="correctAnswer"
108 108 label="正确答案"
109 109 align="center"
110   - ></el-table-column>
  110 + > <template slot-scope="scoped">{{scoped.row.correctAnswer==1?"✓":scoped.row.correctAnswer==2?"✗":scoped.row.correctAnswer}}</template></el-table-column>
111 111 <el-table-column
112 112 prop="fallible"
113 113 label="干扰答案"
114 114 align="center"
115   - ></el-table-column>
116   - <el-table-column prop="screenshot" label="题干" align="center">
  115 + ><template slot-scope="scoped">{{scoped.row.fallible==1?"✓":scoped.row.fallible==2?"✗":scoped.row.correctAnswer}}</template></el-table-column>
  116 + <!-- <el-table-column prop="screenshot" label="题干" align="center">
117 117 <template slot-scope="scoped">
118 118 <el-image
  119 + v-if="scoped.row.screenshot"
119 120 style="width: 60px; height: 40px"
120 121 :src="scoped.row.screenshot"
121 122 :preview-src-list="[scoped.row.screenshot]"
122 123 >
123   - </el-image></template
124   - ></el-table-column>
  124 + </el-image><span v-else>暂无</span></template
  125 + ></el-table-column> -->
125 126 </el-table>
126 127 <el-table v-if="type == 2" :data="tableData" border style="width: 100%">
127 128 <el-table-column
... ... @@ -265,7 +266,7 @@
265 266 icon="fa fa-cloud-download"
266 267 >导出报表</el-button
267 268 >
268   - <el-button @click="edit" type="primary" round>设置答案</el-button>
  269 + <el-button @click="edit" type="primary" round>修改答案</el-button>
269 270 </p>
270 271 </div>
271 272 </div>
... ... @@ -336,6 +337,7 @@ export default {
336 337 },
337 338 handleSuccess() {
338 339 this.dialogVisible = false;
  340 + this._QueryData();
339 341 },
340 342 async edit() {
341 343 if (this.editLoading) return;
... ...
src/views/ask/index.vue
... ... @@ -94,7 +94,9 @@
94 94 @change="tabChange"
95 95 style="margin-bottom: 20px"
96 96 >
97   - <el-radio-button :label="1">单课时报表</el-radio-button>
  97 + <el-radio-button :label="1" v-if="query.startDay != query.endDay"
  98 + >单课时报表</el-radio-button
  99 + >
98 100 <!-- <el-radio-button :label="2" v-if="this.role != 'ROLE_BANZHUREN'"
99 101 >阶段问答报表</el-radio-button
100 102 > -->
... ... @@ -109,7 +111,7 @@
109 111 <span>总课时数:10</span>
110 112 <span>互动总数:22</span>
111 113 </p> -->
112   - <div v-if="tabIndex == 1">
  114 + <div v-show="tabIndex == 1">
113 115 <el-table
114 116 :data="tableData"
115 117 border
... ... @@ -153,40 +155,46 @@
153 155 >
154 156 </el-table-column>
155 157 <el-table-column
156   - prop="correctRate"
  158 + prop="classCorrectRate"
157 159 label="班级总正确率"
158 160 sortable="custom"
159 161 align="center"
160 162 ><template slot-scope="scoped"
161   - >{{ scoped.row.correctRate }}%</template
  163 + >{{ scoped.row.classCorrectRate }}%</template
162 164 ></el-table-column
163 165 >
164 166 <el-table-column label="操作" align="center">
165 167 <template slot-scope="scoped">
166   - <el-tooltip effect="dark" content="详情" placement="top">
  168 + <el-tooltip
  169 + effect="dark"
  170 + v-if="scoped.row.answerNum == 0"
  171 + content="设置答案"
  172 + placement="top"
  173 + >
167 174 <el-button
168 175 type="primary"
169 176 circle
170 177 size="mini"
171   - icon="fa fa-arrow-right"
172   - @click="linkTo(scoped.row)"
  178 + icon="fa fa-file-text"
  179 + @click="edit(scoped.row)"
173 180 ></el-button>
174 181 </el-tooltip>
175   - <el-tooltip effect="dark" content="修改答案" placement="top">
  182 + <el-tooltip v-else effect="dark" content="详情" placement="top">
176 183 <el-button
177 184 type="primary"
178 185 circle
179 186 size="mini"
180   - icon="fa fa-file-text"
181   - @click="edit(scoped.row)"
  187 + icon="fa fa-arrow-right"
  188 + @click="linkTo(scoped.row)"
182 189 ></el-button>
183 190 </el-tooltip>
184 191 </template>
185 192 </el-table-column>
186 193 </el-table>
187 194 </div>
188   - <div v-if="tabIndex == 2">
  195 + <div v-show="tabIndex == 2">
189 196 <el-table
  197 + v-if="role == 'ROLE_JIAOSHI'"
190 198 :data="tableData"
191 199 border
192 200 style="width: 100%"
... ... @@ -252,9 +260,34 @@
252 260 align="center"
253 261 ></el-table-column>
254 262 </el-table>
  263 + <el-table v-else :data="tableData" border style="width: 100%">
  264 + <el-table-column
  265 + prop="studentCode"
  266 + label="学号"
  267 + align="center"
  268 + ></el-table-column>
  269 + <el-table-column
  270 + prop="studentName"
  271 + label="姓名"
  272 + align="center"
  273 + width="100"
  274 + ></el-table-column>
  275 + <el-table-column
  276 + v-for="(item, index) in phaseOption"
  277 + :key="index"
  278 + :label="item"
  279 + align="center"
  280 + >
  281 + <el-table-column align="center" :label="index==0?'总课时数':'课时数'" :prop="'periodCount'+item"> </el-table-column>
  282 + <el-table-column align="center" :label="index==0?'总出题数':'出题数'" :prop="'questionNum'+item"> </el-table-column>
  283 + <el-table-column align="center" :label="index==0?'总参与度':'参与度'" :prop="'participationRate'+item"> </el-table-column>
  284 + <el-table-column align="center" :label="index==0?'总正确率':'正确率'" :prop="'correctRate'+item"> </el-table-column>
  285 + </el-table-column>
  286 + </el-table>
255 287 </div>
256   - <div v-if="tabIndex == 3">
  288 + <div v-show="tabIndex == 3">
257 289 <el-table
  290 + v-if="role == 'ROLE_JIAOSHI'"
258 291 :data="tableData"
259 292 border
260 293 style="width: 100%"
... ... @@ -296,18 +329,40 @@
296 329 align="center"
297 330 ></el-table-column>
298 331 <el-table-column
299   - prop="canyu"
  332 + prop="interactionsNum"
300 333 label="参与得分"
301 334 sortable
302 335 align="center"
303 336 ></el-table-column>
304 337 <el-table-column
305   - prop="duicuo"
  338 + prop="interactionsCorrectNum"
306 339 label="对错得分"
307 340 sortable
308 341 align="center"
309 342 ></el-table-column>
310 343 </el-table>
  344 + <el-table v-else :data="tableData" border style="width: 100%">
  345 + <el-table-column
  346 + prop="studentCode"
  347 + label="学号"
  348 + align="center"
  349 + ></el-table-column>
  350 + <el-table-column
  351 + prop="studentName"
  352 + label="姓名"
  353 + align="center"
  354 + width="100"
  355 + ></el-table-column>
  356 + <el-table-column
  357 + v-for="(item, index) in phaseInter"
  358 + :key="index"
  359 + :label="item"
  360 + align="center"
  361 + >
  362 + <el-table-column align="center" :label="index==0?'参与分':'互动数'" :prop="'interactionsNum'+item"> </el-table-column>
  363 + <el-table-column align="center" :label="index==0?'对错分':'参与数'" :prop="'interactionsCorrectNum'+item"> </el-table-column>
  364 + </el-table-column>
  365 + </el-table>
311 366 </div>
312 367 <div class="pagination-box" v-show="tabIndex == 1">
313 368 <el-pagination
... ... @@ -369,6 +424,8 @@ export default {
369 424 subjectList: [], //科目
370 425 tabIndex: 1, //选项卡
371 426 tableData: [],
  427 + phaseOption: [],//问答补充数据
  428 + phaseInter:[],//互动补充数据
372 429 page: 1,
373 430 size: 20,
374 431 total: 0,
... ... @@ -418,6 +475,7 @@ export default {
418 475 //中国式星期天是一周的最后一天
419 476 day = 7;
420 477 }
  478 + day--;
421 479 let aTime = new Date().getTime() - 24 * 60 * 60 * 1000 * day;
422 480 that.query.startDay = formatDate(new Date(aTime), "yyyy-MM-dd");
423 481 that.query.endDay = formatDate(new Date(), "yyyy-MM-dd");
... ... @@ -486,6 +544,7 @@ export default {
486 544 },
487 545 handleSuccess() {
488 546 this.dialogVisible = false;
  547 + this._QueryData();
489 548 },
490 549 tabChange() {
491 550 this.page = 1;
... ... @@ -509,7 +568,7 @@ export default {
509 568 async changClazz() {
510 569 await this._QuerySubjectList();
511 570 // await this.setDate(1);
512   - this._QueryData()
  571 + this._QueryData();
513 572 },
514 573 async _QueryClassList() {
515 574 const fetchClassList =
... ... @@ -640,7 +699,29 @@ export default {
640 699 });
641 700 this.loading = false;
642 701 if (status === 0) {
643   - this.tableData = (data?.list && [...data?.list]) || [];
  702 + if (this.role == "ROLE_BANZHUREN") {
  703 + let subjectName = [];
  704 + this.tableData = data?.list.map((item) => {
  705 + let params = {};
  706 + item.dataList.map((items, index) => {
  707 + if (!subjectName.includes(items.subjectName)) {
  708 + subjectName.push(items.subjectName);
  709 + }
  710 + params["answerCorrectRate" + items.subjectName] = items.answerCorrectRate;
  711 + params["correctRate" + items.subjectName] = items.correctRate;
  712 + params["participationRate" + items.subjectName] = items.participationRate;
  713 + params["periodCount" + items.subjectName] = items.periodCount;
  714 + params["questionNum" + items.subjectName] = items.questionNum;
  715 + });
  716 + return {
  717 + ...item,
  718 + ...params,
  719 + };
  720 + });
  721 + this.phaseOption = [...subjectName];
  722 + } else {
  723 + this.tableData = (data?.list && [...data?.list]) || [];
  724 + }
644 725 this.total = data.count;
645 726 } else {
646 727 this.$message.error(info);
... ... @@ -680,7 +761,26 @@ export default {
680 761 });
681 762 this.loading = false;
682 763 if (status === 0) {
683   - this.tableData = (data?.list && [...data?.list]) || [];
  764 + if (this.role == "ROLE_BANZHUREN") {
  765 + let subjectName = [];
  766 + this.tableData = data?.list.map((item) => {
  767 + let params = {};
  768 + item.dataList.map((items, index) => {
  769 + if (!subjectName.includes(items.subjectName)) {
  770 + subjectName.push(items.subjectName);
  771 + }
  772 + params["interactionsNum" + items.subjectName] = items.interactionsNum;
  773 + params["interactionsCorrectNum" + items.subjectName] = items.interactionsCorrectNum;
  774 + });
  775 + return {
  776 + ...item,
  777 + ...params,
  778 + };
  779 + });
  780 + this.phaseInter = [...subjectName];
  781 + } else {
  782 + this.tableData = (data?.list && [...data?.list]) || [];
  783 + }
684 784 this.total = data.count;
685 785 } else {
686 786 this.$message.error(info);
... ...
src/views/device/index.vue
... ... @@ -39,7 +39,7 @@
39 39 </el-radio-group>
40 40 </div>
41 41 <div class="content">
42   - <div v-if="type == 1">
  42 + <div v-show="type == 1">
43 43 <div class="chart-box" v-if="count">
44 44 <div class="device-num">
45 45 <p class="p1">{{ count }}</p>
... ... @@ -175,7 +175,7 @@
175 175 </el-table>
176 176 </div>
177 177 </div>
178   - <div v-else-if="type == 2">
  178 + <div v-show="type == 2">
179 179 <div class="chart-box" v-if="count">
180 180 <div class="device-num">
181 181 <p class="p1">{{ count }}</p>
... ... @@ -291,7 +291,7 @@
291 291 </el-table>
292 292 </div>
293 293 </div>
294   - <div v-else-if="type == 3">
  294 + <div v-show="type == 3">
295 295 <div class="table-box">
296 296 <div class="answer-header">
297 297 <div class="sel-box">
... ...
src/views/device/log.vue
... ... @@ -193,6 +193,7 @@ export default {
193 193 //中国式星期天是一周的最后一天
194 194 day = 7;
195 195 }
  196 + day--
196 197 let aTime = new Date().getTime() - 24 * 60 * 60 * 1000 * day;
197 198 that.query.startDay = formatDate(new Date(aTime), "yyyy-MM-dd");
198 199 that.query.endDay = formatDate(new Date(), "yyyy-MM-dd");
... ...
src/views/examinationPaper/index.vue
... ... @@ -201,7 +201,7 @@ export default {
201 201 tableData: null,
202 202 shareForm: {
203 203 id: "",
204   - sharingType: 1, //0-任课班级/1-全年级
  204 + sharingType: 0, //0-任课班级/1-全年级
205 205 },
206 206 shareRulesForm: {
207 207 sharingType: [
... ... @@ -243,7 +243,7 @@ export default {
243 243 case 1:
244 244 //修改分享范围
245 245 that.shareForm.id = item.id;
246   - that.shareForm.sharingType = item.sharingType || 1;
  246 + that.shareForm.sharingType = item.sharingType;
247 247 that.dialogVisible = true;
248 248 break;
249 249 case 2:
... ...
src/views/login/index.vue
... ... @@ -95,12 +95,12 @@ export default {
95 95 loginForm: {
96 96 // username: "15911715665",
97 97 // password: "Csiy88888",
98   - username: "13610050254",
99   - password: "Pw050254#",
  98 + // username: "13610050254",
  99 + // password: "Pw050254#",
100 100 // username: "18332123505",
101 101 // password: "Pw123505#",
102   - // username: "18687826606",
103   - // password: "Pw826606#",
  102 + username: "18687826606",
  103 + password: "Pw826606#",
104 104 // username: "18946034886",
105 105 // password: "Pw034886#",
106 106 // username: "18893712576",
... ... @@ -129,7 +129,7 @@ export default {
129 129 this.dockkey = getURLParams("dockkey") || "";
130 130 if (this.code || this.dockkey) {
131 131 this.loading = true
132   - // this._LoginCheck();
  132 + this._LoginCheck();
133 133 }
134 134 },
135 135 methods: {
... ...
src/views/test/analysis.vue
... ... @@ -16,7 +16,14 @@
16 16 <el-button type="danger" round @click="_ReScore" size="mini"
17 17 >重新计分</el-button
18 18 >
19   - <el-button type="danger" round plain size="mini" @click="paperModifyLog.modifiedTime = ''">暂时不计</el-button>
  19 + <el-button
  20 + type="danger"
  21 + round
  22 + plain
  23 + size="mini"
  24 + @click="paperModifyLog.modifiedTime = ''"
  25 + >暂时不计</el-button
  26 + >
20 27 </div>
21 28 </div>
22 29 <div class="page-content">
... ... @@ -46,65 +53,123 @@
46 53 >作答明细表</span
47 54 >
48 55 </div>
49   - <el-table v-if="type == 1" :data="tableData" border style="width: 100%">
  56 + <el-table v-show="type == 1" :data="tableData" border style="width: 100%">
50 57 <el-table-column
51 58 prop="questionIndex"
52 59 label="题号"
53 60 align="center"
  61 + width="60"
54 62 ></el-table-column>
55   - <el-table-column prop="questionType" label="题型" align="center"
  63 + <el-table-column
  64 + prop="questionType"
  65 + label="题型"
  66 + align="center"
  67 + width="100"
56 68 ><template slot-scope="scope">{{
57 69 setSubPro(scope.row.questionType)
58 70 }}</template></el-table-column
59 71 >
60 72 <el-table-column
61 73 prop="score"
  74 + width="100"
62 75 label="满分值"
63 76 sortable
64 77 align="center"
65 78 ></el-table-column>
66 79 <el-table-column
  80 + width="110"
67 81 prop="highestScore"
68 82 label="班最高分"
69 83 sortable
70 84 align="center"
71 85 ></el-table-column>
72 86 <el-table-column
  87 + width="110"
73 88 prop="lowestScore"
74 89 label="班最低分"
75 90 sortable
76 91 align="center"
77 92 ></el-table-column>
78 93 <el-table-column
  94 + width="110"
79 95 prop="avgScore"
80 96 label="班平均分"
81 97 sortable
82 98 align="center"
83 99 ></el-table-column>
84 100 <el-table-column
85   - prop="scoringRate"
  101 + prop="classScoringRate"
  102 + width="120"
86 103 sortable
87 104 label="班级得分率"
88 105 align="center"
89 106 ><template slot-scope="scoped"
90   - >{{ scoped.row.scoringRate }}%</template
  107 + >{{ scoped.row.classScoringRate }}%</template
91 108 ></el-table-column
92 109 >
93   - <el-table-column
94   - prop="correctAnswer"
95   - label="答案"
96   - align="center"
97   - ></el-table-column>
  110 + <el-table-column prop="correctAnswer" label="答案" align="center"
  111 + ><template slot-scope="scoped">{{
  112 + scoped.row.correctAnswer == 1
  113 + ? "✓"
  114 + : scoped.row.correctAnswer == 2
  115 + ? "✗"
  116 + : scoped.row.correctAnswer
  117 + }}</template>
  118 + </el-table-column>
98 119 <el-table-column
99 120 v-for="(item, index) in optionsList"
100 121 :key="index"
101   - :label="item.option"
102   - :prop="item.option"
  122 + :label="'选项' + (index + 1)"
  123 + :prop="'option' + index"
  124 + align="center"
103 125 >
104 126 </el-table-column>
105 127 </el-table>
  128 + <div class="hui-box" v-show="type == 1">
  129 + <span class="s-txt">汇总</span>
  130 + <ul class="hui-ul">
  131 + <li class="hui-li">
  132 + <span class="hui-s s1">主观题</span>
  133 + <span class="hui-s s1">{{ paperModifyLog.subjectiveScore }}</span>
  134 + <span class="hui-s s2">{{
  135 + paperModifyLog.subjectiveHighestScore
  136 + }}</span>
  137 + <span class="hui-s s2">{{
  138 + paperModifyLog.subjectiveLowestScore
  139 + }}</span>
  140 + <span class="hui-s s2">{{
  141 + paperModifyLog.subjectiveAvgScore
  142 + }}</span>
  143 + <span class="hui-s s3"
  144 + >{{ paperModifyLog.subjectiveClassScoringRate }}%</span
  145 + >
  146 + </li>
  147 + <li class="hui-li">
  148 + <span class="hui-s s1">客观题</span>
  149 + <span class="hui-s s1">{{ paperModifyLog.objectiveScore }}</span>
  150 + <span class="hui-s s2">{{
  151 + paperModifyLog.objectiveHighestScore
  152 + }}</span>
  153 + <span class="hui-s s2">{{
  154 + paperModifyLog.objectiveLowestScore
  155 + }}</span>
  156 + <span class="hui-s s2">{{ paperModifyLog.objectiveAvgScore }}</span>
  157 + <span class="hui-s s3"
  158 + >{{ paperModifyLog.objectiveClassScoringRate }}%</span
  159 + >
  160 + </li>
  161 + <li class="hui-li">
  162 + <span class="hui-s s1">整卷</span>
  163 + <span class="hui-s s1">{{ paperModifyLog.examPaperScore }}</span>
  164 + <span class="hui-s s2">{{ paperModifyLog.highestScore }}</span>
  165 + <span class="hui-s s2">{{ paperModifyLog.lowestScore }}</span>
  166 + <span class="hui-s s2">{{ paperModifyLog.avgScore }}</span>
  167 + <span class="hui-s s3">{{ paperModifyLog.classScoringRate }}%</span>
  168 + </li>
  169 + </ul>
  170 + </div>
106 171 <el-table
107   - v-if="type == 2"
  172 + v-show="type == 2"
108 173 :data="tableData2"
109 174 border
110 175 style="width: 100%"
... ... @@ -123,7 +188,7 @@
123 188 align="center"
124 189 ></el-table-column>
125 190 <el-table-column
126   - prop="examPaperScore"
  191 + prop="examScore"
127 192 label="总分"
128 193 sortable
129 194 align="center"
... ... @@ -175,7 +240,7 @@
175 240 </el-table-column>
176 241 </el-table>
177 242 <el-table
178   - v-if="type == 3"
  243 + v-show="type == 3"
179 244 :data="tableData2"
180 245 border
181 246 style="width: 100%"
... ... @@ -192,19 +257,19 @@
192 257 align="center"
193 258 ></el-table-column>
194 259 <el-table-column
195   - prop="examPaperScore"
  260 + prop="examScore"
196 261 label="总分"
197 262 sortable
198 263 align="center"
199 264 ></el-table-column>
200 265 <el-table-column label="分数组成" align="center">
201 266 <el-table-column
202   - prop="objectiveScore"
  267 + prop="objectiveExamScore"
203 268 label="客观题分"
204 269 align="center"
205 270 ></el-table-column>
206 271 <el-table-column
207   - prop="subjectiveScore"
  272 + prop="subjectiveExamScore"
208 273 label="主观题分"
209 274 align="center"
210 275 ></el-table-column>
... ... @@ -219,7 +284,7 @@
219 284 </el-table-column>
220 285 </el-table>
221 286 <el-table
222   - v-if="type == 4"
  287 + v-show="type == 4"
223 288 :data="tableData2"
224 289 border
225 290 style="width: 100%"
... ... @@ -291,6 +356,7 @@
291 356 >
292 357 <div>
293 358 <el-button
  359 + v-if="paperModifyLog.subjectiveScore != 0"
294 360 @click="diaUp = true"
295 361 type="primary"
296 362 round
... ... @@ -302,7 +368,6 @@
302 368 </div>
303 369 <div class="edit-dia" v-show="dialogVisible" height="100%">
304 370 <editAnswer
305   - :id="id"
306 371 :title="title"
307 372 :score="score"
308 373 @cancel="cancel"
... ... @@ -346,6 +411,21 @@ export default {
346 411 paperModifyLog: {
347 412 realName: "",
348 413 modifiedTime: "",
  414 + subjectiveScore: 0,
  415 + subjectiveHighestScore: "",
  416 + subjectiveLowestScore: "",
  417 + subjectiveAvgScore: "",
  418 + subjectiveClassScoringRate: "",
  419 + objectiveScore: "",
  420 + objectiveHighestScore: "",
  421 + objectiveLowestScore: "",
  422 + objectiveAvgScore: "",
  423 + objectiveClassScoringRate: "",
  424 + examPaperScore: "",
  425 + highestScore: "",
  426 + lowestScore: "",
  427 + avgScore: "",
  428 + classScoringRate: "",
349 429 },
350 430 tableData: [],
351 431 optionsList: [],
... ... @@ -382,6 +462,7 @@ export default {
382 462 return tit;
383 463 },
384 464 edit() {
  465 + this.$refs.editAnswer.edit(this.id);
385 466 this.dialogVisible = true;
386 467 },
387 468 cancel() {
... ... @@ -421,8 +502,8 @@ export default {
421 502 });
422 503 this.loading = false;
423 504 if (status === 0) {
424   - if (data.paperModifyLog) {
425   - this.paperModifyLog = { ...data.paperModifyLog };
  505 + if (data.examReport) {
  506 + this.paperModifyLog = { ...data.examReport };
426 507 }
427 508 } else {
428 509 this.$message.error(info);
... ... @@ -437,9 +518,9 @@ export default {
437 518 this.loading = false;
438 519 if (status === 0) {
439 520 this.$message.success(info);
440   - this._QueryData()
441   - this.paperModifyLog.modifiedTime=""
442   - this.paperModifyLog.realName=""
  521 + this._QueryData();
  522 + this.paperModifyLog.modifiedTime = "";
  523 + this.paperModifyLog.realName = "";
443 524 } else {
444 525 this.$message.error(info);
445 526 }
... ... @@ -463,8 +544,9 @@ export default {
463 544 console.log(detail);
464 545 detail.map((items, index) => {
465 546 params["que" + items.id] = items.id;
466   - params["score" + items.id] = items.score;
467   - params["answer" + items.id] = items.answer;
  547 + params["score" + items.id] = Number(items.score).toFixed(2);
  548 + params["answer" + items.id] =
  549 + items.answer == 1 ? "✓" : items.answer == 2 ? "✗" : items.answer;
468 550 params["isRight" + items.id] = items.isRight;
469 551 params["questionType" + items.id] = items.questionType;
470 552 });
... ... @@ -498,7 +580,8 @@ export default {
498 580 }
499 581 console.log(detail);
500 582 detail.map((items, index) => {
501   - params[items.option] = items.count;
  583 + params["option" + index] =
  584 + items.option == 1 ? "✓" : items.option == 2 ? "✗" : items.option;
502 585 });
503 586 return {
504 587 ...item,
... ... @@ -603,4 +686,38 @@ export default {
603 686 display: flex;
604 687 justify-content: space-between;
605 688 }
  689 +.hui-box {
  690 + display: flex;
  691 + text-align: center;
  692 + .s-txt {
  693 + width: 61px;
  694 + line-height: 144px;
  695 + background: #e2e2e2;
  696 + font-size: 16px;
  697 + color: #fff;
  698 + font-weight: 700;
  699 + }
  700 + .hui-ul {
  701 + border-top: 1px solid #e2e2e2;
  702 + }
  703 + .hui-li {
  704 + display: flex;
  705 + .hui-s {
  706 + height: 48px;
  707 + line-height: 48px;
  708 + border-right: 1px solid #e2e2e2;
  709 + border-bottom: 1px solid #e2e2e2;
  710 + box-sizing: border-box;
  711 + }
  712 + .s1 {
  713 + width: 100px;
  714 + }
  715 + .s2 {
  716 + width: 110px;
  717 + }
  718 + .s3 {
  719 + width: 120px;
  720 + }
  721 + }
  722 +}
606 723 </style>
607 724 \ No newline at end of file
... ...
src/views/test/editAnswer.vue
... ... @@ -299,14 +299,14 @@ export default {
299 299 score: "",
300 300 },
301 301 watch: {
302   - id: {
303   - handler: function (val) {
304   - if (val) {
305   - this.edit();
306   - }
307   - },
308   - immediate: true,
309   - },
  302 + // id: {
  303 + // handler: function (val) {
  304 + // if (val) {
  305 + // this.edit();
  306 + // }
  307 + // },
  308 + // immediate: true,
  309 + // },
310 310 },
311 311 data() {
312 312 return {
... ... @@ -486,10 +486,10 @@ export default {
486 486 }
487 487 this.diaSetAns = false;
488 488 },
489   - async edit() {
  489 + async edit(id) {
490 490 //修改答案
491 491 const { data, status, info } = await this.$request.examQuestionList({
492   - examId: this.id,
  492 + examId: id,
493 493 });
494 494 if (status == 0) {
495 495 this.questionList = deepClone(data?.list || []);
... ...
src/views/test/index.vue
... ... @@ -11,7 +11,6 @@
11 11 class="sel"
12 12 v-model="query.classId"
13 13 placeholder="选择班级"
14   - @change="changClazz"
15 14 >
16 15 <el-option
17 16 v-for="item in classList"
... ... @@ -27,7 +26,6 @@
27 26 multiple
28 27 v-model="query.subjectNames"
29 28 placeholder="选择科目"
30   - @change="_QueryData"
31 29 >
32 30 <el-option
33 31 v-for="item in subjectList"
... ... @@ -42,7 +40,6 @@
42 40 class="sel"
43 41 v-model="query.subjectNames"
44 42 placeholder="选择科目"
45   - @change="_QueryData"
46 43 >
47 44 <el-option
48 45 v-for="item in subjectList"
... ... @@ -97,7 +94,7 @@
97 94 <el-radio-button :label="1">单卷测练报表</el-radio-button>
98 95 <el-radio-button :label="2">阶段测练报表</el-radio-button>
99 96 </el-radio-group>
100   - <div v-if="tabIndex == 1" v-loading="loading">
  97 + <div v-show="tabIndex == 1" v-loading="loading">
101 98 <el-table :data="tableData" border style="width: 100%">
102 99 <el-table-column
103 100 prop="title"
... ... @@ -110,39 +107,51 @@
110 107 align="center"
111 108 width="100"
112 109 ></el-table-column>
113   - <el-table-column
114   - prop="answeredNum"
115   - label="测验人数"
116   - align="center"
117   - ></el-table-column>
  110 + <el-table-column prop="answeredNum" label="测验人数" align="center"
  111 + ><template slot-scope="scoped">{{
  112 + `${scoped.row.answeredNum}/${scoped.row.classPersonNum}`
  113 + }}</template></el-table-column
  114 + >
118 115 <el-table-column
119 116 prop="examStartTime"
120 117 label="测验时间"
121 118 align="center"
122 119 ></el-table-column>
123   - <el-table-column
124   - prop="avgScore"
125   - label="班平均分"
126   - align="center"
127   - ></el-table-column>
128   - <el-table-column
129   - prop="highestScore"
130   - label="班最高分"
131   - align="center"
132   - ></el-table-column>
133   - <el-table-column
134   - prop="lowestScore"
135   - label="班最低分"
136   - align="center"
137   - ></el-table-column>
  120 + <el-table-column prop="avgScore" label="班平均分" align="center"
  121 + ><template slot-scope="scoped">{{
  122 + scoped.row.subjectiveScore == scoped.row.examPaperScore ||
  123 + scoped.row.answerNum == 0
  124 + ? scoped.row.avgScore || "-"
  125 + : scoped.row.avgScore
  126 + }}</template></el-table-column
  127 + >
  128 + <el-table-column prop="highestScore" label="班最高分" align="center"
  129 + ><template slot-scope="scoped">{{
  130 + scoped.row.subjectiveScore == scoped.row.examPaperScore ||
  131 + scoped.row.answerNum == 0
  132 + ? scoped.row.highestScore || "-"
  133 + : scoped.row.highestScore
  134 + }}</template></el-table-column
  135 + >
  136 + <el-table-column prop="lowestScore" label="班最低分" align="center"
  137 + ><template slot-scope="scoped">{{
  138 + scoped.row.subjectiveScore == scoped.row.examPaperScore ||
  139 + scoped.row.answerNum == 0
  140 + ? scoped.row.lowestScore || "-"
  141 + : scoped.row.lowestScore
  142 + }}</template></el-table-column
  143 + >
138 144 <el-table-column
139 145 prop="excellenRate"
140 146 label="优秀数(率)"
141 147 sortable
142 148 align="center"
143   - ><template slot-scope="scoped"
144   - >{{ scoped.row.excellenRate }}%</template
145   - ></el-table-column
  149 + ><template slot-scope="scoped">{{
  150 + scoped.row.subjectiveScore == scoped.row.examPaperScore ||
  151 + scoped.row.answerNum == 0
  152 + ? scoped.row.excellenNum || "-"
  153 + : `${scoped.row.excellenNum}/${scoped.row.excellenRate}%`
  154 + }}</template></el-table-column
146 155 >
147 156 <el-table-column
148 157 prop="goodRate"
... ... @@ -150,8 +159,13 @@
150 159 sortable
151 160 align="center"
152 161 ><template slot-scope="scoped"
153   - >{{ scoped.row.goodRate }}%</template
154   - ></el-table-column
  162 + >{{
  163 + scoped.row.subjectiveScore == scoped.row.examPaperScore ||
  164 + scoped.row.answerNum == 0
  165 + ? scoped.row.goodNum || "-"
  166 + : `${scoped.row.goodNum}/${scoped.row.goodRate}%`
  167 + }}
  168 + </template></el-table-column
155 169 >
156 170 <el-table-column
157 171 prop="passRate"
... ... @@ -159,21 +173,34 @@
159 173 sortable
160 174 align="center"
161 175 ><template slot-scope="scoped"
162   - >{{ scoped.row.passRate }}%</template
163   - ></el-table-column
  176 + >{{
  177 + scoped.row.subjectiveScore == scoped.row.examPaperScore ||
  178 + scoped.row.answerNum == 0
  179 + ? scoped.row.passNum || "-"
  180 + : `${scoped.row.passNum}/${scoped.row.passRate}%`
  181 + }}
  182 + </template></el-table-column
164 183 >
165 184 <el-table-column
166 185 prop="failedRate"
167 186 label="不及格数(率)"
168 187 sortable
169 188 align="center"
170   - ><template slot-scope="scoped"
171   - >{{ scoped.row.failedRate }}%</template
172   - ></el-table-column
  189 + ><template slot-scope="scoped">{{
  190 + scoped.row.subjectiveScore == scoped.row.examPaperScore ||
  191 + scoped.row.answerNum == 0
  192 + ? scoped.row.failedNum || "-"
  193 + : `${scoped.row.failedNum}/${scoped.row.failedRate}%`
  194 + }}</template></el-table-column
173 195 >
174 196 <el-table-column label="操作" align="center">
175 197 <template slot-scope="scoped">
176   - <el-tooltip effect="dark" content="详情" placement="top">
  198 + <el-tooltip
  199 + v-if="scoped.row.answerNum != 0"
  200 + effect="dark"
  201 + content="详情"
  202 + placement="top"
  203 + >
177 204 <el-button
178 205 type="primary"
179 206 circle
... ... @@ -182,7 +209,12 @@
182 209 @click="linkTo(scoped.row)"
183 210 ></el-button>
184 211 </el-tooltip>
185   - <el-tooltip effect="dark" content="修改答案" placement="top">
  212 + <el-tooltip
  213 + v-else
  214 + effect="dark"
  215 + content="修改答案"
  216 + placement="top"
  217 + >
186 218 <el-button
187 219 type="primary"
188 220 circle
... ... @@ -191,6 +223,20 @@
191 223 @click="edit(scoped.row)"
192 224 ></el-button>
193 225 </el-tooltip>
  226 + <el-tooltip
  227 + v-if="scoped.row.subjectiveScore == scoped.row.examPaperScore"
  228 + effect="dark"
  229 + content="导入主观题"
  230 + placement="top"
  231 + >
  232 + <el-button
  233 + type="primary"
  234 + circle
  235 + size="mini"
  236 + icon="fa fa-cloud"
  237 + @click="uploadSJ(scoped.row)"
  238 + ></el-button>
  239 + </el-tooltip>
194 240 </template>
195 241 </el-table-column>
196 242 </el-table>
... ... @@ -207,8 +253,13 @@
207 253 </el-pagination>
208 254 </div>
209 255 </div>
210   - <div v-if="tabIndex == 2" v-loading="loading">
211   - <el-table :data="tableData" border style="width: 100%">
  256 + <div v-show="tabIndex == 2" v-loading="loading">
  257 + <el-table
  258 + v-if="role == 'ROLE_JIAOSHI'"
  259 + :data="tableData"
  260 + border
  261 + style="width: 100%"
  262 + >
212 263 <el-table-column
213 264 prop="studentCode"
214 265 label="学号"
... ... @@ -229,7 +280,7 @@
229 280 >
230 281 <el-table-column
231 282 :prop="'score' + index"
232   - label="总分/成绩"
  283 + :label="index == 0 ? '总分' : '成绩'"
233 284 align="center"
234 285 ></el-table-column>
235 286 <el-table-column
... ... @@ -239,6 +290,47 @@
239 290 ></el-table-column>
240 291 </el-table-column>
241 292 </el-table>
  293 + <el-table v-else :data="tableData" border style="width: 100%">
  294 + <el-table-column
  295 + prop="studentCode"
  296 + label="学号"
  297 + align="center"
  298 + fixed
  299 + ></el-table-column>
  300 + <el-table-column
  301 + prop="studentName"
  302 + label="姓名"
  303 + fixed
  304 + align="center"
  305 + ></el-table-column>
  306 + <el-table-column
  307 + align="center"
  308 + v-for="(item, index) in answerList"
  309 + :key="index"
  310 + :label="item"
  311 + >
  312 + <el-table-column
  313 + :prop="'examCount' + item"
  314 + label="测练数"
  315 + align="center"
  316 + ></el-table-column>
  317 + <el-table-column
  318 + :prop="'participationCount' + item"
  319 + label="参与数"
  320 + align="center"
  321 + ></el-table-column>
  322 + <el-table-column
  323 + :prop="'score' + item"
  324 + label="总分"
  325 + align="center"
  326 + ></el-table-column>
  327 + <el-table-column
  328 + :prop="'classRank' + item"
  329 + label="班名"
  330 + align="center"
  331 + ></el-table-column>
  332 + </el-table-column>
  333 + </el-table>
242 334 </div>
243 335 <p class="down" v-if="tabIndex == 2">
244 336 <el-button type="info" plain round icon="fa fa-cloud-download"
... ... @@ -246,9 +338,23 @@
246 338 >
247 339 </p>
248 340 </div>
  341 + <el-dialog title="导入主观题分数" :visible.sync="diaUp" width="600">
  342 + <up-load :url="url" :examId="examId" fileName="教师名单">
  343 + <template slot="down">
  344 + <p class="down-txt">
  345 + 第一步:下载模板并编辑完成学生分数
  346 + <el-link type="danger" @click="downExcel">模板下载</el-link> 。
  347 + </p>
  348 + <p class="down-txt">第二步:上传完成编辑的模板文件并导入。</p>
  349 + </template>
  350 + </up-load>
  351 + <div class="dialog-footer" slot="footer">
  352 + <el-button @click="diaUp = false">取 消</el-button>
  353 + </div>
  354 + </el-dialog>
249 355 <div class="edit-dia" v-show="dialogVisible" height="100%">
250 356 <editAnswer
251   - :id="form.id"
  357 + ref="editAnswer"
252 358 :title="form.title"
253 359 :score="form.examPaperScore"
254 360 @cancel="cancel"
... ... @@ -259,7 +365,7 @@
259 365 </template>
260 366  
261 367 <script>
262   -import { formatDate } from "utils";
  368 +import { formatDate, downloadFile } from "utils";
263 369 import editAnswer from "./editAnswer.vue";
264 370 export default {
265 371 components: { editAnswer },
... ... @@ -267,6 +373,9 @@ export default {
267 373 return {
268 374 role: "",
269 375 loading: false,
  376 + diaUp: false,
  377 + url: "/api_html/teaching/importSubjectiveScore",
  378 + examId: "",
270 379 dialogVisible: false,
271 380 form: {
272 381 id: "",
... ... @@ -317,6 +426,10 @@ export default {
317 426 },
318 427 });
319 428 },
  429 + uploadSJ(obj) {
  430 + this.examId = obj.id;
  431 + this.diaUp = true;
  432 + },
320 433 cancel() {
321 434 this.dialogVisible = false;
322 435 },
... ... @@ -344,6 +457,7 @@ export default {
344 457 //中国式星期天是一周的最后一天
345 458 day = 7;
346 459 }
  460 + day--;
347 461 let aTime = new Date().getTime() - 24 * 60 * 60 * 1000 * day;
348 462 that.query.startDay = formatDate(new Date(aTime), "yyyy-MM-dd");
349 463 that.query.endDay = formatDate(new Date(), "yyyy-MM-dd");
... ... @@ -398,12 +512,26 @@ export default {
398 512 },
399 513 edit(item) {
400 514 this.form = { ...item };
  515 + this.$refs.editAnswer.edit(this.form.id);
401 516 this.dialogVisible = true;
402 517 },
403 518 changeTab() {
404 519 this.page = 1;
405 520 this._QueryData();
406 521 },
  522 + async downExcel() {
  523 + let data = await this.$request.subjectiveScoreTemplate({
  524 + examId: this.id,
  525 + });
  526 + if (data && !data.code) {
  527 + let blob = new Blob([data], {
  528 + type: "application/vnd.ms-excel;charset=utf-8",
  529 + });
  530 + downloadFile(`主观题模版.xlsx`, blob);
  531 + } else {
  532 + this.$message.error(data.message);
  533 + }
  534 + },
407 535 async changClazz() {
408 536 this.page = 1;
409 537 await this._QuerySubjectList();
... ... @@ -478,6 +606,7 @@ export default {
478 606 query.subjectNames = [query.subjectNames];
479 607 } else {
480 608 if (
  609 + query["subjectNames"] &&
481 610 query["subjectNames"].length == 1 &&
482 611 query["subjectNames"][0] == "全部"
483 612 ) {
... ... @@ -485,6 +614,9 @@ export default {
485 614 return item.value;
486 615 });
487 616 query["subjectNames"].shift();
  617 + }else{
  618 + this.loading = false;
  619 + return
488 620 }
489 621 }
490 622 const { data, status, info } = await this.$request.examReportList({
... ... @@ -515,13 +647,14 @@ export default {
515 647 }
516 648 if (this.role == "ROLE_BANZHUREN") {
517 649 if (
518   - query["subjectNames"].length == 1 &&
  650 + query["subjectNames"] &&
  651 + query["subjectNames"]?.length == 1 &&
519 652 query["subjectNames"][0] == "全部"
520 653 ) {
521 654 query["subjectNames"] = this.subjectList.map((item) => {
522 655 return item.value;
523 656 });
524   - query["subjectNames"].shift();
  657 + query["subjectNames"]?.shift();
525 658 }
526 659 }
527 660 const phaseExamReport =
... ... @@ -534,47 +667,57 @@ export default {
534 667 this.loading = false;
535 668 if (status === 0) {
536 669 this.total = data.count;
537   - let dataIdsList = [],
538   - dataList = [];
539   - data?.list.map((item) => {
540   - item.examList.map((items) => {
541   - if (this.role == "ROLE_JITUAN") {
542   - // if (!dataIdsList.includes(items.grade)) {
543   - // dataIdsList.push(items.grade);
544   - // dataList.push(items);
545   - // }
546   - } else {
  670 + if (this.role == "ROLE_BANZHUREN") {
  671 + let subjectName = [];
  672 + this.tableData = data?.list.map((item) => {
  673 + let params = {};
  674 + item.dataList.map((items, index) => {
  675 + if (!subjectName.includes(items.subjectName)) {
  676 + subjectName.push(items.subjectName);
  677 + }
  678 + params["examCount" + items.subjectName] = items.examCount;
  679 + params["participationCount" + items.subjectName] =
  680 + items.participationCount;
  681 + params["score" + items.subjectName] = items.score;
  682 + params["classRank" + items.subjectName] = items.classRank;
  683 + });
  684 + return {
  685 + ...item,
  686 + ...params,
  687 + };
  688 + });
  689 + this.answerList = [...subjectName];
  690 + } else {
  691 + let dataIdsList = [],
  692 + dataList = [];
  693 + data?.list.map((item) => {
  694 + item.examList.map((items) => {
547 695 if (!dataIdsList.includes(items.title)) {
548 696 dataIdsList.push(items.title);
549 697 dataList.push(items);
550 698 }
551   - }
  699 + });
552 700 });
553   - });
554   - console.log(dataList);
555   - this.tableData = data?.list.map((item) => {
556   - let params = {};
557   - dataIdsList.map((ids, index) => {
558   - params["score" + index] = "--";
559   - params["classRank" + index] = "--";
560   - item.examList.map((items) => {
561   - if (this.role == "ROLE_JITUAN") {
562   - if (items.title == ids) {
563   - }
564   - } else {
  701 + console.log(dataList);
  702 + this.tableData = data?.list.map((item) => {
  703 + let params = {};
  704 + dataIdsList.map((ids, index) => {
  705 + params["score" + index] = "--";
  706 + params["classRank" + index] = "--";
  707 + item.examList.map((items) => {
565 708 if (items.title == ids) {
566 709 params["score" + index] = items.score;
567 710 params["classRank" + index] = items.classRank;
568 711 }
569   - }
  712 + });
570 713 });
  714 + return {
  715 + ...item,
  716 + ...params,
  717 + };
571 718 });
572   - return {
573   - ...item,
574   - ...params,
575   - };
576   - });
577   - this.answerList = dataList;
  719 + this.answerList = dataList;
  720 + }
578 721 } else {
579 722 this.$message.error(info);
580 723 }
... ...