Browse Source

비행계획서 승인

feature/flight-plan
지대한 2 years ago
parent
commit
3240e863d5
  1. 2
      src/@core/layouts/components/menu/vertical-menu/index.js
  2. 59
      src/components/basis/flight/aprv/FlightPlanAprvGrid.js
  3. 67
      src/components/basis/flight/aprv/FlightPlanAprvGroupGrid.js
  4. 175
      src/components/basis/flight/aprv/FlightPlanAprvSearch.js
  5. 2
      src/components/crud/grid/GridDatatable.js
  6. 97
      src/containers/basis/flight/aprv/FlightPlanAprvContainer.js
  7. 3
      src/containers/basis/flight/plan/FlightPlanContainer.js
  8. 2
      src/modules/account/login/apis/authApi.ts
  9. 4
      src/modules/account/login/sagas/authSaga.ts
  10. 43
      src/modules/basis/flight/actions/basisFlightAction.ts
  11. 35
      src/modules/basis/flight/apis/basisFlightApi.ts
  12. 9
      src/modules/basis/flight/models/basisFlightModel.ts
  13. 14
      src/modules/basis/flight/reducers/basisFlightReducer.ts
  14. 85
      src/modules/basis/flight/sagas/basisFlightSaga.ts
  15. 6
      src/navigation/basis/index.js
  16. 2
      src/router/Router.js
  17. 4
      src/router/routes/RouteBasis.js
  18. 9
      src/views/basis/flight/aprv/FlightPlanAprv.js

2
src/@core/layouts/components/menu/vertical-menu/index.js

@ -23,7 +23,7 @@ const Sidebar = props => {
const { topMenuCd } = useSelector(state => state.menuState);
useEffect(() => {
console.log('>>>>>>>>>>>>>>', topMenuCd);
// console.log('>>>>>>>>>>>>>>', topMenuCd);
navData();
}, [topMenuCd]);

59
src/components/basis/flight/aprv/FlightPlanAprvGrid.js

@ -0,0 +1,59 @@
import React from 'react';
import {Button, Card, Col, Row} from 'reactstrap';
import {GridDatabase} from '../../../crud/grid/GridDatatable';
const FlightPlanAprvGrid = ({data, columns, handleChangeSelected, handleClickAprv}) => {
return (
<div className='pal-card-box'>
<Row>
<Col>
<div
className='cont-ti d-flex justify-content-between align-items-sm-center align-items-start flex-sm-row'>
<div>
<h4>비행계획서 신청 목록</h4>
<span className='search-case'>검색결과 {!!data ? data.length : 0}</span>
</div>
<div className='d-flex align-items-center'>
<Button.Ripple
color='primary'
size='sm'
onClick={handleClickAprv('aprv')}
>
승인
</Button.Ripple>
<Button.Ripple
color='primary'
size='sm'
style={{marginLeft: 10}}
onClick={handleClickAprv('notAprov')}
>
미승인
</Button.Ripple>
</div>
</div>
<div className='invoice-list-wrapper'>
<Card>
<div className='invoice-list-dataTable'>
<GridDatabase
title={'비행이력'}
data={data}
columns={columns}
count={!!data ? data.length : 0}
// pagination={props.pagination}
selectableRows
onSelectedRowsChange={handleChangeSelected}
/>
{/* 검색된 데이터가 없습니다. */}
</div>
</Card>
</div>
</Col>
</Row>
</div>
)
}
export default FlightPlanAprvGrid;

67
src/components/basis/flight/aprv/FlightPlanAprvGroupGrid.js

@ -0,0 +1,67 @@
import React, {} from 'react';
import { GridDatabase } from "../../../crud/grid/GridDatatable";
import {
Card,
Button
} from 'reactstrap';
const FlightPlanAprvGroupGrid = ({ data, count, selectGroup, handlerGroupCancel, handleGroupSelect }) => {
const columns = [
{id: 'groupNm', name: '그룹 명', minWidth: '102px', cell: row => (<div>{row.groupNm}</div>)},
{id: 'groupId', name: '그룹 코드', minWidth: '102px', sortable: true, cell: row => (<div>{row.groupId}</div>)},
{sortable: true, cell: row => {
return selectGroup?.groupId === row?.groupId ? (
<Button.Ripple
color='danger'
className='badge badge-danger'
onClick={() => handlerGroupCancel()}
>
선택취소
</Button.Ripple>
) : (
<Button.Ripple
color='primary'
className='badge badge-primary'
onClick={() => {
handleGroupSelect({
groupId: row?.groupId,
groupNm: row?.groupNm,
groupAuthCd: row?.groupAuthCd
})
}
}
>
상세보기
</Button.Ripple>
)
}}
];
return (
<>
<div className='cont-ti d-flex justify-content-between align-items-sm-center align-items-start flex-sm-row'>
<div>
<h4>나의 그룹 목록</h4>
<span className='search-case'>검색결과 {count}</span>
</div>
<div className='d-flex align-items-center'></div>
</div>
<div className='invoice-list-wrapper'>
<Card>
<div className='invoice-list-dataTable'>
<GridDatabase
data={data}
count={count}
columns={columns}
/>
</div>
</Card>
</div>
</>
)
}
export default FlightPlanAprvGroupGrid;

175
src/components/basis/flight/aprv/FlightPlanAprvSearch.js

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

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

@ -25,6 +25,8 @@ export const GridDatabase = props => {
// paginationDefaultPage={currentPage}
// paginationComponent={CustomPagination}
data={props.data}
onSelectedRowsChange={props.onSelectedRowsChange ? props.onSelectedRowsChange : null}
selectableRows={props.selectableRows}
/>
);
};

97
src/containers/basis/flight/aprv/FlightPlanAprvContainer.js

@ -0,0 +1,97 @@
import React, {useEffect, useState} from 'react';
import {Col, Row} from 'reactstrap';
import {CustomMainLayout} from '../../../../components/layout/CustomMainLayout';
import moment from 'moment/moment';
import FlightPlanAprvSearch from '../../../../components/basis/flight/aprv/FlightPlanAprvSearch';
import FlightPlanAprvGrid from '../../../../components/basis/flight/aprv/FlightPlanAprvGrid';
import {useDispatch, useSelector} from 'react-redux';
import * as FlightAction from '../../../../modules/basis/flight/actions/basisFlightAction';
const initSearchData = {
schFltStDt: moment().set({'date': 1, 'h': 0, 'm': 0, 's': 0}).format('YYYY-MM-DD HH:mm:ss'),
schFltEndDt: moment().set({'h': 23, 'm': 59, 's': 59}).format('YYYY-MM-DD HH:mm:ss'),
aprvlYn: 'N',
cstmrSno: 0,
};
const columns = [
{id: 'planSno', name: '번호', cell: (row, i) => (<div>{i + 1}</div>)},
{id: 'fltPurpose', name: '비행목적', cell: row => (<div>{row.fltPurpose}</div>)},
{
id: 'fltMethod', name: '비행방식', cell: row => {
const displayName = row.areaList && row.areaList.length > 0 && row.areaList[0].fltMethod || '-';
return <div>{displayName}</div>
}
},
{id: 'schFltStDt', name: '출발일', cell: row => (<div>{row.schFltStDt}</div>)},
{id: 'aprvlYn', name: '승인여부', cell: row => (<div>{row.aprvlYn}</div>)}
];
const FlightPlanAprvContainer = () => {
const dispatch = useDispatch();
const [searchData, setSearchData] = useState(initSearchData);
const [selPlanSnoList, setSelPlanSnoList] = useState([]);
const {aprvList, aprvProc} = useSelector(state => state.flightState);
// 최초 비행계획서 목록 조회
useEffect(() => {
handleSearch(searchData);
}, [])
useEffect(() => {
if (aprvProc && aprvProc.result > 0) {
handleSearch(searchData);
}
}, [aprvProc])
const handleSearch = (data) => {
dispatch(FlightAction.FLIGHT_APRV_LIST.request(data));
}
const handleChangeSearchData = (values) => {
setSearchData(prevState => ({
...prevState,
...values
}))
}
const handleChangeSelected = ({selectedRows}) => {
setSelPlanSnoList(selectedRows.map(item => item.planSno))
}
const handleClickAprv = (type) => (e) => {
// notAprov, aprv
console.log(type, selPlanSnoList, e)
if (!selPlanSnoList || selPlanSnoList.length < 1) {
alert('비행계획서를 선택해주세요.');
return;
}
;
const sendData = {
planSnoList: [...selPlanSnoList],
aprvlYn: type === 'aprv' ? 'Y' : 'N'
}
dispatch(FlightAction.FLIGHT_APRV_PROC.request(sendData));
}
return (
<CustomMainLayout title={"비행계획서 승인"}>
<div className='pal-card-box'>
<Row>
<Col sm='12'>
<FlightPlanAprvSearch
searchData={searchData}
handleChangeSearchData={handleChangeSearchData}
handleSearch={handleSearch}
/>
<FlightPlanAprvGrid
data={aprvList}
columns={columns}
handleChangeSelected={handleChangeSelected}
handleClickAprv={handleClickAprv}
/>
</Col>
</Row>
</div>
</CustomMainLayout>
)
}
export default FlightPlanAprvContainer;

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

@ -11,9 +11,8 @@ import { Row, Col } from 'reactstrap';
import { JOIN_LIST } from "../../../../modules/basis/group/actions/basisGroupAction";
import FlightPlanGroupGrid from '../../../../components/basis/flight/plan/FlightPlanGroupGrid';
const initSearchData = {
schFltStDt: moment().set({'m': 7, 'date': 1, 'h': 0, 'm': 0, 's': 0}).format('YYYY-MM-DD HH:mm:ss'),
schFltStDt: moment().set({'date': 1, 'h': 0, 'm': 0, 's': 0}).format('YYYY-MM-DD HH:mm:ss'),
schFltEndDt: moment().set({'h': 23, 'm': 59, 's': 59}).format('YYYY-MM-DD HH:mm:ss'),
aprvlYn: 'N',
groupId: '',

2
src/modules/account/login/apis/authApi.ts

@ -5,7 +5,7 @@ import qs from 'qs';
export const authAPI = {
usersLogin: async (data: UserAccount) => {
console.log('>>>>>>>>>>>>>>>>>>>>>', data);
// console.log('>>>>>>>>>>>>>>>>>>>>>', data);
return await axios.post('api/acnt/jwt/login', data);
},
getUserProfile: async (id: number) => {

4
src/modules/account/login/sagas/authSaga.ts

@ -71,7 +71,7 @@ function* refreshTokenSaga(action: ActionType<typeof Actions.refresh.request>) {
function* checkAuthencationSaga() {
try {
const accessToken = cookieStorage.getCookie(COOKIE_ACCESS_TOKEN);
console.log('accessToken>>>>>>>>>>>>>', accessToken);
// console.log('accessToken>>>>>>>>>>>>>', accessToken);
if (!accessToken) {
yield put(
Actions.check.success({
@ -88,7 +88,7 @@ function* checkAuthencationSaga() {
//token 셋팅
cookieStorage.setCookie(COOKIE_ACCESS_TOKEN, accessToken);
console.log('>>>>>>>>>>>>>>>>>>>>>', data);
// console.log('>>>>>>>>>>>>>>>>>>>>>', data);
// storageService.session.setItem(STORAGE_SESSION_ICT, user.icToken);

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

@ -5,9 +5,8 @@ import {
FlightPlanArcrftData,
FlightPlanArcrftDataList,
FlightPlanAreaDataList,
// FlightPlanArea,
FlightPlanData,
FlightPlanListRqData, FlightPlanPilotDataList, PilotSelectData, SelectGroupData
FlightPlanListRqData, FlightPlanPilotDataList, PilotSelectData, SelectGroupData, BasFlightAprovData
} from '../models/basisFlightModel';
@ -16,11 +15,6 @@ const PUBLIC_AREA_LIST_REQUEST = 'basis/flight/public_area/LIST_REQUEST';
const PUBLIC_AREA_LIST_SUCCESS = 'basis/flight/public_area/LIST_SUCCESS';
const PUBLIC_AREA_LIST_FAILURE = 'basis/flight/public_area/LIST_FAILURE';
// 비행 구역 설정
// const FLIGHT_PLAN_AREA_REQUEST = 'basis/flight/plan/area/LIST_REQUEST';
// const FLIGHT_PLAN_AREA_SUCCESS = 'basis/flight/plan/area/LIST_SUCCESS';
// const FLIGHT_PLAN_AREA_FAILURE = 'basis/flight/plan/area/LIST_FAILURE';
// 목록
const FLIGHT_PLAN_LIST_REQUEST = 'basis/flight/plan/list/LIST_REQUEST';
const FLIGHT_PLAN_LIST_SUCCESS = 'basis/flight/plan/list/LIST_SUCCESS';
@ -83,18 +77,23 @@ const AREA_BUFFER_LIST_REQUEST = 'basis/flight/plan/area/BUFFER_LIST_REQUEST';
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_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';
export const PUBLIC_AREA_LIST = createAsyncAction(
PUBLIC_AREA_LIST_REQUEST,
PUBLIC_AREA_LIST_SUCCESS,
PUBLIC_AREA_LIST_FAILURE
)<PublicAreaData, { data: PublicAreaData }, AxiosError>();
// export const FLIGHT_PLAN_AREA = createAsyncAction(
// FLIGHT_PLAN_AREA_REQUEST,
// FLIGHT_PLAN_AREA_SUCCESS,
// FLIGHT_PLAN_AREA_FAILURE
// )<FlightPlanArea, { data: FlightPlanArea }, AxiosError>();
// 목록
export const FLIGHT_PLAN_LIST = createAsyncAction(
FLIGHT_PLAN_LIST_REQUEST,
@ -173,6 +172,20 @@ export const FLIGHT_PLAN_AREA_BUFFER_LIST = createAsyncAction(
AREA_BUFFER_LIST_FAILURE
)<FlightPlanAreaDataList, FlightPlanAreaDataList, AxiosError>();
// 비행계획서 조회(승인)
export const FLIGHT_APRV_LIST = createAsyncAction(
FLIGHT_APRV_LIST_REQUEST,
FLIGHT_APRV_LIST_SUCCESS,
FLIGHT_APRV_LIST_FAILURE
)<FlightPlanListRqData, [FlightPlanData], AxiosError>();
// 비행계획서 승인/미승인 처리
export const FLIGHT_APRV_PROC = createAsyncAction(
FLIGHT_APRV_PROC_REQUEST,
FLIGHT_APRV_PROC_SUCCESS,
FLIGHT_APRV_PROC_FAILURE
)<BasFlightAprovData, string, AxiosError>();
const actions = {
PUBLIC_AREA_LIST,
// FLIGHT_PLAN_AREA,
@ -191,7 +204,9 @@ const actions = {
AREA_DETAIL_LIST_SAVE,
FLIGHT_PLAN_GROUP_SELECT,
FLIGHT_PLAN_AREA_BUFFER_LIST,
AREA_DETAIL_INIT
AREA_DETAIL_INIT,
FLIGHT_APRV_LIST,
FLIGHT_APRV_PROC
};
export type FlightAction = ActionType<typeof actions>;

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

@ -1,6 +1,12 @@
import axios from '../../../utils/customAxiosUtil';
import qs from 'qs';
import { FlightPlanAreaData, FlightPlanAreaDataList, FlightPlanData, FlightPlanListRqData } from '../models/basisFlightModel';
import {
BasFlightAprovData,
FlightPlanAreaData,
FlightPlanAreaDataList,
FlightPlanData,
FlightPlanListRqData
} from '../models/basisFlightModel';
export const flightPlanAPI = {
@ -21,43 +27,44 @@ export const flightPlanAPI = {
return res;
},
create: async (data: FlightPlanData) => {
console.log('>>> rq : ', data)
const res = await axios.post(`api/bas/flight/plan/create`, data);
console.log('>>> rs : ', res);
return res;
},
update: async (data: FlightPlanData) => {
console.log('>>> rq : ', data)
const res = await axios.put(`api/bas/flight/plan/update`, data);
console.log('>>> rs : ', res);
return res;
},
delete: async (planSno: number) => {
console.log('>>> rq : ', planSno)
const res = await axios.get(`api/bas/flight/plan/delete/${planSno}`);
console.log('>>> rs : ', res);
return res;
},
listPilot: async (groupId: 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: string) => {
console.log('>>> rq : ', groupId)
const res = await axios.get(`api/bas/flight/plan/arcrft/${groupId}`);
console.log('>>> rs : ', res);
return res;
},
listBuffer: async (data: FlightPlanAreaDataList) => {
console.log('>>> rq : ', data)
const queryString = qs.stringify(data, {
addQueryPrefix: true,
arrayFormat: 'brackets'
});
const res = await axios.post(`api/bas/flight/plan/area/buffer`, data);
console.log('>>> rs : ', res);
return res;
},
aprvList: async (data: FlightPlanListRqData) => {
const queryString = qs.stringify(data, {
addQueryPrefix: true,
arrayFormat: 'repeat'
});
const res = await axios.get(`api/bas/flight/aprv/list${queryString}`);
return res;
},
aprvProc: async (data: BasFlightAprovData) => {
const res = await axios.put(`api/bas/flight/aprv/proc`, data);
return res;
},
}
}

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

@ -12,6 +12,8 @@ export interface FlightState {
areaCoordList: FlightPlanAreaData[] | undefined
areaList: FlightPlanAreaData[] | undefined
selectGroup: SelectGroupData | undefined
aprvList: [FlightPlanData] | undefined
aprvProc: any | undefined
}
export interface SelectGroupData {
@ -168,6 +170,11 @@ export interface PilotSelectData {
zip: string
}
export interface BasFlightAprovData {
planSnoList: [number]
aprvlYn: string
}
export const initFlight = {
selectGroup: {
cstmrSno: 0,
@ -278,6 +285,8 @@ export const initFlight = {
arcrftSelect: undefined,
areaCoordList: undefined,
areaList: undefined,
aprvList: undefined,
aprvProc: undefined
};

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

@ -111,3 +111,17 @@ export const flightReducer = createReducer<FlightState, Actions.FlightAction>(in
draft.areaCoordList = undefined;
})
)
// 비행계획서 목록(승인)
.handleAction(Actions.FLIGHT_APRV_LIST.success, (state, action) =>
produce(state, draft => {
const data = action.payload;
draft.aprvList = data;
})
)
// 비행계획서 승인처리
.handleAction(Actions.FLIGHT_APRV_PROC.success, (state, action) =>
produce(state, draft => {
const data = action.payload;
draft.aprvProc = data;
})
)

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

@ -88,6 +88,7 @@ function* listPlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_LIST.reques
);
}
}
// 비행계획서 상세
function* detailPlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_DETAIL.request>) {
try {
@ -114,6 +115,7 @@ function* detailPlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_DETAIL.re
);
}
}
// 비행계획서 등록
function* createPlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_CREATE.request>) {
try {
@ -158,6 +160,7 @@ function* createPlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_CREATE.re
// yield put(Actions.FLIGHT_PLAN_CREATE.failure(error));
}
}
// 비행계획서 수정
function* updatePlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_UPDATE.request>) {
try {
@ -202,6 +205,7 @@ function* updatePlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_UPDATE.re
// yield put(Actions.FLIGHT_PLAN_UPDATE.failure(error));
}
}
// 비행계획서 삭제
function* deletePlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_DELETE.request>) {
try {
@ -234,6 +238,7 @@ function* deletePlanSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_DELETE.re
// yield put(Actions.FLIGHT_PLAN_DELETE.failure(error));
}
}
// 조종사 목록
function* listPilotSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_PILOT_LIST.request>) {
try {
@ -260,6 +265,7 @@ function* listPilotSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_PILOT_LIST
);
}
}
// 기체 목록
function* listArcrftSaga(action: ActionType<typeof Actions.FLIGHT_PLAN_ARCRFT_LIST.request>) {
try {
@ -314,6 +320,83 @@ function* listBuffer(action: ActionType<typeof Actions.FLIGHT_PLAN_AREA_BUFFER_L
}
}
// 비행계획서 목록(승인)
function* listAprvSaga(action: ActionType<typeof Actions.FLIGHT_APRV_LIST.request>) {
try {
const data = action.payload;
const response = yield call(Apis.flightPlanAPI.aprvList, data);
if (response.errorCode) {
yield put(
MessageActions.IS_ERROR({
errorCode: response.errorCode,
errorMessage: response.errorMessage,
isHistoryBack: false,
isRefresh: false
})
);
return;
}
yield put(
Actions.FLIGHT_APRV_LIST.success(response.data)
);
} catch (error: any) {
yield put(
Actions.FLIGHT_APRV_LIST.failure(error)
);
}
}
// 비행계획서 승인
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;
if (data.result) {
yield put(
MessageActions.IS_MESSAGE({
messageCode: SAVE_MESSAGE.code,
message: SAVE_MESSAGE.message,
isHistoryBack: false,
isRefresh: false
})
);
yield put(
Actions.FLIGHT_APRV_PROC.success(data)
)
} 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));
}
}
export function* flightSaga() {
yield takeEvery(Actions.PUBLIC_AREA_LIST.request, listAreaSaga);
// yield takeEvery(Actions.FLIGHT_PLAN_AREA.request, createFlightPlanArea);
@ -325,4 +408,6 @@ export function* flightSaga() {
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)
}

6
src/navigation/basis/index.js

@ -56,6 +56,12 @@ export default [
type: 'item',
title: '비행 계획 목록',
navLink: '/basis/flight/plan/index'
},
{
id: 'basis_001_03_02',
type: 'item',
title: '비행 계획 승인',
navLink: '/basis/flight/aprv/index'
}
],
navLink: '#'

2
src/router/Router.js

@ -24,7 +24,7 @@ const Router = () => {
const dispatch = useDispatch();
useEffect(() => {
console.log('isLogin>>>>>>>>', isLogin);
// console.log('isLogin>>>>>>>>', isLogin);
if (!isLogin) {
dispatch(Actions.check.request());
}

4
src/router/routes/RouteBasis.js

@ -51,6 +51,10 @@ const RouteBasis = [
path: '/basis/flight/plan/detail/:planSno',
component: lazy(() => import('../../views/basis/flight/plan/FlightPlanDetail'))
},
{
path: '/basis/flight/aprv/index',
component: lazy(() => import('../../views/basis/flight/aprv/FlightPlanAprv'))
},
];
export default RouteBasis;

9
src/views/basis/flight/aprv/FlightPlanAprv.js

@ -0,0 +1,9 @@
import '@styles/react/libs/flatpickr/flatpickr.scss';
import '@styles/react/libs/tables/react-dataTable-component.scss';
import '../../../../assets/css/custom.css';
import React from 'react';
import FlightPlanAprvContainer from '../../../../containers/basis/flight/aprv/FlightPlanAprvContainer';
const FlightPlanAprv = (props) => <FlightPlanAprvContainer/>;
export default FlightPlanAprv;
Loading…
Cancel
Save