7 changed files with 954 additions and 20 deletions
-
12src/api/quote/quoteGroupDetail.js
-
1src/main.js
-
4src/views/modules/quote/detail/primary/quoteDetailRouting.vue
-
122src/views/modules/quote/detail/quoteDetail.vue
-
803src/views/modules/quote/detail/quoteGroupDetail.vue
-
15src/views/modules/quote/index.vue
-
17src/views/modules/quote/primary/quoteTable.vue
@ -0,0 +1,12 @@ |
|||
import {createAPI} from "../../utils/httpRequest"; |
|||
|
|||
|
|||
export const queryQuoteGroupDetail = (data) => createAPI('/quote/group/detail','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,803 @@ |
|||
<script> |
|||
import ProjectPartTable from "../../../../components/selector/table/projectPartTable.vue"; |
|||
import { |
|||
updateQuoteDetail |
|||
} from "../../../../api/quote/quoteDetail"; |
|||
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 QuoteDetailOther from "./primary/quoteDetailOther.vue"; |
|||
import PartTable from "../../../../components/selector/table/partTable.vue"; |
|||
import {handleQueryPart} from "../../../../api/part/partInformation"; |
|||
import { |
|||
queryQuoteGroupDetail, |
|||
removeQuoteGroupDetail, |
|||
saveQuoteGroupDetail, updateCurrentQuoteGroupDetailItemNo |
|||
} from "../../../../api/quote/quoteGroupDetail"; |
|||
import QuoteDetail from "./quoteDetail.vue"; |
|||
|
|||
export default { |
|||
name: "quoteGroupDetail", |
|||
components: { |
|||
QuoteDetail, |
|||
PartTable, |
|||
QuoteDetailOther, QuoteDetailRouting, QuoteDetailBom, QuoteDetailTool, QuoteDetailCost, ProjectPartTable}, |
|||
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:'', |
|||
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', |
|||
type:'Standard TP', |
|||
costModel:'UFIDA', |
|||
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']}], |
|||
type: [{required: true, message: '请选择TP类型', trigger: ['blur','change']}], |
|||
costModel: [{required: true, message: '请选择Cost Model', 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: 320 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table2Qty', |
|||
tableId: '5011Table2', |
|||
tableName: '报价详情信息表', |
|||
columnProp: 'qty', |
|||
headerAlign: 'center', |
|||
align: 'right', |
|||
columnLabel: '报价数量', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 100 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table2AdjustBomUnYield', |
|||
tableId: '5011Table2', |
|||
tableName: '报价详情信息表', |
|||
columnProp: 'adjustBomUnYield', |
|||
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: 'DL', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 120 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table2AdjustFabricateCost', |
|||
tableId: '5011Table2', |
|||
tableName: '报价详情信息表', |
|||
columnProp: 'adjustFabricateCost', |
|||
headerAlign: 'center', |
|||
align: 'right', |
|||
columnLabel: 'VOH', |
|||
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: 'FOH', |
|||
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: 'Total Cost(RMB.KCT)', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 140 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table2QuoteProfitRate', |
|||
tableId: '5011Table2', |
|||
tableName: '报价详情信息表', |
|||
columnProp: 'quoteProfitRate', |
|||
headerAlign: 'center', |
|||
align: 'right', |
|||
columnLabel: 'markup(%)', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 140 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table2Weighted', |
|||
tableId: '5011Table2', |
|||
tableName: '报价详情信息表', |
|||
columnProp: 'weighted', |
|||
headerAlign: 'center', |
|||
align: 'right', |
|||
columnLabel: 'Weighted TP for MOQ>250K(USD/KCT)', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 260 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table2Weighted2', |
|||
tableId: '5011Table2', |
|||
tableName: '报价详情信息表', |
|||
columnProp: 'weighted2', |
|||
headerAlign: 'center', |
|||
align: 'right', |
|||
columnLabel: 'Weighted TP for MOQ>5M(USD/KCT)', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 260 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table2Weighted', |
|||
tableId: '5011Table2', |
|||
tableName: '报价详情信息表', |
|||
columnProp: 'weighted', |
|||
headerAlign: 'center', |
|||
align: 'right', |
|||
columnLabel: 'Standard TP for MOQ>250K(USD/KCT)', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 260 |
|||
}, |
|||
{ |
|||
userId: this.$store.state.user.name, |
|||
functionId: 5011, |
|||
serialNumber: '5011Table2Weighted2', |
|||
tableId: '5011Table2', |
|||
tableName: '报价详情信息表', |
|||
columnProp: 'weighted2', |
|||
headerAlign: 'center', |
|||
align: 'right', |
|||
columnLabel: 'Standard TP for MOQ>5M(USD/KCT)', |
|||
columnHidden: false, |
|||
columnImage: false, |
|||
columnSortable: false, |
|||
sortLv: 0, |
|||
status: true, |
|||
fixed: '', |
|||
columnWidth: 260 |
|||
}, |
|||
{ |
|||
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: 200 |
|||
}, |
|||
], |
|||
partVisible:false, |
|||
activeName:'bom', |
|||
|
|||
quoteGroupDetail:{}, |
|||
drawerVisible:false, |
|||
} |
|||
}, |
|||
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; |
|||
}, |
|||
handleDetail(row){ |
|||
this.saveQuoteDetail = { |
|||
...row |
|||
} |
|||
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(() => { |
|||
}) |
|||
}, |
|||
handleDblClick(row){ |
|||
this.saveQuoteDetail.partId = row.id; |
|||
this.saveQuoteDetail.partNo = row.partNo; |
|||
this.saveQuoteDetail.partDesc = row.partDesc; |
|||
this.partVisible = false; |
|||
}, |
|||
handlePartNoBlur(){ |
|||
let params = { |
|||
userName: this.$store.state.user.name, |
|||
partNo: this.saveQuoteDetail.partNo, |
|||
} |
|||
handleQueryPart(params).then(({data})=>{ |
|||
if (data && data.code === 0){ |
|||
if (data.rows.length === 1){ |
|||
this.saveQuoteDetail.partId = data.rows[0].id; |
|||
this.saveQuoteDetail.partNo = data.rows[0].partNo; |
|||
this.saveQuoteDetail.partDesc = data.rows[0].partDesc; |
|||
}else { |
|||
this.saveQuoteDetail.partId = undefined; |
|||
this.saveQuoteDetail.partDesc = ''; |
|||
} |
|||
}else { |
|||
this.$message.warning(data.msg); |
|||
} |
|||
}).catch((error)=>{ |
|||
this.$message.error(error); |
|||
}) |
|||
}, |
|||
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.cost.handleValidate(); |
|||
this.$refs.saveQuoteDetailForm.validate((valid,obj) => { |
|||
if (valid){ |
|||
if (this.saveQuoteDetail.id){ |
|||
this.handleUpdate(); |
|||
}else { |
|||
this.handleSave(); |
|||
} |
|||
}else { |
|||
let i = 1; |
|||
for (let item in obj){ |
|||
this.$message.error(obj[item][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() |
|||
} |
|||
}, |
|||
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; |
|||
}) |
|||
}, |
|||
handleClose(){ |
|||
this.drawerVisible = false |
|||
this.saveVisible = false |
|||
}, |
|||
}, |
|||
watch:{ |
|||
quote(newVal,oldVal){ |
|||
if (newVal.id){ |
|||
this.quoteDetail.profitRate = this.quote.markup |
|||
this.quoteDetail.quoteProfitRate = this.quote.markup |
|||
this.handleQueryQuoteDetail(); |
|||
}else { |
|||
this.dataList = []; |
|||
} |
|||
}, |
|||
"saveQuoteDetail.partNo"(newVal,oldVal){ |
|||
if (newVal){ |
|||
this.saveQuoteDetail.partNo = newVal.toUpperCase(); |
|||
} |
|||
}, |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<template> |
|||
<div class="rq"> |
|||
<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"> |
|||
<template v-if="item.columnLabel === 'Weighted TP for MOQ>250K(USD/KCT)' || item.columnLabel === 'Weighted TP for MOQ>5M(USD/KCT)'"> |
|||
<span v-if="scope.row.type && scope.row.type === 'Weighted TP'"> {{scope.row[item.columnProp] }}</span> |
|||
</template> |
|||
<template v-else-if="item.columnLabel === 'Standard TP for MOQ>250K(USD/KCT)' || item.columnLabel === 'Standard TP for MOQ>5M(USD/KCT)'"> |
|||
<span v-if="!scope.row.type || scope.row.type === 'Standard TP'">{{scope.row[item.columnProp] }}</span> |
|||
</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-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="partVisible = true">物料名称</a> |
|||
</span> |
|||
<el-input v-model="saveQuoteDetail.partNo" @blur="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="报价数量" 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="6"> |
|||
<el-form-item label="TP类型" prop="type" :show-message="false"> |
|||
<el-select v-model="saveQuoteDetail.type" placeholder="请选择" style="width: 100%;"> |
|||
<el-option label="Standard TP" value="Standard TP"></el-option> |
|||
<el-option label="Weighted TP" value="Weighted TP"></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
</el-col> |
|||
<el-col :span="6"> |
|||
<el-form-item label="Cost Model" prop="costModel" :show-message="false"> |
|||
<el-select v-model="saveQuoteDetail.costModel" style="width: 100%;"> |
|||
<el-option label="2020" value="2020"></el-option> |
|||
<el-option label="UFIDA" value="UFIDA"></el-option> |
|||
</el-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="报价数量" 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="TP类型" prop="type" :show-message="false"> |
|||
<el-select v-model="saveQuoteDetail.type" placeholder="请选择" style="width: 100%;"> |
|||
<el-option label="Standard TP" value="Standard TP"></el-option> |
|||
<el-option label="Weighted TP" value="Weighted TP"></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
</el-col> |
|||
<el-col :span="3"> |
|||
<el-form-item label="Cost Model" prop="costModel" :show-message="false"> |
|||
<el-select v-model="saveQuoteDetail.costModel" style="width: 100%;"> |
|||
<el-option label="2020" value="2020"></el-option> |
|||
<el-option label="UFIDA" value="UFIDA"></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
</el-col> |
|||
</el-row> |
|||
<el-row :gutter="20"> |
|||
<el-col :span="19"> |
|||
<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="handleClose" 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="handleClose" v-model:quoteDetail="saveQuoteDetail"></quote-detail-routing> |
|||
</el-tab-pane> |
|||
<el-tab-pane label="工具" name="tool"> |
|||
<quote-detail-tool v-if="saveVisible" v-model:quoteDetail="saveQuoteDetail"></quote-detail-tool> |
|||
</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="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 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" |
|||
@close="handleClose" |
|||
: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> |
|||
</div> |
|||
</template> |
|||
|
|||
<style scoped> |
|||
|
|||
.auto /deep/ .el-form-item__content{ |
|||
height: auto; |
|||
line-height: 1.5; |
|||
} |
|||
</style> |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue