判断是否有签名换到长链接推送 然后添加 报关价 预估退税计算

This commit is contained in:
浅念
2025-10-14 14:43:09 +08:00
parent 153bb37d10
commit 16abb6364c
10 changed files with 829 additions and 236 deletions
+122 -24
View File
@@ -9,7 +9,7 @@
<span class="border"></span>
<span class="title">基础信息</span>
</div>
<ElForm :model="baseForm" class="base-form" label-position="right">
<ElForm :model="baseForm" :rules="baseFormRules" ref="baseFormRef" class="base-form" label-position="right">
<ElRow :gutter="12">
<ElCol :sm="12" :md="12" :lg="6" :xl="4">
<ElFormItem label="阿里订单号/PI号" label-width="114px">
@@ -17,7 +17,7 @@
</ElFormItem>
</ElCol>
<ElCol :sm="12" :md="12" :lg="6" :xl="4">
<ElFormItem label="日期" label-width="114px">
<ElFormItem label="日期" label-width="114px" prop="biz_date" required>
<ElDatePicker
v-model="baseForm.biz_date"
type="date"
@@ -29,7 +29,7 @@
</ElFormItem>
</ElCol>
<ElCol :sm="12" :md="12" :lg="6" :xl="4">
<ElFormItem label="清关目的国" label-width="114px">
<ElFormItem label="清关目的国" label-width="114px" prop="clearance_country_id" required>
<el-select
v-model="baseForm.clearance_country_id"
filterable
@@ -51,7 +51,7 @@
</ElFormItem>
</ElCol>
<ElCol :sm="12" :md="12" :lg="6" :xl="4">
<ElFormItem label="客户名称" label-width="114px">
<ElFormItem label="客户名称" label-width="114px" prop="customer_id" required>
<ElInput
v-model="baseForm.customer_snapshot"
placeholder="请选择客户"
@@ -124,11 +124,11 @@
<span class="border"></span>
<span class="title">订单详情</span>
</div>
<ElForm class="items-wrap" label-position="right">
<ElForm :model="formModel" :rules="itemRules" ref="itemsFormRef" class="items-wrap" label-position="right">
<div class="item-row form-box" v-for="(item, idx) in items" :key="idx">
<ElRow :gutter="12" class="item-row-wrap">
<ElCol :sm="12" :md="12" :lg="6" :xl="4">
<ElFormItem label="车型" label-width="85px">
<ElFormItem label="车型" label-width="85px" :prop="'items.' + idx + '.sku_id'" required>
<ElInput
v-model="item.model_snapshot"
placeholder="请选择车型"
@@ -144,7 +144,7 @@
</ElFormItem>
</ElCol>
<ElCol :sm="12" :md="12" :lg="6" :xl="4">
<ElFormItem label="颜色/外饰" label-width="85px">
<ElFormItem label="颜色/外饰" label-width="85px" :prop="'items.' + idx + '.color_exterior_snapshot'" required>
<el-select
v-model="item.color_exterior_snapshot"
filterable
@@ -167,7 +167,7 @@
</ElFormItem>
</ElCol>
<ElCol :sm="12" :md="12" :lg="6" :xl="4">
<ElFormItem label="颜色/内饰" label-width="85px">
<ElFormItem label="颜色/内饰" label-width="85px" :prop="'items.' + idx + '.color_interior_snapshot'" required>
<el-select
v-model="item.color_interior_snapshot"
filterable
@@ -220,7 +220,7 @@
</ElRow>
<ElRow :gutter="12" class="item-row-wrap">
<ElCol :sm="12" :md="12" :lg="6" :xl="4" v-if="(item.mileage ?? 0) <= 0">
<ElFormItem label="官方指导价" label-width="85px">
<ElFormItem label="官方指导价" label-width="85px" :prop="'items.' + idx + '.official_price'" required>
<ElInput v-model="item.official_price" placeholder="请输入官方指导价">
<template #suffix>
<ElSelect v-model="item.guide_price_currency" style="width: 64px;border: none;">
@@ -237,7 +237,7 @@
</ElFormItem>
</ElCol>
<ElCol :sm="12" :md="12" :lg="6" :xl="4" v-else>
<ElFormItem label="二手挂牌价" label-width="85px">
<ElFormItem label="二手挂牌价" label-width="85px" :prop="'items.' + idx + '.listing_price'" required>
<ElInput v-model="item.listing_price" placeholder="请输入二手挂牌价">
<template #suffix>
<ElSelect v-model="item.listing_price_currency" style="width: 64px">
@@ -411,7 +411,7 @@
<ElCol :sm="12" :md="12" :lg="6" :xl="4">
<ElFormItem label="预估退税额" label-width="85px">
<ElInput v-model="item.tax_refund" placeholder="请输入预估退税额">
<template #suffix>
<!-- <template #suffix>
<ElSelect v-model="item.tax_refund_currency" style="width: 64px">
<ElOption
v-for="c in currencyOptions"
@@ -420,6 +420,14 @@
:value="c.currency_code"
/>
</ElSelect>
</template> -->
<template #suffix>
<span style="font-size: 11px">
{{
((currencyOptions || []).find((c: any) => c.currency_code === baseForm.settlement_currency)?.currency_name) ||
baseForm.settlement_currency
}}
</span>
</template>
</ElInput>
<ElInput v-model="item.tax_refund_currency_snapshot" type="hidden" />
@@ -428,7 +436,7 @@
</ElRow>
<ElRow :gutter="12" class="item-row-wrap">
<ElCol :sm="12" :md="12" :lg="6" :xl="4">
<ElFormItem label="成交价" label-width="85px">
<ElFormItem label="成交价" label-width="85px" :prop="'items.' + idx + '.unit_price'" required>
<ElInput v-model="item.unit_price" placeholder="请输入成交价">
<template #suffix>
<ElSelect v-model="item.unit_price_currency" style="width: 64px">
@@ -480,6 +488,24 @@
</ElInput>
</ElFormItem>
</ElCol>
<ElCol :sm="12" :md="12" :lg="6" :xl="4">
<ElFormItem label="报关价" label-width="85px">
<ElInput
v-model="item.clearance_price"
placeholder="正在计算报关价"
:class="Number(item.clearance_price) < 0 ? 'profit-negative' : ''"
>
<template #suffix>
<span style="font-size: 11px">
{{
((currencyOptions || []).find((c: any) => c.currency_code === baseForm.settlement_currency)?.currency_name) ||
baseForm.settlement_currency
}}
</span>
</template>
</ElInput>
</ElFormItem>
</ElCol>
<ElCol :sm="12" :md="12" :lg="6" :xl="4">
<ElFormItem label="车架号" label-width="85px">
<ElInput v-model="item.vin" placeholder="请输入车架号"></ElInput>
@@ -537,15 +563,15 @@
<span class="border"></span>
<span class="title">运输详情</span>
</div>
<ElForm :model="baseForm" class="foot-form">
<ElForm :model="baseForm" :rules="transportFormRules" ref="transportFormRef" class="foot-form">
<ElRow :gutter="12">
<ElCol :sm="12" :md="12" :lg="6" :xl="4">
<ElFormItem label="清关人" label-width="98px">
<ElFormItem label="清关人" label-width="98px" prop="declarant_name" required>
<ElInput v-model="baseForm.declarant_name" placeholder="请输入清关人" />
</ElFormItem>
</ElCol>
<ElCol :sm="12" :md="12" :lg="6" :xl="4">
<ElFormItem label="全款收齐日" label-width="98px">
<ElFormItem label="全款收齐日" label-width="98px" prop="collect_all_date" required>
<ElDatePicker
v-model="baseForm.collect_all_date"
value-format="YYYY-MM-DD"
@@ -557,7 +583,7 @@
</ElFormItem>
</ElCol>
<ElCol :sm="12" :md="12" :lg="6" :xl="4">
<ElFormItem label="国内收货港" label-width="98px">
<ElFormItem label="国内收货港" label-width="98px" prop="domestic_port_id" required>
<ElSelect
v-model="baseForm.domestic_port_id"
placeholder="请选择国内收货商"
@@ -578,7 +604,7 @@
</ElFormItem>
</ElCol>
<ElCol :sm="12" :md="12" :lg="6" :xl="4">
<ElFormItem label="运输方式" label-width="98px">
<ElFormItem label="运输方式" label-width="98px" prop="shipping_method_id" required>
<ElSelect
v-model="baseForm.shipping_method_id"
placeholder="请选择运输方式"
@@ -600,7 +626,7 @@
</ElFormItem>
</ElCol>
<ElCol :sm="12" :md="12" :lg="6" :xl="4">
<ElFormItem label="贸易条款" label-width="98px">
<ElFormItem label="贸易条款" label-width="98px" prop="trade_term_id" required>
<ElSelect
v-model="baseForm.trade_term_id"
placeholder="请选择"
@@ -621,7 +647,7 @@
</ElFormItem>
</ElCol>
<ElCol :sm="12" :md="12" :lg="6" :xl="4">
<ElFormItem label="清关目的港" label-width="98px">
<ElFormItem label="清关目的港" label-width="98px" prop="clearance_port_id" required>
<ElSelect
v-model="baseForm.clearance_port_id"
placeholder="请选择"
@@ -642,7 +668,7 @@
</ElFormItem>
</ElCol>
<ElCol :sm="12" :md="12" :lg="6" :xl="4">
<ElFormItem label="提车日期" label-width="98px">
<ElFormItem label="提车日期" label-width="98px" prop="pick_up_date" required>
<ElDatePicker
v-model="baseForm.pick_up_date"
type="date"
@@ -664,7 +690,7 @@
<div class="payment-section">
<div class="payment-items">
<div v-for="(payment, idx) in paymentItems" :key="idx" class="payment-item">
<ElForm :model="payment" label-width="55px" class="payment-form">
<ElForm :model="payment" :rules="paymentFormRules" :ref="(el) => setPaymentFormRef(el, idx)" label-width="55px" class="payment-form">
<ElRow :gutter="12">
<ElCol :sm="12" :md="12" :lg="6" :xl="6">
<ElFormItem label="汇款人" label-width="55px">
@@ -807,14 +833,14 @@
plain
size="large"
class="submit-btn"
@click="handleSubmit(0, undefined, '1')"
@click="handleSubmitWithValidation(0)"
>保存</ElButton
>
<ElButton
type="primary"
size="large"
class="submit-btn"
@click="handleSubmit(1, undefined, '1')"
@click="handleSubmitWithValidation(1)"
>提交</ElButton
>
</div>
@@ -930,13 +956,70 @@
import { CrmService } from '@/api/crmApi'
import { useUserStore } from '@/store/modules/user'
import { useStockingForm } from '@/composables/useStockingForm'
import { onMounted } from 'vue'
import { onMounted, ref, computed } from 'vue'
defineOptions({ name: 'CrmStockingFinalAdd' }) // 定义组件名称,用于 KeepAlive 缓存控制
const route = useRoute()
const stocking_id = route.query.id
const { getUserInfo } = useUserStore()
// 表单引用
const baseFormRef = ref()
const itemsFormRef = ref()
const transportFormRef = ref()
const paymentFormRefs = ref<any[]>([])
const setPaymentFormRef = (el: any, idx: number) => {
if (el) paymentFormRefs.value[idx] = el
}
// 表单模型
const formModel = computed(() => ({ items: items.value }))
// 基础表单校验
const baseFormRules = {
biz_date: [{ required: true, message: '请选择日期', trigger: 'change' }],
clearance_country_id: [{ required: true, message: '请选择清关目的国', trigger: 'change' }],
customer_id: [{ required: true, message: '请选择客户', trigger: 'change' }]
}
// 明细动态校验
const itemRules = computed(() => {
const rules: any = {}
items.value.forEach((_, idx) => {
rules[`items.${idx}.sku_id`] = [{ required: true, message: '请选择车型', trigger: 'change' }]
rules[`items.${idx}.color_exterior_snapshot`] = [
{ required: true, message: '请选择颜色/外饰', trigger: 'change' }
]
rules[`items.${idx}.color_interior_snapshot`] = [
{ required: true, message: '请选择颜色/内饰', trigger: 'change' }
]
rules[`items.${idx}.official_price`] = [
{ required: true, message: '请输入官方指导价', trigger: 'blur' }
]
rules[`items.${idx}.listing_price`] = [
{ required: true, message: '请输入二手挂牌价', trigger: 'blur' }
]
rules[`items.${idx}.unit_price`] = [
{ required: true, message: '请输入成交价', trigger: 'blur' }
]
})
return rules
})
// 运输详情校验
const transportFormRules = {
declarant_name: [{ required: true, message: '请输入清关人', trigger: 'blur' }],
collect_all_date: [{ required: true, message: '请选择全款收齐日', trigger: 'change' }],
domestic_port_id: [{ required: true, message: '请选择国内收货港', trigger: 'change' }],
shipping_method_id: [{ required: true, message: '请选择运输方式', trigger: 'change' }],
trade_term_id: [{ required: true, message: '请选择贸易条款', trigger: 'change' }],
clearance_port_id: [{ required: true, message: '请选择清关目的港', trigger: 'change' }],
pick_up_date: [{ required: true, message: '请选择提车日期', trigger: 'change' }]
}
// 收款信息校验(最终页为回显,不强校验;保留以便需要时启用)
const paymentFormRules = {
remitter_name: [{ required: true, message: '请输入汇款人', trigger: 'blur' }],
remit_country_id: [{ required: true, message: '请选择汇款国', trigger: 'change' }],
remit_date: [{ required: true, message: '请选择汇款日期', trigger: 'change' }],
account_id: [{ required: true, message: '请选择账户', trigger: 'change' }],
amount: [{ required: true, message: '请输入金额', trigger: 'blur' }]
}
// 使用公共的备货单表单逻辑
const {
// 数据
@@ -1005,6 +1088,21 @@
await getdetilfn()
}
})
// 提交前统一校验
const handleSubmitWithValidation = async (type: number) => {
try {
await baseFormRef.value?.validate()
await itemsFormRef.value?.validate()
await transportFormRef.value?.validate()
for (let i = 0; i < paymentItems.value.length; i++) {
const refForm = paymentFormRefs.value[i]
if (refForm) await refForm.validate()
}
await handleSubmit(type, undefined, '1')
} catch (e) {
// 校验失败不提交
}
}
</script>
<style scoped lang="scss">