과정관리는 수강생 본인이 수강한 과정 내역들을 확인할 수 있는 메뉴입니다. 수강한 모든 과정들의 목록과 진행상태를 확인할 수 있으며 퇴실이 완료되고 난 후 과정담당자가 수료완료를 진행하면 수료증도 내려 받을 수 있습니다.
화면구성
소스참고 EduHub\mobile\Mobile_frmEduHistory.xfdl
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]->[접수현황]으로 메뉴 이동 후
하단 수강이력에서 수강이 완료된 수료증 다운로드가 가능합니다.certificate-homepage1
모바일 어플을 이용하는 방법
1) "투비교육포털" 어플이 설치된 어플(앱)을 실행합니다. 2) 기술지원 홈페이지에서 사용하는 로그인 정보를 이용하여 로그인합니다. 3) [과정관리] 메뉴 이동 후 수강한 교육에 대한 수료증 다운로드가 가능합니다.
certificate-app.png