비즈니스 로그조회 추가
This commit is contained in:
@@ -9,6 +9,7 @@ import {
|
||||
AdminView,
|
||||
AuthSetting,
|
||||
AuthSettingUpdate,
|
||||
BusinessLogView,
|
||||
CaliumRequest,
|
||||
LogView,
|
||||
} from './pages/UserManage';
|
||||
@@ -59,6 +60,7 @@ const RouteInfo = () => {
|
||||
<Route path="landview" element={<LandInfoView />} />
|
||||
<Route path="gamelogview" element={<GameLogView />} />
|
||||
<Route path="cryptview" element={<CryptView />} />
|
||||
<Route path="businesslogview" element={<BusinessLogView />} />
|
||||
</Route>
|
||||
<Route path="/servicemanage">
|
||||
<Route path="board" element={<Board />} />
|
||||
|
||||
18
src/apis/Log.js
Normal file
18
src/apis/Log.js
Normal file
@@ -0,0 +1,18 @@
|
||||
//운영 정보 관리 - 로그 api 연결
|
||||
|
||||
import { Axios } from '../utils';
|
||||
|
||||
// 비즈니스 로그 조회
|
||||
export const BusinessLogList = async (token, params) => {
|
||||
try {
|
||||
const res = await Axios.post(`/api/v1/log/generic/list`, params, {
|
||||
headers: { Authorization: `Bearer ${token}` },
|
||||
});
|
||||
|
||||
return res.data;
|
||||
} catch (e) {
|
||||
if (e instanceof Error) {
|
||||
throw new Error('BusinessLogList Error', e);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -83,6 +83,12 @@ export const menuConfig = {
|
||||
permissions: {
|
||||
read: authType.cryptoRead
|
||||
}
|
||||
},
|
||||
businesslogview: {
|
||||
title: '비즈니스 로그 조회',
|
||||
permissions: {
|
||||
read: authType.businessLogRead
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -149,6 +149,12 @@ export const userSearchType = [
|
||||
{ value: 'NAME', name: '닉네임' },
|
||||
];
|
||||
|
||||
export const userSearchType2 = [
|
||||
{ value: 'GUID', name: 'GUID' },
|
||||
{ value: 'NICKNAME', name: '닉네임' },
|
||||
{ value: 'ACCOUNT', name: 'Account ID' },
|
||||
];
|
||||
|
||||
export const landSearchType = [
|
||||
{ value: 'ID', name: '랜드ID' },
|
||||
{ value: 'NAME', name: '랜드명' },
|
||||
@@ -227,4 +233,592 @@ export const opLandInfoStatusType = [
|
||||
{ value: 'AUCTION_END', name: '경매 완료' },
|
||||
{ value: 'AUCTION_WAIT', name: '경매 대기' },
|
||||
{ value: 'AUCTION_RUNNING', name: '경매 진행' },
|
||||
];
|
||||
];
|
||||
|
||||
// export const logAction = [
|
||||
// { value: "None", name: "ALL" },
|
||||
// { value: "AIChatDeleteCharacter", name: "NPC 삭제" },
|
||||
// { value: "AIChatDeleteUser", name: "유저 삭제" },
|
||||
// { value: "AIChatGetCharacter", name: "NPC 조회" },
|
||||
// { value: "AIChatIncentiveMarking", name: "인센티브 획득 마킹" },
|
||||
// { value: "AIChatIncentiveSearch", name: "인센티브 조회" },
|
||||
// { value: "AIChatJwtIssue", name: "Jwt 토큰 발행" },
|
||||
// { value: "AIChatJwtVerify", name: "Jwt 토큰 확인" },
|
||||
// { value: "AIChatPointCharge", name: "포인트 충전" },
|
||||
// { value: "AIChatPointChargeVerify", name: "포인트 충전 확인" },
|
||||
// { value: "AIChatRegisterCharacter", name: "NPC 등록" },
|
||||
// { value: "AIChatRegisterUser", name: "유저 등록" },
|
||||
// { value: "AIChatUpdateCharacter", name: "NPC 정보 업데이트" },
|
||||
// { value: "BanParty", name: "파티 추방" },
|
||||
// { value: "BattleInstanceJoin", name: "배틀 인스턴스 조인" },
|
||||
// { value: "BattleInstanceSnapshotCreate", name: "배틀 인스턴스 스냅샷 생성" },
|
||||
// { value: "BattleInstanceSnapshotSave", name: "배틀 인스턴스 스냅샷 저장" },
|
||||
// { value: "BattleObjectInteraction", name: "배틀 오브젝트 상호작용" },
|
||||
// { value: "BattleObjectStateUpdate", name: "배틀 오브젝트 상태 변경" },
|
||||
// { value: "BattlePodCombatOccupyReward", name: "포드 컴뱃 소유 보상" },
|
||||
// { value: "BattleRoundStateUpdate", name: "배틀 라운드 스테이트 업데이트" },
|
||||
// { value: "BattleUserDead", name: "유저 데드" },
|
||||
// { value: "BattleUserRespawn", name: "배틀 리스폰" },
|
||||
// { value: "BeaconAppearanceCustomize", name: "비컨 외형 커스터마이징" },
|
||||
// { value: "BeaconCreate", name: "비컨 생성" },
|
||||
// { value: "BeaconEdit", name: "비컨 편집" },
|
||||
// { value: "BeaconSell", name: "비컨 매각" },
|
||||
// { value: "BrokerApiAdmin", name: "BrokerApi 어드민 재화 지급" },
|
||||
// { value: "BrokerApiPlanetAuth", name: "BrokerApi Planet 인증" },
|
||||
// { value: "BrokerApiUserExchangeComplete", name: "BrokerApi 재화 교환 완료" },
|
||||
// { value: "BrokerApiUserExchangeOrder", name: "BrokerApi 재화 교환 주문" },
|
||||
// { value: "BrokerApiUserLogin", name: "BrokerApi 유저 로그인" },
|
||||
// { value: "BuffAdd", name: "버프 추가" },
|
||||
// { value: "BuffDelete", name: "버프 제거" },
|
||||
// { value: "CaliumSyncEchoSystem", name: "칼리움 동기화 처리" },
|
||||
// { value: "CancelFriendRequest", name: "친구요청 취소" },
|
||||
// { value: "CartAdd", name: "장바구니 추가" },
|
||||
// { value: "CartDelete", name: "장바구니 삭제" },
|
||||
// { value: "CartPurchase", name: "장바구니 구매" },
|
||||
// { value: "ChangeConvertCaliumInfo", name: "칼리움 정보 변환" },
|
||||
// { value: "CharacterAppearanceCustomize", name: "캐리터 외형 커스터마이징" },
|
||||
// { value: "CharacterAppearanceUpdate", name: "캐릭터 외형 갱신" },
|
||||
// { value: "CharacterCreate", name: "캐릭터 생성(자동 생성)" },
|
||||
// { value: "CharacterLoading", name: "캐릭터 로딩" },
|
||||
// { value: "ChatChannel", name: "채널 채팅" },
|
||||
// { value: "ChatNormal", name: "노말 채팅" },
|
||||
// { value: "ChatNotice", name: "전서버 채팅" },
|
||||
// { value: "ChatParty", name: "파티 채팅" },
|
||||
// { value: "ChatWhisper", name: "귓속말 채팅" },
|
||||
// { value: "CheatAllCraftFinish", name: "치트로 인한 모든 제작 시간 단축" },
|
||||
// { value: "CheatCommandChangeNickName", name: "치트로 인한 캐릭터 명 변경" },
|
||||
// { value: "CheatCommandCharacterInit", name: "치트로 인한 캐릭터 초기화" },
|
||||
// { value: "CheatCommandClaimReset", name: "치트로 인한 클레임 리워드 리셋" },
|
||||
// { value: "CheatCommandClaimUpdate", name: "치트로 인한 클레임 리워드 대기시간 단축" },
|
||||
// { value: "CheatCommandCraftHelpInit", name: "치트로 인한 제작 헬프 초기화" },
|
||||
// { value: "CheatCommandDeleteQuest", name: "치트로 인한 퀘스트 삭제" },
|
||||
// { value: "CheatCommandGainLand", name: "치트로 인한 랜드 획득" },
|
||||
// { value: "CheatCommandIncreaseExp", name: "치트로 인한 시즌 패스 경험치 증가" },
|
||||
// { value: "CheatCommandItem", name: "치트로 인한 아이템 추가 삭제" },
|
||||
// { value: "CheatCommandItemLevelUp", name: "치트로 인한 아이템 레벨 업" },
|
||||
// { value: "CheatCommandLandAuctionBlindSet", name: "치트로 인한 랜드 경매 블라이인드 입찰 설정" },
|
||||
// { value: "CheatCommandLandAuctionCanel", name: "치트로 인한 랜드 경매 취소" },
|
||||
// { value: "CheatCommandLandAuctionReserve", name: "치트로 인한 랜드 경매 예약" },
|
||||
// { value: "CheatCommandLandAuctionStart", name: "치트로 인한 랜드 경매 시작" },
|
||||
// { value: "CheatCommandPackageSend", name: "치트로 인한 패키지 메일 전송" },
|
||||
// { value: "CheatCommandQuestAccept", name: "치트로 인한 퀘스트 할당" },
|
||||
// { value: "CheatCommandQuestComplete", name: "치트로 인한 퀘스트 완료" },
|
||||
// { value: "CheatCommandRegisterCraftRecipe", name: "치트로 인한 레시피 등록" },
|
||||
// { value: "CheatCommandResetAllQuest", name: "치트로 인한 퀘스트 리셋" },
|
||||
// { value: "CheatCommandResetEscapePosition", name: "치트로 인한 탈출시간 리셋" },
|
||||
// { value: "CheatCommandResetMailCount", name: "치트로 인한 메일 횟수 제한 초기화" },
|
||||
// { value: "CheatCommandSeasonPassInit", name: "치트로 인한 시즌 패스 초기화" },
|
||||
// { value: "CheatCommandSendMail", name: "치트로 인한 메일 발송" },
|
||||
// { value: "CheatCommandShopProductInit", name: "치트로 인한 상점 품목 초기화" },
|
||||
// { value: "CheatCommandShopProductRenewal", name: "치트로 인한 상점 갱신 전송" },
|
||||
// { value: "ClaimReward", name: "클레임 리워드 이벤트 보상" },
|
||||
// { value: "ConvertCalium", name: "칼리움 컨버터 변환" },
|
||||
// { value: "ConvertExchangeCalium", name: "칼리움 교환소 변환" },
|
||||
// { value: "CraftFinish", name: "제작 완료" },
|
||||
// { value: "CraftHelp", name: "제작 도움" },
|
||||
// { value: "CraftRecipeRegister", name: "제작 레시피 추가" },
|
||||
// { value: "CraftStart", name: "제작 시작" },
|
||||
// { value: "CraftStop", name: "제작 취소" },
|
||||
// { value: "CreateCaliumContent", name: "칼리움 컨텐츠 생성" },
|
||||
// { value: "CreateParty", name: "파티 생성" },
|
||||
// { value: "CreatePartyInstance", name: "파티 던전 생성" },
|
||||
// { value: "DailyQuestCheck", name: "데일리 퀘스트 체크" },
|
||||
// { value: "DanceEntityStateEnd", name: "캐릭터 엔티티 스테이트 댄스 종료" },
|
||||
// { value: "DanceEntityStateStart", name: "캐릭터 엔티티 스테이트 댄스 시작" },
|
||||
// { value: "DeleteMyhome", name: "마이홈 삭제" },
|
||||
// { value: "DestroyParty", name: "파티 파괴" },
|
||||
// { value: "EndPartyVote", name: "파티 투표 종료" },
|
||||
// { value: "EnterMyhome", name: "마이홈 입장" },
|
||||
// { value: "EnterMyhomeEditRoom", name: "마이홈 에디트 룸 입장" },
|
||||
// { value: "FailCaliumEchoSystem", name: "칼리움 에코시스템 실패" },
|
||||
// { value: "FailCaliumStorageRollBack", name: "칼리움 컨버터 롤백 실패" },
|
||||
// { value: "FarmingCancel", name: "파밍 취소" },
|
||||
// { value: "FarmingComplete", name: "파밍 완료" },
|
||||
// { value: "FarmingIncompletedReward", name: "파밍 미완료 보상" },
|
||||
// { value: "FarmingStart", name: "파밍 시작" },
|
||||
// { value: "FillupCalium", name: "칼리움 총량 누적" },
|
||||
// { value: "FriendAdd", name: "친구추가" },
|
||||
// { value: "FriendDelete", name: "친구삭세" },
|
||||
// { value: "GainLandProfit", name: "랜드 수익 획득" },
|
||||
// { value: "InviteParty", name: "파티 초대" },
|
||||
// { value: "ItemBuy", name: "아이템 구매" },
|
||||
// { value: "ItemDestroy", name: "아이템 제거" },
|
||||
// { value: "ItemRandomBoxUse", name: "아이템 랜덤박스 사용" },
|
||||
// { value: "ItemTattooChangeAttribute", name: "타투 아이템 속성변환" },
|
||||
// { value: "ItemTattooLevelUp", name: "타투 아이템 강화" },
|
||||
// { value: "ItemUse", name: "아이템 사용" },
|
||||
// { value: "JoinInstance", name: "인스턴스 입장" },
|
||||
// { value: "JoinParty", name: "파티 가입" },
|
||||
// { value: "JoinPartyInstance", name: "파티 인스턴스 입장" },
|
||||
// { value: "KickFriendsFromMyhome", name: "마이홈에서 친구 내쫒기" },
|
||||
// { value: "LandAuctionActivity", name: "랜드 경매 활성화" },
|
||||
// { value: "LandAuctionBid", name: "랜드 경매 입찰" },
|
||||
// { value: "LandAuctionBidPriceRefund", name: "랜드 경매 입찰금 환급" },
|
||||
// { value: "LandAuctionCheck", name: "랜드 경매 체크" },
|
||||
// { value: "LeaveInstance", name: "인스턴스 퇴장" },
|
||||
// { value: "LeaveParty", name: "파티 탈퇴" },
|
||||
// { value: "LeavePartyInstance", name: "파티 인스턴스 퇴장" },
|
||||
// { value: "LoginToGame", name: "게임 로그인" },
|
||||
// { value: "LoginToGameSnapShot", name: "게임 로그인 스냅샷" },
|
||||
// { value: "LoginToUserAuth", name: "계정 로그인" },
|
||||
// { value: "MailAiChatIncentivePoint", name: "AI Chat 인센티브 우편 지급" },
|
||||
// { value: "MailDestroy", name: "우편 삭제" },
|
||||
// { value: "MailGetSystemMail", name: "시스템 우편 받기" },
|
||||
// { value: "MailInitSendCount", name: "우편 보내기 기회 초기화" },
|
||||
// { value: "MailRead", name: "우편 읽기" },
|
||||
// { value: "MailSend", name: "우편 발송" },
|
||||
// { value: "MailTaken", name: "우편 첨부 수령" },
|
||||
// { value: "ModifyLandInfo", name: "랜드 정보 수정" },
|
||||
// { value: "MoneyChange", name: "재화 변경" },
|
||||
// { value: "ProductGive", name: "결제 상품 지급" },
|
||||
// { value: "ProductOpenFailed", name: "결제 상품 오픈 실패" },
|
||||
// { value: "ProductOpenSuccess", name: "결제 상품 오픈 성공" },
|
||||
// { value: "QuestMailSend", name: "퀘스트 우편 발송" },
|
||||
// { value: "QuestMainAbort", name: "퀘스트 메인 포기" },
|
||||
// { value: "QuestMainAssignByDialogue", name: "대화를 통한 퀘스트 메인 수락" },
|
||||
// { value: "QuestMainAssignForce", name: "퀘스트 메인 강제 수락" },
|
||||
// { value: "QuestMainRefuse", name: "퀘스트 메인 수락 거절" },
|
||||
// { value: "QuestMainRepeatTimeInit", name: "반복가능 퀘스트 리프레시 타임 초기화" },
|
||||
// { value: "QuestMainRepeatTimeRefresh", name: "반복가능 퀘스트 리프레시 타임 갱신" },
|
||||
// { value: "QuestMainReward", name: "퀘스트 메인 보상" },
|
||||
// { value: "QuestMainTask", name: "퀘스트 메인 태스크관련" },
|
||||
// { value: "QuestTaskUpdate", name: "퀘스트 태스크 업데이트" },
|
||||
// { value: "RefuseFriendRequest", name: "친구요청 거절" },
|
||||
// { value: "RenameFriendFolder", name: "친구 폴더면 수정" },
|
||||
// { value: "RenameMyhome", name: "마이홈 이름 변경" },
|
||||
// { value: "RenewalShopProducts", name: "사용자 요청에 의한 상픔 리스트 갱심" },
|
||||
// { value: "RentFloor", name: "빌딩 층 임대" },
|
||||
// { value: "ReplyInviteParty", name: "파티 초대 응답" },
|
||||
// { value: "ReplySummonParty", name: "파티 맴버 소환 응답" },
|
||||
// { value: "ReservationEnterToServer", name: "서버 이동 예약" },
|
||||
// { value: "RewardProp", name: "리워드 프랍" },
|
||||
// { value: "SaveMyhome", name: "마이홈 저장" },
|
||||
// { value: "SeasonPassBuyCharged", name: "시즌 패스 유료 구입" },
|
||||
// { value: "SeasonPassStartNew", name: "새로운 시즌 패스 시작" },
|
||||
// { value: "SeasonPassTakeReward", name: "시즌 패스 보상 획득" },
|
||||
// { value: "SendFriendRequest", name: "친구 신청" },
|
||||
// { value: "ShopChangeProductTradingMeter", name: "상품 리스트 갱신" },
|
||||
// { value: "ShopGetProductTradingMeter", name: "상품 리스트 조회" },
|
||||
// { value: "ShopGetRePurchase", name: "판매한 상품 리스트 조회" },
|
||||
// { value: "ShopPurchase", name: "상품 구매" },
|
||||
// { value: "ShopRePurchase", name: "판매한 상품 재구매" },
|
||||
// { value: "ShopSell", name: "상품 판매" },
|
||||
// { value: "StageConcertStart", name: "콘서트 시작" },
|
||||
// { value: "StageEnter", name: "스테이지 입장" },
|
||||
// { value: "StageExit", name: "스테이지 퇴장" },
|
||||
// { value: "StartPartyVote", name: "파티 투표 시작" },
|
||||
// { value: "SummonParty", name: "파티 맴버 소환" },
|
||||
// { value: "SwitchingProp", name: "데일리 퀘스트 체크" },
|
||||
// { value: "TaskReservationComplete", name: "Task Reservation complete" },
|
||||
// { value: "TaxiMove", name: "택시 이동" },
|
||||
// { value: "TestBusinessLog", name: "테스트 비지니스 로그 전송" },
|
||||
// { value: "TestUserCreate", name: "테스트 계정으로 생성" },
|
||||
// { value: "TestUserInitial", name: "테스트 계정으로 초기화" },
|
||||
// { value: "TestWriteNoticeChat", name: "테스트 공지사항 추가" },
|
||||
// { value: "TestWriteSystemMail", name: "테스트 시스템 메일 추가" },
|
||||
// { value: "UgqAbort", name: "Ugq 포기" },
|
||||
// { value: "UgqApiAddSlot", name: "UgqApi 슬롯 추가" },
|
||||
// { value: "UgqApiAdminLogin", name: "UgqApi 어드민 로그인" },
|
||||
// { value: "UgqApiChangeState", name: "UgqApi Ugq 상태 변경" },
|
||||
// { value: "UgqApiCreatorPoint", name: "UgqApi CreatorPoint 증감" },
|
||||
// { value: "UgqApiLogin", name: "UgqApi 로그인" },
|
||||
// { value: "UgqApiLogout", name: "UgqApi 로그아웃" },
|
||||
// { value: "UgqApiQuestCraete", name: "UgqApi 퀘스트 생성" },
|
||||
// { value: "UgqAssign", name: "Ugq 수락" },
|
||||
// { value: "UgqDailyRewardCountRefresh", name: "Ugq 데일리 보상 리프레시" },
|
||||
// { value: "UgqDeregisterBookmark", name: "Ugq 북마크 해제" },
|
||||
// { value: "UgqDeregisterLike", name: "Ugq 좋아요 해제" },
|
||||
// { value: "UgqReAssign", name: "Ugq 재수락" },
|
||||
// { value: "UgqRegisterBookmark", name: "Ugq 북마크 등록" },
|
||||
// { value: "UgqRegisterLike", name: "Ugq 좋아요 등록" },
|
||||
// { value: "UgqTestAbort", name: "Test Ugq 포기" },
|
||||
// { value: "UgqTestAssign", name: "Test Ugq 수락" },
|
||||
// { value: "UgqTestDelete", name: "Test Ugq 삭제" },
|
||||
// { value: "UpdateBeaconAppearanceCustomize", name: "비컨 외형 커스터마이징" },
|
||||
// { value: "UpdateCharacterProfile", name: "캐릭터 프로필 업데이트" },
|
||||
// { value: "UpdateCustomDefineUi", name: "커스텀 UI 업데이트" },
|
||||
// { value: "UpdateEscape", name: "유저 탈출" },
|
||||
// { value: "UpdateGameOption", name: "게임 옵션 업데이트" },
|
||||
// { value: "UpdateLanguage", name: "유저 언어 업데이트" },
|
||||
// { value: "UpdateUgcNpcLike", name: "NPC Like 업데이트" },
|
||||
// { value: "UserBlock", name: "유저 차단" },
|
||||
// { value: "UserBlockCancel", name: "유저 차단 취소" },
|
||||
// { value: "UserCreate", name: "유저 생성" },
|
||||
// { value: "UserLoading", name: "유저 로딩" },
|
||||
// { value: "UserLogout", name: "유저 로그아웃" },
|
||||
// { value: "UserLogoutSnapShot", name: "게임 로그아웃 스냅샷" },
|
||||
// { value: "UserReport", name: "유저 신고" },
|
||||
// { value: "Warp", name: "워프" },
|
||||
// { value: "igmApiLogin", name: "igmApi 로그인" }
|
||||
// ];
|
||||
//
|
||||
// export const logDomain = [
|
||||
// { value: "BASE", name: "전체" },
|
||||
// { value: "AuthLogInOut", name: "인증 로그인/인증 로그아웃" },
|
||||
// { value: "GameLogInOut", name: "게임 로그인/게임 로그아웃" },
|
||||
// { value: "UserCreate", name: "유저 생성" },
|
||||
// { value: "User", name: "유저" },
|
||||
// { value: "UserInitial", name: "유저 초기화" },
|
||||
// { value: "CharacterCreate", name: "캐릭터 생성" },
|
||||
// { value: "Character", name: "캐릭터" },
|
||||
// { value: "Item", name: "아이템" },
|
||||
// { value: "Currency", name: "재화" },
|
||||
// { value: "Mail", name: "우편" },
|
||||
// { value: "MailStoragePeriodExpired", name: "메일 보관 기간 만료 삭제" },
|
||||
// { value: "MailProfile", name: "우편 제한 개요" },
|
||||
// { value: "Stage", name: "스테이지" },
|
||||
// { value: "ClaimReward", name: "클레임 리워드" },
|
||||
// { value: "QuestMain", name: "퀘스트 메인" },
|
||||
// { value: "QuestUgq", name: "퀘스트 Ugq" },
|
||||
// { value: "QuestMail", name: "퀘스트 메일" },
|
||||
// { value: "SocialAction", name: "소셜 액션" },
|
||||
// { value: "MyHome", name: "마이홈" },
|
||||
// { value: "Taxi", name: "택시" },
|
||||
// { value: "RewardProp", name: "리워드 프랍" },
|
||||
// { value: "Party", name: "파티" },
|
||||
// { value: "PartyMember", name: "파티 맴버" },
|
||||
// { value: "PartyVote", name: "파티 투표" },
|
||||
// { value: "PartyInstance", name: "파티 인스턴스" },
|
||||
// { value: "EscapePosition", name: "고립탈출" },
|
||||
// { value: "UserBlock", name: "유저 차단" },
|
||||
// { value: "Friend", name: "친구" },
|
||||
// { value: "UserReport", name: "유저 신고" },
|
||||
// { value: "TaskReservation", name: "처리못한 예약 테스크" },
|
||||
// { value: "SeasonPass", name: "시즌 패스" },
|
||||
// { value: "PackageLastOrderRecode", name: "패키지 마지막 획득 기록" },
|
||||
// { value: "PackageRepeat", name: "패키지 연속 지급" },
|
||||
// { value: "PackageState", name: "패키지 상태" },
|
||||
// { value: "Craft", name: "제작" },
|
||||
// { value: "CraftHelp", name: "제작 도움" },
|
||||
// { value: "Cart", name: "카트" },
|
||||
// { value: "Buff", name: "버프" },
|
||||
// { value: "UgqApi", name: "UgqApi" },
|
||||
// { value: "AIChat", name: "AI채팅" },
|
||||
// { value: "Chat", name: "채팅" },
|
||||
// { value: "Shop", name: "상점" },
|
||||
// { value: "Calium", name: "칼리움" },
|
||||
// { value: "CaliumEchoSystem", name: "칼리움 에코 시스템" },
|
||||
// { value: "CaliumStorageFail", name: "칼리움 저장 실패" },
|
||||
// { value: "Position", name: "위치" },
|
||||
// { value: "Address", name: "주소" },
|
||||
// { value: "BeaconCreate", name: "비컨 생성" },
|
||||
// { value: "Beacon", name: "비컨" },
|
||||
// { value: "CustomDefineUi", name: "CustomDefineUi" },
|
||||
// { value: "Farming", name: "파밍" },
|
||||
// { value: "FarmingReward", name: "파밍 보상" },
|
||||
// { value: "RenewalShopProducts", name: "상점 리뉴얼" },
|
||||
// { value: "CheatRenewalShopProducts", name: "상점 리뉴얼 치트" },
|
||||
// { value: "ChangeDanceEntityState", name: "댄스 엔티티 상태 변경" },
|
||||
// { value: "Land", name: "랜드" },
|
||||
// { value: "Building", name: "빌딩" },
|
||||
// { value: "SwitchingProp", name: "스위칭프랍" },
|
||||
// { value: "LandAuction", name: "랜드 경매" },
|
||||
// { value: "LandAuctionActivity", name: "랜드 경매 활성화" },
|
||||
// { value: "LandAuctionBid", name: "랜드 경매 입찰" },
|
||||
// { value: "LandAuctionBidPriceRefund", name: "랜드 경매 입찰금 환급" },
|
||||
// { value: "BrokerApi", name: "BrokerApi" },
|
||||
// { value: "Rental", name: "랜탈" },
|
||||
// { value: "BuildingProfit", name: "빌딩 수익" },
|
||||
// { value: "BattleObjectInteraction", name: "전투 오브젝트 인터렉션" },
|
||||
// { value: "BattleObjectStateUpdate", name: "전투 오브젝트 상태 업데이트" },
|
||||
// { value: "BattleReward", name: "전투 보상" },
|
||||
// { value: "BattleRespawn", name: "전투 리스폰" },
|
||||
// { value: "BattleRoomJoin", name: "전투 입장" },
|
||||
// { value: "BattleDead", name: "전투 죽음" },
|
||||
// { value: "BattleRound", name: "전투 라운드" },
|
||||
// { value: "BattleSnapshot", name: "전투 스냅샷" }
|
||||
// ];
|
||||
|
||||
export const logAction = [
|
||||
{ value: "None", name: "ALL" },
|
||||
{ value: "AIChatDeleteCharacter", name: "AIChatDeleteCharacter" },
|
||||
{ value: "AIChatDeleteUser", name: "AIChatDeleteUser" },
|
||||
{ value: "AIChatGetCharacter", name: "AIChatGetCharacter" },
|
||||
{ value: "AIChatIncentiveMarking", name: "AIChatIncentiveMarking" },
|
||||
{ value: "AIChatIncentiveSearch", name: "AIChatIncentiveSearch" },
|
||||
{ value: "AIChatJwtIssue", name: "AIChatJwtIssue" },
|
||||
{ value: "AIChatJwtVerify", name: "AIChatJwtVerify" },
|
||||
{ value: "AIChatPointCharge", name: "AIChatPointCharge" },
|
||||
{ value: "AIChatPointChargeVerify", name: "AIChatPointChargeVerify" },
|
||||
{ value: "AIChatRegisterCharacter", name: "AIChatRegisterCharacter" },
|
||||
{ value: "AIChatRegisterUser", name: "AIChatRegisterUser" },
|
||||
{ value: "AIChatUpdateCharacter", name: "AIChatUpdateCharacter" },
|
||||
{ value: "BanParty", name: "BanParty" },
|
||||
{ value: "BattleInstanceJoin", name: "BattleInstanceJoin" },
|
||||
{ value: "BattleInstanceSnapshotCreate", name: "BattleInstanceSnapshotCreate" },
|
||||
{ value: "BattleInstanceSnapshotSave", name: "BattleInstanceSnapshotSave" },
|
||||
{ value: "BattleObjectInteraction", name: "BattleObjectInteraction" },
|
||||
{ value: "BattleObjectStateUpdate", name: "BattleObjectStateUpdate" },
|
||||
{ value: "BattlePodCombatOccupyReward", name: "BattlePodCombatOccupyReward" },
|
||||
{ value: "BattleRoundStateUpdate", name: "BattleRoundStateUpdate" },
|
||||
{ value: "BattleUserDead", name: "BattleUserDead" },
|
||||
{ value: "BattleUserRespawn", name: "BattleUserRespawn" },
|
||||
{ value: "BeaconAppearanceCustomize", name: "BeaconAppearanceCustomize" },
|
||||
{ value: "BeaconCreate", name: "BeaconCreate" },
|
||||
{ value: "BeaconEdit", name: "BeaconEdit" },
|
||||
{ value: "BeaconSell", name: "BeaconSell" },
|
||||
{ value: "BrokerApiAdmin", name: "BrokerApiAdmin" },
|
||||
{ value: "BrokerApiPlanetAuth", name: "BrokerApiPlanetAuth" },
|
||||
{ value: "BrokerApiUserExchangeComplete", name: "BrokerApiUserExchangeComplete" },
|
||||
{ value: "BrokerApiUserExchangeOrder", name: "BrokerApiUserExchangeOrder" },
|
||||
{ value: "BrokerApiUserLogin", name: "BrokerApiUserLogin" },
|
||||
{ value: "BuffAdd", name: "BuffAdd" },
|
||||
{ value: "BuffDelete", name: "BuffDelete" },
|
||||
{ value: "CaliumSyncEchoSystem", name: "CaliumSyncEchoSystem" },
|
||||
{ value: "CancelFriendRequest", name: "CancelFriendRequest" },
|
||||
{ value: "CartAdd", name: "CartAdd" },
|
||||
{ value: "CartDelete", name: "CartDelete" },
|
||||
{ value: "CartPurchase", name: "CartPurchase" },
|
||||
{ value: "ChangeConvertCaliumInfo", name: "ChangeConvertCaliumInfo" },
|
||||
{ value: "CharacterAppearanceCustomize", name: "CharacterAppearanceCustomize" },
|
||||
{ value: "CharacterAppearanceUpdate", name: "CharacterAppearanceUpdate" },
|
||||
{ value: "CharacterCreate", name: "CharacterCreate" },
|
||||
{ value: "CharacterLoading", name: "CharacterLoading" },
|
||||
{ value: "ChatChannel", name: "ChatChannel" },
|
||||
{ value: "ChatNormal", name: "ChatNormal" },
|
||||
{ value: "ChatNotice", name: "ChatNotice" },
|
||||
{ value: "ChatParty", name: "ChatParty" },
|
||||
{ value: "ChatWhisper", name: "ChatWhisper" },
|
||||
{ value: "CheatAllCraftFinish", name: "CheatAllCraftFinish" },
|
||||
{ value: "CheatCommandChangeNickName", name: "CheatCommandChangeNickName" },
|
||||
{ value: "CheatCommandCharacterInit", name: "CheatCommandCharacterInit" },
|
||||
{ value: "CheatCommandClaimReset", name: "CheatCommandClaimReset" },
|
||||
{ value: "CheatCommandClaimUpdate", name: "CheatCommandClaimUpdate" },
|
||||
{ value: "CheatCommandCraftHelpInit", name: "CheatCommandCraftHelpInit" },
|
||||
{ value: "CheatCommandDeleteQuest", name: "CheatCommandDeleteQuest" },
|
||||
{ value: "CheatCommandGainLand", name: "CheatCommandGainLand" },
|
||||
{ value: "CheatCommandIncreaseExp", name: "CheatCommandIncreaseExp" },
|
||||
{ value: "CheatCommandItem", name: "CheatCommandItem" },
|
||||
{ value: "CheatCommandItemLevelUp", name: "CheatCommandItemLevelUp" },
|
||||
{ value: "CheatCommandLandAuctionBlindSet", name: "CheatCommandLandAuctionBlindSet" },
|
||||
{ value: "CheatCommandLandAuctionCanel", name: "CheatCommandLandAuctionCanel" },
|
||||
{ value: "CheatCommandLandAuctionReserve", name: "CheatCommandLandAuctionReserve" },
|
||||
{ value: "CheatCommandLandAuctionStart", name: "CheatCommandLandAuctionStart" },
|
||||
{ value: "CheatCommandPackageSend", name: "CheatCommandPackageSend" },
|
||||
{ value: "CheatCommandQuestAccept", name: "CheatCommandQuestAccept" },
|
||||
{ value: "CheatCommandQuestComplete", name: "CheatCommandQuestComplete" },
|
||||
{ value: "CheatCommandRegisterCraftRecipe", name: "CheatCommandRegisterCraftRecipe" },
|
||||
{ value: "CheatCommandResetAllQuest", name: "CheatCommandResetAllQuest" },
|
||||
{ value: "CheatCommandResetEscapePosition", name: "CheatCommandResetEscapePosition" },
|
||||
{ value: "CheatCommandResetMailCount", name: "CheatCommandResetMailCount" },
|
||||
{ value: "CheatCommandSeasonPassInit", name: "CheatCommandSeasonPassInit" },
|
||||
{ value: "CheatCommandSendMail", name: "CheatCommandSendMail" },
|
||||
{ value: "CheatCommandShopProductInit", name: "CheatCommandShopProductInit" },
|
||||
{ value: "CheatCommandShopProductRenewal", name: "CheatCommandShopProductRenewal" },
|
||||
{ value: "ClaimReward", name: "ClaimReward" },
|
||||
{ value: "ConvertCalium", name: "ConvertCalium" },
|
||||
{ value: "ConvertExchangeCalium", name: "ConvertExchangeCalium" },
|
||||
{ value: "CraftFinish", name: "CraftFinish" },
|
||||
{ value: "CraftHelp", name: "CraftHelp" },
|
||||
{ value: "CraftRecipeRegister", name: "CraftRecipeRegister" },
|
||||
{ value: "CraftStart", name: "CraftStart" },
|
||||
{ value: "CraftStop", name: "CraftStop" },
|
||||
{ value: "CreateCaliumContent", name: "CreateCaliumContent" },
|
||||
{ value: "CreateParty", name: "CreateParty" },
|
||||
{ value: "CreatePartyInstance", name: "CreatePartyInstance" },
|
||||
{ value: "DailyQuestCheck", name: "DailyQuestCheck" },
|
||||
{ value: "DanceEntityStateEnd", name: "DanceEntityStateEnd" },
|
||||
{ value: "DanceEntityStateStart", name: "DanceEntityStateStart" },
|
||||
{ value: "DeleteMyhome", name: "DeleteMyhome" },
|
||||
{ value: "DestroyParty", name: "DestroyParty" },
|
||||
{ value: "EndPartyVote", name: "EndPartyVote" },
|
||||
{ value: "EnterMyhome", name: "EnterMyhome" },
|
||||
{ value: "EnterMyhomeEditRoom", name: "EnterMyhomeEditRoom" },
|
||||
{ value: "FailCaliumEchoSystem", name: "FailCaliumEchoSystem" },
|
||||
{ value: "FailCaliumStorageRollBack", name: "FailCaliumStorageRollBack" },
|
||||
{ value: "FarmingCancel", name: "FarmingCancel" },
|
||||
{ value: "FarmingComplete", name: "FarmingComplete" },
|
||||
{ value: "FarmingIncompletedReward", name: "FarmingIncompletedReward" },
|
||||
{ value: "FarmingStart", name: "FarmingStart" },
|
||||
{ value: "FillupCalium", name: "FillupCalium" },
|
||||
{ value: "FriendAdd", name: "FriendAdd" },
|
||||
{ value: "FriendDelete", name: "FriendDelete" },
|
||||
{ value: "GainLandProfit", name: "GainLandProfit" },
|
||||
{ value: "InviteParty", name: "InviteParty" },
|
||||
{ value: "ItemBuy", name: "ItemBuy" },
|
||||
{ value: "ItemDestroy", name: "ItemDestroy" },
|
||||
{ value: "ItemRandomBoxUse", name: "ItemRandomBoxUse" },
|
||||
{ value: "ItemTattooChangeAttribute", name: "ItemTattooChangeAttribute" },
|
||||
{ value: "ItemTattooLevelUp", name: "ItemTattooLevelUp" },
|
||||
{ value: "ItemUse", name: "ItemUse" },
|
||||
{ value: "JoinInstance", name: "JoinInstance" },
|
||||
{ value: "JoinParty", name: "JoinParty" },
|
||||
{ value: "JoinPartyInstance", name: "JoinPartyInstance" },
|
||||
{ value: "KickFriendsFromMyhome", name: "KickFriendsFromMyhome" },
|
||||
{ value: "LandAuctionActivity", name: "LandAuctionActivity" },
|
||||
{ value: "LandAuctionBid", name: "LandAuctionBid" },
|
||||
{ value: "LandAuctionBidPriceRefund", name: "LandAuctionBidPriceRefund" },
|
||||
{ value: "LandAuctionCheck", name: "LandAuctionCheck" },
|
||||
{ value: "LeaveInstance", name: "LeaveInstance" },
|
||||
{ value: "LeaveParty", name: "LeaveParty" },
|
||||
{ value: "LeavePartyInstance", name: "LeavePartyInstance" },
|
||||
{ value: "LoginToGame", name: "LoginToGame" },
|
||||
{ value: "LoginToGameSnapShot", name: "LoginToGameSnapShot" },
|
||||
{ value: "LoginToUserAuth", name: "LoginToUserAuth" },
|
||||
{ value: "MailAiChatIncentivePoint", name: "MailAiChatIncentivePoint" },
|
||||
{ value: "MailDestroy", name: "MailDestroy" },
|
||||
{ value: "MailGetSystemMail", name: "MailGetSystemMail" },
|
||||
{ value: "MailInitSendCount", name: "MailInitSendCount" },
|
||||
{ value: "MailRead", name: "MailRead" },
|
||||
{ value: "MailSend", name: "MailSend" },
|
||||
{ value: "MailTaken", name: "MailTaken" },
|
||||
{ value: "ModifyLandInfo", name: "ModifyLandInfo" },
|
||||
{ value: "MoneyChange", name: "MoneyChange" },
|
||||
{ value: "ProductGive", name: "ProductGive" },
|
||||
{ value: "ProductOpenFailed", name: "ProductOpenFailed" },
|
||||
{ value: "ProductOpenSuccess", name: "ProductOpenSuccess" },
|
||||
{ value: "QuestMailSend", name: "QuestMailSend" },
|
||||
{ value: "QuestMainAbort", name: "QuestMainAbort" },
|
||||
{ value: "QuestMainAssignByDialogue", name: "QuestMainAssignByDialogue" },
|
||||
{ value: "QuestMainAssignForce", name: "QuestMainAssignForce" },
|
||||
{ value: "QuestMainRefuse", name: "QuestMainRefuse" },
|
||||
{ value: "QuestMainRepeatTimeInit", name: "QuestMainRepeatTimeInit" },
|
||||
{ value: "QuestMainRepeatTimeRefresh", name: "QuestMainRepeatTimeRefresh" },
|
||||
{ value: "QuestMainReward", name: "QuestMainReward" },
|
||||
{ value: "QuestMainTask", name: "QuestMainTask" },
|
||||
{ value: "QuestTaskUpdate", name: "QuestTaskUpdate" },
|
||||
{ value: "RefuseFriendRequest", name: "RefuseFriendRequest" },
|
||||
{ value: "RenameFriendFolder", name: "RenameFriendFolder" },
|
||||
{ value: "RenameMyhome", name: "RenameMyhome" },
|
||||
{ value: "RenewalShopProducts", name: "RenewalShopProducts" },
|
||||
{ value: "RentFloor", name: "RentFloor" },
|
||||
{ value: "ReplyInviteParty", name: "ReplyInviteParty" },
|
||||
{ value: "ReplySummonParty", name: "ReplySummonParty" },
|
||||
{ value: "ReservationEnterToServer", name: "ReservationEnterToServer" },
|
||||
{ value: "RewardProp", name: "RewardProp" },
|
||||
{ value: "SaveMyhome", name: "SaveMyhome" },
|
||||
{ value: "SeasonPassBuyCharged", name: "SeasonPassBuyCharged" },
|
||||
{ value: "SeasonPassStartNew", name: "SeasonPassStartNew" },
|
||||
{ value: "SeasonPassTakeReward", name: "SeasonPassTakeReward" },
|
||||
{ value: "SendFriendRequest", name: "SendFriendRequest" },
|
||||
{ value: "ShopChangeProductTradingMeter", name: "ShopChangeProductTradingMeter" },
|
||||
{ value: "ShopGetProductTradingMeter", name: "ShopGetProductTradingMeter" },
|
||||
{ value: "ShopGetRePurchase", name: "ShopGetRePurchase" },
|
||||
{ value: "ShopPurchase", name: "ShopPurchase" },
|
||||
{ value: "ShopRePurchase", name: "ShopRePurchase" },
|
||||
{ value: "ShopSell", name: "ShopSell" },
|
||||
{ value: "StageConcertStart", name: "StageConcertStart" },
|
||||
{ value: "StageEnter", name: "StageEnter" },
|
||||
{ value: "StageExit", name: "StageExit" },
|
||||
{ value: "StartPartyVote", name: "StartPartyVote" },
|
||||
{ value: "SummonParty", name: "SummonParty" },
|
||||
{ value: "SwitchingProp", name: "SwitchingProp" },
|
||||
{ value: "TaskReservationComplete", name: "TaskReservationComplete" },
|
||||
{ value: "TaxiMove", name: "TaxiMove" },
|
||||
{ value: "TestBusinessLog", name: "TestBusinessLog" },
|
||||
{ value: "TestUserCreate", name: "TestUserCreate" },
|
||||
{ value: "TestUserInitial", name: "TestUserInitial" },
|
||||
{ value: "TestWriteNoticeChat", name: "TestWriteNoticeChat" },
|
||||
{ value: "TestWriteSystemMail", name: "TestWriteSystemMail" },
|
||||
{ value: "UgqAbort", name: "UgqAbort" },
|
||||
{ value: "UgqApiAddSlot", name: "UgqApiAddSlot" },
|
||||
{ value: "UgqApiAdminLogin", name: "UgqApiAdminLogin" },
|
||||
{ value: "UgqApiChangeState", name: "UgqApiChangeState" },
|
||||
{ value: "UgqApiCreatorPoint", name: "UgqApiCreatorPoint" },
|
||||
{ value: "UgqApiLogin", name: "UgqApiLogin" },
|
||||
{ value: "UgqApiLogout", name: "UgqApiLogout" },
|
||||
{ value: "UgqApiQuestCraete", name: "UgqApiQuestCraete" },
|
||||
{ value: "UgqAssign", name: "UgqAssign" },
|
||||
{ value: "UgqDailyRewardCountRefresh", name: "UgqDailyRewardCountRefresh" },
|
||||
{ value: "UgqDeregisterBookmark", name: "UgqDeregisterBookmark" },
|
||||
{ value: "UgqDeregisterLike", name: "UgqDeregisterLike" },
|
||||
{ value: "UgqReAssign", name: "UgqReAssign" },
|
||||
{ value: "UgqRegisterBookmark", name: "UgqRegisterBookmark" },
|
||||
{ value: "UgqRegisterLike", name: "UgqRegisterLike" },
|
||||
{ value: "UgqTestAbort", name: "UgqTestAbort" },
|
||||
{ value: "UgqTestAssign", name: "UgqTestAssign" },
|
||||
{ value: "UgqTestDelete", name: "UgqTestDelete" },
|
||||
{ value: "UpdateBeaconAppearanceCustomize", name: "UpdateBeaconAppearanceCustomize" },
|
||||
{ value: "UpdateCharacterProfile", name: "UpdateCharacterProfile" },
|
||||
{ value: "UpdateCustomDefineUi", name: "UpdateCustomDefineUi" },
|
||||
{ value: "UpdateEscape", name: "UpdateEscape" },
|
||||
{ value: "UpdateGameOption", name: "UpdateGameOption" },
|
||||
{ value: "UpdateLanguage", name: "UpdateLanguage" },
|
||||
{ value: "UpdateUgcNpcLike", name: "UpdateUgcNpcLike" },
|
||||
{ value: "UserBlock", name: "UserBlock" },
|
||||
{ value: "UserBlockCancel", name: "UserBlockCancel" },
|
||||
{ value: "UserCreate", name: "UserCreate" },
|
||||
{ value: "UserLoading", name: "UserLoading" },
|
||||
{ value: "UserLogout", name: "UserLogout" },
|
||||
{ value: "UserLogoutSnapShot", name: "UserLogoutSnapShot" },
|
||||
{ value: "UserReport", name: "UserReport" },
|
||||
{ value: "Warp", name: "Warp" },
|
||||
{ value: "igmApiLogin", name: "igmApiLogin" }
|
||||
];
|
||||
|
||||
export const logDomain = [
|
||||
{ value: "BASE", name: "전체" },
|
||||
{ value: "AuthLogInOut", name: "AuthLogInOut" },
|
||||
{ value: "GameLogInOut", name: "GameLogInOut" },
|
||||
{ value: "UserCreate", name: "UserCreate" },
|
||||
{ value: "User", name: "User" },
|
||||
{ value: "UserInitial", name: "UserInitial" },
|
||||
{ value: "CharacterCreate", name: "CharacterCreate" },
|
||||
{ value: "Character", name: "Character" },
|
||||
{ value: "Item", name: "Item" },
|
||||
{ value: "Currency", name: "Currency" },
|
||||
{ value: "Mail", name: "Mail" },
|
||||
{ value: "MailStoragePeriodExpired", name: "MailStoragePeriodExpired" },
|
||||
{ value: "MailProfile", name: "MailProfile" },
|
||||
{ value: "Stage", name: "Stage" },
|
||||
{ value: "ClaimReward", name: "ClaimReward" },
|
||||
{ value: "QuestMain", name: "QuestMain" },
|
||||
{ value: "QuestUgq", name: "QuestUgq" },
|
||||
{ value: "QuestMail", name: "QuestMail" },
|
||||
{ value: "SocialAction", name: "SocialAction" },
|
||||
{ value: "MyHome", name: "MyHome" },
|
||||
{ value: "Taxi", name: "Taxi" },
|
||||
{ value: "RewardProp", name: "RewardProp" },
|
||||
{ value: "Party", name: "Party" },
|
||||
{ value: "PartyMember", name: "PartyMember" },
|
||||
{ value: "PartyVote", name: "PartyVote" },
|
||||
{ value: "PartyInstance", name: "PartyInstance" },
|
||||
{ value: "EscapePosition", name: "EscapePosition" },
|
||||
{ value: "UserBlock", name: "UserBlock" },
|
||||
{ value: "Friend", name: "Friend" },
|
||||
{ value: "UserReport", name: "UserReport" },
|
||||
{ value: "TaskReservation", name: "TaskReservation" },
|
||||
{ value: "SeasonPass", name: "SeasonPass" },
|
||||
{ value: "PackageLastOrderRecode", name: "PackageLastOrderRecode" },
|
||||
{ value: "PackageRepeat", name: "PackageRepeat" },
|
||||
{ value: "PackageState", name: "PackageState" },
|
||||
{ value: "Craft", name: "Craft" },
|
||||
{ value: "CraftHelp", name: "CraftHelp" },
|
||||
{ value: "Cart", name: "Cart" },
|
||||
{ value: "Buff", name: "Buff" },
|
||||
{ value: "UgqApi", name: "UgqApi" },
|
||||
{ value: "AIChat", name: "AIChat" },
|
||||
{ value: "Chat", name: "Chat" },
|
||||
{ value: "Shop", name: "Shop" },
|
||||
{ value: "Calium", name: "Calium" },
|
||||
{ value: "CaliumEchoSystem", name: "CaliumEchoSystem" },
|
||||
{ value: "CaliumStorageFail", name: "CaliumStorageFail" },
|
||||
{ value: "Position", name: "Position" },
|
||||
{ value: "Address", name: "Address" },
|
||||
{ value: "BeaconCreate", name: "BeaconCreate" },
|
||||
{ value: "Beacon", name: "Beacon" },
|
||||
{ value: "CustomDefineUi", name: "CustomDefineUi" },
|
||||
{ value: "Farming", name: "Farming" },
|
||||
{ value: "FarmingReward", name: "FarmingReward" },
|
||||
{ value: "RenewalShopProducts", name: "RenewalShopProducts" },
|
||||
{ value: "CheatRenewalShopProducts", name: "CheatRenewalShopProducts" },
|
||||
{ value: "ChangeDanceEntityState", name: "ChangeDanceEntityState" },
|
||||
{ value: "Land", name: "Land" },
|
||||
{ value: "Building", name: "Building" },
|
||||
{ value: "SwitchingProp", name: "SwitchingProp" },
|
||||
{ value: "LandAuction", name: "LandAuction" },
|
||||
{ value: "LandAuctionActivity", name: "LandAuctionActivity" },
|
||||
{ value: "LandAuctionBid", name: "LandAuctionBid" },
|
||||
{ value: "LandAuctionBidPriceRefund", name: "LandAuctionBidPriceRefund" },
|
||||
{ value: "BrokerApi", name: "BrokerApi" },
|
||||
{ value: "Rental", name: "Rental" },
|
||||
{ value: "BuildingProfit", name: "BuildingProfit" },
|
||||
{ value: "BattleObjectInteraction", name: "BattleObjectInteraction" },
|
||||
{ value: "BattleObjectStateUpdate", name: "BattleObjectStateUpdate" },
|
||||
{ value: "BattleReward", name: "BattleReward" },
|
||||
{ value: "BattleRespawn", name: "BattleRespawn" },
|
||||
{ value: "BattleRoomJoin", name: "BattleRoomJoin" },
|
||||
{ value: "BattleDead", name: "BattleDead" },
|
||||
{ value: "BattleRound", name: "BattleRound" },
|
||||
{ value: "BattleSnapshot", name: "BattleSnapshot" }
|
||||
];
|
||||
|
||||
@@ -46,7 +46,8 @@ export const authType = {
|
||||
landDelete: 45,
|
||||
battleEventRead: 46,
|
||||
battleEventUpdate: 47,
|
||||
battleEventDelete: 48
|
||||
battleEventDelete: 48,
|
||||
businessLogRead: 49,
|
||||
};
|
||||
|
||||
export const TabList = [
|
||||
|
||||
@@ -15,6 +15,7 @@ import EventListSearchBar from './searchBar/EventListSearchBar';
|
||||
import LandAuctionSearchBar from './searchBar/LandAuctionSearchBar'
|
||||
import MailListSearchBar from './searchBar/MailListSearchBar';
|
||||
import LandInfoSearchBar from './searchBar/LandInfoSearchBar';
|
||||
import BusinessLogSearchBar from './searchBar/BusinessLogSearchBar';
|
||||
//etc
|
||||
import ReportListSummary from './ReportListSummary';
|
||||
import WhiteListSearchBar from './WhiteListRegistBar';
|
||||
@@ -25,6 +26,7 @@ export {
|
||||
MailDetailModal,
|
||||
MailListSearchBar,
|
||||
LandInfoSearchBar,
|
||||
BusinessLogSearchBar,
|
||||
ReportListAnswerModal,
|
||||
ReportListDetailModal,
|
||||
ReportListSearchBar,
|
||||
|
||||
@@ -193,6 +193,10 @@ const OwnerChangeModal = ({ modalType, detailView, handleDetailView, content, se
|
||||
handleModalView('registComplete');
|
||||
}else if(data.result === "GUID_CHECK"){
|
||||
setAlertMsg(t('WARNING_GUID_CHECK'));
|
||||
}else if(data.result === "ERROR_LAND_OWNER_DUPLICATION"){
|
||||
setAlertMsg(t('LAND_OWNER_DUPLICATION_WARNING'));
|
||||
}else if(data.result === "ERROR_LAND_OWNER_CHANGES_DUPLICATION"){
|
||||
setAlertMsg(t('LAND_OWNED_CHANGES_REGIST_DUPLICATION_WARNING'));
|
||||
}else{
|
||||
setAlertMsg(t('REGIST_FAIL'));
|
||||
}
|
||||
|
||||
211
src/components/ServiceManage/searchBar/BusinessLogSearchBar.js
Normal file
211
src/components/ServiceManage/searchBar/BusinessLogSearchBar.js
Normal file
@@ -0,0 +1,211 @@
|
||||
import { TextInput, BtnWrapper, InputLabel, SelectInput, InputGroup } from '../../../styles/Components';
|
||||
import Button from '../../common/button/Button';
|
||||
import { SearchBarLayout, SearchPeriod } from '../../common/SearchBar';
|
||||
import { useCallback, useEffect, useState } from 'react';
|
||||
import { LandAuctionView, LandInfoData } from '../../../apis';
|
||||
import { landAuctionStatus, landSearchType, landSize, opLandCategoryType } from '../../../assets/data';
|
||||
import { logAction, logDomain, opLandInfoStatusType, userSearchType2 } from '../../../assets/data/options';
|
||||
import { BusinessLogList } from '../../../apis/Log';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
export const useBusinessLogSearch = (token, initialPageSize, setAlertMsg) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const [searchParams, setSearchParams] = useState({
|
||||
search_type: 'GUID',
|
||||
search_data: '',
|
||||
log_action: 'None',
|
||||
log_domain: 'BASE',
|
||||
tran_id: '',
|
||||
start_dt: (() => {
|
||||
const date = new Date();
|
||||
date.setDate(date.getDate() - 1);
|
||||
return date;
|
||||
})(),
|
||||
end_dt: (() => {
|
||||
const date = new Date();
|
||||
date.setDate(date.getDate() - 1);
|
||||
return date;
|
||||
})(),
|
||||
order_by: 'ASC',
|
||||
page_size: initialPageSize,
|
||||
page_no: 1
|
||||
});
|
||||
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [data, setData] = useState(null);
|
||||
|
||||
useEffect(() => {
|
||||
// fetchData(searchParams); // 컴포넌트 마운트 시 초기 데이터 로드
|
||||
const initialLoad = async () => {
|
||||
await fetchData(searchParams);
|
||||
};
|
||||
|
||||
initialLoad();
|
||||
}, [token]);
|
||||
|
||||
const fetchData = useCallback(async (params) => {
|
||||
if (!token) return;
|
||||
|
||||
try {
|
||||
setLoading(true);
|
||||
const result = await BusinessLogList(
|
||||
token,
|
||||
params
|
||||
);
|
||||
if(result.result === "ERROR_LOG_MEMORY_LIMIT"){
|
||||
setAlertMsg(t('LOG_MEMORY_LIMIT_WARNING'))
|
||||
}else if(result.result === "ERROR_MONGODB_QUERY"){
|
||||
setAlertMsg(t('LOG_MONGGDB_QUERY_WARNING'))
|
||||
}
|
||||
setData(result.data);
|
||||
return result.data;
|
||||
} catch (error) {
|
||||
console.error('Error fetching auction data:', error);
|
||||
throw error;
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, [token]);
|
||||
|
||||
const updateSearchParams = useCallback((newParams) => {
|
||||
setSearchParams(prev => ({
|
||||
...prev,
|
||||
...newParams
|
||||
}));
|
||||
}, []);
|
||||
|
||||
const handleSearch = useCallback(async (newParams = {}) => {
|
||||
const updatedParams = {
|
||||
...searchParams,
|
||||
...newParams,
|
||||
page_no: newParams.page_no || 1 // Reset to first page on new search
|
||||
};
|
||||
updateSearchParams(updatedParams);
|
||||
return await fetchData(updatedParams);
|
||||
}, [searchParams, fetchData]);
|
||||
|
||||
const handleReset = useCallback(async () => {
|
||||
const now = new Date();
|
||||
now.setDate(now.getDate() - 1);
|
||||
const resetParams = {
|
||||
search_type: 'GUID',
|
||||
search_data: '',
|
||||
log_action: 'None',
|
||||
log_domain: 'BASE',
|
||||
tran_id: '',
|
||||
start_dt: now,
|
||||
end_dt: now,
|
||||
order_by: 'ASC',
|
||||
page_size: initialPageSize,
|
||||
page_no: 1
|
||||
};
|
||||
setSearchParams(resetParams);
|
||||
return await fetchData(resetParams);
|
||||
}, [initialPageSize, fetchData]);
|
||||
|
||||
const handlePageChange = useCallback(async (newPage) => {
|
||||
return await handleSearch({ page_no: newPage });
|
||||
}, [handleSearch]);
|
||||
|
||||
const handlePageSizeChange = useCallback(async (newSize) => {
|
||||
return await handleSearch({ page_size: newSize, page_no: 1 });
|
||||
}, [handleSearch]);
|
||||
|
||||
const handleOrderByChange = useCallback(async (newOrder) => {
|
||||
return await handleSearch({ order_by: newOrder });
|
||||
}, [handleSearch]);
|
||||
|
||||
return {
|
||||
searchParams,
|
||||
loading,
|
||||
data,
|
||||
handleSearch,
|
||||
handleReset,
|
||||
handlePageChange,
|
||||
handlePageSizeChange,
|
||||
handleOrderByChange,
|
||||
updateSearchParams
|
||||
};
|
||||
};
|
||||
|
||||
const BusinessLogSearchBar = ({ searchParams, onSearch, onReset }) => {
|
||||
const handleSubmit = event => {
|
||||
event.preventDefault();
|
||||
|
||||
onSearch(searchParams);
|
||||
};
|
||||
|
||||
const searchList = [
|
||||
<>
|
||||
<InputGroup>
|
||||
<SelectInput value={searchParams.search_type} onChange={e => onSearch({search_type: e.target.value })}>
|
||||
{userSearchType2.map((data, index) => (
|
||||
<option key={index} value={data.value}>
|
||||
{data.name}
|
||||
</option>
|
||||
))}
|
||||
</SelectInput>
|
||||
<TextInput
|
||||
type="text"
|
||||
placeholder={searchParams.search_type === 'GUID' ? 'GUID ID 입력' : searchParams.search_type === 'NICKNAME' ? '아바타명 입력' :'Account ID 입력'}
|
||||
value={searchParams.search_data}
|
||||
width="260px"
|
||||
onChange={e => onSearch({ search_data: e.target.value })}
|
||||
/>
|
||||
</InputGroup>
|
||||
</>,
|
||||
<>
|
||||
<InputLabel>로그액션</InputLabel>
|
||||
<SelectInput value={searchParams.log_action} onChange={e => onSearch({ log_action: e.target.value }, false)} >
|
||||
{logAction.map((data, index) => (
|
||||
<option key={index} value={data.value}>
|
||||
{data.name}
|
||||
</option>
|
||||
))}
|
||||
</SelectInput>
|
||||
</>,
|
||||
<>
|
||||
<InputLabel>로그도메인</InputLabel>
|
||||
<SelectInput value={searchParams.log_domain} onChange={e => onSearch({ log_domain: e.target.value }, false)} >
|
||||
{logDomain.map((data, index) => (
|
||||
<option key={index} value={data.value}>
|
||||
{data.name}
|
||||
</option>
|
||||
))}
|
||||
</SelectInput>
|
||||
</>,
|
||||
];
|
||||
|
||||
const optionList = [
|
||||
<>
|
||||
<InputLabel>트랜잭션 ID</InputLabel>
|
||||
<TextInput
|
||||
type="text"
|
||||
placeholder='트랜잭션 ID 입력'
|
||||
value={searchParams.tran_id}
|
||||
width="300px"
|
||||
onChange={e => onSearch({ tran_id: e.target.value })}
|
||||
/>
|
||||
</>,
|
||||
<>
|
||||
<InputLabel>일자</InputLabel>
|
||||
<SearchPeriod
|
||||
startDate={searchParams.start_dt}
|
||||
handleStartDate={date => onSearch({ start_dt: date }, false)}
|
||||
endDate={searchParams.end_dt}
|
||||
handleEndDate={date => onSearch({ end_dt: date }, false)}
|
||||
/>
|
||||
</>,
|
||||
<></>,<></>,<></>,
|
||||
<>
|
||||
<BtnWrapper $gap="8px">
|
||||
<Button theme="reset" handleClick={onReset} type="button" />
|
||||
<Button theme="search" text="검색" handleClick={handleSubmit} type="submit" />
|
||||
</BtnWrapper>
|
||||
</>,
|
||||
];
|
||||
return <SearchBarLayout firstColumnData={searchList} secondColumnData={optionList} direction={'column'} />;
|
||||
};
|
||||
|
||||
export default BusinessLogSearchBar;
|
||||
@@ -7,7 +7,7 @@ import {
|
||||
import { ViewTitleCountType } from '../../../assets/data';
|
||||
import { TitleItem, TitleItemLabel, TitleItemValue } from '../../../styles/ModuleComponents';
|
||||
|
||||
const ViewTableInfo = ({children, total, total_all, handleOrderBy, handlePageSize, countType = ViewTitleCountType.total}) => {
|
||||
const ViewTableInfo = ({children, total, total_all, orderType, handleOrderBy, pageType, handlePageSize, countType = ViewTitleCountType.total}) => {
|
||||
return (
|
||||
<TableInfo>
|
||||
{total !== undefined && total_all !== undefined &&
|
||||
@@ -27,18 +27,44 @@ const ViewTableInfo = ({children, total, total_all, handleOrderBy, handlePageSiz
|
||||
}
|
||||
</ListCount>}
|
||||
<ListOption>
|
||||
<SelectInput className="input-select" onChange={e => handleOrderBy(e.target.value)}>
|
||||
<option value="DESC">내림차순</option>
|
||||
<option value="ASC">오름차순</option>
|
||||
</SelectInput>
|
||||
<SelectInput name="" id="" className="input-select" onChange={e => handlePageSize(e.target.value)}>
|
||||
<option value="50">50개</option>
|
||||
<option value="100">100개</option>
|
||||
</SelectInput>
|
||||
<OrderBySelect orderType={orderType} handleOrderBy={handleOrderBy} />
|
||||
<PageSelect pageType={pageType} handlePageSize={handlePageSize} />
|
||||
{children}
|
||||
</ListOption>
|
||||
</TableInfo>
|
||||
);
|
||||
};
|
||||
|
||||
const OrderBySelect = ({orderType, handleOrderBy}) => {
|
||||
return(
|
||||
orderType === "asc" ?
|
||||
<SelectInput className="input-select" onChange={e => handleOrderBy(e.target.value)}>
|
||||
<option value="ASC">오름차순</option>
|
||||
<option value="DESC">내림차순</option>
|
||||
</SelectInput>
|
||||
:
|
||||
<SelectInput className="input-select" onChange={e => handleOrderBy(e.target.value)}>
|
||||
<option value="DESC">내림차순</option>
|
||||
<option value="ASC">오름차순</option>
|
||||
</SelectInput>
|
||||
);
|
||||
}
|
||||
|
||||
const PageSelect = ({pageType, handlePageSize}) => {
|
||||
return(
|
||||
pageType === "B" ?
|
||||
<SelectInput name="" id="" className="input-select" onChange={e => handlePageSize(e.target.value)}>
|
||||
<option value="500">500개</option>
|
||||
<option value="1000">1000개</option>
|
||||
<option value="5000">5000개</option>
|
||||
<option value="10000">10000개</option>
|
||||
</SelectInput>
|
||||
:
|
||||
<SelectInput name="" id="" className="input-select" onChange={e => handlePageSize(e.target.value)}>
|
||||
<option value="50">50개</option>
|
||||
<option value="100">100개</option>
|
||||
</SelectInput>
|
||||
);
|
||||
}
|
||||
|
||||
export default ViewTableInfo;
|
||||
@@ -1,25 +1,99 @@
|
||||
import * as XLSX from 'xlsx-js-style';
|
||||
import { ExcelDownButton } from '../../../styles/ModuleComponents';
|
||||
|
||||
const ExcelDownloadButton = ({ tableRef, fileName = 'download.xlsx', sheetName = 'Sheet1' }) => {
|
||||
const ExcelDownloadButton = ({ tableRef, data, fileName = 'download.xlsx', sheetName = 'Sheet1' }) => {
|
||||
const isNumeric = (value) => {
|
||||
// 숫자 또는 숫자 문자열인지 확인
|
||||
return !isNaN(value) && !isNaN(parseFloat(value));
|
||||
};
|
||||
|
||||
const downloadExcel = () => {
|
||||
// 테두리 스타일 정의
|
||||
const borderStyle = {
|
||||
style: "thin",
|
||||
color: { rgb: "000000" }
|
||||
};
|
||||
|
||||
// 기본 셀 스타일
|
||||
const baseCellStyle = {
|
||||
font: {
|
||||
name: "맑은 고딕",
|
||||
sz: 11
|
||||
},
|
||||
border: {
|
||||
top: borderStyle,
|
||||
bottom: borderStyle,
|
||||
left: borderStyle,
|
||||
right: borderStyle
|
||||
}
|
||||
};
|
||||
|
||||
// 헤더 스타일
|
||||
const headerStyle = {
|
||||
...baseCellStyle,
|
||||
font: {
|
||||
...baseCellStyle.font,
|
||||
bold: true
|
||||
},
|
||||
alignment: {
|
||||
horizontal: 'center',
|
||||
vertical: 'center'
|
||||
},
|
||||
fill: {
|
||||
fgColor: { rgb: "d9e1f2" },
|
||||
patternType: "solid"
|
||||
}
|
||||
};
|
||||
|
||||
// 기본 데이터 셀 스타일
|
||||
const dataStyle = {
|
||||
...baseCellStyle,
|
||||
alignment: {
|
||||
horizontal: 'left',
|
||||
vertical: 'center',
|
||||
wrapText: true
|
||||
}
|
||||
};
|
||||
|
||||
const flattenObject = (obj, prefix = '') => {
|
||||
return Object.keys(obj).reduce((acc, key) => {
|
||||
const prefixedKey = prefix ? `${prefix}.${key}` : key;
|
||||
|
||||
if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) {
|
||||
Object.assign(acc, flattenObject(obj[key], prefixedKey));
|
||||
} else if (Array.isArray(obj[key])) {
|
||||
// 배열은 JSON 문자열로 변환
|
||||
acc[prefixedKey] = JSON.stringify(obj[key]);
|
||||
} else {
|
||||
acc[prefixedKey] = obj[key];
|
||||
}
|
||||
|
||||
return acc;
|
||||
}, {});
|
||||
};
|
||||
|
||||
const downloadTableExcel = () => {
|
||||
try {
|
||||
if (!tableRef.current) return;
|
||||
if (!tableRef || !tableRef.current) {
|
||||
alert('테이블 참조가 없습니다.');
|
||||
return;
|
||||
}
|
||||
|
||||
const tableElement = tableRef.current;
|
||||
const headerRows = tableElement.getElementsByTagName('thead')[0].getElementsByTagName('tr');
|
||||
const bodyRows = tableElement.getElementsByTagName('tbody')[0].getElementsByTagName('tr');
|
||||
|
||||
// 일반 행만 포함 (상세 행 제외)
|
||||
const normalBodyRows = Array.from(bodyRows).filter(row => {
|
||||
// 상세 행은 colspan 속성이 있는 td를 포함
|
||||
const hasTdWithColspan = Array.from(row.cells).some(cell => cell.hasAttribute('colspan'));
|
||||
return !hasTdWithColspan;
|
||||
});
|
||||
|
||||
// 헤더 데이터 추출
|
||||
const headers = Array.from(headerRows[0].cells).map(cell => cell.textContent);
|
||||
|
||||
// 바디 데이터 추출 및 숫자 타입 처리
|
||||
const bodyData = Array.from(bodyRows).map(row =>
|
||||
const bodyData = normalBodyRows.map(row =>
|
||||
Array.from(row.cells).map(cell => {
|
||||
const value = cell.textContent;
|
||||
return isNumeric(value) ? parseFloat(value) : value;
|
||||
@@ -29,41 +103,6 @@ const ExcelDownloadButton = ({ tableRef, fileName = 'download.xlsx', sheetName =
|
||||
// 워크북 생성
|
||||
const wb = XLSX.utils.book_new();
|
||||
|
||||
// 테두리 스타일 정의
|
||||
const borderStyle = {
|
||||
style: "thin",
|
||||
color: { rgb: "000000" }
|
||||
};
|
||||
|
||||
// 스타일 정의
|
||||
const centerStyle = {
|
||||
font: {
|
||||
name: "맑은 고딕",
|
||||
sz: 11
|
||||
},
|
||||
alignment: {
|
||||
horizontal: 'right',
|
||||
vertical: 'right'
|
||||
},
|
||||
border: {
|
||||
top: borderStyle,
|
||||
bottom: borderStyle,
|
||||
left: borderStyle,
|
||||
right: borderStyle
|
||||
}
|
||||
};
|
||||
|
||||
const headerStyle = {
|
||||
alignment: {
|
||||
horizontal: 'center',
|
||||
vertical: 'center'
|
||||
},
|
||||
fill: {
|
||||
fgColor: { rgb: "d9e1f2" },
|
||||
patternType: "solid"
|
||||
}
|
||||
};
|
||||
|
||||
// 데이터에 스타일 적용
|
||||
const wsData = [
|
||||
// 헤더 행
|
||||
@@ -75,7 +114,7 @@ const ExcelDownloadButton = ({ tableRef, fileName = 'download.xlsx', sheetName =
|
||||
...bodyData.map(row =>
|
||||
row.map(cell => ({
|
||||
v: cell,
|
||||
s: centerStyle
|
||||
s: dataStyle
|
||||
}))
|
||||
)
|
||||
];
|
||||
@@ -103,8 +142,120 @@ const ExcelDownloadButton = ({ tableRef, fileName = 'download.xlsx', sheetName =
|
||||
}
|
||||
};
|
||||
|
||||
const downloadDataExcel = () => {
|
||||
try {
|
||||
if (!data || !data || data.length === 0) {
|
||||
alert('다운로드할 데이터가 없습니다.');
|
||||
return;
|
||||
}
|
||||
|
||||
// 모든 로그 항목을 플랫한 구조로 변환
|
||||
const flattenedData = data.map(item => {
|
||||
// 기본 필드
|
||||
const baseData = {
|
||||
'logTime': item.logTime,
|
||||
'GUID': item.userGuid === 'None' ? '' : item.userGuid,
|
||||
'Nickname': item.userNickname === 'None' ? '' : item.userNickname,
|
||||
'Account ID': item.accountId === 'None' ? '' : item.accountId,
|
||||
'Action': item.action,
|
||||
'Domain' : item.domain === 'None' ? '' : item.domain,
|
||||
'Tran ID': item.tranId
|
||||
};
|
||||
|
||||
// Actor 데이터 플랫하게 추가
|
||||
const actorData = item.header && item.header.Actor ?
|
||||
flattenObject(item.header.Actor, 'Actor') : {};
|
||||
|
||||
// Infos 데이터 플랫하게 추가
|
||||
let infosData = {};
|
||||
if (item.body && item.body.Infos && Array.isArray(item.body.Infos)) {
|
||||
item.body.Infos.forEach((info, index) => {
|
||||
infosData = {
|
||||
...infosData,
|
||||
...flattenObject(info, `Info`)
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
...baseData,
|
||||
...actorData,
|
||||
...infosData
|
||||
};
|
||||
});
|
||||
|
||||
// 모든 항목의 모든 키 수집하여 헤더 생성
|
||||
const allKeys = new Set();
|
||||
flattenedData.forEach(item => {
|
||||
Object.keys(item).forEach(key => allKeys.add(key));
|
||||
});
|
||||
const headers = Array.from(allKeys);
|
||||
|
||||
// 워크북 생성
|
||||
const wb = XLSX.utils.book_new();
|
||||
|
||||
// 데이터 행들 생성
|
||||
const dataRows = flattenedData.map(item => {
|
||||
return headers.map(header => {
|
||||
const value = item[header] !== undefined ? item[header] : '';
|
||||
return {
|
||||
v: value,
|
||||
s: dataStyle
|
||||
};
|
||||
});
|
||||
});
|
||||
|
||||
// 워크시트 데이터 구성
|
||||
const wsData = [
|
||||
// 헤더 행
|
||||
headers.map(h => ({
|
||||
v: h,
|
||||
s: headerStyle
|
||||
})),
|
||||
// 데이터 행들
|
||||
...dataRows
|
||||
];
|
||||
|
||||
// 워크시트 생성
|
||||
const ws = XLSX.utils.aoa_to_sheet(wsData);
|
||||
|
||||
// 열 너비 설정 (최소 10, 최대 50)
|
||||
ws['!cols'] = headers.map((header) => {
|
||||
// 헤더 길이와 데이터 길이 중 최대값으로 열 너비 결정
|
||||
const maxLength = Math.max(
|
||||
header.length * 1.5,
|
||||
...flattenedData.map(item => {
|
||||
const value = item[header];
|
||||
return value !== undefined ? String(value).length * 1.2 : 0;
|
||||
})
|
||||
);
|
||||
return { wch: Math.max(10, Math.min(50, maxLength)) };
|
||||
});
|
||||
|
||||
// 워크시트를 워크북에 추가
|
||||
XLSX.utils.book_append_sheet(wb, ws, sheetName);
|
||||
|
||||
// 엑셀 파일 다운로드
|
||||
XLSX.writeFile(wb, fileName);
|
||||
} catch (error) {
|
||||
console.error('Excel download failed:', error);
|
||||
alert('엑셀 다운로드 중 오류가 발생했습니다.');
|
||||
}
|
||||
};
|
||||
|
||||
const handleDownload = () => {
|
||||
if (tableRef) {
|
||||
downloadTableExcel();
|
||||
} else if (data) {
|
||||
downloadDataExcel();
|
||||
} else {
|
||||
alert('유효한 데이터 소스가 없습니다.');
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
return (
|
||||
<ExcelDownButton onClick={downloadExcel}>
|
||||
<ExcelDownButton onClick={handleDownload}>
|
||||
엑셀 다운로드
|
||||
</ExcelDownButton>
|
||||
);
|
||||
|
||||
113
src/components/common/button/ExcelDownButton_bak.js
Normal file
113
src/components/common/button/ExcelDownButton_bak.js
Normal file
@@ -0,0 +1,113 @@
|
||||
import * as XLSX from 'xlsx-js-style';
|
||||
import { ExcelDownButton } from '../../../styles/ModuleComponents';
|
||||
|
||||
const ExcelDownloadButton = ({ tableRef, fileName = 'download.xlsx', sheetName = 'Sheet1' }) => {
|
||||
const isNumeric = (value) => {
|
||||
// 숫자 또는 숫자 문자열인지 확인
|
||||
return !isNaN(value) && !isNaN(parseFloat(value));
|
||||
};
|
||||
|
||||
const downloadExcel = () => {
|
||||
try {
|
||||
if (!tableRef.current) return;
|
||||
|
||||
const tableElement = tableRef.current;
|
||||
const headerRows = tableElement.getElementsByTagName('thead')[0].getElementsByTagName('tr');
|
||||
const bodyRows = tableElement.getElementsByTagName('tbody')[0].getElementsByTagName('tr');
|
||||
|
||||
// 헤더 데이터 추출
|
||||
const headers = Array.from(headerRows[0].cells).map(cell => cell.textContent);
|
||||
|
||||
// 바디 데이터 추출 및 숫자 타입 처리
|
||||
const bodyData = Array.from(bodyRows).map(row =>
|
||||
Array.from(row.cells).map(cell => {
|
||||
const value = cell.textContent;
|
||||
return isNumeric(value) ? parseFloat(value) : value;
|
||||
})
|
||||
);
|
||||
|
||||
// 워크북 생성
|
||||
const wb = XLSX.utils.book_new();
|
||||
|
||||
// 테두리 스타일 정의
|
||||
const borderStyle = {
|
||||
style: "thin",
|
||||
color: { rgb: "000000" }
|
||||
};
|
||||
|
||||
// 스타일 정의
|
||||
const centerStyle = {
|
||||
font: {
|
||||
name: "맑은 고딕",
|
||||
sz: 11
|
||||
},
|
||||
alignment: {
|
||||
horizontal: 'right',
|
||||
vertical: 'right'
|
||||
},
|
||||
border: {
|
||||
top: borderStyle,
|
||||
bottom: borderStyle,
|
||||
left: borderStyle,
|
||||
right: borderStyle
|
||||
}
|
||||
};
|
||||
|
||||
const headerStyle = {
|
||||
alignment: {
|
||||
horizontal: 'center',
|
||||
vertical: 'center'
|
||||
},
|
||||
fill: {
|
||||
fgColor: { rgb: "d9e1f2" },
|
||||
patternType: "solid"
|
||||
}
|
||||
};
|
||||
|
||||
// 데이터에 스타일 적용
|
||||
const wsData = [
|
||||
// 헤더 행
|
||||
headers.map(h => ({
|
||||
v: h,
|
||||
s: headerStyle
|
||||
})),
|
||||
// 데이터 행들
|
||||
...bodyData.map(row =>
|
||||
row.map(cell => ({
|
||||
v: cell,
|
||||
s: centerStyle
|
||||
}))
|
||||
)
|
||||
];
|
||||
|
||||
// 워크시트 생성
|
||||
const ws = XLSX.utils.aoa_to_sheet(wsData);
|
||||
|
||||
// 열 너비 설정 (최소 8, 최대 50)
|
||||
ws['!cols'] = headers.map((_, index) => {
|
||||
const maxLength = Math.max(
|
||||
headers[index].length * 2,
|
||||
...bodyData.map(row => String(row[index] || '').length * 1.2)
|
||||
);
|
||||
return { wch: Math.max(8, Math.min(50, maxLength)) };
|
||||
});
|
||||
|
||||
// 워크시트를 워크북에 추가
|
||||
XLSX.utils.book_append_sheet(wb, ws, sheetName);
|
||||
|
||||
// 엑셀 파일 다운로드
|
||||
XLSX.writeFile(wb, fileName);
|
||||
} catch (error) {
|
||||
console.error('Excel download failed:', error);
|
||||
alert('엑셀 다운로드 중 오류가 발생했습니다.');
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<ExcelDownButton onClick={downloadExcel}>
|
||||
엑셀 다운로드
|
||||
</ExcelDownButton>
|
||||
);
|
||||
};
|
||||
|
||||
export default ExcelDownloadButton;
|
||||
@@ -37,12 +37,17 @@ const resources = {
|
||||
WARNING_NICKNAME_CHECK: '닉네임을 확인해주세요.',
|
||||
WARNING_EMAIL_CHECK: '이메일을 확인해주세요.',
|
||||
WARNING_TYPE_CHECK: '타입을 확인해주세요.',
|
||||
//db
|
||||
LOG_MEMORY_LIMIT_WARNING: '데이터가 너무 많아 조회할 수 없습니다.\n조회조건 조정 후 다시 조회해주세요.',
|
||||
LOG_MONGGDB_QUERY_WARNING: '조회 중 오류가 발생하였습니다. 잠시 후 다시 한번 진행해 주세요.\n오류가 지속될 경우, 담당자에게 문의해주세요.',
|
||||
//랜드
|
||||
LAND_OWNED_CHANGES_WARNING: "해당 랜드는 소유권 변경이 불가능합니다.",
|
||||
LAND_OWNED_CHANGES_REGIST_CONFIRM: "랜드 소유권 변경을 등록하시겠습니까?",
|
||||
LAND_OWNED_CHANGES_SELECT_DELETE: "랜드 소유권 변경 예약을 취소하시겠습니까?",
|
||||
LAND_OWNED_CHANGES_DELETE_TIME_WARNING: "예약시간이 지나 취소할 수 없습니다.",
|
||||
LAND_OWNED_CHANGES_DELETE_STATUS_WARNING: "소유권 변경 예약을 취소할 수 없는 상태입니다.",
|
||||
LAND_OWNED_CHANGES_REGIST_DUPLICATION_WARNING: "소유권 변경이 진행중인 랜드입니다.",
|
||||
LAND_OWNER_DUPLICATION_WARNING: "소유자가 존재하는 랜드입니다.",
|
||||
LAND_AUCTION_SELECT_DELETE: "선택된 경매를 삭제하시겠습니까?",
|
||||
LAND_AUCTION_WARNING_DELETE: "대기 상태의 경매만 삭제할 수 있습니다.",
|
||||
LAND_AUCTION_MODAL_STATUS_WARNING: "경매 시작일시 이후에는 변경이 불가합니다.",
|
||||
@@ -104,6 +109,7 @@ const resources = {
|
||||
FILE_INDEX_USER_CONTENT: 'Caliverse_User_Index.xlsx',
|
||||
FILE_CALIUM_REQUEST: 'Caliverse_Calium_Request.xlsx',
|
||||
FILE_LAND_AUCTION: 'Caliverse_Land_Auction.xlsx',
|
||||
FILE_BUSINESS_LOG: 'Caliverse_Log.xlsx',
|
||||
FILE_BATTLE_EVENT: 'Caliverse_Battle_Event.xlsx'
|
||||
}
|
||||
},
|
||||
|
||||
@@ -167,7 +167,6 @@ const LandInfoView = () => {
|
||||
handleSearch();
|
||||
removeSelectedRows();
|
||||
}
|
||||
!loading && console.log(dataList?.land_info_list)
|
||||
|
||||
return (
|
||||
<>
|
||||
|
||||
277
src/pages/UserManage/BusinessLogView.js
Normal file
277
src/pages/UserManage/BusinessLogView.js
Normal file
@@ -0,0 +1,277 @@
|
||||
import React, { Fragment, useMemo, useRef, useState } from 'react';
|
||||
|
||||
import {
|
||||
Title,
|
||||
TableStyle,
|
||||
FormWrapper,
|
||||
TableWrapper,
|
||||
} from '../../styles/Components';
|
||||
|
||||
import { withAuth } from '../../utils/hook';
|
||||
import {
|
||||
authType,
|
||||
modalTypes,
|
||||
} from '../../assets/data';
|
||||
import { INITIAL_PAGE_LIMIT, INITIAL_PAGE_SIZE } from '../../assets/data/adminConstants';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { DynamicModal, ExcelDownButton, Pagination, ViewTableInfo } from '../../components/common';
|
||||
import { TableSkeleton } from '../../components/Skeleton/TableSkeleton';
|
||||
import BusinessLogSearchBar, { useBusinessLogSearch } from '../../components/ServiceManage/searchBar/BusinessLogSearchBar';
|
||||
import styled from 'styled-components';
|
||||
|
||||
const BusinessLogView = () => {
|
||||
const token = sessionStorage.getItem('token');
|
||||
const { t } = useTranslation();
|
||||
const tableRef = useRef(null);
|
||||
|
||||
const [alertMsg, setAlertMsg] = useState('');
|
||||
|
||||
const [expandedRows, setExpandedRows] = useState({});
|
||||
|
||||
const {
|
||||
searchParams,
|
||||
loading,
|
||||
data: dataList,
|
||||
handleSearch,
|
||||
handleReset,
|
||||
handlePageChange,
|
||||
handlePageSizeChange,
|
||||
handleOrderByChange,
|
||||
updateSearchParams
|
||||
} = useBusinessLogSearch(token, 500, setAlertMsg);
|
||||
|
||||
const toggleRowExpand = (index) => {
|
||||
setExpandedRows(prev => ({
|
||||
...prev,
|
||||
[index]: !prev[index]
|
||||
}));
|
||||
};
|
||||
|
||||
// 테이블 헤더 컬럼 구성
|
||||
const tableHeaders = useMemo(() => {
|
||||
return [
|
||||
{ id: 'logTime', label: '일시', width: '120px' },
|
||||
{ id: 'userGuid', label: 'GUID', width: '200px' },
|
||||
{ id: 'accountId', label: 'account ID', width: '100px' },
|
||||
{ id: 'userNickname', label: '아바타명', width: '150px' },
|
||||
{ id: 'tranId', label: '트랜잭션 ID', width: '200px' },
|
||||
{ id: 'action', label: '액션', width: '150px' },
|
||||
{ id: 'domain', label: '도메인', width: '120px' },
|
||||
{ id: 'details', label: '상세 정보', width: '100px' }
|
||||
];
|
||||
}, []);
|
||||
|
||||
|
||||
// Actor 데이터 렌더링 함수
|
||||
const renderActorData = (actor) => {
|
||||
if (!actor || typeof actor !== 'object') return <></>;
|
||||
|
||||
return (
|
||||
<DetailTable>
|
||||
<thead>
|
||||
<tr>
|
||||
<th colSpan="2">Actor 정보</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Object.entries(actor).map(([key, value]) => (
|
||||
<tr key={`actor-${key}`}>
|
||||
<td>{key}</td>
|
||||
<td>
|
||||
{typeof value === 'object' && value !== null
|
||||
? JSON.stringify(value)
|
||||
: String(value)
|
||||
}
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</DetailTable>
|
||||
);
|
||||
};
|
||||
|
||||
// Infos 데이터 렌더링 함수
|
||||
const renderInfosData = (infos) => {
|
||||
if (!infos || !Array.isArray(infos) || infos.length === 0) return <></>;
|
||||
|
||||
return (
|
||||
<DetailTable>
|
||||
<thead>
|
||||
<tr>
|
||||
<th colSpan="2">Infos 정보</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{infos.map((info, infoIndex) => (
|
||||
<Fragment key={`info-${infoIndex}`}>
|
||||
{Object.entries(info).map(([key, value]) => (
|
||||
<tr key={`info-${infoIndex}-${key}`}>
|
||||
<td>{key}</td>
|
||||
<td>
|
||||
{typeof value === 'object' && value !== null
|
||||
? JSON.stringify(value)
|
||||
: Array.isArray(value)
|
||||
? value.join(', ')
|
||||
: String(value)
|
||||
}
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</Fragment>
|
||||
))}
|
||||
</tbody>
|
||||
</DetailTable>
|
||||
);
|
||||
};
|
||||
|
||||
const handleModalSubmit = async (type, param = null) => {
|
||||
switch (type) {
|
||||
case "warning":
|
||||
setAlertMsg('')
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<Title>비즈니스 로그 조회</Title>
|
||||
<FormWrapper>
|
||||
<BusinessLogSearchBar
|
||||
searchParams={searchParams}
|
||||
onSearch={(newParams, executeSearch = true) => {
|
||||
if (executeSearch) {
|
||||
handleSearch(newParams);
|
||||
} else {
|
||||
updateSearchParams(newParams);
|
||||
}
|
||||
}}
|
||||
onReset={handleReset}
|
||||
/>
|
||||
</FormWrapper>
|
||||
<ViewTableInfo orderType="asc" pageType="B" total={dataList?.total} total_all={dataList?.total_all} handleOrderBy={handleOrderByChange} handlePageSize={handlePageSizeChange}>
|
||||
<ExcelDownButton data={dataList?.generic_list} fileName={t('FILE_BUSINESS_LOG')} />
|
||||
</ViewTableInfo>
|
||||
{loading ? <TableSkeleton width='100%' count={15} /> :
|
||||
<>
|
||||
<TableWrapper>
|
||||
<TableStyle ref={tableRef}>
|
||||
<thead>
|
||||
<tr>
|
||||
{tableHeaders.map(header => (
|
||||
<th key={header.id} width={header.width}>{header.label}</th>
|
||||
))}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{dataList?.generic_list?.map((item, index) => (
|
||||
<Fragment key={index}>
|
||||
<tr>
|
||||
<td>{item.logTime}</td>
|
||||
<td>{item.userGuid}</td>
|
||||
<td>{item.accountId}</td>
|
||||
<td>{item.userNickname}</td>
|
||||
<td>{item.tranId}</td>
|
||||
<td>{item.action}</td>
|
||||
<td>{item.domain === 'None' ? '-' : item.domain}</td>
|
||||
<td>
|
||||
<ActionButton onClick={() => toggleRowExpand(index)}>
|
||||
{expandedRows[index] ? '접기' : '상세보기'}
|
||||
</ActionButton>
|
||||
</td>
|
||||
</tr>
|
||||
{expandedRows[index] && (
|
||||
<DetailRow>
|
||||
<td colSpan={tableHeaders.length}>
|
||||
<DetailContainer>
|
||||
<DetailFlex>
|
||||
<DetailColumn>
|
||||
{renderActorData(item.header?.Actor)}
|
||||
</DetailColumn>
|
||||
<DetailColumn>
|
||||
{renderInfosData(item.body?.Infos)}
|
||||
</DetailColumn>
|
||||
</DetailFlex>
|
||||
</DetailContainer>
|
||||
</td>
|
||||
</DetailRow>
|
||||
)}
|
||||
</Fragment>
|
||||
))}
|
||||
</tbody>
|
||||
</TableStyle>
|
||||
</TableWrapper>
|
||||
<Pagination postsPerPage={searchParams.pageSize} totalPosts={dataList?.total_all} setCurrentPage={handlePageChange} currentPage={searchParams.currentPage} pageLimit={INITIAL_PAGE_LIMIT} />
|
||||
</>
|
||||
}
|
||||
|
||||
<DynamicModal
|
||||
modalType={modalTypes.completed}
|
||||
view={alertMsg ? 'view' : 'hidden'}
|
||||
modalText={alertMsg}
|
||||
handleSubmit={() => handleModalSubmit('warning')}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
// Styled components for the detail view
|
||||
const DetailRow = styled.tr`
|
||||
background-color: #f8f9fa;
|
||||
`;
|
||||
|
||||
const DetailContainer = styled.div`
|
||||
padding: 15px;
|
||||
background-color: #f8f9fa;
|
||||
`;
|
||||
|
||||
const DetailFlex = styled.div`
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
flex-wrap: wrap;
|
||||
`;
|
||||
|
||||
const DetailColumn = styled.div`
|
||||
flex: 1 1 48%;
|
||||
min-width: 300px;
|
||||
`;
|
||||
|
||||
const DetailTable = styled.table`
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin-bottom: 15px;
|
||||
font-size: 12px;
|
||||
|
||||
th, td {
|
||||
border: 1px solid #ddd;
|
||||
padding: 8px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
th {
|
||||
background-color: #f1f1f1;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
tr:nth-child(even) {
|
||||
background-color: #f8f8f8;
|
||||
}
|
||||
`;
|
||||
|
||||
const ActionButton = styled.button`
|
||||
cursor: pointer;
|
||||
background: #4a89dc;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 3px;
|
||||
padding: 2px 5px;
|
||||
font-size: 13px;
|
||||
min-width: max-content;
|
||||
width: 80px;
|
||||
height: 24px;
|
||||
|
||||
&:hover {
|
||||
background: #3a70bc;
|
||||
}
|
||||
`;
|
||||
|
||||
export default withAuth(authType.landRead)(BusinessLogView);
|
||||
@@ -3,4 +3,4 @@ export { default as LogView } from './LogView';
|
||||
export { default as AuthSetting } from './AuthSetting';
|
||||
export { default as AuthSettingUpdate } from './AuthSettingUpdate';
|
||||
export { default as CaliumRequest} from './CaliumRequest';
|
||||
export { default as CaliumRequestRegist} from '../../components/UserManage/CaliumRequestRegistModal';
|
||||
export { default as BusinessLogView} from './BusinessLogView';
|
||||
Reference in New Issue
Block a user