1.可视化图表
"""
@Project : 01-python-learn
@File : main.py
@IDE : PyCharm
@Author : 刘庆东
@Date : 2025/9/25 9:10主函数类
"""
import os
import webbrowserfrom power_grid_system import system
from database import db
from datetime import datetime,timedeltadef main():print("⚡ 欢迎使用XXX电网管理系统")while not system.current_user:if not login_menu():retry=input("登录失败,重试吗?(y/n)")if retry.lower() != "y":print("再见!")return while True:main_menu()try:choice=input("请选择功能[请输入1--7之间的数字]:").strip()if choice =='1':view_substations()elif choice =='2':view_equipment()elif choice =='3':view_latest_power_data()elif choice =='4':create_work_orders()elif choice =='5':view_my_work_orders()elif choice =='6':passelif choice =='7':generate_charts_for_equipment()elif choice =='8':system.login_out()print("已经退出系统,")breakelse:print("无效选择,请重新输入:")except Exception as e:print(f"程序被中断,再见!原因是:{e}")breakdef generate_charts_for_equipment():substations = system.get_substations()if not substations:print(" 无可用变电站")input("按回车键返回...")returnprint("\n 选择设备生成图表:")all_equipment = []for sub in substations:eq_list = system.get_equipment_by_substation_id(sub['substation_id'])for eq in eq_list:all_equipment.append(eq)if not all_equipment:print(" 无可用设备")input("按回车键返回...")returnfor i, eq in enumerate(all_equipment, 1):print(f"{i}. {eq['equipment_name']} ({eq['equipment_type']})")try:choice = int(input("选择设备: ")) - 1if 0 <= choice < len(all_equipment):selected_eq = all_equipment[choice]hours = int(input("查看过去多少小时的数据? (默认24): ") or "24")charts = []voltage_chart = system.create_voltage_chart(selected_eq['equipment_id'], hours)if voltage_chart:charts.append(("voltage", voltage_chart))if not charts:print(" 无法生成任何图表,可能缺少数据")input("按回车键返回...")returnfrom pyecharts.charts import Pagepage = Page(layout=Page.SimplePageLayout, page_title=f"{selected_eq['equipment_name']} 监控面板")for name, chart in charts:page.add(chart)filename = f"charts/{selected_eq['equipment_name'].replace(' ', '_')}_monitoring_{datetime.now().strftime('%Y%m%d_%H%M%S')}.html"os.makedirs("charts", exist_ok=True)page.render(filename)print(f"\n图表已生成并保存至: {filename}")open_in_browser = input("是否在浏览器中打开? (y/n): ")if open_in_browser.lower() == 'y':webbrowser.open(f"file://{os.path.abspath(filename)}")else:print(" 无效选择")except ValueError:print(" 输入错误")input("\n按回车键返回...")
def view_substations():substations = system.get_substations()print("变电站列表:")print(f"{'ID':<4} {'名称':<15} {'位置':<20}"f" {'电压(KV)':<10} "f"{'容量(MA)':<10} {'状态':<10} {'负责人'}")print("_" * 36)for sub in substations:print(f"{sub['substation_id']:<4}"f"{sub['substation_name']:<15}"f"{sub['location']:<20}"f"{sub['voltage_level_kV']:<10}"f"{sub['capacity_MVA']:<10}"f"{sub['status']:<15}"f"{sub['operator_name']}")
def view_equipment():substations=system.get_substations()if not substations:print("暂无变电站数据")returnprint("请选择变电站:")for i,sub in enumerate(substations,1):print(f"{i}. {sub['substation_name']:<15} {sub['location']:<20}")try:choice=int(input("请选择编号:"))-1if 0<=choice<len(substations):selected_sub = substations[choice]equipments=system.get_equipment_by_substation_id(selected_sub['substation_id'])print(f"变电站{sub['substation_name']}的设备列表:")print("-"*36)print(f"{'ID':<4} {'名称':<20} {'类型':<12} {'型号':<15} {'序列号':<15} {'状态'}")print("-" * 36)for eq in equipments:print(f"{eq['equipment_id']:<4} {eq['equipment_name']:<20} {eq['equipment_type']:<12} "f"{eq['model']:<15} {eq['serial_number']:<15} {eq['status']}")print("-"*36)except Exception as e:print(f"请输入有效的数字:{e}")
def create_work_orders():title=input("工单标题:").strip()description=input("工单的描述").strip() substations=system.get_substations()if not substations:print("没有可用的变电站")returnprint("选择关联的设备")for i,sub in enumerate(substations,1):print(f"{i}. {sub['substation_name']:<15} ")try:sub_choice=int(input("选择变电站"))-1if sub_choice<0 or sub_choice>=len(substations):print("无效的选择")returnselected_sub = substations[sub_choice]equipments=system.get_equipment_by_substation_id(selected_sub['substation_id'])if not equipments:print("该变电站木有设备")returnprint(f"您选择了{selected_sub['substation_name']}的设备")for i,eq in enumerate(equipments,1):print(f"{i}. {eq['equipment_name']} {eq['equipment_type']}")eq_choice=int(input("选择设备:"))-1if eq_choice<0 or eq_choice>=len(equipments):print("无效选择")returnselected_eq= equipments[eq_choice]engineers=[u for u in system.get_users() if u['role']=='engineer']if not engineers:print("无空闲的工程师!")returnprint("指派给工程师:")for i,eng in enumerate(engineers,1):print(f"{i}. {eng['username']} {eng['role']}")eng_choice=int(input("选择工程师"))-1if eng_choice<0 or eng_choice>=len(engineers):print("无效的选择")returnassigned_to=engineers[eng_choice]['user_id']priority=input("优先级:low/medium/high/critical 默认的是[medium]: ").strip() or "medium"if priority not in ["low", "medium", "high", "critical"]:priority='medium'start_time=(datetime.now() + timedelta(hours=1)).strftime('%Y-%m-%d %H:%M:%S')end_time=(datetime.now() + timedelta(hours=3)).strftime('%Y-%m-%d %H:%M:%S')order_id=system.create_work_order(title=title,description=description,equipment_id=selected_eq['equipment_id'],substation_id=selected_sub['substation_id'],assigned_to=assigned_to,priority=priority,scheduled_start = start_time,scheduled_end = end_time)print(f"工单创建成功!工单号是:{order_id}")except Exception as e:print(f"输入有错误:{e}")
def view_latest_power_data():results=system.latest_power_data()print("最新的电力数据:")"""e.equipment_id, 设备IDe.equipment_name, 设备名称p.timestamp, 数据采集时间p.voltage_kV, 电压值p.current_A, 电流值p.active_power_kW 有功功率"""print(f"{'设备ID':<10}"f"{'设备名称':<20}"f"{'数据采集时间':<20}"f"{'电压值':<10}"f"{'电流值':<10}"f"{'功率':<10}")print("_"*36)for row in results:print(f"{row['equipment_id']:<10} "f"{row['equipment_name']:<20} "f"{row['timestamp'].strftime('%Y-%m-%d %H:%M:%S')}"f"{row['voltage_kV']:<10}"f"{row['current_A']:<10}"f"{row['active_power_kW']:<10}")print("_"*36)
def view_my_work_orders():orders=system.get_work_orders(system.current_user['user_id'])print(f"我的工单(共{len(orders)}个):")print(f"{'ID':<10}"f"{'标题':<30}"f"{'设备':<20}"f"{'状态':<10}"f"{'优先级':<10}"f"{'创建时间':<10}")print("-"*36)for order in orders:print(f"{order['order_id']:<10} "f"{order['title']:<30}"f"{order['equipment_id']:<30}"f"{order['status']:<10}"f"{order['priority']:<10}"f"{order['created_at']:<10}")print("-"*36)
def main_menu():print("\n" + "=" * 36)print(" 国家电网管理系统")print("=" * 36)print(f"当前用户: {system.current_user['full_name']} ({system.current_user['role']})")print("1. 查看变电站列表")print("2. 查看设备列表")print("3. 查看最新电力数据")print("4. 创建工单")print("5. 查看我的工单")print("6. 系统日志")print("7. 图表功能")print("8. 退出")print("-" * 36)
def login_menu():print("\n" + "=" * 36)print(" *****登录系统******")username=input("请输入用户名:")password=input("请输入用密码:")success_login=system.login(username, password)if success_login:print(f"恭喜您{username}登录成功了")return Trueelse:print(f"系统登录失败")return Falseprint("\n" + "=" * 36)if __name__ == '__main__':main()