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));
 }
Esempio n. 2
0
 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());
 }
Esempio n. 4
0
 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;
                });
            }
        }
Esempio n. 6
0
        protected static string QueryTransactionOutcome(li_wallet_histories his)
        {
            var outcome = TransactionFacade.QueryTransactionOutcome(his);

            return(outcome == null ? "" : outcome.Value.ToString());
        }
Esempio n. 7
0
 protected static string QueryTransactionIncome(li_wallet_histories his)
 {
     return(TransactionFacade.QueryTransactionIncome <decimal?>(his));
 }