Browse Source

Merge branch 'master' of http://gitea.palntour.com/pav/pav-home

pull/2/head
김지은 2 years ago
parent
commit
c23747b2de
  1. 28
      package-lock.json
  2. 2
      package.json
  3. 203
      src/components/basis/flight/schedule/FlightScheduleGrid.js
  4. 22
      src/components/basis/flight/schedule/FlightScheduleRealTime.js
  5. 18
      src/components/basis/flight/schedule/FlightScheduleSearch.js
  6. 4
      src/components/basis/group/BasisGroupUsersSearch.js
  7. 6
      src/components/crud/grid/GridDatatable.js
  8. 2
      src/components/dashboard/DashboardDronList.js
  9. 10
      src/components/dashboard/DashboardGroupList.js
  10. 2
      src/containers/basis/flight/plan/FlightPlanContainer.js
  11. 2
      src/containers/basis/flight/schedule/FlightScheduleContainer.js
  12. 212
      src/containers/basis/group/BasisGroupUsersContainer.js
  13. 147
      src/modules/basis/flight/actions/basisFlightAction.ts
  14. 15
      src/modules/basis/flight/apis/basisFlightApi.ts
  15. 607
      src/modules/basis/flight/models/basisFlightModel.ts
  16. 7
      src/modules/basis/flight/reducers/basisFlightReducer.ts
  17. 173
      src/modules/basis/flight/sagas/basisFlightSaga.ts
  18. 11
      src/modules/basis/group/actions/basisGroupAction.ts
  19. 14
      src/modules/basis/group/models/basisGroupModel.ts
  20. 7
      src/modules/basis/group/reducers/basisGroupReducer.ts
  21. 21
      src/utility/hooks/useInterval.js
  22. 1
      src/views/weather/WeatherView.js

28
package-lock.json generated

@ -12896,11 +12896,6 @@
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
"integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
},
"lodash.orderby": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/lodash.orderby/-/lodash.orderby-4.6.0.tgz",
"integrity": "sha1-5pfwTOXXhSL1TZM4syuBozk+TrM="
},
"lodash.template": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
@ -13495,11 +13490,6 @@
"resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
"integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA=="
},
"nanoid": {
"version": "2.1.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz",
"integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA=="
},
"nanomatch": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
@ -20676,13 +20666,11 @@
"integrity": "sha512-exyAdFLAxtuM4wNwLYrlKyPYLiJ7e0mv9tqPAd3kq+k1CiJFtznevR3yP0icv5q/y200w+lzNgi7TQn1Wrhu0w=="
},
"react-data-table-component": {
"version": "6.11.2",
"resolved": "https://registry.npmjs.org/react-data-table-component/-/react-data-table-component-6.11.2.tgz",
"integrity": "sha512-xoaTVTX4svgY3norL707GSUZJ5Q0FRZ1g2QY5oI5soiNtGMor9yGTXjnMq6mDmL9A4a7lmA+4xntoEEMJMcIvA==",
"version": "7.5.3",
"resolved": "https://registry.npmjs.org/react-data-table-component/-/react-data-table-component-7.5.3.tgz",
"integrity": "sha512-JhatRTgThAAa1HobPaPmkNPsjLT6+fnMIdtcXRCy+0bSYN7XJnTgob9Qyi4bjHh/8tMPTHtxZCV/TKiPwRvFMA==",
"requires": {
"deepmerge": "^4.2.2",
"lodash.orderby": "^4.6.0",
"shortid": "^2.2.15"
"deepmerge": "^4.2.2"
}
},
"react-datepicker": {
@ -23441,14 +23429,6 @@
"smoothscroll-polyfill": "^0.4.4"
}
},
"shortid": {
"version": "2.2.16",
"resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz",
"integrity": "sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==",
"requires": {
"nanoid": "^2.1.0"
}
},
"side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",

2
package.json

@ -69,7 +69,7 @@
"react-copy-to-clipboard": "5.0.2",
"react-country-flag": "2.0.1",
"react-csv": "^2.0.3",
"react-data-table-component": "6.11.2",
"react-data-table-component": "^7.5.3",
"react-datepicker": "^4.2.1",
"react-dom": "17.0.1",
"react-draft-wysiwyg": "1.14.5",

203
src/components/basis/flight/schedule/FlightScheduleGrid.js

@ -0,0 +1,203 @@
import { useRef } from 'react';
import { GridDatabase } from '@src/components/crud/grid/GridDatatable';
import { Row, Col, Card } from 'reactstrap';
import FlightScheduleRealTime from './FlightScheduleRealTime';
import { useSelector } from 'react-redux';
import moment from 'moment';
import DataTable from 'react-data-table-component';
const KR_TIME_DIFF = 9 * 60 * 60 * 1000;
/**
* 비행 : B
* 비행 : F
* 비행 완료 : S
*/
function FlightScheduleGrid() {
const timeRef = useRef(null);
const { scheduleList } = useSelector(state => state.flightState);
// const [list, setList] = useState(
// new Array(10).fill({ groupNm: 'test', groupNm: 'test' })
// );
const fillZero = (width, str) => {
return str.length >= width
? str
: new Array(width - str.length + 1).join('0') + str; //남는 길이만큼 0으로 채움
};
const columns = [
{
name: '그룹 명',
selector: 'groupNm',
minWidth: '150px',
sortable: true,
cell: row => {
return row.groupNm;
}
// conditionalCellStyles: [
// {
// when: row => {
// return true;
// },
// style: row => {
// let color;
// if (row.statusCd === 's') {
// color = '#82868B';
// }
// return {
// backgroundColor: '#82868B',
// color: 'white'
// };
// }
// }
// ]
},
{
name: '기체 소유자',
selector: 'ownerNm',
minWidth: '150px',
sortable: true,
cell: row => {
return row.ownerNm;
}
},
{
name: '기체 식별번호',
selector: 'idntfNum',
minWidth: '150px',
sortable: true,
cell: row => {
return row.idntfNum;
}
},
{
name: '출발지',
selector: 'startAddress',
minWidth: '150px',
sortable: true,
cell: row => {
return row.startAddress;
}
},
{
name: '비행 시작 시간',
selector: 'schFltStDt ',
minWidth: '150px',
sortable: true,
cell: row => {
return moment(row.schFltStDt).format('HH:mm');
}
},
{
name: '도착지',
selector: 'endAddress',
minWidth: '150px',
sortable: true,
cell: row => {
return row.endAddress;
}
},
{
name: '비행 종료 시간',
selector: 'schFltEndDt',
minWidth: '150px',
sortable: true,
cell: row => {
return moment(row.schFltEndDt).format('HH:mm');
}
},
{
name: '총 예상 비행시간',
selector: 'groupNm',
minWidth: '150px',
sortable: true,
cell: row => {
const endDate = new Date(row.schFltEndDt);
const startDate = new Date(row.schFltStDt);
const a = endDate - startDate;
let time = fillZero(
2,
String(Math.floor((a % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)))
);
let hore = fillZero(
2,
String(Math.floor((a % (1000 * 60 * 60)) / (1000 * 60)))
);
return `${time}:${hore}`;
}
},
{
name: '상태',
selector: 'statusCd',
minWidth: '150px',
sortable: true,
cell: row => {
switch (row.statusCd) {
case 'B':
return '비행전';
case 'F':
return '비행중';
default:
return '비행완료';
}
}
}
];
const conditionalRowStyles = [
{
when: row => true,
style: {
backgroundColor: 'red'
}
}
];
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
style={{
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
width: '100%'
}}
>
<div style={{ display: 'flex', alignItems: 'center' }}>
<h4>비행운항 스케줄 목록</h4>
<span className='search-case'>
검색결과 {scheduleList.length}
</span>
</div>
<FlightScheduleRealTime ref={timeRef} />
</div>
</div>
<div className='invoice-list-wrapper'>
<Card>
<div className='invoice-list-dataTable'>
<GridDatabase
title={'비행이력'}
data={scheduleList}
count={scheduleList.length}
columns={columns}
pagination={false}
conditionalRowStyles={conditionalRowStyles}
/>
</div>
</Card>
</div>
</Col>
</Row>
</div>
);
}
export default FlightScheduleGrid;

22
src/components/basis/flight/schedule/FlightScheduleRealTime.js

@ -0,0 +1,22 @@
import { useState, forwardRef } from 'react';
import moment from 'moment';
import useInterval from '@src/utility/hooks/useInterval';
const KR_TIME_DIFF = 9 * 60 * 60 * 1000;
const FlightScheduleRealTime = forwardRef(({}, ref) => {
const [currTime, setCurrTime] = useState(new Date());
const utc = currTime.getTime() + currTime.getTimezoneOffset() * 60 * 1000;
const kr_curr = new Date(utc + KR_TIME_DIFF);
useInterval(() => {
setCurrTime(new Date());
setTime(moment(new Date()).format('HH:mm:ss'));
}, [1000]);
const [time, setTime] = useState(moment(kr_curr).format('HH:mm:ss'));
return <div ref={ref}>현재시간 UTC : {time.toString()}</div>;
});
export default FlightScheduleRealTime;

18
src/components/basis/flight/schedule/FlightScheduleSearch.js

@ -3,16 +3,32 @@ import { Row, Col, Button, Card, CardBody } from 'reactstrap';
import { Search, Calendar } from 'react-feather';
import moment from 'moment';
import Flatpickr from 'react-flatpickr';
import { FLIGHT_SCHEDULE_LIST } from '@src/modules/basis/flight/actions/basisFlightAction';
import { useDispatch } from 'react-redux';
import useInterval from '@src/utility/hooks/useInterval';
function FlightScheduleSearch() {
const dispatch = useDispatch();
const [date, setDate] = useState(
moment().subtract('day').format('YYYY-MM-DD')
);
const [isSearch, setIsSearch] = useState(false);
useInterval(() => {
if (isSearch) {
dispatch(FLIGHT_SCHEDULE_LIST.request(date));
}
}, [10000]);
const handlerChangeDate = val => {
setDate(moment(val[0]).format('YYYY-MM-DD'));
};
const handlerSearch = () => {
setIsSearch(true);
dispatch(FLIGHT_SCHEDULE_LIST.request(date));
};
return (
<div className='pal-card-box'>
<Row>
@ -22,7 +38,7 @@ function FlightScheduleSearch() {
<h4>검색조건</h4>
</div>
<div className='d-flex align-items-center'>
<Button.Ripple color='primary' size='sm' onClick={e => {}}>
<Button.Ripple color='primary' size='sm' onClick={handlerSearch}>
<Search size={16} />
검색
</Button.Ripple>

4
src/components/basis/group/BasisGroupUsersSearch.js

@ -49,7 +49,7 @@ export const BasisGroupUsersSearch = props => {
<CardBody className='pal-card-body'>
<div className='search-cont'>
<dl>
<dt>
{/* <dt>
<div className='search-box'>
<div className='search-list-ti'>그룹명</div>
<div className='search-list'>
@ -74,7 +74,7 @@ export const BasisGroupUsersSearch = props => {
</div>
</div>
</div>
</dt>
</dt> */}
<dt>
<div className='search-box'>
<div className='search-list-ti'>사용자 </div>

6
src/components/crud/grid/GridDatatable.js

@ -38,9 +38,9 @@ export const GridDatabase = props => {
}}
selectableRows={props.selectableRows}
selectableRowsComponent={props.selectableRowsComponent}
onSelectedRowsChange={
props.onSelectedRowsChange ? props.onSelectedRowsChange : null
}
{...(props.onSelectedRowsChange
? { onSelectedRowsChange: props.onSelectedRowsChange }
: {})}
/>
</div>
</>

2
src/components/dashboard/DashboardDronList.js

@ -5,7 +5,7 @@ export const DashboardDronList = props => {
return (
<Card>
<CardHeader className=''>
<CardTitle tag='h4'> 기체 정보</CardTitle>
<CardTitle tag='h4'>기체 정보</CardTitle>
<button onClick={e => props.pageMove()}>
<Plus />
</button>

10
src/components/dashboard/DashboardGroupList.js

@ -5,7 +5,7 @@ export const DashboardGroupList = props => {
return (
<Card>
<CardHeader className=''>
<CardTitle tag='h4'> 그룹 정보</CardTitle>
<CardTitle tag='h4'>그룹 정보</CardTitle>
<button onClick={e => props.pageMove()}>
<Plus />
</button>
@ -21,10 +21,10 @@ export const DashboardGroupList = props => {
<tbody>
{props.data?.map((item, index) => {
return (
<tr key={index}>
<td>{item.groupNm}</td>
<td>{item.createDt}</td>
</tr>
<tr key={index}>
<td>{item.groupNm}</td>
<td>{item.createDt}</td>
</tr>
);
})}
</tbody>

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

@ -60,8 +60,6 @@ const FlightPlanContainer = () => {
}));
};
const handleGroupSelect = ({ groupId, groupNm, groupAuthCd }) => {
// 권한 상관 없이 모두 조회 가능
const param = searchData;

2
src/containers/basis/flight/schedule/FlightScheduleContainer.js

@ -1,10 +1,12 @@
import { CustomMainLayout } from '@src/components/layout/CustomMainLayout';
import FlightScheduleSearch from '@src/components/basis/flight/schedule/FlightScheduleSearch';
import FlightScheduleGrid from '@src/components/basis/flight/schedule/FlightScheduleGrid';
function FlightScheduleContainer() {
return (
<CustomMainLayout title={'비행운항 스케줄'}>
<FlightScheduleSearch />
<FlightScheduleGrid />
</CustomMainLayout>
);
}

212
src/containers/basis/group/BasisGroupUsersContainer.js

@ -1,27 +1,35 @@
import { useEffect, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { useHistory } from 'react-router-dom';
import { Button } from 'reactstrap';
import { Button, Row, Col } from 'reactstrap';
import { BasisGroupGrid } from '../../../components/basis/group/BasisGroupGrid';
import { BasisGroupUsersGrid } from '../../../components/basis/group/BasisGroupUsersGrid';
import { BasisGroupUsersSearch } from '../../../components/basis/group/BasisGroupUsersSearch';
import { CustomMainLayout } from '../../../components/layout/CustomMainLayout';
import { ConfirmModal } from '../../../components/modal/ConfirmModal';
import { InfoModal } from '../../../components/modal/InfoModal';
import * as Actions from '../../../modules/basis/group/actions/basisGroupAction';
export const BasisGroupUsersContainer = props => {
const { userList, userCount, joinList, joinListCount } = useSelector(
state => state.groupState
);
const { user } = useSelector(state => state.authState);
const dispatch = useDispatch();
const history = useHistory();
const {
joinList,
joinListCount,
selectGroup,
groupList,
groupListCount,
userList,
userListCount
} = useSelector(state => state.groupState);
const { user } = useSelector(state => state.authState);
const [params, setParams] = useState({
cstmrSno: user?.cstmrSno
cstmrSno: user?.cstmrSno,
groupId: '',
groupAuthCd: '',
aprvlYn: ''
});
const titleName = '사용자 관리';
const [saveData, setSaveData] = useState({
@ -36,7 +44,76 @@ export const BasisGroupUsersContainer = props => {
desc: ''
});
const [infoModal, setInfoModal] = useState({
isOpen: false,
title: '',
desc: ''
});
const columns = [
{
name: '그룹명',
selector: 'groupNm',
minWidth: '102px',
sortable: true,
cell: row => {
return row?.groupNm;
// return selectData;
}
},
{
name: '그룹 코드',
selector: 'groupId',
minWidth: '102px',
sortable: true,
cell: row => {
return row?.groupId;
}
},
{
name: '',
sortable: true,
cell: row => {
// return selectData?.groupId === row?.groupId ? (
// <Button.Ripple
// color='danger'
// className='badge badge-danger'
// onClick={() => handlerCancel()}
// >
// 선택취소
// </Button.Ripple>
// ) : (
// <Button.Ripple
// color='primary'
// className='badge badge-primary'
// onClick={() =>
// handlerDetail(
// row?.groupId,
// row?.groupNm,
// row?.groupAuthCd,
// row?.aprvlYn
// )
// }
// >
// 상세보기
// </Button.Ripple>
// );
return (
<Button.Ripple
color='primary'
className='badge badge-primary'
onClick={() =>
handlerDetail(row?.groupId, row?.groupAuthCd, row?.aprvlYn)
}
>
상세보기
</Button.Ripple>
);
}
}
];
const userColumns = [
{
name: '그룹명',
selector: 'groupNm',
@ -68,7 +145,7 @@ export const BasisGroupUsersContainer = props => {
{
name: '사용자 ID',
selector: 'userId',
minWidth: '150px',
minWidth: '120px',
sortable: true,
cell: row => {
return row?.userId;
@ -78,7 +155,7 @@ export const BasisGroupUsersContainer = props => {
{
name: '권한명',
selector: 'groupAuthCd',
minWidth: '102px',
minWidth: '105px',
sortable: true,
cell: row => {
return row?.groupAuthCd;
@ -87,7 +164,7 @@ export const BasisGroupUsersContainer = props => {
{
name: '가입 일시',
selector: 'joinDt',
minWidth: '200px',
minWidth: '150px',
sortable: true,
cell: row => {
return row?.joinDt;
@ -166,38 +243,54 @@ export const BasisGroupUsersContainer = props => {
}
];
// useEffect(() => {
// handlerSearch();
// }, []);
const handlerSearch = () => {
if (params.cstmrSno && user?.cstmrSno) {
dispatch(
Actions.USER_LIST.request({
searchParams: params,
cstmrSno: user?.cstmrSno
})
);
}
};
useEffect(() => {
if (user?.cstmrSno) {
dispatch(Actions.JOIN_LIST.request({ cstmrSno: user?.cstmrSno }));
// setParams({
// ...params,
// cstmrSno: user?.cstmrSno
// });
// dispatch(
// Actions.USER_LIST.request({
// searchParams: { cstmrSno: user?.cstmrSno }
// })
// );
setParams({
...params,
cstmrSno: user?.cstmrSno
});
}
}, [user]);
// useEffect(() => {
// }, [params]);
const handlerDetail = (groupId, groupAuthCd, aprvlYn) => {
if (
groupAuthCd === 'MASTER' ||
user.authId === 'SUPER' ||
user.authId === 'ADMIN' ||
(aprvlYn === 'Y' && groupAuthCd === 'LEADER')
) {
const param = params;
param.groupId = groupId;
param.groupAuthCd = groupAuthCd;
param.aprvlYn = aprvlYn;
useEffect(() => {
handlerSearch();
}, []);
const handlerSearch = () => {
if (params.cstmrSno && user?.cstmrSno) {
dispatch(
Actions.USER_LIST.request({
searchParams: params,
cstmrSno: user?.cstmrSno
searchParams: param
})
);
} else {
setInfoModal({
isOpen: true,
title: '권한 확인',
desc: '사용자관리 확인을 위해서는 운영자 권한이 필요합니다. 운영자에게 권한을 부여받고 다시 시도해 주세요.'
});
}
};
@ -274,7 +367,7 @@ export const BasisGroupUsersContainer = props => {
return (
<CustomMainLayout title={titleName}>
<BasisGroupUsersSearch
{/* <BasisGroupUsersSearch
handlerInput={handlerInput}
handlerSearch={handlerSearch}
params={params}
@ -284,10 +377,56 @@ export const BasisGroupUsersContainer = props => {
<BasisGroupUsersGrid
data={userList}
title={'사용자'}
columns={columns}
columns={userColumns}
count={userCount}
pagination={false}
/>
/> */}
<div className='pal-card-box'>
<Row>
<Col sm='4'>
<BasisGroupGrid
data={joinList}
title={'그룹'}
columns={columns}
count={joinListCount}
pagination={true}
/>
</Col>
<Col sm='8'>
{!userList ? (
<div className='no-dataTable'>
그룹 목록에서 상세보기를 클릭하세요.
</div>
) : (
<>
<BasisGroupUsersSearch
handlerInput={handlerInput}
// handlerSearch={handlerSearch}
params={params}
onKeyPress={onKeyPress}
setParams={setParams}
/>
{/* <BasisGroupUsersGrid
data={userList}
title={'그룹'}
columns={userColumns}
count={userListCount}
pagination={false}
/> */}
</>
)}
</Col>
<Col sm='12'>
<BasisGroupUsersGrid
data={userList}
title={'그룹'}
columns={userColumns}
count={userListCount}
pagination={false}
/>
</Col>
</Row>
</div>
<ConfirmModal
modal={modal}
@ -295,6 +434,7 @@ export const BasisGroupUsersContainer = props => {
handlerConfirm={handlerAuthSave}
color='primary'
/>
{/* <InfoModal model={infoModal} setModal={setInfoModal} /> */}
</CustomMainLayout>
);
};

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

@ -6,10 +6,14 @@ import {
FlightPlanArcrftDataList,
FlightPlanAreaDataList,
FlightPlanData,
FlightPlanListRqData, FlightPlanPilotDataList, PilotSelectData, SelectGroupData, BasFlightAprovData
FlightPlanListRqData,
FlightPlanPilotDataList,
PilotSelectData,
SelectGroupData,
BasFlightAprovData,
BasFlightScheduleList
} from '../models/basisFlightModel';
// 공역 조회
const PUBLIC_AREA_LIST_REQUEST = 'basis/flight/public_area/LIST_REQUEST';
const PUBLIC_AREA_LIST_SUCCESS = 'basis/flight/public_area/LIST_SUCCESS';
@ -42,17 +46,23 @@ 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_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_PILOT_SELECT = 'basis/flight/plan/pilot_list/PILOT_SELECT';
// 기체 조회
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_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_ARCRFT_SELECT = 'basis/flight/plan/arcrft_list/ARCRFT_SELECT';
@ -78,29 +88,47 @@ const AREA_BUFFER_LIST_SUCCESS = 'basis/flight/plan/area/BUFFER_LIST_SUCCESS';
const AREA_BUFFER_LIST_FAILURE = 'basis/flight/plan/area/BUFFER_LIST_FAILURE';
// 비행계획서 조회(승인)
const FLIGHT_APRV_LIST_REQUEST = 'basis/flight/aprv/list/FLIGHT_APRV_LIST_REQUEST';
const FLIGHT_APRV_LIST_SUCCESS = 'basis/flight/aprv/list/FLIGHT_APRV_LIST_SUCCESS';
const FLIGHT_APRV_LIST_FAILURE = 'basis/flight/aprv/list/FLIGHT_APRV_LIST_FAILURE';
const FLIGHT_APRV_LIST_REQUEST =
'basis/flight/aprv/list/FLIGHT_APRV_LIST_REQUEST';
const FLIGHT_APRV_LIST_SUCCESS =
'basis/flight/aprv/list/FLIGHT_APRV_LIST_SUCCESS';
const FLIGHT_APRV_LIST_FAILURE =
'basis/flight/aprv/list/FLIGHT_APRV_LIST_FAILURE';
// 비행계획서 승인/미승인 처리
const FLIGHT_APRV_PROC_REQUEST = 'basis/flight/aprv/proc/FLIGHT_APRV_PROC_REQUEST';
const FLIGHT_APRV_PROC_SUCCESS = 'basis/flight/aprv/proc/FLIGHT_APRV_PROC_SUCCESS';
const FLIGHT_APRV_PROC_FAILURE = 'basis/flight/aprv/proc/FLIGHT_APRV_PROC_FAILURE';
const FLIGHT_APRV_PROC_REQUEST =
'basis/flight/aprv/proc/FLIGHT_APRV_PROC_REQUEST';
const FLIGHT_APRV_PROC_SUCCESS =
'basis/flight/aprv/proc/FLIGHT_APRV_PROC_SUCCESS';
const FLIGHT_APRV_PROC_FAILURE =
'basis/flight/aprv/proc/FLIGHT_APRV_PROC_FAILURE';
//지도 검색
const FLIGHT_SEARCH_AREA_REQUEST = 'basis/flight/search/area/FLIGHT_SEARCH_AREA_REQUEST';
const FLIGHT_SEARCH_AREA_SUCCESS = 'basis/flight/search/area/FLIGHT_SEARCH_AREA_SUCCESS';
const FLIGHT_SEARCH_AREA_FAILURE = 'basis/flight/search/area/FLIGHT_SEARCH_AREA_FAILURE';
const FLIGHT_SEARCH_AREA_REQUEST =
'basis/flight/search/area/FLIGHT_SEARCH_AREA_REQUEST';
const FLIGHT_SEARCH_AREA_SUCCESS =
'basis/flight/search/area/FLIGHT_SEARCH_AREA_SUCCESS';
const FLIGHT_SEARCH_AREA_FAILURE =
'basis/flight/search/area/FLIGHT_SEARCH_AREA_FAILURE';
// 비행운항 스케줄
const FLIGHT_SCHEDULE_REQUEST =
'basis/flight/schedule/list/FLIGHT_SCHEDULE_REQUEST';
const FLIGHT_SCHEDULE_SUCCESS =
'basis/flight/schedule/list/FLIGHT_SCHEDULE_SUCCESS';
const FLIGHT_SCHEDULE_FAILURE =
'basis/flight/schedule/list/FLIGHT_SCHEDULE_FAILURE';
export const SEARCH_AREA = createAsyncAction(
FLIGHT_SEARCH_AREA_REQUEST,
FLIGHT_SEARCH_AREA_SUCCESS,
FLIGHT_SEARCH_AREA_FAILURE
)<{query: string}, string, AxiosError>();
)<{ query: string }, string, AxiosError>();
export const PUBLIC_AREA_LIST = createAsyncAction(
PUBLIC_AREA_LIST_REQUEST,
PUBLIC_AREA_LIST_SUCCESS,
PUBLIC_AREA_LIST_FAILURE
PUBLIC_AREA_LIST_REQUEST,
PUBLIC_AREA_LIST_SUCCESS,
PUBLIC_AREA_LIST_FAILURE
)<PublicAreaData, { data: PublicAreaData }, AxiosError>();
// 목록
@ -117,12 +145,14 @@ export const FLIGHT_PLAN_DETAIL = createAsyncAction(
FLIGHT_PLAN_DETAIL_FAILURE
)<number, FlightPlanData, AxiosError>();
// 상세 초기화
export const FLIGHT_PLAN_DETAIL_INIT = createAction(FLIGHT_PLAN_DETAIL_INITIAL)();
export const FLIGHT_PLAN_DETAIL_INIT = createAction(
FLIGHT_PLAN_DETAIL_INITIAL
)();
// 생성
export const FLIGHT_PLAN_CREATE = createAsyncAction(
FLIGHT_PLAN_CREATE_REQUEST,
FLIGHT_PLAN_CREATE_SUCCESS,
FLIGHT_PLAN_CREATE_FAILURE
FLIGHT_PLAN_CREATE_REQUEST,
FLIGHT_PLAN_CREATE_SUCCESS,
FLIGHT_PLAN_CREATE_FAILURE
)<FlightPlanData, string, AxiosError>();
// 수정
@ -147,7 +177,9 @@ export const FLIGHT_PLAN_PILOT_LIST = createAsyncAction(
)<string, FlightPlanPilotDataList, AxiosError>();
// 조종사 선택
export const PILOT_SELECT = createAction(FLIGHT_PLAN_PILOT_SELECT)<PilotSelectData>();
export const PILOT_SELECT = createAction(
FLIGHT_PLAN_PILOT_SELECT
)<PilotSelectData>();
// 기체 목록
export const FLIGHT_PLAN_ARCRFT_LIST = createAsyncAction(
@ -157,19 +189,26 @@ export const FLIGHT_PLAN_ARCRFT_LIST = createAsyncAction(
)<string, FlightPlanArcrftDataList, AxiosError>();
// 조종사 선택
export const ARCRFT_SELECT = createAction(FLIGHT_PLAN_ARCRFT_SELECT)<FlightPlanArcrftData>();
export const ARCRFT_SELECT = createAction(
FLIGHT_PLAN_ARCRFT_SELECT
)<FlightPlanArcrftData>();
// 조종사, 기체 선택 초기화
export const PILOT_ARCRFT_SELECT_INIT = createAction(PILOT_ARCRFT_SELECT_INITIAL)();
export const PILOT_ARCRFT_SELECT_INIT = createAction(
PILOT_ARCRFT_SELECT_INITIAL
)();
// 비행 구역 좌표 저장 (스텝2 데이터 공유)
export const AREA_COORDINATE_LIST_SAVE = createAction(AREA_COORDINATE_LIST)<FlightPlanAreaDataList>();
export const AREA_COORDINATE_LIST_SAVE =
createAction(AREA_COORDINATE_LIST)<FlightPlanAreaDataList>();
// 비행 구역 상세 저장
export const AREA_DETAIL_LIST_SAVE = createAction(AREA_DETAIL_LIST)<FlightPlanAreaDataList>();
export const AREA_DETAIL_LIST_SAVE =
createAction(AREA_DETAIL_LIST)<FlightPlanAreaDataList>();
// 비행 계획서 그룹 선택
export const FLIGHT_PLAN_GROUP_SELECT = createAction(ROUP_SELECT)<SelectGroupData>();
export const FLIGHT_PLAN_GROUP_SELECT =
createAction(ROUP_SELECT)<SelectGroupData>();
// 비행 구역 상세 값 초기화
export const AREA_DETAIL_INIT = createAction(AREA_DETAIL_INITIAL)();
@ -194,29 +233,35 @@ export const FLIGHT_APRV_PROC = createAsyncAction(
FLIGHT_APRV_PROC_FAILURE
)<BasFlightAprovData, string, AxiosError>();
export const FLIGHT_SCHEDULE_LIST = createAsyncAction(
FLIGHT_SCHEDULE_REQUEST,
FLIGHT_SCHEDULE_SUCCESS,
FLIGHT_SCHEDULE_FAILURE
)<string, [BasFlightScheduleList], AxiosError>();
const actions = {
PUBLIC_AREA_LIST,
// FLIGHT_PLAN_AREA,
FLIGHT_PLAN_LIST,
FLIGHT_PLAN_DETAIL,
FLIGHT_PLAN_DETAIL_INIT,
FLIGHT_PLAN_CREATE,
FLIGHT_PLAN_UPDATE,
FLIGHT_PLAN_DELETE,
FLIGHT_PLAN_PILOT_LIST,
FLIGHT_PLAN_ARCRFT_LIST,
PILOT_SELECT,
ARCRFT_SELECT,
PILOT_ARCRFT_SELECT_INIT,
AREA_COORDINATE_LIST_SAVE,
AREA_DETAIL_LIST_SAVE,
FLIGHT_PLAN_GROUP_SELECT,
FLIGHT_PLAN_AREA_BUFFER_LIST,
AREA_DETAIL_INIT,
FLIGHT_APRV_LIST,
FLIGHT_APRV_PROC,
SEARCH_AREA
// FLIGHT_PLAN_AREA,
FLIGHT_PLAN_LIST,
FLIGHT_PLAN_DETAIL,
FLIGHT_PLAN_DETAIL_INIT,
FLIGHT_PLAN_CREATE,
FLIGHT_PLAN_UPDATE,
FLIGHT_PLAN_DELETE,
FLIGHT_PLAN_PILOT_LIST,
FLIGHT_PLAN_ARCRFT_LIST,
PILOT_SELECT,
ARCRFT_SELECT,
PILOT_ARCRFT_SELECT_INIT,
AREA_COORDINATE_LIST_SAVE,
AREA_DETAIL_LIST_SAVE,
FLIGHT_PLAN_GROUP_SELECT,
FLIGHT_PLAN_AREA_BUFFER_LIST,
AREA_DETAIL_INIT,
FLIGHT_APRV_LIST,
FLIGHT_APRV_PROC,
SEARCH_AREA,
FLIGHT_SCHEDULE_LIST
};
export type FlightAction = ActionType<typeof actions>;

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

@ -8,7 +8,6 @@ import {
FlightPlanListRqData
} from '../models/basisFlightModel';
export const flightPlanAPI = {
area: async () => {
const res = await axios.get(`api/bas/flight/area`);
@ -54,7 +53,7 @@ export const flightPlanAPI = {
const res = await axios.post(`api/bas/flight/plan/area/buffer`, data);
return res;
},
aprvList: async (data: FlightPlanListRqData) => {
aprvList: async (data: FlightPlanListRqData) => {
const queryString = qs.stringify(data, {
addQueryPrefix: true,
arrayFormat: 'repeat'
@ -67,8 +66,12 @@ export const flightPlanAPI = {
return res;
},
searchArea: async(param) => {
return await axios.get(`api/bas/flight/plan/area/search?query=${param.query}`);
searchArea: async param => {
return await axios.get(
`api/bas/flight/plan/area/search?query=${param.query}`
);
},
scheduleList: async (date: string) => {
return await axios.get(`api/bas/flight/schedule?searchDate=${date}`);
}
}
};

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

@ -1,178 +1,195 @@
import moment from "moment";
import moment from 'moment';
export interface FlightState {
publicAreaList: PublicAreaData | undefined
flightPlanArea: FlightPlanArea | undefined
list: [FlightPlanData] | undefined
detail: FlightPlanData | undefined
pilotList: FlightPlanPilotDataList | undefined
arcrftList: FlightPlanArcrftDataList | undefined
pilotSelect: PilotSelectData | undefined
arcrftSelect: FlightPlanArcrftData | undefined
areaCoordList: FlightPlanAreaData[] | undefined
areaList: FlightPlanAreaData[] | undefined
selectGroup: SelectGroupData | undefined
aprvList: [FlightPlanData] | undefined
aprvProc: any | undefined
publicAreaList: PublicAreaData | undefined;
flightPlanArea: FlightPlanArea | undefined;
list: [FlightPlanData] | undefined;
detail: FlightPlanData | undefined;
pilotList: FlightPlanPilotDataList | undefined;
arcrftList: FlightPlanArcrftDataList | undefined;
pilotSelect: PilotSelectData | undefined;
arcrftSelect: FlightPlanArcrftData | undefined;
areaCoordList: FlightPlanAreaData[] | undefined;
areaList: FlightPlanAreaData[] | undefined;
selectGroup: SelectGroupData | undefined;
aprvList: [FlightPlanData] | undefined;
aprvProc: any | undefined;
scheduleList: BasFlightScheduleList[] | [];
}
export interface SelectGroupData {
cstmrSno: number,
groupId: string,
groupNm: string,
cstmrSno: number;
groupId: string;
groupNm: string;
}
export interface PublicAreaData {
publicAreaList: []
publicAreaList: [];
}
export interface FlightPlanArea {
address: string,
coordinates: string,
redius: string,
altitude_m: string,
altitude_ft: string,
address: string;
coordinates: string;
redius: string;
altitude_m: string;
altitude_ft: string;
}
export interface FlightPlanData {
planSno?: number,
groupId: string,
cstmrSno: number,
memberName: string,
email: string,
hpno: string,
clncd: string,
addr: string,
addrDtlCn: string,
zip: string,
schFltStDt: string,
schFltEndDt: string,
fltPurpose: string,
aprvlYn: string,
delYn: string,
createUserId: string,
createDt: string,
updateUserId: string,
updateDt: string,
areaList?: FlightPlanAreaDataList | undefined,
pilotList?: FlightPlanPilotDataList | undefined,
arcrftList?: FlightPlanArcrftDataList | undefined
planSno?: number;
groupId: string;
cstmrSno: number;
memberName: string;
email: string;
hpno: string;
clncd: string;
addr: string;
addrDtlCn: string;
zip: string;
schFltStDt: string;
schFltEndDt: string;
fltPurpose: string;
aprvlYn: string;
delYn: string;
createUserId: string;
createDt: string;
updateUserId: string;
updateDt: string;
areaList?: FlightPlanAreaDataList | undefined;
pilotList?: FlightPlanPilotDataList | undefined;
arcrftList?: FlightPlanArcrftDataList | undefined;
// docState: string
}
export interface FlightPlanAreaData {
planAreaSno?: number,
planSno: number,
areaType: string,
fltMethod: string,
bufferZone: number,
fltElev: string,
createUserId?: string,
createDt?: string,
updateUserId?: string,
updateDt?: string,
coordList?: FlightPlanAreaCoordDataList | undefined
bufferCoordList?: FlightPlanAreaCoordDataList | undefined
planAreaSno?: number;
planSno: number;
areaType: string;
fltMethod: string;
bufferZone: number;
fltElev: string;
createUserId?: string;
createDt?: string;
updateUserId?: string;
updateDt?: string;
coordList?: FlightPlanAreaCoordDataList | undefined;
bufferCoordList?: FlightPlanAreaCoordDataList | undefined;
// docState: string,
}
export interface FlightPlanAreaDataList extends Array<FlightPlanAreaData> {};
export interface FlightPlanAreaDataList extends Array<FlightPlanAreaData> {}
export interface FlightPlanAreaCoordData {
planAreaCoordSno?: number,
planAreaSno?: number,
lat: number,
lon: number,
createUserId?: string,
createDt?: string
planAreaCoordSno?: number;
planAreaSno?: number;
lat: number;
lon: number;
createUserId?: string;
createDt?: string;
// docState: string
}
export interface FlightPlanAreaCoordDataList 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
planPilotSno?: number;
planSno?: number;
cstmrSno?: number;
groupNm: string;
memberName: string;
email: string;
hpno: string;
clncd: string;
addr: string;
addrDtlCn: string;
zip: string;
qlfcNo: string;
carrer: string;
createUserId: string;
createDt: string;
updateUserId: string;
updateDt: string;
// docState: string
}
export interface FlightPlanPilotDataList extends Array<FlightPlanPilotData> {};
export interface FlightPlanPilotDataList extends Array<FlightPlanPilotData> {}
export interface FlightPlanArcrftData {
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
planArcrftSno: number;
planSno: number;
arcrftSno: number;
idntfNum: string;
groupNm: string;
prdctNum: string;
arcrftTypeCd: string;
arcrftModelNm: string;
prdctCmpnNm: string;
prdctDate: string;
arcrftLngth: number;
arcrftWdth: number;
arcrftHght: number;
arcrftWght: number;
wghtTypeCd: string;
imageUrl: string;
takeoffWght: number;
useYn: string;
cameraYn: string;
insrncYn: string;
ownerNm: string;
createUserId: string;
createDt: string;
updateUserId: string;
updateDt: string;
// docState: string
}
export interface FlightPlanArcrftDataList extends Array<FlightPlanArcrftData> {};
export interface FlightPlanArcrftDataList extends Array<FlightPlanArcrftData> {}
// rq
export interface FlightPlanListRqData {
groupId: string,
cstmrSno: number,
schFltStDt: string,
schFltEndDt: string,
aprvlYn: string
groupId: string;
cstmrSno: number;
schFltStDt: string;
schFltEndDt: string;
aprvlYn: string;
}
export interface FlightPlanAprovRqData {
planSnoList: [number],
aprvlYn: string
planSnoList: [number];
aprvlYn: string;
}
export interface PilotSelectData {
groupNm: string,
cstmrSno: string,
memberName: string,
email: string,
hpno: string,
clncd: string,
addr: string,
addrDtlCn: string,
zip: string
groupNm: string;
cstmrSno: string;
memberName: string;
email: string;
hpno: string;
clncd: string;
addr: string;
addrDtlCn: string;
zip: string;
}
export interface BasFlightAprovData {
planSnoList: [number]
aprvlYn: string
planSnoList: [number];
aprvlYn: string;
}
export interface BasFlightScheduleList {
groupId: string;
groupNm: string;
memberName: string;
ownerNm: string;
idntfNum: string;
schFltStDt: string;
schFltEndDt: string;
}
export interface BasFlightScheduleData {
count: number;
list: [BasFlightScheduleList];
}
export const initFlight = {
@ -195,8 +212,12 @@ export const initFlight = {
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'),
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: '',
@ -204,80 +225,90 @@ export const initFlight = {
createDt: '',
updateUserId: '',
updateDt: '',
areaList: [{
planAreaSno: 0,
planSno: 0,
areaType: '',
fltMethod: '',
bufferZone: 0,
fltElev: '',
createUserId: '',
createDt: '',
updateUserId: '',
updateDt: '',
coordList: [{
planAreaCoordSno: 0,
areaList: [
{
planAreaSno: 0,
lat: 0,
lon: 0,
planSno: 0,
areaType: '',
fltMethod: '',
bufferZone: 0,
fltElev: '',
createUserId: '',
createDt: ''
}],
bufferCoordList: [{
planAreaCoordSno: 0,
planAreaSno: 0,
lat: 0,
lon: 0,
createDt: '',
updateUserId: '',
updateDt: '',
coordList: [
{
planAreaCoordSno: 0,
planAreaSno: 0,
lat: 0,
lon: 0,
createUserId: '',
createDt: ''
}
],
bufferCoordList: [
{
planAreaCoordSno: 0,
planAreaSno: 0,
lat: 0,
lon: 0,
createUserId: '',
createDt: ''
}
]
}
],
pilotList: [
{
planPilotSno: 0,
planSno: 0,
cstmrSno: 0,
groupNm: '',
memberName: '',
email: '',
hpno: '',
clncd: '+82',
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: ''
}],
}],
pilotList: [{
planPilotSno: 0,
planSno: 0,
cstmrSno: 0,
groupNm: '',
memberName: '',
email: '',
hpno: '',
clncd: '+82',
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: ''
}]
createDt: '',
updateUserId: '',
updateDt: ''
}
]
},
pilotList: undefined,
arcrftList: undefined,
@ -286,10 +317,10 @@ export const initFlight = {
areaCoordList: undefined,
areaList: undefined,
aprvList: undefined,
aprvProc: undefined
aprvProc: undefined,
scheduleList: []
};
export const initFlightBas = {
plan: {
planSno: 0,
@ -302,8 +333,12 @@ export const initFlightBas = {
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'),
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: '',
@ -313,7 +348,7 @@ export const initFlightBas = {
updateDt: '',
areaList: undefined,
pilotList: undefined,
arcrftList: undefined,
arcrftList: undefined
},
pilot: {
planPilotSno: 0,
@ -393,8 +428,12 @@ export const initFlightBas = {
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'),
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: '',
@ -402,79 +441,89 @@ export const initFlightBas = {
createDt: '',
updateUserId: '',
updateDt: '',
areaList: [{
planAreaSno: 0,
planSno: 0,
areaType: '',
fltMethod: '',
bufferZone: 0,
fltElev: '',
createUserId: '',
createDt: '',
updateUserId: '',
updateDt: '',
coordList: [{
planAreaCoordSno: 0,
areaList: [
{
planAreaSno: 0,
lat: 0,
lon: 0,
planSno: 0,
areaType: '',
fltMethod: '',
bufferZone: 0,
fltElev: '',
createUserId: '',
createDt: ''
}],
bufferCoordList: [{
planAreaCoordSno: 0,
planAreaSno: 0,
lat: 0,
lon: 0,
createDt: '',
updateUserId: '',
updateDt: '',
coordList: [
{
planAreaCoordSno: 0,
planAreaSno: 0,
lat: 0,
lon: 0,
createUserId: '',
createDt: ''
}
],
bufferCoordList: [
{
planAreaCoordSno: 0,
planAreaSno: 0,
lat: 0,
lon: 0,
createUserId: '',
createDt: ''
}
]
}
],
pilotList: [
{
planPilotSno: 0,
planSno: 0,
cstmrSno: 0,
groupNm: '',
memberName: '',
email: '',
hpno: '',
clncd: '+82',
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: ''
}],
}],
pilotList: [{
planPilotSno: 0,
planSno: 0,
cstmrSno: 0,
groupNm: '',
memberName: '',
email: '',
hpno: '',
clncd: '+82',
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: ''
}]
createDt: '',
updateUserId: '',
updateDt: ''
}
]
}
}
};

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

@ -129,4 +129,11 @@ export const flightReducer = createReducer<FlightState, Actions.FlightAction>(
const data = action.payload;
draft.aprvProc = data;
})
)
// 비행운항 스케줄
.handleAction(Actions.FLIGHT_SCHEDULE_LIST.success, (state, action) =>
produce(state, draft => {
const data = action.payload;
draft.scheduleList = data;
})
);

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

@ -9,15 +9,19 @@ 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";
import { FlightPlanData } from '../models/basisFlightModel';
import {
FLIGHT_PLAN_ARCRFT_LIST,
FLIGHT_PLAN_CREATE, FLIGHT_PLAN_DELETE,
FLIGHT_PLAN_CREATE,
FLIGHT_PLAN_DELETE,
FLIGHT_PLAN_DETAIL,
FLIGHT_PLAN_PILOT_LIST, FLIGHT_PLAN_UPDATE
} from "../actions/basisFlightAction";
FLIGHT_PLAN_PILOT_LIST,
FLIGHT_PLAN_UPDATE
} from '../actions/basisFlightAction';
function* listAreaSaga(action: ActionType<typeof Actions.PUBLIC_AREA_LIST.request>) {
function* listAreaSaga(
action: ActionType<typeof Actions.PUBLIC_AREA_LIST.request>
) {
try {
const response = yield call(Apis.flightPlanAPI.area);
@ -39,9 +43,7 @@ function* listAreaSaga(action: ActionType<typeof Actions.PUBLIC_AREA_LIST.reques
})
);
} catch (error: any) {
yield put(
Actions.PUBLIC_AREA_LIST.failure(error)
);
yield put(Actions.PUBLIC_AREA_LIST.failure(error));
}
}
@ -63,7 +65,9 @@ function* listAreaSaga(action: ActionType<typeof Actions.PUBLIC_AREA_LIST.reques
// }
// 비행계획서 목록
function* listPlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_LIST.request>) {
function* listPlanSaga(
action: ActionType<typeof Actions.FLIGHT_PLAN_LIST.request>
) {
try {
const data = action.payload;
const response = yield call(Apis.flightPlanAPI.list, data);
@ -79,18 +83,16 @@ function* listPlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_LIST.reques
return;
}
yield put(
Actions.FLIGHT_PLAN_LIST.success(response.data)
);
yield put(Actions.FLIGHT_PLAN_LIST.success(response.data));
} catch (error: any) {
yield put(
Actions.FLIGHT_PLAN_LIST.failure(error)
);
yield put(Actions.FLIGHT_PLAN_LIST.failure(error));
}
}
// 비행계획서 상세
function* detailPlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_DETAIL.request>) {
function* detailPlanSaga(
action: ActionType<typeof Actions.FLIGHT_PLAN_DETAIL.request>
) {
try {
const data = action.payload;
const response = yield call(Apis.flightPlanAPI.detail, data);
@ -106,24 +108,22 @@ function* detailPlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_DETAIL.re
return;
}
yield put(
Actions.FLIGHT_PLAN_DETAIL.success(response.data)
);
yield put(Actions.FLIGHT_PLAN_DETAIL.success(response.data));
} catch (error: any) {
yield put(
Actions.FLIGHT_PLAN_DETAIL.failure(error)
);
yield put(Actions.FLIGHT_PLAN_DETAIL.failure(error));
}
}
// 비행계획서 등록
function* createPlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_CREATE.request>) {
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;
const { data } = res;
if (data.result) {
yield put(
@ -144,7 +144,7 @@ function* createPlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_CREATE.re
isRefresh: false
})
);
} else if(data.errorCode === 'FT500') {
} else if (data.errorCode === 'FT500') {
yield put(
MessageActions.IS_ERROR({
errorCode: DUPLATE_MESSAGE.code,
@ -171,13 +171,15 @@ function* createPlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_CREATE.re
}
// 비행계획서 수정
function* updatePlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_UPDATE.request>) {
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;
const { data } = res;
if (data.result) {
yield put(
@ -216,12 +218,14 @@ function* updatePlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_UPDATE.re
}
// 비행계획서 삭제
function* deletePlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_DELETE.request>) {
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;
const { data } = res;
if (data.result) {
yield put(
@ -249,7 +253,9 @@ function* deletePlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_DELETE.re
}
// 조종사 목록
function* listPilotSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_PILOT_LIST.request>) {
function* listPilotSaga(
action: ActionType<typeof Actions.FLIGHT_PLAN_PILOT_LIST.request>
) {
try {
const data = action.payload;
const response = yield call(Apis.flightPlanAPI.listPilot, data);
@ -265,18 +271,16 @@ function* listPilotSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_PILOT_LIST
return;
}
yield put(
Actions.FLIGHT_PLAN_PILOT_LIST.success(response.data)
);
yield put(Actions.FLIGHT_PLAN_PILOT_LIST.success(response.data));
} catch (error: any) {
yield put(
Actions.FLIGHT_PLAN_PILOT_LIST.failure(error)
);
yield put(Actions.FLIGHT_PLAN_PILOT_LIST.failure(error));
}
}
// 기체 목록
function* listArcrftSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_ARCRFT_LIST.request>) {
function* listArcrftSaga(
action: ActionType<typeof Actions.FLIGHT_PLAN_ARCRFT_LIST.request>
) {
try {
const data = action.payload;
const response = yield call(Apis.flightPlanAPI.listArcrft, data);
@ -292,18 +296,16 @@ function* listArcrftSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_ARCRFT_LI
return;
}
yield put(
Actions.FLIGHT_PLAN_ARCRFT_LIST.success(response.data)
);
yield put(Actions.FLIGHT_PLAN_ARCRFT_LIST.success(response.data));
} catch (error: any) {
yield put(
Actions.FLIGHT_PLAN_ARCRFT_LIST.failure(error)
);
yield put(Actions.FLIGHT_PLAN_ARCRFT_LIST.failure(error));
}
}
// get buffer list
function* listBuffer(action: ActionType<typeof Actions.FLIGHT_PLAN_AREA_BUFFER_LIST.request>) {
function* listBuffer(
action: ActionType<typeof Actions.FLIGHT_PLAN_AREA_BUFFER_LIST.request>
) {
try {
const data = action.payload;
const response = yield call(Apis.flightPlanAPI.listBuffer, data);
@ -319,19 +321,16 @@ function* listBuffer(action: ActionType<typeof Actions.FLIGHT_PLAN_AREA_BUFFER_L
return;
}
yield put(
Actions.FLIGHT_PLAN_AREA_BUFFER_LIST.success(response.data)
);
yield put(Actions.FLIGHT_PLAN_AREA_BUFFER_LIST.success(response.data));
} catch (error: any) {
yield put(
Actions.FLIGHT_PLAN_AREA_BUFFER_LIST.failure(error)
);
yield put(Actions.FLIGHT_PLAN_AREA_BUFFER_LIST.failure(error));
}
}
// 비행계획서 목록(승인)
function* listAprvSaga(action: ActionType<typeof Actions.FLIGHT_APRV_LIST.request>) {
function* listAprvSaga(
action: ActionType<typeof Actions.FLIGHT_APRV_LIST.request>
) {
try {
const data = action.payload;
const response = yield call(Apis.flightPlanAPI.aprvList, data);
@ -347,25 +346,22 @@ function* listAprvSaga(action: ActionType<typeof Actions.FLIGHT_APRV_LIST.reques
return;
}
yield put(
Actions.FLIGHT_APRV_LIST.success(response.data)
);
yield put(Actions.FLIGHT_APRV_LIST.success(response.data));
} catch (error: any) {
yield put(
Actions.FLIGHT_APRV_LIST.failure(error)
);
yield put(Actions.FLIGHT_APRV_LIST.failure(error));
}
}
// 비행계획서 승인
function* aprvProcSaga(action: ActionType<typeof Actions.FLIGHT_APRV_PROC.request>) {
function* aprvProcSaga(
action: ActionType<typeof Actions.FLIGHT_APRV_PROC.request>
) {
try {
const sendData = action.payload;
const res = yield call(Apis.flightPlanAPI.aprvProc, sendData);
const {data} = res;
const { data } = res;
if (data.result) {
yield put(
@ -376,9 +372,7 @@ function* aprvProcSaga(action: ActionType<typeof Actions.FLIGHT_APRV_PROC.reques
isRefresh: false
})
);
yield put(
Actions.FLIGHT_APRV_PROC.success(data)
)
yield put(Actions.FLIGHT_APRV_PROC.success(data));
} else {
if (data.errorCode === 'DT002') {
yield put(
@ -406,10 +400,36 @@ function* aprvProcSaga(action: ActionType<typeof Actions.FLIGHT_APRV_PROC.reques
}
}
// 비행계획서 목록
function* scheduleListSaga(
action: ActionType<typeof Actions.FLIGHT_SCHEDULE_LIST.request>
) {
try {
const data = action.payload;
const response = yield call(Apis.flightPlanAPI.scheduleList, data);
if (response.errorCode) {
yield put(
MessageActions.IS_ERROR({
errorCode: response.errorCode,
errorMessage: response.errorMessage,
isHistoryBack: false,
isRefresh: false
})
);
return;
}
yield put(Actions.FLIGHT_SCHEDULE_LIST.success(response.data || []));
} catch (error: any) {
yield put(Actions.FLIGHT_SCHEDULE_LIST.failure(error));
}
}
function* searchAreaSaga(
action: ActionType<typeof Actions.SEARCH_AREA.request>
) {
try{
try {
const { query } = action.payload;
const res = yield call(Apis.flightPlanAPI.searchArea, { query });
@ -422,15 +442,16 @@ function* searchAreaSaga(
export function* flightSaga() {
yield takeEvery(Actions.PUBLIC_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_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)
yield takeEvery(Actions.FLIGHT_PLAN_AREA_BUFFER_LIST.request, listBuffer)
yield takeEvery(Actions.FLIGHT_APRV_LIST.request, listAprvSaga)
yield takeEvery(Actions.FLIGHT_APRV_PROC.request, aprvProcSaga)
yield takeEvery(Actions.SEARCH_AREA.request, searchAreaSaga)
yield takeEvery(Actions.FLIGHT_PLAN_LIST.request, listPlanSaga);
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);
yield takeEvery(Actions.FLIGHT_PLAN_AREA_BUFFER_LIST.request, listBuffer);
yield takeEvery(Actions.FLIGHT_APRV_LIST.request, listAprvSaga);
yield takeEvery(Actions.FLIGHT_APRV_PROC.request, aprvProcSaga);
yield takeEvery(Actions.SEARCH_AREA.request, searchAreaSaga);
yield takeEvery(Actions.FLIGHT_SCHEDULE_LIST.request, scheduleListSaga);
}

11
src/modules/basis/group/actions/basisGroupAction.ts

@ -9,7 +9,8 @@ import {
UserGroupData,
UserGroupState,
GroupState,
MainGroupData
MainGroupData,
SelectGroupData
} from '../models/basisGroupModel';
//# 나의 그룹 목록 조회
@ -101,6 +102,9 @@ const GROUP_MAIN_LIST_REQUEST = 'basis/group/GROUP_MAIN_LIST_REQUEST';
const GROUP_MAIN_LIST_SUCCESS = 'basis/group/GROUP_MAIN_LIST_SUCCESS';
const GROUP_MAIN_LIST_FAILURE = 'basis/group/GROUP_MAIN_LIST_FAILURE';
//# 그룹 선택
const ROUP_SELECT = 'basis/group/select';
export const MY_LIST = createAsyncAction(
MY_LIST_REQUEST,
MY_LIST_SUCCESS,
@ -207,6 +211,8 @@ export const USER_DELEGATE = createAsyncAction(
USER_DELEGATE_FAILURE
)<UserGroupState, string, AxiosError>();
export const USER_GROUP_SELECT = createAction(ROUP_SELECT)<SelectGroupData>();
const actions = {
MY_LIST,
JOIN_LIST,
@ -225,7 +231,8 @@ const actions = {
USER_UPDATE,
USER_DELEGATE,
GROUP_MYLIST,
GROUP_MAIN_LIST
GROUP_MAIN_LIST,
USER_GROUP_SELECT
};
export type GroupAction = ActionType<typeof actions>;

14
src/modules/basis/group/models/basisGroupModel.ts

@ -18,6 +18,13 @@ export interface GroupState {
newGroupId: String | '';
searchParams: string | '';
error: ErrorModel | undefined;
selectGroup: SelectGroupData | undefined;
}
export interface SelectGroupData {
cstmrSno: number;
groupId: string;
groupNm: string;
}
export interface GroupSearchData {
@ -111,5 +118,10 @@ export const initGroup = {
groupId: '',
newGroupId: '',
searchParams: '',
error: undefined
error: undefined,
selectGroup: {
cstmrSno: 0,
groupId: '',
groupNm: ''
}
};

7
src/modules/basis/group/reducers/basisGroupReducer.ts

@ -96,4 +96,11 @@ export const groupReducer = createReducer<GroupState, Actions.GroupAction>(
draft.userList = data;
draft.userCount = count;
})
)
//그룹 선택
.handleAction(Actions.USER_GROUP_SELECT, (state, action) =>
produce(state, draft => {
const data = action.payload;
draft.selectGroup = data;
})
);

21
src/utility/hooks/useInterval.js

@ -0,0 +1,21 @@
import { useEffect, useRef } from 'react';
const useInterval = (callback, delay) => {
const savedCallback = useRef(null);
useEffect(() => {
savedCallback.current = callback;
}, [callback]);
useEffect(() => {
const executeCallback = () => {
savedCallback.current();
};
const timerId = setInterval(executeCallback, delay);
return () => clearInterval(timerId);
}, []);
};
export default useInterval;

1
src/views/weather/WeatherView.js

@ -48,7 +48,6 @@ const WeatherView = () => {
easing: 'easeOutCubic'
};
// map.morph(latlng, 16, options)
console.log(map);
};
const handleEnter = e => {
if (e.key == 'Enter') {

Loading…
Cancel
Save