Browse Source

fix:首页状态修复

master
guoapeng 2 months ago
parent
commit
d1539c23d8
  1. 1
      src/app.vue
  2. 2
      src/components/SavePosition/index.vue
  3. 107
      src/components/home/FillSolution/index.vue
  4. 17
      src/components/home/SetTemperature/index.vue
  5. 175
      src/components/home/Tube/index.vue
  6. 45
      src/layouts/default.vue
  7. 2
      src/libs/utils.ts
  8. 22
      src/router/routes.ts
  9. 41
      src/stores/systemStore.ts
  10. 2
      src/types/home.d.ts
  11. 21
      src/views/container/liquidItem.vue
  12. 18
      src/views/debug/index.vue
  13. 250
      src/views/home/index.vue
  14. 4
      src/views/point/index.vue
  15. 1307
      src/views/pointDebug/index.vue
  16. 12
      src/views/user/index.vue

1
src/app.vue

@ -8,6 +8,7 @@ const systemStore = useSystemStore()
onMounted(async () => {
const res = await getStatus()
console.log(res)
console.log(systemStore.systemStatus)
systemStore.updateSystemStatus(res)
startProgress()
})

2
src/components/SavePosition/index.vue

@ -46,7 +46,7 @@ const cancel = () => {
<el-form-item label="名称" prop="id">
<el-select v-model="form.id" placeholder="请选择名称">
<el-option
v-for="item in pointList"
v-for="item in pointList.filter(i => i.type === '三维点')"
:key="item.id"
:label="item.name"
:value="item.code"

107
src/components/home/FillSolution/index.vue

@ -1,6 +1,8 @@
<script setup lang="ts">
import type { CheckboxValueType } from 'element-plus'
import { getContainerList } from 'apis/container'
import { getSolsList } from 'apis/solution'
import { FtMessage } from 'libs/message'
import { useHomeStore } from 'stores/homeStore'
import { useSolutionStore } from 'stores/useSolutionStore'
import { onMounted, ref } from 'vue'
@ -17,35 +19,10 @@ onMounted(() => {
const containerList = ref<Container.ContainerItem[]>([])
const queryContainerList = async () => {
containerList.value = await getContainerList()
const res = await getContainerList()
containerList.value = res.filter(item => item.type === 0)
}
const form = ref({
list: [],
})
const formRef = ref()
const okHandle = async () => {
try {
const valid = await formRef.value.validate()
if (!valid) {
return
}
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'filled_solution_start',
params: {
...form.value,
},
}
await homeStore.sendControl(params)
emits('ok')
}
catch (error) {
console.log(error)
}
}
const cancel = () => {
emits('cancel')
}
@ -66,47 +43,78 @@ const querySolutionList = async () => {
}
}
const filled_solution_start = async (id: number) => {
const filled_solution_start = async () => {
if (!checkedList.value.length) {
FtMessage.warning('请选择要预充的溶液')
return
}
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'filled_solution_start',
params: {
list: [id],
list: checkedList.value,
},
}
await homeStore.sendControl(params)
}
const filled_solution_stop = async (id: number) => {
const filled_solution_stop = async () => {
if (!checkedList.value.length) {
FtMessage.warning('请选择要停止预充的溶液')
return
}
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'filled_solution_stop',
params: {
list: [id],
list: checkedList.value,
},
}
await homeStore.sendControl(params)
}
const checkAll = ref(false)
const isIndeterminate = ref(false)
const checkedList = ref<number[]>([])
const handleCheckAllChange = (val: CheckboxValueType) => {
checkedList.value = val ? containerList.value.map((item: Container.ContainerItem) => item.id) : []
isIndeterminate.value = false
}
const handleCheckedCitiesChange = (value: CheckboxValueType[]) => {
console.log(value)
const checkedCount = value.length
checkAll.value = checkedCount === containerList.value.length
isIndeterminate.value = checkedCount > 0 && checkedCount < containerList.value.length
}
</script>
<template>
<FtDialog visible title="预充管路" width="40%" :ok-handle="okHandle" @cancel="cancel">
<div>
<div v-for="item in containerList.filter((item) => item.type === 0)" :key="item.id" class="item-box">
<span>{{ solutionMap[item.solutionId] }}</span>
<div>
<ft-button type="primary" :click-handle="() => filled_solution_start(item.id)">
开始预充
</ft-button>
<ft-button type="primary" :click-handle="() => filled_solution_stop(item.id)">
停止
</ft-button>
</div>
</div>
</div>
<FtDialog visible title="预充管路" width="50%">
<el-checkbox
v-model="checkAll"
:indeterminate="isIndeterminate"
@change="handleCheckAllChange"
>
全选
</el-checkbox>
<el-checkbox-group
v-model="checkedList"
@change="handleCheckedCitiesChange"
>
<el-checkbox v-for="item in containerList" :key="item.id" border :label="solutionMap[item.solutionId]" :value="item.id" />
</el-checkbox-group>
<template #footer>
<ft-button type="primary" :click-handle="filled_solution_start">
开始预充
</ft-button>
<ft-button type="primary" :click-handle="filled_solution_stop">
停止预充
</ft-button>
<ft-button @click="cancel">
关闭
</ft-button>
@ -121,4 +129,13 @@ const filled_solution_stop = async (id: number) => {
justify-content: space-between;
padding: 5px;
}
.el-checkbox {
margin: 10px 5px;
min-width: 100px;
}
.button-box {
margin-top: 10px;
display: flex;
justify-content: center;
}
</style>

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

@ -2,6 +2,7 @@
import { setTargetTemperature } from 'apis/home'
import { getOreList } from 'apis/ore'
import { FtMessage } from 'libs/message'
import { useSystemStore } from 'stores/systemStore'
import { onMounted, ref } from 'vue'
const props = defineProps({
@ -17,13 +18,25 @@ onMounted(() => {
})
const form = ref({
temperature: 0,
temperature: useSystemStore().systemStatus.heatModule.find(item => item.moduleCode === props.id)?.targetTemperature,
})
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, message: '请输入目标温度', trigger: 'blur' },
{ required: true, trigger: 'blur', validator: validateHandle },
],
}

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

@ -94,37 +94,6 @@ defineExpose({
<template>
<div class="tube" :class="{ 'tube-active': hearInfo?.selected, 'tube-shadow': data.trayUp === 1 }">
<div
v-if="data.trayStatus !== 0 && craft?.state"
class="status" :class="{
'status-success': false,
'status-wait': craft?.state === 'READY',
'status-error': craft?.state === 'ERROR',
'status-ing': craft?.state === 'RUNNING',
}"
>
<img v-if="craft?.state === 'FINISHED'" :src="successIcon" alt="">
<img v-if="craft?.state === 'RUNNING'" :src="ingIcon" alt="">
<img v-if="craft?.state === 'READY'" :src="waitIcon" alt="">
<img v-if="craft?.state === 'ERROR'" :src="errorIcon" alt="">
<span class="status-name">{{ craft?.craft?.name || ' ' }}</span>
<span v-if="craft?.state === 'RUNNING'" class="status-text">工艺执行中</span>
<span v-if="craft?.state === 'READY'" class="status-text">工艺等待执行</span>
<span v-if="craft?.state === 'ERROR'" class="status-text">工艺执行错误</span>
<span v-if="craft?.state === 'FINISHED'" class="status-text">工艺执行成功</span>
<div class="status-operation">
<ft-button v-if="craft?.state === 'RUNNING'" type="primary" size="small" :click-handle="pauseCraftHandle">
暂停
</ft-button>
<ft-button v-if="craft?.state === 'PAUSED'" type="primary" size="small" :click-handle="resumeCraftHandle">
继续
</ft-button>
<ft-button v-if="craft?.state !== 'READY'" size="small" :click-handle="stopCraftHandle">
停止
</ft-button>
</div>
</div>
<div class="header">
<span>{{ hearInfo?.label }}</span>
<span v-show="data.trayStatus === 0">空置</span>
@ -132,6 +101,40 @@ defineExpose({
</div>
<div class="tube-item" @click.prevent="mousedownHandle" @touch.prevent="mousedownHandle">
<div v-if="data.trayStatus === 0" class="tube-disable" />
<div
v-if="data.trayStatus !== 0 && craft?.state"
class="status" :class="{
'status-success': false,
'status-wait': craft?.state === 'READY',
'status-PAUSED': craft?.state === 'PAUSED',
'status-error': craft?.state === 'ERROR',
'status-ing': craft?.state === 'RUNNING',
}"
>
<img v-if="craft?.state === 'FINISHED'" :src="successIcon" alt="">
<img v-if="craft?.state === 'RUNNING'" :src="ingIcon" alt="">
<img v-if="craft?.state === 'READY'" :src="waitIcon" alt="">
<img v-if="craft?.state === 'PAUSED'" :src="waitIcon" alt="">
<img v-if="craft?.state === 'ERROR'" :src="errorIcon" alt="">
<span class="status-name">{{ craft?.craft?.name || ' ' }}</span>
<span v-if="craft?.state === 'RUNNING'" class="status-text">工艺执行中</span>
<span v-if="craft?.state === 'READY'" class="status-text">工艺等待执行</span>
<span v-if="craft?.state === 'PAUSED'" class="status-text">工艺已暂停</span>
<span v-if="craft?.state === 'ERROR'" class="status-text">工艺执行错误</span>
<span v-if="craft?.state === 'FINISHED'" class="status-text">工艺执行成功</span>
<div class="status-operation">
<ft-button v-if="craft?.state === 'RUNNING'" type="primary" size="small" :click-handle="pauseCraftHandle">
暂停
</ft-button>
<ft-button v-if="craft?.state === 'PAUSED'" type="primary" size="small" :click-handle="resumeCraftHandle">
继续
</ft-button>
<ft-button v-if="craft?.state !== 'READY'" size="small" :click-handle="stopCraftHandle">
停止
</ft-button>
</div>
</div>
<span v-for="item in 16" :key="item" class="tube-inner" :class="{ 'tube-inner-active': tray?.tubes.find(tu => tu.tubeNum === item)?.exists }" :index="item" />
</div>
<div v-if="data.targetTemperature" class="temperature-box" @click="setTemperature">
@ -141,7 +144,8 @@ defineExpose({
<span></span>
</span>
<span v-show="data.heating" style="color: #FE0A0A ">加热中</span>
<span v-show="!data.heating" style="color: #1677FF">未加热</span>
<span v-show="data.fanOpen" style="color: #14A656 ">散热中</span>
<!-- <span v-show="!data.heating" style="color: #1677FF">未加热</span> -->
</div>
<div v-else class="temperature-box" style="justify-content: center" @click="setTemperature">
点击设置目标温度
@ -177,58 +181,7 @@ defineExpose({
transition: all 0.3s;
position: relative;
overflow: hidden;
.status {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(255,255,255,0.9);
z-index: 1;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
border-radius: 10px;
img {
width: 50px;
margin: 30px 0 10px;
}
.status-name {
font-size: 14px;
margin: 10px 0 10px;
}
.status-text {
font-size: 16px;
font-weight: 700;
}
.status-operation {
width: 100%;
margin-top: auto;
margin-bottom: 10px;
display: flex;
justify-content: center;
.ft-button {
margin-right: 5px;
}
}
}
.status-wait {
background: rgba(242,235,231, 0.9);
border: 1px solid #EE8223;
color: #EE8223;
}
.status-error {
background: rgba(232,212,222, 0.9);
border: 1px solid #DF1515;
color: #DF1515;
}
.status-ing {
background: rgba(205,223,255, 0.9);
border: 1px solid #0256FF;
color: #0256FF;
}
.header {
display: flex;
justify-content: space-between;
@ -289,4 +242,60 @@ defineExpose({
}
}
.status {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(255,255,255,0.9);
z-index: 1;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
border-radius: 10px;
img {
width: 30px;
margin: 10px 0;
}
.status-name {
font-size: 14px;
}
.status-text {
font-size: 16px;
font-weight: 700;
}
.status-operation {
width: 100%;
margin-top: auto;
margin-bottom: 10px;
display: flex;
justify-content: center;
.ft-button {
margin-right: 5px;
}
}
}
.status-wait {
background: rgba(242,235,231, 0.9);
border: 1px solid #EE8223;
color: #EE8223;
}
.status-PAUSED {
background: rgba(242,235,231, 0.9);
border: 1px solid #EE8223;
color: #EE8223;
}
.status-error {
background: rgba(232,212,222, 0.9);
border: 1px solid #DF1515;
color: #DF1515;
}
.status-ing {
background: rgba(205,223,255, 0.9);
border: 1px solid #0256FF;
color: #0256FF;
}
</style>

45
src/layouts/default.vue

@ -22,7 +22,7 @@ const timeInterval = setInterval(() => {
}, 1000)
onMounted(() => {
if (!systemStore.systemStatus.selfTest) {
if (!systemStore.systemStatus.selfTest && systemStore.systemUser.username !== 'test') {
isCheck.value = true
}
})
@ -43,10 +43,23 @@ const isCheck = ref(false)
<img :class="systemStore.menuExpand ? 'expand-icon' : 'fold-icon'" src="../assets/images/expand.svg" alt="" @click="systemStore.updateMenuExpand()">
</div>
<div class="header-right">
<div class="wifi-icon">
<img v-if="isClose" src="../assets/images/wifi.svg" alt="">
<img v-else src="../assets/images/wifi-active.svg" alt="">
</div>
<el-dropdown class="wifi-dropdown" trigger="click">
<div class="wifi-icon">
<img v-if="isClose" src="../assets/images/wifi.svg" alt="">
<img v-else src="../assets/images/wifi-active.svg" alt="">
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="systemStore.logout()">
<div class="logout">
<span v-if="!isClose">已连接</span>
<span v-else>已断开</span>
</div>
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
<div class="time">
{{ currentTime }}
</div>
@ -156,18 +169,22 @@ const isCheck = ref(false)
display: flex;
align-items: center;
height: 100%;
.wifi-icon {
width: 40px;
.wifi-dropdown {
height: 100%;
background: #fff;
border-radius: 5px;
display: flex;
align-items: center;
justify-content: center;
img {
height: 50%;
.wifi-icon {
width: 40px;
height: 100%;
background: #fff;
border-radius: 5px;
display: flex;
align-items: center;
justify-content: center;
img {
height: 50%;
}
}
}
.time {
margin:0 10px;
height: 100%;

2
src/libs/utils.ts

@ -53,6 +53,8 @@ export const cmdNameMap = {
door_origin: '门电机回原点',
filled_solution: '预充管路',
shake_origin: '摇匀电机回原点',
filled_solution_start: '开始预充',
filled_solution_stop: '停止预充',
}
export const generateColors = (count: number): string[] => {

22
src/router/routes.ts

@ -124,6 +124,28 @@ const authRoutes: RouteRecordRaw[] = [
activeIcon: s_debug,
},
},
{
path: '/positionDebug',
name: 'positionDebug',
component: () => import('views/pointDebug/index.vue'),
meta: {
isDefault: false,
title: '坐标调试',
icon: n_debug,
activeIcon: s_debug,
},
},
{
path: '/equipmentDebug',
name: 'equipmentDebug',
component: () => import('views/debug/index.vue'),
meta: {
isDefault: false,
title: '设备调试',
icon: n_debug,
activeIcon: s_debug,
},
},
]
const routes: RouteRecordRaw[] = [

41
src/stores/systemStore.ts

@ -81,10 +81,10 @@ export const useSystemStore = defineStore('system', {
heatModule: [
{
moduleCode: 'heat_module_01',
trayUp: 1,
trayUp: 0,
trayStatus: 1,
heating: false,
fanOpen: false,
fanOpen: true,
capExist: false,
temperature: 0,
targetTemperature: 0,
@ -104,20 +104,20 @@ export const useSystemStore = defineStore('system', {
trayUp: 0,
trayStatus: 0,
heating: true,
fanOpen: true,
fanOpen: false,
capExist: false,
temperature: 130,
targetTemperature: 0,
targetTemperature: 200,
},
{
moduleCode: 'heat_module_04',
trayUp: 1,
trayStatus: 1,
heating: false,
fanOpen: false,
fanOpen: true,
capExist: false,
temperature: 0,
targetTemperature: 0,
targetTemperature: 20,
},
{
moduleCode: 'heat_module_05',
@ -190,9 +190,30 @@ export const useSystemStore = defineStore('system', {
exists: true,
},
],
// crafts: {
// state: 'ERROR',
// },
crafts: {
state: 'ERROR',
},
},
{
uuid: '',
heatModuleId: 'heat_module_05',
inSolutionArea: false,
inHeatModule: true,
tubes: [
{
tubeNum: 10,
addSolution: true,
exists: true,
},
],
crafts: {
craft: {
id: 1,
name: '菱锌矿硫酸溶解法',
steps: '',
},
state: 'PAUSED',
},
},
],
},
@ -234,5 +255,5 @@ export const useSystemStore = defineStore('system', {
})
},
},
persist: false,
persist: true,
})

2
src/types/home.d.ts

@ -9,7 +9,7 @@ declare namespace Home {
}
interface SetTargetTemperatureParams {
moduleCode: string
temperature: number
temperature: number | undefined
}
interface TrayTubeParams {
trayUuid: string

21
src/views/container/liquidItem.vue

@ -2,7 +2,7 @@
import { updateContainer } from '@/apis/container'
import { useSolutionStore } from '@/stores/useSolutionStore'
import { Plus } from '@element-plus/icons-vue'
import { ElMessage } from 'element-plus'
import { FtMessage } from 'libs/message'
import { computed, ref } from 'vue'
import { useRouter } from 'vue-router'
@ -29,10 +29,13 @@ const selectedSolutionItem = ref()
const solutionInfo = ref(props.solutionItem)
const solutionProcess = computed(() => {
const difference = solutionInfo.value.capacityUsed / solutionInfo.value.capacityTotal
const percent = 100 - (difference * 100)
return percent
return 100 - (difference * 100)
})
const onInputBlur = () => {
if (solutionInfo.value.capacityUsed > 5000) {
FtMessage.error('容器容量不能超过5000ml')
solutionInfo.value.capacityUsed = 5000
}
saveContainer()
}
@ -42,15 +45,11 @@ const onSelectSolution = () => {
const saveContainer = () => {
if (!solutionInfo.value.capacityUsed) {
ElMessage.warning('请输入当前容量')
return
}
if (!solutionInfo.value.filled) {
ElMessage.warning('请输入预充量')
FtMessage.warning('请输入当前容量')
return
}
if (!solutionInfo.value.solutionId) {
ElMessage.warning('请选择酸液')
FtMessage.warning('请选择酸液')
return
}
const params: Container.ContainerItem = {
@ -63,7 +62,7 @@ const saveContainer = () => {
filled: solutionInfo.value.filled,
}
updateContainer(params).then(() => {
ElMessage.success('保存成功')
FtMessage.success('保存成功')
emits('ok')
})
}
@ -127,7 +126,7 @@ const onSubmitSolution = () => {
<!-- </div> -->
<div class="footer-edit">
<span>剩余</span>
<el-input v-model.number="solutionInfo.capacityUsed" type="number" size="small" @blur="onInputBlur">
<el-input v-model.number="solutionInfo.capacityUsed" type="number" max="5000" size="small" @blur="onInputBlur">
<template #append>
ml
</template>

18
src/views/debug/index.vue

@ -649,20 +649,6 @@ const savePositionVisible = ref(false)
</template>
</el-input>
</el-form-item>
<el-form-item label="速度">
<el-input v-model.number="debugStore.formData.transferModule.xMotorData.xDimVelocity" type="number" placeholder="请输入速度">
<template #append>
rpm/min
</template>
</el-input>
</el-form-item>
<el-form-item label="循环">
<el-input v-model.number="debugStore.formData.transferModule.xMotorData.times" type="number" placeholder="请输入次数">
<template #append>
</template>
</el-input>
</el-form-item>
<el-form-item>
<ft-button size="small" type="primary" :click-handle="() => debug_transportation_arm_move('x', 'forward')">
前进
@ -733,7 +719,7 @@ const savePositionVisible = ref(false)
</ft-button>
</el-form-item>
<el-form-item label="指定位置">
<el-input v-model.number="debugStore.formData.transferModule.xMotorData.position" type="number" placeholder="请输入位置">
<el-input v-model.number="debugStore.formData.transferModule.yMotorData.position" type="number" placeholder="请输入位置">
<template #append>
mm
</template>
@ -788,7 +774,7 @@ const savePositionVisible = ref(false)
</ft-button>
</el-form-item>
<el-form-item label="指定位置">
<el-input v-model.number="debugStore.formData.transferModule.xMotorData.position" type="number" placeholder="请输入位置">
<el-input v-model.number="debugStore.formData.transferModule.zMotorData.position" type="number" placeholder="请输入位置">
<template #append>
mm
</template>

250
src/views/home/index.vue

@ -1,6 +1,8 @@
<script setup lang="ts">
import { startCraft } from 'apis/crafts'
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 Tube from 'components/home/Tube/index.vue'
@ -31,35 +33,45 @@ const receiveMessage = (data: Socket.cmdData) => {
const startVisible = ref(false)
// const startExperimentHandle = () => {
// // TODO
// startVisible.value = true
// }
const startExperimentHandle = () => {
// TODO
startVisible.value = true
}
const selectCraftVisible = ref(false)
const selectCraft = () => {
const count = homeStore.heatAreaList.filter(item => item.selected).length
if (!count) {
FtMessage.warning('请选择加热区')
return
}
selectCraftVisible.value = true
}
// const selectCraftVisible = ref(false)
// const selectCraft = () => {
// const count = homeStore.heatAreaList.filter(item => item.selected).length
// if (!count) {
// FtMessage.warning('')
// return
// }
// selectCraftVisible.value = true
// }
//
// const executeCraftHandle = async () => {
// const selectedHeatAreas = homeStore.heatAreaList.filter(item => item.selected)
// if (!selectedHeatAreas.length) {
// FtMessage.warning('')
// return
// }
// // TODO
// for (let i = 0; i < selectedHeatAreas.length; i++) {
// await startCraft({
// heatId: selectedHeatAreas[i].value,
// })
// }
// FtMessage.success('')
// }
const executeCraftHandle = async () => {
const selectedHeatAreas = homeStore.heatAreaList.filter(item => item.selected)
if (!selectedHeatAreas.length) {
FtMessage.warning('请选择加热区')
return
}
const craftError: string[] = []
selectedHeatAreas.forEach((item) => {
const trays = systemStore.systemStatus.tray?.find(h => h.heatModuleId === item.value)
if (trays?.crafts?.state !== 'READY') {
craftError.push(item.label)
}
})
if (craftError.length) {
FtMessage.warning(`${craftError.join(',')}的工艺不是等待执行的状态`)
return
}
for (let i = 0; i < selectedHeatAreas.length; i++) {
await startCraft({
heatId: selectedHeatAreas[i].value,
})
}
FtMessage.success('工艺已开始执行')
}
const setTemperatureVisible = ref(false)
const currentTemperatureId = ref('')
@ -215,25 +227,44 @@ const move_to_solution_area = async () => {
const heat_start = async () => {
const selectedHeatAreas = homeStore.heatAreaList.filter(item => item.selected)
if (!selectedHeatAreas.length || selectedHeatAreas.length > 1) {
FtMessage.warning('请选择一个加热区')
if (!selectedHeatAreas.length) {
FtMessage.warning('请选择加热区')
return
}
if (systemStore.systemStatus.heatModule.find(item => item.moduleCode === selectedHeatAreas[0].value)?.targetTemperature) {
FtMessage.warning('请先设置温度')
const temperatureError: string[] = []
const heatingError: string[] = []
const fanError: string[] = []
selectedHeatAreas.forEach((item) => {
const heatModule = systemStore.systemStatus.heatModule.find(h => h.moduleCode === item.value)
if (!heatModule?.targetTemperature) {
temperatureError.push(item.label)
}
if (heatModule?.heating) {
heatingError.push(item.label)
}
if (heatModule?.fanOpen) {
fanError.push(item.label)
}
})
if (temperatureError.length) {
FtMessage.warning(`${temperatureError.join(', ')}的加热区未设置温度`)
return
}
if (heatingError.length) {
FtMessage.warning(`${heatingError.join(', ')}的加热区已经在加热了`)
return
}
if (systemStore.systemStatus.heatModule.find(item => item.moduleCode === selectedHeatAreas[0].value)?.heating) {
FtMessage.warning('已经在加热了')
if (fanError.length) {
FtMessage.warning(`${heatingError.join(', ')}的加热区正在散热中`)
return
}
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'heat_start',
params: {
heatId: selectedHeatAreas[0].value,
temperature: systemStore.systemStatus.heatModule.find(item => item.moduleCode === selectedHeatAreas[0].value)?.targetTemperature,
heatId: selectedHeatAreas.map(item => item.value),
},
}
await homeStore.sendControl(params)
@ -241,12 +272,19 @@ const heat_start = async () => {
const heat_stop = async () => {
const selectedHeatAreas = homeStore.heatAreaList.filter(item => item.selected)
if (!selectedHeatAreas.length || selectedHeatAreas.length > 1) {
FtMessage.warning('请选择一个加热区')
if (!selectedHeatAreas.length) {
FtMessage.warning('请选择加热区')
return
}
if (!systemStore.systemStatus.heatModule.find(item => item.moduleCode === selectedHeatAreas[0].value)?.heating) {
FtMessage.warning('加热区未加热')
const heatingError: string[] = []
selectedHeatAreas.forEach((item) => {
const heatModule = systemStore.systemStatus.heatModule.find(h => h.moduleCode === item.value)
if (!heatModule?.heating) {
heatingError.push(item.label)
}
})
if (heatingError.length) {
FtMessage.warning(`${heatingError.join(', ')}的加热区未在加热`)
return
}
currentCommandId = Date.now().toString()
@ -254,7 +292,7 @@ const heat_stop = async () => {
commandId: currentCommandId,
command: 'heat_stop',
params: {
heatId: selectedHeatAreas[0].value,
heatId: selectedHeatAreas.map(item => item.value),
},
}
await homeStore.sendControl(params)
@ -262,12 +300,27 @@ const heat_stop = async () => {
const fan_start = async () => {
const selectedHeatAreas = homeStore.heatAreaList.filter(item => item.selected)
if (!selectedHeatAreas.length || selectedHeatAreas.length > 1) {
FtMessage.warning('请选择一个加热区')
if (!selectedHeatAreas.length) {
FtMessage.warning('请选择加热区')
return
}
if (systemStore.systemStatus.heatModule.find(item => item.moduleCode === selectedHeatAreas[0].value)?.fanOpen) {
FtMessage.warning('已经在散热了')
const fanError: string[] = []
const heatingError: string[] = []
selectedHeatAreas.forEach((item) => {
const heatModule = systemStore.systemStatus.heatModule.find(h => h.moduleCode === item.value)
if (heatModule?.fanOpen) {
fanError.push(item.label)
}
if (heatModule?.heating) {
heatingError.push(item.label)
}
})
if (fanError.length) {
FtMessage.warning(`${fanError.join(', ')}的加热区已经在散热了`)
return
}
if (heatingError.length) {
FtMessage.warning(`${fanError.join(', ')}的加热区正在散热中`)
return
}
currentCommandId = Date.now().toString()
@ -275,7 +328,7 @@ const fan_start = async () => {
commandId: currentCommandId,
command: 'fan_start',
params: {
heatId: selectedHeatAreas[0].value,
heatId: selectedHeatAreas.map(item => item.value),
},
}
await homeStore.sendControl(params)
@ -283,12 +336,19 @@ const fan_start = async () => {
const fan_stop = async () => {
const selectedHeatAreas = homeStore.heatAreaList.filter(item => item.selected)
if (!selectedHeatAreas.length || selectedHeatAreas.length > 1) {
FtMessage.warning('请选择一个加热区')
if (!selectedHeatAreas.length) {
FtMessage.warning('请选择加热区')
return
}
if (!systemStore.systemStatus.heatModule.find(item => item.moduleCode === selectedHeatAreas[0].value)?.fanOpen) {
FtMessage.warning('加热区未散热')
const fanError: string[] = []
selectedHeatAreas.forEach((item) => {
const heatModule = systemStore.systemStatus.heatModule.find(h => h.moduleCode === item.value)
if (!heatModule?.fanOpen) {
fanError.push(item.label)
}
})
if (fanError.length) {
FtMessage.warning(`${fanError.join(', ')}的加热区没有在散热`)
return
}
currentCommandId = Date.now().toString()
@ -296,7 +356,7 @@ const fan_stop = async () => {
commandId: currentCommandId,
command: 'fan_stop',
params: {
heatId: selectedHeatAreas[0].value,
heatId: selectedHeatAreas.map(item => item.value),
},
}
await homeStore.sendControl(params)
@ -304,12 +364,19 @@ const fan_stop = async () => {
const tray_up = async () => {
const selectedHeatAreas = homeStore.heatAreaList.filter(item => item.selected)
if (!selectedHeatAreas.length || selectedHeatAreas.length > 1) {
FtMessage.warning('请选择一个加热区')
if (!selectedHeatAreas.length) {
FtMessage.warning('请选择加热区')
return
}
if (systemStore.systemStatus.heatModule.find(item => item.moduleCode === selectedHeatAreas[0].value)?.trayUp === 1) {
FtMessage.warning('托盘已抬起')
const trayUpError: string[] = []
selectedHeatAreas.forEach((item) => {
const heatModule = systemStore.systemStatus.heatModule.find(h => h.moduleCode === item.value)
if (heatModule?.trayUp === 1) {
trayUpError.push(item.label)
}
})
if (trayUpError.length) {
FtMessage.warning(`${trayUpError.join(', ')}的加热区托盘已抬起`)
return
}
currentCommandId = Date.now().toString()
@ -317,7 +384,7 @@ const tray_up = async () => {
commandId: currentCommandId,
command: 'tray_up',
params: {
heatId: selectedHeatAreas[0].value,
heatId: selectedHeatAreas.map(item => item.value),
},
}
await homeStore.sendControl(params)
@ -325,12 +392,19 @@ const tray_up = async () => {
const tray_down = async () => {
const selectedHeatAreas = homeStore.heatAreaList.filter(item => item.selected)
if (!selectedHeatAreas.length || selectedHeatAreas.length > 1) {
FtMessage.warning('请选择一个加热区')
if (!selectedHeatAreas.length) {
FtMessage.warning('请选择加热区')
return
}
if (systemStore.systemStatus.heatModule.find(item => item.moduleCode === selectedHeatAreas[0].value)?.trayUp === 0) {
FtMessage.warning('托盘已降下')
const trayUpError: string[] = []
selectedHeatAreas.forEach((item) => {
const heatModule = systemStore.systemStatus.heatModule.find(h => h.moduleCode === item.value)
if (heatModule?.trayUp === 0) {
trayUpError.push(item.label)
}
})
if (trayUpError.length) {
FtMessage.warning(`${trayUpError.join(', ')}的加热区托盘未抬起`)
return
}
currentCommandId = Date.now().toString()
@ -338,7 +412,7 @@ const tray_down = async () => {
commandId: currentCommandId,
command: 'tray_down',
params: {
heatId: selectedHeatAreas[0].value,
heatId: selectedHeatAreas.map(item => item.value),
},
}
await homeStore.sendControl(params)
@ -415,30 +489,30 @@ const take_photo = async () => {
</ft-button>
</el-col>
</el-row>
<!-- <el-row :gutter="10"> -->
<!-- <el-col :span="12"> -->
<!-- <ft-button @click="startExperimentHandle"> -->
<!-- 开始实验 -->
<!-- </ft-button> -->
<!-- </el-col> -->
<!-- <el-col :span="12"> -->
<!-- <ft-button disabled> -->
<!-- 停止实验 -->
<!-- </ft-button> -->
<!-- </el-col> -->
<!-- </el-row> -->
<!-- <el-row :gutter="10"> -->
<!-- <el-col :span="12"> -->
<!-- <ft-button @click="selectCraft"> -->
<!-- 选择工艺 -->
<!-- </ft-button> -->
<!-- </el-col> -->
<!-- <el-col :span="12"> -->
<!-- <ft-button :click-handle="executeCraftHandle"> -->
<!-- 执行工艺 -->
<!-- </ft-button> -->
<!-- </el-col> -->
<!-- </el-row> -->
<el-row :gutter="10">
<el-col :span="12">
<ft-button @click="startExperimentHandle">
开始实验
</ft-button>
</el-col>
<el-col :span="12">
<ft-button disabled>
停止实验
</ft-button>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="12">
<ft-button @click="selectCraft">
选择工艺
</ft-button>
</el-col>
<el-col :span="12">
<ft-button :click-handle="executeCraftHandle">
执行工艺
</ft-button>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="12">
<ft-button :click-handle="filled_solution">
@ -517,7 +591,7 @@ const take_photo = async () => {
</el-row>
<StartExperiment v-if="startVisible" @ok="startVisible = false" @cancel="startVisible = false" />
<!-- <SelectCraft v-if="selectCraftVisible" @ok="selectCraftVisible = false" @cancel="selectCraftVisible = false" /> -->
<SelectCraft v-if="selectCraftVisible" @ok="selectCraftVisible = false" @cancel="selectCraftVisible = false" />
<SetTemperature v-if="setTemperatureVisible" :id="currentTemperatureId" @ok="setTemperatureVisible = false" @cancel="setTemperatureVisible = false" />
<AddLiquid v-if="addLiquidVisible" @ok="addLiquidVisible = false" @cancel="addLiquidVisible = false" />
<FillSolution v-if="fillSolutionVisible" @ok="fillSolutionVisible = false" @cancel="fillSolutionVisible = false" />
@ -551,7 +625,7 @@ const take_photo = async () => {
flex-direction: column;
height: 100%;
.top {
height: 50%;
height: 40%;
background: #4D6882;
position: relative;
border-radius: 8px;
@ -570,7 +644,7 @@ const take_photo = async () => {
}
}
.button-box {
height: 50%;
height: 60%;
display: flex;
flex-direction: column;
justify-content: flex-end;

4
src/views/point/index.vue

@ -14,6 +14,10 @@ const columns = [
key: 'name',
},
{
title: '类型',
key: 'type',
},
{
title: '坐标',
key: 'position',
},

1307
src/views/pointDebug/index.vue
File diff suppressed because it is too large
View File

12
src/views/user/index.vue

@ -144,12 +144,12 @@ const doSave = () => {
<el-table-column type="index" width="50" />
<el-table-column prop="username" label="登录名" />
<el-table-column prop="nickname" label="用户名" />
<el-table-column prop="fixedUser" label="状态">
<template #default="scoped">
<span v-if="scoped.row.deleted === 'ENABLE'">正常</span>
<span v-else>停用</span>
</template>
</el-table-column>
<!-- <el-table-column prop="fixedUser" label="状态"> -->
<!-- <template #default="scoped"> -->
<!-- <span v-if="scoped.row.deleted === 'ENABLE'">正常</span> -->
<!-- <span v-else>停用</span> -->
<!-- </template> -->
<!-- </el-table-column> -->
<el-table-column prop="createTime" label="创建时间" />
<el-table-column prop="updateTime" label="更新时间" />
</el-table>

Loading…
Cancel
Save