fix(wh-stock-status): 기본 '품목 가로' + 상단 전체 합계 행 추가
Deploy momo-erp / deploy (push) Successful in 2m6s

- viewMode 기본값 'by-wh' → 'by-item' 으로 변경 (사용자 선호).
- 품목 가로 모드 본문 첫 행: '전체 합계' (emerald 강조)
  · 발주수량 합 = Σ 모든 창고의 STOCK
  · 여유분 합   = Σ 모든 창고의 AVAILABLE (음수면 rose)
- 이후 본사 창고 → 김포 시장 7줄 그대로 노출.
This commit is contained in:
chpark
2026-05-15 01:04:07 +09:00
parent 17ae2b80d7
commit 71cf966781
@@ -32,7 +32,7 @@ export default function WhStockStatusPage() {
const [items, setItems] = useState<ItemRow[]>([]);
const [loading, setLoading] = useState(false);
// 보기 모드: by-wh = 헤더가 창고(가로로 김) / by-item = 헤더가 품목(오른쪽으로 길게)
const [viewMode, setViewMode] = useState<"by-wh" | "by-item">("by-wh");
const [viewMode, setViewMode] = useState<"by-wh" | "by-item">("by-item");
const load = useCallback(async () => {
setLoading(true);
@@ -183,7 +183,37 @@ export default function WhStockStatusPage() {
<tr><td colSpan={2 + items.length} className="text-center py-12 text-slate-400">
{loading ? "조회 중..." : "데이터가 없습니다."}
</td></tr>
) : warehouses.flatMap((w) => [
) : [
/* 전체 합계 — 모든 창고의 발주수량/여유분 합 (상단 강조 행) */
<tr key="__total-stock" className="bg-emerald-50/70 border-y-2 border-emerald-300 font-bold">
<td className="px-3 py-2 align-top sticky left-0 bg-emerald-50/70" rowSpan={2}>
<div className="text-emerald-800"> </div>
<div className="text-[10px] text-emerald-600 font-normal"> </div>
</td>
<td className="px-3 py-1.5 text-center text-[11px] text-slate-700 bg-slate-100 sticky left-[120px]"></td>
{items.map((it) => {
const v = warehouses.reduce((acc, w) => acc + Number(it.STOCK[w.WH_CODE] ?? 0), 0);
return (
<td key={it.ITEM_OBJID} className={`px-3 py-1.5 text-right ${v === 0 ? "text-slate-300" : "text-slate-900"}`}>
{v === 0 ? "-" : fmt(v)}
</td>
);
})}
</tr>,
<tr key="__total-avail" className="bg-emerald-50/70 border-b-2 border-emerald-300 font-bold">
<td className="px-3 py-1.5 text-center text-[11px] text-emerald-700 bg-emerald-100/60 sticky left-[120px]"></td>
{items.map((it) => {
const v = warehouses.reduce((acc, w) => acc + Number(it.AVAILABLE[w.WH_CODE] ?? 0), 0);
const negative = v < 0;
return (
<td key={it.ITEM_OBJID} className={`px-3 py-1.5 text-right ${negative ? "text-rose-600" : v === 0 ? "text-slate-300" : "text-emerald-700"}`}>
{v === 0 ? "-" : fmt(v)}
</td>
);
})}
</tr>,
/* 창고별 7줄 */
...warehouses.flatMap((w) => [
<tr key={`${w.WH_CODE}-stock`} className="border-t border-slate-100 hover:bg-slate-50/60">
<td className="px-3 py-2 align-top font-semibold sticky left-0 bg-white" rowSpan={2}>
{w.WH_NAME}
@@ -211,7 +241,8 @@ export default function WhStockStatusPage() {
);
})}
</tr>,
])}
]),
]}
</tbody>
</table>
)}