'commit'
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user