#!/usr/bin/env python # -*- coding: utf-8 -*- """ 将温度表格数据转换为 SQL Server 格式 脚本返回的表格数据需要转换为 SQL Server 的字段格式 """ from typing import Dict, Any, List, Optional from logger import get_logger logger = get_logger() def convert_temperature_table_to_sqlserver( script_data: Dict[str, Any], work_order_no: str, global_params: Dict[str, str] = None ) -> Dict[str, Any]: """ 将温度表格数据转换为 SQL Server 格式 Args: script_data: 脚本返回的数据,格式为 {"tables": [{"cells": [...]}]} work_order_no: 工单号 global_params: 全局参数字典 Returns: SQL Server 格式的数据字典 """ try: # 提取表格数据 tables = script_data.get('tables', []) if not tables: logger.warning("脚本数据中没有 tables 字段") return {} table = tables[0] cells = table.get('cells', []) if not cells: logger.warning("表格中没有 cells 数据") return {} # 初始化结果字典 result = { 'order_no': work_order_no, } # 从全局参数中获取额外字段 if global_params: logger.debug(f"全局参数内容: {global_params}") # 跑合日期 - 支持多个字段名 runin_date = (global_params.get('runin_date') or global_params.get('current_date') or global_params.get('date')) if runin_date: result['runin_date'] = runin_date logger.debug(f"获取跑合日期: {runin_date}") # 跑合人员/操作员 - 支持多个字段名 operator_name = (global_params.get('operator_name') or global_params.get('executor') or global_params.get('operator')) if operator_name: result['operator_name'] = operator_name logger.debug(f"获取操作员: {operator_name}") # 动力端零件号 - 支持多个字段名 power_end_part_no = (global_params.get('power_end_part_no') or global_params.get('part_no') or global_params.get('part_number')) if power_end_part_no: result['power_end_part_no'] = power_end_part_no logger.debug(f"获取零件号: {power_end_part_no}") # 电机转速 - 支持多个字段名 motor_speed = (global_params.get('motor_speed_rpm') or global_params.get('motor_speed') or global_params.get('speed_rpm')) if motor_speed: try: result['motor_speed_rpm'] = int(motor_speed) logger.debug(f"获取电机转速: {motor_speed} -> {result['motor_speed_rpm']}") except (ValueError, TypeError): logger.warning(f"无法转换电机转速: {motor_speed}") logger.info(f"从全局参数获取字段: runin_date={result.get('runin_date')}, " f"operator_name={result.get('operator_name')}, " f"power_end_part_no={result.get('power_end_part_no')}, " f"motor_speed_rpm={result.get('motor_speed_rpm')}") # 定义行到测点的映射(基于实际数据结构) # 行索引从 4 开始(因为脚本中 cell["row"] += 4) row_mapping = { 4: 'main_1', # 主轴承#1 5: 'main_2', # 主轴承#2 6: 'main_3', # 主轴承#3 7: 'main_4', # 主轴承#4 8: 'crosshead_1', # 十字头#1 9: 'crosshead_2', # 十字头#2 10: 'crosshead_3', # 十字头#3 11: 'gbox_small_1', # 减速箱小轴承#1(输入法兰端) 12: 'gbox_small_2', # 减速箱小轴承#2 13: 'gbox_big_3', # 减速箱大轴承#3(大端盖端) 14: 'gbox_big_4', # 减速箱大轴承#4 # row 15: 润滑油温(不需要 temp_ 前缀,跳过) # row 16: 润滑油压(不需要 temp_ 前缀,跳过) } # 列到时间点的映射(0-6 对应 t05-t35) col_mapping = { 0: 't05', # 0.5h 1: 't10', # 1h 2: 't15', # 1.5h 3: 't20', # 2h 4: 't25', # 2.5h 5: 't30', # 3h 6: 't35', # 3.5h (通常为空,但仍需要插入 NULL) } # 处理环境温度(row=0, col=1) for cell in cells: if cell.get('row') == 0 and cell.get('col') == 1: value_str = cell.get('value', '') if value_str: try: result['ambient_temp_c'] = float(value_str) except ValueError: pass break # 处理实验时间(row=1) for cell in cells: if cell.get('row') == 1: col = cell.get('col') value_str = cell.get('value', '') if col == 1 and value_str: # 开始时间 result['start_time'] = value_str elif col == 3 and value_str: # 结束时间 result['end_time'] = value_str # 处理温度数据 for cell in cells: row = cell.get('row') col = cell.get('col') value_str = cell.get('value', '') # 获取测点名称 part_name = row_mapping.get(row) if not part_name: continue # 获取时间点 time_point = col_mapping.get(col) if not time_point: continue # 构建字段名 field_name = f"temp_{part_name}_{time_point}" # 转换值(空字符串转为 None,表示 NULL) if not value_str or value_str.strip() == '': result[field_name] = None logger.debug(f"转换: {field_name} = NULL") else: try: value = float(value_str) result[field_name] = value logger.debug(f"转换: {field_name} = {value}") except ValueError: logger.warning(f"无法转换值: {field_name} = {value_str}") result[field_name] = None logger.info(f"转换完成,共 {len(result)} 个字段") return result except Exception as e: logger.error(f"转换数据失败: {e}", exc_info=True) return {} def test_conversion(): """测试转换功能""" # 测试数据 test_data = { "tables": [{ "token": "scriptTable1", "startRow": 0, "startCol": 0, "cells": [ {"row": 0, "col": 1, "value": "13.4"}, # 环境温度 {"row": 1, "col": 1, "value": "2025-12-05 14:00:00"}, # 开始时间 {"row": 1, "col": 3, "value": "2025-12-05 17:30:00"}, # 结束时间 {"row": 4, "col": 0, "value": "14.0"}, # 主轴承#1 @ 0.5h {"row": 4, "col": 1, "value": "14.2"}, # 主轴承#1 @ 1h {"row": 5, "col": 0, "value": "13.7"}, # 主轴承#2 @ 0.5h ] }] } result = convert_temperature_table_to_sqlserver(test_data, "TEST001") print("转换结果:") import json print(json.dumps(result, ensure_ascii=False, indent=2)) if __name__ == "__main__": test_conversion()