diff --git a/src/app/(main)/m/admin/orders/page.tsx b/src/app/(main)/m/admin/orders/page.tsx index d648fef..1bdb68a 100644 --- a/src/app/(main)/m/admin/orders/page.tsx +++ b/src/app/(main)/m/admin/orders/page.tsx @@ -148,6 +148,12 @@ export default function AdminOrdersPage() { // eslint-disable-next-line react-hooks/exhaustive-deps useEffect(() => { load(); }, [load]); + // 발주 리스트 30초마다 자동 갱신 — 락 상태(누가 수정 중) 실시간 반영 + useEffect(() => { + const id = setInterval(() => { load(); }, 30000); + return () => clearInterval(id); + }, [load]); + const reloadDetail = useCallback(async () => { if (!activeId) { setDetail(null); return; } const res = await fetch("/api/m/orders/detail", { @@ -427,12 +433,13 @@ export default function AdminOrdersPage() { {orders.map((o) => { const checked = selected.has(o.OBJID); const active = o.OBJID === activeId; + const lockedByMeRow = !!o.EDITING_BY && o.EDITING_BY === myUserId; const lockedByOtherUser = !!o.EDITING_BY && o.EDITING_BY !== myUserId; return (
setActiveId(o.OBJID)} - className={`border rounded-lg p-3 cursor-pointer transition ${active ? "border-emerald-500 bg-emerald-50/60 shadow-sm" : lockedByOtherUser ? "border-rose-200 bg-rose-50/40" : "border-slate-200 bg-white hover:bg-slate-50"}`} + className={`border rounded-lg p-3 cursor-pointer transition ${active ? "border-emerald-500 bg-emerald-50/60 shadow-sm" : lockedByMeRow ? "border-emerald-300 bg-emerald-50/30" : lockedByOtherUser ? "border-rose-200 bg-rose-50/40" : "border-slate-200 bg-white hover:bg-slate-50"}`} >
@@ -445,6 +452,9 @@ export default function AdminOrdersPage() { className="accent-emerald-600 disabled:opacity-30" /> {o.ORDER_NO} + {lockedByMeRow && ( + ✏️ + )} {lockedByOtherUser && ( 🔒 )} @@ -455,6 +465,9 @@ export default function AdminOrdersPage() {
{o.ORDER_DATE}
{o.COMPANY_NAME}
+ {lockedByMeRow && ( +
✏️ 내가 수정 중
+ )} {lockedByOtherUser && (
🔒 {o.EDITING_BY_NAME} 수정 중
)} @@ -486,13 +499,14 @@ export default function AdminOrdersPage() { ) : orders.map((o) => { const checked = selected.has(o.OBJID); const active = o.OBJID === activeId; + const lockedByMeRow = !!o.EDITING_BY && o.EDITING_BY === myUserId; const lockedByOtherUser = !!o.EDITING_BY && o.EDITING_BY !== myUserId; return ( setActiveId(o.OBJID)} - className={`border-t border-slate-100 cursor-pointer ${active ? "bg-emerald-50/60" : lockedByOtherUser ? "bg-rose-50/30 hover:bg-rose-50/60" : "hover:bg-slate-50"}`} - title={lockedByOtherUser ? `🔒 ${o.EDITING_BY_NAME} 님이 수정 중` : ""} + className={`border-t border-slate-100 cursor-pointer ${active ? "bg-emerald-50/60" : lockedByMeRow ? "bg-emerald-50/30 hover:bg-emerald-50/50" : lockedByOtherUser ? "bg-rose-50/30 hover:bg-rose-50/60" : "hover:bg-slate-50"}`} + title={lockedByMeRow ? "✏️ 내가 수정 중" : lockedByOtherUser ? `🔒 ${o.EDITING_BY_NAME} 님이 수정 중` : ""} > e.stopPropagation()}> + {lockedByMeRow && ✏️} {lockedByOtherUser && 🔒} {o.ORDER_NO} {o.ORDER_DATE} {o.COMPANY_NAME} + {lockedByMeRow &&
✏️ 내가 수정 중
} {lockedByOtherUser &&
🔒 {o.EDITING_BY_NAME}
} ₩{fmt(o.TOTAL_AMOUNT)}