You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

545 lines
17 KiB

<script>
import {
queryQuoteDetailBomTree,
queryQuoteDetailBomTreeLevel,
queryQuoteDetailBomTreeAlternative
} from "@/api/quote/quoteDetailBomTree";
import {queryQuoteDetailBom} from "@/api/quote/quoteDetailBom";
import {changeQuoteDetailBomTree} from "../../../../../api/quote/quoteDetailBomTree";
export default {
name: "quoteDetailBom",
props: {
quoteDetail: {
type: Object,
required: true
},
},
model: {
prop: "quoteDetail",
event: "update"
},
data() {
return {
isAllBom: false,
dataList: [],
treeData: [],
columns: [
{
userId: this.$store.state.user.name,
functionId: 5011,
serialNumber: '5011Table4LineSequence',
tableId: "5011Table4",
tableName: "报价材料信息",
columnProp: 'lineSequence',
headerAlign: "center",
align: "center",
columnLabel: '序号',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 50,
}, {
userId: this.$store.state.user.name,
functionId: 5011,
serialNumber: '5011Table4PartNo',
tableId: "5011Table4",
tableName: "报价材料信息",
columnProp: 'partNo',
headerAlign: "center",
align: "left",
columnLabel: '产品编码',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 120,
}, {
userId: this.$store.state.user.name,
functionId: 5011,
serialNumber: '5011Table4ComponentPart',
tableId: "5011Table4",
tableName: "报价材料信息",
columnProp: 'componentPart',
headerAlign: "center",
align: "left",
columnLabel: '零部件编码',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 120,
}, {
userId: this.$store.state.user.name,
functionId: 5011,
serialNumber: '5011Table4PartDesc',
tableId: "5011Table4",
tableName: "报价材料信息",
columnProp: 'partDesc',
headerAlign: "center",
align: "left",
columnLabel: '物料名称',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 160,
}, {
userId: this.$store.state.user.name,
functionId: 5011,
serialNumber: '5011Table4QtyPerAssembly',
tableId: "5011Table4",
tableName: "报价材料信息",
columnProp: 'qtyPerAssembly',
headerAlign: "center",
align: "right",
columnLabel: '单位用量',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 90,
}, {
userId: this.$store.state.user.name,
functionId: 5011,
serialNumber: '5011Table4ComponentScrap',
tableId: "5011Table4",
tableName: "报价材料信息",
columnProp: 'componentScrap',
headerAlign: "center",
align: "right",
columnLabel: '调机用量',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 90,
}, {
userId: this.$store.state.user.name,
functionId: 5011,
serialNumber: '5011Table4ShrinkageFactor',
tableId: "5011Table4",
tableName: "报价材料信息",
columnProp: 'shrinkageFactor',
headerAlign: "center",
align: "right",
columnLabel: '损耗率%',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 90,
}, {
userId: this.$store.state.user.name,
functionId: 5011,
serialNumber: '5011Table4PrintUnitName',
tableId: "5011Table4",
tableName: "报价材料信息",
columnProp: 'printUnit',
headerAlign: "center",
align: "center",
columnLabel: '单位',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 90,
},
{
userId: this.$store.state.user.name,
functionId: 5011,
serialNumber: '5011Table4UnitPrice',
tableId: "5011Table4",
tableName: "报价材料信息",
columnProp: 'unitPrice',
headerAlign: "center",
align: "right",
columnLabel: '单位标准成本',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 90,
},
{
userId: this.$store.state.user.name,
functionId: 5011,
serialNumber: '5011Table4ActualPrice',
tableId: "5011Table4",
tableName: "报价材料信息",
columnProp: 'actualPrice',
headerAlign: "center",
align: "right",
columnLabel: '单位报价成本',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 90,
},
{
userId: this.$store.state.user.name,
functionId: 5011,
serialNumber: '5011Table4QuoteUnitPrice',
tableId: "5011Table4",
tableName: "报价材料信息",
columnProp: 'quoteUnitPrice',
headerAlign: "center",
align: "right",
columnLabel: '材料标准总成本',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: 'right',
columnWidth: 100,
},
{
userId: this.$store.state.user.name,
functionId: 5011,
serialNumber: '5011Table4ActualQuotePrice',
tableId: "5011Table4",
tableName: "报价材料信息",
columnProp: 'actualQuotePrice',
headerAlign: "center",
align: "right",
columnLabel: '材料报价总成本',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: 'right',
columnWidth: 100,
},
],
props: {
children: 'list',
label: (data, node) => {
return `${data.partNo}-${data.engChgLevel}-${data.alternativeNo}-${data.bomType}`;
},
},
queryLoading: false,
queryTreeLoading: false,
versionVisible: false,
versionList: [],
alternativeList: [],
bomEngChgLevel: {
partNo: '',
bomType: '',
buNo: '',
site: '',
engChgLevel: null,
}
}
},
methods: {
handleQueryQuoteDetailBomTree() {
let params = {
id: this.quoteDetail.id,
}
this.queryTreeLoading = true;
queryQuoteDetailBomTree(params).then(({data}) => {
if (data && data.code === 0) {
this.treeData = data.rows;
if (this.treeData.length > 0) {
this.$nextTick(() => {
this.$refs.tree.setCurrentKey(this.treeData[0].id);
this.handleQueryQuoteDetailBom();
})
}
this.queryTreeLoading = false;
} else {
this.$message.warning(data.msg);
this.queryTreeLoading = false;
}
}).catch((error) => {
this.$message.error(error);
})
},
nodeClick(data) {
this.handleQueryQuoteDetailBom();
},
handleQueryQuoteDetailBom() {
let params = {
quoteDetailId: this.quoteDetail.id,
treeId: this.$refs.tree.getCurrentKey(),
allTree: this.isAllBom,
}
this.queryLoading = true;
queryQuoteDetailBom(params).then(({data}) => {
if (data && data.code === 0) {
this.dataList = data.rows;
} else {
this.$message.warning(data.msg);
}
this.queryLoading = false;
}).catch((error) => {
this.$message.error(error);
this.queryLoading = false;
})
},
handleCheckedVersion() {
this.handleQueryQuoteDetailBomTreeVersion();
let node = this.$refs.tree.getCurrentNode();
if (node) {
this.bomEngChgLevel = {
partNo: node.partNo,
bomType: node.bomType,
buNo: node.buNo,
site: node.site,
engChgLevel: node.engChgLevel,
alternativeNo: node.alternativeNo,
}
}
this.versionVisible = true
},
handleQueryQuoteDetailBomTreeVersion() {
let node = this.$refs.tree.getCurrentNode();
let params = {
site: this.quoteDetail.site,
partNo: this.quoteDetail.partNo,
buNo: this.quoteDetail.buNo,
}
if (node) {
params = {
site: node.site,
partNo: node.partNo,
bomType: node.bomType,
buNo: node.buNo,
}
}
queryQuoteDetailBomTreeLevel(params).then(({data}) => {
if (data && data.code === 0) {
this.versionList = data.rows;
} else {
this.$message.warning(data.msg);
}
}).catch((error) => {
this.$message.error(error);
})
},
levelRowStyle({row}) {
if (row.engChgLevel === this.bomEngChgLevel.engChgLevel) {
return {'background-color': '#E8F7F6'};
}
},
alternativeRowStyle({row}) {
let node = this.$refs.tree.getCurrentNode();
if (row.engChgLevel === this.bomEngChgLevel.engChgLevel && row.alternativeNo === this.bomEngChgLevel.alternativeNo) {
return {'background-color': '#E8F7F6'};
}
},
levelRowClick(row) {
this.bomEngChgLevel.partNo = row.partNo;
this.bomEngChgLevel.buNo = row.buNo;
this.bomEngChgLevel.site = row.site;
this.bomEngChgLevel.engChgLevel = row.engChgLevel;
this.bomEngChgLevel.bomType = row.bomType;
let params = {
...this.bomEngChgLevel
}
queryQuoteDetailBomTreeAlternative(params).then(({data}) => {
if (data && data.code === 0) {
this.alternativeList = data.rows;
} else {
this.$message.warning(data.msg);
}
}).catch((error) => {
this.$message.error(error);
})
},
handleChangeVersion(row) {
let node = this.$refs.tree.getCurrentNode();
let params = {
partNo: row.partNo,
bomType: row.bomType,
buNo: row.buNo,
site: row.site,
engChgLevel: row.engChgLevel,
alternativeNo: row.alternativeNo,
createBy: this.$store.state.user.name,
quoteId: this.quoteDetail.quoteId,
quoteDetailId: this.quoteDetail.id,
quoteNo: this.quoteDetail.quoteNo,
quoteDetailItemNo: this.quoteDetail.itemNo,
versionNo:this.quoteDetail.versionNo,
}
if (node) {
params.id = node.id
params.partNo = node.partNo
params.bomType = node.bomType
params.buNo = node.buNo
params.site = node.site
}
changeQuoteDetailBomTree(params).then(({data}) => {
if (data && data.code === 0) {
this.$message.success(data.msg);
this.versionVisible = false;
this.handleQueryQuoteDetailBomTree();
} else {
this.$message.warning(data.msg);
}
}).catch((error) => {
this.$message.error(error);
})
},
handleJumpToBom(row){
if (this.$router.resolve('part-bomManagement').resolved.name === '404') {
this.$alert('权限不足,访问失败', '警告', {confirmButtonText: '确定',});
} else {
this.$emit('close')
let params = {
name: "part-bomManagement",
params: {
type:'quote',
partNo:row.partNo,
bomType:row.bomType,
engChgLevel:row.engChgLevel,
alternativeNo:row.alternativeNo,
}
}
this.$router.push(params)
}
}
},
created() {
if (this.quoteDetail && this.quoteDetail.id) {
this.handleQueryQuoteDetailBomTree();
}
},
watch: {
'quoteDetail.id'(newVal, oldVal) {
this.handleQueryQuoteDetailBomTree();
},
isAllBom(newVal, oldVal) {
this.handleQueryQuoteDetailBom();
},
'bomEngChgLevel.engChgLevel'(newVal, oldVal) {
if (newVal) {
let node = this.$refs.tree.getCurrentNode();
let row = {
partNo: this.quoteDetail.partNo,
buNo: this.quoteDetail.buNo,
site: this.quoteDetail.site,
engChgLevel: newVal,
}
if (node) {
row.partNo = node.partNo;
row.bomType = node.bomType;
row.buNo = node.buNo;
row.site = node.site;
}
this.levelRowClick(row)
}
}
}
}
</script>
<template>
<div>
<div style="margin-bottom: 10px">
<el-link style="margin-right: 20px;cursor: pointer" @click="handleCheckedVersion" v-if="quoteDetail.status === '草稿'">切换版本</el-link>
<el-checkbox v-model="isAllBom">全级BOM结构</el-checkbox>
</div>
<el-container>
<el-aside width="300px" v-loading="queryTreeLoading">
<el-tree
:data="treeData"
:props="props"
:default-expand-all="true"
:expand-on-click-node="false"
node-key="id"
highlight-current
@node-click="nodeClick" ref="tree">
</el-tree>
</el-aside>
<el-main style="padding: 0">
<el-table :data="dataList" v-loading="queryLoading" border style="width: 100%" :height="420">
<el-table-column
v-for="(item,index) in columns" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed===''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<template v-if="item.columnProp === 'partNo'">
<el-link @click="handleJumpToBom(scope.row)">{{ scope.row[item.columnProp] }}</el-link>
</template>
<template v-else>
<span v-if="!item.columnHidden">{{ scope.row[item.columnProp] }}</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</template>
</template>
</el-table-column>
</el-table>
</el-main>
</el-container>
<el-dialog title="BOM版本切换" :visible.sync="versionVisible" append-to-body :close-on-click-modal="false" v-drag
width="900px">
<el-table :data="versionList" :row-style="levelRowStyle" @row-click="levelRowClick" ref="versionTable"
style="width: 100%" border :height="240">
<el-table-column label="物料编码" prop="partNo" header-align="center" align="center" show-overflow-tooltip
min-width="140"/>
<el-table-column label="物料描述" prop="partDesc" header-align="center" align="left" show-overflow-tooltip
min-width="200"/>
<el-table-column label="版本" prop="engChgLevel" header-align="center" align="center" show-overflow-tooltip
min-width="60"/>
<el-table-column label="类型" prop="bomType" header-align="center" align="center" show-overflow-tooltip
min-width="100"/>
</el-table>
<el-table :data="alternativeList" :row-style="alternativeRowStyle" ref="versionTable"
style="width: 100%;margin-top: 20px" border :height="240">
<el-table-column label="物料编码" prop="partNo" header-align="center" align="center" show-overflow-tooltip
min-width="140"/>
<el-table-column label="物料描述" prop="partDesc" header-align="center" align="left" show-overflow-tooltip
min-width="200"/>
<el-table-column label="版本" prop="engChgLevel" header-align="center" align="center" show-overflow-tooltip
min-width="60"/>
<el-table-column label="替代编码" prop="alternativeNo" header-align="center" align="left" show-overflow-tooltip
min-width="60"/>
<el-table-column label="类型" prop="bomType" header-align="center" align="center" show-overflow-tooltip
min-width="100"/>
<el-table-column label="操作" header-align="center" align="center" min-width="100">
<template slot-scope="scope">
<a @click="handleChangeVersion(scope.row)">选择</a>
</template>
</el-table-column>
</el-table>
</el-dialog>
</div>
</template>
<style scoped>
</style>