diff --git a/lib/field_mapping.py b/lib/field_mapping.py index e02b746..ad5693b 100644 --- a/lib/field_mapping.py +++ b/lib/field_mapping.py @@ -195,6 +195,34 @@ def get_all_fields_with_display(): """获取所有字段,包含key和显示名称""" return [{'key': k, 'display': v} for k, v in FIELD_MAPPING.items()] +# 结束原因映射(finish_type + finish_code -> 中文原因) +# finish_type: 1=正常结束, 2=补单结束 +FINISH_REASON_MAPPING = { + (1, 0): '正常结束', + (1, 1): '充电异常', + (1, 2): '用户取消', + (1, 3): '设备故障', + (1, 4): '网络异常', + (1, 5): '超时', + (1, 6): '过温保护', + (1, 7): '过流保护', + (1, 8): '欠压保护', + (1, 9): '过压保护', + (1, 10): '接地故障', + (1, 11): '绝缘故障', + (1, 12): '通信故障', + (1, 13): '计费异常', + (1, 14): '结算异常', + (1, 15): '卡异常', + (1, 16): '授权失败', + (1, 17): '余额不足', + (1, 18): '功率受限', + (1, 19): '充电中断', + (1, 20): '自动充满', + (2, 0): '补单结束', +} + + # 默认字段列表(常用字段) DEFAULT_FIELDS = [ 'order_no', @@ -208,3 +236,28 @@ DEFAULT_FIELDS = [ 'state', 'report_time' ] + + +# 获取结束原因 +def get_finish_reason(finish_type, finish_code, finish_msg): + """ + 根据finish_type和finish_code获取中文结束原因 + + Args: + finish_type: 完成类型 + finish_code: 完成代码 + finish_msg: 原始结束消息(作为后备) + + Returns: + str: 中文结束原因 + """ + key = (finish_type, finish_code) + if key in FINISH_REASON_MAPPING: + return FINISH_REASON_MAPPING[key] + + # 如果finish_msg有效,直接使用 + if finish_msg and finish_msg not in ('停止原因无效', '未知原因', 'None'): + return finish_msg + + # 默认返回 + return '未知原因' diff --git a/lib/report_generator.py b/lib/report_generator.py index 65e539e..fb51e20 100644 --- a/lib/report_generator.py +++ b/lib/report_generator.py @@ -9,7 +9,7 @@ from openpyxl.styles import Font, Alignment, PatternFill import pytz from lib.db import execute_query, execute_insert, execute_update -from lib.field_mapping import get_field_display_name +from lib.field_mapping import get_field_display_name, get_finish_reason from lib.logger import log_info, log_error, log_warning @@ -391,9 +391,15 @@ def generate_daily_report(config_id, start_time=None, end_time=None): log_info(f"[日报生成] 驿来特查询到 {len(orders)} 条订单", 'report') - # 添加数据来源标记 + # 添加数据来源标记并转换结束原因 for order in orders: order['data_source'] = '驿来特' + # 转换结束原因 + finish_type = order.get('finish_type') + finish_code = order.get('finish_code') + finish_msg = order.get('finish_msg') + if finish_type is not None: + order['finish_msg'] = get_finish_reason(finish_type, finish_code, finish_msg) # 检查是否有补单记录(finish_type = 2 表示补单结束) has_supplement = any(order.get('finish_type') == 2 for order in orders)