Files
jizhi/handoff/jizhi-session-handoff-2026-07-23.md
T
2026-07-24 23:11:20 +08:00

10 KiB
Raw Blame History

记之项目交接档案

生成时间:2026-07-23
项目路径:C:\Users\nanxun\Documents\dsworkspace\jizhang

1. 项目概况

这是一个记账 App 项目,当前品牌名为“记之”。项目包含:

  • Flutter 客户端:frontend
  • Android 原生能力:frontend/android/app/src/main/kotlin/com/nx/miaoji
  • .NET 后端:backend
  • 当前内测服务地址:https://lt.frp-say.com:38012
  • 当前内测包名:com.nx.miaoji.internal
  • 正式生产包名:com.nx.miaoji

当前测试主线集中在:AI 记账、截屏/OCR 记账、无障碍/通知智能识别、游客离线、本地数据安全、更新检测和深色模式。

2. 当前最近版本

最近成功构建版本:

包名:com.nx.miaoji.internal
显示名称:记之·内测
显示版本号:1.2.5-internal
构建版本号:132
APK 路径:C:\Users\nanxun\Documents\dsworkspace\jizhang\release\JiZhi-1.2.5-internal-132.apk
APK SHA-2562BE1DF66A92FC2D35F41197CDEEEC3240B568EFADE3FCA7A5442DC914AFC5316
签名证书 SHA-256dc625141f914c86e30001a2c6187eb4a73babcd62e739d4b053f1fc7e93d3e6c

对应更新说明:

C:\Users\nanxun\Documents\dsworkspace\jizhang\release-notes\JiZhi-1.2.5-internal-132.md

ADB 当时未发现在线设备,所以没有自动覆盖安装。

3. 最近已实现重点

3.1 无障碍支付识别与本地 OCR

最近一轮实现目标:修复微信/支付宝红包、支付去重和识别时间问题。

主要实现点:

  • 支付流程状态支持 paymenttransferred_packet_send
  • 微信、支付宝红包资金变化支持:
    • 发红包:支出,默认分类提示 人情
    • 红包到账:收入,默认分类提示 红包
    • 红包退回:收入,默认分类提示 红包
    • 普通红包消息、未领取红包、他人领取消息不自动入账
  • 微信支付结果页如果缺金额,在严格证据成立时使用付款前唯一金额入账。
  • 支付宝成功页刷新、返回重进、通知和 OCR 同时到达时合并为同一个候选,降低重复入账。
  • 连续两笔真实相同金额交易仍通过新提交动作生成新流程 ID,不会被错误合并。
  • 本地 OCR 图片只在内存中处理,不保存原图,不上传。
  • 诊断信息新增:流程类型、金额来源、结果页指纹、拒绝原因等。

关键文件:

frontend/android/app/src/main/kotlin/com/nx/miaoji/PaymentParser.kt
frontend/android/app/src/main/kotlin/com/nx/miaoji/LocalPaymentOcr.kt
frontend/android/app/src/main/kotlin/com/nx/miaoji/ScreenshotAccessibilityService.kt
frontend/android/app/src/main/kotlin/com/nx/miaoji/RecognitionDiagnostics.kt
frontend/android/app/src/main/kotlin/com/nx/miaoji/RecognitionStore.kt
frontend/lib/shared/services/screenshot_channel.dart
frontend/lib/shared/services/recognition_import_service.dart
frontend/lib/features/settings/screenshot_settings_page.dart

3.2 时间修复

用户反馈无障碍入账时间显示成 1970 或 14 点,实际应为上海时间 22 点。

已做修复:

  • 后端 EF 读取 MySQL DateTime 时统一恢复 DateTimeKind.Utc
  • 后端 JSON 输出 UTC 时间时应稳定带 Z
  • Flutter 新增旧格式兼容:无时区字符串按 UTC 解释,再转换为上海时间显示。
  • 不迁移数据库已有值,已有 14:xx UTC 值修复后显示为上海时间 22:xx

关键文件:

backend/MiaoJiZhang.Infrastructure/Persistence/AppDbContext.cs
frontend/lib/shared/services/shanghai_time.dart
frontend/test/theme_and_time_test.dart

3.3 更新检测

已接入 VersionFlow

更新接口根地址:https://version.nxsir.cn
接口路径:/api/client/v1/update
Android/iOS AppKey:已配置在项目中,但交接时不要外传到公开渠道
Internal 渠道:beta
Production 渠道:stable

功能点:

  • 启动后自动检查一次。
  • “我的”页面支持手动检查更新。
  • 非强制更新支持忽略版本。
  • 强制更新阻止继续使用。
  • Android Internal 支持前台下载 APK、SHA-256 校验、包名/版本/签名校验和安装。
  • Android Production 和 iOS 走外链,不内置 APK 自更新安装权限。

3.4 内测环境

当前约定:

  • 只构建 com.nx.miaoji.internal 内测包。
  • Internal 注入:
INTERNAL_BUILD=true
API_BASE_URL=https://lt.frp-say.com:38012
APP_VERSION=20260722-132
  • 之前误装过正式包 com.nx.miaoji,测试阶段应优先使用 com.nx.miaoji.internal
  • 后端应监听 127.0.0.1:3000,由 FRP 映射到 https://lt.frp-say.com:38012

4. 已完成过的重要功能方向

这些内容在本会话中多轮推进过,后续 AI 需要沿着现有实现继续,不要重做:

  • App 改名为“记之”。
  • 正式包名锁定 com.nx.miaojiInternal 包名 com.nx.miaoji.internal
  • 正式备案用 Release Key 已生成过,Debug MD5 不用于备案。
  • 图标资源已换成用户提供的黑白记事本/笔图标方向。
  • AI Agent 已从正则意图迁移到工具调用方向,收入/支出类型不能硬编码为支出。
  • AI 查询应读取账本实时数据,不凭空回答金额。
  • 截屏记账走一次性截图/授权,不保留长期 MediaProjection。
  • 磁贴截图不应强制依赖无障碍;无障碍可用则静默,否则走一次性授权。
  • 音量键快捷触发已放弃,系统音量键应恢复原生调音量。
  • 游客模式应能离线记账、统计、预算和导出;游客不能使用 AI。
  • AI 权限支持按用户关闭,关闭后所有 AI 入口不可见。
  • 深色模式已加入三态:跟随系统、浅色、深色。
  • 智能识别包含无障碍事件识别、通知识别、AI 截图补全三个开关。

5. 当前验证结果

最近一次验证结果:

Android 单元测试:通过
Flutter theme_and_time_test:通过
后端 dotnet build:通过,0 warning / 0 error
Flutter analyze:无 error/warning,剩余 82 条 info 级既有风格提示
Android Internal Release 构建:通过

未完成验证:

  • 后端集成测试依赖 Docker Desktop / Docker Linux Engine,当时 Docker 未启动,无法跑完。
  • ADB 没有在线设备,因此未自动覆盖安装 APK。
  • 微信/支付宝红包和支付流程仍需 Vivo 真机继续验收。

6. 常用命令

Android Internal 单测

cd C:\Users\nanxun\Documents\dsworkspace\jizhang\frontend\android
$env:FLUTTER_ALREADY_LOCKED='true'
$defs=@('INTERNAL_BUILD=true','API_BASE_URL=https://lt.frp-say.com:38012','APP_VERSION=20260722-132') | ForEach-Object { [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($_)) }
.\gradlew.bat --no-daemon :app:testInternalReleaseUnitTest "-Pdart-defines=$($defs -join ',')"

Flutter 测试

cd C:\Users\nanxun\Documents\dsworkspace\jizhang\frontend
C:\Users\nanxun\Documents\flutter\bin\cache\dart-sdk\bin\dart.exe C:\Users\nanxun\Documents\flutter\bin\cache\flutter_tools.snapshot test --no-pub test\theme_and_time_test.dart

Flutter 静态检查

cd C:\Users\nanxun\Documents\dsworkspace\jizhang\frontend
C:\Users\nanxun\Documents\flutter\bin\cache\dart-sdk\bin\dart.exe C:\Users\nanxun\Documents\flutter\bin\cache\flutter_tools.snapshot analyze --no-pub

后端编译

cd C:\Users\nanxun\Documents\dsworkspace\jizhang\backend
dotnet build MiaoJiZhang.sln --no-restore

构建 Internal Release APK

cd C:\Users\nanxun\Documents\dsworkspace\jizhang\frontend\android
$env:FLUTTER_ALREADY_LOCKED='true'
$defs=@('INTERNAL_BUILD=true','API_BASE_URL=https://lt.frp-say.com:38012','APP_VERSION=20260722-132') | ForEach-Object { [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($_)) }
.\gradlew.bat --no-daemon :app:assembleInternalRelease "-Pdart-defines=$($defs -join ',')"

查看 APK 信息和 SHA-256

cd C:\Users\nanxun\Documents\dsworkspace\jizhang
C:\Users\nanxun\AppData\Local\Android\Sdk\build-tools\36.1.0\aapt.exe dump badging release\JiZhi-1.2.5-internal-132.apk
C:\Users\nanxun\AppData\Local\Android\Sdk\build-tools\36.1.0\apksigner.bat verify --print-certs release\JiZhi-1.2.5-internal-132.apk
Get-FileHash release\JiZhi-1.2.5-internal-132.apk -Algorithm SHA256

ADB 安装

C:\Users\nanxun\Documents\platform-tools\adb.exe devices
C:\Users\nanxun\Documents\platform-tools\adb.exe install -r C:\Users\nanxun\Documents\dsworkspace\jizhang\release\JiZhi-1.2.5-internal-132.apk

7. 下一步建议

优先级从高到低:

  1. Vivo 真机继续验收微信/支付宝红包、扫码支付、转账、通知与 OCR 双通道去重。
  2. 启动 Docker Desktop 后补跑后端集成测试,尤其是 UTC 时间序列化、幂等入账、用户隔离和账本隔离。
  3. 检查更新弹窗对 Markdown 的渲染能力;若仍无法解析,建议把更新说明限制为纯文本 Markdown 子集:标题、短横列表、空行。
  4. 清理 Flutter analyze 的 82 条 info 级提示,至少优先清掉本轮触碰过的文件。
  5. 继续优化智能识别诊断页,让“没事件、截图失败、OCR 无结果、规则拒绝、已入账、已合并”一眼能分清。
  6. 把隐私政策、权限用途和第三方 SDK 清单里的 ML Kit 本地 OCR 描述补齐,方便后续上架审查。
  7. 测试游客离线、登录同步、AI 权限关闭、AI 对话次数限制和深色模式全页面一致性。

8. 注意事项

  • 不要把正式备案包 com.nx.miaoji 和内测包 com.nx.miaoji.internal 混用。
  • 测试阶段不要构建或安装 Production,除非用户明确要求。
  • 不要恢复音量键快捷截图,用户已经要求恢复系统原生音量键。
  • 不要绕过 FLAG_SECURE 或支付 App 的安全截屏限制。
  • 不要保存、上传或记录完整 OCR 原文、控件树、截图图片、API Key、JWT 或签名密码。
  • 数据库里已有 UTC 墙钟时间不要迁移,当前策略是在读取和显示层修复。
  • 若用户继续反馈“识别不到”,优先看智能识别最近诊断:事件是否收到、流程类型、金额来源、拒绝原因、OCR 是否 capture_failed。