diff --git a/assets/image_20260713131717942.png b/assets/image_20260713131717942.png new file mode 100644 index 0000000..4fb4be8 Binary files /dev/null and b/assets/image_20260713131717942.png differ diff --git a/lib/report_generator.py b/lib/report_generator.py index dcd8f8f..10ed9af 100644 --- a/lib/report_generator.py +++ b/lib/report_generator.py @@ -19,7 +19,7 @@ ID_TO_NAME_MAPPING = { 'user_id': ('t_user', 'id', 'user_name'), 'company_id': ('t_company', 'id', 'company_name'), 'station_id': ('t_station', 'id', 'station_name'), - 'equipment_id': ('t_equipment', 'id', 'equipment_name'), + 'equipment_id': ('t_connector', 'id', 'connector_name'), } @@ -45,6 +45,13 @@ TELECOM_FIELD_MAPPING = { 'vehicle_self_no': 'company_name', # 车量自编号 → 企业名称 } +# 特来电数据中名称字段到ID字段的映射(用于匹配selected_fields中的ID字段) +TELECOM_NAME_TO_ID_FIELDS = { + 'company_name': 'company_id', + 'station_name': 'station_id', + 'equipment_name': 'equipment_id', +} + def query_telecom_orders(vehicle_self_nos, start_time_str, end_time_str): """ @@ -106,6 +113,14 @@ def query_telecom_orders(vehicle_self_nos, start_time_str, end_time_str): for telecom_field, report_field in TELECOM_FIELD_MAPPING.items(): if telecom_field in row: converted[report_field] = row[telecom_field] + + # 将名称字段复制到对应的ID字段,以便ID转名称逻辑能正确处理 + # 例如:company_name → company_id(值相同),这样 build_id_to_name_map 会查询 t_company 表 + # 但由于值是名称而不是ID,查询会失败,所以我们需要特殊处理 + for name_field, id_field in TELECOM_NAME_TO_ID_FIELDS.items(): + if name_field in converted: + converted[id_field] = converted[name_field] + # 添加数据来源标记 converted['data_source'] = '特来电' converted_orders.append(converted) @@ -134,11 +149,24 @@ def build_id_to_name_map(orders, selected_fields): # 收集所有需要查询的ID值 id_values = set() + telecom_name_values = {} # 特来电数据中的名称值(直接使用) + for order in orders: val = order.get(field) if val is not None and val != '' and val != 0: - id_values.add(str(val)) + # 检查是否是特来电订单 + if order.get('data_source') == '特来电' and field in TELECOM_NAME_TO_ID_FIELDS.values(): + # 特来电数据中的ID字段实际是名称,直接使用 + telecom_name_values[str(val)] = str(val) + else: + id_values.add(str(val)) + # 合并特来电的名称映射 + if telecom_name_values: + id_name_maps[field] = telecom_name_values + print(f"[ID转换] {field}: 特来电数据直接使用名称 {len(telecom_name_values)} 个") + + # 查询驿来特数据的ID映射 if not id_values: continue @@ -148,11 +176,14 @@ def build_id_to_name_map(orders, selected_fields): try: results = execute_query(sql, tuple(id_values)) - id_name_maps[field] = {str(row['id_val']): row['name_val'] for row in results} + if field not in id_name_maps: + id_name_maps[field] = {} + id_name_maps[field].update({str(row['id_val']): row['name_val'] for row in results}) print(f"[ID转换] {field}: 查询到 {len(results)} 个名称映射") except Exception as e: print(f"[ID转换] {field} 查询失败: {e}") - id_name_maps[field] = {} + if field not in id_name_maps: + id_name_maps[field] = {} return id_name_maps