public ActionResult Edit(Models.ElectiveOrgStudent.Edit vm)
        {
            using (var db = new XkSystem.Models.DbContext())
            {
                var error = new List <string>();
                if (error.Count == decimal.Zero)
                {
                    if (vm.ElectiveOrgStudentEdit.Id == 0)
                    {
                        var tb = new Entity.tbElectiveOrgStudent();
                        tb.tbElectiveOrg = db.Set <Entity.tbElectiveOrg>().Find(vm.ElectiveOrgStudentEdit.ElectiveOrgId);
                        //tb.tbStudent = db.Set<Basis.Entity.tbClass>().Find(vm.ElectiveOrgStudentEdit.ClassId);
                        db.Set <Entity.tbElectiveOrgStudent>().Add(tb);
                        if (db.SaveChanges() > 0)
                        {
                            XkSystem.Areas.Sys.Controllers.SysUserLogController.Insert("添加了选课班级");
                        }
                    }
                    else
                    {
                        var tb = (from p in db.Table <Entity.tbElectiveOrgStudent>()
                                  where p.Id == vm.ElectiveOrgStudentEdit.Id
                                  select p).FirstOrDefault();
                        if (tb != null)
                        {
                            if (db.SaveChanges() > 0)
                            {
                                XkSystem.Areas.Sys.Controllers.SysUserLogController.Insert("修改了选课班级");
                            }
                        }
                        else
                        {
                            error.AddError(Resources.LocalizedText.MsgNotFound);
                        }
                    }
                }

                return(Code.MvcHelper.Post(error));
            }
        }
        public ActionResult Import(Models.ElectiveOrgStudent.Import vm)
        {
            using (var db = new XkSystem.Models.DbContext())
            {
                var file     = Request.Files[nameof(vm.UploadFile)];
                var fileSave = System.IO.Path.GetTempFileName();
                file.SaveAs(fileSave);

                var ExList = new List <string>()
                {
                    ".xlsx"
                };
                if (!ExList.Contains(System.IO.Path.GetExtension(file.FileName)))
                {
                    ModelState.AddModelError(string.Empty, "上传的文件不是正确的excel文件!");
                    return(View(vm));
                }
                else
                {
                    var dt = Code.NpoiHelper.ExcelToDataTable(fileSave, System.IO.Path.GetExtension(file.FileName), string.Empty);
                    if (dt == null)
                    {
                        ModelState.AddModelError(string.Empty, "无法读取上传的文件,请检查文件格式是否正确!");
                        return(View(vm));
                    }
                    else
                    {
                        var tbList = new List <string>()
                        {
                            "选课班级", "学号", "姓名", "允许学生修改", "默认选中"
                        };
                        foreach (var name in tbList)
                        {
                            var text = string.Empty;
                            text += !dt.Columns.Contains(name) ? name + "," : "";
                            if (!string.IsNullOrWhiteSpace(text))
                            {
                                ModelState.AddModelError(string.Empty, "上传的excel文件内容与预期不一致!错误详细:" + text);
                                return(View(vm));
                            }
                        }

                        var electiveOrgList = (from p in db.Table <Entity.tbElectiveOrg>()
                                               .Include(d => d.tbElective)
                                               where p.tbElective.Id == vm.ElectiveId &&
                                               p.tbCourse.IsDeleted == false &&
                                               p.tbElectiveGroup.IsDeleted == false &&
                                               p.tbElectiveSection.IsDeleted == false
                                               select p).ToList();

                        var studentList = (from p in db.Table <Student.Entity.tbStudent>()
                                           join s in db.Table <Basis.Entity.tbClassStudent>()
                                           on p.Id equals s.tbStudent.Id
                                           select new
                        {
                            p.StudentCode,
                            p.StudentName,
                            StudentId = p.Id,
                            ClassId = s.tbClass.Id
                        }).ToList();

                        var electiveClassIds = db.Set <Entity.tbElectiveClass>().Where(p => p.tbElective.Id == vm.ElectiveId && p.IsDeleted == false).Select(p => p.tbClass.Id).ToList();

                        for (var i = 0; i < dt.Rows.Count; i++)
                        {
                            var dr     = dt.Rows[i];
                            var import = new Dto.ElectiveOrgStudent.Import()
                            {
                                OrgName     = dr["选课班级"].ToString().Trim(),
                                StudentCode = dr["学号"].ToString().Trim(),
                                StudentName = dr["姓名"].ToString().Trim(),
                                IsFixed     = dr["允许学生修改"].ToString().Trim(),
                                IsChecked   = dr["默认选中"].ToString().Trim()
                            };

                            if (string.IsNullOrEmpty(import.OrgName))
                            {
                                import.Error += "选课班级不能为空!";
                            }

                            if (string.IsNullOrEmpty(import.StudentCode))
                            {
                                import.Error += "学号不能为空!";
                            }

                            if (string.IsNullOrEmpty(import.StudentName))
                            {
                                import.Error += "姓名不能为空!";
                            }

                            var student = studentList.Where(p => p.StudentCode == import.StudentCode).FirstOrDefault();
                            if (student == null)
                            {
                                import.Error += "学号不存在,或者学生尚未加入班级!";
                            }
                            else if (student.StudentName != import.StudentName)
                            {
                                import.Error += "学号与姓名不匹配!";
                            }

                            if (string.IsNullOrEmpty(import.IsFixed))
                            {
                                import.Error += "允许学生修改不能为空!";
                            }
                            else
                            {
                                if ((new string[] { "是", "否" }).Contains(import.IsFixed) == false)
                                {
                                    import.Error += "允许学生修改只能填写是或否!";
                                }
                            }

                            if (string.IsNullOrEmpty(import.IsChecked))
                            {
                                import.Error += "默认选中不能为空!";
                            }
                            else
                            {
                                if ((new string[] { "是", "否" }).Contains(import.IsChecked) == false)
                                {
                                    import.Error += "默认选中只能填写是或否!";
                                }
                            }

                            if (!electiveOrgList.Any(p => p.OrgName == import.OrgName))
                            {
                                import.Error += "找不到对应的选课班级!";
                            }

                            if (student != null)
                            {
                                var count = db.Table <Entity.tbElectiveData>().Where(p => p.tbElectiveOrg.OrgName == import.OrgName && p.tbElectiveOrg.IsDeleted == false && p.tbElectiveOrg.tbElective.Id == vm.ElectiveId && p.tbStudent.Id == student.StudentId).Count();
                                if (count > 0)
                                {
                                    import.Error += "系统已存在该学生的选课记录!";
                                }


                                var classLimit = db.Table <Entity.tbElectiveOrgClass>().Where(p => p.tbElectiveOrg.OrgName == import.OrgName && p.tbElectiveOrg.IsDeleted == false && p.tbElectiveOrg.tbElective.Id == vm.ElectiveId).Select(p => p.tbClass.Id).ToList();
                                if (classLimit != null && !classLimit.Contains(student.ClassId))
                                {
                                    import.Error += "学生所在班级被限制预选该课程!";
                                }

                                if (electiveClassIds != null && !electiveClassIds.Contains(student.ClassId))
                                {
                                    import.Error += "学生所在班级不能预选该课程!";
                                }
                            }
                            vm.ImportList.Add(import);
                        }

                        vm.ImportList.RemoveAll(p => string.IsNullOrEmpty(p.OrgName + p.StudentCode + p.StudentName + p.IsFixed));


                        if (vm.ImportList.GroupBy(p => new { p.StudentCode, p.OrgName }).Select(p => p.Count()).First() > 1)
                        {
                            vm.ImportList.ForEach(p =>
                            {
                                vm.ImportList.ForEach(p1 => p1.Error += p1.StudentCode + "|" + p1.OrgName == p.StudentCode + "|" + p.OrgName ? "该条数据重复!" : "");
                            });
                        }

                        if (vm.ImportList.Count(p => string.IsNullOrEmpty(p.Error) == false) > 0)
                        {
                            vm.ImportList.RemoveAll(p => string.IsNullOrEmpty(p.Error));
                            return(View(vm));
                        }



                        var limitElectiveOrgList = (from p in db.Table <Entity.tbElectiveOrgClass>().Include(p => p.tbClass).Include(p => p.tbElectiveOrg)
                                                    where p.tbElectiveOrg.tbElective.Id == vm.ElectiveId &&
                                                    p.tbElectiveOrg.IsDeleted == false
                                                    select p).ToList();

                        /*
                         * foreach (var item in studentCountByClass)
                         * {
                         *  if (limitOrgList.Exists(p => p.tbClass.Id == item.ClassId && p.RemainCount < item.StudentCount))
                         *  {
                         *      error.AddError($"针对当前行政班级{item.ClassName}的人数限制不足!");
                         *      return Code.MvcHelper.Post(error);
                         *  }
                         * }
                         */

                        vm.ImportList.ForEach(p => {
                            p.ClassId = studentList.Where(s => s.StudentCode.Equals(p.StudentCode)).Select(s => s.ClassId).FirstOrDefault();
                        });

                        foreach (var org in vm.ImportList)
                        {
                            var electiveOrg = electiveOrgList.Where(p => p.OrgName.Equals(org.OrgName) && p.tbElective.Id == vm.ElectiveId && p.IsDeleted == false)
                                              .Select(p => new
                            {
                                p.MaxCount,
                                p.RemainCount
                            }).FirstOrDefault();

                            //本次excel导入数据中选择同一班级的人数
                            var studentCount = vm.ImportList.Count(p => p.OrgName.Equals(org.OrgName) && p.IsChecked == "是");
                            if (studentCount > electiveOrg.RemainCount)
                            {
                                org.Error += "课程剩余人数不足!";
                            }

                            //判断选课班级对学生当前班级有没有限制
                            var limitInfo = (from p in limitElectiveOrgList where p.tbElectiveOrg.OrgName.Equals(org.OrgName) && p.tbClass.Id == org.ClassId select p).FirstOrDefault();
                            if (limitInfo != null)
                            {
                                var classStudentCount = vm.ImportList.Count(p => p.ClassId == org.ClassId);
                                //判断选课班级对当前学生所在班级的限制人数
                                if (classStudentCount > limitInfo.RemainCount)
                                {
                                    org.Error += "针对当前行政班级的人数限制不足!";
                                }
                            }
                        }

                        if (vm.ImportList.Count(p => string.IsNullOrEmpty(p.Error) == false) > 0)
                        {
                            vm.ImportList.RemoveAll(p => string.IsNullOrEmpty(p.Error));
                            return(View(vm));
                        }

                        //分组分段

                        foreach (var item in vm.ImportList)
                        {
                            var tbElectiveOrg = electiveOrgList.Where(d => d.OrgName == item.OrgName).FirstOrDefault();
                            var tb            = new Entity.tbElectiveOrgStudent
                            {
                                tbElectiveOrg = tbElectiveOrg,
                                tbStudent     = db.Set <Student.Entity.tbStudent>().Find(studentList.Where(p => p.StudentCode == item.StudentCode && p.StudentName == item.StudentName).First().StudentId),
                                IsFixed       = item.IsFixed == "是" ? false : true,
                                IsChecked     = item.IsChecked == "是" ? true : false
                            };

                            db.Set <Entity.tbElectiveOrgStudent>().Add(tb);

                            if (item.IsChecked == "是")
                            {
                                var tbElectiveData = new Entity.tbElectiveData()
                                {
                                    tbElectiveOrg = tb.tbElectiveOrg,
                                    tbStudent     = tb.tbStudent,
                                    IsPreElective = true,
                                    IsFixed       = tb.IsFixed,
                                    InputDate     = DateTime.Now
                                };
                                db.Set <Entity.tbElectiveData>().Add(tbElectiveData);
                                tbElectiveOrg.RemainCount--;

                                //更新行政班剩余人数
                                var limit = (from p in limitElectiveOrgList where p.tbElectiveOrg.Id == tbElectiveOrg.Id && p.tbClass.Id == item.ClassId select p).FirstOrDefault();
                                if (limit != null)
                                {
                                    limit.RemainCount--;
                                }
                            }
                        }

                        if (db.SaveChanges() > 0)
                        {
                            XkSystem.Areas.Sys.Controllers.SysUserLogController.Insert("导入了预选学生!");
                            vm.ImportList.RemoveAll(p => string.IsNullOrEmpty(p.Error));
                            vm.Status = true;
                        }
                    }
                }
            }

            return(View(vm));
        }
        public ActionResult Insert(List <int> ids, int orgId, int electiveId)
        {
            using (var db = new XkSystem.Models.DbContext())
            {
                var error = new List <string>();
                var electiveClassIdList = db.Table <Entity.tbElectiveClass>().Where(p => p.tbElective.Id == electiveId && p.IsDeleted == false).Select(p => p.tbClass.Id).ToList();

                if (electiveClassIdList != null && !electiveClassIdList.Any())
                {
                    error.AddError("当前选课设置不完整,尚未设置适用班级!");
                    return(Code.MvcHelper.Post(error));
                }

                //已预选学生列表
                var orgStudentList = (from p in db.Table <Entity.tbElectiveOrgStudent>()
                                      where p.tbElectiveOrg.Id == orgId
                                      select p.tbStudent.Id).ToList();

                var studentList = (from p in db.Table <Student.Entity.tbStudent>()
                                   join c in db.Table <Basis.Entity.tbClassStudent>() on p.Id equals c.tbStudent.Id
                                   where ids.Contains(p.Id) && orgStudentList.Contains(p.Id) == false
                                   select new {
                    tbStudent = p,
                    tbClass = c.tbClass
                }).ToList();

                //移除班级不符合条件的学生
                //studentList.RemoveAll(p => !db.Table<Basis.Entity.tbClassStudent>().Where(c => c.IsDeleted == false && electiveClassIdList.Contains(c.tbClass.Id)).Select(c => c.tbStudent.Id).Contains(p.tbStudent.Id));
                studentList.RemoveAll(p => !electiveClassIdList.Contains(p.tbClass.Id));

                //移除已经选过该课程的学生
                studentList.RemoveAll(p => db.Table <Entity.tbElectiveData>().Any(e => e.tbStudent.Id == p.tbStudent.Id && e.tbElectiveOrg.Id == orgId && e.IsDeleted == false));

                if (!studentList.Any())
                {
                    error.AddError("所选学生列表中有数据不符合当前选课的要求!");
                    return(Code.MvcHelper.Post(error));
                }

                var electiveOrg = db.Set <Entity.tbElectiveOrg>().Where(p => p.Id == orgId && p.IsDeleted == false).FirstOrDefault();
                if (electiveOrg.RemainCount < studentList.Count)
                {
                    error.AddError("课程剩余人数不足!");
                    return(Code.MvcHelper.Post(error));
                }


                var studentCountByClass = (from p in studentList
                                           group p by new { p.tbClass.Id, p.tbClass.ClassName } into g
                                           select new
                {
                    ClassId = g.Key.Id,
                    ClassName = g.Key.ClassName,
                    StudentCount = g.Count()
                });

                var limitOrgList = (from p in db.Table <Entity.tbElectiveOrgClass>().Include(p => p.tbClass).Include(p => p.tbElectiveOrg)
                                    where p.tbElectiveOrg.Id == orgId &&
                                    p.tbElectiveOrg.IsDeleted == false
                                    select p).ToList();

                foreach (var item in studentCountByClass)
                {
                    if (limitOrgList.Exists(p => p.tbClass.Id == item.ClassId && p.RemainCount < item.StudentCount))
                    {
                        error.AddError($"针对当前行政班级{item.ClassName}的人数限制不足!");
                        return(Code.MvcHelper.Post(error));
                    }
                }


                foreach (var student in studentList)
                {
                    var tb = new Entity.tbElectiveOrgStudent()
                    {
                        tbElectiveOrg = db.Set <Entity.tbElectiveOrg>().Find(orgId),
                        tbStudent     = student.tbStudent,
                        IsFixed       = true,
                        IsChecked     = true,
                    };
                    db.Set <Entity.tbElectiveOrgStudent>().Add(tb);

                    var tbElectiveData = new Entity.tbElectiveData()
                    {
                        tbElectiveOrg = tb.tbElectiveOrg,
                        tbStudent     = tb.tbStudent,
                        IsPreElective = true,
                        IsFixed       = tb.IsFixed,
                        InputDate     = DateTime.Now
                    };
                    db.Set <Entity.tbElectiveData>().Add(tbElectiveData);

                    //预选,减少对应的选课行政班人数
                    var limitClass = limitOrgList.Where(p => p.tbElectiveOrg.Id == orgId && p.tbClass.Id == student.tbClass.Id).FirstOrDefault();
                    if (limitClass != null)
                    {
                        limitClass.RemainCount--;
                    }
                }
                electiveOrg.RemainCount -= studentList.Count;

                if (db.SaveChanges() > 0)
                {
                    XkSystem.Areas.Sys.Controllers.SysUserLogController.Insert("添加了选课预选学生!");
                }
                return(Code.MvcHelper.Post(error));
            }
        }