|
|
|
@ -9,6 +9,9 @@ import FlightArea from '../map/FlightArea';
|
|
|
|
|
import { ErrorModal } from '../../modal/ErrorModal'; |
|
|
|
|
import { InfoModal } from '../../modal/InfoModal'; |
|
|
|
|
import { LaancModal } from '../LaancModal'; |
|
|
|
|
import { FLIGHT_PLAN_AREA_BUFFER_LIST } from '../../../modules/basis/flight/actions/basisFlightAction'; |
|
|
|
|
import LaancQr from '../../../components/laanc/LaancQr'; |
|
|
|
|
import axios from '../../../modules/utils/customAxiosUtil'; |
|
|
|
|
import moment from 'moment'; |
|
|
|
|
import { |
|
|
|
|
Row, |
|
|
|
@ -21,18 +24,18 @@ import {
|
|
|
|
|
UncontrolledPopover, |
|
|
|
|
PopoverBody, |
|
|
|
|
Label, |
|
|
|
|
Input |
|
|
|
|
Input, |
|
|
|
|
Modal |
|
|
|
|
} from 'reactstrap'; |
|
|
|
|
|
|
|
|
|
export default function LaancStep1({ |
|
|
|
|
handleChange, |
|
|
|
|
handlerNext, |
|
|
|
|
data, |
|
|
|
|
detailData, |
|
|
|
|
setDetailData, |
|
|
|
|
centeredModal, |
|
|
|
|
setCenteredModal, |
|
|
|
|
handlerStep, |
|
|
|
|
currentParm, |
|
|
|
|
handlerLaancClose, |
|
|
|
|
handlerBufferApply |
|
|
|
|
handlerLaancClose |
|
|
|
|
}) { |
|
|
|
|
const dispatch = useDispatch(); |
|
|
|
|
|
|
|
|
@ -56,6 +59,10 @@ export default function LaancStep1({
|
|
|
|
|
const queryParams = new URLSearchParams(location.search); |
|
|
|
|
const mapParam = queryParams.get('map'); |
|
|
|
|
|
|
|
|
|
// qr 인증 데이터
|
|
|
|
|
const [qrData, setQrData] = useState(); |
|
|
|
|
// qr 팝업
|
|
|
|
|
const [isPopUp, setIsPopUp] = useState(false); |
|
|
|
|
// 아이콘 팝오버
|
|
|
|
|
const [popoverCommercial, setPopoverCommercial] = useState(false); |
|
|
|
|
const [popoverSchFltStDt, setPopoverSchFltStDt] = useState(false); |
|
|
|
@ -80,8 +87,8 @@ export default function LaancStep1({
|
|
|
|
|
url: '' |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
// URL 쿼리 파라미터 중 'map' 값을 가져옵니다.
|
|
|
|
|
useEffect(() => { |
|
|
|
|
// URL 쿼리 파라미터 중 'map' 값을 가져옵니다.
|
|
|
|
|
if (!currentParm) setCenteredModal(mapParam != 'true' ? false : true); |
|
|
|
|
}, [location]); |
|
|
|
|
|
|
|
|
@ -99,6 +106,330 @@ export default function LaancStep1({
|
|
|
|
|
} |
|
|
|
|
}, [areaCoordList]); |
|
|
|
|
|
|
|
|
|
// 적용 버튼 Reducer 업데이트 될때마다 검사 로직
|
|
|
|
|
useEffect(() => { |
|
|
|
|
if (detailData.areaList[0].fltElev != 0) { |
|
|
|
|
const maxElev = 150; |
|
|
|
|
const controlledAltitudeExceededWarning = |
|
|
|
|
laancArea?.duplicated && |
|
|
|
|
parseInt( |
|
|
|
|
detailData.areaList[0].fltElev.replace('/^0+/', 'm', ''), |
|
|
|
|
10 |
|
|
|
|
) >= laancElev[0] && |
|
|
|
|
parseInt(detailData.areaList[0].fltElev.replace('/^0+/', 'm', ''), 10) < |
|
|
|
|
maxElev; |
|
|
|
|
|
|
|
|
|
if (controlledAltitudeExceededWarning) { |
|
|
|
|
setIsErrorModal({ |
|
|
|
|
isOpen: true, |
|
|
|
|
title: '검토 결과 사전안내', |
|
|
|
|
desc: ( |
|
|
|
|
<> |
|
|
|
|
유효성 검사에 실패하여 미 승인 대상입니다. |
|
|
|
|
<br /> |
|
|
|
|
제출하신 비행계획서의 고도는 {laancElev[0]}m이하에서만 비행이 |
|
|
|
|
가능합니다. |
|
|
|
|
<br /> |
|
|
|
|
고도 설정을 다시 확인해주시기 바랍니다. |
|
|
|
|
</> |
|
|
|
|
) |
|
|
|
|
}); |
|
|
|
|
handleChange({ |
|
|
|
|
type: 'area', |
|
|
|
|
name: 'fltElev', |
|
|
|
|
value: 0 |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}, [[laancElev]]); |
|
|
|
|
|
|
|
|
|
// 비행계획서 작성 핸들러
|
|
|
|
|
const handleChange = ({ name, value, type, index, pIndex }) => { |
|
|
|
|
const arrName = `${type}List`; |
|
|
|
|
|
|
|
|
|
switch (type) { |
|
|
|
|
case 'coord': |
|
|
|
|
setDetailData(prevState => { |
|
|
|
|
return { |
|
|
|
|
...prevState, |
|
|
|
|
areaList: [ |
|
|
|
|
{ |
|
|
|
|
...prevState.areaList[0], |
|
|
|
|
|
|
|
|
|
coordList: value |
|
|
|
|
} |
|
|
|
|
] |
|
|
|
|
}; |
|
|
|
|
}); |
|
|
|
|
break; |
|
|
|
|
case 'area': |
|
|
|
|
if (name === 'fltMethod' && value != '직접입력') { |
|
|
|
|
setDetailData(prevState => { |
|
|
|
|
const arr = [...prevState[arrName]]; |
|
|
|
|
const updatedetailData = { |
|
|
|
|
...prevState[arrName][0], |
|
|
|
|
[name]: value, |
|
|
|
|
fltMothoeRm: '' |
|
|
|
|
}; |
|
|
|
|
arr[0] = updatedetailData; |
|
|
|
|
return { |
|
|
|
|
...prevState, |
|
|
|
|
[arrName]: arr |
|
|
|
|
}; |
|
|
|
|
}); |
|
|
|
|
} else if ( |
|
|
|
|
detailData.areaList[0].areaType === 'LINE' || |
|
|
|
|
name === 'bufferZone' |
|
|
|
|
) { |
|
|
|
|
setDetailData(prevState => { |
|
|
|
|
const arr = [...prevState[arrName]]; |
|
|
|
|
const prevBufferZone = prevState[arrName][0].bufferZone; |
|
|
|
|
const updatedetailData = { |
|
|
|
|
...prevState[arrName][0], |
|
|
|
|
[name]: value, |
|
|
|
|
concatBufferZone: prevBufferZone |
|
|
|
|
}; |
|
|
|
|
arr[0] = updatedetailData; |
|
|
|
|
return { |
|
|
|
|
...prevState, |
|
|
|
|
[arrName]: arr |
|
|
|
|
}; |
|
|
|
|
}); |
|
|
|
|
} else { |
|
|
|
|
setDetailData(prevState => { |
|
|
|
|
const arr = [...prevState[arrName]]; |
|
|
|
|
const updatedetailData = { |
|
|
|
|
...prevState[arrName][0], |
|
|
|
|
[name]: value |
|
|
|
|
}; |
|
|
|
|
arr[0] = updatedetailData; |
|
|
|
|
return { |
|
|
|
|
...prevState, |
|
|
|
|
[arrName]: arr |
|
|
|
|
}; |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case 'pilot': |
|
|
|
|
case 'arcrft': |
|
|
|
|
{ |
|
|
|
|
setDetailData(prevState => { |
|
|
|
|
const arr = [...prevState[arrName]]; |
|
|
|
|
const updatedetailData = { |
|
|
|
|
...prevState[arrName][0], |
|
|
|
|
[name]: value |
|
|
|
|
}; |
|
|
|
|
arr[0] = updatedetailData; |
|
|
|
|
return { |
|
|
|
|
...prevState, |
|
|
|
|
[arrName]: arr |
|
|
|
|
}; |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case 'plan': |
|
|
|
|
default: |
|
|
|
|
setDetailData(prevState => ({ |
|
|
|
|
...prevState, |
|
|
|
|
[name]: value |
|
|
|
|
})); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// 스텝 1 다음 버튼 이벤트
|
|
|
|
|
const handlerNext = () => { |
|
|
|
|
// 시작일자
|
|
|
|
|
const schFltStDt = moment(detailData.schFltStDt, 'YYYY-MM-DD HH:mm:ss'); |
|
|
|
|
// 종료일자
|
|
|
|
|
const schFltEndDt = moment(detailData.schFltEndDt, 'YYYY-MM-DD HH:mm:ss'); |
|
|
|
|
|
|
|
|
|
const currentDate = moment(); // 현재 날짜와 시간을 가져옵니다.
|
|
|
|
|
|
|
|
|
|
const validateAircraftWeightCode = |
|
|
|
|
!detailData.arcrftList[0].arcrftTypeCd && |
|
|
|
|
(detailData.commercial === 'COMMERCIAL' || |
|
|
|
|
detailData.arcrftList[0].arcrftWghtCd == '9' || |
|
|
|
|
detailData.arcrftList[0].arcrftWghtCd == '10' || |
|
|
|
|
detailData.arcrftList[0].arcrftWghtCd == '11'); |
|
|
|
|
|
|
|
|
|
const validateidntfNumCode = |
|
|
|
|
!detailData.arcrftList[0].idntfNum && |
|
|
|
|
(detailData.commercial === 'COMMERCIAL' || |
|
|
|
|
detailData.arcrftList[0].arcrftWghtCd == '9' || |
|
|
|
|
detailData.arcrftList[0].arcrftWghtCd == '10' || |
|
|
|
|
detailData.arcrftList[0].arcrftWghtCd == '11'); |
|
|
|
|
|
|
|
|
|
if (!detailData.fltType) { |
|
|
|
|
setIsErrorModal({ |
|
|
|
|
isOpen: true, |
|
|
|
|
title: '필수값 입력 오류', |
|
|
|
|
desc: '비행 종류(상업/비상업)를 선택해주세요.' |
|
|
|
|
}); |
|
|
|
|
return false; |
|
|
|
|
} else if ( |
|
|
|
|
!schFltStDt.isAfter(currentDate) || |
|
|
|
|
!schFltEndDt.isAfter(currentDate) |
|
|
|
|
) { |
|
|
|
|
setIsErrorModal({ |
|
|
|
|
isOpen: true, |
|
|
|
|
title: '필수값 입력 오류', |
|
|
|
|
desc: '비행 일자가 이미 지난 일자입니다.' |
|
|
|
|
}); |
|
|
|
|
return false; |
|
|
|
|
} else if (schFltStDt.isAfter(schFltEndDt)) { |
|
|
|
|
setIsErrorModal({ |
|
|
|
|
isOpen: true, |
|
|
|
|
title: '필수값 입력 오류', |
|
|
|
|
desc: '비행일자를 확인해주세요.' |
|
|
|
|
}); |
|
|
|
|
return false; |
|
|
|
|
} else if (schFltStDt.format('A h:mm') === 'PM 11:00') { |
|
|
|
|
setIsErrorModal({ |
|
|
|
|
isOpen: true, |
|
|
|
|
title: '특별 비행', |
|
|
|
|
desc: ( |
|
|
|
|
<> |
|
|
|
|
야간 비행은 특별 비행에 해당됩니다. |
|
|
|
|
<br /> |
|
|
|
|
특별 비행의 경우 드론원스톱을 통해서 신청해주시기 바랍니다. |
|
|
|
|
</> |
|
|
|
|
) |
|
|
|
|
}); |
|
|
|
|
return false; |
|
|
|
|
} else if (schFltStDt.format('A h:mm') === 'PM 5:00') { |
|
|
|
|
setIsErrorModal({ |
|
|
|
|
isOpen: true, |
|
|
|
|
title: '비행구역 및 비행일자 중복', |
|
|
|
|
desc: ( |
|
|
|
|
<> |
|
|
|
|
설정하신 비행구역 및 비행시간에 이미 승인완료된 신청건이 있습니다. |
|
|
|
|
<br /> 다시 설정 부탁드립니다. |
|
|
|
|
</> |
|
|
|
|
) |
|
|
|
|
}); |
|
|
|
|
return false; |
|
|
|
|
} else if (!detailData.fltPurpose) { |
|
|
|
|
setIsErrorModal({ |
|
|
|
|
isOpen: true, |
|
|
|
|
title: '필수값 입력 오류', |
|
|
|
|
desc: '비행목적을 선택해 주세요.' |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} else if ( |
|
|
|
|
!detailData.areaList[0].fltElev || |
|
|
|
|
detailData.areaList[0].fltElev === 0 |
|
|
|
|
) { |
|
|
|
|
setIsErrorModal({ |
|
|
|
|
isOpen: true, |
|
|
|
|
title: '필수값 입력 오류', |
|
|
|
|
desc: '고도를 입력해 주세요.' |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} else if (!detailData.areaList[0].bufferZone) { |
|
|
|
|
setIsErrorModal({ |
|
|
|
|
isOpen: true, |
|
|
|
|
title: '필수값 입력 오류', |
|
|
|
|
desc: '반경을 입력해 주세요.' |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} else if ( |
|
|
|
|
detailData.areaList[0].concatBufferZone != |
|
|
|
|
detailData.areaList[0].bufferZone && |
|
|
|
|
detailData.areaList[0].areaType === 'LINE' |
|
|
|
|
) { |
|
|
|
|
setIsErrorModal({ |
|
|
|
|
isOpen: true, |
|
|
|
|
title: '필수값 입력 오류', |
|
|
|
|
desc: <>적용 버튼을 누르지 않고 값을 변경 할 수 없습니다.</> |
|
|
|
|
}); |
|
|
|
|
} else if (!detailData.areaList[0].fltMethod) { |
|
|
|
|
setIsErrorModal({ |
|
|
|
|
isOpen: true, |
|
|
|
|
title: '필수값 입력 오류', |
|
|
|
|
desc: '비행방식를 입력해 주세요.' |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} else if ( |
|
|
|
|
detailData.areaList[0].fltMethod === '00' && |
|
|
|
|
!detailData.areaList[0].fltMothoeRm |
|
|
|
|
) { |
|
|
|
|
// 비행 방식 직접 입력칸 활성화 후 작성 시 조건문
|
|
|
|
|
setIsErrorModal({ |
|
|
|
|
isOpen: true, |
|
|
|
|
title: '필수값 입력 오류', |
|
|
|
|
desc: '비행방식을 입력해 주세요.' |
|
|
|
|
}); |
|
|
|
|
return false; |
|
|
|
|
} else if (validateAircraftWeightCode) { |
|
|
|
|
setIsErrorModal({ |
|
|
|
|
isOpen: true, |
|
|
|
|
title: '필수값 입력 오류', |
|
|
|
|
desc: '기체 종류를 입력해 주세요.' |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} else if (validateidntfNumCode) { |
|
|
|
|
setIsErrorModal({ |
|
|
|
|
isOpen: true, |
|
|
|
|
title: '필수값 입력 오류', |
|
|
|
|
desc: '기체 신고 번호를 입력해 주세요.' |
|
|
|
|
}); |
|
|
|
|
return false; |
|
|
|
|
} else { |
|
|
|
|
handlerLaanc(); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// 비행 구역 적용 버튼 핸들러
|
|
|
|
|
const handlerBufferApply = async () => { |
|
|
|
|
if (areaCoordList) { |
|
|
|
|
if (areaCoordList[0].coordList.length > 0) { |
|
|
|
|
dispatch(LaancAction.LAANC_VALID_AREA.request(detailData.areaList)); |
|
|
|
|
|
|
|
|
|
const array = []; |
|
|
|
|
const copy = { ...areaCoordList[0] }; |
|
|
|
|
copy.bufferZone = detailData.areaList[0].bufferZone; |
|
|
|
|
array.push(copy); |
|
|
|
|
|
|
|
|
|
dispatch(FLIGHT_PLAN_AREA_BUFFER_LIST.request(array)); |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
const elev = await axios.post( |
|
|
|
|
`api/bas/laanc/valid/elev`, |
|
|
|
|
detailData.areaList |
|
|
|
|
); |
|
|
|
|
if (elev.data[0] === 0) { |
|
|
|
|
setIsErrorModal({ |
|
|
|
|
title: '비행 불가 지역', |
|
|
|
|
desc: ( |
|
|
|
|
<> |
|
|
|
|
설정하신 비행구역 중 허용고도가 0m인 구역이 있습니다. |
|
|
|
|
<br /> |
|
|
|
|
버퍼존을 다시 확인해주시기 바랍니다. |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
isOpen: true |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
dispatch(LaancAction.LAANC_ALTITUDE.success(elev.data)); |
|
|
|
|
} catch (error) { |
|
|
|
|
{ |
|
|
|
|
setIsErrorModal({ |
|
|
|
|
isOpen: true, |
|
|
|
|
title: '오류', |
|
|
|
|
desc: '처리중 오류가 발생하였습니다' |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// Input 요소가 포커스될 때 커서를 맨 뒤로 이동
|
|
|
|
|
const handleInputClick = type => { |
|
|
|
|
switch (type) { |
|
|
|
@ -106,7 +437,7 @@ export default function LaancStep1({
|
|
|
|
|
const drawFlightZone = |
|
|
|
|
fltElevRef.current && |
|
|
|
|
type === 'fltElev' && |
|
|
|
|
data.areaList[0].coordList[0].lat != 0; |
|
|
|
|
detailData.areaList[0].coordList[0].lat != 0; |
|
|
|
|
|
|
|
|
|
if (drawFlightZone) { |
|
|
|
|
const input = fltElevRef.current; |
|
|
|
@ -114,7 +445,7 @@ export default function LaancStep1({
|
|
|
|
|
|
|
|
|
|
input.setSelectionRange(inputValue.length - 1, inputValue.length - 1); |
|
|
|
|
input.focus(); |
|
|
|
|
} else if (data.areaList[0].coordList[0].lat === 0) { |
|
|
|
|
} else if (detailData.areaList[0].coordList[0].lat === 0) { |
|
|
|
|
fltElevRef.current.blur(); |
|
|
|
|
setIsErrorModal({ |
|
|
|
|
isOpen: true, |
|
|
|
@ -138,25 +469,26 @@ export default function LaancStep1({
|
|
|
|
|
|
|
|
|
|
// 비사업 클릭시 기존 값 초기화 작업
|
|
|
|
|
const initialValue = () => { |
|
|
|
|
if (data.arcrftList[0].idntfNum) { |
|
|
|
|
if (detailData.arcrftList[0].idntfNum) { |
|
|
|
|
handleChange({ |
|
|
|
|
type: 'arcrft', |
|
|
|
|
name: 'idntfNum', |
|
|
|
|
value: '' |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
if (data.arcrftList[0].arcrftTypeCd) { |
|
|
|
|
if (detailData.arcrftList[0].arcrftTypeCd) { |
|
|
|
|
handleChange({ |
|
|
|
|
type: 'arcrft', |
|
|
|
|
name: 'arcrftTypeCd', |
|
|
|
|
value: '' |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
return; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// 날짜 선택 핸들러
|
|
|
|
|
const handleOpenFlatpickr = () => { |
|
|
|
|
if (data.areaList[0].coordList[0].lat === 0) { |
|
|
|
|
if (detailData.areaList[0].coordList[0].lat === 0) { |
|
|
|
|
setIsErrorModal({ |
|
|
|
|
isOpen: true, |
|
|
|
|
title: '비행 구역 설정', |
|
|
|
@ -167,7 +499,7 @@ export default function LaancStep1({
|
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// 고도 150 미만 핸들러
|
|
|
|
|
// 고도, 비행방식 핸들러
|
|
|
|
|
const handleBlur = (value, type) => { |
|
|
|
|
const maxElev = 150; |
|
|
|
|
|
|
|
|
@ -181,7 +513,7 @@ export default function LaancStep1({
|
|
|
|
|
case 'fltElev': |
|
|
|
|
if ( |
|
|
|
|
parseInt(value.replace('/^0+/', 'm', ''), 10) > maxElev && |
|
|
|
|
data.areaList[0].coordList[0].lat != 0 |
|
|
|
|
detailData.areaList[0].coordList[0].lat != 0 |
|
|
|
|
) { |
|
|
|
|
handleChange({ |
|
|
|
|
type: 'area', |
|
|
|
@ -259,12 +591,87 @@ export default function LaancStep1({
|
|
|
|
|
url: 'https://drone.onestop.go.kr/introduce/systemintro3 ' |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// laanc 승인 api 200 시 step 이동
|
|
|
|
|
const handlerLaanc = async () => { |
|
|
|
|
if (laancArea && laancElev[0]) { |
|
|
|
|
// laanc 필요 없이 날 수 있음
|
|
|
|
|
const laancNotRequired = |
|
|
|
|
!laancArea.duplicated && |
|
|
|
|
detailData.fltType != 'COMMERCIAL' && |
|
|
|
|
detailData.arcrftList[0].arcrftWghtCd != '11'; |
|
|
|
|
const maxElev = 150; |
|
|
|
|
|
|
|
|
|
if (laancNotRequired) { |
|
|
|
|
setIsErrorModal({ |
|
|
|
|
isOpen: true, |
|
|
|
|
title: '검토 결과 사전안내', |
|
|
|
|
desc: ( |
|
|
|
|
<> |
|
|
|
|
검토 결과 미 승인 대상입니다. |
|
|
|
|
<p> |
|
|
|
|
제줄하신 비행계획서는 별도의 승인이 필요없습니다. |
|
|
|
|
<br /> |
|
|
|
|
조종자 준수사항에 유의하여 비행하시기 바랍니다. |
|
|
|
|
</p> |
|
|
|
|
</> |
|
|
|
|
) |
|
|
|
|
}); |
|
|
|
|
return; |
|
|
|
|
} else if (detailData.areaList[0].fltMethod === '군집비행') { |
|
|
|
|
handleChange({ |
|
|
|
|
type: 'area', |
|
|
|
|
name: 'fltMethod', |
|
|
|
|
value: '' |
|
|
|
|
}); |
|
|
|
|
setIsLaancModal({ |
|
|
|
|
isOpen: true, |
|
|
|
|
title: '군집 비행 목적', |
|
|
|
|
desc: ( |
|
|
|
|
<> |
|
|
|
|
군집 비행의 경우 담당자와 협의가 필요합니다. <br /> |
|
|
|
|
아래 링크를 통해 담당자와 협의 부탁드립니다. |
|
|
|
|
</> |
|
|
|
|
), |
|
|
|
|
type: '처리부서안내 바로가기', |
|
|
|
|
url: 'https://drone.onestop.go.kr/introduce/systemintro3 ' |
|
|
|
|
}); |
|
|
|
|
} else if ( |
|
|
|
|
parseInt(detailData.areaList[0].fltElev) <= laancElev[0] && |
|
|
|
|
parseInt(detailData.areaList[0].fltElev) < maxElev |
|
|
|
|
) { |
|
|
|
|
try { |
|
|
|
|
// 성공적으로 응답 받았을 때 처리할 내용 추가
|
|
|
|
|
const tsData = await axios.get( |
|
|
|
|
detailData.arcrftList[0].idntfNum |
|
|
|
|
? `api/bas/laanc/ts/qr?idntfNum=${detailData.arcrftList[0].idntfNum}` |
|
|
|
|
: `api/bas/laanc/ts/qr` |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
// dispatch(
|
|
|
|
|
// LaancAction.LAANC_TS_QR.success({
|
|
|
|
|
// confirmKey: tsData.confirmKey,
|
|
|
|
|
// qrcode: `data:image/png;base64,${tsData.qrcode}`
|
|
|
|
|
// })
|
|
|
|
|
// );
|
|
|
|
|
setQrData({ |
|
|
|
|
confirmKey: tsData.data.confirmKey, |
|
|
|
|
qrcode: `data:image/png;base64,${tsData.data.qrcode}` |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
// handleChange({
|
|
|
|
|
// type: 'area',
|
|
|
|
|
// name: 'bufferZone',
|
|
|
|
|
// value: value
|
|
|
|
|
// });
|
|
|
|
|
setIsPopUp(true); |
|
|
|
|
return; |
|
|
|
|
} catch (error) { |
|
|
|
|
console.log('>>', error); |
|
|
|
|
setIsErrorModal({ |
|
|
|
|
isOpen: true, |
|
|
|
|
title: '오류', |
|
|
|
|
desc: <>처리중 오류가 발생하였습니다</> |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
@ -318,7 +725,7 @@ export default function LaancStep1({
|
|
|
|
|
</FormGroup> |
|
|
|
|
</Col> |
|
|
|
|
<Col className='list-input' md='6'> |
|
|
|
|
<FormGroup> |
|
|
|
|
<a> |
|
|
|
|
<div className='ti'>비행 유형</div> |
|
|
|
|
<Label for='test' className='pal-popover'> |
|
|
|
|
<span className='necessary'>*</span>승인 유형 |
|
|
|
@ -349,7 +756,7 @@ export default function LaancStep1({
|
|
|
|
|
bsSize='sm' |
|
|
|
|
name='fltType' |
|
|
|
|
id='fltType' |
|
|
|
|
value={data.fltType} |
|
|
|
|
value={detailData.fltType} |
|
|
|
|
onChange={e => { |
|
|
|
|
const { name, value } = e.target; |
|
|
|
|
handleChange({ |
|
|
|
@ -363,7 +770,7 @@ export default function LaancStep1({
|
|
|
|
|
<option value='COMMERCIAL'>사업</option> |
|
|
|
|
<option value='NON_COMMERCIAL'>비사업</option> |
|
|
|
|
</Input> |
|
|
|
|
</FormGroup> |
|
|
|
|
</a> |
|
|
|
|
</Col> |
|
|
|
|
<Col className='list-input' md='12'> |
|
|
|
|
<div className='ti'>비행 계획 정보</div> |
|
|
|
@ -399,11 +806,13 @@ export default function LaancStep1({
|
|
|
|
|
id='schFltStDt' |
|
|
|
|
name='schFltStDt' |
|
|
|
|
data-enable-time |
|
|
|
|
defaultValue={data.schFltStDt} |
|
|
|
|
value={data.schFltStDt} |
|
|
|
|
defaultValue={detailData.schFltStDt} |
|
|
|
|
value={detailData.schFltStDt} |
|
|
|
|
ref={schFltStDtRef} |
|
|
|
|
onFocus={() => handleOpenFlatpickr()} |
|
|
|
|
options={{ |
|
|
|
|
enableTime: true, |
|
|
|
|
time_24hr: true, |
|
|
|
|
minDate: moment().format('YYYY-MM-DD'), |
|
|
|
|
maxDate: moment().add(90, 'day').format('YYYY-MM-DD') |
|
|
|
|
}} |
|
|
|
@ -415,21 +824,23 @@ export default function LaancStep1({
|
|
|
|
|
value |
|
|
|
|
}); |
|
|
|
|
if (laancSun.length > 0) { |
|
|
|
|
const filteredData = laancSun.filter(data => { |
|
|
|
|
const dataDateTime = moment( |
|
|
|
|
data.locDate, |
|
|
|
|
'YYYYMMDD' |
|
|
|
|
); |
|
|
|
|
return dataDateTime.isSame( |
|
|
|
|
moment(value, 'YYYYMMDD') |
|
|
|
|
); |
|
|
|
|
}); |
|
|
|
|
const filtereddetailData = laancSun.filter( |
|
|
|
|
detailData => { |
|
|
|
|
const detailDataDateTime = moment( |
|
|
|
|
detailData.locDate, |
|
|
|
|
'YYYYMMDD' |
|
|
|
|
); |
|
|
|
|
return detailDataDateTime.isSame( |
|
|
|
|
moment(value, 'YYYYMMDD') |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
); |
|
|
|
|
const schFltStDt = moment(value).format('HHmmss'); |
|
|
|
|
|
|
|
|
|
filteredData.forEach(data => { |
|
|
|
|
filtereddetailData.forEach(detailData => { |
|
|
|
|
if ( |
|
|
|
|
schFltStDt <= data.civilm || |
|
|
|
|
schFltStDt >= data.civile |
|
|
|
|
schFltStDt <= detailData.civilm || |
|
|
|
|
schFltStDt >= detailData.civile |
|
|
|
|
) { |
|
|
|
|
setIsLaancModal({ |
|
|
|
|
isOpen: true, |
|
|
|
@ -448,9 +859,9 @@ export default function LaancStep1({
|
|
|
|
|
handleChange({ |
|
|
|
|
name: 'schFltStDt', |
|
|
|
|
value: |
|
|
|
|
schFltStDt <= data.civilm || |
|
|
|
|
schFltStDt >= data.civile |
|
|
|
|
? moment(data.civilm, 'HHmmss') |
|
|
|
|
schFltStDt <= detailData.civilm || |
|
|
|
|
schFltStDt >= detailData.civile |
|
|
|
|
? moment(detailData.civilm, 'HHmmss') |
|
|
|
|
.add(5, 'minute') |
|
|
|
|
.format('YYYY-MM-DD HH:mm:ss') |
|
|
|
|
: moment() |
|
|
|
@ -497,11 +908,13 @@ export default function LaancStep1({
|
|
|
|
|
id='schFltEndDt' |
|
|
|
|
name='schFltEndDt' |
|
|
|
|
data-enable-time |
|
|
|
|
defaultValue={data.schFltEndDt} |
|
|
|
|
defaultValue={detailData.schFltEndDt} |
|
|
|
|
ref={schFltEndDtRef} |
|
|
|
|
value={data.schFltEndDt} |
|
|
|
|
value={detailData.schFltEndDt} |
|
|
|
|
onFocus={handleOpenFlatpickr} |
|
|
|
|
options={{ |
|
|
|
|
enableTime: true, |
|
|
|
|
time_24hr: true, |
|
|
|
|
minDate: moment().format('YYYY-MM-DD'), |
|
|
|
|
maxDate: moment().add(6, 'month').format('YYYY-MM-DD') |
|
|
|
|
}} |
|
|
|
@ -513,21 +926,23 @@ export default function LaancStep1({
|
|
|
|
|
value |
|
|
|
|
}); |
|
|
|
|
if (laancSun.length > 0) { |
|
|
|
|
const filteredData = laancSun.filter(data => { |
|
|
|
|
const dataDateTime = moment( |
|
|
|
|
data.locDate, |
|
|
|
|
'YYYYMMDD' |
|
|
|
|
); |
|
|
|
|
return dataDateTime.isSame( |
|
|
|
|
moment(value, 'YYYYMMDD') |
|
|
|
|
); |
|
|
|
|
}); |
|
|
|
|
const filtereddetailData = laancSun.filter( |
|
|
|
|
detailData => { |
|
|
|
|
const detailDataDateTime = moment( |
|
|
|
|
detailData.locDate, |
|
|
|
|
'YYYYMMDD' |
|
|
|
|
); |
|
|
|
|
return detailDataDateTime.isSame( |
|
|
|
|
moment(value, 'YYYYMMDD') |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
); |
|
|
|
|
const schFltEndDt = moment(value).format('HHmmss'); |
|
|
|
|
|
|
|
|
|
filteredData.forEach(data => { |
|
|
|
|
filtereddetailData.forEach(detailData => { |
|
|
|
|
if ( |
|
|
|
|
schFltEndDt <= data.civilm || |
|
|
|
|
schFltEndDt >= data.civile |
|
|
|
|
schFltEndDt <= detailData.civilm || |
|
|
|
|
schFltEndDt >= detailData.civile |
|
|
|
|
) { |
|
|
|
|
setIsLaancModal({ |
|
|
|
|
isOpen: true, |
|
|
|
@ -546,9 +961,9 @@ export default function LaancStep1({
|
|
|
|
|
handleChange({ |
|
|
|
|
name: 'schFltEndDt', |
|
|
|
|
value: |
|
|
|
|
schFltEndDt <= data.civilm || |
|
|
|
|
schFltEndDt >= data.civile |
|
|
|
|
? moment(data.civile, 'HHmmss') |
|
|
|
|
schFltEndDt <= detailData.civilm || |
|
|
|
|
schFltEndDt >= detailData.civile |
|
|
|
|
? moment(detailData.civile, 'HHmmss') |
|
|
|
|
.add(-5, 'minute') |
|
|
|
|
.format('YYYY-MM-DD HH:mm:ss') |
|
|
|
|
: moment() |
|
|
|
@ -573,7 +988,7 @@ export default function LaancStep1({
|
|
|
|
|
type='select' |
|
|
|
|
id='fltPurpose' |
|
|
|
|
name='fltPurpose' |
|
|
|
|
value={data.fltPurpose} |
|
|
|
|
value={detailData.fltPurpose} |
|
|
|
|
bsSize='sm' |
|
|
|
|
onChange={e => { |
|
|
|
|
const { name, value } = e.target; |
|
|
|
@ -634,8 +1049,8 @@ export default function LaancStep1({
|
|
|
|
|
type='text' |
|
|
|
|
id='fltElev' |
|
|
|
|
name='fltElev' |
|
|
|
|
// defaultValue={data.email || ''}
|
|
|
|
|
value={data.areaList[0].fltElev + 'm'} |
|
|
|
|
// defaultValue={detailData.email || ''}
|
|
|
|
|
value={detailData.areaList[0].fltElev + 'm'} |
|
|
|
|
bsSize='sm' |
|
|
|
|
onBlur={e => handleBlur(e.target.value, 'fltElev')} |
|
|
|
|
onChange={e => { |
|
|
|
@ -665,8 +1080,8 @@ export default function LaancStep1({
|
|
|
|
|
type='text' |
|
|
|
|
id='bufferZone' |
|
|
|
|
name='bufferZone' |
|
|
|
|
// defaultValue={data.email || ''}
|
|
|
|
|
value={data.areaList[0].bufferZone + 'm'} |
|
|
|
|
// defaultValue={detailData.email || ''}
|
|
|
|
|
value={detailData.areaList[0].bufferZone + 'm'} |
|
|
|
|
bsSize='sm' |
|
|
|
|
onChange={e => { |
|
|
|
|
const { name, value } = e.target; |
|
|
|
@ -705,7 +1120,7 @@ export default function LaancStep1({
|
|
|
|
|
id='fltMethod' |
|
|
|
|
name='fltMethod' |
|
|
|
|
onBlur={e => handleBlur(e.target.value, 'fltMethod')} |
|
|
|
|
value={data.areaList[0].fltMethod} |
|
|
|
|
value={detailData.areaList[0].fltMethod} |
|
|
|
|
bsSize='sm' |
|
|
|
|
onChange={e => { |
|
|
|
|
const { name, value } = e.target; |
|
|
|
@ -751,10 +1166,10 @@ export default function LaancStep1({
|
|
|
|
|
value |
|
|
|
|
}); |
|
|
|
|
}} |
|
|
|
|
value={data.areaList[0].fltMothoeRm} |
|
|
|
|
value={detailData.areaList[0].fltMothoeRm} |
|
|
|
|
placeholder='직접입력 선택 후 활성화' |
|
|
|
|
disabled={ |
|
|
|
|
data.areaList[0].fltMethod === '00' ? false : true |
|
|
|
|
detailData.areaList[0].fltMethod === '00' ? false : true |
|
|
|
|
} |
|
|
|
|
/> |
|
|
|
|
</FormGroup> |
|
|
|
@ -775,7 +1190,7 @@ export default function LaancStep1({
|
|
|
|
|
name='arcrftWghtCd' |
|
|
|
|
bsSize='sm' |
|
|
|
|
placeholder='' |
|
|
|
|
value={data.arcrftList[0].arcrftWghtCd} |
|
|
|
|
value={detailData.arcrftList[0].arcrftWghtCd} |
|
|
|
|
onChange={e => { |
|
|
|
|
const { name, value } = e.target; |
|
|
|
|
handleChange({ |
|
|
|
@ -794,10 +1209,10 @@ export default function LaancStep1({
|
|
|
|
|
</Input> |
|
|
|
|
</FormGroup> |
|
|
|
|
</Col> |
|
|
|
|
{data.fltType === 'COMMERCIAL' || |
|
|
|
|
data.arcrftList[0].arcrftWghtCd == '11' || |
|
|
|
|
data.arcrftList[0].arcrftWghtCd == '10' || |
|
|
|
|
data.arcrftList[0].arcrftWghtCd == '9' ? ( |
|
|
|
|
{detailData.fltType === 'COMMERCIAL' || |
|
|
|
|
detailData.arcrftList[0].arcrftWghtCd == '11' || |
|
|
|
|
detailData.arcrftList[0].arcrftWghtCd == '10' || |
|
|
|
|
detailData.arcrftList[0].arcrftWghtCd == '9' ? ( |
|
|
|
|
<> |
|
|
|
|
<Col className='list-input' md='4'> |
|
|
|
|
<FormGroup> |
|
|
|
@ -808,7 +1223,7 @@ export default function LaancStep1({
|
|
|
|
|
type='select' |
|
|
|
|
id='arcrftTypeCd' |
|
|
|
|
name='arcrftTypeCd' |
|
|
|
|
value={data.arcrftList[0].arcrftTypeCd} |
|
|
|
|
value={detailData.arcrftList[0].arcrftTypeCd} |
|
|
|
|
bsSize='sm' |
|
|
|
|
onChange={e => { |
|
|
|
|
const { name, value } = e.target; |
|
|
|
@ -836,7 +1251,7 @@ export default function LaancStep1({
|
|
|
|
|
type='text' |
|
|
|
|
id='idntfNum' |
|
|
|
|
name='idntfNum' |
|
|
|
|
value={data.arcrftList[0].idntfNum} |
|
|
|
|
value={detailData.arcrftList[0].idntfNum} |
|
|
|
|
bsSize='sm' |
|
|
|
|
onChange={e => { |
|
|
|
|
const { name, value } = e.target; |
|
|
|
@ -870,7 +1285,7 @@ export default function LaancStep1({
|
|
|
|
|
centeredModal={centeredModal} |
|
|
|
|
setCenteredModal={setCenteredModal} |
|
|
|
|
handleChange={handleChange} |
|
|
|
|
data={data} |
|
|
|
|
detailData={detailData} |
|
|
|
|
page={1} |
|
|
|
|
/> |
|
|
|
|
</div> |
|
|
|
@ -920,6 +1335,19 @@ export default function LaancStep1({
|
|
|
|
|
다음 |
|
|
|
|
</Button> |
|
|
|
|
</ModalFooter> |
|
|
|
|
<Modal |
|
|
|
|
isOpen={isPopUp} |
|
|
|
|
toggle={() => setIsPopUp(!isPopUp)} |
|
|
|
|
className='modal-dialog-centered modal-lg notam-modal' |
|
|
|
|
style={{ height: '25vh', width: '25vw' }} |
|
|
|
|
> |
|
|
|
|
<LaancQr |
|
|
|
|
isPopUp={isPopUp} |
|
|
|
|
setIsPopUp={setIsPopUp} |
|
|
|
|
data={qrData} |
|
|
|
|
handlerStep={handlerStep} |
|
|
|
|
/> |
|
|
|
|
</Modal> |
|
|
|
|
<ErrorModal modal={isErrorModal} setModal={setIsErrorModal} /> |
|
|
|
|
<InfoModal modal={isInfoModal} setModal={setIsInfoModal} /> |
|
|
|
|
<LaancModal modal={isLaancModal} setModal={setIsLaancModal} /> |
|
|
|
|