10 KiB
10 KiB
记之项目交接档案
生成时间: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-256:2BE1DF66A92FC2D35F41197CDEEEC3240B568EFADE3FCA7A5442DC914AFC5316
签名证书 SHA-256:dc625141f914c86e30001a2c6187eb4a73babcd62e739d4b053f1fc7e93d3e6c
对应更新说明:
C:\Users\nanxun\Documents\dsworkspace\jizhang\release-notes\JiZhi-1.2.5-internal-132.md
ADB 当时未发现在线设备,所以没有自动覆盖安装。
3. 最近已实现重点
3.1 无障碍支付识别与本地 OCR
最近一轮实现目标:修复微信/支付宝红包、支付去重和识别时间问题。
主要实现点:
- 支付流程状态支持
payment、transfer、red_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:xxUTC 值修复后显示为上海时间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.miaoji,Internal 包名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. 下一步建议
优先级从高到低:
- Vivo 真机继续验收微信/支付宝红包、扫码支付、转账、通知与 OCR 双通道去重。
- 启动 Docker Desktop 后补跑后端集成测试,尤其是 UTC 时间序列化、幂等入账、用户隔离和账本隔离。
- 检查更新弹窗对 Markdown 的渲染能力;若仍无法解析,建议把更新说明限制为纯文本 Markdown 子集:标题、短横列表、空行。
- 清理 Flutter analyze 的 82 条 info 级提示,至少优先清掉本轮触碰过的文件。
- 继续优化智能识别诊断页,让“没事件、截图失败、OCR 无结果、规则拒绝、已入账、已合并”一眼能分清。
- 把隐私政策、权限用途和第三方 SDK 清单里的 ML Kit 本地 OCR 描述补齐,方便后续上架审查。
- 测试游客离线、登录同步、AI 权限关闭、AI 对话次数限制和深色模式全页面一致性。
8. 注意事项
- 不要把正式备案包
com.nx.miaoji和内测包com.nx.miaoji.internal混用。 - 测试阶段不要构建或安装 Production,除非用户明确要求。
- 不要恢复音量键快捷截图,用户已经要求恢复系统原生音量键。
- 不要绕过
FLAG_SECURE或支付 App 的安全截屏限制。 - 不要保存、上传或记录完整 OCR 原文、控件树、截图图片、API Key、JWT 或签名密码。
- 数据库里已有 UTC 墙钟时间不要迁移,当前策略是在读取和显示层修复。
- 若用户继续反馈“识别不到”,优先看智能识别最近诊断:事件是否收到、流程类型、金额来源、拒绝原因、OCR 是否 capture_failed。