feat: 품목정보 상세 패널 추가 및 프로젝트/근태/권한 기능 확장
- Items: 우측에 이미지, 담당자, 입고/발주내역 패널 추가 (fItems 윈폼 동일) - Project: 목록 및 상세 다이얼로그 구현 - Kuntae: 오류검사/수정 기능 추가 - UserAuth: 사용자 권한 관리 페이지 추가 - UserGroup: 그룹정보 다이얼로그로 전환 - Header: 사용자 메뉴 서브메뉴 방향 수정, 즐겨찾기 기능 - Backend API: Items 상세/담당자/구매내역, 근태 오류검사, 프로젝트 목록 등 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
339
Project/Web/MachineBridge/MachineBridge.UserAuth.cs
Normal file
339
Project/Web/MachineBridge/MachineBridge.UserAuth.cs
Normal file
@@ -0,0 +1,339 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Data.SqlClient;
|
||||
using Newtonsoft.Json;
|
||||
using FCOMMON;
|
||||
|
||||
namespace Project.Web
|
||||
{
|
||||
public partial class MachineBridge
|
||||
{
|
||||
#region UserAuth API (사용자 권한)
|
||||
|
||||
/// <summary>
|
||||
/// 사용자 권한 접근 가능 여부 확인 (Level 5 이상 또는 account 권한 5 이상)
|
||||
/// </summary>
|
||||
public string UserAuth_CanAccess()
|
||||
{
|
||||
try
|
||||
{
|
||||
int curLevel = Math.Max(info.Login.level, FCOMMON.DBM.getAuth(FCOMMON.DBM.eAuthType.account));
|
||||
bool canAccess = curLevel >= 5;
|
||||
|
||||
return JsonConvert.SerializeObject(new
|
||||
{
|
||||
Success = true,
|
||||
CanAccess = canAccess,
|
||||
Level = curLevel,
|
||||
Message = canAccess ? "" : "(관리자/계정담당자) 전용 메뉴 입니다"
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 사용자 권한 목록 조회
|
||||
/// </summary>
|
||||
public string UserAuth_GetList()
|
||||
{
|
||||
try
|
||||
{
|
||||
var sql = @"SELECT idx, [user], gcode, account, purchase, purchaseEB, holyday,
|
||||
project, jobreport, scheapp, equipment, otconfirm, holyreq, kuntae
|
||||
FROM Auth WITH (nolock)
|
||||
WHERE gcode = @gcode
|
||||
ORDER BY [user]";
|
||||
|
||||
var cs = Properties.Settings.Default.gwcs;
|
||||
using (var cn = new SqlConnection(cs))
|
||||
using (var cmd = new SqlCommand(sql, cn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@gcode", info.Login.gcode);
|
||||
using (var da = new SqlDataAdapter(cmd))
|
||||
{
|
||||
var dt = new DataTable();
|
||||
da.Fill(dt);
|
||||
return JsonConvert.SerializeObject(new { Success = true, Data = dt });
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 사용자 권한 저장 (추가/수정)
|
||||
/// </summary>
|
||||
public string UserAuth_Save(int idx, string user, int account, int purchase, int purchaseEB,
|
||||
int holyday, int project, int jobreport, int scheapp, int equipment, int otconfirm, int holyreq, int kuntae)
|
||||
{
|
||||
try
|
||||
{
|
||||
var cs = Properties.Settings.Default.gwcs;
|
||||
|
||||
if (idx == 0)
|
||||
{
|
||||
// 신규 추가
|
||||
// 먼저 중복 확인
|
||||
using (var cn = new SqlConnection(cs))
|
||||
{
|
||||
var checkSql = "SELECT COUNT(*) FROM Auth WHERE gcode = @gcode AND [user] = @user";
|
||||
using (var cmd = new SqlCommand(checkSql, cn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@gcode", info.Login.gcode);
|
||||
cmd.Parameters.AddWithValue("@user", user ?? "");
|
||||
cn.Open();
|
||||
var count = (int)cmd.ExecuteScalar();
|
||||
if (count > 0)
|
||||
{
|
||||
return JsonConvert.SerializeObject(new { Success = false, Message = "이미 등록된 사용자입니다." });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var sql = @"INSERT INTO Auth (gcode, [user], account, purchase, purchaseEB, holyday,
|
||||
project, jobreport, scheapp, equipment, otconfirm, holyreq, kuntae)
|
||||
VALUES (@gcode, @user, @account, @purchase, @purchaseEB, @holyday,
|
||||
@project, @jobreport, @scheapp, @equipment, @otconfirm, @holyreq, @kuntae);
|
||||
SELECT SCOPE_IDENTITY();";
|
||||
|
||||
using (var cn = new SqlConnection(cs))
|
||||
using (var cmd = new SqlCommand(sql, cn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@gcode", info.Login.gcode);
|
||||
cmd.Parameters.AddWithValue("@user", user ?? "");
|
||||
cmd.Parameters.AddWithValue("@account", account);
|
||||
cmd.Parameters.AddWithValue("@purchase", purchase);
|
||||
cmd.Parameters.AddWithValue("@purchaseEB", purchaseEB);
|
||||
cmd.Parameters.AddWithValue("@holyday", holyday);
|
||||
cmd.Parameters.AddWithValue("@project", project);
|
||||
cmd.Parameters.AddWithValue("@jobreport", jobreport);
|
||||
cmd.Parameters.AddWithValue("@scheapp", scheapp);
|
||||
cmd.Parameters.AddWithValue("@equipment", equipment);
|
||||
cmd.Parameters.AddWithValue("@otconfirm", otconfirm);
|
||||
cmd.Parameters.AddWithValue("@holyreq", holyreq);
|
||||
cmd.Parameters.AddWithValue("@kuntae", kuntae);
|
||||
|
||||
cn.Open();
|
||||
var newId = Convert.ToInt32(cmd.ExecuteScalar());
|
||||
return JsonConvert.SerializeObject(new { Success = true, Message = "저장되었습니다.", Data = new { idx = newId } });
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 수정
|
||||
var sql = @"UPDATE Auth SET
|
||||
[user] = @user, account = @account, purchase = @purchase, purchaseEB = @purchaseEB,
|
||||
holyday = @holyday, project = @project, jobreport = @jobreport, scheapp = @scheapp,
|
||||
equipment = @equipment, otconfirm = @otconfirm, holyreq = @holyreq, kuntae = @kuntae
|
||||
WHERE idx = @idx AND gcode = @gcode";
|
||||
|
||||
using (var cn = new SqlConnection(cs))
|
||||
using (var cmd = new SqlCommand(sql, cn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@idx", idx);
|
||||
cmd.Parameters.AddWithValue("@gcode", info.Login.gcode);
|
||||
cmd.Parameters.AddWithValue("@user", user ?? "");
|
||||
cmd.Parameters.AddWithValue("@account", account);
|
||||
cmd.Parameters.AddWithValue("@purchase", purchase);
|
||||
cmd.Parameters.AddWithValue("@purchaseEB", purchaseEB);
|
||||
cmd.Parameters.AddWithValue("@holyday", holyday);
|
||||
cmd.Parameters.AddWithValue("@project", project);
|
||||
cmd.Parameters.AddWithValue("@jobreport", jobreport);
|
||||
cmd.Parameters.AddWithValue("@scheapp", scheapp);
|
||||
cmd.Parameters.AddWithValue("@equipment", equipment);
|
||||
cmd.Parameters.AddWithValue("@otconfirm", otconfirm);
|
||||
cmd.Parameters.AddWithValue("@holyreq", holyreq);
|
||||
cmd.Parameters.AddWithValue("@kuntae", kuntae);
|
||||
|
||||
cn.Open();
|
||||
var result = cmd.ExecuteNonQuery();
|
||||
return JsonConvert.SerializeObject(new { Success = result > 0, Message = result > 0 ? "수정되었습니다." : "수정에 실패했습니다." });
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 사용자 권한 삭제
|
||||
/// </summary>
|
||||
public string UserAuth_Delete(int idx)
|
||||
{
|
||||
try
|
||||
{
|
||||
var sql = "DELETE FROM Auth WHERE idx = @idx AND gcode = @gcode";
|
||||
|
||||
var cs = Properties.Settings.Default.gwcs;
|
||||
using (var cn = new SqlConnection(cs))
|
||||
using (var cmd = new SqlCommand(sql, cn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@idx", idx);
|
||||
cmd.Parameters.AddWithValue("@gcode", info.Login.gcode);
|
||||
|
||||
cn.Open();
|
||||
var result = cmd.ExecuteNonQuery();
|
||||
return JsonConvert.SerializeObject(new { Success = result > 0, Message = result > 0 ? "삭제되었습니다." : "삭제에 실패했습니다." });
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 권한 항목 정보 반환 (프론트엔드 표시용)
|
||||
/// </summary>
|
||||
public string UserAuth_GetFields()
|
||||
{
|
||||
var fields = new[]
|
||||
{
|
||||
new { field = "user", label = "사용자 ID", description = "권한을 설정할 사용자 ID" },
|
||||
new { field = "account", label = "계정", description = "계정 관리 권한" },
|
||||
new { field = "purchase", label = "구매", description = "구매 관리 권한" },
|
||||
new { field = "purchaseEB", label = "구매(전자실)", description = "전자실 구매 권한" },
|
||||
new { field = "holyday", label = "출근부", description = "출근부 관리 권한" },
|
||||
new { field = "project", label = "프로젝트", description = "프로젝트 관리 권한" },
|
||||
new { field = "jobreport", label = "업무일지", description = "업무일지 관리 권한" },
|
||||
new { field = "scheapp", label = "스케쥴", description = "스케쥴 관리 권한" },
|
||||
new { field = "equipment", label = "장비목록", description = "장비 목록 관리 권한" },
|
||||
new { field = "otconfirm", label = "OT승인", description = "초과근무 승인 권한" },
|
||||
new { field = "holyreq", label = "휴가요청", description = "휴가 요청 관리 권한" },
|
||||
new { field = "kuntae", label = "근태", description = "근태 관리 권한" },
|
||||
};
|
||||
|
||||
return JsonConvert.SerializeObject(new { Success = true, Data = fields });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 범용 권한 체크 API
|
||||
/// authType: purchase, holyday, project, jobreport, savecost, equipment, otconfirm, kuntae, holyreq, account, purchaseEB
|
||||
/// requiredLevel: 필요한 최소 레벨 (기본값 5)
|
||||
/// </summary>
|
||||
public string CheckAuth(string authType, int requiredLevel = 5)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 사용자 기본 레벨
|
||||
int userLevel = info.Login.level;
|
||||
|
||||
// authType에 해당하는 권한 레벨 조회
|
||||
int authLevel = 0;
|
||||
if (!string.IsNullOrEmpty(authType))
|
||||
{
|
||||
if (Enum.TryParse<DBM.eAuthType>(authType, true, out var eType))
|
||||
{
|
||||
authLevel = DBM.getAuth(eType);
|
||||
}
|
||||
}
|
||||
|
||||
// 둘 중 높은 값 사용
|
||||
int effectiveLevel = Math.Max(userLevel, authLevel);
|
||||
bool canAccess = effectiveLevel >= requiredLevel;
|
||||
|
||||
return JsonConvert.SerializeObject(new
|
||||
{
|
||||
Success = true,
|
||||
CanAccess = canAccess,
|
||||
UserLevel = userLevel,
|
||||
AuthLevel = authLevel,
|
||||
EffectiveLevel = effectiveLevel,
|
||||
RequiredLevel = requiredLevel,
|
||||
AuthType = authType,
|
||||
Message = canAccess ? "" : $"이 기능은 레벨 {requiredLevel} 이상 권한이 필요합니다."
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 현재 로그인한 사용자의 전체 권한 정보 조회
|
||||
/// </summary>
|
||||
public string GetMyAuth()
|
||||
{
|
||||
try
|
||||
{
|
||||
var sql = @"SELECT idx, [user], account, purchase, purchaseEB, holyday,
|
||||
project, jobreport, scheapp, equipment, otconfirm, holyreq, kuntae
|
||||
FROM Auth WITH (nolock)
|
||||
WHERE gcode = @gcode AND [user] = @user";
|
||||
|
||||
var cs = Properties.Settings.Default.gwcs;
|
||||
using (var cn = new SqlConnection(cs))
|
||||
using (var cmd = new SqlCommand(sql, cn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@gcode", info.Login.gcode);
|
||||
cmd.Parameters.AddWithValue("@user", info.Login.no);
|
||||
cn.Open();
|
||||
using (var reader = cmd.ExecuteReader())
|
||||
{
|
||||
if (reader.Read())
|
||||
{
|
||||
return JsonConvert.SerializeObject(new
|
||||
{
|
||||
Success = true,
|
||||
Data = new
|
||||
{
|
||||
UserLevel = info.Login.level,
|
||||
account = reader["account"] != DBNull.Value ? (int)reader["account"] : 0,
|
||||
purchase = reader["purchase"] != DBNull.Value ? (int)reader["purchase"] : 0,
|
||||
purchaseEB = reader["purchaseEB"] != DBNull.Value ? (int)reader["purchaseEB"] : 0,
|
||||
holyday = reader["holyday"] != DBNull.Value ? (int)reader["holyday"] : 0,
|
||||
project = reader["project"] != DBNull.Value ? (int)reader["project"] : 0,
|
||||
jobreport = reader["jobreport"] != DBNull.Value ? (int)reader["jobreport"] : 0,
|
||||
scheapp = reader["scheapp"] != DBNull.Value ? (int)reader["scheapp"] : 0,
|
||||
equipment = reader["equipment"] != DBNull.Value ? (int)reader["equipment"] : 0,
|
||||
otconfirm = reader["otconfirm"] != DBNull.Value ? (int)reader["otconfirm"] : 0,
|
||||
holyreq = reader["holyreq"] != DBNull.Value ? (int)reader["holyreq"] : 0,
|
||||
kuntae = reader["kuntae"] != DBNull.Value ? (int)reader["kuntae"] : 0,
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
// Auth 테이블에 없는 경우 기본값 반환
|
||||
return JsonConvert.SerializeObject(new
|
||||
{
|
||||
Success = true,
|
||||
Data = new
|
||||
{
|
||||
UserLevel = info.Login.level,
|
||||
account = 0,
|
||||
purchase = 0,
|
||||
purchaseEB = 0,
|
||||
holyday = 0,
|
||||
project = 0,
|
||||
jobreport = 0,
|
||||
scheapp = 0,
|
||||
equipment = 0,
|
||||
otconfirm = 0,
|
||||
holyreq = 0,
|
||||
kuntae = 0,
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user