# 项目评审会议记录 (Project Review Meeting Minutes)

**日期**: 2025年12月1日
**参与人**: 产品经理 (PM), 后端开发 (Backend), 测试工程师 (QA)
**主题**: 现有功能评审与迭代建议

---

## 1. 产品经理 (PM) 评审

**观点**: 核心功能闭环已完成，但用户体验 (UX) 细节有待打磨。

*   **UI/交互体验**:
    *   **语音交互**: 目前“上滑取消”的阈值是固定的 (`diff > 100`)，用户没有视觉反馈。建议增加一个“松开手指取消发送”的视觉提示区域（类似微信的红色区域），让用户明确知道现在的状态是“录音中”还是“即将取消”。
    *   **消息类型**: 界面上有 `qsendText` (Type 1) 和 `gsendText` (Type 2) 两种发送逻辑，对应“私有”和“全局”。这对用户来说可能比较晦涩。建议在 UI 上明确区分，例如使用不同的按钮颜色或图标，或者通过 Tab 切换当前发送模式，而不是并列两个按钮（如果目前是并列的话）。
    *   **加载状态**: 下拉刷新时的 `pullText` 变化（“下拉刷新” -> “释放立即刷新”）是好的，但建议增加更平滑的动画过渡。

*   **业务逻辑**:
    *   **位置信息**: 每次发送消息都强制获取位置 (`wx.getLocation`)。如果用户在室内 GPS 信号弱，会导致发送延迟或失败吗？
        *   *建议*: 位置获取改为异步或非阻塞，或者允许用户在设置中关闭“发送位置”功能，除非这是核心考勤业务必须的。

---

## 2. 后端开发 (Backend) 评审

**观点**: 代码结构尚可，但配置管理和数据一致性存在风险。

*   **配置管理**:
    *   **硬编码 URL**: API 地址 `https://wx-xcx-check.blv-oa.com:4433` 直接写死在 `chat.js` 中。
        *   *风险*: 切换测试/生产环境非常麻烦。
        *   *建议*: 提取到单独的 `config.js` 文件中，根据 `wx.getAccountInfoSync().miniProgram.envVersion` 自动切换环境。

*   **数据一致性与分页**:
    *   **分页逻辑脆弱**: 前端计算页码的逻辑是 `Math.floor(oldli.length / 20) + 1`。
        *   *风险*: 如果在用户浏览期间，有新消息产生（或者删除了消息），基于数量的分页会导致数据重复或遗漏。
        *   *建议*: 建议改为基于 `last_id` (游标分页) 或时间戳分页，这样更稳定。
    *   **时间格式化**: 前端自己处理 `formatTime` 并替换 `T` 为空格。建议后端直接返回标准格式，或者前端使用 `dayjs` 等库统一处理，避免手动字符串操作带来的潜在 Bug。

*   **网络层**:
    *   **乐观更新风险**: `qsendText` 中先 `pushMsg` (渲染) 再 `upload` (上传)。
        *   *风险*: 如果 `upload` 失败（断网、服务器错误），用户界面上显示消息已发送，但实际上服务器没收到。
        *   *建议*: 消息对象应增加 `status` 字段 (`sending`, `success`, `failed`)。发送失败应显示红色感叹号，并支持点击重发。

---

## 3. 测试工程师 (QA) 评审

**观点**: 异常处理覆盖不足，存在边界情况 Bug。

*   **语音功能边界测试**:
    *   **中断测试**: 在录音过程中，如果接到来电、闹钟响铃或切出小程序，`manager.onStop` 是否会正常触发？目前 `onUnload` 做了停止，但 `onHide` (切后台) 似乎没有处理，可能导致后台继续录音或状态卡死。
    *   **短语音**: 代码中 `cost < 350` 毫秒会被丢弃。这个阈值是否合理？用户快速点击可能会被误判为录音失败。建议给用户一个 "说话时间太短" 的 Toast 提示（目前代码里有 `onError` 处理 `-30003`，但手动停止的逻辑里直接 return 了，没有提示）。

*   **权限流程**:
    *   **拒绝后重试**: `authorize.js` 封装得不错。但如果用户在系统层面（手机设置）关闭了微信的麦克风权限，`wx.authorize` 会直接失败。需要确保 `fail` 回调里的引导文案足够清晰。

*   **兼容性**:
    *   **屏幕适配**: `GetmyScrollhight` 使用了 `boundingClientRect`。在不同机型（特别是带刘海屏/灵动岛的 iPhone）上，底部安全区 (`safe-area-inset-bottom`) 是否处理得当？建议检查 CSS 中是否有 `padding-bottom: env(safe-area-inset-bottom)`。

---

## 4. 迭代计划 (Action Items)

### 优先级 P0 (必须修复)
1.  **[Dev]** 提取 API URL 到配置文件。
2.  **[Dev]** 修复“乐观更新”问题：添加消息发送状态（发送中/失败），并在上传失败时给予用户反馈。
3.  **[Dev]** 处理 `onHide` 生命周期，确保切后台时停止录音。

### 优先级 P1 (建议优化)
1.  **[UX]** 优化语音录制的 UI 反馈（上滑取消的视觉提示）。
2.  **[Dev]** 优化分页逻辑，由后端支持或前端改为更稳健的游标方式。
3.  **[QA]** 进行弱网环境下的发送测试，验证位置获取超时对发送的影响。

### 优先级 P2 (未来规划)
1.  **[Feature]** 增加语音转文字后的“编辑”功能（目前是识别完直接发送，用户无法修改错别字）。
2.  **[Feature]** 消息撤回功能。
