feat(web-admin): print OA or/and-sign nodes as per-person text lines

Align PDF flow section with progress UI person-line format.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-07-23 14:16:18 +08:00
1 parent 1e2b903cd7
commit ea4ee3e573
2 files changed
+210 -65

No files matched your search

@@ -50,21 +50,44 @@
</template>
</td>
</tr>
<tr class="oa-print-flow">
<th>审批流程</th>
<td>
<div v-if="!model.flowItems.length" class="oa-print-text">-</div>
<div
v-for="(f, fi) in model.flowItems"
:key="`f-${fi}`"
class="oa-print-flow__item"
<!-- 审批流程:左列 rowspan,每个节点独立一行(含表格线,对齐钉钉导出) -->
<template v-if="model.flowItems.length">
<tr
v-for="(f, fi) in model.flowItems"
:key="`f-${fi}`"
class="oa-print-flow"
>
<th
v-if="fi === 0"
class="oa-print-flow__label"
:rowspan="model.flowItems.length"
>
审批流程
</th>
<td class="oa-print-flow__cell">
<div class="oa-print-flow__row">
<div class="oa-print-flow__left">{{ f.left }}</div>
<div class="oa-print-flow__right">{{ f.right }}</div>
</div>
<div v-if="f.comment" class="oa-print-flow__comment">意见:{{ f.comment }}</div>
</div>
<div v-if="f.personLines?.length" class="oa-print-flow__person-lines">
<div
v-for="(line, li) in f.personLines"
:key="li"
class="oa-print-flow__person-line"
>
{{ line }}
</div>
</div>
<div v-else-if="f.comment" class="oa-print-flow__comment">
意见:{{ f.comment }}
</div>
</td>
</tr>
</template>
<tr v-else class="oa-print-flow">
<th class="oa-print-flow__label">审批流程</th>
<td class="oa-print-flow__cell">
<span class="oa-print-text">-</span>
</td>
</tr>
</tbody>
@@ -102,6 +125,7 @@
.oa-print-page {
position: relative;
width: 794px;
/* 至少一页 A4 高,水印铺满;分页用 EPS 容差,避免略超 297mm 多出空白第二页 */
min-height: 1123px;
padding: 48px 56px 56px;
box-sizing: border-box;
@@ -159,16 +183,25 @@
position: relative;
}
/*
* 边框用 separate + 只画右/下边,避免 collapse 下相邻 1px 叠成粗细不一
*(html2canvas 导出时尤其明显);外框由 table 上/左 + 末行下/末列右拼成。
*/
.oa-print-table {
width: 100%;
border-collapse: collapse;
border-collapse: separate;
border-spacing: 0;
table-layout: fixed;
font-size: 13px;
border-top: 1px solid #1f2329;
border-left: 1px solid #1f2329;
}
.oa-print-table th,
.oa-print-table td {
border: 1px solid #1f2329;
border: none;
border-right: 1px solid #1f2329;
border-bottom: 1px solid #1f2329;
padding: 9px 12px;
vertical-align: middle;
line-height: 1.5;
@@ -191,13 +224,13 @@
white-space: pre-wrap;
}
.oa-print-flow th,
.oa-print-flow td {
vertical-align: top;
.oa-print-flow__label {
vertical-align: middle;
}
.oa-print-flow__item {
padding: 3px 0;
.oa-print-flow__cell {
vertical-align: middle;
padding: 8px 12px;
}
.oa-print-flow__row {
@@ -224,6 +257,18 @@
color: #646a73;
}
.oa-print-flow__person-lines {
margin-top: 6px;
display: grid;
gap: 3px;
}
.oa-print-flow__person-line {
line-height: 1.55;
word-break: break-word;
white-space: pre-wrap;
}
.oa-print-footer {
display: flex;
gap: 28px;