Browse Source

[비행관제] 비정상 상황 작업

pull/2/head
노승철 2 years ago
parent
commit
345139f44c
  1. 147
      src/components/map/naver/NaverMap.js
  2. 115
      src/components/map/naver/dron/DronHistory.js
  3. 276
      src/components/map/naver/dron/DronMarker.js
  4. 17
      src/components/map/naver/dron/DronPlan.js
  5. 46
      src/components/map/naver/dron/DronToast.js
  6. 2
      src/components/websocket/WebsocketClient.js
  7. 19
      src/modules/control/gp/actions/controlGpAction.ts
  8. 24
      src/modules/control/gp/apis/controlGpApi.ts
  9. 17
      src/modules/control/gp/models/controlGpModel.ts
  10. 12
      src/modules/control/gp/reducers/controlGpReducer.ts
  11. 266
      src/modules/control/gp/sagas/controlGpSaga.ts

147
src/components/map/naver/NaverMap.js

@ -11,71 +11,94 @@ import geoJson from '../geojson/airArea.json';
import SensorZone from "./sensor/SensorZone";
import { controlGroupAuthAction } from '../../../modules/control/gp';
import DronPlan from './dron/DronPlan';
import DronToast from './dron/DronToast';
import { toast } from 'react-toastify';
export const NaverCustomMap = () => {
const dispatch = useDispatch();
const naver = window.naver;
const [isMapLoad, setIsMapLoad] = useState(false);
const [mapObject, setMapObject] = useState(null);
let arrMarkers = []; // 마커 배열
let arrPolyline = []; // 폴리라인 배열
let features = geoJson.features;
useEffect(() => {
NaverMapInit();
dispatch(controlGroupAuthAction.request());
}, []);
useEffect(() => {
}, [mapObject]);
const NaverMapInit = () => {
const mapOptions = {
center: new naver.maps.LatLng(36.56793936069445, 127.85101412107547),
zoom: 10,
zoomControl: true,
mapTypeId: naver.maps.MapTypeId.HYBRID,
zoomControlOptions: {
position: naver.maps.Position.TOP_LEFT,
style: naver.maps.ZoomControlStyle.SMALL
}
const dispatch = useDispatch();
const naver = window.naver;
// const { controlGpContains } = useSelector(state => state.controlGpFltPlanState);
const [isMapLoad, setIsMapLoad] = useState(false);
const [mapObject, setMapObject] = useState(null);
const [arrPolyline, setArrPolyline] = useState([]);
let arrMarkers = []; // 마커 배열
// let arrPolyline = []; // 폴리라인 배열
let features = geoJson.features;
useEffect(() => {
NaverMapInit();
dispatch(controlGroupAuthAction.request());
}, []);
useEffect(() => {
}, [mapObject]);
// useEffect(() => {
// if (controlGpContains) {
// if(!controlGpContains.contains) {
// toast.info(<DronToast title={'비정상 상황 알림'} message={'경로 상에 비행 구역을 이탈하였습니다.'}/>, {
// autoClose: 3000,
// hideProgressBar: true,
// position: toast.POSITION.BOTTOM_RIGHT,
// })
// }
// }
// }, [controlGpContains])
const NaverMapInit = () => {
const mapOptions = {
center: new naver.maps.LatLng(36.56793936069445, 127.85101412107547),
zoom: 10,
zoomControl: true,
mapTypeId: naver.maps.MapTypeId.HYBRID,
zoomControlOptions: {
position: naver.maps.Position.TOP_LEFT,
style: naver.maps.ZoomControlStyle.SMALL
}
};
setMapObject(new naver.maps.Map('map', mapOptions));
};
setMapObject(new naver.maps.Map('map', mapOptions));
};
return (
<>
<div id='map' style={{ width: '100%', height: '100vh' }}></div>
{mapObject != null ? (
const handleHistoryInit = (line) => {
setArrPolyline([...arrPolyline, line])
}
return (
<>
<DronMarker
map={mapObject}
naver={naver}
/>
<DronPlan
map={mapObject}
naver={naver}
/>
<NaverMapControl map={mapObject} />
<DronHistory
map={mapObject}
naver={naver}
arrPolyline={arrPolyline}
/>
<FeatureAirZone map={mapObject} naver={naver} features={features} />
<NaverMapSearch map={mapObject} naver={naver} />
<SensorZone map={mapObject} naver={naver} />
</>
) : null}
<div id='map' style={{ width: '100%', height: '100vh' }}></div>
{mapObject != null ? (
<>
<DronMarker
map={mapObject}
naver={naver}
/>
<DronPlan
map={mapObject}
naver={naver}
/>
{/* */}
</>
);
<NaverMapControl map={mapObject} />
<DronHistory
map={mapObject}
naver={naver}
arrPolyline={arrPolyline}
handleHistoryInit={handleHistoryInit}
/>
<FeatureAirZone map={mapObject} naver={naver} features={features} />
<NaverMapSearch map={mapObject} naver={naver} />
<SensorZone map={mapObject} naver={naver} />
</>
) : null}
{/* */}
</>
);
};

115
src/components/map/naver/dron/DronHistory.js

@ -3,61 +3,62 @@ import { useDispatch, useSelector } from 'react-redux';
import { controlGpHisAction } from '../../../../modules/control/gp';
export const DronHistory = props => {
const { controlGpHistory } = useSelector(state => state.controlGpHisState);
const { objectId, isClickObject } = useSelector(
state => state.controlMapReducer
);
let naver = props.naver;
let polyline;
let polylinePath = [];
const dispatch = useDispatch();
useEffect(() => {
// console.log('>>>', controlGpHistory);
polylineRemove();
polylineInit();
}, [controlGpHistory]);
useEffect(() => {
if (isClickObject) {
dispatch(controlGpHisAction.request({ id: objectId }));
} else {
polylineRemove();
}
}, [objectId, isClickObject]);
const polylineRemove = () => {
if (props.arrPolyline) {
props.arrPolyline.map(item => {
item.setMap(null);
});
}
};
const polylineInit = () => {
if (controlGpHistory) {
polyline = new naver.maps.Polyline({
clickable: false,
strokeColor: '#ff4961',
strokeStyle: 'solid',
strokeOpacity: 5,
strokeWeight: 1.5
});
controlGpHistory.map(item => {
if (item.lat > 0 && item.lng > 0) {
const position = new naver.maps.LatLng(item.lat, item.lng);
polylinePath.push(position);
}
// console.log('>>>>>>>>>>>', item);
});
polyline.setPath(polylinePath);
polyline.setMap(props.map);
props.arrPolyline.push(polyline);
}
};
return null;
const { controlGpHistory } = useSelector(state => state.controlGpHisState);
const { objectId, isClickObject } = useSelector(
state => state.controlMapReducer
);
let naver = props.naver;
let polyline;
let polylinePath = [];
const dispatch = useDispatch();
useEffect(() => {
// console.log('>>>', controlGpHistory);
// polylineRemove();
polylineInit();
}, [controlGpHistory]);
useEffect(() => {
if (isClickObject) {
dispatch(controlGpHisAction.request({ id: objectId }));
} else {
polylineRemove();
}
}, [objectId, isClickObject]);
const polylineRemove = () => {
console.log(props.arrPolyline);
if (props.arrPolyline) {
props.arrPolyline.map(item => {
item.setMap(null);
});
}
};
const polylineInit = () => {
if (controlGpHistory) {
polyline = new naver.maps.Polyline({
clickable: false,
strokeColor: '#ff4961',
strokeStyle: 'solid',
strokeOpacity: 5,
strokeWeight: 1.5
});
controlGpHistory.map(item => {
if (item.lat > 0 && item.lng > 0) {
const position = new naver.maps.LatLng(item.lat, item.lng);
polylinePath.push(position);
}
// console.log('>>>>>>>>>>>', item);
});
polyline.setPath(polylinePath);
polyline.setMap(props.map);
props.handleHistoryInit(polyline);
}
};
return null;
};

276
src/components/map/naver/dron/DronMarker.js

@ -7,151 +7,151 @@ import { controlGpDtlAction, controlGpHisAction, controlDbHisAction, controlGpFl
import { objectClickAction, objectUnClickAction } from '../../../../modules/control/map/actions/controlMapActions';
export const DronMarker = props => {
const dispatch = useDispatch();
const { controlGpList } = useSelector(state => state.controlGpState);
const { controlGroupAuthInfo } = useSelector(state => state.controlGroupAuthState);
const { objectId, isClickObject } = useSelector(state => state.controlMapReducer);
const [arrMarkers, setArrMarkers] = useState([]);
let naver = props.naver;
var contentString = ['<div class="iw_inner"> dddd', '</div>'].join('');
var infowindow = new naver.maps.InfoWindow({
content: contentString
});
useEffect(() => {
markerInit();
}, [controlGpList]);
useEffect(() => {
arrMarkers.map(clickMarker => {
if (objectId === clickMarker.id && isClickObject) {
// clickMarker.setIcon(DronIconPulple);
clickMarker.setIcon({
url: DronIconPulple,
origin: new naver.maps.Point(0, 0),
anchor: new naver.maps.Point(15, 15),
const dispatch = useDispatch();
const { controlGpList } = useSelector(state => state.controlGpState);
const { controlGroupAuthInfo } = useSelector(state => state.controlGroupAuthState);
const { objectId, isClickObject } = useSelector(state => state.controlMapReducer);
const [arrMarkers, setArrMarkers] = useState([]);
let naver = props.naver;
var contentString = ['<div class="iw_inner"> dddd', '</div>'].join('');
var infowindow = new naver.maps.InfoWindow({
content: contentString
});
useEffect(() => {
markerInit();
}, [controlGpList]);
useEffect(() => {
arrMarkers.map(clickMarker => {
if (objectId === clickMarker.id && isClickObject) {
// clickMarker.setIcon(DronIconPulple);
clickMarker.setIcon({
url: DronIconPulple,
origin: new naver.maps.Point(0, 0),
anchor: new naver.maps.Point(15, 15),
});
} else {
clickMarker.setIcon({
url: DronIcon,
origin: new naver.maps.Point(0, 0),
anchor: new naver.maps.Point(15, 15),
});
}
});
} else {
clickMarker.setIcon({
url: DronIcon,
origin: new naver.maps.Point(0, 0),
anchor: new naver.maps.Point(15, 15),
}, [objectId, isClickObject]);
useEffect(() => {
arrMarkers.map(clickMarker => {
if (objectId === clickMarker.id) {
props.map.setCenter(clickMarker.getPosition());
props.map.setZoom(13, true);
}
});
}, [objectId]);
//마커를 그린다.
const addMarkers = (position, id, controlId) => {
var marker = new naver.maps.Marker({
position: position,
title: id,
id: id,
controlId: controlId,
icon: {
// content: [
// '<div>dddd</div>',
// ].join(''),
url: DronIcon,
// size: new naver.maps.Size(50, 50),
origin: new naver.maps.Point(0, 0),
anchor: new naver.maps.Point(15, 15),
}
});
}
});
}, [objectId, isClickObject]);
useEffect(() => {
arrMarkers.map(clickMarker => {
if (objectId === clickMarker.id) {
props.map.setCenter(clickMarker.getPosition());
props.map.setZoom(13, true);
}
});
}, [objectId]);
//마커를 그린다.
const addMarkers = (position, id, controlId) => {
var marker = new naver.maps.Marker({
position: position,
title: id,
id: id,
controlId: controlId,
icon: {
// content: [
// '<div>dddd</div>',
// ].join(''),
url: DronIcon,
// size: new naver.maps.Size(50, 50),
origin: new naver.maps.Point(0, 0),
anchor: new naver.maps.Point(15, 15),
}
});
marker.setMap(props.map);
marker.setMap(props.map);
naver.maps.Event.addListener(marker, 'click', function (e) {
handlerDronClick(marker);
});
naver.maps.Event.addListener(marker, 'click', function (e) {
handlerDronClick(marker);
});
setArrMarkers(m => [...m, marker]);
};
const handlerDronClick = marker => {
const idntfNum = marker.id;
const contorlId = marker.controlId;
// 클릭한 식별번호 정보를 가진 그룹 추출 (1건만 존재해야하는게 맞는 듯)
const group = controlGroupAuthInfo.find(group => group.idntfNum === idntfNum);
//히스토리 불러오기
dispatch(objectClickAction(contorlId));
dispatch(controlGpDtlAction.request(contorlId));
dispatch(controlGpFlightPlanAction.request(group));
};
//마커를 삭제 한다.
const removeMarkers = marker => {
marker.setMap(null);
};
//마커에 위치를 이동한다.
const moveMarkers = (marker, position) => {
marker.setPosition(position);
};
//데이터가 없는 마커를 모두 삭제 한다.
const allRemoveMarkers = () => {
if (arrMarkers && controlGpList) {
arrMarkers.map(marker => {
const isExists = controlGpList.find(
item => item.objectId === marker.id
);
if (!isExists) {
removeMarkers(marker);
const arrData = arrMarkers.filter(
item => item.id != marker.id
);
removeArrMarkers(arrData);
dispatch(objectUnClickAction());
setArrMarkers(m => [...m, marker]);
};
const handlerDronClick = marker => {
const idntfNum = marker.id;
const contorlId = marker.controlId;
// 클릭한 식별번호 정보를 가진 그룹 추출
// const group = controlGroupAuthInfo.find(group => group.idntfNum === idntfNum);
//히스토리 불러오기
dispatch(objectClickAction(contorlId));
dispatch(controlGpDtlAction.request(contorlId));
dispatch(controlGpFlightPlanAction.request(idntfNum));
};
//마커를 삭제 한다.
const removeMarkers = marker => {
marker.setMap(null);
};
//마커에 위치를 이동한다.
const moveMarkers = (marker, position) => {
marker.setPosition(position);
};
//데이터가 없는 마커를 모두 삭제 한다.
const allRemoveMarkers = () => {
if (arrMarkers && controlGpList) {
arrMarkers.map(marker => {
const isExists = controlGpList.find(
item => item.objectId === marker.id
);
if (!isExists) {
removeMarkers(marker);
const arrData = arrMarkers.filter(
item => item.id != marker.id
);
removeArrMarkers(arrData);
dispatch(objectUnClickAction());
}
});
}
});
}
};
//마커를 셋팅 한다.
const markerInit = () => {
if (controlGpList) {
allRemoveMarkers();
controlGpList.map(item => {
const position = new naver.maps.LatLng(item.lat, item.lng);
if (arrMarkers) {
const isExists = arrMarkers.find(
ele => ele.id === item.objectId
);
if (isExists) {
moveMarkers(isExists, position);
} else {
addMarkers(position, item.objectId, item.controlId);
}
} else {
addMarkers(position, item.objectId, item.controlId);
};
//마커를 셋팅 한다.
const markerInit = () => {
if (controlGpList) {
allRemoveMarkers();
controlGpList.map(item => {
const position = new naver.maps.LatLng(item.lat, item.lng);
if (arrMarkers) {
const isExists = arrMarkers.find(
ele => ele.id === item.objectId
);
if (isExists) {
moveMarkers(isExists, position);
} else {
addMarkers(position, item.objectId, item.controlId);
}
} else {
addMarkers(position, item.objectId, item.controlId);
}
});
}
});
}
};
};
const removeArrMarkers = arrData => {
setArrMarkers(arrData);
};
const removeArrMarkers = arrData => {
setArrMarkers(arrData);
};
return null;
return null;
};

17
src/components/map/naver/dron/DronPlan.js

@ -1,6 +1,8 @@
import { useEffect, useState } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { controlGpFlightPlanInitAction } from '../../../../modules/control/gp';
import DronToast from './DronToast';
import { toast } from 'react-toastify';
const DronPlan = ({ naver, map }) => {
@ -9,6 +11,8 @@ const DronPlan = ({ naver, map }) => {
const { controlGpList } = useSelector(state => state.controlGpState);
const { controlGpFltPlanList } = useSelector(state => state.controlGpFltPlanState);
const { objectId, isClickObject } = useSelector(state => state.controlMapReducer);
const { controlGpContains } = useSelector(state => state.controlGpFltPlanState);
const [area, setArea] = useState(); // 비행 구역 관리
const [buffer, setBuffer] = useState(); // 버퍼 구역 관리
@ -45,6 +49,19 @@ const DronPlan = ({ naver, map }) => {
}
}, [controlGpList])
useEffect(() => {
if (controlGpContains) {
if(!controlGpContains.contains) {
toast.info(<DronToast title={'비정상 상황 알림'} message={'경로 상에 비행 구역을 이탈하였습니다.'}/>, {
autoClose: 3000,
hideProgressBar: true,
position: toast.POSITION.BOTTOM_RIGHT,
})
}
}
}, [controlGpContains])
/* 비행 구역 그리기. */
const init = () => {

46
src/components/map/naver/dron/DronToast.js

@ -0,0 +1,46 @@
import React, { useEffect, useState } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { Fragment } from 'react';
import { toast } from 'react-toastify';
import Avatar from '../../../../@core/components/avatar';
import { Bell, Check, X, AlertTriangle, Info } from 'react-feather'
import {
Card,
CardHeader,
CardBody,
CardTitle,
Button,
Toast,
ToastBody,
ToastHeader,
Row,
Col,
} from 'reactstrap';
import log from '../../../../assets/images/logo/logo.png';
const DronToast = ({ title, message }) => {
return (
<Fragment>
<div className='toastify-header'>
<div className='title-wrapper'>
<Avatar size='sm' color='info' icon={<Info size={12} />} />
<h6 className='text-info ml-50 mb-0'>
{title}
</h6>
</div>
</div>
<div className='toastify-body'>
<span>
{message}
</span>
</div>
</Fragment>
)
}
export default DronToast;

2
src/components/websocket/WebsocketClient.js

@ -25,6 +25,8 @@ const WebsocketClient = () => {
websocket.onmessage = e => {
const data = e.data;
const controlGpList = JSON.parse(data);
// console.log('gps ', controlGpList)
dispatch(Actions.controlGpAction.request(controlGpList));
};

19
src/modules/control/gp/actions/controlGpAction.ts

@ -5,9 +5,10 @@ import {
ControlDetailData,
ControlGpData,
ControlGpDtlState,
ControlGpFlightPlanDataList,
ControlGpFlightPlanRQ,
ControlGpFlightPlanDataList,
ControlGpHisState,
ControlGpPlanContainsRQ,
ControlGpPlanContainsRS,
ControlGpState,
ControlGroupAuthState
} from '../models/controlGpModel';
@ -40,6 +41,11 @@ const CONTROL_FLIGHT_PLAN_FAILURE = 'control/gp/flight/plan/CONTROL_FLIGHT_PLAN_
const CONTROL_FLIGHT_PLAN_INIT = 'control/gp/flight/plan/CONTROL_FLIGHT_PLAN_INIT';
// [관제] 비행 구역 비정상 여부 체크
const CONTROL_FLIGHT_PLAN_WARN_REQUEST = 'control/gp/flight/plan/CONTROL_FLIGHT_PLAN_WARN_REQUEST';
const CONTROL_FLIGHT_PLAN_WARN_SUCCESS = 'control/gp/flight/plan/CONTROL_FLIGHT_PLAN_WARN_SUCCESS';
const CONTROL_FLIGHT_PLAN_WARN_FAILURE = 'control/gp/flight/plan/CONTROL_FLIGHT_PLAN_WARN_FAILURE';
export const controlGpAction = createAsyncAction(
CONTROL_GP_REQUEST,
CONTROL_GP_SUCCESS,
@ -74,7 +80,13 @@ export const controlGpFlightPlanAction = createAsyncAction(
CONTROL_FLIGHT_PLAN_REQUEST,
CONTROL_FLIGHT_PLAN_SUCCESS,
CONTROL_FLIGHT_PLAN_FAILURE,
)<ControlGpFlightPlanRQ, ControlGpFlightPlanDataList, AxiosError>();
)<string, ControlGpFlightPlanDataList, AxiosError>();
export const controlGpFlightPlanWarnAction = createAsyncAction(
CONTROL_FLIGHT_PLAN_WARN_REQUEST,
CONTROL_FLIGHT_PLAN_WARN_SUCCESS,
CONTROL_FLIGHT_PLAN_WARN_FAILURE,
)<ControlGpPlanContainsRQ, ControlGpPlanContainsRS, AxiosError>();
export const controlGpFlightPlanInitAction = createAction(CONTROL_FLIGHT_PLAN_INIT)();
@ -85,6 +97,7 @@ const actions = {
controlGpRtDtlAction,
controlGroupAuthAction,
controlGpFlightPlanAction,
controlGpFlightPlanWarnAction,
controlGpFlightPlanInitAction
};

24
src/modules/control/gp/apis/controlGpApi.ts

@ -1,5 +1,5 @@
import axios from '../../../utils/customAxiosUtil';
import { ReponseControlGpHistory, ControlGroupAuthData, ResponseControlGroupAuth, ControlGpFlightPlanRQ } from '../models/controlGpModel';
import { ReponseControlGpHistory, ControlGroupAuthData, ResponseControlGroupAuth, ControlGpPlanContainsRQ} from '../models/controlGpModel';
import qs from 'qs';
export const controlGpApi = {
@ -26,20 +26,26 @@ export const controlGpApi = {
);
return data;
},
getFlightPlan: async (rq: ControlGpFlightPlanRQ) => {
if (!rq.idntfNum) {
getFlightPlan: async (idntfNum: string) => {
if (!idntfNum) {
return null;
}
const queryString = qs.stringify(rq, {
addQueryPrefix: true,
arrayFormat: 'repeat'
});
const { data } = await axios.get(
`api/ctr/cntrl/flight_plan${queryString}`
`api/ctr/cntrl/flight_plan/${idntfNum}`
);
return data;
},
checkPlanContains: async (rq: ControlGpPlanContainsRQ) => {
if(!rq.idntfNum) {
return null;
}
const { data } = await axios.post(
`api/ctr/cntrl/contains`, rq
);
return data;
}
};

17
src/modules/control/gp/models/controlGpModel.ts

@ -1,9 +1,12 @@
import { FlightPlanData } from "../../../basis/flight/models/basisFlightModel";
export interface ControlGpState {
controlGpList: ControlGpData[] | undefined;
}
export interface ControlGpFlightPlanState {
controlGpFltPlanList: ControlGpFlightPlanDataList | undefined;
controlGpContains: ControlGpPlanContainsRS | undefined;
}
export interface ControlGpHisState {
@ -13,6 +16,7 @@ export interface ControlGpHisState {
export interface ControlGpDtlState {
controlGpDetail: ControlGpDtlData | undefined;
controlDetail: ControlDetailData | undefined;
}
export interface ControlGroupAuthState {
@ -151,10 +155,16 @@ export interface FlightPlanAreaCoordData {
// docState: string
}
export interface ControlGpFlightPlanRQ {
export interface ControlGpPlanContainsRQ {
idntfNum: string,
lat: number,
lon: number,
planList: FlightPlanData[]
}
export interface ControlGpPlanContainsRS {
contains: boolean,
idntfNum: string,
groupId: string,
cstmrSno: number, // 흠
}
export interface ReponseControlGpHistory {
@ -172,4 +182,5 @@ export const initiaResponseControlGpData = {
controlDetail: undefined,
controlGroupAuthInfo: undefined,
controlGpFltPlanList: undefined,
controlGpContains: undefined
};

12
src/modules/control/gp/reducers/controlGpReducer.ts

@ -6,6 +6,7 @@ import {
controlGpDtlAction,
controlGpFlightPlanAction,
controlGpFlightPlanInitAction,
controlGpFlightPlanWarnAction,
controlGpHisAction,
controlGpRtDtlAction,
controlGroupAuthAction
@ -24,8 +25,7 @@ export const controlGpReducer = createReducer<ControlGpState, ControlGpAction>(
initiaResponseControlGpData
).handleAction(controlGpAction.success, (state, action) =>
produce(state, draft => {
const { controlGpList } = action.payload;
console.log('gps ', controlGpList)
const { controlGpList } = action.payload;
draft.controlGpList = controlGpList;
})
)
@ -43,6 +43,12 @@ export const controlGpFltPlanReducer = createReducer<ControlGpFlightPlanState, C
draft.controlGpFltPlanList = undefined;
})
)
.handleAction(controlGpFlightPlanWarnAction.success, (state, action) =>
produce(state, draft => {
const data = action.payload;
draft.controlGpContains = data;
})
);
export const controlGpHisReducer = createReducer<
@ -74,7 +80,7 @@ export const controlGpDtlReducer = createReducer<
draft.controlDetail = data;
})
);
)
export const controlGroupAuthReducer = createReducer<
ControlGroupAuthState,

266
src/modules/control/gp/sagas/controlGpSaga.ts

@ -8,151 +8,191 @@ import decode from 'jwt-decode';
import { ControlGpData } from '../models/controlGpModel';
function* getControlGpSaga(
action: ActionType<typeof Actions.controlGpAction.request>
action: ActionType<typeof Actions.controlGpAction.request>
) {
try {
const data = action.payload;
const state = yield select();
const { objectId, isClickObject } = state.controlMapReducer;
const { controlGroupAuthInfo } = state.controlGroupAuthState;
let gpsData: ControlGpData[] = [];
try {
const data = action.payload;
const state = yield select();
const { objectId, isClickObject } = state.controlMapReducer;
const { controlGroupAuthInfo } = state.controlGroupAuthState;
const { controlGpFltPlanList } = state.controlGpFltPlanState;
const { controlGpHistory } = state.controlGpHisState;
let gpsData: ControlGpData[] = [];
if (controlGroupAuthInfo.length > 0) {
controlGroupAuthInfo.forEach((auth) => {
if (auth.groupAuthCd === 'CREATER' || auth.groupAuthCd === 'ADMIN') {
if (gpsData.length > 0) return false;
gpsData = data.filter(gps => auth.idntfNum === gps.objectId);
}
if (auth.groupAuthCd === 'USER') {
if (gpsData.length > 0) return false;
gpsData.filter(gps => auth.createUserId && auth.idntfNum === gps.objectId);
}
});
}
if(controlGroupAuthInfo.length > 0) {
controlGroupAuthInfo.forEach((auth) => {
if(auth.groupAuthCd === 'CREATER' || auth.groupAuthCd === 'ADMIN') {
if(gpsData.length > 0) return false;
yield put(
Actions.controlGpAction.success({
controlGpList: gpsData
})
);
gpsData = data.filter(gps => auth.idntfNum === gps.objectId);
}
if(auth.groupAuthCd === 'USER') {
if(gpsData.length > 0) return false;
if (objectId && isClickObject) {
let detailData;
gpsData.filter(gps => auth.createUserId && auth.idntfNum === gps.objectId);
}
});
}
yield put(
Actions.controlGpAction.success({
controlGpList: gpsData
})
);
if (objectId && isClickObject) {
let detailData;
//History 호출
yield put(Actions.controlGpHisAction.request({ id: objectId }));
//상세 정보에서 실시간 데이터 호출
data.map(item => {
if (item.controlId === objectId) {
detailData = item;
//상세 정보에서 실시간 데이터 호출
gpsData.map(item => {
if (item.controlId === objectId) {
detailData = item;
}
});
yield put(Actions.controlGpRtDtlAction.request(detailData));
// History Push
if(controlGpHistory) {
const stateHistory = controlGpHistory;
const history = stateHistory.map((h) => {
return {
...h,
detailData
}
});
yield put(Actions.controlGpHisAction.success(history));
}
// 비행구역 contains check
if(controlGpFltPlanList) {
const containsRQ = {
idntfNum: detailData.objectId,
lat: detailData.lat,
lon: detailData.lng,
planList: controlGpFltPlanList
}
yield put(Actions.controlGpFlightPlanWarnAction.request(containsRQ));
}
}
});
yield put(Actions.controlGpRtDtlAction.request(detailData));
} catch (error) {
yield put(Actions.controlGpAction.failure(error));
}
} catch (error) {
yield put(Actions.controlGpAction.failure(error));
}
}
function* getControlGpHistorySaga(
action: ActionType<typeof Actions.controlGpHisAction.request>
action: ActionType<typeof Actions.controlGpHisAction.request>
) {
try {
const { id } = action.payload;
const data = yield call(controlGpApi.getHistory, id);
yield put(
Actions.controlGpHisAction.success({
controlGpHistory: data
})
);
} catch (error) {
yield put(Actions.controlGpHisAction.failure(error));
}
try {
const { id } = action.payload;
const data = yield call(controlGpApi.getHistory, id);
yield put(
Actions.controlGpHisAction.success({
controlGpHistory: data
})
);
} catch (error) {
yield put(Actions.controlGpHisAction.failure(error));
}
}
function* controlGpRtDtlSaga(
action: ActionType<typeof Actions.controlGpRtDtlAction.request>
action: ActionType<typeof Actions.controlGpRtDtlAction.request>
) {
try {
const controlGpDetail = action.payload;
// console.log(controlGpDetail);
yield put(
Actions.controlGpRtDtlAction.success({
controlDetail: undefined,
controlGpDetail: controlGpDetail
})
);
} catch (error) {
yield put(Actions.controlGpRtDtlAction.failure(error));
}
try {
const controlGpDetail = action.payload;
// console.log(controlGpDetail);
yield put(
Actions.controlGpRtDtlAction.success({
controlDetail: undefined,
controlGpDetail: controlGpDetail
})
);
} catch (error) {
yield put(Actions.controlGpRtDtlAction.failure(error));
}
}
function* controlDtlSaga(
action: ActionType<typeof Actions.controlGpDtlAction.request>
action: ActionType<typeof Actions.controlGpDtlAction.request>
) {
try {
const controlId = action.payload;
const { data } = yield call(controlGpApi.getDetail, controlId);
console.log('data>>>>>>>>>>>>>>>>>>>>>', data);
yield put(Actions.controlGpDtlAction.success(data));
} catch (error) {
yield put(Actions.controlGpRtDtlAction.failure(error));
}
try {
const controlId = action.payload;
const { data } = yield call(controlGpApi.getDetail, controlId);
console.log('data>>>>>>>>>>>>>>>>>>>>>', data);
yield put(Actions.controlGpDtlAction.success(data));
} catch (error) {
yield put(Actions.controlGpDtlAction.failure(error));
}
}
function* controlGroupAuthSaga (
action: ActionType<typeof Actions.controlGroupAuthAction.request>
function* controlGroupAuthSaga(
action: ActionType<typeof Actions.controlGroupAuthAction.request>
) {
const token = cookieStorage.getCookie(COOKIE_ACCESS_TOKEN);
const token = cookieStorage.getCookie(COOKIE_ACCESS_TOKEN);
try {
if (token) {
const user = decode<LoginData>(token);
const data = yield call(controlGpApi.getGroupAuth, user.cstmrSno);
try {
if(token) {
const user = decode<LoginData>(token);
const data = yield call(controlGpApi.getGroupAuth, user.cstmrSno);
yield put(Actions.controlGroupAuthAction.success({
controlGroupAuthInfo: data
}));
yield put(Actions.controlGroupAuthAction.success({
controlGroupAuthInfo: data
}));
}
} catch (error) {
yield put(Actions.controlGroupAuthAction.failure(error));
}
}
function* controlGpFlightPlanSaga(
action: ActionType<typeof Actions.controlGpFlightPlanAction.request>
) {
try {
const idntfNum = action.payload;
const list = yield call(controlGpApi.getFlightPlan, idntfNum);
console.log("flight plan list : ", list);
yield put(Actions.controlGpFlightPlanAction.success(list));
} catch (error) {
yield put(Actions.controlGpFlightPlanAction.failure(error));
}
} catch (error) {
yield put(Actions.controlGroupAuthAction.failure(error));
}
}
function* controlGpFlightPlanSaga (
action: ActionType<typeof Actions.controlGpFlightPlanAction.request>
function* controlGpFlightPlanWarnSaga(
action: ActionType<typeof Actions.controlGpFlightPlanWarnAction.request>
) {
try {
const rq = action.payload;
try {
const idntfNum = action.payload;
const list = yield call(controlGpApi.getFlightPlan, rq);
const rs = yield call(controlGpApi.checkPlanContains, idntfNum);
console.log("flight plan list : ", list);
yield put(Actions.controlGpFlightPlanWarnAction.success(rs));
yield put(Actions.controlGpFlightPlanAction.success(list));
} catch (error) {
yield put(Actions.controlGpFlightPlanAction.failure(error));
}
} catch (error) {
yield put(Actions.controlGpFlightPlanWarnAction.failure(error));
}
}
export function* controlGpSaga() {
yield takeEvery(Actions.controlGpAction.request, getControlGpSaga);
yield takeEvery(Actions.controlGpHisAction.request, getControlGpHistorySaga);
yield takeEvery(Actions.controlGpRtDtlAction.request, controlGpRtDtlSaga);
yield takeEvery(Actions.controlGpDtlAction.request, controlDtlSaga);
yield takeEvery(Actions.controlGroupAuthAction.request, controlGroupAuthSaga);
yield takeEvery(Actions.controlGpFlightPlanAction.request, controlGpFlightPlanSaga);
yield takeEvery(Actions.controlGpAction.request, getControlGpSaga);
yield takeEvery(Actions.controlGpHisAction.request, getControlGpHistorySaga);
yield takeEvery(Actions.controlGpRtDtlAction.request, controlGpRtDtlSaga);
yield takeEvery(Actions.controlGpDtlAction.request, controlDtlSaga);
yield takeEvery(Actions.controlGroupAuthAction.request, controlGroupAuthSaga);
yield takeEvery(Actions.controlGpFlightPlanAction.request, controlGpFlightPlanSaga);
yield takeEvery(Actions.controlGpFlightPlanWarnAction.request, controlGpFlightPlanWarnSaga);
}

Loading…
Cancel
Save