fix(annual): pass node_mode to the solar-return charts (BUG-1501)

calc_solar_return_chart hard-coded the mean node for the birth and annual
charts, so node_mode=true never reached the annual Rahu/Ketu. The default
stays mean; cmd_solar_return and cmd_tajika now pass the request's mode.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
This commit is contained in:
2026-11-01 17:07:54 +08:00
co-authored by Claude Opus 5.5
parent 5157f96df3
commit 52f85a793f
4 changed files with 25 additions and 2 deletions
+1
View File
@@ -44,6 +44,7 @@ def cmd_solar_return(args: Any) -> Dict[str, Any]:
args.target_year,
ayanamsa_name=getattr(args, 'ayanamsa', None) or DEFAULT_AYANAMSA_NAME,
birth_second=int(getattr(args, 'second', 0) or 0),
node_mode=getattr(args, 'node_mode', None) or 'mean', # BUG-1501
**solar_return_location_kwargs(args),
)
+1
View File
@@ -14599,6 +14599,7 @@ def _tajika_annual_core(args, planet_lons, asc_si, age, mode='all'):
int(args.year), int(args.month), int(args.day), int(args.hour), int(args.minute),
float(args.lat), float(args.lon), float(args.tz), int(args.year) + int(age),
ayanamsa_name=sr_cache['ayanamsa'], birth_second=_arg_second(args),
node_mode=getattr(args, 'node_mode', None) or 'mean', # BUG-1501
**solar_return_location_kwargs(args),
)
return sr_cache['sr']
+8 -2
View File
@@ -320,6 +320,7 @@ def calc_solar_return_chart(
return_lon: float | None = None,
return_tz: float | None = None,
birth_second: int = 0,
node_mode: str = 'mean',
) -> Dict:
"""
计算太阳返照盘(Varshaphala)。
@@ -332,6 +333,7 @@ def calc_solar_return_chart(
参数:
birth_*: 出生信息
target_year: 目标年份(计算该年太阳返照)
node_mode: 年盘罗睺 / 计都口径(mean / true),默认 mean(BUG-1501)
返回:
dict: {
@@ -377,7 +379,7 @@ def calc_solar_return_chart(
birth_year, birth_month, birth_day,
birth_hour, birth_minute,
birth_lat, birth_lon, birth_tz,
'mean',
node_mode,
second=birth_second,
ayanamsa_name=ayanamsa_name,
)
@@ -430,7 +432,7 @@ def calc_solar_return_chart(
sr_dt_ut.year, sr_dt_ut.month, sr_dt_ut.day,
sr_dt_ut.hour, sr_dt_ut.minute,
annual_lat, annual_lon, 0, # UT 时间,时区=0
'mean',
node_mode, # BUG-1501: was always 'mean'
second=sr_dt_ut.second,
ayanamsa_name=ayanamsa_name,
)
@@ -460,6 +462,7 @@ def calc_solar_return_chart(
'annual_location': {'latitude': annual_lat, 'longitude': annual_lon,
'utc_offset': annual_tz, 'timezone_id': local_timezone_id},
'age': target_year - birth_year,
'node_mode': node_mode,
'note': f'太阳返照盘 {target_year} 年(年龄 {target_year-birth_year} 岁)',
}
@@ -482,6 +485,7 @@ def solar_return_full_report(
return_lon: float | None = None,
return_tz: float | None = None,
birth_second: int = 0,
node_mode: str = 'mean',
) -> Dict:
"""
太阳返照盘完整报告(Varshaphala 年运分析)。
@@ -512,6 +516,7 @@ def solar_return_full_report(
local_timezone_id=local_timezone_id,
return_lat=return_lat, return_lon=return_lon, return_tz=return_tz,
birth_second=birth_second,
node_mode=node_mode,
)
if 'error' in sr:
@@ -533,6 +538,7 @@ def solar_return_full_report(
else:
result['solar_return'] = sr['solar_return']
result['annual_location'] = dict(sr.get('annual_location') or {})
result['node_mode'] = sr.get('node_mode', node_mode)
result['sr_chart_info'] = {
'asc_sign': SIGNS[sr['asc_sign_idx']],
'asc_sign_idx': sr['asc_sign_idx'],