From e116aa6d065238f7d3df2153551e324ce65e80b6 Mon Sep 17 00:00:00 2001 From: ihyeon-yong Date: Mon, 11 Sep 2023 09:40:43 +0900 Subject: [PATCH] =?UTF-8?q?=EC=88=98=EC=A0=95=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/DefaultStatsService.java | 161 ++++++++++++++++++ .../application/SlotRepositoryDelegate.java | 2 + .../StatsDetailSlotNumberComparator.java | 17 ++ .../StatsDetailTubeIdComparator.java | 17 ++ .../application/StatsService.java | 9 + .../domain/DataResource.java | 49 ++++++ .../domain/DataType.java | 9 + .../amqp/RegisterResourceProducer.java | 2 +- .../nosql/SlotNoSQLRepository.java | 9 + .../infrastructure/nosql/SlotRepository.java | 1 + .../resttemplate/RestTemplateHandler.java | 1 + .../RestTemplateRequestHandler.java | 11 ++ .../presentation/StatsCntRecord.java | 19 +++ .../presentation/StatsController.java | 50 ++++-- .../presentation/StatsDetailRecord.java | 79 +++++++++ .../presentation/StatsRecord.java | 31 ++++ .../presentation/StatsResult.java | 15 ++ .../presentation/support/CustomPage.java | 42 +++++ .../presentation/support/CustomPageable.java | 20 +++ .../support/CustomPageableImpl.java | 63 +++++++ .../support/PageableResource.java | 14 ++ .../support/PageableResourceImpl.java | 53 ++++++ .../support/PageableResponse.java | 34 ++++ src/main/resources/application.yaml | 4 +- 24 files changed, 693 insertions(+), 19 deletions(-) create mode 100644 src/main/java/inc/sdt/controlcentermanagement/application/StatsDetailSlotNumberComparator.java create mode 100644 src/main/java/inc/sdt/controlcentermanagement/application/StatsDetailTubeIdComparator.java create mode 100644 src/main/java/inc/sdt/controlcentermanagement/domain/DataResource.java create mode 100644 src/main/java/inc/sdt/controlcentermanagement/domain/DataType.java create mode 100644 src/main/java/inc/sdt/controlcentermanagement/presentation/StatsCntRecord.java create mode 100644 src/main/java/inc/sdt/controlcentermanagement/presentation/StatsDetailRecord.java create mode 100644 src/main/java/inc/sdt/controlcentermanagement/presentation/StatsRecord.java create mode 100644 src/main/java/inc/sdt/controlcentermanagement/presentation/StatsResult.java create mode 100644 src/main/java/inc/sdt/controlcentermanagement/presentation/support/CustomPage.java create mode 100644 src/main/java/inc/sdt/controlcentermanagement/presentation/support/CustomPageable.java create mode 100644 src/main/java/inc/sdt/controlcentermanagement/presentation/support/CustomPageableImpl.java create mode 100644 src/main/java/inc/sdt/controlcentermanagement/presentation/support/PageableResource.java create mode 100644 src/main/java/inc/sdt/controlcentermanagement/presentation/support/PageableResourceImpl.java create mode 100644 src/main/java/inc/sdt/controlcentermanagement/presentation/support/PageableResponse.java diff --git a/src/main/java/inc/sdt/controlcentermanagement/application/DefaultStatsService.java b/src/main/java/inc/sdt/controlcentermanagement/application/DefaultStatsService.java index 38c5f71..842ef68 100644 --- a/src/main/java/inc/sdt/controlcentermanagement/application/DefaultStatsService.java +++ b/src/main/java/inc/sdt/controlcentermanagement/application/DefaultStatsService.java @@ -1,7 +1,168 @@ package inc.sdt.controlcentermanagement.application; +import com.fasterxml.jackson.core.type.TypeReference; +import inc.sdt.controlcentermanagement.domain.DataResource; +import inc.sdt.controlcentermanagement.domain.Slot; +import inc.sdt.controlcentermanagement.infrastructure.resttemplate.RestTemplateRequestHandler; +import inc.sdt.controlcentermanagement.presentation.StatsCntRecord; +import inc.sdt.controlcentermanagement.presentation.StatsDetailRecord; +import inc.sdt.controlcentermanagement.presentation.StatsRecord; +import inc.sdt.controlcentermanagement.presentation.support.CustomPage; +import inc.sdt.controlcentermanagement.presentation.support.CustomPageable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.springframework.web.util.UriComponentsBuilder; + +import java.util.*; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; @Service public class DefaultStatsService implements StatsService{ + + private final SlotRepositoryDelegate slotRepositoryDelegate; + private final RestTemplateRequestHandler restTemplateHandler; + private final String dataFallEndPoint; + private final Logger log = LoggerFactory.getLogger(DefaultStatsService.class); + + public DefaultStatsService(SlotRepositoryDelegate slotRepositoryDelegate, RestTemplateRequestHandler restTemplateHandler, @Value("${data-fall.endpoint}") String dataFallEndPoint) { + this.slotRepositoryDelegate = slotRepositoryDelegate; + this.restTemplateHandler = restTemplateHandler; + this.dataFallEndPoint = dataFallEndPoint; + } + + @Override + public List getChamberStats() { + List all= slotRepositoryDelegate.getAll(); + + Map> groupByChamber = all.stream().collect(Collectors.groupingBy(Slot::getChamberNumber)); + + List results = new LinkedList<>(); + + groupByChamber.forEach((chamberNumber, slotList) -> { + AtomicReference onTotalCnt = new AtomicReference<>(0); + AtomicReference offTotalCnt = new AtomicReference<>(0); + AtomicReference errTotalCnt = new AtomicReference<>(0); + AtomicReference onCnt = new AtomicReference<>(0); + AtomicReference offCnt = new AtomicReference<>(0); + AtomicReference err2Cnt = new AtomicReference<>(0); + + for(Slot slot : slotList){ + String url = UriComponentsBuilder.fromUriString(dataFallEndPoint) + .path(String.format("/assets/%s/tags/%s/data/latest", slot.getAssetCode(), slot.getSlotNumber())) + .build() + .toUriString(); + Optional> optional = restTemplateHandler.httpGetRequestWithAuth(url, "bearer authkey", "", new TypeReference<>() { + }); + log.info("optional = {}",optional); + if(optional.isPresent()){ + List content = optional.get().getContent(); + for(DataResource dataResource : content){ + dataResource.getData().forEach((key, value)->{ + if(key.contains("er2")){ + errTotalCnt.updateAndGet(v -> v + 1); + if((int)value > 0){ + err2Cnt.updateAndGet(v -> v + 1); + } + } + + if(key.contains("do")){ + onTotalCnt.updateAndGet(v -> v + 1); + offTotalCnt.updateAndGet(v -> v + 1); + if((int)value > 0){ + onCnt.updateAndGet(v -> v + 1); + }else{ + offCnt.updateAndGet(v -> v + 1); + } + } + }); + } + + } + } + StatsCntRecord onCntRecord = new StatsCntRecord(onCnt.get(), onTotalCnt.get()); + StatsCntRecord offCntRecord = new StatsCntRecord(offCnt.get(), offTotalCnt.get()); + StatsCntRecord errCntRecord = new StatsCntRecord(err2Cnt.get(), errTotalCnt.get()); + StatsRecord statsRecord = new StatsRecord(chamberNumber, onCntRecord, offCntRecord, errCntRecord); + results.add(statsRecord); + }); + + return results; + } + + @Override + public Page getChamberStatsDetail(int page, int size, String chamberNumber) { + List all= slotRepositoryDelegate.getAll().stream().filter(slot -> slot.getChamberNumber().equals(chamberNumber)).toList(); + Pageable pageable = PageRequest.of(page, size); + + List statsDetailRecords = new LinkedList<>(); + all.forEach((slot -> { + String url = UriComponentsBuilder.fromUriString(dataFallEndPoint) + .path(String.format("/assets/%s/tags/%s/data/latest", slot.getAssetCode(), slot.getSlotNumber())) + .build() + .toUriString(); + Optional> optional = restTemplateHandler.httpGetRequestWithAuth(url, "bearer authkey", "", new TypeReference<>() { + }); + //Tube{code='2', voltageOffset=1.0, ampereOffset=1.0} + + Map currentMap = new HashMap<>(); + Map voltageMap = new HashMap<>(); + Map doMap = new HashMap<>(); + Map er1Map = new HashMap<>(); + Map er2Map = new HashMap<>(); + + if(optional.isPresent()){ + List content = optional.get().getContent(); + for(DataResource dataResource : content){ + dataResource.getData().forEach((key, value)->{ + if(key.startsWith("current")){ + currentMap.put(key.replace("current",""), value); + }else if(key.startsWith("voltage")){ + voltageMap.put(key.replace("voltage",""), value); + }else if(key.startsWith("do")){ + doMap.put(key.replace("do",""), value); + }else if(key.startsWith("er1")){ + er1Map.put(key.replace("er1",""), value); + }else if(key.startsWith("er2")){ + er2Map.put(key.replace("er2",""), value); + } + }); + } + } + for(int i=0 ; i < 16 ; i++){ + StatsDetailRecord statsDetailRecord = new StatsDetailRecord( + slot.getSlotNumber(), + String.valueOf(i), + "status", + String.valueOf(voltageMap.get(String.valueOf(i))), + String.valueOf(currentMap.get(String.valueOf(i))), + String.valueOf(doMap.get(String.valueOf(i))), + String.valueOf(er1Map.get(String.valueOf(i))), + String.valueOf(er2Map.get(String.valueOf(i))), + "passTime", + "retentionRate", + String.valueOf(slot.getTube().get(i).getVoltageOffset()), + String.valueOf(slot.getTube().get(i).getAmpereOffset()) + ); + statsDetailRecords.add(statsDetailRecord); + } + })); + + statsDetailRecords.sort(new StatsDetailSlotNumberComparator()); + + int start = (int) pageable.getOffset(); + int end = Math.min((start + pageable.getPageSize()), statsDetailRecords.size()); + + List pageContent = statsDetailRecords.subList(start, end); + + Page entities = new PageImpl<>(pageContent, pageable, statsDetailRecords.size()); + + return entities; + } } diff --git a/src/main/java/inc/sdt/controlcentermanagement/application/SlotRepositoryDelegate.java b/src/main/java/inc/sdt/controlcentermanagement/application/SlotRepositoryDelegate.java index 9f9e443..15564c0 100644 --- a/src/main/java/inc/sdt/controlcentermanagement/application/SlotRepositoryDelegate.java +++ b/src/main/java/inc/sdt/controlcentermanagement/application/SlotRepositoryDelegate.java @@ -9,4 +9,6 @@ import java.util.List; */ public interface SlotRepositoryDelegate { List get(String chamberNumber); + + List getAll(); } diff --git a/src/main/java/inc/sdt/controlcentermanagement/application/StatsDetailSlotNumberComparator.java b/src/main/java/inc/sdt/controlcentermanagement/application/StatsDetailSlotNumberComparator.java new file mode 100644 index 0000000..4136350 --- /dev/null +++ b/src/main/java/inc/sdt/controlcentermanagement/application/StatsDetailSlotNumberComparator.java @@ -0,0 +1,17 @@ +package inc.sdt.controlcentermanagement.application; + +import inc.sdt.controlcentermanagement.presentation.StatsDetailRecord; + +import java.util.Comparator; + +public class StatsDetailSlotNumberComparator implements Comparator { + @Override + public int compare(StatsDetailRecord o1, StatsDetailRecord o2) { + if(Integer.parseInt(o1.getSlotNumber()) > Integer.parseInt(o2.getSlotNumber())){ + return 1; + }else if(Integer.parseInt(o1.getSlotNumber()) < Integer.parseInt(o2.getSlotNumber())){ + return -1; + } + return 0; + } +} diff --git a/src/main/java/inc/sdt/controlcentermanagement/application/StatsDetailTubeIdComparator.java b/src/main/java/inc/sdt/controlcentermanagement/application/StatsDetailTubeIdComparator.java new file mode 100644 index 0000000..8c2d568 --- /dev/null +++ b/src/main/java/inc/sdt/controlcentermanagement/application/StatsDetailTubeIdComparator.java @@ -0,0 +1,17 @@ +package inc.sdt.controlcentermanagement.application; + +import inc.sdt.controlcentermanagement.presentation.StatsDetailRecord; + +import java.util.Comparator; + +public class StatsDetailTubeIdComparator implements Comparator { + @Override + public int compare(StatsDetailRecord o1, StatsDetailRecord o2) { + if(Integer.parseInt(o1.getTubeId()) > Integer.parseInt(o2.getTubeId())){ + return 1; + }else if(Integer.parseInt(o1.getTubeId()) < Integer.parseInt(o2.getTubeId())){ + return -1; + } + return 0; + } +} diff --git a/src/main/java/inc/sdt/controlcentermanagement/application/StatsService.java b/src/main/java/inc/sdt/controlcentermanagement/application/StatsService.java index f4ea2e5..b90b17a 100644 --- a/src/main/java/inc/sdt/controlcentermanagement/application/StatsService.java +++ b/src/main/java/inc/sdt/controlcentermanagement/application/StatsService.java @@ -1,4 +1,13 @@ package inc.sdt.controlcentermanagement.application; +import inc.sdt.controlcentermanagement.presentation.StatsDetailRecord; +import inc.sdt.controlcentermanagement.presentation.StatsRecord; +import org.springframework.data.domain.Page; + +import java.util.List; + public interface StatsService { + List getChamberStats(); + + Page getChamberStatsDetail(int page, int size, String chamberNumber); } diff --git a/src/main/java/inc/sdt/controlcentermanagement/domain/DataResource.java b/src/main/java/inc/sdt/controlcentermanagement/domain/DataResource.java new file mode 100644 index 0000000..53d1376 --- /dev/null +++ b/src/main/java/inc/sdt/controlcentermanagement/domain/DataResource.java @@ -0,0 +1,49 @@ +package inc.sdt.controlcentermanagement.domain; + +import java.util.Map; + +/** + * @author eunsan.goh (esgoh@sdt.inc) + **/ +public class DataResource { + + private String assetCode; + private String modelCode; + private Long timestamp; + private Map data; + private DataType dataType; + + public DataResource() { + } + + @Override + public String toString() { + return "DataResource{" + + "assetCode='" + assetCode + '\'' + + ", modelCode='" + modelCode + '\'' + + ", timestamp=" + timestamp + + ", data.size=" + data.size() + + ", dataType=" + dataType + + '}'; + } + + public String getAssetCode() { + return assetCode; + } + + public String getModelCode() { + return modelCode; + } + + public Long getTimestamp() { + return timestamp; + } + + public Map getData() { + return data; + } + + public DataType getDataType() { + return dataType; + } +} diff --git a/src/main/java/inc/sdt/controlcentermanagement/domain/DataType.java b/src/main/java/inc/sdt/controlcentermanagement/domain/DataType.java new file mode 100644 index 0000000..0a9176d --- /dev/null +++ b/src/main/java/inc/sdt/controlcentermanagement/domain/DataType.java @@ -0,0 +1,9 @@ +package inc.sdt.controlcentermanagement.domain; + +/** + * @author eunsan.goh (esgoh@sdt.inc) + **/ +public enum DataType { + STATE, + DATA +} diff --git a/src/main/java/inc/sdt/controlcentermanagement/infrastructure/amqp/RegisterResourceProducer.java b/src/main/java/inc/sdt/controlcentermanagement/infrastructure/amqp/RegisterResourceProducer.java index 0689a72..11f8fff 100644 --- a/src/main/java/inc/sdt/controlcentermanagement/infrastructure/amqp/RegisterResourceProducer.java +++ b/src/main/java/inc/sdt/controlcentermanagement/infrastructure/amqp/RegisterResourceProducer.java @@ -51,6 +51,6 @@ class RegisterResourceProducer implements Consumer { public void accept(ResourceMessagePayload payload) { log.info("[accept] payload={}", payload); Message message = messageConverter.toMessage(payload, messageProperties); - rabbitTemplate.send(exchange, routingKey, message); +// rabbitTemplate.send(exchange, routingKey, message); } } diff --git a/src/main/java/inc/sdt/controlcentermanagement/infrastructure/nosql/SlotNoSQLRepository.java b/src/main/java/inc/sdt/controlcentermanagement/infrastructure/nosql/SlotNoSQLRepository.java index 5bb78d2..2de9c31 100644 --- a/src/main/java/inc/sdt/controlcentermanagement/infrastructure/nosql/SlotNoSQLRepository.java +++ b/src/main/java/inc/sdt/controlcentermanagement/infrastructure/nosql/SlotNoSQLRepository.java @@ -32,6 +32,15 @@ public class SlotNoSQLRepository implements SlotRepositoryDelegate { .toList(); } + @Override + public List getAll() { + log.debug("[getAll]"); + return slotRepository.findAllByOrderByChamberNumberAscSlotNumberAsc() + .stream() + .map(this::to) + .toList(); + } + private Slot to(SlotDocument slotDocument) { return Slot.builder() .id(slotDocument.getId()) diff --git a/src/main/java/inc/sdt/controlcentermanagement/infrastructure/nosql/SlotRepository.java b/src/main/java/inc/sdt/controlcentermanagement/infrastructure/nosql/SlotRepository.java index c7e6b69..1854398 100644 --- a/src/main/java/inc/sdt/controlcentermanagement/infrastructure/nosql/SlotRepository.java +++ b/src/main/java/inc/sdt/controlcentermanagement/infrastructure/nosql/SlotRepository.java @@ -9,4 +9,5 @@ import java.util.List; */ public interface SlotRepository extends MongoRepository { List findAllByChamberNumber(String chamberNumber); + List findAllByOrderByChamberNumberAscSlotNumberAsc(); } diff --git a/src/main/java/inc/sdt/controlcentermanagement/infrastructure/resttemplate/RestTemplateHandler.java b/src/main/java/inc/sdt/controlcentermanagement/infrastructure/resttemplate/RestTemplateHandler.java index 5312a20..bd45e47 100644 --- a/src/main/java/inc/sdt/controlcentermanagement/infrastructure/resttemplate/RestTemplateHandler.java +++ b/src/main/java/inc/sdt/controlcentermanagement/infrastructure/resttemplate/RestTemplateHandler.java @@ -6,4 +6,5 @@ import java.util.Optional; public interface RestTemplateHandler { Optional httpPostRequestWithAuth(String url, String authorization, Object body, TypeReference typeReference); + Optional httpGetRequestWithAuth(String url, String authorization, Object body, TypeReference typeReference); } \ No newline at end of file diff --git a/src/main/java/inc/sdt/controlcentermanagement/infrastructure/resttemplate/RestTemplateRequestHandler.java b/src/main/java/inc/sdt/controlcentermanagement/infrastructure/resttemplate/RestTemplateRequestHandler.java index fabcc2f..75a5f64 100644 --- a/src/main/java/inc/sdt/controlcentermanagement/infrastructure/resttemplate/RestTemplateRequestHandler.java +++ b/src/main/java/inc/sdt/controlcentermanagement/infrastructure/resttemplate/RestTemplateRequestHandler.java @@ -30,4 +30,15 @@ public class RestTemplateRequestHandler implements RestTemplateHandler { ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(body, headers), parameterizedType); return Optional.ofNullable(response.getBody()); } + + @Override + public Optional httpGetRequestWithAuth(String url, String authorization, Object body, TypeReference typeReference) { + log.info("[httpGetRequestWithAuth] url = {}", url); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setBearerAuth(authorization.split(" ")[1]); + ParameterizedTypeReference parameterizedType = ParameterizedTypeReference.forType(typeReference.getType()); + ResponseEntity response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(body, headers), parameterizedType); + return Optional.ofNullable(response.getBody()); + } } diff --git a/src/main/java/inc/sdt/controlcentermanagement/presentation/StatsCntRecord.java b/src/main/java/inc/sdt/controlcentermanagement/presentation/StatsCntRecord.java new file mode 100644 index 0000000..01a3010 --- /dev/null +++ b/src/main/java/inc/sdt/controlcentermanagement/presentation/StatsCntRecord.java @@ -0,0 +1,19 @@ +package inc.sdt.controlcentermanagement.presentation; + +public class StatsCntRecord { + private Integer correctCount; + private Integer totalCount; + + public StatsCntRecord(Integer correctCount, Integer totalCount) { + this.correctCount = correctCount; + this.totalCount = totalCount; + } + + public Integer getCorrectCount() { + return correctCount; + } + + public Integer getTotalCount() { + return totalCount; + } +} diff --git a/src/main/java/inc/sdt/controlcentermanagement/presentation/StatsController.java b/src/main/java/inc/sdt/controlcentermanagement/presentation/StatsController.java index 211b449..222d4fd 100644 --- a/src/main/java/inc/sdt/controlcentermanagement/presentation/StatsController.java +++ b/src/main/java/inc/sdt/controlcentermanagement/presentation/StatsController.java @@ -1,12 +1,16 @@ package inc.sdt.controlcentermanagement.presentation; import inc.sdt.controlcentermanagement.application.StatsService; +import inc.sdt.controlcentermanagement.presentation.support.CustomPageable; +import inc.sdt.controlcentermanagement.presentation.support.CustomPageableImpl; +import inc.sdt.controlcentermanagement.presentation.support.PageableResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController public class StatsController { @@ -20,24 +24,36 @@ public class StatsController { @ResponseStatus(HttpStatus.OK) - @GetMapping("/chambers") - public String chambers( + @GetMapping("/chamber/stats") + public StatsResult chambers( // @RequestHeader("Authorization") String authorization ){ - log.info("[chambers]"); + log.info("[chambers stats]"); + + List chamberStats = statsService.getChamberStats(); + + return new StatsResult(chamberStats); + } + + @ResponseStatus(HttpStatus.OK) + @GetMapping("/chamber/stats/{chamberNumber}") + public PageableResponse detail( +// @RequestHeader("Authorization") String authorization + @PathVariable String chamberNumber, + @RequestParam(value = "page", required = false, defaultValue = "0") Integer page, + @RequestParam(value = "size", required = false, defaultValue = "20") Integer size + ){ + log.info("[chambers stats]"); + Page chamberStatsDetail = statsService.getChamberStatsDetail(Integer.max(0, page), (page >= 0 ? size : Integer.MAX_VALUE), chamberNumber); + + if(chamberStatsDetail.hasContent()){ + return PageableResponse.from(chamberStatsDetail, this::from); + } return null; } - // 챔버 갯수 및 번호 주는 api - // 이건 전체 화면 챔버 번호 들어오면 그 챔버에 있는 노드큐 및 슬롯으로 수경님 api 호출해서 합산하기 - // 상세에서는 번호는 슬롯번호 mes code는 튜번호로 해서 쭉 보여주기 - - - - - - //@ResourceMapping(name = "Tube_Control", method = "PATCH", uri = "/chamber/{chamberNumber}/tube/toggle", description = "Tube On/Off 제어") - // @ResponseStatus(HttpStatus.OK) - // @PatchMapping("/chamber/{chamberNumber}/tube/toggle") + private StatsDetailRecord from(StatsDetailRecord statsDetailRecord){ + return statsDetailRecord; + } } diff --git a/src/main/java/inc/sdt/controlcentermanagement/presentation/StatsDetailRecord.java b/src/main/java/inc/sdt/controlcentermanagement/presentation/StatsDetailRecord.java new file mode 100644 index 0000000..c6379b3 --- /dev/null +++ b/src/main/java/inc/sdt/controlcentermanagement/presentation/StatsDetailRecord.java @@ -0,0 +1,79 @@ +package inc.sdt.controlcentermanagement.presentation; + +public class StatsDetailRecord { + private String slotNumber; + private String tubeId; + private String status; + private String voltage; + private String current; + private String pin; + private String err1; + private String err2; + private String passTime; + private String retentionRate; + private String voltageOffset; + private String currentOffset; + + public StatsDetailRecord(String slotNumber, String tubeId, String status, String voltage, String current, String pin, String err1, String err2, String passTime, String retentionRate, String voltageOffset, String currentOffset) { + this.slotNumber = slotNumber; + this.tubeId = tubeId; + this.status = status; + this.voltage = voltage; + this.current = current; + this.pin = pin; + this.err1 = err1; + this.err2 = err2; + this.passTime = passTime; + this.retentionRate = retentionRate; + this.voltageOffset = voltageOffset; + this.currentOffset = currentOffset; + } + + public String getVoltageOffset() { + return voltageOffset; + } + + public String getCurrentOffset() { + return currentOffset; + } + + public String getSlotNumber() { + return slotNumber; + } + + public String getTubeId() { + return tubeId; + } + + public String getStatus() { + return status; + } + + public String getVoltage() { + return voltage; + } + + public String getCurrent() { + return current; + } + + public String getPin() { + return pin; + } + + public String getErr1() { + return err1; + } + + public String getErr2() { + return err2; + } + + public String getPassTime() { + return passTime; + } + + public String getRetentionRate() { + return retentionRate; + } +} diff --git a/src/main/java/inc/sdt/controlcentermanagement/presentation/StatsRecord.java b/src/main/java/inc/sdt/controlcentermanagement/presentation/StatsRecord.java new file mode 100644 index 0000000..6877eb4 --- /dev/null +++ b/src/main/java/inc/sdt/controlcentermanagement/presentation/StatsRecord.java @@ -0,0 +1,31 @@ +package inc.sdt.controlcentermanagement.presentation; + +public class StatsRecord { + private String chamberNumber; + private StatsCntRecord onCnt; + private StatsCntRecord offCnt; + private StatsCntRecord errCnt; + + public StatsRecord(String chamberNumber, StatsCntRecord onCnt, StatsCntRecord offCnt, StatsCntRecord errCnt) { + this.chamberNumber = chamberNumber; + this.onCnt = onCnt; + this.offCnt = offCnt; + this.errCnt = errCnt; + } + + public String getChamberNumber() { + return chamberNumber; + } + + public StatsCntRecord getOnCnt() { + return onCnt; + } + + public StatsCntRecord getOffCnt() { + return offCnt; + } + + public StatsCntRecord getErrCnt() { + return errCnt; + } +} diff --git a/src/main/java/inc/sdt/controlcentermanagement/presentation/StatsResult.java b/src/main/java/inc/sdt/controlcentermanagement/presentation/StatsResult.java new file mode 100644 index 0000000..9979c1f --- /dev/null +++ b/src/main/java/inc/sdt/controlcentermanagement/presentation/StatsResult.java @@ -0,0 +1,15 @@ +package inc.sdt.controlcentermanagement.presentation; + +import java.util.List; + +public class StatsResult { + private List contents; + + public StatsResult(List contents) { + this.contents = contents; + } + + public List getContents() { + return contents; + } +} diff --git a/src/main/java/inc/sdt/controlcentermanagement/presentation/support/CustomPage.java b/src/main/java/inc/sdt/controlcentermanagement/presentation/support/CustomPage.java new file mode 100644 index 0000000..e027430 --- /dev/null +++ b/src/main/java/inc/sdt/controlcentermanagement/presentation/support/CustomPage.java @@ -0,0 +1,42 @@ +package inc.sdt.controlcentermanagement.presentation.support; + +import org.springframework.util.Assert; + +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author eunsan.goh (esgoh@sdt.inc) + **/ +public class CustomPage { + private List content; + private CustomPageableImpl pageable; + + public CustomPage(List content, CustomPageableImpl pageable) { + this.content = content; + this.pageable = pageable; + } + + public CustomPage() { + } + + public List getContent() { + return content; + } + + public CustomPageableImpl getPageable() { + return pageable; + } + +// public CustomPage map(Function converter) { +// return new CustomPage<>(getConvertedContent(converter), getPageable()); +// } + + private List getConvertedContent(Function converter) { + + Assert.notNull(converter, "Function must not be null"); + + return content.stream().map(converter).collect(Collectors.toList()); + } +} diff --git a/src/main/java/inc/sdt/controlcentermanagement/presentation/support/CustomPageable.java b/src/main/java/inc/sdt/controlcentermanagement/presentation/support/CustomPageable.java new file mode 100644 index 0000000..6816825 --- /dev/null +++ b/src/main/java/inc/sdt/controlcentermanagement/presentation/support/CustomPageable.java @@ -0,0 +1,20 @@ +package inc.sdt.controlcentermanagement.presentation.support; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +/** + * @author eunsan.goh (esgoh@sdt.inc) + **/ +public interface CustomPageable { + long getTotalElements(); + + int getTotalPages(); + + int getSize(); + + int getPage(); + + int offset(); + + String sortDirection(); +} diff --git a/src/main/java/inc/sdt/controlcentermanagement/presentation/support/CustomPageableImpl.java b/src/main/java/inc/sdt/controlcentermanagement/presentation/support/CustomPageableImpl.java new file mode 100644 index 0000000..0376bb7 --- /dev/null +++ b/src/main/java/inc/sdt/controlcentermanagement/presentation/support/CustomPageableImpl.java @@ -0,0 +1,63 @@ +package inc.sdt.controlcentermanagement.presentation.support; + +/** + * @author eunsan.goh (esgoh@sdt.inc) + **/ +public class CustomPageableImpl implements CustomPageable { + private long totalElements; + private int totalPages; + private int size; + private int page; + private String sortDirection; + + private CustomPageableImpl() { + } + + public static CustomPageableImpl createPageRequest(int size, int page, String sortDirection) { + CustomPageableImpl pageable = new CustomPageableImpl(); + pageable.size = size; + pageable.page = page; + pageable.sortDirection = sortDirection; + return pageable; + } + + public static CustomPageableImpl createPageableResource(CustomPageable pageable, long totalElements, int totalPages) { + CustomPageableImpl pageableResource = new CustomPageableImpl(); + pageableResource.totalElements = totalElements; + pageableResource.totalPages = pageable.getPage() < 0 ? 1 : totalPages; + pageableResource.size = pageable.getPage() < 0 ? (int) totalElements : pageable.getSize(); + pageableResource.page = Math.max(pageable.getPage(), 0); + pageableResource.sortDirection = pageable.sortDirection(); + return pageableResource; + } + + @Override + public long getTotalElements() { + return totalElements; + } + + @Override + public int getTotalPages() { + return totalPages; + } + + @Override + public int getSize() { + return size; + } + + @Override + public int getPage() { + return page; + } + + @Override + public int offset() { + return size * page; + } + + @Override + public String sortDirection() { + return sortDirection; + } +} \ No newline at end of file diff --git a/src/main/java/inc/sdt/controlcentermanagement/presentation/support/PageableResource.java b/src/main/java/inc/sdt/controlcentermanagement/presentation/support/PageableResource.java new file mode 100644 index 0000000..693570c --- /dev/null +++ b/src/main/java/inc/sdt/controlcentermanagement/presentation/support/PageableResource.java @@ -0,0 +1,14 @@ +package inc.sdt.controlcentermanagement.presentation.support; + +/** + * @author Minkyu Kim (minkyu.kim@sdt.inc) + */ +public interface PageableResource { + long getTotalElements(); + + int getTotalPages(); + + int getSize(); + + int getPage(); +} diff --git a/src/main/java/inc/sdt/controlcentermanagement/presentation/support/PageableResourceImpl.java b/src/main/java/inc/sdt/controlcentermanagement/presentation/support/PageableResourceImpl.java new file mode 100644 index 0000000..7ca5577 --- /dev/null +++ b/src/main/java/inc/sdt/controlcentermanagement/presentation/support/PageableResourceImpl.java @@ -0,0 +1,53 @@ +package inc.sdt.controlcentermanagement.presentation.support; + +import org.springframework.data.domain.Page; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Minkyu Kim (minkyu.kim@sdt.inc) + */ +public class PageableResourceImpl implements PageableResource, Serializable { + @Serial + private static final long serialVersionUID = 8670430894447655773L; + private final long totalElements; + private final int totalPage; + private final int size; + private final int page; + + PageableResourceImpl(long totalElements, int totalPage, int size, int page) { + this.totalElements = totalElements; + this.totalPage = totalPage; + this.size = size; + this.page = page; + } + + public static PageableResourceImpl from(Page page) { + return new PageableResourceImpl( + page.getTotalElements(), + page.getTotalPages(), + page.getSize(), + page.getPageable().getPageNumber()); + } + + @Override + public long getTotalElements() { + return totalElements; + } + + @Override + public int getTotalPages() { + return totalPage; + } + + @Override + public int getSize() { + return size; + } + + @Override + public int getPage() { + return page; + } +} diff --git a/src/main/java/inc/sdt/controlcentermanagement/presentation/support/PageableResponse.java b/src/main/java/inc/sdt/controlcentermanagement/presentation/support/PageableResponse.java new file mode 100644 index 0000000..831e9e4 --- /dev/null +++ b/src/main/java/inc/sdt/controlcentermanagement/presentation/support/PageableResponse.java @@ -0,0 +1,34 @@ +package inc.sdt.controlcentermanagement.presentation.support; + + +import org.springframework.data.domain.Page; + +import java.util.List; +import java.util.function.Function; + +/** + * @author Minkyu Kim (minkyu.kim@sdt.inc) + */ +public class PageableResponse { + private final List content; + private final PageableResource pageable; + + PageableResponse(List content, PageableResource pageable) { + this.content = content; + this.pageable = pageable; + } + + public static PageableResponse from(Page page, Function converter) { + return new PageableResponse<>( + page.map(converter).getContent(), + PageableResourceImpl.from(page)); + } + + public PageableResource getPageable() { + return pageable; + } + + public List getContent() { + return content; + } +} \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index a2140b1..0bbf263 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -6,8 +6,10 @@ spring: name: control-center-management data: mongodb: - uri: mongodb://13.209.39.139:32000/awexomeray?authSource=admin + uri: mongodb://sdt:251327@13.209.39.139:32000/awexomeray?authSource=admin +data-fall: + endpoint: http://13.209.39.139:32171 deployer: endpoint: http://localhost:8085