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.
171 lines
4.1 KiB
171 lines
4.1 KiB
<script lang="ts" setup>
|
|
import SelectModal from 'components/common/SelectModal/index.vue'
|
|
import FormulaConfig from 'components/formula/FormulaConfig.vue'
|
|
import { FtMessage } from 'libs/message'
|
|
import { computed, onMounted, ref, watchEffect } from 'vue'
|
|
|
|
import { convertValuesToInt } from '@/libs/utils'
|
|
import { useFormulaStore } from '@/stores/formulaStore'
|
|
import { useHomeStore } from '@/stores/homeStore'
|
|
|
|
/**
|
|
* 配方选择页面组件
|
|
* @description 负责处理配方选择逻辑、设备状态判断及界面交互
|
|
*/
|
|
|
|
// 状态管理
|
|
const formulaStore = useFormulaStore()
|
|
const homeStore = useHomeStore()
|
|
|
|
// 组件状态
|
|
const recipes = ref<Formula.FormulaItem[]>([]) // 配方列表
|
|
const isModalOpen = ref(false) // 选择模态框是否打开
|
|
const selectedValue = ref() // 选中的配方ID
|
|
const isDeviceIdle = ref(homeStore.isDeviceIdle) // 设备是否空闲状态
|
|
|
|
/**
|
|
* @hook 生命周期钩子 - 挂载完成时执行
|
|
* @description 初始化时检查配方列表,若为空则重新获取
|
|
*/
|
|
onMounted(() => {
|
|
if (!formulaStore.formulaList || !formulaStore.formulaList.length) {
|
|
formulaStore.initFormulaList()
|
|
}
|
|
})
|
|
|
|
/**
|
|
* @hook 响应式依赖监听
|
|
* @description 监听store数据变化,同步更新组件状态
|
|
*/
|
|
watchEffect(() => {
|
|
recipes.value = [...formulaStore.formulaList]
|
|
isDeviceIdle.value = homeStore.isDeviceIdle
|
|
})
|
|
|
|
/**
|
|
* @computed 计算属性 - 生成选择框选项
|
|
* @returns {System.Option[]} 包含label和value的选项数组
|
|
*/
|
|
const options = computed(() => {
|
|
const list = formulaStore.formulaList
|
|
const optionList: System.Option[] = []
|
|
list.forEach((item: Formula.FormulaItem) => {
|
|
optionList.push({
|
|
label: item.name.toString(),
|
|
value: item.formula_id,
|
|
})
|
|
})
|
|
return optionList
|
|
})
|
|
|
|
/**
|
|
* @function 确认选择处理函数
|
|
* @param {any} value - 选中的配方ID
|
|
* @description 关闭模态框,更新选中配方并转换数值类型
|
|
*/
|
|
const handleConfirm = (value: any) => {
|
|
if (!value) {
|
|
FtMessage.error('请选择配方')
|
|
return
|
|
}
|
|
console.log('value---', value)
|
|
isModalOpen.value = false
|
|
let selectedFormula = {}
|
|
formulaStore.formulaList.forEach((item: Formula.FormulaItem) => {
|
|
if (item.formula_id === value) {
|
|
selectedFormula = item
|
|
}
|
|
})
|
|
const selectedFormulaToInt = convertValuesToInt(selectedFormula)
|
|
formulaStore.updateSelectedFormulaDataByList(selectedFormulaToInt as Formula.FormulaItem)
|
|
}
|
|
|
|
/**
|
|
* @function 取消选择处理函数
|
|
* @description 关闭模态框
|
|
*/
|
|
const handleCancel = () => {
|
|
isModalOpen.value = false
|
|
}
|
|
|
|
/**
|
|
* @function 打开选择配方模态框
|
|
* @description 触发模态框显示
|
|
*/
|
|
const onChooseFormula = () => {
|
|
isModalOpen.value = true
|
|
}
|
|
|
|
/**
|
|
* @function 应用默认配方
|
|
* @description 重置配方数据为默认配置
|
|
*/
|
|
const onDefaultFormula = () => {
|
|
formulaStore.initFormulaData()
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<div class="main-content">
|
|
<div v-if="isDeviceIdle">
|
|
<bt-button
|
|
type="primary"
|
|
button-text="选择配方"
|
|
width="12vw"
|
|
height="5vh"
|
|
@click="onChooseFormula"
|
|
>
|
|
<template #icon>
|
|
<el-icon>
|
|
<Plus />
|
|
</el-icon>
|
|
</template>
|
|
</bt-button>
|
|
<bt-button
|
|
button-text="默认配置"
|
|
height="5vh"
|
|
width="12vw"
|
|
@click="onDefaultFormula"
|
|
>
|
|
<template #icon>
|
|
<el-icon>
|
|
<Operation />
|
|
</el-icon>
|
|
</template>
|
|
</bt-button>
|
|
</div>
|
|
<div class="formula-config">
|
|
<FormulaConfig type="home" />
|
|
</div>
|
|
<SelectModal
|
|
v-if="isModalOpen"
|
|
:options="options"
|
|
:selected-value="selectedValue"
|
|
placeholder="请选择"
|
|
@confirm="handleConfirm"
|
|
@cancel="handleCancel"
|
|
/>
|
|
</div>
|
|
</template>
|
|
|
|
<style lang="scss" scoped>
|
|
.main-content{
|
|
overflow: hidden;
|
|
height: auto;
|
|
//background: $gradient-color;
|
|
padding: 15px;
|
|
.formula-config{
|
|
display: grid;
|
|
padding: 10px;
|
|
width: 100%;
|
|
}
|
|
.formula-config-form{
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr;
|
|
gap: 5px;
|
|
}
|
|
.formdata-input{
|
|
width: 10vw;
|
|
}
|
|
}
|
|
</style>
|