Browse Source

fix:预设改工艺;异常改提示;工艺加液分开;手动操作自控

master
guoapeng 2 months ago
parent
commit
2d7986b275
  1. 4
      .env.prod
  2. 4
      src/apis/crafts.ts
  3. 2
      src/components/common/FTButton/index.vue
  4. 35
      src/components/craft/AddCraft/index.vue
  5. 10
      src/components/craft/AddCraftDialog.vue
  6. 14
      src/components/craft/CraftStatus.vue
  7. 4
      src/components/home/CheckCraft/index.vue
  8. 10
      src/components/home/ExecuteCraft/index.vue
  9. 13
      src/components/home/ExtractLiquid/index.vue
  10. 10
      src/components/home/SelectCraft/index.vue
  11. 10
      src/components/home/Tube/index.vue
  12. 45
      src/layouts/default.vue
  13. 1
      src/stores/systemStore.ts
  14. 1
      src/types/system.d.ts
  15. 20
      src/views/craft/index.vue
  16. 14
      src/views/home/index.vue
  17. 6
      src/views/ore/index.vue

4
.env.prod

@ -2,6 +2,6 @@
FT_NODE_ENV=prod
FT_WS_URL=ws://192.168.10.188:8080/ws
FT_PROXY=http://192.168.10.188:8080
FT_WS_URL=ws://192.168.8.168:8080/ws
FT_PROXY=http://192.168.8.168:8080
FT_API_BASE=/api

4
src/apis/crafts.ts

@ -15,14 +15,14 @@ export const updateCraft = (params: Craft): Promise<null> => http.put(`/crafts`,
export const delCraft = (ids: string): Promise<null> => http.delete(`/crafts/${ids}`)
// 开始执行预设
// 开始执行工艺
export const startCraft = (params: { heatId?: string, craftId?: number, columns?: number[] }): Promise<null> => http.post(`/crafts/start`, params)
export const pauseCraft = (params: { heatId: string }): Promise<null> => http.post(`/crafts/pause`, params)
export const resumeCraft = (params: { heatId: string }): Promise<null> => http.post(`/crafts/resume`, params)
export const stopCraft = (params: { heatId: string }): Promise<null> => http.post(`/crafts/stop`, params)
// 加热区配置预设
// 加热区配置工艺
export const setCraft = (params: { heatId?: string | number, craftId?: string | number }): Promise<null> => http.post(`/crafts/set`, params)
export const craftstatus = (): Promise<CraftTypes.CraftState[]> => http.get(`/monitor/crafts/status`)

2
src/components/common/FTButton/index.vue

@ -55,7 +55,7 @@ defineExpose({
<!-- 添加 loading 判断 -->
<Loading class="rotate-loading" /> <!-- 添加旋转类 -->
</el-icon>
<span><slot /></span>
<slot />
</div>
</div>
</template>

35
src/components/craft/AddCraft/index.vue

@ -42,7 +42,7 @@ const form = ref({
const formRef = ref()
const rules = {
name: [{ required: true, trigger: 'blur', message: '请输入预设名称' }],
name: [{ required: true, trigger: 'blur', message: '请输入工艺名称' }],
}
const okHandle = async () => {
@ -113,16 +113,21 @@ const cancel = () => {
const stepMap = {
preHeat: { name: '预热', method: 'preHeat', params: { temperature: undefined, description: undefined } },
addLiquid: {
name: '加',
name: '加稀硝酸',
method: 'addLiquid',
params: { volume: undefined, containerId: undefined, description: undefined },
params: { volume: undefined, containerId: 1, description: undefined },
},
addLiquid1: {
name: '加浓硝酸',
method: 'addLiquid',
params: { volume: undefined, containerId: 2, description: undefined },
},
heat: {
name: '加热',
method: 'heat',
params: { temperature: undefined, time: undefined, description: undefined, minutes: undefined, seconds: undefined },
},
reduceLiquid: { name: '抽液', method: 'reduceLiquid', params: { height: undefined, description: undefined } },
// reduceLiquid: { name: '', method: 'reduceLiquid', params: { height: undefined, description: undefined } },
clean: {
name: '清洗',
method: 'clean',
@ -152,12 +157,12 @@ const addStep = (data: any) => {
</script>
<template>
<FtDialog visible :title="form.id ? '编辑预设' : '新增预设'" width="80%" :ok-handle="okHandle" @cancel="cancel">
<FtDialog visible :title="form.id ? '编辑工艺' : '新增工艺'" width="80%" :ok-handle="okHandle" @cancel="cancel">
<el-form ref="formRef" label-width="auto" :model="form" :rules="rules" class="form-box">
<el-row :gutter="30">
<el-col :span="10">
<el-form-item label="预设名称" prop="name">
<el-input v-model="form.name" placeholder="请输入预设名称" />
<el-form-item label="工艺名称" prop="name">
<el-input v-model="form.name" placeholder="请输入工艺名称" />
</el-form-item>
<el-form-item label="步骤列表">
<div class="button-content">
@ -198,14 +203,14 @@ const addStep = (data: any) => {
</el-input>
</template>
<template v-else-if="item.method === 'addLiquid'">
<el-select v-model="item.params.containerId" size="small" placeholder="请选择溶液">
<el-option
v-for="c in containerList"
:key="c.id"
:label="solutionList.find(s => s.id === c.solutionId)?.name"
:value="c.id"
/>
</el-select>
<!-- <el-select v-model="item.params.containerId" size="small" disabled placeholder="请选择溶液"> -->
<!-- <el-option -->
<!-- v-for="c in containerList" -->
<!-- :key="c.id" -->
<!-- :label="solutionList.find(s => s.id === c.solutionId)?.name" -->
<!-- :value="c.id" -->
<!-- /> -->
<!-- </el-select> -->
<el-input v-model.number="item.params.volume" type="number" size="small" placeholder="请输入容量">
<template #append>
ml

10
src/components/craft/AddCraftDialog.vue

@ -76,7 +76,7 @@ const editDialog = (craftInfo: CraftTypes.Craft) => {
function onConfirm() {
if (!craftObj.value.name) {
ElMessage.warning('请输入预设名称')
ElMessage.warning('请输入工艺名称')
return
}
const stepList = JSON.parse(JSON.stringify(stepStructs.value))
@ -191,10 +191,10 @@ defineExpose({
</script>
<template>
<FTDialog v-model="visible" title="添加预设" style="width:70vw; height:70vh">
<FTDialog v-model="visible" title="添加工艺" style="width:70vw; height:70vh">
<div>
<div class="mt-5 mb-8 flex items-center">
<label class="font-medium mr-4">预设名称</label>
<label class="font-medium mr-4">工艺名称</label>
<el-input
v-model.trim="craftObj.name"
style="width: 200px"
@ -206,7 +206,7 @@ defineExpose({
</div>
<div class="craft-title">
<div>
预设步骤
工艺步骤
</div>
<div class="title-right">
选择的步骤
@ -222,7 +222,7 @@ defineExpose({
<div v-else>
<el-empty description="description">
<template #description>
未选择预设步骤
未选择工艺步骤
</template>
</el-empty>
</div>

14
src/components/craft/CraftStatus.vue

@ -156,7 +156,7 @@ const scrollToBottom = () => {
const onStopCraft = () => {
stopCraft({ heatId: currentHeatId.value }).then(() => {
clearInterval(byHeatIdTimes.value)
ElMessage.success('预设已停止')
ElMessage.success('工艺已停止')
})
}
@ -170,13 +170,13 @@ defineExpose({
<div class="state-container">
<div class="item1">
<div class="state-left" style="width:40vw">
<div>预设列表</div>
<div>工艺列表</div>
<div style="margin-left:10px">
<el-select v-model="craftValue" style="width: 100px" size="small" placeholder="请选择" @change="onSelectChange">
<el-option v-for="item in craftList" :key="item.craftsId" :label="item.craftsName" :value="item.craftsId" />
</el-select>
<FtButton size="small" style="margin-left:10px" @click="onStopCraft">
停止预设
停止工艺
</FtButton>
</div>
</div>
@ -186,17 +186,17 @@ defineExpose({
<div v-else class="state-log">
<el-empty description="description" style="height:30vh">
<template #description>
<span style="color:#c2c2c2">没有正在执行的预设</span>
<span style="color:#c2c2c2">没有正在执行的工艺</span>
</template>
</el-empty>
</div>
</div>
<div v-loading="loading" class="item2">
<div>预设执行状态</div>
<div>工艺执行状态</div>
<div v-if="stateList.length" ref="statusAreaRef" class="state-log state-back">
<div v-for="item in stateList" :key="item.state">
<span class="state-span"><label class="state-log-label">矿石名称</label><span class="state-log-text">{{ item.oresName }}</span></span>
<span class="state-span"><label class="state-log-label">预设名称</label><span class="state-log-text">{{ item.craftsName }}</span></span>
<span class="state-span"><label class="state-log-label">工艺名称</label><span class="state-log-text">{{ item.craftsName }}</span></span>
<span class="state-span"><label class="state-log-label">加热区</label><span class="state-log-text">{{ heatModuleMap[item.heatId] }}</span></span>
<span class="state-span"><label class="state-log-label">执行状态</label><span class="state-log-text">{{ stateMap[item.state] }}</span></span>
</div>
@ -204,7 +204,7 @@ defineExpose({
<div v-else class="state-log">
<el-empty description="description" style="height:30vh">
<template #description>
<span style="color:#c2c2c2">没有正在执行的预设</span>
<span style="color:#c2c2c2">没有正在执行的工艺</span>
</template>
</el-empty>
</div>

4
src/components/home/CheckCraft/index.vue

@ -30,9 +30,9 @@ const cancel = () => {
</script>
<template>
<FtDialog visible :loading title="预设恢复" width="70%" :ok-handle="okHandle" @cancel="cancel">
<FtDialog visible :loading title="工艺恢复" width="70%" :ok-handle="okHandle" @cancel="cancel">
<el-table :data="tableData">
<el-table-column label="预设名称" prop="craftsName" />
<el-table-column label="工艺名称" prop="craftsName" />
<el-table-column label="当前执行步骤">
<template #default="{ row }">
<span>{{ row.steps?.[row.currentstepIndex]?.params?.description }}</span>

10
src/components/home/ExecuteCraft/index.vue

@ -34,7 +34,7 @@ const rules = {
{ required: true, message: '请选择试管', trigger: 'change', validator: validateHandle },
],
craftId: [
{ required: true, message: '请选择预设', trigger: 'change' },
{ required: true, message: '请选择工艺', trigger: 'change' },
],
}
@ -48,7 +48,7 @@ const okHandle = async () => {
heatId: useHomeStore().heatAreaList.find(item => item.selected)?.value,
...form.value,
})
FtMessage.success('预设已开始')
FtMessage.success('工艺已开始')
emits('ok')
}
catch (error) {
@ -95,7 +95,7 @@ const checkChange = () => {
</script>
<template>
<FtDialog visible title="执行预设" width="40%" :ok-handle="okHandle" @cancel="cancel">
<FtDialog visible title="执行工艺" width="40%" :ok-handle="okHandle" @cancel="cancel">
<el-form ref="formRef" :model="form" :rules="rules" label-width="auto">
<el-form-item v-if=" homeStore.heatAreaList.filter(item => item.selected).length" label="加热区">
<el-tag v-for="item in homeStore.heatAreaList.filter(item => item.selected)" :key="item.value" class="mask-tag">
@ -120,8 +120,8 @@ const checkChange = () => {
</div>
</div>
</el-form-item>
<el-form-item label="预设" prop="craftId">
<el-select v-model="form.craftId" placeholder="请选择预设">
<el-form-item label="工艺" prop="craftId">
<el-select v-model="form.craftId" placeholder="请选择工艺">
<el-option-group
v-for="group in oreList"
:key="group.id"

13
src/components/home/ExtractLiquid/index.vue

@ -28,8 +28,7 @@ const receiveMessage = (data: Socket.cmdData) => {
const form = ref<{
columns?: number[]
solutionId?: number
volume?: number
height?: number
}>({})
const formRef = ref()
@ -46,6 +45,9 @@ const rules = {
columns: [
{ required: true, message: '请选择试管', trigger: 'change', validator: validateHandle },
],
height: [
{ required: true, message: '请输入下降高度', trigger: 'blur' },
],
}
const okHandle = async () => {
@ -127,6 +129,13 @@ const mousedownHandle = async (index: number) => {
</div>
</div>
</el-form-item>
<el-form-item label="针头下降高度" prop="height">
<el-input v-model.number="form.height" type="number" placeholder="请输入高度">
<template #append>
mm
</template>
</el-input>
</el-form-item>
</el-form>
</FtDialog>
</template>

10
src/components/home/SelectCraft/index.vue

@ -20,7 +20,7 @@ const formRef = ref()
const rules = {
craftId: [
{ required: true, message: '请选择预设', trigger: 'change' },
{ required: true, message: '请选择工艺', trigger: 'change' },
],
}
@ -36,7 +36,7 @@ const okHandle = async () => {
craftId: form.value.craftId,
})
}
FtMessage.success('预设已设定')
FtMessage.success('工艺已设定')
emits('ok')
}
catch (error) {
@ -56,15 +56,15 @@ const getOres = async () => {
</script>
<template>
<FtDialog visible title="选择预设" width="40%" :ok-handle="okHandle" @cancel="cancel">
<FtDialog visible title="选择工艺" width="40%" :ok-handle="okHandle" @cancel="cancel">
<el-form ref="formRef" label-width="auto" :model="form" :rules="rules">
<el-form-item label="加热区">
<el-tag v-for="item in homeStore.heatAreaList.filter(item => item.selected)" :key="item.value" class="mask-tag">
{{ item.label }}
</el-tag>
</el-form-item>
<el-form-item label="预设" prop="craftId">
<el-select v-model="form.craftId" placeholder="请选择预设">
<el-form-item label="工艺" prop="craftId">
<el-select v-model="form.craftId" placeholder="请选择工艺">
<el-option-group
v-for="group in oreList"
:key="group.id"

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

@ -122,11 +122,11 @@ defineExpose({
<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>
<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>
<el-tooltip v-if="craft?.state === 'RUNNING' && craftSteps && craftSteps[craft.currentIndex || 0]?.params?.description" :content="`${(craft.currentIndex || 0) + 1}.${craftSteps[craft.currentIndex || 0].params.description}`" placement="top" trigger="click">
<div class="status-description">
{{ (craft.currentIndex || 0) + 1 }}.

45
src/layouts/default.vue

@ -1,6 +1,6 @@
<script setup lang="ts">
import { getContainerList } from 'apis/container'
import { craftList, craftRestore } from 'apis/crafts'
import { craftList } from 'apis/crafts'
import { getSolsList } from 'apis/solution'
import logoutIcon from 'assets/images/logout.svg'
import CheckCraft from 'components/home/CheckCraft/index.vue'
@ -8,7 +8,6 @@ import Liquid from 'components/home/Liquid/index.vue'
import Check from 'components/system/Check/index.vue'
import EditDate from 'components/system/EditDate/index.vue'
import Stop from 'components/system/Stop/index.vue'
import { ElMessageBox } from 'element-plus'
import { useActivateDebug } from 'hooks/useActivateDebug'
import { useServerTime } from 'hooks/useServerTime'
import { isClose } from 'libs/socket'
@ -43,13 +42,11 @@ watch(() => systemStore.systemStatus, () => {
onMounted(async () => {
console.log('systemStatus', systemStore.systemStatus)
if (!systemStore.systemStatus.currentUser) {
console.log(123)
await router.push('/login')
}
solutionList.value = (await getSolsList()).list
if (!systemStore.systemStatus.selfTest && systemStore.systemStatus.currentUser?.username !== 'test') {
isCheck.value = true
return
}
await checkCraft()
})
@ -57,25 +54,27 @@ onMounted(async () => {
const checkCraftVisible = ref(false)
const checkCraft = async () => {
const res = await craftList()
if (res && res.length > 0) {
ElMessageBox.confirm(
'发现有异常预设, 是否处理恢复? ',
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
closeOnClickModal: false,
closeOnPressEscape: false,
type: 'warning',
customClass: 'init-message',
},
).then(async () => {
await craftRestore(true)
checkCraftVisible.value = true
}).catch(async () => {
await craftRestore(false)
})
}
systemStore.errorCraft = res && res.length > 0
// if (res && res.length > 0) {
// ElMessageBox.confirm(
// ', ? ',
// '',
// {
// confirmButtonText: '',
// cancelButtonText: '',
// closeOnClickModal: false,
// closeOnPressEscape: false,
// type: 'warning',
// customClass: 'init-message',
// },
// ).then(async () => {
// await craftRestore(true)
// checkCraftVisible.value = true
// }).catch(async () => {
// await craftRestore(false)
// })
// }
}
// metaisDefault=true isDebug=true,debug

1
src/stores/systemStore.ts

@ -250,6 +250,7 @@ export const useSystemStore = defineStore('system', {
menuExpand: true,
isDebug: import.meta.env.FT_NODE_ENV !== 'prod',
streamVisible: false,
errorCraft: false,
systemList: [],
systemLogList: [],
currentTime: '0000-00-00 00:00:00',

1
src/types/system.d.ts

@ -5,6 +5,7 @@ declare namespace System {
systemList: Socket.NotificationData[]
streamVisible: boolean
isDebug: boolean
errorCraft: boolean
menuExpand: boolean
systemUser: SystemUser
loginForm: LoginForm

20
src/views/craft/index.vue

@ -100,7 +100,7 @@ const onDelCraft = () => {
// const onSelectHeatId = () => {
// if (!multipleSelection.value || multipleSelection.value.length !== 1) {
// ElMessage.warning('')
// ElMessage.warning('')
// return
// }
// heatVisible.value = true
@ -110,7 +110,7 @@ const onDelCraft = () => {
// craftStatusRef.value?.showDialog()
// }
//
//
const onStart = () => {
if (!heatId.value) {
ElMessage.warning('请选择加热区')
@ -128,7 +128,7 @@ const onStart = () => {
setCraft(params).then(() => {
startCraft({ heatId: heatId.value }).then(() => {
console.log('开始执行')
ElMessage.success('预设已开始执行')
ElMessage.success('工艺已开始执行')
heatVisible.value = false
//
craftStatusRef.value?.showDialog()
@ -147,25 +147,25 @@ const returnOre = () => {
<div class="component-page">
<section class="flex items-center h-20 gap-3 pl-3">
<FtButton type="primary" @click="onAddCraft">
添加预设
添加工艺
</FtButton>
<FtButton type="primary" :disabled="multipleSelection.length !== 1" @click="onEditCraft">
编辑预设
编辑工艺
</FtButton>
<FtButton :disabled="!multipleSelection.length" @click="onDelCraft">
删除预设
删除工艺
</FtButton>
<!-- <FtButton @click="onSelectHeatId"> -->
<!-- 执行预设 -->
<!-- 执行工艺 -->
<!-- </FtButton> -->
<!-- <FtButton @click="onShowState"> -->
<!-- 查看预设步骤 -->
<!-- 查看工艺步骤 -->
<!-- </FtButton> -->
</section>
<main class="craft-main">
<el-table :data="tableData" style="width: 100%" size="small" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" :selectable="selectable" />
<el-table-column prop="name" label="预设名称" />
<el-table-column prop="name" label="工艺名称" />
<!-- <el-table-column prop="orgName" label="矿石名称">
<template #default="scope">
<span v-if="scope.row.oresId === 1">硫酸</span>
@ -179,7 +179,7 @@ const returnOre = () => {
<AddCraft v-if="addCraftVisible" :source-data @ok="addCraftVisible = false;queryCrafList()" @cancel="addCraftVisible = false" />
<AddCraftDialog ref="addCraftRef" @ok="queryCrafList" />
<!-- 执行预设选择加热区 -->
<!-- 执行工艺选择加热区 -->
<FtDialog v-model="heatVisible" title="添加矿石" width="30%" :ok-handle="onStart" @cancel="heatVisible = false">
<div style="display: flex; justify-content: center;align-items: center;">
<label>选择加热区</label>

14
src/views/home/index.vue

@ -78,7 +78,7 @@ provide('currentTemperatureData', currentTemperatureData)
const setTemperature = (data: System.HeatArea) => {
const craft = systemStore.systemStatus.trays?.find(item => item.heatModuleCode === data.moduleCode)?.crafts
if (craft?.craft) {
FtMessage.warning(`当前加热区已绑定预设`)
FtMessage.warning(`当前加热区已绑定工艺`)
return
}
currentTemperatureData.value = {
@ -170,6 +170,8 @@ const trayInHandle = async () => {
// }
const checkCraftVisible = ref(false)
const moreVisible = ref(false)
</script>
<template>
@ -200,22 +202,26 @@ const checkCraftVisible = ref(false)
结束记录
</ft-button>
<ft-button size="large" :click-handle="executeCraftHandle">
执行预设
执行工艺
</ft-button>
<ft-button size="large" :click-handle="() => checkCraftVisible = true">
异常预设
<el-icon v-if="systemStore.errorCraft" color="#DF1515" size="15" style="margin-right: 5px">
<WarningFilled />
</el-icon>
异常工艺
</ft-button>
</div>
</el-col>
<el-col :span="4" style="display: grid; gap: 10px; grid-template-columns: repeat(1, 1fr);grid-template-rows: repeat(1, 1fr)">
<div class="manual-box">
<el-popover
:visible="moreVisible"
placement="top-start"
width="auto"
trigger="click"
>
<template #reference>
<div class="manual-button">
<div class="manual-button" @click="moreVisible = !moreVisible">
手动操作
</div>
</template>

6
src/views/ore/index.vue

@ -115,7 +115,7 @@ const onShowCraft = () => {
return
}
if (selectedList.value.length !== 1) {
ElMessage.warning('只能查看一条数据的预设')
ElMessage.warning('只能查看一条数据的工艺')
return
}
const editItem = selectedList.value[0]
@ -143,7 +143,7 @@ const onShowCraft = () => {
删除矿石
</FtButton>
<FtButton @click="onShowCraft">
查看预设
查看工艺
</FtButton>
</div>
<div>
@ -151,7 +151,7 @@ const onShowCraft = () => {
<el-table-column type="selection" width="55" />
<el-table-column type="index" width="50" />
<el-table-column prop="oresName" label="矿石名称" />
<el-table-column prop="craftNames" label="预设名称">
<el-table-column prop="craftNames" label="工艺名称">
<template #default="scoped">
<div class="craft-tag">
<el-tag v-for="item in scoped.row.craftsList" :key="item.id" type="info" style="margin-left: 5px;">

Loading…
Cancel
Save