config.vue 7.2 KB

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