8 changed files with 1017 additions and 11 deletions
-
2package.json
-
14src/api/quote/quoteGroupDetail.js
-
2src/main.js
-
4src/views/modules/project/projectPart/projectPartQuote.vue
-
4src/views/modules/quotation/inquiry/inquiryQuoteDetail.vue
-
60src/views/modules/quote/detail/quoteDetail.vue
-
933src/views/modules/quote/detail/quoteGroupDetail.vue
-
7src/views/modules/quote/index.vue
@ -0,0 +1,14 @@ |
|||
import {createAPI} from "../../utils/httpRequest"; |
|||
|
|||
|
|||
export const queryQuoteGroupDetail = (data) => createAPI('/quote/group/detail','post',data) |
|||
|
|||
export const queryQuoteGroupDetailByInquiry = (data) => createAPI('/quote/group/detail/inquiry','post',data) |
|||
|
|||
export const saveQuoteGroupDetail = (data) => createAPI('/quote/group/detail/save','post',data) |
|||
|
|||
export const removeQuoteGroupDetail = (data) => createAPI(`/quote/group/detail/remove/${data.id}`,'post',data) |
|||
|
|||
export const updateCurrentQuoteGroupDetailItemNo = (data) => createAPI('/quote/group/detail/current','post',data) |
|||
|
|||
|
|||
@ -0,0 +1,933 @@ |
|||
<script> |
|||
import { |
|||
updateQuoteDetail |
|||
} from "../../../../api/quote/quoteDetail"; |
|||
import {getProjectPartList} from "../../../../api/project/project"; |
|||
import QuoteDetailCost from "./primary/quoteDetailCost.vue"; |
|||
import QuoteDetailTool from "./primary/quoteDetailTool.vue"; |
|||
import QuoteDetailBom from "./primary/quoteDetailBom.vue"; |
|||
import QuoteDetailRouting from "./primary/quoteDetailRouting.vue"; |
|||
import QuoteDetailOtherCost from "./primary/quoteDetailOtherCost.vue"; |
|||
import DictDataSelect from "../../sys/dict-data-select.vue"; |
|||
import QuoteDetailTest from "./primary/quoteDetailTest.vue"; |
|||
import QuoteDetailOther from "./primary/quoteDetailOther.vue"; |
|||
import { |
|||
queryQuoteGroupDetail, |
|||
removeQuoteGroupDetail, |
|||
saveQuoteGroupDetail, updateCurrentQuoteGroupDetailItemNo |
|||
} from "../../../../api/quote/quoteGroupDetail"; |
|||
import QuoteDetail from "./quoteDetail.vue"; |
|||
|
|||
export default { |
|||
name: "quoteGroupDetail", |
|||
components: { |
|||
QuoteDetail, |
|||
QuoteDetailOther, |
|||
QuoteDetailTest, |
|||
DictDataSelect, |
|||
QuoteDetailOtherCost, |
|||
QuoteDetailRouting, |
|||
QuoteDetailBom, |
|||
QuoteDetailTool, |
|||
QuoteDetailCost, |
|||
}, |
|||
props:{ |
|||
quote:{ |
|||
type:Object, |
|||
required:true |
|||
}, |
|||
height:{ |
|||
type:[Number,String], |
|||
default:300 |
|||
}, |
|||
authFlag:{ |
|||
type:Boolean, |
|||
default:false |
|||
} |
|||
}, |
|||
data(){ |
|||
return{ |
|||
quoteDetail:{ |
|||
id:null, |
|||
partNo:'', |
|||
partDesc:'', |
|||
projectNo:'', |
|||
projectDesc:'', |
|||
buNo: '*', |
|||
qty:null, |
|||
quoteCount:1, |
|||
partCost:0, |
|||
adjustPartCost:0, |
|||
labourCost:0, |
|||
adjustLabourCost:0, |
|||
fabricateCost:0, |
|||
adjustFabricateCost:0, |
|||
toolCost:0, |
|||
adjustToolCost:0, |
|||
machineCost:0, |
|||
adjustMachineCost:0, |
|||
otherCost:0, |
|||
manageCost:0, |
|||
totalCost:0, |
|||
profitRate:0, |
|||
profitAmount:0, |
|||
totalPrice:0, |
|||
unitPrice:0, |
|||
taxRate:13, |
|||
taxTotalPrice:0, |
|||
taxUnitPrice:0, |
|||
quoteTotalCost:0, |
|||
quoteProfitRate:0, |
|||
quoteProfitAmount:0, |
|||
quoteTotalPrice:0, |
|||
quoteUnitPrice:0, |
|||
quoteTaxRate:0, |
|||
quoteTaxTotalPrice:0, |
|||
quoteTaxUnitPrice:0, |
|||
currency1:undefined, |
|||
currency2:undefined, |
|||
exchangeRate1:undefined, |
|||
exchangeRate2:undefined, |
|||
currencyTotalCost1:0, |
|||
currencyTotalCost2:0, |
|||
quoteCurrencyTotalCost1:0, |
|||
quoteCurrencyTotalCost2:0, |
|||
// moq:'Standard 250K', |
|||
moq:'', |
|||
calculatedItems:'工具,测试,其他,包装&运输', |
|||
testCost:0, |
|||
adjustTestCost:0, |
|||
elseCost:0, |
|||
adjustElseCost:0, |
|||
remark:'', |
|||
}, |
|||
saveQuoteDetail:{ |
|||
|
|||
}, |
|||
dataList:[], |
|||
saveLoading:false, |
|||
queryLoading:false, |
|||
saveVisible:false, |
|||
saveQuoteDetailRules:{ |
|||
partNo: [{required: true, message: '请输入物料编码', trigger: ['blur','change']}], |
|||
partDesc: [{required: true, message: '请输入物料名称', trigger: ['blur','change']}], |
|||
qty: [{required: true, message: '请输入数量', trigger: ['blur','change']}], |
|||
currency1: [{required: true, message: '请选择币种', trigger: ['blur','change']}], |
|||
}, |
|||
columns: [ |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table2PartNo', |
|||
tableId: '5011Table2', |
|||
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: '5011Table2PartDesc', |
|||
tableId: '5011Table2', |
|||
tableName: '报价详情信息表', |
|||
columnProp: 'partDesc', |
|||
headerAlign: 'center', |
|||
align: 'left', |
|||
columnLabel: '物料名称', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 240 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table2Qty', |
|||
tableId: '5011Table2', |
|||
tableName: '报价详情信息表', |
|||
columnProp: 'qty', |
|||
headerAlign: 'center', |
|||
align: 'right', |
|||
columnLabel: 'MOQ', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 100 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table2AdjustPartCost', |
|||
tableId: '5011Table2', |
|||
tableName: '报价详情信息表', |
|||
columnProp: 'adjustPartCost', |
|||
headerAlign: 'center', |
|||
align: 'right', |
|||
columnLabel: '材料成本', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 130 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table2AdjustLabourCost', |
|||
tableId: '5011Table2', |
|||
tableName: '报价详情信息表', |
|||
columnProp: 'adjustLabourCost', |
|||
headerAlign: 'center', |
|||
align: 'right', |
|||
columnLabel: '人工成本', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 120 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table2AdjustMachineCost', |
|||
tableId: '5011Table2', |
|||
tableName: '报价详情信息表', |
|||
columnProp: 'adjustMachineCost', |
|||
headerAlign: 'center', |
|||
align: 'right', |
|||
columnLabel: '机器成本', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 120 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table2AdjustToolCost', |
|||
tableId: '5011Table2', |
|||
tableName: '报价详情信息表', |
|||
columnProp: 'adjustToolCost', |
|||
headerAlign: 'center', |
|||
align: 'right', |
|||
columnLabel: '工具成本', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 120 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table2AdjustTestCost', |
|||
tableId: '5011Table2', |
|||
tableName: '报价详情信息表', |
|||
columnProp: 'adjustTestCost', |
|||
headerAlign: 'center', |
|||
align: 'right', |
|||
columnLabel: '测试成本', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 120 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table2AdjustElseCost', |
|||
tableId: '5011Table2', |
|||
tableName: '报价详情信息表', |
|||
columnProp: 'adjustElseCost', |
|||
headerAlign: 'center', |
|||
align: 'right', |
|||
columnLabel: '其他成本', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 120 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table2TotalCost', |
|||
tableId: '5011Table2', |
|||
tableName: '报价详情信息表', |
|||
columnProp: 'totalCost', |
|||
headerAlign: 'center', |
|||
align: 'right', |
|||
columnLabel: '总成本', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 140 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table2Remark', |
|||
tableId: '5011Table2', |
|||
tableName: '报价详情信息表', |
|||
columnProp: 'remark', |
|||
headerAlign: 'center', |
|||
align: 'left', |
|||
columnLabel: '备注', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 120 |
|||
}, |
|||
], |
|||
partVisible:false, |
|||
activeName:'bom', |
|||
|
|||
projectPart:{ |
|||
|
|||
}, |
|||
projectPartList:[], |
|||
pageNo:1, |
|||
pageSize:20, |
|||
pageTotal:0, |
|||
partQueryLoading:false, |
|||
|
|||
projectPartColumns:[ |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table3TestPartNo', |
|||
tableId: '5011Table3', |
|||
tableName: '项目物料表', |
|||
columnProp: 'testPartNo', |
|||
headerAlign: 'center', |
|||
align: 'left', |
|||
columnLabel: '物料编码', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 150 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table3PartDesc', |
|||
tableId: '5011Table3', |
|||
tableName: '项目物料表', |
|||
columnProp: 'partDesc', |
|||
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: '5011Table3FinalPartNo', |
|||
tableId: '5011Table3', |
|||
tableName: '项目物料表', |
|||
columnProp: 'finalPartNo', |
|||
headerAlign: 'center', |
|||
align: 'left', |
|||
columnLabel: 'IFS物料编码', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 150 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table3CustomerPartNo', |
|||
tableId: '5011Table3', |
|||
tableName: '项目物料表', |
|||
columnProp: 'customerPartNo', |
|||
headerAlign: 'center', |
|||
align: 'left', |
|||
columnLabel: '客户物料编码', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 150 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table3Type', |
|||
tableId: '5011Table3', |
|||
tableName: '项目物料表', |
|||
columnProp: 'type', |
|||
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: '5011Table3UmId', |
|||
tableId: '5011Table3', |
|||
tableName: '项目物料表', |
|||
columnProp: 'umId', |
|||
headerAlign: 'center', |
|||
align: 'left', |
|||
columnLabel: '单位', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 100 |
|||
}, |
|||
], |
|||
|
|||
drawerVisible: false, |
|||
quoteGroupDetail:{ |
|||
id:-1, |
|||
}, |
|||
} |
|||
}, |
|||
methods:{ |
|||
handleSaveQuoteDetail(row){ |
|||
this.$nextTick(()=>{ |
|||
if (this.$refs.handleSaveQuoteDetailClick){ |
|||
this.$refs.saveQuoteDetailForm.clearValidate(); |
|||
} |
|||
}) |
|||
if (row){ |
|||
this.saveQuoteDetail = { |
|||
...row |
|||
} |
|||
}else { |
|||
this.saveQuoteDetail = { |
|||
...this.quoteDetail, |
|||
createBy:this.$store.state.user.name, |
|||
status:'草稿', |
|||
active:'Y', |
|||
qty:1, |
|||
isDetail:false, |
|||
} |
|||
this.$nextTick(()=>{ |
|||
this.saveQuoteDetail.projectNo = this.quote.projectNo |
|||
}) |
|||
} |
|||
this.activeName = 'bom'; |
|||
this.saveVisible = true; |
|||
}, |
|||
handleDeleteQuoteDetail(row){ |
|||
this.$alert('确认删除该条报价明细吗?', '提示', { |
|||
confirmButtonText: '确定', |
|||
cancelButtonText: '取消', |
|||
type: 'warning' |
|||
}).then(() => { |
|||
let params = { |
|||
id: row.id, |
|||
} |
|||
removeQuoteGroupDetail(params).then(({data}) => { |
|||
if (data && data.code === 0) { |
|||
this.$message.success(data.msg); |
|||
this.handleQueryQuoteDetail(); |
|||
} else { |
|||
this.$message.warning(data.msg); |
|||
} |
|||
}).catch((error) => { |
|||
this.$message.error(error); |
|||
}) |
|||
}).catch(() => { |
|||
}) |
|||
}, |
|||
handlePartNoBlur(){ |
|||
let params = { |
|||
site:this.$store.state.user.site, |
|||
testPartNo:this.saveQuoteDetail.partNo, |
|||
projectId: this.quote.projectNo, |
|||
no:1, |
|||
size:20, |
|||
} |
|||
getProjectPartList(params).then(({data})=>{ |
|||
if (data && data.code === 0){ |
|||
if (data.rows && data.rows.length === 1){ |
|||
this.dblClickProjectPartTable(data.rows[0]) |
|||
}else { |
|||
this.saveQuoteDetail.partDesc = '' |
|||
} |
|||
} |
|||
}) |
|||
}, |
|||
handleQueryQuoteDetail(val){ |
|||
let params = { |
|||
quoteId: this.quote.id, |
|||
} |
|||
if (!val){ |
|||
this.queryLoading = true; |
|||
} |
|||
queryQuoteGroupDetail(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; |
|||
}) |
|||
}, |
|||
handleSaveQuoteDetailClick(){ |
|||
this.$refs.saveQuoteDetailForm.validate((valid,obj) => { |
|||
if (valid){ |
|||
if (this.saveQuoteDetail.id){ |
|||
this.handleUpdate(); |
|||
}else { |
|||
this.handleSave(); |
|||
} |
|||
}else { |
|||
let i = 1; |
|||
for (let key in obj) { |
|||
this.$message.error(obj[key][0].message); |
|||
if (i === 1){ |
|||
return |
|||
} |
|||
i++; |
|||
} |
|||
} |
|||
}) |
|||
}, |
|||
handleSave(){ |
|||
let params = { |
|||
...this.saveQuoteDetail, |
|||
quoteId: this.quote.id, |
|||
quoteNo:this.quote.quoteNo, |
|||
site:this.quote.site, |
|||
buNo:this.quote.buNo, |
|||
versionNo:this.quote.versionNo, |
|||
createBy:this.saveQuoteDetail.createBy, |
|||
active:'Y', |
|||
status:'草稿', |
|||
internalInquiryNo:this.quote.insideInquiryNo, |
|||
} |
|||
this.saveLoading = true; |
|||
saveQuoteGroupDetail(params).then(({data})=>{ |
|||
if (data && data.code === 0){ |
|||
this.$message.success(data.msg); |
|||
this.handleQueryQuoteDetail(); |
|||
if (this.saveQuoteDetail.isDetail){ |
|||
this.saveQuoteDetail = { |
|||
...data.row, |
|||
} |
|||
}else { |
|||
this.saveVisible = false; |
|||
} |
|||
}else { |
|||
this.$message.warning(data.msg); |
|||
} |
|||
this.saveLoading = false |
|||
}).catch((error)=>{ |
|||
this.$message.error(error); |
|||
this.saveLoading = false |
|||
}) |
|||
}, |
|||
handleUpdate(){ |
|||
let params = { |
|||
...this.saveQuoteDetail, |
|||
updateBy:this.$store.state.user.name, |
|||
} |
|||
updateQuoteDetail(params).then(({data})=>{ |
|||
if (data && data.code === 0){ |
|||
this.$message.success(data.msg); |
|||
this.handleQueryQuoteDetail(); |
|||
this.saveVisible = false; |
|||
}else { |
|||
this.$message.warning(data.msg); |
|||
} |
|||
}).catch((error)=>{ |
|||
this.$message.error(error); |
|||
}) |
|||
}, |
|||
handleClickTab(tab){ |
|||
if (this.activeName === 'routing'){ |
|||
this.$refs.routing.handleQueryQuoteDetailBomTree() |
|||
}else if (this.activeName === 'tool'){ |
|||
this.$refs.tool.handleQueryQuoteDetailTool(); |
|||
} |
|||
}, |
|||
handleQueryPartList(){ |
|||
this.projectPart = { |
|||
testPartNo:this.saveQuoteDetail.partNo, |
|||
partDesc:'', |
|||
finalPartNo:'', |
|||
customerPartNo:'', |
|||
site:this.$store.state.user.site, |
|||
} |
|||
this.partVisible = true; |
|||
this.getProjectPartList(); |
|||
}, |
|||
getProjectPartList(){ |
|||
let params = { |
|||
...this.projectPart, |
|||
no:this.pageNo, |
|||
size:this.pageSize, |
|||
} |
|||
params.projectId = this.quote.projectNo |
|||
this.partQueryLoading = true; |
|||
getProjectPartList(params).then(({data})=>{ |
|||
if (data && data.code === 0){ |
|||
this.projectPartList = data.rows; |
|||
this.pageTotal = data.total; |
|||
} |
|||
this.partQueryLoading = false; |
|||
}).catch((error)=>{ |
|||
this.partQueryLoading = false; |
|||
}) |
|||
}, |
|||
handleSizeChange(val){ |
|||
this.pageSize = val; |
|||
this.getProjectPartList(); |
|||
}, |
|||
handleCurrentChange(val){ |
|||
this.pageNo = val; |
|||
this.getProjectPartList(); |
|||
}, |
|||
dblClickProjectPartTable(row){ |
|||
this.saveQuoteDetail.partNo = row.testPartNo; |
|||
this.saveQuoteDetail.partDesc = row.partDesc; |
|||
this.partVisible = false; |
|||
}, |
|||
handleQueryQuoteDetailByDetailId(row){ |
|||
this.quoteGroupDetail = { |
|||
...row |
|||
} |
|||
this.drawerVisible = true; |
|||
}, |
|||
rowStyle({row}){ |
|||
if (row.id === this.quoteGroupDetail.id){ |
|||
return {background:'#E8F7F6'} |
|||
} |
|||
}, |
|||
quoteGroupDetailRowClick(row){ |
|||
this.quoteGroupDetail = { |
|||
...row |
|||
} |
|||
}, |
|||
handleCurrentQuoteDetailItemNo(val){ |
|||
updateCurrentQuoteGroupDetailItemNo(this.quoteGroupDetail).then(({data})=>{ |
|||
if (data && data.code === 0){ |
|||
// this.$message.success(data.msg); |
|||
this.handleQueryQuoteDetail(true); |
|||
}else { |
|||
this.$message.warning(data.msg); |
|||
this.quoteGroupDetail.currentQuoteDetailItemNo = val; |
|||
} |
|||
}).catch((error)=>{ |
|||
this.$message.error(error); |
|||
this.quoteGroupDetail.currentQuoteDetailItemNo = val; |
|||
}) |
|||
}, |
|||
}, |
|||
watch:{ |
|||
quote(newVal,oldVal){ |
|||
if (newVal.id){ |
|||
this.quoteDetail.profitRate = this.quote.markup |
|||
this.quoteDetail.quoteProfitRate = this.quote.markup |
|||
this.handleQueryQuoteDetail(); |
|||
}else { |
|||
this.dataList = []; |
|||
} |
|||
}, |
|||
partVisible(newVal,oldVal){ |
|||
if (newVal === false){ |
|||
this.partQueryLoading = false |
|||
this.pageNo = 1; |
|||
this.projectPartList = []; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<template> |
|||
<div> |
|||
<el-button type="primary" v-if="!authFlag" :disabled="quote.status === '下达' || !quote.status" @click="handleSaveQuoteDetail(null)">新增</el-button> |
|||
<el-table v-loading="queryLoading" border :data="dataList" style="width: 100%;margin-top: 5px" :height="height"> |
|||
<el-table-column type="index" width="55" align="center" label="序号"></el-table-column> |
|||
<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"> |
|||
<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> |
|||
</el-table-column> |
|||
<el-table-column label="操作" v-if="!authFlag" fixed="right" align="center" width="120"> |
|||
<template slot-scope="{row,$index}"> |
|||
<a type="text" v-if="row.status === '草稿'" @click="handleDeleteQuoteDetail(row)">删除</a> |
|||
<a @click="handleQueryQuoteDetailByDetailId(row)">条目明细</a> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
|
|||
<el-dialog :title="`报价明细`" top="10vh" v-drag :visible.sync="saveVisible" append-to-body :width="`${saveQuoteDetail.id?1200:600}px`" :close-on-click-modal="false"> |
|||
<el-form :model="saveQuoteDetail" ref="saveQuoteDetailForm" :rules="saveQuoteDetailRules" label-position="top" v-if="!saveQuoteDetail.id"> |
|||
<el-row :gutter="20"> |
|||
<el-col :span="8"> |
|||
<el-form-item label="物料编码" prop="partNo" :show-message="false"> |
|||
<span slot="label"> |
|||
<a @click="handleQueryPartList">物料编码</a> |
|||
</span> |
|||
<el-input v-model="saveQuoteDetail.partNo" @change="handlePartNoBlur"></el-input> |
|||
</el-form-item> |
|||
</el-col> |
|||
<el-col :span="16"> |
|||
<el-form-item label="物料描述" prop="partDesc" :show-message="false"> |
|||
<el-input v-model="saveQuoteDetail.partDesc" disabled></el-input> |
|||
</el-form-item> |
|||
</el-col> |
|||
<el-col :span="8"> |
|||
<el-form-item label="MOQ" prop="qty" :show-message="false"> |
|||
<el-input-number style="width: 100%;" v-model="saveQuoteDetail.qty" :min="1" :step="0" :precision="0" :controls="false"></el-input-number> |
|||
</el-form-item> |
|||
</el-col> |
|||
<el-col :span="8"> |
|||
<el-form-item label="币种" prop="currency1" :show-message="false"> |
|||
<dict-data-select style="width: 100%" v-if="saveVisible" dict-type="plm_customer_information_customer_customer_currency" v-model="saveQuoteDetail.currency1"></dict-data-select> |
|||
</el-form-item> |
|||
</el-col> |
|||
</el-row> |
|||
<el-row :gutter="20"> |
|||
<el-col :span="8"> |
|||
<el-form-item label="" :show-message="false"> |
|||
<el-checkbox v-model="saveQuoteDetail.isDetail">保存进入报价页面</el-checkbox> |
|||
</el-form-item> |
|||
</el-col> |
|||
<el-col :span="24"> |
|||
<el-form-item label="备注" class="auto" :show-message="false"> |
|||
<el-input type="textarea" v-model="saveQuoteDetail.remark" :autosize="{minRows: 3, maxRows: 3}"></el-input> |
|||
</el-form-item> |
|||
</el-col> |
|||
</el-row> |
|||
</el-form> |
|||
<el-form v-else :model="saveQuoteDetail" ref="saveQuoteDetailForm" :rules="saveQuoteDetailRules" label-position="top"> |
|||
<el-row :gutter="20"> |
|||
<el-col :span="4"> |
|||
<el-form-item label="物料名称" prop="partNo" :show-message="false"> |
|||
<el-input v-model="saveQuoteDetail.partNo" disabled></el-input> |
|||
</el-form-item> |
|||
</el-col> |
|||
<el-col :span="6"> |
|||
<el-form-item label="物料描述" prop="partDesc" :show-message="false"> |
|||
<el-input v-model="saveQuoteDetail.partDesc" disabled></el-input> |
|||
</el-form-item> |
|||
</el-col> |
|||
<el-col :span="3"> |
|||
<el-form-item label="MOQ" prop="qty" :show-message="false"> |
|||
<el-input-number v-model="saveQuoteDetail.qty" style="width: 100%;" :controls="false" :disabled="saveQuoteDetail.status === '下达'"></el-input-number> |
|||
</el-form-item> |
|||
</el-col> |
|||
<el-col :span="3"> |
|||
<el-form-item label="币种" prop="currency1" :show-message="false"> |
|||
<dict-data-select :disabled="saveQuoteDetail.status === '下达'" style="width: 100%" dict-type="plm_customer_information_customer_customer_currency" v-model="saveQuoteDetail.currency1"></dict-data-select> |
|||
</el-form-item> |
|||
</el-col> |
|||
</el-row> |
|||
<el-row :gutter="20"> |
|||
<el-col :span="16"> |
|||
<el-form-item label="备注" class="auto" :show-message="false"> |
|||
<el-input type="textarea" resize="none" :autosize="{minRows: 3, maxRows: 3}" v-model="saveQuoteDetail.remark" :disabled="saveQuoteDetail.status === '下达'"></el-input> |
|||
</el-form-item> |
|||
</el-col> |
|||
</el-row> |
|||
</el-form> |
|||
|
|||
<el-tabs v-model="activeName" v-if="saveQuoteDetail.id" @tab-click="handleClickTab"> |
|||
<el-tab-pane label="材料" name="bom"> |
|||
<quote-detail-bom v-if="saveVisible" @close="()=>{this.saveVisible = false}" v-model:quoteDetail="saveQuoteDetail"></quote-detail-bom> |
|||
</el-tab-pane> |
|||
<el-tab-pane label="工艺" name="routing"> |
|||
<quote-detail-routing ref="routing" v-if="saveVisible" @close="()=>{this.saveVisible = false}" v-model:quoteDetail="saveQuoteDetail"></quote-detail-routing> |
|||
</el-tab-pane> |
|||
<el-tab-pane label="工具" name="tool"> |
|||
<quote-detail-tool ref="tool" v-if="saveVisible" v-model:quoteDetail="saveQuoteDetail"></quote-detail-tool> |
|||
</el-tab-pane> |
|||
<el-tab-pane label="测试" name="test"> |
|||
<quote-detail-test v-if="saveVisible" v-model:quoteDetail="saveQuoteDetail"></quote-detail-test> |
|||
</el-tab-pane> |
|||
<el-tab-pane label="其他" name="other"> |
|||
<quote-detail-other v-if="saveVisible" v-model:quoteDetail="saveQuoteDetail"></quote-detail-other> |
|||
</el-tab-pane> |
|||
<el-tab-pane label="包装&运输" name="otherCost"> |
|||
<quote-detail-other-cost v-if="saveVisible" v-model:quoteDetail="saveQuoteDetail"></quote-detail-other-cost> |
|||
</el-tab-pane> |
|||
<el-tab-pane label="成本&价格" name="cost"> |
|||
<quote-detail-cost v-if="saveVisible" ref="cost" v-model:quoteDetail="saveQuoteDetail"></quote-detail-cost> |
|||
</el-tab-pane> |
|||
</el-tabs> |
|||
<div slot="footer" class="dialog-footer"> |
|||
<el-button type="primary" v-if="saveQuoteDetail.status === '草稿'" :loading="saveLoading" @click="handleSaveQuoteDetailClick">确 定</el-button> |
|||
<el-button @click="saveVisible = false">取 消</el-button> |
|||
</div> |
|||
</el-dialog> |
|||
|
|||
<el-dialog v-drag title="物料信息" append-to-body :close-on-click-modal="false" :visible.sync="partVisible"> |
|||
<!--搜索条件--> |
|||
<el-form :model="projectPart" ref="projectPartDataForm" :inline="true" label-position="top"> |
|||
<el-form-item label="物料编码" prop="testPartNo"> |
|||
<el-input v-model="projectPart.testPartNo" clearable/> |
|||
</el-form-item> |
|||
<el-form-item label="物料名称" prop="partDesc"> |
|||
<el-input v-model="projectPart.partDesc" clearable/> |
|||
</el-form-item> |
|||
<el-form-item label="IFS物料编码" prop="finalPartNo"> |
|||
<el-input v-model="projectPart.finalPartNo" clearable/> |
|||
</el-form-item> |
|||
<el-form-item label="客户物料编码" prop="customerPartNo"> |
|||
<el-input v-model="projectPart.customerPartNo" clearable/> |
|||
</el-form-item> |
|||
<el-form-item label=" "> |
|||
<el-button @click="getProjectPartList" type="primary">查 询</el-button> |
|||
</el-form-item> |
|||
</el-form> |
|||
<el-table height="300px" v-loading="partQueryLoading" stripe border @row-dblclick="dblClickProjectPartTable" :data="projectPartList" ref="projectPartDataTable" :style="{marginTop:'10px'}"> |
|||
<el-table-column |
|||
v-for="(item,index) in projectPartColumns" :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"> |
|||
<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> |
|||
</el-table-column> |
|||
</el-table> |
|||
<el-pagination style="margin-top: 0" |
|||
@size-change="handleSizeChange" |
|||
@current-change="handleCurrentChange" |
|||
:current-page="pageNo" |
|||
:page-sizes="[20, 50, 100, 200, 500]" |
|||
:page-size="pageSize" |
|||
:total="pageTotal" |
|||
layout="total,sizes, prev, pager, next, jumper"> |
|||
</el-pagination> |
|||
</el-dialog> |
|||
|
|||
|
|||
<el-dialog title="报价明细" :visible.sync="drawerVisible" top="10vh" width="1200px" append-to-body :close-on-click-modal="false"> |
|||
<el-table v-loading="queryLoading" |
|||
@row-click="quoteGroupDetailRowClick" :row-style="rowStyle" border :data="dataList" style="width: 100%;margin-top: 5px;" :height="'30vh'"> |
|||
<el-table-column type="index" width="55" align="center" label="序号"></el-table-column> |
|||
<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"> |
|||
<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> |
|||
</el-table-column> |
|||
</el-table> |
|||
<quote-detail |
|||
v-if="drawerVisible" |
|||
style="margin-top: 20px" |
|||
:quote="quote" |
|||
:quote-group-detail="quoteGroupDetail" |
|||
:auth-flag="false" |
|||
:height="'33vh'" |
|||
@currentQuoteDetailItemNo="handleCurrentQuoteDetailItemNo"> |
|||
|
|||
</quote-detail> |
|||
<div slot="footer" class="dialog-footer"> |
|||
<el-button @click="drawerVisible = false">取 消</el-button> |
|||
</div> |
|||
</el-dialog> |
|||
|
|||
<!-- <part-table v-if="saveVisible" v-model="partVisible" :is-page="true" :part-no="saveQuoteDetail.partNo" @dblclick="handleDblClick"></part-table>--> |
|||
<!-- <project-part-table v-if="saveVisible" v-model="partVisible" :project-no="saveQuoteDetail.projectNo" :part-no="saveQuoteDetail.partNo" @dblclick="handleDblClick"></project-part-table>--> |
|||
</div> |
|||
</template> |
|||
|
|||
<style scoped> |
|||
.el-table /deep/ .cell{ |
|||
height: auto; |
|||
line-height: 1.5; |
|||
} |
|||
|
|||
.auto /deep/ .el-form-item__content{ |
|||
height: auto; |
|||
line-height: 1.5; |
|||
} |
|||
</style> |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue