From 258bb70a9349342cc8a463d0101433bb3a778e5f Mon Sep 17 00:00:00 2001 From: eastargh Date: Fri, 28 Aug 2026 13:57:41 +0900 Subject: [PATCH] =?UTF-8?q?eCams=20=EC=97=B0=EB=8F=99=EC=8B=9C=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../onl/admin/rule/layoutSyncHistoryMan.jsp | 18 +- .../history/LayoutSyncHistoryService.java | 6 + .../loader/controller/LoaderController.java | 241 ++++++++++-------- .../eai/rms/onl/loader/dao/LoaderDao.java | 5 + .../eai/rms/onl/loader/dao/LoaderDaoImpl.java | 9 +- .../service/TransactionLoaderService.java | 12 +- .../service/TransactionLoaderServiceImpl.java | 30 +++ .../history/ui/LayoutSyncHistoryUISearch.java | 6 + 8 files changed, 214 insertions(+), 113 deletions(-) diff --git a/WebContent/jsp/onl/admin/rule/layoutSyncHistoryMan.jsp b/WebContent/jsp/onl/admin/rule/layoutSyncHistoryMan.jsp index d02f75c..1ab6a22 100644 --- a/WebContent/jsp/onl/admin/rule/layoutSyncHistoryMan.jsp +++ b/WebContent/jsp/onl/admin/rule/layoutSyncHistoryMan.jsp @@ -47,7 +47,7 @@ mtype: 'POST', url: url, postData: getSearchForJqgrid("cmd", "LIST"), - colNames: ['No', 'Service Name', 'Command', '레이아웃명', '연동시간', '결과', '결과메세지'], + colNames: ['No', '서비스명', 'Command', '연동구분명', '연동시간', '결과', '결과메세지'], colModel: [ {name: 'seqno', align: 'center', width: 50, sortable: false}, {name: 'serviceName', align: 'center', width: 100, sortable: false}, @@ -123,8 +123,8 @@
-
전문레이아웃 연동 이력IIM에서 연동한 인터페이스 및 전문 레이아웃 이력을 조회합니다.
-
+
연동 배포 이력IIM 레이아웃 연동 이력과 eCams 인터페이스 배포 이력을 조회합니다.
+ @@ -133,8 +133,6 @@ - - + + + + + + + + +
레이아웃명 연동시간 @@ -143,6 +141,14 @@ + 서비스명Command
연동구분명 결과
@@ -153,6 +159,8 @@
diff --git a/src/main/java/com/eactive/eai/rms/data/entity/onl/layoutsync/history/LayoutSyncHistoryService.java b/src/main/java/com/eactive/eai/rms/data/entity/onl/layoutsync/history/LayoutSyncHistoryService.java index 68c4ffa..7fa2d18 100644 --- a/src/main/java/com/eactive/eai/rms/data/entity/onl/layoutsync/history/LayoutSyncHistoryService.java +++ b/src/main/java/com/eactive/eai/rms/data/entity/onl/layoutsync/history/LayoutSyncHistoryService.java @@ -31,6 +31,12 @@ public class LayoutSyncHistoryService extends AbstractDataService optSpecInfo = apiSpecInfoService.findById(interfaceId); + if (optSpecInfo.isPresent()) { + ApiSpecInfoUI specInfo = apiSpecUIMapper.mapToUI(optSpecInfo.get()); + specInfo.setCreatedBy(null); + specInfo.setCreatedDate(null); + specInfo.setLastModifiedBy(null); + specInfo.setLastModifiedDate(null); + interfaceDeployPack.setSpecInfo(specInfo); + } + + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.registerModule(new JavaTimeModule()); + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + ObjectWriter writer = objectMapper.writerWithDefaultPrettyPrinter(); + String bizCode = eaiMessageDeploy.getEaibzwkdstcd(); + String ioMapPath = monitoringContext.getStringProperty(MonitoringContext.IOMAP_DOWNLOAD_PATH); + String fileDir = FilenameUtils.concat(ioMapPath, bizCode); + String fileFullPath = FilenameUtils.concat(fileDir, interfaceId+".json"); + + FileWriteUtil.makeDirWithGroupPermission(fileDir); + File file = new File(fileFullPath); + json = writer.writeValueAsString(interfaceDeployPack); + FileUtils.writeStringToFile(file, json, StandardCharsets.UTF_8); + + // TSEAITR10 배포 이력 저장 (SERVICENAME=eCams, COMMAND=downloadfull, LOUTNAME=interfaceId, RECVDATA=json) + loaderService.insertDeploySyncLog(dt, "downloadfull", interfaceId, json); + + Map result = new HashMap<>(); + result.put("status", "success"); + result.put("message", fileFullPath+" write done."); + + return new ModelAndView(resultView, "result", result); + } catch (Exception e) { + logger.error("interface downloadfull error - interfaceId=" + interfaceId, e); + loaderService.insertDeployFailLog(dt, "downloadfull", interfaceId, json, e.toString()); + + Map result = new HashMap<>(); + result.put("status", "fail"); + result.put("message", e.toString()); + + return new ModelAndView(resultView, "result", result); } - - // 4. API 스펙 정보(ptl_api_spec_info) 추가 (감사(audit) 컬럼은 제외) - Optional optSpecInfo = apiSpecInfoService.findById(interfaceId); - if (optSpecInfo.isPresent()) { - ApiSpecInfoUI specInfo = apiSpecUIMapper.mapToUI(optSpecInfo.get()); - specInfo.setCreatedBy(null); - specInfo.setCreatedDate(null); - specInfo.setLastModifiedBy(null); - specInfo.setLastModifiedDate(null); - interfaceDeployPack.setSpecInfo(specInfo); - } - - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.registerModule(new JavaTimeModule()); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - ObjectWriter writer = objectMapper.writerWithDefaultPrettyPrinter(); - String bizCode = eaiMessageDeploy.getEaibzwkdstcd(); - String ioMapPath = monitoringContext.getStringProperty(MonitoringContext.IOMAP_DOWNLOAD_PATH); - String fileDir = FilenameUtils.concat(ioMapPath, bizCode); - String fileFullPath = FilenameUtils.concat(fileDir, interfaceId+".json"); - - FileWriteUtil.makeDirWithGroupPermission(fileDir); - File file = new File(fileFullPath); - writer.writeValue(file, interfaceDeployPack); - - Map result = new HashMap<>(); - String status = "success"; - result.put("status", status); - result.put("message", fileFullPath+" write done."); - - return new ModelAndView(resultView, "result", result); } /** @@ -1533,57 +1548,73 @@ public class LoaderController implements InterceptorSkipController { * @throws Exception */ @RequestMapping( params ={"cmd=interface","control=uploadfull"}) - public ModelAndView interfaceLoadFully(String serviceType, String filePath) throws Exception { + public ModelAndView interfaceLoadFully(String serviceType, String filePath) { DataSourceType dt = DataSourceTypeManager.getDataSourceType(serviceType); DataSourceContextHolder.setDataSourceType(dt); - String ioMapPath = monitoringContext.getStringProperty(MonitoringContext.IOMAP_UPLOAD_PATH); - String fileFullPath ; - if(StringUtils.isBlank(ioMapPath)) { - fileFullPath = filePath; - } else { - fileFullPath = FilenameUtils.concat(ioMapPath, filePath); - } - - File file = new File(fileFullPath); - InputStream inputStream = new FileInputStream(file); - // ObjectMapper 생성 및 설정 - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.registerModule(new JavaTimeModule()); - InterfaceDeployPack interfaceDeployPack = objectMapper.readValue(inputStream, InterfaceDeployPack.class); - - EAIMessageDeploy eaiMessageDeploy = interfaceDeployPack.getEaiMessageDeploy(); - - interfaceDeployService.saveDeploy(eaiMessageDeploy); - agentUtilService.broadcast(new CommonCommand("com.ext.eai.agent.stdmessage.ReloadSTDMessageCommand", "ALL")); - agentUtilService.broadcast(new CommonCommand("com.eactive.eai.agent.eaimessage.ReloadEAIMessageCommand", eaiMessageDeploy.getEaisvcname())); - - for(LayoutDeploy layoutDeploy: interfaceDeployPack.getLayoutDeployList()){ - layoutDeployService.saveDeploy(layoutDeploy); - agentUtilService.broadcast(new CommonCommand( "com.eactive.eai.agent.transformer.ReloadLayoutCommand", layoutDeploy.getLoutname())); - } - - for(TransformDeploy transformDeploy : interfaceDeployPack.getTransformDeployList()){ - transformDeployService.saveDeploy(transformDeploy); - agentUtilService.broadcast(new CommonCommand( "com.eactive.eai.agent.transformer.ReloadTransformCommand", transformDeploy.getCnvsnname())); - } - - ApiSpecInfoUI specInfoUI = interfaceDeployPack.getSpecInfo(); - if (specInfoUI != null && StringUtils.isNotBlank(specInfoUI.getApiId())) { - ApiSpecInfo specInfo = apiSpecUIMapper.mapToEntity(specInfoUI); - if (apiSpecInfoService.findById(specInfo.getApiId()).isPresent()) { - apiSpecInfoService.updateById(specInfo.getApiId(), specInfo); + String json = ""; + String loutName = filePath; + try { + String ioMapPath = monitoringContext.getStringProperty(MonitoringContext.IOMAP_UPLOAD_PATH); + String fileFullPath ; + if(StringUtils.isBlank(ioMapPath)) { + fileFullPath = filePath; } else { - apiSpecInfoService.create(specInfo); + fileFullPath = FilenameUtils.concat(ioMapPath, filePath); } + + File file = new File(fileFullPath); + json = FileUtils.readFileToString(file, StandardCharsets.UTF_8); + // ObjectMapper 생성 및 설정 + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.registerModule(new JavaTimeModule()); + InterfaceDeployPack interfaceDeployPack = objectMapper.readValue(json, InterfaceDeployPack.class); + + EAIMessageDeploy eaiMessageDeploy = interfaceDeployPack.getEaiMessageDeploy(); + loutName = eaiMessageDeploy.getEaisvcname(); + + interfaceDeployService.saveDeploy(eaiMessageDeploy); + agentUtilService.broadcast(new CommonCommand("com.ext.eai.agent.stdmessage.ReloadSTDMessageCommand", "ALL")); + agentUtilService.broadcast(new CommonCommand("com.eactive.eai.agent.eaimessage.ReloadEAIMessageCommand", eaiMessageDeploy.getEaisvcname())); + + for(LayoutDeploy layoutDeploy: interfaceDeployPack.getLayoutDeployList()){ + layoutDeployService.saveDeploy(layoutDeploy); + agentUtilService.broadcast(new CommonCommand( "com.eactive.eai.agent.transformer.ReloadLayoutCommand", layoutDeploy.getLoutname())); + } + + for(TransformDeploy transformDeploy : interfaceDeployPack.getTransformDeployList()){ + transformDeployService.saveDeploy(transformDeploy); + agentUtilService.broadcast(new CommonCommand( "com.eactive.eai.agent.transformer.ReloadTransformCommand", transformDeploy.getCnvsnname())); + } + + ApiSpecInfoUI specInfoUI = interfaceDeployPack.getSpecInfo(); + if (specInfoUI != null && StringUtils.isNotBlank(specInfoUI.getApiId())) { + ApiSpecInfo specInfo = apiSpecUIMapper.mapToEntity(specInfoUI); + if (apiSpecInfoService.findById(specInfo.getApiId()).isPresent()) { + apiSpecInfoService.updateById(specInfo.getApiId(), specInfo); + } else { + apiSpecInfoService.create(specInfo); + } + } + + // TSEAITR10 배포 이력 저장 (SERVICENAME=eCams, COMMAND=uploadfull, LOUTNAME=eaisvcname, RECVDATA=json) + loaderService.insertDeploySyncLog(dt, "uploadfull", loutName, json); + + Map result = new HashMap(); + result.put("status", "success"); + result.put("message", fileFullPath+" deploy done."); + + return new ModelAndView(resultView, "result", result); + } catch (Exception e) { + logger.error("interface uploadfull error - filePath=" + filePath, e); + loaderService.insertDeployFailLog(dt, "uploadfull", loutName, json, e.toString()); + + Map result = new HashMap(); + result.put("status", "fail"); + result.put("message", e.toString()); + + return new ModelAndView(resultView, "result", result); } - - Map result = new HashMap(); - String status = "success"; - result.put("status", status); - result.put("message", fileFullPath+" deploy done."); - - return new ModelAndView(resultView, "result", result); } } diff --git a/src/main/java/com/eactive/eai/rms/onl/loader/dao/LoaderDao.java b/src/main/java/com/eactive/eai/rms/onl/loader/dao/LoaderDao.java index 46f984d..0e4f8ab 100644 --- a/src/main/java/com/eactive/eai/rms/onl/loader/dao/LoaderDao.java +++ b/src/main/java/com/eactive/eai/rms/onl/loader/dao/LoaderDao.java @@ -41,4 +41,9 @@ public interface LoaderDao { public List selectTableDataForListValue( DataSourceType dataSourceType, String tableName, String key1, List param1 ) ; public List selectSnaAdpApList( DataSourceType dataSourceType, String param1 ) ; + + /** + * TSEAITR10(배포/동기화 이력)에 로그 1건을 저장한다. + */ + public int insertSyncLog( DataSourceType dt, HashMap param ) ; } diff --git a/src/main/java/com/eactive/eai/rms/onl/loader/dao/LoaderDaoImpl.java b/src/main/java/com/eactive/eai/rms/onl/loader/dao/LoaderDaoImpl.java index b67908d..8bf429f 100644 --- a/src/main/java/com/eactive/eai/rms/onl/loader/dao/LoaderDaoImpl.java +++ b/src/main/java/com/eactive/eai/rms/onl/loader/dao/LoaderDaoImpl.java @@ -189,10 +189,15 @@ public class LoaderDaoImpl extends SqlMapClientTemplateDao implements LoaderDao // } // }.execute(); } + public int insertSyncLog( DataSourceType dt, HashMap param ) { + param.put("schemaId", dt.getSchema()); + return this.template.update("Layout.insertLayoutSyncLog", param); + } + public List selectSnaAdpApList( DataSourceType dataSourceType, String param1 ) { final HashMap param = new HashMap(); - param.put("param1", param1); - + param.put("param1", param1); + return template.queryForList("Loader.selectSnaAdpApList", param); // return new SpecifiedDataSourceExecutor>( diff --git a/src/main/java/com/eactive/eai/rms/onl/loader/service/TransactionLoaderService.java b/src/main/java/com/eactive/eai/rms/onl/loader/service/TransactionLoaderService.java index 74a1942..ac61e46 100644 --- a/src/main/java/com/eactive/eai/rms/onl/loader/service/TransactionLoaderService.java +++ b/src/main/java/com/eactive/eai/rms/onl/loader/service/TransactionLoaderService.java @@ -157,5 +157,15 @@ public interface TransactionLoaderService{ public HashMap syncResult(Command command ,String fileName ) throws Exception; - public void appendToListfile(String bizCode, String interfaceId) throws Exception ; + public void appendToListfile(String bizCode, String interfaceId) throws Exception ; + + /** + * downloadfull / uploadfull 성공 시 TSEAITR10 에 배포 이력을 저장한다. (PRCSSRSLT=S) + */ + public void insertDeploySyncLog(DataSourceType dt, String command, String interfaceId, String recvData) ; + + /** + * downloadfull / uploadfull 실패 시 TSEAITR10 에 실패 이력을 저장한다. (PRCSSRSLT=F, PRCSSRSLTCMNT=errMsg) + */ + public void insertDeployFailLog(DataSourceType dt, String command, String interfaceId, String recvData, String errMsg) ; } \ No newline at end of file diff --git a/src/main/java/com/eactive/eai/rms/onl/loader/service/TransactionLoaderServiceImpl.java b/src/main/java/com/eactive/eai/rms/onl/loader/service/TransactionLoaderServiceImpl.java index c9fe144..772c3b2 100644 --- a/src/main/java/com/eactive/eai/rms/onl/loader/service/TransactionLoaderServiceImpl.java +++ b/src/main/java/com/eactive/eai/rms/onl/loader/service/TransactionLoaderServiceImpl.java @@ -2,6 +2,7 @@ package com.eactive.eai.rms.onl.loader.service; import com.eactive.eai.agent.command.Command; import com.eactive.eai.agent.command.CommonCommand; +import com.eactive.eai.common.util.UUIDGenerator; import com.eactive.eai.rms.common.base.BaseService; import com.eactive.eai.rms.common.context.MonitoringContext; import com.eactive.eai.rms.common.converter.ElinkObjectMapper; @@ -1483,4 +1484,33 @@ public class TransactionLoaderServiceImpl extends BaseService implements Transac String targetLine = bizCode+"|"+interfaceId+System.lineSeparator(); org.apache.commons.io.FileUtils.writeStringToFile(listFile, targetLine, Charset.defaultCharset(), true); } + + @Override + public void insertDeploySyncLog(DataSourceType dt, String command, String interfaceId, String recvData) { + insertDeployLog(dt, command, interfaceId, recvData, "S", ""); + } + + @Override + public void insertDeployFailLog(DataSourceType dt, String command, String interfaceId, String recvData, String errMsg) { + insertDeployLog(dt, command, interfaceId, recvData, "F", errMsg); + } + + private void insertDeployLog(DataSourceType dt, String command, String interfaceId, String recvData, + String prcssRslt, String prcssRsltCmnt) { + try { + HashMap param = new HashMap(); + param.put("logPrcssSeqno", UUIDGenerator.getUUID()); + param.put("serviceName", "InterfaceDeploy"); + param.put("command", command); + param.put("loutName", interfaceId); + param.put("recvData", recvData == null ? "" : recvData); + param.put("recvAmndHMS", DateUtil.getDateTime("yyyyMMddHHmmssSS").substring(0, 16)); + param.put("prcssRslt", prcssRslt); + param.put("prcssRsltCmnt", StringUtils.left(prcssRsltCmnt, 4000)); // PRCSSRSLTCMNT 길이 보호 + dao.insertSyncLog(dt, param); + } catch (Exception e) { + // 이력 저장 실패가 download/upload 본기능을 중단시키지 않도록 한다. + logger.error("insertDeployLog error (command=" + command + ", interfaceId=" + interfaceId + ")", e); + } + } } \ No newline at end of file diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/history/ui/LayoutSyncHistoryUISearch.java b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/history/ui/LayoutSyncHistoryUISearch.java index 7c246bf..0d715fc 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/history/ui/LayoutSyncHistoryUISearch.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layoutsync/history/ui/LayoutSyncHistoryUISearch.java @@ -7,6 +7,12 @@ public class LayoutSyncHistoryUISearch { private String searchLoutName; + /* 서비스명 (부분일치) */ + private String searchServiceName; + + /* 커맨드 (부분일치) */ + private String searchCommand; + /* 연동시간 기간 검색 (yyyyMMdd, 8자리) */ private String searchStartDate; private String searchEndDate;