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

155 lines
3.4 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="搜索"
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 11:26:27 +08:00
<span>{{ selectedEquipments.length }}/{{ bomList.length }}</span>
2023-11-17 16:48:00 +08:00
</div>
<el-checkbox-group v-model="selectedEquipments" class="sl__body">
<el-checkbox
2023-11-20 11:26:27 +08:00
v-for="eq in bomList"
:key="eq.id"
2023-11-20 14:21:14 +08:00
:label="eq.name"
2023-11-20 11:26:27 +08:00
@change="(e) => handleEquipmentChange(eq, e)"
2023-11-17 16:48:00 +08:00
class="sl__body-item"></el-checkbox>
</el-checkbox-group>
</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
key="materialsBomList"
:list="materialsBomList"
:equipment-id="materialsBomList.equipmentId"
@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
key="valuesBomList"
:list="valuesBomList"
:equipment-id="valuesBomList.equipmentId"
@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 11:26:27 +08:00
props: {
bomList: {
type: Array,
default: () => [],
},
},
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-17 16:48:00 +08:00
};
},
2023-11-17 17:07:52 +08:00
methods: {
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-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-20 11:26:27 +08:00
} else {
// 清空选择状态
this.selected = this.selected.filter(
(item) => item.equipmentId !== eq.id
);
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 14:21:14 +08:00
selectedItem.equMaterialBomId = selected ? bomId : null;
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 14:21:14 +08:00
selectedItem.equValueBomId = selected ? bomId : null;
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;
}
.select-list {
}
.sl__body {
display: flex;
flex-direction: column;
gap: 6px;
padding: 6px;
2023-11-17 17:07:52 +08:00
2023-11-17 16:48:00 +08:00
> .el-checkbox {
2023-11-17 17:07:52 +08:00
margin: 0;
padding: 3px 6px;
2023-11-17 16:48:00 +08:00
border-radius: 4px;
2023-11-17 17:07:52 +08:00
transition: background 0.3s ease-in-out;
2023-11-17 16:48:00 +08:00
&:hover {
background: #0001;
}
}
}
.sl__header {
2023-11-17 17:07:52 +08:00
border-bottom: 1px solid #ccc;
2023-11-17 16:48:00 +08:00
}
</style>