Fac.vue 54 KB

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