diff --git a/apps/web/src/pages/ReportPage.vue b/apps/web/src/pages/ReportPage.vue
index ce3c3af..28a54d2 100644
--- a/apps/web/src/pages/ReportPage.vue
+++ b/apps/web/src/pages/ReportPage.vue
@@ -1,16 +1,18 @@
@@ -92,54 +107,61 @@ watch(reports, (list) => {
还没有检查结果
-
报告对应最近一次检查。先上传投标文件并检查。
+
报告按最近一次检查生成。先上传投标文件并检查。
去检查
-
-
-
-
还没有导出过报告
-
在右边选好内容后导出,生成的 PDF 会在这里显示。
-
-
+
+
+
+
+
+
+
+
还没有生成过报告
+
在右边选好内容,点「生成报告」,生成的 PDF 会在这里显示,可以下载。
+
+
+
+
@@ -153,18 +175,7 @@ watch(reports, (list) => {
gap: var(--gap-card);
align-items: start;
}
-.preview {
- min-height: 70vh;
- overflow: hidden;
-}
-.preview iframe {
- display: block;
- width: 100%;
- height: calc(100vh - 220px);
- min-height: 70vh;
- border: 0;
-}
-.preview .empty {
+.split-doc .empty {
padding: var(--sp-8) var(--card-x);
}
.rp-side {
@@ -220,16 +231,11 @@ watch(reports, (list) => {
line-height: var(--lh-caption);
color: var(--text-secondary);
}
-.exports .new {
- margin-left: var(--sp-2);
- padding: 0 6px;
- border-radius: var(--radius-tag);
- background: var(--c-n100);
- font-size: var(--fs-caption);
- font-weight: var(--fw-regular);
-}
.exports li.cur b {
text-decoration: underline;
text-underline-offset: 3px;
}
+.card-h .fig {
+ font-weight: var(--fw-medium);
+}
diff --git a/apps/web/src/pages/ResultsPage.vue b/apps/web/src/pages/ResultsPage.vue
index 7444c7b..7d4f0af 100644
--- a/apps/web/src/pages/ResultsPage.vue
+++ b/apps/web/src/pages/ResultsPage.vue
@@ -12,7 +12,7 @@
* 「提示」可以批量确认无误;每个问题可以反馈判断有误;从工作台带 ?f=问题编号 进来时选中那一条。
*/
import { unwrap } from "@bid-doctor/api-client";
-import { ChevronDown, ChevronRight, Download } from "@lucide/vue";
+import { ChevronDown, ChevronRight, FileText } from "@lucide/vue";
import { useQueryClient } from "@tanstack/vue-query";
import { computed, onBeforeUnmount, onMounted, ref, watch, watchEffect } from "vue";
import { RouterLink, useRoute } from "vue-router";
@@ -390,7 +390,7 @@ const errorText = computed(() => {
重新检查
- 导出报告
+ 生成报告
还有 {{ p.readiness.open_fatal_count }} 项致命问题待处理,报告会如实列出
diff --git a/apps/web/src/styles/app.css b/apps/web/src/styles/app.css
index d3ab645..1dbde8c 100644
--- a/apps/web/src/styles/app.css
+++ b/apps/web/src/styles/app.css
@@ -74,7 +74,7 @@ a.me:hover{background:var(--side-hover)}a.me[aria-current="page"]{background:var
.ph .facts{display:flex;gap:var(--sp-8);margin:0 0 0 auto;flex:none}
.ph .facts > div{display:flex;flex-direction:column;gap:2px}
.ph .facts dt{font-size:var(--fs-caption);line-height:var(--lh-caption);color:var(--text-secondary)}
-.ph .facts dd{display:flex;align-items:center;gap:6px;min-height:var(--lh-body);margin:0;white-space:nowrap}
+.ph .facts dd{display:flex;align-items:center;gap:6px;height:var(--control-h-sm);margin:0;white-space:nowrap} /* 各列取值同高(状态列有按钮),值都在同一条中线上 */
.ph .tabs{margin-top:var(--sp-3)}
.ph + .content{padding-top:var(--sp-5)}
/* 左右布局(查标、概览,同读标页):左边内容随页面滚动,右边原文区贴住视口、自己翻页 */
diff --git a/docs/architecture/openapi.yaml b/docs/architecture/openapi.yaml
index 194f9de..696489c 100644
--- a/docs/architecture/openapi.yaml
+++ b/docs/architecture/openapi.yaml
@@ -3186,7 +3186,7 @@ components:
page_count: { type: integer }
sha256: { type: string }
template_version: { type: string }
- open_fatal_at_export: { type: integer, description: 导出时还没处理的致命问题数 }
+ open_fatal_at_export: { type: integer, description: 生成时还没处理的致命问题数 }
generated_by: { $ref: '#/components/schemas/UserRef' }
created_at: { $ref: '#/components/schemas/Timestamp' }
diff --git a/packages/api-client/src/schema.d.ts b/packages/api-client/src/schema.d.ts
index 1e275ea..28294c7 100644
--- a/packages/api-client/src/schema.d.ts
+++ b/packages/api-client/src/schema.d.ts
@@ -2319,7 +2319,7 @@ export interface components {
page_count: number;
sha256?: string;
template_version: string;
- /** @description 导出时还没处理的致命问题数 */
+ /** @description 生成时还没处理的致命问题数 */
open_fatal_at_export?: number;
generated_by: components["schemas"]["UserRef"];
created_at: components["schemas"]["Timestamp"];
diff --git a/server/src/bid_doctor/report/template.py b/server/src/bid_doctor/report/template.py
index 7ffff29..4d3ac7c 100644
--- a/server/src/bid_doctor/report/template.py
+++ b/server/src/bid_doctor/report/template.py
@@ -1,7 +1,7 @@
"""检查报告的 HTML(设计规范 §7.17,原型 report.html):纯函数,输入整理好的数据,输出正文、页眉、页脚三段 HTML,
由 Gotenberg 的 Chromium 转成 PDF(A4 竖版,页边距 20mm,页眉页脚每页重复、页码自动生成)。
-- 首页:项目信息、投标文件版本、检查依据、检查时间、规则版本、导出人和时间、**检查覆盖范围**(查了 / 没查)、
+- 首页:项目信息、投标文件版本、检查依据、检查时间、规则版本、生成人和时间、**检查覆盖范围**(查了 / 没查)、
汇总、免责声明;
- 问题明细:级别、问题、说明、出处(可选)、处理状态和处理人;
- 附录:需人工核对的条目和勾选结果(可选);
@@ -19,11 +19,11 @@ from pathlib import Path
from typing import Any
from zoneinfo import ZoneInfo
-TEMPLATE_VERSION = "2026.11-v3" # v2:资质问题的「依据:资质库记录」;v3:出处不重复写文件名
+TEMPLATE_VERSION = "2026.11-v4" # v2:资质问题的「依据:资质库记录」;v3:出处不重复写文件名;v4:「导出」改称「生成」
TITLE = "投标文件辅助检查报告"
FOOTER = "本报告为辅助检查结果,仅供投标前自查参考"
DISCLAIMER = (
- "本报告由标博士比对招标文件和投标文件生成,经用户逐项处理后导出,供投标前自查使用。检查范围以首页「检查覆盖范围」为准;"
+ "本报告由标博士比对招标文件和投标文件生成,经用户逐项处理后生成,供投标前自查使用。检查范围以首页「检查覆盖范围」为准;"
"结果可能有遗漏或误判,不代表资格审查、符合性审查或评标的结论。是否递交、如何修改,由投标人自行决定。"
)
SEVERITY = {"fatal": "致命", "important": "重要", "hint": "提示"}
@@ -152,7 +152,7 @@ def cover(d: dict[str, Any]) -> str:
checked_at = f'
{when(r.get("finished_at") or r.get("created_at"))}'
run_no = f'第
{r["run_no"]} 次检查'
alert = (
- f'
导出时还有 {open_fatal} 项致命问题待处理,报告如实列出。
'
+ f'
生成时还有 {open_fatal} 项致命问题待处理,报告如实列出。
'
if open_fatal
else ""
)
@@ -169,7 +169,7 @@ def cover(d: dict[str, Any]) -> str:
检查依据{basis}
检查时间{checked_at}({run_no})
规则版本{_e(r.get("rule_set_version"))}
-
导出{_e(d["exported_by"])} · {when(d["exported_at"])}
+
生成{_e(d["exported_by"])} · {when(d["exported_at"])}
{alert}
检查覆盖范围
@@ -230,7 +230,7 @@ def appendix(d: dict[str, Any]) -> str:
return f"""
附录 · 需人工核对
这些要求在投标文件里看不出来,需要投标人递交前自己核对。
-「未勾选」表示导出时还没有人在系统里勾选核对。
+「未勾选」表示生成时还没有人在系统里勾选核对。
"""