This commit is contained in:
HuangHai
2026-01-15 10:14:44 +08:00
parent ccac3e889c
commit 23dfa433b0
6 changed files with 96 additions and 58 deletions

View File

@@ -324,46 +324,74 @@ def _build_station_sheet(ws, row: Dict[str, Any]):
row_idx = header_row + 1
# Track last valid values for forward filling
last_valid_price = None
last_valid_electric = None
last_valid_service = None
# 预处理 schedule_items如果只有 24 个且没有 start/end补充时间
processed_items = []
if len(schedule_items) == 24:
has_time = any(item.get("start") or item.get("begin") or item.get("start_time") for item in schedule_items if isinstance(item, dict))
if not has_time:
for i, item in enumerate(schedule_items):
if not isinstance(item, dict): continue
new_item = item.copy()
new_item["start"] = f"{i:02d}:00"
new_item["end"] = f"{i+1:02d}:00"
processed_items.append(new_item)
else:
processed_items = schedule_items
else:
processed_items = schedule_items
for item in schedule_items:
if not isinstance(item, dict):
continue
# 进一步优化:合并连续相同价格的时段
merged_items = []
if processed_items:
current_group = None
for item in processed_items:
if not isinstance(item, dict): continue
# 提取关键价格信息用于比较
price = _to_float(item.get("price_kwh") if "price_kwh" in item else item.get("price"))
elec = _to_float(item.get("electric_fee_kwh") if "electric_fee_kwh" in item else item.get("electric_fee") if "electric_fee" in item else item.get("elec_price"))
serv = _to_float(item.get("service_fee_kwh") if "service_fee_kwh" in item else item.get("service_fee") if "service_fee" in item else item.get("service_price"))
remark = item.get("type") or item.get("tag") or item.get("period") or ""
start = item.get("start") or item.get("begin") or item.get("start_time") or ""
end = item.get("end") or item.get("finish") or item.get("end_time") or ""
start = item.get("start") or item.get("begin") or item.get("start_time") or ""
end = item.get("end") or item.get("finish") or item.get("end_time") or ""
if current_group is None:
current_group = {
"start": start,
"end": end,
"price": price,
"elec": elec,
"serv": serv,
"remark": remark
}
else:
# 如果价格、电费、服务费、备注都相同,则合并
if (current_group["price"] == price and
current_group["elec"] == elec and
current_group["serv"] == serv and
current_group["remark"] == remark):
current_group["end"] = end
else:
merged_items.append(current_group)
current_group = {
"start": start,
"end": end,
"price": price,
"elec": elec,
"serv": serv,
"remark": remark
}
if current_group:
merged_items.append(current_group)
price = _to_float(item.get("price_kwh") if "price_kwh" in item else item.get("price"))
electric_fee = _to_float(item.get("electric_fee_kwh") if "electric_fee_kwh" in item else item.get("electric_fee"))
service_fee = _to_float(item.get("service_fee_kwh") if "service_fee_kwh" in item else item.get("service_fee"))
# Forward fill if None
if price is None and last_valid_price is not None:
price = last_valid_price
if electric_fee is None and last_valid_electric is not None:
electric_fee = last_valid_electric
if service_fee is None and last_valid_service is not None:
service_fee = last_valid_service
# Update last valid values if current is not None
if price is not None:
last_valid_price = price
if electric_fee is not None:
last_valid_electric = electric_fee
if service_fee is not None:
last_valid_service = service_fee
remark = item.get("type") or item.get("tag") or item.get("period") or ""
ws.cell(row=row_idx, column=1, value=start)
ws.cell(row=row_idx, column=2, value=end)
ws.cell(row=row_idx, column=3, value=price)
ws.cell(row=row_idx, column=4, value=electric_fee)
ws.cell(row=row_idx, column=5, value=service_fee)
ws.cell(row=row_idx, column=6, value=remark)
for item in merged_items:
ws.cell(row=row_idx, column=1, value=item["start"])
ws.cell(row=row_idx, column=2, value=item["end"])
ws.cell(row=row_idx, column=3, value=item["price"])
ws.cell(row=row_idx, column=4, value=item["elec"])
ws.cell(row=row_idx, column=5, value=item["serv"])
ws.cell(row=row_idx, column=6, value=item["remark"])
_apply_table_cell_style(ws, row_idx, 1, len(headers), center_cols=[1, 2, 3, 4, 5])
row_idx += 1