完全重构为Python + Flask架构,包含: 1. 核心模块: - lib/db.py:数据库连接(PyMySQL) - lib/field_mapping.py:字段映射(100+字段英文→中文) - lib/report_generator.py:日报生成核心逻辑 2. Flask应用: - app.py:主应用,包含所有API路由 - 配置管理API(CRUD、启用/禁用、排序) - 日报生成API(支持预设/自定义时间) - 历史记录API(分页查询) - 文件下载API - 定时任务(APScheduler,每天8:01) 3. 前端页面: - templates/index.html:完整的单页面应用 - 三个标签页:配置管理、日报生成、历史记录 - 原生HTML+CSS+JavaScript,无需构建 4. 依赖管理: - requirements.txt:Python依赖清单 - Flask 3.0.0 + Flask-CORS 4.0.0 - PyMySQL 1.1.0(数据库驱动) - openpyxl 3.1.2(Excel处理) - APScheduler 3.10.4(定时任务) 5. 启动脚本: - scripts/dev.bat:Windows开发环境启动 - scripts/start.bat:Windows生产环境启动 6. 文档: - README.md:完整的安装、运行、使用指南 - 包含API接口说明、数据库表结构、常见问题 Windows运行方式: 1. 安装Python 3.8+ 2. pip install -r requirements.txt 3. scripts\dev.bat 或 python app.py 4. 访问 http://localhost:5000 5. 初始化数据库:POST /api/init-tables 所有功能完整保留: ✅ 定时任务(每天8:01) ✅ 配置管理(CRUD+启用/禁用+排序) ✅ 日报生成(按配置+时间范围) ✅ 历史记录(查看+下载) ✅ 自定义字段(中文显示) ✅ 求和功能(多字段求和) ✅ 按企业/用户拆分 ✅ Excel导出 Coze-Commit-Type: user Coze-User-ID: 3722323274763196 Coze-Conversation-ID: 9894087
135 lines
4.6 KiB
Python
135 lines
4.6 KiB
Python
"""
|
|
字段映射模块
|
|
将数据库英文字段名映射为中文显示名
|
|
"""
|
|
|
|
# 字段映射字典(英文 -> 中文)
|
|
FIELD_MAPPING = {
|
|
'id': '订单ID',
|
|
'order_no': '订单号',
|
|
'company_id': '企业ID',
|
|
'user_id': '用户ID',
|
|
'user_name': '用户名称',
|
|
'order_type': '订单类型',
|
|
'state': '订单状态',
|
|
'report_time': '上报时间',
|
|
'start_time': '开始时间',
|
|
'end_time': '结束时间',
|
|
'charge_duration': '充电时长(秒)',
|
|
'charge_energy': '充电电量(kWh)',
|
|
'charge_money': '充电金额(元)',
|
|
'service_money': '服务费(元)',
|
|
'electricity_money': '电费(元)',
|
|
'total_money': '总金额(元)',
|
|
'pile_id': '充电桩ID',
|
|
'pile_no': '充电桩编号',
|
|
'gun_no': '枪号',
|
|
'start_soc': '起始SOC(%)',
|
|
'end_soc': '结束SOC(%)',
|
|
'start_voltage': '起始电压(V)',
|
|
'end_voltage': '结束电压(V)',
|
|
'start_current': '起始电流(A)',
|
|
'end_current': '结束电流(A)',
|
|
'temperature': '温度(℃)',
|
|
'create_time': '创建时间',
|
|
'update_time': '更新时间',
|
|
'pay_type': '支付方式',
|
|
'pay_time': '支付时间',
|
|
'pay_status': '支付状态',
|
|
'stop_reason': '停止原因',
|
|
'station_id': '充电站ID',
|
|
'station_name': '充电站名称',
|
|
'address': '地址',
|
|
'city': '城市',
|
|
'province': '省份',
|
|
'area': '区域',
|
|
'remark': '备注',
|
|
'operator_id': '运营商ID',
|
|
'operator_name': '运营商名称',
|
|
'equipment_id': '设备ID',
|
|
'equipment_type': '设备类型',
|
|
'equipment_model': '设备型号',
|
|
'manufacturer': '制造商',
|
|
'install_location': '安装位置',
|
|
'power_rate': '额定功率(kW)',
|
|
'voltage_rate': '额定电压(V)',
|
|
'current_rate': '额定电流(A)',
|
|
'brand': '品牌',
|
|
'network_type': '网络类型',
|
|
'sim_card': 'SIM卡号',
|
|
'iccid': 'ICCID',
|
|
'imei': 'IMEI',
|
|
'mac': 'MAC地址',
|
|
'ip': 'IP地址',
|
|
'firmware_version': '固件版本',
|
|
'hardware_version': '硬件版本',
|
|
'protocol_version': '协议版本',
|
|
'online_status': '在线状态',
|
|
'last_heartbeat': '最后心跳时间',
|
|
'fault_code': '故障代码',
|
|
'fault_desc': '故障描述',
|
|
'fault_time': '故障时间',
|
|
'clear_time': '清除时间',
|
|
'operator_fault': '运营商故障',
|
|
'maintenance_status': '维护状态',
|
|
'maintenance_time': '维护时间',
|
|
'maintenance_desc': '维护描述',
|
|
'qr_code': '二维码',
|
|
'qr_code_url': '二维码URL',
|
|
'qr_code_type': '二维码类型',
|
|
'qr_code_status': '二维码状态',
|
|
'qr_code_create_time': '二维码创建时间',
|
|
'qr_code_update_time': '二维码更新时间',
|
|
'qr_code_remark': '二维码备注',
|
|
'qr_code_operator': '二维码操作员',
|
|
'qr_code_company': '二维码企业',
|
|
'qr_code_station': '二维码站点',
|
|
'qr_code_equipment': '二维码设备',
|
|
'qr_code_pile': '二维码桩号',
|
|
'qr_code_gun': '二维码枪号',
|
|
'qr_code_location': '二维码位置',
|
|
'qr_code_address': '二维码地址',
|
|
'qr_code_city': '二维码城市',
|
|
'qr_code_province': '二维码省份',
|
|
'qr_code_area': '二维码区域',
|
|
'qr_code_lat': '二维码纬度',
|
|
'qr_code_lng': '二维码经度',
|
|
'qr_code_alt': '二维码海拔',
|
|
'qr_code_accuracy': '二维码精度',
|
|
'qr_code_speed': '二维码速度',
|
|
'qr_code_direction': '二维码方向',
|
|
'qr_code_satellite': '二维码卫星',
|
|
'qr_code_signal': '二维码信号',
|
|
'qr_code_battery': '二维码电池',
|
|
'qr_code_temperature': '二维码温度',
|
|
'qr_code_humidity': '二维码湿度',
|
|
'qr_code_pressure': '二维码气压',
|
|
'qr_code_wind_speed': '二维码风速',
|
|
'qr_code_wind_direction': '二维码风向',
|
|
'qr_code_rainfall': '二维码降雨量',
|
|
'qr_code_snowfall': '二维码降雪量',
|
|
'qr_code_visibility': '二维码能见度',
|
|
'qr_code_uv_index': '二维码紫外线指数',
|
|
'qr_code_aqi': '二维码空气质量指数',
|
|
'qr_code_pm25': '二维码PM2.5',
|
|
'qr_code_pm10': '二维码PM10',
|
|
'qr_code_co': '二维码一氧化碳',
|
|
'qr_code_no2': '二维码二氧化氮',
|
|
'qr_code_so2': '二维码二氧化硫',
|
|
'qr_code_o3': '二维码臭氧',
|
|
}
|
|
|
|
|
|
def get_field_display_name(field_name):
|
|
"""获取字段的中文显示名称"""
|
|
return FIELD_MAPPING.get(field_name, field_name)
|
|
|
|
|
|
def get_all_fields():
|
|
"""获取所有字段列表"""
|
|
return list(FIELD_MAPPING.keys())
|
|
|
|
|
|
def get_all_fields_with_display():
|
|
"""获取所有字段及其显示名称"""
|
|
return [{'field': k, 'display': v} for k, v in FIELD_MAPPING.items()] |