Files
Groupware/Project/Web/MachineBridge/MachineBridge.Login.cs
backuppc 44af041d1a feat: MachineBridge 추가 및 fetch API를 HostObject 호출로 전환
- WebView2 HostObject 기반 MachineBridge 브릿지 클래스 추가
  - MachineBridge.cs (메인), Login, Dashboard, Todo, Common, Jobreport, Kuntae, Project 모듈
- WebSocketServer.cs 추가 (실시간 통신용)
- fDashboardNew 다이얼로그 추가
- Jobreport/index.html, Project/index.html의 fetch API를 machine HostObject 호출로 전환
- DashBoardController.cs의 gcode null 처리 추가
- 사용하지 않는 파일 삭제 (navigation.html, common-nav.js, navigation.js, _add_to_project.py, _project_updater.js)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 16:06:35 +09:00

294 lines
11 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();
}
break;
}
}
}
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 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);
}
#endregion
}
}