diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/controller/AcntCstmrController.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/controller/AcntCstmrController.java index e06419d6..d75a6529 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/controller/AcntCstmrController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/controller/AcntCstmrController.java @@ -13,7 +13,6 @@ import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -31,7 +30,6 @@ import java.util.Map; @Tag(name = "회원관리", description = "회원 관련 API") public class AcntCstmrController { - @Autowired private final AcntCstmrService service; @PostMapping(value = "/register") diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmerRlModel.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmerRlModel.java index 77dc62f3..89f36506 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmerRlModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmerRlModel.java @@ -27,5 +27,7 @@ public class AnctCstmerRlModel { private Instant updateDt; private String updateuserId; + + private String cptAuthCode; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtUserModel.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtUserModel.java index 03ca37fa..dd04a14f 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtUserModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtUserModel.java @@ -16,85 +16,88 @@ import java.util.*; @AllArgsConstructor public class JwtUserModel implements UserDetails { - @Id - @GeneratedValue(strategy= GenerationType.IDENTITY) - @Column(name = "CSTMR_SNO", unique = true) - private Integer cstmrSno; - - @Column(name = "USER_ID", unique = true) - private String userId; - - @Column(name = "USER_PSWD") - private String userPswd; - - @Column(name = "SITE_CODE") - private String siteCode; - - @Column(name = "AUTH_ID") - private String auth; - - @Column(name = "CSTMR_STATUS_CD") - private String cstmrStatusCd; - - @Transient - private String userNm; - @Transient - private List group; - - - // 사용자의 권한을 콜렉션 형태로 반환 - // 단, 클래스 자료형은 GrantedAuthority를 구현해야함 - @Override - public Collection getAuthorities() { - Set roles = new HashSet<>(); - for (String role : auth.split(",")) { - roles.add(new SimpleGrantedAuthority(role)); - } - return roles; - } - - // 사용자의 id를 반환 (unique한 값) - @Override - public String getUsername() { - return userId; - } - - // 사용자의 password를 반환 - @Override - public String getPassword() { - return userPswd; - } - - // 계정 만료 여부 반환 - @Override - public boolean isAccountNonExpired() { - // 만료되었는지 확인하는 로직 - return true; // true -> 만료되지 않았음 - } - - // 계정 잠금 여부 반환 - @Override - public boolean isAccountNonLocked() { - // 계정 잠금되었는지 확인하는 로직 - if(cstmrStatusCd.equals("A")) - return true; - else - return false; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "CSTMR_SNO", unique = true) + private Integer cstmrSno; + + @Column(name = "USER_ID", unique = true) + private String userId; + + @Column(name = "USER_PSWD") + private String userPswd; + + @Column(name = "SITE_CODE") + private String siteCode; + + @Column(name = "AUTH_ID") + private String auth; + + @Column(name = "CSTMR_STATUS_CD") + private String cstmrStatusCd; + + @Column(name = "CPT_AUTH_CODE") + private String cptAuthCode; + + @Transient + private String userNm; + @Transient + private List group; + + + // 사용자의 권한을 콜렉션 형태로 반환 + // 단, 클래스 자료형은 GrantedAuthority를 구현해야함 + @Override + public Collection getAuthorities() { + Set roles = new HashSet<>(); + for (String role : auth.split(",")) { + roles.add(new SimpleGrantedAuthority(role)); + } + return roles; + } + + // 사용자의 id를 반환 (unique한 값) + @Override + public String getUsername() { + return userId; + } + + // 사용자의 password를 반환 + @Override + public String getPassword() { + return userPswd; + } + + // 계정 만료 여부 반환 + @Override + public boolean isAccountNonExpired() { + // 만료되었는지 확인하는 로직 + return true; // true -> 만료되지 않았음 + } + + // 계정 잠금 여부 반환 + @Override + public boolean isAccountNonLocked() { + // 계정 잠금되었는지 확인하는 로직 + if ("A".equals(cstmrStatusCd)) + return true; + else + return false; // return true; // true -> 잠금되지 않았음 - } - - // 패스워드의 만료 여부 반환 - @Override - public boolean isCredentialsNonExpired() { - // 패스워드가 만료되었는지 확인하는 로직 - return true; // true -> 만료되지 않았음 - } - - // 계정 사용 가능 여부 반환 - @Override - public boolean isEnabled() { - // 계정이 사용 가능한지 확인하는 로직 - return true; // true -> 사용 가능 - } - + } + + // 패스워드의 만료 여부 반환 + @Override + public boolean isCredentialsNonExpired() { + // 패스워드가 만료되었는지 확인하는 로직 + return true; // true -> 만료되지 않았음 + } + + // 계정 사용 가능 여부 반환 + @Override + public boolean isEnabled() { + // 계정이 사용 가능한지 확인하는 로직 + return true; // true -> 사용 가능 + } + } diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java index ee450bd2..86e1ef84 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java @@ -73,6 +73,7 @@ public class JwtTokenUtil implements Serializable { claims.put("auth", userDetails.getAuth()); claims.put("group", userDetails.getGroup()); claims.put("userNm", userDetails.getUserNm()); + claims.put("cptAuthCode", userDetails.getCptAuthCode()); return doGenerateToken(claims, userDetails.getUsername()); } @@ -178,4 +179,17 @@ public class JwtTokenUtil implements Serializable { return payload.get("auth", String.class); } + + + public String getCptAuthCodeByToken() { + HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String token = rq.getHeader("Authorization"); + + if (token == null || "".equals(token)) return null; + + token = token.substring(JWT_PREFIX.length()).trim(); + Claims payload = getAllClaimsFromToken(token); + + return payload.get("cptAuthCode", String.class); + } } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/elev/controller/ComnElevController.java b/pav-server/src/main/java/com/palnet/biz/api/comn/elev/controller/ComnElevController.java index 4dd9f7a7..765c57df 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/elev/controller/ComnElevController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/elev/controller/ComnElevController.java @@ -8,13 +8,10 @@ import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.SuccessResponse; import com.palnet.comn.exception.CustomException; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java index 712e6995..1e4a1346 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/controller/MainDashController.java @@ -1,9 +1,9 @@ package com.palnet.biz.api.main.dash.controller; +import java.util.ArrayList; import java.util.List; import java.util.Map; -import com.palnet.biz.api.main.dash.model.MainDashFlightNumStcsModel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -17,11 +17,13 @@ import org.springframework.web.bind.annotation.RestController; import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.ErrorResponse; import com.palnet.biz.api.comn.response.SuccessResponse; +import com.palnet.biz.api.main.dash.model.MainCurrentStcsModel; import com.palnet.biz.api.main.dash.model.MainDashFlightListModel; import com.palnet.biz.api.main.dash.model.MainDashListModel; import com.palnet.biz.api.main.dash.model.MainDashStcsModel; import com.palnet.biz.api.main.dash.service.MainDashService; import com.palnet.comn.code.RSErrorCode; +import com.querydsl.core.Tuple; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -163,7 +165,7 @@ public class MainDashController { } - + @GetMapping(value = "/stcs/flight/date/{type}") @ApiOperation(value = "김포공항, 비행실적 통계") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -302,6 +304,24 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } + @GetMapping(value = "/stcs/dron-flight/") + @ApiOperation(value = "드론 비행 현황") + @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") + public ResponseEntity dronFlightStcs(){ + + Map result = null; + + try { + result = service.mainDashDronFlightStcs(); + }catch (Exception e) { + log.error("IGNORE : {}", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + } + + return ResponseEntity.ok().body(new SuccessResponse< Map>(result)); + } + @GetMapping(value = "/dron-flight/list/") @ApiOperation(value = "드론 별 비행운항 목록") @Tag(name = "메인화면 컨트롤러", description = "메인화면 관련 API") @@ -320,19 +340,20 @@ public class MainDashController { return ResponseEntity.ok().body(new SuccessResponse>(result)); } - @GetMapping("/stcs/dailyflight") - @ApiOperation(value = "일일 비행횟수 현황") - @Tag(name = "메인화면 컨트롤러",description = "메인화면 관련 API") - public ResponseEntity getDailyFlightNumOfStcs(){ - List result = null; + @GetMapping("/current/flight-warn") + public ResponseEntity currentFlightWarn(@RequestParam(required = false) String groupId){ + + List result = new ArrayList<>(); + try { - result = service.dailyFlightNumOfStcs(); - }catch (Exception e){ - log.error("IGNORE : {} ", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorResponse("Server Error", "-1")); + result = service.currentFlightWarn(groupId); + }catch (Exception e) { + log.error("IGNORE : {}", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); } - return ResponseEntity.ok().body(new SuccessResponse>(result)); - } + return ResponseEntity.ok().body(new SuccessResponse>(result)); + } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainCurrentStcsModel.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainCurrentStcsModel.java new file mode 100644 index 00000000..9259902f --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainCurrentStcsModel.java @@ -0,0 +1,15 @@ +package com.palnet.biz.api.main.dash.model; + +import lombok.Data; + +import java.util.List; + +@Data +public class MainCurrentStcsModel { + + private List stcsValues; + + private Double percent; + + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashFlightListModel.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashFlightListModel.java index 62020b19..40c89bed 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashFlightListModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/model/MainDashFlightListModel.java @@ -13,9 +13,9 @@ public class MainDashFlightListModel { private String idntfNum; - private Instant schFltStDt; + private Instant cntrlStDt; - private Instant schFltEndDt; + private Instant cntrlEndDt; private Object totalFlightTime; diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java b/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java index 02ea506a..8c597f2e 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/dash/service/MainDashService.java @@ -3,6 +3,7 @@ package com.palnet.biz.api.main.dash.service; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -15,6 +16,7 @@ import com.palnet.biz.api.main.dash.model.MainDashFlightNumStcsModel; import com.palnet.biz.jpa.entity.FltPlanBas; import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository; import com.palnet.biz.jpa.repository.pty.*; +import com.querydsl.core.Tuple; import lombok.extern.slf4j.Slf4j; @@ -23,10 +25,16 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import com.palnet.biz.api.main.dash.model.MainCurrentStcsModel; import com.palnet.biz.api.main.dash.model.MainDashFlightListModel; import com.palnet.biz.api.main.dash.model.MainDashListModel; import com.palnet.biz.api.main.dash.model.MainDashStcsModel; +import com.palnet.biz.api.main.statistics.service.MainStatisticsService; +import com.palnet.biz.jpa.entity.CtrCntrlWarnLog; +import com.palnet.biz.jpa.entity.FltPlanBas; +import com.palnet.biz.jpa.entity.type.WarnType; import com.palnet.biz.jpa.repository.ctr.CtrCntrlQueryRepository; +import com.palnet.biz.jpa.repository.ctr.CtrCntrlWarnLogQueryRepository; import com.palnet.biz.jpa.repository.flt.FltPlanArcrftRepository; import com.palnet.biz.jpa.repository.flt.FltPlanQueryRepository; @@ -46,6 +54,9 @@ public class MainDashService { @Autowired private FltPlanQueryRepository fltPlanQueryRepository; + + @Autowired + private CtrCntrlWarnLogQueryRepository ctrCntrlWarnLogQueryRepository; @Autowired private CtrCntrlQueryRepository query; @@ -55,6 +66,9 @@ public class MainDashService { @Autowired private JwtTokenUtil token; + + @Autowired + private MainStatisticsService mainStatisticsService; /** @@ -132,9 +146,6 @@ public class MainDashService { String userAuth = token.getUserAuthByToken(); List userGroupList = token.getGroupAuthByToken(); - - log.info(">>>>>>>>> groupList {} " , userAuth); - BasGroupModel myFirstGroup = new BasGroupModel(); List resultList = new ArrayList(); @@ -152,6 +163,29 @@ public class MainDashService { return resultList; } + + public Map mainDashDronFlightStcs(){ + + String userAuth = token.getUserAuthByToken(); + List userGroupList = token.getGroupAuthByToken(); + + BasGroupModel myFirstGroup = new BasGroupModel(); + + Map resultList = new HashMap<>(); + + if(userAuth.equals("SUPER")) { + + resultList = fltPlanQueryRepository.getFlightDronStcs("KAC"); + + }else { + + myFirstGroup = ptyGroupQueryRepository.myFirstGroup(userGroupList); + + resultList = fltPlanQueryRepository.getFlightDronStcs(myFirstGroup.getGroupId()); + } + + return resultList; + } /** * 김포공항, 비행승인 통계 * @param yyyymm @@ -324,4 +358,52 @@ public class MainDashService { return model; } + + public List currentFlightWarn(String groupId){ + final int sumCount = 3; // 3번은 합계 + + boolean authCheck = mainStatisticsService.authCheck(groupId); + + + String[] dateCate = {"-2", "-1", "0", "1"}; + + List result = new ArrayList<>(); + + for(String cate : dateCate){ + List cntrlWarnLogs = ctrCntrlWarnLogQueryRepository.currentStcs(groupId, authCheck, cate); + + int count = cntrlWarnLogs.size(); // + + int plan = (int)cntrlWarnLogs.stream().filter(value -> value.getWarnType().equals(WarnType.PLAN.getValue())).count(); + int altitude = (int)cntrlWarnLogs.stream().filter(value -> value.getWarnType().equals(WarnType.ALTITUDE.getValue())).count(); + int crash = (int)cntrlWarnLogs.stream().filter(value -> value.getWarnType().equals(WarnType.CRASH.getValue())).count(); + + List stcsValues = Arrays.asList(plan, altitude, crash, count); + + MainCurrentStcsModel node = new MainCurrentStcsModel(); + node.setStcsValues(stcsValues); + + result.add(node); + } + + for(int i = 0; i < result.size(); i++){ + + if(i == 0) continue;; + + int prevSum = result.get(i-1).getStcsValues().get(sumCount); // 전날 합계 [기준] + int sum = result.get(i).getStcsValues().get(sumCount); // 합계 + + double percent = 0; + + if(prevSum != 0){ + percent = ((sum - prevSum) / (double) prevSum) * 100; + } + + result.get(i).setPercent(percent); + } + + result.remove(0); + + return result; + } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/service/MainStatisticsService.java b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/service/MainStatisticsService.java index 5a5004d0..c89d9e19 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/main/statistics/service/MainStatisticsService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/main/statistics/service/MainStatisticsService.java @@ -111,7 +111,7 @@ public class MainStatisticsService { * @param groupId * @return */ - private Boolean authCheck(String groupId){ + public Boolean authCheck(String groupId){ if(groupId == null || groupId.equals("")) return false; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrBas.java index eb74031d..de62aa77 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCstmrBas.java @@ -34,11 +34,12 @@ public class PtyCstmrBas implements Serializable { @Column(name="CSTMR_STATUS_CD") private String cstmrStatusCd; -// @Temporal(TemporalType.TIMESTAMP) @Column(name="CSTMR_STATUS_CNG_DT", columnDefinition = "TIMESTAMP") private Instant cstmrStatusCngDt; -// @Temporal(TemporalType.TIMESTAMP) + @Column(name="CPT_AUTH_CODE") + private String cptAuthCode; + @Column(name="JOIN_DT", columnDefinition = "TIMESTAMP") private Instant joinDt; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlWarnLogQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlWarnLogQueryRepository.java index c7280cb1..4825bda1 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlWarnLogQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlWarnLogQueryRepository.java @@ -8,12 +8,15 @@ import org.springframework.stereotype.Repository; import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; import com.palnet.biz.api.main.statistics.model.FlightStcsValueModel; +import com.palnet.biz.jpa.entity.CtrCntrlWarnLog; +import com.palnet.biz.jpa.entity.FltPlanBas; import com.palnet.biz.jpa.entity.QCtrCntrlWarnLog; import com.palnet.biz.jpa.entity.QFltPlanBas; import com.palnet.biz.jpa.entity.QFltPlanCtrCntrlRel; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.ConstantImpl; import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.core.types.dsl.StringTemplate; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -284,4 +287,74 @@ public class CtrCntrlWarnLogQueryRepository { return result; } + + public List currentStcs(String groupId, boolean authCheck, String cate){ + QFltPlanBas qFltPlanBas = QFltPlanBas.fltPlanBas; + QFltPlanCtrCntrlRel qFltPlanCtrCntrlRel = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; + QCtrCntrlWarnLog qCtrCntrlWarnLog = QCtrCntrlWarnLog.ctrCntrlWarnLog; + + BooleanBuilder builder = getCurrentBooleanBuilder(groupId, authCheck, cate, qFltPlanBas, qCtrCntrlWarnLog); + + List stcsValues = query + .select( + Projections.bean( + CtrCntrlWarnLog.class, + qCtrCntrlWarnLog.warnType + ) + ) + .from(qCtrCntrlWarnLog) + .leftJoin(qFltPlanCtrCntrlRel) + .on(qFltPlanCtrCntrlRel.cntrlId.eq(qCtrCntrlWarnLog.cntrlId)) + .leftJoin(qFltPlanBas) + .on(qFltPlanCtrCntrlRel.planSno.eq(qFltPlanBas.planSno)) + .where(builder) + .groupBy(qCtrCntrlWarnLog.cntrlId) + .fetch(); + + return stcsValues; + } + + private BooleanBuilder getCurrentBooleanBuilder(String groupId, boolean authCheck, String cate, QFltPlanBas qFltPlanBas, QCtrCntrlWarnLog qCtrCntrlWarnLog){ + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(qFltPlanBas.groupId.eq(groupId)); + if(authCheck) builder.and(qFltPlanBas.cstmrSno.eq(jwtTokenUtil.getCstmrSnoByToken())); + + String dateFormat = "%Y-%m-%d"; + BooleanExpression dateExpression = null; + switch (cate){ + case "-2" : + dateExpression = + Expressions.stringTemplate("DATE_FORMAT({0}, {1})", qCtrCntrlWarnLog.createDt, dateFormat) + .eq(LocalDate.now().minusDays(2).toString()); + + builder.and(dateExpression); + + break; + case "-1": + dateExpression = + Expressions.stringTemplate("DATE_FORMAT({0}, {1})", qCtrCntrlWarnLog.createDt, dateFormat) + .eq(LocalDate.now().minusDays(1).toString()); + + builder.and(dateExpression); + break; + + case "0": + dateExpression = + Expressions.stringTemplate("DATE_FORMAT({0}, {1})", qCtrCntrlWarnLog.createDt, dateFormat) + .eq(LocalDate.now().toString()); + builder.and(dateExpression); + break; + + case "1": + dateExpression = + Expressions.stringTemplate("DATE_FORMAT({0}, {1})", qCtrCntrlWarnLog.createDt, dateFormat) + .eq(LocalDate.now().plusDays(1).toString()); + + builder.and(dateExpression); + break; + } + + return builder; + } } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java index 92194665..9e6b32d1 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java @@ -3,14 +3,14 @@ package com.palnet.biz.jpa.repository.flt; import java.time.Duration; import java.time.Instant; import java.time.LocalDate; -import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZoneOffset; import java.time.temporal.ChronoUnit; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Optional; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -26,7 +26,6 @@ import com.palnet.biz.api.bas.flight.model.BasFlightPlanListRq; import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel; import com.palnet.biz.api.bas.flight.model.BasFlightPlanPilotModel; import com.palnet.biz.api.bas.flight.model.BasFlightScheduleRs; -import com.palnet.biz.api.comn.file.service.ComnFileService; import com.palnet.biz.api.main.dash.model.MainDashFlightListModel; import com.palnet.biz.api.main.dash.model.MainDashStcsModel; import com.palnet.biz.api.main.statistics.model.FlightStcsValueModel; @@ -54,6 +53,7 @@ import com.palnet.biz.jpa.model.LaancPlanareaCoordDto; import com.palnet.comn.utils.DateUtils; import com.palnet.comn.utils.InstantUtils; import com.querydsl.core.BooleanBuilder; +import com.querydsl.core.Tuple; import com.querydsl.core.group.GroupBy; import com.querydsl.core.types.ConstantImpl; import com.querydsl.core.types.Expression; @@ -67,7 +67,6 @@ import com.querydsl.core.types.dsl.StringTemplate; import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; -import com.querydsl.sql.SQLExpressions; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -1740,6 +1739,7 @@ public class FltPlanQueryRepository { .leftJoin(qFltPlanBas) .on(qFltPlanBas.planSno.eq(qFltPlanCtrCntrlRel.planSno)) .where(builder) + .groupBy(qFltPlanCtrCntrlRel.idntfNum) .orderBy(qFltPlanCtrCntrlRel.planSno.countDistinct().desc()) .limit(5) .fetch(); @@ -1917,6 +1917,68 @@ public class FltPlanQueryRepository { .orderBy(((ComparableExpressionBase) groupOrder).desc(), cib.createDt.asc()) .fetch(); + return result; + } + + public Map getFlightDronStcs(String groupId){ + + QComIdntfBas cib = QComIdntfBas.comIdntfBas; + QFltPlanArcrft fpa = QFltPlanArcrft.fltPlanArcrft; + QFltPlanBas fpb = QFltPlanBas.fltPlanBas; + QPtyGroupBas pgb = QPtyGroupBas.ptyGroupBas; + QFltPlanCtrCntrlRel fpccr = QFltPlanCtrCntrlRel.fltPlanCtrCntrlRel; + QCtrCntrlBas ccb = QCtrCntrlBas.ctrCntrlBas; + + BooleanBuilder builder = new BooleanBuilder(); + + if(!groupId.equals("all")) { + builder.and(pgb.groupId.eq(groupId)); + } + Instant now = Instant.now(); + + Instant todayStart = LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC); + Instant todayEnd = LocalDate.now().plusDays(1).atStartOfDay().toInstant(ZoneOffset.UTC); + + List res = query + .select( + new CaseBuilder() + .when(ccb.statusCd.eq("01")).then("비행 중") + .when(ccb.statusCd.eq("99")).then("비행 완료") + .when(fpb.planSno.isNotNull()).then("비행 대기 중") + .otherwise("비행 없음").as("status"), + fpb.count() + ) + .from(fpa) + .leftJoin(fpb).on(fpb.planSno.eq(fpa.planSno)) + .leftJoin(pgb).on(pgb.groupId.eq(fpb.groupId)) + .leftJoin(cib).on(cib.idntfNum.eq(fpa.idntfNum)) + .leftJoin(fpccr).on(fpccr.planSno.eq(fpb.planSno)) + .leftJoin(ccb).on(ccb.cntrlId.eq(fpccr.cntrlId)) + .where( + builder + .and(fpb.schFltStDt.between( + now.atZone(ZoneId.of("Asia/Seoul")).truncatedTo(ChronoUnit.DAYS).toInstant(), + now.atZone(ZoneId.of("Asia/Seoul")).truncatedTo(ChronoUnit.DAYS).plus(1, ChronoUnit.DAYS).toInstant() + )) + .and(fpb.schFltEndDt.between( + now.atZone(ZoneId.of("Asia/Seoul")).truncatedTo(ChronoUnit.DAYS).toInstant(), + now.atZone(ZoneId.of("Asia/Seoul")).truncatedTo(ChronoUnit.DAYS).plus(1, ChronoUnit.DAYS).toInstant() + )) + .and(fpb.planSno.isNotNull()) + ) + .groupBy(ccb.statusCd) + .fetch(); + + Map result = new HashMap<>(); + + for (Tuple tuple : res) { + String status = tuple.get(0, String.class); + String count = tuple.get(1, Long.class).toString(); // Assuming count is at index 1 + + result.put(status, count); + } + + return result; } } \ No newline at end of file