This commit is contained in:
@@ -245,7 +245,7 @@
|
||||
:key="pkg.id"
|
||||
:label="`${pkg.package_name} (${pkg.package_code})`"
|
||||
:value="pkg.id"
|
||||
:disabled="isPackageAlreadyAdded(pkg.id)"
|
||||
:disabled="pkg.is_authorized"
|
||||
/>
|
||||
</ElSelect>
|
||||
</ElFormItem>
|
||||
@@ -345,7 +345,6 @@
|
||||
} from '@/api/modules'
|
||||
import type {
|
||||
ShopSeriesGrantResponse,
|
||||
PackageResponse,
|
||||
GrantPackageItem,
|
||||
GrantPackageInfo,
|
||||
PackageAllocationExpiryBaseOverride,
|
||||
@@ -353,6 +352,10 @@
|
||||
} from '@/types/api'
|
||||
import { formatDateTime } from '@/utils/business/format'
|
||||
import { getEnableStatusText } from '@/config/constants'
|
||||
import {
|
||||
mergeGrantPackageCandidates,
|
||||
type GrantPackageCandidate
|
||||
} from '@/utils/business/seriesGrantPackage'
|
||||
|
||||
defineOptions({ name: 'SeriesGrantsDetail' })
|
||||
|
||||
@@ -366,7 +369,7 @@
|
||||
const seriesData = ref<PackageSeriesResponse | null>(null)
|
||||
const packageDialogVisible = ref(false)
|
||||
const packageDialogType = ref<'add' | 'edit'>('add')
|
||||
const availablePackages = ref<PackageResponse[]>([])
|
||||
const availablePackages = ref<GrantPackageCandidate[]>([])
|
||||
const packageFormRef = ref<FormInstance>()
|
||||
|
||||
type ExpiryBaseSelection = PackageAllocationExpiryBaseOverride | 'default'
|
||||
@@ -559,7 +562,10 @@
|
||||
|
||||
const res = await PackageManageService.getPackages(params)
|
||||
if (res.code === 0) {
|
||||
availablePackages.value = res.data.items
|
||||
availablePackages.value = mergeGrantPackageCandidates(
|
||||
res.data.items,
|
||||
detailData.value.packages || []
|
||||
)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('加载套餐选项失败:', error)
|
||||
@@ -577,11 +583,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
// 检查套餐是否已添加
|
||||
const isPackageAlreadyAdded = (packageId: number) => {
|
||||
return detailData.value?.packages?.some((p) => p.package_id === packageId) || false
|
||||
}
|
||||
|
||||
// 保存套餐
|
||||
const handleSavePackage = async () => {
|
||||
if (!packageFormRef.value || !detailData.value) return
|
||||
@@ -600,7 +601,7 @@
|
||||
: packageForm.value.expiry_base_override,
|
||||
packages: [
|
||||
{
|
||||
package_id: packageForm.value.package_id,
|
||||
package_id: packageForm.value.package_id!,
|
||||
cost_price: Math.round(packageForm.value.cost_price_yuan * 100)
|
||||
}
|
||||
]
|
||||
@@ -616,7 +617,7 @@
|
||||
|
||||
const packages: GrantPackageItem[] = [
|
||||
{
|
||||
package_id: packageForm.value.package_id,
|
||||
package_id: packageForm.value.package_id!,
|
||||
cost_price: Math.round(packageForm.value.cost_price_yuan * 100)
|
||||
}
|
||||
]
|
||||
@@ -672,10 +673,7 @@
|
||||
}
|
||||
]
|
||||
|
||||
await ShopSeriesGrantService.manageGrantPackages(detailData.value.id, {
|
||||
expiry_base_override: row.expiry_base_override ?? null,
|
||||
packages
|
||||
})
|
||||
await ShopSeriesGrantService.manageGrantPackages(detailData.value.id, { packages })
|
||||
ElMessage.success('删除成功')
|
||||
|
||||
// 刷新详情数据
|
||||
|
||||
@@ -113,17 +113,18 @@
|
||||
|
||||
<!-- 套餐配置 -->
|
||||
<div v-if="form.shop_id" class="form-section-title">
|
||||
<span class="title-text">套餐配置(可选)</span>
|
||||
<span class="title-text">套餐配置(必选)</span>
|
||||
</div>
|
||||
|
||||
<template v-if="form.shop_id">
|
||||
<!-- 选择套餐 -->
|
||||
<ElFormItem label="选择套餐">
|
||||
<ElFormItem label="选择套餐" prop="packages">
|
||||
<ElSelect
|
||||
v-model="selectedPackageIds"
|
||||
placeholder="请选择套餐"
|
||||
style="width: 100%"
|
||||
multiple
|
||||
:multiple-limit="100"
|
||||
filterable
|
||||
remote
|
||||
:remote-method="searchPackages"
|
||||
@@ -142,7 +143,7 @@
|
||||
:value="pkg.id"
|
||||
/>
|
||||
</ElSelect>
|
||||
<div class="form-tip">选择该授权下包含的套餐</div>
|
||||
<div class="form-tip">首次创建必须选择 1~100 个不重复套餐</div>
|
||||
</ElFormItem>
|
||||
|
||||
<!-- 套餐成本价 -->
|
||||
@@ -799,6 +800,24 @@
|
||||
shop_id: [{ required: true, message: '请选择店铺', trigger: 'change' }]
|
||||
}
|
||||
|
||||
baseRules.packages = [
|
||||
{
|
||||
validator: (_rule, value, callback) => {
|
||||
const packageIds = (value || []).map((pkg: { package_id: number }) => pkg.package_id)
|
||||
if (packageIds.length < 1) {
|
||||
callback(new Error('请至少选择 1 个套餐'))
|
||||
} else if (packageIds.length > 100) {
|
||||
callback(new Error('最多选择 100 个套餐'))
|
||||
} else if (new Set(packageIds).size !== packageIds.length) {
|
||||
callback(new Error('套餐不能重复'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
},
|
||||
trigger: 'change'
|
||||
}
|
||||
]
|
||||
|
||||
// 只有启用一次性佣金时才添加佣金验证规则
|
||||
if (form.enable_one_time_commission) {
|
||||
// 根据佣金类型添加验证规则
|
||||
@@ -1092,9 +1111,9 @@
|
||||
|
||||
// 移除套餐
|
||||
const removePackage = (index: number) => {
|
||||
const removedPackageId = form.packages[index]?.package_id
|
||||
form.packages.splice(index, 1)
|
||||
// 同步更新选中的套餐ID
|
||||
const removedPackageId = form.packages[index]?.package_id
|
||||
if (removedPackageId) {
|
||||
const idIndex = selectedPackageIds.value.indexOf(removedPackageId)
|
||||
if (idIndex > -1) {
|
||||
@@ -1732,6 +1751,20 @@
|
||||
cost_price: Math.round((pkg.cost_price ?? 0) * 100)
|
||||
}))
|
||||
|
||||
if (dialogType.value === 'add') {
|
||||
const packageIds = packageItems.map((pkg: { package_id: number }) => pkg.package_id)
|
||||
if (packageIds.length < 1 || packageIds.length > 100) {
|
||||
ElMessage.error('首次创建必须选择 1~100 个套餐')
|
||||
submitLoading.value = false
|
||||
return
|
||||
}
|
||||
if (new Set(packageIds).size !== packageIds.length) {
|
||||
ElMessage.error('套餐不能重复')
|
||||
submitLoading.value = false
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if (packageItems.length > 0) {
|
||||
// 验证是否包含赠送套餐
|
||||
for (const pkg of form.packages) {
|
||||
@@ -1815,8 +1848,8 @@
|
||||
let fieldsToValidate: string[] = []
|
||||
|
||||
if (currentStep.value === 0) {
|
||||
// 第一步:验证系列和店铺选择
|
||||
fieldsToValidate = ['series_id', 'shop_id']
|
||||
// 第一步:验证系列、店铺和初始套餐
|
||||
fieldsToValidate = ['series_id', 'shop_id', 'packages']
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
:key="pkg.id"
|
||||
:label="`${pkg.package_name} (${pkg.package_code})`"
|
||||
:value="pkg.id"
|
||||
:disabled="isPackageAlreadyAdded(pkg.id)"
|
||||
:disabled="pkg.is_authorized"
|
||||
/>
|
||||
</ElSelect>
|
||||
</ElFormItem>
|
||||
@@ -193,10 +193,13 @@
|
||||
import type {
|
||||
GrantPackageInfo,
|
||||
GrantPackageItem,
|
||||
PackageAllocationExpiryBaseOverride,
|
||||
PackageResponse
|
||||
PackageAllocationExpiryBaseOverride
|
||||
} from '@/types/api'
|
||||
import { useAuth } from '@/composables/useAuth'
|
||||
import {
|
||||
mergeGrantPackageCandidates,
|
||||
type GrantPackageCandidate
|
||||
} from '@/utils/business/seriesGrantPackage'
|
||||
|
||||
defineOptions({ name: 'SeriesGrantPackages' })
|
||||
|
||||
@@ -213,7 +216,7 @@
|
||||
const seriesId = ref<number>(0)
|
||||
const grantName = ref<string>('')
|
||||
const packageList = ref<GrantPackageInfo[]>([])
|
||||
const availablePackages = ref<PackageResponse[]>([])
|
||||
const availablePackages = ref<GrantPackageCandidate[]>([])
|
||||
const packageFormRef = ref<FormInstance>()
|
||||
|
||||
const packageDialogVisible = ref(false)
|
||||
@@ -378,7 +381,7 @@
|
||||
}
|
||||
const res = await PackageManageService.getPackages(params)
|
||||
if (res.code === 0) {
|
||||
availablePackages.value = res.data.items
|
||||
availablePackages.value = mergeGrantPackageCandidates(res.data.items, packageList.value)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('加载套餐选项失败:', error)
|
||||
@@ -395,10 +398,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
const isPackageAlreadyAdded = (packageId: number) => {
|
||||
return packageList.value.some((p) => p.package_id === packageId)
|
||||
}
|
||||
|
||||
watch(
|
||||
() => packageForm.value.package_id,
|
||||
(packageId) => {
|
||||
@@ -440,7 +439,7 @@
|
||||
packageForm.value.expiry_base_override === 'default'
|
||||
? null
|
||||
: packageForm.value.expiry_base_override,
|
||||
packages: [{ package_id: packageForm.value.package_id, cost_price: costPrice }]
|
||||
packages: [{ package_id: packageForm.value.package_id!, cost_price: costPrice }]
|
||||
})
|
||||
} else {
|
||||
const expiryBaseChanged =
|
||||
@@ -452,7 +451,7 @@
|
||||
}
|
||||
|
||||
const packages: GrantPackageItem[] = [
|
||||
{ package_id: packageForm.value.package_id, cost_price: costPrice }
|
||||
{ package_id: packageForm.value.package_id!, cost_price: costPrice }
|
||||
]
|
||||
if (expiryBaseChanged) {
|
||||
await ShopPackageAllocationService.updateShopPackageAllocationExpiryBase(
|
||||
@@ -499,10 +498,7 @@
|
||||
remove: true
|
||||
}
|
||||
]
|
||||
await ShopSeriesGrantService.manageGrantPackages(grantId.value, {
|
||||
expiry_base_override: row.expiry_base_override ?? null,
|
||||
packages
|
||||
})
|
||||
await ShopSeriesGrantService.manageGrantPackages(grantId.value, { packages })
|
||||
await fetchPackageList()
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
|
||||
Reference in New Issue
Block a user