标书生成技能
用户提到生成标书、写投标文件、出投标文件或标书生成时使用。字段说明见 @references/api.md。命令模板见 templates/workflow.sh。生成脚本在 scripts/bid_generation.py,内置分析在 analysis/main.py。
执行流程
在本技能根目录按顺序执行。没有 analysis_uuid 或 bidDocumentId 时,只用内置分析,不要调用其他技能。
- 用户没给出目标字数(万字)和图表数量时,先确认这两项。图表数量只接受
none、normal、abundant。 - 缺少分析结果时先分析招标文件:
python analysis/main.py --file-path "招标文件绝对路径"。从结果读取analysis_uuid和bidDocumentId。 - 触发生成:
python main.py --bid-document-id "BID_DOCUMENT_ID" --analysis-uuid "ANALYSIS_UUID" --word-of-number 10 --degree normal --no-wait - 用上一步返回的
progress_uuid查询进度:python main.py --bid-document-id "BID_DOCUMENT_ID" --progress-uuid "PROGRESS_UUID"。不要用analysis_uuid代替progress_uuid。 - 把脚本 stdout 原样交给用户。完成后文件在本地。余额不足时脚本会自动生成微信支付二维码,把
PAY_QR_MARKDOWN:后面的整行原样发给用户。到账后用同一次生成命令再执行一次。
能力说明
- 支持按
bidDocumentId + analysis_uuid触发标书生成 - progress_uuid 必须来自触发响应:来自触发时返回的
create_response.data;查询进度时使用--progress-uuid,严禁用
analysis_uuid 替代 - 支持两条路径:
--no-wait:仅触发并返回progress_uuid,由外部定时任务/用户在后续对话中轮询直到终态- 默认/
--sync:脚本内部轮询直到FINISH/FINISHED/FAIL/FAILED终态并输出下载链接
- 脚本内置重复触发保护:若文档已存在
bidFilePath会拒绝重复生成;触发接口返回 HTTP 429 则表示任务已在运行中,可直接转入进度查询 - 终态完成时脚本会解密下载地址,并把文件保存到用户桌面,结果中优先给出本地路径(支持多个文件/暗标场景)。不要引导到网盘;只有本地保存失败时才保留在线链接
面向终端用户的表达(默认)
> 默认不要把命令行写给用户。 面向普通业务人员时,只说明要做什么(例如:先完成招标文件分析、准备好投标文档 ID、告知字数与图表偏好、首次需微信扫码、余额不足时扫码支付、生成需等待);不要列出 cd、python main.py、--progress-uuid、--sync 等。
🚫 默认禁止对用户输出: 仓库路径、完整命令行、环境变量名、长步骤代码教程(除非用户明确索要「命令行」「开发者」)。
与「仅输出脚本结果」的关系: 标书进度与下载等 stdout 原文仍须原样展示;衔接话术用自然语言即可。
微信登录认证
- 没有可用 Token 时,运行本技能目录里的
python wx_login.py。几秒内命令结束,浏览器在后台继续等扫码,最长 5 分钟。二维码和这个后台浏览器绑在一起,浏览器一关码就失效。 - 只让用户扫二维码,不要提供浏览器登录链接。有的客户端打不开技能目录里的图片时,按下面顺序给图,不要只发文件路径:
1. 把脚本输出里WECHAT_QR_MARKDOWN:后面的整行原样放进回复。这是内嵌二维码,不依赖用户能不能访问脚本所在磁盘。
2. 本地 PNG 只作为补充。工作目录存在时,脚本还会导出/workspace/微信登录二维码.png。文件卡片如果没有真正预览出来,就不要再靠路径。 - 不要只用读取工具打开这张 PNG。那样只有助手自己看得到,用户看不到。
- 用户用微信扫码后,必须在手机上点「确认登录」。只扫不点等于没登录。用户表示已经扫码后,再执行原来的业务命令。
- Token 写入
~/.taitoubiao/token.json,五个技能共用。5 分钟内不要重复启动登录,否则旧码作废。 - 接口返回登录失效时,会清掉缓存并重新出一张码。自动化请设置
TAITOUBIAO_SKIP_AUTO_LOGIN=1。
余额与付费引导
- 与网页一致:标书生成前,站点会调用主站
checkBalance(resourceType=document或自研 v2 时advDocument)。本技能在触发生成(非仅--progress-uuid查询)前会默认请求TAITOUBIAO_BALANCE_BASE_URL(默认https://taitoubiao.com/db-api,与前端balance.js使用的 axios 根路径/db-api一致)下的/balance/userBalance/checkBalance。 - 退出码:余额不足时脚本会按网页套餐自动生成微信支付二维码(
modelType===3为套餐 2,否则套餐 1),然后退出码为2。把 stdout 里的PAY_QR_MARKDOWN:整行原样发给用户扫码,不要改成浏览器支付链接。若设置了TAITOUBIAO_BALANCE_STRICT=1且余额接口无法给出明确是否充足(预检未完成),退出码为3。 - 环境变量(与前端
VUE_APP_*/ 网关部署对应;充值 / 支付根 URL 代码内已有线上市站默认值,下列变量仅在有自建网关或调试时使用覆盖): TAITOUBIAO_RECHARGE_BASE_URL— 充值订单服务根 URL。TAITOUBIAO_PAY_BASE_URL— 支付中心根 URL。TAITOUBIAO_BALANCE_BASE_URL— 余额接口所在根 URL(可选,默认https://taitoubiao.com/db-api)。TAITOUBIAO_CHECK_BALANCE=0— 关闭触发生成前的余额预检(仅调试或后端不可用)。TAITOUBIAO_BALANCE_STRICT=1— 余额预检不可判定(接口异常或返回不完整)时直接退出(退出码 3),不继续触发生成;不设则为默认行为(stdout 输出# 余额预检未完成说明后继续)。- 命令行生成收款码(可选):在
skills/bid-generation目录下: python3 main.py --payment-guide— 按--model-type默认选择套餐(与网页:modelType===3→ 套餐 2,否则套餐 1)。- 等价:
python3 scripts/payment_guide.py --package-id 1 --channel wx_native(须在上述目录下执行)。 - 二维码默认写入
skills/bid-generation/.cache/recharge-pay-qr.png,请将 PNG 路径告知用户扫码。 - 连通性探测:
python3 main.py --probe-payment— 需有效 Token;充值 / 支付网关默认已内置。 - 仅查询余额(确认支付是否已反映到账):
python3 main.py --check-balance— 调用checkBalance,与触发生成前预检同源;非支付订单轮询。 - 依赖:
requirements.txt含qrcode[pil],用于本地生成 PNG。
对话机器人:充值 / 支付完成后输出约定(固定话术)
以下用于外置对话机器人编排层(易误把余额不足、支付回调延迟、重复出码写在一屏内)。须与上文「仅输出脚本原始结果」一致:事实与链接以脚本 stdout 为准,机器人只加极短过渡句。
用户表示「支付完成 / 已付款」时——固定流程(按顺序,勿跳过逻辑):
- 只做一步:用同一账号 Token 重新执行与此前相同的标书生成命令(含
--sync或进度查询闭环)。不要在同一轮里串联「重新登录 → 再出码 → 再等 10 秒 → 再出码」等多种动作。 - 到账延迟:若脚本仍报余额不足(exit 2)或接口暂不可用,使用固定一句说明即可,例如:「支付到账可能有 1~3 分钟延迟,请稍后只说「继续生成」;无需重复扫码同一订单。」禁止立刻再次调用
--payment-guide生成新二维码,除非用户明确要求「再出一次收款码」。 - 支付是否成功 / 是否已到账:需要确认时,在
skills/bid-generation下执行python3 main.py --check-balance,脚本会重新请求主站checkBalance(resourceType随--model-type:modelType===3→advDocument,否则document,与上文「触发生成前余额预检」一致),依据 stdout 中的# 余额充足/# 余额不足/# 余额预检未完成答复用户。禁止用payment_guide.py --poll轮询支付订单状态作为主要依据;禁止无脚本 stdout 编造到账结论。 - 重新登录:仅当脚本或接口明确返回鉴权失败、或
ensure_token失败时,才引导--wx-login;禁止在支付后「预防性」让用户重新登录。 - 文案长度:余额不足时展示脚本打印的
# 余额不足Markdown 即可;禁止再叠加大段 emoji 表格、重复「套餐说明」、与脚本矛盾的金额/订单号(订单号以当次payment_guidestdout 为准)。
推荐固定短句(可原样使用):
- 支付完成后发起生成:「已按您的付款结果重新触发生成,以下为脚本输出:」→ 附脚本 stdout
- 延迟重试:「若仍提示余额不足,一般为到账延迟,请 2 分钟后回复「继续生成」,无需重复充值。」
- 引导网页兜底(仅此一句,勿展开营销话术):「也可登录 taitoubiao.com 在订单与标书页完成后续操作。」
🚫 输出规范(必须遵守)
> ⚠️ 核心原则:模型必须只输出脚本返回的原始结果,严禁自行生成中间状态消息或进度摘要!
🚫 严格禁止的行为:
- ❌ 禁止额外改写/总结:不得在脚本原文之外生成进度摘要、耗时统计等信息
- ❌ 禁止额外等待提示:不得在脚本原文之外插入等待/轮询安排类的自然语言
- ❌ 禁止自行解释状态:不得在脚本原文之外对状态字段做自然语言解释或翻译
✅ 正确行为:
- 用户侧沟通:见上文「面向终端用户的表达(默认)」— 默认不向用户贴命令行;脚本 stdout(进度、余额提示、下载表等)仍须原样展示。
- 仅输出脚本原始结果:将脚本 stdout 原样展示给用户,不做任何修改或总结(含余额预检阶段输出的
# 余额不足、# 余额预检未完成、# 余额预检跳过等 Markdown) - 终止当前本轮输出:调用脚本后,若结果未完成,则结束本轮技能输出;后续进度查询由外部定时器或用户按规则再次调用脚本发起
- 完成后直接展示下载信息:当脚本返回包含
fileUrlDecrypted时,直接展示下载链接
示例:
❌ 错误输出(AI 自行生成):
⏳ 标书任务进行中:当前状态=生成中,已耗时=180s。
我会在 30s 后进行下一次查询。
✅ 正确输出(脚本原始结果):
# 标书生成进度(单次查询)
- **投标文档ID**:`xxx`
- **状态**:RUNNING
- **预计耗时**:预计约 1 小时内完成(以实际进度为准)
- **进度**:45%
(等待用户再次触发查询获取结果)
或当生成完成时(脚本已自动解密并展示下载链接):
# 标书生成进度(单次查询)
- **投标文档ID**:`xxx`
- **状态**:FINISH
- **预计耗时**:预计约 1 小时内完成(以实际进度为准)
- **进度**:100%
## 📥 标书下载
| 文件类型 | 下载链接 |
|----------|----------|
| 投标文件 | [点击下载](fileUrlDecrypted 解密后的真实 URL) |
下载链接有效期为 30 分钟,过期后需重新获取新链接。
> 注意:脚本内部已自动调用 AES 解密算法将加密的 fileUrl 转换为可用的 fileUrlDecrypted,用户可直接点击下载。
不同模式下的输出区别
本技能支持三种调用模式,输出格式有所差异:
进度查询模式(仅传 --progress-uuid):标题为 # 标书生成进度(单次查询),用于外部定时任务轮询场景。
--no-wait 模式(仅触发):标题为 # 标书生成结果,状态为 started,必须突出展示 progress_uuid
;并在后续步骤中立即使用该 progress_uuid 发起一次进度查询(除非你改用 --sync)。
✅ 正确输出(--no-wait 模式):
# 标书生成结果
- **投标文档ID**:`xxx`
- **状态**:started
- **说明**:已触发标书生成,请稍后查询结果
- **预计耗时**:预计约 1 小时内完成(以实际进度为准)
- **当前进度状态**:`RUNNING`
- **当前进度**:`<currentProgress>%`
- **进度描述**:`<description>`
- **进度任务 UUID**:`<progress_uuid>`
请保存以上进度任务 UUID,用于后续查询进度:
```bash
python ./main.py --bid-document-id "xxx" --progress-uuid "<progress_uuid>" --last-progress 0
> **注意**:`--no-wait` 仅触发生成,此时下载信息尚未就绪;必须使用返回的 `progress_uuid` 查询进度(若仍未完成,则由外部定时器或用户继续按规则查询)。
> 若后续再次触发时后端返回 `HTTP 429`(任务已在运行),脚本会优先从本技能 `analysis/tender_task_map.json` 读取已保存的 `progress_uuid`;若缓存未命中,才会提示查看脚本日志获取。
**`--sync` 模式(同步等待)**:触发后脚本内部轮询,完成后标题为 `# 标书生成结果`,状态为 `generated`。
**无 flag 默认模式**:行为与 `--sync` 完全一致。
或当生成完成时(完整轮询模式,非 `--no-wait`):
标书生成结果
- 投标文档ID:
xxx - 状态:generated
- 说明:标书已生成完成,可通过 fileUrlDecrypted 下载
📥 标书下载
| 文件类型 | 下载链接 |
|---|---|
| 投标文件 | 点击下载 |
下载链接有效期为 30 分钟,过期后需重新获取新链接。
## 使用限制
- 若不存在分析记录(拿不到 `analysis_uuid` 或 `bidDocumentId`),在本技能目录执行内置分析 `python analysis/main.py`,不要调用其他技能
- 生成前必须确认 `bidDocumentId` 与 `analysis_uuid` 对应关系正确
- 若文档已存在 `bidFilePath`(已生成),不得重复触发生成
## 调用方式
**步骤 0 - 检查字数与图表数量参数(强制,必须先确认)**
> **🔴 触发前必须确认:`wordOfNumber`(目标字数)和 `degree`(图表数量)!**
> 如果用户未明确提供这两个参数,**不得直接触发**,必须先输出以下提示并等待用户回复:
>
> ```
> 需要您补充两个投标文件生成的必填参数:
>
> 1. 投标文件目标总字数(单位:万字),例如政务类运维项目通常建议填写 3~5
> 2. 图表数量,可选:
> 适中:默认推荐,图文搭配合理
> 大量:插入较多图表和图片,内容更直观
> 无图表:不使用图表
>
> 请告知您需要的参数值,我将继续为您生成投标文件。
> ```
>
> 用户回复确认后,再执行步骤 1,将确认后的值传入 `--word-of-number` 和 `--degree`。
**步骤 1 - 准备 UUID,并避免重复触发**
- 若用户已经给了 `analysis_uuid` 和 `bidDocumentId`,直接进入生成,不要重复分析
- 若缺少其中任一值:在本技能目录执行内置分析,不要调用名为 tender-analysis 的外部技能
```bash
python analysis/main.py --map-query "/absolute/path/to/tender.pdf"
python analysis/main.py --file-path "/absolute/path/to/tender.pdf"
python analysis/main.py --task-uuid "TASK_UUID" --poll
```
- 内置分析的步骤、分包确认、轮询和结果展示,与原标书分析技能相同,工作目录是本技能下的 `analysis/`
- 从 `# 招标文件分析结果` 中读取:
- 分析任务 UUID(`analysis_uuid`)
- 标书文档 ID(`bidDocumentId`)
- 触发前需避免重复生成:若 `bidFilePath` 已存在,则不要再触发生成(脚本会进行校验并拒绝重复触发)
- 获取到以上两个值后,再执行步骤 2
> **🔴 重要:以下两个 UUID 是不同的,严禁混用!**
> - `analysis_uuid`:来自本技能 `analysis/main.py` 的输出,用于**触发生成**时传入 `--analysis-uuid`
> - `progress_uuid`:来自步骤 1 触发后的返回值 `create_response.data`,用于**查询进度**时传入 `--progress-uuid`
**步骤 1 - 仅触发生成,拿到受理结果**
```bash
python ./main.py --bid-document-id "BID_DOCUMENT_ID" --analysis-uuid "ANALYSIS_UUID" --word-of-number 10 --degree normal --no-wait
步骤 1 返回后,必须从返回字段 create_response.data 中提取 PROGRESS_UUID(即进度任务 UUID)。
并且:脚本已在 --no-wait 触发返回中输出“预计耗时 + 当前进度快照”(best-effort);若仍未完成,则按步骤
2(进度查询)继续调用,或由外部定时任务继续轮询查询。
步骤 2 - 查询进度(两种模式任选其一)
> 🔴 progress_uuid 必须来自步骤 1 的 create_response.data,严禁使用 analysis_uuid!
模式 A - 外部定时任务单次查询(仅传 --progress-uuid):
python ./main.py --bid-document-id "BID_DOCUMENT_ID" --progress-uuid "PROGRESS_UUID" --last-progress <上一次进度值>
- 首次查询时
--last-progress 0,后续每次调用时将上一次返回的进度值传入 - 进入“单次查询模式”的条件:只传
--progress-uuid,不要同时传入--analysis-uuid - 由外部定时任务每 30 秒调用一次
- 最多轮询 1 小时
- 停止条件:
FINISH或FINISHED:停止并展示下载链接(脚本已自动获取)FAIL或FAILED:停止并返回失败(不得继续轮询)
模式 B - 同步等待完成(--sync):
python ./main.py --bid-document-id "BID_DOCUMENT_ID" --analysis-uuid "ANALYSIS_UUID" --word-of-number 10 --degree normal --sync
- 脚本内部自动轮询,直到生成完成或超时
- 轮询间隔 30 秒,超时时间 1 小时
- 完成后直接输出完整结果(含下载链接)
步骤 3 - 生成完成后自动获取下载地址
当脚本状态为 FINISH 或 FINISHED 时,--progress-uuid 和 --sync 模式会自动调用 get_bid_word_info 获取下载地址,无需额外操作。
请求参数(仅触发生成时有效)
> 以下参数用于调用后端 createBidDocument 接口。查询进度模式不需要这些参数。
{
"id": "BID_DOCUMENT_ID",
"ids": [
"ANALYSIS_UUID"
],
"wordOfNumber": 10,
"degree": "normal"
}
id:必填(触发生成时),bidDocumentIdids:必填(触发生成时),ids[0]放分析任务 UUID(如063b5334-af74-4b83-990d-f5e54e69ff88)wordOfNumber:必填(触发生成时),目标字数(单位:万字,支持小数)degree:必填(触发生成时),图表数量控制(normal=适中,abundant=大量,none=无图表)
必填参数确认规则
用户必须传入:
- 目标总字数(单位:万字)
- 图表数量控制(适中 / 大量 / 无图表)
当用户未明确提供以上任一参数时,必须先向用户输出以下提示,确认后再执行:
需要您补充两个投标文件生成的必填参数:
1. 投标文件目标总字数(单位:万字),例如政务类运维项目通常建议填写 3~5
2. 图表数量,可选:
适中:默认推荐,图文搭配合理
大量:插入较多图表和图片,内容更直观
无图表:不使用图表
请告知您需要的参数值,我将继续为您生成投标文件。
生成前若关键信息仍不确定(如文档名称、bidDocumentId、analysis uuid 对应关系不明确),必须先向用户确认:
是否生成《xxx》投标文件?- 用户确认后再触发生成请求
方法内关键校验
- 文档不存在或已有
bidFilePath:拒绝生成(如需重新生成,请先用本技能的analysis/main.py重新分析,再使用新的analysis_uuid和bidDocumentId触发生成) - HTTP 429 防重复计费:若
createBidDocument返回 HTTP
429,表示该文档的生成任务已在运行中。这是服务端防重复计费机制,并非限流。此时不应视为错误,可转为使用--progress-uuid
查询已有任务进度
🔴 状态判定规则(必须遵守)
--progress-uuid 的脚本输出中,status 字段决定后续行为:
-
生成进行中(
status非FINISH/FINISHED,且非FAIL/FAILED)- 必须终止本轮后续查询请求(不得继续发送下一次
--progress-uuid) - 必须让用户看到脚本原文中的进度信息(
currentProgress/description) - 等待外部定时器或用户再次调用脚本发起下一次进度查询
- 必须终止本轮后续查询请求(不得继续发送下一次
-
生成失败(
status = FAIL或status = FAILED)- 必须立即停止后续任何进度查询与轮询
- 不得再发送下一次
--progress-uuid
-
生成完成(
status = FINISH或status = FINISHED)- 必须完整展示脚本返回的下载入口(包含
fileUrlDecrypted) - 必须终止后续进度查询与重复触发生成
- 必须完整展示脚本返回的下载入口(包含
状态查询与完成判定
查询通过脚本执行,传入进度任务 UUID 即可获取当前状态。
重点字段(data 内):
status:进度状态(如START/FINISH/FINISHED/FAIL/FAILED)currentProgress:当前进度值description:进度描述
判定建议:
status = FINISH或FINISHED:✅ 生成完成(停止轮询)- 生成完成后脚本已自动调用
get_bid_word_info并解密,从返回中提取fileUrlDecrypted status = FAIL或FAILED:❌ 标书生成失败(停止轮询,不再继续发送下一次查询)- 其他状态:脚本已输出当前状态;终止本轮后续进度查询,等待外部定时器或用户再次调用脚本发起下一次查询
轮询时长建议
- 推荐轮询间隔:30 秒一次(外部定时器反复执行
--bid-document-id --progress-uuid,不传--analysis-uuid) - 推荐总轮询时长:最多 1 小时(超过后建议停止并提示超时)
- 若 1 小时内未完成,提示用户任务正在进行中,请稍后查看
- 若使用
--sync模式,脚本内部自动轮询,超时时间同样为 1 小时
异常处理约定
- 脚本方法返回非成功状态、401/403、Token 无效:立即返回失败,不继续轮询
- 查询链路失败(
get_progress或get_bid_word_info失败):返回明确错误原因 - 网络超时/连接异常:返回失败并建议重试
失败示例(Token 无效)
❌ 标书生成失败:当前 JWT Token 无效(无法获取公司信息,请联系管理员)。已停止轮询,不再继续等待任务状态。请重新登录获取新 Token 后重试。
内置招标文件分析
分析代码在本技能的 analysis/ 目录,发布本技能时一并带上,不依赖单独安装的标书分析技能。
- 用户只上传招标文件时,先运行
python analysis/main.py - 分析完成后读取
analysis_uuid和bidDocumentId,再运行本目录的python main.py生成 - 用户已经提供这两个编号时,跳过分析,直接生成
可选参数
| 参数 | 说明 | 默认值 |
|---|---|---|
--bid-document-id |
标书文档 ID(必填) | 无 |
--analysis-uuid |
分析任务 UUID(触发生成时必填) | 无 |
--progress-uuid |
进度任务 UUID(仅传此参数时执行单次查询,来自步骤 1 的 create_response.data) |
无 |
--word-of-number |
目标总字数(万字,支持小数,触发生成时必填) | 无 |
--degree |
图表数量控制(normal=适中,abundant=大量,none=无图表,触发生成时必填) | 无 |
--sync |
触发生成并同步轮询直至完成 | 关闭 |
--no-wait |
仅触发,不等待轮询 | 关闭 |
--last-progress |
上一次查询的进度百分比,防止进度回退 | 无 |
--poll-interval |
轮询间隔(秒) | 30 |
--timeout |
总轮询时长(秒),仅 --sync 模式有效 |
3600 |
--check-balance |
仅查询余额是否满足生成(checkBalance;确认到账用,非订单轮询) |
关闭 |
> --model-type 和 --use-default-db 为内部固定配置,不可由用户修改。
结果字段说明
- 查询状态:
progress_response.data.status、progress_response.data.currentProgress、progress_response.data.description - 下载信息:
bid_word_info_response.data[].fileUrlDecrypted(生成完成后,脚本已自动解密;fileUrl为加密原文不可直接使用) - 若下载信息返回
data中包含 2 个 URL,表示当前为暗标场景,通常分别对应:投标文件(主文件)暗标文件(技术部分文件)
- 失败信息:
error或明确失败提示文本
推荐脚本
- 仅触发:
--bid-document-id ... --analysis-uuid ... --word-of-number ... --degree ... --no-wait - 单次查询(供外部定时任务调用):
--bid-document-id ... --progress-uuid ... --last-progress <上一次进度值> - 同步等待:
--bid-document-id ... --analysis-uuid ... --word-of-number ... --degree ... --sync
生成完成后的下载入口
当进度状态为 FINISH 或 FINISHED 时,必须向用户提供下载入口:
- 调用
get_bid_word_info(bidDocumentId)获取fileUrlDecrypted(脚本已自动解密,fileUrl为加密原文不可直接使用) - 若返回 2 个 URL,表示暗标场景:
投标文件(主文件)暗标文件(技术部分文件)
- 展示下载信息表:
示例:
# 标书生成进度(单次查询)
- **投标文档ID**:`xxx`
- **状态**:FINISH
- **进度**:100%
## 📥 标书下载
| 文件类型 | 下载链接 |
|----------|----------|
| 投标文件 | [点击下载](fileUrlDecrypted 解密后的真实 URL) |
下载链接有效期为 30 分钟,过期后需重新获取新链接。
或暗标场景:
## 📥 标书下载
检测到多个文件(暗标场景):
| 文件类型 | 下载链接 |
|----------|----------|
| 投标文件 | [点击下载](fileUrlDecrypted) |
| 暗标文件 | [点击下载](fileUrlDecrypted) |
下载链接有效期为 30 分钟,过期后需重新获取新链接。
> 注意:脚本已自动将加密的 fileUrl 解密为 fileUrlDecrypted,可直接使用。