diff --git a/BO/Controllers/AccountController.cs b/BO/Controllers/AccountController.cs index 5430965..b3479b4 100644 --- a/BO/Controllers/AccountController.cs +++ b/BO/Controllers/AccountController.cs @@ -97,7 +97,9 @@ namespace NP.BO.Controllers } } //else if (u.RetireDate != null) { LoginStatus = 5; } - else if (!"192.168.1.3,127.0.0.1,192.168.0.87,192.168.0.56,1.214.45.218".Contains(SUserInfo.LoginIP) && !u.userpass.Equals(NP.Base.Lib.KISA_SHA256.SHA256Hash(vm.User.userpass.Trim()))) { + //else if (!"192.168.1.3,127.0.0.1,192.168.0.87,192.168.0.56,1.214.45.218".Contains(SUserInfo.LoginIP) && !u.userpass.Equals(NP.Base.Lib.KISA_SHA256.SHA256Hash(vm.User.userpass.Trim()))) { + else if (!u.userpass.Equals(NP.Base.Lib.KISA_SHA256.SHA256Hash(vm.User.userpass.Trim()))) + { LoginStatus = 2; // 로그인 실패 카운트 증가 vm.logincnt++; diff --git a/Base/Controller/AOCommon.cs b/Base/Controller/AOCommon.cs index 5f60633..0dcb22a 100644 --- a/Base/Controller/AOCommon.cs +++ b/Base/Controller/AOCommon.cs @@ -178,7 +178,7 @@ namespace NP.Base.Controllers } bool isSkip = false; - isSkip = Helpers.IsSkipIPorHost(IpHostSkipGb.PassWord, ip, Request.ServerVariables["HTTP_HOST"]); + isSkip = Helpers.IsSkipIPorHost(IpHostSkipGb.SmsAuth, ip, Request.ServerVariables["HTTP_HOST"]); if (isSkip) { @@ -197,17 +197,10 @@ namespace NP.Base.Controllers return JsonBack(new { code = -1 }); } - //210707 eduwreq 특정ip인증허용 정책 폐지 - //if (ip.StartsWith("10.10.4.") || ip.StartsWith("10.10.13.") || ip == "192.168.103.13" || ip == "192.168.0.87" || ip == "121.140.58.113") - //return JsonBack(new JsonRtn() { code = 1}); - //else - //{ - //정보에 모바일번호 없는 경우 if (u != null && !string.IsNullOrEmpty(u.mobile)) { return JsonBack(new { code = 1000, ip = ip, mobile = u.mobile, no = u.userno }); - } - //기타에러 + } else { return JsonBack(new { code = -2 }); diff --git a/Base/Controller/FOCommon.cs b/Base/Controller/FOCommon.cs index a227f8e..9141fe2 100644 --- a/Base/Controller/FOCommon.cs +++ b/Base/Controller/FOCommon.cs @@ -1,16 +1,17 @@ -using System; +using IBatisNet.Common.Transaction; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using NP.Base.Auth; +using NP.Base.ENUM; +using NP.Frame; +using NP.Model; +using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Web; -using System.Web.Mvc; - -using NP.Model; -using System.Collections; -using NP.Base.Auth; -using NP.Base.ENUM; using System.Web.ModelBinding; -using Newtonsoft.Json.Linq; -using Newtonsoft.Json; +using System.Web.Mvc; namespace NP.Base.Controllers { @@ -364,8 +365,9 @@ namespace NP.Base.Controllers "아래 링크를 클릭하셔서 비밀번호를 재설정해주세요.

" + "비밀번호 재설정

이 링크는 24시간 뒤 만료됩니다."; - //int mailReuslt = SendEmailNew("[영남건설기술교육원] 비밀번호 찾기 안내", MHtml, email); - return JsonOK(SendEmail(masteremail.Split(';')[1], GetInt(masteremail.Split(';')[2]), masteremail.Split(';')[3], masteremail.Split(';')[4], 999, user.email, masteremail.Split(';')[0], "영남건설기술교육원 운영자", "[영남건설기술교육원] 비밀번호 찾기 안내", MHtml, "", "0:0")); + + 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 { @@ -656,16 +658,23 @@ namespace NP.Base.Controllers [HttpPost] /// ### ty 교육신청제한 - public JsonResult GetCheckLectIs(string man, string cgcode, string edu, string grade, int cmno, int pcmno) + 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 - result = CheckUserLect(man, cgcode, edu, grade, cmno, pcmno, SUserInfo.UserNo); - return JsonBack(result); } + #region + 이건 과거로직이다 아마도 앞으로 사용하지 않을 것 같다 // pms: 5640 적용 //public int CheckUserLect(string man, string cgcode, string edu, string grade, int cmno, int pcmno, long userno) //{ @@ -760,8 +769,298 @@ namespace NP.Base.Controllers // 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개만 신청 가능 + // ((설계시공 또는 건설사업관리) / (역량강화 또는 전문분야)) + bool isApplyingForGroupA = (man == "25" || man == "28") && (cgcode == "103" || cgcode == "104"); + if (isApplyingForGroupA) + { + bool hasExistingInGroupA = lectEnrolls.Any(l => + l.TYPEEDU == 35 + && l.TYPEGRADE.ToString() == grade + && l.TYPEJOB.ToString() == job1 + && ( + (l.TYPEMAN.ToString() == "25" || l.TYPEMAN.ToString() == "28") + && (l.CGCODE == "103" || l.CGCODE == "104") + ) + ); + + if (hasExistingInGroupA) + { + return new KeyValuePair(-20, "승급교육 제약A"); + } + } + + bool isApplyingForGroupA2 = (man == "25" || man == "28") && (cgcode == "105"); + if (isApplyingForGroupA) + { + bool hasExistingInGroupA = 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 (isApplyingForGroupA2) + { + return new KeyValuePair(-20, "승급교육 제약A"); + } + } + + bool isApplyingForGroupA3 = (man == "25" || man == "28") && (cgcode == "107"); + if (isApplyingForGroupA) + { + bool hasExistingInGroupA3 = lectEnrolls.Any(l => + l.TYPEEDU == 35 + && l.TYPEGRADE.ToString() == grade + && l.TYPEJOB.ToString() == job1 + && ( + (l.TYPEMAN.ToString() == "25" || l.TYPEMAN.ToString() == "28") + && (l.CGCODE == "107") + ) + ); + + if (isApplyingForGroupA2) + { + return new KeyValuePair(-20, "승급교육 제약A"); + } + } + + /* + + // B: 동일 등급, 동일 직무분야 내에서 1개만 신청 가능 + // ((설계시공/특성화) 또는 (건설사업관리/전문분야)) + bool isApplyingForGroupB = (man == "25" && cgcode == "107") || (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() == "25" && l.CGCODE == "107") + || (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")); + if (isApplyingForGroupC) + { + bool hasExistingInGroupC = lectEnrolls.Any(l => + l.TYPEEDU == 35 + && l.TYPEGRADE.ToString() == grade + && l.TYPEJOB.ToString() == job1 + && ( + (l.TYPEMAN.ToString() == "25" && l.CGCODE == "107") + || (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) { @@ -771,7 +1070,9 @@ namespace NP.Base.Controllers string[] cgcodes = new string[0]; string[] edus = new string[0]; - if (DateTime.Now > DateTime.Parse("2030-01-02 00:00"))// ### ty 2024년 추가건이나 현재 적용대기로 전달 받음 + // 실제로직은 ELSE절이다. + + if (DateTime.Now > DateTime.Parse("2099-01-02 00:00"))// ### ty 2024년 추가건이나 현재 적용대기로 전달 받음 { // ### ty 2024년 적용!!! diff --git a/Dao/MyBatis/Maps/Lect.xml b/Dao/MyBatis/Maps/Lect.xml index 075f94a..d35909d 100644 --- a/Dao/MyBatis/Maps/Lect.xml +++ b/Dao/MyBatis/Maps/Lect.xml @@ -12,6 +12,7 @@ + @@ -2852,5 +2853,44 @@ , l.uip=#uip# where l.lectno = #lectno#; + + + \ No newline at end of file diff --git a/FO/Controllers/AccountController.cs b/FO/Controllers/AccountController.cs index 5f296b5..6a898b7 100644 --- a/FO/Controllers/AccountController.cs +++ b/FO/Controllers/AccountController.cs @@ -1,19 +1,15 @@ -using System; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using NP.Model; +using NP.Model.ENUM; +using OkCert3Com; +using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; - -using NP.Model; -using System.Security.Claims; -using System.Collections; -using System.Text; -using Newtonsoft.Json.Linq; -using Newtonsoft.Json; -using OkCert3Com; - using XPayClientNet; -using NP.Model.ENUM; namespace NP.FO.Controllers { diff --git a/FO/Controllers/CourseController.cs b/FO/Controllers/CourseController.cs index f924d7a..5697e39 100644 --- a/FO/Controllers/CourseController.cs +++ b/FO/Controllers/CourseController.cs @@ -701,6 +701,7 @@ namespace NP.FO.Controllers /// public ActionResult SmartSearch(VMCourse vm) { + #region + 참고사항 /* stringval : 0: 건설기술진흥법교육 (현재 고정됨) stringval2 : SKILL (1: 교육장, 2:온라인) - cshape @@ -712,7 +713,8 @@ namespace NP.FO.Controllers FROM comcode WHERE isuse = 1 AND cgroup IN ('typejob40','typejob41','typejob42','typejob43','typejob44','typejob45','typejob46','typejob47','typejob48','typejob49')) - */ + */ + #endregion var p = new Hashtable(); @@ -753,11 +755,23 @@ namespace NP.FO.Controllers vm.CMs = Dao.Get("cm.cms", p).ToList(); } + // pms7301 에 따른 정렬조건 + vm.CMs = vm.CMs?.OrderBy(c => + c.cgcode == "107" ? 1 : // 1. 특성화 + (c.cgcode == "103" || c.cgcode == "104") ? 2 : // 2. 역량강화 + c.cgcode == "102" ? 3 : // 3. 직무 + c.cgcode == "105" ? 4 : // 4. 전문 + c.cgcode == "101" ? 5 : // 5. 기본 + 6 // 그 외 + ).ToList() ?? new List(); + + #region + ComCodes2 ~ 6 vm.ComCodes2 = GetComCodes("typeman"); vm.ComCodes3 = GetComCodes("typeedu"); vm.ComCodes4 = GetComCodes("typegrade"); vm.ComCodes5 = GetComCodes("typejob"); - vm.ComCodes6 = GetComCodes("typejobitem"); + vm.ComCodes6 = GetComCodes("typejobitem"); + #endregion bool getComCheck = true; diff --git a/FO/FO.csproj b/FO/FO.csproj index b8368e4..f3ccc0d 100644 --- a/FO/FO.csproj +++ b/FO/FO.csproj @@ -231,6 +231,7 @@ + @@ -715,7 +716,6 @@ - @@ -727,7 +727,6 @@ - @@ -744,7 +743,6 @@ - diff --git a/FO/Views/Course/SmartSearch.cshtml b/FO/Views/Course/SmartSearch.cshtml index 6734cc4..b2002de 100644 --- a/FO/Views/Course/SmartSearch.cshtml +++ b/FO/Views/Course/SmartSearch.cshtml @@ -1,6 +1,16 @@ @model NP.Model.VMCourse +@{ + + var host = Request.Url.Host; + + // 개발과 로컬일 때 스마트검색 결과의 검색영역 보임 처리 + bool isDevSite = (host == "www.ynicte.com" || host == "ynicte.nptc.kr"); + string firstSchBoxDisplayStyle = isDevSite ? "" : "display:none;"; + +} +
- - @*20220728 교육장정보 감추기*@ - @*@if (item.cshape == 1 || (item.cshape == 2 && item.scdtype == 0)) //오프라인 경우 교육장 정보를 보여준다. - { - - }*@ - @*20220728온라인/오프라인 안내*@
@@ -170,7 +154,7 @@
강좌소개
- +
    @@ -181,14 +165,14 @@

    교육분류 :

    인정시간 : 시간

    - @*@if (Model.CM.cshape != 1) - { -

    수료기준 : 진도 % 이상, 시험 점 이상, 과제 점 이상

    - }*@
+
+
교육종류
+
+