feat(malaysia): 랙 보기 드래그 재배치·저장·인쇄 미리보기
랙 보기에서 칸을 드래그해 다른 칸으로 구성을 옮긴다(채워진 칸끼리 맞교환, Side A↔B 가능). 칸 번호는 유지되고 수량 합계도 불변(위치만). 저장하면 그 배치로 기록되며, 재고조사 '이전값 불러오기'가 이 최종 위치를 불러온다. - db.reposition_rack: 칸(cell_code) 배치만 교체, daily_stocktake_line 보존, 확정본도 허용(취소만 불가). 위치 이동은 전산재고에 영향 없음 - db.previous_rack_entries: 정렬을 랙 저장시각(MAX created_at) 기준으로 통일 → '이전값 불러오기'가 랙 보기 최종 위치와 일치 - POST /malaysia/rack/save: latest_rack_stocktake 대상 reposition - rack_view.html + malaysia_rack_view.js: HTML5 드래그 이동/swap, 칸 체크 선택, 저장(병렬배열 직렬화), 인쇄 미리보기 모달 - 인쇄: 선택한 칸을 칸마다 A4 가로 1장, 굵은 대형 글씨(@media print), 미리보기 후 인쇄 - i18n 항목 추가, malaysia.js 캐시버스트 v20260615c Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -209,6 +209,32 @@ async def rack_view(request: Request) -> HTMLResponse:
|
||||
return render_template(request, "malaysia/rack_view.html", ctx)
|
||||
|
||||
|
||||
@router.post("/rack/save")
|
||||
async def rack_save(
|
||||
request: Request, user: dict[str, Any] = Depends(_require_user)
|
||||
) -> RedirectResponse:
|
||||
"""랙 보기에서 드래그로 재배치한 칸 구성을 저장(위치만 변경).
|
||||
|
||||
대상은 랙 보기가 보여주는 조사(latest_rack_stocktake). 수량 합계는
|
||||
불변이며 확정본도 허용. 폼은 stocktake_detail 과 동일한 병렬배열
|
||||
(rk_cell/rk_sku/rk_upb/rk_box) → _parse_rack_form 재사용.
|
||||
"""
|
||||
st = _store(request)
|
||||
if st is None:
|
||||
raise HTTPException(status_code=503, detail="malaysia_stock_db 미설정")
|
||||
form = await request.form()
|
||||
wh = str(form.get("warehouse_code") or "").strip() or _selected_wh(request, st)
|
||||
latest = st.latest_rack_stocktake(warehouse_code=wh)
|
||||
if not latest:
|
||||
raise HTTPException(status_code=400, detail="저장할 랙 재고조사가 없습니다.")
|
||||
entries = _parse_rack_form(form)
|
||||
try:
|
||||
st.reposition_rack(stocktake_id=latest["id"], entries=entries)
|
||||
except (KeyError, ValueError) as exc:
|
||||
raise HTTPException(status_code=400, detail=str(exc))
|
||||
return RedirectResponse(url=f"/malaysia/rack?wh={wh}", status_code=303)
|
||||
|
||||
|
||||
@router.post("/reset")
|
||||
async def reset_data(
|
||||
request: Request, user: dict[str, Any] = Depends(_require_user)
|
||||
|
||||
Reference in New Issue
Block a user