Browse Source

비행계획서 목록 조회

remotes/origin/feature/flight-plan
지대한 2 years ago
parent
commit
1b453cb829
  1. 238
      src/components/basis/flight/plan/FlightPlanForm.js
  2. 129
      src/components/basis/flight/plan/FlightPlanGrid.js
  3. 327
      src/components/basis/flight/plan/FlightPlanSearch.js
  4. 36
      src/containers/basis/flight/plan/FlightPlanAreaContainer.js
  5. 62
      src/containers/basis/flight/plan/FlightPlanContainer.js
  6. 183
      src/containers/basis/flight/plan/FlightPlanDetailContainer.js
  7. 124
      src/modules/basis/flight/actions/basisFlightAction.ts
  8. 65
      src/modules/basis/flight/apis/basisFlightApi.ts
  9. 139
      src/modules/basis/flight/models/basisFlightModel.ts
  10. 56
      src/modules/basis/flight/reducers/basisFlightReducer.ts
  11. 196
      src/modules/basis/flight/sagas/basisFlightSaga.ts

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

@ -2,12 +2,12 @@ import React from 'react';
import {
Card,
CardBody,
Col,
Col,
FormGroup,
Input,
Label,
Row,
Button
Row,
Button
} from 'reactstrap';
import Flatpickr from 'react-flatpickr';
import '@styles/react/libs/flatpickr/flatpickr.scss';
@ -20,7 +20,7 @@ const FlightPlanForm = (props) => {
<Row>
<Col sm='12'>
<Card>
<CardBody className='pt-2 card-body-tab-cont'>
<CardBody className='pt-2 card-body-tab-cont'>
<Row>
<Col>
<Card>
@ -43,7 +43,7 @@ const FlightPlanForm = (props) => {
<h4 className='ti'>신청인 정보</h4>
</div>
<div className='search-info-box'>
<Row>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
@ -53,7 +53,7 @@ const FlightPlanForm = (props) => {
id='memberName'
name='memberName'
onChange={props.onChange}
size='sm'
size='sm'
placeholder=''
/>
</FormGroup>
@ -67,28 +67,26 @@ const FlightPlanForm = (props) => {
<Input
type='text'
id='clncd'
name='clncd'
name='clncd'
size='sm'
placeholder='+82'
value='+82'
readOnly
value='+82'
readOnly
/>
</div>
<div className='m_ft_box'>
<Input
type='text'
id='hpno'
name='hpno'
name='hpno'
size='sm'
onChange={props.onChange}
placeholder='010-0000-0000'
/>
</div>
</FormGroup>
</Col>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'><span className='necessary'>*</span></Label>
@ -104,8 +102,8 @@ const FlightPlanForm = (props) => {
</FormGroup>
</Col>
</Row>
</div>
</div>
{/* <div className='search-info-box'>
<Row>
@ -116,7 +114,7 @@ const FlightPlanForm = (props) => {
type='text'
id='applicantAddress'
name='applicantAddress'
size='sm'
size='sm'
// innerRef={props.data}
placeholder=''
/>
@ -129,12 +127,12 @@ const FlightPlanForm = (props) => {
type='text'
id='applicantAddress'
name='applicantAddress'
size='sm'
size='sm'
// innerRef={props.data}
placeholder=''
/>
</FormGroup>
</Col>
</Col>
</Row>
</div> */}
</dt>
@ -146,41 +144,57 @@ const FlightPlanForm = (props) => {
<div className='search-info-box'>
<Row>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Flatpickr size='sm'
className='form-control calendar-flat'
<Flatpickr size='sm'
className='form-control calendar-flat'
type='text'
id='schFltStDt'
name='schFltStDt'
data-enable-time
value={props.schFltStDt}
onChange={val =>
props.handlerInput(val)
}
onChange={(val) => {
console.log(val)
const data = {target: {}}
data.target.name = 'schFltStDt';
data.target.value = val && val[0] && moment(val[0]).format('YYYY-MM-DD HH:mm:ss');
props.onChange(data)
}}
// onChange={val =>
// props.handlerInput(val)
// }
// innerRef={props.data}
placeholder='비행 시작일자 선택(클릭)'/>
placeholder='비행 시작일자 선택(클릭)'/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Flatpickr size='sm'
className='form-control calendar-flat'
<Flatpickr size='sm'
className='form-control calendar-flat'
type='text'
id='schFltEndDt'
name='schFltEndDt'
data-enable-time
value={props.schFltEndDt}
onChange={val =>
props.handlerInput(val)
}
onChange={(val) => {
console.log(val)
const data = {target: {}}
data.target.name = 'schFltEndDt';
data.target.value = val && val[0] && moment(val[0]).format('YYYY-MM-DD HH:mm:ss');
props.onChange(data)
}}
// onChange={val =>
// props.handlerInput(val)
// }
// innerRef={props.data}
placeholder='비행 종료일자 선택(클릭)'/>
placeholder='비행 종료일자 선택(클릭)'/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
@ -194,7 +208,7 @@ const FlightPlanForm = (props) => {
id='fltPurpose'
size='sm'
onChange={props.onChange}
// innerRef={props.data}
// innerRef={props.data}
// className={classnames({
// 'is-invalid': props.errors.arcrftTypeCd
// })}
@ -227,7 +241,7 @@ const FlightPlanForm = (props) => {
</Row>
</div>
<div className='search-info-box'>
{/* <Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>
@ -238,7 +252,7 @@ const FlightPlanForm = (props) => {
name='arcrftTypeCd'
id='arcrftTypeCd'
size='sm'
innerRef={props.data}
innerRef={props.data}
className={classnames({
'is-invalid': props.errors.arcrftTypeCd
})}
@ -262,7 +276,7 @@ const FlightPlanForm = (props) => {
</Input>
</FormGroup>
</Col> */}
{/* <Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>
@ -286,13 +300,13 @@ const FlightPlanForm = (props) => {
)}
</FormGroup>
</Col> */}
</div>
</div>
</dt>
<dt>
<div className='search-info-ti d-flex justify-content-between'>
<h4 className='ti'>비행 구역 정보</h4>
<Button.Ripple
<Button.Ripple
color="primary"
onClick={props.openModal}
>
@ -309,11 +323,11 @@ const FlightPlanForm = (props) => {
<Input
type='text'
id='lonlat'
name='lonlat'
name='lonlat'
size='sm'
placeholder=''
onChange={props.onChange}
onChange={props.onChange}
/>
</FormGroup>
</Col>
@ -326,26 +340,26 @@ const FlightPlanForm = (props) => {
<Input
type='text'
id='fltElev'
name='fltElev'
name='fltElev'
size='sm'
placeholder='반경'
onChange={props.onChange}
placeholder='반경'
onChange={props.onChange}
/>
</div>
<div className='m_ft_box'>
<Input
type='text'
id='fltHight'
name='fltHight'
name='fltHight'
size='sm'
placeholder='고도'
onChange={props.onChange}
onChange={props.onChange}
/>
</div>
</FormGroup>
</Col>
</Col>
</Row>
</div>
<div className='search-info-box'>
@ -358,14 +372,14 @@ const FlightPlanForm = (props) => {
<Input
type='text'
id='lonlat2'
name='lonlat2'
name='lonlat2'
size='sm'
placeholder=''
placeholder=''
onChange={props.onChange}
/>
</FormGroup>
</Col>
</Col>
<Col className='list-input' lg={5} md={6} sm={12}>
<FormGroup>
<Label for='test'>
@ -374,14 +388,14 @@ const FlightPlanForm = (props) => {
<Input
type='text'
id='fltMethod'
name='fltMethod'
name='fltMethod'
size='sm'
placeholder=''
placeholder=''
onChange={props.onChange}
/>
</FormGroup>
</Col>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>
@ -390,26 +404,26 @@ const FlightPlanForm = (props) => {
<Input
type='text'
id='lonlat3'
name='lonlat3'
name='lonlat3'
size='sm'
placeholder=''
onChange={props.onChange}
onChange={props.onChange}
/>
</FormGroup>
</Col>
</Col>
</Row>
</div>
</dt>
<dt>
<div className='search-info-ti d-flex justify-content-between'>
<h4 className='ti'>조종사 정보</h4>
<Button.Ripple
<Button.Ripple
color="primary"
onClick={props.openModal}
>
조종사 조회
조종사 조회
</Button.Ripple>
</div>
<div className='search-info-box'>
@ -422,11 +436,11 @@ const FlightPlanForm = (props) => {
<Input
type='text'
id='groupNm'
name='groupNm'
name='groupNm'
size='sm'
placeholder=''
onChange={props.onChange}
placeholder=''
onChange={props.onChange}
/>
</FormGroup>
</Col>
@ -438,11 +452,11 @@ const FlightPlanForm = (props) => {
<Input
type='text'
id='pilotName'
name='pilotName'
name='pilotName'
size='sm'
placeholder=''
onChange={props.onChange}
placeholder=''
onChange={props.onChange}
/>
</FormGroup>
</Col>
@ -459,27 +473,27 @@ const FlightPlanForm = (props) => {
<Input
type='text'
id='clncd'
name='clncd'
name='clncd'
size='sm'
placeholder='+82'
onChange={props.onChange}
placeholder='+82'
onChange={props.onChange}
/>
</div>
<div className='m_ft_box'>
<Input
type='text'
id='pilotHpno'
name='pilotHpno'
name='pilotHpno'
size='sm'
placeholder='010-0000-0000'
onChange={props.onChange}
/>
</div>
</FormGroup>
</Col>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>
@ -488,25 +502,25 @@ const FlightPlanForm = (props) => {
<Input
type='text'
id='pilotEmail'
name='pilotEmail'
name='pilotEmail'
size='sm'
placeholder=''
onChange={props.onChange}
placeholder=''
onChange={props.onChange}
/>
</FormGroup>
</Col>
</Col>
</Row>
</div>
</dt>
<dt>
<div className='search-info-ti d-flex justify-content-between'>
<h4 className='ti'>기체 정보</h4>
<Button.Ripple
<Button.Ripple
color="primary"
onClick={props.openModal}
>
 기체 조회 
 기체 조회 
</Button.Ripple>
</div>
<div className='search-info-box'>
@ -519,11 +533,11 @@ const FlightPlanForm = (props) => {
<Input
type='text'
id='aGroupNm'
name='aGroupNm'
name='aGroupNm'
size='sm'
placeholder=''
onChange={props.onChange}
placeholder=''
onChange={props.onChange}
/>
</FormGroup>
</Col>
@ -535,11 +549,11 @@ const FlightPlanForm = (props) => {
<Input
type='text'
id='arcrftModelNm'
name='arcrftModelNm'
name='arcrftModelNm'
size='sm'
placeholder=''
placeholder=''
onChange={props.onChange}
/>
</FormGroup>
</Col>
@ -555,14 +569,14 @@ const FlightPlanForm = (props) => {
<Input
type='text'
id='arcrftTypeCd'
name='arcrftTypeCd'
name='arcrftTypeCd'
size='sm'
placeholder=''
placeholder=''
onChange={props.onChange}
/>
</FormGroup>
</Col>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>
@ -571,18 +585,18 @@ const FlightPlanForm = (props) => {
<Input
type='text'
id='ownerNm'
name='ownerNm'
name='ownerNm'
size='sm'
placeholder=''
placeholder=''
onChange={props.onChange}
/>
</FormGroup>
</Col>
</Col>
</Row>
</div>
</dt>
<div className='d-flex align-items-center'>
<Button.Ripple
className='mr-1'
@ -592,20 +606,20 @@ const FlightPlanForm = (props) => {
>
저장
</Button.Ripple>
<Button.Ripple
color='danger'
<Button.Ripple
color='danger'
size='sm'
// onClick={handlerDelete}
>
삭제
</Button.Ripple>
</div>
</dl>
</div>
</div>
</CardBody>
</Card>
</Col>
</Row>
</CardBody>
@ -615,4 +629,4 @@ const FlightPlanForm = (props) => {
)
}
export default FlightPlanForm;
export default FlightPlanForm;

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

@ -1,66 +1,71 @@
import React from 'react';
import {
Row,
Col,
Table,
Badge,
UncontrolledDropdown,
DropdownMenu,
DropdownItem,
DropdownToggle,
Card,
CardHeader,
CardBody,
CardTitle,
CardSubtitle,
ButtonGroup,
Button,
Input,
CustomInput,
FormGroup
} from 'reactstrap';
import { GridDatabase } from '../../../crud/grid/GridDatatable';
import {Button, Card, Col, Row} from 'reactstrap';
import {GridDatabase} from '../../../crud/grid/GridDatatable';
import {Redirect} from 'react-router-dom';
const FlightPlanGrid = (props) => {
return (
<div className='pal-card-box'>
<Row>
<Col>
<div className='cont-ti d-flex justify-content-between align-items-sm-center align-items-start flex-sm-row'>
<div>
{/* <h4>{"비행 계획"} 목록</h4> */}
<h4>{"비행계획서 신청"} 목록</h4>
<span className='search-case'>검색결과 0</span>
</div>
<div className='d-flex align-items-center'>
<Button.Ripple
color='primary'
size='sm'
onClick={props.moveFlightPlan}
>
{/* 계획서 생성 */}
비행계획서 신청
</Button.Ripple>
</div>
</div>
<div className='invoice-list-wrapper'>
<Card>
<div className='invoice-list-dataTable'>
<GridDatabase
title={'비행이력'}
// data={props.data}
count={0}
// columns={props.columns}
// pagination={props.pagination}
/>
{/* 검색된 데이터가 없습니다. */}
</div>
</Card>
</div>
</Col>
</Row>
</div>
)
const FlightPlanGrid = ({movePage, planListData, handleMoveDetail}) => {
const columns = [
{id: 'planSno', name: '번호', cell: row => (<div>{row.planSno}</div>)},
{id: 'fltPurpose', name: '비행목적', cell: row => (<div>{row.fltPurpose}</div>)},
{
id: 'fltMethod', name: '비행방식', cell: row => {
const displayName = row.areaList && row.areaList.length > 0 && row.areaList[0].fltMethod || '-';
return <div>{displayName}</div>
}
},
{id: 'schFltStDt', name: '출발일', cell: row => (<div>{row.schFltStDt}</div>)},
{id: 'aprvlYn', name: '승인여부', cell: row => (<div>{row.aprvlYn}</div>)},
{
id: 'moveDetail', name: '상세보기', cell: row => {
return <Button.Ripple color='primary' size='sm' onClick={() => {
handleMoveDetail(row.planSno)}
}>상세</Button.Ripple>;
}
}
];
console.log(planListData, columns)
return (
<div className='pal-card-box'>
<Row>
<Col>
<div
className='cont-ti d-flex justify-content-between align-items-sm-center align-items-start flex-sm-row'>
<div>
{/* <h4>{"비행 계획"} 목록</h4> */}
<h4>{"비행계획서 신청"} 목록</h4>
<span className='search-case'>검색결과 0</span>
</div>
<div className='d-flex align-items-center'>
<Button.Ripple
color='primary'
size='sm'
onClick={movePage}
>
{/* 계획서 생성 */}
비행계획서 신청
</Button.Ripple>
</div>
</div>
<div className='invoice-list-wrapper'>
<Card>
<div className='invoice-list-dataTable'>
<GridDatabase
title={'비행이력'}
data={planListData}
// count={0}
columns={columns}
// pagination={props.pagination}
/>
{/* 검색된 데이터가 없습니다. */}
</div>
</Card>
</div>
</Col>
</Row>
</div>
)
}
export default FlightPlanGrid;
export default FlightPlanGrid;

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

@ -1,174 +1,173 @@
import React, { useEffect, useState } from 'react';
import {
Row,
Col,
Table,
Badge,
UncontrolledDropdown,
DropdownMenu,
DropdownItem,
DropdownToggle,
Card,
CardHeader,
CardBody,
CardTitle,
CardSubtitle,
ButtonGroup,
Button,
Input,
CustomInput,
FormGroup
} from 'reactstrap';
import { Calendar, Search } from 'react-feather';
import React, {useState} from 'react';
import {Button, Card, CardBody, Col, CustomInput, Row} from 'reactstrap';
import {Search} from 'react-feather';
import Flatpickr from 'react-flatpickr';
import moment from 'moment';
const FlightPlanSearch = (props) => {
const FlightPlanSearch = ({searchData, onChangeSearchData}) => {
const [isCheck, setIsCheck] = useState({
all: true,
yes: false,
no: false
});
useEffect(() => {
let aprvYn = '';
if (!isCheck.all) {
if (isCheck.yes) {
aprvYn = 'Y';
} else if (isCheck.no) {
aprvYn = 'N';
} else {
aprvYn = '-';
}
const {schFltStDt, schFltEndDt, aprvlYn} = searchData;
const initCheckState = {
'all': aprvlYn == 'A',
'yes': (aprvlYn == 'Y' || aprvlYn == 'A'),
'no': (aprvlYn == 'N' || aprvlYn == 'A'),
}
// props.setParams({
// ...props.params,
// aprvYn: aprvYn
// });
}, [isCheck]);
return (
<div className='pal-card-box'>
<Row>
<Col>
<div className='cont-ti d-flex justify-content-between align-items-sm-center align-items-start flex-sm-row'>
<div>
<h4>검색조건</h4>
</div>
<div className='d-flex align-items-center'>
<Button.Ripple
color='primary'
size='sm'
onClick={e => props.handlerSearch()}
>
<Search size={16} />
검색
</Button.Ripple>
</div>
</div>
<Card>
<CardBody className='pal-card-body'>
<div className='search-cont'>
<dl>
<dt>
<div className='search-box'>
<div className='search-list-ti'>신청일</div>
<div className='search-list'>
<div className='search-list-cont'>
<Row>
<Col className='list-input' xl='4' md='6' sm='12'>
<div className='d-flex align-items-center calendar-flat'>
<Flatpickr
id='searchDate'
value={[
props.params.stDate,
props.params.endDate
]}
options={{
mode: 'range',
defaultDate: [
props.params.stDate,
props.params.endDate
]
}}
onChange={val =>
props.handlerInput('searchDate', val)
}
onKeyPress={props.onKeyPress}
className='form-control flat-picker bg-transparent border-0 shadow-none'
/>
</div>
</Col>
</Row>
const [checkState, setCheckState] = useState(initCheckState);
const handleChangeInput = (dates, value, config) => {
if (dates.length === 2) {
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');
onChangeSearchData({schFltStDt, schFltEndDt})
}
}
const handleChangeCheckbox = (e) => {
const {name, value, checked} = e.target;
let val;
switch (value) {
case 'A':
val = checked ? 'A' : '';
onChangeSearchData({[name]: val})
setCheckState({
'all': checked,
'yes': checked,
'no': checked
})
break;
case 'Y':
if (checked && checkState.no) val = 'A'
else if (checked && !checkState.no) val = 'Y'
else if (!checked && checkState.no) val = 'N'
else if (!checked && !checkState.no) val = ''
onChangeSearchData({[name]: val})
setCheckState(prevState => ({
'all': prevState.no && checked,
'yes': checked,
'no': prevState.no
}))
break;
case 'N':
if (checked && checkState.yes) val = 'A'
else if (checked && !checkState.yes) val = 'N'
else if (!checked && checkState.yes) val = 'Y'
else if (!checked && !checkState.yes) val = ''
onChangeSearchData({[name]: val})
setCheckState(prevState => ({
'all': prevState.yes && checked,
'yes': prevState.yes,
'no': checked
}))
break;
default:
break;
}
}
return (
<div className='pal-card-box'>
<Row>
<Col>
<div
className='cont-ti d-flex justify-content-between align-items-sm-center align-items-start flex-sm-row'>
<div>
<h4>검색조건</h4>
</div>
</div>
</div>
</dt>
<dt>
<div className='search-box'>
<div className='search-list-ti'>승인여부</div>
<div className='search-list'>
{/* <div className="search-list-cont">
<Input size='sm'/>
</div> */}
<div className='search-list-cont'>
<CustomInput
inline
type='checkbox'
id='exampleCustomCheckbox'
label='전체'
checked={isCheck.all}
onClick={() =>
setIsCheckBox({
all: !isCheck.all,
yes: !isCheck.all,
no: !isCheck.all
})
}
/>
<CustomInput
inline
type='checkbox'
id='exampleCustomCheckbox2'
label='승인'
checked={isCheck.yes || isCheck.all}
onClick={() =>
setIsCheckBox({
all: false,
yes: !isCheck.yes
})
}
/>
<CustomInput
inline
type='checkbox'
id='exampleCustomCheckbox3'
label='미승인'
checked={isCheck.no || isCheck.all}
onClick={() =>
setIsCheckBox({
all: false,
no: !isCheck.no
})
}
/>
<div className='d-flex align-items-center'>
<Button.Ripple
color='primary'
size='sm'
onClick={e => {
}}
>
<Search size={16}/>
검색
</Button.Ripple>
</div>
</div>
</div>
</dt>
</dl>
</div>
</CardBody>
</Card>
</Col>
</Row>
</div>
)
<Card>
<CardBody className='pal-card-body'>
<div className='search-cont'>
<dl>
<dt>
<div className='search-box'>
<div className='search-list-ti'>신청일</div>
<div className='search-list'>
<div className='search-list-cont'>
<Row>
<Col className='list-input' xl='4' md='6' sm='12'>
<div className='d-flex align-items-center calendar-flat'>
<Flatpickr
id='searchDate'
value={[
schFltStDt,
schFltEndDt
]}
options={{
mode: 'range',
// defaultDate: [
// props.params.stDate,
// props.params.endDate
// ]
}}
onChange={handleChangeInput}
className='form-control flat-picker bg-transparent border-0 shadow-none'
/>
</div>
</Col>
</Row>
</div>
</div>
</div>
</dt>
<dt>
<div className='search-box'>
<div className='search-list-ti'>승인여부</div>
<div className='search-list'>
<div className='search-list-cont'>
<CustomInput
inline
type='checkbox'
id='exampleCustomCheckbox'
label='전체'
name="aprvlYn"
value="A"
// checked={true}
checked={checkState.all}
onChange={handleChangeCheckbox}
/>
<CustomInput
inline
type='checkbox'
id='exampleCustomCheckbox2'
label='승인'
name="aprvlYn"
value="Y"
checked={checkState.yes}
onChange={handleChangeCheckbox}
/>
<CustomInput
inline
type='checkbox'
id='exampleCustomCheckbox3'
label='미승인'
name="aprvlYn"
value="N"
checked={checkState.no}
onChange={handleChangeCheckbox}
/>
</div>
</div>
</div>
</dt>
</dl>
</div>
</CardBody>
</Card>
</Col>
</Row>
</div>
)
}
export default FlightPlanSearch;
export default FlightPlanSearch;

36
src/containers/basis/flight/plan/FlightPlanAreaContainer.js

@ -12,15 +12,15 @@ import { yupResolver } from '@hookform/resolvers/yup';
const FlightPlanAreaContainer = (props) => {
const dispatch = useDispatch();
const history = useHistory();
const { areaList } = useSelector(state => state.flightState);
const [airArea, setAirArea] = useState(null);
const validSchema = yup.object().shape({
const validSchema = yup.object().shape({
});
const { register, getValues, setValue, errors, handleSubmit } = useForm({
defaultValues: {
defaultValues: {
coodinates: [],
radius: '',
altitude_m: '',
@ -34,42 +34,42 @@ const FlightPlanAreaContainer = (props) => {
dispatch(Actions.AREA_LIST.request());
}
const createAirArea = async data => {
dispatch(Actions.FLIGHT_PLAN_AREA.request(data));
props.setModal({ ...props.modal, isOpen: !props.modal.isOpen });
props.setOnSubmit(false);
}
// const createAirArea = async data => {
// dispatch(Actions.FLIGHT_AREA.request(data));
//
// props.setModal({ ...props.modal, isOpen: !props.modal.isOpen });
// props.setOnSubmit(false);
// }
useEffect(() => {
getAirAreaList();
}, []);
useEffect(() => {
useEffect(() => {
setAirArea(areaList);
}, [areaList])
}, [areaList])
return (
return (
<Row>
<Col md={6} lg={6}>
{airArea != null ? (
<FlightPlanAreaMap
airArea={airArea}
/>
) : null}
) : null}
</Col>
<Col md={6} lg={6}>
<Col md={6} lg={6}>
<FlightPlanAreaForm
modal={props.modal}
setModal={props.setModal}
data={register}
errors={errors}
submit={handleSubmit(createAirArea)}
/>
/>
</Col>
</Row>
</Row>
)
}
export default FlightPlanAreaContainer;
export default FlightPlanAreaContainer;

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

@ -1,38 +1,66 @@
import React, { useState } from 'react';
import React, {useEffect, useState} from 'react';
import moment from 'moment';
import { Link, useHistory } from 'react-router-dom';
import {Link, Redirect, useHistory} from 'react-router-dom';
import FlightPlanGrid from '../../../../components/basis/flight/plan/FlightPlanGrid';
import { CustomMainLayout } from '../../../../components/layout/CustomMainLayout';
import {CustomMainLayout} from '../../../../components/layout/CustomMainLayout';
import FlightPlanSearch from '../../../../components/basis/flight/plan/FlightPlanSearch';
import {useDispatch, useSelector} from 'react-redux';
import * as FlightAction from '../../../../modules/basis/flight/actions/basisFlightAction';
import {FlightPlanListRqData} from '../../../../modules/basis/flight/models/basisFlightModel';
const FlightPlanContainer = () => {
const initSearchData = {
schFltStDt: moment().set({'h': 0, 'm': 0, 's': 0}).format('YYYY-MM-DD HH:mm:ss'),
schFltEndDt: moment().set({'h': 23, 'm': 59, 's': 59}).format('YYYY-MM-DD HH:mm:ss'),
aprvlYn: 'N',
}
const columns = [{}]
const FlightPlanContainer = () => {
const dispatch = useDispatch();
const history = useHistory();
const [searchData, setSerchData] = useState(initSearchData);
const planListData = useSelector(state => state.flightState.list);
const moveFlightPlan = () => {
const moveFlightPlanDetailPage = () => {
history.push('/basis/flight/plan/create');
};
const [times, setTimes] = useState({
stDate: moment().subtract(1, 'day').format('YYYY-MM-DD'),
endDate: moment().subtract(-1, 'day').format('YYYY-MM-DD'),
search1: ''
})
useEffect(() => {
dispatch(FlightAction.FLIGHT_PLAN_LIST.request(searchData))
}, [])
// console.log(history, 'history')
console.log(searchData)
const handleChangeSearchData = (values) => {
setSerchData(prevState => ({
...prevState,
...values
}))
}
// 비행계획서 저장
const handleClickCreate = () => {
};
const handleMoveDetail = (id) => {
history.push(`/basis/flight/plan/detail/${id}`)
}
return (
// <CustomMainLayout title={"비행 계획 관리"}>
<CustomMainLayout title={"비행계획서 신청"}>
<FlightPlanSearch
params={times}
/>
<FlightPlanGrid
moveFlightPlan={moveFlightPlan}
/>
<FlightPlanSearch
searchData={searchData}
onChangeSearchData={handleChangeSearchData}
/>
<FlightPlanGrid
movePage={moveFlightPlanDetailPage}
planListData={planListData}
columns={columns}
handleMoveDetail={handleMoveDetail}
/>
</CustomMainLayout>
)
}
export default FlightPlanContainer;
export default FlightPlanContainer;

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

@ -1,137 +1,150 @@
import React, {useEffect, useState} from 'react';
import FlightPlanForm from '../../../../components/basis/flight/plan/FlightPlanForm';
import { CustomDetailLayout } from '../../../../components/layout/CustomDetailLayout';
import { FlightPlanAreaModal } from '../../../../components/basis/flight/plan/FlightPlanAreaModal';
import {CustomDetailLayout} from '../../../../components/layout/CustomDetailLayout';
import {FlightPlanAreaModal} from '../../../../components/basis/flight/plan/FlightPlanAreaModal';
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 {yupResolver} from '@hookform/resolvers/yup';
import * as Actions from '../../../../modules/basis/flight/actions/basisFlightAction';
import { useForm } from 'react-hook-form';
import {useForm} from 'react-hook-form';
import moment from 'moment';
import { Save } from 'react-feather';
import {Save} from 'react-feather';
const initFlightPlanData = {
id: '',
memberName: '',
clncd: '+82',
hpno: '',
email: '',
lonlat: '',
lonlat2: '',
lonlat3: '',
fltElev: '',
fltHight: '',
fltMethod: '',
groupNm: '',
pilotName: '',
pilotHpno: '',
pilotEmail: '',
aGroupNm: '',
arcrftModelNm: '',
arcrftTypeCd: '',
ownerNm: '',
createUserId: '',
updateUserId: ''
}
const FlightPlanDetailContainer = props => {
const dispatch = useDispatch();
const history = useHistory();
const [pageType, setPageType] = useState('create');
const { flightPlanArea } = useSelector(state => state.flightState);
const [areaInfo, setAreaInfo] = useState();
const {flightPlanArea} = useSelector(state => state.flightState);
const [areaInfo, setAreaInfo] = useState();
const [modal, setModal] = useState({
isOpen: false,
title: '',
title: '',
});
const { listFlightP, flightCount, isRefreshFlight } = useSelector(
const {listFlightP, flightCount, isRefreshFlight} = useSelector(
state => state.flightState
);
const [flightPlanData, setFlightPlanData] = useState({
id:'',
memberName:'',
clncd: '+82',
hpno:'',
email:'',
lonlat:'',
lonlat2:'',
lonlat3:'',
fltElev:'',
fltHight:'',
fltMethod:'',
groupNm:'',
pilotName:'',
pilotHpno:'',
pilotEmail:'',
aGroupNm:'',
arcrftModelNm:'',
arcrftTypeCd:'',
ownerNm:'',
createUserId:'',
updateUserId:''
});
);
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(() => {
console.log('isRefreshFlight>>>>', isRefreshFlight);
if (isRefreshFlight) {
console.log(isRefreshFlight);
handlerSearch();
console.log(isRefreshFlight);
handlerSearch();
}
}, [isRefreshFlight]);
}, [isRefreshFlight]);
const [flightPlanDataList, setFlightPlanDataList] = useState([]);
/* Form Validation Checking */
const validSchema = yup.object().shape({
});
const validSchema = yup.object().shape({});
const {} = useForm({
defaultValues: {
defaultValues: {
coodinates: [],
radius: '',
altitude_m: '',
altitude_ft: '',
},
resolver: yupResolver(validSchema)
resolver: yupResolver(validSchema)
})
const saveFlightPlanArea = () => {
console.log('비행 구역 설정 저장');
}
useEffect(() => {
if (props.id) {
handlerSearch();
setPageType('update');
handlerSearch();
setPageType('update');
}
// console.log(selectData);
}, []);
useEffect(() => {
}, []);
useEffect(() => {
let newArr = [];
listFlightP?.map(item => {
newArr.push({ ...item });
newArr.push({...item});
});
setFlightPlanDataList(listFlightP);
}, [listFlightP]);
}, [listFlightP]);
const openModal = () => {
setModal({
setModal({
isOpen: true,
title: '비행 구역 설정',
title: '비행 구역 설정',
});
}
const handlerCreate = async data => {
console.log('data>>>>>', data);
console.log('flightPlanData>>>',{flightPlanData, params});
let saveArr = {flightPlanData, params};
const handlerCreate = e => {
// console.log('flightPlanData>>>', {flightPlanData, params});
// let saveData = {flightPlanData, params};
const saveData = {...flightPlanData};
dispatch(
Actions.FLIGHT_PLAN_CREATE.request({
data: saveArr
})
Actions.FLIGHT_PLAN_CREATE.request(saveData)
);
};
const handlerInput = (val) => {
setParams({
...params,
schFltStDt: moment(val[1]).format('YYYY-MM-DD'),
schFltEndDt: moment(val[0]).format('YYYY-MM-DD')
});
};
const onChange = (e) => {
setFlightPlanData({
...flightPlanData,
[e.target.name]: e.target.value,
});
};
const handlerDelete = async data => {
};
// 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));
};
};
useEffect(() => {
setAreaInfo(flightPlanArea);
}, [flightPlanArea]);
return (
<CustomDetailLayout title={"비행 계획 신청서"}>
<FlightPlanForm
@ -140,20 +153,20 @@ const FlightPlanDetailContainer = props => {
areaInfo={areaInfo}
params={params}
handlerSave={
pageType === 'create' ? handlerCreate : handlerUpdate
pageType === 'create' ? handlerCreate : handlerUpdate
}
onChange={onChange}
handlerDelete={handlerDelete}
handlerInput={handlerInput}
// handlerInput={handlerInput}
/>
<FlightPlanAreaModal
<FlightPlanAreaModal
modal={modal}
save={saveFlightPlanArea}
setModal={setModal}
/>
/>
</CustomDetailLayout>
)
}
export default FlightPlanDetailContainer;
export default FlightPlanDetailContainer;

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

@ -1,6 +1,12 @@
import { AxiosError } from 'axios';
import { createAsyncAction, ActionType} from 'typesafe-actions';
import { FlightAreaData, FlightPlanArea, FlightPlanData } from '../models/basisFlightModel';
import {
FlightAreaData,
FlightPlanArcrftDataList,
// FlightPlanArea,
FlightPlanData,
FlightPlanListRqData, FlightPlanPilotDataList
} from '../models/basisFlightModel';
// 공역 조회
@ -9,13 +15,49 @@ const AREA_LIST_SUCCESS = 'basis/flight/area/LIST_SUCCESS';
const AREA_LIST_FAILURE = 'basis/flight/area/LIST_FAILURE';
// 비행 구역 설정
const FLIGHT_PLAN_AREA_REQUEST = 'basis/flight/plan/area/LIST_REQUEST';
const FLIGHT_PLAN_AREA_SUCCESS = 'basis/flight/plan/area/LIST_SUCCESS';
const FLIGHT_PLAN_AREA_FAILURE = 'basis/flight/plan/area/LIST_FAILURE';
// const FLIGHT_PLAN_AREA_REQUEST = 'basis/flight/plan/area/LIST_REQUEST';
// const FLIGHT_PLAN_AREA_SUCCESS = 'basis/flight/plan/area/LIST_SUCCESS';
// const FLIGHT_PLAN_AREA_FAILURE = 'basis/flight/plan/area/LIST_FAILURE';
// 목록
const FLIGHT_PLAN_LIST_REQUEST = 'basis/flight/plan/list/LIST_REQUEST';
const FLIGHT_PLAN_LIST_SUCCESS = 'basis/flight/plan/list/LIST_SUCCESS';
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_SUCCESS = 'basis/flight/plan/detail/DETAIL_SUCCESS';
const FLIGHT_PLAN_DETAIL_FAILURE = 'basis/flight/plan/detail/DETAIL_FAILURE';
// 생성
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_FAILURE = 'basis/flight/plan/create/CREATE_FAILURE';
// 수정
const FLIGHT_PLAN_UPDATE_REQUEST = 'basis/flight/plan/update/UPDATE_REQUEST';
const FLIGHT_PLAN_UPDATE_SUCCESS = 'basis/flight/plan/update/UPDATE_SUCCESS';
const FLIGHT_PLAN_UPDATE_FAILURE = 'basis/flight/plan/update/UPDATE_FAILURE';
// 삭제
const FLIGHT_PLAN_DELETE_REQUEST = 'basis/flight/plan/delete/DELETE_REQUEST';
const FLIGHT_PLAN_DELETE_SUCCESS = 'basis/flight/plan/delete/DELETE_SUCCESS';
const FLIGHT_PLAN_DELETE_FAILURE = 'basis/flight/plan/delete/DELETE_FAILURE';
// 조종사 조회
const FLIGHT_PLAN_PILOT_LIST_REQUEST = 'basis/flight/plan/pilot_list/PILOT_LIST_REQUEST';
const FLIGHT_PLAN_PILOT_LIST_SUCCESS = 'basis/flight/plan/pilot_list/PILOT_LIST_SUCCESS';
const FLIGHT_PLAN_PILOT_LIST_FAILURE = 'basis/flight/plan/pilot_list/PILOT_LIST_FAILURE';
// 기체 조회
const FLIGHT_PLAN_ARCRFT_LIST_REQUEST = 'basis/flight/plan/arcrft_list/ARCRFT_LIST_REQUEST';
const FLIGHT_PLAN_ARCRFT_LIST_SUCCESS = 'basis/flight/plan/arcrft_list/ARCRFT_LIST_SUCCESS';
const FLIGHT_PLAN_ARCRFT_LIST_FAILURE = 'basis/flight/plan/arcrft_list/ARCRFT_LIST_FAILURE';
const FLIGHT_PLAN_CREATE_REQUEST = 'basis/flight/plan/area/LIST_CREATE_REQUEST';
const FLIGHT_PLAN_CREATE_SUCCESS = 'basis/flight/plan/area/LIST_CREATE_SUCCESS';
const FLIGHT_PLAN_CREATE_FAILURE = 'basis/flight/plan/area/LIST_CREATE_FAILURE';
export const AREA_LIST = createAsyncAction(
AREA_LIST_REQUEST,
@ -23,22 +65,72 @@ export const AREA_LIST = createAsyncAction(
AREA_LIST_FAILURE
)<FlightAreaData, { data: FlightAreaData }, AxiosError>();
export const FLIGHT_PLAN_AREA = createAsyncAction(
FLIGHT_PLAN_AREA_REQUEST,
FLIGHT_PLAN_AREA_SUCCESS,
FLIGHT_PLAN_AREA_FAILURE
)<FlightPlanArea, { data: FlightPlanArea }, AxiosError>();
// export const FLIGHT_PLAN_AREA = createAsyncAction(
// FLIGHT_PLAN_AREA_REQUEST,
// FLIGHT_PLAN_AREA_SUCCESS,
// FLIGHT_PLAN_AREA_FAILURE
// )<FlightPlanArea, { data: FlightPlanArea }, AxiosError>();
// 목록
export const FLIGHT_PLAN_LIST = createAsyncAction(
FLIGHT_PLAN_LIST_REQUEST,
FLIGHT_PLAN_LIST_SUCCESS,
FLIGHT_PLAN_LIST_FAILURE
)<FlightPlanListRqData, [FlightPlanData], AxiosError>();
// 상세
export const FLIGHT_PLAN_DETAIL = createAsyncAction(
FLIGHT_PLAN_DETAIL_REQUEST,
FLIGHT_PLAN_DETAIL_SUCCESS,
FLIGHT_PLAN_DETAIL_FAILURE
)<number, FlightPlanData, AxiosError>();
// 생성
export const FLIGHT_PLAN_CREATE = createAsyncAction(
FLIGHT_PLAN_CREATE_REQUEST,
FLIGHT_PLAN_CREATE_SUCCESS,
FLIGHT_PLAN_CREATE_FAILURE
)<FlightPlanData, { data: FlightPlanData }, AxiosError>();
)<FlightPlanData, string, AxiosError>();
// 수정
export const FLIGHT_PLAN_UPDATE = createAsyncAction(
FLIGHT_PLAN_UPDATE_REQUEST,
FLIGHT_PLAN_UPDATE_SUCCESS,
FLIGHT_PLAN_UPDATE_FAILURE
)<FlightPlanData, string, AxiosError>();
// 삭제
export const FLIGHT_PLAN_DELETE = createAsyncAction(
FLIGHT_PLAN_DELETE_REQUEST,
FLIGHT_PLAN_DELETE_SUCCESS,
FLIGHT_PLAN_DELETE_FAILURE
)<number, string, AxiosError>();
// 조종사 목록
export const FLIGHT_PLAN_PILOT_LIST = createAsyncAction(
FLIGHT_PLAN_PILOT_LIST_REQUEST,
FLIGHT_PLAN_PILOT_LIST_SUCCESS,
FLIGHT_PLAN_PILOT_LIST_FAILURE
)<string, FlightPlanPilotDataList, AxiosError>();
// 기체 목록
export const FLIGHT_PLAN_ARCRFT_LIST = createAsyncAction(
FLIGHT_PLAN_ARCRFT_LIST_REQUEST,
FLIGHT_PLAN_ARCRFT_LIST_SUCCESS,
FLIGHT_PLAN_ARCRFT_LIST_FAILURE
)<string, FlightPlanArcrftDataList, AxiosError>();
const actions = {
AREA_LIST,
FLIGHT_PLAN_AREA,
FLIGHT_PLAN_CREATE
// FLIGHT_PLAN_AREA,
FLIGHT_PLAN_LIST,
FLIGHT_PLAN_DETAIL,
FLIGHT_PLAN_CREATE,
FLIGHT_PLAN_UPDATE,
FLIGHT_PLAN_DELETE,
FLIGHT_PLAN_PILOT_LIST,
FLIGHT_PLAN_ARCRFT_LIST
};
export type FlightAction = ActionType<typeof actions>;
export type FlightAction = ActionType<typeof actions>;

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

@ -1,18 +1,57 @@
import axios from '../../../utils/customAxiosUtil';
import qs from 'qs';
import { FlightPlanData } from '../models/basisFlightModel';
import { FlightPlanData, FlightPlanListRqData } from '../models/basisFlightModel';
export const flightPlanAPI = {
area: async () => {
return await axios.get(`api/bas/flight/area`);
},
Create: async (data: FlightPlanData) => {
console.log(data);
const res = await axios.post('api/bas/flight/create', data);
console.log('res>>>>', res);
return res;
}
}
area: async () => {
const res = await axios.get(`api/bas/flight/area`);
return res;
},
list: async (data: FlightPlanListRqData) => {
const queryString = qs.stringify(data, {
addQueryPrefix: true,
arrayFormat: 'repeat'
});
console.log('>>> rq : ', queryString)
const res = await axios.get(`api/bas/flight/plan/list${queryString}`);
console.log('>>> rs : ', res);
return res;
},
detail: async (planSno: number) => {
console.log('>>> rq : ', planSno)
const res = await axios.get(`api/bas/flight/plan/detail/${planSno}`);
console.log('>>> rs : ', res);
return res;
},
create: async (data: FlightPlanData) => {
console.log('>>> rq : ', data)
const res = await axios.post(`api/bas/flight/paln/create`, data);
console.log('>>> rs : ', res);
return res;
},
update: async (data: FlightPlanData) => {
console.log('>>> rq : ', data)
const res = await axios.put(`api/bas/flight/plan/update`, data);
console.log('>>> rs : ', res);
return res;
},
delete: async (planSno: number) => {
console.log('>>> rq : ', planSno)
const res = await axios.get(`api/bas/flight/plan/delete/${planSno}`);
console.log('>>> rs : ', res);
return res;
},
listPilot: async (groupId: number) => {
console.log('>>> rq : ', groupId)
const res = await axios.get(`api/bas/flight/plan/pilot/${groupId}`);
console.log('>>> rs : ', res);
return res;
},
listArcrft: async (groupId: number) => {
console.log('>>> rq : ', groupId)
const res = await axios.get(`api/bas/flight/plan/arcrft/${groupId}`);
console.log('>>> rs : ', res);
return res;
}
}

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

@ -1,49 +1,116 @@
import { date } from "yup";
export interface FlightState {
areaList: FlightAreaData | undefined
flightPlanArea: FlightPlanArea | undefined
flightPlanData: FlightPlanData | undefined
areaList: FlightAreaData | undefined
flightPlanArea: FlightPlanArea | undefined
list: [FlightPlanData] | undefined
detail: FlightPlanData | undefined
pilotList: FlightPlanPilotDataList | undefined
arcrftList: FlightPlanArcrftDataList | undefined
}
export interface FlightAreaData {
areaList: []
areaList: []
}
export interface FlightPlanArea {
address : '',
coordinates : '',
redius : '',
altitude_m : '',
altitude_ft : '',
address: '',
coordinates: '',
redius: '',
altitude_m: '',
altitude_ft: '',
}
export interface FlightPlanData {
id:string;
memberName:string;
clncd:string;
hpno:string;
email:string;
lonlat:string;
lonlat2:string;
lonlat3:string;
fltElev:string;
fltHight:string;
fltMethod:string;
groupNm:string;
pilotName:string;
pilotHpno:string;
pilotEmail:string;
aGroupNm:string;
arcrftModelNm:string;
arcrftTypeCd:string;
ownerNm:string;
createUserId:string;
updateUserId:string;
schFltStDt:Date;
schFltEndDt:Date;
planArcrftSno: number,
planSno: number,
arcrftSno: number,
idntfNum: string,
groupNm: string,
prdctNum: string,
arcrftTypeCd: string,
arcrftModelNm: string,
prdctCmpnNm: string,
prdctDate: Date;
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: Date,
updateUserId: string,
updateDt: Date,
areaList: FlightPlanAreaDataList,
pilotList: FlightPlanPilotDataList,
arcrftList: FlightPlanArcrftDataList,
docState: string,
}
export interface FlightPlanAreaData {
planAreaSno: number,
planSno: number,
areaType: string,
fltMethod: string,
bufferZone: number,
fltElev: string,
createUserId: string,
createDt: Date,
updateUserId: string,
updateDt: Date,
coordList: FlightPlanAreaCoordData
docState: string,
}
export interface FlightPlanAreaDataList extends Array<FlightPlanAreaData> {};
export interface FlightPlanAreaCoordData {
planAreaCoordSno: number,
planAreaSno: number,
lat: number,
lon: number,
createUserId: string,
createDt: Date,
docState: string
}
export interface FlightPlanAreaCoordData extends Array<FlightPlanAreaCoordData> {};
export interface FlightPlanPilotData {
}
export interface FlightPlanPilotDataList extends Array<FlightPlanPilotData> {};
export interface FlightPlanArcrftData {
}
export interface FlightPlanArcrftDataList extends Array<FlightPlanArcrftData> {};
// rq
export interface FlightPlanListRqData {
schFltStDt: Date,
schFltEndDt: Date,
aprvlYn: string
}
export interface FlightPlanAprovRqData {
planSnoList: [number],
aprvlYn: string
}
export const initFlight = {
areaList: undefined,
flightPlanArea: undefined,
flightPlanData: undefined
};
areaList: undefined,
flightPlanArea: undefined,
list: undefined,
detail: undefined,
pilotList: undefined,
arcrftList: undefined
};

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

@ -6,22 +6,48 @@ import { FlightState, initFlight } from '../models/basisFlightModel';
import { any } from 'prop-types';
export const flightReducer = createReducer<FlightState, Actions.FlightAction> ( initFlight )
.handleAction(Actions.AREA_LIST.success, (state, action) =>
export const flightReducer = createReducer<FlightState, Actions.FlightAction>(initFlight)
.handleAction(Actions.AREA_LIST.success, (state, action) =>
produce(state, draft => {
const {data} = action.payload;
draft.areaList = data;
const {data} = action.payload;
draft.areaList = data;
})
)
.handleAction(Actions.FLIGHT_PLAN_AREA.request, (state, action) =>
produce(state, draft => {
const data = action.payload;
draft.flightPlanArea = data;
)
// .handleAction(Actions.FLIGHT_PLAN_AREA.request, (state, action) =>
// produce(state, draft => {
// const data = action.payload;
// draft.flightPlanArea = data;
// })
// )
// 목록
.handleAction(Actions.FLIGHT_PLAN_LIST.success, (state, action) =>
produce(state, draft => {
console.log('list : ', state, action);
const data = action.payload;
draft.list = data;
})
)
// 상세
.handleAction(Actions.FLIGHT_PLAN_DETAIL.success, (state, action) =>
produce(state, draft => {
console.log('detail : ', state, action);
const data = action.payload;
draft.detail = data;
})
)
.handleAction(Actions.FLIGHT_PLAN_CREATE.request, (state, action) =>
produce(state, draft => {
const data = action.payload;
draft.flightPlanData = data;
)
// 조종사 조회
.handleAction(Actions.FLIGHT_PLAN_PILOT_LIST.success, (state, action) =>
produce(state, draft => {
console.log('pilot : ', state, action);
const data = action.payload;
draft.pilotList = data;
})
)
// 기체 조회
.handleAction(Actions.FLIGHT_PLAN_ARCRFT_LIST.success, (state, action) =>
produce(state, draft => {
console.log('arcrft : ', state, action);
const data = action.payload;
draft.arcrftList = data;
})
)
)

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

@ -9,101 +9,133 @@ import {
import * as MessageActions from '../../../comn/message/actions/comnMessageAction';
import * as Actions from '../actions/basisFlightAction';
import * as Apis from '../apis/basisFlightApi';
import { FlightPlanData } from "../models/basisFlightModel";
function* listAreaSaga(action: ActionType<typeof Actions.AREA_LIST.request>) {
try {
const response = yield call(Apis.flightPlanAPI.area);
try {
const response = yield call(Apis.flightPlanAPI.area);
if(response.errorCode) {
yield put(
MessageActions.IS_ERROR({
errorCode: response.errorCode,
errorMessage: response.errorMessage,
isHistoryBack: false,
isRefresh: false
})
);
return;
}
yield put(
Actions.AREA_LIST.success({
data: response
})
);
} catch (error: any) {
yield put(
Actions.AREA_LIST.failure(error)
);
if (response.errorCode) {
yield put(
MessageActions.IS_ERROR({
errorCode: response.errorCode,
errorMessage: response.errorMessage,
isHistoryBack: false,
isRefresh: false
})
);
return;
}
}
function* createFlightPlanArea(action: ActionType<typeof Actions.FLIGHT_PLAN_AREA.request>) {
try {
const data = action.payload;
yield put(
Actions.AREA_LIST.success({
data: response
})
);
} catch (error: any) {
yield put(
Actions.AREA_LIST.failure(error)
);
}
}
yield put(
Actions.FLIGHT_PLAN_AREA.success({
data: data
})
)
// function* createFlightPlanArea(action: ActionType<typeof Actions.FLIGHT_PLAN_AREA.request>) {
// try {
// const data = action.payload;
//
// yield put(
// Actions.FLIGHT_PLAN_AREA.success({
// data: data
// })
// )
//
// } catch (error: any) {
// yield put(
// Actions.FLIGHT_PLAN_AREA.failure(error)
// )
// }
// }
} catch (error: any) {
yield put(
Actions.FLIGHT_PLAN_AREA.failure(error)
)
}
}
function* createFlightPlanData(
action: ActionType<typeof Actions.FLIGHT_PLAN_CREATE.request>
) {
try {
const detail = action.payload;
console.log('detail>>>:', detail);
const res = yield call(Apis.flightPlanAPI.Create, detail);
console.log(res);
const { data } = res;
console.log('data:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>', data.result);
if (data.result) {
yield put(
MessageActions.IS_MESSAGE({
messageCode: SAVE_MESSAGE.code,
message: SAVE_MESSAGE.message,
isHistoryBack: false,
isRefresh: false
})
);
yield put(Actions.FLIGHT_PLAN_CREATE.success(data));
} else {
console.log('errorCode >>> ', data.errorCode);
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) {
function* listPlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_LIST.request>) {
try {
const data = action.payload;
console.log(`listPlanSaga payload `, data)
const response = yield call(Apis.flightPlanAPI.list, data);
console.log('rs', response);
if (response.errorCode) {
yield put(
MessageActions.IS_ERROR({
errorCode: ERROR_MESSAGE.code,
errorMessage: ERROR_MESSAGE.message,
errorCode: response.errorCode,
errorMessage: response.errorMessage,
isHistoryBack: false,
isRefresh: false
})
);
// yield put(Actions.GROUP_CREATE.failure(error));
return;
}
yield put(
Actions.FLIGHT_PLAN_LIST.success(response.data)
);
} catch (error: any) {
yield put(
Actions.FLIGHT_PLAN_LIST.failure(error)
);
}
}
// function* createFlightPlanData(
// action: ActionType<typeof Actions.FLIGHT_PLAN_CREATE.request>
// ) {
// try {
// const detail = action.payload;
//
// console.log('detail>>>:', detail);
// const res = yield call(Apis.flightPlanAPI.create, detail);
// console.log(res);
// const {data} = res;
// console.log('data:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>', data.result);
// if (data.result) {
// yield put(
// MessageActions.IS_MESSAGE({
// messageCode: SAVE_MESSAGE.code,
// message: SAVE_MESSAGE.message,
// isHistoryBack: false,
// isRefresh: false
// })
// );
// yield put(Actions.FLIGHT_PLAN_CREATE.success(data));
// } else {
// console.log('errorCode >>> ', data.errorCode);
// 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.GROUP_CREATE.failure(error));
// }
// }
export function* flightSaga() {
yield takeEvery(Actions.AREA_LIST.request, listAreaSaga);
yield takeEvery(Actions.FLIGHT_PLAN_AREA.request, createFlightPlanArea);
yield takeEvery(Actions.FLIGHT_PLAN_CREATE.request, createFlightPlanData)
}
yield takeEvery(Actions.AREA_LIST.request, listAreaSaga);
// yield takeEvery(Actions.FLIGHT_PLAN_AREA.request, createFlightPlanArea);
yield takeEvery(Actions.FLIGHT_PLAN_LIST.request, listPlanSaga)
// yield takeEvery(Actions.FLIGHT_PLAN_CREATE.request, createFlightPlanData)
}

Loading…
Cancel
Save