Add Qingdao to the tradable city network

Qingdao needs the same airport-settlement path as the other Wunderground-backed APAC cities, so the registry, aliases, timezone, prewarm, official links, market focus, and tests now point to ZSQD / Qingdao Jiaodong International Airport.

Constraint: User supplied Wunderground Qingdao/ZSQD settlement URL.
Rejected: Add a partial registry-only entry | it would show in APIs without frontend links, prewarm coverage, or alias support.
Confidence: high
Scope-risk: narrow
Reversibility: clean
Tested: pytest tests/test_country_networks.py tests/test_web_observability.py::test_cities_endpoint_includes_new_wunderground_cities -q
Tested: npm run build
Not-tested: Live Wunderground fetch for ZSQD in production.
This commit is contained in:
2569718930@qq.com
2026-04-28 07:08:33 +08:00
parent e6010d8242
commit 89a71d1bc0
14 changed files with 62 additions and 2 deletions
+23
View File
@@ -715,6 +715,24 @@ CITY_REGISTRY = {
"distance_km": 28.0,
"warning": "市场现按 Wunderground 广州白云国际机场站整度°C口径结算;珠三角海陆风与午后对流会让峰值兑现时间出现摇摆。",
},
"qingdao": {
"name": "Qingdao",
"lat": 36.3620,
"lon": 120.0882,
"icao": "ZSQD",
"settlement_source": "wunderground",
"settlement_station_code": "ZSQD",
"settlement_station_label": "Qingdao Jiaodong International Airport Station",
"settlement_url": "https://www.wunderground.com/history/daily/cn/qingdao/ZSQD",
"tz_offset": 28800,
"use_fahrenheit": False,
"is_major": True,
"risk_level": "medium",
"risk_emoji": "🟡",
"airport_name": "青岛胶东国际机场",
"distance_km": 39.0,
"warning": "市场现按 Wunderground 青岛胶东国际机场站整度°C口径结算;沿海海风、低云和海雾会影响日内升温效率。",
},
"beijing": {
"name": "Beijing",
"lat": 40.0801,
@@ -918,12 +936,17 @@ ALIASES = {
"ckg": "chongqing", "cq": "chongqing",
"szx": "shenzhen", "sz": "shenzhen",
"can": "guangzhou", "gz": "guangzhou", "zggg": "guangzhou",
"tao": "qingdao", "qdo": "qingdao", "qingdao": "qingdao", "zsqd": "qingdao",
"pek": "beijing", "bjs": "beijing", "bj": "beijing",
"wuh": "wuhan", "wh": "wuhan",
"成都": "chengdu",
"重庆": "chongqing",
"深圳": "shenzhen",
"广州": "guangzhou",
"青岛": "qingdao",
"青島": "qingdao",
"青岛胶东": "qingdao",
"青島膠東": "qingdao",
"北京": "beijing",
"武汉": "wuhan",
}
+1
View File
@@ -50,6 +50,7 @@ CITY_TIME_ZONES = {
"new york": "America/New_York",
"panama city": "America/Panama",
"paris": "Europe/Paris",
"qingdao": "Asia/Shanghai",
"san francisco": "America/Los_Angeles",
"sao paulo": "America/Sao_Paulo",
"seattle": "America/Los_Angeles",
+1
View File
@@ -13,6 +13,7 @@ CHINA_CMA_CITIES = {
"chengdu",
"chongqing",
"guangzhou",
"qingdao",
"shanghai",
"shenzhen",
"wuhan",
+4
View File
@@ -54,6 +54,7 @@ class WeatherDataCollector(OpenMeteoCacheMixin, SettlementSourceMixin, MetarSour
"chengdu": ["ZUUU", "ZUTF"],
"chongqing": ["ZUCK", "ZUPS"],
"guangzhou": ["ZGGG", "ZGSZ"],
"qingdao": ["ZSQD"],
"shenzhen": ["ZGSZ", "ZGGG"],
"beijing": ["ZBAA", "ZBAD"],
"wuhan": ["ZHHH", "ZHES"],
@@ -600,6 +601,9 @@ class WeatherDataCollector(OpenMeteoCacheMixin, SettlementSourceMixin, MetarSour
"重庆": "Chongqing",
"shenzhen": "Shenzhen",
"深圳": "Shenzhen",
"qingdao": "Qingdao",
"青岛": "Qingdao",
"青島": "Qingdao",
"beijing": "Beijing",
"北京": "Beijing",
"wuhan": "Wuhan",
+1
View File
@@ -21,6 +21,7 @@ DEFAULT_CITIES = [
"beijing",
"shenzhen",
"guangzhou",
"qingdao",
"wuhan",
"chengdu",
"chongqing",