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/bas/flight/controller/BasFlightController.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java index 2f01e8ed..5f0d0d17 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java @@ -391,10 +391,10 @@ public class BasFlightController { return ResponseEntity.ok().body(new SuccessResponse(response)); } - // @PostMapping("/coord") - // public JSONObject coordTest(@RequestBody Coordinate coordinate) throws IOException, ParseException { - - // return FlightUtils.getCoordinateGis(coordinate); - - // } +// @PostMapping("/coord") +// public JSONObject coordTest(@RequestBody Coordinate coordinate) throws IOException, ParseException { +// +// return FlightUtils.getCoordinateGis(coordinate); +// +// } } \ 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 37ef7d26..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 @@ -23,6 +23,7 @@ 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; @@ -303,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") 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 c1a17a19..0fe39c11 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 @@ -11,6 +11,7 @@ import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel; import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; import com.palnet.biz.api.bas.group.model.BasGroupModel; import com.palnet.biz.jpa.repository.pty.*; +import com.querydsl.core.Tuple; import lombok.extern.slf4j.Slf4j; @@ -138,9 +139,6 @@ public class MainDashService { String userAuth = token.getUserAuthByToken(); List userGroupList = token.getGroupAuthByToken(); - - log.info(">>>>>>>>> groupList {} " , userAuth); - BasGroupModel myFirstGroup = new BasGroupModel(); List resultList = new ArrayList(); @@ -158,6 +156,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 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 cb16a98a..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 @@ -87,7 +87,7 @@ public class MainStatisticsService { } result[0] = "%Y-%m-%d"; - result[1] = "%Y-%m-%d"; + result[1] = "%H:00:00"; } else { throw new NumberFormatException(); } 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/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