Fac.vue 53 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250
  1. <template>
  2. <!--这是全厂模块的模块展示内容-->
  3. <div for="FAC" id="top" class="top topfac" @click="switchIndex">
  4. <div title="返回主视图"
  5. style="cursor: pointer;position: absolute;right: 40px;top: 32px;height: 38px;width: 38px;text-align: center;"
  6. @click.stop="backMasterViewByFac"><img src="../../assets/image/view.png"></div>
  7. </div>
  8. <div class="bg1"></div>
  9. <div class="abs tools" v-if="showIndexData=='dataindex'">
  10. <div :class="item.active?'btn active':'btn'" v-for="item in toolsBtnList" :style="{backgroundImage: item.active?`url(${btnFrontBg})`:''}" @click="loadTools(item);">
  11. <div>{{ item.name }}</div>
  12. </div>
  13. </div>
  14. <div class="abs leftPanel" v-if="showIndexData=='index'">
  15. <div class="title_row"><div class="title_left_line"></div><span>平均值</span><span style="color:#27e6ff">(本月)</span></div>
  16. <div class="data_row"><img src="../../assets/image/icon_00.png">
  17. <div style="margin-left: 10px;"><table cellpadding="0" cellspacing="0">
  18. <tbody>
  19. <tr style="background-color:transparent">
  20. <td style="border:0">
  21. <div class="littleFont">成本<span style="color:#27e6ff">(总能耗)</span></div>
  22. <div style="font-size: 32px;font-weight: bold;">{{ costTotalTrans(deviceStatData.avgMonth.costTotal) }}<span style="font-size: 12px;">{{ deviceStatData.avgMonth.costTotal>10000?'万元/日':'元/日' }}</span></div>
  23. </td>
  24. <td style="border:0;padding-left: 40px;">
  25. <div class="littleFont">经编<span style="color:#27e6ff">(单位能耗)</span></div>
  26. <div style="font-size:24px;font-weight:bold;height: 38px;line-height: 48px;color: #fbc16b;">{{ deviceStatData.avgMonth.costJb }}<span style="font-size: 12px;"> 元/米</span></div>
  27. </td>
  28. <td style="border:0;padding-left: 40px;">
  29. <div class="littleFont">染整<span style="color:#27e6ff">(单位能耗)</span></div>
  30. <div style="font-size:24px;font-weight:bold;height: 38px;line-height: 48px;color: #fbc16b;">{{ deviceStatData.avgMonth.costRz }}<span style="font-size: 12px;"> 元/米</span></div>
  31. </td>
  32. <td style="border-bottom: 0;border-right: 1px solid #146c86;padding-left: 20px;">&nbsp;</td>
  33. <td style="border:0;padding-left: 40px;">
  34. <div class="littleFont">经编<span style="color:#27e6ff">(产出)</span></div>
  35. <div style="font-size:24px;font-weight:bold;height: 38px;line-height: 48px;color: #27e6ff;">{{ deviceStatData.avgMonth.yieldJb }}<span style="font-size: 12px;"> 米/日</span></div>
  36. </td>
  37. <td style="border:0;padding-left: 40px;">
  38. <div class="littleFont">经编<span style="color:#27e6ff">(平均嫁动率)</span></div>
  39. <div style="font-size:24px;font-weight:bold;height: 38px;line-height: 48px;color: #27e6ff;">{{ deviceStatData.avgMonth.jdl }}<span style="font-size: 12px;"> %</span></div>
  40. </td>
  41. <td style="border:0;padding-left: 40px;">
  42. <div class="littleFont">染整<span style="color:#27e6ff">(产出)</span></div>
  43. <div style="font-size:24px;font-weight:bold;height: 38px;line-height: 48px;color: #27e6ff;">{{ deviceStatData.avgMonth.yieldRz }}<span style="font-size: 12px;"> 米/日</span></div>
  44. </td>
  45. </tr>
  46. </tbody>
  47. </table></div>
  48. </div>
  49. <div class="title_row" style="margin-top: 3%;"><div class="title_left_line"></div><span>经编</span><span style="color:#27e6ff">(生产情况)</span></div>
  50. <div class="data_row" style="width: 300px;display: block;margin-top:0;">
  51. <div style="display: flex;">
  52. <div ref="echarts1" class="fac_pie"></div>
  53. <div ref="echarts2" class="fac_pie"></div>
  54. </div>
  55. <div style="padding-left: 25px;color: #27e6ff;width: 100%;">
  56. <div class="littleFont">产量(今日)</div>
  57. <div style="font-size: 22px;font-weight: bold;">{{ deviceStatData.currYield.jb.yield }}<span class="littleFont">米</span></div>
  58. <div style="position: relative;margin-top: 5px;">
  59. <div class="abs fac_progress_value" :style="{width:(deviceStatData.currYield.jb.yield/deviceStatData.currYield.jb.yieldMax*100)+'%',backgroundColor: '#008899'}"></div>
  60. <div class="abs fac_progress" style="background-color: #072e47;"></div>
  61. </div>
  62. </div>
  63. <div style="padding-left: 25px;color: #27e6ff;margin-top: 25px;width: 100%;">
  64. <div class="littleFont"><span>开机数(今日)</span><span style="float: right;">总数</span></div>
  65. <div style="font-size: 22px;"><b>{{ deviceStatData.currYield.jb.openNum }}<span class="littleFont">台</span></b>
  66. <b style="float: right;">{{ deviceStatData.currYield.jb.totalNum }}<span class="littleFont">台</span></b>
  67. </div>
  68. <div style="position: relative;margin-top: 5px;">
  69. <div class="abs fac_progress_value" :style="{width:deviceStatData.currYield.jb.openRatio+'%',backgroundColor: '#008899'}"></div>
  70. <div class="abs fac_progress" style="background-color: #072e47;"></div>
  71. </div>
  72. </div>
  73. </div>
  74. <div class="title_row" style="margin-top: 3%;"><div class="title_left_line"></div><span>染整</span><span style="color:#27e6ff">(生产情况)</span></div>
  75. <div class="data_row" style="width: 300px;display: block;margin-top:0;">
  76. <div style="display: flex;">
  77. <div ref="echarts3" class="fac_pie"></div>
  78. <div ref="echarts4" class="fac_pie"></div>
  79. </div>
  80. <div style="padding-left: 25px;color: #27e6ff;width: 100%;">
  81. <div class="littleFont">印染(今日)</div>
  82. <div style="font-size: 22px;font-weight: bold;">{{ deviceStatData.currYield.rz.yield }}<span class="littleFont">米</span></div>
  83. <div style="position: relative;margin-top: 5px;">
  84. <div class="abs fac_progress_value" :style="{width:(deviceStatData.currYield.rz.yield/deviceStatData.currYield.rz.yieldMax*100)+'%'}"></div>
  85. <div class="abs fac_progress"></div>
  86. </div>
  87. </div>
  88. <div style="padding-left: 25px;color: #27e6ff;margin-top: 25px;width: 100%;">
  89. <div class="littleFont"><span>开机数(今日)</span><span style="float: right;">总数</span></div>
  90. <div style="font-size: 22px;"><b>{{ deviceStatData.currYield.rz.openNum }}<span class="littleFont">台</span></b>
  91. <b style="float: right;">{{ deviceStatData.currYield.rz.totalNum }}<span class="littleFont">台</span></b>
  92. </div>
  93. <div style="position: relative;margin-top: 5px;">
  94. <div class="abs fac_progress_value" :style="{width:deviceStatData.currYield.rz.openRatio+'%'}"></div>
  95. <div class="abs fac_progress"></div>
  96. </div>
  97. </div>
  98. </div>
  99. </div>
  100. <div class="abs rightPanel" v-if="showIndexData=='index'">
  101. <div class="title_row" style="line-height: 30px;"><div class="title_left_line" style="margin-top: 7px;"></div>
  102. <span>生产趋势</span><span style="color:#27e6ff">(7天)</span>
  103. <span style="margin-left: auto !important;">
  104. <span :class="buttonCode1=='Length'?'fac_btn active':'fac_btn'" @click="LoadSCLine('Length')">米数</span>
  105. <span :class="buttonCode1=='Weight'?'fac_btn active':'fac_btn'" @click="LoadSCLine('Weight')">重量</span>
  106. </span>
  107. </div>
  108. <div class="data_row" ref="echarts_sc_qushi" style="width: 100%;height: 42%;border: 1px solid #008899;background: rgb(0 85 102 / 40%);"></div>
  109. <div class="title_row" style="line-height: 30px;margin-top: 8%;"><div class="title_left_line" style="margin-top: 7px;"></div>
  110. <span>能耗趋势</span><span style="color:#27e6ff">(30天)</span>
  111. <span style="margin-left: auto !important;">
  112. <span :class="buttonCode2=='price'?'fac_btn active':'fac_btn'" @click="LoadUsedLine('price')">折算</span>
  113. <span :class="buttonCode2=='electricity'?'fac_btn active':'fac_btn'" @click="LoadUsedLine('electricity')">电</span>
  114. <span :class="buttonCode2=='steam'?'fac_btn active':'fac_btn'" @click="LoadUsedLine('steam')">气</span>
  115. <span :class="buttonCode2=='water'?'fac_btn active':'fac_btn'" @click="LoadUsedLine('water')">水</span>
  116. </span>
  117. </div>
  118. <div class="data_row" ref="echarts_used_qushi" style="width: 100%;height: 42%;border: 1px solid #008899;background: rgb(0 85 102 / 40%);"></div>
  119. </div>
  120. </template>
  121. <script>
  122. import { ref,onMounted,watch,emit,onUnmounted } from 'vue';
  123. import {useRouter} from 'vue-router';
  124. import api from "@/api/system";
  125. import * as echarts from 'echarts';
  126. export default {
  127. props:{
  128. facModelLoadState:{
  129. type:Boolean,
  130. required: true
  131. },
  132. userRole:{
  133. type:String
  134. }
  135. },
  136. setup(props,{emit}) {
  137. const router = useRouter();
  138. const isShowIframeWin=ref(false);
  139. const iframeWinData = ref({});
  140. const echarts1 = ref(null);
  141. const echarts2 = ref(null);
  142. const echarts3 = ref(null);
  143. const echarts4 = ref(null);
  144. const echarts_sc_qushi = ref(null);
  145. const echarts_used_qushi = ref(null);
  146. const showIndexData=ref('');
  147. const btnFrontBg = require('@/assets/image/nav_btn_front.png');
  148. const toolsBtnList=ref([
  149. {"code":"tools01","name":"能耗","active":true},
  150. {"code":"tools02","name":"成本","active":false},
  151. {"code":"tools03","name":"销售","active":false},
  152. ]);
  153. let buttonCode1 = ref('');
  154. let buttonCode2 = ref('');
  155. let deviceStatData=ref({"avgMonth":{},"currYield":{"jb":{},"rz":{}}});
  156. const dataTypeUnit={
  157. 'Length':'米',
  158. 'Weight':'吨',
  159. 'price':'元',
  160. 'electricity':'kwh',
  161. 'steam':'GJ',
  162. 'water':'m³',
  163. };
  164. let getDataTimer=null;
  165. let getDataTimer1 = null;
  166. let getDataTimer2 = null;
  167. let getDataTimer3 = null;
  168. let getDataTimer4 = null;
  169. let MarkerMapFac={};
  170. let FacStockData={};
  171. let markerLClickObj = null;
  172. let echartsEleIns_0=null;
  173. let echartsEleIns_1=null;
  174. watch(() => props.facModelLoadState, newVal=> {
  175. if(newVal){
  176. //模型加载完成
  177. console.log('全厂模型加载完成')
  178. try{
  179. if(MarkerMapFac["FAC"]!=null && player!=null && player.Native!=null){
  180. for(let key in MarkerMapFac["FAC"]){
  181. player.Native.GisMarker.destroy(key)
  182. }
  183. }
  184. MarkerMapFac["FAC"] = {};
  185. loadmarkers();
  186. backMasterViewByFac();
  187. }catch(e){
  188. window.location.reload();
  189. }
  190. }
  191. },{deep:true,immediate:true})
  192. watch(() => props.userRole, newVal=> {
  193. showIndexData.value = newVal;
  194. },{deep:true,immediate:true})
  195. function loadTools(v){
  196. for(let i=0;i<toolsBtnList.value.length;i++){
  197. if(toolsBtnList.value[i].code==item.code){
  198. toolsBtnList.value[i].active=true;
  199. }else toolsBtnList.value[i].active=false;
  200. }
  201. }
  202. let DataFull={
  203. GetFacData:function(){
  204. getDataTimer = setTimeout(function () {
  205. //每1分钟主动查询一次数据
  206. DataFull.GetFacData()
  207. }, 60*1000);
  208. api.GetFacData().then((res)=>{
  209. if(window.CurrentTargetType!='FAC') return;
  210. FacStockData = res||{};
  211. if (res == null || player.Native==null || window.CurrentTargetType!='FAC') {
  212. return
  213. }
  214. updateMarkerData();
  215. });
  216. },
  217. GetDeviceStat:function(){
  218. if(showIndexData.value=='dataindex') {
  219. return;
  220. }
  221. getDataTimer1 = setTimeout(function () {
  222. //每1分钟主动查询一次数据
  223. DataFull.GetDeviceStat()
  224. }, 60*1000);
  225. api.GetFacDeviceStat().then(res=>{
  226. if(window.CurrentTargetType!='FAC') return;
  227. if (res == null || player.Native==null || window.CurrentTargetType!='FAC') {
  228. return
  229. }
  230. if(res.code!=200){
  231. /*
  232. let msg = ElMessage({
  233. message:"正在加载数据",
  234. type:"info",
  235. duration:0,
  236. })
  237. */
  238. return;
  239. }
  240. FacStockData = res.data.stock||{};
  241. deviceStatData.value = res.data;
  242. LoadSCLine('Length');
  243. LoadUsedLine('price');
  244. LoadJBPie();
  245. LoadRZPie();
  246. })
  247. }
  248. }
  249. //全局厂房最佳视图
  250. function backMasterViewByFac(){
  251. // player.Native.Camera.moveTo([235.678127000173, 13.38107286701451, 74.13573809425804], [-1248.3191825020908, -262.59031050373517, -409.93944372657353], [-0.30023176822741604, -0.055832565112502126, 0.9522308596238611], 1);
  252. player.Native.Camera.moveTo([132.11876502209185, -440.46670198759625, 492.25734718993556],
  253. [-640.8528070063287, 2116.1462138868947, -2471.4015229045867],
  254. [-0.2149817792494004, 0.7110548607426664, 0.6694653236762824], 1);
  255. // 使用异步函数
  256. (async () => {
  257. setTimeout(function() {
  258. player.Native.Camera.setAnchorPos([-45.87571144104003, -44.632896423339844, 43.90447044372559]);
  259. }, 3000);
  260. })();
  261. }
  262. async function updateMarkerData(){
  263. if(MarkerMapFac==null) return;
  264. for (var key in MarkerMapFac) {
  265. if(key=="FAC"){
  266. for (var marker in MarkerMapFac[key]) {
  267. var opt = MarkerMapFac[key][marker];
  268. var dataType = opt["userData"];
  269. if(dataType==null) continue;
  270. dataType = dataType.split("|");
  271. var dataMap = FacStockData[dataType[0]];//从返回结果中获取到当前数据类型对应的统计结果
  272. if(dataMap==null) continue;
  273. var dataTpl = dataType[1]; //从拆分结果中获取数据模板
  274. var dataText = dataTpl;
  275. //将模板中的属性替换成数据值
  276. for (var attr in dataMap) {
  277. /*
  278. if(attr=="fdy" || attr=="poy"){
  279. for (var yclattr in dataMap[attr]) {
  280. dataText = dataText.replace("{"+attr+"."+yclattr+"}",dataMap[attr][yclattr].toString().padEnd(6," "));
  281. }
  282. continue
  283. }
  284. */
  285. dataText = dataText.replace("{"+attr+"}",dataMap[attr].toString().padEnd(6," "));
  286. }
  287. //更新GIS标记内容
  288. opt["text"]=dataText;
  289. player.Native.GisMarker.update(marker, opt);
  290. }
  291. break;
  292. }
  293. }
  294. }
  295. async function loadmarkers(){
  296. //获取4号楼顶对象
  297. var obj02 = await player.Native.ModelTree.findItemByName("Box013",0,true,1);
  298. var imgid = await player.Native.GisMarker.loadImage("data://icon/qietu/tip3.png");
  299. var options = {
  300. "text": "白坯布("+StockTypeUnit['bpb']+")\r\r当前库存:-\r统计时间:7点至次日7点\r当日入库:- 出库:-\r当月入库:- 出库:-\r",
  301. "visible": true,
  302. //"maxLod": 130,
  303. "minLod": 0,
  304. "textFontSize":16,
  305. "textColor": parseInt("0xedededff"),
  306. "contentPadding":[10,10,10,10],
  307. "nodeOffset":[-154,-130],
  308. "userData":"bpb|白坯布("+StockTypeUnit['bpb']+")\r\r当前库存:{curr}\r统计时间:7点至次日7点\r当日入库:{d-in} 出库:{d-out}\r当月入库:{m-in} 出库:{m-out}\r"
  309. };
  310. var obj02Aabb = await player.Native.ModelTree.getItemShapeInfo(obj02.item);
  311. //options.pos = [obj02Aabb.aabb[0][0]-40, obj02Aabb.aabb[0][1]-10, obj02Aabb.aabb[0][2]+115];
  312. options.pos = [-215.53692626953125, -9.105635643005371, 38.3607177734375];
  313. //options.parentNode=tmp.item;
  314. options.imgId = imgid
  315. options.imgSize = [0, 140];
  316. var markPtr = await player.Native.GisMarker.create(options);
  317. //await player.Native.GisMarker.update(markPtr, options);
  318. MarkerMapFac["FAC"]={};
  319. MarkerMapFac["FAC"][markPtr]=options;
  320. //获取盘头仓对象
  321. var pantou = await player.Native.ModelTree.findItemByName("Object023",0,true,1);
  322. //var imgid = await player.Native.GisMarker.loadImage("rgba:255,0,255,255");
  323. var options = {
  324. "text": "盘头("+StockTypeUnit['pt']+")\r\r当前库存:-\r统计时间:7点至次日7点\r当日入库:- 出库:-\r当月入库:- 出库:-",
  325. "visible": true,
  326. //"maxLod": 130,
  327. "minLod": 0,
  328. "textFontSize":16,
  329. "textColor": parseInt("0xedededff"),
  330. "contentPadding":[10,10,10,10],
  331. "nodeOffset":[-154,-130],
  332. "userData":"pt|盘头("+StockTypeUnit['pt']+")\r\r当前库存:{curr}\r统计时间:7点至次日7点\r当日入库:{d-in} 出库:{d-out}\r当月入库:{m-in} 出库:{m-out}\r"
  333. };
  334. var obj02Aabb = await player.Native.ModelTree.getItemShapeInfo(pantou.item);
  335. options.pos =[78.97850799560547, -7.938839912414551, 31.4000244140625];// [obj02Aabb.aabb[0][0], obj02Aabb.aabb[0][1]-30, obj02Aabb.aabb[0][2]+45];
  336. //options.parentNode=tmp.item;
  337. options.imgId = imgid
  338. options.imgSize = [240, 140];
  339. var markPtr = await player.Native.GisMarker.create(options);
  340. MarkerMapFac["FAC"][markPtr]=options;
  341. //await player.Native.GisMarker.update(markPtr, options);
  342. //获取原材料仓对象
  343. var pantou = await player.Native.ModelTree.findItemByName("B412",0,true,1);
  344. //var imgid = await player.Native.GisMarker.loadImage("rgba:255,0,255,255");
  345. var options = {
  346. "text": "原材料("+StockTypeUnit['ycl']+")\r\r当前库存:-\r统计时间:7点至次日7点\r当日入库:- 出库:-\r当月入库:- 出库:-\r",
  347. "visible": true,
  348. //"maxLod": 130,
  349. "minLod": 0,
  350. "textFontSize":16,
  351. "textColor": parseInt("0xedededff"),
  352. "contentPadding":[10,10,10,10],
  353. "nodeOffset":[-154,-130],
  354. "userData":"ycl|原材料("+StockTypeUnit['ycl']+")\r\r当前库存:{curr}\r统计时间:7点至次日7点\r当日入库:{d-in} 出库:{d-out}\r当月入库:{m-in} 出库:{m-out}\r"
  355. };
  356. var obj02Aabb = await player.Native.ModelTree.getItemShapeInfo(pantou.item);
  357. options.pos = [-92.3292236328125, -83.65309143066406, 44];// [obj02Aabb.aabb[0][0]-50, obj02Aabb.aabb[0][1]-10, obj02Aabb.aabb[0][2]+60];
  358. //options.parentNode=tmp.item;
  359. options.imgId = imgid
  360. options.imgSize = [0, 140];
  361. var markPtr = await player.Native.GisMarker.create(options);
  362. MarkerMapFac["FAC"][markPtr]=options;
  363. //await player.Native.GisMarker.update(markPtr, options);
  364. //var imgid = await player.Native.GisMarker.loadImage("rgba:255,0,255,255");
  365. var options = {
  366. "text": "成品("+StockTypeUnit['cp']+")\r\r当前库存:-\r统计时间:7点至次日7点\r当日入库:- 出库:-\r当月入库:- 出库:-",
  367. "visible": true,
  368. //"maxLod": 130,
  369. "minLod": 0,
  370. "textFontSize":16,
  371. "textColor": parseInt("0xedededff"),
  372. "contentPadding":[10,10,10,10],
  373. "nodeOffset":[-154,-130],
  374. "userData":"cp|成品("+StockTypeUnit['cp']+")\r\r当前库存:{curr}\r统计时间:7点至次日7点\r当日入库:{d-in} 出库:{d-out}\r当月入库:{m-in} 出库:{m-out}\r"
  375. };
  376. options.pos = [7.242690563201904, -137.442626953125, 46.22212219238281];// [obj02Aabb.aabb[0][0]+100, obj02Aabb.aabb[0][1]+10, obj02Aabb.aabb[0][2]+75];
  377. //options.parentNode=tmp.item;
  378. options.imgId = imgid
  379. options.imgSize = [250, 140];
  380. var markPtr = await player.Native.GisMarker.create(options);
  381. MarkerMapFac["FAC"][markPtr]=options;
  382. //await player.Native.GisMarker.update(markPtr, options);
  383. //标记点击
  384. player.Native.GisMarker.EventGisMarkerLClick.connect((event) => {
  385. markerLClickObj = MarkerMapFac["FAC"][event.markerId];
  386. if(markerLClickObj==null || FacStockData==null){
  387. emit('markerLClick',{});
  388. return;
  389. }
  390. setTimeout(function(dataType){
  391. if(dataType==null) return;
  392. dataType = dataType.split("|");
  393. //打开库存趋势窗口
  394. showStockTrend(dataType[0]);
  395. },100,markerLClickObj["userData"]);
  396. emit('markerLClick',markerLClickObj);
  397. });
  398. updateMarkerData();
  399. }
  400. function LoadSCLine(dataType) {
  401. buttonCode1.value = dataType;
  402. let data = deviceStatData.value.prodTrade;
  403. //生产趋势
  404. //获取数据中weight、aweight、bweight
  405. var t = echarts_sc_qushi.value;
  406. var week_aefficiency = [];
  407. var week_befficiency = [];
  408. var times = [];
  409. var v_series = [];
  410. for (var i = 0; i < data.length; i++) {
  411. var tv = data[i]['date'];
  412. times.push([tv,data[i].tips]);
  413. if(dataType=='Length'){
  414. week_aefficiency.push({value:data[i]['jbLength'],type:'Length'})
  415. week_befficiency.push({value:data[i]['rzLength'],type:'Length'})
  416. }else{
  417. week_aefficiency.push({value:data[i]['jbWeight'],type:'Weight'})
  418. week_befficiency.push({value:data[i]['rzWeight'],type:'Weight'})
  419. }
  420. }
  421. if (week_aefficiency.length == 0 && week_befficiency.length==0) {
  422. return
  423. }
  424. v_series.push({
  425. name: "经编", type: 'line', //symbol: 'none',
  426. data: week_aefficiency, itemStyle: {
  427. normal: {
  428. color: '#fbc16b', // 这里设置折线的颜色
  429. lineStyle: {
  430. color: '#fbc16b' // 这里同时设置线头的颜色
  431. }
  432. }
  433. }
  434. });
  435. v_series.push({
  436. name: "染整", type: 'line', //symbol: 'none',
  437. dataType:'Weight',
  438. data: week_befficiency, itemStyle: {
  439. normal: {
  440. color: '#fc4850', // 这里设置折线的颜色
  441. lineStyle: {
  442. color: '#fc4850' // 这里同时设置线头的颜色
  443. }
  444. }
  445. }
  446. });
  447. var opt = {
  448. title: {
  449. show: false, //不显示标题
  450. text: '',
  451. textStyle: {
  452. color: "rgb(89, 151, 229)",
  453. fontWeight: "bold"
  454. },
  455. top: "0px",
  456. left: "30px"
  457. },
  458. legend: {
  459. show: true, //不显示图例
  460. inactiveColor: "#04417A",
  461. data: "",
  462. icon:"circle",
  463. textStyle: {color: "#fff"},
  464. top: "5",
  465. left: "10px",
  466. },
  467. tooltip: {
  468. trigger: 'axis',
  469. backgroundColor: '#fff',
  470. textStyle: {
  471. color: '#5c6c7c'
  472. },
  473. padding: [10, 10],
  474. extraCssText: 'box-shadow: 1px 0 2px 0 rgba(163,163,163,0.5)',
  475. formatter: function (params) {
  476. let xv='';
  477. let result = '';
  478. params.forEach(function (item) {
  479. xv=`${item.name}`;
  480. xv = xv.split(',')[1]+'<br>';
  481. result += ` ${item.marker} ${item.seriesName}: ${item.value}(`+dataTypeUnit[item.data.type]+`)<br/>`;
  482. });
  483. return xv+result;
  484. }
  485. },
  486. grid: {
  487. left: '5%',
  488. right: '5%',
  489. bottom: '0',
  490. top: '15%',
  491. containLabel: true
  492. },
  493. xAxis: {
  494. type: 'category',
  495. boundaryGap: true,
  496. axisLabel: {
  497. rotate: 0,
  498. color: "#26e2fb",
  499. formatter:function(v){
  500. return v.split(',')[0]
  501. }
  502. },
  503. axisTick:{
  504. show:false
  505. },
  506. data: times
  507. },
  508. yAxis: {
  509. type: 'value',
  510. nameTextStyle: {
  511. color: "#26e2fb"
  512. },
  513. axisLine:{
  514. show:true
  515. },
  516. axisLabel: {
  517. color: "#26e2fb"
  518. },
  519. splitLine: {
  520. lineStyle: {
  521. color: "#7DA7CD",
  522. type: "dashed",
  523. width: 1
  524. }
  525. }
  526. },
  527. series: v_series
  528. };
  529. if(echartsEleIns_1!=null){
  530. echartsEleIns_1.dispose();
  531. }
  532. echartsEleIns_1 = echarts.init(t);
  533. echartsEleIns_1.setOption(opt);
  534. }
  535. function LoadUsedLine(dataType){
  536. buttonCode2.value = dataType;
  537. let data = deviceStatData.value.energyTrade;
  538. //能耗趋势
  539. var t = echarts_used_qushi.value;
  540. var times = [];
  541. var v_series = [];
  542. var week_aefficiency = [];
  543. var week_befficiency = [];
  544. for (var i = 0; i < data.length; i++) {
  545. times.push([data[i]['date'],data[i].tips]);
  546. if(data[i]['jb'][dataType]!=null) week_aefficiency.push({value:data[i]['jb'][dataType],type:dataType});
  547. if(data[i]['rz'][dataType]!=null) week_befficiency.push({value:data[i]['rz'][dataType],type:dataType});
  548. }
  549. if (week_aefficiency.length> 0) {
  550. v_series.push({
  551. name: "经编", type: 'line', //symbol: 'none',
  552. data: week_aefficiency,
  553. symbol: 'circle', // 使用圆作为折点标记
  554. symbolSize: 6,
  555. itemStyle: {
  556. normal: {
  557. color: '#fbc16b', // 这里设置折线的颜色
  558. lineStyle: {
  559. color: '#fbc16b' // 这里同时设置线头的颜色
  560. }
  561. }
  562. },
  563. });
  564. }
  565. if(week_befficiency.length>0){
  566. v_series.push({
  567. name: "染整", type: 'line', //symbol: 'none',
  568. data: week_befficiency,
  569. symbol: 'circle', // 使用圆作为折点标记
  570. symbolSize: 6,
  571. itemStyle: {
  572. normal: {
  573. color: '#fc4850', // 这里设置折线的颜色
  574. lineStyle: {
  575. color: '#fc4850' // 这里同时设置线头的颜色
  576. }
  577. }
  578. },
  579. });
  580. }
  581. var opt = {
  582. title: {
  583. show: false, //不显示标题
  584. text: '',
  585. textStyle: {
  586. color: "rgb(89, 151, 229)",
  587. fontWeight: "bold"
  588. },
  589. top: "0px",
  590. left: "30px"
  591. },
  592. tooltip: {
  593. trigger: 'axis',
  594. formatter: function (params) {
  595. let xv='';
  596. let result = '';
  597. params.forEach(function (item) {
  598. xv=`${item.name}`;
  599. xv = xv.split(',')[1]+'<br>';
  600. result += ` ${item.marker} ${item.seriesName}: ${item.value}(`+dataTypeUnit[item.data.type]+`)<br/>`;
  601. });
  602. return xv+result;
  603. }
  604. },
  605. legend: {
  606. show: true, //不显示图例
  607. inactiveColor: "#04417A",
  608. data: "",
  609. textStyle: {color: "#fff"},
  610. top: "5",
  611. left:"10px",
  612. icon:"circle",
  613. },
  614. grid: {
  615. left: '3%',
  616. right: '1%',
  617. bottom: '0',
  618. top: '15%',
  619. containLabel: true
  620. },
  621. xAxis: {
  622. type: 'category',
  623. boundaryGap: false,
  624. axisLabel: {
  625. rotate: 45,
  626. color: "#26e2fb",
  627. formatter:function(v){
  628. return v.split(',')[0]
  629. }
  630. },
  631. axisLine:{
  632. show:true
  633. },
  634. axisTick:{
  635. show:false,
  636. },
  637. data: times
  638. },
  639. yAxis: {
  640. type: 'value',
  641. nameTextStyle: {
  642. color: "#26e2fb"
  643. },
  644. axisLine:{
  645. show:true
  646. },
  647. axisTick:{
  648. show:false,
  649. },
  650. axisLabel: {
  651. color: "#26e2fb"
  652. },
  653. splitLine: {
  654. lineStyle: {
  655. color: "#7DA7CD",
  656. type: "dashed",
  657. width: 1
  658. }
  659. }
  660. },
  661. series: v_series
  662. };
  663. if(echartsEleIns_0!=null){
  664. echartsEleIns_0.dispose();
  665. }
  666. echartsEleIns_0 = echarts.init(t);
  667. echartsEleIns_0.setOption(opt);
  668. }
  669. function LoadJBPie(){
  670. //嫁动率
  671. const myChart = echarts.init(echarts1.value);
  672. // 配置项
  673. const option = {
  674. title: {
  675. text: '进度仪表盘',
  676. left: 'center',
  677. top: 'top',
  678. show:false,
  679. },
  680. tooltip: {
  681. formatter: '{a} <br/>{b} : {c}%'
  682. },
  683. series: [
  684. {
  685. name: '经编',
  686. type: 'gauge',
  687. startAngle: '90',
  688. endAngle: '-270',
  689. pointer: {
  690. show: false
  691. },
  692. progress: {
  693. show: true,
  694. itemStyle:{
  695. color:"#28c4d8"
  696. },
  697. roundCap: true, //圆角
  698. width: 8 // 进度条宽度
  699. },
  700. axisLine: {
  701. show:true,
  702. lineStyle: {
  703. width: 8, // 仪表盘宽度,
  704. color: [[1, '#052c45']] // 底色
  705. }
  706. },
  707. axisTick: {
  708. show: false // 隐藏刻度
  709. },
  710. splitLine: {
  711. show:false,
  712. length: 15, // 分割线长度
  713. lineStyle: {
  714. width: 2,
  715. color: '#999'
  716. }
  717. },
  718. axisLabel: {
  719. distance: 25,
  720. color: '#999',
  721. fontSize: 14,
  722. show:false,
  723. },
  724. data: [
  725. {
  726. value: deviceStatData.value.currYield.jb.jdl, // 初始进度值
  727. name: '当前嫁动率',
  728. title:{
  729. offsetCenter: [0, -15], // 位置调整,'50%' 表示垂直居中,0 表示水平居中(根据需要调整)
  730. color: '#27e6ff', // 文字颜色
  731. fontSize: 14*BODY_H_RATE // 文字大小
  732. },
  733. detail: {
  734. valueAnimation: true,
  735. offsetCenter: [0, 10],
  736. formatter: '{value}%',
  737. color: '#27e6ff', // 文字颜色
  738. fontSize: 24*BODY_H_RATE // 文字大小
  739. },
  740. }
  741. ]
  742. },
  743. {
  744. type: 'pie',
  745. radius: ['59%', '60.5%'],
  746. hoverAnimation: false,
  747. clockWise: false,
  748. tooltip:{
  749. show:false,
  750. },
  751. itemStyle: {
  752. normal: {
  753. shadowBlur: 20,
  754. shadowColor: 'rgba(0, 255, 255,.3)',
  755. color: '#008596',
  756. }
  757. },
  758. label: {
  759. show: false
  760. },
  761. data: [100]
  762. },
  763. ]
  764. };
  765. // 使用配置项渲染图表
  766. myChart.setOption(option);
  767. //开机率
  768. const kjOpt = {
  769. title: {
  770. text: '进度仪表盘',
  771. left: 'center',
  772. top: 'top',
  773. show:false,
  774. },
  775. tooltip: {
  776. formatter: '{a} <br/>{b} : {c}%'
  777. },
  778. series: [
  779. {
  780. name: '经编',
  781. type: 'gauge',
  782. startAngle: '90',
  783. endAngle: '-270',
  784. pointer: {
  785. show: false
  786. },
  787. progress: {
  788. show: true,
  789. itemStyle:{
  790. color:"#28c4d8"
  791. },
  792. roundCap: true, //圆角
  793. width: 8 // 进度条宽度
  794. },
  795. axisLine: {
  796. show:true,
  797. lineStyle: {
  798. width: 8, // 仪表盘宽度,
  799. color: [[1, '#052c45']] // 底色
  800. }
  801. },
  802. axisTick: {
  803. show: false // 隐藏刻度
  804. },
  805. splitLine: {
  806. show:false,
  807. length: 15, // 分割线长度
  808. lineStyle: {
  809. width: 2,
  810. color: '#999'
  811. }
  812. },
  813. axisLabel: {
  814. distance: 25,
  815. color: '#999',
  816. fontSize: 14,
  817. show:false,
  818. },
  819. data: [
  820. {
  821. value: deviceStatData.value.currYield.jb.openRatio, // 初始进度值
  822. name: '开机率',
  823. title:{
  824. offsetCenter: [0, -15], // 位置调整,'50%' 表示垂直居中,0 表示水平居中(根据需要调整)
  825. color: '#27e6ff', // 文字颜色
  826. fontSize: 14*BODY_H_RATE // 文字大小
  827. },
  828. detail: {
  829. valueAnimation: true,
  830. offsetCenter: [0, 10],
  831. formatter: '{value}%',
  832. color: '#27e6ff', // 文字颜色
  833. fontSize: 24*BODY_H_RATE // 文字大小
  834. },
  835. }
  836. ]
  837. },
  838. {
  839. type: 'pie',
  840. radius: ['59%', '60.5%'],
  841. hoverAnimation: false,
  842. clockWise: false,
  843. tooltip:{
  844. show:false,
  845. },
  846. itemStyle: {
  847. normal: {
  848. shadowBlur: 20,
  849. shadowColor: 'rgba(0, 255, 255,.3)',
  850. color: '#008596',
  851. }
  852. },
  853. label: {
  854. show: false
  855. },
  856. data: [100]
  857. },
  858. ]
  859. };
  860. const kj = echarts.init(echarts2.value);
  861. kj.setOption(kjOpt);
  862. }
  863. function LoadRZPie(){
  864. //嫁动率
  865. const myChart = echarts.init(echarts3.value);
  866. // 配置项
  867. const option = {
  868. title: {
  869. text: '进度仪表盘',
  870. left: 'center',
  871. top: 'top',
  872. show:false,
  873. },
  874. tooltip: {
  875. formatter: function(a){
  876. return a.seriesName+'<br>'+a.name+" : "+a.value/100*deviceStatData.value.currYield.rz.maxLine+'条';
  877. }
  878. },
  879. series: [
  880. {
  881. name: '染整',
  882. type: 'gauge',
  883. startAngle: '90',
  884. endAngle: '-270',
  885. pointer: {
  886. show: false
  887. },
  888. progress: {
  889. show: true,
  890. itemStyle:{
  891. color:"#28c4d8"
  892. },
  893. roundCap: true, //圆角
  894. width: 8 // 进度条宽度
  895. },
  896. axisLine: {
  897. show:true,
  898. lineStyle: {
  899. width: 8, // 仪表盘宽度,
  900. color: [[1, '#052c45']] // 底色
  901. }
  902. },
  903. axisTick: {
  904. show: false // 隐藏刻度
  905. },
  906. splitLine: {
  907. show:false,
  908. length: 15, // 分割线长度
  909. lineStyle: {
  910. width: 2,
  911. color: '#999'
  912. }
  913. },
  914. axisLabel: {
  915. distance: 25,
  916. color: '#999',
  917. fontSize: 14,
  918. show:false,
  919. },
  920. data: [
  921. {
  922. value: deviceStatData.value.currYield.rz.openLine/deviceStatData.value.currYield.rz.maxLine*100, // 初始进度值
  923. name: '开动产线',
  924. title:{
  925. offsetCenter: [0, -15], // 位置调整,'50%' 表示垂直居中,0 表示水平居中(根据需要调整)
  926. color: '#27e6ff', // 文字颜色
  927. fontSize: 14*BODY_H_RATE // 文字大小
  928. },
  929. detail: {
  930. valueAnimation: true,
  931. offsetCenter: [0, 10],
  932. formatter:function(v){
  933. return v/100*deviceStatData.value.currYield.rz.maxLine+'条'
  934. },
  935. color: '#27e6ff', // 文字颜色
  936. fontSize: 24*BODY_H_RATE // 文字大小
  937. },
  938. }
  939. ]
  940. },
  941. {
  942. type: 'pie',
  943. radius: ['59%', '60.5%'],
  944. hoverAnimation: false,
  945. clockWise: false,
  946. tooltip:{
  947. show:false,
  948. },
  949. itemStyle: {
  950. normal: {
  951. shadowBlur: 20,
  952. shadowColor: 'rgba(0, 255, 255,.3)',
  953. color: '#008596',
  954. }
  955. },
  956. label: {
  957. show: false
  958. },
  959. data: [100]
  960. },
  961. ]
  962. };
  963. // 使用配置项渲染图表
  964. myChart.setOption(option);
  965. //开机率
  966. const kjOpt = {
  967. title: {
  968. text: '进度仪表盘',
  969. left: 'center',
  970. top: 'top',
  971. show:false,
  972. },
  973. tooltip: {
  974. formatter: '{a} <br/>{b} : {c}%'
  975. },
  976. series: [
  977. {
  978. name: '染整',
  979. type: 'gauge',
  980. startAngle: '90',
  981. endAngle: '-270',
  982. pointer: {
  983. show: false
  984. },
  985. progress: {
  986. show: true,
  987. itemStyle:{
  988. color:"#28c4d8"
  989. },
  990. roundCap: true, //圆角
  991. width: 8 // 进度条宽度
  992. },
  993. axisLine: {
  994. show:true,
  995. lineStyle: {
  996. width: 8, // 仪表盘宽度,
  997. color: [[1, '#052c45']] // 底色
  998. }
  999. },
  1000. axisTick: {
  1001. show: false // 隐藏刻度
  1002. },
  1003. splitLine: {
  1004. show:false,
  1005. length: 15, // 分割线长度
  1006. lineStyle: {
  1007. width: 2,
  1008. color: '#999'
  1009. }
  1010. },
  1011. axisLabel: {
  1012. distance: 25,
  1013. color: '#999',
  1014. fontSize: 14,
  1015. show:false,
  1016. },
  1017. data: [
  1018. {
  1019. value: deviceStatData.value.currYield.rz.openRatio, // 初始进度值
  1020. name: '开机率',
  1021. title:{
  1022. offsetCenter: [0, -15], // 位置调整,'50%' 表示垂直居中,0 表示水平居中(根据需要调整)
  1023. color: '#27e6ff', // 文字颜色
  1024. fontSize: 14*BODY_H_RATE // 文字大小
  1025. },
  1026. detail: {
  1027. valueAnimation: true,
  1028. offsetCenter: [0, 10],
  1029. formatter: '{value}%',
  1030. color: '#27e6ff', // 文字颜色
  1031. fontSize: 24*BODY_H_RATE // 文字大小
  1032. },
  1033. }
  1034. ]
  1035. },
  1036. {
  1037. type: 'pie',
  1038. radius: ['59%', '60.5%'],
  1039. hoverAnimation: false,
  1040. clockWise: false,
  1041. tooltip:{
  1042. show:false,
  1043. },
  1044. itemStyle: {
  1045. normal: {
  1046. shadowBlur: 20,
  1047. shadowColor: 'rgba(0, 255, 255,.3)',
  1048. color: '#008596',
  1049. }
  1050. },
  1051. label: {
  1052. show: false
  1053. },
  1054. data: [100]
  1055. },
  1056. ]
  1057. };
  1058. const kj = echarts.init(echarts4.value);
  1059. kj.setOption(kjOpt);
  1060. }
  1061. function showStockTrend(type){
  1062. //iframeWinData.value = {class:'newwin bpbWin',src:'/stock-trend-fx#'+type,title:StockTypeName[type]+'库存趋势'};
  1063. //isShowIframeWin.value=true;
  1064. emit('OpenIframeWin',{class:'newwin bpbWin',src:'/stock-trend-fx#'+type,title:StockTypeName[type]+'库存趋势'});
  1065. }
  1066. function costTotalTrans(v){
  1067. if(v>10000) return (v/10000).toFixed(2);
  1068. return v;
  1069. }
  1070. function switchIndex(){
  1071. if(showIndexData.value=='index'){
  1072. router.push('/datamain');
  1073. }else{
  1074. router.push('/main');
  1075. }
  1076. }
  1077. onMounted(()=>{
  1078. clearTimeout(getDataTimer);
  1079. clearTimeout(getDataTimer1);
  1080. clearTimeout(getDataTimer2);
  1081. clearTimeout(getDataTimer3);
  1082. clearTimeout(getDataTimer4);
  1083. DataFull.GetFacData();
  1084. DataFull.GetDeviceStat();
  1085. backMasterViewByFac();
  1086. });
  1087. onUnmounted(()=>{
  1088. clearTimeout(getDataTimer);
  1089. clearTimeout(getDataTimer1);
  1090. clearTimeout(getDataTimer2);
  1091. clearTimeout(getDataTimer3);
  1092. clearTimeout(getDataTimer4);
  1093. if(player==null || player.Native==null) return;
  1094. (async ()=>{
  1095. let marklst = await player.Native.GisMarker.getMarkerList();
  1096. console.log('fac unmouned:',marklst)
  1097. if(marklst==null) return;
  1098. for(var i=0;i<marklst.length;i++){
  1099. if(player!=null && player.Native!=null)player.Native.GisMarker.destroy(marklst[i].id)
  1100. }
  1101. })();
  1102. });
  1103. return{
  1104. showIndexData,
  1105. btnFrontBg,
  1106. toolsBtnList,
  1107. backMasterViewByFac,
  1108. loadmarkers,
  1109. showStockTrend,
  1110. loadTools,
  1111. LoadSCLine,
  1112. LoadUsedLine,
  1113. isShowIframeWin,
  1114. iframeWinData,
  1115. markerLClickObj,
  1116. costTotalTrans,
  1117. getDataTimer,
  1118. getDataTimer1,
  1119. getDataTimer2,
  1120. getDataTimer3,
  1121. getDataTimer4,
  1122. deviceStatData,
  1123. echarts1,
  1124. echarts2,
  1125. echarts3,
  1126. echarts4,
  1127. echarts_sc_qushi,
  1128. echarts_used_qushi,
  1129. buttonCode1,
  1130. buttonCode2,
  1131. switchIndex,
  1132. }
  1133. }
  1134. }
  1135. </script>
  1136. <style scope="FAC">
  1137. .bg1{
  1138. z-index: 1; pointer-events: none;position: absolute;
  1139. top: calc(90px * var(--hRate));
  1140. left: 0;
  1141. width: 1877.54px;
  1142. height: 90%;
  1143. margin-left: 19px;
  1144. border: 2px solid #17666e;
  1145. border-top: 0px;
  1146. background:url('../../assets/image/bg.png');
  1147. -webkit-mask-image:radial-gradient(circle, transparent 40%, #ffffff 83%);
  1148. /*
  1149. background:url('../../assets/image//bg.png');
  1150. -webkit-mask-image:radial-gradient(circle, transparent 26%, #95afc5 54%);
  1151. background:
  1152. repeating-linear-gradient(
  1153. 45deg,
  1154. #ccc 0, #ccc 10px,
  1155. transparent 10px, transparent 20px
  1156. ),
  1157. repeating-linear-gradient(
  1158. -45deg,
  1159. #ccc 0, #ccc 10px,
  1160. transparent 10px, transparent 20px
  1161. );
  1162. background-size: 20px 20px;
  1163. */
  1164. }
  1165. .tools{
  1166. display: flex;
  1167. justify-content: center;
  1168. flex-flow: row;
  1169. top: calc(80px * var(--hRate)) !important;
  1170. width: 98.2%;
  1171. z-index: 11;
  1172. }
  1173. .tools .btn{
  1174. width: 100px !important;
  1175. height: 140px !important;
  1176. color: #1eabb7;
  1177. cursor: pointer;
  1178. font-size: 16px;
  1179. }
  1180. .tools .btn.active>div{
  1181. border: 2px solid #74b7c4 !important;
  1182. width: 66px;
  1183. height: 32px;
  1184. line-height: 32px;
  1185. box-shadow: 0px 0px 27px 2px rgb(225 208 208 / 67%);
  1186. background-color: #eeeff140;
  1187. border-radius: 5px;
  1188. }
  1189. .devicePanel{
  1190. position: absolute;top: 5%;left: 2%;width: 300px;height: 306px;z-index: 2;color: rgb(255, 255, 255);font-size: 18px;padding: 10px;border: 1px solid #b4a9e6;background: #1d476c1c;border-radius: 5px;box-shadow: 0px 0px 4px #5d7a94;
  1191. }
  1192. .deviceItem{
  1193. line-height: 35px;width:80%;display:inline-block;height: 60px;font-weight: bold;
  1194. }
  1195. .deviceDetailItem{
  1196. line-height: 20px;width:80%;display:inline-block;font-weight: normal;font-size: 14px;margin-left: 58px;color: #e1d7e8;
  1197. }
  1198. .precentBg{
  1199. width: 100%;height: 10px;display: inline-block;background: rgb(221 219 224);border-radius: 10px;
  1200. }
  1201. .productionPanel{
  1202. position: absolute;
  1203. top: 9%;
  1204. right: 5%;
  1205. width: 11%;
  1206. color: #fff;
  1207. font-size: 14px;
  1208. z-index: 2;
  1209. filter: blur(0px);
  1210. backdrop-filter: blur(5px);
  1211. /*border: 1px solid #b4a9e6;*/
  1212. /*background: #1d476c1c;*/
  1213. border-radius: 5px;
  1214. box-shadow: 0px 0px 10px #c1cce587;
  1215. /*transform: rotateZ(0deg) rotateX(20deg) rotateY(-58deg) skew(2deg);*/
  1216. }
  1217. .productionPanel .content{
  1218. background: transparent;padding: 5px;
  1219. }
  1220. .productionPanel .title{
  1221. text-align: center;width: 100%;font-weight: bold;line-height: 32px;font-size: 18px;color: #d6dce3;
  1222. }
  1223. .productionPanel .cyc{
  1224. border: 10px solid #2566ad;
  1225. border-radius: 50%;
  1226. height: 66px;
  1227. text-align: center;
  1228. width: 33%;
  1229. line-height: 66px;
  1230. background: #258cce;
  1231. font-size: 19px;
  1232. margin: 10px 29%;
  1233. }
  1234. </style>