日期:2026-07-15
范围:web-admin· OA 审批「我发起的」「抄送我的」
状态:已确认(印章对齐 brainstorm Demo 第 4 版)
在「我发起的」「抄送我的」列表操作列增加「打印」按钮:点击后拉取审批实例详情,在前端用钉钉风格 HTML 模板渲染,经 html2canvas + jspdf 直接下载 PDF(不弹出系统打印对话框)。
http(s) URL| 页面 | 文件 | 行为 |
|---|---|---|
| 我发起的 | web-admin/src/views/oa-approval/mine/index.vue |
操作列增加「打印」;实例 id 取 row.id |
| 抄送我的 | web-admin/src/views/oa-approval/cc/index.vue |
同上;实例 id 取 row.instanceId(与现有「查看」一致) |
按钮规则:
<el-icon><Printer /></el-icon>loading 防重复;失败 ElMessage.error文件名:{发起人姓名}提交的{流程名称}.pdf(缺省则用「审批单」)。
页面结构自上而下:
appName 优先,否则 title)安徽中科兴皖医学研究有限公司创建时间:YYYY-MM-DD(取实例 createTime 的日期部分)打印时间(导出瞬间)、打印人(当前登录用户昵称)第 N 页(多页时 jspdf 切片后写入)纸张:A4 竖向,内容宽约 178mm(左右边距约 16mm)。
| 行 | 来源 |
|---|---|
| 审批编号 | detail.id |
| 创建人 | detail.initiatorUserName |
| 创建人部门 | detail.initiatorDeptName;若详情暂无该字段,前端尽量用已有扩展字段,否则显示 -(本期不强制改后端,可在实现时若接口已有则用) |
| 动态表单行 | formSchemaJson.rule 字段 title/label + formDataJson[field] |
| 附件 | schema 中类型为 upload/attachment 的字段;值为 URL 字符串或 URL 数组,逗号分隔 URL 按条拆分 |
| 审批流程 | detail.progress(与详情页 OaProgressChain 同源) |
审批流程单元格内每条:
【节点名】 处理人 状态文案,右侧时间;有意见则次行展示 意见:…抄送姓名1,姓名2 + 时间statusText 映射一致(已同意 / 已拒绝 / 已打回等)金额类字段若原始值为数字,可原样输出;不强制本期做中文大写金额(钉钉有则更好,YAGNI:无现成工具则跳过)。
视觉权威:.superpowers/brainstorm/*/content/dingtalk-pdf-v4-dingtalk-stamp.html 中的 .oa-stamp。
结构(DOM):
<div class="oa-stamp ok" aria-label="已通过">
<div class="outer"></div>
<div class="arc-top"></div>
<div class="arc-bottom"></div>
<div class="label-top">OA审批</div>
<div class="main">已通过</div>
<div class="label-bottom">approval</div>
</div>
要点:
.chars-3 略缩小)#3ec9a8 系薄荷绿;opacity ~0.88;rotate(-18deg)detail.status |
class | 中心文案 |
|---|---|---|
completed / approved / done |
ok |
已通过 |
running / pending |
run |
审批中 |
rejected |
rej |
已拒绝 |
returned |
ret |
已打回 |
cancelled |
can |
已撤销 |
| 其他 | run |
审批中 |
所有状态均盖章(非仅已通过)。
| 路径 | 职责 |
|---|---|
web-admin/src/components/oa-approval/OaApprovalPrintSheet.vue |
钉钉风格打印 DOM(标题、表、印章、水印、页脚);props 接收已组装的 printModel |
web-admin/src/utils/oa-approval-print.ts |
组装 printModel、挂载离屏节点、调用 html2canvas/jspdf、触发下载、清理 |
(可选)web-admin/src/utils/oa-approval-print-fields.ts |
从 schema + formData 抽出打印行,保持 print.ts 精简 |
列表点击「打印」
→ fetchOaInstanceDetail(id)
→ buildOaPrintModel(detail, { printerName, printTime })
→ 离屏挂载 <OaApprovalPrintSheet />
→ html2canvas(el, { scale: 2, useCORS: true, backgroundColor: '#ffffff' })
→ 将 canvas 按 A4 高度切片写入 jsPDF
→ pdf.save(filename)
→ 卸载离屏节点
依赖(web-admin):新增 html2canvas、jspdf(pnpm add)。
position:fixed; left:-99999px; top:0; 或同等不可见但可布局的尺寸(固定 A4 宽度 px)<table>)formDataJson 键值兜底instanceId 能导出dingtalk-pdf-v4-dingtalk-stamp.html(印章锁定版)GET /web/admin/oa-approval/instances/{id} → fetchOaInstanceDetailprogress 字段,同 OaProgressChain