/// <summary> /// 激活好友 /// </summary> /// <param name="fromUserName"></param> /// <param name="toUserName"></param> public void ActivePartner(string fromUserName, string toUserName, string name) { var toMember = GetMember(toUserName); if (toMember.Status != MemberStatus.UnActived) { throw new PlatformException(ErrorCode.UserIsActived); } var fromMember = GetMember(fromUserName); var userNames = toMember.Chain.Split(new[] { ChainStr }, StringSplitOptions.RemoveEmptyEntries); if (!userNames.Contains(fromUserName)) { throw new PlatformException(ErrorCode.ErrorInvitRelationship); } if (fromMember.CopperBalance < MiddleTier.BusinessConfig.ActivePartnerNeedAmount) { throw new PlatformException(ErrorCode.AccountBalanceNotEnough); } //2、用户注册后,默认是未激活状态(这个又改回来了),推荐人可以激活他下面的所有用户(往下N代都行),直推从好友列表中激活就可以了。不是直推的让他输入登录名和姓名,匹配上了就可以激活(要判断是否是A下面的用户),激活动作扣除激活人的100$的银,并且往被激活人账户里充100$的银(100这个参数做成可配的)。 冬冬要做个激活的页面。 ISession session = DataBase.Session; ITransaction iTransaction = session.BeginTransaction(IsolationLevel.ReadCommitted); try { fromMember.CopperBalance -= MiddleTier.BusinessConfig.ActivePartnerNeedAmount; toMember.SilverBalance += MiddleTier.BusinessConfig.ActivePartnerNeedAmount; toMember.Status = MemberStatus.Actived; //6、激活成功送钻石一个(给推荐人),每增加一个矿工送一个钻石,选金厂送5个,冶炼厂送10个!钻石以后有用! (这个数字做成可配的) fromMember.DiamondBalance += MiddleTier.BusinessConfig.ActivePartnerRewardDiamondAmount; DataBase.Update(toMember, session); DataBase.Update(fromMember, session); //创建转账单 var transferBill = new TransferBill { FromMemberUserName = fromUserName, FromAccountType = AccountType.Copper, ToMemberUserName = toUserName, ToAccountType = AccountType.Silver, Amount = MiddleTier.BusinessConfig.ActivePartnerNeedAmount, Status = TransferBillStatus.Completed, TransferBillType = TransferBillType.Active, ExpiredAt = DateTime.Now }; DataBase.Save(transferBill, session); var ffMemberIncomeRecord = new MemberIncomeRecord { Amount = MiddleTier.BusinessConfig.ActivePartnerRewardDiamondAmount, MemberUserName = fromMember.UserName, DiamondAmount = MiddleTier.BusinessConfig.ActivePartnerRewardDiamondAmount, CopperAmount = -MiddleTier.BusinessConfig.ActivePartnerNeedAmount, Type = MemberIncomeType.InviteActive, ReferenceMemberUsername = toUserName }; // var fffMemberIncomeRecord = new MemberIncomeRecord // { // Amount = MiddleTier.BusinessConfig.ActivePartnerNeedAmount, // MemberUserName = toUserName, // GoldAmount = MiddleTier.BusinessConfig.ActivePartnerNeedAmount, // Type = MemberIncomeType.InviteActiveCost, // ReferenceMemberUsername = fromUserName // }; DataBase.Save(ffMemberIncomeRecord, session); // DataBase.Save(fffMemberIncomeRecord, session); if (toMember.RecommendUserName.IsNotNullOrEmpty()) { var recommendCount = DataBase.Count <Member>(e => e.RecommendUserName == toMember.RecommendUserName && new [] { MemberStatus.Actived, MemberStatus.InUse, MemberStatus.SealUp }.Contains(e.Status), session); var slagEquipmentCount = DataBase.Count <SlagRefiningEquipment>(e => e.MemberUserName == toMember.RecommendUserName && e.SourceType == SlagRefiningEquipmentSourceType.InvitingAwards, session); if (slagEquipmentCount < MiddleTier.BusinessConfig.SlagRefiningEquipmentCountLimit && (int)(recommendCount / MiddleTier.BusinessConfig.SlagRefiningEquipmentRewardInviteMemberCount) > slagEquipmentCount) //每个推荐人精炼设备上限&&达到发放奖励的推荐人数 { //矿渣提炼炉上限是10台,每推荐10名合伙人送一台,每台可精炼矿渣总量的0.3%黄金,前两台0.5%,每台使用期限一年! DataBase.Save(new SlagRefiningEquipment { MemberUserName = toMember.RecommendUserName, LastRefiningAt = DateTime.Now, Percentage = slagEquipmentCount < MiddleTier.BusinessConfig.SlagRefiningEquipmentTopCount ? MiddleTier.BusinessConfig.SlagRefiningEquipmentTopPercentage : MiddleTier.BusinessConfig.SlagRefiningEquipmentNormalPercentage, SourceType = SlagRefiningEquipmentSourceType.InvitingAwards, ValidityTerm = DateTime.Now.AddDays(MiddleTier.BusinessConfig.SlagRefiningEquipmentUseTermDay) }, session); } } iTransaction.Commit(); } catch (Exception ex) { iTransaction.Rollback(); MiddleTier.LogManager.Error(ex); if (ex is PlatformException platformException) { throw platformException; } throw new PlatformException(ErrorCode.SystemError); } finally { session.Close(); } }
/// <summary> /// 用户采集 /// </summary> /// <param name="userName"></param> /// <param name="id"></param> public void MemberCollect(string userName, long id) { //数据校验 var member = MiddleTier.MemberManager.GetMember(userName); if (member == null) { throw new PlatformException(ErrorCode.UserNameIsNotExisted); } var memberMiningEquipment = DataBase.Get <MemberMiningEquipment>(e => e.Id == id && e.MemberUserName == userName); if (memberMiningEquipment == null) { throw new PlatformException(ErrorCode.ErrorId); } var collectStatus = GetMemberMiningEquipmentStatus(memberMiningEquipment.LastCollectAt); if (collectStatus != MemberMiningEquipmentStatus.CanCollected) { throw new PlatformException(ErrorCode.MiningEquipmentCollectError); } ISession session = DataBase.Session; ITransaction iTransaction = session.BeginTransaction(IsolationLevel.ReadCommitted); try { var amount = MemberMiningEquipmentCalculate(memberMiningEquipment); //新增采集收益记录 var memberIncomeRecord = new MemberIncomeRecord { GoldAmount = amount * MiddleTier.BusinessConfig.CollectGoldPercentage / 100, CopperAmount = amount * MiddleTier.BusinessConfig.CollectCopperPercentage / 100, SilverAmount = amount * MiddleTier.BusinessConfig.CollectSilverPercentage / 100, SlagAmount = amount * MiddleTier.BusinessConfig.CollectSlagPercentage / 100, SlagToGoldAmount = 0, Amount = amount, MemberUserName = member.UserName, Type = MemberIncomeType.Collect }; DataBase.Save(memberIncomeRecord, session); //更新账户余额 // member.GoldBalance += memberIncomeRecord.GoldAmount; // member.SilverBalance += memberIncomeRecord.SilverAmount; // member.CopperBalance += memberIncomeRecord.CopperAmount; // member.SlagBalance += memberIncomeRecord.SlagAmount; // member.CollectAmount += memberIncomeRecord.Amount; // DataBase.Update(member, session); var sql = MiddleTier.MemberManager.GetUpdateBalanceSql(member.UserName, memberIncomeRecord.GoldAmount, memberIncomeRecord.SilverAmount, memberIncomeRecord.CopperAmount, memberIncomeRecord.SlagAmount, memberIncomeRecord.Amount); DataBase.ExecuteBySql(sql, session); //给邀请人发送奖励 //原三层减为两层,推荐收益的3%直接显示累计在黄金里! // var inviters = GetInviters(member, MiddleTier.BusinessConfig.ProfitTransmitTime,session); // inviters.ForEach(inviter => // { // var feedBackAmount = amount * MiddleTier.BusinessConfig.ProfitTransmitPercentage / 100; // //Todo 是金账户么? // inviter.GoldBalance += feedBackAmount; // inviter.FeedBackAmount += feedBackAmount; // DataBase.Update(inviter, session); // }); //刷新采矿机的状态 //每5天收矿一次(用户手动点击劳工或矿机收矿),当天24点前必须收矿,错过了就不能收了,10天收两次,10天两次都错过收矿,将该劳工(或矿机)锁定10天! memberMiningEquipment.LastCollectAt = DateTime.Now; memberMiningEquipment.OverDueTime = 0; memberMiningEquipment.Status = MemberMiningEquipmentStatus.InUse; DataBase.Update(memberMiningEquipment, session); iTransaction.Commit(); } catch (Exception ex) { iTransaction.Rollback(); MiddleTier.LogManager.Error(ex); if (ex is PlatformException platformException) { throw platformException; } throw new PlatformException(ErrorCode.SystemError); } finally { session.Close(); } }
/// <summary> /// 用户精炼 /// </summary> /// <param name="userName"></param> /// <param name="id"></param> public void MemberRefining(string userName, long id) { var member = MiddleTier.MemberManager.GetMember(userName); if (member == null) { throw new PlatformException(ErrorCode.UserNameIsNotExisted); } var slagRefiningEquipment = DataBase.Get <SlagRefiningEquipment>(e => e.Id == id && e.MemberUserName == userName); if (slagRefiningEquipment == null) { throw new PlatformException(ErrorCode.ErrorId); } if (slagRefiningEquipment.LastRefiningAt.Date >= DateTime.Now.Date) { throw new PlatformException(ErrorCode.RefiningTooBusy); } ISession session = DataBase.Session; ITransaction iTransaction = session.BeginTransaction(IsolationLevel.ReadCommitted); try { //比如矿渣余额1000 黄金账户增加金额=1000*精炼百分比(0.3)*精炼数量 //后台设个系数吧,矿渣和黄金的提炼比例。 默认1: 1。比如提炼出1G黄金就扣1G矿渣。 如果1: 2,就是提炼1G黄金,扣2G矿渣。 var amount = member.SlagBalance * slagRefiningEquipment.Percentage / 100; member.GoldBalance += amount; member.SlagBalance -= amount * MiddleTier.BusinessConfig.RefiningConsumeRatio; DataBase.Update(member, session); slagRefiningEquipment.LastRefiningAt = DateTime.Now; DataBase.Update(slagRefiningEquipment, session); //创建转账单 var transferBill = new TransferBill { FromMemberUserName = userName, FromAccountType = AccountType.Slag, ToMemberUserName = userName, ToAccountType = AccountType.Gold, Amount = amount, Status = TransferBillStatus.Completed, TransferBillType = TransferBillType.SlagRefine, ExpiredAt = DateTime.Now, ServiceCharge = amount * MiddleTier.BusinessConfig.RefiningConsumeRatio - amount }; DataBase.Save(transferBill, session); var memberIncomeRecord = new MemberIncomeRecord { Amount = amount, GoldAmount = amount, SlagAmount = -amount * MiddleTier.BusinessConfig.RefiningConsumeRatio, Type = MemberIncomeType.Refining, MemberUserName = userName }; DataBase.Save(memberIncomeRecord, session); iTransaction.Commit(); } catch (Exception ex) { iTransaction.Rollback(); MiddleTier.LogManager.Error(ex); if (ex is PlatformException platformException) { throw platformException; } throw new PlatformException(ErrorCode.SystemError); } finally { session.Close(); } }
public void MemberBuyMiningEquipment(string userName, MiningEquipmentType type) { //数据校验 var member = MiddleTier.MemberManager.GetMember(userName); if (member == null) { throw new PlatformException(ErrorCode.UserNameIsNotExisted); } var miningEquipment = DataBase.Get <MiningEquipment>(e => e.Type == type); if (miningEquipment == null) { throw new PlatformException(ErrorCode.ErrorId); } if (member.SilverBalance < miningEquipment.Price) { throw new PlatformException(ErrorCode.AccountBalanceNotEnough); } //11、可以设置购买劳工和矿机的上限(比如劳工设置最多可以买10个,半自动矿机最多可以买5个),这个数字后台可以调整。 var count = DataBase.Count <MemberMiningEquipment>(e => e.MemberUserName == userName && e.Type == type); var limitCount = type == MiningEquipmentType.Miner ? MiddleTier.BusinessConfig.MemberMiningEquipmentType1Limit : ( type == MiningEquipmentType.GoldFactory ? MiddleTier.BusinessConfig.MemberMiningEquipmentType2Limit : MiddleTier.BusinessConfig.MemberMiningEquipmentType3Limit); if (count >= limitCount) { throw new PlatformException(ErrorCode.EquipmentCountLimit); } ISession session = DataBase.Session; ITransaction iTransaction = session.BeginTransaction(IsolationLevel.ReadCommitted); try { var diamondAmount = type == MiningEquipmentType.Miner ? MiddleTier.BusinessConfig.PartnerBuyEquipmentType1RewardDiamondAmount : ( type == MiningEquipmentType.GoldFactory ? MiddleTier.BusinessConfig.PartnerBuyEquipmentType2RewardDiamondAmount : MiddleTier.BusinessConfig.PartnerBuyEquipmentType3RewardDiamondAmount); //扣除银余额 member.SilverBalance -= miningEquipment.Price; if (member.Status == MemberStatus.Actived) { member.Status = MemberStatus.InUse; } if (member.ExpiredAt < DateTime.Now.AddDays(miningEquipment.ExpirationDay + 20)) { member.ExpiredAt = DateTime.Now.AddDays(miningEquipment.ExpirationDay + 20); } member.DiamondBalance += diamondAmount; DataBase.Update(member, session); // DataBase.ExecuteBySql($"UPDATE Members set SilverBalance = SilverBalance-{miningEquipment.Price} Where UserName='******';"); //新增用户挖矿设备 var memberMiningEquipment = new MemberMiningEquipment { MemberUserName = userName, LastCollectAt = DateTime.Now, OverDueTime = 0, Percentage = miningEquipment.Percentage, PurchasePrice = miningEquipment.Price, Type = miningEquipment.Type, ValidityTerm = DateTime.Now.AddDays(miningEquipment.ExpirationDay), Status = MemberMiningEquipmentStatus.InUse }; DataBase.Save(memberMiningEquipment, session); // 2.用户购买矿工后,给她的直接上级奖励矿工价值的25 %(这25 % 中30 % 是金,70 % 是狂渣),她的间接推荐人(上级的上级)拿矿工价值的10 %。 // 限制条件:每种类型矿工的前30个,第31个开始就不给上面的奖励了。 if (DataBase.Count <MemberMiningEquipment>(e => e.MemberUserName == member.UserName && e.Type == type, session) <= 30) { if (member.RecommendUserName.IsNotNullOrEmpty()) { var fRecommendUser = DataBase.Get <Member>(e => e.UserName == member.RecommendUserName, session); if (fRecommendUser != null) { //Todo 收益记录 var fAmount = miningEquipment.Price / 4; fRecommendUser.GoldBalance += fAmount * 0.3m; fRecommendUser.FeedBackAmount += fAmount; fRecommendUser.FeedBackGoldAmount += fAmount * 0.3m; fRecommendUser.SlagBalance += fAmount * 0.7m; fRecommendUser.FeedBackSlagAmount += fAmount * 0.7m; DataBase.Update(fRecommendUser, session); var fMemberIncomeRecord = new MemberIncomeRecord { Amount = fAmount, GoldAmount = fAmount * 0.3m, SlagAmount = fAmount * 0.7m, MemberUserName = fRecommendUser.UserName, Type = MemberIncomeType.InviteFeedback, ReferenceMemberUsername = userName }; DataBase.Save(fMemberIncomeRecord, session); var ffMemberIncomeRecord = new MemberIncomeRecord { Amount = diamondAmount, MemberUserName = userName, DiamondAmount = diamondAmount, Type = MemberIncomeType.EquipmentBuyFeedback, ReferenceMemberUsername = userName }; DataBase.Save(ffMemberIncomeRecord, session); if (fRecommendUser.RecommendUserName.IsNotNullOrEmpty()) { var sRecommendUser = DataBase.Get <Member>(e => e.UserName == fRecommendUser.RecommendUserName, session); if (sRecommendUser != null) { var sRecommendUserRefineEquipmentCount = DataBase.Count <SlagRefiningEquipment>(e => e.MemberUserName == sRecommendUser.UserName); if (sRecommendUserRefineEquipmentCount >= 4) { var sAmount = miningEquipment.Price / 10; sRecommendUser.GoldBalance += sAmount * 0.3m; sRecommendUser.FeedBackAmount += sAmount; sRecommendUser.FeedBackGoldAmount += sAmount * 0.3m; sRecommendUser.SlagBalance += sAmount * 0.7m; sRecommendUser.FeedBackSlagAmount += sAmount * 0.7m; DataBase.Update(sRecommendUser, session); var sMemberIncomeRecord = new MemberIncomeRecord { Amount = sAmount, GoldAmount = sAmount, MemberUserName = sRecommendUser.UserName, Type = MemberIncomeType.EquipmentBuyFeedback, ReferenceMemberUsername = userName }; DataBase.Save(sMemberIncomeRecord, session); } } } } } //给邀请人发放奖励-矿渣 //增加直接推荐奖励,推荐的玩家每购买一台矿机,推荐人都有矿机价值的10%奖励,累计到矿渣! // var inviters = GetInviters(member, 2, session); // inviters.ForEach(inviter => // { // inviter.SlagBalance += // memberMiningEquipment.PurchasePrice / 100 * MiddleTier.BusinessConfig.EquipmentBuyRewardPercentage; // //6、激活成功送钻石一个(给推荐人),每增加一个矿工送一个钻石,选金厂送5个,冶炼厂送10个!钻石以后有用! (这个数字做成可配的) // inviter.DiamondBalance += type == MiningEquipmentType.Type1 // ? MiddleTier.BusinessConfig.PartnerBuyEquipmentType1RewardDiamondAmount // : ( // type == MiningEquipmentType.Type2 // ? MiddleTier.BusinessConfig.PartnerBuyEquipmentType2RewardDiamondAmount // : MiddleTier.BusinessConfig.PartnerBuyEquipmentType3RewardDiamondAmount); // DataBase.Update(inviter, session); // }); } iTransaction.Commit(); } catch (Exception ex) { iTransaction.Rollback(); MiddleTier.LogManager.Error(ex); if (ex is PlatformException platformException) { throw platformException; } throw new PlatformException(ErrorCode.SystemError); } finally { session.Close(); } }
/// <summary> /// /// </summary> /// <param name="record"></param> /// <returns></returns> public static string ToContent(this MemberIncomeRecord record) { string content = ""; var language = LanguageHelper.GetLanguage(); if (language == LanguageType.English) { switch (record.Type) { case MemberIncomeType.ToBuyReward: case MemberIncomeType.Collect: content = $"{record.GoldAmount}$ gold,{record.SilverAmount}$ silver,{record.CopperAmount}$ copper,{record.SlagAmount}$ slag"; break; case MemberIncomeType.InviteFeedback: content = $"[{record.ReferenceMemberUsername}] {record.GoldAmount}$ gold,{record.SlagAmount}$ slag"; break; case MemberIncomeType.Refining: content = $"{record.GoldAmount}$ gold,{record.SlagAmount}$ slag"; break; case MemberIncomeType.EquipmentBuyFeedback: content = $"{record.DiamondAmount} diamond"; break; case MemberIncomeType.InviteActive: content = $"{record.DiamondAmount} diamond,{record.CopperAmount}$ copper"; break; case MemberIncomeType.InviteActiveCost: content = $"{record.GoldAmount}$ gold"; break; } } else { switch (record.Type) { case MemberIncomeType.ToBuyReward: case MemberIncomeType.Collect: content = $"{record.GoldAmount}$金,{record.SilverAmount}$银,{record.CopperAmount}$铜,{record.SlagAmount}$矿渣"; break; case MemberIncomeType.InviteFeedback: content = $"[{record.ReferenceMemberUsername}] {record.GoldAmount}$金,{record.SlagAmount}$矿渣"; break; case MemberIncomeType.Refining: content = $"{record.GoldAmount}$金,{record.SlagAmount}$矿渣"; break; case MemberIncomeType.EquipmentBuyFeedback: content = $"{record.DiamondAmount}枚钻石"; break; case MemberIncomeType.InviteActive: content = $"{record.DiamondAmount}枚钻石,{record.CopperAmount}$铜"; break; case MemberIncomeType.InviteActiveCost: content = $"{record.GoldAmount}$金"; break; } } return(content); }
public void MemberToBuyReward() { var session = DataBase.Session; var endDay = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 28); var lastDay = endDay.AddMonths(-1); if (DateTime.Now.Day == 1) { endDay = endDay.AddMonths(-1); lastDay = lastDay.AddMonths(-1); } if (session.Query <MemberIncomeRecord>().Any(e => e.CreatedAt > lastDay)) { session.Close(); throw new PlatformException("本月已经奖励过了啊"); } var queryable = session.Query <TransferBill>().Where(e => e.Status == TransferBillStatus.Completed && e.TransferBillType == TransferBillType.GoldTransfer && e.CompletedAt >= lastDay && e.CompletedAt < endDay).Select( e => new { e.ToMemberUserName, e.Amount }).GroupBy(e => e.ToMemberUserName) .Select(e => new KeyValuePair <string, decimal>(e.Key, e.Sum(x => x.Amount))).ToList(); var usernames = queryable.Select(kv => kv.Key).ToList(); var users = session.Query <Member>().Where(e => usernames.Contains(e.UserName)); foreach (var member in users) { ITransaction iTransaction = session.BeginTransaction(IsolationLevel.ReadCommitted); try { var amount = queryable.First(e => e.Key == member.UserName).Value * 0.03m; //新增采集收益记录 var memberIncomeRecord = new MemberIncomeRecord { GoldAmount = amount * MiddleTier.BusinessConfig.CollectGoldPercentage / 100, CopperAmount = amount * MiddleTier.BusinessConfig.CollectCopperPercentage / 100, SilverAmount = amount * MiddleTier.BusinessConfig.CollectSilverPercentage / 100, SlagAmount = amount * MiddleTier.BusinessConfig.CollectSlagPercentage / 100, SlagToGoldAmount = 0, Amount = amount, MemberUserName = member.UserName, Type = MemberIncomeType.ToBuyReward }; DataBase.Save(memberIncomeRecord, session); //更新账户余额 // member.GoldBalance += memberIncomeRecord.GoldAmount; // member.SilverBalance += memberIncomeRecord.SilverAmount; // member.CopperBalance += memberIncomeRecord.CopperAmount; // member.SlagBalance += memberIncomeRecord.SlagAmount; // member.CollectAmount += memberIncomeRecord.Amount; // DataBase.Update(member, session); var sql = MiddleTier.MemberManager.GetUpdateBalanceSql(member.UserName, memberIncomeRecord.GoldAmount, memberIncomeRecord.SilverAmount, memberIncomeRecord.CopperAmount, memberIncomeRecord.SlagAmount, memberIncomeRecord.Amount); DataBase.ExecuteBySql(sql, session); iTransaction.Commit(); } catch (Exception ex) { iTransaction.Rollback(); MiddleTier.LogManager.Error(ex); session.Close(); if (ex is PlatformException platformException) { throw platformException; } throw new PlatformException(ErrorCode.SystemError); } } // users.ForEach(member => // { // // }); session.Close(); }