LiLongLong 5 months ago
parent
commit
e4b215aa07
  1. 10
      src/App.vue
  2. 1
      src/assets/icon_wifi_red.svg
  3. 7
      src/components/Dialog.vue
  4. 56
      src/components/FooterBar.vue
  5. 35
      src/components/HeaderBar.vue
  6. 2
      src/components/SprayParam.vue
  7. 18
      src/services/globalCmd/globalCmd.ts
  8. 30
      src/services/wsTypes.ts
  9. 9
      src/stores/equipmentStatus.ts
  10. 8
      src/style.css
  11. 54
      src/views/HomeView.vue
  12. 104
      src/views/PreSpray.vue
  13. 14
      src/views/SprayView.vue

10
src/App.vue

@ -13,27 +13,26 @@ const router = useRouter();
const wsClient = createWebSocket(sharedWsUrl);
wsClient.dataOb.subscribe(data => {
if (data.type === "status") {
if (data.type === "ing") {
equipmentStatusStore.setWorkStatus(data.data.workStatus);
} else if (data.type === "status") {
equipmentStatusStore.setEquipmentStatus(data["data"]);
} else if (data.type === "warn") {
if (data.data.code === "wash_complete") {
dialogContent.value = {
title: "提示",
desc: "清洗管道已经完成",
type: "alert",
};
showDialog.value = true;
} else if (data.data.code === "prefill_complete") {
dialogContent.value = {
title: "提示",
desc: "预充管道已经完成",
type: "alert",
};
showDialog.value = true;
} else if (data.data.code === "dehumidify_complete") {
dialogContent.value = {
title: "提示",
desc: "除湿已完成",
desc: "湿度已达到设定值,氮气已置换完毕。",
type: "confirm",
okText: "去喷涂",
_brand: "dehumidify_complete",
@ -41,7 +40,6 @@ wsClient.dataOb.subscribe(data => {
showDialog.value = true;
} else if (data.data.code === "spray_complete") {
dialogContent.value = {
title: "提示",
desc: "喷涂结束,建议回首页清洗管道",
type: "confirm",
okText: "去清洗",

1
src/assets/icon_wifi_red.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="82" height="66" viewBox="0 0 82 66"><g><path d="M0,19.3215L7.45687,27.808C25.9786,6.7155,56.0214,6.7155,74.5431,27.808L82,19.3215C59.3731,-6.4405,22.6628,-6.4405,0,19.3215ZM29.8172,53.2675L41,66L52.1827,53.2675C46.0328,46.2275,36.0031,46.2275,29.8172,53.2675ZM14.9137,36.3L22.3706,44.7865C32.6565,33.0715,49.3538,33.0715,59.6396,44.7865L67.0914,36.3C52.7055,19.921,29.3355,19.921,14.9086,36.3L14.9137,36.3Z" fill="#FF0000" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>

7
src/components/Dialog.vue

@ -1,11 +1,11 @@
<template>
<div class="min-w-[420px] max-w-[540px] text-primary bg-white rounded-lg">
<h1 class="my-8 text-lg font-medium text-center px-8">{{ props.title || "提示" }}</h1>
<div class="text-lg px-4 text-center">
<div class="text-lg px-4 text-center whitespace-pre-wrap">
{{ props.desc }}
</div>
<footer class="flex justify-center items-center gap-6 py-10">
<button class="btn-dark px-8 py-2 text-lg min-w-[120px]" @click="$emit('onOk')">{{ okText || "" }}</button>
<button class="btn-dark px-8 py-2 text-lg min-w-[120px]" @click="$emit('onOk')">{{ okText || "" }}</button>
<button v-if="props.type === 'confirm'" class="btn-light px-8 py-2 text-lg min-w-[120px]" @click="$emit('onCancel')">
{{ cancelText || "取消" }}
</button>
@ -13,7 +13,6 @@
</div>
</template>
<script setup lang="ts">
export type DialogParam = {
title?: string; //
desc: string;
@ -21,7 +20,7 @@ export type DialogParam = {
okText?: string;
cancelText?: string;
_brand?: string;
}
};
const props = defineProps<DialogParam>();
const emit = defineEmits<{
(e: "onCancel"): void;

56
src/components/FooterBar.vue

@ -1,10 +1,23 @@
<template>
<header class="h-[--headerHeight] bg-primary flex items-center text-white px-[--borderWidth]">
<section class="bg-[#335AA5] px-4 py-2 rounded flex items-center gap-4">
<span>当前湿度{{ equipmentStore.equipmentStatus.humidity }}%RH</span>
<span>当前湿度{{ statusStore.equipmentStatus.humidity }}%RH</span>
<!-- <span>当前温度18</span> -->
</section>
<Time class="ml-auto text-lg"></Time>
<section class="bg-[#335AA5] ml-6 px-4 py-2 rounded flex items-center gap-4">
<span>当前设备{{ workStatusDescMap[statusStore.workStatus] }}</span>
<!-- <span>当前温度18</span> -->
</section>
<button
:disabled="!statusStore.equipmentStatus.yAxisMovementEnded"
class="ml-auto btn-light px-8 py-1 text-lg"
@click="onPushTrayClick">
{{ pushBtnText }}
</button>
<!-- <Time class="ml-auto text-lg"></Time> -->
<!-- <section v-if="route.path === '/home'" class="ml-auto h-[--footerHeight] flex items-center">
<div class="btn-light px-5 py-2 mr-5">
<img src="@/assets/wash.svg" alt="wash" />
@ -25,11 +38,46 @@
import { useRoute, useRouter } from "vue-router";
import Time from "./Time.vue";
import { useEquipmentStatusStore } from "@/stores/equipmentStatus";
import { workStatusDescMap } from "@/services/wsTypes";
import { computed } from "vue";
import { pushInTray, pushOutTray } from "@/services/globalCmd/globalCmd";
import { ElMessage } from "element-plus";
const route = useRoute();
const router = useRouter();
const equipmentStore = useEquipmentStatusStore();
const statusStore = useEquipmentStatusStore();
const pushBtnText = computed(() => {
if (isTrayInside.value) {
return "推出玻片";
} else if (isTrayOutside.value) {
return "推入玻片";
} else {
return "正在操作";
}
});
const isTrayOutside = computed(() => {
return statusStore.equipmentStatus.yAxisMovementEnded && statusStore.equipmentStatus.yAxisLimited;
});
const isTrayInside = computed(() => {
return statusStore.equipmentStatus.yAxisMovementEnded && statusStore.equipmentStatus.yAxisAtOrigin;
});
function onPushTrayClick() {
if (isTrayOutside.value) {
pushInTray({}).then(res => {
if (res.success) {
} else {
ElMessage.error(res.msg);
}
});
} else if (isTrayInside.value) {
pushOutTray({}).then(res => {
if (res.success) {
} else {
ElMessage.error(res.msg);
}
});
}
}
function onMenuBtnClick() {
if (route.path !== "/") {
router.back();

35
src/components/HeaderBar.vue

@ -4,7 +4,7 @@
<div v-if="route.path !== '/home'" class="w-0.5 h-5 bg-white mx-3"></div>
<p class="text-lg">{{ pageNameMap[route.path] }}</p>
<img src="@/assets/icon_wifi.svg" alt="" class="ml-auto w-8" />
<img :src="`${isWifiNormal ? icon_wifi : icon_wifi2}`" alt="" class="ml-auto w-8" />
<div v-if="route.path === '/home'" class="btn-light px-5 py-1 mx-6 rounded min-w-[102px]">
<el-dropdown trigger="click">
@ -16,13 +16,13 @@
<el-dropdown-menu>
<el-dropdown-item>
<div class="flex items-center gap-4 text-lg text-primary" @click="router.push('/matrixManage')">
<img :src="icon_substrate" class="w-[18px]" alt="">
<img :src="icon_substrate" class="w-[18px]" alt="" />
<span>基质管理</span>
</div>
</el-dropdown-item>
<el-dropdown-item>
<div class="flex items-center gap-4 text-lg text-primary" @click="router.push('/debug')">
<img :src="icon_debug" class="w-[18px]" alt="">
<img :src="icon_debug" class="w-[18px]" alt="" />
<span>调试</span>
</div>
</el-dropdown-item>
@ -37,14 +37,28 @@
</header>
</template>
<script setup lang="ts">
import { watch, ref, computed } from "vue";
import { watch, ref, computed, onMounted, onUnmounted } from "vue";
import Time from "@/components/Time.vue";
import icon_substrate from "@/assets/menu/icon_substrate.svg"
import icon_substrate from "@/assets/menu/icon_substrate.svg";
import icon_debug from "@/assets/menu/icon_debug.svg";
import icon_wifi from "@/assets/icon_wifi.svg";
import icon_wifi2 from "@/assets/icon_wifi_red.svg";
import { useRoute, useRouter } from "vue-router";
import { createWebSocket, sharedWsUrl } from "@/services/socket";
const route = useRoute();
const router = useRouter();
const isWifiNormal = ref(true);
onMounted(() => {
const wsClient = createWebSocket(sharedWsUrl);
const subscription = wsClient.stateOb.subscribe(state => {
isWifiNormal.value = state === "open";
});
onUnmounted(() => {
subscription.unsubscribe();
});
});
const pageNameMap: Record<string, string> = {
"/": "基质喷涂转印仪",
@ -55,7 +69,7 @@ const pageNameMap: Record<string, string> = {
"/matrixManage": "基质管理",
"/matrixCraft": "工艺管理",
"/debug": "调试",
"/history": "历史喷涂"
"/history": "历史喷涂",
};
function onReturnBtnClick() {
@ -65,13 +79,4 @@ function onReturnBtnClick() {
// router.push("/menu");
}
}
// watch(
// () => route.path,
// newPath => {
// console.log(newPath);
// if (newPath !== "/") {
// }
// }
// );
</script>

2
src/components/SprayParam.vue

@ -11,7 +11,7 @@
type="number"
v-model.number="selectCraft.height"
class="border-none outline-none h-[34px] bg-[#E8ECF7] text-primary font-medium rounded-md text-lg text-center" />
<span class="self-center text-primary font-medium">毫米</span>
<span class="self-center text-primary font-medium">毫米6.5</span>
<span class="self-center text-right text-primary font-medium">氮气流速</span>
<input

18
src/services/globalCmd/globalCmd.ts

@ -61,6 +61,13 @@ export function stopWork() {
return httpRequest<BaseResponse<string>>({ url: "/api/cmd/stopWork", method: "POST" });
}
export function pushOutTray(params: Record<string, any>) {
return httpRequest<BaseResponse<string>>({ url: "/api/cmd/trayOut", params, method: "POST" });
}
export function pushInTray(params: Record<string, any>) {
return httpRequest<BaseResponse<string>>({ url: "/api/cmd/trayIn", params, method: "POST" });
}
export function rotate(params: any) {
return httpRequest<BaseResponse<string>>({ url: "/api/cmd/rotate", params, method: "POST" });
}
@ -71,15 +78,22 @@ export type SprayParam = {
} & WorkType;
export function startSpray(params: SprayParam) {
return httpRequest<BaseResponse>({ url: "/api/cmd/startWork", params, method: "POST" });
return httpRequest<BaseResponse>({ url: "/api/cmd/startWork", params: { params }, method: "POST" });
}
export function startWash(params: Record<string, any>) {
export type WashType = "injector" | "nozzle";
export function startWash(params: { type: WashType }) {
return httpRequest<BaseResponse>({ url: "/api/cmd/startWash", params, method: "POST" });
}
export function stopWash(params: Record<string, any>) {
return httpRequest<BaseResponse>({ url: "/api/cmd/stopWash", params, method: "POST" });
}
export function startPrefill(params: Record<string, any>) {
return httpRequest<BaseResponse>({ url: "/api/cmd/startPrefill", params, method: "POST" });
}
export function stopPrefill(params: Record<string, any>) {
return httpRequest<BaseResponse>({ url: "/api/cmd/stopPrefill", params, method: "POST" });
}
export function startDehumidify(params: { humidity: number }) {
return httpRequest<BaseResponse>({ url: "/api/cmd/startDehumidify", params, method: "POST" });
}

30
src/services/wsTypes.ts

@ -19,6 +19,22 @@ export type WarnDatagram = {
};
};
export type WorkStatus = "idle" | "washing" | "prefilling" | "dehumidifying" | "spraying";
export type DoingStatusDatagram = {
type: "ing";
data: {
workStatus: WorkStatus;
};
};
export const workStatusDescMap: { [k in WorkStatus]: string } = {
idle: "空闲",
washing: "正在清洗",
prefilling: "正在预充",
dehumidifying: "正在除湿",
spraying: "正在喷涂",
};
export type StatusDatagram = {
type: "status"; // 状态
data: EquipmentStatusType;
@ -70,22 +86,22 @@ export const defaultStatus: EquipmentStatusType = {
//X轴电机状态
xAxisPosition: 0, //电机位置
xAxisSpeed: 0, //电机速度
xAxisMovementEnded: false,
xAxisAtOrigin: false,
xAxisMovementEnded: true,
xAxisAtOrigin: true,
xAxisLimited: false,
//Y轴电机状态
yAxisPosition: 0,
yAxisSpeed: 0,
yAxisMovementEnded: false,
yAxisAtOrigin: false,
yAxisMovementEnded: true,
yAxisAtOrigin: true,
yAxisLimited: false,
//Z轴电机状态
zAxisPosition: 0,
zAxisSpeed: 0,
zAxisMovementEnded: false,
zAxisAtOrigin: false,
zAxisMovementEnded: true,
zAxisAtOrigin: true,
zAxisLimited: false,
//三通阀状态
@ -102,4 +118,4 @@ export const defaultStatus: EquipmentStatusType = {
syringePumpNormal: false,
};
export type Datagram = CmdDatagram | WarnDatagram | StatusDatagram;
export type Datagram = CmdDatagram | WarnDatagram | StatusDatagram | DoingStatusDatagram;

9
src/stores/equipmentStatus.ts

@ -1,7 +1,7 @@
import { defineStore } from "pinia";
import { ref } from "vue";
import * as R from "ramda";
import { defaultStatus, type EquipmentStatusType } from "@/services/wsTypes";
import { defaultStatus, type EquipmentStatusType, type WorkStatus } from "@/services/wsTypes";
export const useEquipmentStatusStore = defineStore("equipmentStatus", () => {
const equipmentStatus = ref<EquipmentStatusType>(defaultStatus);
@ -11,8 +11,15 @@ export const useEquipmentStatusStore = defineStore("equipmentStatus", () => {
}
};
const workStatus = ref<WorkStatus>("idle");
const setWorkStatus = (s: WorkStatus) => {
workStatus.value = s;
};
return {
equipmentStatus,
setEquipmentStatus,
workStatus,
setWorkStatus
};
});

8
src/style.css

@ -20,6 +20,10 @@
border-radius: 4px;
color: white;
}
.btn-dark:disabled {
background: #ccc;
}
.btn-light {
display: flex;
justify-content: center;
@ -29,6 +33,10 @@
border-radius: 4px;
color: var(--primaryColor);
}
.btn-light:disabled {
background: #ccc;
color: #fff;
}
.main-page {
/* height: calc(100vh - var(--headerHeight));
background: linear-gradient(180deg, #dfe8f7 0%, #ffffff 100%); */

54
src/views/HomeView.vue

@ -32,6 +32,30 @@
<img src="@/assets/entry/entry_icon_5.svg" alt="icon" class="w-[80px] absolute right-4 top-4" />
</div>
</div>
<van-overlay v-if="showWashDialog" :show="true">
<div class="flex justify-center items-center h-full">
<div class="min-w-[480px] max-w-[540px] text-primary bg-white rounded-lg">
<h1 class="my-8 text-lg font-medium text-center px-8">提示</h1>
<div class="text-lg px-4 text-center">
{{ statusStore.workStatus === "washing" ? "设备正在清洗中,是否停止清洗" : "请选择清洗类型:" }}
</div>
<footer v-if="statusStore.workStatus === 'washing'" class="flex justify-center items-center gap-6 py-10">
<button class="btn-dark px-8 py-2 text-lg min-w-[120px]" @click="onStopWash">停止清洗</button>
<button class="btn-light px-8 py-2 text-lg min-w-[120px]" @click="showWashDialog = false">取消</button>
</footer>
<footer v-else class="flex flex-col justify-center items-center gap-6 py-10">
<button class="btn-dark px-8 py-2 text-lg min-w-[120px]" @click="onStartWash('injector')">
清洗注射器管路
</button>
<button class="btn-dark px-8 py-2 text-lg min-w-[120px]" @click="onStartWash('nozzle')">
清洗喷涂部分
</button>
<button class="btn-light px-8 py-2 text-lg min-w-[120px]" @click="showWashDialog = false">取消</button>
</footer>
</div>
</div>
</van-overlay>
<van-overlay v-if="showDialog" :show="true">
<div class="flex justify-center items-center h-full">
<Dialog
@ -49,24 +73,26 @@
<script setup lang="ts">
import type { DialogParam } from "@/components/Dialog.vue";
import { startWash } from "@/services/globalCmd/globalCmd";
import { startWash, stopWash, type WashType } from "@/services/globalCmd/globalCmd";
import { ElMessage } from "element-plus";
import { ref } from "vue";
import { useRouter } from "vue-router";
import Dialog from "@/components/Dialog.vue";
import { useEquipmentStatusStore } from "@/stores/equipmentStatus";
const router = useRouter();
const statusStore = useEquipmentStatusStore();
const dialogContent = ref<DialogParam>({
title: "提示",
desc: "确定清洗管道?",
type: "confirm",
okText: "清洗",
cancelText: "关闭",
_brand: "wash",
});
const showDialog = ref(false);
const showWashDialog = ref(false);
const router = useRouter();
function onEnvironmentEntryClick() {
router.push("/environment");
}
@ -86,11 +112,27 @@ function onPrintEntryClick() {
router.push("/print");
}
function onWashEntryClick() {
showDialog.value = true;
if (statusStore.workStatus === "idle" || statusStore.workStatus === "washing") {
showWashDialog.value = true;
} else {
ElMessage.warning("设备正在工作中,请稍候清洗");
}
}
function onOk() {
showDialog.value = false;
startWash({}).then(res => {
}
function onStartWash(type: WashType) {
showWashDialog.value = false;
startWash({ type }).then(res => {
if (res.success) {
} else {
ElMessage.error(res.msg);
}
});
}
function onStopWash() {
showWashDialog.value = false;
stopWash({}).then(res => {
if (res.success) {
} else {
ElMessage.error(res.msg);

104
src/views/PreSpray.vue

@ -4,7 +4,24 @@
<main class="mt-[43px] border border-[#D6D6D6] bg-white rounded-b-md rounded-tr-md px-6 py-6">
<div class="flex items-center gap-6">
<p class="text-lg">清洗管道</p>
<button class="btn-dark px-8 py-2 text-lg" @click="onStartWash">开始清洗</button>
<button
:disabled="statusStore.workStatus !== 'idle'"
class="btn-dark px-8 py-2 text-lg"
@click="onStartWash('injector')">
清洗注射器管路
</button>
<button
:disabled="statusStore.workStatus !== 'idle'"
class="btn-dark px-8 py-2 text-lg"
@click="onStartWash('nozzle')">
清洗喷涂部分
</button>
<button
:disabled="statusStore.workStatus !== 'washing'"
class="btn-dark px-8 py-2 text-lg"
@click="onStopWash">
停止清洗
</button>
</div>
</main>
<header
@ -18,7 +35,18 @@
<main class="mt-[43px] border border-[#D6D6D6] bg-white rounded-b-md rounded-tr-md px-6 py-6">
<div class="flex items-center gap-6">
<p class="text-lg">预充管道</p>
<button class="btn-dark px-8 py-2 text-lg" @click="onStartPrefill">开始预充</button>
<button
:disabled="statusStore.workStatus !== 'idle'"
class="btn-dark px-8 py-2 text-lg"
@click="onStartPrefill">
开始预充
</button>
<button
:disabled="statusStore.workStatus !== 'prefilling'"
class="btn-dark px-8 py-2 text-lg"
@click="onStopPrefill">
结束预充
</button>
</div>
</main>
<header
@ -31,7 +59,9 @@
<section class="flex flex-col relative text-primary mb-4">
<main class="mt-[43px] border border-[#D6D6D6] bg-white rounded-b-md rounded-tr-md px-6 py-6">
<div class="flex items-center">
<p class="text-lg">当前湿度 <span class="text-[28px] font-semibold">50</span> %RH</p>
<p class="text-lg">
当前湿度 <span class="text-[28px] font-semibold">{{ statusStore.equipmentStatus.humidity }}</span> %RH
</p>
<p class="text-lg mx-6">
要求湿度<input
type="number"
@ -39,7 +69,12 @@
class="border-none outline-none h-[32px] w-[60px] mx-2 bg-[#E8ECF7] text-primary font-medium rounded-md text-lg text-center" />%RH
</p>
<button class="btn-dark px-8 py-2 text-lg" @click="onStartDehumidify">开始除湿</button>
<button
:disabled="statusStore.workStatus !== 'idle'"
class="btn-dark px-8 py-2 text-lg"
@click="onStartDehumidify">
开始除湿
</button>
</div>
</main>
<header
@ -107,16 +142,13 @@ import { ref } from "vue";
import Dialog, { type DialogParam } from "@/components/Dialog.vue";
import { useRouter } from "vue-router";
import { ElMessage } from "element-plus";
import { startDehumidify, startPrefill, startWash } from "@/services/globalCmd/globalCmd";
import { startDehumidify, startPrefill, startWash, stopPrefill, stopWash, type WashType } from "@/services/globalCmd/globalCmd";
import { useEquipmentStatusStore } from "@/stores/equipmentStatus";
const router = useRouter();
const statusStore = useEquipmentStatusStore();
const dialogContent = ref<DialogParam>({
title: "已完成",
desc: "湿度已达到50%RH,氮气已置换完毕。",
type: "confirm",
okText: "去喷涂",
cancelText: "关闭",
_brand: "humidity_complete",
desc: "描述",
});
const showDialog = ref(false);
@ -127,42 +159,46 @@ function onStartDehumidify() {
ElMessage.error("请输入要求湿度");
return;
}
startDehumidify({ humidity: humidity.value }).then(res => {
if (res.success) {
} else {
ElMessage.error(res.msg);
}
});
dialogContent.value = {
title: "已完成",
desc: "湿度已达到50%RH,氮气已置换完毕。",
desc: "请确认已关闭载物台门和注射器门",
type: "confirm",
okText: "去喷涂",
cancelText: "关闭",
_brand: "humidity_complete",
_brand: "start_dehumidify",
};
showDialog.value = true;
}
function onOk() {
showDialog.value = false;
if (dialogContent.value._brand === "start_dehumidify") {
startDehumidify({ humidity: humidity.value! }).then(res => {
if (res.success) {
} else {
ElMessage.error(res.msg);
}
});
} else {
router.push("/spray");
}
}
function onGoSpray() {
dialogContent.value = {
title: "提示",
desc: "请确认 清洗、预充、除湿均已完成",
desc: "请确认 清洗、预充、除湿均已完成,\n且外部氮气压力大于0.35MPa",
type: "confirm",
okText: "确认",
cancelText: "取消",
_brand: "goSpray",
};
showDialog.value = true;
}
function onStartWash() {
startWash({}).then(res => {
function onStartWash(type: WashType) {
startWash({ type }).then(res => {
if (res.success) {
} else {
ElMessage.error(res.msg);
}
});
}
function onStopWash() {
stopWash({}).then(res => {
if (res.success) {
} else {
ElMessage.error(res.msg);
@ -178,5 +214,13 @@ function onStartPrefill() {
}
});
}
function onStopPrefill() {
stopPrefill({}).then(res => {
if (res.success) {
} else {
ElMessage.error(res.msg);
}
});
}
</script>
<style lang="scss" scoped></style>

14
src/views/SprayView.vue

@ -2,8 +2,15 @@
<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 class="btn-dark px-8 py-2 text-lg" @click="onStartSpray">开始喷涂</button>
<button class="btn-light px-8 py-2 text-lg" @click="onStopSpray">停止喷涂</button>
<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>
@ -119,6 +126,7 @@ 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,
@ -137,7 +145,7 @@ const defaultCraft: Partial<CraftItem> = {
};
const settingStore = useSettingStore();
const statusStore = useEquipmentStatusStore();
const selectMatrixId = ref<number>(settingStore.matrixList.length > 0 ? settingStore.matrixList[0].id : 0);
const craftList = ref<CraftItem[]>([]);

Loading…
Cancel
Save