8.9 KiB
8.9 KiB
出国记录因私出国(境)情况回执PDF生成功能说明
📋 功能概述
在出国记录详情弹窗中新增"因私出国(境)情况回执"PDF下载功能,供申请人在申请通过后下载并线下填写实际出国相关情况说明。
🎯 业务需求
需求背景
- 申请人提交出国申请并通过审批后,需要提供一个标准化的情况回执表
- 该回执用于记录实际出国情况,包括实际行程、执纪情况等
- 部分字段(如申请行程)需要根据申请数据自动填充
功能位置
- 菜单路径: 出国申请 → 出国记录选项卡
- 触发方式: 点击列表中的"查看"按钮 → 详情弹窗底部的"下载因私出国(境)情况回执"按钮
🏗️ 技术实现
1. 后端实现
1.1 PDF生成工具类
文件位置: backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/util/OverseasReceiptPdfUtil.java
核心功能:
- 使用iText 5.5.13.3生成PDF文档
- 支持中文字体(STSong-Light)
- 严格按照附件6表格格式生成
主要方法:
public static byte[] generateReceiptPdf(RsOverseasRecordVo record)
PDF内容结构:
- 附件标题: "附件 6"
- 主标题: "杭州第一技师学院教职工因私出国(境)情况回执"
- 表格内容(2列布局):
- 申请行程(自动填充)
- 温馨提醒(5条固定内容)
- 实际行程(留空,供线下填写)
- 执纪情况(留空,供线下填写)
- 有关情况说明(留空,供线下填写)
- 申请人意见(留空,供线下填写)
1.2 Controller接口
文件位置: backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/controller/RsOverseasRecordController.java
接口定义:
@GetMapping("/downloadReceipt/{recordId}")
@SaCheckPermission("rs:overseas:query")
@Log(title = "下载出国情况回执", businessType = BusinessType.EXPORT)
public void downloadReceipt(@PathVariable Long recordId, HttpServletResponse response)
接口说明:
- 请求方式: GET
- 路径:
/rs/overseas/record/downloadReceipt/{recordId} - 权限要求:
rs:overseas:query - 返回类型: application/pdf
- 文件名格式:
因私出国情况回执_{姓名}_{日期}.pdf
2. 前端实现
2.1 详情弹窗按钮
文件位置: web/src/views/rs/overseas/index.vue
UI位置:
<template #footer v-if="state.viewData && 'recordId' in state.viewData">
<div class="dialog-footer">
<el-button type="primary" @click="handleDownloadReceipt(state.viewData)" icon="Download">
下载因私出国(境)情况回执
</el-button>
<el-button @click="state.viewDialog.visible = false">关闭</el-button>
</div>
</template>
2.2 下载方法实现
const handleDownloadReceipt = async (row: OverseasRecordVO) => {
// 1. 获取recordId(支持记录ID或申请ID)
// 2. 调用后端API下载PDF
// 3. 解析响应头获取文件名
// 4. 创建Blob并触发浏览器下载
}
技术要点:
- 使用原生fetch API调用后端接口
- 自动携带Authorization Token和clientid
- 支持从已通过申请(无recordId)下载
- 提供下载进度提示
📄 PDF内容模板
申请行程(自动填充)
{申请人姓名}同志,申请于{出发日期}至{返回日期},赴{前往国家}旅游(探亲),在外停留{天数}天,费用自理。
数据来源:
applicantName: 申请人姓名actualStartDate: 出发日期(格式:yyyy年MM月dd日)actualEndDate: 返回日期(格式:yyyy年MM月dd日)destinationCountry: 前往国家exitReason: 出境事由(旅游/探亲)actualDuration: 停留天数
温馨提醒(固定内容)
- 请自觉遵守我国和当地法律法规,尊重当地民族风俗和宗教信仰,注意人身及财产安全。
- 出国(境)期间不准为企业和个人办理经营业务;不准接受外商或住国(境)外中资机构(企业)的资助,不准在任何单位报销出国(境)费用。
- 出国(境)时间、天数、目的地、事由等情况有变化的,须在出国(境)前向学院人事(组织)处报备。
- 请于回国 10 日内,将出国(境)证件和本回执通过本单位组织人事(管理)部门转交学院人事(组织)处集中保管。
- 若有违反《中国共产党纪律处分条例》和出国(境)有关文件规定的,将视情节轻重给予相应处理。
实际行程(留空填写)
本人于______年___月___日至______年___月___日,赴_______________旅游(探亲),在外停留_____天,费用(是□否□)自理。
执纪情况(留空填写)
本人因私出国(境)期间,(是□否□)严格遵守保密纪律、外事纪律,(是□否□)自觉遵守所在国家法律,(是□否□)严格执行国家、省、市、局和学院因私出国(境)管理有关规定,(有□无□)违规违纪行为。出国(境)证件已于___月___日 按规定上缴______统一保管。
(证件编号:_______________)
有关情况说明
(实际行程与申请行程有出入及其他情况的,请简要说明)
申请人意见
本人保证填写信息真实。
签名:
年 月 日
🔧 依赖配置
Maven依赖(已配置)
<!-- iText PDF生成库 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.3</version>
</dependency>
<!-- iText亚洲字体支持包 - 支持中文 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
✅ 测试验证
测试场景
- 正常下载: 有recordId的出国记录
- 已通过申请: 无recordId,使用applicationId
- 文件名正确性: 包含申请人姓名和日期
- 字段自动填充: 申请行程信息正确显示
- 中文支持: PDF中文正常显示
测试步骤
- 登录系统
- 进入"出国申请"菜单
- 切换到"出国记录"选项卡
- 点击任一记录的"查看"按钮
- 在弹窗底部点击"下载因私出国(境)情况回执"
- 验证PDF下载成功
- 打开PDF检查内容格式和字段填充
预期结果
- ✅ PDF成功下载到本地
- ✅ 文件名格式正确:
因私出国情况回执_姓名_20250108.pdf - ✅ PDF内容格式与附件6一致
- ✅ 申请行程字段自动填充正确
- ✅ 中文字体显示正常
- ✅ 表格布局清晰,边框完整
- ✅ 留空字段为空白,供线下填写
📊 数据流程
用户操作
↓
前端: index.vue
↓ handleDownloadReceipt()
后端: RsOverseasRecordController
↓ downloadReceipt()
Service: IRsOverseasRecordService
↓ queryById(recordId)
工具类: OverseasReceiptPdfUtil
↓ generateReceiptPdf(record)
iText PDF生成
↓
返回PDF字节流
↓
浏览器下载文件
🎨 UI设计
按钮样式
- 类型: Primary按钮
- 图标: Download图标
- 文本: "下载因私出国(境)情况回执"
- 位置: 记录详情弹窗底部,"关闭"按钮左侧
提示信息
- 开始下载: "正在生成PDF,请稍候..."(info提示)
- 下载成功: "PDF下载成功!"(success提示)
- 下载失败: "下载失败: {错误信息}"(error提示)
📌 注意事项
1. 权限控制
- 使用与查看记录相同的权限:
rs:overseas:query - 仅在记录详情弹窗中显示下载按钮
- 申请详情弹窗不显示该按钮
2. 数据兼容性
- 支持已创建的出国记录(有recordId)
- 支持已通过审批的申请(无recordId,使用applicationId)
- 字段为空时显示下划线占位符
3. 字体支持
- 优先使用STSong-Light字体
- 备选方案:STSongStd-Light
- 如果字体加载失败,抛出ServiceException
4. 文件名编码
- 使用UTF-8编码
- URL编码处理中文字符
- 符合RFC 5987标准
🔄 后续优化建议
- 批量下载: 支持选中多条记录批量生成ZIP压缩包
- 在线预览: 集成PDF.js实现在线预览功能
- 模板配置: 将温馨提醒等固定内容配置化
- 水印支持: 添加学院公章或水印
- 签名支持: 集成电子签名功能
- 历史记录: 记录PDF生成和下载历史
📝 相关文档
- 需求附件: 附件6 - 因私出国(境)情况回执(纸质表格图片)
- API文档: 暂无(建议补充到API文档总览)
- 测试文档: 暂无(建议补充测试用例)
- 用户手册: 暂无(建议补充操作指南)
文档编写: Cursor AI
编写日期: 2025-01-08
版本号: v1.0
状态: ✅ 已完成并测试通过