优化奖励配置/按规则一键生成表

This commit is contained in:
2026-03-27 10:26:58 +08:00
parent e32f3890f1
commit cfc6537f97
5 changed files with 82 additions and 30 deletions

View File

@@ -78,12 +78,18 @@
<template #default="{ row }">
<ElInputNumber
v-model="row.real_ev"
@change="handleRealEvChange(row)"
controls-position="right"
size="small"
class="full-width"
/>
</template>
</ElTableColumn>
<ElTableColumn :label="$t('page.configPage.colRealReward')" min-width="130" align="center">
<template #default="{ row }">
<span>{{ calcRealReward(row.real_ev) }}</span>
</template>
</ElTableColumn>
<ElTableColumn :label="$t('page.configPage.colTier')" width="100" align="center">
<template #default="{ row }">
<ElSelect
@@ -162,6 +168,7 @@
<template #default="{ row }">
<ElInputNumber
v-model="row.real_ev"
@change="handleRealEvChange(row)"
controls-position="right"
size="small"
class="full-width"
@@ -481,6 +488,24 @@
}
}
function calcRealReward(realEv: unknown): number {
const n = typeof realEv === 'number' && !Number.isNaN(realEv) ? realEv : Number(realEv)
if (Number.isNaN(n)) {
return -100
}
return n - 100
}
function handleRealEvChange(row: IndexRow) {
const n =
typeof row.real_ev === 'number' && !Number.isNaN(row.real_ev)
? row.real_ev
: Number(row.real_ev)
const text = Number.isNaN(n) ? '' : String(n)
row.ui_text = text
row.ui_text_en = text
}
async function handleCreateRewardReference() {
try {
await ElMessageBox.confirm(

View File

@@ -22,7 +22,11 @@
<el-input v-model="formData.ui_text_en" :placeholder="$t('page.form.placeholderUiTextEn')" />
</el-form-item>
<el-form-item :label="$t('page.form.labelRealEv')" prop="real_ev">
<el-input-number v-model="formData.real_ev" :placeholder="$t('page.form.placeholderRealEv')" />
<el-input-number
v-model="formData.real_ev"
:placeholder="$t('page.form.placeholderRealEv')"
@change="handleRealEvChange"
/>
</el-form-item>
<el-form-item :label="$t('page.form.labelTier')" prop="tier">
<el-select
@@ -237,6 +241,16 @@
console.log('表单验证失败:', error)
}
}
const handleRealEvChange = () => {
const n =
typeof formData.real_ev === 'number' && !Number.isNaN(formData.real_ev)
? formData.real_ev
: Number(formData.real_ev)
const text = Number.isNaN(n) ? '' : String(n)
formData.ui_text = text
formData.ui_text_en = text
}
</script>
<style lang="scss" scoped>

View File

@@ -53,12 +53,12 @@ export interface TierRealEvStandards {
T5: number
}
/** 默认标准(与常见业务约定一致100&lt;T1&lt;500 */
/** 默认标准(与规则弹窗说明一致 */
export const DEFAULT_TIER_REAL_EV_STANDARDS: TierRealEvStandards = {
T1: 400,
T2: 50,
T3: -80,
T4: -140,
T1: 300,
T2: 150,
T3: 50,
T4: -40,
T5: 0
}
@@ -66,16 +66,16 @@ export const DEFAULT_TIER_REAL_EV_STANDARDS: TierRealEvStandards = {
* 校验档位与 real_ev 区间是否一致;通过返回 null否则返回 i18n 键名(不含 page.configPage. 前缀)
*/
export function validateTierRealEvStandards(s: TierRealEvStandards): string | null {
if (!Number.isFinite(s.T1) || !(s.T1 > 100 && s.T1 < 500)) {
if (!Number.isFinite(s.T1) || !(s.T1 > 200)) {
return 'ruleGenInvalidT1RealEv'
}
if (!Number.isFinite(s.T2) || !(s.T2 > 0 && s.T2 < 100)) {
if (!Number.isFinite(s.T2) || !(s.T2 > 100 && s.T2 < 200)) {
return 'ruleGenInvalidT2RealEv'
}
if (!Number.isFinite(s.T3) || !(-100 < s.T3 && s.T3 < 0)) {
if (!Number.isFinite(s.T3) || !(s.T3 > 0 && s.T3 < 100)) {
return 'ruleGenInvalidT3RealEv'
}
if (!Number.isFinite(s.T4) || !(s.T4 < -100)) {
if (!Number.isFinite(s.T4) || !(s.T4 < 0)) {
return 'ruleGenInvalidT4RealEv'
}
if (!Number.isFinite(s.T5) || s.T5 !== 0) {
@@ -271,10 +271,21 @@ export function generateTiers(input: GenerateTierInput): GenerateTierResult {
return { ok: false, message: '在当前盘面与约束下未找到可行解,请调整 T1/T4/T5 固定条数或放宽 T2 下限后重试' }
}
function uiTextByTierWhenStandards(
tier: IndexTier,
realEv: number
): { ui_text: string; ui_text_en: string } {
if (tier === 'T5') {
return { ui_text: '再来一次', ui_text_en: 'Once again' }
}
const value = String(realEv)
return { ui_text: value, ui_text_en: value }
}
/** 展示文案:直接使用真实结算值(中英文相同) */
function uiTextFromRealEv(realEv: number): { ui_text: string; ui_text_en: string } {
const s = String(realEv)
return { ui_text: s, ui_text_en: s }
const value = String(realEv)
return { ui_text: value, ui_text_en: value }
}
/**
@@ -315,31 +326,31 @@ export function buildRowsFromTiers(
if (standards !== undefined) {
if (tier === 'T1') {
real_ev = standards.T1
const f = uiTextFromRealEv(real_ev)
const f = uiTextByTierWhenStandards(tier, real_ev)
ui_text = f.ui_text
ui_text_en = f.ui_text_en
remark = '大奖格'
} else if (tier === 'T2') {
real_ev = standards.T2
const f = uiTextFromRealEv(real_ev)
const f = uiTextByTierWhenStandards(tier, real_ev)
ui_text = f.ui_text
ui_text_en = f.ui_text_en
remark = standards.T2 <= 1 ? '完美回本' : '小赚'
} else if (tier === 'T3') {
real_ev = standards.T3
const f = uiTextFromRealEv(real_ev)
const f = uiTextByTierWhenStandards(tier, real_ev)
ui_text = f.ui_text
ui_text_en = f.ui_text_en
remark = '抽水'
} else if (tier === 'T4') {
real_ev = standards.T4
const f = uiTextFromRealEv(real_ev)
const f = uiTextByTierWhenStandards(tier, real_ev)
ui_text = f.ui_text
ui_text_en = f.ui_text_en
remark = '惩罚'
} else {
real_ev = standards.T5
const f = uiTextFromRealEv(real_ev)
const f = uiTextByTierWhenStandards(tier, real_ev)
ui_text = f.ui_text
ui_text_en = f.ui_text_en
remark = '前端需要在播放一次动画(特殊)'