certflow.services.report_migration.report_template_spec 源代码

"""质保书系列模板规格(列映射 + 区块行号)。引擎不硬编码,差异在此描述。"""

from __future__ import annotations

from certflow.services.report_migration.report_fill_engine import ZhiBaoShuSpec

# 产品行写格列:Layout B(有出厂编号 + 标准号)——5行/6行/9行[有编号与标准]/9行[及温度] 共用
_PRODUCT_COLS = {
    "序号": 1,
    "产品名称": 2,
    "产品型号": 4,
    "规格": 6,
    "数量": 7,
    "产品编号": 8,
    "试验标准": 10,
    "壳体压力": 13,
    "壳体时间": 14,
    "上密封压力": 15,
    "上密封时间": 16,
    "密封压力": 17,
    "密封时间": 18,
    "结果": 19,
}
_PRODUCT_MERGES = {
    "产品名称": (2, 3),
    "产品型号": (4, 5),
    "产品编号": (8, 9),
    "试验标准": (10, 12),
}
# Layout A(只有标准号:无出厂编号列,试验标准在 col8)
_PRODUCT_COLS_A = {
    "序号": 1,
    "产品名称": 2,
    "产品型号": 4,
    "规格": 6,
    "数量": 7,
    "试验标准": 8,
    "壳体压力": 13,
    "壳体时间": 14,
    "上密封压力": 15,
    "上密封时间": 16,
    "密封压力": 17,
    "密封时间": 18,
    "结果": 19,
}
_PRODUCT_MERGES_A = {
    "产品名称": (2, 3),
    "产品型号": (4, 5),
    "试验标准": (8, 9),
}
# Layout B + 适用温度(col12)
_PRODUCT_COLS_WENDU = dict(_PRODUCT_COLS)
_PRODUCT_COLS_WENDU["适用温度"] = 12
# 材质行写格列
_MATERIAL_COLS = {
    "序号": 1,
    "零件名称": 2,
    "材料": 3,
    "化学成分": {
        "C": 4,
        "Mn": 5,
        "Si": 6,
        "S": 7,
        "P": 8,
        "Cr": 9,
        "Ni": 10,
        "Mo": 11,
        "V": 12,
        "Cu": 13,
    },
    "力学性能": {"ReL": 15, "Rm": 16, "A": 17, "Z": 18},
    "结果": 19,
    # 第 11 化学列之后的空闲溢出格(质保书 col 14),承接不在表头 10 映射集的特殊元素
    # (如 Nb/N/W),换行 join "元素=模拟值";材质证明书 Ti 占 col 14,不声明此键。
    "化学成分溢出": 14,
}

# 试压报告产品行写格列(壳体/上密封/密封 各占 压力+时间 两列)
_SHIYAN_COLS = {
    "序号": 1,
    "产品名称": 2,
    "产品型号": 3,
    "规格": 4,
    "数量": 5,
    "产品编号": 6,
    "试验标准": 7,
    "壳体压力": 8,
    "壳体时间": 9,
    "上密封压力": 10,
    "上密封时间": 11,
    "密封压力": 12,
    "密封时间": 13,
    "结果": 14,
}
# 试压(中英):型号规格合并为单列(col3)
_SHIYAN_ZHONGYING_COLS = {
    "序号": 1,
    "产品名称": 2,
    "型号规格": 3,
    "数量": 4,
    "产品编号": 5,
    "试验标准": 6,
    "壳体压力": 7,
    "壳体时间": 8,
    "上密封压力": 9,
    "上密封时间": 10,
    "密封压力": 11,
    "密封时间": 12,
    "结果": 13,
}
# 材质证明书 产品列(身份 + 零件材质;硬度列兼作结果)
_CAIZHI_COLS = {
    "序号": 1,
    "产品名称": 2,
    "型号规格": 3,
    "零件名称": 4,
    "材料": 5,
    "化学成分": {
        "C": 6,
        "Mn": 7,
        "Si": 8,
        "S": 9,
        "P": 10,
        "Cr": 11,
        "Ni": 12,
        "Mo": 13,
        "Ti": 14,
        "V": 15,
    },
    "力学性能": {"σs": 16, "σb": 17, "δ": 18, "ψ": 19},
    "结果": 20,
}


[文档] def zhibaoshu_6hang() -> ZhiBaoShuSpec: return ZhiBaoShuSpec( name="质保书6行", k=6, 单条行数=2, page_row_count=29, page_col_count=19, product_start=5, material_header_rows=(12, 14), material_start=15, footer_rows=(27, 29), product_cols=dict(_PRODUCT_COLS), product_merges=dict(_PRODUCT_MERGES), material_cols=dict(_MATERIAL_COLS), )
[文档] def zhibaoshu_5hang() -> ZhiBaoShuSpec: # 每产品 3 零件;材质表头 11-13,数据 14 起;PageRowCount=31 return ZhiBaoShuSpec( name="质保书5行", k=5, 单条行数=3, page_row_count=31, page_col_count=19, product_start=5, material_header_rows=(11, 13), material_start=14, footer_rows=(30, 31), product_cols=dict(_PRODUCT_COLS), product_merges=dict(_PRODUCT_MERGES), material_cols=dict(_MATERIAL_COLS), )
[文档] def zhibaoshu_9hang_biaozhunhao() -> ZhiBaoShuSpec: """质保书9行【只有标准号】:仅写标准号(无出厂编号列,试验标准在 col8),单号前缀 C/0。""" return ZhiBaoShuSpec( name="质保书9行只有标准号", k=9, 单条行数=1, page_row_count=42, page_col_count=19, product_start=5, material_header_rows=(15, 17), material_start=18, footer_rows=(27, 29), date_col=8, number_col=16, number_prefix="C/0 编号:", product_cols=dict(_PRODUCT_COLS_A), product_merges=dict(_PRODUCT_MERGES_A), material_cols=dict(_MATERIAL_COLS), )
[文档] def zhibaoshu_9hang_bianhao_biaozhun() -> ZhiBaoShuSpec: """质保书9行【有编号与标准】:出厂编号(col8) + 标准号(col10),单号前缀 C/1。""" return ZhiBaoShuSpec( name="质保书9行有编号与标准", k=9, 单条行数=1, page_row_count=42, page_col_count=19, product_start=5, material_header_rows=(15, 17), material_start=18, footer_rows=(27, 29), date_col=8, number_col=16, number_prefix="C/1 编号:", product_cols=dict(_PRODUCT_COLS), product_merges=dict(_PRODUCT_MERGES), material_cols=dict(_MATERIAL_COLS), )
[文档] def zhibaoshu_9hang_bianhao_biaozhun_wendu() -> ZhiBaoShuSpec: """质保书9行【有编号与标准及温度】:出厂编号 + 标准号 + 适用温度(col12),单号前缀 C/1。""" return ZhiBaoShuSpec( name="质保书9行有编号与标准及温度", k=9, 单条行数=1, page_row_count=42, page_col_count=19, product_start=5, material_header_rows=(15, 17), material_start=18, footer_rows=(27, 29), date_col=8, number_col=16, number_prefix="C/1 编号:", product_cols=dict(_PRODUCT_COLS_WENDU), product_merges=dict(_PRODUCT_MERGES), material_cols=dict(_MATERIAL_COLS), )
# 兼容别名:历史 zhibaoshu_9hang 实际对应「有编号与标准」布局
[文档] def zhibaoshu_9hang() -> ZhiBaoShuSpec: return zhibaoshu_9hang_bianhao_biaozhun()
[文档] def shiyan_report_zhong() -> ZhiBaoShuSpec: """产品压力试验检测报告(中:每页25台,无材质块)。""" return ZhiBaoShuSpec( name="试压报告模板_中", k=25, 单条行数=1, page_row_count=31, page_col_count=25, product_start=5, footer_rows=(30, 31), date_row=2, date_col=6, number_row=2, number_col=10, number_prefix="C/1 N0:", has_material=False, product_cols=dict(_SHIYAN_COLS), product_merges={}, material_cols={}, )
[文档] def shiyan_report_shao() -> ZhiBaoShuSpec: """产品压力试验检测报告(少:每页13台,无材质块)。""" return ZhiBaoShuSpec( name="试压报告模板_少", k=13, 单条行数=1, page_row_count=25, page_col_count=25, product_start=7, footer_rows=(20, 21), date_row=2, date_col=6, number_row=2, number_col=11, number_prefix="C/1 N0:", has_material=False, product_cols=dict(_SHIYAN_COLS), product_merges={}, material_cols={}, )
[文档] def shiyan_report_zhongwen_shao() -> ZhiBaoShuSpec: """中英文试压报告模板-少:双语表头,每页 13 台,无材质块。""" return ZhiBaoShuSpec( name="中英文试压报告模板-少", k=13, 单条行数=1, page_row_count=22, page_col_count=14, product_block=True, product_row_span=1, has_material=False, title_rows=(1, 7), product_start=8, date_row=2, date_col=6, number_row=2, number_col=11, number_prefix="C/1 N0:", report_code="9.1-13", product_cols=dict(_SHIYAN_COLS), product_merges={}, material_cols={}, )
[文档] def shiyan_report_zhongying() -> ZhiBaoShuSpec: """试压(中英):双语,每产品占 2 行(合并),每页 10 台,无材质块。 报告单号代号 8.2-20(区别于质保书/中英文试压的 9.1-13);日期格只存日期本身。 """ return ZhiBaoShuSpec( name="试压(中英)", k=10, 单条行数=1, page_row_count=32, page_col_count=14, product_block=True, product_row_span=2, has_material=False, title_rows=(1, 6), product_start=7, date_row=2, date_col=4, number_row=2, number_col=10, number_prefix="C/0 N0:", report_code="8.2-20", date_label="", product_cols=dict(_SHIYAN_ZHONGYING_COLS), product_merges={}, material_cols={}, )
[文档] def caizhi_1hang() -> ZhiBaoShuSpec: """材质1行:产品材质证明书,每产品 1 行材质(无独立产品表)。""" return ZhiBaoShuSpec( name="材质1行", k=18, 单条行数=1, page_row_count=26, page_col_count=20, product_block=False, caizhi=True, has_material=True, title_rows=(1, 6), product_start=7, material_start=7, date_row=2, date_col=5, number_row=2, number_col=17, number_prefix="C/1 N0:", report_code="9.1-13", date_label="", product_cols={}, product_merges={}, material_cols=dict(_CAIZHI_COLS), )
[文档] def caizhi_2hang() -> ZhiBaoShuSpec: """材质2行:产品材质证明书,每产品 2 行材质。""" return ZhiBaoShuSpec( name="材质2行", k=9, 单条行数=2, page_row_count=26, page_col_count=20, product_block=False, caizhi=True, has_material=True, title_rows=(1, 6), product_start=7, material_start=7, date_row=2, date_col=5, number_row=2, number_col=17, number_prefix="C/1 N0:", report_code="9.1-13", date_label="", product_cols={}, product_merges={}, material_cols=dict(_CAIZHI_COLS), )
[文档] def caizhi_3hang() -> ZhiBaoShuSpec: """材质3行:产品材质证明书,每产品 3 行材质(模板首例有阀体/阀杆/阀瓣样本)。""" return ZhiBaoShuSpec( name="材质3行", k=6, 单条行数=3, page_row_count=26, page_col_count=20, product_block=False, caizhi=True, has_material=True, title_rows=(1, 6), product_start=7, material_start=7, date_row=2, date_col=5, number_row=2, number_col=17, number_prefix="C/1 N0:", report_code="9.1-13", date_label="", product_cols={}, product_merges={}, material_cols=dict(_CAIZHI_COLS), )