- 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>
294 lines
11 KiB
C#
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
|
|
}
|
|
}
|