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.
 
 
 
 
 

284 lines
8.0 KiB

<script setup lang="ts">
import { createCraft, delCraft, getCraftList as getCraftListApi, updateCraft } from 'apis/crafts'
import { getSolsList } from 'apis/solution'
import { ElMessageBox } from 'element-plus'
import { FtMessage } from 'libs/message'
import { socket } from 'libs/socket'
import { useHomeStore } from 'stores/homeStore'
import { onMounted, onUnmounted, ref } from 'vue'
const loading = ref(false)
const statisticNumber = ref(0)
const homeStore = useHomeStore()
onMounted(async () => {
loading.value = true
await getSolutionList()
await getCraftList()
loading.value = false
socket.init(receiveMessage, 'pump_position')
})
/* onUnmounted(() => {
socket.unregisterCallback(receiveMessage, 'pump_position')
}) */
const receiveMessage = (data: number) => {
console.log(`接收到泵的转数${data}`)
statisticNumber.value = statisticNumber.value + data
}
const form = ref<Craft.CraftItem>({})
const formRef = ref()
const rules = {
solutionId: [
{ required: true, message: '请选择溶液', trigger: 'change' },
],
concentration: [
{ required: true, message: '请输入溶液浓度', trigger: 'blur' },
],
volume: [
{ required: true, message: '请输入加液量', trigger: 'blur' },
],
revolutions: [
{ required: true, message: '请输入蠕动泵转速', trigger: 'blur' },
],
}
const solutionList = ref<Solution.SolutionItem[]>([])
const getSolutionList = async () => {
solutionList.value = (await getSolsList()).list
}
const craftList = ref<Craft.CraftItem[]>([])
const getCraftList = async () => {
craftList.value = (await getCraftListApi()).list
form.value = {}
}
const save = async () => {
const valid = await formRef.value.validate()
if (!valid) {
return
}
if (form.value.id) {
await updateCraft(form.value)
}
else {
await createCraft(form.value)
}
loading.value = true
await getCraftList()
loading.value = false
FtMessage.success('保存成功')
}
const formatName = (data: Craft.CraftItem) => {
const item = solutionList.value.find(item => item.id === data.solutionId)
return `${item?.name}-${data.concentration}%-${data.volume}mL`
}
const nameClick = (item: Craft.CraftItem) => {
const solution = solutionList.value.find(s => s.id === item.solutionId)
form.value = {
...item,
}
}
const delHandle = async (id: number | undefined) => {
if (!id) {
return
}
await ElMessageBox.confirm('确定删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
await delCraft(`${id}`)
loading.value = true
await getCraftList()
loading.value = false
FtMessage.success('删除成功')
}
let currentCommandId = ''
// 正转 反转
const pumpRotate = async (direction: string) => {
const valid = await formRef.value.validate()
if (!valid) {
return
}
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'pump_rotate_start',
params: {
direction,
position: form.value.revolutions,
solutionId: form.value.solutionId,
concentration: form.value.concentration,
},
}
await homeStore.sendControl(params)
}
// 停止
const pumpStop = async () => {
const valid = await formRef.value.validate()
if (!valid) {
return
}
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'pump_rotate_stop',
params: {
solutionId: form.value.solutionId,
concentration: form.value.concentration,
},
}
await homeStore.sendControl(params)
}
// 预充
const pumpPreFill = async () => {
const valid = await formRef.value.validate()
if (!valid) {
return
}
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'solution_pre_fill_start',
params: {
solutionId: form.value.solutionId,
concentration: form.value.concentration,
},
}
await homeStore.sendControl(params)
}
// 加液
const pumpAddSolution = async () => {
const valid = await formRef.value.validate()
if (!valid) {
return
}
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'solution_add_start',
params: {
solutionId: form.value.solutionId,
concentration: form.value.concentration,
position: form.value.revolutions,
},
}
await homeStore.sendControl(params)
}
</script>
<template lang="pug">
div(class="craft-box")
el-card(v-loading="loading")
div(class="button-box")
ft-button(type="primary" @click="() => form = {}")
| 添加配方
ft-button(type="danger" :disabled="!form.id" :click-handle="() => delHandle(form.id)")
| 删除配方
div(class="list-box")
p(v-for="item in craftList" :key="item.id" class="name" :class="{ 'active-name': item.id === form.id }" @click="() => nameClick(item)")
| {{ formatName(item) }}
el-card(v-loading="loading")
template(#header)
span(v-show="form.id") 编辑配方
span(v-show="!form.id") 新增配方
el-form(ref="formRef" size="large" :model="form" :rules="rules" label-width="auto")
el-form-item(label="溶液名称" prop="solutionId")
el-select(v-model="form.solutionId" placeholder="请选择溶液")
el-option(v-for="item in solutionList" :key="item.id" :label="item.name" :value="item.id")
el-form-item(label="溶液浓度" prop="concentration")
ft-input(v-model="form.concentration" placeholder="请输入溶液浓度" layoutName="number")
template(#append)
span %
el-form-item(label="加液量" prop="volume")
ft-input(v-model="form.volume" placeholder="请输入加液量" layoutName="number")
template(#append)
span mL
el-form-item(label="蠕动泵转数" prop="revolutions")
ft-input(v-model="form.revolutions" placeholder="请输入蠕动泵转数" layoutName="number")
template(#append)
span r
div.statistic-box
ft-button(type="default" size="small" :click-handle="()=>statisticNumber=0")
| 重置
span 蠕动泵体积及转数统计
el-statistic(:value="statisticNumber")
ft-button(type="default" size="small" :click-handle="()=>form.revolutions=statisticNumber")
| 设置
div.form-button-box
div
ft-button(type="primary" size="large" :click-handle="()=>pumpRotate('FORWARD')")
| 加液
ft-button(type="danger" size="large" :click-handle="()=>pumpStop()")
| 停止
div
ft-button(type="primary" size="large" :click-handle="()=>pumpPreFill()")
| 预充
ft-button(type="primary" size="large" :click-handle="save")
| 保存
</template>
<style scoped lang="stylus">
.craft-box
background transparent !important
box-shadow none !important
display grid
grid-template-columns 1fr 2.5fr
grid-gap 20px
.el-card
display flex
flex-direction column
border-radius 10px
:deep(.el-card__body)
display flex
flex-direction column
justify-content space-between
height 100%
padding 0
overflow hidden
.button-box
display flex
justify-content center
padding 20px 0
.list-box
flex 1
padding 0 0 10px
overflow auto
border-top 1px solid #EBEEF5
.name
padding 10px 20px
cursor pointer
border-bottom 1px solid #EBEEF5
border-left 3px solid transparent
transition all 0.5s
.active-name
border-left 3px solid #409EFF
background rgba(64, 158, 255, 0.2)
.el-form
padding 20px 150px
.statistic-box
display flex
justify-content center
align-items center
.el-statistic
margin 0 30px
.form-button-box
display flex
justify-content space-evenly
margin-bottom 30px
.ft-button
width 90px
:deep(.el-input-group__append)
width 50px
</style>