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 |
|
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
|
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
|
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
|
09a7220e76
|
feat: 实现无感快速审批操作
问题:
- 用户点击飞书消息按钮需要跳转到web界面
- 需要登录才能操作,体验不流畅
解决方案:
1. 创建快速审批页面 (quick-action.tsx)
2. 用户点击按钮后自动执行审批操作
3. 操作成功后自动关闭页面或返回
4. 全流程无需用户手动跳转
工作流程:
1. 用户在飞书中点击"通过"/"拒绝"按钮
2. 打开快速审批页面
3. 自动执行审批操作(如果已登录)
4. 显示操作成功/失败
5. 自动关闭页面(飞书客户端)或返回列表
优势:
- 一步完成审批,无需跳转
- 已登录用户无感操作
- 未登录用户会引导登录后返回
相关文件:
- frontend/src/pages/approval/quick-action.tsx (新建)
- frontend/src/router/index.tsx
- backend/app/service/FeishuNotificationService.php
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 19:30:12 +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
|
7ee92d68fe
|
fix: 修复系统通知卡片 Markdown 渲染问题
问题:
- buildSystemCard 使用 plain_text 格式
- 内容中包含 Markdown 语法 **加粗** 无法渲染
- 显示为 **申请人**:陈兰 而不是 加粗的申请人
修复:
- 将 text.tag 从 plain_text 改为 lark_md
- 现在可以正确渲染 Markdown 格式
相关文件:
- backend/app/service/FeishuNotificationService.php
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 19:00:32 +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
|
61d1c70ba8
|
fix: 完善审批流程错误处理和调试日志
主要修改:
1. 添加完整的 try-catch 错误处理
2. 添加 Transaction 开始/成功日志
3. 添加保存前后的状态日志
4. 捕获并记录任何异常
测试验证:
- 审批流程正常执行
- 状态正确更新为 approved
- 跳过 notify 节点直接完成
- "我已审批"列表正确返回数据
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 18:23:02 +08:00 |
|
root
|
8b37d6313e
|
fix: 完善审批流程调试日志
添加详细的调试日志来追踪审批流程:
1. approve() 方法开始时的参数日志
2. 节点类型和完成状态的日志
3. 下一节点查询和跳过逻辑的日志
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 18:19:51 +08:00 |
|
root
|
f36fc69b8d
|
fix: 修复审批流程完成后状态更新问题
主要修改:
1. 修复下一节点查询逻辑,使用 order > currentOrder 替代 order > 0
2. 在 submit 和 approve 方法中跳过 notify 节点直接完成流程
3. 添加详细的调试日志
4. 兼容两种数据格式:[1,2,3] 或 [{id:1},{id:2},{id:3}]
修复问题:
- 审批完成后流程移到 notify 节点而不是完成
- business_trip status 没有更新为 approved
- "我已审批"列表为空
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 18:14:49 +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
|
5095f556c8
|
fix: 修复单人审批完成后的流程流转逻辑
问题:
1. 审批完成后直接移动到下一节点,没有检查节点类型
2. 抄送节点应该跳过并完成流程,而不是进入抄送节点
3. 审批完成后的申请应该进入"审批完成"状态
修复:
- 检查节点完成条件:单人审批/或签一人通过即完成
- 检查下一节点类型:抄送节点则跳过并完成
- 没有后续节点则完成流程
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-26 17:39:59 +08:00 |
|
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 |
|