Browse Source

비행 계획 승인 목록 수정

feature/auth
김장현 2 years ago
parent
commit
4387559ba7
  1. 385
      src/containers/basis/flight/aprv/FlightPlanAprvContainer.js
  2. 17
      src/modules/basis/flight/reducers/basisFlightReducer.ts

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

@ -1,32 +1,37 @@
import React, {useEffect, useState} from 'react'; import React, { useEffect, useState } from 'react';
import {Col, Row, Button} from 'reactstrap'; import { Col, Row, Button } from 'reactstrap';
import {CustomMainLayout} from '../../../../components/layout/CustomMainLayout'; import { CustomMainLayout } from '../../../../components/layout/CustomMainLayout';
import moment from 'moment/moment'; import moment from 'moment/moment';
import FlightPlanAprvSearch from '../../../../components/basis/flight/aprv/FlightPlanAprvSearch'; import FlightPlanAprvSearch from '../../../../components/basis/flight/aprv/FlightPlanAprvSearch';
import FlightPlanAprvGrid from '../../../../components/basis/flight/aprv/FlightPlanAprvGrid'; import FlightPlanAprvGrid from '../../../../components/basis/flight/aprv/FlightPlanAprvGrid';
import FlightPlanGrid from '../../../../components/basis/flight/plan/FlightPlanGrid'; import FlightPlanGrid from '../../../../components/basis/flight/plan/FlightPlanGrid';
import {useDispatch, useSelector, shallowEqual} from 'react-redux'; import { useDispatch, useSelector, shallowEqual } from 'react-redux';
import * as FlightAction from '../../../../modules/basis/flight/actions/basisFlightAction'; import * as FlightAction from '../../../../modules/basis/flight/actions/basisFlightAction';
import {useHistory} from 'react-router-dom'; import { useHistory } from 'react-router-dom';
import FlightPlanGroupGrid from '../../../../components/basis/flight/plan/FlightPlanGroupGrid'; import FlightPlanGroupGrid from '../../../../components/basis/flight/plan/FlightPlanGroupGrid';
import { JOIN_LIST } from '../../../../modules/basis/group/actions/basisGroupAction'; import { JOIN_LIST } from '../../../../modules/basis/group/actions/basisGroupAction';
import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap' import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';
const initSearchData = { const initSearchData = {
schFltStDt: moment().set({'date': 1, 'h': 0, 'm': 0, 's': 0}).format('YYYY-MM-DD HH:mm:ss'), schFltStDt: moment()
schFltEndDt: moment().set({'h': 23, 'm': 59, 's': 59}).format('YYYY-MM-DD HH:mm:ss'), .set({ date: 1, h: 0, m: 0, s: 0 })
aprvlYn: 'N', .format('YYYY-MM-DD HH:mm:ss'),
groupId: '', schFltEndDt: moment()
cstmrSno: 0, .set({ h: 23, m: 59, s: 59 })
.format('YYYY-MM-DD HH:mm:ss'),
aprvlYn: 'N',
groupId: '',
cstmrSno: 0
}; };
const FlightPlanAprvContainer = () => { const FlightPlanAprvContainer = () => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const history = useHistory(); const history = useHistory();
const [searchData, setSearchData] = useState(initSearchData); const [searchData, setSearchData] = useState(initSearchData);
const [selPlanSnoList, setSelPlanSnoList] = useState([]); const [selPlanSnoList, setSelPlanSnoList] = useState([]);
const {list: aprvList, aprvProc, selectGroup} = useSelector(state => state.flightState); const { aprvList, aprvProc, selectGroup } = useSelector(
state => state.flightState
);
const { joinList, joinListCount } = useSelector(state => state.groupState); const { joinList, joinListCount } = useSelector(state => state.groupState);
const { user } = useSelector(state => state.authState, shallowEqual); const { user } = useSelector(state => state.authState, shallowEqual);
const [modal, setModal] = useState({ const [modal, setModal] = useState({
@ -34,121 +39,153 @@ const FlightPlanAprvContainer = () => {
title: '', title: '',
desc: '', desc: '',
color: '' color: ''
}) });
const handleGroupSelect = ({ groupId, groupNm, groupAuthCd }) => { const handleGroupSelect = ({ groupId, groupNm, groupAuthCd }) => {
// 권한 상관 없이 모두 조회 가능 // 권한 상관 없이 모두 조회 가능
const param = searchData; const param = searchData;
param.cstmrSno = user.cstmrSno; param.cstmrSno = user.cstmrSno;
param.groupId = groupId; param.groupId = groupId;
dispatch(FlightAction.FLIGHT_PLAN_GROUP_SELECT( {cstmrSno: user.cstmrSno, groupId: groupId, groupNm: groupNm} )); dispatch(
FlightAction.FLIGHT_PLAN_GROUP_SELECT({
cstmrSno: user.cstmrSno,
groupId: groupId,
groupNm: groupNm
})
);
// groupId sessionStorage에 보관 (1 브라우저 1 tab에만 유효) // groupId sessionStorage에 보관 (1 브라우저 1 tab에만 유효)
sessionStorage.setItem('groupId', groupId); sessionStorage.setItem('groupId', groupId);
sessionStorage.setItem('cstmrSno', user.cstmrSno); sessionStorage.setItem('cstmrSno', user.cstmrSno);
setSearchData(prevState => { setSearchData(prevState => {
return { return {
...prevState, ...prevState,
cstmrSno: user.cstmrSno, cstmrSno: user.cstmrSno,
groupId: groupId groupId: groupId
} };
}); });
dispatch(FlightAction.FLIGHT_PLAN_LIST.request(param)); dispatch(FlightAction.FLIGHT_PLAN_LIST.request(param));
} };
const handlerGroupCancel = () => { const handlerGroupCancel = () => {
dispatch(FlightAction.FLIGHT_PLAN_GROUP_SELECT( {cstmrSno: 0, groupId: '', groupNm: ''} )); dispatch(
} FlightAction.FLIGHT_PLAN_GROUP_SELECT({
cstmrSno: 0,
groupId: '',
groupNm: ''
})
);
};
const handleMoveDetail = (id) => { const handleMoveDetail = id => {
history.push(`/basis/flight/plan/detail/${id}`) history.push(`/basis/flight/plan/detail/${id}`);
} };
const columns = [ const columns = [
{id: 'planSno', name: '번호', cell: (row, i) => (<div>{i + 1}</div>)}, { id: 'planSno', name: '번호', cell: (row, i) => <div>{i + 1}</div> },
{id: 'fltPurpose', name: '비행목적', cell: row => (<div>{row.fltPurpose}</div>)}, {
{ id: 'fltPurpose',
id: 'fltMethod', name: '비행방식', cell: row => { name: '비행목적',
const displayName = row.areaList && row.areaList.length > 0 && row.areaList[0].fltMethod || '-'; cell: row => <div>{row.fltPurpose}</div>
return <div>{displayName}</div> },
} {
}, id: 'fltMethod',
{id: 'schFltStDt', name: '출발일', cell: row => (<div>{row.schFltStDt}</div>)}, name: '비행방식',
{id: 'aprvlYn', name: '승인여부', cell: row => (<div>{row.aprvlYn}</div>)}, cell: row => {
{ const displayName =
id: 'moveDetail', name: '상세보기', cell: row => { (row.areaList &&
return <Button.Ripple color='primary' size='sm' onClick={() => { row.areaList.length > 0 &&
handleMoveDetail(row.planSno)} row.areaList[0].fltMethod) ||
}>상세</Button.Ripple>; '-';
} return <div>{displayName}</div>;
} }
]; },
{
// 최초 비행계획서 목록 조회 id: 'schFltStDt',
useEffect(() => { name: '출발일',
cell: row => <div>{row.schFltStDt}</div>
handleSearch(searchData); },
}, []) { id: 'aprvlYn', name: '승인여부', cell: row => <div>{row.aprvlYn}</div> },
useEffect(() => { {
if (user?.cstmrSno) { id: 'moveDetail',
dispatch( name: '상세보기',
JOIN_LIST.request({ cell: row => {
cstmrSno: user?.cstmrSno return (
}) <Button.Ripple
); color='primary'
size='sm'
onClick={() => {
handleMoveDetail(row.planSno);
}}
>
상세
</Button.Ripple>
);
} }
}, [user])
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 useEffect(() => {
})) // handleSearch(searchData);
}, []);
useEffect(() => {
if (user?.cstmrSno) {
dispatch(
JOIN_LIST.request({
cstmrSno: user?.cstmrSno
})
);
} }
const handleChangeSelected = ({selectedRows}) => { }, [user]);
setSelPlanSnoList(selectedRows.map(item => item.planSno)) useEffect(() => {
if (aprvProc && aprvProc.result > 0) {
handleSearch(searchData);
} }
const handleClickAprv = (type) => (e) => { }, [aprvProc]);
// notAprov, aprv
// console.log(type, selPlanSnoList, e) const handleSearch = data => {
if (!selPlanSnoList || selPlanSnoList.length < 1) { dispatch(FlightAction.FLIGHT_APRV_LIST.request(data));
// alert('비행계획서를 선택해주세요.'); };
// return; const handleChangeSearchData = values => {
setModal({ setSearchData(prevState => ({
isOpen: true, ...prevState,
title: '비행 계획 승인', ...values
desc: '비행계획서를 선택해주세요.', }));
color: 'modal-danger' };
}) const handleChangeSelected = ({ selectedRows }) => {
return; setSelPlanSnoList(selectedRows.map(item => item.planSno));
};
} const handleClickAprv = type => e => {
; // notAprov, aprv
const sendData = { // console.log(type, selPlanSnoList, e)
planSnoList: [...selPlanSnoList], if (!selPlanSnoList || selPlanSnoList.length < 1) {
aprvlYn: type === 'aprv' ? 'Y' : 'N' // alert('비행계획서를 선택해주세요.');
} // return;
dispatch(FlightAction.FLIGHT_APRV_PROC.request(sendData)); setModal({
isOpen: true,
title: '비행 계획 승인',
desc: '비행계획서를 선택해주세요.',
color: 'modal-danger'
});
return;
} }
const sendData = {
planSnoList: [...selPlanSnoList],
aprvlYn: type === 'aprv' ? 'Y' : 'N'
};
dispatch(FlightAction.FLIGHT_APRV_PROC.request(sendData));
};
return ( return (
<CustomMainLayout title={"비행계획서 승인"}> <CustomMainLayout title={'비행계획서 승인'}>
<div className='pal-card-box'> <div className='pal-card-box'>
<Row> <Row>
{/* <Col sm='12'> {/* <Col sm='12'>
<FlightPlanAprvSearch <FlightPlanAprvSearch
searchData={searchData} searchData={searchData}
handleChangeSearchData={handleChangeSearchData} handleChangeSearchData={handleChangeSearchData}
@ -168,68 +205,66 @@ const FlightPlanAprvContainer = () => {
handleClickAprv={handleClickAprv} handleClickAprv={handleClickAprv}
/> />
</Col> */} </Col> */}
<Col sm='4'> <Col sm='4'>
<FlightPlanGroupGrid <FlightPlanGroupGrid
data = {joinList} data={joinList}
count = {joinListCount} count={joinListCount}
selectGroup = {selectGroup} selectGroup={selectGroup}
handleGroupSelect = {handleGroupSelect} handleGroupSelect={handleGroupSelect}
handlerGroupCancel = {handlerGroupCancel} handlerGroupCancel={handlerGroupCancel}
/> />
</Col> </Col>
<Col sm='8'> <Col sm='8'>
{selectGroup.cstmrSno !==0 ? ( {selectGroup.cstmrSno !== 0 ? (
<> <>
<FlightPlanAprvSearch {console.log(searchData)}
searchData={searchData} <FlightPlanAprvSearch
handleChangeSearchData={handleChangeSearchData} searchData={searchData}
handleSearch={handleSearch} handleChangeSearchData={handleChangeSearchData}
/> handleSearch={handleSearch}
<FlightPlanAprvGrid />
data={aprvList} <FlightPlanAprvGrid
columns={columns} data={aprvList}
handleClickAprv={handleClickAprv} columns={columns}
joinList={joinList} handleClickAprv={handleClickAprv}
selectGroup={selectGroup} joinList={joinList}
/> selectGroup={selectGroup}
</> />
) : ( </>
<div className='no-dataTable'> ) : (
나의 그룹 목록에서 상세보기를 클릭하세요. <div className='no-dataTable'>
</div> 나의 그룹 목록에서 상세보기를 클릭하세요.
)} </div>
</Col> )}
</Row> </Col>
</div> </Row>
</div>
<div className='vertically-centered-modal'>
<Modal <div className='vertically-centered-modal'>
isOpen={modal.isOpen} <Modal
toggle={() => setModal({ ...modal, isOpen: !modal.isOpen })} isOpen={modal.isOpen}
modalClassName={modal.color} toggle={() => setModal({ ...modal, isOpen: !modal.isOpen })}
className='modal-dialog-centered' modalClassName={modal.color}
> className='modal-dialog-centered'
<ModalHeader >
toggle={() => setModal({ ...modal, isOpen: !modal.isOpen })} <ModalHeader
> toggle={() => setModal({ ...modal, isOpen: !modal.isOpen })}
{modal.title} >
</ModalHeader> {modal.title}
<ModalBody>{modal.desc}</ModalBody> </ModalHeader>
<ModalFooter> <ModalBody>{modal.desc}</ModalBody>
<Button <ModalFooter>
color='danger' <Button
onClick={() => setModal({ ...modal, isOpen: !modal.isOpen })} color='danger'
> onClick={() => setModal({ ...modal, isOpen: !modal.isOpen })}
확인 >
</Button>{' '} 확인
</ModalFooter> </Button>{' '}
</Modal> </ModalFooter>
</div> </Modal>
</div>
</CustomMainLayout> </CustomMainLayout>
);
};
)
}
export default FlightPlanAprvContainer; export default FlightPlanAprvContainer;

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

@ -2,11 +2,16 @@ import { createReducer } from 'typesafe-actions';
import produce from 'immer'; import produce from 'immer';
import * as Actions from '../actions/basisFlightAction'; import * as Actions from '../actions/basisFlightAction';
import { FlightState, initFlight, initFlightBas } from '../models/basisFlightModel'; import {
FlightState,
initFlight,
initFlightBas
} from '../models/basisFlightModel';
import { any } from 'prop-types'; import { any } from 'prop-types';
export const flightReducer = createReducer<FlightState, Actions.FlightAction>(
export const flightReducer = createReducer<FlightState, Actions.FlightAction>(initFlight) initFlight
)
.handleAction(Actions.PUBLIC_AREA_LIST.success, (state, action) => .handleAction(Actions.PUBLIC_AREA_LIST.success, (state, action) =>
produce(state, draft => { produce(state, draft => {
const { data } = action.payload; const { data } = action.payload;
@ -23,7 +28,7 @@ export const flightReducer = createReducer<FlightState, Actions.FlightAction>(in
.handleAction(Actions.FLIGHT_PLAN_LIST.success, (state, action) => .handleAction(Actions.FLIGHT_PLAN_LIST.success, (state, action) =>
produce(state, draft => { produce(state, draft => {
const data = action.payload; const data = action.payload;
draft.list = data; draft.aprvList = data;
}) })
) )
// 상세 // 상세
@ -35,7 +40,7 @@ export const flightReducer = createReducer<FlightState, Actions.FlightAction>(in
) )
.handleAction(Actions.FLIGHT_PLAN_DETAIL_INIT, (state, action) => .handleAction(Actions.FLIGHT_PLAN_DETAIL_INIT, (state, action) =>
produce(state, draft => { produce(state, draft => {
draft.detail = initFlightBas.initDetail draft.detail = initFlightBas.initDetail;
}) })
) )
// 조종사 조회 // 조종사 조회
@ -124,4 +129,4 @@ export const flightReducer = createReducer<FlightState, Actions.FlightAction>(in
const data = action.payload; const data = action.payload;
draft.aprvProc = data; draft.aprvProc = data;
}) })
) );

Loading…
Cancel
Save