ProfitCheckHelper.cs 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Data;
  5. using MySystem.PxcModels;
  6. using Library;
  7. using LitJson;
  8. namespace MySystem
  9. {
  10. public class ProfitCheckHelper
  11. {
  12. public readonly static ProfitCheckHelper Instance = new ProfitCheckHelper();
  13. private ProfitCheckHelper()
  14. { }
  15. public void Start()
  16. {
  17. try
  18. {
  19. function.WriteLog("导出分润:" + DateTime.Now.ToString(), "分润结果检查");
  20. ExportProfitData(); //导出分润
  21. // function.WriteLog("导出补贴:" + DateTime.Now.ToString(), "分润结果检查");
  22. // ExportSubsidyData(); //导出补贴
  23. // function.WriteLog("检查分润:" + DateTime.Now.ToString(), "分润结果检查");
  24. // CheckProfit(); //检查分润
  25. // function.WriteLog("检查补贴:" + DateTime.Now.ToString(), "分润结果检查");
  26. // CheckSubsidy(); //检查补贴
  27. function.WriteLog("结束:" + DateTime.Now.ToString(), "分润结果检查");
  28. }
  29. catch (Exception ex)
  30. {
  31. function.WriteLog(DateTime.Now.ToString() + ":" + ex.ToString(), "分润结果检查异常");
  32. }
  33. }
  34. public void ExportProfitData()
  35. {
  36. string Month = DateTime.Now.AddMonths(-1).ToString("yyyyMM");
  37. WebCMSEntities db = new WebCMSEntities();
  38. // string StartId = function.CheckInt(function.ReadInstance("/PublicParam/ProfitRewardRecordId/" + Month + ".txt"));
  39. OtherMySqlConn.connstr = Library.ConfigurationManager.AppSettings["ReadSqlConnStr"].ToString();
  40. string sql = "select tb.MakerCode,tb.RealName,tb.UserLevel,tu.MakerCode tMakerCode,tu.RealName tRealName,Rank,LeaderRank,OpRank,DirectFlag,Name,BrandId,CreditTradeAmt,CreditTradeProfit,QrCreditTradeAmt,QrCreditTradeProfit,NonQrCreditTradeAmt,NonQrCreditTradeProfit,HelpCreditTradeAmt,HelpCreditTradeProfit,NotHelpCreditTradeAmt,NotHelpCreditTradeProfit,ProfitCreditTradeAmt,ProfitCreditTradeProfit,ProfitCreditTradeAmt2,ProfitCreditTradeProfit2,DebitTradeAmt,DebitTradeProfit from (select u.MakerCode,u.RealName,u.UserLevel,SUBSTRING_INDEX(SUBSTRING_INDEX(u.ParentNav,',',4),',',-1) as TopUserId,r.Rank,r1.Rank LeaderRank,r2.Rank OpRank,(case when ProfitType=1 then '直营' else '团队' end) as DirectFlag,k.Name,BrandId,CreditTradeAmt,CreditTradeProfit,QrCreditTradeAmt,QrCreditTradeProfit,NonQrCreditTradeAmt,NonQrCreditTradeProfit,HelpCreditTradeAmt,HelpCreditTradeProfit,NotHelpCreditTradeAmt,NotHelpCreditTradeProfit,ProfitCreditTradeAmt,ProfitCreditTradeProfit,ProfitCreditTradeAmt2,ProfitCreditTradeProfit2,DebitTradeAmt,DebitTradeProfit from (select UserId,ProfitType,BrandId,sum(CreditTradeAmt) as CreditTradeAmt,sum(CreditTradeProfit) as CreditTradeProfit,sum(QrCreditTradeAmt) as QrCreditTradeAmt,sum(QrCreditTradeProfit) as QrCreditTradeProfit,sum(NonQrCreditTradeAmt) as NonQrCreditTradeAmt,sum(NonQrCreditTradeProfit) as NonQrCreditTradeProfit,sum(HelpCreditTradeAmt) as HelpCreditTradeAmt,sum(HelpCreditTradeProfit) as HelpCreditTradeProfit,sum(NotHelpCreditTradeAmt) as NotHelpCreditTradeAmt,sum(NotHelpCreditTradeProfit) as NotHelpCreditTradeProfit,sum(ProfitCreditTradeAmt) as ProfitCreditTradeAmt,sum(ProfitCreditTradeProfit) as ProfitCreditTradeProfit,sum(ProfitCreditTradeAmt2) as ProfitCreditTradeAmt2,sum(ProfitCreditTradeProfit2) as ProfitCreditTradeProfit2,sum(DebitNonCapTradeAmt+DebitCapTradeAmt) as DebitTradeAmt,sum(DebitNonTradeCapProfit+DebitTradeCapProfit) as DebitTradeProfit from ProfitRewardRecord where TradeMonth='" + Month + "' GROUP BY UserId,ProfitType,BrandId) tb left join Users u on tb.UserId=u.Id LEFT JOIN KqProducts k ON k.Id=tb.BrandId left join UserRankWhite r on u.Id=r.Id and r.CreateDate<'" + DateTime.Now.ToString("yyyy-MM") + "-01 00:00:00' and r.UpdateDate>'" + DateTime.Now.ToString("yyyy-MM") + "-01 00:00:00' left join LeaderRankWhite r1 on u.Id=r1.Id and r1.CreateDate<'" + DateTime.Now.ToString("yyyy-MM") + "-01 00:00:00' and r1.UpdateDate>'" + DateTime.Now.ToString("yyyy-MM") + "-01 00:00:00' left join OperatorRankWhite r2 on u.Id=r2.Id and r2.CreateDate<'" + DateTime.Now.ToString("yyyy-MM") + "-01 00:00:00' and r2.UpdateDate>'" + DateTime.Now.ToString("yyyy-MM") + "-01 00:00:00' ORDER BY u.MakerCode) tb left join Users tu on tb.TopUserId=tu.Id";
  41. DataTable dt = OtherMySqlConn.dtable(sql);
  42. function.WriteLog(DateTime.Now.ToString() + ":" + dt.Rows.Count, "分润结果检查");
  43. int index = 0;
  44. foreach(DataRow dr in dt.Rows)
  45. {
  46. index += 1;
  47. string MakerCode = dr["MakerCode"].ToString();
  48. string RealName = dr["RealName"].ToString();
  49. string tMakerCode = dr["tMakerCode"].ToString();
  50. string tRealName = dr["tRealName"].ToString();
  51. int UserLevel = int.Parse(function.CheckInt(dr["UserLevel"].ToString()));
  52. int Rank = int.Parse(function.CheckInt(dr["Rank"].ToString()));
  53. int LeaderRank = int.Parse(function.CheckInt(dr["LeaderRank"].ToString()));
  54. if(LeaderRank > Rank) Rank = LeaderRank;
  55. int OpRank = int.Parse(function.CheckInt(dr["OpRank"].ToString()));
  56. if(OpRank > Rank) Rank = OpRank;
  57. string DirectFlag = dr["DirectFlag"].ToString();
  58. string BrandName = dr["Name"].ToString();
  59. int BrandId = int.Parse(function.CheckInt(dr["BrandId"].ToString()));
  60. decimal CreditTradeAmt = decimal.Parse(function.CheckNum(dr["CreditTradeAmt"].ToString()));
  61. decimal CreditTradeProfit = decimal.Parse(function.CheckNum(dr["CreditTradeProfit"].ToString()));
  62. decimal QrCreditTradeAmt = decimal.Parse(function.CheckNum(dr["QrCreditTradeAmt"].ToString()));
  63. decimal QrCreditTradeProfit = decimal.Parse(function.CheckNum(dr["QrCreditTradeProfit"].ToString()));
  64. decimal NonQrCreditTradeAmt = decimal.Parse(function.CheckNum(dr["NonQrCreditTradeAmt"].ToString()));
  65. decimal NonQrCreditTradeProfit = decimal.Parse(function.CheckNum(dr["NonQrCreditTradeProfit"].ToString()));
  66. decimal HelpCreditTradeAmt = decimal.Parse(function.CheckNum(dr["HelpCreditTradeAmt"].ToString()));
  67. decimal HelpCreditTradeProfit = decimal.Parse(function.CheckNum(dr["HelpCreditTradeProfit"].ToString()));
  68. decimal NotHelpCreditTradeAmt = decimal.Parse(function.CheckNum(dr["NotHelpCreditTradeAmt"].ToString()));
  69. decimal NotHelpCreditTradeProfit = decimal.Parse(function.CheckNum(dr["NotHelpCreditTradeProfit"].ToString()));
  70. decimal ProfitCreditTradeAmt = decimal.Parse(function.CheckNum(dr["ProfitCreditTradeAmt"].ToString()));
  71. decimal ProfitCreditTradeProfit = decimal.Parse(function.CheckNum(dr["ProfitCreditTradeProfit"].ToString()));
  72. decimal ProfitCreditTradeAmt2 = decimal.Parse(function.CheckNum(dr["ProfitCreditTradeAmt2"].ToString()));
  73. decimal ProfitCreditTradeProfit2 = decimal.Parse(function.CheckNum(dr["ProfitCreditTradeProfit2"].ToString()));
  74. decimal DebitTradeAmt = decimal.Parse(function.CheckNum(dr["DebitTradeAmt"].ToString()));
  75. decimal DebitTradeProfit = decimal.Parse(function.CheckNum(dr["DebitTradeProfit"].ToString()));
  76. db.ProfitRewardExport.Add(new ProfitRewardExport()
  77. {
  78. CreateDate = DateTime.Now,
  79. Sort = BrandId,
  80. SeoTitle = Month,
  81. MakerCode = MakerCode,
  82. RealName = RealName,
  83. SeoKeyword = tMakerCode,
  84. SeoDescription = tRealName,
  85. UserLevel = UserLevel,
  86. Rank = Rank,
  87. DirectFlag = DirectFlag,
  88. BrandName = BrandName,
  89. CreditTradeAmt = CreditTradeAmt,
  90. CreditTradeProfit = CreditTradeProfit,
  91. QrCreditTradeAmt = QrCreditTradeAmt,
  92. QrCreditTradeProfit = QrCreditTradeProfit,
  93. NonQrCreditTradeAmt = NonQrCreditTradeAmt,
  94. NonQrCreditTradeProfit = NonQrCreditTradeProfit,
  95. HelpCreditTradeAmt = HelpCreditTradeAmt,
  96. HelpCreditTradeProfit = HelpCreditTradeProfit,
  97. NotHelpCreditTradeAmt = NotHelpCreditTradeAmt,
  98. NotHelpCreditTradeProfit = NotHelpCreditTradeProfit,
  99. ProfitCreditTradeAmt = ProfitCreditTradeAmt,
  100. ProfitCreditTradeProfit = ProfitCreditTradeProfit,
  101. ProfitCreditTradeAmt2 = ProfitCreditTradeAmt2,
  102. ProfitCreditTradeProfit2 = ProfitCreditTradeProfit2,
  103. DebitTradeAmt = DebitTradeAmt,
  104. DebitTradeProfit = DebitTradeProfit,
  105. });
  106. if(index % 200 == 0)
  107. {
  108. db.SaveChanges();
  109. }
  110. function.WriteLog(DateTime.Now.ToString() + ":" + index, "分润结果检查");
  111. }
  112. db.SaveChanges();
  113. db.Dispose();
  114. }
  115. public void ExportSubsidyData()
  116. {
  117. string Month = DateTime.Now.AddMonths(-1).ToString("yyyyMM");
  118. WebCMSEntities db = new WebCMSEntities();
  119. string StartId = function.CheckInt(function.ReadInstance("/PublicParam/ProfitSubsidyDetailId/" + Month + ".txt"));
  120. OtherMySqlConn.connstr = Library.ConfigurationManager.AppSettings["ReadSqlConnStr"].ToString();
  121. DataTable dt = OtherMySqlConn.dtable("select u.MakerCode,u.RealName,u.UserLevel,r.Rank,m.KqSnNo,m.MerchantName,(case when SubsidyType=1 then '直营' else '团队' end) as DirectFlag,k.Name,tb.BrandId,CreditTradeAmt,SubsidyProfit from (select SubsidyUserId,MerchantId,BrandId,SubsidyType,sum(CreditTradeAmt) as CreditTradeAmt,sum(SubsidyProfitRate) as SubsidyProfit from ProfitSubsidyDetail where Id>=" + StartId + " and TradeMonth='" + Month + "' GROUP BY SubsidyUserId,MerchantId,BrandId,SubsidyType) tb left join Users u on tb.SubsidyUserId=u.Id LEFT JOIN KqProducts k ON k.Id=tb.BrandId left join PosMerchantInfo m on tb.MerchantId=m.Id left join UserRankWhite r on u.Id=r.Id and r.CreateDate<'" + DateTime.Now.ToString("yyyy-MM") + "-01 00:00:00' and r.UpdateDate>'" + DateTime.Now.ToString("yyyy-MM") + "-01 00:00:00'");
  122. function.WriteLog(DateTime.Now.ToString() + ":" + dt.Rows.Count, "分润结果检查");
  123. int index = 0;
  124. foreach(DataRow dr in dt.Rows)
  125. {
  126. index += 1;
  127. string MakerCode = dr["MakerCode"].ToString();
  128. string RealName = dr["RealName"].ToString();
  129. int UserLevel = int.Parse(function.CheckInt(dr["UserLevel"].ToString()));
  130. int Rank = int.Parse(function.CheckInt(dr["Rank"].ToString()));
  131. string KqSnNo = dr["KqSnNo"].ToString();
  132. string MerchantName = dr["MerchantName"].ToString();
  133. string DirectFlag = dr["DirectFlag"].ToString();
  134. string BrandName = dr["Name"].ToString();
  135. int BrandId = int.Parse(function.CheckInt(dr["BrandId"].ToString()));
  136. decimal CreditTradeAmt = decimal.Parse(function.CheckNum(dr["CreditTradeAmt"].ToString()));
  137. decimal SubsidyProfit = decimal.Parse(function.CheckNum(dr["SubsidyProfit"].ToString()));
  138. db.ProfitSubsidyExport.Add(new ProfitSubsidyExport()
  139. {
  140. CreateDate = DateTime.Now,
  141. Sort = BrandId,
  142. SeoTitle = Month,
  143. MakerCode = MakerCode,
  144. RealName = RealName,
  145. UserLevel = UserLevel,
  146. Rank = Rank,
  147. KqSnNo = KqSnNo,
  148. MerchantName = MerchantName,
  149. DirectFlag = DirectFlag,
  150. BrandName = BrandName,
  151. CreditTradeAmt = CreditTradeAmt,
  152. SubsidyProfit = SubsidyProfit,
  153. });
  154. if(index % 200 == 0)
  155. {
  156. db.SaveChanges();
  157. }
  158. function.WriteLog(DateTime.Now.ToString() + ":" + index, "分润结果检查");
  159. }
  160. db.SaveChanges();
  161. db.Dispose();
  162. }
  163. public void CheckProfit()
  164. {
  165. DateTime now = DateTime.Now;
  166. string Month = DateTime.Now.AddMonths(-1).ToString("yyyyMM");
  167. WebCMSEntities db = new WebCMSEntities();
  168. bool checkOp = true;
  169. int StartId = 0;
  170. while(checkOp)
  171. {
  172. List<int> ids = new List<int>();
  173. List<ProfitRewardExport> list = db.ProfitRewardExport.Where(m => m.SeoTitle == Month && m.Id > StartId && m.Status == 0).OrderBy(m => m.MakerCode).ThenBy(m => m.DirectFlag).ThenBy(m => m.BrandName).ThenBy(m => m.Id).Take(50).ToList();
  174. function.WriteLog(DateTime.Now.ToString() + ":" + list.Count, "分润结果检查");
  175. if(list.Count > 0)
  176. {
  177. int index = 0;
  178. foreach(ProfitRewardExport sub in list)
  179. {
  180. index += 1;
  181. int BrandId = sub.Sort;
  182. string MakerCode = sub.MakerCode;
  183. decimal TotalProfit = 0;
  184. UserForMakerCode userForMakerCode = db.UserForMakerCode.FirstOrDefault(m => m.MakerCode == MakerCode) ?? new UserForMakerCode();
  185. int UserId = userForMakerCode.UserId;
  186. Users user = db.Users.FirstOrDefault(m => m.Id == UserId);
  187. if(user == null)
  188. {
  189. user = db.Users.FirstOrDefault(m => m.MakerCode == MakerCode) ?? new Users();
  190. UserId = user.Id;
  191. }
  192. string LogString = function.ReadInstance("/ProfitDetailLog/" + Month + "/" + UserId + ".txt");
  193. LogString += "创客编号:" + user.MakerCode + ",创客名称:" + user.RealName + "\n";
  194. int UserLevel = GetLevel(db, UserId, user.UserLevel);
  195. LogString += "创客职级:K" + UserLevel + "\n";
  196. LogString += "分润类型:" + sub.DirectFlag + "\n";
  197. LogString += "分润品牌:" + sub.BrandName + "\n";
  198. if(sub.DirectFlag == "直营")
  199. {
  200. decimal HelpTradeAmt = 0;
  201. decimal NotHelpTradeAmt = 0;
  202. decimal ProfitTradeAmt = 0;
  203. decimal HelpProfit = 0;
  204. decimal NotHelpProfit = 0;
  205. decimal ProfitProfit = 0;
  206. bool check = db.TradeDaySummary.Any(m => m.UserId == user.Id && m.TradeMonth == Month && m.BrandId == BrandId && m.SeoTitle == "self" && m.HelpDirectTradeAmt > 0);
  207. if(check)
  208. {
  209. HelpTradeAmt = db.TradeDaySummary.Where(m => m.UserId == user.Id && m.TradeMonth == Month && m.BrandId == BrandId && m.SeoTitle == "self").Sum(m => m.HelpDirectTradeAmt);
  210. }
  211. LogString += "扶持期交易额:" + HelpTradeAmt + "\n";
  212. check = db.TradeDaySummary.Any(m => m.UserId == user.Id && m.TradeMonth == Month && m.BrandId == BrandId && m.SeoTitle == "self" && m.NotHelpDirectTradeAmt > 0);
  213. if(check)
  214. {
  215. NotHelpTradeAmt = db.TradeDaySummary.Where(m => m.UserId == user.Id && m.TradeMonth == Month && m.BrandId == BrandId && m.SeoTitle == "self").Sum(m => m.NotHelpDirectTradeAmt);
  216. }
  217. LogString += "稳定期交易额:" + NotHelpTradeAmt + "\n";
  218. check = db.TradeDaySummary.Any(m => m.UserId == user.Id && m.TradeMonth == Month && m.BrandId == BrandId && m.SeoTitle == "self" && m.ProfitDirectTradeAmt > 0);
  219. if(check)
  220. {
  221. ProfitTradeAmt = db.TradeDaySummary.Where(m => m.UserId == user.Id && m.TradeMonth == Month && m.BrandId == BrandId && m.SeoTitle == "self").Sum(m => m.ProfitDirectTradeAmt);
  222. }
  223. LogString += "盈利期交易额:" + ProfitTradeAmt + "\n";
  224. if(HelpTradeAmt > 0)
  225. {
  226. decimal percent = GetLevelProfit(BrandId, UserLevel, 1);
  227. HelpProfit = HelpTradeAmt * percent;
  228. LogString += "扶持期分润:" + HelpTradeAmt + " * " + percent + " = " + HelpProfit + "\n";
  229. }
  230. if(NotHelpTradeAmt > 0)
  231. {
  232. decimal percent = GetLevelProfit(BrandId, UserLevel, 0);
  233. NotHelpProfit = NotHelpTradeAmt * percent;
  234. LogString += "稳定期分润:" + NotHelpTradeAmt + " * " + percent + " = " + NotHelpProfit + "\n";
  235. }
  236. if(ProfitTradeAmt > 0)
  237. {
  238. decimal percent = GetLevelProfit(BrandId, UserLevel, 2);
  239. ProfitProfit = ProfitTradeAmt * percent;
  240. LogString += "盈利期分润:" + ProfitTradeAmt + " * " + percent + " = " + ProfitProfit + "\n";
  241. }
  242. TotalProfit += HelpProfit + NotHelpProfit + ProfitProfit;
  243. LogString += "总分润:" + TotalProfit + "\n";
  244. }
  245. else
  246. {
  247. var subusers = db.Users.Select(m => new { m.Id, m.ParentUserId, m.AuthFlag }).Where(m => m.ParentUserId == UserId && m.AuthFlag == 1).ToList();
  248. LogString += "直推人数:" + subusers.Count + "\n";
  249. foreach(var subuser in subusers)
  250. {
  251. Users suser = db.Users.FirstOrDefault(m => m.Id == subuser.Id) ?? new Users();
  252. LogString += "直推创客编号:" + suser.MakerCode + ",直推创客名称:" + suser.RealName + "\n";
  253. int sUserLevel = GetLevel(db, subuser.Id, suser.UserLevel);
  254. LogString += "直推创客职级:K" + sUserLevel + "\n";
  255. if(sUserLevel < UserLevel)
  256. {
  257. decimal HelpTradeAmt = 0;
  258. decimal NotHelpTradeAmt = 0;
  259. decimal ProfitTradeAmt = 0;
  260. decimal HelpProfit = 0;
  261. decimal NotHelpProfit = 0;
  262. decimal ProfitProfit = 0;
  263. bool check = db.TradeDaySummary.Any(m => m.UserId == subuser.Id && m.TradeMonth == Month && m.BrandId == BrandId && m.SeoTitle == "team" && m.HelpNonDirectTradeAmt > 0);
  264. if(check)
  265. {
  266. HelpTradeAmt = db.TradeDaySummary.Where(m => m.UserId == subuser.Id && m.TradeMonth == Month && m.BrandId == BrandId && m.SeoTitle == "team").Sum(m => m.HelpNonDirectTradeAmt);
  267. }
  268. LogString += "扶持期交易额:" + HelpTradeAmt + "\n";
  269. check = db.TradeDaySummary.Any(m => m.UserId == subuser.Id && m.TradeMonth == Month && m.BrandId == BrandId && m.SeoTitle == "team" && m.NotHelpNonDirectTradeAmt > 0);
  270. if(check)
  271. {
  272. NotHelpTradeAmt = db.TradeDaySummary.Where(m => m.UserId == subuser.Id && m.TradeMonth == Month && m.BrandId == BrandId && m.SeoTitle == "team").Sum(m => m.NotHelpNonDirectTradeAmt);
  273. }
  274. LogString += "稳定期交易额:" + NotHelpTradeAmt + "\n";
  275. check = db.TradeDaySummary.Any(m => m.UserId == subuser.Id && m.TradeMonth == Month && m.BrandId == BrandId && m.SeoTitle == "team" && m.ProfitNonDirectTradeAmt > 0);
  276. if(check)
  277. {
  278. ProfitTradeAmt = db.TradeDaySummary.Where(m => m.UserId == subuser.Id && m.TradeMonth == Month && m.BrandId == BrandId && m.SeoTitle == "team").Sum(m => m.ProfitNonDirectTradeAmt);
  279. }
  280. LogString += "盈利期交易额:" + ProfitTradeAmt + "\n";
  281. string UserIdString = "," + subuser.Id + ",";
  282. List<Users> busers = db.Users.Where(m => m.ParentNav.Contains(UserIdString) && m.AuthFlag == 1).ToList();
  283. List<ProfitUsers> busernavs = new List<ProfitUsers>();
  284. foreach (var buser in busers)
  285. {
  286. int bUserLevel = GetLevel(db, buser.Id, buser.UserLevel);
  287. if(bUserLevel >= UserLevel)
  288. {
  289. busernavs.Add(new ProfitUsers()
  290. {
  291. UserId = buser.Id,
  292. UserLevel = bUserLevel,
  293. UserNav = buser.ParentNav,
  294. MakerCode = buser.MakerCode,
  295. RealName = buser.RealName,
  296. });
  297. }
  298. if(bUserLevel > sUserLevel)
  299. {
  300. sUserLevel = bUserLevel;
  301. }
  302. }
  303. string LogHelpTradeAmt = HelpTradeAmt.ToString();
  304. string LogNotHelpTradeAmt = NotHelpTradeAmt.ToString();
  305. string LogProfitTradeAmt = ProfitTradeAmt.ToString();
  306. if(busernavs.Count > 0)
  307. {
  308. LogString += "团队中等级超过K" + UserLevel + ":\n";
  309. LogString += "..................\n";
  310. List<string> ParentNavs = new List<string>();
  311. busernavs = busernavs.OrderBy(m => m.UserNav).ToList();
  312. foreach(ProfitUsers busernav in busernavs)
  313. {
  314. bool op = true; //是否满足条件
  315. string ParentNav = busernav.UserNav + "," + busernav.UserId + ",";
  316. foreach (string subNav in ParentNavs)
  317. {
  318. if (ParentNav.StartsWith(subNav) && ParentNav != subNav)
  319. {
  320. op = false;
  321. }
  322. }
  323. if(op)
  324. {
  325. bool OtherCheck = db.TradeDaySummary.Any(m => m.UserId == busernav.UserId && m.TradeMonth == Month && m.BrandId == BrandId && m.SeoTitle == "team" && m.HelpNonDirectTradeAmt > 0);
  326. decimal OtherHelpTradeAmt = 0;
  327. decimal OtherNotHelpTradeAmt = 0;
  328. decimal OtherProfitTradeAmt = 0;
  329. if(OtherCheck)
  330. {
  331. OtherHelpTradeAmt = db.TradeDaySummary.Where(m => m.UserId == busernav.UserId && m.TradeMonth == Month && m.BrandId == BrandId && m.SeoTitle == "team").Sum(m => m.HelpNonDirectTradeAmt);
  332. }
  333. OtherCheck = db.TradeDaySummary.Any(m => m.UserId == busernav.UserId && m.TradeMonth == Month && m.BrandId == BrandId && m.SeoTitle == "team" && m.NotHelpNonDirectTradeAmt > 0);
  334. if(OtherCheck)
  335. {
  336. OtherNotHelpTradeAmt = db.TradeDaySummary.Where(m => m.UserId == busernav.UserId && m.TradeMonth == Month && m.BrandId == BrandId && m.SeoTitle == "team").Sum(m => m.NotHelpNonDirectTradeAmt);
  337. }
  338. OtherCheck = db.TradeDaySummary.Any(m => m.UserId == busernav.UserId && m.TradeMonth == Month && m.BrandId == BrandId && m.SeoTitle == "team" && m.ProfitNonDirectTradeAmt > 0);
  339. if(OtherCheck)
  340. {
  341. OtherProfitTradeAmt = db.TradeDaySummary.Where(m => m.UserId == busernav.UserId && m.TradeMonth == Month && m.BrandId == BrandId && m.SeoTitle == "team").Sum(m => m.ProfitNonDirectTradeAmt);
  342. }
  343. HelpTradeAmt -= OtherHelpTradeAmt;
  344. NotHelpTradeAmt -= OtherNotHelpTradeAmt;
  345. ProfitTradeAmt -= OtherProfitTradeAmt;
  346. LogString += "\n----创客编号:" + busernav.MakerCode + ",创客名称:" + busernav.RealName + "\n";
  347. LogString += "----创客职级:" + busernav.UserLevel + "\n";
  348. LogString += "----扶持期交易额:" + OtherHelpTradeAmt + "\n";
  349. LogString += "----稳定期交易额:" + OtherNotHelpTradeAmt + "\n";
  350. LogString += "----盈利期交易额:" + OtherProfitTradeAmt + "\n";
  351. if(OtherHelpTradeAmt > 0)
  352. {
  353. LogHelpTradeAmt += " - " + OtherHelpTradeAmt;
  354. }
  355. if(OtherNotHelpTradeAmt > 0)
  356. {
  357. LogNotHelpTradeAmt += " - " + OtherNotHelpTradeAmt;
  358. }
  359. if(OtherProfitTradeAmt > 0)
  360. {
  361. LogProfitTradeAmt += " - " + OtherProfitTradeAmt;
  362. }
  363. }
  364. ParentNavs.Add(ParentNav);
  365. }
  366. }
  367. if(HelpTradeAmt > 0)
  368. {
  369. decimal parentpercent = GetLevelProfit(BrandId, UserLevel, 1);
  370. decimal percent = GetLevelProfit(BrandId, sUserLevel, 1);
  371. HelpProfit = HelpTradeAmt * (parentpercent - percent);
  372. if(LogHelpTradeAmt.Contains("-"))
  373. {
  374. LogHelpTradeAmt = "(" + LogHelpTradeAmt + ")";
  375. }
  376. LogString += "扶持期分润:" + LogHelpTradeAmt + " * (" + parentpercent + " - " + percent + ") = " + HelpProfit + "\n";
  377. }
  378. if(NotHelpTradeAmt > 0)
  379. {
  380. decimal parentpercent = GetLevelProfit(BrandId, UserLevel, 0);
  381. decimal percent = GetLevelProfit(BrandId, sUserLevel, 0);
  382. if(LogNotHelpTradeAmt.Contains("-"))
  383. {
  384. LogNotHelpTradeAmt = "(" + LogNotHelpTradeAmt + ")";
  385. }
  386. NotHelpProfit = NotHelpTradeAmt * (parentpercent - percent);
  387. LogString += "稳定期分润:" + LogNotHelpTradeAmt + " * (" + parentpercent + " - " + percent + ") = " + NotHelpProfit + "\n";
  388. }
  389. if(ProfitTradeAmt > 0)
  390. {
  391. decimal parentpercent = GetLevelProfit(BrandId, UserLevel, 2);
  392. decimal percent = GetLevelProfit(BrandId, sUserLevel, 2);
  393. if(LogProfitTradeAmt.Contains("-"))
  394. {
  395. LogProfitTradeAmt = "(" + LogProfitTradeAmt + ")";
  396. }
  397. ProfitProfit = ProfitTradeAmt * (parentpercent - percent);
  398. LogString += "盈利期分润:" + LogProfitTradeAmt + " * (" + parentpercent + " - " + percent + ") = " + ProfitProfit + "\n";
  399. }
  400. decimal SubTotalProfit = HelpProfit + NotHelpProfit + ProfitProfit;
  401. TotalProfit += SubTotalProfit;
  402. LogString += "总分润:" + SubTotalProfit + "\n";
  403. }
  404. LogString += "--------------------------------------------------------------\n";
  405. }
  406. }
  407. decimal CheckProfit = sub.CreditTradeProfit - TotalProfit;
  408. string Result = "通过";
  409. if(Math.Abs(CheckProfit) > 10)
  410. {
  411. Result = "分润有误";
  412. }
  413. LogString += "系统分润:" + sub.CreditTradeProfit + "\n";
  414. LogString += "核对分润:" + TotalProfit + "\n";
  415. LogString += "核对结果:" + Result + "\n";
  416. LogString += "===================================================================================\n\n\n";
  417. function.WritePage("/ProfitDetailLog/" + Month + "/", UserId + ".txt", LogString);
  418. ProfitRewardExport edit = db.ProfitRewardExport.FirstOrDefault(m => m.Id == sub.Id);
  419. if(edit != null)
  420. {
  421. edit.SeoKeyword = TotalProfit.ToString();
  422. edit.SeoDescription = Result;
  423. edit.Status = 1;
  424. db.SaveChanges();
  425. }
  426. StartId = sub.Id;
  427. function.WriteLog(DateTime.Now.ToString() + "-" + index, "分润结果检查");
  428. }
  429. }
  430. else
  431. {
  432. checkOp = false;
  433. }
  434. }
  435. db.Dispose();
  436. }
  437. public void CheckSubsidy()
  438. {
  439. DateTime now = DateTime.Now;
  440. string Month = DateTime.Now.AddMonths(-1).ToString("yyyyMM");
  441. WebCMSEntities db = new WebCMSEntities();
  442. bool op = true;
  443. int StartId = 0;
  444. while(op)
  445. {
  446. List<ProfitSubsidyExport> list = db.ProfitSubsidyExport.Where(m => m.SeoTitle == Month && m.Id > StartId).OrderBy(m => m.Id).Take(50).ToList();
  447. if(list.Count > 0)
  448. {
  449. foreach(ProfitSubsidyExport sub in list)
  450. {
  451. int BrandId = sub.Sort;
  452. string MakerCode = sub.MakerCode;
  453. UserForMakerCode userForMakerCode = db.UserForMakerCode.FirstOrDefault(m => m.MakerCode == MakerCode) ?? new UserForMakerCode();
  454. int UserId = userForMakerCode.UserId;
  455. Users user = db.Users.FirstOrDefault(m => m.Id == UserId);
  456. if(user == null)
  457. {
  458. user = db.Users.FirstOrDefault(m => m.MakerCode == MakerCode) ?? new Users();
  459. UserId = user.Id;
  460. }
  461. MachineForSnNo machineForSn = db.MachineForSnNo.FirstOrDefault(m => m.SnNo == sub.KqSnNo) ?? new MachineForSnNo();
  462. PosMachinesTwo machine = db.PosMachinesTwo.FirstOrDefault(m => m.Id == machineForSn.SnId) ?? new PosMachinesTwo();
  463. int UserLevel = GetLevel(db, UserId, user.UserLevel);
  464. decimal HelpTradeAmt = 0;
  465. bool check = db.PosMerchantTradeSummay.Any(m => m.MerchantId == machine.BindMerchantId && m.TradeMonth == Month && m.BrandId == BrandId && m.TradeAmount > 0);
  466. if(check)
  467. {
  468. HelpTradeAmt = db.PosMerchantTradeSummay.Where(m => m.MerchantId == machine.BindMerchantId && m.TradeMonth == Month && m.BrandId == BrandId).Sum(m => m.TradeAmount);
  469. }
  470. decimal percent = GetLevelProfit(BrandId, UserLevel, 1);
  471. decimal HelpProfit = (0.001M - percent) * HelpTradeAmt;
  472. decimal CheckProfit = sub.SubsidyProfit - HelpProfit;
  473. string Result = "通过";
  474. if(Math.Abs(CheckProfit) > 0.01M)
  475. {
  476. Result = "补贴有误";
  477. }
  478. ProfitSubsidyExport edit = db.ProfitSubsidyExport.FirstOrDefault(m => m.Id == sub.Id);
  479. if(edit != null)
  480. {
  481. edit.SeoKeyword = HelpProfit.ToString();
  482. edit.SeoDescription = Result;
  483. edit.Status = 1;
  484. db.SaveChanges();
  485. }
  486. StartId = sub.Id;
  487. }
  488. }
  489. else
  490. {
  491. op = false;
  492. }
  493. }
  494. db.Dispose();
  495. }
  496. //获取创客当前等级
  497. private int GetLevel(WebCMSEntities db, int UserId, int UserLevel)
  498. {
  499. DateTime now = DateTime.Now;
  500. DateTime ThisMonth = DateTime.Parse(DateTime.Now.ToString("yyyy-MM") + "-01 00:00:00");
  501. UserRankWhite rank = db.UserRankWhite.FirstOrDefault(m => m.Id == UserId && m.CreateDate < ThisMonth && m.UpdateDate > now);
  502. if (rank != null)
  503. {
  504. if (rank.Rank > UserLevel)
  505. {
  506. UserLevel = rank.Rank;
  507. }
  508. }
  509. return UserLevel;
  510. }
  511. //获取等级分润比例
  512. private decimal GetLevelProfit(int BrandId, int UserLevel, int Help)
  513. {
  514. int LevelKindId = ProfitHelperV2.Instance.GetLevelKindId(BrandId, Help, 1);
  515. ProfitObjectLevels objlevel = RedisDbconn.Instance.Get<ProfitObjectLevels>("pobjlv" + LevelKindId + ":" + UserLevel); //获取当前等级参数
  516. if (objlevel != null)
  517. {
  518. return objlevel.Percents;
  519. }
  520. return 0;
  521. }
  522. }
  523. }