ProfitCheckHelper.cs 39 KB

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