Browse Source

fix:预热和加热逻辑

master
guoapeng 2 months ago
parent
commit
517196634a
  1. 2
      src/apis/home.ts
  2. 51
      src/components/home/SetTemperature/index.vue
  3. 108
      src/components/home/StartHeat/index.vue
  4. 16
      src/components/home/Tube/index.vue
  5. 1
      src/types/system.d.ts
  6. 48
      src/views/home/index.vue

2
src/apis/home.ts

@ -9,3 +9,5 @@ export const getTask = (id: number): Promise<Task.Task> => http.get(`${baseUrl}$
export const taskList = (params: Task.TaskQuery): Promise<Task.Task[]> => http.get(`${baseUrl}list`, { params })
export const getTaskIng = (): Promise<null> => http.get(`${baseUrl}getIngTask`)
export const delTask = (params: string): Promise<null> => http.delete(`${baseUrl}${params}`)
export const trayIn = (): Promise<null> => http.delete('tray/in')
export const trayOut = (): Promise<null> => http.delete('tray/out')

51
src/components/home/SetTemperature/index.vue

@ -1,21 +1,17 @@
<script setup lang="ts">
import { setTargetTemperature } from 'apis/home'
import { getOreList } from 'apis/ore'
import { FtMessage } from 'libs/message'
import { useSystemStore } from 'stores/systemStore'
import { inject, onMounted, ref } from 'vue'
import { useHomeStore } from 'stores/homeStore'
import { ref } from 'vue'
const emits = defineEmits(['ok', 'cancel'])
const data = inject('currentTemperatureData')
console.log(data)
const homeStore = useHomeStore()
onMounted(() => {
getOres()
const selectedHeatArea = computed(() => {
return homeStore.heatAreaList.find(item => item.selected)
})
const form = ref({
temperature: useSystemStore().systemStatus.heatModule.find(item => item.moduleCode === data.value.id)?.targetTemperature,
temperature: undefined,
})
const formRef = ref()
@ -37,17 +33,23 @@ const rules = {
],
}
let currentCommandId = ''
const okHandle = async () => {
try {
const valid = await formRef.value.validate()
if (!valid) {
return
}
await setTargetTemperature({
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'warm_up_start',
params: {
heatId: selectedHeatArea.value?.value,
...form.value,
moduleCode: data.value.id,
})
FtMessage.success('设置成功')
},
}
await homeStore.sendControl(params)
emits('ok')
}
catch (error) {
@ -57,20 +59,13 @@ const okHandle = async () => {
const cancel = () => {
emits('cancel')
}
const oreList = ref<Ore.OreItem[]>([])
const getOres = async () => {
const res = await getOreList()
oreList.value = res.list
}
</script>
<template>
<FtDialog visible title="设置目标温度" width="40%" :ok-handle="okHandle" @cancel="cancel">
<FtDialog visible title="开始预热" width="40%" :ok-handle="okHandle" @cancel="cancel">
<el-form ref="formRef" label-width="auto" :model="form" :rules="rules">
<el-form-item label="加热区">
<el-tag>{{ data?.label }}</el-tag>
<el-tag>{{ selectedHeatArea?.label }}</el-tag>
</el-form-item>
<el-form-item label="目标温度" prop="temperature">
<el-input v-model.number="form.temperature" type="number" placeholder="请输入温度">
@ -79,16 +74,6 @@ const getOres = async () => {
</template>
</el-input>
</el-form-item>
<!-- <el-form-item label="到达温度后" prop="type"> -->
<!-- <el-radio-group v-model="form.type"> -->
<!-- <el-radio value="1" size="large"> -->
<!-- 保持温度 -->
<!-- </el-radio> -->
<!-- <el-radio value="2" size="large"> -->
<!-- 停止加热 -->
<!-- </el-radio> -->
<!-- </el-radio-group> -->
<!-- </el-form-item> -->
</el-form>
</FtDialog>
</template>

108
src/components/home/StartHeat/index.vue

@ -0,0 +1,108 @@
<script setup lang="ts">
import { useHomeStore } from 'stores/homeStore'
import { ref } from 'vue'
const emits = defineEmits(['ok', 'cancel'])
const homeStore = useHomeStore()
const selectedHeatArea = computed(() => {
return homeStore.heatAreaList.find(item => item.selected)
})
const form = ref<{
minutes?: number
seconds?: number
time?: number
temperature?: number
}>({})
const formRef = ref()
const validateHandle = (rule: any, value: any, callback: any) => {
if (!value) {
callback(new Error('请输入目标温度'))
}
else if (value < 0 || value > 200) {
callback(new Error('目标温度范围0℃-200℃'))
}
else {
callback()
}
}
const rules = {
temperature: [
{ required: true, trigger: 'blur', validator: validateHandle },
],
time: [
{ required: true, trigger: 'change', message: '请选择时间' },
],
}
let currentCommandId = ''
const okHandle = async () => {
try {
const valid = await formRef.value.validate()
if (!valid) {
return
}
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'heat_start',
params: {
heatId: selectedHeatArea.value?.value,
...form.value,
},
}
await homeStore.sendControl(params)
emits('ok')
}
catch (error) {
console.log(error)
}
}
const cancel = () => {
emits('cancel')
}
const convertTime = () => {
form.value.time = (form.value.minutes || 0) * 60 + (form.value.seconds || 0)
formRef.value.validateField('time')
}
</script>
<template>
<FtDialog visible title="开始加热" width="40%" :ok-handle="okHandle" @cancel="cancel">
<el-form ref="formRef" label-width="auto" :model="form" :rules="rules">
<el-form-item label="加热区">
<el-tag>{{ selectedHeatArea?.label }}</el-tag>
</el-form-item>
<el-form-item label="目标温度" prop="temperature">
<el-input v-model.number="form.temperature" type="number" placeholder="请输入温度">
<template #append>
</template>
</el-input>
</el-form-item>
<el-form-item label="保温时间" prop="time">
<div style="display: flex;width: 100%">
<el-select v-model="form.minutes" clearable style="width: 100%" placeholder="请选择分钟" @change="convertTime">
<el-option v-for="item in 60" :key="item" :label="item" :value="item" />
</el-select>
<span style="margin: 0 5px"></span>
<el-select v-model="form.seconds" clearable style="width: 100%" placeholder="请输入秒" @change="convertTime">
<el-option v-for="item in 60" :key="item" :label="item" :value="item" />
</el-select>
<span style="margin: 0 5px"></span>
</div>
</el-form-item>
</el-form>
</FtDialog>
</template>
<style scoped lang="scss">
.el-tag {
margin-right: 5px;
}
</style>

16
src/components/home/Tube/index.vue

@ -24,6 +24,12 @@ const props = withDefaults(defineProps<{ data: System.HeatArea }>(), {
const emits = defineEmits(['selectChange', 'setTemperature'])
const formatTime = (seconds: number): string => {
const minutes = Math.floor(seconds / 60)
const secs = seconds % 60
return `${String(minutes).padStart(2, '0')}:${String(secs).padStart(2, '0')}`
}
const homeStore = useHomeStore()
const systemStore = useSystemStore()
const mousedownHandle = async (e: Event) => {
@ -71,10 +77,6 @@ const tray = computed(() => {
return systemStore.systemStatus.tray?.find(item => item.heatModuleId === props.data.moduleCode)
})
const setTemperature = () => {
emits('setTemperature', props.data.moduleCode)
}
const pauseCraftHandle = async () => {
await pauseCraft({
heatId: props.data.moduleCode,
@ -155,10 +157,12 @@ defineExpose({
<span v-show="data.heating" style="color: #FE0A0A ">加热中</span>
<span v-show="data.fanOpen" style="color: #14A656 ">降温中</span>
</div>
<div v-if="data.targetTime" style="text-align: center;font-size: 12px;color:#FE0A0A ">
{{ formatTime(data.targetTime) }}
</div>
<div class="footer">
<div class="tem-box" @click="setTemperature">
<div class="tem-box">
<span :class="{ 'active-footer': hearInfo?.selected }"> {{ data.targetTemperature || '--' }}</span>
<el-icon><Setting /></el-icon>
</div>
<ft-button size="small" :type="hearInfo?.selected ? 'primary' : 'default'" @click="tubeSelect">
选择

1
src/types/system.d.ts

@ -64,6 +64,7 @@ declare namespace System {
capExist: boolean
temperature: number
targetTemperature: number
targetTime?: number
}
interface SolutionContainer {
id: number

48
src/views/home/index.vue

@ -1,10 +1,11 @@
<script setup lang="ts">
import { stopTask } from 'apis/home'
import { stopTask, trayIn, trayOut } from 'apis/home'
import AddLiquid from 'components/home/AddLiquid/index.vue'
import FillSolution from 'components/home/FillSolution/index.vue'
import SelectCraft from 'components/home/SelectCraft/index.vue'
import SetTemperature from 'components/home/SetTemperature/index.vue'
import StartExperiment from 'components/home/StartExperiment/index.vue'
import StartHeat from 'components/home/StartHeat/index.vue'
import Tube from 'components/home/Tube/index.vue'
import { ElMessageBox } from 'element-plus'
import { FtMessage } from 'libs/message'
@ -191,16 +192,9 @@ const move_to_solution_area = async () => {
await homeStore.sendControl(params)
}
const startHeatVisible = ref(false)
const heat_start = async () => {
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'heat_start',
params: {
heatId: selectedHeatArea.value?.value,
},
}
await homeStore.sendControl(params)
startHeatVisible.value = true
}
const heat_stop = async () => {
@ -303,6 +297,18 @@ const take_photo = async () => {
}
await homeStore.sendControl(params)
}
const trayInHandle = async () => {
await trayIn()
}
const trayOutHandle = async () => {
await trayOut()
}
const warmUpStart = async () => {
setTemperatureVisible.value = true
}
</script>
<template>
@ -419,6 +425,23 @@ const take_photo = async () => {
</ft-button>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="8">
<ft-button size="large" :disabled="!selectedHeatArea" :click-handle="warmUpStart">
开始预热
</ft-button>
</el-col>
<el-col :span="8">
<ft-button size="large" :click-handle="trayInHandle">
放入托盘
</ft-button>
</el-col>
<el-col :span="8">
<ft-button size="large" :click-handle="trayOutHandle">
取出托盘
</ft-button>
</el-col>
</el-row>
</div>
</div>
</el-col>
@ -427,6 +450,7 @@ const take_photo = async () => {
<StartExperiment v-if="startVisible" @ok="startVisible = false" @cancel="startVisible = false" />
<SelectCraft v-if="selectCraftVisible" @ok="selectCraftVisible = false" @cancel="selectCraftVisible = false" />
<SetTemperature v-if="setTemperatureVisible" @ok="setTemperatureVisible = false" @cancel="setTemperatureVisible = false" />
<StartHeat v-if="startHeatVisible" @ok="startHeatVisible = false" @cancel="startHeatVisible = false" />
<AddLiquid v-if="addLiquidVisible" @ok="addLiquidVisible = false" @cancel="addLiquidVisible = false" />
<FillSolution v-if="fillSolutionVisible" @ok="fillSolutionVisible = false" @cancel="fillSolutionVisible = false" />
</div>
@ -459,7 +483,7 @@ const take_photo = async () => {
flex-direction: column;
height: 100%;
.top {
height: 40%;
height: 30%;
background: #4D6882;
position: relative;
border-radius: 8px;
@ -478,7 +502,7 @@ const take_photo = async () => {
}
}
.button-box {
height: 60%;
height: 70%;
display: flex;
flex-direction: column;
justify-content: flex-end;

Loading…
Cancel
Save