Files
bid-doctor/packages/api-client/src/schema.d.ts
YANG JIANKUAN 3344f09563 feat(ocr): 扫描件与图片识别——OCR 进文字层、资质库上传识别、大图浏览
计划见 docs/architecture/vision-plan.md(VS1–VS13,docs/decisions.md)。

- 验证:OCR(RapidOCR + PP-OCRv6 small,CPU)和 DeepSeek Flash 看图在国动投标文件
  和 7 张证书上初测(tech-validation §7,代码 spikes/s5-ocr/)
- OCR 服务 services/ocr(镜像、Compose 服务):整页转正(含 180°)、红章附近按红色通道重读
- 扫描页和插图识别后并入文字层 v6,句子标 source=ocr;出处标「OCR」(迁移 0013);
  依据识别文字的问题降级,规则不查扫描附件;国动端到端见 check-eval §16
- 资质库上传识别:添加资质对话框最上面传证书照片,识别后填表,只预填和 OCR 文字
  对得上的字段;识别值留痕、照片挂成附件(迁移 0014,提示词 vision.cert_fields v1)
- 资质库改为查看详情(只读键值 + 附件缩略图),附件用大图浏览控件看,不开新标签页
  (设计规范 §7.23);PDF 附件按页出预览图

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 17:50:13 +08:00

5211 lines
172 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* This file was auto-generated by openapi-typescript.
* Do not make direct changes to the file.
*/
export interface paths {
"/auth/sms-codes": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** 发送短信验证码 */
post: operations["sendSmsCode"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/register": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** 手机号注册(同时创建企业主体和免费版订阅) */
post: operations["register"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/login": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* 手机号 + 验证码登录
* @description 同一账号已有其他设备在线时返回 409 `concurrent_session`,附在线设备列表;
* 用户确认后带 `force: true` 重发,其他会话被挤下线(API3)。
*
*/
post: operations["login"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/auth/logout": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** 退出登录(吊销当前会话) */
post: operations["logout"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/me": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** 当前用户、企业、套餐、权限点 */
get: operations["getMe"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
/** 修改显示名 */
patch: operations["updateMe"];
trace?: never;
};
"/me/sessions": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** 我的在线会话 */
get: operations["listMySessions"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/me/sessions/{session_id}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/** 让某个设备下线 */
delete: operations["revokeMySession"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/me/sms-codes": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** 登录后发验证码到自己的手机号(注销账号的二次确认,前端不需要完整号码) */
post: operations["sendMySmsCode"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/tenant/close": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* 注销账号(删除企业下全部业务数据,不可恢复)
* @description data-model §6.2,决策 M6-8。需要短信验证码(`POST /me/sms-codes`)和企业名称两次确认;
* 企业名称不一致返回 422 `tenant_name_mismatch`。成功后所有会话失效,手机号可以重新注册;项目、资质库等由后台删除。
*
*/
post: operations["closeTenant"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/plans": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** 套餐列表(含额度、文件大小和页数上限,购买页和上传页展示用) */
get: operations["listPlans"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/quota": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** 额度总览:本期已用、剩余、按功能分布 */
get: operations["getQuota"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/quota/entries": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** 额度流水 */
get: operations["listQuotaEntries"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/activation-requests": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** 我的专业版开通申请 */
get: operations["listActivationRequests"];
put?: never;
/** 提交专业版开通申请(之后对公转账,运营确认到账后开通,G8) */
post: operations["createActivationRequest"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** 工作台项目列表(FR-M6-01) */
get: operations["listProjects"];
put?: never;
/** 新建项目 */
post: operations["createProject"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}": {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
/** 项目概览 */
get: operations["getProject"];
put?: never;
post?: never;
/** 删除项目(彻底删除业务内容,不可恢复;额度流水保留,G10) */
delete: operations["deleteProject"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}/fields/{field_key}": {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
field_key: components["schemas"]["ProjectFieldKey"];
};
cookie?: never;
};
get?: never;
/**
* 人工修改项目基本信息字段(FR-M2-03)
* @description `value` 为 null 表示撤销人工值,恢复为 AI 提取值。
*/
put: operations["setProjectField"];
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}/fields/{field_key}/pending": {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
field_key: components["schemas"]["ProjectFieldKey"];
};
cookie?: never;
};
get?: never;
put?: never;
/** 确认或驳回补遗带来的新值(FR-M2-10) */
post: operations["resolvePendingField"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}/transitions": {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
get?: never;
put?: never;
/**
* 手动变更项目状态(递交 / 撤销递交 / 归档 / 撤销归档,FR-M6-02)
* @description 致命问题未处理也可以递交(红线 4);响应里带当时的就绪状态,由前端提示。
*/
post: operations["transitionProject"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}/lots": {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
/** 分包列表 */
get: operations["listLots"];
put?: never;
/** 手工增加分包(FR-M2-04) */
post: operations["createLot"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}/bidding-lots": {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
get?: never;
/** 选择要投的包 */
put: operations["setBiddingLots"];
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}/lots/clear": {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
get?: never;
put?: never;
/**
* 这个项目不分包(PI2)
* @description 删掉所有包,清单项都归为各包通用,建回默认包。用于把分项误识别成包等情况。
*/
post: operations["clearLots"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/lots/{lot_id}": {
parameters: {
query?: never;
header?: never;
path: {
lot_id: components["schemas"]["Id"];
};
cookie?: never;
};
get?: never;
put?: never;
post?: never;
/**
* 删除分包(原属这个包的清单项变为各包通用,PI3)
* @description 删掉最后一个包时项目回到「不分包」(自动建回默认包,PI2)。
*/
delete: operations["deleteLot"];
options?: never;
head?: never;
/** 修改分包 */
patch: operations["updateLot"];
trace?: never;
};
"/uploads": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* 开始一次分片上传(架构 §5.2 第 7 条)
* @description 先按套餐校验文件大小;超出上限直接返回 409,不建上传(FR-M2-01)。
*/
post: operations["createUpload"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/uploads/{upload_id}": {
parameters: {
query?: never;
header?: never;
path: {
upload_id: components["parameters"]["UploadId"];
};
cookie?: never;
};
/** 查询已收到的分片(断点续传用) */
get: operations["getUpload"];
put?: never;
post?: never;
/** 放弃上传 */
delete: operations["abortUpload"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/uploads/{upload_id}/parts/{part_no}": {
parameters: {
query?: never;
header?: never;
path: {
upload_id: components["parameters"]["UploadId"];
part_no: number;
};
cookie?: never;
};
get?: never;
/** 上传一个分片(重复上传同一分片会覆盖) */
put: operations["putUploadPart"];
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/uploads/{upload_id}/complete": {
parameters: {
query?: never;
header?: never;
path: {
upload_id: components["parameters"]["UploadId"];
};
cookie?: never;
};
get?: never;
put?: never;
/**
* 完成上传:合并分片、按文件头识别格式、读页数
* @description 格式、加密、损坏、页数超限都在这里拦截,不建任务、不扣点(FR-M2-01)。
* 识别出电子投标平台的加密格式时返回 `bid_file_platform_encrypted`(FR-M3-01)。
*
*/
post: operations["completeUpload"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}/documents": {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
/** 项目的文档(招标文件、补遗、澄清、投标分册的各个版本) */
get: operations["listDocuments"];
put?: never;
/** 把上传好的文件挂到项目上(不扣点;招标侧文件要另外发起解析) */
post: operations["createDocument"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/documents/{document_id}": {
parameters: {
query?: never;
header?: never;
path: {
document_id: components["parameters"]["DocumentId"];
};
cookie?: never;
};
/** 文档详情 */
get: operations["getDocument"];
put?: never;
post?: never;
/**
* 删除文档
* @description 已被清单项或检查批次引用的文档不能删除,返回 `document_in_use`。
*/
delete: operations["deleteDocument"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/documents/{document_id}/file": {
parameters: {
query?: never;
header?: never;
path: {
document_id: components["parameters"]["DocumentId"];
};
cookie?: never;
};
/** 取文件的短时下载地址(pdf.js 直接加载,不需要带鉴权头) */
get: operations["getDocumentFileUrl"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/documents/{document_id}/pages": {
parameters: {
query?: never;
header?: never;
path: {
document_id: components["parameters"]["DocumentId"];
};
cookie?: never;
};
/** 逐页摘要(阅读器的页尺寸、OCR 标记) */
get: operations["listDocumentPages"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/documents/{document_id}/pages/{page_no}/sentences": {
parameters: {
query?: never;
header?: never;
path: {
document_id: components["parameters"]["DocumentId"];
page_no: number;
};
cookie?: never;
};
/** 一页的句子(阅读器里选句补出处用;数据来自对象存储的文字层,DM1) */
get: operations["listPageSentences"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}/citations": {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
get?: never;
put?: never;
/** 人工建一条出处(在阅读器里选中句子) */
post: operations["createCitation"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/documents/{document_id}/parse-jobs": {
parameters: {
query?: never;
header?: never;
path: {
document_id: components["parameters"]["DocumentId"];
};
cookie?: never;
};
get?: never;
put?: never;
/**
* 发起解析(预扣 1 次解析;失败、超时、取消都退回)
* @description 只用于招标文件、补遗、澄清;投标分册的解析算在检查里(01 §4)。
* 失败后重试也调用这个接口,会建一条新任务并重新预扣,上一条已经退回(FR-M2-02)。
*
*/
post: operations["startParseJob"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/parse-jobs/{job_id}": {
parameters: {
query?: never;
header?: never;
path: {
job_id: components["parameters"]["JobId"];
};
cookie?: never;
};
/** 解析进度(事件流断线时的轮询兜底) */
get: operations["getParseJob"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/parse-jobs/{job_id}/cancel": {
parameters: {
query?: never;
header?: never;
path: {
job_id: components["parameters"]["JobId"];
};
cookie?: never;
};
get?: never;
put?: never;
/** 取消解析(退回额度) */
post: operations["cancelParseJob"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}/checklist": {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
/** 清单概况:状态、版本、各类数量、标注规则、数量核对提示 */
get: operations["getChecklist"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}/checklist/items": {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
/** 清单项(一个项目几百条,一次返回全部,不分页) */
get: operations["listChecklistItems"];
put?: never;
/** 人工新增清单项(标注「人工添加」,可以没有出处) */
post: operations["createChecklistItem"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/checklist-items/{item_id}": {
parameters: {
query?: never;
header?: never;
path: {
item_id: components["parameters"]["ItemId"];
};
cookie?: never;
};
/** 清单项详情 */
get: operations["getChecklistItem"];
put?: never;
post?: never;
/** 删除(软删除,可以恢复;待确认区的条目就是「丢弃」) */
delete: operations["deleteChecklistItem"];
options?: never;
head?: never;
/** 修改清单项(改过的字段记入 edited_fields;已确认的清单回到草稿) */
patch: operations["updateChecklistItem"];
trace?: never;
};
"/checklist-items/{item_id}/restore": {
parameters: {
query?: never;
header?: never;
path: {
item_id: components["parameters"]["ItemId"];
};
cookie?: never;
};
get?: never;
put?: never;
/** 恢复已删除的条目 */
post: operations["restoreChecklistItem"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/checklist-items/{item_id}/accept": {
parameters: {
query?: never;
header?: never;
path: {
item_id: components["parameters"]["ItemId"];
};
cookie?: never;
};
get?: never;
put?: never;
/**
* 从待确认区采纳进正式清单(FR-M2-07)
* @description 必须补上出处,或者声明「人工确认、无出处」;可以同时修改字段(修改后采纳)。
*/
post: operations["acceptPendingItem"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/checklist-items/{item_id}/citations": {
parameters: {
query?: never;
header?: never;
path: {
item_id: components["parameters"]["ItemId"];
};
cookie?: never;
};
get?: never;
/** 替换清单项的出处列表(按顺序) */
put: operations["setItemCitations"];
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/checklist-items/{item_id}/supersession": {
parameters: {
query?: never;
header?: never;
path: {
item_id: components["parameters"]["ItemId"];
};
cookie?: never;
};
get?: never;
put?: never;
/**
* 确认或驳回「已被补遗 N 更新」(FR-M2-10)
* @description 接受时旧条目软删除,新条目保留;驳回时解除关联,两条都保留,由用户自己处理。
*/
post: operations["resolveSupersession"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/checklist-items/{item_id}/history": {
parameters: {
query?: never;
header?: never;
path: {
item_id: components["parameters"]["ItemId"];
};
cookie?: never;
};
/** 修改记录(谁、什么时候、改前、改后;来自审计事件) */
get: operations["getItemHistory"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}/checklist/confirm": {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
get?: never;
put?: never;
/** 确认清单(生成不可变版本) */
post: operations["confirmChecklist"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}/checklist/response-modes/{category}": {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
category: "technical" | "commercial";
};
cookie?: never;
};
get?: never;
/** 改招标文件某一类要求的响应方式(C12 的人工确认点) */
put: operations["setResponseMode"];
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}/checklist/versions": {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
/** 清单版本 */
get: operations["listChecklistVersions"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}/check-preview": {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
/**
* 发起检查前的预览:这次扣不扣点、用哪些文件、有什么提示
* @description 「开始检查」按钮旁的扣点说明来自这里(红线 9)。
*/
get: operations["getCheckPreview"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
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;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
/** 检查记录 */
get: operations["listCheckRuns"];
put?: never;
/** 发起检查(FR-M3-02) */
post: operations["startCheckRun"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/check-runs/{run_id}": {
parameters: {
query?: never;
header?: never;
path: {
run_id: components["parameters"]["RunId"];
};
cookie?: never;
};
/** 检查批次(进度、覆盖范围、各级别数量) */
get: operations["getCheckRun"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/check-runs/{run_id}/cancel": {
parameters: {
query?: never;
header?: never;
path: {
run_id: components["parameters"]["RunId"];
};
cookie?: never;
};
get?: never;
put?: never;
/** 取消检查(退回额度) */
post: operations["cancelCheckRun"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/check-runs/{run_id}/findings": {
parameters: {
query?: never;
header?: never;
path: {
run_id: components["parameters"]["RunId"];
};
cookie?: never;
};
/** 本批次的全部问题(含「本次已解决」,一次返回全部) */
get: operations["listFindings"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/check-runs/{run_id}/item-results": {
parameters: {
query?: never;
header?: never;
path: {
run_id: components["parameters"]["RunId"];
};
cookie?: never;
};
/**
* 每条清单项的检查结论(C9)
* @description 「已响应」也是 AI 结论,同样带投标侧出处、可以复核、可以反馈判断有误(红线 1、2)。
* 问题只为没响应好的条目生成;这里列出本批次参与检查的全部清单项。
*
*/
get: operations["listCheckItemResults"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/check-runs/{run_id}/findings/bulk-resolve": {
parameters: {
query?: never;
header?: never;
path: {
run_id: components["parameters"]["RunId"];
};
cookie?: never;
};
get?: never;
put?: never;
/** 批量处理(只限「提示」级,FR-M3-07) */
post: operations["bulkResolveFindings"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/findings/{finding_id}/resolve": {
parameters: {
query?: never;
header?: never;
path: {
finding_id: components["parameters"]["FindingId"];
};
cookie?: never;
};
get?: never;
put?: never;
/**
* 处理一个问题
* @description 忽略必须写原因;致命问题选「确认无误」也必须写说明,说明同时进入误报反馈(U4)。
* 只有最近一次检查的问题可以处理,历史批次只读。
*
*/
post: operations["resolveFinding"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/findings/{finding_id}/reopen": {
parameters: {
query?: never;
header?: never;
path: {
finding_id: components["parameters"]["FindingId"];
};
cookie?: never;
};
get?: never;
put?: never;
/** 撤销处理,回到待处理(U 键) */
post: operations["reopenFinding"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}/manual-checks": {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
/** 需人工核对的条目和勾选结果(按项目存,P2) */
get: operations["listManualChecks"];
/** 勾选或取消勾选一条 */
put: operations["setManualCheck"];
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/check-runs/{run_id}/reports": {
parameters: {
query?: never;
header?: never;
path: {
run_id: components["parameters"]["RunId"];
};
cookie?: never;
};
get?: never;
put?: never;
/**
* 生成检查报告 PDF(后台生成,完成后推送事件)
* @description 致命问题未处理也可以导出(红线 4)。每次生成都是一份新报告。
*/
post: operations["generateReport"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/report-jobs/{job_id}": {
parameters: {
query?: never;
header?: never;
path: {
job_id: components["parameters"]["JobId"];
};
cookie?: never;
};
/** 报告生成进度(轮询兜底) */
get: operations["getReportJob"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}/reports": {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
/** 项目的报告(随项目归档,可以重复下载) */
get: operations["listReports"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/reports/{report_id}/file": {
parameters: {
query?: never;
header?: never;
path: {
report_id: components["schemas"]["Id"];
};
cookie?: never;
};
/** 报告的短时下载地址 */
get: operations["getReportFileUrl"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/qualifications": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* 资质库
* @description 按「有效期至」从近到远排,长期有效的在最后。
*/
get: operations["listQualifications"];
put?: never;
/** 新增资质 */
post: operations["createQualification"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/qualifications/{qualification_id}": {
parameters: {
query?: never;
header?: never;
path: {
qualification_id: components["parameters"]["QualificationId"];
};
cookie?: never;
};
get?: never;
/** 修改资质 */
put: operations["updateQualification"];
post?: never;
/** 删除资质(连同附件) */
delete: operations["deleteQualification"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/qualifications/{qualification_id}/files": {
parameters: {
query?: never;
header?: never;
path: {
qualification_id: components["parameters"]["QualificationId"];
};
cookie?: never;
};
get?: never;
put?: never;
/** 挂上一个已上传的附件 */
post: operations["attachQualificationFile"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/qualifications/{qualification_id}/files/{file_id}/previews": {
parameters: {
query?: never;
header?: never;
path: {
qualification_id: components["parameters"]["QualificationId"];
file_id: components["schemas"]["Id"];
};
cookie?: never;
};
/** 附件的预览图(图片一张,PDF 每页一张,最多 10 页),详情和大图浏览用 */
get: operations["getQualificationFilePreviews"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/qualification-scans": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** 上传证书扫描件识别(后台识别,轮询结果;不扣额度,每个企业每天限 100 次) */
post: operations["createQualificationScan"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/qualification-scans/{scan_id}": {
parameters: {
query?: never;
header?: never;
path: {
scan_id: components["schemas"]["Id"];
};
cookie?: never;
};
/** 识别结果 */
get: operations["getQualificationScan"];
put?: never;
post?: never;
/** 丢弃识别结果(连同原件) */
delete: operations["deleteQualificationScan"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/qualifications/{qualification_id}/files/{file_id}": {
parameters: {
query?: never;
header?: never;
path: {
qualification_id: components["parameters"]["QualificationId"];
file_id: components["schemas"]["Id"];
};
cookie?: never;
};
/** 附件的短时下载地址 */
get: operations["getQualificationFileUrl"];
put?: never;
post?: never;
/** 删除附件 */
delete: operations["deleteQualificationFile"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/notifications": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** 站内通知 */
get: operations["listNotifications"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/notifications/read": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** 标为已读(不传编号就是全部已读) */
post: operations["markNotificationsRead"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/events": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* 事件流(SSE)
* @description 当前用户在当前企业下的事件。前端用 fetch 读流(可以带 Bearer 头),不用浏览器的 EventSource(API2)。
* 每条事件带 `id`;断线重连时带 `Last-Event-ID`,服务端尽量补发,补不了时发 `resync`,前端重新拉取数据。
* 事件只是「有变化」的提示,权威状态以对应资源的 GET 为准。
*
*/
get: operations["streamEvents"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/feedback": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/** 反馈判断有误(误报 / 漏报,J5) */
post: operations["createFeedback"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
}
export type webhooks = Record<string, never>;
export interface components {
schemas: {
/** Format: uuid */
Id: string;
/**
* Format: date-time
* @description RFC 3339,带时区
*/
Timestamp: string;
/** @description 金额用字符串传,避免浮点误差;单位元 */
Money: string;
/** @description 中国大陆手机号,11 位 */
Phone: string;
Page: {
/** @description 为 null 表示没有下一页 */
next_cursor: string | null;
};
/** @description RFC 9457 problem details,`code` 是给前端判断用的稳定编码(api-design §5) */
Problem: {
/** @description 固定为 about:blank 或错误码文档地址 */
type: string;
/** @description 给用户看的一句话(中文) */
title: string;
status: number;
code: string;
detail?: string;
request_id: string;
errors?: {
/** @description 字段路径,如 spec.tech_param.value */
field: string;
code: string;
message: string;
}[];
} & {
[key: string]: unknown;
};
DownloadUrl: {
/** Format: uri */
url: string;
expires_at: components["schemas"]["Timestamp"];
sha256?: string;
};
/** @description 操作人;人离职或注销后仍显示当时的姓名 */
UserRef: {
id: components["schemas"]["Id"];
name: string;
};
/** @enum {string} */
ProjectStatus: "tracking" | "drafting" | "checked" | "submitted" | "archived";
/** @enum {string} */
LegalRegime: "gov_procurement" | "tendering" | "unknown";
/** @enum {string} */
DocumentRole: "tender" | "addendum" | "clarification" | "bid_volume";
/**
* @description jpeg、png 只出现在资质附件(purpose = qualification_file)上
* @enum {string}
*/
DetectedFormat: "pdf" | "docx" | "doc" | "wps" | "ofd" | "encrypted_bid" | "jpeg" | "png" | "unknown";
/** @enum {string} */
JobStatus: "queued" | "running" | "succeeded" | "failed" | "cancelled";
/** @enum {string} */
Category: "qualification" | "invalidity" | "scoring" | "schedule" | "tech_param" | "format_doc" | "price";
/**
* @description 界面显示为 ★ / ▲ / 一般
* @enum {string}
*/
Importance: "substantive" | "important" | "normal";
/** @enum {string} */
Zone: "pending" | "formal";
/** @enum {string} */
PendingReason: "no_citation" | "low_confidence" | "verify_failed" | "marker_uncovered" | "absent_in_rerun";
/** @enum {string} */
Origin: "ai" | "rule" | "human";
/** @enum {string} */
FindingType: "unresponded" | "negative_deviation" | "suspected_unmet" | "formality" | "qualification" | "price_form" | "manual_review";
/** @enum {string} */
Severity: "fatal" | "important" | "hint";
/** @enum {string} */
FindingStatus: "pending" | "confirmed_ok" | "modified" | "ignored";
/**
* @description 新增 / 沿用 / 本次已解决
* @enum {string}
*/
Presence: "new" | "carried" | "resolved";
/** @enum {string} */
BillingMode: "charged" | "waived_recheck" | "free_plan";
/** @enum {string} */
QuotaUnit: "parse" | "check" | "generate" | "dedupe";
/** @enum {string} */
QuotaEntryKind: "grant" | "hold" | "settle" | "release" | "expire" | "adjust" | "waive";
/** @enum {string} */
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";
/**
* @description 工作台「下一步」,由服务端按项目状态算出
* @enum {string}
*/
NextAction: "upload_tender" | "wait_parse" | "select_lots" | "confirm_checklist" | "upload_bid" | "run_check" | "handle_fatal" | "export_report" | "archive" | "none";
/**
* @description 权限点(AR12)。MVP 的所有者拥有全部;前端只用来决定按钮显不显示,服务端仍会检查
* @enum {string}
*/
Permission: "project.create" | "project.edit" | "project.delete" | "checklist.edit" | "checklist.confirm" | "check.run" | "finding.resolve" | "report.export" | "quota.view" | "billing.manage" | "qualification.edit" | "tenant.close";
RegisterRequest: {
phone: components["schemas"]["Phone"];
sms_code: string;
/** @description 企业名称(MVP 不做认证,G9) */
tenant_name: string;
display_name: string;
/** @description 同意的服务协议版本(含围串标禁止条款) */
terms_version: string;
/** @enum {string} */
client_kind: "web" | "desktop";
};
LoginRequest: {
phone: components["schemas"]["Phone"];
sms_code: string;
/** @enum {string} */
client_kind: "web" | "desktop";
/**
* @description 已有其他设备在线时,确认挤下线后重发
* @default false
*/
force: boolean;
};
LoginResult: {
me: components["schemas"]["Me"];
/** @description 只有 client_kind = desktop 时返回,且只返回这一次 */
token?: string;
expires_at?: components["schemas"]["Timestamp"];
};
SessionInfo: {
id: components["schemas"]["Id"];
/** @enum {string} */
client_kind: "web" | "desktop";
/** @description 从 User-Agent 归纳,如「Chrome · macOS」 */
device?: string;
/** @description IP 归属地,如「江苏南京」;不返回完整 IP */
ip_region?: string;
created_at: components["schemas"]["Timestamp"];
last_seen_at: components["schemas"]["Timestamp"];
current: boolean;
};
Me: {
user: {
id: components["schemas"]["Id"];
display_name: string;
phone_hint: string;
};
tenant: {
id: components["schemas"]["Id"];
name: string;
};
/** @enum {string} */
role: "owner" | "admin" | "member";
plan: components["schemas"]["PlanSummary"];
permissions: components["schemas"]["Permission"][];
};
PlanSummary: {
code: components["schemas"]["PlanCode"];
name: string;
starts_at?: components["schemas"]["Timestamp"];
ends_at?: components["schemas"]["Timestamp"] | null;
/** @description 套餐到期后数据只读(FR-M6-05) */
read_only: boolean;
};
Plan: {
code: components["schemas"]["PlanCode"];
version: number;
name: string;
/** @description 每个周期的额度;专业版的检查从解析额度扣 */
quotas: {
[key: string]: number;
};
limits: {
max_file_bytes?: number;
max_pages?: number;
max_projects?: number | null;
};
/** @description 给用户看的检查计费说明,如「检查从解析额度扣 1 次;同一项目 24 小时内复查不扣」 */
check_rule?: string;
};
QuotaOverview: {
plan: components["schemas"]["PlanSummary"];
accounts: {
unit: components["schemas"]["QuotaUnit"];
/** @description 剩余,含正在预扣的 */
balance: number;
/** @description 正在预扣、还没结算的 */
held?: number;
/** @description 本期发放(按当前这一期订阅) */
period_granted: number;
/** @description 本期净用量(预扣 − 退回) */
period_used: number;
/** @description 本期退回的次数(失败、超时、取消) */
period_released?: number;
/** @description 0~1;≥ 0.8 时界面变赭色(Q9) */
used_ratio?: number;
}[];
/** @description 本期按功能分布(没被退回的预扣);deleted 是项目已删除、看不出用途的;waived 是 24 小时内复查的免扣次数 */
usage: {
tender: number;
/** @description 补遗和澄清 */
addendum: number;
check: number;
deleted: number;
waived: number;
};
/** @description 已续费、排队等当前一期结束后生效的那一期 */
renewal?: null | {
starts_at: components["schemas"]["Timestamp"];
ends_at: components["schemas"]["Timestamp"];
};
/** @description 还在等转账或开通的申请 */
pending_request?: null | components["schemas"]["ActivationRequest"];
};
QuotaEntry: {
id: components["schemas"]["Id"];
unit: components["schemas"]["QuotaUnit"];
kind: components["schemas"]["QuotaEntryKind"];
/** @description 对余额的影响;结算、免扣为 0 */
amount: number;
/** @description 记完这一条以后的账户余额 */
balance_after: number;
/** @description 结算、退回对应的预扣 */
hold_entry_id?: components["schemas"]["Id"] | null;
/** @description 调整原因;免扣时为规则说明,如「24 小时内复查」 */
reason?: string;
project?: {
id?: components["schemas"]["Id"];
/** @description 项目已删除时为 null,界面显示「(已删除的项目)」 */
name?: string | null;
deleted?: boolean;
} | null;
ref?: {
/** @enum {string} */
type?: "parse_job" | "check_run";
id?: components["schemas"]["Id"];
/** @description 如「招标文件解析」「第 3 次检查」 */
label?: string | null;
} | null;
created_at: components["schemas"]["Timestamp"];
};
ActivationRequestCreate: {
/** @enum {string} */
plan_code: "pro";
invoice_info: components["schemas"]["InvoiceInfo"];
};
/** @description 专票(invoice_type = special)还要地址电话和开户行账号 */
InvoiceInfo: {
/** @description 发票抬头 */
title: string;
/** @description 纳税人识别号 */
tax_no: string;
address_phone?: string;
bank_account?: string;
/** @enum {string} */
invoice_type?: "general" | "special";
contact_name: string;
contact_phone: string;
};
ActivationRequest: {
id: components["schemas"]["Id"];
/** @description 申请单号,对公转账时写在备注里 */
request_no: string;
plan_code: components["schemas"]["PlanCode"];
/**
* @description 等待转账 / 已到账 / 已开通 / 已退回 / 已撤回
* @enum {string}
*/
status: "submitted" | "paid" | "activated" | "rejected" | "cancelled";
invoice_info?: components["schemas"]["InvoiceInfo"];
/** @description 收款信息(配置项;没配时为「(待定)」,决策 M6-6)。页面不写价格,运营联系确认金额 */
payment: {
payee_name: string;
payee_bank: string;
payee_account: string;
};
/** @description 退回原因 */
ops_note?: string | null;
invoice_no?: string | null;
handled_at?: components["schemas"]["Timestamp"] | null;
created_at: components["schemas"]["Timestamp"];
};
/** @description 就绪状态只在 status = checked 时有意义(G7);未就绪也不阻止导出和递交(红线 4) */
ProjectReadiness: {
status: components["schemas"]["ProjectStatus"];
open_fatal_count: number;
/** @description 不是 checked 状态时为 null */
ready: boolean | null;
};
ProjectListItem: {
id: components["schemas"]["Id"];
name: string;
code?: string | null;
purchaser?: string | null;
deadline_at?: components["schemas"]["Timestamp"] | null;
status: components["schemas"]["ProjectStatus"];
readiness: components["schemas"]["ProjectReadiness"];
bidding_lots: string[];
/** @description 待确认区条目数 */
pending_item_count?: number;
/** @description 正在跑的解析或检查 */
active_job?: {
/** @enum {string} */
kind?: "parse_job" | "check_run";
id?: components["schemas"]["Id"];
progress?: number;
label?: string;
} | null;
next_action: components["schemas"]["NextAction"];
/** @description 最近一次完成的检查(「处理致命问题」直接打开它) */
latest_check_run_id?: components["schemas"]["Id"] | null;
updated_at: components["schemas"]["Timestamp"];
};
ProjectDetail: components["schemas"]["ProjectListItem"] & {
legal_regime: components["schemas"]["LegalRegime"];
agency?: string | null;
procurement_method?: string | null;
/** @description 基本信息字段(FR-M2-03),每个都带出处 */
fields: components["schemas"]["ProjectField"][];
/** @description 关键日期时间线(FR-M2-09),来自「日期与递交」类清单项 */
key_dates: {
/** @description 来自哪条清单项;人工改过的投标截止时间没有对应条目,为 null */
item_id: components["schemas"]["Id"] | null;
label: string;
/** @enum {string} */
kind?: "question_deadline" | "bid_deadline" | "opening" | "deposit_deadline" | "validity" | "other";
at: components["schemas"]["Timestamp"];
/** @description 人工改过(投标截止时间按项目字段的人工值显示) */
edited?: boolean;
/** @description 已按补遗确认更新:原来的时间和带来新值的文件(「已按补遗 1 更新 · 原为……」) */
replaces?: {
at: string;
document_label: string;
} | null;
/** @description 补遗带来了新值、等用户确认 */
superseded_pending?: boolean;
}[];
latest_check_run_id?: components["schemas"]["Id"] | null;
members?: {
user?: components["schemas"]["UserRef"];
/** @enum {string} */
role?: "lead" | "editor" | "viewer";
}[];
created_by: components["schemas"]["UserRef"];
created_at: components["schemas"]["Timestamp"];
};
/** @description 按字段:文本、布尔、金额(Money 字符串)或时间 */
FieldValue: string | boolean | null;
ProjectField: {
key: components["schemas"]["ProjectFieldKey"];
value: components["schemas"]["FieldValue"];
/** @enum {string} */
source: "ai" | "human" | "none";
ai_value?: components["schemas"]["FieldValue"];
citation?: components["schemas"]["Citation"] | null;
updated_by?: components["schemas"]["UserRef"] | null;
updated_at?: components["schemas"]["Timestamp"] | null;
/** @description 补遗带来的新值(FR-M2-10) */
pending?: {
value?: components["schemas"]["FieldValue"];
document_label?: string;
citation?: components["schemas"]["Citation"];
} | null;
};
LotInput: {
lot_no?: string;
name?: string;
budget_amount?: components["schemas"]["Money"] | null;
ceiling_amount?: components["schemas"]["Money"] | null;
};
Lot: {
id: components["schemas"]["Id"];
lot_no: string;
name?: string | null;
budget_amount?: components["schemas"]["Money"] | null;
ceiling_amount?: components["schemas"]["Money"] | null;
/** @description 没有分包时自动建的默认包,界面跳过选包 */
is_default: boolean;
is_bidding: boolean;
origin: components["schemas"]["Origin"];
edited_fields: string[];
/** @description AI 识别的原值(包号、名称、预算、限价),人工修改不覆盖 */
ai_values?: Record<string, never> | null;
};
Upload: {
id: components["schemas"]["Id"];
/** @description 字节,最后一片可以更小 */
part_size: number;
part_count: number;
received_parts: number[];
expires_at: components["schemas"]["Timestamp"];
};
UploadCompleted: {
id: components["schemas"]["Id"];
filename: string;
size_bytes: number;
sha256: string;
detected_format: components["schemas"]["DetectedFormat"];
/** @description 扩展名和真实格式不一致(07 F2),界面只做提示 */
extension_mismatch?: boolean;
/** @description PDF 能直接读出;Word 要转换后才知道,这里为 null */
page_count?: number | null;
};
/**
* @description 整本 / 资格证明 / 商务 / 技术 / 报价 / 其他(C8)
* @enum {string}
*/
VolumeKind: "whole" | "qualification" | "commercial" | "technical" | "price" | "other";
DocumentCreate: {
upload_id: components["schemas"]["Id"];
role: components["schemas"]["DocumentRole"];
/** @description 用户自填的分册名称,不填时按分册类型显示 */
volume_name?: string;
/** @description 投标分册类型,默认整本(C8)。只用来排序检索候选和填写「找过哪些分册」,不限制检索范围 */
volume_kind?: components["schemas"]["VolumeKind"];
/** @description 投标分册重新上传时填上一版的编号,生成新版本(FR-M3-01) */
replaces_document_id?: components["schemas"]["Id"];
};
Document: {
id: components["schemas"]["Id"];
role: components["schemas"]["DocumentRole"];
/** @description 如「招标文件」「补遗 1」「技术分册 v2」 */
label: string;
seq_no?: number;
volume_name?: string | null;
volume_kind?: components["schemas"]["VolumeKind"] | null;
lineage_id?: components["schemas"]["Id"];
is_latest_version?: boolean;
original_filename: string;
detected_format: components["schemas"]["DetectedFormat"];
size_bytes: number;
page_count?: number | null;
normalized_sha256?: string | null;
/** @enum {string} */
status: "uploaded" | "normalizing" | "ready" | "failed";
latest_parse_job?: components["schemas"]["ParseJob"] | null;
uploaded_by?: components["schemas"]["UserRef"];
created_at: components["schemas"]["Timestamp"];
};
DocumentPage: {
page_no: number;
width_pt: number;
height_pt: number;
/** @enum {integer} */
rotation: 0 | 90 | 180 | 270;
/** @enum {string} */
text_source: "text" | "ocr" | "mixed" | "empty";
};
/** @description 一个矩形 [x0, y0, x1, y1],单位 pt,原点在页面左上角 */
Quad: number[];
Sentence: {
key: string;
text: string;
quads: components["schemas"]["Quad"][];
/** @enum {string} */
location: "body" | "table" | "header_footer";
/** @description 文字格式片段 [起, 止, 格式],格式取 b / i / u 的组合 */
format_runs?: [
number,
number,
string
][];
/** @description 所在章节,如「第三章 采购需求 > 3.2 技术参数」 */
section_path?: string;
};
CitationCreate: {
document_id: components["schemas"]["Id"];
/** @description 同一页上连续的句子 */
sentence_keys: string[];
char_start?: number;
char_end?: number;
};
/** @description 出处,不可变(data-model §5.1) */
Citation: {
id: components["schemas"]["Id"];
document_id: components["schemas"]["Id"];
document_label: string;
/** @description 和文档当前哈希不一致时前端不画高亮 */
normalized_sha256: string;
page_no: number;
sentence_keys: string[];
char_start?: number | null;
char_end?: number | null;
/** @description 原句 */
quote: string;
quads: components["schemas"]["Quad"][];
created_by_kind: components["schemas"]["Origin"];
/** @description 原句是扫描页或插图上 OCR 识别出来的,可能有错字(界面标「识别文字」) */
ocr: boolean;
};
/** @description 给用户看的失败原因;不含文档内容 */
JobError: {
code: string;
message: string;
/** @description 额度是否已退回 */
refunded: boolean;
};
ParseJob: {
id: components["schemas"]["Id"];
document_id: components["schemas"]["Id"];
attempt_no: number;
status: components["schemas"]["JobStatus"];
/** @enum {string|null} */
stage?: "detect" | "convert" | "text_layer" | "ocr" | "structure" | "extract" | "verify" | "merge" | null;
progress: number;
cancel_requested?: boolean;
error?: components["schemas"]["JobError"] | null;
/** @description 成功后的摘要 */
result?: {
items_added?: number;
items_updated?: number;
items_pending?: number;
/** @description 重新解析时没再出现的旧条目 */
items_absent?: number;
lots_found?: number;
/** @description 补遗:更早文件里有几条日期条目被标「已被补遗 N 更新」(FR-M2-10) */
dates_superseded?: number;
/** @description 补遗:项目字段里有几个新值等确认 */
fields_pending?: number;
/** @description 没通过校验的原因码和条数(如 quote_too_short、value_unverified),评测和排查用 */
verify_failures?: {
[key: string]: number;
};
/** @description 模型输出被截断、把分块对半重跑的次数 */
chunks_split?: number;
/** @description 拆到底输出仍不完整的分块数(这些分块的结果可能不全) */
output_incomplete?: number;
/** @description 项目基本信息各字段的结论:found / absent(文件本身没写)/ needs_review(抽取有问题,要人核对) */
info_fields?: {
[key: string]: "found" | "absent" | "needs_review";
};
} | null;
created_at: components["schemas"]["Timestamp"];
finished_at?: components["schemas"]["Timestamp"] | null;
};
MarkingRule: {
id: components["schemas"]["Id"];
/** @enum {string} */
marker: "star" | "asterisk" | "triangle" | "italic_underline" | "bold" | "underline" | "keyword";
marker_text?: string | null;
/** @enum {string} */
meaning: "substantive" | "important";
declared_count?: number | null;
/** @description 实际抽到的条数 */
found_count?: number;
citation: components["schemas"]["Citation"];
};
Checklist: {
/** @description 招标文件对技术、商务要求的响应方式(C12)。识别出来的(origin = rule)可以改(origin = human,人工确认点);查标按它判没找到响应算不算问题 */
response_modes?: components["schemas"]["ResponseMode"][];
/** @enum {string} */
status: "draft" | "confirmed";
/** @description 最近一次确认的版本号;没确认过为 0 */
version_no: number;
confirmed_by?: components["schemas"]["UserRef"] | null;
confirmed_at?: components["schemas"]["Timestamp"] | null;
counts: {
formal: number;
pending: number;
deleted: number;
superseded_pending?: number;
by_category?: {
[key: string]: number;
};
};
marking_rules: components["schemas"]["MarkingRule"][];
/** @description 如「文件写明 ★ 项共 14 条,实际抽到 13 条」 */
warnings?: {
/** @enum {string} */
code: "declared_count_mismatch" | "marker_rule_not_found" | "legal_regime_unknown";
message: string;
}[];
};
/** @description 类别特有字段(05 §3.3),按类别分组;一条清单项有几个类别就可以有几组 */
ItemSpec: {
qualification?: {
/** @enum {string} */
kind?: "general" | "specific" | "credit";
validity_requirement?: string;
};
invalidity?: {
/** @enum {string} */
source?: "statute" | "tender_text" | "substantive_marker";
};
scoring?: {
factor?: string;
/** @description 分值,可能是「0~5」这样的区间,所以用字符串 */
points?: string;
criteria?: string;
/** @enum {string} */
part?: "price" | "technical" | "commercial";
};
schedule?: {
/** @enum {string} */
date_kind?: "question_deadline" | "bid_deadline" | "opening" | "deposit_deadline" | "other";
at?: components["schemas"]["Timestamp"];
deposit_amount?: components["schemas"]["Money"];
/** @enum {string} */
submission_mode?: "electronic" | "paper" | "ca_encrypted" | "mixed";
copies?: string;
};
tech_param?: {
param?: string;
/** @enum {string} */
op?: ">=" | "<=" | "=" | "contains" | "supports";
value?: string;
unit?: string;
device?: string;
};
format_doc?: {
doc_name?: string;
modifiable?: boolean;
};
/** @description 分项限价、单价上限(DM7);只存招标文件写明的限价,系统不给任何报价建议(红线 6) */
price?: {
/** @enum {string} */
kind?: "item_ceiling" | "unit_price_ceiling";
target?: string;
/** @enum {string} */
op?: "<=";
value?: components["schemas"]["Money"];
};
};
ChecklistItemFields: {
categories?: components["schemas"]["Category"][];
title?: string;
requirement_text?: string | null;
importance?: components["schemas"]["Importance"];
lot_id?: components["schemas"]["Id"] | null;
evidence_required?: string | null;
spec?: components["schemas"]["ItemSpec"];
};
ChecklistItemCreate: components["schemas"]["ChecklistItemFields"] & {
categories: components["schemas"]["Category"][];
title: string;
citation_ids?: components["schemas"]["Id"][];
};
ChecklistItemUpdate: components["schemas"]["ChecklistItemFields"];
ChecklistItem: components["schemas"]["ChecklistItemFields"] & {
categories: components["schemas"]["Category"][];
title: string;
importance: components["schemas"]["Importance"];
id: components["schemas"]["Id"];
/** @description AI 摘要,界面标注 AI 生成 */
summary?: string | null;
/** @enum {string|null} */
importance_basis?: "marker" | "statute" | "tender_text" | "human" | null;
marking_rule_id?: components["schemas"]["Id"] | null;
/** @description 空表示各包通用 */
lot_no?: string | null;
origin: components["schemas"]["Origin"];
/** @description 如「AI」「人工添加」「补遗 1」 */
origin_label?: string;
/** @description 来自哪份招标侧文件(招标文件、补遗 N、澄清 N);人工添加的为 null */
origin_document?: {
id: components["schemas"]["Id"];
label: string;
} | null;
zone: components["schemas"]["Zone"];
pending_reason?: components["schemas"]["PendingReason"] | null;
/** @description 人工确认、无出处 */
no_citation_ack?: boolean;
citations: components["schemas"]["Citation"][];
/** @description AI 原值;和当前值不同的字段界面可以显示「AI 原为……」 */
ai_values?: Record<string, never> | null;
edited_fields: string[];
confidence?: number | null;
/** @description 已被补遗更新,等用户确认 */
superseded_by?: {
item_id?: components["schemas"]["Id"];
document_label?: string;
confirmed?: boolean;
} | null;
accepted_by?: components["schemas"]["UserRef"] | null;
deleted_at?: components["schemas"]["Timestamp"] | null;
updated_at: components["schemas"]["Timestamp"];
};
ChecklistVersion: {
id: components["schemas"]["Id"];
version_no: number;
/** @enum {string} */
kind: "confirmed" | "check";
item_count: number;
created_by: components["schemas"]["UserRef"];
created_at: components["schemas"]["Timestamp"];
};
HistoryEntry: {
action: string;
actor: components["schemas"]["UserRef"];
at: components["schemas"]["Timestamp"];
changes?: {
field: string;
before?: unknown;
after?: unknown;
}[];
};
CheckPreview: {
can_start: boolean;
/** @description can_start 为 false 的原因 */
blockers?: ("no_parsed_tender" | "checklist_empty" | "no_bid_documents" | "job_already_running" | "quota_exhausted" | "project_read_only")[];
billing: components["schemas"]["BillingMode"];
/**
* @description 这次检查扣几次
* @enum {integer}
*/
charge: 0 | 1;
charge_unit?: components["schemas"]["QuotaUnit"];
/** @description 24 小时免扣窗口的结束时间(从上一次扣点的检查算起,P1) */
waive_until?: components["schemas"]["Timestamp"] | null;
/** @description 为 false 时提示「清单未确认,检查结果以当前清单为准」 */
checklist_confirmed: boolean;
/** @description 待确认区条目不参与检查 */
pending_item_count?: number;
/** @description 补遗带来的新值、日期更新还没确认的处数;查标用旧值(AD4),只提示、不阻止 */
pending_updates?: number;
/** @description 默认用每个分册的最新版本 */
bid_documents: components["schemas"]["Document"][];
lot_ids: components["schemas"]["Id"][];
};
CheckRunCreate: {
/** @description 本次检查的投标文件版本 */
document_ids: components["schemas"]["Id"][];
/**
* @description 前端按 check-preview 提示用户的扣点数;和服务端当下算的不一致时返回 `billing_changed`,不扣点(API4)
* @enum {integer}
*/
expected_charge: 0 | 1;
};
CheckRun: {
id: components["schemas"]["Id"];
run_no: number;
status: components["schemas"]["JobStatus"];
/** @enum {string|null} */
stage?: "prepare_bid" | "match" | "rules" | "verify" | "carry_over" | "summarize" | null;
progress: number;
cancel_requested?: boolean;
error?: components["schemas"]["JobError"] | null;
billing: components["schemas"]["BillingMode"];
/** @description 只有最近一次检查的问题可以处理 */
is_latest?: boolean;
checklist_version_no: number;
checklist_confirmed: boolean;
rule_set_version: string;
legal_regime?: components["schemas"]["LegalRegime"];
documents?: components["schemas"]["Document"][];
/** @description 检查之后改过项目依据(截止时间、限价、所投的包、法律体系),查标页提示「重新检查后生效」(PI5) */
basis_changed?: boolean;
/** @description 查了什么、没查什么(报告首页、查标页顶部,FR-M3-09、m3-plan §2.5)。认不出、查不了、没查的都写在这里,不静默跳过。
* */
coverage?: {
checked?: string[];
not_checked?: string[];
/** @description 本次检查的投标分册;没有文字层(扫描件)的页码 */
documents?: {
id?: components["schemas"]["Id"];
label?: string;
pages?: number;
pages_without_text?: number[];
chars?: number;
}[];
/** @description 清单项条数:正式清单、本次查了的、待确认区、不在所投包、没完成判断、证据没通过校验 */
items?: {
formal?: number;
checked?: number;
pending_zone?: number;
other_lot?: number;
undetermined?: number;
evidence_unverified?: number;
};
checklist_confirmed?: boolean;
legal_regime?: {
value?: components["schemas"]["LegalRegime"];
/** @description 这套法律体系的规则是否经过样本验证(招标投标体系暂无样本) */
rules_verified?: boolean;
};
rule_set_version?: string;
/** @description 资质匹配的计数(qualification-plan §3.4):资质库条数、核对的资质要求、按资质库判断的、没认出类别的、排除的 */
qualification?: Record<string, never>;
/** @description 检查时用的项目依据(PI5):deadline_at、ceiling_total、legal_regime 各为 {value, source},lots 是所投各包 {lot_no, ceiling_amount, source}。报告按它写 */
basis?: Record<string, never>;
prompt_versions?: Record<string, never>;
tokens?: {
in?: number;
out?: number;
};
model_calls?: number;
/** @description 证据没通过校验的条目数,按原因码计 */
verify_failures?: {
[key: string]: number;
};
} | null;
counts?: {
fatal?: number;
important?: number;
hint?: number;
open_fatal?: number;
resolved_this_run?: number;
new?: number;
} | null;
created_by: components["schemas"]["UserRef"];
created_at: components["schemas"]["Timestamp"];
finished_at?: components["schemas"]["Timestamp"] | null;
};
Finding: {
id: components["schemas"]["Id"];
type: components["schemas"]["FindingType"];
severity: components["schemas"]["Severity"];
title: string;
explanation: string;
/** @enum {string} */
detector: "ai" | "rule";
/** @description AI 判断的问题必有;规则问题没有对应条目时为 null,显示 rule(DM6) */
checklist_item?: {
id?: components["schemas"]["Id"];
title?: string;
importance?: components["schemas"]["Importance"];
categories?: components["schemas"]["Category"][];
} | null;
/** @description 规则问题的规则编号和说明(detector = rule 时有);资质匹配的问题同时挂清单项 */
rule?: {
code?: string;
description?: string;
} | null;
/** @description 按类型的补充信息:参数的要求值和响应值、从投标文件读到的金额;资质问题(type = qualification)有 kind(expired / level_low / not_covered)、source(bid_text / library)、deadline,issues[] 里 source = library 的带 library(资质库记录的快照:id、name、kind、level、cert_no、valid_to),界面显示为「依据:资质库记录」 */
detail?: Record<string, never>;
tender_citations: components["schemas"]["Citation"][];
bid_citations: components["schemas"]["Citation"][];
/** @description 「未找到响应」时找过哪些分册、哪些章节(FR-M3-03) */
search_scope?: {
documents?: string[];
sections?: string[];
} | null;
/** @description 同一次检查里问题类型相同、要求原文完全相同的其他问题(清单里重复出现的要求,决策 C5 修订:各自判断,界面折叠显示) */
duplicate_ids?: components["schemas"]["Id"][];
presence: components["schemas"]["Presence"];
/** @description 沿用时,上一次的处理状态(上次「已修改」的这次回到待处理) */
carried_status?: components["schemas"]["FindingStatus"] | null;
status: components["schemas"]["FindingStatus"];
resolution_note?: string | null;
resolved_by?: components["schemas"]["UserRef"] | null;
resolved_at?: components["schemas"]["Timestamp"] | null;
};
ResponseMode: {
/** @enum {string} */
category: "technical" | "commercial";
/**
* @description 逐条响应 / 默认接受(只列偏离)
* @enum {string}
*/
mode: "explicit" | "implicit";
/**
* @description 写明了 / 两处写法冲突(按逐条处理)/ 没写明(按逐条处理)
* @enum {string}
*/
status: "found" | "conflict" | "unknown";
/** @enum {string} */
origin: "rule" | "human";
citations: components["schemas"]["Citation"][];
set_by?: components["schemas"]["UserRef"] | null;
set_at?: components["schemas"]["Timestamp"] | null;
};
CheckItemResult: {
checklist_item_id: components["schemas"]["Id"];
title?: string | null;
/**
* @description 已响应 / 未找到 / 负偏离未说明 / 疑似不满足 / 未给出具体值 / 未判定(模型漏答或暂时不可用)/ 扫描件请人工核对 /
* 按招标文件默认接受(未列入偏离表的视为接受,不出问题)/ 默认接受的实质性要求、请人工核对(C12)。
* 没有校验通过的投标侧证据,不会是 responded(架构 §3.6)
*
* @enum {string}
*/
verdict: "responded" | "not_found" | "negative_deviation" | "suspected_unmet" | "no_value" | "undetermined" | "scanned" | "implicit_accepted" | "implicit_review";
/**
* @description 结论来自哪一层(m3-plan §2.1;presence 是按文件在不在判断)
* @enum {string}
*/
layer: "deviation_table" | "rule_compare" | "model" | "retrieval" | "presence";
/** @enum {string} */
evidence_status: "verified" | "unverified" | "none";
/** @description 证据没通过、漏答、模型错误等的原因码 */
reason_code?: string | null;
bid_citations: components["schemas"]["Citation"][];
/** @description 响应值、模型指的页码、找过哪些分册 */
detail: Record<string, never>;
/** @description 24 小时内复查时沿用了上一次的结论(C2) */
reused: boolean;
};
ManualCheck: {
/** @description rule:MANUAL.<主题>:SUBMIT、SIGN_ENCRYPT、DECRYPT、PAPER、DEPOSIT */
check_key: string;
label: string;
/** @description 代表这一主题的清单条目标题 */
requirement_text?: string | null;
/** @description 同一主题的清单条目(公告、须知、无效情形里常各写一遍,按主题合并成一条核对) */
related_items?: {
id: components["schemas"]["Id"];
title: string;
}[];
citation?: components["schemas"]["Citation"] | null;
checked: boolean;
note?: string | null;
checked_by?: components["schemas"]["UserRef"] | null;
checked_at?: components["schemas"]["Timestamp"] | null;
};
ReportJob: {
id: components["schemas"]["Id"];
check_run_id: components["schemas"]["Id"];
status: components["schemas"]["JobStatus"];
report_id?: components["schemas"]["Id"] | null;
error?: components["schemas"]["JobError"] | null;
};
Report: {
id: components["schemas"]["Id"];
check_run_id: components["schemas"]["Id"];
run_no: number;
page_count: number;
sha256?: string;
template_version: string;
/** @description 生成时还没处理的致命问题数 */
open_fatal_at_export?: number;
generated_by: components["schemas"]["UserRef"];
created_at: components["schemas"]["Timestamp"];
};
QualificationInput: {
name: string;
kind: components["schemas"]["QualificationKind"];
level?: string | null;
/** @description 界面上必填(查标时用它核对附件),接口可空,以后批量导入时不一定读得全 */
cert_no?: string | null;
issuer?: string | null;
/** @description 证书主体(企业名、著作权人、持证人) */
holder?: string | null;
/** Format: date */
valid_from?: string | null;
/**
* Format: date
* @description 空表示长期有效;要晚于 valid_from
*/
valid_to?: string | null;
};
/** @description 新增、修改资质。从识别结果保存时带上 scan:记下识别值,原件挂成附件(同一个原件不重复挂) */
QualificationSave: components["schemas"]["QualificationInput"] & {
scan?: {
scan_id: components["schemas"]["Id"];
/** @description 识别结果里的第几张证书(从 0 数) */
index: number;
} | null;
};
/** @description 一次证书识别(vision-plan 第 2 步)。没保存的 24 小时后删除 */
QualificationScan: {
id: components["schemas"]["Id"];
filename: string;
/** @enum {string} */
status: "queued" | "running" | "succeeded" | "failed";
error: null | components["schemas"]["ScanError"];
pages: {
page: number;
/** @description 识别用的页面图宽(像素),高亮框按它换算成比例 */
width: number;
height: number;
/** @description OCR 转正用的角度(0 / 90 / 180 / 270) */
rotation: number;
/** @description 页面图的短时签名地址 */
url: string;
}[];
certificates: components["schemas"]["ScanCertificate"][];
created_at: components["schemas"]["Timestamp"];
};
ScanError: {
code: string;
message: string;
};
ScanCertificate: {
page: number;
/** @enum {string} */
category: "enterprise_qualification" | "system_cert" | "software_copyright" | "product" | "personnel" | "business_license" | "other";
kind: components["schemas"]["QualificationKind"];
/** @description 建议的资质名称:证书标题,后面括注软件名或专业 */
name: string;
/**
* @description 证书编号取哪个字段(软著取登记号)
* @enum {string}
*/
cert_no_field: "cert_no" | "reg_no";
/** @description 字段名 → 识别结果。name、holder、level、specialty、software、cert_no、reg_no、issuer、issued_on、valid_from、valid_to、validity_text */
fields: {
[key: string]: components["schemas"]["ScanField"];
};
/** @description 证书上有、但被打码或看不清的字段,要手动填写 */
masked: string[];
/** @description 推算的建议值,用户点了才填。valid_to:证书只写了有效期长度(如「五年」)时按发证日期推算 */
suggest: {
/** Format: date */
valid_to?: string;
};
notes: {
/** @enum {string} */
code: "personnel" | "product" | "business_license" | "holder_mismatch";
holder?: string;
tenant?: string;
}[];
/** @description 资质库里证书编号相同的一条(换证时建议更新它) */
existing: null | {
id: components["schemas"]["Id"];
name: string;
};
};
ScanField: {
/** @description 证书上的原样文字 */
value: string;
/**
* @description ok / date_ok 才自动填;low_conf(马赛克、模糊)、mismatch(识别结果和 OCR 对不上)等只作建议
* @enum {string}
*/
check: "ok" | "date_ok" | "low_conf" | "mismatch" | "bad_line" | "bad_format";
/**
* Format: date
* @description 日期字段换算成的日期
*/
day?: string;
/** @description 所引 OCR 行在页面图上的位置(像素)[x0, y0, x1, y1] */
boxes: number[][];
};
Qualification: components["schemas"]["QualificationInput"] & {
id: components["schemas"]["Id"];
/** @description 是从识别结果保存的(识别值留痕) */
recognized: boolean;
files: {
id: components["schemas"]["Id"];
filename: string;
size_bytes: number;
}[];
/** @description 进行中的项目(跟进中、编制中、已检查,截止日不早于今天)里,投标截止日晚于「有效期至」的项目。到期按每个项目的截止日判断,不按今天 */
late_for: {
project_id: components["schemas"]["Id"];
name: string;
/** Format: date */
deadline: string;
}[];
created_at: components["schemas"]["Timestamp"];
updated_at: components["schemas"]["Timestamp"];
};
Notification: {
id: components["schemas"]["Id"];
/** @enum {string} */
kind: "parse_succeeded" | "parse_failed" | "check_succeeded" | "check_failed" | "report_succeeded" | "report_failed" | "quota_80" | "quota_100" | "subscription_activated" | "subscription_expiring" | "subscription_expired" | "activation_rejected";
title: string;
project_id?: components["schemas"]["Id"] | null;
project_name?: string | null;
/** @description 前端路由,如 /projects/<id>/results、/quota */
link?: string | null;
read_at?: components["schemas"]["Timestamp"] | null;
created_at: components["schemas"]["Timestamp"];
};
Event: {
/** @enum {string} */
type: "job.progress" | "job.finished" | "report.ready" | "notification.created" | "quota.changed" | "project.changed" | "resync";
at: components["schemas"]["Timestamp"];
project_id?: components["schemas"]["Id"] | null;
job?: {
/** @enum {string} */
kind?: "parse_job" | "check_run" | "report_job";
id?: components["schemas"]["Id"];
status?: components["schemas"]["JobStatus"];
stage?: string | null;
progress?: number;
} | null;
notification_id?: components["schemas"]["Id"] | null;
};
FeedbackCreate: {
project_id: components["schemas"]["Id"];
/** @enum {string} */
object_type: "finding" | "checklist_item" | "checklist";
object_id?: components["schemas"]["Id"];
/** @enum {string} */
kind: "false_positive" | "false_negative";
note?: string;
};
};
responses: {
/** @description `unauthenticated`、`session_expired`、`session_revoked`(被其他设备挤下线时附 `reason: concurrent_login`) */
Unauthenticated: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
/** @description `not_found`;访问别的企业的资源也返回这个(架构 §3.3) */
NotFound: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
/** @description `validation_failed`;`errors` 列出每个字段的问题 */
ValidationFailed: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
/** @description `rate_limited`;响应头 Retry-After */
RateLimited: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
/** @description `project_read_only`:项目已递交或已归档,要先撤销 */
ProjectReadOnly: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
/** @description `precondition_failed`:资源已被修改,请刷新后再改 */
PreconditionFailed: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
parameters: {
ProjectId: components["schemas"]["Id"];
DocumentId: components["schemas"]["Id"];
UploadId: components["schemas"]["Id"];
JobId: components["schemas"]["Id"];
RunId: components["schemas"]["Id"];
ItemId: components["schemas"]["Id"];
FindingId: components["schemas"]["Id"];
QualificationId: components["schemas"]["Id"];
SessionId: components["schemas"]["Id"];
/** @description 上一页返回的 next_cursor */
Cursor: string;
Limit: number;
/** @description 选填;带上时版本不一致返回 412(多人编辑时防止覆盖) */
IfMatch: string;
};
requestBodies: never;
headers: {
/** @description 网页版登录时设置 `bd_session`(HttpOnly)和 `bd_csrf`(前端可读) */
SetSessionCookie: string;
/** @description 资源版本;修改时放进 If-Match */
ETag: string;
};
pathItems: never;
}
export type $defs = Record<string, never>;
export interface operations {
sendSmsCode: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": {
phone: components["schemas"]["Phone"];
/** @enum {string} */
purpose: "login" | "register" | "close_tenant";
};
};
};
responses: {
/** @description 已发送(号码是否注册都返回 202,不泄露注册状态) */
202: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
/** @description 多少秒后可以重发 */
resend_after_s: number;
};
};
};
422: components["responses"]["ValidationFailed"];
429: components["responses"]["RateLimited"];
};
};
register: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["RegisterRequest"];
};
};
responses: {
/** @description 注册成功并登录。网页版设置会话 cookie;桌面版在响应体里拿到令牌(只返回这一次) */
201: {
headers: {
"Set-Cookie": components["headers"]["SetSessionCookie"];
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["LoginResult"];
};
};
/** @description `phone_already_registered` */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
422: components["responses"]["ValidationFailed"];
};
};
login: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["LoginRequest"];
};
};
responses: {
/** @description 登录成功 */
200: {
headers: {
"Set-Cookie": components["headers"]["SetSessionCookie"];
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["LoginResult"];
};
};
/** @description `phone_not_registered`(验证码校验通过后才会返回) */
404: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
/** @description `concurrent_session` */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"] & {
sessions?: components["schemas"]["SessionInfo"][];
};
};
};
422: components["responses"]["ValidationFailed"];
429: components["responses"]["RateLimited"];
};
};
logout: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 已退出 */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
401: components["responses"]["Unauthenticated"];
};
};
getMe: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Me"];
};
};
401: components["responses"]["Unauthenticated"];
};
};
updateMe: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": {
display_name?: string;
};
};
};
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Me"];
};
};
422: components["responses"]["ValidationFailed"];
};
};
listMySessions: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
items: components["schemas"]["SessionInfo"][];
};
};
};
};
};
revokeMySession: {
parameters: {
query?: never;
header?: never;
path: {
session_id: components["parameters"]["SessionId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 已吊销 */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
404: components["responses"]["NotFound"];
};
};
sendMySmsCode: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": {
/** @enum {string} */
purpose: "close_tenant";
};
};
};
responses: {
/** @description 已发送 */
202: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
resend_after_s: number;
};
};
};
429: components["responses"]["RateLimited"];
};
};
closeTenant: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": {
sms_code: string;
confirm_tenant_name: string;
};
};
};
responses: {
/** @description 已受理,后台删除文件 */
202: {
headers: {
[name: string]: unknown;
};
content?: never;
};
422: components["responses"]["ValidationFailed"];
};
};
listPlans: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
items: components["schemas"]["Plan"][];
};
};
};
};
};
getQuota: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["QuotaOverview"];
};
};
};
};
listQuotaEntries: {
parameters: {
query?: {
unit?: components["schemas"]["QuotaUnit"];
project_id?: components["schemas"]["Id"];
/** @description 上一页返回的 next_cursor */
cursor?: components["parameters"]["Cursor"];
limit?: components["parameters"]["Limit"];
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 按时间倒序 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Page"] & {
items: components["schemas"]["QuotaEntry"][];
};
};
};
};
};
listActivationRequests: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
items: components["schemas"]["ActivationRequest"][];
};
};
};
};
};
createActivationRequest: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ActivationRequestCreate"];
};
};
responses: {
/** @description 已提交 */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ActivationRequest"];
};
};
/** @description `activation_pending`:已有一份待处理的申请 */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
422: components["responses"]["ValidationFailed"];
};
};
listProjects: {
parameters: {
query?: {
status?: components["schemas"]["ProjectStatus"][];
deadline_from?: string;
deadline_to?: string;
/** @description 按项目名称、编号、采购人搜索 */
q?: string;
sort?: "deadline" | "-deadline" | "updated" | "-updated";
/** @description 上一页返回的 next_cursor */
cursor?: components["parameters"]["Cursor"];
limit?: components["parameters"]["Limit"];
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Page"] & {
items: components["schemas"]["ProjectListItem"][];
};
};
};
};
};
createProject: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": {
/** @description 选填;不填时为「未命名项目」,解析后按招标文件自动填写 */
name?: string;
};
};
};
responses: {
/** @description 已创建;建项目的人自动成为负责人(AR12) */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ProjectDetail"];
};
};
/** @description `plan_limit_exceeded`:免费版限 1 个项目 */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
getProject: {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
ETag: components["headers"]["ETag"];
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ProjectDetail"];
};
};
404: components["responses"]["NotFound"];
};
};
deleteProject: {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 已删除;对象存储里的文件由后台清理 */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
404: components["responses"]["NotFound"];
};
};
setProjectField: {
parameters: {
query?: never;
header?: {
/** @description 选填;带上时版本不一致返回 412(多人编辑时防止覆盖) */
"If-Match"?: components["parameters"]["IfMatch"];
};
path: {
project_id: components["parameters"]["ProjectId"];
field_key: components["schemas"]["ProjectFieldKey"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": {
value: components["schemas"]["FieldValue"];
};
};
};
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ProjectField"];
};
};
409: components["responses"]["ProjectReadOnly"];
412: components["responses"]["PreconditionFailed"];
422: components["responses"]["ValidationFailed"];
};
};
resolvePendingField: {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
field_key: components["schemas"]["ProjectFieldKey"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": {
accept: boolean;
};
};
};
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ProjectField"];
};
};
/** @description `no_pending_value` 或 `project_read_only` */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
transitionProject: {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": {
/** @enum {string} */
action: "submit" | "unsubmit" | "archive" | "unarchive";
};
};
};
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ProjectDetail"];
};
};
/** @description `invalid_transition` */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
listLots: {
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": {
items: components["schemas"]["Lot"][];
};
};
};
};
};
createLot: {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["LotInput"];
};
};
responses: {
/** @description OK */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Lot"];
};
};
409: components["responses"]["ProjectReadOnly"];
422: components["responses"]["ValidationFailed"];
};
};
setBiddingLots: {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": {
lot_ids: components["schemas"]["Id"][];
};
};
};
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
items: components["schemas"]["Lot"][];
};
};
};
409: components["responses"]["ProjectReadOnly"];
};
};
clearLots: {
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": {
items: components["schemas"]["Lot"][];
};
};
};
409: components["responses"]["ProjectReadOnly"];
};
};
deleteLot: {
parameters: {
query?: never;
header?: never;
path: {
lot_id: components["schemas"]["Id"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 已删除 */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
409: components["responses"]["ProjectReadOnly"];
};
};
updateLot: {
parameters: {
query?: never;
header?: never;
path: {
lot_id: components["schemas"]["Id"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["LotInput"];
};
};
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Lot"];
};
};
409: components["responses"]["ProjectReadOnly"];
422: components["responses"]["ValidationFailed"];
};
};
createUpload: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": {
filename: string;
size_bytes: number;
/** @description 选填;提供时完成上传时校验 */
sha256?: string;
/**
* @description 资质附件只收 PDF、JPG、PNG,单个不超过 20MB
* @enum {string}
*/
purpose: "project_document" | "qualification_file";
};
};
};
responses: {
/** @description OK */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Upload"];
};
};
/** @description `plan_limit_exceeded`:超出单文件大小上限,`detail` 写明上限值 */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
getUpload: {
parameters: {
query?: never;
header?: never;
path: {
upload_id: components["parameters"]["UploadId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Upload"];
};
};
404: components["responses"]["NotFound"];
};
};
abortUpload: {
parameters: {
query?: never;
header?: never;
path: {
upload_id: components["parameters"]["UploadId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 已放弃 */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
putUploadPart: {
parameters: {
query?: never;
header?: never;
path: {
upload_id: components["parameters"]["UploadId"];
part_no: number;
};
cookie?: never;
};
requestBody: {
content: {
"application/octet-stream": string;
};
};
responses: {
/** @description 已收到 */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
404: components["responses"]["NotFound"];
422: components["responses"]["ValidationFailed"];
};
};
completeUpload: {
parameters: {
query?: never;
header?: never;
path: {
upload_id: components["parameters"]["UploadId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["UploadCompleted"];
};
};
/** @description `upload_incomplete` */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
/** @description `file_format_unsupported`、`file_encrypted`、`file_corrupted`、`bid_file_platform_encrypted`、
* `upload_checksum_mismatch`、`plan_limit_exceeded`(页数)
* */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
listDocuments: {
parameters: {
query?: {
role?: components["schemas"]["DocumentRole"];
};
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
items: components["schemas"]["Document"][];
};
};
};
};
};
createDocument: {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["DocumentCreate"];
};
};
responses: {
/** @description OK */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Document"];
};
};
409: components["responses"]["ProjectReadOnly"];
422: components["responses"]["ValidationFailed"];
};
};
getDocument: {
parameters: {
query?: never;
header?: never;
path: {
document_id: components["parameters"]["DocumentId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Document"];
};
};
404: components["responses"]["NotFound"];
};
};
deleteDocument: {
parameters: {
query?: never;
header?: never;
path: {
document_id: components["parameters"]["DocumentId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 已删除 */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description `document_in_use` 或 `project_read_only` */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
getDocumentFileUrl: {
parameters: {
query: {
variant: "normalized" | "original";
};
header?: never;
path: {
document_id: components["parameters"]["DocumentId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["DownloadUrl"];
};
};
/** @description `document_not_ready`:规范化 PDF 还没生成 */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
listDocumentPages: {
parameters: {
query?: never;
header?: never;
path: {
document_id: components["parameters"]["DocumentId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
normalized_sha256: string;
items: components["schemas"]["DocumentPage"][];
};
};
};
};
};
listPageSentences: {
parameters: {
query?: never;
header?: never;
path: {
document_id: components["parameters"]["DocumentId"];
page_no: number;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
items: components["schemas"]["Sentence"][];
};
};
};
404: components["responses"]["NotFound"];
};
};
createCitation: {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CitationCreate"];
};
};
responses: {
/** @description OK */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Citation"];
};
};
/** @description `sentence_not_found`:句子编号不在这份文档里,或不在同一页 */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
startParseJob: {
parameters: {
query?: never;
header?: never;
path: {
document_id: components["parameters"]["DocumentId"];
};
cookie?: never;
};
requestBody?: {
content: {
"application/json": {
/**
* @description 前端提示用户的扣点数;和服务端算的不一致时返回 `billing_changed`(API4)
* @enum {integer}
*/
expected_charge?: 1;
};
};
};
responses: {
/** @description 已排队 */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ParseJob"];
};
};
/** @description `job_already_running`(附 `job_id`)、`quota_exhausted`、`billing_changed`、`document_role_not_parsable` */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
getParseJob: {
parameters: {
query?: never;
header?: never;
path: {
job_id: components["parameters"]["JobId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ParseJob"];
};
};
404: components["responses"]["NotFound"];
};
};
cancelParseJob: {
parameters: {
query?: never;
header?: never;
path: {
job_id: components["parameters"]["JobId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 已受理;worker 在下一个检查点停下 */
202: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ParseJob"];
};
};
/** @description `job_finished` */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
getChecklist: {
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": components["schemas"]["Checklist"];
};
};
404: components["responses"]["NotFound"];
};
};
listChecklistItems: {
parameters: {
query?: {
zone?: components["schemas"]["Zone"];
category?: components["schemas"]["Category"];
/** @description `bidding` = 通用 + 所投的包(默认,FR-M2-04);`all` = 全部 */
lot_scope?: "bidding" | "all";
include_deleted?: boolean;
};
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 按原文顺序 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
items: components["schemas"]["ChecklistItem"][];
/** @description `lot_scope = bidding` 时不在所投包里、没列出的条数 */
hidden_count: number;
};
};
};
};
};
createChecklistItem: {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ChecklistItemCreate"];
};
};
responses: {
/** @description OK */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ChecklistItem"];
};
};
409: components["responses"]["ProjectReadOnly"];
422: components["responses"]["ValidationFailed"];
};
};
getChecklistItem: {
parameters: {
query?: never;
header?: never;
path: {
item_id: components["parameters"]["ItemId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
ETag: components["headers"]["ETag"];
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ChecklistItem"];
};
};
404: components["responses"]["NotFound"];
};
};
deleteChecklistItem: {
parameters: {
query?: never;
header?: never;
path: {
item_id: components["parameters"]["ItemId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 已删除 */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
409: components["responses"]["ProjectReadOnly"];
};
};
updateChecklistItem: {
parameters: {
query?: never;
header?: {
/** @description 选填;带上时版本不一致返回 412(多人编辑时防止覆盖) */
"If-Match"?: components["parameters"]["IfMatch"];
};
path: {
item_id: components["parameters"]["ItemId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ChecklistItemUpdate"];
};
};
responses: {
/** @description OK */
200: {
headers: {
ETag: components["headers"]["ETag"];
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ChecklistItem"];
};
};
409: components["responses"]["ProjectReadOnly"];
412: components["responses"]["PreconditionFailed"];
422: components["responses"]["ValidationFailed"];
};
};
restoreChecklistItem: {
parameters: {
query?: never;
header?: never;
path: {
item_id: components["parameters"]["ItemId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ChecklistItem"];
};
};
};
};
acceptPendingItem: {
parameters: {
query?: never;
header?: never;
path: {
item_id: components["parameters"]["ItemId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": {
citation_ids?: components["schemas"]["Id"][];
/** @default false */
no_citation_ack?: boolean;
changes?: components["schemas"]["ChecklistItemUpdate"];
};
};
};
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ChecklistItem"];
};
};
/** @description `item_not_pending` 或 `project_read_only` */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
/** @description `citation_required`:既没有出处也没有声明无出处 */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
setItemCitations: {
parameters: {
query?: never;
header?: never;
path: {
item_id: components["parameters"]["ItemId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": {
citation_ids: components["schemas"]["Id"][];
};
};
};
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ChecklistItem"];
};
};
409: components["responses"]["ProjectReadOnly"];
};
};
resolveSupersession: {
parameters: {
query?: never;
header?: never;
path: {
item_id: components["parameters"]["ItemId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": {
accept: boolean;
};
};
};
responses: {
/** @description 返回旧条目 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ChecklistItem"];
};
};
/** @description `not_superseded` */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
getItemHistory: {
parameters: {
query?: never;
header?: never;
path: {
item_id: components["parameters"]["ItemId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 按时间倒序 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
items: components["schemas"]["HistoryEntry"][];
};
};
};
};
};
confirmChecklist: {
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": components["schemas"]["Checklist"];
};
};
/** @description `checklist_empty` 或 `project_read_only` */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
setResponseMode: {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
category: "technical" | "commercial";
};
cookie?: never;
};
requestBody: {
content: {
"application/json": {
/** @enum {string} */
mode: "explicit" | "implicit";
};
};
};
responses: {
/** @description 返回清单概况 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Checklist"];
};
};
409: components["responses"]["ProjectReadOnly"];
};
};
listChecklistVersions: {
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": {
items: components["schemas"]["ChecklistVersion"][];
};
};
};
};
};
getCheckPreview: {
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": components["schemas"]["CheckPreview"];
};
};
};
};
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;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 按时间倒序 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
items: components["schemas"]["CheckRun"][];
};
};
};
};
};
startCheckRun: {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["CheckRunCreate"];
};
};
responses: {
/** @description 已排队 */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["CheckRun"];
};
};
/** @description `job_already_running`(附 `job_id`)、`quota_exhausted`、`billing_changed`(附最新的 `preview`)、
* `no_parsed_tender`、`checklist_empty`、`no_bid_documents`、`project_read_only`
* */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
getCheckRun: {
parameters: {
query?: never;
header?: never;
path: {
run_id: components["parameters"]["RunId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["CheckRun"];
};
};
404: components["responses"]["NotFound"];
};
};
cancelCheckRun: {
parameters: {
query?: never;
header?: never;
path: {
run_id: components["parameters"]["RunId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 已受理 */
202: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["CheckRun"];
};
};
/** @description `job_finished` */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
listFindings: {
parameters: {
query?: {
severity?: components["schemas"]["Severity"];
status?: components["schemas"]["FindingStatus"];
presence?: components["schemas"]["Presence"];
};
header?: never;
path: {
run_id: components["parameters"]["RunId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 按级别、再按原文顺序 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
items: components["schemas"]["Finding"][];
};
};
};
};
};
listCheckItemResults: {
parameters: {
query?: never;
header?: never;
path: {
run_id: components["parameters"]["RunId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
items: components["schemas"]["CheckItemResult"][];
};
};
};
404: components["responses"]["NotFound"];
};
};
bulkResolveFindings: {
parameters: {
query?: never;
header?: never;
path: {
run_id: components["parameters"]["RunId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": {
finding_ids: components["schemas"]["Id"][];
/** @enum {string} */
status: "confirmed_ok" | "ignored";
note?: string;
};
};
};
responses: {
/** @description 全部成功才提交,否则一条都不改 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
items: components["schemas"]["Finding"][];
project: components["schemas"]["ProjectReadiness"];
};
};
};
/** @description `run_superseded`、`project_read_only` */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
/** @description `bulk_only_hint`(附不符合的问题编号)、`note_required` */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
resolveFinding: {
parameters: {
query?: never;
header?: never;
path: {
finding_id: components["parameters"]["FindingId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": {
/** @enum {string} */
status: "confirmed_ok" | "modified" | "ignored";
note?: string;
};
};
};
responses: {
/** @description 返回问题和项目最新的就绪状态 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
finding: components["schemas"]["Finding"];
project: components["schemas"]["ProjectReadiness"];
};
};
};
/** @description `run_superseded`、`finding_resolved_this_run`、`project_read_only` */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
/** @description `note_required` */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
reopenFinding: {
parameters: {
query?: never;
header?: never;
path: {
finding_id: components["parameters"]["FindingId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
finding: components["schemas"]["Finding"];
project: components["schemas"]["ProjectReadiness"];
};
};
};
/** @description `run_superseded`、`project_read_only` */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
listManualChecks: {
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": {
items: components["schemas"]["ManualCheck"][];
};
};
};
};
};
setManualCheck: {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": {
/** @description item:<清单项编号> 或 rule:<规则编号> */
check_key: string;
checked: boolean;
note?: string;
};
};
};
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ManualCheck"];
};
};
409: components["responses"]["ProjectReadOnly"];
422: components["responses"]["ValidationFailed"];
};
};
generateReport: {
parameters: {
query?: never;
header?: never;
path: {
run_id: components["parameters"]["RunId"];
};
cookie?: never;
};
requestBody?: {
content: {
"application/json": {
/**
* @description 问题明细带招标、投标两侧出处
* @default true
*/
citations?: boolean;
/**
* @description 附录「需人工核对」
* @default true
*/
manual_checks?: boolean;
};
};
};
responses: {
/** @description 已排队 */
202: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ReportJob"];
};
};
/** @description `run_not_succeeded` */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
getReportJob: {
parameters: {
query?: never;
header?: never;
path: {
job_id: components["parameters"]["JobId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ReportJob"];
};
};
404: components["responses"]["NotFound"];
};
};
listReports: {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 按时间倒序 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
items: components["schemas"]["Report"][];
};
};
};
};
};
getReportFileUrl: {
parameters: {
query?: never;
header?: never;
path: {
report_id: components["schemas"]["Id"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["DownloadUrl"];
};
};
404: components["responses"]["NotFound"];
};
};
listQualifications: {
parameters: {
query?: {
kind?: components["schemas"]["QualificationKind"];
/** @description 按名称、证书编号、发证机构搜索 */
q?: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
items: components["schemas"]["Qualification"][];
};
};
};
};
};
createQualification: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["QualificationSave"];
};
};
responses: {
/** @description OK */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Qualification"];
};
};
422: components["responses"]["ValidationFailed"];
};
};
updateQualification: {
parameters: {
query?: never;
header?: never;
path: {
qualification_id: components["parameters"]["QualificationId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["QualificationSave"];
};
};
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Qualification"];
};
};
404: components["responses"]["NotFound"];
422: components["responses"]["ValidationFailed"];
};
};
deleteQualification: {
parameters: {
query?: never;
header?: never;
path: {
qualification_id: components["parameters"]["QualificationId"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 已删除 */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
attachQualificationFile: {
parameters: {
query?: never;
header?: never;
path: {
qualification_id: components["parameters"]["QualificationId"];
};
cookie?: never;
};
requestBody: {
content: {
"application/json": {
upload_id: components["schemas"]["Id"];
};
};
};
responses: {
/** @description OK */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Qualification"];
};
};
};
};
getQualificationFilePreviews: {
parameters: {
query?: never;
header?: never;
path: {
qualification_id: components["parameters"]["QualificationId"];
file_id: components["schemas"]["Id"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
file_id: components["schemas"]["Id"];
filename: string;
pages: {
page: number;
width: number;
height: number;
/** @description 预览图(JPEG)的短时签名地址 */
url: string;
}[];
};
};
};
};
};
createQualificationScan: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": {
upload_id: components["schemas"]["Id"];
};
};
};
responses: {
/** @description 已排队 */
201: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["QualificationScan"];
};
};
429: components["responses"]["RateLimited"];
/** @description `ocr_unavailable`:扫描件识别服务没有开或连不上,可以先手动填写 */
503: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["Problem"];
};
};
};
};
getQualificationScan: {
parameters: {
query?: never;
header?: never;
path: {
scan_id: components["schemas"]["Id"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["QualificationScan"];
};
};
};
};
deleteQualificationScan: {
parameters: {
query?: never;
header?: never;
path: {
scan_id: components["schemas"]["Id"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 已删除 */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
getQualificationFileUrl: {
parameters: {
query?: never;
header?: never;
path: {
qualification_id: components["parameters"]["QualificationId"];
file_id: components["schemas"]["Id"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["DownloadUrl"];
};
};
};
};
deleteQualificationFile: {
parameters: {
query?: never;
header?: never;
path: {
qualification_id: components["parameters"]["QualificationId"];
file_id: components["schemas"]["Id"];
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 已删除 */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
listNotifications: {
parameters: {
query?: {
unread?: boolean;
/** @description 上一页返回的 next_cursor */
cursor?: components["parameters"]["Cursor"];
limit?: components["parameters"]["Limit"];
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description 按时间倒序 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Page"] & {
unread_count: number;
items: components["schemas"]["Notification"][];
};
};
};
};
};
markNotificationsRead: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: {
content: {
"application/json": {
ids?: components["schemas"]["Id"][];
};
};
};
responses: {
/** @description OK */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
streamEvents: {
parameters: {
query?: never;
header?: {
"Last-Event-ID"?: string;
};
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description `text/event-stream`;`event` 字段是 Event.type,`data` 是 Event 的 JSON */
200: {
headers: {
[name: string]: unknown;
};
content: {
"text/event-stream": components["schemas"]["Event"];
};
};
};
};
createFeedback: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["FeedbackCreate"];
};
};
responses: {
/** @description 已提交 */
201: {
headers: {
[name: string]: unknown;
};
content?: never;
};
422: components["responses"]["ValidationFailed"];
};
};
}