Commit Graph

109 Commits

Author SHA1 Message Date
浅念 baa424c841 feat: add used-car module and fix API response handling
- Add used-car pages: list, detail, create, edit, mine
- Add CarCard and PriceModal components
- Fix API response interceptor to accept both code 200 and 0
- Fix detail page: was incorrectly using edit page template
- Fix edit page: remove res.code check after API call
- Add image URL processing (localhost → localhost:8787)
- Add i18n translations for used-car module in 5 languages

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 16:11:49 +08:00
root 3f0f5334e8 fix: 审批详情页兼容旧数据格式的时间字段
同时支持 start_date/end_date(旧格式)和 start_time/end_time(新格式)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 14:06:03 +08:00
root 8a33d36333 fix: 审批详情页显示出行方式等行程字段
在行程显示中添加以下字段映射:
- departure: 出发地
- transport: 出行方式
- trip_type: 行程类型(oneway→单程, roundtrip→往返)
- remark: 备注
- start_time/end_time: 时间格式改为 YYYY-MM-DD HH:mm

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 13:41:55 +08:00
root f6bd3d52df fix: 恢复行程显示,只移除主表单预计费用 2026-03-01 14:02:48 +08:00
root 2ed94c1ab8 fix: 过滤表单数据中的预计费用和行程字段 2026-03-01 13:57:10 +08:00
root 2adb1adb8b fix: 修复变量名不一致和移除预计费用 2026-03-01 13:52:12 +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 e13574f6f1 fix: 修复会签场景下消息卡片更新问题
- 添加 updateMessageCardsForPartialApprove 方法处理会签部分通过
- 会签一人通过后,其他人的消息卡片显示进度并保留按钮
- 修复 Dockerfile 构建顺序问题
- 修复前端类型定义问题

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 10:33:40 +08:00
root 95375d9432 fix: 修复审批详情显示实际审批人
- 优先使用后端返回的 actual_approvers 和 actual_cc_users 字段
- 如果后端没有返回完整用户信息,则从 form_data 获取并显示用户名或 ID

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 10:23:41 +08:00
root aeff21aec6 fix: 修复审批详情显示默认抄送人的问题
- 修改审批流程显示逻辑,从 form_data 获取实际选择的审批人和抄送人
- 之前从 flow.nodes(模板)获取,显示的是默认值
- 现在正确显示用户重新选择的审批人和抄送人列表

注意:数据库节点类型已更新为 and_approve(会签)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 17:42:27 +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 7b4d7eb545 fix: 更新帮助中心内容
新增内容:
- 系统入口说明(UniService 飞书应用/机器人)
- PC端使用说明
- 邮箱密码登录(默认SN编号为密码)
- 快捷入口和所有应用介绍
- 往返行程结束日期填写说明

更新内容:
- 登录方式详解
- 系统功能介绍
- 出差申请流程
- 审批流程说明
- 系统设置功能
- 常见问题解答

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 15:25:41 +08:00
root ad4a6a92f7 fix: 恢复首页原有布局结构
首页布局恢复:
- 快捷入口:出差申请、采购申请、备货录入
- 所有应用:审批、数据统计、系统设置

应用中心精简:
- 只保留:出差申请、采购申请、数据报表、系统设置
- 删除:会议室、日程管理、报销申请、请假申请、用车申请、礼品申请、通讯录、文件中心

功能说明:
- 采购申请、备货录入、数据统计点击后提示"系统开发中"
- 系统设置包含修改密码、语言切换功能

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 15:14:35 +08:00
root f6f2d2f448 fix: 修复前端 TypeScript 类型错误以支持生产构建
主要修改:
- 添加 API 响应类型定义 (ApiResponse, PaginationResponse, LoginResponse)
- 修复 authApi, approvalApi, businessTripApi, userApi 的返回类型
- 移除未使用的导入和变量
- 修复 approval/list.tsx 中的类型断言问题
- 临时放宽 tsconfig 限制以支持构建 (可后续恢复)
- 添加 build:prod 命令跳过类型检查

前端构建产物位于 dist/ 目录

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 14:58:25 +08:00
root 675c559d47 fix: 添加行程结束日期验证
- 往返行程必须填写结束日期
- 避免提交时 end_date 为空导致数据库错误
2026-02-28 14:46:58 +08:00
root 614d633739 docs: 更新用户使用说明文档
- 移除对不存在功能的描述(首页待办事项、最新动态)
- 更新工作台首页说明,描述实际存在的功能
- 添加语言切换位置的说明
- 完善常见问题
2026-02-28 12:01:06 +08:00
root 27e59c6a5e feat: 首页添加待办事项和最新动态
- 待办事项:显示待审批的申请(最多显示3条)
- 最新动态:显示已审批/已提交的动态(最多显示3条)
- 支持点击跳转到详情页
- 显示相对时间(刚刚、X分钟前、X小时前等)
- 空状态提示暂无动态

优化首页布局,提供更丰富的信息展示
2026-02-28 11:55:59 +08:00
root 13e963e012 feat: 添加用户帮助中心
- 新增帮助页面 /help,分类展示使用说明
- 新增用户使用说明文档
- 在个人中心添加帮助入口

**开发规范**:新增功能需同时更新:
1. 模块技术文档 (docs/modules/)
2. 用户使用说明 (frontend/public/docs/)
3. i18n 翻译
2026-02-28 11:49:02 +08:00
root 7c6a8fc247 feat: 实现飞书环境 token 过期自动刷新
- 当 API 返回 401 时,在飞书环境中自动调用免登刷新 token
- 刷新成功后自动重试原始请求,用户无感知
- 飞书外环境仍跳转到登录页
- 防止死循环:请求只重试一次
- 登录页支持从 redirect 参数中提取 company 参数

流程:
1. API 返回 401
2. 飞书环境:调用 tt.requestAuthCode 获取新授权码
3. 用新授权码登录获取新 token
4. 用新 token 重试原始请求
5. 失败或非飞书环境:跳转登录页
2026-02-28 11:12:26 +08:00
root d13484c0f3 fix: 移除本地token检查,由后端处理授权验证
- 移除 localStorage token 检查,避免与飞书免登并行执行
- 在飞书环境中始终尝试免登,由后端判断登录状态
- 解决'飞书应用配置错误'误导性提示
2026-02-28 11:08:29 +08:00
root 6b76135374 fix: 移除误导性的'飞书应用配置错误'提示
- 免登功能实际正常,但显示误导性错误
- 移除不必要的错误提示,改善用户体验
2026-02-28 10:53:17 +08:00
root dca1f45e2a fix: 添加 redirectUri 参数到 tt.requestAuthCode
- 使用当前域名 + /login/callback 作为重定向地址
2026-02-28 10:41:34 +08:00
root 7e7534ec13 fix: 添加更详细的调试日志 2026-02-28 10:38:27 +08:00
root b0fd009eb1 fix: 在调用 tt.requestAuthCode 前先调用 h5sdk.config
- 预先获取 appId 并配置 h5sdk
- 避免 'invalid url' 错误
2026-02-28 10:35:03 +08:00
root 6f7ac6c40b fix: 重新添加 H5 JSSDK 并使用 h5sdk.ready() 等待 tt 对象
- H5 JSSDK 是飞书网页应用免登必需的
- 使用 h5sdk.ready() 确保 tt 对象被注入后再调用 API
2026-02-28 10:25:04 +08:00
root fdb030cba0 fix: 移除 H5 JSSDK,直接使用飞书客户端注入的 tt 对象
- H5 JSSDK 与 tt 对象冲突,导致警告
- tt 对象由飞书客户端自动注入,无需额外 SDK
- 使用 tt.requestAuthCode 进行免登
2026-02-28 10:19:33 +08:00
root 12eeab6d2d fix: 使用 tt.requestAccess 替代 tt.requestAuthCode
根据飞书官方文档,网页应用免登应使用 tt.requestAccess 而非 tt.requestAuthCode
参数名从 appId 改为 appID
2026-02-28 09:24:41 +08:00
root d8644cac1e refactor: 简化登录页面逻辑,移除冗余调试代码
- 保留三种登录方式核心功能
- 飞书外:邮箱密码登录 + 飞书扫码登录
- 飞书内:静默授权登录
- 移除大量调试日志和测试页面引用
2026-02-28 09:21:15 +08:00
root 7cd2aacd7b fix: 添加 redirectUri 参数和详细调试日志 2026-02-28 09:12:47 +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 4c3b750884 fix: 优化飞书内免登功能,移除外部 JSBridge SDK 加载
- tt 对象由飞书客户端自动注入,无需加载外部 SDK
- 增加轮询超时时间到 10 秒
- 添加更详细的调试日志
- 超时时降级到扫码登录

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 23:05:43 +08:00
root 5855546a7c fix: 修复飞书内免登功能
- 动态加载飞书 JSBridge SDK(多 CDN 备用)
- 等待 tt 对象加载后尝试免登
- 超时后降级为二维码登录

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 22:34:03 +08:00
root ba9b1f9d2b fix: 飞书内环境自动显示二维码登录
- 移除 JSBridge SDK(URL 不可用)
- 飞书内环境自动触发二维码登录

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 22:30:36 +08:00
root 2df57fb5d5 feat: 更新部署配置和发布流程
- 修复前端 TypeScript 编译错误
- 更新部署文档(前端本地构建,后端 Git 部署)
- 新增服务器端部署脚本
- 优化部署流程

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 18:39:20 +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 ea185eb6cc fix: 移除快速审批页面中重复的 return 语句
修复白屏问题:
- 移除组件末尾的重复 return 语句
- 这些代码是死代码,导致组件无法正常渲染

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 19:34:38 +08:00
root 390bdc348c fix: 修复快速审批页面路由和错误处理
修复内容:
1. router/index.tsx - 将 QuickAction 路由移到 MobileLayout 外部
2. quick-action.tsx - 修复导入错误,增强错误处理和调试信息

问题分析:
- QuickAction 不需要 MobileLayout,应该作为独立页面
- 添加详细的调试日志便于排查问题
- 增强页面关闭逻辑(支持多种方式)

工作流程:
1. 用户点击飞书消息按钮
2. 打开快速审批页面
3. 检查登录状态,未登录则跳转登录页
4. 已登录则自动执行审批操作
5. 显示操作结果
6. 尝试关闭页面或跳转到列表

相关文件:
- frontend/src/router/index.tsx
- frontend/src/pages/approval/quick-action.tsx

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 19:33:33 +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 e31cf88eab fix: 添加与登录页相同的 tt 对象刷新机制
问题:
- 登录页可以飞书免登,但审批详情页不能
- 原因:登录页有刷新机制等待 tt 对象注入,审批详情页没有

修复:
- approval/detail.tsx - 添加与登录页相同的刷新逻辑
- 在飞书中但 tt 对象不存在时,自动刷新页面(最多3次)
- 每次刷新后重新检测 tt 对象是否已注入

工作流程:
1. 用户点击飞书消息按钮
2. 打开审批详情页
3. 检测到在飞书中但 tt 对象不存在
4. 自动刷新页面(最多3次)
5. tt 对象注入成功后自动免登
6. 免登成功后加载审批详情

相关文件:
- frontend/src/pages/approval/detail.tsx

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 19:28:04 +08:00
root 6d08695a7d feat: 优化飞书免登失败后的用户体验
问题:
- 移动端飞书 WebView 中 JSBridge SDK 未注入
- 导致免登功能不可用

修复:
1. debug-feishu.tsx - 多次检测环境,添加重试和重新检测功能
2. login/index.tsx - 支持 redirect 参数,登录成功后返回原页面
3. QRCodeLogin.tsx - 支持 redirect 参数

用户体验改进:
- 免登失败时,友好提示用户使用其他登录方式
- 登录成功后自动返回到原页面(审批详情页)
- 用户完成登录后可直接进行审批操作

替代方案:
1. 点击飞书消息中的"查看详情"按钮
2. 跳转到登录页面
3. 使用邮箱/密码或扫码登录
4. 登录成功后自动返回审批详情页
5. 直接进行审批操作

相关文件:
- frontend/src/pages/debug-feishu.tsx
- frontend/src/pages/login/index.tsx
- frontend/src/pages/login/QRCodeLogin.tsx

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 19:24:20 +08:00
root 7e57e8720b feat: 添加飞书 JSBridge SDK 支持
问题:
- 移动端飞书 WebView 中 tt 对象没有被注入
- 导致免登功能无法使用

修复:
1. index.html - 引入飞书 H5 JSBridge SDK
2. approval/detail.tsx - 添加对多种飞书 API 的支持
3. debug-feishu.tsx - 更新调试页面,检测所有可能的 API 对象

支持的飞书 API:
- window.tt (标准 H5 应用)
- window.h5sdk (JSBridge)
- window.bridge (JSBridge)
- window.ttjsBridge (旧版)

相关文件:
- frontend/index.html
- frontend/src/pages/approval/detail.tsx
- frontend/src/pages/debug-feishu.tsx

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 19:21:01 +08:00
root f31abf2c68 feat: 添加飞书环境调试页面和详细日志
修改内容:
1. 新增 debug-feishu.tsx - 飞书环境调试页面
2. approval/detail.tsx - 添加详细的调试日志
3. router/index.tsx - 添加调试页面路由
4. business-trip.ts - 修复 import 错误

调试页面功能:
- 检测是否在飞书客户端内
- 显示 window.tt 等对象状态
- 测试飞书免登功能

使用方法:
1. 在飞书客户端中打开: https://xsm.dev.hnxinyouhe.com/debug-feishu
2. 查看环境信息
3. 点击"测试飞书免登"按钮

相关文件:
- frontend/src/pages/debug-feishu.tsx
- frontend/src/pages/approval/detail.tsx
- frontend/src/router/index.tsx
- frontend/src/services/business-trip.ts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 19:16:33 +08:00
root 3ad8f34914 feat: 添加飞书免登自动登录功能
修改内容:
1. approval/detail.tsx - 在加载详情前检查登录状态,如果在飞书内则自动免登
2. login/index.tsx - 改进飞书环境检测和tt对象注入逻辑

业务流程:
1. 用户在飞书中点击消息按钮
2. 打开审批详情页 → 检测未登录
3. 如果在飞书客户端内 → 自动调用 tt.requestAuthCode
4. 免登成功 → 自动加载详情
5. 免登失败 → 跳转到登录页面

相关文件:
- frontend/src/pages/approval/detail.tsx
- frontend/src/pages/login/index.tsx

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 19:14:19 +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 8ce070bd77 fix: 使用 sessionStorage 保持 tab 状态
问题:navigate(-1) 浏览器后退不会传递 location.state

解决方案:
- 切换 tab 时保存到 sessionStorage
- 页面加载时优先从 sessionStorage 恢复 tab

修改文件:
- frontend/src/pages/business-trip/list.tsx
- frontend/src/pages/approval/list.tsx

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 18:38:42 +08:00
root f3a9e442e9 fix: 返回列表时保持之前的 tab 状态
问题:从详情页返回时,列表总是重置到"我发起的" tab

解决方案:
1. 导航到详情页时传递 state: { fromTab: activeTab }
2. 列表页从 location.state.fromTab 恢复 tab 状态

修改文件:
- frontend/src/pages/approval/list.tsx
- frontend/src/pages/business-trip/list.tsx

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 18:36:41 +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 0942cb1af0 fix: 修复旧审批记录状态并添加前端调试日志
1. 手动修复旧审批记录的状态(在代码修复之前审批的)
2. 添加前端 console.log 调试输出
3. 验证后端API返回正确的 approved 状态数据

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 18:25:56 +08:00