22 KiB
✅ 变更行程管理功能完成报告
📋 项目信息
功能名称: 出国行程变更管理
所属模块: 人事管理
创建时间: 2025-10-13
完成时间: 2025-10-13
文档版本: v1.0
🎯 功能概述
本功能用于对已通过审批的出国申请进行行程变更管理,包括目的地变更、时间变更、行程安排变更等。用户可以提交变更申请,管理员可以对变更申请进行审批。
核心功能
✅ 变更申请管理
- 查询已通过的出国申请(可变更列表)
- 新增行程变更申请
- 查询变更申请列表(分页)
- 查看变更申请详情
- 修改并重新提交已拒绝的变更申请
- 撤回待审核的变更申请
- 删除变更申请
- 导出变更申请列表
✅ 支持的变更类型
- 目的地变更:更改目的地国家
- 时间变更:更改出发/返回日期
- 行程变更:更改具体行程安排
- 组合变更:支持多种变更类型同时申请
📦 交付物清单
1. 前端页面
✅ web/src/views/rs/overseas/itinerary-change.vue
文件位置: /Users/weizzzz/Documents/Cursor/0828CURSOR/all-project/web/src/views/rs/overseas/itinerary-change.vue
页面功能:
- 🔍 搜索查询:支持按申请人、目的地、变更状态筛选
- 📊 列表展示:分页显示变更申请列表
- ➕ 新增申请:选择原申请并填写变更信息
- 👁️ 查看详情:查看变更申请完整信息
- 🔄 重新提交:修改已拒绝的申请并重新提交
- ⏪ 撤回申请:撤回待审核的申请
- 🗑️ 删除申请:删除非已通过状态的申请
页面特点:
- 完全参考出国申请页面布局和风格
- 响应式设计,支持不同屏幕尺寸
- 完整的表单验证(动态必填校验)
- 智能的字段显示/隐藏(根据变更类型)
- 自动计算新出国天数
- 权限控制(v-hasPermi指令)
文件大小: 约520行代码
2. 数据库设计
✅ 数据库表SQL
文件位置: /Users/weizzzz/Documents/Cursor/0828CURSOR/all-project/docs/设计文档/database/rs_overseas_itinerary_change.sql
表名: rs_overseas_itinerary_change
字段统计:
- 核心业务字段:24个
- 标准基础字段:5个(创建者、创建时间、更新者、更新时间、删除标志)
- 多租户字段:1个(tenant_id)
- 总计:30个字段
索引配置:
- 主键索引:
change_id - 业务索引:
idx_application_id- 原申请ID索引idx_applicant_id- 申请人ID索引idx_status- 状态索引idx_tenant_id- 租户ID索引idx_create_time- 创建时间索引
特点:
- ✅ 使用雪花ID作为主键
- ✅ 原申请信息冗余存储(便于历史记录查询)
- ✅ 支持多种变更类型组合
- ✅ 完整的审批流程字段
- ✅ 逻辑删除(deleted字段)
- ✅ 多租户支持(tenant_id字段)
文件大小: 约200行(含注释和示例查询)
✅ 菜单权限配置SQL
文件位置: /Users/weizzzz/Documents/Cursor/0828CURSOR/all-project/docs/设计文档/database/rs_overseas_itinerary_change_menu.sql
菜单结构:
人事管理(105)
└── 变更行程(2050)
└── 变更行程管理(2051)
├── 变更行程查询(2052)- rs:itineraryChange:query
├── 变更行程新增(2053)- rs:itineraryChange:add
├── 变更行程修改(2054)- rs:itineraryChange:edit
├── 变更行程删除(2055)- rs:itineraryChange:remove
├── 变更行程撤回(2056)- rs:itineraryChange:cancel
└── 变更行程导出(2057)- rs:itineraryChange:export
权限标识:
rs:itineraryChange:list- 访问列表页面rs:itineraryChange:query- 查询详情rs:itineraryChange:add- 新增申请rs:itineraryChange:edit- 修改申请rs:itineraryChange:remove- 删除申请rs:itineraryChange:cancel- 撤回申请rs:itineraryChange:export- 导出列表
菜单ID范围: 2050-2057(8个菜单项)
文件大小: 约270行(含详细注释和使用说明)
3. API接口文档
✅ 变更行程管理API文档
文件位置: /Users/weizzzz/Documents/Cursor/0828CURSOR/all-project/docs/开发文档/API/变更行程管理API.md
接口清单:
| 序号 | 接口名称 | 请求方式 | 接口地址 | 权限标识 |
|---|---|---|---|---|
| 1 | 查询已通过的出国申请列表 | GET | /rs/itinerary-change/approvedApplications |
rs:itineraryChange:add |
| 2 | 查询变更申请列表(分页) | GET | /rs/itinerary-change/list |
rs:itineraryChange:list |
| 3 | 查询变更申请详情 | GET | /rs/itinerary-change/{changeId} |
rs:itineraryChange:query |
| 4 | 新增变更申请 | POST | /rs/itinerary-change |
rs:itineraryChange:add |
| 5 | 修改并重新提交 | PUT | /rs/itinerary-change/{changeId} |
rs:itineraryChange:edit |
| 6 | 撤回变更申请 | PUT | /rs/itinerary-change/cancel/{changeId} |
rs:itineraryChange:cancel |
| 7 | 删除变更申请 | DELETE | /rs/itinerary-change/{changeId} |
rs:itineraryChange:remove |
| 8 | 导出变更申请列表 | POST | /rs/itinerary-change/export |
rs:itineraryChange:export |
文档内容:
- 📋 完整的接口定义(请求参数、响应示例)
- 🎯 详细的业务规则说明
- 📊 数据模型定义(Query、Form、VO)
- 💡 后端实现要点
- 🧪 测试用例
- 📌 注意事项
- 🚀 部署清单
文件大小: 约600行(非常详细的接口文档)
🔍 技术架构
前端技术栈
- 框架: Vue 3.5.13 + TypeScript 5.8.3
- UI组件: Element Plus
- 状态管理: Composition API
- 表单验证: Element Plus Form Validation
- 权限控制: v-hasPermi指令
- 动画: animate.css
后端技术栈(待开发)
- 框架: Spring Boot 3.4.6
- ORM: MyBatis-Plus
- 权限: Sa-Token
- ID生成: 雪花ID算法
- 数据库: MySQL 8.0+
数据库设计原则
- ✅ 雪花ID主键
- ✅ 逻辑删除
- ✅ 多租户支持
- ✅ 标准基础字段(创建者、创建时间、更新者、更新时间)
- ✅ 合理的索引配置
📊 业务规则
1. 可发起变更的条件
✅ 出国申请状态必须为"已通过"
✅ 该申请不能存在"待审核"状态的变更申请
✅ 只能变更自己的出国申请
2. 变更类型校验
| 变更类型 | 必填字段 | 说明 |
|---|---|---|
| 目的地变更 | newDestination |
新目的地国家 |
| 时间变更 | newStartDate, newEndDate |
新出发/返回日期,系统自动计算天数 |
| 行程变更 | newItinerary |
新的行程安排 |
| 组合变更 | 对应字段全部必填 | 可同时选择多种变更类型 |
3. 状态流转图
待审核(0) ──审批通过──> 已通过(1)
│
├──审批拒绝──> 已拒绝(2) ──修改重提──> 待审核(0)
│
└──申请人撤回──> 已撤回(3)
4. 操作权限矩阵
| 状态 | 可撤回 | 可删除 | 可修改 | 可导出 |
|---|---|---|---|---|
| 待审核(0) | ✅ | ✅ | ❌ | ✅ |
| 已通过(1) | ❌ | ❌ | ❌ | ✅ |
| 已拒绝(2) | ❌ | ✅ | ✅ | ✅ |
| 已撤回(3) | ❌ | ✅ | ❌ | ✅ |
🎨 界面设计
页面布局
┌─────────────────────────────────────────────────────────┐
│ 搜索区域(可折叠) │
│ ┌────────────────┬────────────────┬────────────────┐ │
│ │ 原申请人 │ 目的地国家 │ 变更状态 │ │
│ └────────────────┴────────────────┴────────────────┘ │
│ [搜索] [重置] │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ 操作按钮区 [🔍] [🔄] │
│ [➕ 新增变更申请] │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ 数据列表(分页) │
│ ┌──────────────────────────────────────────────────┐ │
│ │ 申请人 │ 原目的地 │ 新目的地 │ ... │ 操作 │ │
│ ├──────────────────────────────────────────────────┤ │
│ │ 张三 │ 日本 │ 日本 │ ... │ [👁️][⏪][🗑️] │ │
│ └──────────────────────────────────────────────────┘ │
│ 第1页 共10条 │
└─────────────────────────────────────────────────────────┘
新增/编辑表单
┌─────────────────────────────────────────────────────────┐
│ 新增行程变更申请 [✕] │
├─────────────────────────────────────────────────────────┤
│ 选择原出国申请: [下拉选择框 ▼] │
│ │
│ ━━━━━━━━━━━━ 原申请信息 ━━━━━━━━━━━━ │
│ ┌────────────────┬────────────────┐ │
│ │ 申请人: 张三 │ 部门: 信息部 │ │
│ │ 原目的地: 日本 │ 原事由: 旅游 │ │
│ │ 原出发: 2025-11-01 │ 原返回: 2025-11-10 │ │
│ │ 原天数: 10天 │ │
│ └────────────────┴────────────────┘ │
│ │
│ ━━━━━━━━━━━━ 变更信息 ━━━━━━━━━━━━ │
│ 变更类型: [☑] 目的地变更 [☑] 时间变更 [☑] 行程变更 │
│ │
│ 新目的地: [__________] 新事由: [__________] │
│ 新出发: [日期选择器] 新返回: [日期选择器] 新天数: 11天 │
│ 新行程: │
│ ┌────────────────────────────────────────┐ │
│ │ [详细行程安排...] │ │
│ │ │ │
│ └────────────────────────────────────────┘ │
│ │
│ 变更原因*: │
│ ┌────────────────────────────────────────┐ │
│ │ [必填,最多500字] │ │
│ └────────────────────────────────────────┘ │
│ │
│ 备注: │
│ [选填,最多200字] │
│ │
├─────────────────────────────────────────────────────────┤
│ [提 交] [取 消] │
└─────────────────────────────────────────────────────────┘
✅ 功能特点
1. 智能表单
- ✨ 动态字段显示: 根据选择的变更类型自动显示/隐藏相应字段
- ✨ 动态必填验证: 根据变更类型动态设置字段必填规则
- ✨ 自动计算: 选择日期后自动计算新出国天数
- ✨ 信息预填充: 选择原申请后自动填充原申请信息
2. 完善的权限控制
- 🔒 菜单权限: 控制菜单显示
- 🔒 按钮权限: 控制操作按钮显示(v-hasPermi)
- 🔒 数据权限: 只能查看和操作自己的数据
3. 友好的用户体验
- 👍 状态标签: 不同状态使用不同颜色标签
- 👍 操作提示: 重要操作有二次确认
- 👍 加载状态: 数据加载时显示loading
- 👍 响应式布局: 适配不同屏幕尺寸
4. 完整的业务流程
- 📝 新增: 选择原申请 → 填写变更信息 → 提交审批
- 🔄 修改: 根据拒绝原因修改 → 重新提交
- ⏪ 撤回: 待审核状态可撤回
- 🗑️ 删除: 非已通过状态可删除
🧪 测试建议
1. 功能测试
测试用例1: 新增变更申请
前置条件:
- 用户有至少一个"已通过"的出国申请
- 用户有
rs:itineraryChange:add权限
测试步骤:
- 点击"新增变更申请"按钮
- 选择一个已通过的出国申请
- 验证原申请信息是否正确填充
- 勾选"时间变更"
- 选择新的出发和返回日期
- 验证新出国天数是否自动计算
- 填写变更原因
- 点击"提交"
预期结果:
- ✅ 提交成功提示
- ✅ 对话框关闭
- ✅ 列表刷新,显示新增的记录
- ✅ 新增记录状态为"待审核"
测试用例2: 撤回待审核的申请
前置条件:
- 列表中有至少一条"待审核"的变更申请
- 用户有
rs:itineraryChange:cancel权限
测试步骤:
- 找到一条"待审核"的记录
- 点击"撤回"按钮
- 在弹出框中输入撤回原因
- 点击"确定"
预期结果:
- ✅ 撤回成功提示
- ✅ 列表刷新
- ✅ 该记录状态变为"已撤回"
测试用例3: 修改并重新提交已拒绝的申请
前置条件:
- 列表中有至少一条"已拒绝"的变更申请
- 用户有
rs:itineraryChange:edit权限
测试步骤:
- 找到一条"已拒绝"的记录
- 点击"重新提交"按钮
- 表单弹出并自动填充原数据
- 根据审批意见修改内容
- 点击"提交"
预期结果:
- ✅ 提交成功提示
- ✅ 列表刷新
- ✅ 该记录状态重置为"待审核"
2. 边界测试
- ⚠️ 不选择变更类型直接提交
- ⚠️ 选择时间变更但不填写日期
- ⚠️ 变更原因超过500字
- ⚠️ 同时选择多种变更类型
- ⚠️ 重复提交(同一个申请多次变更)
3. 权限测试
- 🔒 无权限用户访问页面(应跳转或提示)
- 🔒 无新增权限时"新增"按钮不显示
- 🔒 无撤回权限时"撤回"按钮不显示
- 🔒 用户只能看到自己的变更申请
🚀 部署清单
数据库部署
-
执行数据库表创建脚本
source docs/设计文档/database/rs_overseas_itinerary_change.sql -
执行菜单权限配置脚本
source docs/设计文档/database/rs_overseas_itinerary_change_menu.sql -
为相应角色分配菜单权限
-- 根据实际角色ID执行 INSERT INTO sys_role_menu VALUES (角色ID, 2050); INSERT INTO sys_role_menu VALUES (角色ID, 2051); -- ... 更多权限
后端部署
待开发文件清单:
- 实体类:
RsOverseasItineraryChange.java - Mapper接口:
ItineraryChangeMapper.java - Mapper XML:
ItineraryChangeMapper.xml - Service接口:
IItineraryChangeService.java - Service实现:
ItineraryChangeServiceImpl.java - Controller:
ItineraryChangeController.java - VO类:
ItineraryChangeVO.java - Form类:
ItineraryChangeForm.java - Query类:
ItineraryChangeQuery.java
参考实现:
- 参考
rs/overseas/application包下的出国申请模块 - 遵循项目规范:
.cursor/cursorrules-backend.md
前端部署
已完成:
- ✅ 页面组件:
web/src/views/rs/overseas/itinerary-change.vue
待开发:
- API文件:
web/src/api/rs/itinerary-change.ts
部署步骤:
- 确认前端页面文件已存在
- 创建API文件(定义接口方法)
- 配置路由(菜单配置后自动生成)
- 本地测试
- 打包部署
📌 后续开发建议
优先级1(核心功能)
- 后端API开发: 按照API文档实现8个接口
- 前端API对接: 创建
itinerary-change.ts文件 - 功能测试: 完整流程测试
优先级2(增强功能)
- 审批流程: 集成Warm-Flow工作流
- 消息通知: 审批结果通知申请人
- 数据统计: 变更申请统计图表
- 批量操作: 批量导出、批量删除
优先级3(体验优化)
- 审批历史: 显示变更申请的审批记录
- 附件上传: 支持上传变更相关附件
- 对比视图: 原申请vs新申请对比展示
- 移动端适配: H5页面开发
📖 相关文档
已创建文档
- 前端页面:
web/src/views/rs/overseas/itinerary-change.vue - 数据库表:
docs/设计文档/database/rs_overseas_itinerary_change.sql - 菜单配置:
docs/设计文档/database/rs_overseas_itinerary_change_menu.sql - API文档:
docs/开发文档/API/变更行程管理API.md - 完成报告:
✅变更行程管理功能完成报告.md(本文档)
参考文档
- 出国申请页面:
web/src/views/rs/overseas/index.vue - 前端开发规范:
.cursor/cursorrules-frontend.md - 后端开发规范:
.cursor/cursorrules-backend.md - 数据库规范:
docs/设计文档/database/mysql-database-standard.md
💡 开发要点
前端开发要点
- 组件复用: 参考出国申请页面的组件和布局
- 表单验证: 使用Element Plus的表单验证规则
- 权限控制: 使用v-hasPermi指令控制按钮显示
- 状态管理: 使用reactive管理组件状态
- TypeScript: 完整的类型定义
后端开发要点
- 雪花ID: 使用IdUtils生成主键
- 权限注解: 每个接口添加@SaCheckPermission
- 数据权限: 查询时添加applicant_id条件
- 逻辑删除: 使用MyBatis-Plus的逻辑删除功能
- 多租户: 所有查询添加tenant_id条件
- 状态校验: 操作前校验当前状态是否允许
数据库开发要点
- 雪花ID主键:
bigint(20)类型 - 逻辑删除:
deleted字段,默认0 - 多租户:
tenant_id字段,默认'000000' - 索引优化: 为常用查询字段建立索引
- 字段冗余: 原申请信息冗余存储
🎉 总结
本次开发完成了"变更行程管理"功能的完整设计和前端实现,包括:
✅ 已完成
- 前端页面: 完整的Vue 3 + TypeScript页面,约520行代码
- 数据库设计: 详细的表结构设计,包含30个字段和5个索引
- 菜单权限: 完整的菜单树和8个权限点配置
- API文档: 详细的8个接口定义和实现指南
- 技术文档: 完整的开发文档和部署清单
📋 待开发
- 后端API: 8个RESTful接口(约500行代码)
- 前端API: TypeScript接口定义文件(约100行代码)
- 单元测试: Service层和Controller层测试
- 集成测试: 完整业务流程测试
📊 工作量评估
| 模块 | 已完成 | 待完成 | 预计工时 |
|---|---|---|---|
| 需求分析 | ✅ 100% | - | - |
| 数据库设计 | ✅ 100% | - | - |
| 前端开发 | ✅ 100% | - | - |
| 后端开发 | ⏳ 0% | 100% | 4小时 |
| API对接 | ⏳ 0% | 100% | 1小时 |
| 测试 | ⏳ 0% | 100% | 2小时 |
| 文档 | ✅ 100% | - | - |
| 总计 | 60% | 40% | 7小时 |
🚀 下一步行动
- 立即开始: 后端Controller开发
- 同步进行: 前端API文件创建
- 联调测试: 前后端联调
- 部署上线: 生产环境部署
📞 联系方式
开发团队: 校园管理系统开发组
技术支持: 请查阅项目文档或联系开发负责人
文档维护: 本文档将随功能迭代持续更新
最后更新: 2025-10-13 15:30
文档版本: v1.0
状态: ✅ 设计完成,待后端开发
祝开发顺利! 🎊