protected DateTime GetInvestTime(li_project_transactions tr) { return(context.li_project_transactions.Where( t => t.project == tr.project && t.investor == tr.investor && t.type == (int)Agp2pEnums.ProjectTransactionTypeEnum.Invest && t.status == (int)Agp2pEnums.ProjectTransactionStatusEnum.Success) .Select(t => t.create_time).Max()); }
protected string queryProfitStatus(li_project_transactions tr) { var profits = context.li_project_transactions.Where( a => a.project == tr.project && a.investor == tr.investor && (a.type == (int)Agp2pEnums.ProjectTransactionTypeEnum.RepayToInvestor && 0 < a.interest)) .Select(t => t.interest.Value) .ToList(); return(string.Format("收益 {0} 次,共 {1} 元", profits.Count, profits.Sum().ToString("c"))); }
protected decimal GetInvestedMoney(li_project_transactions tr) { return(context.li_project_transactions.Where( t => t.project == tr.project && t.investor == tr.investor && t.type == (int)Agp2pEnums.ProjectTransactionTypeEnum.Invest && t.status == (int)Agp2pEnums.ProjectTransactionStatusEnum.Success) .Select(t => t.principal) .AsEnumerable() .Sum()); }
public static li_claims TransferedChild(this li_claims parent, DateTime createTime, Agp2pEnums.ClaimStatusEnum newStatus, decimal childPrincipal, li_project_transactions byPtr) { var child = parent.NewPrincipalAndStatusChild(createTime, newStatus, childPrincipal); child.number = Utils.HiResNowString; child.profitingProjectId = byPtr.project; child.userId = byPtr.investor; child.li_project_transactions_invest = byPtr; return(child); }
public static void DoHuoqiProjectWithdraw(TimerMsg.Type timerType, bool onTime, DateTime withdrawAt) { if (timerType != TimerMsg.Type.AutoRepayTimer) { return; } var context = new Agp2pDataContext(); var repayTime = DateTime.Now; // 对 withdrawDay 的前一天的 Unpaid 债权进行回款(方便在脚本中使用) var checkDay = withdrawAt.Date.AddDays(-1); // 执行未回款债权的回款,减少项目的在投金额(必须要是今日之前的提现) var claims = context.li_claims.Where( c => (c.status == (int)Agp2pEnums.ClaimStatusEnum.CompletedUnpaid || c.status == (int)Agp2pEnums.ClaimStatusEnum.TransferredUnpaid) && c.Parent.createTime.Date == checkDay && !c.Children.Any()).ToList(); if (!claims.Any()) { return; } // 查询出昨日的全部提现及其是第几次的提现 var yesterdayWithdraws = context.li_claims.Where(c => c.status == (int)Agp2pEnums.ClaimStatusEnum.NeedTransfer && c.Parent.status == (int)Agp2pEnums.ClaimStatusEnum.Nontransferable && c.createTime.Date == checkDay) .GroupBy(c => c.dt_users) .ToDictionary(g => g.Key, g => g.Zip(Utils.Infinite(), (claim, index) => new { claim, index }) .ToDictionary(e => e.claim, e => e.index)); claims.ToLookup(c => c.li_projects_profiting).ForEach(pcs => { var huoqiProject = pcs.Key; //发送托管本金到账请求成功后才执行转出逻辑 RequestApiHandle.SendReturnPrinInte(huoqiProject.id, pcs, () => { pcs.ToLookup(c => c.dt_users).ForEach(ucs => { var investor = ucs.Key; var wallet = investor.li_wallets; ucs.ForEach(c => { Agp2pEnums.ClaimStatusEnum newStatus; if (c.status == (int)Agp2pEnums.ClaimStatusEnum.CompletedUnpaid) { newStatus = Agp2pEnums.ClaimStatusEnum.Completed; } else if (c.status == (int)Agp2pEnums.ClaimStatusEnum.TransferredUnpaid) { newStatus = Agp2pEnums.ClaimStatusEnum.Transferred; } else { throw new InvalidOperationException("活期项目 T+1 提款出错:未知的债权状态"); } var newStatusChild = c.NewStatusChild(repayTime, newStatus); context.li_claims.InsertOnSubmit(newStatusChild); // 提现大于 3 次后每次提现都扣除手续费 0.25% var userYesterdayWithdraws = yesterdayWithdraws[c.dt_users]; var parentClaim = userYesterdayWithdraws.Keys.Single(c.IsChildOf); var withdrawIndex = userYesterdayWithdraws[parentClaim]; //TODO 手续费率需要按照配置? var handlingFee = withdrawIndex <= 2 ? 0 : c.principal * 0.25m / 100; var withdrawTransact = new li_project_transactions { principal = c.principal - handlingFee, project = huoqiProject.id, create_time = repayTime, investor = investor.id, type = (byte)Agp2pEnums.ProjectTransactionTypeEnum.HuoqiProjectWithdraw, status = (byte)Agp2pEnums.ProjectTransactionStatusEnum.Success, gainFromClaim = c.id, remark = $"活期项目【{huoqiProject.title}】债权赎回成功:债权金额 {c.principal.ToString("c")},赎回费 {handlingFee.ToString("c")}" }; context.li_project_transactions.InsertOnSubmit(withdrawTransact); wallet.idle_money += withdrawTransact.principal; wallet.investing_money -= c.principal; wallet.last_update_time = repayTime; var his = TransactionFacade.CloneFromWallet(wallet, Agp2pEnums.WalletHistoryTypeEnum.HuoqiProjectWithdrawSuccess); his.li_project_transactions = withdrawTransact; context.li_wallet_histories.InsertOnSubmit(his); }); }); }); }); context.AppendAdminLog("HuoqiWithdraw", "今日活期项目提现成功: " + claims.Sum(c => c.principal).ToString("c")); context.SubmitChanges(); }
protected DateTime GetRepaymentCompleteTime(li_project_transactions pro) { return(pro.li_projects.li_repayment_tasks.Max(r => r.should_repay_time)); }