PosCouponPrizeService.cs 68 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406
  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. Utils.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. Utils.Instance.PrizeRecord(2, order.OrderNo, "条件:商品id是(10,11,77,78,79,91);当前订单商品Id:" + order.ProductId + "");
  60. //判断是否是指定商品
  61. if(ChkIds.Contains(order.ProductId))
  62. {
  63. Utils.Instance.PrizeRecord(2, order.OrderNo, "满足条件");
  64. int Kind = 0;
  65. if (order.ProductId == 10)
  66. {
  67. Kind = 1;
  68. }
  69. else if (order.ProductId == 11)
  70. {
  71. Kind = 2;
  72. }
  73. int CouponCount = 0;
  74. if(Kind == 1)
  75. {
  76. CouponCount = 3 * order.BuyCount;
  77. }
  78. else if(Kind == 2)
  79. {
  80. CouponCount = 2 * order.BuyCount;
  81. }
  82. UserRankItem orderUser = GetUserLevel(order.UserId, false);
  83. if(orderUser.UserLevel == 0)
  84. {
  85. PreUserLevel(db, order.UserId, 1, DateTime.Parse("2025-01-01 00:00:00"));
  86. }
  87. List<string> codes = function.CheckNull(order.SnNos).Split(',').ToList();
  88. string ParentNav = orderUser.ParentNav + "," + orderUser.Id + ",";
  89. string[] ParentNavList = ParentNav.Trim(',').Replace(",,", ",").Split(',');
  90. Array.Reverse(ParentNavList);
  91. int index = 0;
  92. bool DirectPrizeFlag = false; //推荐奖励发放标识
  93. int BuyPrizeFlag = 0; //购机奖励发放标识
  94. bool BackAccountFlag = false; //备用金返余额标识
  95. bool BigLeaderFlag = false; //大盟主标记
  96. decimal BuyPrize = 0; //购机奖励
  97. Utils.Instance.PrizeRecord(2, order.OrderNo, "开始向上递归查找");
  98. foreach(string ParentId in ParentNavList)
  99. {
  100. UserRankItem parentUser = GetUserLevel(int.Parse(ParentId), index > 0);
  101. if(parentUser.Id > 0)
  102. {
  103. Utils.Instance.PrizeRecord(2, order.OrderNo, "创客编号:" + parentUser.MakerCode + ";创客姓名:" + parentUser.RealName + ";");
  104. index += 1;
  105. if(index == 1)
  106. {
  107. Utils.Instance.PrizeRecord(2, order.OrderNo, "条件:下单人是盟主;下单人盟主等级:" + orderUser.LeaderLevel + "");
  108. Utils.Instance.PrizeRecord(2, order.OrderNo, "条件:下单人是运营中心或合伙人;下单人合伙人等级:" + orderUser.OperateLevel + "");
  109. Utils.Instance.PrizeRecord(2, order.OrderNo, "条件:推荐奖励是否已发放;当前状态:" + DirectPrizeFlag + "");
  110. }
  111. if(index == 1 && (orderUser.LeaderLevel > 0 || orderUser.OperateLevel > 0) && !DirectPrizeFlag)
  112. {
  113. Utils.Instance.PrizeRecord(2, order.OrderNo, "满足条件,发放推荐奖励给下单人");
  114. DirectPrize(db, order.Id, order.UserId, order.BuyCount);
  115. DirectPrizeFlag = true;
  116. }
  117. if(index > 1)
  118. {
  119. bool IsStandardUser = Utils.Instance.IsStandardUser(parentUser.Id);
  120. Utils.Instance.PrizeRecord(2, order.OrderNo, "条件:上级是有效创客;是否有效创客:" + IsStandardUser + "");
  121. Utils.Instance.PrizeRecord(2, order.OrderNo, "条件:推荐奖励是否已发放;当前状态:" + DirectPrizeFlag + "");
  122. if(IsStandardUser && !DirectPrizeFlag)
  123. {
  124. Utils.Instance.PrizeRecord(2, order.OrderNo, "满足条件,发放推荐奖励给上级");
  125. DirectPrize(db, order.Id, parentUser.Id, order.BuyCount);
  126. DirectPrizeFlag = true;
  127. }
  128. }
  129. Utils.Instance.PrizeRecord(2, order.OrderNo, "条件:创客是盟主;创客盟主等级:" + parentUser.AgoLeaderLevel + "");
  130. Utils.Instance.PrizeRecord(2, order.OrderNo, "条件:盟主储备金是否充足;");
  131. Utils.Instance.PrizeRecord(2, order.OrderNo, "条件:创客是运营中心或合伙人;合伙人等级:" + parentUser.AgoLeaderLevel + "");
  132. Utils.Instance.PrizeRecord(2, order.OrderNo, "条件:合伙人未使用额度是否充足;");
  133. if(parentUser.AgoLeaderLevel > 0 && CheckLeaderReserve(db, order.BuyCount, parentUser.Id))
  134. {
  135. Utils.Instance.PrizeRecord(2, order.OrderNo, "满足条件,发放购机奖");
  136. //购机奖
  137. if(parentUser.LeaderLevel > 0)
  138. {
  139. decimal CurBuyPrize = GetBuyPrize(parentUser, order);
  140. decimal GetPrize = CurBuyPrize - BuyPrize;
  141. Utils.Instance.PrizeRecord(2, order.OrderNo, "发放金额:" + GetPrize);
  142. if(GetPrize > 0 && BuyPrizeFlag < 2)
  143. {
  144. bool PrizeFlag = true;
  145. int ChangeType = 118;
  146. if(parentUser.OperateLevel == 1)
  147. {
  148. ChangeType = 120;
  149. }
  150. if(parentUser.OperateLevel > 1)
  151. {
  152. ChangeType = 128;
  153. if(function.CheckNull(RedisDbconn.Instance.Get<string>("YingXunUser")).Contains("," + orderUser.Id + ","))
  154. {
  155. PrizeFlag = false;
  156. }
  157. }
  158. if(PrizeFlag)
  159. {
  160. OpAccount(db, order.Id, parentUser.Id, CurBuyPrize - BuyPrize, order.BuyCount, ChangeType);
  161. if(GetPrize == 160) BuyPrizeFlag = 2;
  162. else if(GetPrize == 60) BuyPrizeFlag = 2;
  163. else BuyPrizeFlag = 1;
  164. }
  165. BuyPrize = CurBuyPrize;
  166. }
  167. if(parentUser.OperateLevel == 2 && CurBuyPrize == 100) BuyPrizeFlag = 2;
  168. }
  169. else if(parentUser.OperateLevel > 0 && CheckOpReserve(opdb, order.BuyCount, parentUser.Id) && BuyPrizeFlag < 2)
  170. {
  171. Utils.Instance.PrizeRecord(2, order.OrderNo, "满足条件,发放购机奖");
  172. //购机奖
  173. decimal CurBuyPrize = GetBuyPrize(parentUser, order);
  174. decimal GetPrize = CurBuyPrize - BuyPrize;
  175. Utils.Instance.PrizeRecord(2, order.OrderNo, "发放金额:" + GetPrize);
  176. if(GetPrize > 0)
  177. {
  178. int ChangeType = 120;
  179. if(parentUser.OperateLevel > 1)
  180. {
  181. ChangeType = 128;
  182. }
  183. OpAccount(db, order.Id, parentUser.Id, GetPrize, order.BuyCount, ChangeType);
  184. BuyPrize = CurBuyPrize;
  185. if(GetPrize == 160) BuyPrizeFlag = 2;
  186. else if(GetPrize == 60) BuyPrizeFlag = 2;
  187. else BuyPrizeFlag = 1;
  188. }
  189. if(parentUser.OperateLevel == 2 && CurBuyPrize == 100) BuyPrizeFlag = 2;
  190. if(!BackAccountFlag)
  191. {
  192. BackAccountFlag = true;
  193. decimal GetAmount = GetWithdrawMoney(parentUser) * order.BuyCount;
  194. //扣减备用金
  195. // OperateAmountChange(opdb, parentUser.Id, GetAmount, 2, 1, "商城购机", true, order.Id);
  196. // //返回到余额
  197. // OperateAmountChange(opdb, parentUser.Id, GetAmount, 1, 2, "商城购机", true, order.Id);
  198. OpAmountItem item = new OpAmountItem()
  199. {
  200. UserId = parentUser.Id,
  201. OperateType = 0,
  202. ChangeType = 5,
  203. Remark = "商城购机",
  204. UseAmount = GetAmount,
  205. UseValidForGetAmount = GetAmount,
  206. UseTotalAmt = GetAmount,
  207. DataType = 1,
  208. DataId = order.Id,
  209. };
  210. RedisDbconn.Instance.AddList("OperateAmountRecordServiceQueue", item);
  211. }
  212. }
  213. if(!BackAccountFlag)
  214. {
  215. BackAccountFlag = true;
  216. //扣减备用金
  217. int ReserveRecordId = OpReserve(db, order.Id, parentUser.Id, GetWithdrawMoney(parentUser) * order.BuyCount, 2, order.UserId, "购机奖励");
  218. //返回到余额
  219. OpLeaderAccount(db, order, parentUser.Id, GetWithdrawMoney(parentUser), order.BuyCount, ReserveRecordId);
  220. }
  221. //给券打大盟主标记
  222. Utils.Instance.PrizeRecord(2, order.OrderNo, "条件:创客是盟主;创客盟主等级:" + parentUser.LeaderLevel + "");
  223. Utils.Instance.PrizeRecord(2, order.OrderNo, "条件:盟主储备金是否充足;");
  224. if(parentUser.LeaderLevel == 1 && CheckLeaderReserve(db, order.BuyCount, parentUser.Id) && !BigLeaderFlag)
  225. {
  226. Utils.Instance.PrizeRecord(2, order.OrderNo, "满足小盟主条件,开始检查大盟主关联的额度");
  227. int LeaderId = CheckPosCouponLeaderFlag(db, parentUser.Id, order.BuyCount, codes);
  228. if(LeaderId > 0)
  229. {
  230. BigLeaderFlag = true;
  231. Utils.Instance.PrizeRecord(2, order.OrderNo, "满足条件,大盟主标记打给" + LeaderId);
  232. }
  233. }
  234. else if(parentUser.LeaderLevel == 2 && !BigLeaderFlag)
  235. {
  236. Utils.Instance.PrizeRecord(2, order.OrderNo, "满足大盟主条件,大盟主标记打给" + parentUser.Id + ",对应机具券:" + order.SnNos);
  237. BigLeaderFlag = true;
  238. if(!string.IsNullOrEmpty(order.SnNos))
  239. {
  240. List<int> couponIds = db.PosCoupons.Where(m => codes.Contains(m.ExchangeCode)).OrderBy(m => m.Id).Take(CouponCount).ToList().Select(m => m.Id).ToList();
  241. Utils.Instance.PrizeRecord(2, order.OrderNo, "开始打标记,数量:" + couponIds.Count);
  242. SetPosCouponLeaderFlag(db, parentUser.Id, order.BuyCount, couponIds);
  243. Utils.Instance.PrizeRecord(2, order.OrderNo, "结束打标记");
  244. }
  245. }
  246. }
  247. else if(parentUser.OperateLevel > 0 && CheckOpReserve(opdb, order.BuyCount, parentUser.Id) && BuyPrizeFlag < 2)
  248. {
  249. Utils.Instance.PrizeRecord(2, order.OrderNo, "满足条件,发放购机奖");
  250. //购机奖
  251. decimal CurBuyPrize = GetBuyPrize(parentUser, order);
  252. decimal GetPrize = CurBuyPrize - BuyPrize;
  253. Utils.Instance.PrizeRecord(2, order.OrderNo, "发放金额:" + GetPrize);
  254. if(GetPrize > 0)
  255. {
  256. int ChangeType = 120;
  257. if(parentUser.OperateLevel > 1)
  258. {
  259. ChangeType = 128;
  260. }
  261. OpAccount(db, order.Id, parentUser.Id, GetPrize, order.BuyCount, ChangeType);
  262. BuyPrize = CurBuyPrize;
  263. if(GetPrize == 160) BuyPrizeFlag = 2;
  264. else if(GetPrize == 60) BuyPrizeFlag = 2;
  265. else BuyPrizeFlag = 1;
  266. }
  267. if(parentUser.OperateLevel == 2 && CurBuyPrize == 100) BuyPrizeFlag = 2;
  268. if(!BackAccountFlag)
  269. {
  270. BackAccountFlag = true;
  271. decimal GetAmount = GetWithdrawMoney(parentUser) * order.BuyCount;
  272. //扣减备用金
  273. // OperateAmountChange(opdb, parentUser.Id, GetAmount, 2, 1, "商城购机", true, order.Id);
  274. // //返回到余额
  275. // OperateAmountChange(opdb, parentUser.Id, GetAmount, 1, 2, "商城购机", true, order.Id);
  276. OpAmountItem item = new OpAmountItem()
  277. {
  278. UserId = parentUser.Id,
  279. OperateType = 0,
  280. ChangeType = 5,
  281. Remark = "商城购机",
  282. UseAmount = GetAmount,
  283. UseValidForGetAmount = GetAmount,
  284. UseTotalAmt = GetAmount,
  285. DataType = 1,
  286. DataId = order.Id,
  287. };
  288. RedisDbconn.Instance.AddList("OperateAmountRecordServiceQueue", item);
  289. }
  290. }
  291. }
  292. }
  293. //发放奖励MQ
  294. PrizeSetHelper.Do("3", order.OrderNo);
  295. }
  296. }
  297. db.Dispose();
  298. opdb.Dispose();
  299. }
  300. public void AddPrize(int OrderId)
  301. {
  302. WebCMSEntities db = new WebCMSEntities();
  303. OpModels.WebCMSEntities opdb = new OpModels.WebCMSEntities();
  304. Orders order = db.Orders.FirstOrDefault(m => m.Id == OrderId);
  305. if(order != null)
  306. {
  307. List<int> ChkIds = new List<int>(); //机具券商品Id集合
  308. ChkIds.Add(10);
  309. ChkIds.Add(11);
  310. ChkIds.Add(77);
  311. ChkIds.Add(78);
  312. ChkIds.Add(79);
  313. ChkIds.Add(92);
  314. //判断是否是指定商品
  315. if(ChkIds.Contains(order.ProductId))
  316. {
  317. int Kind = 0;
  318. if (order.ProductId == 10)
  319. {
  320. Kind = 1;
  321. }
  322. else if (order.ProductId == 11)
  323. {
  324. Kind = 2;
  325. }
  326. int CouponCount = 0;
  327. if(Kind == 1)
  328. {
  329. CouponCount = 3 * order.BuyCount;
  330. }
  331. else if(Kind == 2)
  332. {
  333. CouponCount = 2 * order.BuyCount;
  334. }
  335. UserRankItem orderUser = GetUserLevel(order.UserId, false);
  336. if(orderUser.UserLevel == 0)
  337. {
  338. PreUserLevel(db, order.UserId, 1, DateTime.Parse("2025-01-01 00:00:00"));
  339. }
  340. List<string> codes = function.CheckNull(order.SnNos).Split(',').ToList();
  341. string ParentNav = orderUser.ParentNav + "," + orderUser.Id + ",";
  342. string[] ParentNavList = ParentNav.Trim(',').Replace(",,", ",").Split(',');
  343. Array.Reverse(ParentNavList);
  344. int index = 0;
  345. bool DirectPrizeFlag = false; //推荐奖励发放标识
  346. int BuyPrizeFlag = 0; //购机奖励发放标识
  347. bool BackAccountFlag = false; //备用金返余额标识
  348. bool BigLeaderFlag = false; //大盟主标记
  349. decimal BuyPrize = 0; //购机奖励
  350. foreach(string ParentId in ParentNavList)
  351. {
  352. UserRankItem parentUser = GetUserLevel(int.Parse(ParentId), index > 0);
  353. if(parentUser.Id > 0)
  354. {
  355. index += 1;
  356. if(index == 1)
  357. {
  358. }
  359. if(index == 1 && (orderUser.LeaderLevel > 0 || orderUser.OperateLevel > 0) && !DirectPrizeFlag)
  360. {
  361. DirectPrize(db, order.Id, order.UserId, order.BuyCount);
  362. DirectPrizeFlag = true;
  363. }
  364. if(index > 1)
  365. {
  366. bool IsStandardUser = Utils.Instance.IsStandardUser(parentUser.Id);
  367. if(IsStandardUser && !DirectPrizeFlag)
  368. {
  369. DirectPrize(db, order.Id, parentUser.Id, order.BuyCount);
  370. DirectPrizeFlag = true;
  371. }
  372. }
  373. if(parentUser.AgoLeaderLevel > 0 && CheckLeaderReserve(db, order.BuyCount, parentUser.Id))
  374. {
  375. //购机奖
  376. if(parentUser.LeaderLevel > 0)
  377. {
  378. decimal CurBuyPrize = GetBuyPrize(parentUser, order);
  379. decimal GetPrize = CurBuyPrize - BuyPrize;
  380. if(GetPrize > 0 && BuyPrizeFlag < 2)
  381. {
  382. bool PrizeFlag = true;
  383. int ChangeType = 118;
  384. if(parentUser.OperateLevel == 1)
  385. {
  386. ChangeType = 120;
  387. }
  388. if(parentUser.OperateLevel > 1)
  389. {
  390. ChangeType = 128;
  391. if(function.CheckNull(RedisDbconn.Instance.Get<string>("YingXunUser")).Contains("," + orderUser.Id + ","))
  392. {
  393. PrizeFlag = false;
  394. }
  395. }
  396. if(PrizeFlag)
  397. {
  398. OpAccount(db, order.Id, parentUser.Id, CurBuyPrize - BuyPrize, order.BuyCount, ChangeType);
  399. if(GetPrize == 160) BuyPrizeFlag = 2;
  400. else if(GetPrize == 60) BuyPrizeFlag = 2;
  401. else BuyPrizeFlag = 1;
  402. }
  403. BuyPrize = CurBuyPrize;
  404. }
  405. if(parentUser.OperateLevel == 2 && CurBuyPrize == 100) BuyPrizeFlag = 2;
  406. }
  407. else if(parentUser.OperateLevel > 0 && CheckOpReserve(opdb, order.BuyCount, parentUser.Id) && BuyPrizeFlag < 2)
  408. {
  409. //购机奖
  410. decimal CurBuyPrize = GetBuyPrize(parentUser, order);
  411. decimal GetPrize = CurBuyPrize - BuyPrize;
  412. if(GetPrize > 0)
  413. {
  414. int ChangeType = 120;
  415. if(parentUser.OperateLevel > 1)
  416. {
  417. ChangeType = 128;
  418. }
  419. OpAccount(db, order.Id, parentUser.Id, GetPrize, order.BuyCount, ChangeType);
  420. BuyPrize = CurBuyPrize;
  421. if(GetPrize == 160) BuyPrizeFlag = 2;
  422. else if(GetPrize == 60) BuyPrizeFlag = 2;
  423. else BuyPrizeFlag = 1;
  424. }
  425. if(parentUser.OperateLevel == 2 && CurBuyPrize == 100) BuyPrizeFlag = 2;
  426. if(!BackAccountFlag)
  427. {
  428. BackAccountFlag = true;
  429. decimal GetAmount = GetWithdrawMoney(parentUser) * order.BuyCount;
  430. OpAmountItem item = new OpAmountItem()
  431. {
  432. UserId = parentUser.Id,
  433. OperateType = 0,
  434. ChangeType = 5,
  435. Remark = "商城购机",
  436. UseAmount = GetAmount,
  437. UseValidForGetAmount = GetAmount,
  438. UseTotalAmt = GetAmount,
  439. DataType = 1,
  440. DataId = order.Id,
  441. };
  442. RedisDbconn.Instance.AddList("OperateAmountRecordServiceQueue", item);
  443. }
  444. }
  445. if(!BackAccountFlag)
  446. {
  447. BackAccountFlag = true;
  448. //扣减备用金
  449. int ReserveRecordId = OpReserve(db, order.Id, parentUser.Id, GetWithdrawMoney(parentUser) * order.BuyCount, 2, order.UserId, "购机奖励");
  450. //返回到余额
  451. OpLeaderAccount(db, order, parentUser.Id, GetWithdrawMoney(parentUser), order.BuyCount, ReserveRecordId);
  452. }
  453. //给券打大盟主标记
  454. // if(parentUser.LeaderLevel == 1 && CheckLeaderReserve(db, order.BuyCount, parentUser.Id) && !BigLeaderFlag)
  455. // {
  456. // int LeaderId = CheckPosCouponLeaderFlag(db, parentUser.Id, order.BuyCount, codes);
  457. // if(LeaderId > 0)
  458. // {
  459. // BigLeaderFlag = true;
  460. // }
  461. // }
  462. // else if(parentUser.LeaderLevel == 2 && !BigLeaderFlag)
  463. // {
  464. // BigLeaderFlag = true;
  465. // if(!string.IsNullOrEmpty(order.SnNos))
  466. // {
  467. // List<int> couponIds = db.PosCoupons.Where(m => codes.Contains(m.ExchangeCode)).OrderBy(m => m.Id).Take(CouponCount).ToList().Select(m => m.Id).ToList();
  468. // SetPosCouponLeaderFlag(db, parentUser.Id, order.BuyCount, couponIds);
  469. // }
  470. // }
  471. }
  472. else if(parentUser.OperateLevel > 0 && CheckOpReserve(opdb, order.BuyCount, parentUser.Id) && BuyPrizeFlag < 2)
  473. {
  474. //购机奖
  475. decimal CurBuyPrize = GetBuyPrize(parentUser, order);
  476. decimal GetPrize = CurBuyPrize - BuyPrize;
  477. if(GetPrize > 0)
  478. {
  479. int ChangeType = 120;
  480. if(parentUser.OperateLevel > 1)
  481. {
  482. ChangeType = 128;
  483. }
  484. OpAccount(db, order.Id, parentUser.Id, GetPrize, order.BuyCount, ChangeType);
  485. BuyPrize = CurBuyPrize;
  486. if(GetPrize == 160) BuyPrizeFlag = 2;
  487. else if(GetPrize == 60) BuyPrizeFlag = 2;
  488. else BuyPrizeFlag = 1;
  489. }
  490. if(parentUser.OperateLevel == 2 && CurBuyPrize == 100) BuyPrizeFlag = 2;
  491. if(!BackAccountFlag)
  492. {
  493. BackAccountFlag = true;
  494. decimal GetAmount = GetWithdrawMoney(parentUser) * order.BuyCount;
  495. OpAmountItem item = new OpAmountItem()
  496. {
  497. UserId = parentUser.Id,
  498. OperateType = 0,
  499. ChangeType = 5,
  500. Remark = "商城购机",
  501. UseAmount = GetAmount,
  502. UseValidForGetAmount = GetAmount,
  503. UseTotalAmt = GetAmount,
  504. DataType = 1,
  505. DataId = order.Id,
  506. };
  507. RedisDbconn.Instance.AddList("OperateAmountRecordServiceQueue", item);
  508. }
  509. }
  510. }
  511. }
  512. }
  513. }
  514. db.Dispose();
  515. opdb.Dispose();
  516. }
  517. public void Start2()
  518. {
  519. Thread th = new Thread(ready2);
  520. th.IsBackground = true;
  521. th.Start();
  522. }
  523. private void ready2()
  524. {
  525. bool op = true;
  526. while (op)
  527. {
  528. string content = RedisDbconn.Instance.RPop<string>("PosCouponPrizeQueue2");
  529. if (!string.IsNullOrEmpty(content))
  530. {
  531. try
  532. {
  533. dosomething2(int.Parse(function.CheckInt(content)));
  534. }
  535. catch
  536. {
  537. }
  538. }
  539. else
  540. {
  541. Thread.Sleep(5000);
  542. }
  543. }
  544. }
  545. public void dosomething2(int OrderId)
  546. {
  547. WebCMSEntities db = new WebCMSEntities();
  548. OpModels.WebCMSEntities opdb = new OpModels.WebCMSEntities();
  549. Orders order = db.Orders.FirstOrDefault(m => m.Id == OrderId);
  550. if(order != null)
  551. {
  552. List<int> ChkIds = new List<int>(); //机具券商品Id集合
  553. ChkIds.Add(10);
  554. ChkIds.Add(11);
  555. ChkIds.Add(77);
  556. ChkIds.Add(78);
  557. ChkIds.Add(79);
  558. //判断是否是指定商品
  559. if(ChkIds.Contains(order.ProductId))
  560. {
  561. int Kind = 0;
  562. if (order.ProductId == 10)
  563. {
  564. Kind = 1;
  565. }
  566. else if (order.ProductId == 11)
  567. {
  568. Kind = 2;
  569. }
  570. int CouponCount = 0;
  571. if(Kind == 1)
  572. {
  573. CouponCount = 3 * order.BuyCount;
  574. }
  575. else if(Kind == 2)
  576. {
  577. CouponCount = 2 * order.BuyCount;
  578. }
  579. UserRankItem orderUser = GetUserLevel(order.UserId, false);
  580. if(orderUser.UserLevel == 0)
  581. {
  582. }
  583. string ParentNav = orderUser.ParentNav + "," + orderUser.Id + ",";
  584. string[] ParentNavList = ParentNav.Trim(',').Replace(",,", ",").Split(',');
  585. Array.Reverse(ParentNavList);
  586. int index = 0;
  587. bool DirectPrizeFlag = false; //推荐奖励发放标识
  588. bool BackAccountFlag = false; //备用金返余额标识
  589. bool BigLeaderFlag = false; //大盟主标记
  590. decimal BuyPrize = 0; //购机奖励
  591. foreach(string ParentId in ParentNavList)
  592. {
  593. UserRankItem parentUser = GetUserLevel(int.Parse(ParentId), index > 0);
  594. index += 1;
  595. if(index == 1 && (orderUser.LeaderLevel > 0 || orderUser.OperateLevel > 0) && !DirectPrizeFlag)
  596. {
  597. DirectPrizeFlag = true;
  598. }
  599. if(index > 1)
  600. {
  601. if(Utils.Instance.IsStandardUser(parentUser.Id) && !DirectPrizeFlag)
  602. {
  603. DirectPrizeFlag = true;
  604. }
  605. }
  606. if(parentUser.AgoLeaderLevel > 0 && CheckLeaderReserve(db, order.BuyCount, parentUser.Id))
  607. {
  608. //购机奖
  609. if(parentUser.LeaderLevel > 0)
  610. {
  611. decimal CurBuyPrize = GetBuyPrize(parentUser, order);
  612. decimal GetPrize = CurBuyPrize - BuyPrize;
  613. if(GetPrize > 0)
  614. {
  615. bool PrizeFlag = true;
  616. int ChangeType = 118;
  617. if(parentUser.OperateLevel == 1)
  618. {
  619. ChangeType = 120;
  620. }
  621. if(parentUser.OperateLevel > 1)
  622. {
  623. ChangeType = 128;
  624. if(function.CheckNull(RedisDbconn.Instance.Get<string>("YingXunUser")).Contains("," + orderUser.Id + ","))
  625. {
  626. PrizeFlag = false;
  627. }
  628. }
  629. if(PrizeFlag && !db.UserAccountRecord.Any(m => m.QueryCount == order.Id && m.ChangeType == ChangeType))
  630. {
  631. // OpAccount(db, order.Id, parentUser.Id, GetPrize, order.BuyCount, ChangeType);
  632. if(GetPrize == 60) Utils.WriteLog(order.Id + " " + parentUser.Id + " " + GetPrize, "补60购机奖励");
  633. }
  634. BuyPrize = CurBuyPrize;
  635. }
  636. }
  637. if(!BackAccountFlag)
  638. {
  639. BackAccountFlag = true;
  640. }
  641. }
  642. else if(parentUser.OperateLevel > 0 && CheckOpReserve(opdb, order.BuyCount, parentUser.Id))
  643. {
  644. //购机奖
  645. decimal CurBuyPrize = GetBuyPrize(parentUser, order);
  646. decimal GetPrize = CurBuyPrize - BuyPrize;
  647. if(GetPrize > 0)
  648. {
  649. int ChangeType = 120;
  650. if(parentUser.OperateLevel > 1)
  651. {
  652. ChangeType = 128;
  653. }
  654. BuyPrize = CurBuyPrize;
  655. if(GetPrize == 60) Utils.WriteLog(order.Id + " " + parentUser.Id + " " + GetPrize, "补60购机奖励");
  656. BuyPrize = CurBuyPrize;
  657. }
  658. if(!BackAccountFlag)
  659. {
  660. BackAccountFlag = true;
  661. }
  662. }
  663. }
  664. }
  665. }
  666. db.Dispose();
  667. opdb.Dispose();
  668. }
  669. /// <summary>
  670. /// 获取创客各种等级
  671. /// </summary>
  672. /// <param name="db"></param>
  673. /// <param name="UserId"></param>
  674. /// <returns></returns>
  675. public UserRankItem GetUserLevel(int UserId, bool AuthFlag = true)
  676. {
  677. WebCMSEntities db = new WebCMSEntities();
  678. OpModels.WebCMSEntities opdb = new OpModels.WebCMSEntities();
  679. UserRankItem dic = new UserRankItem();
  680. DateTime now = DateTime.Now;
  681. Users user = db.Users.FirstOrDefault(m => m.Id == UserId && m.AuthFlag == 1 && m.Status > -1) ?? new Users();
  682. if(!AuthFlag) user = db.Users.FirstOrDefault(m => m.Id == UserId && m.Status > -1) ?? new Users();
  683. UserRankWhite userWhite = db.UserRankWhite.FirstOrDefault(m => m.Id == UserId && m.UpdateDate > now) ?? new UserRankWhite();
  684. Leaders leader = db.Leaders.FirstOrDefault(m => m.Id == UserId) ?? new Leaders();
  685. dic.UserLevel = userWhite.Rank > user.UserLevel ? userWhite.Rank : user.UserLevel;
  686. if(leader.ExpiredDate > now)
  687. {
  688. dic.LeaderLevel = leader.LeaderLevel;
  689. }
  690. dic.AgoLeaderLevel = leader.LeaderLevel;
  691. OpModels.SysAdmin sys = opdb.SysAdmin.FirstOrDefault(m => m.UserId == UserId) ?? new OpModels.SysAdmin();
  692. if(sys.ExpireDate > now)
  693. {
  694. dic.OperateLevel = user.UserType;
  695. dic.UserType = user.UserType;
  696. }
  697. dic.MerchantType = user.MerchantType;
  698. dic.Id = user.Id;
  699. dic.MakerCode = user.MakerCode;
  700. dic.RealName = user.RealName;
  701. dic.ParentUserId = user.ParentUserId;
  702. dic.ParentNav = user.ParentNav;
  703. db.Dispose();
  704. opdb.Dispose();
  705. return dic;
  706. }
  707. public UserRankItem GetUserLevel2(int UserId, DateTime OrderTime, bool AuthFlag = true)
  708. {
  709. WebCMSEntities db = new WebCMSEntities();
  710. OpModels.WebCMSEntities opdb = new OpModels.WebCMSEntities();
  711. UserRankItem dic = new UserRankItem();
  712. Users user = db.Users.FirstOrDefault(m => m.Id == UserId && m.AuthFlag == 1 && m.Status > -1) ?? new Users();
  713. if(!AuthFlag) user = db.Users.FirstOrDefault(m => m.Id == UserId && m.Status > -1) ?? new Users();
  714. UserRankWhite userWhite = db.UserRankWhite.FirstOrDefault(m => m.Id == UserId && m.UpdateDate > OrderTime) ?? new UserRankWhite();
  715. Leaders leader = db.Leaders.FirstOrDefault(m => m.Id == UserId) ?? new Leaders();
  716. dic.UserLevel = userWhite.Rank > user.UserLevel ? userWhite.Rank : user.UserLevel;
  717. if(leader.ExpiredDate > OrderTime && leader.LastBuyDate < OrderTime)
  718. {
  719. dic.LeaderLevel = leader.LeaderLevel;
  720. }
  721. dic.AgoLeaderLevel = leader.LeaderLevel;
  722. OpModels.SysAdmin sys = opdb.SysAdmin.FirstOrDefault(m => m.UserId == UserId) ?? new OpModels.SysAdmin();
  723. if(sys.ExpireDate > OrderTime && sys.CreateDate < OrderTime)
  724. {
  725. dic.OperateLevel = user.UserType;
  726. dic.UserType = user.UserType;
  727. }
  728. dic.MerchantType = user.MerchantType;
  729. dic.Id = user.Id;
  730. dic.MakerCode = user.MakerCode;
  731. dic.RealName = user.RealName;
  732. dic.ParentUserId = user.ParentUserId;
  733. dic.ParentNav = user.ParentNav;
  734. db.Dispose();
  735. opdb.Dispose();
  736. return dic;
  737. }
  738. /// <summary>
  739. /// 直推奖励
  740. /// </summary>
  741. /// <param name="db"></param>
  742. /// <param name="OrderId"></param>
  743. /// <param name="UserId"></param>
  744. /// <param name="Count"></param>
  745. public void DirectPrize(WebCMSEntities db, int OrderId, int UserId, int Count = 1)
  746. {
  747. UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId);
  748. if (account == null)
  749. {
  750. account = db.UserAccount.Add(new UserAccount()
  751. {
  752. Id = UserId,
  753. UserId = UserId,
  754. }).Entity;
  755. db.SaveChanges();
  756. }
  757. decimal BeforeTotalAmount = account.TotalAmount; //变更前总金额
  758. decimal BeforeFreezeAmount = account.FreezeAmount; //变更前冻结金额
  759. decimal BeforeBalanceAmount = account.BalanceAmount; //变更前余额
  760. account.BalanceAmount += 100 * Count;
  761. account.TotalAmount += 100 * Count;
  762. decimal AfterTotalAmount = account.TotalAmount; //变更后总金额
  763. decimal AfterFreezeAmount = account.FreezeAmount; //变更后冻结金额
  764. decimal AfterBalanceAmount = account.BalanceAmount; //变更后余额
  765. UserAccountRecord userAccountRecord = db.UserAccountRecord.Add(new UserAccountRecord()
  766. {
  767. CreateDate = DateTime.Now,
  768. UpdateDate = DateTime.Now,
  769. UserId = UserId, //创客
  770. ChangeType = 112, //变动类型
  771. ChangeAmount = 100 * Count, //变更金额
  772. BeforeTotalAmount = BeforeTotalAmount, //变更前总金额
  773. AfterTotalAmount = AfterTotalAmount, //变更后总金额
  774. BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额
  775. AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额
  776. BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额
  777. AfterBalanceAmount = AfterBalanceAmount, //变更后余额
  778. QueryCount = OrderId,
  779. }).Entity;
  780. db.SaveChanges();
  781. //发送APP推送消息
  782. Utils.Instance.PrizePush(UserId, 100 * Count);
  783. }
  784. /// <summary>
  785. /// 判断盟主储蓄金足够
  786. /// </summary>
  787. /// <param name="db"></param>
  788. /// <param name="Count"></param>
  789. /// <param name="UserId"></param>
  790. /// <returns></returns>
  791. public bool CheckLeaderReserve(WebCMSEntities db, int Count, int UserId)
  792. {
  793. UserAccount acccount = db.UserAccount.FirstOrDefault(m => m.Id == UserId) ?? new UserAccount();
  794. if(acccount.LeaderReserve >= 400 * Count)
  795. {
  796. return true;
  797. }
  798. return false;
  799. }
  800. /// <summary>
  801. /// 判断运营中心/合伙人额度足够
  802. /// </summary>
  803. /// <param name="db"></param>
  804. /// <param name="Count"></param>
  805. /// <param name="UserId"></param>
  806. /// <returns></returns>
  807. public bool CheckOpReserve(OpModels.WebCMSEntities db, int Count, int UserId)
  808. {
  809. OpModels.UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId) ?? new OpModels.UserAccount();
  810. if(account.TotalAmt >= 400 * Count)
  811. {
  812. return true;
  813. }
  814. return false;
  815. }
  816. public bool CheckOpReserve(OpModels.WebCMSEntities db, decimal Amt, int UserId)
  817. {
  818. OpModels.UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId) ?? new OpModels.UserAccount();
  819. if(account.TotalAmt >= Amt)
  820. {
  821. return true;
  822. }
  823. return false;
  824. }
  825. /// <summary>
  826. /// 扣减/增加盟主储蓄金
  827. /// </summary>
  828. /// <param name="db"></param>
  829. /// <param name="OrderId"></param>
  830. /// <param name="UserId"></param>
  831. /// <param name="Money"></param>
  832. /// <param name="ChangeType"></param>
  833. /// <param name="SourceUserId"></param>
  834. /// <param name="Remark"></param>
  835. public int OpReserve(WebCMSEntities db, int OrderId, int UserId, decimal Money, int ChangeType, int SourceUserId = 0, string Remark = "储备金购买")
  836. {
  837. UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId);
  838. if (account == null)
  839. {
  840. account = db.UserAccount.Add(new UserAccount()
  841. {
  842. Id = UserId,
  843. UserId = UserId,
  844. }).Entity;
  845. db.SaveChanges();
  846. }
  847. decimal BeforeAmount = account.LeaderReserve; //变更前总金额
  848. if(ChangeType == 1)
  849. {
  850. account.LeaderReserve += Money;
  851. }
  852. else
  853. {
  854. account.LeaderReserve -= Money;
  855. }
  856. decimal AfterAmount = account.LeaderReserve; //变更后总金额
  857. LeaderReserveRecord add = db.LeaderReserveRecord.Add(new LeaderReserveRecord()
  858. {
  859. CreateDate = DateTime.Now,
  860. ChangeType = ChangeType,
  861. OrderId = OrderId,
  862. Remark = Remark,
  863. AfterAmt = AfterAmount,
  864. BeforeAmt = BeforeAmount,
  865. ChangeAmt = Money,
  866. TradeDate = DateTime.Now.ToString("yyyyMMdd"),
  867. TradeMonth = DateTime.Now.ToString("yyyyMM"),
  868. UserId = UserId,
  869. SourceUserId = SourceUserId,
  870. Sort = GetLeaderReserveRecordType(Remark),
  871. }).Entity;
  872. db.SaveChanges();
  873. return add.Id;
  874. }
  875. private int GetLeaderReserveRecordType(string Remark)
  876. {
  877. Dictionary<int, string> data = new Dictionary<int, string>();
  878. data.Add(11, "兑换机具券,机具券兑换,系统增加(盟主储蓄金),系统扣减(盟主储蓄金),储备金购买");
  879. data.Add(12, "系统增加(可提现余额),系统扣减(可提现余额)");
  880. data.Add(13, "推荐大盟主,推荐小盟主,商城购机,购机奖励");
  881. var item = data.FirstOrDefault(m => m.Value.Contains(Remark));
  882. if(item.Key > 0)
  883. {
  884. return item.Key;
  885. }
  886. return 0;
  887. }
  888. /// <summary>
  889. /// 操作盟主可提现余额
  890. /// </summary>
  891. /// <param name="db"></param>
  892. /// <param name="order"></param>
  893. /// <param name="UserId"></param>
  894. /// <param name="Money"></param>
  895. /// <param name="Count"></param>
  896. /// <param name="Kind"></param>
  897. public void OpLeaderAccount(WebCMSEntities db, Orders order, int UserId, decimal Money, int Count = 1, int ReserveRecordId = 0)
  898. {
  899. UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId);
  900. if (account == null)
  901. {
  902. account = db.UserAccount.Add(new UserAccount()
  903. {
  904. Id = UserId,
  905. UserId = UserId,
  906. }).Entity;
  907. db.SaveChanges();
  908. }
  909. int ChangeType = 0;
  910. if(Money == 400)
  911. {
  912. ChangeType = 117;
  913. }
  914. decimal BeforeLeaderBalanceAmount = account.LeaderBalanceAmount; //变更前余额
  915. account.LeaderBalanceAmount += Money * Count;
  916. decimal AfterLeaderBalanceAmount = account.LeaderBalanceAmount; //变更后余额
  917. LeaderAccountRecord leaderAccountRecord = db.LeaderAccountRecord.Add(new LeaderAccountRecord()
  918. {
  919. CreateDate = DateTime.Now,
  920. UpdateDate = DateTime.Now,
  921. UserId = UserId, //创客
  922. ChangeType = ChangeType, //变动类型
  923. ChangeAmount = Money * Count, //变更金额
  924. BeforeBalanceAmount = BeforeLeaderBalanceAmount, //变更前余额
  925. AfterBalanceAmount = AfterLeaderBalanceAmount, //变更后余额
  926. QueryCount = order.Id,
  927. Sort = order.UserId,
  928. }).Entity;
  929. db.SaveChanges();
  930. if(ReserveRecordId > 0)
  931. {
  932. LeaderReserveRecord edit = db.LeaderReserveRecord.FirstOrDefault(m => m.Id == ReserveRecordId);
  933. if(edit != null)
  934. {
  935. edit.AccountRecordId = leaderAccountRecord.Id;
  936. db.SaveChanges();
  937. }
  938. }
  939. }
  940. /// <summary>
  941. /// 操作余额
  942. /// </summary>
  943. /// <param name="db"></param>
  944. /// <param name="order"></param>
  945. /// <param name="UserId"></param>
  946. /// <param name="Money"></param>
  947. /// <param name="Count"></param>
  948. public void OpAccount(WebCMSEntities db, int OrderId, int UserId, decimal Money, int Count = 1, int ChangeType = 0, int Kind = 0)
  949. {
  950. UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId);
  951. if (account == null)
  952. {
  953. account = db.UserAccount.Add(new UserAccount()
  954. {
  955. Id = UserId,
  956. UserId = UserId,
  957. }).Entity;
  958. db.SaveChanges();
  959. }
  960. decimal BeforeTotalAmount = account.TotalAmount; //变更前总金额
  961. decimal BeforeFreezeAmount = account.FreezeAmount; //变更前冻结金额
  962. decimal BeforeBalanceAmount = account.BalanceAmount; //变更前余额
  963. account.BalanceAmount += Money * Count;
  964. account.TotalAmount += Money * Count;
  965. decimal AfterTotalAmount = account.TotalAmount; //变更后总金额
  966. decimal AfterFreezeAmount = account.FreezeAmount; //变更后冻结金额
  967. decimal AfterBalanceAmount = account.BalanceAmount; //变更后余额
  968. UserAccountRecord userAccountRecord = db.UserAccountRecord.Add(new UserAccountRecord()
  969. {
  970. CreateDate = DateTime.Now,
  971. UpdateDate = DateTime.Now,
  972. UserId = UserId, //创客
  973. ChangeType = ChangeType, //变动类型
  974. ChangeAmount = Money * Count, //变更金额
  975. BeforeTotalAmount = BeforeTotalAmount, //变更前总金额
  976. AfterTotalAmount = AfterTotalAmount, //变更后总金额
  977. BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额
  978. AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额
  979. BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额
  980. AfterBalanceAmount = AfterBalanceAmount, //变更后余额
  981. QueryCount = OrderId,
  982. Kind = Kind,
  983. }).Entity;
  984. db.SaveChanges();
  985. //发送APP推送消息
  986. Utils.Instance.PrizePush(UserId, Money * Count);
  987. }
  988. /// <summary>
  989. /// 操作运营中心/合伙人额度(TotalAmt未使用额度,ValidForGetAmount可提现额度)
  990. /// </summary>
  991. /// <param name="db"></param>
  992. /// <param name="UserId"></param>
  993. /// <param name="Money"></param>
  994. /// <param name="OperateType">(1增加,2减少)</param>
  995. /// <param name="AmountType">(1未使用额度,2可提现额度)</param>
  996. /// <param name="Remark"></param>
  997. /// <param name="record"></param>
  998. public void OperateAmountChange(OpModels.WebCMSEntities db, int UserId, decimal Money, int OperateType, int AmountType, string Remark = "", bool record = false, int OrderId = 0)
  999. {
  1000. OpModels.UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId);
  1001. if (account == null)
  1002. {
  1003. account = db.UserAccount.Add(new OpModels.UserAccount()
  1004. {
  1005. Id = UserId,
  1006. UserId = UserId,
  1007. }).Entity;
  1008. db.SaveChanges();
  1009. }
  1010. decimal BeforeAmount = account.ValidAmount + account.TotalAmt + account.ValidForGetAmount; //变更前总金额
  1011. if(OperateType == 1)
  1012. {
  1013. if(AmountType == 1)
  1014. {
  1015. account.TotalAmt += Money;
  1016. }
  1017. else if(AmountType == 2)
  1018. {
  1019. account.ValidForGetAmount += Money;
  1020. }
  1021. else
  1022. {
  1023. account.ValidAmount += Money;
  1024. }
  1025. }
  1026. else
  1027. {
  1028. if(AmountType == 1)
  1029. {
  1030. account.TotalAmt -= Money;
  1031. }
  1032. else if(AmountType == 2)
  1033. {
  1034. account.ValidForGetAmount -= Money;
  1035. }
  1036. else
  1037. {
  1038. account.ValidAmount -= Money;
  1039. }
  1040. }
  1041. decimal AfterAmount = account.ValidAmount + account.TotalAmt + account.ValidForGetAmount; //变更后总金额
  1042. if(record)
  1043. {
  1044. OpModels.AmountRecord add = db.AmountRecord.Add(new OpModels.AmountRecord()
  1045. {
  1046. CreateDate = DateTime.Now,
  1047. UpdateDate = DateTime.Now,
  1048. OperateType = OperateType,
  1049. AfterAmount = AfterAmount,
  1050. AfterValidForGetAmount = account.ValidForGetAmount,
  1051. AfterTotalAmt = account.TotalAmt,
  1052. AfterValidAmount = account.ValidAmount,
  1053. BeforeAmount = BeforeAmount,
  1054. UseAmount = Money,
  1055. UserId = UserId,
  1056. SeoDescription = Remark,
  1057. Version = AmountType,
  1058. QueryCount = OrderId,
  1059. }).Entity;
  1060. OpModels.AmountChangeRecord amountChangeRecord = db.AmountChangeRecord.Add(new OpModels.AmountChangeRecord()
  1061. {
  1062. AmountType = 2,//1 未使用额度 2 可提现额度 3 关联分仓额度
  1063. CreateDate = DateTime.Now,
  1064. Title = Remark,
  1065. UserId = UserId, //运营中心Id
  1066. BeforeAmount = BeforeAmount,//使用前剩余额度
  1067. AfterAmount = AfterAmount,//使用后剩余额度
  1068. ChangeAmount = Money,//操作金额
  1069. OperateType = OperateType,//操作类别
  1070. Sort = OrderId,
  1071. }).Entity;
  1072. }
  1073. db.SaveChanges();
  1074. }
  1075. /// <summary>
  1076. /// 给券设置大盟主标记
  1077. /// </summary>
  1078. /// <param name="db"></param>
  1079. /// <param name="LeaderUserId"></param>
  1080. /// <param name="Count"></param>
  1081. /// <param name="couponIds"></param>
  1082. public int SetPosCouponLeaderFlag(WebCMSEntities db, int LeaderUserId, int Count, List<int> couponIds, decimal UseAmount = 0)
  1083. {
  1084. int SetCount = 0;
  1085. UserAccount pacccount = db.UserAccount.FirstOrDefault(m => m.Id == LeaderUserId) ?? new UserAccount();
  1086. foreach(int couponId in couponIds)
  1087. {
  1088. PosCoupons coupon = db.PosCoupons.FirstOrDefault(m => m.Id == couponId);
  1089. decimal LeaderReserve = pacccount.LeaderReserve;
  1090. decimal CheckReserve = 400 * Count;
  1091. // if(LeaderReserve < CheckReserve)
  1092. // {
  1093. // LeaderReserveRecord ReserveRecord = db.LeaderReserveRecord.FirstOrDefault(m => m.UserId == LeaderUserId && m.Remark == "推荐小盟主" && m.ChangeAmt - m.UsedReserve > 0);
  1094. // if(ReserveRecord != null)
  1095. // {
  1096. // if(ReserveRecord.ChangeAmt - ReserveRecord.UsedReserve >= CheckReserve)
  1097. // {
  1098. // LeaderReserve = CheckReserve;
  1099. // ReserveRecord.UsedReserve += CheckReserve;
  1100. // }
  1101. // else
  1102. // {
  1103. // decimal OtherLeaderReserve = ReserveRecord.ChangeAmt - ReserveRecord.UsedReserve;
  1104. // ReserveRecord.UsedReserve += OtherLeaderReserve;
  1105. // LeaderReserveRecord ReserveRecord2 = db.LeaderReserveRecord.FirstOrDefault(m => m.Id > ReserveRecord.Id && m.UserId == LeaderUserId && m.Remark == "推荐小盟主" && m.ChangeAmt - m.UsedReserve > 0);
  1106. // if(ReserveRecord2 != null)
  1107. // {
  1108. // if(ReserveRecord2.ChangeAmt - ReserveRecord2.UsedReserve >= CheckReserve - OtherLeaderReserve)
  1109. // {
  1110. // LeaderReserve = CheckReserve - OtherLeaderReserve;
  1111. // ReserveRecord2.UsedReserve += CheckReserve - OtherLeaderReserve;
  1112. // }
  1113. // else
  1114. // {
  1115. // OtherLeaderReserve = ReserveRecord2.ChangeAmt - ReserveRecord2.UsedReserve;
  1116. // ReserveRecord2.UsedReserve += OtherLeaderReserve;
  1117. // }
  1118. // }
  1119. // }
  1120. // }
  1121. // }
  1122. if(coupon != null && LeaderReserve + UseAmount >= CheckReserve)
  1123. {
  1124. coupon.LeaderUserId = LeaderUserId;
  1125. SetCount += 1;
  1126. }
  1127. }
  1128. db.SaveChanges();
  1129. return SetCount;
  1130. }
  1131. public int CheckPosCouponLeaderFlag(WebCMSEntities db, int UserId, int Count, List<string> codes)
  1132. {
  1133. int LeaderUserId = 0;
  1134. decimal CheckReserve = 400 * Count;
  1135. // decimal LeaderReserve = 0;
  1136. LeaderReserveRecord ReserveRecord = db.LeaderReserveRecord.FirstOrDefault(m => m.SourceUserId == UserId && m.Remark == "推荐小盟主" && m.ChangeAmt - m.UsedReserve > CheckReserve);
  1137. if(ReserveRecord != null)
  1138. {
  1139. LeaderUserId = ReserveRecord.UserId;
  1140. // if(ReserveRecord.ChangeAmt - ReserveRecord.UsedReserve >= CheckReserve)
  1141. // {
  1142. // LeaderReserve = CheckReserve;
  1143. ReserveRecord.UsedReserve += CheckReserve;
  1144. // }
  1145. // else
  1146. // {
  1147. // decimal OtherLeaderReserve = ReserveRecord.ChangeAmt - ReserveRecord.UsedReserve;
  1148. // ReserveRecord.UsedReserve += OtherLeaderReserve;
  1149. // LeaderReserveRecord ReserveRecord2 = db.LeaderReserveRecord.FirstOrDefault(m => m.Id > ReserveRecord.Id && m.UserId == LeaderUserId && m.Remark == "推荐小盟主" && m.ChangeAmt - m.UsedReserve > 0);
  1150. // if(ReserveRecord2 != null)
  1151. // {
  1152. // if(ReserveRecord2.ChangeAmt - ReserveRecord2.UsedReserve >= CheckReserve - OtherLeaderReserve)
  1153. // {
  1154. // LeaderReserve = CheckReserve - OtherLeaderReserve;
  1155. // ReserveRecord2.UsedReserve += CheckReserve - OtherLeaderReserve;
  1156. // }
  1157. // else
  1158. // {
  1159. // OtherLeaderReserve = ReserveRecord2.ChangeAmt - ReserveRecord2.UsedReserve;
  1160. // ReserveRecord2.UsedReserve += OtherLeaderReserve;
  1161. // }
  1162. // }
  1163. // }
  1164. List<int> couponIds = db.PosCoupons.Where(m => codes.Contains(m.ExchangeCode)).OrderBy(m => m.Id).ToList().Select(m => m.Id).ToList();
  1165. foreach(int couponId in couponIds)
  1166. {
  1167. PosCoupons coupon = db.PosCoupons.FirstOrDefault(m => m.Id == couponId);
  1168. if(coupon != null)
  1169. {
  1170. coupon.LeaderUserId = LeaderUserId;
  1171. }
  1172. }
  1173. db.SaveChanges();
  1174. }
  1175. return LeaderUserId;
  1176. }
  1177. /// <summary>
  1178. /// 获取购机奖金额
  1179. /// </summary>
  1180. /// <param name="user"></param>
  1181. /// <returns></returns>
  1182. public decimal GetBuyPrize(UserRankItem user, Orders order)
  1183. {
  1184. if(user.OperateLevel == 1) return 100;
  1185. if(user.OperateLevel == 2)
  1186. {
  1187. Utils.WriteLog("\n\n\n创客Id:" + user.Id, "训练营60拦截日志");
  1188. if(TradeTeamCheck2(user.Id))
  1189. {
  1190. return 160;
  1191. }
  1192. Utils.WriteLog("下单人:" + order.UserId, "训练营60拦截日志");
  1193. if(!TradeTeamCheck(order.UserId) && user.Id != order.UserId)
  1194. {
  1195. Utils.WriteLog("拦截", "训练营60拦截日志");
  1196. decimal Amount = order.BuyCount * 60;
  1197. RedisDbconn.Instance.AddList("TradeFilterQueue", "{\"OrderId\":\"" + order.Id + "\",\"PrizeUserId\":\"" + user.Id + "\",\"Amount\":\"" + Amount + "\",\"Kind\":\"1\"}");
  1198. Utils.WriteLog("end", "训练营60拦截日志");
  1199. return 100;
  1200. }
  1201. if(CheckSpecialUserNav(order.UserId))
  1202. {
  1203. return 100;
  1204. }
  1205. return 160;
  1206. }
  1207. if(user.OperateLevel == 3) return 180;
  1208. if(user.OperateLevel == 4) return 200;
  1209. if(user.LeaderLevel > 0) return 100;
  1210. return 0;
  1211. }
  1212. public bool TradeTeamCheck(int UserId)
  1213. {
  1214. bool op = true;
  1215. if(UserId == 0)
  1216. {
  1217. return op;
  1218. }
  1219. Utils.WriteLog("UserId:" + UserId, "训练营判断参与活动");
  1220. WebCMSEntities maindb = new WebCMSEntities();
  1221. Users muser = maindb.Users.FirstOrDefault(m => m.Id == UserId) ?? new Users();
  1222. string ParentNav = muser.ParentUserId + "," + UserId;
  1223. string[] ParentNavList = ParentNav.Split(',');
  1224. List<int> UserIds = new List<int>();
  1225. foreach(string IdString in ParentNavList)
  1226. {
  1227. UserIds.Add(int.Parse(function.CheckInt(IdString)));
  1228. }
  1229. JavaModels.WebCMSEntities db = new JavaModels.WebCMSEntities();
  1230. JavaModels.KxsCamp camp = db.KxsCamp.FirstOrDefault(m => m.Status == 1);
  1231. if(camp != null)
  1232. {
  1233. int CampId = camp.Id;
  1234. var users = db.KxsCampUser.Where(m => UserIds.Contains(m.UserId) && m.CampId == CampId).ToList();
  1235. foreach(var user in users)
  1236. {
  1237. Utils.WriteLog("活动Id:" + camp.Id, "训练营判断参与活动");
  1238. op = false;
  1239. break;
  1240. }
  1241. }
  1242. maindb.Dispose();
  1243. db.Dispose();
  1244. Utils.WriteLog("\n\n\n", "训练营判断参与活动");
  1245. return op;
  1246. }
  1247. public bool TradeTeamCheck2(int UserId)
  1248. {
  1249. bool op = false;
  1250. if(UserId == 0)
  1251. {
  1252. return op;
  1253. }
  1254. Utils.WriteLog("黄金合伙人-UserId:" + UserId, "训练营判断参与活动");
  1255. JavaModels.WebCMSEntities db = new JavaModels.WebCMSEntities();
  1256. var users = db.KxsCampUser.Where(m => m.UserId == UserId).ToList();
  1257. foreach(var user in users)
  1258. {
  1259. DateTime now = DateTime.Now;
  1260. // JavaModels.KxsCamp camp = db.KxsCamp.FirstOrDefault(m => m.Id == user.CampId && m.StartTime <= now && m.EndTime >= now);
  1261. JavaModels.KxsCamp camp = db.KxsCamp.FirstOrDefault(m => m.Id == user.CampId && m.Status == 1);
  1262. if(camp != null)
  1263. {
  1264. Utils.WriteLog("黄金合伙人-活动Id:" + camp.Id, "训练营判断参与活动");
  1265. op = true;
  1266. break;
  1267. }
  1268. }
  1269. db.Dispose();
  1270. Utils.WriteLog("\n\n\n", "训练营判断参与活动");
  1271. return op;
  1272. }
  1273. public bool CheckSpecialUserNav(int UserId)
  1274. {
  1275. List<int> ids = new List<int>();
  1276. WebCMSEntities maindb = new WebCMSEntities();
  1277. bool op = maindb.Users.Any(m => (m.ParentNav.Contains(",246751,") || m.Id == 246751) && m.Id == UserId);
  1278. maindb.Dispose();
  1279. return op;
  1280. }
  1281. /// <summary>
  1282. /// 获取可提现金额
  1283. /// </summary>
  1284. /// <param name="user"></param>
  1285. /// <returns></returns>
  1286. public decimal GetWithdrawMoney(UserRankItem user)
  1287. {
  1288. if(user.OperateLevel == 1) return 400;
  1289. // if(user.OperateLevel == 2) return 340;
  1290. // if(user.OperateLevel == 3) return 320;
  1291. // if(user.OperateLevel == 4) return 300;
  1292. if(user.OperateLevel == 2) return 400;
  1293. if(user.OperateLevel == 3) return 400;
  1294. if(user.OperateLevel == 4) return 400;
  1295. if(user.AgoLeaderLevel > 0) return 400;
  1296. return 0;
  1297. }
  1298. /// <summary>
  1299. /// 预设职级
  1300. /// </summary>
  1301. /// <param name="db"></param>
  1302. /// <param name="UserId">创客Id</param>
  1303. /// <param name="Rank">职级</param>
  1304. /// <param name="ExpiredDate">过期时间</param>
  1305. public void PreUserLevel(WebCMSEntities db, int UserId, int Rank, DateTime ExpiredDate)
  1306. {
  1307. UserRankWhite rank = db.UserRankWhite.FirstOrDefault(m => m.Id == UserId);
  1308. if(rank == null)
  1309. {
  1310. rank = db.UserRankWhite.Add(new UserRankWhite()
  1311. {
  1312. CreateDate = DateTime.Now, //设置时间
  1313. UserId = UserId, //用户
  1314. Id = UserId,
  1315. }).Entity;
  1316. db.SaveChanges();
  1317. }
  1318. rank.Rank = Rank;
  1319. rank.UpdateDate = ExpiredDate;
  1320. db.SaveChanges();
  1321. }
  1322. }
  1323. }