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

196 lines
5.3 KiB

  1. <script lang="ts" setup>
  2. import { formulaNameMap } from 'libs/constant'
  3. import { inject, onMounted, ref, watchEffect } from 'vue'
  4. import { convertValuesToInt, convertValuesToString } from '@/libs/utils'
  5. import { useFormulaStore } from '@/stores/formulaStore'
  6. const formulaStore = useFormulaStore()
  7. const runtimeFormRef = ref()
  8. const saveFormData = () => {
  9. runtimeFormRef.value.validate((valid: any) => {
  10. if (valid) {
  11. return convertValuesToString(formData.value, 'name')
  12. }
  13. return null
  14. })
  15. }
  16. /**
  17. * 注册孙子组件方法的注入函数
  18. */
  19. const registerGrandsonMethods = inject<(methods: any) => void>('registerGrandsonMethods', () => {})
  20. onMounted(() => {
  21. registerGrandsonMethods && registerGrandsonMethods({ saveFormData })
  22. })
  23. /**
  24. * 当前表单数据
  25. * - home: 当前选中的配方 或者默认配方
  26. */
  27. const formData = ref<Record<string, any>>({})
  28. /**
  29. * 标签单位映射表用于显示各参数的单位
  30. */
  31. const labelUnitMap: Record<string, any> = formulaStore.labelUnitMap
  32. /**
  33. * 监听事件
  34. */
  35. watchEffect(() => {
  36. formData.value = convertValuesToInt(formulaStore.getRealtimeConfig())
  37. })
  38. /**
  39. * 配方配置列表
  40. */
  41. const formulaConfigList = formulaStore.formulaConfigList
  42. const size = 'default'
  43. const validatePass = (rule: any, value: any, callback: any, config: Formula.FormulaConfig) => {
  44. if (!value && value !== 0 && value !== '0') {
  45. callback(new Error('此为必填项'))
  46. }
  47. else if (config.val_type === 'int' || config.val_type === 'float') {
  48. const temp = Number(value)
  49. if (temp < config.val_lower_limit || temp > config.val_upper_limit) {
  50. callback(new Error(`输入范围为${config.val_lower_limit}-${config.val_upper_limit}`))
  51. }
  52. }
  53. callback()
  54. }
  55. </script>
  56. <template>
  57. <div class="formula-form">
  58. <el-form
  59. ref="runtimeFormRef"
  60. :model="formData"
  61. label-width="auto"
  62. label-position="right"
  63. :size="size"
  64. inline
  65. >
  66. <el-form-item
  67. v-for="item in formulaConfigList.filter((data) => data.is_visible_in_rt_page)"
  68. :key="item.setting_id"
  69. :label="formulaNameMap[item.setting_id]"
  70. style="width: 50%"
  71. :prop="item.setting_id"
  72. :rules="[
  73. {
  74. required: true,
  75. validator: (rule, value, callback) => validatePass(rule, value, callback, item),
  76. trigger: 'blur',
  77. },
  78. ]"
  79. >
  80. <template v-if="item.val_type === 'int'">
  81. <el-input
  82. v-model.number="formData[item.setting_id]"
  83. v-prevent-keyboard
  84. style="width: 80%"
  85. type="number"
  86. :name="item.setting_id"
  87. :controls="false"
  88. :disabled="!(item.is_editable)"
  89. >
  90. <template v-if="labelUnitMap[item.setting_id]" #append>
  91. {{ labelUnitMap[item.setting_id] }}
  92. </template>
  93. </el-input>
  94. </template>
  95. <template v-if="item.val_type === 'float'">
  96. <el-input
  97. v-model.number="formData[item.setting_id]"
  98. v-prevent-keyboard
  99. style="width: 80%"
  100. type="number"
  101. :name="item.setting_id"
  102. :controls="false"
  103. :disabled="!(item.is_editable)"
  104. >
  105. <template v-if="labelUnitMap[item.setting_id]" #append>
  106. {{ labelUnitMap[item.setting_id] }}
  107. </template>
  108. </el-input>
  109. </template>
  110. <template v-else-if="item.val_type === 'enum'">
  111. <el-select
  112. v-model="formData[item.setting_id]"
  113. v-prevent-keyboard
  114. style="width: 80%;height:40px"
  115. placeholder="请选择"
  116. :disabled="!(item.is_editable)"
  117. readonly
  118. >
  119. <el-option v-for="log in item.enums" :key="log" :label="log" :value="log" />
  120. </el-select>
  121. </template>
  122. <template v-else-if="item.val_type === 'boolean'">
  123. <el-radio-group v-model="formData[item.setting_id]" :disabled="!item.is_editable">
  124. <el-radio :label="true">
  125. </el-radio>
  126. <el-radio :label="false">
  127. </el-radio>
  128. </el-radio-group>
  129. </template>
  130. </el-form-item>
  131. </el-form>
  132. </div>
  133. </template>
  134. <style lang="scss" scoped>
  135. .formula-form {
  136. font-size: 20px !important;
  137. padding: 5px;
  138. padding-left: 15px;
  139. align-items: center;
  140. .default-btn {
  141. margin-top: 1rem;
  142. }
  143. .config-btn {
  144. height: 3rem;
  145. width: 8rem;
  146. }
  147. }
  148. .formula-form-item {
  149. display: grid;
  150. grid-template-columns: 1fr 1fr;
  151. }
  152. .formData-input-config {
  153. width: 10vw;
  154. }
  155. :deep(.el-input__inner) {
  156. text-align: left;
  157. height: 40px;
  158. }
  159. :deep(.el-form-item) {
  160. margin-right: 0;
  161. align-items: center;
  162. }
  163. /* 进入动画的初始状态 */
  164. .slide-right-enter-from {
  165. transform: translateX(100%);
  166. }
  167. /* 进入动画的结束状态(也可以理解为激活状态) */
  168. .slide-right-enter-to {
  169. transform: translateX(0);
  170. }
  171. /* 进入动画的过渡曲线等 */
  172. .slide-right-enter-active {
  173. transition: transform 0.3s ease-in-out;
  174. }
  175. /* 离开动画的初始状态(激活状态) */
  176. .slide-right-leave-from {
  177. transform: translateX(0);
  178. }
  179. /* 离开动画的结束状态 */
  180. .slide-right-leave-to {
  181. transform: translateX(100%);
  182. }
  183. /* 离开动画的过渡曲线等 */
  184. .slide-right-leave-active {
  185. transition: transform 0.3s ease-in-out;
  186. }
  187. </style>