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));
        }
예제 #2
0
        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;
                }))
            });
        }