VmsSymbService.java 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. package com.its.vms.service;
  2. import com.its.app.utils.FloodFill;
  3. import com.its.app.utils.ItsUtils;
  4. import com.its.vms.config.ApplicationConfig;
  5. import com.its.vms.dao.mapper.VmsSymbMapper;
  6. import com.its.vms.dto.TbVmsSymbIfscDto;
  7. import com.its.vms.dto.TbVmsSymbLibDto;
  8. import com.its.vms.entity.TbVmsSymbIfsc;
  9. import com.its.vms.entity.TbVmsSymbLib;
  10. import lombok.RequiredArgsConstructor;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.springframework.stereotype.Service;
  13. import javax.imageio.ImageIO;
  14. import java.awt.*;
  15. import java.awt.image.BufferedImage;
  16. import java.io.ByteArrayOutputStream;
  17. import java.io.File;
  18. import java.io.IOException;
  19. import java.util.List;
  20. import java.util.Map;
  21. import java.util.concurrent.ConcurrentHashMap;
  22. @Slf4j
  23. @Service
  24. @RequiredArgsConstructor
  25. public class VmsSymbService {
  26. private final ApplicationConfig config;
  27. private final VmsSymbMapper vmsSymbMapper;
  28. private final ConcurrentHashMap<String, TbVmsSymbLibDto> symbMap = new ConcurrentHashMap<>();
  29. public TbVmsSymbLibDto find(String symbLibNmbr) {
  30. return this.symbMap.get(symbLibNmbr);
  31. }
  32. public void loadVmsSymbInfo() {
  33. loadVmsSymbLib();
  34. loadVmsSymbCellInfo();
  35. }
  36. public void loadVmsSymbLib() {
  37. try {
  38. List<TbVmsSymbLib> infoList = this.vmsSymbMapper.selectVmsSymbLib();
  39. log.info("VmsSymbService.loadVmsSymbLib: {} EA", infoList.size());
  40. infoList.forEach(data -> {
  41. // 심벌 유형(SBT0:일반심벌이미지,SBT1:소통정보배경,SBT2:소통정보이미지,SBT3:동영상,SBT4:대기환경등급)
  42. // 소통정보이미지 때문에 이미지번호에 "0" 을 추가하여 이미지번호로 사용함
  43. String updtDt = "";
  44. TbVmsSymbLibDto obj = data.toDto();
  45. TbVmsSymbLibDto oldObj = this.symbMap.get(obj.getSymbLibNmbr());
  46. if (oldObj != null) {
  47. updtDt = oldObj.getUpdtDt();
  48. }
  49. this.symbMap.put(obj.getSymbLibNmbr(), obj);
  50. if ("SBT4".equals(obj.getSymbType())) {
  51. // 대기환경등급
  52. String symbExpl = data.getSymbExpl();
  53. if (symbExpl != null) {
  54. String[] symbNmbrArr = symbExpl.split("\\^");
  55. for (String symbNmbr : symbNmbrArr) {
  56. obj.getGradSymbLibNmbrList().add(symbNmbr + "0");
  57. }
  58. }
  59. }
  60. obj.setLocalFileName(this.config.getFtpImageDir() + obj.getSymbFileNm());
  61. obj.setFtpFileName(ApplicationConfig.FTP_IMAGE + File.separator + obj.getSymbFileNm()); // Ftp 다운로드 명을 설정
  62. // 심벌 유형(SBT0:일반심벌이미지,SBT1:소통정보배경,SBT2:소통정보이미지,SBT3:동영상)
  63. if ("SBT3".equals(obj.getSymbType())) {
  64. //위에서 이미지저장하기 위해 파일명을 변경하기 때문에 여기서 동영상 파일명을 다시 읽어온다
  65. obj.setSymbFileNm(data.getSymbFileNm()); //동영상인 경우 동영상 파일명
  66. obj.setLocalFileName(this.config.getFtpVideoDir() + obj.getSymbFileNm());
  67. obj.setFtpFileName(ApplicationConfig.FTP_VIDEO + File.separator + obj.getSymbFileNm()); // Ftp 다운로드 명을 설정
  68. }
  69. if ("SBT2".equals(obj.getSymbType())) {
  70. //심벌 유형(SBT0:일반심벌이미지,SBT1:소통정보배경,SBT2:소통정보이미지,SBT3:동영상)
  71. //소통정보 등급에 따른 이미지를 새롭게 추가한다.
  72. for (int nTrf = 1; nTrf <= 3; nTrf++) {
  73. String trfUpdtDt = "";
  74. String trafSymbLibNmbr = data.getSymbLibNmbr() + String.valueOf(nTrf);
  75. TbVmsSymbLibDto trfObj = this.symbMap.get(trafSymbLibNmbr);
  76. if (trfObj != null) {
  77. trfUpdtDt = trfObj.getUpdtDt();
  78. }
  79. trfObj = obj.clone(trafSymbLibNmbr);
  80. this.symbMap.put(trfObj.getSymbLibNmbr(), trfObj);
  81. Image imgBmp = obj.getImage(); // 원천이미지를 가지고 온다.
  82. if (imgBmp == null) {
  83. log.error("VmsSymbService.loadVmsSymbLib: Image Data Error: {}", trafSymbLibNmbr);
  84. continue;
  85. }
  86. String imagFmt = "bmp";
  87. BufferedImage formImage = new BufferedImage(imgBmp.getWidth(null), imgBmp.getHeight(null),
  88. ("png".equals(imagFmt) ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB));
  89. Graphics2D g2d = formImage.createGraphics();
  90. FloodFill floodFill = new FloodFill(imgBmp);
  91. floodFill.setAntialiased(false);
  92. int orgColor = floodFill.getImage().getRGB(obj.getPosX(), obj.getPosY());
  93. int trfColor = VmsSymbService.getGradColor(nTrf);
  94. if (orgColor != trfColor) {
  95. floodFill.fill(obj.getPosX(), obj.getPosY(), VmsSymbService.getTrafColor(nTrf));
  96. }
  97. g2d.drawImage(floodFill.getImage(), 0, 0, imgBmp.getWidth(null), imgBmp.getHeight(null), null);
  98. ByteArrayOutputStream out = new ByteArrayOutputStream();
  99. try {
  100. ImageIO.write(formImage, imagFmt, out);
  101. } catch (IOException e) {
  102. log.error("VmsSymbService.loadVmsSymbLib: Image Convert error: {}", trafSymbLibNmbr);
  103. }
  104. g2d.dispose();
  105. trfObj.setImagData(out.toByteArray());
  106. trfObj.setLocalFileName(this.config.getFtpImageDir() + trfObj.getSymbFileNm());
  107. trfObj.setFtpFileName(ApplicationConfig.FTP_IMAGE + File.separator + trfObj.getSymbFileNm()); // Ftp 다운로드 명을 설정
  108. // 소통등급별 이미지 파일 저장
  109. saveByteArrayToFile(trfObj, trfUpdtDt);
  110. }
  111. }
  112. // 이미지 파일저장
  113. if (!"SBT3".equals(obj.getSymbType())) {
  114. saveByteArrayToFile(obj, updtDt);
  115. }
  116. });
  117. }
  118. catch (Exception e) {
  119. log.error("VmsSymbService.loadVmsSymbLib: {}", e.toString());
  120. }
  121. }
  122. public void loadVmsSymbCellInfo() {
  123. try {
  124. List<TbVmsSymbIfsc> infoList = this.vmsSymbMapper.selectVmsSymbCellInfo();
  125. log.info("VmsSymbService.loadVmsSymbCellInfo: {} EA", infoList.size());
  126. infoList.forEach(data -> {
  127. Integer symbLibNmbr = data.getSymbLibNmbr();
  128. TbVmsSymbLibDto obj = this.symbMap.get(symbLibNmbr + "0");
  129. if (obj == null) {
  130. log.error("VmsSymbService.loadVmsSymbCellInfo: Not Found Cell Info {}.", symbLibNmbr);
  131. return;
  132. }
  133. TbVmsSymbIfscDto cell = data.toDto();
  134. for (Map.Entry<Integer, TbVmsSymbIfscDto> cellObj : obj.getCellMap().entrySet()) {
  135. if (cellObj.getValue().getVmsIfscId().equals(cell.getVmsIfscId())) {
  136. cell.setDup(true);
  137. break;
  138. }
  139. }
  140. obj.getCellMap().put(cell.getCellId(), cell);
  141. });
  142. }
  143. catch (Exception e) {
  144. log.error("VmsSymbService.loadVmsSymbCellInfo: {}", e.getMessage());
  145. }
  146. }
  147. public void saveByteArrayToFile(TbVmsSymbLibDto obj, String updtDt) {
  148. File imagFile = new File(obj.getLocalFileName());
  149. if (!imagFile.exists() || !obj.getUpdtDt().equals(updtDt)) {
  150. if (imagFile.exists()) {
  151. boolean deleted = imagFile.delete();
  152. log.info("VmsSymbService.saveImageFile: Old file deleted {}, {}", obj.getLocalFileName(), deleted);
  153. }
  154. ItsUtils.saveByteArrayToFile(obj.getLocalFileName(), obj.getImagData());
  155. }
  156. obj.setUpdtDt(updtDt); // 업데이트 시각을 업데이트 한다.
  157. }
  158. public static int getGradColor(int grad) {
  159. if (grad == 1) return Color.GREEN.getRGB();
  160. if (grad == 2) return Color.YELLOW.getRGB();
  161. if (grad == 3) return Color.RED.getRGB();
  162. return Color.GRAY.getRGB();
  163. }
  164. public static Color getTrafColor(int grad) {
  165. if (grad == 1) return Color.GREEN;
  166. if (grad == 2) return Color.YELLOW;
  167. if (grad == 3) return Color.RED;
  168. return Color.GRAY;
  169. }
  170. }