c6e1d94510
fix: 修复 CI 时区测试失败 + 依赖安全升级 + 新增依赖检查 workflow
...
CI / check (pull_request) Successful in 4m11s
Dependency Check / check (pull_request) Successful in 2m30s
- fix(server): getCourseClock 固定 UTC+8(Asia/Shanghai),与 attendance-settlement 保持一致,
修复 CI(UTC 容器)下 attendance.lesson-session.spec.ts 失败
- chore(deps): @ant-design/x 2.9.0 / @ant-design/x-markdown 2.9.0 / mermaid 11.16.1;
直接依赖 dompurify 3.4.13(修复生产依赖 audit 漏洞,mermaid/x-markdown 复用同一份)
- ci: 新增 dependency-check workflow(生产依赖 moderate+ / 全局 critical 失败,outdated 报告)
2026-08-10 10:05:05 +08:00
f4072ce93a
fix(db): 迁移 CLI 默认读取仓库根目录 .env
...
- datasource.ts 优先加载根目录 .env,再回退 apps/server/.env
- 生产只需维护根目录一份 .env,迁移脚本不再报 root 空密码
2026-08-09 22:02:00 +08:00
db11a57e98
fix(security): classrooms 上传限制/路由顺序/LIKE 转义补充
...
CI / check (pull_request) Failing after 3m26s
由 OCR(open-codereview.ai,deepseek-v4-flash)审查驱动修复:
- classrooms.controller:report 路由移到 :id 之前、上传 10MB + 判空
- classrooms.service:搜索关键词 LIKE 通配符转义
Reviewed-by: OCR (open-codereview.ai)
2026-08-09 21:30:42 +08:00
f50301148d
fix(correctness): 并发/事务/实体/时区/状态一致性修复
...
由 OCR(open-codereview.ai,deepseek-v4-flash)审查驱动修复:
- wallets 原子扣款防 double-spend;refund 条件更新幂等;findTransactions 分页
- financial/imports/occupancies/attendance 事务与 advisory lock;重复生成/提交幂等
- 矛盾校验器、日期区间、实体双映射/DECIMAL/nullable、时区统一(china-time)
- rbac-seed 防重激活、exam 权限恢复、状态一致性、路由顺序、N+1/IN 分块等性能项
Reviewed-by: OCR (open-codereview.ai)
2026-08-09 21:29:54 +08:00
99ea931409
fix(security): 认证/越权/注入/上传/凭据全链路加固
...
由 OCR(open-codereview.ai,deepseek-v4-flash)审查驱动修复:
- JWT 生产必填、密码 8-72 字节、防枚举;全局 ValidationPipe
- classes/dashboard/schedules/students/attendance/archive/exams 越权与 IDOR 修复
- LIKE 通配符转义(14 处);上传 10MB 上限 + MIME 白名单 + 附件 XSS
- 集成配置 appSecret AES 加密 + 回填脚本;审计 best-effort;IP 来源防伪造
Reviewed-by: OCR (open-codereview.ai)
2026-08-09 21:29:22 +08:00
4dd7b5a0b1
fix(server): 时间戳→业务日期/时间全部统一为中国时区(UTC+8)
...
此前仅'今天'默认值统一为中国日期,Date→字符串的转换仍是 UTC:
- sync 考勤同步窗口 lastSyncAt 时间戳按 UTC 取日期,凌晨会偏一天
- 考勤导出 punchTime/createdAt 显示 UTC 时间
- normalizeDateOnly 把 ISO datetime 按 UTC 归一化,业务日期少一天
- getCourseClock/getChinaDateParts 用 dayjs.utc(date).add(8h) 隐式转换
统一为 dayjs(date).utcOffset(8),纯日期字符串运算(shiftDate/addDays/
daysInMonth/nextMonth)保留 dayjs.utc;date-normalization 测试断言
同步更新为北京时间语义。
2026-08-08 18:01:35 +08:00
7905f1ee23
fix(server): 业务日期'今天'统一为中国日期,避免凌晨 UTC 偏一天
...
joinDate/leaveDate/checkInDate/sync 起始日等业务日期默认值原来用
dayjs().utc()(UTC 今天),在国内 00:00-07:59 会取到昨天。
统一改为 dayjs().utcOffset(8)(固定 UTC+8 中国日期),与考勤周边界
修复保持一致;pending-tasks/controller-base 的本地 dayjs() 也显式化。
2026-08-08 17:58:16 +08:00
782b43ef0a
fix(attendance): 默认周范围改为中国日期周一起点
...
generateFromSchedules / getCalendar 原来用本地周一零点转 UTC 日期,
在上海时区会得到前一天的日期,导致默认范围变成周日~周日(8 天)。
改为 dayjs().utcOffset(8) 按中国日期计算,与 getTodayDateOnly 语义一致。
新增测试锁定:默认周 = 本周一~本周日,周日晚上仍归本周,显式传参原样透传。
2026-08-08 17:56:00 +08:00
8936453e84
refactor(server): 日期/月份格式化统一改用 dayjs
...
- 替换散落的 toISOString().slice(0,10) / split('T')[0] / replace('T',' ')(UTC 语义用 dayjs(...).utc() 保持完全一致)
- Asia/Shanghai 固定时区日期(Intl.DateTimeFormat en-CA)改用 dayjs().utcOffset(8)
- 月份边界 first/last、daysInMonth、nextMonth、shiftDate/addDays 等改 dayjs 简洁实现
- 涉及 attendance/classes/classrooms/room/dashboard/bills/expenses/occupancies/sync/ai-chat/rental 等 28 个文件
2026-08-08 17:52:32 +08:00
92ba2e779f
refactor(server): 用已装库替换手写工具
...
- uuid v7 替换手写 RFC9562 实现(uuid@11.1.1 转为直接依赖)
- node:timers/promises setTimeout 替换两处手写 sleep(钉钉限流、AI 上游重试退避)
- dayjs 替换 4 处零散 Date 格式化(imports/expenses/occupancies 导入模板、档案报告日期)
2026-08-08 17:46:31 +08:00
d324b2fb0a
refactor(server): 日期工具统一迁入 dayjs(utc 插件),移除手写 Intl/padStart 重复实现
2026-08-08 17:27:14 +08:00
d27f10eb84
chore: admin 构建稳定 vendor 分包,消除 chunk 告警;更新 .env.example 品牌文案与端口
2026-08-08 16:46:16 +08:00
00cdb322d2
fix: 修复 QA 巡检发现的 console 告警——useForm 未连接、RangePicker 空值禁用、dashboard 占用率类型
2026-08-08 16:36:58 +08:00
6c11fd7e16
refactor(server): 待办统计日期懒计算,aislop 豁免注释与文档纠错
2026-08-08 16:03:05 +08:00
f160256865
chore(server): 移除 e2e 测试配置与 supertest 依赖
2026-08-08 15:05:52 +08:00
f96c1c26c3
fix(server): 考勤自动结算支持空班级直接完成,补充自动匹配测试
2026-08-08 15:05:42 +08:00
b37ae9471e
refactor(server): A2UI 收敛——移除 legacy SSE 双发与 render_review 工具,提取公共校验
2026-08-08 15:05:10 +08:00
1e3d6ee20f
refactor(server): 收敛类型边界工具,aislop AI Slop 10 → 1
...
- 新增 common/buffer.ts bufferToArrayBuffer:9 处
'as unknown as ArrayBuffer' 收敛为精确切片(含 byteOffset),
消除潜在 Buffer 池偏移隐患,类型断言集中到单一实现
- 新增 common/stringify.ts:4 处重复的 stringify 助手收敛为共享实现
- aislop: AI Slop 10→1(仅剩 1 处有理由的 stringify 薄包装,
eslint no-base-to-string 绕过所需);Code Quality 剩余
4 重复块(声明式 SQL 配置)+ 2 文件过大(既有规模)均保留
- 测试 142 套件/1065 用例通过
2026-08-08 09:48:03 +08:00
4b60e0c018
fix: code-review 审查问题修复 + A2UI 测试补齐
...
Standards 轴:
- 移除 uiArtifacts.ts 的 payloadOf 死代码残留
- AttendanceDevices 残留 any 类型化(补 ClassroomOption.status 字段)
- 批量考勤纠错区分业务失败(已结算/无权限)与系统错误,
前端提示精确到两类数量
- Dashboard queryFn 六段重复校验块收敛为 safeValidate 助手
Spec 轴:
- 补齐阶段 3.4 A2UI 测试:图表空数据占位、ArtifactErrorBoundary
降级隔离、useSubmissionState/useXCardSurface 单测(7 用例)
- 阶段 2.2 补两处引导:教师工作台区分「今日无课」与「未分配班级」、
班级花名册空态带「添加学员」动作
- 契约文档修正 DynamicReview 状态管理描述(多提交点如实说明)
aislop 剩余 16 警告均为必要豁免(类型边界/声明式 SQL 配置/既有文件规模)
2026-08-08 09:43:48 +08:00
a644a8de42
refactor(server): 清理全量 any 类型安全警告 (692 → 0)
...
- 全模块类型化:controller 的 req: any → AuthenticatedRequest/RequestUser,
聚合查询 getRawMany 泛型标注、导入行/响应体定义具体 interface、
catch (e: any) → unknown + 收窄、no-base-to-string 用 String() 显式转换
- 第三方无类型库边界(pdfkit/exceljs)文件级或单行 disable 并注明理由
- 顺带修复:get-business-context.tool 两个 require-await error、
bills.controller 参数顺序隐患、main.ts compression 调用
- 运行时逻辑零改动;测试 142 套件 / 1065 用例全部通过
2026-08-08 09:28:23 +08:00
1b4ba893fd
feat: 空状态引导全面应用与考勤批量标记
...
admin:
- 17 个列表页空态统一为 QueryEmpty 引导:学生/账单/入住/费用/押金/
教室/房间/班级/考试/排课/机构/考勤机/钱包/租赁/通知/角色等,
有创建权限的页面附带主操作按钮,无权限时纯展示
- 教师端课堂点名新增「全部已打卡/全部未打卡」批量按钮:
仅作用于状态不一致的记录,确认后调用批量接口,展示成功/失败数量
server:
- 新增 PUT /attendance-records/batch-status 批量改状态接口
(ids ≤200,逐条权限校验与会话锁,部分失败返回 failedIds,
审计日志记录批量结果;路由声明在 :id 之前避免被捕获)
aislop scan: 5 引擎 0 issues
2026-08-07 18:00:29 +08:00
8d4ebcf9c0
fix(admin,server): 修复 Dashboard 甘特图时间线与数据校验
CI / check (pull_request) Failing after 1m54s
2026-08-07 16:38:16 +08:00
5f9566e26d
fix(server): 修正档案成绩趋势图 y 轴坐标字符串拼接
2026-08-07 16:38:09 +08:00
5b5ffb5b9e
fix(server): 路由 id 使用 ParseIntPipe,限制分页与批量数组上限
2026-08-07 16:38:03 +08:00
899d2dde5b
fix(admin,server): 上传改用 file.buffer 并移除手写 multipart 头
2026-08-07 16:37:55 +08:00
9048816abc
feat(ai): 移除 Excel 导入预检链路
...
- 删除 preflight_import 工具、预检卡、resolve 接口与 ui.import_preflight 事件
- 删除 imports.preflight 解析器与 PreflightReport 类型
- SYSTEM_PROMPT 改为上传 Excel 后直接确认列映射/策略并调用 start_import_wizard
- 前端同步移除预检类型/组件/测试,保留导入向导
2026-08-06 15:50:38 +08:00
14db28afc6
fix(ai): 修复 Nest DI 启动失败
...
- A2uiSubmissionsService/DataSource/BusinessContextService 等构造参数
由 import type 改为值导入,确保 Nest 能解析依赖
- 验证:dev 模式后端正常启动,相关 243 个测试通过
2026-08-06 15:39:33 +08:00
c72ff2cb8a
fix(ai): 清理 aislop 扫描告警
...
- 拆分 SSE reducer 到 sseReducer.ts,provider.ts 降至 220 行
- artifact 合并工具抽到 uiArtifacts.ts,去除双重类型断言
- 业务上下文注册表改用 field/relation/entity 构建器收敛重复
- aislop 分数 71 → 81(Healthy),AI Slop 0 告警
2026-08-06 15:35:12 +08:00
24e0ecbdaf
feat(ai): 业务上下文感知与 A2UI 链路统一
...
- 新增代码内业务上下文元数据层(实体字典 + 三大闭环工作流)
- 新增 get_business_context / get_entity_schema / get_pending_tasks 运行时工具
- SYSTEM_PROMPT 与技能目录改为先查业务流程/待办再执行
- A2UI 增加 ai_a2ui_submissions 幂等表、表单过期、ui.artifact 事件
- 提交回灌携带 submissionId / fieldErrors / 下一步建议
- 前端 uiArtifacts 归一化与过期表单禁用
2026-08-06 15:23:23 +08:00
ae88372ef8
fix(imports): 修复 AI 导入向导多工作表与表头误判
...
- AI resolve 生成向导时按阶段携带全部 sheetNames,不再只取第一张表
- ImportStageRequest 支持 sheets 数组并兼容旧 sheet;手动重传同步修复
- headerMatches 收窄为单向包含,避免宿舍号被原/新宿舍号反向匹配
- suggestStep 增加入住/换宿显式表头信号,修复入住表误判为换宿
- 预检与预览按工作表逐表解析列映射,兼容异构表头
- 修复预检卡生成向导成功后按钮未复位 loading 的问题
- 补充 mapping/预检/run/ai-chat 多工作表测试
2026-08-06 14:46:33 +08:00
824c33a71c
refactor(ai-chat): 拆分超大文件并通过 aislop 100 分门槛
...
- AiChatService 拆出抽象基类,职责不变
- submissions 按提交内容/评审确认/运行时/流程拆为 4 个模块并保持导出兼容
- 导入工具执行器抽取共享 runner,消除重复签名块
- 全仓 aislop 扫描 100/100,0 警告
2026-08-06 12:13:37 +08:00
7f09d5271e
feat(imports): 导入向导兼容旧版工作簿并完善执行/预览
...
- 新增 xls 工作簿回退解析与测试
- 执行/预览/权限校验逻辑完善
2026-08-06 11:59:51 +08:00
7f3e30ba38
fix(archive): 档案聚合接口 null 字段归一化为空串
...
避免可选列缺省返回 null 导致前端响应校验报「字段格式异常」
2026-08-06 11:59:43 +08:00
6a18fd264d
feat(ai-chat): AI 导入确认流程完善并清理代码质量
...
- 新增导入确认/映射解析辅助,支持预检后生成导入向导
- 抽取 parseAttachmentArgs/beginImportToolRun 等重复逻辑
- 双重类型断言改为运行时守卫,消除 aislop 告警
2026-08-06 11:59:28 +08:00
67e14e357c
fix(imports): 导入向导 sheets_json 扩容为 MEDIUMTEXT
...
start_import_wizard 存整表行数据,TEXT(64KB) 在 430 行文件上触发
Data too long for column 'sheets_json',扩容至 MEDIUMTEXT(16MB) 并补迁移
(实际表名 import_runs,原迁移误写 import_run 导致空跑)
2026-08-05 22:26:14 +08:00
6249fefc64
refactor(ai-chat): 移除 excel_analyze/office_analyze 工具与 OfficeKit 依赖
...
- 删除 excel_analyze/office_analyze 两个 A2UI 工具(schema、分发、执行器、测试)
- 附件分析改为依赖上传时自动提取的文本与 preflight_import 报告 errorSamples
- 移除 @officecli/officecli 依赖及 OfficeCliService(PPT 上传不再自动提取文本)
- 保留 AiExcelReaderService(附件文本提取与导入预检仍使用)
2026-08-05 22:26:05 +08:00
d1c933f032
refactor(server): 清理无用导入与类型转换
...
- 移除测试/控制器中未使用的导入与实例
- bills/classroom-rentals 改用 ESM 导入替代 require
- bills.service 去掉多余断言、backfill 显式转字符串、main.ts void bootstrap
2026-08-05 21:14:17 +08:00
ab4765cee5
feat: Excel 导入预检与动态问答,AI 聊天/文件解析体验修复
...
- imports: 新增 preflight_import 预检报告(判定/分阶段统计/阻断归因/问题/下一步/错误示例),导入任务 settings 落库(映射/校区/更新/重复/未匹配策略),预览应用策略,向导提交写操作日志
- ai-chat: 新增 excel_analyze(ExcelJS)工具,移除附件/上下文截断,start_import_wizard 支持确认参数,ui.import_preflight SSE,预览确认写操作日志
- admin: ImportPreflightCard 渲染与持久化,聊天抽屉布局/侧边栏修复,考勤页 CSS 引入,费用/学生页接口 schema 校验修复
2026-08-05 21:12:50 +08:00
b882411f42
refactor: 拆分考勤服务文件并通过 aislop 全项目扫描
CI / check (pull_request) Failing after 5m24s
2026-08-05 18:55:36 +08:00
6ba7f4e3d0
refactor: 抽取课程考勤记录构建 helper,消除重复代码
2026-08-05 18:51:06 +08:00
c8316e9e8e
feat: 结算时同步钉钉已审批请假并标记为请假
2026-08-05 18:43:02 +08:00
32343b271b
fix: 通知 SSE 长连接被 Nginx 60s 超时掐断
2026-08-05 18:00:45 +08:00
2a519a3714
fix: 仪表盘 totalCapacity 聚合值转为数字
2026-08-05 17:53:44 +08:00
1e1e24f0f0
fix: 修复考勤控制器 DI 解析与班级日期迁移空 SQL
2026-08-05 17:46:11 +08:00
47720a8fcc
refactor: 移除 SQLite 支持,仅保留 MySQL
2026-08-05 17:43:13 +08:00
81e622fa09
feat: 学生报告改为流式排版并隐藏空数据区块
2026-08-05 17:20:57 +08:00
fd39e1686a
feat: 重构各业务模块管理页面与服务
2026-08-05 17:12:00 +08:00
80e6fccf05
chore: 服务端模块装配与入口更新
2026-08-05 17:11:43 +08:00
0c94ca54df
feat: 新增通用导入中心
2026-08-05 17:11:39 +08:00
e9c8a1085d
feat: 考勤模块重构与钉钉考勤同步
2026-08-05 17:11:23 +08:00