private decimal QueryTotalCharge(Agp2pDataContext context, li_wallet_histories h) { return(context.li_bank_transactions.Where(btr => btr.charger == h.user_id && btr.type == (int)Agp2pEnums.BankTransactionTypeEnum.Charge && btr.status == (int)Agp2pEnums.BankTransactionStatusEnum.Confirm && btr.create_time <= h.create_time).AsEnumerable().Aggregate(0m, (sum, tr) => sum + tr.value)); }
protected static string QueryRemark(Agp2pDataContext context, li_wallet_histories his) { if (his.li_project_transactions != null) { return(!string.IsNullOrWhiteSpace(his.li_project_transactions.remark) ? his.li_project_transactions.remark : "关联项目 " + his.li_project_transactions.li_projects.title); } if (his.li_bank_transactions != null) { if (his.li_bank_transactions.type == (int)Agp2pEnums.BankTransactionTypeEnum.LoanerMakeLoan) { var projectId = Convert.ToInt32(his.li_bank_transactions.remarks); return($"放款项目 {context.li_projects.Single(p => p.id == projectId).title}"); } if (his.li_bank_transactions.type == (int)Agp2pEnums.BankTransactionTypeEnum.GainLoanerRepay) { var repaymentTaskId = Convert.ToInt32(his.li_bank_transactions.remarks); var task = context.li_repayment_tasks.Single(p => p.id == repaymentTaskId); return($"关联还款计划 {task.li_projects.title} 第 {task.term} 期"); } return(his.li_bank_transactions.remarks); } return(his.li_activity_transactions != null ? his.li_activity_transactions.remarks : ""); }
private decimal QueryTotalWithdraw(Agp2pDataContext context, li_wallet_histories h) { return(h.dt_users.li_bank_accounts.Select(ac => { return ac.li_bank_transactions.Where(btr => btr.type == (int)Agp2pEnums.BankTransactionTypeEnum.Withdraw && btr.status == (int)Agp2pEnums.BankTransactionStatusEnum.Confirm && btr.create_time <= h.create_time).AsEnumerable().Aggregate(0m, (sum, tr) => sum + tr.value); }).Sum()); }
protected string QueryTransactionRemark(li_wallet_histories his, Func <li_wallet_histories, string> projectNameMapper) { if (his.li_project_transactions != null) { if (!RemarkHintMap.ContainsKey((Agp2pEnums.WalletHistoryTypeEnum)his.action_type)) { RemarkHintMap[(Agp2pEnums.WalletHistoryTypeEnum)his.action_type] = "{0} " + Utils.GetAgp2pEnumDes((Agp2pEnums.WalletHistoryTypeEnum)his.action_type); } if (his.li_project_transactions.type == (int)Agp2pEnums.ProjectTransactionTypeEnum.Invest) { return (string.Format(RemarkHintMap[(Agp2pEnums.WalletHistoryTypeEnum)his.action_type], projectNameMapper(his), his.li_project_transactions.status == (int)Agp2pEnums.ProjectTransactionStatusEnum.Success ? "" : "已撤销")); } var proj = his.li_project_transactions.li_projects; if (proj.IsNewbieProject1()) { return(string.Format(RemarkHintMap[(Agp2pEnums.WalletHistoryTypeEnum)his.action_type], projectNameMapper(his), "")); } if (proj.IsHuoqiProject()) { var claim = his.li_project_transactions.li_claims_from; return(string.Format(RemarkHintMap[(Agp2pEnums.WalletHistoryTypeEnum)his.action_type], projectNameMapper(his), claim == null ? "" : "债权: " + claim.number)); } // 查出 还款期数/总期数 var term = proj.li_repayment_tasks.SingleOrDefault(t => t.repay_at == his.li_project_transactions.create_time)?.term.ToString() ?? "?"; var repaytaskInfo = string.Format("{0}/{1}", term, proj.li_repayment_tasks.Count(t => t.status != (int)Agp2pEnums.RepaymentStatusEnum.Invalid)); return(string.Format(RemarkHintMap[(Agp2pEnums.WalletHistoryTypeEnum)his.action_type], projectNameMapper(his), repaytaskInfo)); } if (his.li_bank_transactions != null) { if (his.li_bank_transactions.type == (int)Agp2pEnums.BankTransactionTypeEnum.LoanerMakeLoan) { var projectId = Convert.ToInt32(his.li_bank_transactions.remarks); return($"关联项目:{context.li_projects.Single(p => p.id == projectId).title}"); } if (his.li_bank_transactions.type == (int)Agp2pEnums.BankTransactionTypeEnum.GainLoanerRepay) { var repaymentTaskId = Convert.ToInt32(his.li_bank_transactions.remarks); var task = context.li_repayment_tasks.Single(p => p.id == repaymentTaskId); return($"关联还款计划:{task.li_projects.title} 第 {task.term} 期"); } return(his.li_bank_transactions.remarks); } return(his.li_activity_transactions != null ? his.li_activity_transactions.remarks : ""); }
private static void DoHistoryFixing(Agp2pDataContext context, li_wallet_histories his) { // 计算出偏差:和上一个历史记录对比后得出原待收益 var prevHis = his.dt_users.li_wallet_histories.OrderByDescending(h => h.create_time) .First(h => h.create_time < his.create_time); var originalProfiting = his.profiting_money - prevHis.profiting_money; var project = his.li_project_transactions.li_projects; var realInvestment = project.li_project_transactions.Where( tr => tr.investor == his.user_id && tr.type == (int)Agp2pEnums.ProjectTransactionTypeEnum.Invest && tr.status == (int)Agp2pEnums.ProjectTransactionStatusEnum.Success).Sum(pt => pt.principal); // 计算出正确的待收益金额和:通过 GenerateRepayTransactions var myPtr = project.li_repayment_tasks.AsEnumerable().SelectMany( t => TransactionFacade.GenerateRepayTransactions(t, t.repay_at ?? t.should_repay_time)) .Where(ptr => ptr.investor == his.user_id) .ToList(); var predictProfiting = myPtr.Sum(pt => pt.interest.GetValueOrDefault()); var predictInvesting = myPtr.Sum(pt => pt.principal); if (realInvestment != predictInvesting) { throw new Exception("归还的本金不等于投入的本金"); } // 修正往后的历史 if (predictProfiting != originalProfiting) { var deltaProfiting = predictProfiting - originalProfiting; var prefixHis = his.dt_users.li_wallet_histories.OrderByDescending(h => h.create_time) .Where(h => his.create_time <= h.create_time).ToList(); Debug.WriteLine(string.Format("修正 {0} 用户从 {1} 开始出现待收益偏差:{2},影响历史记录 {3} 条", his.dt_users.GetFriendlyUserName(), his.create_time, deltaProfiting, prefixHis.Count)); prefixHis.ForEach(h => { h.profiting_money += deltaProfiting; }); } }
protected static string QueryTransactionOutcome(li_wallet_histories his) { var outcome = TransactionFacade.QueryTransactionOutcome(his); return(outcome == null ? "" : outcome.Value.ToString()); }
protected static string QueryTransactionIncome(li_wallet_histories his) { return(TransactionFacade.QueryTransactionIncome <decimal?>(his)); }