新增查当周按钮,代码重构与数据分离

- 新增"查当周"按钮,计算当周周一至周日的加班总工时
- 新增 createQueryButton 工厂函数,消除月按钮重复代码
- 修复 calculateTimeDifference 返回字符串导致 NaN 的 bug
- 修复 sumOfSecondColumn/get_work_time 缺少空值保护的 bug
- 修复 isWorkDay 中 == 改为 ===
- var 统一为 const/let,提取 QUERY_DELAY_MS 常量
- 提取 getCustomMonthRange 中重复的 formatLocal
- 按钮增加 cursor:pointer 样式
- 数据与代码分离:main.template.js(~300行)+ build.py 自动组装 main.js
- update.py/comp_json.py 支持命令行年份参数,默认当年
- comp_json.py 增加去重逻辑
- 更新 README 为 GitHub 开源项目风格,含快速上手和每年更新章节

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-22 19:11:13 +08:00
parent 6943e17c12
commit b74978d2dc
6 changed files with 559 additions and 129 deletions

109
README.md
View File

@@ -1,23 +1,104 @@
# FM-OHS
统计复旦微加班工时
复旦微加班时间统计 —— 一个运行在金蝶 EAS HR 考勤页面上的 [Tampermonkey][tm] 用户脚本,自动计算并显示加班工时
## 主要功能:
[tm]: https://www.tampermonkey.net/
- 查询加班工时
- 下班时间按下午5:20后计算月计算周期上月21号~本月20号。
- 根据内置的工作日数据库判断是否工作日
- 查询结果显示在表格上,简单直观
## 功能
### 下载安装
- **加班自动计算**:工作日按 17:20 后计算,非工作日(周末/节假日)按全天计算
- **内置节假日数据库**:根据工作日数据自动识别调休日、法定节假日
- **多维度查询**:支持当月、上月、当周等一键查询
- **结果直显**:加班时数直接写入考勤表格,非工作日绿色高亮
1. 安装浏览器脚本管理扩展(任选其一)
- [脚本猫](https://docs.scriptcat.org/)
- [tampermonkey](https://www.tampermonkey.net/index.php?locale=zh)
## 快速上手
2. 脚本已经上传到[Greasy Fork](https://greasyfork.org/zh-CN) 点击安装即可
- 脚本链接:[Greasy Fork - 复旦微加班时间统计](https://greasyfork.org/zh-CN/scripts/542984-%E5%A4%8D%E6%97%A6%E5%BE%AE%E5%8A%A0%E7%8F%AD%E6%97%B6%E9%97%B4%E7%BB%9F%E8%AE%A1)
### 1. 安装脚本管理器
### 使用方法
任选其一
脚本会在菜单栏新增五个按钮,点击对应的按钮即可实现不同的查询功能。
- [Tampermonkey](https://www.tampermonkey.net/index.php?locale=zh)(推荐)
- [脚本猫](https://docs.scriptcat.org/)
### 2. 安装脚本
前往 [Greasy Fork - 复旦微加班时间统计][gf] 点击安装。
[gf]: https://greasyfork.org/zh-CN/scripts/542984-%E5%A4%8D%E6%97%A6%E5%BE%AE%E5%8A%A0%E7%8F%AD%E6%97%B6%E9%97%B4%E7%BB%9F%E8%AE%A1
### 3. 使用
打开金蝶 EAS HR 考勤页面,菜单栏会自动出现 6 个按钮:
| 按钮 | 功能 |
|------|------|
| 统计加班时间 | 直接计算当前表格中的加班工时 |
| 查当月 | 查询当月考勤周期21 日至次月 20 日) |
| 查上月 | 查询上月考勤周期 |
| 查上上月 | 查询两个月前的考勤周期 |
| 查上上上月 | 查询三个月前的考勤周期 |
| 查当周 | 查询当周(周一至周日) |
## 每年更新
节假日数据每年需要更新一次。API 每天限 5 次调用,因此设计为一年调用一次后持久化。
### 前置条件
- Python 3.x
- `requests` 库:`pip install requests`
### 更新步骤
```bash
# 1. 抓取新年节假日数据(修改 update.py 中的 year 参数为目标年份)
python update.py
# 2. 合并到数据库并自动构建 main.js
python comp_json.py
# 3. 将生成的 main.js 内容更新到 Greasy Fork 或手动安装到 Tampermonkey
```
`comp_json.py` 会自动将新数据合并到 `data.json`,然后调用 `build.py` 生成包含完整数据的 `main.js`
## 开发
### 项目结构
```
FM-OHS/
├── main.template.js # 脚本代码模板(~300 行,可读可维护)
├── main.js # 构建产物,由 build.py 生成(提交到 Greasy Fork
├── data.json # 节假日数据(唯一数据源)
├── build.py # 构建脚本:将 data.json 注入模板 → main.js
├── update.py # 从 API 抓取年度节假日数据
├── comp_json.py # 合并新数据到 data.json 并自动构建
└── holidays_2026.json # 2026 年原始 API 响应数据
```
### 修改代码
1. 编辑 `main.template.js`(不需要碰 `main.js`
2. 运行 `python build.py` 生成 `main.js`
3. 在浏览器中加载 `main.js` 验证
### 数据格式
`data.json` 中的每条记录:
```json
{
"year": 2026,
"date": 20260101,
"week": 4,
"workday": 1,
"holiday": 88
}
```
关键字段:`workday`1 = 工作日2 = 非工作日),`date`YYYYMMDD 格式)。
## License
MIT