과정관리

과정관리는 수강생 본인이 수강한 과정 내역들을 확인할 수 있는 메뉴입니다.
수강한 모든 과정들의 목록과 진행상태를 확인할 수 있으며 퇴실이 완료되고 난 후 과정담당자가 수료완료를 진행하면 수료증도 내려 받을 수 있습니다.

화면구성

소스참고
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