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)); }
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)); }
// 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); }
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); }