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

208 lines
5.7 KiB

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