|
|
@@ -9,26 +9,33 @@
|
|
|
</template>
|
|
|
|
|
|
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
|
|
|
- <!-- 基本信息 -->
|
|
|
- <el-divider content-position="left">
|
|
|
- <span style="font-size: 16px; font-weight: bold; color: #67c23a">
|
|
|
- <el-icon><Document /></el-icon> 基本信息
|
|
|
- </span>
|
|
|
- </el-divider>
|
|
|
+ <div class="quote-type-wrapper">
|
|
|
+ <el-row class="quote-type-row" justify="center">
|
|
|
+ <el-col :span="12" class="quote-type-col">
|
|
|
+ <el-form-item class="quote-type-item" label="报价类型" prop="quoteType" required>
|
|
|
+ <el-radio-group v-model="form.quoteType" size="large" @change="handleQuoteTypeChange">
|
|
|
+ <el-radio-button v-for="item in quoteTypeOptions" :key="item.value" :label="item.value">
|
|
|
+ {{ item.label }}
|
|
|
+ </el-radio-button>
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </div>
|
|
|
<div>
|
|
|
<el-row :gutter="20">
|
|
|
<el-col :span="6">
|
|
|
- <el-form-item label="报价单编号" prop="quoteNo">
|
|
|
+ <el-form-item :label="basicLabels.quoteNo" prop="quoteNo">
|
|
|
<el-input v-model="form.quoteNo" placeholder="系统自动生成" disabled />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="6">
|
|
|
- <el-form-item label="报价主题" prop="quoteTitle">
|
|
|
+ <el-form-item :label="basicLabels.quoteTitle" prop="quoteTitle">
|
|
|
<el-input v-model="form.quoteTitle" placeholder="可不填,系统将自动生成" maxlength="100" show-word-limit />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="6">
|
|
|
- <el-form-item label="客户名称" prop="customerId" required>
|
|
|
+ <el-form-item :label="basicLabels.customerName" prop="customerId" required>
|
|
|
<el-input v-model="form.customerName" placeholder="请选择客户" readonly>
|
|
|
<template #append>
|
|
|
<el-button text icon="Search" @click="handleSelectCustomer" />
|
|
|
@@ -37,7 +44,7 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="6">
|
|
|
- <el-form-item label="联系人" prop="contactId" required>
|
|
|
+ <el-form-item :label="basicLabels.contactName" prop="contactId" required>
|
|
|
<el-input v-model="form.contactName" placeholder="请选择联系人" readonly :disabled="!form.customerId">
|
|
|
<template #append>
|
|
|
<el-button text icon="Search" @click="handleSelectContact" :disabled="!form.customerId" />
|
|
|
@@ -48,17 +55,8 @@
|
|
|
</el-row>
|
|
|
|
|
|
<el-row :gutter="20">
|
|
|
- <el-col :span="6">
|
|
|
- <el-form-item label="报价类型" prop="quoteType" required>
|
|
|
- <el-radio-group v-model="form.quoteType">
|
|
|
- <el-radio-button v-for="item in quoteTypeOptions" :key="item.value" :label="item.value">
|
|
|
- {{ item.label }}
|
|
|
- </el-radio-button>
|
|
|
- </el-radio-group>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
<el-col :span="6">
|
|
|
- <el-form-item label="关联商机" prop="opportunityId">
|
|
|
+ <el-form-item :label="basicLabels.opportunity" prop="opportunityId">
|
|
|
<el-input v-model="opportunityDisplayName" placeholder="请选择商机(可选)" readonly clearable>
|
|
|
<template #append>
|
|
|
<el-button text icon="Search" @click="handleSelectOpportunity" />
|
|
|
@@ -67,7 +65,7 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="6">
|
|
|
- <el-form-item label="负责人" prop="ownerUserId" required>
|
|
|
+ <el-form-item :label="basicLabels.ownerUser" prop="ownerUserId" required>
|
|
|
<el-input v-model="form.ownerUserName" placeholder="请选择负责人" readonly>
|
|
|
<template #append>
|
|
|
<el-button text icon="Search" @click="handleSelectUser" />
|
|
|
@@ -76,25 +74,30 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="6">
|
|
|
- <el-form-item label="报价日期" prop="quoteDate" required>
|
|
|
+ <el-form-item :label="basicLabels.quoteDate" prop="quoteDate" required>
|
|
|
<el-date-picker v-model="form.quoteDate" type="date" placeholder="选择报价日期" value-format="YYYY-MM-DD" style="width: 100%" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item :label="basicLabels.validityDays" prop="validityDays" required>
|
|
|
+ <el-input-number v-model="form.validityDays" :min="1" :max="365" style="width: 100%" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
</el-row>
|
|
|
|
|
|
<el-row :gutter="20">
|
|
|
- <el-col :span="6">
|
|
|
- <el-form-item label="有效期(天)" prop="validityDays" required>
|
|
|
- <el-input-number v-model="form.validityDays" :min="1" :max="365" style="width: 100%" />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
<el-col :span="6">
|
|
|
- <el-form-item label="报价主体" prop="supplierId" required>
|
|
|
- <el-select v-model="form.supplierId" placeholder="请选择报价主体" clearable style="width: 100%" @change="handleSupplierChange">
|
|
|
+ <el-form-item :label="basicLabels.supplier" prop="supplierId" required>
|
|
|
+ <el-select v-model="form.supplierId" :placeholder="`请选择${basicLabels.supplier}`" clearable style="width: 100%" @change="handleSupplierChange">
|
|
|
<el-option v-for="supplier in supplierList" :key="supplier.id" :label="supplier.supplierName" :value="supplier.id" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="运费(元)" prop="freight">
|
|
|
+ <el-input-number v-model="form.freight" :min="0" :step="0.01" style="width: 100%" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
</el-row>
|
|
|
</div>
|
|
|
|
|
|
@@ -419,6 +422,21 @@ const formTitle = computed(() => {
|
|
|
return form.value.id ? '编辑报价单' : '新建报价单';
|
|
|
});
|
|
|
|
|
|
+const basicLabels = computed(() => {
|
|
|
+ const isPurchase = form.value.quoteType === 'purchase';
|
|
|
+ return {
|
|
|
+ quoteNo: '报价单编号',
|
|
|
+ quoteTitle: '报价主题',
|
|
|
+ customerName: isPurchase ? '供货商名称' : '客户名称',
|
|
|
+ contactName: isPurchase ? '供货商联系人' : '客户联系人',
|
|
|
+ opportunity: '关联商机',
|
|
|
+ ownerUser: isPurchase ? '采购负责人' : '负责人',
|
|
|
+ quoteDate: isPurchase ? '询价日期' : '报价日期',
|
|
|
+ validityDays: '有效期(天)',
|
|
|
+ supplier: isPurchase ? '采购主体' : '报价主体'
|
|
|
+ };
|
|
|
+});
|
|
|
+
|
|
|
// 表单数据
|
|
|
const form = ref<QuoteForm>({
|
|
|
id: undefined,
|
|
|
@@ -436,6 +454,7 @@ const form = ref<QuoteForm>({
|
|
|
ownerUserName: '',
|
|
|
supplierId: undefined,
|
|
|
supplierName: '',
|
|
|
+ freight: 0,
|
|
|
remark: '1. 以上报价含税13%、含运费 ,款到发货 ,最终价格须盖章回传。\n2. 结算以实际到货数量为准,价格随行就市 。',
|
|
|
products: []
|
|
|
});
|
|
|
@@ -449,6 +468,7 @@ const rules = ref({
|
|
|
contactId: [{ required: true, message: '请选择联系人', trigger: 'change' }],
|
|
|
quoteDate: [{ required: true, message: '请选择报价日期', trigger: 'change' }],
|
|
|
validityDays: [{ required: true, message: '请输入有效期', trigger: 'blur' }],
|
|
|
+ freight: [{ type: 'number', min: 0, message: '运费需大于等于0', trigger: 'change' }],
|
|
|
ownerUserId: [{ required: true, message: '请选择负责人', trigger: 'change' }],
|
|
|
supplierId: [{ required: true, message: '请选择报价主体', trigger: 'change' }],
|
|
|
quoteType: [{ required: true, message: '请选择报价类型', trigger: 'change' }]
|
|
|
@@ -825,13 +845,28 @@ const updateQuoteTitleAndNo = () => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 更新报价主题(格式:供方简称-客户简称(报价单号))
|
|
|
+ // 更新报价主题
|
|
|
+ // 销售:供方简称-客户简称(报价单号)
|
|
|
+ // 采购:客户简称-供方简称(报价单号)
|
|
|
// 报价单号使用当前数据的报价单号(新建时是预览格式,编辑时如果供方变化则只更新编码部分)
|
|
|
if (form.value.quoteNo) {
|
|
|
- form.value.quoteTitle = `${supplierShortName}-${customerShortNameValue}(${form.value.quoteNo})`;
|
|
|
+ const isPurchase = form.value.quoteType === 'purchase';
|
|
|
+ if (isPurchase) {
|
|
|
+ // 采购:客户简称-供方简称(报价单号)
|
|
|
+ form.value.quoteTitle = `${customerShortNameValue || ''}-${supplierShortName}(${form.value.quoteNo})`;
|
|
|
+ } else {
|
|
|
+ // 销售:供方简称-客户简称(报价单号)
|
|
|
+ form.value.quoteTitle = `${supplierShortName}-${customerShortNameValue || ''}(${form.value.quoteNo})`;
|
|
|
+ }
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+/** 报价类型变化处理 */
|
|
|
+const handleQuoteTypeChange = () => {
|
|
|
+ // 报价类型变化时,更新报价主题
|
|
|
+ updateQuoteTitleAndNo();
|
|
|
+};
|
|
|
+
|
|
|
/** 报价主体变化处理 */
|
|
|
const handleSupplierChange = (supplierId: number | undefined) => {
|
|
|
if (!supplierId) {
|
|
|
@@ -1164,9 +1199,15 @@ const handleSaveDraft = () => {
|
|
|
form.value.attachments = attachmentsWithCategory.length > 0 ? JSON.stringify(attachmentsWithCategory) : '';
|
|
|
|
|
|
// 新增时,如果报价单号包含预览标记(***),清空让后端重新生成
|
|
|
+ // 注意:如果报价单号不是预览格式,说明已经有正式报价单号,应该保留前端生成的报价主题
|
|
|
if (!form.value.id && form.value.quoteNo && form.value.quoteNo.includes('***')) {
|
|
|
form.value.quoteNo = '';
|
|
|
form.value.quoteTitle = ''; // 清空报价主题,让后端重新生成
|
|
|
+ } else if (!form.value.id && form.value.quoteNo && !form.value.quoteNo.includes('***')) {
|
|
|
+ // 如果有正式报价单号但没有报价主题,根据报价类型生成
|
|
|
+ if (!form.value.quoteTitle) {
|
|
|
+ updateQuoteTitleAndNo();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (form.value.id) {
|
|
|
@@ -1347,6 +1388,42 @@ onMounted(() => {
|
|
|
margin-top: 10px;
|
|
|
}
|
|
|
|
|
|
+.quote-type-row {
|
|
|
+ margin-bottom: 12px;
|
|
|
+}
|
|
|
+
|
|
|
+.quote-type-col {
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+}
|
|
|
+
|
|
|
+.quote-type-item {
|
|
|
+ margin-bottom: 0;
|
|
|
+ align-items: center;
|
|
|
+}
|
|
|
+
|
|
|
+.quote-type-item :deep(.el-form-item__label) {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ min-height: 56px;
|
|
|
+ line-height: 56px;
|
|
|
+}
|
|
|
+
|
|
|
+.quote-type-item :deep(.el-form-item__content) {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+}
|
|
|
+
|
|
|
+.quote-type-item :deep(.el-radio-button__inner) {
|
|
|
+ padding: 14px 26px;
|
|
|
+ font-size: 16px;
|
|
|
+}
|
|
|
+
|
|
|
+.quote-type-wrapper {
|
|
|
+ margin-bottom: 4px;
|
|
|
+}
|
|
|
+
|
|
|
.card-header {
|
|
|
display: flex;
|
|
|
justify-content: space-between;
|