visual.blade.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. @extends('layouts.app')
  2. @section('title')料箱分布 - 监视器@endsection
  3. @section('content')
  4. <div class="container-fluid d-none" id="container">
  5. <div class="row mt-5 mb-5 text-center">
  6. <div class="col-6 offset-3 row">
  7. <div class="col-1 bg-success"></div>
  8. <div class="col-1">空箱</div>
  9. <div class="col-1 bg-danger offset-5"></div>
  10. <div class="col-1">非空</div>
  11. </div>
  12. </div>
  13. <div class="row bg-dark">
  14. <div class="col-6 row mt-2 mb-2" v-for="(arr,i) in data">
  15. <div class="offset-1 col-10 row">
  16. <div style="width: 12.5%" v-for="(val,j) in arr">
  17. <div class="progress mr-2" v-if="val===undefined">
  18. <div class="w-100 text-center d-inline-block"><i class="fa fa-spinner fa-pulse"></i></div>
  19. </div>
  20. <div class="progress mr-2" style="cursor: pointer" v-else @click="loadDetail(i,j)">
  21. <div class="progress-bar bg-danger" :style="{width:(100-val)+'%'}">@{{(100-val)+'%'}}</div>
  22. <div class="progress-bar bg-success" :style="{width:val+'%'}">@{{ val+'%' }}</div>
  23. </div>
  24. </div>
  25. </div>
  26. </div>
  27. </div>
  28. @include("station.monitor._loadDetail")
  29. </div>
  30. @endsection
  31. @section('lastScript')
  32. <script>
  33. new Vue({
  34. el:"#container",
  35. data:{
  36. rowSize:8, //单排大小:X列
  37. columnSize:4,//单列大小 X竖
  38. heightSize:10,//高度大小 X行
  39. maxLoadSize:18,//最大加载大小 X排
  40. data:[],//数据池
  41. prefix:"HAI",
  42. mapping:[],
  43. details:{}, //详情池
  44. detail:[], //当前详情
  45. loadStatus:false,
  46. },
  47. mounted() {
  48. let data = [];
  49. for (let i=this.maxLoadSize;i>0;i--){
  50. let arr = [];
  51. for (let j=0;j<this.rowSize;j++){
  52. arr.push(undefined);
  53. }
  54. data.push(arr);
  55. this.loadData(i,data.length);
  56. }
  57. this.data = data;
  58. $("#container").removeClass("d-none");
  59. },
  60. methods:{
  61. loadData(row,index){
  62. let size = this.rowSize*this.columnSize;
  63. if (row%2!==0)size *= 2;
  64. row = row/2;
  65. let len = row.toString().length;
  66. let before = "00";
  67. let location = (this.prefix+(len===2 ? (Math.ceil(row)).toString() :
  68. before.substr(0,2-len)+(Math.ceil(row)).toString()))+'-';
  69. let arr = [];
  70. let temp = [];
  71. for (let i=size-(this.rowSize*this.columnSize)+1;i<=size;i++){
  72. temp.push(location+(before.substr(0,3-(i.toString().length))+i.toString())+"-%");
  73. if (i%this.columnSize===0){arr.push(temp);temp = [];}
  74. }
  75. this.mapping.push(arr);
  76. window.tempTip.postBasicRequest("{{url('station/monitor/visual/getData')}}",{arr:arr},res=>{
  77. this.$set(this.data,index-1,res);
  78. });
  79. },
  80. loadDetail(index,j){
  81. $("#modal").modal('show');
  82. let key = index+'-'+j;
  83. if (this.details[key]){ //缓存池存在取缓存池 转为即时后关闭缓存池即可
  84. this.detail = this.details[key];
  85. return;
  86. }
  87. let arr = this.mapping[index][j];
  88. let res = []; //扁平化的库位参数 一维数组
  89. let before = "00";//前缀
  90. let maxLen = 2;//最大高度 位数
  91. let rowIndex = 0;//行下标记录
  92. let mapping = {};//库位与数据池的下标映射
  93. let detail = [];//数据池
  94. for (let i=this.heightSize;i>0;i--){
  95. let columnIndex = 0;//列下标记录
  96. let detailTemp = [];//数据池第二维数组
  97. let suffix = i.toString().length<maxLen ? before.substr(0,maxLen-i.toString().length)+i.toString() : i.toString();
  98. for (let k=arr.length-1;k>=0;k--){
  99. let val = arr[k].substr(0,arr[k].length-1)+suffix;
  100. res.push(val);
  101. detailTemp.push({location:val,status:undefined});
  102. mapping[val] = [rowIndex,columnIndex];
  103. columnIndex++;
  104. }
  105. detail.push(detailTemp);
  106. rowIndex++;
  107. }//用对象将数据池结构组装占位,用mapping来映射库位与其应在数据池内的实际下标,拿到真实数据后根据映射进行填充
  108. this.loadStatus = true;//开启加载动画
  109. //启异步请求数据
  110. window.tempTip.postBasicRequest("{{url('station/monitor/visual/getDetail')}}",{arr:res},res=>{
  111. if (res){
  112. res.forEach(obj=>{
  113. if (mapping[obj.location]){
  114. detail[mapping[obj.location][0]][mapping[obj.location][1]] = obj;
  115. }
  116. });//真实数据查找映射填充
  117. }
  118. this.detail = detail;//扔进当前详情列表
  119. this.details[key] = detail;//缓存结果
  120. setTimeout(()=>{
  121. this.details[key] = undefined;
  122. },1800000);//缓存池半小时后清除
  123. this.loadStatus = false;//加载完毕
  124. });
  125. },
  126. }
  127. });
  128. </script>
  129. @endsection