消毒机设备
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

313 lines
8.6 KiB

2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
1 month ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
  1. <script lang="ts" setup>
  2. import homeLiquid from 'assets/images/home/home-liquid.svg'
  3. import Environment from 'components/home/Environment.vue'
  4. import HomeFormula from 'components/home/HomeFormula.vue'
  5. import HomeLogLevel from 'components/home/HomeLogLevel.vue'
  6. import HomeOperation from 'components/home/HomeOperation.vue'
  7. import HomeSetting from 'components/home/HomeSetting.vue'
  8. import { useDeviceStore } from 'stores/deviceStore'
  9. import { useHomeStore } from 'stores/homeStore'
  10. import { useLiquidStore } from 'stores/liquidStore'
  11. import { computed, onMounted, ref, watchEffect } from 'vue'
  12. import { useRoute } from 'vue-router'
  13. import { roundNumber } from '@/libs/utils'
  14. import { useFormulaStore } from '@/stores/formulaStore'
  15. import { useSystemStore } from '@/stores/systemStore'
  16. const route = useRoute()
  17. const homeStore = useHomeStore()
  18. const deviceStore = useDeviceStore()
  19. const liquidStore = useLiquidStore()
  20. const formulaStore = useFormulaStore()
  21. const systemStore = useSystemStore()
  22. const environmentParams = ref<Home.DisplayrelyMgrParams>(homeStore.h2O2SensorData[0])
  23. const liquidInfo = ref<Liquid.LiquidData>(liquidStore.liquidStateData)
  24. const liquidTotal = ref<number>(liquidStore.liquidTotal)
  25. const formulaInfo = ref()
  26. const loading = ref(false)
  27. onMounted(() => {
  28. watchEffect(() => {
  29. formulaInfo.value = formulaStore.currentSelectedFormulaInfo
  30. liquidTotal.value = liquidStore.liquidTotal
  31. liquidInfo.value = liquidStore.liquidStateData
  32. loading.value = systemStore.loading
  33. if (homeStore.h2O2SensorData && homeStore.h2O2SensorData.length) {
  34. styles.value = computedStyle()
  35. // console.log('homeStore.h2O2SensorData', homeStore.h2O2SensorData)
  36. environmentParams.value = {
  37. ...homeStore.h2O2SensorData[0],
  38. title: '仓内',
  39. type: 'inside',
  40. }
  41. }
  42. })
  43. })
  44. // 当前消毒液余量百分比
  45. const nowLiquidProgress = computed(() => {
  46. if (!liquidInfo.value.nowLiquid) {
  47. return 0
  48. }
  49. return roundNumber(Number((liquidInfo.value.nowLiquid / liquidTotal.value) * 100), 0)
  50. })
  51. // 当前消毒液余量
  52. const nowLiquid = computed(() => {
  53. return roundNumber(liquidInfo.value.nowLiquid, 0)
  54. })
  55. const styles = ref<any>({
  56. gridTemplateColumns: 'repeat(2, 1fr)',
  57. gridTemplateRows: 'repeat(2, 1fr)',
  58. })
  59. const computedStyle = () => {
  60. // console.log('homeStore.h2O2SensorData', homeStore.h2O2SensorData.length)
  61. if (__DEVICE_TYPE__ === deviceStore.deviceTypeMap.LargeSpaceDM_B) {
  62. if (homeStore.h2O2SensorData.length === 1) {
  63. return {
  64. gridTemplateColumns: 'repeat(1, 1fr)',
  65. gridTemplateRows: 'repeat(1, 1fr)',
  66. }
  67. }
  68. if (homeStore.h2O2SensorData.length === 2) {
  69. return {
  70. gridTemplateColumns: 'repeat(1, 1fr)',
  71. gridTemplateRows: 'repeat(2, 1fr)',
  72. }
  73. }
  74. if (homeStore.h2O2SensorData.length === 3) {
  75. return {
  76. gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))',
  77. gridTemplateRows: 'repeat(2, 1fr)',
  78. justifyContent: 'center',
  79. }
  80. }
  81. if (homeStore.h2O2SensorData.length === 4) {
  82. return {
  83. gridTemplateColumns: 'repeat(2, 1fr)',
  84. gridTemplateRows: 'repeat(2, 1fr)',
  85. }
  86. }
  87. if (homeStore.h2O2SensorData.length === 5) {
  88. return {
  89. gridTemplateColumns: 'repeat(3, 1fr)',
  90. gridTemplateRows: 'repeat(2, 1fr)',
  91. justifyContent: 'center',
  92. }
  93. }
  94. if (homeStore.h2O2SensorData.length === 6) {
  95. return {
  96. gridTemplateColumns: 'repeat(3, 1fr)',
  97. gridTemplateRows: 'repeat(2, 1fr)',
  98. }
  99. }
  100. }
  101. else {
  102. if (homeStore.h2O2SensorData.length === 1) {
  103. return {
  104. gridTemplateColumns: 'repeat(1, 1fr)',
  105. gridTemplateRows: 'repeat(2, 1fr)',
  106. }
  107. }
  108. if (homeStore.h2O2SensorData.length === 2) {
  109. return {
  110. gridTemplateColumns: 'repeat(2, 1fr)',
  111. gridTemplateRows: 'repeat(2, 1fr)',
  112. }
  113. }
  114. if (homeStore.h2O2SensorData.length === 3) {
  115. return {
  116. gridTemplateColumns: 'repeat(2, 1fr)',
  117. gridTemplateRows: 'repeat(2, 1fr)',
  118. }
  119. }
  120. if (homeStore.h2O2SensorData.length === 4) {
  121. return {
  122. gridTemplateColumns: 'repeat(3, 1fr)',
  123. gridTemplateRows: 'repeat(2, 1fr)',
  124. }
  125. }
  126. if (homeStore.h2O2SensorData.length === 5) {
  127. return {
  128. gridTemplateColumns: 'repeat(3, 1fr)',
  129. gridTemplateRows: 'repeat(2, 1fr)',
  130. justifyContent: 'center',
  131. }
  132. }
  133. if (homeStore.h2O2SensorData.length === 6) {
  134. return {
  135. gridTemplateColumns: 'repeat(3, 1fr)',
  136. gridTemplateRows: 'repeat(3, 1fr)',
  137. }
  138. }
  139. }
  140. }
  141. </script>
  142. <template>
  143. <div v-loading="loading" class="home">
  144. <div v-if="route.path === '/home'" class="home-grid-container">
  145. <div class="home-left" :style="styles">
  146. <el-card
  147. v-if="__DEVICE_TYPE__ !== deviceStore.deviceTypeMap.LargeSpaceDM_B"
  148. class="card"
  149. :class="{
  150. 'card-center-1':
  151. __DEVICE_TYPE__ !== deviceStore.deviceTypeMap.LargeSpaceDM_B && homeStore.h2O2SensorData.length === 2,
  152. 'card-center-2':
  153. __DEVICE_TYPE__ !== deviceStore.deviceTypeMap.LargeSpaceDM_B && homeStore.h2O2SensorData.length === 4,
  154. }"
  155. >
  156. <template #default>
  157. <!-- <div class="title-line" /> -->
  158. <div class="card-title-name">
  159. <img :src="homeLiquid"> 消毒液
  160. </div>
  161. <div class="card-progress">
  162. <div class="card-progress-content">
  163. <el-progress :text-inside="true" :stroke-width="35" :percentage="nowLiquidProgress" />
  164. </div>
  165. </div>
  166. <div class="card-num-g">
  167. {{ nowLiquid }}g
  168. </div>
  169. </template>
  170. </el-card>
  171. <el-card
  172. v-for="(item, index) in homeStore.h2O2SensorData"
  173. :key="item.sensorId"
  174. class="card"
  175. :class="{
  176. 'card-center-1':
  177. index === 0
  178. && __DEVICE_TYPE__ === deviceStore.deviceTypeMap.LargeSpaceDM_B
  179. && homeStore.h2O2SensorData.length === 3,
  180. 'card-center-2':
  181. index === 0
  182. && __DEVICE_TYPE__ !== deviceStore.deviceTypeMap.LargeSpaceDM_B
  183. && homeStore.h2O2SensorData.length === 5,
  184. }"
  185. >
  186. <Environment :env-params="item" />
  187. </el-card>
  188. </div>
  189. <div class="home-grid-item home-right">
  190. <!-- 正在进行的配方 -->
  191. <div class="top">
  192. <HomeFormula />
  193. </div>
  194. <div class="middle">
  195. <!-- 选择消毒的等级 -->
  196. <HomeLogLevel v-if="formulaStore.isDefaultFormula" />
  197. <!-- 开始消毒停止消毒及状态区 -->
  198. <HomeOperation />
  199. </div>
  200. <!-- 消毒设置 -->
  201. <div class="bottom">
  202. <HomeSetting />
  203. </div>
  204. </div>
  205. </div>
  206. <div v-else>
  207. <router-view />
  208. </div>
  209. </div>
  210. </template>
  211. <style lang="scss" scoped>
  212. $input-height: 3rem;
  213. .home {
  214. width: 100%;
  215. height: 100%;
  216. }
  217. .home-grid-container {
  218. height: 100%;
  219. width: 100%;
  220. display: grid;
  221. grid-template-columns: 2fr 1fr;
  222. gap: 10px;
  223. }
  224. .home-left {
  225. height: 100%;
  226. display: grid;
  227. gap: 10px;
  228. .card {
  229. text-align: center;
  230. width: 100%;
  231. height: 100%;
  232. border: 1px solid rgb(225, 225, 225);
  233. position: relative;
  234. border-radius: 10px 10px 10px 10px;
  235. background: #ffffff;
  236. background: linear-gradient(180deg, rgba(147, 203, 255, 1) -190%, #ffffff 24%);
  237. .title-line {
  238. height: 1vw;
  239. background-color: #b3d9ff;
  240. position: absolute;
  241. width: 100%;
  242. border-radius: 10px 10px 0 0;
  243. margin: -2.12rem;
  244. }
  245. .card-title-name {
  246. display: flex;
  247. align-items: center;
  248. gap: 10px;
  249. font-size: 20px;
  250. padding: 1rem;
  251. }
  252. .card-progress {
  253. display: flex;
  254. justify-content: center;
  255. margin-top: 3rem;
  256. .card-progress-content {
  257. width: 92%;
  258. }
  259. }
  260. .card-num-g {
  261. margin-top: 3.5vw;
  262. font-size: 26px;
  263. font-weight: bold;
  264. }
  265. }
  266. }
  267. .home-right {
  268. background: linear-gradient(180deg, rgba(147, 203, 255, 1) -190%, #ffffff 24%);
  269. border-radius: 10px;
  270. box-shadow: 0 1px 5px 0 rgba(9, 39, 62, 0.15);
  271. display: flex;
  272. flex-direction: column;
  273. justify-content: space-between;
  274. }
  275. .middle {
  276. display: flex;
  277. flex-direction: column;
  278. gap: 16px;
  279. }
  280. .el-button {
  281. background-color: #2892f3 !important;
  282. }
  283. .card-center-1 {
  284. grid-column: 1 / -1; // 占据整行
  285. justify-self: center; // 横向居中
  286. }
  287. .card-center-2 {
  288. grid-column: 1 / 3; // 占据整行
  289. justify-self: center; // 横向居中
  290. }
  291. :deep(.el-card__body) {
  292. height: 100%;
  293. }
  294. </style>