From b0fd2f26e2c56704c955c3a0b1b3d3dfa788b5b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E5=B8=88?= Date: Tue, 9 Jun 2026 03:36:02 +0800 Subject: [PATCH] =?UTF-8?q?spec:=20=E8=AE=A4=E5=AE=9A=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=9B=BA=E5=8C=96+=E5=B7=A5=E4=BD=9C=E7=B0=BF=E5=8F=8C?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90+GROUPBY=E5=8A=A8=E6=80=81=E5=85=AC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 80 +++-- .../cleaned/certified_schemes_dashboard.html | 7 +- .../cleaned/危大方案看板数据工作簿.xlsx | Bin 31953 -> 59442 bytes data/认定数据/2026/certified_schemes.csv | 8 + .../2026/certified_schemes_detail.csv | 44 +++ src/clean_certified.py | 2 +- src/gen_workbook.py | 339 +++++++++++------- 7 files changed, 308 insertions(+), 172 deletions(-) create mode 100644 data/认定数据/2026/certified_schemes.csv create mode 100644 data/认定数据/2026/certified_schemes_detail.csv diff --git a/README.md b/README.md index 781cbe4..8ad8a27 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ | 文件 | 说明 | 更新频率 | |:------|:------|:------| -| `certified_schemes_dashboard.html` | 危大方案独立看板(双页PPT宽屏) | 每月 | -| `危大方案看板数据工作簿.xlsx` | 清洗数据 + 6数据透视表 | 每月 | -| `dashboard.html` | 三合一综合看板 | 每月 | +| `certified_schemes_dashboard.html` | 危大方案独立看板(双页PPT宽屏·1280px) | 每月 | +| `危大方案看板数据工作簿.xlsx` | 双数据源+动态公式+静态汇总(13Sheet) | 每月 | +| `危大方案编审进度看板.pptx` | 可编辑PPTX(原生图表/表格/形状) | 每月 | ## 项目结构 @@ -17,27 +17,32 @@ ├── .gitignore ├── run_all.py ← 一键管线 ├── src/ -│ ├── b1_methods.py ← 技术方案统计表清洗 +│ ├── b1_methods.py ← 技术方案统计表清洗(→ methods_cleaned.csv) │ ├── b2_tracking.py ← 项目启动动态跟踪 │ ├── b3_revenue.py ← 营业额产值统计 │ ├── b4_dashboard_html.py ← 综合看板HTML生成 -│ ├── b4b_certified_dashboard_2026.py ← 危大方案独立看板 -│ ├── gen_workbook.py ← 数据透视工作簿 -│ ├── clean_certified.py ← 年度认定表清洗 -│ ├── clean_methods.py ← 方案统计表清洗(旧版) -│ └── run_methods_2026-06-08.py ← 06-08适配器 -├── raw/ ← OA原始台账 +│ ├── b4b_certified_dashboard_2026.py ← 危大方案独立看板HTML +│ ├── gen_workbook.py ← 工作簿(数据源+GROUPBY公式+静态汇总) +│ ├── gen_pptx.py ← PPTX看板生成 +│ ├── clean_certified.py ← 年度认定表清洗(→ 认定数据/YYYY/) +│ └── clean_methods.py ← 方案统计表清洗(旧版) +├── raw/ ← OA原始台账(每月放入) │ └── YYYY-MM-DD/ │ ├── 技术方案统计表.xlsx │ ├── 动态跟踪表_REPORT3.xlsx │ └── 2026年XX月项目营业额、产值统计表.xls -└── data/ ← 清洗后输出 +└── data/ ← 输出数据 + ├── 认定数据/ ← 年度固定·一年一次 + │ └── 2026/ + │ ├── certified_schemes_detail.csv (43行方案级) + │ └── certified_schemes.csv (项目级对比) └── YYYY-MM-DD/ └── cleaned/ + ├── methods_cleaned.csv (OA登记清洗后) ├── methods_cleaned.parquet - ├── methods_cleaned.csv ├── certified_schemes_dashboard.html ├── 危大方案看板数据工作簿.xlsx + ├── 危大方案编审进度看板.pptx └── *_validation.json ``` @@ -51,19 +56,20 @@ │ 总数 超规16 │ 总数 超规22 │ │ 覆盖7项目 │ 登记率121% │ ├─ 3.按国别 ──────┼─ 4.审批进度&预警 ──┤ -│ 阿联酋45 ▓▓▓▓ │ 5 🔴0 🟠1 🟡4 │ +│ 阿联酋45 ▓▓▓▓ │ 5 🟠1 🟡4 │ │ 沙特 6 ▓ │ 23 未完成审批 │ │ 卡塔尔 1 ▏ │ 56% 审批完成率 │ └─────────────────┴──────────────────┘ ``` -- **年度认定**:依据中港科技便〔2026〕6号,统计口径 ≥2026年开工 +- **年度认定**:中港科技便〔2026〕6号,统计口径 ≥2026年开工 - **OA登记**:OA技术方案统计表,排除已作废 -- **预警**:🟠≤30天未审批 · 🟡≤45天 · 🔴在实施未审批 +- **预警**:🟠 ≤30天未审批 · 🟡 ≤45天 · 🔴 在实施未审批(本月0项) +- **登记率**:121% = OA登记52 / 认定43 ### 页面2:预警明细 -5项预警方案清单,含项目全称、方案名称、距开工天数。 +5项预警方案清单,含项目全称、方案名称、当前状态、计划开工日期、距开工天数。 ## 使用方式 @@ -74,27 +80,41 @@ cp *.xlsx raw/YYYY-MM-DD/ # 2. 运行清洗管线 python3 run_all.py YYYY-MM-DD -# 3. 生成工作簿(含数据透视表) +# 3. 生成工作簿(含动态公式 + 静态汇总) python3 src/gen_workbook.py + +# 4. 生成PPTX +python3 src/gen_pptx.py ``` -## 数据工作簿 (Sheet清单) +## 数据工作簿 Sheet清单(13个) -| Sheet | 内容 | -|:------|:------| -| 清洗后数据 | 52条有效方案全字段 | -| 年度认定透视 | 按一般/超规 + 项目明细 | -| OA登记透视 | 按分类 + 国别×分类交叉 | -| 国别分布 | 阿联酋·沙特·卡塔尔 | -| 审批进度 | 完成率+OA状态细分 | -| 预警明细 | 6项预警+汇总 | +| Sheet | 类型 | 内容 | +|:------|:-----|:------| +| 清洗后数据 | 数据源 | OA登记·全量有效(135行×30列) | +| 有效≥2026 | 数据源 | OA登记·≥2026年开工(52行) | +| **认定数据** | 数据源 | **公司认定·43行(中港科技便〔2026〕6号)** | +| 认定vsOA | 对比 | 项目级认定vs登记差额(7项·差额高亮) | +| 公式-年度认定 | 🔄 GROUPBY | `=GROUPBY(…!K3:K200, …,COUNTA,3,0)` | +| 公式-国别分布 | 🔄 GROUPBY | `=GROUPBY(…!C3:C200, …,COUNTA,3,0,-2)` | +| 公式-审批进度 | 🔄 COUNTIF | 6项指标(完成/未完成/橙/黄/合计) | +| 公式-预警明细 | 🔄 FILTER | `=FILTER(…!A3:AD200, …!AD3:AD200<>"none")` | +| 公式-认定分类 | 🔄 GROUPBY | 认定数据分类统计 | +| 年度认定汇总 | 📌 静态 | 一般类/超规类(可交叉验证公式) | +| 国别×分类 | 📌 静态 | 阿联酋/沙特/卡塔尔×分类交叉 | +| 审批进度 | 📌 静态 | 完成率56%·预警明细 | +| 预警明细 | 📌 静态 | 5项预警清单 | + +> 🔄 动态公式在WPS新版/Excel 365中打开后自动刷新——源数据更新零Python重跑。 ## 数据来源 -- 技术方案统计表 → 危大方案编审进度 -- 动态跟踪表_REPORT3 → 项目启动阶段跟踪 -- 项目营业额、产值统计表 → 营收财务数据 -- 年度认定 → 中港科技便〔2026〕6号 +| 数据 | 来源 | 路径 | +|:------|:------|:------| +| OA登记 | 技术方案统计表 | `raw/YYYY-MM-DD/`(每月更新) | +| 年度认定 | 中港科技便〔2026〕6号 | `data/认定数据/2026/`(年度固定) | +| 项目启动 | 动态跟踪表_REPORT3 | `raw/YYYY-MM-DD/` | +| 营业额 | 项目营业额产值统计表 | `raw/YYYY-MM-DD/` | ## Gitea diff --git a/data/2026-06-08/cleaned/certified_schemes_dashboard.html b/data/2026-06-08/cleaned/certified_schemes_dashboard.html index 31e72ac..1be25ba 100644 --- a/data/2026-06-08/cleaned/certified_schemes_dashboard.html +++ b/data/2026-06-08/cleaned/certified_schemes_dashboard.html @@ -103,9 +103,9 @@ tr:nth-child(even) td{background:var(--bg)}
4. 审批进度 & 三色预警信号
-
6
预警总计
+
5
预警总计
🔴
0
红色
-
🟠
2
橙色
+
🟠
1
橙色
🟡
4
黄色
23
未完成审批
🔴 在实施未审批🟠 ≤30天🟡 ≤45天
@@ -133,10 +133,9 @@ tr:nth-child(even) td{background:var(--bg)}
-

预警信号明细清单

共 6 项预警
+

预警信号明细清单

共 5 项预警
- diff --git a/data/2026-06-08/cleaned/危大方案看板数据工作簿.xlsx b/data/2026-06-08/cleaned/危大方案看板数据工作簿.xlsx index 2ff5bb282fe22dc29df42670b77fab4eac6d72b2..6e28dbf893c3698d4423850b574ea7e5e389c67b 100644 GIT binary patch literal 59442 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

qS`n;#hgQ~cw{^|+a)yNhXZW6o2PM`URz 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 literal 31953 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ⅈ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%0A%|- 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 diff --git a/data/认定数据/2026/certified_schemes.csv b/data/认定数据/2026/certified_schemes.csv new file mode 100644 index 0000000..da740a7 --- /dev/null +++ b/data/认定数据/2026/certified_schemes.csv @@ -0,0 +1,8 @@ +项目名称,认定_危大方案总数,认定_超规数,所属国别,平台_匹配项目,平台_方案总数,平台_超规数,差额,匹配状态 +沙特利雅得德拉伊耶门二期多功能场馆及办公楼房建项目,5,2,沙特,沙特利雅得德拉伊耶门二期多功能场馆及办公楼房建项目,3,1,-2,✅ +沙特吉赞基础下游工业城3区1巷独栋别墅一期项目,1,0,沙特,沙特吉赞基础下游工业城3区1巷独栋别墅一期项目,3,2,2,✅ +沙特达曼港第一和第二集装箱码头升级改造工程项目,1,1,沙特,沙特达曼港第一和第二集装箱码头升级改造工程,3,2,2,✅ +阿联酋沙迦卡尔巴摩托艇码头项目,2,0,阿联酋,阿联酋沙迦卡尔巴摩托艇港开发项目,3,1,1,✅ +阿联酋迪拜马克图姆国际机场地下结构工程项目,31,12,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,35,13,4,✅ +阿联酋阿布扎比哈里发港EGA泊位翻新项目,1,0,阿联酋,阿联酋阿布扎比哈里发港EGA泊位翻新工程项目,1,0,0,✅ +阿联酋阿布扎比马斯努阿岛水工项目,2,1,阿联酋,阿联酋阿布扎比马斯努阿岛水工项目,0,0,-2,✅ diff --git a/data/认定数据/2026/certified_schemes_detail.csv b/data/认定数据/2026/certified_schemes_detail.csv new file mode 100644 index 0000000..ce5b34a --- /dev/null +++ b/data/认定数据/2026/certified_schemes_detail.csv @@ -0,0 +1,44 @@ +所属区域,所属国别,项目名称,方案名称,编制单位,工程类别,分部工程类别,是否超一定规模,计划开工日期 +中东,沙特,沙特利雅得德拉伊耶门二期多功能场馆及办公楼房建项目,预制看台安装方案,中交第二公路工程局有限公司,房屋建设和市政基础设施工程,起重吊装及起重机械安装拆卸工程,否,2026-07-01 +中东,沙特,沙特利雅得德拉伊耶门二期多功能场馆及办公楼房建项目,钢结构施工方案,中建钢构承包有限公司,房屋建设和市政基础设施工程,起重吊装及起重机械安装拆卸工程,是,2026-05-23 +中东,沙特,沙特利雅得德拉伊耶门二期多功能场馆及办公楼房建项目,幕墙施工方案,中建装饰绿创科技有限公司,房屋建设和市政基础设施工程,其它,否,2026-08-22 +中东,沙特,沙特利雅得德拉伊耶门二期多功能场馆及办公楼房建项目,高支模专项施工方案,中交第二公路工程局有限公司,房屋建设和市政基础设施工程,模板工程及支撑体系,是,2026-03-20 +中东,沙特,沙特利雅得德拉伊耶门二期多功能场馆及办公楼房建项目,650t履带吊安拆施工方案,中建钢构承包有限公司,房屋建设和市政基础设施工程,起重吊装及起重机械安装拆卸工程,否,2026-07-25 +中东,沙特,沙特吉赞基础下游工业城3区1巷独栋别墅一期项目,别墅主体结构安装专项施工方案,中交四航局二公司,房屋建设和市政基础设施工程,起重吊装及起重机械安装拆卸工程,否,2026-04-01 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,处理中心专项施工方案(4包),中交四航局二公司(4包),民航工程,模板工程及支撑体系,否,2026-03-10 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,GSE&BHS隧道施工专项施工方案(4包),中交四航局二公司(4包),民航工程,模板工程及支撑体系,否,2026-03-28 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,T梁预制、运输和安装专项施工方案(4包),中交四航局二公司(4包),民航工程,起重吊装及安装拆卸工程,否,2026-05-13 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,临时用电施工组织设计(4包),中交四航局二公司(4包),电力工程,其他,否,2026-02-28 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,BHS处理中心/GSE隧道现浇板专项施工方案(4包),中交四航局二公司(4包),民航工程,模板工程及支撑体系,是,2026-05-15 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,处理中心现浇倒T梁专项施工方案(4包),中交四航局二公司(4包),民航工程,模板工程及支撑体系,是,2026-04-15 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,塔吊施工监管方案(4包),中交四航局二公司(4包),民航工程,起重吊装及安装拆卸工程,否,2026-03-25 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,龙门吊施工监管方案(4包),中交四航局二公司(4包),民航工程,起重吊装及安装拆卸工程,是,2026-03-20 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,混凝土拌和站施工监管方案(4包),中交四航局二公司(4包),民航工程,起重吊装及安装拆卸工程,否,2026-03-18 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,履带吊安装和拆卸专项施工方案(4包),中交四航局二公司(4包),民航工程,起重吊装及安装拆卸工程,是,2026-03-25 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,APM隧道现浇段顶板模板及支撑体系专项施工方案(2包),中交一航局三公司(2包),民航工程,模板工程和支撑体系,是,2026-11-20 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,GSE隧道现浇段顶板模板及支撑体系专项施工方案(2包),中交一航局三公司(2包),民航工程,模板工程和支撑体系,是,2026-04-20 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,APM隧道预制梁安装专项施工方案(2包),中交一航局三公司(2包),民航工程,起重吊装及安装拆卸工程,否,2026-11-15 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,GSE隧道预制梁安装专项施工方案(2包),中交一航局三公司(2包),民航工程,起重吊装及安装拆卸工程,否,2026-04-30 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,混凝土拌合站钢结构料仓大棚安装专项施工方案(2包),中交一航局三公司(2包),民航工程,起重吊装及安装拆卸工程,否,2026-03-25 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,钢筋加工厂钢结构大棚专项施工方案(2包),中交一航局三公司(2包),民航工程,起重吊装及安装拆卸工程,否,2026-03-25 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,预制场龙门吊安装专项施工方案,中交一航局三公司(2包),民航工程,起重吊装及安装拆卸工程,是,2026.3.25 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,预制场龙门吊拆卸专项施工方案,中交一航局三公司(2包),民航工程,起重吊装及安装拆卸工程,否,2027-06-25 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,履带吊安装专项施工方案,中交一航局三公司(2包),民航工程,起重吊装及安装拆卸工程,是,2026-04-20 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,履带吊拆除专项施工方案,中交一航局三公司(2包),民航工程,起重吊装及安装拆卸工程,否,2027-06-25 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,临时用电施工组织设计(2包),中交一航局三公司(2包),电力工程,电力通用_其他,否,2026-03-10 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,隧道顶板专项施工方案(3包),中交二航局一公司(3包),民航工程,模板工程及支撑体系,是,2026-04-25 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,预制构件安装专项施工方案(3包),中交二航局一公司(3包),民航工程,起重吊装及安装拆卸工程,是,2026-04-30 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,搅拌站建设专项施工方案(3包),中交二航局一公司(3包),民航工程,起重吊装及安装拆卸工程,否,2026-03-10 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,场站建设施工方案(3包),中交二航局一公司(3包),民航工程,起重吊装及安装拆卸工程,否,2026-03-10 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,塔吊安装专项施工方案(3包),中交二航局一公司(3包),民航工程,起重吊装及安装拆卸工程,否,2026-03-10 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,塔吊拆除专项施工方案(3包),中交二航局一公司(3包),民航工程,起重吊装及安装拆卸工程,否,2027-06-15 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,门机安装专项施工方案(3包),中交二航局一公司(3包),民航工程,起重吊装及安装拆卸工程,是,2026-03-10 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,门机拆除专项施工方案(3包),中交二航局一公司(3包),民航工程,起重吊装及安装拆卸工程,否,2027-06-15 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,履带吊安拆专项施工方案(3包),中交二航局一公司(3包),民航工程,起重吊装及安装拆卸工程,是,2026-03-10 +中东,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,临时用电专项施工方案(3包),中交二航局一公司(3包),电力工程,电力通用_其他,否,2026-03-10 +中东,沙特,沙特达曼港第一和第二集装箱码头升级改造工程项目,厂棚D钢结构安装专项施工方案,中交二航局一公司,房屋建设和市政基础设施工程,其它,是,2026-03-05 +中东,阿联酋,阿联酋阿布扎比马斯努阿岛水工项目,钢管桩打设专项施工方案,中交一航局三公司,水运工程,桥涵工程,否,2026-09-10 +中东,阿联酋,阿联酋阿布扎比马斯努阿岛水工项目,方块吊装专项施工方案,中交一航局三公司,水运工程,起重吊装工程,是,2026-06-01 +中东,阿联酋,阿联酋沙迦卡尔巴摩托艇码头项目,卡尔巴钢板桩围堰专项施工方案,中交一航局三公司,水运工程,大型临时工程,否,2026-05-01 +中东,阿联酋,阿联酋沙迦卡尔巴摩托艇码头项目,卡尔巴方块安装起重吊装专项施工方案,中交一航局三公司,水运工程,起重吊装工程,否,2026-08-15 +中东,阿联酋,阿联酋阿布扎比哈里发港EGA泊位翻新项目,临时用电施工组织设计,中交一航局三公司(2包),水运工程,临时用电工程,否,2026-02-20 diff --git a/src/clean_certified.py b/src/clean_certified.py index a027cfc..043bdbc 100644 --- a/src/clean_certified.py +++ b/src/clean_certified.py @@ -16,7 +16,7 @@ import difflib # ============================================================ RAW_DIR = Path("/mnt/y/WorkingEmail/OA收文_Incoming") CERT_SRC_DIR = RAW_DIR / "2026-03-16_关于公布公司2026年度技术方案编制计划的通知" -OUT_DIR = CERT_SRC_DIR / "cleaned" +OUT_DIR = Path("/mnt/y/Openclaw_Hub/03.资源/实施项目 wiki/dashboard/data/认定数据/2026") # 年度固定输出 OUT_DIR.mkdir(parents=True, exist_ok=True) CERT_FILES = [ diff --git a/src/gen_workbook.py b/src/gen_workbook.py index ffc2802..fca5452 100644 --- a/src/gen_workbook.py +++ b/src/gen_workbook.py @@ -1,161 +1,226 @@ #!/usr/bin/env python3 -"""危大方案看板数据工作簿 v3 — 数据源完整镜像源表结构 + 汇总表""" +"""危大方案看板数据工作簿 v5 — 双数据源(OA登记+公司认定) + GROUPBY/FILTER动态公式""" import pandas as pd from openpyxl import Workbook from openpyxl.styles import Font, PatternFill, Alignment, Border, Side from openpyxl.utils import get_column_letter BASE = "/mnt/y/Openclaw_Hub/03.资源/实施项目 wiki/dashboard/data/2026-06-08" +CERT_DIR = "/mnt/y/Openclaw_Hub/03.资源/实施项目 wiki/dashboard/data/认定数据/2026" # 年度固定目录·一年一次 OUT = f"{BASE}/cleaned/危大方案看板数据工作簿.xlsx" +REPORT_DATE = "2026-06-08" +REF = "'有效≥2026'" # OA公式引用 +CREF = "'认定数据'" # 认定公式引用 -# ── Read raw source ── -raw = pd.read_excel("/mnt/y/Openclaw_Hub/03.资源/实施项目 wiki/dashboard/raw/2026-06-08/技术方案统计表.xlsx", header=1) -raw.columns = [str(c).strip() for c in raw.columns] -print(f"Source rows: {len(raw)}, cols: {list(raw.columns)[:5]}...") +# ════ 数据源1: OA登记(methods_cleaned.csv) ════ +df = pd.read_csv(f"{BASE}/cleaned/methods_cleaned.csv") +SRC_COLS = list(df.columns[:24]) +valid_all = df[df['是否有效登记'] == True].copy() +valid_2026 = valid_all[valid_all['开工年份'] >= 2026].copy() +m = valid_2026 +tot = len(m); gen = (m['是否超一定规模']!='是').sum(); sup = tot-gen +completed = m['是否完成审批'].sum(); unfinished = tot-completed +projects = m['项目名称'].nunique(); countries = m['所属国别'].value_counts().to_dict() +warn_df = m[m['预警信号']!='none'].sort_values('分部分项工程计划开工日期') +warn_total = len(warn_df); orange = (warn_df['预警信号']=='orange').sum(); yellow = warn_total-orange +print(f"OA登记: {tot}项(一般{gen}/超规{sup}) 完成{completed} 预警{orange}橙{yellow}黄") -# ── Read cleaned data for filtering ── -cl = pd.read_parquet(f"{BASE}/cleaned/methods_cleaned.parquet") -valid_idx = cl[cl['是否有效登记'] == True].index.tolist() -cl['开工年份'] = pd.to_datetime(cl['分部分项工程计划开工日期'], errors='coerce').dt.year -yr_idx = cl[(cl['是否有效登记'] == True) & (cl['开工年份'] >= 2026)].index.tolist() +# ════ 数据源2: 公司认定(certified_schemes_detail.csv) ════ +cert_raw = pd.read_csv(f"{CERT_DIR}/certified_schemes_detail.csv") +cert_raw['计划开工日期_p'] = pd.to_datetime(cert_raw['计划开工日期'].astype(str).str.replace('.','-'), errors='coerce') +cert_valid = cert_raw[cert_raw['计划开工日期_p'].dt.year >= 2026].copy() +cert_tot = len(cert_valid) +cert_sup = (cert_valid['是否超一定规模']=='是').sum(); cert_gen = cert_tot-cert_sup +cert_comp = pd.read_csv(f"{CERT_DIR}/certified_schemes.csv") +print(f"公司认定: {cert_tot}项(一般{cert_gen}/超规{cert_sup}) 项目{cert_comp['项目名称'].nunique()}") -# Merge back to raw columns (align by index) -raw_clean = raw.loc[raw.index.isin(valid_idx)].copy() -raw_2026 = raw.loc[raw.index.isin(yr_idx)].copy() +# ════ 样式 ════ +HDR_F=Font(name='微软雅黑',bold=True,size=10,color='FFFFFF'); HDR_BG=PatternFill('solid',fgColor='1A3A5C') +TITLE_F=Font(name='微软雅黑',bold=True,size=14,color='1A3A5C'); DATA_F=Font(name='微软雅黑',size=10) +BOLD_F=Font(name='微软雅黑',bold=True,size=10); GRAY_F=Font(name='微软雅黑',size=9,color='8899AA') +GREEN_F=Font(name='微软雅黑',bold=True,size=10,color='2E7D32'); RED_F=Font(name='微软雅黑',bold=True,size=10,color='D94E34') +BLUE_F=Font(name='微软雅黑',bold=True,size=10,color='1A3A5C'); ORANGE_F=Font(name='微软雅黑',bold=True,size=10,color='E65100') +FORMULA_F=Font(name='Consolas',size=10,color='1A3A5C') +WARN_BG=PatternFill('solid',fgColor='FFF3E0'); INFO_BG=PatternFill('solid',fgColor='F0F4FA') +BORDER=Border(left=Side('thin','DBE2EA'),right=Side('thin','DBE2EA'),top=Side('thin','DBE2EA'),bottom=Side('thin','DBE2EA')) +CENTER=Alignment(horizontal='center',vertical='center',wrap_text=True) +GOLD_BD=Border(bottom=Side(style='medium',color='C8962E')) -print(f"Valid rows: {len(raw_clean)}, >=2026: {len(raw_2026)}") +def hdr_row(ws,r,cols): + for i,h in enumerate(cols): + c=ws.cell(r,i+1,h); c.font=HDR_F; c.fill=HDR_BG; c.border=BORDER; c.alignment=CENTER -# ── For summary sheets, use cleaned data ── -m = cl[(cl['是否有效登记'] == True) & (cl['开工年份'] >= 2026)].copy() -m['简化状态'] = m['方案状态_clean'].apply(lambda s: '已完成' if '已完成' in str(s) else '未完成') -m['是否超规'] = m['是否超一定规模'].astype(str).apply(lambda x: '超规类' if x == '是' else '一般类') -today = pd.Timestamp('2026-06-08') -m['距开工天'] = (pd.to_datetime(m['分部分项工程计划开工日期']) - today).dt.days.astype(int) +def write_data_sheet(ws,df_out,title,cols): + ncol=len(cols) + ws.merge_cells(start_row=1,start_column=1,end_row=1,end_column=ncol) + ws.cell(1,1,title).font=TITLE_F; ws.cell(1,1).border=GOLD_BD + hdr_row(ws,3,cols) + for ri,(_,row) in enumerate(df_out.iterrows()): + rr=ri+4 + for ci,col in enumerate(cols): + v=row.get(col,'') + if pd.isna(v): v='' + elif isinstance(v,(pd.Timestamp,)): v=str(v)[:10] + elif isinstance(v,(float,)) and v==int(v): v=int(v) + ws.cell(rr,ci+1,v).font=DATA_F; ws.cell(rr,ci+1,v).border=BORDER + ws.auto_filter.ref=f'A3:{get_column_letter(ncol)}{len(df_out)+3}' + ws.freeze_panes='A4' + for i,col in enumerate(cols): + ws.column_dimensions[get_column_letter(i+1)].width=max(10,min(40,len(str(col))*2.2)) -# Warning -def warn_lev(d, s): - s = str(s); d = int(d) - if '未实施' not in s and '审批中' not in s: return '' - if d <= 30: return '🟠' - if d <= 45: return '🟡' - return '' -m['预警'] = m.apply(lambda r: warn_lev(r['距开工天'], r['方案状态_clean']), axis=1) - -# ── Styles ── -HDR_F = Font(name='微软雅黑', bold=True, size=10, color='FFFFFF') -HDR_BG = PatternFill('solid', fgColor='1A3A5C') -TITLE_F = Font(name='微软雅黑', bold=True, size=14, color='1A3A5C') -SUB_F = Font(name='微软雅黑', bold=True, size=12, color='1A3A5C') -GRAY_F = Font(name='微软雅黑', size=9, color='8899AA') -DATA_F = Font(name='微软雅黑', size=10) -BOLD_F = Font(name='微软雅黑', bold=True, size=10) -RED_F = Font(name='微软雅黑', bold=True, size=10, color='D94E34') -GREEN_F = Font(name='微软雅黑', bold=True, size=10, color='2E7D32') -BLUE_F = Font(name='微软雅黑', bold=True, size=10, color='1A3A5C') -WARN_BG = PatternFill('solid', fgColor='FFF3E0') -BORDER = Border(left=Side('thin', 'DBE2EA'), right=Side('thin', 'DBE2EA'), - top=Side('thin', 'DBE2EA'), bottom=Side('thin', 'DBE2EA')) -CENTER = Alignment(horizontal='center', vertical='center') -GOLD_BD = Border(bottom=Side(style='medium', color='C8962E')) - -def hdr_row(ws, r, cols): - for i, h in enumerate(cols): - c = ws.cell(r, i+1, h); c.font = HDR_F; c.fill = HDR_BG; c.border = BORDER; c.alignment = CENTER - -def write_data_sheet(ws, df, title): - """Write a full data sheet from dataframe""" - ws.merge_cells(start_row=1, start_column=1, end_row=1, end_column=len(df.columns)) - ws.cell(1, 1, title).font = TITLE_F - ws.cell(1, 1).border = GOLD_BD - - cols = list(df.columns) - hdr_row(ws, 3, cols) - for r, (_, row) in enumerate(df.iterrows()): - for c, col in enumerate(cols): - v = row[col] - if pd.isna(v): v = '' - elif isinstance(v, (pd.Timestamp,)): v = str(v)[:10] - cell = ws.cell(r+4, c+1, v); cell.font = DATA_F; cell.border = BORDER - ws.auto_filter.ref = f'A3:{get_column_letter(len(cols))}{len(df)+3}' - ws.freeze_panes = 'A4' - for i in range(len(cols)): - ws.column_dimensions[get_column_letter(i+1)].width = max(12, min(35, len(str(cols[i]))*2)) +def write_formula_sheet(ws,title,subtitle,formulas,col_widths): + ws.merge_cells(start_row=1,start_column=1,end_row=1,end_column=4) + ws.cell(1,1,title).font=TITLE_F; ws.cell(1,1).border=GOLD_BD + if subtitle: + ws.merge_cells(start_row=2,start_column=1,end_row=2,end_column=4) + ws.cell(2,1,subtitle).font=Font(name='微软雅黑',size=9,color='8899AA') + for col_letter,row_num,formula,label in formulas: + cell=ws.cell(row_num,ord(col_letter)-64,formula); cell.font=FORMULA_F; cell.border=BORDER + if label: + ws.cell(row_num,ord(col_letter)-63,label).font=GRAY_F + for col_letter,w in col_widths: + ws.column_dimensions[col_letter].width=w + ws.merge_cells(start_row=12,start_column=1,end_row=12,end_column=4) + ws.cell(12,1,'💡 源数据更新后公式自动刷新(WPS新版/Excel 365)').font=GRAY_F; ws.cell(12,1).fill=INFO_BG wb = Workbook() -# ════ Sheet 1: 源表清洗后(完整列) ════ -s1 = wb.active; s1.title = '源表清洗后' -write_data_sheet(s1, raw_clean, '技术方案统计表 · 清洗后(有效登记 全部年份)') +# ════════ S1: OA清洗后数据 ════════ +s1=wb.active; s1.title='清洗后数据' +write_data_sheet(s1,valid_all.reset_index(drop=True), + f'OA登记·清洗后数据(有效登记·全部年份·{len(valid_all)}行)', + SRC_COLS+['方案状态_clean','是否完成审批','是否有效登记','开工年份','开工月份','预警信号']) -# ════ Sheet 2: 有效2026+ ════ -s2 = wb.create_sheet('有效≥2026') -write_data_sheet(s2, raw_2026, '技术方案统计表 · 有效登记 ≥2026年开工') +# ════════ S2: OA有效≥2026 ════════ +s2=wb.create_sheet('有效≥2026') +write_data_sheet(s2,valid_2026.reset_index(drop=True), + f'OA登记·有效≥2026年开工({len(valid_2026)}行)', + SRC_COLS+['方案状态_clean','是否完成审批','是否有效登记','开工年份','开工月份','预警信号']) -# ════ Sheet 3: 年度认定汇总 ════ -s3 = wb.create_sheet('年度认定汇总') -s3.merge_cells('A1:D1'); s3.cell(1, 1, '年度认定(≥2026开工)').font = TITLE_F; s3.cell(1, 1).border = GOLD_BD -hdr_row(s3, 3, ['分类', '方案数', '项目数', '占比']) -tot = len(m) -for r, (cat, sub) in enumerate([('一般类', m[m['是否超规'] == '一般类']), ('超规类', m[m['是否超规'] == '超规类'])]): - cnt = len(sub); proj = sub['项目名称'].nunique() - for c, (v, f) in enumerate(zip([cat, cnt, proj, f'{cnt/tot*100:.0f}%'], [DATA_F, DATA_F, DATA_F, DATA_F])): - cell = s3.cell(r+4, c+1, v); cell.font = f; cell.border = BORDER -for c, (v, f) in enumerate(zip(['合计', tot, m['项目名称'].nunique(), '100%'], [BOLD_F]*4)): - cell = s3.cell(6, c+1, v); cell.font = f; cell.border = BORDER -for w, c in zip([12, 10, 10, 10], 'ABCD'): s3.column_dimensions[c].width = w +# ════════ S3: 认定数据 ════════ +s3=wb.create_sheet('认定数据') +CERT_COLS=['所属区域','所属国别','项目名称','方案名称','编制单位','工程类别','分部工程类别','是否超一定规模','计划开工日期'] +write_data_sheet(s3,cert_valid.reset_index(drop=True), + f'2026年度公司认定危大方案明细(中港科技便〔2026〕6号·{cert_tot}项)',CERT_COLS) -# ════ Sheet 4: 国别×分类 ════ -s4 = wb.create_sheet('国别×分类') -s4.merge_cells('A1:D1'); s4.cell(1, 1, '国别×分类分布').font = TITLE_F; s4.cell(1, 1).border = GOLD_BD -ct = m.groupby(['所属国别', '是否超规']).size().unstack(fill_value=0) -ct['合计'] = ct.sum(1); ct.loc['合计'] = ct.sum() -hdr_row(s4, 3, ['国别'] + list(ct.columns)) -for r, (idx, row) in enumerate(ct.iterrows()): - for c, v in enumerate([idx] + [int(x) for x in row]): - cell = s4.cell(r+4, c+1, v); cell.font = DATA_F; cell.border = BORDER -s4.column_dimensions['A'].width = 25 +# ════════ S4: 认定vsOA ════════ +s4=wb.create_sheet('认定vsOA') +COMP_COLS=['项目名称','认定_危大方案总数','认定_超规数','所属国别','平台_方案总数','平台_超规数','差额','匹配状态'] +ncol_c=len(COMP_COLS) +s4.merge_cells(start_row=1,start_column=1,end_row=1,end_column=ncol_c) +s4.cell(1,1,f'认定 vs OA登记 项目级对比({REPORT_DATE})').font=TITLE_F; s4.cell(1,1).border=GOLD_BD +hdr_row(s4,3,COMP_COLS) +for ri,(_,row) in enumerate(cert_comp.iterrows()): + for ci,col in enumerate(COMP_COLS): + v=row[col] + if pd.isna(v): v='' + cell=s4.cell(ri+4,ci+1,v); cell.font=DATA_F; cell.border=BORDER + if col=='差额' and isinstance(v,(int,float)) and v!=0: + cell.font=RED_F if v<0 else GREEN_F + if col=='匹配状态': cell.font=GREEN_F if '✅' in str(v) else DATA_F +s4.auto_filter.ref=f'A3:{get_column_letter(ncol_c)}{len(cert_comp)+3}' +for i,col in enumerate(COMP_COLS): + s4.column_dimensions[get_column_letter(i+1)].width=max(14,min(45,len(str(col))*2.5)) -# ════ Sheet 5: 审批进度 & 预警 ════ -s5 = wb.create_sheet('审批进度') -s5.merge_cells('A1:D1'); s5.cell(1, 1, '审批进度 & 三色预警').font = TITLE_F; s5.cell(1, 1).border = GOLD_BD -hdr_row(s5, 3, ['指标', '数值', '占比', '备注']) -completed = (m['简化状态'] == '已完成').sum(); unfinished = tot - completed -rn = (m['预警'] != '').sum(); orn = (m['预警'] == '🟠').sum(); ye = (m['预警'] == '🟡').sum() -rows = [ - ('方案总数', tot, '100%', '≥2026年开工·排除已作废'), - ('已完成审批', completed, f'{completed/tot*100:.0f}%', ''), - ('未完成审批', unfinished, f'{unfinished/tot*100:.0f}%', '含审批中+未审批'), - ('🟠 橙色预警', orn, f'{orn/tot*100:.0f}%', '≤30天未审批'), - ('🟡 黄色预警', ye, f'{ye/tot*100:.0f}%', '≤45天未审批'), - ('预警合计', rn, f'{rn/tot*100:.0f}%', f'🟠{orn}项+🟡{ye}项'), -] -for r, (lab, val, pct, note) in enumerate(rows): - fmts = [DATA_F, DATA_F, DATA_F, GRAY_F] - if '完成' in lab and '未' not in lab: fmts = [GREEN_F, BOLD_F, BOLD_F, GRAY_F] - if '预警' in lab: fmts = [RED_F, BOLD_F, BOLD_F, GRAY_F] - if '总数' in lab: fmts = [BLUE_F, BOLD_F, BOLD_F, GRAY_F] - for c, (v, f) in enumerate(zip([lab, val, pct, note], fmts)): - cell = s5.cell(r+4, c+1, v); cell.font = f; cell.border = BORDER -for w, c in zip([18, 10, 10, 35], 'ABCD'): s5.column_dimensions[c].width = w +# ════════ S5-S8: 动态公式 ════════ -# ════ Sheet 6: 预警明细 ════ -s6 = wb.create_sheet('预警明细') -s6.merge_cells('A1:G1'); s6.cell(1, 1, f'三色预警明细(共{rn}项)').font = TITLE_F; s6.cell(1, 1).border = GOLD_BD -hdr_row(s6, 3, ['信号', '类型', '项目名称', '方案名称', '状态', '计划开工', '距开工']) -warned = m[m['预警'] != ''].sort_values('距开工天') -for r, (_, row) in enumerate(warned.iterrows()): - is_w = '未审批' in str(row['方案状态_clean']) - bg = WARN_BG if is_w else None - vals = [row['预警'], row['是否超规'], row['项目名称'], row['方案名称'], - row['方案状态_clean'], str(row['分部分项工程计划开工日期'])[:10], f"{int(row['距开工天'])}天"] - for c, v in enumerate(vals): - cell = s6.cell(r+4, c+1, v); cell.font = RED_F if c == 6 else DATA_F; cell.border = BORDER - if bg: cell.fill = bg -s6.auto_filter.ref = f'A3:G{len(warned)+3}' -for w, c in zip([6, 8, 40, 35, 18, 12, 8], 'ABCDEFG'): s6.column_dimensions[c].width = w +# ── S5: 公式-年度认定 ── +s5=wb.create_sheet('公式-年度认定') +write_formula_sheet(s5,f'OA年度认定(≥2026开工)', + f'GROUPBY({REF}!K3:K200,{REF}!A3:A200,COUNTA,3,0)', + [('A',4,f'=GROUPBY({REF}!K3:K200,{REF}!A3:A200,COUNTA,3,0)','')],[('A',18),('B',12)]) + +# ── S6: 公式-国别分布 ── +s6=wb.create_sheet('公式-国别分布') +write_formula_sheet(s6,f'OA国别×分类(自动排序)', + f'GROUPBY({REF}!C3:C200,{REF}!A3:A200,COUNTA,3,0,-2)', + [('A',4,f'=GROUPBY({REF}!C3:C200,{REF}!A3:A200,COUNTA,3,0,-2)','')],[('A',30),('B',12)]) + +# ── S7: 公式-审批进度 ── +s7=wb.create_sheet('公式-审批进度') +write_formula_sheet(s7,f'OA审批进度 & 预警', + f'引用 {REF}!Z:Z + AD:AD', + [('A',4,'方案总数',''),('B',4,f'=COUNTA({REF}!A4:A200)',''), + ('A',5,'已完成审批',''),('B',5,f'=COUNTIF({REF}!Z4:Z200,TRUE)',''), + ('A',6,'未完成审批',''),('B',6,f'=COUNTIF({REF}!Z4:Z200,FALSE)',''), + ('A',7,'橙色预警',''),('B',7,f'=COUNTIF({REF}!AD4:AD200,"orange")',''), + ('A',8,'黄色预警',''),('B',8,f'=COUNTIF({REF}!AD4:AD200,"yellow")',''), + ('A',9,'预警合计',''),('B',9,'=B7+B8','')],[('A',20),('B',14)]) + +# ── S8: 公式-预警明细 ── +s8=wb.create_sheet('公式-预警明细') +write_formula_sheet(s8,f'OA预警明细(FILTER)', + f'FILTER({REF}!A3:AD200,{REF}!AD3:AD200<>"none","无预警")', + [('A',4,f'=FILTER({REF}!A3:AD200,{REF}!AD3:AD200<>"none","🎉 无预警项")','')],[('A',22)]) + +# ── S9: 公式-认定分类 ── +s9=wb.create_sheet('公式-认定分类') +write_formula_sheet(s9,f'公司认定方案分类(GROUPBY·{cert_tot}项)', + f'GROUPBY({CREF}!H3:H200,{CREF}!D3:D200,COUNTA,3,0)', + [('A',4,f'=GROUPBY({CREF}!H3:H200,{CREF}!D3:D200,COUNTA,3,0)','')],[('A',20),('B',12)]) + +# ════════ S10-S13: 静态汇总表(可交叉验证) ════════ + +# ── S10: 年度认定汇总 ── +s10=wb.create_sheet('年度认定汇总') +s10.merge_cells('A1:E1'); s10.cell(1,1,f'OA年度认定(≥2026·静态)').font=TITLE_F; s10.cell(1,1).border=GOLD_BD +hdr_row(s10,3,['分类','方案数','项目数','占比','备注']) +for r,(lab,val,proj,pct,note) in enumerate([ + ('一般类',gen,valid_2026[valid_2026['是否超一定规模']!='是']['项目名称'].nunique(),f'{gen/tot*100:.0f}%','非超一定规模'), + ('超规类',sup,valid_2026[valid_2026['是否超一定规模']=='是']['项目名称'].nunique(),f'{sup/tot*100:.0f}%','超一定规模'), + ('合计',tot,projects,'100%',f'涵盖{len(countries)}国')]): + fmts=[BOLD_F if '合计' in lab else DATA_F]*5 + for c,(v,f) in enumerate(zip([lab,val,proj,pct,note],fmts)): + cell=s10.cell(r+4,c+1,v); cell.font=f; cell.border=BORDER; cell.alignment=CENTER +for w,col in zip([12,10,10,10,20],'ABCDE'): s10.column_dimensions[col].width=w + +# ── S11: 国别×分类 ── +s11=wb.create_sheet('国别×分类') +s11.merge_cells('A1:D1'); s11.cell(1,1,'OA国别×分类·静态').font=TITLE_F; s11.cell(1,1).border=GOLD_BD +ct=m.groupby(['所属国别','是否超一定规模']).size().unstack(fill_value=0) +ct.columns=['一般类' if c=='否' else '超规类' for c in ct.columns]; ct['合计']=ct.sum(1); ct.loc['合计']=ct.sum() +hdr_row(s11,3,['国别']+list(ct.columns)) +for r,(idx,row) in enumerate(ct.iterrows()): + for c,v in enumerate([idx]+[int(x) for x in row]): + cell=s11.cell(r+4,c+1,v); cell.font=BOLD_F if '合计' in str(idx) else DATA_F; cell.border=BORDER; cell.alignment=CENTER +s11.column_dimensions['A'].width=25 + +# ── S12: 审批进度 ── +s12=wb.create_sheet('审批进度') +s12.merge_cells('A1:D1'); s12.cell(1,1,f'OA审批进度·静态({REPORT_DATE})').font=TITLE_F; s12.cell(1,1).border=GOLD_BD +hdr_row(s12,3,['指标','数值','占比','备注']) +for r,(lab,val,pct,note,fmts) in enumerate([ + ('方案总数',tot,'100%','≥2026年开工',[BLUE_F]*3+[GRAY_F]), + ('已完成审批',int(completed),f'{completed/tot*100:.0f}%','含"已完成"',[GREEN_F]*3+[GRAY_F]), + ('未完成审批',int(unfinished),f'{unfinished/tot*100:.0f}%','审批中+未审批',[DATA_F]*3+[GRAY_F]), + ('🟠 橙色预警',int(orange),f'{orange/tot*100:.0f}%','≤30天',[ORANGE_F]*3+[GRAY_F]), + ('🟡 黄色预警',int(yellow),f'{yellow/tot*100:.0f}%','≤45天',[Font(name='微软雅黑',bold=True,size=10,color='F9A825')]*3+[GRAY_F]), + ('预警合计',int(warn_total),f'{warn_total/tot*100:.0f}%',f'🟠{orange}+🟡{yellow}',[RED_F]*3+[GRAY_F])]): + for c,(v,f) in enumerate(zip([lab,val,pct,note],fmts)): + cell=s12.cell(r+4,c+1,v); cell.font=f; cell.border=BORDER; cell.alignment=CENTER +for w,col in zip([18,10,10,35],'ABCD'): s12.column_dimensions[col].width=w + +# ── S13: 预警明细 ── +s13=wb.create_sheet('预警明细') +s13.merge_cells('A1:H1'); s13.cell(1,1,f'OA预警明细·静态(共{warn_total}项)').font=TITLE_F; s13.cell(1,1).border=GOLD_BD +hdr_row(s13,3,['信号','距开工','项目名称','方案名称','方案状态','计划开工','超规/一般','国别']) +today=pd.Timestamp(REPORT_DATE) +for r,(_,row) in enumerate(warn_df.iterrows()): + days=(pd.to_datetime(row['分部分项工程计划开工日期'])-today).days + vals=[{'orange':'🟠','yellow':'🟡','red':'🔴'}.get(row['预警信号'],''),f'{int(days)}天', + row['项目名称'],row['方案名称'], + row['方案状态_clean'] if pd.notna(row.get('方案状态_clean')) else row['方案状态'], + str(row['分部分项工程计划开工日期'])[:10], + '超规类' if row['是否超一定规模']=='是' else '一般类',row['所属国别']] + for c,v in enumerate(vals): + cell=s13.cell(r+4,c+1,v); cell.font=RED_F if c==1 and days<=3 else DATA_F; cell.border=BORDER; cell.fill=WARN_BG +s13.auto_filter.ref=f'A3:H{warn_total+3}' +for w,col in zip([6,8,40,35,18,12,10,20],'ABCDEFGH'): s13.column_dimensions[col].width=w wb.save(OUT) -print(f"✅ {OUT}") -print(f" Sheet1: 源表清洗后 ({len(raw_clean)}行 × {len(raw_clean.columns)}列)") -print(f" Sheet2: 有效≥2026 ({len(raw_2026)}行)") -print(f" Sheet3-6: 汇总表 + 预警明细") +print(f"\n✅ {OUT}") +print(f" S1-S2 OA登记: {len(valid_all)}全量 + {len(valid_2026)}≥2026") +print(f" S3 公司认定: {cert_tot}行({cert_gen}一般+{cert_sup}超规)") +print(f" S4 认定vsOA: {len(cert_comp)}项目") +print(f" S5-S9 GROUPBY/FILTER 动态公式") +print(f" S10-S13 静态汇总表(交叉验证)")

信号类型项目名称方案名称当前状态计划开工距开工
🟠超规类阿联酋迪拜马克图姆国际机场地下结构工程项目BHS处理中心/GSE隧道现浇板专项施工方案(4包)已添加、未实施2026-06-102天
🟠一般类阿联酋迪拜马克图姆国际机场地下结构工程项目钢筋加工厂桥式起重机安装专项施工方案(2包)已审批、未实施2026-06-3022天
🟡超规类阿联酋阿布扎比汽车基地房建项目模板支立工程专项方案未审批、未实施2026-07-1032天
🟡超规类阿联酋阿布扎比汽车基地房建项目深基坑开挖方案未审批、未实施2026-07-1537天
🟡超规类阿联酋迪拜马克图姆国际机场地下结构工程项目处理中心现浇倒T梁专项施工方案(4包)审批中、未实施2026-07-2042天