消毒机设备
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.

305 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 (deviceStore.deviceInfo.deviceType === 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="deviceStore.deviceInfo.deviceType !== deviceStore.deviceTypeMap.LargeSpaceDM_B"
  148. class="card"
  149. :class="{
  150. 'card-center-1': deviceStore.deviceInfo.deviceType !== deviceStore.deviceTypeMap.LargeSpaceDM_B && homeStore.h2O2SensorData.length === 2,
  151. 'card-center-2': deviceStore.deviceInfo.deviceType !== deviceStore.deviceTypeMap.LargeSpaceDM_B && homeStore.h2O2SensorData.length === 4,
  152. }"
  153. >
  154. <template #default>
  155. <!-- <div class="title-line" /> -->
  156. <div class="card-title-name">
  157. <img :src="homeLiquid"> 消毒液
  158. </div>
  159. <div class="card-progress">
  160. <div class="card-progress-content">
  161. <el-progress :text-inside="true" :stroke-width="35" :percentage="nowLiquidProgress" />
  162. </div>
  163. </div>
  164. <div class="card-num-g">
  165. {{ nowLiquid }}g
  166. </div>
  167. </template>
  168. </el-card>
  169. <el-card
  170. v-for="(item, index) in homeStore.h2O2SensorData"
  171. :key="item.sensorId"
  172. class="card"
  173. :class="{
  174. 'card-center-1': index === 0 && deviceStore.deviceInfo.deviceType !== deviceStore.deviceTypeMap.LargeSpaceDM_B && homeStore.h2O2SensorData.length === 3,
  175. 'card-center-2': index === 0 && deviceStore.deviceInfo.deviceType !== deviceStore.deviceTypeMap.LargeSpaceDM_B && homeStore.h2O2SensorData.length === 5,
  176. }"
  177. >
  178. <Environment :env-params="item" />
  179. </el-card>
  180. </div>
  181. <div class="home-grid-item home-right">
  182. <!-- 正在进行的配方 -->
  183. <div class="top">
  184. <HomeFormula />
  185. </div>
  186. <div class="middle">
  187. <!-- 选择消毒的等级 -->
  188. <HomeLogLevel v-if="formulaStore.isDefaultFormula" />
  189. <!-- 开始消毒停止消毒及状态区 -->
  190. <HomeOperation />
  191. </div>
  192. <!-- 消毒设置 -->
  193. <div class="bottom">
  194. <HomeSetting />
  195. </div>
  196. </div>
  197. </div>
  198. <div v-else>
  199. <router-view />
  200. </div>
  201. </div>
  202. </template>
  203. <style lang="scss" scoped>
  204. $input-height: 3rem;
  205. .home {
  206. width: 100%;
  207. height: 100%;
  208. }
  209. .home-grid-container {
  210. height: 100%;
  211. width: 100%;
  212. display: grid;
  213. grid-template-columns: 2fr 1fr;
  214. gap: 10px;
  215. }
  216. .home-left {
  217. height: 100%;
  218. display: grid;
  219. gap: 10px;
  220. .card {
  221. text-align: center;
  222. width: 100%;
  223. height: 100%;
  224. border: 1px solid rgb(225, 225, 225);
  225. position: relative;
  226. border-radius: 10px 10px 10px 10px;
  227. background: #ffffff;
  228. background: linear-gradient(180deg, rgba(147, 203, 255, 1) -190%, #ffffff 24%);
  229. .title-line {
  230. height: 1vw;
  231. background-color: #b3d9ff;
  232. position: absolute;
  233. width: 100%;
  234. border-radius: 10px 10px 0 0;
  235. margin: -2.12rem;
  236. }
  237. .card-title-name {
  238. display: flex;
  239. align-items: center;
  240. gap: 10px;
  241. font-size: 20px;
  242. padding: 1rem;
  243. }
  244. .card-progress {
  245. display: flex;
  246. justify-content: center;
  247. margin-top: 3rem;
  248. .card-progress-content {
  249. width: 92%;
  250. }
  251. }
  252. .card-num-g {
  253. margin-top: 3.5vw;
  254. font-size: 26px;
  255. font-weight: bold;
  256. }
  257. }
  258. }
  259. .home-right {
  260. background: linear-gradient(180deg, rgba(147, 203, 255, 1) -190%, #ffffff 24%);
  261. border-radius: 10px;
  262. box-shadow: 0 1px 5px 0 rgba(9, 39, 62, 0.15);
  263. display: flex;
  264. flex-direction: column;
  265. justify-content: space-between;
  266. }
  267. .middle {
  268. display: flex;
  269. flex-direction: column;
  270. gap: 16px;
  271. }
  272. .el-button {
  273. background-color: #2892f3 !important;
  274. }
  275. .card-center-1 {
  276. grid-column: 1 / -1; // 占据整行
  277. justify-self: center; // 横向居中
  278. }
  279. .card-center-2 {
  280. grid-column: 1 / 3; // 占据整行
  281. justify-self: center; // 横向居中
  282. }
  283. :deep(.el-card__body) {
  284. height: 100%;
  285. }
  286. </style>