首冲奖励配置

This commit is contained in:
zhx 2026-05-28 15:01:01 +08:00
parent a62e5a65a5
commit 2ef1aa24ea

View File

@ -42,6 +42,7 @@ function createRowKey(seed?: number | string) {
function createLevel(level = 1, rechargeAmount = 10) {
return {
enabled: true,
googleProductId: '',
id: null,
level,
rechargeAmount,
@ -85,6 +86,7 @@ const form = reactive<Record<string, any>>({
enabled: false,
id: 0,
levelConfigs: defaultLevels(),
minAppVersion: '',
sysOrigin: '',
updateTime: '',
});
@ -93,6 +95,7 @@ const levelColumns = [
{ dataIndex: 'enabled', key: 'enabled', title: '启用', width: 90 },
{ dataIndex: 'level', key: 'level', title: '档位', width: 110 },
{ dataIndex: 'rechargeAmount', key: 'rechargeAmount', title: '首冲金额', width: 180 },
{ dataIndex: 'googleProductId', key: 'googleProductId', title: '谷歌商品ID', width: 240 },
{ dataIndex: 'rewardGroup', key: 'rewardGroup', title: '奖励资源组', width: 420 },
{ dataIndex: 'actions', key: 'actions', title: '操作', width: 100 },
];
@ -163,6 +166,7 @@ function normalizeConfig(result: null | Record<string, any> | undefined) {
form.configured = Boolean(value.configured);
form.enabled = Boolean(value.enabled);
form.id = value.id || 0;
form.minAppVersion = String(value.minAppVersion || '');
form.sysOrigin = String(value.sysOrigin || selectedSysOrigin.value || '');
form.updateTime = String(value.updateTime || '');
const levels = Array.isArray(value.levelConfigs) && value.levelConfigs.length > 0
@ -175,6 +179,7 @@ function normalizeConfig(result: null | Record<string, any> | undefined) {
);
return {
enabled: item.enabled !== false,
googleProductId: String(item.googleProductId || ''),
id: item.id ?? null,
level: Number(item.level || index + 1),
rechargeAmount: Number.isFinite(rechargeAmount) ? rechargeAmount : 0,
@ -277,6 +282,7 @@ function validateBeforeSave() {
}
const seenLevels = new Set<string>();
const seenAmounts = new Set<string>();
const seenGoogleProductIds = new Set<string>();
for (const item of levels) {
const level = Number(item.level || 0);
const amountCents = toAmountCents(item.rechargeAmount);
@ -300,6 +306,14 @@ function validateBeforeSave() {
message.warning('首冲金额不能重复');
return false;
}
const googleProductId = String(item.googleProductId || '').trim();
if (googleProductId) {
if (seenGoogleProductIds.has(googleProductId)) {
message.warning('谷歌商品ID不能重复');
return false;
}
seenGoogleProductIds.add(googleProductId);
}
seenLevels.add(String(level));
seenAmounts.add(String(amountCents));
}
@ -307,6 +321,10 @@ function validateBeforeSave() {
message.warning('启用配置时至少要启用一个首冲奖励档位');
return false;
}
if (form.enabled && !String(form.minAppVersion || '').trim()) {
message.warning('启用配置时需要填写最低App版本');
return false;
}
return true;
}
@ -321,6 +339,7 @@ async function submitForm() {
id: form.id || 0,
levelConfigs: (form.levelConfigs || []).map((item: Record<string, any>) => ({
enabled: item.enabled !== false,
googleProductId: String(item.googleProductId || '').trim(),
id: item.id || 0,
level: Number(item.level || 0),
rechargeAmount: formatAmount(item.rechargeAmount),
@ -328,6 +347,7 @@ async function submitForm() {
rewardGroupId: normalizeID(item.rewardGroupId) || null,
rewardGroupName: String(item.rewardGroupName || ''),
})),
minAppVersion: String(form.minAppVersion || '').trim(),
sysOrigin: selectedSysOrigin.value,
});
message.success('保存成功');
@ -421,6 +441,13 @@ watch(activeTab, (value) => {
<Space align="center" wrap>
<span class="field-label">启用</span>
<Switch v-model:checked="form.enabled" />
<span class="field-label">最低App版本</span>
<Input
v-model:value="form.minAppVersion"
allow-clear
placeholder="例如 1.5.0"
style="width: 160px"
/>
<span class="sub-text">更新时间{{ form.updateTime || '-' }}</span>
</Space>
</div>
@ -431,7 +458,7 @@ watch(activeTab, (value) => {
:loading="loading"
:pagination="false"
row-key="rowKey"
:scroll="{ x: 900 }"
:scroll="{ x: 1140 }"
>
<template #bodyCell="{ column, index, record }">
<template v-if="column.key === 'enabled'">
@ -453,6 +480,14 @@ watch(activeTab, (value) => {
style="width: 140px"
/>
</template>
<template v-else-if="column.key === 'googleProductId'">
<Input
v-model:value="record.googleProductId"
allow-clear
placeholder="Google商品ID"
style="width: 200px"
/>
</template>
<template v-else-if="column.key === 'rewardGroup'">
<div class="reward-group-cell">
<Space wrap>