|
@@ -1,8 +1,13 @@
|
|
|
package com.its.api.its.service.vms;
|
|
|
|
|
|
+import com.its.api.its.global.VmsIfscManager;
|
|
|
+import com.its.api.its.global.VmsManager;
|
|
|
+import com.its.api.its.model.dto.vms.TbVmsFormObjectDetlDto;
|
|
|
import com.its.api.its.model.dto.vms.TbVmsMsgDsplSchDto;
|
|
|
import com.its.api.its.model.dto.vms.TbVmsMsgDsplSchVmsListDto;
|
|
|
+import com.its.api.its.model.dto.vms.VmsFormDrawTrafDto;
|
|
|
import com.its.api.its.model.entity.vms.TbVmsCtlr;
|
|
|
+import com.its.api.its.model.entity.vms.TbVmsIfsc;
|
|
|
import com.its.api.its.model.entity.vms.TbVmsMsgDsplSch;
|
|
|
import com.its.api.its.model.entity.vms.TbVmsMsgDsplSchKey;
|
|
|
import com.its.api.its.repository.vms.TbVmsCtlrRepository;
|
|
@@ -10,9 +15,16 @@ import com.its.api.its.repository.vms.TbVmsMsgDsplSchRepository;
|
|
|
import com.its.api.utils.ItsUtils;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.sanselan.Sanselan;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
+import javax.imageio.ImageIO;
|
|
|
+import java.awt.*;
|
|
|
+import java.awt.image.BufferedImage;
|
|
|
+import java.io.ByteArrayOutputStream;
|
|
|
+import java.io.IOException;
|
|
|
+import java.util.List;
|
|
|
import java.util.*;
|
|
|
|
|
|
@Slf4j
|
|
@@ -22,6 +34,7 @@ public class TbVmsMsgDsplSchService {
|
|
|
|
|
|
private final TbVmsMsgDsplSchRepository repo;
|
|
|
private final TbVmsCtlrRepository vmsRepo;
|
|
|
+ private final TbVmsFormService formService;
|
|
|
|
|
|
// 데이터 1건 조회, 없으면 exception
|
|
|
private TbVmsMsgDsplSch requireOne(TbVmsMsgDsplSchKey id) {
|
|
@@ -90,6 +103,195 @@ public class TbVmsMsgDsplSchService {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
+ private Color getColor(int code) {
|
|
|
+ if (code == 0) return Color.BLACK;
|
|
|
+ if (code == 1) return Color.RED;
|
|
|
+ if (code == 2) return Color.GREEN;
|
|
|
+ if (code == 3) return Color.YELLOW;
|
|
|
+ return Color.BLACK;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * VMS 교통정보 폼을 실시간 으로 그린다.
|
|
|
+ * @param vms
|
|
|
+ * @param dto
|
|
|
+ * @param formObjs
|
|
|
+ * @return
|
|
|
+ * @throws IOException
|
|
|
+ */
|
|
|
+ private byte[] createVmsTrafScheForm(TbVmsCtlr vms, TbVmsMsgDsplSchDto dto, List<TbVmsFormObjectDetlDto> formObjs, VmsFormDrawTrafDto.VmsFormDrawTrafReq req) throws IOException {
|
|
|
+
|
|
|
+ String imagFmt = "png";
|
|
|
+ if (vms == null || vms.getType() == null) {
|
|
|
+ log.error("Not Found VMS Controller: {}", vms);
|
|
|
+ return dto.getVmsFormImag();
|
|
|
+ }
|
|
|
+ if (formObjs.size() == 0) {
|
|
|
+ log.error("VMS Objects zero: {}", vms);
|
|
|
+ return dto.getVmsFormImag();
|
|
|
+ }
|
|
|
+
|
|
|
+ Long[] ifscIds = new Long[4];
|
|
|
+ if (dto != null) {
|
|
|
+ ifscIds[0] = dto.getFrstVmsIfscId();
|
|
|
+ ifscIds[1] = dto.getSecdVmsIfscId();
|
|
|
+ ifscIds[2] = dto.getThirVmsIfscId();
|
|
|
+ ifscIds[3] = dto.getFourVmsIfscId();
|
|
|
+ } else if (req != null) {
|
|
|
+ ifscIds[0] = req.getFrstVmsIfscId();
|
|
|
+ ifscIds[1] = req.getSecdVmsIfscId();
|
|
|
+ ifscIds[2] = req.getThirVmsIfscId();
|
|
|
+ ifscIds[3] = req.getFourVmsIfscId();
|
|
|
+ } else {
|
|
|
+ log.error("VMS Form draw request object error");
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ int formColorCd = formObjs.get(0).getVmsFormBckgHueCd().intValue();
|
|
|
+ /**
|
|
|
+ * 배경 이미지를 만든다.
|
|
|
+ */
|
|
|
+ int width = vms.getType().getVmsWdth();
|
|
|
+ int height = vms.getType().getVmsHght();
|
|
|
+ // TYPE_INT_ARGB specifies the image format: 8-bit RGBA packed
|
|
|
+ BufferedImage formImage = new BufferedImage(width, height, (("png").equals(imagFmt) ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB));
|
|
|
+ Graphics2D g2d = (Graphics2D)formImage.createGraphics(); //createGraphics();getGraphics();
|
|
|
+ //g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
|
|
+ g2d.setColor(getColor(formColorCd));
|
|
|
+ g2d.fillRect(0, 0, width, height);
|
|
|
+
|
|
|
+ formObjs.forEach(obj -> {
|
|
|
+ int objKind;
|
|
|
+ String dsplText = obj.getVmsDsplTxt();
|
|
|
+ int objType = obj.getVmsFormObjectTypeCd();
|
|
|
+ if (objType == 1 || //이미지 심볼
|
|
|
+ objType == 2 || //소통정보이미지
|
|
|
+ objType == 3 || //파일이미지
|
|
|
+ objType == 17 || //소통이미지1
|
|
|
+ objType == 27 || //소통이미지2
|
|
|
+ objType == 37 || //소통이미지3
|
|
|
+ objType == 47 ) //소통이미지4
|
|
|
+ {
|
|
|
+ if (objType == 1) objKind = 1; //Image Id
|
|
|
+ else objKind = 2; //Image
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ objKind = 0; //문자열그리기
|
|
|
+ }
|
|
|
+
|
|
|
+ Long ifscId = null;
|
|
|
+ if (objType >= 11 && objType < 17)
|
|
|
+ ifscId = ifscIds[0];
|
|
|
+ else
|
|
|
+ if (objType >= 21 && objType < 27)
|
|
|
+ ifscId = ifscIds[1];
|
|
|
+ else
|
|
|
+ if (objType >= 31 && objType < 37)
|
|
|
+ ifscId = ifscIds[2];
|
|
|
+ else
|
|
|
+ if (objType >= 41 && objType < 47)
|
|
|
+ ifscId = ifscIds[3];
|
|
|
+
|
|
|
+ if (ifscId != null && ifscId != 0) {
|
|
|
+ TbVmsIfsc vmsIfsc = VmsIfscManager.get(ifscId);
|
|
|
+ if (vmsIfsc != null) {
|
|
|
+ switch(objType)
|
|
|
+ {
|
|
|
+ case 11: case 21: case 31: case 41:
|
|
|
+ dsplText = vmsIfsc.getVmsIfscNm();
|
|
|
+ break;
|
|
|
+ case 12: case 22: case 32: case 42:
|
|
|
+ dsplText = vmsIfsc.getDsplStrtNodeNm();
|
|
|
+ break;
|
|
|
+ case 13: case 23: case 33: case 43:
|
|
|
+ dsplText = vmsIfsc.getDsplEndNodeNm();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 그리기 시작한다
|
|
|
+ int left = obj.getVmsDsplXcrdn();
|
|
|
+ int top = obj.getVmsDsplYcrdn();
|
|
|
+ if (objKind == 0) {
|
|
|
+ // 문자열 그리기
|
|
|
+ int fontSize = obj.getVmsFontSize();
|
|
|
+ int fontStyle = (obj.getVmsFontStylCd() == 1) ? Font.BOLD : Font.PLAIN;
|
|
|
+ int dsplWidth = obj.getVmsDsplWidth();
|
|
|
+
|
|
|
+ Font txtFont = new Font(obj.getVmsFontShpeNm(), fontStyle, fontSize);
|
|
|
+ txtFont = txtFont.deriveFont(fontSize * 1.35f);
|
|
|
+ g2d.setFont(txtFont);
|
|
|
+ FontMetrics fm = g2d.getFontMetrics(txtFont);
|
|
|
+ int txtWidth = fm.stringWidth(dsplText);
|
|
|
+ int nWidth = dsplWidth - txtWidth;
|
|
|
+ if (obj.getVmsFontAlign() == 1) {
|
|
|
+ // right, 좌측에서 글자길이를 뺀다음 만약 음수이면 0으로 설정
|
|
|
+ left += nWidth;
|
|
|
+ //left = (left + dsplWidth) - txtWidth;
|
|
|
+ }
|
|
|
+ else if (obj.getVmsFontAlign() == 2) {
|
|
|
+ // center, 원래 글자의 중앙값을 얻은 다음에 조정된 글자의 1/2 크기를 뺀다음 음수이면 0으로 설정
|
|
|
+ left += (nWidth / 2);
|
|
|
+ //left = (left + (dsplWidth / 2)) - (txtWidth/2);
|
|
|
+ }
|
|
|
+ if (left < 0) {
|
|
|
+ left = 0;
|
|
|
+ }
|
|
|
+ g2d.setColor(getColor(obj.getVmsFontHueCd()));
|
|
|
+ g2d.drawString(dsplText, left, top + fm.getAscent());//fm.getHeight() - fm.getDescent() - fm.getLeading());
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ try {
|
|
|
+ BufferedImage symbol = null;
|
|
|
+ if (obj.getVmsDsplFigr() != null) {
|
|
|
+ symbol = Sanselan.getBufferedImage(obj.getVmsDsplFigr());
|
|
|
+ } else {
|
|
|
+ symbol = Sanselan.getBufferedImage(obj.getImagData());
|
|
|
+ }
|
|
|
+ g2d.drawImage(symbol, left, top, null);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ String saveDir = ItsUtils.createUserDir("/image/vms/traf-sche/");
|
|
|
+ ItsUtils.saveImageFile(formImage, imagFmt, saveDir + vms.getVmsCtlrNmbr() + "_" + dto.getPhase() + "." + imagFmt);
|
|
|
+
|
|
|
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
|
|
|
+ ImageIO.write(formImage, imagFmt, out);
|
|
|
+ g2d.dispose();
|
|
|
+ return out.toByteArray();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * VMS 교통정보 폼 실시간 드로잉
|
|
|
+ * @param id
|
|
|
+ * @param formId
|
|
|
+ * @param req
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public VmsFormDrawTrafDto drawTrafficForm(Long id, Integer formId, VmsFormDrawTrafDto.VmsFormDrawTrafReq req) {
|
|
|
+ VmsFormDrawTrafDto result = VmsFormDrawTrafDto.builder()
|
|
|
+ .vmsFormId(formId)
|
|
|
+ .vmsFormImag(null)
|
|
|
+ .imagFmt("png").build();
|
|
|
+
|
|
|
+ // 교통정보 스케쥴인 경우 교통정보 폼을 만들어서 리턴해 준다.
|
|
|
+ TbVmsCtlr obj = VmsManager.get(id);
|
|
|
+ if (obj == null) {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ List<TbVmsFormObjectDetlDto> formObjs = this.formService.findByVmsFormObject(formId);
|
|
|
+ try {
|
|
|
+ // 교통정보 폼 그리기
|
|
|
+ result.setVmsFormImag(createVmsTrafScheForm(obj, null, formObjs, req));
|
|
|
+ } catch (IOException e) {
|
|
|
+ log.error("{}", e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
/**
|
|
|
* 자동 스케줄 목록 조회
|
|
|
* @param id
|
|
@@ -102,8 +304,25 @@ public class TbVmsMsgDsplSchService {
|
|
|
// 교통정보
|
|
|
public List<TbVmsMsgDsplSchDto> findAllTraffic(Long id) {
|
|
|
List<String> formTypeCd = Collections.singletonList("0");
|
|
|
- return findAllVmsDsplSchedule(id, formTypeCd);
|
|
|
+ List<TbVmsMsgDsplSchDto> dtoList = findAllVmsDsplSchedule(id, formTypeCd);
|
|
|
+
|
|
|
+ // 교통정보 스케쥴인 경우 교통정보 폼을 만들어서 리턴해 준다.
|
|
|
+ TbVmsCtlr obj = VmsManager.get(id);
|
|
|
+ if (obj == null) {
|
|
|
+ return dtoList;
|
|
|
+ }
|
|
|
+ dtoList.forEach(dto -> {
|
|
|
+ List<TbVmsFormObjectDetlDto> formObjs = this.formService.findByVmsFormObject(dto.getVmsFormId());
|
|
|
+ try {
|
|
|
+ // 교통정보 폼 그리기
|
|
|
+ dto.setVmsFormImag(createVmsTrafScheForm(obj, dto, formObjs, null));
|
|
|
+ } catch (IOException e) {
|
|
|
+ log.error("{}", e.getMessage());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return dtoList;
|
|
|
}
|
|
|
+
|
|
|
// 정체
|
|
|
public List<TbVmsMsgDsplSchDto> findAllCongest(Long id) {
|
|
|
List<String> formTypeCd = Collections.singletonList("7");
|
|
@@ -314,4 +533,5 @@ public class TbVmsMsgDsplSchService {
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
+
|
|
|
}
|