- 월별근무표: 휴일/근무일 관리, 자동 초기화 - 메일양식: 템플릿 CRUD, To/CC/BCC 설정 - 그룹정보: 부서 관리, 비트 연산 기반 권한 설정 - 업무일지: 수정 성공 메시지 제거, 오늘 근무시간 필터링 수정 - 웹소켓 메시지 type 충돌 버그 수정 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
391 lines
14 KiB
C#
391 lines
14 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Net;
|
|
using System.Windows.Forms;
|
|
using Newtonsoft.Json;
|
|
using FCOMMON;
|
|
|
|
namespace Project.Web
|
|
{
|
|
public partial class MachineBridge
|
|
{
|
|
#region Login API
|
|
|
|
/// <summary>
|
|
/// 로그인 처리 (fLogin_WB.cs의 button1_Click 로직 참고)
|
|
/// </summary>
|
|
public string Login(string gcode, string id, string password, bool rememberMe)
|
|
{
|
|
var result = new LoginResult();
|
|
DateTime dt = DateTime.Now;
|
|
|
|
try
|
|
{
|
|
if (string.IsNullOrEmpty(id))
|
|
{
|
|
result.Success = false;
|
|
result.Message = "사용자 ID를 입력하세요.";
|
|
return JsonConvert.SerializeObject(result);
|
|
}
|
|
|
|
if (string.IsNullOrEmpty(password))
|
|
{
|
|
result.Success = false;
|
|
result.Message = "비밀번호를 입력하세요.";
|
|
return JsonConvert.SerializeObject(result);
|
|
}
|
|
|
|
if (string.IsNullOrEmpty(gcode))
|
|
{
|
|
result.Success = false;
|
|
result.Message = "소속 부서를 선택하세요.";
|
|
return JsonConvert.SerializeObject(result);
|
|
}
|
|
|
|
// 부서명 조회
|
|
var deptName = DBM.ExecuteScalar($"SELECT dept FROM UserGroup WHERE gcode = '{gcode}'") ?? "";
|
|
|
|
var encpass = Pub.MakePasswordEnc(password.Trim());
|
|
|
|
// 개발자 계정 처리
|
|
if (id.ToUpper().Equals("DEV"))
|
|
{
|
|
if (!password.Equals("123"))
|
|
{
|
|
result.Success = false;
|
|
result.Message = "암호가 일치하지 않습니다.";
|
|
return JsonConvert.SerializeObject(result);
|
|
}
|
|
|
|
SetDevLoginInfo(gcode, deptName);
|
|
}
|
|
else
|
|
{
|
|
// 일반 사용자 로그인 처리
|
|
var taGrpUser = new dsMSSQLTableAdapters.EETGW_GroupUserTableAdapter();
|
|
var drGrpUser = taGrpUser.GetbyID(gcode, id).FirstOrDefault();
|
|
|
|
if (drGrpUser == null)
|
|
{
|
|
result.Success = false;
|
|
result.Message = $"입력한 사용자 계정이 존재하지 않습니다.\n\n담당부서명:{deptName}\n부서코드:{gcode}\n\n접속 부서를 확인하시고 관리자 문의 하세요";
|
|
return JsonConvert.SerializeObject(result);
|
|
}
|
|
|
|
if (drGrpUser.level == 0)
|
|
{
|
|
result.Success = false;
|
|
result.Message = "해당 계정이 활성화되지 않았습니다.\n계정 담당자 문의하세요";
|
|
return JsonConvert.SerializeObject(result);
|
|
}
|
|
|
|
// 사용자 테이블에서 암호 확인
|
|
var taUser = new dsMSSQLTableAdapters.UsersTableAdapter();
|
|
var drUser = taUser.GetID(id).FirstOrDefault();
|
|
|
|
if (drUser == null)
|
|
{
|
|
result.Success = false;
|
|
result.Message = $"입력한 사용자 계정이 존재하지 않습니다.\n\n담당부서명:{deptName}\n부서코드:{gcode}\n\n접속 부서를 확인하시고 관리자 문의 하세요";
|
|
return JsonConvert.SerializeObject(result);
|
|
}
|
|
|
|
if (!drUser.password.Equals(encpass))
|
|
{
|
|
result.Success = false;
|
|
result.Message = "암호가 일치하지 않습니다.\n암호를 분실했을 경우에는 계정담당자에 초기화를 요청 하세요";
|
|
return JsonConvert.SerializeObject(result);
|
|
}
|
|
|
|
// 버전 체크
|
|
var MaxVersion = DBM.GetMaxVersion();
|
|
if (!MaxVersion.isEmpty())
|
|
{
|
|
var curversion = Application.ProductVersion;
|
|
var verchk = curversion.CompareTo(MaxVersion);
|
|
if (verchk < 0)
|
|
{
|
|
result.VersionWarning = "현재 구 버젼을 사용하고 있습니다.\n업데이트를 진행 하고 사용하시기 바랍니다";
|
|
}
|
|
}
|
|
|
|
// 로그인 정보 설정
|
|
var gperm = DBM.ExecuteScalar($"SELECT ISNULL(permission,0) FROM UserGroup WHERE gcode = '{gcode}'");
|
|
|
|
info.Login.no = drUser.id;
|
|
info.Login.nameK = drUser.name;
|
|
info.Login.dept = deptName;
|
|
info.Login.level = drGrpUser.level;
|
|
info.Login.email = drUser.email;
|
|
info.Login.nameE = drUser.nameE;
|
|
info.Login.hp = drUser.hp;
|
|
info.Login.tel = drUser.tel;
|
|
info.Login.title = drUser.dept + "(" + drUser.grade + ")";
|
|
info.NotShowJobReportview = Pub.setting.NotShowJobreportPRewView;
|
|
info.Login.gcode = gcode;
|
|
info.Login.process = drGrpUser.Process;
|
|
info.Login.permission = 0;
|
|
info.Login.gpermission = int.Parse(gperm);
|
|
info.ShowBuyerror = Pub.setting.Showbuyerror;
|
|
}
|
|
|
|
// 설정 저장 (rememberMe 처리)
|
|
if (rememberMe)
|
|
{
|
|
var idlist = new List<string> { id.Trim() };
|
|
var vuserlist = "";
|
|
foreach (var item in idlist)
|
|
vuserlist += ";" + item;
|
|
|
|
Pub.setting.lastid = vuserlist;
|
|
Pub.setting.lastdpt = deptName;
|
|
Pub.setting.lastgcode = gcode;
|
|
Pub.setting.Save();
|
|
}
|
|
|
|
// 로그인 정보 기록
|
|
AddLoginInfo();
|
|
|
|
// 자동 업무일지 생성
|
|
Pub.MakeAutoJobReportbyLogin();
|
|
Pub.MakeAutoJobReportByAuto();
|
|
|
|
info.Login.loginusetime = (DateTime.Now - dt).TotalMilliseconds;
|
|
|
|
// fMain의 로그인 완료 후처리 호출
|
|
CallMainFormLoginCompleted();
|
|
|
|
result.Success = true;
|
|
result.Message = "로그인 성공";
|
|
result.RedirectUrl = "/DashBoard/index.html";
|
|
result.UserName = info.Login.nameK;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
result.Success = false;
|
|
result.Message = "데이터베이스 조회 실패. 다음 오류 메세지를 참고하세요.\n\n" + ex.Message;
|
|
}
|
|
|
|
return JsonConvert.SerializeObject(result);
|
|
}
|
|
|
|
/// <summary>
|
|
/// fMain의 OnLoginCompleted() 호출
|
|
/// </summary>
|
|
private void CallMainFormLoginCompleted()
|
|
{
|
|
try
|
|
{
|
|
// Application.OpenForms에서 fMain 인스턴스 찾기
|
|
foreach (Form form in Application.OpenForms)
|
|
{
|
|
if (form is fMain mainForm)
|
|
{
|
|
// UI 스레드에서 실행
|
|
if (mainForm.InvokeRequired)
|
|
{
|
|
mainForm.Invoke(new Action(() => mainForm.OnLoginCompleted()));
|
|
}
|
|
else
|
|
{
|
|
mainForm.OnLoginCompleted();
|
|
}
|
|
}
|
|
else if (form is Dialog.fDashboard dashForm)
|
|
{
|
|
if (dashForm.InvokeRequired)
|
|
{
|
|
dashForm.Invoke(new Action(() => dashForm.RefreshPage()));
|
|
}
|
|
else
|
|
{
|
|
dashForm.RefreshPage();
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"OnLoginCompleted 호출 오류: {ex.Message}");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 개발자 로그인 정보 설정
|
|
/// </summary>
|
|
private void SetDevLoginInfo(string gcode, string deptName)
|
|
{
|
|
var gperm = DBM.ExecuteScalar($"SELECT ISNULL(permission,0) FROM UserGroup WHERE gcode = '{gcode}'");
|
|
|
|
info.Login.no = "dev";
|
|
info.Login.nameK = "개발자";
|
|
info.Login.dept = deptName;
|
|
info.Login.level = 10;
|
|
info.Login.email = "";
|
|
info.Login.nameE = "DEVELOPER";
|
|
info.Login.hp = "";
|
|
info.Login.tel = "";
|
|
info.Login.title = "업무일지 개발자";
|
|
info.NotShowJobReportview = Pub.setting.NotShowJobreportPRewView;
|
|
info.Login.gcode = gcode;
|
|
info.Login.process = "개발자";
|
|
info.Login.permission = 0;
|
|
info.Login.gpermission = int.Parse(gperm);
|
|
info.ShowBuyerror = Pub.setting.Showbuyerror;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 로그인 정보 기록
|
|
/// </summary>
|
|
private void AddLoginInfo()
|
|
{
|
|
string ip = string.Empty;
|
|
string hostname = Dns.GetHostName();
|
|
string fullname = Dns.GetHostEntry("").HostName;
|
|
|
|
var host = Dns.GetHostEntry(hostname);
|
|
foreach (IPAddress r in host.AddressList)
|
|
{
|
|
string str = r.ToString();
|
|
if (!string.IsNullOrEmpty(str) && str.StartsWith("10."))
|
|
{
|
|
ip = str;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (string.IsNullOrEmpty(ip) || string.IsNullOrEmpty(hostname)) return;
|
|
|
|
try
|
|
{
|
|
var ta = new dsMSSQLTableAdapters.EETGW_LoginInfoTableAdapter();
|
|
ta.Insert(info.Login.no, DateTime.Now, ip, fullname, info.Login.no, DateTime.Now);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine(ex.Message);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 현재 로그인 상태 확인
|
|
/// </summary>
|
|
public string CheckLoginStatus()
|
|
{
|
|
var isLoggedIn = !string.IsNullOrEmpty(info.Login.no);
|
|
var result = new
|
|
{
|
|
Success = true,
|
|
IsLoggedIn = isLoggedIn,
|
|
User = isLoggedIn ? new
|
|
{
|
|
Id = info.Login.no,
|
|
Name = info.Login.nameK,
|
|
NameE = info.Login.nameE,
|
|
Dept = info.Login.dept,
|
|
Email = info.Login.email,
|
|
Level = info.Login.level,
|
|
Gcode = info.Login.gcode
|
|
} : null
|
|
};
|
|
return JsonConvert.SerializeObject(result);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 그룹 목록 조회
|
|
/// </summary>
|
|
public string GetUserGroups()
|
|
{
|
|
var dt = DBM.GetUserGroups();
|
|
return JsonConvert.SerializeObject(dt, new JsonSerializerSettings
|
|
{
|
|
NullValueHandling = NullValueHandling.Ignore
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// 이전 로그인 정보 조회
|
|
/// </summary>
|
|
public string GetPreviousLoginInfo()
|
|
{
|
|
var result = new
|
|
{
|
|
Success = true,
|
|
Data = new
|
|
{
|
|
LastGcode = Pub.setting.lastgcode ?? "",
|
|
LastDept = Pub.setting.lastdpt ?? "",
|
|
LastId = Pub.setting.lastid?.TrimStart(';').Split(';').FirstOrDefault() ?? ""
|
|
}
|
|
};
|
|
return JsonConvert.SerializeObject(result);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 로그아웃 처리
|
|
/// </summary>
|
|
public string Logout()
|
|
{
|
|
try
|
|
{
|
|
// 로그인 정보 초기화
|
|
info.Login.no = "";
|
|
info.Login.nameK = "";
|
|
info.Login.nameE = "";
|
|
info.Login.dept = "";
|
|
info.Login.email = "";
|
|
info.Login.level = 0;
|
|
info.Login.gcode = "";
|
|
info.Login.hp = "";
|
|
info.Login.tel = "";
|
|
info.Login.title = "";
|
|
info.Login.process = "";
|
|
info.Login.permission = 0;
|
|
info.Login.gpermission = 0;
|
|
|
|
// fMain의 CloseAllForm 호출
|
|
CallMainFormCloseAllForm();
|
|
|
|
return JsonConvert.SerializeObject(new { Success = true, Message = "로그아웃 되었습니다." });
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// fMain의 CloseAllForm() 호출
|
|
/// </summary>
|
|
private void CallMainFormCloseAllForm()
|
|
{
|
|
try
|
|
{
|
|
foreach (Form form in Application.OpenForms)
|
|
{
|
|
if (form is fMain mainForm)
|
|
{
|
|
if (mainForm.InvokeRequired)
|
|
{
|
|
mainForm.Invoke(new Action(() => mainForm.CloseAllFormPublic()));
|
|
}
|
|
else
|
|
{
|
|
mainForm.CloseAllFormPublic();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"CloseAllForm 호출 오류: {ex.Message}");
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|