This commit is contained in:
@@ -29,6 +29,7 @@
|
||||
:marginTop="10"
|
||||
:actions="getActions"
|
||||
:actionsWidth="150"
|
||||
height="70vh"
|
||||
:inlineActionsCount="2"
|
||||
>
|
||||
<template #default>
|
||||
@@ -99,10 +100,6 @@
|
||||
<ElFormItem label="成本价(元)" prop="cost_price_yuan">
|
||||
<ElInputNumber
|
||||
v-model="packageForm.cost_price_yuan"
|
||||
:min="packageForm.original_cost_price || 0"
|
||||
:max="
|
||||
packageForm.original_cost_price ? packageForm.original_cost_price * 1.5 : undefined
|
||||
"
|
||||
:precision="2"
|
||||
:step="0.01"
|
||||
:controls="false"
|
||||
@@ -110,10 +107,8 @@
|
||||
placeholder="请输入成本价"
|
||||
/>
|
||||
<div v-if="packageForm.original_cost_price" class="form-tip">
|
||||
原价: ¥{{ packageForm.original_cost_price.toFixed(2) }}, 最高: ¥{{
|
||||
(packageForm.original_cost_price * 1.5).toFixed(2)
|
||||
}}
|
||||
(50%溢价)
|
||||
请参考{{ packageForm.package_name || '套餐' }} - 套餐成本价:
|
||||
¥{{ packageForm.original_cost_price.toFixed(2) }}
|
||||
</div>
|
||||
</ElFormItem>
|
||||
</ElForm>
|
||||
@@ -132,7 +127,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, computed, onMounted } from 'vue'
|
||||
import { ref, computed, onMounted, watch, nextTick } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import {
|
||||
ElCard,
|
||||
@@ -176,15 +171,42 @@
|
||||
const packageDialogVisible = ref(false)
|
||||
const packageDialogType = ref<'add' | 'edit'>('add')
|
||||
|
||||
const packageForm = ref<{
|
||||
type PackageFormState = {
|
||||
package_id?: number
|
||||
package_name?: string
|
||||
package_code?: string
|
||||
cost_price_yuan: number
|
||||
original_cost_price?: number
|
||||
}>({
|
||||
suggested_retail_price?: number
|
||||
}
|
||||
|
||||
const createDefaultPackageForm = (): PackageFormState => ({
|
||||
package_id: undefined,
|
||||
package_name: undefined,
|
||||
package_code: undefined,
|
||||
cost_price_yuan: 0
|
||||
})
|
||||
const packageForm = ref<PackageFormState>(createDefaultPackageForm())
|
||||
|
||||
const assignPackageForm = (values: Partial<PackageFormState> = {}) => {
|
||||
Object.assign(packageForm.value, createDefaultPackageForm(), values)
|
||||
}
|
||||
|
||||
const resolvePackagePricing = (row?: GrantPackageInfo) => {
|
||||
const pkgOption = availablePackages.value.find((p) => p.id === row?.package_id)
|
||||
const currentCostPrice = row?.cost_price !== undefined ? row.cost_price / 100 : 0
|
||||
|
||||
return {
|
||||
original_cost_price:
|
||||
pkgOption?.cost_price !== undefined && pkgOption?.cost_price !== null
|
||||
? pkgOption.cost_price / 100
|
||||
: currentCostPrice,
|
||||
suggested_retail_price:
|
||||
pkgOption?.suggested_retail_price !== undefined && pkgOption?.suggested_retail_price !== null
|
||||
? pkgOption.suggested_retail_price / 100
|
||||
: undefined
|
||||
}
|
||||
}
|
||||
|
||||
const packageRules = computed<FormRules>(() => ({
|
||||
package_id: [
|
||||
@@ -198,22 +220,6 @@
|
||||
callback(new Error('请输入成本价'))
|
||||
} else if (value < 0) {
|
||||
callback(new Error('成本价不能小于0'))
|
||||
} else if (
|
||||
packageForm.value.original_cost_price &&
|
||||
value < packageForm.value.original_cost_price
|
||||
) {
|
||||
callback(
|
||||
new Error(`成本价不能低于原价 ¥${packageForm.value.original_cost_price.toFixed(2)}`)
|
||||
)
|
||||
} else if (
|
||||
packageForm.value.original_cost_price &&
|
||||
value > packageForm.value.original_cost_price * 1.5
|
||||
) {
|
||||
callback(
|
||||
new Error(
|
||||
`成本价不能高于原价的50%溢价(最高:¥${(packageForm.value.original_cost_price * 1.5).toFixed(2)})`
|
||||
)
|
||||
)
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
@@ -270,28 +276,26 @@
|
||||
|
||||
const showAddPackageDialog = () => {
|
||||
packageDialogType.value = 'add'
|
||||
packageForm.value = {
|
||||
package_id: undefined,
|
||||
cost_price_yuan: 0
|
||||
}
|
||||
assignPackageForm()
|
||||
loadAvailablePackages()
|
||||
packageDialogVisible.value = true
|
||||
nextTick(() => packageFormRef.value?.clearValidate())
|
||||
}
|
||||
|
||||
const showEditPackageDialog = (row: GrantPackageInfo) => {
|
||||
packageDialogType.value = 'edit'
|
||||
const packagePricing = resolvePackagePricing(row)
|
||||
|
||||
const pkgOption = availablePackages.value.find((p) => p.id === row.package_id)
|
||||
const originalCostPrice = pkgOption?.cost_price ? pkgOption.cost_price / 100 : 0
|
||||
|
||||
packageForm.value = {
|
||||
assignPackageForm({
|
||||
package_id: row.package_id,
|
||||
package_name: row.package_name,
|
||||
package_code: row.package_code,
|
||||
cost_price_yuan: row.cost_price / 100,
|
||||
original_cost_price: originalCostPrice
|
||||
}
|
||||
original_cost_price: packagePricing.original_cost_price,
|
||||
suggested_retail_price: packagePricing.suggested_retail_price
|
||||
})
|
||||
packageDialogVisible.value = true
|
||||
nextTick(() => packageFormRef.value?.clearValidate())
|
||||
}
|
||||
|
||||
const loadAvailablePackages = async (packageName?: string) => {
|
||||
@@ -330,6 +334,28 @@
|
||||
return packageList.value.some((p) => p.package_id === packageId)
|
||||
}
|
||||
|
||||
watch(
|
||||
() => packageForm.value.package_id,
|
||||
(packageId) => {
|
||||
if (packageDialogType.value === 'add' && packageId) {
|
||||
const selectedPackage = availablePackages.value.find((p) => p.id === packageId)
|
||||
if (selectedPackage) {
|
||||
const originalCostPrice = selectedPackage.cost_price
|
||||
? selectedPackage.cost_price / 100
|
||||
: 0
|
||||
const suggestedRetailPrice =
|
||||
selectedPackage.suggested_retail_price !== undefined &&
|
||||
selectedPackage.suggested_retail_price !== null
|
||||
? selectedPackage.suggested_retail_price / 100
|
||||
: undefined
|
||||
packageForm.value.original_cost_price = originalCostPrice
|
||||
packageForm.value.suggested_retail_price = suggestedRetailPrice
|
||||
packageForm.value.cost_price_yuan = originalCostPrice
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
const handleSavePackage = async () => {
|
||||
if (!packageFormRef.value || !grantId.value) return
|
||||
|
||||
@@ -338,19 +364,16 @@
|
||||
|
||||
submitLoading.value = true
|
||||
try {
|
||||
const packages: GrantPackageItem[] = []
|
||||
|
||||
if (packageDialogType.value === 'add') {
|
||||
packages.push({
|
||||
package_id: packageForm.value.package_id,
|
||||
cost_price: Math.round(packageForm.value.cost_price_yuan * 100)
|
||||
})
|
||||
} else {
|
||||
packages.push({
|
||||
package_id: packageForm.value.package_id,
|
||||
cost_price: Math.round(packageForm.value.cost_price_yuan * 100)
|
||||
})
|
||||
const currentCostPriceYuan = Number(packageForm.value.cost_price_yuan)
|
||||
if (Number.isNaN(currentCostPriceYuan)) {
|
||||
throw new Error('当前成本价无效,无法保存')
|
||||
}
|
||||
const packages: GrantPackageItem[] = [
|
||||
{
|
||||
package_id: packageForm.value.package_id,
|
||||
cost_price: Math.round(currentCostPriceYuan * 100)
|
||||
}
|
||||
]
|
||||
|
||||
await ShopSeriesGrantService.manageGrantPackages(grantId.value, { packages })
|
||||
packageDialogVisible.value = false
|
||||
@@ -392,10 +415,8 @@
|
||||
}
|
||||
|
||||
const handlePackageDialogClosed = () => {
|
||||
packageFormRef.value?.resetFields()
|
||||
packageForm.value = {
|
||||
cost_price_yuan: 0
|
||||
}
|
||||
packageFormRef.value?.clearValidate()
|
||||
assignPackageForm()
|
||||
availablePackages.value = []
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user