悠修复自定义实收金额和求和采集功能增强
This commit is contained in:
@@ -319,6 +319,16 @@ def generate_daily_report(config_id, start_time=None, end_time=None):
|
||||
selected_fields = json.loads(config['selected_fields'])
|
||||
sum_fields = json.loads(config['sum_fields']) if config['sum_fields'] else []
|
||||
|
||||
# 根据配置自动添加虚拟字段到选中字段列表
|
||||
show_custom_service_fee = config.get('show_custom_service_fee', 0) == 1
|
||||
show_total_amount = config.get('show_total_amount', 0) == 1
|
||||
|
||||
if show_custom_service_fee and 'custom_service_fee' not in selected_fields:
|
||||
selected_fields.append('custom_service_fee')
|
||||
|
||||
if show_total_amount and 'custom_total_amount' not in selected_fields:
|
||||
selected_fields.append('custom_total_amount')
|
||||
|
||||
# 设置时间范围
|
||||
if not start_time or not end_time:
|
||||
now = get_beijing_time()
|
||||
@@ -340,17 +350,18 @@ def generate_daily_report(config_id, start_time=None, end_time=None):
|
||||
report_date = start_time.strftime('%Y-%m-%d')
|
||||
delete_old_history(config_id, report_date, config['split_type'], config['split_value'])
|
||||
|
||||
# 构建查询SQL - 过滤掉虚拟字段(时段电量、自定义服务费、实收金额、车辆信息等)
|
||||
# 构建查询SQL - 过滤掉虚拟字段(时段电量、自定义服务费、自定义实收总金额、车辆信息等)
|
||||
# 虚拟字段不是数据库表中的实际字段,需要动态计算或关联查询
|
||||
VIRTUAL_FIELDS = {'sharp_electricity', 'peak_electricity', 'flat_electricity', 'valley_electricity', 'custom_service_fee', 'total_amount', 'car_bus_path', 'car_sn'}
|
||||
# 注意:total_amount 是旧版虚拟字段名,为了向后兼容也需要包含在内
|
||||
VIRTUAL_FIELDS = {'sharp_electricity', 'peak_electricity', 'flat_electricity', 'valley_electricity', 'custom_service_fee', 'custom_total_amount', 'total_amount', 'car_bus_path', 'car_sn'}
|
||||
db_fields = [f for f in selected_fields if f not in VIRTUAL_FIELDS]
|
||||
|
||||
# 确保 charge_degree 总是被查询(用于计算总电量)
|
||||
if 'charge_degree' not in db_fields:
|
||||
db_fields.append('charge_degree')
|
||||
|
||||
# 如果选择了实收金额字段,需要确保查询 charge_elecfee_amount(电费金额)
|
||||
if 'total_amount' in selected_fields and 'charge_elecfee_amount' not in db_fields:
|
||||
# 如果选择了自定义实收总金额字段,需要确保查询 charge_elecfee_amount(电费金额)
|
||||
if 'custom_total_amount' in selected_fields and 'charge_elecfee_amount' not in db_fields:
|
||||
db_fields.append('charge_elecfee_amount')
|
||||
|
||||
# 确保至少有 order_no 字段用于关联分时数据
|
||||
@@ -506,6 +517,31 @@ def generate_daily_report(config_id, start_time=None, end_time=None):
|
||||
|
||||
log_info(f"[日报生成] 已计算 {len(time_period_electricity)} 条订单的分时段电量", 'report')
|
||||
|
||||
# 计算虚拟字段(自定义服务费、自定义实收总金额)并添加到订单数据中
|
||||
# 这样求和数据才能正确计算这些字段的总和
|
||||
has_custom_service_fee = config.get('custom_service_fee_price') is not None and str(config.get('custom_service_fee_price', '')).strip() != ''
|
||||
if has_custom_service_fee:
|
||||
custom_service_fee_price = float(config['custom_service_fee_price'])
|
||||
for order in orders:
|
||||
charge_degree = float(order.get('charge_degree', 0) or 0)
|
||||
custom_service_fee = round(charge_degree * custom_service_fee_price, 2)
|
||||
order['custom_service_fee'] = custom_service_fee
|
||||
|
||||
# 计算自定义实收总金额(实收电费 + 自定义服务费)
|
||||
actual_money = float(order.get('charge_elecfee_amount', 0) or 0)
|
||||
custom_total_amount = round(actual_money + custom_service_fee, 2)
|
||||
order['custom_total_amount'] = custom_total_amount
|
||||
# 兼容旧版字段名 total_amount
|
||||
order['total_amount'] = custom_total_amount
|
||||
else:
|
||||
# 如果没有自定义服务费,自定义实收总金额 = 实收电费
|
||||
for order in orders:
|
||||
actual_money = float(order.get('charge_elecfee_amount', 0) or 0)
|
||||
custom_total_amount = round(actual_money, 2)
|
||||
order['custom_total_amount'] = custom_total_amount
|
||||
# 兼容旧版字段名 total_amount
|
||||
order['total_amount'] = custom_total_amount
|
||||
|
||||
# 计算求和(保留三位小数)
|
||||
sum_results = {}
|
||||
for field in sum_fields:
|
||||
@@ -523,6 +559,27 @@ def generate_daily_report(config_id, start_time=None, end_time=None):
|
||||
sum_results['charge_degree'] = round(total_charge_degree, 3)
|
||||
log_info(f"[日报生成] 强制采集充电电量: {sum_results['charge_degree']} kWh", 'report')
|
||||
|
||||
# 强制采集实收电费(charge_elecfee_amount),用于计算自定义实收总金额的求和
|
||||
if 'charge_elecfee_amount' not in sum_results and orders:
|
||||
has_charge_elecfee_amount = any('charge_elecfee_amount' in order for order in orders)
|
||||
if has_charge_elecfee_amount:
|
||||
total_charge_elecfee_amount = sum(float(order.get('charge_elecfee_amount', 0) or 0) for order in orders)
|
||||
sum_results['charge_elecfee_amount'] = round(total_charge_elecfee_amount, 3)
|
||||
|
||||
# 强制采集自定义服务费(custom_service_fee),直接使用订单中已计算好的值求和
|
||||
if 'custom_service_fee' not in sum_results and orders:
|
||||
has_custom_service_fee_field = any('custom_service_fee' in order for order in orders)
|
||||
if has_custom_service_fee_field:
|
||||
total_custom_service_fee = sum(float(order.get('custom_service_fee', 0) or 0) for order in orders)
|
||||
sum_results['custom_service_fee'] = round(total_custom_service_fee, 2)
|
||||
|
||||
# 强制采集自定义实收总金额(custom_total_amount),直接使用订单中已计算好的值求和
|
||||
if 'custom_total_amount' not in sum_results and orders:
|
||||
has_custom_total_amount = any('custom_total_amount' in order for order in orders)
|
||||
if has_custom_total_amount:
|
||||
total_custom_total_amount = sum(float(order.get('custom_total_amount', 0) or 0) for order in orders)
|
||||
sum_results['custom_total_amount'] = round(total_custom_total_amount, 2)
|
||||
|
||||
# 构建ID到名称的映射
|
||||
id_name_maps = build_id_to_name_map(orders, selected_fields)
|
||||
|
||||
@@ -772,11 +829,11 @@ def generate_excel(orders, selected_fields, sum_fields, sum_results,
|
||||
display_name = f'自定义服务费({custom_service_fee_price}元/kWh)'
|
||||
else:
|
||||
display_name = '自定义服务费'
|
||||
elif field == 'total_amount':
|
||||
elif field == 'custom_total_amount' or field == 'total_amount':
|
||||
if total_amount_name and str(total_amount_name).strip():
|
||||
display_name = str(total_amount_name).strip()
|
||||
else:
|
||||
display_name = '实收金额'
|
||||
display_name = '自定义实收总金额'
|
||||
elif field in field_custom_names and field_custom_names[field]:
|
||||
display_name = field_custom_names[field]
|
||||
elif field in id_name_maps and id_name_maps[field]:
|
||||
@@ -810,19 +867,11 @@ def generate_excel(orders, selected_fields, sum_fields, sum_results,
|
||||
cell = ws.cell(row=row_idx, column=col_idx)
|
||||
|
||||
if field == 'custom_service_fee':
|
||||
if has_custom_service_fee:
|
||||
charge_degree = float(order.get('charge_degree', 0) or 0)
|
||||
value = round(charge_degree * float(custom_service_fee_price), 2)
|
||||
else:
|
||||
value = ''
|
||||
elif field == 'total_amount':
|
||||
actual_money = float(order.get('charge_elecfee_amount', 0) or 0)
|
||||
if has_custom_service_fee:
|
||||
charge_degree = float(order.get('charge_degree', 0) or 0)
|
||||
custom_fee = round(charge_degree * float(custom_service_fee_price), 2)
|
||||
value = round(actual_money + custom_fee, 2)
|
||||
else:
|
||||
value = round(actual_money, 2)
|
||||
# 直接使用订单数据中已计算好的值
|
||||
value = order.get('custom_service_fee', '')
|
||||
elif field == 'custom_total_amount' or field == 'total_amount':
|
||||
# 直接使用订单数据中已计算好的值(兼容旧版字段名 total_amount)
|
||||
value = order.get('custom_total_amount', order.get('total_amount', ''))
|
||||
else:
|
||||
value = order.get(field, '')
|
||||
|
||||
@@ -842,7 +891,7 @@ def generate_excel(orders, selected_fields, sum_fields, sum_results,
|
||||
cell.border = thin_border
|
||||
|
||||
# 数字字段靠右对齐,其他居中或靠左
|
||||
if field in numeric_fields or field in ['custom_service_fee', 'total_amount']:
|
||||
if field in numeric_fields or field in ['custom_service_fee', 'custom_total_amount', 'total_amount']:
|
||||
cell.alignment = Alignment(horizontal='right', vertical='center')
|
||||
if isinstance(value, (int, float)):
|
||||
cell.number_format = '0.00'
|
||||
@@ -873,21 +922,30 @@ def generate_excel(orders, selected_fields, sum_fields, sum_results,
|
||||
cell.border = thin_border
|
||||
|
||||
if field == 'custom_service_fee':
|
||||
if has_custom_service_fee:
|
||||
# 直接使用订单中已计算好的值求和,确保与数据行一致
|
||||
if 'custom_service_fee' in sum_results:
|
||||
value = sum_results['custom_service_fee']
|
||||
elif has_custom_service_fee:
|
||||
total_charge_degree = sum_results.get('charge_degree', 0)
|
||||
value = round(float(total_charge_degree) * float(custom_service_fee_price), 2)
|
||||
cell.value = value
|
||||
cell.font = sum_font
|
||||
cell.alignment = Alignment(horizontal='right', vertical='center')
|
||||
cell.number_format = '0.00'
|
||||
elif field == 'total_amount':
|
||||
total_actual_money = sum_results.get('charge_elecfee_amount', 0)
|
||||
if has_custom_service_fee:
|
||||
total_charge_degree = sum_results.get('charge_degree', 0)
|
||||
total_custom_fee = round(float(total_charge_degree) * float(custom_service_fee_price), 2)
|
||||
value = round(float(total_actual_money) + total_custom_fee, 2)
|
||||
else:
|
||||
value = round(float(total_actual_money), 2)
|
||||
value = ''
|
||||
cell.value = value
|
||||
cell.font = sum_font
|
||||
cell.alignment = Alignment(horizontal='right', vertical='center')
|
||||
cell.number_format = '0.00'
|
||||
elif field == 'custom_total_amount' or field == 'total_amount':
|
||||
# 直接使用订单中已计算好的值求和,确保与数据行一致
|
||||
if 'custom_total_amount' in sum_results:
|
||||
value = sum_results['custom_total_amount']
|
||||
else:
|
||||
total_actual_money = sum_results.get('charge_elecfee_amount', 0)
|
||||
if has_custom_service_fee:
|
||||
total_charge_degree = sum_results.get('charge_degree', 0)
|
||||
total_custom_fee = round(float(total_charge_degree) * float(custom_service_fee_price), 2)
|
||||
value = round(float(total_actual_money) + total_custom_fee, 2)
|
||||
else:
|
||||
value = round(float(total_actual_money), 2)
|
||||
cell.value = value
|
||||
cell.font = sum_font
|
||||
cell.alignment = Alignment(horizontal='right', vertical='center')
|
||||
@@ -1022,7 +1080,7 @@ def generate_excel(orders, selected_fields, sum_fields, sum_results,
|
||||
col_widths[col_idx] = min(max_length + 2, 50)
|
||||
|
||||
# 标记数值类型字段(求和类列)
|
||||
if field in numeric_fields or field in ['custom_service_fee', 'total_amount']:
|
||||
if field in numeric_fields or field in ['custom_service_fee', 'custom_total_amount', 'total_amount']:
|
||||
numeric_cols.append(col_idx)
|
||||
|
||||
# 计算数值类型列的最大宽度,使所有求和类列宽度一致
|
||||
|
||||
Reference in New Issue
Block a user