Compare commits

...

422 Commits

Author SHA1 Message Date
lkd9125(이경도) fa0742f2b2 add: 임시커밋 8 months ago
lkd9125(이경도) c8cb2e1373 fix: 패턴로직 보완 8 months ago
lkd9125(이경도) 1610ca84d9 feat: 일출일몰 패턴 식 날짜계산으로 변, local프로필 스케줄러 시작 방지추가, 매일 새벽 2시로 크론식변경 8 months ago
lkd9125(이경도) 2312806fcf feat: 일출일몰 데이터 한반도 골고루 insert하는 스케줄러 추가 8 months ago
lkd9125(이경도) 61a6e3d568 Merge remote-tracking branch 'origin/develop' into develop 8 months ago
lkd9125(이경도) ae5f670d03 Fix: 기존 회원 패스워드 확안 기능의 RQ를 객체방식으로 받게끔 변경. 8 months ago
지대한 7a73c0e5ba fix: 메인 대시보드의 데이터를 못받아오는 현상 8 months ago
lkd9125(이경도) ff2fa08919 feat: 좌표로 일출일몰 List 조회 시 없는 해당 날짜에 없는 도시는 가장 가까운도시 추적하여 대신 조회하도록 변경. 8 months ago
lkd9125(이경도) a1d3ed44cc feat: 일출일몰 List 조회 시 없는 해당 날짜에 없는 도시는 가장 가까운도시 추적하여 대신 조회하도록 변경. 8 months ago
lkd9125(이경도) d767b3a6b5 feat: 일출일몰 시간계산 유틸추가 8 months ago
qkr7828 b86f0064a3 feat: DMS 유틸 수정 8 months ago
qkr7828 18145284d6 정렬 기준 변경 9 months ago
qkr7828 17b19b34f3 npe 수정 9 months ago
qkr7828 73b83ab28c . 9 months ago
qkr7828 09b9eecd34 . 9 months ago
qkr7828 4d4c33e3d0 npe 수정 9 months ago
qkr7828 a49114c590 식별번호 조건 변경 9 months ago
qkr7828(박재우) 89e3cf65d7 . 9 months ago
지대한 96fb1bdf02 swagger document update 9 months ago
지대한 8fdd882889 swagger document update2 9 months ago
지대한 99b69117ae Merge pull request '좌표로 관할청 매핑된곳 가져오기' (#16) from feature/coordinate/comptent-authority into develop 9 months ago
지대한 3820c8ea7e Merge branch 'develop' into feature/coordinate/comptent-authority 9 months ago
lkd9125(이경도) ad71102ecc 로그 삭제 및 복호화 코드 주석처리 9 months ago
lkd9125(이경도) 95cac94b68 로그확인용임시 커밋 9 months ago
qkr7828(박재우) 87ca73cb1d 헤딩각 360도 초과하는 오류 수정 9 months ago
qkr7828(박재우) be5bd19f2a . 9 months ago
qkr7828(박재우) 3fdfeb3f68 pav-utils 단위 변경 9 months ago
lkd9125(이경도) e12943d79d storage 주석 추가 9 months ago
lkd9125(이경도) 9b7f837cf5 main/statistics 패키지 주석추가 9 months ago
lkd9125(이경도) 10f236bcec main/dash 패키지 주석추가 9 months ago
lkd9125(이경도) d4a65abd14 ctr/cntrl 패키지 주석 9 months ago
lkd9125(이경도) 44251b04c7 conm/sms 9 months ago
lkd9125(이경도) 427665aff1 comn/sunriseset 패키지 주석추가 9 months ago
lkd9125(이경도) 84f14719c6 conm/file 패키지 주석추가 9 months ago
lkd9125(이경도) f64debca81 comn/elev 패키지 주석추가 9 months ago
lkd9125(이경도) 5e024d4af1 cns/qna 패키지 주석추가 9 months ago
lkd9125(이경도) 0c44929d81 cns/faq 패키지 주석추가 9 months ago
lkd9125(이경도) dd7f4eb99b Merge commit 'fab634f7b852323e196f44c6c171f76c520b2322' into develop 9 months ago
lkd9125(이경도) e240392b25 bas/group 패키지 주석추가 9 months ago
박재우 fab634f7b8 QR코드 만료시 코드 추가 9 months ago
지대한 ec12f0ba58 qr log 9 months ago
지대한 bfc2a00547 Merge remote-tracking branch 'origin/develop' into develop 9 months ago
지대한 2ed4aa5e47 3분 이내 검증 버그 9 months ago
lkd9125(이경도) e8d0ef3319 bas/flight 패키지 주석추가 9 months ago
lkd9125(이경도) 4a50a4506f Merge commit '4b0ddb5e2b245c8def9596da8089488575a04afd' into develop 9 months ago
lkd9125(이경도) 91e5d2a310 bas/dron 패키지 주석추가 9 months ago
지대한 4b0ddb5e2b qr rq 변경 9 months ago
lkd9125(이경도) 606dd2dad8 anls/smlt 패키지 주석추가 10 months ago
lkd9125(이경도) d66b221762 anls/hstry 패키지 주석추가 10 months ago
lkd9125(이경도) 211ce9ae82 terms패키지 주석추가 10 months ago
lkd9125(이경도) a255674a66 jwt패키지 추석 추가 10 months ago
lkd9125(이경도) e71de75916 cstmr 패키지 주석추가 10 months ago
lkd9125(이경도) e2d33ba02f Merge commit '29f63b91c25c734b0ae7a95fe09224c6bcc7c51d' into develop 10 months ago
lkd9125(이경도) 6e4fa96498 crtfyhp 패키지 주석 추가 10 months ago
지대한 29f63b91c2 TS 연동 성공시 param 전송 10 months ago
지대한 0eac2f6c40 외부 호출 security 제외 10 months ago
'kyw546' 8bdfad57bd 불법드론 연계를 위한 변경 10 months ago
지대한 a992564662 Merge remote-tracking branch 'origin/develop' into develop 10 months ago
지대한 3dd6c8d707 서버이전으로 인한 변경 10 months ago
lkd9125(이경도) 6301df3673 스웨거 어노테이션 추가 10 months ago
lkd9125(이경도) cfb21cb66a 좌표로 관할청 매핑된곳 가져오기 10 months ago
lkd9125(이경도) 302ed20574 롤백 10 months ago
lkd9125(이경도) 8e909cdb05 좌표로 관할청 매핑된곳 가져오기 10 months ago
지대한 e6acfea39c 순환참조로 인한 수정 10 months ago
지대한 f4a6203a83 TS - 드론원스탑 비행계획서 받기 10 months ago
지대한 96fde678d5 TS - 불법드론 1~2초 마다 전송 10 months ago
lkd9125(이경도) 679ca7d467 비행승인 연산 수정 10 months ago
lkd9125(이경도) b47c6b2297 Merge commit 'd17ee11825ae516073261f377d0fea31e5269029' into develop 10 months ago
lkd9125(이경도) 77f86393a0 회원가입 시 국가코드 하드코딩 처리 10 months ago
지대한 d17ee11825 QR 확인 에러 수정 10 months ago
지대한 88ef91e5c5 TS 비행계획서 1차 완료 10 months ago
lkd9125(이경도) 4524a9da29 문자 전송 시 intime 데이터추가 10 months ago
지대한 ddd03bf0c3 TS qr code 구현 10 months ago
지대한 5a0971d942 TS qr 코드 10 months ago
지대한 327e844850 드론 비행 현황시 cptAuthCode가 없을 경우 조회가 안되는 현상 임시 수정 10 months ago
lkd9125(이경도) 0a785e4e76 Merge commit '4a93fa0793c717d7bd66e86946106cd80a0038f0' into develop 10 months ago
lkd9125(이경도) cc20b63e81 Instant Convert 수정 10 months ago
지대한 4a93fa0793 통계 serviceType 수정 10 months ago
지대한 42ea6bd207 통계 serviceType 수정 10 months ago
지대한 ef7d88ec18 통계 serviceType 수정 10 months ago
지대한 4e6ae1b998 비행건수 계획서 없는데 완료 카운트 되는 현상 수정 10 months ago
지대한 1e2fe13cdc 비행건수 계획서 없는데 완료 카운트 되는 현상 수정 10 months ago
lkd9125(이경도) 80ddc8039e 비행시뮬레이션 Date오류 수정 10 months ago
lkd9125(이경도) 4a48a20807 운항스케줄 Date오류 수정 10 months ago
지대한 60349d12fd 의존성 주입 재정의 10 months ago
지대한 225dfb8120 메인 대시보드 serviceType 적용 10 months ago
지대한 8ede6560f4 Merge remote-tracking branch 'origin/develop' into develop 10 months ago
지대한 3215b07e8a laanc validate 재구성(적용x) 10 months ago
leehagjoon(이학준) 228b5d22fa Merge remote-tracking branch 'origin/develop' into develop 10 months ago
leehagjoon(이학준) becb63dff1 [일일비행횟수현황] groupby 추가 - 추후 변경 예정 10 months ago
지대한 b79e8d818f profile 조회시 cptAuthCode 항목 추가 10 months ago
지대한 139fe34db0 profile 조회시 cptAuthCode 항목 추가 10 months ago
지대한 1178bcfb37 Merge branch 'release-1.0.0' into develop 10 months ago
daeha 5cdc4f3d2d lib 10 months ago
박재우 6e57de92b9 eclipse mapstruct 설정 10 months ago
박재우 251c9f038a Merge branch 'develop' of http://gitea.palntour.com/pav/pav-be-kac.git into develop 10 months ago
박재우 6d27936d26 GpScheduler - 화면 노출시간이 1시간으로 되어있어 변경 10 months ago
lkd9125(이경도) f961187e20 비행실적 top 5 Value추가 10 months ago
lkd9125(이경도) 8223d15865 포맷팅변경 10 months ago
박재우 287a1e58fe endPoint 수정 10 months ago
박재우 565c577532 top5 지역별 통계 -> 카운팅 기준 비행 종료 시점으로 변경 10 months ago
lkd9125(이경도) e749e6a7dc Merge commit 'f5844dd36067af533e89093fa17493b083cac4bb' into develop 10 months ago
lkd9125(이경도) 258c5a4d6b 비정상상황통계 상단데이터 10 months ago
박재우 f5844dd360 . 10 months ago
박재우 dd7f4286b4 . 10 months ago
박재우 f556933189 data key 변경 10 months ago
박재우 88f15b1c56 query where절 변경 10 months ago
박재우 f8558654b6 기준 수정(오늘 날렸거나, 오늘 비행계획서 등록한 건만 표출되도록) 10 months ago
박재우 4d2cd49705 log 10 months ago
박재우 263afa106a 임시 테스트용 KAC 권한 하드코딩, 로직 변경 10 months ago
박재우 93ce5bc2ba query instant 형변환 변경 , 조건 변경 10 months ago
leehagjoon(이학준) 823909fa36 [일일 비행횟수 현황] - long -> int 타입 변경 10 months ago
박재우 19bfc06908 조건 변경 10 months ago
지대한 82b8d0c60d 드론 상세정보 데이터 누락 10 months ago
lkd9125(이경도) bcb2c9c782 관제종료시 관제건 업데이트 시간 인서트 10 months ago
박재우 0f3e6ef86c Merge branch 'develop' of http://gitea.palntour.com/pav/pav-be-kac.git into develop 10 months ago
박재우 a6eef7d349 드론 비행 더미데이터 파일 10 months ago
lkd9125(이경도) 033a500423 개발용 로그삭제 10 months ago
lkd9125(이경도) c04cbda460 Merge commit '0cd99c47816eed890d777a6773591838f573e769' into develop 10 months ago
lkd9125(이경도) 089ac26b56 비행, 실적, 비정상상황 통계 serviceType으로 조건 변경 10 months ago
leehagjoon(이학준) 0cd99c4781 [일일 비행횟수 현황] - 쿼리 수정 10 months ago
lkd9125(이경도) 5c2e35ad39 Merge commit 'ad7dde789e1e9d02178d4295c8c08b49346ca453' into develop 10 months ago
lkd9125(이경도) 2c75ced8e5 일일 비정상상황, 비행통계 RS 변경 10 months ago
지대한 ad7dde789e 모든 비행구역 나오는 현상 수정 10 months ago
지대한 3c05b88a42 모든 비행구역 나오는 현상 수정 10 months ago
지대한 2d1577f7fe 스웨거 설명 수정(비행횟수 > 비행건수) 10 months ago
지대한 29ed289ab8 자동 재시작 제거 10 months ago
lkd9125(이경도) e580006e30 Instant 타입 변경 10 months ago
lkd9125(이경도) eace93dfad 타입변경 10 months ago
박재우 2aaf61fab3 Merge branch 'develop' of http://gitea.palntour.com/pav/pav-be-kac.git into develop 10 months ago
박재우 8c663f0ec9 . 10 months ago
lkd9125(이경도) deecd68945 Merge commit '57699c83da38b382358421999ff0e5b6c73cfc66' into develop 10 months ago
lkd9125(이경도) 5c23f805ea NPE방지 코드추가 10 months ago
박재우 57699c83da Merge branch 'develop' of http://gitea.palntour.com/pav/pav-be-kac.git into develop 10 months ago
박재우 8fb8d4f430 rollback 10 months ago
지대한 82a8d1ea12 Merge pull request 'feature/main/dailyflight' (#15) from feature/main/dailyflight into develop 10 months ago
지대한 f68773d718 비행구역조회 10 months ago
lkd9125(이경도) 2bb0b2cb11 조건절 변경 10 months ago
박재우 be8c4e1634 드론관제 드론 상세정보 querydsl 오류 수정 10 months ago
박재우 206dec0183 드론현황 수정 10 months ago
박재우 eadb1bfaee 비행운항목록 조건에 맞게 수정 10 months ago
박재우 25de8eff0b webSocket 데이터 중복송신 제거 10 months ago
leehagjoon(이학준) efb8e810f3 충돌 해결 10 months ago
leehagjoon(이학준) fcf21b9510 Merge branch 'develop' into feature/main/dailyflight 10 months ago
lkd9125(이경도) 077cc56319 스웨거 어노테이션 추가 10 months ago
leehagjoon(이학준) d72ceca0d8 로그 제거 10 months ago
leehagjoon(이학준) 3d0209c0cb 충돌 해결 10 months ago
leehagjoon(이학준) b5603dc2da Merge branch 'develop' into feature/main/dailyflight 10 months ago
지대한 ab6c2442d8 Merge pull request 'feature/current/flight-plan' (#13) from feature/current/flight-plan into develop 10 months ago
leehagjoon(이학준) 2aa5f84505 [메인] 일일 비행횟수 현황 - 비행완료, 미 비행, 비고 추가 10 months ago
lkd9125(이경도) 14b2dab58a 임포트문 추가 10 months ago
lkd9125(이경도) cbc8f3f502 Merge commit '86e2daeb494da96aed6171d406b65a894fa605d5' into feature/current/flight-plan 10 months ago
지대한 86e2daeb49 Merge pull request 'feature/current/flight-warn' (#14) from feature/current/flight-warn into develop 10 months ago
lkd9125(이경도) 3414b7fc76 QueryDSL GroupBY절 추가 10 months ago
lkd9125(이경도) d3615c121a Merge commit 'ca86a2debdd264d10972bb1db00fe044b2678f54' into feature/current/flight-warn 10 months ago
lkd9125(이경도) 4c34b1e081 일일 비정상 상황 추가 10 months ago
박재우 ca86a2debd . 10 months ago
박재우 814adff88e 드론통계 rq 수정 10 months ago
lkd9125(이경도) a65fc6be8c Merge commit '254771dc4278d3145de39d1017ef1c72a892b60b' into feature/current/flight-plan 10 months ago
lkd9125(이경도) 8bd4de84b2 Merge commit 'c4a9683ee0d84b023e21722962fcdffe224fd926' into feature/current/flight-plan 10 months ago
박재우 254771dc42 드론현황 10 months ago
lkd9125(이경도) a30bd26ccd 합계 => 승인된 비행계획서 건수로 변경 10 months ago
lkd9125(이경도) c4a9683ee0 비행실적 groupby 추가 10 months ago
지대한 5a92ff7a75 기존 어드민 권한에 해당 담당관할 코드가 있을 경우 token 에 주입 10 months ago
leehagjoon(이학준) 2e6a99922f Merge branch 'develop' into feature/main/dailyflight 10 months ago
lkd9125(이경도) 1daea5d280 일일 시간데이터 포맷 변경 10 months ago
lkd9125(이경도) 29053dd347 Merge commit '076b2922faff4b572200793c54565aa3ddcb842e' into feature/current/flight-plan 10 months ago
lkd9125(이경도) a04740a7b3 일일비정상 상황 임시커밋 10 months ago
leehagjoon(이학준) c9cb343175 Merge branch 'develop' into feature/main/dailyflight 10 months ago
박재우 076b2922fa 좌표로 법정동 코드 찾는 유틸 -> 성능 향상 , 인접한 바다의 좌표도 가장 가까운 육지의 담당자 찾을 수 있는 기능 추가 10 months ago
박재우 c8f5547f52 queryDSL where절 Timezone 수정 10 months ago
lkd9125(이경도) a03ff7a516 메소드명 변경 10 months ago
lkd9125(이경도) 67c911d94c Merge commit '5d6e3ff6780c7e47b5e113b1180a899692087e12' into feature/current/flight-plan 10 months ago
hagjoon(이학준) f06c7fca31 [메인] 일일 비행횟수 현황 : 비행계획서 승인 항목 표출 완료 10 months ago
lkd9125(이경도) f709d99133 메인화면 일일비행 추가 10 months ago
hagjoon(이학준) a527959cf2 [메인] 일일 비행횟수 현황 : 비행계획서 승인 항목 작업중 10 months ago
박재우 5d6e3ff678 . 10 months ago
박재우 61e5381ba0 Merge pull request 'feature/jaewoo' (#12) from feature/jaewoo into develop 10 months ago
박재우 7623b90d47 Merge pull request '드론운항 통계' (#11) from develop into feature/jaewoo 10 months ago
박재우 a1083804be 드론운항목록 10 months ago
지대한 65ac7f880b propeties 수정 ip 변경 10 months ago
지대한 f6f1a23536 좌표에 따른 지표면 고도 조회 기능 10 months ago
lkd9125(이경도) 3d2931484f 권한 확인 Exception추가 10 months ago
lkd9125(이경도) 25b59937bd 비정상상황 권한개입추가 10 months ago
lkd9125(이경도) 53452ebcce 비행실적 권한 개입 추가 10 months ago
lkd9125(이경도) 820a3998f9 비행통계 권한개입 추가 10 months ago
lkd9125(이경도) 71c4e13170 비행통계 상단데이터 권한개입 추가 10 months ago
lkd9125(이경도) 5b7daabf68 비행실적 통계 - 비행계획 groupBy추가 10 months ago
lkd9125(이경도) 5ced3a65dd 통계 NPE 방지 코드 추가 10 months ago
lkd9125(이경도) a85492032b 비행실적통계 API 추가 10 months ago
lkd9125(이경도) 817a00fd04 비행실적 상단 고정데이터 AP추가 10 months ago
lkd9125(이경도) a415ca94fe 비정상상황 로그 queryRepository 추가 10 months ago
lkd9125(이경도) e1b3255819 비정상상황 상단 고정데이터 년,월,일 추가 10 months ago
lkd9125(이경도) 9ad0763121 비행통계 상단 년월일 추가 10 months ago
lkd9125(이경도) 669ed742f0 통계패키지 모델 이동 11 months ago
lkd9125(이경도) 60a6e25bce 통계 패키지 분리 11 months ago
lkd9125(이경도) 4d857ba9a4 비정상 상황 통계 API 추가 11 months ago
lkd9125(이경도) 7006e88ade 비정상 상황 상단 고정데이터 API 추가 11 months ago
지대한 1dd7fe3e31 Merge remote-tracking branch 'origin/develop' into develop 11 months ago
지대한 63d17ff450 수치표고모델 해상도(/4) 및 크기(한반도 -> 남한) 수정 11 months ago
lkd9125(이경도) db8017f560 Merge commit '99d49ca2d6098846649b63f47693fea415347073' into develop 11 months ago
lkd9125(이경도) 9348e201ad 비행통계 API 추가 11 months ago
지대한 99d49ca2d6 . 11 months ago
지대한 05e984d91d 고도 변환 11 months ago
지대한 d4f05efbab docker local 테스트 환경 11 months ago
lkd9125(이경도) 1a81341c7f 통계 API, 비행상단 고정 데이터 API추가 11 months ago
지대한 86994aaa1e dem(tiff) - 지형고도 11 months ago
지대한 2ad49b5e44 Merge remote-tracking branch 'origin/develop' into develop 11 months ago
지대한 da1689437e dem(tiff) - 지형고도 11 months ago
lkd9125(이경도) c28bd422ef 비행 종료시 컨트롤아이디에 해당하는 건의 총 비행거리 값 추가 11 months ago
박재우 bc6e536d52 Merge branch 'develop' of http://gitea.palntour.com/pav/pav-be-kac.git into develop 11 months ago
박재우 efdf974e24 법정동 코드 리턴 유틸 - 특정 depth까지만 추출하는 기능 추가 ( 광역시 / 시군구 / 읍면동 / 리 ) 11 months ago
lkd9125(이경도) 5c57c80352 GeoJson프로퍼티 수정 11 months ago
박재우 1ac6d5a470 . 11 months ago
박재우 22a86d2efb . 11 months ago
박재우 d325a1eeab linux 환경에 맞게 경로 구분자 수정 11 months ago
박재우 c15853e6a1 test controller(임시) 11 months ago
lkd9125(이경도) 9868daaf1b 전국 GeoJson 분할 프로그램 추가 11 months ago
박재우 e0b83bd98d Merge branch 'develop' of http://gitea.palntour.com/pav/pav-be-kac.git into develop 11 months ago
박재우 0cb72deaa9 path properties yml에서 관리하게 변경 , util @value 추가하기 위해 컴포넌트 어노테이션 사용 11 months ago
지대한 38d210acd3 refresh token 요청시 token 자체 검증만 진행 11 months ago
지대한 34a214fadb refresh token 요청시 새로운 refresh 토큰 저장 11 months ago
지대한 6d9ed107b5 법정동 글자 깨짐 수정 11 months ago
박재우 ffeeb96663 좌표로 법정동코드 찾기(beta) 11 months ago
박재우 0fefce3cb4 Merge branch 'develop' of http://gitea.palntour.com/pav/pav-be-kac.git into develop 11 months ago
박재우 3d9aff1a26 좌표로 법정동코드 찾기(beta) 11 months ago
지대한 a82e6e8ab2 Ts 에러시 서버 에러가 아닌 false로 떨궈줌 11 months ago
지대한 95c163888b TS - 조종사 자격 증명 여부 및 기체 보혐 여부 확인 api 11 months ago
지대한 ca6cea96b1 허용고도 조회시 값이 안맞는 현상 11 months ago
지대한 e683b01621 파일 수정 및 상세 수정 11 months ago
지대한 05e0043f4f 법정동 저장(로컬용) 11 months ago
지대한 5eea14db01 법정동 파일 및 지역 매핑 entity 11 months ago
지대한 207dd6aec0 파일이 없을 경우 에러 수정 11 months ago
지대한 3a4ef8d16e 특수비행-야간 제외 11 months ago
지대한 7f51aeac43 공역(금지구역) 포함여부 api 11 months ago
지대한 1fb70081dd 허용고도 api, ts연동 api 11 months ago
지대한 f388ea2b97 qna 답변시 사용자 조회가 안되는 현상 수정 11 months ago
박재우 623b1f4544 coordinate convert util 추가 11 months ago
지대한 39b5a0694d 빈값일 경우 where조건 제외 11 months ago
지대한 f49d34627c merge 11 months ago
지대한 f094d97648 Merge pull request 'feature/laanc/sun-vaildation' (#10) from feature/laanc/sun-vaildation into develop 11 months ago
지대한 e5e0cd4833 - 승인목록 pdf download url(pdfUrl) 추가 11 months ago
지대한 ddb7c79267 pdf path nullod -> od 11 months ago
지대한 b26db5c7e4 qna add contract field 11 months ago
지대한 62b5a204ac qna field add answer information. 11 months ago
지대한 1ab250463b cstmr bas return type error 11 months ago
지대한 650256d8b6 qna admin 검색조건 수정 및 작성자명 추가 11 months ago
lkd9125(이경도) a65588baff Merge commit '665ffc5989b582b8977fb32500df0daaebfee834' into feature/laanc/sun-vaildation 11 months ago
지대한 665ffc5989 승인 목록 신청일 기준 최신순으로 정렬 11 months ago
지대한 d5ce02101a 승인목록 페이징 없는 api 생성 11 months ago
지대한 c978a9171a FAQ, QnA 생성일시 최근일 순으로 정렬 11 months ago
지대한 56ffa8fcc7 신청 목록 신청일자 기준 검색 11 months ago
지대한 b567f3941f qna 설계 변경으로 인한 수정 11 months ago
지대한 2ee86cadcd qna 설계 변경으로 인한 수정 11 months ago
lkd9125(이경도) 42f6538ae3 체크용 로그 삭제 11 months ago
lkd9125(이경도) 06e097f881 주석추가 11 months ago
lkd9125(이경도) d4760093ab Laanc 검증 RS파라미터 적용 11 months ago
lkd9125(이경도) d1df3b400d 테스트 변경 11 months ago
lkd9125(이경도) 76a4aa0e63 Merge commit '49c2798356cf0525e6a6972e4252ed93510df6f5' into feature/laanc/sun-vaildation 11 months ago
lkd9125(이경도) b21670ed3f Laanc 검증 추가 11 months ago
지대한 49c2798356 qna url 수정 11 months ago
지대한 694be4caf1 faq 수정 11 months ago
지대한 7dabd67695 일몰 일출 api 추가 - 해당 좌표에 근접한 지역의 6개월치 데이터 11 months ago
지대한 d98025b99f 일몰 일출 api 추가 - 해당 좌표에 근접한 지역의 6개월치 데이터 11 months ago
지대한 82d60d62dd 승인목록 rq 변경 11 months ago
지대한 29e578c6cb LAANC 검증시 기체 중복 및 비행 구역 중복 제외 11 months ago
지대한 4b5e79f2ce 좌표로 가장 근접한 지역의 일몰/일출 정보 조회 11 months ago
지대한 493f5db580 일출/일몰 지역별 조회 11 months ago
lkd9125(이경도) f20ada92ab QnA업데이트 시간 추가 11 months ago
lkd9125 6229cb4af9 Merge pull request 'feature/cns/faq-qna' (#9) from feature/cns/faq-qna into develop 11 months ago
lkd9125(이경도) 2b76d6488c files 저장 경로 변경 11 months ago
lkd9125(이경도) 58709feba3 Qna File 개별삭제 [파일 업데이트 기획이 없어 만듬] 11 months ago
lkd9125(이경도) fb214e0323 File update추가 11 months ago
qkr7828(박재우) 82d69eb940 faq crud 11 months ago
lkd9125 6e3e83d04e Qna 삭제 추가 11 months ago
lkd9125 9736eab347 Qna 업데이트 기능 추가 / 파일 업데이트 제외 11 months ago
lkd9125 f43e284a1f Merge commit 'edc3503cc7dc9f407b29fcd0c1bb8f35ba3320d5' into feature/cns/faq-qna 11 months ago
lkd9125 227302dc70 Qna 상세 불러오기 추가 11 months ago
qkr7828(박재우) edc3503cc7 . 11 months ago
lkd9125 5c282da7d8 QnaList 조회 추가 11 months ago
lkd9125 69e44f00d8 Qna 추가 기능 11 months ago
lkd9125 3d029ec84e DB Insert추가 11 months ago
lkd9125 fceb5159cf file업로드 추가 11 months ago
qkr7828(박재우) d7037f9f90 list , detail 완료 11 months ago
lkd9125 80057475e5 롤백 11 months ago
lkd9125 73c1ed6f73 . 11 months ago
lkd9125 8443dbc260 Class 정리 11 months ago
lkd9125 3b414f174e Merge commit '0dd9e2267891467c1ad70462c183feb4aface963' into feature/cns/faq-qna 11 months ago
lkd9125 c3b141bd85 QNA 기본작업 커밋 11 months ago
qkr7828(박재우) 0dd9e22678 . 11 months ago
qkr7828(박재우) 33d751629c repo 11 months ago
lkd9125 9fe2faf362 Merge commit '08c7c58d0ead94ff7ac68169acffb3f20a94ebf2' into feature/cns/faq-qna 11 months ago
lkd9125 b55bfc8c35 Entity 및 기본 클래스 생성 11 months ago
qkr7828(박재우) 08c7c58d0e detail merge 11 months ago
leehagjoon(이학준) f94caa0885 날씨 API url 및 servicekey -> properties 관리 11 months ago
지대한 076be728b7 . 11 months ago
지대한 7ef7106a82 . 11 months ago
지대한 797432b1d4 . 11 months ago
지대한 667a2f3a50 laanc 승인 목록 검색조건 추가 11 months ago
지대한 941de40021 승인 목록 및 상세 기본올림 12 months ago
지대한 4598e0624e 승인시 문자전송 12 months ago
지대한 f05de5e47e 승인시 문자전송 12 months ago
지대한 57f0eb7e05 승인시 문자전송 12 months ago
지대한 78770e79e7 식별번호 및 항공기기체 생략 가능 12 months ago
지대한 3e1521db05 pdf template 수정 12 months ago
지대한 27c21e388e code "-" front에서 불가 12 months ago
지대한 6a7f345c75 다운로드 url public 으로 변경 12 months ago
지대한 182e19491e 파일 경로 12 months ago
지대한 d5265b8fa1 주소 잘못 입력함 12 months ago
지대한 d6c8fa19ca image 못읽음 12 months ago
지대한 f00388da34 valid 수정 12 months ago
지대한 329ead43b8 resource 파일 못읽음 12 months ago
지대한 b4f447d641 resource 파일 못읽음 12 months ago
지대한 164a393ca8 resource 파일 못읽음 12 months ago
지대한 bddcdc5ca6 resource 파일 못읽음 12 months ago
지대한 b70de5b021 resource 파일 못읽음 12 months ago
지대한 505a8f6ca5 laanc 승인시 첫좌표로 주소 받아오기 12 months ago
지대한 43a632aaa3 laanc 날 수 있는 boolean 추가 12 months ago
지대한 b98f5fe915 비행가능여부 추가 12 months ago
지대한 583e77a9db laanc 검증 1차안 12 months ago
지대한 7aba2ee31d code enum 처리 12 months ago
지대한 98ab8d343d . 12 months ago
지대한 bc3888ec94 laanc 새로운 페이지에 따른 api 생성 12 months ago
lkd9125 5ba0ee1810 import 정리 1 year ago
지대한 d578d5d297 laanc 새로운 페이지에 따른 api 생성 1 year ago
지대한 7c8f1ce6e2 Merge remote-tracking branch 'origin/develop' into develop 1 year ago
lkd9125 e62562e0f1 PDF 다운로드 주석추가 1 year ago
lkd9125 22059b0427 Swagger 어노테이션 추가 1 year ago
lkd9125 fa5499fe00 Merge pull request '비정상상황 통계 추가' (#7) from feature/main/warning-flight-statistics into develop 1 year ago
lkd9125 87377baa1c 비정상상황 통계 추가 1 year ago
lkd9125 728095f32e Merge pull request 'feature/main/drone-flight-statistics' (#6) from feature/main/drone-flight-statistics into develop 1 year ago
lkd9125 0532e5740c 필수 파라미터 지정 idntfNum 1 year ago
lkd9125 5b75e00e57 Merge commit 'c42d2b5e7585465dbe97a31bee97a390a1ab0c88' into feature/main/drone-flight-statistics 1 year ago
지대한 49db329500 기존 flight 롤백 1 year ago
lkd9125 c42d2b5e75 Instant Convert Log제거 1 year ago
lkd9125 43a78e7a63 드론별 비행이력 통계 추가 1 year ago
lkd9125 83512429cd Merge pull request 'feature/lannc/pdf-download' (#4) from feature/lannc/pdf-download into develop 1 year ago
lkd9125 d3f2a2fcaa Merge commit '92be3047ce0305adc9dc861570276c845dd08995' into feature/lannc/pdf-download 1 year ago
lkd9125 bfb27e137b Merge commit '92be3047ce0305adc9dc861570276c845dd08995' into feature/main/drone-flight-statistics 1 year ago
지대한 92be3047ce airgeo 롤백 1 year ago
지대한 f2bd8ac39d epsg 추가 1 year ago
lkd9125 91caa4aa3f 메소드 명 변경 1 year ago
lkd9125 9addd8e841 Merge commit 'dbb8cfa222707f826a4d3bdeec0341fafd3a22bf' into feature/lannc/pdf-download 1 year ago
지대한 dbb8cfa222 LAANC 프로세스 변경에 따른 수정 1 year ago
지대한 903af28cf5 Merge pull request 'feature/lannc/pdf-create' (#3) from feature/lannc/pdf-create into develop 1 year ago
lkd9125 273f2a2039 Exception추가 1 year ago
lkd9125 b0b633e8a1 코드정리 1 year ago
lkd9125 05c5aff86c 스웨거 추가, 클래스 분리 1 year ago
lkd9125 3e03e57101 파일 다운로드 추가 1 year ago
지대한 a333551eff LAANC 기준 바뀜에 따른 처리 1 year ago
lkd9125 a2601eed60 Merge commit '3f9d486c588f239bb513de4bd338b93c7ebe386b' into feature/lannc/pdf-download 1 year ago
lkd9125 3f9d486c58 파일경로 추가 1 year ago
lkd9125 412720800b 패키지 변경 1 year ago
lkd9125 4207cc4071 Merge commit '946945e86ba7ef82edaade24dc518b47c6a74531' into feature/lannc/pdf-download 1 year ago
lkd9125 946945e86b Merge commit 'd060491c6156927fe8018de0950251800bc3b3a4' into feature/lannc/pdf-create 1 year ago
lkd9125 8f3055561a 서비스 분리 1 year ago
qkr7828(박재우) d060491c61 컬럼 형식 수정 1 year ago
lkd9125 0adb107151 Merge commit '0c1111c6575d0291b7d0e43e49255a4b6866afeb' into feature/lannc/pdf-create 1 year ago
lkd9125 ed383f6098 주석 해제 1 year ago
lkd9125 92be0cbafa 패키지 편경 1 year ago
lkd9125 9a00161ce6 다운로드 틀 추가 1 year ago
지대한 0c1111c657 LAANC 임시 코드 및 비행계획서 등록/수정 1 year ago
lkd9125 52857d45a3 URL 오타 수정 1 year ago
lkd9125 bcd3de7cf9 Merge commit 'f298886491cc56a93da8678a73d0f3ec9795a547' into feature/lannc/pdf-download 1 year ago
lkd9125 f298886491 코드 정리 1 year ago
lkd9125 651da27170 Merge commit 'c358419a2922a26d10a16daf8b129c170323790d' into feature/lannc/pdf-create 1 year ago
lkd9125 442319035e 오류수정 1 year ago
lkd9125 1832faf12e VO추가 , 폴더경로추가 1 year ago
지대한 6724b4f49a 공역 유틸 생성 - singleton pattern 1 year ago
lkd9125 30a9f2dd2f DB Table Insert추가 1 year ago
qkr7828(박재우) c358419a29 드론관제 - 비행 종료된 드론에 대한 정보 제공 기능 추가 1 year ago
lkd9125 57aac511d8 PDF CSS 적용 1 year ago
lkd9125 55a84cb7b9 Template HTML -> Pdf변환 1 year ago
지대한 fcced5261c . 1 year ago
지대한 c88b96faf5 Merge remote-tracking branch 'origin/develop' into develop 1 year ago
지대한 339cadfe65 비행계획서 등록 반환 객체 변경 1 year ago
lkd9125 23b43acc60 Merge commit '1bbb9d4b0d73686083b2e76f3cd432aa185012c7' into feature/lannc/pdf-create 1 year ago
지대한 1bbb9d4b0d Merge pull request 'feature/main/plan-allow-statistics' (#2) from feature/main/plan-allow-statistics into develop 1 year ago
lkd9125 c129b50416 ComFileBas Entity 추가, Repository추가 1 year ago
lkd9125 efc3052646 Merge commit '4f9de497e6bd1f4c06fd75a4d9d8d0f53f230443' into feature/main/plan-allow-statistics 1 year ago
lkd9125 56b38cef4e 로그파일 삭제 1 year ago
lkd9125 01280c335e 승인일시 쿼리 추가, 파라미터명 및 URL 변경 1 year ago
lkd9125 4462ee2470 비행계획서 Entity 승인일시 컬럼추가 1 year ago
lkd9125 4f9de497e6 로그 삭제 1 year ago
lkd9125 07016b5591 Merge commit '03c6c9071504e89244d71207dcdb96f7ef710ee6' into feature/main/plan-allow-statistics 1 year ago
지대한 03c6c90715 Merge pull request 'feature/main/date-statistics' (#1) from feature/main/date-statistics into develop 1 year ago
lkd9125 cc5d154928 롤백 1 year ago
lkd9125 902d39df2b URL 변경 /stcs/flight/date/{type} 로 변경 1 year ago
lkd9125 8d2d097438 URL /kac 제거 1 year ago
lkd9125 ce24478c6a 파라미터명 변경 1 year ago
lkd9125 37d996b3cf URL 변경 1 year ago
lkd9125 631755b5ef Merge commit '4a3756fc6cd2d768545453359dee7c1768d2fa8c' into feature/main/date-statistics 1 year ago
lkd9125 b5198c37fa Merge commit '3ae1f4e7c60047303bf013108138b866559c9dbf' into feature/main/date-statistics 1 year ago
lkd9125 3ae1f4e7c6 연,월,일 별 통계조회을 위한 URL추가 1 year ago
지대한 4a3756fc6c 전화번호, 이메일 복호화 1 year ago
지대한 9426e71fe4 jackson 라이브러리 충돌 1 year ago
지대한 f559a34b45 로그인시 기본정보 추가 1 year ago
지대한 269d056441 kac 전용 패키지 삭제 - 기존 프로세스 사용 1 year ago
지대한 1e4baae8f8 common 라이브러리 추가 1 year ago
lkd9125 76af7ac8af Merge commit '0ae4b21f91cfeb6786416efbc07c6907acfe5059' into feature/main/date-statistics 1 year ago
lkd9125 0ae4b21f91 연단위 조건 수정 1 year ago
lkd9125 318e03121f 비행실적 통계 API 추가 1 year ago
lkd9125 468a00aff3 Merge commit 'e6d85130db9ad5b4c50209d8cd60314b7b47fd47' into feature/main/plan-allow-statistics 1 year ago
lkd9125 e6d85130db 주석 및 코드정리 1 year ago
lkd9125 4323f77762 연,월,일 통계 API 추가 1 year ago
lkd9125 60e2d42eaf Get요청 시 Instant 파라미터 변환코드 주석 해제 1 year ago
지대한 d8673a2d3d DB 추가 필드에 대한 비행계획서 등록/수정/조회/상세조회 모델 변경 1 year ago
지대한 24fa9841e2 DB 추가 필드에 대한 비행계획서 등록/수정/조회/상세조회 모델 변경 1 year ago
지대한 82c7f168fd entity 수정 및 controller 직렬화/역직렬화 1 year ago
lkd9125 843b29613a Merge commit '067cacdc3edfd01e05b8d52108d55b41902600ee' into develop 1 year ago
lkd9125 067cacdc3e Merge commit '3a2a2f5d7cbe8eca946a16fd22a00936e232d632' into feature/repactoring/date_to_instant 1 year ago
lkd9125 4af4af42f7 Socket, WebSocket Instant 변경추가 1 year ago
lkd9125 b032fdefdd PavServer instant객체 추가 변경 1 year ago
지대한 3a2a2f5d7c 추가 필드 및 date to instant 변경 1 year ago
지대한 c1b51eb8f7 Merge remote-tracking branch 'origin/feature/repactoring/date_to_instant' into develop 1 year ago
lkd9125 aadf2b9f4d Merge commit '5e3474cc305e7f3e796f1f01648bd788e7d08265' into feature/repactoring/date_to_instant 1 year ago
lkd9125 743e233488 QueryDSL-SQL라이브러리 추가 1 year ago
lkd9125 d0af58023c 비행계획서 관련 부분 Instnat 오류 수정 1 year ago
lkd9125 29bf17be1d Instant 타입 파라미터 컨버터 추가, 로그인 정보 조회 시 회원이름 암호화 해제 1 year ago
lkd9125 e9b968d8ba Instant Converting 추가 1 year ago
lkd9125 32234211ad JPA 관련 Instant타입 어노테이션 변경, 컨버터 작업 준비 1 year ago
lkd9125 6d850d3fdf PavServer -> Date 객체 Instant로 1차 변경 1 year ago
  1. 13
      document/dron_test/pav-utils.js
  2. 12
      document/dron_test/pav-warning.js
  3. 8
      pav-server/build.gradle
  4. 224
      pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/controller/AcntCrtfyhpController.java
  5. 113
      pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/service/AcntCrtfyhpService.java
  6. 179
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/controller/AcntCstmrController.java
  7. 10
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrEmModel.java
  8. 11
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrPswdCheckRQ.java
  9. 9
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrPwModel.java
  10. 30
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrRqModel.java
  11. 2
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmerRlModel.java
  12. 9
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrPswdModel.java
  13. 3
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrTermsModel.java
  14. 162
      pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/service/AcntCstmrService.java
  15. 136
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java
  16. 4
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtProfileRsModel.java
  17. 5
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRqModel.java
  18. 33
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java
  19. 8
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java
  20. 13
      pav-server/src/main/java/com/palnet/biz/api/acnt/terms/controller/AcntTermsController.java
  21. 7
      pav-server/src/main/java/com/palnet/biz/api/acnt/terms/model/AcntTermsRqModel.java
  22. 5
      pav-server/src/main/java/com/palnet/biz/api/acnt/terms/service/AcntTermsService.java
  23. 83
      pav-server/src/main/java/com/palnet/biz/api/anls/hstry/controller/AnlsHstryController.java
  24. 7
      pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryGroupModel.java
  25. 5
      pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryRqModel.java
  26. 92
      pav-server/src/main/java/com/palnet/biz/api/anls/hstry/service/AnlsHstryService.java
  27. 111
      pav-server/src/main/java/com/palnet/biz/api/anls/smlt/controller/AnlsSmltController.java
  28. 22
      pav-server/src/main/java/com/palnet/biz/api/anls/smlt/service/AnlsSmltService.java
  29. 249
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/controller/BasDronController.java
  30. 46
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronInsertModel.java
  31. 5
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronModel.java
  32. 11
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronRqModel.java
  33. 45
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronUpdateModel.java
  34. 21
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfModel.java
  35. 4
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfRqModel.java
  36. 17
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfUpdateModel.java
  37. 87
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/service/BasDronService.java
  38. 398
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java
  39. 15
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightCoordModel.java
  40. 20
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java
  41. 103
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java
  42. 53
      pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupAprvController.java
  43. 233
      pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupController.java
  44. 68
      pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupJoinController.java
  45. 67
      pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupUserController.java
  46. 6
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupAprvRqModel.java
  47. 24
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupAprvlUpdateRQ.java
  48. 21
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupInsertRQ.java
  49. 17
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinInsertRQ.java
  50. 4
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinRqModel.java
  51. 14
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinUpdateRQ.java
  52. 3
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupRqModel.java
  53. 19
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUpdateRQ.java
  54. 8
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserListModel.java
  55. 17
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserUpdateRQ.java
  56. 31
      pav-server/src/main/java/com/palnet/biz/api/bas/group/service/BasGroupService.java
  57. 45
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancAprvController.java
  58. 142
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java
  59. 16
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvListRq.java
  60. 64
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvRs.java
  61. 62
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancArcrftModel.java
  62. 22
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaByAirspaceModel.java
  63. 20
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaByElevModel.java
  64. 16
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordByAirspaceModel.java
  65. 16
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordByElevModel.java
  66. 14
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordModel.java
  67. 32
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaModel.java
  68. 2
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancDuplicatedAirspaceRs.java
  69. 24
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancPlanRq.java
  70. 16
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancQrcodeRq.java
  71. 15
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancQrcodeRs.java
  72. 4
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancTsRq.java
  73. 81
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java
  74. 28
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancAprvService.java
  75. 523
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java
  76. 203
      pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java
  77. 16
      pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListModel.java
  78. 3
      pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java
  79. 32
      pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java
  80. 46
      pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqUpdateModel.java
  81. 40
      pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java
  82. 268
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java
  83. 4
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertAnserRQModel.java
  84. 4
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaListAdminRQ.java
  85. 10
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java
  86. 35
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java
  87. 61
      pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/controller/ComnCoordinateController.java
  88. 12
      pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/model/CompotentAuthorityRQ.java
  89. 14
      pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/model/CompotentAuthorityRS.java
  90. 105
      pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/service/ComnCoordinateService.java
  91. 78
      pav-server/src/main/java/com/palnet/biz/api/comn/elev/controller/ComnElevController.java
  92. 7
      pav-server/src/main/java/com/palnet/biz/api/comn/elev/model/ComnElevRq.java
  93. 5
      pav-server/src/main/java/com/palnet/biz/api/comn/elev/model/ComnGroundElevRq.java
  94. 20
      pav-server/src/main/java/com/palnet/biz/api/comn/elev/service/ComnElevService.java
  95. 39
      pav-server/src/main/java/com/palnet/biz/api/comn/file/controller/ComnFileController.java
  96. 25
      pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java
  97. 8
      pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnPagingModel.java
  98. 6
      pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnRqModel.java
  99. 11
      pav-server/src/main/java/com/palnet/biz/api/comn/response/SuccessResponse.java
  100. 14
      pav-server/src/main/java/com/palnet/biz/api/comn/sms/service/ComnSmsService.java
  101. Some files were not shown because too many files have changed in this diff Show More

13
document/dron_test/pav-utils.js

@ -74,9 +74,10 @@ function calculateHeading(x1, y1, x2, y2) {
var dx = x2 - x1;
var dy = y2 - y1;
var heading = (Math.atan2(dy, dx) * 180) / Math.PI;
if (heading < 0) {
heading += 360;
}
// Ensure heading is within the range [0, 360)
heading = (heading + 360) % 360;
return heading;
}
@ -91,9 +92,9 @@ const dumyData = {
lon: 126.6146,
elevType: 'M',
elev: 125.4,
speedType: 'KM',
speed: 145.8,
heading: 227.94,
speedType: 'm/s',
speed: 40.5,
heading: 0,
terminalRcvDt: '20210629173145',
betteryLevel: 91,
betteryVoltage: 50,

12
document/dron_test/pav-warning.js

@ -10,11 +10,11 @@ const port = 8082;
const prefix = 'PALUTM-';
const pathSampleCoord = [
[37.523771, 126.720982],
[37.524841, 126.723106],
[37.524337, 126.72333],
[37.524841, 126.723106],
[37.523771, 126.720982]
[37.571954, 126.775258],
[37.566375, 126.781266],
[37.562361, 126.783584],
[37.558143, 126.785987],
[37.553039, 126.788819]
];
// const pathSampleCoord = [
// [42.5515, 126.655],
@ -48,7 +48,7 @@ const getCoords = coords => {
};
const getClient = () => {
const dronName = prefix + '010';
const dronName = prefix + '095';
const client = {};
client.dronName = dronName;

8
pav-server/build.gradle

@ -46,6 +46,9 @@ dependencies {
developmentOnly 'org.springframework.boot:spring-boot-devtools'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
// implementation 'io.springfox:springfox-boot-starter:3.0.0'
implementation 'org.springdoc:springdoc-openapi-ui:1.6.15'
// thymeleaf
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
@ -86,7 +89,6 @@ dependencies {
implementation 'org.apache.commons:commons-io:1.3.2'
implementation 'commons-httpclient:commons-httpclient:3.1'
implementation 'com.googlecode.json-simple:json-simple:1.1.1'
implementation 'io.springfox:springfox-boot-starter:3.0.0'
implementation 'org.json:json:20220320'
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr353:2.15.2'
@ -101,7 +103,9 @@ dependencies {
implementation 'org.geotools:gt-geotiff:29.2'
implementation 'org.geotools:gt-epsg-hsql:29.2'
// QR Code
implementation 'com.google.zxing:core:3.5.2'
implementation 'com.google.zxing:javase:3.5.2'
testCompileOnly 'org.projectlombok:lombok:1.18.28'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.28'

224
pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/controller/AcntCrtfyhpController.java

@ -3,22 +3,13 @@ package com.palnet.biz.api.acnt.crtfyhp.controller;
import java.util.HashMap;
import java.util.Map;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.acnt.crtfyhp.model.AcntCrtfyhpRsModel;
import com.palnet.biz.api.acnt.crtfyhp.service.AcntCrtfyhpService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
@ -27,88 +18,106 @@ import com.palnet.biz.jpa.repository.pty.PtyCstmrQueryRepository;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.utils.EncryptUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
@Log4j2
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/acnt/crtfyhp", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
public class AcntCrtfyhpController {
@Autowired
private final AcntCrtfyhpService service;
private final PtyCstmrQueryRepository ptyCstmrQueryRepository;
@Autowired
private PtyCstmrQueryRepository ptyCstmrQueryRepository;
/**
* 인증번호를 발송하는 기능,
* hpno 값은 휴대폰번호입니다. 번호에 인증번호를 발송합니다.
* @param hpno
* @return
*/
@GetMapping(value = "/register/send")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ApiImplicitParam(name = "hnpo",value = "휴대폰번호", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> send(String hpno) {
@Operation(summary = "휴대폰 인증번호 전송", description = "입력한 휴대폰번호로 회원정보에 동일한 휴대폰 번호가 있는지 확인하고, 없다면 인증번호를 전송하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> send(@Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno) {
Map<String , Object> resultMap = new HashMap<String,Object>();
Map<String , Object> resultMap = new HashMap<String,Object>(); // 결과 반환을 위한 객체선언
try {
if(hpno == null) {
return ResponseEntity.status(HttpStatus.OK)
if(hpno == null) { // hpno[휴대폰번호] 가 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
//회원정보에 동일한 휴대폰 번호가 있는지 확인 , 암호화 해서 검색
String encHpno = EncryptUtils.encrypt(hpno);
// 휴대폰 번호가 종복이면 isHpno가 True
boolean isHpno = ptyCstmrQueryRepository.findCstmrByHpno(encHpno);
if(isHpno) {
resultMap.put("result" , false);
if(isHpno) { // 휴대폰 번호 중복인 경우
resultMap.put("result" , false); // 성공하지 못함을 의미
resultMap.put("code" , -1); // 동일한 휴대폰 번호 존재
}else {
boolean result = service.registerSend(hpno);
resultMap.put("result" , result);
}else { // 휴대폰 번호 중복이 아닌경우
boolean result = service.registerSend(hpno); // 해당 휴대폰번호로 문자 메세지 발송
resultMap.put("result" , result); // 메세지 발송이 성공일 경우 true
}
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
// 문제없을 시 결과값을 최종적으로 리턴해줌
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
/**
* 인증메세지를 받은 사용자가 인증번호를 입력하여 인증처리하는 기능입니다.
* @param hpno
* @param crtfyNo
* @return
*/
@GetMapping(value = "/register/confirm")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ApiImplicitParams({
@ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class),
@ApiImplicitParam(name = "crtfyNo",value = "인증일련번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> confirm(String hpno , String crtfyNo) {
@Operation(summary = "휴대폰 인증번호 검증", description = "입력한 핸드폰번호로 받은 인증번호를 입력해 검증하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> confirm(@Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno ,
@Parameter(name="crtfyNo", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "123456") String crtfyNo) {
Map<String , Boolean> resultMap = new HashMap<String,Boolean>();
Map<String , Boolean> resultMap = new HashMap<String,Boolean>(); // 결과 반환을 위한 객체선언
if(hpno == null || crtfyNo == null) {
return ResponseEntity.status(HttpStatus.OK)
if(hpno == null || crtfyNo == null) { // hpno[휴대폰번호], crtfyNo[인증번호] 값이 없을 시 서버에서 파라미터가 없다는 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK)// "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
boolean result = service.registerConfirm(hpno, crtfyNo);
resultMap.put("result" , result);
try {
boolean result = service.registerConfirm(hpno, crtfyNo); // 휴대폰번호로 전송된 인증번호가 맞는지 확인하는 코드
resultMap.put("result" , result); // 인증성공하면 true
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -118,24 +127,25 @@ public class AcntCrtfyhpController {
}
//아이디 찾기 시 인증번호 발송 로직
/**
* 아이디 찾기 인증번호 발송 로직
* @param memberName
* @param hpno
* @return
*/
@GetMapping(value = "/find/sendForId")
@ApiOperation(value = "아이디 찾기 시 인증번호 발송")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ApiImplicitParams({
@ApiImplicitParam(name = "memberName", value = "회원 이름", dataTypeClass = String.class),
@ApiImplicitParam(name = "hpno", value = "휴대폰 번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> sendForId(String memberName, String hpno) {
Map<String, Object> resultMap = new HashMap<String, Object>();
@Operation(summary = "ID 찾기 시 사용되는 인증번호 발송 로직", description = "ID찾기 시 입력한 핸드폰번호로 인증번호를 발송하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> sendForId(@Parameter(name="memberName", description = "회원 이름", in = ParameterIn.QUERY, example = "팔네트웍스") String memberName,
@Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno) {
Map<String, Object> resultMap = new HashMap<String, Object>(); // 결과 반환을 위한 객체선언
if(memberName == null || hpno == null) {
return ResponseEntity.status(HttpStatus.OK)
if(memberName == null || hpno == null) { // hpno[휴대폰번호]와 memberName[회원이름]이 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
boolean result = service.certifNum(memberName, hpno);
boolean result = service.certifNum(memberName, hpno); //
resultMap.put("result" , result);
if(!result) {
resultMap.put("code", -1); //일치하는 회원 없음
@ -143,6 +153,13 @@ public class AcntCrtfyhpController {
resultMap.put("code", 0); //일치하는 회원 존재
}
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -150,19 +167,20 @@ public class AcntCrtfyhpController {
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
//아이디 찾기
/**
* 아이디 찾기
* @param memberName
* @param hpno
* @return
*/
@GetMapping(value = "/find/findUserId")
@ApiOperation(value = "회원 아이디 찾기")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ApiImplicitParams({
@ApiImplicitParam(name = "memberName",value = "회원이름", dataTypeClass = String.class),
@ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> findUserId(String memberName, String hpno) {
Map<String, Object> resultMap = new HashMap<String, Object>();
@Operation(summary = "ID 찾기", description = "멤버의 이름과 핸드폰번호를 입력받아 회원가입 당시에 입력한 ID를 찾아주는 API 입니다.")
public ResponseEntity<? extends BasicResponse> findUserId(@Parameter(name="memberName", description = "회원 이름", in = ParameterIn.QUERY, example = "팔네트웍스") String memberName,
@Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno) {
Map<String, Object> resultMap = new HashMap<String, Object>(); // 결과 반환을 위한 객체선언
if(memberName == null || hpno == null) {
return ResponseEntity.status(HttpStatus.OK)
if(memberName == null || hpno == null) { // hpno[휴대폰번호]와 memberName[회원이름]이 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
@ -184,24 +202,25 @@ public class AcntCrtfyhpController {
return ResponseEntity.ok().body( new SuccessResponse<Map>(resultMap));
}
//비밀번호 찾기 시 인증번호 발송 로직
/**
* 비밀번호 찾기 인증번호 발송 로직
* @param userId
* @param hpno
* @return
*/
@GetMapping(value = "/find/sendForPw")
@ApiOperation(value = "비밀번호 찾기 시 인증번호 발송")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ApiImplicitParams({
@ApiImplicitParam(name = "userId",value = "사용자ID", dataTypeClass = String.class),
@ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> sendForPw(String userId, String hpno) {
@Operation(summary = "비밀번호 찾기 시 인증번호 발송", description = "비밀번호 찾기 시도 시 멤버의 ID과 핸드폰번호를 입력받아 인증번호를 발송하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> sendForPw(@Parameter(name="userId", description = "회원 아이디", in = ParameterIn.QUERY, example = "palnet") String userId,
@Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno) {
Map<String, Object> resultMap = new HashMap<String, Object>();
if(userId == null || hpno == null) {
return ResponseEntity.status(HttpStatus.OK)
if(userId == null || hpno == null) { // userId[회원아이디]와 memberName[회원이름]이 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
boolean result = service.certifPw(userId, hpno);
boolean result = service.certifPw(userId, hpno); // 회원 ID와 휴대폰번호로 인증메세지 보내는 기능
resultMap.put("result", result);
if(!result) {
resultMap.put("code", -1); //일치하는 회원 없음
@ -209,6 +228,13 @@ public class AcntCrtfyhpController {
resultMap.put("code", 0); //일치하는 회원 존재
}
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -217,25 +243,28 @@ public class AcntCrtfyhpController {
return ResponseEntity.ok().body( new SuccessResponse<Map>(resultMap));
}
/**
* 비밀번호 찾기 업데이트
* @param userId
* @param hpno
* @param newPw
* @return
* @throws Exception
*/
@GetMapping(value = "/find/updatePw")
@ApiOperation(value = "비밀번호 찾기 및 업데이트")
@Tag(name = "휴대폰 인증 관리", description = "회원 휴대폰 인증 관련 API")
@ApiImplicitParams({
@ApiImplicitParam(name = "userID",value = "사용자ID", dataTypeClass = String.class),
@ApiImplicitParam(name = "hpno",value = "휴대폰번호", dataTypeClass = String.class),
@ApiImplicitParam(name = "newPw",value = "새로운 비밀번호", dataTypeClass = String.class)
})
public ResponseEntity<? extends BasicResponse> updatePw(String userId, String hpno, String newPw) throws Exception {
@Operation(summary = "새로운 비밀번호로 업데이트", description = "비밀번호 찾기 -> 인증번호 검증이 성공했을 경우, userId와 hpno가 일치하는 회원정보를 새로운 비밀번호로 업데이트 하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> updatePw(@Parameter(name="userId", description = "회원 아이디", in = ParameterIn.QUERY, example = "palnet") String userId,
@Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "01012345678") String hpno,
@Parameter(name="hpno", description = "회원 핸드폰번호", in = ParameterIn.QUERY, example = "newPassword1234") String newPw) throws Exception {
Map<String, Object> resultMap = new HashMap<String, Object>();
if(hpno == null || newPw == null) {
return ResponseEntity.status(HttpStatus.OK)
if(hpno == null || newPw == null) { // hpno[휴대폰번호]와 newPw[새로운 비밀번호]가 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
boolean result = service.updatePw(userId, hpno, newPw);
try {
boolean result = service.updatePw(userId, hpno, newPw); // 사용자가 입력한 새로운 암호로 업데이트
resultMap.put("result", result);
if(!result) {
resultMap.put("code", -1);
@ -243,6 +272,13 @@ public class AcntCrtfyhpController {
resultMap.put("code", 0);
}
} catch(Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));

113
pav-server/src/main/java/com/palnet/biz/api/acnt/crtfyhp/service/AcntCrtfyhpService.java

@ -19,6 +19,7 @@ import com.palnet.biz.jpa.repository.pty.PtyCstmrBasRepository;
import com.palnet.biz.jpa.repository.pty.PtyCstmrQueryRepository;
import com.palnet.biz.jpa.repository.pty.SuredataRepository;
import com.palnet.comn.utils.EncryptUtils;
import com.palnet.comn.utils.InstantUtils;
@Service
public class AcntCrtfyhpService {
@ -105,9 +106,16 @@ public class AcntCrtfyhpService {
//
// return true;
// }
/**
* hpno에 있는 번호로 인증번호 메세지 발송하는 기능
* @param hpno
* @return
* @throws Exception
*/
public boolean registerSend(String hpno) throws Exception{
//인증번호 만들기 ( 6자리)
//인증번호 만들기 (6자리)
String certifyNo = numberGen(6, 2);
//메시지 만들기
@ -125,13 +133,25 @@ public class AcntCrtfyhpService {
ptyEntity.setCrtfyhpYn("N");
ptyCrtfyhpBasRepository.save(ptyEntity);
logger.info("certifyNo :: " + certifyNo);
logger.info("certifyNo :: {}", certifyNo); // 로그로 인증번호 값을 찍어줌
// 현재시간 값을 구해옴 예시 => nowStr = "20231206135600"
String nowStr = InstantUtils.toDatetimeStringByFormat(Instant.now(), "yyyyMMddHHmmss");
//발송 테이블 입력
SuredataEntity entity = new SuredataEntity();
entity.setIntime(nowStr);
entity.setCallphone(hpno);
entity.setMsg(msg);
/**
* Message 기본값들 applcation-local[dev,prod등].properties 파일에서 확인할 있음
* local,dev,prod는 서버가 돌아가는 환경 옵션입니다.
* local - 개발자 개인 컴퓨터 환경
* dev - 상용서버 배포전 테스트할 서버 환경[테스트서버]
* prod - 상용화 환경
*/
entity.setSubject(SUBJECT_CETIFY);
entity.setCallname(CALLNAME_CERTIFY);
entity.setUsercode(USER_CODE);
@ -143,9 +163,11 @@ public class AcntCrtfyhpService {
entity.setKind(KIND);
SuredataEntity result = sureDataRepository.save(entity);
if(result == null) {
SuredataEntity result = sureDataRepository.save(entity); // 데이터 베이스에 저장[Data Insert]
// Save했을시 성공하지 못하면 result는 null됨
// 그래서 null경우 성공하지 못한다고 판단
if(result == null) {
return false;
}
@ -153,14 +175,33 @@ public class AcntCrtfyhpService {
}
/**
* 휴대폰 번호에 전송된 인증번호가 맞는지 확인하는 기능
* @param hpno
* @param crtfyNo
* @return
* @throws Exception
*/
public boolean registerConfirm(String hpno , String crtfyNo ) throws Exception{
hpno = EncryptUtils.encrypt(hpno); //암호화 해서 검색
List<PtyCrtfyhpBas> entity = query.confirmSms(hpno , crtfyNo);
List<PtyCrtfyhpBas> entity = query.confirmSms(hpno , crtfyNo); // 데이터 베이스에서 휴대폰 번호와 인증번호 맞는지 체크
return entity.size() == 0 ? false : true;
/**
* entity.size() 값은 인증성공하면 1이상 인증이 실패하면 0입니다.
* 그래서, [0]이면 false [인증실패]
* [1]이면 true [인증성공]
*/
return entity.size() == 0 ? false : true;
}
/**
* len의 크기만큼 난수 생성,
* dupCd가 [1]이면 [중복허용], [2] [중복불가]
* @param len
* @param dupCd
* @return
*/
public static String numberGen(int len, int dupCd){
Random rand = new Random();
String numStr = ""; //난수가 저장될 변수
@ -184,46 +225,78 @@ public class AcntCrtfyhpService {
}
return numStr;
}
/**
* 휴대폰 번호와 회원이름으로 회원 휴대폰에 인증번호 발송하는 기능
* @param memberName
* @param hpno
* @return
* @throws Exception
*/
public boolean certifNum(String memberName, String hpno) throws Exception{
// String name = EncryptUtils.encrypt(memberName);
String phone = EncryptUtils.encrypt(hpno);
boolean certifNum = cstmrQuery.certifNum(memberName , phone);
if(certifNum) {
registerSend(hpno);
if(certifNum) { // 회원정보가 있어 true면 인증문자 발송
registerSend(hpno); // hpno번호에 있는 번호로 문자발송
}
return certifNum;
}
/**
* 휴대폰 번호와 회원 명으로 회원 ID 찾는 기능
* @param memberName
* @param hpno
* @return
* @throws Exception
*/
public String findUserId(String memberName, String hpno) throws Exception{
// String name = EncryptUtils.encrypt(memberName);
String phone = EncryptUtils.encrypt(hpno);
String resultFindId = cstmrQuery.findUserId(memberName,phone);
String phone = EncryptUtils.encrypt(hpno); // 번호 암호화
String resultFindId = cstmrQuery.findUserId(memberName,phone); // 휴대폰번호[hpno]와 회원명[memberName]으로 ID찾기
return resultFindId;
}
/**
* 회원 ID와 휴대폰번호로 인증메세지 보내는 기능
* @param userId
* @param hpno
* @return
* @throws Exception
*/
public boolean certifPw(String userId, String hpno) throws Exception{
String phone = EncryptUtils.encrypt(hpno);
String phone = EncryptUtils.encrypt(hpno); // 번호 암호화
PtyCstmrBas certifNum = cstmrQuery.findUserPw(userId , phone);
boolean result = false;
if(certifNum != null) {
//certifNum이 값이 있을경우 메세지 전송, 값이 있다는것은 데이터베이스에 ID와 휴대폰번호[hpno]가 일치한다는 것
if(certifNum != null) {
registerSend(hpno);
result = true;
}
return result;
}
/**
* 사용자가 입력한 새로운 암호로 변경[수정]하는 기능
* @param userId
* @param hpno
* @param newPw
* @return
* @throws Exception
*/
public boolean updatePw(String userId, String hpno, String newPw) throws Exception{
String phone = EncryptUtils.encrypt(hpno);
PtyCstmrBas certifNum = cstmrQuery.findUserPw(userId , phone);
String phone = EncryptUtils.encrypt(hpno); // 휴대폰번호 암호화
PtyCstmrBas certifNum = cstmrQuery.findUserPw(userId , phone); // 회원 아이디와 휴대폰번호로 데이터베이스에서 조회
boolean result = false;
if(certifNum != null) {
if(certifNum != null) { //certifNum이 값이 있을경우 메세지 전송, 값이 있다는것은 데이터베이스에 ID와 휴대폰번호[hpno]가 일치한다는 것
String encryptPw = EncryptUtils.sha256Encrypt(newPw);
certifNum.setUserPswd(encryptPw);
certifNum.setPswdUpdtDt(Instant.now());
ptyCstmrBasRepository.save(certifNum);
ptyCstmrBasRepository.save(certifNum); // 바뀐 암호로 변경[수정] 하는 코드
result = true;
}
return result;

179
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/controller/AcntCstmrController.java

@ -1,6 +1,22 @@
package com.palnet.biz.api.acnt.cstmr.controller;
import java.time.ZoneId;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.palnet.biz.api.acnt.cstmr.model.*;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.acnt.cstmr.service.AcntCstmrService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
@ -8,22 +24,15 @@ import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.biz.jpa.entity.PtyCstmrBas;
import com.palnet.biz.jpa.entity.PtyCstmrDtl;
import com.palnet.comn.exception.CustomException;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.time.ZoneId;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
@Log4j2
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/acnt/cstmr", produces = {MediaType.APPLICATION_JSON_VALUE})
@ -32,9 +41,13 @@ public class AcntCstmrController {
private final AcntCstmrService service;
/**
* 회원가입 기능, AcntCstmrRqModel에 사용자가 입력한 회원 정보가 들어있음
* @param rq
* @return
*/
@PostMapping(value = "/register")
@ApiOperation(value = "회원 가입")
@Tag(name = "회원관리", description = "회원 관련 API")
@Operation(summary = "회원가입", description = "회원가입 API 입니다.")
public ResponseEntity<? extends BasicResponse> register(@RequestBody AcntCstmrRqModel rq) {
AcntCstmrRsModel result;
@ -44,11 +57,18 @@ public class AcntCstmrController {
// result = service.list(rq);
log.debug(">>> bd : {}", rq.getBrthdyDate());
log.debug(">>> bd : {}", rq.getBrthdyDate().atZone(ZoneId.of("Asia/Seoul")).toLocalDateTime());
log.debug(">>> td : {}", rq.getTestDt());
log.debug(">>> td : {}", rq.getTestDt().atZone(ZoneId.of("Asia/Seoul")).toLocalDateTime());
result = service.register(rq);
// log.debug(">>> td : {}", rq.getTestDt());
// log.debug(">>> td : {}", rq.getTestDt().atZone(ZoneId.of("Asia/Seoul")).toLocalDateTime());
result = service.register(rq); // 회원정보를 데이터베이스에 추가[INSERT]함.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -57,18 +77,29 @@ public class AcntCstmrController {
return ResponseEntity.ok().body(new SuccessResponse<AcntCstmrRsModel>(result));
}
/**
* 회원 조회하는 기능, cstmrSno는 회원 고유번호 입니다.
* 고유번호로 회원의 정보를 조회합니다.
* @param cstmrSno
* @return
*/
@GetMapping(value = "/profile/{cstmrSno}")
@ApiOperation(value = "회원 정보")
@Tag(name = "회원관리", description = "회원 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> mypage(@PathVariable Integer cstmrSno){
@Operation(summary = "회원 정보 조회", description = "회원 고유 넘버로 회원 정보를 조회합니다. cstmrSno 예시 : 1, 2, 3 ....")
public ResponseEntity<? extends BasicResponse> mypage(@Parameter(name="cstmrSno", description = "회원번호", in = ParameterIn.PATH, example = "3") @PathVariable Integer cstmrSno){
List<AnctCstmerRlModel> result = null;
try {
result = service.list(cstmrSno);
result = service.list(cstmrSno); // 회원고유번호[cstmrSno]로 회원정보를 조회 함.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -78,22 +109,42 @@ public class AcntCstmrController {
return ResponseEntity.ok().body(new SuccessResponse<List>(result));
}
/**
* 회원 계정 암호 변경하는 기능,
* AcntCstmrPwModel애 회원이 입력한 기존암호, 변경할 암호값이 있습니다.
* @param rq
* @return
*/
@PostMapping(value = "/profile/pswdupdate")
@ApiOperation(value = "회원 패스워드 변경")
@Tag(name = "회원관리", description = "회원 관련 API")
@Operation(summary = "회원 패스워드 변경", description = "회원의 비밀번호를 변경합니다.")
public ResponseEntity<? extends BasicResponse> passwordupdate(@RequestBody AcntCstmrPwModel rq){
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
PtyCstmrBas result = service.updatepas(rq);
PtyCstmrBas result = service.updatepas(rq); // 입력받은 값으로 회원계정 암호변경.
resultMap.put("result", result);
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNOE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(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"));
}
@ -101,22 +152,42 @@ public class AcntCstmrController {
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
/**
* 회원 기존 패스워드 확인,
* userPswd 값에 있는 회원 암호가 맞는지 확인합니다.
* @param rq
* @return
*/
@PostMapping(value = "/profile/pwcheck")
@ApiOperation(value = "회원 기존 패스워드 확인")
@Tag(name = "회원관리", description = "회원 관련 API")
public ResponseEntity<? extends BasicResponse> extendpsw(@RequestBody Map<String,String> userPswdMap){
@Operation(summary = "기존 회원의 패스워드 확인", description = " jwt토큰에 등록된 유저정보와 패스워드가 일치하는지 확인합니다. 입력 예시 -> userPswd : test1234 ")
public ResponseEntity<? extends BasicResponse> extendpsw(@RequestBody AcntCstmrPswdCheckRQ rq){
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
boolean result = service.extendpsw(userPswdMap.get("userPswd"));
boolean result = service.extendpsw(rq); // 기존 암호가 맞는지 확인하는 기능.
resultMap.put("result", result);
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNOE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(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"));
}
@ -124,17 +195,30 @@ public class AcntCstmrController {
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
/**
* 회원정보 수정하는 기능,
* AcntCstmrEmModel에 회원이 입력한 수정할 정보들로 수정합니다.
* @param rq
* @return
*/
@PutMapping(value = "/profile/update")
@ApiOperation(value = "회원 정보 변경 (이메일,핸드폰)")
@Tag(name = "회원관리", description = "회원 관련 API")
@Operation(summary = "회원정보 수정", description = "토큰을 발급한 ID의 회원정보(이메일, 휴대폰번호)를 업데이트 하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> updateEmail(@RequestBody AcntCstmrEmModel rq){
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
PtyCstmrDtl result = service.updateEmail(rq);
PtyCstmrDtl result = service.updateEmail(rq); // 이메일과 휴대폰번호를 업데이트 하는 기능
resultMap.put("result", result);
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNOE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
@ -142,6 +226,13 @@ public class AcntCstmrController {
return ResponseEntity.ok().body(new SuccessResponse<Map>(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"));
@ -149,19 +240,31 @@ public class AcntCstmrController {
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
/**
* 회원 탈퇴 처리하는 기능,
* 회원고유[cstmrSno] 값으로 회원탈퇴처리함.
* @param cstmrSno
* @return
*/
@PostMapping(value = "/profile/delete/{cstmrSno}")
@ApiOperation(value = "회원 탈퇴")
@Tag(name = "회원관리", description = "회원 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> userDelete(@PathVariable Integer cstmrSno){
@Operation(summary = "회원 탈퇴", description = "cstmrSno를 받아 회원탈퇴 처리하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> userDelete(@Parameter(name="cstmrSno", description = "회원 일련번호", in = ParameterIn.PATH, example = "27")@PathVariable Integer cstmrSno){
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
boolean result = service.userDelete(cstmrSno);
boolean result = service.userDelete(cstmrSno); // 회원고유[cstmrSno] 값으로 회원탈퇴처리함.
resultMap.put("result", result);
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNOE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());

10
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrEmModel.java

@ -1,20 +1,26 @@
package com.palnet.biz.api.acnt.cstmr.model;
import lombok.Data;
import java.time.Instant;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class AcntCstmrEmModel {
@Schema(description = "유저 이메일" , example = "updateEmail@test.co.kr")
private String email;
@Schema(description = "업데이트 일자", example = "2023-12-12", implementation = String.class)
private Instant updateDt;
@Schema(hidden = true)
private String updateUserId;
@Schema(hidden = true)
private int cstmrSno;
@Schema(description = "업데이트할 핸드폰 번호", example = "01023457777")
private String hpno;

11
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrPswdCheckRQ.java

@ -0,0 +1,11 @@
package com.palnet.biz.api.acnt.cstmr.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class AcntCstmrPswdCheckRQ {
@Schema(description = "유저의 비밀번호", example = "test1234")
private String userPswd;
}

9
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrPwModel.java

@ -1,17 +1,22 @@
package com.palnet.biz.api.acnt.cstmr.model;
import lombok.Data;
import java.time.Instant;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class AcntCstmrPwModel {
@Schema(hidden = true)
private Instant pswdupdtDt;
@Schema(description = "유저의 기존 비밀번호", example = "test1234")
private String userPswd;
@Schema(description = "유저의 새로운 비밀번호", example = "test12345")
private String newPswd;
@Schema(description = "유저의 새로운 비밀번호(확인)", example = "test12345")
private String newPswdConfirm;
}

30
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AcntCstmrRqModel.java

@ -1,54 +1,78 @@
package com.palnet.biz.api.acnt.cstmr.model;
import java.time.Instant;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.palnet.biz.config.convert.InstantDateStrSerializer;
import lombok.Data;
import java.time.Instant;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class AcntCstmrRqModel{
@Schema(description = "고객구분코드" , example = "MEMBER")
private String cstrmDivCd;
@Schema(description = "고객상태코드" , example = "A")
private String cstrmStatusCd;
@Schema(description = "유저 아이디(중복인 경우 숫자 변경)" , example = "tester01")
private String userId;
@Schema(description = "유저 권한" , example = "USER")
private String authId;
@Schema(description = "사이트 코드" , example = "DRON")
private String siteCode;
@Schema(hidden = true)
private String memberDivCd;
@Schema(description = "유저 비밀번호" , example = "test1234")
private String userPswd;
@Schema(hidden = true)
private String ipinDi;
@Schema(hidden = true)
private String ipinCi;
@Schema(description = "가입인증 수단 코드" , example = "HP_CRTFD")
private String joinCrtfyCd;
@Schema(description = "국가코드" , example = "KOR")
private String cntryCd;
@Schema(description = "성별코드" , example = "M")
private String genderCd;
@Schema(description = "멤버 이름" , example = "TESTER")
private String memberName;
@JsonSerialize(using = InstantDateStrSerializer.class)
@Schema(description = "생년월일", example = "1997-05-05", implementation = String.class)
private Instant brthdyDate;
@Schema(hidden = true)
private Instant testDt;
@Schema(description = "이메일" , example = "tester@test.co.kr")
private String email;
@Schema(description = "멤버 이름" , example = "01012345678")
private String hpno;
@Schema(description = "국가 코드" , example = "+82")
private String clncd;
private AnctCstmrTermsModel[] terms;
@Schema(hidden = true)
private String trmnlId;
@Schema(description = "권한코드(부서)" , example = "KAC")
private String cptAuthCode;

2
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmerRlModel.java

@ -1,5 +1,6 @@
package com.palnet.biz.api.acnt.cstmr.model;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.palnet.biz.config.convert.InstantDateStrSerializer;
import lombok.Data;
@ -28,6 +29,7 @@ public class AnctCstmerRlModel {
private String updateuserId;
@JsonInclude(JsonInclude.Include.ALWAYS)
private String cptAuthCode;
}

9
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrPswdModel.java

@ -0,0 +1,9 @@
package com.palnet.biz.api.acnt.cstmr.model;
import lombok.Data;
@Data
public class AnctCstmrPswdModel {
private String userPswd;
}

3
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/model/AnctCstmrTermsModel.java

@ -1,9 +1,12 @@
package com.palnet.biz.api.acnt.cstmr.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class AnctCstmrTermsModel {
@Schema(description = "약관 일련번호", example = "1")
private int termsSno;
@Schema(description = "동의여부", example = "Y")
private String agreeYn;
}

162
pav-server/src/main/java/com/palnet/biz/api/acnt/cstmr/service/AcntCstmrService.java

@ -5,19 +5,13 @@ import java.util.List;
import javax.persistence.EntityManagerFactory;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrEmModel;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrPwModel;
import com.palnet.biz.api.acnt.cstmr.model.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrRqModel;
import com.palnet.biz.api.acnt.cstmr.model.AcntCstmrRsModel;
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmerRlModel;
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel;
import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.jpa.entity.PtyCstmrBas;
@ -33,7 +27,6 @@ import com.palnet.biz.jpa.repository.pty.PtyGroupBasRepository;
import com.palnet.biz.jpa.repository.pty.PtyTermsAgreeTxnRepository;
import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.DateUtils;
import com.palnet.comn.utils.EncryptUtils;
import com.palnet.comn.utils.HttpUtils;
@ -74,7 +67,7 @@ public class AcntCstmrService {
/**
*
*
* AcntCstmrRqModel에 담겨있는 회원정보를 데이터베이스에 추가하는 기능
* @param rq
* @return
*/
@ -89,7 +82,7 @@ public class AcntCstmrService {
//사전 체크. 동일한 ID 존재 여부 확인
isUserIdFind = query.findCstmrByUserId(rq.getUserId());
if(isUserIdFind) {
if(isUserIdFind) { // 중복되면 에러코드 반환
rs.setErrCode(-1);
return rs;
}
@ -119,21 +112,27 @@ public class AcntCstmrService {
}
}
//성공 파람 담기
//성공 데이터 담기
if(basEntity != null) {
rs.setErrCode(1);
rs.setLoginId(basEntity.getUserId());
}
}
}catch(Exception e) {
log.error("IGNORE : {}", e);
rs.setErrCode(-2);
return rs;
}
return rs;
}
/**
* AcntCstmrRqModel에 담겨있는 회원정보를 데이터베이스에 추가[INSERT]하는 기능.
* @param rq
* @return
* @throws Exception
*/
public PtyCstmrBas savePtyCstmrBas(AcntCstmrRqModel rq) throws Exception{
@ -148,12 +147,25 @@ public class AcntCstmrService {
basEntity.setJoinDt(Instant.now() );
basEntity.setJoinIp(HttpUtils.getRequestIp());
basEntity.setTrmnlId(rq.getTrmnlId());
basEntity.setCptAuthCode(rq.getCptAuthCode() == null ? "KAC": rq.getCptAuthCode());
return ptyCstmrBasRepository.save(basEntity);
}
/**
* AcntCstmrRqModel에 담겨있는 상세정보를 데이터베이스에 추가[INSERT].
* @param rq
* @param basEntity
* @return
* @throws Exception
*/
public PtyCstmrDtl savePtyCstmrDtl(AcntCstmrRqModel rq , PtyCstmrBas basEntity) throws Exception{
if(rq.getCntryCd() == null || rq.getCntryCd().equals("")){
rq.setCntryCd("KOR");
}
PtyCstmrDtl dtlEntity = new PtyCstmrDtl();
dtlEntity.setCstmrSno(basEntity.getCstmrSno());
dtlEntity.setIpinCi(rq.getIpinCi());
@ -189,20 +201,30 @@ public class AcntCstmrService {
return ptyTermsAgreeTxnRepository.save(agreeEntity);
}
/**
* 회원 고유번호[cstmrSno] 회원정보를 조회하는 기능.
* @param cstmrSno
* @return
*/
public List<AnctCstmerRlModel> list(int cstmrSno) {
List<AnctCstmerRlModel> resultList = query.list(cstmrSno);
List<AnctCstmerRlModel> resultList = query.list(cstmrSno); // 회원고유번호[cstmrSno]로 회원정보를 조회 함.
for(AnctCstmerRlModel model : resultList) {
model.setEmail(EncryptUtils.decrypt(model.getEmail()));
model.setHpno(EncryptUtils.decrypt(model.getHpno()));
model.setEmail(EncryptUtils.decrypt(model.getEmail())); // 이메일은 회원추가할 때 암호화하기에 다시 복호화를 함
model.setHpno(EncryptUtils.decrypt(model.getHpno())); // 휴대폰 번호는 회원추가할 때 암호화하기에 다시 복호화를 함
}
return resultList;
}
/**
* 회원에게 입력받은 암호로 변경하는 기능
* @param rq
* @return
*/
public PtyCstmrBas updatepas(AcntCstmrPwModel rq) {
// 1. 토큰 유저 정보 불러오기
Integer userId = jwtTokenUtil.getCstmrSnoByToken();
@ -228,8 +250,15 @@ public class AcntCstmrService {
return updateUserEntity;
}
public boolean extendpsw(String userPswd){
/**
* 기존 암호가 맞는지 확인하는 기능.
* @param userPswd
* @return
*/
public boolean extendpsw(AcntCstmrPswdCheckRQ rq){
boolean result = false;
String userPswd = rq.getUserPswd();
// 1. 토큰 유저 정보 불러오기
Integer userId = jwtTokenUtil.getCstmrSnoByToken();
@ -258,57 +287,88 @@ public class AcntCstmrService {
return result;
}
/**
* 이메일과 휴대폰번호를 업데이트 하는 기능.
* @param rq
* @return
*/
public PtyCstmrDtl updateEmail(AcntCstmrEmModel rq) {
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken();
String userId = jwtTokenUtil.getUserIdByToken();
String newEmail = EncryptUtils.encrypt(rq.getEmail());
String newHpno = EncryptUtils.encrypt(rq.getHpno());
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); // 회원 인가할 정보에 있는 회원 고유번호
String userId = jwtTokenUtil.getUserIdByToken(); // 회원 인가할 정보에 있는 회원 아이디
String newEmail = EncryptUtils.encrypt(rq.getEmail()); // 바뀔 이메일 암호화
String newHpno = EncryptUtils.encrypt(rq.getHpno()); // 바뀔 휴대폰번호 암호화
// 회원 고유번호로 회원정보를 데이터베이스에서 가져옴
PtyCstmrDtl userEntity = ptyCstmrDtlRepository.findById(cstmrSno).orElse(null);
// 바뀔 내용 넣어줌
userEntity.setEmail(newEmail);
userEntity.setUpdateDt(Instant.now() );
userEntity.setUpdateUserId(userId);
userEntity.setHpno(newHpno);
// 바뀔 내용을 데이터베이스에 수정함
PtyCstmrDtl updateEmailEntity = ptyCstmrDtlRepository.save(userEntity);
return updateEmailEntity;
}
/**
* 회원고유[cstmrSno] 값으로 회원탈퇴처리 하는 기능.
* @param cstmrSno
* @return
*/
public boolean userDelete(int cstmrSno) {
List<JwtGroupModel> groupInfo = jwtTokenUtil.getGroupAuthByToken();
for(JwtGroupModel group : groupInfo) {
// if(group.getGroupAuthCd().equals("CREATER")) {
if(group.getGroupAuthCd().equals("MASTER")) {
PtyGroupBas groupEntity = ptyGroupBasRepository.findByGroupId(group.getGroupId());
if(!(groupEntity == null)) {
groupEntity.setUseYn("N");
ptyGroupBasRepository.save(groupEntity);
}
List<PtyCstmrGroup> cstmrEntity = ptyCstmrGroupRepository.changeGroupJoinYn(group.getGroupId());
if(!(cstmrEntity == null)) {
for(PtyCstmrGroup cstmr : cstmrEntity) {
cstmr.setJoinYn("N");
ptyCstmrGroupRepository.save(cstmr);
List<JwtGroupModel> groupInfo = jwtTokenUtil.getGroupAuthByToken(); // 회원의 속한 그룹을 조회
if(groupInfo != null) {
for(JwtGroupModel group : groupInfo) {
// if(group.getGroupAuthCd().equals("CREATER")) {
// 회원의 그룹 권한이 MASTER 일 경우
if(group.getGroupAuthCd().equals("MASTER")) {
PtyGroupBas groupEntity = ptyGroupBasRepository.findByGroupId(group.getGroupId());
// 그룹이 있을경우 그룹의 사용여부 "N" 값으로 저장
if(!(groupEntity == null)) {
groupEntity.setUseYn("N");
ptyGroupBasRepository.save(groupEntity);
}
List<PtyCstmrGroup> cstmrEntity = ptyCstmrGroupRepository.changeGroupJoinYn(group.getGroupId());
// cstmrEntity 값이 있을 경우 참여여부 "N" 값으로 저장
if(!(cstmrEntity == null)) {
for(PtyCstmrGroup cstmr : cstmrEntity) {
cstmr.setJoinYn("N");
ptyCstmrGroupRepository.save(cstmr);
}
}
}
}
List<PtyCstmrGroup> AprvlEntity = ptyCstmrGroupRepository.changeGroupAprvlYn(cstmrSno);
if(!(AprvlEntity == null)) {
for(PtyCstmrGroup Aprvl : AprvlEntity) {
Aprvl.setAprvlYn("N");
Aprvl.setAprvlDt(null);
ptyCstmrGroupRepository.save(Aprvl);
// 회원 고유번호로 데이터베이스에서 그룹참여정보 가져옴
List<PtyCstmrGroup> AprvlEntity = ptyCstmrGroupRepository.changeGroupAprvlYn(cstmrSno);
// AprvlEntity[그룹참여 정보가] 있을경우
if(!(AprvlEntity == null)) {
// 그룹 승인여부를 "N"값으로 저장
for(PtyCstmrGroup Aprvl : AprvlEntity) {
Aprvl.setAprvlYn("N");
Aprvl.setAprvlDt(null);
ptyCstmrGroupRepository.save(Aprvl);
}
// 그룹 참여여부를 "N"값으로 저장
PtyCstmrGroup cstmrEntity = ptyCstmrGroupRepository.findGroupId(group.getGroupId(), cstmrSno);
if(!(cstmrEntity == null)) {
cstmrEntity.setJoinYn("N");
ptyCstmrGroupRepository.save(cstmrEntity);
}
}
PtyCstmrGroup cstmrEntity = ptyCstmrGroupRepository.findGroupId(group.getGroupId(), cstmrSno);
if(!(cstmrEntity == null)) {
cstmrEntity.setJoinYn("N");
ptyCstmrGroupRepository.save(cstmrEntity);
}
}
}
// 데이터베이스에 있는 회원 정보를 탈퇴처리 후 저장함
PtyCstmrBas userEntity = ptyCstmrBasRepository.findByUserGroupId(cstmrSno);
userEntity.setCstmrStatusCd("W");
userEntity.setCstmrStatusCngDt(Instant.now() );

136
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java

@ -1,5 +1,18 @@
package com.palnet.biz.api.acnt.jwt.controller;
import java.util.Map;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.acnt.jwt.model.JwtProfileRsModel;
import com.palnet.biz.api.acnt.jwt.model.JwtRqModel;
import com.palnet.biz.api.acnt.jwt.model.JwtRsModel;
@ -11,50 +24,48 @@ import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.biz.jpa.entity.PtyCstmrBas;
import com.palnet.comn.code.RSErrorCode;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
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;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RestController
@RequiredArgsConstructor
@Log4j2
@RequestMapping(value = "/api/acnt/jwt", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API")
public class JwtAuthenticationController {
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Autowired
private JwtUserDetailsService userDetailsService;
@Autowired
private JwtService service;
private final JwtTokenUtil jwtTokenUtil;
private final JwtUserDetailsService userDetailsService;
private final JwtService service;
/**
* 로그인 기능,
* JwtRqModel에 입력받은 회원아이디, 입력받은 회원 비밀번호로 인증처리를 .
* @param authenticationRequest
* @return
* @throws Exception
*/
@PostMapping(value = "/login")
@ApiOperation(value = "로그인")
@Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API")
@Operation(summary = "로그인", description = "ID와 PASSWORD를 입력받아 로그인 처리하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> createAuthenticationToken(@RequestBody JwtRqModel authenticationRequest) throws Exception {
// 로그인 프로세스
Map<String , Object> resultMap = service.loginProcess(authenticationRequest);
Map<String , Object> resultMap = service.loginProcess(authenticationRequest);
int loginError = (int) resultMap.get("loginError");
int loginError = (int) resultMap.get("loginError");
// loginError 은 1이 정상, - 값은 모두 로그인 실패임
if(loginError < 0) {
String errorMessage = (String) resultMap.get("errorMessage");
// 로그인 실패시 로그인 실패한 사유를 반환함
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(errorMessage, loginError + "")); // 계정 사용하지 못함
}else {
@ -65,54 +76,78 @@ public class JwtAuthenticationController {
}
/**
* 로그인 회원 정보,
* 회원고유번호[cstmrSno] 조회를 .
* @param cstmrSno
* @return
* @throws Exception
*/
@GetMapping(value = "/profile/{cstmrSno}")
@ApiOperation(value = "로그인한 회원의 정보")
@Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> proflie(@PathVariable Integer cstmrSno) throws Exception{
@Operation(summary = "로그인한 회원의 정보", description = "로그인 된 유저의 정보를 가져오는 API 입니다.")
public ResponseEntity<? extends BasicResponse> proflie(
@Parameter(name="cstmrSno", description = "회원번호", in = ParameterIn.PATH, example = "3")@PathVariable Integer cstmrSno) throws Exception{
JwtProfileRsModel result = service.profile(cstmrSno);
JwtProfileRsModel result = service.profile(cstmrSno); // 회원고유번호로 회원정보를 가져오는 기능.
if(result == null) {
// 반환받은 회원정보가 없을시 "의도적인" 예외코드를 반환해줌
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.DATA_NOTFOUNT));
}
return ResponseEntity.ok().body(new SuccessResponse<JwtProfileRsModel>(result));
}
/**
* 회원의 인가정보 유효기간 종료시,
* 다시 인가정보[토큰] 받는 기능
* @param body
* @return
* @throws Exception
*/
@PostMapping(value = "/refresh")
@Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API")
// public ResponseEntity<? extends BasicResponse> refresh(@RequestParam("cstmrSno") int cstmrSno , @RequestParam("refreshToken") String refreshToken) throws Exception{
public ResponseEntity<? extends BasicResponse> refresh(@RequestBody Map body) throws Exception{
//입력값 검증
@Operation(summary = "JWT 재인가토큰 발급", description = "JWT 토큰을 재발급하는 API 입니다. <br> { <br> \"cstmrSno\" : 2, <br> \"refreshToken\" : \"palnet을 제외한 token 전체를 입력\" <br> } <br> 위의 예시와 같이 값을 입력하시면 됩니다. cstmrSno는 토큰의 ID와 매핑되는 값이어야 합니다.")
public ResponseEntity<? extends BasicResponse> refresh(
@RequestBody
@Schema(example = "{\n" +
"\"cstmrSno\" : 2,\n" +
"\"refreshToken\" : \"palnet을 제외한 token 전체를 입력\"\n" +
"}")
Map body
) throws Exception {
// 회원고유번호[cstmrSno], 회원고유번호[cstmrSno]가 Integer타입인지, 인가정보를 다시받을 토큰값 [refreshToken] 입력값에 대한 검증처리
if(body.get("cstmrSno") == null || body.get("refreshToken") == null || !(body.get("cstmrSno") instanceof Integer)) {
// 검증이 되지 않으면 "의도적인" 예외코드를 반환해줌
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
int cstmrSno = (int)body.get("cstmrSno");
String refreshToken = (String)body.get("refreshToken");
JwtRsModel result = service.findRefreshtoken(cstmrSno, refreshToken);
// JwtRsModel result = null;
// 재 인가토큰 발급
JwtRsModel result = service.findRefreshtoken(cstmrSno, refreshToken);
// JwtRsModel result = null;
if(result ==null) {
// 토큰발행 실패 시 "의도적인" 예외코드를 반환해줌
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.DATA_NOTFOUNT));
}
return ResponseEntity.ok().body(new SuccessResponse<JwtRsModel>(result));
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/**
* 로그아웃 기능.
* @param cstmrSno
* @return
* @throws Exception
*/
@GetMapping(value = "/logout/{cstmrSno}")
@ApiOperation(value = "로그아웃 한 회원의 정보")
@Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> logout(@PathVariable Integer cstmrSno) throws Exception{
@Operation(summary = "회원 로그아웃", description = "회원을 로그아웃 시키는 API 입니다.")
public ResponseEntity<? extends BasicResponse> logout(
@Parameter(name="cstmrSno", description = "회원번호", in = ParameterIn.PATH, example = "3")@PathVariable Integer cstmrSno) throws Exception{
// if(cstmrSno == null || !(body.get("cstmrSno") instanceof Integer)) {
// return ResponseEntity.status(HttpStatus.OK)
@ -120,10 +155,11 @@ public class JwtAuthenticationController {
// }
// int cstmrSno = (int)body.get("cstmrSno");
// 로그아웃 할 프로세스
PtyCstmrBas bas = service.logoutProcess(cstmrSno);
if(bas == null) {
// 로그아웃 프로세스 실패 시 "의도적인" 예외코드를 반환해줌
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.DATA_NOTFOUNT));
}

4
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtProfileRsModel.java

@ -1,5 +1,6 @@
package com.palnet.biz.api.acnt.jwt.model;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
@Data
@ -15,5 +16,8 @@ public class JwtProfileRsModel {
private String memberName;
private String trmnlId;
@JsonInclude(JsonInclude.Include.ALWAYS)
private String cptAuthCode;
}

5
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRqModel.java

@ -6,6 +6,8 @@ import lombok.NoArgsConstructor;
import java.io.Serializable;
import io.swagger.v3.oas.annotations.media.Schema;
@NoArgsConstructor
@AllArgsConstructor
@ -14,6 +16,9 @@ public class JwtRqModel implements Serializable {
private static final long serialVersionUID = 5926468583005150707L;
@Schema(description = "로그인 ID" , example = "loginSample01")
private String userId;
@Schema(description = "FAQ 카테고리" , example = "sample1234")
private String userPswd;
}

33
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java

@ -39,8 +39,7 @@ public class JwtService {
private final JwtTokenUtil jwtTokenUtil;
/**
* 로그인 처리
*
* 로그인 처리하는 기능.
* @param rq
* @return
*/
@ -78,8 +77,8 @@ public class JwtService {
}
}
if (loginError < 0) {
//loginError 값이 - 인경우 에러 메세지와 함꼐 반환
if (loginError < 0) {
String errorMessage = "";
if (loginError == -100) {
@ -103,11 +102,13 @@ public class JwtService {
return resultMap;
} else {
} else { //loginError 값이 + 값이라면 로긍니 성공
String accessToken = jwtTokenUtil.generateToken(userDetails);
// 인증이후 인가할 정보 만듬.
String accessToken = jwtTokenUtil.generateToken(userDetails);
String refreshToken = jwtTokenUtil.generateRefreshToken(userDetails);
// 반환할 객체 설정.
JwtRsModel result = new JwtRsModel();
result.setAccessToken(accessToken);
result.setRefreshToken(refreshToken);
@ -139,9 +140,18 @@ public class JwtService {
}
/**
* 로그아웃 하는 기능.
* @param cstmrSno
* @return
* @throws Exception
*/
public PtyCstmrBas logoutProcess(int cstmrSno) throws Exception {
// 회원의 정보를 받아옴
Optional<PtyCstmrBas> optional = ptyCstmrBasRepository.findById(cstmrSno);
// 회원의 인가정보를 만료시킴
if (optional.isPresent()) {
PtyCstmrBas entity = optional.get();
entity.setRfrshToken("");
@ -175,7 +185,7 @@ public class JwtService {
}
/**
* refresh Token 저장 처리
* refresh Token 저장 처리 기능
*
* @param cstmrSno
* @param refreshToken
@ -197,8 +207,7 @@ public class JwtService {
}
/**
* 프로필 조회
*
* 회원의 프로필을 조회하는 기능.
* @param cstmrSno
* @return
* @throws Exception
@ -211,8 +220,7 @@ public class JwtService {
}
/**
* token 만료시 refresh 토큰으로 재검색
*
* token 만료시 refresh 토큰으로 재검색 하는 기능.
* @param cstmrSno
* @param refreshToken
* @return
@ -231,7 +239,8 @@ public class JwtService {
Claims claims = jwtTokenUtil.getAllClaimsFromToken(refreshToken);
Integer cstmrSnoByRefreshToken = claims.get("cstmrSno", Integer.class);
if(cstmrSnoByRefreshToken != cstmrSno) return null;
// 인가 토큰 발행할수 있게 필요한 회원 정보들을 데이터베이스에서 조회함.
JwtUserModel userDetails = query.findByIdForrefreshToken(cstmrSno);
String createAccessToken = jwtTokenUtil.generateToken(userDetails);

8
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java

@ -5,7 +5,7 @@ import com.palnet.biz.api.acnt.jwt.model.JwtUserModel;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
@ -17,8 +17,8 @@ import java.io.Serializable;
import java.util.*;
import java.util.function.Function;
@Slf4j
@Component
@Log4j2
public class JwtTokenUtil implements Serializable {
private static final long serialVersionUID = -2550185165626007488L;
@ -146,6 +146,10 @@ public class JwtTokenUtil implements Serializable {
return cstmrSno;
}
/**
* 회원 인가정보로 그룹
* @return
*/
public List<JwtGroupModel> getGroupAuthByToken() {
HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = rq.getHeader("Authorization");

13
pav-server/src/main/java/com/palnet/biz/api/acnt/terms/controller/AcntTermsController.java

@ -6,7 +6,7 @@ import com.palnet.biz.api.acnt.terms.service.AcntTermsService;
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 io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@ -28,16 +28,21 @@ public class AcntTermsController {
private final AcntTermsService service;
/**
* 약관정보 들을 가져오는 기능,
* AcntTermsRqModel에 입력받은 약관타입에 따른 약관항목을 반환함.
* @param rq
* @return
*/
@Operation(summary = "약관 조회", description = "약관 정보를 조회하는 API 입니다.")
@GetMapping(value = "/list")
@Tag(name = "약관 기본", description = "약관 관련 API")
@ApiOperation(value = "약관 기본 정보")
public ResponseEntity<? extends BasicResponse> list(AcntTermsRqModel rq) {
List<AcntTermsRsModel> result = null;
log.debug("RQ>>>>>>>>" , rq.toString());
try {
result = service.list(rq);
result = service.list(rq); // 입력받은 값에 따른 약관항목을 반환하는 기능.
} catch (Exception e) {

7
pav-server/src/main/java/com/palnet/biz/api/acnt/terms/model/AcntTermsRqModel.java

@ -1,5 +1,6 @@
package com.palnet.biz.api.acnt.terms.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -10,7 +11,13 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
public class AcntTermsRqModel {
@Schema(description = "사이트 코드" , example = "SANDBOX")
private String siteCd;
@Schema(description = "약관 카테고리 코드" , example = "SITE_JOIN")
private String termsCtgryCd;
@Schema(description = "언어 코드" , example = "KOR")
private String langDivCd;
}

5
pav-server/src/main/java/com/palnet/biz/api/acnt/terms/service/AcntTermsService.java

@ -16,6 +16,11 @@ public class AcntTermsService {
private final PtyTermsQueryRepository query;
/**
* 입력받은 값에 따른 약관항목을 반환하는 기능.
* @param rq
* @return
*/
public List<AcntTermsRsModel> list(AcntTermsRqModel rq) {
return query.list(rq);
}

83
pav-server/src/main/java/com/palnet/biz/api/anls/hstry/controller/AnlsHstryController.java

@ -9,11 +9,13 @@ 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.code.RSErrorCode;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@ -24,7 +26,7 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Log4j2
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/anls/hstry", produces = {MediaType.APPLICATION_JSON_VALUE})
@ -33,23 +35,36 @@ public class AnlsHstryController {
private final AnlsHstryService service;
/**
* 비행현황 목록 리스트 조회하는 기능,
* AnlsHstryGroupModel에 따른 리스트를 조회함.
* @param rq
* @return
*/
@GetMapping(value = "/list")
@ApiOperation(value = "비행 현황 목록 출력")
@Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API")
@Operation(summary = "비행 현황 목록 출력", description = "비행 현황 목록을 출력하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> list(AnlsHstryGroupModel rq) {
List<AnlsHstryModel> rs = null;
ComnPagingRs<AnlsHstryModel> response;
//입력값 검증
// 검색 시작일 날짜[stDate], 검색 끝일 날짜 날짜값[endDate], 날짜값이 10자리인지 확인[정해진 포맷팅인지 확인하는 것] 입력값 검증처리
if(rq.getStDate() == null || !(rq.getStDate().length() == 10) || rq.getEndDate() ==null || !(rq.getEndDate().length() == 10) ) {
return ResponseEntity.status(HttpStatus.OK)
// 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
response = service.list(rq);
response = service.list(rq); // 비행현황 목록 조회하는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -59,17 +74,30 @@ public class AnlsHstryController {
}
/**
* 비행현황의 상세정보를 조회함,
* 비행ID[CNTRL_ID] 조회함
* @param id
* @return
*/
@GetMapping(value = "/detail/{id}")
@ApiOperation(value = "비행 현황 상세")
@Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> detail(@PathVariable String id) {
@Operation(summary = "비행 현황 상세 정보 출력", description = "비행 현황 상세 정보를 출력하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> detail(
@Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f") @PathVariable String id) {
AnlsHstryModel result = null;
try {
result = service.detail(id);
result = service.detail(id); // 비행ID[CNTRL_ID]로 비행 상세정보를 조회하는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -80,16 +108,31 @@ public class AnlsHstryController {
}
/**
* 비행이력을 조회함,
* 비행ID[CNTRL_ID] 조회함
* @param id
* @return
*/
@GetMapping(value = "/log/{id}")
@ApiOperation(value = "비행 이력 데이터")
@Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> log(@PathVariable String id) {
// @ApiOperation(value = "비행 이력 데이터")
// @Tag(name = "비행 이력 현황", description = "비행 이력 현황 관련 API")
// @ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
@Operation(summary = "비행 현황 이력 출력", description = "비행 현황의 이력을 출력하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> log(
@Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f") @PathVariable String id) {
List<AnlsHstryDetailModel> result = null;
try {
result = service.hstryList(id);
result = service.hstryList(id); // 비행이력을 비행ID[CNTRL_ID] 조회하는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));

7
pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryGroupModel.java

@ -1,6 +1,8 @@
package com.palnet.biz.api.anls.hstry.model;
import com.palnet.biz.api.comn.model.ComnPagingModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -8,14 +10,19 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper=false)
public class AnlsHstryGroupModel extends ComnPagingModel {
@Schema(description = "검색 시작날짜" , example = "2023-11-01", implementation = String.class)
private String stDate;
@Schema(description = "검색 종료날짜" , example = "2023-11-30", implementation = String.class)
private String endDate;
@Schema(hidden = true)
private String search1;
@Schema(hidden = true)
private String searchType1;
@Schema(description = "그룹 아이디", example = "C807F9")
private String groupId;
}

5
pav-server/src/main/java/com/palnet/biz/api/anls/hstry/model/AnlsHstryRqModel.java

@ -2,11 +2,14 @@ package com.palnet.biz.api.anls.hstry.model;
import com.palnet.biz.api.comn.model.ComnRqModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class AnlsHstryRqModel extends ComnRqModel{
public class AnlsHstryRqModel extends ComnRqModel {
@Schema(description = "개체 비행 ID" , example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f")
private String cntrlId;
}

92
pav-server/src/main/java/com/palnet/biz/api/anls/hstry/service/AnlsHstryService.java

@ -5,6 +5,8 @@ import java.util.List;
import java.util.Optional;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
@ -35,50 +37,42 @@ import com.palnet.biz.jpa.repository.pty.PtyCstmrGroupRepository;
import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
@Slf4j
@RequiredArgsConstructor
@Service
public class AnlsHstryService {
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private CtrCntrlBasRepository ctrCntrlBasRepository;
@Autowired
private PtyCstmrGroupRepository ptyCstmrGroupRepository;
@Autowired
private ComArcrftBasRepository comArcrftBasRepository;
@Autowired
private ComIdntBasRepository comIdntBasRepository;
@Autowired
private CtrCntrlHstryAreaRepository ctrCntrlHstryAreaRepository;
@Autowired
private FltPlanBasRepository fltPlanBasRepository;
@Autowired
private FltPlanPilotRepository fltPlanPilotRepository;
@Autowired
private CtrCntrlQueryRepository query;
@Autowired
private JwtTokenUtil jwtTokenUtil;
//비행이력현황 list
private final CtrCntrlBasRepository ctrCntrlBasRepository;
private final PtyCstmrGroupRepository ptyCstmrGroupRepository;
private final ComArcrftBasRepository comArcrftBasRepository;
private final ComIdntBasRepository comIdntBasRepository;
private final CtrCntrlHstryAreaRepository ctrCntrlHstryAreaRepository;
private final FltPlanBasRepository fltPlanBasRepository;
private final FltPlanPilotRepository fltPlanPilotRepository;
private final CtrCntrlQueryRepository query;
private final JwtTokenUtil jwtTokenUtil;
/**
* 비행현황 목록 조회하는 기능.
* @param rq
* @return
*/
public ComnPagingRs<AnlsHstryModel> list(AnlsHstryGroupModel rq){
// 조회에 필요한 기본값 선언
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken();
List<JwtGroupModel> groupAuthList = jwtTokenUtil.getGroupAuthByToken();
List<JwtGroupModel> adminAuth = new ArrayList<>();
String groupAuth = null;
String appAuth = jwtTokenUtil.getUserAuthByToken();
// 페이징 처리를 위한 객체 선언
PageImpl<AnlsHstryModel>resultList;
ComnPagingRs<AnlsHstryModel> response = new ComnPagingRs<>();
Pageable pageable = PageRequest.of(rq.getPage()-1, rq.getRecord());
// 유저의 권한은 확인함
if("USER".equals(appAuth) || "ROLE_USER".equals(appAuth)) {
for(JwtGroupModel list : groupAuthList) {
if(list.getGroupId().equals(rq.getGroupId())) {
@ -86,23 +80,30 @@ public class AnlsHstryService {
}
}
}
// 그룹에서의 권한이 NORMAL인 경우
if("NORMAL".equals(groupAuth)) {
for (JwtGroupModel list : groupAuthList) {
if("MASTER".equals(list.getGroupAuthCd()) || "LEADER".equals(list.getGroupAuthCd())) {
adminAuth.add(list);
}
}
List<ComIdntfBas> idntfList = comIdntBasRepository.findIdntfNumber(cstmrSno);
List<FltPlanBas> basResult = fltPlanBasRepository.findByPlanSno(cstmrSno);
List<FltPlanPilot> pilotList = fltPlanPilotRepository.findByPlanSno(cstmrSno);
List<ComIdntfBas> idntfList = comIdntBasRepository.findIdntfNumber(cstmrSno); // 회원 고유번호와 맞는 기체 고유번호 조회
List<FltPlanBas> basResult = fltPlanBasRepository.findByPlanSno(cstmrSno); // 회원 고유번호와 맞는 비행계획서 조회
List<FltPlanPilot> pilotList = fltPlanPilotRepository.findByPlanSno(cstmrSno); // 회원 고유번호와 맞는 조종사 조회
List<FltPlanBas> pilotResult = new ArrayList<>();
for(FltPlanPilot list : pilotList) {
pilotResult = fltPlanBasRepository.findBasList(list.getPlanSno());
pilotResult = fltPlanBasRepository.findBasList(list.getPlanSno()); // 조종사번호와 맞는 비행계획서 조회
}
// 위 조건들에 부합하는 데이터를 조회함
resultList = query.cntrlBasNormalHstryList(rq, pageable, idntfList, basResult, pilotResult);
// 위 조건들에 부합하여 조회한 데이터의 갯수를 조회함
long total = query.cntrlBasNormalHstryCount(rq, idntfList, basResult, pilotResult);
long totalPage = total % rq.getRecord() > 0 ? total/rq.getRecord() + 1 : total/rq.getRecord();
@ -125,19 +126,27 @@ public class AnlsHstryService {
return response;
}
/**
* 비행ID[CNTRL_ID] 비행 상세정보를 조회하는 기능.
* @param cntrlId
* @return
* @throws Exception
*/
public AnlsHstryModel detail(String cntrlId) throws Exception{
AnlsHstryModel model = new AnlsHstryModel();
Optional<CtrCntrlBas> optional = ctrCntrlBasRepository.findById(cntrlId);
Optional<CtrCntrlBas> optional = ctrCntrlBasRepository.findById(cntrlId); //
if (!optional.isPresent()) {
// 데이터베이스에 조회하려는 데이터가 없을시 서버에서 파라미터가 없다는 "의도적인" 에러 반환
throw new CustomException(ErrorCode.DATA_NOTFIND);
}
CtrCntrlBas entity = optional.get();
// Entity에 담겨있는 값을 반환 model로 복제함
BeanUtils.copyProperties(entity , model);
@ -145,6 +154,11 @@ public class AnlsHstryService {
}
/**
* 비행이력을 비행ID[CNTRL_ID] 조회하는 기능.
* @param id
* @return
*/
public List<AnlsHstryDetailModel> hstryList(@PathVariable String id) {
List<AnlsHstryDetailModel> result = query.listCntrlHstryPage(id);

111
pav-server/src/main/java/com/palnet/biz/api/anls/smlt/controller/AnlsSmltController.java

@ -1,20 +1,5 @@
package com.palnet.biz.api.anls.smlt.controller;
import java.util.List;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryDetailModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryModel;
import com.palnet.biz.api.anls.hstry.model.AnlsHstryRqModel;
@ -28,8 +13,22 @@ import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.utils.JsonUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
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;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Log4j2
@RestController
@ -42,30 +41,38 @@ public class AnlsSmltController {
private final AnlsSmltService service;
/**
* 비행 현황 목록
* 비행현황 목록 리스트 조회하는 기능,
* AnlsHstryRqModel 따른 리스트를 조회함.
* @param rq
* @return
*/
@GetMapping(value = "/list")
@ApiOperation(value = "비행 현황 목록")
@Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API")
@Operation(summary = "비행 시뮬레이션 - 비행 현황 목록", description = "비행 시뮬레이션에서 비행 현황 목록을 조회하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> list(AnlsHstryRqModel rq) {
ComnPagingRs<AnlsHstryModel> result = null;
log.debug("JSON>>>>>>>>" , JsonUtils.toJson(rq));
log.debug("Param" + rq.getStDate() + "::" + rq.getEndDate());
//입력값 검증
// 검색 시작일 날짜[stDate], 검색 끝일 날짜 날짜값[endDate], 날짜값이 10자리인지 확인[정해진 포맷팅인지 확인하는 것] 입력값 검증처리
if(rq.getStDate() == null || !(rq.getStDate().length() == 10) || rq.getEndDate() ==null || !(rq.getEndDate().length() == 10) ) {
return ResponseEntity.status(HttpStatus.OK)
// 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
result = service.list(rq);
result = service.list(rq); // 비행현황 목록 조회하는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -77,22 +84,29 @@ public class AnlsSmltController {
/**
* 비행 이력 데이터 조회
* 비행 이력 데이터 조회하는 기능,061fbd9d-25c5-4801-bb11-2307a8eb8d8f
* 비행ID[CNTRL_ID] 조회함
* @param rq
* @return
*/
@GetMapping(value = "/hist/{id}")
@ApiOperation(value = "비행 이력 데이터 조회")
@Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> histList(@PathVariable String id) {
@Operation(summary = "비행 시뮬레이션 - 비행 이력 데이터 조회", description = "비행 시뮬레이션에서 비행 이력 데이터를 조회하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> histList(
@Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f") @PathVariable String id) {
List<AnlsHstryDetailModel> result = null;
try {
// result = service.list(rq);
result = service.histList(id);
result = service.histList(id); // 비행ID[CNTRL_ID]로 비행이력을 조회하는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -104,23 +118,30 @@ public class AnlsSmltController {
/**
* 통계 데이터 조회
* 통계 데이터 조회,
* 비행ID[CNTRL_ID] 조회함
* @param rq
* @return
*/
@GetMapping(value = "/stcs/{id}")
@ApiOperation(value = "통계 데이터 조회")
@Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> stcsList(@PathVariable String id) {
@Operation(summary = "비행 시뮬레이션 - 비행 이력 통계 데이터 조회", description = "비행 시뮬레이션에서 비행 이력 통계 데이터 조회하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> stcsList(
@Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f") @PathVariable String id) {
List<AnlsSmltStcsModel> result = null;
try {
result = service.stcsList(id);
result = service.stcsList(id); // 통계 데이터 조회하는 기능
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -131,21 +152,31 @@ public class AnlsSmltController {
}
/**
* 비행 상세정보 조회
* 비행 상세정보 조회,
* 비행ID[CNTRL_ID] 조회함
* @param id
* @return
*/
@GetMapping(value = "/detail/{id}")
@ApiOperation(value = "비행 상세정보 조회")
@Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API")
@ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> detail(@PathVariable String id) {
// @ApiOperation(value = "비행 상세정보 조회")
// @Tag(name = "비행 시뮬레이션", description = "비행 이력 시뮬레이션 관련 API")
// @ApiImplicitParam(name = "id",value = "관제ID", dataTypeClass = String.class)
@Operation(summary = "비행 시뮬레이션 - 비행 상세 정보 조회", description = "비행 시뮬레이션에서 비행 상세 정보 데이터를 조회하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> detail(
@Parameter(name="id", description = "개체 비행 ID", in = ParameterIn.PATH, example = "061fbd9d-25c5-4801-bb11-2307a8eb8d8f")@PathVariable String id) {
AnlsSmltDetailModel result = null;
try {
result = service.detail(id);
result = service.detail(id); // 비행ID[CNTRL_ID]로 비행상세정보 조회함
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));

22
pav-server/src/main/java/com/palnet/biz/api/anls/smlt/service/AnlsSmltService.java

@ -61,7 +61,7 @@ public class AnlsSmltService {
/**
* 비행 현황 목록
* 비행현황 목록 조회하는 기능.
* @param rq
* @return
*/
@ -106,6 +106,7 @@ public class AnlsSmltService {
for(FltPlanPilot list : pilotList) {
pilotResult = fltPlanBasRepository.findBasList(list.getPlanSno());
}
result = query.cntrlBasNormalSmltList(rq, pageable, adminAuth, idntfList, basResult, pilotResult); // App 권한은 user이지만 group 권한이 LEADER / MASTER인 그룹이 있는 경우 해당 비행 이력 목록 표출
// group 권한이 Normal인 경우 본인이 작성한 비행계획서의 이력 / 본인이 조종사인 기체 이력/ 본인이 등록한 기체 이력 표출
@ -122,30 +123,30 @@ public class AnlsSmltService {
}
/**
*
* @param rq비행 이력 데이터 조회
* 비행ID[CNTRL_ID] 비행이력을 조회하는 기능.
* @param rq
* @return
*/
public List<AnlsHstryDetailModel> histList(String id){
// 비행ID[CNTRL_ID]로 비행이력을 데이터베이스에서 조회함.
List<AnlsHstryDetailModel> resultList = query.listCntrlHstry(id);
//정렬 순서 뒤집기 처리
Collections.reverse(resultList);
// Collections.reverse(resultList);
return resultList;
}
/**
* 통계 데이터 조회
* 통계 데이터 조회하는 기능
* @param rq
* @return
*/
public List<AnlsSmltStcsModel> stcsList(String id){
List<AnlsSmltStcsModel> result = query.anlsSmltStcs(id);
List<AnlsSmltStcsModel> result = query.anlsSmltStcs(id); // 비행관제 ID[CNTRL_ID]로 데이터베이스에서 시뮬레이션 통계데이터를 조회함.
//통계 데이터 가공 처리
//소수점 자리 1자리로 컷트
@ -162,7 +163,8 @@ public class AnlsSmltService {
/**
* 비행 상세정보 조회
* 비행 상세정보 조회,
* 비행ID[CNTRL_ID] 조회함
* @param cntrlId
* @return
* @throws Exception
@ -172,7 +174,7 @@ public class AnlsSmltService {
AnlsSmltDetailModel result = new AnlsSmltDetailModel();
result = query.anlsSmltDetail(cntrlId);
result = query.anlsSmltDetail(cntrlId); // 비행ID[CNTRL_ID]로 데이터베이스에서 비행상세 정보 조회함
// Optional<CtrCntrlBas> optional = ctrCntrlBasRepository.findById(cntrlId);
//

249
pav-server/src/main/java/com/palnet/biz/api/bas/dron/controller/BasDronController.java

@ -1,9 +1,6 @@
package com.palnet.biz.api.bas.dron.controller;
import com.palnet.biz.api.bas.dron.model.BasDronModel;
import com.palnet.biz.api.bas.dron.model.BasDronRqModel;
import com.palnet.biz.api.bas.dron.model.BasIdntfModel;
import com.palnet.biz.api.bas.dron.model.BasIdntfRqModel;
import com.palnet.biz.api.bas.dron.model.*;
import com.palnet.biz.api.bas.dron.service.BasDronService;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.api.comn.response.BasicResponse;
@ -11,11 +8,13 @@ import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.exception.CustomException;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
@ -39,93 +38,114 @@ public class BasDronController {
/**
* 목록 조회
* 드론 목록 조회기능,
* BasDronRqModel에 조회할 조건 값들이 들어있음
* @param rq
* @return
*/
@GetMapping(value = "/list")
@ApiOperation(value = "드론 목록 조회")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
@Operation(summary = "드론목록 조회", description = "검색조건에 맞춰 드론목록을 조회합니다.")
public ResponseEntity<? extends BasicResponse> list(BasDronRqModel rq) {
ComnPagingRs<BasDronModel> result = null;
//입력값 검증
// 그룹아이디[groupId] 입력값 검증
if(StringUtils.isEmpty(rq.getGroupId())) {
return ResponseEntity.status(HttpStatus.OK)
// 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
result = service.list(rq);
result = service.list(rq); // 드론 목록을 조회하는 기능
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/**
* 식별정보 조회
* 식별정보 조회하는 기능,
* 기체 일련번호[arcrftSno] 조회함.
* @param rq
* @return
*/
@GetMapping(value = "/idntf/list/{id}")
@ApiOperation(value = "식별정보 조회")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
@ApiImplicitParam(name = "id",value = "기체일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> mylist(@PathVariable Integer id) {
List<BasIdntfModel> result = null;
@Operation(summary = "드론정보 조회", description = "드론[기체]일련번호로 식별장치를 조회합니다.")
public ResponseEntity<? extends BasicResponse> mylist(@Parameter(name="id", description = "기체일련번호", in = ParameterIn.PATH, example = "1") @PathVariable Integer id) {
BasIdntfModel result = null;
//입력값 검증
// 기체일련번호확인[id] 입력값 검증처리
if(StringUtils.isEmpty(id)) {
return ResponseEntity.status(HttpStatus.OK)
// 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
result = service.listIdntf(id);
result = service.listIdntf(id); // 기체 일련번호로 기체조회함
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<List>(result));
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/**
* 상세 조회
* 드론 상세 조회,
* 기체일련번호[arcrftSno] 드론 상세조회하는 기능.
* @param id
* @return
*/
@GetMapping(value = "/detail/{id}")
@ApiOperation(value = "드론 상세 조회")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
@ApiImplicitParam(name = "id",value = "기체일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> detail(@PathVariable Integer id) {
@Operation(summary = "드론정보 상세조회", description = "기체일련번호로 드론상세 조회합니다.")
public ResponseEntity<? extends BasicResponse> detail(@Parameter(name="id", description = "기체일련번호", in = ParameterIn.PATH, example = "1") @PathVariable Integer id) {
BasDronModel result = null;
try {
//입력값 검증
// 기체일련번호확인[id] 입력값 검증처리
if(StringUtils.isEmpty(id)) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
// 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
result = service.detail(id);
result = service.detail(id); // 드론 상세 조회하는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -137,26 +157,48 @@ public class BasDronController {
/**
* 생성
* 드론정보 생성하는 기능,
* BasDronModel 모델에 드론 입력정보로 드론정보 생성함.
* @return
*/
@PostMapping(value = "/create")
@ApiOperation(value = "드론정보 생성")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
public ResponseEntity<? extends BasicResponse> create(@RequestBody BasDronModel rq) {
@Operation(summary = "드론정보 추가", description = "드론[기체] 정보를 추가합니다, 예시를 바꿔 추가할 수 있습니다.")
// @ApiOperation(value = "드론정보 생성")
// @Tag(name = "드론 컨트롤러", description = "드론 관련 API")
public ResponseEntity<? extends BasicResponse> create(@RequestBody BasDronInsertModel rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
BasDronModel basDronModel = new BasDronModel();
BeanUtils.copyProperties(rq, basDronModel);
log.warn("basDronModel => {}", basDronModel);
try {
boolean result = service.create(rq);
boolean result = service.create(basDronModel); // 드론 정보 생성하는 기능.
resultMap.put("result", result);
}catch(CustomException e2) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e2);
resultMap.put("result", false);
resultMap.put("errorCode", e2.getErrorCode());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -167,28 +209,43 @@ public class BasDronController {
}
/**
* 생성
* 식별장치 생성하는 기능,
* BasIdntfRqModel 모델에 입력받은 식별장치정보 생성함/
* @return
*/
@PostMapping(value = "/idntf/create")
@ApiOperation(value = "식별장치 생성")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
@Operation(summary = "드론식별장치정보 추가", description = "드론의 식별장치정보를 추가합니다, 예시를 바꿔 추가할 수 있습니다.")
public ResponseEntity<? extends BasicResponse> createIdntf(@RequestBody BasIdntfRqModel rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
// boolean result = service.create(rq);
boolean result = service.createIdntf(rq);
boolean result = service.createIdntf(rq); // 식밸장치 생성하는 기능.
resultMap.put("result", result);
}catch(CustomException e2) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e2);
resultMap.put("result", false);
resultMap.put("errorCode", e2.getErrorCode());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -199,27 +256,45 @@ public class BasDronController {
}
/**
* 수정
* 드론 정보 수정하는 기능,
* BasDronModel에 입력받은 수정할 정보를 데이터베이스에 수정함.
* @return
*/
@PutMapping(value = "/update")
@ApiOperation(value = "드론정보 수정")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasDronModel rq) {
@Operation(summary = "드론정보 수정", description = "드론[기체] 정보를 수정합니다, 예시를 바꿔 추가할 수 있습니다.")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasDronUpdateModel rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
BasDronModel basDronModel = new BasDronModel();
BeanUtils.copyProperties(rq, basDronModel);
try {
boolean result = service.update(rq);
boolean result = service.update(basDronModel); // 드론정보 수정하는 기능.
resultMap.put("result", result);
}
catch(CustomException e2) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e2);
resultMap.put("result", false);
resultMap.put("errorCode", e2.getErrorCode());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -230,15 +305,14 @@ public class BasDronController {
}
/**
* 삭제
* 드론정보 삭제하는 기능,
* 기체일련번호[arcrftSno] 삭제함
* @param id
* @return
*/
@DeleteMapping(value = "/delete/{id}")
@ApiOperation(value = "드론정보 삭제")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
@ApiImplicitParam(name = "id",value = "기체일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> delete(@PathVariable Integer id) {
@Operation(summary = "드론정보 삭제", description = "드론[기체] 정보를 삭제합니다. [예제값은 이미 삭제되어있을 수도 있으니 드론기체를 추가해서 삭제 테스트 진행해주세요.]")
public ResponseEntity<? extends BasicResponse> delete(@Parameter(name="id", description = "기체일련번호", in = ParameterIn.PATH, example = "6") @PathVariable Integer id) {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
@ -261,6 +335,44 @@ public class BasDronController {
}
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
/**
* 식별장치 수정
* @param id
* @return
*/
@PutMapping(value = "/idntf/update/{id}")
@Operation(summary = "드론식별장치 정보 수정", description = "드론[기체]식별장치 정보를 수정합니다. 실제로 존재하는 기체번호(idntfNum)의 소유자명과 핸드폰 번호를 수정합니다.")
public ResponseEntity<? extends BasicResponse> updateIdntf(@RequestBody BasIdntfUpdateModel rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
// 기체일련번호확인[id] 입력값 검증처리
if(StringUtils.isEmpty(rq.getIdntfNum())) {
// 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
boolean result = service.updateIdntf(rq); // 드론정보 수정하는 기능.
resultMap.put("result", result);
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
}
/**
@ -269,25 +381,30 @@ public class BasDronController {
* @return
*/
@DeleteMapping(value = "/idntf/delete/{id}")
@ApiOperation(value = "식별장치 삭제")
@Tag(name = "드론 컨트롤러", description = "드론 관련 API")
@ApiImplicitParam(name = "id",value = "식별번호", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> deleteIdntf(@PathVariable String id) {
@Operation(summary = "드론식별장치 삭제", description = "드론[기체]식별장치 정보를 삭제합니다. [예제값은 이미 삭제되어있을 수도 있으니 식별장치를 추가해서 삭제 테스트 진행해주세요.]")
public ResponseEntity<? extends BasicResponse> deleteIdntf(@Parameter(name="id", description = "기체식별장치 일련번호", in = ParameterIn.PATH, example = "PA0003")@PathVariable String id) {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
//입력값 검증
// 기체일련번호확인[id] 입력값 검증처리
if(StringUtils.isEmpty(id)) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
boolean result = service.deleteIdntf(id);
// 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
boolean result = service.deleteIdntf(id); // 드론정보 삭제하는 기능.
resultMap.put("result", result);
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));

46
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronInsertModel.java

@ -0,0 +1,46 @@
package com.palnet.biz.api.bas.dron.model;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import lombok.Data;
@Data
public class BasDronInsertModel {
@Schema(description = "그룹명", example = "KAC")
private String groupNm;
@Schema(description = "그룹아이디", example = "C807F9")
private String groupId;
@Schema(description = "제작번호", example = "PAV_KAC")
private String prdctNum;
@Schema(description = "기체모델명", example = "PAV_001")
private String arcrftModelNm;
@Schema(description = "기체종류코드 [01: 무인비행기, 02: 무인헬리콥터, 03: 멀티콥터, 04: 비행선]", example = "01")
private String arcrftTypeCd;
@Schema(description = "중량구분코드[-250G, 250G+2KG-, 2KG+7KG-, 25KG+]", example = "2KG+7KG-")
private String wghtTypeCd;
@Schema(description = "카메라 탑재 여부", example = "N")
private String cameraYn;
@Schema(description = "보험가입여부", example = "Y")
private String insrncYn;
@Schema(description = "제작자", example = "팔네트웍스")
private String prdctCmpnNm;
@Schema(description = "이미지 URL [업로드하는 이미지]", example = "PAV_KAC")
private String imageUrl;
@Schema(description = "등록사용자", example = "palnet")
private String createUserId;
@Schema(description = "수정한 사용자", example = "palnet")
private String updateUserId;
}

5
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronModel.java

@ -2,6 +2,9 @@ package com.palnet.biz.api.bas.dron.model;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.palnet.biz.config.convert.InstantDateStrSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import lombok.Data;
import java.time.Instant;
@ -26,7 +29,7 @@ public class BasDronModel {
private double arcrftWdth;
private double arcrftWght;
private String cameraYn;
private Instant createDt;

11
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronRqModel.java

@ -2,6 +2,8 @@ package com.palnet.biz.api.bas.dron.model;
import com.palnet.biz.api.comn.model.ComnPagingModel;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -9,15 +11,18 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper=false)
public class BasDronRqModel extends ComnPagingModel {
@Schema(description = "그룹아이디" , example = "C807F9", requiredMode = RequiredMode.REQUIRED)
private String groupId;
@Schema(description = "기체모델명" , example = "PAV_001", requiredMode = RequiredMode.NOT_REQUIRED)
private String arcrftModelNm;
@Schema(description = "기체종류코드" , example = "01", requiredMode = RequiredMode.NOT_REQUIRED)
private String arcrftTypeCd;
@Schema(description = "기체식별번호" , example = "PA0001", hidden = true)
private String idntfNum;
private String ownerNm;
@Schema(description = "소유자 명" , example = "팔네트웍스", hidden = true)
private String ownerNm;
}

45
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronUpdateModel.java

@ -0,0 +1,45 @@
package com.palnet.biz.api.bas.dron.model;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import lombok.Data;
@Data
public class BasDronUpdateModel {
@Schema(description = "그룹명", example = "KAC", implementation = String.class)
private String groupNm;
@Schema(description = "그룹아이디", example = "C807F9", implementation = String.class)
private String groupId;
@Schema(description = "제작번호", example = "PAV_KAC", implementation = String.class)
private String prdctNum;
@Schema(description = "기체모델명", example = "PAV_001", implementation = String.class)
private String arcrftModelNm;
@Schema(description = "기체종류코드 [01: 무인비행기, 02: 무인헬리콥터, 03: 멀티콥터, 04: 비행선]", example = "01", implementation = String.class)
private String arcrftTypeCd;
@Schema(description = "중량구분코드[-250G, 250G+2KG-, 2KG+7KG-, 25KG+]", example = "2KG+7KG-")
private String wghtTypeCd;
@Schema(description = "카메라 탑재 여부", example = "N", implementation = String.class)
private String cameraYn;
@Schema(description = "보험가입여부", example = "Y", implementation = String.class)
private String insrncYn;
@Schema(description = "제작자", example = "팔네트웍스", implementation = String.class)
private String prdctCmpnNm;
@Schema(description = "이미지 URL [업로드하는 이미지]", example = "PAV_KAC", implementation = String.class)
private String imageUrl;
@Schema(description = "기체일련번호", example = "6", requiredMode = RequiredMode.REQUIRED, implementation = Integer.class)
private Integer arcrftSno;
@Schema(description = "수정한 사용자", example = "palnet", implementation = String.class)
private String updateUserId;
}

21
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfModel.java

@ -4,28 +4,43 @@ import lombok.Data;
import java.time.Instant;
import io.swagger.v3.oas.annotations.media.Schema;
@Data
public class BasIdntfModel {
//식별 번호 정보
//식별 번호 정보
@Schema(hidden = true)
private String id;
@Schema(description = "식별장치 고유명", example = "PA0003")
private String idntfNum;
@Schema(hidden = true)
private String isSave;
@Schema(hidden = true)
private int arcrftSno;
@Schema(description = "식별장치종류코드", example = "DRON")
private String idntfTypeCd;
@Schema(description = "소유자명", example = "팔네트웍스")
private String ownerNm;
@Schema(description = "소유자 휴대폰번호", example = "01044322231")
private String hpno;
@Schema(hidden = true)
private Instant updateDt;
@Schema(hidden = true)
private Instant createDt;
@Schema(hidden = true)
private int cstmrSno;
@Schema(hidden = true)
private String groupId;
}

4
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfRqModel.java

@ -1,14 +1,18 @@
package com.palnet.biz.api.bas.dron.model;
import java.util.ArrayList;
import java.util.List;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BasIdntfRqModel {
@Schema(description = "기체 식별정보들", implementation = BasIdntfModel.class)
private List<BasIdntfModel> data;
@Schema(description = "기체일련번호", example = "6")
private int arcrftSno;
}

17
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfUpdateModel.java

@ -0,0 +1,17 @@
package com.palnet.biz.api.bas.dron.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BasIdntfUpdateModel {
@Schema(description = "기체 식별번호", example = "PA0001")
private String idntfNum;
@Schema(description = "변경할 소유자명", example = "수정소유자명")
private String ownerNm;
@Schema(description = "변경할 핸드폰 번호", example = "01036907198")
private String hpno;
}

87
pav-server/src/main/java/com/palnet/biz/api/bas/dron/service/BasDronService.java

@ -1,6 +1,8 @@
package com.palnet.biz.api.bas.dron.service;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.List;
import java.util.Optional;
@ -18,6 +20,7 @@ import com.palnet.biz.api.bas.dron.model.BasDronModel;
import com.palnet.biz.api.bas.dron.model.BasDronRqModel;
import com.palnet.biz.api.bas.dron.model.BasIdntfModel;
import com.palnet.biz.api.bas.dron.model.BasIdntfRqModel;
import com.palnet.biz.api.bas.dron.model.BasIdntfUpdateModel;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.jpa.entity.ComArcrftBas;
import com.palnet.biz.jpa.entity.ComIdntfBas;
@ -48,7 +51,7 @@ public class BasDronService {
private JwtTokenUtil jwtTokenUtil;
/**
* 드론 목록
* 드론 목록 조회하는 기능
* @param rq
* @return
*/
@ -56,10 +59,13 @@ public class BasDronService {
ComnPagingRs<BasDronModel> response = new ComnPagingRs<>();
// 페이징 처리를 위한 객체
Pageable pageable = PageRequest.of(rq.getPage()-1, rq.getRecord());
// 데이터 베이스에서 검색조건에 맞는 값으로 드론목록 조회함.
PageImpl<BasDronModel> result = query.list(rq, pageable);
// 데이터 베이스에서 전체 리스트 값이 몇인지 조회.
long total = query.listCount(rq);
long totalPage = total % rq.getRecord() > 0 ? (total/rq.getRecord()) + 1 : total/rq.getRecord();
@ -78,21 +84,21 @@ public class BasDronService {
* @param arcrftSno
* @return
*/
public List<BasIdntfModel> listIdntf(int arcrftSno){
public BasIdntfModel listIdntf(int arcrftSno){
List<BasIdntfModel> resultList = query.idntfList(arcrftSno);
BasIdntfModel result = query.idntfList(arcrftSno);
for(BasIdntfModel model : resultList){
if(model.getHpno() != null && !model.getHpno().isEmpty()){
model.setHpno(EncryptUtils.decrypt(model.getHpno()));
if(result != null) {
if(result.getHpno() != null && !result.getHpno().isEmpty()){
result.setHpno(EncryptUtils.decrypt(result.getHpno()));
}
}
return resultList;
return result;
}
/**
* 상세 조회
* 드론 상세 조회하는 기능.
* @param arcrftSno
* @return
* @throws Exception
@ -110,7 +116,7 @@ public class BasDronService {
}
/**
* 생성
* 드론 정보 생성하는 기능.
* @param
* @return
* @throws Exception
@ -168,7 +174,7 @@ public class BasDronService {
}
/**
* 식밸장치 생성
* 식밸장치 생성하는 기능.
* @param
* @return
* @throws Exception
@ -206,6 +212,47 @@ public class BasDronService {
}
/**
* 드론정보 수정하는 기능.
* @param idntfNum
* @return
*/
public boolean updateIdntf(BasIdntfUpdateModel rq) {
Optional<ComIdntfBas> optional = comIdntBasRepository.findById(rq.getIdntfNum());
if (!optional.isPresent()) {
throw new CustomException(ErrorCode.DATA_NOTFIND);
}
String hpno = "";
ComIdntfBas entity = optional.get();
if(rq.getHpno() != null && rq.getHpno() != "") {
hpno = EncryptUtils.encrypt(rq.getHpno());
entity.setHpno(hpno);
}
if(rq.getOwnerNm() != null && rq.getOwnerNm() != "") {
entity.setOwnerNm(rq.getOwnerNm());
}
ZoneId koreaZoneId = ZoneId.of("Asia/Seoul");
ZonedDateTime koreaTime = ZonedDateTime.ofInstant(Instant.now(), koreaZoneId);
entity.setUpdateDt(koreaTime.toInstant());
comIdntBasRepository.save(entity);
return true;
}
/**
* 드론정보 삭제하는 기능.
* @param idntfNum
* @return
*/
public boolean deleteIdntf(String idntfNum) {
Optional<ComIdntfBas> optional = comIdntBasRepository.findById(idntfNum);
@ -218,7 +265,13 @@ public class BasDronService {
return true;
}
/**
* 입력받은 드론정보 데이터베이스에 생성함.
* @param model
* @return
* @throws Exception
*/
public ComArcrftBas insertComArcrftBas(BasDronModel model) throws Exception{
@ -261,7 +314,7 @@ public class BasDronService {
/**
* 수정
* 드론정보 수정하는 기능.
* @param
* @return
* @throws Exception
@ -319,7 +372,13 @@ public class BasDronService {
return true;
}
/**
* 입력받은 드론 수정정보로 데이터베이스에 수정함.
* @param model
* @return
* @throws Exception
*/
public ComArcrftBas updateComArcrftBas(BasDronModel model) throws Exception{

398
pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java

@ -1,51 +1,6 @@
package com.palnet.biz.api.bas.flight.controller;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.MultiPoint;
import org.locationtech.jts.geom.Point;
import org.locationtech.jts.geom.Polygon;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.bas.flight.model.BasFlightAprovRq;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanArcrftModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaModel;
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.bas.flight.model.BasFlightWeatherModel;
import com.palnet.biz.api.bas.flight.model.*;
import com.palnet.biz.api.bas.flight.service.BasFlightService;
import com.palnet.biz.api.comn.file.service.ComnFileService;
import com.palnet.biz.api.comn.model.ComnPagingRs;
@ -55,20 +10,33 @@ import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.AreaUtils;
import com.palnet.comn.utils.FlightUtils;
import com.palnet.comn.utils.PdfUtils;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.locationtech.jts.geom.Coordinate;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.io.*;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@RequiredArgsConstructor
@RestController
@RequestMapping(value = "/api/bas/flight", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public class BasFlightController {
private final BasFlightService basFlightService;
@ -78,9 +46,15 @@ public class BasFlightController {
private final ComnFileService comnFileService;
private final PdfUtils pdfUtils;
/**
* 공역데이터 내려주는 기능.
* @return
* @throws IOException
* @throws ParseException
*/
@GetMapping("/area")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<Object> findAirSpace() throws IOException, ParseException {
// 1. file read
Resource resource = new ClassPathResource("air/airgeo.json");
InputStream jsonInputStream = resource.getInputStream();
@ -102,16 +76,28 @@ public class BasFlightController {
return ResponseEntity.ok().body(airArea);
}
// 비행계획서 조회
/**
* 비행계획서 조회하는 기능,
* BasFlightPlanListRq 모델에 조건값에 따라 조회함.
* @param rq
* @return
*/
@GetMapping(value = "/plan/list")
@ApiOperation(value = "비행계획서 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiOperation(value = "비행계획서 조회")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> findPlanList(BasFlightPlanListRq rq) {
ComnPagingRs<BasFlightPlanModel> result = null;
log.debug(">>> rq : {}", rq);
try {
result = basFlightService.listPlan(rq);
result = basFlightService.listPlan(rq); // 비행계획서 조회하는 기능
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -120,16 +106,28 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
// 비행계획서 상세 조회
/**
* 비행계획서 상세 조회기능,
* 비행계획서 번호[planSno] 상세조회
* @param planSno
* @return
*/
@GetMapping(value = "/plan/detail/{planSno}")
@ApiOperation(value = "비행계획서 상세 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class)
// @ApiOperation(value = "비행계획서 상세 조회")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> detailPlan(@PathVariable("planSno") Integer planSno) {
BasFlightPlanModel result = null;
try {
result = basFlightService.detailPlan(planSno);
result = basFlightService.detailPlan(planSno); // 비행계획서 고유번호[planSno]로 상세 조회하는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -138,25 +136,46 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
// 비행계획서 등록
/**
* 비행계획서 등록하는 기능,
* BasFlightPlanModel모델에 입력받은값으로 등록함.
* @param rq
* @return
*/
@PostMapping(value = "/plan/create")
@ApiOperation(value = "비행계획서 등록")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiOperation(value = "비행계획서 등록")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> createPlan(@RequestBody BasFlightPlanModel rq) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
log.error(">>> rq : {}", rq);
boolean result = basFlightService.createPlan(rq);
boolean result = basFlightService.createPlan(rq); // 입력받은 값으로 비행계획서 등록하는 기능.
resultMap.put("result", result);
log.info(">>> resultMap : " , resultMap);
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -165,23 +184,43 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
// 비행계획서 수정
/**
* 비행계획서 수정하는 기능,
* BasFlightPlanModel 모델에 입력받은 값으로 수정함
* @param rq
* @return
*/
@PutMapping(value = "/plan/update")
@ApiOperation(value = "비행계획서 수정")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiOperation(value = "비행계획서 수정")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> updatePlan(@RequestBody BasFlightPlanModel rq) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
boolean result = basFlightService.updatePlan(rq);
boolean result = basFlightService.updatePlan(rq); // 입력받은 값으로 비행계획서 수정하는 기능.
resultMap.put("result", result);
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -190,23 +229,43 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
// 비행계획서 삭제
/**
* 비행계획서 삭제하는 기능,
* 비행계획서 고유번호[planSno] 삭제함.
* @param planSno
* @return
*/
@DeleteMapping(value = "/plan/delete/{planSno}")
@ApiOperation(value = "비행계획서 삭제")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class)
// @ApiOperation(value = "비행계획서 삭제")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> deletePlan(@PathVariable("planSno") Integer planSno) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
boolean result = basFlightService.deletePlan(planSno);
boolean result = basFlightService.deletePlan(planSno); // 비행계획서 고유번호[planSno]로 비행계획서 삭제하는 기능.
resultMap.put("result", result);
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -215,17 +274,29 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
}
// 그룹 조종사 조회
/**
* 그룹 조종사 조회하는 기능
* 그룹아이디[groupId] 조회함.
* @param groupId
* @return
*/
@GetMapping(value = "/plan/pilot/{groupId}")
@ApiOperation(value = "그룹의 조종사 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class)
// @ApiOperation(value = "그룹의 조종사 조회")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> findPilot(@PathVariable("groupId") String groupId) {
List<BasFlightPlanPilotModel> result = null;
try {
result = basFlightService.listPilotByGroup(groupId);
result = basFlightService.listPilotByGroup(groupId); // 그룹아이디[groupId]로 그룹 조종사 조회하는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -235,16 +306,28 @@ public class BasFlightController {
}
// 그룹 기체 조회
/**
* 그룹 기체 조회하는 기능,
* 그룹아이디[groupId] 조회함.
* @param groupId
* @return
*/
@GetMapping(value = "/plan/arcrft/{groupId}")
@ApiOperation(value = "그룹의 기체 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class)
// @ApiOperation(value = "그룹의 기체 조회")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> findArcrft(@PathVariable("groupId") String groupId) {
List<BasFlightPlanArcrftModel> result = null;
try {
result = basFlightService.listArcrftByGroup(groupId);
result = basFlightService.listArcrftByGroup(groupId); // 그룹아이디[groupId]로 그룹 기체 조회하는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -254,15 +337,26 @@ public class BasFlightController {
}
// 비행 구역 버퍼 존 생성
/**
* 비행 구역 버퍼 생성하는 기능
* @param rq
* @return
*/
@PostMapping("/plan/area/buffer")
@ApiOperation(value = "비행 구역 버퍼 존 생성")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiOperation(value = "비행 구역 버퍼 존 생성")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> findBuffer(@RequestBody List<BasFlightPlanAreaModel> rq) {
List<BasFlightPlanAreaModel> rs = null;
try {
rs = basFlightService.getBuffer(rq);
rs = basFlightService.getBuffer(rq); // 비행 구역 buffer zone 생성하는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -271,15 +365,27 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
/**
* 비행계획서 날씨 확인하는 기능.
* @param rq
* @return
*/
@GetMapping("/plan/api/weather")
@ApiOperation(value = "비행계획서 날씨")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiOperation(value = "비행계획서 날씨")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> restApiGetWeather(BasFlightWeatherModel rq) {
JSONObject jsonObject = null;
try {
jsonObject = basFlightService.getWeather(rq);
jsonObject = basFlightService.getWeather(rq); // 지역과 날씨에 대한 정보를 얻는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -289,15 +395,27 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(jsonObject));
}
// 비행계획서 리스트(승인)
/**
* 비행계획서 리스트(승인) 조회하는 기능,
* 입력받은 값으로 승인관련된 비행계획서 리스트를 조회함.
* @param rq
* @return
*/
@GetMapping(value = "/aprv/list")
@ApiOperation(value = "비행계획서 리스트(승인)")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiOperation(value = "비행계획서 리스트(승인)")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> findAprvList(BasFlightPlanListRq rq) {
ComnPagingRs<BasFlightPlanModel> result = null;
try {
result = basFlightService.aprvList(rq);
result = basFlightService.aprvList(rq); // 비행계획서 리스트(승인)를 조회하는 기능
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -306,22 +424,42 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
// 비행계획서 승인/미승인
/**
* 비행계획서 승인/미승인 하는 기능,
* BasFlightAprovRq에 있는 값을 토대로 승인/미승인 .
* @param rq
* @return
*/
@PutMapping(value = "/aprv/proc")
@ApiOperation(value = "비행 계획서 승인/미승인")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiOperation(value = "비행 계획서 승인/미승인")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> updateAprvProc(@RequestBody BasFlightAprovRq rq) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
int result = basFlightService.aprovePlan(rq);
int result = basFlightService.aprovePlan(rq); // 비행계획서 승인/미승인하는 기능.
resultMap.put("result", result);
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -331,15 +469,27 @@ public class BasFlightController {
}
/**
* 비행경로 체크하는 기능.
* @param rq
* @return
*/
@PostMapping("/airspace/contains")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> checkAirspaceContains(@RequestBody List<BasFlightPlanAreaModel> rq) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
boolean result = basFlightService.checkAirspaceContains(rq);
boolean result = basFlightService.checkAirspaceContains(rq); // 비행경로 체크하는 기능.
resultMap.put("result", result);
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -349,15 +499,21 @@ public class BasFlightController {
}
//지역 검색
/**
* 지역 검색하는 기능.
* @param query
* @return
* @throws ParseException
*/
@GetMapping("/plan/area/search")
@ApiOperation(value = "지역 검색")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @ApiOperation(value = "지역 검색")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> searchArea(String query) throws ParseException {
String text = null;
try {
text = URLEncoder.encode(query, "UTF-8");
} catch (UnsupportedEncodingException e) {
// UTF-8 포맷팅으로 인코딩 실패시 에러 던짐
throw new RuntimeException("검색어 인코딩 실패", e);
}
@ -373,16 +529,29 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(obj));
}
/**
* 비행계획서 스케줄 검색하는 기능,
* 검색일[searchDate] 조건으로 조회함.
* @param searchDate
* @return
*/
@GetMapping("/schedule")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
// @Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> findSchedule(@RequestParam("searchDate") String searchDate) {
List<BasFlightScheduleRs> response;
try {
response = basFlightService.findSchecdule(searchDate);
response = basFlightService.findSchecdule(searchDate); // 검색날짜 조건으로 비행스케줄 조회하는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -391,10 +560,15 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<List>(response));
}
// @PostMapping("/coord")
// public JSONObject coordTest(@RequestBody Coordinate coordinate) throws IOException, ParseException {
//
// return FlightUtils.getCoordinateGis(coordinate);
//
// }
@PostMapping("/adex/buffer")
public List<Coordinate> adexBuffer(@RequestBody BasFlightCoordModel model) {
List<Coordinate> transCoordList = utils.transform(model.getCoordinates(), "EPSG:4326", "EPSG:5181");
List<Coordinate> bufferList = utils.buffer(transCoordList, model.getBuffer()); // buffer 영역 생성
List<Coordinate> transBufferList = utils.transform(bufferList, "EPSG:5181", "EPSG:4326"); // buffer 영역 좌표계 변환
return transBufferList;
}
}

15
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightCoordModel.java

@ -0,0 +1,15 @@
package com.palnet.biz.api.bas.flight.model;
import java.util.List;
import org.locationtech.jts.geom.Coordinate;
import lombok.Data;
@Data
public class BasFlightCoordModel {
private List<Coordinate> coordinates;
private Double buffer;
}

20
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java

@ -1,6 +1,5 @@
package com.palnet.biz.api.bas.flight.model;
import com.palnet.biz.jpa.entity.type.FltMethod;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -32,22 +31,5 @@ public class BasFlightPlanAreaModel {
// kac 추가 필드
private String fltMothoeRm;
// public BasFlightPlanAreaModel(Integer planAreaSno, Integer planSno, String areaType, FltMethod fltMethod, String fltAreaAddr, Integer bufferZone, String fltElev, String createUserId, Instant createDt, String updateUserId, Instant updateDt, String docState, List<BasFlightPlanAreaCoordModel> coordList, List<BasFlightPlanAreaCoordModel> bufferCoordList, String fltMothoeRm) {
// this.planAreaSno = planAreaSno;
// this.planSno = planSno;
// this.areaType = areaType;
// this.fltMethod = fltMethod.getCode();
// this.fltMethodNm = fltMethod.getValue();
// this.fltAreaAddr = fltAreaAddr;
// this.bufferZone = bufferZone;
// this.fltElev = fltElev;
// this.createUserId = createUserId;
// this.createDt = createDt;
// this.updateUserId = updateUserId;
// this.updateDt = updateDt;
// this.docState = docState;
// this.coordList = coordList;
// this.bufferCoordList = bufferCoordList;
// this.fltMothoeRm = fltMothoeRm;
// }
}

103
pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java

@ -73,7 +73,11 @@ public class BasFlightService {
private final AreaUtils areaUtils;
// 비행계획서 조회
/**
* 비행계획서 조회하는 기능
* @param rq
* @return
*/
public ComnPagingRs<BasFlightPlanModel> listPlan(BasFlightPlanListRq rq) {
List<BasGroupJoinModel> groupList = ptyPlanQueryRepository.joinList(rq.getCstmrSno());
String userAccount = null;
@ -97,8 +101,11 @@ public class BasFlightService {
} else {
masterAccount = "NORMAL";
}
// 데이터베이스에서 조건에 따라 비행계획서를 조회함.
PageImpl<BasFlightPlanModel> result = fltPlanQueryRepository.listPlan(rq, masterAccount, pageable);
// 데이터베이스에서 조건에 따라 비행계획서를 조회하고 그 사이즈를 가져옴.
long total = fltPlanQueryRepository.listPlanCount(rq, masterAccount);
long totalPage = total % rq.getRecord() > 0 ? (total / rq.getRecord()) + 1 : total / rq.getRecord();
@ -111,7 +118,11 @@ public class BasFlightService {
return response;
}
// 비행계획서 상세 조회
/**
* 비행계획서 고유번호[planSno] 상세 조회하는 기능.
* @param planSno
* @return
*/
public BasFlightPlanModel detailPlan(Integer planSno) {
BasFlightPlanModel rs = new BasFlightPlanModel();
// 비행계획서
@ -155,6 +166,10 @@ public class BasFlightService {
return rs;
}
/**
* 비행계획서 유효하는지 확인하는 기능.
* @param rq
*/
public void planValid(BasFlightPlanModel rq) {
boolean isEqualsFltElev = false;
@ -269,7 +284,11 @@ public class BasFlightService {
}
}
// 비행계획서 등록
/**
* 입력받은 값으로 비행계획서 등록하는 기능.
* @param rq
* @return
*/
@Transactional
public boolean createPlan(BasFlightPlanModel rq) {
@ -335,7 +354,11 @@ public class BasFlightService {
return true;
}
// 비행계획서 수정
/**
* 입력받은 값으로 비행계획서 수정하는 기능.
* @param rq
* @return
*/
@Transactional
public boolean updatePlan(BasFlightPlanModel rq) {
@ -461,7 +484,11 @@ public class BasFlightService {
return true;
}
// 비행계획서 삭제
/**
* 비행계획서 고유번호[planSno] 비행계획서 삭제하는 기능.
* @param planSno
* @return
*/
@Transactional
public boolean deletePlan(Integer planSno) {
FltPlanBas planEntity = fltPlanBasRepository.findById(planSno).orElseThrow();
@ -471,7 +498,11 @@ public class BasFlightService {
}
// 그룹 조종사 조회
/**
* 그룹아이디[groupId] 그룹 조종사 조회하는 기능.
* @param groupId
* @return
*/
public List<BasFlightPlanPilotModel> listPilotByGroup(String groupId) {
List<BasFlightPlanPilotModel> pilotList = fltPlanQueryRepository.listPilot(groupId);
@ -493,7 +524,11 @@ public class BasFlightService {
return pilotList;
}
// 그룹 기체 조회
/**
* 그룹아이디[groupId] 그룹 기체 조회하는 기능.
* @param groupId
* @return
*/
public List<BasFlightPlanArcrftModel> listArcrftByGroup(String groupId) {
List<BasFlightPlanArcrftModel> arcrftModels = fltPlanQueryRepository.listArcrft(groupId);
@ -502,7 +537,11 @@ public class BasFlightService {
return arcrftModels;
}
// 비행 구역 buffer zone
/**
* 비행 구역 buffer zone 생성하는 기능.
* @param rq
* @return
*/
public List<BasFlightPlanAreaModel> getBuffer(List<BasFlightPlanAreaModel> rq) {
for (BasFlightPlanAreaModel area : rq) {
@ -523,7 +562,11 @@ public class BasFlightService {
return rq;
}
// 비행계획서 리스트(승인)
/**
* 비행계획서 리스트(승인) 조회하는 기능.
* @param rq
* @return
*/
public ComnPagingRs<BasFlightPlanModel> aprvList(BasFlightPlanListRq rq) {
String appAuth = jwtTokenUtil.getUserAuthByToken();
@ -544,6 +587,8 @@ public class BasFlightService {
}
}
}
// 유저의 권한을 확인하는 로직
if (appAuth.equals("SUPER") || appAuth.equals("ADMIN")) {
masterAccount = "ADMIN";
} else if (userAccount.equals("MASTER") || userAccount.equals("LEADER")) {
@ -551,9 +596,9 @@ public class BasFlightService {
} else {
masterAccount = "NORMAL";
}
PageImpl<BasFlightPlanModel> result = fltPlanQueryRepository.aprvList(rq, masterAccount, pageable);
PageImpl<BasFlightPlanModel> result = fltPlanQueryRepository.aprvList(rq, masterAccount, pageable); // 승인관련된 비행계획서를 조회하는 기능.
long total = fltPlanQueryRepository.aprvCount(rq, masterAccount);
long total = fltPlanQueryRepository.aprvCount(rq, masterAccount); // 승인관련된 비행계획서의 갯수를 조회하는 기능.
long totalPage = total % rq.getRecord() > 0 ? (total / rq.getRecord()) + 1 : total / rq.getRecord();
@ -565,13 +610,22 @@ public class BasFlightService {
return response;
}
// 비행계획서 승인/미승인
/**
* 비행계획서 승인/미승인하는 기능.
* @param rq
* @return
*/
@Transactional
public int aprovePlan(BasFlightAprovRq rq) {
int cnt = fltPlanBasRepository.updateAprvlYnByPlanSnoIn(rq.getPlanSnoList(), rq.getAprvlYn());
return cnt;
}
/**
* 비행경로 체크하는 기능.
* @param rq
* @return
*/
public boolean checkAirspaceContains(List<BasFlightPlanAreaModel> rq) {
boolean result = false;
@ -599,7 +653,12 @@ public class BasFlightService {
}
//지역 검색
/**
* 지역 검색하는 기능
* @param apiUrl
* @param requestHeaders
* @return
*/
public String searchArea(String apiUrl, Map<String, String> requestHeaders) {
HttpURLConnection con = connect(apiUrl);
try {
@ -649,6 +708,11 @@ public class BasFlightService {
}
}
/**
* 검색날짜 조건으로 비행스케줄 조회하는 기능.
* @param searchDate
* @return
*/
public List<BasFlightScheduleRs> findSchecdule(String searchDate) {
List<BasFlightScheduleRs> schedule = fltPlanQueryRepository.findSchedule(searchDate);
@ -656,8 +720,17 @@ public class BasFlightService {
return schedule;
}
/**
* 지역과 날씨에 대한 정보를 얻는 기능.
* @param rq
* @return
* @throws IOException
* @throws ParseException
*/
public JSONObject getWeather(BasFlightWeatherModel rq) throws IOException, ParseException {
StringBuilder urlBuilder = new StringBuilder(weatherUrl);
StringBuilder urlBuilder = new StringBuilder(weatherUrl); // weather.api.url[application.yml 파일] 에 있는 URL로 날씨 관련 요청을 보냄
urlBuilder.append("?" + URLEncoder.encode("serviceKey", "UTF-8") + weatherKey);
urlBuilder.append("&" + URLEncoder.encode("pageNo", "UTF-8") + "=" + URLEncoder.encode(rq.getPageNo(), "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("numOfRows", "UTF-8") + "=" + URLEncoder.encode(rq.getNumOfRows(), "UTF-8")); /*한 페이지 결과 수*/
@ -684,7 +757,7 @@ public class BasFlightService {
sb.append(line);
}
CtrTrnsLctnModel weatherResult = ctrTrnsLctnService.convertLatlonToAddress(rq.getNx2(), rq.getNy2());
CtrTrnsLctnModel weatherResult = ctrTrnsLctnService.convertLatlonToAddress(rq.getNx2(), rq.getNy2()); // 위치에 맞는 값에 대한 주소로 변환하는 기능.
log.info("weatherResult >>>> : {}", weatherResult);

53
pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupAprvController.java

@ -1,22 +1,8 @@
package com.palnet.biz.api.bas.group.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.bas.group.model.BasGroupAprvModel;
import com.palnet.biz.api.bas.group.model.BasGroupAprvRqModel;
import com.palnet.biz.api.bas.group.model.BasGroupAprvlUpdateRQ;
import com.palnet.biz.api.bas.group.service.BasGroupAprvService;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.api.comn.response.BasicResponse;
@ -24,16 +10,27 @@ import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
@Log4j2
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/bas/group/aprv", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "그룹 승인 컨트롤러", description = "그룹 가입 승인 관련 API")
@Tag(name = "그룹 승인", description = "그룹 가입 승인 관련 API")
public class BasGroupAprvController {
@Autowired
@ -45,8 +42,7 @@ public class BasGroupAprvController {
* @return
*/
@GetMapping(value = "/list")
@ApiOperation(value = "승인요청 조회")
@Tag(name = "그룹 승인 컨트롤러", description = "그룹 가입 승인 관련 API")
@Operation(summary = "승인요청 조회", description = "그룹내에 그룹회원들의 승인항목들을 조회합니다.")
public ResponseEntity<? extends BasicResponse> list(BasGroupAprvRqModel rq) {
ComnPagingRs<BasGroupAprvModel> result = null;
// log.debug(">>>>" + rq.toString());
@ -76,18 +72,25 @@ public class BasGroupAprvController {
* @return
*/
@PutMapping(value = "/update")
@ApiOperation(value = "승인처리 / 승인취소 처리")
@Tag(name = "그룹 승인 컨트롤러", description = "그룹 가입 승인 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupAprvModel rq) {
@Operation(summary = "승인처리", description = "그룹내에 그룹회원들의 승인처리를 진행합니다. [승인/미승인 처리]")
// @ApiOperation(value = "승인처리 / 승인취소 처리")
// @Tag(name = "그룹 승인 컨트롤러", description = "그룹 가입 승인 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupAprvlUpdateRQ rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
BasGroupAprvModel model = new BasGroupAprvModel();
BeanUtils.copyProperties(rq, model);
log.warn("model => {}", model);
if(StringUtils.isEmpty(rq.getCstmrGroupSno())) {
return ResponseEntity.status(HttpStatus.OK)
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
boolean result = service.update(rq);
boolean result = service.update(model);
resultMap.put("result", result);

233
pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupController.java

@ -1,61 +1,62 @@
package com.palnet.biz.api.bas.group.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.bas.group.model.BasGroupJoinModel;
import com.palnet.biz.api.bas.group.model.BasGroupModel;
import com.palnet.biz.api.bas.group.model.BasGroupRqModel;
import com.palnet.biz.api.bas.group.model.*;
import com.palnet.biz.api.bas.group.service.BasGroupService;
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.code.RSErrorCode;
import com.palnet.comn.exception.CustomException;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Log4j2
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/bas/group", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@Tag(name = "그룹", description = "그룹 관련 API")
public class BasGroupController {
@Autowired
private final BasGroupService service;
/**
* 그룹코드 생성
* @return
*/
@GetMapping(value = "/createid")
@ApiOperation(value = "그룹코드 생성")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@Operation(summary = "그룹코드 생성", description = "그룹코드를 랜덤으로 생성하는 기능입니다.")
public ResponseEntity<? extends BasicResponse> createid() {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
String result = service.createid();
String result = service.createid(); // 그룹코드를 생성하는 기능
resultMap.put("result", result);
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -66,30 +67,37 @@ public class BasGroupController {
}
/**
* 나의 그룹 목록 조회
* 내가 만든 그룹 목록조회하는 기능.
* 고객고유번호[cstmrSno] 내가 만든 그룹을 조회함.
* @param rq
* @return
*/
@GetMapping(value = "/mylist")
@ApiOperation(value = "나의 그룹 목록 조회")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> mylist(Integer cstmrSno) {
@Operation(summary = "내가 생성한 그룹조회", description = "내가 생성한 그룹을 조회하는 기능입니다.")
public ResponseEntity<? extends BasicResponse> mylist(@Parameter(name="cstmrSno", description = "회원일련번호", in = ParameterIn.QUERY, example = "2") Integer cstmrSno) {
List<BasGroupModel> result = null;
log.debug("Param : " + cstmrSno);
//입력값 검증
log.debug("Param : {}", cstmrSno);
// 고객고유번호[cstmrSno]값 입력값 검증처리
if(StringUtils.isEmpty(cstmrSno)) {
return ResponseEntity.status(HttpStatus.OK)
// 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
result = service.mylist(cstmrSno);
result = service.mylist(cstmrSno); // 나의 그룹 목록조회하는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -100,29 +108,36 @@ public class BasGroupController {
}
/**
* 나의 그룹 - 참여 그룹 목록 조회
* 나의 그룹 - 참여 그룹 목록 조회하는 기능,
* 고객고유번호[cstmrSno] 나의 그룹을 조회함.
* @param rq
* @return
*/
@GetMapping(value = "/joinlist")
@ApiOperation(value = "나의 그룹 - 참여 그룹 목록 조회")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> joinList(Integer cstmrSno) {
@Operation(summary = "내가 참여한 그룹조회", description = "내가 참여한 그룹을 조회하는 기능입니다.")
public ResponseEntity<? extends BasicResponse> joinList(@Parameter(name="cstmrSno", description = "회원일련번호", in = ParameterIn.QUERY, example = "2") Integer cstmrSno) {
List<BasGroupJoinModel> result = null;
//입력값 검증
// 고객고유번호[cstmrSno]값 입력값 검증처리
if(StringUtils.isEmpty(cstmrSno)) {
return ResponseEntity.status(HttpStatus.OK)
// 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
result = service.joinList(cstmrSno);
result = service.joinList(cstmrSno); // 나의 그룹 - 참여 그룹 목록을 조회하는 기능.
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -133,29 +148,35 @@ public class BasGroupController {
}
/**
* 그룹 목록 조회
* 그룹 목록 조회하는 기능
* @param rq
* @return
*/
@GetMapping(value = "/grouplist")
@ApiOperation(value = "그룹 목록 조회")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> grouplist(Integer cstmrSno) {
@Operation(summary = "그룹조회", description = "나와 관련된 모든 그룹을 조회하는 기능입니다.")
public ResponseEntity<? extends BasicResponse> grouplist(@Parameter(name="cstmrSno", description = "회원일련번호", in = ParameterIn.QUERY, example = "2") Integer cstmrSno) {
List<BasGroupJoinModel> result = null;
//입력값 검증
// 고객고유번호[cstmrSno]값 입력값 검증처리
if(StringUtils.isEmpty(cstmrSno)) {
return ResponseEntity.status(HttpStatus.OK)
// 검증통과하지 못할 시 서버에서 "의도적인" 에러 반환
return ResponseEntity.status(HttpStatus.OK) // "의도적인" 에러 반환코드
.body(new ErrorResponse(RSErrorCode.ER_PARAM));
}
try {
result = service.groupList(cstmrSno);
result = service.groupList(cstmrSno); // 그룹 목록조회하는 기능
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -166,21 +187,28 @@ public class BasGroupController {
}
/**
* 전체 그룹 목록 조회
* 전체 그룹 목록 조회하는 기능,
* BasGroupRqModel 모델 값에 따라 조회하는 기능.
* @param rq
* @return
*/
@GetMapping(value = "/list")
@ApiOperation(value = "전체 그룹 목록 조회")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@Operation(summary = "전체그룹 검색 조회", description = "검색조건에 맞춰 모든 그룹을 조회하는 기능입니다.")
public ResponseEntity<? extends BasicResponse> list(BasGroupRqModel rq) {
List<BasGroupModel> result = null;
try {
result = service.list(rq);
result = service.list(rq); // 전체 그룹 목록하는 기능
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -191,21 +219,27 @@ public class BasGroupController {
}
/**
* 그룹 상세 조회
* 그룹 상세 조회하는 기능,
* 그룹아이디[groupId] 조회함.
* @param id
* @return
*/
@GetMapping(value = "/detail/{id}")
@ApiOperation(value = "그룹 상세 조회")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@ApiImplicitParam(name = "id",value = "그룹ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> detail(@PathVariable String id) {
@Operation(summary = "그룹 상세조회", description = "그룹코드로 그룹에 대해 상세히 조회합니다.")
public ResponseEntity<? extends BasicResponse> detail(@Parameter(name="id", description = "그룹코드", in = ParameterIn.PATH, example = "C807F9") @PathVariable String id) {
BasGroupModel result = null;
try {
result = service.detail(id);
result = service.detail(id); // 그룹아이디[groupId]로 상세 조회하는 기능
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -217,22 +251,33 @@ public class BasGroupController {
/**
* 그룹 생성
* 그룹 생성하는 기능,
* BasGroupModel 모델에 입력받은 값으로 그룹 생성.
* @return
* @throws Exception
*/
@PostMapping(value = "/create")
@ApiOperation(value = "그룹 생성")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
public ResponseEntity<? extends BasicResponse> create(@RequestBody BasGroupModel rq) throws Exception {
@Operation(summary = "그룹 생성", description = "그룹을 생성합니다.")
public ResponseEntity<? extends BasicResponse> create(@RequestBody BasGroupInsertRQ rq) throws Exception {
Map<String , Object> resultMap = new HashMap<String,Object>();
BasGroupModel model = new BasGroupModel();
BeanUtils.copyProperties(rq, model);
try {
boolean result = service.create(rq);
boolean result = service.create(model); // 그룹 생성하는 기능
resultMap.put("result", result);
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
@ -244,19 +289,22 @@ public class BasGroupController {
}
/**
* 그룹 수정
* 그룹 수정하는 기능,
* BasGroupModel 모델에 입력받은 값으로 그룹 수정.
* @return
* @throws Exception
*/
@PutMapping(value = "/update")
@ApiOperation(value = "그룹 수정")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupModel rq) throws Exception {
@Operation(summary = "그룹 수정", description = "그룹의 내용을 수정합니다.")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupUpdateRQ rq) throws Exception {
Map<String , Object> resultMap = new HashMap<String,Object>();
BasGroupModel model = new BasGroupModel();
BeanUtils.copyProperties(rq, model);
try {
boolean result = service.update(rq);
boolean result = service.update(model); // 그룹 수정하는 기능
resultMap.put("result", result);
// } catch (Exception e) {
@ -266,6 +314,14 @@ public class BasGroupController {
//
// }
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
@ -277,23 +333,32 @@ public class BasGroupController {
}
/**
* 그룹 삭제
* 그룹 삭제하는 기능,
* 그룹아이디[groupId] 삭제함.
* @param id
* @return
*/
@DeleteMapping(value = "/delete/{id}")
@ApiOperation(value = "그룹 삭제")
@Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
@ApiImplicitParam(name = "id",value = "그룹ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> delete(@PathVariable String id) {
@Operation(summary = "그룹 삭제", description = "그룹의 내용을 삭제합니다.")
// @ApiOperation(value = "그룹 삭제")
// @Tag(name = "그룹 컨트롤러", description = "그룹 관련 API")
// @ApiImplicitParam(name = "id",value = "그룹ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> delete(@Parameter(name="id", description = "그룹코드", in = ParameterIn.PATH, example = "HDU123") @PathVariable String id) {
Map<String , Object> resultMap = new HashMap<String,Object>();
try {
boolean result = service.delete(id);
boolean result = service.delete(id); // 그룹아이디[groupId]로 삭제하는 기능
resultMap.put("result", result);
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));

68
pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupJoinController.java

@ -1,39 +1,37 @@
package com.palnet.biz.api.bas.group.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.bas.group.model.BasGroupJoinInsertRQ;
import com.palnet.biz.api.bas.group.model.BasGroupJoinModel;
import com.palnet.biz.api.bas.group.model.BasGroupJoinRqModel;
import com.palnet.biz.api.bas.group.model.BasGroupJoinUpdateRQ;
import com.palnet.biz.api.bas.group.service.BasGroupJoinService;
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.code.RSErrorCode;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
@Log4j2
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/bas/group/join", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "그룹 참여 컨트롤러", description = "그룹 참여 관련 API")
@Tag(name = "그룹 참여", description = "그룹 참여 관련 API")
public class BasGroupJoinController {
@Autowired
@ -41,8 +39,7 @@ public class BasGroupJoinController {
@GetMapping(value = "/list")
@ApiOperation(value = "참여한 그룹 목록 조회")
@Tag(name = "그룹 참여 컨트롤러", description = "그룹 참여 관련 API")
@Operation(summary = "내가 가입할 그룹목록 조회", description = "조건에 맞춰 참여할 그룹목록을 조회할 수 있습니다.")
public ResponseEntity<? extends BasicResponse> list(BasGroupJoinRqModel rq) {
List<BasGroupJoinModel> result = null;
@ -67,13 +64,16 @@ public class BasGroupJoinController {
@PostMapping(value = "/create")
@ApiOperation(value = "그룹 가입 요청")
@Tag(name = "그룹 참여 컨트롤러", description = "그룹 참여 관련 API")
public ResponseEntity<? extends BasicResponse> create(@RequestBody BasGroupJoinModel rq) {
@Operation(summary = "그룹 가입요청", description = "다른 그룹에 가입요청을 할 수 있습니다. [예제값은 이미 가입요청 되어있을 수도 있으니 다른 값으로 가입요청해주세요.]")
public ResponseEntity<? extends BasicResponse> create(@RequestBody BasGroupJoinInsertRQ rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
BasGroupJoinModel model = new BasGroupJoinModel();
BeanUtils.copyProperties(rq, model);
try {
boolean result = service.create(rq);
boolean result = service.create(model);
resultMap.put("result", result);
@ -88,10 +88,14 @@ public class BasGroupJoinController {
}
@PutMapping(value = "/update")
@ApiOperation(value = "그룹 가입 승인/미승인")
@Tag(name = "그룹 참여 컨트롤러", description = "그룹 참여 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupJoinModel rq) {
@Operation(summary = "가입한 그룹 상태값 변경", description = "가입한 그룹에서 상태값을 변경할 수 있습니다. [Y : 가입 , N : 탈퇴 ]")
// @ApiOperation(value = "그룹 가입 승인/미승인")
// @Tag(name = "그룹 참여 컨트롤러", description = "그룹 참여 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupJoinUpdateRQ rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
BasGroupJoinModel model = new BasGroupJoinModel();
BeanUtils.copyProperties(rq, model);
if(StringUtils.isEmpty(rq.getCstmrGroupSno())) {
return ResponseEntity.status(HttpStatus.OK)
@ -99,7 +103,7 @@ public class BasGroupJoinController {
}
try {
boolean result = service.update(rq);
boolean result = service.update(model);
resultMap.put("result", result);

67
pav-server/src/main/java/com/palnet/biz/api/bas/group/controller/BasGroupUserController.java

@ -1,22 +1,8 @@
package com.palnet.biz.api.bas.group.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.bas.group.model.BasGroupUserListModel;
import com.palnet.biz.api.bas.group.model.BasGroupUserModel;
import com.palnet.biz.api.bas.group.model.BasGroupUserUpdateRQ;
import com.palnet.biz.api.bas.group.service.BasGroupUserService;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.api.comn.response.BasicResponse;
@ -25,25 +11,34 @@ import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.exception.CustomException;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
@Log4j2
import org.springframework.beans.BeanUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/bas/group/user", produces = {MediaType.APPLICATION_JSON_VALUE})
@Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API")
@Tag(name = "그룹 사용자", description = "그룹 사용자 관련 API")
public class BasGroupUserController {
@Autowired
private final BasGroupUserService service;
@GetMapping(value = "/list")
@ApiOperation(value = "그룹 사용자 조회")
@Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API")
@Operation(summary = "그룹 참여자 조회", description = "검색조건에 맞춰 그룹 참여자를 조회합니다.")
public ResponseEntity<? extends BasicResponse> list(BasGroupUserListModel rq) {
ComnPagingRs<BasGroupUserModel> result = null;
@ -68,13 +63,15 @@ public class BasGroupUserController {
@PutMapping(value = "/update")
@ApiOperation(value = "그룹 사용자 권한 수정")
@Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupUserModel rq) {
@Operation(summary = "그룹 참여자 권한 수정", description = "그룹 참여자 권한을 수정합니다.")
public ResponseEntity<? extends BasicResponse> update(@RequestBody BasGroupUserUpdateRQ rq) {
Map<String , Object> resultMap = new HashMap<String,Object>();
BasGroupUserModel model = new BasGroupUserModel();
BeanUtils.copyProperties(rq, model);
try {
boolean result = service.update(rq);
boolean result = service.update(model);
resultMap.put("result", result);
@ -89,13 +86,17 @@ public class BasGroupUserController {
}
@PutMapping(value = "/delegate")
@ApiOperation(value = "MASTER 권한 위임")
@Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API")
public ResponseEntity<? extends BasicResponse> delegate(@RequestBody List<BasGroupUserModel> rq) {
@Operation(summary = "MASTER 권한 위임", description = "Master 권한을 위임합니다.")
// @ApiOperation(value = "MASTER 권한 위임")
// @Tag(name = "그룹 사용자 컨트롤러", description = "그룹 사용자 관련 API")
public ResponseEntity<? extends BasicResponse> delegate(@RequestBody List<BasGroupUserUpdateRQ> rq) {
Map<String, Object> resultMap = new HashMap<String, Object>();
List<BasGroupUserModel> model = new ArrayList<>();
BeanUtils.copyProperties(rq, model);
try {
boolean result = service.delegate(rq);
boolean result = service.delegate(model);
resultMap.put("result", result);
} catch (CustomException e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)

6
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupAprvRqModel.java

@ -2,6 +2,7 @@ package com.palnet.biz.api.bas.group.model;
import com.palnet.biz.api.comn.model.ComnRqModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -9,14 +10,19 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper=false)
public class BasGroupAprvRqModel extends ComnRqModel {
@Schema(description = "그룹명" , example = "KAC" , implementation = String.class)
private String groupNm;
@Schema(description = "회원이름[그룹내 회원명으로 검색해야합니다.]" , example = "한국공항공사" , implementation = String.class)
private String memberName;
@Schema(description = "승인여부" , example = "Y" , implementation = String.class)
private String aprvYn;
@Schema(description = "회원일련번호" , example = "2" , implementation = Integer.class)
private Integer cstmrSno;
@Schema(description = "그룹코드" , example = "C807F9" , implementation = String.class)
private String groupId;
}

24
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupAprvlUpdateRQ.java

@ -0,0 +1,24 @@
package com.palnet.biz.api.bas.group.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BasGroupAprvlUpdateRQ {
@Schema(description = "고객과 그룹 매핑한 일련번호" , example = "5" , implementation = String.class)
private Integer cstmrGroupSno;
@Schema(description = "현재 승인상태 여부[테스트시 해당유저가 승인되어있으면 Y 값으로 넣어주세요.]" , example = "Y" , implementation = String.class)
private String aprvlYn;
@Schema(description = "그룹내 권한코드" , example = "NORMAL" , implementation = String.class)
private String groupAuthCd;
@Schema(description = "승인자" , example = "palnet" , implementation = String.class)
private String aprvlUserId;
@Schema(description = "터미널ID" , example = "" , implementation = String.class)
private String trmnlId;
}

21
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupInsertRQ.java

@ -0,0 +1,21 @@
package com.palnet.biz.api.bas.group.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BasGroupInsertRQ {
@Schema(description = "그룹아이디[그룹생성시 랜덤으로 받는 아이디, 중복되면 생성이 되지 않음]", example = "HDU123", implementation = String.class)
private String groupId;
@Schema(description = "그룹명[중복되면 생성이 되지 않음]", example = "PAL_KAC_GROUP", implementation = String.class)
private String groupNm;
@Schema(description = "그룹구분코드", example = "02", implementation = String.class)
private String groupTypeCd;
@Schema(description = "회원고유번호", example = "2", implementation = String.class)
private int cstmrSno;
}

17
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinInsertRQ.java

@ -0,0 +1,17 @@
package com.palnet.biz.api.bas.group.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BasGroupJoinInsertRQ {
@Schema(description = "그룹코드", example = "HDU123", implementation = String.class)
private String groupId;
@Schema(description = "회원일련번호", example = "2", implementation = Integer.class)
private Integer cstmrSno;
@Schema(description = "그룹 내 권한코드", example = "", implementation = String.class)
private String groupAuthCd;
}

4
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinRqModel.java

@ -2,6 +2,7 @@ package com.palnet.biz.api.bas.group.model;
import com.palnet.biz.api.comn.model.ComnRqModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -9,10 +10,13 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper=false)
public class BasGroupJoinRqModel extends ComnRqModel{
@Schema(description = "그룹명", example = "PAL_KAC", implementation = String.class)
private String groupNm;
@Schema(description = "그룹코드", example = "HDU123", implementation = String.class)
private String groupId;
@Schema(description = "회원일련번호", example = "2", implementation = Integer.class)
private Integer cstmrSno;
}

14
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupJoinUpdateRQ.java

@ -0,0 +1,14 @@
package com.palnet.biz.api.bas.group.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BasGroupJoinUpdateRQ {
@Schema(description = "회원 그룹 매핑 일련번호", example = "14", implementation = String.class)
private Integer cstmrGroupSno;
@Schema(description = "그룹내 참여여부 상태값", example = "N", implementation = String.class)
private String joinYn;
}

3
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupRqModel.java

@ -2,6 +2,7 @@ package com.palnet.biz.api.bas.group.model;
import com.palnet.biz.api.comn.model.ComnRqModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -9,8 +10,10 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper=false)
public class BasGroupRqModel extends ComnRqModel{
@Schema(description = "그룹명", example = "KAC", implementation = String.class)
private String groupNm;
@Schema(description = "그룹아이디", example = "C807F9", implementation = String.class)
private String groupId;
}

19
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUpdateRQ.java

@ -0,0 +1,19 @@
package com.palnet.biz.api.bas.group.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BasGroupUpdateRQ {
@Schema(description = "그룹아이디[그룹생성시 랜덤으로 받는 아이디, 중복되면 생성이 되지 않음]", example = "HDU123", implementation = String.class)
private String groupId;
@Schema(description = "그룹명[중복되면 생성이 되지 않음]", example = "PAL_KAC_GROUP", implementation = String.class)
private String groupNm;
@Schema(description = "그룹구분코드", example = "02", implementation = String.class)
private String groupTypeCd;
}

8
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserListModel.java

@ -2,6 +2,7 @@ package com.palnet.biz.api.bas.group.model;
import com.palnet.biz.api.comn.model.ComnPagingModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -9,9 +10,12 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper=false)
public class BasGroupUserListModel extends ComnPagingModel{
@Schema(description = "그룹에 참여한 회원 명", example = "팔네트웍스", implementation = String.class)
private String memberName;
@Schema(description = "그룹아이디", example = "C807F9", implementation = String.class)
private String groupId;
private int cstmrSno;
@Schema(description = "회원고유번호", example = "2", implementation = String.class)
private Integer cstmrSno;
}

17
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupUserUpdateRQ.java

@ -0,0 +1,17 @@
package com.palnet.biz.api.bas.group.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BasGroupUserUpdateRQ {
@Schema(description = "회원 그룹 매핑 일련번호", example = "13", implementation = String.class)
private Integer cstmrGroupSno;
@Schema(description = "그룹 참여 여부", example = "Y", implementation = String.class)
private String joinYn;
@Schema(description = "그룹 내 권한코드", example = "LEADER", implementation = String.class)
private String groupAuthCd;
}

31
pav-server/src/main/java/com/palnet/biz/api/bas/group/service/BasGroupService.java

@ -42,7 +42,10 @@ public class BasGroupService {
@Autowired
private JwtTokenUtil jwtTokenUtil;
/**
* 그룹코드를 생성하는 기능.
* @return
*/
public String createid() {
String groupId = "";
@ -59,20 +62,19 @@ public class BasGroupService {
}
/**
* 나의 그룹 목록
* 내가 만든 그룹 목록조회하는 기능.
* @param cstmrSno
* @return
*/
public List<BasGroupModel> mylist(int cstmrSno){
public List<BasGroupModel> mylist(int cstmrSno){
List<BasGroupModel> resultList = query.mylist(cstmrSno);
List<BasGroupModel> resultList = query.mylist(cstmrSno); // 데이터베이스에서 cstmrSno에 맞춰 내가 만든 그룹을 조회하는 기능.
return resultList;
}
/**
* 그룹 목록
* 그룹 목록조회하는 기능.
* @param cstmrSno
* @return
*/
@ -81,7 +83,7 @@ public class BasGroupService {
String appAuth = jwtTokenUtil.getUserAuthByToken();
List<BasGroupJoinModel> resultList = new ArrayList<>();
if("SUPER".equals(appAuth)||"ADMIN".equals(appAuth)) {
resultList = query.groupAdminList(cstmrSno);
resultList = query.groupAdminList(cstmrSno); // Super, Admin권한으로 그룹을 조회하는 SQL 기능.
} else {
resultList = query.groupUserList(cstmrSno);
}
@ -90,7 +92,7 @@ public class BasGroupService {
}
/**
* 나의 그룹 - 참여 그룹 목록
* 나의 그룹 - 참여 그룹 목록 조회하는 기능.
* @param cstmrSno
* @return
*/
@ -102,20 +104,20 @@ public class BasGroupService {
}
/**
* 전체 그룹 목록
* 전체 그룹 목록하는 기능.
* @param rq
* @return
*/
public List<BasGroupModel> list(BasGroupRqModel rq){
List<BasGroupModel> resultList = query.list(rq);
List<BasGroupModel> resultList = query.list(rq); // 전체 그룹을 조회하는 SQL기능
return resultList;
}
/**
* 그룹 상세 조회
* 그룹아이디[groupId] 상세 조회하는 기능.
* @param groupId
* @return
* @throws Exception
@ -134,13 +136,12 @@ public class BasGroupService {
BeanUtils.copyProperties(entity , model);
return model;
}
/**
* 그룹 생성
* 그룹 생성하는 기능.
* @param rq
* @return
* @throws Exception
@ -188,7 +189,7 @@ public class BasGroupService {
}
/**
* 그룹 수정
* 그룹 수정하는 기능.
* @param rq
* @return
* @throws Exception
@ -222,7 +223,7 @@ public class BasGroupService {
}
/**
* 그룹 삭제
* 그룹아이디[groupId] 삭제하는 기능.
* @param groupId
* @return
* @throws Exception

45
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancAprvController.java

@ -3,11 +3,19 @@ package com.palnet.biz.api.bas.laanc.controller;
import com.palnet.biz.api.bas.laanc.model.BasLaancAprvListRq;
import com.palnet.biz.api.bas.laanc.model.BasLaancAprvRs;
import com.palnet.biz.api.bas.laanc.service.BasLaancAprvService;
import com.palnet.biz.api.cns.qna.model.QnaBasModel;
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.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -46,12 +54,13 @@ public class BasLaancAprvController {
/**
* laanc 승인 목록
*
* @param rq
* @param pageable
* @return
*/
@ApiOperation(value = "LAANC 승인 목록")
@Tag(name = "LAANC 승인", description = "LAANC 승인 관련 API")
@Deprecated
@Operation(summary = "LAANC 승인 목록", description = "LAANC 승인 목록")
@GetMapping("/list")
public ResponseEntity<? extends BasicResponse> getLaancAprvList(BasLaancAprvListRq rq, Pageable pageable) {
Page<BasLaancAprvRs> rs = null;
@ -73,14 +82,26 @@ public class BasLaancAprvController {
}
if(pageable == null) {
if (pageable == null) {
return ResponseEntity.ok().body(new SuccessResponse<>(rs.getContent()));
}
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
@ApiOperation(value = "LAANC 승인 목록")
@Tag(name = "LAANC 승인", description = "LAANC 승인 관련 API")
/**
* laanc 승인 목록
*
* @param rq
* @return
*/
@Operation(summary = "LAANC 승인 목록", description = "LAANC 승인 목록")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@Content(mediaType = "application/json",
schema = @Schema(implementation = SuccessResponse.class))
})
})
@GetMapping("/list2")
public ResponseEntity<? extends BasicResponse> getLaancAprvList2(BasLaancAprvListRq rq) {
List<BasLaancAprvRs> rs = null;
@ -107,11 +128,19 @@ public class BasLaancAprvController {
/**
* laanc 승인 상세
*
* @param planSno
* @return
*/
@ApiOperation(value = "LAANC 승인 상세 조회")
@Tag(name = "LAANC 승인", description = "LAANC 승인 관련 API")
@Operation(summary = "LAANC 승인 상세 조회", description = "LAANC 승인 상세 조회")
@Parameter(name = "planSno", description = "LAANC 승인 번호", required = true, example = "200")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@Content(mediaType = "application/json",
schema = @Schema(implementation = SuccessResponse.class))
})
})
@GetMapping("/detail/{planSno}")
public ResponseEntity<? extends BasicResponse> getLaancAprvDetail(@PathVariable("planSno") String planSno) {
BasLaancAprvRs rs = null;

142
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancController.java

@ -5,18 +5,19 @@ import com.palnet.biz.api.bas.laanc.service.BasLaancService;
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.external.model.PilotValidRs;
import com.palnet.comn.exception.CustomException;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
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.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
@ -42,10 +43,18 @@ public class BasLaancController {
private final BasLaancService basLaancService;
// LAANC 검증
/**
* LAANC 검증
* 로직(스텝) 변경으로 인하여 사용하지 않음.
* 해당 로직은 등록시 사용되는 service에서 사용함.
*
* @param rq
* @return
*/
@Deprecated
@Operation(summary = "LAANC 검증", description = "LAANC 검증", hidden = true)
@ApiResponse(responseCode = "200", description = "성공")
@PostMapping(value = "/plan/valid")
@ApiOperation(value = "LAANC 검증")
@Tag(name = "LAANC", description = "LAANC 관련 API")
public ResponseEntity<? extends BasicResponse> validationLaanc(@RequestBody BasLaancPlanRq rq) {
BasLaancValidatedRs rs = null;
@ -71,10 +80,15 @@ public class BasLaancController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
// 비행계획서 등록, 약관 등록, 공문 생성
/**
* LAANC 신청(비행계획서 등록, 약관 등록, 공문 생성)
*
* @param rq
* @return
*/
@Operation(summary = "LAANC 신청", description = "LAANC 신청(비행계획서 등록, 약관 등록, 공문 생성)")
@ApiResponse(responseCode = "200", description = "성공")
@PostMapping(value = "/plan/create")
@ApiOperation(value = "비행계획서 등록")
@Tag(name = "LAANC", description = "LAANC 관련 API")
public ResponseEntity<? extends BasicResponse> createPlan(@RequestBody BasLaancPlanRq rq) {
BasLaancLastRs rs = null;
try {
@ -95,11 +109,17 @@ public class BasLaancController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
// 허용고도 조회
/**
* 허용고도 조회
*
* @param rq
* @return
*/
@Operation(summary = "비행구역 허용고도 조회", description = "좌표에 해당하는 허용고도 조회")
@ApiResponse(responseCode = "200", description = "성공")
@PostMapping(value = "/valid/elev")
@ApiOperation(value = "비행구역 허용고도 조회")
@Tag(name = "LAANC", description = "LAANC 관련 API")
public ResponseEntity<? extends BasicResponse> getAllowableElevation(@RequestBody List<BasLaancAreaModel> rq) {
public ResponseEntity<? extends BasicResponse> getAllowableElevation(@RequestBody List<BasLaancAreaByElevModel> rq
) {
List<Integer> rs = null;
try {
rs = basLaancService.getAllowableElevation(rq);
@ -120,10 +140,16 @@ public class BasLaancController {
}
// TS 연동
/**
* TS 연동 - 자겨정보 조회
*
* @param idntfNumList
* @return
*/
@Deprecated
@Operation(summary = "TS 연동 - 비행자격 조회", description = "비행자격 조회(조종사 자격증명, 기체보험 여부)")
@ApiResponse(responseCode = "200", description = "성공")
@PostMapping(value = "/valid/ts/pilot")
@ApiOperation(value = "TS 연동 - 비행자격 조회(조종사 자격증명, 기체보험 여부)")
@Tag(name = "LAANC", description = "LAANC 관련 API")
public ResponseEntity<? extends BasicResponse> getTsValid(@RequestBody List<String> idntfNumList) {
BasLaancTsRs rs = null;
try {
@ -134,7 +160,7 @@ public class BasLaancController {
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
@ -144,11 +170,16 @@ public class BasLaancController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
// 허용고도 조회
/**
* 공역(금지구역) 포함 여부
*
* @param rq
* @return
*/
@Operation(summary = "공역(금지구역) 포함 여부", description = "공역(금지구역) 포함 여부")
@ApiResponse(responseCode = "200", description = "성공")
@PostMapping(value = "/valid/duplicated/airspace")
@ApiOperation(value = "공역(금지구역) 포함 여부")
@Tag(name = "LAANC", description = "LAANC 관련 API")
public ResponseEntity<? extends BasicResponse> getDuplicatedAirspace(@RequestBody List<BasLaancAreaModel> rq) {
public ResponseEntity<? extends BasicResponse> getDuplicatedAirspace(@RequestBody List<BasLaancAreaByAirspaceModel> rq) {
List<BasLaancDuplicatedAirspaceRs> rs = null;
try {
rs = basLaancService.getDuplicatedAirspace(rq);
@ -158,7 +189,7 @@ public class BasLaancController {
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap));
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
@ -168,4 +199,67 @@ public class BasLaancController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
/**
* TS QR 코드 생성
*
* @param rq
* @return
*/
@Operation(summary = "TS QR 코드 생성", description = "조종사 자격증명 및 기체 보험 여부 등 조회하기 위한 QR 코드 생성")
@ApiResponse(responseCode = "200", description = "성공")
@GetMapping(value = "/ts/qr")
public ResponseEntity<? extends BasicResponse> getQrCode(BasLaancQrcodeRq rq) {
BasLaancQrcodeRs rs = null;
try {
rs = basLaancService.createQrcode(rq);
} catch (CustomException e) {
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return new ResponseEntity<>(new SuccessResponse<>(rs), HttpStatus.OK);
}
/**
* TS QR 코드 확인
*
* @param confirmKey
* @return
*/
@Operation(summary = "TS QR 코드 확인", description = "조종사 자격증명 및 기체 보험 여부 등 데이터를 받고 검증된 데이터인지 확인")
@ApiResponse(responseCode = "200", description = "성공")
@Parameter(name = "confirmKey", description = "QR 코드 확인 키", required = true, in = ParameterIn.PATH, example = "251dd7ec-ec94-4b23-b8ff-bd7b53489448")
@GetMapping(value = "/ts/qr/{confirmKey}")
public ResponseEntity<? extends BasicResponse> checkRqcodeRs(@PathVariable("confirmKey") String confirmKey) {
PilotValidRs rs = null;
try {
rs = basLaancService.checkQrcode(confirmKey);
} catch (CustomException e) {
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
if (e.getParamArray() != null) {
resultMap.put("params", e.getParamArray());
}
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return new ResponseEntity<>(new SuccessResponse<>(rs), HttpStatus.OK);
}
}

16
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvListRq.java

@ -2,7 +2,7 @@ package com.palnet.biz.api.bas.laanc.model;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.palnet.biz.config.convert.InstantDateStrSerializer;
import io.swagger.annotations.ApiParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -27,18 +27,22 @@ import java.time.Instant;
@AllArgsConstructor
public class BasLaancAprvListRq {
@ApiParam(name = "작성자 이름", example = "팔")
@Schema(description = "작성자 이름", example = "팔")
private String memberName;
@ApiParam(name = "신청(등록)시작일자", example = "2023-12-12")
@Schema(description = "신청(등록)시작일자", example = "2023-12-12", implementation = String.class)
@JsonSerialize(using = InstantDateStrSerializer.class)
private Instant createStDate;
@ApiParam(name = "신청(등록)종료일자", example = "2023-12-12")
@Schema(description = "신청(등록)종료일자", example = "2023-12-12", implementation = String.class)
@JsonSerialize(using = InstantDateStrSerializer.class)
private Instant createEndDate;
@ApiParam(name = "비행시작일자", example = "2023-12-12")
@Schema(description = "비행시작일자", example = "2023-12-12", implementation = String.class)
@JsonSerialize(using = InstantDateStrSerializer.class)
private Instant schFltStDate;
@ApiParam(name = "비행종료일자", example = "2023-12-12")
@Schema(description = "비행종료일자", example = "2023-12-12", implementation = String.class)
@JsonSerialize(using = InstantDateStrSerializer.class)
private Instant schFltEndDate;

64
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvRs.java

@ -1,14 +1,8 @@
package com.palnet.biz.api.bas.laanc.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.palnet.biz.api.comn.file.model.ComnFileModel;
import com.palnet.biz.jpa.entity.type.ArcrftTypeCd;
import com.palnet.biz.jpa.entity.type.ArcrftWghtCd;
import com.palnet.biz.jpa.entity.type.FltPurpose;
import com.palnet.biz.jpa.entity.type.FltType;
import io.swagger.annotations.ApiParam;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -35,59 +29,59 @@ import java.util.stream.Collectors;
@NoArgsConstructor
@AllArgsConstructor
public class BasLaancAprvRs {
@ApiParam(name = "비행계획서 일려번호")
//비행계획서 일려번호
private Integer planSno;
@ApiParam(name = "그룹 아이디", hidden = true)
//그룹 아이디
private String groupId;
@ApiParam(name = "작성자 일련번호")
//작성자 일련번호
private Integer cstmrSno;
@ApiParam(name = "작성자 이름")
//작성자 이름
private String memberName;
@ApiParam(name = "작성자 이메일")
//작성자 이메일
private String email;
@ApiParam(name = "작성자 연락처")
//작성자 연락처
private String hpno;
@ApiParam(name = "작성자 국가번호(연락처)", hidden = true)
//작성자 국가번호(연락처)
private String clncd;
@ApiParam(name = "작성자 주소", hidden = true)
//작성자 주소
private String addr;
@ApiParam(name = "작성자 상세주소", hidden = true)
//작성자 상세주소
private String addrDtlCn;
@ApiParam(name = "작성자 우편번호", hidden = true)
//작성자 우편번호
private String zip;
@ApiParam(name = "비행시작일시")
//비행시작일시
private Instant schFltStDt;
@ApiParam(name = "비행종료일시")
//비행종료일시
private Instant schFltEndDt;
@ApiParam(name = "비행목적")
//비행목적
private FltPurpose fltPurpose;
@ApiParam(name = "상업/비사업 구분")
//상업/비사업 구분
private FltType fltType;
@ApiParam(name = "상업/비사업 구분 코드")
//상업/비사업 구분 코드
private String fltTypeNm;
@ApiParam(name = "승인여부")
//승인여부
private String aprvlYn;
@ApiParam(name = "승인일자")
//승인일자
private Instant aprvlDt;
// @ApiParam(name = "삭제여부")
// private String delYn;
@ApiParam(name = "등록자ID")
//삭제여부
// private String delYn;
//등록자ID
private String createUserId;
@ApiParam(name = "등록일시")
//등록일시
private Instant createDt;
@ApiParam(name = "수정자ID")
//수정자ID
private String updateUserId;
@ApiParam(name = "수정일시")
//수정일시
private Instant updateDt;
@ApiParam(name = "서비스유형")
//서비스유형
private String serviceType;
@ApiParam(name = "기업여부")
//기업여부
private String corpRegYn;
@ApiParam(name = "공문URL")
//공문URL
private String pdfUrl;
// 하나의 필드로 묶어서 처리
@ApiParam(name = "기체 무게")
//기체 무게
public String getArcrftWght() {
if (arcrftList == null || arcrftList.isEmpty()) return null;
List<ArcrftWghtCd> arcrftWghtCdList = arcrftList.stream().map(BasLaancArcrftModel::getArcrftWghtCd).distinct().filter(Objects::nonNull).collect(Collectors.toList());
@ -95,7 +89,7 @@ public class BasLaancAprvRs {
return ArcrftWghtType;
}
@ApiParam(name = "고도")
//고도
public String getElev() {
if (areaList == null || areaList.isEmpty()) return null;
List<String> elevList = areaList.stream().map(BasLaancAreaModel::getFltElev).distinct().filter(Objects::nonNull).collect(Collectors.toList());
@ -103,7 +97,7 @@ public class BasLaancAprvRs {
return elev;
}
// @ApiParam(name = "조종사 성명")
//조종사 성명
// public String getPilotName() {
// if (pilotList == null || pilotList.isEmpty()) return null;
// List<String> pilotNameList = pilotList.stream().map(BasLaancPilotModel::getMemberName).distinct().filter(Objects::nonNull).collect(Collectors.toList());

62
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancArcrftModel.java

@ -4,44 +4,106 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.palnet.biz.config.convert.InstantDateStrSerializer;
import com.palnet.biz.jpa.entity.type.ArcrftTypeCd;
import com.palnet.biz.jpa.entity.type.ArcrftWghtCd;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.Instant;
@Data
public class BasLaancArcrftModel {
@Schema(description = "계획서 기체 일련번호", example = "1", hidden = true)
private Integer planArcrftSno;
@Schema(description = "비행계획서 일련번호", example = "1", hidden = true)
private Integer planSno;
@Schema(description = "기체 일련번호", example = "1", hidden = true)
private Integer arcrftSno;
@Schema(description = "식별번호(기체번호)", example = "PA0001")
private String idntfNum;
@Schema(description = "그룹명", example = "한국공항공사", hidden = true)
private String groupNm;
@Schema(description = "제작번호", example = "123101-13", hidden = true)
private String prdctNum;
@Schema(description = "기체종류코드", example = "01", hidden = true)
private ArcrftTypeCd arcrftTypeCd;
@Schema(description = "기체모델명", example = "M-01", hidden = true)
private String arcrftModelNm;
@Schema(description = "제작자", example = "DJI", hidden = true)
private String prdctCmpnNm;
@Schema(description = "제작일자", example = "2022-01-01", hidden = true)
@JsonSerialize(using = InstantDateStrSerializer.class)
private Instant prdctDate;
@Schema(description = "기체길이", example = "1.0", hidden = true)
private double arcrftLngth;
@Schema(description = "길체폭", example = "1.1", hidden = true)
private double arcrftWdth;
@Schema(description = "기체높이", example = "1.0", hidden = true)
private double arcrftHght;
@Schema(description = "기체중량", example = "1.5", hidden = true)
private double arcrftWght;
@Schema(description = "중량구분코드", hidden = true)
private String wghtTypeCd;
@Schema(description = "이미지URL", example = "http://www.imageurl.co.kr/image/url", hidden = true)
private String imageUrl;
@Schema(description = "최대이륙중량", example = "10", hidden = true)
private double takeoffWght;
@Schema(description = "사용여부", hidden = true)
private String useYn;
@Schema(description = "카메라탑재여부", example = "N")
private String cameraYn;
@Schema(description = "보험가입여부", example = "Y")
private String insrncYn;
@Schema(description = "소유자명(법인명)", example = "팔네트웍스")
private String ownerNm;
@Schema(description = "생성자ID", hidden = true)
private String createUserId;
@Schema(description = "생성일시", hidden = true)
private Instant createDt;
@Schema(description = "수정자ID", hidden = true)
private String updateUserId;
@Schema(description = "수정일시", hidden = true)
private Instant updateDt;
@Schema(hidden = true)
private String docState = "R";
@Schema(description = "식별장치종류코드", example = "DRON", hidden = true)
private String idntfTypeCd;
// kac 추가 필드
@Schema(description = "기체보험유무", example = "Y")
private String acrftInsuranceYn;
@Schema(description = "보험유효기간", hidden = true)
@JsonSerialize(using = InstantDateStrSerializer.class)
private Instant insuranceExperiod;
@Schema(description = "법인명", hidden = true)
private String corporationNm;
@Schema(description = "자체중량코드", example = "10")
private ArcrftWghtCd arcrftWghtCd; // 기체 무게 코드 ----
}

22
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaByAirspaceModel.java

@ -0,0 +1,22 @@
package com.palnet.biz.api.bas.laanc.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
public class BasLaancAreaByAirspaceModel {
@Schema(description = "구역종류", example = "CIRCLE")
private String areaType;
@Schema(description = "버퍼존", example = "100")
private Integer bufferZone;
@Schema(description = "고도", example = "110")
private String fltElev;
private List<BasLaancAreaCoordByAirspaceModel> coordList;
}

20
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaByElevModel.java

@ -0,0 +1,20 @@
package com.palnet.biz.api.bas.laanc.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
public class BasLaancAreaByElevModel {
@Schema(description = "구역종류", example = "CIRCLE")
private String areaType;
@Schema(description = "버퍼존", example = "100")
private Integer bufferZone;
private List<BasLaancAreaCoordByElevModel> coordList;
}

16
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordByAirspaceModel.java

@ -0,0 +1,16 @@
package com.palnet.biz.api.bas.laanc.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BasLaancAreaCoordByAirspaceModel {
@Schema(description = "위도", example = "127.33")
private double lat;
@Schema(description = "경도", example = "37.99")
private double lon;
}

16
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordByElevModel.java

@ -0,0 +1,16 @@
package com.palnet.biz.api.bas.laanc.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BasLaancAreaCoordByElevModel {
@Schema(description = "위도", example = "127.33")
private double lat;
@Schema(description = "경도", example = "37.99")
private double lon;
}

14
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaCoordModel.java

@ -1,16 +1,30 @@
package com.palnet.biz.api.bas.laanc.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.Instant;
@Data
public class BasLaancAreaCoordModel {
@Schema(description = "비행구역좌표 일련번호", example = "1")
private Integer planAreaCoordSno;
@Schema(description = "비행계획비행구역 일련번호", example = "1")
private Integer planAreaSno;
@Schema(description = "위도", example = "127.33")
private double lat;
@Schema(description = "경도", example = "37.99")
private double lon;
@Schema(description = "생성자ID", hidden = true)
private String createUserId;
@Schema(description = "생성일시", hidden = true)
private Instant createDt;
@Schema(hidden = true)
private String docState = "R";
}

32
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaModel.java

@ -1,6 +1,7 @@
package com.palnet.biz.api.bas.laanc.model;
import com.palnet.biz.jpa.entity.type.FltMethod;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.Instant;
@ -8,20 +9,49 @@ import java.util.List;
@Data
public class BasLaancAreaModel {
@Schema(description = "비행구역 일련번호", example = "1", hidden = true)
private Integer planAreaSno;
@Schema(description = "비행계획서 일련번호", example = "1", hidden = true)
private Integer planSno;
@Schema(description = "구역종류", example = "CIRCLE")
private String areaType;
@Schema(description = "비행방식", example = "01")
private FltMethod fltMethod;
@Schema(description = "비행구역주소", example = "인천광역시 부평구 청천2동")
private String fltAreaAddr;
@Schema(description = "버퍼존", example = "100")
private Integer bufferZone;
@Schema(description = "고도", example = "110")
private String fltElev;
@Schema(description = "생성자ID", hidden = true)
private String createUserId;
@Schema(description = "생성일시", hidden = true)
private Instant createDt;
@Schema(description = "수정자ID", hidden = true)
private String updateUserId;
private Instant updateDt;
@Schema(description = "수정일시", hidden = true)
private Instant updateDt;
private String docState = "R";
private List<BasLaancAreaCoordModel> coordList;
@Schema(hidden = true)
private List<BasLaancAreaCoordModel> bufferCoordList;
// kac 추가 필드
@Schema(description = "비행방식(기타)")
private String fltMothoeRm;
}

2
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancDuplicatedAirspaceRs.java

@ -22,5 +22,5 @@ import lombok.NoArgsConstructor;
@Builder
public class BasLaancDuplicatedAirspaceRs {
private boolean isDuplicated;
private BasLaancAreaModel rq;
private BasLaancAreaByAirspaceModel rq;
}

24
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancPlanRq.java

@ -1,9 +1,12 @@
package com.palnet.biz.api.bas.laanc.model;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel;
import com.palnet.biz.api.external.model.PilotValidRs;
import com.palnet.biz.config.convert.InstantDatetimeStrSerializer;
import com.palnet.biz.jpa.entity.type.FltPurpose;
import com.palnet.biz.jpa.entity.type.FltType;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.Instant;
@ -11,18 +14,37 @@ import java.util.List;
@Data
public class BasLaancPlanRq {
@Schema(description = "비행계획서 일련번호", example = "1", hidden = true)
private Integer planSno;
private Integer cstmrSno;
@Schema(description = "사용자 일련번호", example = "1", hidden = true)
private Integer cstmrSno;
@Schema(description = "이름", example = "조종사")
private String memberName;
@Schema(description = "비행유형", example = "COMMERCIAL")
private FltType fltType; // 비행유형 - 상업/비상업 ----
@Schema(description = "비행시작일시", example = "2024-02-12 09:00:00", implementation = String.class)
@JsonSerialize(using = InstantDatetimeStrSerializer.class)
private Instant schFltStDt; // 시작일시
@Schema(description = "비행종료일시", example = "2024-02-12 10:00:00", implementation = String.class)
@JsonSerialize(using = InstantDatetimeStrSerializer.class)
private Instant schFltEndDt; // 종료일시
@Schema(description = "비행목적", example = "17")
private FltPurpose fltPurpose; // 비행목적 -----
@Schema(description = "서비스구분", example = "KAC")
private String serviceType; // 고정
@Schema(hidden = true)
private String docState = "R";
private List<BasLaancAreaModel> areaList;
// private List<BasFlightPlanPilotModel> pilotList;
private List<BasLaancArcrftModel> arcrftList;

16
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancQrcodeRq.java

@ -0,0 +1,16 @@
package com.palnet.biz.api.bas.laanc.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BasLaancQrcodeRq {
@Schema(description = "기체신고번호", example = "C1CM0231251")
private String idntfNum; // 기체신고번호
}

15
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancQrcodeRs.java

@ -0,0 +1,15 @@
package com.palnet.biz.api.bas.laanc.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BasLaancQrcodeRs {
private byte[] qrcode; // qr코드
private String confirmKey; // 인증번호
}

4
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancTsRq.java

@ -1,7 +1,5 @@
package com.palnet.biz.api.bas.laanc.model;
import io.swagger.annotations.ApiParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -25,6 +23,6 @@ import java.util.List;
@AllArgsConstructor
@Builder
public class BasLaancTsRq {
@ApiParam(name = "기체신고번호", collectionFormat = ",")
// @ApiParam(name = "기체신고번호", collectionFormat = ",")
private List<String> IdntfNumList;
}

81
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancValidatedRs.java

@ -1,14 +1,10 @@
package com.palnet.biz.api.bas.laanc.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.palnet.biz.api.external.model.PilotValidRs;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* packageName : com.palnet.biz.api.bas.laanc.model
* fileName : BasLaancValidatedRs
@ -26,66 +22,39 @@ import java.util.List;
@AllArgsConstructor
public class BasLaancValidatedRs {
// // TS 연동
// private String corpRegYn; // 사업자 여부
// private List<PilotValidRs> pilotValidRsList; // 자격여부
private boolean isPilotQlfc; // 자격여부
private boolean isArcrftInsurance; // 항공기보험여부
// 비행유형 여부
private boolean isCommercial; // 사업자 - true, 비사업자 - false
// 관제권
private boolean isEvaluatedTargetArea; // 평가대상지역여부 - 공역과 겹칠때만 true
private boolean isFlightArea; // 비행가능여부 - 비행가능 true
// 고도
private boolean isElev; // 고도여부 - 관제권내 설정고도 이하, 권제권밖 150m 이하 true
// 기체중량
private boolean isArcrftWeight; // 항공기중량여부 - 25kg 이하 true
// 비행방식
private boolean isFltMethod; // 비행방식 - 군집비행 false, 그외 true
// 비행시간
private boolean isSpacialFlight; // 특별비행여부 - true (야간비행)
// 자격여부
private boolean isPilotQlfc; // 자격여부
// 기체보험여부
private boolean isArcrftInsurance; // 기체보험여부
private boolean isElev; // 고도여부 - 150m 이하 true
private boolean isReport; // 신고 대상 - 비상업적이고 기체중량 2kg미만일 경우 - false / 그외 true
// 추가....
private boolean isCommercial; // 비행유형 사업자 - true / 비사업자 - false
private boolean isSpacialFlight; // 특별비행여부 - true
// TS 연동
// private String corpRegYn; // 사업자 여부
private List<PilotValidRs> pilotValidRsList; // 자격여부
// 활용안함.
// private boolean isArcrftDuplicated; // 기체 중복여부
// private boolean isPlanAreaDuplicatd; // 비행계획서비행구역 중복여부
// 최종여부
public boolean isValid() {
if (isReport) {
return isPilotQlfc
&& isArcrftInsurance
// && !isArcrftDuplicated // 기체 중복여부
// && !isPlanAreaDuplicatd // 비행구역 중복여부
&& isFlightArea // 비행가능여부
&& isCheckingLance();
}
return isFlightArea
// && !isPlanAreaDuplicatd
// && !isArcrftDuplicated
&& isCheckingLance();
return !isNonAprove() && !isNonAproveFlight();
}
public boolean isFlight() {
return !isCheckingLance() || isValid();
// 미승인
public boolean isNonAprove() {
return isFltMethod && !isSpacialFlight && isElev && isPilotQlfc && isArcrftInsurance;
}
// LAANC 승인 대상 여부
@JsonIgnore
public boolean isCheckingLance() {
return isEvaluatedTargetArea // 관제구역여부
/*
관제권 고도 150m초과에 대해서 승인 대상이나 담당자와의 협의가 필요하여 미승인 처리함
|| !isElev // 150m 초과 -
*/
|| !isArcrftWeight; // 25kg 초과
// 비행가능여부(미승인-날수있음)
public boolean isNonAproveFlight() {
return !isCommercial && !isEvaluatedTargetArea && isElev && isArcrftWeight;
}
// 특별승인 대상 여부
@JsonIgnore
public boolean isTargetSpacialFlight() {
return false;
}
}

28
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancAprvService.java

@ -46,18 +46,32 @@ public class BasLaancAprvService {
* @param pageable
* @return
*/
@Deprecated
public Page<BasLaancAprvRs> getLaancAprvList(BasLaancAprvListRq rq, Pageable pageable) {
LaancAprvSearchDto searchDto = BasLaancAprvMapper.MAPPER.toDto(rq);
Page<LaancPlanDto> result = fltPlanQueryRepository.findAllAprvListBySearch(searchDto, pageable);
Page<BasLaancAprvRs> rs = PageUtils.convert(result, BasLaancAprvMapper.MAPPER.toRsList(result.getContent()));
return rs;
return PageUtils.convert(result, BasLaancAprvMapper.MAPPER.toRsList(result.getContent()));
}
/**
* laanc 승인 목록
*
* @param rq
* @return
*/
public List<BasLaancAprvRs> getLaancAprvList2(BasLaancAprvListRq rq) {
LaancAprvSearchDto searchDto = BasLaancAprvMapper.MAPPER.toDto(rq);
// 검색조건에 해당하는 비행계획서 조회
List<LaancPlanDto> result = fltPlanQueryRepository.findAllAprvListBySearch2(searchDto);
// 비행계획서에 해당하는 파일의 그룹NO 추출 - PDF URL을 가져오기 위함
List<Integer> fileGroupNoList = result.stream().map(LaancPlanDto::getFileGroupNo).filter(Objects::nonNull).collect(Collectors.toList());
// 파일 정보 조회
List<ComnFileModel> fileListByGroupNoList = comnFileService.getFileListByGroupNoList(fileGroupNoList);
// 파일 정보(PDF)를 비행계획서에 추가
result.forEach(dto -> {
if (dto.getFileGroupNo() != null) {
fileListByGroupNoList.stream()
@ -66,9 +80,8 @@ public class BasLaancAprvService {
.ifPresent(file -> dto.setPdfUrl(file.getDownloadUrl()));
}
});
List<BasLaancAprvRs> rs = BasLaancAprvMapper.MAPPER.toRsList(result);
return rs;
return BasLaancAprvMapper.MAPPER.toRsList(result);
}
/**
@ -79,13 +92,16 @@ public class BasLaancAprvService {
*/
public BasLaancAprvRs getLaancAprvDetail(String planSno) {
if (planSno == null) throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
LaancPlanDto result = fltPlanQueryRepository.findAprvById(Integer.parseInt(planSno));
// PDF URL 추출
if (result != null && result.getFileGroupNo() != null) {
ComnFileModel comnFileModel = comnFileService.getOfficialDocumentFileListByGroupNo(result.getFileGroupNo());
if (comnFileModel != null) result.setPdfUrl(comnFileModel.getDownloadUrl());
}
BasLaancAprvRs rs = BasLaancAprvMapper.MAPPER.toRs(result);
return rs;
return BasLaancAprvMapper.MAPPER.toRs(result);
}
}

523
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java

@ -1,47 +1,28 @@
package com.palnet.biz.api.bas.laanc.service;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import com.palnet.biz.api.bas.laanc.model.*;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import com.google.zxing.WriterException;
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrModel;
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.bas.laanc.model.*;
import com.palnet.biz.api.comn.file.model.LaancPdfModel;
import com.palnet.biz.api.comn.file.service.ComnFileService;
import com.palnet.biz.api.comn.sms.model.ComnSmsLaancAprovModel;
import com.palnet.biz.api.comn.sms.service.ComnSmsService;
import com.palnet.biz.api.comn.sunriseset.model.ComnSunrisesetCoordRq;
import com.palnet.biz.api.comn.sunriseset.model.ComnSunrisesetRs;
import com.palnet.biz.api.external.model.PilotValidRq;
import com.palnet.biz.api.external.model.PilotValidRs;
import com.palnet.biz.api.external.model.TsPlanRq;
import com.palnet.biz.api.external.model.TsQrcodeRq;
import com.palnet.biz.api.external.service.TsService;
import com.palnet.biz.jpa.entity.ComFileBas;
import com.palnet.biz.jpa.entity.FltPlanArcrft;
import com.palnet.biz.jpa.entity.FltPlanArea;
import com.palnet.biz.jpa.entity.FltPlanAreaCoord;
import com.palnet.biz.jpa.entity.FltPlanBas;
import com.palnet.biz.jpa.entity.FltPlanPilot;
import com.palnet.biz.jpa.entity.PtyGroupBas;
import com.palnet.biz.jpa.entity.PtyTermsAgreeTxn;
import com.palnet.biz.jpa.entity.*;
import com.palnet.biz.jpa.entity.type.ArcrftWghtCd;
import com.palnet.biz.jpa.entity.type.FltMethod;
import com.palnet.biz.jpa.entity.type.FltType;
import com.palnet.biz.jpa.repository.com.ComConfirmBasRepository;
import com.palnet.biz.jpa.repository.com.ComRiseSetQueryRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanArcrftRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanAreaCoordRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanAreaRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanPilotRepository;
import com.palnet.biz.jpa.repository.flt.*;
import com.palnet.biz.jpa.repository.pty.PtyCstmrQueryRepository;
import com.palnet.biz.jpa.repository.pty.PtyGroupBasRepository;
import com.palnet.biz.jpa.repository.pty.PtyTermsAgreeTxnRepository;
@ -49,13 +30,27 @@ import com.palnet.biz.scheduler.ctr.model.CtrTrnsLctnModel;
import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService;
import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.AirspaceUtils;
import com.palnet.comn.utils.AreaUtils;
import com.palnet.comn.utils.HttpUtils;
import com.palnet.comn.utils.InstantUtils;
import com.palnet.comn.utils.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import java.io.IOException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
/**
* packageName : com.palnet.biz.api.bas.laanc.service
@ -87,76 +82,98 @@ public class BasLaancService {
private final ComnSmsService comnSmsService;
private final JwtTokenUtil jwtTokenUtil;
private final AreaUtils areaUtils;
private final ComRiseSetQueryRepository comRiseSetQueryRepository;
private final ComConfirmBasRepository comConfirmBasRepository;
// LAANC 검증
public BasLaancValidatedRs validationLaanc(BasLaancPlanRq rq) {
if (!this.laancParamValid(rq)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
BasLaancValidatedRs rs = new BasLaancValidatedRs();
// 조종사 자격 확인 - 무게가 2kg 초과이거나 상업적일 경우에만 진행
// 상업 여부 - 상업(true)
boolean isCommercial = FltType.COMMERCIAL == rq.getFltType();
rs.setCommercial(isCommercial);
@Value("${app.host}")
private String APP_HOST;
// 2kg 초과 기체신고번호
List<String> idntfNumList = rq.getArcrftList().stream().filter(arcrft -> arcrft.getArcrftWghtCd() != ArcrftWghtCd.W250G_LOE && arcrft.getArcrftWghtCd() != ArcrftWghtCd.W250G_W2KG).map(BasLaancArcrftModel::getIdntfNum).collect(Collectors.toList());
@Value("${external.ts.return.uri}")
private String TS_RETURN_URI;
// 신고 여부 - 비상업적이고 기체중량 2kg이하일 경우 - false, 상업적이거나 기체중량 2kg초과일 경우 - true
boolean isReport = !idntfNumList.isEmpty() || isCommercial;
rs.setReport(isReport);
/**
* LAANC 검증
*
* @param rq
* @return
*/
public BasLaancValidatedRs validationLaanc(BasLaancPlanRq rq) {
if (!this.laancParamValid(rq)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
// 고도 150m 이하 - true
boolean isElev = rq.getAreaList().stream().anyMatch(area -> area.getFltElev() != null && Integer.parseInt(area.getFltElev()) <= 150);
rs.setElev(isElev);
BasLaancValidatedRs rs = new BasLaancValidatedRs();
// 기체중량 25kg 이하
boolean isArcrftWeight = rq.getArcrftList().stream().anyMatch(arcrft -> arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO && arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO_TEST);
rs.setArcrftWeight(isArcrftWeight);
// TODO start - 조종사 자격 및 기체보험 확인
if (isReport) {
List<PilotValidRq> pilotValidRqList = idntfNumList.stream().map(idntfNum -> {
// TS 자격 판별 - 조종사 자격증명, 기체 보험
List<String> idntfNumList = rq.getArcrftList().stream().filter(arcrft -> arcrft.getIdntfNum() != null && !arcrft.getIdntfNum().isBlank()).map(BasLaancArcrftModel::getIdntfNum).collect(Collectors.toList());
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken();
AnctCstmrModel cstmrInfo = ptyCstmrQueryRepository.findByCstmrSno(cstmrSno);
String userCi = cstmrInfo.getIpinCi();
List<PilotValidRq> pilotValidRqList = new ArrayList<>();
if (!idntfNumList.isEmpty()) {
pilotValidRqList = idntfNumList.stream().map(idntfNum -> {
// TODO 기체보험 확인, 조종사 자격 확인
return PilotValidRq.builder()
.pilotci("조종사CI")
.pilotci(userCi)
.declarationnum(idntfNum)
.build();
}).collect(Collectors.toList());
} else {
pilotValidRqList.add(PilotValidRq.builder()
.pilotci(userCi)
.build());
}
List<PilotValidRs> pilotValidRsList = tsService.getAccountValidate(pilotValidRqList);
if (pilotValidRsList.isEmpty()) {
rs.setPilotQlfc(false);
rs.setArcrftInsurance(false);
} else {
rs.setPilotValidRsList(pilotValidRsList);
rs.setPilotQlfc(pilotValidRsList.stream().allMatch(pilotValidRs -> "Y".equals(pilotValidRs.getPilotcredentialyn())));
rs.setArcrftInsurance(pilotValidRsList.stream().allMatch(pilotValidRs -> "Y".equals(pilotValidRs.getArcrftinsuranceyn())));
}
List<PilotValidRs> pilotValidRsList = tsService.getAccountValidate(pilotValidRqList);
if (pilotValidRsList.isEmpty()) {
rs.setPilotQlfc(false);
rs.setArcrftInsurance(false);
} else {
rs.setPilotQlfc(pilotValidRsList.stream().allMatch(pilotValidRs -> "Y".equals(pilotValidRs.getPilotcredentialyn())));
rs.setArcrftInsurance(pilotValidRsList.stream().allMatch(pilotValidRs -> "Y".equals(pilotValidRs.getArcrftinsuranceyn())));
}
// TODO end - 조종사 자격 및 기체보험 확인
// 비행유형 판별 - 상업 - true
boolean isCommercial = FltType.COMMERCIAL == rq.getFltType();
rs.setCommercial(isCommercial);
// 관제권 여부 판별
BasLaancValidatedRs validationPlanDbRs = this.validationPlanAirspace(rq);
boolean isEvaluatedTargetArea = validationPlanDbRs.isEvaluatedTargetArea();
rs.setEvaluatedTargetArea(isEvaluatedTargetArea);
// 고도여부 - 관제권내 설정고도 이하, 권제권밖 150m 이하 true
if (isEvaluatedTargetArea) {
// 관제권 내부 - 설정고도 이하
rs.setElev(validationPlanDbRs.isElev());
} else {
// 관제권 외부 - 150m 이하
boolean isElev = rq.getAreaList().stream().allMatch(area -> area.getFltElev() != null && Integer.parseInt(area.getFltElev()) <= 150);
rs.setElev(isElev);
}
/* 비행구역 기체 중복여부 확인 안하기로 .
// 비행구역 중복여부, 기체 중복여부
BasLaancValidatedRs validationPlanAirspaceRs = this.validationPlanAreaAndArcrft(rq);
rs.setPlanAreaDuplicatd(validationPlanAirspaceRs.isPlanAreaDuplicatd());
rs.setArcrftDuplicated(validationPlanAirspaceRs.isArcrftDuplicated());
*/
// 기체중량 판별 - 25kg 이하 true
boolean isArcrftWeight = rq.getArcrftList().stream().allMatch(arcrft -> arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO && arcrft.getArcrftWghtCd() != ArcrftWghtCd.W25KG_GO_TEST);
rs.setArcrftWeight(isArcrftWeight);
// 특별비행여부 판별 - 야간/주간 - 야간 true
boolean isSpcialFlight = this.validationPlanSpecialFlight(rq);
rs.setSpacialFlight(isSpcialFlight);
// 판단구역 - 공역과 겹칠 경우, 비행가능여부
BasLaancValidatedRs validationPlanDbRs = this.validationPlanAirspace(rq);
rs.setEvaluatedTargetArea(validationPlanDbRs.isEvaluatedTargetArea());
rs.setFlightArea(validationPlanDbRs.isFlightArea());
// 비행방식 - 군집비행 false, 그외 true
boolean isFltMethod = rq.getAreaList().stream().allMatch(area -> FltMethod.CLUSTER_FLIGHT != area.getFltMethod());
rs.setFltMethod(isFltMethod);
return rs;
}
// 비행계획서 등록, 약관 등록, 공문 생성
/**
* 비행계획서 등록, 약관 등록, 공문 생성
*
* @param rq
* @return
*/
@Transactional
public BasLaancLastRs createFlightPlan(BasLaancPlanRq rq) {
// if (rq == null || rq.getValidatedRs() == null) throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
@ -180,6 +197,7 @@ public class BasLaancService {
// 비행계획서
String userId = jwtTokenUtil.getUserIdByToken();
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken();
// 개인정보 가져오기 - 비행계획서 작성자 정보, 조종사 정보
AnctCstmrModel cstmrInfo = ptyCstmrQueryRepository.findByCstmrSno(cstmrSno);
FltPlanBas fltPlanBas = BasLaancMapper.MAPPER.modelToPlanEntity(cstmrInfo);
@ -208,10 +226,11 @@ public class BasLaancService {
corpRegYn = isCorpReg ? "Y" : "N";
}
fltPlanBas.setCorpRegYn(corpRegYn); // 사업자유무
fltPlanBas.setServiceType("PAV-KAC");
fltPlanBas.setServiceType("F0002");
FltPlanBas rBasEntity = fltPlanBasRepository.save(fltPlanBas);
Integer planSno = rBasEntity.getPlanSno();
// 비행구역
List<BasLaancAreaModel> basLaancAreaModelList = rq.getAreaList();
if (basLaancAreaModelList != null && !basLaancAreaModelList.isEmpty()) {
@ -369,113 +388,19 @@ public class BasLaancService {
return rs;
}
// LAANC 검증
/*
private BasLaancValidatedRs validationPlanAreaAndArcrft(BasLaancPlanRq rq) {
// 초기화
BasLaancValidatedRs rs = BasLaancValidatedRs.builder()
.isPlanAreaDuplicatd(false) // 비행구역 중복여부
.isArcrftDuplicated(false) // 기체 중복여부
.build();
// 비행계획서
List<FltPlanBas> fltPlanBasList = fltPlanBasRepository.findBySchFltStDtLessThanEqualAndSchFltEndDtGreaterThanEqualAndAprvlYnAndDelYn(rq.getSchFltEndDt(), rq.getSchFltStDt(), "Y", "N");
if (fltPlanBasList != null && !fltPlanBasList.isEmpty()) {
if (rq.getPlanSno() != null) {
// 동일한 비행계획서는 검증에서 제외 처리
fltPlanBasList = fltPlanBasList.stream().filter(fltPlanBas -> !rq.getPlanSno().equals(fltPlanBas.getPlanSno())).collect(Collectors.toList());
}
// 비행계획서 planSno 모음
List<Integer> planSnoList = fltPlanBasList.stream().map(FltPlanBas::getPlanSno).collect(Collectors.toList());
// 지역
// List<FltPlanArea> fltPlanAreaList = fltPlanAreaRepository.findByPlanSnoIn(planSnoList);
for (FltPlanBas fltPlanBas : fltPlanBasList) {
// 1. 구역조회
List<FltPlanArea> fltPlanAreaList = fltPlanAreaRepository.findByPlanSnoOrderByPlanAreaSnoAsc(fltPlanBas.getPlanSno());
// 2. 좌표 조회 -> 영역 포함 여부 확인
for (FltPlanArea fltPlanArea : fltPlanAreaList) {
String effectiveFltElev = fltPlanArea.getFltElev();
List<FltPlanAreaCoord> fltPlanAreaCoordList = fltPlanAreaCoordRepository.findByPlanAreaSnoOrderByPlanAreaCoordSnoAsc(fltPlanArea.getPlanAreaSno());
if (fltPlanAreaCoordList == null || fltPlanAreaCoordList.isEmpty()) continue;
// 2-1 영역 좌표
List<Coordinate> effectiveCoordList = fltPlanAreaCoordList.stream().map(fltPlanAreaCoord -> new Coordinate(fltPlanAreaCoord.getLon(), fltPlanAreaCoord.getLat())).collect(Collectors.toList());
List<Coordinate> effectiveCoordBufferList = new ArrayList<>();
// Query에서 조회한 좌표로 버퍼좌표 생성
if ("LINE".equals(fltPlanArea.getAreaType())) {
List<Coordinate> trans = areaUtils.transform(effectiveCoordList, "EPSG:4326", "EPSG:5181");
List<Coordinate> bufferList = areaUtils.buffer(trans, fltPlanArea.getBufferZone());
effectiveCoordBufferList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326");
}
if ("POLYGON".equals(fltPlanArea.getAreaType())) {
effectiveCoordBufferList.addAll(effectiveCoordList);
}
if ("CIRCLE".equals(fltPlanArea.getAreaType())) {
effectiveCoordBufferList = areaUtils.createCircle(effectiveCoordList.get(0), fltPlanArea.getBufferZone());
}
for (BasLaancAreaModel basLaancAreaModel : rq.getAreaList()) {
String targetFltElev = basLaancAreaModel.getFltElev();
// TODO 추후 특정 고도 범위 확인
boolean isEqualsFltElev = effectiveFltElev.equals(targetFltElev);
// rq로 들어온 좌표로 버퍼좌표 생성
List<Coordinate> targetCoords = basLaancAreaModel.getCoordList().stream().map(coord -> new Coordinate(coord.getLon(), coord.getLat())).collect(Collectors.toList());
List<Coordinate> targetBufferCoords = new ArrayList<>();
if ("LINE".equals(basLaancAreaModel.getAreaType())) {
List<Coordinate> trans = areaUtils.transform(targetCoords, "EPSG:4326", "EPSG:5181");
List<Coordinate> bufferList = areaUtils.buffer(trans, fltPlanArea.getBufferZone());
targetBufferCoords = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326");
} else if ("POLYGON".equals(basLaancAreaModel.getAreaType())) {
targetBufferCoords.addAll(targetCoords);
} else if ("CIRCLE".equals(basLaancAreaModel.getAreaType())) {
targetBufferCoords = areaUtils.createCircle(targetCoords.get(0), fltPlanArea.getBufferZone());
}
// 검증
Geometry targetGeometry = areaUtils.coordinateToGeometry(targetBufferCoords);
Geometry effectiveGeometry = areaUtils.coordinateToGeometry(effectiveCoordBufferList);
if (targetGeometry.intersects(effectiveGeometry) && isEqualsFltElev) {
rs.setPlanAreaDuplicatd(true);
}
}
}
}
// 기체 중복 여부 확인
List<BasLaancArcrftModel> arcrftList = rq.getArcrftList();
if (arcrftList != null && !arcrftList.isEmpty()) {
List<FltPlanArcrft> fltPlanArcrftList = fltPlanArcrftRepository.findByPlanSnoIn(planSnoList);
if (fltPlanArcrftList != null && !fltPlanArcrftList.isEmpty()) {
boolean isDuplicatedArcrft = arcrftList.stream().anyMatch(arcrft ->
fltPlanArcrftList.stream().anyMatch(fltPlanArcrft ->
arcrft.getIdntfNum().equals(fltPlanArcrft.getIdntfNum())
)
);
if (isDuplicatedArcrft) {
rs.setArcrftDuplicated(true);
}
}
}
}
return rs;
}
/**
* 비행신청 - 공역관련 검증
*
* @param rq
* @return
*/
private BasLaancValidatedRs validationPlanAirspace(BasLaancPlanRq rq) {
// 초기화
BasLaancValidatedRs rs = BasLaancValidatedRs.builder()
.isEvaluatedTargetArea(false) // 판단구역 - 공역과 겹칠 경우
.isFlightArea(false) // 비행가능여부
.isElev(false) // 비행가능여부
.build();
// 공역 중복 확인
@ -507,27 +432,18 @@ public class BasLaancService {
boolean duplicatedAirspace = airspaceUtils.isDuplicatedAirspace(featureInfo);
rs.setEvaluatedTargetArea(duplicatedAirspace);
// 비행 가능 지역 판단
// if (duplicatedAirspace) {
// boolean validLaancAirspace = airspaceUtils.isValidLaancAirspace(featureInfo);
// rs.setFlightAreaYn(validLaancAirspace ? "Y" : "N");
// } else {
// rs.setFlightAreaYn("N");
// }
// 비행 가능 지역 판단
boolean validLaancAirspace = airspaceUtils.isValidLaancAirspace(featureInfo);
rs.setFlightArea(validLaancAirspace);
rs.setElev(validLaancAirspace);
}
return rs;
}
/**
* 야간 특별비행 유무 확인
* 비행계획서 검증 - 시작, 종료 일자
* 1. 비행시작 일자 금일 ~ 90일 이내
* 2. 비행 종료일자 금일 ~ 6개월까지 -- validtion 통과후 일몰
* 3. 일몰, 일출 시간[해떠있는 시간] 체크
*
* @param rq
* @return
@ -551,23 +467,34 @@ public class BasLaancService {
// 시간 파라미터가 맞지 않을경우
if (!(isSchFltStDtValid && isSchFltEndDtValid)) return false;
// String[] stringStDt = InstantUtils.toDatetimeString(rq.getSchFltStDt()).split(" ");
// String[] stringEndDt = InstantUtils.toDatetimeString(rq.getSchFltEndDt()).split(" ");
//
// ComnSunrisesetCoordRq comnSunrisesetCoordRq = new ComnSunrisesetCoordRq(stringStDt[0].replace("-", ""), stringEndDt[0].replace("-", ""), null, null);
//
// ComnSunrisesetRs comnSunrisesetRs = comRiseSetQueryRepository.findBySearchCoordDateTransform(comnSunrisesetCoordRq);
//
// LocalTime sunUp = this.convertStringToTime(comnSunrisesetRs.getCivilm(), "HHmmss");
// LocalTime sunDown = this.convertStringToTime(comnSunrisesetRs.getCivile(), "HHmmss");
//
// LocalTime stringStTm = this.convertStringToTime(stringStDt[1].replace(":", ""), "HHmmss");
// LocalTime stringEndTm = this.convertStringToTime(stringEndDt[1].replace(":", ""), "HHmmss");
//
// boolean stTmValid = this.isBetweenSunriseAndSunset(sunUp, sunDown, stringStTm);
// boolean endTmValid = this.isBetweenSunriseAndSunset(sunUp, sunDown, stringEndTm);
// if (!stTmValid || !endTmValid) return false;
return true;
}
/**
* 비행계획서 검증 - 특별 비행
* @param rq
* @return
*/
private boolean validationPlanSpecialFlight(BasLaancPlanRq rq) {
String[] stringStDt = InstantUtils.toDatetimeString(rq.getSchFltStDt()).split(" ");
String[] stringEndDt = InstantUtils.toDatetimeString(rq.getSchFltEndDt()).split(" ");
ComnSunrisesetCoordRq comnSunrisesetCoordRq = new ComnSunrisesetCoordRq(stringStDt[0].replace("-", ""), stringEndDt[0].replace("-", ""), null, null);
ComnSunrisesetRs comnSunrisesetRs = comRiseSetQueryRepository.findBySearchCoordDateTransform(comnSunrisesetCoordRq);
LocalTime sunUp = this.convertStringToTime(comnSunrisesetRs.getCivilm(), "HHmmss");
LocalTime sunDown = this.convertStringToTime(comnSunrisesetRs.getCivile(), "HHmmss");
LocalTime stringStTm = this.convertStringToTime(stringStDt[1].replace(":", ""), "HHmmss");
LocalTime stringEndTm = this.convertStringToTime(stringEndDt[1].replace(":", ""), "HHmmss");
boolean stTmValid = this.isBetweenSunriseAndSunset(sunUp, sunDown, stringStTm);
boolean endTmValid = this.isBetweenSunriseAndSunset(sunUp, sunDown, stringEndTm);
if (!stTmValid || !endTmValid) return false;
return true;
}
@ -596,18 +523,23 @@ public class BasLaancService {
timeToCheck.isBefore(sunset);
}
// 허용고도 조회
public List<Integer> getAllowableElevation(List<BasLaancAreaModel> rq) {
/**
* 허용고도 조회
*
* @param rq
* @return
*/
public List<Integer> getAllowableElevation(List<BasLaancAreaByElevModel> rq) {
AirspaceUtils airspaceUtils = AirspaceUtils.getInstance();
List<Integer> allowElevationList = new ArrayList<>();
for (BasLaancAreaModel area : rq) {
for (BasLaancAreaByElevModel area : rq) {
//rq로 들어온 좌표로 버퍼좌표 생성
List<Coordinate> targetCoord = new ArrayList<>();
List<Coordinate> targetCoordBufferList = new ArrayList<>();
for (BasLaancAreaCoordModel basLaancAreaCoordModel : area.getCoordList()) {
Coordinate coords = new Coordinate(basLaancAreaCoordModel.getLon(), basLaancAreaCoordModel.getLat());
for (BasLaancAreaCoordByElevModel coord : area.getCoordList()) {
Coordinate coords = new Coordinate(coord.getLon(), coord.getLat());
targetCoord.add(coords);
}
@ -631,7 +563,13 @@ public class BasLaancService {
return allowElevationList;
}
// TS 연동
/**
* TS 연동 - 장격증명 API
*
* @param idntfNumList
* @return
*/
@Deprecated
public BasLaancTsRs getTsValid(List<String> idntfNumList) {
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken();
AnctCstmrModel cstmrInfo = ptyCstmrQueryRepository.findByCstmrSno(cstmrSno);
@ -651,17 +589,22 @@ public class BasLaancService {
.build();
}
// 관제권 포함 여부
public List<BasLaancDuplicatedAirspaceRs> getDuplicatedAirspace(List<BasLaancAreaModel> rq) {
/**
* 구역좌표 - 관제권 포함 여부
*
* @param rq
* @return
*/
public List<BasLaancDuplicatedAirspaceRs> getDuplicatedAirspace(List<BasLaancAreaByAirspaceModel> rq) {
AirspaceUtils airspaceUtils = AirspaceUtils.getInstance();
List<BasLaancDuplicatedAirspaceRs> rs = new ArrayList<>();
for (BasLaancAreaModel area : rq) {
for (BasLaancAreaByAirspaceModel area : rq) {
//rq로 들어온 좌표로 버퍼좌표 생성
List<Coordinate> targetCoord = new ArrayList<>();
List<Coordinate> targetCoordBufferList = new ArrayList<>();
for (BasLaancAreaCoordModel basLaancAreaCoordModel : area.getCoordList()) {
for (BasLaancAreaCoordByAirspaceModel basLaancAreaCoordModel : area.getCoordList()) {
Coordinate coords = new Coordinate(basLaancAreaCoordModel.getLon(), basLaancAreaCoordModel.getLat());
targetCoord.add(coords);
}
@ -689,4 +632,146 @@ public class BasLaancService {
return rs;
}
/**
* QR code 생성 - 자격증명을 위한
* QR code 생성(PAV-KAC)* > qr code 스캔(사용자) > 자격정보 전송(TS) > return url 자격정보 받음(PAV-KAC) > 확인(자격정보 확인)
*
* @param rq
* @return
*/
public BasLaancQrcodeRs createQrcode(BasLaancQrcodeRq rq) {
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken();
String userId = jwtTokenUtil.getUserIdByToken();
AnctCstmrModel cstmrInfo = ptyCstmrQueryRepository.findByCstmrSno(cstmrSno);
String userCi = cstmrInfo.getIpinCi();
String idntfNum = null;
if (rq != null && rq.getIdntfNum() != null && !rq.getIdntfNum().isEmpty()) {
idntfNum = rq.getIdntfNum();
}
String confirmKey = UUID.randomUUID().toString();
String params = null;
byte[] qr = null;
try {
TsQrcodeRq tsRq = TsQrcodeRq.builder()
.rtnUrl(APP_HOST + TS_RETURN_URI)
.reqId(confirmKey)
.submittype(idntfNum)
.applyUser(userCi)
.build();
// params = JsonUtils.toJson(tsRq);
/*
tsdronewallet://kotsa.or.kr
? type=5
& rtnUrl= http://121.190.193.50:6081/api/external/laanc/vc/callback
& reqId=0b42b0af-3875-4a21-b57b-bb93ffcb3cfc
& submittype=C1CM0231251
& applyUser=dzT9zrm1JJRbrT1oRsUbvXYDfbAtXG5QOZjbIVHPaklSZ2PTw8ojYdJyeTrdQdtKIGFM5Z7xfrN/Crm6iGRLkA==
*/
params = UriComponentsBuilder
.fromUriString("tsdronewallet://kotsa.or.kr")
.queryParam("type", tsRq.getType())
.queryParam("rtnUrl", tsRq.getRtnUrl())
.queryParam("reqId", tsRq.getReqId())
.queryParam("submittype", tsRq.getSubmittype())
.queryParam("applyUser", tsRq.getApplyUser())
.build()
.toUriString();
qr = tsService.createQrcode(params);
} catch (WriterException | IOException e) {
log.error("ERROR: ", e);
throw new CustomException(ErrorCode.FAIL, "QR코드 생성 실패");
}
// db 저장 - confirmKey(uuid)
ComConfirmBas comConfirmBas = ComConfirmBas.builder()
.confirmKey(confirmKey)
.status("GENERATED")
.targetType("TS_QRCODE")
.rqData(params)
.createUserId(userId)
.updateUserId(userId)
.build();
comConfirmBasRepository.save(comConfirmBas);
log.info(">>> confirmKey [GENERATED] ", confirmKey);
return BasLaancQrcodeRs.builder()
.qrcode(qr)
.confirmKey(confirmKey)
.build();
}
/**
* QR code 확인
* QR code 촬영후 return url로 데이터 받은 이후 확인 프로세스
* QR code 생성(PAV-KAC) > qr code 스캔(사용자) > 자격정보 전송(TS) > return url 자격정보 받음(PAV-KAC) > 확인(자격정보 확인)*
*
* @param confirmKey
* @return
*/
public PilotValidRs checkQrcode(String confirmKey) {
log.info(">>> confirmKey : {}", confirmKey);
String userIdByToken = jwtTokenUtil.getUserIdByToken();
ComConfirmBas entity = comConfirmBasRepository.findFirstByConfirmKeyOrderByCreateDtDesc(confirmKey);
if(entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND, "QR코드 조회 실패");
if (!"RECEIVED".equals(entity.getStatus())){
Map<String, String> errorParam = new HashMap<>();
errorParam.put("status", entity.getStatus());
throw new CustomException(ErrorCode.DATA_NOTFIND, errorParam);
}
// TODO 일자 검증 - 3분 초과
Instant createDt = entity.getCreateDt().plus(3, ChronoUnit.MINUTES);
boolean flag = !createDt.isBefore(Instant.now());
if (!flag) {
entity.setStatus("EXPIRED");
entity.setUpdateUserId(userIdByToken);
comConfirmBasRepository.save(entity);
comConfirmBasRepository.flush();
throw new CustomException(ErrorCode.QR_EXPIRED, "QR 기간 만료");
}
PilotValidRs rs = null;
String rsData = entity.getRsData();
if(rsData != null && !rsData.isEmpty()){
rs = JsonUtils.fromJson(rsData, PilotValidRs.class);
}
return rs;
}
/**
* TS 비행계획서
* 드론원스탑에서 받은 데이터 받기
*
* @param tsPlanRq
*/
public void createPlanDos(TsPlanRq tsPlanRq) {
// convert
BasLaancPlanRq rq = tsPlanRq.toBasLaancPlanRq();
// 기존 로직대로 수행
BasLaancValidatedRs basLaancValidatedRs = this.validationLaanc(rq);
if (!basLaancValidatedRs.isValid()) {
log.info("ts dron one stop validation fail : {}", basLaancValidatedRs);
return;
}
try {
BasLaancLastRs flightPlan = this.createFlightPlan(rq);
} catch (Exception e) {
log.error("ts dron one stop create flight plan fail", e);
}
}
}

203
pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java

@ -1,44 +1,68 @@
package com.palnet.biz.api.cns.faq.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.palnet.biz.api.bas.laanc.model.BasLaancAprvRs;
import com.palnet.biz.api.cns.faq.model.FaqListModel;
import com.palnet.biz.api.cns.faq.model.FaqListRQModel;
import com.palnet.biz.api.cns.faq.model.FaqListRSModel;
import com.palnet.biz.api.cns.faq.model.FaqUpdateModel;
import com.palnet.biz.api.cns.faq.service.CnsFaqService;
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.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.data.domain.Page;
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 com.palnet.biz.api.cns.faq.model.FaqListRQModel;
import com.palnet.biz.api.cns.faq.model.FaqListModel;
import com.palnet.biz.api.cns.faq.service.CnsFaqService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@Slf4j
@Tag(name = "FAQ API", description = "FAQ 관련 API")
@RequiredArgsConstructor
@RequestMapping(value = "/api/bas/cns/faq")
@Tag(name = "FAQ", description = "FAQ 관련 API")
public class CnsFaqController {
private final CnsFaqService service;
/*FAQ 목록 조회*/
@Tag(name = "FAQ API", description = "FAQ 관련 API")
/**
* FAQ 목록 조회하는 기능,
* FaqListRQModel 값에 있는 조건값으로 조회함.
* @param model
* @return
*/
@GetMapping
@Operation(summary = "FAQ 조회", description = "FAQ를 조회하는 API 입니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
array = @io.swagger.v3.oas.annotations.media.ArraySchema(
schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = FaqListModel.class)))
})
})
public ResponseEntity<? extends BasicResponse> getFaqList(FaqListRQModel model) {
List<FaqListModel> result = null;
List<FaqListRSModel> result = null;
try {
result = service.getFaqList(model);
result = service.getFaqList(model); // FaQ 항목들 조회하는 기능
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -46,6 +70,13 @@ public class CnsFaqController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -54,14 +85,36 @@ public class CnsFaqController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/*FAQ 상세 조회*/
@Tag(name = "FAQ API", description = "FAQ 관련 API")
/**
* FAQ 상세 조회하는 기능,
* 일련번호[sno] 조회함.
* @param sno
* @return
*/
@GetMapping("/{sno}")
public ResponseEntity<? extends BasicResponse> getFaqDetail(@PathVariable("sno") int sno) {
FaqListModel result = null;
@Operation(summary = "FAQ 상세 조회", description = "특정 FAQ만 조회하는 API 입니다. sno 값 : 1, 2, 등 ....")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
array = @io.swagger.v3.oas.annotations.media.ArraySchema(
schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = FaqListModel.class)))
})
})
public ResponseEntity<? extends BasicResponse> getFaqDetail(
@Parameter(name="sno", description = "FAQ 시리얼 넘버", in = ParameterIn.PATH, example = "17")@PathVariable int sno) {
FaqListRSModel result = null;
try {
result = service.getFaqDetail(sno);
result = service.getFaqDetail(sno); // 일련번호[sno]로 상세정보를 조회하는 기능
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -69,6 +122,13 @@ public class CnsFaqController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -77,14 +137,35 @@ public class CnsFaqController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/*FAQ 작성*/
@Tag(name = "FAQ API", description = "FAQ 관련 API")
/**
* FAQ 작성하는 기능,
* FaqListModel모델에 있는 값으로 작성하는 기능.
* @param model
* @return
*/
@PostMapping
@Operation(summary = "FAQ 작성", description = "FAQ를 작성하는 API 입니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
array = @io.swagger.v3.oas.annotations.media.ArraySchema(
schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = SuccessResponse.class)))
})
})
public ResponseEntity<? extends BasicResponse> insertFaq(@RequestBody FaqListModel model) {
boolean result = false;
try {
result = service.insertFaq(model);
result = service.insertFaq(model); // FaQ 추가하는 기능
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -92,6 +173,13 @@ public class CnsFaqController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -102,14 +190,35 @@ public class CnsFaqController {
}
/*FAQ 업데이트*/
@Tag(name = "FAQ API", description = "FAQ 관련 API")
/**
* FAQ 업데이트 기능,
* FaqListModel 모델에 있는 값으로 업데이트함.
* @param model
* @return
*/
@PutMapping
public ResponseEntity<? extends BasicResponse> updateFaq(@RequestBody FaqListModel model) {
@Operation(summary = "FAQ 수정", description = "FAQ를 수정하는 API 입니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
array = @io.swagger.v3.oas.annotations.media.ArraySchema(
schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = SuccessResponse.class)))
})
})
public ResponseEntity<? extends BasicResponse> updateFaq(@RequestBody FaqUpdateModel model) {
boolean result = false;
try {
result = service.updateFaq(model);
result = service.updateFaq(model); // FaQ 수정하는 기능
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -117,6 +226,13 @@ public class CnsFaqController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -126,14 +242,26 @@ public class CnsFaqController {
}
/*FAQ 논리 삭제*/
@Tag(name = "FAQ API", description = "FAQ 관련 API")
/**
* FAQ 삭제하는 기능,
* 일련번호[sno] 삭제하는 기능.
* @param sno
* @return
*/
@DeleteMapping("/{sno}")
@Operation(summary = "FAQ 삭제", description = "특정 FAQ를 논리 삭제하는 API 입니다. sno 예시 : 1, 2, 등 ...")
public ResponseEntity<? extends BasicResponse> deleteFaq(@PathVariable("sno") int sno) {
// TODO 성공/실패 상태값 전송
try {
service.deleteFaq(sno);
service.deleteFaq(sno); // 일련번호[sno]로 삭제하는 기능
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -141,6 +269,13 @@ public class CnsFaqController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));

16
pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListModel.java

@ -2,31 +2,43 @@ package com.palnet.biz.api.cns.faq.model;
import java.time.Instant;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class FaqListModel {
@Schema(hidden = true)
private int faqSno;
@Schema(description = "FAQ 분류" , example = "장치신고")
private String category;
@Schema(description = "작성할 글의 제목" , example = "제목 샘플")
private String title;
@Schema(description = "작성할 글의 내용" , example = "내용 샘플")
private String content;
@Schema(hidden = true)
private int viewCnt;
@Schema(description = "표출 여부" , example = "Y")
private String expsrYn;
// private String delYn;
@Schema(hidden = true)
private String delYn;
@Schema(hidden = true)
private String createUserId;
@Schema(description = "생성일자", example = "2023-12-12", implementation = String.class)
private Instant createDt;
@Schema(hidden = true)
private String updateUserId;
@Schema(description = "업데이트 일자", example = "2023-12-12", implementation = String.class)
private Instant updateDt;
}

3
pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java

@ -1,12 +1,15 @@
package com.palnet.biz.api.cns.faq.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class FaqListRQModel {
@Schema(description = "FAQ 카테고리" , example = "비행승인")
private String category;
@Schema(description = "해당 단어가 포함된 제목 검색" , example = "비행")
private String word;
}

32
pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java

@ -0,0 +1,32 @@
package com.palnet.biz.api.cns.faq.model;
import java.time.Instant;
import lombok.Data;
@Data
public class FaqListRSModel {
private int faqSno;
private String category;
private String title;
private String content;
private int viewCnt;
private String expsrYn;
private String delYn;
private String createUserId;
private Instant createDt;
private String updateUserId;
private Instant updateDt;
}

46
pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqUpdateModel.java

@ -0,0 +1,46 @@
package com.palnet.biz.api.cns.faq.model;
import java.time.Instant;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class FaqUpdateModel {
@Schema(description = "수정할 글의 번호" , example = "17")
private int faqSno;
@Schema(description = "FAQ 분류" , example = "장치신고")
private String category;
@Schema(description = "수정할 글의 제목" , example = "제목 수정 샘플")
private String title;
@Schema(description = "수정할 글의 내용" , example = "내용 수정 샘플")
private String content;
@Schema(hidden = true)
private int viewCnt;
@Schema(description = "표출 여부" , example = "Y")
private String expsrYn;
@Schema(hidden = true)
private String delYn;
@Schema(hidden = true)
private String createUserId;
@Schema(hidden = true)
private Instant createDt;
@Schema(description = "수정한 사람" , example = "palnet")
private String updateUserId;
@Schema(description = "업데이트 일자")
private Instant updateDt;
}

40
pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java

@ -3,6 +3,8 @@ package com.palnet.biz.api.cns.faq.service;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.cns.faq.model.FaqListModel;
import com.palnet.biz.api.cns.faq.model.FaqListRQModel;
import com.palnet.biz.api.cns.faq.model.FaqListRSModel;
import com.palnet.biz.api.cns.faq.model.FaqUpdateModel;
import com.palnet.biz.jpa.entity.CnsFaqBas;
import com.palnet.biz.jpa.repository.cns.CnsFaqBasRepository;
import com.palnet.biz.jpa.repository.cns.CnsFaqQueryRepository;
@ -25,23 +27,38 @@ public class CnsFaqService {
private final CnsFaqBasRepository cnsFaqBasRepository;
private final JwtTokenUtil jwtTokenUtil;
public List<FaqListModel> getFaqList(FaqListRQModel model){
List<FaqListModel> result = query.getFaqList(model.getCategory(), model.getWord());
/**
* FaQ 항목들 조회하는 기능.
* @param model
* @return
*/
public List<FaqListRSModel> getFaqList(FaqListRQModel model){
List<FaqListRSModel> result = query.getFaqList(model.getCategory(), model.getWord());
if(result == null) result = new ArrayList<>();
return result;
}
public FaqListModel getFaqDetail(int sno){
/**
* 일련번호[sno] 상세정보를 조회하는 기능.
* @param sno
* @return
*/
public FaqListRSModel getFaqDetail(int sno){
cnsFaqBasRepository.updateViewCnt(sno);
FaqListModel result = query.getFaqDetail(sno);
FaqListRSModel result = query.getFaqDetail(sno);
if(result == null) throw new CustomException(ErrorCode.DATA_NO);
return result;
}
/**
* FaQ 추가하는 기능.
* @param model
* @return
*/
@Transactional
public boolean insertFaq(FaqListModel model){
String userId = jwtTokenUtil.getUserIdByToken();
@ -69,8 +86,13 @@ public class CnsFaqService {
}
}
/**
* FaQ 수정하는 기능.
* @param model
* @return
*/
@Transactional
public boolean updateFaq(FaqListModel model) {
public boolean updateFaq(FaqUpdateModel model) {
String userId = jwtTokenUtil.getUserIdByToken();
CnsFaqBas prevData = cnsFaqBasRepository.findById(model.getFaqSno()).orElseThrow(() -> new CustomException(ErrorCode.DATA_NO));
@ -92,6 +114,10 @@ public class CnsFaqService {
}
}
/**
* 일련번호[sno] 삭제하는 기능.
* @param sno
*/
public void deleteFaq(int sno) {
// TODO 반환값이 실행한 갯수인지 확인 필요

268
pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java

@ -1,30 +1,48 @@
package com.palnet.biz.api.cns.qna.controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.cns.qna.model.*;
import com.palnet.biz.api.cns.qna.model.QnaBasModel;
import com.palnet.biz.api.cns.qna.model.QnaDetailRSModel;
import com.palnet.biz.api.cns.qna.model.QnaInsertAnserRQModel;
import com.palnet.biz.api.cns.qna.model.QnaInsertRQModel;
import com.palnet.biz.api.cns.qna.model.QnaListAdminRQ;
import com.palnet.biz.api.cns.qna.model.QnaSelectListRQ;
import com.palnet.biz.api.cns.qna.service.CnsQnaService;
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.code.RSErrorCode;
import com.palnet.comn.exception.CustomException;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
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.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@Slf4j
@Tag(name = "QNA", description = "QNA 관련 API")
@RequiredArgsConstructor
@RestController
@Tag(name = "QNA", description = "QNA 관련 API")
@RequestMapping("/api/cns/qna")
public class CnsQnaController {
@ -32,14 +50,35 @@ public class CnsQnaController {
private final JwtTokenUtil jwtTokenUtil;
/**
* QnA 등록하는 기능,
* QnaInsertRQModel 모델에 요청값으로 QnA를 등록하는 기능.
* @param rq
* @return
*/
@PostMapping(consumes = "multipart/form-data")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 등록 - 사용자")
@Operation(summary = "QNA 등록 (사용자)", description = "사용자 권한으로 QNA를 등록하는 API 입니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
array = @io.swagger.v3.oas.annotations.media.ArraySchema(
schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = boolean.class)))
})
})
public ResponseEntity<? extends BasicResponse> insertQna(QnaInsertRQModel rq) {
boolean result = false;
try {
result = cnsQnaService.insertQna(rq);
result = cnsQnaService.insertQna(rq); // Qna 추가 하는기능
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -47,6 +86,13 @@ public class CnsQnaController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -55,15 +101,36 @@ public class CnsQnaController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/**
* QnA리스트 조회하는 기능[관리자],
* QnaListAdminRQ 조건값에 따라 조회함.
* @param rq
* @return
*/
@GetMapping
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 리스트 조회-관리자")
@Operation(summary = "QNA 리스트 조회 (관리자)", description = "QNA 리스트를 관리자 권한으로 조회하는 API 입니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
array = @io.swagger.v3.oas.annotations.media.ArraySchema(
schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = QnaBasModel.class)))
})
})
public ResponseEntity<? extends BasicResponse> selectQna(QnaListAdminRQ rq) {
List<QnaBasModel> result = new ArrayList<>();
try {
result = cnsQnaService.selectQnaList(rq);
result = cnsQnaService.selectQnaList(rq); // Qna리스트 조회하는 기능
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -71,6 +138,13 @@ public class CnsQnaController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -80,15 +154,36 @@ public class CnsQnaController {
}
/**
* QnA리스트 조회하는 기능[관리자],
* QnaSelectListRQ 값에 따라서 조회함.
* @param rq
* @return
*/
@GetMapping("/user")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 리스트 조회-사용자")
@Operation(summary = "QNA 리스트 조회 (사용자)", description = "QNA 리스트를 사용자 권한으로 조회하는 API 입니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
array = @io.swagger.v3.oas.annotations.media.ArraySchema(
schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = QnaBasModel.class)))
})
})
public ResponseEntity<? extends BasicResponse> selectQnaForUser(QnaSelectListRQ rq) {
List<QnaBasModel> result = new ArrayList<>();
try {
result = cnsQnaService.selectQnaForUser(rq);
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -96,6 +191,13 @@ public class CnsQnaController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -105,14 +207,27 @@ public class CnsQnaController {
}
/**
* QnA 상세보기 기능,
* QnA일련번호[qnaSno]값으로 조회함.
* @param qnaSno
* @return
*/
@GetMapping("/{qnaSno}")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 상세보기")
public ResponseEntity<? extends BasicResponse> detailQna(@PathVariable int qnaSno) {
@Operation(summary = "QNA 리스트 상세 조회", description = "QNA 리스트를 상세하게 조회하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> detailQna(@Parameter(name="qnaSno", description = "QnA일련번호", in = ParameterIn.PATH, example = "295") @PathVariable int qnaSno) {
QnaDetailRSModel result = null;
try {
result = cnsQnaService.getQnaDetail(qnaSno);
result = cnsQnaService.getQnaDetail(qnaSno); // Qna 상세불러오기 기능
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -120,6 +235,13 @@ public class CnsQnaController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -128,14 +250,35 @@ public class CnsQnaController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/**
* QnA수정 하는 기능[사용자],
* QnaInsertRQModel 모델에 입력받은 사항들을 수정함.
* @param rq
* @return
*/
@PutMapping(consumes = "multipart/form-data")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 수정 - 사용자")
@Operation(summary = "QNA 수정 (사용자)", description = "QNA를 사용자 권한으로 수정하는 API 입니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
array = @io.swagger.v3.oas.annotations.media.ArraySchema(
schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = boolean.class)))
})
})
public ResponseEntity<? extends BasicResponse> updateQna(QnaInsertRQModel rq) {
boolean result = false;
try {
result = cnsQnaService.updateQna(rq);
result = cnsQnaService.updateQna(rq); // Qna 업데이트하는 기능
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -143,6 +286,13 @@ public class CnsQnaController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -152,15 +302,28 @@ public class CnsQnaController {
}
/**
* QnA삭제하는 기능,
* QnA일련번호[qnaSno] 삭제함.
* @param qnaSno
* @return
*/
@DeleteMapping("/{qnaSno}")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 삭제하기")
public ResponseEntity<? extends BasicResponse> deleteQna(@PathVariable int qnaSno) {
@Operation(summary = "QNA 삭제", description = "QNA를 삭제하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> deleteQna(@Parameter(name="qnaSno", description = "QnA일련번호", in = ParameterIn.PATH, example = "17") @PathVariable int qnaSno) {
// TODO 관리자만 삭제 가능 여부인지 확인 필요
boolean result = false;
try {
result = cnsQnaService.deleteQna(qnaSno);
result = cnsQnaService.deleteQna(qnaSno); // Qna 삭제하기, file들도 모두 논리삭제하는 기능.
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -168,6 +331,13 @@ public class CnsQnaController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -176,9 +346,22 @@ public class CnsQnaController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/**
* QnA 답변등록하는 기능[관리자],
* QnaInsertAnserRQModel에 입력받은 값으로 답변을 등록함.
* @param rq
* @return
*/
@PutMapping("/answer")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 답변 등록 - 관리자")
@Operation(summary = "QNA 답변 등록(관리자)", description = "QNA에 대한 답변을 관리자 권한으로 등록하는 API 입니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
array = @io.swagger.v3.oas.annotations.media.ArraySchema(
schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = boolean.class)))
})
})
public ResponseEntity<? extends BasicResponse> insertAnswer(@RequestBody QnaInsertAnserRQModel rq) {
// TODO 추후 auth -> role 체크로 변경
boolean result = false;
@ -188,8 +371,16 @@ public class CnsQnaController {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(new ErrorResponse(RSErrorCode.AUTH_ERROR));
}
result = cnsQnaService.insertAnswer(rq);
result = cnsQnaService.insertAnswer(rq); // 답변추가하는 기능.
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -197,6 +388,13 @@ public class CnsQnaController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -205,4 +403,4 @@ public class CnsQnaController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
}
}

4
pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertAnserRQModel.java

@ -1,17 +1,21 @@
package com.palnet.biz.api.cns.qna.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class QnaInsertAnserRQModel {
@Schema(description = "답변을 달 qna 번호" , example = "16")
private Integer qnaSno;
// private Integer targetSno; // 상위 Qna 번호
@Schema(description = "답변 내용" , example = "답변 샘플입니다.")
private String anserContent;
// private String anserUserNm;
// private Instant anserProcDt;
@Schema(description = "답변 상태" , example = "Y")
private String anserStatus;
}

4
pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaListAdminRQ.java

@ -1,15 +1,19 @@
package com.palnet.biz.api.cns.qna.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class QnaListAdminRQ {
// 문의유형
@Schema(description = "검색 타입" , example = "불만")
private String category;
// 답변상태
@Schema(description = "답변 여부" , example = "Y")
private String anserStatus;
// 작성자
@Schema(description = "작성자" , example = "팔네트웍스")
private String createUserNm;
}

10
pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java

@ -1,12 +1,18 @@
package com.palnet.biz.api.cns.qna.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class QnaSelectListRQ {
@Schema(description = "검색 타입" , example = "TITLE")
private String searchType;
private String word;
@Schema(description = "검색어" , example = "드론")
private String word;
@Schema(description = "카테고리" , example = "문의")
private String category;
}
}

35
pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java

@ -41,11 +41,11 @@ public class CnsQnaService {
private final JwtTokenUtil jwtTokenUtil;
/**
* Qna 삭제하기, file들도 모두 논리삭제함.
*
* Qna 삭제하기, file들도 모두 논리삭제하는 기능.
* @param qnaSno
* @return
*/
// @Transactional는 데이터베이스의 정합성을 위해 사용합니다, 추가 수정 삭제 등에서 사용합니다, 이 기능에서는 삭제컬럼은 수정했기 때문에 사용했습니다.
@Transactional
public boolean deleteQna(int qnaSno) {
@ -62,11 +62,11 @@ public class CnsQnaService {
}
/**
* Qna 업데이트하기
*
* Qna 업데이트하는 기능.
* @param rq
* @return
*/
// @Transactional는 데이터베이스의 정합성을 위해 사용합니다, 추가 수정 삭제 등에서 사용합니다, 이 기능에서는 수정하기 때문에 사용합니다.
@Transactional
public boolean updateQna(QnaInsertRQModel rq) {
@ -77,7 +77,7 @@ public class CnsQnaService {
List<Integer> prevFileSnoList = new ArrayList<>();
List<Integer> currentFileSnoList = new ArrayList<>();
if (entity.getFileGroupNo() != null) {
List<ComnFileModel> prevFileInfos = comnFileService.getNormalFileListByGroupNo(entity.getFileGroupNo());
List<ComnFileModel> prevFileInfos = comnFileService.getNormalFileListByGroupNo(entity.getFileGroupNo()); // 파일그룹번호[fileGroupNo]에 해당하는 파일등 모두 가져오는 기능.
prevFileSnoList = prevFileInfos.stream().map(ComnFileModel::getFileSno).collect(Collectors.toList());
}
if (rq.getFileInfos() != null) {
@ -112,20 +112,22 @@ public class CnsQnaService {
}
/**
* Qna 상세불러오기
*
* Qna 상세불러오기 기능.
* @param qnaSno
* @return
*/
@Transactional // 조회수 증가하기떄문
// @Transactional는 데이터베이스의 정합성을 위해 사용합니다, 추가 수정 삭제 등에서 사용합니다, 이 기능에서는 조회수 증가하기 떄문에 사용했습니다.
@Transactional
public QnaDetailRSModel getQnaDetail(int qnaSno) {
cnsQnaBasRepository.pulsViewCount(qnaSno);
CnsQnaBas entity = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSnoAndDelYnAndExpsrYn(qnaSno, 0, "N", "Y");
if(entity == null) throw new CustomException(ErrorCode.DATA_NO);
List<ComnFileModel> files = null;
if (entity.getFileGroupNo() != null && entity.getFileGroupNo() != 0)
files = comnFileService.getNormalFileListByGroupNo(entity.getFileGroupNo());
files = comnFileService.getNormalFileListByGroupNo(entity.getFileGroupNo()); // 파일그룹번호[fileGroupNo]에 해당하는 파일등 모두 가져오는 기능.
QnaDetailRSModel model = CnsQnaMapper.MAPPER.toModel(entity);
PtyCstmrBas user = ptyCstmrBasRepository.findByUserId(entity.getCreateUserId()).orElse(null);
@ -141,7 +143,7 @@ public class CnsQnaService {
}
/**
* Qna리스트 조회
* Qna리스트 조회하는 기능[관리자].
*
* @param rq
* @return
@ -150,14 +152,18 @@ public class CnsQnaService {
return cnsQnaQueryRepository.getQnaList(rq);
}
/**
* Qna리스트 조회하는 기능[유저]
* @param rq
* @return
*/
public List<QnaBasModel> selectQnaForUser(QnaSelectListRQ rq) {
String userId = jwtTokenUtil.getUserIdByToken();
return cnsQnaQueryRepository.getQnaListForUser(rq, userId);
}
/**
* QnaInsert
*
* Qna 추가 하는기능.
* @param rq
* @return
*/
@ -188,6 +194,11 @@ public class CnsQnaService {
}
/**
* 답변추가하는 기능.
* @param rq
* @return
*/
public boolean insertAnswer(QnaInsertAnserRQModel rq) {
CnsQnaBas entity = cnsQnaBasRepository.findByQnaSnoAndDelYnAndExpsrYn(rq.getQnaSno(), "N", "Y");
if (entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND);

61
pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/controller/ComnCoordinateController.java

@ -0,0 +1,61 @@
package com.palnet.biz.api.comn.coordinate.controller;
import com.palnet.biz.api.comn.coordinate.model.CompotentAuthorityRQ;
import com.palnet.biz.api.comn.coordinate.model.CompotentAuthorityRS;
import com.palnet.biz.api.comn.coordinate.service.ComnCoordinateService;
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.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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/comn/coordinate")
@Slf4j
@Tag(name = "공통 API", description = "공통 API")
public class ComnCoordinateController {
private final ComnCoordinateService comnCoordinateService;
/**
* 좌표로 관할기관 가져오기
* @param rq
* @return
*/
@Operation(summary = "좌표로 관할 기관청 가져오기", description = "좌표로 관할 기관청 가져오기")
@GetMapping("/comptent-authority")
public ResponseEntity<? extends BasicResponse> getCompetentAuthority(CompotentAuthorityRQ rq){
CompotentAuthorityRS result = new CompotentAuthorityRS();
try {
result = comnCoordinateService.getCompetentAuthority(rq);
} catch (CustomException e) {
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} 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));
}
}

12
pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/model/CompotentAuthorityRQ.java

@ -0,0 +1,12 @@
package com.palnet.biz.api.comn.coordinate.model;
import lombok.Data;
@Data
public class CompotentAuthorityRQ {
private Double lat;
private Double lon;
}

14
pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/model/CompotentAuthorityRS.java

@ -0,0 +1,14 @@
package com.palnet.biz.api.comn.coordinate.model;
import java.util.List;
import com.palnet.biz.jpa.entity.FltCptAuthBas;
import lombok.Data;
@Data
public class CompotentAuthorityRS {
private List<FltCptAuthBas> fltCptpAuthBasList;
}

105
pav-server/src/main/java/com/palnet/biz/api/comn/coordinate/service/ComnCoordinateService.java

@ -0,0 +1,105 @@
package com.palnet.biz.api.comn.coordinate.service;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.json.simple.JSONObject;
import org.json.simple.parser.ParseException;
import org.locationtech.jts.geom.Coordinate;
import org.springframework.stereotype.Service;
import com.palnet.biz.api.comn.coordinate.model.CompotentAuthorityRQ;
import com.palnet.biz.api.comn.coordinate.model.CompotentAuthorityRS;
import com.palnet.biz.jpa.entity.FltCptAuthBas;
import com.palnet.biz.jpa.repository.flt.FltCptAuthAdminDistrictBasQueryRepository;
import com.palnet.comn.utils.FlightUtils;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class ComnCoordinateService {
private final FltCptAuthAdminDistrictBasQueryRepository ffFltCptAuthAdminDistrictBasQueryRepository;
public CompotentAuthorityRS getCompetentAuthority(CompotentAuthorityRQ rq){
Coordinate coord = new Coordinate(rq.getLon(), rq.getLat());
JSONObject code = new JSONObject();
try {
code = FlightUtils.getPlace(coord, false);
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
String[] scope = {"ctprvn", "sig", "emd", "li"};
final String cd = (String) code.get("CD");
Set<FltCptAuthBas> fltCptAuthBas = new HashSet<FltCptAuthBas>();
for(int i = 0; i < scope.length; i++){
String cdParam = this.codeParsing(cd, scope[i]);
List<FltCptAuthBas> authList = ffFltCptAuthAdminDistrictBasQueryRepository.geFltCptAuthBas(cdParam);
fltCptAuthBas.addAll(new HashSet<FltCptAuthBas>(authList));
}
CompotentAuthorityRS result = new CompotentAuthorityRS();
result.setFltCptpAuthBasList(new ArrayList<>(fltCptAuthBas));
return result;
}
private String codeParsing(String cd, String scope){
switch (scope) {
case "ctprvn":
if(cd.length() < 2) break;
cd = cd.substring(0, 2);
break;
case "sig":
if(cd.length() < 5) break;
cd = cd.substring(0, 5);
break;
case "emd":
if(cd.length() < 8) break;
cd = cd.substring(0, 8);
break;
case "li":
if(cd.length() < 10) break;
cd = cd.substring(0, 10);
break;
}
int length = cd.length();
int maxLength = 10;
int difference = maxLength - length;
StringBuilder sb = new StringBuilder();
sb.append(cd);
for(int i = 0; i < difference; i++){
sb.append("0");
}
return sb.toString();
}
}

78
pav-server/src/main/java/com/palnet/biz/api/comn/elev/controller/ComnElevController.java

@ -8,7 +8,8 @@ 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.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -32,16 +33,28 @@ public class ComnElevController {
private final ComnElevService comnElevService;
/**
*
* @param rq
* @return
*/
@PostMapping(value = "/ground")
@ApiOperation(value = "지표면 고도 가져오기")
@Tag(name = "공통 API", description = "공통 API")
@Operation(summary = "특정 좌표의 고도 가져오기", description = "특정 좌표의 해수면고도(MSL)를 입력하면 지표면고도(AGL)로 변환해 주는 API 입니다.")
public ResponseEntity<? extends BasicResponse> getGroundElev(@RequestBody List<ComnGroundElevRq> rq) {
List<ComnElevRs> rs = null;
try {
log.debug(">>> rq : {}", rq);
rs = comnElevService.getGroundElev(rq);
rs = comnElevService.getGroundElev(rq); // 지표면 고도 가져오는 기능
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -49,6 +62,13 @@ public class ComnElevController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -57,16 +77,28 @@ public class ComnElevController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
/**
* MSL[해발고도] AGL[지표면고도] 변환하는 기능.
* @param rq
* @return
*/
@PostMapping(value = "/to/agl")
@ApiOperation(value = "msl을 agl로 변환")
@Tag(name = "공통 API", description = "공통 API")
@Operation(summary = "해수면고도 -> 지표면고도 변환", description = "특정 좌표의 해수면고도(MSL)를 지표면고도(AGL)로 변환해 주는 API 입니다.")
public ResponseEntity<? extends BasicResponse> convertMslToAgl(@RequestBody List<ComnElevRq> rq) {
List<ComnElevRs> rs = null;
try {
log.debug(">>> rq : {}", rq);
rs = comnElevService.convertMslToAgl(rq);
rs = comnElevService.convertMslToAgl(rq); // msl 기준 고도 > agl 기준 고도 변환하는 기능
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -74,6 +106,13 @@ public class ComnElevController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
@ -82,16 +121,28 @@ public class ComnElevController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
/**
* AGL[지표면고도] MSL[해발고도] 변환하는 기능.
* @param rq
* @return
*/
@PostMapping(value = "/to/msl")
@ApiOperation(value = "agl을 msl로 변환")
@Tag(name = "공통 API", description = "공통 API")
@Operation(summary = "지표면고도 -> 해수면고도 변환", description = "특정 좌표의 지표면고도(AGL)를 해수면고도(MSL)로 변환해 주는 API 입니다.")
public ResponseEntity<? extends BasicResponse> convertAglToMsl(@RequestBody List<ComnElevRq> rq) {
List<ComnElevRs> rs = null;
try {
log.debug(">>> rq : {}", rq);
rs = comnElevService.convertAglToMsl(rq);
rs = comnElevService.convertAglToMsl(rq); // agl 기준 고도 > msl 기준 고도 변환하는 기능
} catch (CustomException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
@ -99,6 +150,13 @@ public class ComnElevController {
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));

7
pav-server/src/main/java/com/palnet/biz/api/comn/elev/model/ComnElevRq.java

@ -1,5 +1,6 @@
package com.palnet.biz.api.comn.elev.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -10,7 +11,13 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor
@Builder
public class ComnElevRq {
@Schema(description = "위도" , example = "37.520930", implementation = Double.class)
private Double lat;
@Schema(description = "경도" , example = "126.605684", implementation = Double.class)
private Double lon;
@Schema(description = "고도" , example = "100.0", implementation = Double.class)
private Double elev;
}

5
pav-server/src/main/java/com/palnet/biz/api/comn/elev/model/ComnGroundElevRq.java

@ -1,5 +1,6 @@
package com.palnet.biz.api.comn.elev.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -10,6 +11,10 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor
@Builder
public class ComnGroundElevRq {
@Schema(description = "위도" , example = "37.520930", implementation = Double.class)
private Double lat;
@Schema(description = "경도" , example = "126.605684", implementation = Double.class)
private Double lon;
}

20
pav-server/src/main/java/com/palnet/biz/api/comn/elev/service/ComnElevService.java

@ -17,12 +17,16 @@ import java.util.stream.Collectors;
@Service
public class ComnElevService {
// 지표면 고도 가져오기
/**
* 지표면 고도 가져오는 기능.
* @param rq
* @return
*/
public List<ComnElevRs> getGroundElev(List<ComnGroundElevRq> rq) {
DigitalElevationModelUtils demUtils = DigitalElevationModelUtils.getInstance();
List<ComnElevRs> rs = rq.stream().map(elev -> {
Coordinate coord = new Coordinate(elev.getLon(), elev.getLat());
Double groundElevation = demUtils.getGroundElevation(coord);
Double groundElevation = demUtils.getGroundElevation(coord); // 좌표로 고도값을 구하는 기능.[좌표계는 EPSG:4326으로 해야합니다]
return ComnElevRs.builder()
.elevType("ground")
.lat(elev.getLat())
@ -33,7 +37,11 @@ public class ComnElevService {
return rs;
}
// msl 기준 고도 > agl 기준 고도 변환
/**
* msl 기준 고도 > agl 기준 고도 변환하는 기능.
* @param rq
* @return
*/
public List<ComnElevRs> convertMslToAgl(List<ComnElevRq> rq) {
DigitalElevationModelUtils demUtils = DigitalElevationModelUtils.getInstance();
List<ComnElevRs> rs = rq.stream().map(elev -> {
@ -52,7 +60,11 @@ public class ComnElevService {
return rs;
}
// agl 기준 고도 > msl 기준 고도 변환
/**
* agl 기준 고도 > msl 기준 고도 변환하는 기능.
* @param rq
* @return
*/
public List<ComnElevRs> convertAglToMsl(List<ComnElevRq> rq) {
DigitalElevationModelUtils demUtils = DigitalElevationModelUtils.getInstance();
List<ComnElevRs> rs = rq.stream().map(elev -> {

39
pav-server/src/main/java/com/palnet/biz/api/comn/file/controller/ComnFileController.java

@ -1,6 +1,11 @@
package com.palnet.biz.api.comn.file.controller;
import com.palnet.biz.api.comn.file.service.ComnFileService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
@ -23,25 +28,53 @@ import org.springframework.web.bind.annotation.RestController;
@RequiredArgsConstructor
@RequestMapping("/api/comn/file")
@RestController
@Tag(name ="파일", description = "파일 관련 API")
public class ComnFileController {
private final ComnFileService comnFileService;
/**
* 사용 안함[@Deprecated]
* 파일일련번호[fileSno] 파일 다운로드 하는 기능.
* QueryParam 방식으로 parameter를 받음.
* @param fileSno
*/
@Deprecated
@GetMapping("/download")
public void downloadPDF(int fileSno) {
@Operation(summary = "파일다운로드[사용하지 않음]", description = "미사용")
public void downloadPDF(@Parameter(name="fileSno", description = "파일일련번호", in = ParameterIn.QUERY, example = "117") int fileSno) {
try {
comnFileService.fileDownload(fileSno);
comnFileService.fileDownload(fileSno); // 파일 일련번호[fileSno]로 파일 다운로드하는 기능
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악함
*/
log.error("ERROR: ", e);
}
}
/**
* 파일일련번호[fileSno] 파일 다운로드 하는 기능.
* @param fileSno
*/
@GetMapping("/download/{fileSno}")
public void download(@PathVariable("fileSno") int fileSno) {
@Operation(summary = "파일다운로드", description = "파일 일련번호로 파일을 다운로드 합니다.")
public void download(@Parameter(name="fileSno", description = "파일일련번호", in = ParameterIn.PATH, example = "117") @PathVariable("fileSno") int fileSno) {
try {
comnFileService.fileDownload(fileSno);
} catch (Exception e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악함
*/
log.error("ERROR: ", e);
}
}

25
pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java

@ -146,20 +146,19 @@ public class ComnFileService {
}
/**
* 파일 다운로드
*
* 파일 일련번호[fileSno] 파일 다운로드하는 기능.
* @param fileSno
*/
public void fileDownload(int fileSno) {
ComFileBas comFileBas = comFileBasRepository.findById(fileSno).orElse(null);
ComFileBas comFileBas = comFileBasRepository.findById(fileSno).orElse(null); // 파일정보를 데이터베이스에서 조회함.
if (comFileBas == null) throw new CustomException(ErrorCode.DATA_NOTFIND);
InputStream inputStream = null;
OutputStream outputStream = null;
try {
File pdfFile = new File(comFileBas.getFilePath() + comFileBas.getFileSaveNm());
File pdfFile = new File(comFileBas.getFilePath() + comFileBas.getFileSaveNm()); // 파일경로에 맞춰 파일데이터를 PC에서 가져옴
inputStream = new FileInputStream(pdfFile);
String fileOriName = comFileBas.getFileOriNm();
@ -176,7 +175,8 @@ public class ComnFileService {
byte[] buffer = new byte[1024]; //1KB 설정
int length;
while ((length = inputStream.read(buffer)) != -1) {
// 요청한 사용자에게 파일데이터 전송
while ((length = inputStream.read(buffer)) != -1) {
outputStream.write(buffer);
}
@ -185,6 +185,7 @@ public class ComnFileService {
} catch (IOException e) {
e.printStackTrace();
} finally {
// INPUT, OUTPUT의 열어놨던 스트림들을 최종적으로 모두 닫음
try {
if (outputStream != null) {
Objects.requireNonNull(outputStream).flush();
@ -351,6 +352,13 @@ public class ComnFileService {
return true;
}
/**
* 파일일련번호 배열로 삭제처리 진행함.
* @param fileSnoList
* @return
*/
// @Transactional는 데이터베이스의 정합성을 위해 사용합니다, 추가 수정 삭제 등에서 사용합니다, 이 기능에서는 삭제컬럼은 수정했기 때문에 사용했습니다.
@Transactional
public boolean deleteFiles(List<Integer> fileSnoList){
@ -389,6 +397,11 @@ public class ComnFileService {
return true;
}
/**
* 파일그룹번호[fileGroupNo] 해당하는 파일등 모두 가져오는 기능.
* @param fileGroupNo
* @return
*/
public List<ComnFileModel> getNormalFileListByGroupNo(Integer fileGroupNo) {
List<ComFileBas> files = comFileBasRepository.findByFileGroupNoAndDelYn(fileGroupNo, "N");
List<ComnFileModel> result = new ArrayList<>();

8
pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnPagingModel.java

@ -1,13 +1,21 @@
package com.palnet.biz.api.comn.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class ComnPagingModel {
@Schema(description = "데이터 표출 수" , example = "10")
private int record = 10; // 데이터 표출 수
@Schema(description = "현재 페이지" , example = "1")
private int page = 0; // 현재 페이지
@Schema(description = "시작위치" , example = "0")
private int stIdx = 0; // 시작 위치
@Schema(description = "끝 위치" , example = "0")
private int endIdx = 0; // 끝 위치
}

6
pav-server/src/main/java/com/palnet/biz/api/comn/model/ComnRqModel.java

@ -1,17 +1,23 @@
package com.palnet.biz.api.comn.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class ComnRqModel extends ComnPagingModel {
@Schema(description = "검색 시작 날짜" , example = "2023-11-01" , implementation = String.class)
private String stDate;
@Schema(description = "검색 종료 날짜" , example = "2023-11-30" , implementation = String.class)
private String endDate;
@Schema(hidden = true)
private String search1;
@Schema(hidden = true)
private String searchType1;
}

11
pav-server/src/main/java/com/palnet/biz/api/comn/response/SuccessResponse.java

@ -1,15 +1,20 @@
package com.palnet.biz.api.comn.response;
import java.util.List;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper=false)
public class SuccessResponse<T> extends BasicResponse {
@Schema(description = "응답 데이터 건수")
private int count;
@Schema(description = "응답 데이터")
private T data;
public SuccessResponse(T data) {

14
pav-server/src/main/java/com/palnet/biz/api/comn/sms/service/ComnSmsService.java

@ -33,6 +33,10 @@ public class ComnSmsService {
private final SuredataRepository suredataRepository;
/**
* 비행승인시 SMS를 보내는 기능.
* @param model
*/
public void sendLaancAprovSms(ComnSmsLaancAprovModel model) {
log.info("sendSms : {}", model);
ClassPathResource resource = new ClassPathResource("templates/sms/SmsLaancAprov.txt");
@ -78,6 +82,12 @@ public class ComnSmsService {
suredataRepository.save(entity);
}
/**
* 내부적으로 사용할 메소드, 메세지 템플릿과, 객체의 파라미터를 매핑함.
* @param templateStr
* @param model
* @return
*/
private String getMessage(String templateStr, ComnSmsLaancAprovModel model) {
String message = templateStr;
message = message.replace("${pilotName}", model.getPilotName());
@ -89,6 +99,10 @@ public class ComnSmsService {
return message;
}
/**
* 데이터베이스에 추가할 메세지 발송이력 데이터를 셋팅함.
* @return
*/
public SuredataEntity getInitialEntity() {
String nowStr = InstantUtils.toDatetimeStringByFormat(Instant.now(), "yyyyMMddHHmmss");
SuredataEntity entity = new SuredataEntity();

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save