fix(orders/admin): 락 변경 즉시 리스트 반영 — 옵티미스틱 업데이트
Deploy momo-erp / deploy (push) Successful in 1m56s

문제: 발주 A 클릭 → B 클릭 시 A 의 release/acquire 응답을 기다리지 않아
       리스트는 30초 자동 갱신 전까지 stale (A 에 여전히 "내가 수정 중" 표시)

수정:
- 이전 락 release 시 setOrders 로 previousLocked 행의 EDITING_BY 즉시 null
- 새 락 acquire 성공 시 activeId 행의 EDITING_BY 즉시 본인으로 세팅
- 다른 사람 락이라 거부된 경우도 그 정보로 즉시 업데이트
- 30초 자동 갱신은 안전망(누락된 변화 동기화)으로 유지

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
chpark
2026-05-20 23:28:10 +09:00
parent 585b7d4577
commit 8e29a1f9da
+13 -1
View File
@@ -173,6 +173,10 @@ export default function AdminOrdersPage() {
const previousLocked = lockedOrderRef.current;
if (previousLocked && previousLocked !== activeId) {
releaseLock(previousLocked);
// 옵티미스틱: 리스트에서 이전 락 즉시 제거
setOrders((prev) => prev.map((o) =>
o.OBJID === previousLocked ? { ...o, EDITING_BY: null, EDITING_BY_NAME: null } : o
));
lockedOrderRef.current = "";
}
// 이전 heartbeat 정지
@@ -205,6 +209,10 @@ export default function AdminOrdersPage() {
setLockedByMe(true);
setLockedByOther(null);
lockedOrderRef.current = activeId;
// 옵티미스틱: 리스트에 내 락 즉시 반영
setOrders((prev) => prev.map((o) =>
o.OBJID === activeId ? { ...o, EDITING_BY: lj.lockedBy || myUserId, EDITING_BY_NAME: lj.lockedByName || "(나)" } : o
));
// 30초마다 heartbeat
heartbeatRef.current = setInterval(async () => {
try {
@@ -224,6 +232,10 @@ export default function AdminOrdersPage() {
} else if (lj.locked) {
setLockedByMe(false);
setLockedByOther({ name: lj.lockedByName || lj.lockedBy || "다른 담당자" });
// 옵티미스틱: 리스트에 락 정보 반영
setOrders((prev) => prev.map((o) =>
o.OBJID === activeId ? { ...o, EDITING_BY: lj.lockedBy || "other", EDITING_BY_NAME: lj.lockedByName || "다른 담당자" } : o
));
Swal.fire({
icon: "warning",
title: "수정 중인 발주",
@@ -236,7 +248,7 @@ export default function AdminOrdersPage() {
})();
return () => { cancelled = true; };
}, [activeId, releaseLock]);
}, [activeId, releaseLock, myUserId]);
// 페이지 떠날 때 락 해제 (best-effort) — sendBeacon 으로 keepalive
useEffect(() => {