From 523ef1cdf00e2e12026fb5dffb4369b50963f7a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?sanguu=28=EB=B0=95=EC=83=81=ED=98=84=29?= Date: Wed, 2 Nov 2022 10:30:03 +0900 Subject: [PATCH] =?UTF-8?q?=EB=93=9C=EB=A1=A0=EA=B4=80=EC=A0=9C=EC=8B=9C?= =?UTF-8?q?=EC=8A=A4=ED=85=9C=20=EB=82=A0=EC=94=A8=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80(reducer=20=EA=B0=92=20=EC=9D=B8=EC=8B=9D=20x)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/configs/constants.js | 3 + .../control/gp/actions/controlGpAction.ts | 75 ++++--- src/modules/control/gp/apis/controlGpApi.ts | 12 +- .../control/gp/models/controlGpModel.ts | 185 +++++++++++------- .../control/gp/reducers/controlGpReducer.ts | 118 ++++++----- src/modules/control/gp/sagas/controlGpSaga.ts | 19 +- src/redux/reducers/rootReducer.ts | 1 + src/utility/dfsxyconv.js | 70 +++++++ .../control/report/ControlReportDetail.js | 126 +++++++++++- 9 files changed, 451 insertions(+), 158 deletions(-) create mode 100644 src/utility/dfsxyconv.js diff --git a/src/configs/constants.js b/src/configs/constants.js index 49b48b6..23be2d9 100644 --- a/src/configs/constants.js +++ b/src/configs/constants.js @@ -11,11 +11,14 @@ export const NAVER_APP_SECRET_KEY = process.env.NAVER_APP_SECRET_KEY; // WINDY API KEY export const WINDY_KEY = process.env.REACT_WINDY_KEY; +// 기상청 API KEY +export const WHEATHER_KEY = process.env.REACT_WHEATHER_KEY; // 통신 코드 export const HTTP_STATUS_CODE = { OK: '00000' }; +//r6RMUsk3Vtama7D6uq7MiWV9dTC9MwfIIr4%2F45y0uVNw6BaYbgpKmL%2BLUDFVTfIYUmEe4K%2FaniEjdV9mg5t82Q%3D%3D export const FORM_PROC_TYPE = { SELECT: 'R', CREATE: 'C', diff --git a/src/modules/control/gp/actions/controlGpAction.ts b/src/modules/control/gp/actions/controlGpAction.ts index 8032c82..82de718 100644 --- a/src/modules/control/gp/actions/controlGpAction.ts +++ b/src/modules/control/gp/actions/controlGpAction.ts @@ -6,7 +6,7 @@ import { ControlGpData, ControlGpState, ControlGpDtlState, - ControlGpFlightPlanDataList, + ControlGpFlightPlanDataList, ControlGpWarnLogData, ControlGpLogState, ControlGpHisState, @@ -15,7 +15,9 @@ import { ControlGroupAuthState, ControlGpArcrftWarnList, ControlGpWarnLogList, - // ControlGpWarnLogDataList, + ControlweatherData, + ControlGpWeatherState, + rescontrolweatherData } from '../models/controlGpModel'; const CONTROL_GP_REQUEST = 'control/gp/CONTROL_GP_REQUEST'; @@ -40,74 +42,88 @@ const CONTROL_GROUP_AUTH_SUCCESS = 'control/group/CONTROL_GROUP_AUTH_SUCCESS'; const CONTROL_GROUP_AUTH_FAILURE = 'control/group/CONTROL_GROUP_AUTH_FAILURE'; // [관제] 비행 구역 조회 -const CONTROL_FLIGHT_PLAN_REQUEST = 'control/gp/flight/plan/CONTROL_FLIGHT_PLAN_REQUEST'; -const CONTROL_FLIGHT_PLAN_SUCCESS = 'control/gp/flight/plan/CONTROL_FLIGHT_PLAN_SUCCESS'; -const CONTROL_FLIGHT_PLAN_FAILURE = 'control/gp/flight/plan/CONTROL_FLIGHT_PLAN_FAILURE'; +const CONTROL_FLIGHT_PLAN_REQUEST = + 'control/gp/flight/plan/CONTROL_FLIGHT_PLAN_REQUEST'; +const CONTROL_FLIGHT_PLAN_SUCCESS = + 'control/gp/flight/plan/CONTROL_FLIGHT_PLAN_SUCCESS'; +const CONTROL_FLIGHT_PLAN_FAILURE = + 'control/gp/flight/plan/CONTROL_FLIGHT_PLAN_FAILURE'; //로그 리스트 조회 const CONTROL_GP_LOG_REQIEST = 'control/gp/CONTROL_GP_LOG_REQUEST'; const CONTROL_GP_LOG_SUCCESS = 'control/gp/CONTROL_GP_LOG_SUCCESS'; const CONTROL_GP_LOG_FAILURE = 'control/gp/CONTROL_GP_LOG_FAILURE'; -const CONTROL_FLIGHT_PLAN_INIT = 'control/gp/flight/plan/CONTROL_FLIGHT_PLAN_INIT'; +//로그 리스트 조회 +const CONTROL_WEATHER_REQUEST = 'control/gp/CONTROL_WEATHER_REQUEST'; +const CONTROL_WEATHER_SUCCESS = 'control/gp/CONTROL_WEATHER_SUCCESS'; +const CONTROL_WEATHER_FAILURE = 'control/gp/CONTROL_WEATHER_FAILURE'; + +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'; +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'; // [관제] 기체 별 비정상 리스트 조회 -const CONTROL_GP_ARCRFT_WARN_REQUEST = 'control/gp/arcrft/warn/CONTROL_FLIGHT_PLAN_WARN_REQUEST'; -const CONTROL_GP_ARCRFT_WARN_SUCCESS = 'control/gp/arcrft/warn/CONTROL_FLIGHT_PLAN_WARN_SUCCESS'; -const CONTROL_GP_ARCRFT_WARN_FAILURE = 'control/gp/arcrft/warn/CONTROL_FLIGHT_PLAN_WARN_FAILURE'; +const CONTROL_GP_ARCRFT_WARN_REQUEST = + 'control/gp/arcrft/warn/CONTROL_FLIGHT_PLAN_WARN_REQUEST'; +const CONTROL_GP_ARCRFT_WARN_SUCCESS = + 'control/gp/arcrft/warn/CONTROL_FLIGHT_PLAN_WARN_SUCCESS'; +const CONTROL_GP_ARCRFT_WARN_FAILURE = + 'control/gp/arcrft/warn/CONTROL_FLIGHT_PLAN_WARN_FAILURE'; export const controlGpAction = createAsyncAction( CONTROL_GP_REQUEST, CONTROL_GP_SUCCESS, CONTROL_GP_FAILURE )(); - + export const controlGpHisAction = createAsyncAction( CONTROL_GP_HIS_REQUEST, CONTROL_GP_HIS_SUCCESS, CONTROL_GP_HIS_FAILURE )<{ id: string }, ControlGpHisState, AxiosError>(); - export const controlGpDtlAction = createAsyncAction( CONTROL_GP_DTL_REQUEST, CONTROL_GP_DTL_SUCCESS, CONTROL_GP_DTL_FAILURE )(); - + export const controlGpRtDtlAction = createAsyncAction( CONTROL_GP_RTDTL_REQUEST, CONTROL_GP_RTDTL_SUCCESS, CONTROL_GP_RTDTL_FAILURE )(); - + export const controlGroupAuthAction = createAsyncAction( CONTROL_GROUP_AUTH_REQUEST, CONTROL_GROUP_AUTH_SUCCESS, - CONTROL_GROUP_AUTH_FAILURE + CONTROL_GROUP_AUTH_FAILURE )(); - + export const controlGpFlightPlanAction = createAsyncAction( CONTROL_FLIGHT_PLAN_REQUEST, - CONTROL_FLIGHT_PLAN_SUCCESS, - CONTROL_FLIGHT_PLAN_FAILURE, + CONTROL_FLIGHT_PLAN_SUCCESS, + CONTROL_FLIGHT_PLAN_FAILURE )(); export const controlGpLogAction = createAsyncAction( CONTROL_GP_LOG_REQIEST, CONTROL_GP_LOG_SUCCESS, CONTROL_GP_LOG_FAILURE - )<{ id: string }, ControlGpWarnLogList, AxiosError>(); +)<{ id: string }, ControlGpWarnLogList, AxiosError>(); export const controlGpFlightPlanWarnAction = createAsyncAction( CONTROL_FLIGHT_PLAN_WARN_REQUEST, - CONTROL_FLIGHT_PLAN_WARN_SUCCESS, - CONTROL_FLIGHT_PLAN_WARN_FAILURE, + CONTROL_FLIGHT_PLAN_WARN_SUCCESS, + CONTROL_FLIGHT_PLAN_WARN_FAILURE )(); export const controlGpArcrftWarnAction = createAsyncAction( @@ -116,7 +132,15 @@ export const controlGpArcrftWarnAction = createAsyncAction( CONTROL_GP_ARCRFT_WARN_FAILURE )(); -export const controlGpFlightPlanInitAction = createAction(CONTROL_FLIGHT_PLAN_INIT)(); +export const controlweatherAction = createAsyncAction( + CONTROL_WEATHER_REQUEST, + CONTROL_WEATHER_SUCCESS, + CONTROL_WEATHER_FAILURE +)(); + +export const controlGpFlightPlanInitAction = createAction( + CONTROL_FLIGHT_PLAN_INIT +)(); const actions = { controlGpAction, @@ -128,7 +152,8 @@ const actions = { controlGpFlightPlanAction, controlGpFlightPlanWarnAction, controlGpArcrftWarnAction, - controlGpFlightPlanInitAction + controlGpFlightPlanInitAction, + controlweatherAction }; export type ControlGpAction = ActionType; diff --git a/src/modules/control/gp/apis/controlGpApi.ts b/src/modules/control/gp/apis/controlGpApi.ts index 7696b38..b076789 100644 --- a/src/modules/control/gp/apis/controlGpApi.ts +++ b/src/modules/control/gp/apis/controlGpApi.ts @@ -3,7 +3,8 @@ import { ResponseControlGpHistory, ResponseControlGroupAuth, ControlGpPlanContainsRQ, - ResponseControlGpWarnLog + ResponseControlGpWarnLog, + ControlweatherData } from '../models/controlGpModel'; import qs from 'qs'; @@ -50,6 +51,15 @@ export const controlGpApi = { return data; }, + apiweather: async (rq: ControlweatherData) => { + const { data } = await axios.get(`api/ctr/cntrl/api/weather`, { + params: { + ...rq + } + }); + + return data; + }, checkPlanContains: async (rq: ControlGpPlanContainsRQ) => { if (!rq.idntfNum) { return null; diff --git a/src/modules/control/gp/models/controlGpModel.ts b/src/modules/control/gp/models/controlGpModel.ts index 745e247..95ad85a 100644 --- a/src/modules/control/gp/models/controlGpModel.ts +++ b/src/modules/control/gp/models/controlGpModel.ts @@ -1,11 +1,15 @@ -import { FlightPlanData } from "../../../basis/flight/models/basisFlightModel"; +import { FlightPlanData } from '../../../basis/flight/models/basisFlightModel'; export interface ControlGpState { - controlGpList: ControlGpData[] | undefined; + controlGpList: ControlGpData[] | undefined; } -export interface ControlGpFlightPlanState { - controlGpFltPlanList: ControlGpFlightPlanDataList | undefined; +export interface ControlGpWeatherState { + controlWheather: rescontrolweatherData | undefined; +} + +export interface ControlGpFlightPlanState { + controlGpFltPlanList: ControlGpFlightPlanDataList | undefined; controlGpContains: ControlGpPlanContainsRS | undefined; } @@ -24,7 +28,7 @@ export interface ControlGpDtlState { } export interface ControlGroupAuthState { - controlGroupAuthInfo : ControlGroupAuthData[] | undefined; + controlGroupAuthInfo: ControlGroupAuthData[] | undefined; } export interface ControlGpHistoryData { @@ -95,101 +99,129 @@ export interface ControlGpData { controlWarnCd: boolean; controlWarnNotyCd: boolean; } - +export interface ControlweatherData { + serviceKey: string; + numOfRows: string; + pageNo: string; + dataType: string; + base_date: string; + base_time: string; + nx: string; + ny: string; +} export interface ControlGroupAuthData { - cstmrSno: number, - userId: string, - groupId: string, - groupNm: string, - groupAuthCd: string, - arcrftSno: number, - idntfNum: string, - createUserId: string + cstmrSno: number; + userId: string; + groupId: string; + groupNm: string; + groupAuthCd: string; + arcrftSno: number; + idntfNum: string; + createUserId: string; } -export interface ControlGpFlightPlanDataList extends Array {}; +export interface ControlGpFlightPlanDataList + extends Array {} export interface ControlGpFlightPlanData { - planSno?: number, - groupId: string, - cstmrSno: number, - memberName: string, - email: string, - hpno: string, - clncd: string, - addr: string, - addrDtlCn: string, - zip: string, - schFltStDt: string, - schFltEndDt: string, - fltPurpose: string, - aprvlYn: string, - delYn: string, - createUserId: string, - createDt: string, - updateUserId: string, - updateDt: string, - areaList?: FlightPlanAreaDataList | undefined + planSno?: number; + groupId: string; + cstmrSno: number; + memberName: string; + email: string; + hpno: string; + clncd: string; + addr: string; + addrDtlCn: string; + zip: string; + schFltStDt: string; + schFltEndDt: string; + fltPurpose: string; + aprvlYn: string; + delYn: string; + createUserId: string; + createDt: string; + updateUserId: string; + updateDt: string; + areaList?: FlightPlanAreaDataList | undefined; } export interface ControlGpWarnLogData { warnLogSno: number; - cntrlId: String; + cntrlId: String; createDt: String; idntfNum: String; } -export interface ControlGpWarnLogList extends Array {}; +export interface ControlGpWarnLogList extends Array {} -export interface FlightPlanAreaDataList extends Array {}; +export interface FlightPlanAreaDataList extends Array {} export interface FlightPlanAreaData { - planAreaSno?: number, - planSno: number, - areaType: string, - fltMethod: string, - bufferZone: number, - fltElev: string, - createUserId?: string, - createDt?: string, - updateUserId?: string, - updateDt?: string, - coordList?: FlightPlanAreaCoordDataList | undefined - bufferCoordList?: FlightPlanAreaCoordDataList | undefined -} - -export interface FlightPlanAreaCoordDataList extends Array {}; + planAreaSno?: number; + planSno: number; + areaType: string; + fltMethod: string; + bufferZone: number; + fltElev: string; + createUserId?: string; + createDt?: string; + updateUserId?: string; + updateDt?: string; + coordList?: FlightPlanAreaCoordDataList | undefined; + bufferCoordList?: FlightPlanAreaCoordDataList | undefined; +} + +export interface FlightPlanAreaCoordDataList + extends Array {} export interface FlightPlanAreaCoordData { - planAreaCoordSno?: number, - planAreaSno?: number, - lat: number, - lon: number, - createUserId?: string, - createDt?: string + planAreaCoordSno?: number; + planAreaSno?: number; + lat: number; + lon: number; + createUserId?: string; + createDt?: string; // docState: string } export interface ControlGpArcrftWarnData { - cntrlId: string, - warnType: string, - idntfNum: string, - occurDt: string, - createDt: string, - warnCount: number, -} - -export interface ControlGpArcrftWarnList extends Array {}; + cntrlId: string; + warnType: string; + idntfNum: string; + occurDt: string; + createDt: string; + warnCount: number; +} + +export interface rescontrolweatherData { + resultCode: string; + 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 + extends Array {} export interface ControlGpPlanContainsRQ { - idntfNum: string, - lat: number, - lon: number, - planList: FlightPlanData[] + idntfNum: string; + lat: number; + lon: number; + planList: FlightPlanData[]; } export interface ControlGpPlanContainsRS { - contains: boolean, - idntfNum: string, + contains: boolean; + idntfNum: string; } export interface ResponseControlGpHistory { @@ -214,5 +246,8 @@ export const initiaResponseControlGpData = { controlGpFltPlanList: undefined, controlGpWarnLogList: undefined, controlGpContains: undefined, - controlGpArcrftWarnList: undefined + controlGpArcrftWarnList: undefined, + controlweatherData: undefined, + rescontrolweatherData: undefined, + controlWheather: undefined }; diff --git a/src/modules/control/gp/reducers/controlGpReducer.ts b/src/modules/control/gp/reducers/controlGpReducer.ts index c176c83..772e838 100644 --- a/src/modules/control/gp/reducers/controlGpReducer.ts +++ b/src/modules/control/gp/reducers/controlGpReducer.ts @@ -12,75 +12,98 @@ import { controlGpRtDtlAction, controlGroupAuthAction, controlGpArcrftWarnAction, + controlweatherAction } from '../actions/controlGpAction'; import { ControlGpWarnLogData, ControlDetailData, - ControlGpDtlState, - ControlGpFlightPlanState, + ControlGpDtlState, + ControlGpFlightPlanState, ControlGpLogState, ControlGpHisState, - ControlGpState, + ControlGpState, ControlGroupAuthState, initiaResponseControlGpData, + ControlGpWeatherState } from '../models/controlGpModel'; export const controlGpReducer = createReducer( initiaResponseControlGpData ).handleAction(controlGpAction.success, (state, action) => produce(state, draft => { - const { controlGpList } = action.payload; + const { controlGpList } = action.payload; draft.controlGpList = controlGpList; }) ); +export const controlGpweatherReducer = createReducer< + ControlGpWeatherState, + ControlGpAction +>(initiaResponseControlGpData).handleAction( + controlweatherAction.success, + (state, action) => + produce(state, draft => { + const data = action.payload; + console.log('data>>>>>>>>>', data); + draft.controlWheather = data; + }) +); -export const controlGpFltPlanReducer = createReducer( - initiaResponseControlGpData -).handleAction(controlGpFlightPlanAction.success, (state, action) => - produce(state, draft => { - const list = action.payload; - draft.controlGpFltPlanList = list; - }) -) -.handleAction(controlGpFlightPlanInitAction, (state, action) => - produce(state, draft => { - draft.controlGpFltPlanList = undefined; - }) -) -.handleAction(controlGpFlightPlanWarnAction.success, (state, action) => +export const controlGpFltPlanReducer = createReducer< + ControlGpFlightPlanState, + ControlGpAction +>(initiaResponseControlGpData) + .handleAction(controlGpFlightPlanAction.success, (state, action) => + produce(state, draft => { + const list = action.payload; + draft.controlGpFltPlanList = list; + }) + ) + .handleAction(controlGpFlightPlanInitAction, (state, action) => + produce(state, draft => { + draft.controlGpFltPlanList = undefined; + }) + ) + .handleAction(controlGpFlightPlanWarnAction.success, (state, action) => produce(state, draft => { const data = action.payload; draft.controlGpContains = data; }) -); + ); -export const controlGpLogReducer = createReducer( - initiaResponseControlGpData -).handleAction(controlGpLogAction.success, (state, action) => - produce(state, draft => { - const data = action.payload; - draft.controlGpWarnLog = data; - }) -) -.handleAction(controlGpArcrftWarnAction.success, (state, action) => - produce(state, draft => { - const list = action.payload; - draft.controlGpArcrftWarnList = list; - }) -); +export const controlGpLogReducer = createReducer< + ControlGpLogState, + ControlGpAction +>(initiaResponseControlGpData) + .handleAction(controlGpLogAction.success, (state, action) => + produce(state, draft => { + const data = action.payload; + draft.controlGpWarnLog = data; + }) + ) + .handleAction(controlGpArcrftWarnAction.success, (state, action) => + produce(state, draft => { + const list = action.payload; + draft.controlGpArcrftWarnList = list; + }) + ); -export const controlGpHisReducer = createReducer( - initiaResponseControlGpData - ).handleAction(controlGpHisAction.success, (state, action) => +export const controlGpHisReducer = createReducer< + ControlGpHisState, + ControlGpAction +>(initiaResponseControlGpData).handleAction( + controlGpHisAction.success, + (state, action) => produce(state, draft => { const { controlGpHistory } = action.payload; draft.controlGpHistory = controlGpHistory; }) ); -export const controlGpDtlReducer = createReducer( - initiaResponseControlGpData - ).handleAction(controlGpRtDtlAction.success, (state, action) => +export const controlGpDtlReducer = createReducer< + ControlGpDtlState, + ControlGpAction +>(initiaResponseControlGpData) + .handleAction(controlGpRtDtlAction.success, (state, action) => produce(state, draft => { const { controlGpDetail } = action.payload; @@ -93,16 +116,17 @@ export const controlGpDtlReducer = createReducer(initiaResponseControlGpData) - .handleAction(controlGroupAuthAction.success, (state, action) => - produce(state, draft => { - const { controlGroupAuthInfo } = action.payload; + ControlGroupAuthState, + ControlGpAction +>(initiaResponseControlGpData).handleAction( + controlGroupAuthAction.success, + (state, action) => + produce(state, draft => { + const { controlGroupAuthInfo } = action.payload; draft.controlGroupAuthInfo = controlGroupAuthInfo; }) - ) +); diff --git a/src/modules/control/gp/sagas/controlGpSaga.ts b/src/modules/control/gp/sagas/controlGpSaga.ts index 8be9d71..759f459 100644 --- a/src/modules/control/gp/sagas/controlGpSaga.ts +++ b/src/modules/control/gp/sagas/controlGpSaga.ts @@ -19,7 +19,6 @@ function* getControlGpSaga( const data = action.payload; const state = yield select(); const { objectId, isClickObject } = state.controlMapReducer; - // 그룹 별 기체 필터링 const { controlGroupAuthInfo } = state.controlGroupAuthState; const { controlGpHistory } = state.controlGpHisState; @@ -62,7 +61,7 @@ function* getControlGpSaga( yield put(Actions.controlGpArcrftWarnAction.success(rs)); } - if (objectId && isClickObject) { + if (objectId) { let detailData; //상세 정보에서 실시간 데이터 호출 @@ -103,7 +102,7 @@ function* controlGpRtDtlSaga( ) { try { const controlGpDetail = action.payload; - + // console.log(controlGpDetail); yield put( Actions.controlGpRtDtlAction.success({ controlDetail: undefined, @@ -168,13 +167,23 @@ function* getControlGpWarnLogSaga( try { const { id } = action.payload; const data = yield call(controlGpApi.getWarnLog, id); - yield put(Actions.controlGpLogAction.success(data)); } catch (error) { yield put(Actions.controlGpLogAction.failure(error)); } } +function* ControlWeatherSaga( + action: ActionType +) { + try { + const rq = action.payload; + const data = yield call(controlGpApi.apiweather, rq); + yield put(Actions.controlweatherAction.success(data.response.body.items)); + } catch (error) { + yield put(Actions.controlweatherAction.failure(error)); + } +} function* controlGpFlightPlanWarnSaga( action: ActionType ) { @@ -210,6 +219,8 @@ export function* controlGpSaga() { yield takeEvery(Actions.controlGpRtDtlAction.request, controlGpRtDtlSaga); yield takeEvery(Actions.controlGpDtlAction.request, controlDtlSaga); yield takeEvery(Actions.controlGroupAuthAction.request, controlGroupAuthSaga); + yield takeEvery(Actions.controlweatherAction.request, ControlWeatherSaga); + yield takeEvery( Actions.controlGpFlightPlanAction.request, controlGpFlightPlanSaga diff --git a/src/redux/reducers/rootReducer.ts b/src/redux/reducers/rootReducer.ts index 381433d..64bf789 100644 --- a/src/redux/reducers/rootReducer.ts +++ b/src/redux/reducers/rootReducer.ts @@ -84,6 +84,7 @@ const rootReducer = combineReducers({ menuState: menuReducer, analysisHistoryState: analysisHistoryReducer, analysisSimulatorState: analysisSimulatorReducer, + ControlGpWeatherState: controlGpReducer, flightState: flightReducer, findState: findAccountReducer }); diff --git a/src/utility/dfsxyconv.js b/src/utility/dfsxyconv.js new file mode 100644 index 0000000..3c8132a --- /dev/null +++ b/src/utility/dfsxyconv.js @@ -0,0 +1,70 @@ + + +var RE = 6371.00877; // 지구 반경(km) +var GRID = 5.0; // 격자 간격(km) +var SLAT1 = 30.0; // 투영 위도1(degree) +var SLAT2 = 60.0; // 투영 위도2(degree) +var OLON = 126.0; // 기준점 경도(degree) +var OLAT = 38.0; // 기준점 위도(degree) +var XO = 43; // 기준점 X좌표(GRID) +var YO = 136; // 기1준점 Y좌표(GRID) +// +// LCC DFS 좌표변환 ( code : "toXY"(위경도->좌표, v1:위도, v2:경도), "toLL"(좌표->위경도,v1:x, v2:y) ) +// + + +export default (code, v1, v2) => { + var DEGRAD = Math.PI / 180.0; + var RADDEG = 180.0 / Math.PI; + + var re = RE / GRID; + var slat1 = SLAT1 * DEGRAD; + var slat2 = SLAT2 * DEGRAD; + var olon = OLON * DEGRAD; + var olat = OLAT * DEGRAD; + + var sn = Math.tan(Math.PI * 0.25 + slat2 * 0.5) / Math.tan(Math.PI * 0.25 + slat1 * 0.5); + sn = Math.log(Math.cos(slat1) / Math.cos(slat2)) / Math.log(sn); + var sf = Math.tan(Math.PI * 0.25 + slat1 * 0.5); + sf = Math.pow(sf, sn) * Math.cos(slat1) / sn; + var ro = Math.tan(Math.PI * 0.25 + olat * 0.5); + ro = re * sf / Math.pow(ro, sn); + var rs = {}; + if (code == "toXY") { + rs['lat'] = v1; + rs['lng'] = v2; + var ra = Math.tan(Math.PI * 0.25 + (v1) * DEGRAD * 0.5); + ra = re * sf / Math.pow(ra, sn); + var theta = v2 * DEGRAD - olon; + if (theta > Math.PI) theta -= 2.0 * Math.PI; + if (theta < -Math.PI) theta += 2.0 * Math.PI; + theta *= sn; + rs['x'] = Math.floor(ra * Math.sin(theta) + XO + 0.5); + rs['y'] = Math.floor(ro - ra * Math.cos(theta) + YO + 0.5); + } + else { + rs['x'] = v1; + rs['y'] = v2; + var xn = v1 - XO; + var yn = ro - v2 + YO; + ra = Math.sqrt(xn * xn + yn * yn); + if (sn < 0.0) - ra; + var alat = Math.pow((re * sf / ra), (1.0 / sn)); + alat = 2.0 * Math.atan(alat) - Math.PI * 0.5; + + if (Math.abs(xn) <= 0.0) { + theta = 0.0; + } + else { + if (Math.abs(yn) <= 0.0) { + theta = Math.PI * 0.5; + if (xn < 0.0) - theta; + } + else theta = Math.atan2(xn, yn); + } + var alon = theta / sn + olon; + rs['lat'] = alat * RADDEG; + rs['lng'] = alon * RADDEG; + } + return rs; +} \ No newline at end of file diff --git a/src/views/control/report/ControlReportDetail.js b/src/views/control/report/ControlReportDetail.js index 3426b91..e6b4172 100644 --- a/src/views/control/report/ControlReportDetail.js +++ b/src/views/control/report/ControlReportDetail.js @@ -11,10 +11,21 @@ import { GET_ARCTFT_TYPE_CD, GET_WGHT_TYPE_CD } from '../../../utility/CondeUtil'; - -import { controlGpLogAction } 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 { + Navigation2, + Search, + Compass, + Sun, + Cloud, + CloudRain, + CloudSnow +} from 'react-feather'; +import { WHEATHER_KEY } from '../../../configs/constants'; +import { Table } from 'reactstrap'; const ControlReportDetail = props => { const dispatch = useDispatch(); const [historyModal, setHistoryModal] = useState(false); @@ -22,9 +33,79 @@ const ControlReportDetail = props => { const { controlGpDetail, controlDetail } = useSelector( state => state.controlGpDtlState ); + const { controlWheather } = useSelector(state => state.ControlGpWeatherState); const { controlGpWarnLog } = useSelector(state => state.controlGpLogState); + useEffect(() => { + if (controlGpDetail) { + const rs = dfsxyconv("toXY", controlGpDetail?.lat, controlGpDetail?.lng); + let now = new Date(); + let year = now.getFullYear(); // 년도 + let month = now.getMonth() + 1; // 월 + let day = ('0' + now.getDate()).slice(-2); // 날짜 + const today = `${year}${month}${day}`; + + let hours = now.getHours(); + let minutes = now.getMinutes(); + let basetime = "2300"; + + if ((hours >= 2 && minutes > 9) && hours <= 5) { + basetime = "0200"; + } + else if ((hours >= 5 && minutes > 9) && hours < 8) { + basetime = "0500"; + } + else if (hours >= 8 && minutes < 10) { + basetime = "0500"; + } + else if ((hours >= 8 && minutes > 9) && hours < 11) { + basetime = "0800"; + } + else if (hours >= 11 && minutes < 10) { + basetime = "0800"; + } + else if (hours >= 11 && hours < 14) { + basetime = "1100"; + } + else if (hours >= 14 && minutes < 10) { + basetime = "1100"; + } + else if ((hours >= 14 && minutes > 9) && hours < 17) { + basetime = "1400"; + } + else if (hours >= 17 && minutes < 10) { + basetime = "1400"; + } + else if ((hours >= 17 && minutes > 9) && hours < 20) { + basetime = "1700"; + } + else if (hours >= 20 && minutes < 10) { + basetime = "2000"; + } + else if ((hours >= 20 && minutes > 9) && hours < 23) { + basetime = "2000"; + } + else if (hours >= 23 && minutes < 10) { + basetime = "2300"; + } + else if (hours >= 23 && minutes > 9) { + basetime = "2300"; + } + const apidata = { + serviceKey: "r6RMUsk3Vtama7D6uq7MiWV9dTC9MwfIIr4%2F45y0uVNw6BaYbgpKmL%2BLUDFVTfIYUmEe4K%2FaniEjdV9mg5t82Q%3D%3D", + numOfRows: 14, + pageNo: 1, + dataType: "JSON", + base_date: today, + base_time: basetime, + nx: rs.x, + ny: rs.y, + } + dispatch(controlweatherAction.request(apidata)); + } + }, [controlGpDetail]) useEffect(() => { + if (historyModal) { if (controlGpDetail) { dispatch(controlGpLogAction.request({ id: controlGpDetail.controlId })); @@ -43,7 +124,6 @@ const ControlReportDetail = props => { return '-'; } }; - return (
@@ -181,7 +261,7 @@ const ControlReportDetail = props => {
헤딩 방위각
- {controlGpDetail?.heading} ° + {controlGpDetail?.heading}
{/*
@@ -232,7 +312,41 @@ const ControlReportDetail = props => {
- +
+
+

날씨 정보

+
+
+
+
+
+ 현재위치의 날씨 정보입니다. + {controlDetail?.stAreaNm} +
+ + + + + + + + + + + + + + + + + + + +
시각날씨기온풍향풍속
15시27℃2m/s
+
+
+
+