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

View File

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