diff --git a/app/modules/malaysia/db.py b/app/modules/malaysia/db.py index a04e0c4..ec4cf8c 100644 --- a/app/modules/malaysia/db.py +++ b/app/modules/malaysia/db.py @@ -397,6 +397,25 @@ class MalaysiaStockStore: ).fetchone() return self._serialize(row) if row else None + def latest_rack_stocktake(self, *, warehouse_code: str) -> dict[str, Any] | None: + """랙 입력을 가장 최근에 저장한(취소 제외) 재고조사 헤더. 없으면 None. + + 랙보기 전용. '최근'을 조사 날짜가 아니라 랙 저장 시각으로 판단한다. + replace_rack 은 매 저장마다 daily_stocktake_rack 을 delete+insert 하므로 + 그 created_at MAX 가 곧 마지막 랙 저장 시각이 된다. 랙 항목이 없는 + 조사는 보여줄 게 없으므로 자연히 제외된다. + """ + with self._pool.connection() as conn: + row = conn.execute( + "SELECT s.* FROM daily_stocktake s " + "JOIN daily_stocktake_rack r ON r.stocktake_id = s.id " + "WHERE s.warehouse_code = %s AND s.status <> 'cancelled' " + "GROUP BY s.id " + "ORDER BY MAX(r.created_at) DESC, s.id DESC LIMIT 1", + (warehouse_code,), + ).fetchone() + return self._serialize(row) if row else None + def delete_stocktake(self, *, stocktake_id: int) -> None: """재고조사 완전 삭제(헤더+라인 CASCADE). 슈퍼관리자 전용 동작. diff --git a/app/modules/malaysia/router.py b/app/modules/malaysia/router.py index c2d6a84..97f6e76 100644 --- a/app/modules/malaysia/router.py +++ b/app/modules/malaysia/router.py @@ -187,7 +187,8 @@ async def rack_view(request: Request) -> HTMLResponse: return guard st, user = guard wh = _selected_wh(request, st) - latest = st.latest_stocktake(warehouse_code=wh) + # 랙보기는 '랙을 가장 최근에 저장한' 조사 기준(조사 날짜 아님). + latest = st.latest_rack_stocktake(warehouse_code=wh) rack_by_cell: dict[str, list[dict[str, Any]]] = {} names = st.item_name_map() if latest: