Commit Graph

897 Commits

Author SHA1 Message Date
iven
d623f8b2ff fix: V1 测试版本端到端验证修复 — 6 CRITICAL + 3 HIGH 问题全量修复
修复项:
- fix(db): 迁移 149 — 修复 Admin 角色权限绑定被迁移链破坏 (FE-C1)
- fix(health): 4 个 handler 添加空名称验证 — Doctor/Article/AlertRule/Tag (API-C1~C4)
- fix(health): Stats 仪表盘 new_this_week 查询修复 — SeaORM date_trunc bug (FE-C2)
- fix(server): 添加安全响应头 — X-Frame-Options/CSP/XSS-Protection/Referrer-Policy (SEC-H1)
- fix(mp): 预约创建契约修复 — notes/reason 字段映射 + 移除 schedule_id (MP-H1)
- fix(mp): 咨询会话 subject/last_message 字段改为可选 (MP-H3)
- fix(ai): AiConfig Default derive 替代手写 impl (clippy)

测试报告:
- 8 维度端到端测试全部完成 (后端 87 用例 / 前端 30 页面 / 小程序 80+ API / 安全 20 项 / 性能 20 端点)
- 多角色 7 角色 49 检查 100% 通过
- 综合测试报告 + 专家评估报告
2026-05-18 10:24:40 +08:00
iven
38b0d91407 feat(mp): AI 聊天传递 patient_id 支持体征数据查询 Tool Call
- ai-chat service: sendAiMessage 新增 patientId 可选参数
- messages 页面: 从 authStore 获取 currentPatient.id 传入

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 09:35:18 +08:00
iven
20714661d2 docs(qa): 五专家组头脑风暴 V1 测试发布就绪评估报告
综合评分 6.8/10 (B),有条件通过内部测试发布。
9 个章节完整覆盖:执行摘要 / 产品 / 架构 / 安全 / 测试 / UX / 行动计划 / 风险 / V1.1 路线图。
2026-05-18 04:50:36 +08:00
iven
edea8f49d1 docs(wiki): 关键数字更新 — AI Agent Phase 0 完成(迁移 148、AI 表 13、权限码 132) 2026-05-18 04:00:02 +08:00
iven
882b27ab7a fix(ai): Agent chat handler 精确选择 FC-capable provider + 环境变量适配
- chat_handler: 使用 get_provider("claude") 精确获取,避免 resolve fallback 到 Ollama
- ProviderRegistry: 新增 get_provider() 方法(无 health check,无 fallback)
- orchestrator: 从 ANTHROPIC_DEFAULT_SONNET_MODEL 读取模型名,兼容智谱代理
- erp-server: Claude provider 注册优先读 ANTHROPIC_AUTH_TOKEN + ANTHROPIC_BASE_URL

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 03:58:38 +08:00
iven
e47fe547c8 test(ai): Phase 0 集成测试 — Agent 循环 + Tool 执行 + Mock Provider 2026-05-18 03:17:34 +08:00
iven
aab4dfea79 feat(ai): 改造 chat_handler 接入 AgentOrchestrator — ReAct Agent 首次跑通 + 新增会话权限码 2026-05-18 03:12:33 +08:00
iven
f42669f934 feat(ai): 实现 query_patient_vitals Tool — 首个端到端 Agent Tool 2026-05-18 02:58:38 +08:00
iven
2d62605812 feat(ai): AgentTool trait + ToolRegistry + AgentOrchestrator — ReAct 循环(最多 5 轮 Tool Call) 2026-05-18 02:56:26 +08:00
iven
877e9831f6 feat(db): 迁移 000148 — AI 聊天会话/消息/工具日志/用户画像 4 张表 2026-05-18 02:51:58 +08:00
iven
f668f0995a feat(core): HealthDataProvider 新增 get_upcoming_appointments + get_medication_list 2026-05-18 02:47:15 +08:00
iven
46b30504a5 feat(ai): Ollama Provider 声明不支持 Function Calling 2026-05-18 02:37:12 +08:00
iven
f42e3ba611 feat(ai): OpenAI Provider 实现 generate_with_tools — function calling 支持 2026-05-18 02:35:50 +08:00
iven
64456d0172 feat(ai): Claude Provider 实现 generate_with_tools — tool_use/tool_result 解析 2026-05-18 02:32:39 +08:00
iven
cad48a97d5 feat(ai): AiProvider trait 新增 generate_with_tools 默认方法 + UnsupportedOperation 错误变体 2026-05-18 02:29:19 +08:00
iven
01c75dbf5d feat(ai): 添加 Agent Function Calling DTO — ChatMessage/ToolDefinition/ToolCall/AgentGenerateResponse 2026-05-18 02:26:57 +08:00
iven
4e12298ff3 docs: 发散式讨论记录 — AI Agent 突破口方向确认 2026-05-18 02:19:03 +08:00
iven
e149a61ce6 fix(auth): error 类型 + auth_service 小修复 2026-05-18 02:14:14 +08:00
iven
3aa71a94d2 docs(skills): design-handoff 设计稿 + spec + .gitignore 更新
- mp-11-doctor-core 设计交付包(截图 + tokens)
- mp-13/mp-14 新原型 HTML
- design-handoff skill 设计规格文档
- .gitignore 排除 dist-h5/test-results/uploads 等构建产物
2026-05-18 02:13:29 +08:00
iven
ded37830fe feat(mp): 新增 AvatarCircle/ShortcutButton/TodoAlert 组件 + 商品详情页
- AvatarCircle: 头像圆形组件
- ShortcutButton: 快捷操作按钮
- TodoAlert: 待办提醒组件
- pkg-mall/product: 积分商品详情页
2026-05-18 02:12:58 +08:00
iven
e555496528 feat(mp): design-handoff 产出的页面样式和组件优化
- 首页/商城/医生端/积分/家庭档案等页面 SCSS + TSX 更新
- TabFilter 组件样式优化
- points service 接口调整
- app.config 路由注册更新
2026-05-18 02:12:41 +08:00
iven
2698c98888 docs(ai): Phase 0 实施计划 — 12 Tasks,修复 Review R1 问题
- 复用已有 TokenUsage(修复编译冲突)
- AppointmentSummaryDto.id 改为 Uuid + scheduled_at 改为 DateTime
- Orchestrator 达到上限时用 User role(而非 Assistant)
- 添加路由说明(Phase 0 复用 /ai/chat,Phase 2 变更)
- 添加模型选择说明(Phase 0 硬编码 auto)
2026-05-18 02:10:59 +08:00
iven
31771168dd docs(ai): Spec Review R2 修复 — 复用 HealthDataProvider + 新增 generate_with_tools
CRITICAL:
- 移除重复的 HealthDataQuery trait,扩展现有 HealthDataProvider(新增 2 方法)
- Provider 适配改为新增 generate_with_tools 方法,不破坏现有 generate 路径

IMPORTANT:
- 修复章节编号(全文重排为连续编号)
- ai_tool_call_logs 补充 created_by + 说明省略原因(append-only)
- ai_user_profiles 说明省略 created_by/updated_by 原因(Agent 自动维护)
- ToolContext 改为持有 Arc<dyn HealthDataProvider> 而非裸 db
- SSE 语义明确:仅流式输出最终回复
- 5 轮上限强制终止逻辑:追加总结指令让 LLM 正常结束
- GenerateRequest 不再破坏性修改,新旧路径并行
2026-05-18 01:57:16 +08:00
iven
b0892706c8 fix(skills): Step 7 改为 design-handoff 自行实施,不再调用 huashu-design
原因: huashu-design 是纯设计 skill,加实施模式会导致人格冲突、
SKILL.md 膨胀、约束倒灌。design-handoff 已有 SPEC+截图+Token 映射,
直接在当前会话实施代码更自然。
2026-05-18 01:54:17 +08:00
iven
530262590e feat(skills): design-handoff 升级为全流程编排器
- 新增 Step 0: 调用 huashu-design 设计 HTML 原型
- 新增 Step 7: 调用 huashu-design 根据 SPEC 实施代码
- 支持两种输入模式: 从需求开始(完整7步) / 从原型开始(6步)
- 简化文档: 移除冗余的降级代码块,保留核心流程
2026-05-18 01:51:40 +08:00
iven
6759723731 docs(ai): 修复 Spec Review 发现的 9 个问题
CRITICAL 修复:
- 新增跨 crate 数据访问架构(erp-core HealthDataQuery trait)
- 新增 4 个权限码声明(session.list/manage/history + chat.send)
- 明确 Provider Function Calling 需中等程度重构,补充适配方案

IMPORTANT 修复:
- 说明与 copilot_chat_logs 表的关系(并存不迁移)
- 新增 ai_user_profiles 表(长期记忆/用户画像)
- 定义 DisplayHint 枚举(5 种富消息类型)
- Phase 0 验证标准修正为新端点
- 补充 Taro SSE 兼容层 + Web 从零构建,工期上调
- 新增 PII 脱敏规范(6 类字段处理规则)
- 新增故障处理与降级章节
- Phase 0/2 工作量估算上调,总工期 16-23→20-27 天
2026-05-18 01:51:03 +08:00
iven
1c8319fb4d docs(ai): AI Agent 突破口设计规格 — ReAct Agent + Function Calling
erp-ai 客服从简单问答升级为多策略 ReAct Agent:
- Agent Orchestrator 实现 ReAct 循环(最多 5 轮 Tool Call)
- 4 类 12 个 Tool 覆盖数据查询/AI 分析/知识服务/行动操作
- 多策略 System Prompt(安抚/科普/推荐/预警/引导到院)
- 3 张新表(sessions/messages/tool_logs)+ 会话管理 API
- 小程序 + Web 富消息渲染 + SSE 流式输出
- 4 Phase 分阶段实施,总工期 16-23 天
2026-05-18 01:42:13 +08:00
iven
6151fde7c4 fix(skills): 修复 design-handoff 医生端原型输出质量
- match-tokens: alias 增加值条件映射,支持 doctor/patient variant 自动检测
- parse-prototype: 支持 IosFrame label prop 提取(JSX 属性模式)
- interaction-rules: login-cta 增加 exclude_patterns 避免"立即关注"误报
- tokens.yml: T.pri/T.priL/T.priD alias 改为数组格式,按值匹配 variant

验证: 患者端 T.pri→--tk-pri 确认,医生端 T.pri→--tk-pri.doctor 确认
2026-05-18 01:00:20 +08:00
iven
c26ca9088b feat(skills): E2E 验证通过 + 首个交付包(mp-00-visitor) + .design/tokens.yml
全管线验证结果:
- parse: 22 tokens, 5 screens, 7 components
- screenshots: 5/5 PNG 截图(2x 高清,裁掉设备框)
- token match: 20/22 matched (19 confirmed, 14 pending, 2 unmatched)
- interactions: 5/8 rules matched

交付包: docs/design/mp-00-visitor/
- screenshots/ (5 PNG)
- tokens.json (三层匹配结果)
- META.yml (元数据)

配置: .design/tokens.yml (项目级 Token 配置)
2026-05-18 00:08:05 +08:00
iven
63a9dac9d3 docs(skills): 更新 SKILL.md 脚本调用参数对齐实际接口
- parse-prototype.mjs: 输出 tokens/inlineStyles/screens/components
- extract-screenshots.mjs: 参数改为 <html> <output-dir>
- match-tokens.mjs: 参数改为 <parse-result.json> <tokens.yml>
- infer-interactions.mjs: 参数改为 <html> <rules.yml>
- 输出目录结构对齐 spec: docs/design/mp-00-visitor/
2026-05-18 00:05:59 +08:00
iven
a4732cd2d4 feat(skills): 添加截图提取 + 交互推断脚本 + SPEC 模板
- extract-screenshots.mjs: Playwright 截取 IosFrame 内容区域,裁掉设备框
- infer-interactions.mjs: 8 条规则正则匹配源码推断交互行为
- 重写 interaction-rules.yml: patterns 改为代码级正则(非自然语言描述)
- templates/spec-template.md: SPEC.md 六章节模板
2026-05-18 00:04:31 +08:00
iven
35bd60af5b feat(skills): 添加 HTML 原型解析 + Token 三层匹配脚本
- parse-prototype.mjs: 括号深度计数法提取 T 对象、内联样式值、screen/组件信息
- match-tokens.mjs: 别名直查→值精确匹配(带 CSS 属性消歧)→色彩模糊匹配(RGB Δ<30)
- 修复 tokens.yml radius 段 YAML 格式(unmapped 提升为顶级段)
2026-05-17 23:37:59 +08:00
iven
b8dce8a42a feat(skills): 创建 design-handoff skill 骨架 + 配置文件
- SKILL.md: skill 入口,含 6 步核心流程 + 组件映射推断规则
- defaults/tokens.yml: 从 tokens.scss 提取的完整 Token 注册表
- defaults/components.yml: 16 个 UI 组件映射 + 5 个框架组件
- rules/interaction-rules.yml: 8 条交互推断规则
- package.json + js-yaml 依赖
2026-05-17 23:17:37 +08:00
iven
d26ea64ab2 docs(wiki): 全面重写小程序质量规范清单 — 12类44条规则,覆盖164条git历史
从 164 条小程序 git 提交中全量抽象问题模式:
- 新增 4 类规则:前后端接口契约(字段对齐/API路径/必填字段)、安全(XSS/输入验证/敏感数据/权限)、定时器与副作用清理(setTimeout)、开发环境(DevTools优化)
- 补充已有类别:请求缓存去重(1.4)、统一组件库(3.5-3.6)、认证恢复(5.3-5.4)、对齐原型(7.4-7.5)、ErrorBoundary(9.3)
- 溯源表从 13 条扩至 38 条,每条对应具体修复提交
- 自查脚本从 6 项扩至 10 项
- 统计概览:44 规则 / 66+ fix 提交 / 20 CRITICAL+HIGH
2026-05-17 20:33:25 +08:00
iven
676a6c0e13 docs(wiki): 新增小程序质量规范清单 — 8类规则+提交前检查+PR Review依据
抽象两轮审计中的 20+ 问题为可复用规范:
- 并发与请求层:限流器/长轮询独立通道/reLaunch去重
- 导航与路由:页栈保护/分包预加载/生命周期防重入
- 组件与渲染:禁止render body组件/双重ScrollView/图片懒加载
- 数据与内存:数组上限/去重索引一致/Storage清理
- 认证与会话:模块缓存清理/Token刷新安全
- 审计与交付:提交前必检/PR Review检查点/里程碑审计
2026-05-17 20:12:39 +08:00
iven
fcce2f5c51 fix(mp): 二轮审计修复 — ScrollView嵌套/InputField重建/markdown分组/BLE上限/缓存清理
CRITICAL: ai-report/list PageShell scroll=false 修复双重滚动冲突
HIGH: dialysis/create InputField 提取为独立组件避免 render 销毁重建
MEDIUM: markdownToHtml 连续<li>合并到单个<ul>
MEDIUM: 咨询详情页图片添加 lazyLoad
MEDIUM: BLEManager readings 添加 MAX_LIVE_READINGS=200 上限
MEDIUM: DataBuffer trimToMax 时重建 seenKeys 保持一致性
MEDIUM: auth.ts logout 清理模块级缓存变量
LOW: request.ts safeReLaunch 添加 console.warn + doRefresh 死锁警告注释
2026-05-17 18:54:27 +08:00
iven
66aef532fa docs(wiki): 更新小程序并发安全相关内容 — 并发限制器/长轮询/导航保护 2026-05-17 18:37:55 +08:00
iven
3c98aaedbd docs(wiki): 更新关键数字日期 — 小程序 P0-P2 修复 2026-05-17 17:13:54 +08:00
iven
59dd5ef38e fix(mp): P1+P2 稳定性加固 — 导航安全+生产日志+分包预加载+logout清理
P1:
- 全局 23 个页面 Taro.navigateTo → safeNavigateTo,防止页栈超10层
- 生产构建保留 console.warn/error,便于线上问题排查
- 添加 preloadRule 分包预加载(首页预加载健康/医生/文章分包)

P2:
- logout 时清理 ai_chat_history + BLE DataBuffer 缓存
- restore() 移除冗余的双重 Storage 读取(secureGet 已包含 getStorageSync)
- 首页文章图片添加 lazyLoad
2026-05-17 17:13:35 +08:00
iven
1576709342 docs(wiki): 新增症状导航 — 开发者工具卡死(并发饥饿)修复记录 2026-05-17 17:02:08 +08:00
iven
9d50ef7847 fix(mp): 修复并发请求饥饿导致开发者工具卡死
- 长轮询走独立通道(requestUnlimited),不再占用 ConcurrencyLimiter 槽位
- ConcurrencyLimiter 上限 8→12,缓解 TabBar 切换请求风暴
- 新增 safeReLaunch 去重,防止并发 401 多次触发页面跳转
- maxFailures 50→10,后端不可用时快速止损而非持续 18 分钟重试

根因:咨询页长轮询每次占用槽位 25-30s,8 个槽位被占满后
所有新请求排队等待,叠加 401 场景形成死锁。
2026-05-17 17:01:24 +08:00
iven
b84becfbea fix(mp): 文章详情页对齐 mp-04 原型 — 流式布局+底部浮动栏
- 标题 22px serif bold(原型值),元信息 13px tx3
- 正文 15px tx2 lineHeight:1.8 首行缩进(原型值)
- 去掉分段白卡片,改为统一背景流式布局
- 新增底部浮动栏:收藏+分享按钮
- 分隔线 1px bdL
2026-05-17 15:53:03 +08:00
iven
d5ec250184 feat(docker): 云端部署配置 — host 网络模式 + 环境变量模板
- Dockerfile: Rust 版本升级为 latest stable, 添加 curl (healthcheck),
  前端产物 VOLUME 暴露供 OpenResty 挂载
- docker-compose.cloud.yml: 仅 app 容器, host 网络直连宿主机 PG/Redis
- .env.production.example: 环境变量模板含必填/可选项注释
2026-05-17 15:06:53 +08:00
iven
b8ce19f5dc fix(mp): 文章列表页对齐 mp-04 原型 — 分类Tab+卡片布局+字号
- 分类Tab: 选中态 pri 白字+阴影,未选中 surface-alt 圆角药丸
- 文章卡片: 80×80 缩略图+标题 16px serif+摘要 13px+元信息 12px
- ContentCard padding=sm margin=none,PageShell padding=none
- 缩略图 80×80(原型 80×80),封面 r-xs=8(原型 rXs=8)
2026-05-17 14:55:56 +08:00
iven
29d77e8c3d fix(mp): SegmentTabs pill 增加 margin-bottom 间距 2026-05-17 14:38:29 +08:00
iven
6c42d541fc fix(mp): SegmentTabs pill 变体对齐原型 — 等分圆角矩形 + 阴影
pill 变体改为 flex:1 等分宽度、height:44、borderRadius:12px 圆角矩形
(原型 T.rSm=12),选中态加 var(--tk-shadow-tab) 阴影,
字号 15px fontWeight:600 对齐原型。
2026-05-17 14:34:50 +08:00
iven
c631d364b3 fix(core): 消除乐观锁 version.unwrap() 潜在 panic
20 处 ActiveValue::unwrap() + 1 乐观锁递增改为 take().unwrap_or(0) + 1,
避免数据库记录缺少 version 字段时 panic。覆盖 erp-auth/erp-config/
erp-workflow/erp-health/erp-ai/erp-server 7 个 crate。
DTO 层 Option<i32> 字段保持原有 unwrap_or(0) 不变。
2026-05-17 13:05:40 +08:00
iven
7b2c03309c fix(mp): Profile 积分卡片 flex:1 等分宽度 2026-05-17 13:04:10 +08:00
iven
e8bbc36364 perf(auth): JWT 权限缓存 RwLock 替换为 DashMap
USER_SCOPE_CACHE 从 LazyLock<RwLock<HashMap>> 改为 LazyLock<DashMap>,
消除读写锁竞争,提升高并发场景下的认证中间件吞吐量。
过期条目淘汰逻辑改用 DashMap::retain,无需手动获取 write lock。
2026-05-17 12:54:34 +08:00
iven
c2c7f2d967 docs(wiki): 更新 Design Token 字号统计 + ContentCard margin prop 2026-05-17 12:53:28 +08:00