import { App, Button, Card, Col, DatePicker, Form, Input, Radio, Row, Select, Space, Spin, Typography } from "antd"; import { AudioOutlined, CheckCircleOutlined, QrcodeOutlined } from "@ant-design/icons"; import dayjs from "dayjs"; import { useEffect, useMemo, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { listUsers } from "@/api"; import { getAiModelDefault, getAiModelPage, type AiModelVO } from "@/api/business/aimodel"; import { getHotWordPage, type HotWordVO } from "@/api/business/hotword"; import { getHotWordGroupOptions, type HotWordGroupVO } from "@/api/business/hotwordGroup"; import { createPublicDeviceMeetingBySession, type PublicDeviceMeetingCreateCommand, type SummaryDetailLevel, } from "@/api/business/meeting"; import { getPromptPage, type PromptTemplateVO } from "@/api/business/prompt"; import type { SysUser } from "@/types"; const { Title, Text } = Typography; const { Option } = Select; type FormValues = { title: string; meetingTime: dayjs.Dayjs; participants?: number[]; tags?: string[]; hostUserId?: number; asrModelId: number; summaryModelId: number; promptId: number; hotWordGroupId?: number; summaryDetailLevel: SummaryDetailLevel; useSpkId?: boolean; enableTextRefine?: boolean; userPrompt?: string; accessPassword?: string; }; export default function PublicDeviceMeetingCreate() { const { message } = App.useApp(); const navigate = useNavigate(); const { sessionId } = useParams<{ sessionId: string }>(); const [form] = Form.useForm(); const [loading, setLoading] = useState(true); const [submitting, setSubmitting] = useState(false); const [asrModels, setAsrModels] = useState([]); const [llmModels, setLlmModels] = useState([]); const [prompts, setPrompts] = useState([]); const [hotwordList, setHotwordList] = useState([]); const [hotWordGroups, setHotWordGroups] = useState([]); const [userList, setUserList] = useState([]); const watchedPromptId = Form.useWatch("promptId", form); const watchedHotWordGroupId = Form.useWatch("hotWordGroupId", form); const selectedPrompt = useMemo( () => prompts.find((item) => item.id === watchedPromptId) || null, [prompts, watchedPromptId] ); useEffect(() => { const token = localStorage.getItem("accessToken"); if (!token) { const redirect = encodeURIComponent(window.location.pathname + window.location.search); navigate(`/login?redirect=${redirect}`, { replace: true }); return; } void loadInitialData(); }, [navigate]); const loadInitialData = async () => { setLoading(true); try { const [asrRes, llmRes, promptRes, hotwordRes, hotWordGroupRes, users, defaultAsr, defaultLlm] = await Promise.all([ getAiModelPage({ current: 1, size: 100, type: "ASR" }), getAiModelPage({ current: 1, size: 100, type: "LLM" }), getPromptPage({ current: 1, size: 100 }), getHotWordPage({ current: 1, size: 1000 }), getHotWordGroupOptions(), listUsers(), getAiModelDefault("ASR"), getAiModelDefault("LLM"), ]); const activePrompts = promptRes.data.data.records.filter((item: PromptTemplateVO) => item.status === 1); const defaultPrompt = activePrompts[0]; setAsrModels(asrRes.data.data.records.filter((item: AiModelVO) => item.status === 1)); setLlmModels(llmRes.data.data.records.filter((item: AiModelVO) => item.status === 1)); setPrompts(activePrompts); setHotwordList(hotwordRes.data.data.records.filter((item: HotWordVO) => item.status === 1)); setHotWordGroups((hotWordGroupRes.data.data || []).filter((item: HotWordGroupVO) => item.status === 1)); setUserList(users || []); form.setFieldsValue({ title: `设备会议 ${dayjs().format("MM-DD HH:mm")}`, meetingTime: dayjs(), asrModelId: defaultAsr.data.data?.id, summaryModelId: defaultLlm.data.data?.id, promptId: defaultPrompt?.id, hotWordGroupId: defaultPrompt?.hotWordGroupId ?? 0, summaryDetailLevel: "STANDARD", useSpkId: true, enableTextRefine: false, }); } catch { message.error("加载建会配置失败"); } finally { setLoading(false); } }; const handleSubmit = async () => { if (!sessionId) { message.error("扫码会话不存在"); return; } const values = await form.validateFields(); setSubmitting(true); try { const selectedHotWords = values.hotWordGroupId == null || values.hotWordGroupId === 0 ? undefined : hotwordList .filter((item) => item.hotWordGroupId === values.hotWordGroupId) .map((item) => item.word) .filter((word) => !!word?.trim()); const payload: PublicDeviceMeetingCreateCommand = { title: values.title, meetingTime: values.meetingTime.format("YYYY-MM-DD HH:mm:ss"), participants: values.participants?.join(",") || "", tags: values.tags?.join(",") || "", hostUserId: values.hostUserId, asrModelId: values.asrModelId, summaryModelId: values.summaryModelId, promptId: values.promptId, hotWordGroupId: values.hotWordGroupId, summaryDetailLevel: values.summaryDetailLevel, useSpkId: values.useSpkId ? 1 : 0, enableTextRefine: !!values.enableTextRefine, userPrompt: values.userPrompt, hotWords: selectedHotWords, accessPassword: values.accessPassword?.trim() || undefined, }; await createPublicDeviceMeetingBySession(sessionId, payload); message.success("会议已创建,已推送到设备"); form.resetFields(); navigate("/meetings"); } catch { message.error("创建设备会议失败"); } finally { setSubmitting(false); } }; return (
扫码设备发起会议 登录后填写会议基础信息,系统会把待开始会议推送到设备端。
设备录音仍在设备端执行 创建成功后会自动推送到扫码设备
{loading ? (
) : (