private static void DoPayBonusInterest(int projectId, DateTime projectCompleteTime) { var context = new Agp2pDataContext(); // 找出未支付的奖励 var projectAtrs = context.li_activity_transactions.Where(atr => atr.activity_type == (byte)Agp2pEnums.ActivityTransactionActivityTypeEnum.InterestRateTicket && atr.status == (byte)Agp2pEnums.ActivityTransactionStatusEnum.Confirm && atr.type == (byte)Agp2pEnums.ActivityTransactionTypeEnum.Gain && atr.transact_time == null && (atr.details.Contains("\"ProjectId\":" + projectId + ",") || atr.details.Contains("\"ProjectId\":" + projectId + "}"))) .ToLookup(atr => atr.dt_users); // 支付奖励并减去代收金额 projectAtrs.ForEach(userTickets => { var wallet = userTickets.Key.li_wallets; userTickets.ForEach(atr => { //丰付获取收益 var msg = new HongbaoPayReqMsg(atr.user_id, atr.value); MessageBus.Main.Publish(msg); var msgResp = BaseRespMsg.NewInstance <HongbaoPayRespMsg>(msg.SynResult); MessageBus.Main.Publish(msgResp); if (msgResp.HasHandle) { atr.remarks = "加息券收益"; atr.transact_time = projectCompleteTime; wallet.profiting_money -= atr.value; wallet.idle_money += atr.value; wallet.total_profit += atr.value; wallet.last_update_time = projectCompleteTime; var his = TransactionFacade.CloneFromWallet(wallet, Agp2pEnums.WalletHistoryTypeEnum.GainConfirm); his.li_activity_transactions = atr; context.li_wallet_histories.InsertOnSubmit(his); } }); }); if (projectAtrs.Any()) { context.AppendAdminLog(DTEnums.ActionEnum.Edit.ToString(), "加息券自动放款用户数:" + projectAtrs.Count); } context.SubmitChanges(); }
private static void HandleUserInvestedMsg(int projectTransactionId, DateTime investTime) { var context = new Agp2pDataContext(); var projectTransaction = context.li_project_transactions.Single(tr => tr.id == projectTransactionId); var unactived = context.li_activity_transactions.Where(a => a.user_id == projectTransaction.investor && a.status == (int)Agp2pEnums.ActivityTransactionStatusEnum.Acting && a.type == (int)Agp2pEnums.ActivityTransactionTypeEnum.Gain && a.activity_type == (int)Agp2pEnums.ActivityTransactionActivityTypeEnum.HongBao).ToList(); if (!unactived.Any()) return; var wallet = context.li_wallets.Single(w => w.user_id == projectTransaction.investor); decimal investAmount = projectTransaction.principal; // 优先取得较大的红包,一样大的话优先满足快过期的红包 var rps = unactived.Select(a => new HongBao(a)) .OrderByDescending(a => a.GetInvestUntil()) .ThenBy(a => a.GetDeadline()) .ToList(); // 汇总未激活红包的投资金额 investAmount += rps.Sum(rp => rp.GetInvested()); rps.ForEach(rp => rp.SetInvested(null)); foreach (var rp in rps) { if (rp.GetInvestUntil() <= investAmount) // 投资足够激活红包 { //丰付支付 var msg = new HongbaoPayReqMsg(rp.atr.user_id, rp.atr.value); MessageBus.Main.Publish(msg); var msgResp = BaseRespMsg.NewInstance<HongbaoPayRespMsg>(msg.SynResult); MessageBus.Main.Publish(msgResp); if (msgResp.HasHandle) { investAmount -= rp.GetInvestUntil(); // 红包激活,发放奖金,更改状态 rp.Activate(investTime); var curr = rp.atr; wallet.idle_money += curr.value; wallet.last_update_time = investTime; var his = TransactionFacade.CloneFromWallet(wallet, Agp2pEnums.WalletHistoryTypeEnum.GainConfirm); his.li_activity_transactions = curr; context.li_wallet_histories.InsertOnSubmit(his); } } } // 有剩余投资金额不够激活钱包的话将其记在第一个未被激活的红包 var firstRp = rps.FirstOrDefault(rp => rp.atr.status == (int)Agp2pEnums.ActivityTransactionStatusEnum.Acting); if (0 < investAmount && firstRp != null) { firstRp.SetInvested(investAmount); } context.SubmitChanges(); }