fix: align game king configuration scope
This commit is contained in:
parent
b0e2a98d2a
commit
8cc2614fb3
@ -12,7 +12,7 @@
|
||||
type="info"
|
||||
:closable="false"
|
||||
show-icon
|
||||
title="消费金额、抽奖次数和排行榜均以后端金币流水为准;活动开始后,每次抽奖金币数、开始时间、平台及事件白名单不可修改。"
|
||||
title="消费金额、抽奖次数和排行榜均以后端识别的游戏消费流水为准;活动开始后,每次抽奖金币数、开始时间及平台不可修改。"
|
||||
/>
|
||||
</div>
|
||||
|
||||
@ -41,18 +41,6 @@
|
||||
每 {{ formatNumber(scope.row.coinPerDraw) }} 金币
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="精确事件白名单" min-width="220">
|
||||
<template slot-scope="scope">
|
||||
<el-tag
|
||||
v-for="eventType in scope.row.eventTypes || []"
|
||||
:key="eventType"
|
||||
class="event-tag"
|
||||
size="mini"
|
||||
>
|
||||
{{ eventType }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="状态" min-width="130" align="center">
|
||||
<template slot-scope="scope">
|
||||
<el-tag :type="activityStatusTag(activityStatus(scope.row))">
|
||||
@ -183,23 +171,6 @@
|
||||
<div class="form-help">活动结束后继续等待钱包异步流水到达,再冻结最终榜单;默认 30 分钟。</div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="精确事件白名单" prop="eventTypes">
|
||||
<el-select
|
||||
v-model="form.eventTypes"
|
||||
multiple
|
||||
filterable
|
||||
allow-create
|
||||
default-first-option
|
||||
style="width: 100%"
|
||||
:disabled="startedLocked"
|
||||
placeholder="输入钱包流水的完整 eventType 后回车,例如 HOT_GAME_123;不支持前缀和通配符"
|
||||
/>
|
||||
<div class="form-help">
|
||||
这里只做精确等值匹配。第三方游戏通常包含游戏 ID,请从真实金币支出流水复制完整 eventType,避免把礼物或其他支出计入活动。
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="排行口径">
|
||||
<el-input value="消费金币榜(TYCOON)" disabled />
|
||||
@ -502,7 +473,7 @@
|
||||
</activity-dialog>
|
||||
|
||||
<activity-dialog
|
||||
:title="`${selectedActivity.activityName || ''} - 历史游戏流水补数`"
|
||||
:title="`${selectedActivity.activityName || ''} - 历史游戏消费流水补数`"
|
||||
:visible.sync="backfillVisible"
|
||||
width="620px"
|
||||
:close-on-click-modal="false"
|
||||
@ -511,30 +482,9 @@
|
||||
type="warning"
|
||||
:closable="false"
|
||||
show-icon
|
||||
title="补数按收支类型、单个精确 eventType 和金币流水主键游标执行。每组条件必须分别补到 finished=true,防止共用游标漏数据。"
|
||||
title="这里只补活动期间的游戏消费流水;事件类型和支出方向均由服务端固定识别,请持续执行到 finished=true。"
|
||||
/>
|
||||
<el-form label-width="120px" class="backfill-form">
|
||||
<el-form-item label="流水类型">
|
||||
<el-select v-model="backfillForm.receiptType" style="width: 100%" @change="resetBackfillCursor">
|
||||
<el-option label="游戏消费(Tycoon / 抽奖次数)" :value="1" />
|
||||
<el-option label="游戏中奖收入(Victorious)" :value="0" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="精确 eventType">
|
||||
<el-select
|
||||
v-model="backfillForm.eventType"
|
||||
style="width: 100%"
|
||||
filterable
|
||||
@change="resetBackfillCursor"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in selectedActivity.eventTypes || []"
|
||||
:key="item"
|
||||
:label="item"
|
||||
:value="item"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="lastId 游标">
|
||||
<el-input v-model.trim="backfillForm.lastId" placeholder="首次留空;后续自动回填 nextLastId" />
|
||||
</el-form-item>
|
||||
@ -615,8 +565,7 @@ export default {
|
||||
timeZone: [{ required: true, message: '请选择活动时区', trigger: 'change' }],
|
||||
timeRange: [{ type: 'array', required: true, len: 2, message: '请选择完整活动时间', trigger: 'change' }],
|
||||
coinPerDraw: [{ required: true, message: '请输入每次抽奖金币数', trigger: 'blur' }],
|
||||
settlementDelayMinutes: [{ required: true, message: '请输入结算等待分钟数', trigger: 'blur' }],
|
||||
eventTypes: [{ type: 'array', required: true, min: 1, message: '至少配置一个精确 eventType', trigger: 'change' }]
|
||||
settlementDelayMinutes: [{ required: true, message: '请输入结算等待分钟数', trigger: 'blur' }]
|
||||
},
|
||||
timeZoneOptions: ['Asia/Riyadh', 'Asia/Shanghai', 'UTC'],
|
||||
resourceSelectorVisible: false,
|
||||
@ -637,8 +586,6 @@ export default {
|
||||
backfillLoading: false,
|
||||
backfillResult: null,
|
||||
backfillForm: {
|
||||
receiptType: 1,
|
||||
eventType: '',
|
||||
lastId: '',
|
||||
limit: 500
|
||||
}
|
||||
@ -673,7 +620,6 @@ export default {
|
||||
timeRange: [],
|
||||
coinPerDraw: 1,
|
||||
settlementDelayMinutes: 30,
|
||||
eventTypes: [],
|
||||
rankingType: 'TYCOON',
|
||||
rankingPeriod: 'OVERALL',
|
||||
enabled: false,
|
||||
@ -814,12 +760,6 @@ export default {
|
||||
this.$message.error('结算等待必须是 0 到 1440 的整数分钟')
|
||||
return false
|
||||
}
|
||||
const eventTypes = (this.form.eventTypes || []).map(item => String(item).trim())
|
||||
const invalidEventType = eventTypes.find(item => !item || item.length > 64 || item.indexOf(',') >= 0)
|
||||
if (invalidEventType !== undefined || new Set(eventTypes).size !== eventTypes.length) {
|
||||
this.$message.error('eventType 必须非空、最长 64 字符、不含逗号且不可重复')
|
||||
return false
|
||||
}
|
||||
// 活动开始后后端只允许更新非统计字段;奖项与排行奖励既不重新校验,也不随保存请求发送。
|
||||
if (this.startedLocked) {
|
||||
return true
|
||||
@ -850,6 +790,7 @@ export default {
|
||||
return true
|
||||
},
|
||||
buildSavePayload() {
|
||||
// 游戏消费事件由服务端固定识别,管理端不提交 eventTypes,避免运营误把礼物等其他金币支出纳入活动。
|
||||
const payload = {
|
||||
id: this.form.id || null,
|
||||
activityCode: this.form.activityCode.trim(),
|
||||
@ -861,7 +802,6 @@ export default {
|
||||
endTime: Number(this.form.timeRange[1]),
|
||||
settlementDelayMinutes: Number(this.form.settlementDelayMinutes),
|
||||
coinPerDraw: Number(this.form.coinPerDraw),
|
||||
eventTypes: this.form.eventTypes.map(item => String(item).trim()),
|
||||
rankingType: 'TYCOON',
|
||||
rankingPeriod: 'OVERALL',
|
||||
enabled: Boolean(this.form.enabled)
|
||||
@ -1023,8 +963,6 @@ export default {
|
||||
openBackfill(row) {
|
||||
this.selectedActivity = row
|
||||
this.backfillForm = {
|
||||
receiptType: 1,
|
||||
eventType: row.eventTypes && row.eventTypes.length ? row.eventTypes[0] : '',
|
||||
lastId: '',
|
||||
limit: 500
|
||||
}
|
||||
@ -1032,17 +970,7 @@ export default {
|
||||
this.backfillVisible = true
|
||||
},
|
||||
runBackfill() {
|
||||
if (this.backfillForm.receiptType !== 0 && this.backfillForm.receiptType !== 1) {
|
||||
this.$message.error('请选择金币流水类型')
|
||||
return
|
||||
}
|
||||
if (!this.backfillForm.eventType) {
|
||||
this.$message.error('请选择一个精确 eventType')
|
||||
return
|
||||
}
|
||||
const params = {
|
||||
eventType: this.backfillForm.eventType,
|
||||
receiptType: this.backfillForm.receiptType,
|
||||
limit: Number(this.backfillForm.limit)
|
||||
}
|
||||
if (this.backfillForm.lastId) {
|
||||
@ -1051,18 +979,13 @@ export default {
|
||||
this.backfillLoading = true
|
||||
backfillAslanGameKingConsumption(this.selectedActivity.id, params).then(res => {
|
||||
this.backfillResult = res.body || {}
|
||||
// 游标由服务端返回并按 eventType 独立推进;浏览器不自行计算,避免大整数精度和跳行问题。
|
||||
// 后端固定只扫描游戏消费流水,浏览器只续传服务端游标,避免大整数精度和跳行问题。
|
||||
this.backfillForm.lastId = this.backfillResult.nextLastId || this.backfillForm.lastId
|
||||
this.$message.success(this.backfillResult.finished ? '该 eventType 已补数完成' : '本批补数完成,请继续下一批')
|
||||
this.$message.success(this.backfillResult.finished ? '游戏消费流水已补数完成' : '本批补数完成,请继续下一批')
|
||||
}).finally(() => {
|
||||
this.backfillLoading = false
|
||||
})
|
||||
},
|
||||
resetBackfillCursor() {
|
||||
// lastId 仅在同一 receiptType + eventType 查询条件内有效,切换条件必须从首批重新开始。
|
||||
this.backfillForm.lastId = ''
|
||||
this.backfillResult = null
|
||||
},
|
||||
activityStatus(row) {
|
||||
if (!row || !row.id) {
|
||||
return 'DISABLED'
|
||||
@ -1173,10 +1096,6 @@ export default {
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
.event-tag {
|
||||
margin: 2px 4px 2px 0;
|
||||
}
|
||||
|
||||
.settlement-status {
|
||||
margin-top: 6px;
|
||||
color: #606266;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user