Browse Source

feat/관제과 테이블 작업

master
sanguu516 4 weeks ago
parent
commit
93699e78d6
  1. 1045
      src/components/flight/ControlApprovalsTable.js
  2. 24
      src/components/flight/NewFlightApprovalsReport.js
  3. 88
      src/components/flight/OperationApprovalsTable.js
  4. 26
      src/configs/constants.ts
  5. 18
      src/containers/flight/ControlApprovalsContainer.js
  6. 32
      src/containers/flight/OperationApprovalsContainer.js
  7. 2
      src/redux/features/laanc/laancState.ts
  8. 21
      src/redux/features/laanc/laancThunk.ts

1045
src/components/flight/ControlApprovalsTable.js

File diff suppressed because it is too large Load Diff

24
src/components/flight/NewFlightApprovalsReport.js

@ -94,7 +94,7 @@ export default function NewFlightApprovalsReport(props) {
<Input <Input
type='text' type='text'
bsSize='sm' bsSize='sm'
placeholder='신청번호 또는 검토결과를 입력해주세요.' placeholder='신청번호를 입력해주세요.'
value={props.filterId} value={props.filterId}
onChange={e => props.setFilterId(e.target.value)} onChange={e => props.setFilterId(e.target.value)}
onKeyPress={handleKeyDown} onKeyPress={handleKeyDown}
@ -140,18 +140,18 @@ export default function NewFlightApprovalsReport(props) {
<CustomInput <CustomInput
type='select' type='select'
bsSize='sm' bsSize='sm'
id='reviewedType' id='reviewedProcType'
value={props.reviewedType} value={props.reviewedProcType}
onChange={e => props.setReviewedType(e.target.value)} onChange={e => props.setReviewedProcType(e.target.value)}
onKeyPress={handleKeyDown} onKeyPress={handleKeyDown}
> >
{Object.values( {Object.entries(
props.pageName === 'control' props.pageName === 'control'
? FlightCategory.Control ? FlightCategory.Control
: FlightCategory.Operation : FlightCategory.Operation
).map(item => ( ).map(([key, value]) => (
<option key={item} value={item}> <option key={key} value={key}>
{item} {value}
</option> </option>
))} ))}
</CustomInput> </CustomInput>
@ -172,13 +172,13 @@ export default function NewFlightApprovalsReport(props) {
onChange={e => props.setReviewedType(e.target.value)} onChange={e => props.setReviewedType(e.target.value)}
onKeyPress={handleKeyDown} onKeyPress={handleKeyDown}
> >
{Object.values( {Object.entries(
props.pageName === 'control' props.pageName === 'control'
? FlightCategory.Operation ? FlightCategory.Operation
: FlightCategory.Control : FlightCategory.Control
).map(item => ( ).map(([key, value]) => (
<option key={item} value={item}> <option key={key} value={key}>
{item} {value}
</option> </option>
))} ))}
</CustomInput> </CustomInput>

88
src/components/flight/OperationApprovalsTable.js

@ -59,6 +59,7 @@ export default function OperationApprovalsTable(props) {
const [validData, setValidData] = useState(); const [validData, setValidData] = useState();
const [reviewedTypeValue, setReviewedTypeValue] = useState(''); const [reviewedTypeValue, setReviewedTypeValue] = useState('');
useEffect(() => { useEffect(() => {
let approvalCdValue = { S: 0, F: 0, C: 0, U: 0 }; let approvalCdValue = { S: 0, F: 0, C: 0, U: 0 };
@ -99,12 +100,6 @@ export default function OperationApprovalsTable(props) {
const save = async () => { const save = async () => {
try { try {
const values = await form.validateFields(); const values = await form.validateFields();
const currentValue = form.getFieldValue(
`${record.planAreaSno}_${dataIndex}`
);
console.log('>>', record);
console.log('>>', currentValue);
handleSave({ ...record, ...values }); handleSave({ ...record, ...values });
} catch (errInfo) {} } catch (errInfo) {}
@ -134,50 +129,51 @@ export default function OperationApprovalsTable(props) {
if (type === 'operation') { if (type === 'operation') {
switch (value) { switch (value) {
case 'W': case 'W':
text = '검토대기'; text = '대기';
break; break;
case 'Q': case 'Q':
text = '검토요청'; text = '검토요청';
break; break;
case 'A': case 'A':
text = '검토요청'; text = '검토요청';
break; break;
case 'R': case 'S':
text = '검토완료'; text = '완료';
break; break;
case 'C': case 'C':
text = '검토취소'; text = '검토요청취소';
break; break;
case 'U': case 'U':
text = '검토불필요'; text = '불필요';
break; break;
case 'P':
text = '검토요청처리';
break;
default:
text = '-';
} }
return text; return text;
} else if (type === 'control') { } else if (type === 'control') {
switch (value) { switch (value) {
case 'R': case 'R':
text = '검토완료'; text = '재검토';
break;
case 'Q':
text = '검토요청';
break; break;
case 'W': case 'W':
text = '-'; text = '검토대기';
break;
case 'A':
text = '검토재요청';
break; break;
case 'C': case 'C':
text = '요청반려'; text = '검토취소';
break; break;
case 'U': case 'P':
text = '-'; text = '요청처리';
break; break;
default:
text = '-';
} }
return text; return text;
} }
}; };
// 데이터 // 데이터
const columns = [ const columns = [
{ {
@ -225,7 +221,7 @@ export default function OperationApprovalsTable(props) {
dataIndex: 'zoneNo', dataIndex: 'zoneNo',
align: 'center', align: 'center',
width: '85px', width: '85px',
render: zoneNo => <>{zoneNo}</> render: zoneNo => <>{zoneNo}구역</>
}, },
{ {
title: <>신청자</>, title: <>신청자</>,
@ -463,7 +459,7 @@ export default function OperationApprovalsTable(props) {
type='select' type='select'
id='reviewedType' id='reviewedType'
style={{ style={{
width: 100 width: 110
}} }}
value={reviewedType} value={reviewedType}
onClick={handleMouseDown} onClick={handleMouseDown}
@ -481,18 +477,16 @@ export default function OperationApprovalsTable(props) {
<option key={4} value={'C'}> <option key={4} value={'C'}>
검토요청취소 검토요청취소
</option> </option>
<option key={5} value={'S'}> <option key={5} value={'P'}>
검토요청처리 검토요청처리
</option> </option>
<option key={6} value={'A'}> <option key={6} value={'R'}>
재검토요청 재검토요청
</option> </option>
<option key={7} value={'R'}> <option key={7} value={'S'}>
완료 완료
</option> </option>
</Select> </Select>
{/* <>{handlerReviewed(reviewedType, 'operation')}</> */}
</> </>
); );
} }
@ -505,15 +499,11 @@ export default function OperationApprovalsTable(props) {
확인결과 확인결과
</> </>
), ),
dataIndex: 'cReviewedType', dataIndex: 'reviewedProcType',
align: 'center', align: 'center',
width: '130px', width: '130px',
render: cReviewedType => { render: reviewedProcType => {
return ( return <>{handlerReviewed(reviewedProcType, 'control')}</>;
<>
<>{handlerReviewed(cReviewedType, 'control')}</>
</>
);
} }
}, },
{ {
@ -574,9 +564,8 @@ export default function OperationApprovalsTable(props) {
}; };
}); });
// 운항과 select box 상태 변경
const updateReviewedType = async (value, planAreaSno) => { const updateReviewedType = async (value, planAreaSno) => {
console.log('>>', planAreaSno);
try { try {
await dispatch( await dispatch(
updateLaancAprvReview({ updateLaancAprvReview({
@ -624,15 +613,6 @@ export default function OperationApprovalsTable(props) {
} catch (errInfo) { } catch (errInfo) {
handlerErrorModal(ERROR_TITLE, ERROR_MESSAGE, true); handlerErrorModal(ERROR_TITLE, ERROR_MESSAGE, true);
} }
// const newData = [...tempDataSource];
// newData.map(item => {
// if (row.hasOwnProperty(item.planAreaSno)) {
// item.reviewedReason = row[item.planAreaSno];
// }
// });
// setTempDataSource(newData);
}; };
// 단순 메시지 표출 모달 // 단순 메시지 표출 모달
@ -743,7 +723,7 @@ export default function OperationApprovalsTable(props) {
const checkCondition = { const checkCondition = {
A: item => item.reviewedType !== 'R' && item.reviewedType !== 'C', A: item => item.reviewedType !== 'R' && item.reviewedType !== 'C',
Q: item => item.reviewedType !== 'W', Q: item => item.reviewedType !== 'W',
R: item => item.reviewedType !== 'U' && item.reviewedType !== 'W' S: item => item.reviewedType !== 'U' && item.reviewedType !== 'W'
}; };
// 요청 실패 시 에러 메시지 // 요청 실패 시 에러 메시지
@ -753,7 +733,7 @@ export default function OperationApprovalsTable(props) {
'검토결과 완료, 검토취소인 신청건만 재 요청이 가능합니다.' '검토결과 완료, 검토취소인 신청건만 재 요청이 가능합니다.'
], ],
Q: ['검토 요청 실패', '검토결과 대기인 신청건만 요청이 가능합니다.'], Q: ['검토 요청 실패', '검토결과 대기인 신청건만 요청이 가능합니다.'],
R: [ S: [
'검토 완료 실패', '검토 완료 실패',
'검토불필요, 검토대기인 신청건만 재 요청이 가능합니다.' '검토불필요, 검토대기인 신청건만 재 요청이 가능합니다.'
] ]
@ -787,12 +767,12 @@ export default function OperationApprovalsTable(props) {
); );
} }
}, },
R: async () => { S: async () => {
try { try {
await dispatch( await dispatch(
updateLaancAprvReview({ updateLaancAprvReview({
planAreaSnoList: checkList, planAreaSnoList: checkList,
reviewedType: 'R' reviewedType: 'S'
}) })
); );
props.handlerSearch( props.handlerSearch(
@ -864,7 +844,7 @@ export default function OperationApprovalsTable(props) {
</span> </span>
</div> </div>
<div className='download'> <div className='download'>
<Button color='primary' size='sm' onClick={() => handleCheckbox('R')}> <Button color='primary' size='sm' onClick={() => handleCheckbox('S')}>
검토 완료 검토 완료
</Button> </Button>
<Button color='primary' size='sm' onClick={() => handleCheckbox('Q')}> <Button color='primary' size='sm' onClick={() => handleCheckbox('Q')}>

26
src/configs/constants.ts

@ -237,22 +237,22 @@ export type DistrictCategory =
// 비행 확인 상태 // 비행 확인 상태
export const FlightCategory = { export const FlightCategory = {
Control: { Control: {
: '완료', : '전체',
: '검토완료', S: '완료',
: '검토대기', W: '검토대기',
: '재검토', A: '재검토',
: '검토취소', C: '검토취소',
: '요청처리' P: '요청처리'
}, },
Operation: { Operation: {
: '전체', : '전체',
: '완료', S: '완료',
: '검토요청', Q: '검토요청',
: '재검토요청', A: '재검토요청',
: '대기', W: '대기',
: '불필요', U: '불필요',
: '검토요청취소', C: '검토요청취소',
: '검토요청처리' P: '검토요청처리'
} }
}; };

18
src/containers/flight/ControlApprovalsContainer.js

@ -60,6 +60,8 @@ export default function ControlApprovalsContainer({ mode }) {
// 검토 상태값 // 검토 상태값
const [reviewedType, setReviewedType] = useState('전체'); const [reviewedType, setReviewedType] = useState('전체');
const [reviewedProcType, setReviewedProcType] = useState('전체');
const [approvalCd, setApprovalCd] = useState([ const [approvalCd, setApprovalCd] = useState([
{ name: '전체', value: '', select: false }, { name: '전체', value: '', select: false },
{ name: '승인', value: 'S', select: false }, { name: '승인', value: 'S', select: false },
@ -256,8 +258,9 @@ export default function ControlApprovalsContainer({ mode }) {
sig: filterArea.sig === '전체' ? '' : filterArea.sig, sig: filterArea.sig === '전체' ? '' : filterArea.sig,
address: filterArea.address, address: filterArea.address,
...(search !== '' ? { applyNo: search } : {}), ...(search !== '' ? { applyNo: search } : {}),
...(reviewedType !== '전체' ...(reviewedType !== '전체' ? { reviewedType: reviewedType } : {}),
? { reviewedType: checkSearch(reviewedType) } ...(reviewedProcType !== '전체'
? { reviewedProcType: reviewedProcType }
: {}), : {}),
...(approvalCd.filter(i => i.select).length > 0 ...(approvalCd.filter(i => i.select).length > 0
? { approvalCd: approvalCd.filter(i => i.select)[0].value } ? { approvalCd: approvalCd.filter(i => i.select)[0].value }
@ -268,10 +271,11 @@ export default function ControlApprovalsContainer({ mode }) {
setFilter(search); setFilter(search);
}; };
const handlerDetail = area => { //현재 선택한 sno 및 areacoordList 저장
setSelected(area.planAreaSno); const handlerDetail = async area => {
setSelected([area[0].planAreaSno]);
dispatch(clientSaveAreaCoordinateList([area])); dispatch(clientSaveAreaCoordinateList(area));
handlerMapInit(); handlerMapInit();
setMetersRadius('0m'); setMetersRadius('0m');
@ -339,6 +343,8 @@ export default function ControlApprovalsContainer({ mode }) {
controlLayer.features = []; controlLayer.features = [];
let fitZoomPaths = []; let fitZoomPaths = [];
if (!areaCoordList[0]?.lon) return;
const bufferCoordList = areas?.bufferCoordList.map(coord => { const bufferCoordList = areas?.bufferCoordList.map(coord => {
return [coord.lon, coord.lat]; return [coord.lon, coord.lat];
}); });
@ -815,6 +821,8 @@ export default function ControlApprovalsContainer({ mode }) {
setFilterArea={setFilterArea} setFilterArea={setFilterArea}
setReviewedType={setReviewedType} setReviewedType={setReviewedType}
reviewedType={reviewedType} reviewedType={reviewedType}
reviewedProcType={reviewedProcType}
setReviewedProcType={setReviewedProcType}
approvalCd={approvalCd} approvalCd={approvalCd}
handlerApprovalCd={handlerApprovalCd} handlerApprovalCd={handlerApprovalCd}
pageName='control' pageName='control'

32
src/containers/flight/OperationApprovalsContainer.js

@ -63,8 +63,11 @@ export default function OperationApprovalsContainer({ mode }) {
// 식별번호 // 식별번호
const [filterId, setFilterId] = useState(''); const [filterId, setFilterId] = useState('');
// 검토 상태값 // 운항과 검토 상태값
const [reviewedType, setReviewedType] = useState('전체'); const [reviewedType, setReviewedType] = useState('전체');
// 관제과 검토 상태값
const [reviewedProcType, setReviewedProcType] = useState('전체');
// laanc 검토 상태값 // laanc 검토 상태값
const [approvalCd, setApprovalCd] = useState([ const [approvalCd, setApprovalCd] = useState([
{ name: '전체', value: '', select: false }, { name: '전체', value: '', select: false },
@ -273,24 +276,6 @@ export default function OperationApprovalsContainer({ mode }) {
setPopup(popupRef.current); setPopup(popupRef.current);
}; };
const checkSearch = text => {
switch (text) {
case '완료':
return 'R';
case '재검토요청':
return 'A';
case '대기':
return 'W';
case '불필요':
return 'U';
case '검토요청':
return 'Q';
case '검토요청취소':
return 'C';
case '검토요청처리':
return 'S';
}
};
const handlerSearch = (search, searchDate, filterArea) => { const handlerSearch = (search, searchDate, filterArea) => {
setStartDate(searchDate.startDate); setStartDate(searchDate.startDate);
setEndDate(searchDate.endDate); setEndDate(searchDate.endDate);
@ -303,22 +288,21 @@ export default function OperationApprovalsContainer({ mode }) {
sig: filterArea.sig === '전체' ? '' : filterArea.sig, sig: filterArea.sig === '전체' ? '' : filterArea.sig,
address: filterArea.address, address: filterArea.address,
...(search !== '' ? { applyNo: search } : {}), ...(search !== '' ? { applyNo: search } : {}),
...(reviewedType !== '전체' ...(reviewedType !== '전체' ? { reviewedType: reviewedType } : {}),
? { reviewedType: checkSearch(reviewedType) } ...(reviewedProcType !== '전체'
? { reviewedProcType: reviewedProcType }
: {}), : {}),
...(approvalCd.filter(i => i.select).length > 0 ...(approvalCd.filter(i => i.select).length > 0
? { approvalCd: approvalCd.filter(i => i.select)[0].value } ? { approvalCd: approvalCd.filter(i => i.select)[0].value }
: {}) : {})
}) })
); );
// ); // );
setFilter(search); setFilter(search);
}; };
//현재 선택한 sno 및 areacoordList 저장 //현재 선택한 sno 및 areacoordList 저장
const handlerDetail = async area => { const handlerDetail = async area => {
console.log('>>', area);
setSelected([area[0].planAreaSno]); setSelected([area[0].planAreaSno]);
dispatch(clientSaveAreaCoordinateList(area)); dispatch(clientSaveAreaCoordinateList(area));
@ -959,6 +943,8 @@ export default function OperationApprovalsContainer({ mode }) {
setReviewedType={setReviewedType} setReviewedType={setReviewedType}
reviewedType={reviewedType} reviewedType={reviewedType}
approvalCd={approvalCd} approvalCd={approvalCd}
reviewedProcType={reviewedProcType}
setReviewedProcType={setReviewedProcType}
handlerApprovalCd={handlerApprovalCd} handlerApprovalCd={handlerApprovalCd}
pageName='operation' pageName='operation'
/> />

2
src/redux/features/laanc/laancState.ts

@ -647,6 +647,7 @@ export interface ILaancAprvListRs {
fltElevMax: number; fltElevMax: number;
schFltEndDt: string; schFltEndDt: string;
updateDt: string; updateDt: string;
reviewedProcType: string;
planAreaSno: number; planAreaSno: number;
createDt: string; createDt: string;
purpose: string; purpose: string;
@ -665,6 +666,7 @@ export interface ILaancAprvListRs {
areaList: { areaList: {
planAreaSno: number; planAreaSno: number;
planSno: number; planSno: number;
reviewedProcType: string;
reviewedType: string; reviewedType: string;
reviewedReason: string; reviewedReason: string;
limitZoneNm: string; limitZoneNm: string;

21
src/redux/features/laanc/laancThunk.ts

@ -342,7 +342,7 @@ export const updateLaancAprv = createAsyncThunk(
} }
); );
// 검토 수정 API // 운항과 검토 수정 API
export const updateLaancAprvReview = createAsyncThunk( export const updateLaancAprvReview = createAsyncThunk(
'laanc/updateLaancAprvReview', 'laanc/updateLaancAprvReview',
async (rq: ILaancApprovalReviewdRq, thunkAPI) => { async (rq: ILaancApprovalReviewdRq, thunkAPI) => {
@ -360,3 +360,22 @@ export const updateLaancAprvReview = createAsyncThunk(
} }
} }
); );
// 관제과 검토 수정 API
export const updateLaancCAprvReview = createAsyncThunk(
'laanc/updateLaancCAprvReview',
async (rq: ILaancApprovalReviewdRq, thunkAPI) => {
try {
const data: { undefined } = await axios.patch(
`api/bas/dos/plan/reviewed/proc`,
rq
);
return data;
} catch (error) {
openModal({
header: ERROR_TITLE,
body: ERROR_MESSAGE
});
}
}
);

Loading…
Cancel
Save