Commit d4b9eb45d8f01a06972acc0a85d97d747d466a23
1 parent
0761e2ba
设备异常信息
Showing
6 changed files
with
208 additions
and
54 deletions
src/api/apis/apis.js
| ... | ... | @@ -1516,4 +1516,42 @@ export default { |
| 1516 | 1516 | data, |
| 1517 | 1517 | }); |
| 1518 | 1518 | }, |
| 1519 | + // 未分班学生名单导出 | |
| 1520 | + exportNoClassStudent() { | |
| 1521 | + return service({ | |
| 1522 | + url: setUpUrls.exportNoClassStudent, | |
| 1523 | + method: "POST", | |
| 1524 | + responseType: 'arraybuffer', | |
| 1525 | + }); | |
| 1526 | + }, | |
| 1527 | + // 未分配教师名单导出 | |
| 1528 | + exportNoClassTeacher() { | |
| 1529 | + return service({ | |
| 1530 | + url: setUpUrls.exportNoClassTeacher, | |
| 1531 | + method: "POST", | |
| 1532 | + responseType: 'arraybuffer', | |
| 1533 | + }); | |
| 1534 | + }, | |
| 1535 | + // 学校查询异常设备总数 | |
| 1536 | + abnormalDeviceCount() { | |
| 1537 | + return service({ | |
| 1538 | + url: setUpUrls.abnormalDeviceCount, | |
| 1539 | + method: "POST", | |
| 1540 | + }); | |
| 1541 | + }, | |
| 1542 | + // 集团查询异常设备总数 | |
| 1543 | + tenantAbnormalDeviceCount() { | |
| 1544 | + return service({ | |
| 1545 | + url: setUpUrls.tenantAbnormalDeviceCount, | |
| 1546 | + method: "POST", | |
| 1547 | + }); | |
| 1548 | + }, | |
| 1549 | + // 设备异常备注 | |
| 1550 | + abnormalRemark(data) { | |
| 1551 | + return service({ | |
| 1552 | + url: setUpUrls.abnormalRemark, | |
| 1553 | + method: "POST", | |
| 1554 | + data | |
| 1555 | + }); | |
| 1556 | + }, | |
| 1519 | 1557 | }; | ... | ... |
src/api/urls/apis.js
| ... | ... | @@ -392,4 +392,14 @@ export default { |
| 392 | 392 | tenantSectionAndGradeList: "/api_html/tenant/sectionAndGradeList", |
| 393 | 393 | //集团查询科目列表 |
| 394 | 394 | tenantSubjectList: "/api_html/tenant/subjectList", |
| 395 | + //未分班学生名单导出 | |
| 396 | + exportNoClassStudent: "/api_html/school/manager/exportNoClassStudent", | |
| 397 | + //未分班教师名单导出 | |
| 398 | + exportNoClassTeacher: "/api_html/school/manager/exportNoClassTeacher", | |
| 399 | + //学校查询异常设备总数 | |
| 400 | + abnormalDeviceCount: "/api_html/school/manager/abnormalDeviceCount", | |
| 401 | + //集团查询异常设备总数 | |
| 402 | + tenantAbnormalDeviceCount: "/api_html/tenant/abnormalDeviceCount", | |
| 403 | + //设备异常备注 | |
| 404 | + abnormalRemark: "/api_html/school/manager/abnormalRemark", | |
| 395 | 405 | } | ... | ... |
src/views/layout/aside/aside.vue
| ... | ... | @@ -100,10 +100,10 @@ export default { |
| 100 | 100 | let name = ""; |
| 101 | 101 | let navTitle = function (path, routerARR) { |
| 102 | 102 | for (let i = 0; i < routerARR.length; i++) { |
| 103 | - if (routerARR[i].children.length > 0 || routerARR[i].path === path) { | |
| 103 | + if (routerARR[i].children?.length > 0 || routerARR[i].path === path) { | |
| 104 | 104 | if ( |
| 105 | 105 | routerARR[i].path === path && |
| 106 | - routerARR[i].children.length < 1 | |
| 106 | + routerARR[i].children?.length < 1 | |
| 107 | 107 | ) { |
| 108 | 108 | name = routerARR[i].name; |
| 109 | 109 | break; | ... | ... |
src/views/standard/device/error.vue
| ... | ... | @@ -13,35 +13,71 @@ |
| 13 | 13 | align="center" |
| 14 | 14 | width="160" |
| 15 | 15 | ></el-table-column> |
| 16 | + <el-table-column prop="abnormalSource" label="设备类型" align="center"> | |
| 17 | + <template slot-scope="scoped"> | |
| 18 | + {{ | |
| 19 | + scoped.row.abnormalSource == 0 | |
| 20 | + ? "无" | |
| 21 | + : scoped.row.abnormalSource == 1 | |
| 22 | + ? "云平台" | |
| 23 | + : scoped.row.abnormalSource == 2 | |
| 24 | + ? "授课端" | |
| 25 | + : scoped.row.abnormalSource == 3 | |
| 26 | + ? "出厂工具" | |
| 27 | + : "发卡工具" | |
| 28 | + }} | |
| 29 | + </template> | |
| 30 | + </el-table-column> | |
| 31 | + <el-table-column label="异常类型" align="center"> | |
| 32 | + <template slot-scope="scoped"> | |
| 33 | + {{ | |
| 34 | + scoped.row.status == 0 | |
| 35 | + ? "正常" | |
| 36 | + : scoped.row.status == 1 | |
| 37 | + ? "低电量异常" | |
| 38 | + : scoped.row.status == 2 | |
| 39 | + ? "配对码异常" | |
| 40 | + : "关联班级异常" | |
| 41 | + }} | |
| 42 | + </template></el-table-column | |
| 43 | + > | |
| 44 | + <template v-if="type == 1"> | |
| 45 | + <el-table-column | |
| 46 | + prop="pairingCode" | |
| 47 | + label="配对码" | |
| 48 | + align="center" | |
| 49 | + ></el-table-column> | |
| 50 | + <el-table-column label="关联班级" align="center"> | |
| 51 | + <template slot-scope="scoped"> | |
| 52 | + <p v-for="(item, index) in scoped.row.classList" :key="index"> | |
| 53 | + {{ item.className }} | |
| 54 | + </p> | |
| 55 | + </template> | |
| 56 | + </el-table-column> | |
| 57 | + </template> | |
| 16 | 58 | <el-table-column |
| 17 | - prop="type" | |
| 18 | - label="设备类型" | |
| 19 | - align="center" | |
| 20 | - ></el-table-column> | |
| 21 | - <el-table-column | |
| 22 | - prop="operationTime" | |
| 23 | - label="异常类型" | |
| 24 | - align="center" | |
| 25 | - ></el-table-column> | |
| 26 | - <el-table-column | |
| 27 | - prop="operationTime" | |
| 59 | + prop="modifiedTime" | |
| 28 | 60 | label="最早发现时间" |
| 29 | 61 | align="center" |
| 30 | 62 | width="200" |
| 31 | 63 | ></el-table-column> |
| 32 | 64 | <el-table-column |
| 33 | - prop="operationTime" | |
| 34 | - label="异常后答题次数" | |
| 65 | + prop="answerTimes" | |
| 66 | + label="答题次数" | |
| 35 | 67 | align="center" |
| 36 | 68 | ></el-table-column> |
| 37 | 69 | <el-table-column |
| 38 | - prop="operationTime" | |
| 70 | + prop="abnormalRemark" | |
| 39 | 71 | label="状态" |
| 40 | 72 | align="center" |
| 41 | 73 | ></el-table-column> |
| 42 | - <el-table-column label="操作" align="center" width="200" | |
| 74 | + <el-table-column label="操作" align="center" width="100" | |
| 43 | 75 | ><template slot-scope="scoped"> |
| 44 | - <el-link>处理</el-link></template | |
| 76 | + <el-link | |
| 77 | + :disabled="scoped.row.abnormalRemark" | |
| 78 | + @click="openDia(scoped.row)" | |
| 79 | + >处理</el-link | |
| 80 | + ></template | |
| 45 | 81 | ></el-table-column |
| 46 | 82 | > |
| 47 | 83 | </el-table> |
| ... | ... | @@ -58,6 +94,24 @@ |
| 58 | 94 | </el-pagination> |
| 59 | 95 | </div> |
| 60 | 96 | </div> |
| 97 | + <el-dialog title="备注" :visible.sync="diaNotes" width="400"> | |
| 98 | + <el-form ref="formClass" label-width="100px"> | |
| 99 | + <el-form-item label="处理备注:" prop="studentName"> | |
| 100 | + <el-col :span="12"> | |
| 101 | + <el-input | |
| 102 | + type="textarea" | |
| 103 | + :rows="3" | |
| 104 | + maxlength="200" | |
| 105 | + v-model="ntoes" | |
| 106 | + /> | |
| 107 | + </el-col> | |
| 108 | + </el-form-item> | |
| 109 | + </el-form> | |
| 110 | + <div class="dialog-footer" slot="footer"> | |
| 111 | + <el-button @click="_SaveNotes" type="primary">确 定</el-button> | |
| 112 | + <el-button @click="diaNotes = false">取 消</el-button> | |
| 113 | + </div> | |
| 114 | + </el-dialog> | |
| 61 | 115 | </div> |
| 62 | 116 | </template> |
| 63 | 117 | |
| ... | ... | @@ -65,6 +119,12 @@ |
| 65 | 119 | export default { |
| 66 | 120 | data() { |
| 67 | 121 | return { |
| 122 | + role: "", | |
| 123 | + loading: false, | |
| 124 | + diaNotes: false, | |
| 125 | + ntoes: "", | |
| 126 | + deviceId: "", | |
| 127 | + type: 1, | |
| 68 | 128 | tableData: [], |
| 69 | 129 | total: 0, |
| 70 | 130 | page: 1, |
| ... | ... | @@ -72,20 +132,49 @@ export default { |
| 72 | 132 | }; |
| 73 | 133 | }, |
| 74 | 134 | created() { |
| 75 | - this._QueryData() | |
| 135 | + this.type = this.$route.query.type; | |
| 136 | + this.role = | |
| 137 | + this.$store.getters.info.showRole || | |
| 138 | + this.$store.getters.info.permissions[0].role; | |
| 139 | + this._QueryData(); | |
| 76 | 140 | }, |
| 77 | 141 | methods: { |
| 78 | 142 | changePage(page) { |
| 79 | 143 | this.page = page; |
| 80 | 144 | this._QueryData(); |
| 81 | 145 | }, |
| 146 | + openDia(obj) { | |
| 147 | + this.diaNotes = true; | |
| 148 | + this.deviceId = obj.id; | |
| 149 | + this.ntoes = ""; | |
| 150 | + }, | |
| 151 | + async _SaveNotes() { | |
| 152 | + if (!this.ntoes.trim()) { | |
| 153 | + this.$message.warning("请填写备注内容!"); | |
| 154 | + return; | |
| 155 | + } | |
| 156 | + const { status, info } = await this.$request.abnormalRemark({ | |
| 157 | + deviceId: this.deviceId, | |
| 158 | + abnormalRemark: this.ntoes, | |
| 159 | + }); | |
| 160 | + if (status === 0) { | |
| 161 | + this.ntoes = ""; | |
| 162 | + this.diaNotes = false; | |
| 163 | + this._QueryData(); | |
| 164 | + } else { | |
| 165 | + this.$message.error(info); | |
| 166 | + } | |
| 167 | + }, | |
| 82 | 168 | async _QueryData() { |
| 83 | 169 | this.loading = true; |
| 84 | - const { | |
| 85 | - data = {}, | |
| 86 | - status, | |
| 87 | - info, | |
| 88 | - } = await this.$request.pDeviceLogList({ | |
| 170 | + const deviceList = | |
| 171 | + this.role != "ROLE_JITUAN" | |
| 172 | + ? this.$request.deviceList | |
| 173 | + : this.$request.tenantDeviceList; | |
| 174 | + this.tableData = []; | |
| 175 | + const { data, status, info } = await deviceList({ | |
| 176 | + status: 1, | |
| 177 | + deviceType: this.type, | |
| 89 | 178 | page: this.page, |
| 90 | 179 | size: this.size, |
| 91 | 180 | }); | ... | ... |
src/views/standard/device/index.vue
| ... | ... | @@ -48,8 +48,14 @@ |
| 48 | 48 | <el-radio-button :label="3">授课端管理</el-radio-button> |
| 49 | 49 | </el-radio-group> |
| 50 | 50 | </div> |
| 51 | - <p v-show="type == 1" class="error-tips"> | |
| 52 | - 有{{}}条设备异常信息,<router-link to="/deviceError" | |
| 51 | + <p | |
| 52 | + v-show="(type == 1 && stationCount) || (type == 2 && clickerCount)" | |
| 53 | + class="error-tips" | |
| 54 | + > | |
| 55 | + 有{{ | |
| 56 | + type == 1 ? stationCount : clickerCount | |
| 57 | + }}条设备异常信息,<router-link | |
| 58 | + :to="{ path: '/deviceError', query: { type: type } }" | |
| 53 | 59 | >点击查看>></router-link |
| 54 | 60 | > |
| 55 | 61 | </p> |
| ... | ... | @@ -693,6 +699,8 @@ export default { |
| 693 | 699 | size: 20, |
| 694 | 700 | isBack: false, //是否是日志页面回来 |
| 695 | 701 | upgradeFlag: false, |
| 702 | + stationCount: 0, //异常基站数量 | |
| 703 | + clickerCount: 0, //异常答题器数量 | |
| 696 | 704 | }; |
| 697 | 705 | }, |
| 698 | 706 | created() { |
| ... | ... | @@ -700,12 +708,12 @@ export default { |
| 700 | 708 | this.role = |
| 701 | 709 | this.$store.getters.info.showRole || |
| 702 | 710 | this.$store.getters.info.permissions[0].role; |
| 711 | + this._QueryErrorTotal(); | |
| 703 | 712 | if (this.role == "ROLE_JITUAN") { |
| 704 | 713 | (this.props.lazy = true), |
| 705 | 714 | (this.props.lazyLoad = function (node, resolve) { |
| 706 | 715 | const { level } = node; |
| 707 | 716 | if (level == 2) { |
| 708 | - console.log(node); | |
| 709 | 717 | api |
| 710 | 718 | .tenantClassList({ |
| 711 | 719 | schoolId: node.data.value, |
| ... | ... | @@ -716,8 +724,6 @@ export default { |
| 716 | 724 | return a.grade - b.grade; |
| 717 | 725 | } |
| 718 | 726 | ); |
| 719 | - console.log(); | |
| 720 | - | |
| 721 | 727 | const nodes = [...children]; |
| 722 | 728 | // 通过调用resolve将子节点数据返回,通知组件数据加载完成 |
| 723 | 729 | resolve(nodes); |
| ... | ... | @@ -738,7 +744,6 @@ export default { |
| 738 | 744 | activated() { |
| 739 | 745 | const that = this; |
| 740 | 746 | this.isBack = this.$route.query.back ? this.$route.query.back : false; |
| 741 | - console.log(this.$route.query.back); | |
| 742 | 747 | if (!this.isBack) { |
| 743 | 748 | that.type = 1; |
| 744 | 749 | that.page = 1; |
| ... | ... | @@ -1246,6 +1251,21 @@ export default { |
| 1246 | 1251 | this.$message.error(info); |
| 1247 | 1252 | } |
| 1248 | 1253 | }, |
| 1254 | + // 异常设备数量 | |
| 1255 | + async _QueryErrorTotal() { | |
| 1256 | + const abnormalDeviceCount = | |
| 1257 | + this.role != "ROLE_JITUAN" | |
| 1258 | + ? this.$request.abnormalDeviceCount | |
| 1259 | + : this.$request.tenantAbnormalDeviceCount; | |
| 1260 | + this.tableData = []; | |
| 1261 | + const { data, status, info } = await abnormalDeviceCount(); | |
| 1262 | + if (status == 0) { | |
| 1263 | + this.stationCount = data?.stationCount; | |
| 1264 | + this.clickerCount = data?.clickerCount; | |
| 1265 | + } else { | |
| 1266 | + this.$message.error(info); | |
| 1267 | + } | |
| 1268 | + }, | |
| 1249 | 1269 | }, |
| 1250 | 1270 | }; |
| 1251 | 1271 | </script> |
| ... | ... | @@ -1262,8 +1282,8 @@ export default { |
| 1262 | 1282 | .down { |
| 1263 | 1283 | padding: 0 0 16px 20px; |
| 1264 | 1284 | } |
| 1265 | -.error-tips{ | |
| 1266 | - margin-bottom:12px; | |
| 1285 | +.error-tips { | |
| 1286 | + margin-bottom: 12px; | |
| 1267 | 1287 | } |
| 1268 | 1288 | .content { |
| 1269 | 1289 | background: #f8f8f8; | ... | ... |
src/views/standard/setUp/archived.vue
| ... | ... | @@ -94,9 +94,8 @@ |
| 94 | 94 | <p class="down-txt" slot="down"> |
| 95 | 95 | 通过Excel名单导入任课老师名单模板,点击 |
| 96 | 96 | <el-link type="primary" @click="downTeacherExcel" |
| 97 | - >导出分班后任课老师</el-link | |
| 98 | - > | |
| 99 | - 。 | |
| 97 | + >导出未分配教师</el-link | |
| 98 | + >。 | |
| 100 | 99 | </p> |
| 101 | 100 | </up-load> |
| 102 | 101 | </div> |
| ... | ... | @@ -148,12 +147,14 @@ |
| 148 | 147 | </template> |
| 149 | 148 | |
| 150 | 149 | <script> |
| 150 | +import { downloadFile } from "utils"; | |
| 151 | 151 | export default { |
| 152 | 152 | data() { |
| 153 | 153 | return { |
| 154 | 154 | loading: false, |
| 155 | 155 | loadingClass: false, |
| 156 | - step: 0, | |
| 156 | + loadingDown: false, | |
| 157 | + step: 1, | |
| 157 | 158 | gradeName: "", |
| 158 | 159 | gradeList: [], |
| 159 | 160 | classIds: [], |
| ... | ... | @@ -198,33 +199,29 @@ export default { |
| 198 | 199 | //导出学生名单 |
| 199 | 200 | async downStudentExcel() { |
| 200 | 201 | this.loadingDown = true; |
| 201 | - let { data, info, status } = | |
| 202 | - await this.$request.studentClickerTemplateUrl(); | |
| 202 | + let data = await this.$request.exportNoClassStudent(); | |
| 203 | 203 | this.loadingDown = false; |
| 204 | - if (status == 0) { | |
| 205 | - const a = document.createElement("a"); | |
| 206 | - a.href = data.downloadUrl; | |
| 207 | - document.body.appendChild(a); | |
| 208 | - a.click(); | |
| 209 | - a.remove(); | |
| 204 | + if (data) { | |
| 205 | + let blob = new Blob([data], { | |
| 206 | + type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", | |
| 207 | + }); | |
| 208 | + downloadFile("未分配学生名单.xlsx", blob); | |
| 210 | 209 | } else { |
| 211 | - this.$message.error(info); | |
| 210 | + this.$message.error("下载失败"); | |
| 212 | 211 | } |
| 213 | 212 | }, |
| 214 | 213 | //导出任课老师名单 |
| 215 | 214 | async downTeacherExcel() { |
| 216 | 215 | this.loadingDown = true; |
| 217 | - let { data, info, status } = | |
| 218 | - await this.$request.teacherClickerTemplateUrl(); | |
| 216 | + let data = await this.$request.exportNoClassTeacher(); | |
| 219 | 217 | this.loadingDown = false; |
| 220 | - if (status == 0) { | |
| 221 | - const a = document.createElement("a"); | |
| 222 | - a.href = data.downloadUrl; | |
| 223 | - document.body.appendChild(a); | |
| 224 | - a.click(); | |
| 225 | - a.remove(); | |
| 218 | + if (data) { | |
| 219 | + let blob = new Blob([data], { | |
| 220 | + type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", | |
| 221 | + }); | |
| 222 | + downloadFile("未分配教师 名单.xlsx", blob); | |
| 226 | 223 | } else { |
| 227 | - this.$message.error(info); | |
| 224 | + this.$message.error("下载失败"); | |
| 228 | 225 | } |
| 229 | 226 | }, |
| 230 | 227 | //班级归档 | ... | ... |