비즈니스 로그조회 추가

This commit is contained in:
2025-03-19 10:56:57 +09:00
parent f2d7c87f38
commit a0087a1e29
15 changed files with 1464 additions and 54 deletions

View File

@@ -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
View 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);
}
}
};

View File

@@ -83,6 +83,12 @@ export const menuConfig = {
permissions: {
read: authType.cryptoRead
}
},
businesslogview: {
title: '비즈니스 로그 조회',
permissions: {
read: authType.businessLogRead
}
}
}
},

View File

@@ -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" }
];

View File

@@ -46,7 +46,8 @@ export const authType = {
landDelete: 45,
battleEventRead: 46,
battleEventUpdate: 47,
battleEventDelete: 48
battleEventDelete: 48,
businessLogRead: 49,
};
export const TabList = [

View File

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

View File

@@ -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'));
}

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

View File

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

View File

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

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

View File

@@ -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'
}
},

View File

@@ -167,7 +167,6 @@ const LandInfoView = () => {
handleSearch();
removeSelectedRows();
}
!loading && console.log(dataList?.land_info_list)
return (
<>

View 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);

View File

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