feat(service): Console_SendMail을 Windows 서비스로 변환
- MailService.cs 추가: ServiceBase 상속받는 Windows 서비스 클래스 - Program.cs 수정: 서비스/콘솔 모드 지원, 설치/제거 기능 추가 - 프로젝트 설정: System.ServiceProcess 참조 추가 - 배치 파일 추가: 서비스 설치/제거/콘솔실행 스크립트 주요 기능: - Windows 서비스로 백그라운드 실행 - 명령행 인수로 모드 선택 (-install, -uninstall, -console) - EventLog를 통한 서비스 로깅 - 안전한 서비스 시작/중지 처리 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
408
Project/Web/Controllers/ProjectController.cs
Normal file
408
Project/Web/Controllers/ProjectController.cs
Normal file
@@ -0,0 +1,408 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Web.Http;
|
||||
using Newtonsoft.Json;
|
||||
using FCOMMON;
|
||||
using Project.Web.Model;
|
||||
|
||||
namespace Project.Web.Controllers
|
||||
{
|
||||
public class ProjectController : BaseController
|
||||
{
|
||||
[HttpGet]
|
||||
public HttpResponseMessage Index()
|
||||
{
|
||||
var filePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Web", "wwwroot", "Project", "index.html");
|
||||
var contents = string.Empty;
|
||||
|
||||
if (System.IO.File.Exists(filePath))
|
||||
{
|
||||
contents = System.IO.File.ReadAllText(filePath, System.Text.Encoding.UTF8);
|
||||
}
|
||||
else
|
||||
{
|
||||
contents = "<html><body><h1>404 - File Not Found</h1><p>The requested file was not found: " + filePath + "</p></body></html>";
|
||||
}
|
||||
|
||||
var resp = new HttpResponseMessage()
|
||||
{
|
||||
Content = new StringContent(
|
||||
contents,
|
||||
System.Text.Encoding.UTF8,
|
||||
"text/html")
|
||||
};
|
||||
|
||||
return resp;
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
public HttpResponseMessage GetProjects(string status = "진행", string userFilter = "my")
|
||||
{
|
||||
try
|
||||
{
|
||||
var currentUser = GetCurrentUser();
|
||||
if (currentUser == null)
|
||||
{
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = false,
|
||||
Message = "로그인되지 않은 상태입니다."
|
||||
});
|
||||
}
|
||||
|
||||
string gcode = FCOMMON.info.Login.gcode;
|
||||
string currentUserName = FCOMMON.info.Login.nameK ?? "";
|
||||
|
||||
var sql = @"
|
||||
SELECT idx, status as 상태,asset as 자산번호, model as 장비모델, serial as 시리얼번호, Priority as 우선순위,
|
||||
ReqSite as 요청국가, ReqPlant as 요청공장, ReqLine as 요청라인, ReqPackage as 요청부서패키지,
|
||||
reqstaff as 요청자, process as 프로젝트공정, sdate as 시작일,edate as 완료일,ddate as 만료일, odate as 출고일, name as 프로젝트명,
|
||||
dbo.getUserName( isnull(championid, userManager) ) as 프로젝트관리자,
|
||||
dbo.getUserName (isnull(designid, usermain)) as 설계담당,
|
||||
dbo.getUserName(isnull(epanelid, userhw2)) as 전장담당,
|
||||
dbo.getUserName(isnull(softwareid, usersub)) as 프로그램담당,
|
||||
crdue as 예산만기일, cramount as 예산,jasmin as 웹관리번호
|
||||
FROM Projects
|
||||
WHERE gcode = @gcode
|
||||
AND status = @status
|
||||
AND ISNULL(isdel, 0) = 0";
|
||||
|
||||
// 사용자 필터 적용
|
||||
if (userFilter == "my" && !string.IsNullOrEmpty(currentUserName))
|
||||
{
|
||||
sql += @" AND (
|
||||
dbo.getUserName(ISNULL(championid, userManager)) LIKE @userName
|
||||
OR dbo.getUserName(ISNULL(designid, usermain)) LIKE @userName
|
||||
OR dbo.getUserName(ISNULL(epanelid, userhw2)) LIKE @userName
|
||||
OR dbo.getUserName(ISNULL(softwareid, usersub)) LIKE @userName
|
||||
)";
|
||||
}
|
||||
|
||||
sql += " ORDER BY wdate DESC";
|
||||
|
||||
var parameters = new
|
||||
{
|
||||
gcode = gcode,
|
||||
status = status,
|
||||
userName = userFilter == "my" ? "%" + currentUserName + "%" : ""
|
||||
};
|
||||
|
||||
var projects = DBM.Query<ProjectModel>(sql, parameters);
|
||||
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = true,
|
||||
Data = projects,
|
||||
CurrentUser = currentUserName
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = false,
|
||||
Message = "프로젝트 목록을 가져오는 중 오류가 발생했습니다: " + ex.Message
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
public HttpResponseMessage GetProject(int id)
|
||||
{
|
||||
try
|
||||
{
|
||||
var currentUser = GetCurrentUser();
|
||||
if (currentUser == null)
|
||||
{
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = false,
|
||||
Message = "로그인되지 않은 상태입니다."
|
||||
});
|
||||
}
|
||||
|
||||
if (id <= 0)
|
||||
{
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = false,
|
||||
Message = "유효하지 않은 프로젝트 ID입니다."
|
||||
});
|
||||
}
|
||||
|
||||
string gcode = FCOMMON.info.Login.gcode;
|
||||
|
||||
var sql = @"
|
||||
SELECT idx, status as 상태,asset as 자산번호, model as 장비모델, serial as 시리얼번호, Priority as 우선순위,
|
||||
ReqSite as 요청국가, ReqPlant as 요청공장, ReqLine as 요청라인, ReqPackage as 요청부서패키지,
|
||||
reqstaff as 요청자, process as 프로젝트공정, sdate as 시작일,edate as 완료일,ddate as 만료일, odate as 출고일, name as 프로젝트명,
|
||||
dbo.getUserName( isnull(championid, userManager) ) as 프로젝트관리자,
|
||||
dbo.getUserName (isnull(designid, usermain)) as 설계담당,
|
||||
dbo.getUserName(isnull(epanelid, userhw2)) as 전장담당,
|
||||
dbo.getUserName(isnull(softwareid, usersub)) as 프로그램담당,
|
||||
crdue as 예산만기일, cramount as 예산,jasmin as 웹관리번호
|
||||
FROM Projects
|
||||
WHERE idx = @idx AND gcode = @gcode AND ISNULL(isdel, 0) = 0";
|
||||
|
||||
var project = DBM.QuerySingleOrDefault<ProjectModel>(sql, new { idx = id, gcode = gcode });
|
||||
|
||||
if (project == null)
|
||||
{
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = false,
|
||||
Message = "프로젝트를 찾을 수 없습니다."
|
||||
});
|
||||
}
|
||||
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = true,
|
||||
Data = project
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = false,
|
||||
Message = "프로젝트 조회 중 오류가 발생했습니다: " + ex.Message
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public HttpResponseMessage CreateProject([FromBody] ProjectModel project)
|
||||
{
|
||||
try
|
||||
{
|
||||
var currentUser = GetCurrentUser();
|
||||
if (currentUser == null)
|
||||
{
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = false,
|
||||
Message = "로그인되지 않은 상태입니다."
|
||||
});
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(project.프로젝트명))
|
||||
{
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = false,
|
||||
Message = "프로젝트명을 입력해주세요."
|
||||
});
|
||||
}
|
||||
|
||||
string gcode = FCOMMON.info.Login.gcode;
|
||||
string uid = FCOMMON.info.Login.no;
|
||||
|
||||
var sql = @"
|
||||
INSERT INTO Projects (gcode, process, sdate, name, edate, ddate, odate, userManager, status, memo, wdate)
|
||||
VALUES (@gcode, @process, @sdate, @name, @edate, @ddate, @odate, @userManager, @status, @memo, GETDATE())";
|
||||
|
||||
var parameters = new
|
||||
{
|
||||
gcode = gcode,
|
||||
process = project.프로젝트공정 ?? "",
|
||||
sdate = project.시작일,
|
||||
name = project.프로젝트명,
|
||||
edate = project.완료일,
|
||||
ddate = project.만료일,
|
||||
odate = project.출고일,
|
||||
userManager = project.프로젝트관리자 ?? "",
|
||||
status = project.상태 ?? "진행",
|
||||
memo = project.memo ?? ""
|
||||
};
|
||||
|
||||
DBM.Execute(sql, parameters);
|
||||
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = true,
|
||||
Message = "프로젝트가 추가되었습니다."
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = false,
|
||||
Message = "프로젝트 추가 중 오류가 발생했습니다: " + ex.Message
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
[HttpPut]
|
||||
public HttpResponseMessage UpdateProject([FromBody] ProjectModel project)
|
||||
{
|
||||
try
|
||||
{
|
||||
var currentUser = GetCurrentUser();
|
||||
if (currentUser == null)
|
||||
{
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = false,
|
||||
Message = "로그인되지 않은 상태입니다."
|
||||
});
|
||||
}
|
||||
|
||||
if (project.idx <= 0)
|
||||
{
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = false,
|
||||
Message = "유효하지 않은 프로젝트 ID입니다."
|
||||
});
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(project.프로젝트명))
|
||||
{
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = false,
|
||||
Message = "프로젝트명을 입력해주세요."
|
||||
});
|
||||
}
|
||||
|
||||
string gcode = FCOMMON.info.Login.gcode;
|
||||
|
||||
// 먼저 프로젝트가 존재하는지 확인
|
||||
var checkSql = "SELECT COUNT(*) FROM Projects WHERE idx = @idx AND gcode = @gcode AND ISNULL(isdel, 0) = 0";
|
||||
var count = DBM.QuerySingle<int>(checkSql, new { idx = project.idx, gcode = gcode });
|
||||
|
||||
if (count == 0)
|
||||
{
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = false,
|
||||
Message = "수정할 프로젝트를 찾을 수 없습니다."
|
||||
});
|
||||
}
|
||||
|
||||
var sql = @"
|
||||
UPDATE Projects
|
||||
SET process = @process, sdate = @sdate, name = @name, edate = @edate,
|
||||
ddate = @ddate, odate = @odate, userManager = @userManager,
|
||||
status = @status, memo = @memo
|
||||
WHERE idx = @idx AND gcode = @gcode";
|
||||
|
||||
var parameters = new
|
||||
{
|
||||
idx = project.idx,
|
||||
gcode = gcode,
|
||||
process = project.프로젝트공정 ?? "",
|
||||
sdate = project.시작일,
|
||||
name = project.프로젝트명,
|
||||
edate = project.완료일,
|
||||
ddate = project.만료일,
|
||||
odate = project.출고일,
|
||||
userManager = project.프로젝트관리자 ?? "",
|
||||
status = project.상태 ?? "진행",
|
||||
memo = project.memo ?? ""
|
||||
};
|
||||
|
||||
DBM.Execute(sql, parameters);
|
||||
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = true,
|
||||
Message = "프로젝트가 수정되었습니다."
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = false,
|
||||
Message = "프로젝트 수정 중 오류가 발생했습니다: " + ex.Message
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
[HttpDelete]
|
||||
public HttpResponseMessage DeleteProject(int id)
|
||||
{
|
||||
try
|
||||
{
|
||||
var currentUser = GetCurrentUser();
|
||||
if (currentUser == null)
|
||||
{
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = false,
|
||||
Message = "로그인되지 않은 상태입니다."
|
||||
});
|
||||
}
|
||||
|
||||
if (id <= 0)
|
||||
{
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = false,
|
||||
Message = "유효하지 않은 프로젝트 ID입니다."
|
||||
});
|
||||
}
|
||||
|
||||
string gcode = FCOMMON.info.Login.gcode;
|
||||
|
||||
// 먼저 프로젝트가 존재하는지 확인
|
||||
var checkSql = "SELECT COUNT(*) FROM Projects WHERE idx = @idx AND gcode = @gcode AND ISNULL(isdel, 0) = 0";
|
||||
var count = DBM.QuerySingle<int>(checkSql, new { idx = id, gcode = gcode });
|
||||
|
||||
if (count == 0)
|
||||
{
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = false,
|
||||
Message = "삭제할 프로젝트를 찾을 수 없습니다."
|
||||
});
|
||||
}
|
||||
|
||||
var sql = "UPDATE Projects SET isdel = 1 WHERE idx = @idx AND gcode = @gcode";
|
||||
DBM.Execute(sql, new { idx = id, gcode = gcode });
|
||||
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = true,
|
||||
Message = "프로젝트가 삭제되었습니다."
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return CreateJsonResponse(new
|
||||
{
|
||||
Success = false,
|
||||
Message = "프로젝트 삭제 중 오류가 발생했습니다: " + ex.Message
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private object GetCurrentUser()
|
||||
{
|
||||
if (string.IsNullOrEmpty(FCOMMON.info.Login.no)) return null;
|
||||
else return FCOMMON.info.Login;
|
||||
}
|
||||
|
||||
private HttpResponseMessage CreateJsonResponse(object data)
|
||||
{
|
||||
var json = JsonConvert.SerializeObject(data, new JsonSerializerSettings
|
||||
{
|
||||
NullValueHandling = NullValueHandling.Ignore,
|
||||
DateFormatString = "yyyy-MM-dd HH:mm:ss"
|
||||
});
|
||||
|
||||
return new HttpResponseMessage()
|
||||
{
|
||||
Content = new StringContent(
|
||||
json,
|
||||
System.Text.Encoding.UTF8,
|
||||
"application/json")
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user