Browse Source

配方拆开

master
王梦远 2 weeks ago
parent
commit
6696905fda
  1. 4
      src/components/audit/History.vue
  2. 256
      src/components/formula/FormulaConfig.vue
  3. 62
      src/components/formula/FormulaTable.vue
  4. 188
      src/components/formula/HomeFormulaConfig.vue
  5. 343
      src/components/formula/SettingFormulaConfig.vue
  6. 32
      src/components/home/HomeSetting.vue
  7. 9
      src/components/home/config.vue
  8. 15
      src/components/setting/User.vue
  9. 180
      src/stores/formulaStore.ts
  10. 1
      src/types/formula.d.ts
  11. 8
      src/views/formula/index.vue
  12. 2
      src/views/home/chart.vue
  13. 12
      src/views/setting/index.vue

4
src/components/audit/History.vue

@ -3,10 +3,12 @@
import { syncSendCmd } from 'apis/system' import { syncSendCmd } from 'apis/system'
import { ElMessageBox } from 'element-plus' import { ElMessageBox } from 'element-plus'
import { FtMessage } from 'libs/message' import { FtMessage } from 'libs/message'
import { useSystemStore } from 'stores/systemStore'
import { computed, onMounted, ref } from 'vue' import { computed, onMounted, ref } from 'vue'
import HistoryDetail from '../setting/HistoryDetail.vue' import HistoryDetail from '../setting/HistoryDetail.vue'
// const settingStore = useSettingStore() // const settingStore = useSettingStore()
const systemStore = useSystemStore()
const tableData = ref<string[]>([]) const tableData = ref<string[]>([])
const selectedRecords = ref<Setting.History[]>([]) const selectedRecords = ref<Setting.History[]>([])
const visible = ref(false) const visible = ref(false)
@ -113,7 +115,7 @@ const onClose = () => {
visible.value = false visible.value = false
} }
const deleteBtnVisible = computed(() => { const deleteBtnVisible = computed(() => {
return JSON.parse(localStorage.getItem('user') || '{}')?.roleType?.includes('admin')
return systemStore.systemUser?.name === 'admin'
}) })
</script> </script>

256
src/components/formula/FormulaConfig.vue

@ -1,5 +1,4 @@
<script lang="ts" setup> <script lang="ts" setup>
import { sendCmd, syncSendCmd } from 'apis/system'
import SelectModal from 'components/common/SelectModal/index.vue' import SelectModal from 'components/common/SelectModal/index.vue'
import SoftKeyboard from 'components/common/SoftKeyboard/index.vue' import SoftKeyboard from 'components/common/SoftKeyboard/index.vue'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
@ -9,21 +8,9 @@ import { useHomeStore } from 'stores/homeStore'
import { computed, inject, nextTick, onMounted, ref, watch, watchEffect } from 'vue' import { computed, inject, nextTick, onMounted, ref, watch, watchEffect } from 'vue'
import { FtMessage } from '@/libs/message' import { FtMessage } from '@/libs/message'
import { compareJSON, convertValuesToInt, convertValuesToString } from '@/libs/utils'
import { convertValuesToInt, convertValuesToString } from '@/libs/utils'
import { useFormulaStore } from '@/stores/formulaStore' import { useFormulaStore } from '@/stores/formulaStore'
/**
* 配方表单组件 - 用于配置和管理各种配方参数
* 支持三种模式主页模式(home)设置模式(setting)和配方管理模式(formula)
* @component
* @props {string} type - 组件使用模式可选值'home' | 'setting' | 'formula'
*/
const props = defineProps<{
type: string
formulaNameVisible: boolean
editable?: boolean
}>()
const homeStore = useHomeStore() const homeStore = useHomeStore()
const nameLength = 10 const nameLength = 10
@ -35,14 +22,8 @@ const targetInputRef = ref<HTMLInputElement | null>(null)
const isFlip = ref(true) const isFlip = ref(true)
/** /**
* 当前表单数据 * 当前表单数据
* 不同模式下有不同的初始值
* - home: 当前选中的配方
* - setting: 默认配方信息
* - formula: 当前选中的配方或默认配方
*/ */
const formData = ref<Record<string, any>>({
...formulaStore.defaultFormulaInfo,
})
const formData = ref<Record<string, any>>({})
/** /**
* 软键盘当前输入值 * 软键盘当前输入值
@ -87,52 +68,29 @@ const options = ref(formulaStore.logLevelOptions)
/** /**
* 标签单位映射表用于显示各参数的单位 * 标签单位映射表用于显示各参数的单位
*/ */
const labelUnitMap: Record<string, any> = {
injection_pump_speed: 'g/min',
continued_gs: 'ppm',
stoped_gs: 'ppm',
max_humidity: '%RH',
pre_heat_time_s: '秒',
continued_humi: '%RH',
stoped_humi: '%RH',
continued_satur: '%RS',
stoped_satur: '%RS',
loglevel: 'Log',
}
const labelUnitMap: Record<string, any> = formulaStore.labelUnitMap
const currentFormulaItem = ref() const currentFormulaItem = ref()
onMounted(() => { onMounted(() => {
initFormulaConfig()
formulaStore.getFormualDefaultData() //
registerGrandsonMethods && registerGrandsonMethods({ getFormData }) registerGrandsonMethods && registerGrandsonMethods({ getFormData })
formulaStore.initFormulaList() //
}) })
/** /**
* 组件挂载时注册方法供父组件调用 * 组件挂载时注册方法供父组件调用
*/ */
watchEffect(() => { watchEffect(() => {
if (props.type === 'home') {
formData.value = cloneDeep(formulaStore.selectedFormulaInfo) || cloneDeep(formulaStore.defaultFormulaInfo)
}
else if (props.type === 'setting') {
if (formulaStore.currentSelectedIndex === null) {
formData.value = cloneDeep(formulaStore.defaultFormulaInfo) formData.value = cloneDeep(formulaStore.defaultFormulaInfo)
} }
else { else {
if (formulaStore.formulaList.length === 0) {
formData.value = cloneDeep(formulaStore.resetFormulaInfo)
}
else {
formData.value = cloneDeep(formulaStore.currentSelectedFormulaInfo)
}
formData.value = cloneDeep(formulaStore.currentSelectedFormulaInfo)
} }
isFlip.value = formulaStore.flip isFlip.value = formulaStore.flip
// int. // int.
formData.value = convertValuesToInt(formData.value) formData.value = convertValuesToInt(formData.value)
}) })
const initFormulaConfig = () => {
if (!formulaStore.formulaList.length) {
formulaStore.getFormualDefaultData()
console.log(formulaStore.formulaConfigList)
}
}
/** /**
* 模态框是否打开 * 模态框是否打开
*/ */
@ -196,140 +154,46 @@ const formRef = ref(null)
* 根据不同的type属性值执行不同的保存逻辑 * 根据不同的type属性值执行不同的保存逻辑
*/ */
const handleSubmit = () => { const handleSubmit = () => {
if (props.type !== 'setting' && !formData.value.name) {
//
if (formData.value.name === '') {
FtMessage.warning('请输入配方名称') FtMessage.warning('请输入配方名称')
return return
} }
//
if (formData.value.name && formData.value.name.length > 20) { if (formData.value.name && formData.value.name.length > 20) {
FtMessage.warning('配方名称1-20字符') FtMessage.warning('配方名称1-20字符')
return return
} }
//
if (props.type === 'formula') {
onSaveFormula()
}
//
if (props.type === 'setting') {
onSaveSetting()
}
}
/**
* @computed 计算属性 - 设备状态判断
* @returns {boolean} - 设备是否处于空闲或已完成状态
* @desc 控制按钮可用状态
*/
const deviceState = computed(() => {
return disinfectionState.value.state === 'idle' || disinfectionState.value.state === 'finished'
})
/**
* 保存配方
* 根据是否有formula_id决定是添加新配方还是编辑已有配方
*/
const onSaveFormula = () => {
if (formData.value.formula_id) {
//
if (formData.value.formula_id) { //
// //
if (!deviceState.value && formulaStore.selectedFormulaInfo?.formula_id === formData.value.formula_id) { if (!deviceState.value && formulaStore.selectedFormulaInfo?.formula_id === formData.value.formula_id) {
ElMessage.warning('禁止修改正在执行的配方信息!') ElMessage.warning('禁止修改正在执行的配方信息!')
return return
} }
const formulaForm: Record<string, any> = convertValuesToString(formData.value, 'name') const formulaForm: Record<string, any> = convertValuesToString(formData.value, 'name')
onEditFormula(formulaForm.formula_id, formulaForm as Formula.FormulaItem)
}
else {
//
onAddFormula()
}
}
/**
* 保存设置
* 比较当前表单数据与默认配方数据的差异只更新有变化的字段
*/
const onSaveSetting = async () => {
//
const diff = compareJSON(formulaStore.defaultFormulaInfo, formData.value)
console.log(diff)
const diffKeys = Object.keys(diff)
if (diffKeys.length) {
await Promise.all(
diffKeys.map(async (key) => {
await setSettingFormulaConfig(key, diff[key].newVal || diff[key].obj2)
}),
)
FtMessage.success('配方修改成功')
formulaStore.editFormula(formulaForm.formula_id, formulaForm as Formula.FormulaItem)
} }
}
/**
* 设置配方配置项值
* @param {string} settingName - 设置名称
* @param {string} settingVal - 设置值
* @returns {Promise<void>}
*/
const setSettingFormulaConfig = async (settingName: string, settingVal: string) => {
await sendCmd({
className: 'SettingMgrService',
fnName: 'setSettingVal',
params: {
settingName,
settingVal: settingVal?.toString(),
},
})
formulaStore.getFormualDefaultData()
}
/**
* 添加新配方
* 先调用API创建新配方然后更新配方数据
*/
const onAddFormula = () => {
const params = {
className: 'SettingMgrService',
fnName: 'addNewFormula',
else { //
formulaStore.onAddFormula().then((res) => {
if (res.ackcode === 0) {
const item = res.rely
const formulaForm: Record<string, any> = convertValuesToString(formData.value, 'name')
formulaForm.formula_id = item.formula_id
formulaStore.editFormula(item.formula_id, formulaForm as Formula.FormulaItem).then(() => {
FtMessage.success('操作成功')
formulaStore.initFormulaList()
})
}
})
} }
syncSendCmd(params).then((res) => {
if (res.ackcode === 0) {
const item = res.rely
const formulaForm: Record<string, any> = convertValuesToString(formData.value, 'name')
// formulaForm.name = item.name
formulaForm.formula_id = item.formula_id
onEditFormula(item.formula_id, formulaForm as Formula.FormulaItem)
formulaStore.initFormulaList()
}
})
} }
/** /**
* 编辑配方
* @param {string} formula_id - 配方ID
* @param {Formula.FormulaItem} formulaForm - 配方表单数据
* @computed 计算属性 - 设备状态判断
* @returns {boolean} - 设备是否处于空闲或已完成状态
* @desc 控制按钮可用状态
*/ */
const onEditFormula = (formula_id: string, formulaForm: Formula.FormulaItem) => {
const editParams = {
className: 'SettingMgrService',
fnName: 'updateFormula',
params: {
formula_id,
formula: cloneDeep(formulaForm),
},
}
syncSendCmd(editParams).then(() => {
FtMessage.success('操作成功')
formulaStore.initFormulaList()
// formData.value = formulaForm
formulaStore.updateSelectedFormulaData(formulaForm)
if (
formulaStore.selectedFormulaInfo !== null
&& formulaStore.selectedFormulaInfo.formula_id === formulaForm.formula_id
) {
formulaStore.updateSelectedFormulaDataByList(formulaForm)
}
})
}
const deviceState = computed(() => {
return disinfectionState.value.state === 'idle' || disinfectionState.value.state === 'finished'
})
/** /**
* 打开软键盘 * 打开软键盘
* @param {Event} e - 事件对象 * @param {Event} e - 事件对象
@ -349,25 +213,6 @@ const openKeyboard = (e: any, item: Formula.FormulaItem) => {
targetInputRef.value = inputDom targetInputRef.value = inputDom
}, 100) }, 100)
} }
/**
* 取消操作重置配方数据
*/
// const handleCancel = () => {
// formulaStore.initFormulaData()
// }
/**
* 恢复默认设置
*/
const handleResetDefault = async () => {
await sendCmd({
className: 'SettingMgrService',
fnName: 'factoryResetSettings',
})
await formulaStore.getFormualDefaultData()
}
/** /**
* 确认输入值 * 确认输入值
* @param {string} value - 输入值 * @param {string} value - 输入值
@ -403,32 +248,16 @@ const size = 'default'
// //
const addFormula = async () => { const addFormula = async () => {
const formulaInfo = cloneDeep(formulaStore.defaultFormulaInfo) const formulaInfo = cloneDeep(formulaStore.defaultFormulaInfo)
console.log(formulaInfo)
formData.value = formulaInfo
formData.value = convertValuesToInt(formulaInfo)
await nextTick() // DOM await nextTick() // DOM
//
formData.value.name = '' formData.value.name = ''
formData.value.formula_id = null formData.value.formula_id = null
console.log('子组件方法被调用')
} }
// //
defineExpose({ defineExpose({
addFormula, addFormula,
}) })
const isDisabled = computed(() => {
console.log('112223344', props.editable)
// editablefalse
if (props.editable === false) {
return true
}
// editabletrue
if (props.editable === true) {
return false
}
// editable沿
return props.type === 'home'
})
</script> </script>
<template> <template>
@ -436,25 +265,19 @@ const isDisabled = computed(() => {
<div v-if="isFlip" class="formula-form"> <div v-if="isFlip" class="formula-form">
<el-form <el-form
ref="formRef" ref="formRef"
:disabled="isDisabled"
:model="formData" :model="formData"
label-width="auto" label-width="auto"
label-position="right" label-position="right"
:size="size" :size="size"
inline inline
> >
<el-form-item v-if="type !== 'setting' && formulaNameVisible" label="配方名称" style="width: 93%">
<el-form-item label="配方名称" style="width: 93%">
<el-input <el-input
v-model="formData.name" v-model="formData.name"
v-prevent-keyboard v-prevent-keyboard
:rules="[
{ required: true, message: '配方名称必填', trigger: 'blur' },
{ min: '1', max: '20', message: '配方名称1-20个字符', trigger: 'blur' },
]"
name="name" name="name"
prop="name" prop="name"
placeholder="配方名称" placeholder="配方名称"
:disabled="isDisabled"
@focus="openKeyboard" @focus="openKeyboard"
/> />
</el-form-item> </el-form-item>
@ -464,7 +287,7 @@ const isDisabled = computed(() => {
:label="formulaNameMap[item.setting_id]" :label="formulaNameMap[item.setting_id]"
style="width: 50%" style="width: 50%"
> >
<template v-if="item.val_type === 'int'">
<template v-if="item.is_visible_in_formula_page && item.val_type === 'int'">
<el-input <el-input
v-model.number="formData[item.setting_id]" v-model.number="formData[item.setting_id]"
v-prevent-keyboard v-prevent-keyboard
@ -480,7 +303,7 @@ const isDisabled = computed(() => {
</template> </template>
</el-input> </el-input>
</template> </template>
<template v-if="item.val_type === 'float' && type === 'setting'">
<template v-if="item.is_visible_in_formula_page && item.val_type === 'float'">
<el-input <el-input
v-model.number="formData[item.setting_id]" v-model.number="formData[item.setting_id]"
v-prevent-keyboard v-prevent-keyboard
@ -496,7 +319,7 @@ const isDisabled = computed(() => {
</template> </template>
</el-input> </el-input>
</template> </template>
<template v-else-if="item.val_type === 'enum'">
<template v-else-if="item.is_visible_in_formula_page && item.val_type === 'enum'">
<el-input <el-input
v-model="formData[item.setting_id]" v-model="formData[item.setting_id]"
v-prevent-keyboard v-prevent-keyboard
@ -510,7 +333,7 @@ const isDisabled = computed(() => {
</template> </template>
</el-input> </el-input>
</template> </template>
<template v-else-if="item.val_type === 'boolean'">
<template v-else-if="item.is_visible_in_formula_page && item.val_type === 'boolean'">
<el-radio-group v-model="formData[item.setting_id]" :disabled="!item.is_visible_in_setting_page"> <el-radio-group v-model="formData[item.setting_id]" :disabled="!item.is_visible_in_setting_page">
<el-radio :label="true"> <el-radio :label="true">
@ -522,13 +345,10 @@ const isDisabled = computed(() => {
</template> </template>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div v-if="type !== 'home'" :style="{ marginLeft: '33%' }">
<div :style="{ marginLeft: '33%' }">
<slot name="formulaBtn"> <slot name="formulaBtn">
<div class="default-btn"> <div class="default-btn">
<el-button v-if="type === 'setting'" class="config-btn" @click="handleResetDefault">
恢复默认值
</el-button>
<el-button v-if="!isDisabled" type="primary" class="config-btn" @click="handleSubmit">
<el-button type="primary" class="config-btn" @click="handleSubmit">
确定 确定
</el-button> </el-button>
</div> </div>

62
src/components/formula/FormulaTable.vue

@ -1,8 +1,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { syncSendCmd } from 'apis/system'
import { ElMessage, ElMessageBox } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
import { cloneDeep } from 'lodash'
import { onMounted, ref, watch } from 'vue'
import { useSystemStore } from 'stores/systemStore'
import { onMounted, ref } from 'vue'
import { FtMessage } from '@/libs/message' import { FtMessage } from '@/libs/message'
import { FtMessageBox } from '@/libs/messageBox' import { FtMessageBox } from '@/libs/messageBox'
@ -10,15 +9,14 @@ import { convertValuesToInt } from '@/libs/utils'
import { useFormulaStore } from '@/stores/formulaStore' import { useFormulaStore } from '@/stores/formulaStore'
const formulaStore = useFormulaStore() const formulaStore = useFormulaStore()
const systemStore = useSystemStore()
const currentFormula = ref<Formula.FormulaItem>(formulaStore.currentSelectedFormulaInfo) const currentFormula = ref<Formula.FormulaItem>(formulaStore.currentSelectedFormulaInfo)
// //
const selectedIndexRest = async () => { const selectedIndexRest = async () => {
formulaStore.updateSelectedIndex(null)
formulaStore.updateCurrentSelectedIndex(null)
console.log('子组件方法被调用') console.log('子组件方法被调用')
} }
const userData = localStorage.getItem('user')
const userInfo = userData ? JSON.parse(userData) : {}
// //
defineExpose({ defineExpose({
@ -28,54 +26,25 @@ defineExpose({
onMounted(() => { onMounted(() => {
initFormulaList() initFormulaList()
}) })
watch(() => formulaStore.selectedIndex, () => {
if (formulaStore.selectedIndex == null) {
if (formulaStore.formulaList && formulaStore.formulaList.length > 0) {
formulaStore.updateSelectedIndex(formulaStore.formulaList.length - 1)
const currentIndex: number | null = formulaStore.selectedIndex
const selectItem: Formula.FormulaItem = formulaStore.formulaList[currentIndex]
const item = convertValuesToInt(selectItem) as Formula.FormulaItem
formulaStore.updateSelectedFormulaData(item)
}
else {
const formData = cloneDeep(formulaStore.resetFormulaInfo)
formulaStore.updateSelectedFormulaData(convertValuesToInt(formData) as Formula.FormulaItem)
}
}
else {
const currentIndex: number = formulaStore.selectedIndex
const selectItem: Formula.FormulaItem = formulaStore.formulaList[currentIndex]
const item = convertValuesToInt(selectItem) as Formula.FormulaItem
formulaStore.updateSelectedFormulaData(item)
}
})
const initFormulaList = () => { const initFormulaList = () => {
formulaStore.initFormulaList() formulaStore.initFormulaList()
} }
const selectRecipe = (item: Formula.FormulaItem, index: number) => { const selectRecipe = (item: Formula.FormulaItem, index: number) => {
formulaStore.updateSelectedIndex(index)
formulaStore.updateSelectedIndex(index)
formulaStore.updateCurrentSelectedIndex(index)
item = convertValuesToInt(item) as Formula.FormulaItem item = convertValuesToInt(item) as Formula.FormulaItem
formulaStore.updateSelectedFormulaData(item)
formulaStore.updateCurrentSelectedFormulaData(item)
} }
const onStartFormula = (item: Formula.FormulaItem) => { const onStartFormula = (item: Formula.FormulaItem) => {
formulaStore.updateSelectedFormulaData(item)
formulaStore.updateSelectedFormula(item)
// //
FtMessageBox.warning('请确认是否使用此配方进行消毒?').then(() => { FtMessageBox.warning('请确认是否使用此配方进行消毒?').then(() => {
currentFormula.value = item currentFormula.value = item
if (item.formula_id) { if (item.formula_id) {
const params = {
className: 'DisinfectionCtrlServiceExt',
fnName: 'startWithFormula',
params: {
formulaid: item.formula_id,
},
}
syncSendCmd(params).then((res) => {
formulaStore.startFormula(item.formula_id as string).then((res) => {
if (res.ackcode === 0) { if (res.ackcode === 0) {
// //
formulaStore.updateSelectedFormulaDataByList(item)
formulaStore.updateSelectedFormula(item)
FtMessage.success('已开始消毒') FtMessage.success('已开始消毒')
} }
}) })
@ -94,14 +63,7 @@ const deleteRecipe = (item: Formula.FormulaItem) => {
return return
} }
if (item.formula_id) { if (item.formula_id) {
const delParams = {
className: 'SettingMgrService',
fnName: 'delFormula',
params: {
formula_id: item.formula_id,
},
}
syncSendCmd(delParams).then(() => {
formulaStore.delFormula(item.formula_id as string).then(() => {
FtMessage.success('操作成功') FtMessage.success('操作成功')
formulaStore.initFormulaList() formulaStore.initFormulaList()
}) })
@ -116,7 +78,7 @@ const deleteRecipe = (item: Formula.FormulaItem) => {
<li <li
v-for="(item, index) in formulaStore.formulaList" v-for="(item, index) in formulaStore.formulaList"
:key="index" :key="index"
:class="{ selected: formulaStore.selectedIndex === index }"
:class="{ selected: formulaStore.currentSelectedIndex === index }"
@click="selectRecipe(item, index)" @click="selectRecipe(item, index)"
> >
<span class="formula-name">{{ item.name }}</span> <span class="formula-name">{{ item.name }}</span>
@ -124,7 +86,7 @@ const deleteRecipe = (item: Formula.FormulaItem) => {
<el-button class="view-button" @click.stop="onStartFormula(item)"> <el-button class="view-button" @click.stop="onStartFormula(item)">
执行配方 执行配方
</el-button> </el-button>
<el-button v-if="userInfo.roleType === 'admin'" class="delete-button" @click.stop="deleteRecipe(item)">
<el-button v-if="systemStore.systemUser?.name === 'admin'" class="delete-button" @click.stop="deleteRecipe(item)">
删除 删除
</el-button> </el-button>
</div> </div>

188
src/components/formula/HomeFormulaConfig.vue

@ -0,0 +1,188 @@
<script lang="ts" setup>
import { formulaNameMap } from 'libs/constant'
import { inject, onMounted, ref, watchEffect } from 'vue'
import { convertValuesToInt, convertValuesToString } from '@/libs/utils'
import { useFormulaStore } from '@/stores/formulaStore'
const props = defineProps<{
formulaNameVisible: boolean
}>()
const formulaStore = useFormulaStore()
/**
* 获取当前表单数据将值转换为字符串格式
* @returns {Record<string, string>} 转换后的表单数据
*/
const getFormData = () => {
return convertValuesToString(formData.value, 'name')
}
/**
* 注册孙子组件方法的注入函数
*/
const registerGrandsonMethods = inject<(methods: any) => void>('registerGrandsonMethods', () => {})
onMounted(() => {
registerGrandsonMethods && registerGrandsonMethods({ getFormData })
})
/**
* 当前表单数据
* - home: 当前选中的配方 或者默认配方
*/
const formData = ref<Record<string, any>>({})
/**
* 标签单位映射表用于显示各参数的单位
*/
const labelUnitMap: Record<string, any> = formulaStore.labelUnitMap
/**
* 监听事件
*/
watchEffect(() => {
formData.value = formulaStore.selectedFormulaInfo !== null ? convertValuesToInt(formulaStore.selectedFormulaInfo) : convertValuesToInt(formulaStore.defaultFormulaInfo)
})
/**
* 配方配置列表
*/
const formulaConfigList = formulaStore.formulaConfigList
const size = 'default'
</script>
<template>
<div class="formula-form">
<el-form
:disabled="true"
:model="formData"
label-width="auto"
label-position="right"
:size="size"
inline
>
<el-form-item v-if="props.formulaNameVisible" label="配方名称" style="width: 93%">
<el-input
v-model="formData.name"
v-prevent-keyboard
name="name"
placeholder="配方名称"
:disabled="true"
/>
</el-form-item>
<el-form-item
v-for="item in formulaConfigList"
:key="item.setting_id"
:label="formulaNameMap[item.setting_id]"
style="width: 50%"
>
<template v-if="item.is_visible_in_rt_page && item.val_type === 'int'">
<el-input
v-model.number="formData[item.setting_id]"
v-prevent-keyboard
style="width: 80%"
type="number"
:name="item.setting_id"
:controls="false"
:disabled="!item.is_editable"
>
<template v-if="labelUnitMap[item.setting_id]" #append>
{{ labelUnitMap[item.setting_id] }}
</template>
</el-input>
</template>
<template v-if="item.is_visible_in_rt_page && item.val_type === 'float'">
<el-input
v-model.number="formData[item.setting_id]"
v-prevent-keyboard
style="width: 80%"
type="number"
:name="item.setting_id"
:controls="false"
:disabled="!item.is_editable"
>
<template v-if="labelUnitMap[item.setting_id]" #append>
{{ labelUnitMap[item.setting_id] }}
</template>
</el-input>
</template>
<template v-else-if="item.is_visible_in_rt_page && item.val_type === 'enum'">
<el-input
v-model="formData[item.setting_id]"
v-prevent-keyboard
style="width: 80%"
placeholder="请选择"
readonly
:disabled="!item.is_editable"
>
<template #append>
{{ labelUnitMap[item.setting_id] }}
</template>
</el-input>
</template>
<template v-else-if="item.is_visible_in_rt_page && item.val_type === 'boolean'">
<el-radio-group v-model="formData[item.setting_id]" :disabled="!item.is_editable">
<el-radio :label="true">
</el-radio>
<el-radio :label="false">
</el-radio>
</el-radio-group>
</template>
</el-form-item>
</el-form>
</div>
</template>
<style lang="scss" scoped>
.formula-form {
font-size: 20px !important;
padding: 5px;
padding-left: 15px;
align-items: center;
.default-btn {
margin-top: 1rem;
}
.config-btn {
height: 3rem;
width: 8rem;
}
}
.formula-form-item {
display: grid;
grid-template-columns: 1fr 1fr;
}
.formData-input-config {
width: 10vw;
}
:deep(.el-input__inner) {
text-align: left;
height: 40px;
}
:deep(.el-form-item) {
margin-right: 0;
align-items: center;
}
/* 进入动画的初始状态 */
.slide-right-enter-from {
transform: translateX(100%);
}
/* 进入动画的结束状态(也可以理解为激活状态) */
.slide-right-enter-to {
transform: translateX(0);
}
/* 进入动画的过渡曲线等 */
.slide-right-enter-active {
transition: transform 0.3s ease-in-out;
}
/* 离开动画的初始状态(激活状态) */
.slide-right-leave-from {
transform: translateX(0);
}
/* 离开动画的结束状态 */
.slide-right-leave-to {
transform: translateX(100%);
}
/* 离开动画的过渡曲线等 */
.slide-right-leave-active {
transition: transform 0.3s ease-in-out;
}
</style>

343
src/components/formula/SettingFormulaConfig.vue

@ -0,0 +1,343 @@
<script lang="ts" setup>
import SelectModal from 'components/common/SelectModal/index.vue'
import SoftKeyboard from 'components/common/SoftKeyboard/index.vue'
import { formulaNameMap } from 'libs/constant'
import { cloneDeep } from 'lodash'
import { onMounted, ref, watch, watchEffect } from 'vue'
import { FtMessage } from '@/libs/message'
import { compareJSON, convertValuesToInt } from '@/libs/utils'
import { useFormulaStore } from '@/stores/formulaStore'
const props = defineProps<{
editable: boolean
}>()
const formulaStore = useFormulaStore()
const targetInputRef = ref<HTMLInputElement | null>(null)
/**
* 当前表单数据
* 不同模式下有不同的初始值
* - home: 当前选中的配方
* - setting: 默认配方信息
* - formula: 当前选中的配方或默认配方
*/
const formData = ref<Record<string, any>>({
...formulaStore.defaultFormulaInfo,
})
/**
* 软键盘当前输入值
*/
const inputValue = ref<string>('')
/**
* 软键盘是否可见
*/
const keyboardVisible = ref(false)
/**
* 软键盘类型'text' 'number'
*/
const keyboardType = ref<'text' | 'number'>('number')
/**
* 软键盘组件引用
*/
const softKeyboardRef = ref()
/**
* 当前聚焦的输入字段名称
*/
const focusedInput = ref<string | null>(null)
/**
* 日志级别选项列表
*/
const options = ref(formulaStore.logLevelOptions)
/**
* 标签单位映射表用于显示各参数的单位
*/
const labelUnitMap: Record<string, any> = formulaStore.labelUnitMap
/**
* 配方配置列表
*/
const formulaConfigList = ref(formulaStore.formulaConfigList)
/**
* 组件挂载时注册方法供父组件调用
*/
watchEffect(() => {
formData.value = cloneDeep(formulaStore.defaultFormulaInfo)
formData.value = convertValuesToInt(formData.value)
})
/**
* 模态框是否打开
*/
const isModalOpen = ref(false)
/**
* 打开模态框
*/
const openModal = () => {
isModalOpen.value = true
}
const currentFormulaItem = ref()
/**
* 监听软键盘输入值变化更新表单数据
* @param {string | number} newVal - 新的输入值
*/
watch(inputValue, (newVal: string | number) => {
if (focusedInput.value) {
newVal = Number(newVal)
if (currentFormulaItem.value && newVal > currentFormulaItem.value.val_upper_limit) {
newVal = currentFormulaItem.value.val_upper_limit
}
formData.value[focusedInput.value] = newVal
}
})
/**
* 监听表单数据变化同步更新软键盘输入值
* @param {Record<string, any>} newValue - 新的表单数据
*/
watch(
formData,
(newValue) => {
if (focusedInput.value) {
inputValue.value = newValue[focusedInput.value].toString()
}
},
{ deep: true },
)
const formRef = ref(null)
//
onMounted(() => {
formulaStore.getFormualDefaultData()
})
/**
* 处理表单提交
* 根据不同的type属性值执行不同的保存逻辑
*/
const handleSubmit = () => {
//
const diff = compareJSON(formulaStore.defaultFormulaInfo, formData.value)
const diffKeys = Object.keys(diff)
if (diffKeys.length) {
Promise.all(
diffKeys.map(async (key) => {
await formulaStore.setSettingFormulaConfig(key, diff[key].newVal || diff[key].obj2)
}),
)
FtMessage.success('配方修改成功')
}
formulaStore.getFormualDefaultData()
}
/**
* 打开软键盘
* @param {Event} e - 事件对象
* @param item
*/
const openKeyboard = (e: any, item: Formula.FormulaItem) => {
setTimeout(() => {
keyboardVisible.value = true
const labelName: string = e.target.name
openKeyboardType(labelName)
const formValue = formData.value[labelName]
inputValue.value = formValue.toString()
focusedInput.value = e.target.name
currentFormulaItem.value = item
const inputDom = e.target as HTMLInputElement
targetInputRef.value = inputDom
}, 100)
}
/**
* 确认输入值
* @param {string} value - 输入值
*/
const handleConfirm = (value: string) => {
console.log('确认输入:', value)
}
/**
* 确认日志级别选择
* @param {any} value - 选择的值
*/
const handleLogConfirm = (value: any) => {
isModalOpen.value = false
formData.value.loglevel = value
formulaStore.updateLogLevel(value)
}
/**
* 取消日志级别选择
*/
const handleLogCancel = () => {
isModalOpen.value = false
}
/**
* 根据标签名称确定软键盘类型
* @param {string} labelName - 标签名称
*/
const openKeyboardType = (labelName: string) => {
keyboardType.value = labelName === 'name' ? 'text' : 'number'
}
const size = 'default'
</script>
<template>
<div class="formula-form">
<el-form
ref="formRef"
:disabled="props.editable"
:model="formData"
label-width="auto"
label-position="right"
:size="size"
inline
>
<el-form-item
v-for="item in formulaConfigList"
:key="item.setting_id"
:label="formulaNameMap[item.setting_id]"
style="width: 50%"
>
<template v-if="item.is_visible_in_setting_page && item.val_type === 'int'">
<el-input
v-model.number="formData[item.setting_id]"
v-prevent-keyboard
style="width: 80%"
type="number"
:name="item.setting_id"
:controls="false"
:disabled="!props.editable"
@focus="e => openKeyboard(e, item)"
>
<template v-if="labelUnitMap[item.setting_id]" #append>
{{ labelUnitMap[item.setting_id] }}
</template>
</el-input>
</template>
<template v-if="item.is_visible_in_setting_page && item.val_type === 'float'">
<el-input
v-model.number="formData[item.setting_id]"
v-prevent-keyboard
style="width: 80%"
type="number"
:name="item.setting_id"
:controls="false"
:disabled="!props.editable"
@focus="e => openKeyboard(e, item)"
>
<template v-if="labelUnitMap[item.setting_id]" #append>
{{ labelUnitMap[item.setting_id] }}
</template>
</el-input>
</template>
<template v-else-if="item.is_visible_in_setting_page && item.val_type === 'enum'">
<el-input
v-model="formData[item.setting_id]"
v-prevent-keyboard
style="width: 80%"
placeholder="请选择"
readonly
:disabled="!props.editable"
@focus="openModal"
>
<template #append>
{{ labelUnitMap[item.setting_id] }}
</template>
</el-input>
</template>
</el-form-item>
</el-form>
<div :style="{ marginLeft: '33%' }">
<slot name="formulaBtn">
<div class="default-btn">
<el-button v-if="editable" type="primary" class="config-btn" @click="handleSubmit">
确定
</el-button>
</div>
</slot>
</div>
<Teleport to="body">
<SoftKeyboard
ref="softKeyboardRef"
v-model="inputValue"
:is-visible="keyboardVisible"
:keyboard-type="keyboardType"
:target-input="targetInputRef"
@confirm="handleConfirm"
@update-keyboard-visible="visible => (keyboardVisible = visible)"
@close="keyboardVisible = false"
/>
</Teleport>
<SelectModal
v-if="isModalOpen"
:options="options"
:selected-value="formData.loglevel"
placeholder="请选择"
@confirm="handleLogConfirm"
@cancel="handleLogCancel"
/>
</div>
</template>
<style lang="scss" scoped>
.formula-form {
font-size: 20px !important;
padding: 5px;
padding-left: 15px;
align-items: center;
.default-btn {
margin-top: 1rem;
}
.config-btn {
height: 3rem;
width: 8rem;
}
}
.formula-form-item {
display: grid;
grid-template-columns: 1fr 1fr;
}
.formData-input-config {
width: 10vw;
}
:deep(.el-input__inner) {
text-align: left;
height: 40px;
}
:deep(.el-form-item) {
margin-right: 0;
align-items: center;
}
/* 进入动画的初始状态 */
.slide-right-enter-from {
transform: translateX(100%);
}
/* 进入动画的结束状态(也可以理解为激活状态) */
.slide-right-enter-to {
transform: translateX(0);
}
/* 进入动画的过渡曲线等 */
.slide-right-enter-active {
transition: transform 0.3s ease-in-out;
}
/* 离开动画的初始状态(激活状态) */
.slide-right-leave-from {
transform: translateX(0);
}
/* 离开动画的结束状态 */
.slide-right-leave-to {
transform: translateX(100%);
}
/* 离开动画的过渡曲线等 */
.slide-right-leave-active {
transition: transform 0.3s ease-in-out;
}
</style>

32
src/components/home/HomeSetting.vue

@ -92,7 +92,7 @@ const disinfectFormulaTitle = ref<string>('消毒设置')
* @desc 根据当前选中配方或默认配方初始化设置 * @desc 根据当前选中配方或默认配方初始化设置
*/ */
const onDisinfectConfig = (title: string) => { const onDisinfectConfig = (title: string) => {
formulaStore.updateSelectedFormulaDataByList(selectedByFormulas.value || cloneDeep(formulaStore.defaultFormulaInfo))
formulaStore.updateSelectedFormula(selectedByFormulas.value || cloneDeep(formulaStore.defaultFormulaInfo))
disinfectFormulaVisible.value = true disinfectFormulaVisible.value = true
disinfectFormulaTitle.value = title disinfectFormulaTitle.value = title
} }
@ -114,7 +114,7 @@ const onSave = async () => {
if (!formData) { if (!formData) {
return return
} }
formulaStore.updateSelectedFormulaDataByList(cloneDeep(formData)) //
formulaStore.updateSelectedFormula(cloneDeep(formData)) //
if (!homeStore.isDeviceIdle) { if (!homeStore.isDeviceIdle) {
// //
@ -131,19 +131,17 @@ const onSave = async () => {
await setRealtimeConfig(key, diff[key].newVal) await setRealtimeConfig(key, diff[key].newVal)
}), }),
) )
FtMessage.success('配方修改成功')
FtMessage.success('修改成功')
} }
} }
else { else {
// //
if (formData.formula_id) { if (formData.formula_id) {
formulaStore.updateSelectedFormulaDataByList(formData)
formulaStore.updateSelectedFormula(formData)
} }
} }
onClose() // onClose() //
} }
console.log(onSave)
/** /**
* @function 设置实时消毒参数 * @function 设置实时消毒参数
* @param {string} key - 参数键名 * @param {string} key - 参数键名
@ -221,8 +219,6 @@ const handleCancel = () => {
* @desc 重置对话框状态 * @desc 重置对话框状态
*/ */
const onClose = () => { const onClose = () => {
const formData = configRef.value?.getFormData()
formulaStore.updateSelectedFormulaDataByList(cloneDeep(formData))
disinfectFormulaVisible.value = false disinfectFormulaVisible.value = false
} }
@ -303,16 +299,16 @@ const deviceType = computed(() => {
height="3rem" height="3rem"
@click="onClose" @click="onClose"
/> />
<!-- <BtButton -->
<!-- bg-color="#1989fa" -->
<!-- button-text="确认" -->
<!-- border-radius="5px" -->
<!-- width="7rem" -->
<!-- text-size="1.5rem" -->
<!-- text-color="#ffffff" -->
<!-- height="3rem" -->
<!-- @click="onSave" -->
<!-- /> -->
<BtButton
bg-color="#1989fa"
button-text="确认"
border-radius="5px"
width="7rem"
text-size="1.5rem"
text-color="#ffffff"
height="3rem"
@click="onSave"
/>
</div> </div>
</template> </template>
</ft-dialog> </ft-dialog>

9
src/components/home/config.vue

@ -1,6 +1,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { Operation, Plus } from '@element-plus/icons-vue'
import SelectModal from 'components/common/SelectModal/index.vue' import SelectModal from 'components/common/SelectModal/index.vue'
import FormulaConfig from 'components/formula/FormulaConfig.vue'
import HomeFormulaConfig from 'components/formula/HomeFormulaConfig.vue'
import { FtMessage } from 'libs/message' import { FtMessage } from 'libs/message'
import { computed, onMounted, ref, watchEffect } from 'vue' import { computed, onMounted, ref, watchEffect } from 'vue'
@ -68,12 +69,10 @@ const handleConfirm = (value: any) => {
FtMessage.error('请选择配方') FtMessage.error('请选择配方')
return return
} }
console.log('value---', value)
isModalOpen.value = false isModalOpen.value = false
const selectedFormula = formulaStore.formulaList.find((item: Formula.FormulaItem) => item.formula_id === value) const selectedFormula = formulaStore.formulaList.find((item: Formula.FormulaItem) => item.formula_id === value)
const selectedFormulaToInt = convertValuesToInt(selectedFormula!) const selectedFormulaToInt = convertValuesToInt(selectedFormula!)
console.log('selectedFormulaToInt---', selectedFormulaToInt)
formulaStore.updateSelectedFormulaDataByList(selectedFormulaToInt as Formula.FormulaItem)
formulaStore.updateSelectedFormula(selectedFormulaToInt as Formula.FormulaItem)
} }
/** /**
@ -120,7 +119,7 @@ const onDefaultFormula = () => {
</bt-button> </bt-button>
</div> </div>
<div class="formula-config"> <div class="formula-config">
<FormulaConfig type="home" :formula-name-visible="!!isDeviceIdle" />
<HomeFormulaConfig :formula-name-visible="isDeviceIdle" type="setting" />
</div> </div>
<SelectModal <SelectModal
v-if="isModalOpen" v-if="isModalOpen"

15
src/components/setting/User.vue

@ -2,6 +2,7 @@
import { syncSendCmd } from 'apis/system' import { syncSendCmd } from 'apis/system'
import { FtMessage } from 'libs/message' import { FtMessage } from 'libs/message'
import { FtMessageBox } from 'libs/messageBox' import { FtMessageBox } from 'libs/messageBox'
import { useSystemStore } from 'stores/systemStore'
import { onMounted, ref } from 'vue' import { onMounted, ref } from 'vue'
import { useSettingStore } from '@/stores/settingStore' import { useSettingStore } from '@/stores/settingStore'
@ -12,9 +13,7 @@ import ModifyPwd from './ModifyPwd.vue'
const settingStore = useSettingStore() const settingStore = useSettingStore()
const tableData = ref(settingStore.userList) const tableData = ref(settingStore.userList)
const selectedUserList = ref<User.UserItem[]>([]) const selectedUserList = ref<User.UserItem[]>([])
const userData = localStorage.getItem('user')
const userInfo = userData ? JSON.parse(userData) : {}
const systemStore = useSystemStore()
onMounted(() => { onMounted(() => {
queryUserList() queryUserList()
}) })
@ -32,7 +31,7 @@ const queryUserList = () => {
} }
const updatePwd = (userItem: User.UserItem) => { const updatePwd = (userItem: User.UserItem) => {
// //
if (userInfo.roleType !== 'admin' && userInfo.id !== userItem.id) {
if (systemStore.systemUser?.name !== 'admin' && systemStore.systemUser?.id !== userItem.id) {
FtMessage.error('无权限修改密码') FtMessage.error('无权限修改密码')
return return
} }
@ -46,7 +45,7 @@ const onAddUser = () => {
} }
const onDelUser = (user: User.UserItem) => { const onDelUser = (user: User.UserItem) => {
// //
if (user.id === userInfo.id) {
if (user.id === systemStore.systemUser?.id) {
FtMessage.warning('自己不可删除自己') FtMessage.warning('自己不可删除自己')
return return
} }
@ -78,7 +77,7 @@ const handleSelectionChange = (users: User.UserItem[]) => {
<template> <template>
<div class="user"> <div class="user">
<div v-if="userInfo.roleType === 'admin'" class="add-user">
<div v-if="systemStore.systemUser?.roleType === 'admin'" class="add-user">
<bt-button type="primary" button-text="新增用户" @click="onAddUser" /> <bt-button type="primary" button-text="新增用户" @click="onAddUser" />
</div> </div>
<div class="user-table"> <div class="user-table">
@ -94,10 +93,10 @@ const handleSelectionChange = (users: User.UserItem[]) => {
<el-table-column prop="detail" label="操作" width="250"> <el-table-column prop="detail" label="操作" width="250">
<template #default="scoped"> <template #default="scoped">
<div class="user-opera"> <div class="user-opera">
<el-button v-if="scoped.row.id === userInfo.id || userInfo.roleType === 'admin'" class="view-button" @click.stop="updatePwd(scoped.row)">
<el-button v-if="scoped.row.id === systemStore.systemUser?.id || systemStore.systemUser?.roleType === 'admin'" class="view-button" @click.stop="updatePwd(scoped.row)">
修改密码 修改密码
</el-button> </el-button>
<el-button v-if="userInfo.roleType === 'admin'" class="delete-button" @click.stop="onDelUser(scoped.row)">
<el-button v-if="systemStore.systemUser?.roleType === 'admin'" class="delete-button" @click.stop="onDelUser(scoped.row)">
</el-button> </el-button>
</div> </div>

180
src/stores/formulaStore.ts

@ -1,7 +1,7 @@
import { sendCmd, syncSendCmd } from 'apis/system' import { sendCmd, syncSendCmd } from 'apis/system'
import { cloneDeep } from 'lodash' import { cloneDeep } from 'lodash'
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import { computed, ref, watch } from 'vue'
import { ref, watch } from 'vue'
import { FtMessage } from '@/libs/message' import { FtMessage } from '@/libs/message'
@ -18,43 +18,44 @@ const PRESSURE_TYPES = [
] ]
// 默认配方函数 // 默认配方函数
const createDefaultFormulaInfo = (): Formula.FormulaItem => ({
continued_gs: 200,
continued_humi: 60,
continued_satur: 60,
injection_pump_speed: 10,
loglevel: 6,
max_humidity: 90,
pre_heat_time_s: 120,
proportional_valve_default_value: 10,
stoped_gs: 300,
stoped_humi: 85,
stoped_satur: 85,
name: '默认配置',
})
// const createDefaultFormulaInfo = (): Formula.FormulaItem => ({
// continued_gs: 200,
// continued_humi: 60,
// continued_satur: 60,
// injection_pump_speed: 10,
// loglevel: 6,
// max_humidity: 90,
// pre_heat_time_s: 120,
// proportional_valve_default_value: 10,
// stoped_gs: 300,
// stoped_humi: 85,
// stoped_satur: 85,
// dvalue_correct_coefficient: 0
// name: '默认配方',
// })
// 清空配方函数 // 清空配方函数
const createResetFormulaInfo = (): Formula.FormulaItem => ({
continued_gs: '',
continued_humi: '',
continued_satur: '',
injection_pump_speed: '',
loglevel: '',
max_humidity: '',
pre_heat_time_s: '',
proportional_valve_default_value: '',
stoped_gs: '',
stoped_humi: '',
stoped_satur: '',
name: '',
})
// const createResetFormulaInfo = (): Formula.FormulaItem => ({
// continued_gs: '',
// continued_humi: '',
// continued_satur: '',
// injection_pump_speed: '',
// loglevel: '',
// max_humidity: '',
// pre_heat_time_s: '',
// proportional_valve_default_value: '',
// stoped_gs: '',
// stoped_humi: '',
// stoped_satur: '',
// name: '',
// })
export const useFormulaStore = defineStore('formula', () => { export const useFormulaStore = defineStore('formula', () => {
// 状态定义 // 状态定义
const logEnums = LOG_ITEMS const logEnums = LOG_ITEMS
const pressurList = PRESSURE_TYPES const pressurList = PRESSURE_TYPES
const logLevelOptions = ref<System.Option[]>([]) const logLevelOptions = ref<System.Option[]>([])
const defaultFormulaInfo = ref<Formula.FormulaItem>(createDefaultFormulaInfo())
const resetFormulaInfo = ref<Formula.FormulaItem>(createResetFormulaInfo())
const defaultFormulaInfo = ref<Formula.FormulaItem | null>(null)
// const resetFormulaInfo = ref<Formula.FormulaItem>(createResetFormulaInfo())
const pressurOptionList = ref<string[]>(['10%', '20%', '30%', '40%', '50%', '60%', '70%', '80%', '90%', '100%']) const pressurOptionList = ref<string[]>(['10%', '20%', '30%', '40%', '50%', '60%', '70%', '80%', '90%', '100%'])
const currentSelectedFormulaInfo = ref<Formula.FormulaItem>(cloneDeep(defaultFormulaInfo.value)) // 当前列表选中的配方信息 const currentSelectedFormulaInfo = ref<Formula.FormulaItem>(cloneDeep(defaultFormulaInfo.value)) // 当前列表选中的配方信息
const selectedFormulaInfo = ref<Formula.FormulaItem | null>(cloneDeep(defaultFormulaInfo.value)) // 选中执行的配方信息 const selectedFormulaInfo = ref<Formula.FormulaItem | null>(cloneDeep(defaultFormulaInfo.value)) // 选中执行的配方信息
@ -62,8 +63,21 @@ export const useFormulaStore = defineStore('formula', () => {
const formulaList = ref<Formula.FormulaItem[]>([]) const formulaList = ref<Formula.FormulaItem[]>([])
const loglevel = ref<string>('1') const loglevel = ref<string>('1')
const flip = ref(true) const flip = ref(true)
const selectedIndex = ref<number | null>(null) // 左侧列表选中值 从0开始
const currentSelectedIndex = ref<number | null>(null) // 左侧列表选中值 从0开始
// 标签单位映射表,用于显示各参数的单位
const labelUnitMap: Record<string, any> = {
injection_pump_speed: 'g/min',
continued_gs: 'ppm',
stoped_gs: 'ppm',
max_humidity: '%RH',
pre_heat_time_s: '秒',
continued_humi: '%RH',
stoped_humi: '%RH',
continued_satur: '%RS',
stoped_satur: '%RS',
loglevel: 'Log',
dvalue_correct_coefficient: '',
}
watch( watch(
defaultFormulaInfo, defaultFormulaInfo,
(newVal) => { (newVal) => {
@ -71,9 +85,6 @@ export const useFormulaStore = defineStore('formula', () => {
}, },
{ deep: true }, { deep: true },
) )
// 计算属性 todo bug 不能通过名字来判断
const isDefaultFormula = computed(() => selectedFormulaInfo.value?.name === defaultFormulaInfo.value.name)
/** /**
* @function mapConfigToFormula * @function mapConfigToFormula
* @param {Formula.FormulaConfig[]} config - * @param {Formula.FormulaConfig[]} config -
@ -154,17 +165,17 @@ export const useFormulaStore = defineStore('formula', () => {
* @param {Formula.FormulaItem} formulaItem - * @param {Formula.FormulaItem} formulaItem -
* @desc * @desc
*/ */
const updateSelectedFormulaData = (formulaItem: Formula.FormulaItem) => {
const updateCurrentSelectedFormulaData = (formulaItem: Formula.FormulaItem) => {
console.log('formulaItem--', formulaItem) console.log('formulaItem--', formulaItem)
currentSelectedFormulaInfo.value = cloneDeep(formulaItem) currentSelectedFormulaInfo.value = cloneDeep(formulaItem)
} }
/** /**
* @function updateSelectedFormulaDataByList
* @function updateSelectedFormula
* @param {Formula.FormulaItem} formulaItem - * @param {Formula.FormulaItem} formulaItem -
* @desc * @desc
*/ */
const updateSelectedFormulaDataByList = (formulaItem: Formula.FormulaItem) => {
const updateSelectedFormula = (formulaItem: Formula.FormulaItem) => {
selectedFormulaInfo.value = cloneDeep(formulaItem) selectedFormulaInfo.value = cloneDeep(formulaItem)
} }
@ -183,24 +194,39 @@ export const useFormulaStore = defineStore('formula', () => {
if (res.rely) { if (res.rely) {
formulaList.value = res.rely formulaList.value = res.rely
if (res.rely.length > 0) { if (res.rely.length > 0) {
console.log('selectedIndex.value--', selectedIndex.value)
console.log('selectedIndex.value--', currentSelectedIndex.value)
currentSelectedFormulaInfo.value = res.rely[res.rely.length - 1] currentSelectedFormulaInfo.value = res.rely[res.rely.length - 1]
selectedIndex.value = res.rely.length - 1
currentSelectedIndex.value = res.rely.length - 1
} }
else { else {
selectedIndex.value = null
currentSelectedIndex.value = null
} }
} }
else { else {
formulaList.value = [] formulaList.value = []
selectedIndex.value = null
currentSelectedIndex.value = null
} }
} }
catch (error) { catch (error) {
console.error('获取配方列表失败', error) console.error('获取配方列表失败', error)
} }
} }
/**
*
* @param {string} settingName -
* @param {string} settingVal -
* @returns {Promise<void>}
*/
const setSettingFormulaConfig = async (settingName: string, settingVal: string) => {
await sendCmd({
className: 'SettingMgrService',
fnName: 'setSettingVal',
params: {
settingName,
settingVal: settingVal?.toString(),
},
})
}
/** /**
* @function initFormulaData * @function initFormulaData
* @desc * @desc
@ -245,10 +271,54 @@ export const useFormulaStore = defineStore('formula', () => {
flip.value = data flip.value = data
} }
const updateSelectedIndex = (index: number | null) => {
selectedIndex.value = index
const updateCurrentSelectedIndex = (index: number | null) => {
currentSelectedIndex.value = index
}
const onAddFormula = () => {
const params = {
className: 'SettingMgrService',
fnName: 'addNewFormula',
}
return syncSendCmd(params)
}
/**
*
* @param {string} formula_id - ID
* @param {Formula.FormulaItem} formulaForm -
*/
const editFormula = (formula_id: string, formulaForm: Formula.FormulaItem) => {
const editParams = {
className: 'SettingMgrService',
fnName: 'updateFormula',
params: {
formula_id,
formula: cloneDeep(formulaForm),
},
}
return syncSendCmd(editParams)
}
// 删除配方
const delFormula = (formulaId: string) => {
const delParams = {
className: 'SettingMgrService',
fnName: 'delFormula',
params: {
formula_id: formulaId,
},
}
return syncSendCmd(delParams)
}
// 开始执行
const startFormula = (formulaId: string) => {
const params = {
className: 'DisinfectionCtrlServiceExt',
fnName: 'startWithFormula',
params: {
formulaid: formulaId,
},
}
return syncSendCmd(params)
} }
return { return {
// 属性 // 属性
logEnums, logEnums,
@ -261,22 +331,26 @@ export const useFormulaStore = defineStore('formula', () => {
logLevelOptions, logLevelOptions,
selectedFormulaInfo, selectedFormulaInfo,
defaultFormulaInfo, defaultFormulaInfo,
resetFormulaInfo,
isDefaultFormula,
flip, flip,
selectedIndex,
currentSelectedIndex,
labelUnitMap,
// 方法 // 方法
updatePressurList, updatePressurList,
updateSelectedFormulaData,
updateCurrentSelectedFormulaData,
initFormulaData, initFormulaData,
initFormulaList, initFormulaList,
updateSelectedFormulaDataByList,
updateSelectedFormula,
updateFormulaConfigData, updateFormulaConfigData,
startDisinfectFormula, startDisinfectFormula,
updateLogLevel, updateLogLevel,
resetToDefaultFormula, resetToDefaultFormula,
getFormualDefaultData, getFormualDefaultData,
updateFlip, updateFlip,
updateSelectedIndex,
updateCurrentSelectedIndex,
setSettingFormulaConfig,
onAddFormula,
editFormula,
delFormula,
startFormula,
} }
}) })

1
src/types/formula.d.ts

@ -12,6 +12,7 @@ declare namespace Formula {
stoped_humi: string | number stoped_humi: string | number
stoped_satur: string | number stoped_satur: string | number
name: string | number name: string | number
dvalue_correct_coefficient: string | number
formula_id?: string | number formula_id?: string | number
} }

8
src/views/formula/index.vue

@ -2,10 +2,12 @@
import { Plus } from '@element-plus/icons-vue' import { Plus } from '@element-plus/icons-vue'
import FormulaConfig from 'components/formula/FormulaConfig.vue' import FormulaConfig from 'components/formula/FormulaConfig.vue'
import FormulaTable from 'components/formula/FormulaTable.vue' import FormulaTable from 'components/formula/FormulaTable.vue'
import { useSystemStore } from 'stores/systemStore'
import { ref } from 'vue' import { ref } from 'vue'
// //
const formRef = ref() const formRef = ref()
const systemStore = useSystemStore()
const onAddFormula = () => { const onAddFormula = () => {
selectedIndexRest() selectedIndexRest()
formRef.value?.addFormula() formRef.value?.addFormula()
@ -14,15 +16,13 @@ const tableRef = ref()
const selectedIndexRest = () => { const selectedIndexRest = () => {
tableRef.value?.selectedIndexRest() // tableRef.value?.selectedIndexRest() //
} }
const userData = localStorage.getItem('user')
const userInfo = userData ? JSON.parse(userData) : {}
</script> </script>
<template> <template>
<div class="dashboard-container"> <div class="dashboard-container">
<main class="main-content"> <main class="main-content">
<div class="formula-left"> <div class="formula-left">
<div v-if="userInfo.roleType === 'admin'" class="formula-add">
<div v-if="systemStore.systemUser?.roleType === 'admin'" class="formula-add">
<bt-button <bt-button
type="primary" type="primary"
button-text="新增配方" button-text="新增配方"
@ -42,7 +42,7 @@ const userInfo = userData ? JSON.parse(userData) : {}
</div> </div>
</div> </div>
<div class="formula-right"> <div class="formula-right">
<FormulaConfig ref="formRef" type="formula" :formula-name-visible="true" :editable="userInfo.roleType === 'admin'" />
<FormulaConfig ref="formRef" type="formula" :formula-name-visible="true" :editable="systemStore.systemUser?.roleType === 'admin'" />
</div> </div>
</main> </main>
</div> </div>

2
src/views/home/chart.vue

@ -59,7 +59,7 @@ const onFinishDisinfect = async () => {
const onSave = () => { const onSave = () => {
const formData = configRef.value?.getFormData() const formData = configRef.value?.getFormData()
formulaStore.updateSelectedFormulaDataByList(cloneDeep(formData))
formulaStore.updateSelectedFormula(cloneDeep(formData))
onClose() onClose()
} }

12
src/views/setting/index.vue

@ -1,18 +1,18 @@
<script lang="ts" setup> <script lang="ts" setup>
import SettingFormulaConfig from 'components/formula/SettingFormulaConfig.vue'
import { useSystemStore } from 'stores/systemStore'
import { ref } from 'vue' import { ref } from 'vue'
import FormulaConfig from '@/components/formula/FormulaConfig.vue'
import Device from '@/components/setting/Device.vue' import Device from '@/components/setting/Device.vue'
import SystemDate from '@/components/setting/SystemDate.vue' import SystemDate from '@/components/setting/SystemDate.vue'
import User from '@/components/setting/User.vue' import User from '@/components/setting/User.vue'
import { useSettingStore } from '@/stores/settingStore' import { useSettingStore } from '@/stores/settingStore'
const systemStore = useSystemStore()
const settingStore = useSettingStore() const settingStore = useSettingStore()
const currentUserRoleType = JSON.parse(localStorage.getItem('user') || '{}')?.roleType const currentUserRoleType = JSON.parse(localStorage.getItem('user') || '{}')?.roleType
const settingMenus = settingStore.settingMenus.filter((item): boolean => item.roleType.includes(currentUserRoleType)) const settingMenus = settingStore.settingMenus.filter((item): boolean => item.roleType.includes(currentUserRoleType))
const selectedMenuCode = ref('defaultFormula') const selectedMenuCode = ref('defaultFormula')
const userData = localStorage.getItem('user')
const userInfo = userData ? JSON.parse(userData) : {}
// //
const selectItem = (menuCode: string) => { const selectItem = (menuCode: string) => {
selectedMenuCode.value = menuCode selectedMenuCode.value = menuCode
@ -39,10 +39,8 @@ const selectItem = (menuCode: string) => {
</div> </div>
<div class="setting-right"> <div class="setting-right">
<div v-if="selectedMenuCode === 'defaultFormula'"> <div v-if="selectedMenuCode === 'defaultFormula'">
<FormulaConfig
:type="userInfo.roleType === 'admin' ? 'setting' : 'home'"
:formula-name-visible="false"
:editable="userInfo.roleType === 'admin'"
<SettingFormulaConfig
:editable="systemStore.systemUser.roleType === 'admin'"
/> />
</div> </div>
<template v-if="selectedMenuCode === 'user'"> <template v-if="selectedMenuCode === 'user'">

Loading…
Cancel
Save