From 723258a3aa0ce9517736eca6fd0384af915b5a36 Mon Sep 17 00:00:00 2001 From: zhx Date: Wed, 17 Jun 2026 10:41:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=88=BF=E9=97=B4=E5=A5=96?= =?UTF-8?q?=E5=8A=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/AgencyOpeningPage.jsx | 53 ++++++++----------- src/features/room-turnover-reward/api.ts | 8 +++ .../hooks/useRoomTurnoverRewardPage.js | 13 ++++- .../pages/RoomTurnoverRewardPage.jsx | 25 ++++++++- src/features/rooms/hooks/useRobotRoomsPage.js | 1 - src/features/rooms/pages/RoomRobotPage.jsx | 5 -- src/features/rooms/schema.ts | 1 - src/styles/shared-ui.css | 3 +- 8 files changed, 68 insertions(+), 41 deletions(-) diff --git a/src/features/agency-opening/pages/AgencyOpeningPage.jsx b/src/features/agency-opening/pages/AgencyOpeningPage.jsx index e4a49db..9ab4626 100644 --- a/src/features/agency-opening/pages/AgencyOpeningPage.jsx +++ b/src/features/agency-opening/pages/AgencyOpeningPage.jsx @@ -29,6 +29,7 @@ import { } from "@/shared/ui/AdminListLayout.jsx"; import { DataState } from "@/shared/ui/DataState.jsx"; import { DataTable } from "@/shared/ui/DataTable.jsx"; +import { TimeRangeFilter } from "@/shared/ui/TimeRangeFilter.jsx"; import { TimeText } from "@/shared/ui/TimeText.jsx"; const statusOptions = [ @@ -117,8 +118,8 @@ export function AgencyOpeningPage() { cycleId: cycle.cycleId, title: cycle.title, status: cycle.status || "draft", - startMs: millisToInput(cycle.startMs), - endMs: millisToInput(cycle.endMs), + startMs: cycle.startMs || "", + endMs: cycle.endMs || "", minHostCount: String(cycle.minHostCount || 10), maxAgencyAgeDays: String(cycle.maxAgencyAgeDays || 0), rewards: (cycle.rewards?.length ? cycle.rewards : emptyForm.rewards).map((reward) => ({ @@ -136,12 +137,20 @@ export function AgencyOpeningPage() { if (!abilities.canUpdate && form.cycleId) return; setSaving(true); try { + const startMs = Number(form.startMs || 0); + const endMs = Number(form.endMs || 0); + if (startMs <= 0 || endMs <= 0) { + throw new Error("请选择活动开始和结束时间"); + } + if (endMs <= startMs) { + throw new Error("结束时间必须晚于开始时间"); + } const payload = { cycle_id: form.cycleId || undefined, title: form.title.trim(), status: form.status, - start_ms: inputToMillis(form.startMs), - end_ms: inputToMillis(form.endMs), + start_ms: startMs, + end_ms: endMs, min_host_count: Number(form.minHostCount || 0), max_agency_age_days: Number(form.maxAgencyAgeDays || 0), rewards: normalizeRewardPayload(form.rewards), @@ -421,22 +430,16 @@ export function AgencyOpeningPage() { ))} - setForm({ ...form, startMs: event.target.value })} - InputLabelProps={{ shrink: true }} - /> - setForm({ ...form, endMs: event.target.value })} - InputLabelProps={{ shrink: true }} - /> +
+ + setForm({ ...form, endMs: range.endMs, startMs: range.startMs }) + } + /> +
{ const thresholdCoinSpent = Number(reward.thresholdCoinSpent || 0); diff --git a/src/features/room-turnover-reward/api.ts b/src/features/room-turnover-reward/api.ts index 5d9fce4..a016bcf 100644 --- a/src/features/room-turnover-reward/api.ts +++ b/src/features/room-turnover-reward/api.ts @@ -40,6 +40,7 @@ export interface RoomTurnoverRewardSettlementDto { settlementId: string; roomId: string; ownerUserId: string; + ownerUser?: Record; periodStartMs: number; periodEndMs: number; coinSpent: number; @@ -59,6 +60,8 @@ export interface RoomTurnoverRewardSettlementDto { export interface RoomTurnoverRewardSettlementQuery extends PageQuery { status?: string; keyword?: string; + owner_user_keyword?: string; + owner_user_id?: string; } type RawConfig = RoomTurnoverRewardConfigDto & Record; @@ -141,6 +144,7 @@ function normalizeSettlement(item: RawSettlement): RoomTurnoverRewardSettlementD settlementId: stringValue(item.settlementId ?? item.settlement_id), roomId: stringValue(item.roomId ?? item.room_id), ownerUserId: stringValue(item.ownerUserId ?? item.owner_user_id), + ownerUser: objectValue(item.ownerUser ?? item.owner_user), periodStartMs: numberValue(item.periodStartMs ?? item.period_start_ms), periodEndMs: numberValue(item.periodEndMs ?? item.period_end_ms), coinSpent: numberValue(item.coinSpent ?? item.coin_spent), @@ -166,3 +170,7 @@ function numberValue(value: unknown) { const number = Number(value || 0); return Number.isFinite(number) ? number : 0; } + +function objectValue(value: unknown) { + return value && typeof value === "object" && !Array.isArray(value) ? (value as Record) : undefined; +} diff --git a/src/features/room-turnover-reward/hooks/useRoomTurnoverRewardPage.js b/src/features/room-turnover-reward/hooks/useRoomTurnoverRewardPage.js index 43ed690..49c1e04 100644 --- a/src/features/room-turnover-reward/hooks/useRoomTurnoverRewardPage.js +++ b/src/features/room-turnover-reward/hooks/useRoomTurnoverRewardPage.js @@ -29,9 +29,13 @@ export function useRoomTurnoverRewardPage() { const [configSaving, setConfigSaving] = useState(false); const [retryingSettlementId, setRetryingSettlementId] = useState(""); const [query, setQuery] = useState(""); + const [ownerUserKeyword, setOwnerUserKeyword] = useState(""); const [status, setStatus] = useState(""); const [page, setPage] = useState(1); - const filters = useMemo(() => ({ keyword: query, status }), [query, status]); + const filters = useMemo( + () => ({ keyword: query, owner_user_keyword: ownerUserKeyword, status }), + [ownerUserKeyword, query, status], + ); const { data: settlements = emptySettlements, error: settlementsError, @@ -83,6 +87,11 @@ export function useRoomTurnoverRewardPage() { setPage(1); }; + const changeOwnerUserKeyword = (value) => { + setOwnerUserKeyword(value); + setPage(1); + }; + const submitConfig = async (event) => { event.preventDefault(); if (!abilities.canUpdate) { @@ -129,6 +138,7 @@ export function useRoomTurnoverRewardPage() { return { abilities, + changeOwnerUserKeyword, changeQuery, changeStatus, closeConfigDrawer, @@ -138,6 +148,7 @@ export function useRoomTurnoverRewardPage() { configSaving, form, openConfigDrawer, + ownerUserKeyword, page, query, reloadConfig, diff --git a/src/features/room-turnover-reward/pages/RoomTurnoverRewardPage.jsx b/src/features/room-turnover-reward/pages/RoomTurnoverRewardPage.jsx index 63aab7c..d04f022 100644 --- a/src/features/room-turnover-reward/pages/RoomTurnoverRewardPage.jsx +++ b/src/features/room-turnover-reward/pages/RoomTurnoverRewardPage.jsx @@ -4,6 +4,7 @@ import { RoomTurnoverRewardConfigSummary } from "@/features/room-turnover-reward import { useRoomTurnoverRewardPage } from "@/features/room-turnover-reward/hooks/useRoomTurnoverRewardPage.js"; import styles from "@/features/room-turnover-reward/room-turnover-reward.module.css"; import { AdminActionIconButton, AdminListBody, AdminListPage } from "@/shared/ui/AdminListLayout.jsx"; +import { AdminUserIdentity } from "@/shared/ui/AdminUserIdentity.jsx"; import { DataState } from "@/shared/ui/DataState.jsx"; import { DataTable } from "@/shared/ui/DataTable.jsx"; import { createOptionsColumnFilter, createTextColumnFilter } from "@/shared/ui/tableFilters.js"; @@ -23,10 +24,15 @@ const columnsBase = [ render: (item) => (
{item.roomId || "-"} - 房主 {item.ownerUserId || "-"}
), }, + { + key: "owner", + label: "房主信息", + width: "minmax(240px, 0.95fr)", + render: (item) => , + }, { key: "period", label: "周期", @@ -122,6 +128,16 @@ export function RoomTurnoverRewardPage() { }), }; } + if (column.key === "owner") { + return { + ...column, + filter: createTextColumnFilter({ + placeholder: "搜索房主 ID、短号、名称", + value: page.ownerUserKeyword, + onChange: page.changeOwnerUserKeyword, + }), + }; + } if (column.key === "status") { return { ...column, @@ -155,7 +171,7 @@ export function RoomTurnoverRewardPage() { retrySettlement: page.retrySettlement, }} items={page.settlements.items || []} - minWidth="1480px" + minWidth="1700px" pagination={ total > 0 ? { @@ -184,6 +200,11 @@ export function RoomTurnoverRewardPage() { ); } +function OwnerUser({ item }) { + const owner = item.ownerUser || {}; + return ; +} + function settlementStatusBadge(status) { const label = settlementStatusOptions.find(([value]) => value === status)?.[1] || status || "-"; const className = diff --git a/src/features/rooms/hooks/useRobotRoomsPage.js b/src/features/rooms/hooks/useRobotRoomsPage.js index e4cf6da..a8eb65d 100644 --- a/src/features/rooms/hooks/useRobotRoomsPage.js +++ b/src/features/rooms/hooks/useRobotRoomsPage.js @@ -29,7 +29,6 @@ function emptyForm() { minRobotCount: "6", normalGiftIntervalMs: "10000", ownerRobotUserId: "", - roomName: "", visibleRegionId: 0, }; } diff --git a/src/features/rooms/pages/RoomRobotPage.jsx b/src/features/rooms/pages/RoomRobotPage.jsx index 3901e21..d7e3b0b 100644 --- a/src/features/rooms/pages/RoomRobotPage.jsx +++ b/src/features/rooms/pages/RoomRobotPage.jsx @@ -153,11 +153,6 @@ export function RoomRobotPage() { onClose={page.closeAction} onSubmit={page.submitCreate} > - page.setForm({ ...page.form, roomName: event.target.value })} - /> option.userId === value.userId} diff --git a/src/features/rooms/schema.ts b/src/features/rooms/schema.ts index 71d8ecb..1e075d5 100644 --- a/src/features/rooms/schema.ts +++ b/src/features/rooms/schema.ts @@ -83,7 +83,6 @@ export const robotRoomCreateSchema = z minRobotCount: z.coerce.number().int().min(1, "机器人数量范围不正确"), normalGiftIntervalMs: z.coerce.number().int().min(1000, "普通礼物频次不正确"), ownerRobotUserId: z.coerce.number().int().positive("请选择房主机器人"), - roomName: z.string().trim().max(128, "房间名称不能超过 128 个字符").optional().default(""), visibleRegionId: z.coerce.number().int().min(0, "区域 ID 不正确").default(0), }) .refine((value) => value.maxRobotCount >= value.minRobotCount, { diff --git a/src/styles/shared-ui.css b/src/styles/shared-ui.css index fafc1e3..82642ca 100644 --- a/src/styles/shared-ui.css +++ b/src/styles/shared-ui.css @@ -1048,10 +1048,11 @@ .weekly-star-time-range { display: flex; align-items: center; + grid-column: 1 / -1; } .weekly-star-time-range__control { - width: min(520px, 100%); + width: min(680px, 100%) !important; } .weekly-star-config-card-grid {