104 Commits

Author SHA1 Message Date
root 46b233c743 fix: 审批详情页行程数据显示完整字段
修改后端行程数据映射,包含所有字段:
- departure: 出发地
- destination: 目的地
- start_time/end_time: 开始/结束时间(保持与数据库字段一致)
- transport: 出行方式
- trip_type: 行程类型
- remark: 备注

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 13:57:26 +08:00
root 09b2902d2b fix: 修复审批详情页行程时间不显示问题
从模型的 start_time 和 end_time 字段读取数据,而不是错误的 start_date 和 end_date。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 21:43:55 +08:00
root ebfac48c36 fix: 自审批场景发送"已自动通过"通知卡片
自审批时发送纯通知卡片(只有查看详情按钮),而不是带审批操作按钮的可操作卡片。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 14:17:52 +08:00
root 9ffb05bb49 fix: 自审批场景也发送卡片样式消息
保留自审批检测逻辑,但将自审批时的文本消息改为卡片消息,保持消息样式一致。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 14:11:48 +08:00
root ab49511e75 fix: 自审批场景也发送卡片样式消息
移除自审批检测逻辑,让所有审批消息(包括自审批)都发送卡片样式消息,提升用户体验一致性。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 14:11:16 +08:00
root 8f1a45b548 fix: 修复行程时间空字符串导致数据库错误 2026-03-01 13:55:10 +08:00
root 2adb1adb8b fix: 修复变量名不一致和移除预计费用 2026-03-01 13:52:12 +08:00
root b996ac21c0 fix: 防止重复更新消息和移除预计费用 2026-03-01 13:45:44 +08:00
root 34642bd008 debug: 添加itineraries调试日志 2026-03-01 13:34:20 +08:00
root 06b87a8361 debug: 添加更早的调试日志 2026-03-01 13:14:07 +08:00
root b61495edb9 fix: 在approve函数中初始化notificationService 2026-03-01 13:05:23 +08:00
root d992d31039 fix: 保存行程数据到form_data以便在详情页显示 2026-03-01 12:59:56 +08:00
root 805a8d890c debug: 添加调试日志 2026-03-01 12:58:43 +08:00
root f8524d333c fix: 修复审批后消息卡片更新和多行程显示问题
1. 审批人审批后,自己的消息卡片也更新为显示查看详情按钮
   - 新增 updateActorMessageCard() 方法更新操作人自己的卡片
   - 审批通过/拒绝时同时更新操作人和其他审批人的卡片

2. 多行程路线在审批详情中正确显示
   - 特殊处理 itineraries 字段,展示每个行程的详细信息
   - 添加行程列表样式,包括目的地、日期、费用等

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 12:46:41 +08:00
root b90f901fd9 fix: 修复多公司多飞书应用消息卡片更新失败问题
- feishu_message 表新增 company_id 和 feishu_app_id 字段追踪消息发送者
- 修改 FeishuMessage::saveMessage() 支持保存公司和飞书应用信息
- 修改 FeishuNotificationService 使用原始发送者的飞书应用配置更新消息
- 新增 HttpClient::httpPatchJson() 方法支持 PATCH 请求
- 文档更新:PROJECT_ISSUES.md 添加问题31,APPROVAL_NOTIFICATION_ARCHITECTURE.md 添加多公司架构说明

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 12:29:29 +08:00
root 27cf1a555f fix: 从申请人的用户信息中获取公司ID
approval_order 表没有 company_id 字段,改为从申请人
的用户信息中获取公司ID来设置飞书应用配置

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 11:55:45 +08:00
root df02078fad fix: 修复消息卡片更新时缺少公司ID的问题
- 在 updateMessageCards 和 updateMessageCardsForPartialApprove 方法中
添加获取订单公司ID并设置飞书应用配置的逻辑

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 11:51:17 +08:00
root 97dcb9604a fix: 修复会签/或签场景消息卡片更新和前端构建
后端:
- 修复 reject 方法中 notificationService 未初始化的问题
- 确保拒绝时也会更新其他审批人的消息卡片

前端:
- 重新构建前端代码

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 11:47:59 +08:00
root e13574f6f1 fix: 修复会签场景下消息卡片更新问题
- 添加 updateMessageCardsForPartialApprove 方法处理会签部分通过
- 会签一人通过后,其他人的消息卡片显示进度并保留按钮
- 修复 Dockerfile 构建顺序问题
- 修复前端类型定义问题

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 10:33:40 +08:00
root 78a1921f06 fix: 修复审批详情显示问题
- 修复用户不存在时仍然显示审批人ID的问题
- 即使部分用户不存在,也保留其ID信息显示
- 优化审批人和抄送人的查询逻辑

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 10:21:15 +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 8403d24be3 fix: 修复飞书消息双重编码问题
问题:
1. FeishuNotificationService 中先 json_encode 然后 HttpClient 又 json_encode
2. 导致 emoji 被双重编码,飞书 API 报错 200621

修复:
1. 直接传递数组给 HttpClient,让 HttpClient 统一进行编码
2. HttpClient 中使用 JSON_UNESCAPED_UNICODE 避免 emoji 转义
3. 移除了 FeishuNotificationService 中的中间编码步骤
2026-03-01 09:27:58 +08:00
root a0e2c7b267 fix: 修复飞书消息 emoji 编码问题
- 在 json_encode 中使用 JSON_UNESCAPED_UNICODE 标志
- 修复 sendMessage() 方法中的 JSON 编码
- 修复 updateMessageCards() 方法中的 JSON 编码
- 解决飞书 API 报错 200621 (parse card json err)
2026-03-01 09:26:19 +08:00
root 1e2d337854 fix: 修复 CLI 环境下 request() 为 null 导致的错误
- 在 getDetailUrl() 方法中添加 CLI 环境检查
- CLI 环境使用默认域名 uniservice-mobile.hnxinyouhe.com
2026-03-01 09:17:20 +08:00
root 7efd525f49 fix: 修复 BusinessTripService 中未定义变量 $node 的问题
- 将 $node 作为参数传递给 sendApprovalNotification() 方法
- 修复消息发送时 'Undefined variable $node' 错误
2026-03-01 09:03:24 +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 1f72da9ec4 feat: 添加消息卡片更新功能,支持或签/单人审批场景
新增功能:
1. 创建 feishu_message 表,存储消息与审批订单/节点/用户的映射关系
2. 发送审批通知时保存 message_id
3. 审批完成后自动更新其他审批人的消息卡片

使用场景:
- 或签(or_approve):一人通过后,更新其他审批人的消息卡片
- 单人审批(approver):一人通过后,更新其他审批人的消息卡片
- 拒绝(reject):拒绝后更新所有其他审批人的消息卡片

技术细节:
- FeishuMessage 模型:管理消息映射
- FeishuNotificationService::updateMessageCards():更新消息卡片
- ApprovalService:审批完成后调用消息更新逻辑

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 18:06:40 +08:00
root 25df589eea fix: 修复审批和抄送人相关问题
1. 修复抄送人显示问题
   - select-cc.tsx: 添加从后端获取默认抄送人的逻辑
   - 之前只从 sessionStorage 获取,导致默认抄送人无法加载

2. 修复多人审批重复操作问题
   - ApprovalService: approve() 方法添加重复审批检查
   - 检查用户是否已在当前节点审批过,避免重复操作
   - 恢复 isNodeCompleted() 从 form_data 获取审批人列表

3. 审批逻辑优化
   - 从 form_data['approvers'] 获取用户实际选择的审批人
   - 支持会签(and_approve)多人审批场景

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 17:34:10 +08:00
root e7165d3d9f fix: 修复3个紧急问题
1. 修复抄送人重新选择后接收不到通知的问题
   - BusinessTripService: 添加 $detailUrl 变量定义,确保抄送通知包含详情链接

2. 修复多人审批报错的问题
   - ApprovalService: isNodeCompleted() 方法改为从 $node->approvers 获取审批人列表
   - 之前从 form_data['approvers'] 获取会因重新选择审批人而导致数据不一致

3. 确保所有角色的通知消息都能点击进入详情
   - 飞书卡片通知已包含"查看详情"按钮,问题1的修复确保了抄送人也能正常跳转

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 17:11:14 +08:00
root 9a20604c9b Merge feature/mzl-dev: 修复json_decode问题 2026-02-28 14:42:25 +08:00
root 4789b8f394 fix: 删除多余的json_decode调用
- HttpClient::httpPost() 已经返回数组
- 删除 json_decode() 调用
2026-02-28 14:42:19 +08:00
root 63c11e0a0d Merge feature/mzl-dev: 修复HttpClient方法名 2026-02-28 14:41:16 +08:00
root a2c9ddd70a fix: 修复HttpClient方法名
- 使用 httpPost() 而不是 post()
- 修复自审批文本消息发送功能
2026-02-28 14:41:09 +08:00
root 60d7a1f82e Merge feature/mzl-dev: 修复方法名 2026-02-28 14:38:57 +08:00
root 3660db0efc fix: 修复getAccessToken方法名错误 2026-02-28 14:38:52 +08:00
root c70dc04198 Merge feature/mzl-dev: 修复自审批检测 2026-02-28 14:37:07 +08:00
root 094967cb02 fix: 添加applicant_id参数以支持自审批检测
- BusinessTripService: 传递 applicant_id 参数
- 确保自审批场景能正确发送文本消息而不是卡片
2026-02-28 14:37:00 +08:00
root 2de0dcd6be Merge feature/mzl-dev: 增强调试日志 2026-02-28 14:35:15 +08:00
root dcde90a498 debug: 增强自审批检测日志,排查为什么没有生效 2026-02-28 14:35:08 +08:00
root 57c53d329d Merge feature/mzl-dev: 添加自审批调试日志 2026-02-28 14:33:42 +08:00
root 08d588acce debug: 添加自审批检查日志 2026-02-28 14:33:35 +08:00
root 34b294fd48 fix: 添加订单状态检查和友好错误提示
- 检测订单已完成状态,返回友好提示
- 添加infoCard方法显示中性提示
- 优化自审批错误处理
2026-02-28 14:30:35 +08:00
root 6eed14933a feat: 自审批时发送文本消息而不是卡片消息
- FeishuNotificationService: 检测自审批场景,发送纯文本消息
- ApprovalService: 传递 applicant_id 参数
- 添加 sendTextNotification 和 sendText 方法
- 保留自审批自动通过逻辑(前端调用场景)
2026-02-28 14:22:40 +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