public IActionResult CompetenceEdit(int?id, int?userid)
        {
            using var db = AppContextFactory.DB;

            UserCompetence uc = null;

            if (id.HasValue)
            {
                uc = db.UserCompetences.FirstOrDefault(i => i.Id == id.Value);
            }

            var competences = DataHelper.CreateSelectListItem(db, uc != null ? uc.CompetenceId : (int?)null, "subjects", "skills");
            var levels      = DataHelper.CreateSelectListItem(db, uc != null ? uc.LevelId : (int?)null, "levels");

            var model = new UserCompetenceEditViewModel()
            {
                UserCompetence = uc ?? new UserCompetence()
                {
                    UserInfoId = userid.Value
                },
                Competences = competences,
                Levels      = levels
            };

            return(View(model));
        }
        public async Task <IActionResult> CompetenceEdit(int?id, string name)
        {
            UserCompetence model = new UserCompetence();

            await TryUpdateModelAsync <UserCompetence>(model, "UserCompetence", i => i.UserInfoId, i => i.LevelId, i => i.CompetenceId);

            using var db = AppContextFactory.DB;

            if (db.UserCompetences.Any(i => i.CompetenceId == model.CompetenceId && i.Id != id && i.UserInfoId == model.UserInfoId))
            {
                ModelState.AddModelError("Error", "Такая компетенция уже добавлена!");
            }

            // Валидация.
            if (!ModelState.IsValid)
            {
                return(View(
                           new UserCompetenceEditViewModel()
                {
                    UserCompetence = model,
                    Competences = DataHelper.CreateSelectListItem(db, model.CompetenceId, "subjects", "skills"),
                    Levels = DataHelper.CreateSelectListItem(db, model.LevelId, "levels")
                }));
            }

            using var t = db.Database.BeginTransaction();
            try
            {
                // Редактируем навык или сохраняем новый.
                var uc = db.UserCompetences.FirstOrDefault(i => i.Id == id) ?? new UserCompetence();

                uc.LevelId      = model.LevelId;
                uc.UserInfoId   = model.UserInfoId;
                uc.CompetenceId = model.CompetenceId;

                if (uc.Id == 0)
                {
                    db.Entry(uc).State = EntityState.Added;
                }

                await db.SaveChangesAsync();

                await t.CommitAsync();
            }
            catch (Exception ex)
            {
                await t.RollbackAsync();

                ModelState.AddModelError("Error", "В процессе сохранения произошла ошибка! Ошибка: " + ex.Message);
            }

            return(RedirectToAction("CompetenceList", new { id = model.UserInfoId }));
        }
 public void Store(UserCompetence aggregate, CompetenceUpdateCommand command)
 {
     List.Add(new Entry {
         aggregate = aggregate, command = command
     });
 }
 public void Init()
 {
     persister = new UserCompentenceMockPersister();
     entity    = new UserCompetence("user1", persister);
 }
        /// <summary>
        /// Делает импорт пользователеи и их компетенции в UserInfo таблицу.
        /// </summary>
        public async Task <IActionResult> ImportUserInfos()
        {
            using var db = AppContextFactory.DB;
            using var t  = db.Database.BeginTransaction();

            int levelId = db.FacetItems.FirstOrDefault(i => i.Name == "низкий").Id; // надеемся и свято верим что он там есть. А чтобы узнать, спецом в try не сунул =)

            try
            {
                // Стадия 1. Обновление существующих пользователеи (+ их компетенции).
                // Правила игры: только добавляем новые компетенции. Ничего не обновляем и ничего в целом тут не делаем.
                var oldUsers = db.DocFiles.Where(i => i.UserInfoId.HasValue).ToList();

                foreach (var u in oldUsers)
                {
                    // Забираем скилы из фаила.
                    var skills = (from w in db.Words
                                  where w.DocFileId == u.Id && w.FacetItemId.HasValue
                                  join fi in db.FacetItems on w.FacetItemId equals fi.Id
                                  select fi.Id).ToList();

                    // Ищем компетенции, которые есть у пользователя на текущии момент.
                    var alreadyExisting = (from uc in db.UserCompetences
                                           where uc.UserInfoId == u.UserInfoId
                                           select uc.CompetenceId).ToList();

                    // То что добавить нужно будет.
                    var toAdd = skills.Except(alreadyExisting);

                    foreach (var c in toAdd)
                    {
                        UserCompetence uc = new UserCompetence()
                        {
                            LevelId      = levelId,
                            CompetenceId = c,
                            UserInfoId   = u.UserInfoId.Value
                        };

                        db.Entry(uc).State = EntityState.Added;
                        await db.SaveChangesAsync();
                    }
                }

                // Стадия 2. Добавление новых пользователеи (+ их компетенции).
                // Правила игры: уровень импорта скилов всегда ставив самыи низкии.
                var newUsers = db.DocFiles.Where(i => !i.UserInfoId.HasValue).ToList();

                foreach (var u in newUsers)
                {
                    // Забираем скилы из фаила.
                    var skills = (from w in db.Words
                                  where w.DocFileId == u.Id && w.FacetItemId.HasValue
                                  join fi in db.FacetItems on w.FacetItemId equals fi.Id
                                  join f in db.Facets on fi.FacetId equals f.Id
                                  select new { skillId = fi.Id }).ToList();

                    // Сохраняем пользователя со всеми потрохами.
                    UserInfo ui = new UserInfo()
                    {
                        Name        = u.FIO,
                        CareerStart = DateTime.Now.Date //да просто рандомная дата. Как говорил один из персонажей в моей жизни бесполезной: "ГАВНОМ ЗАБИВАй (Звучит прям как "Родину Защищай".). Есть, Андрей Николаевич - чту, горжусь, помню и славно следую принципу борьбы с not null полями =)"
                    };

                    db.Entry(ui).State = EntityState.Added;
                    await db.SaveChangesAsync();

                    // Сохраняем связь между пользователем и документом.
                    u.UserInfoId      = ui.Id;
                    db.Entry(u).State = EntityState.Modified;
                    await db.SaveChangesAsync();

                    // Сохраняем данные о компетенциях пользователя.
                    if (skills.Any())
                    {
                        foreach (var s in skills)
                        {
                            UserCompetence uc = new UserCompetence()
                            {
                                LevelId      = levelId,
                                CompetenceId = s.skillId,
                                UserInfoId   = ui.Id
                            };

                            db.Entry(uc).State = EntityState.Added;
                            await db.SaveChangesAsync();
                        }
                    }
                }

                await t.CommitAsync();
            }
            catch (Exception ex)
            {
                await t.RollbackAsync();

                ModelState.AddModelError("Error", "В процессе импорта произошла ошибка! Ошибка: " + ex.Message);
            }

            return(RedirectToAction("Index"));
        }
Example #6
0
        /// <summary>
        ///  Берет всех пользователей и портит их с точки зрения рандома их скиллов.
        ///  Каждому добавляется по 5-7 навыков разного уровня.
        ///  Каждому добавляется по 3-5 предметные области разного уровня.
        /// </summary>
        public async Task <IActionResult> RandomizeSkills()
        {
            using var db = AppContextFactory.DB;
            using var t  = db.Database.BeginTransaction();

            try
            {
                var employees  = db.UserInfos.ToList();
                var facetItems = (from fi in db.FacetItems
                                  join f in db.Facets on fi.FacetId equals f.Id
                                  select new { fi.Id, f.Code }).ToList();

                int[] skills   = facetItems.Where(i => i.Code == "skills").Select(i => i.Id).ToArray();
                int[] subjects = facetItems.Where(i => i.Code == "subjects").Select(i => i.Id).ToArray();
                int[] lvls     = facetItems.Where(i => i.Code == "levels").Select(i => i.Id).ToArray();

                Random rnd = new Random();

                foreach (var e in employees)
                {
                    // Удаляем старые навыки.
                    var oldUcs = db.UserCompetences.Where(i => i.UserInfoId == e.Id).ToList();
                    db.RemoveRange(oldUcs);
                    await db.SaveChangesAsync();

                    // Добавляем новые навыки.
                    int        count    = rnd.Next(5, 7); // Использую антипаттерн magic numbers, потому что хочу =)
                    int        n        = 0;
                    List <int> stopList = new List <int>();

                    // Добавляем, пока не закончится цикл.
                    while (n < count)
                    {
                        int l       = rnd.Next(0, lvls.Length);
                        int levelId = lvls[l];

                        int s       = rnd.Next(0, skills.Length);
                        int skillId = skills[s];

                        if (stopList.Contains(skillId))
                        {
                            continue;
                        }

                        var us = new UserCompetence()
                        {
                            LevelId      = levelId,
                            CompetenceId = skillId,
                            UserInfoId   = e.Id
                        };

                        stopList.Add(skillId);

                        db.Entry(us).State = Microsoft.EntityFrameworkCore.EntityState.Added;
                        await db.SaveChangesAsync();

                        n++;
                    }

                    // Добавляем новые предметные области.
                    count = rnd.Next(3, 5); // Использую антипаттерн magic numbers, потому что хочу =)
                    n     = 0;
                    stopList.Clear();

                    while (n < count)
                    {
                        int l       = rnd.Next(0, lvls.Length);
                        int levelId = lvls[l];

                        int s         = rnd.Next(0, subjects.Length);
                        int subjectId = subjects[s];

                        if (stopList.Contains(subjectId))
                        {
                            continue;
                        }

                        var us = new UserCompetence()
                        {
                            LevelId      = levelId,
                            CompetenceId = subjectId,
                            UserInfoId   = e.Id
                        };

                        stopList.Add(subjectId);

                        db.Entry(us).State = Microsoft.EntityFrameworkCore.EntityState.Added;
                        await db.SaveChangesAsync();

                        n++;
                    }
                }

                await t.CommitAsync();
            }
            catch (Exception ex)
            {
                await t.RollbackAsync();

                ModelState.AddModelError("Error", "Нельзя сотворить здесь!");
            }

            return(RedirectToAction("Index", "User"));
        }
        public void Store(UserCompetence aggregate, CompetenceUpdateCommand command)
        {
            CommandStore.AppendToStream(aggregate.GetId(), command, Commands.CompetenceUpdateCommandType);

            Factory.GetChartManager().UserCompetenceChange(command);
        }