StatService.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. using System;
  2. using System.Collections.Generic;
  3. using Library;
  4. using LitJson;
  5. using System.Linq;
  6. using System.Data;
  7. using MySystem.PxcModels;
  8. namespace MySystem
  9. {
  10. public class StatService
  11. {
  12. public readonly static StatService Instance = new StatService();
  13. private StatService()
  14. { }
  15. public void Start(JobMqMsg jobInfo)
  16. {
  17. string content = "";
  18. try
  19. {
  20. string doDate = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd");
  21. string flag = function.ReadInstance("/Stat/" + doDate + ".txt");
  22. if (string.IsNullOrEmpty(flag))
  23. {
  24. function.WritePage("/Stat/", doDate + ".txt", DateTime.Now.ToString("HH:mm:ss"));
  25. dosomething1(doDate);
  26. dosomething2(doDate);
  27. }
  28. string Msg = "success";
  29. jobInfo.Status = Msg == "success" ? 1 : 0;
  30. jobInfo.Msg = Msg == "success" ? "执行完成" : Msg;
  31. RabbitMQClient.Instance.SendMsg(Newtonsoft.Json.JsonConvert.SerializeObject(jobInfo), "PublicBack");
  32. }
  33. catch (Exception ex)
  34. {
  35. if (!string.IsNullOrEmpty(content))
  36. {
  37. Dictionary<string, string> data = new Dictionary<string, string>();
  38. data.Add("ErrTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  39. data.Add("ErrMsg", ex.ToString());
  40. function.WriteLog(Newtonsoft.Json.JsonConvert.SerializeObject(data), "public_err");
  41. }
  42. else
  43. {
  44. function.WriteLog(DateTime.Now.ToString() + ":" + ex.ToString(), "public_service");
  45. }
  46. }
  47. }
  48. public void clear()
  49. {
  50. RedisDbconn.Instance.Clear("TotalAmount*");
  51. RedisDbconn.Instance.Clear("TotalCloudPayAmount*");
  52. RedisDbconn.Instance.Clear("TotalPosAmount*");
  53. RedisDbconn.Instance.Clear("TeamTotalAmount*");
  54. RedisDbconn.Instance.Clear("TeamTotalCloudPayAmount*");
  55. RedisDbconn.Instance.Clear("TeamTotalPosAmount*");
  56. // RedisDbconn.Instance.Clear("TotalUser*");
  57. // RedisDbconn.Instance.Clear("TeamTotalUser*");
  58. // RedisDbconn.Instance.Clear("AddUser*");
  59. // RedisDbconn.Instance.Clear("TeamAddUser*");
  60. // RedisDbconn.Instance.Clear("TotalPosMerchant*");
  61. // RedisDbconn.Instance.Clear("TeamTotalPosMerchant*");
  62. RedisDbconn.Instance.Clear("MerTotalAmount*");
  63. }
  64. // 1. 前一天的绑定记录和创客信息匹配,设置商户型创客
  65. public void dosomething1(string date)
  66. {
  67. // TODO: 每天扫描非商户型创客的持有机具数量
  68. SpModels.WebCMSEntities spdb = new SpModels.WebCMSEntities();
  69. WebCMSEntities db = new WebCMSEntities();
  70. DateTime yesterday = DateTime.Parse(date + " 00:00:00");
  71. DateTime today = DateTime.Parse(DateTime.Parse(date).AddDays(1).ToString("yyyy-MM-dd") + " 00:00:00");
  72. List<SpModels.BindRecord> binds = spdb.BindRecord.Where(m => m.CreateTime >= yesterday && m.CreateTime < today).ToList();
  73. foreach (SpModels.BindRecord bind in binds)
  74. {
  75. string Mobile = bind.MerNewSnNo;
  76. string MerNo = bind.MerNo;
  77. string BeforeNum = "";
  78. string AfterNum = "";
  79. if (Mobile.Contains("****") && Mobile.Length == 11)
  80. {
  81. BeforeNum = Mobile.Substring(0, 3);
  82. AfterNum = Mobile.Substring(7);
  83. }
  84. string Name = bind.MerName;
  85. PxcModels.Users user = db.Users.FirstOrDefault(m => m.Mobile.StartsWith(BeforeNum) && m.Mobile.EndsWith(AfterNum) && m.RealName == Name && m.AuthFlag == 1 && m.MerchantType == 0);
  86. if (user != null)
  87. {
  88. user.MerchantType = 1;
  89. PxcModels.PosMerchantInfo merchant = db.PosMerchantInfo.FirstOrDefault(m => m.KqMerNo == MerNo) ?? new PxcModels.PosMerchantInfo();
  90. merchant.MerUserType = 1;
  91. PxcModels.PosMachinesTwo pos = db.PosMachinesTwo.FirstOrDefault(m => m.BindMerchantId == merchant.Id);
  92. if (pos != null)
  93. {
  94. pos.SeoTitle = user.Id.ToString(); // 记录商户型创客的Id
  95. }
  96. db.SaveChanges();
  97. BothdisDbconn.Instance.SendMq("Pop:Users", user);
  98. BothdisDbconn.Instance.SendMq("Pop:PosMerchantInfo", merchant);
  99. BothdisDbconn.Instance.SendMq("Pop:PosMachinesTwo", pos);
  100. }
  101. }
  102. spdb.Dispose();
  103. db.Dispose();
  104. }
  105. // 2. 每天统计前一天的交易额,每笔交易判断商户号的所属人是商户型创客,如果是,则从此人开始累计交易额,若不是,则从此人上级开始累计交易额
  106. public void dosomething2(string date)
  107. {
  108. WebCMSEntities db = new WebCMSEntities();
  109. string yesterday = date + " 00:00:00";
  110. string today = DateTime.Parse(date).AddDays(1).ToString("yyyy-MM-dd") + " 00:00:00";
  111. string TradeMonth = DateTime.Parse(date).ToString("yyyyMM");
  112. string TradeDate = DateTime.Parse(date).ToString("yyyyMMdd");
  113. DataTable dt = dbconn.dtable("select UserId,BrandId,MerchantId,QrPayFlag,sum(TradeAmount) from TradeRecord where CreateDate>='" + yesterday + "' and CreateDate<'" + today + "' group by UserId,BrandId,MerchantId,QrPayFlag");
  114. foreach (DataRow dr in dt.Rows)
  115. {
  116. int UserId = int.Parse(dr["UserId"].ToString()); //创客ID
  117. int BrandId = int.Parse(dr["BrandId"].ToString()); //品牌
  118. int MerchantId = int.Parse(dr["MerchantId"].ToString()); //商户Id
  119. int QrPayFlag = int.Parse(dr["QrPayFlag"].ToString()); //云闪付
  120. decimal TradeAmount = decimal.Parse(dr[4].ToString()); //当日交易额
  121. PosMerchantInfo merchant = db.PosMerchantInfo.FirstOrDefault(m => m.Id == MerchantId) ?? new PosMerchantInfo();
  122. MachineForMerNo machineFor = db.MachineForMerNo.FirstOrDefault(m => m.MerNo == merchant.KqMerNo) ?? new MachineForMerNo();
  123. PosMachinesTwo pos = db.PosMachinesTwo.FirstOrDefault(m => m.Id == machineFor.SnId) ?? new PosMachinesTwo();
  124. int MerchantTypeUserId = int.Parse(function.CheckInt(pos.SeoTitle));
  125. if (MerchantTypeUserId > 0)
  126. {
  127. UserId = MerchantTypeUserId;
  128. }
  129. RedisDbconn.Instance.AddNumber("MerTotalAmount:" + MerchantId, TradeAmount);
  130. RedisDbconn.Instance.AddNumber("MerTotalAmount:" + MerchantId + ":" + TradeMonth, TradeAmount); //商户当月交易
  131. RedisDbconn.Instance.AddNumber("MerTotalAmount:" + MerchantId + ":" + TradeDate, TradeAmount); //商户当日交易
  132. int Level = 0;
  133. while (UserId > 0)
  134. {
  135. Level += 1;
  136. Users user = db.Users.FirstOrDefault(m => m.Id == UserId);
  137. if (user != null)
  138. {
  139. if (user.AuthFlag == 1)
  140. {
  141. if (Level == 1)
  142. {
  143. RedisDbconn.Instance.AddNumber("TotalAmount:" + UserId, TradeAmount); //总交易
  144. RedisDbconn.Instance.AddNumber("TotalAmount:" + UserId + ":" + TradeDate, TradeAmount); //总交易
  145. RedisDbconn.Instance.AddNumber("TotalAmount:" + UserId + ":" + TradeMonth, TradeAmount); //总交易
  146. RedisDbconn.Instance.AddNumber("TotalAmount:" + UserId + ":" + BrandId + ":" + TradeDate, TradeAmount); //总交易
  147. RedisDbconn.Instance.AddNumber("TotalAmount:" + UserId + ":" + BrandId + ":" + TradeMonth, TradeAmount); //总交易
  148. if (QrPayFlag == 1)
  149. {
  150. RedisDbconn.Instance.AddNumber("TotalCloudPayAmount:" + UserId + ":" + TradeDate, TradeAmount); //云闪付小额交易额
  151. RedisDbconn.Instance.AddNumber("TotalCloudPayAmount:" + UserId + ":" + TradeMonth, TradeAmount); //云闪付小额交易额
  152. }
  153. else
  154. {
  155. RedisDbconn.Instance.AddNumber("TotalPosAmount:" + UserId + ":" + TradeDate, TradeAmount); //POS机刷卡交易额
  156. RedisDbconn.Instance.AddNumber("TotalPosAmount:" + UserId + ":" + TradeMonth, TradeAmount); //POS机刷卡交易额
  157. }
  158. }
  159. RedisDbconn.Instance.AddNumber("TeamTotalAmount:" + UserId, TradeAmount); //总交易
  160. RedisDbconn.Instance.AddNumber("TeamTotalAmount:" + UserId + ":" + TradeDate, TradeAmount); //总交易
  161. RedisDbconn.Instance.AddNumber("TeamTotalAmount:" + UserId + ":" + TradeMonth, TradeAmount); //总交易
  162. RedisDbconn.Instance.AddNumber("TeamTotalAmount:" + UserId + ":" + BrandId + ":" + TradeDate, TradeAmount); //总交易
  163. RedisDbconn.Instance.AddNumber("TeamTotalAmount:" + UserId + ":" + BrandId + ":" + TradeMonth, TradeAmount); //总交易
  164. if (QrPayFlag == 1)
  165. {
  166. RedisDbconn.Instance.AddNumber("TeamTotalCloudPayAmount:" + UserId + ":" + TradeDate, TradeAmount); //云闪付小额交易额
  167. RedisDbconn.Instance.AddNumber("TeamTotalCloudPayAmount:" + UserId + ":" + TradeMonth, TradeAmount); //云闪付小额交易额
  168. }
  169. else
  170. {
  171. RedisDbconn.Instance.AddNumber("TeamTotalPosAmount:" + UserId + ":" + TradeDate, TradeAmount); //POS机刷卡交易额
  172. RedisDbconn.Instance.AddNumber("TeamTotalPosAmount:" + UserId + ":" + TradeMonth, TradeAmount); //POS机刷卡交易额
  173. }
  174. }
  175. UserId = user.ParentUserId;
  176. }
  177. else
  178. {
  179. UserId = 0;
  180. }
  181. }
  182. }
  183. db.Dispose();
  184. }
  185. // 3. 前一天的激活记录,根据创客类型,如果是商户型创客,则激活奖励的起始人从此人上级计算。如果不是,则从此人开始计算
  186. public void dosomething3(string date)
  187. {
  188. WebCMSEntities db = new WebCMSEntities();
  189. DateTime yesterday = DateTime.Parse(date + " 00:00:00");
  190. DateTime today = DateTime.Parse(DateTime.Parse(date).AddDays(1).ToString("yyyy-MM-dd") + " 00:00:00");
  191. List<PosMachinesTwo> posList = db.PosMachinesTwo.Where(m => m.ActivationTime >= yesterday && m.ActivationTime < today).ToList();
  192. foreach (PosMachinesTwo pos in posList)
  193. {
  194. int GetUserId = pos.UserId;
  195. string ParentNav = "";
  196. Users user = db.Users.FirstOrDefault(m => m.Id == pos.UserId);
  197. if (user != null)
  198. {
  199. ParentNav = user.ParentNav;
  200. if (user.MerchantType == 1)
  201. {
  202. Users puser = db.Users.FirstOrDefault(m => m.Id == user.ParentUserId);
  203. if (puser != null)
  204. {
  205. GetUserId = puser.Id;
  206. ParentNav = puser.ParentNav;
  207. }
  208. }
  209. int TopUserId = 0;
  210. if (!string.IsNullOrEmpty(ParentNav))
  211. {
  212. TopUserId = int.Parse(ParentNav.Trim(',').Replace(",,", ","));
  213. }
  214. decimal ActPrize = decimal.Parse(function.CheckNum(pos.SeoTitle)) / 100;
  215. if (ActPrize > 0)
  216. {
  217. PosMerchantInfo merchant = db.PosMerchantInfo.FirstOrDefault(m => m.Id == pos.BindMerchantId) ?? new PosMerchantInfo();
  218. Users merUser = db.Users.FirstOrDefault(m => m.Id == merchant.UserId) ?? new Users();
  219. db.ActiveReward.Add(new ActiveReward()
  220. {
  221. CreateDate = DateTime.Now,
  222. UpdateDate = DateTime.Now,
  223. UserId = GetUserId, //创客
  224. MerchantId = pos.BindMerchantId, //商户
  225. StandardDate = pos.ActivationTime, //达标日期
  226. RewardAmount = ActPrize, //奖励金额
  227. BrandId = pos.BrandId, //品牌
  228. UserNav = ParentNav, //创客父级
  229. DirectBuddyNo = merchant.UserId, //商户直属创客
  230. KqMerNo = merchant.KqMerNo, //渠道商户编号
  231. KqSnNo = pos.PosSn, //渠道SN号
  232. SnType = pos.PosSnType, //机具类型
  233. SnApplyUserId = pos.BuyUserId, //机具申请创客
  234. ActType = 0, //激活类型
  235. SnStoreId = pos.StoreId, //SN仓库
  236. RewardTips = "激活奖励", //奖励描述
  237. Remark = "激活奖励", //备注
  238. ActDate = pos.ActivationTime, //激活时间
  239. TopUserId = TopUserId, //顶级创客
  240. });
  241. db.SaveChanges();
  242. string IdBrand = GetUserId + "_" + pos.BrandId;
  243. UserMachineData userData = db.UserMachineData.FirstOrDefault(m => m.IdBrand == IdBrand);
  244. if (userData == null)
  245. {
  246. userData = db.UserMachineData.Add(new UserMachineData()
  247. {
  248. IdBrand = IdBrand,
  249. }).Entity;
  250. db.SaveChanges();
  251. }
  252. userData.ActProfit += ActPrize;
  253. db.SaveChanges();
  254. RedisDbconn.Instance.Set("UserMachineData:" + IdBrand, userData);
  255. string dateString = DateTime.Now.ToString("yyyyMMdd");
  256. string monthString = DateTime.Now.ToString("yyyyMMdd");
  257. // 激活奖励列表
  258. List<string> dates = RedisDbconn.Instance.GetList<string>("ActiveRewardDay:" + GetUserId + ":" + pos.BrandId);
  259. if (!dates.Contains(dateString))
  260. {
  261. RedisDbconn.Instance.AddList("ActiveRewardDay:" + GetUserId + ":" + pos.BrandId, dateString);
  262. RedisDbconn.Instance.AddNumber("ActiveRewardAmt:" + GetUserId + ":" + pos.BrandId + ":" + dateString, ActPrize);
  263. }
  264. List<string> months = RedisDbconn.Instance.GetList<string>("ActiveRewardMonth:" + GetUserId + ":" + pos.BrandId);
  265. if (!months.Contains(monthString))
  266. {
  267. RedisDbconn.Instance.AddList("ActiveRewardMonth:" + GetUserId + ":" + pos.BrandId, monthString);
  268. RedisDbconn.Instance.AddNumber("ActiveRewardAmt:" + GetUserId + ":" + pos.BrandId + ":" + monthString, ActPrize);
  269. }
  270. // 激活奖励详情
  271. List<int> actPrizeList = RedisDbconn.Instance.GetList<int>("ActiveRewardDetail:" + GetUserId + ":" + pos.BrandId + ":" + dateString);
  272. if (!actPrizeList.Contains(pos.BindMerchantId))
  273. {
  274. RedisDbconn.Instance.AddList("ActiveRewardDetail:" + GetUserId + ":" + pos.BrandId + ":" + dateString, pos.BindMerchantId);
  275. RedisDbconn.Instance.AddNumber("ActiveRewardAmt:" + pos.BindMerchantId + ":" + pos.BrandId + ":" + dateString, ActPrize);
  276. }
  277. }
  278. }
  279. }
  280. db.Dispose();
  281. }
  282. //3. 前一天的激活记录,根据创客类型,如果是商户型创客,则开机奖励的起始人从此人上级计算。如果不是,则从此人开始计算
  283. public void dosomething4(string date)
  284. {
  285. WebCMSEntities db = new WebCMSEntities();
  286. DateTime yesterday = DateTime.Parse(date + " 00:00:00");
  287. DateTime today = DateTime.Parse(DateTime.Parse(date).AddDays(1).ToString("yyyy-MM-dd") + " 00:00:00");
  288. List<PosMachinesTwo> posList = db.PosMachinesTwo.Where(m => m.CreditTrade >= 1000).ToList();
  289. foreach (PosMachinesTwo pos in posList)
  290. {
  291. if (pos.ActivationTime > DateTime.Now.AddDays(-20))
  292. {
  293. decimal ActPrize = decimal.Parse(function.CheckNum(pos.SeoTitle));
  294. if (ActPrize > 0)
  295. {
  296. Users user = db.Users.FirstOrDefault(m => m.Id == pos.UserId) ?? new Users();
  297. PosMerchantInfo merchant = db.PosMerchantInfo.FirstOrDefault(m => m.Id == pos.BindMerchantId) ?? new PosMerchantInfo();
  298. if (!string.IsNullOrEmpty(user.ParentNav))
  299. {
  300. decimal Prize = 20;
  301. string[] ParentNavs = user.ParentNav.Trim(',').Replace(",,", ",").Split(',');
  302. for (int i = ParentNavs.Length - 1; i >= 0; i--)
  303. {
  304. int UserId = int.Parse(ParentNavs[i]);
  305. Users puser = db.Users.FirstOrDefault(m => m.Id == UserId && m.AuthFlag == 1);
  306. if (puser != null)
  307. {
  308. int pTopUserId = 0;
  309. if (!string.IsNullOrEmpty(puser.ParentNav))
  310. {
  311. pTopUserId = int.Parse(puser.ParentNav.Trim(',').Replace(",,", ",").Split(',')[0]);
  312. }
  313. OpenRewardDetail detail = db.OpenRewardDetail.Add(new OpenRewardDetail()
  314. {
  315. CreateDate = DateTime.Now,
  316. UpdateDate = DateTime.Now,
  317. TradeMonth = yesterday.ToString("yyyyMM"), //交易月
  318. TradeDate = yesterday, //达标日期
  319. UserId = puser.Id, //创客
  320. BrandId = pos.BrandId, //品牌
  321. ProductName = RelationClass.GetKqProductsInfo(pos.BrandId), //产品名称
  322. MerchantId = pos.BindMerchantId, //商户
  323. DirectUserId = merchant.UserId, //商户直属人
  324. SnNo = pos.PosSn, //SN号
  325. MerNo = merchant.KqMerNo, //渠道商户号
  326. SnType = pos.PosSnType, //机具类型
  327. StandardDate = pos.ActivationTime, //商户的激活日期
  328. SnStoreId = pos.StoreId, //SN仓库
  329. MerBuddyType = puser.MerchantType, //商户创客类型
  330. RewardType = 1, //奖励类型 1-开机直接奖励,2-开机间接奖励
  331. RewardTips = "开机奖励", //奖励描述
  332. CreditTradeAmt = pos.CreditTrade, //贷记卡交易总金额
  333. DebitTradeAmt = pos.DebitCardTrade, //借记卡交易总金额
  334. CreditRewardAmount = Prize, //贷记卡交易奖励金额
  335. RewardDesc = "开机奖励", //奖励描述
  336. TopUserId = pTopUserId, //顶级创客
  337. }).Entity;
  338. db.OpenReward.Add(new OpenReward()
  339. {
  340. CreateDate = DateTime.Now,
  341. UpdateDate = DateTime.Now,
  342. TradeMonth = yesterday.ToString("yyyyMM"), //交易月
  343. TradeDate = DateTime.Now, //达标日期
  344. UserId = puser.Id, //创客
  345. BrandId = pos.BrandId, //品牌
  346. RewardType = 2, //奖励类型
  347. CreditTradeAmt = pos.CreditTrade, //贷记卡交易总金额
  348. DebitTradeAmt = pos.DebitCardTrade, //借记卡交易总金额
  349. CreditRewardAmount = Prize, //贷记卡交易奖励金额
  350. RewardDesc = "开机奖励", //奖励描述
  351. TopUserId = pTopUserId, //顶级创客
  352. });
  353. Prize -= 10;
  354. string IdBrand = puser.Id + "_" + pos.BrandId;
  355. UserMachineData userData = db.UserMachineData.FirstOrDefault(m => m.IdBrand == IdBrand);
  356. if (userData == null)
  357. {
  358. userData = db.UserMachineData.Add(new UserMachineData()
  359. {
  360. IdBrand = IdBrand,
  361. }).Entity;
  362. db.SaveChanges();
  363. }
  364. userData.OpenProfit += Prize;
  365. db.SaveChanges();
  366. RedisDbconn.Instance.Set("UserMachineData:" + IdBrand, userData);
  367. string dateString = DateTime.Now.ToString("yyyyMMdd");
  368. string monthString = DateTime.Now.ToString("yyyyMMdd");
  369. // 开机奖励列表
  370. List<string> dates = RedisDbconn.Instance.GetList<string>("OpenRewardDay:" + puser.Id + ":" + pos.BrandId);
  371. if (!dates.Contains(dateString))
  372. {
  373. RedisDbconn.Instance.AddList("OpenRewardDay:" + puser.Id + ":" + pos.BrandId, dateString);
  374. RedisDbconn.Instance.AddNumber("OpenRewardAmt:" + puser.Id + ":" + pos.BrandId + ":" + dateString, Prize);
  375. }
  376. List<string> months = RedisDbconn.Instance.GetList<string>("OpenRewardMonth:" + puser.Id + ":" + pos.BrandId);
  377. if (!months.Contains(monthString))
  378. {
  379. RedisDbconn.Instance.AddList("OpenRewardMonth:" + puser.Id + ":" + pos.BrandId, monthString);
  380. RedisDbconn.Instance.AddNumber("OpenRewardAmt:" + puser.Id + ":" + pos.BrandId + ":" + monthString, Prize);
  381. }
  382. // 开机奖励详情
  383. RedisDbconn.Instance.AddList("OpenRewardDetail:" + puser.Id + ":" + pos.BrandId + ":" + dateString, detail);
  384. }
  385. }
  386. }
  387. }
  388. }
  389. }
  390. db.Dispose();
  391. }
  392. }
  393. }