diff --git a/web2/src/pages/Decisions.tsx b/web2/src/pages/Decisions.tsx index c212309..8cd231b 100644 --- a/web2/src/pages/Decisions.tsx +++ b/web2/src/pages/Decisions.tsx @@ -1,127 +1,42 @@ -/** 经营决策页:话题选择 + 换一批 + ChatPanel +/** 经营决策页:直接展示一批问题,点击即问 * scene='decision', 默认普通模式, 不显示风险卡 */ -import { useState, useCallback } from 'react' import { PageLayout } from '@/components/common/PageLayout' import { ChatPanel } from '@/components/common/ChatPanel' import { BrainTrustSwitcher } from '@/components/common/BrainTrustSwitcher' -import { Card, CardContent, CardHeader } from '@/components/ui/card' -import { TrendingUp, ChevronDown, RefreshCw, Loader2 } from 'lucide-react' -import { cn } from '@/lib/utils' -import { api } from '@/lib/api' -/** 话题类型 */ -interface Topic { - title: string - desc: string - samples: string[] -} - -/** 经营决策助手:初始兜底话题,换一批时 AI 动态生成 */ -const FALLBACK_TOPICS: Topic[] = [ - { title: '扩张收缩', desc: '开店、关店、业务线', samples: ['现在适合扩张开第二家店吗?', '要不要关闭亏损的业务线?', '新业务线该自营还是加盟?', '应该先扩张还是先巩固?'] }, - { title: '项目承接', desc: '大单、长期合同', samples: ['是否应该接付款周期90天的大单?', '长期框架合同要不要签?', '预付款比例低的项目能接吗?', '客户要求独家合作利弊?'] }, - { title: '定价策略', desc: '涨价、降价、促销', samples: ['该不该降价15%抢竞品客户?', '产品涨价怎么跟客户沟通?', '促销活动会不会损害品牌?', '成本上涨如何调整定价?'] }, - { title: '招人裁员', desc: '招聘、解雇、绩效', samples: ['现在该招人还是裁人?', '裁掉绩效差的员工怎么操作?', '关键岗位招人还是培养?', '外包和正式员工怎么选?'] }, - { title: '融资合伙', desc: '融资、合伙、股权', samples: ['现在适合融资吗?', '合伙人要退股怎么谈条件?', '出让多少股权合适?', '银行贷款还是股权融资?'] }, - { title: '转型外包', desc: '转型、外包、调整', samples: ['业务转型方向怎么选?', '哪些业务可以外包?', '转型期间现金流怎么管理?', '外包质量怎么控?'] }, +/** 初始兜底示例问题(覆盖扩张/承接/定价/招人/融资/转型高频场景) */ +const FALLBACK_SAMPLES: string[] = [ + '现在适合扩张开第二家店吗?', + '是否应该接付款周期90天的大单?', + '该不该降价15%抢竞品客户?', + '现在该招人还是裁人?', + '现在适合融资吗?', + '业务转型方向怎么选?', + '要不要关闭亏损的业务线?', + '长期框架合同要不要签?', + '产品涨价怎么跟客户沟通?', + '关键岗位招人还是培养?', + '合伙人要退股怎么谈条件?', + '哪些业务可以外包?', ] export function Decisions() { - const [topics, setTopics] = useState(FALLBACK_TOPICS) - const [selectedTopic, setSelectedTopic] = useState(0) - const [topicsCollapsed, setTopicsCollapsed] = useState(false) - const [loadingTopics, setLoadingTopics] = useState(false) - - /** 换一批:调用 AI 动态生成话题(避免重复) */ - const refreshTopics = useCallback(async () => { - setLoadingTopics(true) - try { - const res = await api.getTopics('decision', topics.map((t) => t.title)) - if (res.topics?.length > 0) { - setTopics(res.topics) - setSelectedTopic(0) - } - } catch { - // AI 不可用时保持当前话题 - } finally { - setLoadingTopics(false) - } - }, [topics]) - - const currentTopic = topics[selectedTopic] - return ( - - -
- - -
-
- {!topicsCollapsed && ( - - {loadingTopics && ( -
- - AI 正在生成新话题… -
- )} -
- {topics.map((t, i) => ( - - ))} -
-
- )} -
- - {currentTopic && ( - - )} +
) } diff --git a/web2/src/pages/LegalAdvisor.tsx b/web2/src/pages/LegalAdvisor.tsx index bbaaf44..0df6457 100644 --- a/web2/src/pages/LegalAdvisor.tsx +++ b/web2/src/pages/LegalAdvisor.tsx @@ -1,58 +1,28 @@ -/** 私人法务页:话题选择 + 换一批 + ChatPanel +/** 私人法务页:直接展示一批问题,点击即问 * scene='legal', 默认保密模式, 显示风险卡, 启用上传 * 顶部含智囊场景切换栏(法务/决策/生活/情绪) */ -import { useState, useCallback } from 'react' import { PageLayout } from '@/components/common/PageLayout' import { ChatPanel } from '@/components/common/ChatPanel' import { BrainTrustSwitcher } from '@/components/common/BrainTrustSwitcher' -import { Card, CardContent, CardHeader } from '@/components/ui/card' -import { Briefcase, ChevronDown, RefreshCw, Loader2 } from 'lucide-react' -import { cn } from '@/lib/utils' -import { api } from '@/lib/api' -/** 话题类型 */ -interface Topic { - title: string - desc: string - samples: string[] -} - -/** 私人法务:初始兜底话题,换一批时 AI 动态生成 */ -// 初始兜底话题(同步显示,无 loading) -const FALLBACK_TOPICS: Topic[] = [ - { title: '劳动用工', desc: '工伤、辞退、欠薪、社保', samples: ['员工工伤后能开除吗?', '员工被辞退要赔多少?', '员工不签合同有何风险?', '社保未缴全被查怎么办?'] }, - { title: '合同审查', desc: '违约、条款、效力', samples: ['合同违约金怎么约定?', '对方不履行合同怎么办?', '口头协议有法律效力吗?', '合同条款不公平能改吗?'] }, - { title: '债权债务', desc: '欠款、催收、诉讼', samples: ['客户拖欠货款3个月如何催收?', '借条怎么写才有效?', '债务人不还钱能报警吗?', '超过诉讼时效怎么办?'] }, - { title: '股东纠纷', desc: '股权、分红、退股', samples: ['合伙人要退股怎么谈?', '股东不出资怎么办?', '分红比例怎么定?', '小股东权益被侵害怎么办?'] }, - { title: '税务风险', desc: '稽查、发票、合规', samples: ['收到税务稽查通知怎么办?', '发票开错了怎么处理?', '个体户怎么交税最合理?', '税务罚款能减免吗?'] }, - { title: '诉讼仲裁', desc: '起诉、举证、执行', samples: ['打官司要准备哪些证据?', '仲裁和诉讼哪个更快?', '赢了官司对方不执行怎么办?', '诉讼费用怎么算?'] }, +/** 初始兜底示例问题(覆盖劳动/合同/债务/股权/税务/诉讼高频场景) */ +const FALLBACK_SAMPLES: string[] = [ + '员工被辞退要赔多少?', + '合同违约金怎么约定?', + '客户拖欠货款3个月如何催收?', + '合伙人要退股怎么谈?', + '收到税务稽查通知怎么办?', + '打官司要准备哪些证据?', + '员工工伤后能开除吗?', + '对方不履行合同怎么办?', + '借条怎么写才有效?', + '股东不出资怎么办?', + '发票开错了怎么处理?', + '赢了官司对方不执行怎么办?', ] export function LegalAdvisor() { - const [topics, setTopics] = useState(FALLBACK_TOPICS) - const [selectedTopic, setSelectedTopic] = useState(0) - const [topicsCollapsed, setTopicsCollapsed] = useState(false) - const [loadingTopics, setLoadingTopics] = useState(false) - - /** 换一批:调用 AI 动态生成话题(避免重复) */ - const refreshTopics = useCallback(async () => { - setLoadingTopics(true) - try { - const res = await api.getTopics('legal', topics.map((t) => t.title)) - if (res.topics?.length > 0) { - setTopics(res.topics) - setSelectedTopic(0) - } - } catch { - // AI 不可用时保持当前话题 - } finally { - setLoadingTopics(false) - } - }, [topics]) - - const currentTopic = topics[selectedTopic] - return ( - - -
- - -
-
- {!topicsCollapsed && ( - - {loadingTopics && ( -
- - AI 正在生成新话题… -
- )} -
- {topics.map((t, i) => ( - - ))} -
-
- )} -
- - {currentTopic && ( - - )} +
) } diff --git a/web2/src/pages/LifeAssistant.tsx b/web2/src/pages/LifeAssistant.tsx index 14082c2..d68e2ce 100644 --- a/web2/src/pages/LifeAssistant.tsx +++ b/web2/src/pages/LifeAssistant.tsx @@ -1,127 +1,41 @@ -/** 生活助理页:话题选择 + 换一批 + ChatPanel +/** 生活助理页:直接展示一批问题,点击即问 * scene='life', 默认保密模式 */ -import { useState, useCallback } from 'react' import { PageLayout } from '@/components/common/PageLayout' import { ChatPanel } from '@/components/common/ChatPanel' import { BrainTrustSwitcher } from '@/components/common/BrainTrustSwitcher' -import { Card, CardContent, CardHeader } from '@/components/ui/card' -import { Heart, ChevronDown, RefreshCw, Loader2 } from 'lucide-react' -import { cn } from '@/lib/utils' -import { api } from '@/lib/api' -/** 话题类型 */ -interface Topic { - title: string - desc: string - samples: string[] -} - -/** 生活助理:初始兜底话题,换一批时 AI 动态生成 */ -const FALLBACK_TOPICS: Topic[] = [ - { title: '家庭沟通', desc: '亲子、夫妻、关系', samples: ['怎么和青春期的孩子沟通?', '夫妻因工作吵架怎么办?', '家人不支持创业怎么说服?', '工作太忙忽略家人怎么办?'] }, - { title: '子女教育', desc: '升学、兴趣、规划', samples: ['孩子不想上学怎么办?', '兴趣班该报几个?', '要不要送孩子出国?', '孩子成绩下滑怎么沟通?'] }, - { title: '父母养老', desc: '养老、医疗、陪伴', samples: ['父母年纪大了养老方案怎么选?', '异地父母怎么照顾?', '养老院还是居家养老?', '父母医疗费用怎么分担?'] }, - { title: '睡眠与压力', desc: '失眠、焦虑、调节', samples: ['最近睡眠很差怎么改善?', '工作压力大怎么缓解?', '焦虑到影响工作怎么办?', '怎么判断需要看心理医生?'] }, - { title: '出差日程', desc: '出行、时间管理', samples: ['出差频繁怎么兼顾家庭?', '行程太满怎么优化?', '出差期间公司怎么管?', '如何减少无效出差?'] }, - { title: '健康习惯', desc: '体检、饮食、运动', samples: ['体检报告几项异常怎么办?', '久坐怎么改善健康?', '应酬多怎么控制饮食?', '没时间运动怎么办?'] }, +/** 初始兜底示例问题(覆盖家庭/教育/养老/睡眠/出差/健康高频场景) */ +const FALLBACK_SAMPLES: string[] = [ + '怎么和青春期的孩子沟通?', + '孩子不想上学怎么办?', + '父母年纪大了养老方案怎么选?', + '最近睡眠很差怎么改善?', + '出差频繁怎么兼顾家庭?', + '体检报告几项异常怎么办?', + '夫妻因工作吵架怎么办?', + '兴趣班该报几个?', + '异地父母怎么照顾?', + '工作压力大怎么缓解?', + '行程太满怎么优化?', + '久坐怎么改善健康?', ] export function LifeAssistant() { - const [topics, setTopics] = useState(FALLBACK_TOPICS) - const [selectedTopic, setSelectedTopic] = useState(0) - const [topicsCollapsed, setTopicsCollapsed] = useState(false) - const [loadingTopics, setLoadingTopics] = useState(false) - - /** 换一批:调用 AI 动态生成话题(避免重复) */ - const refreshTopics = useCallback(async () => { - setLoadingTopics(true) - try { - const res = await api.getTopics('life', topics.map((t) => t.title)) - if (res.topics?.length > 0) { - setTopics(res.topics) - setSelectedTopic(0) - } - } catch { - // AI 不可用时保持当前话题 - } finally { - setLoadingTopics(false) - } - }, [topics]) - - const currentTopic = topics[selectedTopic] - return ( - - -
- - -
-
- {!topicsCollapsed && ( - - {loadingTopics && ( -
- - AI 正在生成新话题… -
- )} -
- {topics.map((t, i) => ( - - ))} -
-
- )} -
- - {currentTopic && ( - - )} +
) }