Commit Graph

29 Commits

Author SHA1 Message Date
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 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 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 1e2d337854 fix: 修复 CLI 环境下 request() 为 null 导致的错误
- 在 getDetailUrl() 方法中添加 CLI 环境检查
- CLI 环境使用默认域名 uniservice-mobile.hnxinyouhe.com
2026-03-01 09:17:20 +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 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 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 1004aea725 feat: 审批功能优化和拒绝原因弹窗
后端改动:
- ApprovalService: 添加调试日志,简化详情页 URL 生成逻辑
- BusinessTripService: 优化出差审批详情展示

前端改动:
- approval/detail: 审批详情页优化,支持查看完整审批流程
- approval/reject: 新增拒绝原因弹窗组件
- business-trip/detail: 出差详情页增强,展示审批状态和操作

功能特性:
- 审批详情页显示完整审批流程和记录
- 拒绝操作支持填写拒绝原因
- 出差申请详情页优化展示

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 17:57:56 +08:00
root df0d592ee4 feat: 飞书审批消息添加操作按钮
功能:
1. 审批通知卡片添加"通过"和"拒绝"按钮
2. 点击按钮跳转到审批详情页,自动弹出审批确认框
3. 保留"查看详情"按钮

实现:
- FeishuNotificationService.buildApprovalCard() - 添加审批操作按钮
- ApprovalService.notifyNextApprovers() - 传递 order_id 参数
- approval/detail.tsx - 处理 URL 中的 action 参数

按钮样式:
- 通过按钮:绿色 (primary)
- 拒绝按钮:红色 (danger)
- 查看详情:默认样式

相关文件:
- backend/app/service/FeishuNotificationService.php
- backend/app/service/ApprovalService.php
- frontend/src/pages/approval/detail.tsx

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 18:57:59 +08:00
root 32d19d56ee fix: 修复审批消息推送问题
问题1:BusinessTripService 数据格式兼容性
- 后端期望对象数组 [{id:1, name:'...'}],前端传纯 ID 数组 [1,2,3]
- 修复:兼容两种格式,自动提取 id

问题2:ApprovalService 没有消息推送
- 添加 FeishuNotificationService 集成
- approve() 方法:节点完成后通知下一节点审批人,流程完成后通知申请人
- reject() 方法:审批拒绝时通知申请人

问题3:修复重复类定义导致的语法错误

相关文件:
- backend/app/service/BusinessTripService.php
- backend/app/service/ApprovalService.php

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 18:53:56 +08:00
root e904d5cd97 fix: 修复 ApprovalService 使用 form_data.approvers
问题:ApprovalService 还在使用 approval_node.approvers 字段
解决:改用 form_data.approvers 作为运行时审批人数据

修改内容:
1. approve() - 添加跳过 notify 节点逻辑
2. isNodeCompleted() - 从 form_data 获取审批人
3. getPendingOrderIds() - 从 form_data 获取审批人

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 18:42:30 +08:00
root ea7f0f8820 feat: 添加"抄送我的"审批列表选项
后端修改:
- ApprovalService::getList 添加 'cc' 类型查询
- 从 form_data.cc_users 中查找包含当前用户的订单
- 兼容两种数据格式:[{id:29}] 或 [29]

前端修改:
- 添加"抄送我的"标签页
- 更新类型定义支持 'cc' 类型
- approvalListParams 类型添加 'cc' 选项

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 18:33:53 +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 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 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 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