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
8110b1e5e6
feat: 发起人自动审批通过功能
...
- 当发起人在审批人列表中时,提交时自动创建审批通过记录
- 根据节点类型判断是否完成:
- 单人审批(approver):发起人审批后节点完成
- 或签(or_approve):发起人审批后节点完成
- 会签(and_approve):需要所有审批人审批才完成
- 节点完成后自动移动到下一节点或完成审批
- 更新 PROJECT_ISSUES.md 记录问题和解决方案
业务逻辑说明:
- 如果发起人选择自己作为唯一审批人,提交后申请直接完成
- 如果有其他审批人,需要其他审批人继续审批
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-26 09:44:44 +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
7ed456bac1
feat: 重写测试数据脚本,完善审批状态演示数据
...
- 清理旧数据逻辑(删除id > 10的测试数据)
- 用户1发起的订单:审批中、已通过、已拒绝、已撤回(4种状态)
- 待用户1审批的订单:2个(其他用户发起)
- 用户1已审批的订单:1个已通过、1个已拒绝
- 调整审批节点配置,支持不同用户的审批流程
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-26 00:02:04 +08:00
root
2297695ed0
docs: 更新 CLAUDE.md 项目文档
...
- 更新数据库配置(数据库名、容器名)
- 补充审批流程引擎的详细说明和测试数据脚本
- 更新当前开发状态(审批功能、出差申请已完成)
- 添加 Webman 官方依赖包说明
- 添加申请页面完整数据流说明
- 修正数据库连接方式说明
- 添加 User Store 和类型定义注意事项
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-25 23:56:09 +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
27ad5728c9
fix: 移除 bootstrap.php 中对已删除文件的加载
...
- 移除对自定义 Db.php 和 Model.php 的加载
- 这些文件已删除,使用 Webman 官方 support\Db 和 support\Model
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-25 23:05:15 +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
root
be2e56995e
fix: 修复默认审批人和抄送人不显示的问题
...
- 确保在所有执行路径上都设置 defaultLoadedRef
- 将获取的默认数据保存到 sessionStorage
- 移除 useEffect 依赖,只在组件挂载时加载一次
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-25 18:59:23 +08:00
root
ee931e49b7
fix: 修复选择审批人后抄送人消失的问题
...
- 使用 useRef 防止默认审批人/抄送人数据重复加载
- 确保从选择页面返回时,另一类型的数据不受影响
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-25 18:57:56 +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
e3e2843835
fix: 修复审批功能和数据加载问题
...
- BusinessTripService 添加 ApprovalNode use 语句
- 修复 approve 方法中的字段引用错误(flow_id 替代 order_id)
- 修复 approve 方法中的类型引用错误(type 替代 node_type)
- getList 方法添加 approvalOrder 关联加载
- 完善审批逻辑:检查用户是否在当前节点审批人列表中
- 前后端联调测试通过
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-25 18:30:49 +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
eef91a6c83
feat: 添加前后端多语言支持
...
前端:
- 在 API 请求中添加 Accept-Language 头,传递当前语言设置
后端:
- 创建 LanguageMiddleware 中间件,自动检测并设置语言
- 为所有 API 路由添加语言中间件
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-25 18:21:05 +08:00
root
8817effc9a
refactor: 使用官方support\Translation替代自定义Lang类
...
- 创建 config/translation.php 配置文件
- 将翻译文件从 lang/ 移动到 resource/translations/ 目录
- 按照 Symfony Translation 标准重命名文件 (messages.{locale}.php)
- 删除自定义的 app\util\Lang 类
- 使用官方的 trans() 和 locale() 函数
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-25 18:18:52 +08:00
root
2cfca3553c
fix: 移除support命名空间的composer配置,使用官方默认方式
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-25 18:15:53 +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
2d39357cc3
feat: 实现出差申请页面
...
- 创建出差申请表单,包含出差事由、行程明细、审批人选择
- 实现行程明细的增删改功能,支持开始/结束时间、出发地、目的地等
- 添加单程/往返类型选择和交通工具下拉选择
- 实现自动计算行程时长和总时长
- 创建审批人和抄送人选择页面
- 添加前后端API接口定义
- 更新i18n国际化翻译
- 整理开发文档和UI设计图
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-24 23:44:40 +08:00
root
49fa9c3f92
config: add Redis password and fix MySQL password
...
- Update backend/.env: REDIS_PASSWORD=redis_sSJJPb
- Update backend/.env.example: REDIS_PASSWORD=redis_sSJJPb
- Update docker-compose.yml: Add REDIS_PASSWORD and fix DB_PASSWORD to mysql_xEsdPa
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-24 21:30:45 +08:00
root
5aa7825f19
config: update all database references to xserver
...
- Update backend/.env: DB_DATABASE=xserver
- Update backend/.env.example: DB_DATABASE=xserver
- Update docker-compose.yml: DB_DATABASE=xserver
- Update backend/app/util/Db.php: default database=xserver
The old database name 'x_server_mobile' has been fully migrated to 'xserver'.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-24 21:29:45 +08:00
root
6e61d0adc7
feat: add complete database initialization script
...
- Add 008_complete_init.sql with all 10 tables
- Include approval workflow tables:
- approval_flow (审批流程配置表)
- approval_node (审批流程节点表)
- approval_order (审批单表)
- approval_record (审批记录表)
- Include business trip tables:
- business_trip (出差申请表)
- business_trip_itinerary (出差行程明细表)
- Include user_feishu_binding (用户飞书应用绑定表)
All tables use proper UTF-8 encoding with utf8mb4_unicode_ci collation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-24 21:27:49 +08:00
root
be9ae8a0d9
fix: switch to xserver database with UTF-8 data
...
- Change default database from x_server_mobile to xserver
- Add 007_xserver_init.sql initialization script
- Companies data now correctly encoded in UTF-8:
- 合塑 (hesu)
- 新友合 (xinyouhe)
- 派卡 (paika)
- 斯玛特 (simate)
- magic bridge Auto (mbaf)
- Company Feishu apps properly configured
The key fix is to execute SQL directly inside the MySQL container
using heredoc to avoid charset conversion issues during transfer.
Usage:
docker exec 1Panel-mysql-409s mysql -uroot -p'mysql_xEsdPa' --default-character-set=utf8mb4 xserver < 007_xserver_init.sql
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-24 18:56:52 +08:00