public ActionResult Import(Models.MoralItem.Import vm) { if (ModelState.IsValid) { var file = Request.Files[nameof(vm.UploadFile)]; var fileSave = System.IO.Path.GetTempFileName(); file.SaveAs(fileSave); using (var db = new XkSystem.Models.DbContext()) { 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)); } } if (dt.Rows.Count == 0) { ModelState.AddModelError(string.Empty, "上传的文件不包含任何有效数据!"); return(View(vm)); } var listMoralGroup = (from p in db.Table <Moral.Entity.tbMoralGroup>().Include(p => p.tbMoral) where p.tbMoral.Id == vm.MoralId select p).ToList(); var listMoralItem = (from p in db.Table <Moral.Entity.tbMoralItem>().Include(p => p.tbMoralGroup) where p.tbMoralGroup.tbMoral.Id == vm.MoralId select p).ToList(); var moralExpressList = typeof(Code.EnumHelper.MoralExpress).ToItemList(); var moralItemTypeList = typeof(Code.EnumHelper.MoralItemType).ToItemList(); for (var i = 0; i < dt.Rows.Count; i++) { var dr = dt.Rows[i]; var importModel = new Dto.MoralItem.Import() { MoralItemName = dr["项目名称"].ConvertToString(), MoralGroupName = dr["德育分组"].ConvertToString(), MinScore = dr["最小分值"].ConvertToString(), MaxScore = dr["最大分值"].ConvertToString(), InitScore = dr["初始分值"].ConvertToString(), MoralExpress = dr["表达式"].ConvertToString(), MoralItemType = dr["选项类型"].ConvertToString(), MoralOptionString = dr["德育选项"].ConvertToString(), }; if (string.IsNullOrWhiteSpace(importModel.MoralItemName)) { importModel.ImportError += "项目名称为空;"; } else { if (listMoralItem.Count(p => p.tbMoralGroup.tbMoral.Id == vm.MoralId && p.MoralItemName.Equals(importModel.MoralItemName)) > 0) { importModel.ImportError += "系统中已存在相同名称的记录;"; } } if (string.IsNullOrWhiteSpace(importModel.MoralGroupName)) { importModel.ImportError += "德育分组为空;"; } else { if (listMoralGroup.Count(p => p.tbMoral.Id == vm.MoralId && p.MoralGroupName.Equals(importModel.MoralGroupName)) == 0) { importModel.ImportError += "找不到相应的德育分组;"; } } if (importModel.MinScore.ConvertToDecimal() <= decimal.Zero) { importModel.ImportError += "最小分值不合法或小于等于0;"; } if (importModel.MaxScore.ConvertToDecimal() <= decimal.Zero) { importModel.ImportError += "最大分值不合法或小于等于0;"; } if (importModel.InitScore.ConvertToDecimal() < importModel.MinScore.ConvertToDecimal() || importModel.InitScore.ConvertToDecimal() > importModel.MaxScore.ConvertToDecimal()) { importModel.ImportError += "初始分值必须介于最大最小分值之间;"; } if (string.IsNullOrWhiteSpace(importModel.MoralExpress) || !moralExpressList.Exists(p => p.Text.Equals(importModel.MoralExpress))) { importModel.ImportError += $"表达式值只能是 [{string.Join("、", moralExpressList.Select(p => p.Text).ToList())}]中的一种;"; } if (string.IsNullOrWhiteSpace(importModel.MoralItemType) || !moralItemTypeList.Exists(p => p.Text.Equals(importModel.MoralItemType))) { importModel.ImportError += $"选项类型值只能是[{string.Join("、", moralItemTypeList.Select(p => p.Text).ToList())}]中的一种;"; } else { Code.EnumHelper.MoralItemType _moralItemType = (Code.EnumHelper.MoralItemType)System.Enum.Parse(typeof(Code.EnumHelper.MoralItemType), moralItemTypeList.Where(p => p.Text.Equals(importModel.MoralItemType)).Select(p => p.Value).First()); if (_moralItemType == Code.EnumHelper.MoralItemType.Select) { if (string.IsNullOrWhiteSpace(importModel.MoralOptionString)) { importModel.ImportError += $"选项类型为{_moralItemType.GetDescription()}时德育选项不能为空;"; } else { var optionList = importModel.MoralOptionString.Split('|').ToList(); foreach (var p in optionList) { var option = p.Split(','); if (option == null || !option.Any() || option.Length != 2) { importModel.ImportError += "德育选项值不正确;"; break; } else if (option[1].ConvertToDecimal() < importModel.MinScore.ConvertToDecimal() || option[1].ConvertToDecimal() > importModel.MaxScore.ConvertToDecimal()) { importModel.ImportError += "德育选项中的值必须介于最小分值和最大分值之间;"; break; } } } } } vm.ImportList.Add(importModel); } if (vm.ImportList.Count(p => !string.IsNullOrWhiteSpace(p.ImportError)) > 0) { vm.ImportList.RemoveAll(p => string.IsNullOrWhiteSpace(p.ImportError)); return(View(vm)); } var groupByItemName = vm.ImportList.GroupBy(p => p.MoralItemName).Where(p => p.Count() > 1).Select(p => p.Key).ToList(); if (groupByItemName != null && groupByItemName.Any()) { vm.ImportList.Where(p => groupByItemName.Contains(p.MoralItemName)).ToList().ForEach(p => { p.ImportError += "项目名称重复;"; }); } if (vm.ImportList.Count(p => !string.IsNullOrWhiteSpace(p.ImportError)) > 0) { vm.ImportList.RemoveAll(p => string.IsNullOrWhiteSpace(p.ImportError)); return(View(vm)); } var list = new List <Moral.Entity.tbMoralItem>(); list.AddRange(vm.ImportList.Select(p => new Moral.Entity.tbMoralItem() { MoralItemName = p.MoralItemName, MoralItemType = (Code.EnumHelper.MoralItemType)System.Enum.Parse(typeof(Code.EnumHelper.MoralItemType), moralItemTypeList.Where(t => t.Text.Equals(p.MoralItemType)).Select(t => t.Value).First()), MoralExpress = (Code.EnumHelper.MoralExpress)System.Enum.Parse(typeof(Code.EnumHelper.MoralExpress), moralExpressList.Where(e => e.Text.Equals(p.MoralExpress)).Select(e => e.Value).First()), InitScore = p.InitScore.ConvertToDecimal(), MaxScore = p.MaxScore.ConvertToDecimal(), MinScore = p.MinScore.ConvertToDecimal(), tbMoralGroup = listMoralGroup.FirstOrDefault(g => g.MoralGroupName.Equals(p.MoralGroupName)), No = db.Table <Moral.Entity.tbMoralItem>().Where(i => i.tbMoralGroup.tbMoral.Id == vm.MoralId && i.tbMoralGroup.MoralGroupName.Equals(p.MoralGroupName)).Select(g => g.No).DefaultIfEmpty(0).Max() + 1, MoralItemKind = Code.EnumHelper.MoralItemKind.Student, DefaultValue = decimal.Zero })); db.Set <Moral.Entity.tbMoralItem>().AddRange(list); var listMoralOption = new List <Moral.Entity.tbMoralOption>(); list.Where(p => p.MoralItemType == Code.EnumHelper.MoralItemType.Select).ToList().ForEach(p => { var optionList = vm.ImportList.FirstOrDefault(l => l.MoralItemName.Equals(p.MoralItemName)).MoralOptionString.Split('|'); listMoralOption.AddRange(optionList.Select(o => new Moral.Entity.tbMoralOption() { No = db.Table <Moral.Entity.tbMoralOption>().Where(i => i.tbMoralItem.MoralItemName.Equals(p.MoralItemName)).Select(g => g.No).DefaultIfEmpty(0).Max() + 1, MoralOptionName = o.Split(',')[0], MoralOptionValue = o.Split(',')[1].ConvertToDecimal(), tbMoralItem = p }).ToList()); }); db.Set <Moral.Entity.tbMoralOption>().AddRange(listMoralOption); if (db.SaveChanges() > 0) { Sys.Controllers.SysUserLogController.Insert("批量导入了德育项目!"); vm.ImportList.RemoveAll(p => string.IsNullOrWhiteSpace(p.ImportError)); vm.Status = true; } } } } } return(View(vm)); }
public ActionResult Import() { var vm = new Models.MoralItem.Import(); return(View(vm)); }