Browse Source

드론관제 날씨 기능 추가

pull/2/head
sanguu(박상현) 2 years ago
parent
commit
9413d00ee7
  1. 1
      src/modules/control/gp/actions/controlGpAction.ts
  2. 1
      src/modules/control/gp/apis/controlGpApi.ts
  3. 22
      src/modules/control/gp/models/controlGpModel.ts
  4. 22
      src/modules/control/gp/reducers/controlGpReducer.ts
  5. 12
      src/modules/control/gp/sagas/controlGpSaga.ts
  6. 83
      src/views/control/main/ControlMain.js

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

@ -16,7 +16,6 @@ import {
ControlGpArcrftWarnList, ControlGpArcrftWarnList,
ControlGpWarnLogList, ControlGpWarnLogList,
ControlweatherData, ControlweatherData,
ControlGpWeatherState,
rescontrolweatherData, rescontrolweatherData,
ControlGpArcrftWarnRq ControlGpArcrftWarnRq
} from '../models/controlGpModel'; } from '../models/controlGpModel';

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

@ -58,7 +58,6 @@ export const controlGpApi = {
...rq ...rq
} }
}); });
return data; return data;
}, },
checkPlanContains: async (rq: ControlGpPlanContainsRQ) => { checkPlanContains: async (rq: ControlGpPlanContainsRQ) => {

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

@ -5,9 +5,9 @@ export interface ControlGpState {
controlGroupAuthInfo: ControlGroupAuthData[] | undefined; controlGroupAuthInfo: ControlGroupAuthData[] | undefined;
} }
export interface ControlGpWeatherState { // export interface ControlGpWeatherState {
controlWheather: rescontrolweatherData | undefined; // controlWheather: rescontrolweatherData | undefined;
} // }
export interface ControlGpFlightPlanState { export interface ControlGpFlightPlanState {
controlGpFltPlanList: ControlGpFlightPlanDataList | undefined; controlGpFltPlanList: ControlGpFlightPlanDataList | undefined;
@ -26,6 +26,7 @@ export interface ControlGpHisState {
export interface ControlGpDtlState { export interface ControlGpDtlState {
controlGpDetail: ControlGpDtlData | undefined; controlGpDetail: ControlGpDtlData | undefined;
controlDetail: ControlDetailData | undefined; controlDetail: ControlDetailData | undefined;
controlWheather: rescontrolweatherData | undefined;
} }
// export interface ControlGroupAuthState { // export interface ControlGroupAuthState {
@ -195,20 +196,7 @@ export interface ControlGpArcrftWarnData {
} }
export interface rescontrolweatherData { export interface rescontrolweatherData {
resultCode: string; items: [];
resultMsg: string;
numOfRows: string;
pageNo: string;
totalCount: string;
dataType: string;
baseDate: string;
baseTime: string;
fcstDate: string;
fcstTime: string;
category: string;
fcstValue: string;
nx: string;
ny: string;
} }
export interface ControlGpArcrftWarnList export interface ControlGpArcrftWarnList
extends Array<ControlGpArcrftWarnData> {} extends Array<ControlGpArcrftWarnData> {}

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

@ -17,14 +17,14 @@ import {
import { import {
ControlGpWarnLogData, ControlGpWarnLogData,
ControlDetailData, ControlDetailData,
rescontrolweatherData,
ControlGpDtlState, ControlGpDtlState,
ControlGpFlightPlanState, ControlGpFlightPlanState,
ControlGpLogState, ControlGpLogState,
ControlGpHisState, ControlGpHisState,
ControlGpState, ControlGpState,
// ControlGroupAuthState, // ControlGroupAuthState,
initiaResponseControlGpData, initiaResponseControlGpData
ControlGpWeatherState
} from '../models/controlGpModel'; } from '../models/controlGpModel';
export const controlGpReducer = createReducer<ControlGpState, ControlGpAction>( export const controlGpReducer = createReducer<ControlGpState, ControlGpAction>(
@ -36,17 +36,6 @@ export const controlGpReducer = createReducer<ControlGpState, ControlGpAction>(
draft.controlGroupAuthInfo = controlGroupAuthInfo; draft.controlGroupAuthInfo = controlGroupAuthInfo;
}) })
); );
export const controlGpweatherReducer = createReducer<
ControlGpWeatherState,
ControlGpAction
>(initiaResponseControlGpData).handleAction(
controlweatherAction.success,
(state, action) =>
produce(state, draft => {
const data = action.payload;
draft.controlWheather = data;
})
);
export const controlGpFltPlanReducer = createReducer< export const controlGpFltPlanReducer = createReducer<
ControlGpFlightPlanState, ControlGpFlightPlanState,
@ -115,8 +104,13 @@ export const controlGpDtlReducer = createReducer<
const data: ControlDetailData = action.payload; const data: ControlDetailData = action.payload;
draft.controlDetail = data; draft.controlDetail = data;
}) })
)
.handleAction(controlweatherAction.success, (state, action) =>
produce(state, draft => {
const data: rescontrolweatherData = action.payload;
draft.controlWheather = data;
})
); );
// export const controlGroupAuthReducer = createReducer< // export const controlGroupAuthReducer = createReducer<
// ControlGroupAuthState, // ControlGroupAuthState,
// ControlGpAction // ControlGpAction

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

@ -119,6 +119,7 @@ function* controlGpRtDtlSaga(
// console.log(controlGpDetail); // console.log(controlGpDetail);
yield put( yield put(
Actions.controlGpRtDtlAction.success({ Actions.controlGpRtDtlAction.success({
controlWheather: undefined,
controlDetail: undefined, controlDetail: undefined,
controlGpDetail: controlGpDetail controlGpDetail: controlGpDetail
}) })
@ -140,12 +141,11 @@ function* controlDtlSaga(
const lng = adress[0].lng; const lng = adress[0].lng;
const rq = { const rq = {
nx: lat, nx: lat, // 위도
ny: lng ny: lng
}; };
//날씨 api 호출 //날씨 api 호출
const res = yield call(controlGpApi.apiweather, rq); const res = yield call(controlGpApi.apiweather, rq);
const { data } = yield call(controlGpApi.getDetail, controlId); const { data } = yield call(controlGpApi.getDetail, controlId);
yield put( yield put(
Actions.controlGpDtlAction.success({ Actions.controlGpDtlAction.success({
@ -209,8 +209,12 @@ function* ControlWeatherSaga(
) { ) {
try { try {
const rq = action.payload; const rq = action.payload;
const data = yield call(controlGpApi.apiweather, rq); const res = yield call(controlGpApi.apiweather, rq);
yield put(Actions.controlweatherAction.success(data.response.body.items)); yield put(
Actions.controlweatherAction.success({
items: res.response.body.items
})
);
} catch (error) { } catch (error) {
yield put(Actions.controlweatherAction.failure(error)); yield put(Actions.controlweatherAction.failure(error));
} }

83
src/views/control/main/ControlMain.js

@ -3,13 +3,14 @@ import React, { useEffect, useState } from 'react';
import '../../../assets/css/custom.css'; import '../../../assets/css/custom.css';
import logo from '../../../assets/images/pal_logo.png'; import logo from '../../../assets/images/pal_logo.png';
import { Sun, Map, Bell } from 'react-feather'; import { Sun, Map, Bell, Navigation2 } from 'react-feather';
import { AiOutlinePoweroff, AiOutlineExclamation } from 'react-icons/ai'; import { AiOutlinePoweroff, AiOutlineExclamation } from 'react-icons/ai';
import { IoAlertOutline } from 'react-icons/io5'; import { IoAlertOutline } from 'react-icons/io5';
import { ReactComponent as DroneMenuIcon } from '../../../assets/images/drone_menu_icon.svg'; import { ReactComponent as DroneMenuIcon } from '../../../assets/images/drone_menu_icon.svg';
import {
Card
} from 'reactstrap';
import ControlAlarmNotice from '../alarm/ControlAlarmNotice'; import ControlAlarmNotice from '../alarm/ControlAlarmNotice';
import ControlReportList from '../report/ControlReportList'; import ControlReportList from '../report/ControlReportList';
import ControlReportDetail from '../report/ControlReportDetail'; import ControlReportDetail from '../report/ControlReportDetail';
@ -18,7 +19,7 @@ import ControlAlarmList from '../alarm/ControlAlarmList';
import ControlSetting from '../setting/ControlSetting'; import ControlSetting from '../setting/ControlSetting';
import WebsocketClient from '../../../components/websocket/WebsocketClient'; import WebsocketClient from '../../../components/websocket/WebsocketClient';
import { useDispatch, useSelector } from 'react-redux'; import { useDispatch, useSelector } from 'react-redux';
import { controlweatherAction } from '../../../modules/control/gp/actions/controlGpAction'
import * as Actions from '../../../modules/account/login/actions/authAction'; import * as Actions from '../../../modules/account/login/actions/authAction';
import { objectUnClickAction } from '../../../modules/control/map/actions/controlMapActions'; import { objectUnClickAction } from '../../../modules/control/map/actions/controlMapActions';
@ -26,10 +27,12 @@ const ControlMain = () => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const { isClickObject } = useSelector(state => state.controlMapReducer); const { isClickObject } = useSelector(state => state.controlMapReducer);
const { controlGpList } = useSelector(state => state.controlGpState); const { controlGpList, controlGroupAuthInfo } = useSelector(state => state.controlGpState);
const { controlDetail, controlWheather } = useSelector(
state => state.controlGpDtlState
);
const [alarm, setAlarm] = useState(false); const [alarm, setAlarm] = useState(false);
const { user } = useSelector(state => state.authState);
const [oepnReportList, setOpenReportList] = useState(false); const [oepnReportList, setOpenReportList] = useState(false);
// const [openReportDetail, setOpenReportDetail] = useState(false); // const [openReportDetail, setOpenReportDetail] = useState(false);
// const [openWeatherList, setOpenWeatherList] = useState(false); // const [openWeatherList, setOpenWeatherList] = useState(false);
@ -92,7 +95,27 @@ const ControlMain = () => {
setOpenReportList(true); setOpenReportList(true);
dispatch(objectUnClickAction()); dispatch(objectUnClickAction());
}; };
//날씨 API
const rq = {
nx: 37.4562557,
ny: 126.7052062
}
useEffect(() => {
dispatch(controlweatherAction.request(rq));
}, [])
function weathericon() {
if (controlWheather) {
let wheatherDetail = controlWheather.items.item;
let skyDetail = wheatherDetail[6].fcstValue;
if (skyDetail == 1 || skyDetail == 2 || skyDetail == 4) {
return <CloudRain size={20} />;
} else if (skyDetail == 4) {
return <CloudSnow size={20} />;
} else if (skyDetail == 0 || wheatherDetail[5].fcstValue == 1) {
return <Sun size={20} />;
} else return <Cloud size={20} />;
}
}
return ( return (
<> <>
<ControlAlarmNotice /> <ControlAlarmNotice />
@ -140,7 +163,49 @@ const ControlMain = () => {
{/* socket_off = 클래스명 변경시 빨간색! 접속이 원할하지않을때 */} {/* socket_off = 클래스명 변경시 빨간색! 접속이 원할하지않을때 */}
</ul> </ul>
</div> </div>
<div className={(!oepnReportList && !openAlarmList && !isClickObject) ? "main-data" : "main-data main-data-test"}>
<div className='main-data-box wather-data'>
<Card>
<div className='data-box-header'>
<span className='box-ti'>{!isClickObject ? "인천광역시" : controlDetail?.stAreaNm}</span>
<span className=''>{weathericon()}</span>
</div>
<div className='data-list-box'>
<div className='data-list'>
<span>기온</span>
<span>{!isClickObject ? controlWheather?.items.item[12].fcstValue : controlDetail?.items.item[12].fcstValue}</span>
</div>
<div className='data-list'>
<span>풍향</span>
<span><Navigation2 className="navigation-icon" style={{
transform: !isClickObject ? `rotate(${controlWheather?.items.item[3].fcstValue}deg)` : `rotate(${controlDetail?.items.item[3].fcstValue}deg)`
}} /></span>
</div>
<div className='data-list'>
<span>풍속</span>
<span>{!isClickObject ? controlWheather?.items.item[4].fcstValue : controlDetail?.items.item[4].fcstValue} m/s</span>
</div>
</div>
</Card>
</div>
<div className='main-data-box flight-data'>
<Card>
<div className='data-box-header'>
<span className='box-ti'>비행중인 기체</span>
</div>
<div className='data-list-box'>
<div className='data-list'>
<span>드론</span>
<span>{controlGpList ? controlGpList.length : 0}</span>
</div>
<div className='data-list'>
<span>항공기</span>
<span>2147</span>
</div>
</div>
</Card>
</div>
</div>
{oepnReportList ? ( {oepnReportList ? (
<ControlReportList <ControlReportList
// openReportDetailParam={openReportDetailParam} // openReportDetailParam={openReportDetailParam}

Loading…
Cancel
Save