과정관리는 수강생 본인이 수강한 과정 내역들을 확인할 수 있는 메뉴입니다. 수강한 모든 과정들의 목록과 진행상태를 확인할 수 있으며 퇴실이 완료되고 난 후 과정담당자가 수료완료를 진행하면 수료증도 내려 받을 수 있습니다.
화면구성
소스참고 EduHub\mobile\Mobile_frmEduHistory.xfdl
1 Static 수강생의 교육 수강 목록 건수를 나타냅니다. 2 Static 과정 관리 단계에 대한 설명을 나타냅니다. 3 Gird 교육수강이력을 목록형태로 나타냅니다. 교육수강이력에 수료상태를 나타내며 교육 이수 완료 시 수료증 표시가 나타납니다. 수료증 표시를 클릭하면 수료증을 다운 받을 수 있습니다.
주요 기능 구현 설명
수료증 출력
당사에서 진행되는 교육의 입/퇴실 출결처리가 모두 정상적으로 완료되었을 때 수료증이 발급이 가능합니다.
입/퇴실 출결처리가 모두 정상적으로 완료된 교육에 대해서만 수료증을 발급합니다.
넥사크로플랫폼 기능 중 XMLHttpRequest 기능을 통해 서버 jsp를 호출할 수 있으나,
수료증을 발급하는 도메인 주소가 다르기 때문에 동일출처정책 오류가 발생합니다.
따라서 타 도메인에 있는 서비스 주소를 호출하기 위해 "투비교육포털" 서비스 경로에서
java 기능 중 URL 호출방식을 통해 데이타를 가져오도록 처리 하였습니다.
수료증 발급은 unireport제품을 활용하였으며 관련 소스는 별도 제공하지 않습니다.
/**************************************************************** * 수료증 출력 ****************************************************************/ this.fn_EduCertificate = function() { this.ds_print.clearData(); this.ds_print.addRow(); this.ds_print.setColumn(this.ds_print.rowposition,"cer_no",this.ds_edu.getColumn(this.ds_edu.rowposition,"cer_no")); this.ds_print.setColumn(this.ds_print.rowposition,"req_nm",this.ds_edu.getColumn(this.ds_edu.rowposition,"EMP_NAME")); this.ds_print.setColumn(this.ds_print.rowposition,"company_nm",this.ds_edu.getColumn(this.ds_edu.rowposition,"COMPANY_NAME")); this.ds_print.setColumn(this.ds_print.rowposition,"course_nm",this.ds_edu.getColumn(this.ds_edu.rowposition,"course_nm")); this.ds_print.setColumn(this.ds_print.rowposition,"product_nm",this.ds_edu.getColumn(this.ds_edu.rowposition,"product_name")); this.ds_print.setColumn(this.ds_print.rowposition,"period",this.ds_edu.getColumn(this.ds_edu.rowposition,"START_DATE") + " ~ " + this.ds_edu.getColumn(this.ds_edu.rowposition,"END_DATE")); //var strEndDate = this.ds_main.getColumn(i, "END_DATE"); //var date = strEndDate.split("-"); /*수료증 발급일은 교육종료일*/ this.ds_print.setColumn(this.ds_print.rowposition,"yyyy",this.ds_edu.getColumn(this.ds_edu.rowposition,"yyyy")); this.ds_print.setColumn(this.ds_print.rowposition,"mm",this.ds_edu.getColumn(this.ds_edu.rowposition,"mm")); this.ds_print.setColumn(this.ds_print.rowposition,"dd",this.ds_edu.getColumn(this.ds_edu.rowposition,"dd")); this.ds_print.setColumn(this.ds_print.rowposition,"getTime",this.ds_edu.getColumn(this.ds_edu.rowposition,"getTime")); this.ds_print.setColumn(this.ds_print.rowposition,"EMAIL",this.ds_edu.getColumn(this.ds_edu.rowposition,"EMAIL")); this.ds_print.setColumn(this.ds_print.rowposition,"ESL_SEQ",this.ds_edu.getColumn(this.ds_edu.rowposition,"ESL_SEQ")); this.transaction("fn_EduCertificate","ServiceUrl::EduSqlManager/EduCertificate.jsp","in_print=ds_print:U","","","fnCallback"); };
this.fnCallback = function(svcID, errorCode, errorMsg) { switch(svcID) { ... 중략 ... case "fn_EduCertificate": system.execBrowser("https://edu.tobesoft.com/xxx/ CertificateFileDownload.jsp?FileName=투비소프트수료증서_" + this.ds_edu.getColumn(this.ds_edu.rowposition,"EMP_NAME") + "_" + this.ds_edu.getColumn(this.ds_edu.rowposition,"ESL_SEQ")+".pdf"); break; } };
수료증을 생성하는 jsp는 별도 서버에서 처리합니다. https://edu.tobesoft.com/xxx/CertificateFileDownload.jsp
소스참고 https://edu.tobesoft.com/xxx/CertificateFileDownload.jsp
<%@page contentType="text/html; charset=UTF-8" %> <%@page import="com.nexacro17.xapi.tx.*"%> <%@page import="com.nexacro17.xapi.data.*"%> <%@page import="com.nexacro17.xapi.data.datatype.*"%> <%@page import="java.io.*"%> <%@page import="java.io.BufferedReader"%> <%@page import="java.io.ByteArrayOutputStream"%> <%@page import="java.io.InputStream"%> <%@page import="java.io.InputStreamReader"%> <%@page import="java.io.IOException"%> <%@page import="java.io.OutputStream"%> <%@page import="java.io.StringReader"%> <%@page import="java.net.HttpURLConnection"%> <%@page import="java.net.URL"%> <%@page import="java.net.URLConnection"%> <%@page import="java.net.URLEncoder"%> <%@page import="java.util.Iterator"%> <%@page import="java.io.PrintWriter"%> <%@page import="java.sql.*"%> <%@page import="javax.xml.parsers.*"%> <%@page import="javax.xml.xpath.XPath"%> <%@page import="javax.xml.xpath.XPathConstants"%> <%@page import="javax.xml.xpath.XPathExpressionException"%> <%@page import="javax.xml.xpath.XPathFactory"%> <%@page import="org.apache.commons.logging.*"%> <%@page import="org.w3c.dom.*"%> <%@page import="org.w3c.dom.Node"%> <%@page import="org.w3c.dom.NodeList"%> <%@page import="org.xml.sax.InputSource"%> <%@page import="org.xml.sax.SAXException"%><% out.clear(); int nErrorCode = 0; String strErrorMsg = "START"; PlatformRequest platformRequest = new PlatformRequest(request.getInputStream()); //PlatformType.CONTENT_TYPE_XML, strCharset); //HttpPlatformRequest pReq = new HttpPlatformRequest(request.getInputStream(), PlatformType.CONTENT_TYPE_XML, "UTF-8"); platformRequest.receiveData(); PlatformData inPD = platformRequest.getData(); DataSet ds = inPD.getDataSet("in_print"); String arg_cer_no = dsGet(ds, 0, "cer_no"); String arg_req_nm = dsGet(ds, 0, "req_nm"); String arg_company_nm = dsGet(ds, 0, "company_nm"); String arg_course_nm = dsGet(ds, 0, "course_nm"); String arg_period = dsGet(ds, 0,"period"); String arg_yyyy = dsGet(ds, 0,"yyyy"); String arg_mm = dsGet(ds, 0,"mm"); String arg_dd = dsGet(ds, 0,"dd"); String arg_getTime = dsGet(ds, 0,"getTime"); String arg_EMAIL = dsGet(ds, 0,"EMAIL"); String arg_ESL_SEQ = dsGet(ds, 0,"ESL_SEQ"); String arg_product_nm = dsGet(ds, 0,"product_nm"); try { URL url = new URL("http://next.tobesoft.com/xxxxxx/ubiexport_Certificate.jsp"); HttpURLConnection urlconn = (HttpURLConnection) url.openConnection(); // 접속 //-------------------------- // 전송 모드 설정 - 기본적인 설정 //-------------------------- urlconn.setDefaultUseCaches(false); urlconn.setDoInput(true); // 서버에서 읽기 모드 지정 urlconn.setDoOutput(true); // 서버로 쓰기 모드 지정 urlconn.setRequestMethod("POST"); // 전송 방식은 POST //-------------------------- // 헤더 세팅 //-------------------------- // 서버에게 웹에서 <Form>으로 값이 넘어온 것과 같은 방식으로 처리하라는 걸 알려준다 urlconn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); //-------------------------- // 서버로 값 전송 //-------------------------- OutputStreamWriter outStream = new OutputStreamWriter(urlconn.getOutputStream() , "UTF-8"); PrintWriter writer = new PrintWriter(outStream); String sendXMLFormat = sendXMLFormat(); sendXMLFormat = replaceAll(sendXMLFormat, "@p_cer_no" , arg_cer_no); sendXMLFormat = replaceAll(sendXMLFormat, "@p_req_nm" , arg_req_nm); sendXMLFormat = replaceAll(sendXMLFormat, "@p_company_nm" , arg_company_nm); sendXMLFormat = replaceAll(sendXMLFormat, "@p_course_nm" , arg_course_nm); sendXMLFormat = replaceAll(sendXMLFormat, "@p_period", arg_period); sendXMLFormat = replaceAll(sendXMLFormat, "@p_yyyy" , arg_yyyy); sendXMLFormat = replaceAll(sendXMLFormat, "@p_mm" , arg_mm); sendXMLFormat = replaceAll(sendXMLFormat, "@p_dd" , arg_dd); sendXMLFormat = replaceAll(sendXMLFormat, "@p_getTime" , arg_getTime); sendXMLFormat = replaceAll(sendXMLFormat, "@p_EMAIL" , arg_EMAIL); sendXMLFormat = replaceAll(sendXMLFormat, "@p_ESL_SEQ" , arg_ESL_SEQ); sendXMLFormat = replaceAll(sendXMLFormat, "@p_product_nm" , arg_product_nm); writer.write(sendXMLFormat); writer.flush(); if (urlconn.getResponseCode() == HttpURLConnection.HTTP_OK) { BufferedReader br = new BufferedReader(new InputStreamReader((urlconn.getInputStream()))); String output; StringBuilder sb = new StringBuilder(); while ((output = br.readLine()) != null) { sb.append(output + "\n"); } br.close(); } urlconn.disconnect(); nErrorCode = 0; strErrorMsg = "SUCC"; } catch (IOException e) { nErrorCode = (-1); strErrorMsg = e.getMessage(); } finally { if (nErrorCode == 0) strErrorMsg = "SUCC"; // PlatformData PlatformData outPData = new PlatformData(); VariableList outVList = outPData.getVariableList(); outVList.add("ErrorCode", nErrorCode); outVList.add("ErrorMsg" , strErrorMsg); HttpPlatformResponse pRes = new HttpPlatformResponse(response, PlatformType.CONTENT_TYPE_XML, "UTF-8"); pRes.setData(outPData); pRes.sendData(); } %> <%! // Dataset value public String dsGet(DataSet ds, int rowno, String colid) throws Exception { String value; value = ds.getString(rowno, colid); if( value == null ) return ""; else return value; } public String replaceAll(String str, String pattern, String replace) { int e = 0, s = 0; StringBuffer result = new StringBuffer(); while ((e = str.indexOf(pattern, s)) >= 0) { result.append(str.substring(s, e)); result.append(replace); s = e + pattern.length(); } result.append(str.substring(s)); return result.toString(); } public String sendXMLFormat() { StringBuffer result = new StringBuffer(); result.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); result.append("<Root xmlns=\"http://www.nexacroplatform.com/platform/dataset\">\n"); result.append("<Parameters>\n"); result.append("<Parameter id=\"_ga\">GA1.2.1115865492.1571360014</Parameter>\n"); result.append("</Parameters>\n"); result.append("<Dataset id=\"ds_Print\">\n"); result.append("<ColumnInfo>\n"); result.append("<Column id=\"cer_no\" type=\"STRING\" size=\"256\" />\n"); result.append("<Column id=\"req_nm\" type=\"STRING\" size=\"256\" />\n"); result.append("<Column id=\"company_nm\" type=\"STRING\" size=\"256\" />\n"); result.append("<Column id=\"course_nm\" type=\"STRING\" size=\"256\" />\n"); result.append("<Column id=\"period\" type=\"STRING\" size=\"256\" />\n"); result.append("<Column id=\"yyyy\" type=\"STRING\" size=\"256\" />\n"); result.append("<Column id=\"mm\" type=\"STRING\" size=\"256\" />\n"); result.append("<Column id=\"dd\" type=\"STRING\" size=\"256\" />\n"); result.append("<Column id=\"imgLogo\" type=\"STRING\" size=\"256\" />\n"); result.append("<Column id=\"imgStamp\" type=\"STRING\" size=\"256\" />\n"); result.append("<Column id=\"outLine\" type=\"STRING\" size=\"256\" />\n"); result.append("<Column id=\"getTime\" type=\"STRING\" size=\"256\" />\n"); result.append("<Column id=\"CEO_NAME\" type=\"STRING\" size=\"256\" />\n"); result.append("<Column id=\"EMAIL\" type=\"STRING\" size=\"256\" />\n"); result.append("<Column id=\"ESL_SEQ\" type=\"STRING\" size=\"256\" />\n"); result.append("<Column id=\"product_nm\" type=\"STRING\" size=\"256\" />\n"); result.append("</ColumnInfo>\n"); result.append("<Rows>\n"); result.append("<Row>\n"); result.append("<Col id=\"cer_no\">@p_cer_no</Col>\n"); result.append("<Col id=\"req_nm\">@p_req_nm</Col>\n"); result.append("<Col id=\"company_nm\">@p_company_nm</Col>\n"); result.append("<Col id=\"course_nm\">@p_course_nm</Col>\n"); result.append("<Col id=\"period\">@p_period</Col>\n"); result.append("<Col id=\"yyyy\">@p_yyyy</Col>\n"); result.append("<Col id=\"mm\">@p_mm</Col>\n"); result.append("<Col id=\"dd\">@p_dd</Col>\n"); result.append("<Col id=\"imgLogo\">http://next.tobesoft.com/NEXTp/Report/edu_Certificate_Logo.jpg</Col>\n"); result.append("<Col id=\"imgStamp\">http://next.tobesoft.com/NEXTp/Report/edu_Certificate_Stamp.jpg</Col>\n"); result.append("<Col id=\"outLine\">http://next.tobesoft.com/NEXTp/Report/edu_Certificate_Outline.jpg</Col>\n"); result.append("<Col id=\"getTime\">@p_getTime</Col>\n"); result.append("<Col id=\"CEO_NAME\">홍길동(대표이사)</Col>\n"); result.append("<Col id=\"EMAIL\">@p_EMAIL</Col>\n"); result.append("<Col id=\"ESL_SEQ\">@p_ESL_SEQ</Col>\n"); result.append("<Col id=\"product_nm\">@p_product_nm</Col>\n"); result.append("</Row>\n"); result.append("</Rows>\n"); result.append("</Dataset>\n"); result.append("</Root>"); return result.toString(); } %>
소스참고 http://next.tobesoft.com/xxxxxx/ubiexport_Certificate.jsp
해당 소스는 운영서버의 상세정보 등이 포함되어 있어 해당 내용은 삭제처리 하였으니
소스만 참고하시기 바랍니다.
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <%@ page import="com.ubireport.viewer.report.preview.UbiViewer" %> <%@ page import="com.nexacro17.xapi.data.*" %> <%@ page import="com.nexacro17.xapi.tx.*" %> <%@ page import="java.io.*" %> <%@ page import="java.util.*" %> <%@ page import="java.text.*" %> <% String appUrl = "http://localhost:8080"; String fileURL = appUrl + "/ubi4"; String ubiServerURL = appUrl + "/UbiServer"; String ds = "Tutorial"; String jrfFileDir = "C:/WORK/Report/"; String jrfFileName = "EDU_CERTIFICATE.jrf"; String arg = ""; String exportPath = "C:/WORK/Certificate"; String exportFilePath = exportPath + java.io.File.separator; String exportfileType = "pdf"; File fPath = new File(exportPath); if (!fPath.exists()) { fPath.mkdirs(); } // HttpServletRequest를 이용하여 HttpPlatformRequest 생성 HttpPlatformRequest req = new HttpPlatformRequest(request); // 데이터 수신 req.receiveData(); // Input DataSet 생성 PlatformData pdInData = req.getData(); DataSet inData = pdInData.getDataSet("ds_Print"); DataSet inPrint = new DataSet("ds_InPrint"); // VariableList 참조 VariableList varList = pdInData.getVariableList(); // Output 생성 PlatformData resData = new PlatformData(); VariableList resVarList = resData.getVariableList(); try { boolean isSuccess = true; UbiViewer ubi = new UbiViewer(false, false); ubi.fileURL = fileURL; ubi.ubiServerURL = ubiServerURL; ubi.isLocalFile = true; ubi.jrfFileDir = jrfFileDir; ubi.jrfFileName = jrfFileName; ubi.arg = arg; ubi.dataSource = ds; ubi.exectype = "TYPE6"; ubi.fontRevision = true; ubi.isDebug = true; ubi.isLocalData = true; // 추가 String inDataXml = inData.saveXml(); inPrint.loadXml(inDataXml); for (int i=0; i<inData.getRowCount(); i++) { inPrint.clearData(); inPrint.newRow(); inPrint.set(0, "cer_no", inData.getString(i, "cer_no")); inPrint.set(0, "req_nm", inData.getString(i, "req_nm")); inPrint.set(0, "company_nm",inData.getString(i, "company_nm")); inPrint.set(0, "course_nm", inData.getString(i, "course_nm")); inPrint.set(0, "period", inData.getString(i, "period")); inPrint.set(0, "yyyy", inData.getString(i, "yyyy")); inPrint.set(0, "mm", inData.getString(i, "mm")); inPrint.set(0, "dd", inData.getString(i, "dd")); inPrint.set(0, "imgLogo", inData.getString(i, "imgLogo")); inPrint.set(0, "imgStamp", inData.getString(i, "imgStamp")); inPrint.set(0, "outLine", inData.getString(i, "outLine")); inPrint.set(0, "getTime", inData.getString(i, "getTime")); inPrint.set(0, "CEO_NAME", inData.getString(i, "CEO_NAME")); inPrint.set(0, "ESL_SEQ", inData.getString(i, "ESL_SEQ")); String strFileNm = "투비소프트수료증서 _" + inPrint.getString(0, "ESL_SEQ"); System.out.println(exportFilePath+strFileNm); ubi.setExportParams(exportfileType, exportFilePath+strFileNm); String inPrintXml = inPrint.saveXml(); ubi.setDataset("ds_print", inPrintXml, "TOBEXML"); //nexacro 데이터셋 isSuccess = ubi.loadReport(); // System.out.println(isSuccess); if (!isSuccess) break; } VariableList vl = new VariableList(); if( isSuccess){ resVarList.add("ErrorCode", "0"); resVarList.add("ErrorMsg", "Export Success!"); } else { resVarList.add("ErrorCode", "-1"); resVarList.add("ErrorMsg", "Export Fail!"); } } catch(Exception e) { e.printStackTrace(); resVarList.add("ErrorCode", "-1"); resVarList.add("ErrorMsg", e.getMessage()); } HttpPlatformResponse res = new HttpPlatformResponse(response); res.setData(resData); res.sendData(); %>
기술지원 홈페이지를 통한 수료증 발급 방법
1) 기술지원 홈페이지 로그인
2) [Education]->[접수현황]으로 메뉴 이동 후 하단 수강이력에서 수강이 완료된 수료증 다운로드받기
참고사항
수료증 발급 기준이 어떻게 되나요?
당사에서 진행되는 교육은 출결시 입/퇴실 출결처리가 모두 정상적으로 완료가 되어야 수료증이 발급됩니다.
입실 출결 시간 : 교육시작 전부터 교육 시작 시간까지 입실이 완료되어야 합니다.
퇴실 출결 시간 : 퇴실의 경우 교육 종료 1시간 전부터 퇴실처리가 가능합니다.
교육이수 후 수료증 발급 방법
기술지원 홈페이지를 통해 발급 방법
1) 기술지원 홈페이지 로그인 2) [Education]->[접수현황]으로 메뉴 이동 후 하단 수강이력에서 수강이 완료된 수료증 다운로드가 가능합니다.
모바일 어플을 이용하는 방법
1) "투비교육포털" 어플이 설치된 어플(앱)을 실행합니다. 2) 기술지원 홈페이지에서 사용하는 로그인 정보를 이용하여 로그인합니다. 3) [과정관리] 메뉴 이동 후 수강한 교육에 대한 수료증 다운로드가 가능합니다.