RseCtlrService.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package com.its.dsrc.service;
  2. import com.its.app.AppUtils;
  3. import com.its.app.utils.SysUtils;
  4. import com.its.dsrc.dao.mapper.RseCtlrMapper;
  5. import com.its.dsrc.entity.TbRseCtlr;
  6. import com.its.dsrc.entity.TbRseCtlrStts;
  7. import com.its.dsrc.entity.TbRseObuNonCrypt;
  8. import com.its.dsrc.global.AppRepository;
  9. import com.its.dsrc.process.DbmsData;
  10. import com.its.dsrc.process.DbmsDataProcess;
  11. import com.its.dsrc.process.DbmsDataType;
  12. import com.its.dsrc.vo.NET;
  13. import lombok.extern.slf4j.Slf4j;
  14. import org.springframework.stereotype.Service;
  15. import org.springframework.transaction.annotation.Transactional;
  16. import javax.annotation.PostConstruct;
  17. import java.util.*;
  18. @Slf4j
  19. @Service
  20. @Transactional(rollbackFor = {Exception.class})
  21. public class RseCtlrService {
  22. private RseCtlrMapper rseCtlrMapper;
  23. private int historyMin;
  24. @PostConstruct
  25. private void init() {
  26. log.info("RseCtlrService.init: Start.");
  27. this.rseCtlrMapper = (RseCtlrMapper) AppUtils.getBean(RseCtlrMapper.class);
  28. this.historyMin = -1;
  29. log.info("RseCtlrService.init: ..End.");
  30. }
  31. public void loadDb() {
  32. loadRseCtlr();
  33. loadRseObjNonCrypt();
  34. }
  35. public void initRseCtlr() {
  36. try {
  37. for (Map.Entry<String, TbRseCtlr> e : AppRepository.getInstance().getCtlrMap().entrySet()) {
  38. // 제어기가 삭제됐다고 초기화
  39. TbRseCtlr obj = e.getValue();
  40. obj.setDEL_YN("Y");
  41. }
  42. }
  43. catch (Exception e) {
  44. log.error("RseCtlrService.initRseCtlr: Exception: {}", e.toString());
  45. }
  46. }
  47. public void loadRseCtlr() {
  48. initRseCtlr();
  49. try {
  50. List<TbRseCtlr> infoList = this.rseCtlrMapper.selectAll();
  51. log.info("rseCtlrMapper.selectAll(), {} EA", infoList.size());
  52. for (TbRseCtlr obj : infoList) {
  53. obj.setRSE_CTLR_IP(obj.getRSE_CTLR_IP().trim()); // 빈문자열 삭제
  54. if (obj.getRSE_CTLR_IP() != null && obj.getRSE_CTLR_IP().length() > 0) {
  55. obj.getStts().setRSE_CTLR_NMBR(obj.getID());
  56. obj.getStts().initUnknown();
  57. AppRepository.getInstance().getCtlrMap().put(obj.getID(), obj);
  58. AppRepository.getInstance().getCtlrIpMap().put(obj.getRSE_CTLR_IP(), obj);
  59. }
  60. }
  61. }
  62. catch (Exception e) {
  63. log.error("rseCtlrMapper.selectAll: {}", e.toString());
  64. }
  65. for (Map.Entry<String, TbRseCtlr> obj : AppRepository.getInstance().getCtlrMap().entrySet()) {
  66. log.info(obj.toString());
  67. }
  68. }
  69. public void loadRseObjNonCrypt() {
  70. try {
  71. AppRepository.getInstance().rseObuNonCryptList.clear();
  72. AppRepository.getInstance().rseObuNonCryptList = this.rseCtlrMapper.selectRseObuNonCryptList();
  73. }
  74. catch (Exception e) {
  75. log.error("rseCtlrMapper.selectRseObuNonCryptList: {}", e.toString());
  76. }
  77. for (TbRseObuNonCrypt vo : AppRepository.getInstance().rseObuNonCryptList) {
  78. log.debug(vo.toString());
  79. }
  80. }
  81. public void updateCtlrStts(boolean isRun) {
  82. String keyData = "unit";
  83. boolean insHs = false;
  84. Calendar cal = Calendar.getInstance();
  85. int min = cal.get(Calendar.MINUTE);
  86. if ((min % 5) == 0 && this.historyMin != min) {
  87. insHs = true;
  88. this.historyMin = min;
  89. }
  90. //제어기 상태정보 업데이트
  91. List<TbRseCtlrStts> ctlrSttsList = Collections.synchronizedList(new ArrayList<>());
  92. String UPDT_DT = SysUtils.getSysTime();
  93. int normal = 0;
  94. int error = 0;
  95. for (Map.Entry<String, TbRseCtlr> e : AppRepository.getInstance().getCtlrMap().entrySet()) {
  96. TbRseCtlr obj = e.getValue();
  97. obj.getStts().setUPDT_DT(UPDT_DT);
  98. if (isRun && obj.getNetState() >= NET.LOGINED && obj.getChannel() != null) {
  99. //제어기 통신정상
  100. normal++;
  101. obj.getStts().setCMNC_STTS_CD("CMS0");
  102. }
  103. else {
  104. //제어기 통신이상
  105. error++;
  106. obj.getStts().initError();
  107. }
  108. if (isRun) {
  109. ctlrSttsList.add(obj.getStts());
  110. }
  111. else {
  112. this.rseCtlrMapper.updateRseCtlrStts(obj.getStts());
  113. if (insHs) {
  114. this.rseCtlrMapper.insertRseCtlrSttsHs(obj.getStts());
  115. }
  116. }
  117. }
  118. // 제어기 상태정보 DB 업데이트
  119. if (ctlrSttsList.size() > 0) {
  120. DbmsDataProcess dbmsDataProcess = (DbmsDataProcess) AppUtils.getBean(DbmsDataProcess.class);
  121. dbmsDataProcess.add(new DbmsData(DbmsDataType.DBMS_DATA_CTLR_STTS, insHs, ctlrSttsList));
  122. }
  123. log.info("RseCtlrService.updateCtlrStts: total {}, normal {}, error {}", normal + error, normal, error);
  124. }
  125. public void monitoringSession() {
  126. long currMilliSeconds = System.currentTimeMillis();
  127. for (Map.Entry<String, TbRseCtlr> e : AppRepository.getInstance().getCtlrMap().entrySet()) {
  128. TbRseCtlr obj = e.getValue();
  129. if (obj.getNetState() >= NET.LOGIN_REQ && obj.getChannel() != null) {
  130. // 주차정보시스템 통신정상
  131. long recvTimout = currMilliSeconds - obj.getLastRecvTime();
  132. if (recvTimout > 15*1000) {
  133. log.error("Idle timeout: {}, ipAddr={}, Idle={} sec.", obj.getID(), obj.getRSE_ID(), (int)(recvTimout/1000L));
  134. obj.setLastRecvTime();
  135. obj.sendFrED();
  136. }
  137. }
  138. }
  139. }
  140. }