- 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>
409 lines
15 KiB
C#
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")
|
|
};
|
|
}
|
|
}
|
|
}
|