feat: v2.0 — maintenance module, AI analysis, station power fix
- Add full 检修维护中心 (6.4): 3-type work orders (消缺/巡检/抄表), asset management, warehouse, work plans, billing settlement - Add AI智能分析 tab with LLM-powered diagnostics (StepFun + ZhipuAI) - Add AI模型配置 settings page (provider, temperature, prompts) - Fix station power accuracy: use API station total (station_power) instead of inverter-level computation — eliminates timing gaps - Add 7 new DB models, 4 new API routers, 5 new frontend pages - Migrations: 009 (maintenance expansion) + 010 (AI analysis) - Version bump: 1.6.1 → 2.0.0 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
67
scripts/seed_maintenance.py
Normal file
67
scripts/seed_maintenance.py
Normal file
@@ -0,0 +1,67 @@
|
||||
"""Seed maintenance data: asset categories and sample spare parts."""
|
||||
import asyncio
|
||||
import sys
|
||||
import os
|
||||
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "core", "backend"))
|
||||
|
||||
from app.core.database import async_session_factory
|
||||
from app.models.maintenance import AssetCategory, SparePart
|
||||
|
||||
|
||||
ASSET_CATEGORIES = [
|
||||
{"name": "光伏组件", "description": "太阳能电池板及组件"},
|
||||
{"name": "逆变器", "description": "光伏逆变器设备"},
|
||||
{"name": "汇流箱", "description": "直流汇流箱"},
|
||||
{"name": "变压器", "description": "升压变压器"},
|
||||
{"name": "电缆线路", "description": "直流/交流电缆"},
|
||||
{"name": "监控设备", "description": "采集器、通信模块等"},
|
||||
{"name": "配电设备", "description": "开关柜、断路器等"},
|
||||
{"name": "支架结构", "description": "光伏支架及基础"},
|
||||
{"name": "防雷接地", "description": "防雷及接地装置"},
|
||||
{"name": "其他", "description": "其他辅助设备"},
|
||||
]
|
||||
|
||||
SPARE_PARTS = [
|
||||
{"name": "MC4连接器(公)", "part_code": "SP-MC4-M", "category": "光伏组件", "specification": "1000VDC/30A", "unit": "个", "current_stock": 50, "min_stock": 20, "unit_price": 3.5, "supplier": "正泰"},
|
||||
{"name": "MC4连接器(母)", "part_code": "SP-MC4-F", "category": "光伏组件", "specification": "1000VDC/30A", "unit": "个", "current_stock": 50, "min_stock": 20, "unit_price": 3.5, "supplier": "正泰"},
|
||||
{"name": "光伏直流熔断器", "part_code": "SP-FUSE-DC", "category": "汇流箱", "specification": "15A/1000VDC", "unit": "个", "current_stock": 30, "min_stock": 10, "unit_price": 12.0, "supplier": "正泰"},
|
||||
{"name": "防雷器SPD", "part_code": "SP-SPD-DC", "category": "防雷接地", "specification": "T2级/40kA", "unit": "个", "current_stock": 10, "min_stock": 5, "unit_price": 180.0, "supplier": "德力西"},
|
||||
{"name": "光伏电缆PV1-F", "part_code": "SP-CABLE-4", "category": "电缆线路", "specification": "4mm²/黑色", "unit": "米", "current_stock": 200, "min_stock": 50, "unit_price": 4.8, "supplier": "远东电缆"},
|
||||
{"name": "4G通信模块", "part_code": "SP-4G-MOD", "category": "监控设备", "specification": "全网通/LORA", "unit": "个", "current_stock": 5, "min_stock": 2, "unit_price": 320.0, "supplier": "协合智能"},
|
||||
{"name": "SIM卡", "part_code": "SP-SIM", "category": "监控设备", "specification": "物联网卡/3年", "unit": "张", "current_stock": 10, "min_stock": 3, "unit_price": 80.0, "supplier": "中国移动"},
|
||||
{"name": "交流断路器", "part_code": "SP-ACB-63", "category": "配电设备", "specification": "63A/3P", "unit": "个", "current_stock": 5, "min_stock": 2, "unit_price": 85.0, "supplier": "正泰"},
|
||||
{"name": "电能表", "part_code": "SP-METER-3P", "category": "监控设备", "specification": "三相/RS485", "unit": "台", "current_stock": 3, "min_stock": 1, "unit_price": 450.0, "supplier": "安科瑞"},
|
||||
{"name": "不锈钢扎带", "part_code": "SP-TIE-SS", "category": "其他", "specification": "4.6×300mm", "unit": "包", "current_stock": 20, "min_stock": 5, "unit_price": 15.0, "supplier": "华达"},
|
||||
]
|
||||
|
||||
|
||||
async def seed():
|
||||
async with async_session_factory() as session:
|
||||
# Seed categories
|
||||
from sqlalchemy import select
|
||||
existing = (await session.execute(select(AssetCategory))).scalars().all()
|
||||
if existing:
|
||||
print(f"Asset categories already exist ({len(existing)} found), skipping...")
|
||||
else:
|
||||
for cat in ASSET_CATEGORIES:
|
||||
session.add(AssetCategory(**cat))
|
||||
await session.flush()
|
||||
print(f"Seeded {len(ASSET_CATEGORIES)} asset categories")
|
||||
|
||||
# Seed spare parts
|
||||
existing_parts = (await session.execute(select(SparePart))).scalars().all()
|
||||
if existing_parts:
|
||||
print(f"Spare parts already exist ({len(existing_parts)} found), skipping...")
|
||||
else:
|
||||
for part in SPARE_PARTS:
|
||||
session.add(SparePart(**part))
|
||||
await session.flush()
|
||||
print(f"Seeded {len(SPARE_PARTS)} spare parts")
|
||||
|
||||
await session.commit()
|
||||
print("Done!")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(seed())
|
||||
Reference in New Issue
Block a user