Commit Graph

96 Commits

Author SHA1 Message Date
root dc763d874a fix: 修复待审批列表查询逻辑
- 检查用户是否在当前节点的审批人列表中
- 排除已经审批过的申请
- 同时修复数据库节点7的审批人配置

问题:待审批列表没有验证用户是否为当前节点审批人

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 17:34:56 +08:00
root a1176b1042 fix: 移除硬编码,使用数据库配置审批流程
- 数据库已配置审批节点:陈兰 (id=27)
- 数据库已配置抄送节点:陈标 (id=29)
- 移除硬编码的 getDefaultApproversFromConfig() 方法
- 代码从数据库读取配置

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 17:30:25 +08:00
root a6e4a7fbc4 feat: 设置默认审批人为陈兰,抄送人为陈标
- 当没有配置审批流程时返回默认值
- 新增 getDefaultApproversFromConfig() 方法
- 默认审批人:陈兰 (id=27)
- 默认抄送人:陈标 (id=29)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 17:24:45 +08:00
root c1016c740d feat: 接入飞书消息通知到出差审批功能
- 提交申请后通知审批人和抄送人
- 审批通过/拒绝后通知申请人
- 取消申请后通知审批人和抄送人
- 新增 sendApprovalNotification() 方法
- 新增 sendApprovalResultNotification() 方法
- 新增 sendCancelNotification() 方法

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 17:16:23 +08:00
root a88944b5e1 refactor: 删除 users 表中未使用的字段
- 删除 report_to(上级ID)字段
- 删除 position(职位)字段
- 更新 User 模型移除相关关联和类型转换
- 更新 BusinessTripService 移除 position 返回

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 16:56:51 +08:00
root fdbe2e837a refactor: 删除 users 表中的冗余飞书字段
- 删除 feishu_user_id, feishu_open_id, tenant_key 字段
- JWT token 改用 feishu_app_id 代替 feishu_user_id
- 删除废弃的 FeishuService::sendApprovalMessage() 方法
- 更新 User 模型移除废弃字段和 scope 方法

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 16:33:58 +08:00
root 0489da5e40 refactor: 重构多飞书应用绑定架构和数据库清理
- 新增 user_feishu_apps 表支持用户绑定多个飞书应用
- users 表添加唯一约束(公司内邮箱/手机唯一)
- 迁移现有飞书数据到 user_feishu_apps 表
- 清理冗余表(users_bak, user_feishu_binding)
- 废弃 users 表中的 feishu_user_id/feishu_open_id/tenant_key 字段
- 更新 FeishuNotificationService 使用新的数据获取方式
- User 模型新增 getFeishuUserId() 等便捷方法

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 16:27:33 +08:00
root 04947ae52d fix: 修复飞书通知模块API路径和卡片格式
- 修改API路径为 /open-apis/im/v1/messages (message/v4已废弃)
- 添加卡片config配置
- 修复content格式(直接传卡片对象,不需要包裹)
- 添加测试接口 /api/v1/test/notification

测试结果: 成功发送通知到李佳博(feishu_user_id: 481g947d)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 15:27:54 +08:00
root 2e5f570b40 feat: 完善鉴权和密码功能,添加飞书通知模块
- 完善Token过期/不存在时跳转登录重新认证
- 实现正常的账号密码登录验证(邮箱/手机号+密码)
- 用户初始化密码设为工号(sn)
- 添加修改密码功能(API+前端页面)
- 修复扫码登录后跳转问题(zustand persist格式)
- 创建飞书通知服务 FeishuNotificationService
- 设置页面添加修改密码入口

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 15:19:37 +08:00
root ba555a59b7 debug: 添加轮询和跳转的详细日志 2026-02-26 12:00:56 +08:00
root 826989d6bf style: 只保留带 emoji 的提示,移除状态文字 2026-02-26 11:59:46 +08:00
root 716d39f0b6 style: 恢复带 emoji 的飞书扫码提示文字 2026-02-26 11:58:33 +08:00
root 32a0ba57cb style: 移除冗余的飞书扫码提示文字 2026-02-26 11:58:02 +08:00
root 6b9addf35d style: 调整弹框左右留白为 10px 2026-02-26 11:57:28 +08:00
root 40d4d88f98 style: 继续减少弹框留白为 8px 20px 2026-02-26 11:57:02 +08:00
root 49f8e30839 style: 继续减少弹框留白为 12px 20px 2026-02-26 11:56:48 +08:00
root 947cbdd571 style: 继续减少弹框留白为 16px 20px 2026-02-26 11:56:38 +08:00
root e82e6988a1 style: 减少弹框留白为 24px 20px 2026-02-26 11:56:22 +08:00
root 88a25e21c2 style: 调整二维码弹框的四周留白为 40px 30px 2026-02-26 11:56:08 +08:00
root b12842a338 style: 更新 QR SDK 配置参数,添加 style 属性
- width/height: 250x250
- style: width:300px;height:270px;border:none

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 11:55:07 +08:00
root 9836525c81 style: 进一步增大二维码尺寸到 280x280 2026-02-26 11:49:40 +08:00
root a691675411 style: 调整二维码尺寸为 240x240,增加容器高度 2026-02-26 11:47:30 +08:00
root 79cef9ac91 fix: 修复 QRLogin SDK 二维码不显示的问题
1. 使用 getElementById 获取容器,避免清空容器本身
2. 确保 DOM 渲染完成后再调用 SDK

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 11:36:46 +08:00
root d76ee80ecc fix: 修正飞书 SDK 全局变量名为 QRLogin
SDK 的全局变量是 window.QRLogin 而不是 window.QR

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 11:30:35 +08:00
root 983f58ee98 fix: 增加 SDK 加载等待时间,确保 window.QR 已初始化 2026-02-26 11:23:47 +08:00
root 6eb621cd95 fix: 在 HTML 中直接引入飞书 QR SDK
根据官方文档,SDK 应该在 HTML 中通过 script 标签引入,
而不是动态加载。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 11:19:46 +08:00
root 429a8605fc fix: 添加 QR SDK 加载失败的降级方案
1. 优先尝试加载飞书官方 QR SDK
2. 如果 SDK 加载超时(5秒)或失败,自动降级到普通二维码
3. 添加详细的加载日志,方便调试

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 11:16:40 +08:00
root 474c532666 fix: 使用飞书官方 QR SDK,扫码后不打开浏览器
使用飞书官方 LarkSSOSDKWebQRCode-1.0.3.js 生成二维码,
飞书APP会识别为登录二维码并在APP内直接处理,
不会打开任何浏览器窗口。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 11:13:43 +08:00
root 457b1d75f0 fix: 返回完全空白的响应页面
正常飞书APP内扫码流程:
1. 用户扫码确认授权
2. 飞书APP直接返回主界面(不会打开任何页面)
3. 电脑端通过轮询检测登录成功并自动跳转

redirect_uri 是OAuth协议要求的配置,但飞书APP内扫码时不会真正访问此URL。
只有在浏览器扫码时才会真正跳转,此时返回空白页面。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 11:10:51 +08:00
root ad6984d22a fix: 扫码登录成功后返回空页面并自动关闭
手机端扫码成功后直接关闭并返回飞书,不显示任何页面内容。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 11:08:10 +08:00
root fd364be4b6 fix: 扫码登录成功后返回简单页面,不重定向
移动端扫码完成后显示登录成功页面,用户可直接关闭,
不再重定向到前端页面。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 11:04:31 +08:00
root cd1499cd0f fix: 修正飞书登录回调重定向方法
使用 Webman 全局 redirect() 函数,而不是 Response::redirect()

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 11:02:41 +08:00
root a1b395b147 fix: 移除 HttpClient 中的 curl_close() 调用
PHP 8.0+ 中 curl 资源会自动关闭,curl_close() 已被弃用。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 10:45:22 +08:00
root 6899bad529 refactor: 重构飞书授权代码,提取公共工具类
1. 创建 app/util/HttpClient.php
   - 公共 HTTP 请求类
   - httpGet() 和 httpPost() 方法
   - 支持自定义 headers 和 timeout
   - 统一错误处理和日志

2. 创建 app/util/FeishuUtil.php
   - 飞书授权工具类,可被其他业务模块复用
   - getAppAccessToken() - 获取应用访问令牌(带缓存)
   - getUserAccessToken() - 获取用户访问令牌
   - getUserInfo() - 获取用户信息
   - getCompleteUserInfo() - 一步获取完整用户信息
   - clearTokenCache() - 清除 token 缓存

3. 重构 app/service/FeishuService.php
   - 使用新的工具类
   - 移除重复的 HTTP 请求方法
   - 保持向后兼容

飞书授权流程:
1. app_access_token (应用级令牌)
2. user_access_token (用户级令牌,需要 app_access_token)
3. 用户信息 (需要 user_access_token)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 10:43:29 +08:00
root b1d58ece61 fix: 使用飞书官方 passport 授权端点
后端修改:
- 授权 URL 从 open-apis 改为 passport.feishu.cn
- 使用 passport 端点获取 user_access_token
- 添加 httpGet 方法

前端修改:
- 使用官方 tt.requestAuthCode() API(飞书内免登)
- 保留轮询方式实现扫码登录

参考文档: https://open.feishu.cn/document/sso/web-application-sso/qr-sdk-documentation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 10:20:48 +08:00
root fa8843d9e0 fix: 使用官方 tt.requestAuthCode API 替代 ttjsBridge
- 添加 tt 对象类型声明(官方 H5 API)
- 优先使用 tt.requestAuthCode() 获取授权码
- 保留 ttjsBridge 作为降级兼容方案
- 修正环境检测逻辑

参考文档: https://open.feishu.cn/document/quickly-create-a-login-free-web-app/introduction

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 10:14:03 +08:00
root 029a3820bb fix: 修正 nginx trailing slash 导致路由代理失败的问题
- location 使用 /login/qrcode (不带尾部斜杠)
- proxy_pass 使用 http://127.0.0.1:8787 (不带路径)
- 这样可以完整传递 URI 到后端

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 10:08:11 +08:00
root 6357e5dbdc fix: 修复飞书扫码登录 404 问题
1. 后端路由修正
   - 将 /login/qrcode/{id} 移出 /api/v1 路由组
   - 修正路由参数获取方式,使用参数注入而非 getRouteParam()

2. OpenResty 配置
   - 添加 /login/qrcode/ 路径代理到后端

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 10:06:27 +08:00
root 4ca47f0d33 fix: 修复 CustomEvent 语法错误,缺少闭合括号 2026-02-26 10:02:24 +08:00
root 77668d0323 fix: 修正 Toast 导入方式,使用命名导入 2026-02-26 10:01:21 +08:00
root 2bde4ae10f fix: 安装 qrcode.react 依赖 2026-02-26 09:59:41 +08:00
root df07b16c7a feat: 实现多端飞书登录功能
1. 飞书客户端内:静默自动登录
   - 检测飞书环境 (userAgent + ttjsBridge)
   - 调用 ttjsBridge.getAuthCode() 获取授权码
   - 自动登录到后台

2. 飞书客户端外:扫码登录
   - 后端新增三个接口:
     * POST /api/v1/auth/qrcode-login - 生成登录会话和二维码
     * GET /api/v1/auth/qrcode-login/status - 轮询登录状态
     * GET /login/qrcode/{id} - 飞书授权回调
   - 前端新增 QRCodeLogin 组件:
     * 使用 qrcode.react 生成二维码
     * 每 2 秒轮询登录状态
     * 状态:loading → pending → scanning → success/expired

3. 数据库表:feishu_login_session
   - 存储 session_id, auth_url, status, user_id
   - 状态:pending, scanning, success, expired
   - 2 分钟过期机制

4. 其他优化
   - 移除审批详情页的 header
   - 更新 PROJECT_ISSUES.md 文档

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 09:58:19 +08:00
root 8110b1e5e6 feat: 发起人自动审批通过功能
- 当发起人在审批人列表中时,提交时自动创建审批通过记录
- 根据节点类型判断是否完成:
  - 单人审批(approver):发起人审批后节点完成
  - 或签(or_approve):发起人审批后节点完成
  - 会签(and_approve):需要所有审批人审批才完成
- 节点完成后自动移动到下一节点或完成审批
- 更新 PROJECT_ISSUES.md 记录问题和解决方案

业务逻辑说明:
- 如果发起人选择自己作为唯一审批人,提交后申请直接完成
- 如果有其他审批人,需要其他审批人继续审批

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 09:44:44 +08:00
root ba41b340fc fix: 修复审批列表首次加载不显示和发起人审批人问题
- 移除 loadingRef,解决 React 18 StrictMode 下请求阻塞问题
- 提交申请时根据选择的审批人动态创建/更新审批节点
- 修改申请提交后跳转到审批列表而非出差列表
- 更新 PROJECT_ISSUES.md 记录所有问题和解决方案

修复问题:
1. 首次进入审批列表"我发起的"不显示数据
2. 发起人也是审批人时"待我审批"不显示
3. 申请提交后跳转到错误的页面

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 09:35:26 +08:00
root b7919910f1 docs: 整理项目问题文档,修复审批列表数据混乱
- 新增 PROJECT_ISSUES.md 统一管理所有问题和解决方案
- 精简 CLAUDE.md,移除重复的问题记录部分
- 修复审批列表数据混乱问题(React 18 StrictMode + 状态管理)
- 修复首次加载不显示数据问题(requestIdRef 清理时机)
- 修复页码初始值错误(hasMore 默认值)
- 修复后端响应序列化问题(Eloquent 模型转数组)
- 添加审批人和抄送人重复校验
- 修复双 header 问题
- 调整申请页面 padding-bottom

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 09:12:21 +08:00
root 214992b163 fix: 修复出差申请页面头像 key 重复警告
- 审批人头像 key 改为 approver-{id}
- 抄送人头像 key 改为 cc-{id}

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:42:39 +08:00
root 5c582b092e fix: 修复审批弹框按钮不显示的问题
- 使用 actions 属性自定义弹框按钮
- 添加按钮点击事件的日志

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:39:03 +08:00
root 2a5c335cdd debug: 增加审批弹框的调试日志
- 添加按钮点击和API调用的日志
- 添加弹框关闭的日志
- 添加 closeOnMaskClick 和 closeOnAction 配置

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:37:09 +08:00
root 1780822528 fix: 飞书登录回调地址改为https协议
- 重定向URI改为: https://xsm.dev.hnxinyouhe.com/login

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:33:14 +08:00
root e4e2be904b fix: 修正飞书登录回调地址为http协议
- 重定向URI改为: http://xsm.dev.hnxinyouhe.com/login
- 移除scope参数,使用飞书默认权限

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:32:35 +08:00