Files
hzdyjs/✅变更行程管理功能完成报告.md
T
2025-10-14 16:41:19 +08:00

22 KiB
Raw Blame History

✅ 变更行程管理功能完成报告

📋 项目信息

功能名称: 出国行程变更管理
所属模块: 人事管理
创建时间: 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权限

测试步骤:

  1. 点击"新增变更申请"按钮
  2. 选择一个已通过的出国申请
  3. 验证原申请信息是否正确填充
  4. 勾选"时间变更"
  5. 选择新的出发和返回日期
  6. 验证新出国天数是否自动计算
  7. 填写变更原因
  8. 点击"提交"

预期结果:

  • ✅ 提交成功提示
  • ✅ 对话框关闭
  • ✅ 列表刷新,显示新增的记录
  • ✅ 新增记录状态为"待审核"

测试用例2: 撤回待审核的申请

前置条件:

  • 列表中有至少一条"待审核"的变更申请
  • 用户有rs:itineraryChange:cancel权限

测试步骤:

  1. 找到一条"待审核"的记录
  2. 点击"撤回"按钮
  3. 在弹出框中输入撤回原因
  4. 点击"确定"

预期结果:

  • ✅ 撤回成功提示
  • ✅ 列表刷新
  • ✅ 该记录状态变为"已撤回"

测试用例3: 修改并重新提交已拒绝的申请

前置条件:

  • 列表中有至少一条"已拒绝"的变更申请
  • 用户有rs:itineraryChange:edit权限

测试步骤:

  1. 找到一条"已拒绝"的记录
  2. 点击"重新提交"按钮
  3. 表单弹出并自动填充原数据
  4. 根据审批意见修改内容
  5. 点击"提交"

预期结果:

  • ✅ 提交成功提示
  • ✅ 列表刷新
  • ✅ 该记录状态重置为"待审核"

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

部署步骤:

  1. 确认前端页面文件已存在
  2. 创建API文件(定义接口方法)
  3. 配置路由(菜单配置后自动生成)
  4. 本地测试
  5. 打包部署

📌 后续开发建议

优先级1(核心功能)

  1. 后端API开发: 按照API文档实现8个接口
  2. 前端API对接: 创建itinerary-change.ts文件
  3. 功能测试: 完整流程测试

优先级2(增强功能)

  1. 审批流程: 集成Warm-Flow工作流
  2. 消息通知: 审批结果通知申请人
  3. 数据统计: 变更申请统计图表
  4. 批量操作: 批量导出、批量删除

优先级3(体验优化)

  1. 审批历史: 显示变更申请的审批记录
  2. 附件上传: 支持上传变更相关附件
  3. 对比视图: 原申请vs新申请对比展示
  4. 移动端适配: H5页面开发

📖 相关文档

已创建文档

  1. 前端页面: web/src/views/rs/overseas/itinerary-change.vue
  2. 数据库表: docs/设计文档/database/rs_overseas_itinerary_change.sql
  3. 菜单配置: docs/设计文档/database/rs_overseas_itinerary_change_menu.sql
  4. API文档: docs/开发文档/API/变更行程管理API.md
  5. 完成报告: ✅变更行程管理功能完成报告.md(本文档)

参考文档

  1. 出国申请页面: web/src/views/rs/overseas/index.vue
  2. 前端开发规范: .cursor/cursorrules-frontend.md
  3. 后端开发规范: .cursor/cursorrules-backend.md
  4. 数据库规范: docs/设计文档/database/mysql-database-standard.md

💡 开发要点

前端开发要点

  1. 组件复用: 参考出国申请页面的组件和布局
  2. 表单验证: 使用Element Plus的表单验证规则
  3. 权限控制: 使用v-hasPermi指令控制按钮显示
  4. 状态管理: 使用reactive管理组件状态
  5. TypeScript: 完整的类型定义

后端开发要点

  1. 雪花ID: 使用IdUtils生成主键
  2. 权限注解: 每个接口添加@SaCheckPermission
  3. 数据权限: 查询时添加applicant_id条件
  4. 逻辑删除: 使用MyBatis-Plus的逻辑删除功能
  5. 多租户: 所有查询添加tenant_id条件
  6. 状态校验: 操作前校验当前状态是否允许

数据库开发要点

  1. 雪花ID主键: bigint(20)类型
  2. 逻辑删除: deleted字段,默认0
  3. 多租户: tenant_id字段,默认'000000'
  4. 索引优化: 为常用查询字段建立索引
  5. 字段冗余: 原申请信息冗余存储

🎉 总结

本次开发完成了"变更行程管理"功能的完整设计和前端实现,包括:

✅ 已完成

  1. 前端页面: 完整的Vue 3 + TypeScript页面,约520行代码
  2. 数据库设计: 详细的表结构设计,包含30个字段和5个索引
  3. 菜单权限: 完整的菜单树和8个权限点配置
  4. API文档: 详细的8个接口定义和实现指南
  5. 技术文档: 完整的开发文档和部署清单

📋 待开发

  1. 后端API: 8个RESTful接口(约500行代码)
  2. 前端API: TypeScript接口定义文件(约100行代码)
  3. 单元测试: Service层和Controller层测试
  4. 集成测试: 完整业务流程测试

📊 工作量评估

模块 已完成 待完成 预计工时
需求分析 ✅ 100% - -
数据库设计 ✅ 100% - -
前端开发 ✅ 100% - -
后端开发 ⏳ 0% 100% 4小时
API对接 ⏳ 0% 100% 1小时
测试 ⏳ 0% 100% 2小时
文档 ✅ 100% - -
总计 60% 40% 7小时

🚀 下一步行动

  1. 立即开始: 后端Controller开发
  2. 同步进行: 前端API文件创建
  3. 联调测试: 前后端联调
  4. 部署上线: 生产环境部署

📞 联系方式

开发团队: 校园管理系统开发组
技术支持: 请查阅项目文档或联系开发负责人
文档维护: 本文档将随功能迭代持续更新


最后更新: 2025-10-13 15:30
文档版本: v1.0
状态: ✅ 设计完成,待后端开发


祝开发顺利! 🎊