一个面向个人使用的原生 Android 加班工资计算器。
用月历记录每天的加班或调休时长,按工作日 / 休息日 / 节假日规则自动计算,并实时汇总当月金额。
下载最新版本 · 查看 v2.3.1 · 功能亮点 · 本地运行 · 发布与 CI
- 当前正式版本:
v2.3.1 - 当前版本号:
18
- 最新正式发布页:
https://github.com/impersonal-byte/OvertimeCalculator/releases/latest
当前版本会在发版流程完成后自动同步到本 README;具体变更说明以 docs/releases/ 和 GitHub Release 页面为准。
- 月历首页展示整月记录、净时长和累计加班工资
- 支持工作日、休息日、节假日不同倍率
- 支持工作日调休录入,自动按月度余额抵扣
- 支持手动输入时薪,也支持按已发加班工资反推时薪
- 支持手动覆盖某一天的日期类型
- 支持中国节假日基线数据,并通过
timor.tech年度节假日接口静默刷新 - 支持应用内检查更新,从 GitHub Release 下载新版本
- 支持外观模式、动态取色与多套种子色切换
- 支持导出本月 CSV 数据并通过系统分享发送
- 日期类型优先级: 用户手动覆盖 > 节假日/调休规则 > 周末 > 普通工作日
- 默认倍率:
工作日
1.5,休息日2.0,节假日3.0 - 调休规则: 仅工作日允许录入负时长,且优先抵扣工作日加班,再抵扣休息日,最后抵扣节假日
- 反推公式:
时薪 = 已发加班工资 / 倍率加权小时数
- 单
:app模块原生 Android 应用 - Jetpack Compose 单 Activity 架构
- 仍使用手写
AppContainer作为组合根;经过v2.0.0架构评估,现阶段暂不引入 Hilt,也暂不拆多模块 - 业务主数据使用 Room,节假日缓存元数据使用 DataStore,系统强耦合临时状态仍保留在
SharedPreferences
如果你要继续了解当前存储边界,可以直接看:docs/storage-boundaries.md
- Kotlin
- Jetpack Compose
- Material 3
- Navigation Compose
- Android ViewModel
- Room
- DataStore Preferences
- WorkManager
- Robolectric + JUnit4
- GitHub Actions
- 最新正式版本:
https://github.com/impersonal-byte/OvertimeCalculator/releases/latest - 当前版本详情页:
https://github.com/impersonal-byte/OvertimeCalculator/releases/tag/v2.3.1
- 从 GitHub Release 页面下载通用 APK
- 在 Android 设备上手动安装
- 如果设备首次通过浏览器或文件管理器安装 APK,系统可能要求你允许“安装未知应用”
应用内“检查更新”会从 GitHub Release 拉取最新正式版本,并通过系统下载器下载 APK。下载完成后会拉起系统安装流程;如果系统尚未授予安装权限,应用会引导你进入对应设置页。
- Android Studio
- Android SDK
- JDK 17
local.properties中正确配置sdk.dir
.\gradlew.bat testDebugUnitTest
.\gradlew.bat assembleDebug
.\gradlew.bat connectedDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.peter.overtimecalculator.MainSmokeTest
.\gradlew.bat packageReleaseApk调试包: app/build/outputs/apk/debug/app-debug.apk
正式包: app/build/dist/OvertimeCalculator-<version>-universal.apk
当前项目已经启用 Room schema 导出,生成结果位于:
app/schemas/com.peter.overtimecalculator.data.db.AppDatabase/
仓库当前包含两套主要工作流:
Android Verify (Manual)- 仅在 GitHub Actions 页面手动触发
- 运行单元测试、调试构建和 Android UI smoke test
Android Release- 在推送
v*tag 时触发 - 自动校验 tag 与
appVersionName - 自动运行单元测试
- 自动构建正式签名 APK
- 自动创建 / 更新 GitHub Release
- 在推送
需要在 GitHub 仓库 Settings > Secrets and variables > Actions 中配置以下 Secrets:
SIGNING_KEYALIASKEY_STORE_PASSWORDKEY_PASSWORD
PowerShell 生成 SIGNING_KEY:
[Convert]::ToBase64String([IO.File]::ReadAllBytes(".\OvertimeCalculator.jks"))git add app/build.gradle.kts docs/releases/v<version>.md
git commit -m "Release v<version>"
git push origin main
git tag v<version>
git push origin v<version>- tag 去掉前缀
v后,必须与app/build.gradle.kts中的appVersionName完全一致 docs/releases/v<version>.md存在时,release workflow 会优先用它作为 GitHub Release 正文- 普通
git push origin main不会触发正式发版;正式发版依赖v*tag
Android Release工作流会在发版完成后回写README.md中的当前版本链接与版本号区块- 机器维护的区块使用注释标记包围,请不要手动删除:
<!-- BEGIN:... -->
<!-- END:... -->
- 发布说明:
docs/releases/ - 存储边界:
docs/storage-boundaries.md - 代码库地图:
.planning/codebase/
- 当前数据仅保存在本地设备
- 暂无云同步
- 暂无 PDF 导出
- 暂无桌面组件
本项目采用 MIT License。