/// <summary> /// 申请提现 /// 计算申请金额是否可提现,返回计算结果 /// </summary> public CheckWithdrawResult RequestWithdraw_Step1(string userId, decimal requestMoney) { var balanceManager = new UserBalanceManager(); var fundManager = new FundManager(); var userManager = new UserManager(); var maxTimes = 3; var currentTimes = fundManager.QueryTodayWithdrawTimes(userId); if (currentTimes >= maxTimes) { throw new LogicException(string.Format("每日只能提现{0}次", maxTimes)); } var user = userManager.LoadUser(userId); if (user == null) { throw new LogicException("用户不存在 - " + userId); } var userBalance = balanceManager.QueryUserBalance(userId); if (userBalance == null) { throw new LogicException("用户帐户不存在 - " + userId); } //奖金+佣金+名家 var can_tx_money = userBalance.BonusBalance + userBalance.CommissionBalance + userBalance.ExpertsBalance; //正常提现 if (can_tx_money >= requestMoney) { return(new CheckWithdrawResult { WithdrawCategory = WithdrawCategory.General, RequestMoney = requestMoney, ResponseMoney = requestMoney, Summary = string.Format("申请提现{0:N2}元,到账{0:N2}元。", requestMoney), }); } var payoutMoney = requestMoney - can_tx_money; if (userBalance.FillMoneyBalance < payoutMoney) { return(new CheckWithdrawResult { WithdrawCategory = WithdrawCategory.Error, RequestMoney = requestMoney, ResponseMoney = 0, Summary = "可用充值金额不足", }); } #region 处理充值金额的消费,直接扣5% var percent = decimal.Parse(new CacheDataBusiness().QueryCoreConfigFromRedis("WithdrawAboutFillMoney.CutPercent")); //收取5%手续费 var cutFree = payoutMoney * percent / 100; return(new CheckWithdrawResult { RequestMoney = requestMoney, ResponseMoney = requestMoney - cutFree, WithdrawCategory = WithdrawCategory.Compulsory, Summary = string.Format("提现金额中包含充值金额,需要扣除{0}%手续费{1:N2}元,实际到账{2:N2}元", percent, cutFree, requestMoney - cutFree), }); #endregion }
public void Payin_To_Balance(AccountType accountType, string category, string userId, string orderId, decimal payMoney, string summary, RedBagCategory redBag = RedBagCategory.FillMoney, string operatorId = "") { //if (accountType == AccountType.Freeze) // throw new Exception("退款账户不能为冻结账户"); if (payMoney <= 0M) { return; } //throw new Exception("转入金额不能小于0."); var balanceManager = new LocalLoginBusiness(); var fundManager = new FundManager(); //查询帐户余额 var userBalance = balanceManager.QueryUserBalanceInfo(userId); if (userBalance == null) { throw new Exception("用户帐户不存在 - " + userId); } var payDetailList = new List <PayDetail>(); payDetailList.Add(new PayDetail { AccountType = accountType, PayMoney = payMoney, PayType = PayType.Payin, }); var before = 0M; var after = 0M; switch (accountType) { case AccountType.Bonus: before = userBalance.BonusBalance; after = userBalance.BonusBalance + payMoney; //userBalance.BonusBalance = after; break; case AccountType.Commission: before = userBalance.CommissionBalance; after = userBalance.CommissionBalance + payMoney; //userBalance.CommissionBalance = after; break; case AccountType.FillMoney: before = userBalance.FillMoneyBalance; after = userBalance.FillMoneyBalance + payMoney; //userBalance.FillMoneyBalance = after; break; case AccountType.Experts: before = userBalance.ExpertsBalance; after = userBalance.ExpertsBalance + payMoney; //userBalance.ExpertsBalance = after; break; case AccountType.RedBag: before = userBalance.RedBagBalance; after = userBalance.RedBagBalance + payMoney; //userBalance.RedBagBalance = after; var RedBagDetail = new C_Fund_RedBagDetail { CreateTime = DateTime.Now, OrderId = orderId, RedBagCategory = (int)redBag, RedBagMoney = payMoney, UserId = userId, }; fundManager.AddRedBagDetail(RedBagDetail); break; case AccountType.Freeze: before = userBalance.FreezeBalance; after = userBalance.FreezeBalance + payMoney; //userBalance.FreezeBalance = after; break; case AccountType.CPS: before = userBalance.CPSBalance; after = userBalance.CPSBalance + payMoney; //userBalance.CPSBalance = after; break; default: throw new ArgumentException("不支持的账户类型 - " + accountType); } var FundDetail = new C_Fund_Detail { Category = category, CreateTime = DateTime.Now, KeyLine = orderId, OrderId = orderId, AccountType = (int)accountType, PayMoney = payMoney, PayType = (int)PayType.Payin, Summary = summary, UserId = userId, BeforeBalance = before, AfterBalance = after, OperatorId = string.IsNullOrEmpty(operatorId) ? userId : operatorId, }; fundManager.AddFundDetail(FundDetail); //balanceManager.UpdateUserBalance(userBalance); PayToUserBalance(userId, payDetailList.ToArray()); }
/// <summary> /// 申请提现 /// 实际添加提现记录,扣除用户资金 /// </summary> public void RequestWithdraw_Step2(Withdraw_RequestInfo info, string userId, string balancepwd) { var userManager = new UserBalanceManager(); var fundManager = new FundManager(); var user = userManager.QueryUserRegister(userId); if (!user.IsEnable) { throw new LogicException("用户已禁用"); } //资金密码判断 string place = "Withdraw"; decimal payoutMoney = info.RequestMoney; var userBalance = userManager.QueryUserBalance(userId); if (userBalance == null) { throw new LogicException("用户帐户不存在 - " + userId); } if (userBalance.IsSetPwd && !string.IsNullOrEmpty(userBalance.NeedPwdPlace)) { if (userBalance.NeedPwdPlace == "ALL" || userBalance.NeedPwdPlace.Split('|', ',').Contains(place)) { balancepwd = Encipherment.MD5(string.Format("{0}{1}", balancepwd, _gbKey)).ToUpper(); if (!userBalance.Password.ToUpper().Equals(balancepwd)) { throw new LogicException("资金密码输入错误"); } } } var totalMoney = userBalance.FillMoneyBalance + userBalance.BonusBalance + userBalance.CommissionBalance + userBalance.ExpertsBalance; if (totalMoney < payoutMoney) { throw new LogicException(string.Format("用户总金额小于 {0:N2}元。", payoutMoney)); } var orderId = BettingHelper.GetWithdrawId(); var maxTimes = 3; var currentTimes = fundManager.QueryTodayWithdrawTimes(userId); if (currentTimes >= maxTimes) { throw new LogicException(string.Format("每日只能提现{0}次", maxTimes)); } DB.Begin(); try { var resonseMoney = 0M; BusinessHelper businessHelper = new BusinessHelper(); var category = businessHelper.Payout_To_Frozen_Withdraw(fundManager, userManager, userBalance, BusinessHelper.FundCategory_RequestWithdraw, userId, orderId, info.RequestMoney , string.Format("申请提现:{0:N2}元", info.RequestMoney), "Withdraw", balancepwd, out resonseMoney); fundManager.AddWithdraw(new C_Withdraw { OrderId = orderId, BankCardNumber = info.BankCardNumber, BankCode = info.BankCode, BankName = info.BankName, BankSubName = info.BankSubName, CityName = info.CityName, RequestTime = DateTime.Now, ProvinceName = info.ProvinceName, UserId = userId, RequestMoney = info.RequestMoney, WithdrawAgent = (int)info.WithdrawAgent, Status = (int)WithdrawStatus.Requesting, WithdrawCategory = (int)category, ResponseMoney = resonseMoney, }); //查询到账金额 //var wi = GetWithdrawById(orderId); //判断DP是否可用 var cacheDataBusiness = new CacheDataBusiness(); var iscoreConfigInfo = cacheDataBusiness.QueryCoreConfigByKey("DP.Isvailable"); //获取当前系统时间(4-5点DP关闭) var datetime = System.DateTime.Now; var nowHourAndM = datetime.ToString("t"); var datestar = cacheDataBusiness.QueryCoreConfigByKey("DP.StartTime"); var dateend = cacheDataBusiness.QueryCoreConfigByKey("DP.EndTime"); DateTime dstar = Convert.ToDateTime(datestar.ConfigValue); DateTime dend = Convert.ToDateTime(dateend.ConfigValue); if (iscoreConfigInfo.ConfigValue == "1") { if (datetime <= dstar || datetime >= dend) { //发送消息到DP //判断是否发送到DP String htmls = info.BankName; //获取Dp提现最大限额 var coreConfigInfo = cacheDataBusiness.QueryCoreConfigByKey("DP.WithdrawHigthMoney"); //获取Dp给的公司编码 var coreConfigInfoC = cacheDataBusiness.QueryCoreConfigByKey("DP.Companyid"); //获取DP给的key var ck = cacheDataBusiness.QueryCoreConfigByKey("DP.Key"); //获取DP访问路径 var cw = cacheDataBusiness.QueryCoreConfigByKey("DP.WebUrl"); decimal withdrawHigthMoney = decimal.Parse(coreConfigInfo.ConfigValue); //var writer = Common.Log.LogWriterGetter.GetLogWriter(); //writer.Write("关于DP日志", "关于DP日志", Common.Log.LogType.Information, "关于DP日志", "withdrawHigthMoney===============" + withdrawHigthMoney); String str = String.Format("BankCardNumber=" + info.BankCardNumber + ",BankCode=" + info.BankCode + ",BankName=" + info.BankName + ",BankSubName=" + info.BankSubName + ",CityName=" + info.CityName + ",ProvinceName=" + info.ProvinceName + ",RequestMoney=" + info.RequestMoney + ",userRealName=" + info.userRealName + ",WithdrawAgent=" + info.WithdrawAgent + ""); //writer.Write("输出参数写测试用例", "输出参数写测试用例", Common.Log.LogType.Information, "输出参数写测试用例", "输出参数写测试用例===============" + str); WithdrawApplyInfo wai = new WithdrawApplyInfo(); wai.company_order_num = orderId; wai.company_user = userId; wai.card_name = info.userRealName; wai.card_num = info.BankCardNumber; wai.issue_bank_name = info.BankName; wai.issue_bank_address = info.BankSubName; wai.memo = ""; String amount = resonseMoney.ToString(); wai.amount = Math.Round(decimal.Parse(amount), 2); wai.company_id = Int32.Parse(coreConfigInfoC.ConfigValue); String dpresult = null; decimal dpHighmoney = decimal.Parse(coreConfigInfo.ConfigValue); if (info.RequestMoney < withdrawHigthMoney) { if (htmls.Contains("工商银行")) { int bankid = (int)BankCode.ICBC; wai.bank_id = bankid.ToString(); } else if (htmls.Contains("招商银行")) { int bankid = (int)BankCode.CMB; wai.bank_id = bankid.ToString(); } else if (htmls.Contains("建设银行")) { int bankid = (int)BankCode.CCB; wai.bank_id = bankid.ToString(); } else if (htmls.Contains("农业银行")) { int bankid = (int)BankCode.ABC; wai.bank_id = bankid.ToString(); } else if (htmls.Contains("中国银行")) { int bankid = (int)BankCode.BOC; wai.bank_id = bankid.ToString(); } else if (htmls.Contains("交通银行")) { int bankid = (int)BankCode.BCM; wai.bank_id = bankid.ToString(); } else if (htmls.Contains("中国民生银行") || htmls.Contains("民生银行")) { int bankid = (int)BankCode.CMBC; wai.bank_id = bankid.ToString(); } else if (htmls.Contains("中信银行")) { int bankid = (int)BankCode.ECC; wai.bank_id = bankid.ToString(); } else if (htmls.Contains("浦东发展银行") || htmls.Contains("浦发") || htmls.Contains("浦东")) { int bankid = (int)BankCode.SPDB; wai.bank_id = bankid.ToString(); } else if (htmls.Contains("邮政储蓄") || htmls.Contains("中国邮政")) { int bankid = (int)BankCode.PSBC; wai.bank_id = bankid.ToString(); } else if (htmls.Contains("光大银行")) { int bankid = (int)BankCode.CEB; wai.bank_id = bankid.ToString(); } else if (htmls.Contains("平安银行")) { int bankid = (int)BankCode.PINGAN; wai.bank_id = bankid.ToString(); } else if (htmls.Contains("广东发展银行") || htmls.Contains("广发银行")) { int bankid = (int)BankCode.CGB; wai.bank_id = bankid.ToString(); } else if (htmls.Contains("华夏银行")) { int bankid = (int)BankCode.HXB; wai.bank_id = bankid.ToString(); } else if (htmls.Contains("兴业银行")) { int bankid = (int)BankCode.CIB; wai.bank_id = bankid.ToString(); } else { var pListe = new List <string>(); pListe.Add(string.Format("{0}={1}", "[OrderId]", orderId)); pListe.Add(string.Format("{0}={1}", "[UserName]", user.DisplayName)); pListe.Add(string.Format("{0}={1}", "[RequestMoney]", info.RequestMoney)); pListe.Add(string.Format("{0}={1}", "[ResponseMoney]", resonseMoney)); //发送短信 new SiteMessageControllBusiness().DoSendSiteMessage(userId, "", "ON_User_Request_Withdraw", pListe.ToArray()); DB.Commit(); //刷新余额 BusinessHelper.RefreshRedisUserBalance(userId); return; } dpresult = Withdrawal(wai, ck.ConfigValue, cw.ConfigValue); if (dpresult == null || dpresult == "") { DB.Rollback(); throw new Exception("服务繁忙,请稍后重试,如多次尝试失败,请在客服服务时间内联系在线客服咨询"); } } } } #region 发送站内消息:手机短信或站内信 var pList = new List <string>(); pList.Add(string.Format("{0}={1}", "[OrderId]", orderId)); pList.Add(string.Format("{0}={1}", "[UserName]", "")); pList.Add(string.Format("{0}={1}", "[RequestMoney]", info.RequestMoney)); pList.Add(string.Format("{0}={1}", "[ResponseMoney]", resonseMoney)); //发送短信 new SiteMessageControllBusiness().DoSendSiteMessage(userId, "", "ON_User_Request_Withdraw", pList.ToArray()); #endregion DB.Commit(); //刷新余额 BusinessHelper.RefreshRedisUserBalance(userId); } catch (Exception ex) { DB.Rollback(); throw ex; } }
/// <summary> /// 用户支出,申请提现 /// </summary> public WithdrawCategory Payout_To_Frozen_Withdraw(string category, string userId, string orderId, decimal payoutMoney, string summary, string place, string password, out decimal responseMoney) { var requestMoney = payoutMoney; if (payoutMoney <= 0M) { throw new Exception("消费金额不能小于0."); } //查询帐户余额 var balanceManager = new UserBalanceManager(); var fundManager = new FundManager(); //资金密码判断 var userBalance = balanceManager.QueryUserBalance(userId); if (userBalance == null) { throw new Exception("用户帐户不存在 - " + userId); } if (userBalance.IsSetPwd && !string.IsNullOrEmpty(userBalance.NeedPwdPlace)) { if (userBalance.NeedPwdPlace == "ALL" || userBalance.NeedPwdPlace.Split('|', ',').Contains(place)) { password = Encipherment.MD5(string.Format("{0}{1}", password, _gbKey)).ToUpper(); if (!userBalance.Password.ToUpper().Equals(password)) { throw new Exception("资金密码输入错误"); } } } var totalMoney = userBalance.FillMoneyBalance + userBalance.BonusBalance + userBalance.CommissionBalance + userBalance.ExpertsBalance; if (totalMoney < payoutMoney) { throw new Exception(string.Format("用户总金额小于 {0:N2}元。", payoutMoney)); } var payDetailList = new List <PayDetail>(); payDetailList.Add(new PayDetail { AccountType = AccountType.Freeze, PayMoney = payoutMoney, PayType = PayType.Payin, }); //冻结资金明细 fundManager.AddFundDetail(new C_Fund_Detail { Category = category, CreateTime = DateTime.Now, KeyLine = orderId, OrderId = orderId, AccountType = (int)AccountType.Freeze, PayMoney = payoutMoney, PayType = (int)PayType.Payin, Summary = summary, UserId = userId, BeforeBalance = userBalance.FreezeBalance, AfterBalance = userBalance.FreezeBalance + payoutMoney, OperatorId = userId, }); //userBalance.FreezeBalance += payoutMoney; #region 正常提现 //奖金+佣金+名家 var currentPayout = 0M; if (userBalance.BonusBalance > 0M && payoutMoney > 0M) { //奖金参与支付 currentPayout = userBalance.BonusBalance >= payoutMoney ? payoutMoney : userBalance.BonusBalance; payoutMoney -= currentPayout; payDetailList.Add(new PayDetail { AccountType = AccountType.Bonus, PayMoney = currentPayout, PayType = PayType.Payout, }); fundManager.AddFundDetail(new C_Fund_Detail { Category = category, CreateTime = DateTime.Now, KeyLine = orderId, OrderId = orderId, AccountType = (int)AccountType.Bonus, PayMoney = currentPayout, PayType = (int)PayType.Payout, Summary = summary, UserId = userId, BeforeBalance = userBalance.BonusBalance, AfterBalance = userBalance.BonusBalance - currentPayout, OperatorId = userId, }); //userBalance.BonusBalance -= currentPayout; } if (userBalance.CommissionBalance > 0M && payoutMoney > 0M) { //佣金参与支付 currentPayout = userBalance.CommissionBalance >= payoutMoney ? payoutMoney : userBalance.CommissionBalance; payoutMoney -= currentPayout; payDetailList.Add(new PayDetail { AccountType = AccountType.Commission, PayMoney = currentPayout, PayType = PayType.Payout, }); fundManager.AddFundDetail(new C_Fund_Detail { Category = category, CreateTime = DateTime.Now, KeyLine = orderId, OrderId = orderId, AccountType = (int)AccountType.Commission, PayMoney = currentPayout, PayType = (int)PayType.Payout, Summary = summary, UserId = userId, BeforeBalance = userBalance.CommissionBalance, AfterBalance = userBalance.CommissionBalance - currentPayout, OperatorId = userId, }); //userBalance.CommissionBalance -= currentPayout; } if (userBalance.ExpertsBalance > 0M && payoutMoney > 0M) { //名家参与支付 currentPayout = userBalance.ExpertsBalance >= payoutMoney ? payoutMoney : userBalance.ExpertsBalance; payoutMoney -= currentPayout; payDetailList.Add(new PayDetail { AccountType = AccountType.Experts, PayMoney = currentPayout, PayType = PayType.Payout, }); fundManager.AddFundDetail(new C_Fund_Detail { Category = category, CreateTime = DateTime.Now, KeyLine = orderId, OrderId = orderId, AccountType = (int)AccountType.Experts, PayMoney = currentPayout, PayType = (int)PayType.Payout, Summary = summary, UserId = userId, BeforeBalance = userBalance.ExpertsBalance, AfterBalance = userBalance.ExpertsBalance - currentPayout, OperatorId = userId, }); //userBalance.ExpertsBalance -= currentPayout; } #endregion responseMoney = requestMoney; var payCategory = WithdrawCategory.Compulsory; if (payoutMoney <= 0M) { payCategory = WithdrawCategory.General; } else { //使用充值金额扣款 if (userBalance.FillMoneyBalance < payoutMoney) { throw new Exception("可用充值金额不足"); } #region 异常提现 //收取5%手续费 var percent = decimal.Parse(new CacheDataBusiness().QueryCoreConfigFromRedis("WithdrawAboutFillMoney.CutPercent")); var counterFee = payoutMoney * percent / 100; //到帐金额 responseMoney = requestMoney - counterFee; //手续费明细 fundManager.AddFundDetail(new C_Fund_Detail { Category = BusinessHelper.FundCategory_RequestWithdrawCounterFee, CreateTime = DateTime.Now, KeyLine = orderId, OrderId = orderId, AccountType = (int)AccountType.FillMoney, PayMoney = counterFee, PayType = (int)PayType.Payout, Summary = summary, UserId = userId, BeforeBalance = userBalance.FillMoneyBalance, AfterBalance = userBalance.FillMoneyBalance - counterFee, OperatorId = userId, }); //userBalance.FillMoneyBalance -= counterFee; //到帐金额 var resMoney = payoutMoney - counterFee; //写充值金额的扣款资金明细 fundManager.AddFundDetail(new C_Fund_Detail { Category = category, CreateTime = DateTime.Now, KeyLine = orderId, OrderId = orderId, AccountType = (int)AccountType.FillMoney, PayMoney = resMoney, PayType = (int)PayType.Payout, Summary = summary, UserId = userId, BeforeBalance = userBalance.FillMoneyBalance, AfterBalance = userBalance.FillMoneyBalance - resMoney, OperatorId = userId, }); //userBalance.FillMoneyBalance -= resMoney; payDetailList.Add(new PayDetail { AccountType = AccountType.FillMoney, PayMoney = counterFee + resMoney, PayType = PayType.Payout, }); #endregion } //balanceManager.UpdateUserBalance(userBalance); PayToUserBalance(userId, payDetailList.ToArray()); return(payCategory); }