Browse Source

비행계획서 기본 CRUD 구성

remotes/origin/feature/flight-plan
지대한 2 years ago
parent
commit
9f86f9b172
  1. 722
      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. 334
      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

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

@ -12,10 +12,11 @@ import {
import Flatpickr from 'react-flatpickr';
import '@styles/react/libs/flatpickr/flatpickr.scss';
import moment from 'moment';
import {initFlight, initFlightBas} from '../../../../modules/basis/flight/models/basisFlightModel';
const FlightPlanForm = (props) => {
const FlightPlanForm = ({data, handleModal, handleChange, handleSave, handleDelete}) => {
const {areaList, pilotList, arcrftList} = data;
return (
<Row>
<Col sm='12'>
@ -26,14 +27,9 @@ const FlightPlanForm = (props) => {
<Card>
<CardBody className='pal-card-body'>
<div className='search-cont search-info pd-0'>
<div className='cont-ti mb-1 d-flex justify-content-between align-items-sm-center align-items-start flex-sm-row'>
{/* <div>
<h4> 상세정보</h4>
</div> */}
<div
className='cont-ti mb-1 d-flex justify-content-between align-items-sm-center align-items-start flex-sm-row'>
<div className='final'>
{/* {props.type === 'update' ? (
<span>최종 수정일자 : {props.updateDt}</span>
) : null} */}
</div>
</div>
@ -45,20 +41,32 @@ const FlightPlanForm = (props) => {
<div className='search-info-box'>
<Row>
<Col className='list-input' lg={4} md={6} sm={12}>
<Col className='list-input' lg={4} md={3} sm={12}>
<FormGroup>
<Label for='test'><span className='necessary'>*</span></Label>
<Label for='test'><span
className='necessary'>*</span></Label>
<Input
type='text'
id='memberName'
name='memberName'
onChange={props.onChange}
size='sm'
// defaultValue={data.memberName}
value={data.memberName || ''}
onChange={(e) => {
const {name, value} = e.target;
handleChange({
type: 'plan',
name,
value,
})
}}
bsSize='sm'
placeholder=''
/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={7} sm={12}>
<Col className='list-input' lg={4} md={5} sm={12}>
<FormGroup className='m_ft'>
<div className='m_ft_box'>
<Label for='test'>
@ -68,10 +76,18 @@ const FlightPlanForm = (props) => {
type='text'
id='clncd'
name='clncd'
size='sm'
// defaultValue={data.clncd}
value={data.clncd || '+81'}
bsSize='sm'
placeholder='+82'
value='+82'
onChange={(e) => {
const {name, value} = e.target;
handleChange({
type: 'plan',
name,
value,
})
}}
readOnly
/>
</div>
@ -80,22 +96,41 @@ const FlightPlanForm = (props) => {
type='text'
id='hpno'
name='hpno'
size='sm'
onChange={props.onChange}
// defaultValue={data.hpno}
value={data.hpno || ''}
bsSize='sm'
onChange={(e) => {
const {name, value} = e.target;
handleChange({
type: 'plan',
name,
value,
})
}}
placeholder='010-0000-0000'
/>
</div>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<Col className='list-input' lg={4} md={4} sm={12}>
<FormGroup>
<Label for='test'><span className='necessary'>*</span></Label>
<Label for='test'><span
className='necessary'>*</span></Label>
<Input
type='text'
id='email'
name='email'
size='sm'
onChange={props.onChange}
defaultValue={data.email || ''}
// value={data.email}
bsSize='sm'
onChange={(e) => {
const {name, value} = e.target;
handleChange({
type: 'plan',
name,
value,
})
}}
// innerRef={props.data}
placeholder=''
/>
@ -103,47 +138,14 @@ const FlightPlanForm = (props) => {
</Col>
</Row>
</div>
{/* <div className='search-info-box'>
<Row>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'><span className='necessary'>*</span></Label>
<Input
type='text'
id='applicantAddress'
name='applicantAddress'
size='sm'
// innerRef={props.data}
placeholder=''
/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'><span className='necessary'>*</span> </Label>
<Input
type='text'
id='applicantAddress'
name='applicantAddress'
size='sm'
// innerRef={props.data}
placeholder=''
/>
</FormGroup>
</Col>
</Row>
</div> */}
</dt>
<dt>
<div className='search-info-ti d-flex justify-content-between'>
<h4 className='ti'>비행 계획 정보</h4>
</div>
<div className='search-info-box'>
<Row>
<Col className='list-input' lg={4} md={6} sm={12}>
<Col className='list-input' lg={4} md={4} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
@ -154,23 +156,21 @@ const FlightPlanForm = (props) => {
id='schFltStDt'
name='schFltStDt'
data-enable-time
value={props.schFltStDt}
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)
// defaultValue={data.schFltStDt}
value={data.schFltStDt}
onChange={(date) => {
const value = moment(date[0]).format('YYYY-MM-DD HH:mm:ss') || '';
handleChange({
type: 'plan',
name: 'schFltStDt',
value
})
}}
// onChange={val =>
// props.handlerInput(val)
// }
// innerRef={props.data}
placeholder='비행 시작일자 선택(클릭)'/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<Col className='list-input' lg={4} md={4} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
@ -181,38 +181,44 @@ const FlightPlanForm = (props) => {
id='schFltEndDt'
name='schFltEndDt'
data-enable-time
value={props.schFltEndDt}
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)
value={data.schFltEndDt}
onChange={(date) => {
const value = moment(date[0]).format('YYYY-MM-DD HH:mm:ss') || '';
handleChange({
type: 'plan',
name: 'schFltEndDt',
value
})
}}
// onChange={val =>
// props.handlerInput(val)
// }
// innerRef={props.data}
placeholder='비행 종료일자 선택(클릭)'/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<Col className='list-input' lg={4} md={4} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Input
type='select'
name='fltPurpose'
id='fltPurpose'
size='sm'
onChange={props.onChange}
name='fltPurpose'
value={data.fltPurpose}
bsSize='sm'
onChange={(e) => {
const {name, value} = e.target;
handleChange({
type: 'plan',
name,
value,
})
}}
// innerRef={props.data}
// className={classnames({
// 'is-invalid': props.errors.arcrftTypeCd
// })}
>
{/* TODO CDNOT 코드연동 필요 */}
<option value=''>= 선택 =</option>
<option value='시험비행'>= 시험비행 =</option>
<option value='교육비행'>= 교육비행 =</option>
@ -220,118 +226,166 @@ const FlightPlanForm = (props) => {
<option value='비행훈련'>= 비행훈련 =</option>
<option value='비행교육'>= 비행교육 =</option>
<option value='비행실기시험'>= 비행실기시험 =</option>
{/* CDNOT 코드연동 필요 */}
{/* {ARCTFT_TYPE_CD.map(item => {
return (
<option
value={item.code}
selected={
props.data.arcrftTypeCd === item.code
? true
: false
}
>
{item.codeNm}
</option>
);
})} */}
</Input>
</FormGroup>
</Col>
</Row>
</div>
<div className='search-info-box'>
{/* <Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Input
type='select'
name='arcrftTypeCd'
id='arcrftTypeCd'
size='sm'
innerRef={props.data}
className={classnames({
'is-invalid': props.errors.arcrftTypeCd
})}
</dt>
<dt>
{/* TODO area 다건 표출 */}
<div className='search-info-ti d-flex justify-content-between'>
<h4 className='ti'>비행 구역 정보</h4>
<Button.Ripple
color="primary"
onClick={(e) => {
handleModal({target: 'area', isOpen: true})
}}
>
<option value=''>= 선택 =</option>
CDNOT 코드연동 필요
{ARCTFT_TYPE_CD.map(item => {
return (
<option
value={item.code}
selected={
props.data.arcrftTypeCd === item.code
? true
: false
}
비행 구역 설정
</Button.Ripple>
</div>
{areaList
? areaList.map((item, i) =>
<AreaForm key={i} index={i} data={item}
handleChange={handleChange}/>)
: <AreaForm data={initFlightBas.area}
handleChange={handleChange}/>}
</dt>
<dt>
<div className='search-info-ti d-flex justify-content-between'>
<h4 className='ti'>조종사 정보</h4>
<Button.Ripple
color="primary"
onChange={(e) => {
handleModal({target: 'pilot', isOpen: true})
}}
>
{item.codeNm}
</option>
);
})}
</Input>
</FormGroup>
</Col> */}
{/* <Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'></span>
</Label>
<Input
type='text'
id='arcrftModelNm'
name='arcrftModelNm'
innerRef={props.data}
size='sm'
placeholder=''
className={classnames({
'is-invalid': props.errors.arcrftModelNm
})}
/>
{props.errors && props.errors.arcrftModelNm && (
<FormFeedback>
{props.errors.arcrftModelNm.message}
</FormFeedback>
)}
</FormGroup>
</Col> */}
조종사 조회
</Button.Ripple>
</div>
{pilotList
? pilotList.map((item, i) =>
<PilotForm key={i}
index={i}
data={item}
handleChange={handleChange}/>)
: <PilotForm data={initFlightBas.pilot}
handleChange={handleChange}/>}
</dt>
<dt>
<div className='search-info-ti d-flex justify-content-between'>
<h4 className='ti'>비행 구역 정보</h4>
<h4 className='ti'>기체 정보</h4>
<Button.Ripple
color="primary"
onClick={props.openModal}
onClick={(e) => {
handleModal({target: 'arcrft', isOpen: true});
}}
>
비행 구역 설정
기체 조회
</Button.Ripple>
</div>
<div className='search-info-box'>
{arcrftList
? arcrftList.map((item, i) =>
<ArcrftForm key={i}
index={i}
data={item}
handleChange={handleChange}/>)
: <ArcrftForm data={initFlightBas.arcrft}
handleChange={handleChange}/>}
</dt>
<div className='d-flex align-items-center'>
<Button.Ripple
className='mr-1'
color='primary'
size='sm'
onClick={handleSave}
>
저장
</Button.Ripple>
<Button.Ripple
color='danger'
size='sm'
onClick={handleDelete}
>
삭제
</Button.Ripple>
</div>
</dl>
</div>
</CardBody>
</Card>
</Col>
</Row>
</CardBody>
</Card>
</Col>
</Row>
)
}
export default FlightPlanForm;
const AreaForm = ({data, handleChange, index}) => {
return (<div className='search-info-box'>
<Row>
<Col className='list-input' lg={4} md={6} sm={12}>
<Col className='list-input' lg={4} md={12} sm={12}>
<FormGroup>
<Label for='test'>
<span rowSpan={3} className='necessary'>*</span>
</Label>
<Input
{data && data.coordList && data.coordList.length > 0
? data.coordList.map((item, i) => {
return <Input
key={item.planAreaCoordSno}
type='text'
id='lonlat'
name='lonlat'
size='sm'
placeholder=''
onChange={props.onChange}
// defaultValue={(item.lat && item.lon) ? `${item.lat} / ${item.lon}` : '-'}
value={(item.lat && item.lon) ? `${item.lat} / ${item.lon}` : ''}
bsSize='sm'
placeholder='-'
onChange={(e) => {
const {name, value} = e.target;
handleChange({
type: 'coord',
name,
value,
index: i,
pIndex: index
})
}}
style={{marginBottom: 5}}
// readOnly
/>
}) : <Input
type='text'
id='lonlat'
name='lonlat'
bsSize='sm'
placeholder='-!!'
onChange={(e) => {
const {name, value} = e.target;
handleChange({
type: 'coord',
name,
value,
index: 0,
pIndex: index
})
}}
// readOnly
/>}
</FormGroup>
</Col>
<Col className='list-input' lg={5} md={7} sm={12}>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup className='m_ft'>
<div className='m_ft_box'>
<Label for='test'>
@ -339,48 +393,48 @@ const FlightPlanForm = (props) => {
</Label>
<Input
type='text'
id='fltElev'
name='fltElev'
size='sm'
id='bufferZone'
name='bufferZone'
// defaultValue={data.bufferZone}
value={data.bufferZone}
bsSize='sm'
placeholder='반경'
onChange={props.onChange}
onChange={(e) => {
const {name, value} = e.target;
handleChange({
type: 'area',
name,
value,
index
})
}}
/>
</div>
<div className='m_ft_box'>
<Input
type='text'
id='fltHight'
name='fltHight'
size='sm'
id='fltElev'
name='fltElev'
// defaultValue={data.fltElev}
value={data.fltElev}
bsSize='sm'
placeholder='고도'
onChange={props.onChange}
onChange={(e) => {
const {name, value} = e.target;
handleChange({
type: 'area',
name,
value,
index
})
}}
/>
</div>
</FormGroup>
</Col>
</Row>
</div>
<div className='search-info-box'>
<Row>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'></span>
</Label>
<Input
type='text'
id='lonlat2'
name='lonlat2'
size='sm'
placeholder=''
onChange={props.onChange}
/>
</FormGroup>
</Col>
<Col className='list-input' lg={5} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
@ -389,46 +443,29 @@ const FlightPlanForm = (props) => {
type='text'
id='fltMethod'
name='fltMethod'
size='sm'
placeholder=''
onChange={props.onChange}
/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'></span>
</Label>
<Input
type='text'
id='lonlat3'
name='lonlat3'
size='sm'
// defaultValue={data.fltMethod}
value={data.fltMethod}
bsSize='sm'
placeholder=''
onChange={props.onChange}
onChange={(e) => {
const {name, value} = e.target;
handleChange({
type: 'area',
name,
value,
index
})
}}
/>
</FormGroup>
</Col>
</Row>
</div>
</dt>
<dt>
<div className='search-info-ti d-flex justify-content-between'>
<h4 className='ti'>조종사 정보</h4>
<Button.Ripple
color="primary"
onClick={props.openModal}
>
조종사 조회
</Button.Ripple>
</div>
<div className='search-info-box'>
</div>)
}
const PilotForm = ({data, handleChange, index}) => {
return (<div className='search-info-box'>
<Row>
<Col className='list-input' lg={4} md={6} sm={12}>
<Col className='list-input' lg={3} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
@ -437,34 +474,49 @@ const FlightPlanForm = (props) => {
type='text'
id='groupNm'
name='groupNm'
size='sm'
// defaultValue={data.groupNm}
value={data.groupNm}
bsSize='sm'
placeholder=''
onChange={props.onChange}
onChange={(e) => {
const {name, value} = e.target;
handleChange({
type: 'pilot',
name,
value,
index
})
}}
/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<Col className='list-input' lg={3} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Input
type='text'
id='pilotName'
name='pilotName'
size='sm'
id='memberName'
name='memberName'
// defaultValue={data.memberName}
value={data.memberName}
bsSize='sm'
placeholder=''
onChange={props.onChange}
onChange={(e) => {
const {name, value} = e.target;
handleChange({
type: 'pilot',
name,
value,
index
})
}}
/>
</FormGroup>
</Col>
</Row>
</div>
<div className='search-info-box'>
<Row>
<Col className='list-input' lg={4} md={7} sm={12}>
<Col className='list-input' lg={3} md={6} sm={12}>
<FormGroup className='m_ft'>
<div className='m_ft_box'>
<Label for='test'>
@ -474,74 +526,106 @@ const FlightPlanForm = (props) => {
type='text'
id='clncd'
name='clncd'
size='sm'
// defaultValue={data.clncd}
value={data.clncd}
bsSize='sm'
placeholder='+82'
onChange={props.onChange}
onChange={(e) => {
const {name, value} = e.target;
handleChange({
type: 'pilot',
name,
value,
index
})
}}
readOnly
/>
</div>
<div className='m_ft_box'>
<Input
type='text'
id='pilotHpno'
name='pilotHpno'
size='sm'
id='hpno'
name='hpno'
// defaultValue={data.hpno}
value={data.hpno}
bsSize='sm'
placeholder='010-0000-0000'
onChange={props.onChange}
onChange={(e) => {
const {name, value} = e.target;
handleChange({
type: 'pilot',
name,
value,
index
})
}}
/>
</div>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<Col className='list-input' lg={3} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Input
type='text'
id='pilotEmail'
name='pilotEmail'
size='sm'
id='email'
name='email'
// defaultValue={data.email}
value={data.email}
bsSize='sm'
placeholder=''
onChange={props.onChange}
onChange={(e) => {
const {name, value} = e.target;
handleChange({
type: 'pilot',
name,
value,
index
})
}}
/>
</FormGroup>
</Col>
</Row>
</div>
</dt>
<dt>
<div className='search-info-ti d-flex justify-content-between'>
<h4 className='ti'>기체 정보</h4>
<Button.Ripple
color="primary"
onClick={props.openModal}
>
 기체 조회 
</Button.Ripple>
</div>
<div className='search-info-box'>
</div>)
}
const ArcrftForm = ({data, handleChange, index}) => {
return (<div className='search-info-box'>
<Row>
<Col className='list-input' lg={4} md={6} sm={12}>
<Col className='list-input' lg={3} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Input
type='text'
id='aGroupNm'
name='aGroupNm'
size='sm'
id='groupNm'
name='groupNm'
// defaultValue={data.groupNm}
value={data.groupNm}
bsSize='sm'
placeholder=''
onChange={props.onChange}
onChange={(e) => {
const {name, value} = e.target;
handleChange({
type: 'arcrft',
name,
value,
index
})
}}
/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<Col className='list-input' lg={3} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
@ -550,18 +634,24 @@ const FlightPlanForm = (props) => {
type='text'
id='arcrftModelNm'
name='arcrftModelNm'
size='sm'
// defaultValue={data.arcrftModelNm}
value={data.arcrftModelNm}
bsSize='sm'
placeholder=''
onChange={props.onChange}
onChange={(e) => {
const {name, value} = e.target;
handleChange({
type: 'arcrft',
name,
value,
index
})
}}
/>
</FormGroup>
</Col>
</Row>
</div>
<div className='search-info-box'>
<Row>
<Col className='list-input' lg={4} md={6} sm={12}>
<Col className='list-input' lg={3} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
@ -570,14 +660,24 @@ const FlightPlanForm = (props) => {
type='text'
id='arcrftTypeCd'
name='arcrftTypeCd'
size='sm'
// defaultValue={data.arcrftTypeCd}
value={data.arcrftTypeCd}
bsSize='sm'
placeholder=''
onChange={props.onChange}
onChange={(e) => {
const {name, value} = e.target;
handleChange({
type: 'arcrft',
name,
value,
index
})
}}
/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<Col className='list-input' lg={3} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
@ -586,47 +686,23 @@ const FlightPlanForm = (props) => {
type='text'
id='ownerNm'
name='ownerNm'
size='sm'
// defaultValue={data.ownerNm}
value={data.ownerNm}
bsSize='sm'
placeholder=''
onChange={props.onChange}
onChange={(e) => {
const {name, value} = e.target;
handleChange({
type: 'arcrft',
name,
value,
index
})
}}
/>
</FormGroup>
</Col>
</Row>
</div>
</dt>
<div className='d-flex align-items-center'>
<Button.Ripple
className='mr-1'
color='primary'
size='sm'
onClick={props.handlerSave}
>
저장
</Button.Ripple>
<Button.Ripple
color='danger'
size='sm'
// onClick={handlerDelete}
>
삭제
</Button.Ripple>
</div>
</dl>
</div>
</CardBody>
</Card>
</Col>
</Row>
</CardBody>
</Card>
</Col>
</Row>
)
</div>)
}
export default FlightPlanForm;

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

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

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

@ -5,7 +5,7 @@ import Flatpickr from 'react-flatpickr';
import moment from 'moment';
const FlightPlanSearch = ({searchData, onChangeSearchData}) => {
const FlightPlanSearch = ({searchData, handleChangeSearchData, handleSearch}) => {
const {schFltStDt, schFltEndDt, aprvlYn} = searchData;
const initCheckState = {
@ -14,11 +14,14 @@ const FlightPlanSearch = ({searchData, onChangeSearchData}) => {
'no': (aprvlYn == 'N' || aprvlYn == 'A'),
}
const [checkState, setCheckState] = useState(initCheckState);
const handleClickSearch = (e) => {
handleSearch(searchData);
}
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})
handleChangeSearchData({schFltStDt, schFltEndDt})
}
}
const handleChangeCheckbox = (e) => {
@ -27,7 +30,7 @@ const FlightPlanSearch = ({searchData, onChangeSearchData}) => {
switch (value) {
case 'A':
val = checked ? 'A' : '';
onChangeSearchData({[name]: val})
handleChangeSearchData({[name]: val})
setCheckState({
'all': checked,
'yes': checked,
@ -39,7 +42,7 @@ const FlightPlanSearch = ({searchData, onChangeSearchData}) => {
else if (checked && !checkState.no) val = 'Y'
else if (!checked && checkState.no) val = 'N'
else if (!checked && !checkState.no) val = ''
onChangeSearchData({[name]: val})
handleChangeSearchData({[name]: val})
setCheckState(prevState => ({
'all': prevState.no && checked,
'yes': checked,
@ -51,7 +54,7 @@ const FlightPlanSearch = ({searchData, onChangeSearchData}) => {
else if (checked && !checkState.yes) val = 'N'
else if (!checked && checkState.yes) val = 'Y'
else if (!checked && !checkState.yes) val = ''
onChangeSearchData({[name]: val})
handleChangeSearchData({[name]: val})
setCheckState(prevState => ({
'all': prevState.yes && checked,
'yes': prevState.yes,
@ -75,8 +78,7 @@ const FlightPlanSearch = ({searchData, onChangeSearchData}) => {
<Button.Ripple
color='primary'
size='sm'
onClick={e => {
}}
onClick={handleClickSearch}
>
<Search size={16}/>
검색

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

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

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

@ -1,172 +1,228 @@
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 FlightPlanAreaContainer from './FlightPlanAreaContainer';
import {useHistory} from 'react-router-dom';
import {useHistory, useLocation, useParams} from 'react-router-dom';
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 {useForm} from 'react-hook-form';
import moment from 'moment';
import {Save} from 'react-feather';
import {initFlightBas} from '../../../../modules/basis/flight/models/basisFlightModel';
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 initModal = {
area: false,
pilot: false,
arcrft: false
}
const FlightPlanDetailContainer = props => {
const FlightPlanDetailContainer = () => {
const dispatch = useDispatch();
const history = useHistory();
const [pageType, setPageType] = useState('create');
const {flightPlanArea} = useSelector(state => state.flightState);
const [areaInfo, setAreaInfo] = useState();
const [modal, setModal] = useState({
isOpen: false,
title: '',
});
const {listFlightP, flightCount, isRefreshFlight} = useSelector(
state => state.flightState
);
const [flightPlanData, setFlightPlanData] = useState(initFlightPlanData);
const location = useLocation();
const urlParams = useParams();
const flightState = useSelector(state => state.flightState);
const {detail} = flightState;
const [modal, setModal] = useState(initModal);
const [detailData, setDetailData] = useState(initFlightBas.initDetail);
const [params, setParams] = useState({
schFltStDt: moment().subtract(1, 'day').format('YYYY-MM-DD'),
schFltEndDt: moment().subtract(-1, 'day').format('YYYY-MM-DD'),
search1: ''
});
useEffect(() => {
if (Object.keys(urlParams).length === 0 && urlParams.constructor === Object) return;
dispatch(Actions.FLIGHT_PLAN_DETAIL.request(urlParams.planSno));
}, [urlParams])
useEffect(() => {
console.log('isRefreshFlight>>>>', isRefreshFlight);
if (isRefreshFlight) {
console.log(isRefreshFlight);
handlerSearch();
setDetailData(detail);
}, [detail])
const handleModal = (modal) => {
setModal(prevState => ({
...initModal,
[modal.target]: modal.isOpen
}))
}
}, [isRefreshFlight]);
const [flightPlanDataList, setFlightPlanDataList] = useState([]);
/* Form Validation Checking */
const validSchema = yup.object().shape({});
const {} = useForm({
defaultValues: {
coodinates: [],
radius: '',
altitude_m: '',
altitude_ft: '',
},
resolver: yupResolver(validSchema)
// 변경감지
const handleChange = ({name, value, type, index, pIndex}) => {
const arrName = `${type}List`;
switch (type) {
case 'coord':
// TODO 추후 삭제 필요 start
if(name == 'lonlat'){
const values = value.split("/");
let latValue = 1
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
}
})
const saveFlightPlanArea = () => {
console.log('비행 구역 설정 저장');
return {
...area,
coordList
}
useEffect(() => {
if (props.id) {
handlerSearch();
setPageType('update');
})
return {
...prevState,
areaList
}
// console.log(selectData);
}, []);
useEffect(() => {
let newArr = [];
listFlightP?.map(item => {
newArr.push({...item});
});
setFlightPlanDataList(listFlightP);
}, [listFlightP]);
const openModal = () => {
setModal({
isOpen: true,
title: '비행 구역 설정',
});
})
return;
}
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) => ({
// 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,
[name]: value,
}));
};
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;
}
}
console.log('===> ', flightPlanData);
// 추가
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;
}
}
// 삭제
const handleDeleteArray = ({type, index, pIndex}) => {
const arrName = `${type}List`;
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;
}
}
const handlerDelete = async data => {
// dispatch(Actions.IDNTF_DELETE.request(data.arcrftSno));
};
useEffect(() => {
setAreaInfo(flightPlanArea);
}, [flightPlanArea]);
// 저장
const handleSave = () => {
if (!detailData.planSno) {
dispatch(Actions.FLIGHT_PLAN_CREATE.request(detailData));
} else {
dispatch(Actions.FLIGHT_PLAN_UPDATE.request(detailData));
}
}
// 삭제
const handleDelete = () => {
dispatch(Actions.FLIGHT_PLAN_DELETE.request(urlParams.planSno));
}
return (
<CustomDetailLayout title={"비행 계획 신청서"}>
<FlightPlanForm
data={flightPlanData}
openModal={openModal}
areaInfo={areaInfo}
params={params}
handlerSave={
pageType === 'create' ? handlerCreate : handlerUpdate
}
onChange={onChange}
handlerDelete={handlerDelete}
data={detailData}
handleModal={handleModal}
handleSave={handleSave}
handleDelete={handleDelete}
handleChange={handleChange}
handleAddArray={handleAddArray}
handleDeleteArray={handleDeleteArray}
// handlerSave={
// pageType === 'create' ? handlerCreate : handlerUpdate
// }
// onChange={onChange}
// handlerDelete={handlerDelete}
// handlerInput={handlerInput}
/>
<FlightPlanAreaModal
modal={modal}
save={saveFlightPlanArea}
setModal={setModal}
/>
{/*<FlightPlanAreaModal*/}
{/* modal={modal}*/}
{/* save={saveFlightPlanArea}*/}
{/* setModal={setModal}*/}
{/*/>*/}
</CustomDetailLayout>
)
}
};
export default FlightPlanDetailContainer;

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

@ -1,5 +1,5 @@
import { AxiosError } from 'axios';
import { createAsyncAction, ActionType} from 'typesafe-actions';
import { createAsyncAction, ActionType, createAction } from 'typesafe-actions';
import {
FlightAreaData,
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_SUCCESS = 'basis/flight/plan/detail/DETAIL_SUCCESS';
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_SUCCESS = 'basis/flight/plan/create/CREATE_SUCCESS';
@ -84,7 +85,8 @@ export const FLIGHT_PLAN_DETAIL = createAsyncAction(
FLIGHT_PLAN_DETAIL_SUCCESS,
FLIGHT_PLAN_DETAIL_FAILURE
)<number, FlightPlanData, AxiosError>();
// 상세 초기화
export const FLIGHT_PLAN_DETAIL_INIT = createAction(FLIGHT_PLAN_DETAIL_INITIAL)();
// 생성
export const FLIGHT_PLAN_CREATE = createAsyncAction(
FLIGHT_PLAN_CREATE_REQUEST,
@ -126,6 +128,7 @@ const actions = {
// FLIGHT_PLAN_AREA,
FLIGHT_PLAN_LIST,
FLIGHT_PLAN_DETAIL,
FLIGHT_PLAN_DETAIL_INIT,
FLIGHT_PLAN_CREATE,
FLIGHT_PLAN_UPDATE,
FLIGHT_PLAN_DELETE,

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

@ -13,20 +13,16 @@ export const flightPlanAPI = {
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);
const res = await axios.post(`api/bas/flight/plan/create`, data);
console.log('>>> rs : ', res);
return res;
},
@ -42,13 +38,13 @@ export const flightPlanAPI = {
console.log('>>> rs : ', res);
return res;
},
listPilot: async (groupId: number) => {
listPilot: async (groupId: string) => {
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) => {
listArcrft: async (groupId: string) => {
console.log('>>> rq : ', groupId)
const res = await axios.get(`api/bas/flight/plan/arcrft/${groupId}`);
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 {
areaList: FlightAreaData | undefined
@ -14,92 +14,129 @@ export interface FlightAreaData {
}
export interface FlightPlanArea {
address: '',
coordinates: '',
redius: '',
altitude_m: '',
altitude_ft: '',
address: string,
coordinates: string,
redius: string,
altitude_m: string,
altitude_ft: string,
}
export interface FlightPlanData {
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,
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: Date,
createDt: string,
updateUserId: string,
updateDt: Date,
areaList: FlightPlanAreaDataList,
pilotList: FlightPlanPilotDataList,
arcrftList: FlightPlanArcrftDataList,
docState: string,
updateDt: string,
areaList?: FlightPlanAreaDataList | undefined,
pilotList?: FlightPlanPilotDataList | undefined,
arcrftList?: FlightPlanArcrftDataList | undefined
// docState: string
}
export interface FlightPlanAreaData {
planAreaSno: number,
planAreaSno?: number,
planSno: number,
areaType: string,
fltMethod: string,
bufferZone: number,
fltElev: string,
createUserId: string,
createDt: Date,
updateUserId: string,
updateDt: Date,
coordList: FlightPlanAreaCoordData
docState: string,
createUserId?: string,
createDt?: string,
updateUserId?: string,
updateDt?: string,
coordList?: FlightPlanAreaCoordDataList | undefined
// docState: string,
}
export interface FlightPlanAreaDataList extends Array<FlightPlanAreaData> {};
export interface FlightPlanAreaCoordData {
planAreaCoordSno: number,
planAreaSno: number,
planAreaCoordSno?: number,
planAreaSno?: number,
lat: number,
lon: number,
createUserId: string,
createDt: Date,
docState: string
createUserId?: string,
createDt?: string
// docState: string
}
export interface FlightPlanAreaCoordData extends Array<FlightPlanAreaCoordData> {};
export interface FlightPlanAreaCoordDataList extends Array<FlightPlanAreaCoordData> {};
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 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> {};
// rq
export interface FlightPlanListRqData {
schFltStDt: Date,
schFltEndDt: Date,
schFltStDt: string,
schFltEndDt: string,
aprvlYn: string
}
export interface FlightPlanAprovRqData {
planSnoList: [number],
aprvlYn: string
@ -110,7 +147,275 @@ export const initFlight = {
areaList: undefined,
flightPlanArea: 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,
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 * as Actions from '../actions/basisFlightAction';
import { FlightState, initFlight } from '../models/basisFlightModel';
import { FlightState, initFlight, initFlightBas } from '../models/basisFlightModel';
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) =>
produce(state, draft => {
console.log('list : ', state, action);
const data = action.payload;
draft.list = data;
})
@ -30,15 +29,18 @@ export const flightReducer = createReducer<FlightState, Actions.FlightAction>(in
// 상세
.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_DETAIL_INIT, (state, action) =>
produce(state, draft => {
draft.detail = initFlightBas.initDetail
})
)
// 조종사 조회
.handleAction(Actions.FLIGHT_PLAN_PILOT_LIST.success, (state, action) =>
produce(state, draft => {
console.log('pilot : ', state, action);
const data = action.payload;
draft.pilotList = data;
})
@ -46,7 +48,6 @@ export const flightReducer = createReducer<FlightState, Actions.FlightAction>(in
// 기체 조회
.handleAction(Actions.FLIGHT_PLAN_ARCRFT_LIST.success, (state, action) =>
produce(state, draft => {
console.log('arcrft : ', state, action);
const data = action.payload;
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 Apis from '../apis/basisFlightApi';
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>) {
try {
@ -56,12 +62,11 @@ function* listAreaSaga(action: ActionType<typeof Actions.AREA_LIST.request>) {
// }
// }
// 비행계획서 목록
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({
@ -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(
// 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));
// }
// }
yield put(
Actions.FLIGHT_PLAN_DETAIL.success(response.data)
);
} catch (error: any) {
yield put(
Actions.FLIGHT_PLAN_DETAIL.failure(error)
);
}
}
// 비행계획서 등록
function* createPlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_CREATE.request>) {
try {
const detail = action.payload;
const res = yield call(Apis.flightPlanAPI.create, 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_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() {
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)
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'))
},
{
path: '/basis/flight/plan/detail/:id',
path: '/basis/flight/plan/detail/:planSno',
component: lazy(() => import('../../views/basis/flight/plan/FlightPlanDetail'))
},
];

Loading…
Cancel
Save