fix(admin): repair banner times and wheel value cards

This commit is contained in:
zhx 2026-06-03 21:02:14 +08:00
parent 66568253aa
commit 33db3e0ea2
2 changed files with 61 additions and 7 deletions

View File

@ -1,6 +1,9 @@
<script lang="ts" setup>
import { computed, reactive, ref, watch } from 'vue';
import type { Dayjs } from 'dayjs';
import dayjs from 'dayjs';
import {
OSS_FILE_BUCKETS,
getAccessImgUrl,
@ -113,6 +116,8 @@ const selectCountryCodes = ref<string[]>([]);
const countriesLoading = ref(false);
const regionsLoading = ref(false);
const form = reactive<Record<string, any>>(createForm());
const startTimePicker = ref<Dayjs | null>(null);
const expiredTimePicker = ref<Dayjs | null>(null);
const regionSelectOptions = computed(() =>
regionOptions.value.map((item) => ({
@ -156,6 +161,27 @@ function normalizeMultiValue(value: any) {
.filter(Boolean);
}
function normalizePickerValue(value: any) {
if (value === '' || value === null || value === undefined) {
return null;
}
if (dayjs.isDayjs(value)) {
return value.isValid() ? value : null;
}
const raw = String(value).trim();
const numericValue = Number(raw);
const parsed = raw !== '' && Number.isFinite(numericValue) ? dayjs(numericValue) : dayjs(value);
return parsed.isValid() ? parsed : null;
}
function pickerToTimestamp(value: Dayjs | null) {
return value?.isValid() ? String(value.valueOf()) : '';
}
function getDatePickerPopupContainer(triggerNode: HTMLElement) {
return triggerNode.parentElement || document.body;
}
watch(
() => ({ open: props.open, row: props.row, sysOrigin: props.sysOrigin }),
({ open, row, sysOrigin }) => {
@ -174,6 +200,8 @@ watch(
roomSearchValue.value = String(form.params);
}
}
startTimePicker.value = normalizePickerValue(form.startTime);
expiredTimePicker.value = normalizePickerValue(form.expiredTime);
void Promise.all([
loadCountries(),
sysOrigin ? loadRegions(sysOrigin) : Promise.resolve(),
@ -204,6 +232,14 @@ watch(
},
);
watch(startTimePicker, (value) => {
form.startTime = pickerToTimestamp(value);
});
watch(expiredTimePicker, (value) => {
form.expiredTime = pickerToTimestamp(value);
});
async function loadCountries() {
countriesLoading.value = true;
try {
@ -287,10 +323,18 @@ async function submitForm() {
message.warning('请选择系统');
return;
}
if (!form.startTime) {
message.warning('请选择开始时间');
return;
}
if (!form.expiredTime) {
message.warning('请选择过期时间');
return;
}
if (Number(form.expiredTime) <= Number(form.startTime)) {
message.warning('过期时间必须晚于开始时间');
return;
}
if (form.content === 'ENTER_ROOM' && !form.params) {
message.warning('请选择房间');
return;
@ -486,20 +530,22 @@ async function submitForm() {
<div class="field">
<div class="label">开始时间</div>
<DatePicker
v-model:value="form.startTime"
v-model:value="startTimePicker"
format="YYYY-MM-DD HH:mm:ss"
:get-popup-container="getDatePickerPopupContainer"
show-time
style="width: 100%"
value-format="x"
/>
</div>
<div class="field">
<div class="label">过期时间</div>
<DatePicker
v-model:value="form.expiredTime"
v-model:value="expiredTimePicker"
format="YYYY-MM-DD HH:mm:ss"
:get-popup-container="getDatePickerPopupContainer"
show-time
style="width: 100%"
value-format="x"
/>
</div>

View File

@ -196,7 +196,9 @@ const recordSummary = reactive<Record<string, any>>({
endTime: '',
participantCount: 0,
startTime: '',
totalDecorationRewardGold: 0,
totalDrawTimes: 0,
totalGiftRewardGold: 0,
totalPaidGold: 0,
totalRewardGold: 0,
});
@ -418,7 +420,9 @@ function normalizeRecordPage(result: null | Record<string, any> | undefined) {
endTime: String(value.endTime || ''),
participantCount: Number(value.participantCount || 0),
startTime: String(value.startTime || ''),
totalDecorationRewardGold: Number(value.totalDecorationRewardGold || 0),
totalDrawTimes: Number(value.totalDrawTimes || 0),
totalGiftRewardGold: Number(value.totalGiftRewardGold || 0),
totalPaidGold: Number(value.totalPaidGold || 0),
totalRewardGold: Number(value.totalRewardGold || 0),
});
@ -1173,8 +1177,12 @@ watch(activePageTab, (value) => {
<strong>{{ numberText(recordSummary.totalPaidGold) }}</strong>
</div>
<div class="record-summary-item">
<span>礼物发放金币总价值</span>
<strong>{{ numberText(recordSummary.totalRewardGold) }}</strong>
<span>礼物价值</span>
<strong>{{ numberText(recordSummary.totalGiftRewardGold) }}</strong>
</div>
<div class="record-summary-item">
<span>装扮价值</span>
<strong>{{ numberText(recordSummary.totalDecorationRewardGold) }}</strong>
</div>
<div class="record-summary-item">
<span>用户总抽奖次数</span>
@ -1318,7 +1326,7 @@ watch(activePageTab, (value) => {
.record-summary {
display: grid;
gap: 10px;
grid-template-columns: repeat(4, minmax(160px, 1fr));
grid-template-columns: repeat(5, minmax(160px, 1fr));
margin-bottom: 16px;
}