report_generation/services/standard_elements_2020.py
xxy aa98ea2623 @
Initial commit

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
2026-06-05 18:45:29 +08:00

1396 lines
62 KiB
Python
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.

"""
2020 版《炼油化工建设项目后评价报告编制细则(修订)》— 附件/附表结构。
依据工作区《炼油化工建设项目后评价报告编制细则(修订).doc》抽取的**正文表格**与**附表18**表题、表头整理:
- **全局要素表**第1章项目概况文字要素+正文各章**非按年**对比表表2-1表3-7、表4-1、表5-15-3/5-6/5-7、表6-1、表7-1+ **附表1、附表2、附表8**。
- **时间要素表****附表3附表7**(利润表、税金表等按「建设期 / 后评价时点前、后」及年度栏填报)+ 正文**按年(或按评价期)**列表:**表2-4** 产品流向、**表5-4** 生产经营及效益对比、**表5-5** 主要生产经营指标;库中按「**表名 × 日历年**」各建一张时间表,列名与细则表头一致(见 TIME_TABLE_MULTI_COLUMNS
附表37 各行在库中使用「现金流·」「利润·」等**表内前缀**避免不同附表中同名行(如「营业收入」)在抽取路由上冲突;展示时仍以细则原文行名为 lvl3/说明。
规则抽取build_rule_factor_items仅包含概况 + 附表1/2/8 行 + 少量高频时间指标;完整模版见 ALL_GLOBAL_TABLES + ALL_TIME_TABLE_SPECS。
"""
from __future__ import annotations
def _S(src: str, names: list[str]) -> list[tuple[str, str, str]]:
"""章节要素行source 作为提示词路径lvl3 默认与 name 一致。"""
return [(n, src, n) for n in names]
# 细则“报告摘要、前言、第17章”章节要素非表格字段用于新建项目预置空值并供 LLM 回填。
GLOBAL_SECTION_TABLES: list[tuple[str, int, list[tuple[str, str, str]]]] = [
(
"章节要素-摘要与前言",
100,
_S(
"报告摘要与前言",
[
"摘要·项目基本情况",
"摘要·总体评价结论",
"摘要·成功度评价结果",
"摘要·主要经验",
"摘要·主要问题",
"摘要·主要建议",
"前言·评价依据",
"前言·评价范围与时点",
"前言·组织方式与过程",
"前言·基础资料清单",
"前言·需解释问题清单",
],
),
),
(
"章节要素-第1章项目概况",
110,
_S(
"第1章 项目概况",
[
"第1章·项目名称",
"第1章·建设单位",
"第1章·建设地点",
"第1章·建设类型",
"第1章·起止时间",
"第1章·建设内容",
"第1章·建设投资",
"第1章·占地面积",
],
),
),
(
"章节要素-第2章前期工作评价",
120,
_S(
"第2章 前期工作评价",
[
"第2章·资源原料评价结论",
"第2章·产品方案评价结论",
"第2章·产品市场评价结论",
"第2章·工艺技术方案评价结论",
"第2章·设备方案评价结论",
"第2章·厂址与外部条件评价结论",
"第2章·总图与配套工程评价结论",
"第2章·技术指标评价结论",
"第2章·风险分析评价结论",
"第2章·可研编制单位资质与选择评价",
"第2章·可研进度评价",
"第2章·可研质量评价",
"第2章·前评估意见采纳落实评价",
"第2章·初步设计评价结论",
"第2章·前期决策程序合规性",
"第2章·前期工作总体结论",
],
),
),
(
"章节要素-第3章建设实施评价",
130,
_S(
"第3章 建设实施评价",
[
"第3章·建设管理模式评价结论",
"第3章·招投标评价结论",
"第3章·施工图设计符合性评价",
"第3章·施工图设计进度评价",
"第3章·施工图设计质量评价",
"第3章·设计变更管理评价",
"第3章·施工准备评价",
"第3章·施工计划执行评价",
"第3章·采购工作评价结论",
"第3章·工程监理评价结论",
"第3章·工程质量评价结论",
"第3章·HSE管理评价结论",
"第3章·三查四定与中间交接评价",
"第3章·竣工验收评价结论",
"第3章·建设实施总体结论",
],
),
),
(
"章节要素-第4章生产运行评价",
140,
_S(
"第4章 生产运行评价",
[
"第4章·生产准备评价结论",
"第4章·联合试运与试生产评价结论",
"第4章·原料供应评价结论",
"第4章·生产运行总体评价",
"第4章·达标评价结论",
"第4章·工艺技术评价结论",
"第4章·设备运行评价结论",
"第4章·公用工程与辅助设施评价结论",
"第4章·生产运行总体结论",
],
),
),
(
"章节要素-第5章投资与经济效益评价",
150,
_S(
"第5章 投资与经济效益评价",
[
"第5章·主要经济指标实现程度评价",
"第5章·投资控制及变动原因结论",
"第5章·投资水平分析结论",
"第5章·资金来源及到位评价结论",
"第5章·投资控制经验教训",
"第5章·营业收入变动原因",
"第5章·总成本费用变动原因",
"第5章·税后利润变动原因",
"第5章·财务后评价IRR",
"第5章·财务后评价NPV",
"第5章·财务后评价回收期",
"第5章·不确定性分析结论",
"第5章·投资与经济效益总体结论",
],
),
),
(
"章节要素-第6章影响与持续性评价",
160,
_S(
"第6章 影响与持续性评价",
[
"第6章·环境影响评价结论",
"第6章·安全影响评价结论",
"第6章·科技进步影响评价结论",
"第6章·社会影响评价结论",
"第6章·项目影响总体结论",
"第6章·资源持续性评价结论",
"第6章·产品持续性评价结论",
"第6章·技术经济竞争力评价结论",
"第6章·项目持续性总体结论",
],
),
),
]
def section_table_row_keys(table_group_name: str) -> list[str]:
"""返回 ``GLOBAL_SECTION_TABLES`` 中某「章节要素-*」分组的全部行键(与要素库 ``row_key`` 一致)。"""
for name, _, rows in GLOBAL_SECTION_TABLES:
if name == table_group_name:
return [str(r[0]) for r in rows if r and str(r[0]).strip()]
return []
CHAPTER1_PROJECT_OVERVIEW_TABLE_GROUP = "章节要素-第1章项目概况"
# 细则「附表1」项目建设工作程序表全局单行键 = 程序节点)
APPENDIX1_PROGRAM_ROWS: list[tuple[str, str, str]] = [
("项目建议书(预可研)批复", "附表1 项目建设工作程序表", "项目建议书"),
("可行性研究报告编制", "附表1 项目建设工作程序表", "可行性研究报告编制"),
("环境影响报告编制", "附表1 项目建设工作程序表", "环境影响报告编制"),
("环境影响报告批复", "附表1 项目建设工作程序表", "环境影响报告批复"),
("安全评价报告编制", "附表1 项目建设工作程序表", "安全评价报告编制"),
("安全评价报告批复", "附表1 项目建设工作程序表", "安全评价报告批复"),
("节能评估报告编制", "附表1 项目建设工作程序表", "节能评估报告编制"),
("节能评估报告批复", "附表1 项目建设工作程序表", "节能评估报告批复"),
("可行性研究报告评估", "附表1 项目建设工作程序表", "可行性研究报告评估"),
("可行性研究报告批复", "附表1 项目建设工作程序表", "可行性研究报告批复"),
("核准报告批复", "附表1 项目建设工作程序表", "核准报告批复"),
("初步设计编制", "附表1 项目建设工作程序表", "初步设计编制"),
("初步设计审查", "附表1 项目建设工作程序表", "初步设计审查"),
("初步设计批复", "附表1 项目建设工作程序表", "初步设计批复"),
("施工图设计编制", "附表1 项目建设工作程序表", "施工图设计编制"),
("开工报告批复", "附表1 项目建设工作程序表", "开工报告批复"),
("开工建设", "附表1 项目建设工作程序表", "开工建设"),
("投产运行", "附表1 项目建设工作程序表", "投产运行"),
("竣工验收", "附表1 项目建设工作程序表", "竣工验收"),
]
# 细则「附表2」竣工决算投资构成全局
APPENDIX2_INVESTMENT_ROWS: list[tuple[str, str, str]] = [
("建设投资", "附表2 项目竣工决算投资构成表(万元)", "建设投资"),
("固定资产投资", "附表2 项目竣工决算投资构成表(万元)", "固定资产投资"),
("工程费用", "附表2 项目竣工决算投资构成表(万元)", "工程费用"),
("工艺生产装置", "附表2 项目竣工决算投资构成表(万元)", "工艺生产装置"),
("总图运输", "附表2 项目竣工决算投资构成表(万元)", "总图运输"),
("储运工程", "附表2 项目竣工决算投资构成表(万元)", "储运工程"),
("辅助设施", "附表2 项目竣工决算投资构成表(万元)", "辅助设施"),
("公用工程", "附表2 项目竣工决算投资构成表(万元)", "公用工程"),
("生产管理设施", "附表2 项目竣工决算投资构成表(万元)", "生产管理设施"),
("厂外工程", "附表2 项目竣工决算投资构成表(万元)", "厂外工程"),
("工器具及生产家具购置费", "附表2 项目竣工决算投资构成表(万元)", "工器具及生产家具购置费"),
("固定资产其他费用", "附表2 项目竣工决算投资构成表(万元)", "固定资产其他费用"),
("无形资产费用", "附表2 项目竣工决算投资构成表(万元)", "无形资产费用"),
("递延资产费用", "附表2 项目竣工决算投资构成表(万元)", "递延资产费用"),
("固定资产投资方向调节税", "附表2 项目竣工决算投资构成表(万元)", "固定资产投资方向调节税"),
("建设期利息", "附表2 项目竣工决算投资构成表(万元)", "建设期利息"),
("铺底流动资金", "附表2 项目竣工决算投资构成表(万元)", "铺底流动资金"),
("报批项目总投资", "附表2 项目竣工决算投资构成表(万元)", "报批项目总投资"),
]
# 附表2 规范行键顺序(与 templates/js/quick-fill.js preferredA2Rows 一致)
APPENDIX2_CANONICAL_ROW_ORDER: list[str] = [
"一 建设投资",
"1 固定资产投资",
"1.1 工程费用",
"1.1.1 工艺生产装置",
"1.1.2 总图运输",
"1.1.3 储运工程",
"1.1.4 辅助设施",
"1.1.5 公用工程",
"1.1.6 生产管理设施",
"1.1.7 厂外工程",
"1.1.8 工器具及生产家具购置费",
"1.2 固定资产其他费用",
"1.2.1 ×××费用",
"1.2.2 ×××费用",
"2 无形资产费用",
"2.1 ×××费用",
"3 递延资产费用",
"3.1 ×××费用",
"二 固定资产投资方向调节税",
"三 建设期利息",
"四 铺底流动资金",
"报批项目总投资",
]
# 附表2 旧版短行键 → 规范行键(与 quick-fill.js getLegacyAppendix2RowKeyMap 一致)
APPENDIX2_LEGACY_ROW_KEY_MAP: dict[str, str] = {
"建设投资": "一 建设投资",
"固定资产投资": "1 固定资产投资",
"工程费用": "1.1 工程费用",
"工艺生产装置": "1.1.1 工艺生产装置",
"总图运输": "1.1.2 总图运输",
"储运工程": "1.1.3 储运工程",
"辅助设施": "1.1.4 辅助设施",
"公用工程": "1.1.5 公用工程",
"生产管理设施": "1.1.6 生产管理设施",
"厂外工程": "1.1.7 厂外工程",
"工器具及生产家具购置费": "1.1.8 工器具及生产家具购置费",
"固定资产其他费用": "1.2 固定资产其他费用",
"无形资产费用": "2 无形资产费用",
"递延资产费用": "3 递延资产费用",
"固定资产投资方向调节税": "二 固定资产投资方向调节税",
"建设期利息": "三 建设期利息",
"铺底流动资金": "四 铺底流动资金",
"报批项目总投资": "报批项目总投资",
}
# 细则「附表8」可研与后评价参数对比全局行键与要素表编辑/回填一致;税收明细用「税类·子项」避免与成本 3.x 序号冲突)
_A8 = "附表8 可研报告和后评价参数对比表"
APPENDIX8_PARAM_ROWS: list[tuple[str, str, str]] = [
("一 成本参数", _A8, "一 成本参数"),
("1 原料价格", _A8, "1 原料价格"),
("1.1 氢气", _A8, "1.1 氢气"),
("2 催化剂和化学药剂", _A8, "2 催化剂和化学药剂"),
("3 燃料动力价格", _A8, "3 燃料动力价格"),
("3.1 除盐水价格", _A8, "3.1 除盐水价格"),
("3.2 除氧水价格", _A8, "3.2 除氧水价格"),
("3.3 循环水价格", _A8, "3.3 循环水价格"),
("3.4 1.0MPa蒸汽价格", _A8, "3.4 1.0MPa蒸汽价格"),
("3.5 3.5MPa蒸汽价格", _A8, "3.5 3.5MPa蒸汽价格"),
("3.6 新鲜水", _A8, "3.6 新鲜水"),
("3.7 电价格", _A8, "3.7 电价格"),
("3.8 净化风价格", _A8, "3.8 净化风价格"),
("3.9 氮气价格", _A8, "3.9 氮气价格"),
("3.10 凝结水", _A8, "3.10 凝结水"),
("3.11 废渣处置", _A8, "3.11 废渣处置"),
("4 人员费用", _A8, "4 人员费用"),
("5 折旧年限", _A8, "5 折旧年限"),
("6 无形资产摊销年限", _A8, "6 无形资产摊销年限"),
("7 其他资产摊销年限", _A8, "7 其他资产摊销年限"),
("8 安全生产费用", _A8, "8 安全生产费用"),
("9 安保基金", _A8, "9 安保基金"),
("10 其他制造费用", _A8, "10 其他制造费用"),
("11 其他管理费用", _A8, "11 其他管理费用"),
("12 长期贷款利息", _A8, "12 长期贷款利息"),
("13 短期贷款/流动资产贷款利率", _A8, "13 短期贷款/流动资产贷款利率"),
("14 其他销售费用", _A8, "14 其他销售费用"),
("二 营业收入参数", _A8, "二 营业收入参数"),
("2.1 98#汽油", _A8, "2.1 98#汽油"),
("2.2 95#汽油", _A8, "2.2 95#汽油"),
("2.3 92#汽油", _A8, "2.3 92#汽油"),
("2.4 异丁烷", _A8, "2.4 异丁烷"),
("2.5 正丁烷", _A8, "2.5 正丁烷"),
("2.6 燃料气", _A8, "2.6 燃料气"),
("2.7 液化气", _A8, "2.7 液化气"),
("三 税收参数", _A8, "三 税收参数"),
("增值税税率", _A8, "增值税税率"),
("增值税·汽油各品种产品", _A8, "汽油各品种产品"),
("增值税·异丁烷", _A8, "异丁烷"),
("增值税·正丁烷", _A8, "正丁烷"),
("增值税·燃料气", _A8, "燃料气"),
("增值税·液化气", _A8, "液化气"),
("消费税税率", _A8, "消费税税率"),
("消费税·产品汽油税率", _A8, "产品汽油税率"),
("城市维护建设税税率", _A8, "城市维护建设税税率"),
("教育费附加", _A8, "教育费附加"),
("所得税税率", _A8, "所得税税率"),
("四 基准收益率", _A8, "四 基准收益率"),
]
APPENDIX8_CANONICAL_ROW_ORDER: list[str] = [str(r[0]) for r in APPENDIX8_PARAM_ROWS]
# 与 quick-fill.js legacyA8Map 一致(旧 row_key → 规范 row_key
APPENDIX8_LEGACY_ROW_KEY_MAP: dict[str, str] = {
"3.1.1 增值税·产品A税率": "增值税·汽油各品种产品",
"3.1.2 增值税·产品B税率": "增值税·异丁烷",
"3.2.1 消费税·产品A税率": "消费税·产品汽油税率",
"3.2.2 消费税·产品B税率": "消费税·产品汽油税率",
"3.1 增值税税率": "增值税税率",
"3.2 消费税税率": "消费税税率",
"3.3 城市维护建设税税率": "城市维护建设税税率",
"3.4 教育费附加": "教育费附加",
"3.5 所得税税率": "所得税税率",
}
GLOBAL_APPENDIX_TABLES: list[tuple[str, int, list[tuple[str, str, str]]]] = [
("附表1 项目建设工作程序表", 600, APPENDIX1_PROGRAM_ROWS),
("附表2 项目竣工决算投资构成表(万元)", 700, APPENDIX2_INVESTMENT_ROWS),
("附表8 可研报告和后评价参数对比表", 800, APPENDIX8_PARAM_ROWS),
]
def _T(src: str, names: list[str]) -> list[tuple[str, str, str]]:
"""细则表格行source 用于检索路径前缀lvl3 与行名一致便于规则抽取。"""
return [(n, src, n) for n in names]
# ---------------------------------------------------------------------------
# 表7-1 项目综合评价评分表:多列(要素权重/评分/得分、指标评分/权重/得分),行键=「指标·要素」
# ---------------------------------------------------------------------------
TABLE_7_1_SCORING_TABLE_NAME = "表7-1 项目综合评价评分表"
TABLE_7_1_COLUMN_KEYS: list[str] = [
"要素权重",
"要素评分",
"要素得分",
"指标评分",
"指标权重",
"指标得分",
]
# 每行预置的列值(细则给定权重;评分/得分类由填报时录入,默认不写库或 None
TABLE_7_1_ROW_CELL_DEFAULTS: list[tuple[str, dict[str, str]]] = [
("前期工作·资料完备性", {"要素权重": "0.4", "指标权重": "0.2"}),
("前期工作·程序规范性", {"要素权重": "0.4", "指标权重": "0.2"}),
("前期工作·前期工作质量", {"要素权重": "0.2", "指标权重": "0.2"}),
("建设实施·施工图设计质量", {"要素权重": "0.2", "指标权重": "0.2"}),
("建设实施·管理规范性", {"要素权重": "0.2", "指标权重": "0.2"}),
("建设实施·合同、招投标及采购", {"要素权重": "0.2", "指标权重": "0.2"}),
("建设实施·工程质量及进度", {"要素权重": "0.2", "指标权重": "0.2"}),
("建设实施·施工安全", {"要素权重": "0.1", "指标权重": "0.2"}),
("建设实施·竣工验收", {"要素权重": "0.1", "指标权重": "0.2"}),
("生产运行·生产准备", {"要素权重": "0.1", "指标权重": "0.2"}),
("生产运行·生产装置负荷率", {"要素权重": "0.3", "指标权重": "0.2"}),
("生产运行·生产达标率", {"要素权重": "0.3", "指标权重": "0.2"}),
("生产运行·生产运行周期", {"要素权重": "0.2", "指标权重": "0.2"}),
("生产运行·安全环保达标情况", {"要素权重": "0.1", "指标权重": "0.2"}),
("投资与经济效益·投资控制", {"要素权重": "0.5", "指标权重": "0.2"}),
("投资与经济效益·经济效益", {"要素权重": "0.5", "指标权重": "0.2"}),
("影响与持续性·装置规模和技术竞争力", {"要素权重": "0.4", "指标权重": "0.2"}),
("影响与持续性·安全环保节能等政策影响", {"要素权重": "0.3", "指标权重": "0.2"}),
("影响与持续性·科技进步和社会影响", {"要素权重": "0.1", "指标权重": "0.2"}),
("影响与持续性·资源持续性", {"要素权重": "0.2", "指标权重": "0.2"}),
("综合得分", {"要素权重": "1.0"}),
]
TABLE_7_1_FIELDS: list[tuple[str, str, str]] = [
(rk, "7.1.2 成功度评价", rk) for rk, _ in TABLE_7_1_ROW_CELL_DEFAULTS
]
# ---------------------------------------------------------------------------
# 多列表格:与 ALL_GLOBAL_TABLES 中 table_name 一致。
# 元组为 (数据列名列表, 行级默认单元格值);行键仍为「项目/要素名称」列(与单列表相同)。
# ---------------------------------------------------------------------------
MULTI_COLUMN_GLOBAL_SPECS: dict[str, tuple[list[str], Optional[dict[str, dict[str, str]]]]] = {
"附表1 项目建设工作程序表": (
["开始时间", "完成时间", "文号", "部门/单位", "备注"],
None,
),
"附表2 项目竣工决算投资构成表(万元)": (
[
"设备购置",
"安装工程",
"建筑工程",
"其他费用",
"合计",
"其中外汇",
"占建设投资的比例(%",
"备注",
],
None,
),
"附表8 可研报告和后评价参数对比表": (
["单位", "可研报告", "后评价报告", "备注"],
None,
),
TABLE_7_1_SCORING_TABLE_NAME: (
TABLE_7_1_COLUMN_KEYS,
dict(TABLE_7_1_ROW_CELL_DEFAULTS),
),
# 正文表(细则列结构,便于多列采集与回填)
# 细则表2-1行键=原料名称;列与 Word 表头一致(序号仅展示用,不入库为列)
"表2-1 资源(原料)组成、数量对比表": (
[
"规格",
"可研报告数量(万吨)",
"可研报告占比(%",
"初步设计数量(万吨)",
"初步设计占比(%",
"实际生产数量(万吨)",
"实际生产占比(%",
"备注",
],
None,
),
"表2-2 资源(原料)性质对比表": (
["可研报告", "初步设计", "实际生产", "备注"],
None,
),
"表2-3 产品方案对比表": (
["可研规格", "可研数量(万吨/年)", "实际规格", "实际数量(万吨/年)", "备注"],
None,
),
"表2-5 总图、储运、公用工程及辅助工程对比": (
["单位", "可研报告", "初步设计", "实际实施", "备注"],
None,
),
"表2-6 储运、公用工程及辅助工程依托对比": (
["单位", "可研报告", "初步设计", "实际实施", "备注"],
None,
),
"表2-7 主要设计指标对比表": (
["单位", "可研报告", "初步设计", "实际运行", "备注"],
None,
),
"表5-1 主要经济指标对比表": (
["单位", "可研值", "后评价值", "差值", "比例(%", "备注"],
None,
),
"表3-1 项目承包单位情况": (
["承包单位", "(合同金额)(万元)", "是/否招标", "资质情况"],
None,
),
"表3-2 施工图设计进度情况": (
["设计单位", "合同期限", "实际执行情况", "备注"],
None,
),
"表3-3 施工图设计变更情况(全厂性项目)": (
["设计变更(份数)", "设计变更金额(万元)", "备注"],
None,
),
"表3-4 施工图设计变更情况(单装置项目)": (
["设计变更(份数)", "设计变更金额(万元)", "备注"],
None,
),
"表3-5 影响投资或工期重(较)大设计变更及原因分析": (
["变更内容", "金额(万元)", "原因", "备注"],
None,
),
"表3-6 施工进度情况": (
["施工单位", "合同期限", "实际执行情况", "备注"],
None,
),
"表3-7 采购工作情况": (
["采购方式", "制造商", "供货商", "金额(万元)", "未招标原因"],
None,
),
"表4-1 投产以来运行周期统计表": (
[
"本周期开工日期",
"本周期运行时间(天)",
"非计划停工·次数(次)",
"非计划停工·时数(时)",
"原因简要分析",
],
None,
),
"表4-2 烷基化装置运行分析表(考核时间:×年×月×日)": (
["单位", "设计值", "标定值", "实际值", "备注"],
None,
),
"表5-2 投资变动情况表(单位:万元、万美元)": (
[
"投资估算",
"初设概算",
"竣工决算",
"决算较估算·差额",
"决算较估算·比例(%",
"决算较概算·差额",
"决算较概算·比例(%",
],
None,
),
"表5-3 工程费用变动情况表(万元、万美元)": (
[
"投资估算",
"初设概算",
"竣工决算",
"决算较估算·差额",
"决算较估算·比例(%",
"决算较概算·差额",
"决算较概算·比例(%",
],
None,
),
"表5-6 不同因素变化对项目内部收益率的影响": (
["财务内部收益率(%", "变化幅度", "占比"],
None,
),
"表5-7 内部收益率为基准收益率时不确定因素临界点或临界值": (
["单位", "数值", "备注"],
None,
),
"表6-1 装置技术经济指标对比表": (
[
"技术来源",
"规模(万吨/年)",
"物耗Wt%",
"能耗kgEo/t",
"产品质量",
"产品收率Wt%",
"排名",
],
None,
),
}
# 时间表默认列细则附表4/6/7、表5-5 等以「后评价时点前/后」分栏;具体见 TIME_TABLE_MULTI_COLUMNS
TIME_APPENDIX_MULTI_COLUMNS: list[str] = ["后评价时点前实际值", "后评价时点后预测值"]
TIME_TABLE_MULTI_COLUMNS: dict[str, list[str]] = {
"附表3 项目投资财务现金流量表(万元)": ["建设期", "后评价时点前实际值", "后评价时点后预测值"],
"附表4 利润与利润分配计算表(万元)": ["后评价时点前实际值", "后评价时点后预测值"],
"附表5 营业收入与营业税金及附加计算表(万元)": [
"价格(元/t",
"后评价时点前实际值",
"后评价时点后预测值",
],
"附表6 总成本费用计算表(万元)": ["后评价时点前实际值", "后评价时点后预测值"],
"附表7 原材料、燃料及动力费用计算表(万元)": ["后评价时点前实际值", "后评价时点后预测值"],
"表2-4 ××年项目主要产品流向状况": [
"规格",
"实际产量",
"销量",
"产品实际流向",
"可研报告产品流向",
"备注",
],
# 与前端多年栏一致:每年三列,首年槽位「××年#1」避免多栏共用一个 col_key
"表5-4 生产经营及效益情况对比表": [
"可研报告|××年#1",
"实际值|××年#1",
"增减(%|××年#1",
],
"表5-5 主要生产经营指标": ["后评价时点前实际值", "后评价时点后预测值"],
}
def _norm_time_table_lookup_key(name: str) -> str:
"""空白/全半角括号/连字符差异下稳定匹配 TIME_TABLE_MULTI_COLUMNS 键(如「(万元)」与「(万元)」)。"""
t = "".join(str(name or "").split())
t = (
t.replace("", "(")
.replace("", ")")
.replace("", "-")
.replace("", "-")
.replace("", "-")
)
return t.casefold()
def time_table_default_columns_for_name(table_name: str) -> list[str] | None:
"""时间表默认列顺序:先精确命中,再规范化表名后模糊命中。"""
raw = str(table_name or "").strip()
if not raw:
return None
hit = TIME_TABLE_MULTI_COLUMNS.get(raw)
if hit is not None:
return list(hit)
n = _norm_time_table_lookup_key(raw)
for k, v in TIME_TABLE_MULTI_COLUMNS.items():
if _norm_time_table_lookup_key(k) == n:
return list(v)
return None
# 细则正文「第2章第7章」表格与 Word 中表题一致;行键在可能冲突处加类别前缀)
GLOBAL_CHAPTER_TABLES: list[tuple[str, int, list[tuple[str, str, str]]]] = [
(
"表2-1 资源(原料)组成、数量对比表",
850,
_T("2.1.1 资源与原料评价", ["气分重碳四", "MTBE醚后碳四", "氢气", "合计"]),
),
(
"表2-2 资源(原料)性质对比表",
851,
_T(
"2.1.1 资源与原料评价",
["密度kg/m³", "硫含量ppm", "氮含量ppm", "其它指标(可增删)"],
),
),
(
"表2-3 产品方案对比表",
852,
_T(
"2.1.2.1 产品方案评价",
[
"汽油",
"航空煤油",
"柴油",
"XX化工品",
"XX润滑油",
"其它产品",
"轻油产品率(%",
"综合商品率(%",
"柴汽比",
],
),
),
(
"表2-5 总图、储运、公用工程及辅助工程对比",
854,
_T(
"2.1.5 总图及系统配套工程评价",
[
"占地面积",
"建筑面积",
"铁路专用线",
"产品仓库面积",
"产品储罐总容积",
"原料储罐总容积",
"净水厂总能力",
"循环水厂总能力",
"污水处理厂总能力",
"总变电所总容量",
"锅炉供热总能力",
"辅助设施",
"其它(可增删)",
],
),
),
(
"表2-6 储运、公用工程及辅助工程依托对比",
855,
_T(
"2.1.5 总图及系统配套工程评价",
[
"依托·铁路专用线",
"依托·产品仓库面积",
"依托·原料储罐容积",
"依托·产品储罐容积",
"依托·净化水厂能力",
"依托·循环水厂能力",
"依托·污水处理厂能力",
"依托·总变电所容量",
"依托·锅炉供热能力",
"依托·辅助设施",
"依托·其它(可增删)",
],
),
),
(
"表2-7 主要设计指标对比表",
856,
_T(
"2.1.7 主要技术指标评价",
[
"原油加工量",
"综合商品率",
"全厂柴汽比",
"全厂新鲜水耗",
"全厂平均电耗",
"能耗",
"其它综合指标",
"常减压蒸馏装置能耗",
"其它装置指标(可增删)",
],
),
),
(
"表3-1 项目承包单位情况",
860,
_T("3.2 招投标评价", ["承包单元·示例1", "承包单元·示例2", "承包单元·示例3"]),
),
(
"表3-2 施工图设计进度情况",
861,
_T("3.3.2 设计进度评价", ["工艺装置", "公用工程", "辅助设施"]),
),
(
"表3-3 施工图设计变更情况(全厂性项目)",
862,
_T("3.3.4 施工图设计变更管理评价", ["工艺装置", "公用工程", "辅助设施", "合计"]),
),
(
"表3-4 施工图设计变更情况(单装置项目)",
863,
_T("3.3.4 施工图设计变更管理评价", ["工艺", "电气", "其它专业(可增删)", "合计"]),
),
(
"表3-5 影响投资或工期重(较)大设计变更及原因分析",
864,
_T("3.3.4 施工图设计变更管理评价", ["重大变更·示例1", "重大变更·示例2", "重大变更·示例3"]),
),
(
"表3-6 施工进度情况",
865,
_T("3.4.2 施工计划的执行情况", ["工艺装置", "公用工程", "辅助设施"]),
),
(
"表3-7 采购工作情况",
866,
_T(
"3.5 采购工作评价",
[
"采购物资·示例1",
"采购物资·示例2",
"采购物资·示例3",
"应招标数量(个)",
"招标数量率(%",
"应招标金额(万元)",
"招标金额率(%",
],
),
),
(
"表4-1 投产以来运行周期统计表",
870,
_T("4.3.2 生产运行总体情况评价", ["运行周期·装置示例1", "运行周期·装置示例2"]),
),
(
"表4-2 烷基化装置运行分析表(考核时间:×年×月×日)",
871,
_T(
"4.3.3 达标评价",
[
"生产能力",
"主要原材料(代表物料)",
"主要产品产量(代表产品)",
"公用工程消耗·水",
"公用工程消耗·蒸汽",
"公用工程消耗·电",
"公用工程消耗·燃料气",
"综合能耗",
"现金加工成本",
"单位毛利",
"其它(可增删)",
],
),
),
(
"表5-1 主要经济指标对比表",
880,
_T(
"5.1 主要经济指标实现程度评价",
[
"1 项目报批总投资",
"1.1 建设投资",
"1.2 建设期利息",
"1.3 铺底流动资金",
"2 年均营业收入",
"3 年均总成本费用",
"4 年均流转税金及附加",
"5 年均利润总额",
"6 年均所得税金",
"7 年均税后利润",
"8 项目投资内部收益率(税后)",
"9 项目投资财务净现值(税后)",
"10 项目静态投资回收期(含建设期)",
],
),
),
(
"表5-2 投资变动情况表(单位:万元、万美元)",
881,
_T(
"5.2.1 投资控制及变动原因分析",
[
"批准单位",
"批准文号",
"一 建设投资",
"1 固定资产投资",
"1.1 工程费用",
"1.1.1 工艺生产装置",
"1.1.2 总图运输",
"1.1.3 储运工程",
"1.1.4 辅助设施",
"1.1.5 公用工程",
"1.1.6 生产管理设施",
"1.1.7 厂外工程",
"1.1.8 工器具及生产家具购置费",
"1.2 固定资产其它费用",
"1.2.1 ×××费用",
"1.2.2 ×××费用",
"2 无形资产费用",
"2.1 ×××费用",
"3 递延资产费用",
"3.1 ×××费用",
"4 预备费用",
"4.1 基本预备费",
"4.2 价差预备费",
"二 固定资产投资方向调节税",
"三 建设期利息",
"四 铺底流动资金",
# 与附表2「报批项目总投资」行键区分避免全局回填串表
"报批项目总投资(投资变动表)",
"其中:外汇(投资变动表)",
],
),
),
(
"表5-3 工程费用变动情况表(万元、万美元)",
882,
_T(
"5.2.1 投资控制及变动原因分析",
[
"批准单位",
"批准文号",
"工程费用",
"工程费用·其中:外汇",
"1 工艺生产装置",
"1 工艺生产装置·其中:外汇",
"1.1 ×××装置",
"1.1 ×××装置·其中:外汇",
"1.1.1 设备购置费",
"1.1.1 设备购置费·其中:外汇",
"1.1.2 安装工程费",
"1.1.2 安装工程费·其中:外汇",
"1.1.3 建筑工程费",
"1.2 ×××装置",
"1.2 ×××装置·其中:外汇",
"1.2.1 设备购置费",
"1.2.1 设备购置费·其中:外汇",
"1.2.2 安装工程费",
"1.2.2 安装工程费·其中:外汇",
"1.2.3 建筑工程费",
"2 总图运输",
"3 储运工程",
"其它分项(可增删)",
"工程费用合计",
],
),
),
(
"表5-6 不同因素变化对项目内部收益率的影响",
890,
_T(
"5.3.2 项目经济效益后评价",
[
"可研报告(基准)",
"后评价报告",
"建设投资变动",
"价格体系变动",
"生产负荷变动",
"建设周期变动",
"其它因素(可增删)",
],
),
),
(
"表5-7 内部收益率为基准收益率时不确定因素临界点或临界值",
891,
_T(
"5.4 不确定性分析",
["生产负荷临界点", "产品价格临界值", "主要原材料价格临界值", "其它不确定因素"],
),
),
(
"表6-1 装置技术经济指标对比表",
895,
_T(
"6.2.3 主要技术及经济指标对比",
[
"XX装置·示例1",
"XX装置·示例2",
"XX装置·示例3",
"XX装置·示例4",
"XX装置·示例5",
],
),
),
(
TABLE_7_1_SCORING_TABLE_NAME,
896,
TABLE_7_1_FIELDS,
),
]
ALL_GLOBAL_TABLES: list[tuple[str, int, list[tuple[str, str, str]]]] = (
GLOBAL_SECTION_TABLES + GLOBAL_CHAPTER_TABLES + GLOBAL_APPENDIX_TABLES
)
# 表5-3 新旧 row_key 同义组(与 templates/js/quick-fill.js preferred53Specs 一致;报告/要素展示优先新键)
TABLE_5_3_ROW_KEY_ALTERNATES: tuple[tuple[str, ...], ...] = (
("批准单位", "工程费用变动·批准单位"),
("批准文号", "工程费用变动·批准文号"),
("工程费用",),
("工程费用·其中:外汇",),
("工程费用合计", "工程费用变动·工程费用合计"),
("1 工艺生产装置", "工程费用变动·工艺生产装置"),
("1 工艺生产装置·其中:外汇",),
("1.1 ×××装置",),
("1.1 ×××装置·其中:外汇",),
("1.1.1 设备购置费", "工程费用变动·装置·设备购置费"),
("1.1.1 设备购置费·其中:外汇",),
("1.1.2 安装工程费", "工程费用变动·装置·安装工程费"),
("1.1.2 安装工程费·其中:外汇",),
("1.1.3 建筑工程费", "工程费用变动·装置·建筑工程费"),
("1.2 ×××装置",),
("1.2 ×××装置·其中:外汇",),
("1.2.1 设备购置费",),
("1.2.1 设备购置费·其中:外汇",),
("1.2.2 安装工程费",),
("1.2.2 安装工程费·其中:外汇",),
("1.2.3 建筑工程费",),
("2 总图运输", "工程费用变动·总图运输"),
("3 储运工程", "工程费用变动·储运工程"),
("其它分项(可增删)", "工程费用变动·其它分项(可增删)"),
)
def _norm_global_table_lookup_key(name: str) -> str:
"""空白/全半角括号/连字符差异下稳定匹配 ALL_GLOBAL_TABLES 表名。"""
return _norm_time_table_lookup_key(name)
def global_table_row_keys(table_name: str) -> list[str]:
"""返回 ``ALL_GLOBAL_TABLES`` 中某张全局表的 canonical 行键顺序(与要素库 ``row_key`` 一致)。"""
raw = str(table_name or "").strip()
if not raw:
return []
for name, _, fields in ALL_GLOBAL_TABLES:
if name == raw:
return [str(r[0]) for r in fields if r and str(r[0]).strip()]
n = _norm_global_table_lookup_key(raw)
for name, _, fields in ALL_GLOBAL_TABLES:
if _norm_global_table_lookup_key(name) == n:
return [str(r[0]) for r in fields if r and str(r[0]).strip()]
return []
def canonical_row_order_for_table(table_name: str) -> list[str] | None:
"""附表28 及时间附表37 的标准行键顺序(与 quick-fill.js preferred*Rows / TIME_APPENDIX_SPECS 一致)。"""
raw = str(table_name or "").strip()
if not raw:
return None
n = _norm_global_table_lookup_key(raw)
if "附表2" in raw and "项目竣工决算投资构成表" in raw:
return list(APPENDIX2_CANONICAL_ROW_ORDER)
for spec_name, rows in TIME_APPENDIX_SPECS:
if _norm_global_table_lookup_key(spec_name) == n:
return list(rows)
for spec_name, rows in TIME_BODY_SPECS:
if _norm_global_table_lookup_key(spec_name) == n:
return list(rows)
if "附表8" in raw and "可研报告和后评价参数对比表" in raw:
return list(APPENDIX8_CANONICAL_ROW_ORDER)
return None
# 规则 /factors 抽取用:仅概况 + 附表1/2/8避免正文几十张表拖慢超时正文表仍完整预置在 ALL_GLOBAL_TABLES。
RULE_GLOBAL_TABLES: list[tuple[str, int, list[tuple[str, str, str]]]] = (
GLOBAL_SECTION_TABLES + GLOBAL_APPENDIX_TABLES
)
# ---------------------------------------------------------------------------
# 时间维度附表37 + 正文按年表;每(表名, 年)一张 ElementTable行键与细则「项目名称」一致并加表前缀防冲突。
# ---------------------------------------------------------------------------
_CF = "现金流量·"
_PL = "利润表·"
_TX = "税金表·"
_CT = "成本表·"
_MT = "料燃动·"
TIME_APPENDIX_SPECS: list[tuple[str, list[str]]] = [
(
"附表3 项目投资财务现金流量表(万元)",
[
_CF + "1 现金流入",
_CF + "1.1 营业收入",
_CF + "1.2 回收固定资产余值",
_CF + "1.3 回收流动资金",
_CF + "2 现金流出",
_CF + "2.1 建设投资",
_CF + "2.2 流动资金",
_CF + "2.3 经营成本",
_CF + "2.4 营业税金及附加",
_CF + "2.5 调整所得税",
_CF + "3 净现金流量",
_CF + "计算指标·所得税后财务内部收益率(%",
_CF + "计算指标·所得税后财务净现值(万元)",
_CF + "计算指标·所得税后静态投资回收期(年)",
],
),
(
"附表4 利润与利润分配计算表(万元)",
[
_PL + "1 营业收入",
_PL + "2 总成本费用",
_PL + "3 营业税金及附加",
_PL + "4 利润总额",
_PL + "5 弥补以前年度亏损",
_PL + "6 应纳税所得额",
_PL + "7 所得税",
_PL + "8 净利润",
_PL + "9 盈余公积及公益金",
_PL + "10 可供分配利润",
_PL + "11 息税前利润总额",
_PL + "12 调整所得税",
],
),
(
"附表5 营业收入与营业税金及附加计算表(万元)",
[
_TX + "1 营业收入",
_TX + "1.1 产品A·销量",
_TX + "1.1 产品A·营业收入",
_TX + "1.1 产品A·销项税",
_TX + "1.2 产品B·销量",
_TX + "1.2 产品B·营业收入",
_TX + "1.2 产品B·销项税",
_TX + "1.3 产品·……",
_TX + "3 增值税",
_TX + "3.1 销项税",
_TX + "3.2 进项税",
_TX + "3.3 设备材料进项税",
_TX + "4 消费税",
_TX + "4.1 汽油",
_TX + "4.2 柴油",
_TX + "4.3 ……",
_TX + "5 城建税",
_TX + "6 教育费附加",
_TX + "7 营业税金及附加",
],
),
(
"附表6 总成本费用计算表(万元)",
[
_CT + "1 生产成本",
_CT + "1.1 原材料",
_CT + "1.2 辅助材料",
_CT + "1.3 燃料",
_CT + "1.4 动力",
_CT + "1.5 员工工资及福利",
_CT + "1.6 制造费用",
_CT + "1.6.1 折旧费",
_CT + "1.6.2 修理费",
_CT + "1.6.3 其他制造费用",
_CT + "2 期间费用",
_CT + "2.1 无形资产摊销",
_CT + "2.2 递延资产摊销",
_CT + "2.3 安全生产费用",
_CT + "2.4 安保基金",
_CT + "2.5 其他管理费",
_CT + "3 财务费用",
_CT + "3.1 长期借款利息",
_CT + "3.2 流动资金借款利息",
_CT + "4 总成本费用",
_CT + "4.1 固定成本",
_CT + "4.2 可变成本",
_CT + "5 经营成本",
_CT + "6 单位加工成本",
_CT + "7 单位产品生产成本(化工项目)",
],
),
(
"附表7 原材料、燃料及动力费用计算表(万元)",
[
_MT + "1 原材料费用",
_MT + "1.1 原料A",
_MT + "1.1 原料A·单价",
_MT + "1.1 原料A·数量",
_MT + "1.1 原料A·进项税额",
_MT + "1.2 原料B",
_MT + "1.2 原料B·……",
_MT + "2 辅助材料费用",
_MT + "2.1 辅助材料A",
_MT + "2.1 辅助材料A·单价",
_MT + "2.1 辅助材料A·数量",
_MT + "2.1 辅助材料A·进项税额",
_MT + "2.2 辅助材料B",
_MT + "2.2 辅助材料B·……",
_MT + "3 燃料费",
_MT + "3.1 燃料A",
_MT + "3.1 燃料A·单价",
_MT + "3.1 燃料A·数量",
_MT + "3.1 燃料A·进项税额",
_MT + "3.2 燃料B",
_MT + "3.2 燃料B·……",
_MT + "4 动力费",
_MT + "4.1 动力A",
_MT + "4.1 动力A·单价",
_MT + "4.1 动力A·数量",
_MT + "4.1 动力A·进项税额",
_MT + "4.2 动力B",
_MT + "4.2 动力B·……",
_MT + "5 进项税合计",
],
),
]
# 细则正文要求按年或评价年填报的表格与附表37 相同按「年 × 表」预置
TIME_BODY_SPECS: list[tuple[str, list[str]]] = [
(
"表2-4 ××年项目主要产品流向状况",
[
"产品名称·1",
"产品名称·2",
"产品名称·3",
"小计",
],
),
(
"表5-4 生产经营及效益情况对比表",
[
"运行情况·生产天数",
"运行情况·负荷率",
"主要原料价格·氢气",
"主要产品年产量·98#汽油",
"主要产品年产量·95#汽油",
"主要产品年产量·92#汽油",
"主要产品年产量·异丁烷",
"主要产品年产量·正丁烷",
"主要产品年产量·燃料气",
"主要产品年产量·液化气",
"主要产品年销售量·98#汽油",
"主要产品年销售量·95#汽油",
"主要产品年销售量·92#汽油",
"主要产品年销售量·异丁烷",
"主要产品年销售量·正丁烷",
"主要产品年销售量·燃料气",
"主要产品年销售量·液化气",
"主要原料和公用工程消耗量·氢气",
"主要原料和公用工程消耗量·辅助材料",
"主要原料和公用工程消耗量·电",
"主要原料和公用工程消耗量·净化风",
"主要原料和公用工程消耗量·循环水",
"主要原料和公用工程消耗量·除盐水",
"主要原料和公用工程消耗量·除氧水",
"主要原料和公用工程消耗量·蒸汽1.0MPa",
"主要原料和公用工程消耗量·蒸汽3.5MPa",
"主要原料和公用工程消耗量·氮气",
"主要原料和公用工程消耗量·废渣处理",
"主要原料和公用工程消耗量·新鲜水",
"主要原料和公用工程消耗量·凝结水",
"主要经济指标·营业收入",
"主要经济指标·成本费用",
"主要经济指标·利润总额",
"主要经济指标·税后利润",
],
),
(
"表5-5 主要生产经营指标",
[
"生产负荷",
"原料消耗量",
"燃料消耗量",
"动力消耗量",
"产品产量",
"其它",
],
),
]
ALL_TIME_TABLE_SPECS: list[tuple[str, list[str]]] = TIME_APPENDIX_SPECS + TIME_BODY_SPECS
# 哈尔滨石化分公司烷基化装置建设项目 — 表5-4 生产经营及效益情况对比(可研预测 vs 时点前实际值 2019 年)
# 通过 element_service.apply_harbin_alkylation_table54_preset 或 POST .../presets/harbin-alkylation-table54 写入指定项目的要素表。
# 列键须与 TIME_TABLE_MULTI_COLUMNS 中「可研报告|××年#1」一致避免与模板同步占位列并存时出现双「××年」空栏。
HARBIN_ALKYLATION_TABLE54_CELL_VALUES: dict[str, dict[str, str]] = {
"运行情况·生产天数": {"可研报告|××年#1": "365", "实际值|××年#1": "334", "增减(%|××年#1": "-8.49"},
"运行情况·负荷率": {"可研报告|××年#1": "100.00%", "实际值|××年#1": "42.87%", "增减(%|××年#1": "-57.13"},
"主要原料价格·氢气": {"可研报告|××年#1": "4000", "实际值|××年#1": "4376.74", "增减(%|××年#1": "9.42"},
"主要产品年产量·98#汽油": {"可研报告|××年#1": "1.08", "实际值|××年#1": "0.30", "增减(%|××年#1": "-72.16"},
"主要产品年产量·95#汽油": {"可研报告|××年#1": "14.03", "实际值|××年#1": "6.13", "增减(%|××年#1": "-56.34"},
"主要产品年产量·92#汽油": {"可研报告|××年#1": "1.08", "实际值|××年#1": "0.00", "增减(%|××年#1": "-100.00"},
"主要产品年产量·异丁烷": {"可研报告|××年#1": "", "实际值|××年#1": "1.38", "增减(%|××年#1": "/"},
"主要产品年产量·正丁烷": {"可研报告|××年#1": "5.64", "实际值|××年#1": "1.17", "增减(%|××年#1": "-79.27"},
"主要产品年产量·燃料气": {"可研报告|××年#1": "", "实际值|××年#1": "0.12", "增减(%|××年#1": "/"},
"主要产品年产量·液化气": {"可研报告|××年#1": "-21.93", "实际值|××年#1": "-9.24", "增减(%|××年#1": "-57.85"},
"主要产品年销售量·98#汽油": {"可研报告|××年#1": "1.08", "实际值|××年#1": "0.30", "增减(%|××年#1": "-72.16"},
"主要产品年销售量·95#汽油": {"可研报告|××年#1": "14.03", "实际值|××年#1": "6.13", "增减(%|××年#1": "-56.34"},
"主要产品年销售量·92#汽油": {"可研报告|××年#1": "1.08", "实际值|××年#1": "0.00", "增减(%|××年#1": "-100.00"},
"主要产品年销售量·异丁烷": {"可研报告|××年#1": "", "实际值|××年#1": "1.38", "增减(%|××年#1": "/"},
"主要产品年销售量·正丁烷": {"可研报告|××年#1": "5.64", "实际值|××年#1": "1.17", "增减(%|××年#1": "-79.27"},
"主要产品年销售量·燃料气": {"可研报告|××年#1": "", "实际值|××年#1": "0.12", "增减(%|××年#1": "/"},
"主要产品年销售量·液化气": {"可研报告|××年#1": "-21.93", "实际值|××年#1": "-9.24", "增减(%|××年#1": "-57.85"},
"主要原料和公用工程消耗量·氢气": {"可研报告|××年#1": "0.02", "实际值|××年#1": "0.01", "增减(%|××年#1": "-51.49"},
"主要原料和公用工程消耗量·辅助材料": {"可研报告|××年#1": "3054", "实际值|××年#1": "796.66", "增减(%|××年#1": "-73.91"},
"主要原料和公用工程消耗量·电": {"可研报告|××年#1": "1346", "实际值|××年#1": "669.75", "增减(%|××年#1": "-50.24"},
"主要原料和公用工程消耗量·净化风": {"可研报告|××年#1": "294", "实际值|××年#1": "235.02", "增减(%|××年#1": "-20.06"},
"主要原料和公用工程消耗量·循环水": {"可研报告|××年#1": "483", "实际值|××年#1": "231.96", "增减(%|××年#1": "-51.97"},
"主要原料和公用工程消耗量·除盐水": {"可研报告|××年#1": "10.50", "实际值|××年#1": "4.01", "增减(%|××年#1": "-61.80"},
"主要原料和公用工程消耗量·除氧水": {"可研报告|××年#1": "", "实际值|××年#1": "0.01", "增减(%|××年#1": "/"},
"主要原料和公用工程消耗量·蒸汽1.0MPa": {"可研报告|××年#1": "-8.99", "实际值|××年#1": "-6.11", "增减(%|××年#1": "-31.98"},
"主要原料和公用工程消耗量·蒸汽3.5MPa": {"可研报告|××年#1": "28.31", "实际值|××年#1": "19.67", "增减(%|××年#1": "-30.52"},
"主要原料和公用工程消耗量·氮气": {"可研报告|××年#1": "", "实际值|××年#1": "288.17", "增减(%|××年#1": "/"},
"主要原料和公用工程消耗量·废渣处理": {"可研报告|××年#1": "0.04", "实际值|××年#1": "0.0121", "增减(%|××年#1": "-67.73"},
"主要原料和公用工程消耗量·新鲜水": {"可研报告|××年#1": "", "实际值|××年#1": "0.15", "增减(%|××年#1": "/"},
"主要原料和公用工程消耗量·凝结水": {"可研报告|××年#1": "19.32", "实际值|××年#1": "0.00", "增减(%|××年#1": "-100.00"},
"主要经济指标·营业收入": {"可研报告|××年#1": "64278", "实际值|××年#1": "30610", "增减(%|××年#1": "-52.38"},
"主要经济指标·成本费用": {"可研报告|××年#1": "10627", "实际值|××年#1": "7332", "增减(%|××年#1": "-31.01"},
"主要经济指标·利润总额": {"可研报告|××年#1": "13785", "实际值|××年#1": "7876", "增减(%|××年#1": "-42.87"},
"主要经济指标·税后利润": {"可研报告|××年#1": "10339", "实际值|××年#1": "5907", "增减(%|××年#1": "-42.87"},
}
# 行键已按表加前缀,一般无需覆盖;保留字典供日后特例。
TIME_ROW_TABLE_OVERRIDE: dict[str, str] = {}
TIME_ROW_PRIMARY_TABLE: dict[str, str] = {}
for _tname, _rows in ALL_TIME_TABLE_SPECS:
for _rk in _rows:
if _rk not in TIME_ROW_PRIMARY_TABLE:
TIME_ROW_PRIMARY_TABLE[_rk] = _tname
for _k, _t in TIME_ROW_TABLE_OVERRIDE.items():
TIME_ROW_PRIMARY_TABLE[_k] = _t
TIME_KEY_SET: set[str] = {r for _, rows in ALL_TIME_TABLE_SPECS for r in rows}
# 规则抽取用:全局 + 少量时间字段name 须与时间表行键一致)
RULE_EXTRACT_EXTRA_TIME: list[tuple[str, str, str, str]] = [
("附表4 利润与利润分配计算表(万元)", _PL + "1 营业收入", "5.3.1 项目投产以来生产经营及效益状况", "营业收入"),
("附表4 利润与利润分配计算表(万元)", _PL + "2 总成本费用", "5.3.1 项目投产以来生产经营及效益状况", "总成本费用"),
("附表4 利润与利润分配计算表(万元)", _PL + "8 净利润", "5.3.1 项目投产以来生产经营及效益状况", "净利润"),
("附表5 营业收入与营业税金及附加计算表(万元)", _TX + "7 营业税金及附加", "5.3.2 项目经济效益后评价", "营业税金及附加"),
("附表3 项目投资财务现金流量表(万元)", _CF + "3 净现金流量", "5.3.2 项目经济效益后评价", "净现金流量"),
]
def build_rule_factor_items() -> list[dict[str, str]]:
"""规则抽取条目(精简);完整要素模版见 ALL_GLOBAL_TABLES + ALL_TIME_TABLE_SPECS。"""
out: list[dict[str, str]] = []
for table_name, _base, fields in RULE_GLOBAL_TABLES:
for name, source, lvl3 in fields:
out.append(
{
"name": name,
"source": source,
"lvl3": lvl3,
"table_name": table_name,
"table_type": "global",
}
)
for table_name, name, source, lvl3 in RULE_EXTRACT_EXTRA_TIME:
out.append(
{
"name": name,
"source": source,
"lvl3": lvl3,
"table_name": table_name,
"table_type": "time",
}
)
return out
ROW_KEY_TO_GLOBAL_TABLE: dict[str, str] = {}
for _tn, _b, fields in ALL_GLOBAL_TABLES:
for key, _, _ in fields:
ROW_KEY_TO_GLOBAL_TABLE[key] = _tn
GLOBAL_KEY_SET = {key for key in ROW_KEY_TO_GLOBAL_TABLE}
def all_global_row_specs() -> list[tuple[str, str, str, str]]:
rows: list[tuple[str, str, str, str]] = []
for table_name, _b, fields in ALL_GLOBAL_TABLES:
for name, source, lvl3 in fields:
rows.append((table_name, name, source, lvl3))
return rows
# 章节/表到“材料文档关键词”硬映射:
# key: source 分组名(通常为 table_name如“章节要素-第2章前期工作评价”“附表4 ...”)
# value: 该分组允许命中的文档名关键词(按 document_markdowns.extracted_filename/kb_documents.name 匹配)
#
# 说明:
# 1) 这里不做打分,命中即纳入;
# 2) 未配置的分组默认不过滤(避免因未补齐映射导致漏抽);
# 3) 关键词建议用 2~8 字的稳定片段,如“可研”“初设”“竣工决算”“后评价报告”。
SOURCE_DOC_KEYWORDS_MAP: dict[str, list[str]] = {
# 摘要与正文章节(从摘要开始)
"章节要素-摘要与前言": ["可研"],
"章节要素-第1章项目概况": ["可研", "竣工验收"],
"章节要素-第2章前期工作评价": ["可研", "初设"],
"章节要素-第3章建设实施评价": ["初设", "施工", "监理", "竣工验收"],
"章节要素-第4章生产运行评价": ["生产运行", "标定", "运行月报", "可研"],
"章节要素-第5章投资与经济效益评价": ["竣工决算", "财务", "可研"],
"章节要素-第6章影响与持续性评价": [
"可研",
"环评",
"环境影响",
"环保",
"环境保护",
"验收监测",
"安评",
"安全评价",
"安全预评价",
"安全验收",
"安全设施",
],
# 第2章相关表
"表2-1 资源(原料)组成、数量对比表": ["可研"],
"表2-2 资源(原料)性质对比表": ["可研"],
"表2-3 产品方案对比表": ["可研"],
"表2-4 ××年项目主要产品流向状况": ["可研"],
"表2-5 总图、储运、公用工程及辅助工程对比": ["可研"],
"表2-6 储运、公用工程及辅助工程依托对比": ["可研"],
"表2-7 主要设计指标对比表": ["可研"],
# 第3章相关表
"表3-1 项目承包单位情况": ["施工", "监理", "可研"],
"表3-2 施工图设计进度情况": ["施工图", "初设", "可研"],
"表3-3 施工图设计变更情况(全厂性项目)": ["施工图", "设计变更", "可研"],
"表3-4 施工图设计变更情况(单装置项目)": ["施工图", "设计变更", "可研"],
"表3-5 影响投资或工期重(较)大设计变更及原因分析": ["设计变更", "可研"],
"表3-6 施工进度情况": ["施工进度", "可研"],
"表3-7 采购工作情况": ["采购", "可研"],
# 第4章相关表
"表4-1 投产以来运行周期统计表": ["生产运行", "可研"],
"表4-2 烷基化装置运行分析表(考核时间:×年×月×日)": ["生产运行", "标定", "可研"],
# 第5章相关表
"表5-1 主要经济指标对比表": ["财务", "竣工决算", "可研"],
"表5-2 投资变动情况表(单位:万元、万美元)": ["竣工决算", "投资", "可研"],
"表5-3 工程费用变动情况表(万元、万美元)": ["竣工决算", "工程费用", "可研"],
"表5-4 生产经营及效益情况对比表": ["生产经营", "财务", "可研"],
"表5-5 主要生产经营指标": ["生产经营", "财务", "可研"],
"表5-6 不同因素变化对项目内部收益率的影响": ["财务", "可研"],
"表5-7 内部收益率为基准收益率时不确定因素临界点或临界值": ["财务", "可研"],
# 第6/7章相关表
"表6-1 装置技术经济指标对比表": [
"可研",
"环评",
"环境影响",
"环保",
"安评",
"安全评价",
"安全设施",
],
# 附表
"附表1 项目建设工作程序表": ["可研", "前期", "批复"],
"附表2 项目竣工决算投资构成表(万元)": ["竣工决算"],
"附表3 项目投资财务现金流量表(万元)": ["财务", "可研"],
"附表4 利润与利润分配计算表(万元)": ["财务", "可研"],
"附表5 营业收入与营业税金及附加计算表(万元)": ["财务", "可研"],
"附表6 总成本费用计算表(万元)": ["财务", "可研"],
"附表7 原材料、燃料及动力费用计算表(万元)": ["财务", "可研"],
"附表8 可研报告和后评价参数对比表": ["可研"],
}
def source_doc_keywords_for(src: str) -> list[str]:
"""
获取某个 source 分组对应的文档关键词(支持前缀键匹配)。
"""
key = str(src or "").strip()
if not key:
return []
exact = SOURCE_DOC_KEYWORDS_MAP.get(key)
if exact is not None:
return [str(x).strip() for x in exact if str(x).strip()]
for k, vals in SOURCE_DOC_KEYWORDS_MAP.items():
ks = str(k or "").strip()
if ks and key.startswith(ks):
return [str(x).strip() for x in vals if str(x).strip()]
return []