Example #1
0
        public static void DoRepay(TimerMsg.Type timerType, bool onTime)
        {
            if (timerType != TimerMsg.Type.AutoRepayTimer)
            {
                return;
            }
            if (ConfigLoader.loadSiteConfig().enableAutoRepay == 0)
            {
                return;
            }

            var context         = new Agp2pDataContext();
            var shouldRepayTask = context.li_repayment_tasks.Where(
                t =>
                t.status == (int)Agp2pEnums.RepaymentStatusEnum.Unpaid &&
                t.should_repay_time.Date <= DateTime.Today).ToList();

            if (!shouldRepayTask.Any())
            {
                return;
            }


            // 优先进行特殊项目的回款
            shouldRepayTask.OrderByDescending(t => t.li_projects.dt_article_category.sort_id).ForEach(ta =>
            {
                //TODO 特殊项目回款处理
                //if (ta.li_projects.IsNewbieProject())
                //{
                //    context.ExecuteRepaymentTask(ta.id);
                //}
                //else
                //调用托管本息到账接口,在本息到账异步响应中执行还款计划
                RequestApiHandle.SendReturnPrinInte(ta.project, (ta.repay_interest + ta.repay_principal).ToString("f"), ta.id, false, ta.li_projects.IsHuoqiProject());
            });

            context.AppendAdminLogAndSave("AutoRepay", "今日待还款项目自动还款:" + shouldRepayTask.Count);

            // 活期项目不发兑付公告
            SendRepayNotice(shouldRepayTask.Where(t => !t.li_projects.IsHuoqiProject()).ToList(), context);
        }
Example #2
0
        static MessageBus()
        {
            // Init
            NewUserInit.DoSubscribe();
            UserLogin.DoSubscribe();

            // Business
            TransactionFacade.DoSubscribe();
            CheckDelayInvestOverTime.DoSubscribe();
            AutoRepay.DoSubscribe();
            ProjectWithdraw.DoSubscribe();
            CheckOverTimePaid.DoSubscribe();
            FinancingTimeout.DoSubscribe();
            ScheduleAnnounce.DoSubscribe();
            AutoMakeLoan.DoSubscribe();

            // Notify
            InvestAnnounce.DoSubscribe();
            RepayAnnounce.DoSubscribe();
            BankTransactionNotify.DoSubscribe();
            ManagerNotifier.DoSubscribe();

            // Activity
            //TrialActivity.DoSubscribe();
            // InviterBonus.DoSubscribe();
            HongBaoActivity.DoSubscribe();
            TrialTicketActivity.DoSubscribe();
            InterestRateTicketActivity.DoSubscribe();
            PointsActivity.DoSubscribe();


            // PayApi
            RequestApiHandle.DoSubscribe();   //所有托管接口请求
            UserHandle.DoSubscribe();         //用户接口响应处理
            BankTransHandle.DoSubscribe();    //资金账户接口响应
            ProjectTransHandle.DoSubscribe(); //项目接口响应

            //会员积分
            UserPointHandler.DoSubscribe();
        }
Example #3
0
        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();
        }