diff --git a/backend-node/src/controllers/authController.ts b/backend-node/src/controllers/authController.ts
index 809513b6..402665f5 100644
--- a/backend-node/src/controllers/authController.ts
+++ b/backend-node/src/controllers/authController.ts
@@ -62,6 +62,7 @@ export class AuthController {
// 사용자의 첫 번째 접근 가능한 메뉴 조회
let firstMenuPath: string | null = null;
+ let firstMenuName: string | null = null;
try {
const menuList = await AdminService.getUserMenuList(paramMap);
logger.debug(`로그인 후 메뉴 조회: 총 ${menuList.length}개 메뉴`);
@@ -74,7 +75,8 @@ export class AuthController {
if (firstMenu) {
firstMenuPath = firstMenu.menu_url || firstMenu.url;
- logger.debug(`첫 번째 메뉴: ${firstMenuPath}`);
+ firstMenuName = firstMenu.menu_name_kor || firstMenu.translated_name || firstMenu.menu_name || null;
+ logger.debug(`첫 번째 메뉴: ${firstMenuPath} (${firstMenuName})`);
} else {
logger.debug("접근 가능한 메뉴 없음, 메인 페이지로 이동");
}
@@ -112,6 +114,7 @@ export class AuthController {
userInfo,
token: loginResult.token,
firstMenuPath,
+ firstMenuName,
popLandingPath,
},
});
diff --git a/frontend/app/(main)/COMPANY_29/master-data/department/page.tsx b/frontend/app/(main)/COMPANY_29/master-data/department/page.tsx
index 4e943810..a898fa2d 100644
--- a/frontend/app/(main)/COMPANY_29/master-data/department/page.tsx
+++ b/frontend/app/(main)/COMPANY_29/master-data/department/page.tsx
@@ -144,10 +144,35 @@ export default function DepartmentPage() {
useEffect(() => { fetchMembers(); }, [fetchMembers]);
// 부서 등록
- const openDeptRegister = () => {
- setDeptForm({});
+ const openDeptRegister = async () => {
+ setDeptForm({ dept_code: "불러오는 중..." });
setDeptEditMode(false);
setDeptModalOpen(true);
+ // DB에서 마지막 부서코드 조회 → 순번+1로 다음 코드 생성
+ try {
+ const res = await apiClient.post(`/table-management/tables/${DEPT_TABLE}/data`, {
+ page: 1, size: 500, autoFilter: true,
+ sort: { columnName: "dept_code", order: "desc" },
+ });
+ const rows = res.data?.data?.data || res.data?.data?.rows || [];
+ // 기존 부서코드에서 패턴 추출 (예: DEPT-001, DEPT-002 → 접두사 "DEPT", 구분자 "-", 순번 3자리)
+ const codes = rows.map((r: any) => r.dept_code).filter(Boolean).sort();
+ let nextCode = "(자동 생성)";
+ if (codes.length > 0) {
+ const lastCode = codes[codes.length - 1] as string;
+ // 마지막 숫자 부분 추출 (DEPT-003 → prefix="DEPT-", num=3, pad=3)
+ const match = lastCode.match(/^(.*?)(\d+)$/);
+ if (match) {
+ const prefix = match[1]; // "DEPT-"
+ const num = parseInt(match[2], 10) + 1;
+ const pad = match[2].length; // 3
+ nextCode = `${prefix}${String(num).padStart(pad, "0")}`;
+ }
+ }
+ setDeptForm((prev) => ({ ...prev, dept_code: nextCode }));
+ } catch {
+ setDeptForm((prev) => ({ ...prev, dept_code: "(자동 생성)" }));
+ }
};
const openDeptEdit = () => {
@@ -169,7 +194,7 @@ export default function DepartmentPage() {
toast.success("수정되었습니다.");
} else {
await apiClient.post(`/table-management/tables/${DEPT_TABLE}/add`, {
- dept_code: deptForm.dept_code || "",
+ dept_code: "",
dept_name: deptForm.dept_name,
parent_dept_code: deptForm.parent_dept_code || null,
});
@@ -225,6 +250,7 @@ export default function DepartmentPage() {
const handleUserSave = async () => {
if (!userForm.user_id) { toast.error("사용자 ID는 필수입니다."); return; }
if (!userForm.user_name) { toast.error("사용자 이름은 필수입니다."); return; }
+ if (!userForm.dept_code) { toast.error("부서는 필수입니다."); return; }
const errors = validateForm(userForm, ["cell_phone", "email"]);
setFormErrors(errors);
if (Object.keys(errors).length > 0) { toast.error("입력 형식을 확인해주세요."); return; }
@@ -240,10 +266,10 @@ export default function DepartmentPage() {
user_name: userForm.user_name,
user_name_eng: userForm.user_name_eng || undefined,
user_password: password || undefined,
- email: userForm.email || undefined,
+ email: userEditMode ? (userForm.email || null) : (userForm.email || undefined),
tel: userForm.tel || undefined,
- cell_phone: userForm.cell_phone || undefined,
- sabun: userForm.sabun || undefined,
+ cell_phone: userEditMode ? (userForm.cell_phone || null) : (userForm.cell_phone || undefined),
+ sabun: userEditMode ? (userForm.sabun || null) : (userForm.sabun || undefined),
position_name: userForm.position_name || undefined,
dept_code: userForm.dept_code || undefined,
dept_name: depts.find((d) => d.dept_code === userForm.dept_code)?.dept_name || undefined,
@@ -374,7 +400,7 @@ export default function DepartmentPage() {
setDeptForm((p) => ({ ...p, dept_code: e.target.value }))}
- placeholder="부서코드" className="h-9" disabled={deptEditMode} />
+ placeholder={deptEditMode ? "부서코드" : "자동 생성"} className="h-9" disabled />
@@ -424,12 +450,12 @@ export default function DepartmentPage() {
setUserForm((p) => ({ ...p, sabun: e.target.value }))}
- placeholder="사번" className="h-9" />
+ placeholder="사번" className="h-9" autoComplete="off" />
setUserForm((p) => ({ ...p, user_password: e.target.value }))}
- placeholder={userEditMode ? "변경 시에만 입력" : "미입력 시 qlalfqjsgh11"} className="h-9" type="password" />
+ placeholder={userEditMode ? "변경 시에만 입력" : "미입력 시 qlalfqjsgh11"} className="h-9" type="password" autoComplete="new-password" />
@@ -437,7 +463,7 @@ export default function DepartmentPage() {
placeholder="직급" className="h-9" />
-
+