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

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