/// <summary> /// 2. 中奖结果: 回调微信端接口, 返回下单中奖结果 /// </summary> private void SyncBonus() { try { var betItemService = new BetItemService(); var pkBonusService = new PKBonusService(); var wechatWebUrl = System.Configuration.ConfigurationManager.AppSettings["WechatWebUrl"]; var wechatWebPath = System.Configuration.ConfigurationManager.AppSettings["WechatWebPath"]; //wechat订单 var orderNos = betItemService.GetNotSyncedOrderNos(); foreach (var orderNo in orderNos) { // 按wechat订单生成奖金+退水 var amount = GetBonusAndRebateAmount(orderNo); RestClient client = new RestClient(wechatWebUrl); var resource = string.Format("/{0}/orderreturn?orderId={1}&score={2}", wechatWebPath, orderNo, amount); var request = new RestRequest(resource, Method.POST); //request.AddJsonBody(new //{ // OrderNo = orderNo, // Amount = amount //}); var response = client.Execute(request); if (response != null && !string.IsNullOrEmpty(response.Content)) { dynamic res = JsonConvert.DeserializeObject(response.Content); /* * result: * 0:成功 * 1:失败 */ if (res.result.ToString() == "1") { _logger.Info("[SyncBonus Failed] [" + resource + "] " + response.Content); } else { _logger.Info("[SyncBonus Success] [" + resource + "] " + response.Content); betItemService.UpdateIsSynced(orderNo, true); } } } } catch (Exception ex) { _logger.Info(ex); } }
/// <summary> /// 按wechat单号生成奖金+退水 /// </summary> /// <param name="orderNo"></param> /// <returns></returns> public decimal GetBonusAndRebateAmount(long orderNo) { var rebateAmount = 0M; //退水 var bonusAmount = 0M; //奖金 var dbBetItems = new BetItemService().GetBetItemsByOrderNo(orderNo); // 计算退水 var userIds = dbBetItems.Select(bi => bi.Bet.UserId).Distinct().ToList(); var users = new UserService().GetUsers(userIds); var userRebates = new UserRebateService().GetUserRebates(userIds); foreach (var userId in userIds) { var user = users.Where(u => u.UserId == userId).First(); var userBetItems = dbBetItems.Where(bi => bi.Bet.UserId == userId).ToList(); foreach (var userBetItem in userBetItems) { var userRebate = userRebates.Where(e => e.UserId == userId && e.RebateNo == userBetItem.Num).FirstOrDefault(); if (userRebate != null) { var rebate = UserRebateService.GetDefaultRebate(userRebate, user.DefaultRebateType); rebateAmount += Math.Round(userBetItem.Amount * rebate, 4); } } } // 计算奖金 var betService = new BetService(); var pkIds = dbBetItems.Select(bi => bi.Bet.PKId).Distinct().ToList(); var pks = new PKService().GetPKs(pkIds); var dbPKRates = new PKRateService().GetPKRates(pkIds); foreach (var pk in pks) { var bets = betService.ConvertRanksToBets(pk.Ranks); foreach (var bet in bets) { var pkRate = dbPKRates.Where(r => r.PKId == pk.PKId && r.Rank == bet.Rank && r.Num == bet.Num).First(); var betAmount = dbBetItems.Where(bi => bi.Bet.PKId == pk.PKId && bi.Rank == bet.Rank && bi.Num == bet.Num).Sum(bi => (decimal?)bi.Amount ?? 0); bonusAmount += Math.Round(betAmount * pkRate.Rate, 4); } } return(rebateAmount + bonusAmount); }