Browse Source

feat: CPT_CD 적용X, 통계기능 추가

feature/dos/statistics
lkd9125(이경도) 1 week ago
parent
commit
79814eecd8
  1. 4
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/controller/StatisticsDosController.java
  2. 1
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/AllStatDataRS.java
  3. 11
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/CptStatRS.java
  4. 30
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/service/StatisticsDosService.java
  5. 160
      pav-server/src/main/java/com/palnet/biz/jpa/repository/dos/DosFltPlanAreaQueryRepository.java

4
pav-server/src/main/java/com/palnet/biz/api/bas/dos/controller/StatisticsDosController.java

@ -27,11 +27,11 @@ public class StatisticsDosController {
}
@GetMapping("/table-data")
public ResponseEntity<?> tableData(@RequestParam CptStatRQ rq){
public ResponseEntity<?> tableData(CptStatRQ rq){
CptStatRS result = statisticsDosService.cptStatData(rq);
return ResponseEntity.ok().body(null);
return ResponseEntity.ok().body(result);
}

1
pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/AllStatDataRS.java

@ -23,5 +23,6 @@ public class AllStatDataRS {
private Long month;
private Long day;
}
}

11
pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/CptStatRS.java

@ -16,10 +16,17 @@ public class CptStatRS {
private String cptName; // 관할청 이름
private Long count; // 카운트
private List<DateCountModel> countModel; // 카운트
private List<CoordinateModel> coordinateModels; // 중심좌표
}
@Data
public static class DateCountModel{
private String date;
private Long count;
}
@Data

30
pav-server/src/main/java/com/palnet/biz/api/bas/dos/service/StatisticsDosService.java

@ -3,6 +3,7 @@ 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;
@ -10,6 +11,8 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@Slf4j
@RequiredArgsConstructor
@ -19,10 +22,16 @@ public class StatisticsDosService {
private final DosFltPlanAreaRepository dosFltPlanAreaRepository;
private final DosFltPlanAreaQueryRepository dosFltPlanAreaQueryRepository;
public AllStatDataRS allData() {
AllStatDataRS.GroupModel fullApproval = dosFltPlanAreaQueryRepository.allApplyData();
AllStatDataRS result = new AllStatDataRS();
result.setFullApproval(fullApproval);
return result;
}
@ -30,26 +39,29 @@ public class StatisticsDosService {
public CptStatRS cptStatData(CptStatRQ rq) {
List<CptStatRS.CptStat> cptList = dosFltPlanAreaQueryRepository.cptStatData(rq);
CptStatRS result = new CptStatRS();
result.setCptList(cptList);
return result;
}
@Getter
@RequiredArgsConstructor
private enum Auth{
public enum CompetentAgency{
F0001("서울지방항공청(항공운항과)"),
F0002("김포항공관리사무소(안전운항과)"),
F0002("김포항공관리사무소"),
F0001("서울지방항공청"),
F0003("양양공항출장소"),
F0004("원주공항출장소"),
F0005("청주공항출장소"),
F0006("군산공항출장소"),
F0007("부산지방항공청(항공운항과)"),
F0008("제주지방항공청(안전운항과)"),
F0009("정석비행장"),
F0007("부산지방항공청"),
F0010("울진공항출장소"),
C0001("울산공항출장소"),
C0002("여수공항출장소"),
C0003("무안공항출장소"),
;
private final String desc;

160
pav-server/src/main/java/com/palnet/biz/jpa/repository/dos/DosFltPlanAreaQueryRepository.java

@ -0,0 +1,160 @@
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.Expressions;
import com.querydsl.core.types.dsl.NumberTemplate;
import com.querydsl.core.types.dsl.StringTemplate;
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.ArrayList;
import java.util.List;
@Repository
@Slf4j
@RequiredArgsConstructor
public class DosFltPlanAreaQueryRepository {
private final JPAQueryFactory query;
public AllStatDataRS.GroupModel allApplyData() {
QDosFltPlanArea qDosFltPlanArea = QDosFltPlanArea.dosFltPlanArea;
QDosFltPlanBas qDosFltPlanBas = QDosFltPlanBas.dosFltPlanBas;
// TODO :: CPT_CD가 추가 되면 사용할 것, 가장 신청이 많은 항공청 코드를 가져와야함
// String cptCd = "";
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(qDosFltPlanArea.cptCd.eq(cptCd));
AllStatDataRS.GroupModel groupModel = query
.select(
Projections.bean(
AllStatDataRS.GroupModel.class,
qDosFltPlanArea.count().as("all"),
yearTemplate.as("year"),
monthTemplate.as("month"),
todayTemplate.as("day")
)
)
.from(qDosFltPlanArea)
.leftJoin(qDosFltPlanBas)
.on(qDosFltPlanArea.planSno.eq(qDosFltPlanBas.planSno))
.fetchOne();
// groupModel.setGroupName(cptCd);
return groupModel;
}
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 cptCd = competnetAgency.name();
String format = this.getFormat(rq.getCategory());
StringTemplate formattedDate = Expressions.stringTemplate("DATE_FORMAT({0},{1})", qDosFltPlanBas.applyDt , format);
BooleanBuilder builder = new BooleanBuilder();
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());
// TODO :: CPT_CD 나오기전 임시 코드
if(cptCd.equals("F0002")){
cptStatModel.setCountModel(countModel);
cptStatModel.setCoordinateModels(coordinateModels);
}
cptStatList.add(cptStatModel);
}
return cptStatList;
}
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…
Cancel
Save