hhjk00 11 months ago
parent
commit
38dd73d257
  1. 1
      src/components/cstmrService/inquiry/InquiryWrite.js
  2. 43
      src/components/cstmrService/inquiry/QnaDetail.js
  3. 2
      src/components/laanc/list/LaancGrid.js
  4. 23
      src/components/laanc/map/FlightArea.js
  5. 20
      src/components/laanc/map/LaancAreaMap.js
  6. 61
      src/components/laanc/step/LaancStep1.js
  7. 123
      src/components/laanc/step/LaancStep2.js
  8. 4
      src/components/map/geojson/flatGimpoAirportAirArea.json
  9. 22
      src/components/map/mapbox/draw/LaancDrawControl.js
  10. 11
      src/containers/cstmrService/inquiry/AdminInquiryContainer.js
  11. 3
      src/containers/cstmrService/inquiry/UserInquiryContainer.js
  12. 4
      src/containers/laanc/LaancContainer.js
  13. 113
      src/containers/laanc/LaancPlanContainer.js
  14. 39
      src/modules/cstmrService/inquiry/sagas/index.ts
  15. 48
      src/modules/laanc/actions/laancActions.ts
  16. 13
      src/modules/laanc/apis/laancApi.ts
  17. 39
      src/modules/laanc/models/laancModels.ts
  18. 22
      src/modules/laanc/reducers/laancReducers.ts
  19. 40
      src/modules/laanc/sagas/laancSagas.ts

1
src/components/cstmrService/inquiry/InquiryWrite.js

@ -33,7 +33,6 @@ function InquiryWrite({ isInquiryModalOpen, handlerInquiryModal, detail }) {
setSelectedFile(null);
};
console.log('데이터 보시겟습니당', detail);
return (
<Modal
isOpen={isInquiryModalOpen}

43
src/components/cstmrService/inquiry/QnaDetail.js

@ -85,27 +85,30 @@ export default function QnaDetatil({
/>
</FormGroup>
</Col>
{console.log(adminDetailForm)}
<Col className='list-input' md='4'>
<FormGroup>
<Label for='test'>첨부 파일</Label>
<Input
type='text'
bsSize='sm'
placeholder=''
value='파일명.jpg'
disabled
/>
<div className='user-phone-btn'>
<Button
size='sm'
type='button'
color='primary'
onClick={handlerFileDownload}
>
<span className='d-sm-inline-block'>다운로드</span>
</Button>
</div>
</FormGroup>
{adminDetailForm.files?.length > 0 && (
<FormGroup>
<Label for='test'>첨부 파일</Label>
<Input
type='text'
bsSize='sm'
placeholder=''
value={adminDetailForm.files[0].fileName}
disabled
/>
<div className='user-phone-btn'>
<Button
size='sm'
type='button'
color='primary'
onClick={handlerFileDownload}
>
<span className='d-sm-inline-block'>다운로드</span>
</Button>
</div>
</FormGroup>
)}
</Col>
<Col className='list-input' md='12'>

2
src/components/laanc/list/LaancGrid.js

@ -210,7 +210,7 @@ export default function LaancGrid() {
// count={laancSearchData?.size}
columns={columns}
// handlerPageChange={props.handlerPageChange}
pagination={false}
pagination={true}
/>
) : null}
</div>

23
src/components/laanc/map/FlightArea.js

@ -73,20 +73,12 @@ export default function FlightArea({
const [isMapLoad, setIsMapLoad] = useState(false);
const [previewLayer, setPreviewLayer] = useState();
const [formModal, setFormModal] = useState(false);
const [alertModal, setAlertModal] = useState({
isOpen: false,
title: '비행구역 설정',
desc: '구역은 최대 2개까지 설정 가능합니다.'
});
const [addModal, setAddModal] = useState({
isOpen: false,
title: '비행구역 설정',
desc: '모드를 변경하고 추가구역을 설정해주세요. 구역은 최대 2개까지 설정 가능합니다.'
});
const [isSaveable, setIsSaveable] = useState(false);
const [addData, setAddData] = useState(initialAddData);
const [saveData, setSaveData] = useState();
//날씨 임시 데이터
const [wheather, setWheather] = useState([]);
@ -501,11 +493,7 @@ export default function FlightArea({
};
const handlerAddClick = () => {
if (!addData.isAddable) {
// setAddModal(prev => ({
// ...prev,
// isOpen: true
// }));
if (!addData.isAddable || !addData.overAdd) {
handlerAddChange('isAddable', true);
const obj = drawObj
.getAll()
@ -559,7 +547,7 @@ export default function FlightArea({
<ModalHeader
toggle={() => {
setCenteredModal(!centeredModal);
handlerInitCoordinates();
dispatch(AREA_COORDINATE_LIST_SAVE(saveData));
}}
>
비행 구역 설정
@ -573,6 +561,7 @@ export default function FlightArea({
handlerSaveCheck={handlerSaveCheck}
handlerAddChange={handlerAddChange}
addData={addData}
setSaveData={setSaveData}
/>
</ModalBody>
<ModalFooter>
@ -665,8 +654,6 @@ export default function FlightArea({
</ModalFooter>
</Modal>
) : null}
<ErrorModal modal={alertModal} setModal={setAlertModal} />
<InfoModal modal={addModal} setModal={setAddModal} />
<Modal
isOpen={formModal}
toggle={handlerWeather}

20
src/components/laanc/map/LaancAreaMap.js

@ -7,6 +7,7 @@ import { useEffect, useMemo, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { Card, CardBody } from 'reactstrap';
import { initFlightBas } from '../../../modules/basis/flight/models/basisFlightModel';
import * as LaancAction from '../../../modules/laanc/actions/laancActions';
import {
AREA_COORDINATE_LIST_SAVE,
FLIGHT_PLAN_AREA_BUFFER_LIST,
@ -41,7 +42,8 @@ export default function LaancAreaMap({
handlerSaveCheck,
handlerAddChange,
addData,
handlerInitCoordinates
handlerInitCoordinates,
setSaveData
}) {
const dispatch = useDispatch();
const mapControl = useSelector(state => state.controlMapReducer);
@ -299,7 +301,8 @@ export default function LaancAreaMap({
} else {
setMapAreaCoordList(areaList);
}
dispatch(LaancAction.LAANC_ALTITUDE.request(areaList));
dispatch(LaancAction.LAANC_VALID_AREA.request(areaList));
dispatch(FLIGHT_PLAN_AREA_INAIRAREA.request(areaList));
};
@ -337,7 +340,17 @@ export default function LaancAreaMap({
}
return (
<div>
<div
onClick={() => {
const allObj = drawObj
.getAll()
.features.filter(o => o.properties.id !== 'BUFFER');
drawObj.changeMode('direct_select', {
featureId: allObj[i].id
});
}}
>
<h6 className='ti'>비행구역 {i + 1}</h6>
<div className='coords-box-scroll'>
{coord?.map((co, idx) => {
@ -398,6 +411,7 @@ export default function LaancAreaMap({
handlerSaveCheck={handlerSaveCheck}
handlerCoordinates={handlerCoordinates}
handlerInitCoordinates={handlerInitCoordinates}
setSaveData={setSaveData}
/>
<FeatureAirZone map={mapObject} mapboxgl={mapboxgl} />
{modal ? (

61
src/components/laanc/step/LaancStep1.js

@ -38,7 +38,10 @@ export default function LaancStep1({
const { user } = useSelector(state => state.authState);
const { areaCoordList } = useSelector(state => state.flightState);
const { laancSun } = useSelector(state => state.laancState);
const { laancSun, laancElev, laancArea } = useSelector(
state => state.laancState
);
const { inAirArea } = useSelector(state => state.flightState);
const fltElevRef = useRef(null);
const bufferZoneRef = useRef(null);
const schFltStDtRef = useRef(null);
@ -50,7 +53,6 @@ export default function LaancStep1({
const [popoverCommercial, setPopoverCommercial] = useState(false);
const [popoverSchFltStDt, setPopoverSchFltStDt] = useState(false);
const [popoverSchFltEndDt, setPopoverSchFltEndDt] = useState(false);
const [isErrorModal, setIsErrorModal] = useState({
isOpen: false,
title: '',
@ -183,6 +185,47 @@ export default function LaancStep1({
url: 'https://drone.onestop.go.kr/introduce/systemintro3 '
});
}
if (
!laancArea.duplicated &&
parseInt(value.replace('/^0+/', 'm', ''), 10) < 150
) {
setIsErrorModal({
isOpen: true,
title: '고도 재설정 알림',
desc: (
<>
관제권 비행금지 공역을 제외한 지역에서는 주간에 150m미만의
<br />
고도에서는 비행승인없이 비행가능합니다.
</>
)
});
}
if (
laancArea.duplicated &&
parseInt(value.replace('/^0+/', 'm', ''), 10) >= laancElev &&
parseInt(value.replace('/^0+/', 'm', ''), 10) < 150
) {
setIsErrorModal({
isOpen: true,
title: '검토 결과 사전안내',
desc: (
<>
유효성 검사에 실패하여 승인 대상입니다.
<br />
제출하신 비행계획서의 고도는 {laancElev}m이하에서만 비행이
가능합니다.
<br />
고도 설정을 다시 확인해주시기 바랍니다.
</>
)
});
handleChange({
type: 'area',
name: 'fltElev',
value: 0
});
}
case 'fltMethod':
if (value === '군집비행') {
handleChange({
@ -190,17 +233,10 @@ export default function LaancStep1({
name: 'fltMethod',
value: ''
});
setIsLaancModal({
setIsErrorModal({
isOpen: true,
title: '군집 비행 목적',
desc: (
<>
군집 비행의 경우 담당자와 협의가 필요합니다. <br />
아래 링크를 통해 담당자와 협의 부탁드립니다.
</>
),
type: '처리부서안내 바로가기',
url: 'https://drone.onestop.go.kr/introduce/systemintro3 '
title: '비행 구역 설정',
desc: '비행 구역 설정을 먼저 설정 해 주세요'
});
}
}
@ -545,6 +581,7 @@ export default function LaancStep1({
onBlur={e => handleBlur(e.target.value, 'fltElev')}
onChange={e => {
const { name, value } = e.target;
handleChange({
type: 'area',
name,

123
src/components/laanc/step/LaancStep2.js

@ -85,8 +85,7 @@ export default function LaancStep2({
agreeYn: 'Y',
termsSno: termsList[0]?.termsSno
}
],
validatedRs: laancApply
]
});
};
//laanc 문구 정의 함수
@ -156,40 +155,19 @@ export default function LaancStep2({
</Alert>
</Col>
<Col className='list-input' md='6'>
<Alert
color={
data.arcrftList[0].idntfNum != 'PA0002'
? 'success'
: 'warning'
}
>
<Alert color={'success'}>
<div className='alert-body'>
{data.arcrftList[0].idntfNum != 'PA0002' ? (
<CheckCircle size={15} />
) : (
<AlertCircle size={15} />
)}
<CheckCircle size={15} />
<span className='ms-1'> 기체보험가입 정보</span>
</div>
</Alert>
</Col>
{/* validation은 on 클래스로 제어 */}
<Col className='validation on' md='12'>
{data.arcrftList[0].idntfNum === 'PA0002' ? (
<p>
<AlertTriangle />
기체가 보험에 가입되어 있지 않거나 유효기간이 만료되었습니다.
{/* <AlertTriangle />
조종자자격증이 유효하지 않습니다.
<br /> */}
</p>
) : null}
{data.arcrftList[0].idntfNum != 'PA0002' ? (
<p style={{ color: '#28c76f' }}>
<CheckCircle />
유효성 검사가 정상적으로 완료되었습니다.
</p>
) : null}
<p style={{ color: '#28c76f' }}>
<CheckCircle />
유효성 검사가 정상적으로 완료되었습니다.
</p>
</Col>
</Row>
</div>
@ -206,57 +184,16 @@ export default function LaancStep2({
</div>
<div className='mt-1'>
{/* 사전 결과 승인 대상일때 color=success */}
<Alert
color={
(laancApply?.valid &&
data.arcrftList[0].idntfNum != 'PA0002') ||
data.aprvlYn === 'Y'
? 'success'
: 'warning'
}
>
<Alert color={'success'}>
<div className='alert-body'>
{(laancApply?.valid &&
data.arcrftList[0].idntfNum != 'PA0002') ||
data.aprvlYn === 'Y' ? (
<>
<CheckCircle size={15} />
<span className='ms-1'> 검토 결과 승인 대상입니다.</span>
<span className='cancel-txt'>
제출하신 비행계획은 자동승인 대상 입니다.
<br />
<br />
자동승인을 위해 다음 스텝으로 진행하시기 바랍니다.
</span>
</>
) : (
<>
{data.arcrftList[0].idntfNum === 'PA0002' ? (
<>
<AlertCircle size={15} />
<span className='ms-1'>
{' '}
검토 결과 승인 대상입니다.
</span>
<span className='cancel-txt'>
유효성 검사에 실패하였습니다.
<br />
<br />
아래 이전 버튼을 눌러 스텝1에서 기체번호를
확인해주시기 바랍니다.
</span>
</>
) : (
laancReason(
laancApply?.flight,
laancApply?.arcrftDuplicated,
laancApply?.planAreaDuplicatd,
laancApply?.pilotQlfc,
laancApply?.arcrftInsurance
)
)}
</>
)}
<CheckCircle size={15} />
<span className='ms-1'> 검토 결과 승인 대상입니다.</span>
<span className='cancel-txt'>
제출하신 비행계획은 자동승인 대상 입니다.
<br />
<br />
자동승인을 위해 다음 스텝으로 진행하시기 바랍니다.
</span>
</div>
</Alert>
{/* <Alert color='success'>
@ -281,7 +218,7 @@ export default function LaancStep2({
name='memberName'
size='sm'
placeholder=''
value={user.memberName}
value={user?.memberName}
disabled
/>
</FormGroup>
@ -418,17 +355,15 @@ export default function LaancStep2({
className='terms-box'
dangerouslySetInnerHTML={{ __html: termsList[0]?.termsCn }}
></div>
{!laancIsCheck ? (
<CustomInput
inline
type='checkbox'
className='terms-check'
id='exampleCustomCheckbox'
label='조종자 준수사항 미 준수 시 처벌에 동의합니다.'
checked={isterms}
onChange={() => setIsterms(!isterms)}
/>
) : null}
<CustomInput
inline
type='checkbox'
className='terms-check'
id='exampleCustomCheckbox'
label='조종자 준수사항 미 준수 시 처벌에 동의합니다.'
checked={isterms}
onChange={() => setIsterms(!isterms)}
/>
</>
) : null}
</Col>
@ -450,11 +385,7 @@ export default function LaancStep2({
<span></span>
</li>
</ul>
<Button
disabled={!isterms || laancIsCheck}
outline
onClick={() => handlerCreate()}
>
<Button disabled={!isterms} outline onClick={() => handlerCreate()}>
다음
</Button>
</ModalFooter>

4
src/components/map/geojson/flatGimpoAirportAirArea.json

@ -2524,11 +2524,9 @@
[126.8343583222, 37.5066285444, 0],
[126.8350552999, 37.5069242042, 0],
[126.8357471374, 37.5072274331, 0],
[126.8364337051, 37.5075381744, 0],
[126.8292431825, 37.5156880512, 0],
[126.8286940695, 37.5154535639, 0],
[126.8281409584, 37.5152251192, 0],
[126.8275839539, 37.5150027604, 0],
[126.8270231615, 37.5147865297, 0],

22
src/components/map/mapbox/draw/LaancDrawControl.js

@ -79,17 +79,6 @@ export const LaancDrawControl = props => {
const type = handlerReturnMode(drawObj.getMode());
const obj = state[type?.toLowerCase()];
// const features = mapObject.queryRenderedFeatures(e.point, {
// layers: ['maine']
// });
// if (features.length > 0 && obj) {
// if (features[0].properties.description.includes('김포공항 비행불가')) {
// if (!obj?.properties?.isUnable) {
// drawObj.setFeatureProperty(obj.id, 'isUnable', true);
// }
// }
// }
if (type && obj) {
const feature = drawObj.get(obj.id);
const coordinates = feature.geometry.coordinates;
@ -343,7 +332,13 @@ export const LaancDrawControl = props => {
if (isBreak) {
props.setModal({
title: '비행 불가 지역',
desc: <>비행불가!</>,
desc: (
<>
설정하신 비행구역 허용고도가 0m인 구역이 있습니다.
<br />
비행구역 설정 허용고도를 다시 확인해주시기 바랍니다.
</>
),
isOpen: true
});
handlerRemoveError(data.id);
@ -430,7 +425,7 @@ export const LaancDrawControl = props => {
props.setViewCoordObj(viewCoordObj);
if (viewCoordObj.length > 1) {
if (viewCoordObj.length > 19) {
props.handlerAddChange('overAdd', true);
} else {
props.handlerAddChange('isViewAdd', true);
@ -540,6 +535,7 @@ export const LaancDrawControl = props => {
});
} else if (areas.length > 0 && areas[0].areaType) {
// 이미 그려진 지도 다시 열었을 때
props.setSaveData(areas);
areas.map(area => {
const paths = [];
area.coordList.forEach(coord => paths.push([coord.lon, coord.lat]));

11
src/containers/cstmrService/inquiry/AdminInquiryContainer.js

@ -6,7 +6,8 @@ import {
ADMIN_DETAIL,
ADMIN_ANSWER,
ADMIN_FILE_DOWN,
ADMIN_DELETE
ADMIN_DELETE,
ADMIN_DETAIL_INITAL
} from '../../../modules/cstmrService/inquiry/action';
import QnaSearchBox from '../../../components/cstmrService/inquiry/QnaSearchBox';
import QnaGrid from '../../../components/cstmrService/inquiry/QnaGrid';
@ -56,6 +57,12 @@ export default function AdminInquiryContainer() {
setAdminDetailForm({ ...adminDetail });
}, [adminDetail]);
useEffect(() => {
if (!isDetailModal) {
dispatch(ADMIN_DETAIL_INITAL());
}
}, [isDetailModal]);
// 관리자 문의 목록 조회
const handlerGetQnaList = () => {
const { category, anserStatus, createUserNm } = searchData;
@ -92,7 +99,7 @@ export default function AdminInquiryContainer() {
);
const handlerFileDownload = () => {
if (adminDetailForm.files.length <= 0) return;
console.log(adminDetailForm.files);
dispatch(ADMIN_FILE_DOWN.request(adminDetailForm.files));
};

3
src/containers/cstmrService/inquiry/UserInquiryContainer.js

@ -26,6 +26,7 @@ export default function UserInquiryContainer() {
return text.replace((/\n/g, '<br/>'));
};
// 문의 내역 list
const handlerQnaList = () => {
return lists.map(i => {
return {
@ -87,9 +88,9 @@ export default function UserInquiryContainer() {
});
};
// 1:1 문의하기 Modal handler
const handlerInquiryModal = qnaSno => {
if (!isInquiryModalOpen && qnaSno) {
console.log(isInquiryModalOpen);
dispatch(ADMIN_DETAIL.request(qnaSno));
} else {
dispatch(ADMIN_DETAIL_INITAL());

4
src/containers/laanc/LaancContainer.js

@ -5,6 +5,7 @@ import moment from 'moment';
import { useDispatch, useSelector, shallowEqual } from 'react-redux';
import { CustomMainLayout } from '../../components/layout/CustomMainLayout';
import * as LaancAction from '../../modules/laanc/actions/laancActions';
import * as AreaAction from '../../modules/basis/flight/actions/basisFlightAction';
import { drawTypeChangeAction } from '../../modules/control/map/actions/controlMapActions';
import {
JOIN_LIST,
@ -91,6 +92,9 @@ export default function LaancContainer() {
const handleApply = () => {
dispatch(drawTypeChangeAction(''));
dispatch(LaancAction.LAANC_APPROVAL_INIT());
dispatch(LaancAction.LAANC_ALTITUDE_INIT());
dispatch(LaancAction.LAANC_AREA_INIT());
dispatch(AreaAction.AREA_DETAIL_INIT());
setDisabledAnimation(true);
setCurrentParm(true);
};

113
src/containers/laanc/LaancPlanContainer.js

@ -8,7 +8,8 @@ import { initFlightBas } from '../../modules/laanc/models/laancModels';
import { Modal } from 'reactstrap';
import {
AREA_DETAIL_INIT,
FLIGHT_PLAN_AREA_BUFFER_LIST
FLIGHT_PLAN_AREA_BUFFER_LIST,
FLIGHT_PLAN_AREA_INAIRAREA
} from '../../modules/basis/flight/actions/basisFlightAction';
import { useDispatch, useSelector } from 'react-redux';
import { drawTypeChangeAction } from '../../modules/control/map/actions/controlMapActions';
@ -23,7 +24,11 @@ export default function LaancPlanContainer({
const { areaCoordList } = useSelector(state => state.flightState);
const { user } = useSelector(state => state.authState);
const { laancApply } = useSelector(state => state.laancState);
const { laancApply, laancArea, laancElev } = useSelector(
state => state.laancState
);
const [isBuffer, setIsBuffer] = useState(false);
const [step, setStep] = useState(1);
const [detailData, setDetailData] = useState(initFlightBas.initDetail);
@ -37,11 +42,13 @@ export default function LaancPlanContainer({
});
useEffect(() => {
setDetailData({
...detailData,
cstmrSno: user.cstmrSno,
memberName: user.memberName
});
if (user) {
setDetailData({
...detailData,
cstmrSno: user.cstmrSno,
memberName: user.memberName
});
}
return () => {
dispatch(drawTypeChangeAction(''));
};
@ -55,27 +62,10 @@ export default function LaancPlanContainer({
}, [finalDetailData]);
// laanc 승인 api 200 시 step 이동
useEffect(() => {
if (laancApply) {
const { valid, evaluatedTargetArea, flight } = laancApply;
// 사전결과 미승인 대상
if (!valid && !evaluatedTargetArea && flight) {
setIsErrorModal({
isOpen: true,
title: '검토 결과 사전안내',
desc: (
<>
검토 결과 승인 대상입니다.
<p>
제줄하신 비행계획서는 별도의 승인이 필요없습니다.
<br />
조종자 준수사항에 유의하여 비행하시기 바랍니다.
</p>
</>
)
});
return;
} else if (!valid) {
const handlerLaanc = () => {
// 사전결과 미승인 대상
if (laancArea && laancElev) {
if (detailData.arcrftList[0].idntfNum === 'PA0002') {
setIsErrorModal({
isOpen: true,
title: '검토 결과 사전안내',
@ -83,48 +73,69 @@ export default function LaancPlanContainer({
<>
유효성 검사에 실패하여 승인 대상입니다.
<p>
제출하신 비행계획서의 고도는 120m이하에서만 비행이 가능합니다.
기체가 보험에 가입되어 있지 않거나 유효기간이 만료되었습니다.
<br />
고도 설정을 다시 확인해주시기 바랍니다.
기체 번호를 다시 확인해주시기 바랍니다.
</p>
</>
)
});
return;
} else if (detailData.arcrftList[0].idntfNum === 'PA0002') {
} else if (
!laancArea.duplicated &&
detailData.fltType != 'COMMERCIAL' &&
detailData.arcrftList[0].arcrftWghtCd != '11'
) {
setIsErrorModal({
isOpen: true,
title: '검토 결과 사전안내',
desc: (
<>
유효성 검사에 실패하여 승인 대상입니다.
검토 결과 승인 대상입니다.
<p>
기체가 보험에 가입되어 있지 않거나 유효기간이 만료되었습니다.
제줄하신 비행계획서는 별도의 승인이 필요없습니다.
<br />
기체 번호를 다시 확인해주시기 바랍니다.
조종자 준수사항에 유의하여 비행하시기 바랍니다.
</p>
</>
)
});
return;
} else if (
parseInt(detailData.areaList[0].fltElev) <= laancElev &&
parseInt(detailData.areaList[0].fltElev) < 150
) {
setStep(2);
}
if (!valid && evaluatedTargetArea && !flight) {
setIsErrorModal({
isOpen: true,
title: '검토 결과 사전안내',
desc: (
<>
유효성 검사에 실패하여 승인 대상입니다.
<p>자세한 사항은 비행승인 검토결과를 확인해주시기 바랍니다.</p>
</>
)
});
}
return;
}
setStep(2);
// if (!valid && evaluatedTargetArea && !flight) {
// setIsErrorModal({
// isOpen: true,
// title: '검토 결과 사전안내',
// desc: (
// <>
// 유효성 검사에 실패하여 미 승인 대상입니다.
// <p>자세한 사항은 비행승인 검토결과를 확인해주시기 바랍니다.</p>
// </>
// )
// });
// return;
// }
};
// 버퍼 변경될 때 관제권 포함유무 체크
useEffect(() => {
if (isBuffer) {
dispatch(FLIGHT_PLAN_AREA_INAIRAREA.request(areaCoordList));
setIsBuffer(false);
}
}, [laancApply]);
}, [areaCoordList]);
// useEffect(() => {
// console.log(inAirArea, '----inairarea');
// }, [inAirArea]);
// step 핸들러
const handlerStep = step => {
@ -352,6 +363,7 @@ export default function LaancPlanContainer({
return false;
} else {
handlerLaanc();
// 비행 방식 직접 입력칸 활성화 후 작성 시 조건문
if (detailData.areaList[0].selffltMethod) {
setFinalDetailData({
@ -364,7 +376,7 @@ export default function LaancPlanContainer({
]
});
} else {
dispatch(LaancAction.LAANC_FLIGHT_Approval.request(detailData));
// dispatch(LaancAction.LAANC_FLIGHT_Approval.request(detailData));
}
}
};
@ -378,6 +390,7 @@ export default function LaancPlanContainer({
array.push(copy);
dispatch(FLIGHT_PLAN_AREA_BUFFER_LIST.request(array));
setIsBuffer(true);
}
} else {
setIsErrorModal({

39
src/modules/cstmrService/inquiry/sagas/index.ts

@ -1,11 +1,6 @@
import { call, put, takeEvery } from '@redux-saga/core/effects';
import { ActionType } from 'typesafe-actions';
import {
DELETE_MESSAGE,
DUPLATE_MESSAGE,
ERROR_MESSAGE,
SAVE_MESSAGE
} from '../../../../configs/constants';
import { DELETE_MESSAGE, HOST } from '../../../../configs/constants';
import * as MessageActions from '../../../comn/message/actions/comnMessageAction';
import * as Actions from '../action';
import * as Apis from '../apis';
@ -97,23 +92,21 @@ function* adminFileDownSaga(
) {
try {
const payload = action.payload;
const res = yield call(Apis.qnaAPI.adminFileDown, payload);
const { errorCode } = res;
if (errorCode) {
// 오류메시지 호출
yield put(
MessageActions.IS_ERROR({
errorCode: errorCode,
errorMessage: '처리중 오류가 발생하였습니다',
isHistoryBack: false,
isRefresh: false
})
);
return;
}
// yield put(Actions.ADMIN_FILE_DOWN.success(data));
console.log(payload);
let alink = document.createElement('a');
alink.href = `${HOST}${payload[0].downloadUrl.substring(1)}`;
alink.download = payload[0].fileName;
alink.click();
document.removeChild(alink);
// Promise.all(
// payload.map(i => {
// let alink = document.createElement('a');
// alink.href = `${HOST}${i.downloadUrl.substring(1)}`;
// alink.click();
// document.removeChild(alink);
// })
} catch (error) {
yield put(Actions.ADMIN_FILE_DOWN.failure(error));
}

48
src/modules/laanc/actions/laancActions.ts

@ -10,7 +10,10 @@ import {
LaancSunRq,
LaancAprvRq,
LaancAprvData,
LaancDetailData
LaancDetailData,
FlightPlanAreaData,
VaildElevData,
VaildAreaData
} from '../models/laancModels';
// laanc 비행계획서 승인
@ -38,9 +41,25 @@ const LAANC_DETAIL_REQUEST = 'laanc/detail/REQUEST';
const LAANC_DETAIL_SUCCESS = 'laanc/detail/SUCCESS';
const LAANC_DETAIL_FAILURE = 'laanc/detail/FAILURE';
//laanc 허용 고도
const LAANC_ALTITUDE_REQUEST = 'laanc/altitude/REQUEST';
const LAANC_ALTITUDE_SUCCESS = 'laanc/altitude/SUCCESS';
const LAANC_ALTITUDE_FAILURE = 'laanc/altitude/FAILURE';
// 비행 관제 구역 체크
const LAANC_VALID_AREA_REQUEST = 'laanc/valid/area/REQUEST';
const LAANC_VALID_AREA_SUCCESS = 'laanc/valid/area/SUCCESS';
const LAANC_VALID_AREA_FAILURE = 'laanc/valid/area/FAILURE';
// laanc 초기화
const INIT_LAANC = 'laanc/init';
// 허뎓 고도 초기화
const INIT_ALTITUDE = 'laanc/init/altitude';
// 관제권 초기화
const INIT_AREA = 'laanc/init/area';
// laanc 비행계획서 승인
export const LAANC_FLIGHT_Approval = createAsyncAction(
LAANC_FLIGHT_APPROVAL_REQUEST,
@ -48,8 +67,15 @@ export const LAANC_FLIGHT_Approval = createAsyncAction(
LAANC_FLIGHT_APPROVAL_FAILURE
)<FlightPlanData, LaancApproval, AxiosError>();
// laanc 초기화
export const LAANC_APPROVAL_INIT = createAction(INIT_LAANC)();
// 허용고도 초기화
export const LAANC_ALTITUDE_INIT = createAction(INIT_ALTITUDE)();
// 관제권 초기화
export const LAANC_AREA_INIT = createAction(INIT_AREA)();
// laanc 비행계획서 생성
export const LAANC_FLIGHT_CREATE = createAsyncAction(
LAANC_FLIGHT_CREATE_REQUEST,
@ -78,12 +104,30 @@ export const LAANC_DETAIL = createAsyncAction(
LAANC_DETAIL_FAILURE
)<string, LaancDetailData, AxiosError>();
// laanc 허용 고도
export const LAANC_ALTITUDE = createAsyncAction(
LAANC_ALTITUDE_REQUEST,
LAANC_ALTITUDE_SUCCESS,
LAANC_ALTITUDE_FAILURE
)<FlightPlanAreaData, VaildElevData[], AxiosError>();
//비행 관제 구역 체크
export const LAANC_VALID_AREA = createAsyncAction(
LAANC_VALID_AREA_REQUEST,
LAANC_VALID_AREA_SUCCESS,
LAANC_VALID_AREA_FAILURE
)<FlightPlanAreaData, VaildAreaData[], AxiosError>();
const actions = {
LAANC_FLIGHT_Approval,
LAANC_FLIGHT_CREATE,
LAANC_APPROVAL_INIT,
LAANC_SUN_DATA,
LAANC_APRV_LIST,
LAANC_DETAIL
LAANC_DETAIL,
LAANC_ALTITUDE,
LAANC_VALID_AREA,
LAANC_ALTITUDE_INIT,
LAANC_AREA_INIT
};
export type LaancAction = ActionType<typeof actions>;

13
src/modules/laanc/apis/laancApi.ts

@ -36,5 +36,18 @@ export const laancApi = {
getDetail: async (data: string) => {
const res = await axios.get(`api/bas/laanc/aprv/detail/${data}`);
return res.data;
},
//laanc 허용 고도
postValidElev: async (data: FlightPlanAreaData) => {
const res = await axios.post(`api/bas/laanc/valid/elev`, data);
return res;
},
// 비행 관제 구역 체크
postValidArea: async (data: FlightPlanAreaData) => {
const res = await axios.post(
`api/bas/laanc/valid/duplicated/airspace`,
data
);
return res;
}
};

39
src/modules/laanc/models/laancModels.ts

@ -7,6 +7,8 @@ export interface laancState {
laancSun: LaancSunData[] | undefined;
laancSearchData: LaancAprvData[] | undefined;
laancDetail: LaancDetailData | undefined;
laancElev: VaildElevData | undefined;
laancArea: VaildAreaData | undefined;
}
// laanc계획서 초기값
@ -368,6 +370,8 @@ export const laancControlData = {
laancSun: undefined,
laancSearchData: undefined,
laancDetail: undefined,
laancElev: undefined,
laancArea: undefined,
detail: {
planSno: 0,
groupId: '',
@ -751,3 +755,38 @@ export interface LaancDetailData {
elev: string;
arcrftWght: string;
}
export interface VaildElevData {
data: number;
}
// 비행 관제 구역 체크
export interface VaildAreaData {
rq: {
planAreaSno: number;
planSno: number;
areaType: string;
bufferZone: number;
fltElev: string;
docState: string;
coordList: [
{
planAreaCoordSno: number;
planAreaSno: number;
lat: number;
lon: number;
docState: string;
}
];
bufferCoordList: [
{
planAreaCoordSno: number;
planAreaSno: number;
lat: number;
lon: number;
docState: string;
}
];
};
duplicated: false;
}

22
src/modules/laanc/reducers/laancReducers.ts

@ -50,6 +50,28 @@ export const laancReducer = createReducer<laancState, Actions.LaancAction>(
const data = action.payload;
draft.laancDetail = data;
})
)
.handleAction(Actions.LAANC_ALTITUDE.success, (state, action) =>
produce(state, draft => {
const data = action.payload;
draft.laancElev = data[0];
})
)
.handleAction(Actions.LAANC_VALID_AREA.success, (state, action) =>
produce(state, draft => {
const data = action.payload;
draft.laancArea = data[0];
})
)
.handleAction(Actions.LAANC_ALTITUDE_INIT, (state, action) =>
produce(state, draft => {
draft.laancElev = undefined;
})
)
.handleAction(Actions.LAANC_AREA_INIT, (state, action) =>
produce(state, draft => {
draft.laancArea = undefined;
})
);
export default laancReducer;

40
src/modules/laanc/sagas/laancSagas.ts

@ -131,10 +131,50 @@ function* getDetailSaga(
);
}
}
// laanc 허용 고도
function* postValidElevSaga(
action: ActionType<typeof Actions.LAANC_ALTITUDE.request>
) {
try {
const deail = action.payload;
const res = yield call(Apis.laancApi.postValidElev, deail);
yield put(Actions.LAANC_ALTITUDE.success(res.data));
} catch (error) {
yield put(
MessageActions.IS_ERROR({
errorCode: ERROR_MESSAGE.code,
errorMessage: ERROR_MESSAGE.message,
isHistoryBack: false,
isRefresh: false
})
);
}
}
//비행 관제 구역 체크
function* postValidAreaSaga(
action: ActionType<typeof Actions.LAANC_VALID_AREA.request>
) {
try {
const deail = action.payload;
const res = yield call(Apis.laancApi.postValidArea, deail);
yield put(Actions.LAANC_VALID_AREA.success(res.data));
} catch (error) {
yield put(
MessageActions.IS_ERROR({
errorCode: ERROR_MESSAGE.code,
errorMessage: ERROR_MESSAGE.message,
isHistoryBack: false,
isRefresh: false
})
);
}
}
export function* laancSaga() {
yield takeEvery(Actions.LAANC_FLIGHT_Approval.request, postApprovalsata);
yield takeEvery(Actions.LAANC_FLIGHT_CREATE.request, postCreatesata);
yield takeEvery(Actions.LAANC_SUN_DATA.request, getSunDataSaga);
yield takeEvery(Actions.LAANC_APRV_LIST.request, getAprvListSaga);
yield takeEvery(Actions.LAANC_DETAIL.request, getDetailSaga);
yield takeEvery(Actions.LAANC_ALTITUDE.request, postValidElevSaga);
yield takeEvery(Actions.LAANC_VALID_AREA.request, postValidAreaSaga);
}

Loading…
Cancel
Save