|
|
@ -17,12 +17,8 @@ export default function LaancPlanContainer({ |
|
|
|
}) { |
|
|
|
}) { |
|
|
|
const dispatch = useDispatch(); |
|
|
|
const dispatch = useDispatch(); |
|
|
|
|
|
|
|
|
|
|
|
// 비행 구역 정보
|
|
|
|
|
|
|
|
const { areaCoordList } = useSelector(state => state.flightState); |
|
|
|
|
|
|
|
// 로그인 정보
|
|
|
|
// 로그인 정보
|
|
|
|
const { user } = useSelector(state => state.authState); |
|
|
|
const { user } = useSelector(state => state.authState); |
|
|
|
// 관제권안 정보,고도 정보
|
|
|
|
|
|
|
|
const { laancArea, laancElev } = useSelector(state => state.laancState); |
|
|
|
|
|
|
|
// laanc step
|
|
|
|
// laanc step
|
|
|
|
const [step, setStep] = useState(1); |
|
|
|
const [step, setStep] = useState(1); |
|
|
|
// laanc 초기값
|
|
|
|
// laanc 초기값
|
|
|
@ -63,309 +59,6 @@ export default function LaancPlanContainer({ |
|
|
|
setStep(step); |
|
|
|
setStep(step); |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
// 날씨 핸들러
|
|
|
|
|
|
|
|
const handlerWeather = () => { |
|
|
|
|
|
|
|
setFormModal(!formModal); |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 비행계획서 작성 핸들러
|
|
|
|
|
|
|
|
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 updateData = { |
|
|
|
|
|
|
|
...prevState[arrName][0], |
|
|
|
|
|
|
|
[name]: value, |
|
|
|
|
|
|
|
fltMothoeRm: '' |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
arr[0] = updateData; |
|
|
|
|
|
|
|
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 updateData = { |
|
|
|
|
|
|
|
...prevState[arrName][0], |
|
|
|
|
|
|
|
[name]: value, |
|
|
|
|
|
|
|
concatBufferZone: prevBufferZone |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
arr[0] = updateData; |
|
|
|
|
|
|
|
return { |
|
|
|
|
|
|
|
...prevState, |
|
|
|
|
|
|
|
[arrName]: arr |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
setDetailData(prevState => { |
|
|
|
|
|
|
|
const arr = [...prevState[arrName]]; |
|
|
|
|
|
|
|
const updateData = { |
|
|
|
|
|
|
|
...prevState[arrName][0], |
|
|
|
|
|
|
|
[name]: value |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
arr[0] = updateData; |
|
|
|
|
|
|
|
return { |
|
|
|
|
|
|
|
...prevState, |
|
|
|
|
|
|
|
[arrName]: arr |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 'pilot': |
|
|
|
|
|
|
|
case 'arcrft': |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
setDetailData(prevState => { |
|
|
|
|
|
|
|
const arr = [...prevState[arrName]]; |
|
|
|
|
|
|
|
const updateData = { |
|
|
|
|
|
|
|
...prevState[arrName][0], |
|
|
|
|
|
|
|
[name]: value |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
arr[0] = updateData; |
|
|
|
|
|
|
|
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: <>적용 버튼을 누르지 않고 값을 변경 할 수 없습니다.</> |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
// handleChange({
|
|
|
|
|
|
|
|
// type: 'area',
|
|
|
|
|
|
|
|
// name: 'bufferZone',
|
|
|
|
|
|
|
|
// value: detailData.areaList[0].concatBufferZone
|
|
|
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
} 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_ALTITUDE.request(detailData.areaList));
|
|
|
|
|
|
|
|
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) { |
|
|
|
|
|
|
|
// dispatch(AREA_DETAIL_INIT());
|
|
|
|
|
|
|
|
// dispatch(AreaAction.AREA_DETAIL_INIT());
|
|
|
|
|
|
|
|
// dispatch(drawTypeChangeAction(''));
|
|
|
|
|
|
|
|
// dispatch(LaancAction.LAANC_APPROVAL_INIT());
|
|
|
|
|
|
|
|
setIsErrorModal({ |
|
|
|
|
|
|
|
title: '비행 불가 지역', |
|
|
|
|
|
|
|
desc: ( |
|
|
|
|
|
|
|
<> |
|
|
|
|
|
|
|
설정하신 비행구역 중 허용고도가 0m인 구역이 있습니다. |
|
|
|
|
|
|
|
<br /> |
|
|
|
|
|
|
|
버퍼존을 다시 확인해주시기 바랍니다. |
|
|
|
|
|
|
|
</> |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
isOpen: true |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
dispatch(LaancAction.LAANC_ALTITUDE.success(elev.data)); |
|
|
|
|
|
|
|
} catch (error) { |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
setIsErrorModal({ |
|
|
|
|
|
|
|
isOpen: true, |
|
|
|
|
|
|
|
title: '오류', |
|
|
|
|
|
|
|
desc: '처리중 오류가 발생하였습니다' |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Laanc 승인 요청 취소 버튼 헨들러
|
|
|
|
// Laanc 승인 요청 취소 버튼 헨들러
|
|
|
|
const handlerLaancClose = () => { |
|
|
|
const handlerLaancClose = () => { |
|
|
|
setStep(1); |
|
|
|
setStep(1); |
|
|
|