Browse Source

我的报价界面

master
yanyan 2 days ago
parent
commit
f137c4cf0e
  1. 4
      src/api/supplier/purQuotation.js
  2. 6
      src/api/supplier/purReplyHist.js
  3. 532
      src/views/modules/supplier/myPurReplyHistList.vue
  4. 1
      src/views/modules/supplier/purHeaderList.vue
  5. 10
      src/views/modules/supplier/quoPurDetailList.vue

4
src/api/supplier/purQuotation.js

@ -16,7 +16,3 @@ export const deleteMaterial = (data) => createAPI(`/supplier/delPurDetail`, 'pos
//询价查询接口
export const searchPurDetailList = (data) => createAPI(`/supplier/getPurDetailPage`, 'post', data)
//新增报价
export const createPurPeplyHist = (data) => createAPI(`/supplier/savePurReplyHist`, 'post', data)

6
src/api/supplier/purReplyHist.js

@ -1,4 +1,8 @@
import { createAPI } from '@/utils/httpRequest.js'
export const searchPurReplyHistList = (data) => createAPI(`/supplier/getPurReplyHist`, 'post', data)
export const searchPurReplyHistList = (data) => createAPI(`/purQuotationReplyHist/list`, 'post', data)
export const searchPurReplyHistPage = (data) => createAPI(`/purQuotationReplyHist/page`, 'post', data)
export const createPurReplyHist = (data) => createAPI(`/purQuotationReplyHist/save`, 'post', data)
export const updatePurReplyHist = (data) => createAPI(`/purQuotationReplyHist/save`, 'post', data)
export const deletePurReplyHist = (data) => createAPI(`/purQuotationReplyHist/delete`, 'post', data)

532
src/views/modules/supplier/myPurReplyHistList.vue

@ -0,0 +1,532 @@
<template>
<div class="customer-css">
<!-- 查询条件 -->
<el-form :inline="true" label-position="top" class="pi-search-form">
<el-form-item :label="'报价单号'">
<el-input v-model="searchData.orderNo" placeholder="报价单号" style="width:160px" @keyup.enter.native="getList" />
</el-form-item>
<el-form-item :label="'物料编码'">
<el-input v-model="searchData.partNo" placeholder="物料编码" style="width:160px" @keyup.enter.native="getList" />
</el-form-item>
<el-form-item :label="'物料名称'">
<el-input v-model="searchData.partDesc" placeholder="物料名称" style="width:200px" @keyup.enter.native="getList" />
</el-form-item>
<el-form-item :label="'报价日期'">
<el-date-picker
style="width: 130px"
v-model="searchData.startDate"
type="date"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
placeholder="Start">
</el-date-picker>
</el-form-item>
<el-form-item :label="'To'">
<el-date-picker
style="width: 130px"
v-model="searchData.endDate"
type="date"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
placeholder="End">
</el-date-picker>
</el-form-item>
<el-form-item label=" ">
<el-button type="primary" class="customer-bun-min" @click="getList">查询</el-button>
<!-- <el-button type="primary" class="customer-bun-min" @click="openDialog()">新增报价</el-button> -->
</el-form-item>
</el-form>
<!-- 列表 -->
<el-table :data="dataList" :height="height" border highlight-current-row v-loading="loading" style="width:100%" stripe>
<el-table-column fixed="right" :label="'操作'" header-align="center" align="center" width="140">
<template slot-scope="scope">
<a class="customer-a" @click="openDialog(scope.row)">编辑 |</a>
<a class="customer-a" @click="handleDelete(scope.row)">删除</a>
</template>
</el-table-column>
<el-table-column prop="status" :label="'状态'" min-width="100" header-align="center" align="center">
<template slot-scope="scope">
{{ getStatusLabel(scope.row.status) }}
<!-- <el-tag :type="getStatusType(scope.row.status)" size="small">{{ getStatusLabel(scope.row.status) }}</el-tag> -->
</template>
</el-table-column>
<el-table-column prop="orderNo" :label="'报价单号'" min-width="150" header-align="center" align="left" show-overflow-tooltip />
<el-table-column prop="itemNo" :label="'序号'" min-width="80" header-align="center" align="center" />
<el-table-column prop="seqNo" :label="'报价次数'" min-width="100" header-align="center" align="center" />
<el-table-column prop="createdDate" :label="'报价时间'" min-width="160" header-align="center" align="center" />
<el-table-column prop="supplierId" :label="'供应商编码'" min-width="120" header-align="center" align="left" show-overflow-tooltip />
<el-table-column prop="supplierName" :label="'供应商名称'" min-width="150" header-align="center" align="left" show-overflow-tooltip />
<el-table-column prop="partNo" :label="'物料编码'" min-width="140" header-align="center" align="left" show-overflow-tooltip />
<el-table-column prop="partDesc" :label="'物料名称'" min-width="180" header-align="center" align="left" show-overflow-tooltip />
<el-table-column prop="qty" :label="'数量'" min-width="100" header-align="center" align="right" />
<el-table-column prop="umid" :label="'计量单位'" min-width="100" header-align="center" align="center" />
<el-table-column prop="remark2" :label="'特殊要求'" min-width="150" header-align="center" align="left" show-overflow-tooltip />
<el-table-column prop="materialCost" :label="'材料费用'" min-width="120" header-align="center" align="right">
<template slot-scope="scope">
{{ formatMoney(scope.row.materialCost) }}
</template>
</el-table-column>
<el-table-column prop="produceFee" :label="'加工费'" min-width="100" header-align="center" align="right">
<template slot-scope="scope">
{{ formatMoney(scope.row.produceFee) }}
</template>
</el-table-column>
<el-table-column prop="surfaceFee" :label="'表面处理费'" min-width="120" header-align="center" align="right">
<template slot-scope="scope">
{{ formatMoney(scope.row.surfaceFee) }}
</template>
</el-table-column>
<el-table-column prop="profit" :label="'利润'" min-width="100" header-align="center" align="right">
<template slot-scope="scope">
{{ formatMoney(scope.row.profit) }}
</template>
</el-table-column>
<el-table-column prop="price" :label="'未税单价'" min-width="120" header-align="center" align="right">
<template slot-scope="scope">
{{ formatMoney(scope.row.price) }}
</template>
</el-table-column>
<el-table-column prop="taxRate" :label="'税率(%)'" min-width="100" header-align="center" align="center" />
<el-table-column prop="tax" :label="'含税单价'" min-width="120" header-align="center" align="right">
<template slot-scope="scope">
{{ formatMoney(scope.row.tax) }}
</template>
</el-table-column>
<el-table-column prop="duty" :label="'关税'" min-width="100" header-align="center" align="right">
<template slot-scope="scope">
{{ formatMoney(scope.row.duty) }}
</template>
</el-table-column>
<el-table-column prop="purchaseCycle" :label="'采购周期(天)'" min-width="120" header-align="center" align="center" />
<el-table-column prop="mouldFee" :label="'模具费'" min-width="100" header-align="center" align="right">
<template slot-scope="scope">
{{ formatMoney(scope.row.mouldFee) }}
</template>
</el-table-column>
<el-table-column prop="additionalCost" :label="'附加费用'" min-width="100" header-align="center" align="right">
<template slot-scope="scope">
{{ formatMoney(scope.row.additionalCost) }}
</template>
</el-table-column>
<el-table-column prop="freight" :label="'运费'" min-width="100" header-align="center" align="right">
<template slot-scope="scope">
{{ formatMoney(scope.row.freight) }}
</template>
</el-table-column>
<el-table-column prop="reason" :label="'原因'" min-width="150" header-align="center" align="left" show-overflow-tooltip />
<el-table-column prop="remark" :label="'备注'" min-width="150" header-align="center" align="left" show-overflow-tooltip />
<el-table-column prop="createdBy" :label="'报价人'" min-width="120" header-align="center" align="center" />
<el-table-column prop="wantReplyDate" :label="'要求报价时间'" min-width="160" header-align="center" align="center" />
<el-table-column prop="buyer" :label="'采购员'" min-width="120" header-align="center" align="center" />
<el-table-column prop="paymentTerm" :label="'付款方式'" min-width="120" header-align="center" align="center" />
<el-table-column prop="deliveryTerm" :label="'交货条款'" min-width="120" header-align="center" align="center" />
<el-table-column prop="currency" :label="'货币'" min-width="80" header-align="center" align="center" />
<el-table-column prop="contact" :label="'联系人'" min-width="120" header-align="center" align="center" />
<el-table-column prop="phoneNo" :label="'联系电话'" min-width="130" header-align="center" align="center" />
<el-table-column prop="faxNo" :label="'传真'" min-width="130" header-align="center" align="center" />
<el-table-column prop="otherCondition" :label="'其他要求'" min-width="180" header-align="center" align="left" show-overflow-tooltip />
</el-table>
<!-- 分页 -->
<el-pagination
style="margin-top:10px"
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[20,50,100,200,500]"
:page-size="pageSize"
:total="totalPage"
layout="total, sizes, prev, pager, next, jumper" />
<!-- 新增 / 编辑 弹窗 -->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="800px" :close-on-click-modal="false" v-drag>
<el-form label-position="top" class="pi-form" :model="form" label-width="120px">
<!-- 基础信息 -->
<div class="form-section">
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="物料编码" prop="partNo">
<el-input v-model="form.partNo" :disabled="true" placeholder="物料编码"></el-input>
</el-form-item>
</el-col>
<el-col :span="18">
<el-form-item label="物料名称" prop="partDesc">
<el-input v-model="form.partDesc" :disabled="true" placeholder="物料名称"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="18">
<el-form-item label="规格型号" prop="spec">
<el-input v-model="form.spec" :disabled="true" placeholder="规格型号"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="询价数量" prop="qty">
<el-input-number v-model="form.qty" :disabled="true" :min="0" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="18">
<el-form-item label="其他要求" prop="otherCondition">
<el-input v-model="form.otherCondition" type="text" :disabled="true" :rows="1" placeholder="其他要求"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="计量单位" prop="umid">
<el-input v-model="form.umid" :disabled="true" placeholder="计量单位"></el-input>
</el-form-item>
</el-col>
</el-row>
</div>
<!-- 费用信息 -->
<div class="form-section">
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="材料费用" prop="materialCost">
<el-input-number v-model="form.materialCost" @change="calculatePrice" :precision="2" :min="0" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="加工费" prop="produceFee">
<el-input-number v-model="form.produceFee" @change="calculatePrice" :precision="2" :min="0" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="表面处理费" prop="surfaceFee">
<el-input-number v-model="form.surfaceFee" @change="calculatePrice" :precision="2" :min="0" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="利润" prop="profit">
<el-input-number v-model="form.profit" @change="calculatePrice" :precision="2" :min="0" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<!-- 价格信息 -->
<div class="form-section">
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="未税单价" prop="price">
<el-input-number v-model="form.price" :disabled="true" :precision="4" :min="0" style="width: 100%" @change="calculateTax"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="税率(%)" prop="taxRate">
<el-input-number v-model="form.taxRate" :disabled="true" :precision="2" :min="0" :max="100" style="width: 100%" @change="calculateTax"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="含税单价" prop="tax">
<el-input-number v-model="form.tax" :disabled="true" :precision="4" :min="0" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="关税" prop="duty">
<el-input-number v-model="form.duty" :precision="2" :min="0" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
</el-row>
</div>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="采购周期(天)" prop="purchaseCycle">
<el-input-number v-model="form.purchaseCycle" :min="0" :precision="0" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="模具费" prop="mouldFee">
<el-input-number v-model="form.mouldFee" :precision="2" :min="0" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="附加费用" prop="additionalCost">
<el-input-number v-model="form.additionalCost" :precision="2" :min="0" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="运费" prop="freight">
<el-input-number v-model="form.freight" :precision="2" :min="0" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
</el-row>
</div>
<!-- 其他信息 -->
<div class="form-section">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="特殊要求" prop="remark2">
<el-input v-model="form.remark2" type="textarea" :disabled="true" :rows="1" placeholder="请输入特殊要求"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" :rows="1" placeholder="请输入备注"></el-input>
</el-form-item>
</el-col>
</el-row>
</div>
</el-form>
<div slot="footer" class="dialog-footer" style="margin-top: 20px">
<el-button type="primary" @click="submitForm" :loading="submitLoading">保存</el-button>
<el-button @click="dialogVisible=false">取消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {
searchPurReplyHistPage,
createPurReplyHist,
updatePurReplyHist,
deletePurReplyHist } from '@/api/supplier/purReplyHist.js'
export default {
name: 'MyQuotation',
data() {
return {
height: 200,
loading: false,
submitLoading: false,
dataList: [],
pageIndex: 1,
pageSize: 20,
totalPage: 0,
searchData: {
site: this.$store.state.user.site,
createdBy: this.$store.state.user.name,
orderNo: '',
partNo: '',
partDesc: '',
status: ''
},
dialogVisible: false,
dialogTitle: '新增报价',
editMode: false,
form: {
id: '',
status: 'pending',
orderNo: '',
itemNo: '',
seqNo: '',
createdDate: '',
supplierId: '',
supplierName: '',
partNo: '',
partDesc: '',
qty: 0,
umid: '',
remark2: '',
materialCost: 0,
produceFee: 0,
surfaceFee: 0,
profit: 0,
price: 0,
taxRate: 13,
tax: 0,
duty: 0,
purchaseCycle: 0,
mouldFee: 0,
additionalCost: 0,
freight: 0,
reason: '',
remark: '',
createdBy: this.$store.state.user.name,
wantReplyDate: '',
employeeName: '',
paymentTerm: '',
deliveryTerm: '',
currency: 'CNY',
contact: '',
phoneNo: '',
faxNo: '',
otherCondition: ''
}
}
},
mounted() {
this.calcHeight()
window.addEventListener('resize', this.calcHeight)
this.getList()
},
beforeDestroy() {
window.removeEventListener('resize', this.calcHeight)
},
methods: {
calcHeight() {
this.$nextTick(() => {
this.height = window.innerHeight - 212
})
},
getStatusType(status) {
const map = {
pending: 'warning',
approved: 'success',
rejected: 'danger'
}
return map[status] || 'info'
},
getStatusLabel(status) {
const map = {
pending: '待审核',
approved: '已通过',
rejected: '已拒绝'
}
return map[status] || status
},
formatMoney(value) {
if (value === null || value === undefined) return '-'
return new Intl.NumberFormat('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(value)
},
getList() {
this.loading = true
const params = {
limit: this.pageSize,
page: this.pageIndex,
...this.searchData
}
searchPurReplyHistPage(params).then(({ data }) => {
if (data.code === 0) {
this.dataList = data.page.list
this.pageIndex = data.page.currPage
this.pageSize = data.page.pageSize
this.totalPage = data.page.totalCount
} else {
this.$message.error((data && data.msg) || '获取列表失败')
}
this.loading = false
}).catch(() => {
this.loading = false
this.$message.error('请求失败')
})
},
sizeChangeHandle(val) {
this.pageSize = val
this.pageIndex = 1
this.getList()
},
currentChangeHandle(val) {
this.pageIndex = val
this.getList()
},
openDialog(row) {
if (row) {
this.dialogTitle = '编辑报价'
this.editMode = true
this.form = { ...row }
} else {
this.dialogTitle = '新增报价'
this.editMode = false
this.form = {
id: '',
status: '已报价',
orderNo: '',
itemNo: '',
seqNo: '',
createdDate: new Date().toISOString(),
supplierId: '',
supplierName: '',
partNo: '',
partDesc: '',
qty: 0,
umid: '',
remark2: '',
materialCost: 0,
produceFee: 0,
surfaceFee: 0,
profit: 0,
price: 0,
taxRate: 13,
tax: 0,
duty: 0,
purchaseCycle: 0,
mouldFee: 0,
additionalCost: 0,
freight: 0,
reason: '',
remark: '',
createdBy: this.$store.state.user.name,
wantReplyDate: '',
employeeName: '',
paymentTerm: '',
deliveryTerm: '',
currency: 'CNY',
contact: '',
phoneNo: '',
faxNo: '',
otherCondition: ''
}
}
this.dialogVisible = true
},
validateForm() {
if (!this.form.partNo) {
this.$message.warning('物料编码不能为空')
return false
}
if (!this.form.partDesc) {
this.$message.warning('物料名称不能为空')
return false
}
return true
},
submitForm() {
if (!this.validateForm()) return
this.submitLoading = true
const api = this.editMode ? updatePurReplyHist : createPurReplyHist
api(this.form).then(({ data }) => {
if (data && data.code === 0) {
this.$message.success('保存成功')
this.dialogVisible = false
this.getList()
} else {
this.$message.error((data && data.msg) || '保存失败')
}
}).catch(err => {
this.$message.error('请求失败: ' + err.message)
}).finally(() => {
this.submitLoading = false
})
},
handleDelete(row) {
this.$confirm(`确定删除报价单: ${row.orderNo} ?`, '提示', { type: 'warning' }).then(() => {
deletePurReplyHist({ id: row.id }).then(({ data }) => {
if (data && data.code === 0) {
this.$message.success('删除成功')
this.getList()
} else {
this.$message.error((data && data.msg) || '删除失败')
}
}).catch(err => {
this.$message.error('删除失败: ' + err.message)
})
}).catch(() => {})
}
}
}
</script>
<style scoped>
.pi-search-form { margin-top: 0; }
.pi-form { margin-top: -5px; }
.customer-a {
cursor: pointer;
color: #409EFF;
margin: 0 4px;
}
.customer-a:hover {
color: #66b1ff;
}
.customer-bun-min {
margin-right: 10px;
}
</style>

1
src/views/modules/supplier/purHeaderList.vue

@ -1,3 +1,4 @@
<!-- 询价单新增 -->
<template>
<div class="customer-css">
<!-- 查询条件 -->

10
src/views/modules/supplier/purReplyHistList.vue → src/views/modules/supplier/quoPurDetailList.vue

@ -1,3 +1,4 @@
<!-- 询价单报价 -->
<template>
<div class="customer-css">
<!-- 查询条件 -->
@ -272,10 +273,13 @@
<script>
import {
searchPurDetailList,
createPurPeplyHist
searchPurDetailList
} from '@/api/supplier/purQuotation.js'
import {
createPurReplyHist
} from '@/api/supplier/purReplyHist.js'
import quotationList from './com_inquiry_QuotationList'
import attachments from './com_inquiry_Attachments'
@ -567,7 +571,7 @@ export default {
totalCost: totalCost
}
createPurPeplyHist(submitData).then(({ data }) => {
createPurReplyHist(submitData).then(({ data }) => {
if (data && data.code === 0) {
this.$message.success('报价提交成功')
this.quoteDialogVisible = false
Loading…
Cancel
Save