备货单 加 审批流程
This commit is contained in:
+264
-540
@@ -12,7 +12,7 @@
|
||||
<ElForm :model="baseForm" class="base-form">
|
||||
<ElRow :gutter="12">
|
||||
<ElCol :span="4">
|
||||
<ElFormItem label="阿里订单号/PN号">
|
||||
<ElFormItem label="阿里订单号/PI号">
|
||||
<ElInput v-model="baseForm.pi_no" placeholder="请输入阿里订单号/PN号" />
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
@@ -141,12 +141,12 @@
|
||||
<ElCol :span="4">
|
||||
<ElFormItem label="颜色/外饰" label-width="72px">
|
||||
<el-select
|
||||
v-model="item.color_interior_snapshot"
|
||||
v-model="item.color_exterior_snapshot"
|
||||
filterable
|
||||
placeholder="请选择内容"
|
||||
@change="
|
||||
(val) =>
|
||||
(item.color_interior_code =
|
||||
(item.color_exterior_code =
|
||||
(wcolorOptions || []).find((x: any) => x.color_text === val)?.color_code ||
|
||||
'')
|
||||
"
|
||||
@@ -158,18 +158,18 @@
|
||||
:value="item.color_text"
|
||||
/>
|
||||
</el-select>
|
||||
<ElInput v-model="item.color_interior_code" type="hidden" />
|
||||
<ElInput v-model="item.color_exterior_code" type="hidden" />
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
<ElCol :span="4">
|
||||
<ElFormItem label="颜色/内饰" label-width="72px">
|
||||
<el-select
|
||||
v-model="item.color_exterior_snapshot"
|
||||
v-model="item.color_interior_snapshot"
|
||||
filterable
|
||||
placeholder="请选择内容"
|
||||
@change="
|
||||
(val) =>
|
||||
(item.color_exterior_code =
|
||||
(item.color_interior_code =
|
||||
(ncolorOptions || []).find((x: any) => x.color_text === val)?.color_code ||
|
||||
'')
|
||||
"
|
||||
@@ -181,7 +181,7 @@
|
||||
:value="item.color_text"
|
||||
/>
|
||||
</el-select>
|
||||
<ElInput v-model="item.color_exterior_code" type="hidden" />
|
||||
<ElInput v-model="item.color_interior_code" type="hidden" />
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
<ElCol :span="8">
|
||||
@@ -205,50 +205,15 @@
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
<ElInput v-model="item.modify_list" type="hidden" />
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
</ElRow>
|
||||
<ElRow :gutter="12">
|
||||
<ElCol :span="4">
|
||||
<ElFormItem label="改装费" label-width="60px">
|
||||
<ElInput v-model.number="item.retrofit_fee" placeholder="请输入改装费">
|
||||
<ElFormItem label="单价" label-width="45px">
|
||||
<ElInput v-model="item.unit_price" placeholder="请输入单价">
|
||||
<template #append>
|
||||
<ElSelect v-model="item.modify_fee_currency" style="width: 64px">
|
||||
<ElOption
|
||||
v-for="c in currencyOptions"
|
||||
:key="c.currency_code"
|
||||
:label="c.currency_name"
|
||||
:value="c.currency_code"
|
||||
/>
|
||||
</ElSelect>
|
||||
</template>
|
||||
</ElInput>
|
||||
<ElInput v-model="item.modify_fee_currency_snapshot" type="hidden" />
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
<ElCol :span="4">
|
||||
<ElFormItem label="FOB段运费" label-width="84px">
|
||||
<ElInput v-model.number="item.fob_transport_fee" placeholder="请输入FOB段运费">
|
||||
<template #append>
|
||||
<ElSelect v-model="item.fob_fee_currency" style="width: 64px">
|
||||
<ElOption
|
||||
v-for="c in currencyOptions"
|
||||
:key="c.currency_code"
|
||||
:label="c.currency_name"
|
||||
:value="c.currency_code"
|
||||
/>
|
||||
</ElSelect>
|
||||
</template>
|
||||
</ElInput>
|
||||
<ElInput v-model="item.fob_fee_currency_snapshot" type="hidden" />
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
<ElCol :span="4">
|
||||
<ElFormItem label="单价" label-width="52px">
|
||||
<ElInput v-model.number="item.unit_price" placeholder="请输入单价">
|
||||
<template #append>
|
||||
<ElSelect v-model="item.unit_price_currency" style="width: 64px">
|
||||
<ElSelect v-model="item.unit_price_currency" style="width: 61px">
|
||||
<ElOption
|
||||
v-for="c in currencyOptions"
|
||||
:key="c.currency_code"
|
||||
@@ -262,10 +227,10 @@
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
<ElCol :span="4">
|
||||
<ElFormItem label="总价" label-width="52px">
|
||||
<ElInput v-model.number="item.total_price" placeholder="请输入总价">
|
||||
<ElFormItem label="总价" label-width="45px">
|
||||
<ElInput v-model="item.total_price" placeholder="请输入总价">
|
||||
<template #append>
|
||||
<ElSelect v-model="item.total_price_currency" style="width: 64px">
|
||||
<ElSelect v-model="item.total_price_currency" style="width: 61px">
|
||||
<ElOption
|
||||
v-for="c in currencyOptions"
|
||||
:key="c.currency_code"
|
||||
@@ -278,11 +243,11 @@
|
||||
<ElInput v-model="item.total_price_currency_snapshot" type="hidden" />
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
<ElCol :span="4">
|
||||
<ElFormItem label="官方指导价" label-width="85px">
|
||||
<ElInput v-model.number="item.official_price" placeholder="请输入官方指导价">
|
||||
<ElCol :span="5">
|
||||
<ElFormItem label="改装费" label-width="55px">
|
||||
<ElInput v-model="item.retrofit_fee" placeholder="请输入改装费">
|
||||
<template #append>
|
||||
<ElSelect v-model="item.guide_price_currency" style="width: 64px">
|
||||
<ElSelect v-model="item.modify_fee_currency" style="width: 61px">
|
||||
<ElOption
|
||||
v-for="c in currencyOptions"
|
||||
:key="c.currency_code"
|
||||
@@ -292,14 +257,14 @@
|
||||
</ElSelect>
|
||||
</template>
|
||||
</ElInput>
|
||||
<ElInput v-model="item.guide_price_currency_snapshot" type="hidden" />
|
||||
<ElInput v-model="item.modify_fee_currency_snapshot" type="hidden" />
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
<ElCol :span="4">
|
||||
<ElFormItem label="优惠" label-width="52px">
|
||||
<ElInput v-model.number="item.discount_price" placeholder="请输入优惠额">
|
||||
<ElCol :span="6">
|
||||
<ElFormItem label="FOB段运费" label-width="84px">
|
||||
<ElInput v-model="item.fob_transport_fee" placeholder="请输入FOB段运费">
|
||||
<template #append>
|
||||
<ElSelect v-model="item.discount_currency" style="width: 64px">
|
||||
<ElSelect v-model="item.fob_fee_currency" style="width: 61px">
|
||||
<ElOption
|
||||
v-for="c in currencyOptions"
|
||||
:key="c.currency_code"
|
||||
@@ -309,16 +274,14 @@
|
||||
</ElSelect>
|
||||
</template>
|
||||
</ElInput>
|
||||
<ElInput v-model="item.discount_currency_snapshot" type="hidden" />
|
||||
<ElInput v-model="item.fob_fee_currency_snapshot" type="hidden" />
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
</ElRow>
|
||||
<ElRow :gutter="12">
|
||||
<ElCol :span="4">
|
||||
<ElCol :span="5">
|
||||
<ElFormItem label="手续费" label-width="60px">
|
||||
<ElInput v-model.number="item.handling_fee" placeholder="请输入手续费">
|
||||
<ElInput v-model="item.handling_fee" placeholder="请输入手续费">
|
||||
<template #append>
|
||||
<ElSelect v-model="item.helper_fee_currency" style="width: 64px">
|
||||
<ElSelect v-model="item.helper_fee_currency" style="width: 61px">
|
||||
<ElOption
|
||||
v-for="c in currencyOptions"
|
||||
:key="c.currency_code"
|
||||
@@ -331,28 +294,13 @@
|
||||
<ElInput v-model="item.helper_fee_currency_snapshot" type="hidden" />
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
<!-- <ElCol :span="4">
|
||||
<ElFormItem label="国内运费" label-width="72px">
|
||||
<ElInput v-model.number="item.domestic_freight" placeholder="请输入国内运费">
|
||||
<template #append>
|
||||
<ElSelect v-model="item.domestic_freight_currency" style="width: 64px">
|
||||
<ElOption
|
||||
v-for="c in currencyOptions"
|
||||
:key="c.currency_code"
|
||||
:label="c.currency_name"
|
||||
:value="c.currency_code"
|
||||
/>
|
||||
</ElSelect>
|
||||
</template>
|
||||
</ElInput>
|
||||
<ElInput v-model="item.domestic_freight_currency_snapshot" type="hidden" />
|
||||
</ElFormItem>
|
||||
</ElCol> -->
|
||||
<ElCol :span="4">
|
||||
</ElRow>
|
||||
<ElRow :gutter="12">
|
||||
<ElCol :span="5">
|
||||
<ElFormItem label="港杂费" label-width="60px">
|
||||
<ElInput v-model.number="item.port_misc_fee" placeholder="请输入港杂费">
|
||||
<ElInput v-model="item.port_misc_fee" placeholder="请输入港杂费">
|
||||
<template #append>
|
||||
<ElSelect v-model="item.port_fee_currency" style="width: 64px">
|
||||
<ElSelect v-model="item.port_fee_currency" style="width: 61px">
|
||||
<ElOption
|
||||
v-for="c in currencyOptions"
|
||||
:key="c.currency_code"
|
||||
@@ -366,12 +314,83 @@
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
<ElCol :span="4">
|
||||
<ElFormItem label="利润" label-width="52px">
|
||||
<ElSelect v-model="item.profit_type" placeholder="请选择" style="width: 100%">
|
||||
<ElOption label="正在计算利润" value="calc" />
|
||||
<ElOption label="已确认" value="ok" />
|
||||
</ElSelect>
|
||||
<ElInput v-model="item.profit_type_snapshot" type="hidden" />
|
||||
<ElFormItem label="里程" label-width="52px">
|
||||
<ElInput v-model="item.mileage" placeholder="请输入里程" />
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
<ElCol :span="5" v-if="(item.mileage ?? 0) <= 0">
|
||||
<ElFormItem label="官方指导价" label-width="85px">
|
||||
<ElInput v-model="item.official_price" placeholder="请输入官方指导价">
|
||||
<template #append>
|
||||
<ElSelect v-model="item.guide_price_currency" style="width: 61px">
|
||||
<ElOption
|
||||
v-for="c in currencyOptions"
|
||||
:key="c.currency_code"
|
||||
:label="c.currency_name"
|
||||
:value="c.currency_code"
|
||||
/>
|
||||
</ElSelect>
|
||||
</template>
|
||||
</ElInput>
|
||||
<ElInput v-model="item.guide_price_currency_snapshot" type="hidden" />
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
<ElCol :span="5" v-else>
|
||||
<ElFormItem label="挂牌价" label-width="55px">
|
||||
<ElInput v-model="item.listing_price" placeholder="请输入挂牌价">
|
||||
<template #append>
|
||||
<ElSelect v-model="item.listing_price_currency" style="width: 61px">
|
||||
<ElOption
|
||||
v-for="c in currencyOptions"
|
||||
:key="c.currency_code"
|
||||
:label="c.currency_name"
|
||||
:value="c.currency_code"
|
||||
/>
|
||||
</ElSelect>
|
||||
</template>
|
||||
</ElInput>
|
||||
<ElInput v-model="item.listing_price_currency_snapshot" type="hidden" />
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
<ElCol :span="6" v-if="(item.mileage ?? 0) <= 0">
|
||||
<ElFormItem label="优惠" label-width="52px">
|
||||
<ElInput v-model="item.discount_price" placeholder="请输入优惠额">
|
||||
<template #append>
|
||||
<ElSelect v-model="item.discount_currency" style="width: 61px">
|
||||
<ElOption
|
||||
v-for="c in currencyOptions"
|
||||
:key="c.currency_code"
|
||||
:label="c.currency_name"
|
||||
:value="c.currency_code"
|
||||
/>
|
||||
</ElSelect>
|
||||
</template>
|
||||
</ElInput>
|
||||
<ElInput v-model="item.discount_currency_snapshot" type="hidden" />
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
<ElCol :span="6" v-else>
|
||||
<ElFormItem label="二手减价" label-width="72px">
|
||||
<ElInput v-model="item.reduction_price" placeholder="请输入二手减价">
|
||||
<template #append>
|
||||
<ElSelect v-model="item.reduction_price_currency" style="width: 61px">
|
||||
<ElOption
|
||||
v-for="c in currencyOptions"
|
||||
:key="c.currency_code"
|
||||
:label="c.currency_name"
|
||||
:value="c.currency_code"
|
||||
/>
|
||||
</ElSelect>
|
||||
</template>
|
||||
</ElInput>
|
||||
<ElInput v-model="item.reduction_price_currency_snapshot" type="hidden" />
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
<ElCol :span="4">
|
||||
<ElFormItem label="利润" label-width="40px">
|
||||
<ElInput v-model="item.profit" placeholder="正在计算利润" disabled>
|
||||
<template #append> <span style="font-size: 11px">美元</span></template>
|
||||
</ElInput>
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
</ElRow>
|
||||
@@ -390,9 +409,9 @@
|
||||
<ElRow :gutter="12">
|
||||
<ElCol :span="4">
|
||||
<ElFormItem label="合计到岸价" label-width="85px">
|
||||
<ElInput v-model.number="baseForm.total_cif" placeholder="请输入合计到岸价">
|
||||
<ElInput v-model="baseForm.total_cif" placeholder="请输入合计到岸价">
|
||||
<template #append>
|
||||
<ElSelect v-model="baseForm.total_cif_currency" style="width: 64px">
|
||||
<ElSelect v-model="baseForm.total_cif_currency" style="width: 61px">
|
||||
<ElOption
|
||||
v-for="c in currencyOptions"
|
||||
:key="c.currency_code"
|
||||
@@ -407,7 +426,18 @@
|
||||
</ElCol>
|
||||
<ElCol :span="4">
|
||||
<ElFormItem label="合同汇率" label-width="70px">
|
||||
<ElInput v-model="baseForm.contract_exchange_rate" placeholder="请输入" />
|
||||
<ElInput v-model="baseForm.contract_exchange_rate" placeholder="请输入">
|
||||
<template #append>
|
||||
<ElSelect v-model="baseForm.contract_exchange_rate_currency" style="width: 61px">
|
||||
<ElOption
|
||||
v-for="c in currencyOptions"
|
||||
:key="c.currency_code"
|
||||
:label="c.currency_name"
|
||||
:value="c.currency_code"
|
||||
/>
|
||||
</ElSelect>
|
||||
</template>
|
||||
</ElInput>
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
</ElRow>
|
||||
@@ -445,14 +475,14 @@
|
||||
@change="
|
||||
(val) =>
|
||||
(baseForm.shipping_method_snapshot =
|
||||
(ncolorOptions || []).find((x: any) => x.id === val)?.item_label || '')
|
||||
(transportOptions || []).find((x: any) => x.item_value === val)?.item_label || '')
|
||||
"
|
||||
>
|
||||
<ElOption
|
||||
v-for="t in transportOptions"
|
||||
:key="t.id"
|
||||
:key="t.item_value"
|
||||
:label="t.item_label"
|
||||
:value="t.id"
|
||||
:value="t.item_value"
|
||||
/>
|
||||
</ElSelect>
|
||||
<ElInput v-model="baseForm.shipping_method_snapshot" type="hidden" />
|
||||
@@ -614,7 +644,7 @@
|
||||
</ElCol>
|
||||
<ElCol :span="4">
|
||||
<ElFormItem label="金额">
|
||||
<ElInput v-model.number="payment.amount" placeholder="请输入金额" />
|
||||
<ElInput v-model="payment.amount" placeholder="请输入金额" />
|
||||
</ElFormItem>
|
||||
</ElCol>
|
||||
</ElRow>
|
||||
@@ -635,10 +665,26 @@
|
||||
<span class="border"></span>
|
||||
<span class="title">上传合同</span>
|
||||
</div>
|
||||
<ElUpload drag action="#" :auto-upload="false" :show-file-list="true" class="upload-box">
|
||||
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
|
||||
<div class="el-upload__text">拖拽文件到此处,或点击上传</div>
|
||||
</ElUpload>
|
||||
<el-upload
|
||||
class="upload-box"
|
||||
:action="actionImageUplode"
|
||||
:headers="uploadHeaders"
|
||||
:show-file-list="false"
|
||||
:on-success="handleContractUpload"
|
||||
:before-upload="beforeContractUpload"
|
||||
accept=".jpg,.jpeg,.png,.gif,.pdf,.doc,.docx,.xls,.xlsx,.txt"
|
||||
>
|
||||
<div class="qrcode-upload-box">
|
||||
<img v-if="!contractFile" class="avatar" src="@/assets/img/crm/contract.png" />
|
||||
<div v-else class="file-preview">
|
||||
<img v-if="isImageFile(contractFile)" :src="contractFile.url" class="preview-image" />
|
||||
<div v-else class="file-icon">
|
||||
<i class="el-icon-document"></i>
|
||||
<span class="file-name">{{ contractFile.name }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-upload>
|
||||
</div>
|
||||
<div class="form-card">
|
||||
<!-- 底部信息 -->
|
||||
@@ -751,447 +797,82 @@
|
||||
<script setup lang="ts">
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { Search } from '@element-plus/icons-vue'
|
||||
import { CrmService } from '@/api/crmApi'
|
||||
import { commonService } from '@/api/commonApi'
|
||||
import { vehicleService } from '@/api/vehicleApi'
|
||||
import { StringDecoder } from 'string_decoder'
|
||||
import { useUserStore } from '@/store/modules/user'
|
||||
import { watch } from 'vue'
|
||||
import { useStockingForm } from '@/composables/useStockingForm'
|
||||
import { onMounted } from 'vue'
|
||||
|
||||
const { getUserInfo } = useUserStore()
|
||||
const channelOptions = ref<any>()
|
||||
const countryOptions = ref<any>()
|
||||
const modificationOptions = ref<any>()
|
||||
const currencyOptions = ref<any>()
|
||||
const accountOptions = ref<any>()
|
||||
const customerOptions = ref<any>()
|
||||
const portOptions = ref<any>()
|
||||
const portOptionsall = ref<any>()
|
||||
// 外观颜色
|
||||
const wcolorOptions = ref<Array<any>>([])
|
||||
// 内饰颜色
|
||||
const ncolorOptions = ref<Array<any>>([])
|
||||
//渠道
|
||||
const getgetChannel = async () => {
|
||||
const res = await CrmService.getChannel()
|
||||
channelOptions.value = res || []
|
||||
}
|
||||
//客户下拉
|
||||
const getcustomer = async () => {
|
||||
const res = await commonService.getCustomerSelect()
|
||||
customerOptions.value = res || []
|
||||
}
|
||||
|
||||
// 使用公共的备货单表单逻辑
|
||||
const {
|
||||
// 数据
|
||||
baseForm,
|
||||
items,
|
||||
paymentItems,
|
||||
contractFile,
|
||||
customerDialog,
|
||||
vehicleDialog,
|
||||
|
||||
// 选项数据
|
||||
channelOptions,
|
||||
countryOptions,
|
||||
modificationOptions,
|
||||
currencyOptions,
|
||||
accountOptions,
|
||||
customerOptions,
|
||||
portOptions,
|
||||
portOptionsall,
|
||||
wcolorOptions,
|
||||
ncolorOptions,
|
||||
transportOptions,
|
||||
trade_termsOptions,
|
||||
|
||||
// 上传相关
|
||||
actionImageUplode,
|
||||
uploadHeaders,
|
||||
|
||||
// 方法
|
||||
initializeForm,
|
||||
handleSubmit,
|
||||
getCurrencyRate,
|
||||
validateContractRate,
|
||||
wrapMoney,
|
||||
calcProfit,
|
||||
|
||||
// 合同文件方法
|
||||
isImageFile,
|
||||
beforeContractUpload,
|
||||
handleContractUpload,
|
||||
removeContractFile,
|
||||
|
||||
// 订单项方法
|
||||
copyRow,
|
||||
addRowAfter,
|
||||
removeRow,
|
||||
|
||||
// 收款项方法
|
||||
addPaymentItem,
|
||||
removePaymentItem,
|
||||
|
||||
// 客户选择方法
|
||||
openCustomerDialog,
|
||||
getCustomerList,
|
||||
handleCustomerSizeChange,
|
||||
handleCustomerCurrentChange,
|
||||
chooseCustomer,
|
||||
|
||||
// 车辆选择方法
|
||||
openVehicleDialog,
|
||||
getVehicleList,
|
||||
handleVehicleSizeChange,
|
||||
handleVehicleCurrentChange,
|
||||
chooseVehicle
|
||||
} = useStockingForm(false) // isFinal = false
|
||||
|
||||
//国家
|
||||
const getarea = async () => {
|
||||
const res = await CrmService.getCountry()
|
||||
countryOptions.value = res || []
|
||||
}
|
||||
//改装项
|
||||
const getmodification = async () => {
|
||||
const res = await commonService.getModificationSelect()
|
||||
modificationOptions.value = res || []
|
||||
}
|
||||
//颜色下拉列表
|
||||
const loadColorOptions = async () => {
|
||||
try {
|
||||
const res = await commonService.getColorSelect({ type: 1 })
|
||||
wcolorOptions.value = res
|
||||
const response = await commonService.getColorSelect({ type: 2 })
|
||||
ncolorOptions.value = response
|
||||
} catch (error) {
|
||||
console.error('获取颜色列表失败:', error)
|
||||
ElMessage.error('获取颜色列表失败')
|
||||
}
|
||||
}
|
||||
//账户
|
||||
const loadAccountOptions = async () => {
|
||||
try {
|
||||
const res = await commonService.getAccountSelect()
|
||||
accountOptions.value = res
|
||||
} catch (error) {
|
||||
console.error('获取账户列表失败:', error)
|
||||
ElMessage.error('获取账户列表失败')
|
||||
}
|
||||
}
|
||||
//币种
|
||||
const loadCurrencyOptions = async () => {
|
||||
try {
|
||||
const res = await commonService.getCurrencySelect()
|
||||
currencyOptions.value = res
|
||||
} catch (error) {
|
||||
console.error('获取币种列表失败:', error)
|
||||
ElMessage.error('获取币种列表失败')
|
||||
}
|
||||
}
|
||||
//港口
|
||||
const loadPortOptions = async () => {
|
||||
try {
|
||||
const res = await commonService.getPortSelect({ scene: 'domestic' })
|
||||
const resall = await commonService.getPortSelect({})
|
||||
portOptions.value = res
|
||||
portOptionsall.value = resall
|
||||
} catch (error) {
|
||||
console.error('获取港口列表失败:', error)
|
||||
ElMessage.error('获取港口列表失败')
|
||||
}
|
||||
}
|
||||
//字典下拉框
|
||||
const transportOptions = ref<Array<any>>([])
|
||||
const trade_termsOptions = ref<Array<any>>([])
|
||||
const loadDictOptions = async () => {
|
||||
const response = await commonService.getDictSelect({ scope: '2,15' })
|
||||
transportOptions.value = response.transport
|
||||
trade_termsOptions.value = response.trade_terms
|
||||
}
|
||||
// 初始化表单
|
||||
onMounted(async () => {
|
||||
getcustomer()
|
||||
await loadCurrencyOptions()
|
||||
getgetChannel()
|
||||
getarea()
|
||||
getmodification()
|
||||
loadColorOptions()
|
||||
loadAccountOptions()
|
||||
loadPortOptions()
|
||||
loadDictOptions()
|
||||
// 设置默认汇率
|
||||
baseForm.contract_exchange_rate = getCurrencyRate('USD')
|
||||
await initializeForm()
|
||||
})
|
||||
const getCurrencyRate = (code: string): string => {
|
||||
try {
|
||||
const found = (currencyOptions?.value || []).find((c: any) => c.currency_code === code)
|
||||
return found?.rate || found?.exchange_rate || ''
|
||||
} catch (e) {
|
||||
return ''
|
||||
}
|
||||
}
|
||||
const baseForm = reactive({
|
||||
pi_no: '',
|
||||
biz_date: '',
|
||||
clearance_country_id: '',
|
||||
clearance_country_snapshot: '',
|
||||
customer_source_id: '',
|
||||
customer_source_snapshot: '',
|
||||
customer_id: '',
|
||||
customer_snapshot: '',
|
||||
customer_country_id: '',
|
||||
customer_country_snapshot: '',
|
||||
declarant_name: '',
|
||||
eta_ship_date: '',
|
||||
shipping_method_id: '',
|
||||
shipping_method_snapshot: '',
|
||||
domestic_port_id: '',
|
||||
domestic_port_snapshot: '',
|
||||
trade_term_id: '',
|
||||
trade_term_snapshot: '',
|
||||
clearance_port_id: '',
|
||||
clearance_port_snapshot: '',
|
||||
latest_arrival_date: '',
|
||||
contract_exchange_rate: '',
|
||||
remark: '',
|
||||
total_cif: undefined as number | undefined,
|
||||
total_cif_currency: 'USD',
|
||||
total_cif_currency_snapshot: '',
|
||||
is_final: '0'
|
||||
})
|
||||
type ItemRow = {
|
||||
sku_id: string
|
||||
model_snapshot: string
|
||||
color_interior_code: string
|
||||
color_interior_snapshot: string
|
||||
color_exterior_code: string
|
||||
color_exterior_snapshot: string
|
||||
unit_price: number | undefined
|
||||
handling_fee: string
|
||||
fob_transport_fee: number | undefined
|
||||
port_misc_fee: string
|
||||
retrofit_fee: string
|
||||
total_price: number | undefined
|
||||
official_price: number | undefined
|
||||
discount_price: number | undefined
|
||||
fob_fee: number | undefined
|
||||
fob_fee_currency: string
|
||||
fob_fee_currency_snapshot: string
|
||||
helper_fee: number | undefined
|
||||
helper_fee_currency: string
|
||||
helper_fee_currency_snapshot: string
|
||||
domestic_freight: number | undefined
|
||||
domestic_freight_currency: string
|
||||
domestic_freight_currency_snapshot: string
|
||||
port_fee: number | undefined
|
||||
port_fee_currency: string
|
||||
port_fee_currency_snapshot: string
|
||||
unit_price_currency: string
|
||||
unit_price_currency_snapshot: string
|
||||
total_price_currency: string
|
||||
total_price_currency_snapshot: string
|
||||
guide_price_currency: string
|
||||
guide_price_currency_snapshot: string
|
||||
discount: number | undefined
|
||||
discount_currency: string
|
||||
discount_currency_snapshot: string
|
||||
contract_rate: number | undefined
|
||||
profit_type: string
|
||||
profit_type_snapshot: string
|
||||
modify_ids: string[]
|
||||
modify_list: Array<{ option_id: string; option_name_snapshot: string }>
|
||||
modify_fee_currency: string
|
||||
modify_fee_currency_snapshot: string
|
||||
}
|
||||
|
||||
const newItem = (): ItemRow => ({
|
||||
sku_id: '',
|
||||
model_snapshot: '',
|
||||
color_interior_code: '',
|
||||
color_interior_snapshot: '',
|
||||
color_exterior_code: '',
|
||||
color_exterior_snapshot: '',
|
||||
unit_price: undefined,
|
||||
handling_fee: '',
|
||||
fob_transport_fee: undefined,
|
||||
port_misc_fee: '',
|
||||
retrofit_fee: '',
|
||||
total_price: undefined,
|
||||
official_price: undefined,
|
||||
discount_price: undefined,
|
||||
fob_fee: undefined,
|
||||
fob_fee_currency: 'USD',
|
||||
fob_fee_currency_snapshot: '',
|
||||
helper_fee: undefined,
|
||||
helper_fee_currency: 'USD',
|
||||
helper_fee_currency_snapshot: '',
|
||||
domestic_freight: undefined,
|
||||
domestic_freight_currency: 'USD',
|
||||
domestic_freight_currency_snapshot: '',
|
||||
port_fee: undefined,
|
||||
port_fee_currency: 'USD',
|
||||
port_fee_currency_snapshot: '',
|
||||
unit_price_currency: 'USD',
|
||||
unit_price_currency_snapshot: '',
|
||||
total_price_currency: 'USD',
|
||||
total_price_currency_snapshot: '',
|
||||
guide_price_currency: 'USD',
|
||||
guide_price_currency_snapshot: '',
|
||||
discount: undefined,
|
||||
discount_currency: 'USD',
|
||||
discount_currency_snapshot: '',
|
||||
contract_rate: 7.16,
|
||||
profit_type: 'calc',
|
||||
profit_type_snapshot: '',
|
||||
modify_ids: [],
|
||||
modify_list: [],
|
||||
modify_fee_currency: 'USD',
|
||||
modify_fee_currency_snapshot: ''
|
||||
})
|
||||
|
||||
const items = ref<ItemRow[]>([newItem()])
|
||||
|
||||
const copyRow = (idx: number) => {
|
||||
const copied = JSON.parse(JSON.stringify(items.value[idx])) as ItemRow
|
||||
copied.uid = Math.random().toString(36).slice(2)
|
||||
items.value.splice(idx + 1, 0, copied)
|
||||
}
|
||||
const addRowAfter = (idx: number) => {
|
||||
items.value.splice(idx + 1, 0, newItem())
|
||||
}
|
||||
const removeRow = (idx: number) => {
|
||||
items.value.splice(idx, 1)
|
||||
}
|
||||
// 监听币种变化,自动更新汇率
|
||||
watch(
|
||||
() => items.value[0].unit_price_currency,
|
||||
(newCurrency) => {
|
||||
if (newCurrency) {
|
||||
baseForm.contract_exchange_rate = getCurrencyRate(newCurrency)
|
||||
}
|
||||
}
|
||||
)
|
||||
type PaymentItem = {
|
||||
remit_country_id: string
|
||||
remit_country_name_snapshot: string
|
||||
remit_date: string
|
||||
currency_code: string
|
||||
currency_name_snapshot: string
|
||||
account_id: string
|
||||
account_name_snapshot: string
|
||||
remitter_name: string
|
||||
amount: number | undefined
|
||||
}
|
||||
|
||||
const newPaymentItem = (): PaymentItem => ({
|
||||
remit_country_id: '',
|
||||
remit_country_name_snapshot: '',
|
||||
remit_date: '',
|
||||
currency_code: '',
|
||||
currency_name_snapshot: '',
|
||||
account_id: '',
|
||||
account_name_snapshot: '',
|
||||
remitter_name: '',
|
||||
amount: undefined
|
||||
})
|
||||
|
||||
const paymentItems = ref<PaymentItem[]>([newPaymentItem()])
|
||||
|
||||
const addPaymentItem = () => {
|
||||
paymentItems.value.push(newPaymentItem())
|
||||
}
|
||||
|
||||
const removePaymentItem = (idx: number) => {
|
||||
if (paymentItems.value.length > 1) {
|
||||
paymentItems.value.splice(idx, 1)
|
||||
}
|
||||
}
|
||||
|
||||
const wrapMoney = (amount: any, currency: string, remark: string) => ({
|
||||
currency: currency || '',
|
||||
amount: amount === undefined || amount === null ? '' : String(amount),
|
||||
rate: getCurrencyRate(currency),
|
||||
remark
|
||||
})
|
||||
|
||||
const handleSubmit = async () => {
|
||||
const mappedItems = items.value.map((it) => ({
|
||||
sku_id: it.sku_id,
|
||||
model_snapshot: it.model_snapshot,
|
||||
color_interior_code: it.color_interior_code,
|
||||
color_interior_snapshot: it.color_interior_snapshot,
|
||||
color_exterior_code: it.color_exterior_code,
|
||||
color_exterior_snapshot: it.color_exterior_snapshot,
|
||||
unit_price: wrapMoney(it.unit_price, (it as any).unit_price_currency, '单价'),
|
||||
handling_fee: wrapMoney(it.handling_fee, (it as any).helper_fee_currency, '手续费'),
|
||||
fob_transport_fee: wrapMoney(
|
||||
it.fob_transport_fee ?? (it as any).fob_fee,
|
||||
(it as any).fob_fee_currency,
|
||||
'FOB运输费'
|
||||
),
|
||||
port_misc_fee: wrapMoney(
|
||||
it.port_misc_fee ?? (it as any).port_fee,
|
||||
(it as any).port_fee_currency,
|
||||
'港杂费'
|
||||
),
|
||||
retrofit_fee: wrapMoney((it as any).retrofit_fee, (it as any).modify_fee_currency, '单价'),
|
||||
modify_list: it.modify_list,
|
||||
total_price: wrapMoney(it.total_price, (it as any).total_price_currency, '总价'),
|
||||
official_price: wrapMoney(
|
||||
(it as any).official_price ?? (it as any).guide_price,
|
||||
(it as any).guide_price_currency,
|
||||
'官方指导价'
|
||||
),
|
||||
discount_price: wrapMoney(
|
||||
(it as any).discount_price ?? (it as any).discount,
|
||||
(it as any).discount_currency,
|
||||
'优惠额'
|
||||
)
|
||||
}))
|
||||
|
||||
const payload = {
|
||||
...baseForm,
|
||||
veh_list: mappedItems,
|
||||
account_list: paymentItems.value
|
||||
}
|
||||
console.log('submit payload', payload)
|
||||
// const { message } = await CrmService.addStock(payload)
|
||||
// ElMessage.success(message)
|
||||
}
|
||||
// 选择客户弹框逻辑
|
||||
const customerDialog = reactive({
|
||||
visible: false,
|
||||
search: { keyword: '' },
|
||||
loading: false,
|
||||
tableData: [] as any[],
|
||||
pagination: { currentPage: 1, pageSize: 10, total: 0 }
|
||||
})
|
||||
const openCustomerDialog = () => {
|
||||
customerDialog.visible = true
|
||||
customerDialog.pagination.currentPage = 1
|
||||
getCustomerList()
|
||||
}
|
||||
const getCustomerList = async () => {
|
||||
customerDialog.loading = true
|
||||
try {
|
||||
const { currentPage, pageSize } = customerDialog.pagination
|
||||
const params = { current: currentPage, size: pageSize, keyword: customerDialog.search.keyword }
|
||||
const { data, current, size, total } = await CrmService.getcustomerList(params as any)
|
||||
customerDialog.tableData = data || []
|
||||
Object.assign(customerDialog.pagination, { currentPage: current, pageSize: size, total })
|
||||
} catch (e) {
|
||||
} finally {
|
||||
customerDialog.loading = false
|
||||
}
|
||||
}
|
||||
const handleCustomerSizeChange = (size: number) => {
|
||||
customerDialog.pagination.pageSize = size
|
||||
getCustomerList()
|
||||
}
|
||||
const handleCustomerCurrentChange = (page: number) => {
|
||||
customerDialog.pagination.currentPage = page
|
||||
getCustomerList()
|
||||
}
|
||||
const chooseCustomer = (row: any) => {
|
||||
baseForm.customer_id = row.id || ''
|
||||
baseForm.customer_snapshot = row.contacts || row.name || ''
|
||||
customerDialog.visible = false
|
||||
}
|
||||
|
||||
// 选择车型弹框逻辑
|
||||
const vehicleDialog = reactive({
|
||||
visible: false,
|
||||
targetIndex: -1,
|
||||
search: { keyword: '' },
|
||||
loading: false,
|
||||
tableData: [] as any[],
|
||||
pagination: { currentPage: 1, pageSize: 10, total: 0 }
|
||||
})
|
||||
|
||||
const openVehicleDialog = (index: number) => {
|
||||
vehicleDialog.targetIndex = index
|
||||
vehicleDialog.visible = true
|
||||
vehicleDialog.pagination.currentPage = 1
|
||||
getVehicleList()
|
||||
}
|
||||
|
||||
const getVehicleList = async () => {
|
||||
vehicleDialog.loading = true
|
||||
try {
|
||||
const { currentPage, pageSize } = vehicleDialog.pagination
|
||||
const params = { current: currentPage, size: pageSize, keyword: vehicleDialog.search.keyword }
|
||||
const { records, current, size, total } = await vehicleService.getVehicleList(params)
|
||||
vehicleDialog.tableData = records || []
|
||||
Object.assign(vehicleDialog.pagination, { currentPage: current, pageSize: size, total })
|
||||
} catch (e) {
|
||||
ElMessage.error('获取车辆列表失败')
|
||||
} finally {
|
||||
vehicleDialog.loading = false
|
||||
}
|
||||
}
|
||||
|
||||
const handleVehicleSizeChange = (size: number) => {
|
||||
vehicleDialog.pagination.pageSize = size
|
||||
getVehicleList()
|
||||
}
|
||||
const handleVehicleCurrentChange = (page: number) => {
|
||||
vehicleDialog.pagination.currentPage = page
|
||||
getVehicleList()
|
||||
}
|
||||
|
||||
const chooseVehicle = (row: any) => {
|
||||
const idx = vehicleDialog.targetIndex
|
||||
if (idx >= 0 && idx < items.value.length) {
|
||||
const target = items.value[idx]
|
||||
target.sku_id = row.id || ''
|
||||
target.model_snapshot = row.model_name || row.name || ''
|
||||
// 回显颜色与指导价
|
||||
target.color_exterior_code = row.color_exterior_code || ''
|
||||
target.color_exterior_snapshot = row.color_exterior_text || ''
|
||||
target.color_interior_code = row.color_interior_code || ''
|
||||
target.color_interior_snapshot = row.color_interior_text || ''
|
||||
target.official_price = row.msrp ?? target.official_price
|
||||
if (row.currency) {
|
||||
target.official_price_currency = row.currency
|
||||
}
|
||||
// 可按需带出更多字段回显
|
||||
}
|
||||
vehicleDialog.visible = false
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
@@ -1199,7 +880,7 @@
|
||||
padding: 4px;
|
||||
}
|
||||
:deep(.el-select__selected-item span) {
|
||||
font-size: 12px;
|
||||
font-size: 11px;
|
||||
}
|
||||
.form-title {
|
||||
font-weight: bold;
|
||||
@@ -1210,7 +891,6 @@
|
||||
margin-left: 6px;
|
||||
}
|
||||
.stocking-add-page {
|
||||
// background: var(--art-main-bg-color);
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
@@ -1273,5 +953,49 @@
|
||||
.payment-item {
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
.upload-box { width: 200px; }
|
||||
</style>
|
||||
.upload-box {
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
.file-preview {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.preview-image {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.file-icon {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: #f5f7fa;
|
||||
border-radius: 4px;
|
||||
border: 1px dashed #d9d9d9;
|
||||
}
|
||||
|
||||
.file-icon i {
|
||||
font-size: 32px;
|
||||
color: #409eff;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.file-name {
|
||||
font-size: 12px;
|
||||
color: #606266;
|
||||
text-align: center;
|
||||
word-break: break-all;
|
||||
padding: 0 8px;
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user