Browse Source

fix: 工艺

master
guoapeng 2 months ago
parent
commit
e7e160a459
  1. 4
      .env.test
  2. 4
      src/apis/crafts.ts
  3. 2
      src/apis/home.ts
  4. 2
      src/apis/solution.ts
  5. 4
      src/app.vue
  6. 313
      src/components/craft/AddCraft/index.vue
  7. 20
      src/components/craft/AddCraftDialog.vue
  8. 14
      src/components/craft/CraftStatus.vue
  9. 10
      src/components/home/SelectCraft/index.vue
  10. 10
      src/components/home/Tube/index.vue
  11. 6
      src/libs/utils.ts
  12. 2
      src/router/index.ts
  13. 6
      src/stores/systemStore.ts
  14. 82
      src/views/craft/index.vue
  15. 46
      src/views/home/index.vue
  16. 6
      src/views/ore/index.vue

4
.env.test

@ -2,6 +2,6 @@
FT_NODE_ENV=test
FT_WS_URL=ws://127.0.0.1:8080/ws
FT_PROXY=http://127.0.0.1:8080
FT_WS_URL=ws://192.168.1.199:8081/ws
FT_PROXY=http://127.0.0.1:8081
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 }): 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/apis/home.ts

@ -9,3 +9,5 @@ export const getTask = (id: number): Promise<Task.Task> => http.get(`${baseUrl}$
export const taskList = (params: Task.TaskQuery): Promise<Task.Task[]> => http.get(`${baseUrl}list`, { params })
export const getTaskIng = (): Promise<null> => http.get(`${baseUrl}getIngTask`)
export const delTask = (params: string): Promise<null> => http.delete(`${baseUrl}${params}`)
export const trayIn = (): Promise<null> => http.post('tray/in')
export const trayOut = (): Promise<null> => http.post('tray/out')

2
src/apis/solution.ts

@ -1,6 +1,6 @@
import http from 'libs/http'
export const getSolsList = (): Promise<System.PageResponse<Solution.SolutionItem>> => http.get(`/sols/list`)
export const getSolsList = (params: System.Page = { pageNum: 1, pageSize: 999 }): Promise<System.PageResponse<Solution.SolutionItem>> => http.get(`/sols/list`, { params })
export const saveSols = (params: { name: string }): Promise<null> => http.post(`/sols`, params)

4
src/app.vue

@ -9,13 +9,13 @@ onMounted(async () => {
const res = await getStatus()
console.log(res)
console.log(systemStore.systemStatus)
systemStore.updateSystemStatus(res)
// systemStore.updateSystemStatus(res)
startProgress()
})
socket.init((data: System.SystemStatus) => {
console.log(data)
systemStore.updateSystemStatus(data)
// systemStore.updateSystemStatus(data)
}, 'status')
const progress = ref(0)

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

@ -0,0 +1,313 @@
<script setup lang="ts">
import { getContainerList } from 'apis/container'
import { createCraft, updateCraft } from 'apis/crafts'
import { getSolsList } from 'apis/solution'
import emptyIcon from 'assets/images/empty.svg'
import { FtMessage } from 'libs/message'
import { allPropertiesDefined } from 'libs/utils'
import { onMounted, ref } from 'vue'
import { useRoute } from 'vue-router'
const props = defineProps({
sourceData: {
type: Object,
default: () => ({}),
},
})
const emits = defineEmits(['ok', 'cancel'])
const route = useRoute()
const oresId: number = route.query.oreId as unknown as number
const containerList = ref<Container.ContainerItem[]>([])
const solutionList = ref<Solution.SolutionItem[]>([])
onMounted(async () => {
containerList.value = await getContainerList()
solutionList.value = (await getSolsList()).list
if (props.sourceData) {
form.value = { ...props.sourceData, stepList: JSON.parse(props.sourceData.steps || '[]') }
form.value.stepList.forEach((step: any) => {
if (step.params.time) {
step.params.minutes = Math.floor(step.params.time / 60)
step.params.seconds = step.params.time % 60
}
})
}
})
const form = ref({
stepList: [],
})
const formRef = ref()
const rules = {
name: [
{ required: true, trigger: 'blur', message: '请输入预设名称' },
],
}
const okHandle = async () => {
try {
const valid = await formRef.value.validate()
if (!valid) {
return
}
//
const invalidStepIndex = form.value.stepList.findIndex(
(step: any) => {
if (['heat', 'dry', 'anneal'].includes(step.method)) {
if (step.params.minutes || step.params.seconds) {
step.params.time = (step.params.minutes || 0) * 60 + (step.params.seconds || 0) || undefined
}
}
switch (step.method) {
case 'clean':
step.params.description = `针头高度${step.params.height}mm清洗${step.params.cycle}`
break
case 'addLiquid':
step.params.description = `添加${solutionList.value.find(s => s.id === containerList.value.find(c => c.id === step.params.containerId)?.solutionId)?.name}-${step.params.volume}ml`
break
case 'reduceLiquid':
step.params.description = `针头高度${step.params.height}mm抽取液体`
break
case 'preHeat':
step.params.description = `预热到${step.params.temperature}`
break
case 'heat':
step.params.description = `加热: ${step.params.temperature}度, 保持${step.params.minutes || 0}${step.params.seconds || 0}`
break
case 'dry':
step.params.description = `烘干: ${step.params.temperature}度, 保持${step.params.minutes || 0}${step.params.seconds || 0}`
break
case 'anneal':
step.params.description = `退火: ${step.params.temperature}度, 保持${step.params.minutes || 0}${step.params.seconds || 0}`
break
}
return !allPropertiesDefined(step.params, ['minutes', 'seconds', 'description'])
},
)
console.log(form.value)
if (invalidStepIndex !== -1) {
FtMessage.error(`步骤${invalidStepIndex + 1}: 请填写完整参数`)
return
}
form.value.steps = JSON.stringify(form.value.stepList)
form.value.oresId = oresId
if (form.value.id) {
await updateCraft(form.value)
}
else {
await createCraft(form.value)
}
FtMessage.success('保存成功')
emits('ok')
}
catch (error) {
console.log(error)
}
}
const cancel = () => {
emits('cancel')
}
const stepMap = {
preHeat: { name: '预热', method: 'preHeat', params: { temperature: undefined, description: undefined } },
addLiquid: { name: '加液', method: 'addLiquid', params: { volume: undefined, containerId: undefined, 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 } },
clean: { name: '清洗', method: 'clean', params: { cycle: undefined, height: undefined, description: undefined } },
dry: { name: '烘干', method: 'dry', params: { temperature: undefined, time: undefined, description: undefined, minutes: undefined, seconds: undefined } },
anneal: { name: '退火', method: 'anneal', params: { temperature: undefined, feedTemperature: undefined, time: undefined, description: undefined, minutes: undefined, seconds: undefined } },
}
const addStep = (data: any) => {
form.value.stepList.push(data)
}
</script>
<template>
<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.number="form.name" type="number" placeholder="请输入预设名称" />
</el-form-item>
<el-form-item label="步骤列表">
<div class="button-content">
<el-tag v-for="item in stepMap" :key="item" size="large" @click="() => addStep(item)">
<div style="display: flex;align-items: center;justify-content: space-around;width: 100%;">
<el-icon><Plus /></el-icon>
<span> {{ item.name }}</span>
</div>
</el-tag>
</div>
</el-form-item>
</el-col>
<el-col :span="14">
<div v-if="form.stepList.length" class="step-box">
<div v-for="(item, index) in form.stepList" :key="index" class="step-item">
<el-form-item :label="`${index + 1}: ${item.name}`">
<template v-if="item.method === 'clean'">
<el-input v-model.number="item.params.cycle" type="number" size="small" placeholder="请输入次数">
<template #append>
</template>
</el-input>
<el-input v-model.number="item.params.height" type="number" size="small" placeholder="请输入高度">
<template #append>
mm
</template>
</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-input v-model.number="item.params.volume" type="number" size="small" placeholder="请输入容量">
<template #append>
ml
</template>
</el-input>
</template>
<template v-else-if="item.method === 'reduceLiquid'">
<el-input v-model.number="item.params.height" type="number" size="small" placeholder="请输入高度">
<template #append>
mm
</template>
</el-input>
</template>
<template v-else-if="item.method === 'preHeat'">
<el-input v-model.number="item.params.temperature" type="number" size="small" placeholder="请输入温度">
<template #append>
</template>
</el-input>
</template>
<template v-else-if="['heat', 'dry'].includes(item.method)">
<el-input v-model.number="item.params.temperature" type="number" size="small" placeholder="退火温度">
<template #append>
</template>
</el-input>
<el-select v-model="item.params.minutes" style="width: 70px" clearable size="small" placeholder="请选择">
<el-option v-for="i in 60" :key="i" :label="i" :value="i" />
</el-select>
<span class="unit-text"></span>
<el-select v-model="item.params.seconds" style="width: 70px" clearable size="small" placeholder="请选择">
<el-option v-for="i in 60" :key="i" :label="i" :value="i" />
</el-select>
<span class="unit-text"></span>
</template>
<div v-else-if="['anneal'].includes(item.method)" class="info-box">
<div>
<el-input v-model.number="item.params.temperature" type="number" size="small" placeholder="退火温度">
<template #append>
</template>
</el-input>
<el-input v-model.number="item.params.feedTemperature" type="number" size="small" placeholder="下料温度">
<template #append>
</template>
</el-input>
</div>
<div>
<el-select v-model="item.params.minutes" style="width: 70px" clearable size="small" placeholder="请选择">
<el-option v-for="i in 60" :key="i" :label="i" :value="i" />
</el-select>
<span class="unit-text"></span>
<el-select v-model="item.params.seconds" style="width: 70px" clearable size="small" placeholder="请选择">
<el-option v-for="i in 60" :key="i" :label="i" :value="i" />
</el-select>
<span class="unit-text"></span>
</div>
</div>
<el-icon style="margin-left: auto;" @click="() => form.stepList.splice(index, 1)">
<Close />
</el-icon>
</el-form-item>
</div>
</div>
<div v-else class="empty-box">
<img :src="emptyIcon" alt="">
<span>暂无步骤</span>
</div>
</el-col>
</el-row>
</el-form>
</FtDialog>
</template>
<style scoped lang="scss">
.form-box {
height: 50vh;
.el-row {
height: 100%;
.el-col:first-child {
border-right: 1px solid #eee;
}
.el-col {
height: 100%;
.step-box {
height: 100%;
overflow: auto;
}
}
}
}
.button-content {
width: 100%;
display: grid;
grid-template-columns: repeat(2, 1fr); /* 创建3列等宽轨道 */
grid-template-rows: repeat(4, auto); /* 创建2行自动高度 */
gap: 20px;
}
:deep(.el-tag__content) {
width: 100%;
}
.empty-box {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: #ccc;
img {
margin-bottom: 10px;
}
}
.step-item {
.el-form-item {
background: rgba(82, 148, 215, 0.06);
padding: 5px;
margin-bottom: 10px;
:deep(.el-form-item__label) {
height: 25px;
line-height: 25px;
}
:deep(.el-form-item__content) {
width: 100%;
display: flex;
align-items: center;
.el-input, .el-select {
width: 120px;
margin: 0 5px;
}
.info-box {
width: 80%;
height: 100%;
}
}
}
}
.unit-text {
font-size: 12px;
line-height: 25px;
}
</style>

20
src/components/craft/AddCraftDialog.vue

@ -1,9 +1,9 @@
<script lang="ts" setup>
import { ElMessage } from 'element-plus'
import { StepCmdDescMap } from 'views/craft/craft_constant'
import { ref } from 'vue'
import { useRoute } from 'vue-router'
import { createCraft, updateCraft } from '@/apis/crafts'
import { StepCmdDescMap } from '../../views/craft/craft_constant'
import FtButton from '../common/FTButton/index.vue'
import FTDialog from '../common/FTDialog/index.vue'
import TransferLeft from './TransferLeft.vue'
@ -13,6 +13,14 @@ const emit = defineEmits<{
(e: 'ok'): void
}>()
// const stepMap = {
// preHeat: { name: '', data: { method: 'preHeat', params: { temperature: undefined } } },
// addLiquid: { name: '', data: { method: 'addLiquid', params: { volume: undefined, id: undefined } } },
// reduceLiquid: { name: '', data: { method: 'reduceLiquid', params: { volume: undefined, id: undefined } } },
// heatStart: { name: '', data: { method: 'heatStart', params: { temperature: undefined, time: undefined } } },
// fanStart: { name: '', data: { method: 'fanStart', params: { temperature: undefined } } },
// }
const visible = ref(false)
const stepStructs = ref<CraftTypes.StepStruct[]>([])
const craftObj = ref<CraftTypes.Craft>({})
@ -68,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))
@ -183,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"
@ -198,7 +206,7 @@ defineExpose({
</div>
<div class="craft-title">
<div>
工艺步骤
预设步骤
</div>
<div class="title-right">
选择的步骤
@ -214,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>

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

@ -116,11 +116,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>
<div class="status-operation">
<ft-button v-if="craft?.state === 'RUNNING'" type="primary" size="small" :click-handle="pauseCraftHandle">
暂停

6
src/libs/utils.ts

@ -115,3 +115,9 @@ export function formatDateTime(template: string = 'YYYY-MM-DD HH:mm:ss'): string
return template.replace(/YYYY|MM|DD|HH|mm|ss/g, token => tokens[token]!)
}
export function allPropertiesDefined(obj: Record<string, any>, excludeKeys: string[] = []): boolean {
return Object.entries(obj).every(([key, value]) => {
return excludeKeys.includes(key) ? true : value
})
}

2
src/router/index.ts

@ -11,7 +11,7 @@ const router = createRouter({
router.beforeEach((to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => {
const systemStore = useSystemStore()
if (getToken() && systemStore.systemStatus.currentUser?.username) {
if (getToken() && (systemStore.systemStatus.currentUser?.username || import.meta.env.FT_NODE_ENV !== 'prod')) {
if (to.name === 'login') {
next({ name: from.name })
}

6
src/stores/systemStore.ts

@ -70,7 +70,7 @@ export const useSystemStore = defineStore('system', {
{
moduleCode: 'heat_module_02',
enable: true,
trayStatus: false,
trayStatus: true,
heatingType: 'stop',
fanOpen: true,
dryTemperature: 0,
@ -94,7 +94,7 @@ export const useSystemStore = defineStore('system', {
{
moduleCode: 'heat_module_04',
enable: true,
trayStatus: false,
trayStatus: true,
heatingType: 'annealing',
fanOpen: false,
dryTemperature: 0,
@ -253,5 +253,5 @@ export const useSystemStore = defineStore('system', {
})
},
},
persist: true,
persist: import.meta.env.FT_NODE_ENV === 'prod',
})

82
src/views/craft/index.vue

@ -3,13 +3,14 @@ import { ElMessage, ElMessageBox } from 'element-plus'
import { onMounted, ref } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { delCraft, getCraftList, setCraft, startCraft } from '@/apis/crafts'
import AddCraft from '@/components/craft/AddCraft/index.vue'
import AddCraftDialog from '@/components/craft/AddCraftDialog.vue'
import CraftStatus from '@/components/craft/CraftStatus.vue'
const tableData = ref<CraftTypes.Craft[]>([])
const addCraftRef = ref<CraftTypes.AddCraftType | null>(null)
const selectable = ref()
const multipleSelection = ref<CraftTypes.Craft[]>()
const multipleSelection = ref<CraftTypes.Craft[]>([])
const heatVisible = ref(false)
const heatId = ref()
const craftStatusRef = ref<CraftTypes.craftStatus | null>(null)
@ -45,19 +46,24 @@ const queryCrafList = () => {
}
const onAddCraft = () => {
if (addCraftRef.value) {
addCraftRef.value.openDialog()
}
// if (addCraftRef.value) {
// addCraftRef.value.openDialog()
// }
sourceData.value = null
addCraftVisible.value = true
}
const sourceData = ref<CraftTypes.Craft | null>(null)
const onEditCraft = () => {
if (multipleSelection.value && multipleSelection.value.length !== 1) {
ElMessage.warning('请选择一条数据进行编辑')
return
}
if (addCraftRef.value && multipleSelection.value) {
addCraftRef.value.editDialog(multipleSelection.value[0])
}
// if (multipleSelection.value && multipleSelection.value.length !== 1) {
// ElMessage.warning('')
// return
// }
// if (addCraftRef.value && multipleSelection.value) {
// addCraftRef.value.editDialog(multipleSelection.value[0])
// }
sourceData.value = multipleSelection.value[0]
addCraftVisible.value = true
}
const handleSelectionChange = (rows: CraftTypes.Craft[]) => {
@ -91,19 +97,19 @@ const onDelCraft = () => {
})
}
const onSelectHeatId = () => {
if (!multipleSelection.value || multipleSelection.value.length !== 1) {
ElMessage.warning('每次只可执行一次工艺')
return
}
heatVisible.value = true
}
// const onSelectHeatId = () => {
// if (!multipleSelection.value || multipleSelection.value.length !== 1) {
// ElMessage.warning('')
// return
// }
// heatVisible.value = true
// }
const onShowState = () => {
craftStatusRef.value?.showDialog()
}
// const onShowState = () => {
// craftStatusRef.value?.showDialog()
// }
//
//
const onStart = () => {
if (!heatId.value) {
ElMessage.warning('请选择加热区')
@ -121,7 +127,7 @@ const onStart = () => {
setCraft(params).then(() => {
startCraft({ heatId: heatId.value }).then(() => {
console.log('开始执行')
ElMessage.success('工艺已开始执行')
ElMessage.success('预设已开始执行')
heatVisible.value = false
//
craftStatusRef.value?.showDialog()
@ -134,31 +140,33 @@ const onStart = () => {
const returnOre = () => {
router.push('/ore')
}
const addCraftVisible = ref(false)
</script>
<template>
<div class="component-page">
<section class="flex items-center h-20 gap-3 pl-3">
<FtButton type="primary" @click="onAddCraft">
添加工艺
添加预设
</FtButton>
<FtButton type="primary" @click="onEditCraft">
编辑工艺
<FtButton type="primary" :disabled="multipleSelection.length !== 1" @click="onEditCraft">
编辑预设
</FtButton>
<FtButton @click="onDelCraft">
删除工艺
</FtButton>
<FtButton @click="onSelectHeatId">
执行工艺
</FtButton>
<FtButton @click="onShowState">
查看工艺步骤
<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>
@ -169,8 +177,10 @@ const returnOre = () => {
<el-table-column prop="updateTime" label="更新日期" />
</el-table>
</main>
<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>

46
src/views/home/index.vue

@ -1,6 +1,6 @@
<script setup lang="ts">
import { startCraft } from 'apis/crafts'
import { stopTask } from 'apis/home'
import { stopTask, trayIn, trayOut } from 'apis/home'
import AddLiquid from 'components/home/AddLiquid/index.vue'
import ExtractLiquid from 'components/home/ExtractLiquid/index.vue'
import FillSolution from 'components/home/FillSolution/index.vue'
@ -64,14 +64,14 @@ const stopExperimentHandle = async () => {
}
const selectCraftVisible = ref(false)
const selectCraft = () => {
const count = homeStore.heatAreaList.filter(item => item.selected).length
if (!count) {
FtMessage.warning('请选择加热区')
return
}
selectCraftVisible.value = true
}
// 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)
@ -87,7 +87,7 @@ const executeCraftHandle = async () => {
}
})
if (craftError.length) {
FtMessage.warning(`${craftError.join(',')}工艺不是等待执行的状态`)
FtMessage.warning(`${craftError.join(',')}预设不是等待执行的状态`)
return
}
for (let i = 0; i < selectedHeatAreas.length; i++) {
@ -95,7 +95,7 @@ const executeCraftHandle = async () => {
heatId: selectedHeatAreas[i].value,
})
}
FtMessage.success('工艺已开始执行')
FtMessage.success('预设已开始执行')
}
const setTemperatureVisible = ref(false)
@ -107,7 +107,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 = {
@ -188,6 +188,14 @@ const move_to_anneal_area = async () => {
}
await commandHandle('move_to_anneal_area', { heatModuleCode: selectedHeatArea.value?.value })
}
const trayInHandle = async () => {
await trayIn()
}
const trayOutHandle = async () => {
await trayOut()
}
</script>
<template>
@ -220,6 +228,12 @@ const move_to_anneal_area = async () => {
<ft-button size="large" :click-handle="move_to_anneal_area">
移至退火位
</ft-button>
<ft-button size="large" :click-handle="trayInHandle">
放入托盘
</ft-button>
<ft-button size="large" :click-handle="trayOutHandle">
取出托盘
</ft-button>
</div>
</el-col>
<el-col :span="6" style="display: grid; gap: 10px; grid-template-columns: repeat(1, 1fr);grid-template-rows: repeat(2, 1fr)">
@ -231,11 +245,11 @@ const move_to_anneal_area = async () => {
结束记录
</ft-button>
<ft-button size="large" @click="selectCraft">
选择预设
</ft-button>
<!-- <ft-button size="large" @click="selectCraft"> -->
<!-- 选择预设 -->
<!-- </ft-button> -->
<ft-button size="large" :click-handle="executeCraftHandle">
<ft-button size="large" style="grid-column: 1 / 3; grid-row: 2 / 3;" :click-handle="executeCraftHandle">
执行预设
</ft-button>
</div>

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