yudao-dev/src/views/extend/processFlowView/components/BomSelector.vue

265 lines
6.3 KiB
Vue
Raw Normal View History

2023-11-17 16:48:00 +08:00
<!--
filename: BomSelector.vue
author: liubin
date: 2023-11-17 16:23:28
description:
-->
<template>
<div class="bom-selector">
<el-row>
<el-col :span="8">
<el-input
v-model="searchText"
placeholder="搜索"
2023-11-20 15:51:47 +08:00
clearable
2023-11-17 16:48:00 +08:00
style="margin-bottom: 12px; user-select: none">
<i slot="prefix" class="el-input__icon el-icon-search"></i>
</el-input>
</el-col>
</el-row>
2023-11-20 11:26:27 +08:00
<el-row style="border: 1px solid #ccc; display: flex">
2023-11-17 16:48:00 +08:00
<el-col :span="8">
<div class="select-list">
<div class="sl__header" style="background: #f3f4fb; padding: 12px">
<span style="">可分配设备</span>
2023-11-20 15:51:47 +08:00
<span>
{{ selectedEquipments.length }}/{{ filteredBomList.length }}
</span>
2023-11-17 16:48:00 +08:00
</div>
2023-11-20 15:51:47 +08:00
<div class="sl__body">
2023-11-21 11:48:17 +08:00
<div
class="sl__body-item"
2023-11-20 15:51:47 +08:00
v-for="eq in filteredBomList"
2023-11-21 11:48:17 +08:00
:key="eq.id + refreshKey">
<el-checkbox
:key="refreshKey"
:checked="selectedEquipments.includes(eq.id)"
@change="(e) => handleEquipmentChange(eq, e)"
class=""></el-checkbox>
<span
:key="'label' + refreshKey"
@click.stop="() => handleLoadDom(eq)">
{{ eq.name }}
</span>
</div>
2023-11-20 15:51:47 +08:00
</div>
2023-11-17 16:48:00 +08:00
</div>
</el-col>
2023-11-20 11:26:27 +08:00
<el-col :span="8" style="border-left: 1px solid #ccc">
2023-11-17 16:48:00 +08:00
<div class="select-list">
<div class="sl__header" style="background: #f3f4fb; padding: 12px">
<span style="">物料BOM</span>
</div>
2023-11-20 14:21:14 +08:00
<BomSelection
2023-11-20 15:51:47 +08:00
ref="materialsBomList"
2023-11-21 11:48:17 +08:00
:key="materialsBomList.equipmentId + 'materialsBomList'"
2023-11-20 14:21:14 +08:00
:list="materialsBomList"
:equipment-id="materialsBomList.equipmentId"
2023-11-21 11:48:17 +08:00
:current-select="currentSelectedMaterialBomId"
2023-11-20 14:21:14 +08:00
@change="handleMaterialBomChange" />
2023-11-17 16:48:00 +08:00
</div>
</el-col>
<el-col :span="8" style="border-left: 1px solid #ccc">
<div class="select-list">
<div class="sl__header" style="background: #f3f4fb; padding: 12px">
<span style="">参数BOM</span>
</div>
2023-11-20 14:21:14 +08:00
<BomSelection
2023-11-20 15:51:47 +08:00
ref="valuesBomList"
2023-11-21 11:48:17 +08:00
:key="valuesBomList.equipmentId + 'valuesBomList'"
2023-11-20 14:21:14 +08:00
:list="valuesBomList"
:equipment-id="valuesBomList.equipmentId"
2023-11-21 11:48:17 +08:00
:current-select="currentSelectedValueBomId"
2023-11-20 14:21:14 +08:00
@change="handleValueBomChange" />
2023-11-17 16:48:00 +08:00
</div>
</el-col>
</el-row>
</div>
</template>
2023-11-17 17:07:52 +08:00
;
2023-11-17 16:48:00 +08:00
<script>
2023-11-20 14:21:14 +08:00
import BomSelection from './BomSelection.vue';
2023-11-17 16:48:00 +08:00
export default {
name: 'BomSelector',
2023-11-20 14:21:14 +08:00
components: { BomSelection },
2023-11-20 15:51:47 +08:00
model: {
prop: 'value',
event: 'update',
},
2023-11-20 11:26:27 +08:00
props: {
bomList: {
type: Array,
default: () => [],
},
2023-11-20 15:51:47 +08:00
value: {
type: Array,
default: () => [],
},
2023-11-20 11:26:27 +08:00
},
2023-11-17 16:48:00 +08:00
data() {
return {
searchText: '',
selectedEquipments: [],
2023-11-17 17:07:52 +08:00
selected: [],
2023-11-20 11:26:27 +08:00
materialsBomList: [],
valuesBomList: [],
2023-11-20 15:51:47 +08:00
refreshKey: Math.random(),
2023-11-21 11:48:17 +08:00
currentSelectedMaterialBomId: null,
currentSelectedValueBomId: null,
2023-11-17 16:48:00 +08:00
};
},
2023-11-20 15:51:47 +08:00
watch: {
value: {
handler(val) {
console.log('value', val);
if (val) {
this.selectedEquipments = val.map((item) => item.equipmentId);
this.selected = val;
}
},
deep: true,
immediate: true,
},
},
computed: {
filteredBomList() {
return this.bomList.filter((item) => {
return item.name.includes(this.searchText);
});
},
},
2023-11-17 17:07:52 +08:00
methods: {
2023-11-21 09:13:28 +08:00
commit() {
this.$emit('update', this.selected);
},
2023-11-21 11:48:17 +08:00
handleLoadDom(eq) {
// 只显示 dom 列表
this.currentEquipment = eq.id;
this.materialsBomList = eq.materialsBom;
this.valuesBomList = eq.valuesBom;
2023-11-21 14:10:47 +08:00
// 回复选中的bom信息
if (this.selectedEquipments.includes(eq.id)) {
const selectedItem = this.selected.find(
(item) => item.equipmentId == eq.id
);
this.currentSelectedMaterialBomId =
selectedItem.equMaterialBomId ?? null;
this.currentSelectedValueBomId = selectedItem.equValueBomId ?? null;
}
2023-11-21 11:48:17 +08:00
},
2023-11-20 11:26:27 +08:00
handleEquipmentChange(eq, selected) {
this.currentEquipment = eq.id;
2023-11-20 14:21:14 +08:00
this.materialsBomList = eq.materialsBom;
this.valuesBomList = eq.valuesBom;
2023-11-20 11:26:27 +08:00
if (selected) {
2023-11-20 15:51:47 +08:00
this.selectedEquipments.push(eq.id);
2023-11-17 17:07:52 +08:00
this.selected.push({
2023-11-20 11:26:27 +08:00
equipmentId: eq.id,
equValueBomId: null,
equMaterialBomId: null,
2023-11-17 17:07:52 +08:00
});
2023-11-21 09:13:28 +08:00
// this.$emit('update', this.selected);
2023-11-20 11:26:27 +08:00
} else {
// 清空选择状态
2023-11-20 15:51:47 +08:00
this.selectedEquipments = this.selectedEquipments.filter(
(id) => id !== eq.id
);
2023-11-21 14:10:47 +08:00
// this.$refs.materialsBomList.clearSelected();
// this.$refs.valuesBomList.clearSelected();
this.currentSelectedMaterialBomId = null;
this.currentSelectedValueBomId = null;
2023-11-20 11:26:27 +08:00
this.selected = this.selected.filter(
(item) => item.equipmentId !== eq.id
);
2023-11-21 09:13:28 +08:00
// this.$emit('update', this.selected);
2023-11-17 17:07:52 +08:00
}
},
2023-11-20 14:21:14 +08:00
handleMaterialBomChange(equipmentId, bomId, selected) {
2023-11-20 11:26:27 +08:00
const selectedItem = this.selected.find(
(item) => item.equipmentId == equipmentId
);
2023-11-20 15:51:47 +08:00
if (selected && !selectedItem) {
// 如果没找到这个
this.selectedEquipments.push(equipmentId);
this.selected.push({
equipmentId,
equValueBomId: null,
equMaterialBomId: bomId,
});
// 强制更新'设备'一栏
this.refreshKey = Math.random();
2023-11-21 09:13:28 +08:00
// this.$emit('update', this.selected);
2023-11-20 15:51:47 +08:00
return;
}
selectedItem && (selectedItem.equMaterialBomId = selected ? bomId : null);
2023-11-21 11:48:17 +08:00
this.currentSelectedMaterialBomId = selected ? bomId : null;
2023-11-21 09:13:28 +08:00
// this.$emit('update', this.selected);
2023-11-20 11:26:27 +08:00
},
2023-11-20 14:21:14 +08:00
handleValueBomChange(equipmentId, bomId, selected) {
2023-11-20 11:26:27 +08:00
const selectedItem = this.selected.find(
(item) => item.equipmentId == equipmentId
);
2023-11-20 15:51:47 +08:00
if (selected && !selectedItem) {
// 如果没找到这个
this.selectedEquipments.push(equipmentId);
this.selected.push({
equipmentId,
equValueBomId: bomId,
equMaterialBomId: null,
});
this.refreshKey = Math.random();
2023-11-21 09:13:28 +08:00
// this.$emit('update', this.selected);
2023-11-20 15:51:47 +08:00
return;
}
selectedItem && (selectedItem.equValueBomId = selected ? bomId : null);
2023-11-21 11:48:17 +08:00
this.currentSelectedValueBomId = selected ? bomId : null;
2023-11-21 09:13:28 +08:00
// this.$emit('update', this.selected);
2023-11-20 11:26:27 +08:00
},
2023-11-17 17:07:52 +08:00
},
2023-11-17 16:48:00 +08:00
};
</script>
<style scoped lang="scss">
.bom-selector {
min-height: 200px;
}
.sl__body {
display: flex;
flex-direction: column;
gap: 6px;
padding: 6px;
2023-11-21 14:10:47 +08:00
}
2023-11-17 17:07:52 +08:00
2023-11-21 14:10:47 +08:00
.sl__body-item {
margin: 0;
padding: 3px 6px;
border-radius: 4px;
cursor: pointer;
transition: background 0.3s ease-in-out;
display: flex;
align-items: center;
gap: 8px;
2023-11-17 16:48:00 +08:00
2023-11-21 14:10:47 +08:00
> span {
flex: 1;
2023-11-17 16:48:00 +08:00
}
2023-11-21 14:10:47 +08:00
&:hover {
background: #0001;
}
}
2023-11-17 16:48:00 +08:00
.sl__header {
2023-11-17 17:07:52 +08:00
border-bottom: 1px solid #ccc;
2023-11-17 16:48:00 +08:00
}
</style>