ProfitService.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  1. using System;
  2. using System.Collections.Generic;
  3. using Library;
  4. using LitJson;
  5. using System.Linq;
  6. using System.Data;
  7. using System.Threading;
  8. using MySystem.ProfitModels;
  9. namespace MySystem
  10. {
  11. public class ProfitService
  12. {
  13. public readonly static ProfitService Instance = new ProfitService();
  14. private ProfitService()
  15. { }
  16. // 统计交易额到RDS
  17. public void StartStat()
  18. {
  19. Thread th = new Thread(StartStatDo);
  20. th.IsBackground = true;
  21. th.Start();
  22. }
  23. public void StartStatDo()
  24. {
  25. while (true)
  26. {
  27. string content = RedisDbconn.Instance.RPop<string>("ProfitTradeAmountQueue");
  28. if(!string.IsNullOrEmpty(content))
  29. {
  30. StatTradeAmount(content);
  31. }
  32. else
  33. {
  34. Thread.Sleep(10000);
  35. }
  36. }
  37. }
  38. public void StatTradeAmount(string content)
  39. {
  40. WebCMSEntities db = new WebCMSEntities();
  41. PxcModels.WebCMSEntities maindb = new PxcModels.WebCMSEntities();
  42. try
  43. {
  44. JsonData selfDr = JsonMapper.ToObject(content);
  45. int UserId = int.Parse(selfDr["UserId"].ToString());
  46. PxcModels.Users user = maindb.Users.FirstOrDefault(m => m.Id == UserId) ?? new PxcModels.Users();
  47. string ParentNav = user.ParentNav;
  48. int BrandId = int.Parse(selfDr["BrandId"].ToString());
  49. int BankCardType = int.Parse(selfDr["BankCardType"].ToString());
  50. int QrPayFlag = int.Parse(selfDr["QrPayFlag"].ToString());
  51. int MerHelpFlag = int.Parse(selfDr["MerHelpFlag"].ToString());
  52. int Version = int.Parse(selfDr["Version"].ToString());
  53. int CapFlag = int.Parse(selfDr["CapFlag"].ToString());
  54. int VipFlag = int.Parse(selfDr["VipFlag"].ToString());
  55. int PayType = int.Parse(selfDr["PayType"].ToString());
  56. string TradeDate = selfDr["TradeDate"].ToString();
  57. decimal TradeAmount = decimal.Parse(selfDr["TradeAmount"].ToString());
  58. int TradeCount = int.Parse(selfDr["TradeCount"].ToString());
  59. string TradeMonth = TradeDate.Substring(0, 6);
  60. TradeDaySummary selfStat = db.TradeDaySummary.FirstOrDefault(m => m.UserId == UserId && m.TradeMonth == TradeMonth && m.TradeDate == TradeDate && m.BrandId == BrandId && m.QueryCount == QrPayFlag && m.VipFlag == VipFlag && m.PayType == PayType && m.SeoTitle == "self");
  61. if (selfStat == null)
  62. {
  63. selfStat = db.TradeDaySummary.Add(new TradeDaySummary()
  64. {
  65. UserId = UserId,
  66. TradeMonth = TradeMonth,
  67. TradeDate = TradeDate,
  68. BrandId = BrandId,
  69. QueryCount = QrPayFlag,
  70. VipFlag = VipFlag,
  71. PayType = PayType,
  72. SeoTitle = "self",
  73. }).Entity;
  74. db.SaveChanges();
  75. }
  76. if (BankCardType == 0)
  77. {
  78. if (Version == 1)
  79. {
  80. selfStat.ProfitDirectDebitTradeAmt += TradeAmount;
  81. if (CapFlag == 1)
  82. {
  83. selfStat.ProfitDirectDebitCapTradeAmt += TradeAmount;
  84. selfStat.ProfitDirectDebitCapNum += TradeCount;
  85. }
  86. }
  87. else if (MerHelpFlag == 1)
  88. {
  89. selfStat.HelpDirectDebitTradeAmt += TradeAmount;
  90. if (CapFlag == 1)
  91. {
  92. selfStat.HelpDirectDebitCapTradeAmt += TradeAmount;
  93. selfStat.HelpDirectDebitCapNum += TradeCount;
  94. }
  95. }
  96. else
  97. {
  98. selfStat.NotHelpDirectDebitTradeAmt += TradeAmount;
  99. if (CapFlag == 1)
  100. {
  101. selfStat.NotHelpDirectDebitCapTradeAmt += TradeAmount;
  102. selfStat.NotHelpDirectDebitCapNum += TradeCount;
  103. }
  104. }
  105. }
  106. else if (BankCardType != 0)
  107. {
  108. if (Version == 1)
  109. {
  110. selfStat.ProfitDirectTradeAmt += TradeAmount;
  111. }
  112. else if (MerHelpFlag == 1)
  113. {
  114. selfStat.HelpDirectTradeAmt += TradeAmount;
  115. }
  116. else
  117. {
  118. selfStat.NotHelpDirectTradeAmt += TradeAmount;
  119. }
  120. }
  121. ParentNav += "," + UserId + ",";
  122. if (!string.IsNullOrEmpty(ParentNav))
  123. {
  124. string[] ParentNavList = ParentNav.Trim(',').Replace(",,", ",").Split(',');
  125. foreach (string NavUserIdString in ParentNavList)
  126. {
  127. int NavUserId = int.Parse(NavUserIdString);
  128. TradeDaySummary teamStat = db.TradeDaySummary.FirstOrDefault(m => m.UserId == NavUserId && m.TradeMonth == TradeMonth && m.TradeDate == TradeDate && m.BrandId == BrandId && m.QueryCount == QrPayFlag && m.VipFlag == VipFlag && m.PayType == PayType && m.SeoTitle == "team");
  129. if (teamStat == null)
  130. {
  131. teamStat = db.TradeDaySummary.Add(new TradeDaySummary()
  132. {
  133. UserId = NavUserId,
  134. TradeMonth = TradeMonth,
  135. TradeDate = TradeDate,
  136. BrandId = BrandId,
  137. QueryCount = QrPayFlag,
  138. VipFlag = VipFlag,
  139. PayType = PayType,
  140. SeoTitle = "team",
  141. }).Entity;
  142. db.SaveChanges();
  143. }
  144. if (BankCardType == 0)
  145. {
  146. if (Version == 1)
  147. {
  148. teamStat.ProfitNonDirectDebitTradeAmt += TradeAmount;
  149. if (CapFlag == 1)
  150. {
  151. teamStat.ProfitDirectDebitCapTradeAmt += TradeAmount;
  152. teamStat.ProfitDirectDebitCapNum += TradeCount;
  153. }
  154. }
  155. else if (MerHelpFlag == 1)
  156. {
  157. teamStat.HelpNonDirectDebitTradeAmt += TradeAmount;
  158. if (CapFlag == 1)
  159. {
  160. teamStat.HelpDirectDebitCapTradeAmt += TradeAmount;
  161. teamStat.HelpDirectDebitCapNum += TradeCount;
  162. }
  163. }
  164. else
  165. {
  166. teamStat.NotHelpNonDirectDebitTradeAmt += TradeAmount;
  167. if (CapFlag == 1)
  168. {
  169. teamStat.NotHelpDirectDebitCapTradeAmt += TradeAmount;
  170. teamStat.NotHelpDirectDebitCapNum += TradeCount;
  171. }
  172. }
  173. }
  174. else if (BankCardType != 0)
  175. {
  176. if (Version == 1)
  177. {
  178. teamStat.ProfitNonDirectTradeAmt += TradeAmount;
  179. }
  180. else if (MerHelpFlag == 1)
  181. {
  182. teamStat.HelpNonDirectTradeAmt += TradeAmount;
  183. }
  184. else
  185. {
  186. teamStat.NotHelpNonDirectTradeAmt += TradeAmount;
  187. }
  188. }
  189. }
  190. }
  191. db.SaveChanges();
  192. }
  193. catch (Exception ex)
  194. {
  195. function.WriteLog(DateTime.Now.ToString() + "\n" + ex.ToString(), "实时统计交易额日志RDSnew异常");
  196. }
  197. maindb.Dispose();
  198. db.Dispose();
  199. function.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "\n\n", "实时统计交易额日志RDSnew");
  200. }
  201. public void AddRds()
  202. {
  203. // AddTradeDaySummary(); //补TradeDaySummary数据
  204. // AddUserAccountRecord(); //补UserAccountRecord数据
  205. // AddProfitRecord(); //补ProfitRecord数据
  206. // AddSubsidyRecord(); //补SubsidyRecord数据
  207. AddRdsData("TradeRecord");
  208. AddRdsData("PosMerchantTradeSummay");
  209. AddRdsData("UserAccountRecord");
  210. AddRdsData("ProfitRecord");
  211. AddRdsData("SubsidyRecord");
  212. AddRdsData("StoreChangeHistory");
  213. AddRdsData("StoreStockChange");
  214. AddRdsData("MsgPlacardRead");
  215. AddRdsData("UserTradeMonthSummary");
  216. // AddRdsData("ProfitRewardRecord");
  217. AddRdsData("HelpProfitMerTradeSummay");
  218. // AddRdsData("MsgPersonal");
  219. AddRdsData("OpenReward");
  220. AddRdsData("OpenRewardDetail");
  221. AddRdsData("UserStoreChange");
  222. // AddRdsData("ProfitRewardExport");
  223. AddRdsData("ActiveReward");
  224. AddRdsData("RecommendTradeSummary");
  225. AddRdsData("StoreHouseAmountRecord");
  226. // AddRdsData("ProfitSubsidyDetail");
  227. // AddRdsData("ProfitSubsidyExport");
  228. AddRdsData("FluxProfitDetail");
  229. }
  230. public void AddRdsData(string TableName)
  231. {
  232. Thread th = new Thread(AddRdsDataDo);
  233. th.IsBackground = true;
  234. th.Start(TableName);
  235. }
  236. public void AddRdsDataDo(object sender)
  237. {
  238. string TableName = sender.ToString();
  239. while (true)
  240. {
  241. if(RedisDbconn.Instance.Get<string>("RdsThreadStatus") == "1")
  242. {
  243. RdsDataDo(TableName);
  244. Thread.Sleep(500);
  245. }
  246. else
  247. {
  248. Thread.Sleep(5000);
  249. }
  250. }
  251. }
  252. public void RdsDataDo(string TableName)
  253. {
  254. try
  255. {
  256. string condition = "";
  257. if(TableName == "PosMerchantTradeSummay") condition += " and Id<=14473274";
  258. if(TableName == "UserTradeMonthSummary") condition += " and Id<=1132650";
  259. if(TableName == "HelpProfitMerTradeSummay") condition += " and Id<=473971";
  260. if(TableName == "RecommendTradeSummary") condition += " and Id<=236748";
  261. string sql = "";
  262. int startId = int.Parse(function.CheckInt(function.ReadInstance("/TradeRecord/" + TableName + "Id.txt")));
  263. DataTable dt = CustomerSqlConn.dtable("select * from " + TableName + " where Id>" + startId + condition + " order by Id limit 100", AppConfig.Base.SqlConn);
  264. if(dt.Rows.Count > 0)
  265. {
  266. foreach(DataRow dr in dt.Rows)
  267. {
  268. string fields = "";
  269. string vals = "";
  270. foreach(DataColumn dc in dt.Columns)
  271. {
  272. fields += dc.ColumnName + ",";
  273. if(dc.DataType == typeof(DateTime))
  274. {
  275. string val = dr[dc.ColumnName].ToString();
  276. if(string.IsNullOrEmpty(val))
  277. {
  278. val = "NULL";
  279. }
  280. else
  281. {
  282. val = "'" + DateTime.Parse(val).ToString("yyyy-MM-dd HH:mm:ss") + "'";
  283. }
  284. vals += val + ",";
  285. }
  286. else if(dc.DataType == typeof(int) || dc.DataType == typeof(decimal) || dc.DataType == typeof(ulong))
  287. {
  288. vals += dr[dc.ColumnName].ToString() + ",";
  289. }
  290. else
  291. {
  292. vals += "'" + dr[dc.ColumnName].ToString() + "',";
  293. }
  294. }
  295. sql += "insert into " + TableName + " (" + fields.TrimEnd(',') + ") values (" + vals.TrimEnd(',') + ");\n";
  296. startId = int.Parse(function.CheckInt(dr["Id"].ToString()));
  297. }
  298. CustomerSqlConn.op(sql, AppConfig.Base.ProfitSqlConn);
  299. function.WritePage("/TradeRecord/", TableName + "Id.txt", startId.ToString());
  300. }
  301. }
  302. catch (Exception ex)
  303. {
  304. function.WriteLog(DateTime.Now.ToString() + "\n" + ex.ToString(), "补" + TableName + "数据异常");
  305. }
  306. function.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "\n\n", "补" + TableName + "数据");
  307. }
  308. // 补TradeDaySummary数据
  309. public void AddTradeDaySummary()
  310. {
  311. Thread th = new Thread(AddTradeDaySummaryDo);
  312. th.IsBackground = true;
  313. th.Start();
  314. }
  315. public void AddTradeDaySummaryDo()
  316. {
  317. while (true)
  318. {
  319. if(RedisDbconn.Instance.Get<string>("TradeDaySummaryThreadStatus") == "1")
  320. {
  321. TradeDaySummaryDo();
  322. }
  323. else
  324. {
  325. Thread.Sleep(1000);
  326. }
  327. }
  328. }
  329. public void TradeDaySummaryDo()
  330. {
  331. WebCMSEntities db = new WebCMSEntities();
  332. PxcModels.WebCMSEntities maindb = new PxcModels.WebCMSEntities();
  333. try
  334. {
  335. int startId = int.Parse(function.CheckInt(function.ReadInstance("/TradeRecord/TradeDaySummaryId.txt")));
  336. List<PxcModels.TradeDaySummary> list = maindb.TradeDaySummary.Where(m => m.Id > startId && m.Id <= 13509689).OrderBy(m => m.Id).Take(100).ToList();
  337. foreach(PxcModels.TradeDaySummary sub in list)
  338. {
  339. db.TradeDaySummary.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<TradeDaySummary>(Newtonsoft.Json.JsonConvert.SerializeObject(sub)));
  340. startId = sub.Id;
  341. }
  342. function.WritePage("/TradeRecord/", "TradeDaySummaryId.txt", startId.ToString());
  343. db.SaveChanges();
  344. }
  345. catch (Exception ex)
  346. {
  347. function.WriteLog(DateTime.Now.ToString() + "\n" + ex.ToString(), "补TradeDaySummary数据异常");
  348. }
  349. maindb.Dispose();
  350. db.Dispose();
  351. function.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "\n\n", "补TradeDaySummary数据");
  352. }
  353. // 同步UserAccountRecord数据
  354. public void AddUserAccountRecord()
  355. {
  356. Thread th = new Thread(AddUserAccountRecordDo);
  357. th.IsBackground = true;
  358. th.Start();
  359. }
  360. public void AddUserAccountRecordDo()
  361. {
  362. while (true)
  363. {
  364. if(RedisDbconn.Instance.Get<string>("UserAccountRecordThreadStatus") == "1")
  365. {
  366. UserAccountRecordDo();
  367. }
  368. else
  369. {
  370. Thread.Sleep(1000);
  371. }
  372. }
  373. }
  374. public void UserAccountRecordDo()
  375. {
  376. WebCMSEntities db = new WebCMSEntities();
  377. PxcModels.WebCMSEntities maindb = new PxcModels.WebCMSEntities();
  378. try
  379. {
  380. int startId = int.Parse(function.CheckInt(function.ReadInstance("/TradeRecord/UserAccountRecordId.txt")));
  381. List<PxcModels.UserAccountRecord> list = maindb.UserAccountRecord.Where(m => m.Id > startId).OrderBy(m => m.Id).Take(100).ToList();
  382. foreach(PxcModels.UserAccountRecord sub in list)
  383. {
  384. db.UserAccountRecord.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<UserAccountRecord>(Newtonsoft.Json.JsonConvert.SerializeObject(sub)));
  385. startId = sub.Id;
  386. }
  387. function.WritePage("/TradeRecord/", "UserAccountRecordId.txt", startId.ToString());
  388. db.SaveChanges();
  389. }
  390. catch (Exception ex)
  391. {
  392. function.WriteLog(DateTime.Now.ToString() + "\n" + ex.ToString(), "补UserAccountRecord数据异常");
  393. }
  394. maindb.Dispose();
  395. db.Dispose();
  396. function.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "\n\n", "补UserAccountRecord数据");
  397. }
  398. // 同步ProfitRecord数据
  399. public void AddProfitRecord()
  400. {
  401. Thread th = new Thread(AddProfitRecordDo);
  402. th.IsBackground = true;
  403. th.Start();
  404. }
  405. public void AddProfitRecordDo()
  406. {
  407. while (true)
  408. {
  409. if(RedisDbconn.Instance.Get<string>("ProfitRecordThreadStatus") == "1")
  410. {
  411. ProfitRecordDo();
  412. }
  413. else
  414. {
  415. Thread.Sleep(1000);
  416. }
  417. }
  418. }
  419. public void ProfitRecordDo()
  420. {
  421. WebCMSEntities db = new WebCMSEntities();
  422. PxcModels.WebCMSEntities maindb = new PxcModels.WebCMSEntities();
  423. try
  424. {
  425. int startId = int.Parse(function.CheckInt(function.ReadInstance("/TradeRecord/ProfitRecordId.txt")));
  426. List<PxcModels.ProfitRecord> list = maindb.ProfitRecord.Where(m => m.Id > startId).OrderBy(m => m.Id).Take(100).ToList();
  427. foreach(PxcModels.ProfitRecord sub in list)
  428. {
  429. db.ProfitRecord.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<ProfitRecord>(Newtonsoft.Json.JsonConvert.SerializeObject(sub)));
  430. startId = sub.Id;
  431. }
  432. function.WritePage("/TradeRecord/", "ProfitRecordId.txt", startId.ToString());
  433. db.SaveChanges();
  434. }
  435. catch (Exception ex)
  436. {
  437. function.WriteLog(DateTime.Now.ToString() + "\n" + ex.ToString(), "补ProfitRecord数据异常");
  438. }
  439. maindb.Dispose();
  440. db.Dispose();
  441. function.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "\n\n", "补ProfitRecord数据");
  442. }
  443. // 同步SubsidyRecord数据
  444. public void AddSubsidyRecord()
  445. {
  446. Thread th = new Thread(AddSubsidyRecordDo);
  447. th.IsBackground = true;
  448. th.Start();
  449. }
  450. public void AddSubsidyRecordDo()
  451. {
  452. while (true)
  453. {
  454. if(RedisDbconn.Instance.Get<string>("SubsidyRecordThreadStatus") == "1")
  455. {
  456. SubsidyRecordDo();
  457. }
  458. else
  459. {
  460. Thread.Sleep(1000);
  461. }
  462. }
  463. }
  464. public void SubsidyRecordDo()
  465. {
  466. WebCMSEntities db = new WebCMSEntities();
  467. PxcModels.WebCMSEntities maindb = new PxcModels.WebCMSEntities();
  468. try
  469. {
  470. int startId = int.Parse(function.CheckInt(function.ReadInstance("/TradeRecord/SubsidyRecordId.txt")));
  471. List<PxcModels.SubsidyRecord> list = maindb.SubsidyRecord.Where(m => m.Id > startId).OrderBy(m => m.Id).Take(100).ToList();
  472. foreach(PxcModels.SubsidyRecord sub in list)
  473. {
  474. db.SubsidyRecord.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<SubsidyRecord>(Newtonsoft.Json.JsonConvert.SerializeObject(sub)));
  475. startId = sub.Id;
  476. }
  477. function.WritePage("/TradeRecord/", "SubsidyRecordId.txt", startId.ToString());
  478. db.SaveChanges();
  479. }
  480. catch (Exception ex)
  481. {
  482. function.WriteLog(DateTime.Now.ToString() + "\n" + ex.ToString(), "补SubsidyRecord数据异常");
  483. }
  484. maindb.Dispose();
  485. db.Dispose();
  486. function.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "\n\n", "补SubsidyRecord数据");
  487. }
  488. }
  489. }