PosCouponPrizeService.cs 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Data;
  5. using System.Threading;
  6. using MySystem.PxcModels;
  7. using Library;
  8. using LitJson;
  9. namespace MySystem
  10. {
  11. public class PosCouponPrizeService
  12. {
  13. public readonly static PosCouponPrizeService Instance = new PosCouponPrizeService();
  14. private PosCouponPrizeService()
  15. { }
  16. public void Start()
  17. {
  18. Thread th = new Thread(ready);
  19. th.IsBackground = true;
  20. th.Start();
  21. }
  22. private void ready()
  23. {
  24. bool op = true;
  25. while (op)
  26. {
  27. string content = RedisDbconn.Instance.RPop<string>("PosCouponPrizeQueue");
  28. if (!string.IsNullOrEmpty(content))
  29. {
  30. try
  31. {
  32. dosomething(int.Parse(function.CheckInt(content)));
  33. }
  34. catch(Exception ex)
  35. {
  36. function.WriteLog(DateTime.Now.ToString() + "\n" + ex.ToString(), "商城下单机具券发奖异常");
  37. }
  38. }
  39. else
  40. {
  41. Thread.Sleep(2000);
  42. }
  43. }
  44. }
  45. public void dosomething(int OrderId)
  46. {
  47. WebCMSEntities db = new WebCMSEntities();
  48. OpModels.WebCMSEntities opdb = new OpModels.WebCMSEntities();
  49. Orders order = db.Orders.FirstOrDefault(m => m.Id == OrderId);
  50. if(order != null)
  51. {
  52. List<int> ChkIds = new List<int>(); //机具券商品Id集合
  53. ChkIds.Add(10);
  54. ChkIds.Add(11);
  55. ChkIds.Add(77);
  56. ChkIds.Add(78);
  57. ChkIds.Add(79);
  58. ChkIds.Add(92);
  59. //判断是否是指定商品
  60. if(ChkIds.Contains(order.ProductId))
  61. {
  62. int Kind = 0;
  63. if (order.ProductId == 10)
  64. {
  65. Kind = 1;
  66. }
  67. else if (order.ProductId == 11)
  68. {
  69. Kind = 2;
  70. }
  71. int CouponCount = 0;
  72. if(Kind == 1)
  73. {
  74. CouponCount = 3 * order.BuyCount;
  75. }
  76. else if(Kind == 2)
  77. {
  78. CouponCount = 2 * order.BuyCount;
  79. }
  80. UserRankItem orderUser = GetUserLevel(order.UserId);
  81. if(orderUser.UserLevel == 0)
  82. {
  83. PreUserLevel(db, order.UserId, 1, DateTime.Parse("2025-01-01 00:00:00"));
  84. }
  85. string ParentNav = orderUser.ParentNav + "," + orderUser.Id + ",";
  86. string[] ParentNavList = ParentNav.Trim(',').Replace(",,", ",").Split(',');
  87. Array.Reverse(ParentNavList);
  88. int index = 0;
  89. bool DirectPrizeFlag = false; //推荐奖励发放标识
  90. bool BackAccountFlag = false; //备用金返余额标识
  91. bool BigLeaderFlag = false; //大盟主标记
  92. decimal BuyPrize = 0; //购机奖励
  93. foreach(string ParentId in ParentNavList)
  94. {
  95. UserRankItem parentUser = GetUserLevel(int.Parse(ParentId));
  96. index += 1;
  97. if(index == 1 && (orderUser.LeaderLevel > 0 || orderUser.OperateLevel > 0) && !DirectPrizeFlag)
  98. {
  99. DirectPrize(db, order.Id, order.UserId, order.BuyCount);
  100. DirectPrizeFlag = true;
  101. }
  102. if(index > 1)
  103. {
  104. if(Utils.Instance.IsStandardUser(parentUser.Id) && !DirectPrizeFlag)
  105. {
  106. DirectPrize(db, order.Id, parentUser.Id, order.BuyCount);
  107. DirectPrizeFlag = true;
  108. }
  109. }
  110. if(parentUser.AgoLeaderLevel > 0 && CheckLeaderReserve(db, order.BuyCount, parentUser.Id))
  111. {
  112. //购机奖
  113. if(parentUser.LeaderLevel > 0)
  114. {
  115. decimal CurBuyPrize = GetBuyPrize(parentUser, order.UserId);
  116. decimal GetPrize = CurBuyPrize - BuyPrize;
  117. if(GetPrize > 0)
  118. {
  119. bool PrizeFlag = true;
  120. int ChangeType = 118;
  121. if(parentUser.OperateLevel == 1)
  122. {
  123. ChangeType = 120;
  124. }
  125. if(parentUser.OperateLevel > 1)
  126. {
  127. ChangeType = 128;
  128. if(function.CheckNull(RedisDbconn.Instance.Get<string>("YingXunUser")).Contains("," + orderUser.Id + ","))
  129. {
  130. PrizeFlag = false;
  131. }
  132. }
  133. if(PrizeFlag)
  134. {
  135. OpAccount(db, order.Id, parentUser.Id, CurBuyPrize - BuyPrize, order.BuyCount, ChangeType);
  136. }
  137. BuyPrize = CurBuyPrize;
  138. }
  139. }
  140. if(!BackAccountFlag)
  141. {
  142. BackAccountFlag = true;
  143. //扣减备用金
  144. int ReserveRecordId = OpReserve(db, order.Id, parentUser.Id, GetWithdrawMoney(parentUser) * order.BuyCount, 2, order.UserId, "购机奖励");
  145. //返回到余额
  146. OpLeaderAccount(db, order, parentUser.Id, GetWithdrawMoney(parentUser), order.BuyCount, ReserveRecordId);
  147. }
  148. //给券打大盟主标记
  149. if(parentUser.LeaderLevel == 2 && !BigLeaderFlag)
  150. {
  151. BigLeaderFlag = true;
  152. if(!string.IsNullOrEmpty(order.SnNos))
  153. {
  154. List<string> codes = order.SnNos.Split(',').ToList();
  155. List<int> couponIds = db.PosCoupons.Where(m => codes.Contains(m.ExchangeCode)).OrderBy(m => m.Id).Take(CouponCount).ToList().Select(m => m.Id).ToList();
  156. SetPosCouponLeaderFlag(db, parentUser.Id, order.BuyCount, couponIds);
  157. }
  158. }
  159. }
  160. else if(parentUser.OperateLevel > 0 && CheckOpReserve(opdb, order.BuyCount, parentUser.Id))
  161. {
  162. //购机奖
  163. decimal CurBuyPrize = GetBuyPrize(parentUser, order.UserId);
  164. decimal GetPrize = CurBuyPrize - BuyPrize;
  165. if(GetPrize > 0)
  166. {
  167. int ChangeType = 120;
  168. if(parentUser.OperateLevel > 1)
  169. {
  170. ChangeType = 128;
  171. }
  172. OpAccount(db, order.Id, parentUser.Id, GetPrize, order.BuyCount, ChangeType);
  173. BuyPrize = CurBuyPrize;
  174. }
  175. if(!BackAccountFlag)
  176. {
  177. BackAccountFlag = true;
  178. decimal GetAmount = GetWithdrawMoney(parentUser) * order.BuyCount;
  179. //扣减备用金
  180. // OperateAmountChange(opdb, parentUser.Id, GetAmount, 2, 1, "商城购机", true, order.Id);
  181. // //返回到余额
  182. // OperateAmountChange(opdb, parentUser.Id, GetAmount, 1, 2, "商城购机", true, order.Id);
  183. OpAmountItem item = new OpAmountItem()
  184. {
  185. UserId = parentUser.Id,
  186. OperateType = 0,
  187. ChangeType = 5,
  188. Remark = "商城购机",
  189. UseAmount = GetAmount,
  190. UseValidForGetAmount = GetAmount,
  191. UseTotalAmt = GetAmount,
  192. DataType = 1,
  193. DataId = order.Id,
  194. };
  195. RedisDbconn.Instance.AddList("OperateAmountRecordServiceQueue", item);
  196. }
  197. }
  198. }
  199. }
  200. }
  201. db.Dispose();
  202. opdb.Dispose();
  203. }
  204. public void StartTmp()
  205. {
  206. Thread th = new Thread(tmpuse);
  207. th.IsBackground = true;
  208. th.Start();
  209. }
  210. public void tmpuse()
  211. {
  212. List<string> OrderNos = new List<string>();
  213. OrderNos.Add("BM2024060113545453402672795");
  214. OrderNos.Add("BM2024060120184311880104432");
  215. OrderNos.Add("BM2024060217481333220082372");
  216. OrderNos.Add("BM2024060321463465032424067");
  217. OrderNos.Add("BM2024060322545274296859914");
  218. OrderNos.Add("BM2024060411201262916896764");
  219. OrderNos.Add("BM2024060412004350540058006");
  220. OrderNos.Add("BM2024060413465972197564202");
  221. OrderNos.Add("BM2024060415033573916503519");
  222. OrderNos.Add("BM2024060415272140626450020");
  223. OrderNos.Add("BM2024060419341007900312976");
  224. OrderNos.Add("BM2024060614271376167991548");
  225. OrderNos.Add("BM2024060713063585137278426");
  226. OrderNos.Add("BM2024060717481892176601326");
  227. OrderNos.Add("BM2024060722154132572630240");
  228. OrderNos.Add("BM2024060813372270460352780");
  229. OrderNos.Add("BM2024060817212502065186555");
  230. OrderNos.Add("BM2024060913094607695535841");
  231. OrderNos.Add("BM2024060915283860183390573");
  232. OrderNos.Add("BM2024061021073127270148815");
  233. OrderNos.Add("BM2024061110512897200373083");
  234. OrderNos.Add("BM2024061116381172563321539");
  235. OrderNos.Add("BM2024061116403970848033016");
  236. OrderNos.Add("BM2024061116420698468544752");
  237. OrderNos.Add("BM2024061116454791337410830");
  238. OrderNos.Add("BM2024061618114602891640591");
  239. OrderNos.Add("BM2024061710231575090504019");
  240. OrderNos.Add("BM2024061712491667073449209");
  241. OrderNos.Add("BM2024061713313725279985341");
  242. OrderNos.Add("BM2024061715305004310220168");
  243. OrderNos.Add("BM2024061814570516374344008");
  244. OrderNos.Add("BM2024061816284293452540567");
  245. OrderNos.Add("BM2024061817303141188725776");
  246. OrderNos.Add("BM2024061817514466570015777");
  247. OrderNos.Add("BM2024061819320454306899315");
  248. OrderNos.Add("BM2024061819550591038658501");
  249. OrderNos.Add("BM2024061820083870519829511");
  250. OrderNos.Add("BM2024061913174251376166374");
  251. OrderNos.Add("BM2024061914133532158425064");
  252. OrderNos.Add("BM2024062011520571122591493");
  253. OrderNos.Add("BM2024062019282462603171101");
  254. OrderNos.Add("BM2024062110361269396743921");
  255. OrderNos.Add("BM2024062111013322637815281");
  256. OrderNos.Add("BM2024062116123310729459180");
  257. OrderNos.Add("BM2024062123360881972979017");
  258. OrderNos.Add("BM2024062215145819732048432");
  259. OrderNos.Add("BM2024062309550206498202108");
  260. OrderNos.Add("BM2024062313551537076726382");
  261. OrderNos.Add("BM2024062314521368797769848");
  262. OrderNos.Add("BM2024062315021947328572858");
  263. OrderNos.Add("BM2024062315505914062923147");
  264. OrderNos.Add("BM2024062316493189795239698");
  265. OrderNos.Add("BM2024062317220672507255078");
  266. OrderNos.Add("BM2024062317362079359724475");
  267. OrderNos.Add("BM2024062319362607330797044");
  268. OrderNos.Add("BM2024062409194399607625868");
  269. OrderNos.Add("BM2024062409354075093191999");
  270. OrderNos.Add("BM2024062409572417250788279");
  271. OrderNos.Add("BM2024062410130055103569254");
  272. OrderNos.Add("BM2024062410370404316989426");
  273. OrderNos.Add("BM2024062410494036054821444");
  274. OrderNos.Add("BM2024062410510214237120993");
  275. OrderNos.Add("BM2024062410540774395766768");
  276. OrderNos.Add("BM2024062412054969363623909");
  277. OrderNos.Add("BM2024062412063365014595845");
  278. OrderNos.Add("BM2024062412564810567150827");
  279. OrderNos.Add("BM2024062413361660963905320");
  280. OrderNos.Add("BM2024062413533005598503044");
  281. OrderNos.Add("BM2024062414034742067611108");
  282. OrderNos.Add("BM2024062414221160454950118");
  283. OrderNos.Add("BM2024062414221586262761671");
  284. OrderNos.Add("BM2024062414283991832971690");
  285. OrderNos.Add("BM2024062415020644801374214");
  286. OrderNos.Add("BM2024062416342211628125048");
  287. OrderNos.Add("BM2024062419040634390593367");
  288. OrderNos.Add("BM2024062420031688020592643");
  289. OrderNos.Add("BM2024062420595935667404632");
  290. OrderNos.Add("BM2024062421545516534666451");
  291. OrderNos.Add("BM2024062422060766623021093");
  292. List<int> ChkIds = new List<int>(); //机具券商品Id集合
  293. ChkIds.Add(10);
  294. ChkIds.Add(11);
  295. ChkIds.Add(77);
  296. ChkIds.Add(78);
  297. ChkIds.Add(79);
  298. ChkIds.Add(92);
  299. DateTime chkDate = DateTime.Parse("2024-06-01 00:00:00");
  300. WebCMSEntities db = new WebCMSEntities();
  301. OpModels.WebCMSEntities opdb = new OpModels.WebCMSEntities();
  302. List<Orders> orders = db.Orders.Where(m => m.CreateDate >= chkDate && OrderNos.Contains(m.OrderNo) && ChkIds.Contains(m.ProductId) && m.Status > 0).ToList();
  303. foreach(Orders order in orders)
  304. {
  305. int Kind = 0;
  306. if (order.ProductId == 10)
  307. {
  308. Kind = 1;
  309. }
  310. else if (order.ProductId == 11)
  311. {
  312. Kind = 2;
  313. }
  314. int CouponCount = 0;
  315. if(Kind == 1)
  316. {
  317. CouponCount = 3 * order.BuyCount;
  318. }
  319. else if(Kind == 2)
  320. {
  321. CouponCount = 2 * order.BuyCount;
  322. }
  323. UserAccountRecord record = db.UserAccountRecord.FirstOrDefault(m => m.Id >= 4579675 && m.QueryCount == order.Id && m.ChangeType == 112) ?? new UserAccountRecord();
  324. UserRankItem orderUser = GetUserLevel2(order.UserId, order.PayDate.Value);
  325. if(orderUser.UserLevel == 0)
  326. {
  327. PreUserLevel(db, order.UserId, 1, DateTime.Parse("2025-01-01 00:00:00"));
  328. }
  329. string ParentNav = orderUser.ParentNav + "," + orderUser.Id + ",";
  330. string[] ParentNavList = ParentNav.Trim(',').Replace(",,", ",").Split(',');
  331. Array.Reverse(ParentNavList);
  332. int index = 0;
  333. bool DirectPrizeFlag = false; //推荐奖励发放标识
  334. foreach(string ParentId in ParentNavList)
  335. {
  336. UserRankItem parentUser = GetUserLevel2(int.Parse(ParentId), order.PayDate.Value);
  337. index += 1;
  338. if(index == 1 && (orderUser.LeaderLevel > 0 || orderUser.OperateLevel > 0) && !DirectPrizeFlag)
  339. {
  340. // DirectPrize(db, order.Id, order.UserId, order.BuyCount);
  341. if(record.UserId != order.UserId) function.WriteLog("下单人--订单号:" + order.OrderNo + ";应发对象:" + order.UserId + ";实发对象:" + record.UserId + ";发放金额:" + order.BuyCount + "00;", "推荐奖励计算");
  342. DirectPrizeFlag = true;
  343. }
  344. if(index > 1)
  345. {
  346. if(Utils.Instance.IsStandardUser2(parentUser.Id, order.PayDate.Value) && !DirectPrizeFlag)
  347. {
  348. // DirectPrize(db, order.Id, parentUser.Id, order.BuyCount);
  349. if(record.UserId != parentUser.Id) function.WriteLog("上级--订单号:" + order.OrderNo + ";应发对象:" + parentUser.Id + ";实发对象:" + record.UserId + ";发放金额:" + order.BuyCount + "00;", "推荐奖励计算");
  350. DirectPrizeFlag = true;
  351. }
  352. }
  353. }
  354. if(!DirectPrizeFlag && record.Id == 0)
  355. {
  356. function.WriteLog("没发--订单号:" + order.OrderNo + ";发放金额:" + order.BuyCount + "00;", "推荐奖励计算");
  357. }
  358. }
  359. db.Dispose();
  360. opdb.Dispose();
  361. }
  362. public void Start2()
  363. {
  364. Thread th = new Thread(ready2);
  365. th.IsBackground = true;
  366. th.Start();
  367. }
  368. private void ready2()
  369. {
  370. bool op = true;
  371. while (op)
  372. {
  373. string content = RedisDbconn.Instance.RPop<string>("PosCouponPrizeQueue2");
  374. if (!string.IsNullOrEmpty(content))
  375. {
  376. try
  377. {
  378. dosomething(int.Parse(function.CheckInt(content)));
  379. }
  380. catch
  381. {
  382. }
  383. }
  384. else
  385. {
  386. Thread.Sleep(5000);
  387. }
  388. }
  389. }
  390. public void dosomething2(int OrderId)
  391. {
  392. WebCMSEntities db = new WebCMSEntities();
  393. OpModels.WebCMSEntities opdb = new OpModels.WebCMSEntities();
  394. Orders order = db.Orders.FirstOrDefault(m => m.Id == OrderId);
  395. if(order != null)
  396. {
  397. List<int> ChkIds = new List<int>(); //机具券商品Id集合
  398. ChkIds.Add(10);
  399. ChkIds.Add(11);
  400. ChkIds.Add(77);
  401. ChkIds.Add(78);
  402. ChkIds.Add(79);
  403. //判断是否是指定商品
  404. if(ChkIds.Contains(order.ProductId))
  405. {
  406. int Kind = 0;
  407. if (order.ProductId == 10)
  408. {
  409. Kind = 1;
  410. }
  411. else if (order.ProductId == 11)
  412. {
  413. Kind = 2;
  414. }
  415. int CouponCount = 0;
  416. if(Kind == 1)
  417. {
  418. CouponCount = 3 * order.BuyCount;
  419. }
  420. else if(Kind == 2)
  421. {
  422. CouponCount = 2 * order.BuyCount;
  423. }
  424. UserRankItem orderUser = GetUserLevel(order.UserId);
  425. if(orderUser.UserLevel == 0)
  426. {
  427. }
  428. string ParentNav = orderUser.ParentNav + "," + orderUser.Id + ",";
  429. string[] ParentNavList = ParentNav.Trim(',').Replace(",,", ",").Split(',');
  430. Array.Reverse(ParentNavList);
  431. int index = 0;
  432. bool DirectPrizeFlag = false; //推荐奖励发放标识
  433. bool BackAccountFlag = false; //备用金返余额标识
  434. bool BigLeaderFlag = false; //大盟主标记
  435. decimal BuyPrize = 0; //购机奖励
  436. foreach(string ParentId in ParentNavList)
  437. {
  438. UserRankItem parentUser = GetUserLevel(int.Parse(ParentId));
  439. index += 1;
  440. if(index == 1 && (orderUser.LeaderLevel > 0 || orderUser.OperateLevel > 0) && !DirectPrizeFlag)
  441. {
  442. DirectPrizeFlag = true;
  443. }
  444. if(index > 1)
  445. {
  446. if(Utils.Instance.IsStandardUser(parentUser.Id) && !DirectPrizeFlag)
  447. {
  448. DirectPrizeFlag = true;
  449. }
  450. }
  451. if(parentUser.AgoLeaderLevel > 0 && CheckLeaderReserve(db, order.BuyCount, parentUser.Id))
  452. {
  453. //购机奖
  454. if(parentUser.LeaderLevel > 0)
  455. {
  456. decimal CurBuyPrize = GetBuyPrize(parentUser, order.UserId);
  457. decimal GetPrize = CurBuyPrize - BuyPrize;
  458. if(GetPrize > 0)
  459. {
  460. bool PrizeFlag = true;
  461. int ChangeType = 118;
  462. if(parentUser.OperateLevel == 1)
  463. {
  464. ChangeType = 120;
  465. }
  466. if(parentUser.OperateLevel > 1)
  467. {
  468. ChangeType = 128;
  469. if(function.CheckNull(RedisDbconn.Instance.Get<string>("YingXunUser")).Contains("," + orderUser.Id + ","))
  470. {
  471. PrizeFlag = false;
  472. }
  473. }
  474. if(PrizeFlag && !db.UserAccountRecord.Any(m => m.QueryCount == order.Id && m.ChangeType == ChangeType))
  475. {
  476. // OpAccount(db, order.Id, parentUser.Id, GetPrize, order.BuyCount, ChangeType);
  477. }
  478. BuyPrize = CurBuyPrize;
  479. }
  480. }
  481. if(!BackAccountFlag)
  482. {
  483. BackAccountFlag = true;
  484. }
  485. }
  486. else if(parentUser.OperateLevel > 0 && CheckOpReserve(opdb, order.BuyCount, parentUser.Id))
  487. {
  488. //购机奖
  489. decimal CurBuyPrize = GetBuyPrize(parentUser, order.UserId);
  490. decimal GetPrize = CurBuyPrize - BuyPrize;
  491. if(GetPrize > 0)
  492. {
  493. int ChangeType = 120;
  494. if(parentUser.OperateLevel > 1)
  495. {
  496. ChangeType = 128;
  497. }
  498. BuyPrize = CurBuyPrize;
  499. }
  500. if(!BackAccountFlag)
  501. {
  502. BackAccountFlag = true;
  503. }
  504. }
  505. }
  506. }
  507. }
  508. db.Dispose();
  509. opdb.Dispose();
  510. }
  511. /// <summary>
  512. /// 获取创客各种等级
  513. /// </summary>
  514. /// <param name="db"></param>
  515. /// <param name="UserId"></param>
  516. /// <returns></returns>
  517. public UserRankItem GetUserLevel(int UserId)
  518. {
  519. WebCMSEntities db = new WebCMSEntities();
  520. OpModels.WebCMSEntities opdb = new OpModels.WebCMSEntities();
  521. UserRankItem dic = new UserRankItem();
  522. DateTime now = DateTime.Now;
  523. Users user = db.Users.FirstOrDefault(m => m.Id == UserId && m.AuthFlag == 1 && m.Status > -1) ?? new Users();
  524. UserRankWhite userWhite = db.UserRankWhite.FirstOrDefault(m => m.Id == UserId && m.UpdateDate > now) ?? new UserRankWhite();
  525. Leaders leader = db.Leaders.FirstOrDefault(m => m.Id == UserId) ?? new Leaders();
  526. dic.UserLevel = userWhite.Rank > user.UserLevel ? userWhite.Rank : user.UserLevel;
  527. if(leader.ExpiredDate > now)
  528. {
  529. dic.LeaderLevel = leader.LeaderLevel;
  530. }
  531. dic.AgoLeaderLevel = leader.LeaderLevel;
  532. OpModels.SysAdmin sys = opdb.SysAdmin.FirstOrDefault(m => m.UserId == UserId) ?? new OpModels.SysAdmin();
  533. if(sys.ExpireDate > now)
  534. {
  535. dic.OperateLevel = user.UserType;
  536. dic.UserType = user.UserType;
  537. }
  538. dic.MerchantType = user.MerchantType;
  539. dic.Id = user.Id;
  540. dic.MakerCode = user.MakerCode;
  541. dic.RealName = user.RealName;
  542. dic.ParentUserId = user.ParentUserId;
  543. dic.ParentNav = user.ParentNav;
  544. db.Dispose();
  545. opdb.Dispose();
  546. return dic;
  547. }
  548. public UserRankItem GetUserLevel2(int UserId, DateTime OrderTime)
  549. {
  550. WebCMSEntities db = new WebCMSEntities();
  551. OpModels.WebCMSEntities opdb = new OpModels.WebCMSEntities();
  552. UserRankItem dic = new UserRankItem();
  553. Users user = db.Users.FirstOrDefault(m => m.Id == UserId && m.AuthFlag == 1 && m.Status > -1) ?? new Users();
  554. UserRankWhite userWhite = db.UserRankWhite.FirstOrDefault(m => m.Id == UserId && m.UpdateDate > OrderTime) ?? new UserRankWhite();
  555. Leaders leader = db.Leaders.FirstOrDefault(m => m.Id == UserId) ?? new Leaders();
  556. dic.UserLevel = userWhite.Rank > user.UserLevel ? userWhite.Rank : user.UserLevel;
  557. if(leader.ExpiredDate > OrderTime && leader.LastBuyDate < OrderTime)
  558. {
  559. dic.LeaderLevel = leader.LeaderLevel;
  560. }
  561. dic.AgoLeaderLevel = leader.LeaderLevel;
  562. OpModels.SysAdmin sys = opdb.SysAdmin.FirstOrDefault(m => m.UserId == UserId) ?? new OpModels.SysAdmin();
  563. if(sys.ExpireDate > OrderTime && sys.CreateDate < OrderTime)
  564. {
  565. dic.OperateLevel = user.UserType;
  566. dic.UserType = user.UserType;
  567. }
  568. dic.MerchantType = user.MerchantType;
  569. dic.Id = user.Id;
  570. dic.MakerCode = user.MakerCode;
  571. dic.RealName = user.RealName;
  572. dic.ParentUserId = user.ParentUserId;
  573. dic.ParentNav = user.ParentNav;
  574. db.Dispose();
  575. opdb.Dispose();
  576. return dic;
  577. }
  578. /// <summary>
  579. /// 直推奖励
  580. /// </summary>
  581. /// <param name="db"></param>
  582. /// <param name="OrderId"></param>
  583. /// <param name="UserId"></param>
  584. /// <param name="Count"></param>
  585. public void DirectPrize(WebCMSEntities db, int OrderId, int UserId, int Count = 1)
  586. {
  587. UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId);
  588. if (account == null)
  589. {
  590. account = db.UserAccount.Add(new UserAccount()
  591. {
  592. Id = UserId,
  593. UserId = UserId,
  594. }).Entity;
  595. db.SaveChanges();
  596. }
  597. decimal BeforeTotalAmount = account.TotalAmount; //变更前总金额
  598. decimal BeforeFreezeAmount = account.FreezeAmount; //变更前冻结金额
  599. decimal BeforeBalanceAmount = account.BalanceAmount; //变更前余额
  600. account.BalanceAmount += 100 * Count;
  601. account.TotalAmount += 100 * Count;
  602. decimal AfterTotalAmount = account.TotalAmount; //变更后总金额
  603. decimal AfterFreezeAmount = account.FreezeAmount; //变更后冻结金额
  604. decimal AfterBalanceAmount = account.BalanceAmount; //变更后余额
  605. UserAccountRecord userAccountRecord = db.UserAccountRecord.Add(new UserAccountRecord()
  606. {
  607. CreateDate = DateTime.Now,
  608. UpdateDate = DateTime.Now,
  609. UserId = UserId, //创客
  610. ChangeType = 112, //变动类型
  611. ChangeAmount = 100 * Count, //变更金额
  612. BeforeTotalAmount = BeforeTotalAmount, //变更前总金额
  613. AfterTotalAmount = AfterTotalAmount, //变更后总金额
  614. BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额
  615. AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额
  616. BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额
  617. AfterBalanceAmount = AfterBalanceAmount, //变更后余额
  618. QueryCount = OrderId,
  619. }).Entity;
  620. db.SaveChanges();
  621. //发送APP推送消息
  622. Utils.Instance.PrizePush(UserId, 100 * Count);
  623. }
  624. /// <summary>
  625. /// 判断盟主储蓄金足够
  626. /// </summary>
  627. /// <param name="db"></param>
  628. /// <param name="Count"></param>
  629. /// <param name="UserId"></param>
  630. /// <returns></returns>
  631. public bool CheckLeaderReserve(WebCMSEntities db, int Count, int UserId)
  632. {
  633. UserAccount acccount = db.UserAccount.FirstOrDefault(m => m.Id == UserId) ?? new UserAccount();
  634. if(acccount.LeaderReserve >= 400 * Count)
  635. {
  636. return true;
  637. }
  638. return false;
  639. }
  640. /// <summary>
  641. /// 判断运营中心/合伙人额度足够
  642. /// </summary>
  643. /// <param name="db"></param>
  644. /// <param name="Count"></param>
  645. /// <param name="UserId"></param>
  646. /// <returns></returns>
  647. public bool CheckOpReserve(OpModels.WebCMSEntities db, int Count, int UserId)
  648. {
  649. OpModels.UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId) ?? new OpModels.UserAccount();
  650. if(account.TotalAmt >= 400 * Count)
  651. {
  652. return true;
  653. }
  654. return false;
  655. }
  656. public bool CheckOpReserve(OpModels.WebCMSEntities db, decimal Amt, int UserId)
  657. {
  658. OpModels.UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId) ?? new OpModels.UserAccount();
  659. if(account.TotalAmt >= Amt)
  660. {
  661. return true;
  662. }
  663. return false;
  664. }
  665. /// <summary>
  666. /// 扣减/增加盟主储蓄金
  667. /// </summary>
  668. /// <param name="db"></param>
  669. /// <param name="OrderId"></param>
  670. /// <param name="UserId"></param>
  671. /// <param name="Money"></param>
  672. /// <param name="ChangeType"></param>
  673. /// <param name="SourceUserId"></param>
  674. /// <param name="Remark"></param>
  675. public int OpReserve(WebCMSEntities db, int OrderId, int UserId, decimal Money, int ChangeType, int SourceUserId = 0, string Remark = "储备金购买")
  676. {
  677. UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId);
  678. if (account == null)
  679. {
  680. account = db.UserAccount.Add(new UserAccount()
  681. {
  682. Id = UserId,
  683. UserId = UserId,
  684. }).Entity;
  685. db.SaveChanges();
  686. }
  687. decimal BeforeAmount = account.LeaderReserve; //变更前总金额
  688. if(ChangeType == 1)
  689. {
  690. account.LeaderReserve += Money;
  691. }
  692. else
  693. {
  694. account.LeaderReserve -= Money;
  695. }
  696. decimal AfterAmount = account.LeaderReserve; //变更后总金额
  697. LeaderReserveRecord add = db.LeaderReserveRecord.Add(new LeaderReserveRecord()
  698. {
  699. CreateDate = DateTime.Now,
  700. ChangeType = ChangeType,
  701. OrderId = OrderId,
  702. Remark = Remark,
  703. AfterAmt = AfterAmount,
  704. BeforeAmt = BeforeAmount,
  705. ChangeAmt = Money,
  706. TradeDate = DateTime.Now.ToString("yyyyMMdd"),
  707. TradeMonth = DateTime.Now.ToString("yyyyMM"),
  708. UserId = UserId,
  709. SourceUserId = SourceUserId,
  710. Sort = GetLeaderReserveRecordType(Remark),
  711. }).Entity;
  712. db.SaveChanges();
  713. return add.Id;
  714. }
  715. private int GetLeaderReserveRecordType(string Remark)
  716. {
  717. Dictionary<int, string> data = new Dictionary<int, string>();
  718. data.Add(11, "兑换机具券,机具券兑换,系统增加(盟主储蓄金),系统扣减(盟主储蓄金),储备金购买");
  719. data.Add(12, "系统增加(可提现余额),系统扣减(可提现余额)");
  720. data.Add(13, "推荐大盟主,推荐小盟主,商城购机,购机奖励");
  721. var item = data.FirstOrDefault(m => m.Value.Contains(Remark));
  722. if(item.Key > 0)
  723. {
  724. return item.Key;
  725. }
  726. return 0;
  727. }
  728. /// <summary>
  729. /// 操作盟主可提现余额
  730. /// </summary>
  731. /// <param name="db"></param>
  732. /// <param name="order"></param>
  733. /// <param name="UserId"></param>
  734. /// <param name="Money"></param>
  735. /// <param name="Count"></param>
  736. /// <param name="Kind"></param>
  737. public void OpLeaderAccount(WebCMSEntities db, Orders order, int UserId, decimal Money, int Count = 1, int ReserveRecordId = 0)
  738. {
  739. UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId);
  740. if (account == null)
  741. {
  742. account = db.UserAccount.Add(new UserAccount()
  743. {
  744. Id = UserId,
  745. UserId = UserId,
  746. }).Entity;
  747. db.SaveChanges();
  748. }
  749. int ChangeType = 0;
  750. if(Money == 400)
  751. {
  752. ChangeType = 117;
  753. }
  754. decimal BeforeLeaderBalanceAmount = account.LeaderBalanceAmount; //变更前余额
  755. account.LeaderBalanceAmount += Money * Count;
  756. decimal AfterLeaderBalanceAmount = account.LeaderBalanceAmount; //变更后余额
  757. LeaderAccountRecord leaderAccountRecord = db.LeaderAccountRecord.Add(new LeaderAccountRecord()
  758. {
  759. CreateDate = DateTime.Now,
  760. UpdateDate = DateTime.Now,
  761. UserId = UserId, //创客
  762. ChangeType = ChangeType, //变动类型
  763. ChangeAmount = Money * Count, //变更金额
  764. BeforeBalanceAmount = BeforeLeaderBalanceAmount, //变更前余额
  765. AfterBalanceAmount = AfterLeaderBalanceAmount, //变更后余额
  766. QueryCount = order.Id,
  767. Sort = order.UserId,
  768. }).Entity;
  769. db.SaveChanges();
  770. if(ReserveRecordId > 0)
  771. {
  772. LeaderReserveRecord edit = db.LeaderReserveRecord.FirstOrDefault(m => m.Id == ReserveRecordId);
  773. if(edit != null)
  774. {
  775. edit.AccountRecordId = leaderAccountRecord.Id;
  776. db.SaveChanges();
  777. }
  778. }
  779. }
  780. /// <summary>
  781. /// 操作余额
  782. /// </summary>
  783. /// <param name="db"></param>
  784. /// <param name="order"></param>
  785. /// <param name="UserId"></param>
  786. /// <param name="Money"></param>
  787. /// <param name="Count"></param>
  788. public void OpAccount(WebCMSEntities db, int OrderId, int UserId, decimal Money, int Count = 1, int ChangeType = 0, int Kind = 0)
  789. {
  790. UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId);
  791. if (account == null)
  792. {
  793. account = db.UserAccount.Add(new UserAccount()
  794. {
  795. Id = UserId,
  796. UserId = UserId,
  797. }).Entity;
  798. db.SaveChanges();
  799. }
  800. decimal BeforeTotalAmount = account.TotalAmount; //变更前总金额
  801. decimal BeforeFreezeAmount = account.FreezeAmount; //变更前冻结金额
  802. decimal BeforeBalanceAmount = account.BalanceAmount; //变更前余额
  803. account.BalanceAmount += Money * Count;
  804. account.TotalAmount += Money * Count;
  805. decimal AfterTotalAmount = account.TotalAmount; //变更后总金额
  806. decimal AfterFreezeAmount = account.FreezeAmount; //变更后冻结金额
  807. decimal AfterBalanceAmount = account.BalanceAmount; //变更后余额
  808. UserAccountRecord userAccountRecord = db.UserAccountRecord.Add(new UserAccountRecord()
  809. {
  810. CreateDate = DateTime.Now,
  811. UpdateDate = DateTime.Now,
  812. UserId = UserId, //创客
  813. ChangeType = ChangeType, //变动类型
  814. ChangeAmount = Money * Count, //变更金额
  815. BeforeTotalAmount = BeforeTotalAmount, //变更前总金额
  816. AfterTotalAmount = AfterTotalAmount, //变更后总金额
  817. BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额
  818. AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额
  819. BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额
  820. AfterBalanceAmount = AfterBalanceAmount, //变更后余额
  821. QueryCount = OrderId,
  822. Kind = Kind,
  823. }).Entity;
  824. db.SaveChanges();
  825. //发送APP推送消息
  826. Utils.Instance.PrizePush(UserId, Money * Count);
  827. }
  828. /// <summary>
  829. /// 操作运营中心/合伙人额度(TotalAmt未使用额度,ValidForGetAmount可提现额度)
  830. /// </summary>
  831. /// <param name="db"></param>
  832. /// <param name="UserId"></param>
  833. /// <param name="Money"></param>
  834. /// <param name="OperateType">(1增加,2减少)</param>
  835. /// <param name="AmountType">(1未使用额度,2可提现额度)</param>
  836. /// <param name="Remark"></param>
  837. /// <param name="record"></param>
  838. public void OperateAmountChange(OpModels.WebCMSEntities db, int UserId, decimal Money, int OperateType, int AmountType, string Remark = "", bool record = false, int OrderId = 0)
  839. {
  840. OpModels.UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId);
  841. if (account == null)
  842. {
  843. account = db.UserAccount.Add(new OpModels.UserAccount()
  844. {
  845. Id = UserId,
  846. UserId = UserId,
  847. }).Entity;
  848. db.SaveChanges();
  849. }
  850. decimal BeforeAmount = account.ValidAmount + account.TotalAmt + account.ValidForGetAmount; //变更前总金额
  851. if(OperateType == 1)
  852. {
  853. if(AmountType == 1)
  854. {
  855. account.TotalAmt += Money;
  856. }
  857. else if(AmountType == 2)
  858. {
  859. account.ValidForGetAmount += Money;
  860. }
  861. else
  862. {
  863. account.ValidAmount += Money;
  864. }
  865. }
  866. else
  867. {
  868. if(AmountType == 1)
  869. {
  870. account.TotalAmt -= Money;
  871. }
  872. else if(AmountType == 2)
  873. {
  874. account.ValidForGetAmount -= Money;
  875. }
  876. else
  877. {
  878. account.ValidAmount -= Money;
  879. }
  880. }
  881. decimal AfterAmount = account.ValidAmount + account.TotalAmt + account.ValidForGetAmount; //变更后总金额
  882. if(record)
  883. {
  884. OpModels.AmountRecord add = db.AmountRecord.Add(new OpModels.AmountRecord()
  885. {
  886. CreateDate = DateTime.Now,
  887. UpdateDate = DateTime.Now,
  888. OperateType = OperateType,
  889. AfterAmount = AfterAmount,
  890. AfterValidForGetAmount = account.ValidForGetAmount,
  891. AfterTotalAmt = account.TotalAmt,
  892. AfterValidAmount = account.ValidAmount,
  893. BeforeAmount = BeforeAmount,
  894. UseAmount = Money,
  895. UserId = UserId,
  896. SeoDescription = Remark,
  897. Version = AmountType,
  898. QueryCount = OrderId,
  899. }).Entity;
  900. OpModels.AmountChangeRecord amountChangeRecord = db.AmountChangeRecord.Add(new OpModels.AmountChangeRecord()
  901. {
  902. AmountType = 2,//1 未使用额度 2 可提现额度 3 关联分仓额度
  903. CreateDate = DateTime.Now,
  904. Title = Remark,
  905. UserId = UserId, //运营中心Id
  906. BeforeAmount = BeforeAmount,//使用前剩余额度
  907. AfterAmount = AfterAmount,//使用后剩余额度
  908. ChangeAmount = Money,//操作金额
  909. OperateType = OperateType,//操作类别
  910. Sort = OrderId,
  911. }).Entity;
  912. }
  913. db.SaveChanges();
  914. }
  915. /// <summary>
  916. /// 给券设置大盟主标记
  917. /// </summary>
  918. /// <param name="db"></param>
  919. /// <param name="LeaderUserId"></param>
  920. /// <param name="Count"></param>
  921. /// <param name="couponIds"></param>
  922. public int SetPosCouponLeaderFlag(WebCMSEntities db, int LeaderUserId, int Count, List<int> couponIds)
  923. {
  924. int SetCount = 0;
  925. UserAccount pacccount = db.UserAccount.FirstOrDefault(m => m.Id == LeaderUserId) ?? new UserAccount();
  926. foreach(int couponId in couponIds)
  927. {
  928. PosCoupons coupon = db.PosCoupons.FirstOrDefault(m => m.Id == couponId);
  929. if(coupon != null && pacccount.LeaderReserve >= 400 * Count)
  930. {
  931. coupon.LeaderUserId = LeaderUserId;
  932. SetCount += 1;
  933. }
  934. }
  935. db.SaveChanges();
  936. return SetCount;
  937. }
  938. /// <summary>
  939. /// 获取购机奖金额
  940. /// </summary>
  941. /// <param name="user"></param>
  942. /// <returns></returns>
  943. public decimal GetBuyPrize(UserRankItem user, int OrderUserId = 0)
  944. {
  945. if(user.OperateLevel == 1) return 100;
  946. if(user.OperateLevel == 2)
  947. {
  948. if(!TradeTeamCheck(OrderUserId))
  949. {
  950. return 100;
  951. }
  952. return 160;
  953. }
  954. if(user.OperateLevel == 3) return 180;
  955. if(user.OperateLevel == 4) return 200;
  956. if(user.LeaderLevel > 0) return 100;
  957. return 0;
  958. }
  959. public bool TradeTeamCheck(int UserId)
  960. {
  961. bool op = true;
  962. if(UserId == 0)
  963. {
  964. return op;
  965. }
  966. function.WriteLog("UserId:" + UserId, "训练营判断参与活动");
  967. WebCMSEntities maindb = new WebCMSEntities();
  968. Users muser = maindb.Users.FirstOrDefault(m => m.Id == UserId) ?? new Users();
  969. string ParentNav = muser.ParentNav + "," + UserId + ",";
  970. string[] ParentNavList = ParentNav.Replace(",,", ",").Trim(',').Split(',');
  971. List<int> UserIds = new List<int>();
  972. foreach(string IdString in ParentNavList)
  973. {
  974. UserIds.Add(int.Parse(function.CheckInt(IdString)));
  975. }
  976. JavaModels.WebCMSEntities db = new JavaModels.WebCMSEntities();
  977. var users = db.KxsCampUser.Where(m => UserIds.Contains(m.UserId)).ToList();
  978. foreach(var user in users)
  979. {
  980. DateTime now = DateTime.Now;
  981. // JavaModels.KxsCamp camp = db.KxsCamp.FirstOrDefault(m => m.Id == user.CampId && m.StartTime <= now && m.EndTime >= now);
  982. JavaModels.KxsCamp camp = db.KxsCamp.FirstOrDefault(m => m.Id == user.CampId && m.Status == 1);
  983. if(camp != null)
  984. {
  985. function.WriteLog("活动Id:" + camp.Id, "训练营判断参与活动");
  986. op = false;
  987. break;
  988. }
  989. }
  990. maindb.Dispose();
  991. db.Dispose();
  992. function.WriteLog("\n\n\n", "训练营判断参与活动");
  993. return op;
  994. }
  995. /// <summary>
  996. /// 获取可提现金额
  997. /// </summary>
  998. /// <param name="user"></param>
  999. /// <returns></returns>
  1000. public decimal GetWithdrawMoney(UserRankItem user)
  1001. {
  1002. if(user.OperateLevel == 1) return 400;
  1003. // if(user.OperateLevel == 2) return 340;
  1004. // if(user.OperateLevel == 3) return 320;
  1005. // if(user.OperateLevel == 4) return 300;
  1006. if(user.OperateLevel == 2) return 400;
  1007. if(user.OperateLevel == 3) return 400;
  1008. if(user.OperateLevel == 4) return 400;
  1009. if(user.AgoLeaderLevel > 0) return 400;
  1010. return 0;
  1011. }
  1012. /// <summary>
  1013. /// 预设职级
  1014. /// </summary>
  1015. /// <param name="db"></param>
  1016. /// <param name="UserId">创客Id</param>
  1017. /// <param name="Rank">职级</param>
  1018. /// <param name="ExpiredDate">过期时间</param>
  1019. public void PreUserLevel(WebCMSEntities db, int UserId, int Rank, DateTime ExpiredDate)
  1020. {
  1021. UserRankWhite rank = db.UserRankWhite.FirstOrDefault(m => m.Id == UserId);
  1022. if(rank == null)
  1023. {
  1024. rank = db.UserRankWhite.Add(new UserRankWhite()
  1025. {
  1026. CreateDate = DateTime.Now, //设置时间
  1027. UserId = UserId, //用户
  1028. Id = UserId,
  1029. }).Entity;
  1030. db.SaveChanges();
  1031. }
  1032. rank.Rank = Rank;
  1033. rank.UpdateDate = ExpiredDate;
  1034. db.SaveChanges();
  1035. }
  1036. }
  1037. }