VmsFormService.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. package com.its.vms.service;
  2. import com.its.app.utils.Elapsed;
  3. import com.its.app.utils.ItsUtils;
  4. import com.its.vms.config.ApplicationConfig;
  5. import com.its.vms.dao.mapper.VmsFormMapper;
  6. import com.its.vms.domain.enums.eVmsFormType;
  7. import com.its.vms.dto.TbVmsFormColrDto;
  8. import com.its.vms.dto.TbVmsFormDto;
  9. import com.its.vms.dto.TbVmsFormObjectDto;
  10. import com.its.vms.dto.TbVmsSymbLibDto;
  11. import com.its.vms.entity.TbVmsForm;
  12. import com.its.vms.entity.TbVmsFormColr;
  13. import com.its.vms.entity.TbVmsFormObject;
  14. import lombok.RequiredArgsConstructor;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.springframework.stereotype.Service;
  17. import java.awt.*;
  18. import java.io.File;
  19. import java.util.List;
  20. import java.util.Objects;
  21. import java.util.concurrent.ConcurrentHashMap;
  22. @SuppressWarnings("ResultOfMethodCallIgnored")
  23. @Slf4j
  24. @Service
  25. @RequiredArgsConstructor
  26. public class VmsFormService {
  27. private final ApplicationConfig config;
  28. private final VmsFormMapper mapper;
  29. private final VmsSymbService vmsSymbService;
  30. private final ConcurrentHashMap<Integer, TbVmsFormDto> dataMap = new ConcurrentHashMap<>();
  31. private final ConcurrentHashMap<Integer, TbVmsFormColrDto> colrMap = new ConcurrentHashMap<>();
  32. public TbVmsFormDto find(Integer vmsFormId) {
  33. return this.dataMap.get(vmsFormId);
  34. }
  35. public Color getFormColor(Integer colrCd) {
  36. if (colrCd == 0) return Color.BLACK;
  37. if (colrCd == 1) return Color.RED;
  38. if (colrCd == 2) return Color.GREEN;
  39. if (colrCd == 3) return Color.YELLOW;
  40. TbVmsFormColrDto obj = this.colrMap.get(colrCd);
  41. if (obj != null) {
  42. return obj.getVmsFormColor();
  43. }
  44. if (colrCd == 4) return Color.ORANGE;
  45. if (colrCd == 5) return new Color(16776960); // aqua
  46. return Color.BLACK;
  47. }
  48. public void loadDb() {
  49. loadVmsFormInfo();
  50. loadVmsFormObjectInfo();
  51. loadVmsFormColorInfo();
  52. }
  53. public void loadVmsFormInfo() {
  54. Elapsed elapsed = new Elapsed();
  55. try {
  56. List<TbVmsForm> result = this.mapper.selectVmsFormInfo();
  57. log.info("VmsFormService.loadVmsFormInfo: {} EA", result.size());
  58. result.forEach(data -> {
  59. TbVmsFormDto obj = data.toDto();
  60. String updtDt = "";
  61. TbVmsFormDto oldObj = this.dataMap.get(obj.getVmsFormId());
  62. if (oldObj != null) {
  63. updtDt = oldObj.getUpdtDt();
  64. }
  65. // 정적폼(홍보) 같은 경우 최초 또는 변경되었을 때에만 사용할수 있도록(제어기로 한번만 다운로드 할수 있도록)
  66. // 체크 플래그를 두어 확인할수 있도록 한다.
  67. if (obj.getVmsFormTypeCd() == eVmsFormType.eFormTp_hongbo.getValue() && !Objects.equals(obj.getUpdtDt(), updtDt)) {
  68. // 새롭게 제어기로 다운로드 해야되는 폼으로 설정
  69. obj.setNewForm(true);
  70. }
  71. if (obj.getVmsFormTypeCd() == eVmsFormType.eFormTp_hongbo.getValue() && obj.getVmsFormImag() != null) {
  72. obj.setLocalFileName(this.config.getFtpStaticDir() + obj.getVmsFormId() + ".bmp");
  73. obj.setFtpFileName(ApplicationConfig.FTP_STATIC + obj.getVmsFormId() + ".bmp");
  74. File imagFile = new File(obj.getLocalFileName());
  75. if (imagFile.exists()) {
  76. imagFile.delete();
  77. }
  78. ItsUtils.saveByteArrayToFile(obj.getLocalFileName(), obj.getVmsFormImag());
  79. }
  80. if (obj.getVmsFormExpl() == null) {
  81. obj.setVmsFormExpl("");
  82. }
  83. this.dataMap.put(obj.getVmsFormId(), obj);
  84. });
  85. }
  86. catch (Exception e) {
  87. log.error("VmsFormService.loadVmsFormInfo: {}.", e.toString());
  88. }
  89. log.info("VmsFormService.loadVmsFormInfo: {} ms.", elapsed.milliSeconds());
  90. }
  91. public void loadVmsFormObjectInfo() {
  92. Elapsed elapsed = new Elapsed();
  93. try {
  94. List<TbVmsFormObject> result = this.mapper.selectVmsFormObjectInfo();
  95. log.info("VmsFormService.loadVmsFormObjectInfo: {} EA", result.size());
  96. result.forEach(data -> {
  97. TbVmsFormObjectDto obj = data.toDto();
  98. TbVmsFormDto formObj = this.dataMap.get(obj.getVmsFormId());
  99. if (formObj == null) {
  100. log.error("VmsFormService.loadVmsFormObjectInfo: Not Found VMS Form {}.", obj.getVmsFormId());
  101. return;
  102. }
  103. int objType = obj.getVmsFormObjectTypeCd();
  104. if (isObjectBitmap(objType)) {
  105. // 심벌라이브러리를 참조하는 객체인데 참조하는 심벌라이브러리가 없으면 객체를 추가하지 않는다.
  106. TbVmsSymbLibDto vmsSymbLib = this.vmsSymbService.find(obj.getSymbLibNmbr()+"0");
  107. if (vmsSymbLib == null) {
  108. log.error("VmsFormService.loadVmsFormObjectInfo: VMF Form Object Symbol Library not Found {}, {}.", obj.getVmsFormId(), obj.getSymbLibNmbr());
  109. return;
  110. }
  111. if (objType == 3) {
  112. // 소통정보배경 이미지
  113. formObj.setTrfBackImgId(vmsSymbLib.getMemSymbLibNmbr());
  114. }
  115. obj.setBitmapType(vmsSymbLib.getImagType());
  116. obj.setBitmapId(vmsSymbLib.getDnldSymbLibNmbr());
  117. }
  118. if (objType == 200) {
  119. // 동영상(폼을 만들때 동영상 파일을 선택한다)
  120. TbVmsSymbLibDto videoSymbLib = this.vmsSymbService.find(obj.getSymbLibNmbr()+"0");
  121. if (videoSymbLib == null) {
  122. log.error("VmsFormService.loadVmsFormObjectInfo: VMF Form Object Video Symbol Library not Found {}, {}.", obj.getVmsFormId(), obj.getSymbLibNmbr());
  123. return;
  124. }
  125. obj.setVideoFileName(videoSymbLib.getSymbFileNm());
  126. obj.setBitmapType(videoSymbLib.getImagType());
  127. obj.setBitmapId(videoSymbLib.getDnldSymbLibNmbr());
  128. }
  129. if (objType == 300) {
  130. // 스트리밍 영상(폼을 만들때 스트리밍 영상을 선택한다)
  131. TbVmsSymbLibDto strmSymbLib = this.vmsSymbService.find(obj.getSymbLibNmbr()+"0");
  132. if (strmSymbLib == null) {
  133. log.error("VmsFormService.loadVmsFormObjectInfo: VMF Form Object Stream Symbol Library not Found {}, {}.", obj.getVmsFormId(), obj.getSymbLibNmbr());
  134. return;
  135. }
  136. obj.setBitmapType(strmSymbLib.getImagType());
  137. obj.setBitmapId(strmSymbLib.getDnldSymbLibNmbr());
  138. }
  139. // 폼정보에 오브젝트 객체를 추가
  140. formObj.getObjects().add(obj);
  141. if (formObj.getVmsFormTypeCd() == eVmsFormType.eFormTp_figure.getValue()) {
  142. // 도형식 소통정보 폼인데 구간 소통정보를 하단에 표출하는 경우
  143. // 하나의 폼이 여러개의 소통정보를 표출되도록 하기 위함
  144. switch(objType) {
  145. //////////////////////// 20200515 추가함(S)
  146. case 0://, , @문자열
  147. case 1://, , @심볼
  148. case 2://, , @이미지
  149. if ("F".equals(obj.getTrfcFillCd())) {
  150. //하단고정일 경우 도형식하단에 표출할 소통정보가 없을 경우 표출하는 정보임
  151. formObj.setBottomFixedText(true);
  152. }
  153. break;
  154. //////////////////////// 20200515 추가함(E)
  155. case 11://, ' @구간명
  156. case 12://, ' @시점명
  157. case 13://, ' @종점명
  158. case 14://, ' @소통상황
  159. case 15://, ' @통행시간
  160. case 16://, ' @통행속도
  161. case 17://, ' @소통정보이미지
  162. case 18://, ' @지점명
  163. formObj.setBottomTrfIfsc(true);
  164. break;
  165. case 93://, ' @축시점명(순환)
  166. case 94://, ' @축종점명(순환)
  167. case 95://, ' @축소통상황(순환)
  168. case 96://, ' @축통행시간(순환)
  169. formObj.setBottomTrfAxis(true);
  170. break;
  171. default:
  172. break;
  173. }
  174. }
  175. });
  176. }
  177. catch (Exception e) {
  178. log.error("VmsFormService.loadVmsFormObjectInfo: {}.", e.toString());
  179. }
  180. log.info("VmsFormService.loadVmsFormObjectInfo: {} ms.", elapsed.milliSeconds());
  181. }
  182. public static boolean isObjectBitmap(int objType) {
  183. return (objType == 1 || //심볼
  184. objType == 2 || //이미지(파일에서 직접입력한것임)
  185. objType == 3 || //소통정보배경이미지
  186. objType == 17 || //소통정보이미지1
  187. objType == 27 || //소통정보이미지2
  188. objType == 37 || //소통정보이미지3
  189. objType == 47 || //소통정보이미지4
  190. objType == 200 || //동영상이미지
  191. objType == 300 || //스트리밍영상이미지
  192. objType == 406 || //통합대기등급 이미지
  193. objType == 407 || //미세먼지등급 이미지
  194. objType == 408 || //초미세먼지등급 이미지
  195. objType == 413 || //오존등급이미지
  196. objType == 167); //우회소통정보이미지
  197. }
  198. public static boolean isObjectBitmapId(int objType) {
  199. return (objType == 1 || //심볼
  200. objType == 2 || //이미지(파일에서 직접입력한것임)
  201. objType == 17 || //소통정보이미지1
  202. objType == 27 || //소통정보이미지2
  203. objType == 37 || //소통정보이미지3
  204. objType == 47 || //소통정보이미지4
  205. objType == 200 || //동영상이미지
  206. objType == 300 || //스트리밍영상이미지
  207. objType == 406 || //통합대기등급 이미지
  208. objType == 407 || //미세먼지등급 이미지
  209. objType == 408 || //초미세먼지등급 이미지
  210. objType == 413 || //오존등급이미지
  211. objType == 167); //우회소통정보이미지
  212. }
  213. public void loadVmsFormColorInfo() {
  214. Elapsed elapsed = new Elapsed();
  215. try {
  216. List<TbVmsFormColr> result = this.mapper.selectVmsFormColorInfo();
  217. log.info("VmsFormService.loadVmsFormColorInfo: {} EA", result.size());
  218. result.forEach(data -> {
  219. TbVmsFormColrDto obj = data.toDto();
  220. this.colrMap.put(obj.getVmsFormColrCd(), obj);
  221. });
  222. }
  223. catch (Exception e) {
  224. log.error("VmsFormService.loadVmsFormInfo: {}.", e.toString());
  225. }
  226. log.info("VmsFormService.loadVmsFormColorInfo: {} ms.", elapsed.milliSeconds());
  227. }
  228. /**
  229. * 내부에서 사용하는 심벌 라이브러리 번호를 제어기로 다운로드하는 BitmapId 로 변환한다.
  230. * @param formId : 10013 -> 1130
  231. * @return
  232. */
  233. public static int getDnldFormNo(Integer formId) {
  234. int id = formId % 10000;
  235. return 1000 + (id * 10);
  236. }
  237. }