using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NP.Model; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using System.Web; using System.Web.Mvc; namespace NP.Base.Controllers { public partial class FOCommonController : NP.Base.BaseController { protected override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); } protected override void OnException(ExceptionContext filterContext) { base.OnException(filterContext); if (Request.IsAjaxRequest()) { filterContext.Result = new RedirectResult("/Account/NoPermit?_code=" + NP.Base.ENUM.JSONCode.Error + "&_msg=알수없는오류"); } else { filterContext.Result = new RedirectResult("/Account/Error?_code=" + NP.Base.ENUM.JSONCode.Error + "&_msg=알수없는오류"); } } public JsonResult Html(int pno) { return JsonBack(Dao.Get("mm.pages", new Hashtable() { { "pno", pno } }).First()); } public JsonResult HidePop(int pno) { var p = CookieGet("popup", ""); CookieSet("popup", p == "" ? pno.ToString() : (p + "p" + pno), 7); return JsonOK(1); } public void DownFile(Int64 fno, int getdel = 0, String loginfo = "", int issubject = 0) { Dao.Save("sys.file.down", fno); var file = Dao.Get("sys.file.get" + (getdel > 0 ? "all" : ""), fno).FirstOrDefault(); if (Request.UrlReferrer == null || (!SUserInfo.IsAdmin && file.tablename == "lectsd" && file.columnname == "fgno" && SUserInfo.UserNo != file.cno)) { Response.Clear(); Response.ClearHeaders(); Response.ClearContent(); Response.ContentType = "Application/octet-stream"; Response.AppendHeader("Content-Disposition", "attachment;filename=" + Server.UrlEncode("권한없음.png")); Response.TransmitFile(string.Format("{0}", Server.MapPath("/img/repute_tail.png"))); Response.Flush(); Response.End(); } else { string fileurl = Server.MapPath((issubject == 1 ? file.fullurl2 : file.fullurl)); Response.Clear(); Response.ClearHeaders(); Response.ClearContent(); Response.ContentType = "text/plain"; Response.AppendHeader("Content-Disposition", "attachment;filename=" + Server.UrlEncode(file.orgname)); Response.AppendHeader("Content-Length", file.filesize.ToString()); Response.TransmitFile(string.Format("{0}", fileurl)); Response.Flush(); Response.End(); } } [HttpPost] public JsonResult Login(VMUser vm, String uid, String upw, int logincnt, bool issaveid) { if (issaveid) { CookieSet("savedid", uid); } else { CookieClear("savedid"); } if (!string.IsNullOrEmpty(uid) && !string.IsNullOrEmpty(upw)) { var u = GoLogin(uid, upw); if (u != null) { if(u.intv1 == 1) { ++logincnt; if (logincnt > 4) { Dao.Save("users.disable", new Hashtable() { { "userno", u.userno } }); } return JsonBack(new JsonRtn() { code = 1000, msg = "-4", obj = u.userno }); } if (u.intv1 == 2 || u.status == 8) // 휴면상태 포함 { // 비활성 상태(비번 5회 이상) return JsonBack(new JsonRtn() { code = 1000, msg = "-5", obj = u.userno }); } else { if (u.userno < 0) { return JsonBack(new JsonRtn() { code = 1000, obj = -1, msg = u.subdomain }); } //비밀번호 변경 90일 경과 if (u.udt.AddDays(90) < DateTime.Now) { return JsonBack(new JsonRtn() { code = 1000, msg = "-2", obj = u.userno }); } // 휴면상태 if (u.status == 8) { return JsonBack(new JsonRtn() { code = 1000, msg = "-3", obj = u.userno }); } if (u.status == 98) { // 탈퇴신청중 u = null; CookieClear(null, true); return JsonBack(new JsonRtn() { code = 1000, msg = "-6", obj = null }); } return JsonOK(u.userno); } } } return JsonOK(0); } /// /// 비밀번호 변경 저장 (비밀번호 변경 90일 지난 사용자) /// /// /// public JsonResult PwChange(VMUser vm) { if (string.IsNullOrEmpty(vm.User.userpass) || vm.User.userpass.Trim() == "") { Dao.Save("users.resetuserpass", new Hashtable() { { "userno", vm.userno } }); return JsonOK(1); } if (vm.userno > 0 && !string.IsNullOrEmpty(vm.User.userpass) && vm.User.userpass.Trim() != "") { //if (Dao.Save("users.resetuserpass", new Hashtable() { { "userpass", NP.Base.Lib.KISA_SHA256.SHA256Hash(vm.User.userpass) }, { "userno", vm.userno } }) == 1) //{ // var u = GoLogin(vm.User.userid, vm.User.userpass); // if (u != null) // { // return JsonOK(1); // } //} if (Dao.Save("users.resetuserpass", new Hashtable() { { "userpass", NP.Base.Lib.KISA_SHA256.SHA256Hash(vm.User.userpass) }, { "userno", vm.userno } }) > 0) { var u = GoLogin(vm.User.userid, vm.User.userpass); if (u != null) { return JsonOK(1); } } } return JsonOK(0); } /// /// 휴면해제 /// /// /// public JsonResult DormantCancel(int userno) { if (Dao.Get("users.dormants", new Hashtable() { { "userno", userno } }).Count() < 1) { return JsonBack(new JsonRtn() { code = 1 }); } var result = Dao.Save("users.dormant.cancel", new Hashtable() { { "usernos", userno }, { "uno", SUserInfo.UserNo }, { "uip", GetUserIP() } }); var user = Dao.Get("users.findmes", new Hashtable() { { "userno", userno } }).FirstOrDefault(); if (user != null) { var u = GoLogin(user.userid, "rhksflwkfhrmdls999"); if (u != null) { return JsonOK(result); } else { return JsonBack(new JsonRtn() { code = 2 }); } } return JsonOK(0); } [HttpPost] public JsonResult GetBoards(int btype, int pn, int prc, String sc) { return JsonBackList(Dao.Get("board.list", new Hashtable() { { "BType", btype }, { "SubjectContents", sc.Trim() == "" ? null : sc.Trim() }, { "PAGENUM", pn }, { "PAGEROWSIZE", prc } })); } [HttpPost] public JsonResult CMInnings(int cmno) { return JsonBack(Dao.Get("cm.cminnings", new System.Collections.Hashtable() { { "cmno", cmno } })); } [HttpPost] public JsonResult CMRelays(int cmno) { var cms = Dao.Get("cm.cmrelays", new System.Collections.Hashtable() { { "cmno", cmno }, { "userno", SUserInfo.UserNo } }); return JsonBack(new Hashtable() { { "pre", cms.Where(w => w.ispre == 1).ToList() }, { "after", cms.Where(w => w.ispre == 0).ToList() } }); } [HttpPost] public JsonResult AssignFind(String brno, int? pno) { brno = (brno ?? "").Replace("-", ""); return JsonBack(Dao.Get("users.assigns", new Hashtable() { { "brno", brno }, { "pagenum", pno }, { "pagerowsize", 10 } })); } [HttpPost] public JsonResult AssignSave(String brno, String asname,String ceoname) { var ht = new Hashtable() { { "asno", 0 }, { "isjoin", 0 }, { "ascode", Dao.Get("users.assign.newascode", 1).First() }, { "joinprice", 0 }, { "asname", asname }, { "brno", brno.Replace("-", "")}, { "ceoname", ceoname }, { "salesamount", 0 }, { "mcount", 0 }, { "status", 1 }, { "isdel", 0 }, { "uno", SUserInfo.UserNo }, { "uip", GetUserIP() } }; Dao.Insert("users.assign.in", ht); return JsonOK(GetInt(ht["asno"])); } [HttpPost] public JsonResult Join(Users u) { u.uip = GetUserIP(); //이메일, 아이디 중복 체크 var u129 = Dao.Get("users.checkuser", new Hashtable() { { "userid", u.userid }, { "email", u.email },{"mobile",u.mobile } }).First(); if (u129 != 9) { return JsonOK(u129 * -1); } u.userpass = NP.Base.Lib.KISA_SHA256.SHA256Hash(u.userpass.Trim()); u.birthday = u.birthday != null && u.birthday.Length == 8 ? (u.birthday ?? "").Substring(0, 4) + "-" + (u.birthday ?? "").Substring(4, 2) + "-" + (u.birthday ?? "").Substring(6, 2) : null; u.usertype = u.status = 1; Dao.Insert("users.in", u); return JsonOK(u.userno); } // 이후 전문건설과 같이 본인인증시 팝업을 제한할 경우 Join -> Join_new 서로 매서드 변경할것 public JsonResult Join_new(Users u) { if (!string.IsNullOrWhiteSpace(u.zstring0)) { // 인증 후 okcert3log.no와 sn 값으로 인증된 결과값 가져오기 string decStr = DecString(u.zstring0); string[] tempArr = decStr.Split(','); string gubn = tempArr[2]; ViewBag.reason = tempArr[3]; ViewBag.rsltCd = tempArr[4]; string certiOkData = Dao.Get("sys.okcert3.get", new Hashtable { { "no", tempArr[0] }, { "sn", tempArr[1] } }).FirstOrDefault(); JObject data = JObject.FromObject(JsonConvert.DeserializeObject(certiOkData)); // 인증 후 강제로 수정된 정보를 인증 정보로 대체하기 u.username = data["RSLT_NAME"].ToString(); u.ci = data["CI"].ToString(); u.di = data["DI"].ToString(); u.birthday = data["RSLT_BIRTHDAY"].ToString(); if(gubn == "MOBI") { u.mobile = data["TEL_NO"] == null ? "" : data["TEL_NO"].ToString(); } u.vssn = data["VSSN"] == null ? "" : data["VSSN"].ToString(); u.uip = GetUserIP(); //이메일, 아이디 중복 체크 var u129 = Dao.Get("users.checkuser", new Hashtable() { { "userid", u.userid }, { "email", u.email }, { "mobile", u.mobile } }).First(); if (u129 != 9) { return JsonOK(u129 * -1); } u.userpass = NP.Base.Lib.KISA_SHA256.SHA256Hash(u.userpass.Trim()); u.birthday = u.birthday != null && u.birthday.Length == 8 ? (u.birthday ?? "").Substring(0, 4) + "-" + (u.birthday ?? "").Substring(4, 2) + "-" + (u.birthday ?? "").Substring(6, 2) : null; u.usertype = u.status = 1; Dao.Insert("users.in", u); return JsonOK(u.userno); } else { return JsonOK(0); } } [HttpPost] public JsonResult FindMe(String email) { if (string.IsNullOrEmpty(email)) { return JsonOK(-1); } email = email.Replace(" ", "").Replace(" ", ""); List users = new List() { }; bool IsEmail = false; if (email.Contains("@")) { IsEmail = true; users = Dao.Get("users.findme", new Hashtable() { { "email", email } }).ToList(); if(users.Count() < 1) { // user 테이블 검색 뒤 없을 경우 휴면테이블에서 검색 users = Dao.Get("users.findmes", new Hashtable() { { "email", email } }).ToList(); } } if (users.Count() != 1) { //검색결과 2개 개정이라면 보내면 안됨..다른사람일 수도 return JsonOK(-1); } var user = users.First(); //메시지 전송시간 기록 Random r = new Random(); int pwcallno = r.Next(1, 30000); Dao.Save("users.pwcalltime", new Hashtable() { { "userno", user.userno }, { "pwcallno", pwcallno } }); var masteremail = GetConfig("masteremail"); String fronturl = GetConfig("fronturl"); if (IsEmail && users.Count == 1) { var MHtml = $"안녕하세요, {user.username}님,
당신의 영남건설기술교육원 비밀번호를 재설정하기 위한 링크를 전달합니다.
" + $"아래 링크를 클릭하셔서 비밀번호를 재설정해주세요.

" + $"비밀번호 재설정

이 링크는 24시간 뒤 만료됩니다."; var mailResult = SendEmail(masteremail.Split(';')[1], GetInt(masteremail.Split(';')[2]), masteremail.Split(';')[3], masteremail.Split(';')[4], 999, user.email, masteremail.Split(';')[0], "영남건설기술교육원 운영자", "[영남건설기술교육원] 비밀번호 찾기 안내", MHtml, "", "0:0"); return JsonOK(mailResult); } else { return JsonOK(0); } } [HttpPost] public JsonResult FindMeFinal(VMUser vm) { if (vm.userno > 0 && vm.pwcallno > 0 && !string.IsNullOrEmpty(vm.User.userpass) && vm.User.userpass.Trim() != "") { if (Dao.Save("users.resetuser", new Hashtable() { { "userpass", NP.Base.Lib.KISA_SHA256.SHA256Hash(vm.User.userpass) }, { "userno", vm.userno }, { "pwcallno", vm.pwcallno } }) == 1) { //자동로그인처리 var u = GoLogin(vm.User.userid, vm.User.userpass); if (u != null) { return JsonOK(1); } } } return JsonOK(0); } [HttpPost] public JsonResult MyPageLeftMenu(String on) { CookieSet("mypageleftmenutoggle", on); return JsonOK(1); } [HttpPost] public JsonResult CRoomPageLeftMenu(String on) { CookieSet("croompageleftmenutoggle", on); return JsonOK(1); } [HttpPost] public JsonResult IsAuth() { if (SUserInfo.UserNo > 0) { return JsonOK(1); } return JsonOK(0); } [HttpPost] /// 반환값이 100일때 플레이바 및 다음페이지이동 허용 public JsonResult PRGRS(Int64 lectno, Int64 cmino) { if (SUserInfo.UserNo > 0) { try { return Json(Dao.Get("cr.getprogress", new Hashtable() { { "lectno", lectno }, { "cmino", cmino } }).First(), JsonRequestBehavior.AllowGet); } catch (Exception ex) { Console.WriteLine(ex.Message); } } return Json(-1, JsonRequestBehavior.AllowGet); } [HttpPost] public JsonResult StudyLog(Int64 logno, Int64 lectno, Int64 cmino, int cpno, int studysec, int ispc, int nextcpno, int getiframe, int issample = 0, int psec = 0) { if (SUserInfo.UserNo > 0 || issample > 0) { int rtn = 0; if (issample < 1) { rtn = Dao.Save("cr.studylog", new Hashtable() { { "logno", logno }, { "lectno", lectno }, { "cmino", cmino },{ "userno",SUserInfo.UserNo}, {"psec", psec }, { "cpno", cpno }, { "studysec", studysec }, { "ispc", ispc }, {"uno", SUserInfo.UserNo },{"uip",GetUserIP() } }); } if (nextcpno > 0) { String ua = ""; try { ua = (Request.UserAgent ?? "").ToLower(); } catch (Exception ex) { Logger.Error("ExamStart Get UserAgent Info Error" + ex.StackTrace); } var lip = new LectInningPage() { lectno = lectno, cmino = cmino, cpno = nextcpno, userno = SUserInfo.UserNo, uno = SUserInfo.UserNo, uip = GetUserIP(), ispc = ispc, webkitinfo = ua }; if (issample < 1) { Dao.Insert("cr.lectinningpage.in", lip); if (lip.logno < 1 || getiframe == 0) { return JsonOK(lip.logno); } } return JsonBack(new JsonRtn() { code = 1000, msg = Dao.Get("cr.ctpage.iframe", new Hashtable() { { "cpno", nextcpno }, { "src", ispc > 1 ? "srcp" : "srcm" } }).First(), obj = lip.logno }); } return JsonOK(rtn); } else { return JsonOK(0); } } [HttpPost] public JsonResult StudyClose(Int64 logno, int issample = 0) { if (SUserInfo.UserNo > 0 || issample > 0) { int rtn = 0; if (issample < 1) { rtn = Dao.Save("cr.studyclose", new Hashtable() { { "logno", logno }, {"uno", SUserInfo.UserNo },{"uip",GetUserIP() } }); } return JsonOK(rtn); } else { return JsonOK(0); } } [HttpPost] public JsonResult checklectdate(Int64 lectno) { Lect lect = Dao.Get("cr.checklectdate", new Hashtable() { { "lectno", lectno } }).First(); if (DateTime.Now <= lect.edate) //lect.수강종료일 이후 클릭시, 학습만 허용하나 로그는 쌓지 않음 return Json(new { result = 1 }); else return Json(new { result = -1 }); } [HttpPost] public JsonResult StudyLogMid(Int64 lectno, Int64 cmino) { if (SUserInfo.UserNo > 0) { return JsonOK(Dao.Save("cr.studymid", new Hashtable() { { "lectno", lectno }, { "cmino", cmino } })); } return JsonOK(0); } [HttpPost] public JsonResult CheckInningChange(Int64 lectno, Int64 cmino, bool ispre) { if (SUserInfo.UserNo > 0) { var cmi = Dao.Get("cr.inningchange." + (ispre ? "pre" : "next"), new Hashtable() { { "lectno", lectno }, { "cmino", cmino } }).FirstOrDefault(); if (cmi == null) { return JsonBack(new JsonRtn() { code = 1000, obj = -1 }); } else if (cmi.iseq > 1 && cmi.precmino > 0 && cmi.isseq == 1 && cmi.preistatus != 2) { return JsonBack(new JsonRtn() { code = 1000, obj = -2 }); } else { var intval = Dao.Get("cr.lectinnings", new System.Collections.Hashtable() { /*{ "lectno", lectno }*/ { "userno",SUserInfo.UserNo}, { "isfinishtoday", 1 } }).Count(); if (intval > Convert.ToInt32((GetConfig("inninglimit") ?? "10")) && cmi.istatus < 2) { return JsonBack(new JsonRtn() { code = 1000, obj = -3 }); } } return JsonOK(cmi.cmino); } return JsonOK(0); } [HttpPost] public JsonResult idchk(String id) { //이메일, 아이디 중복 체크 var u129 = Dao.Get("users.usersbyuserids", new Hashtable() { { "userids", "'"+id+"'" },{"usertype",1} }); if (u129.Count() > 0) { return JsonOK(-1); } return JsonOK(1); } [HttpPost] public JsonResult GetSubCm(int cmno, int? studyplace = null) { //20220726 소스 정리 Hashtable hsData = new Hashtable(); hsData.Add("cmno", cmno); hsData.Add("studyplace", studyplace); var result = Dao.Get("cm.subcms", hsData).Where(w => w.isuse == 1).ToList(); //var result = Dao.Get("cm.subcms", new System.Collections.Hashtable() { { "cmno", cmno }, { "studyplace", studyplace } }).Where(w => w.isuse == 1).ToList(); return JsonBack(result); } [HttpPost] public JsonResult GetCmUser(int cmno) { var comcodes = GetComCodes("typeman,typeedu,typegrade,typejob", true); var result = Dao.Get("cm.cmuser", new System.Collections.Hashtable() { { "cmno", cmno } }); foreach (var r in result) { string[] typemanArr = r.typeman.Split(','); for (int i = 0; i < typemanArr.Length; i++) { r.typemans += comcodes.Where(x => x.cgroup == "typeman" && x.ccode == Convert.ToInt32(typemanArr[i])).FirstOrDefault().cname; if (i < typemanArr.Length -1) r.typemans += ","; } string[] typeeduArr = r.typeedu.Split(','); for (int i = 0; i < typeeduArr.Length; i++) { r.typeedus += comcodes.Where(x => x.cgroup == "typeedu" && x.ccode == Convert.ToInt32(typeeduArr[i])).FirstOrDefault().cname; if (i < typeeduArr.Length - 1) r.typeedus += ","; } string[] typegradeArr = r.typegrade.Split(','); for (int i = 0; i < typegradeArr.Length; i++) { r.typegrades += comcodes.Where(x => x.cgroup == "typegrade" && x.ccode == Convert.ToInt32(typegradeArr[i])).FirstOrDefault().cname; if (i < typegradeArr.Length - 1) r.typegrades += ","; } string[] typejobArr = r.typejob.Split(','); for (int i = 0; i < typejobArr.Length; i++) { r.typejobs += comcodes.Where(x => x.cgroup == "typejob" && x.ccode == Convert.ToInt32(typejobArr[i])).FirstOrDefault().cname; if (i < typejobArr.Length - 1) r.typejobs += ","; } } return JsonBack(result); } [HttpPost] public JsonResult GetScdForMixEdu(int cmno,int? lectno, int? month, int? studyPlace) { Hashtable hsData = new Hashtable(); hsData.Add("cmno", cmno); hsData.Add("lectno", lectno); hsData.Add("month", month); hsData.Add("studyplace", studyPlace); var result = Dao.Get("cm.cminningscds.applyedu" + (lectno != null ? ".lectno" : ""), hsData); IList result2 = new List(); if (result.Count() > 0) { long cmino = result.First().cmino; result2 = Dao.Get("cm.cminningscds.attr2Check", new System.Collections.Hashtable() { { "cmno", cmno }, { "cmino", cmino } }); } hsData.Clear(); hsData.Add("cmno", cmno); var resultTmp = Dao.Get("cm.cms", hsData).FirstOrDefault(); //var result = Dao.Get("cm.cminningscds.applyedu"+(lectno != null ? ".lectno" : ""), new System.Collections.Hashtable() { { "cmno", cmno },{"lectno",lectno }, { "month", (month == null) ? null : month } }); DateTime now = DateTime.Now; result = result.Where(c => c.estart > now.AddYears(-1) && c.estart < now.AddYears(1) && c.estart > now.AddDays(2)).ToList(); foreach (var item in result) { //item.scdInfoSummary = string.Format("[{0}] {1}", item.studyplacename, item.estart.ToString("yyyy년 MM월 dd일 ddd요일 HH:mm")); //item.scdInfoSummary = string.Format("{0}", item.estart.ToString("yyyy년 MM월 dd일까지")); if (resultTmp.cshape == 1) { item.scdInfoSummary = string.Format("{0} ~ {1}", item.estart.ToString("yyyy년 MM월 dd일"), item.eend.ToString("MM월 dd일")); } else { //item.scdInfoSummary = string.Format("{0}", item.estart.ToString("yyyy년 MM월 dd일까지")); item.scdInfoSummary = string.Format("{0}", item.estart.ToString("yyyy년 MM월 dd일")); } if (item.estart < Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"))) item.isEnd = true; if (result2.Count() > 0) { item.intv1 = result2.Where(c => c.cmino == item.cmino && c.cmisno == item.cmisno && c.intv1 == 2).Count(); item.remainPeople += item.intv1; } } return JsonBack(result); } /// /// 마이페이지 > 교육일정변경 (2025-12-09 / KHJ / 강좌 시작일 기준으로 교육일정리스트 출력) /// /// /// /// /// /// /// [HttpPost] public JsonResult GetMyScdForMixEdu(int cmno, int? lectno, int? month, int? studyPlace) { Hashtable hsData = new Hashtable(); hsData.Add("cmno", cmno); hsData.Add("lectno", lectno); hsData.Add("month", month); hsData.Add("studyplace", studyPlace); hsData.Add("my", "my"); //var result = Dao.Get("cm.cminningscds.applyedu" + (lectno != null ? ".lectno" : ""), hsData); //2025-12-16 / KHJ / 별도 쿼리로... var result = Dao.Get("cm.cminningscds.applyedu.my", hsData); IList result2 = new List(); if (result.Count() > 0) { long cmino = result.First().cmino; result2 = Dao.Get("cm.cminningscds.attr2Check", new System.Collections.Hashtable() { { "cmno", cmno }, { "cmino", cmino } }); } hsData.Clear(); hsData.Add("cmno", cmno); var resultTmp = Dao.Get("cm.cms", hsData).FirstOrDefault(); //var result = Dao.Get("cm.cminningscds.applyedu"+(lectno != null ? ".lectno" : ""), new System.Collections.Hashtable() { { "cmno", cmno },{"lectno",lectno }, { "month", (month == null) ? null : month } }); DateTime now = (DateTime)resultTmp.rstime; //result = result.Where(c => c.estart > now.AddYears(-1) && c.estart < now.AddYears(1) && c.estart > now.AddDays(2)).ToList(); foreach (var item in result) { //item.scdInfoSummary = string.Format("[{0}] {1}", item.studyplacename, item.estart.ToString("yyyy년 MM월 dd일 ddd요일 HH:mm")); //item.scdInfoSummary = string.Format("{0}", item.estart.ToString("yyyy년 MM월 dd일까지")); if (resultTmp.cshape == 1) { item.scdInfoSummary = string.Format("{0} ~ {1}", item.estart.ToString("yyyy년 MM월 dd일"), item.eend.ToString("MM월 dd일")); } else { //item.scdInfoSummary = string.Format("{0}", item.estart.ToString("yyyy년 MM월 dd일까지")); item.scdInfoSummary = string.Format("{0}", item.estart.ToString("yyyy년 MM월 dd일")); } if (item.estart < Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"))) item.isEnd = true; if (result2.Count() > 0) { item.intv1 = result2.Where(c => c.cmino == item.cmino && c.cmisno == item.cmisno && c.intv1 == 2).Count(); item.remainPeople += item.intv1; } } return JsonBack(result); } [HttpPost] public JsonResult GetCheckLectIsComplete(int cmno) { var result = Dao.Get("cm.lectcheckuser", new System.Collections.Hashtable() { { "userno", SUserInfo.UserNo },{ "cmno", cmno } }).First(); return JsonBack(result); } [HttpPost] /// ### ty 교육신청제한 public JsonResult GetCheckLectIs(string man, string cgcode, string edu, string grade, int cmno, int pcmno, string job1 = "") { //int result = 0; // 0 이면 수강 가능, 그외 수강 불가 //result = CheckUserLect(man, cgcode, edu, grade, cmno, pcmno, SUserInfo.UserNo); #region + // 2025-09 (스마트검색 개발 건 미사용으로 주석처리, 필요시 복원) var result = new KeyValuePair(); result = CheckUserLectInfo(cmno, pcmno, SUserInfo.UserNo, man, cgcode, edu, grade, job1); return JsonBack(result.Key); #endregion //return JsonBack(result); } #region + 이건 과거로직이다 아마도 앞으로 사용하지 않을 것 같다 // pms: 5640 적용 //public int CheckUserLect(string man, string cgcode, string edu, string grade, int cmno, int pcmno, long userno) //{ // int result = 0; // 1:신청불가, 0:신청가능 // int rst = 0; // string[] cgcodes = new string[0]; // string[] edus = new string[0]; // // 29:기본교육 ,30:최초교육 ,31:계속교육 ,32:안전관리계속교육(16시간) ,33:PQ가점교육 ,34:기타교육 ,35:승급교육 // // 36:초급 ,37:중급 ,38:고급 ,39:특급 // cgcodes = "102,103,104,105".Split(','); // 직무분야:(102), 역량강화:(103,104), 전문분야(105) // edus = "30,31,35".Split(','); // 최초교육, 계속교육, 승급교육 // // man == 28 : 건설사업관리기술인(typeman) // if (man == "28" && cgcodes.Contains(cgcode) && edus.Contains(edu)) // { // switch(cgcode) // { // case "102": // 직무분야 // if(edu == "35" && (grade == "38" || grade == "39")) // 승급교육 && (고급 || 특급) // { // // '(역량강화 또는 전문분야) + 직무분야' 조건에 의하여 직무분야 1건이상 신청불가 // rst = Dao.Get("lect.count.user6", new Hashtable() { { "userno", userno }, { "pcmno", pcmno } }).First(); // } // break; // case "103": // 역량강화 // case "104": // switch (edu) // { // case "30": // 최초교육 // // 1건이상 신청불가 // rst = Dao.Get("lect.count.user5", new Hashtable() { { "userno", userno }, { "cgcode", cgcode }, { "edu", edu }, { "grade", grade }, { "cmno", cmno }, { "pcmno", pcmno } }).First(); // break; // case "31": // 계속교육 // if(grade == "36" || grade == "37") // 초급 || 중급 // { // result = 1; // 신청불가 // } // // 그외는 제한 없음 // break; // case "35": // 승급교육 // if(grade == "38" || grade == "39") // { // // '(역량강화 또는 전문분야) + 직무분야' 조건에 의하여 역량강화 또는 전문분야중 1건이상 신청불가 // rst = Dao.Get("lect.count.user6", new Hashtable() { { "userno", userno }, { "pcmno", pcmno } }).First(); // } // // 그외는 제한 없음 // break; // } // break; // case "105": // 전문분야 // switch(edu) // { // case "30": // 최초교육 // result = 1; // 신청불가 // break; // case "31": // 계속교육 // if (grade == "36" || grade == "37") // 초급 || 중급 // { // result = 1; // 신청불가 // } // // 그외는 제한 없음 // break; // case "35": // 승급교육 // if (grade == "36" || grade == "37") // 초급 || 중급 // { // result = 1; // 신청불가 // } // else // { // // '(역량강화 또는 전문분야) + 직무분야' 조건에 의하여 역량강화 또는 전문분야중 1건이상 신청불가 // rst = Dao.Get("lect.count.user6", new Hashtable() { { "userno", userno }, { "pcmno", pcmno } }).First(); // } // break; // } // break; // } // } // if (result == 0) // { // //-1= 짧은문구, smartSearch에서 오류중 짧은문구 처리할 경우 -1를 곱하여 0이하값 만들어야함 // result = rst == 0 ? 0 : ((rst > 0) ? 1 : -1); // // } // return result; //} #endregion #region + 2025-09 (스마트검색 개발 건 미사용으로 주석처리, 필요시 복원) // 본문에 주석이 너무많아 주석처리는 아니고 그냥 미사용 // FO > CourseController.CheckUserLect, FOCommonController.CheckUserLect 동일한 코드 (Dao문제로 2개구현, 공통이나, 서비스로 뺴야한다) /// /// 수강 제약조건 확인 (FO > CourseController.CheckUserLect 와 동일, 함께 수정해야함 => Dao문제로 2개구현) /// /// 강좌키 /// 연계강좌키 /// 회원번호 /// 기술인분류 /// /// 교육목적 /// 등급 /// Code (0:수강가능, -2,동일한과정 재신청 제약, -10:최초교육제약, -20:승급교육제약, -100:에러) , Message public KeyValuePair CheckUserLectInfo(int cmno, int pcmno, long userno, string man, string cgcode, string edu, string grade, string job1 = "") { var result = new KeyValuePair(0, "수강신청 가능"); #region + DB에서 코드 값 찾기 /***************************************************************************************************** * a) 기술인분류 SELECT * FROM comcode WHERE cgroup = 'typeman' AND isUse = 1 * b) 과정분류 SELECT * FROM cg WHERE isUse = 1 * c) 교육목적 SELECT * FROM comcode WHERE cgroup = 'typeedu' AND isUse = 1 * d) 등급 SELECT * FROM comcode WHERE cgroup = 'typegrade' AND isUse = 1 * e) 직무분야 SELECT * FROM comcode WHERE cgroup = 'typejob' AND isUse = 1 * f) 직무분야 전체 SELECT * FROM comcode WHERE cgroup LIKE 'typejob%' AND isUse = 1 *******************************************************************************************************/ #endregion // result (0:수강가능, 이 외 수강불가) try { #region + (탈출) 1. 건설사업관리기술인 관련 제한 조건 (lectEnrolls 참조하지 않음, Request 값만...) // 조건: 건설사업관리기술인(28) + 초급/중급(36,37) + 역량강화(103,104) 은 신청불가 if (edu == "31") { bool isRestrictedContinueEdu = man == "28" && (grade == "36" || grade == "37") && (cgcode == "103" || cgcode == "104"); if (isRestrictedContinueEdu) { return new KeyValuePair(-30, "계속교육 제약"); } } #endregion #region + Get: lect.enroll.get (lectEnrolls = 회원 수강신청 내역) var p = new Hashtable(); p.Add("uno", userno); IList lectEnrolls = Dao.Get("lect.enroll.get", p); #endregion // 회원의 이전 수강신청내역이 있다면 if (lectEnrolls != null && lectEnrolls.Any()) { #region + (탈출) 2. 동일한 과정은 1개만 수강 가능 (cm.cmno) if (lectEnrolls.Any(l => l.cmno == cmno)) { // -2는 동일 과정 중복 return new KeyValuePair(-2, "동일강좌 중복제약"); } #endregion #region + (탈출) 3. 교육목적 -> 기본교육(29) 관련 제한 조건 if (edu == "29") { // 기존 신청 내역 중 기본교육(29)이 있는지 확인 (기본교육은 1개만 신청가능) bool hasExistingBasicEdu = lectEnrolls.Any(l => l.TYPEEDU == 29); if (hasExistingBasicEdu) { return new KeyValuePair(-30, "기본교육 제약"); } } #endregion #region + (탈출) 4. 교육목적 -> 최초교육(30) 관련 제한 조건 // - 최초교육(30)의 기술인분류(25,27,28)가 과정분류 역량강화(103,104)인 최초교육은 1개만 신청 가능. if (edu == "30") { // 1) 현재 신청하는 교육이 제한 대상인지 확인 bool isApplyingForRestrictedFirstEdu = (man == "25" || man == "27" || man == "28") && (cgcode == "103" || cgcode == "104"); if (isApplyingForRestrictedFirstEdu) { // 2) 이미 신청 내역 중에 제한 대상에 해당하는 최초교육이 있는지 확인 bool hasExistingRestrictedFirstEdu = lectEnrolls.Any(l => l.TYPEEDU == 30 && (l.TYPEMAN == 25 || l.TYPEMAN == 27 || l.TYPEMAN == 28) && (l.CGCODE == "103" || l.CGCODE == "104") ); // 조건을 만족하는 기존 교육이 발견되면, 중복신청 막기 처리 if (hasExistingRestrictedFirstEdu) { return new KeyValuePair(-10, "최초교육 제약"); } } } //if (edu == "30") //{ // // 1) 현재 신청하는 교육이 제한 대상인지 확인 // bool isApplyingForRestrictedFirstEdu = // (man == "25" || man == "27" || man == "28") // && (cgcode == "103" || cgcode == "104"); // if (isApplyingForRestrictedFirstEdu) // { // // 2) 이미 신청 내역 중에 제한 대상에 해당하는 최초교육이 있는지 확인 // bool hasExistingRestrictedFirstEdu = lectEnrolls.Any(l => // l.TYPEEDU == 30 // && (l.TYPEMAN == 25 || l.TYPEMAN == 27 || l.TYPEMAN == 28) // && (l.CGCODE == "107") // ); // // 조건을 만족하는 기존 교육이 발견되면, 중복신청 막기 처리 // if (hasExistingRestrictedFirstEdu) // { // return new KeyValuePair(-10, "최초교육 제약"); // } // } //} #endregion #region + (탈출) 5. 교육목적 -> 승급교육(35) 관련 제한 조건 // 승급교육(35) 관련 제한 조건 (A, B, C, D 그룹) if (edu == "35") //교육목적 { // 제약의 공통 전제조건: 고급(38) 또는 특급(39) 등급인 경우에만 적용 bool isAdvancedGrade = grade == "38" || grade == "39"; if (isAdvancedGrade) { // A: 동일 등급, 동일 직무분야 내에서 1개만 신청 가능 // ((설계시공 또는 건설사업관리) / (역량강화(103,104) 또는 전문분야(105))) bool isApplyingForGroupA = (man == "25" || man == "28") && (cgcode == "103" || cgcode == "104" || cgcode == "105"); if (isApplyingForGroupA) { //설계시공기술인 bool hasExistingInGroupA25 = lectEnrolls.Any(l => l.TYPEEDU == 35 //승급교육 && (l.TYPEGRADE.ToString() == grade) && l.TYPEJOB.ToString() == job1 && ( (l.TYPEMAN.ToString() == "25") && (l.CGCODE == "103" || l.CGCODE == "104" || l.CGCODE == "105") ) ); if (hasExistingInGroupA25) { return new KeyValuePair(-20, "승급교육 제약A"); } //건설사업관리기술인 bool hasExistingInGroupA28 = lectEnrolls.Any(l => l.TYPEEDU == 35 //승급교육 && (l.TYPEGRADE.ToString() == grade) && l.TYPEJOB.ToString() == job1 && ( (l.TYPEMAN.ToString() == "28") && (l.CGCODE == "103" || l.CGCODE == "104" || l.CGCODE == "105") ) ); if (hasExistingInGroupA28) { return new KeyValuePair(-20, "승급교육 제약A"); } } bool isApplyingForGroupA2 = (man == "25" || man == "28") && (cgcode == "105"); if (isApplyingForGroupA2) { bool hasExistingInGroupA2 = lectEnrolls.Any(l => l.TYPEEDU == 35 && l.TYPEGRADE.ToString() == grade && l.TYPEJOB.ToString() == job1 && ( (l.TYPEMAN.ToString() == "25" || l.TYPEMAN.ToString() == "28") && (l.CGCODE == "105") ) ); if (hasExistingInGroupA2) { return new KeyValuePair(-20, "승급교육 제약A"); } } //bool isApplyingForGroupA3 = (man == "25" || man == "28") && (cgcode == "107"); /*bool isApplyingForGroupA3 = man == "25" || man == "28"; if (isApplyingForGroupA3) { bool hasExistingInGroupA3 = lectEnrolls.Any(l => l.TYPEEDU == 35 && l.TYPEGRADE.ToString() == grade && l.TYPEJOB.ToString() == job1 && ( (l.TYPEMAN.ToString() == "25" || l.TYPEMAN.ToString() == "28") ) ); if (hasExistingInGroupA3) { return new KeyValuePair(-20, "승급교육 제약A"); } }*/ // B: 동일 등급, 동일 직무분야 내에서 1개만 신청 가능 // ((설계시공/특성화) 또는 (건설사업관리/전문분야)) //bool isApplyingForGroupB = (man == "25" && cgcode == "107") || (man == "28" && cgcode == "105"); bool isApplyingForGroupB = man == "28" && cgcode == "105"; if (isApplyingForGroupB) { bool hasExistingInGroupB = lectEnrolls.Any(l => l.TYPEEDU == 35 && l.TYPEGRADE.ToString() == grade && l.TYPEJOB.ToString() == job1 && ( l.TYPEMAN.ToString() == "28" && l.CGCODE == "105" ) ); if (hasExistingInGroupB) { return new KeyValuePair(-20, "승급교육 제약B"); } } // C: 등급, 동일 직무분야 내에서 1개만 신청 가능 // ((설계시공/특성화) 또는 (건설사업관리/역량강화)) //bool isApplyingForGroupC = (man == "25" && cgcode == "107") || (man == "28" && (cgcode == "103" || cgcode == "104")); bool isApplyingForGroupC = man == "28" && (cgcode == "103" || cgcode == "104"); if (isApplyingForGroupC) { bool hasExistingInGroupC = lectEnrolls.Any(l => l.TYPEEDU == 35 && l.TYPEGRADE.ToString() == grade && l.TYPEJOB.ToString() == job1 && ( l.TYPEMAN.ToString() == "28" && (l.CGCODE == "103" || l.CGCODE == "104") ) ); if (hasExistingInGroupC) { return new KeyValuePair(-20, "승급교육 제약C"); } } // D: 동일 등급, 동일 직무분야 내에서 1개만 신청 가능 // ((건설사업관리/건설기술인 전문교육)) bool isApplyingForGroupD = man == "28" && cgcode == "102"; if (isApplyingForGroupD) { bool hasExistingInGroupD = lectEnrolls.Any(l => l.TYPEEDU == 35 && l.TYPEGRADE.ToString() == grade && l.TYPEJOB.ToString() == job1 && (l.TYPEMAN.ToString() == "28" && l.CGCODE == "102") ); if (hasExistingInGroupD) { return new KeyValuePair(-20, "승급교육 제약D"); } } } } #endregion } else { // 이전에 수강 신청한 내역이 아무것도 없기에 제약조건을 걸 필요가 없음. result = new KeyValuePair(0, "이전에 아무것도 수강신청한 내역이 없음"); } } catch (Exception ex) { SetError($"CheckUserLectInfo: {ex.Message}"); result = new KeyValuePair(-100, ex.Message); } return result; } #endregion public int CheckUserLect(string man, string cgcode, string edu, string grade, int cmno, int pcmno, long userno) { int result = 0; int rst = 0; string[] cgcodes = new string[0]; string[] edus = new string[0]; // 실제로직은 ELSE절이다. if (DateTime.Now > DateTime.Parse("2099-01-02 00:00"))// ### ty 2024년 추가건이나 현재 적용대기로 전달 받음 { // ### ty 2024년 적용!!! // 29:기본교육 ,30:최초교육 ,31:계속교육 ,32:안전관리계속교육(16시간) ,33:PQ가점교육 ,34:기타교육 ,35:승급교육 // 36:초급 ,37:중급 ,38:고급 ,39:특급 cgcodes = "103,104,105".Split(','); edus = "30,31,35,107,108".Split(','); // 최초교육, 계속교육, 승급교육 // man == 28 : 건설사업관리기술인(typeman) if (man == "28" && cgcodes.Contains(cgcode) && edus.Contains(edu)) { // 계속교육(31) if ((edu == "31" || edu == "107" || edu == "108") && (cgcode == "103" || cgcode == "104" || cgcode == "105") && (grade == "36" || grade == "37")) // 계속교육, (103 or 104 or 105), (초급 or 중급) { result = 1; // 신청불가 } // 계속교육(31) else if ((edu == "31" || edu == "107" || edu == "108") && (cgcode == "103" || cgcode == "104" || cgcode == "105") && (grade == "38" || grade == "39")) // 계속교육, (103 or 104 or 105), (고급 or 특급) { rst = 0; // 신청가능 } // 최초교육(30) else if (edu == "30" && cgcode == "105") // 최초교육, 전문분야(105) { result = 1; // 신청불가 } // 승급교육(35) else if (edu == "35" && cgcode == "105" && (grade == "36" || grade == "37")) // 최초교육, 전문분야(105), 36:초급 ,37:중급 { result = 1; // 신청불가 }// 승급교육(35) else if (edu == "35" && (cgcode == "103" || cgcode == "104") && (grade == "36" || grade == "37")) // 승급교육 , 103,104, 36:초급 ,37:중급 { rst = 0; // 신청가능 } else { // 갯수를 가져오기 /* * 기본 설계 쿼리 select t5.typegrade, t5.typeman, t5.typeedu, t3.cgcode, t1.lectno, t1.userno from lect t1 inner join cm t2 on t1.cmno = t2.cmno inner join cg t3 on t2.cgno= t3.cgno inner join pay t4 on t1.payno = t4.payno inner join pplog t5 on t1.cmno= t5.cmno and t1.userno = t5.userno and t4.pplno = t5.pplno where t1.status = 1 and t4.pstatus= 1 and t3.cgcode = 103 -- and t1.userno=82 -- 82,5,31 // 29:기본교육 ,30:최초교육 ,31:계속교육 ,32:안전관리계속교육(16시간) ,33:PQ가점교육 ,34:기타교육 ,35:승급교육 // 36:초급 ,37:중급 ,38:고급 ,39:특급 */ // "lect.count.user2" > 103,104,105 // "lect.count.user3" > 103,104 // 최초교육(30) , (103,104), if (edu == "30" && (cgcode == "103" || cgcode == "104")) { var lectCount = Dao.Get("lect.count.user3", new Hashtable() { { "userno", userno }, { "cgcode", cgcode }, { "edu", edu }, { "grade", grade }, { "cmno", cmno }, { "pcmno", pcmno } }); rst = lectCount.First(); } // 승급교육(35), 38:고급 ,39:특급 else if (edu == "35" && (grade == "38" || grade == "39")) { var lectCount = Dao.Get("lect.count.user2", new Hashtable() { { "userno", userno }, { "cmno", cmno }, { "pcmno", pcmno } }); rst = lectCount.First(); } } } } else { // 29:기본교육 ,30:최초교육 ,31:계속교육 ,32:안전관리계속교육(16시간) ,33:PQ가점교육 ,34:기타교육 ,35:승급교육 // 36:초급 ,37:중급 ,38:고급 ,39:특급 cgcodes = "103,104,105".Split(','); edus = "30,31,35".Split(','); // 최초교육, 계속교육, 승급교육 // man == 28 : 건설사업관리기술인(typeman) if (man == "28" && cgcodes.Contains(cgcode) && edus.Contains(edu)) { // 계속교육(31) if (edu == "31" && (cgcode == "103" || cgcode == "104") && (grade == "36" || grade == "37")) // 계속교육, (103 or 104), (초급 or 중급) { result = 1; // 신청불가 } else { // 갯수를 가져오기 // 최초교육(30) if (edu == "30" && cgcode == "105") // 최초교육 , 105 { rst = 0; // 신청가능 } // 계속교육(31) else if (edu == "31" && cgcode == "105" && (grade == "36" || grade == "37")) // 계속교육, 105, (초급 or 중급) { rst = 0; // 신청가능 } // 승급교육(35) else if (edu == "35" && (cgcode == "103" || cgcode == "104" || cgcode == "105") && (grade == "36" || grade == "37")) // 승급교육, (103 or 104 or 105), (초급 or 중급) { rst = 0; // 신청가능 } else { /* * 기본 설계 쿼리 select t5.typegrade, t5.typeman, t5.typeedu, t3.cgcode, t1.lectno, t1.userno from lect t1 inner join cm t2 on t1.cmno = t2.cmno inner join cg t3 on t2.cgno= t3.cgno inner join pay t4 on t1.payno = t4.payno inner join pplog t5 on t1.cmno= t5.cmno and t1.userno = t5.userno and t4.pplno = t5.pplno where t1.status = 1 and t4.pstatus= 1 and t3.cgcode = 103 -- and t1.userno=82 -- 82,5,31 // 29:기본교육 ,30:최초교육 ,31:계속교육 ,32:안전관리계속교육(16시간) ,33:PQ가점교육 ,34:기타교육 ,35:승급교육 // 36:초급 ,37:중급 ,38:고급 ,39:특급 */ // "lect.count.user2" > 103,104,105 // "lect.count.user3" > 103,104 if ((edu == "31" || edu == "35") && (grade == "38" || grade == "39")) // 계속교육, 승급교육 && 고급, 특급 { var lectCount = Dao.Get("lect.count.user2", new Hashtable() { { "userno", userno }, { "cgcode", cgcode }, { "edu", edu }, { "grade", grade }, { "cmno", cmno }, { "pcmno", pcmno } }); rst = lectCount.First(); } else if ((cgcode == "103" || cgcode == "104") && edu == "30") // 최초 { var lectCount = Dao.Get("lect.count.user3", new Hashtable() { { "userno", userno }, { "cmno", cmno }, { "pcmno", pcmno } }); rst = lectCount.First(); } else { var lectCount = Dao.Get("lect.count.user", new Hashtable() { { "userno", userno }, { "cgcode", cgcode }, { "edu", edu }, { "cmno", cmno }, { "pcmno", pcmno } }); rst = lectCount.First(); } } } } } if (result == 0) { //-1= 짧은 문구 result = rst == 0 ? 0 : ((rst > 0) ? 1 : -1); // } return result; } public int CheckUserLectOld_backukp241007(string man, string cgcode, string edu, string grade, int cmno, int pcmno, long userno) { int result = 0; int rst = 0; string[] cgcodes = new string[0]; string[] edus = new string[0]; // 29:기본교육 ,30:최초교육 ,31:계속교육 ,32:안전관리계속교육(16시간) ,33:PQ가점교육 ,34:기타교육 ,35:승급교육 // 36:초급 ,37:중급 ,38:고급 ,39:특급 cgcodes = "103,104,105".Split(','); edus = "30,31,35".Split(','); // 최초교육, 계속교육, 승급교육 // man == 28 : 건설사업관리기술인(typeman) if (man == "28" && cgcodes.Contains(cgcode) && edus.Contains(edu)) { // 계속교육(31) if (edu == "31" && (cgcode == "103" || cgcode == "104") && (grade == "36" || grade == "37")) // 계속교육, (103 or 104), (초급 or 중급) { result = 1; // 신청불가 } else { // 갯수를 가져오기 // 최초교육(30) if (edu == "30" && cgcode == "105") // 최초교육 , 105 { rst = 0; // 신청가능 } // 계속교육(31) else if (edu == "31" && cgcode == "105" && (grade == "36" || grade == "37")) // 계속교육, 105, (초급 or 중급) { rst = 0; // 신청가능 } // 승급교육(35) else if (edu == "35" && (cgcode == "103" || cgcode == "104" || cgcode == "105") && (grade == "36" || grade == "37")) // 승급교육, (103 or 104 or 105), (초급 or 중급) { rst = 0; // 신청가능 } else { /* * 기본 설계 쿼리 select t5.typegrade, t5.typeman, t5.typeedu, t3.cgcode, t1.lectno, t1.userno from lect t1 inner join cm t2 on t1.cmno = t2.cmno inner join cg t3 on t2.cgno= t3.cgno inner join pay t4 on t1.payno = t4.payno inner join pplog t5 on t1.cmno= t5.cmno and t1.userno = t5.userno and t4.pplno = t5.pplno where t1.status = 1 and t4.pstatus= 1 and t3.cgcode = 103 -- and t1.userno=82 -- 82,5,31 // 29:기본교육 ,30:최초교육 ,31:계속교육 ,32:안전관리계속교육(16시간) ,33:PQ가점교육 ,34:기타교육 ,35:승급교육 // 36:초급 ,37:중급 ,38:고급 ,39:특급 */ // "lect.count.user2" > 103,104,105 // "lect.count.user3" > 103,104 if ((edu == "31" || edu == "35") && (grade == "38" || grade == "39")) // 계속교육, 승급교육 && 고급, 특급 { var lectCount = Dao.Get("lect.count.user2", new Hashtable() { { "userno", userno }, { "cgcode", cgcode }, { "edu", edu }, { "grade", grade }, { "cmno", cmno }, { "pcmno", pcmno } }); rst = lectCount.First(); } else if ((cgcode == "103" || cgcode == "104") && edu == "30") // 최초 { var lectCount = Dao.Get("lect.count.user3", new Hashtable() { { "userno", userno }, { "cmno", cmno }, { "pcmno", pcmno } }); rst = lectCount.First(); } else { var lectCount = Dao.Get("lect.count.user", new Hashtable() { { "userno", userno }, { "cgcode", cgcode }, { "edu", edu }, { "cmno", cmno }, { "pcmno", pcmno } }); rst = lectCount.First(); } } } } if (result == 0) { //-1= 짧은 문구 result = rst == 0 ? 0 : ((rst > 0) ? 1 : -1); // } return result; } /// /// 교육신청 제한 해제시 GetCheckLectIs_stay를 GetCheckLectIs로 변경하여 반영한다. /// /// /// /// /// /// /// /// public JsonResult GetCheckLectIs_stay(string man, string cgcode, string edu, string grade, int cmno, int pcmno) { int result = 0; // 0 이면 수강 가능, 그외 수강 불가 return JsonBack(result); } /// /// 수강신청시 가능인원 체크하기 /// 20220803 /// /// /// [HttpPost] public JsonResult CheckQtyScd(int cmno, int cmino, int cmisno) { var pass = Dao.Get("cm.cminningscdcheck", new System.Collections.Hashtable() { { "cmisno", cmisno }}).First(); IList result2 = Dao.Get("cm.cminningscds.attr2Check", new System.Collections.Hashtable() { { "cmno", cmno }, { "cmino", cmino }, { "cmisno", cmisno } }); if(result2.Count() > 0) { int addPass = result2.Where(c => c.intv1 == 2).Count(); pass += addPass; } if (pass == 0) { return JsonBack(new JsonRtn() { code = 0, msg = "해당 일정은 모집 인원이 마감되었습니다." }); } else if (pass > 0) { return JsonBack(new JsonRtn() { code = 1000, msg = "" }); } return JsonBack(new JsonRtn() { code = -1, msg = "개발자에게 문의하세요." }); } /// /// /// /// /// /// [HttpPost] public JsonResult UpdateScd(int cmno, int cmino, int cmisno, int lectno) { var pass = Dao.Get("cm.cminningscdcheck", new System.Collections.Hashtable() { { "cmisno", cmisno } }).First(); IList result2 = new List(); result2 = Dao.Get("cm.cminningscds.attr2Check", new System.Collections.Hashtable() { { "cmno", cmno }, { "cmino", cmino } }); if (result2.Count() > 0) { int tempInt = result2.Where(c => c.cmino == cmino && c.cmisno == cmisno && c.intv1 == 2).Count(); pass += tempInt; } if (pass == 0) return JsonBack(new JsonRtn() { code = 0, msg = "해당 일정은 모집 인원이 마감되었습니다." }); else if (pass > 0) { Dao.Save("cm.lectcmisno.up" , new System.Collections.Hashtable() { { "cmisno", cmisno }, { "lectno", lectno }, { "uno", SUserInfo.UserNo }, { "uip", GetUserIP() } }); return JsonBack(new JsonRtn() { code = 1, msg = "일정을 변경하였습니다." }); } return JsonBack(new JsonRtn() { code = -1, msg = "개발자에게 문의하세요." }); } [HttpPost] public JsonResult CheckExistSnsId(string snsid, int jointype) { var result = Dao.Get("users.check.snsid", new Hashtable() { { "snsid", snsid }, { "jointype", jointype } }).Count(); if (result > 0) { return JsonBack(new JsonRtn() { code = 1 }); } else { return JsonBack(new JsonRtn() { code = -1 }); } } [HttpPost] public JsonResult SnsLogin(String uid, bool isSns = false) { if (!string.IsNullOrEmpty(uid)) { var u = GoLogin(uid, "", isSns); if (u != null) { if (u.userno < 0) { return JsonBack(new JsonRtn() { code = 1000, obj = -1, msg = u.subdomain }); } return JsonOK(u.userno); } } return JsonOK(0); } [HttpPost] public JsonResult SnsLink(String snsid, int jointype = 0) { try { if (string.IsNullOrEmpty(snsid) && jointype == 0) //SNS 연동을 해제 { Dao.Save("users.snslink.up", new System.Collections.Hashtable() { { "userno", SUserInfo.UserNo }, { "snsid", snsid }, { "jointype", jointype }, { "uno", SUserInfo.UserNo }, { "uip", GetUserIP() } }); return JsonBack(new JsonRtn() { code = 1 }); } else //SNS 연동 { var result = Dao.Get("users.check.snsid", new Hashtable() { { "snsid", snsid }, { "jointype", jointype } }).Count(); if (result > 0) //SNS 연동 중복체크 { return JsonBack(new JsonRtn() { code = -99 }); } else { Dao.Save("users.snslink.up", new System.Collections.Hashtable() { { "userno", SUserInfo.UserNo }, { "snsid", snsid }, { "jointype", jointype }, { "uno", SUserInfo.UserNo }, { "uip", GetUserIP() } }); return JsonBack(new JsonRtn() { code = 1 }); } } } catch (Exception e) { return JsonBack(new JsonRtn() { code = -1 }); } } [HttpPost] public JsonResult SendLakey(Int64 lectno, String mobile) { Random r = new Random(); int lakey = r.Next(100000, 999999); SmsAuth sa = new SmsAuth() { lakey = lakey.ToString(),lectno=lectno }; String msg = "[영남건설기술교육원]\n\n영남건설기술교육원 인증번호 [" + lakey + "] 입니다."; var users = Dao.Get("users.findme", new Hashtable() { { "mobile", mobile } }).ToList(); if(users.Count() == 0) { return JsonBack(new JsonRtn() { code = -2 }); } if(users.Count() != 1) { return JsonBack(new JsonRtn() { code = -1 }); } Dao.Insert("common.smsauth", sa); IList us = new List(); us.Add(new MemoUser() { userno = SUserInfo.UserNo, mobile = mobile, title = "인증번호", mcontents = msg, smstype = "A", isok = 1 }); SaveTalk(us, "alarm"); //Dao.Insert("common.atalk.send", new Hashtable() { { "senderkey", GetConfig("mastersms").Split(';')[0] }, { "method", "alarm" }, { "DEST_PHONE", mobile.Replace(" ", "").Replace("-", "") }, { "SEND_PHONE", GetConfig("mtssendnum").Split(';')[0] }, { "title", "인증번호" }, { "MSG_BODY", msg }, { "replace_type", "S" } }); return JsonOK(sa.authno); } [HttpPost] public JsonResult ExtendLakey(int authno) { return JsonOK(Dao.Save("common.sms.extend", new Hashtable() { { "authno", authno } })); } [HttpPost] public JsonResult ChkLakey(String lakey, int authno) { IList datas = Dao.Get("common.sms.chk", new Hashtable() { { "authno", authno } }); if (datas.Count() < 1) { return JsonOK(0); } else if (datas.Where(w => w.strval.Replace(" ", "").Equals(lakey.Replace(" ", "")) && w.time.AddMinutes(3) < DateTime.Now).Count() > 0) { return JsonBack(new JsonRtn() { code = 1 }); } else if (datas.Where(w => w.strval.Replace(" ", "").Equals(lakey.Replace(" ", "")) && w.time.AddMinutes(3) >= DateTime.Now).Count() > 0) { Dao.Save("lect.isatt.in", new System.Collections.Hashtable() { { "lectno", datas.FirstOrDefault().intval2 }, { "lakey", datas.FirstOrDefault().strval } }); return JsonBack(new JsonRtn() { code = 1000, obj = datas.First() }); } return JsonOK(0); } [HttpPost] public JsonResult ChkLakeyForLectinning(String lakey, int authno, long cmino) { IList datas = Dao.Get("common.sms.chk", new Hashtable() { { "authno", authno } }); if (datas.Count() < 1) { return JsonOK(0); } else if (datas.Where(w => w.strval.Replace(" ", "").Equals(lakey.Replace(" ", "")) && w.time.AddMinutes(3) < DateTime.Now).Count() > 0) { return JsonBack(new JsonRtn() { code = 1 }); } else if (datas.Where(w => w.strval.Replace(" ", "").Equals(lakey.Replace(" ", "")) && w.time.AddMinutes(3) >= DateTime.Now).Count() > 0) { var lectno = datas.FirstOrDefault().intval2; var lectInnings = Dao.Get("cr.cminnings", new System.Collections.Hashtable() { { "lectno", lectno }, { "userno", SUserInfo.UserNo } }); if (lectInnings.Where(w => w.cmino == cmino).Count() > 0) { var Hashtable = new System.Collections.Hashtable() { { "lectno", lectno }, { "cmino", cmino }, { "isattcheck", 1 }, { "userno", SUserInfo.UserNo }, { "uno", SUserInfo.UserNo }, { "uip", GetUserIP() } }; Dao.Save("lect.lectinning.isatt.in", Hashtable); return JsonBack(new JsonRtn() { code = 1000, obj = datas.First() }); } } return JsonOK(0); } [HttpPost] public JsonResult PageLearningTotalTime(Int64 lectno, Int64 cmino, int cpno) { if (SUserInfo.UserNo > 0) { var totstudy = Dao.Get("cr.lectinningpage.totstudy", new Hashtable() { { "lectno", lectno }, { "cmino", cmino }, { "cpno", cpno } }).First(); return JsonOK(totstudy, true); } return JsonOK(0); } public JsonResult GetOkCert3Rslt(string stringval) { stringval = string.IsNullOrWhiteSpace(stringval) ? "" : stringval.Trim(); //string result = "NoCert"; // 초기값 OkCert3Result result = new OkCert3Result(); result.rsltCd = "NoCert"; if (!string.IsNullOrWhiteSpace(stringval)) { stringval = HttpUtility.UrlDecode(stringval); string decStr = DecString(stringval); string tempStr = ""; string[] tempArr = decStr.Split(','); string gubn = tempArr[2]; result.reasonNo = int.Parse(tempArr[3].ToString()); result.rsltCd = tempArr[4]; string certiOkData = Dao.Get("sys.okcert3.get", new Hashtable { { "no", tempArr[0] }, { "sn", tempArr[1] } }).FirstOrDefault(); JObject data = JObject.FromObject(JsonConvert.DeserializeObject(certiOkData)); result.no = long.Parse(tempArr[0]); result.sn = tempArr[1]; result.gubn = gubn; result.ci = data["CI"].ToString(); result.di = data["DI"].ToString(); result.username = data["RSLT_NAME"].ToString(); result.birthday = data["RSLT_BIRTHDAY"].ToString(); result.mobile = data["TEL_NO"] == null ? "" : data["TEL_NO"].ToString(); result.vssn = data["VSSN"] == null ? "" : data["VSSN"].ToString(); if (!string.IsNullOrWhiteSpace(result.mobile)) { tempStr = result.mobile.Trim(); if (tempStr.Length == 10) { result.mobile = tempStr.Substring(0, 3) + "-" + tempStr.Substring(3, 3) + "-" + tempStr.Substring(6, 4); } else if(tempStr.Length == 11) { result.mobile = tempStr.Substring(0, 3) + "-" + tempStr.Substring(3, 4) + "-" + tempStr.Substring(7, 4); } // 10,11 개 아닐 경우 그대로 표현 } } return JsonOKObj(result); } /// /// 비밀번호 변경 /// /// [HttpPost] [ValidateAntiForgeryToken] public JsonResult UserChangePassword(string userid, string password) { try { #region + 유효성 검사 (실패 시 즉시 반환) // 1. 빈 문자열 확인 if (string.IsNullOrEmpty(userid) || string.IsNullOrEmpty(password)) { return Json(new { success = false, message = "아이디 또는 비밀번호를 입력해주세요.", data = -1 }); } // 2. 비밀번호 복잡도 검사 (8자 이상, 영문, 숫자, 특수문자 포함) var passwordRegex = new Regex("^(?=.*[a-zA-Z])(?=.*\\d)(?=.*[\\W_]).{8,}$"); if (!passwordRegex.IsMatch(password)) { return Json(new { success = false, message = "비밀번호는 8자 이상이며, 영문, 숫자, 특수문자를 포함해야 합니다.", data = -2 }); } // 3. 3번 이상 연속되는 동일한 문자/숫자/기호 검사 var repeatRegex = new Regex("(.)\\1\\1"); if (repeatRegex.IsMatch(password)) { return Json(new { success = false, message = "연속으로 3번 이상 반복되는 문자를 사용할 수 없습니다.", data = -3 }); } #endregion // 모든 유효성 검사를 통과한 경우 진행 var p = new Hashtable(); long userNo = -1; #region + Get: users.findme // userno 추출을 위한 목적 p.Clear(); p.Add("userid", userid); Users user = Dao.Get("users.findme", p) .FirstOrDefault() ?? new Users(); userNo = user.userno; #endregion #region + Save: users.change.password (비밀번호 재설정) if (userNo > 0) { p.Clear(); p.Add("userid", userid); p.Add("userpass", Base.Lib.KISA_SHA256.SHA256Hash(password)); p.Add("userno", userNo); p.Add("uip", GetUserIP()); Dao.Save("users.change.password", p); } #endregion return Json(new { success = true, message = "비밀번호가 성공적으로 변경되었습니다.", data = 0 }); } catch (Exception ex) { SetError($"UserChangePassword: {ex.Message}"); return Json(new { success = false, message = "처리 중 오류가 발생했습니다. 다시 시도해주세요.", data = -10 }); } } } }