Files
hzdyjs/docs/需求文档/人事管理/出国记录情况回执PDF生成功能说明.md
T
2025-10-14 16:48:17 +08:00

8.9 KiB
Raw Blame History

出国记录因私出国(境)情况回执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内容结构:

  1. 附件标题: "附件 6"
  2. 主标题: "杭州第一技师学院教职工因私出国(境)情况回执"
  3. 表格内容(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: 停留天数

温馨提醒(固定内容)

  1. 请自觉遵守我国和当地法律法规,尊重当地民族风俗和宗教信仰,注意人身及财产安全。
  2. 出国(境)期间不准为企业和个人办理经营业务;不准接受外商或住国(境)外中资机构(企业)的资助,不准在任何单位报销出国(境)费用。
  3. 出国(境)时间、天数、目的地、事由等情况有变化的,须在出国(境)前向学院人事(组织)处报备。
  4. 请于回国 10 日内,将出国(境)证件和本回执通过本单位组织人事(管理)部门转交学院人事(组织)处集中保管。
  5. 若有违反《中国共产党纪律处分条例》和出国(境)有关文件规定的,将视情节轻重给予相应处理。

实际行程(留空填写)

本人于______年___月___日至______年___月___日,赴_______________旅游(探亲),在外停留_____天,费用(是□否□)自理。

执纪情况(留空填写)

本人因私出国(境)期间,(是□否□)严格遵守保密纪律、外事纪律,(是□否□)自觉遵守所在国家法律,(是□否□)严格执行国家、省、市、局和学院因私出国(境)管理有关规定,(有□无□)违规违纪行为。出国(境)证件已于___月___日 按规定上缴______统一保管。

(证件编号:_______________)

有关情况说明

(实际行程与申请行程有出入及其他情况的,请简要说明)

申请人意见

本人保证填写信息真实。


                                                签名:
                                                      年   月   日

🔧 依赖配置

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>

✅ 测试验证

测试场景

  1. 正常下载: 有recordId的出国记录
  2. 已通过申请: 无recordId,使用applicationId
  3. 文件名正确性: 包含申请人姓名和日期
  4. 字段自动填充: 申请行程信息正确显示
  5. 中文支持: PDF中文正常显示

测试步骤

  1. 登录系统
  2. 进入"出国申请"菜单
  3. 切换到"出国记录"选项卡
  4. 点击任一记录的"查看"按钮
  5. 在弹窗底部点击"下载因私出国(境)情况回执"
  6. 验证PDF下载成功
  7. 打开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标准

🔄 后续优化建议

  1. 批量下载: 支持选中多条记录批量生成ZIP压缩包
  2. 在线预览: 集成PDF.js实现在线预览功能
  3. 模板配置: 将温馨提醒等固定内容配置化
  4. 水印支持: 添加学院公章或水印
  5. 签名支持: 集成电子签名功能
  6. 历史记录: 记录PDF生成和下载历史

📝 相关文档

  • 需求附件: 附件6 - 因私出国(境)情况回执(纸质表格图片)
  • API文档: 暂无(建议补充到API文档总览)
  • 测试文档: 暂无(建议补充测试用例)
  • 用户手册: 暂无(建议补充操作指南)

文档编写: Cursor AI
编写日期: 2025-01-08
版本号: v1.0
状态: ✅ 已完成并测试通过