123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Data;
- using MySystem.PxcModels;
- using Library;
- using System.Threading;
- using Microsoft.Extensions.Hosting;
- using System.Threading.Tasks;
- namespace MySystem
- {
- public class ProfitHelper
- {
- public readonly static ProfitHelper Instance = new ProfitHelper();
- private ProfitHelper()
- {
- }
-
- #region 激活队列
- public void StartListenActiveDo(Dictionary<string, string> data)
- {
- try
- {
-
- }
- catch (Exception ex)
- {
- function.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":" + ex.ToString(), "激活奖励服务异常");
- }
- }
- #endregion
- #region 消费队列(执行消费退款金额的统计)
- public void StartListenTradeDo()
- {
- bool op = true;
- while (op)
- {
- string orderidstring = TendisDbconn.Instance.LPop<string>("ConsumerOrders:Divi:List");
- if (!string.IsNullOrEmpty(orderidstring))
- {
- int OrderId = int.Parse(function.CheckInt(orderidstring));
- WebCMSEntities db = new WebCMSEntities();
- using (var tran = db.Database.BeginTransaction())
- {
- try
- {
- ConsumerOrders order = db.ConsumerOrders.FirstOrDefault(m => m.Id == OrderId);
- if (order != null)
- {
- decimal PayMoney = order.PayMoney * 10000M;
- int MerchantId = order.MerchantId;
- MerchantInfo merchant = db.MerchantInfo.FirstOrDefault(m => m.Id == MerchantId);
- if (merchant != null)
- {
- MerchantParamSet set = Newtonsoft.Json.JsonConvert.DeserializeObject<MerchantParamSet>(order.SeoDescription);
- int DiviPersons = set.DiviPersons; //单笔订单分红人数
- decimal DiviPercent = set.DiviPercent; //单人最大分红比例
- int ProfitDays = set.ProfitDays; //分红期限(天)
- decimal GetPercent = set.GetPercent; //商家实收比例
- decimal MinPayMoney = set.MinPayMoney; //订单参与门槛
- int IsAll = set.IsAll; //是否收全额
- if (IsAll == 0 && PayMoney >= MinPayMoney && GetPercent < 1)
- {
- List<CustomTagSet> customTagSets = TendisDbconn.Instance.GetList<CustomTagSet>("CustomTagSet", 1, 1000); //获取公用配置参数集和
- //获取参数
- CustomTagSet profitPercentSet = customTagSets.FirstOrDefault(m => m.Tags == "CusumerProfitPercent") ?? new CustomTagSet();
- decimal profitPercent = decimal.Parse(function.CheckNum(profitPercentSet.Contents)); //基于收款金额的总分润比例;
- CustomTagSet cusumerFeePercentSet = customTagSets.FirstOrDefault(m => m.Tags == "CusumerFeePercent") ?? new CustomTagSet();
- decimal cusumerFeePercent = decimal.Parse(function.CheckNum(cusumerFeePercentSet.Contents)); //费率;
- CustomTagSet minProfitSet = customTagSets.FirstOrDefault(m => m.Tags == "MinProfit") ?? new CustomTagSet();
- decimal minProfit = decimal.Parse(function.CheckNum(minProfitSet.Contents)); //最小分润值;
- decimal DiviMoney = PayMoney * (1 - GetPercent - cusumerFeePercent - profitPercent);
- if (DiviMoney > 0)
- {
- DiviMoney = DiviMoney / DiviPersons;
- //付款人获取退款返现
- decimal GetMoney = order.MaxDivi - order.CurDivi;
- if (GetMoney >= DiviMoney)
- {
- GetMoney = DiviMoney;
- }
- if (GetMoney > minProfit)
- {
- order.CurDivi += GetMoney;
- ConsumerProfit cprofit = db.ConsumerProfit.Add(new ConsumerProfit()
- {
- CreateDate = DateTime.Now,
- ConsumerId = order.ConsumerId,
- MerchantId = order.MerchantId,
- OrderId = OrderId,
- GetMoney = GetMoney,
- }).Entity;
- db.SaveChanges();
- TendisDbconn.Instance.AddList("ConsumerOrdersStat", new RefundItem()
- {
- ProfitId = cprofit.Id,
- TradeNo = order.OrderNo,
- RefundMoney = GetMoney,
- TotalMoney = order.PayMoney,
- PayMode = order.PayMode,
- MerchantId = order.MerchantId,
- });
- }
- List<int> deletes = new List<int>();
- long CurDiviPersons = DiviPersons;
- long CurQueueCount = TendisDbconn.Instance.Count("ConsumerOrders:Divi:" + MerchantId);
- if (CurDiviPersons > CurQueueCount)
- {
- CurDiviPersons = CurQueueCount;
- }
- CurDiviPersons = CurDiviPersons - 1;
- while (CurDiviPersons > 0)
- {
- ConsumerOrders suborder = TendisDbconn.Instance.RPop<ConsumerOrders>("ConsumerOrders:Divi:" + MerchantId);
- if (suborder != null)
- {
- if (suborder.CurDivi < suborder.MaxDivi)
- {
- GetMoney = suborder.MaxDivi - suborder.CurDivi;
- if (GetMoney >= DiviMoney)
- {
- GetMoney = DiviMoney;
- }
- if (GetMoney > minProfit)
- {
- suborder.CurDivi += GetMoney;
- ConsumerProfit cprofit = db.ConsumerProfit.Add(new ConsumerProfit()
- {
- CreateDate = DateTime.Now,
- ConsumerId = suborder.ConsumerId,
- MerchantId = suborder.MerchantId,
- OrderId = OrderId,
- GetMoney = GetMoney,
- }).Entity;
- db.SaveChanges();
- TendisDbconn.Instance.AddList("ConsumerOrdersStat", new RefundItem()
- {
- ProfitId = cprofit.Id,
- TradeNo = order.OrderNo,
- RefundMoney = GetMoney,
- TotalMoney = order.PayMoney,
- PayMode = order.PayMode,
- MerchantId = order.MerchantId,
- });
- if (suborder.CurDivi < suborder.MaxDivi)
- {
- TendisDbconn.Instance.AddList("ConsumerOrders:Divi:" + MerchantId, suborder);
- }
- }
- }
- }
- CurDiviPersons -= 1;
- }
- //创客分润
- // DoProfit(db, order);
- //代理商分润
- // AgentProfit(db, order);
- }
- }
- }
- }
- tran.Commit();
- }
- catch (Exception ex)
- {
- op = false;
- function.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":" + ex.ToString(), "自定义分润程序监听队列异常");
- tran.Rollback();
- }
- }
- db.Dispose();
- }
- else
- {
- op = false;
- }
- }
- }
- //分润算法
- public void DoProfit(WebCMSEntities dbnew, ConsumerOrders trade_record)
- {
- MerchantInfo merchant = dbnew.MerchantInfo.FirstOrDefault(m => m.Id == trade_record.MerchantId) ?? new MerchantInfo();
- List<ProfitUsers> users = new List<ProfitUsers>();
- int TopUserId = 0; //顶级创客Id
- Users us = dbnew.Users.FirstOrDefault(a => a.Id == merchant.UserId);
- if (us != null)
- {
- string uidstring = us.Id.ToString();
- if (!string.IsNullOrEmpty(us.ParentNav))
- {
- uidstring = us.ParentNav.Trim(',').Replace(",,", ",") + "," + uidstring;
- TopUserId = int.Parse(function.CheckInt(us.ParentNav.Trim(',').Replace(",,", ",").Split(',')[0]));
- }
- string[] uidlist = uidstring.Split(',');
- Array.Reverse(uidlist);
- foreach (string uidstr in uidlist)
- {
- int puid = int.Parse(function.CheckInt(uidstr));
- Users pus = dbnew.Users.FirstOrDefault(a => a.Id == puid);
- if (pus != null)
- {
- users.Add(new ProfitUsers()
- {
- UserId = pus.Id,
- UserNav = pus.ParentNav,
- UserLevel = pus.UserLevel,
- CreateDate = pus.CreateDate.Value,
- });
- }
- }
- }
- string TradeMonth = trade_record.CreateDate.Value.ToString("yyyyMM");
- List<ProfitResult> list = new List<ProfitResult>();
- list = StartProft(dbnew, trade_record, GetLevelKindId(1), users);
- // using (var tran = dbnew.Database.BeginTransaction())
- // {
- try
- {
- foreach (ProfitResult sub in list)
- {
- if (sub.Message == "分红奖励")
- {
- UserAccountRecord accountRecord = dbnew.UserAccountRecord.Add(new UserAccountRecord()
- {
- CreateDate = DateTime.Now,
- UpdateDate = DateTime.Now,
- UserId = sub.UserId, //创客
- ChangeType = 11, //变动类型
- ProductType = 1, //产品类型
- ChangeAmount = sub.Money, //变更金额
- Status = -1,
- }).Entity;
- dbnew.SaveChanges();
- }
- else
- {
- int ProfitType = sub.UserId == merchant.UserId ? 0 : 1;
- ProfitRewardRecord editprofitrecord = dbnew.ProfitRewardRecord.FirstOrDefault(m => m.UserId == sub.UserId && m.MerchantId == trade_record.MerchantId && m.BrandId == 1 && m.ProfitType == ProfitType && m.TradeMonth == TradeMonth);
- if (editprofitrecord == null)
- {
- editprofitrecord = dbnew.ProfitRewardRecord.Add(new ProfitRewardRecord()
- {
- CreateDate = DateTime.Now,
- UserId = sub.UserId, //创客
- MerchantId = trade_record.MerchantId, //商户
- BrandId = 1, //品牌
- ProfitType = ProfitType, //创客分润类型
- TradeMonth = TradeMonth, //交易月
- TopUserId = TopUserId, //顶级创客
- }).Entity;
- dbnew.SaveChanges();
- string RecordNo = "KPM";
- int RecordId = editprofitrecord.Id;
- string RecordIdString = RecordId.ToString();
- for (int i = 0; i < 14 - RecordId.ToString().Length; i++)
- {
- RecordIdString = "0" + RecordIdString;
- }
- RecordNo += RecordIdString;
- editprofitrecord.RecordNo = RecordNo;
- dbnew.SaveChanges();
- }
- decimal TradeAmount = trade_record.PayMoney;
- editprofitrecord.TradeAmt += TradeAmount; //商户交易总额
- editprofitrecord.DebitCapTradeNum += 1; //商户借记卡封顶交易总笔数
- decimal ProfitMoney = sub.Money;
- dbnew.SaveChanges();
- dbnew.ProfitRecord.Add(new ProfitRecord()
- {
- CreateDate = DateTime.Now,
- UpdateDate = DateTime.Now,
- UserId = sub.UserId, //创客
- MerchantId = trade_record.MerchantId, //商户
- SnNo = trade_record.SnNo, //SN号
- TradeDate = trade_record.CreateDate, //交易日期
- ProfitAmount = sub.Money, //分润金额
- BrandId = 1, //品牌
- ParentNav = us.ParentNav, //上级创客集
- TradeId = trade_record.Id, //交易记录Id
- });
- dbnew.SaveChanges();
- }
- }
- dbnew.SaveChanges();
- // tran.Commit();
- }
- catch (Exception ex)
- {
- // tran.Rollback();
- ErrorMsg msg = new ErrorMsg()
- {
- Time = DateTime.Now,
- ErrorContent = ex.ToString(),
- Obj = Newtonsoft.Json.JsonConvert.SerializeObject(trade_record),
- };
- TendisDbconn.Instance.AddList("MainServerProfitError", msg);
- }
- // }
- }
- public void DoActives(WebCMSEntities dbnew, TradeRecord trade_record)
- {
- if (TendisDbconn.Instance.CheckKey("pobjact" + trade_record.Sort))
- {
- List<ProfitObjectsActives> objactives = RedisDbconn.Instance.GetList<ProfitObjectsActives>("pobjact" + trade_record.Sort);
- if (objactives.Count > 0)
- {
- string OtherCondition = " and Type=1";
- if (trade_record.Sort == 1) OtherCondition = " and Type<>1";
- else if (trade_record.Sort == 2) OtherCondition = " and Type<>1";
- else if (trade_record.Sort == 4) OtherCondition = " and Type=2";
- else if (trade_record.Sort == 11) OtherCondition = " and Type=2";
- else if (trade_record.Sort == 14) OtherCondition = " and (Type=1 or Type=3)";
- else if (trade_record.Sort == 6 || trade_record.Sort == 7 || trade_record.Sort == 18) OtherCondition = "";
- else if (trade_record.Sort == 29) OtherCondition = " and Type=2";
- PosMachines machine = dbnew.PosMachines.FirstOrDefault(m => m.PosSn == trade_record.SnNo) ?? new PosMachines();
- if (machine.ActivationState == 0)
- {
- return;
- }
- if (machine.BrandId == 0)
- {
- return;
- }
- Users user = dbnew.Users.FirstOrDefault(m => m.Id == machine.UserId) ?? new Users();
- Users buyuser = dbnew.Users.FirstOrDefault(m => m.Id == machine.BuyUserId) ?? new Users();
- Dictionary<string, ProfitUsers> Users = new Dictionary<string, ProfitUsers>();
- Users.Add("UserId", new ProfitUsers()
- {
- UserId = user.Id,
- UserNav = user.ParentNav,
- UserLevel = user.UserLevel,
- });
- Users.Add("BuyUserId", new ProfitUsers()
- {
- UserId = buyuser.Id,
- UserNav = buyuser.ParentNav,
- UserLevel = buyuser.UserLevel,
- });
- List<ProfitResult> list = StartActiveProft(dbnew, machine, trade_record.SnNo, trade_record.Sort, Users, new ActiveCheckData()
- {
- TableName = "TransactionRecord",
- StatField = "Money",
- CheckField = "pos_sn",
- OtherCondition = OtherCondition,
- });
- foreach (ProfitResult sub in list)
- {
- // dbnew.MybillTable.Add(new MybillTable()
- // {
- // Content = sub.Message,
- // Money = sub.Money,
- // Type = 1,
- // UserId = sub.UserId,
- // UserNav = sub.UserNav,
- // Kind = 2,
- // CreateDate = DateTime.Now,
- // SeoTitle = trade_record.SeoTitle,
- // SeoKeyword = trade_record.SnNo,
- // Sort = trade_record.Sort,
- // Status = -3,
- // });
- }
- dbnew.SaveChanges();
- }
- }
- }
- //代理商分润算法
- public void AgentProfit(WebCMSEntities db, ConsumerOrders order)
- {
- int MerchantId = order.MerchantId;
- decimal PayMoney = order.PayMoney;
- MerchantInfo merchant = db.MerchantInfo.FirstOrDefault(m => m.Id == MerchantId);
- if (merchant != null)
- {
- List<CustomTagSet> customTagSets = RedisDbconn.Instance.GetList<CustomTagSet>("CustomTagSet", 1, 1000); //获取公用配置参数集和 // TODO: 后台配置
- //获取代理商参数
- CustomTagSet profitPercentSet = customTagSets.FirstOrDefault(m => m.Tags == "AgentProfitPercent") ?? new CustomTagSet();
- decimal profitPercent = decimal.Parse(function.CheckNum(profitPercentSet.Contents)); //基于收款金额的总分润比例;
- CustomTagSet makerProfitSet = customTagSets.FirstOrDefault(m => m.Tags == "AgentMakerProfit") ?? new CustomTagSet();
- decimal makerProfit = decimal.Parse(function.CheckNum(makerProfitSet.Contents)); //创客分润比例;
- CustomTagSet directProfitSet = customTagSets.FirstOrDefault(m => m.Tags == "AgentDirectProfit") ?? new CustomTagSet();
- decimal directProfit = decimal.Parse(function.CheckNum(directProfitSet.Contents)); //直推分润比例;
- CustomTagSet minProfitSet = customTagSets.FirstOrDefault(m => m.Tags == "MinProfit") ?? new CustomTagSet();
- decimal minProfit = decimal.Parse(function.CheckNum(minProfitSet.Contents)); //最小分润值;
- string MerAreas = merchant.Areas;
- MerchantParamSet set = Newtonsoft.Json.JsonConvert.DeserializeObject<MerchantParamSet>(order.SeoDescription);
- decimal ProfitMoney = PayMoney * (1 - set.DiviPercent) * profitPercent;
- Users user = db.Users.FirstOrDefault(m => m.Id == merchant.UserId);
- if (user != null)
- {
- decimal ProfitAmount = ProfitMoney * makerProfit;
- if (ProfitAmount >= minProfit)
- {
- db.ProfitRecord.Add(new ProfitRecord()
- {
- CreateDate = DateTime.Now,
- UpdateDate = DateTime.Now,
- Remark = "分润奖励",
- UserId = user.Id, //创客
- MerchantId = MerchantId, //商户
- SnNo = order.SnNo, //SN号
- TradeDate = order.CreateDate, //交易日期
- ProfitAmount = ProfitAmount, //分润金额
- BrandId = 1, //品牌
- ParentNav = user.ParentNav, //上级创客集
- TradeId = order.Id, //交易记录Id
- });
- db.SaveChanges();
- }
- }
- Users puser = db.Users.FirstOrDefault(m => m.Id == user.ParentUserId);
- if (puser != null)
- {
- decimal ProfitAmount = ProfitMoney * directProfit;
- if (ProfitAmount >= minProfit)
- {
- db.ProfitRecord.Add(new ProfitRecord()
- {
- CreateDate = DateTime.Now,
- UpdateDate = DateTime.Now,
- Remark = "分润奖励",
- UserId = puser.Id, //创客
- MerchantId = MerchantId, //商户
- SnNo = order.SnNo, //SN号
- TradeDate = order.CreateDate, //交易日期
- ProfitAmount = ProfitAmount, //分润金额
- BrandId = 1, //品牌
- ParentNav = puser.ParentNav, //上级创客集
- TradeId = order.Id, //交易记录Id
- });
- db.SaveChanges();
- }
- }
- string[] areaList = MerAreas.Split(',');
- decimal GetMoneyFlag = 0;
- for (int i = 0; i < areaList.Length; i++)
- {
- string CurAreas = "";
- for (int j = 0; j < areaList.Length - i; j++)
- {
- CurAreas += areaList[j] + ",";
- }
- CurAreas = CurAreas.TrimEnd(',');
- int AgentLevel = CurAreas.Split(',').Length;
- Users areaUser = db.Users.FirstOrDefault(m => m.AgentAreas == CurAreas && m.AgentLevel > AgentLevel);
- if (areaUser != null)
- {
- AgentLevelSet agentset = db.AgentLevelSet.FirstOrDefault(m => m.Id == AgentLevel) ?? new AgentLevelSet();
- decimal ProfitAmount = ProfitMoney * agentset.ProfitPercent;
- if (agentset.LevelDiff == 1)
- {
- ProfitAmount -= GetMoneyFlag;
- }
- if (ProfitAmount >= minProfit)
- {
- db.ProfitRecord.Add(new ProfitRecord()
- {
- CreateDate = DateTime.Now,
- UpdateDate = DateTime.Now,
- Remark = "分润奖励",
- UserId = puser.Id, //创客
- MerchantId = MerchantId, //商户
- SnNo = order.SnNo, //SN号
- TradeDate = order.CreateDate, //交易日期
- ProfitAmount = ProfitAmount, //分润金额
- BrandId = 1, //品牌
- ParentNav = puser.ParentNav, //上级创客集
- TradeId = order.Id, //交易记录Id
- });
- db.SaveChanges();
- GetMoneyFlag = ProfitAmount;
- }
- ProfitAmount = ProfitMoney * agentset.AreasProfitPercent;
- if (ProfitAmount >= minProfit)
- {
- db.ProfitRecord.Add(new ProfitRecord()
- {
- CreateDate = DateTime.Now,
- UpdateDate = DateTime.Now,
- Remark = "分润奖励",
- UserId = puser.Id, //创客
- MerchantId = MerchantId, //商户
- SnNo = order.SnNo, //SN号
- TradeDate = order.CreateDate, //交易日期
- ProfitAmount = ProfitAmount, //分润金额
- BrandId = 1, //品牌
- ParentNav = puser.ParentNav, //上级创客集
- TradeId = order.Id, //交易记录Id
- });
- db.SaveChanges();
- }
- }
- }
- }
- }
- // 收款金额:100
- // 单笔退款金额 = (收款金额*返现比例 - 已返现金额) > (收款金额 - 收款金额*商家实收比例 - 收款金额*(1 - 商家实收比例)*10% - 手续费(收款金额*0.38%) ) / 返现人数 ? (收款金额 - 收款金额*商家实收比例 - 收款金额*(1 - 商家实收比例)*10% - 手续费(收款金额*0.38%)) / 返现人数 : (收款金额*返现比例 - 已返现金额)
- // 分账金额: 收款金额*(1 - 商家实收比例)*10%
- // 代理分润金额: 省:75% 市:65% 区县:55% 创客:30% 直推创客:5%
- // 区域保护分润金额:省:5% 市:5% 区县:5%
- // QE:
- /*
- 条件1(跨区域开发商家):
- A为四川省成都市金牛区代理,B为金牛区创客,C为B推荐的金牛区创客,D为四川省成都市代理,E为四川省代理,F为广东省深圳市南山区代理,G为广东省深圳市代理,H为广东省代理。
- C推荐一个广东省深圳市南山区商家,交易金额1000元。
- 则:
- C可得分润 = 分账金额 * 30%
- B可得直推分润 = 分账金额 * 5%
- A可得分润 = 分账金额 * (55% - 30%)
- G可得分润 = 分账金额 * (65% - 55%)
- H可得分润 = 分账金额 * (75% - 65%)
- F、G、H可再得区域保护分润 = 分账金额 * 5%
-
- 条件2(同区域):
- A为四川省成都市金牛区代理,B为金牛区创客,C为B推荐的金牛区创客,D为四川省成都市代理,E为四川省代理
- C推荐一个四川省成都市金牛区商家,交易金额1000元。
- 则:
- C可得分润 = 分账金额 * 30%
- B可得直推分润 = 分账金额 * 5%
- A可得分润 = 分账金额 * (55% - 30%)
- D可得分润 = 分账金额 * (65% - 55%)
- E可得分润 = 分账金额 * (75% - 65%)
- A、D、E可再得区域保护分润 = 分账金额 * 5%
- 条件3(代理断级):
- B为金牛区创客,C为B推荐的金牛区创客,D为四川省成都市代理,E为四川省代理,F为广东省深圳市南山区代理,G为广东省深圳市代理,H为广东省代理。
- C推荐一个广东省深圳市南山区商家,交易金额1000元。
- 则:
- C可得分润 = 分账金额 * 30%
- B可得直推分润 = 分账金额 * 5%
- D可得分润 = 分账金额 * (65% - 30%)
- H可得分润 = 分账金额 * (75% - 65%)
- F、G、H可再得区域保护分润 = 分账金额 * 5%
- */
- #endregion
- #region 商户队列
- public void StartListenMerchantDo(Dictionary<string, string> data, bool bind = false)
- {
-
- }
- #endregion
- #region 绑定队列
- public void StartListenBindDo(Dictionary<string, string> data)
- {
- }
- #endregion
- #region 待分账队列
- public void StartListenSplitAccount()
- {
- bool op = true;
- while (op)
- {
- try
- {
- string orderidstring = TendisDbconn.Instance.Get<string>("ConsumerOrders:Divi:List");
- if (!string.IsNullOrEmpty(orderidstring))
- {
- int OrderId = int.Parse(function.CheckInt(orderidstring));
- WebCMSEntities db = new WebCMSEntities();
- ConsumerOrders order = db.ConsumerOrders.FirstOrDefault(m => m.Id == OrderId && m.Status == 1);
- if (order != null)
- {
- // TODO:
- }
- db.Dispose();
- }
- else
- {
- op = false;
- }
- }
- catch (Exception ex)
- {
- op = false;
- function.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":" + ex.ToString(), "待分账队列异常");
- }
- }
- }
- #endregion
- #region 分润算法
- public List<ProfitResult> StartProft(WebCMSEntities dbnew, ConsumerOrders trade, int LevelKindId, List<ProfitUsers> users)
- {
- int BrandId = 1;
- decimal TradeMoney = trade.PayMoney;
- int BankCardType = 0; //银行卡类型:贷记卡-0,借记卡-1
- int MerHelpFlag = 0; //扶持期-1,稳定期=0
- List<UserLevelSet> levels = RedisDbconn.Instance.GetList<UserLevelSet>("pobjlevel");
- List<ProfitResult> result = new List<ProfitResult>();
- ProfitObjects obj = RedisDbconn.Instance.Get<ProfitObjects>("pobj" + BrandId);
- if (obj.Status == 1) //判断分润是否开启
- {
- int maxLevel = obj.MaxLevel; //最大等级
- int maxFloor = obj.MaxFloor; //最大层级
- int maxContinueFloor = RedisDbconn.Instance.Get<int>("pobjconc" + BrandId); //最大继续分润层级
- decimal diffLevelProfit = 0; //等级级差
- decimal diffDiviProfit = 0; //分红级差
- int curLevel = 0; //当前层级的会员等级
- for (int curFloor = 1; curFloor <= users.Count; curFloor++)
- {
- ProfitUsers user = new ProfitUsers();
- if (curFloor <= users.Count)
- {
- user = users[curFloor - 1];
- }
- int UserLevel = 1; //user.UserLevel; //当前会员等级
- decimal utrade = BothdisDbconn.Instance.Get<decimal>("TeamTradeStat:" + user.UserId + ":" + BrandId + ":" + DateTime.Now.ToString("yyMM"));
- UserLevelSet checklevel = levels.Where(m => m.UpLevelIntegral < utrade).OrderBy(m => m.Id).FirstOrDefault();
- if (checklevel != null)
- {
- UserLevel = checklevel.Id + 1;
- }
- //判断当前创客是否有直推的激活机具,并且在活动时间内
- if (UserLevel == maxLevel && UserLevel == curLevel)
- {
- break;
- }
- if (UserLevel <= maxLevel && UserLevel > curLevel)
- {
- ProfitObjectLevels objlevel = RedisDbconn.Instance.Get<ProfitObjectLevels>("pobjlv" + LevelKindId + ":" + UserLevel); //获取当前等级参数
- if (objlevel != null)
- {
- decimal getLevelProfit = 0; //等级分润
- UserProfitSet profitSet = new UserProfitSet();
- if (objlevel.Percents > 0)
- {
- //获取创客分润规则,注册日开始算起,3个自然月内算扶持期
- decimal profitrate = 0;
- profitSet = dbnew.UserProfitSet.FirstOrDefault(m => m.UserId == user.UserId && m.BrandId == BrandId && m.CardType == BankCardType && m.HelpFlag == MerHelpFlag) ?? new UserProfitSet(); //获取创客分润规则-扶持期
- profitrate = profitSet.ProfitRate;
- profitrate = profitrate / 100;
- getLevelProfit += TradeMoney * objlevel.Percents * profitrate;
- }
- if (objlevel.AddProfitVal > 0)
- {
- //分红奖励:一个3000万,3000万以下市场总和大于1200万
- bool bigMarket = false;
- decimal smallMarket = 0;
- List<Users> directs = dbnew.Users.Where(m => m.ParentUserId == user.UserId).ToList();
- decimal BigMarketTradeAmt = int.Parse(BothdisDbconn.Instance.Get<string>("pobjrule:" + BrandId + ":Dividends:BigMarketTradeAmt")); //大市场交易额
- decimal PassTradeAmt = int.Parse(BothdisDbconn.Instance.Get<string>("pobjrule:" + BrandId + ":Dividends:PassTradeAmt")); //小市场交易超越额
- decimal UnitPrize = int.Parse(BothdisDbconn.Instance.Get<string>("pobjrule:" + BrandId + ":Dividends:UnitPrize")); //单位奖励基数
- foreach (Users direct in directs)
- {
- UserData userData = dbnew.UserData.FirstOrDefault(m => m.UserId == direct.Id) ?? new UserData();
- if (userData.TotalOrderMoney >= BigMarketTradeAmt)
- {
- bigMarket = true;
- }
- else
- {
- smallMarket += userData.TotalOrderMoney;
- }
- }
- if (bigMarket && smallMarket >= PassTradeAmt)
- {
- decimal DiviPrize = objlevel.AddProfitVal * TradeMoney / UnitPrize;
- decimal checkmoney = DiviPrize;
- DiviPrize -= diffDiviProfit;
- if (objlevel.LevelDiff == 1) //判断是否有级差
- {
- diffDiviProfit = checkmoney;
- }
- if (DiviPrize >= obj.MinProfitVal)
- {
- result.Add(new ProfitResult()
- {
- UserId = user.UserId,
- UserNav = user.UserNav,
- Money = DiviPrize,
- Message = "分红奖励",
- });
- }
- }
- }
- decimal money = getLevelProfit;
- getLevelProfit -= diffLevelProfit;
- if (objlevel.LevelDiff == 1) //判断是否有级差
- {
- diffLevelProfit = money;
- }
- if (getLevelProfit >= obj.MinProfitVal)
- {
- result.Add(new ProfitResult()
- {
- UserId = user.UserId,
- UserNav = user.UserNav,
- Money = getLevelProfit,
- ProfitRate = profitSet.ProfitRate,
- ProfitPercent = profitSet.ProfitPercent,
- AddOrSubRate = profitSet.AddOrSubRate,
- ProfitRateBase = profitSet.ProfitRateBase,
- });
- }
- }
- }
- curLevel = UserLevel;
- }
- }
- return result;
- }
- #endregion
- #region 活动奖励算法
- public List<ProfitResult> StartActiveProft(WebCMSEntities dbnew, PosMachines machine, string CheckObject, int ObjectId, Dictionary<string, ProfitUsers> Users, ActiveCheckData StatParam)
- {
- DateTime Start = machine.ActivationTime.Value;
- List<ProfitResult> result = new List<ProfitResult>();
- ProfitObjects obj = RedisDbconn.Instance.Get<ProfitObjects>("pobj" + ObjectId);
- if (obj.Status == 1) //判断分润是否开启
- {
- List<ProfitObjectsActives> objactives = RedisDbconn.Instance.GetList<ProfitObjectsActives>("pobjact" + ObjectId);
- foreach (ProfitObjectsActives objactive in objactives)
- {
- if (objactive.StartDate <= DateTime.Now && objactive.EndDate >= DateTime.Now)
- {
- string UserKey = "UserId";
- decimal ProfitMoney = objactive.ProfitNumber; //获得数
- decimal FinishNumber = objactive.FinishNumber; //完成数
- string CheckKey = CheckObject + "-" + objactive.Id;
- ProfitObjectsActiveCheck check = dbnew.ProfitObjectsActiveCheck.FirstOrDefault(m => m.CheckData == CheckKey);
- if (ProfitMoney > 0 && check == null)
- {
- int LimitDateKind = objactive.LimitDateKind; //时间限制类型 日月年/自定义
- if (LimitDateKind == 4)
- {
- DateTime LimitCustomerDate = objactive.LimitCustomerDate.Value; //过期时间
- if (LimitCustomerDate >= DateTime.Now)
- {
- decimal totalTradeMoney = 0;
- OtherMySqlConn.connstr = ConfigurationManager.AppSettings["OldSqlConnStr"].ToString();
- string sqlstr = "select sum(" + StatParam.StatField + ") from " + StatParam.TableName + " where Id>=" + StatParam.StartId + " and " + StatParam.CheckField + "='" + CheckObject + "'" + StatParam.OtherCondition + " and CreateDate>='" + Start.ToString("yyyy-MM-dd HH:mm:ss") + "' and CreateDate<='" + LimitCustomerDate.ToString("yyyy-MM-dd HH:mm:ss") + "'";
- DataTable dt = OtherMySqlConn.dtable(sqlstr);
- if (dt.Rows.Count > 0)
- {
- totalTradeMoney = decimal.Parse(function.CheckNum(dt.Rows[0][0].ToString()));
- }
- OtherMySqlConn.connstr = "";
- if (totalTradeMoney >= FinishNumber && ProfitMoney >= obj.MinProfitVal) //达到完成数,发放奖励
- {
- result.Add(new ProfitResult()
- {
- UserId = Users[UserKey].UserId,
- UserNav = Users[UserKey].UserNav,
- Money = ProfitMoney,
- });
- dbnew.ProfitObjectsActiveCheck.Add(new ProfitObjectsActiveCheck()
- {
- CheckData = CheckKey
- });
- dbnew.SaveChanges();
- }
- }
- }
- else
- {
- int LimitDateVal = objactive.LimitDateVal; //时间限制值 日月年
- DateTime checkDate = Start;
- if (LimitDateKind == 1)
- {
- checkDate = checkDate.AddDays(LimitDateVal);
- }
- else if (LimitDateKind == 2)
- {
- checkDate = checkDate.AddMonths(LimitDateVal);
- }
- else if (LimitDateKind == 3)
- {
- checkDate = checkDate.AddYears(LimitDateVal);
- }
- if (checkDate >= DateTime.Now)
- {
- decimal totalTradeMoney = 0;
- OtherMySqlConn.connstr = ConfigurationManager.AppSettings["OldSqlConnStr"].ToString();
- string sql = "select sum(" + StatParam.StatField + ") from " + StatParam.TableName + " where Id>=" + StatParam.StartId + " and " + StatParam.CheckField + "='" + CheckObject + "'" + StatParam.OtherCondition + " and CreateDate>='" + Start.ToString("yyyy-MM-dd HH:mm:ss") + "' and CreateDate<='" + checkDate.ToString("yyyy-MM-dd HH:mm:ss") + "'";
- DataTable dt = OtherMySqlConn.dtable(sql);
- if (dt.Rows.Count > 0)
- {
- totalTradeMoney = decimal.Parse(function.CheckNum(dt.Rows[0][0].ToString()));
- }
- OtherMySqlConn.connstr = "";
- if (totalTradeMoney >= FinishNumber && ProfitMoney >= obj.MinProfitVal) //达到完成数,发放奖励
- {
- result.Add(new ProfitResult()
- {
- UserId = Users[UserKey].UserId,
- UserNav = Users[UserKey].UserNav,
- Money = ProfitMoney,
- });
- dbnew.ProfitObjectsActiveCheck.Add(new ProfitObjectsActiveCheck()
- {
- CheckData = CheckKey
- });
- dbnew.SaveChanges();
- }
- }
- }
- }
- }
- }
- }
- return result;
- }
- #endregion
- #region 激活奖励算法
- public ProfitResult ActivationProft(PosMachines machine, ProfitUsers User)
- {
- int BrandId = machine.BrandId;
- DateTime Start = machine.ActivationTime.Value;
- ProfitResult result = new ProfitResult();
- if (machine.PosSnType == 1 && machine.UserId != machine.BuyUserId) //赠送机具,划拨给其他人,没有激活返现没有循环
- {
- return result;
- }
- ProfitObjects obj = RedisDbconn.Instance.Get<ProfitObjects>("pobj" + BrandId);
- if (obj.Status == 1) //判断分润是否开启
- {
- ProfitObjectActivations objact = RedisDbconn.Instance.Get<ProfitObjectActivations>("pobjacti" + BrandId);
- if (objact.StartDate <= DateTime.Now && objact.EndDate >= DateTime.Now)
- {
- int LimitDateKind = objact.LimitDateKind; //时间限制类型 日月年/自定义
- int LimitDateVal = objact.LimitDateVal; //时间限制值 日月年
- decimal ProfitMoney = objact.ProfitNumber;
- int MachineCount = objact.MachineCount;
- DateTime checkDate = Start;
- if (LimitDateKind == 1)
- {
- checkDate = checkDate.AddDays(LimitDateVal);
- }
- else if (LimitDateKind == 2)
- {
- checkDate = checkDate.AddMonths(LimitDateVal);
- }
- else if (LimitDateKind == 3)
- {
- checkDate = checkDate.AddYears(LimitDateVal);
- }
- else if (LimitDateKind == 4)
- {
- checkDate = objact.LimitCustomerDate.Value;
- }
- // if (DateTime.Now > checkDate && ProfitMoney > objact.ExpiredNumber)
- // {
- // ProfitMoney = objact.ExpiredNumber;
- // }
- if (ProfitMoney >= obj.MinProfitVal)
- {
- result = new ProfitResult()
- {
- UserId = User.UserId,
- UserNav = User.UserNav,
- Money = ProfitMoney,
- MachineCount = MachineCount,
- };
- }
- }
- }
- return result;
- }
- #endregion
- #region 获取分润规则Id
- private int GetLevelKindId(int BrandId)
- {
- return RedisDbconn.Instance.Get<int>("pobjlv:kid:" + BrandId);
- }
- #endregion
-
- }
- }
|