You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
292 lines
7.9 KiB
292 lines
7.9 KiB
<template>
|
|
<div class="px-6 pt-4 pb-3 flex justify-between">
|
|
<div class="w-full">
|
|
<div class="flex items-center mb-3 gap-5">
|
|
<button :disabled="statusStore.workStatus !== 'idle'" class="btn-dark px-8 py-2 text-lg" @click="onStartSpray">
|
|
开始喷涂
|
|
</button>
|
|
<button
|
|
:disabled="statusStore.workStatus !== 'spraying'"
|
|
class="btn-light px-8 py-2 text-lg"
|
|
@click="onStopSpray">
|
|
停止喷涂
|
|
</button>
|
|
<section class="flex items-center gap-3 px-4 text-base ml-auto">
|
|
<div class="flex items-center">
|
|
<span class="self-center text-right text-primary font-medium mr-3">选择基质</span>
|
|
<el-select v-model="selectMatrixId" placeholder="Select" style="width: 120px" @change="onMatrixChange">
|
|
<el-option
|
|
v-for="item in settingStore.matrixList"
|
|
:key="item.id"
|
|
:label="item.name"
|
|
:value="item.id" />
|
|
</el-select>
|
|
</div>
|
|
<div class="flex items-center">
|
|
<span class="self-center text-right text-primary font-medium mr-3">工艺</span>
|
|
<el-select
|
|
:disabled="craftList.length === 0"
|
|
v-model="selectCraftId"
|
|
placeholder="Select"
|
|
style="width: 120px"
|
|
@change="onCraftChange">
|
|
<el-option v-for="item in craftList" :key="item.id" :label="item.name" :value="item.id" />
|
|
</el-select>
|
|
</div>
|
|
<el-popover placement="bottom-end" :width="380" trigger="click">
|
|
<template #reference>
|
|
<div class="text-primary underline flex items-center gap-1">
|
|
<span>{{ craftList.length === 0 ? "设置参数" : "详细参数" }}</span>
|
|
<img src="@/assets/icon_info.svg" alt="info" />
|
|
</div>
|
|
</template>
|
|
<template #default>
|
|
<SprayParam
|
|
ref="sprayParamRef"
|
|
:sprayParam="selectCraft"
|
|
save-title="保存至工艺"
|
|
@save="updateSprayParam" />
|
|
</template>
|
|
</el-popover>
|
|
</section>
|
|
</div>
|
|
|
|
<section class="flex flex-col items-start">
|
|
<section class="flex">
|
|
<Spray
|
|
:width="210"
|
|
:height="610"
|
|
:left-padding="4"
|
|
:right-padding="4"
|
|
:top-padding="4"
|
|
:bottom-padding="4"
|
|
:columns="1"
|
|
:rows="3"
|
|
:cell-num="25"
|
|
:hideGripper="!checked.find(c => c === '0')"
|
|
@select-area="area => onSelectArea(area, 0)" />
|
|
<Spray
|
|
:width="210"
|
|
:height="610"
|
|
:left-padding="4"
|
|
:right-padding="4"
|
|
:top-padding="4"
|
|
:bottom-padding="4"
|
|
:columns="1"
|
|
:rows="3"
|
|
:cell-num="25"
|
|
:hideGripper="!checked.find(c => c === '1')"
|
|
@select-area="area => onSelectArea(area, 1)" />
|
|
<Spray
|
|
:width="210"
|
|
:height="610"
|
|
:left-padding="4"
|
|
:right-padding="4"
|
|
:top-padding="4"
|
|
:bottom-padding="4"
|
|
:columns="1"
|
|
:rows="3"
|
|
:cell-num="25"
|
|
:hideGripper="!checked.find(c => c === '2')"
|
|
@select-area="area => onSelectArea(area, 2)" />
|
|
<Spray
|
|
:width="210"
|
|
:height="610"
|
|
:left-padding="4"
|
|
:right-padding="4"
|
|
:top-padding="4"
|
|
:bottom-padding="4"
|
|
:columns="1"
|
|
:rows="3"
|
|
:cell-num="25"
|
|
:hideGripper="!checked.find(c => c === '3')"
|
|
@select-area="area => onSelectArea(area, 3)" />
|
|
</section>
|
|
|
|
<van-checkbox-group
|
|
shape="square"
|
|
v-model="checked"
|
|
checked-color="#26509c"
|
|
icon-size="28px"
|
|
direction="horizontal"
|
|
class="flex justify-around mt-3 w-[848px]">
|
|
<van-checkbox name="0"></van-checkbox>
|
|
<van-checkbox name="1"></van-checkbox>
|
|
<van-checkbox name="2"></van-checkbox>
|
|
<van-checkbox name="3"></van-checkbox>
|
|
</van-checkbox-group>
|
|
</section>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import Spray, { type GridArea } from "@/components/Spray.vue";
|
|
import { onMounted, ref, useTemplateRef } from "vue";
|
|
import { startSpray, stopWork } from "@/services/globalCmd/globalCmd";
|
|
import { checkSprayParamValid, type PositionType, type WorkType } from "@/services/globalCmd/cmdTypes";
|
|
import { ElMessage } from "element-plus";
|
|
import { useSettingStore } from "@/stores/setting";
|
|
import type { CraftItem } from "@/services/matrix/type";
|
|
import { createCraft, getListByMatrixId, updateCraft } from "@/services/matrix/craft";
|
|
import SprayParam from "@/components/SprayParam.vue";
|
|
import { useEquipmentStatusStore } from "@/stores/equipmentStatus";
|
|
|
|
const defaultCraft: Partial<CraftItem> = {
|
|
id: 0,
|
|
name: "default",
|
|
matrixId: 0,
|
|
routeType: 1,
|
|
space: undefined,
|
|
nitrogenFlowVelocity: undefined,
|
|
nitrogenAirPressure: undefined,
|
|
matrixFlowVelocity: undefined,
|
|
voltage: undefined,
|
|
needPower: false,
|
|
height: undefined,
|
|
movementSpeed: undefined,
|
|
position: [],
|
|
};
|
|
|
|
const settingStore = useSettingStore();
|
|
const statusStore = useEquipmentStatusStore();
|
|
const selectMatrixId = ref<number>(settingStore.matrixList.length > 0 ? settingStore.matrixList[0].id : 0);
|
|
|
|
const craftList = ref<CraftItem[]>([]);
|
|
|
|
const selectCraftId = ref<number>(1);
|
|
const selectCraft = ref<Partial<CraftItem>>(defaultCraft);
|
|
|
|
const selectedArea = ref<GridArea[]>([
|
|
{ xStart: 8, yStart: 8, xEnd: 16, yEnd: 16 },
|
|
{ xStart: 8, yStart: 8, xEnd: 16, yEnd: 16 },
|
|
{ xStart: 8, yStart: 8, xEnd: 16, yEnd: 16 },
|
|
{ xStart: 8, yStart: 8, xEnd: 16, yEnd: 16 },
|
|
]);
|
|
|
|
const checked = ref(["0"]);
|
|
|
|
onMounted(() => {
|
|
if (settingStore.matrixList.length > 0) {
|
|
onMatrixChange(settingStore.matrixList[0].id);
|
|
}
|
|
});
|
|
|
|
function onSelectArea(area: GridArea, index: number) {
|
|
selectedArea.value[index] = area;
|
|
}
|
|
|
|
function onMatrixChange(val: number) {
|
|
selectMatrixId.value = val;
|
|
getListByMatrixId({ matrixId: val }).then(res => {
|
|
if (res.success) {
|
|
craftList.value = res.data || [];
|
|
if (res.data.length > 0) {
|
|
selectCraftId.value = res.data[0].id;
|
|
selectCraft.value = { ...res.data[0], needPower: res.data[0].voltage > 0 };
|
|
} else {
|
|
selectCraftId.value = 0;
|
|
selectCraft.value = defaultCraft;
|
|
}
|
|
} else {
|
|
ElMessage.error(res.msg);
|
|
}
|
|
});
|
|
}
|
|
|
|
function onCraftChange(val: number) {
|
|
const craft = craftList.value.find(item => item.id === val);
|
|
selectCraft.value = { ...craft, needPower: craft!.voltage > 0 };
|
|
}
|
|
|
|
function mapAreaToPosition() {
|
|
return checked.value.map(index => {
|
|
const idx = +index;
|
|
const pos: PositionType = {
|
|
x1: selectedArea.value[idx].xStart,
|
|
y1: selectedArea.value[idx].yStart,
|
|
x2: selectedArea.value[idx].xEnd,
|
|
y2: selectedArea.value[idx].yEnd,
|
|
index: idx,
|
|
};
|
|
return pos;
|
|
});
|
|
}
|
|
const sprayParamRef = ref();
|
|
|
|
function onStartSpray() {
|
|
if (checked.value.length === 0) {
|
|
ElMessage.error("请至少选择一个玻片");
|
|
return;
|
|
}
|
|
|
|
// 把参数弹窗中的数据 应用过来
|
|
const params = { ...selectCraft.value, ...sprayParamRef.value.sprayParam };
|
|
params.position = mapAreaToPosition();
|
|
if (!params.needPower) {
|
|
params.voltage = 0;
|
|
}
|
|
// console.log(params);
|
|
|
|
const check = checkSprayParamValid(params);
|
|
if (!check[0]) {
|
|
ElMessage.error(check[1]);
|
|
return;
|
|
}
|
|
|
|
startSpray({
|
|
...(params as CraftItem),
|
|
matrixId: selectMatrixId.value,
|
|
matrixCraftId: selectCraft.value.id || 0,
|
|
}).then(res => {
|
|
if (res.success) {
|
|
ElMessage.success("已经开始喷涂");
|
|
} else {
|
|
ElMessage.error(res.msg);
|
|
}
|
|
});
|
|
}
|
|
|
|
function onStopSpray() {
|
|
stopWork().then(res => {
|
|
if (res.success) {
|
|
} else {
|
|
ElMessage.error(res.msg);
|
|
}
|
|
});
|
|
}
|
|
|
|
function updateSprayParam(p: WorkType) {
|
|
console.log(p);
|
|
const params = !!p.needPower ? p : { ...p, voltage: 0 };
|
|
if ((params as CraftItem).id === 0) {
|
|
// 创建
|
|
const p = { ...(params as CraftItem), matrixId: selectMatrixId.value };
|
|
createCraft(p).then(res => {
|
|
if (res.success) {
|
|
onMatrixChange(selectMatrixId.value);
|
|
} else {
|
|
ElMessage.error(res.msg);
|
|
}
|
|
});
|
|
} else {
|
|
// 更新
|
|
updateCraft(params as CraftItem).then(res => {
|
|
if (res.success) {
|
|
selectCraft.value = params as CraftItem;
|
|
} else {
|
|
ElMessage.error(res.msg);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
:deep(.el-collapse-item__header) {
|
|
background-color: transparent;
|
|
}
|
|
:deep(.el-collapse-item__wrap) {
|
|
background-color: transparent;
|
|
}
|
|
</style>
|