Commit Graph

58 Commits

Author SHA1 Message Date
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 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 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 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
root 4712cc4446 fix: 添加飞书授权scope参数并增加调试日志
- scope参数设置为必需的权限范围
- 添加授权URL日志输出便于调试

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:28:34 +08:00
root fd48d35f8c fix: 修改飞书登录回调地址为公网域名
- 使用 https://xsm.dev.hnxinyouhe.com/login 作为回调地址
- 确保飞书授权可以正常跳转

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:28:00 +08:00
root ba919d2cdc debug: 增加更详细的调试日志来排查审批按钮不显示问题
- 添加类型检查日志(userId、approvers类型)
- 添加多种匹配方式尝试
- 显示操作按钮状态

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:24:48 +08:00
root a5a148d57e style: 审批流程样式优化
- 审批人标签:蓝色 (#1890ff)
- 抄送人标签:橙色 (#faad14)
- 已审批:绿色对号 ✓
- 待审批:蓝色时钟图标 ⏱ + 脉动动画
- 未开始:灰色序号

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:21:45 +08:00
root 76c6e93e36 feat: 审批流程改为时间轴样式,增加审批人/抄送人标识
- 审批流程使用时间轴样式显示
- 增加"审批人"和"抄送人"标签
- 已审批节点显示审批人姓名和审批时间
- 未审批节点显示节点名称(人名)
- 当前审批节点高亮显示

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:19:37 +08:00
root be5dea1d24 fix: 将审批节点名称改为直接显示人名
- 数据库:将节点名称从"经理审批"、"主管审批"等改为直接显示人名
- 前端:未审批时显示节点名称(人名),而非"待审批"

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:16:55 +08:00
root 349b6c9fe3 fix: 审批流程节点只显示人名,不显示职务前缀
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:16:14 +08:00
root dad47d8df5 fix: 修复审批详情页多余的闭合标签导致白屏
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:15:29 +08:00
root 4c48b01144 fix: 修改审批流程显示格式为"审批人-姓名"或"抄送人-姓名"
- 添加 getNodeApproversNames 函数获取审批人姓名
- 添加 getNodeDisplayName 函数生成节点显示名称
- 更新审批流程和当前审批的显示逻辑

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:14:11 +08:00
root 40384d7f26 fix: 修复审批列表选项卡切换时使用旧状态值的问题
- 修复 loadData 函数,添加 tab 参数直接传递当前选中的标签
- 修复文件中的重复代码问题
- 添加更详细的调试日志

问题原因:setActiveTab 是异步的,handleTabChange 中调用 loadData 时,
activeTab 还是旧值,导致请求参数错误。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:10:08 +08:00
root ab62b9839e fix: 清理旧的测试数据,添加调试日志
- 删除所有旧的测试订单(id <= 14)
- 前端添加调试日志,查看请求参数和响应数据
- 后端添加日志,记录接收到的请求参数

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:09:36 +08:00
root 09ccc05b83 fix: 审批详情页表单字段标签显示中文
- 添加表单字段映射表(formFieldLabelMap)
- 将英文key(如reason)翻译成中文标签(如"出差事由")

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:06:19 +08:00
root 71a9ec2eda fix: 修复审批详情页审批按钮不显示的问题
- 在 ApprovalRecord 接口中添加 node_id 和 approver_id 字段
- 添加调试日志帮助排查问题

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:05:43 +08:00
root 04953b22dc feat: 完善审批功能
- 新增通用审批列表页面(我发起的/待我审批/我已审批)
- 新增通用审批详情页面(支持审批通过/拒绝操作)
- 修复审批列表过滤逻辑("我已审批"只显示已完成订单)
- 修复登录页面未设置 Zustand store 的问题
- 修复 User 类型定义(id 改为 number 类型)
- 修复草稿恢复时的日期转换问题
- 创建测试数据脚本(test_data.php)
- 安装 webman 官方依赖包(database, redis, pagination 等)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 23:54:38 +08:00
root 358a222c24 fix: 移除导航前清除数据的逻辑,防止另一种类型人员丢失
问题:当用户没有输入内容就点击"选择审批人/抄送人"时,
会清除 sessionStorage 中所有人员数据,导致另一种类型的人员消失。

解决方案:移除导航前清除数据的逻辑,让 sessionStorage
中的数据在用户明确操作(提交、保存等)时才清除。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 21:44:42 +08:00
root 76ce4ba1b6 fix: 简化逻辑,确保新建申请时加载默认审批人
- 移除草稿恢复逻辑(从列表页新建时清除所有旧数据)
- 简化 useEffect 为两种情况:
  1. 从选择页面返回:恢复 sessionStorage 数据
  2. 从列表页新建:清除旧数据,加载默认配置

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 21:42:21 +08:00
root 67fe4bcb0e debug: 添加详细日志输出以便调试默认审批人加载问题
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 21:38:47 +08:00
root fa2d119099 fix: 简化 useEffect 逻辑,确保默认审批人正确加载
- 移除嵌套的异步函数,直接在 useEffect 中处理
- 只依赖 location.state?.fromSelection,避免不必要的重新执行
- 优化初始化流程:选择页面返回 > 草稿恢复 > 默认数据加载

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 21:37:28 +08:00
root 0ee7cb6f49 fix: 合并 useEffect 逻辑,修复默认审批人不显示的问题
问题原因:两个 useEffect 执行顺序冲突
- 第一个 useEffect 加载默认数据
- 第二个 useEffect 又清除了人员数据

解决方案:合并为一个统一的 useEffect,按优先级处理:
1. 从选择页面返回 -> 恢复 sessionStorage 数据
2. 有草稿数据 -> 恢复草稿及关联人员数据
3. 首次进入 -> 清除旧数据,加载默认配置

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 19:03:53 +08:00