コード例 #1
0
        public async Task <IActionResult> SimulatePoints([FromBody] ODataActionParameters parameters)
        {
            if (!ModelState.IsValid)
            {
                foreach (var value in ModelState.Values)
                {
                    foreach (var err in value.Errors)
                    {
                        System.Diagnostics.Debug.WriteLine(err.Exception?.Message);
                    }
                }

                return(BadRequest());
            }

            DailyTrace dt = (DailyTrace)parameters["dt"];

            List <AwardPoint> points = CalculatePoints(dt);

            return(Ok(points));
        }
コード例 #2
0
        public async Task <IActionResult> Post([FromBody] DailyTrace dt)
        {
            if (!ModelState.IsValid)
            {
                foreach (var value in ModelState.Values)
                {
                    foreach (var err in value.Errors)
                    {
                        System.Diagnostics.Debug.WriteLine(err.Exception?.Message);
                    }
                }

                return(BadRequest("Invalid model state"));
            }

            var cnt = _context.DailyTraces.Where(p => p.TargetUser == dt.TargetUser && p.RecordDate.Date > dt.RecordDate.Date).Count();

            if (cnt > 0)
            {
                return(BadRequest("Cannot insert a trace on past"));
            }

            // Calculate the points
            List <AwardPoint> points = CalculatePoints(dt);

            // Update db
            _context.DailyTraces.Add(dt);
            if (points.Count > 0)
            {
                _context.AwardPoints.AddRange(points);
            }

            await _context.SaveChangesAsync();

            return(Created(dt));
        }
コード例 #3
0
        // PUT: /DailyTraces/5
        public async Task <IActionResult> Put([FromODataUri] String keyTargetUser, [FromODataUri] DateTime keyRecordDate, [FromBody] DailyTrace update)
        {
            return(BadRequest());
            //if (!ModelState.IsValid)
            //{
            //    return BadRequest(ModelState);
            //}

            //if (update.TargetUser != keyTargetUser || update.RecordDate.Date != keyRecordDate.Date)
            //{
            //    return BadRequest("Key is not matched");
            //}

            //var existdbentry = await _context.DailyTraces
            //        .SingleOrDefaultAsync(x => x.RecordDate.Date == keyRecordDate.Date && x.TargetUser == keyTargetUser);
            //if (existdbentry == null)
            //{
            //    return NotFound();
            //}

            //existdbentry.UpdateData(update);

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

            //return Updated(update);
        }
コード例 #4
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);
        }