public void Execute(IJobExecutionContext context)
        {
            ILog log = LogManager.GetLogger(this.GetType());

            JobDataMap data      = context.JobDetail.JobDataMap;
            var        benchDate = data.ContainsKey("benchdate")?data.GetDateTime("benchdate"):DateTime.Today.AddDays(-1);

            int successCount = 0;
            int cursor       = 0;
            int size         = 100;

            Stopwatch sw = new Stopwatch();

            sw.Start();
            using (var db = new YintaiHangzhouContext("YintaiHangzhouContext"))
            {
                var prods = from r in db.UserAccounts
                            where r.AccountType == (int)AccountType.Point &&
                            (from p in db.PointHistories
                             where (p.CreatedDate >= benchDate || p.UpdatedDate >= benchDate) &&
                             p.User_Id == r.User_Id
                             select p).Any()
                            select r;

                int totalCount = prods.Count();
                while (cursor < totalCount)
                {
                    var linq = prods.OrderByDescending(p => p.Id).Skip(cursor).Take(size).ToList();
                    foreach (var l in linq)
                    {
                        var sumPoints = db.PointHistories.Where(p => p.User_Id == l.User_Id && p.Status != (int)DataStatus.Deleted).Sum(p => p.Amount);
                        if (sumPoints == l.Amount)
                        {
                            continue;
                        }
                        l.Amount          = sumPoints > 0 ? sumPoints : 0;
                        l.UpdatedDate     = DateTime.Now;
                        db.Entry(l).State = System.Data.EntityState.Modified;
                        db.SaveChanges();
                        successCount++;
                    }

                    cursor += size;
                }
            }
            sw.Stop();
            log.Info(string.Format("{0} accounts in {1} => {2} docs/s", successCount, sw.Elapsed, successCount / sw.Elapsed.TotalSeconds));
        }
Beispiel #2
0
        public void Execute(IJobExecutionContext context)
        {
            ILog log = LogManager.GetLogger(this.GetType());

            JobDataMap data        = context.JobDetail.JobDataMap;
            var        interval    = data.ContainsKey("interval") ? data.GetIntValue("interval") : 24 * 60;
            var        benchDate   = DateTime.Now.AddMinutes(-interval);
            var        host        = data.GetString("awshost");
            var        public_key  = data.GetString("publickey");
            var        private_key = data.GetString("privatekey");

            dynamic jsonResponse = null;

            AwsHelper.SendHttpMessage(host, new
            {
                benchdate = benchDate.ToUniversalTime()
            }, public_key, private_key, r => jsonResponse = r, null);

            if (jsonResponse == null)
            {
                log.Info("request error!");
                return;
            }
            int       successCount = 0;
            Stopwatch sw           = new Stopwatch();

            sw.Start();
            using (var db = new YintaiHangzhouContext("YintaiHangzhouContext"))
            {
                foreach (var dynamicObject in jsonResponse.data)
                {
                    try
                    {
                        string           code             = dynamicObject.code;
                        int?             status           = dynamicObject.status;
                        DateTime         opeDate          = dynamicObject.created_at;
                        CouponStatus     targetStatus     = CouponStatus.Used;
                        CouponActionType targetActionType = CouponActionType.Consume;
                        if (status.HasValue && status.Value == -1)
                        {
                            targetStatus     = CouponStatus.Normal;
                            targetActionType = CouponActionType.Rebate;
                        }
                        switch ((int)dynamicObject.coupontype)
                        {
                        case 1:
                            var coupon = db.StoreCoupons.Where(s => s.Code == code && s.Status != (int)CouponStatus.Deleted).FirstOrDefault();
                            if (coupon != null)
                            {
                                coupon.Status          = (int)targetStatus;
                                coupon.UpdateDate      = opeDate.ToLocalTime();
                                coupon.UpdateUser      = 0;
                                db.Entry(coupon).State = EntityState.Modified;

                                db.CouponLogs.Add(new CouponLogEntity()
                                {
                                    ActionType     = (int)targetActionType,
                                    BrandNo        = dynamicObject.brandno,
                                    Code           = code,
                                    ConsumeStoreNo = dynamicObject.storeno,
                                    CreateDate     = opeDate.ToLocalTime(),
                                    CreateUser     = 0,
                                    ReceiptNo      = dynamicObject.receiptno,
                                    Type           = 1
                                });
                                db.SaveChanges();
                                successCount++;
                            }

                            break;

                        case 2:
                            var coupon2 = db.CouponHistories.Where(s => s.CouponId == code && s.Status != (int)CouponStatus.Deleted).FirstOrDefault();
                            if (coupon2 != null)
                            {
                                coupon2.Status          = (int)targetStatus;
                                db.Entry(coupon2).State = EntityState.Modified;

                                db.CouponLogs.Add(new CouponLogEntity()
                                {
                                    ActionType     = (int)targetActionType,
                                    BrandNo        = dynamicObject.brandno,
                                    Code           = code,
                                    ConsumeStoreNo = dynamicObject.storeno,
                                    CreateDate     = opeDate.ToLocalTime(),
                                    CreateUser     = 0,
                                    ReceiptNo      = dynamicObject.receiptno,
                                    Type           = 2
                                });
                                db.SaveChanges();
                                successCount++;
                            }
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        log.Error(ex);
                    }
                }
            }
            sw.Stop();
            log.Info(string.Format("{0} status logs in {1} => {2} docs/s", successCount, sw.Elapsed, successCount / sw.Elapsed.TotalSeconds));
        }
        protected override void QueueNotification(PushBroker push, IJobExecutionContext context)
        {
            ILog       log          = LogManager.GetLogger(typeof(ApnsNotificationCommonJob));
            JobDataMap data         = context.JobDetail.JobDataMap;
            var        interval     = data.GetIntValue("intervalofsec");
            int        cursor       = 0;
            int        size         = 100;
            int        successCount = 0;
            var        benchDate    = DateTime.Now.AddSeconds(-interval);
            Stopwatch  sw           = new Stopwatch();

            sw.Start();
            using (var db = new YintaiHangzhouContext("YintaiHangzhouContext"))
            {
                var prods = (from p in db.NotificationLogs
                             where p.CreateDate >= benchDate &&
                             p.Status == (int)NotificationStatus.Default
                             select p);
                if (prods != null)
                {
                    int totalCount = prods.Count();
                    while (cursor < totalCount)
                    {
                        var linq = prods.OrderByDescending(p => p.Id).Skip(cursor).Take(size).ToList();
                        foreach (var l in linq)
                        {
                            try
                            {
                                if (l.SourceType.Value == (int)SourceType.Comment)
                                {
                                    // if it's comment, always notify all comments owners of this item
                                    var comment = db.Comments.Find(l.SourceId);
                                    if (comment == null)
                                    {
                                        continue;
                                    }
                                    var relatedComments = db.Comments.Where(c => c.SourceType == comment.SourceType &&
                                                                            c.SourceId == comment.SourceId &&
                                                                            c.User_Id != comment.User_Id)
                                                          .Join(db.DeviceLogs.Where(d => d.User_Id > 0),
                                                                o => o.User_Id,
                                                                i => i.User_Id,
                                                                (o, i) => new { Token = i.DeviceToken }).ToList();
                                    if (comment.SourceType == (int)SourceType.Product)
                                    {
                                        var product = db.Products.Where(p => p.Id == comment.SourceId && p.RecommendUser != comment.User_Id)
                                                      .Join(db.DeviceLogs.Where(d => d.User_Id > 0),
                                                            o => o.CreatedUser,
                                                            i => i.User_Id,
                                                            (o, i) => new { Token = i.DeviceToken }).FirstOrDefault();
                                        if (product != null)
                                        {
                                            relatedComments.Add(new { Token = product.Token });
                                        }
                                    }
                                    else if (comment.SourceType == (int)SourceType.Promotion)
                                    {
                                        var promotion = db.Promotions.Where(p => p.Id == comment.SourceId && p.RecommendUser != comment.User_Id)
                                                        .Join(db.DeviceLogs.Where(d => d.User_Id > 0),
                                                              o => o.CreatedUser,
                                                              i => i.User_Id,
                                                              (o, i) => new { Token = i.DeviceToken }).FirstOrDefault();
                                        if (promotion != null)
                                        {
                                            relatedComments.Add(new { Token = promotion.Token });
                                        }
                                    }
                                    foreach (var device in relatedComments.Distinct())
                                    {
                                        push.QueueNotification(new AppleNotification()
                                                               .ForDeviceToken(device.Token)
                                                               .WithAlert("新评论...")
                                                               .WithBadge(1)
                                                               .WithCustomItem("from", JsonConvert.SerializeObject(new { targettype = (int)PushSourceType.SelfComment, targetvalue = comment.SourceId }))
                                                               .WithSound("sound.caf"));
                                        successCount++;
                                    }
                                    l.NotifyDate      = DateTime.Now;
                                    l.Status          = (int)NotificationStatus.Notified;
                                    db.Entry(l).State = System.Data.EntityState.Modified;
                                    db.SaveChanges();
                                }
                            }
                            catch (Exception ex)
                            {
                                log.Info(ex);
                            }
                        }

                        cursor += size;
                    }
                }
            }
            sw.Stop();
            log.Info(string.Format("{0} notifications in {1} => {2} notis/s", successCount, sw.Elapsed, successCount / sw.Elapsed.TotalSeconds));
        }
        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));
        }
Beispiel #5
0
        public void Execute(IJobExecutionContext context)
        {
            JobDataMap data             = context.JobDetail.JobDataMap;
            var        privatekey       = data.GetString("privatekey");
            var        publickey        = data.GetString("publickey");
            var        awsExpireurl     = data.GetString("awsexpireurl");
            int        point2GroupRatio = int.Parse(ConfigurationManager.AppSettings["point2groupratio"]);
            ILog       log          = LogManager.GetLogger(this.GetType());
            int        cursor       = 0;
            int        successCount = 0;
            int        size         = 100;
            DateTime   fromDate     = DateTime.Today.AddDays(-1);
            Stopwatch  sw           = new Stopwatch();

            sw.Start();
            using (var db = new YintaiHangzhouContext("YintaiHangzhouContext"))
            {
                var coupons = from p in db.StoreCoupons
                              where p.ValidEndDate >= fromDate && p.ValidEndDate < DateTime.Today &&
                              p.Status == (int)CouponStatus.Normal
                              select p;

                int totalCount = coupons.Count();
                while (cursor < totalCount)
                {
                    foreach (var coupon in coupons.OrderBy(c => c.Id).Skip(cursor).Take(size))
                    {
                        bool canRebate = AwsHelper.SendHttpMessage(awsExpireurl, new { code = coupon.Code }
                                                                   , publickey
                                                                   , privatekey
                                                                   , null
                                                                   , null);
                        if (canRebate)
                        {
                            var point = db.PointHistories.Where(u => u.User_Id == coupon.UserId.Value && u.Type == (int)PointType.VoidCoupon && u.Description == coupon.Code).FirstOrDefault();
                            if (point == null)
                            {
                                db.PointHistories.Add(new PointHistoryEntity()
                                {
                                    Amount          = (decimal)coupon.Points * point2GroupRatio,
                                    CreatedDate     = DateTime.Now,
                                    CreatedUser     = 0,
                                    Description     = coupon.Code,
                                    Name            = string.Format("代金券过期返回积点{0}", coupon.Points * point2GroupRatio),
                                    PointSourceType = (int)PointSourceType.System,
                                    PointSourceId   = 0,
                                    Status          = (int)DataStatus.Normal,
                                    Type            = (int)PointType.VoidCoupon,
                                    UpdatedDate     = DateTime.Now,
                                    UpdatedUser     = 0,
                                    User_Id         = coupon.UserId.Value
                                });
                                db.SaveChanges();
                                successCount++;
                            }
                        }
                    }
                    cursor += size;
                }
            }
            sw.Stop();
            log.Info(string.Format("{0} rebate points in {1} => {2} docs/s", successCount, sw.Elapsed, successCount / sw.Elapsed.TotalSeconds));
        }