index.vue 110 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075
  1. <template>
  2. <div>
  3. <div class="container" v-show="isOpen3d" key="container">
  4. <SearchBarMain />
  5. <div class="vr-bg" id="vr-bg-container"></div>
  6. <div id="player" style="width: 100%; height: 100%"></div>
  7. </div>
  8. <div
  9. class="ordinary-container"
  10. key="ordinary-container"
  11. v-show="!isOpen3d"
  12. @click="onBlur"
  13. >
  14. <div class="ordinary-left">
  15. <SearchBar
  16. class="search-container"
  17. v-model="inputValue"
  18. @focus="onFocus"
  19. @input="onInput"
  20. @blur="onBlur"
  21. ref="searchbar"
  22. />
  23. <div class="square-map" v-show="isOpenSquare">
  24. <el-row>
  25. <el-col v-for="(item, index) in images" :key="item" :span="8">
  26. <div
  27. class="grid-item-background"
  28. style="
  29. background-color: black;
  30. padding-top: 35px;
  31. padding-bottom: 25px;
  32. padding-left: 9px;
  33. padding-right: 5px;
  34. margin: 10px;
  35. border-radius: 20px;
  36. "
  37. >
  38. <div class="grid-item">
  39. <img
  40. :src="item.url"
  41. @dblclick="handleDblClickImg(item.alt)"
  42. @click="handleClickImg(item.alt, index)"
  43. />
  44. </div>
  45. <div class="grid-item-close">
  46. <img
  47. width="30px"
  48. src="../../images/closeremotebench.png"
  49. @click="handleCloseImg(item.alt)"
  50. />
  51. </div>
  52. </div>
  53. </el-col>
  54. </el-row>
  55. </div>
  56. <div class="filter-bench-list" v-show="isOpen" z-index="9999">
  57. <dropdown :is-open="isOpen" ref="dropdown">
  58. <template v-slot:table>
  59. <table-component
  60. :data="filterBenchList"
  61. :filters="filters"
  62. :row-class-name="rowClassName"
  63. ></table-component>
  64. </template>
  65. </dropdown>
  66. </div>
  67. <div
  68. v-show="!isConnected && !isOpenSquare && !isOpen"
  69. class="ordinary-map-container"
  70. z-index="9998"
  71. >
  72. <div class="ordinary-map" id="ordinary-map">
  73. <!-- <img src="../../images/map.png" /> -->
  74. <div class="vr-bg" id="vr-bg-container"></div>
  75. <div id="playersmall"></div>
  76. <div class="ordinary-map-ex">
  77. <div class="square-count">
  78. <status-bar
  79. :ready="readyCount"
  80. :occupied="occupiedCount"
  81. :offline="offlineCount"
  82. ></status-bar>
  83. </div>
  84. <!-- <div class="bench-list">
  85. <div class="bench-list-buttons" @click="clickBenchList">
  86. My Bench List
  87. </div>
  88. </div> -->
  89. </div>
  90. </div>
  91. <div class="ordinary-map-hidden">
  92. <div class="ordinary-map-blocker" id="ordinary-map-blocker">
  93. </div>
  94. </div>
  95. </div>
  96. <div v-show="isConnected && !isOpenSquare && !isOpen" class="origin-map">
  97. <Transition name="slide">
  98. <div class="bmMap" v-if="false">
  99. <dropdown :is-open="isOpen" ref="dropdown">
  100. <template v-slot:table>
  101. <table-component
  102. :data="benchList"
  103. :filters="filters"
  104. :row-class-name="rowClassName"
  105. ></table-component>
  106. </template>
  107. </dropdown>
  108. <div class="bmMapImage">
  109. <div
  110. v-for="(item, key) in benchList"
  111. :key="key"
  112. class="bmMapItem el-icon-location"
  113. :style="{
  114. left: item.left + '%',
  115. top: item.top + '%',
  116. }"
  117. :class="item.status"
  118. @click="bmMapItemSelect(key)"
  119. >
  120. <Transition v-if="item.selected">
  121. <template>
  122. <div
  123. class="bmMapItemInfo"
  124. :class="{
  125. bmMapItemInfoSelected: item.selected,
  126. }"
  127. >
  128. <span>
  129. {{ item.name }}
  130. </span>
  131. <span style="display: flex; align-items: center">
  132. {{ item.Project }}
  133. </span>
  134. <div style="width: 100%">
  135. <span
  136. class="bmInfoMsSlideNameStatus"
  137. :class="{
  138. ['bmInfoMsSlideNameStatus ' + item.status]: true,
  139. }"
  140. ></span>
  141. </div>
  142. <!-- <div class="bmMapItemInfoAfter"></div> -->
  143. </div>
  144. </template>
  145. </Transition>
  146. </div>
  147. </div>
  148. </div>
  149. </Transition>
  150. <Transition name="slide">
  151. <div class="bmBench" v-if="benchDisplayVisible">
  152. <div class="bmBenchBox">
  153. <img
  154. class="bmBenchImg bmBenchImgUpper"
  155. ref="bmBenchRef"
  156. :src="
  157. currentScreen == 'upper' ? benchImgUpper : benchImgLower
  158. "
  159. alt=""
  160. />
  161. <div
  162. @mousedown="controlCursorMouseDown"
  163. @mousemove="controlCursorMouseMove"
  164. @mouseleave="controlCursorMouseOut"
  165. @mouseup="controlCursorMouseUp"
  166. class="bmBenchTrailUpper"
  167. >
  168. <Transition>
  169. <div
  170. v-if="ifBmBenchTrailUpperCursorTap"
  171. class="bmBenchTrailUpperCursorTap"
  172. :style="{
  173. left: trailCursorPosition.left,
  174. top: trailCursorPosition.top,
  175. }"
  176. ></div>
  177. </Transition>
  178. <Transition>
  179. <div
  180. v-if="ifBmBenchTrailUpperCursorSwipe"
  181. class="bmBenchTrailUpperCursorSwipe"
  182. :style="{
  183. left: 'calc(' + trailCursorPosition.left + '% - 1vh)',
  184. top: 'calc(' + trailCursorPosition.top + '% - 1vh)',
  185. }"
  186. ></div>
  187. </Transition>
  188. <Transition>
  189. <div
  190. v-if="ifBmBenchTrailUpperCursorSwipe"
  191. class="bmBenchTrailUpperCursorSwipe bmBenchTrailUpperCursorSwipe2"
  192. :style="{
  193. left:
  194. 'calc(' + trailCursorPosition.left + '% - 0.75vh)',
  195. top: 'calc(' + trailCursorPosition.top + '% - 0.75vh)',
  196. }"
  197. ></div>
  198. </Transition>
  199. <Transition>
  200. <div
  201. v-if="ifBmBenchTrailUpperCursorSwipe"
  202. class="bmBenchTrailUpperCursorSwipe bmBenchTrailUpperCursorSwipe3"
  203. :style="{
  204. left: 'calc(' + trailCursorPosition.left + '% - 0.5vh)',
  205. top: 'calc(' + trailCursorPosition.top + '% - 0.5vh)',
  206. }"
  207. ></div>
  208. </Transition>
  209. <Transition>
  210. <div
  211. v-if="ifBmBenchTrailUpperCursorPress"
  212. class="bmBenchTrailUpperCursorPress"
  213. :style="{
  214. left: 'calc(' + trailCursorPosition.left + '% - 1vh)',
  215. top: 'calc(' + trailCursorPosition.top + '% - 1vh)',
  216. }"
  217. ></div>
  218. </Transition>
  219. <Transition>
  220. <div
  221. v-if="ifBmBenchTrailUpperCursor"
  222. class="bmBenchTrailUpperCursor"
  223. :style="{
  224. left:
  225. 'calc(' + controlCursorPosition.left + 'px - 1vh)',
  226. top: 'calc(' + controlCursorPosition.top + 'px - 1vh)',
  227. }"
  228. ></div>
  229. </Transition>
  230. </div>
  231. </div>
  232. </div>
  233. </Transition>
  234. <img :src="mainSnapshot" />
  235. </div>
  236. <image-list
  237. v-show="isConnected && !isOpenSquare && !isOpen"
  238. :images="images"
  239. :page-size="pageSize"
  240. :current-page="currentPage"
  241. @handleImageClick="handleImageClick"
  242. @prev-page="prevPage"
  243. @next-page="nextPage"
  244. class="image-container"
  245. />
  246. <el-row v-show="isConnected && !isOpenSquare && !isOpen" class="bench-button">
  247. <el-col :span="5" class="btn-item" style="text-align: center">{{
  248. currentBench.name
  249. }}</el-col>
  250. <el-col
  251. :span="3"
  252. class="btn-item"
  253. :class="{ benchBtnActive: isPlaying }"
  254. >
  255. <img
  256. @click="connectAudioDevice('collectAudio')"
  257. src="../../images/sound.png"
  258. />
  259. </el-col>
  260. <el-col
  261. :span="3"
  262. class="btn-item"
  263. :class="{ benchBtnActive: isRecording }"
  264. >
  265. <img
  266. @click="connectAudioDevice('playAudio')"
  267. src="../../images/mic.png"
  268. />
  269. </el-col>
  270. <el-col
  271. :span="3"
  272. class="btn-item"
  273. :class="{ benchBtnActive: displayTapMode }"
  274. >
  275. <img @click="tapModeControl" src="../../images/pointer.png" />
  276. </el-col>
  277. <el-col :span="3" class="btn-item">
  278. <img @click="showLogBox" src="../../images/book.png" />
  279. </el-col>
  280. <el-col :span="3" class="btn-item">
  281. <img @click="pressPtt" src="../../images/robot.png" />
  282. </el-col>
  283. <!-- <el-col :span="3" class="btn-item" @click="clickBenchList">
  284. <img @click="gotoGrid" src="../../images/grid.png" />
  285. </el-col> -->
  286. <el-col :span="3" class="btn-item">
  287. <img @click="disconnectBench" src="../../images/disconnect.png" />
  288. </el-col>
  289. </el-row>
  290. </div>
  291. <div class="origin-right">
  292. <!-- <div class="square-count" v-show="!currentBench.selected && isOpenSquare">
  293. <status-bar
  294. :ready="readyCount"
  295. :occupied="occupiedCount"
  296. :offline="offlineCount"
  297. ></status-bar>
  298. </div> -->
  299. <!-- <div
  300. class="origin-basic"
  301. v-show="currentBench.type == 2 && !isOpenSquare"
  302. @dblclick="handleInfoDblClick(currentBench.benchId)"
  303. >
  304. <h2 @click="bmMapItemActivate">{{ currentBench.name }} 🔗</h2>
  305. <div class="originBasicRow">
  306. <div>
  307. <span>Location:</span>
  308. <span>Automation Lab-7E</span>
  309. </div>
  310. <div>
  311. <span>MU_SW</span>
  312. <span>{{ currentBench.MU_SW }}</span>
  313. </div>
  314. </div>
  315. <div class="originBasicRow">
  316. <div>
  317. <span>Cluster</span>
  318. <span>{{ currentBench.Cluster }}</span>
  319. </div>
  320. <div>
  321. <span>Market</span>
  322. <span>{{ currentBench.Market }}</span>
  323. </div>
  324. </div>
  325. <div class="originBasicRow">
  326. <div>
  327. <span>Box IP</span>
  328. <span>{{ currentBench.ip }}</span>
  329. </div>
  330. <div>
  331. <span>Box Version</span>
  332. <span>{{ currentBench.equipment?.version }}</span>
  333. </div>
  334. </div>
  335. </div> -->
  336. <!-- <div
  337. class="secondScreen"
  338. v-if="benchDisplayLowerVisible && !isOpenSquare"
  339. @click="switchScreen"
  340. >
  341. <img
  342. class="bmBenchImg bmBenchImgLower"
  343. :src="currentScreen == 'upper' ? benchImgLower : benchImgUpper"
  344. alt=""
  345. />
  346. </div> -->
  347. <!--<div
  348. class="origin-basic backgroundBox"
  349. v-show="currentBench.type == 2"
  350. @dblclick="handleInfoDblClick(currentBench.benchId)"
  351. >
  352. <h2 @click="bmMapItemActivate">{{ currentBench.name }} 🔗</h2>
  353. <div class="originBasicRow">
  354. <div>
  355. <span>Location:</span>
  356. <span>Automation Lab-7E</span>
  357. </div>
  358. <div>
  359. <span>MU_SW</span>
  360. <span>{{ currentBench.MU_SW }}</span>
  361. </div>
  362. </div>
  363. <div class="originBasicRow">
  364. <div>
  365. <span>Cluster</span>
  366. <span>{{ currentBench.Cluster }}</span>
  367. </div>
  368. <div>
  369. <span>Market</span>
  370. <span>{{ currentBench.Market }}</span>
  371. </div>
  372. </div>
  373. <div class="originBasicRow">
  374. <div>
  375. <span>Box IP</span>
  376. <span>{{ currentBench.ip }}</span>
  377. </div>
  378. <div>
  379. <span>Box Version</span>
  380. <span>{{ currentBench.equipment?.version }}</span>
  381. </div>
  382. </div>
  383. </div>
  384. <div
  385. class="secondScreen"
  386. v-if="benchDisplayLowerVisible"
  387. @click="switchScreen"
  388. >
  389. <img
  390. class="bmBenchImg bmBenchImgLower"
  391. :src="currentScreen == 'upper' ? benchImgLower : benchImgUpper"
  392. alt=""
  393. />
  394. </div>-->
  395. <div class="ordinary-list">
  396. <TabList
  397. :tabs="tabs"
  398. :itemRender="itemRender"
  399. :planRender="planRender"
  400. :taskRender="taskRender"
  401. :issueRender="issueRender"
  402. :planList="planList"
  403. :caseList="caseList"
  404. :autoCaseList="autoCaseList"
  405. :is-show-auto-case-list="isShowAutoCaseList"
  406. :planName="planName"
  407. :taskName="taskName"
  408. :caseName="caseName"
  409. :is-show-plan-list="isShowPlanList"
  410. :is-show-task-list="isShowTaskList"
  411. :is-show-case-commit="isShowCaseCommit"
  412. :is-show-case-list="isShowCaseList"
  413. :is-show-case-detail="isShowCaseDetail"
  414. :clickBackToTaskList="clickBackToTaskList"
  415. :clickBackToPlanList="clickBackToPlanList"
  416. :selectRowPlan="selectRowPlan"
  417. :caseProject="caseProject"
  418. :currentCase="currentCase"
  419. :caseActive="caseActive"
  420. :caseFunction="caseFunction"
  421. caseContent="caseContent"
  422. :isShowAutoCaseCommit="isShowAutoCaseCommit"
  423. @turnNextCase="turnNextCase"
  424. :caseSubFunction="caseSubFunction"
  425. :caseMarket="caseMarket"
  426. :caseLanguage="caseLanguage"
  427. v-if="renderBenchList"
  428. :selectRowCase="selectRowCase"
  429. :clickBackToAutoPlanList="clickBackToAutoPlanList"
  430. :tabClass="tabClass"
  431. :planBack="planBack"
  432. :clickBackToPlan="clickBackToPlan"
  433. :submitManualCase="submitManualCase"
  434. :clickBackToCaseList="clickBackToCaseList"
  435. :isShowIssueList="isShowIssueList"
  436. :isShowIssueDetail="isShowIssueDetail"
  437. :currentIssue="currentIssue"
  438. :currentPlanId="currentPlanId"
  439. :submitAutoCase="submitAutoCase"
  440. :clickBackToAutoCaseList="clickBackToAutoCaseList"
  441. :clickBackToIssueList="clickBackToIssueList"
  442. :benchDisplayLowerVisible="benchDisplayLowerVisible"
  443. :currentScreen="currentScreen"
  444. :benchImgLower="benchImgLower"
  445. :benchImgUpper="benchImgUpper"
  446. :readyCount="readyCount"
  447. :occupiedCount="occupiedCount"
  448. :offlineCount="offlineCount"
  449. ></TabList>
  450. </div>
  451. </div>
  452. </div>
  453. <bench-detail
  454. :is-detail-visible="isDetailVisible"
  455. :is-remote-btn-visible="isRemoteBtnVisible"
  456. :closeDetail="closeDetail"
  457. ref="benchdetail"
  458. :bench="currentBench"
  459. @changeCurrentBench="changeCurrentBench"
  460. />
  461. </div>
  462. </template>
  463. <script>
  464. import "./index.less";
  465. import "./origin.less";
  466. import "./square.less";
  467. import TabList from "../../components/TabList";
  468. import SearchBar from "../../components/SearchBar";
  469. import Dropdown from "./components/DropDown";
  470. import TableComponent from "./components/TableComponent";
  471. import BenchDetail from "../../components/BenchDetail";
  472. import StatusBar from "../../components/StatusBar";
  473. //import { benchList } from './api'
  474. import THREE from "three";
  475. import { uwbMain } from "../../uwb-sample";
  476. import { mapState } from "vuex";
  477. import ImageList from "./components/ImageList";
  478. import webSocket from "../../service/ws";
  479. import bus from "../../service/bus";
  480. import { FBXLoader } from "../../FBXLoader.js";
  481. import SearchBarMain from "../../components/SearchBarMain";
  482. const ws = new webSocket();
  483. let that = null;
  484. let wsArray = [];
  485. let wsArrayLength = 0;
  486. for (var iR = 0; iR < 20; iR++) {
  487. const wsRemote = new webSocket();
  488. wsRemote.open().then((res) => {
  489. // console.log("res", res);
  490. });
  491. wsArray.push(wsRemote);
  492. }
  493. export default {
  494. components: {
  495. StatusBar,
  496. TabList,
  497. SearchBar,
  498. Dropdown,
  499. TableComponent,
  500. BenchDetail,
  501. ImageList,
  502. SearchBarMain,
  503. },
  504. data() {
  505. return {
  506. inputValue: "",
  507. isOpen: false,
  508. isDetailVisible: false,
  509. isRemoteBtnVisible: false,
  510. isShowPlanList: false,
  511. isShowCaseList: false,
  512. isShowAutoCaseList: false,
  513. isShowCaseDetail: false,
  514. isShowCaseCommit: false,
  515. isShowIssueList: true,
  516. isShowIssueDetail: false,
  517. isShowAutoCaseCommit: false,
  518. taskName: "",
  519. planName: "",
  520. caseName: "",
  521. caseProject: "",
  522. caseActive: "",
  523. caseFunction: "",
  524. caseSubFunction: "",
  525. caseMarket: "",
  526. caseLanguage: "",
  527. caseContent: "",
  528. isShowTaskList: true,
  529. benchDisplayVisible: false,
  530. mainSnapshot: "",
  531. currentBench: {},
  532. readyCount: 10,
  533. occupiedCount: 5,
  534. offlineCount: 3,
  535. previousSelectedBenchList: [],
  536. selectedBenchList: [],
  537. renderBenchList: true,
  538. filters: [],
  539. currentCase: null,
  540. currentIssue: null,
  541. currentPlanId: null,
  542. currentCaseIndex: 0,
  543. tabs: [
  544. {
  545. title: "Bench",
  546. list: [
  547. // {
  548. // title: 'Item 1',
  549. // description: '1111111',
  550. // image: 'item1.jpg',
  551. // tag: 'Tag 1'
  552. // },
  553. // {
  554. // title: 'Item 2',
  555. // description: '32222',
  556. // image: 'item2.jpg',
  557. // tag: 'Tag 2'
  558. // },
  559. // {
  560. // title: 'Item 3',
  561. // description: '1111111',
  562. // image: 'item3.jpg',
  563. // tag: 'Tag 3'
  564. // }
  565. ],
  566. },
  567. {
  568. title: "Task",
  569. list: [
  570. {
  571. itemtype: 2,
  572. title: "Item 4",
  573. description: "1111111",
  574. image: "item4.jpg",
  575. tag: "Tag 4",
  576. },
  577. {
  578. itemtype: 2,
  579. title: "Item 5",
  580. description: "1111111",
  581. image: "item5.jpg",
  582. tag: "Tag 5",
  583. },
  584. {
  585. itemtype: 2,
  586. title: "Item 6",
  587. description: "1111111",
  588. image: "item6.jpg",
  589. tag: "Tag 6",
  590. },
  591. ],
  592. },
  593. {
  594. title: "Issue",
  595. list: [
  596. {
  597. title: "Item 7",
  598. image: "item7.jpg",
  599. tag: "Tag 7",
  600. },
  601. {
  602. title: "Item 8",
  603. image: "item8.jpg",
  604. tag: "Tag 8",
  605. },
  606. {
  607. title: "Item 9",
  608. image: "item9.jpg",
  609. tag: "Tag 9",
  610. },
  611. ],
  612. },
  613. ],
  614. tableData: [
  615. {
  616. benchname: "Bench 1",
  617. project: "Project A",
  618. carline: "Carline A",
  619. market: "Market A",
  620. sw: "SW 1",
  621. status: "Status A",
  622. },
  623. {
  624. benchname: "Bench 2",
  625. project: "Project B",
  626. carline: "Carline B",
  627. market: "Market B",
  628. sw: "SW 2",
  629. status: "Status B",
  630. },
  631. // ...
  632. ],
  633. currentPage: 1,
  634. pageSize: 5,
  635. benchId: "219",
  636. mainSnapshot: "",
  637. timer: 0,
  638. platform: null,
  639. connetedBenchId: "",
  640. displayTapMode: false,
  641. controlCursorPosition: {},
  642. ifBmBenchTrailUpperCursorTap: false,
  643. benchLog: [],
  644. trailCursorPosition: {},
  645. audioName: "",
  646. ifBmBenchTrailUpperCursorSwipe: false,
  647. ifBmBenchTrailUpperCursorPress: false,
  648. ifBmBenchTrailUpperCursor: false,
  649. controlStartPoint: {},
  650. ifShowLogBox: false,
  651. filterData: {
  652. keyword: "",
  653. currentPage: 1,
  654. pageSize: 10,
  655. status: [4, 3, 5, 0, 2, 6],
  656. types: [],
  657. "basic attributes": [],
  658. ips: [],
  659. orderBy: "desc",
  660. orderkey: "id",
  661. },
  662. benchImgUpper: "",
  663. benchImgUpperMap: {},
  664. currentScreen: "upper",
  665. benchDisplayLowerVisible: false,
  666. benchImgLower: "",
  667. benchImgLowerMap: {},
  668. isPlaying: false,
  669. isRecording: false,
  670. loopSendAudioTime: null,
  671. sendAudioString: "",
  672. vadThreshold: 0,
  673. recStream: null,
  674. paAc: null,
  675. paSource: null,
  676. paScriptNode: null,
  677. sempleRateMultiple: null,
  678. recordSuperposeArr: [],
  679. sempleRateHandlingThreshold: null,
  680. playAudioBenchList: [],
  681. isConnected: false,
  682. currentBenchId: 0,
  683. gridItems: [1, 2, 3, 4, 5, 6, 7, 8, 9],
  684. timerIdMap: { num: 0 },
  685. timerId: 0,
  686. autoPlanResultInterval: 0,
  687. remoteBenchList: []
  688. };
  689. },
  690. computed: {
  691. // tabClass(){
  692. // return 'ordinary';
  693. // },
  694. tabClass() {
  695. return this.currentBench.type == 2 ? "short" : "long";
  696. },
  697. ...mapState({
  698. images: (state) => {
  699. console.log(state.benchList.benchImgList, "imageList");
  700. return state.benchList.benchImgList;
  701. },
  702. isOpenSquare: (state) => {
  703. return state.common.isOpenSquare;
  704. },
  705. isOpen3d: (state) => {
  706. return state.common.isOpen3d;
  707. },
  708. benchList: (state) => {
  709. return state.benchList.benchList;
  710. },
  711. taskList: (state) => {
  712. return state.taskList.taskList;
  713. },
  714. planList: (state) => {
  715. console.log(state.planList.planList, "planList==============");
  716. let planList = state.planList.planList.concat(
  717. state.planList.autoPlanList
  718. );
  719. planList = planList.sort((p1, p2) => p1.id - p2.id);
  720. return planList;
  721. },
  722. autoPlanList: (state) => {
  723. return state.planList.autoPlanList;
  724. },
  725. caseList: (state) => {
  726. return state.caseList.caseList;
  727. },
  728. autoCaseList: (state) => {
  729. return state.caseList.autoCaseList;
  730. },
  731. issueList: (state) => {
  732. return state.issueList.issueList;
  733. },
  734. autoTaskStatus: (state) => {
  735. return state.caseList.autoTaskStatus
  736. },
  737. filterBenchList: (state) => {
  738. return state.benchList.filterBenchList.sort((a, b) => {
  739. let i = 0;
  740. let j = 0;
  741. for (let m = 0; m < a.MU_SW.length; m++) {
  742. i += a.MU_SW.charCodeAt(m);
  743. }
  744. for (let n = 0; n < b.MU_SW.length; n++) {
  745. j += b.MU_SW.charCodeAt(n);
  746. }
  747. return i - j;
  748. });
  749. },
  750. autoTaskStatusMap: (state) => {
  751. return state.caseList.autoTaskStatusMap
  752. }
  753. }),
  754. },
  755. created() {
  756. // uwbMain("player", window.innerWidth, window.innerHeight, "panorama");
  757. ws.open().then((res) => {
  758. // console.log("res", res);
  759. });
  760. window.handleListClick = this.handleListClick;
  761. window.handleBenchClick = this.handleBenchClick;
  762. window.handleClickTask = this.handleClickTask.bind(this);
  763. window.selectRowPlan = this.selectRowPlan.bind(this);
  764. window.selectRowCase = this.selectRowCase.bind(this);
  765. window.selectRowIssue = this.selectRowIssue.bind(this);
  766. window.handleListDbClick = this.handleListDbClick;
  767. window.showBenchPos = this.showBenchPos;
  768. window.handleClickImg = this.handleClickImg;
  769. let that = this;
  770. window.bmMapItemSelect = this.bmMapItemSelect.bind(this);
  771. window.bmMapItemUnSelect = this.bmMapItemUnSelect.bind(this);
  772. window.handleClickIssue = this.handleClickIssue.bind(this);
  773. window.selectBench = this.selectBench.bind(this);
  774. that.$store.dispatch("taskList/clearTaskList");
  775. that.$store.dispatch("taskList/fetchTaskList", {
  776. page_num: 1,
  777. page_size: 1000,
  778. });
  779. window.bmMapItemActivate = this.bmMapItemActivate;
  780. // 调用定时器方法,返回定时器id,用于按条件清空
  781. that.timerId = that.myInterval((count) => {
  782. // console.log(count)
  783. this.$store.dispatch("benchList/fetchBenchList");
  784. if (count > 30000) {
  785. console.log("end");
  786. that.clearMyInterval(that.timerId);
  787. }
  788. }, 3000);
  789. this.$store.dispatch("issueList/fetchIssueList", {
  790. bench_id: null,
  791. page_num: 1,
  792. page_size: 10,
  793. processor: 0,
  794. ticket_status: 0,
  795. ticket_type: 0,
  796. });
  797. },
  798. async mounted() {
  799. that = this;
  800. //this.getBenchList();
  801. console.log(this.benchList, "benchList");
  802. this.tabs[0].list = this.benchList;
  803. this.tabs[1].list = this.taskList;
  804. this.tabs[2].list = this.issueList;
  805. let mapDom = document.getElementsByClassName("ordinary-map")[0];
  806. let style = getComputedStyle(mapDom);
  807. let width = parseFloat(style.width);
  808. let height = parseFloat(style.height);
  809. let ratio = 1.8;
  810. window.renderWidth = width * ratio;
  811. window.renderHeight = height * ratio;
  812. sessionStorage.setItem('3dMode', 0)
  813. uwbMain('playersmall', width * ratio, height * ratio, "floorplan");
  814. // window.sdkInstance.sceneRenderer.updateScreenSize(width * ratio, height * ratio);
  815. setTimeout(() => {
  816. var element = document.getElementById('house-player');
  817. element.style.marginLeft = ((width - (width * ratio)) / 2) + 'px';
  818. element.style.marginTop = ((height - (height * ratio)) / 2) + 'px';
  819. }, 1000)
  820. setTimeout(() => {
  821. let self = this;
  822. var objRBL = this.remoteBenchList;
  823. if (objRBL) {
  824. console.log("objRBL", objRBL);
  825. wsArrayLength = objRBL.length;
  826. for (var iW = 0; iW < objRBL.length; iW++) {
  827. var i = JSON.parse(JSON.stringify(iW));
  828. let benchId = JSON.parse(JSON.stringify(objRBL[i]));
  829. setTimeout(() => {
  830. console.log("connect bench", benchId);
  831. wsArray[i]
  832. ?.connectBench({ bench_id: String(benchId) })
  833. .then((res) => {
  834. console.log("connect bench success", benchId);
  835. self.getBenchImage(benchId, 1, wsArray[i], () => {});
  836. })
  837. .catch((err) => {
  838. console.log("connect bench failed", benchId);
  839. this.$message({
  840. message: "This bench is offline",
  841. // message: "",
  842. type: "warning",
  843. });
  844. });
  845. }, iW * 2000);
  846. }
  847. }
  848. }, 3000);
  849. bus.on("newLog", (param) => {
  850. if (param.action) {
  851. this.benchLog.unshift(param);
  852. // document.getElementsByClassName("bmLogBottom")[0].scrollIntoView();
  853. if (Object.keys(param.action).length != 0) {
  854. // console.log("actionType", param.action.actionType);
  855. let position = param.action.pos;
  856. // console.log("position", position);
  857. if (param.action.actionType == "swipe on") {
  858. this.ifBmBenchTrailUpperCursorSwipe = true;
  859. this.trailCursorPosition.left = (position[0] / 1540) * 100;
  860. this.trailCursorPosition.top = (position[1] / 720) * 100;
  861. setTimeout(() => {
  862. this.trailCursorPosition.left =
  863. ((position[0] + position[2]) / 1540) * 100;
  864. this.trailCursorPosition.top =
  865. ((position[1] + position[3]) / 720) * 100;
  866. }, 800);
  867. setTimeout(() => {
  868. this.ifBmBenchTrailUpperCursorSwipe = false;
  869. }, 2000);
  870. } else if (param.action.actionType == "tap on") {
  871. this.ifBmBenchTrailUpperCursorTap = true;
  872. setTimeout(() => {
  873. this.ifBmBenchTrailUpperCursorTap = false;
  874. }, 1500);
  875. this.trailCursorPosition.left =
  876. "calc(" + ((position[0] * 2) / 1540) * 100 + "% - 1vh)";
  877. this.trailCursorPosition.top =
  878. "calc(" + ((position[1] * 2) / 720) * 100 + "% - 1vh)";
  879. } else if (param.action.actionType == "longPress on") {
  880. this.ifBmBenchTrailUpperCursorPress = true;
  881. setTimeout(() => {
  882. this.ifBmBenchTrailUpperCursorPress = false;
  883. }, 1500);
  884. this.trailCursorPosition.left = ((position[0] * 2) / 1540) * 100;
  885. this.trailCursorPosition.top = ((position[1] * 2) / 720) * 100;
  886. } else if (param.action.actionType == "audio") {
  887. // console.log("newLog", param);
  888. let fileName = param.action.file_name;
  889. console.log("audiofileName", fileName);
  890. this.audioName = fileName;
  891. bus.emit("planAudioEmit");
  892. }
  893. }
  894. }
  895. if (this.benchLog.length > 100) {
  896. this.benchLog.pop();
  897. }
  898. });
  899. bus.on("switchScreen", (param) => {
  900. this.currentScreen = param.currentScreen;
  901. });
  902. bus.on("goHome", () => {
  903. this.isConnected = false;
  904. this.$store.dispatch("common/setSquareStatus", false);
  905. });
  906. let autoCurrentTaskData = window.localStorage.getItem(
  907. "autoCurrentTaskData"
  908. );
  909. autoCurrentTaskData = JSON.parse(autoCurrentTaskData);
  910. if (autoCurrentTaskData) {
  911. this.$store.dispatch("caseList/setPlanExecId", autoCurrentTaskData.id);
  912. this.$store.dispatch('caseList/getAutoPlanResult',{planId: autoCurrentTaskData.id, key: autoCurrentTaskData.index});
  913. this.autoPlanResultInterval = setInterval(() => {
  914. this.$store.dispatch('caseList/getAutoPlanResult',{planId: autoCurrentTaskData.id, key: autoCurrentTaskData.index});
  915. }, 15000);
  916. }
  917. },
  918. methods: {
  919. changeCurrentBench(benchId) {
  920. this.isDetailVisible = false;
  921. if (this.isOpen3d) {
  922. this.$store.dispatch("common/toggle3dStatus");
  923. }
  924. this.selectBench(benchId);
  925. },
  926. myInterval(callback, interval) {
  927. // 每设置一次定时器,num++ 代表系统中有num个自定义的定时器
  928. this.timerIdMap.num++;
  929. // 第 num 个定时器的id
  930. let intervalId = "id" + this.timerIdMap.num;
  931. this.timerIdMap[intervalId] = true;
  932. // 循环次数
  933. let count = 0;
  934. let startTime = Date.now();
  935. let loop = () => {
  936. // 系统map中不存在这个id,就停止循环
  937. if (!this.timerIdMap[intervalId]) {
  938. return;
  939. }
  940. if (Date.now() > startTime + interval * (count + 1)) {
  941. count++;
  942. callback(count);
  943. }
  944. window.requestAnimationFrame(loop);
  945. };
  946. loop();
  947. return intervalId;
  948. },
  949. // 清空定时器,删除全局的定时器id map
  950. clearMyInterval(intervalId) {
  951. delete this.timerIdMap[intervalId];
  952. },
  953. turnToNextManualCase() {},
  954. clickBackToTaskList() {
  955. this.isShowPlanList = false;
  956. this.isShowTaskList = true;
  957. // this.planList = [];
  958. },
  959. clickBackToCaseList() {
  960. this.isShowCaseCommit = false;
  961. this.isShowCaseList = true;
  962. },
  963. submitManualCase(item) {
  964. console.log(this.currentCase, "manualcasedetail============");
  965. this.isShowCaseCommit = true;
  966. this.isShowCaseDetail = false;
  967. },
  968. clickBackToIssueList() {
  969. this.isShowIssueList = true;
  970. this.isShowIssueDetail = false;
  971. },
  972. clickBackToPlan() {
  973. this.isShowCaseDetail = false;
  974. if (sessionStorage.getItem("autoCase") == 0) {
  975. this.isShowCaseList = true;
  976. } else {
  977. this.isShowAutoCaseList = true;
  978. }
  979. },
  980. submitAutoCase() {
  981. if (this.autoTaskStatus == 'waiting' || this.autoTaskStatus == 'running') {
  982. let plan = JSON.stringify(localStorage.getItem('autoCurrentTaskData'))
  983. let planId = plan.id || 0;
  984. this.$store.dispatch('caseList/cancelPlan', planId);
  985. clearInterval(this.autoPlanResultInterval)
  986. this.clickBackToTaskList()
  987. return
  988. }
  989. this.isShowAutoCaseList = false;
  990. this.isShowAutoCaseCommit = true;
  991. },
  992. clickBackToAutoCaseList() {
  993. this.isShowAutoCaseList = true;
  994. this.isShowAutoCaseCommit = false;
  995. },
  996. selectRowPlan(id, auto, name) {
  997. console.log(id, "selectrowdata");
  998. if (!auto || auto == "undefined" || auto == "false") {
  999. this.currentPlanId = id;
  1000. this.$store.dispatch("caseList/fetchCaseList", {
  1001. uuid: id,
  1002. page_num: 1,
  1003. page_size: 100,
  1004. });
  1005. this.isShowCaseList = true;
  1006. sessionStorage.setItem("autoCase", 0);
  1007. this.$store.dispatch("caseList/setCurrentTask", id);
  1008. } else {
  1009. if (id == 109) id = 222;
  1010. this.currentPlanId = id;
  1011. this.$store.dispatch("caseList/fetchAutoCaseList", {
  1012. planId: id,
  1013. planName: name
  1014. });
  1015. this.isShowAutoCaseList = true;
  1016. this.$store.dispatch("caseList/setCurrentTask", id);
  1017. sessionStorage.setItem("autoCase", 1);
  1018. }
  1019. this.$store.dispatch("common/fetchOptionList");
  1020. this.isShowPlanList = false;
  1021. this.planName = name;
  1022. },
  1023. selectRowCase(row) {
  1024. this.isShowCaseList = false;
  1025. this.isShowCaseDetail = true;
  1026. this.caseName = row.m_id;
  1027. this.caseProject = row.precondition;
  1028. //this.caseActive =,
  1029. this.caseFunction = row.action;
  1030. this.caseSubFunction = row.expectation;
  1031. this.caseMarket = row.market;
  1032. this.caseLanguage = row.language;
  1033. this.currentCase = row;
  1034. for (let i = 0; i < this.caseList.length; i++) {
  1035. if (this.caseList[i].case_no == row.case_no) {
  1036. this.currentCaseIndex = i;
  1037. break;
  1038. }
  1039. }
  1040. //this.caseContent =,
  1041. },
  1042. turnNextCase() {
  1043. this.currentCaseIndex++;
  1044. if (this.currentCaseIndex == this.caseList.length) {
  1045. this.isShowCaseList = true;
  1046. this.isShowCaseCommit = false;
  1047. } else {
  1048. this.currentCase = this.caseList[this.currentCaseIndex];
  1049. this.caseName = this.currentCase.m_id;
  1050. this.caseProject = this.currentCase.precondition;
  1051. //this.caseActive =,
  1052. this.caseFunction = this.currentCase.action;
  1053. this.caseSubFunction = this.currentCase.expectation;
  1054. this.caseMarket = this.currentCase.market;
  1055. this.caseLanguage = this.currentCase.language;
  1056. this.isShowCaseCommit = false;
  1057. this.isShowCaseDetail = true;
  1058. }
  1059. },
  1060. selectRowIssue(id) {
  1061. let row = this.issueList.find((i) => i.id == id);
  1062. this.isShowIssueList = false;
  1063. this.isShowIssueDetail = true;
  1064. this.currentIssue = row;
  1065. console.log(row, "==============issue============");
  1066. },
  1067. clickBackToPlanList() {
  1068. this.isShowPlanList = true;
  1069. this.isShowCaseList = false;
  1070. this.caseList = [];
  1071. },
  1072. clickBackToAutoPlanList() {
  1073. this.isShowPlanList = true;
  1074. this.isShowAutoCaseList = false;
  1075. this.autoCaseList = [];
  1076. },
  1077. bmMapItemUnSelect() {
  1078. let items = document.getElementsByClassName("item-box");
  1079. for (var index = 0; index < items.length; index++) {
  1080. items[index].style.background = "#00000032";
  1081. let title = items[index].getElementsByClassName("item-title");
  1082. console.log("textContent", title[0].textContent);
  1083. let itemOther = this.benchList.find(
  1084. (b) => parseInt(b.id) == parseInt(title[0].textContent)
  1085. );
  1086. itemOther.selected = false;
  1087. itemOther.scale = 1;
  1088. }
  1089. },
  1090. onFocus() {
  1091. this.isOpen = true;
  1092. },
  1093. onBlur(e) {
  1094. console.log("=====----====", e.target.classList);
  1095. if (
  1096. Array.prototype.indexOf.call(e.target.classList, "ordinary-left") > -1
  1097. ) {
  1098. this.isOpen = false;
  1099. }
  1100. },
  1101. onInput(value) {
  1102. this.inputValue = value;
  1103. this.$store.dispatch('benchList/filterBenchList', {type: 'name', value: value});
  1104. this.$store.dispatch('benchList/setFilterBenchFlag', true);
  1105. },
  1106. onClickOutside() {
  1107. if (
  1108. this.$refs.searchbar.$el.contains(event.target) ||
  1109. this.$refs.dropdown.$el.contains(event.target)
  1110. ) {
  1111. return;
  1112. }
  1113. this.isOpen = false;
  1114. },
  1115. handleClickTask(taskId, auto) {
  1116. let task = that.taskList.find((t) => t.id == taskId);
  1117. // 获取手动测试plan列表
  1118. let manualList = task.plan_list[1];
  1119. // 获取自动测试plan列表
  1120. let autoList = task.plan_list[2];
  1121. autoList.forEach((at) => {
  1122. that.$store.dispatch("planList/fetchPlanDetail", {
  1123. planId: at < 100 ? at + 101 : at,
  1124. });
  1125. });
  1126. that.isShowPlanList = true;
  1127. that.isShowTaskList = false;
  1128. this.$store.commit("planList/setAutoPlanList", autoList);
  1129. this.$store.commit("planList/setPlanList", manualList);
  1130. that.taskName = task.name;
  1131. this.$nextTick(() => {
  1132. that.$store.dispatch("planList/clearPlanList");
  1133. that.$store.dispatch("planList/fetchPlanList", {
  1134. page_num: 1,
  1135. page_size: 10000,
  1136. });
  1137. });
  1138. console.log(task, "任务详情");
  1139. },
  1140. handleClickIssue(issueId) {
  1141. console.log(issueId, "issueid");
  1142. },
  1143. showBenchPos(benchList) {
  1144. console.log("benchList", benchList);
  1145. for (var item of benchList) {
  1146. var currentBench = this.benchList.find((b) => b.id == item.benchId);
  1147. if (currentBench) {
  1148. //console.log('currentBench',currentBench);
  1149. currentBench.left = item.x - 548;
  1150. currentBench.top = item.y - 137 - 150;
  1151. currentBench.benchId = item.benchId;
  1152. currentBench.benchType = item.benchType;
  1153. if (currentBench.benchType == 2) {
  1154. currentBench.image = require("../../assets/mechine2.png");
  1155. } else {
  1156. currentBench.image = require("../../assets/mechine.png");
  1157. }
  1158. }
  1159. }
  1160. this.renderBenchList = false;
  1161. setTimeout(() => {
  1162. this.renderBenchList = true;
  1163. }, 10);
  1164. },
  1165. planBack() {
  1166. that.isShowPlanList = false;
  1167. that.isShowTaskList = true;
  1168. },
  1169. taskRender(item) {
  1170. return `<div class="item-box" onClick="handleClickTask('${
  1171. item.uuid || item.id
  1172. }', '${item.auto}')">
  1173. <div class="left">
  1174. <div style="">
  1175. <div class="item-title">${item.name}</div>
  1176. <div class="item-description">${item.description}</div>
  1177. </div>
  1178. <div class="item-time">
  1179. <div class="time">${item.start_time}</div>
  1180. to
  1181. <div class="time"> ${item.end_time}</div>
  1182. </div>
  1183. <div class="item-tag">
  1184. <div class="tag">${item.processor_name}</div>
  1185. <div class="tag">${item.sw}</div>
  1186. </div>
  1187. </div>
  1188. <div class="taskBtn" onClick="handleClickTask('${
  1189. item.uuid || item.id
  1190. }', '${item.auto}')">To Do</div>
  1191. </div>`;
  1192. },
  1193. planRender(item) {
  1194. console.log(item, "plan");
  1195. return `<div onClick="selectRowPlan('${item.uuid || item.id}', '${
  1196. item.auto
  1197. }', '${item.name}')" class="item-box" style="display:${
  1198. !item.auto && !item.uuid ? "none" : "flex"
  1199. };align-items: top; justify-content: space-between;color: #fff;">
  1200. <div class="left">
  1201. <div style="display:flex;align-items: center;">
  1202. <div class="item-title">${item.name}</div>
  1203. <div class="task-auto" style="display:${
  1204. item.auto ? "block" : "none"
  1205. }">Auto</div>
  1206. </div>
  1207. </div>
  1208. <div class="taskBtn ${this.autoTaskStatusMap[item.id] || 'ready'}">${this.autoTaskStatusMap[item.id] || 'ready'}</div>
  1209. </div>`;
  1210. },
  1211. issueRender(item) {
  1212. return `<div class="item-box" style="display:flex; align-items: center;justify-content: space-between;" onClick="selectRowIssue('${
  1213. item.uuid || item.id
  1214. }')">
  1215. <div class="left">
  1216. <div style="display:flex;align-items: center;">
  1217. <div class="item-title" style="width: 20vw; white-space: nowrap; overflow:hidden; text-overflow: ellipsis;">${item.ticket_title}</div>
  1218. <div class="${"status" + item.ticket_status}"></div>
  1219. </div>
  1220. <div class="item-tag">
  1221. <div class="tag">${item.creator}</div>
  1222. <div class="tag">${item.create_time}</div>
  1223. </div>
  1224. </div>
  1225. <div class="${
  1226. item.checked ? "el-icon-circle-check" : "uncheck"
  1227. }"></div>
  1228. </div>`;
  1229. },
  1230. closeDetail() {
  1231. this.isDetailVisible = false;
  1232. },
  1233. rowClassName() {
  1234. return "row-class";
  1235. },
  1236. getImgList(objRBL) {
  1237. console.log("zmg3", objRBL);
  1238. let benchId = objRBL.pop();
  1239. if (benchId == null) {
  1240. console.log("zmg2");
  1241. setTimeout(() => {
  1242. let href = window.location.href;
  1243. if (href.indexOf("benchid=") != -1) {
  1244. let benchid = href.substring(href.indexOf("benchid=") + 8);
  1245. let remoteBenchList = this.remoteBenchList;
  1246. console.log("benchid", benchid);
  1247. console.log(
  1248. "item == benchId",
  1249. remoteBenchList.find((item) => item == benchid)
  1250. );
  1251. if (remoteBenchList.find((item) => item == benchid)) {
  1252. this.selectBench(parseInt(benchid));
  1253. }
  1254. }
  1255. }, 200);
  1256. return;
  1257. }
  1258. let self = this;
  1259. console.log("benchId", benchId);
  1260. ws.connectBench({ bench_id: String(benchId) })
  1261. .then((res) => {
  1262. ws.getImage(String(benchId), 1).then((res) => {
  1263. self.$store.dispatch("benchList/setBenchImgList", {
  1264. benchId,
  1265. img: res.data.data,
  1266. });
  1267. self.getImgList(objRBL);
  1268. });
  1269. })
  1270. .catch((err) => {
  1271. console.log("connect bench failed", benchId);
  1272. self.$message({
  1273. message: "This bench is offline",
  1274. // message: "",
  1275. type: "warning",
  1276. });
  1277. });
  1278. },
  1279. gotoGrid() {
  1280. this.$router.push({
  1281. path: "/squarePage",
  1282. });
  1283. },
  1284. itemRender(item) {
  1285. // console.log(item, 'bench---item')
  1286. item.image = require("../../assets/mechine.png");
  1287. /*return `
  1288. <div class="item-box">
  1289. <div class="item-image"><img src="${item.image}" alt="${item.title}"></div>
  1290. <div class="item-right">
  1291. <div class="item-title">
  1292. <span onClick="handleListClick(${item.id})">${item.id}</span>
  1293. <span onClick="selectBench(${item.id})" class="el-icon-s-platform ${item.status}"></span>
  1294. </div>
  1295. <div class="item-text">
  1296. <div class="item-description">Automation Lab-7E</div>
  1297. <div class="item-description">${item.name}</div>
  1298. <div class="item-tag">
  1299. <div class="tag">${item.Market}</div>
  1300. <div class="tag">${item.Platform}</div>
  1301. <div class="tag">${item.Project}</div>
  1302. <div class="tag">${item.Carline}</div>
  1303. <div class="tag">${item.Cluster}</div>
  1304. </div>
  1305. <div class="item-tag">
  1306. <div class="tag">${item.MU_SW}</div>
  1307. <div class="tag">${item.Variant}</div>
  1308. <div class="tag">${item.ip}</div>
  1309. </div>
  1310. </div>
  1311. </div>
  1312. </div>`;*/
  1313. return `
  1314. <div onDblClick="handleListDbClick(${item.id})" onClick="handleListClick(${item.id})" class="item-box">
  1315. <div class="item-image"><img src="${item.image}" alt="${item.title}"></div>
  1316. <div class="item-right">
  1317. <div class="item-text">
  1318. <div class="item-title">${item.name}
  1319. <span onClick="selectBench(${item.id})" class="el-icon-s-platform ${item.status}"></span>
  1320. </div>
  1321. <div class="item-description">Automation Lab-7E</div>
  1322. <div class="item-tag">
  1323. <div class="tag" title="Market">${item.Market}</div>
  1324. <div class="tag" title="Platform">${item.Platform}</div>
  1325. <div class="tag" title="Project">${item.Project}</div>
  1326. <div class="tag" title="Carline">${item.Carline}</div>
  1327. <div class="tag" title="Cluster">${item.Cluster}</div>
  1328. <div class="tag" title="MU_SW">${item.MU_SW}</div>
  1329. <div class="tag" title="Variant">${item.Variant}</div>
  1330. </div>
  1331. </div>
  1332. </div>
  1333. </div>`;
  1334. },
  1335. handleImageClick(index) {
  1336. this.selectBench(
  1337. parseInt(this.images[index + 5 * (this.currentPage - 1)].alt)
  1338. );
  1339. },
  1340. prevPage() {
  1341. if (this.currentPage > 1) {
  1342. this.currentPage--;
  1343. }
  1344. },
  1345. nextPage() {
  1346. if (this.currentPage < Math.ceil(this.images.length / this.pageSize)) {
  1347. this.currentPage++;
  1348. }
  1349. },
  1350. handleInfoDblClick(benchId) {
  1351. console.log("handleInfoDblClick", benchId);
  1352. this.currentBench = this.benchList.find((b) => b.id == benchId);
  1353. this.isDetailVisible = true;
  1354. },
  1355. getImage() {},
  1356. dataCallBack(data) {
  1357. switch (data.method) {
  1358. case "get_image":
  1359. this.handleGetImageData(data.data.data);
  1360. break;
  1361. }
  1362. console.log(data);
  1363. },
  1364. handleGetImageData(data) {
  1365. this.mainSnapshot = "data:image/jpeg;base64," + data;
  1366. },
  1367. selectBench(benchId) {
  1368. // 全屏选择bench
  1369. this.saveSelectedBenchToLs(benchId);
  1370. var i = JSON.parse(JSON.stringify(wsArrayLength));
  1371. let self = this;
  1372. wsArrayLength++;
  1373. setTimeout(() => {
  1374. console.log("connect bench", benchId);
  1375. wsArray[i]
  1376. ?.connectBench({ bench_id: String(benchId) })
  1377. .then((res) => {
  1378. console.log("connect bench success", benchId);
  1379. self.getBenchImage(benchId, 1, wsArray[i], () => {});
  1380. })
  1381. .catch((err) => {
  1382. console.log("connect bench failed", benchId);
  1383. this.$message({
  1384. message: "This bench is offline",
  1385. // message: "",
  1386. type: "warning",
  1387. });
  1388. });
  1389. }, 200);
  1390. // 非全屏选择bench
  1391. var objRBL = this.remoteBenchList;
  1392. if (objRBL && objRBL.length > 0) {
  1393. var bExist = false;
  1394. for (var i = 0; i < objRBL.length; i++) {
  1395. if (objRBL[i] == benchId) {
  1396. bExist = true;
  1397. } else {
  1398. }
  1399. }
  1400. if (bExist == false) {
  1401. objRBL.push(benchId);
  1402. this.remoteBenchList.push(benchId)
  1403. }
  1404. } else {
  1405. var rml = [];
  1406. rml.push(benchId);
  1407. this.remoteBenchList.push(benchId)
  1408. }
  1409. console.log("benchList", this.benchList);
  1410. let bench = this.benchList.find((b) => b.id == benchId);
  1411. console.log("selectedBench", bench);
  1412. if (this.previousSelectedBenchList.length) {
  1413. this.selectedBenchList = JSON.parse(
  1414. JSON.stringify(this.previousSelectedBenchList)
  1415. );
  1416. }
  1417. this.previousSelectedBenchList = [];
  1418. this.platform = null;
  1419. this.benchList.forEach((b) => (b.selected = false));
  1420. bench.selected = !bench.selected;
  1421. if (bench.selected) {
  1422. this.currentBench = bench;
  1423. bench.benchId = "'" + bench.benchId + "'";
  1424. this.selectedBenchList.push(bench);
  1425. console.log("selected", this.selectedBenchList);
  1426. // this.images = this.selectedBenchList.map((s) => {
  1427. // return {
  1428. // url: "",
  1429. // alt: s.name,
  1430. // };
  1431. // });
  1432. } else {
  1433. for (let i in this.selectedBenchList) {
  1434. if (this.selectedBenchList[i].id == bench.id) {
  1435. this.selectedBenchList.splice(i, 1);
  1436. // this.images = this.selectedBenchList.map((s) => {
  1437. // return {
  1438. // url: "",
  1439. // alt: s.name,
  1440. // };
  1441. // });
  1442. break;
  1443. }
  1444. }
  1445. }
  1446. if (this.selectedBenchList.length == 0) {
  1447. nextTick(() => {
  1448. self.initBmInfoNsChart();
  1449. });
  1450. } else {
  1451. self.bmMapItemActivate(bench.id, wsArray[i]);
  1452. }
  1453. },
  1454. bmMapItemActivate(benchId, ws) {
  1455. let self = this;
  1456. if (this.selectedBenchList.length == 0) {
  1457. this.$message({
  1458. message: "Please select a bench to activate.",
  1459. // message: "",
  1460. type: "warning",
  1461. });
  1462. return;
  1463. }
  1464. this.selectedBenchList = [this.selectedBenchList[0]];
  1465. console.log("selectedBenchList[0]", this.selectedBenchList);
  1466. let key = 0;
  1467. for (let i in this.benchList) {
  1468. this.benchList[i].selected = false;
  1469. }
  1470. for (let i in this.benchList) {
  1471. if (this.benchList[i].id == benchId) {
  1472. this.benchList[i].selected = true;
  1473. key = i;
  1474. break;
  1475. }
  1476. }
  1477. this.benchList[key].acitveAnimation = true;
  1478. //let benchId = this.benchList[key].benchId;
  1479. this.benchList[key].benchId = benchId;
  1480. let screenType = this.benchList[key].Display;
  1481. this.connetedBenchId = String(benchId);
  1482. // this.connectedBenchData = this.benchList[key];
  1483. setTimeout(() => {
  1484. console.log("connect bench", benchId);
  1485. ws.connectBench({ bench_id: String(benchId) })
  1486. .then((res) => {
  1487. self.isConnected = true;
  1488. console.log("connect bench success");
  1489. this.currentScreen = "upper";
  1490. self.setSendAudioBus(benchId);
  1491. self.getBenchImage(benchId, 1, ws, () => {
  1492. if (this.benchList[key].acitveAnimation) {
  1493. this.benchList[key].acitveAnimation = false;
  1494. this.benchDisplayVisible = true;
  1495. }
  1496. });
  1497. if (screenType == "DUO") {
  1498. self.getBenchImage(String(benchId), 2, ws, () => {
  1499. if (this.connetedBenchId) {
  1500. this.benchDisplayLowerVisible = true;
  1501. }
  1502. });
  1503. } else {
  1504. this.benchDisplayLowerVisible = false;
  1505. }
  1506. })
  1507. .catch((err) => {
  1508. console.log("connect bench failed");
  1509. this.benchList[key].acitveAnimation = false;
  1510. this.$message({
  1511. message: "This bench is offline",
  1512. // message: "",
  1513. type: "warning",
  1514. });
  1515. });
  1516. }, 300);
  1517. },
  1518. switchScreen() {
  1519. if (this.currentScreen == "upper") {
  1520. this.currentScreen = "lower";
  1521. } else {
  1522. this.currentScreen = "upper";
  1523. }
  1524. console.log("this.currentScreen", this.currentScreen);
  1525. },
  1526. singleFingerTouch(id, x, y, screenType) {
  1527. let self = this;
  1528. ws.singleFingerTouch(id, x, y, screenType).then((res) => {});
  1529. },
  1530. singleFingerDrag(id, x1, y1, x2, y2, screenType) {
  1531. let self = this;
  1532. ws.singleFingerDrag(id, x1, y1, x2, y2, screenType).then((res) => {});
  1533. },
  1534. singleFingerLongTouch(id, x, y, duration, screenType) {
  1535. let self = this;
  1536. ws.singleFingerLongTouch(id, x, y, duration, screenType).then(
  1537. (res) => {}
  1538. );
  1539. },
  1540. controlCursorMouseDown(e) {
  1541. let self = this;
  1542. if (this.displayTapMode) {
  1543. // console.log("e", e);
  1544. this.controlCursorPosition.left = e.offsetX;
  1545. this.controlCursorPosition.top = e.offsetY;
  1546. this.controlStartPoint.x = e.offsetX;
  1547. this.controlStartPoint.y = e.offsetY;
  1548. this.controlStartPoint.time = Date.now();
  1549. this.ifBmBenchTrailUpperCursor = true;
  1550. }
  1551. },
  1552. controlCursorMouseMove(e) {
  1553. let self = this;
  1554. if (this.displayTapMode && this.ifBmBenchTrailUpperCursor) {
  1555. this.controlCursorPosition.left = e.offsetX;
  1556. this.controlCursorPosition.top = e.offsetY;
  1557. }
  1558. },
  1559. controlCursorMouseOut(e) {
  1560. this.ifBmBenchTrailUpperCursor = false;
  1561. },
  1562. controlCursorMouseUp(e, screenType = 1) {
  1563. let self = this;
  1564. if (this.currentScreen == "upper") {
  1565. screenType = 1;
  1566. } else if (this.currentScreen == "lower") {
  1567. screenType = 2;
  1568. }
  1569. if (this.displayTapMode) {
  1570. this.ifBmBenchTrailUpperCursor = false;
  1571. if (
  1572. Math.abs(this.controlStartPoint.x - e.offsetX) < 30 &&
  1573. Math.abs(this.controlStartPoint.y - e.offsetY) < 30 &&
  1574. Date.now() - this.controlStartPoint.time < 500
  1575. ) {
  1576. self.singleFingerOperation(e, "tap", screenType);
  1577. } else if (
  1578. Math.abs(this.controlStartPoint.x - e.offsetX) > 30 ||
  1579. Math.abs(this.controlStartPoint.y - e.offsetY) > 30
  1580. ) {
  1581. // console.log("controlStartPoint", controlStartPoint);
  1582. self.singleFingerOperation(
  1583. e,
  1584. "swipe",
  1585. screenType,
  1586. this.controlStartPoint
  1587. );
  1588. } else if (Date.now() - this.controlStartPoint.time > 500) {
  1589. self.singleFingerOperation(
  1590. e,
  1591. "longPress",
  1592. screenType,
  1593. this.controlStartPoint
  1594. );
  1595. }
  1596. }
  1597. },
  1598. singleFingerOperation(e, operation, screenType, startPoint = {}) {
  1599. let self = this;
  1600. console.log("singleFingerOperation", e, operation, screenType);
  1601. if (this.displayTapMode) {
  1602. let width = this.$refs.bmBenchRef.width;
  1603. let height = this.$refs.bmBenchRef.height;
  1604. let offsetX = e.offsetX;
  1605. let offsetY = e.offsetY;
  1606. let screenWidth = this.currentScreen == "upper" ? 1540 : 1280;
  1607. let screenHeight = this.currentScreen == "upper" ? 720 : 720;
  1608. let x = Math.round(screenWidth * (offsetX / width));
  1609. let y = Math.round(screenHeight * (offsetY / height));
  1610. let x1 = 0;
  1611. let y1 = 0;
  1612. if (startPoint != {}) {
  1613. x1 = Math.round(screenWidth * (startPoint.x / width));
  1614. y1 = Math.round(screenHeight * (startPoint.y / height));
  1615. }
  1616. // console.log("x", x);
  1617. // console.log("y", y);
  1618. // console.log("x1", x1);
  1619. // console.log("y1", y1);
  1620. let operationDesc = "";
  1621. if (operation == "tap") {
  1622. console.log("selected", this.connetedBenchId, x, y);
  1623. self.singleFingerTouch(this.connetedBenchId, x, y, screenType);
  1624. // tap on lower x: 48 y: 292
  1625. operationDesc =
  1626. "tap on " +
  1627. (screenType == 1 ? "upper " : "lower ") +
  1628. ("x: " + x + " y: " + y);
  1629. } else if (operation == "swipe") {
  1630. self.singleFingerDrag(this.connetedBenchId, x1, y1, x, y, screenType);
  1631. operationDesc =
  1632. "swipe on " +
  1633. (screenType == 1 ? "upper " : "lower ") +
  1634. ("x1: " + x1 + " y1: " + y1 + " x: " + x + " y: " + y);
  1635. } else if (operation == "longPress") {
  1636. self.singleFingerLongTouch(
  1637. this.connetedBenchId,
  1638. x,
  1639. y,
  1640. Date.now() - startPoint.time,
  1641. screenType
  1642. );
  1643. operationDesc =
  1644. "longPress on " +
  1645. (screenType == 1 ? "upper " : "lower ") +
  1646. ("x: " + x + " y: " + y);
  1647. }
  1648. this.benchLog.push({
  1649. bench_id: this.connetedBenchId,
  1650. data: operationDesc,
  1651. levelStr: "DEBUG",
  1652. startTime: self.getNowDate(),
  1653. });
  1654. }
  1655. },
  1656. getNowDate() {
  1657. var myDate = new Date();
  1658. var year = myDate.getFullYear(); //获取当前年
  1659. var mon = myDate.getMonth() + 1; //获取当前月
  1660. var date = myDate.getDate(); //获取当前日
  1661. var hours = myDate.getHours(); //获取当前小时
  1662. var minutes = myDate.getMinutes(); //获取当前分钟
  1663. var seconds = myDate.getSeconds(); //获取当前秒
  1664. var now =
  1665. year +
  1666. "-" +
  1667. mon +
  1668. "-" +
  1669. date +
  1670. "T" +
  1671. hours +
  1672. ":" +
  1673. minutes +
  1674. ":" +
  1675. seconds;
  1676. return now;
  1677. },
  1678. initBmInfoNsChart() {
  1679. let self = this;
  1680. let seriesData = [0, 0, 0];
  1681. for (let i in this.benchList) {
  1682. if (this.benchList[i].status == 5 || this.benchList[i].status == 6) {
  1683. seriesData[1]++;
  1684. } else if (
  1685. this.benchList[i].status == 2 ||
  1686. this.benchList[i].status == 3
  1687. ) {
  1688. seriesData[2]++;
  1689. } else {
  1690. seriesData[0]++;
  1691. }
  1692. }
  1693. console.log("seriesData", seriesData);
  1694. var option = {
  1695. tooltip: {
  1696. trigger: "axis",
  1697. axisPointer: {
  1698. type: "shadow",
  1699. },
  1700. },
  1701. grid: {
  1702. left: 0,
  1703. right: "20",
  1704. bottom: 0,
  1705. top: 0,
  1706. containLabel: true,
  1707. },
  1708. xAxis: {
  1709. type: "value",
  1710. axisLabel: {
  1711. show: false,
  1712. },
  1713. splitLine: {
  1714. show: false,
  1715. },
  1716. // axisLine: {
  1717. // show: false,
  1718. // },
  1719. // axisTick: {
  1720. // show: false, //刻度线
  1721. // },
  1722. },
  1723. yAxis: {
  1724. type: "category",
  1725. data: ["Offline", "Occupied", "Ready"],
  1726. axisLine: {
  1727. show: false,
  1728. lineStyle: {
  1729. color: "#7F7F7F",
  1730. },
  1731. },
  1732. axisTick: {
  1733. show: false, //刻度线
  1734. },
  1735. // axisLine: {
  1736. // },
  1737. },
  1738. series: [
  1739. {
  1740. type: "bar",
  1741. barWidth: "50%",
  1742. data: seriesData,
  1743. itemStyle: {
  1744. color: function (params) {
  1745. // 给出颜色组
  1746. var colorList = ["#b1b3b8", "#79bbff", "#95d475"];
  1747. return colorList[params.dataIndex];
  1748. },
  1749. },
  1750. showBackground: false,
  1751. backgroundStyle: {
  1752. color: "rgba(180, 180, 180, 0.2)",
  1753. },
  1754. label: {
  1755. show: true,
  1756. position: "right",
  1757. color: "#7F7F7F",
  1758. },
  1759. },
  1760. ],
  1761. };
  1762. bmInfoNsChartStorage = echarts.init(
  1763. document.getElementsByClassName("bmInfoNsChart")[0]
  1764. );
  1765. bmInfoNsChartStorage.setOption(option);
  1766. },
  1767. backToMap() {
  1768. let self = this;
  1769. ws.unsubscribeBenchStatus({ bench_id: this.connetedBenchId }).then(
  1770. (res) => {
  1771. console.log("unsubscribeBenchStatus", res);
  1772. }
  1773. );
  1774. this.connetedBenchId = "";
  1775. setTimeout(() => {
  1776. this.benchDisplayVisible = false;
  1777. this.ifShowLogBox = false;
  1778. }, 600);
  1779. },
  1780. tagSearch(field, value) {
  1781. let self = this;
  1782. this.selectedBenchList = [];
  1783. for (let i in this.benchList) {
  1784. this.benchList[i].selected = false;
  1785. if (this.benchList[i][field] == value) {
  1786. this.benchList[i].selected = true;
  1787. this.benchList[i].benchId = "'" + this.benchList[i].benchId + "'";
  1788. this.selectedBenchList.push(this.benchList[i]);
  1789. // this.images = this.selectedBenchList.map((s) => {
  1790. // return {
  1791. // url: "",
  1792. // alt: s.name,
  1793. // };
  1794. // });
  1795. }
  1796. }
  1797. },
  1798. selectAllBench() {
  1799. let self = this;
  1800. console.log('this.benchList===', this.benchList.length)
  1801. if (this.selectedBenchList.length == this.benchList.length) {
  1802. this.selectedBenchList = [];
  1803. this.previousSelectedBenchList = [];
  1804. for (let i in this.benchList) {
  1805. this.benchList[i].selected = false;
  1806. }
  1807. self.nextTick(() => {
  1808. self.initBmInfoNsChart();
  1809. });
  1810. } else {
  1811. this.selectedBenchList = [];
  1812. for (let i in this.benchList) {
  1813. this.benchList[i].selected = true;
  1814. this.selectedBenchList.push(this.benchList[i]);
  1815. // this.images = this.selectedBenchList.map((s) => {
  1816. // return {
  1817. // url: "",
  1818. // alt: s.name,
  1819. // };
  1820. // });
  1821. }
  1822. }
  1823. },
  1824. tapModeControl() {
  1825. this.displayTapMode = !this.displayTapMode;
  1826. },
  1827. getBenchDetail(id, index) {
  1828. let self = this;
  1829. let getBenchParam = { id };
  1830. srv
  1831. .getBenchDetail(getBenchParam)
  1832. .then((res) => {
  1833. // console.log("res", res);
  1834. this.benchList[index].status = res.data.data.status;
  1835. })
  1836. .catch((err) => {
  1837. console.error(err);
  1838. });
  1839. },
  1840. showLogBox() {
  1841. let self = this;
  1842. if (this.ifShowLogBox) {
  1843. ws.unsubscribeBenchStatus({ bench_id: this.connetedBenchId }).then(
  1844. (res) => {
  1845. console.log("unsubscribeBenchStatus", res);
  1846. }
  1847. );
  1848. } else {
  1849. ws.subscribeBenchStatus({ bench_id: this.connetedBenchId }).then(
  1850. (res) => {
  1851. console.log("subscribeBenchStatus", res);
  1852. }
  1853. );
  1854. }
  1855. this.benchLog = [];
  1856. this.ifShowLogBox = !this.ifShowLogBox;
  1857. },
  1858. connectAudioDevice(type) {
  1859. let self = this;
  1860. ws.connect_audio_device({
  1861. benchId: String(this.connetedBenchId),
  1862. }).then(
  1863. (res) => {
  1864. console.log("connect_audio_device_res", res);
  1865. if (type == "playAudio") {
  1866. this.isRecording = !this.isRecording;
  1867. self.recordAudio();
  1868. } else if (type == "collectAudio") {
  1869. self.collectAudio();
  1870. }
  1871. },
  1872. (rej) => {}
  1873. );
  1874. },
  1875. recordAudio(data) {
  1876. let self = this;
  1877. // console.log("selectedBenchList.value[0]", this.selectedBenchList[0]);
  1878. let channel = 1;
  1879. this.vadThreshold = 0;
  1880. if (this.isRecording) {
  1881. this.playAudioBenchList.push(this.connetedBenchId);
  1882. // this.changePlayAudioBenchList(params);
  1883. navigator.getUserMedia =
  1884. navigator.getUserMedia ||
  1885. navigator.webkitGetUserMedia ||
  1886. navigator.mozGetUserMedia ||
  1887. navigator.msGetUserMedia;
  1888. if (navigator.mediaDevices.getUserMedia) {
  1889. // 支持getUserMedia
  1890. navigator.mediaDevices
  1891. .getUserMedia({
  1892. video: false,
  1893. audio: true,
  1894. })
  1895. .then((stream) => {
  1896. this.recStream = stream;
  1897. this.paAc = new AudioContext({
  1898. sampleRate: 8000,
  1899. });
  1900. this.paSource = this.paAc.createMediaStreamSource(stream);
  1901. //构造参数依次为缓冲区大小,输入通道数,输出通道数
  1902. this.paScriptNode = this.paAc.createScriptProcessor(
  1903. 1024,
  1904. channel,
  1905. 2
  1906. );
  1907. this.sempleRateMultiple = this.paAc.sampleRate / 8000;
  1908. this.paScriptNode.onaudioprocess = function (e) {
  1909. for (let i = 0; i < channel; i++) {
  1910. let data = e.inputBuffer.getChannelData(i);
  1911. self.recordSuperposeArr.push.apply(
  1912. self.recordSuperposeArr,
  1913. data
  1914. );
  1915. if (
  1916. self.sempleRateHandlingThreshold <
  1917. self.sempleRateMultiple - 1
  1918. ) {
  1919. self.sempleRateHandlingThreshold++;
  1920. } else {
  1921. let arr = [];
  1922. for (
  1923. let a = 0;
  1924. a < self.recordSuperposeArr.length;
  1925. a = a + self.sempleRateMultiple
  1926. ) {
  1927. arr.push(self.recordSuperposeArr[a]);
  1928. }
  1929. self.recordSuperposeArr = arr.splice(0, 1024);
  1930. self.recordSuperposeArr = new Float32Array(
  1931. self.recordSuperposeArr
  1932. );
  1933. if (Math.abs(self.recordSuperposeArr[0]) < 0.003) {
  1934. self.vadThreshold++;
  1935. } else {
  1936. self.vadThreshold = 0;
  1937. }
  1938. if (self.vadThreshold <= 20) {
  1939. let dataU8 = new Uint8Array(
  1940. self.recordSuperposeArr.buffer
  1941. );
  1942. let string = "";
  1943. for (let i = 0; i < dataU8.length; i++) {
  1944. string = string + String.fromCharCode(dataU8[i]);
  1945. }
  1946. ws.play_audio({
  1947. data: string,
  1948. benchIds: self.playAudioBenchList,
  1949. }).then(
  1950. (res) => {},
  1951. (rej) => {}
  1952. );
  1953. }
  1954. self.sempleRateHandlingThreshold = 0;
  1955. self.recordSuperposeArr = [];
  1956. }
  1957. }
  1958. };
  1959. this.paScriptNode.connect(this.paAc.destination);
  1960. this.paSource.connect(this.paScriptNode);
  1961. })
  1962. .catch((err) => {
  1963. console.log("err: " + err);
  1964. });
  1965. } else {
  1966. // 不支持getUserMedia
  1967. console.log("Environment not supported");
  1968. }
  1969. } else {
  1970. // this.changePlayAudioBenchList(params);
  1971. this.playAudioBenchList = [];
  1972. self.stopRecord();
  1973. this.ifConnectedAudioDevice = false;
  1974. ws.stop_play_audio({
  1975. benchId: this.connetedBenchId,
  1976. }).then(
  1977. (res) => {
  1978. // console.log("res", res);
  1979. },
  1980. (rej) => {
  1981. // console.log("rej", rej);
  1982. }
  1983. );
  1984. // $bus.$emit("stopPlayAudio", {
  1985. // benchId: params.benchId,
  1986. // });
  1987. // }
  1988. }
  1989. },
  1990. stopRecord() {
  1991. let self = this;
  1992. if (!this.isRecording) {
  1993. this.recStream.getTracks().forEach(function (track) {
  1994. track.stop();
  1995. });
  1996. this.paScriptNode.disconnect(this.paAc.destination);
  1997. this.paSource.disconnect(this.paScriptNode);
  1998. this.paAc.close();
  1999. }
  2000. },
  2001. collectAudio() {
  2002. let self = this;
  2003. this.isPlaying = !this.isPlaying;
  2004. if (this.isPlaying) {
  2005. ws.collect_audio({
  2006. benchId: String(this.connetedBenchId),
  2007. }).then(
  2008. (res) => {},
  2009. (rej) => {}
  2010. );
  2011. } else {
  2012. ws.stop_collect_audio({
  2013. benchId: String(this.connetedBenchId),
  2014. }).then(
  2015. (res) => {},
  2016. (rej) => {}
  2017. );
  2018. this.loopSendAudioTime = 0;
  2019. this.sendAudioString = "";
  2020. }
  2021. },
  2022. setSendAudioBus(benchId) {
  2023. let self = this;
  2024. bus.on("sendAudio" + benchId, (data) => {
  2025. self.sendAudioTransformCode(data.data, true);
  2026. this.loopSendAudioTime++;
  2027. this.sendAudioTimer = setTimeout(() => {
  2028. this.loopSendAudioTime = 5;
  2029. self.sendAudioTransformCode("", false);
  2030. }, 500);
  2031. });
  2032. },
  2033. sendAudioTransformCode(data, fill) {
  2034. let dataU8 = [];
  2035. let dataF32 = [];
  2036. let arr = [];
  2037. let self = this;
  2038. this.sendAudioString += data;
  2039. if (this.loopSendAudioTime > 4) {
  2040. arr = this.sendAudioString.split("");
  2041. for (let i = 0; i < arr.length; i++) {
  2042. dataU8[i] = arr[i].charCodeAt();
  2043. }
  2044. dataU8 = new Uint8Array(dataU8);
  2045. dataF32 = new Float32Array(dataU8.buffer);
  2046. if (!fill) {
  2047. // console.log("dataF32-", dataF32);
  2048. let newDataF32 = new Float32Array(5120);
  2049. for (let i = 0; i < 5120; i++) {
  2050. if (i < dataF32.length) {
  2051. newDataF32[i] = dataF32[i];
  2052. } else {
  2053. newDataF32[i] = 0;
  2054. }
  2055. }
  2056. dataF32 = newDataF32;
  2057. // console.log("dataF32+", dataF32);
  2058. }
  2059. self.pcPlayAudio(dataF32, 1, 8000);
  2060. this.sendAudioString = "";
  2061. this.loopSendAudioTime = 0;
  2062. }
  2063. if (fill) {
  2064. clearTimeout(this.sendAudioTimer);
  2065. }
  2066. },
  2067. pcPlayAudio(data, channels, sampleRate) {
  2068. let self = this;
  2069. var audioCtx = new (window.AudioContext || window.webkitAudioContext)({
  2070. sampleRate: sampleRate,
  2071. });
  2072. var myArrayBuffer = audioCtx.createBuffer(
  2073. channels,
  2074. data.length,
  2075. sampleRate
  2076. );
  2077. for (let channel = 0; channel < channels; channel++) {
  2078. var nowBuffering = myArrayBuffer.getChannelData(channel);
  2079. for (let i = 0; i < data.length; i++) {
  2080. if (i < data.length) {
  2081. nowBuffering[i] = data[i];
  2082. } else {
  2083. nowBuffering[i] = 0;
  2084. }
  2085. }
  2086. }
  2087. // console.log("audioCtx", audioCtx);
  2088. // console.log("nowBuffering", nowBuffering);
  2089. var source = audioCtx.createBufferSource();
  2090. source.buffer = myArrayBuffer;
  2091. source.connect(audioCtx.destination);
  2092. source.start();
  2093. },
  2094. pressPtt() {
  2095. let self = this;
  2096. ws.press_ptt({
  2097. benchId: String(this.connetedBenchId),
  2098. }).then(
  2099. (res) => {},
  2100. (rej) => {}
  2101. );
  2102. },
  2103. bmMapItemSelect(key) {
  2104. let self = this;
  2105. if (this.previousSelectedBenchList.length) {
  2106. this.selectedBenchList = JSON.parse(
  2107. JSON.stringify(this.previousSelectedBenchList)
  2108. );
  2109. }
  2110. this.previousSelectedBenchList = [];
  2111. this.platform = null;
  2112. this.benchList.forEach((b) => (b.selected = false));
  2113. this.benchList[key].selected = !this.benchList[key].selected;
  2114. if (this.benchList[key].selected) {
  2115. this.currentBench = this.benchList[key];
  2116. this.selectedBenchList.push(this.benchList[key]);
  2117. // this.images = this.selectedBenchList.map((s) => {
  2118. // return {
  2119. // url: "",
  2120. // alt: s.name,
  2121. // };
  2122. // });
  2123. } else {
  2124. for (let i in this.selectedBenchList) {
  2125. if (this.selectedBenchList[i].id == this.benchList[key].id) {
  2126. this.selectedBenchList.splice(i, 1);
  2127. // this.images = this.selectedBenchList.map((s) => {
  2128. // return {
  2129. // url: "",
  2130. // alt: s.name,
  2131. // };
  2132. // });
  2133. break;
  2134. }
  2135. }
  2136. }
  2137. if (this.selectedBenchList.length == 0) {
  2138. nextTick(() => {
  2139. self.initBmInfoNsChart();
  2140. });
  2141. }
  2142. },
  2143. clickBenchList() {
  2144. // window.location.href = "/squarePage?m=8b934420_ZJUb_b6f9";
  2145. this.$store.dispatch("common/setSquareStatus", true);
  2146. },
  2147. disconnectBench() {
  2148. ws.disconnectBench({ bench_id: String(this.connetedBenchId) }).then(
  2149. (res) => {
  2150. var remoteBenchList = this.remoteBenchList;
  2151. let newRemoteBenchList = remoteBenchList.filter((item) => {
  2152. return item != this.connetedBenchId;
  2153. });
  2154. while(this.remoteBenchList.length) {
  2155. this.remoteBenchList.pop();
  2156. }
  2157. newRemoteBenchList.forEach(e => this.remoteBenchList.push(e))
  2158. this.$store.dispatch("benchList/removeBenchImgList", {
  2159. benchId: this.connetedBenchId,
  2160. });
  2161. this.getImgList(newRemoteBenchList);
  2162. this.connetedBenchId = "";
  2163. this.currentBench = {};
  2164. this.benchDisplayVisible = false;
  2165. this.benchDisplayLowerVisible = false;
  2166. this.isConnected = false;
  2167. }
  2168. );
  2169. },
  2170. sleep(delay) {
  2171. var start = new Date().getTime();
  2172. while (new Date().getTime() - start < delay) {
  2173. continue;
  2174. }
  2175. },
  2176. saveSelectedBenchToLs(benchId) {
  2177. var objRBL = this.remoteBenchList;
  2178. if (objRBL && objRBL.length > 0) {
  2179. var bExist = false;
  2180. for (var i = 0; i < objRBL.length; i++) {
  2181. if (objRBL[i] == benchId) {
  2182. bExist = true;
  2183. } else {
  2184. }
  2185. }
  2186. if (bExist == false) {
  2187. objRBL.push(benchId);
  2188. this.remoteBenchList.push(benchId)
  2189. }
  2190. } else {
  2191. var rml = [];
  2192. rml.push(benchId);
  2193. this.remoteBenchList.push(benchId);
  2194. }
  2195. },
  2196. handleListClick(benchId, itemtype) {
  2197. if (itemtype == 2) {
  2198. return;
  2199. }
  2200. try{
  2201. for(let key in window.waterMap) {
  2202. if (key == benchId) {
  2203. window.waterMap[key].scale.set(1.3, 1.3, 1.3);
  2204. } else {
  2205. window.waterMap[key].scale.set(1, 1, 1);
  2206. }
  2207. }
  2208. } catch (e) {
  2209. }
  2210. console.log("benchId", benchId);
  2211. let selectedBench = this.benchList.find((i) => i.benchId == benchId);
  2212. console.log("selectedBench", selectedBench);
  2213. bus.emit("benchInfoVisible", selectedBench);
  2214. this.$nextTick(() => {
  2215. if (benchId == this.currentBench.benchId) {
  2216. benchId = 0;
  2217. let items = document.getElementsByClassName("grid-item-background");
  2218. for (var index = 0; index < items.length; index++) {
  2219. items[index].style.background = "#000000";
  2220. }
  2221. this.currentBench = {};
  2222. return;
  2223. }
  2224. let items = document.getElementsByClassName("grid-item-background");
  2225. for (var index = 0; index < items.length; index++) {
  2226. items[index].style.background = "#000000";
  2227. if (this.images[index].alt == benchId) {
  2228. console.log("equal");
  2229. items[index].style.background = "#ffffff";
  2230. }
  2231. }
  2232. });
  2233. //this.currentBench = this.benchList.find(b => b.id == benchId);
  2234. //this.isDetailVisible = true;
  2235. this.$nextTick(() => {
  2236. //this.$refs.benchdetail.init(benchId);
  2237. //this.benchList.forEach(element =>
  2238. //{
  2239. // element.style = "{background: rgba(0, 0, 0, 1)}"
  2240. //});
  2241. if (benchId == this.currentBench.id &&this.currentBench.selected) {
  2242. this.currentBench.selected = false;
  2243. this.currentBench.scale = 1;
  2244. this.currentBench = {};
  2245. let items = document.getElementsByClassName("item-box");
  2246. for (var index = 0; index < items.length; index++) {
  2247. items[index].style.background = "#00000032";
  2248. }
  2249. return;
  2250. }
  2251. let items = document.getElementsByClassName("item-box");
  2252. for (var index = 0; index < items.length; index++) {
  2253. items[index].style.background = "#00000032";
  2254. let title = items[index].getElementsByClassName("item-title");
  2255. // console.log("textContent", title[0].textContent);
  2256. let itemOther = this.benchList.find(
  2257. (b) => parseInt(b.id) == parseInt(title[0].textContent)
  2258. );
  2259. if (itemOther) {
  2260. itemOther.selected = false;
  2261. }
  2262. if (parseInt(benchId) == parseInt(title[0].textContent)) {
  2263. items[index].style.background = "#000000C0";
  2264. this.currentBench = this.benchList.find((b) => b.id == benchId);
  2265. this.currentBench.selected = true;
  2266. }
  2267. }
  2268. bus.emit("benchInfoVisible", this.currentBench);
  2269. });
  2270. },
  2271. handleBenchClick(benchId, showRemoteButton) {
  2272. this.currentBench = this.benchList.find((b) => b.id == benchId);
  2273. this.isRemoteBtnVisible = showRemoteButton;
  2274. this.isDetailVisible = true;
  2275. },
  2276. handleListDbClick(benchId, itemtype) {
  2277. //this.currentBench = this.benchList.find(b => b.id == benchId);
  2278. //this.isDetailVisible = true;
  2279. this.$nextTick(() => {
  2280. //this.$refs.benchdetail.init(benchId);
  2281. //this.benchList.forEach(element =>
  2282. //{
  2283. // element.style = "{background: rgba(0, 0, 0, 1)}"
  2284. //});
  2285. this.currentBench = this.benchList.find((b) => b.id == benchId);
  2286. //this.currentBench.style = "{background: rgba(0, 0, 0, 1)}"
  2287. console.log("current bench", this.currentBench);
  2288. this.isRemoteBtnVisible = true;
  2289. this.isDetailVisible = true;
  2290. });
  2291. },
  2292. getBenchImage(benchId, screenType, wsRemote, func) {
  2293. let self = this;
  2294. setTimeout(() => {
  2295. wsRemote.getImage(String(benchId), screenType).then((res) => {
  2296. console.log("getImageRes", res);
  2297. // let screen = screenType == 1 ? "upper" : "lower";
  2298. func();
  2299. if (screenType == 1) {
  2300. self.benchImgUpper = "data:image/png;base64," + res.data.data;
  2301. self.benchImgUpperMap[benchId] =
  2302. "data:image/png;base64," + res.data.data;
  2303. bus.emit("benchImgChange", { benchImgUpper: self.benchImgUpper });
  2304. } else {
  2305. self.benchImgLower = "data:image/png;base64," + res.data.data;
  2306. self.benchImgLowerMap[benchId] =
  2307. "data:image/png;base64," + res.data.data;
  2308. bus.emit("benchImgChange", { benchImgLower: self.benchImgLower });
  2309. }
  2310. // let screen = res.data.screen_type;
  2311. //self.getBenchImage(benchId, screenType, wsRemote, func);
  2312. if (benchId == this.connetedBenchId) {
  2313. self.getBenchImage(benchId, screenType, wsRemote, func);
  2314. this.$store.dispatch("benchList/setBenchImgList", {
  2315. benchId,
  2316. img: res.data.data,
  2317. });
  2318. }
  2319. });
  2320. }, 500);
  2321. },
  2322. handleDblClickImg(benchId) {
  2323. this.benchImgUpper = this.benchImgUpperMap[benchId];
  2324. this.benchImgLower = this.benchImgLowerMap[benchId];
  2325. this.$store.dispatch("common/setSquareStatus", false);
  2326. this.selectBench(benchId);
  2327. },
  2328. handleClickImg(benchId, indexParam) {
  2329. this.$nextTick(() => {
  2330. if (benchId == this.currentBenchId) {
  2331. benchId = 0;
  2332. let items = document.getElementsByClassName("grid-item-background");
  2333. for (var index = 0; index < items.length; index++) {
  2334. items[index].style.background = "#000000";
  2335. }
  2336. return;
  2337. }
  2338. this.currentBenchId = benchId;
  2339. let items = document.getElementsByClassName("grid-item-background");
  2340. for (var index = 0; index < items.length; index++) {
  2341. items[index].style.background = "#000000";
  2342. if (index == indexParam) {
  2343. console.log("equal");
  2344. items[index].style.background = "#ffffff";
  2345. }
  2346. }
  2347. });
  2348. this.$nextTick(() => {
  2349. if (
  2350. benchId == this.currentBench.id &&
  2351. this.currentBench.selected == true
  2352. ) {
  2353. this.currentBench.selected = false;
  2354. this.currentBench.scale = 1;
  2355. this.currentBench = {};
  2356. let items = document.getElementsByClassName("item-box");
  2357. for (var index = 0; index < items.length; index++) {
  2358. items[index].style.background = "#00000032";
  2359. }
  2360. return;
  2361. }
  2362. let items = document.getElementsByClassName("item-box");
  2363. for (var index = 0; index < items.length; index++) {
  2364. items[index].style.background = "#00000032";
  2365. let title = items[index].getElementsByClassName("item-title");
  2366. console.log("textContent", title[0].textContent);
  2367. let itemOther = this.benchList.find(
  2368. (b) => parseInt(b.id) == parseInt(title[0].textContent)
  2369. );
  2370. itemOther.selected = false;
  2371. if (parseInt(benchId) == parseInt(title[0].textContent)) {
  2372. items[index].style.background = "#000000C0";
  2373. this.currentBench = this.benchList.find((b) => b.id == benchId);
  2374. this.currentBench.selected = true;
  2375. }
  2376. }
  2377. });
  2378. },
  2379. handleCloseImg(benchId) {
  2380. if(parseInt(benchId) == parseInt(this.connetedBenchId))
  2381. {
  2382. this.disconnectBench()
  2383. }
  2384. console.log("benchId", benchId);
  2385. var strRemoteBenchList = window.localStorage.getItem("remoteBenchList");
  2386. var objRBL = JSON.parse(strRemoteBenchList);
  2387. if (objRBL) {
  2388. for (var i = 0; i < objRBL.length; i++) {
  2389. if (parseInt(objRBL[i]) == parseInt(benchId)) {
  2390. console.log("images", this.images);
  2391. for (var ii = 0; ii < this.images.length; ii++) {
  2392. if (parseInt(this.images[ii].alt) == parseInt(benchId)) {
  2393. this.images.splice(ii, 1);
  2394. console.log("images", this.images);
  2395. break;
  2396. }
  2397. }
  2398. //delete objRBL[i];
  2399. objRBL.splice(i, 1);
  2400. console.log("objRBL", objRBL);
  2401. while(this.remoteBenchList.length) {
  2402. this.remoteBenchList.pop()
  2403. }
  2404. objRBL.forEach(e => this.remoteBenchList.push(e))
  2405. return;
  2406. }
  2407. }
  2408. }
  2409. },
  2410. getAutoPlanResult(key) {},
  2411. },
  2412. watch: {
  2413. benchDisplayVisible(newValue, oldValue) {
  2414. bus.emit("benchDisplayVisible", {
  2415. benchDisplayVisible: newValue,
  2416. benchInfo: this.selectedBenchList[0],
  2417. });
  2418. },
  2419. benchDisplayLowerVisible(newValue, oldValue) {
  2420. bus.emit("benchDisplayLowerVisibleChange", {
  2421. benchDisplayLowerVisible: newValue,
  2422. });
  2423. },
  2424. benchList(newValue, oldValue) {
  2425. console.log("newValue", newValue);
  2426. var objRBL = this.remoteBenchList;
  2427. console.log("zmg1", objRBL);
  2428. var objRBLReverse = [];
  2429. if(objRBL)
  2430. {
  2431. for (; objRBL.length > 0; ) {
  2432. objRBLReverse.push(objRBL.pop());
  2433. }
  2434. }
  2435. if (objRBLReverse.length > 0) {
  2436. setTimeout(() => {
  2437. this.getImgList(objRBLReverse);
  2438. }, 300);
  2439. }
  2440. },
  2441. isOpen3d(newValue, oldValue) {
  2442. // if (!newValue) {
  2443. // this.$nextTick(() => {
  2444. // let mapDom = document.getElementsByClassName("ordinary-map")[0];
  2445. // let style = getComputedStyle(mapDom);
  2446. // let width = parseFloat(style.width);
  2447. // let height = parseFloat(style.height);
  2448. // uwbMain('playersmall', width, height, "floorplan");
  2449. // })
  2450. // } else {
  2451. // uwbMain('player', window.innerWidth, window.innerHeight, "panorama");
  2452. // }
  2453. },
  2454. benchList(newValue, oldValue) {
  2455. var readyCount = 0;
  2456. var occupiedCount = 0;
  2457. var offlineCount = 0;
  2458. console.log("this.benchList", this.benchList.length);
  2459. this.benchList.forEach((element) => {
  2460. //console.log('element',element);
  2461. if (element.status == "ready") {
  2462. readyCount++;
  2463. } else if (element.status == "error") {
  2464. offlineCount++;
  2465. } else if (element.status == "offline") {
  2466. offlineCount++;
  2467. } else {
  2468. occupiedCount++;
  2469. }
  2470. });
  2471. this.readyCount = readyCount;
  2472. this.offlineCount = offlineCount;
  2473. this.occupiedCount = occupiedCount;
  2474. },
  2475. autoPlanList() {
  2476. this.autoPlanList.forEach(m => {
  2477. this.$store.dispatch('caseList/getAllAutoPlanStatus', {
  2478. planId: m.id,
  2479. planName: m.name
  2480. })
  2481. })
  2482. }
  2483. },
  2484. };
  2485. </script>
  2486. <style scoped>
  2487. /* .benchMapBox {
  2488. margin-top: 30px;
  2489. } */
  2490. .benchMapBox :deep() .el-scrollbar__bar {
  2491. display: none;
  2492. }
  2493. .bmContent {
  2494. background-image: linear-gradient(60deg, #16182a 30%, #2d3049);
  2495. border-radius: 10px;
  2496. /* height: 1800px; */
  2497. margin-top: 30px;
  2498. margin-bottom: 30px;
  2499. min-height: 426px;
  2500. }
  2501. .bmMap {
  2502. /* height: 500px; */
  2503. position: absolute;
  2504. height: 10%;
  2505. width: 100%;
  2506. /* padding: 5px 10px; */
  2507. box-sizing: border-box;
  2508. }
  2509. .bmMap
  2510. :deep()
  2511. .el-radio-button__original-radio:checked
  2512. + .el-radio-button__inner {
  2513. background-color: #474c79;
  2514. }
  2515. .bmMap
  2516. :deep()
  2517. .el-radio-button__original-radio:checked
  2518. + .el-radio-button__inner
  2519. span {
  2520. color: #fff;
  2521. }
  2522. .bmMap :deep() .el-radio-button__inner {
  2523. background-color: #383c6b;
  2524. border: none;
  2525. box-shadow: none;
  2526. }
  2527. .bmMap :deep() .el-radio-button__inner span {
  2528. color: #ccc;
  2529. }
  2530. .bmMap :deep() .el-radio-button__inner span:hover {
  2531. color: #eee;
  2532. }
  2533. .bmMapImage {
  2534. position: relative;
  2535. height: 100%;
  2536. width: 100%;
  2537. /* border: 1px solid #fff; */
  2538. background-color: rgba(255, 255, 255, 0.04);
  2539. border-radius: 6px;
  2540. }
  2541. .bmMapItem {
  2542. position: absolute;
  2543. height: 70px;
  2544. width: 70px;
  2545. cursor: pointer;
  2546. }
  2547. .bmMapItemNormal {
  2548. position: absolute;
  2549. height: 100%;
  2550. width: 100%;
  2551. background-color: #16182a;
  2552. /* box-shadow: 0 0 0 3px #393e6d inset; */
  2553. box-sizing: border-box;
  2554. z-index: 2;
  2555. }
  2556. .bmMapItemInfo {
  2557. position: absolute;
  2558. height: 100%;
  2559. width: 120px;
  2560. box-sizing: border-box;
  2561. padding: 3px;
  2562. display: flex;
  2563. justify-content: center;
  2564. align-items: flex-start;
  2565. flex-direction: column;
  2566. font-size: 12px;
  2567. z-index: 6;
  2568. user-select: none;
  2569. /* background: #183153; */
  2570. overflow: hidden;
  2571. border: none;
  2572. color: #ccc;
  2573. border-radius: 10px;
  2574. left: 30px;
  2575. padding-left: 10px;
  2576. background: rgba(117, 117, 117, 0.8);
  2577. }
  2578. .bmMapItemInfoAfter {
  2579. width: 0%;
  2580. height: 100%;
  2581. background: rgba(117, 117, 117, 0.8);
  2582. position: absolute;
  2583. transition: all 0.2s ease-in-out;
  2584. right: 0;
  2585. }
  2586. .bmMapItemInfoSelected > .bmMapItemInfoAfter {
  2587. right: auto;
  2588. left: 0;
  2589. width: 100%;
  2590. }
  2591. .bmMapItemInfo span {
  2592. z-index: 20;
  2593. transition: all 0.2s ease-in-out;
  2594. }
  2595. .bmMapItemInfo span + span {
  2596. margin-top: 5px;
  2597. }
  2598. .bmMapItemInfoSelected > span {
  2599. color: #ccc;
  2600. animation: scaleUp 0.2s ease-in-out;
  2601. }
  2602. @keyframes scaleUp {
  2603. 0% {
  2604. transform: scale(1);
  2605. }
  2606. 50% {
  2607. transform: scale(0.95);
  2608. }
  2609. 100% {
  2610. transform: scale(1);
  2611. }
  2612. }
  2613. .bmMapItemInfo span:nth-child(1) {
  2614. font-weight: bold;
  2615. }
  2616. .bmMapItemInfo span:nth-child(2) {
  2617. opacity: 0.8;
  2618. }
  2619. .bmMapItemSelected {
  2620. position: absolute;
  2621. height: 100%;
  2622. width: 100%;
  2623. overflow: hidden;
  2624. z-index: 4;
  2625. }
  2626. .bmMapItemSelected::before {
  2627. content: " ";
  2628. position: absolute;
  2629. height: 100%;
  2630. width: 100%;
  2631. background: linear-gradient(
  2632. 90deg,
  2633. transparent,
  2634. #ff3f99,
  2635. #3e88ff,
  2636. transparent
  2637. );
  2638. /* transform: scale(5); */
  2639. animation: rotation_9018 3000ms infinite linear;
  2640. filter: blur(9px);
  2641. }
  2642. @keyframes rotation_9018 {
  2643. 0% {
  2644. transform: rotate(0deg);
  2645. }
  2646. 100% {
  2647. transform: rotate(360deg);
  2648. }
  2649. }
  2650. .bmMapItemSelectedContent {
  2651. position: absolute;
  2652. height: calc(100% - 6px);
  2653. width: calc(100% - 6px);
  2654. top: 3px;
  2655. left: 3px;
  2656. background-color: #16182a;
  2657. }
  2658. .bmMapItemSelectedContent::before {
  2659. content: " ";
  2660. height: 28px;
  2661. width: 8px;
  2662. position: absolute;
  2663. background: white;
  2664. left: 50%;
  2665. top: 50%;
  2666. transform: translateX(-50%) translateY(-50%);
  2667. filter: blur(12px);
  2668. }
  2669. .bmBench {
  2670. width: 100%;
  2671. /* height: 300px; */
  2672. padding: 5px 10px;
  2673. box-sizing: border-box;
  2674. }
  2675. .bmBenchBox {
  2676. font-size: 0;
  2677. margin-top: 5px;
  2678. position: relative;
  2679. display: flex;
  2680. justify-content: center;
  2681. }
  2682. .bmBenchImg {
  2683. /* width: 100%;
  2684. height: 285px; */
  2685. /* width: 100%; */
  2686. height: 100%;
  2687. border-radius: 6px;
  2688. }
  2689. .bmBenchTrailUpper {
  2690. position: absolute;
  2691. /* height: 285px; */
  2692. height: 100%;
  2693. width: 100%;
  2694. z-index: 20;
  2695. left: 0;
  2696. top: 0;
  2697. }
  2698. .bmBenchTrailUpperCursorTap {
  2699. position: absolute;
  2700. height: 2vh;
  2701. width: 2vh;
  2702. background-color: rgba(255, 255, 255, 0.8);
  2703. border-radius: 50%;
  2704. left: 30%;
  2705. top: 0;
  2706. animation: bmBenchTrailUpperCursorTapAnimation 0.75s linear 0s 1;
  2707. }
  2708. @keyframes bmBenchTrailUpperCursorTapAnimation {
  2709. 0% {
  2710. transform: scale(1);
  2711. }
  2712. 25% {
  2713. transform: scale(1);
  2714. opacity: 1;
  2715. }
  2716. 40% {
  2717. transform: scale(0.6);
  2718. opacity: 0.6;
  2719. }
  2720. 50% {
  2721. transform: scale(0.6);
  2722. opacity: 0.6;
  2723. }
  2724. 55% {
  2725. transform: scale(1);
  2726. opacity: 1;
  2727. }
  2728. 100% {
  2729. transform: scale(1);
  2730. }
  2731. }
  2732. .bmBenchTrailUpperCursorSwipe {
  2733. position: absolute;
  2734. height: 2vh;
  2735. width: 2vh;
  2736. background-color: rgba(255, 255, 255, 0.8);
  2737. border-radius: 50%;
  2738. transition: all 1s;
  2739. }
  2740. .bmBenchTrailUpperCursorSwipe2 {
  2741. height: 1.5vh;
  2742. width: 1.5vh;
  2743. transition: all 1s 0.05s;
  2744. }
  2745. .bmBenchTrailUpperCursorSwipe3 {
  2746. height: 1vh;
  2747. width: 1vh;
  2748. transition: all 1s 0.1s;
  2749. }
  2750. .bmBenchTrailUpperCursorPress {
  2751. position: absolute;
  2752. height: 2vh;
  2753. width: 2vh;
  2754. background-color: rgba(255, 255, 255, 0.8);
  2755. border-radius: 50%;
  2756. left: 30%;
  2757. top: 0;
  2758. animation: bmBenchTrailUpperCursorPressAnimation 2s linear 0s 1;
  2759. }
  2760. @keyframes bmBenchTrailUpperCursorPressAnimation {
  2761. 0% {
  2762. transform: scale(1);
  2763. }
  2764. 12% {
  2765. transform: scale(1);
  2766. opacity: 1;
  2767. }
  2768. 21% {
  2769. transform: scale(0.6);
  2770. opacity: 0.6;
  2771. }
  2772. 70% {
  2773. transform: scale(0.6);
  2774. opacity: 0.6;
  2775. }
  2776. 73% {
  2777. transform: scale(1);
  2778. opacity: 1;
  2779. }
  2780. 100% {
  2781. transform: scale(1);
  2782. }
  2783. }
  2784. .bmBenchTrailUpperCursor {
  2785. position: absolute;
  2786. height: 2vh;
  2787. width: 2vh;
  2788. background-color: rgba(255, 255, 255, 0.6);
  2789. /* border: 1vh solid rgba(255, 255, 255, 0.6); */
  2790. border-radius: 50%;
  2791. left: 30%;
  2792. top: 0;
  2793. pointer-events: none;
  2794. animation: bmBenchTrailUpperCursorAnimation 1s linear 0s 1;
  2795. box-sizing: border-box;
  2796. }
  2797. @keyframes bmBenchTrailUpperCursorAnimation {
  2798. 0% {
  2799. border: 1vh solid rgba(255, 255, 255, 0.4);
  2800. }
  2801. 40% {
  2802. border: 0vh solid rgba(255, 255, 255, 0.4);
  2803. }
  2804. 100% {
  2805. border: 0vh solid rgba(255, 255, 255, 0.4);
  2806. }
  2807. }
  2808. .bmInfo {
  2809. min-height: 126px;
  2810. border-bottom: 1px solid #444358;
  2811. padding-bottom: 15px;
  2812. }
  2813. .bmInfoNotSelected,
  2814. .bmInfoOneSelected {
  2815. padding: 0 15px 0 25px;
  2816. }
  2817. .bmInfoNsTitle,
  2818. .bmInfoOsTitle {
  2819. display: flex;
  2820. justify-content: space-between;
  2821. align-items: center;
  2822. height: 80px;
  2823. }
  2824. .bmInfoNsInfo,
  2825. .bmInfoOsInfo {
  2826. display: flex;
  2827. flex-direction: column;
  2828. }
  2829. .bmInfoNsInfo > span:nth-child(1),
  2830. .bmInfoOsInfo > span:nth-child(1) {
  2831. /* font-weight: bold; */
  2832. font-size: 18px;
  2833. display: flex;
  2834. align-items: center;
  2835. /* justify-content: center; */
  2836. }
  2837. .bmInfoNsInfo > span:nth-child(2),
  2838. .bmInfoOsInfo > span:nth-child(2) {
  2839. font-size: 12px;
  2840. opacity: 0.4;
  2841. margin-top: 10px;
  2842. /* padding-bottom: 15px; */
  2843. letter-spacing: 1px;
  2844. font-weight: lighter;
  2845. }
  2846. .bmInfoNsChart {
  2847. height: 50px;
  2848. width: 200px;
  2849. }
  2850. .bmInfoOsImg {
  2851. background-image: url(../../assets/benchImage.png);
  2852. background-position: center;
  2853. background-repeat: no-repeat;
  2854. background-size: cover;
  2855. height: 100%;
  2856. width: 120px;
  2857. }
  2858. .bmInfoOsImgA3NF-01 {
  2859. background-image: url(../../assets/bench_img/a3nf_01.jpg) !important;
  2860. }
  2861. .bmInfoOsImgA3NF-02 {
  2862. background-image: url(../../assets/bench_img/a3nf_02.jpg) !important;
  2863. }
  2864. .bmInfoOsImgB9PA-01 {
  2865. background-image: url(../../assets/bench_img/B9PA_01.jpg) !important;
  2866. }
  2867. .bmInfoOsImgB9PA-02 {
  2868. background-image: url(../../assets/bench_img/B9PA_01.jpg) !important;
  2869. }
  2870. .bmInfoOsImgB9PA-04 {
  2871. background-image: url(../../assets/bench_img/B9PA_04.jpg) !important;
  2872. }
  2873. .bmInfoOsImgCBEV-01 {
  2874. background-image: url(../../assets/bench_img/CBEV_01.jpg) !important;
  2875. }
  2876. .bmInfoOsImgQ3NF-01 {
  2877. background-image: url(../../assets/bench_img/Q3nf_01.jpg) !important;
  2878. }
  2879. .bmInfoOsImgH-JP-02 {
  2880. background-image: url(../../assets/bench_img/meb-jp2.jpg) !important;
  2881. }
  2882. .bmInfoOsImgP-CN-01 {
  2883. background-image: url(../../assets/bench_img/MEB-P-CN_01.jpg) !important;
  2884. }
  2885. .bmInfoOsImgH-CN-01 {
  2886. background-image: url(../../assets/bench_img/meb-H_CN_01.jpg) !important;
  2887. }
  2888. .bmInfoOsImgP-TW-01 {
  2889. background-image: url(../../assets/bench_img/meb-h-CN_02.jpg) !important;
  2890. }
  2891. .bmInfoOsImgH-JP-01 {
  2892. background-image: url(../../assets/bench_img/meb-jp1.jpg) !important;
  2893. }
  2894. .bmInfoOsImgD5 {
  2895. background-image: url(../../assets/bench_img/Q7PA_01.jpg) !important;
  2896. }
  2897. .bmInfoOsImgQ6-01 {
  2898. background-image: url(../../assets/bench_img/Q6-01.jpg) !important;
  2899. }
  2900. .bmInfoOsImgQ6-02 {
  2901. background-image: url(../../assets/bench_img/Q6-02.jpg) !important;
  2902. }
  2903. .bmInfoNsTag,
  2904. .bmInfoOsTag {
  2905. display: flex;
  2906. padding: 10px 0;
  2907. }
  2908. .bmInfoTagItem {
  2909. height: 26px;
  2910. padding: 4px 14px;
  2911. background-color: #25293c;
  2912. font-size: 12px;
  2913. display: flex;
  2914. align-items: center;
  2915. justify-content: center;
  2916. border-radius: 13px;
  2917. box-sizing: border-box;
  2918. color: #d0cece;
  2919. margin-right: 10px;
  2920. cursor: pointer;
  2921. user-select: none;
  2922. }
  2923. .bmInfoTagItem:hover {
  2924. background-color: #2d3249;
  2925. }
  2926. .bmInfoTagItem:active {
  2927. background-color: #333a53;
  2928. }
  2929. .bmInfoMsSlide {
  2930. height: 120px;
  2931. width: 200px;
  2932. /* background-color: #3e88ff; */
  2933. background-image: url(../../assets/benchImage.png);
  2934. background-position: center;
  2935. background-repeat: no-repeat;
  2936. background-size: cover;
  2937. cursor: pointer;
  2938. position: relative;
  2939. }
  2940. .bmInfoMsSlideName {
  2941. position: absolute;
  2942. background-color: rgba(23, 25, 43, 0.5);
  2943. font-size: 12px;
  2944. padding: 1px 8px;
  2945. border-radius: 9px;
  2946. left: 3px;
  2947. top: 3px;
  2948. box-sizing: border-box;
  2949. /* text-align: center; */
  2950. backdrop-filter: blur(1px);
  2951. text-shadow: 0 0 10px #000;
  2952. display: flex;
  2953. justify-content: center;
  2954. align-items: center;
  2955. user-select: none;
  2956. }
  2957. .bmInfoMsSlideNameStatus {
  2958. float: right;
  2959. }
  2960. .bmInfoMsSlideNameStatus,
  2961. .bmInfoMsSlideNameStatus4 {
  2962. height: 12px;
  2963. width: 12px;
  2964. border: 3px solid #b1b3b8;
  2965. border-radius: 50%;
  2966. box-sizing: border-box;
  2967. margin-right: 6px;
  2968. }
  2969. .bmInfoMsSlideNameStatus2,
  2970. .bmInfoMsSlideNameStatus3 {
  2971. border: 3px solid #95d475;
  2972. }
  2973. /* .bmInfoMsSlideNameStatus4 {
  2974. border: 3px solid #f89898;
  2975. } */
  2976. .bmInfoMsSlideNameStatus5,
  2977. .bmInfoMsSlideNameStatus6 {
  2978. border: 3px solid #79bbff;
  2979. }
  2980. .bmInfoMultipleSelected {
  2981. position: relative;
  2982. padding: 4px 14px;
  2983. }
  2984. .bmInfoMsPagination {
  2985. position: absolute;
  2986. z-index: 10;
  2987. left: 50%;
  2988. /* top: 60px; */
  2989. height: 16px;
  2990. width: auto;
  2991. /* padding: 0 10px; */
  2992. border-radius: 10px;
  2993. transform: translateX(-50%);
  2994. background-color: rgba(255, 255, 255, 0.3);
  2995. display: flex;
  2996. justify-content: center;
  2997. align-items: center;
  2998. }
  2999. .bmInfoMsPagination :deep() span:nth-child(1) {
  3000. margin-left: 10px;
  3001. }
  3002. .bmInfoMsPagination :deep() span:last-child {
  3003. margin-right: 10px;
  3004. }
  3005. .bmBtn {
  3006. padding: 15px 15px 15px 25px;
  3007. display: flex;
  3008. align-items: center;
  3009. }
  3010. .bmBtnItem {
  3011. cursor: pointer;
  3012. height: 24px;
  3013. width: 24px;
  3014. border-radius: 3px;
  3015. margin-right: 20px;
  3016. transition: all 0.2s;
  3017. color: #aaa;
  3018. }
  3019. /* .bmBtnItem :deep() path {
  3020. color: #aaa;
  3021. } */
  3022. .bmBtnItem:hover {
  3023. background-color: rgba(255, 255, 255, 0.2);
  3024. filter: brightness(1.5);
  3025. }
  3026. .bmBtnItem:active {
  3027. background-color: rgba(255, 255, 255, 0.3);
  3028. }
  3029. .bmBtnItemMonitor,
  3030. .bmBtnMapLocation {
  3031. background-image: linear-gradient(
  3032. 60deg,
  3033. rgb(253 46 91 / 70%) 40%,
  3034. rgb(254 129 130 / 70%)
  3035. );
  3036. color: #ccc;
  3037. }
  3038. .bmBtnItemSelectAll {
  3039. /* position: relative; */
  3040. margin-right: 20px;
  3041. display: flex;
  3042. align-items: center;
  3043. }
  3044. .bmBtnItemSelectAll > .bmBtnItem {
  3045. margin-right: 5px;
  3046. }
  3047. .bmBtnItemSelectAllNum {
  3048. /* position: absolute; */
  3049. /* right: 20px; */
  3050. font-size: 12px;
  3051. color: rgba(226, 228, 243, 0.6);
  3052. }
  3053. .bmBtnItemActive {
  3054. filter: drop-shadow(0 0 2px rgb(255, 255, 255)) brightness(1.5);
  3055. font-size: 20px;
  3056. }
  3057. .bmLog {
  3058. padding: 5px 25px 20px 25px;
  3059. }
  3060. .bmLogBox {
  3061. padding: 15px;
  3062. border: 2px solid #31344a;
  3063. border-radius: 17px;
  3064. box-sizing: border-box;
  3065. background-color: #31344a80;
  3066. /* max-height: 200px; */
  3067. height: 200px;
  3068. overflow-y: scroll;
  3069. /* max-height: 200px; */
  3070. }
  3071. .bmLogItem {
  3072. line-height: 22px;
  3073. margin: 6px 0px;
  3074. padding: 0 6px;
  3075. width: 100%;
  3076. box-sizing: border-box;
  3077. font-size: 14px;
  3078. word-wrap: break-word;
  3079. }
  3080. .bmLogItemDebug {
  3081. color: rgb(115, 201, 255);
  3082. }
  3083. .bmLogItemInfo {
  3084. color: rgb(81, 230, 93);
  3085. }
  3086. .bmLogItemWarning {
  3087. color: rgb(228, 230, 81);
  3088. }
  3089. .bmLogItemError {
  3090. color: rgb(255, 113, 113);
  3091. }
  3092. /* .origin-basic {
  3093. padding: 15px 20px;
  3094. color: #fff;
  3095. font-size: 12px;
  3096. } */
  3097. .origin-basic div {
  3098. margin-bottom: 5px;
  3099. }
  3100. .origin-basic div span {
  3101. margin-right: 12px;
  3102. }
  3103. .origin-basic h2 {
  3104. cursor: pointer;
  3105. font-size: 14px;
  3106. margin-bottom: 10px;
  3107. }
  3108. .origin-map {
  3109. background-color: rgba(117, 117, 117, 0.8);
  3110. }
  3111. .ready {
  3112. color: #65c94c !important;
  3113. font-size: 30px;
  3114. }
  3115. .running {
  3116. color: #478bc3 !important;
  3117. font-size: 30px;
  3118. }
  3119. .occupied {
  3120. color: #478bc3 !important;
  3121. font-size: 30px;
  3122. }
  3123. .offline {
  3124. color: #cdd0cf !important;
  3125. font-size: 30px;
  3126. }
  3127. /*.offline {
  3128. color: red !important;
  3129. font-size: 30px;
  3130. }*/
  3131. .bmInfoMsSlideNameStatus.ready {
  3132. color: #65c94c !important;
  3133. border: 3px solid #65c94c;
  3134. font-size: 30px;
  3135. }
  3136. .bmInfoMsSlideNameStatus.occupied {
  3137. color: #478bc3 !important;
  3138. border: 3px solid #478bc3;
  3139. font-size: 30px;
  3140. }
  3141. .bmInfoMsSlideNameStatus.offline {
  3142. color: #cdd0cf !important;
  3143. border: 3px solid #cdd0cf;
  3144. font-size: 30px;
  3145. }
  3146. .bmInfoMsSlideNameStatus.offline {
  3147. color: red !important;
  3148. border: 3px solid red;
  3149. font-size: 30px;
  3150. }
  3151. </style>
  3152. <style scoped>
  3153. /* .benchMapBox {
  3154. margin-top: 30px;
  3155. } */
  3156. .benchMapBox :deep() .el-scrollbar__bar {
  3157. display: none;
  3158. }
  3159. .bmContent {
  3160. background-image: linear-gradient(60deg, #16182a 30%, #2d3049);
  3161. border-radius: 10px;
  3162. /* height: 1800px; */
  3163. margin-top: 30px;
  3164. margin-bottom: 30px;
  3165. min-height: 426px;
  3166. }
  3167. .bmMap {
  3168. /* height: 500px; */
  3169. width: 100%;
  3170. /* padding: 5px 10px; */
  3171. box-sizing: border-box;
  3172. }
  3173. .bmMap
  3174. :deep()
  3175. .el-radio-button__original-radio:checked
  3176. + .el-radio-button__inner {
  3177. background-color: #474c79;
  3178. }
  3179. .bmMap
  3180. :deep()
  3181. .el-radio-button__original-radio:checked
  3182. + .el-radio-button__inner
  3183. span {
  3184. color: #fff;
  3185. }
  3186. .bmMap :deep() .el-radio-button__inner {
  3187. background-color: #383c6b;
  3188. border: none;
  3189. box-shadow: none;
  3190. }
  3191. .bmMap :deep() .el-radio-button__inner span {
  3192. color: #ccc;
  3193. }
  3194. .bmMap :deep() .el-radio-button__inner span:hover {
  3195. color: #eee;
  3196. }
  3197. .bmMapImage {
  3198. position: relative;
  3199. width: 100%;
  3200. /* border: 1px solid #fff; */
  3201. background-color: rgba(255, 255, 255, 0.04);
  3202. border-radius: 6px;
  3203. }
  3204. .bmMapItem {
  3205. position: absolute;
  3206. height: 70px;
  3207. width: 70px;
  3208. cursor: pointer;
  3209. }
  3210. .bmMapItemNormal {
  3211. position: absolute;
  3212. height: 100%;
  3213. width: 100%;
  3214. background-color: #16182a;
  3215. /* box-shadow: 0 0 0 3px #393e6d inset; */
  3216. box-sizing: border-box;
  3217. z-index: 2;
  3218. }
  3219. .bmMapItemInfo {
  3220. position: absolute;
  3221. height: 100%;
  3222. width: 120px;
  3223. box-sizing: border-box;
  3224. padding: 3px;
  3225. display: flex;
  3226. justify-content: center;
  3227. align-items: flex-start;
  3228. flex-direction: column;
  3229. font-size: 12px;
  3230. z-index: 6;
  3231. user-select: none;
  3232. /* background: #183153; */
  3233. overflow: hidden;
  3234. border: none;
  3235. color: #ccc;
  3236. border-radius: 10px;
  3237. left: 30px;
  3238. padding-left: 10px;
  3239. background: rgba(117, 117, 117, 0.8);
  3240. }
  3241. .bmMapItemInfoAfter {
  3242. width: 0%;
  3243. height: 100%;
  3244. background: rgba(117, 117, 117, 0.8);
  3245. position: absolute;
  3246. transition: all 0.2s ease-in-out;
  3247. right: 0;
  3248. }
  3249. .bmMapItemInfoSelected > .bmMapItemInfoAfter {
  3250. right: auto;
  3251. left: 0;
  3252. width: 100%;
  3253. }
  3254. .bmMapItemInfo span {
  3255. z-index: 20;
  3256. transition: all 0.2s ease-in-out;
  3257. }
  3258. .bmMapItemInfo span + span {
  3259. margin-top: 5px;
  3260. }
  3261. .bmMapItemInfoSelected > span {
  3262. color: #ccc;
  3263. animation: scaleUp 0.2s ease-in-out;
  3264. }
  3265. @keyframes scaleUp {
  3266. 0% {
  3267. transform: scale(1);
  3268. }
  3269. 50% {
  3270. transform: scale(0.95);
  3271. }
  3272. 100% {
  3273. transform: scale(1);
  3274. }
  3275. }
  3276. .bmMapItemInfo span:nth-child(1) {
  3277. font-weight: bold;
  3278. }
  3279. .bmMapItemInfo span:nth-child(2) {
  3280. opacity: 0.8;
  3281. }
  3282. .bmMapItemSelected {
  3283. position: absolute;
  3284. height: 100%;
  3285. width: 100%;
  3286. overflow: hidden;
  3287. z-index: 4;
  3288. }
  3289. .bmMapItemSelected::before {
  3290. content: " ";
  3291. position: absolute;
  3292. height: 100%;
  3293. width: 100%;
  3294. background: linear-gradient(
  3295. 90deg,
  3296. transparent,
  3297. #ff3f99,
  3298. #3e88ff,
  3299. transparent
  3300. );
  3301. /* transform: scale(5); */
  3302. animation: rotation_9018 3000ms infinite linear;
  3303. filter: blur(9px);
  3304. }
  3305. @keyframes rotation_9018 {
  3306. 0% {
  3307. transform: rotate(0deg);
  3308. }
  3309. 100% {
  3310. transform: rotate(360deg);
  3311. }
  3312. }
  3313. .bmMapItemSelectedContent {
  3314. position: absolute;
  3315. height: calc(100% - 6px);
  3316. width: calc(100% - 6px);
  3317. top: 3px;
  3318. left: 3px;
  3319. background-color: #16182a;
  3320. }
  3321. .bmMapItemSelectedContent::before {
  3322. content: " ";
  3323. height: 28px;
  3324. width: 8px;
  3325. position: absolute;
  3326. background: white;
  3327. left: 50%;
  3328. top: 50%;
  3329. transform: translateX(-50%) translateY(-50%);
  3330. filter: blur(12px);
  3331. }
  3332. .bmBench {
  3333. width: 100%;
  3334. height: 100%;
  3335. box-sizing: border-box;
  3336. }
  3337. .bmBenchBox {
  3338. font-size: 0;
  3339. /* margin-top: 5px; */
  3340. position: relative;
  3341. display: flex;
  3342. justify-content: center;
  3343. background-color: #000;
  3344. height: 100%;
  3345. }
  3346. .bmBenchImg {
  3347. /* width: 100%;
  3348. height: 285px; */
  3349. width: 100%;
  3350. background-color: #000;
  3351. /* padding: 80px; */
  3352. height: 100%;
  3353. border-radius: 6px;
  3354. height: 100%;
  3355. }
  3356. .bmBenchTrailUpper {
  3357. position: absolute;
  3358. /* height: 285px; */
  3359. height: 100%;
  3360. width: 100%;
  3361. z-index: 20;
  3362. left: 0;
  3363. top: 0;
  3364. }
  3365. .bmBenchTrailUpperCursorTap {
  3366. position: absolute;
  3367. height: 2vh;
  3368. width: 2vh;
  3369. background-color: rgba(255, 255, 255, 0.8);
  3370. border-radius: 50%;
  3371. left: 30%;
  3372. top: 0;
  3373. animation: bmBenchTrailUpperCursorTapAnimation 0.75s linear 0s 1;
  3374. }
  3375. @keyframes bmBenchTrailUpperCursorTapAnimation {
  3376. 0% {
  3377. transform: scale(1);
  3378. }
  3379. 25% {
  3380. transform: scale(1);
  3381. opacity: 1;
  3382. }
  3383. 40% {
  3384. transform: scale(0.6);
  3385. opacity: 0.6;
  3386. }
  3387. 50% {
  3388. transform: scale(0.6);
  3389. opacity: 0.6;
  3390. }
  3391. 55% {
  3392. transform: scale(1);
  3393. opacity: 1;
  3394. }
  3395. 100% {
  3396. transform: scale(1);
  3397. }
  3398. }
  3399. .bmBenchTrailUpperCursorSwipe {
  3400. position: absolute;
  3401. height: 2vh;
  3402. width: 2vh;
  3403. background-color: rgba(255, 255, 255, 0.8);
  3404. border-radius: 50%;
  3405. transition: all 1s;
  3406. }
  3407. .bmBenchTrailUpperCursorSwipe2 {
  3408. height: 1.5vh;
  3409. width: 1.5vh;
  3410. transition: all 1s 0.05s;
  3411. }
  3412. .bmBenchTrailUpperCursorSwipe3 {
  3413. height: 1vh;
  3414. width: 1vh;
  3415. transition: all 1s 0.1s;
  3416. }
  3417. .bmBenchTrailUpperCursorPress {
  3418. position: absolute;
  3419. height: 2vh;
  3420. width: 2vh;
  3421. background-color: rgba(255, 255, 255, 0.8);
  3422. border-radius: 50%;
  3423. left: 30%;
  3424. top: 0;
  3425. animation: bmBenchTrailUpperCursorPressAnimation 2s linear 0s 1;
  3426. }
  3427. @keyframes bmBenchTrailUpperCursorPressAnimation {
  3428. 0% {
  3429. transform: scale(1);
  3430. }
  3431. 12% {
  3432. transform: scale(1);
  3433. opacity: 1;
  3434. }
  3435. 21% {
  3436. transform: scale(0.6);
  3437. opacity: 0.6;
  3438. }
  3439. 70% {
  3440. transform: scale(0.6);
  3441. opacity: 0.6;
  3442. }
  3443. 73% {
  3444. transform: scale(1);
  3445. opacity: 1;
  3446. }
  3447. 100% {
  3448. transform: scale(1);
  3449. }
  3450. }
  3451. .bmBenchTrailUpperCursor {
  3452. position: absolute;
  3453. height: 2vh;
  3454. width: 2vh;
  3455. background-color: rgba(255, 255, 255, 0.6);
  3456. /* border: 1vh solid rgba(255, 255, 255, 0.6); */
  3457. border-radius: 50%;
  3458. left: 30%;
  3459. top: 0;
  3460. pointer-events: none;
  3461. animation: bmBenchTrailUpperCursorAnimation 1s linear 0s 1;
  3462. box-sizing: border-box;
  3463. }
  3464. @keyframes bmBenchTrailUpperCursorAnimation {
  3465. 0% {
  3466. border: 1vh solid rgba(255, 255, 255, 0.4);
  3467. }
  3468. 40% {
  3469. border: 0vh solid rgba(255, 255, 255, 0.4);
  3470. }
  3471. 100% {
  3472. border: 0vh solid rgba(255, 255, 255, 0.4);
  3473. }
  3474. }
  3475. .bmInfo {
  3476. min-height: 126px;
  3477. border-bottom: 1px solid #444358;
  3478. padding-bottom: 15px;
  3479. }
  3480. .bmInfoNotSelected,
  3481. .bmInfoOneSelected {
  3482. padding: 0 15px 0 25px;
  3483. }
  3484. .bmInfoNsTitle,
  3485. .bmInfoOsTitle {
  3486. display: flex;
  3487. justify-content: space-between;
  3488. align-items: center;
  3489. height: 80px;
  3490. }
  3491. .bmInfoNsInfo,
  3492. .bmInfoOsInfo {
  3493. display: flex;
  3494. flex-direction: column;
  3495. }
  3496. .bmInfoNsInfo > span:nth-child(1),
  3497. .bmInfoOsInfo > span:nth-child(1) {
  3498. /* font-weight: bold; */
  3499. font-size: 18px;
  3500. display: flex;
  3501. align-items: center;
  3502. /* justify-content: center; */
  3503. }
  3504. .bmInfoNsInfo > span:nth-child(2),
  3505. .bmInfoOsInfo > span:nth-child(2) {
  3506. font-size: 12px;
  3507. opacity: 0.4;
  3508. margin-top: 10px;
  3509. /* padding-bottom: 15px; */
  3510. letter-spacing: 1px;
  3511. font-weight: lighter;
  3512. }
  3513. .bmInfoNsChart {
  3514. height: 50px;
  3515. width: 200px;
  3516. }
  3517. .bmInfoOsImg {
  3518. background-image: url(../../assets/benchImage.png);
  3519. background-position: center;
  3520. background-repeat: no-repeat;
  3521. background-size: cover;
  3522. height: 100%;
  3523. width: 120px;
  3524. }
  3525. .bmInfoOsImgA3NF-01 {
  3526. background-image: url(../../assets/bench_img/a3nf_01.jpg) !important;
  3527. }
  3528. .bmInfoOsImgA3NF-02 {
  3529. background-image: url(../../assets/bench_img/a3nf_02.jpg) !important;
  3530. }
  3531. .bmInfoOsImgB9PA-01 {
  3532. background-image: url(../../assets/bench_img/B9PA_01.jpg) !important;
  3533. }
  3534. .bmInfoOsImgB9PA-02 {
  3535. background-image: url(../../assets/bench_img/B9PA_01.jpg) !important;
  3536. }
  3537. .bmInfoOsImgB9PA-04 {
  3538. background-image: url(../../assets/bench_img/B9PA_04.jpg) !important;
  3539. }
  3540. .bmInfoOsImgCBEV-01 {
  3541. background-image: url(../../assets/bench_img/CBEV_01.jpg) !important;
  3542. }
  3543. .bmInfoOsImgQ3NF-01 {
  3544. background-image: url(../../assets/bench_img/Q3nf_01.jpg) !important;
  3545. }
  3546. .bmInfoOsImgH-JP-02 {
  3547. background-image: url(../../assets/bench_img/meb-jp2.jpg) !important;
  3548. }
  3549. .bmInfoOsImgP-CN-01 {
  3550. background-image: url(../../assets/bench_img/MEB-P-CN_01.jpg) !important;
  3551. }
  3552. .bmInfoOsImgH-CN-01 {
  3553. background-image: url(../../assets/bench_img/meb-H_CN_01.jpg) !important;
  3554. }
  3555. .bmInfoOsImgP-TW-01 {
  3556. background-image: url(../../assets/bench_img/meb-h-CN_02.jpg) !important;
  3557. }
  3558. .bmInfoOsImgH-JP-01 {
  3559. background-image: url(../../assets/bench_img/meb-jp1.jpg) !important;
  3560. }
  3561. .bmInfoOsImgD5 {
  3562. background-image: url(../../assets/bench_img/Q7PA_01.jpg) !important;
  3563. }
  3564. .bmInfoOsImgQ6-01 {
  3565. background-image: url(../../assets/bench_img/Q6-01.jpg) !important;
  3566. }
  3567. .bmInfoOsImgQ6-02 {
  3568. background-image: url(../../assets/bench_img/Q6-02.jpg) !important;
  3569. }
  3570. .bmInfoNsTag,
  3571. .bmInfoOsTag {
  3572. display: flex;
  3573. padding: 10px 0;
  3574. }
  3575. .bmInfoTagItem {
  3576. height: 26px;
  3577. padding: 4px 14px;
  3578. background-color: #25293c;
  3579. font-size: 12px;
  3580. display: flex;
  3581. align-items: center;
  3582. justify-content: center;
  3583. border-radius: 13px;
  3584. box-sizing: border-box;
  3585. color: #d0cece;
  3586. margin-right: 10px;
  3587. cursor: pointer;
  3588. user-select: none;
  3589. }
  3590. .bmInfoTagItem:hover {
  3591. background-color: #2d3249;
  3592. }
  3593. .bmInfoTagItem:active {
  3594. background-color: #333a53;
  3595. }
  3596. .bmInfoMsSlide {
  3597. height: 120px;
  3598. width: 200px;
  3599. /* background-color: #3e88ff; */
  3600. background-image: url(../../assets/benchImage.png);
  3601. background-position: center;
  3602. background-repeat: no-repeat;
  3603. background-size: cover;
  3604. cursor: pointer;
  3605. position: relative;
  3606. }
  3607. .bmInfoMsSlideName {
  3608. position: absolute;
  3609. background-color: rgba(23, 25, 43, 0.5);
  3610. font-size: 12px;
  3611. padding: 1px 8px;
  3612. border-radius: 9px;
  3613. left: 3px;
  3614. top: 3px;
  3615. box-sizing: border-box;
  3616. /* text-align: center; */
  3617. backdrop-filter: blur(1px);
  3618. text-shadow: 0 0 10px #000;
  3619. display: flex;
  3620. justify-content: center;
  3621. align-items: center;
  3622. user-select: none;
  3623. }
  3624. .bmInfoMsSlideNameStatus {
  3625. float: right;
  3626. }
  3627. .bmInfoMsSlideNameStatus,
  3628. .bmInfoMsSlideNameStatus4 {
  3629. height: 12px;
  3630. width: 12px;
  3631. border: 3px solid #b1b3b8;
  3632. border-radius: 50%;
  3633. box-sizing: border-box;
  3634. margin-right: 6px;
  3635. }
  3636. .bmInfoMsSlideNameStatus2,
  3637. .bmInfoMsSlideNameStatus3 {
  3638. border: 3px solid #95d475;
  3639. }
  3640. /* .bmInfoMsSlideNameStatus4 {
  3641. border: 3px solid #f89898;
  3642. } */
  3643. .bmInfoMsSlideNameStatus5,
  3644. .bmInfoMsSlideNameStatus6 {
  3645. border: 3px solid #79bbff;
  3646. }
  3647. .bmInfoMultipleSelected {
  3648. position: relative;
  3649. padding: 4px 14px;
  3650. }
  3651. .bmInfoMsPagination {
  3652. position: absolute;
  3653. z-index: 10;
  3654. left: 50%;
  3655. /* top: 60px; */
  3656. height: 16px;
  3657. width: auto;
  3658. /* padding: 0 10px; */
  3659. border-radius: 10px;
  3660. transform: translateX(-50%);
  3661. background-color: rgba(255, 255, 255, 0.3);
  3662. display: flex;
  3663. justify-content: center;
  3664. align-items: center;
  3665. }
  3666. .bmInfoMsPagination :deep() span:nth-child(1) {
  3667. margin-left: 10px;
  3668. }
  3669. .bmInfoMsPagination :deep() span:last-child {
  3670. margin-right: 10px;
  3671. }
  3672. .bmBtn {
  3673. padding: 15px 15px 15px 25px;
  3674. display: flex;
  3675. align-items: center;
  3676. }
  3677. .bmBtnItem {
  3678. cursor: pointer;
  3679. height: 24px;
  3680. width: 24px;
  3681. border-radius: 3px;
  3682. margin-right: 20px;
  3683. transition: all 0.2s;
  3684. color: #aaa;
  3685. }
  3686. /* .bmBtnItem :deep() path {
  3687. color: #aaa;
  3688. } */
  3689. .bmBtnItem:hover {
  3690. background-color: rgba(255, 255, 255, 0.2);
  3691. filter: brightness(1.5);
  3692. }
  3693. .bmBtnItem:active {
  3694. background-color: rgba(255, 255, 255, 0.3);
  3695. }
  3696. .bmBtnItemMonitor,
  3697. .bmBtnMapLocation {
  3698. background-image: linear-gradient(
  3699. 60deg,
  3700. rgb(253 46 91 / 70%) 40%,
  3701. rgb(254 129 130 / 70%)
  3702. );
  3703. color: #ccc;
  3704. }
  3705. .bmBtnItemSelectAll {
  3706. /* position: relative; */
  3707. margin-right: 20px;
  3708. display: flex;
  3709. align-items: center;
  3710. }
  3711. .bmBtnItemSelectAll > .bmBtnItem {
  3712. margin-right: 5px;
  3713. }
  3714. .bmBtnItemSelectAllNum {
  3715. /* position: absolute; */
  3716. /* right: 20px; */
  3717. font-size: 12px;
  3718. color: rgba(226, 228, 243, 0.6);
  3719. }
  3720. .bmBtnItemActive {
  3721. filter: drop-shadow(0 0 2px rgb(255, 255, 255)) brightness(1.5);
  3722. font-size: 20px;
  3723. }
  3724. .bmLog {
  3725. padding: 5px 25px 20px 25px;
  3726. }
  3727. .bmLogBox {
  3728. padding: 15px;
  3729. border: 2px solid #31344a;
  3730. border-radius: 17px;
  3731. box-sizing: border-box;
  3732. background-color: #31344a80;
  3733. /* max-height: 200px; */
  3734. height: 200px;
  3735. overflow-y: scroll;
  3736. /* max-height: 200px; */
  3737. }
  3738. .bmLogItem {
  3739. line-height: 22px;
  3740. margin: 6px 0px;
  3741. padding: 0 6px;
  3742. width: 100%;
  3743. box-sizing: border-box;
  3744. font-size: 14px;
  3745. word-wrap: break-word;
  3746. }
  3747. .bmLogItemDebug {
  3748. color: rgb(115, 201, 255);
  3749. }
  3750. .bmLogItemInfo {
  3751. color: rgb(81, 230, 93);
  3752. }
  3753. .bmLogItemWarning {
  3754. color: rgb(228, 230, 81);
  3755. }
  3756. .bmLogItemError {
  3757. color: rgb(255, 113, 113);
  3758. }
  3759. .origin-basic {
  3760. padding: 15px 20px;
  3761. color: #fff;
  3762. font-size: 12px;
  3763. }
  3764. .origin-basic div {
  3765. margin-bottom: 10px;
  3766. }
  3767. .origin-basic div span {
  3768. margin-right: 12px;
  3769. }
  3770. .origin-basic h2 {
  3771. cursor: pointer;
  3772. font-size: 14px;
  3773. margin-bottom: 10px;
  3774. }
  3775. .originBasicRow {
  3776. display: flex;
  3777. margin-bottom: 0 !important;
  3778. }
  3779. .originBasicRow > div {
  3780. width: 100%;
  3781. }
  3782. .ready {
  3783. color: #65c94c !important;
  3784. font-size: 30px;
  3785. }
  3786. .occupied {
  3787. color: #478bc3 !important;
  3788. font-size: 30px;
  3789. }
  3790. .offline {
  3791. color: #cdd0cf !important;
  3792. font-size: 30px;
  3793. }
  3794. .offline {
  3795. color: red !important;
  3796. font-size: 30px;
  3797. }
  3798. .bmInfoMsSlideNameStatus.ready {
  3799. color: #65c94c !important;
  3800. border: 3px solid #65c94c;
  3801. font-size: 30px;
  3802. }
  3803. .bmInfoMsSlideNameStatus.occupied {
  3804. color: #478bc3 !important;
  3805. border: 3px solid #478bc3;
  3806. font-size: 30px;
  3807. }
  3808. .bmInfoMsSlideNameStatus.offline {
  3809. color: #cdd0cf !important;
  3810. border: 3px solid #cdd0cf;
  3811. font-size: 30px;
  3812. }
  3813. .bmInfoMsSlideNameStatus.offline {
  3814. color: red !important;
  3815. border: 3px solid red;
  3816. font-size: 30px;
  3817. }
  3818. .secondScreen {
  3819. width: 26.36vw;
  3820. height: 26.38vh;
  3821. margin-left: 1.56vw;
  3822. margin-bottom: 2.13vh;
  3823. border-radius: 2.08vw;
  3824. overflow: hidden;
  3825. }
  3826. .benchBtnActive {
  3827. filter: brightness(5) drop-shadow(0 2px 3px rgb(255, 255, 255));
  3828. }
  3829. </style>