Merge branch 'main' into jskim-node

This commit is contained in:
jskim
2026-04-08 01:42:08 +00:00
9 changed files with 195 additions and 38 deletions
@@ -3,6 +3,7 @@
import React, { useState, useEffect, useRef, ReactNode } from "react";
import { useRouter } from "next/navigation";
import { useAuth } from "@/hooks/useAuth";
import { usePopSettings } from "@/hooks/pop/usePopSettings";
interface PopShellProps {
children: ReactNode;
@@ -98,8 +99,12 @@ export function PopShell({ children, showBanner = true, title, showBack = false,
logout();
};
const marqueeText =
"[공지] 금일 오후 3시 전체 안전교육 실시 예정입니다. 전 직원 필참 바랍니다. \u00a0\u00a0|\u00a0\u00a0 [알림] 내일 설비 정기점검으로 인한 3호기 가동 중지 예정 \u00a0\u00a0|\u00a0\u00a0 [안내] 4월 생산실적 우수팀 발표 - 생산1팀 축하드립니다!";
// POP 설정에서 배너 텍스트 로드 (POP화면설정에서 관리)
const { settings: popSettings } = usePopSettings("/pop/home");
const homeConfig = (popSettings as any)?.screens?.home;
const bannerEnabled = homeConfig?.bannerEnabled ?? true;
const bannerText = homeConfig?.bannerText;
const marqueeText = bannerText || "[공지] 금일 오후 3시 전체 안전교육 실시 예정입니다. 전 직원 필참 바랍니다. \u00a0\u00a0|\u00a0\u00a0 [알림] 내일 설비 정기점검으로 인한 3호기 가동 중지 예정 \u00a0\u00a0|\u00a0\u00a0 [안내] 4월 생산실적 우수팀 발표 - 생산1팀 축하드립니다!";
return (
<div className="min-h-screen min-h-dvh flex flex-col" style={{ background: "#F5F5F5" }}>
@@ -296,7 +301,7 @@ export function PopShell({ children, showBanner = true, title, showBack = false,
</header>
{/* ===== NOTICE BANNER (Marquee) ===== */}
{showBanner && <div className="bg-amber-50 border-b border-amber-200 px-4 py-2 flex items-center gap-3">
{showBanner && bannerEnabled && <div className="bg-amber-50 border-b border-amber-200 px-4 py-2 flex items-center gap-3">
<div className="flex items-center gap-1.5 shrink-0">
<span className="text-amber-600 text-sm">📢</span>
<span className="text-xs font-bold text-amber-700"></span>
@@ -310,9 +310,15 @@ export function InboundCartPage() {
try {
// 확정 시점에 채번 (동시접속 충돌 방지)
// POP 화면설정에서 선택한 채번규칙 사용 (없으면 기본)
let finalNumber = "";
try {
const numRes = await apiClient.get("/receiving/generate-number");
const settingsRes: any = await apiClient.get("/screen-management/screens/6527/layout-pop").catch(() => null);
const ruleId = settingsRes?.data?.data?.settings?.popConfig?.inbound?.numberingRuleId;
const url = ruleId && ruleId !== "__none__"
? `/receiving/generate-number?ruleId=${encodeURIComponent(ruleId)}`
: "/receiving/generate-number";
const numRes = await apiClient.get(url);
if (numRes.data?.success && numRes.data?.data) {
finalNumber = numRes.data.data;
setInboundNumber(finalNumber);
@@ -344,6 +350,7 @@ export function InboundCartPage() {
reference_number: item.purchase_no,
supplier_code: item.supplier_code,
supplier_name: item.supplier_name,
inbound_status: "입고완료",
inspection_status: inspResult?.completed
? "검사완료"
: item.inspection_required
@@ -305,9 +305,16 @@ export function OutboundCartPage() {
try {
// Generate outbound number at confirm time
// POP 화면설정에서 선택한 채번규칙 사용 (없으면 기본)
// 출고 장바구니 전용 screen_id 7010
let finalNumber = "";
try {
const numRes = await apiClient.get("/outbound/generate-number");
const settingsRes: any = await apiClient.get("/screen-management/screens/7010/layout-pop").catch(() => null);
const ruleId = settingsRes?.data?.data?.settings?.popConfig?.outbound?.numberingRuleId;
const url = ruleId && ruleId !== "__none__"
? `/outbound/generate-number?ruleId=${encodeURIComponent(ruleId)}`
: "/outbound/generate-number";
const numRes = await apiClient.get(url);
if (numRes.data?.success && numRes.data?.data) {
finalNumber = numRes.data.data;
setOutboundNumber(finalNumber);
@@ -337,7 +344,7 @@ export function OutboundCartPage() {
customer_name: item.customer_name,
source_type: "shipment_instruction_detail",
source_id: item.source_id || item.id,
outbound_status: "대기",
outbound_status: "출고완료",
})),
};