sanguu(박상현) 2 years ago
parent
commit
aa4488bc0c
  1. 17
      src/@core/layouts/components/navbar/NavbarUser.js
  2. 2662
      src/components/map/geojson/airArea.json
  3. 2
      src/components/map/naver/NaverMap.js
  4. 78
      src/components/map/naver/dron/DronMarker.js
  5. 104
      src/components/map/naver/feature/FeatureAirZone.js
  6. 4
      src/containers/basis/dron/BasisDronDetailContainer.js
  7. 14
      src/modules/control/gp/actions/controlGpAction.ts
  8. 7
      src/modules/control/gp/models/controlGpModel.ts
  9. 30
      src/modules/control/gp/reducers/controlGpReducer.ts
  10. 69
      src/modules/control/gp/sagas/controlGpSaga.ts
  11. 4
      src/redux/reducers/rootReducer.ts
  12. 75
      src/views/control/report/ControlReportDetail.js
  13. 10
      src/views/control/report/ControlReportList.js
  14. 105
      test/pav-warning.js

17
src/@core/layouts/components/navbar/NavbarUser.js

@ -105,26 +105,31 @@ const NavbarUser = props => {
</NavItem> </NavItem>
<NavItem> <NavItem>
<NavLink <NavLink
onClick={() => window.open('/weather/info/index', '_blank')} onClick={() =>
window.open(
'https://aim.koca.go.kr/google/xNotamViewMap.jsp',
'_blank'
)
}
// active={active === '2'} // active={active === '2'}
// onClick={() => { // onClick={() => {
// toggle('2') // toggle('2')
// }} // }}
> >
날씨정보 NOTAM 정보
</NavLink> </NavLink>
</NavItem> </NavItem>
{/* <NavItem> <NavItem>
<NavLink <NavLink
onClick={() => window.open('/testDraw', '_blank')} onClick={() => window.open('/weather/info/index', '_blank')}
// active={active === '2'} // active={active === '2'}
// onClick={() => { // onClick={() => {
// toggle('2') // toggle('2')
// }} // }}
> >
버퍼 테스트 날씨 정보
</NavLink> </NavLink>
</NavItem> */} </NavItem>
</Nav> </Nav>
{/* <div className='bookmark-wrapper d-flex align-items-center'> {/* <div className='bookmark-wrapper d-flex align-items-center'>
<NavItem className='d-none d-lg-block'> <NavItem className='d-none d-lg-block'>

2662
src/components/map/geojson/airArea.json

File diff suppressed because it is too large Load Diff

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

@ -6,7 +6,6 @@ import NaverMapControl from './NaverMapControl';
import { NaverMapSearch } from './search/NaverMapSearch'; import { NaverMapSearch } from './search/NaverMapSearch';
import { FeatureAirZone } from './feature/FeatureAirZone'; import { FeatureAirZone } from './feature/FeatureAirZone';
import geoJson from '../geojson/airArea.json'; import geoJson from '../geojson/airArea.json';
import { controlGroupAuthAction } from '../../../modules/control/gp';
import DronPlan from './dron/DronPlan'; import DronPlan from './dron/DronPlan';
import DronToast from './dron/DronToast'; import DronToast from './dron/DronToast';
import SensorZone from './sensor/SensorZone'; import SensorZone from './sensor/SensorZone';
@ -22,7 +21,6 @@ export const NaverCustomMap = () => {
useEffect(() => { useEffect(() => {
NaverMapInit(); NaverMapInit();
dispatch(controlGroupAuthAction.request());
}, []); }, []);
const NaverMapInit = () => { const NaverMapInit = () => {

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

@ -1,5 +1,5 @@
import $ from 'jquery'; import $ from 'jquery';
import { useEffect, useState } from 'react'; import { useEffect, useState, useLayoutEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux'; import { useDispatch, useSelector } from 'react-redux';
import '../../../../assets/css/custom.css'; import '../../../../assets/css/custom.css';
import FlightIcon from '../../../../assets/images/airplan_org.svg'; import FlightIcon from '../../../../assets/images/airplan_org.svg';
@ -15,20 +15,27 @@ import {
objectClickAction, objectClickAction,
objectUnClickAction objectUnClickAction
} from '../../../../modules/control/map/actions/controlMapActions'; } from '../../../../modules/control/map/actions/controlMapActions';
import { controlGroupAuthAction } from '../../../../modules/control/gp';
import { JOIN_LIST } from '../../../../modules/basis/group/actions/basisGroupAction';
export const DronMarker = props => { export const DronMarker = props => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const { controlGpList } = useSelector(state => state.controlGpState); const { controlGpList, controlGroupAuthInfo } = useSelector(
state => state.controlGpState
);
const { objectId, isClickObject } = useSelector( const { objectId, isClickObject } = useSelector(
state => state.controlMapReducer state => state.controlMapReducer
); );
const { controlGroupAuthInfo } = useSelector( // const { controlGroupAuthInfo } = useSelector(
state => state.controlGroupAuthState // state => state.controlGroupAuthState
); // );
const { controlGpArcrftWarnList } = useSelector( const { controlGpArcrftWarnList } = useSelector(
state => state.controlGpLogState state => state.controlGpLogState
); );
const { user } = useSelector(state => state.authState);
const { joinList } = useSelector(state => state.groupState);
const [arrMarkers, setArrMarkers] = useState([]); const [arrMarkers, setArrMarkers] = useState([]);
// const [arrInfos, setArrInfos] = useState([]); // const [arrInfos, setArrInfos] = useState([]);
@ -76,6 +83,18 @@ export const DronMarker = props => {
infoWindow.open(props.map, data.coord); infoWindow.open(props.map, data.coord);
}; };
// useLayoutEffect(() => {
// dispatch(controlGroupAuthAction.request());
// }, [controlGpList]);
useEffect(() => {
dispatch(
JOIN_LIST.request({
cstmrSno: user?.cstmrSno
})
);
}, []);
useEffect(() => { useEffect(() => {
markerInit(); markerInit();
}, [controlGpList]); }, [controlGpList]);
@ -119,16 +138,51 @@ export const DronMarker = props => {
const pal = controlGroupAuthInfo?.find( const pal = controlGroupAuthInfo?.find(
prev => prev.idntfNum === gps.objectId prev => prev.idntfNum === gps.objectId
); );
markerOption.url = pal ? DronIcon : FlightIcon; if (pal) {
markerOption.type = pal ? 'DRONE' : 'FLIGHT'; markerOption.url = DronIcon;
markerOption.type = 'DRONE';
} else {
if (user.authId === 'SUPER' || user.authId === 'ADMIN') {
markerOption.url = FlightIcon;
markerOption.type = 'FLIGHT';
} else {
const terminal = joinList?.find(prev => prev.trmnlId === gps.trmnlId);
if (
terminal?.groupAuthCd === 'MASTER' ||
terminal?.groupAuthCd === 'LEADER'
) {
markerOption.url = FlightIcon;
markerOption.type = 'FLIGHT';
}
}
}
} else { } else {
// const etc = controlGpList?.filter( if (user.authId === 'SUPER' || user.authId === 'ADMIN') {
// prev => prev.command === 이사람이 가입한 그룹의 command(가입한 그룹의 리스트를 여기로 불러와야 함) markerOption.url = FlightIcon;
// ) markerOption.type = 'FLIGHT';
markerOption.url = FlightIcon; } else {
markerOption.type = 'FLIGHT'; const terminal = joinList?.find(prev => prev.trmnlId === gps.trmnlId);
if (
terminal?.groupAuthCd === 'MASTER' ||
terminal?.groupAuthCd === 'LEADER'
) {
markerOption.url = FlightIcon;
markerOption.type = 'FLIGHT';
}
}
} }
// if (id.substring(0, 2) === 'PA') {
// const pal = controlGroupAuthInfo?.find(
// prev => prev.idntfNum === gps.objectId
// );
// markerOption.url = pal ? DronIcon : FlightIcon;
// markerOption.type = pal ? 'DRONE' : 'FLIGHT';
// } else {
// markerOption.url = FlightIcon;
// markerOption.type = 'FLIGHT';
// }
markerOption.origin = new naver.maps.Point(0, 0); markerOption.origin = new naver.maps.Point(0, 0);
markerOption.anchor = new naver.maps.Point(15, 15); markerOption.anchor = new naver.maps.Point(15, 15);

104
src/components/map/naver/feature/FeatureAirZone.js

@ -121,7 +121,7 @@ export const FeatureAirZone = props => {
// const diff = tt; // const diff = tt;
// const coord1 = new naver.maps.EPSG3857.getDestinationCoord( // const coord1 = new naver.maps.EPSG3857.getDestinationCoord(
// new naver.maps.LatLng(37.558599, 126.797627), // new naver.maps.LatLng(37.558522, 126.793722),
// tt, // tt,
// 9300 // 9300
// ); // );
@ -130,6 +130,108 @@ export const FeatureAirZone = props => {
// } // }
// console.log(coordzip); // console.log(coordzip);
// console.log(tt); // console.log(tt);
const SENSOR_RADIUS = 9300;
const position = new naver.maps.LatLng(37.558522, 126.793722);
const color = '#000';
const opacity = 0.7;
let angle = 0;
for (let i = 0; i < 4; i++) {
angle += 90;
let buffer = 0;
for (let j = 0; j < 4; j++) {
buffer += 2000;
const coord = new naver.maps.EPSG3857.getDestinationCoord(
position,
angle,
buffer
);
let reduce = 0;
if (j === 0) {
reduce = 218.6;
} else if (j === 1) {
reduce = 905.4;
} else if (j === 2) {
reduce = 2195;
} else if (j === 3) {
reduce = 4560.2;
}
if (angle % 180 == 0) {
const polyEW = new naver.maps.Polyline({
path: [
new naver.maps.EPSG3857.getDestinationCoord(
coord,
90,
SENSOR_RADIUS - reduce
),
new naver.maps.EPSG3857.getDestinationCoord(
coord,
270,
SENSOR_RADIUS - reduce
)
],
strokeWeight: 0.8,
strokeOpacity: opacity,
strokeColor: color,
map: props.map
});
} else {
const polyNS = new naver.maps.Polyline({
path: [
new naver.maps.EPSG3857.getDestinationCoord(
coord,
0,
SENSOR_RADIUS - reduce
),
new naver.maps.EPSG3857.getDestinationCoord(
coord,
180,
SENSOR_RADIUS - reduce
)
],
strokeWeight: 0.8,
strokeOpacity: opacity,
strokeColor: color,
map: props.map
});
}
}
}
const NS = new naver.maps.Polyline({
path: [
new naver.maps.EPSG3857.getDestinationCoord(position, 0, SENSOR_RADIUS),
new naver.maps.EPSG3857.getDestinationCoord(
position,
180,
SENSOR_RADIUS
)
],
strokeWeight: 0.8,
strokeOpacity: opacity,
strokeColor: color,
map: props.map
});
const EW = new naver.maps.Polyline({
path: [
new naver.maps.EPSG3857.getDestinationCoord(
position,
90,
SENSOR_RADIUS
),
new naver.maps.EPSG3857.getDestinationCoord(
position,
270,
SENSOR_RADIUS
)
],
strokeWeight: 0.8,
strokeOpacity: opacity,
strokeColor: color,
map: props.map
});
}; };
const featureAirEvent = () => { const featureAirEvent = () => {

4
src/containers/basis/dron/BasisDronDetailContainer.js

@ -21,6 +21,7 @@ export const BasisDronDetailContainer = props => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const titleName = ' 기체 관리'; const titleName = ' 기체 관리';
const [pageType, setPageType] = useState('create'); const [pageType, setPageType] = useState('create');
const validationSchema = yup.object().shape({ const validationSchema = yup.object().shape({
arcrftModelNm: yup arcrftModelNm: yup
.string() .string()
@ -91,6 +92,7 @@ export const BasisDronDetailContainer = props => {
handlerSearch(); handlerSearch();
setPageType('update'); setPageType('update');
} }
return () => dispatch(Actions.RESET_IDNTF());
}, []); }, []);
useEffect(() => { useEffect(() => {
@ -101,6 +103,7 @@ export const BasisDronDetailContainer = props => {
setValue('groupId', selectData?.groupId); setValue('groupId', selectData?.groupId);
setValue('groupNm', selectData?.groupNm); setValue('groupNm', selectData?.groupNm);
} }
if (detail?.arcrftSno) { if (detail?.arcrftSno) {
setValue('arcrftModelNm', detail?.arcrftModelNm); setValue('arcrftModelNm', detail?.arcrftModelNm);
setValue('arcrftTypeCd', detail?.arcrftTypeCd); setValue('arcrftTypeCd', detail?.arcrftTypeCd);
@ -206,7 +209,6 @@ export const BasisDronDetailContainer = props => {
...data, ...data,
imageUrl: imageUrl, imageUrl: imageUrl,
arcrftSno: detail.arcrftSno, arcrftSno: detail.arcrftSno,
ownerSno: detail.ownerSno,
updateUserId: user?.userId updateUserId: user?.userId
}; };

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

@ -12,7 +12,7 @@ import {
ControlGpHisState, ControlGpHisState,
ControlGpPlanContainsRQ, ControlGpPlanContainsRQ,
ControlGpPlanContainsRS, ControlGpPlanContainsRS,
ControlGroupAuthState, // ControlGroupAuthState,
ControlGpArcrftWarnList, ControlGpArcrftWarnList,
ControlGpWarnLogList, ControlGpWarnLogList,
ControlweatherData, ControlweatherData,
@ -102,11 +102,11 @@ export const controlGpRtDtlAction = createAsyncAction(
CONTROL_GP_RTDTL_FAILURE CONTROL_GP_RTDTL_FAILURE
)<ControlGpData, ControlGpDtlState, AxiosError>(); )<ControlGpData, ControlGpDtlState, AxiosError>();
export const controlGroupAuthAction = createAsyncAction( // export const controlGroupAuthAction = createAsyncAction(
CONTROL_GROUP_AUTH_REQUEST, // CONTROL_GROUP_AUTH_REQUEST,
CONTROL_GROUP_AUTH_SUCCESS, // CONTROL_GROUP_AUTH_SUCCESS,
CONTROL_GROUP_AUTH_FAILURE // CONTROL_GROUP_AUTH_FAILURE
)<string, ControlGroupAuthState, AxiosError>(); // )<string, ControlGroupAuthState, AxiosError>();
export const controlGpFlightPlanAction = createAsyncAction( export const controlGpFlightPlanAction = createAsyncAction(
CONTROL_FLIGHT_PLAN_REQUEST, CONTROL_FLIGHT_PLAN_REQUEST,
@ -148,7 +148,7 @@ const actions = {
controlGpLogAction, controlGpLogAction,
controlGpDtlAction, controlGpDtlAction,
controlGpRtDtlAction, controlGpRtDtlAction,
controlGroupAuthAction, // controlGroupAuthAction,
controlGpFlightPlanAction, controlGpFlightPlanAction,
controlGpFlightPlanWarnAction, controlGpFlightPlanWarnAction,
controlGpArcrftWarnAction, controlGpArcrftWarnAction,

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

@ -2,6 +2,7 @@ import { FlightPlanData } from '../../../basis/flight/models/basisFlightModel';
export interface ControlGpState { export interface ControlGpState {
controlGpList: ControlGpData[] | undefined; controlGpList: ControlGpData[] | undefined;
controlGroupAuthInfo: ControlGroupAuthData[] | undefined;
} }
export interface ControlGpWeatherState { export interface ControlGpWeatherState {
@ -27,9 +28,9 @@ export interface ControlGpDtlState {
controlDetail: ControlDetailData | undefined; controlDetail: ControlDetailData | undefined;
} }
export interface ControlGroupAuthState { // export interface ControlGroupAuthState {
controlGroupAuthInfo: ControlGroupAuthData[] | undefined; // controlGroupAuthInfo: ControlGroupAuthData[] | undefined;
} // }
export interface ControlGpHistoryData { export interface ControlGpHistoryData {
objectId: String; objectId: String;

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

@ -10,7 +10,7 @@ import {
controlGpLogAction, controlGpLogAction,
controlGpHisAction, controlGpHisAction,
controlGpRtDtlAction, controlGpRtDtlAction,
controlGroupAuthAction, // controlGroupAuthAction,
controlGpArcrftWarnAction, controlGpArcrftWarnAction,
controlweatherAction controlweatherAction
} from '../actions/controlGpAction'; } from '../actions/controlGpAction';
@ -22,7 +22,7 @@ import {
ControlGpLogState, ControlGpLogState,
ControlGpHisState, ControlGpHisState,
ControlGpState, ControlGpState,
ControlGroupAuthState, // ControlGroupAuthState,
initiaResponseControlGpData, initiaResponseControlGpData,
ControlGpWeatherState ControlGpWeatherState
} from '../models/controlGpModel'; } from '../models/controlGpModel';
@ -31,8 +31,9 @@ export const controlGpReducer = createReducer<ControlGpState, ControlGpAction>(
initiaResponseControlGpData initiaResponseControlGpData
).handleAction(controlGpAction.success, (state, action) => ).handleAction(controlGpAction.success, (state, action) =>
produce(state, draft => { produce(state, draft => {
const { controlGpList } = action.payload; const { controlGpList, controlGroupAuthInfo } = action.payload;
draft.controlGpList = controlGpList; draft.controlGpList = controlGpList;
draft.controlGroupAuthInfo = controlGroupAuthInfo;
}) })
); );
export const controlGpweatherReducer = createReducer< export const controlGpweatherReducer = createReducer<
@ -43,7 +44,6 @@ export const controlGpweatherReducer = createReducer<
(state, action) => (state, action) =>
produce(state, draft => { produce(state, draft => {
const data = action.payload; const data = action.payload;
console.log('data>>>>>>>>>', data);
draft.controlWheather = data; draft.controlWheather = data;
}) })
); );
@ -117,15 +117,15 @@ export const controlGpDtlReducer = createReducer<
}) })
); );
export const controlGroupAuthReducer = createReducer< // export const controlGroupAuthReducer = createReducer<
ControlGroupAuthState, // ControlGroupAuthState,
ControlGpAction // ControlGpAction
>(initiaResponseControlGpData).handleAction( // >(initiaResponseControlGpData).handleAction(
controlGroupAuthAction.success, // controlGroupAuthAction.success,
(state, action) => // (state, action) =>
produce(state, draft => { // produce(state, draft => {
const { controlGroupAuthInfo } = action.payload; // const { controlGroupAuthInfo } = action.payload;
draft.controlGroupAuthInfo = controlGroupAuthInfo; // draft.controlGroupAuthInfo = controlGroupAuthInfo;
}) // })
); // );

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

@ -12,32 +12,43 @@ import { ControlGpData } from '../models/controlGpModel';
import { detail } from '../../../analysis/history/actions/analysisHistoryAction'; import { detail } from '../../../analysis/history/actions/analysisHistoryAction';
import { useSelector } from 'react-redux'; import { useSelector } from 'react-redux';
const token = cookieStorage.getCookie(COOKIE_ACCESS_TOKEN);
function* getControlGpSaga( function* getControlGpSaga(
action: ActionType<typeof Actions.controlGpAction.request> action: ActionType<typeof Actions.controlGpAction.request>
) { ) {
try { try {
const data = action.payload; const data = action.payload;
const state = yield select(); const state = yield select();
const { objectId, isClickObject } = state.controlMapReducer; const { objectId, isClickObject } = state.controlMapReducer;
// 그룹 별 기체 필터링 // 그룹 별 기체 필터링
const { controlGroupAuthInfo } = state.controlGroupAuthState; const { controlGroupAuthInfo } = state.controlGpState;
const { controlGpHistory } = state.controlGpHisState; const { controlGpHistory } = state.controlGpHisState;
let gpsData: ControlGpData[] = []; // let gpsData: ControlGpData[] = [];
//사용자가 등록한 기체(식별장치 포함)만 관제에서 볼 수 있게 필터처리 //사용자가 등록한 기체(식별장치 포함)만 관제에서 볼 수 있게 필터처리
if (controlGroupAuthInfo?.length > 0) { // if (controlGroupAuthInfo?.length > 0) {
controlGroupAuthInfo.forEach(auth => { // controlGroupAuthInfo.forEach(auth => {
if (gpsData.length > 0) return false; // if (gpsData.length > 0) return false;
// gpsData = data.filter(gps => auth.idntfNum === gps.objectId); // // gpsData = data.filter(gps => auth.idntfNum === gps.objectId);
}); // });
// }
let res;
if (token && data.length > 0) {
const user = decode<LoginData>(token);
res = yield call(controlGpApi.getGroupAuth, user.cstmrSno);
} }
yield put( yield put(
Actions.controlGpAction.success({ Actions.controlGpAction.success({
// controlGpList: gpsData // controlGpList: gpsData
controlGpList: data controlGpList: data,
controlGroupAuthInfo: res || []
}) })
); );
@ -144,26 +155,26 @@ function* controlDtlSaga(
} }
} }
function* controlGroupAuthSaga( // function* controlGroupAuthSaga(
action: ActionType<typeof Actions.controlGroupAuthAction.request> // action: ActionType<typeof Actions.controlGroupAuthAction.request>
) { // ) {
const token = cookieStorage.getCookie(COOKIE_ACCESS_TOKEN); // const token = cookieStorage.getCookie(COOKIE_ACCESS_TOKEN);
try { // try {
if (token) { // if (token) {
const user = decode<LoginData>(token); // const user = decode<LoginData>(token);
const data = yield call(controlGpApi.getGroupAuth, user.cstmrSno); // const data = yield call(controlGpApi.getGroupAuth, user.cstmrSno);
yield put( // yield put(
Actions.controlGroupAuthAction.success({ // Actions.controlGroupAuthAction.success({
controlGroupAuthInfo: data // controlGroupAuthInfo: data
}) // })
); // );
} // }
} catch (error) { // } catch (error) {
yield put(Actions.controlGroupAuthAction.failure(error)); // yield put(Actions.controlGroupAuthAction.failure(error));
} // }
} // }
function* controlGpFlightPlanSaga( function* controlGpFlightPlanSaga(
action: ActionType<typeof Actions.controlGpFlightPlanAction.request> action: ActionType<typeof Actions.controlGpFlightPlanAction.request>
@ -235,7 +246,7 @@ export function* controlGpSaga() {
yield takeEvery(Actions.controlGpLogAction.request, getControlGpWarnLogSaga); yield takeEvery(Actions.controlGpLogAction.request, getControlGpWarnLogSaga);
yield takeEvery(Actions.controlGpRtDtlAction.request, controlGpRtDtlSaga); yield takeEvery(Actions.controlGpRtDtlAction.request, controlGpRtDtlSaga);
yield takeEvery(Actions.controlGpDtlAction.request, controlDtlSaga); yield takeEvery(Actions.controlGpDtlAction.request, controlDtlSaga);
yield takeEvery(Actions.controlGroupAuthAction.request, controlGroupAuthSaga); // yield takeEvery(Actions.controlGroupAuthAction.request, controlGroupAuthSaga);
yield takeEvery(Actions.controlweatherAction.request, ControlWeatherSaga); yield takeEvery(Actions.controlweatherAction.request, ControlWeatherSaga);
yield takeEvery( yield takeEvery(

4
src/redux/reducers/rootReducer.ts

@ -25,7 +25,7 @@ import {
controlGpDtlReducer, controlGpDtlReducer,
controlGpHisReducer, controlGpHisReducer,
controlGpReducer, controlGpReducer,
controlGroupAuthReducer, // controlGroupAuthReducer,
controlGpFltPlanReducer, controlGpFltPlanReducer,
controlGpSaga, controlGpSaga,
ControlGpState, ControlGpState,
@ -79,7 +79,7 @@ const rootReducer = combineReducers({
controlGpHisState: controlGpHisReducer, controlGpHisState: controlGpHisReducer,
controlGpLogState: controlGpLogReducer, controlGpLogState: controlGpLogReducer,
controlGpDtlState: controlGpDtlReducer, controlGpDtlState: controlGpDtlReducer,
controlGroupAuthState: controlGroupAuthReducer, // controlGroupAuthState: controlGroupAuthReducer,
controlGpFltPlanState: controlGpFltPlanReducer, controlGpFltPlanState: controlGpFltPlanReducer,
menuState: menuReducer, menuState: menuReducer,
analysisHistoryState: analysisHistoryReducer, analysisHistoryState: analysisHistoryReducer,

75
src/views/control/report/ControlReportDetail.js

@ -12,6 +12,12 @@ import {
GET_WGHT_TYPE_CD GET_WGHT_TYPE_CD
} from '../../../utility/CondeUtil'; } from '../../../utility/CondeUtil';
import { controlGpLogAction, controlweatherAction } from '../../../modules/control/gp'; import { controlGpLogAction, controlweatherAction } from '../../../modules/control/gp';
=======
import dfsxyconv from '../../../utility/dfsxyconv';
import {
controlGpLogAction,
controlweatherAction
} from '../../../modules/control/gp';
import ControlAlarmDetail from '../alarm/ControlAlarmDetail'; import ControlAlarmDetail from '../alarm/ControlAlarmDetail';
import axios from '../../../modules/utils/customAxiosUtil'; import axios from '../../../modules/utils/customAxiosUtil';
import { import {
@ -35,8 +41,9 @@ const ControlReportDetail = props => {
//const { controlWheather } = useSelector(state => state.ControlGpWeatherState); //const { controlWheather } = useSelector(state => state.ControlGpWeatherState);
const { controlGpWarnLog } = useSelector(state => state.controlGpLogState); const { controlGpWarnLog } = useSelector(state => state.controlGpLogState);
function weathericon() { function weathericon() {
function a() {
if (controlDetail) { if (controlDetail) {
let wheatherDetail = controlDetail.items.item; let wheatherDetail = controlDetail.items.item;
let skyDetail = wheatherDetail[6].fcstValue; let skyDetail = wheatherDetail[6].fcstValue;
@ -46,13 +53,11 @@ const ControlReportDetail = props => {
return <CloudSnow />; return <CloudSnow />;
} else if (skyDetail == 0 || wheatherDetail[5].fcstValue == 1) { } else if (skyDetail == 0 || wheatherDetail[5].fcstValue == 1) {
return <Sun />; return <Sun />;
} else } else return <Cloud />;
return <Cloud />;
} }
} }
useEffect(() => { useEffect(() => {
if (historyModal) { if (historyModal) {
if (controlGpDetail) { if (controlGpDetail) {
dispatch(controlGpLogAction.request({ id: controlGpDetail.controlId })); dispatch(controlGpLogAction.request({ id: controlGpDetail.controlId }));
@ -168,10 +173,11 @@ const ControlReportDetail = props => {
<dt> <dt>
<div className='list-left-txt'>시작시간</div> <div className='list-left-txt'>시작시간</div>
<div className='list-right-txt'> <div className='list-right-txt'>
{moment( {controlDetail?.cntrlStDt
controlDetail?.cntrlStDt, ? moment(controlDetail?.cntrlStDt, 'YYYYMMDDHHmmss').format(
'YYYYMMDDHHmmss' 'MM-DD HH:mm:ss'
).format('MM-DD HH:mm:ss')} )
: '-'}
</div> </div>
</dt> </dt>
{/* <dt> {/* <dt>
@ -183,19 +189,25 @@ const ControlReportDetail = props => {
<dt> <dt>
<div className='list-left-txt'>속도</div> <div className='list-left-txt'>속도</div>
<div className='list-right-txt'> <div className='list-right-txt'>
{controlGpDetail?.speed} {controlGpDetail?.speedType} {controlGpDetail?.speed && controlGpDetail?.speedType
? `${controlGpDetail?.speed} ${controlGpDetail?.speedType}`
: '-'}
</div> </div>
</dt> </dt>
<dt> <dt>
<div className='list-left-txt'>고도</div> <div className='list-left-txt'>고도</div>
<div className='list-right-txt'> <div className='list-right-txt'>
{controlGpDetail?.elev} {controlGpDetail?.elevType} {controlGpDetail?.elev && controlGpDetail?.elevType
? `${controlGpDetail?.elev} ${controlGpDetail?.elevType}`
: '-'}
</div> </div>
</dt> </dt>
<dt> <dt>
<div className='list-left-txt'>좌표(위도/경도)</div> <div className='list-left-txt'>좌표(위도/경도)</div>
<div className='list-right-txt'> <div className='list-right-txt'>
{controlGpDetail?.lat} / {controlGpDetail?.lng} {controlGpDetail?.lat && controlGpDetail?.lng
? `${controlGpDetail?.lat} / ${controlGpDetail?.lng}`
: '-'}
</div> </div>
</dt> </dt>
{/* <dt> {/* <dt>
@ -208,7 +220,7 @@ const ControlReportDetail = props => {
<dt> <dt>
<div className='list-left-txt'>헤딩 방위각</div> <div className='list-left-txt'>헤딩 방위각</div>
<div className='list-right-txt'> <div className='list-right-txt'>
{controlGpDetail?.heading} {nullMessage(controlGpDetail?.heading)}
</div> </div>
</dt> </dt>
{/* <dt> {/* <dt>
@ -220,11 +232,12 @@ const ControlReportDetail = props => {
<dt> <dt>
<div className='list-left-txt'>위치정보 수신 시간</div> <div className='list-left-txt'>위치정보 수신 시간</div>
<div className='list-right-txt'> <div className='list-right-txt'>
{' '} {controlGpDetail?.serverRcvDt
{moment( ? moment(
controlGpDetail?.serverRcvDt, controlGpDetail?.serverRcvDt,
'YYYYMMDDHHmmss' 'YYYYMMDDHHmmss'
).format('MM-DD HH:mm:ss')} ).format('MM-DD HH:mm:ss')
: '-'}
</div> </div>
</dt> </dt>
</dl> </dl>
@ -245,7 +258,6 @@ const ControlReportDetail = props => {
<dt> <dt>
<div className='list-left-txt'>담당자 이름</div> <div className='list-left-txt'>담당자 이름</div>
<div className='list-right-txt'> <div className='list-right-txt'>
{' '}
{nullMessage(controlDetail?.ownerNm)} {nullMessage(controlDetail?.ownerNm)}
</div> </div>
</dt> </dt>
@ -260,15 +272,18 @@ const ControlReportDetail = props => {
</div> </div>
</div> </div>
<div className='layer-content'> <div className='layer-content'>
<div className="layer-ti"> <div className='layer-ti'>
<h4>날씨 정보</h4> <h4>날씨 정보</h4>
</div> </div>
<div className="layer-content-box"> <div className='layer-content-box'>
<div className="layer-content-info"> <div className='layer-content-info'>
<div className="layer-weather-table"> <div className='layer-weather-table'>
<div className="layer-weather-address"> <div className='layer-weather-address'>
현재위치의 날씨 정보입니다. 현재위치의 날씨 정보입니다.
<span><Compass size={20} />{controlDetail?.stAreaNm}</span> <span>
<Compass size={20} />
{controlDetail?.stAreaNm}
</span>
</div> </div>
<Table responsive> <Table responsive>
<thead> <thead>
@ -284,8 +299,18 @@ const ControlReportDetail = props => {
<tr> <tr>
<td>{controlDetail?.items.item[0].baseTime.substring(0, 2)}</td> <td>{controlDetail?.items.item[0].baseTime.substring(0, 2)}</td>
<td>{weathericon()}</td> <td>{weathericon()}</td>
<td>
{controlDetail?.items.item[12].fcstTime.substring(0, 2)}
</td>
<td>{a()}</td>
<td>{controlDetail?.items.item[12].fcstValue}</td> <td>{controlDetail?.items.item[12].fcstValue}</td>
<td><Navigation2 style={{ transform: `rotate(${controlDetail?.items.item[3].fcstValue}deg)` }} /></td> <td>
<Navigation2
style={{
transform: `rotate(${controlDetail?.items.item[3].fcstValue}deg)`
}}
/>
</td>
<td>{controlDetail?.items.item[4].fcstValue}m/s</td> <td>{controlDetail?.items.item[4].fcstValue}m/s</td>
</tr> </tr>
</tbody> </tbody>

10
src/views/control/report/ControlReportList.js

@ -16,7 +16,7 @@ const ControlReportList = props => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const handlerDetail = (objectId, cntrlId) => { const handlerDetail = (objectId, cntrlId) => {
dispatch(objectClickAction(objectId)); dispatch(objectClickAction(cntrlId));
dispatch(controlGpDtlAction.request(cntrlId)); dispatch(controlGpDtlAction.request(cntrlId));
}; };
@ -77,9 +77,11 @@ const ControlReportList = props => {
<dt> <dt>
<div className='list-left-txt'>이륙 시간</div> <div className='list-left-txt'>이륙 시간</div>
<div className='list-right-txt'> <div className='list-right-txt'>
{moment(item.controlStartDt, 'YYYYMMDDHHmmss').format( {item.controlStartDt
'MM-DD HH:mm:ss' ? moment(item.controlStartDt, 'YYYYMMDDHHmmss').format(
)} 'MM-DD HH:mm:ss'
)
: '-'}
</div> </div>
</dt> </dt>
<dt> <dt>

105
test/pav-warning.js

@ -2,82 +2,83 @@ const { getConnection, writeData } = require('./pav-client');
const { getCoordsFormBetweenCoord, dumyData } = require('./pav-utils'); const { getCoordsFormBetweenCoord, dumyData } = require('./pav-utils');
// const host = "192.168.0.24" // const host = "192.168.0.24"
const host = "localhost" const host = 'localhost';
// const host = '192.168.0.34'; // const host = '192.168.0.34';
const port = 8082; const port = 8082;
// 기본정보 // 기본정보
const prefix = 'PASANGUU'; const prefix = 'PA';
const terminalId = 'SANDBOX-001';
const pathSampleCoord = [ const pathSampleCoord = [
[37.5215, 126.605], [37.5215, 126.605],
[37.5215, 126.61], [37.5215, 126.61], //비정상, 날릴 것
// [37.5215, 126.6082], // [37.5215, 126.6082], 계획서
[37.521, 126.6082], [37.521, 126.6082],
[37.521, 126.6057], [37.521, 126.6057],
[37.5205, 126.6057], [37.5205, 126.6057],
[37.5205, 126.6082], [37.5205, 126.6082],
[37.52, 126.6082], [37.52, 126.6082],
[37.52, 126.6057], [37.52, 126.6057],
[37.5195, 126.6057], [37.5195, 126.6057],
[37.5195, 126.6082], [37.5195, 126.6082],
[37.519, 126.6082], [37.519, 126.6082],
[37.519, 126.605] [37.519, 126.605]
]; ];
const divDist = 10; // [m] const divDist = 10; // [m]
// 특정거리에 따른 좌표 추출 // 특정거리에 따른 좌표 추출
const getCoords = coords => { const getCoords = coords => {
if (!coords || coords.length < 1) return; if (!coords || coords.length < 1) return;
const totalCoords = []; const totalCoords = [];
for (let i = 1; i < coords.length; i++) { for (let i = 1; i < coords.length; i++) {
const divCoords = getCoordsFormBetweenCoord( const divCoords = getCoordsFormBetweenCoord(
coords[i - 1], coords[i - 1],
coords[i], coords[i],
divDist divDist
); );
totalCoords.push(...divCoords); totalCoords.push(...divCoords);
} }
return totalCoords; return totalCoords;
}; };
const getClient = () => { const getClient = () => {
const dronName = prefix; const dronName = prefix + 'trmnlId';
// const dronName = prefix + '0000001A';
const client = {}; const client = {};
client.dronName = dronName; client.dronName = dronName;
client.socket = getConnection(dronName, host, port); client.socket = getConnection(dronName, host, port);
client.data = getCoords(pathSampleCoord); client.data = getCoords(pathSampleCoord);
return client; return client;
}; };
const sendData = (client, cnt) => { const sendData = (client, cnt) => {
const data = { const data = {
...dumyData, ...dumyData,
terminalId: client.dronName, terminalId: terminalId,
body: [ command: 'SANDBOX',
{ body: [
...dumyData.body[0], {
objectId: client.dronName, ...dumyData.body[0],
lat: client.data[cnt][0], objectId: client.dronName,
lon: client.data[cnt][1] lat: client.data[cnt][0],
} lon: client.data[cnt][1]
] }
}; ]
writeData(client.socket, JSON.stringify(data)); };
iteratorSendData(++cnt); writeData(client.socket, JSON.stringify(data));
iteratorSendData(++cnt);
}; };
const client = getClient(); const client = getClient();
const iteratorSendData = (cnt = 0) => { const iteratorSendData = (cnt = 0) => {
if (cnt >= client.data.length) { if (cnt >= client.data.length) {
client.socket.destroy(); client.socket.destroy();
return; return;
} }
setTimeout(() => sendData(client, cnt), 1000); setTimeout(() => sendData(client, cnt), 1000);
}; };
iteratorSendData(); iteratorSendData();

Loading…
Cancel
Save