18338781771
|
ae9b82e683
|
获取fdesk对应的用户id
|
2026-03-03 14:50:41 +08:00 |
|
root
|
3ebbbefb8d
|
fix: 修复审批详情显示实际审批人和飞书消息emoji编码
1. 审批详情显示修复
- 新增 ApprovalService::getDetail() 方法
- 从 form_data 获取用户实际选择的审批人和抄送人
- 返回每个节点的 actual_approvers 和 approver_statuses
- 修复详情页显示默认审批人而非实际审批人的问题
2. 飞书消息emoji编码修复
- 修复 content 字段格式:应为 card 对象JSON字符串,不是 {"card":{...}}
- 使用 JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES
- 新增 HttpClient::httpPostJson() 方法处理预编码字段
- 修复消息发送错误码 200621
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-03-01 10:02:53 +08:00 |
|
root
|
5bbed98cf0
|
feat: 添加消息日志记录功能,用于调试消息走向
新增功能:
1. 创建 feishu_message_log 表,记录消息发送和更新操作
2. FeishuMessageLog 模型:管理消息日志
3. DebugController:提供调试接口查看日志
使用方式:
- GET /debug/message-logs?limit=50 - 查看最近50条日志
- GET /debug/message-logs?order_id=123 - 查看指定订单的日志
- POST /debug/clear-logs - 清空日志
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-28 18:47:23 +08:00 |
|
root
|
34b294fd48
|
fix: 添加订单状态检查和友好错误提示
- 检测订单已完成状态,返回友好提示
- 添加infoCard方法显示中性提示
- 优化自审批错误处理
|
2026-02-28 14:30:35 +08:00 |
|
root
|
1b0be5918d
|
fix: 防止自审批并优化飞书响应
- 添加自审批检查(申请人不能审批自己的申请)
- 使用 response() 函数替代 new Response() 确保飞书回调正确
|
2026-02-28 14:19:58 +08:00 |
|
root
|
95e150b65f
|
fix: 使用正确的Webman Request方法获取协议
- 使用 request()->header('x-forwarded-proto') 替代 isSecure()
- 支持反向代理环境
|
2026-02-28 14:15:57 +08:00 |
|
root
|
ea10bdb138
|
fix: 修复request()->scheme()方法不存在的问题
- ApprovalService.getDetailUrl: 改用 request()->isSecure()
- AuthController.qrcodeLogin: 改用 request()->isSecure()
|
2026-02-28 14:12:59 +08:00 |
|
root
|
0aa5b3abef
|
fix: 添加飞书卡片回调调试日志,追踪200671错误
|
2026-02-28 14:10:31 +08:00 |
|
root
|
342f3128bf
|
fix: 修复飞书卡片回调JSON编码问题,解决200671错误
- 添加 JSON_UNESCAPED_UNICODE 防止中文被转义
- 添加 JSON_UNESCAPED_SLASHES 防止斜杠被转义
- Content-Type 添加 charset=utf-8
|
2026-02-28 14:04:55 +08:00 |
|
root
|
4667590feb
|
fix: 修复飞书免登功能,添加 H5 JSSDK 和 appId 自动获取
后端改动:
- 新增 /api/v1/auth/feishu-config 接口,根据 company 参数返回对应 appId
前端改动:
- 添加飞书 H5 JSSDK (h5-js-sdk-1.5.19.js)
- 修改登录页免登逻辑:先从后端获取 appId,再调用 tt.requestAuthCode
- 新增飞书环境检测测试页面 (/feishu-env-test)
- 移除测试页面的自动轮询逻辑
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-28 08:58:51 +08:00 |
|
root
|
40234a1d90
|
fix: 使用数据库中的 mobile_callback_url 作为回调地址
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-27 22:14:18 +08:00 |
|
root
|
103da81a5c
|
fix: 移除硬编码的开发环境域名
- 使用动态域名配置(从 request 或 config 读取)
- 添加 FEISHU_BASE_URL 环境变量支持
- 修复回调地址为当前站点域名
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-27 22:12:46 +08:00 |
|
root
|
c1e54d9457
|
chore: 移除已迁移的旧文件
|
2026-02-27 18:01:32 +08:00 |
|
root
|
b1ca2c58b7
|
feat: 飞书登录支持多租户和用户工号管理
后端改动:
- FeishuService: 从飞书用户信息获取 tenant_key 和手机号
- FeishuService: 新增 user_sn 表工号分配机制
- FeishuService: 优先使用 enterprise_email,支持手机号
- AuthController: 飞书免登支持 company 参数
前端改动:
- FeishuAutoLogin: 支持多租户 company 参数
- login/index: 支持 redirect 参数和已登录检测
- QRCodeLogin: 支持多租户参数传递
- router: 新增路由守卫和参数处理
- api.ts: 优化飞书登录 API 调用
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-27 17:57:49 +08:00 |
|
root
|
b1895be50d
|
feat: 优化飞书审批通知卡片,改用卡片回调机制
主要改动:
- 去掉卡片中的备注输入框和表单元素
- 改为三个按钮(通过、拒绝、查看详情)横向排列在一行
- 通过/拒绝按钮使用卡片回调(value)而不是跳转 URL
- 新增 FeishuCardController 处理飞书卡片回调
- 添加提示文字告知用户如需备注可去详情页操作
技术细节:
- 按钮点击触发 card.action.trigger 事件
- 后端通过 FeishuCardController 处理回调
- 支持 url_verification 和 card.callback 两种事件类型
- 查看详情 URL 添加公司参数支持多租户
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-27 17:53:10 +08:00 |
|
root
|
68e0c261d8
|
feat: 完善业务审批消息链路
修改内容:
1. TestController - 添加 real 参数支持发送真实业务通知
2. BusinessTripService.sendApprovalNotification() - 传递 order_id
业务流程:
1. 用户创建申请 → 审批人收到带按钮的通知
2. 点击"通过"/"拒绝"按钮 → 跳转到审批详情页
3. 自动弹出确认框 → 完成审批
4. 通知下一节点审批人/申请人
按钮链接:
- 通过/拒绝:/approval/detail/{order_id}?action=approve|reject
- 查看详情:/business-trip/detail/{business_id}
测试命令:
- 测试消息: /api/v1/test/notification?user_id=1&order_id=64
- 真实业务: /api/v1/test/notification?user_id=1&order_id=64&real=1
相关文件:
- backend/app/controller/TestController.php
- backend/app/service/BusinessTripService.php
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 19:10:51 +08:00 |
|
root
|
cc3c599c90
|
fix: 使用 form_data 存储运行时审批人,不修改 approval_node 模板
主要修改:
1. submit() 方法不再修改 approval_node 表,节点仅作为流程模板
2. getList() 的 pending 查询从 form_data.approvers 获取审批人列表
3. approve() 方法从 form_data.approvers 检查用户是否有权限
4. 兼容两种数据格式:[1,2,3] 或 [{id:1},{id:2},{id:3}]
修复问题:
- 之前每次提交申请都会修改 approval_node 表的 approvers 字段
- 这导致流程模板被污染,不同的申请共享同一个节点配置
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 18:01:40 +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
|
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
|
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
|
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
|
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
|
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
|
ab62b9839e
|
fix: 清理旧的测试数据,添加调试日志
- 删除所有旧的测试订单(id <= 14)
- 前端添加调试日志,查看请求参数和响应数据
- 后端添加日志,记录接收到的请求参数
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 00:09:36 +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
|
3968e94195
|
feat: 实现默认审批人和抄送人功能
- 后端新增 getDefaultApprovers 接口,从审批流程配置中获取默认审批人和抄送人
- 前端申请页面加载时自动获取并显示默认审批人和抄送人
- 添加默认审批流程配置:1个审批人(闫继光) + 2个抄送人(孟启、程丽敏)
- 移除后端 support 目录下的自定义 Db 和 Model 类,使用 Webman 官方实现
- 前端选择页面优化:优先从 sessionStorage 恢复,否则加载后端默认配置
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-25 18:54:38 +08:00 |
|
root
|
7c933bad16
|
feat: 完善审批接口功能
- 修复 ApprovalController 路由参数获取方式
- 修复 BaseController 命名空间引用问题
- 添加 use 语句引入 ApprovalOrder
- 修复 ApprovalNode 类型常量与数据库 enum 一致
- 修复 ApprovalService 中的 action 常量引用
- 测试验证审批列表、详情、通过接口正常工作
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-25 18:26:22 +08:00 |
|
root
|
66b61eada4
|
refactor: 使用官方support\Db和support\Model
- 创建 support/Db.php 和 support/Model.php
- 在 bootstrap.php 中自动初始化数据库
- 移除 app/util/Db.php
- 更新所有模型和控制器使用官方类
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-25 18:15:17 +08:00 |
|
root
|
81cde28aa5
|
fix: 添加数据库初始化到AuthController
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-25 18:10:49 +08:00 |
|
root
|
582f454a5a
|
refactor: 重构后端目录结构和命名规范
- 将后端目录名从大写改为小写 (Controller->controller 等)
- 将命名空间从 App\ 改为 app\ (符合 webman 官方规范)
- 移除不必要的 bootstrap 目录
- 完善出差审批业务功能:
- 添加删除草稿功能
- 添加审批操作功能(同意/拒绝)
- 完善审批详情页,显示审批人和审批记录
- 前端优化:
- 调整列表页行高
- 隐藏底部导航栏
- 仪表盘只显示3个快捷入口
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-25 18:09:04 +08:00 |
|
root
|
09d4cb8054
|
fix: 修复页面间状态丢失问题并优化选择页面
- 修复选择审批人后再选择抄送人导致状态丢失的问题
- 使用独立的 sessionStorage key (selectedApprovers, selectedCc)
- 组件每次挂载时从 sessionStorage 恢复状态
- 只在提交/保存成功后清除 sessionStorage
- 优化人员选择页面布局和样式
- 更新 CLAUDE.md 文档记录问题和解决方案
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-25 15:22:12 +08:00 |
|
root
|
8629f4a4ce
|
refactor: fix directory structure and namespaces for webman conventions
- Rename directories to lowercase: Controller→controller, Model→model, Service→service, Util→util, Bootstrap→bootstrap
- Update all namespaces from App\Xxx to app\xxx (webman convention)
- Update all import statements across the codebase
- Update route.php to use lowercase namespaces
- Remove unused CompanyFeishuApp model
- Comment out unimplemented controller routes
Following webman 2.x framework conventions:
- Models: app\model\{ClassName}
- Controllers: app\controller\{ClassName}
- Services: app\service\{ClassName}
- Utils: app\util\{ClassName}
- Middleware: app\middleware\{ClassName}
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-24 18:28:23 +08:00 |
|