Commit Graph

3897 Commits

Author SHA1 Message Date
lzh
6b8a05cc4d docs: 补充用户-项目绑定功能设计稿
记录本轮 feat/multi-tenant-project 分支的需求背景、双入口绑定
方案与前后端联动约定,供后续回溯决策。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 20:27:09 +08:00
lzh
6b8626907e feat(@vben/web-antd): Lottie 品牌加载动画(主题色自适应)
- 新增全局 loading:自定义 apps/web-antd/loading.html 覆盖 inject-app-loading
  的默认模板,Vue 挂载前就能播放品牌动画
- 新增 LottieLoading 组件,用于 SSO 回调等"白屏时间偏长"的运行时场景
- 换色方案:Lottie JSON 里原本 5 档硬编码绿色,按当前主题 colorPrimary
  生成 5 档 HSL 亮度做指纹替换。挂载前从 localStorage preferences 读色,
  挂载后读 CSS 变量 --primary,两条路径共用 public/lottie-theme-patch.js
  一份 classic-JS 源,window.__LottieThemePatch__ 上暴露
- vite 插件:启动/构建时从 node_modules 把 lottie_light.min.js 拷到
  public/ 供 loading.html <script> 加载;.gitignore 排除该产物
- LottieLoading 复用 loading.html 已经挂好的 window.lottie,不再把
  ~170KB 播放器再打进 Vue 产物

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 20:26:48 +08:00
lzh
348e40e9c2 style(@vben/web-antd): 项目成员管理模块格式微调
lint 自动格式化:长签名/标题换行、import 顺序、空元素展开;
顺手移除 new Set(undefined) 无意义的 `?? []` 兜底。无行为变更。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 20:25:19 +08:00
lzh
86a3c1f97b fix(@vben/web-antd): SSO callback 改走 body 传递 code/state
授权 code 原先以 query 形式发给 /system/sso/callback,会被 nginx access
log、浏览器历史和 Referer 捕获。改走 POST body,与后端 @RequestBody
SsoCallbackReqVO 对齐,避免一次性码泄露给中间层。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 20:24:52 +08:00
lzh
09538b03cb feat(@vben/web-antd): 项目成员管理改 Drawer + 分页 + 增量
从 Modal 多选改为 Drawer 分页表,更接近"成员管理"语义:
- 原 assign-user-form.vue 重写为 Drawer + Vxe 分页表
- 新增 add-user-modal.vue 子弹窗用于添加用户(过滤已是成员)
- 每行一个"移除"popConfirm 按钮,调 removeProjectUser 单删
- 顶部 keyword 搜索,按 username/nickname/mobile 模糊
- 底部提示:超管不在此列表(后端已过滤)
- data.ts 新增 useProjectMemberGridColumns
- api 新增 getProjectUserPage / addProjectUsers / removeProjectUser
- project/index.vue 接入点改 useVbenDrawer

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 15:48:43 +08:00
lzh
b15b6b4f4d feat(@vben/web-antd): 用户-项目绑定管理双入口
- 用户管理页:下拉操作新增 "分配项目" 按钮 + assign-project-form.vue 弹窗
  沿用现有 assign-role-form 的交互(多选 + 覆盖写入)
- 项目管理页:行操作新增 "管理成员" 按钮 + assign-user-form.vue 弹窗
  下拉支持搜索用户 nickname/username
- 新建 api/system/user-project/ 封装 4 个接口
- api/system/project 新增 getAllProjectSimpleList:
  顶栏 simple-list 已改为用户授权过滤,管理员分配场景需要全量下拉
- 空集保存二次确认:清空所有分配/成员时弹 AntModal.confirm,防误操作
- 权限点:system:user:assign-project / system:project:assign-user

设计文档:docs/design/2026-04-23-user-project-binding.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 14:51:09 +08:00
lzh
20251316ae chore: 忽略根目录 CLAUDE.md(本地 AI 上下文文件)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 23:46:08 +08:00
lzh
37acdcf394 feat(@vben/web-antd): 顶栏项目切换器 + 物联运维平台 SSO 无感跳转
- 顶栏 TenantDropdown 替换为 ProjectDropdown(新建 widget)
  - 进入时拉 /system/project/simple-list;仅当本地 projectId 不在列表时
    才回退到首项,避免静默改写用户选择
  - 空列表不渲染,避免出现永远空下拉
- 新增"物联运维"按钮,走 OAuth2 authorization code 流程跳 IoT 前端
  - state 使用 crypto.randomUUID() / getRandomValues() 生成(CSRF 防护)
  - VITE_IOT_BASE_URL 未配置时按钮隐藏,不再硬编码兜底 URL
  - 使用原生 <button disabled> 替代 <a role="button">,修复可访问性
- 新增 /sso-callback 回调页 + /system/sso/callback API
  - 挂载后立即 history.replaceState 清 code/state,避免二次 exchange
  - API 层做 snake_case → camelCase 映射,统一前端风格
  - 文档化 redirectUri 必须与 OAuth2 客户端 redirectUris 白名单一致
- authStore 新增 ssoLogin,与 authLogin 抽取共用 postAuthSuccess
  - token 为空直接抛错,fetchUserInfo 失败回滚 token 避免 401 循环

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 23:43:44 +08:00
lzh
72ed0eb5aa feat(@vben/web-antd): 支持按 platform 过滤多前端菜单
业务平台 (biz) 与物联运维平台 (iot) 共享同一后端,需按前端来源过滤菜单,
避免同一角色在两端看到相同菜单。

- 新增 CLIENT_ID 常量,请求拦截器 / 基础 client 统一注入 X-Client-Id 头,
  后端密码登录 & refresh-token 据此绑定 token 的 client/platform
- SystemMenuApi.Menu 增加 platform 字段
- 菜单表单新增"所属平台"选择项(PLATFORM_OPTIONS),为 null 则两端共享

配合后端迁移 sql/mysql/migrations/2026-04-20_oauth2_client_platform.sql。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 23:40:19 +08:00
lzh
93bfef06a4 style(@vben/web-antd): lint 自动格式化项目管理页面
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 23:11:06 +08:00
lzh
44b2dd9d05 feat(@vben/web-antd): 项目管理前端页面和请求拦截器适配
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 23:08:25 +08:00
lzh
5faaa3c051 chore: build and deploy web-antd
All checks were successful
Web UI CI/CD / build-and-deploy (push) Successful in 8s
2026-04-14 09:33:13 +08:00
lzh
615e928929 style(@vben/web-antd): 修正 linter 自动格式化残留
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 09:14:44 +08:00
lzh
86486f77dc feat(@vben/web-antd): 重设计保洁派单弹窗,修复多项交互缺陷
- 全新 UI:工牌卡片支持昵称显示、彩色头像、状态 pill、电量图标
- 修复工牌状态大小写 bug(后端返回小写 idle/busy,前端统一转大写)
- 离线工牌不可点击,选中状态高亮并显示已选工牌名
- 提取 BADGE_STATUS_CONFIG 到 data.ts 统一维护
- 头像色改用字符串哈希,避免大 Long 精度丢失
- handleSubmit 添加 confirmLoading 防重复提交,补充 catch 错误提示
- assigneeName 安全访问(去除非空断言)

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 09:12:13 +08:00
lzh
084dc51846 fix(@vben/web-antd): 修复工单详情页操作接口错误
- 取消/升级优先级弹窗补传 orderType,修复无法识别工单类型的问题
- 新增非待分配状态下的"转派"入口(QUEUED/DISPATCHED/CONFIRMED/ARRIVED)
- 语音提醒从 IoT 原生接口改为 /ops/clean/device/notify

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 23:50:18 +08:00
lzh
2d2197d40d fix(@vben/web-antd): 修复工牌状态接口类型定义
- BadgeStatusItem 新增 nickname 字段
- batteryLevel 类型修正为 number | null
- ManualDispatchReq 新增 assigneeName 字段

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 23:48:27 +08:00
lzh
2d89503192 chore: build and deploy web-antd
All checks were successful
Web UI CI/CD / build-and-deploy (push) Successful in 7s
2026-04-07 23:09:46 +08:00
lzh
26aad7b5f4 fix(@vben/web-antd): 工单日志时间改为显示精确时间 2026-04-07 22:13:15 +08:00
lzh
60e00ae3d7 chore: build and deploy web-antd
All checks were successful
Web UI CI/CD / build-and-deploy (push) Successful in 8s
2026-04-07 13:10:14 +08:00
lzh
93498273eb fix(@vben/web-antd): 修复甘特图组件 props 丢失导致运行时崩溃
linter 在 pre-commit 过程中移除了 defineProps/defineEmits,
导致 props 变量未定义,computed 计算 autoRange 等时抛出
ReferenceError: props is not defined

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 13:06:18 +08:00
lzh
b651e9ae25 chore: build and deploy web-antd
All checks were successful
Web UI CI/CD / build-and-deploy (push) Successful in 8s
2026-04-07 13:03:22 +08:00
lzh
c3e3389868 fix(@vben/web-antd): 修复工单详情工牌状态字段对齐及依赖清理
- work-order/detail: 工牌状态 lastHeartbeatTime→onlineTime,移除 rssi 展示
- trajectory/api: lint 修正(移除冗余空行)
- badge-status-card: linter 格式修正
- pnpm-lock: 更新依赖锁定文件

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 15:38:57 +08:00
lzh
cc98ba4d0b feat(@vben/web-antd): 重构轨迹页面子组件
trajectory-gantt-area:
- 数字孪生甘特图,纵轴加载完整区域树,仅显示有数据区域
- 区域树缓存提取到 area-tree-cache.ts,单例 Promise 防并发重复请求
- 支持时段预设(自适应/全天/上午/下午/工作时段)和 1x-16x 缩放
- tooltip 类型安全:record 改为 null | TrajectoryRecord

badge-status-card:
- 新增实时轨迹时间线(最近15条,倒序展示)
- 排序改用 toSorted + dayjs valueOf

area-stay-chart:
- 显示 fullAreaName 全路径,标签内置于条形,统一高度 260px

trend-chart:
- 进入改蓝色,离开改橙色
- 修复 height 缺少 px 单位导致图表不渲染

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 15:37:59 +08:00
lzh
3a14de4d1c feat(@vben/web-antd): 重构工牌轨迹页面核心逻辑
- 接口调用:timeline/summary/hourly-trend/area-stay-stats 并行请求
- 轨迹加载:选中设备用 timeline 接口,deviceId 为空时不传参
- 时间规范化:支持毫秒时间戳/数组/字符串三种后端格式
- 轮询策略:今日每5分钟刷新,实时状态每10秒,历史日期不轮询
- badge 搜索加 300ms 防抖
- onMounted 并行加载工牌列表、数据和区域树
- 移除 useTrajectoryColumns 死代码
- 哈希函数改用 Math.trunc + codePointAt,移除非空断言

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 15:30:37 +08:00
lzh
1468a4062b feat(@vben/web-antd): 对齐后端轨迹与工牌接口 DTO 类型定义
- TrajectoryRecord 新增 fullAreaName、TimelineQuery.deviceId 改为可选
- AreaStayStats 新增 fullAreaName 字段
- BadgeRealtimeStatus 字段对齐后端:lastHeartbeatTime→onlineTime,移除 rssi
- 新增 TrajectorySummary、HourlyTrend、AreaStayStats 统计接口及类型

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 15:25:31 +08:00
lzh
c16d049c38 chore: build and deploy web-antd
All checks were successful
Web UI CI/CD / build-and-deploy (push) Successful in 8s
2026-03-31 23:16:25 +08:00
lzh
af034080ba feat(@vben/web-antd): 区域树默认展开园区和楼栋节点 2026-03-31 22:55:55 +08:00
lzh
f5f488080c fix(@vben/web-antd): 修正工单详情步骤展示与状态分布配色 2026-03-31 22:55:34 +08:00
lzh
16434a0d88 feat(@vben/web-antd): 新增工牌出入轨迹页面 2026-03-31 22:54:45 +08:00
lzh
91cd7adc39 chore: build and deploy web-antd
All checks were successful
Web UI CI/CD / build-and-deploy (push) Successful in 9s
2026-03-27 16:58:19 +08:00
lzh
69edf26550 style(@vben/web-antd): lint 自动格式化修正工单模块
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 16:54:07 +08:00
lzh
cc2d7a0a04 feat(@vben/web-antd): 手动创建工单分步弹窗 + code review 修复
新增手动创建工单功能,分3步:选类型→选区域(TreeSelect全路径)→填表单。
优先级使用字典值,按工单类型动态显示保洁/安保专属字段。

- 新增 create-order-form.vue 分步创建弹窗组件
- work-order/index.vue 挂载弹窗替换占位
- card-view.vue 补充 OpsOrderCenterApi 类型导入
- 还原 auth.ts 误删的 visitTenantId 逻辑

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 16:52:15 +08:00
lzh
84cb4930fd refactor(@vben/web-antd): 删除保洁工单中心,统一使用通用工单中心
保洁工单中心与通用工单中心功能重叠,统一入口避免歧义。

- 删除 views/ops/cleaning/work-order 整个目录
- 迁移 cleaning-actions/detail-ext/work-progress 组件到 work-order/components/
- 迁移 CLEANING_TYPE_OPTIONS/TEXT_MAP 到 work-order/data.ts
- 删除路由中保洁工单详情和看板两条路由
- 更新详情页组件引用路径

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 16:48:13 +08:00
lzh
6ca2833df6 refactor(@vben/web-antd): 工单操作接口按业务线拆分(保洁/安保)
后端 OpsOrderController 移除了 assign/cancel/complete/create 通用接口,
改由 CleanWorkOrderController 和 SecurityOrderController 各自提供 manual-* 系列接口。

- 新增 api/ops/security/index.ts 安保工单操作 API
- cleaning/index.ts 新增 manualCreate/Dispatch/Cancel/UpgradePriority
- order-center/index.ts 移除 assignOrder/cancelOrder
- 表单组件按工单类型路由到对应 API
- cancel-form/upgrade-priority-form 支持 orderType 区分调用路径

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 16:45:11 +08:00
lzh
c6e51a215f chore: build and deploy web-antd
All checks were successful
Web UI CI/CD / build-and-deploy (push) Successful in 10s
2026-03-25 16:05:53 +08:00
lzh
0dbdba336f style(@vben/web-antd): lint 自动格式化修正工单模块
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 15:45:07 +08:00
lzh
506625164c feat(@vben/web-antd): 安保工单详情左图右表布局改造及工单模块代码质量优化
- 安保详情事件信息改为左图右表布局,新增摄像头名称和处理人手机号字段
- 工单卡片展示处理人手机号,时间字段类型兼容时间戳和格式化字符串
- 工单详情页安保扩展区位置下移,安保工单隐藏重复的执行人行
- 登录后默认设置访问租户为登录租户
- 修复 scoped 暗色模式选择器不生效问题,移除 as any 类型断言

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 15:43:24 +08:00
lzh
de95c707a0 style(@vben/web-antd): lint 自动格式化修正工单模块
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 11:37:48 +08:00
lzh
9d2e7d9e13 style(@vben/web-antd): P0 紧急工单卡片改为右上角渐变光晕标识
- 移除左侧红色竖条(border-left),改为右上角径向渐变
- 渐变色与 P0 标签色系协调(#C01D1D 14% 不透明度)
- 暗色模式适配渐变加深至 18%
- 移除 overflow:hidden 避免裁切子元素阴影
- 状态标签改为 span + inline style 双色渲染
- 同步更新 cleaning/work-order 卡片视图

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 11:36:56 +08:00
lzh
0772a12074 feat(@vben/web-antd): 工单详情取消状态进度条改造及代码质量优化
- 取消状态下进度条展示 timeline 实际节点,末尾追加"已取消"终态
- 已走过节点灰色实心,取消终态节点深灰,进度线灰色
- 移除底部红色 cancelled-banner,改为进度条内联展示
- 进行中节点蓝色标签改为显示到达时间
- 提取 isCurrentActive / getStepTime 简化模板逻辑
- timeline 去重防御异常数据,取消终态改用索引判断
- 移除 progress-steps-wrapper 的 overflow:hidden 避免裁切光晕
- 清理无引用的 cancelled-banner CSS

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 11:36:19 +08:00
lzh
d0395ba40a style(@vben/web-antd): 统一工单中心配色方案为柔和浅底双色风格
- STATUS_COLOR_MAP / ORDER_TYPE_COLOR_MAP 由单色改为 { bg, text } 双色结构
- 新增 FACILITIES / SERVICE 工单类型配色
- 优先级配色改为按数值直接映射(P0~P3),不再依赖字典 colorType
- Tag 组件替换为 span + inline style,精确控制背景色与文字色
- 仪表板饼图 STATUS_COLORS 同步更新
- 同步更新 cleaning/work-order 模块保持一致

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 11:35:37 +08:00
lzh
7d22e4b395 fix: 修改文件上传大小限制20M
All checks were successful
Web UI CI/CD / build-and-deploy (push) Successful in 10s
2026-03-24 18:59:41 +08:00
lzh
c700ab38f4 chore: build and deploy web-antd
All checks were successful
Web UI CI/CD / build-and-deploy (push) Successful in 9s
2026-03-24 09:48:00 +08:00
lzh
0d505737b9 style(@vben/web-antd): lint 自动格式化修正 login.vue
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 09:45:59 +08:00
lzh
9c822ba9d9 fix(@vben/web-antd): 企微扫码登录前校验租户是否已选择
多租户模式下,未选择租户时点击企微扫码登录会触发
租户字段校验提示,避免无租户请求导致后端报错。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 09:44:21 +08:00
lzh
2c678c3a82 fix(@vben/web-antd): 优化企业微信扫码登录体验
自动社交登录时显示 loading 状态,跳过租户列表加载,
避免闪烁显示登录表单和租户错误信息。
租户 ID 已持久化在 store 中,无需重新获取。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 09:38:05 +08:00
lzh
f77a8c3e4c chore: build and deploy web-antd
All checks were successful
Web UI CI/CD / build-and-deploy (push) Successful in 8s
2026-03-24 09:30:39 +08:00
lzh
7aff45ddf5 fix(@vben/web-antd): 企业微信扫码登录适配 hash 路由模式
hash 路由下 OAuth 回调 code/state 在 URL query 中,Vue Router
读不到。登录流程同绑定流程一样通过 sessionStorage 中转参数,
路由守卫检测后重定向到 social-login 页面完成登录。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 09:19:18 +08:00
lzh
bfa2752ca1 chore: build and deploy web-antd
All checks were successful
Web UI CI/CD / build-and-deploy (push) Successful in 8s
2026-03-24 09:13:13 +08:00
lzh
10bd00e009 feat(@vben/web-antd): 企业微信扫码登录及绑定(适配 hash 路由)
- 登录页新增企业微信扫码登录入口(TDesign 官方图标)
- 个人中心开放企业微信绑定/解绑功能
- 适配 hash 路由模式:OAuth 回调 code 在 URL query 中,
  通过路由守卫转存 sessionStorage 并重定向到个人中心处理绑定

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 09:09:12 +08:00