Compare commits
8 Commits
89b19689b6
...
8408433d06
Author | SHA1 | Date |
---|---|---|
lkd9125(이경도) | 8408433d06 | 20 hours ago |
lkd9125(이경도) | 7fcee082cb | 20 hours ago |
lkd9125(이경도) | ada61e90a0 | 22 hours ago |
lkd9125(이경도) | b05d7dbdb3 | 5 days ago |
lkd9125(이경도) | e46a819b4c | 1 week ago |
lkd9125(이경도) | 2a3115abef | 1 week ago |
lkd9125(이경도) | 79814eecd8 | 1 week ago |
lkd9125(이경도) | 34767770f5 | 1 week ago |
7 changed files with 591 additions and 1 deletions
@ -0,0 +1,103 @@ |
|||||||
|
package com.palnet.biz.api.bas.dos.controller; |
||||||
|
|
||||||
|
import com.palnet.biz.api.bas.dos.model.AllStatDataRS; |
||||||
|
import com.palnet.biz.api.bas.dos.model.CptStatRQ; |
||||||
|
import com.palnet.biz.api.bas.dos.model.CptStatRS; |
||||||
|
import com.palnet.biz.api.bas.dos.service.StatisticsDosService; |
||||||
|
import com.palnet.biz.api.comn.response.ErrorResponse; |
||||||
|
import com.palnet.biz.api.comn.response.SuccessResponse; |
||||||
|
import com.palnet.comn.code.ErrorCode; |
||||||
|
import com.palnet.comn.exception.CustomException; |
||||||
|
import io.swagger.v3.oas.annotations.Operation; |
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag; |
||||||
|
import lombok.RequiredArgsConstructor; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springframework.http.HttpStatus; |
||||||
|
import org.springframework.http.ResponseEntity; |
||||||
|
import org.springframework.web.bind.annotation.*; |
||||||
|
|
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
@RestController |
||||||
|
@Slf4j |
||||||
|
@RequestMapping("/api/statistics/dos") |
||||||
|
@RequiredArgsConstructor |
||||||
|
@Tag(name = "드론 원스톱 통계 컨트롤러", description = "드론원스톱 통계 관련 API") |
||||||
|
public class StatisticsDosController { |
||||||
|
|
||||||
|
private final StatisticsDosService statisticsDosService; |
||||||
|
|
||||||
|
@GetMapping("/top-data") |
||||||
|
@Operation(summary = "통계 페이지 상단 데이터 조회", description = "가장 많은 비행승인 데이터가 들어온 관할기관 데이터를 조회합니다.") |
||||||
|
public ResponseEntity<?> allData(){ |
||||||
|
|
||||||
|
AllStatDataRS result = null; |
||||||
|
|
||||||
|
try { |
||||||
|
result = statisticsDosService.allData(); |
||||||
|
} catch(CustomException e){ |
||||||
|
ErrorCode errorCode = ErrorCode.fromCode(e.getSourceErrorCode()); |
||||||
|
String paramMessage = (String) e.getParamArray()[0]; |
||||||
|
|
||||||
|
Map<String, Object> resultMap = new HashMap<>(); |
||||||
|
log.error("IGNORE : ", e); |
||||||
|
resultMap.put("result", false); |
||||||
|
resultMap.put("errorCode", errorCode.code()); |
||||||
|
resultMap.put("errorMessage", errorCode.message()); |
||||||
|
resultMap.put("errorDesc", paramMessage); |
||||||
|
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); |
||||||
|
} catch (Exception e) { |
||||||
|
/** |
||||||
|
* try{ |
||||||
|
... |
||||||
|
} |
||||||
|
* try 영역 안 코드들중 문제가 생기면 오는 곳. |
||||||
|
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 |
||||||
|
*/ |
||||||
|
log.error("IGONE : {}", e); |
||||||
|
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorResponse("Server Error", "-1")); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
return ResponseEntity.ok().body(result); |
||||||
|
} |
||||||
|
|
||||||
|
@GetMapping("/table-data") |
||||||
|
@Operation(summary = "통계 페이지 테이블 데이터 조회", description = "관할 기관 별 날짜별로 데이터 건수를 조회합니다.") |
||||||
|
public ResponseEntity<?> tableData(CptStatRQ rq){ |
||||||
|
|
||||||
|
CptStatRS result = null; |
||||||
|
|
||||||
|
try { |
||||||
|
result = statisticsDosService.cptStatData(rq); |
||||||
|
} catch(CustomException e){ |
||||||
|
ErrorCode errorCode = ErrorCode.fromCode(e.getSourceErrorCode()); |
||||||
|
String paramMessage = (String) e.getParamArray()[0]; |
||||||
|
|
||||||
|
Map<String, Object> resultMap = new HashMap<>(); |
||||||
|
log.error("IGNORE : ", e); |
||||||
|
resultMap.put("result", false); |
||||||
|
resultMap.put("errorCode", errorCode.code()); |
||||||
|
resultMap.put("errorMessage", errorCode.message()); |
||||||
|
resultMap.put("errorDesc", paramMessage); |
||||||
|
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); |
||||||
|
} catch (Exception e) { |
||||||
|
/** |
||||||
|
* try{ |
||||||
|
... |
||||||
|
} |
||||||
|
* try 영역 안 코드들중 문제가 생기면 오는 곳. |
||||||
|
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌 |
||||||
|
*/ |
||||||
|
log.error("IGONE : {}", e); |
||||||
|
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorResponse("Server Error", "-1")); |
||||||
|
} |
||||||
|
|
||||||
|
return ResponseEntity.ok().body(result); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,37 @@ |
|||||||
|
package com.palnet.biz.api.bas.dos.model; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class AllStatDataRS { |
||||||
|
|
||||||
|
private List<GroupModel> fullApproval; |
||||||
|
|
||||||
|
private List<GroupModel> controlApproval; |
||||||
|
|
||||||
|
private List<GroupModel> nonControlApproval; |
||||||
|
|
||||||
|
@Data |
||||||
|
public static class GroupModel{ |
||||||
|
|
||||||
|
private List<String> groupName; |
||||||
|
|
||||||
|
private Long all; |
||||||
|
|
||||||
|
private Long year; |
||||||
|
|
||||||
|
private Long month; |
||||||
|
|
||||||
|
private Long day; |
||||||
|
|
||||||
|
public GroupModel(){ |
||||||
|
this.groupName = new ArrayList<>(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
package com.palnet.biz.api.bas.dos.model; |
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.time.LocalDate; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class CptStatRQ { |
||||||
|
|
||||||
|
@Schema(description = "[ year: 연도별, month: 월별, day: 일일 ] 카테고리 선택 컬럼" , example = "month") |
||||||
|
private String category; |
||||||
|
|
||||||
|
@Schema(description = "검색 시작일자" , example = "2024-03-01") |
||||||
|
private LocalDate startDt; |
||||||
|
|
||||||
|
@Schema(description = "검색 종료일자" , example = "2024-12-31") |
||||||
|
private LocalDate endDt; |
||||||
|
} |
@ -0,0 +1,44 @@ |
|||||||
|
package com.palnet.biz.api.bas.dos.model; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class CptStatRS { |
||||||
|
|
||||||
|
private List<CptStat> cptList; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Data |
||||||
|
public static class CptStat{ |
||||||
|
|
||||||
|
private String cptName; // 관할청 이름
|
||||||
|
|
||||||
|
private String cptCd; |
||||||
|
|
||||||
|
private List<DateCountModel> countModel; // 카운트
|
||||||
|
|
||||||
|
private List<CoordinateModel> coordinateModels; // 중심좌표
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Data |
||||||
|
public static class DateCountModel{ |
||||||
|
private String date; |
||||||
|
|
||||||
|
private Long count; |
||||||
|
} |
||||||
|
|
||||||
|
@Data |
||||||
|
public static class CoordinateModel{ |
||||||
|
|
||||||
|
private Double lat; // 위도 36.. ~~
|
||||||
|
|
||||||
|
private Double lon; // 경도 126.. ~~
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,69 @@ |
|||||||
|
package com.palnet.biz.api.bas.dos.service; |
||||||
|
|
||||||
|
import com.palnet.biz.api.bas.dos.model.AllStatDataRS; |
||||||
|
import com.palnet.biz.api.bas.dos.model.CptStatRQ; |
||||||
|
import com.palnet.biz.api.bas.dos.model.CptStatRS; |
||||||
|
import com.palnet.biz.jpa.repository.dos.DosFltPlanAreaQueryRepository; |
||||||
|
import com.palnet.biz.jpa.repository.dos.DosFltPlanAreaRepository; |
||||||
|
import com.palnet.biz.jpa.repository.dos.DosFltPlanBasRepository; |
||||||
|
import lombok.Getter; |
||||||
|
import lombok.RequiredArgsConstructor; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Service |
||||||
|
@Slf4j |
||||||
|
@RequiredArgsConstructor |
||||||
|
public class StatisticsDosService { |
||||||
|
|
||||||
|
private final DosFltPlanAreaQueryRepository dosFltPlanAreaQueryRepository; |
||||||
|
|
||||||
|
public AllStatDataRS allData() { |
||||||
|
|
||||||
|
List<AllStatDataRS.GroupModel> fullApproval = dosFltPlanAreaQueryRepository.allApplyTopData(); |
||||||
|
List<AllStatDataRS.GroupModel> controlApproval = dosFltPlanAreaQueryRepository.controlApplyTopData(true); |
||||||
|
List<AllStatDataRS.GroupModel> nonControlApproval = dosFltPlanAreaQueryRepository.controlApplyTopData(false); |
||||||
|
|
||||||
|
AllStatDataRS result = new AllStatDataRS(); |
||||||
|
result.setFullApproval(fullApproval); |
||||||
|
result.setControlApproval(controlApproval); |
||||||
|
result.setNonControlApproval(nonControlApproval); |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public CptStatRS cptStatData(CptStatRQ rq) { |
||||||
|
|
||||||
|
|
||||||
|
List<CptStatRS.CptStat> cptList = dosFltPlanAreaQueryRepository.cptStatData(rq); |
||||||
|
|
||||||
|
CptStatRS result = new CptStatRS(); |
||||||
|
result.setCptList(cptList); |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
@Getter |
||||||
|
@RequiredArgsConstructor |
||||||
|
public enum CompetentAgency{ |
||||||
|
|
||||||
|
F0002("김포항공관리사무소"), |
||||||
|
F0001("서울지방항공청"), |
||||||
|
F0003("양양공항출장소"), |
||||||
|
F0004("원주공항출장소"), |
||||||
|
F0006("군산공항출장소"), |
||||||
|
F0007("부산지방항공청"), |
||||||
|
F0010("울진공항출장소"), |
||||||
|
C0001("울산공항출장소"), |
||||||
|
C0002("여수공항출장소"), |
||||||
|
C0003("무안공항출장소"), |
||||||
|
; |
||||||
|
|
||||||
|
private final String desc; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,317 @@ |
|||||||
|
package com.palnet.biz.jpa.repository.dos; |
||||||
|
|
||||||
|
import com.palnet.biz.api.bas.dos.model.AllStatDataRS; |
||||||
|
import com.palnet.biz.api.bas.dos.model.CptStatRQ; |
||||||
|
import com.palnet.biz.api.bas.dos.model.CptStatRS; |
||||||
|
import com.palnet.biz.api.bas.dos.service.StatisticsDosService; |
||||||
|
import com.palnet.biz.jpa.entity.QDosFltPlanArea; |
||||||
|
import com.palnet.biz.jpa.entity.QDosFltPlanBas; |
||||||
|
import com.palnet.comn.code.ErrorCode; |
||||||
|
import com.palnet.comn.exception.CustomException; |
||||||
|
import com.querydsl.core.BooleanBuilder; |
||||||
|
import com.querydsl.core.types.Projections; |
||||||
|
import com.querydsl.core.types.dsl.*; |
||||||
|
import com.querydsl.jpa.impl.JPAQueryFactory; |
||||||
|
import lombok.RequiredArgsConstructor; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springframework.stereotype.Repository; |
||||||
|
|
||||||
|
import java.time.LocalDate; |
||||||
|
import java.util.*; |
||||||
|
import java.util.concurrent.ConcurrentHashMap; |
||||||
|
import java.util.stream.Collectors; |
||||||
|
|
||||||
|
@Repository |
||||||
|
@Slf4j |
||||||
|
@RequiredArgsConstructor |
||||||
|
public class DosFltPlanAreaQueryRepository { |
||||||
|
|
||||||
|
private final JPAQueryFactory query; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 총 데이터 조회 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public List<AllStatDataRS.GroupModel> allApplyTopData() { |
||||||
|
|
||||||
|
QDosFltPlanArea qDosFltPlanArea = QDosFltPlanArea.dosFltPlanArea; |
||||||
|
QDosFltPlanBas qDosFltPlanBas = QDosFltPlanBas.dosFltPlanBas; |
||||||
|
|
||||||
|
Integer year = LocalDate.now().getYear(); |
||||||
|
Integer month = LocalDate.now().getMonth().getValue(); |
||||||
|
|
||||||
|
NumberTemplate<Long> yearTemplate = Expressions.numberTemplate(Long.class, "COUNT(CASE WHEN YEAR({0}) = {1} THEN 1 END)", qDosFltPlanBas.applyDt, year); |
||||||
|
NumberTemplate<Long> monthTemplate = Expressions.numberTemplate(Long.class, "COUNT(CASE WHEN YEAR({0}) = {1} AND MONTH({2}) = {3} THEN 1 END)", qDosFltPlanBas.applyDt, year, qDosFltPlanBas.applyDt, month); |
||||||
|
NumberTemplate<Long> todayTemplate = Expressions.numberTemplate(Long.class, "COUNT(CASE WHEN DATE({0}) = CURDATE() THEN 1 END)", qDosFltPlanBas.applyDt); |
||||||
|
|
||||||
|
BooleanBuilder builder = new BooleanBuilder(); |
||||||
|
builder.and(Expressions.booleanTemplate("{0} IS NOT NULL", qDosFltPlanArea.cptCd)); |
||||||
|
|
||||||
|
Map<String, AllStatDataRS.GroupModel> groupModel = query |
||||||
|
.select( |
||||||
|
Projections.bean( |
||||||
|
AllStatDataRS.GroupModel.class, |
||||||
|
qDosFltPlanArea.cptCd.as("groupName"), |
||||||
|
qDosFltPlanArea.count().as("all"), |
||||||
|
yearTemplate.as("year"), |
||||||
|
monthTemplate.as("month"), |
||||||
|
todayTemplate.as("day") |
||||||
|
) |
||||||
|
) |
||||||
|
.from(qDosFltPlanArea) |
||||||
|
.leftJoin(qDosFltPlanBas) |
||||||
|
.on(qDosFltPlanArea.planSno.eq(qDosFltPlanBas.planSno)) |
||||||
|
.where(builder) |
||||||
|
.groupBy(qDosFltPlanArea.cptCd) |
||||||
|
.fetch() |
||||||
|
.stream() |
||||||
|
.collect(Collectors.toMap( |
||||||
|
key -> { |
||||||
|
|
||||||
|
if(key.getGroupName() == null) return ""; |
||||||
|
|
||||||
|
StringBuilder result = new StringBuilder(); |
||||||
|
|
||||||
|
key.getGroupName().forEach(node -> { |
||||||
|
result.append(node); |
||||||
|
result.append(","); |
||||||
|
}); |
||||||
|
|
||||||
|
result.deleteCharAt(result.length() - 1); |
||||||
|
|
||||||
|
return result.toString(); |
||||||
|
}, |
||||||
|
value -> value |
||||||
|
)); |
||||||
|
|
||||||
|
return this.topDataParsing(groupModel); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 관제, 비관제 데이터 조회 |
||||||
|
* @param controlFlag TRUE : 관제권 조회, FALSE : 비 관제권 조회 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public List<AllStatDataRS.GroupModel> controlApplyTopData(Boolean controlFlag) { |
||||||
|
QDosFltPlanArea qDosFltPlanArea = QDosFltPlanArea.dosFltPlanArea; |
||||||
|
QDosFltPlanBas qDosFltPlanBas = QDosFltPlanBas.dosFltPlanBas; |
||||||
|
|
||||||
|
Integer year = LocalDate.now().getYear(); |
||||||
|
Integer month = LocalDate.now().getMonth().getValue(); |
||||||
|
|
||||||
|
NumberTemplate<Long> yearTemplate = Expressions.numberTemplate(Long.class, "COUNT(CASE WHEN YEAR({0}) = {1} THEN 1 END)", qDosFltPlanBas.applyDt, year); |
||||||
|
NumberTemplate<Long> monthTemplate = Expressions.numberTemplate(Long.class, "COUNT(CASE WHEN YEAR({0}) = {1} AND MONTH({2}) = {3} THEN 1 END)", qDosFltPlanBas.applyDt, year, qDosFltPlanBas.applyDt, month); |
||||||
|
NumberTemplate<Long> todayTemplate = Expressions.numberTemplate(Long.class, "COUNT(CASE WHEN DATE({0}) = CURDATE() THEN 1 END)", qDosFltPlanBas.applyDt); |
||||||
|
|
||||||
|
ListPath<String, StringPath> groupingColumn = null; |
||||||
|
BooleanBuilder builder = new BooleanBuilder(); |
||||||
|
builder.and(Expressions.booleanTemplate("{0} IS NOT NULL", qDosFltPlanArea.cptCd)); |
||||||
|
|
||||||
|
if(controlFlag){ |
||||||
|
builder.and(Expressions.booleanTemplate("{0} IS NOT NULL", qDosFltPlanArea.innerCptCd)); |
||||||
|
groupingColumn = qDosFltPlanArea.innerCptCd; |
||||||
|
} else { |
||||||
|
builder.and(Expressions.booleanTemplate("{0} IS NULL", qDosFltPlanArea.innerCptCd)); |
||||||
|
groupingColumn = qDosFltPlanArea.cptCd; |
||||||
|
} |
||||||
|
|
||||||
|
Map<String, AllStatDataRS.GroupModel> groupModel = query |
||||||
|
.select( |
||||||
|
Projections.bean( |
||||||
|
AllStatDataRS.GroupModel.class, |
||||||
|
groupingColumn.as("groupName"), |
||||||
|
qDosFltPlanArea.count().as("all"), |
||||||
|
yearTemplate.as("year"), |
||||||
|
monthTemplate.as("month"), |
||||||
|
todayTemplate.as("day") |
||||||
|
) |
||||||
|
) |
||||||
|
.from(qDosFltPlanArea) |
||||||
|
.leftJoin(qDosFltPlanBas) |
||||||
|
.on(qDosFltPlanArea.planSno.eq(qDosFltPlanBas.planSno)) |
||||||
|
.where(builder) |
||||||
|
.groupBy(groupingColumn) |
||||||
|
.fetch() |
||||||
|
.stream() |
||||||
|
.collect(Collectors.toMap( |
||||||
|
key -> { |
||||||
|
if(key.getGroupName() == null) return ""; |
||||||
|
|
||||||
|
StringBuilder result = new StringBuilder(); |
||||||
|
|
||||||
|
key.getGroupName().forEach(node -> { |
||||||
|
result.append(node); |
||||||
|
result.append(","); |
||||||
|
}); |
||||||
|
|
||||||
|
result.deleteCharAt(result.length() - 1); |
||||||
|
|
||||||
|
return result.toString(); |
||||||
|
}, |
||||||
|
value -> value |
||||||
|
)); |
||||||
|
|
||||||
|
return this.topDataParsing(groupModel); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 공항별 데이터 통계 |
||||||
|
* @param rq |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public List<CptStatRS.CptStat> cptStatData(CptStatRQ rq) { |
||||||
|
|
||||||
|
QDosFltPlanArea qDosFltPlanArea = QDosFltPlanArea.dosFltPlanArea; |
||||||
|
QDosFltPlanBas qDosFltPlanBas = QDosFltPlanBas.dosFltPlanBas; |
||||||
|
|
||||||
|
StatisticsDosService.CompetentAgency[] constants = StatisticsDosService.CompetentAgency.values(); |
||||||
|
|
||||||
|
List<CptStatRS.CptStat> cptStatList = new ArrayList<>(); |
||||||
|
|
||||||
|
for(StatisticsDosService.CompetentAgency competnetAgency : constants){ |
||||||
|
|
||||||
|
String format = this.getFormat(rq.getCategory()); |
||||||
|
StringTemplate formattedDate = Expressions.stringTemplate("DATE_FORMAT({0},{1})", qDosFltPlanBas.applyDt , format); |
||||||
|
|
||||||
|
String cptCd = competnetAgency.name(); |
||||||
|
|
||||||
|
BooleanBuilder builder = new BooleanBuilder(); |
||||||
|
builder.and(Expressions.booleanTemplate("{0} LIKE CONCAT('%', {1}, '%')", qDosFltPlanArea.cptCd, cptCd)); |
||||||
|
|
||||||
|
if(!rq.getCategory().equals("year")){ |
||||||
|
builder.and(qDosFltPlanBas.applyDt.goe(rq.getStartDt())); |
||||||
|
builder.and(qDosFltPlanBas.applyDt.loe(rq.getEndDt())); |
||||||
|
} |
||||||
|
|
||||||
|
List<CptStatRS.DateCountModel> countModel = query |
||||||
|
.select( |
||||||
|
Projections.bean( |
||||||
|
CptStatRS.DateCountModel.class, |
||||||
|
formattedDate.as("date"), |
||||||
|
qDosFltPlanArea.count().as("count") |
||||||
|
) |
||||||
|
) |
||||||
|
.from(qDosFltPlanArea) |
||||||
|
.leftJoin(qDosFltPlanBas) |
||||||
|
.on(qDosFltPlanArea.planSno.eq(qDosFltPlanBas.planSno)) |
||||||
|
.where(builder) |
||||||
|
.groupBy(formattedDate) |
||||||
|
.fetch(); |
||||||
|
|
||||||
|
List<CptStatRS.CoordinateModel> coordinateModels = query |
||||||
|
.select( |
||||||
|
Projections.bean( |
||||||
|
CptStatRS.CoordinateModel.class, |
||||||
|
qDosFltPlanArea.lat.as("lat"), |
||||||
|
qDosFltPlanArea.lon.as("lon") |
||||||
|
) |
||||||
|
) |
||||||
|
.from(qDosFltPlanArea) |
||||||
|
.leftJoin(qDosFltPlanBas) |
||||||
|
.on(qDosFltPlanArea.planSno.eq(qDosFltPlanBas.planSno)) |
||||||
|
.where(builder) |
||||||
|
.fetch(); |
||||||
|
|
||||||
|
|
||||||
|
CptStatRS.CptStat cptStatModel = new CptStatRS.CptStat(); |
||||||
|
cptStatModel.setCptName(competnetAgency.getDesc()); |
||||||
|
cptStatModel.setCptCd(competnetAgency.name()); |
||||||
|
cptStatModel.setCountModel(countModel); |
||||||
|
cptStatModel.setCoordinateModels(coordinateModels); |
||||||
|
|
||||||
|
cptStatList.add(cptStatModel); |
||||||
|
} |
||||||
|
|
||||||
|
return cptStatList; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private List<AllStatDataRS.GroupModel> topDataParsing(Map<String, AllStatDataRS.GroupModel> groupModel){ |
||||||
|
Map<String, AllStatDataRS.GroupModel> currentMap = new ConcurrentHashMap<>(groupModel); |
||||||
|
|
||||||
|
// CptCd가 한 개가 아닌 값들에 대한 로직
|
||||||
|
for(Map.Entry<String, AllStatDataRS.GroupModel> entry : currentMap.entrySet()){ |
||||||
|
|
||||||
|
String[] cptCdArray = entry.getKey().split(","); |
||||||
|
|
||||||
|
// CptCd가 1개일 경우 continue
|
||||||
|
if(cptCdArray.length <= 1) continue; |
||||||
|
|
||||||
|
for(String cptCd : cptCdArray){ |
||||||
|
|
||||||
|
// 기존 Map에 없는 값일 경우 CptCd를 Key로 새로 만들어 put
|
||||||
|
if(currentMap.get(cptCd) == null){ |
||||||
|
AllStatDataRS.GroupModel node = new AllStatDataRS.GroupModel(); |
||||||
|
node.setGroupName(Collections.singletonList(cptCd)); |
||||||
|
node.setAll(entry.getValue().getAll()); |
||||||
|
node.setYear(entry.getValue().getYear()); |
||||||
|
node.setMonth(entry.getValue().getMonth()); |
||||||
|
node.setDay(entry.getValue().getDay()); |
||||||
|
|
||||||
|
currentMap.put(cptCd, node); |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
// 기존 값이 있을 경우 객체를 새로운 메모리에 할당하여 put
|
||||||
|
AllStatDataRS.GroupModel node = new AllStatDataRS.GroupModel(); |
||||||
|
node.setGroupName(Collections.singletonList(cptCd)); |
||||||
|
node.setAll(currentMap.get(cptCd).getAll() + entry.getValue().getAll()); |
||||||
|
node.setYear(currentMap.get(cptCd).getYear() + entry.getValue().getYear()); |
||||||
|
node.setMonth(currentMap.get(cptCd).getMonth() + entry.getValue().getMonth()); |
||||||
|
node.setDay(currentMap.get(cptCd).getDay() + entry.getValue().getDay()); |
||||||
|
|
||||||
|
currentMap.put(cptCd, node); |
||||||
|
} |
||||||
|
|
||||||
|
currentMap.remove(entry.getKey()); |
||||||
|
} |
||||||
|
|
||||||
|
// Key의 맞는 GroupName Set
|
||||||
|
currentMap.forEach((key, value) -> { |
||||||
|
value.setGroupName(Collections.singletonList(key)); |
||||||
|
}); |
||||||
|
|
||||||
|
// 총 카운트가 가장많은 값 추출
|
||||||
|
Long max = currentMap.values().stream() |
||||||
|
.mapToLong(AllStatDataRS.GroupModel::getAll) |
||||||
|
.max() |
||||||
|
.orElse(0); |
||||||
|
|
||||||
|
List<AllStatDataRS.GroupModel> result = new ArrayList<>(); |
||||||
|
|
||||||
|
// 가장 많은 값만 반환 리스트에 ADD
|
||||||
|
for(Map.Entry<String, AllStatDataRS.GroupModel> entry : currentMap.entrySet()){ |
||||||
|
if(entry.getValue().getAll().equals(max)){ |
||||||
|
result.add(entry.getValue()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if(result.isEmpty()) result.add(new AllStatDataRS.GroupModel()); |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
private String getFormat(String category){ |
||||||
|
String format = null; |
||||||
|
|
||||||
|
switch (category){ |
||||||
|
case "year": |
||||||
|
format = "%Y"; |
||||||
|
break; |
||||||
|
case "month": |
||||||
|
format = "%Y-%m"; |
||||||
|
break; |
||||||
|
case "day": |
||||||
|
format = "%Y-%m-%d"; |
||||||
|
break; |
||||||
|
default: |
||||||
|
throw new CustomException(ErrorCode.NON_VALID_PARAMETER); |
||||||
|
} |
||||||
|
|
||||||
|
return format; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue