using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon.Cache; using META_ID = System.UInt32; using LAND_AUCTION_NUMBER = System.Int32; using USER_GUID = System.String; namespace ServerCommon { public class LandAuctionRegistryAttribute : EntityAttributeBase, ICopyEntityAttributeFromDoc, IMergeWithEntityAttribute { //============================================================================================= // 랜드 경매 식별 정보 //============================================================================================= [JsonProperty] public META_ID LandMetaId { get; set; } = 0; // 경매 대상 LandData Meta Id [JsonProperty] public LAND_AUCTION_NUMBER AuctionNumber { get; set; } = 0; // 경매 번호 //============================================================================================= // 랜드 경매 등록 정보 //============================================================================================= [JsonProperty] public DateTime AuctionReservationNoticeStartTime { get; set; } = DateTimeHelper.MinTime; // 경매 예약 공지 시작 시간 [JsonProperty] public CurrencyType BidCurrencyType { get; set; } = 0; // 입찰 재화의 종류 [JsonProperty] public double BidStartPrice { get; set; } = 0; // 입찰 시작가 [JsonProperty] public DateTime AuctionStartTime { get; set; } = DateTimeHelper.MinTime; // 경매 시작 시간 [JsonProperty] public DateTime AuctionEndTime { get; set; } = DateTimeHelper.MinTime; // 경매 종료 시간 [JsonProperty] public bool IsCancelAuction { get; set; } = false; // 경매 취소 여부 (취소:true, 미취소:false) [JsonProperty] public DateTime RegisteredVersionTime { get; set; } = DateTimeHelper.MinTime; // 경매 등록 버전 정보 (시간), 랜드 경매 등록 정보가 변경되면 등록 버전 정보도 갱신 되어야 한다. !!! //============================================================================================= // 랜드 경매 진행 정보 //============================================================================================= [JsonProperty] public LandAuctionState LandAuctionState { get; set; } = LandAuctionState.None; // 경매 상태 [JsonProperty] public LandAuctionResult LandAuctionResult { get; set; } = LandAuctionResult.None; // 경매 결과 [JsonProperty] public DateTime ProcessVersionTime { get; set; } = DateTimeHelper.MinTime; // 경매 진행 버전 정보 (시간), 랜드 경매 진행 정보가 변경되면 진행 버전 정보도 갱신되어야 한다. !!! public LandAuctionRegistryAttribute(EntityBase owner) : base(owner) { } public void resetWaiting(META_ID landMetaId) { onClear(); LandMetaId = landMetaId; LandAuctionState = LandAuctionState.Waiting; ProcessVersionTime = DateTimeHelper.Current; } public override IEntityAttributeTransactor onNewEntityAttributeTransactor() { return new LandAuctionRegistryAttributeTransactor(getOwner()); } public override void onClear() { LandMetaId = 0; AuctionNumber = 0; AuctionReservationNoticeStartTime = DateTimeHelper.MinTime; BidCurrencyType = CurrencyType.None; BidStartPrice = 0; AuctionStartTime = DateTimeHelper.MinTime; AuctionEndTime = DateTimeHelper.MinTime; IsCancelAuction = false; RegisteredVersionTime = DateTimeHelper.MinTime; LandAuctionState = LandAuctionState.None; LandAuctionResult = LandAuctionResult.None; ProcessVersionTime = DateTimeHelper.MinTime; getAttributeState().reset(); } public override EntityAttributeBase onCloned() { var cloned = new LandAuctionRegistryAttribute(getOwner()); cloned.deepCopyFromBase(this); cloned.LandMetaId = LandMetaId; cloned.AuctionNumber = AuctionNumber; cloned.AuctionReservationNoticeStartTime = AuctionReservationNoticeStartTime; cloned.BidCurrencyType = BidCurrencyType; cloned.BidStartPrice = BidStartPrice; cloned.AuctionStartTime = AuctionStartTime; cloned.AuctionEndTime = AuctionEndTime; cloned.IsCancelAuction = IsCancelAuction; cloned.RegisteredVersionTime = RegisteredVersionTime; cloned.LandAuctionState = LandAuctionState; cloned.LandAuctionResult = LandAuctionResult; cloned.ProcessVersionTime = ProcessVersionTime; return cloned; } public override async Task<(Result, DynamoDbDocBase?)> toDocBase(bool isForQuery = true) { var result = new Result(); var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => "owner is null !!!"); //===================================================================================== // Attribute => try pending Doc //===================================================================================== var try_pending_doc = getTryPendingDocBase() as LandAuctionRegistryDoc; if (null == try_pending_doc) { var to_copy_doc = new LandAuctionRegistryDoc(LandMetaId, AuctionNumber, DateTimeHelper.Current); var origin_doc = getOriginDocBase(); if (null != origin_doc) { to_copy_doc.copyTimestampsFromOriginDocBase(origin_doc); } try_pending_doc = to_copy_doc; setTryPendingDocBase(try_pending_doc); } var land_auction_attrib = try_pending_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(land_auction_attrib, () => $"land_auction_attrib is null !!! - {owner.toBasicString()}"); land_auction_attrib.LandMetaId = LandMetaId; land_auction_attrib.AuctionNumber = AuctionNumber; land_auction_attrib.AuctionReservationNoticeStartTime = AuctionReservationNoticeStartTime; land_auction_attrib.BidCurrencyType = BidCurrencyType; land_auction_attrib.BidStartPrice = BidStartPrice; land_auction_attrib.AuctionStartTime = AuctionStartTime; land_auction_attrib.AuctionEndTime = AuctionEndTime; land_auction_attrib.IsCancelAuction = IsCancelAuction; land_auction_attrib.RegisteredVersionTime = RegisteredVersionTime; land_auction_attrib.LandAuctionState = LandAuctionState; land_auction_attrib.LandAuctionResult = LandAuctionResult; land_auction_attrib.ProcessVersionTime = ProcessVersionTime; if (false == isForQuery) { return (result, try_pending_doc); } //===================================================================================== // Doc QueryType 반영 //===================================================================================== (result, var to_query_doc) = await applyDoc4Query(try_pending_doc); if (result.isFail()) { return (result, null); } return (result, to_query_doc); } public bool copyEntityAttributeFromDoc(DynamoDbDocBase? docBase) { var err_msg = string.Empty; var to_cast_string = typeof(LandAuctionRegistryDoc).Name; var land_doc_base = docBase as LandAuctionRegistryDoc; if (null == land_doc_base) { err_msg = $"Failed to copyEntityAttributeFromDoc() !!!, land_doc_base is null :{to_cast_string}"; Log.getLogger().error(err_msg); return false; } //===================================================================================== // New Doc => Origin Doc //===================================================================================== syncOriginDocBaseWithNewDoc(land_doc_base); //===================================================================================== // Doc => Attribute //===================================================================================== var land_auction_registry_attrib = land_doc_base.getAttrib(); NullReferenceCheckHelper.throwIfNull(land_auction_registry_attrib, () => "land_auction_registry_attrib is null !!!"); LandMetaId = land_auction_registry_attrib.LandMetaId; AuctionNumber = land_auction_registry_attrib.AuctionNumber; AuctionReservationNoticeStartTime = land_auction_registry_attrib.AuctionReservationNoticeStartTime; BidCurrencyType = land_auction_registry_attrib.BidCurrencyType; BidStartPrice = land_auction_registry_attrib.BidStartPrice; AuctionStartTime = land_auction_registry_attrib.AuctionStartTime; AuctionEndTime = land_auction_registry_attrib.AuctionEndTime; IsCancelAuction = land_auction_registry_attrib.IsCancelAuction; RegisteredVersionTime = land_auction_registry_attrib.RegisteredVersionTime; LandAuctionState = land_auction_registry_attrib.LandAuctionState; LandAuctionResult = land_auction_registry_attrib.LandAuctionResult; ProcessVersionTime = land_auction_registry_attrib.ProcessVersionTime; return true; } public Result onMerge(EntityAttributeBase otherEntityAttribute) { var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var result = new Result(); var err_msg = string.Empty; if (null == otherEntityAttribute) { err_msg = $"Invalid Param !!!, otherEntityAttribute is null"; result.setFail(ServerErrorCode.FunctionParamNull, err_msg); Log.getLogger().error(result.toBasicString()); return result; } //===================================================================================== // OtherAttribute => Attribute //===================================================================================== var land_auction_attribute = otherEntityAttribute as LandAuctionRegistryAttribute; if (null == land_auction_attribute) { err_msg = $"Failed to cast land_auction_attribute !!!, land_attribute is null"; result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg); Log.getLogger().error(result.toBasicString()); return result; } LandMetaId = land_auction_attribute.LandMetaId; AuctionNumber = land_auction_attribute.AuctionNumber; AuctionReservationNoticeStartTime = land_auction_attribute.AuctionReservationNoticeStartTime; BidCurrencyType = land_auction_attribute.BidCurrencyType; BidStartPrice = land_auction_attribute.BidStartPrice; AuctionStartTime = land_auction_attribute.AuctionStartTime; AuctionEndTime = land_auction_attribute.AuctionEndTime; IsCancelAuction = land_auction_attribute.IsCancelAuction; RegisteredVersionTime = land_auction_attribute.RegisteredVersionTime; LandAuctionState = land_auction_attribute.LandAuctionState; LandAuctionResult = land_auction_attribute.LandAuctionResult; ProcessVersionTime = land_auction_attribute.ProcessVersionTime; //===================================================================================== // Attribute Try Pending Doc => Origin Doc //===================================================================================== var try_pending_doc = land_auction_attribute.getTryPendingDocBase() as LandAuctionRegistryDoc; if (null != try_pending_doc) { land_auction_attribute.resetTryPendingDocBase(); syncOriginDocBaseWithNewDoc(try_pending_doc); } var origin_doc_base = getOriginDocBase(); if (null == origin_doc_base) { // DB 에 저장되어 있지 않는 경우 OriginDoc은 null 이다 !!! return result; } var land_auction_registry_attrib = origin_doc_base.getAttrib(); NullReferenceCheckHelper.throwIfNull(land_auction_registry_attrib, () => $"land_auction_registry_attrib is null !!! - {owner.toBasicString()}"); land_auction_registry_attrib.LandMetaId = LandMetaId; land_auction_registry_attrib.AuctionNumber = AuctionNumber; land_auction_registry_attrib.AuctionReservationNoticeStartTime = AuctionReservationNoticeStartTime; land_auction_registry_attrib.BidCurrencyType = BidCurrencyType; land_auction_registry_attrib.BidStartPrice = BidStartPrice; land_auction_registry_attrib.AuctionStartTime = AuctionStartTime; land_auction_registry_attrib.AuctionEndTime = AuctionEndTime; land_auction_registry_attrib.IsCancelAuction = IsCancelAuction; land_auction_registry_attrib.RegisteredVersionTime = RegisteredVersionTime; land_auction_registry_attrib.LandAuctionState = LandAuctionState; land_auction_registry_attrib.LandAuctionResult = LandAuctionResult; land_auction_registry_attrib.ProcessVersionTime = ProcessVersionTime; return result; } public void copyProcessInfoFromCache(LandAuctionCache landAuctionCache) { //===================================================================================== // Cache => Attribute //===================================================================================== LandMetaId = landAuctionCache.LandMetaId; AuctionNumber = landAuctionCache.AuctionNumber; LandAuctionState = landAuctionCache.LandAuctionState; LandAuctionResult = landAuctionCache.LandAuctionResult; ProcessVersionTime = landAuctionCache.ProcessVersionTime; var origin_doc = getOriginDocBase(); if(null == origin_doc) { Log.getLogger().error($"origin_doc is null !!! - {toBasicString()}"); } else { var registry_attrib = origin_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(registry_attrib, () => "registry_attrib is null !!!"); registry_attrib.LandAuctionState = landAuctionCache.LandAuctionState; registry_attrib.LandAuctionResult = landAuctionCache.LandAuctionResult; registry_attrib.ProcessVersionTime = landAuctionCache.ProcessVersionTime; Log.getLogger().debug($"copyProcessInfoFromCache() !!! : {toBasicString()}"); } } public void copyProcessInfoFromDoc(LandAuctionRegistryDoc registryDoc) { //===================================================================================== // Doc => Attribute //===================================================================================== var land_auction_registry_attrib = registryDoc.getAttrib(); NullReferenceCheckHelper.throwIfNull(land_auction_registry_attrib, () => "land_auction_registry_attrib is null !!!"); LandMetaId = land_auction_registry_attrib.LandMetaId; AuctionNumber = land_auction_registry_attrib.AuctionNumber; LandAuctionState = land_auction_registry_attrib.LandAuctionState; LandAuctionResult = land_auction_registry_attrib.LandAuctionResult; ProcessVersionTime = land_auction_registry_attrib.ProcessVersionTime; var origin_doc = getOriginDocBase(); if (null != origin_doc) { var registry_attrib = origin_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(registry_attrib, () => "registry_attrib is null !!!"); LandAuctionState = land_auction_registry_attrib.LandAuctionState; LandAuctionResult = land_auction_registry_attrib.LandAuctionResult; ProcessVersionTime = land_auction_registry_attrib.ProcessVersionTime; } else { syncOriginDocBaseWithNewDoc(registryDoc); } Log.getLogger().debug($"copyProcessInfoFromDoc() !!! : {toBasicString()}"); } public void copyRegisteredInfoFromDoc(LandAuctionRegistryDoc registryDoc) { //===================================================================================== // Doc => Attribute //===================================================================================== var land_auction_registry_attrib = registryDoc.getAttrib(); NullReferenceCheckHelper.throwIfNull(land_auction_registry_attrib, () => "land_auction_registry_attrib is null !!!"); LandMetaId = land_auction_registry_attrib.LandMetaId; AuctionNumber = land_auction_registry_attrib.AuctionNumber; AuctionReservationNoticeStartTime = land_auction_registry_attrib.AuctionReservationNoticeStartTime; BidCurrencyType = land_auction_registry_attrib.BidCurrencyType; BidStartPrice = land_auction_registry_attrib.BidStartPrice; AuctionStartTime = land_auction_registry_attrib.AuctionStartTime; AuctionEndTime = land_auction_registry_attrib.AuctionEndTime; IsCancelAuction = land_auction_registry_attrib.IsCancelAuction; RegisteredVersionTime = land_auction_registry_attrib.RegisteredVersionTime; var origin_doc = getOriginDocBase(); if(null != origin_doc) { var registry_attrib = origin_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(registry_attrib, () => "registry_attrib is null !!!"); AuctionReservationNoticeStartTime = land_auction_registry_attrib.AuctionReservationNoticeStartTime; BidCurrencyType = land_auction_registry_attrib.BidCurrencyType; BidStartPrice = land_auction_registry_attrib.BidStartPrice; AuctionStartTime = land_auction_registry_attrib.AuctionStartTime; AuctionEndTime = land_auction_registry_attrib.AuctionEndTime; IsCancelAuction = land_auction_registry_attrib.IsCancelAuction; RegisteredVersionTime = land_auction_registry_attrib.RegisteredVersionTime; } else { syncOriginDocBaseWithNewDoc(registryDoc); } Log.getLogger().debug($"copyRegisteredInfoFromDoc() !!! : {toBasicString()}"); } public override string toBasicString() { return base.toBasicString() + $" LandMetaId:{LandMetaId}, AuctionNumber:{AuctionNumber}, auctionEndTime:{AuctionEndTime}, auctionState:{LandAuctionState}, auctionResult:{LandAuctionResult}, processVersion:{ProcessVersionTime}, registeredVersion:{RegisteredVersionTime}"; } } public class LandAuctionRegistryAttributeTransactor : EntityAttributeTransactorBase, ICopyEntityAttributeTransactorFromEntityAttribute { public LandAuctionRegistryAttributeTransactor(EntityBase owner) : base(owner) { } public bool copyEntityAttributeTransactorFromEntityAttribute(EntityAttributeBase? entityAttributeBase) { var err_msg = string.Empty; var to_cast_string = typeof(LandAuctionRegistryAttribute).Name; var copy_from_land_attribute = entityAttributeBase as LandAuctionRegistryAttribute; if (null == copy_from_land_attribute) { err_msg = $"Failed to copyEntityAttributeTransactorBaseFromEntityAttribute() !!!, copy_from_land_attribute is null :{to_cast_string}"; Log.getLogger().error(err_msg); return false; } var copy_to_land_attribute = getClonedEntityAttribute() as LandAuctionRegistryAttribute; if (null == copy_to_land_attribute) { err_msg = $"Failed to copyEntityAttributeTransactorBaseFromEntityAttribute() !!!, copy_to_land_attribute is null :{to_cast_string}"; Log.getLogger().error(err_msg); return false; } copy_to_land_attribute.LandMetaId = copy_from_land_attribute.LandMetaId; copy_to_land_attribute.AuctionNumber = copy_from_land_attribute.AuctionNumber; copy_to_land_attribute.AuctionReservationNoticeStartTime = copy_from_land_attribute.AuctionReservationNoticeStartTime; copy_to_land_attribute.BidCurrencyType = copy_from_land_attribute.BidCurrencyType; copy_to_land_attribute.BidStartPrice = copy_from_land_attribute.BidStartPrice; copy_to_land_attribute.AuctionStartTime = copy_from_land_attribute.AuctionStartTime; copy_to_land_attribute.AuctionEndTime = copy_from_land_attribute.AuctionEndTime; copy_to_land_attribute.IsCancelAuction = copy_from_land_attribute.IsCancelAuction; copy_to_land_attribute.RegisteredVersionTime = copy_from_land_attribute.RegisteredVersionTime; copy_to_land_attribute.LandAuctionState = copy_from_land_attribute.LandAuctionState; copy_to_land_attribute.LandAuctionResult = copy_from_land_attribute.LandAuctionResult; copy_to_land_attribute.ProcessVersionTime = copy_from_land_attribute.ProcessVersionTime; return true; } } }