from openai import OpenAI
from typing import List, Dict
import json
import time
from modelsAPI.model_api import OpenaiAPI

table1 = ["组成表：表中描述设备主要由哪些子设备或者零部件等组成，同时介绍各组成部分的功能及数量等其它参数",
          "基本参数表：表中描述设备的基本技术指标，例如功能特性（如动力要求、功率、压力、容量等）、能力限制（如推力、速度、回转半径等）、额定输出（如瓦特数、电压、马力、流量等）、环境特性（如环境温度、单位散热量、湿度限制等）、外形尺寸、重量等",
          "操作使用项目索引表：描述操作使用项目，主要罗列了各个操作使用项目的操作使用项目编号、名称、页码等信息，便于查找和引用",
          "操作使用项目表：对操作使用项目进行详细描述，包括操作的操作使用项目编号、名称、安全注意事项、保障设施、保障设备（工具）、人力人员需求、操作步骤等内容，要求按条目形式进行描述，需辅以图表、照片及三维动画、视频等直观形式进行描述。",
          "布置情况表：表中描述设备在舰艇上具体位置，包括设备名称、位置信息等内容",
          "维修项目索引表：表中描述维修项目，主要罗列了各个维修项目的维修项目编号、组成编码、名称、维修项目、维修间隔期、维修级别和页码等信息，便于查找和引用",
          "常见故障表：表中列出设备本身可能出现的所有故障现象，并对故障原因进行描述，给出处理相应故障的维修项目的编号和名称；包括故障现象、故障原因和维修项目。",
          "维修项目表：对维修项目进行详细描述，包括维修项目编号、名称、维修项目、维修间隔期、维修级别、安全防护要求、保障设施、保障设备（工具）、人力人员需求、维修步骤等信息",
          "工具信息汇总表：列出设备维修过程中所有维修项目所需用到的所有工具、夹具、设备的基本信息，包括名称、规格/型号、生产单位、通用/专用、体积、重量、参考价、存放位置等信息",
          "消耗材料信息汇总表：列出设备维修过程中所有维修项目所需用到的所有消耗材料的基本信息，包括名称、牌号/品级/规格、生产单位、备注等信息",
          "其他表格：不符合上述表格要求为其他表格"
         ]
table = ["组成表","基本参数表","操作使用项目索引表","操作使用项目表","操作程序表","应急操作表","使用保障设备需求表","布置情况","维修项目索引表","常见故障表","维修项目表"
         ,"工具信息汇总表","消耗材料信息汇总表","非正常运行条件表"
         ]

# prompt = """
# 你是一个专业的文档结构化助手。请根据以下输入，将 HTML 表格转换为标准 JSON 格式。
# 【要求】
# 1. 解析表格的表头（第一行 <tr> 中的 <td> 或 <th>）作为字段名。
# 2. 从第二行开始，每一行转为一个 JSON 对象，字段名对应表头，值为单元格文本。
# 3. 所有文本需去除多余空白，保留原始语义。
# 4. 额外添加两个字段：
#    已知表格类型有：
#    - "table_type": 根据给出文本信息从以下已知类型中选择最匹配的一个：
#      {', '.join(known_table_types)}
#      如果都不匹配，根据表格内容和上下文，用简洁中文概括该表格的类型或者表名（如“物理接口表”），或者输出无
#    - "related_entity": 仅根据【表格前的上下文文本】（不是表格内部！）判断该表格关联的设备、系统或对象名称（如“离心压缩机”、“润滑油系统”）。如果上下文未明确提及，则写“未明确”。
# 5.- "sub_tables": 一个对象，可能包含多个子表（如果存在）：
#         "保障设备", "备品备件", "消耗材料", "人力人员"
#      每个子表的值为 { "rows": [ {...}, ... ] }，按原表格结构解析
# - 上下文（表格前的文本）和文本内容如下：
# text

# 【输出格式】
# 请严格输出一个 JSON 对象，格式如下：
# {
#   "table_type": "字符串",
#   "related_entity": "字符串",
#   "标题" : "字符串"
#   "rows": [
#     { "字段1": "值", "字段2": "值", ... },
#     ...
#   ]
# }
# 不要输出任何其他解释、注释或 Markdown。
# """

prompt = """
你是一个专业的文档结构化助手。请根据以下输入，将内容转换为标准 JSON 格式。
【要求】
1. 如果输入是单一 HTML 表格，则按常规方式解析：表头为字段名，每行为一个对象。
2. 如果输入是复合文档（含多个表格和标题段落），请将所有内容扁平化为一个 `rows` 列表，按文档出现顺序排列，行类型包括：
   a) **主数据行**：来自表格的数据，字段名 = 表头
   b) **文本段落行**：当遇到类似 "# 标题"或者"标题\\n" 的 Markdown 标题及其后续段落时，生成一行：
        {{ "标题名": "完整段落文本（保留换行）" }}

   c) **子表格行**：对每个非主表的 <table>，先解析为 rows，然后生成一行：
        {{"表格类别名称": "[{{...}}, ...]" }}
      其中“表格类别名称”根据上下文判断，如“保障设备”、“备品备件”、“消耗材料”、“人力人员”等。
3. 所有文本需去除首尾多余空白，但保留内部换行和语义。
4. 输出必须包含：
   - "table_type": 根据给出文本信息从以下已知类型中选择最匹配的一个,已知表格类型以及对应的表格描述有：：
      {known_table_types_str}
      如果都不匹配，根据表格内容和上下文，用简洁中文概括该表格的类型或者表名（如“物理接口表”），或者输出无；若都不匹配，用简洁中文概括（如“物理接口表”），或输出“无”。
    "related_entity": 通过分析表格的上下文信息、表格题目以及表格内容，分析表格关联的实体
5. 不要忽略页码表之前的内容（如<table><tr><td>页码：4/4</td><td>版本号：1</td></tr></table>）。
6. 表格之外的文本内容仅供上下文理解，不要对之外内容进行抽取
7. 只识别完整的html源码，同时根据上下文内容找到相关实体
8. 如果是空表，没有有效内容，请返回[]，不需要进行抽取

【输入】
{text}

【输出格式,请严格输出json格式,不要输出任何其他解释、注释或 Markdown。】
{{
  "table_type": "字符串",
  "related_entity": "字符串",
  "rows": [
    {{ ... }},  // 可能是数据行、section行、或sub_table行
  ]
}}

示例1：
输入：
是此类船舶的核心动力源。</td><td colspan="1" rowspan="1">蒸汽参数：压力、温度、干度（饱和度）必须达到设计值，以保证轮机的输出功率和效率，并防止水击腐蚀叶片。</td></tr></table>

# 2.2.2 非正常运行条件

本节对螺旋桨非正常运行条件进行说明。明确外部输入条件的变化可能对螺旋桨造成的故障。同时描述螺旋桨因故障会导致非正常输出条件可能会导致其他设备故障。

表 2.3 非正常输入条件及产生后果  

<table><tr><td colspan="1" rowspan="1">序号</td><td colspan="1" rowspan="1">项目</td><td colspan="1" rowspan="1">非正常输入条件</td><td colspan="1" rowspan="1">可能产生后果</td></tr><tr><td colspan="1" rowspan="1"></td><td colspan="1" rowspan="1">水</td><td colspan="1" rowspan="1">1.1 螺旋桨浸深不足1.2 水流中含有大量杂物、渔网、塑料等1.3 冷却水温度过高或流量不足1.4压载水调节不当，船舶纵倾/横倾过大</td><td colspan="1" rowspan="1">1.1推进效率下降、空泡加剧、振动噪声增大1.2 桨叶缠绕、变形、崩边，导致动不平衡和轴系振动1.3 主机过热降功率运行，间接导致螺旋桨推力不足1.4 桨叶部分出水，主机负荷突变，可能引发“飞车”</td></tr><tr><td colspan="1" rowspan="1">2</td><td colspan="1" rowspan="1">电</td><td colspan="1" rowspan="1">2.1主推进电机（电力推进）供电电压/频率不稳定2.2控制系统断电或信号异常2.3 关键辅机泵（滑油泵、冷却水泵）电力中断</td><td colspan="1" rowspan="1">2.1 输出扭矩波动，螺旋桨转速不稳定，引起轴系扭振2.2螺旋桨控制失灵（CPP无法调距）、监测报警失效，安全隐患增大2.3 主机或轴系润滑冷却失效，可能导致轴承烧损、主机停机</td></tr><tr><td colspan="1" rowspan="1">3</td><td colspan="1" rowspan="1">油</td><td colspan="1" rowspan="1">3.1 滑油（系统油、尾轴管油）污染、变质、含水3.2 滑油压力过低或断流3.3 燃油品质差、含水含杂质3.4 尾轴管密封漏油</td><td colspan="1" rowspan="1">3.1 轴系、轴承磨损加速，尾轴承异常磨损会导致轴系下沉和振动3.2轴承油膜无法形成，引起干摩擦，短时间内导致轴承高温烧熔、轴颈损伤3.3主机燃烧不良，功率下降、部件磨损，间接影响螺旋桨出力3.4 润滑油泄漏污染水域，同时可能导致轴承润滑不足，并引发海水倒灌</td></tr><tr><td colspan="1" rowspan="1">4</td><td colspan="1" rowspan="1">气</td><td colspan="1" rowspan="1">4.1启动空气压力不足或含水4.2 CPP控制空气压力低、含杂质或泄漏4.3扫气/增压空气压力不足、温度过高</td><td colspan="1" rowspan="1">4.1主机启动失败，螺旋桨无法投入运行4.2 桨叶螺距调节迟缓、卡滞或不准确，船舶机动性变差4.3主机功率下降，螺旋桨无法达到预定转速和推力</td></tr><tr><td colspan="1" rowspan="1">5</td><td colspan="1" rowspan="1">汽</td><td colspan="1" rowspan="1">5.1 主蒸汽压力/温度低于设计值5.2蒸汽含水量高（干度低）5.3凝汽器真空度下降</td><td colspan="1" rowspan="1">5.1蒸汽轮机输出功率降低，螺旋桨转速达不到要求5.2 蒸汽轮机低压段叶片发生水蚀，长期运行损坏叶片，效率下降5.3汽轮机效率降低，同样蒸汽耗量下输出功减少</td></tr><tr><td colspan="1" rowspan="1">6</td><td colspan="1" rowspan="1">机械与外部环境</td><td colspan="1" rowspan="1">6.1 螺旋桨桨叶受损（变形、裂缝、缺失）6.2 轴系对中不良6.3恶劣海况导致螺旋桨频繁出水6.4 船体尾部附件（如舵、导流罩）损坏或附着物过多</td><td colspan="1" rowspan="1">6.1 动平衡破坏，导致轴系和船体尾部剧烈振动，加速轴承磨损6.2 轴承受力不均，引起异常磨损和振动，可能引发轴系疲劳断裂6.3 主机负荷剧烈波动，转速突变，对主机和齿轮箱造成冲击6.4尾部流场紊乱，螺旋桨进流不均，导致效率下降和振动加剧</td></tr></table>

思考过程：
首先我需要阅读表格内容，是一个单一 HTML表格，其次，我需要判断表格的正确内容（即开始和结束部分），表 2.3 非正常输入条件及产生后果为表格的题目，"</td><td colspan="1" rowspan="1">蒸汽参数：压力、温度、干度（饱和度）必须达到设计值，以保证轮机的输出功率和效率，并防止水击腐蚀叶片。</td></tr></table>
"虽然也是表格内容，但是并不完整，因此完整的表格内容为"表 2.3 非正常输入条件及产生后果"之后的内容。接着，我需要找到表格关联的实体，从表格之前的内容可以找到"螺旋桨"是一个实体，因此表格的related_entity应该为"螺旋桨"，表格类型并没有找到符合的表格类型，因此table_type为"其他"，紧接着进行表格内容抽取，每一行为一个记录，根据字段和下面值构建json数据

输出为：
{{
  "table_type": "非正常运行条件表",
  "related_entity": "螺旋桨",
  "rows": [
    {{
        "序号": "",
        "项目": "水",
        "非正常输入条件": "1.1 螺旋桨浸深不足\\n1.2 水流中含有大量杂物、渔网、塑料等\\n1.3 冷却水温度过高或流量不足\\n1.4压载水调节不当，船舶纵倾/横倾过大",
        "可能产生后果": "1.1推进效率下降、空泡加剧、振动噪声增大\\n1.2 桨叶缠绕、变形、崩边，导致动不平衡和轴系振动\\n1.3 主机过热降功率运行，间接导致螺旋桨推力不足\\n1.4 桨叶部分出水，主机负荷突变，可能引发“飞车”"
    }},
    {{
        "序号": "2",
        "项目": "电",
        "非正常输入条件": "2.1主推进电机（电力推进）供电电压/频率不稳定\\n2.2控制系统断电或信号异常\\n2.3 关键辅机泵（滑油泵、冷却水泵）电力中断",
        "可能产生后果": "2.1 输出扭矩波动，螺旋桨转速不稳定，引起轴系扭振\\n2.2螺旋桨控制失灵（CPP无法调距）、监测报警失效，安全隐患增大\\n2.3 主机或轴系润滑冷却失效，可能导致轴承烧损、主机停机"
    }},
    {{
        "序号": "3",
        "项目": "油",
        "非正常输入条件": "3.1 滑油（系统油、尾轴管油）污染、变质、含水\\n3.2 滑油压力过低或断流\\n3.3 燃油品质差、含水含杂质\\n3.4 尾轴管密封漏油",
        "可能产生后果": "3.1 轴系、轴承磨损加速，尾轴承异常磨损会导致轴系下沉和振动\\n3.2轴承油膜无法形成，引起干摩擦，短时间内导致轴承高温烧熔、轴颈损伤\\n3.3主机燃烧不良，功率下降、部件磨损，间接影响螺旋桨出力\\n3.4 润滑油泄漏污染水域，同时可能导致轴承润滑不足，并引发海水倒灌"
    }},
    {{
        "序号": "4",
        "项目": "气",
        "非正常输入条件": "4.1启动空气压力不足或含水\\n4.2 CPP控制空气压力低、含杂质或泄漏\\n4.3扫气/增压空气压力不足、温度过高",
        "可能产生后果": "4.1主机启动失败，螺旋桨无法投入运行\\n4.2 桨叶螺距调节迟缓、卡滞或不准确，船舶机动性变差\\n4.3主机功率下降，螺旋桨无法达到预定转速和推力"
    }},
    {{
        "序号": "5",
        "项目": "汽",
        "非正常输入条件": "5.1 主蒸汽压力/温度低于设计值\\n5.2蒸汽含水量高（干度低）\\n5.3凝汽器真空度下降",
        "可能产生后果": "5.1蒸汽轮机输出功率降低，螺旋桨转速达不到要求\\n5.2 蒸汽轮机低压段叶片发生水蚀，长期运行损坏叶片，效率下降\\n5.3汽轮机效率降低，同样蒸汽耗量下输出功减少"      
    }},
    {{
        "序号": "6",
        "项目": "机械与外部环境",
        "非正常输入条件": "6.1 螺旋桨桨叶受损（变形、裂缝、缺失）\\n6.2 轴系对中不良\\n6.3恶劣海况导致螺旋桨频繁出水\\n6.4 船体尾部附件（如舵、导流罩）损坏或附着物过多",
        "可能产生后果": "6.1 动平衡破坏，导致轴系和船体尾部剧烈振动，加速轴承磨损\\n6.2 轴承受力不均，引起异常磨损和振动，可能引发轴系疲劳断裂\\n6.3 主机负荷剧烈波动，转速突变，对主机和齿轮箱造成冲击\\n6.4尾部流场紊乱，螺旋桨进流不均，导致效率下降和振动加剧"
    }}
  ]
}}

示例2：
输入为：
6) 熟悉设备操作流程：

[](https://cdn-mineru.openxlab.org.cn/result/2025-12-29/c866b1ca-780c-4f2c-b81e-ad22767b7b12/3f7d0c9690775e448a8cc595287ad07b0151f2decc08a3ff47e29f41afa51c0f.jpg)  
图 001.1 设备操作流程图

<table><tr><td>页码：1/1</td><td>版本号：1</td></tr></table>

表 4.5 FL-3.0 通信风冷设备开机前测试操作项目表  

<table><tr><td>项目编号</td><td>操作项目</td></tr><tr><td>OT002</td><td>开机前测试</td></tr></table>

安全防护注意事项

1.设备开机前、维修后、长时间停用后均需测量绝缘电阻；

2.将测量设备的电源和对外连线断开，并充分放电，确认所测对象未带电；

3.将测量设备擦拭清扫干净，并保持清洁。

保障设施、保障设备（工具）、人力人员需求

1）保障设施、保障设备(工具)

<table><tr><td rowspan=1 colspan=1>序号</td><td rowspan=1 colspan=1>名称</td><td rowspan=1 colspan=1>规格/型号</td><td rowspan=1 colspan=1>数量及单位</td><td rowspan=1 colspan=1>备注</td></tr><tr><td rowspan=1 colspan=1>1</td><td rowspan=1 colspan=1>兆欧表</td><td rowspan=1 colspan=1>ZC25-3/500V</td><td rowspan=1 colspan=1>1</td><td rowspan=1 colspan=1></td></tr></table>

2）人力人员

<table><tr><td rowspan=1 colspan=1>序号</td><td rowspan=1 colspan=1>专业</td><td rowspan=1 colspan=1>人数</td><td rowspan=1 colspan=1>技能等级</td><td rowspan=1 colspan=1>备注</td></tr><tr><td rowspan=1 colspan=1>1</td><td rowspan=1 colspan=1>电气</td><td rowspan=1 colspan=1>1</td><td rowspan=1 colspan=1>士兵</td><td rowspan=1 colspan=1></td></tr></table>

操作步骤..

1. 断开电源，确保电控箱无电；

2. 合上电控箱断路器，兆欧表一端分别接在接线端子 L1、L2、L3 上，另一端接在机组外壳接地柱上，测量其绝缘电阻；

3. 兆欧表一端分别接在接线端子 U1、V1、W1 (送风风机)、U2、V2、W2 (进风风机)、

U3、V3、W3 (海水泵)上、另一端接在机组外壳接地柱上，测量其绝缘电阻 。

4. 接通电源，合上电控箱空气开关，电源指示灯亮。

5. 按下试灯按钮，电控箱所有指示灯亮。

[](https://cdn-mineru.openxlab.org.cn/result/2025-12-29/c866b1ca-780c-4f2c-b81e-ad22767b7b12/f06f1ca5d5f784a551558c6bf3e57c4d2fe465178dcf2e018632e5c67fb707b2.jpg)  
图 002.1 兆欧表

<table><tr><td>页码：1/1</td><td>版本号：1</td></tr></table>

思考过程：
首先我需要阅读表格内容，是一个复杂HTML表格，其次，我需要判断表格的正确内容（即开始和结束部分），表 4.5 FL-3.0 通信风冷设备开机前测试操作项目表为表格的题目，"输入为：
6) 熟悉设备操作流程：

[](https://cdn-mineru.openxlab.org.cn/result/2025-12-29/c866b1ca-780c-4f2c-b81e-ad22767b7b12/3f7d0c9690775e448a8cc595287ad07b0151f2decc08a3ff47e29f41afa51c0f.jpg)  
图 001.1 设备操作流程图

<table><tr><td>页码：1/1</td><td>版本号：1</td></tr></table>"为不完整的表格内容，因此忽略该内容。接着，我需要找到表格关联的实体，从表格之前的内容可以看到"通信风冷设备开机前测试操作项目表 "是表格标题名，因此"通信风冷设备"是关联实体（related_entity），

从标题可以识别出表格为"操作使用项目表"。<table><tr><td>项目编号</td><td>操作项目</td></tr><tr><td>OT002</td><td>开机前测试</td></tr></table>，包含文本字段"项目编号"和"操作项目"字段，建立键值对{{
      "项目编号": "OT002",
      "操作项目": "定距螺旋桨主机起动与转速控制（前进/倒车）操作"
    }}，"安全防护注意事项"后接着具体步骤，应该建立字段"安全防护注意事项",构建键值对"安全防护注意事项":"1.设备开机前、维修后、长时间停用后均需测量绝缘电阻；

2.将测量设备的电源和对外连线断开，并充分放电，确认所测对象未带电；

3.将测量设备擦拭清扫干净，并保持清洁。"，"保障设施、保障设备(工具)"和"人力人员"分别两个子表的表名称，应该建立字段"保障设施、保障设备(工具)"和"人力人员",构建键值对{{
      "保障设施、保障设备(工具)": "[{{ \"序号\": \"1\", \"名称\": \"主机控制操作台\", \"规格／型号\": \"含转速调节旋钮、换向手柄、紧急停机按钮，适配定距螺旋桨主机型号\", \"数量及单位\": \"1台\", \"备注\": \"需定期校验旋钮、手柄灵敏度，确保指令响应准确\" }}, {{ \"序号\": \"2\", \"名称\": \"转速监测仪表\", \"规格／型号\": \"量程0-1500r/min，精度±1r/min，支持实时显示与超限报警\", \"数量及单位\": \"1套\", \"备注\": \"安装于操作台显眼位置，便于操作人员实时盯控\" }}, {{ \"序号\": \"3\", \"名称\": \"通讯设备\", \"规格／型号\": \"防爆对讲机，有效通讯距离≥500 米，待」2部机时间≥24 小时\", \"数量及单位\": \"\", \"备注\": \"分别配备给主机操作手与驾驶室值守人员，保持联动\" }}, {{ \"序号\": \"4\", \"名称\": \"应急停机装置\", \"规格／型号\": \"瞬时动作型，额定电流≥主机控制回路电流，IP65 防护等级\", \"数量及单位\": \"2个\", \"备注\": \"1 个安装于操作台，1个安装于艉部应急位置\" }}, {{ \"序号\": \"5\", \"名称\": \"滑油／燃油参数检测仪\", \"规格／型号\": \"可检测油位、油温、油压，适配主机润滑／燃油系统\", \"数量及单位\": \"1套\", \"备注\": \"起动前快速校验系统参数是否达标\" }}, {{ \"序号\": \"6\", \"名称\": \"安全防护装备\", \"规格／型号\": \"防滑绝缘鞋、防机械伤害手套、护目镜\", \"数量及单位\": \"2套\", \"备注\": \"配备给主机操作手与辅助监测人员\" }}]"
    }},
    {{
      "人力人员": "[{{ \"房号\": \"1\", \"专业\": \"船舶主机操作专业\", \"人数\": \"1人\", \"技能等级\": \"中级及以上\", \"备注\": \"精通定距螺旋桨主机起动、换向、调速流程，能处置常见运行故障\" }}, {{ \"房号\": \"2\", \"专业\": \"主机运行监测专业\", \"人数\": \"1人\", \"技能等级\": \"初级及以上\", \"备注\": \"负责实时记录主机运行参数，与驾驶室联动传递状态信息，协助应急处置\" }}]"
    }},"操作步骤"后接着具体步骤，应该建立字段"操作步骤",构建键值对"操作步骤": "1. 断开电源，确保电控箱无电；

2. 合上电控箱断路器，兆欧表一端分别接在接线端子 L1、L2、L3 上，另一端接在机组外壳接地柱上，测量其绝缘电阻；

3. 兆欧表一端分别接在接线端子 U1、V1、W1 (送风风机)、U2、V2、W2 (进风风机)、

U3、V3、W3 (海水泵)上、另一端接在机组外壳接地柱上，测量其绝缘电阻 。

4. 接通电源，合上电控箱空气开关，电源指示灯亮。

5. 按下试灯按钮，电控箱所有指示灯亮。

[](https://cdn-mineru.openxlab.org.cn/result/2025-12-29/c866b1ca-780c-4f2c-b81e-ad22767b7b12/f06f1ca5d5f784a551558c6bf3e57c4d2fe465178dcf2e018632e5c67fb707b2.jpg)  
图 002.1 兆欧表"


综上考虑，输出为：
{{
    "table_type": "操作使用项目表",
    "related_entity": "FL-3.0 通信风冷设备",
    "rows": [
    {{
        "项目编号": "OT002",
        "操作项目": "开机前测试"
    }},
    {{
        "安全防护注意事项": "1.设备开机前、维修后、长时间停用后均需测量绝缘电阻；\\n\\n2.将测量设备的电源和对外连线断开，并充分放电，确认所测对象未带电；\\n\\n3.将测量设备擦拭清扫干净，并保持清洁。"
    }},
    {{
        "保障设施、保障设备(工具)": "[{{\\"序号\\":\\"1\\",\\"名称\\":\\"兆欧表\\",\\"规格/型号\\":\\"ZC25-3/500V\\",\\"数量及单位\\":\\"1\\",\\"备注\\":\\"\\"}}]"
    }},
    {{
        "人力人员": "[{{\\"序号\\":\\"1\\",\\"专业\\":\\"电气\\",\\"人数\\":\\"1\\",\\"技能等级\\":\\"士兵\\",\\"备注\\":\\"\\"}}]"
    }},
    {{
        "操作步骤": "1. 断开电源，确保电控箱无电；\\n\\n2. 合上电控箱断路器，兆欧表一端分别接在接线端子 L1、L2、L3 上，另一端接在机组外壳接地柱上，测量其绝缘电阻；\\n\\n3. 兆欧表一端分别接在接线端子 U1、V1、W1 (送风风机)、U2、V2、W2 (进风风机)、\\nU3、V3、W3 (海水泵)上、另一端接在机组外壳接地柱上，测量其绝缘电阻 。\\n\\n4. 接通电源，合上电控箱空气开关，电源指示灯亮。\\n\\n5. 按下试灯按钮，电控箱所有指示灯亮。\\n\\n[](https://cdn-mineru.openxlab.org.cn/result/2025-12-29/c866b1ca-780c-4f2c-b81e-ad22767b7b12/f06f1ca5d5f784a551558c6bf3e57c4d2fe465178dcf2e018632e5c67fb707b2.jpg)  \\n图 002.1 兆欧表"
    }}
]
}}
"""
  

# def extract_normaltable(chunks):
#     known_table_types_str = ', '.join(table1)
#     all_results = []
#     for idx, block in enumerate(chunks, 1):
#         print(f"=== Repair Block {idx} ===")

#         final_prompt = prompt.format(
#             known_table_types_str=known_table_types_str,
#             text=block
#         )
        
#         raw_response = openai_chat(final_prompt)
        
#         # 尝试解析 JSON
#         try:
#             cleaned = raw_response.strip()
#             if cleaned.startswith("```json"):
#                 cleaned = cleaned[7:].lstrip()
#             if cleaned.endswith("```"):
#                 cleaned = cleaned[:-3].rstrip()
            
#             # ✅ 修复：移除 ensure_ascii 和 indent
#             json_result = json.loads(cleaned)
            
#             # 可选：打印美化版（使用 dumps）
#             print(json.dumps(json_result, ensure_ascii=False, indent=2))

#             success = True
#         except Exception as e:
#             print(f"  ⚠️ 第 {idx} 切片 JSON 解析失败: {e}")
#             print(f"  原始响应: {repr(raw_response[:200])}")
#             continue  # 跳过保存失败项

        
#         all_results.append({
#             "chunk_index": idx,
#             "input_snippet": block,
#             "structured_result": json_result,
#             "success": success
#         })
    
#     return all_results
def extract_normaltable(chunks):
    known_table_types_str = ', '.join(table1)
    all_results = []
    for idx, block in enumerate(chunks, 1):
        print(f"=== 常规表格抽取： Repair Block {idx} ===")
        print(block)

        final_prompt = prompt.format(
            known_table_types_str=known_table_types_str,
            text=block
        )
        
        raw_response = OpenaiAPI.openai_chat(final_prompt,timeout=240)
        
        # 新增：检查 API 是否返回 None（例如超时、网络错误等）
        if raw_response is None:
            print(f"  ⚠️ 第 {idx} 切片 API 调用失败，跳过。")
            # all_results.append({
            #     "chunk_index": idx,
            #     "input_snippet": block,
            #     "structured_result": None,
            #     "success": False,
            #     "error": "API returned None (e.g., timeout)"
            # })
            continue

        # 尝试解析 JSON
        try:
            cleaned = raw_response.strip()
            if cleaned.startswith("```json"):
                cleaned = cleaned[7:].lstrip()
            if cleaned.endswith("```"):
                cleaned = cleaned[:-3].rstrip()
            
            json_result = json.loads(cleaned)
            print(json.dumps(json_result, ensure_ascii=False, indent=2))
            success = True
            error = None
        except Exception as e:
            print(f"  ⚠️ 第 {idx} 切片 JSON 解析失败: {e}")
            print(f"  原始响应: {repr(raw_response[:200])}")
            json_result = None
            success = False
            error = str(e)
        
        all_results.append({
            "chunk_index": idx,
            "input_snippet": block,
            "structured_result": json_result,
            "success": success,
            "error": error  # 可选：记录错误信息
        })
    
    return all_results


def safe_json_loads(s: str):
    try:
        return json.loads(s)
    except json.JSONDecodeError as e:
        # 尝试修复常见问题
        s = s.replace("\\n", "\\\n").replace("\r", "\\r").replace("\t", "\\t")
        # 或者直接清理非法字符
        import re
        s = re.sub(r'[\x00-\x1f\x7f]', '', s)  # 移除控制字符
        try:
            return json.loads(s)
        except:
            raise e
def extract_wxindextable(chunks):
    """
    批量处理一个文档的多个切片（chunks），每个切片调用大模型结构化，并返回全部结果。
    
    :param chunks: List[str] - 同一文档的多个文本切片
    :return: List[Dict] - 结构化结果列表
    """
    known_table_types_str = ', '.join(table1)
    all_results = []


    for idx, block in enumerate(chunks, 1):
        print(f"=== 复杂表格抽取： Repair Block {idx} ===")
        print(block)

        final_prompt = prompt.format(
            known_table_types_str=known_table_types_str,
            text=block
        )
        
        raw_response = OpenaiAPI.openai_chat(final_prompt,timeout=240)
        
        # 尝试解析 JSON
        try:
            cleaned = raw_response.strip()
            if cleaned.startswith("```json"):
                cleaned = cleaned[7:].lstrip()
            if cleaned.endswith("```"):
                cleaned = cleaned[:-3].rstrip()
            
            # ✅ 修复：移除 ensure_ascii 和 indent
            json_result = safe_json_loads(cleaned)
            
            # 可选：打印美化版（使用 dumps）
            print(json.dumps(json_result, ensure_ascii=False, indent=2))

            success = True
        except Exception as e:
            print(f"  ⚠️ 第 {idx} 切片 JSON 解析失败: {e}")
            print(f"  原始响应: {repr(raw_response)}")
            continue  # 跳过保存失败项

        
        all_results.append({
            "chunk_index": idx,
            "input_snippet": block,
            "structured_result": json_result,
            "success": success
        })
    
    return all_results

# if __name__ == "__main__":   


#     text = """

# ![](http://localhost:8000/output/images/1c37b053197fbdaf14a53c5ac63e9ec99ed9ca02867a52f39a7f7ae2c36a45be.jpg)

# 操作流程图  

# <table><tr><td>页码：3/3</td><td>版本号：1</td></tr></table>

# 表 4.3 定距螺旋 桨主机起动与转速控制（前进/倒车）操作  

# <table><tr><td colspan="1" rowspan="1">项目编号</td><td colspan="1" rowspan="1">操作项目</td></tr><tr><td colspan="1" rowspan="1">OT002</td><td colspan="1" rowspan="1">定距螺旋桨主机起动与转速控制（前进/倒车）操作</td></tr><tr><td colspan="2" rowspan="1">安全防护个人防护装备佩戴；检查区域内严禁明火、吸烟。</td></tr><tr><td colspan="2" rowspan="1">注意事项</td></tr><tr><td colspan="2">备车状态下不得擅自离开操作岗位，应急停机按钮保持随时可操作状态。</td></tr><tr><td colspan="2">保障设施、保障设备（工具）、人力人员需求</td></tr></table>

# 1）保障设施、保障设备(工具)

# <table><tr><td rowspan=1 colspan=1>序号</td><td rowspan=1 colspan=1>名称</td><td rowspan=1 colspan=1>规格／型号</td><td rowspan=1 colspan=1>数量及单位</td><td rowspan=1 colspan=1>备注</td></tr><tr><td rowspan=1 colspan=1>1</td><td rowspan=1 colspan=1>主机控制操作台</td><td rowspan=1 colspan=1>含转速调节旋钮、换向手柄、紧急停机按钮，适配定距螺旋桨主机型号</td><td rowspan=1 colspan=1>1台</td><td rowspan=1 colspan=1>需定期校验旋钮、手柄灵敏度，确保指令响应准确</td></tr><tr><td rowspan=1 colspan=1>2</td><td rowspan=1 colspan=1>转速监测仪表</td><td rowspan=1 colspan=1>量程0-1500r/min，精度±1r/min，支持实时显示与超限报警</td><td rowspan=1 colspan=1>1套</td><td rowspan=1 colspan=1>安装于操作台显眼位置，便于操作人员实时盯控</td></tr><tr><td rowspan=1 colspan=1>3</td><td rowspan=1 colspan=1>通讯设备</td><td rowspan=1 colspan=1>防爆对讲机，有效通讯距离≥500 米，待」2部机时间≥24 小时</td><td rowspan=1 colspan=1></td><td rowspan=1 colspan=1>分别配备给主机操作手与驾驶室值守人员，保持联动</td></tr><tr><td rowspan=1 colspan=1>4</td><td rowspan=1 colspan=1>应急停机装置</td><td rowspan=1 colspan=1>瞬时动作型，额定电流≥主机控制回路电流，IP65 防护等级</td><td rowspan=1 colspan=1>2个</td><td rowspan=1 colspan=1>1 个安装于操作台，1个安装于艉部应急位置</td></tr><tr><td rowspan=1 colspan=1>5</td><td rowspan=1 colspan=1>滑油／燃油参数检测仪</td><td rowspan=1 colspan=1>可检测油位、油温、油压，适配主机润滑／燃油系统</td><td rowspan=1 colspan=1>1套</td><td rowspan=1 colspan=1>起动前快速校验系统参数是否达标</td></tr><tr><td rowspan=1 colspan=1>6</td><td rowspan=1 colspan=1>安全防护装备</td><td rowspan=1 colspan=1>防滑绝缘鞋、防机械伤害手套、护目镜</td><td rowspan=1 colspan=1>2套</td><td rowspan=1 colspan=1>配备给主机操作手与辅助监测人员</td></tr></table>

# 2）人力人员

# <table><tr><td rowspan=1 colspan=1>房号</td><td rowspan=1 colspan=1>专业</td><td rowspan=1 colspan=1>人数</td><td rowspan=1 colspan=1>技能等级</td><td rowspan=1 colspan=1>备注</td></tr><tr><td rowspan=1 colspan=1>1</td><td rowspan=1 colspan=1>船舶主机操作专业</td><td rowspan=1 colspan=1>1人</td><td rowspan=1 colspan=1>中级及以上</td><td rowspan=1 colspan=1>精通定距螺旋桨主机起动、换向、调速流程，能处置常见运行故障</td></tr><tr><td rowspan=1 colspan=1>2</td><td rowspan=1 colspan=1>主机运行监测专业</td><td rowspan=1 colspan=1>1人</td><td rowspan=1 colspan=1>初级及以上</td><td rowspan=1 colspan=1>负责实时记录主机运行参数，与驾驶室联动传递状态信息，协助应急处置</td></tr></table>

# 操作步骤..

# 1) 起动前确认油液、冷却水参数达标，螺旋桨无障碍物，与驾驶室联动通讯畅通。  
# 2) 将离合器置空挡，启动主机怠速预热 3-5 分钟，待参数稳定后平稳增速。  
# 3) 前进 / 倒车切换时，先降至怠速脱负荷，操作换向机构确认到位后，再逐步调节  
# 转速。  
# 4) 运转中实时监测参数与设备状态，异常立即降速或停机。

# ![](http://localhost:8000/output/images/3432346bd0129a1e19dbb1cea7f0fefe7965e755d06c80c55928699864556970.jpg)

# 表 4.4 可调螺距螺旋桨（CPP）螺距与主机联合控制操作（含手柄操作）  

# <table><tr><td>页码：3/3</td><td>版本号：1</td></tr></table>
# """ 
#     chunks =[]
#     chunks.append(text)
#     res = extract_normaltable(chunks)
#     print(res)
