feat: 系统配置
Some checks failed
构建并部署前端到测试环境 / build-and-deploy (push) Has been cancelled

This commit is contained in:
luo
2026-07-25 14:13:49 +08:00
parent ee508c3e1e
commit dd6bceeeb7
20 changed files with 805 additions and 41 deletions

View File

@@ -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('删除成功')
// 刷新详情数据

View File

@@ -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">首次创建必须选择 1100 个不重复套餐</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('首次创建必须选择 1100 个套餐')
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 {

View File

@@ -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)