升级节日福利年度调度与批次领取

This commit is contained in:
2026-04-21 17:53:11 +08:00
parent 5a6446b832
commit a066580014
25 changed files with 2362 additions and 536 deletions
+173 -2
View File
@@ -3,6 +3,176 @@ import "./bootstrap";
// 这个文件负责处理浏览器与 Laravel Reverb WebSocket 服务器的通信。
// 通过 Presence Channel 实现聊天室的核心监听。
function isHolidayObject(value) {
return value !== null && typeof value === "object" && !Array.isArray(value);
}
function firstHolidayDefined(...values) {
for (const value of values) {
if (value !== undefined && value !== null && value !== "") {
return value;
}
}
return null;
}
function pickHolidayObject(...values) {
for (const value of values) {
if (isHolidayObject(value)) {
return value;
}
}
return {};
}
function mergeHolidayObjects(...values) {
return Object.assign({}, ...values.filter(isHolidayObject));
}
function toHolidayNumber(value, fallback = null) {
if (value === undefined || value === null || value === "") {
return fallback;
}
const parsedValue = Number(value);
return Number.isFinite(parsedValue) ? parsedValue : fallback;
}
export function normalizeHolidayBroadcastEvent(payload = {}) {
const runPayload = pickHolidayObject(payload.run, payload.holiday_run);
const snapshotPayload = pickHolidayObject(
payload.snapshot,
payload.run_snapshot,
payload.batch_snapshot,
runPayload.snapshot,
runPayload.batch_snapshot,
);
const eventPayload = pickHolidayObject(
payload.event,
payload.holiday_event,
runPayload.event,
runPayload.template,
snapshotPayload.event,
snapshotPayload.template,
);
const mergedPayload = mergeHolidayObjects(
eventPayload,
payload,
runPayload,
snapshotPayload,
);
const fixedAmount = toHolidayNumber(
firstHolidayDefined(
snapshotPayload.fixed_amount,
runPayload.fixed_amount,
payload.fixed_amount,
),
);
return {
...payload,
...mergedPayload,
run_id: firstHolidayDefined(
payload.run_id,
runPayload.run_id,
runPayload.id,
snapshotPayload.run_id,
),
event_id: firstHolidayDefined(
payload.event_id,
runPayload.event_id,
snapshotPayload.event_id,
eventPayload.id,
),
name: firstHolidayDefined(
snapshotPayload.name,
runPayload.name,
payload.name,
eventPayload.name,
"节日福利",
),
description: firstHolidayDefined(
snapshotPayload.description,
runPayload.description,
payload.description,
eventPayload.description,
"",
),
total_amount:
toHolidayNumber(
firstHolidayDefined(
snapshotPayload.total_amount,
runPayload.total_amount,
payload.total_amount,
),
0,
) ?? 0,
max_claimants:
toHolidayNumber(
firstHolidayDefined(
snapshotPayload.max_claimants,
runPayload.max_claimants,
payload.max_claimants,
),
0,
) ?? 0,
distribute_type: firstHolidayDefined(
snapshotPayload.distribute_type,
runPayload.distribute_type,
payload.distribute_type,
fixedAmount !== null ? "fixed" : "random",
),
fixed_amount: fixedAmount,
scheduled_for: firstHolidayDefined(
snapshotPayload.scheduled_for,
runPayload.scheduled_for,
payload.scheduled_for,
snapshotPayload.send_at,
runPayload.send_at,
payload.send_at,
),
expires_at: firstHolidayDefined(
snapshotPayload.expires_at,
runPayload.expires_at,
payload.expires_at,
snapshotPayload.claim_deadline_at,
runPayload.claim_deadline_at,
payload.claim_deadline_at,
),
repeat_type: firstHolidayDefined(
snapshotPayload.repeat_type,
runPayload.repeat_type,
payload.repeat_type,
eventPayload.repeat_type,
),
round_no: firstHolidayDefined(
snapshotPayload.round_no,
runPayload.round_no,
payload.round_no,
snapshotPayload.sequence,
runPayload.sequence,
payload.sequence,
snapshotPayload.issue_no,
runPayload.issue_no,
payload.issue_no,
),
round_label: firstHolidayDefined(
snapshotPayload.round_label,
runPayload.round_label,
payload.round_label,
snapshotPayload.batch_label,
runPayload.batch_label,
payload.batch_label,
),
snapshot: mergeHolidayObjects(eventPayload, runPayload, snapshotPayload),
};
}
window.normalizeHolidayBroadcastEvent = normalizeHolidayBroadcastEvent;
export function initChat(roomId) {
if (!roomId) {
console.error("未提供 roomId,无法初始化 WebSocket 连接。");
@@ -113,9 +283,10 @@ export function initChat(roomId) {
})
// ─── 节日福利:系统定时发放 ────────────────────────────────
.listen(".holiday.started", (e) => {
console.log("节日福利开始:", e);
const holidayPayload = normalizeHolidayBroadcastEvent(e);
console.log("节日福利批次开始:", holidayPayload);
window.dispatchEvent(
new CustomEvent("chat:holiday.started", { detail: e }),
new CustomEvent("chat:holiday.started", { detail: holidayPayload }),
);
})
// ─── 百家乐:开局 & 结算 ──────────────────────────────────