이파피루스 OCR 신규 기능 추가

This commit is contained in:
rosewiper 2023-10-04 09:52:55 +09:00
parent 853fa9ebd5
commit abe02c26ce
12 changed files with 1616 additions and 0 deletions

View File

@ -0,0 +1,19 @@
package kcc.kccadr.textsense.service;
import java.util.List;
public interface TextSenseService {
//TextSense OCR 처리요청 결과 내용 저장
public int insertTextSenseRequestResultInfo(TextSenseVO textSenseVO) throws Exception;
//TextSense OCR 처리요청 리스트
public List<TextSenseVO> selectTextSenseList(TextSenseVO textSenseVO) throws Exception;
//TextSense OCR 처리요청 리스트 갯수
public int selectTextSenseListCount(TextSenseVO textSenseVO) throws Exception;
//TextSense OCR 상세내용 불러오기
public TextSenseVO selectTextSenseDetail(TextSenseVO textSenseVO) throws Exception;
}

View File

@ -0,0 +1,199 @@
package kcc.kccadr.textsense.service;
import java.io.Serializable;
import kcc.com.cmm.ComDefaultVO;
public class TextSenseVO extends ComDefaultVO implements Serializable{
private String apiUrl;
private String inputUri;
private String outputUri;
private String taskName;
private String callbackUri;
//extraJob 파라미터 부분
private String url;
private String reqType;
private String reqOption;
private String outputType;
private String type;
private String pages;
//결과 파라미터 부분
private String id;
private String status;
private String inputFileLenth;
private String outputFileLenth;
private String createdat;
private String queuedat;
private String startdat;
private String completedat;
private String updatedat;
private String maxRetryCount;
private String retryCount;
private String collectedby;
private String externalId;
private String frstRegisterId;
private String frstRegistPnttm;
public String getApiUrl() {
return apiUrl;
}
public void setApiUrl(String apiUrl) {
this.apiUrl = apiUrl;
}
public String getInputUri() {
return inputUri;
}
public void setInputUri(String inputUri) {
this.inputUri = inputUri;
}
public String getOutputUri() {
return outputUri;
}
public void setOutputUri(String outputUri) {
this.outputUri = outputUri;
}
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public String getCallbackUri() {
return callbackUri;
}
public void setCallbackUri(String callbackUri) {
this.callbackUri = callbackUri;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getReqType() {
return reqType;
}
public void setReqType(String reqType) {
this.reqType = reqType;
}
public String getReqOption() {
return reqOption;
}
public void setReqOption(String reqOption) {
this.reqOption = reqOption;
}
public String getOutputType() {
return outputType;
}
public void setOutputType(String outputType) {
this.outputType = outputType;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getPages() {
return pages;
}
public void setPages(String pages) {
this.pages = pages;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getInputFileLenth() {
return inputFileLenth;
}
public void setInputFileLenth(String inputFileLenth) {
this.inputFileLenth = inputFileLenth;
}
public String getOutputFileLenth() {
return outputFileLenth;
}
public void setOutputFileLenth(String outputFileLenth) {
this.outputFileLenth = outputFileLenth;
}
public String getCreatedat() {
return createdat;
}
public void setCreatedat(String createdat) {
this.createdat = createdat;
}
public String getQueuedat() {
return queuedat;
}
public void setQueuedat(String queuedat) {
this.queuedat = queuedat;
}
public String getStartdat() {
return startdat;
}
public void setStartdat(String startdat) {
this.startdat = startdat;
}
public String getCompletedat() {
return completedat;
}
public void setCompletedat(String completedat) {
this.completedat = completedat;
}
public String getUpdatedat() {
return updatedat;
}
public void setUpdatedat(String updatedat) {
this.updatedat = updatedat;
}
public String getMaxRetryCount() {
return maxRetryCount;
}
public void setMaxRetryCount(String maxRetryCount) {
this.maxRetryCount = maxRetryCount;
}
public String getRetryCount() {
return retryCount;
}
public void setRetryCount(String retryCount) {
this.retryCount = retryCount;
}
public String getCollectedby() {
return collectedby;
}
public void setCollectedby(String collectedby) {
this.collectedby = collectedby;
}
public String getExternalId() {
return externalId;
}
public void setExternalId(String externalId) {
this.externalId = externalId;
}
public String getFrstRegisterId() {
return frstRegisterId;
}
public void setFrstRegisterId(String frstRegisterId) {
this.frstRegisterId = frstRegisterId;
}
public String getFrstRegistPnttm() {
return frstRegistPnttm;
}
public void setFrstRegistPnttm(String frstRegistPnttm) {
this.frstRegistPnttm = frstRegistPnttm;
}
}

View File

@ -0,0 +1,77 @@
package kcc.kccadr.textsense.service.impl;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Repository;
import egovframework.rte.psl.dataaccess.EgovAbstractDAO;
import kcc.kccadr.textsense.service.TextSenseVO;
@Repository("TextSenseDAO")
public class TextSenseDAO extends EgovAbstractDAO{
public int insertTextSenseRequestResultInfo(TextSenseVO textSenseVO) throws Exception{
int result = 0;
try {
result = update("textSenseDAO.insertTextSenseRequestResultInfo", textSenseVO);
} catch (Exception e) {
System.out.println("insertTextSenseRequestResultInfo DAO Error !!! " + e);
}
return result;
}
//TextSense OCR 처리요청 리스트
@SuppressWarnings("unchecked")
public List<TextSenseVO> selectTextSenseList(TextSenseVO textSenseVO) throws Exception{
List<TextSenseVO> resultList = new ArrayList<TextSenseVO>();
try {
resultList = (List<TextSenseVO>) list("textSenseDAO.selectTextSenseList", textSenseVO);
} catch (Exception e) {
System.out.println("selectTextSenseList Service DAO Error !!! " + e);
}
return resultList;
}
//TextSense OCR 처리요청 리스트 갯수
public int selectTextSenseListCount(TextSenseVO textSenseVO) throws Exception{
int resultCnt = 0;
try {
resultCnt = (int) select("textSenseDAO.selectTextSenseListCount", textSenseVO);
} catch (Exception e) {
System.out.println("selectTextSenseListCount Service DAO Error !!! " + e);
}
return resultCnt;
}
public TextSenseVO selectTextSenseDetail(TextSenseVO textSenseVO) throws Exception{
TextSenseVO result = new TextSenseVO();
try {
result = (TextSenseVO) select("textSenseDAO.selectTextSenseDetail", textSenseVO);
} catch (Exception e) {
System.out.println("selectTextSenseDetail Service DAO Error !!! " + e);
}
return result;
}
}

View File

@ -0,0 +1,88 @@
package kcc.kccadr.textsense.service.impl;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import kcc.kccadr.textsense.service.TextSenseService;
import kcc.kccadr.textsense.service.TextSenseVO;
@Service("TextSenseService")
public class TextSenseServiceImpl implements TextSenseService{
@Resource(name = "TextSenseDAO")
private TextSenseDAO textSenseDAO;
//TextSense OCR 처리요청 결과 내용 저장
@Override
public int insertTextSenseRequestResultInfo(TextSenseVO textSenseVO) throws Exception{
int result = 0;
try {
result = textSenseDAO.insertTextSenseRequestResultInfo(textSenseVO);
} catch (Exception e) {
System.out.println("insertTextSenseRequestResultInfo Service Impl Error !!! " + e);
}
return result;
}
//TextSense OCR 처리요청 리스트
@Override
public List<TextSenseVO> selectTextSenseList(TextSenseVO textSenseVO) throws Exception{
List<TextSenseVO> resultList = new ArrayList<TextSenseVO>();
try {
resultList = textSenseDAO.selectTextSenseList(textSenseVO);
} catch (Exception e) {
System.out.println("selectTextSenseList Service Impl Error !!! " + e);
}
return resultList;
}
//TextSense OCR 처리요청 리스트 갯수
@Override
public int selectTextSenseListCount(TextSenseVO textSenseVO) throws Exception{
int resultCnt = 0;
try {
resultCnt = textSenseDAO.selectTextSenseListCount(textSenseVO);
} catch (Exception e) {
System.out.println("selectTextSenseListCount Service Impl Error !!! " + e);
}
return resultCnt;
}
//TextSense OCR 상세내용 불러오기
@Override
public TextSenseVO selectTextSenseDetail(TextSenseVO textSenseVO) throws Exception{
TextSenseVO result = new TextSenseVO();
try {
result = textSenseDAO.selectTextSenseDetail(textSenseVO);
} catch (Exception e) {
System.out.println("selectTextSenseDetail Service Impl Error !!! " + e);
}
return result;
}
}

View File

@ -0,0 +1,102 @@
package kcc.kccadr.textsense.web;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.springframework.stereotype.Component;
import kcc.kccadr.textsense.service.TextSenseVO;
@Component
public class TextSenseAPIComm {
/*
* TextSense OCR 요청처리 하기
*
* */
@SuppressWarnings("unchecked")
public static JSONObject getTextSenseRequest(TextSenseVO textSenseVO) throws Exception{
JSONObject returnJson = new JSONObject();
try {
String apiUrl = textSenseVO.getApiUrl(); //"http://222.231.43.29:7777/textsense/api/job/build";
String inputUri = textSenseVO.getInputUri(); //"http://119.193.215.98:8097/kccadrPb/usr/image/common/top_logo.png";
String outputUri = textSenseVO.getOutputUri(); //"ftp://woo:dkagh@119.193.215.98/usr/ePapyrus/testocr.json";
//String outputUri = "http://119.193.215.98:8097/web/main/textsence/testOutputUriPage.do";
String taskName = textSenseVO.getTaskName();//"textsense-test1";
String callbackUri = textSenseVO.getCallbackUri();//"http://119.193.215.98:8097/web/main/textsence/testCallbackUriPage.do";
//String extraJobs = "";
JSONObject jsonObject = new JSONObject();
jsonObject.put("inputUri", inputUri);
jsonObject.put("outputUri", outputUri);
jsonObject.put("taskName", taskName);
jsonObject.put("callbackUri", callbackUri);
JSONArray extraJobs = new JSONArray();
JSONObject jsonJobs = new JSONObject();
JSONObject jsonOption = new JSONObject();
//extraJobs의 Option 항목 셋팅 해주기
jsonOption.put("url", textSenseVO.getUrl());
jsonOption.put("reqType", textSenseVO.getReqType());
jsonOption.put("reqOption", "");
jsonOption.put("outputType", textSenseVO.getOutputType());
//extraJobs 셋팅해주기
jsonJobs.put("type", textSenseVO.getType());
jsonJobs.put("option", jsonOption);
extraJobs.add(jsonJobs);
jsonObject.put("extraJobs", extraJobs);
System.out.println("+++++++++++++++++ json ::: "+jsonObject.toJSONString());
HttpClient httpClient = HttpClientBuilder.create().build();
HttpPost httpPost = new HttpPost(apiUrl);
httpPost.setEntity(new StringEntity(jsonObject.toString(), "UTF-8"));
httpPost.addHeader("Content-type", "application/json");
httpPost.addHeader("Accept", "application/json");
HttpResponse response = httpClient.execute(httpPost);
String result = "";
String statusCode = Integer.toString(response.getStatusLine().getStatusCode());
if(statusCode.equals("200")) {
result = EntityUtils.toString(response.getEntity());
result = new String(result.getBytes("iso-8859-1"));//한글 깨짐 현상이 있어서 변환 해줌.
JSONParser parser = new JSONParser();
Object obj = parser.parse(result);
JSONObject object = (JSONObject) obj;
System.out.println("result ::: "+result);
returnJson = object;
returnJson.put("resultSts", "success");
}else {
returnJson.put("resultSts", "fail");
}
} catch (Exception e) {
System.out.println("++++++++++++++++ getTextSenseRequest Error!!! "+e);
returnJson.put("resultSts", "fail");
}
return returnJson;
}
}

View File

@ -0,0 +1,312 @@
package kcc.kccadr.textsense.web;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import kcc.com.cmm.LoginVO;
import kcc.com.cmm.service.EgovFileMngService;
import kcc.com.cmm.service.EgovFileMngUtil;
import kcc.com.cmm.service.FileVO;
import kcc.kccadr.textsense.service.TextSenseService;
import kcc.kccadr.textsense.service.TextSenseVO;
import kcc.let.utl.fcc.service.EgovStringUtil;
@Controller
public class TextSenseController {
@Resource(name = "EgovFileMngUtil")
private EgovFileMngUtil fileUtil;
@Resource(name = "EgovFileMngService")
private EgovFileMngService fileMngService;
@Resource(name = "TextSenseService")
private TextSenseService textSenseService;
@Value("#{globalSettings['Globals.textSense.apiUrl']}")
private String textSenseApiUrl;
@RequestMapping(value="/kccadr/textsence/selectTextSenseList.do")
public String selectTextSenseList(@ModelAttribute("searchVO")TextSenseVO textSenseVO, ModelMap model) throws Exception{
LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
if(user == null) {
return "redirect:/uat/uia/EgovLoginUsr.do";
}
if(textSenseVO.getPageUnit() != 10) {
textSenseVO.setPageUnit(textSenseVO.getPageUnit());
}
if("".equals(textSenseVO.getSearchSortCnd())){
textSenseVO.setSearchSortCnd("frstRegistPnttm");
textSenseVO.setSearchSortOrd("desc");
}
/** paging */
PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(textSenseVO.getPageIndex());
paginationInfo.setRecordCountPerPage(textSenseVO.getPageUnit());
paginationInfo.setPageSize(textSenseVO.getPageSize());
textSenseVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
textSenseVO.setLastIndex(paginationInfo.getLastRecordIndex());
textSenseVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
textSenseVO.setFrstRegisterId(user.getId());
paginationInfo.setTotalRecordCount(textSenseService.selectTextSenseListCount(textSenseVO));
model.addAttribute("paginationInfo", paginationInfo);
List<TextSenseVO> list = textSenseService.selectTextSenseList(textSenseVO);
model.addAttribute("list", list);
return "kccadr/textSense/EgovTextSenseList";
}
/*
* TextSense OCR 등록화면 호출
*
* */
@RequestMapping(value="/kccadr/textsence/selectTextSenseRegist.do")
public String selectTextSenseRegist(@ModelAttribute("searchVO")TextSenseVO textSenseVO) throws Exception{
LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
if(user == null) {
return "redirect:/uat/uia/EgovLoginUsr.do";
}
return "kccadr/textSense/EgovTextSenseRegist";
}
/*
* TextSense OCR 상세화면 호출
*
* */
@RequestMapping(value="/kccadr/textsence/selectTextSenseDetail.do")
public String selectTextSenseDetail(@ModelAttribute("searchVO")TextSenseVO textSenseVO, ModelMap model) throws Exception{
System.out.println("++++++++++++++++++++"+textSenseVO.getId());
LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
if(user == null) {
return "redirect:/uat/uia/EgovLoginUsr.do";
}
textSenseVO.setFrstRegisterId(user.getId());
TextSenseVO resultVO = textSenseService.selectTextSenseDetail(textSenseVO);
model.addAttribute("textSenseVO", resultVO);
return "kccadr/textSense/EgovTextSenseDetail";
}
/*
* TextSense OCR API 요청처리해주기
*
*
*
* */
@SuppressWarnings("unchecked")
@RequestMapping(value="/kccadr/textsence/textSenseRequestAjax.do")
public ModelAndView textSenseRequest(final MultipartHttpServletRequest multiRequest, TextSenseVO textSenseVO) throws Exception{
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
if(user == null) {
modelAndView.addObject("status", "loginFail");
return modelAndView;
}
//첨부파일 등록 API 전송 요청
final Map<String, MultipartFile> files = multiRequest.getFileMap();
String atchFileId = "";
String isThumbFile = "";
List<String> extList = new ArrayList<String>();
extList.add("jpg");
extList.add("jpeg");
extList.add("png");
extList.add("tif");
extList.add("tiff");
extList.add("multi-tiff");
extList.add("pdf");
extList.add("bmp");
//알림톡 템플릿에 이미지가 포함되어 있는 경우 처리
if (!files.isEmpty()){
if ("".equals(atchFileId)) {
List<FileVO> result = fileUtil.parseFileInf(files, "TSOCR_", 0, atchFileId, "", isThumbFile);
for(FileVO fileVO : result) {
String fileExt = fileVO.getFileExtsn();
//파일 확장자 체크
if(!extList.contains(fileExt)) {
modelAndView.addObject("result", "fail");
return modelAndView;
}
}
//파일 정보 디비에 저장
atchFileId = fileMngService.insertFileInfs(result);
System.out.println("++++++++++++++ atchFileId ::: "+atchFileId);
}
}
//TextSense API 요청 처리
TextSenseVO apiTextSenseVO = new TextSenseVO();
String outputFileNm = "ePapy_" + EgovStringUtil.getTimeStamp() + "_OCR.json";
String apiUrl = textSenseApiUrl + "/textsense/api/job/build";
String taskName = textSenseVO.getTaskName();
apiTextSenseVO.setApiUrl(apiUrl);
apiTextSenseVO.setInputUri("http://119.193.215.98:8097/cmm/fms/FileDown.do?atchFileId="+ atchFileId +"&fileSn=0"); //http://119.193.215.98:8097/kccadrPb/usr/image/common/top_logo.png
apiTextSenseVO.setOutputUri("file:/home/kcc_adr_ocr_dir/" + outputFileNm);
apiTextSenseVO.setCallbackUri("http://119.193.215.98:8097/kccadr/textsence/testCallbackUriPage.do");
apiTextSenseVO.setTaskName(taskName);
//extraJobs의 Option 항목 셋팅 해주기
apiTextSenseVO.setUrl(textSenseApiUrl);
apiTextSenseVO.setReqType("document"); //고정값으로 변경 불가
apiTextSenseVO.setReqOption(""); //기본값으로 빈값을 넣어준다.
apiTextSenseVO.setOutputType("json"); //지원하는 output type은 pdf, json, excel, text, text-split 입니다
apiTextSenseVO.setType("textSense"); //고정값으로 변경 불가
JSONObject resultJson = TextSenseAPIComm.getTextSenseRequest(apiTextSenseVO);
System.out.println("==========Controller============== resultJson ::: "+resultJson.toJSONString());
//처리 결과가 성공이면 디비에 저장해주고 끝낸다.
String resultSts = resultJson.get("resultSts").toString();
if(resultSts.equals("success")) {
//요청 결과내용 데이터베이스에 저장
TextSenseVO resultJsVO = new TextSenseVO();
String id = resultJson.get("id").toString();
String status = resultJson.get("status").toString();
taskName = resultJson.get("name").toString();
resultJsVO.setId(id);
resultJsVO.setTaskName(taskName);
resultJsVO.setStatus(status);
resultJsVO.setInputUri(apiTextSenseVO.getInputUri());
resultJsVO.setOutputUri(apiTextSenseVO.getOutputUri());
resultJsVO.setCallbackUri(apiTextSenseVO.getCallbackUri());
resultJsVO.setFrstRegisterId(user.getId());
int resultCnt = textSenseService.insertTextSenseRequestResultInfo(resultJsVO);
System.out.println("+++++++++++++++++ resultCnt ::: "+resultCnt);
modelAndView.addObject("result", "success");
modelAndView.addObject("id", id);
modelAndView.addObject("name", taskName);
modelAndView.addObject("status", status);
}else {
modelAndView.addObject("result", "fail");
}
return modelAndView;
}
@RequestMapping(value="/kccadr/textsence/testCallbackUriPage.do")
public void testCallbackUriPage(HttpServletRequest req, HttpServletResponse res, @RequestBody JSONObject jsonObject) throws Exception{
System.out.println("++++++++++++++++++++++++++/web/main/textsence/testCallbackUriPage.do++++++++++++++++++++++++++++++++++");
System.out.println("+++++++++++ jsonString ::: "+jsonObject.toJSONString());
JSONParser parser = new JSONParser();
Object obj = parser.parse(jsonObject.toString());
JSONObject object = (JSONObject) obj;
String id = object.get("id").toString();
String name = object.get("name").toString();
String inputUri = object.get("inputUri").toString();
String inputFileLength = object.get("inputFileLength").toString();
String outputUri = object.get("outputUri").toString();
String outputFileLength = object.get("outputFileLength").toString();
String status = object.get("status").toString();
String createdAt = object.get("createdAt").toString();
//String queuedAt = object.get("queuedAt").toString();
String startedAt = object.get("startedAt").toString();
String completedAt = object.get("completedAt").toString();
//String updatedAt = object.get("updatedAt").toString();
String maxRetryCount = object.get("maxRetryCount").toString();
String retryCount = object.get("retryCount").toString();
String collectedBy = object.get("collectedBy").toString();
String callbackUri = object.get("callbackUri").toString();
System.out.println("+++++++++++++++++++++++ id ::: "+id);
System.out.println("+++++++++++++++++++++++ name ::: "+name);
System.out.println("+++++++++++++++++++++++ inputUri ::: "+inputUri);
System.out.println("+++++++++++++++++++++++ inputFileLength ::: "+inputFileLength);
System.out.println("+++++++++++++++++++++++ outputUri ::: "+outputUri);
System.out.println("+++++++++++++++++++++++ outputFileLength ::: "+outputFileLength);
System.out.println("+++++++++++++++++++++++ status ::: "+status);
System.out.println("+++++++++++++++++++++++ createdAt ::: "+createdAt);
//System.out.println("+++++++++++++++++++++++ queuedAt ::: "+queuedAt);
System.out.println("+++++++++++++++++++++++ startedAt ::: "+startedAt);
System.out.println("+++++++++++++++++++++++ completedAt ::: "+completedAt);
//System.out.println("+++++++++++++++++++++++ updatedAt ::: "+updatedAt);
System.out.println("+++++++++++++++++++++++ maxRetryCount ::: "+maxRetryCount);
System.out.println("+++++++++++++++++++++++ retryCount ::: "+retryCount);
System.out.println("+++++++++++++++++++++++ collectedBy ::: "+collectedBy);
System.out.println("+++++++++++++++++++++++ callbackUri ::: "+callbackUri);
}
}

View File

@ -232,3 +232,5 @@ Globals.Streamdocs.Url=http://192.168.0.176:8085/streamdocs/v4/documents
Globals.BizPpurio.siteUrl=https://dev-api.bizppurio.com Globals.BizPpurio.siteUrl=https://dev-api.bizppurio.com
#\uc2e4\uc11c\ubc84 #\uc2e4\uc11c\ubc84
#Globals.BizPpurio.siteUrl=https://api.bizppurio.com #Globals.BizPpurio.siteUrl=https://api.bizppurio.com
Globals.textSense.apiUrl=http://222.231.43.29:7777

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<sqlMap resource="egovframework/sqlmap/kccadr/textsense/TextSense_SQL_Mysql.xml"/>
</sqlMapConfig>

View File

@ -0,0 +1,114 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Stts">
<typeAlias alias="egovMap" type="egovframework.rte.psl.dataaccess.util.EgovMap"/>
<typeAlias alias="TextSenseVO" type="kcc.kccadr.textsense.service.TextSenseVO"/>
<update id="textSenseDAO.insertTextSenseRequestResultInfo" parameterClass="TextSenseVO">
INSERT
INTO ADR_TEXTSENSE_OCR
(
ID,
TASK_NAME,
INPUT_URI,
OUTPUT_URI,
STATUS,
CALLBACK_URI,
FRST_REGISTER_ID,
FRST_REGIST_PNTTM
)
VALUES
(
#id#
, #taskName#
, #inputUri#
, #outputUri#
, #status#
, #callbackUri#
, #frstRegisterId#
, NOW()
)
</update>
<select id="textSenseDAO.selectTextSenseList" parameterClass="TextSenseVO" resultClass="TextSenseVO">
SELECT A.ID AS id,
A.TASK_NAME AS taskName,
A.INPUT_URI AS inputUri,
A.OUTPUT_URI AS outputUri,
A.INPUT_FILE_LENGTH AS inputFileLenth,
A.OUTPUT_FILE_LENGTH AS outputfileLength,
A.STATUS AS status,
A.CREATEDAT AS createdat,
A.QUEUEDAT AS queuedat,
A.STARTEDAT AS startdat,
A.COMPLETEDAT AS completedat,
A.UPDATEDAT AS updatedat,
A.MAX_RETRY_COUNT AS maxRetryCount,
A.RETRY_COUNT AS retryCount,
A.COLLECTEDBY AS collectedby,
A.CALLBACK_URI AS callbackUri,
A.EXTERNAL_ID AS externalId,
A.FRST_REGISTER_ID AS frstRegisterId,
DATE_FORMAT(A.FRST_REGIST_PNTTM,'%Y-%m-%d %T') AS frstRegistPnttm
FROM ADR_TEXTSENSE_OCR A
WHERE 1=1
AND A.FRST_REGISTER_ID = #frstRegisterId#
<isNotEmpty property="searchKeyword">
<isEqual prepend="AND" property="searchCondition" compareValue="1">
TASK_NAME LIKE CONCAT('%' , #searchKeyword#, '%')
</isEqual>
</isNotEmpty>
ORDER BY A.FRST_REGIST_PNTTM DESC
LIMIT #recordCountPerPage# OFFSET #firstIndex#
</select>
<select id="textSenseDAO.selectTextSenseListCount" parameterClass="TextSenseVO" resultClass="Integer">
SELECT COUNT(A.ID)
FROM ADR_TEXTSENSE_OCR A
WHERE 1=1
AND A.FRST_REGISTER_ID = #frstRegisterId#
<isNotEmpty property="searchKeyword">
<isEqual prepend="AND" property="searchCondition" compareValue="1">
TASK_NAME LIKE CONCAT('%' , #searchKeyword#, '%')
</isEqual>
</isNotEmpty>
</select>
<select id="textSenseDAO.selectTextSenseDetail" parameterClass="TextSenseVO" resultClass="TextSenseVO">
SELECT A.ID AS id,
A.TASK_NAME AS taskName,
A.INPUT_URI AS inputUri,
A.OUTPUT_URI AS outputUri,
A.INPUT_FILE_LENGTH AS inputFileLenth,
A.OUTPUT_FILE_LENGTH AS outputFileLenth,
A.STATUS AS status,
A.CREATEDAT AS createdat,
A.QUEUEDAT AS queuedat,
A.STARTEDAT AS startdat,
A.COMPLETEDAT AS completedat,
A.UPDATEDAT AS updatedat,
A.MAX_RETRY_COUNT AS maxRetryCount,
A.RETRY_COUNT AS retryCount,
A.COLLECTEDBY AS collectedby,
A.CALLBACK_URI AS callbackUri,
A.EXTERNAL_ID AS externalId,
A.FRST_REGISTER_ID AS frstRegisterId,
DATE_FORMAT(A.FRST_REGIST_PNTTM,'%Y-%m-%d %T') AS frstRegistPnttm
FROM ADR_TEXTSENSE_OCR A
WHERE 1=1
AND A.FRST_REGISTER_ID = #frstRegisterId#
AND A.ID = #id#
</select>
</sqlMap>

View File

@ -0,0 +1,235 @@
<%--
Class Name : EgovTextSenseDetail.jsp
Description : TextSense OCR 상세화면
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2023.09.27 우영두 최초 생성
author : 공통서비스 개발팀 JJY
since : 2023.09.27
--%>
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
<%@ taglib prefix="double-submit" uri="http://www.egovframe.go.kr/tags/double-submit/jsp" %>
<%@ taglib prefix="kc" uri="/WEB-INF/tlds/kcc_tld.tld"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Language" content="ko" >
<title>OCR 상세화면</title>
<script type="text/javascript" src="<c:url value="/validator.do"/>"></script>
<script type="text/javascript" src="<c:url value='/js/EgovCmmUtl.js'/>" ></script>
<script type="text/javaScript" language="javascript" defer="defer">
function fnListPage(){
document.textSenseVO.action = "<c:url value='/kccadr/textsence/selectTextSenseList.do'/>";
document.textSenseVO.submit();
}
</script>
<style>
.tbType02 .radio_wrap input[type=radio] + label {margin-right:15px;}
</style>
</head>
<body>
<form id="textSenseVO" name="textSenseVO" method="post">
<input type="hidden" name="pageIndex" value="1"/>
<!-- cont -->
<div class="cont_wrap">
<div class="box">
<!-- cont_tit -->
<div class="cont_tit">
<h2>관리자수정</h2>
<ul class="cont_nav">
<li class="home"><a href="/"><i></i></a></li>
<li>
<p>OCR 관리</p>
</li>
<li><span class="cur_nav">OCR 상세</span></li>
</ul>
</div>
<!-- //cont_tit -->
<div class="cont">
<!-- list_상세 -->
<div class="tbType02">
<table>
<colgroup>
<col style="width: 20%">
<col style="width: 80%">
</colgroup>
<tbody>
<tr>
<th><span class="reqArea">OCR ID</span></th>
<td colspan="3">
<c:out value="${textSenseVO.id}"/>
</td>
</tr>
<tr>
<th><span class="reqArea">Task Name</span></th>
<td colspan="3">
<c:out value="${textSenseVO.taskName}"/>
</td>
</tr>
<tr>
<th><span class="reqArea">Input URI</span></th>
<td colspan="3">
<c:out value="${textSenseVO.inputUri}"/>
</td>
</tr>
<tr>
<th>Output URI</th>
<td colspan="3">
<c:out value="${textSenseVO.outputUri}"/>
</td>
</tr>
<tr>
<th>Callback URI</th>
<td colspan="3">
<c:out value="${textSenseVO.callbackUri}"/>
</td>
</tr>
<tr>
<th>Input 파일 길이</th>
<td colspan="3">
<c:choose>
<c:when test="${not empty textSenseVO.inputFileLenth}">
<c:out value="${textSenseVO.inputFileLenth}"/>
</c:when>
<c:otherwise>
-
</c:otherwise>
</c:choose>
</td>
</tr>
<tr>
<th>Output 파일 길이</th>
<td colspan="3">
<c:choose>
<c:when test="${not empty textSenseVO.outputFileLenth}">
<c:out value="${textSenseVO.outputFileLenth}"/>
</c:when>
<c:otherwise>
-
</c:otherwise>
</c:choose>
</td>
</tr>
<tr>
<th>진행상태</th>
<td colspan="3">
<c:choose>
<c:when test="${textSenseVO.status eq 'AWAITING'}">
변환중
</c:when>
<c:when test="${textSenseVO.status eq 'SUCCESS'}">
처리완료
</c:when>
<c:otherwise>
처리실패
</c:otherwise>
</c:choose>
</td>
</tr>
<tr>
<th>요청 작업 생성 시간</th>
<td colspan="3">
<c:choose>
<c:when test="${not empty textSenseVO.createdat}">
<c:out value="${textSenseVO.createdat}"/>
</c:when>
<c:otherwise>
-
</c:otherwise>
</c:choose>
</td>
</tr>
<tr>
<th>대기상태로 변경된 시간</th>
<td colspan="3">
<c:choose>
<c:when test="${not empty textSenseVO.queuedat}">
<c:out value="${textSenseVO.queuedat}"/>
</c:when>
<c:otherwise>
-
</c:otherwise>
</c:choose>
</td>
</tr>
<tr>
<th>변환작업 시작 시간</th>
<td colspan="3">
<c:choose>
<c:when test="${not empty textSenseVO.startdat}">
<c:out value="${textSenseVO.startdat}"/>
</c:when>
<c:otherwise>
-
</c:otherwise>
</c:choose>
</td>
</tr>
<tr>
<th>변환작업 완료 시간</th>
<td colspan="3">
<c:choose>
<c:when test="${not empty textSenseVO.completedat}">
<c:out value="${textSenseVO.completedat}"/>
</c:when>
<c:otherwise>
-
</c:otherwise>
</c:choose>
</td>
</tr>
<tr>
<th>변환작업 재시도 횟수</th>
<td colspan="3">
<c:choose>
<c:when test="${not empty textSenseVO.retryCount}">
<c:out value="${textSenseVO.retryCount}"/>
</c:when>
<c:otherwise>
-
</c:otherwise>
</c:choose>
</td>
</tr>
<tr>
<th>등록일자</th>
<td colspan="3">
<c:out value="${textSenseVO.frstRegistPnttm}"/>
</td>
</tr>
</tbody>
</table>
</div>
<!-- //list_상세 -->
<div class="btn_wrap btn_layout01">
<button class="btnType03" onclick="fnListPage(); return false;">목 록</button>
</div>
</div>
</div>
</div>
</div>
<!-- //cont -->
</form>
</body>
</html>

View File

@ -0,0 +1,176 @@
<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
<%@ taglib prefix="kc" uri="/WEB-INF/tlds/kcc_tld.tld"%>
<%
/**
* @Class Name : EgovTextSenseList.jsp
* @Description : OCR 관리 리스트
* @Modification Information
* @
* @ 수정일 수정자 수정내용
* @ ------- -------- ---------------------------
* @ 2023.09.26 우영두 최초 생성
* @author 우영두
* @since 2023.09.26
* @version 1.0
* @see
*
*/
%>
<html lang="ko">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style>
</style>
<script type="text/javascript">
function fncGoList(){
linkPage(1);
}
function linkPage(pageNo){
var listForm = document.listForm ;
listForm.pageIndex.value = pageNo ;
listForm.searchCondition.value = $('#searchCondition').val();
listForm.searchKeyword.value = $('#searchKeyword').val();
listForm.action = "<c:url value='/kccadr/textsence/selectTextSenseList.do'/>";
listForm.submit();
}
function fncTextSenseReg() {
location.href="/kccadr/textsence/selectTextSenseRegist.do";
}
function goTextSenseDetail(id){
var form = document.listForm;
form.id.value = id;
form.action="/kccadr/textsence/selectTextSenseDetail.do";
form.submit();
}
</script>
<title>OCR 목록</title>
</head>
<body>
<form id="listForm" name="listForm" method="post">
<input type="hidden" name="pageIndex" value="<c:out value='${searchVO.pageIndex}' default='1' />"/>
<input type="hidden" name="searchSortCnd" value="<c:out value="${searchVO.searchSortCnd}" />" />
<input type="hidden" name="searchSortOrd" value="<c:out value="${searchVO.searchSortOrd}" />" />
<input type="hidden" id="id" name="id" value=""/>
<div class="cont_wrap">
<div class="box">
<!-- cont_tit -->
<div class="cont_tit">
<h2>OCR 목록</h2>
<ul class="cont_nav">
<li class="home">
<a href="/">
<i></i>
</a>
</li>
<li>
<p>OCR 관리</p>
</li>
<li><span class="cur_nav">목록</span></li>
</ul>
</div>
<!-- //cont_tit -->
<div class="cont">
<!-- list_top -->
<div class="list_top">
<div class="list_util">
<div class="detail_search">
<ul>
<li>
<p class="tit_text">구분</p>
<select name="searchCondition" id="searchCondition">
<option value="1" ${searchVO.searchCondition eq '1' ? 'selected' : '' }>TaskName</option>
</select>
<input type="text" id="searchKeyword" name="searchKeyword" class="search_input" placeholder="검색어를 입력하세요" value="<c:out value='${searchVO.searchKeyword}'/>">
<button class="btn_search" onclick="fncGoList(); return false;">검색</button>
</li>
</ul>
</div>
</div>
</div>
<!-- //list_top -->
<!-- list -->
<div class="tbType01">
<table>
<colgroup>
<col style="width: 5%">
<col style="width: auto">
<col style="width: 10%">
<col style="width: 20%">
</colgroup>
<thead>
<tr>
<th>번호<button class="sort btn_sort" id="sort_id"></button></th>
<th>TaskName<button type="button" class="sort sortBtn" id="sort_taskName"></button></th>
<th>처리상태<button type="button" class="sort sortBtn" id="sort_status"></button></th>
<th>등록일자<button type="button" class="sort sortBtn" id="sort_frstRegistPnttm"></button></th>
</tr>
</thead>
<tbody>
<c:forEach var="list" items="${list}" varStatus="status">
<tr onclick="javascript:goTextSenseDetail('<c:out value="${list.id}"/>');" style="cursor:pointer;">
<td>
<c:if test="${searchVO.searchSortOrd eq 'desc' }">
<c:out value="${ ( paginationInfo.totalRecordCount - ((searchVO.pageIndex -1)*searchVO.pageUnit) ) - status.index }"/>
</c:if>
<c:if test="${searchVO.searchSortOrd eq 'asc' }">
<c:out value="${(searchVO.pageIndex - 1) * searchVO.pageUnit + status.count}"/>
</c:if>
</td>
<td><c:out value="${list.taskName}"/></td>
<td>
<c:choose>
<c:when test="${list.status eq 'AWAITING'}">
변환중
</c:when>
<c:when test="${list.status eq 'SUCCESS'}">
처리완료
</c:when>
<c:otherwise>
처리실패
</c:otherwise>
</c:choose>
</td>
<td><c:out value="${list.frstRegistPnttm}"/></td>
</tr>
</c:forEach>
<c:if test="${empty list}">
<tr><td colspan="4"><spring:message code="common.nodata.msg" /></td></tr>
</c:if>
</tbody>
</table>
</div>
<!-- //list -->
<div class="btn_wrap btn_layout02">
<button class="btnType02" onclick="fncTextSenseReg(); return false;">OCR 등록</button>
</div>
<!-- page -->
<div class="page">
<ui:pagination paginationInfo = "${paginationInfo}" type="image" jsFunction="linkPage" />
</div>
<!-- //page -->
</div>
</div>
</div>
<!-- //cont -->
</form>
</body>
</html>

View File

@ -0,0 +1,285 @@
<%--
Class Name : EgovTextSenseRegist.jsp
Description : TextSense 파일 등록화면
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2009.03.24 이삼섭 최초 생성
2011.08.31 JJY 경량환경 버전 생성
author : 공통서비스 개발팀 이삼섭
since : 2009.03.24
--%>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator"%>
<%@ taglib prefix="ckeditor" uri="http://ckeditor.com"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="content-language" content="ko">
<script type="text/javascript" src="<c:url value='/js/EgovBBSMng.js' />"></script>
<script type="text/javascript" src="<c:url value='/js/EgovMultiFileItn.js'/>"></script> <!-- 파일첨부, 썸네일이미지 있으면 미리보기 -->
<script type="text/javascript">
$( document ).ready(function() {
$(function () {
//화면 로딩시 제목 자동 생성
var today = new Date();
var year = today.getFullYear(); // 년도
var month = today.getMonth() + 1; // 월
var date = today.getDate(); // 날짜
var hours = today.getHours(); // 시
var minutes = today.getMinutes(); // 분
var milliseconds = today.getMilliseconds(); // 밀리초
var tkName = "TaskOcr_"+year.toString() + month.toString() + date.toString() + hours.toString() + minutes.toString() + milliseconds.toString();
$('#taskName').val(tkName);
$('#filebutton').click(function (e) {
e.preventDefault();
$('#file_temp').click();
});
});
});
function goTextSenseList() {
location.href="/kccadr/textsence/selectTextSenseList.do";
}
function fn_egov_regist() {
var form = document.textForm;
var data = new FormData(form);
//첨부파일 등록 처리
_fileForm2.forEach(function(obj, idx) {
if (obj) data.append("file"+idx, obj.fileObj);
});
if(!confirm("OCR 처리 요청을 진행하시겠습니까?")) return false;
$.ajax({
type: "POST",
enctype: 'multipart/form-data',
url: "/kccadr/textsence/textSenseRequestAjax.do",
data: data,
dataType:'json',
async: false,
processData: false,
contentType: false,
cache: false,
success: function (returnData, status) {
if(status == 'success'){
var result = returnData.result;
if(result == 'loginFail'){
alert("로그인이 필요합니다.");
return false;
}else if(result == 'success'){
alert("OCR 처리요청이 완료되었습니다. 감사합니다.");
goTextSenseList();
}
} else if(status== 'fail'){
alert("저장에 실패하였습니다.");
}
},
error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
});
}
function goList() {
document.searchForm.action = "<c:url value='/cop/bbs/selectBoardList.do'/>";
document.searchForm.submit();
}
function fn_egov_regist_preview() {
var PCC_window = window.open('', 'PCCV3Window', 'width=850, height=570, resizable=1, scrollbars=yes, status=0, titlebar=0, toolbar=0, left=350, top=50' );
var previewImgs = "";
var i = 0;
$("#DIV_IMG_VIEW").find("img").each(function() {
previewImgs += $(this).get(0).src + "^";
i++;
});
document.board.previewImgs.value = previewImgs;
document.board.action = "<c:url value='/cop/bbs/bbsPreview.do'/>";
document.board.target = "PCCV3Window";
document.board.submit();
}
</script>
<title><c:out value='${bdMstr.bbsNm}' /> - 글 등록</title>
<style>
.uploaded_obj{width: 100%;}
</style>
</head>
<body>
<form id="textForm" name="textForm" method="post" enctype="multipart/form-data">
<!-- 드래그앤 드롭 파라미터 -->
<input type="hidden" name="limitcount" value="1" />
<!-- cont -->
<div class="cont_wrap">
<div class="box">
<!-- cont_tit -->
<div class="cont_tit">
<h2>OCR 등록 </h2>
<ul class="cont_nav">
<li class="home"><a href="/"><i></i></a></li>
<li>
<p>OCR관리</p>
</li>
<li><span class="cur_nav">등록</span></li>
</ul>
</div>
<!-- //cont_tit -->
<div class="cont">
<!-- list_상세 -->
<div class="tbType02">
<table>
<colgroup>
<col style="width: 20%">
<col style="width: 80%">
</colgroup>
<tbody>
<tr>
<th><span class="reqArea">
<span class="reqArea">제목</span>
</span>
</th>
<td colspan="3">
<input type="text" id="taskName" name="taskName" value="" style="width:250px;" readonly/>
</td>
</tr>
<tr>
<th class="req_text">
<p>첨부파일</p>
</th>
<td class="upload_area">
<!-- <input type="text" id="fileNm" size="30" class="file_input" readonly> --><!-- <button type="button" class="btnType01 btn_add_file">파일 첨부하기</button> -->
<input type="file" id="file_temp" name="file_temp" class="uploadFile" style="display:none"/>
<button type="button" id="filebutton" class="btnType01 btn_add_file">파일 첨부하기</button>
<div class="file_wrap file_upload_box no_img_box">
<table class="tbType02">
<caption>첨부파일 리스트 : 파일명, 종류, 크기, 삭제</caption>
<colgroup>
<col style="width: 60%;">
<col style="width: auto;">
<col style="width: 20%;">
<col style="width: 10%;">
</colgroup>
<thead>
<!-- <th>
<input type="checkbox" id="all_check"><label for="all_check"></label>
</th> -->
<th>파일 명</th>
<th>종류</th>
<th>크기</th>
<th>삭제</th>
</thead>
<tbody class="tb_file_before">
<tr>
<td colspan="4">
<p>첨부하실 파일을 <span>마우스로 끌어서</span> 넣어주세요.</p>
</td>
</tr>
</tbody>
</table>
</div>
<div class="file_wrap fileAfter file_list_div">
<table class="tbType02">
<caption>첨부파일 리스트 : 파일명, 종류, 크기, 삭제</caption>
<colgroup>
<col style="width: 60%">
<col style="width: 10%">
<col style="width: 20%">
<col style="width: 10%">
</colgroup>
<thead>
<!-- <th>
<input type="checkbox" id="all_check"><label for="all_check"></label>
</th> -->
<th>파일 명</th>
<th>종류</th>
<th>크기</th>
<th>삭제</th>
</thead>
<tbody id="tbody_fiielist" class="tb_file_after">
<c:forEach var="fileList" items="${fileList}" varStatus="status">
<tr class="item_<c:out value='${fileList.atchFileId}' />_<c:out value='${fileList.fileSn}' /> uploaded_obj">
<input type="hidden" name="fileSize" class="item_file_size" value="${fileList.fileSize}">
<td class="td_filename">
<!-- <img src="/direct/img/upload_hwp_img.png" alt="" /> -->
<span class="file_name_text"><c:out value='${fileList.orignlFileNm}' /></span>
</td>
<td class="td_filesort">
<span class="file_filesort_text" value="<c:out value="${fileList.fileExtsn}"/>"><c:out value="${fileList.fileExtsn}"/></span>
</td>
<td class="td_filesize">
<span class="file_size_text" value="<c:out value="${fileList.fileMg}"/>"><c:out value="${fileList.fileMg}"/></span>
</td>
<td>
<button type="button" class="btn_del" onclick="delAtchFile('<c:out value='${fileList.atchFileId}' />', '<c:out value='${fileList.fileSn}' />'); return false;" title="파일삭제"><i></i></button>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- //list_상세 -->
<!-- btn_wrap -->
<div class="btn_wrap btn_layout01">
<div class="area_left">
</div>
<div class="area_right">
<!-- <button class="btnType04" onclick="fn_egov_regist_preview(); return false;">미리보기</button> -->
<c:if test="${!empty fmsFileList[0].fmsId }">
<button class="btnType06" onclick="goSave('fmsFile_U'); return false;">수 정</button>
<button class="btnType06" onclick="fn_fmsfile_delete(); return false;">삭 제</button>
</c:if>
<c:if test="${empty fmsFileList[0].fmsId }">
<button class="btnType06" onclick="fn_egov_regist(); return false;">등 록</button>
</c:if>
<button class="btnType04" onclick="goTextSenseList(); return false;">목 록</button>
</div>
</div>
<!-- //btn_wrap -->
</div>
</div>
</div>
<!-- //cont -->
</form>
<!-- //content 끝 -->
</body>
</html>