Commit Graph
11 Commits
Author SHA1 Message Date
Trae Assistant cc7857e009 fix: 直接加义工时的补录活动时间改为真实提交当天(不再是 2024-01-01 假时间)
Deploy to Server / deploy (push) Successful in 1m40s
- hours.ts POST /direct-add:
  · 不再复用单一『【补录】直接加义工时长』活动(之前 start_time
    硬编码 2024-01-01 00:00 会在所有活动列表/详情里显示错时间)
  · 改为每次提交取 SQLite datetime('now','+8 hours') 真实 UTC+8 时刻,
    活动标题按日期拼接:『【补录】YYYY-MM-DD 直接加义工时长』
  · start_time / end_time 都设为提交这一刻的 YYYY-MM-DD HH:MM,
    同一日内多次提交会复用同日期活动;不同日期自动建独立活动
  · 响应额外返回 direct_add_activity_title / direct_add_activity_time
    便于前端以后 toast 里显示
- 新增容错:last_insert_rowid() 取不到活动就 ROLLBACK + 返回 500,
  防止 hours 行悬挂到无效 activity_id
2026-10-05 13:55:18 +08:00
Trae Assistant 51b27bdfd4 feat: 管理台直接对部员加义工时(必填原因,独立多条记录)
Deploy to Server / deploy (push) Successful in 1m41s
- schema.sql + db/index.ts 迁移:hours 表移除 UNIQUE(activity_id,user_id)
  约束,改由 id 自增主键唯一定位;启动时检测到旧结构会自动
  RENAME+重建表+INSERT 搬迁历史数据;外部 FK pragma 仍生效
- hours.ts batch 接口:为兼容去掉 UNIQUE 后的行为等价,改成
  『先 DELETE 旧行 + 再 INSERT 新行』,同人同活动仍为一行覆盖语义
- 新增 POST /hours/direct-add:
  · items = [{user_id, hours, reason}],每条记录前置校验(uid 存在、
    hours>0、reason 非空),错误以分号拼接返回
  · 首次调用自动创建活动「【补录】直接加义工时长」(start/end
    2024-01-01 ~ 2099-12-31)作为虚拟承载活动,后续复用
  · 全事务 INSERT,每次加时独立写入多行(不合并)
  · 响应:{ ok, added, total_hours, results:[{class,name,...}], direct_add_activity_id }
- api/index.ts hoursApi.directAdd:新增带完整返回类型签名的 TS 封装
- Users.tsx 双入口:
  · 工具栏:选中部员后与『批量删除』并列,出现『批量加义工时(N)』
    主按钮 → 打开共用 Modal 一次加多人
  · 部员详情弹窗:「累计时长」卡片独立加『加义工时』小按钮,
    点后复用同一表单只为当前人录 1 条
- 共用 Direct Add Modal:
  · 顶部说明卡(每条原因独立保存;挂在【补录】活动;勾选人名 chip 列表)
  · 时长输入:number,min=0.1 step=0.1,前端校验 >0
  · 原因输入:textarea 必填,标红字星号,字数计数,提交前 trim 非空校验
  · 提交 loading 锁按钮;成功 toast 显示前 5 人名字 + 总人数 + 总小时;
    然后 load() 刷新列表累计时长列,若详情弹窗开着自动重新拉详情
2026-10-05 13:44:44 +08:00
Trae Assistant b145cbd167 fix: 活动矩阵备注修复 + 时长统一保留 1 位小数 + Excel 导出自定义样式
Deploy to Server / deploy (push) Successful in 1m37s
- 后端 activity_matrix 新增 _remarks 映射,不再依赖 hours 数组独立哈希
  (避免 include_hours=false 时矩阵备注全丢)
- 前端预览矩阵 & Excel 矩阵 & 一键总表统一直读 u._remarks[activityId]
  单元格格式:时长(1位) + 换行 + 「备注:xxx」
- 全局 toFixed(2) → toFixed(1):
  · Export.tsx 明细/MiniTable/矩阵/KPI
  · Hours.tsx 批量设置提示/Excel 导出/卡片汇总
  · Users.tsx 列表累计时长/详情卡片/活动明细
  · user/Dashboard.tsx 累计时长卡片/活动明细表
- Excel 导出自定义样式(utils/export.ts):
  · 表头主题色 #275354 填充 + 白字 + 加粗 + 居中
  · 首行冻结(姓名+义工号两列粘性 xSplit=2)+ 整表 autofilter
  · 全列列宽自适应(按表头+前 2000 行内容最大换行宽度,关键字段保底)
  · 矩阵单元格居中 + 数值格式 0.0 + wrapText 备注换行
  · 交替行底色 ALT_ROW=#F7FAFA,总时长列字加粗主题色 + 浅底色 #EDF7F7
  · 行高按每行最大换行数量线性放大(16+(n-1)*14,最低 18)
  · 所有实体单元格补空值保留边框,避免边角缺失
  · XLSX.write 启用 cellStyles=true;MIME 改为标准 openxmlformats-officedocument
- 矩阵 sheet 通过 hint.matrixColStart/End 精确识别矩阵单元格区间启用数值格式
- 修复 doExcel() sheets 数组类型声明过窄(增加 hint 可选字段)
2026-10-05 10:12:46 +08:00
Trae Assistant 30021d7b46 feat: 统一全链路时区为 UTC+8 (Asia/Shanghai)
Deploy to Server / deploy (push) Successful in 1m36s
- schema.sql created_at DEFAULT 改为 datetime(now,+8 hours)
- Dockerfile runtime 安装 tzdata ENV TZ=Asia/Shanghai 并软链 /etc/localtime
- docker-compose.yml 挂载宿主机 localtime 并传 TZ=Asia/Shanghai
- server index.ts 入口设置 process.env.TZ
- client utils/export 新增 utc8Now/utc8Input/utc8DateStamp/utc8DateTimeStamp
- Activities 默认活动开始/结束时间改用 UTC+8
- 导出文件名日期戳和报告生成时间统一 utc8DateStamp/utc8DateTimeStamp
2026-10-05 09:09:01 +08:00
Trae Assistant 7f9bf15b7d fix(db): 修复 sql.js lastInsertRowid 误当函数调用导致 userId=0 工作组写入失败
Deploy to Server / deploy (push) Successful in 1m36s
- wrapStmt.run(): 原 lastInsertRowid?.() 误将属性当函数调用导致 undefined→0,现优先直接读取属性(number/bigint),其次调用函数,最后 SELECT 兜底
- initDb: 在 schema 执行前强制 PRAGMA foreign_keys = ON,修正 pragmaCompat 正则判断导致 FK 默认关闭
- pragmaCompat 改为通用 pragma 表达式执行,不再只匹配 foreign_keys=ON
- 根因链条:lastInsertRowid() 调用失败→返回 0→user_groups(0,gid) 全部相同 PK→INSERT OR IGNORE changes=0→40 条数据工作组全 0 写入
- build 通过
2026-10-05 08:53:58 +08:00
Trae Assistant 49985a96ab fix: 批量添加工工作组调试回显 + 完整验证写入
Deploy to Server / deploy (push) Successful in 1m37s
- 后端 /users/batch 返回每条成功记录的 groups_written/groups_expected/group_ids_out;失败记录返回 group_ids_seen/count
- 前端 submitBatch:console.log 打印发送 payload 和响应;弹窗汇总工作组实际/期望写入数;任何异常的行都显示后端实际解析出的 group_ids_out,失败行同时显示后端收到的 group_ids_seen
- 本地模拟后端 sql.js 写入 user_groups 100% 正确(场景A/B测试均 changes=1,聚合查询正确),此提交部署后通过控制台和弹窗即可精确定位问题在哪一跳(前端发送 vs 后端解析 vs 数据库写入)
- npm run build 通过
2026-10-05 08:46:25 +08:00
Trae Assistant f845d6b6a4 fix: 修复批量删除 undefined/失败问题(POST 替代 DELETE body)
Deploy to Server / deploy (push) Successful in 1m38s
- 批量删除改走 POST /users/batch-remove(稳定保证 body 可被 Express 解析),同时增强 DELETE /batch 兼容 query string 回退
- 前端 usersApi.batchRemove 改用 POST 请求;批量删除函数新增 ok 标志位校验 + ?? 0 防 undefined,catch 分支带前缀明确提示失败原因
- npm run build 通过
2026-10-05 08:35:24 +08:00
Trae Assistant 48ac08d19d fix: 修复批量导入义工号/工作组丢失 + 新增批量删除
Deploy to Server / deploy (push) Failing after 43s
- 批量解析:移除义工号强制纯数字校验(原 volunteerLooksLikeNo 逻辑错误导致 VOL-003、2024-A 等全部置空);改为列数驱动:3列时智能探测是否工作组命中,4+列保留义工号原值、剩余段统一合并为工作组解析
- 后端 batch:user_groups 插入语句改为事务内按用户编译;义工号判断改为 null/undefined 严格检查,避免真值判断丢弃空字符串或 0 开头的值
- 新增 DELETE /users/batch:事务性批量删除部员(含 user_groups/hours 级联),返回实际删除 count
- 前端列表新增复选框列(表头 indeterminate 半选态),选中 1+ 条后工具栏显示「删除选中(N)」红色按钮,确认弹窗二次校验
2026-10-05 08:27:34 +08:00
Trae Assistant f42121d0bb feat: 部员多工作组归属 + 批量添加功能
Deploy to Server / deploy (push) Successful in 1m59s
- 数据库:新增 user_groups 多对多关联表,启动时自动迁移旧 group_id 数据
- 后端 users:所有查询聚合多工作组信息,增删改接口支持 group_ids 数组;新增 POST /users/batch 批量添加接口(事务+逐行错误反馈)
- 后端 export/hours/activities:全面兼容多工作组关联查询
- 前端 Users:新增/编辑改为工作组多选复选框;新增批量添加模态框(粘贴解析+实时校验表+提交汇总)
- 前端列表/详情:工作组以多标签形式展示,搜索支持工作组名称
2026-10-05 08:08:15 +08:00
Trae Assistant a84a8b19ac feat(export): 新增活动时长总表(矩阵)+ 移除Logo
Deploy to Server / deploy (push) Canceled after 14m38s
- 后端 POST /api/export 新增 include_activity_matrix:部员×活动矩阵行,列=所有活动(start_time DESC排),_total尾列
- 前端 Export 新增 06 卡片「活动时长总表(矩阵)」:部员+义工号 左固定列,活动列160px宽表头显示日期副标题,值>0高亮主色+浅底,总时长bg-primary-50
- Excel 新增「活动时长总表(矩阵)」Sheet:列名=活动标题,末列总时长
- 移除Brand组件所有img Logo渲染,纯标题,减小侧栏移动端头部视觉噪音
- 前后端 tsc --noEmit exit 0 + vite build exit 0;浏览器 E2E 验证矩阵张三/校园志愿宣传活动=2.00/总时长 2.00 h
2026-10-04 23:17:19 +08:00
Trae Assistant 25b2b8f381 feat: 初始化义工时长管理系统
- 管理台:活动设置、时长登记、用户管理、数据导出(Excel/PNG)
- 用户端:姓名查询个人义工时长与活动记录
- 技术栈:React + Vite + TailwindCSS / Node.js + Express + sql.js (SQLite)
- 支持 Docker 部署,附带 Gitea Actions 自动部署工作流
- 响应式界面,兼容移动端与 PC 端
- 默认管理员账号:admin / admin123
2026-10-04 18:06:24 +08:00