Files
Groupware/Project/Web/Controller/ProjectController.cs
ChiKyun Kim a11780f725 프로젝트 관리 시스템 구현 및 UI 개선
- 새로운 프로젝트 관리 화면 추가 (ProjectController, ProjectModel)
- 로그인된 사용자 기반 필터링 기능 구현
- 프로젝트 CRUD 기능 완성 (생성, 조회, 수정, 삭제)
- 컬럼 표시/숨김 기능으로 사용자 정의 뷰 지원
- 상태별 프로젝트 현황 대시보드
- 엑셀 내보내기 기능
- 반응형 디자인 및 glass-effect UI 적용
- 할일관리/근태관리와 일관된 레이아웃 구조

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-04 15:20:58 +09:00

409 lines
15 KiB
C#

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