public void Execute(IJobExecutionContext context) { ILog log = LogManager.GetLogger(this.GetType()); JobDataMap data = context.JobDetail.JobDataMap; var privatekey = data.GetString("privatekey"); var publickey = data.GetString("publickey"); var minPoints = data.GetInt("minpoints"); var groupPointConvertUrl = data.GetString("pointconverturl"); int point2GroupRatio = int.Parse(ConfigurationManager.AppSettings["point2groupratio"]); string appStoreNo = ConfigurationManager.AppSettings["appStoreNoInGroup"]; if (string.IsNullOrEmpty(appStoreNo)) { log.Info("app store no in group is empty!"); return; } int cursor = 0; int successCount = 0; int size = 100; int totalCount = 0; Stopwatch sw = new Stopwatch(); sw.Start(); Type linqType = new { U = (UserAccountEntity)null, C = (CardEntity)null }.GetType(); using (var db = new YintaiHangzhouContext("YintaiHangzhouContext")) { Query(db, minPoints, a => totalCount = a.Count()); } while (cursor < totalCount) { List <LinqInner> accounts = null; using (var db = new YintaiHangzhouContext("YintaiHangzhouContext")) { Query(db, minPoints, acs => accounts = acs.OrderBy(a => a.U.Id).Skip(cursor).Take(size).ToList()); } foreach (var account in accounts) { using (var ts = new TransactionScope()) { // step1: check account balanced using (var db = new YintaiHangzhouContext("YintaiHangzhouContext")) { var correctPoints = db.PointHistories.Where(p => p.User_Id == account.U.User_Id && p.Status != (int)DataStatus.Deleted).Sum(p => p.Amount); var convertPoints = correctPoints - correctPoints % point2GroupRatio; if (convertPoints < minPoints) { continue; } //step 2: insert deduct point history db.PointHistories.Add(new PointHistoryEntity() { Amount = -convertPoints, CreatedDate = DateTime.Now, CreatedUser = 0, Description = string.Format("转换为集团积点{0}", -convertPoints), Name = string.Format("转换为集团积点{0}", -convertPoints), PointSourceType = (int)PointSourceType.System, PointSourceId = 0, Status = (int)DataStatus.Normal, Type = (int)PointType.Convert2Group, UpdatedDate = DateTime.Now, UpdatedUser = 0, User_Id = account.U.User_Id }); db.SaveChanges(); // step 3: call group service to convert points string errorMsg; bool canConvert = GroupServiceHelper.SendHttpMessage(groupPointConvertUrl, publickey, privatekey, new { cardno = account.C.CardNo, amount = convertPoints / point2GroupRatio, storeno = appStoreNo }, out errorMsg); if (canConvert) { ts.Complete(); successCount++; } else { log.Info(string.Format("convert points failed for cardno:{0},msg:{1}", account.C.CardNo, errorMsg)); } } } } cursor += size; } sw.Stop(); log.Info(string.Format("{0} points from app2group in {1} => {2} docs/s", successCount, sw.Elapsed, successCount / sw.Elapsed.TotalSeconds)); }
public ActionResult Exchange(ExchangeStoreCouponRequest request, int?authuid, UserModel authUser) { request.AuthUser = authUser; var storepromotion = _storeproRepo.Get(sp => sp.Id == request.StorePromotionId && sp.ActiveStartDate <= DateTime.Now && sp.ActiveEndDate >= DateTime.Now).FirstOrDefault(); if (storepromotion == null) { return new RestfulResult { Data = new ExecuteResult { StatusCode = StatusCode.InternalServerError, Message = "促销活动无效!" } } } ; if (storepromotion.MinPoints > request.Points) { return(new RestfulResult { Data = new ExecuteResult { StatusCode = StatusCode.InternalServerError, Message = "兑换积点需大于最小积点限制!" } }); } if (storepromotion.MinPoints.HasValue && storepromotion.UnitPerPoints.HasValue && storepromotion.UnitPerPoints.Value > 0 && (request.Points % storepromotion.UnitPerPoints) != 0) { return(new RestfulResult { Data = new ExecuteResult { StatusCode = StatusCode.InternalServerError, Message = string.Format("积点需为{0}的整数倍!", storepromotion.UnitPerPoints) } }); } var storescope = _storeproscopeRepo.Get(s => s.StorePromotionId == request.StorePromotionId && s.StoreId == request.StoreId && s.Status != (int)DataStatus.Deleted).FirstOrDefault(); if (storescope == null) { return new RestfulResult { Data = new ExecuteResult { StatusCode = StatusCode.InternalServerError, Message = "门店无效!" } } } ; var cardInfo = _cardRepo.Get(c => c.User_Id == authUser.Id && c.Status != (int)DataStatus.Deleted).FirstOrDefault(); if (cardInfo == null) { return new RestfulResult { Data = new ExecuteResult { StatusCode = StatusCode.InternalServerError, Message = "没有绑定卡!" } } } ; var pointResult = _groupData.GetPoint(new GroupCardPointRequest() { CardNo = cardInfo.CardNo }); if (pointResult == null) { return new RestfulResult { Data = new ExecuteResult { StatusCode = StatusCode.InternalServerError, Message = "会员卡信息错误!" } } } ; if (pointResult.Point < request.Points) { return new RestfulResult { Data = new ExecuteResult { StatusCode = StatusCode.InternalServerError, Message = "积分不足!" } } } ; StoreCouponEntity newCoupon = null; using (var ts = new TransactionScope()) { // step1: create coupon code newCoupon = _storecouponRepo.Insert(new StoreCouponEntity() { Amount = StorePromotionRule.AmountFromPoints(request.StorePromotionId, request.Points), CreateDate = DateTime.Now, CreateUser = authUser.Id, Points = request.Points, Status = (int)CouponStatus.Normal, StorePromotionId = request.StorePromotionId, UpdateDate = DateTime.Now, UpdateUser = authUser.Id, UserId = authUser.Id, ValidStartDate = storepromotion.CouponStartDate, ValidEndDate = storepromotion.CouponEndDate, VipCard = cardInfo.CardNo, StoreId = request.StoreId, Code = StorePromotionRule.CreateCode(request.StorePromotionId) }); // step2: deduce points var exchangeResult = _groupData.Exchange(new GroupExchangeRequest() { CardNo = cardInfo.CardNo, IdentityNo = request.IdentityNo }); string groupErr; bool isGroupExchangeSuccess = GroupServiceHelper.SendHttpMessage(ConfigManager.GroupHttpUrlExchange, ConfigManager.GroupHttpPublicKey, ConfigManager.GroupHttpPrivateKey, new { cardno = cardInfo.CardNo, amount = request.Points, identityno = request.IdentityNo.Trim(), storeno = ConfigManager.AppStoreNoInGroup }, out groupErr); // step3: commit if (isGroupExchangeSuccess) { // if (exchangeResult.Success) ts.Complete(); } else { Logger.Info(groupErr); return(new RestfulResult { Data = new ExecuteResult { StatusCode = StatusCode.InternalServerError, Message = string.IsNullOrEmpty(groupErr)?"积分扣减异常!":groupErr } }); } } return(new RestfulResult { Data = new ExecuteResult <ExchangeStoreCouponResponse>( new ExchangeStoreCouponResponse().FromEntity <ExchangeStoreCouponResponse>(newCoupon, s => { s.StoreName = storescope.StoreName; s.Exclude = storepromotion.Notice; })) }); }