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

215 lines
5.7 KiB

2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
  1. <script lang="ts" setup>
  2. import { formulaNameMap } from 'libs/constant'
  3. import { cloneDeep } from 'lodash'
  4. import { ref, watchEffect } from 'vue'
  5. import { FtMessage } from '@/libs/message'
  6. import { compareJSON, convertValuesToString } from '@/libs/utils'
  7. import { useFormulaStore } from '@/stores/formulaStore'
  8. const props = defineProps<{
  9. editable: boolean
  10. }>()
  11. const formulaStore = useFormulaStore()
  12. /**
  13. * 当前表单数据
  14. * 不同模式下有不同的初始值
  15. * - home: 当前选中的配方
  16. * - setting: 默认配方信息
  17. * - formula: 当前选中的配方或默认配方
  18. */
  19. const formData = ref<Record<string, any>>({
  20. ...formulaStore.defaultFormulaInfo,
  21. })
  22. console.log(formData)
  23. /**
  24. * 标签单位映射表用于显示各参数的单位
  25. */
  26. const labelUnitMap: Record<string, any> = formulaStore.labelUnitMap
  27. /**
  28. * 配方配置列表
  29. */
  30. const formulaConfigList = ref(formulaStore.formulaConfigList)
  31. /**
  32. * 组件挂载时注册方法供父组件调用
  33. */
  34. watchEffect(() => {
  35. formData.value = cloneDeep(formulaStore.defaultFormulaInfo)
  36. formData.value = convertValuesToString(formData.value, 'name')
  37. // formData.value = convertValuesToInt(formData.value)
  38. })
  39. /**
  40. * 处理表单提交
  41. * 根据不同的type属性值执行不同的保存逻辑
  42. */
  43. const handleSubmit = () => {
  44. // 修改默认值
  45. const diff = compareJSON(formulaStore.defaultFormulaInfo, formData.value)
  46. const diffKeys = Object.keys(diff)
  47. if (diffKeys.length) {
  48. Promise.all(
  49. diffKeys.map(async (key) => {
  50. await formulaStore.setSettingFormulaConfig(key, diff[key].newVal || diff[key].obj2)
  51. }),
  52. )
  53. FtMessage.success('配方修改成功')
  54. }
  55. formulaStore.getFormualDefaultData()
  56. }
  57. const size = 'default'
  58. const validatePass = (rule: any, value: any, callback: any, config: Formula.FormulaConfig) => {
  59. if (!value && value !== 0 && value !== '0') {
  60. callback(new Error('此为必填项'))
  61. }
  62. else if (config.val_type === 'int' || config.val_type === 'float') {
  63. const temp = Number(value)
  64. if (temp < config.val_lower_limit || temp > config.val_upper_limit) {
  65. callback(new Error(`输入范围为${config.val_lower_limit}-${config.val_upper_limit}`))
  66. }
  67. }
  68. callback()
  69. }
  70. </script>
  71. <template>
  72. <div class="formula-form">
  73. <el-form
  74. :disabled="!props.editable"
  75. :model="formData"
  76. label-width="auto"
  77. label-position="right"
  78. :size="size"
  79. inline
  80. >
  81. <el-form-item
  82. v-for="item in formulaConfigList.filter(data => data.is_visible_in_setting_page)"
  83. :key="item.setting_id"
  84. :label="formulaNameMap[item.setting_id]"
  85. style="width: 50%"
  86. :prop="item.setting_id"
  87. :rules="[
  88. {
  89. required: true,
  90. validator: (rule, value, callback) => validatePass(rule, value, callback, item),
  91. trigger: 'blur',
  92. },
  93. ]"
  94. >
  95. <template v-if="item.val_type === 'int'">
  96. <ft-input
  97. v-model="formData[item.setting_id]"
  98. layout-name="number"
  99. style="width: 80%"
  100. :name="item.setting_id"
  101. :controls="false"
  102. :disabled="!props.editable"
  103. >
  104. <template v-if="labelUnitMap[item.setting_id]" #append>
  105. {{ labelUnitMap[item.setting_id] }}
  106. </template>
  107. </ft-input>
  108. </template>
  109. <template v-if="item.val_type === 'float'">
  110. <ft-input
  111. v-model="formData[item.setting_id]"
  112. layout-name="number"
  113. style="width: 80%"
  114. :name="item.setting_id"
  115. :controls="false"
  116. :disabled="!props.editable"
  117. >
  118. <template v-if="labelUnitMap[item.setting_id]" #append>
  119. {{ labelUnitMap[item.setting_id] }}
  120. </template>
  121. </ft-input>
  122. </template>
  123. <template v-else-if="item.val_type === 'enum'">
  124. <el-select
  125. v-model="formData[item.setting_id]"
  126. v-prevent-keyboard
  127. style="width: 80%; height: 40px"
  128. placeholder="请选择"
  129. readonly
  130. >
  131. <el-option v-for="log in item.enums" :key="log" :label="log" :value="log" />
  132. </el-select>
  133. </template>
  134. </el-form-item>
  135. </el-form>
  136. <div :style="{ marginLeft: '33%' }">
  137. <slot name="formulaBtn">
  138. <div class="default-btn">
  139. <el-button v-if="editable" type="primary" class="config-btn" @click="handleSubmit">
  140. 确定
  141. </el-button>
  142. </div>
  143. </slot>
  144. </div>
  145. </div>
  146. </template>
  147. <style lang="scss" scoped>
  148. .formula-form {
  149. font-size: 20px !important;
  150. padding: 5px;
  151. padding-left: 15px;
  152. align-items: center;
  153. .default-btn {
  154. margin-top: 1rem;
  155. }
  156. .config-btn {
  157. height: 3rem;
  158. width: 8rem;
  159. }
  160. }
  161. .formula-form-item {
  162. display: grid;
  163. grid-template-columns: 1fr 1fr;
  164. }
  165. .formData-input-config {
  166. width: 10vw;
  167. }
  168. :deep(.el-input__inner) {
  169. text-align: left;
  170. height: 40px;
  171. }
  172. :deep(.el-select__wrapper) {
  173. height: 42px;
  174. }
  175. :deep(.el-form-item) {
  176. margin-right: 0;
  177. align-items: center;
  178. }
  179. :deep(.el-input-group__append) {
  180. font-size: 12px;
  181. padding: 0 1vw;
  182. }
  183. /* 进入动画的初始状态 */
  184. .slide-right-enter-from {
  185. transform: translateX(100%);
  186. }
  187. /* 进入动画的结束状态(也可以理解为激活状态) */
  188. .slide-right-enter-to {
  189. transform: translateX(0);
  190. }
  191. /* 进入动画的过渡曲线等 */
  192. .slide-right-enter-active {
  193. transition: transform 0.3s ease-in-out;
  194. }
  195. /* 离开动画的初始状态(激活状态) */
  196. .slide-right-leave-from {
  197. transform: translateX(0);
  198. }
  199. /* 离开动画的结束状态 */
  200. .slide-right-leave-to {
  201. transform: translateX(100%);
  202. }
  203. /* 离开动画的过渡曲线等 */
  204. .slide-right-leave-active {
  205. transition: transform 0.3s ease-in-out;
  206. }
  207. </style>