266 lines
6.0 KiB
Vue
266 lines
6.0 KiB
Vue
<template>
|
|
<ProductCraft :data="defaultCraftData" @change="handleCraftChange" />
|
|
</template>
|
|
|
|
<script setup>
|
|
import { ref } from "vue";
|
|
import ProductCraft from "@/components/ProductCraft";
|
|
|
|
const defaultCraftData = ref([
|
|
{
|
|
title: "裁切工艺",
|
|
options: [
|
|
{
|
|
value: "模切",
|
|
label: "模切",
|
|
checked: true,
|
|
disabled: false,
|
|
},
|
|
{
|
|
value: "裁切",
|
|
label: "裁切",
|
|
checked: false,
|
|
disabled: false,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
title: "覆膜工艺",
|
|
options: [
|
|
{
|
|
value: "覆哑膜",
|
|
label: "覆哑膜",
|
|
checked: false,
|
|
disabled: false,
|
|
},
|
|
{
|
|
value: "覆亮膜",
|
|
label: "覆亮膜",
|
|
checked: true,
|
|
disabled: false,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
title: "刮刮膜",
|
|
options: [
|
|
{
|
|
value: "配刮刮膜",
|
|
label: "配刮刮膜",
|
|
checked: false,
|
|
disabled: false,
|
|
children: [
|
|
{
|
|
type: "select",
|
|
value: "",
|
|
id: "size",
|
|
options: [
|
|
{ value: "16*18", label: "16*18mm" },
|
|
{ value: "20*30", label: "20*30mm" },
|
|
],
|
|
},
|
|
],
|
|
},
|
|
{
|
|
value: "粘刮刮膜",
|
|
label: "粘刮刮膜",
|
|
checked: false,
|
|
disabled: false,
|
|
children: [
|
|
{
|
|
type: "select",
|
|
value: "",
|
|
id: "size",
|
|
options: [{ value: "16*18", label: "16*18mm" }],
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
{
|
|
title: "排废工艺",
|
|
options: [
|
|
{
|
|
value: "半排废",
|
|
label: "半排废",
|
|
checked: false,
|
|
disabled: false,
|
|
},
|
|
{
|
|
value: "全排废",
|
|
label: "全排废",
|
|
checked: false,
|
|
disabled: false,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
title: "烫金工艺",
|
|
options: [
|
|
{
|
|
value: "纯烫金",
|
|
label: "纯烫金",
|
|
checked: false,
|
|
disabled: false,
|
|
},
|
|
{
|
|
value: "汤镭射银",
|
|
label: "汤镭射银",
|
|
checked: false,
|
|
disabled: false,
|
|
},
|
|
{
|
|
value: "彩色印刷+烫金/银",
|
|
label: "彩色印刷+烫金/银",
|
|
checked: false,
|
|
disabled: false,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
title: "特殊工艺",
|
|
options: [
|
|
{
|
|
value: "内部模切",
|
|
label: "内部模切",
|
|
checked: false,
|
|
disabled: false,
|
|
children: [
|
|
{
|
|
type: "input",
|
|
value: "",
|
|
id: "count",
|
|
placeholder: "个数",
|
|
},
|
|
{
|
|
type: "input",
|
|
value: "",
|
|
id: "width",
|
|
placeholder: "宽度",
|
|
},
|
|
{
|
|
type: "input",
|
|
value: "",
|
|
id: "length",
|
|
placeholder: "长度",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
value: "划线",
|
|
label: "划线",
|
|
checked: false,
|
|
disabled: false,
|
|
},
|
|
],
|
|
},
|
|
]);
|
|
|
|
const emits = defineEmits(["update:modelValue"]);
|
|
|
|
const handleCraftChange = (info) => {
|
|
const { optionValue, itemIndex, data } = info;
|
|
const currentItem = data[itemIndex];
|
|
|
|
// 1. 处理当前工艺的单选:选中匹配的选项,取消同组其他选项
|
|
currentItem.options.forEach((opt) => {
|
|
if (opt.value === optionValue) {
|
|
} else {
|
|
if (itemIndex != 5) {
|
|
opt.checked = false;
|
|
}
|
|
}
|
|
});
|
|
|
|
// 2. 互斥逻辑:排废工艺 与 烫金工艺 不能同时存在被选中的选项
|
|
const wasteCraft = data.find((item) => item.title === "排废工艺");
|
|
const foilCraft = data.find((item) => item.title === "烫金工艺");
|
|
|
|
if (wasteCraft && foilCraft) {
|
|
const wasteHasChecked = wasteCraft.options.some((opt) => opt.checked);
|
|
const foilHasChecked = foilCraft.options.some((opt) => opt.checked);
|
|
|
|
if (wasteHasChecked) {
|
|
// 排废工艺有选中 → 禁用烫金工艺所有选项,并清空其选中状态
|
|
foilCraft.options.forEach((opt) => {
|
|
opt.disabled = true;
|
|
opt.checked = false;
|
|
});
|
|
} else if (foilHasChecked) {
|
|
// 烫金工艺有选中 → 禁⽤排废工艺所有选项,并清空其选中状态
|
|
wasteCraft.options.forEach((opt) => {
|
|
opt.disabled = true;
|
|
opt.checked = false;
|
|
});
|
|
} else {
|
|
// 两者都未选中 → 同时启用两个工艺的所有选项(不清空,原本就无选中)
|
|
wasteCraft.options.forEach((opt) => (opt.disabled = false));
|
|
foilCraft.options.forEach((opt) => (opt.disabled = false));
|
|
}
|
|
}
|
|
|
|
// 3. 更新响应式数据
|
|
defaultCraftData.value = data;
|
|
handleDataInfo();
|
|
};
|
|
|
|
//处理工艺数据
|
|
const handleDataInfo = () => {
|
|
let datainfo = [];
|
|
defaultCraftData.value.forEach((craft) => {
|
|
const selectedOption = craft.options.filter((opt) => {
|
|
return opt.checked;
|
|
});
|
|
if (selectedOption && selectedOption.length > 0) {
|
|
selectedOption.forEach((opt) => {
|
|
let item = {};
|
|
if (opt.checked) {
|
|
item.type = opt.label;
|
|
item.value = opt.value;
|
|
if (opt.children) {
|
|
let childItem = {};
|
|
item.children = [];
|
|
opt.children.forEach((child) => {
|
|
if (child.id && child.value) {
|
|
childItem[child.id] = child.value;
|
|
} else {
|
|
childItem.value = child.value;
|
|
}
|
|
});
|
|
item.children.push(childItem);
|
|
}
|
|
}
|
|
datainfo.push(item);
|
|
});
|
|
}
|
|
});
|
|
|
|
emits("update:modelValue", datainfo);
|
|
};
|
|
|
|
const verifyCraftData = () => {
|
|
// 验证工艺数据的完整性和正确性
|
|
|
|
return { valid: false, message: "工艺数据验证失败" };
|
|
};
|
|
handleDataInfo();
|
|
|
|
defineExpose({
|
|
verifyCraftData,
|
|
});
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.line-container {
|
|
display: flex;
|
|
align-items: center;
|
|
margin-bottom: 10px;
|
|
}
|
|
.form-title {
|
|
display: block;
|
|
font-weight: bold;
|
|
font-size: 16px;
|
|
margin-right: 20px;
|
|
}
|
|
</style>
|