返回 Skill 列表
extension
分类: 数据与分析无需 API Key

招投标数据挖掘与竞品格局分析

统筹企业全量中标数据的系统化检索、多维拆解与深度挖掘,搭建标准化数据分析逻辑,覆盖市场、竞品、项目、区域、策略五大核心维度。精准研判市场发展趋势、竞争格局变化及业务核心优劣,通过数据归因、趋势预测与对标复盘,输出高价值市场洞察与优化方案。以数据驱动市场战略迭代,精准赋能赛道布局、客户开发、报价优化与资源配置,助力公司抢占市场先机、提升核心市场占有率

person作者: user_c149aa0chubcommunity

中标全景门户扩容 Skill

用途

用户给出时间段企业名单搜索模式,自动完成:调研 → 校验合并 → 全局校验 → 交付。支持任意行业主题。

输入格式

直接输入或文件输入均可,基本格式:

⚠️ 单次最多 10 家企业。超过 10 家时自动分批,提示用户确认。

主题 水利信息化企业
输出标签 山脉科技分析
202601-202606  AAAAA公司  地方龙头企业  ADD
202601-202606  BBBBB公司  信息化央企  ADD
202601-202606  CCCCC公司  地方小企业  ALL

字段说明

| 行类型 | 格式 | 必填 | 说明 | |--------|------|------|------| | 主题行 | 主题 XXX | 否 | 行业/领域名称,用于文件名和页面标题。缺失时从现有门户文件名推断 | | 输出标签行 | 输出标签 XXX | 否 | 指定后输出该企业的专项分析标签页。缺失则不输出企业分析标签 | | 数据行 | 时间段 企业名 分组 模式 | 是 | 每行一家企业,四列:时间段企业全称分组名ADD|ALL。分组必须是 7 大分组之一,或新自定义分组 |

分组可选列表(如未指定则从企业名推断):水利部所属企事业单位、省市所属企事业单位、信息化央企、主板上市企业、水利行业区域性企业、地方龙头水利企业、地方小企业

搜索模式

| 模式 | 含义 | |------|------| | ADD | 增量搜索:在现有数据基础上补充新中标记录,保留旧数据 | | ALL | 全量搜索:清除该企业旧数据,用新搜索结果完全替换 |

时间段转标签

| 输入 | 输出 | |------|------| | YYYY01-YYYY06 | YYYY上半年 | | YYYY07-YYYY12 | YYYY下半年 | | YYYY01-YYYY12 | YYYY全年 | | 其他 | 保持原样 |

文件命名规则

  • 门户文件:{主题}{时间段标签}中标全景.html
  • 页面标题(Hero):{主题}{时间段标签}中标全景
  • Hero 副标题:{时间段中文描述} · {主题}中标全景
  • 搜索关键词:从主题提取核心词(如"水利信息化企业"→"水利信息化")

执行流程(5 阶段)

阶段一:解析输入

  1. 提取主题:有 主题 XXX 行则用之;否则从工作区现有 HTML 文件名推断(正则匹配 {主题}YYYY上半年/下半年中标全景.html);都没有则询问用户
  2. 提取时间段 → 转中文标签 + 搜索描述(如 202601-2026062026上半年 + 2026年1月至2026年6月
  3. 提取企业分析标签:有 输出标签 XXX 行则记录目标企业和标签名
  4. 解析企业名单 + 搜索模式:每行拆分为 (时间段, 企业名, ADD|ALL)
  5. 为每家企业分配元数据:
    • id:拼音首字母缩写,确保全局唯一不与现有冲突
    • name:短名 ≤6 字(从全称截取)
    • short:单字简称
    • loc:省/市(从企业名推断,如"北京恒润安"→北京)
    • tag:≤12 字描述(根据企业类型推断)
    • group:归属分组之一(见"分组体系")
    • color + accent:从色板轮换,不与现有重复
  6. 确认目标 HTML 文件路径

阶段二:并行调研

搜索方法论根因分析(⚠️ 必读,2026-07-28 血泪复盘)

用户指出中水三立实际中标约 1.8 亿,但搜索仅找到 1.5 亿,遗漏约 3000 万。更严重的是,经多源交叉验证后发现:不仅中水三立有遗漏,其他三家企业的数据也未经充分验证。用户原话:"你能不能让人相信,敢不敢相信。"

之前的根因分析说"项目名称不含企业简称所以搜不到"——这是错误的、荒谬的分析。项目名称本来就不应该包含中标企业名称(那才是不正常的),这不是遗漏的原因。以下是系统性的五层根因分析:

根因 1:从未使用专业中标数据库作为参照基准

这是最根本的问题。 存在专业中标聚合数据库(如千里马招标网、标信通等),可以一页列出某企业的全部中标记录(日期+项目名+招标方+金额),是天然的完整性参照基准。但搜索过程中从头到尾没有查阅任何一个专业数据库

正确做法:搜索前先通过搜索引擎 + 专业数据库(千里马招标网、标信通等)建立预期项目数和金额基准,搜索后用多源交叉验证,发现遗漏立即补搜。黑名单限制的是 link 字段(不使用聚合站 URL 作为来源链接),但可以、也必须使用聚合站数据做交叉参照。

根因 2:仅依赖通用搜索引擎(WebSearch)作为唯一数据源

WebSearch 是搜索引擎的封装,返回按 PageRank 排序的结果,不按中标日期或金额排序。搜索引擎对地方公共资源交易中心的公告页面索引覆盖率低、索引滞后。一条在省级公共资源交易中心发布的中标公告,可能要数周甚至数月后才被搜索引擎收录,且搜索排名靠后。

WebSearch 每次返回 10-20 条结果,即使翻 5 页也只有 50-100 条,其中大量是重复/无关内容。而一家半年中标 20-30 个项目的企业,其公告分散在十几个不同省份的采购平台,通用搜索引擎无法穷尽覆盖。

根因 3:无搜索后完整性验证机制

搜索完成后,结果没有与任何外部基准对比。"完整性检查"仅要求"≥3 条就认为正常"——这对半年应中标 20+ 个项目的企业来说标准太低。没有"找到的项目数/金额 vs 预期基准"的覆盖率计算,没有低于阈值自动触发补搜的机制。

根因 4:缺少反向搜索维度

只从企业名出发搜索("企业名+中标/成交/客户名/技术词"),缺少从招标方反向搜索的维度。应该同时搜索主要客户/招标方的采购公告页面,看该客户发布了哪些中标公告,其中是否有目标企业。

根因 5:Agent 搜索行为不可控且无法验证

Agent 声称"搜了 6 轮"、"看了 5 页",但实际可能只搜了 3 轮、看了 2 页就停止。Agent 的搜索行为无法从输出 JSON 验证——只看到最终结果,看不到中间过程。缺少 Agent 必须输出的搜索行为报告(执行了哪些搜索词、每个词看了几页、覆盖了哪些平台)。

搜索策略:参照基准 → 多维搜索 → 交叉验证

原则:搜索前建立参照基准 → 多维度穷尽搜索 → 搜索后用专业数据库交叉验证。三步缺一不可。

Phase 0:参照基准建立(搜索前必做)

在启动调研 Agent 之前,为每家企业建立预期基准:

  1. 多源查询:通过以下渠道搜索企业全称+简称,汇总该企业在目标时间段的中标记录作为参照基准:
    • 搜索引擎(必应/百度):搜索 企业全称 中标,提取前三页的公开中标记录列表
    • 专业中标数据库:如千里马招标网、标信通等
    • 天眼查/企查查中标记录页(可部分预览)
  2. 记录基准值:基准项目数 = 多源汇总去重后的项目数;基准总金额 = 去重后各项目金额之和
  3. 注意金额校准:聚合站有时将多包项目的总金额归到每个中标方名下,需交叉验证实际中标金额
  4. 如多源均无该企业数据:以"企业名+中标"的第一轮粗搜结果作为临时基准

⚠️ 参照基准的作用:不是用来替代搜索引擎搜索(因为聚合站金额可能不准、链接不是原始公告),而是用来验证搜索结果的完整性——如果搜索引擎找到了 12 个项目但基准有 22 个,说明覆盖率只有 55%,必须补搜。

A. 多维度关键词搜索(至少 10 轮)

每家企业必须覆盖以下搜索维度,合计至少 10 轮搜索:

| # | 维度 | 关键词模板 | 说明 | 示例 | |---|------|-----------|------|------| | 1 | 企业名+中标 | 企业全称 中标 / 企业简称 中标 | 最直接搜法 | "中水三立数据技术 中标" / "中水三立 中标" | | 2 | 企业名+成交/采购 | 企业全称 成交公告 / 企业简称 采购 | 覆盖不同阶段公告表述 | "中水三立 成交公告" / "中水三立 采购" | | 3 | 企业名单独搜索 | 企业全称(不加"中标") | 补漏不使用"中标"措辞的公告 | "中水三立数据技术股份有限公司" | | 4 | 企业名+已知主要客户名 | 企业简称 + 客户名 | 反向搜索维度:从客户名查企业 | "中水三立 南水北调" / "中水三立 水利部" / "中水三立 淮河" | | 5 | 企业名+技术/领域词 | 企业简称 + 技术关键词 | 技术性项目名可能很长 | "中水三立 信创" / "中水三立 PLC" / "中水三立 数字航道" | | 6 | 企业名+省份名 | 企业简称 + 省份 | 覆盖跨省项目,31省全覆盖 | "中水三立 湖南" / "中水三立 河南" | | 7 | 企业名+重点城市名 | 企业简称 + 城市名 | ⚠️ 新增:主动覆盖 20 座水利投资密集城市 | "中水三立 成都" / "中水三立 武汉" | | 8 | ctbpsp 法定平台 | WebFetch bulletin.cebpubservice.com 搜企业全称 | ⚠️ P0 必搜:法定义务发布平台 | 直接 WebFetch 搜索页 | | 9 | 行业/央企采购平台 | 按企业类型定向 | 水利行业平台 + 央企采购平台 | WebFetch cweun.org / ecp.sgcc.com.cn / b2b.10086.cn | | 10 | ⭐ 多源交叉验证 | 对比 Phase 0 多源基准列表 | 最关键的完整性保障 | 见 Phase 0 |

B. 多平台覆盖(全国搜索,不限于企业所在地)

⚠️ 核心原则:企业在哪个省注册 ≠ 只在那个省中标。如中水三立(安徽)可能在全国 31 省都有中标项目。搜索绝不限于企业所在省份,必须全国覆盖。

不能只搜一个平台,至少搜索以下渠道:

| # | 渠道 | 覆盖范围 | 搜索方式 | 优先级 | |---|------|---------|---------|--------| | 1 | 中国招标投标公共服务平台 | ⚠️ 全国法定公告 | bulletin.cebpubservice.com / ctbpsp.com 搜索企业全称。法律地位最高——所有依法招标项目(≥400万工程/≥200万货物服务)必须在此公告。⚠️ 每条企业必搜渠道,不能遗漏 | P0 必搜 | | 2 | 必应/百度 | 全国通用 | WebSearch,多关键词组合 | P0 必搜 | | 3 | 全国公共资源交易平台 | 全国 31 省聚合 | ggzyjyw.gov.cn 搜索企业名 | P1 推荐 | | 4 | 中国招标投标网 | 全国法定公告 | chinabidding.com 搜索企业名。与 ctbpsp 互补覆盖,不完全重叠 | P1 推荐 | | 5 | 各省公共资源交易中心 | 31 省逐省覆盖 | ⚠️ 不限于企业所在省份。用 WebSearch 搜索 企业简称 + 省份名 + 中标,31 个省份逐一覆盖。重点关注水利投资大省:广东、江苏、浙江、山东、河南、湖北、湖南、四川、安徽、新疆 | P0 必搜 | | 6 | 重点地市级公共资源交易中心 | 水利投资前 20 城市 | ⚠️ 从被动补搜升级为主动搜索。对每家企业,主动搜索 企业名 + 城市名 + 中标,覆盖以下 20 座水利投资密集城市:成都、武汉、郑州、长沙、广州、合肥、南宁、乌鲁木齐、兰州、西宁、昆明、贵阳、南昌、太原、石家庄、济南、哈尔滨、沈阳、呼和浩特、拉萨 | P0 必搜 | | 7 | 水利行业专属平台 | 水利部/流域委 | 水利部电子招标投标交易平台(直属项目采购)、中国水利工程协会(cweun.org)(行业招投标)、各流域管理机构采购平台(长江委、黄河委、淮河委、海河委、珠江委、松辽委、太湖局) | P1 推荐 | | 8 | 中国政府采购网 | 全国政府采购 | ccgp.gov.cn 搜索企业名 | P1 推荐 | | 9 | 大型央企/国企采购平台 | 央企自采 | 信息化央企和大型企业的增量覆盖渠道。按企业类型定向搜索:中国电建采购平台中国能建电子采购平台国家电网电子商务平台(ECP)中国移动采购与招标网(b2b.10086.cn)南水北调集团采购平台(nsbd.cn)中国联通采购平台中国电信阳光采购网中国铁塔采购平台 | P1 推荐 | | 10 | ⭐ 专业中标聚合数据库(参照) | 全国聚合 | 千里马招标网、标信通等(参照基准,非来源链接) | P1 推荐 |

⚠️ 省份覆盖策略:维度 6(企业名+省份名)搜索时,必须覆盖全部 31 个省级行政区,不能只搜企业所在省份。可按以下优先级分批搜索:

  • 第一批(水利投资大省,必搜):广东、江苏、浙江、山东、河南、湖北、湖南、四川、安徽、新疆
  • 第二批(补充覆盖):河北、山西、内蒙古、辽宁、吉林、黑龙江、福建、江西、广西、海南、贵州、云南、陕西、甘肃、青海、宁夏、西藏、北京、上海、天津、重庆
搜索引擎技巧(提升搜索精度)

搜索引擎使用时有以下技巧,可大幅提高命中率和召回率:

| 技巧 | 语法 | 示例 | 场景 | |------|------|------|------| | 站内搜索 | site:域名 关键词 | site:gov.cn 中水三立 中标 | 限定只搜政府网站 | | 标题限定 | intitle:关键词 | intitle:中标 中水三立 | 只搜标题含"中标"的页面 | | 时间范围 | 搜索引擎时间筛选 | 限定时间范围与目标时间段一致 | 排除过期结果 | | 精确匹配 | "企业全称" | "中水三立数据技术股份有限公司" | 避免搜索引擎分词误匹配 | | 排除词 | -关键词 | 中水三立 -招聘 -天眼查 | 排除干扰结果 | | 组合搜索 | 多种语法嵌套 | site:gov.cn intitle:中标 "中水三立" | 精准命中 |

⚠️ 百度和必应差异:百度对中国地方平台覆盖更好(尤其是省市交易中心的分站),必应对 .gov.cn 索引更全。两者互补使用,不能只搜一个引擎。

关键平台 URL 速查

| 平台 | URL | 说明 | |------|-----|------| | 中国招标投标公共服务平台 | bulletin.cebpubservice.com / ctbpsp.com | ⚠️ 法定义务发布,P0 必搜 | | 中国招标投标网 | chinabidding.com | 全国法定公告,与 ctbpsp 互补 | | 全国公共资源交易平台 | ggzyjyw.gov.cn | 31省聚合入口 | | 中国政府采购网 | ccgp.gov.cn | 全国政府采购 | | 水利工程协会 | cweun.org | 水利行业招投标 | | 国家电网 ECP | ecp.sgcc.com.cn | 电力水利信息化项目 | | 中移动采购与招标 | b2b.10086.cn | 移动信息化项目 | | 南水北调集团采购 | nsbd.cn | 南水北调信息化项目 |

客户清单推导方法(系统化"客户官网"搜索)

不再模糊说"搜企业主要客户官网"——改为从数据推导客户清单

  1. Phase 0 基准提取:从多源参照基准中,汇总该企业常见的招标方(buyer)列表
  2. 行业特征推断:根据企业分组(如信息化央企→央企采购平台;水利施工→水利部/流域委)推断典型客户
  3. 客户采购平台定向搜索:针对 TOP5 客户,搜索 客户名 + 采购平台客户名 + 招标公告,找到其发布采购公告的自有平台 URL,然后在该平台搜索企业名
  4. 典型客户清单(按企业类型):
    • 信息化央企:南水北调集团、水利部、各流域委、各省水利厅、国家电网、中电建、中能建
    • 水利施工企业:各市水利局、水务集团、各省水利投资公司
    • 监测预警企业:各省水文水资源中心、各流域管理机构、各地市应急管理局
C. 并行调度策略

输入限制:单次最多 10 家企业。超过 10 家时提示用户分批输入。

并行规则

  • 1-2 家企业:主 Agent 直接搜索,不需要子 Agent
  • ≥3 家企业必须启动多个子 Agent 并行工作,每家企业分配一个独立子 Agent
  • 子 Agent 类型:使用 Agent 工具,subagent_type: "general-purpose"run_in_background: true
  • 每个子 Agent 负责一家企业的完整调研流程(Phase 0 参照基准 → 7 维度搜索 → 完整性验证)
  • 所有子 Agent 并行执行,主 Agent 等待全部返回后汇总

调度示例(5 家企业):

主 Agent 解析输入 → 为 5 家企业分别建立 Phase 0 参照基准
→ 同时启动 5 个子 Agent(每个负责 1 家)
→ 5 个子 Agent 并行搜索(各跑 7 维度)
→ 全部返回后逐个验证覆盖率
→ 不达标的触发补搜
→ 汇总合并
D. 地市级公共资源交易中心(⚠️ 主动搜索,非被动补搜)

全国有 334 个地级市,逐个搜索不现实。但大量市县项目只在地市级平台发布,不上传省级平台,搜索引擎也未必及时收录。仅靠"线索驱动补搜"会遗漏大量项目。

策略升级:从"线索驱动被动补搜"升级为主动覆盖重点城市

  1. 重点城市主动搜索(必做):对每家企业,用 WebSearch 搜索 企业简称 + 城市名 + 中标,主动覆盖以下 20 座水利投资密集城市:

    • 成都、武汉、郑州、长沙、广州、合肥、南宁、乌鲁木齐、兰州、西宁
    • 昆明、贵阳、南昌、太原、石家庄、济南、哈尔滨、沈阳、呼和浩特、拉萨
  2. 线索驱动补充:以下情况追加搜索:

    • 多源基准中发现某市项目线索(如"XX市水利局")但找不到原始公告链接
    • 项目名中出现非重点城市名 → 定向搜索该市公共资源交易中心
  3. 操作方式

    • WebSearch:企业简称 + 城市名 + 中标公告(每城市一轮)
    • 或直接 WebFetch 该城市公共资源交易中心网站搜索(URL 格式通常为 {城市拼音}ggzy.gov.cnggzy.{城市缩写}.gov.cn
E. 搜索结果穷尽

每个 Agent 必须看完至少前 5 页搜索结果(50+ 条),不要只看第一页就停止。大客户/技术词维度的搜索结果可能出现在第 3-5 页。

F. ⚠️ 回归校验(ALL 模式必做)

当 ALL 模式重搜某企业时,必须执行以下回归校验:

  1. 读取旧数据:在启动调研 Agent 前,读取该企业上一版的 JSON 数据文件(如 zssl_data.json),提取项目列表和总金额作为基准
  2. 对比新 vs 旧:Agent 返回新数据后,逐条比对:
    • 旧数据中的项目是否都在新数据中?(按项目名模糊匹配)
    • 新数据项目数 ≥ 旧数据项目数?(允许因去重/日期过滤略减,但减幅 ≤ 20%)
    • 新数据总金额 ≥ 旧数据总金额 × 0.9?(允许小幅波动,但不应大幅缩水)
  3. 补搜触发条件(任一满足即补搜):
    • 旧数据中有项目在新数据中找不到匹配(按项目名关键词 ≥ 60% 相似度匹配)
    • 新数据项目数 < 旧数据项目数 × 0.8
    • 新数据总金额 < 旧数据总金额 × 0.9
  4. 补搜策略:针对丢失的项目,用"企业名+该项目关键词"定向搜索,确保找回
G. 大单专项交叉验证

调研完成后,额外执行一轮大单专项搜索:

  • 搜索 企业简称 + 千万 / 大标 / 大额中标
  • 检查是否存在 ≥ 500 万但未在结果中的项目
  • 如发现遗漏,立即补录
Phase 2.5:搜索后完整性验证(必做,Agent 返回数据后)

Agent 返回 JSON 数据后、合并到门户之前,必须执行完整性验证:

  1. 对比 Phase 0 基准:将 Agent 返回的项目列表与 Phase 0 建立的多源基准列表逐条比对
  2. 计算覆盖率
    • 项目覆盖率 = 已找到的项目数 / 基准项目数
    • 金额覆盖率 = 已找到的总金额 / 基准总金额
  3. 补搜触发条件(任一满足即必须补搜):
    • 项目覆盖率 < 80%
    • 金额覆盖率 < 80%
    • 基准列表中有 ≥ 500 万的项目未在搜索结果中找到
  4. 补搜策略
    • 从基准列表中提取遗漏项目的关键信息(项目名、招标方、金额)
    • 用"企业名+遗漏项目关键词"定向搜索,找到原始公告链接
    • 通过搜索引擎用"企业名+遗漏项目关键词"定向搜索,找到原始公告链接
  5. 验证报告:补搜完成后,输出覆盖率报告:
    企业:中水三立数据技术股份有限公司
    基准项目数:22 / 基准总金额:约18000万(多源汇总)
    搜索找到:18个 / 15200万
    覆盖率:项目 82% / 金额 84%
    补搜后:22个 / 18000万
    覆盖率:项目 100% / 金额 100%
    

Agent prompt 关键约束

发给每个调研 Agent 的 prompt 必须包含以下完整内容:

你正在调研企业【企业全称】在【搜索描述】期间的中标记录。

## 参照基准(已知信息)

根据多源查询汇总,该企业在该时间段内预计有约【X】个中标项目,总金额约【Y】万元。你的搜索结果必须覆盖至少 80% 的项目和金额。如果你找到的项目数或金额远低于基准,必须继续搜索。

【此处列出多源基准列表中的项目名+金额,供 Agent 参照对比】

## 搜索要求(必须穷尽搜索)

### 搜索平台(10 大渠道,缺一不可)

⚠️ 以下渠道按优先级排列,P0 标注的渠道每条企业必搜,不可跳过:

| 优先级 | 渠道 | 搜索方式 |
|--------|------|---------|
| **P0** | ctbpsp.com | WebFetch `bulletin.cebpubservice.com` 搜索企业全称 |
| **P0** | 必应/百度 | WebSearch `"企业全称" 中标`、`intitle:中标 企业简称`、`site:gov.cn 企业简称 中标` |
| **P0** | 31 省公共资源交易中心 | WebSearch `企业简称 + 省份名 + 中标`,各省逐一覆盖,不限于企业所在省 |
| **P0** | 重点 20 城市 | WebSearch `企业简称 + 城市名 + 中标`,覆盖成都/武汉/郑州/长沙/广州/合肥/南宁/乌鲁木齐/兰州/西宁/昆明/贵阳/南昌/太原/石家庄/济南/哈尔滨/沈阳/呼和浩特/拉萨 |
| P1 | chinabidding.com | WebFetch `chinabidding.com` 搜索企业全称 |
| P1 | 水利行业平台 | 水利部电子招标投标交易平台、cweun.org、各流域委采购平台 |
| P1 | 央企采购平台 | 按企业类型定向:中电建/中能建/国网ECP/中移动b2b/南水北调nsbd |
| P1 | ccgp.gov.cn | WebFetch `ccgp.gov.cn` 搜索企业名 |
| P1 | 千里马/剑鱼等数据库 | WebSearch `site:qianlima.com 企业名` 等 |
| P1 | 客户采购平台 | 从 Phase 0 客户清单推导,定向搜索 TOP5 客户的自有采购平台 |

### 搜索引擎技巧(必须使用)
- `site:gov.cn "企业全称" 中标` — 只搜政府网站,排除商业聚合站
- `intitle:中标 企业简称` — 只搜标题含"中标"的结果
- `"企业全称"` — 精确匹配,避免搜索引擎分词误匹配
- `企业简称 -招聘 -天眼查 -企查查` — 排除干扰结果
- ⚠️ 百度对中国地方平台覆盖更好,必应对 .gov.cn 索引更全。两者互补使用

### 搜索维度(10 个维度,缺一不可)

维度1 - 企业名+中标:
  "企业全称 中标" / "企业简称 中标" / "企业简称 中标公告"

维度2 - 企业名+成交/采购:
  "企业全称 成交公告" / "企业简称 采购" / "企业全称 招标"

维度3 - 企业名单独搜索(不加"中标"):
  "企业全称"(补漏不使用"中标"措辞的公告)

维度4 - 企业名+已知主要客户名:
  搜索 "企业简称 + 客户名" 组合。已知主要客户包括:
  【此处列出该企业已知的主要客户/招标方,如南水北调集团、水利部、各省水利厅等】
  示例:"中水三立 南水北调" / "中水三立 水利部" / "中水三立 淮河"

维度5 - 企业名+技术/领域词:
  搜索 "企业简称 + 技术关键词" 组合。技术关键词包括:
  信创 / PLC / 数字孪生 / 数字航道 / 智慧水利 / 自动化 / 闸站监控 /
  监测预警 / 数据治理 / 劳务外包 / 运维 / 四预 / 水利信息化
  示例:"中水三立 信创" / "中水三立 PLC" / "中水三立 数字航道"

维度6 - 企业名+省份名(⚠️ 全国31省覆盖,不限于企业所在省):
  搜索 "企业简称 + 省份" 组合。企业可能在全国任何省份中标,不限于注册地。
  必须覆盖全部 31 个省级行政区,分两批搜索:
  第一批(水利投资大省,必搜):广东、江苏、浙江、山东、河南、湖北、湖南、四川、安徽、新疆
  第二批(补充覆盖):其余 21 个省级行政区
  示例:"中水三立 湖南" / "中水三立 河南" / "中水三立 新疆" / "中水三立 广东"

维度7 - 企业名+重点城市名(⚠️ P0 必搜,20 座城市):
  搜索 "企业简称 + 城市名 + 中标",主动覆盖 20 座水利投资密集城市:
  成都、武汉、郑州、长沙、广州、合肥、南宁、乌鲁木齐、兰州、西宁、
  昆明、贵阳、南昌、太原、石家庄、济南、哈尔滨、沈阳、呼和浩特、拉萨
  示例:"中水三立 成都 中标" / "中水三立 武汉 中标"

维度8 - ctbpsp 法定平台(⚠️ P0 必搜):
  直接 WebFetch `bulletin.cebpubservice.com` 搜索企业全称。
  这是国家发改委主管的法定招标公告发布平台,地位高于任何省级平台。
  所有依法必须招标的项目(≥400万工程/≥200万货物服务)必须在此公告。

维度9 - 行业/央企采购平台(按企业类型定向):
  水利行业平台:水利部电子招标投标交易平台、cweun.org、长江委/黄河委/淮河委采购平台
  央企采购平台(如适用):国家电网ECP(ecp.sgcc.com.cn)、中移动采购(b2b.10086.cn)、
  中电建采购平台、中能建电子采购平台、南水北调集团(nsbd.cn)
  搜索方式:WebFetch 平台搜索页搜企业全称

维度10 - 参照基准对比(必做):
  将搜索结果与上面的参照基准列表逐条对比。
  基准列表中有但你没搜到的项目,用"企业名+该项目关键词"定向补搜。
  确保覆盖率 ≥ 80%,否则继续搜索。

### 搜索深度
- 每轮搜索必须看完前 5 页结果(50+ 条),不能只看第一页
- 每条搜索结果都点进公告详情页核对,不能只看摘要
- P0 渠道(ctbpsp/必应百度/31省/20城)每条企业必搜,不可跳过
- 搜索引擎使用语法技巧:`site:gov.cn`、`intitle:中标`、`"企业全称"` 精确匹配、`-招聘 -天眼查` 排除干扰
- 百度对中国地方平台覆盖更好,必应对 .gov.cn 索引更全,两者互补使用

### 链接精确
每条记录 link 必须是具体公告页 URL(含公告 ID),不能是:
- 搜索引擎结果页 / 列表页 / 聚合页
- 公司主页(天眼查/企查查/爱企查公司页)
- 电梯中标网 / 水利招标网 列表页 / 其他中标聚合页

### 类型鉴别
中标候选人公示 ≠ 中标结果公告。非第一候选人 → 不录入

### 数据完整
每条记录必须有:项目全名(name)、省份(prov)、金额(amt)、日期(date)、来源链接(link)

### 金额格式
万元为单位,非数值写作"未披露"。注意:聚合站可能将多包项目总金额归到每个中标方名下,必须交叉验证实际中标金额(点开原始公告页核对)。

### 去重
同名同金额记录只保留信息最完整的一条

### 输出格式
严格 JSON 数组,每条记录包含所有字段,可被 json.loads() 解析

### ascii 直引号
项目名中所有 " → 替换为「」

### 完整性报告(必须在 JSON 中包含)
在 JSON 输出中增加 "coverage_report" 字段:
```json
{
  "company_info": {...},
  "项目列表": [...],
  "coverage_report": {
    "baseline_count": 22,
    "found_count": 18,
    "missing_projects": ["项目名1", "项目名2"],
    "project_coverage": "82%",
    "amount_coverage": "84%",
    "search_rounds_executed": 10,
    "p0_channels_searched": ["ctbpsp", "bing+baidu", "31provinces", "20cities"],
    "p1_channels_searched": ["chinabidding", "cweun", "ecp.sgcc.com.cn", "ccgp.gov.cn"],
    "platforms_searched": ["ctbpsp", "bing", "baidu", "ccgp.gov.cn", "ggzyjyw.cn", "cweun.org", ...]
  }
}

#### 数据输出格式

每条记录:
```json
{
  "name": "完整项目名称",
  "prov": "省/直辖市简称(河北/北京/上海...)",
  "buyer": "招标单位全称",
  "winner": "中标单位全称",
  "amt": 123.45,
  "date": "2026-06-15",
  "type": "tag-xx",
  "typeText": "中文类型",
  "status": "status-done",
  "statusText": "中标结果",
  "link": "https://具体公告页URL",
  "linkText": "来源平台简称(如'全国公共资源交易平台')"
}

搜索质量自检

Agent 完成搜索后,必须自问:

基础质量

  • [ ] 搜索结果是否覆盖了该时间段内该企业的所有中标项目?
  • [ ] 是否搜了全部 10 个维度?
  • [ ] P0 渠道检查:ctbpsp 是否搜索?必应和百度是否都用了?31 省是否全覆盖?20 重点城市是否全部搜过?
  • [ ] 是否看了至少前 5 页搜索结果(共 50+ 条)?
  • [ ] 是否每条记录都点进了公告详情页验证?
  • [ ] 是否使用了搜索引擎语法技巧(site:/intitle:/精确匹配/排除词)?
  • [ ] 是否排除了所有黑名单链接?
  • [ ] 是否识别并排除了非第一候选人公示?
  • [ ] 输出的 JSON 能否被 json.loads() 直接解析?
  • [ ] prov 无"未知"、name 无空串?

⚠️ 全国省份+城市覆盖验证(必做)

  • [ ] 维度 6 是否覆盖了全部 31 个省级行政区(不限于企业所在省)?
  • [ ] 水利投资大省(广东/江苏/浙江/山东/河南/湖北/湖南/四川/安徽/新疆)是否全部搜索?
  • [ ] 维度 7 是否主动覆盖了 20 座水利投资密集城市(不限于企业所在地市)?
  • [ ] 如发现某省/某市有项目但未搜到原始公告,是否定向补搜了该省/地市级公共资源交易中心?

⭐ 参照基准验证(必做,Phase 0 + Phase 2.5)

  • [ ] 搜索前是否通过多源查询(搜索引擎+专业数据库)建立参照基准?
  • [ ] 是否记录了基准项目数和基准总金额?
  • [ ] 搜索后是否将结果与基准逐条对比?
  • [ ] 项目覆盖率是否 ≥ 80%?金额覆盖率是否 ≥ 80%?
  • [ ] 基准中 ≥ 500 万的项目是否全部找到?(未找到的必须补搜)
  • [ ] 是否输出了覆盖率报告(found_count / baseline_count / coverage%)?

⚠️ 回归校验(ALL 模式必做)

  • [ ] 是否读取了该企业上一版 JSON 数据作为基准?
  • [ ] 旧数据中的每个项目是否都能在新数据中找到匹配(按项目名关键词 ≥60% 相似度)?
  • [ ] 新数据项目数 ≥ 旧数据项目数 × 0.8?
  • [ ] 新数据总金额 ≥ 旧数据总金额 × 0.9?
  • [ ] 如有项目丢失,是否已用"企业名+该项目关键词"定向补搜找回?

⚠️ 大单交叉验证

  • [ ] 是否额外执行了"企业简称 + 千万/大额"大单专项搜索?
  • [ ] 所有 ≥ 500 万的项目是否都已收录?
  • [ ] 如发现遗漏的大单,是否已补录?

如任一答案为"否",补搜直到全部满足。

阶段三:数据校验 + 合并

3.1 数据质量校验(合并前)

逐条检查新数据,不合格的修正或丢弃:

  1. prov 不为空:从项目名或链接域名推断省份(如 cq.gov.cn→重庆,hlj.gov.cn→黑龙江)。prov 不能为"未知"
  2. name 不为空:项目名称不能为空字符串
  3. link 有效性验证
    • 排除聚合平台:天眼查公司页、企查查岗位页、水利招标网列表页、爱企查、电梯中标网
    • 逐条点开验证:随机抽查至少 20% 的链接,确保能正常打开且内容匹配
    • 链接不能是 404/空白页/重定向错误页
  4. 金额合理:数字或 "未披露",不能是奇怪字符串。金额数值不能为 0(除非真实披露为 0)
  5. 去重:按 (项目名, 金额) 元组去重,同名同金额保留信息更完整的一条
  6. ⭐ 完整性验证(Phase 2.5,必做):将搜索结果与 Phase 0 多源参照基准逐条比对。计算项目覆盖率和金额覆盖率。覆盖率 < 80% 或基准中 ≥ 500 万的项目缺失 → 必须补搜。补搜后仍无法找到的项目,必须显式告知用户并说明原因
  7. ⚠️ 回归校验(ALL 模式必做):读取该企业上一版 JSON 数据,逐条比对旧数据中的项目是否都在新数据中。如有项目丢失(按项目名关键词 ≥60% 相似度匹配),用"企业名+丢失项目关键词"定向补搜找回。补搜后仍未找回的项目,必须显式告知用户并说明原因
  8. ⚠️ 大单交叉验证:额外搜索"企业简称 + 千万/大额",确保所有 ≥500 万的大项目均已收录

3.2 合并

⚠️ 禁止手动编辑 HTML。必须运行 scripts/rebuild_portal.py 脚本完成合并,不能自己用 Edit 工具或正则表达式修改 HTML——手动编辑极易引入 JS 语法错误,导致首页 Hero 以下空白。

执行步骤

  1. 准备配置:编辑 scripts/rebuild_portal.py 的配置区,填入:

    • THEMEPERIODWORKSPACEPORTAL_LABELSEARCH_DESC
    • NEW_DATA_FILES:调研 Agent 输出的 JSON 文件路径
    • SEARCH_MODE:每家企业 ADD 或 ALL
    • NEW_COMPANIES_ORDER:新企业全名列表
    • NEW_COMPANY_CONFIG:新企业元数据(id/name/short/loc/tag/group/color/accent)
    • ANALYSIS_TAB:如有企业分析标签,填入 {"cid": "标签名"}
  2. 运行脚本

    cd "{WORKSPACE}" && python scripts/rebuild_portal.py
    
  3. 检查脚本输出:确认输出中的 [INFO] 行没有 [ERROR][WARN]。关键输出行:

    • [INFO] 现有企业数: X, 项目数: Y
    • [INFO] 合并后: N家企业, M个项目, Z万元
    • [INFO] 已生成: {路径}
  4. ⚠️ 重建后 HTML 完整性验证(必须在阶段四之前执行)

    • 检查 <script> 标签是否完整(不会被 </script> 中途截断)
    • 检查 const ALL_DATA 是否存在且有数据
    • 检查 const COMPANY_META 是否存在且条目数 = 企业总数
    • 检查 renderFilterBar() 是否在初始化代码中被调用
    • 检查 .main div 和 .filter-bar-wrap 是否完整保留
    • python -c "import json; html=open('{HTML_FILE}','r',encoding='utf-8').read(); ..." 验证 JS 数据段可解析

⚠️ 如果重建后验证失败(脚本报错、HTML 截断、JS 语法错误),不允许直接交付。必须回滚到备份文件,定位根因后重新执行。

阶段四:全局一致性校验

合并后必须全部通过,任一不通过则定位修复后重新校验全部:

| # | 校验项 | 检查方式 | |---|--------|---------| | 1 | ALL_DATA 条目数 = COMPANY_META 条目数 | grep -c "ALL_DATA\[" 对比 COMPANY_META.length | | 2 | "prov":"未知" = 0 | grep -c '"prov":"未知"' | | 3 | "name":"" = 0 | grep -c '"name":""' | | 4 | 无同名+同金额重复 | Python 脚本遍历检查 | | 5 | Hero 三数 = 实际计算值 | Python 脚本求和验证 | | 6 | GLOBAL_TOTAL_AMT/PROJ = 实际计算值 | Python 脚本求和验证 | | 7 | MAX_COUNT = COMPANY_META.length | grep 检查 | | 8 | 页面标题 = {主题}{时间段标签}中标全景 | grep 检查 <title> 和 Hero h1 | | 9 | 企业分析标签(如有)企业数 = COMPANY_META.length | grep 检查,确保动态取值 | | 10 | ⭐ JS 代码完整性 | 验证 <script> 标签未被截断;const ALL_DATA/COMPANY_META 语法正确;renderFilterBar()renderCards() 在初始化中正常调用 | | 11 | ⭐ HTML 结构完整性 | 验证 .main.filter-bar-wrap#cardsGrid.detail-section 等核心 DOM 元素完整存在 |

阶段五:视图验证 + 交付

确认所有视图正常工作:

| 视图 | 关键验证点 | |------|-----------| | 企业卡片 (全部) | 卡片数 = 企业数,按金额降序 | | N 个分组标签 | badge 统计正确,组内过滤正确 | | 企业搜索框 | 输入企业名/省份可正确过滤 | | 企业详情页 | 项目列表按金额降序,排序/筛选正常 | | 千万大单 | 阈值 ≥1000 万,统计卡片+表格正确 | | 五百万大单 | 阈值 ≥500 万,统计卡片+表格正确 | | 省份排名 | 31 省排名正确,"未知"不参与 | | 省份企业排名 | 各省 TOP10 企业+份额进度条正确 | | 企业专项分析 | 仅当指定"输出标签"时存在,全部动态计算。必须包含:核心指标(7卡片)、区域分布、业务类型分布、月度趋势、项目规模分布、核心客户分析、SWOT战略分析、TOP10项目、战略营销发展建议(6条)、综合评估 | | 市场行情分析 | 必须包含:核心指标(6卡片)、市场集中度分析(CR1/CR2/CR4/HHI/市场结构判定)、竞争梯队(头部/腰部/尾部)、区域市场分析(含蓝海/红海标注)、业务赛道分析、月度趋势、战略洞察与建议(6条)、市场综合研判 |

完成后:追加工作日志 → present_files 展示 HTML → 汇总报告


可配置项

分组体系(默认 7 组,可自定义)

默认适用于水利信息化行业。其他行业可根据实际情况自定义分组名和图标:

| 默认 group | 含义 | 图标 | |-------------|------|------| | 水利部所属企事业单位 | 水利部直属科研院所/企业 | 🏛️ | | 省市所属企事业单位 | 省市级水利设计院/企业 | 🏢 | | 信息化央企 | 信息化类央企/国企 | 💻 | | 主板上市企业 | A 股上市的水利信息化企业 | 📈 | | 水利行业区域性企业 | 流域委/区域性水利机构 | 🏞️ | | 地方龙头水利企业 | 区域性水利信息化龙头企业 | 🐉 | | 地方小企业 | 规模较小的水利信息化企业 | 🏪 |

自定义时:在输入中增加 分组 分组A,分组B,分组C 行即可覆盖默认。

类型标签(默认 12 类,可自定义)

| 标签 | 含义 | |------|------| | tag-jk | 监测预警平台 | | tag-yw | 系统运维/实施方案 | | tag-sw | 数字孪生/模型构建 | | tag-sj | 数据治理与集成应用 | | tag-sb | 设备采购安装 | | tag-ny | 农业信息化 | | tag-sy | 小流域四预能力建设 | | tag-kz | 自动化控制 | | tag-zh | 智慧水务/综合 | | tag-kf | 软件开发 | | tag-qt | 其他服务 | | tag-wl | 网络/管线探测 |

自定义时:在输入中增加 类型 标签A=含义A,标签B=含义B 行即可覆盖默认。

颜色色板(10 色轮换,避免与现有企业重复)

| # | color | accent | |---|-------|--------| | 1 | #2563eb | #3b82f6 | | 2 | #0891b2 | #06b6d4 | | 3 | #d97706 | #f59e0b | | 4 | #dc2626 | #ef4444 | | 5 | #7c3aed | #8b5cf6 | | 6 | #059669 | #10b981 | | 7 | #db2777 | #ec4899 | | 8 | #ea580c | #f97316 | | 9 | #4f46e5 | #6366f1 | | 10 | #0d9488 | #14b8a6 |


数据格式

公司元数据

{"id":"拼音缩写","name":"短名≤6字","short":"单字","full":"企业全称","loc":"省市","tag":"≤12字描述","group":"分组名","color":"#hex","accent":"#hex"}

中标记录

{"name":"项目名称","prov":"省份简称","buyer":"招标方","winner":"中标方","amt":金额或"未披露","date":"YYYY-MM-DD","type":"tag-xx","typeText":"中文类型","status":"status-done","statusText":"中标结果","link":"具体公告URL","linkText":"来源简称"}

无效链接黑名单(用于 link 字段,不作为来源链接输出)

以下网站 URL 不能作为 link 字段输出到门户 HTML(因为它们不是原始公告页)。但其中部分可用作参照数据库(见下方):

  • tianyancha.com/company/ — 天眼查公司主页
  • qcc.com/cjoblist/ — 企查查岗位页
  • slzb.net/winner/ — 水利招标网中标列表
  • aiqicha.com/ — 爱企查
  • dtzbw.com/ — 电梯中标网聚合页
  • 任何不带具体公告 ID 的列表/搜索/主页 URL

⭐ 参照数据库(用于完整性验证,非来源链接)

以下数据库 可以且必须 用于搜索前建立基准和搜索后完整性验证,但其 URL 不能 作为 link 字段输出:

| 数据库 | 用途 | 搜索方式 | 特点 | |--------|------|----------|------| | 千里马招标网 | 招标/中标信息聚合 | 搜索引擎 site:qianlima.com 企业名 | 覆盖面广 | | 剑鱼标讯 | 中标信息聚合 | jianyu360.com 搜索企业名 | 水利行业覆盖好 | | 乙方宝 | 中标信息聚合 | yfb360.com 搜索企业名 | 移动端友好 | | 标信通 | 中标信息聚合 | 搜索引擎 site:biaoxintong.com 企业名 | 更新快 | | 中国采购与招标网 | 中标信息聚合 | chinabidding.com.cn 搜索企业名 | 老牌平台 | | 采招网 | 中标信息聚合 | bidcenter.com.cn 搜索企业名 | 聚合覆盖广 | | 天眼查(中标记录页) | 企业中标记录 | 需登录,可部分预览 | 最完整但需付费 |

⚠️ 关键区分:黑名单限制的是 link 字段(门户中点击跳转的链接必须是原始公告页),但参照数据库的数据(项目名、金额、日期)可以用于交叉验证。两者不矛盾。

去重策略

  • 全局按 (项目名, 金额) 元组去重
  • 同名同金额 → 重复,保留信息更完整的一条

CSS 布局约定

宽度对齐(关键)

页面从上到下三层结构:.hero(渐变标题区,全屏宽度)→ .filter-bar(白色 sticky 标签栏)→ #mainContent(内容区)。

关键规则

  • .herowidth: 100%(全屏宽度,深蓝渐变背景撑满),内部 .hero-contentmax-width: 1080px; padding: 0 24px; margin: 0 auto 约束内容宽度
  • .filter-barmax-width: 1080px; margin: 0 auto + sticky(白色标签栏约束宽度,与 hero-content 和下方 main 对齐)
  • #mainContentmax-width: 1080px; margin: 0 auto; padding: 24px(卡片内容区宽度与标签栏一致)

⚠️ 三个可感知内容区域的 max-width 必须一致(均 1080px):.hero-content.filter-bar#mainContent。修改其中一个时,必须同步修改其余两个。


首页标签栏结构

renderFilterBar() 动态生成:

行1: [全部] [搜索框]
行2: [分组1 图标] [分组2 图标] ... [分组N](按总金额降序,自适应换行)
行3: [📋 五百万大单] [💰 千万大单] [🏆 省份排名] [📍 省份企业排名] [企业专项分析(可选)] [📈 市场行情分析]
  • 行3中"企业专项分析"标签仅当用户指定 输出标签 时才出现,否则不渲染
  • 所有 badge 统计均为动态计算
  • ⚠️ 分组标签 badge 格式:必须同时显示家数金额,格式为 X家 · ¥X.X亿(或 X家 · ¥XXX万)。groupSums 已计算 amt/count/companies 三个字段,badge 中用 s.companies + '家 · ' + fmtAmt(s.amt) 拼接。不能只显示家数——用户需要直观看到每个分组的中标总额
  • ⚠️ 企业分析标签按钮注入方式:必须用 JS 条件判断 if (ANALYSIS_CID) { html += '<button ...>📊 ' + ANALYSIS_TAB_NAME + '</button>'; }不能用 Python f-string 直接插值裸 HTML。裸 HTML 在 JS 代码中不是合法语句,会导致按钮不渲染。详见 references/js_snippets.md

⚠️ 分析深度要求(必须遵循)

用户要求企业分析和市场行情分析必须从数据市场分析的角度指标全面有指导性图文并茂。不能只是简单统计+文字描述,必须有战略洞察和可执行的建议。

一、企业专项分析(renderCompanyAnalysis)深度要求

当用户指定 输出标签 时,renderCompanyAnalysis() 必须输出以下完整模块(顺序即为渲染顺序):

模块 1:核心指标卡片(≥7 个)

中标总额、中标项目数、市场份额、市场排名、覆盖省份、平均单笔、大单占比(≥500万)

模块 2:区域分布 + 业务类型分布(双栏并列)

保留现有柱状图,按金额降序排列

模块 3:月度趋势

保留现有柱状图

模块 4:项目规模分布(⭐ 新增)

  • 按金额分 4 档:千万级(≥1000万)、五百万级(500-1000万)、百万级(100-500万)、百万以下(<100万)
  • 柱状图展示每档金额和项目数
  • 显示大单占比和大单金额贡献率

模块 5:核心客户分析(⭐ 新增)

  • 按 buyer 字段聚合,取 TOP8 客户
  • 显示客户名称、金额柱状图、占比
  • 计算前 3 大客户集中度(top3BuyerPct),>60% 标注"集中度较高"

模块 6:SWOT 战略分析(⭐ 新增,核心要求)

2×2 网格布局,四个象限颜色区分(绿/红/蓝/橙),每象限至少 3-5 条要点,全部从数据动态推导

| 象限 | 数据来源 | 推导逻辑 | |------|---------|---------| | 💪 优势(S) | 排名、份额、大单比、均值对比 | 排名靠前、份额高、大单多、均值高于市场 | | ⚠️ 劣势(W) | 区域集中度、客户集中度、类型集中度、均值对比 | topProv>50%、top3Buyer>50%、topType>60%、均值低于市场 | | 🌟 机会(O) | 市场总量、未覆盖省份/类型、增长趋势 | 市场大但份额低、有未进入省份/类型、月度环比增长 | | 🔴 威胁(T) | 竞争对手、集中度、政策风险 | 头部企业份额高、CR2>60%、区域/客户集中风险 |

⚠️ SWOT 内容必须从实际数据推导,不能是泛泛而谈的模板文字。例如"区域集中度高:安徽占比72%"比"需要加强区域拓展"有说服力得多。

模块 7:重点项目 TOP10

保留现有表格

模块 8:战略营销发展建议(⭐ 新增,核心要求)

6 条建议,每条包含:编号、标题、优先级标签(优先级/重要/常规)、详细描述。建议必须从数据推导:

| # | 建议主题 | 触发条件 | 数据依据 | |---|---------|---------|---------| | 1 | 区域拓展策略 | topProvPct>50% → 优先级 | 区域集中度数据 | | 2 | 客户多元化策略 | top3BuyerPct>50% → 优先级 | 客户集中度数据 | | 3 | 大项目突破策略 | companyAvg<marketAvg → 重要 | 均值对比数据 | | 4 | 业务结构优化策略 | topTypePct>60% → 重要 | 类型集中度数据 | | 5 | 竞争定位与差异化 | 始终输出 → 重要 | 排名和份额数据 | | 6 | 风险防范策略 | 始终输出 → 常规 | 各项集中度数据 |

模块 9:综合评估(⭐ 新增)

蓝色渐变背景的深度洞察框,6 条结构化评估:企业概况、市场地位、区域特征、业务重点、客户结构、项目规模

二、市场行情分析(renderMarketAnalysis)深度要求

renderMarketAnalysis() 必须输出以下完整模块:

模块 1:核心指标卡片(≥6 个)

市场总额、项目总数、企业总数、覆盖省份、平均单笔、大单占比(≥500万)

模块 2:市场集中度分析(⭐ 增强)

  • CR1/CR2/CR4 三级集中度
  • HHI 赫芬达尔指数(所有企业份额平方和)
  • 市场结构判定:HHI≥2500→高集中度(寡头)、1500-2500→中等集中度、<1500→低集中度(分散竞争)
  • 企业份额柱状图

模块 3:竞争梯队(⭐ 新增)

按市场份额分三层,每层一张卡片:

  • 🥇 头部企业(≥15%)
  • 🥈 腰部企业(5%-15%)
  • 🥉 尾部企业(<5%)
  • 如果只有 1 家头部,则第 1 家归头部,其余归腰部

模块 4:区域市场分析(⭐ 增强)

  • 保留省份排名柱状图
  • 新增蓝海/红海标注:每省显示参与企业数
    • 仅 1-2 家企业覆盖 → 蓝海(绿色标注)
    • ≥3 家企业覆盖 → 红海(红色标注)
  • 统计蓝海省份数量和红海省份数量

模块 5:业务赛道分析(⭐ 增强)

  • 保留类型排名柱状图
  • 每行增加市场份额占比
  • 说明大单主要分布领域

模块 6:月度趋势

保留现有柱状图

模块 7:战略洞察与建议(⭐ 新增,核心要求)

6 条建议,每条包含:编号、标题、优先级标签、详细描述:

| # | 建议主题 | 内容要求 | |---|---------|---------| | 1 | 市场结构研判 | HHI 指数解读、集中度分析、大单效应 | | 2 | 区域市场策略 | 蓝海/红海分析、重点省份建议 | | 3 | 业务赛道选择 | 核心赛道分析、高增长方向建议 | | 4 | 竞争策略建议 | 梯队分析、各梯队策略 | | 5 | 大项目战略 | 大单数量/金额贡献率、大项目追踪建议 | | 6 | 趋势研判与风险提示 | 月度趋势、政策红利、风险预警 |

模块 8:市场综合研判(⭐ 新增)

蓝色渐变背景的深度洞察框,5 条结构化研判:市场总量、竞争格局、区域特征、业务结构、大单效应

三、技术实现约定

  • findCidByWinner(winner) 辅助函数:通过 winner 字段匹配企业 id(搜索 name/full/short),用于市场分析中省份企业覆盖统计
  • buyerData 聚合:在 renderCompanyAnalysis 中按 p.buyer 字段聚合客户数据
  • sizeBuckets 分档:千万级/五百万级/百万级/百万以下 4 档
  • hhi 计算:所有企业份额平方和(份额用百分比数值,如 45.2 → 45.2²)
  • SWOT/建议内容全部从数据动态推导,使用条件判断(如 if (parseFloat(topProvPct) > 50))生成不同内容
  • 新增 CSS 类:.swot-grid/.swot-quadrant/.strategic-card/.customer-row/.size-chart/.tier-grid/.insight-deep/.section-divider
  • ⚠️ generate_portal.py 中花括号必须双写({{/}}),使用脚本自动转换可避免手动错误

JS 架构约定

  • 所有 JS 用 IIFE 包裹:(function() { ... })();
  • 关键函数暴露到 windowrenderFilterBar, switchView, switchCompany, applyFilters, sortTable
  • ALL_DATACOMPANY_META 在 IIFE 内 const 声明
  • 所有分析函数在 IIFE 内定义
  • 详情页筛选控件用 addEventListener 绑定,不用内联 oninput/onchange
  • normalizeProvince() 函数负责省份归一化(见 references/js_snippets.md)
  • 省份只使用 31 个省级行政区简称 + "兵团"
  • ⚠️ 企业分析标签按钮注入ANALYSIS_CIDANALYSIS_TAB_NAME 是 Python 脚本注入的 JS 常量。在 renderFilterBar() 中用 if (ANALYSIS_CID) { html += '...' + ANALYSIS_TAB_NAME + '...'; } 动态渲染按钮。绝对不能用 Python f-string {analysis_btn_html} 直接插值裸 HTML 标签到 JS 代码中——那会生成无效 JS 语句,导致按钮不渲染

数据变更后必检清单

每次增/删/改企业或中标记录后,逐项确认:

  • [ ] ALL_DATA 条目数 = COMPANY_META 条目数 = 企业总数
  • [ ] "prov":"未知" = 0
  • [ ] "name":"" = 0
  • [ ] 无同名+同金额重复记录
  • [ ] Hero 三数正确(监控企业/中标总额/中标项目)
  • [ ] GLOBAL_TOTAL_AMT / GLOBAL_TOTAL_PROJ 正确
  • [ ] MAX_COUNT = COMPANY_META.length
  • [ ] 页面标题 = {主题}{时间段标签}中标全景
  • [ ] 企业分析标签(如有)企业数动态取自 COMPANY_META.length
  • [ ] 全部分析视图可正常切换、数据正确
  • [ ] 无残留引用已删除企业的 id/数据
  • [ ] ⚠️ 全国省份+城市覆盖:搜索是否覆盖全部 31 省 + 20 重点城市(不限于企业所在省/市)?跨省/跨市项目是否遗漏?
  • [ ] ⚠️ P0 渠道检查:ctbpsp 是否搜索?必应+百度是否互补使用?搜索引擎语法技巧是否使用?
  • [ ] ⚠️ ALL 重搜回归校验:旧数据项目是否全部保留(或已显式说明丢失原因)
  • [ ] ⚠️ 大单交叉验证:所有 ≥500 万大项目是否均已收录
  • [ ] ⭐ 参照基准覆盖率验证:每家企业的搜索结果是否与多源基准对比?覆盖率是否 ≥ 80%?遗漏项目是否已补搜或已显式告知用户?
  • [ ] ⭐ 企业专项分析深度:SWOT四象限是否全部从数据推导?战略建议是否有6条且带优先级标签?项目规模分布和核心客户分析是否渲染?
  • [ ] ⭐ 市场行情分析深度:HHI指数和CR4是否计算?竞争梯队(头部/腰部/尾部)是否分卡?区域是否有蓝海/红海标注?战略洞察是否有6条?
  • [ ] 🔧 重建脚本完整性rebuild_portal.py 输出是否有 ERROR/WARN?数据段替换是否成功?卡片CSS/动画/标题替换是否成功?
  • [ ] 🔧 JS 代码完整性<script> 标签是否成对闭合?const ALL_DATACOMPANY_META 声明是否存在?renderFilterBar()renderCards() 是否正常调用?
  • [ ] 🔧 HTML 结构完整性.main.filter-bar-wrap#cardsGrid.detail-section 等核心 DOM 是否完整?

诚实的局限性声明

Web 搜索(WebSearch/WebFetch)无法保证 100% 覆盖率。即使执行了所有 7 个搜索维度 + 专业数据库交叉验证,仍可能存在遗漏。原因:

  1. 专业数据库(千里马招标网、剑鱼标讯等)本身也可能不全——它们依赖爬虫抓取各平台公告,部分地方平台可能未被覆盖
  2. 某些中标公告可能在非公开渠道发布(如内部采购、邀请招标),搜索引擎和数据库都无法获取。此类项目只能通过企业自主披露获取
  3. 联合体中标(如"A&B公司联合体")中的企业名可能被搜索引擎误判,难以通过企业名搜索匹配
  4. 地市级平台众多(334 个),当前策略覆盖了水利投资最密集的 20 个城市,其余 314 个城市的中标项目可能遗漏

正确态度

  • 不声称"已找到全部项目",而是报告覆盖率(如"基准 22 个项目,已找到 20 个,覆盖率 91%")
  • 对于无法找到的项目,显式告知用户"该项目在多源基准中存在但未找到原始公告链接"
  • 鼓励用户提供已知遗漏项目,作为补充数据源
  • 对于重要商业决策,建议用户通过天眼查/企查查等付费服务做最终验证