|
|
@ -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; |
|
|
|