hhjk00 10 months ago
parent
commit
348a6a58af
  1. 22
      src/components/dashboard/DashboardGroupList.js
  2. 19
      src/components/dashboard/DashboardStcsArea.js
  3. 12
      src/components/dashboard/DashboardStcsDay.js
  4. 93
      src/components/dashboard/DroneFlightSchedule.js
  5. 90
      src/containers/main/dash/MainDashContainer.js
  6. 20
      src/modules/main/dash/actions/mainDashAction.ts
  7. 1
      src/modules/main/dash/apis/mainDashApi.ts
  8. 9
      src/modules/main/dash/models/mainDashModel.ts
  9. 6
      src/modules/main/dash/reducers/mainDashReducer.ts
  10. 35
      src/modules/main/dash/sagas/mainDashSaga.ts

22
src/components/dashboard/DashboardGroupList.js

@ -173,12 +173,30 @@ const columns = {
] ]
}; };
export const DashboardGroupList = ({ title, pageMove, data }) => { export const DashboardGroupList = ({ title, handlerMovePage, data }) => {
return ( return (
<Card> <Card>
<CardHeader className=''> <CardHeader className=''>
<CardTitle tag='h4'>{titles[title]}</CardTitle> <CardTitle tag='h4'>{titles[title]}</CardTitle>
<button onClick={e => pageMove()}> <button
onClick={() => {
let movePage = '/';
switch (title) {
case 'dailyFlightPlan': // 비행 실적
movePage = '/statistics/result';
break;
case 'dailyFlightCount': // 비행 통계
movePage = '/statistics/flight';
break;
case 'dailyFlightWarn': // 비정상상황 통계
movePage = '/statistics/abnormal';
break;
default:
break;
}
handlerMovePage(movePage);
}}
>
<Plus /> <Plus />
</button> </button>
</CardHeader> </CardHeader>

19
src/components/dashboard/DashboardStcsArea.js

@ -61,7 +61,13 @@ const titles = {
flightsRegion: 'TOP5 지역 별 비행횟수 통계' flightsRegion: 'TOP5 지역 별 비행횟수 통계'
}; };
export const DashboardStcsArea = ({ data, title, setStartDate, startDate }) => { export const DashboardStcsArea = ({
data,
title,
setStartDate,
startDate,
handlerMovePage
}) => {
const [chartData, setChartData] = useState({}); const [chartData, setChartData] = useState({});
useEffect(() => { useEffect(() => {
@ -117,7 +123,10 @@ export const DashboardStcsArea = ({ data, title, setStartDate, startDate }) => {
/> />
</div> </div>
</div> </div>
<button onClick={e => {}} style={{ marginLeft: '8px' }}> <button
onClick={() => handlerMovePage('/statistics/flight')}
style={{ marginLeft: '8px' }}
>
<Plus /> <Plus />
</button> </button>
</> </>
@ -126,7 +135,11 @@ export const DashboardStcsArea = ({ data, title, setStartDate, startDate }) => {
</div> </div>
</CardHeader> </CardHeader>
<CardBody> <CardBody>
<div style={{ height: '100%' }}> <div
style={{
height: Object.keys(chartData).length > 0 ? '275px' : '100%'
}}
>
{Object.keys(chartData).length > 0 ? ( {Object.keys(chartData).length > 0 ? (
<Doughnut data={chartData} options={options} height={275} /> <Doughnut data={chartData} options={options} height={275} />
) : ( ) : (

12
src/components/dashboard/DashboardStcsDay.js

@ -70,7 +70,12 @@ const options = {
} }
}; };
export const DashboardStcsDay = ({ startDate, setStartDate, data }) => { export const DashboardStcsDay = ({
startDate,
setStartDate,
data,
handlerMovePage
}) => {
const [chartData, setChartData] = useState({}); const [chartData, setChartData] = useState({});
useEffect(() => { useEffect(() => {
@ -126,7 +131,10 @@ export const DashboardStcsDay = ({ startDate, setStartDate, data }) => {
/> />
</div> </div>
</div> </div>
<button onClick={e => {}} style={{ marginLeft: '8px' }}> <button
onClick={() => handlerMovePage('/statistics/flight')}
style={{ marginLeft: '8px' }}
>
<Plus /> <Plus />
</button> </button>
</div> </div>

93
src/components/dashboard/DroneFlightSchedule.js

@ -1,5 +1,13 @@
import { useSelector } from 'react-redux';
import { Plus } from 'react-feather'; import { Plus } from 'react-feather';
import { Card, CardBody, CardHeader, CardTitle, Input, Col } from 'reactstrap'; import {
Card,
CardBody,
CardHeader,
CardTitle,
Input,
Label
} from 'reactstrap';
import { GridDatabase } from '../../components/crud/grid/GridDatatable'; import { GridDatabase } from '../../components/crud/grid/GridDatatable';
const columns = [ const columns = [
@ -61,24 +69,97 @@ const columns = [
} }
]; ];
export default function DroneFlightSchedule({ pageMove, data }) { const competentAgency = [
{
text: '서울지방항공청(항공운항과)',
value: 'F0001'
},
{
text: '김포항공관리사무소(안전운항과)',
value: 'F0002'
},
{
text: '양양공항출장소',
value: 'F0003'
},
{
text: '원주공항출장소',
value: 'F0004'
},
{
text: '청주공항출장소',
value: 'F0005'
},
{
text: '군산공항출장소',
value: 'F0006'
},
{
text: '부산지방항공청(항공운항과)',
value: 'F0007'
},
{
text: '제주지방항공청(안전운항과)',
value: 'F0008'
},
{
text: '정석비행장',
value: 'F0009'
},
{
text: '울진공항출장소',
value: 'F0010'
}
];
export default function DroneFlightSchedule({
handlerMovePage,
handlerDronOperationChange,
user
}) {
const { dronOperationList } = useSelector(state => state.mainDashState);
return ( return (
<Card> <Card>
<CardHeader className=''> <CardHeader className=''>
<div className='w-100 d-flex justify-content-between'> <div className='w-100 d-flex justify-content-between'>
<CardTitle tag='h4'>드론 비행운항 목록</CardTitle> <CardTitle tag='h4'>드론 비행운항 목록</CardTitle>
<div className='d-flex align-items-center'> <div className='d-flex align-items-center'>
<Input type='select' size='sm' style={{ minWidth: '120px' }}> {user?.cptAuthCode === 'KAC' ||
<option>그룹선택</option> (user?.authId === 'SUPER' && (
<Input
id='groupSelect'
type='select'
size='sm'
style={{ minWidth: '120px' }}
s
onChange={e => {
const { value } = e.target;
handlerDronOperationChange(value);
}}
>
<option value='all'>그룹선택</option>
{competentAgency?.map(i => (
<option value={i.value}>{i.text}</option>
))}
</Input> </Input>
<button onClick={e => {}} style={{ marginLeft: '8px' }}> ))}
<button
onClick={() => handlerMovePage('/basis/flight/schedule/index')}
style={{ marginLeft: '8px' }}
>
<Plus /> <Plus />
</button> </button>
</div> </div>
</div> </div>
</CardHeader> </CardHeader>
<CardBody> <CardBody>
<GridDatabase data={data} count={data.length} columns={columns} /> <GridDatabase
data={dronOperationList || []}
count={dronOperationList?.length || 0}
columns={columns}
/>
</CardBody> </CardBody>
</Card> </Card>
); );

90
src/containers/main/dash/MainDashContainer.js

@ -7,7 +7,8 @@ import DroneFlightSchedule from '../../../components/dashboard/DroneFlightSchedu
import { DashboardGroupList } from '../../../components/dashboard/DashboardGroupList'; import { DashboardGroupList } from '../../../components/dashboard/DashboardGroupList';
import { DashboardStcsArea } from '../../../components/dashboard/DashboardStcsArea'; import { DashboardStcsArea } from '../../../components/dashboard/DashboardStcsArea';
import { DashboardStcsDay } from '../../../components/dashboard/DashboardStcsDay'; import { DashboardStcsDay } from '../../../components/dashboard/DashboardStcsDay';
import * as Actions from '../../../modules/main/dash/actions/mainDashAction'; import * as DashActions from '../../../modules/main/dash/actions/mainDashAction';
import * as GroupActions from '../../../modules/basis/group/actions/basisGroupAction';
import { MessageErrorModal } from '../../../components/message/MessageErrorModal'; import { MessageErrorModal } from '../../../components/message/MessageErrorModal';
import '@styles/react/libs/flatpickr/flatpickr.scss'; import '@styles/react/libs/flatpickr/flatpickr.scss';
import '@styles/react/libs/tables/react-dataTable-component.scss'; import '@styles/react/libs/tables/react-dataTable-component.scss';
@ -27,75 +28,66 @@ export const MainDashContainer = () => {
const { stcsDayList, stcsAreaList } = useSelector( const { stcsDayList, stcsAreaList } = useSelector(
state => state.mainDashState state => state.mainDashState
); );
const { user } = useSelector(state => state.authState, shallowEqual); const { user } = useSelector(state => state.authState);
const [dayStartDate, setDayStartDate] = useState(new Date()); const [dayStartDate, setDayStartDate] = useState(new Date());
const [areaStartDate, setAreaStartDate] = useState(new Date()); const [areaStartDate, setAreaStartDate] = useState(new Date());
const history = useHistory(); const history = useHistory();
useEffect(() => {
// 일일 비행계획 현황, 일일 비행건수 현황, 일일 비정상상황 현황 Promise.all 처리
dispatch(DashActions.DASHBOARD_DATA.request());
handlerStcsDaySearch(dayStartDate);
handlerStcsAreaSearch(areaStartDate);
}, []);
useEffect(() => {
handlerDronOperationList(user.cptAuthCode);
}, [user]);
// 일 별 비행횟수 통계 날짜 리스트 dispatch
const handlerStcsDaySearch = date => { const handlerStcsDaySearch = date => {
dispatch( dispatch(
Actions.STCS_DAY.request({ DashActions.STCS_DAY.request({
yyyymm: moment(date).format('YYYY-MM') yyyymm: moment(date).format('YYYY-MM')
}) })
); );
}; };
// top5 지역 별 비행횟수 통계 리스트 dispatch
const handlerStcsAreaSearch = date => { const handlerStcsAreaSearch = date => {
dispatch( dispatch(
Actions.STCS_AREA.request({ DashActions.STCS_AREA.request({
yyyymm: moment(date).format('YYYY-MM') yyyymm: moment(date).format('YYYY-MM')
}) })
); );
}; };
const handlerGroupSearch = () => { // 드론 별 비행운항 목록 리스트 dispatch
dispatch( const handlerDronOperationList = data => {
Actions.GROUP_LIST.request({ dispatch(DashActions.DRON_OPERRATION_LIST.request(data));
cstmrSno: user?.cstmrSno
})
);
};
const handlerDronSearch = () => {
dispatch(
Actions.DRON_LIST.request({
cstmrSno: user?.cstmrSno
})
);
}; };
// 일 별 비행횟수 통계 날짜 변경 핸들러
const handlerStcsDayParam = date => { const handlerStcsDayParam = date => {
setDayStartDate(date); setDayStartDate(date);
handlerStcsDaySearch(date); handlerStcsDaySearch(date);
}; };
// top5 지역 별 비행횟수 통계 날짜 변경 핸들러
const handlerStcsAreaParam = date => { const handlerStcsAreaParam = date => {
setAreaStartDate(date); setAreaStartDate(date);
handlerStcsAreaSearch(date); handlerStcsAreaSearch(date);
}; };
const handlerDronDetail = () => { // 드론 별 비행운항 목록 그룹 체인지 핸들러
history.push('/basis/dron/index'); const handlerDronOperationChange = data => {
handlerDronOperationList(data);
}; };
const handlerGroupDetail = useCallback(val => { const handlerMovePage = url => {
history.push('/basis/group/index');
}, []);
const movePage = url => {
history.push(url); history.push(url);
}; };
useEffect(() => {
dispatch(
Actions.DASHBOARD_DATA.request({
serviceType: 'all'
})
);
handlerStcsDaySearch(dayStartDate);
handlerStcsAreaSearch(areaStartDate);
// handlerGroupSearch();
// handlerDronSearch();
}, []);
return ( return (
<div className='main-dashboard'> <div className='main-dashboard'>
@ -103,21 +95,21 @@ export const MainDashContainer = () => {
<Row> <Row>
<Col md={4}> <Col md={4}>
<DashboardGroupList <DashboardGroupList
pageMove={handlerGroupDetail} handlerMovePage={handlerMovePage}
title='dailyFlightPlan' title='dailyFlightPlan'
data={dashboardData?.dailyFlightPlan || []} data={dashboardData?.dailyFlightPlan || []}
/> />
</Col> </Col>
<Col md={4}> <Col md={4}>
<DashboardGroupList <DashboardGroupList
pageMove={handlerGroupDetail} handlerMovePage={handlerMovePage}
title='dailyFlightCount' title='dailyFlightCount'
data={dashboardData?.dailyFlightCount || []} data={dashboardData?.dailyFlightCount || []}
/> />
</Col> </Col>
<Col md={4}> <Col md={4}>
<DashboardGroupList <DashboardGroupList
pageMove={handlerGroupDetail} handlerMovePage={handlerMovePage}
title='dailyFlightWarn' title='dailyFlightWarn'
data={dashboardData?.dailyFlightWarn || []} data={dashboardData?.dailyFlightWarn || []}
/> />
@ -128,8 +120,9 @@ export const MainDashContainer = () => {
<Row> <Row>
<Col lg={8} md={12} className='dashboard-chart'> <Col lg={8} md={12} className='dashboard-chart'>
<DroneFlightSchedule <DroneFlightSchedule
pageMove={handlerGroupDetail} handlerMovePage={handlerMovePage}
data={dashboardData?.dronOperationList || []} handlerDronOperationChange={handlerDronOperationChange}
user={user}
/> />
</Col> </Col>
@ -153,6 +146,7 @@ export const MainDashContainer = () => {
startDate={dayStartDate} startDate={dayStartDate}
setStartDate={handlerStcsDayParam} setStartDate={handlerStcsDayParam}
data={stcsDayList || []} data={stcsDayList || []}
handlerMovePage={handlerMovePage}
/> />
</Col> </Col>
<Col lg={4} md={12} className='dashboard-chart'> <Col lg={4} md={12} className='dashboard-chart'>
@ -164,23 +158,11 @@ export const MainDashContainer = () => {
setStartDate={handlerStcsAreaParam} setStartDate={handlerStcsAreaParam}
data={stcsAreaList || []} data={stcsAreaList || []}
title='flightsRegion' title='flightsRegion'
handlerMovePage={handlerMovePage}
/> />
</Col> </Col>
</Row> </Row>
</div> </div>
{/* <div className='dashboard-section'>
<Row>
<Col md={6}>
<DashboardGroupList
data={groupList}
pageMove={handlerGroupDetail}
/>
</Col>
<Col md={6}>
<DashboardDronList data={dronList} pageMove={handlerDronDetail} />
</Col>
</Row>
</div> */}
<MessageErrorModal /> <MessageErrorModal />
</div> </div>
); );

20
src/modules/main/dash/actions/mainDashAction.ts

@ -6,7 +6,7 @@ import {
StcsAreaData, StcsAreaData,
StcsDayData, StcsDayData,
IDashBoardData, IDashBoardData,
IDashBoardRq IDronOperationList
} from '../models/mainDashModel'; } from '../models/mainDashModel';
const STCS_DAY_REQUEST = 'main/dash/STCS_DAY_REQUEST'; const STCS_DAY_REQUEST = 'main/dash/STCS_DAY_REQUEST';
@ -29,6 +29,13 @@ const DASHBOARD_DATA_REQUEST = 'main/dashboard/DATA_REQUEST';
const DASHBOARD_DATA_SUCCESS = 'main/dashboard/DATA_SUCCESS'; const DASHBOARD_DATA_SUCCESS = 'main/dashboard/DATA_SUCCESS';
const DASHBOARD_DATA_FAILURE = 'main/dashboard/DATA_FAILURE'; const DASHBOARD_DATA_FAILURE = 'main/dashboard/DATA_FAILURE';
const DRON_OPERRATION_LIST_REQUEST =
'main/dashboard/DRON_OPERRATION_LIST_REQUEST';
const DRON_OPERRATION_LIST_SUCCESS =
'main/dashboard/DRON_OPERRATION_LIST_SUCCESS';
const DRON_OPERRATION_LIST_FAILURE =
'main/dashboard/DRON_OPERRATION_LIST_FAILURE';
export const STCS_DAY = createAsyncAction( export const STCS_DAY = createAsyncAction(
STCS_DAY_REQUEST, STCS_DAY_REQUEST,
STCS_DAY_SUCCESS, STCS_DAY_SUCCESS,
@ -57,14 +64,21 @@ export const DASHBOARD_DATA = createAsyncAction(
DASHBOARD_DATA_REQUEST, DASHBOARD_DATA_REQUEST,
DASHBOARD_DATA_SUCCESS, DASHBOARD_DATA_SUCCESS,
DASHBOARD_DATA_FAILURE DASHBOARD_DATA_FAILURE
)<IDashBoardRq, IDashBoardData, AxiosError>(); )<{}, IDashBoardData, AxiosError>();
export const DRON_OPERRATION_LIST = createAsyncAction(
DRON_OPERRATION_LIST_REQUEST,
DRON_OPERRATION_LIST_SUCCESS,
DRON_OPERRATION_LIST_FAILURE
)<string, IDronOperationList[], AxiosError>();
const actions = { const actions = {
STCS_DAY, STCS_DAY,
STCS_AREA, STCS_AREA,
GROUP_LIST, GROUP_LIST,
DRON_LIST, DRON_LIST,
DASHBOARD_DATA DASHBOARD_DATA,
DRON_OPERRATION_LIST
}; };
export type MainDashAction = ActionType<typeof actions>; export type MainDashAction = ActionType<typeof actions>;

1
src/modules/main/dash/apis/mainDashApi.ts

@ -1,6 +1,5 @@
import qs from 'qs'; import qs from 'qs';
import axios from '../../../utils/customAxiosUtil'; import axios from '../../../utils/customAxiosUtil';
import { IDashBoardRq } from '../models/mainDashModel';
export const mainDashAPI = { export const mainDashAPI = {
stcsDay: async (data: { yyyymm: string }) => { stcsDay: async (data: { yyyymm: string }) => {

9
src/modules/main/dash/models/mainDashModel.ts

@ -4,6 +4,7 @@ export interface MainDashState {
groupList: GroupListData[] | undefined; groupList: GroupListData[] | undefined;
dronList: DronListData[] | undefined; dronList: DronListData[] | undefined;
dashboardData: IDashBoardData | undefined; dashboardData: IDashBoardData | undefined;
dronOperationList: IDronOperationList[] | undefined;
} }
export enum EDateType { export enum EDateType {
@ -86,11 +87,6 @@ export interface IDashBoardData {
dailyFlightCount: IDailyFlightCount[]; dailyFlightCount: IDailyFlightCount[];
dailyFlightPlan: IDailyFlightPlan[]; dailyFlightPlan: IDailyFlightPlan[];
dronSituation: IDronSituation[]; dronSituation: IDronSituation[];
dronOperationList: IDronOperationList[];
}
export interface IDashBoardRq {
serviceType: string;
} }
export const initMainDash = { export const initMainDash = {
@ -98,7 +94,8 @@ export const initMainDash = {
stcsAreaList: undefined, stcsAreaList: undefined,
groupList: undefined, groupList: undefined,
dronList: undefined, dronList: undefined,
dashboardData: undefined dashboardData: undefined,
dronOperationList: undefined
}; };
// laanc 승인 목록 검색 // laanc 승인 목록 검색

6
src/modules/main/dash/reducers/mainDashReducer.ts

@ -36,4 +36,10 @@ export const mainDahReducer = createReducer<
const data = action.payload; const data = action.payload;
draft.dashboardData = { ...data }; draft.dashboardData = { ...data };
}) })
)
.handleAction(Actions.DRON_OPERRATION_LIST.success, (state, action) =>
produce(state, draft => {
const data = action.payload;
draft.dronOperationList = data;
})
); );

35
src/modules/main/dash/sagas/mainDashSaga.ts

@ -122,8 +122,6 @@ function* dashboardData(
action: ActionType<typeof Actions.DASHBOARD_DATA.request> action: ActionType<typeof Actions.DASHBOARD_DATA.request>
) { ) {
try { try {
const { serviceType } = action.payload;
/* /*
dailyFlightWarn: 일일 dailyFlightWarn: 일일
dailyFlightPlan: 일일 dailyFlightPlan: 일일
@ -135,8 +133,7 @@ function* dashboardData(
call(Apis.mainDashAPI.dailyFlightWarn), call(Apis.mainDashAPI.dailyFlightWarn),
call(Apis.mainDashAPI.dailyFlightPlan), call(Apis.mainDashAPI.dailyFlightPlan),
call(Apis.mainDashAPI.dailyFlightCount), call(Apis.mainDashAPI.dailyFlightCount),
call(Apis.mainDashAPI.dronSituation), call(Apis.mainDashAPI.dronSituation)
call(Apis.mainDashAPI.dronOperationList, serviceType)
]); ]);
let errorCheck = res.filter(i => i.hasOwnProperty('errorCode')); let errorCheck = res.filter(i => i.hasOwnProperty('errorCode'));
@ -168,8 +165,7 @@ function* dashboardData(
dailyFlightWarn: res[0].data.slice(0, res[0].data.length - 1), dailyFlightWarn: res[0].data.slice(0, res[0].data.length - 1),
dailyFlightPlan: res[1].data, dailyFlightPlan: res[1].data,
dailyFlightCount: res[2].data, dailyFlightCount: res[2].data,
dronSituation: dronSituationArr, dronSituation: dronSituationArr
dronOperationList: res[4].data
}) })
); );
} catch (error) { } catch (error) {
@ -177,10 +173,37 @@ function* dashboardData(
} }
} }
function* dronOperationList(
action: ActionType<typeof Actions.DRON_OPERRATION_LIST.request>
) {
try {
const params = action.payload;
const res = yield call(Apis.mainDashAPI.dronOperationList, params);
const { data, count, errorCode, errorMessage } = res;
if (errorCode) {
// 오류메시지 호출
yield put(
MessageActions.IS_ERROR({
errorCode: errorCode,
errorMessage: '처리중 오류가 발생하였습니다',
isHistoryBack: false,
isRefresh: false
})
);
return;
}
yield put(Actions.DRON_OPERRATION_LIST.success(data));
} catch (error) {
yield put(Actions.DRON_OPERRATION_LIST.failure(error));
}
}
export function* mainDashSaga() { export function* mainDashSaga() {
yield takeEvery(Actions.STCS_DAY.request, listStcsDay); yield takeEvery(Actions.STCS_DAY.request, listStcsDay);
yield takeEvery(Actions.STCS_AREA.request, listStcsArea); yield takeEvery(Actions.STCS_AREA.request, listStcsArea);
yield takeEvery(Actions.GROUP_LIST.request, listGroup); yield takeEvery(Actions.GROUP_LIST.request, listGroup);
yield takeEvery(Actions.DRON_LIST.request, listDron); yield takeEvery(Actions.DRON_LIST.request, listDron);
yield takeEvery(Actions.DASHBOARD_DATA.request, dashboardData); yield takeEvery(Actions.DASHBOARD_DATA.request, dashboardData);
yield takeEvery(Actions.DRON_OPERRATION_LIST.request, dronOperationList);
} }

Loading…
Cancel
Save