147 lines
12 KiB
Markdown
147 lines
12 KiB
Markdown
# 变更日志
|
||
|
||
## 2026-05-18
|
||
|
||
- [修复] 用户管理"最后登录"时间不动态更新:SSO 免登录、本地 JWT 会话验证路径现在也会更新 `last_login_at`(此前仅密码登录路径更新,导致 SSO 用户始终显示"从未登录")
|
||
|
||
## 2026-05-15
|
||
|
||
- [修复] middleware 移除 `better-sqlite3` 依赖,修复 Edge Runtime 不支持 Node.js 原生模块的编译报错(`The edge runtime does not support Node.js 'fs' module`)
|
||
- [优化] deploy-ai.sh 连通性检查增加重试机制(3次/10s间隔),应对同时部署两个站点时目标容器暂不可达
|
||
|
||
## 2026-05-14
|
||
|
||
- [新增] 权限系统重构:工单细粒度权限(`tickets:create` 手动建单、`tickets:import` 导入、`tickets:export` 导出),`tickets:write` 缩窄为编辑/删除
|
||
- [新增] 报告三层权限:`reports:read`(查看列表+预览)、`reports:download`(下载)、`reports:create`(新建+生成文档+删除)
|
||
- [新增] `/api/auth/me` 返回 `permissions` 字段,前端根据权限数组控制按钮和导航显隐
|
||
- [新增] 角色管理 UI 权限项从 8 个扩展到 14 个(含 `api-keys:read/write`)
|
||
- [修复] 角色管理页面:admin/operator/viewer 标记为"内置"不可删除但可编辑,admin 在 API 层禁止删除
|
||
- [修复] 报告 API 路由全部补全权限检查(此前列表/预览/下载/删除均无权限检查)
|
||
- [修复] 导出工单 API 新增 `tickets:export` 权限检查(此前仅验证登录态)
|
||
- [修复] POST 创建报告权限从错误的 `reports:read` 修正为 `reports:create`
|
||
- [修复] `reports:write` 全面替换为 `reports:create`
|
||
- [修复] 种子数据迁移逻辑不再每次启动覆盖用户自定义权限,仅首次安装时创建默认权限
|
||
- [修复] SSO 新用户免登录失败:根页面 `getCurrentUser()` 改为直接 `redirect('/dashboard')`,由中间件统一处理共享 JWT 认证(与 assets-ai 行为一致)
|
||
- [修复] 手动建单输入业务 IP 按回车无法查询节点名称和设备序列号:assets-ai `api_keys` 表中缺少 issue-ai 使用的 API Key,服务端调用返回 401,且前端静默吞错无提示
|
||
- [优化] 中间件 API Key 验证统一为 ALLOWED_API_KEYS(快速路径)→ api_keys 数据库表(回退)两级验证;无效 key 不再被放行,中间件层直接返回 401(安全加固,与 assets-ai 行为一致)
|
||
- [新增] 部署后自动验证 issue→assets API 连通性(`deploy-ai.sh`),API Key 不匹配时部署立即报错退出
|
||
- [修复] `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)
|