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.

108 lines
2.9 KiB

  1. <script setup lang="ts">
  2. import { useHomeStore } from 'stores/homeStore'
  3. import { ref } from 'vue'
  4. const emits = defineEmits(['ok', 'cancel'])
  5. const homeStore = useHomeStore()
  6. const selectedHeatArea = computed(() => {
  7. return homeStore.heatAreaList.find(item => item.selected)
  8. })
  9. const form = ref<{
  10. minutes?: number
  11. seconds?: number
  12. time?: number
  13. temperature?: number
  14. }>({})
  15. const formRef = ref()
  16. const validateHandle = (rule: any, value: any, callback: any) => {
  17. if (!value) {
  18. callback(new Error('请输入目标温度'))
  19. }
  20. else if (value < 0 || value > 300) {
  21. callback(new Error('目标温度范围0℃-300℃'))
  22. }
  23. else {
  24. callback()
  25. }
  26. }
  27. const rules = {
  28. temperature: [
  29. { required: true, trigger: 'blur', validator: validateHandle },
  30. ],
  31. time: [
  32. { required: true, trigger: 'change', message: '请选择时间' },
  33. ],
  34. }
  35. let currentCommandId = ''
  36. const okHandle = async () => {
  37. try {
  38. const valid = await formRef.value.validate()
  39. if (!valid) {
  40. return
  41. }
  42. currentCommandId = Date.now().toString()
  43. const params = {
  44. commandId: currentCommandId,
  45. command: 'heat_start',
  46. params: {
  47. heatId: selectedHeatArea.value?.value,
  48. ...form.value,
  49. },
  50. }
  51. await homeStore.sendControl(params)
  52. emits('ok')
  53. }
  54. catch (error) {
  55. console.log(error)
  56. }
  57. }
  58. const cancel = () => {
  59. emits('cancel')
  60. }
  61. const convertTime = () => {
  62. form.value.time = (form.value.minutes || 0) * 60 + (form.value.seconds || 0)
  63. formRef.value.validateField('time')
  64. }
  65. </script>
  66. <template>
  67. <FtDialog visible title="开始加热" width="40%" :ok-handle="okHandle" @cancel="cancel">
  68. <el-form ref="formRef" label-width="auto" :model="form" :rules="rules">
  69. <el-form-item label="加热区">
  70. <el-tag>{{ selectedHeatArea?.label }}</el-tag>
  71. </el-form-item>
  72. <el-form-item label="目标温度" prop="temperature">
  73. <el-input v-model="form.temperature" type="number" placeholder="请输入温度">
  74. <template #append>
  75. </template>
  76. </el-input>
  77. </el-form-item>
  78. <el-form-item label="保持时间" prop="time">
  79. <div style="display: flex;width: 100%">
  80. <el-select v-model="form.minutes" clearable style="width: 100%" placeholder="请选择分钟" @change="convertTime">
  81. <el-option v-for="item in 60" :key="item" :label="item" :value="item" />
  82. </el-select>
  83. <span style="margin: 0 5px"></span>
  84. <el-select v-model="form.seconds" clearable style="width: 100%" placeholder="请输入秒" @change="convertTime">
  85. <el-option v-for="item in 60" :key="item" :label="item" :value="item" />
  86. </el-select>
  87. <span style="margin: 0 5px"></span>
  88. </div>
  89. </el-form-item>
  90. </el-form>
  91. </FtDialog>
  92. </template>
  93. <style scoped lang="scss">
  94. .el-tag {
  95. margin-right: 5px;
  96. }
  97. </style>