# 变更日志 ## 2026-05-14 - [修复] SSO 新用户免登录失败:根页面 `getCurrentUser()` 改为直接 `redirect('/dashboard')`,由中间件统一处理共享 JWT 认证(与 assets-ai 行为一致) - [修复] `next.config.ts` 添加 `ldapts` 到 `serverExternalPackages`,确保 Next.js standalone 构建包含 LLDAP 客户端模块,避免 `ldapUserExists()` 因模块缺失失败导致 SSO 自动创建用户静默中断 - [调整] 全局证书切换:Cloudflare Origin CA → Let's Encrypt(`/etc/letsencrypt/live/www.tlyq.ai/`),覆盖全部 7 个子域名,nginx 8 个站点配置同步更新 ## 2026-05-12 - [部署] 云端 JWT 密钥统一为 oa-shared-jwt-secret-tlyq-2026,三站点密钥一致 - [部署] docker-compose 移除 AUTHELIA_URL,添加 LDAP/COOKIE/INTERNAL_API_KEY 环境变量 - [部署] LLDAP admin 密码更新为 3Vm!Y!@RCiPs - [部署] nginx 移除 auth_request,恢复纯反向代理;改为运行时 DNS 解析 - [新增] `src/lib/db-schema.ts`:users 表新增 last_login_at / last_active_at 列 - [新增] `src/lib/auth.ts`:getCurrentUser() 更新 last_active_at - [新增] `src/app/api/auth/login/route.ts`:登录时更新 last_login_at 和 last_active_at ## 2026-05-11 - [新增] `src/lib/ldap.ts`:`ldapUserExists()` 函数,检查 LLDAP 中用户是否存在(admin bind 搜索,不可达时容错放行) - [新增] `src/lib/jwt-shared.ts`:共享 JWT 签发/验证(`tlyq_session` cookie,HS256,与 OA/assets 共用密钥) - [调整] `src/lib/auth.ts`:`getCurrentUser()` 优先 `tlyq_session`,加入 LLDAP 存在性检查,用户被删除后自动清除 cookie 踢出 - [调整] `src/app/api/auth/login/route.ts`:LDAP 优先认证 + 本地密码缓存回退 + localadmin 应急用户直连 - [调整] `src/app/api/auth/logout/route.ts`:同时清除 `session_issue` 和 `tlyq_session` - [调整] `src/app/api/auth/me/route.ts`:移除 SSO header 路径,改用 `getCurrentUser()` 统一获取 - [调整] `src/middleware.ts`:优先 `tlyq_session` → 回退 `session_issue`,移除 SSO 代理路径,放行 `/api/internal/` - [新增] `src/app/api/internal/roles/route.ts`:内部 API,返回站点可用角色列表(INTERNAL_API_KEY 鉴权) - [新增] `src/app/api/users/[id]/route.ts`:admin/localadmin 用户禁止删除和修改角色 - [修复] `src/components/tickets/TicketList.tsx`:已办工单点击业务IP/节点名称跳转到待办页面,改用 `usePathname()` 保持当前页面并正确筛选 - [调整] `src/app/(app)/settings/users/page.tsx`:admin/localadmin 用户隐藏删除按钮,编辑时角色字段显示为只读 - [新增] `src/lib/db-schema.ts`:预置 localadmin 应急用户(admin 角色,纯本地 BCrypt 认证) ## 2026-05-07 - [新增] 月报跨月进行中工单支持:第一章折线图覆盖未结单离线天数,第二章标注"处理中",第三章显示"进行中"/"—",第四章标注"仅计本月部分" - [修复] `monthly-report-docx.ts` 6 个 TypeScript 类型错误:HeadingLevel 值类型、createCell align 推断过窄、children 数组类型改为 FileChild[] - [修复] API Key 过期检查失效:`verifyApiKey` 查询缺 `expires_at` 字段,导致过期判断永不触发 - [修复] Button 组件不支持 `loading` 属性:增加 `loading?: boolean` 并在 loading 时禁用 + spinner 动画 - [修复] `scripts/import-steps.ts` 参数类型错误:`main()` 增加 `excelPath` 判空守卫 - [新增] 月报生成时自动生成当月自然周周报,以 OLE Package 嵌入「五、附件」章节,双击图标可在 Word 中打开 - [新增] 报告管理页面重新设计:预览页 KPI 5 列布局、故障分类去背景色、报告列表状态标签颜色体系、操作按钮按状态显示 - [新增] POST `/api/reports/[id]/generate` 异步生成路由,报告创建与 DOCX 生成分离,状态机 ready→generating→completed/failed - [修复] 月报第二章和第一章图表:排除 `fault_subcategory = '其他'` 工单,当日恢复故障不计入离线节点 - [修复] 报告预览无故障天数改为按故障完整日期范围计算,与 DOCX 图表规则区分 ## 2026-05-05 - [修复] 云服务器月报生成失败:重建 Docker 镜像安装 echarts,Dockerfile 补全 Chromium 系统依赖库(libglib2.0、libnss3 等 18 个) - [修复] 周报多个工单详情表格连在一起:在 2.2/3.2/4.2 节每个工单表格前加入「工单 N」编号标签 - [新增] `next.config.ts` 添加 `outputFileTracingIncludes`,防止 `fs.readFileSync` 加载的依赖在 standalone 模式中丢失 - [调整] `CLAUDE.md` 故障排查章节新增月报/周报生成失败的三类根因及修复方案 ## 2026-05-03 - [新增] 周报生成功能:数据采集(weekly-report.ts)、DOCX 构建(weekly-report-docx.ts)、故障概况/详情表格、固定列宽布局 ## 2026-05-02 - [新增] 工单列表重构:拆分为"待办工单"和"已办工单"两个页面,现有工单全部归入已办 - [新增] 手动建单页面(`/tickets/create`),支持 IP 回车自动查询设备信息 - [新增] 工单类型字段(`ticket_type`),支持 OEM诊断/OEM维修,与故障大类分离,含历史数据迁移 - [新增] admin 专属"全部工单"侧边栏入口,非 admin 自动重定向 - [新增] 工单详情和待办列表显示 Tier 1 SLA 超时时间(1% 自然月秒数) - [新增] ProcessForm 重构:默认 1 个时间线步骤、处理人下拉(腾讯/图灵)、多项必填校验、提交确认弹窗 - [调整] 权限模型:admin 可编辑/删除已办工单;operator 仅操作待办;删除仅限创建人+admin;API 层 403 守卫 - [优化] 时间输入框改为文本格式(YYYY-MM-DD HH:mm:ss),支持复制粘贴,失焦实时格式校验 - [优化] 智能返回按钮、历史工单新标签页打开、空时间线隐藏、列表移除操作列 - [调整] 报告生成:月报默认选中上个月,周报默认选上周一至上周日 ## 2026-04-30 - [新增] 报告管理页面重构:按钮、月报/周报类型、月份选择器、Toast + 轮询、批量删除(多选/全选/确认弹窗) - [新增] 月报生成逻辑重写:按 close_time 筛选、SLA 判定(可用性<99%且结论不含"无异常"→不计入)、故障日期精确到秒、第四章低可用性黄底红字标记 - [优化] 第一章图表:Y 轴动态范围自适应、排除"无故障"工单干扰、支持跨月工单正确计入 - [修复] 报告生成时区修复(UTC+8)、ECharts 图表数据截断 - [调整] 目录 TOC 风格还原、侧边栏导航改名为"报告管理"、表单输入框宽度优化 - [新增] 创建 README 文档,包含完整的月报设计规则 ## 2026-04-29 - [新增] 工单列表支持拖拽自定义列宽、排序/筛选图标可点击、排序图标统一为 `ChevronsUpDown` - [修复] 筛选弹框过窄(改为自适应宽度)、表头 overflow 裁切下拉框、列头 button 嵌套非法 HTML - [修复] 编辑工单时配件名称保存无效(数据库缺列 + API 白名单遗漏) - [数据] 从总表 Excel 导入更换配件名称(15 条成功,6 条不匹配跳过) ## 2026-04-28 - [调整] 工单号改造:id 改为 14 位工单号,删除 ticket_no 列,旧格式自动迁移,生产环境 85 条工单 + 524 条时间线验证通过 - [修复] deploy-ai.sh 打包时排除本地环境文件,防止 `.env.local` 覆盖服务器配置导致跳转链接错误 - [修复] 登录后重定向:middleware 携带 redirect 参数,login page 登录后读取参数跳转,替代硬编码 `/dashboard` - [修复] 跨系统认证隔离:JWT 增加 payload.id 空值检查防跨系统泄露,cookie 名改为 `session_issue` 防 localhost 域冲突 - [修复] assets-ai 调用 issue-ai 会话过期:缺少 `ALLOWED_API_KEYS` 配置,本地环境补齐 - [修复] by-asset API 500 错误、导入页缺少工单号列、用户管理页缺少创建时间列 - [文档] 更新 CLAUDE.md:修正 API Key 配置说明,补充本地 .env.local 示例 ## 2026-04-27 - [新增] API Key 管理页面(`/settings/api-keys`),支持创建/删除 Key,供外部系统调用 API - [新增] 工单 Excel 导入脚本(`import-tickets.ts`),支持批量导入工单数据 - [新增] 工单时间线导入脚本(`import-steps.ts`),关联工单 ID 导入处理步骤 - [优化] docker-compose.yml 使用 external webnet,与 nginx-proxy-ai 共用网络 - [调整] Docker 容器挂载 4 个 volume(data、.next、package.json、tsconfig) ## 2026-04-25 - [新增] 工单核心 API(CRUD + 分页 + 筛选 + 搜索) - [新增] 工单列表页面(`/tickets`) - [新增] 新建/编辑/详情页面 - [新增] 月度统计 API(`/api/stats/monthly`) - [新增] SLA 达标率统计(`/api/stats/sla`) - [新增] 报告生成与导出(Word / PDF / Excel 总表) - [新增] 调用 assets.tlyq.ai API 获取设备信息,工单详情页展示关联设备卡片 - [调整] PLAN v5:SLA 指标改为「服务可用性」计算,故障分类规则(含 SQL 批量更新语句) - [新增] assets-client.ts,支持通过 device_ip 模糊匹配 business_ip / hdm_ip 获取设备信息 ## 2026-04-24 - [新增] 项目初始化,基于 Next.js 15.1 + SQLite(standalone 输出模式) - [新增] 认证系统(JWT cookie 方式),登录/登出/当前用户 API - [新增] 用户管理(`/settings/users`)和角色权限系统(admin/operator/viewer) - [新增] 数据库初始化脚本(init-db.ts),预置角色和默认管理员账号 - [新增] Docker 部署配置(两阶段构建 alpine + debian slim)