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 = "

404 - File Not Found

The requested file was not found: " + filePath + "

"; } 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(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(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(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(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") }; } } }