projects/mes-lb #97
							
								
								
									
										84
									
								
								src/views/extend/processFlowView/components/BomSelection.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								src/views/extend/processFlowView/components/BomSelection.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,84 @@
 | 
			
		||||
<!-- 
 | 
			
		||||
    filename: BomSelection.vue
 | 
			
		||||
    author: liubin
 | 
			
		||||
    date: 2023-11-20 13:23:36
 | 
			
		||||
    description: 
 | 
			
		||||
-->
 | 
			
		||||
 | 
			
		||||
<template>
 | 
			
		||||
	<div class="bom-selection">
 | 
			
		||||
		<el-checkbox
 | 
			
		||||
			v-for="item in list__inner"
 | 
			
		||||
			:key="item.id"
 | 
			
		||||
			:label="item.name"
 | 
			
		||||
			:disabled="item.disabled"
 | 
			
		||||
			@change="(e) => handleChange(item, e)"
 | 
			
		||||
			class="sl__body-item"></el-checkbox>
 | 
			
		||||
	</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
export default {
 | 
			
		||||
	name: 'BomSelection',
 | 
			
		||||
	components: {},
 | 
			
		||||
	props: {
 | 
			
		||||
		list: {
 | 
			
		||||
			type: Array,
 | 
			
		||||
			default: () => [],
 | 
			
		||||
		},
 | 
			
		||||
		equipmentId: {
 | 
			
		||||
			type: String,
 | 
			
		||||
			default: '',
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			list__inner: [],
 | 
			
		||||
			selected: '',
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
	watch: {
 | 
			
		||||
		list: {
 | 
			
		||||
			handler(val) {
 | 
			
		||||
				if (val) {
 | 
			
		||||
					this.list__inner = val.map((item) => ({ ...item, disabled: false }));
 | 
			
		||||
				}
 | 
			
		||||
			},
 | 
			
		||||
			deep: true,
 | 
			
		||||
			immediate: true,
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	methods: {
 | 
			
		||||
		handleChange(bomItem, selected) {
 | 
			
		||||
			this.list__inner = this.list__inner.map((item) => ({
 | 
			
		||||
				...item,
 | 
			
		||||
				disabled: selected ? item.id !== bomItem.id : false,
 | 
			
		||||
			}));
 | 
			
		||||
			this.$emit('change', this.equipmentId, bomItem.id, selected);
 | 
			
		||||
			this.$nextTick(() => {
 | 
			
		||||
				this.$forceUpdate();
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped lang="scss">
 | 
			
		||||
.bom-selection {
 | 
			
		||||
	display: flex;
 | 
			
		||||
	flex-direction: column;
 | 
			
		||||
	gap: 6px;
 | 
			
		||||
	padding: 6px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.sl__body-item {
 | 
			
		||||
	margin: 0;
 | 
			
		||||
	padding: 3px 6px;
 | 
			
		||||
	border-radius: 4px;
 | 
			
		||||
	transition: background 0.3s ease-in-out;
 | 
			
		||||
 | 
			
		||||
	&:hover {
 | 
			
		||||
		background: #0001;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
@@ -29,10 +29,7 @@
 | 
			
		||||
						<el-checkbox
 | 
			
		||||
							v-for="eq in bomList"
 | 
			
		||||
							:key="eq.id"
 | 
			
		||||
							:label="`${eq.name} (${
 | 
			
		||||
								selectedMBom[currentEquipment].length +
 | 
			
		||||
								selectedPBom[currentEquipment].length
 | 
			
		||||
							} / 2)`"
 | 
			
		||||
							:label="eq.name"
 | 
			
		||||
							@change="(e) => handleEquipmentChange(eq, e)"
 | 
			
		||||
							class="sl__body-item"></el-checkbox>
 | 
			
		||||
					</el-checkbox-group>
 | 
			
		||||
@@ -43,20 +40,12 @@
 | 
			
		||||
					<div class="sl__header" style="background: #f3f4fb; padding: 12px">
 | 
			
		||||
						<span style="">物料BOM</span>
 | 
			
		||||
					</div>
 | 
			
		||||
					<el-checkbox-group
 | 
			
		||||
						v-model="selectedMBom[currentEquipment]"
 | 
			
		||||
						class="sl__body">
 | 
			
		||||
						<el-checkbox
 | 
			
		||||
							v-for="mb in materialsBomList"
 | 
			
		||||
							:key="mb.id"
 | 
			
		||||
							:label="mb.name"
 | 
			
		||||
							:disabled="mb.disabled || false"
 | 
			
		||||
							@change="
 | 
			
		||||
								(e) =>
 | 
			
		||||
									handleMaterialBomChange(mb, materialsBomList.equipmentId, e)
 | 
			
		||||
							"
 | 
			
		||||
							class="sl__body-item"></el-checkbox>
 | 
			
		||||
					</el-checkbox-group>
 | 
			
		||||
 | 
			
		||||
					<BomSelection
 | 
			
		||||
						key="materialsBomList"
 | 
			
		||||
						:list="materialsBomList"
 | 
			
		||||
						:equipment-id="materialsBomList.equipmentId"
 | 
			
		||||
						@change="handleMaterialBomChange" />
 | 
			
		||||
				</div>
 | 
			
		||||
			</el-col>
 | 
			
		||||
			<el-col :span="8" style="border-left: 1px solid #ccc">
 | 
			
		||||
@@ -64,19 +53,12 @@
 | 
			
		||||
					<div class="sl__header" style="background: #f3f4fb; padding: 12px">
 | 
			
		||||
						<span style="">参数BOM</span>
 | 
			
		||||
					</div>
 | 
			
		||||
					<el-checkbox-group
 | 
			
		||||
						v-model="selectedPBom[currentEquipment]"
 | 
			
		||||
						class="sl__body">
 | 
			
		||||
						<el-checkbox
 | 
			
		||||
							v-for="vb in valuesBomList"
 | 
			
		||||
							:key="vb.id"
 | 
			
		||||
							:label="vb.name"
 | 
			
		||||
							:disabled="vb.disabled || false"
 | 
			
		||||
							@change="
 | 
			
		||||
								(e) => handleValueBomChange(vb, valuesBomList.equipmentId, e)
 | 
			
		||||
							"
 | 
			
		||||
							class="sl__body-item"></el-checkbox>
 | 
			
		||||
					</el-checkbox-group>
 | 
			
		||||
 | 
			
		||||
					<BomSelection
 | 
			
		||||
						key="valuesBomList"
 | 
			
		||||
						:list="valuesBomList"
 | 
			
		||||
						:equipment-id="valuesBomList.equipmentId"
 | 
			
		||||
						@change="handleValueBomChange" />
 | 
			
		||||
				</div>
 | 
			
		||||
			</el-col>
 | 
			
		||||
		</el-row>
 | 
			
		||||
@@ -84,9 +66,10 @@
 | 
			
		||||
</template>
 | 
			
		||||
;
 | 
			
		||||
<script>
 | 
			
		||||
import BomSelection from './BomSelection.vue';
 | 
			
		||||
export default {
 | 
			
		||||
	name: 'BomSelector',
 | 
			
		||||
	components: {},
 | 
			
		||||
	components: { BomSelection },
 | 
			
		||||
	props: {
 | 
			
		||||
		bomList: {
 | 
			
		||||
			type: Array,
 | 
			
		||||
@@ -97,56 +80,17 @@ export default {
 | 
			
		||||
		return {
 | 
			
		||||
			searchText: '',
 | 
			
		||||
			selectedEquipments: [],
 | 
			
		||||
			selectedMBom: { default: [] },
 | 
			
		||||
			selectedPBom: { default: [] },
 | 
			
		||||
			selected: [],
 | 
			
		||||
			materialsBomList: [],
 | 
			
		||||
			valuesBomList: [],
 | 
			
		||||
			currentEquipment: 'default',
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
	watch: {
 | 
			
		||||
		selected: {
 | 
			
		||||
			handler(val) {
 | 
			
		||||
				console.log(val);
 | 
			
		||||
			},
 | 
			
		||||
			deep: true,
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	computed: {},
 | 
			
		||||
	created() {},
 | 
			
		||||
	mounted() {
 | 
			
		||||
		// 准备v-model
 | 
			
		||||
		this.bomList.forEach((item) => {
 | 
			
		||||
			this.$set(this.selectedMBom, item.id, []);
 | 
			
		||||
			this.$set(this.selectedPBom, item.id, []);
 | 
			
		||||
		});
 | 
			
		||||
	},
 | 
			
		||||
	methods: {
 | 
			
		||||
		handleEquipmentChange(eq, selected) {
 | 
			
		||||
			this.currentEquipment = eq.id;
 | 
			
		||||
			this.materialsBomList =
 | 
			
		||||
				// [
 | 
			
		||||
				// 	{
 | 
			
		||||
				// 		id: 1,
 | 
			
		||||
				// 		name: 'mb-1',
 | 
			
		||||
				// 	},
 | 
			
		||||
				// 	{
 | 
			
		||||
				// 		id: 2,
 | 
			
		||||
				// 		name: 'mb-2',
 | 
			
		||||
				// 	},
 | 
			
		||||
				// 	{
 | 
			
		||||
				// 		id: 3,
 | 
			
		||||
				// 		name: 'mb-3',
 | 
			
		||||
				// 	},
 | 
			
		||||
				// ] ||
 | 
			
		||||
				eq.materialsBom || [];
 | 
			
		||||
			this.valuesBomList = eq.valuesBom || [];
 | 
			
		||||
			// 重新确保equipmentId已经被加载上去了
 | 
			
		||||
			this.materialsBomList.equipmentId = eq.id;
 | 
			
		||||
			this.valuesBomList.equipmentId = eq.id;
 | 
			
		||||
			this.materialsBomList = eq.materialsBom;
 | 
			
		||||
			this.valuesBomList = eq.valuesBom;
 | 
			
		||||
 | 
			
		||||
			console.log('eq', selected, eq, this.selectedEquipments);
 | 
			
		||||
			if (selected) {
 | 
			
		||||
				this.selected.push({
 | 
			
		||||
					equipmentId: eq.id,
 | 
			
		||||
@@ -158,28 +102,21 @@ export default {
 | 
			
		||||
				this.selected = this.selected.filter(
 | 
			
		||||
					(item) => item.equipmentId !== eq.id
 | 
			
		||||
				);
 | 
			
		||||
				this.selectedMBom[eq.id] = [];
 | 
			
		||||
				this.selectedPBom[eq.id] = [];
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		handleValueBomChange(vb, equipmentId, selected) {
 | 
			
		||||
 | 
			
		||||
		handleMaterialBomChange(equipmentId, bomId, selected) {
 | 
			
		||||
			const selectedItem = this.selected.find(
 | 
			
		||||
				(item) => item.equipmentId == equipmentId
 | 
			
		||||
			);
 | 
			
		||||
			selectedItem.equValueBomId = selected ? vb.id : null;
 | 
			
		||||
			this.valuesBomList.forEach((item) => {
 | 
			
		||||
				item.disabled = selected ? item.id !== vb.id : false;
 | 
			
		||||
			});
 | 
			
		||||
			selectedItem.equMaterialBomId = selected ? bomId : null;
 | 
			
		||||
		},
 | 
			
		||||
		handleMaterialBomChange(mb, equipmentId, selected) {
 | 
			
		||||
			debugger;
 | 
			
		||||
 | 
			
		||||
		handleValueBomChange(equipmentId, bomId, selected) {
 | 
			
		||||
			const selectedItem = this.selected.find(
 | 
			
		||||
				(item) => item.equipmentId == equipmentId
 | 
			
		||||
			);
 | 
			
		||||
			selectedItem.equMaterialBomId = selected ? mb.id : null;
 | 
			
		||||
			this.materialsBomList.forEach((item) => {
 | 
			
		||||
				item.disabled = selected ? item.id !== mb.id : false;
 | 
			
		||||
			});
 | 
			
		||||
			selectedItem.equValueBomId = selected ? bomId : null;
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -218,9 +218,11 @@ export default {
 | 
			
		||||
				'post'
 | 
			
		||||
			).then(({ code, data }) => {
 | 
			
		||||
				if (code == 0) {
 | 
			
		||||
					this.bomList = data.map(eq => {
 | 
			
		||||
						if (eq.materialsBom) eq.materialsBom.equipmentId = eq.id 
 | 
			
		||||
						if (eq.valuesBom) eq.valuesBom.equipmentId = eq.id
 | 
			
		||||
					this.bomList = data.map((eq) => {
 | 
			
		||||
						eq.materialsBom = eq.materialsBom || [];
 | 
			
		||||
						eq.valuesBom = eq.valuesBom || [];
 | 
			
		||||
						eq.materialsBom.equipmentId = eq.id;
 | 
			
		||||
						eq.valuesBom.equipmentId = eq.id;
 | 
			
		||||
						return eq;
 | 
			
		||||
					});
 | 
			
		||||
				} else {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user