From 5448a0ab5f43a4f097477f06db7ae54974f77fe5 Mon Sep 17 00:00:00 2001 From: hyowons Date: Mon, 8 Jun 2026 17:32:50 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=88=9C=EC=9E=90=EC=82=B0=20=EC=B0=A8?= =?UTF-8?q?=ED=8A=B8=20=EC=98=A4=EB=8A=98(=EC=9E=A5=EC=A4=91)=20=EA=B0=92?= =?UTF-8?q?=20=EB=9D=BC=EB=B2=A8=20=EC=8B=A4=EC=8B=9C=EA=B0=84=20=EA=B0=B1?= =?UTF-8?q?=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit net-chart-last 라벨을 실시간 순자산으로 갱신(라이브 점일 때만). 순자산 변동분=손익 변동분(baseline·cf 세션중 고정)이라 net/pnl/period 모드 공통 처리. SVG 점 위치는 새로고침 시(장중 이동 미미·Y재스케일 위험 회피). setOwnerKpis에서 owner별 갱신. Co-Authored-By: Claude Opus 4.8 --- agents/stock/workspace/scripts/behive_web.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/agents/stock/workspace/scripts/behive_web.py b/agents/stock/workspace/scripts/behive_web.py index 2498f64..1fe0e47 100644 --- a/agents/stock/workspace/scripts/behive_web.py +++ b/agents/stock/workspace/scripts/behive_web.py @@ -3278,7 +3278,7 @@ def _expand_progress_group(filtered: list[tuple[str, int]], daily_series: list[t return baseline + in_group -def _render_net_worth_chart(series: list[tuple[str, int]], current_net: int | None = None, selected_days: int = NET_WORTH_CHART_DAYS, selected_unit: str = NET_WORTH_CHART_UNIT, cash_flow_by_date: dict | None = None, today_cash_flow: dict | None = None, mode: str = NET_WORTH_CHART_MODE, prev_baseline_point: tuple[str, int] | None = None) -> str: +def _render_net_worth_chart(series: list[tuple[str, int]], current_net: int | None = None, selected_days: int = NET_WORTH_CHART_DAYS, selected_unit: str = NET_WORTH_CHART_UNIT, cash_flow_by_date: dict | None = None, today_cash_flow: dict | None = None, mode: str = NET_WORTH_CHART_MODE, prev_baseline_point: tuple[str, int] | None = None, rt_owner: str | None = None, rt_base_net: int | None = None) -> str: """꺾은선 SVG (순자산 / 손익누적 공용). 외부 의존성 없음. 데이터 < 2점이면 안내문 반환. mode='net'(기본): series 는 raw 순자산 시계열. 입출금 마커·툴팁 행 표시. @@ -3695,7 +3695,10 @@ def _render_net_worth_chart(series: list[tuple[str, int]], current_net: int | No '' '' '' - f'{html.escape(last_label_v)}' + f'{html.escape(last_label_v)}' '' '' ) @@ -5688,6 +5691,7 @@ def _render_summary_panel(ordered_owners: list[str], owner_data: dict, balances: today_cash_flow=None, mode=chart_mode, prev_baseline_point=prev_baseline, + rt_owner=owner, rt_base_net=d.get('total_net'), )) else: # net 모드도 baseline 점(예: 5/1) prepend → 첫 영업일 변동이 0 기점에서 분기되는 모양. baseline 구간은 점선. @@ -5700,6 +5704,7 @@ def _render_summary_panel(ordered_owners: list[str], owner_data: dict, balances: today_cash_flow=today_cf, mode='net', prev_baseline_point=prev_baseline, + rt_owner=owner, rt_base_net=d.get('total_net'), )) market_card = _render_market_indicators_card() @@ -9033,6 +9038,14 @@ window.openPinModal = openPinModal; if(td) td.innerHTML=''+sgn(T.daypl)+'원'+(T.dpct!==null?' ('+(T.dpct>=0?'+':'')+T.dpct.toFixed(2)+'%)':'')+''; } }); + // 순자산 차트 오늘(장중) 포인트 값 라벨 실시간 — 점 위치(SVG)는 새로고침 시, 값 라벨만 라이브. + document.querySelectorAll('.net-chart-last[data-rt-nw-owner="'+owner+'"][data-rt-nw-live="1"]').forEach(function(el){ + var basenet=parseFloat(el.getAttribute('data-rt-nw-basenet')||'0'); + var baseval=parseFloat(el.getAttribute('data-rt-nw-baseval')||'0'); + var v=Math.round(baseval+(T.net-basenet)); // 순자산 변동분 = 손익 변동분(baseline·cf는 세션 중 고정) + var s=(el.getAttribute('data-rt-nw-pnl')==='1') ? ((v>=0?'+':'−')+Math.abs(v).toLocaleString()+'원') : (v.toLocaleString()+'원'); + el.textContent=s+' (장중)'; + }); } // KPI 총합 — owner 탭 scope의 consolidated pane 행만 합산(중복합산 방지). 시세 미수신 종목은 data-rt-px(서버값) fallback. function updateScopes(px){