大空间消毒机
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.

833 lines
20 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. <template>
  2. <div class="device_container">
  3. <div class="row_wrap">
  4. <p class="title">注射蠕动泵速率(g/min)</p>
  5. <p class="num">
  6. <my-input type="number" class="field_font" theme="custom" close-text="配置"
  7. v-model:value="sprayLiquidConfigVal"
  8. :formatter="formatter7"
  9. @done="setSprayLiquidVal"
  10. ></my-input>
  11. </p>
  12. </div>
  13. <div class="row_wrap">
  14. <p class="title">消毒停止过氧化氢浓度(ppm)</p>
  15. <p class="num">
  16. <my-input type="number" class="field_font" theme="custom" close-text="配置"
  17. v-model:value="stoped_gs"
  18. :formatter="formatter1"
  19. @done="setStopedGsVal"
  20. ></my-input>
  21. </p>
  22. </div>
  23. <div class="row_wrap">
  24. <p class="title">消毒继续过氧化氢浓度(ppm)</p>
  25. <p class="num">
  26. <my-input type="number" class="field_font" theme="custom" close-text="配置"
  27. v-model:value="continued_gs"
  28. :formatter="formatter2"
  29. @done="setcontinuedGsVal"
  30. ></my-input>
  31. </p>
  32. </div>
  33. <div class="row_wrap">
  34. <p class="title">消毒停止相对湿度(%RH)</p>
  35. <p class="num">
  36. <my-input type="number" class="field_font" theme="custom" close-text="配置"
  37. v-model:value="stoped_humi"
  38. :formatter="formatter9"
  39. @done="setstoped_humiVal"
  40. ></my-input>
  41. </p>
  42. </div>
  43. <div class="row_wrap">
  44. <p class="title">消毒继续相对湿度(%RH)</p>
  45. <p class="num">
  46. <my-input type="number" class="field_font" theme="custom" close-text="配置"
  47. v-model:value="continued_humi"
  48. :formatter="formatter10"
  49. @done="setcontinued_humiVal"
  50. ></my-input>
  51. </p>
  52. </div>
  53. <div class="row_wrap">
  54. <p class="title">消毒停止过氧化氢相对饱和度(%RS)</p>
  55. <p class="num">
  56. <my-input type="number" class="field_font" theme="custom" close-text="配置"
  57. v-model:value="stoped_satur"
  58. :formatter="formatter3"
  59. @done="setstopedSaturVal"
  60. ></my-input>
  61. </p>
  62. </div>
  63. <div class="row_wrap">
  64. <p class="title">消毒继续过氧化氢相对饱和度(%RS)</p>
  65. <p class="num">
  66. <my-input type="number" class="field_font" theme="custom" close-text="配置"
  67. v-model:value="continued_satur"
  68. :formatter="formatter4"
  69. @done="setContinuedSaturVal"
  70. ></my-input>
  71. </p>
  72. </div>
  73. <div class="row_wrap" @click="showLogPicker">
  74. <p class="title">Log等级</p>
  75. <div class="num">
  76. <p class="log">{{ logVal }}</p>
  77. </div>
  78. </div>
  79. <div class="row_wrap">
  80. <p class="title">配方名称</p>
  81. <div>
  82. <input
  83. id="id_formula"
  84. v-model="formula_id"
  85. class="formula_input"
  86. placeholder="请输入配方名称"
  87. type="text"
  88. name=""
  89. />
  90. </div>
  91. </div>
  92. <van-number-keyboard
  93. v-model="addLiquidConfigVal"
  94. :title="addLiquidConfigVal"
  95. :show="addLiquidConfigValShow"
  96. @input="val => handleInput(val, 1)"
  97. theme="custom"
  98. close-button-text="配置"
  99. @close="setAddliquidVal"
  100. @blur="addLiquidConfigValShow = false"
  101. />
  102. <van-number-keyboard
  103. v-model="sprayLiquidConfigVal"
  104. @input="val => handleInput(val, 2)"
  105. :title="sprayLiquidConfigVal"
  106. :show="sprayLiquidConfigValShow"
  107. theme="custom"
  108. @close="setSprayLiquidVal"
  109. close-button-text="配置"
  110. @blur="sprayLiquidConfigValShow = false"
  111. />
  112. <van-number-keyboard
  113. v-model="stoped_gs"
  114. @input="val => handleInput(val, 3)"
  115. :title="stoped_gs"
  116. :show="stoped_gsShow"
  117. theme="custom"
  118. @close="setStopedGsVal"
  119. close-button-text="配置"
  120. @blur="stoped_gsShow = false"
  121. />
  122. <van-number-keyboard
  123. v-model="continued_gs"
  124. @input="val => handleInput(val, 4)"
  125. :title="continued_gs"
  126. @close="setcontinuedGsVal"
  127. :show="continued_gsShow"
  128. theme="custom"
  129. close-button-text="配置"
  130. @blur="continued_gsShow = false"
  131. />
  132. <van-number-keyboard
  133. v-model="stoped_satur"
  134. @input="val => handleInput(val, 5)"
  135. :title="stoped_satur"
  136. @close="setstopedSaturVal"
  137. :show="stoped_saturShow"
  138. theme="custom"
  139. close-button-text="配置"
  140. @blur="stoped_saturShow = false"
  141. />
  142. <van-number-keyboard
  143. v-model="continued_satur"
  144. @input="val => handleInput(val, 6)"
  145. :title="continued_satur"
  146. @close="setContinuedSaturVal"
  147. :show="continued_saturShow"
  148. theme="custom"
  149. close-button-text="配置"
  150. @blur="continued_saturShow = false"
  151. />
  152. <van-number-keyboard
  153. v-model="max_humidity"
  154. @input="val => handleInput(val, 7)"
  155. :title="max_humidity"
  156. @close="setMaxHumidityVal"
  157. :show="max_humidityShow"
  158. theme="custom"
  159. close-button-text="配置"
  160. @blur="max_humidityShow = false"
  161. />
  162. <van-number-keyboard
  163. theme="custom"
  164. close-button-text="配置"
  165. @input="val => handleInput(val, 8)"
  166. @close="setHeat_timeVal"
  167. v-model="pre_heat_time_s"
  168. :title="pre_heat_time_s"
  169. :show="pre_heat_time_sShow"
  170. @blur="pre_heat_time_sShow = false"
  171. />
  172. <van-number-keyboard
  173. @input="val => handleInput(val, 9)"
  174. theme="custom"
  175. close-button-text="配置"
  176. @close="setstoped_humiVal"
  177. v-model="stoped_humi"
  178. :title="stoped_humi"
  179. :show="stoped_humiShow"
  180. @blur="stoped_humiShow = false"
  181. />
  182. <van-number-keyboard
  183. theme="custom"
  184. @input="val => handleInput(val, 10)"
  185. close-button-text="配置"
  186. @close="setcontinued_humiVal"
  187. v-model="continued_humi"
  188. :title="continued_humi"
  189. :show="continued_humiShow"
  190. @blur="continued_humiShow = false"
  191. />
  192. <LogPicker
  193. v-if="logVisible"
  194. :hiddenLogVisible="hiddenLogVisible"
  195. :changeLogVal="changeLogVal"
  196. :logVal="logVal"
  197. />
  198. <div class="btns">
  199. <div class="btn" @click="save">保存</div>
  200. <div class="btn ml" @click="hiddleSettingModal">返回</div>
  201. </div>
  202. <div class="key_wrap" v-show="showkeyboard" id="keyboard_formula">
  203. <SimpleKeyboard @onChange="onChange" :input="formula_id" />
  204. </div>
  205. </div>
  206. </template>
  207. <script setup>
  208. import { ref, onMounted } from 'vue'
  209. import SimpleKeyboard from 'cpns/SimpleKeyboard'
  210. import { showSuccessToast, showFailToast } from 'vant'
  211. import { useSettingStore, useWebSocketStore, useOperatorStore, useFormulaStore } from '@/store'
  212. import { storeToRefs } from 'pinia'
  213. import {
  214. setSettingValJSON,
  215. addFormulaJSON,
  216. getAllFormulaJSON,
  217. } from '@/mock/command'
  218. import LogPicker from 'cpns/dialogs/LogPicker'
  219. const settingStore = useSettingStore()
  220. const webSocketStore = useWebSocketStore()
  221. const operatorStore = useOperatorStore()
  222. const formulaStore = useFormulaStore()
  223. const max_humidity = ref('0')
  224. const continued_satur = ref('0')
  225. const stoped_satur = ref('0')
  226. const continued_gs = ref('0')
  227. const stoped_gs = ref('0')
  228. const addLiquidConfigVal = ref('0')
  229. const sprayLiquidConfigVal = ref('0')
  230. const stoped_humi = ref('0')
  231. const continued_humi = ref('0')
  232. const pre_heat_time_s = ref('0')
  233. const pre_heat_time_sShow = ref(false)
  234. const addLiquidConfigValShow = ref(false)
  235. const sprayLiquidConfigValShow = ref(false)
  236. const stoped_gsShow = ref(false)
  237. const continued_gsShow = ref(false)
  238. const stoped_saturShow = ref(false)
  239. const continued_saturShow = ref(false)
  240. const max_humidityShow = ref(false)
  241. const stoped_humiShow = ref(false)
  242. const continued_humiShow = ref(false)
  243. const logVisible = ref(false)
  244. const logVal = ref('6')
  245. const formula_id = ref('')
  246. const save = () => {
  247. if (formula_id.value == '') {
  248. showFailToast('配方名称不能为空')
  249. return
  250. }
  251. let list = formulaStore?.formulaList;
  252. for (let i = 0; i < list.length; i++) {
  253. if (list[i].formula_id == formula_id.value) {
  254. showFailToast('配方名称已存在')
  255. return
  256. }
  257. }
  258. const data = {
  259. formula_id: formula_id.value,
  260. loglevel: logVal.value,
  261. injection_pump_speed: sprayLiquidConfigVal.value,
  262. stoped_gs: stoped_gs.value,
  263. continued_gs: continued_gs.value,
  264. stoped_satur: stoped_satur.value,
  265. continued_satur: continued_satur.value,
  266. stoped_humi: stoped_humi.value,
  267. continued_humi: continued_humi.value,
  268. }
  269. console.log(data)
  270. webSocketStore.sendCommandMsg(addFormulaJSON(data))
  271. webSocketStore.sendCommandMsg(getAllFormulaJSON)
  272. props.hideSettingModal()
  273. }
  274. const changeLogVal = val => {
  275. logVal.value = val
  276. logVisible.value = false
  277. }
  278. const hiddenLogVisible = () => {
  279. logVisible.value = false
  280. }
  281. const showLogPicker = () => {
  282. logVisible.value = true
  283. }
  284. const isFirstClick = ref(true)
  285. const props = defineProps({
  286. hideSettingModal: {
  287. type: Function,
  288. },
  289. })
  290. const hiddleSettingModal = () => {
  291. webSocketStore.sendCommandMsg(getAllFormulaJSON)
  292. props.hideSettingModal()
  293. }
  294. const hideClickKey = flag => {
  295. isFirstClick.value = true
  296. stoped_humiShow.value = false
  297. continued_humiShow.value = false
  298. pre_heat_time_sShow.value = false
  299. addLiquidConfigValShow.value = false
  300. sprayLiquidConfigValShow.value = false
  301. stoped_gsShow.value = false
  302. continued_gsShow.value = false
  303. stoped_saturShow.value = false
  304. continued_saturShow.value = false
  305. max_humidityShow.value = false
  306. if (flag == 1) {
  307. addLiquidConfigValShow.value = true
  308. }
  309. if (flag == 2) {
  310. sprayLiquidConfigValShow.value = true
  311. }
  312. if (flag == 3) {
  313. stoped_gsShow.value = true
  314. }
  315. if (flag == 4) {
  316. continued_gsShow.value = true
  317. }
  318. if (flag == 5) {
  319. stoped_saturShow.value = true
  320. }
  321. if (flag == 6) {
  322. continued_saturShow.value = true
  323. }
  324. if (flag == 7) {
  325. max_humidityShow.value = true
  326. }
  327. if (flag == 8) {
  328. pre_heat_time_sShow.value = true
  329. }
  330. if (flag == 9) {
  331. stoped_humiShow.value = true
  332. }
  333. if (flag == 10) {
  334. continued_humiShow.value = true
  335. }
  336. }
  337. const handleInput = (value, index) => {
  338. if (isFirstClick.value) {
  339. if (index == 1) {
  340. setTimeout(() => {
  341. addLiquidConfigVal.value = value + ''
  342. })
  343. }
  344. if (index == 2) {
  345. setTimeout(() => {
  346. sprayLiquidConfigVal.value = value + ''
  347. })
  348. }
  349. if (index == 3) {
  350. setTimeout(() => {
  351. stoped_gs.value = value + ''
  352. })
  353. }
  354. if (index == 4) {
  355. setTimeout(() => {
  356. continued_gs.value = value + ''
  357. })
  358. }
  359. if (index == 5) {
  360. setTimeout(() => {
  361. stoped_satur.value = value + ''
  362. })
  363. }
  364. if (index == 6) {
  365. setTimeout(() => {
  366. continued_satur.value = value + ''
  367. })
  368. }
  369. if (index == 7) {
  370. setTimeout(() => {
  371. max_humidity.value = value + ''
  372. })
  373. }
  374. if (index == 8) {
  375. setTimeout(() => {
  376. pre_heat_time_s.value = value + ''
  377. })
  378. }
  379. if (index == 9) {
  380. setTimeout(() => {
  381. stoped_humi.value = value + ''
  382. })
  383. }
  384. if (index == 10) {
  385. setTimeout(() => {
  386. continued_humi.value = value + ''
  387. })
  388. }
  389. isFirstClick.value = false
  390. }
  391. }
  392. const formatter1 = value => {
  393. if (parseInt(value) == 0) {
  394. return '0'
  395. }
  396. let arr = settingStore.allSettingList.filter(item => item.name == 'stoped_gs')
  397. if (arr && arr.length > 0) {
  398. if (parseInt(value) > arr[0].val_upper_limit) {
  399. return arr[0].val_upper_limit + ''
  400. }
  401. if (parseInt(value) < arr[0].val_lower_limit) {
  402. return arr[0].val_lower_limit + ''
  403. }
  404. }
  405. if (value == '') {
  406. return '0'
  407. }
  408. return value.replace(/^0+/gi, '')
  409. }
  410. const formatter2 = value => {
  411. if (parseInt(value) == 0) {
  412. return '0'
  413. }
  414. let arr = settingStore.allSettingList.filter(
  415. item => item.name == 'continued_gs',
  416. )
  417. if (arr && arr.length > 0) {
  418. if (parseInt(value) > arr[0].val_upper_limit) {
  419. return arr[0].val_upper_limit + ''
  420. }
  421. if (parseInt(value) < arr[0].val_lower_limit) {
  422. return arr[0].val_lower_limit + ''
  423. }
  424. }
  425. if (value == '') {
  426. return '0'
  427. }
  428. return value.replace(/^0+/gi, '')
  429. }
  430. const formatter3 = value => {
  431. if (parseInt(value) == 0) {
  432. return '0'
  433. }
  434. let arr = settingStore.allSettingList.filter(
  435. item => item.name == 'stoped_satur',
  436. )
  437. if (arr && arr.length > 0) {
  438. if (parseInt(value) > arr[0].val_upper_limit) {
  439. return arr[0].val_upper_limit + ''
  440. }
  441. if (parseInt(value) < arr[0].val_lower_limit) {
  442. return arr[0].val_lower_limit + ''
  443. }
  444. }
  445. if (value == '') {
  446. return '0'
  447. }
  448. return value.replace(/^0+/gi, '')
  449. }
  450. const formatter4 = value => {
  451. if (parseInt(value) == 0) {
  452. return '0'
  453. }
  454. let arr = settingStore.allSettingList.filter(
  455. item => item.name == 'continued_satur',
  456. )
  457. if (arr && arr.length > 0) {
  458. if (parseInt(value) > arr[0].val_upper_limit) {
  459. return arr[0].val_upper_limit + ''
  460. }
  461. if (parseInt(value) < arr[0].val_lower_limit) {
  462. return arr[0].val_lower_limit + ''
  463. }
  464. }
  465. if (value == '') {
  466. return '0'
  467. }
  468. return value.replace(/^0+/gi, '')
  469. }
  470. const formatter5 = value => {
  471. if (parseInt(value) == 0) {
  472. return '0'
  473. }
  474. let arr = settingStore.allSettingList.filter(
  475. item => item.name == 'max_humidity',
  476. )
  477. if (arr && arr.length > 0) {
  478. if (parseInt(value) > arr[0].val_upper_limit) {
  479. return arr[0].val_upper_limit + ''
  480. }
  481. if (parseInt(value) < arr[0].val_lower_limit) {
  482. return arr[0].val_lower_limit + ''
  483. }
  484. }
  485. if (value == '') {
  486. return '0'
  487. }
  488. return value.replace(/^0+/gi, '')
  489. }
  490. const formatter6 = value => {
  491. if (parseInt(value) == 0) {
  492. return '0'
  493. }
  494. let arr = settingStore.allSettingList.filter(
  495. item => item.name == 'drainage_pump_speed',
  496. )
  497. if (arr && arr.length > 0) {
  498. if (parseInt(value) > arr[0].val_upper_limit) {
  499. return arr[0].val_upper_limit + ''
  500. }
  501. if (parseInt(value) < arr[0].val_lower_limit) {
  502. return arr[0].val_lower_limit + ''
  503. }
  504. }
  505. if (value == '') {
  506. return '0'
  507. }
  508. return value.replace(/^0+/gi, '')
  509. }
  510. const formatter7 = value => {
  511. if (parseInt(value) == 0) {
  512. return '0'
  513. }
  514. let arr = settingStore.allSettingList.filter(
  515. item => item.name == 'injection_pump_speed',
  516. )
  517. if (arr && arr.length > 0) {
  518. if (parseInt(value) > arr[0].val_upper_limit) {
  519. return arr[0].val_upper_limit + ''
  520. }
  521. if (parseInt(value) < arr[0].val_lower_limit) {
  522. return arr[0].val_lower_limit + ''
  523. }
  524. }
  525. if (value == '') {
  526. return '0'
  527. }
  528. return value.replace(/^0+/gi, '')
  529. }
  530. const formatter8 = value => {
  531. if (parseInt(value) == 0) {
  532. return '0'
  533. }
  534. let arr = settingStore.allSettingList.filter(
  535. item => item.name == 'pre_heat_time_s',
  536. )
  537. if (arr && arr.length > 0) {
  538. if (parseInt(value) > arr[0].val_upper_limit) {
  539. return arr[0].val_upper_limit + ''
  540. }
  541. if (parseInt(value) < arr[0].val_lower_limit) {
  542. return arr[0].val_lower_limit + ''
  543. }
  544. }
  545. if (value == '') {
  546. return '0'
  547. }
  548. return value.replace(/^0+/gi, '')
  549. }
  550. const formatter9 = value => {
  551. if (parseInt(value) == 0) {
  552. return '0'
  553. }
  554. let arr = settingStore.allSettingList.filter(
  555. item => item.name == 'stoped_humi',
  556. )
  557. if (arr && arr.length > 0) {
  558. if (parseInt(value) > arr[0].val_upper_limit) {
  559. return arr[0].val_upper_limit + ''
  560. }
  561. if (parseInt(value) < arr[0].val_lower_limit) {
  562. return arr[0].val_lower_limit + ''
  563. }
  564. }
  565. if (value == '') {
  566. return '0'
  567. }
  568. return value.replace(/^0+/gi, '')
  569. }
  570. const formatter10 = value => {
  571. if (parseInt(value) == 0) {
  572. return '0'
  573. }
  574. let arr = settingStore.allSettingList.filter(
  575. item => item.name == 'continued_humi',
  576. )
  577. if (arr && arr.length > 0) {
  578. if (parseInt(value) > arr[0].val_upper_limit) {
  579. return arr[0].val_upper_limit + ''
  580. }
  581. if (parseInt(value) < arr[0].val_lower_limit) {
  582. return arr[0].val_lower_limit + ''
  583. }
  584. }
  585. if (value == '') {
  586. return '0'
  587. }
  588. return value.replace(/^0+/gi, '')
  589. }
  590. const setAddliquidVal = () => {
  591. const val = parseInt(addLiquidConfigVal.value)
  592. if (isNaN(val)) {
  593. showFailToast('设置失败,请填写正确参数')
  594. return
  595. }
  596. }
  597. const setStopedGsVal = () => {
  598. const val = parseInt(stoped_gs.value)
  599. if (isNaN(val)) {
  600. showFailToast('设置失败,请填写正确参数')
  601. return
  602. }
  603. }
  604. const setcontinuedGsVal = () => {
  605. const val = parseInt(continued_gs.value)
  606. if (isNaN(val)) {
  607. showFailToast('设置失败,请填写正确参数')
  608. return
  609. }
  610. }
  611. const setstopedSaturVal = () => {
  612. const val = parseInt(stoped_satur.value)
  613. if (isNaN(val)) {
  614. showFailToast('设置失败,请填写正确参数')
  615. return
  616. }
  617. }
  618. const setContinuedSaturVal = () => {
  619. const val = parseInt(continued_satur.value)
  620. if (isNaN(val)) {
  621. showFailToast('设置失败,请填写正确参数')
  622. return
  623. }
  624. }
  625. const setMaxHumidityVal = () => {
  626. const val = parseInt(max_humidity.value)
  627. if (isNaN(val)) {
  628. showFailToast('设置失败,请填写正确参数')
  629. return
  630. }
  631. }
  632. const setHeat_timeVal = () => {
  633. const val = parseInt(pre_heat_time_s.value)
  634. if (isNaN(val)) {
  635. showFailToast('设置失败,请填写正确参数')
  636. return
  637. }
  638. }
  639. const setstoped_humiVal = () => {
  640. const val = parseInt(stoped_humi.value)
  641. if (isNaN(val)) {
  642. showFailToast('设置失败,请填写正确参数')
  643. return
  644. }
  645. }
  646. const setcontinued_humiVal = () => {
  647. const val = parseInt(continued_humi.value)
  648. if (isNaN(val)) {
  649. showFailToast('设置失败,请填写正确参数')
  650. return
  651. }
  652. }
  653. const setSprayLiquidVal = () => {
  654. const val = parseInt(sprayLiquidConfigVal.value)
  655. if (isNaN(val)) {
  656. showFailToast('设置失败,请填写正确参数')
  657. return
  658. }
  659. }
  660. const showkeyboard = ref(false)
  661. const onChange = a => {
  662. formula_id.value = a
  663. }
  664. const handleShowKeyBoard = () => {
  665. showkeyboard.value = true
  666. }
  667. onMounted(() => {
  668. document.addEventListener('click', e => {
  669. let box = document.getElementById('keyboard_formula')
  670. let room = document.getElementById('id_formula')
  671. const arr = [
  672. 'hg-candidate-box-next',
  673. 'hg-candidate-box-btn-active',
  674. 'hg-candidate-box-prev',
  675. 'hg-candidate-box-list-item',
  676. ]
  677. if (
  678. !box?.contains(e.target) &&
  679. e.target != room &&
  680. !arr.includes(Array.from(e.target.classList)[0])
  681. ) {
  682. showkeyboard.value = false
  683. }
  684. })
  685. $('#id_formula').virtualkeyboard()
  686. })
  687. </script>
  688. <style lang="scss" scoped>
  689. .device_container {
  690. box-sizing: border-box;
  691. width: 100%;
  692. height: 580px;
  693. display: grid;
  694. overflow: hidden;
  695. grid-template-columns: repeat(2, 1fr);
  696. row-gap: 20px;
  697. column-gap: 20px;
  698. padding: 20px;
  699. padding-bottom: 180px;
  700. position: relative;
  701. .btns {
  702. position: absolute;
  703. right: 20px;
  704. bottom: 20px;
  705. width: 300px;
  706. height: 68px;
  707. display: flex;
  708. align-items: center;
  709. justify-content: flex-end;
  710. .btn {
  711. width: 111px;
  712. height: 38px;
  713. border-radius: 19px;
  714. background: #06518b;
  715. display: flex;
  716. align-items: center;
  717. justify-content: center;
  718. font-family: Source Han Sans CN;
  719. font-size: 14px;
  720. font-weight: normal;
  721. line-height: normal;
  722. letter-spacing: 0.1em;
  723. color: #ffffff;
  724. }
  725. .ml {
  726. margin-left: 20px;
  727. }
  728. }
  729. .row_wrap {
  730. // width: 726px;
  731. height: 80px;
  732. border-radius: 14px;
  733. background: #f6f6f6;
  734. box-sizing: border-box;
  735. padding: 0 18px 0 40px;
  736. display: flex;
  737. align-items: center;
  738. justify-content: space-between;
  739. .title {
  740. font-family: Zona Pro;
  741. white-space: nowrap;
  742. font-size: 20px;
  743. font-weight: normal;
  744. letter-spacing: 0.06em;
  745. color: #000000;
  746. }
  747. .num {
  748. font-family: Source Han Sans CN;
  749. font-size: 24px;
  750. font-weight: 500;
  751. letter-spacing: 0.1em;
  752. color: #000000;
  753. display: flex;
  754. align-items: center;
  755. .log {
  756. width: 182px;
  757. display: flex;
  758. align-items: center;
  759. justify-content: center;
  760. }
  761. :deep(.field_font) {
  762. font-size: 26px;
  763. width: 180px;
  764. }
  765. }
  766. .formula_input {
  767. border: none;
  768. height: 38px;
  769. font-size: 22px;
  770. padding: 0 12px;
  771. width: 220px;
  772. }
  773. .btn {
  774. width: 87px;
  775. height: 45px;
  776. border-radius: 23px;
  777. background: #06518b;
  778. font-family: Source Han Sans CN;
  779. font-size: 14px;
  780. font-weight: normal;
  781. letter-spacing: 0.1em;
  782. color: #ffffff;
  783. display: flex;
  784. align-items: center;
  785. justify-content: center;
  786. }
  787. }
  788. .key_wrap {
  789. position: absolute;
  790. right: 97px;
  791. bottom: 0;
  792. height: 245px;
  793. width: 520px;
  794. }
  795. }
  796. </style>