Files
operationSystem-front/src/pages/ServiceManage/LandAuction.js
2025-02-13 15:05:23 +09:00

275 lines
8.5 KiB
JavaScript

import { useState, Fragment, useRef } from 'react';
import { useRecoilValue } from 'recoil';
import { useTranslation } from 'react-i18next';
import 'react-datepicker/dist/react-datepicker.css';
import {
BuildingView,
LandAuctionDelete,
LandAuctionDetailView, LandView,
} from '../../apis';
import { authList } from '../../store/authList';
import {
authType,
modalTypes,
landAuctionStatusType,
landAuctionStatus,
landSize,
caliumStatus, commonStatus,
} from '../../assets/data';
import { Title, FormWrapper, TableStyle, TableWrapper} from '../../styles/Components';
import {
CheckBox,
Button,
DynamicModal,
Pagination,
ViewTableInfo, ExcelDownButton,
} from '../../components/common';
import { convertKTC, timeDiffMinute } from '../../utils';
import { LandAuctionModal, LandAuctionSearchBar } from '../../components/ServiceManage';
import { INITIAL_PAGE_SIZE, INITIAL_PAGE_LIMIT } from '../../assets/data/adminConstants';
import { useDataFetch, useModal, useTable, withAuth } from '../../utils/hook';
import { useLandAuctionSearch } from '../../components/ServiceManage/searchBar/LandAuctionSearchBar';
import { StatusWapper, ChargeBtn, StatusLabel } from '../../styles/ModuleComponents';
const LandAuction = () => {
const token = sessionStorage.getItem('token');
const userInfo = useRecoilValue(authList);
const { t } = useTranslation();
const tableRef = useRef(null);
const [detailData, setDetailData] = useState({});
const {
modalState,
handleModalView,
handleModalClose
} = useModal({
detail: 'hidden',
deleteConfirm: 'hidden',
deleteComplete: 'hidden'
});
const [alertMsg, setAlertMsg] = useState('');
const [modalType, setModalType] = useState('regist');
const {
searchParams,
data: dataList,
handleSearch,
handleReset,
handlePageChange,
handlePageSizeChange,
handleOrderByChange,
updateSearchParams
} = useLandAuctionSearch(token, INITIAL_PAGE_SIZE);
const {
selectedRows,
handleSelectRow,
isRowSelected
} = useTable(dataList?.auction_list || [], {mode: 'single'});
const {
data: landData
} = useDataFetch(() => LandView(token), [token]);
const {
data: buildingData
} = useDataFetch(() => BuildingView(token), [token]);
const handleModalSubmit = async (type, param = null) => {
switch (type) {
case "regist":
setModalType('regist');
handleModalView('detail');
break;
case "detail":
await LandAuctionDetailView(token, param).then(data => {
setDetailData(data.auction_detail);
setModalType('modify');
handleModalView('detail');
});
break;
case "delete":
const date_check = selectedRows.every(row => {
const timeDiff = timeDiffMinute(convertKTC(row.auction_start_dt), (new Date));
return timeDiff < 3;
});
if(date_check){
setAlertMsg(t('LAND_AUCTION_DELETE_DATE_WARNING'));
return;
}
if(selectedRows[0].status === landAuctionStatusType.auction_start || selectedRows[0].status === landAuctionStatusType.stl_end){
setAlertMsg(t('LAND_AUCTION_DELETE_STATUS_WARNING'));
return;
}
handleModalView('deleteConfirm');
break;
case "deleteConfirm":
let list = [];
let isChecked = false;
selectedRows.map(data => {
// const row = dataList.list.find(row => row.id === Number(data.id));
// if(row.status !== commonStatus.wait) isChecked = true;
list.push({
id: data.id,
});
});
if(isChecked) {
setAlertMsg(t('LAND_AUCTION_WARNING_DELETE'))
handleModalClose('deleteConfirm');
return;
}
await LandAuctionDelete(token, list).then(data => {
handleModalClose('deleteConfirm');
if(data.result === "SUCCESS") {
handleModalView('deleteComplete');
}else if(data.result === "ERROR_AUCTION_STATUS_IMPOSSIBLE"){
setAlertMsg(t('LAND_AUCTION_ERROR_DELETE_STATUS'));
}else{
setAlertMsg(t('DELETE_FAIL'));
}
}).catch(reason => {
setAlertMsg(t('API_FAIL'));
});
break;
case "deleteComplete":
handleModalClose('deleteComplete');
window.location.reload();
break;
case "warning":
setAlertMsg('')
break;
}
}
return (
<>
<Title>랜드 경매 관리</Title>
<FormWrapper>
<LandAuctionSearchBar
searchParams={searchParams}
onSearch={(newParams, executeSearch = true) => {
if (executeSearch) {
handleSearch(newParams);
} else {
updateSearchParams(newParams);
}
}}
onReset={handleReset}
/>
</FormWrapper>
<ViewTableInfo total={dataList?.total} total_all={dataList?.total_all} handleOrderBy={handleOrderByChange} handlePageSize={handlePageSizeChange}>
<ExcelDownButton tableRef={tableRef} fileName={t('FILE_LAND_AUCTION')} />
{userInfo.auth_list?.some(auth => auth.id === authType.landAuctionDelete) && (
<Button theme={selectedRows.length === 0 ? 'disable' : 'line'} text="선택 취소" handleClick={() => handleModalSubmit('delete')} />
)}
{userInfo.auth_list?.some(auth => auth.id === authType.landAuctionUpdate) && (
<Button
theme="primary"
text="경매 등록"
type="button"
handleClick={e => handleModalSubmit('regist')}
/>
)}
</ViewTableInfo>
<TableWrapper>
<TableStyle ref={tableRef}>
<caption></caption>
<thead>
<tr>
<th width="40"></th>
{/*<th width="80">번호</th>*/}
<th width="90">경매 상태</th>
<th width="80">랜드 크기</th>
<th width="200">랜드 이름</th>
<th width="90">인스턴스 </th>
{/*<th width="100">경매 재화</th>*/}
<th width="90">경매 시작가</th>
<th width="200">예약 시작일</th>
<th width="200">예약 종료일</th>
<th width="200">경매 시작일</th>
<th width="200">경매 종료일</th>
<th width="200">낙찰 정산일</th>
<th width="90">낙찰 정산가</th>
<th width="100">낙찰자</th>
<th width="100">확인 / 수정</th>
<th width="150">히스토리</th>
</tr>
</thead>
<tbody>
{dataList?.auction_list?.map(auction => (
<tr key={auction.row_num}>
<td>
<CheckBox name={'select'} id={auction.id}
setData={(e) => handleSelectRow(e, auction)}
checked={isRowSelected(auction.id)} />
</td>
{/*<td>{event.row_num}</td>*/}
<StatusWapper>
<StatusLabel $status={auction.status}>
{landAuctionStatus.find(data => data.value === auction.status).name}
</StatusLabel>
</StatusWapper>
{/*<td>{landAuctionStatus.find(data => data.value === auction.status)?.name}</td>*/}
<td>{auction.land_size}</td>
<td>{auction.land_name}</td>
<td>{auction.land_socket}</td>
{/*<td>{auction.currency_type}</td>*/}
<td>{auction.start_price}</td>
<td>{convertKTC(auction.resv_start_dt)}</td>
<td>{convertKTC(auction.resv_end_dt)}</td>
<td>{convertKTC(auction.auction_start_dt)}</td>
<td>{convertKTC(auction.auction_end_dt)}</td>
<td>{convertKTC(auction.close_end_dt)}</td>
<td>{auction.close_price}</td>
<td>{auction.bidder_nickname}</td>
<td>
<Button theme="line" text="상세보기"
handleClick={e => handleModalSubmit('detail', auction.id)} />
</td>
<td>{auction.update_by}</td>
</tr>
))}
</tbody>
</TableStyle>
</TableWrapper>
<Pagination postsPerPage={searchParams.pageSize} totalPosts={dataList?.total_all} setCurrentPage={handlePageChange} currentPage={searchParams.currentPage} pageLimit={INITIAL_PAGE_LIMIT} />
{/*상세*/}
<LandAuctionModal modalType={modalType} detailView={modalState.detailModal} handleDetailView={() => handleModalClose('detail')} content={detailData} setDetailData={setDetailData} landData={landData} buildingData={buildingData} />
{/*삭제 확인*/}
<DynamicModal
modalType={modalTypes.confirmOkCancel}
view={modalState.deleteConfirmModal}
handleCancel={() => handleModalClose('deleteConfirm')}
handleSubmit={() => handleModalSubmit('deleteConfirm')}
modalText={t('LAND_AUCTION_SELECT_DELETE')}
/>
{/*삭제 완료*/}
<DynamicModal
modalType={modalTypes.completed}
view={modalState.deleteCompleteModal}
handleSubmit={() => handleModalSubmit('deleteComplete')}
modalText={t('DEL_COMPLETE')}
/>
{/* 경고 모달 */}
<DynamicModal
modalType={modalTypes.completed}
view={alertMsg ? 'view' : 'hidden'}
modalText={alertMsg}
handleSubmit={() => handleModalSubmit('warning')}
/>
</>
)
};
export default withAuth(authType.landAuctionRead)(LandAuction);