feat(ui): 查标第 6 步前端补齐
Some checks failed
ci / server (push) Has been cancelled
ci / web (push) Has been cancelled
ci / contract (push) Has been cancelled

- 读标页:每条清单项写最近一次检查的结论,点投标侧出处看投标原文;
  「已响应」也能反馈判断有误(漏报);证书要求写资质库里的情况
  (新接口 GET /projects/{id}/qualification-matches,资质库空时不写)
- 概览:检查记录卡(历次检查、各级问题数、报告下载)、文件卡
- 工作台:「致命」列、统计可点筛选、待处理的致命问题卡(?f= 定位到问题)
- 日期输入加日历弹层(DateInput,Reka UI Calendar)
- 查标页:? 键显示快捷键说明;反馈对话框抽成 FeedbackDialog 共用
- 扫描件提示去掉多余空格

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
YANG JIANKUAN
2026-11-05 13:39:19 +08:00
parent 808259da87
commit 54cbb556d0
30 changed files with 956 additions and 143 deletions

View File

@@ -912,6 +912,30 @@ export interface paths {
patch?: never;
trace?: never;
};
"/projects/{project_id}/qualification-matches": {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
/**
* 读标清单上的资质库情况(qualification-plan §4,第 6 步)
* @description 正式清单里资格条件、评分项中认出证书类别的条目,每类给出资质库里有效期最晚的一条,按投标截止日判断是否过期
* (没有截止时间按今天)。认类别、排除产品和人员证书的口径和查标一样;资质库是空的时 items 为空(QL3)。
*
*/
get: operations["listQualificationMatches"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}/check-runs": {
parameters: {
query?: never;
@@ -1425,6 +1449,30 @@ export interface components {
PlanCode: "free" | "pro" | "enterprise";
/** @enum {string} */
QualificationKind: "certificate" | "system_cert" | "software_copyright" | "other";
/** @description 一类证书在资质库里的情况(读标页用) */
QualificationMatch: {
family: string;
/** @description 资质库里这一类有几条 */
count: number;
/**
* @description 按 as_of 判断;missing 是资质库里没有这一类
* @enum {string}
*/
state: "valid" | "expired" | "missing";
/** @description 有效期最晚的一条;没有时为 null */
record: null | {
id: components["schemas"]["Id"];
name: string;
kind: components["schemas"]["QualificationKind"];
level?: string | null;
cert_no?: string | null;
/**
* Format: date
* @description null 表示长期有效
*/
valid_to: string | null;
};
};
/** @enum {string} */
ProjectFieldKey: "name" | "code" | "purchaser" | "agency" | "procurement_method" | "legal_regime" | "budget_total" | "ceiling_total" | "eval_method" | "accept_consortium" | "accept_imported" | "sme_only" | "deadline_at";
/**
@@ -4040,6 +4088,41 @@ export interface operations {
};
};
};
listQualificationMatches: {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
/**
* Format: date
* @description 按哪天判断有效期
*/
as_of: string;
/** @description as_of 是投标截止日(false 时是今天) */
by_deadline: boolean;
items: {
checklist_item_id: components["schemas"]["Id"];
families: components["schemas"]["QualificationMatch"][];
}[];
};
};
};
404: components["responses"]["NotFound"];
};
};
listCheckRuns: {
parameters: {
query?: never;