// UPDATE: /AwardPoints
        public async Task <IActionResult> Put([FromODataUri] int key, [FromBody] AwardPoint update)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (key != update.ID)
            {
                return(BadRequest("Key is not matched"));
            }

            // Check item need be updated
            var dbentry = await _context.AwardPoints.SingleOrDefaultAsync(x => x.ID == key);

            if (dbentry == null)
            {
                return(NotFound());
            }

            dbentry.UpdateData(update);

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                throw;
            }

            return(Updated(update));
        }
        // POST: /AwardPoints
        public async Task <IActionResult> Post([FromBody] AwardPoint point)
        {
            if (!ModelState.IsValid)
            {
                foreach (var value in ModelState.Values)
                {
                    foreach (var err in value.Errors)
                    {
                        System.Diagnostics.Debug.WriteLine(err.Exception?.Message);
                    }
                }

                return(BadRequest());
            }

            // Update db
            _context.AwardPoints.Add(point);
            await _context.SaveChangesAsync();

            return(Created(point));
        }
예제 #3
0
        public List <AwardPoint> CalculatePoints(DailyTrace dt)
        {
            List <AwardPoint> points = new List <AwardPoint>();

            // Calculate the points
            // Step 1. Get all related rules and previous result.
            var prvdate    = dt.RecordDate.Subtract(new TimeSpan(1, 0, 0, 0)).Date;
            var prvresults = this._context.AwardPoints.Where(p => p.TargetUser == dt.TargetUser && p.RecordDate.Date == prvdate).ToList <AwardPoint>();

            List <AwardRuleType> listTypes = new List <AwardRuleType>();

            if (dt.GoToBedTime.HasValue)
            {
                listTypes.Add(AwardRuleType.GoToBedTime);
            }
            if (dt.SchoolWorkTime.HasValue)
            {
                listTypes.Add(AwardRuleType.SchoolWorkTime);
            }
            if (dt.HandWriting.HasValue)
            {
                listTypes.Add(AwardRuleType.HandWritingHabit);
            }
            if (dt.HomeWorkCount.HasValue)
            {
                listTypes.Add(AwardRuleType.HomeWorkCount);
            }
            if (dt.HouseKeepingCount.HasValue)
            {
                listTypes.Add(AwardRuleType.HouseKeepingCount);
            }
            if (dt.PoliteBehavior.HasValue)
            {
                listTypes.Add(AwardRuleType.PoliteBehavior);
            }
            if (dt.ErrorsCollection.HasValue)
            {
                listTypes.Add(AwardRuleType.ErrorCollectionHabit);
            }
            if (dt.BodyExerciseCount.HasValue)
            {
                listTypes.Add(AwardRuleType.BodyExerciseCount);
            }
            if (dt.CleanDesk.HasValue)
            {
                listTypes.Add(AwardRuleType.CleanDeakHabit);
            }

            var allrules = (from rtype in listTypes
                            join rule in _context.AwardRules
                            on new { RuleType = rtype, TargetUser = dt.TargetUser, IsValid = true } equals new { rule.RuleType, rule.TargetUser, IsValid = rule.ValidFrom.Date <= dt.RecordDate.Date && rule.ValidTo.Date >= dt.RecordDate.Date }
                            select rule).ToList <AwardRule>();

            // Step 2. Calculate the points per rule
            if (dt.GoToBedTime.HasValue)
            {
                var rules = allrules.FindAll(p => p.RuleType == AwardRuleType.GoToBedTime);
                if (rules.Count > 0)
                {
                    var matchedrules = rules.FindAll(p => p.TimeStart <= dt.GoToBedTime.Value && p.TimeEnd >= dt.GoToBedTime.Value);
                    if (matchedrules.Count > 0)
                    {
                        // Shall be matched
                        AwardPoint pnt = new AwardPoint();

                        var countOfDays = 0;

                        // Appear in yesterday?
                        if (prvresults.Count > 0)
                        {
                            foreach (var rule in matchedrules)
                            {
                                var pntYesterday = prvresults.FirstOrDefault(p => p.MatchedRuleID != null && p.MatchedRuleID == rule.ID);
                                if (pntYesterday != null)
                                {
                                    if (pntYesterday.CountOfDay.HasValue)
                                    {
                                        countOfDays = pntYesterday.CountOfDay.Value;
                                    }
                                    break;
                                }
                            }
                        }
                        countOfDays++;

                        foreach (var rule in matchedrules)
                        {
                            if (rule.DaysFrom <= countOfDays && rule.DaysTo >= countOfDays)
                            {
                                pnt.CountOfDay    = countOfDays;
                                pnt.MatchedRuleID = rule.ID;
                                pnt.RecordDate    = dt.RecordDate.Date;
                                pnt.TargetUser    = dt.TargetUser;
                                pnt.Point         = rule.Point;
                                points.Add(pnt);
                            }
                        }
                    }
                }
            }
            if (dt.SchoolWorkTime.HasValue)
            {
                var rules = allrules.FindAll(p => p.RuleType == AwardRuleType.SchoolWorkTime);
                if (rules.Count > 0)
                {
                    var matchedrules = rules.FindAll(p => p.TimeStart <= dt.SchoolWorkTime.Value && p.TimeEnd >= dt.SchoolWorkTime.Value);
                    if (matchedrules.Count > 0)
                    {
                        // Shall be matched
                        AwardPoint pnt = new();

                        var countOfDays = 0;

                        // Appear in yesterday?
                        if (prvresults.Count > 0)
                        {
                            foreach (var rule in matchedrules)
                            {
                                var pntYesterday = prvresults.FirstOrDefault(p => p.MatchedRuleID != null && p.MatchedRuleID == rule.ID);
                                if (pntYesterday != null)
                                {
                                    if (pntYesterday.CountOfDay.HasValue)
                                    {
                                        countOfDays = pntYesterday.CountOfDay.Value;
                                    }
                                    break;
                                }
                            }
                        }
                        countOfDays++;

                        foreach (var rule in matchedrules)
                        {
                            if (rule.DaysFrom <= countOfDays && rule.DaysTo >= countOfDays)
                            {
                                pnt.CountOfDay    = countOfDays;
                                pnt.MatchedRuleID = rule.ID;
                                pnt.RecordDate    = dt.RecordDate.Date;
                                pnt.TargetUser    = dt.TargetUser;
                                pnt.Point         = rule.Point;
                                points.Add(pnt);
                            }
                        }
                    }
                }
            }
            if (dt.HandWriting.HasValue)
            {
                var rules = allrules.FindAll(p => p.RuleType == AwardRuleType.HandWritingHabit);
                if (rules.Count > 0)
                {
                    var matchedrules = rules.FindAll(p => p.DoneOfFact.Value == dt.HandWriting.Value);
                    if (matchedrules.Count > 0)
                    {
                        // Shall be matched
                        AwardPoint pnt = new();

                        var countOfDays = 0;

                        // Appear in yesterday?
                        if (prvresults.Count > 0)
                        {
                            foreach (var rule in matchedrules)
                            {
                                var pntYesterday = prvresults.FirstOrDefault(p => p.MatchedRuleID != null && p.MatchedRuleID == rule.ID);
                                if (pntYesterday != null)
                                {
                                    if (pntYesterday.CountOfDay.HasValue)
                                    {
                                        countOfDays = pntYesterday.CountOfDay.Value;
                                    }
                                    break;
                                }
                            }
                        }
                        countOfDays++;

                        foreach (var rule in matchedrules)
                        {
                            if (rule.DaysFrom <= countOfDays && rule.DaysTo >= countOfDays)
                            {
                                pnt.CountOfDay    = countOfDays;
                                pnt.MatchedRuleID = rule.ID;
                                pnt.RecordDate    = dt.RecordDate.Date;
                                pnt.TargetUser    = dt.TargetUser;
                                pnt.Point         = rule.Point;
                                points.Add(pnt);
                            }
                        }
                    }
                }
            }
            if (dt.HomeWorkCount.HasValue)
            {
                var rules = allrules.FindAll(p => p.RuleType == AwardRuleType.HomeWorkCount);
                if (rules.Count > 0)
                {
                    var matchedrules = rules.FindAll(p => p.CountOfFactLow.Value <= dt.HomeWorkCount.Value && p.CountOfFactHigh.Value >= dt.HomeWorkCount.Value);
                    if (matchedrules.Count > 0)
                    {
                        // Shall be matched
                        AwardPoint pnt = new();

                        var countOfDays = 0;

                        // Appear in yesterday?
                        if (prvresults.Count > 0)
                        {
                            foreach (var rule in matchedrules)
                            {
                                var pntYesterday = prvresults.FirstOrDefault(p => p.MatchedRuleID != null && p.MatchedRuleID == rule.ID);
                                if (pntYesterday != null)
                                {
                                    if (pntYesterday.CountOfDay.HasValue)
                                    {
                                        countOfDays = pntYesterday.CountOfDay.Value;
                                    }
                                    break;
                                }
                            }
                        }
                        countOfDays++;

                        foreach (var rule in matchedrules)
                        {
                            if (rule.DaysFrom <= countOfDays && rule.DaysTo >= countOfDays)
                            {
                                pnt.CountOfDay    = countOfDays;
                                pnt.MatchedRuleID = rule.ID;
                                pnt.RecordDate    = dt.RecordDate.Date;
                                pnt.TargetUser    = dt.TargetUser;
                                pnt.Point         = rule.Point;
                                points.Add(pnt);
                            }
                        }
                    }
                }
            }
            if (dt.HouseKeepingCount.HasValue)
            {
                var rules = allrules.FindAll(p => p.RuleType == AwardRuleType.HouseKeepingCount);
                if (rules.Count > 0)
                {
                    var matchedrules = rules.FindAll(p => p.CountOfFactLow.Value <= dt.HouseKeepingCount.Value && p.CountOfFactHigh.Value >= dt.HouseKeepingCount.Value);
                    if (matchedrules.Count > 0)
                    {
                        // Shall be matched
                        AwardPoint pnt = new();

                        var countOfDays = 0;

                        // Appear in yesterday?
                        if (prvresults.Count > 0)
                        {
                            foreach (var rule in matchedrules)
                            {
                                var pntYesterday = prvresults.FirstOrDefault(p => p.MatchedRuleID != null && p.MatchedRuleID == rule.ID);
                                if (pntYesterday != null)
                                {
                                    if (pntYesterday.CountOfDay.HasValue)
                                    {
                                        countOfDays = pntYesterday.CountOfDay.Value;
                                    }
                                    break;
                                }
                            }
                        }
                        countOfDays++;

                        foreach (var rule in matchedrules)
                        {
                            if (rule.DaysFrom <= countOfDays && rule.DaysTo >= countOfDays)
                            {
                                pnt.CountOfDay    = countOfDays;
                                pnt.MatchedRuleID = rule.ID;
                                pnt.RecordDate    = dt.RecordDate.Date;
                                pnt.TargetUser    = dt.TargetUser;
                                pnt.Point         = rule.Point;
                                points.Add(pnt);
                            }
                        }
                    }
                }
            }
            if (dt.PoliteBehavior.HasValue)
            {
                var rules = allrules.FindAll(p => p.RuleType == AwardRuleType.PoliteBehavior);
                if (rules.Count > 0)
                {
                    var matchedrules = rules.FindAll(p => p.CountOfFactLow.Value <= dt.PoliteBehavior.Value && p.CountOfFactHigh.Value >= dt.PoliteBehavior.Value);
                    if (matchedrules.Count > 0)
                    {
                        // Shall be matched
                        AwardPoint pnt = new();

                        var countOfDays = 0;

                        // Appear in yesterday?
                        if (prvresults.Count > 0)
                        {
                            foreach (var rule in matchedrules)
                            {
                                var pntYesterday = prvresults.FirstOrDefault(p => p.MatchedRuleID != null && p.MatchedRuleID == rule.ID);
                                if (pntYesterday != null)
                                {
                                    if (pntYesterday.CountOfDay.HasValue)
                                    {
                                        countOfDays = pntYesterday.CountOfDay.Value;
                                    }
                                    break;
                                }
                            }
                        }
                        countOfDays++;

                        foreach (var rule in matchedrules)
                        {
                            if (rule.DaysFrom <= countOfDays && rule.DaysTo >= countOfDays)
                            {
                                pnt.CountOfDay    = countOfDays;
                                pnt.MatchedRuleID = rule.ID;
                                pnt.RecordDate    = dt.RecordDate.Date;
                                pnt.TargetUser    = dt.TargetUser;
                                pnt.Point         = rule.Point;
                                points.Add(pnt);
                            }
                        }
                    }
                }
            }
            if (dt.ErrorsCollection.HasValue)
            {
                var rules = allrules.FindAll(p => p.RuleType == AwardRuleType.ErrorCollectionHabit);
                if (rules.Count > 0)
                {
                    var matchedrules = rules.FindAll(p => p.DoneOfFact.Value == dt.ErrorsCollection.Value);
                    if (matchedrules.Count > 0)
                    {
                        // Shall be matched
                        AwardPoint pnt = new();

                        var countOfDays = 0;

                        // Appear in yesterday?
                        if (prvresults.Count > 0)
                        {
                            foreach (var rule in matchedrules)
                            {
                                var pntYesterday = prvresults.FirstOrDefault(p => p.MatchedRuleID != null && p.MatchedRuleID == rule.ID);
                                if (pntYesterday != null)
                                {
                                    if (pntYesterday.CountOfDay.HasValue)
                                    {
                                        countOfDays = pntYesterday.CountOfDay.Value;
                                    }
                                    break;
                                }
                            }
                        }
                        countOfDays++;

                        foreach (var rule in matchedrules)
                        {
                            if (rule.DaysFrom <= countOfDays && rule.DaysTo >= countOfDays)
                            {
                                pnt.CountOfDay    = countOfDays;
                                pnt.MatchedRuleID = rule.ID;
                                pnt.RecordDate    = dt.RecordDate.Date;
                                pnt.TargetUser    = dt.TargetUser;
                                pnt.Point         = rule.Point;
                                points.Add(pnt);
                            }
                        }
                    }
                }
            }
            if (dt.BodyExerciseCount.HasValue)
            {
                var rules = allrules.FindAll(p => p.RuleType == AwardRuleType.BodyExerciseCount);
                if (rules.Count > 0)
                {
                    var matchedrules = rules.FindAll(p => p.CountOfFactLow.Value <= dt.BodyExerciseCount.Value && p.CountOfFactHigh.Value >= dt.BodyExerciseCount.Value);
                    if (matchedrules.Count > 0)
                    {
                        // Shall be matched
                        AwardPoint pnt = new();

                        var countOfDays = 0;

                        // Appear in yesterday?
                        if (prvresults.Count > 0)
                        {
                            foreach (var rule in matchedrules)
                            {
                                var pntYesterday = prvresults.FirstOrDefault(p => p.MatchedRuleID != null && p.MatchedRuleID == rule.ID);
                                if (pntYesterday != null)
                                {
                                    if (pntYesterday.CountOfDay.HasValue)
                                    {
                                        countOfDays = pntYesterday.CountOfDay.Value;
                                    }
                                    break;
                                }
                            }
                        }
                        countOfDays++;

                        foreach (var rule in matchedrules)
                        {
                            if (rule.DaysFrom <= countOfDays && rule.DaysTo >= countOfDays)
                            {
                                pnt.CountOfDay    = countOfDays;
                                pnt.MatchedRuleID = rule.ID;
                                pnt.RecordDate    = dt.RecordDate.Date;
                                pnt.TargetUser    = dt.TargetUser;
                                pnt.Point         = rule.Point;
                                points.Add(pnt);
                            }
                        }
                    }
                }
            }
            if (dt.CleanDesk.HasValue)
            {
                var rules = allrules.FindAll(p => p.RuleType == AwardRuleType.CleanDeakHabit);
                if (rules.Count > 0)
                {
                    var matchedrules = rules.FindAll(p => p.DoneOfFact.Value == dt.CleanDesk.Value);
                    if (matchedrules.Count > 0)
                    {
                        // Shall be matched
                        AwardPoint pnt = new();

                        var countOfDays = 0;

                        // Appear in yesterday?
                        if (prvresults.Count > 0)
                        {
                            foreach (var rule in matchedrules)
                            {
                                var pntYesterday = prvresults.FirstOrDefault(p => p.MatchedRuleID != null && p.MatchedRuleID == rule.ID);
                                if (pntYesterday != null)
                                {
                                    if (pntYesterday.CountOfDay.HasValue)
                                    {
                                        countOfDays = pntYesterday.CountOfDay.Value;
                                    }
                                    break;
                                }
                            }
                        }
                        countOfDays++;

                        foreach (var rule in matchedrules)
                        {
                            if (rule.DaysFrom <= countOfDays && rule.DaysTo >= countOfDays)
                            {
                                pnt.CountOfDay    = countOfDays;
                                pnt.MatchedRuleID = rule.ID;
                                pnt.RecordDate    = dt.RecordDate.Date;
                                pnt.TargetUser    = dt.TargetUser;
                                pnt.Point         = rule.Point;
                                points.Add(pnt);
                            }
                        }
                    }
                }
            }

            return(points);
        }