Browse Source

비행계획서 기본 CRUD 구성

pull/2/head
지대한 2 years ago
parent
commit
9f86f9b172
  1. 1296
      src/components/basis/flight/plan/FlightPlanForm.js
  2. 7
      src/components/basis/flight/plan/FlightPlanGrid.js
  3. 16
      src/components/basis/flight/plan/FlightPlanSearch.js
  4. 20
      src/containers/basis/flight/plan/FlightPlanContainer.js
  5. 340
      src/containers/basis/flight/plan/FlightPlanDetailContainer.js
  6. 9
      src/modules/basis/flight/actions/basisFlightAction.ts
  7. 10
      src/modules/basis/flight/apis/basisFlightApi.ts
  8. 409
      src/modules/basis/flight/models/basisFlightModel.ts
  9. 11
      src/modules/basis/flight/reducers/basisFlightReducer.ts
  10. 261
      src/modules/basis/flight/sagas/basisFlightSaga.ts
  11. 2
      src/router/routes/RouteBasis.js

1296
src/components/basis/flight/plan/FlightPlanForm.js

File diff suppressed because it is too large Load Diff

7
src/components/basis/flight/plan/FlightPlanGrid.js

@ -25,7 +25,7 @@ const FlightPlanGrid = ({movePage, planListData, handleMoveDetail}) => {
} }
} }
]; ];
console.log(planListData, columns)
return ( return (
<div className='pal-card-box'> <div className='pal-card-box'>
<Row> <Row>
@ -33,9 +33,8 @@ const FlightPlanGrid = ({movePage, planListData, handleMoveDetail}) => {
<div <div
className='cont-ti d-flex justify-content-between align-items-sm-center align-items-start flex-sm-row'> className='cont-ti d-flex justify-content-between align-items-sm-center align-items-start flex-sm-row'>
<div> <div>
{/* <h4>{"비행 계획"} 목록</h4> */} <h4>비행계획서 신청 목록</h4>
<h4>{"비행계획서 신청"} 목록</h4> <span className='search-case'>검색결과 {!!planListData ? planListData.length : 0}</span>
<span className='search-case'>검색결과 0</span>
</div> </div>
<div className='d-flex align-items-center'> <div className='d-flex align-items-center'>
<Button.Ripple <Button.Ripple

16
src/components/basis/flight/plan/FlightPlanSearch.js

@ -5,7 +5,7 @@ import Flatpickr from 'react-flatpickr';
import moment from 'moment'; import moment from 'moment';
const FlightPlanSearch = ({searchData, onChangeSearchData}) => { const FlightPlanSearch = ({searchData, handleChangeSearchData, handleSearch}) => {
const {schFltStDt, schFltEndDt, aprvlYn} = searchData; const {schFltStDt, schFltEndDt, aprvlYn} = searchData;
const initCheckState = { const initCheckState = {
@ -14,11 +14,14 @@ const FlightPlanSearch = ({searchData, onChangeSearchData}) => {
'no': (aprvlYn == 'N' || aprvlYn == 'A'), 'no': (aprvlYn == 'N' || aprvlYn == 'A'),
} }
const [checkState, setCheckState] = useState(initCheckState); const [checkState, setCheckState] = useState(initCheckState);
const handleClickSearch = (e) => {
handleSearch(searchData);
}
const handleChangeInput = (dates, value, config) => { const handleChangeInput = (dates, value, config) => {
if (dates.length === 2) { if (dates.length === 2) {
const schFltStDt = moment(dates[0]).format('YYYY-MM-DD HH:mm:ss'); const schFltStDt = moment(dates[0]).format('YYYY-MM-DD HH:mm:ss');
const schFltEndDt = moment(dates[1]).set({'h': 23, 'm': 59, 's': 59}).format('YYYY-MM-DD HH:mm:ss'); const schFltEndDt = moment(dates[1]).set({'h': 23, 'm': 59, 's': 59}).format('YYYY-MM-DD HH:mm:ss');
onChangeSearchData({schFltStDt, schFltEndDt}) handleChangeSearchData({schFltStDt, schFltEndDt})
} }
} }
const handleChangeCheckbox = (e) => { const handleChangeCheckbox = (e) => {
@ -27,7 +30,7 @@ const FlightPlanSearch = ({searchData, onChangeSearchData}) => {
switch (value) { switch (value) {
case 'A': case 'A':
val = checked ? 'A' : ''; val = checked ? 'A' : '';
onChangeSearchData({[name]: val}) handleChangeSearchData({[name]: val})
setCheckState({ setCheckState({
'all': checked, 'all': checked,
'yes': checked, 'yes': checked,
@ -39,7 +42,7 @@ const FlightPlanSearch = ({searchData, onChangeSearchData}) => {
else if (checked && !checkState.no) val = 'Y' else if (checked && !checkState.no) val = 'Y'
else if (!checked && checkState.no) val = 'N' else if (!checked && checkState.no) val = 'N'
else if (!checked && !checkState.no) val = '' else if (!checked && !checkState.no) val = ''
onChangeSearchData({[name]: val}) handleChangeSearchData({[name]: val})
setCheckState(prevState => ({ setCheckState(prevState => ({
'all': prevState.no && checked, 'all': prevState.no && checked,
'yes': checked, 'yes': checked,
@ -51,7 +54,7 @@ const FlightPlanSearch = ({searchData, onChangeSearchData}) => {
else if (checked && !checkState.yes) val = 'N' else if (checked && !checkState.yes) val = 'N'
else if (!checked && checkState.yes) val = 'Y' else if (!checked && checkState.yes) val = 'Y'
else if (!checked && !checkState.yes) val = '' else if (!checked && !checkState.yes) val = ''
onChangeSearchData({[name]: val}) handleChangeSearchData({[name]: val})
setCheckState(prevState => ({ setCheckState(prevState => ({
'all': prevState.yes && checked, 'all': prevState.yes && checked,
'yes': prevState.yes, 'yes': prevState.yes,
@ -75,8 +78,7 @@ const FlightPlanSearch = ({searchData, onChangeSearchData}) => {
<Button.Ripple <Button.Ripple
color='primary' color='primary'
size='sm' size='sm'
onClick={e => { onClick={handleClickSearch}
}}
> >
<Search size={16}/> <Search size={16}/>
검색 검색

20
src/containers/basis/flight/plan/FlightPlanContainer.js

@ -19,18 +19,22 @@ const FlightPlanContainer = () => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const history = useHistory(); const history = useHistory();
const [searchData, setSerchData] = useState(initSearchData); const [searchData, setSerchData] = useState(initSearchData);
const planListData = useSelector(state => state.flightState.list); const {list: planListData, detail: planDetailData} = useSelector(state => state.flightState);
const moveFlightPlanDetailPage = () => { const moveFlightPlanDetailPage = () => {
if(planDetailData){
dispatch(FlightAction.FLIGHT_PLAN_DETAIL_INIT());
}
history.push('/basis/flight/plan/create'); history.push('/basis/flight/plan/create');
}; };
const handleSearch = (data) => {
dispatch(FlightAction.FLIGHT_PLAN_LIST.request(data));
}
useEffect(() => { useEffect(() => {
dispatch(FlightAction.FLIGHT_PLAN_LIST.request(searchData)) handleSearch(searchData);
}, []) }, [])
// console.log(history, 'history')
console.log(searchData)
const handleChangeSearchData = (values) => { const handleChangeSearchData = (values) => {
setSerchData(prevState => ({ setSerchData(prevState => ({
...prevState, ...prevState,
@ -38,20 +42,16 @@ const FlightPlanContainer = () => {
})) }))
} }
// 비행계획서 저장
const handleClickCreate = () => {
};
const handleMoveDetail = (id) => { const handleMoveDetail = (id) => {
history.push(`/basis/flight/plan/detail/${id}`) history.push(`/basis/flight/plan/detail/${id}`)
} }
return ( return (
// <CustomMainLayout title={"비행 계획 관리"}>
<CustomMainLayout title={"비행계획서 신청"}> <CustomMainLayout title={"비행계획서 신청"}>
<FlightPlanSearch <FlightPlanSearch
searchData={searchData} searchData={searchData}
onChangeSearchData={handleChangeSearchData} handleChangeSearchData={handleChangeSearchData}
handleSearch={handleSearch}
/> />
<FlightPlanGrid <FlightPlanGrid
movePage={moveFlightPlanDetailPage} movePage={moveFlightPlanDetailPage}

340
src/containers/basis/flight/plan/FlightPlanDetailContainer.js

@ -1,172 +1,228 @@
import React, {useEffect, useState} from 'react'; import React, {useEffect, useState} from 'react';
import FlightPlanForm from '../../../../components/basis/flight/plan/FlightPlanForm'; import FlightPlanForm from '../../../../components/basis/flight/plan/FlightPlanForm';
import {CustomDetailLayout} from '../../../../components/layout/CustomDetailLayout'; import {CustomDetailLayout} from '../../../../components/layout/CustomDetailLayout';
import {FlightPlanAreaModal} from '../../../../components/basis/flight/plan/FlightPlanAreaModal'; import {useHistory, useLocation, useParams} from 'react-router-dom';
import FlightPlanAreaContainer from './FlightPlanAreaContainer';
import {useHistory} from 'react-router-dom';
import {useDispatch, useSelector} from 'react-redux'; import {useDispatch, useSelector} from 'react-redux';
import * as yup from 'yup';
import {yupResolver} from '@hookform/resolvers/yup';
import * as Actions from '../../../../modules/basis/flight/actions/basisFlightAction'; import * as Actions from '../../../../modules/basis/flight/actions/basisFlightAction';
import {useForm} from 'react-hook-form'; import {initFlightBas} from '../../../../modules/basis/flight/models/basisFlightModel';
import moment from 'moment';
import {Save} from 'react-feather';
const initFlightPlanData = {
id: '', const initModal = {
memberName: '', area: false,
clncd: '+82', pilot: false,
hpno: '', arcrft: false
email: '',
lonlat: '',
lonlat2: '',
lonlat3: '',
fltElev: '',
fltHight: '',
fltMethod: '',
groupNm: '',
pilotName: '',
pilotHpno: '',
pilotEmail: '',
aGroupNm: '',
arcrftModelNm: '',
arcrftTypeCd: '',
ownerNm: '',
createUserId: '',
updateUserId: ''
} }
const FlightPlanDetailContainer = props => { const FlightPlanDetailContainer = () => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const history = useHistory(); const history = useHistory();
const [pageType, setPageType] = useState('create'); const location = useLocation();
const {flightPlanArea} = useSelector(state => state.flightState); const urlParams = useParams();
const [areaInfo, setAreaInfo] = useState(); const flightState = useSelector(state => state.flightState);
const [modal, setModal] = useState({ const {detail} = flightState;
isOpen: false, const [modal, setModal] = useState(initModal);
title: '', const [detailData, setDetailData] = useState(initFlightBas.initDetail);
});
const {listFlightP, flightCount, isRefreshFlight} = useSelector(
state => state.flightState
);
const [flightPlanData, setFlightPlanData] = useState(initFlightPlanData);
const [params, setParams] = useState({
schFltStDt: moment().subtract(1, 'day').format('YYYY-MM-DD'),
schFltEndDt: moment().subtract(-1, 'day').format('YYYY-MM-DD'),
search1: ''
});
useEffect(() => { useEffect(() => {
console.log('isRefreshFlight>>>>', isRefreshFlight); if (Object.keys(urlParams).length === 0 && urlParams.constructor === Object) return;
if (isRefreshFlight) { dispatch(Actions.FLIGHT_PLAN_DETAIL.request(urlParams.planSno));
console.log(isRefreshFlight); }, [urlParams])
handlerSearch();
}
}, [isRefreshFlight]);
const [flightPlanDataList, setFlightPlanDataList] = useState([]); useEffect(() => {
setDetailData(detail);
}, [detail])
const handleModal = (modal) => {
setModal(prevState => ({
...initModal,
[modal.target]: modal.isOpen
}))
}
/* Form Validation Checking */ // 변경감지
const validSchema = yup.object().shape({}); const handleChange = ({name, value, type, index, pIndex}) => {
const {} = useForm({ const arrName = `${type}List`;
defaultValues: { switch (type) {
coodinates: [], case 'coord':
radius: '', // TODO 추후 삭제 필요 start
altitude_m: '', if(name == 'lonlat'){
altitude_ft: '', const values = value.split("/");
}, let latValue = 1
resolver: yupResolver(validSchema) let lonValue = 1
}) if(values.length == 1){
latValue = values[0].trim();
} else if(values.length == 2){
latValue = values[0].trim();
lonValue = values[1].trim();
} else {
return;
}
setDetailData(prevState => {
const areaList = prevState.areaList.map((area, i) => {
if(i !== pIndex) return {...area};
const coordList = area.coordList.map((coord, j) => {
if(j !== index) return {...coord};
return {
...coord,
lat: latValue,
lon: lonValue
}
})
return {
...area,
coordList
}
})
return {
...prevState,
areaList
}
})
return;
}
// TODO 추후 삭제 필요 end
setDetailData(prevState => {
const areaArr = [...prevState.areaList];
const coordArr = areaArr[pIndex].coordList;
const updateData = {
...coordArr[index],
[name]: value
}
coordArr[index] = updateData;
areaArr[pIndex] = coordArr
return {
...prevState,
areaList: areaArr
}
})
break;
case 'area':
case 'pilot':
case 'arcrft':
setDetailData(prevState => {
const arr = [...prevState[arrName]];
const updateData = {
...prevState[arrName][index],
[name]: value
}
arr[index] = updateData;
return {
...prevState,
[arrName]: arr
}
})
break;
case 'plan':
default:
setDetailData(prevState => ({
...prevState,
[name]: value
}))
break;
}
}
const saveFlightPlanArea = () => { // 추가
console.log('비행 구역 설정 저장'); const handleAddArray = ({type, pIndex}) => {
const arrName = `${type}List`;
switch (type) {
case 'coord':
setDetailData(prevState => {
const areaArr = [...prevState.areaList];
const coordArr = [...areaArr[pIndex].coordList, initFlightBas[type]];
areaArr[pIndex] = coordArr;
return {
...prevState,
areaList: [...areaArr]
}
})
break;
case 'area':
case 'pilot':
case 'arcrft':
setDetailData(prevState => {
return {
...prevState,
[arrName]: [...prevState[arrName], initFlightBas[type]]
}
})
break;
default:
break;
}
} }
useEffect(() => { // 삭제
if (props.id) { const handleDeleteArray = ({type, index, pIndex}) => {
handlerSearch(); const arrName = `${type}List`;
setPageType('update'); switch (type) {
case 'coord':
setDetailData(prevState => {
const areaArr = [...prevState.areaList];
const coordArr = [...areaArr[pIndex]];
const deleteData = coordArr.splice(index, 1);
areaArr[pIndex] = coordArr;
return {
...prevState,
areaList: [...areaArr]
}
})
break;
case 'area':
case 'pilot':
case 'arcrft':
setDetailData(prevState => {
const arr = [...prevState[type]];
const deleteData = arr.splice(index, 1);
return {
...prevState,
[arrName]: arr
}
})
default:
break;
} }
// console.log(selectData);
}, []);
useEffect(() => {
let newArr = [];
listFlightP?.map(item => {
newArr.push({...item});
});
setFlightPlanDataList(listFlightP);
}, [listFlightP]);
const openModal = () => {
setModal({
isOpen: true,
title: '비행 구역 설정',
});
} }
const handlerCreate = e => {
// console.log('flightPlanData>>>', {flightPlanData, params});
// let saveData = {flightPlanData, params};
const saveData = {...flightPlanData};
dispatch(
Actions.FLIGHT_PLAN_CREATE.request(saveData)
);
};
// const handlerInput = (val) => {
// console.log('handler input : ', val)
// console.log('handler input : ', val[1])
// console.log('handler input : ', val[0])
// setParams({
// ...params,
// schFltStDt: moment(val[1]).format('YYYY-MM-DD'),
// schFltEndDt: moment(val[0]).format('YYYY-MM-DD')
// });
// };
// console.log('params >>>>> ', params)
const onChange = (e) => {
const {name, value} = e.target;
setFlightPlanData((prevState) => ({
...prevState,
[name]: value,
}));
};
console.log('===> ', flightPlanData);
const handlerDelete = async data => { // 저장
// dispatch(Actions.IDNTF_DELETE.request(data.arcrftSno)); const handleSave = () => {
}; if (!detailData.planSno) {
dispatch(Actions.FLIGHT_PLAN_CREATE.request(detailData));
useEffect(() => { } else {
setAreaInfo(flightPlanArea); dispatch(Actions.FLIGHT_PLAN_UPDATE.request(detailData));
}, [flightPlanArea]); }
}
// 삭제
const handleDelete = () => {
dispatch(Actions.FLIGHT_PLAN_DELETE.request(urlParams.planSno));
}
return ( return (
<CustomDetailLayout title={"비행 계획 신청서"}> <CustomDetailLayout title={"비행 계획 신청서"}>
<FlightPlanForm <FlightPlanForm
data={flightPlanData} data={detailData}
openModal={openModal} handleModal={handleModal}
areaInfo={areaInfo} handleSave={handleSave}
params={params} handleDelete={handleDelete}
handlerSave={ handleChange={handleChange}
pageType === 'create' ? handlerCreate : handlerUpdate handleAddArray={handleAddArray}
} handleDeleteArray={handleDeleteArray}
onChange={onChange} // handlerSave={
handlerDelete={handlerDelete} // pageType === 'create' ? handlerCreate : handlerUpdate
// }
// onChange={onChange}
// handlerDelete={handlerDelete}
// handlerInput={handlerInput} // handlerInput={handlerInput}
/> />
<FlightPlanAreaModal {/*<FlightPlanAreaModal*/}
modal={modal} {/* modal={modal}*/}
save={saveFlightPlanArea} {/* save={saveFlightPlanArea}*/}
setModal={setModal} {/* setModal={setModal}*/}
/> {/*/>*/}
</CustomDetailLayout> </CustomDetailLayout>
) )
};
}
export default FlightPlanDetailContainer; export default FlightPlanDetailContainer;

9
src/modules/basis/flight/actions/basisFlightAction.ts

@ -1,5 +1,5 @@
import { AxiosError } from 'axios'; import { AxiosError } from 'axios';
import { createAsyncAction, ActionType} from 'typesafe-actions'; import { createAsyncAction, ActionType, createAction } from 'typesafe-actions';
import { import {
FlightAreaData, FlightAreaData,
FlightPlanArcrftDataList, FlightPlanArcrftDataList,
@ -28,7 +28,8 @@ const FLIGHT_PLAN_LIST_FAILURE = 'basis/flight/plan/list/LIST_FAILURE';
const FLIGHT_PLAN_DETAIL_REQUEST = 'basis/flight/plan/detail/DETAIL_REQUEST'; const FLIGHT_PLAN_DETAIL_REQUEST = 'basis/flight/plan/detail/DETAIL_REQUEST';
const FLIGHT_PLAN_DETAIL_SUCCESS = 'basis/flight/plan/detail/DETAIL_SUCCESS'; const FLIGHT_PLAN_DETAIL_SUCCESS = 'basis/flight/plan/detail/DETAIL_SUCCESS';
const FLIGHT_PLAN_DETAIL_FAILURE = 'basis/flight/plan/detail/DETAIL_FAILURE'; const FLIGHT_PLAN_DETAIL_FAILURE = 'basis/flight/plan/detail/DETAIL_FAILURE';
// 상세 초기화
const FLIGHT_PLAN_DETAIL_INITIAL = 'basis/flight/plan/detail/DETAIL_INIT';
// 생성 // 생성
const FLIGHT_PLAN_CREATE_REQUEST = 'basis/flight/plan/create/CREATE_REQUEST'; const FLIGHT_PLAN_CREATE_REQUEST = 'basis/flight/plan/create/CREATE_REQUEST';
const FLIGHT_PLAN_CREATE_SUCCESS = 'basis/flight/plan/create/CREATE_SUCCESS'; const FLIGHT_PLAN_CREATE_SUCCESS = 'basis/flight/plan/create/CREATE_SUCCESS';
@ -84,7 +85,8 @@ export const FLIGHT_PLAN_DETAIL = createAsyncAction(
FLIGHT_PLAN_DETAIL_SUCCESS, FLIGHT_PLAN_DETAIL_SUCCESS,
FLIGHT_PLAN_DETAIL_FAILURE FLIGHT_PLAN_DETAIL_FAILURE
)<number, FlightPlanData, AxiosError>(); )<number, FlightPlanData, AxiosError>();
// 상세 초기화
export const FLIGHT_PLAN_DETAIL_INIT = createAction(FLIGHT_PLAN_DETAIL_INITIAL)();
// 생성 // 생성
export const FLIGHT_PLAN_CREATE = createAsyncAction( export const FLIGHT_PLAN_CREATE = createAsyncAction(
FLIGHT_PLAN_CREATE_REQUEST, FLIGHT_PLAN_CREATE_REQUEST,
@ -126,6 +128,7 @@ const actions = {
// FLIGHT_PLAN_AREA, // FLIGHT_PLAN_AREA,
FLIGHT_PLAN_LIST, FLIGHT_PLAN_LIST,
FLIGHT_PLAN_DETAIL, FLIGHT_PLAN_DETAIL,
FLIGHT_PLAN_DETAIL_INIT,
FLIGHT_PLAN_CREATE, FLIGHT_PLAN_CREATE,
FLIGHT_PLAN_UPDATE, FLIGHT_PLAN_UPDATE,
FLIGHT_PLAN_DELETE, FLIGHT_PLAN_DELETE,

10
src/modules/basis/flight/apis/basisFlightApi.ts

@ -13,20 +13,16 @@ export const flightPlanAPI = {
addQueryPrefix: true, addQueryPrefix: true,
arrayFormat: 'repeat' arrayFormat: 'repeat'
}); });
console.log('>>> rq : ', queryString)
const res = await axios.get(`api/bas/flight/plan/list${queryString}`); const res = await axios.get(`api/bas/flight/plan/list${queryString}`);
console.log('>>> rs : ', res);
return res; return res;
}, },
detail: async (planSno: number) => { detail: async (planSno: number) => {
console.log('>>> rq : ', planSno)
const res = await axios.get(`api/bas/flight/plan/detail/${planSno}`); const res = await axios.get(`api/bas/flight/plan/detail/${planSno}`);
console.log('>>> rs : ', res);
return res; return res;
}, },
create: async (data: FlightPlanData) => { create: async (data: FlightPlanData) => {
console.log('>>> rq : ', data) console.log('>>> rq : ', data)
const res = await axios.post(`api/bas/flight/paln/create`, data); const res = await axios.post(`api/bas/flight/plan/create`, data);
console.log('>>> rs : ', res); console.log('>>> rs : ', res);
return res; return res;
}, },
@ -42,13 +38,13 @@ export const flightPlanAPI = {
console.log('>>> rs : ', res); console.log('>>> rs : ', res);
return res; return res;
}, },
listPilot: async (groupId: number) => { listPilot: async (groupId: string) => {
console.log('>>> rq : ', groupId) console.log('>>> rq : ', groupId)
const res = await axios.get(`api/bas/flight/plan/pilot/${groupId}`); const res = await axios.get(`api/bas/flight/plan/pilot/${groupId}`);
console.log('>>> rs : ', res); console.log('>>> rs : ', res);
return res; return res;
}, },
listArcrft: async (groupId: number) => { listArcrft: async (groupId: string) => {
console.log('>>> rq : ', groupId) console.log('>>> rq : ', groupId)
const res = await axios.get(`api/bas/flight/plan/arcrft/${groupId}`); const res = await axios.get(`api/bas/flight/plan/arcrft/${groupId}`);
console.log('>>> rs : ', res); console.log('>>> rs : ', res);

409
src/modules/basis/flight/models/basisFlightModel.ts

@ -1,4 +1,4 @@
import { date } from "yup"; import moment from "moment";
export interface FlightState { export interface FlightState {
areaList: FlightAreaData | undefined areaList: FlightAreaData | undefined
@ -14,92 +14,129 @@ export interface FlightAreaData {
} }
export interface FlightPlanArea { export interface FlightPlanArea {
address: '', address: string,
coordinates: '', coordinates: string,
redius: '', redius: string,
altitude_m: '', altitude_m: string,
altitude_ft: '', altitude_ft: string,
} }
export interface FlightPlanData { export interface FlightPlanData {
planArcrftSno: number, planSno?: number,
planSno: number, groupId: string,
arcrftSno: number, cstmrSno: number,
idntfNum: string, memberName: string,
groupNm: string, email: string,
prdctNum: string, hpno: string,
arcrftTypeCd: string, clncd: string,
arcrftModelNm: string, addr: string,
prdctCmpnNm: string, addrDtlCn: string,
prdctDate: Date; zip: string,
arcrftLngth: number, schFltStDt: string,
arcrftWdth: number, schFltEndDt: string,
arcrftHght: number, fltPurpose: string,
arcrftWght: number, aprvlYn: string,
wghtTypeCd: string, delYn: string,
imageUrl: string,
takeoffWght: number;
useYn: string,
cameraYn: string,
insrncYn: string,
ownerNm: string,
createUserId: string, createUserId: string,
createDt: Date, createDt: string,
updateUserId: string, updateUserId: string,
updateDt: Date, updateDt: string,
areaList: FlightPlanAreaDataList, areaList?: FlightPlanAreaDataList | undefined,
pilotList: FlightPlanPilotDataList, pilotList?: FlightPlanPilotDataList | undefined,
arcrftList: FlightPlanArcrftDataList, arcrftList?: FlightPlanArcrftDataList | undefined
docState: string, // docState: string
} }
export interface FlightPlanAreaData { export interface FlightPlanAreaData {
planAreaSno: number, planAreaSno?: number,
planSno: number, planSno: number,
areaType: string, areaType: string,
fltMethod: string, fltMethod: string,
bufferZone: number, bufferZone: number,
fltElev: string, fltElev: string,
createUserId: string, createUserId?: string,
createDt: Date, createDt?: string,
updateUserId: string, updateUserId?: string,
updateDt: Date, updateDt?: string,
coordList: FlightPlanAreaCoordData coordList?: FlightPlanAreaCoordDataList | undefined
docState: string, // docState: string,
} }
export interface FlightPlanAreaDataList extends Array<FlightPlanAreaData> {}; export interface FlightPlanAreaDataList extends Array<FlightPlanAreaData> {};
export interface FlightPlanAreaCoordData { export interface FlightPlanAreaCoordData {
planAreaCoordSno: number, planAreaCoordSno?: number,
planAreaSno: number, planAreaSno?: number,
lat: number, lat: number,
lon: number, lon: number,
createUserId: string, createUserId?: string,
createDt: Date, createDt?: string
docState: string // docState: string
} }
export interface FlightPlanAreaCoordData extends Array<FlightPlanAreaCoordData> {}; export interface FlightPlanAreaCoordDataList extends Array<FlightPlanAreaCoordData> {};
export interface FlightPlanPilotData { export interface FlightPlanPilotData {
planPilotSno?: number,
planSno?: number,
cstmrSno?: number,
groupNm: string,
memberName: string,
email: string,
hpno: string,
clncd: string,
addr: string,
addrDtlCn: string,
zip: string,
qlfcNo: string,
carrer: string,
createUserId: string,
createDt: string,
updateUserId: string,
updateDt: string
// docState: string
} }
export interface FlightPlanPilotDataList extends Array<FlightPlanPilotData> {}; export interface FlightPlanPilotDataList extends Array<FlightPlanPilotData> {};
export interface FlightPlanArcrftData { export interface FlightPlanArcrftData {
planArcrftSno: number,
planSno: number,
arcrftSno: number,
idntfNum: string,
groupNm: string,
prdctNum: string,
arcrftTypeCd: string,
arcrftModelNm: string,
prdctCmpnNm: string,
prdctDate: string,
arcrftLngth: number,
arcrftWdth: number,
arcrftHght: number,
arcrftWght: number,
wghtTypeCd: string,
imageUrl: string,
takeoffWght: number,
useYn: string,
cameraYn: string,
insrncYn: string,
ownerNm: string,
createUserId: string,
createDt: string,
updateUserId: string,
updateDt: string
// docState: string
} }
export interface FlightPlanArcrftDataList extends Array<FlightPlanArcrftData> {}; export interface FlightPlanArcrftDataList extends Array<FlightPlanArcrftData> {};
// rq // rq
export interface FlightPlanListRqData { export interface FlightPlanListRqData {
schFltStDt: Date, schFltStDt: string,
schFltEndDt: Date, schFltEndDt: string,
aprvlYn: string aprvlYn: string
} }
export interface FlightPlanAprovRqData { export interface FlightPlanAprovRqData {
planSnoList: [number], planSnoList: [number],
aprvlYn: string aprvlYn: string
@ -110,7 +147,275 @@ export const initFlight = {
areaList: undefined, areaList: undefined,
flightPlanArea: undefined, flightPlanArea: undefined,
list: undefined, list: undefined,
detail: undefined, detail: {
planSno: 0,
groupId: '',
cstmrSno: 0,
memberName: '',
email: '',
hpno: '',
clncd: '+81',
addr: '',
addrDtlCn: '',
zip: '',
schFltStDt: moment().set({'h': 0, 'm': 0, 's': 0}).format('YYYY-MM-DD HH:mm:ss'),
schFltEndDt: moment().set({'h': 0, 'm': 0, 's': 0}).format('YYYY-MM-DD HH:mm:ss'),
fltPurpose: '',
aprvlYn: '',
delYn: '',
createUserId: '',
createDt: '',
updateUserId: '',
updateDt: '',
areaList: [{
planAreaSno: 0,
planSno: 0,
areaType: '',
fltMethod: '',
bufferZone: 0,
fltElev: '',
createUserId: '',
createDt: '',
updateUserId: '',
updateDt: '',
coordList: [{
planAreaCoordSno: 0,
planAreaSno: 0,
lat: 0,
lon: 0,
createUserId: '',
createDt: ''
}]
}],
pilotList: [{
planPilotSno: 0,
planSno: 0,
cstmrSno: 0,
groupNm: '',
memberName: '',
email: '',
hpno: '',
clncd: '+81',
addr: '',
addrDtlCn: '',
zip: '',
qlfcNo: '',
carrer: '',
createUserId: '',
createDt: '',
updateUserId: '',
updateDt: ''
}],
arcrftList: [{
planArcrftSno: 0,
planSno: 0,
arcrftSno: 0,
idntfNum: '',
groupNm: '',
prdctNum: '',
arcrftTypeCd: '',
arcrftModelNm: '',
prdctCmpnNm: '',
prdctDate: '',
arcrftLngth: 0,
arcrftWdth: 0,
arcrftHght: 0,
arcrftWght: 0,
wghtTypeCd: '',
imageUrl: '',
takeoffWght: 0,
useYn: '',
cameraYn: '',
insrncYn: '',
ownerNm: '',
createUserId: '',
createDt: '',
updateUserId: '',
updateDt: ''
}]
},
pilotList: undefined, pilotList: undefined,
arcrftList: undefined arcrftList: undefined,
}; };
export const initFlightBas = {
plan: {
planSno: 0,
groupId: '',
cstmrSno: 0,
memberName: '',
email: '',
hpno: '',
clncd: '+81',
addr: '',
addrDtlCn: '',
zip: '',
schFltStDt: moment().set({'h': 0, 'm': 0, 's': 0}).format('YYYY-MM-DD HH:mm:ss'),
schFltEndDt: moment().set({'h': 0, 'm': 0, 's': 0}).format('YYYY-MM-DD HH:mm:ss'),
fltPurpose: '',
aprvlYn: '',
delYn: '',
createUserId: '',
createDt: '',
updateUserId: '',
updateDt: '',
areaList: undefined,
pilotList: undefined,
arcrftList: undefined
},
pilot: {
planPilotSno: 0,
planSno: 0,
cstmrSno: 0,
groupNm: '',
memberName: '',
email: '',
hpno: '',
clncd: '+81',
addr: '',
addrDtlCn: '',
zip: '',
qlfcNo: '',
carrer: '',
createUserId: '',
createDt: '',
updateUserId: '',
updateDt: ''
},
arcrft: {
planArcrftSno: 0,
planSno: 0,
arcrftSno: 0,
idntfNum: '',
groupNm: '',
prdctNum: '',
arcrftTypeCd: '',
arcrftModelNm: '',
prdctCmpnNm: '',
prdctDate: '',
arcrftLngth: 0,
arcrftWdth: 0,
arcrftHght: 0,
arcrftWght: 0,
wghtTypeCd: '',
imageUrl: '',
takeoffWght: 0,
useYn: '',
cameraYn: '',
insrncYn: '',
ownerNm: '',
createUserId: '',
createDt: '',
updateUserId: '',
updateDt: ''
},
area: {
planAreaSno: 0,
planSno: 0,
areaType: '',
fltMethod: '',
bufferZone: 0,
fltElev: '',
createUserId: '',
createDt: '',
updateUserId: '',
updateDt: '',
coordList: undefined
},
coord: {
planAreaCoordSno: 0,
planAreaSno: 0,
lat: 0,
lon: 0,
createUserId: '',
createDt: ''
},
initDetail: {
planSno: 0,
groupId: '',
cstmrSno: 0,
memberName: '',
email: '',
hpno: '',
clncd: '+81',
addr: '',
addrDtlCn: '',
zip: '',
schFltStDt: moment().set({'h': 0, 'm': 0, 's': 0}).format('YYYY-MM-DD HH:mm:ss'),
schFltEndDt: moment().set({'h': 0, 'm': 0, 's': 0}).format('YYYY-MM-DD HH:mm:ss'),
fltPurpose: '',
aprvlYn: '',
delYn: '',
createUserId: '',
createDt: '',
updateUserId: '',
updateDt: '',
areaList: [{
planAreaSno: 0,
planSno: 0,
areaType: '',
fltMethod: '',
bufferZone: 0,
fltElev: '',
createUserId: '',
createDt: '',
updateUserId: '',
updateDt: '',
coordList: [{
planAreaCoordSno: 0,
planAreaSno: 0,
lat: 0,
lon: 0,
createUserId: '',
createDt: ''
}]
}],
pilotList: [{
planPilotSno: 0,
planSno: 0,
cstmrSno: 0,
groupNm: '',
memberName: '',
email: '',
hpno: '',
clncd: '+81',
addr: '',
addrDtlCn: '',
zip: '',
qlfcNo: '',
carrer: '',
createUserId: '',
createDt: '',
updateUserId: '',
updateDt: ''
}],
arcrftList: [{
planArcrftSno: 0,
planSno: 0,
arcrftSno: 0,
idntfNum: '',
groupNm: '',
prdctNum: '',
arcrftTypeCd: '',
arcrftModelNm: '',
prdctCmpnNm: '',
prdctDate: '',
arcrftLngth: 0,
arcrftWdth: 0,
arcrftHght: 0,
arcrftWght: 0,
wghtTypeCd: '',
imageUrl: '',
takeoffWght: 0,
useYn: '',
cameraYn: '',
insrncYn: '',
ownerNm: '',
createUserId: '',
createDt: '',
updateUserId: '',
updateDt: ''
}]
}
}

11
src/modules/basis/flight/reducers/basisFlightReducer.ts

@ -2,7 +2,7 @@ import { createReducer } from 'typesafe-actions';
import produce from 'immer'; import produce from 'immer';
import * as Actions from '../actions/basisFlightAction'; import * as Actions from '../actions/basisFlightAction';
import { FlightState, initFlight } from '../models/basisFlightModel'; import { FlightState, initFlight, initFlightBas } from '../models/basisFlightModel';
import { any } from 'prop-types'; import { any } from 'prop-types';
@ -22,7 +22,6 @@ export const flightReducer = createReducer<FlightState, Actions.FlightAction>(in
// 목록 // 목록
.handleAction(Actions.FLIGHT_PLAN_LIST.success, (state, action) => .handleAction(Actions.FLIGHT_PLAN_LIST.success, (state, action) =>
produce(state, draft => { produce(state, draft => {
console.log('list : ', state, action);
const data = action.payload; const data = action.payload;
draft.list = data; draft.list = data;
}) })
@ -30,15 +29,18 @@ export const flightReducer = createReducer<FlightState, Actions.FlightAction>(in
// 상세 // 상세
.handleAction(Actions.FLIGHT_PLAN_DETAIL.success, (state, action) => .handleAction(Actions.FLIGHT_PLAN_DETAIL.success, (state, action) =>
produce(state, draft => { produce(state, draft => {
console.log('detail : ', state, action);
const data = action.payload; const data = action.payload;
draft.detail = data; draft.detail = data;
}) })
) )
.handleAction(Actions.FLIGHT_PLAN_DETAIL_INIT, (state, action) =>
produce(state, draft => {
draft.detail = initFlightBas.initDetail
})
)
// 조종사 조회 // 조종사 조회
.handleAction(Actions.FLIGHT_PLAN_PILOT_LIST.success, (state, action) => .handleAction(Actions.FLIGHT_PLAN_PILOT_LIST.success, (state, action) =>
produce(state, draft => { produce(state, draft => {
console.log('pilot : ', state, action);
const data = action.payload; const data = action.payload;
draft.pilotList = data; draft.pilotList = data;
}) })
@ -46,7 +48,6 @@ export const flightReducer = createReducer<FlightState, Actions.FlightAction>(in
// 기체 조회 // 기체 조회
.handleAction(Actions.FLIGHT_PLAN_ARCRFT_LIST.success, (state, action) => .handleAction(Actions.FLIGHT_PLAN_ARCRFT_LIST.success, (state, action) =>
produce(state, draft => { produce(state, draft => {
console.log('arcrft : ', state, action);
const data = action.payload; const data = action.payload;
draft.arcrftList = data; draft.arcrftList = data;
}) })

261
src/modules/basis/flight/sagas/basisFlightSaga.ts

@ -10,6 +10,12 @@ import * as MessageActions from '../../../comn/message/actions/comnMessageAction
import * as Actions from '../actions/basisFlightAction'; import * as Actions from '../actions/basisFlightAction';
import * as Apis from '../apis/basisFlightApi'; import * as Apis from '../apis/basisFlightApi';
import { FlightPlanData } from "../models/basisFlightModel"; import { FlightPlanData } from "../models/basisFlightModel";
import {
FLIGHT_PLAN_ARCRFT_LIST,
FLIGHT_PLAN_CREATE, FLIGHT_PLAN_DELETE,
FLIGHT_PLAN_DETAIL,
FLIGHT_PLAN_PILOT_LIST, FLIGHT_PLAN_UPDATE
} from "../actions/basisFlightAction";
function* listAreaSaga(action: ActionType<typeof Actions.AREA_LIST.request>) { function* listAreaSaga(action: ActionType<typeof Actions.AREA_LIST.request>) {
try { try {
@ -56,12 +62,11 @@ function* listAreaSaga(action: ActionType<typeof Actions.AREA_LIST.request>) {
// } // }
// } // }
// 비행계획서 목록
function* listPlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_LIST.request>) { function* listPlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_LIST.request>) {
try { try {
const data = action.payload; const data = action.payload;
console.log(`listPlanSaga payload `, data)
const response = yield call(Apis.flightPlanAPI.list, data); const response = yield call(Apis.flightPlanAPI.list, data);
console.log('rs', response);
if (response.errorCode) { if (response.errorCode) {
yield put( yield put(
MessageActions.IS_ERROR({ MessageActions.IS_ERROR({
@ -83,59 +88,213 @@ function* listPlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_LIST.reques
); );
} }
} }
// 비행계획서 상세
function* detailPlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_DETAIL.request>) {
try {
const data = action.payload;
const response = yield call(Apis.flightPlanAPI.detail, data);
if (response.errorCode) {
yield put(
MessageActions.IS_ERROR({
errorCode: response.errorCode,
errorMessage: response.errorMessage,
isHistoryBack: false,
isRefresh: false
})
);
return;
}
// function* createFlightPlanData( yield put(
// action: ActionType<typeof Actions.FLIGHT_PLAN_CREATE.request> Actions.FLIGHT_PLAN_DETAIL.success(response.data)
// ) { );
// try { } catch (error: any) {
// const detail = action.payload; yield put(
// Actions.FLIGHT_PLAN_DETAIL.failure(error)
// console.log('detail>>>:', detail); );
// const res = yield call(Apis.flightPlanAPI.create, detail); }
// console.log(res); }
// const {data} = res; // 비행계획서 등록
// console.log('data:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>', data.result); function* createPlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_CREATE.request>) {
// if (data.result) { try {
// yield put( const detail = action.payload;
// MessageActions.IS_MESSAGE({
// messageCode: SAVE_MESSAGE.code, const res = yield call(Apis.flightPlanAPI.create, detail);
// message: SAVE_MESSAGE.message,
// isHistoryBack: false, const { data } = res;
// isRefresh: false
// }) if (data.result) {
// ); yield put(
// yield put(Actions.FLIGHT_PLAN_CREATE.success(data)); MessageActions.IS_MESSAGE({
// } else { messageCode: SAVE_MESSAGE.code,
// console.log('errorCode >>> ', data.errorCode); message: SAVE_MESSAGE.message,
// if (data.errorCode === 'DT002') { isHistoryBack: true,
// yield put( isRefresh: false
// MessageActions.IS_ERROR({ })
// errorCode: DUPLATE_MESSAGE.code, );
// errorMessage: '식별번호가 ' + DUPLATE_MESSAGE.message, } else {
// isHistoryBack: false, if (data.errorCode === 'DT002') {
// isRefresh: false yield put(
// }) MessageActions.IS_ERROR({
// ); errorCode: DUPLATE_MESSAGE.code,
// } else { errorMessage: '제작번호 ' + DUPLATE_MESSAGE.message,
// throw Error; isHistoryBack: false,
// } isRefresh: false
// } })
// } catch (error) { );
// yield put( } else {
// MessageActions.IS_ERROR({ throw Error;
// errorCode: ERROR_MESSAGE.code, }
// errorMessage: ERROR_MESSAGE.message, }
// isHistoryBack: false, } catch (error) {
// isRefresh: false yield put(
// }) MessageActions.IS_ERROR({
// ); errorCode: ERROR_MESSAGE.code,
// // yield put(Actions.GROUP_CREATE.failure(error)); errorMessage: ERROR_MESSAGE.message,
// } isHistoryBack: false,
// } isRefresh: false
})
);
// yield put(Actions.FLIGHT_PLAN_CREATE.failure(error));
}
}
// 비행계획서 수정
function* updatePlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_UPDATE.request>) {
try {
const detail = action.payload;
const res = yield call(Apis.flightPlanAPI.update, detail);
const { data } = res;
if (data.result) {
yield put(
MessageActions.IS_MESSAGE({
messageCode: SAVE_MESSAGE.code,
message: SAVE_MESSAGE.message,
isHistoryBack: true,
isRefresh: false
})
);
} else {
if (data.errorCode === 'DT002') {
yield put(
MessageActions.IS_ERROR({
errorCode: DUPLATE_MESSAGE.code,
errorMessage: '제작번호 ' + DUPLATE_MESSAGE.message,
isHistoryBack: false,
isRefresh: false
})
);
} else {
throw Error;
}
}
} catch (error) {
yield put(
MessageActions.IS_ERROR({
errorCode: ERROR_MESSAGE.code,
errorMessage: ERROR_MESSAGE.message,
isHistoryBack: false,
isRefresh: false
})
);
// yield put(Actions.FLIGHT_PLAN_UPDATE.failure(error));
}
}
// 비행계획서 삭제
function* deletePlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_DELETE.request>) {
try {
const id = action.payload;
const res = yield call(Apis.flightPlanAPI.delete, id);
const { data } = res;
if (data.result) {
yield put(
MessageActions.IS_MESSAGE({
messageCode: DELETE_MESSAGE.code,
message: DELETE_MESSAGE.message,
isHistoryBack: true,
isRefresh: false
})
);
} else {
throw Error;
}
} catch (error) {
yield put(
MessageActions.IS_ERROR({
errorCode: ERROR_MESSAGE.code,
errorMessage: ERROR_MESSAGE.message,
isHistoryBack: false,
isRefresh: false
})
);
// yield put(Actions.FLIGHT_PLAN_DELETE.failure(error));
}
}
// 조종사 목록
function* listPilotSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_PILOT_LIST.request>) {
try {
const data = action.payload;
const response = yield call(Apis.flightPlanAPI.listPilot, data);
if (response.errorCode) {
yield put(
MessageActions.IS_ERROR({
errorCode: response.errorCode,
errorMessage: response.errorMessage,
isHistoryBack: false,
isRefresh: false
})
);
return;
}
yield put(
Actions.FLIGHT_PLAN_PILOT_LIST.success(response.data)
);
} catch (error: any) {
yield put(
Actions.FLIGHT_PLAN_PILOT_LIST.failure(error)
);
}
}
// 기체 목록
function* listArcrftSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_ARCRFT_LIST.request>) {
try {
const data = action.payload;
const response = yield call(Apis.flightPlanAPI.listArcrft, data);
if (response.errorCode) {
yield put(
MessageActions.IS_ERROR({
errorCode: response.errorCode,
errorMessage: response.errorMessage,
isHistoryBack: false,
isRefresh: false
})
);
return;
}
yield put(
Actions.FLIGHT_PLAN_ARCRFT_LIST.success(response.data)
);
} catch (error: any) {
yield put(
Actions.FLIGHT_PLAN_ARCRFT_LIST.failure(error)
);
}
}
export function* flightSaga() { export function* flightSaga() {
yield takeEvery(Actions.AREA_LIST.request, listAreaSaga); yield takeEvery(Actions.AREA_LIST.request, listAreaSaga);
// yield takeEvery(Actions.FLIGHT_PLAN_AREA.request, createFlightPlanArea); // yield takeEvery(Actions.FLIGHT_PLAN_AREA.request, createFlightPlanArea);
yield takeEvery(Actions.FLIGHT_PLAN_LIST.request, listPlanSaga) yield takeEvery(Actions.FLIGHT_PLAN_LIST.request, listPlanSaga)
// yield takeEvery(Actions.FLIGHT_PLAN_CREATE.request, createFlightPlanData) yield takeEvery(Actions.FLIGHT_PLAN_DETAIL.request, detailPlanSaga)
yield takeEvery(Actions.FLIGHT_PLAN_CREATE.request, createPlanSaga)
yield takeEvery(Actions.FLIGHT_PLAN_UPDATE.request, updatePlanSaga)
yield takeEvery(Actions.FLIGHT_PLAN_DELETE.request, deletePlanSaga)
yield takeEvery(Actions.FLIGHT_PLAN_PILOT_LIST.request, listPilotSaga)
yield takeEvery(Actions.FLIGHT_PLAN_ARCRFT_LIST.request, listArcrftSaga)
} }

2
src/router/routes/RouteBasis.js

@ -48,7 +48,7 @@ const RouteBasis = [
component: lazy(() => import('../../views/basis/flight/plan/FlightPlanDetail')) component: lazy(() => import('../../views/basis/flight/plan/FlightPlanDetail'))
}, },
{ {
path: '/basis/flight/plan/detail/:id', path: '/basis/flight/plan/detail/:planSno',
component: lazy(() => import('../../views/basis/flight/plan/FlightPlanDetail')) component: lazy(() => import('../../views/basis/flight/plan/FlightPlanDetail'))
}, },
]; ];

Loading…
Cancel
Save