TankDeviceDetails.cshtml 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. 
  2. <div id="TankDeviceDetails">
  3. <div class="tank-subcontent">
  4. <div class="title" v-if="currentTank!=null">{{currentTank.TankNumber}}号油罐 &nbsp; &nbsp; {{currentTank.Product.ProductLabel}}</div>
  5. <div class="left" v-if="currentTank!=null">
  6. <div class="text">实时油量:{{tankReading.Volume | numFilter}}升</div>
  7. <div class="text">剩余空间:{{tankReading.Ullage | numFilter}}升</div>
  8. <div class="text">实时油温:{{tankReading.Temperature | numFilter}}℃</div>
  9. <div class="text">温度补偿油量:{{tankReading.TcVolume | numFilter}}升</div>
  10. <div class="text">实时水量:{{tankReading.WaterVolume | numFilter}}升</div>
  11. <div class="text">油罐容量:{{currentTank.Limit.FullVolume | numFilter}}升</div>
  12. <div class="text">油罐直径:{{currentTank.Diameter | numFilter}}mm</div>
  13. <div class="text">上一次入库量:{{tankReading.LastDelivery | numFilter}}升</div>
  14. </div>
  15. <div class="center" ref="centerdiv">
  16. <div class="tank_text">实时油位:{{tankReading.Height | numFilter}}mm</div>
  17. <canvas ref="canvasRef" />
  18. <div class="tank_text">实时水位:{{tankReading.Water | numFilter}}mm</div>
  19. </div>
  20. <div class="right">
  21. <div class="color_text" :style="{'border-left-color': limitData.MaxVolume.color}">容量上限:{{limitData.MaxVolume.height}}升</div>
  22. <div class="color_text" :style="{'border-left-color': limitData.HighProduct.color}">高油位警报:{{limitData.HighProduct.height}}%</div>
  23. <div class="color_text" :style="{'border-left-color': limitData.HighWaterWarning.color}">过量装载:{{limitData.HighWaterWarning.height}}%</div>
  24. <div class="color_text" :style="{'border-left-color': limitData.HighWaterAlarm.color}">高水位警报:{{limitData.HighWaterAlarm.height}}mm</div>
  25. <div class="color_text" :style="{'border-left-color': limitData.FullVolume.color}">高水位预警:{{limitData.FullVolume.height}}mm</div>
  26. <div class="color_text" :style="{'border-left-color': limitData.FuelTemperatureLowLimit.color}">低容量预警:{{limitData.FuelTemperatureLowLimit.height}}升</div>
  27. <div class="color_text" :style="{'border-left-color': limitData.FuelTemperatureHighLimit.color}">入油报警:{{limitData.FuelTemperatureHighLimit.height}}%</div>
  28. </div>
  29. </div>
  30. </div>
  31. <script type="text/javascript">
  32. var vm = new Vue({
  33. el: '#TankDeviceDetails',
  34. data: {
  35. currentTank: null,
  36. tankReading: {},
  37. limitData: {
  38. MaxVolume: { height: 360, color: '#891818' },
  39. HighProduct: { height: 330, color: '#f06939' },
  40. HighWaterWarning: { height: 300, color: '#e71828' },
  41. HighWaterAlarm: { height: 270, color: '#1959a7' },
  42. FullVolume: { height: 158, color: '#29bbb7' },
  43. FuelTemperatureLowLimit: { height: 60, color: '#fe18fe' },
  44. FuelTemperatureHighLimit: { height: 30, color: '#e3d718' },
  45. heightRatio: 0.1
  46. },
  47. canvasData: {
  48. 'offset': 3,
  49. 'canvas': null,
  50. 'context': null,
  51. circle: { 'centerDot': 0, 'radius': 0, 'diameter': 0 }
  52. },
  53. canvasWidth: 0
  54. },
  55. mounted() {
  56. this.canvasWidth = this.$refs.centerdiv.clientWidth
  57. this.initCanvas()
  58. },
  59. watch: {
  60. canvasWidth(newValue) {
  61. this.initCanvas()
  62. },
  63. tankReading: {
  64. handler(newValue, oldValue) {
  65. if (this.currentTank) {
  66. this.limitData.heightRatio = this.canvasWidth / this.currentTank.Diameter
  67. this.drawTank()
  68. }
  69. },
  70. deep: true
  71. }
  72. },
  73. filters: {
  74. numFilter(value) {
  75. let realVal = ''
  76. if (!isNaN(value) && value !== '') {
  77. realVal = parseFloat(value).toFixed(2)
  78. } else {
  79. realVal = 'N/A'
  80. }
  81. return realVal
  82. }
  83. },
  84. methods: {
  85. initCanvas() {
  86. this.canvasData.canvas = this.$refs.canvasRef
  87. this.canvasData.canvas.width = this.canvasWidth
  88. this.canvasData.canvas.height = this.canvasWidth
  89. this.canvasData.circle.centerDot = this.canvasWidth / 2
  90. this.canvasData.circle.radius = this.canvasData.circle.centerDot - this.canvasData.offset
  91. this.canvasData.circle.diameter = this.canvasData.circle.radius + this.canvasData.circle.radius
  92. this.canvasData.context = this.canvasData.canvas.getContext('2d')
  93. },
  94. drawTank() {
  95. let productHeight = this.tankReading.Height * this.limitData.heightRatio
  96. let waterHeight = this.tankReading.Water * this.limitData.heightRatio
  97. this.canvasData.canvas.width = this.canvasWidth
  98. this.canvasData.context.fillStyle = '#DEB887'
  99. this.canvasData.context.fillRect(this.canvasData.offset, this.canvasWidth - productHeight - this.canvasData.offset, this.canvasData.circle.diameter, productHeight - waterHeight)
  100. this.canvasData.context.fillStyle = '#6495ED'
  101. this.canvasData.context.fillRect(this.canvasData.offset, this.canvasWidth - waterHeight - this.canvasData.offset, this.canvasData.circle.diameter, waterHeight)
  102. if (this.limitData.MaxVolume) {
  103. this.drawLine()
  104. }
  105. this.canvasData.context.beginPath()
  106. this.canvasData.context.lineWidth = 6
  107. this.canvasData.context.setLineDash([])
  108. this.canvasData.context.strokeStyle = '#505455'
  109. this.canvasData.context.arc(this.canvasData.circle.centerDot, this.canvasData.circle.centerDot, this.canvasData.circle.radius, 0, Math.PI * 2, false)
  110. this.canvasData.context.stroke()
  111. this.canvasData.context.globalCompositeOperation = 'destination-in'
  112. this.canvasData.context.arc(this.canvasData.circle.centerDot, this.canvasData.circle.centerDot, this.canvasData.circle.radius, 0, Math.PI * 2, false)
  113. this.canvasData.context.fill()
  114. },
  115. drawLine() {
  116. for (let key in this.limitData) {
  117. let height = this.limitData[key].height
  118. let color = this.limitData[key].color
  119. let line = Math.sqrt(Math.pow(this.canvasData.circle.radius, 2) - Math.pow(this.canvasData.circle.radius - height, 2))
  120. this.canvasData.context.beginPath()
  121. this.canvasData.context.lineWidth = 2
  122. this.canvasData.context.setLineDash([15, 10])
  123. this.canvasData.context.strokeStyle = color
  124. this.canvasData.context.moveTo(this.canvasData.circle.centerDot - line, this.canvasWidth - height - this.canvasData.offset)
  125. this.canvasData.context.lineTo(this.canvasData.circle.centerDot + line, this.canvasWidth - height - this.canvasData.offset)
  126. this.canvasData.context.stroke()
  127. }
  128. }
  129. }
  130. })
  131. function OnReply(topic, jsonObj) {
  132. let path = '/sys/VeederRoot_ATG_Console_Tcp/VeederRoot_ATG_Console.Handler/thing/service/'
  133. let tankIndex = "@ViewBag.tankIndex"
  134. if (topic === path + 'GetTanksAsync_reply') {
  135. vm.currentTank = jsonObj[tankIndex]
  136. Publish2('[' + vm.currentTank.TankNumber + ']', path + 'GetTankReadingAsync')
  137. } else if (topic === path + 'GetTankReadingAsync_reply') {
  138. vm.tankReading = jsonObj
  139. }
  140. }
  141. </script>
  142. <style scoped>
  143. .title {
  144. position: absolute;
  145. top: 3.9%;
  146. width: 100%;
  147. font-size: 1.4rem;
  148. text-align: center;
  149. background-color: transparent;
  150. }
  151. .left {
  152. position: absolute;
  153. top: 15%;
  154. left: 6%;
  155. width: 23%;
  156. background-color: transparent;
  157. }
  158. .center {
  159. position: absolute;
  160. top: 15%;
  161. left: 36%;
  162. width: 30%;
  163. text-align: center;
  164. background-color: transparent;
  165. }
  166. .right {
  167. position: absolute;
  168. top: 15%;
  169. right: 6%;
  170. width: 23%;
  171. background-color: transparent;
  172. }
  173. .text {
  174. margin: 6% 0;
  175. font-size: 1.1rem;
  176. }
  177. .tank_text {
  178. margin: 0.8% 0;
  179. font-size: 1.1rem;
  180. }
  181. .color_text {
  182. margin: 8% 0;
  183. padding-left: 2%;
  184. font-size: 1.1rem;
  185. border-style: none none none solid;
  186. border-left: thick solid black;
  187. }
  188. </style>