Files
work-hours-tracker/server/core/schema.sql
T
OpenClaw Agent 2329955e32 baseline: 薪酬逻辑收口到 shared/payroll.js 后的当前全量状态
这是第一个包含完整工作区的提交,也是后续「拆 SFC / 上 Vite」的回滚基线。

此前的提交均为 index.html 单文件历史快照,由 .bak 文件重建。

当前状态(提交前已实测):
- index.html 内联薪酬算法已删除,改调 WHTPayroll
- shared/payroll.js 为唯一薪酬实现,浏览器与 Node 共用
- 对外接口未变:aggregateMonth / isCutEdge / payDayKind 等保留同名薄包装

未入库内容见 .gitignore:依赖、Chrome 验证 profile、验证截图、
运行时 sqlite 数据与日志、时间戳备份、.trash。
2026-09-05 14:35:00 +08:00

68 lines
2.5 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 工时记账服务端 schema
-- 同时兼容 VPS 上的 node:sqlite 与 Cloudflare D1(都是 SQLite 方言)
-- 设计要点:
-- 1. users.rev 是该用户的单调递增版本号,任何写入都 +1,客户端靠它做增量拉取
-- 2. records / month_adjust 用 deleted 墓碑标记而非物理删除,否则增量同步无法传播「删除」
-- 3. 所有时间戳统一存 ISO 8601 字符串(UTC),避免 D1 与 SQLite 的时间函数差异
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
pw_hash TEXT NOT NULL,
pw_salt TEXT NOT NULL,
pw_iter INTEGER NOT NULL,
rev INTEGER NOT NULL DEFAULT 0,
created_at TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS sessions (
token_hash TEXT PRIMARY KEY,
user_id INTEGER NOT NULL,
created_at TEXT NOT NULL,
expires_at TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_sessions_user ON sessions(user_id);
CREATE INDEX IF NOT EXISTS idx_sessions_exp ON sessions(expires_at);
-- 每日打卡:主键 (user_id, day),day 形如 2026-09-08
CREATE TABLE IF NOT EXISTS records (
user_id INTEGER NOT NULL,
day TEXT NOT NULL,
status TEXT,
shift_type TEXT,
hours REAL,
contraband_found INTEGER NOT NULL DEFAULT 0,
contraband_missed INTEGER NOT NULL DEFAULT 0,
other_penalty REAL,
penalty_reason TEXT,
deleted INTEGER NOT NULL DEFAULT 0,
rev INTEGER NOT NULL,
updated_at TEXT NOT NULL,
PRIMARY KEY (user_id, day)
);
CREATE INDEX IF NOT EXISTS idx_records_rev ON records(user_id, rev);
-- 月度奖惩终稿:主键 (user_id, month),month 形如 2026-09
-- status = draft(草稿,不计入金额) | final(组长审核定稿,计入金额)
CREATE TABLE IF NOT EXISTS month_adjust (
user_id INTEGER NOT NULL,
month TEXT NOT NULL,
status TEXT NOT NULL,
final_amount REAL,
note TEXT,
finalized_at TEXT,
deleted INTEGER NOT NULL DEFAULT 0,
rev INTEGER NOT NULL,
updated_at TEXT NOT NULL,
PRIMARY KEY (user_id, month)
);
CREATE INDEX IF NOT EXISTS idx_adjust_rev ON month_adjust(user_id, rev);
-- 设置整体存一份 JSON:字段会随功能迭代增减,拆列反而不好演进
CREATE TABLE IF NOT EXISTS settings (
user_id INTEGER PRIMARY KEY,
json TEXT NOT NULL,
rev INTEGER NOT NULL,
updated_at TEXT NOT NULL
);