config.vue 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <template>
  2. <div class="config">
  3. <Header @confirmExit="confirmExit"></Header>
  4. <div class="main">
  5. <el-table :data="examList" class="table" @row-click="handleSelectionChange" highlight-current-row>
  6. <el-table-column prop="0" label="项目" sortable />
  7. <el-table-column prop="1" label="状态" />
  8. <el-table-column prop="2" label="工作站" :formatter="showWorkers" sortable />
  9. <el-table-column fixed="right" label="操作" width="210">
  10. <template #default="scope">
  11. <el-button @click="chooseItem(scope.row)" size="small" type="primary" plain>部署</el-button>
  12. <el-button @click="delExamConf(scope.row)" size="small" type="danger" plain>删除</el-button>
  13. <el-button @click="closeExam(scope.row)" size="small" type="warning" plain v-show="scope.row[1] == '已开启'">下课
  14. </el-button>
  15. </template>
  16. </el-table-column>
  17. </el-table>
  18. </div>
  19. <div class="footerBtn">
  20. <div class="btn" @click="openWorkstation('add', '添加项目')">添加项目</div>
  21. <div class="btn" @click="openWorkstation('led', '关闭LED屏幕')">关闭LED屏幕</div>
  22. <div class="btn" @click="openWorkstation('restart', '重启工作站')">重启工作站</div>
  23. <div class="btn" @click="openWorkstation('close', '关闭工作站')">关闭工作站</div>
  24. <div class="btn" @click="getExamList">刷新</div>
  25. </div>
  26. <WorkstationWindow ref="workstationWindowRef" @returnData="returnRefresh" />
  27. </div>
  28. </template>
  29. <script setup name="Login" lang="ts">
  30. import dataDictionary from "@/utils/dataDictionary"
  31. const { proxy } = getCurrentInstance() as any;
  32. const router = useRouter();
  33. const dic: any = dataDictionary;
  34. const workstationWindowRef = ref();
  35. const data = reactive<any>({
  36. examList: [],
  37. selectValue: [],
  38. loginname: "",
  39. workers: {},
  40. workerMap: [],
  41. oLWorkers: {},
  42. examMaxIdxMap: {},
  43. existExamIds: {},
  44. });
  45. const { examList, selectValue, loginname, workers, workerMap, oLWorkers, examMaxIdxMap, existExamIds } = toRefs(data);
  46. //被选行
  47. const handleSelectionChange = (data: any) => {
  48. selectValue.value = data;
  49. };
  50. //获取列表
  51. const getExamList = async () => {
  52. let myInfo: any = localStorage.getItem("userInfo");
  53. let userInfo = JSON.parse(myInfo);
  54. let params: any = {
  55. school_id: userInfo.school_id
  56. };
  57. let res = await proxy?.$http.common.allExams(params)
  58. workers.value = res.workers
  59. Object.keys(res.workers).forEach((item) => {
  60. workerMap.value[res.workers[item][0]] = item
  61. let wkVal = workers.value[item]
  62. if (wkVal[1] === "在线") {
  63. oLWorkers.value[item] = wkVal
  64. }
  65. })
  66. loginname.value = res.login_name
  67. let list = [];
  68. for (let i in res.exams) {
  69. if (i.indexOf("skiprope") != 0 && i.indexOf("heartbeat") != 0) {
  70. let enIndex = i.split('_')
  71. let en = enIndex[0]
  72. let eindex = enIndex[1]
  73. res.exams[i].worker.forEach((worker: any) => {
  74. if (worker in examMaxIdxMap.value) { }
  75. else { examMaxIdxMap.value[worker] = {} }
  76. if (en in examMaxIdxMap.value[worker]) {
  77. if (Number(eindex) > Number(examMaxIdxMap.value[worker][en])) {
  78. examMaxIdxMap.value[worker][en] = Number(eindex)
  79. }
  80. } else {
  81. examMaxIdxMap.value[worker][en] = Number(eindex)
  82. }
  83. if (worker in existExamIds.value) {
  84. existExamIds.value[worker].push(i)
  85. } else {
  86. existExamIds.value[worker] = []
  87. }
  88. })
  89. list.push(
  90. [dic.project[en] + "_" + eindex, res.exams[i].isopen,
  91. res.exams[i].worker, i])
  92. }
  93. }
  94. examList.value = list;
  95. };
  96. //转换
  97. const showWorkers = (row: any) => {
  98. return row[2].join(",")
  99. };
  100. //操作工作站
  101. const openWorkstation = (type: any, title: any) => {
  102. workstationWindowRef.value.open(type, title);
  103. };
  104. //部署
  105. const chooseItem = (item: any) => {
  106. // let itemName = this.exams[item]
  107. let isOn = false
  108. item[2].forEach((wkId: any) => {
  109. if (workers.value[wkId]) {
  110. if (workers.value[wkId][1] == "在线") {
  111. isOn = true
  112. }
  113. }
  114. })
  115. if (isOn) {
  116. } else {
  117. proxy?.$modal.msgError(`工作站不在线暂不允许配置`);
  118. }
  119. };
  120. //删除项目
  121. const delExamConf = (item: any) => {
  122. let conTitle = `是否移除项目-${item[0]}`
  123. proxy?.$modal.confirm(conTitle).then(() => {
  124. let examId = item[3]
  125. let ename = examId.split("_")[0]
  126. let eidx = Number(examId.split("_")[1])
  127. let myInfo: any = localStorage.getItem("userInfo");
  128. let userInfo = JSON.parse(myInfo);
  129. let params: any = {
  130. exam_id: examId,
  131. school_id: userInfo.school_id
  132. };
  133. proxy?.$http.common.delExamSettings(
  134. params
  135. ).then((res: any) => {
  136. if (res.status == 200) {
  137. let selWorker: any;
  138. let existIdx: any;
  139. item[2].forEach((worker: any) => {
  140. existIdx = existExamIds.value[worker].indexOf(examId)
  141. if (examMaxIdxMap.value[worker][ename] == eidx) {
  142. examMaxIdxMap.value[worker][ename] = eidx - 1
  143. selWorker = worker
  144. } else if (existIdx > -1) {
  145. selWorker = worker
  146. }
  147. })
  148. console.log(selWorker, examMaxIdxMap.value, "examMaxIdxMap.value")
  149. // let existIdx = existExamIds.value[selWorker].indexOf(examId)
  150. let index = examList.value.indexOf(item)
  151. if (existIdx > -1) {
  152. existExamIds.value[selWorker].splice(existIdx, 1)
  153. }
  154. if (index > -1) {
  155. examList.value.splice(index, 1)
  156. }
  157. proxy?.$modal.msgSuccess(`删除成功`);
  158. } else {
  159. proxy?.$modal.msgError(`${res.message}`);
  160. }
  161. })
  162. }).catch((err: any) => {
  163. });
  164. };
  165. // 下课
  166. const closeExam = (item: any) => {
  167. let myInfo: any = localStorage.getItem("userInfo");
  168. let userInfo = JSON.parse(myInfo);
  169. let params: any = {
  170. exam_id: item[3],
  171. school_id: userInfo.school_id
  172. };
  173. proxy?.$http.common.closeExamForce(
  174. params
  175. ).then((res: any) => {
  176. if (res.status == 200) {
  177. proxy?.$modal.msgSuccess(`下课成功`);
  178. }
  179. getExamList()
  180. })
  181. };
  182. /**
  183. * 返回刷新列表
  184. */
  185. const returnRefresh = () => {
  186. getExamList();
  187. };
  188. /**
  189. * 返回
  190. */
  191. const confirmExit = () => {
  192. router.go(-1);
  193. };
  194. onMounted(() => {
  195. getExamList();
  196. })
  197. onActivated(() => {
  198. getExamList()
  199. })
  200. </script>
  201. <style lang="scss" scoped>
  202. $topPadding: 5.19rem;
  203. $waiPadding: 6.51rem;
  204. .main {
  205. width: calc(100% - ($waiPadding * 2));
  206. padding-top: 10rem;
  207. margin: 0 auto;
  208. display: flex;
  209. justify-content: center;
  210. overflow: hidden;
  211. .table {
  212. width: 100%;
  213. height: 65vh;
  214. }
  215. }
  216. .footerBtn {
  217. width: 100%;
  218. padding: 0 calc(13.02rem /2);
  219. box-sizing: border-box;
  220. position: fixed;
  221. bottom: 3vh;
  222. display: flex;
  223. justify-content: end;
  224. .btn {
  225. width: 11vw;
  226. height: 6.1vh;
  227. line-height: 6.1vh;
  228. font-size: 3vh;
  229. color: #1A293A;
  230. text-align: center;
  231. border-radius: 1vh;
  232. cursor: pointer;
  233. background: radial-gradient(159% 126% at 5% 93%, #8EFFA9 0%, #07FFE7 100%);
  234. box-shadow: 3px 6px 4px 1px rgba(0, 0, 0, 0.1874), inset 0px 1px 0px 2px rgba(255, 255, 255, 0.3);
  235. margin-left: 10px;
  236. &:hover {
  237. background: #8EFFA9;
  238. }
  239. }
  240. }
  241. </style>