Browse Source

Merge branch 'master' of http://gitea.palntour.com/pav/pav-home

pull/2/head
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>
<NavLink
onClick={() => window.open('/weather/info/index', '_blank')}
onClick={() =>
window.open(
'https://aim.koca.go.kr/google/xNotamViewMap.jsp',
'_blank'
)
}
// active={active === '2'}
// onClick={() => {
// toggle('2')
// }}
>
날씨정보
NOTAM 정보
</NavLink>
</NavItem>
{/* <NavItem>
<NavItem>
<NavLink
onClick={() => window.open('/testDraw', '_blank')}
onClick={() => window.open('/weather/info/index', '_blank')}
// active={active === '2'}
// onClick={() => {
// toggle('2')
// }}
>
버퍼 테스트
날씨 정보
</NavLink>
</NavItem> */}
</NavItem>
</Nav>
{/* <div className='bookmark-wrapper d-flex align-items-center'>
<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 { FeatureAirZone } from './feature/FeatureAirZone';
import geoJson from '../geojson/airArea.json';
import { controlGroupAuthAction } from '../../../modules/control/gp';
import DronPlan from './dron/DronPlan';
import DronToast from './dron/DronToast';
import SensorZone from './sensor/SensorZone';
@ -22,7 +21,6 @@ export const NaverCustomMap = () => {
useEffect(() => {
NaverMapInit();
dispatch(controlGroupAuthAction.request());
}, []);
const NaverMapInit = () => {

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

@ -1,5 +1,5 @@
import $ from 'jquery';
import { useEffect, useState } from 'react';
import { useEffect, useState, useLayoutEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import '../../../../assets/css/custom.css';
import FlightIcon from '../../../../assets/images/airplan_org.svg';
@ -15,20 +15,27 @@ import {
objectClickAction,
objectUnClickAction
} 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 => {
const dispatch = useDispatch();
const { controlGpList } = useSelector(state => state.controlGpState);
const { controlGpList, controlGroupAuthInfo } = useSelector(
state => state.controlGpState
);
const { objectId, isClickObject } = useSelector(
state => state.controlMapReducer
);
const { controlGroupAuthInfo } = useSelector(
state => state.controlGroupAuthState
);
// const { controlGroupAuthInfo } = useSelector(
// state => state.controlGroupAuthState
// );
const { controlGpArcrftWarnList } = useSelector(
state => state.controlGpLogState
);
const { user } = useSelector(state => state.authState);
const { joinList } = useSelector(state => state.groupState);
const [arrMarkers, setArrMarkers] = useState([]);
// const [arrInfos, setArrInfos] = useState([]);
@ -76,6 +83,18 @@ export const DronMarker = props => {
infoWindow.open(props.map, data.coord);
};
// useLayoutEffect(() => {
// dispatch(controlGroupAuthAction.request());
// }, [controlGpList]);
useEffect(() => {
dispatch(
JOIN_LIST.request({
cstmrSno: user?.cstmrSno
})
);
}, []);
useEffect(() => {
markerInit();
}, [controlGpList]);
@ -119,16 +138,51 @@ export const DronMarker = props => {
const pal = controlGroupAuthInfo?.find(
prev => prev.idntfNum === gps.objectId
);
markerOption.url = pal ? DronIcon : FlightIcon;
markerOption.type = pal ? 'DRONE' : 'FLIGHT';
if (pal) {
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 {
// const etc = controlGpList?.filter(
// prev => prev.command === 이사람이 가입한 그룹의 command(가입한 그룹의 리스트를 여기로 불러와야 함)
// )
markerOption.url = FlightIcon;
markerOption.type = 'FLIGHT';
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';
}
}
}
// 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.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 coord1 = new naver.maps.EPSG3857.getDestinationCoord(
// new naver.maps.LatLng(37.558599, 126.797627),
// new naver.maps.LatLng(37.558522, 126.793722),
// tt,
// 9300
// );
@ -130,6 +130,108 @@ export const FeatureAirZone = props => {
// }
// console.log(coordzip);
// 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 = () => {

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

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

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

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

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

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

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

@ -10,7 +10,7 @@ import {
controlGpLogAction,
controlGpHisAction,
controlGpRtDtlAction,
controlGroupAuthAction,
// controlGroupAuthAction,
controlGpArcrftWarnAction,
controlweatherAction
} from '../actions/controlGpAction';
@ -22,7 +22,7 @@ import {
ControlGpLogState,
ControlGpHisState,
ControlGpState,
ControlGroupAuthState,
// ControlGroupAuthState,
initiaResponseControlGpData,
ControlGpWeatherState
} from '../models/controlGpModel';
@ -31,8 +31,9 @@ export const controlGpReducer = createReducer<ControlGpState, ControlGpAction>(
initiaResponseControlGpData
).handleAction(controlGpAction.success, (state, action) =>
produce(state, draft => {
const { controlGpList } = action.payload;
const { controlGpList, controlGroupAuthInfo } = action.payload;
draft.controlGpList = controlGpList;
draft.controlGroupAuthInfo = controlGroupAuthInfo;
})
);
export const controlGpweatherReducer = createReducer<
@ -43,7 +44,6 @@ export const controlGpweatherReducer = createReducer<
(state, action) =>
produce(state, draft => {
const data = action.payload;
console.log('data>>>>>>>>>', data);
draft.controlWheather = data;
})
);
@ -117,15 +117,15 @@ export const controlGpDtlReducer = createReducer<
})
);
export const controlGroupAuthReducer = createReducer<
ControlGroupAuthState,
ControlGpAction
>(initiaResponseControlGpData).handleAction(
controlGroupAuthAction.success,
(state, action) =>
produce(state, draft => {
const { controlGroupAuthInfo } = action.payload;
// export const controlGroupAuthReducer = createReducer<
// ControlGroupAuthState,
// ControlGpAction
// >(initiaResponseControlGpData).handleAction(
// controlGroupAuthAction.success,
// (state, action) =>
// produce(state, draft => {
// 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 { useSelector } from 'react-redux';
const token = cookieStorage.getCookie(COOKIE_ACCESS_TOKEN);
function* getControlGpSaga(
action: ActionType<typeof Actions.controlGpAction.request>
) {
try {
const data = action.payload;
const state = yield select();
const { objectId, isClickObject } = state.controlMapReducer;
// 그룹 별 기체 필터링
const { controlGroupAuthInfo } = state.controlGroupAuthState;
const { controlGroupAuthInfo } = state.controlGpState;
const { controlGpHistory } = state.controlGpHisState;
let gpsData: ControlGpData[] = [];
// let gpsData: ControlGpData[] = [];
//사용자가 등록한 기체(식별장치 포함)만 관제에서 볼 수 있게 필터처리
if (controlGroupAuthInfo?.length > 0) {
controlGroupAuthInfo.forEach(auth => {
if (gpsData.length > 0) return false;
// if (controlGroupAuthInfo?.length > 0) {
// controlGroupAuthInfo.forEach(auth => {
// 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(
Actions.controlGpAction.success({
// controlGpList: gpsData
controlGpList: data
controlGpList: data,
controlGroupAuthInfo: res || []
})
);
@ -144,26 +155,26 @@ function* controlDtlSaga(
}
}
function* controlGroupAuthSaga(
action: ActionType<typeof Actions.controlGroupAuthAction.request>
) {
const token = cookieStorage.getCookie(COOKIE_ACCESS_TOKEN);
try {
if (token) {
const user = decode<LoginData>(token);
const data = yield call(controlGpApi.getGroupAuth, user.cstmrSno);
yield put(
Actions.controlGroupAuthAction.success({
controlGroupAuthInfo: data
})
);
}
} catch (error) {
yield put(Actions.controlGroupAuthAction.failure(error));
}
}
// function* controlGroupAuthSaga(
// action: ActionType<typeof Actions.controlGroupAuthAction.request>
// ) {
// const token = cookieStorage.getCookie(COOKIE_ACCESS_TOKEN);
// try {
// if (token) {
// const user = decode<LoginData>(token);
// const data = yield call(controlGpApi.getGroupAuth, user.cstmrSno);
// yield put(
// Actions.controlGroupAuthAction.success({
// controlGroupAuthInfo: data
// })
// );
// }
// } catch (error) {
// yield put(Actions.controlGroupAuthAction.failure(error));
// }
// }
function* controlGpFlightPlanSaga(
action: ActionType<typeof Actions.controlGpFlightPlanAction.request>
@ -235,7 +246,7 @@ export function* controlGpSaga() {
yield takeEvery(Actions.controlGpLogAction.request, getControlGpWarnLogSaga);
yield takeEvery(Actions.controlGpRtDtlAction.request, controlGpRtDtlSaga);
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(

4
src/redux/reducers/rootReducer.ts

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

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

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

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

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

105
test/pav-warning.js

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

Loading…
Cancel
Save