using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; using System.Web.Configuration; using System.Web.Mvc; using Weee.Areas.Admin.Supports; using Weee.Areas.Admin.ViewModels; using Weee.Models.Paramemter; using Weee.DAL; using System.Net; using PagedList; using System.Threading; using Weee.Models; namespace Weee.Areas.Admin.Controllers { public class ParameterDatabaseController : AdminControllerBase { private string fileSavedPath = WebConfigurationManager.AppSettings["UploadPath"]; public ParameterDatabaseController(WeeeDataContext db) : base(db) { } public ActionResult Index(int simaproVersionID = 0, int simaproCategoryID = 0 , int simaproTypeID = 0, int page = 1, string searchString = null) { var simaproViewModel = new SimaproIndexViewModel(); if (db.SimaproVersions.ToList().Count() == 0) { ViewBag.errorMsg = "Please Import Data"; return View(); } simaproViewModel.SimaproVersions = db.SimaproVersions.Where(x => x.IsActive == true) .OrderByDescending(x=>x.ID).ToList(); //simaproViewModel.SimaproVersion = simaproVersionID == 0 ? db.SimaproVersions.First() : db.SimaproVersions.Find(simaproVersionID); simaproViewModel.SimaproVersion = simaproVersionID == 0 ? new SimaproVersion() : db.SimaproVersions.Find(simaproVersionID); simaproViewModel.SimaproParameterCategories = simaproViewModel.SimaproVersion.Categories.ToList(); //DL-39 begin //simaproViewModel.SimaproParameterCategory = simaproCategoryID == 0 ? simaproViewModel.SimaproParameterCategories.First() : db.SimaproCategories.Find(simaproCategoryID);//DL-39 if (simaproCategoryID != 0) { var categories = simaproViewModel.SimaproVersion.Categories.ToList(); foreach (var itm in categories) { if (itm.ID == simaproCategoryID) { simaproViewModel.SimaproParameterCategory = db.SimaproCategories.Find(simaproCategoryID); break; } } if (simaproViewModel.SimaproParameterCategory == null) { //DL-77 if (simaproViewModel.SimaproVersion.Categories.ToList().Count > 0) { simaproViewModel.SimaproParameterCategory = simaproViewModel.SimaproVersion.Categories.ToList().First(); } else { simaproViewModel.SimaproParameterCategory = null; } //simaproViewModel.SimaproParameterCategory = simaproViewModel.SimaproVersion.Categories.ToList().First(); } } else { simaproViewModel.SimaproParameterCategory = simaproViewModel.SimaproParameterCategories.Count > 0 ? simaproViewModel.SimaproParameterCategories.First() : null; //DL-77 //simaproViewModel.SimaproParameterCategory = simaproViewModel.SimaproParameterCategories.First();//DL-77 } //end simaproViewModel.SimaproParameterTypes = simaproViewModel.SimaproParameterCategory !=null? simaproViewModel.SimaproParameterCategory.SubTypes.ToList() : null; //DL-77 //simaproViewModel.SimaproParameterTypes = simaproViewModel.SimaproParameterCategory.SubTypes.ToList();//DL-77 var count = simaproViewModel.SimaproParameterCategory != null ? simaproViewModel.SimaproParameterCategory.SubTypes.ToList().Count() : 0; //DL-77 //var count = simaproViewModel.SimaproParameterCategory.SubTypes.ToList().Count(); //DL-77 if (simaproTypeID == 0) { if (count > 0) { //DL-77 begin simaproViewModel.SimaproParameterType = simaproViewModel.SimaproParameterCategory != null ? simaproViewModel.SimaproParameterCategory.SubTypes.ToList().First() : null; ViewBag.simaproCategoryID = simaproViewModel.SimaproParameterType != null ? simaproViewModel.SimaproParameterType.ID : 0; //simaproViewModel.SimaproParameterType = simaproViewModel.SimaproParameterCategory.SubTypes.ToList().First(); //ViewBag.simaproCategoryID = simaproViewModel.SimaproParameterType.ID; //DL-77 end } } else { if (count > 0) { foreach (var type in simaproViewModel.SimaproParameterTypes) { if (type.ID == simaproTypeID) { simaproViewModel.SimaproParameterType = type; break; } } if (simaproViewModel.SimaproParameterType == null) { simaproViewModel.SimaproParameterType = simaproViewModel.SimaproParameterCategory != null ? simaproViewModel.SimaproParameterCategory.SubTypes.ToList().FirstOrDefault() : null;//DL-77 //simaproViewModel.SimaproParameterType = simaproViewModel.SimaproParameterCategory.SubTypes.ToList().FirstOrDefault();//DL-77 } } //simaproViewModel.SimaproParameterType = db.SimaproTypes.Find(simaproTypeID); } //simaproViewModel.SimaproParameterType = simaproTypeID == 0 ? simaproViewModel.SimaproParameterCategory.SubTypes.ToList().First() : db.SimaproTypes.Find(simaproTypeID); //end if (searchString != null && searchString.Trim()!="") { searchString = searchString.Trim(); simaproViewModel.parameters = db.SimaproParameters .Where(x => x.Remark.Contains(searchString) || x.Encoding.Contains(searchString) || x.Database.Contains(searchString)) .Where(x=>x.Type.Category.VersionID==simaproVersionID) .Where(x=>x.Type.CategoryID == simaproCategoryID) .OrderBy(x=>x.Encoding) .ToPagedList(page, 10); //DL-39 add categoryid to where clauseS } else if (simaproViewModel.SimaproParameterType != null) { simaproViewModel.parameters = simaproViewModel.SimaproParameterType.Parameters .OrderBy(x=>x.Encoding) .ToPagedList(page, 10); } //simaproViewModel.parameters = simaproViewModel.SimaproParameterType.Parameters.ToPagedList(1, 10);//39 ViewBag.searchString = searchString; ViewBag.simaproVersionID = simaproVersionID; ViewBag.simaproCategoryID = simaproCategoryID; ViewBag.simaproTypeID = simaproTypeID; ViewBag.page = page; return View(simaproViewModel); } public ActionResult Edit(int simaproParameterID = 0) { if (simaproParameterID == 0) return new HttpStatusCodeResult(HttpStatusCode.BadRequest); var simaproParameter = db.SimaproParameters.Find(simaproParameterID); if (simaproParameter == null) return HttpNotFound(); return View(simaproParameter); } [HttpPost] [Weee.Filter.MvcLog("Edit", "SimaproDatabase")] public ActionResult Edit(SimaproParameter simaproParameter, int simaproParameterID = 0) { var updatedSimaproParameter = db.SimaproParameters.Find(simaproParameterID); updatedSimaproParameter.DisplayNameTW = simaproParameter.DisplayNameTW; updatedSimaproParameter.DisplayNameEN = simaproParameter.DisplayNameEN; updatedSimaproParameter.DisplayNameCN = simaproParameter.DisplayNameCN; db.SaveChanges(); return RedirectToAction("Edit", new { simaproParameterID = simaproParameterID }); } public ActionResult EditSimaproVersion(int simaproVersionID = 0) { if (simaproVersionID == 0) return new HttpStatusCodeResult(HttpStatusCode.BadRequest); var simaproVersion = db.SimaproVersions.Find(simaproVersionID); if (simaproVersion == null) return HttpNotFound(); var versions = db.SimaproVersions; var qry = versions .Where(x => x.ID == simaproVersionID) .Select(x => x.Categories .SelectMany(y => y.SubTypes. SelectMany(z => z.Parameters)).Count()); ViewBag.ParameterCount = qry.First().ToString(); return View(simaproVersion); } [HttpPost] [Weee.Filter.MvcLog("EditSimaproVersion", "SimaproDatabase")] public ActionResult EditSimaproVersion(SimaproVersion simaproVersion, string count) { ViewBag.ParameterCount = count; if (string.IsNullOrWhiteSpace(simaproVersion.Version)) { ViewBag.errorMsg = "請填寫版本描述"; return View("EditSimaproVersion", simaproVersion); } var isVersionExist = db.SimaproVersions.Where(x => x.ID != simaproVersion.ID && x.Version == simaproVersion.Version).AsEnumerable().Any(); if (isVersionExist) { ViewBag.errorMsg = "版本描述不得重複"; return View("EditSimaproVersion", simaproVersion); } if (string.IsNullOrWhiteSpace(simaproVersion.paraSource)) { ViewBag.errorMsg = "請填寫係數來源"; return View("EditSimaproVersion", simaproVersion); } if (string.IsNullOrWhiteSpace(simaproVersion.Description)) { ViewBag.errorMsg = "請填寫描述"; return View("EditSimaproVersion", simaproVersion); } var updatedSimaproVersion = db.SimaproVersions.Find(simaproVersion.ID); updatedSimaproVersion.Version = simaproVersion.Version; updatedSimaproVersion.Description = simaproVersion.Description; updatedSimaproVersion.paraSource = simaproVersion.paraSource; db.SaveChanges(); return RedirectToAction("Import"); } public ActionResult Detail(int simaproParameterID = 0) { if (simaproParameterID == 0) return new HttpStatusCodeResult(HttpStatusCode.BadRequest); var simaproParameter = db.SimaproParameters.Find(simaproParameterID); if (simaproParameter == null) return HttpNotFound(); return View(simaproParameter); } public ActionResult ToggleStatus(int id) { var v = db.SimaproVersions.Find(id); v.IsActive = !v.IsActive; v.IsDeleteable = false; db.SaveChanges(); return RedirectToAction("import"); } public ActionResult DeleteVersion(int id) { //delete lca before delete simapro parameters //var ids = db.SimaproParameters.Where(x => x.Type.Category.VersionID == id).Select(x=>x.ID).ToList(); //var lcaIDs = db.ProductLCAProductSurveyForm_Material.Where(x => ids.Contains((int)x.ParameterID)).Select(x=>x.LCAID).ToList(); var lcaIDs = db.ProductLCAProductSurveyForm_Material.Join(db.SimaproParameters, x => x.ParameterID, sp => sp.ID, (x, sp) => new { versionID = sp.Type.Category.VersionID, LCAID = x.LCAID }).Where(x => x.versionID == id).Select(x => x.LCAID).Distinct().ToList(); var lcaIDs2 = db.ProductLCAProductSurveyForm_Material.Join(db.SimaproCategories, x => x.ParameterTypeID, sc => sc.ID, (x, sc) => new { versionID = sc.VersionID, LCAID = x.LCAID }).Where(x => x.versionID == id).Select(x => x.LCAID).Distinct().ToList(); var totalLcaIDs = lcaIDs.Union(lcaIDs2).ToList(); for (int i = 0; i < totalLcaIDs.Count; i++) { var lcaID = totalLcaIDs[i]; LCA lca = db.LCAs.Find(lcaID); if (lca is OrganizationLCA) { OrganizationLCA olca = lca as OrganizationLCA; var qry4 = (from a in db.OrganizationOtherCompound where a.LCAID == olca.ID select a); db.OrganizationOtherCompound.RemoveRange(qry4); olca = db.OrganizationLCAs.Find(lcaID); db.OrganizationLCAs.Remove(olca); } else if (lca is ProductLCA) { ProductLCA plca = lca as ProductLCA; var qry1 = db.ProductLCAFabSurveyResults.Find(lcaID); if (qry1 != null) db.ProductLCAFabSurveyResults.Remove(qry1); var qry3 = (from a in db.ProductLCAReplyRequests join b in db.ProductLCAProductSurveyForm_Material on a.ID equals b.ID where b.LCAID == lcaID select a); db.ProductLCAReplyRequests.RemoveRange(qry3); var qry2 = db.ProductLCAProductSurveyForm_Material.Where(x => x.LCAID == lcaID); db.ProductLCAProductSurveyForm_Material.RemoveRange(qry2); var qry5 = db.ProductLCAFabSurveyForm_Transport.Where(x => x.LCAID == lcaID); db.ProductLCAFabSurveyForm_Transport.RemoveRange(qry5); var qry6 = db.ProductLCAFabSurveyForm_OtherCompound.Where(x => x.LCAID == lcaID); db.ProductLCAFabSurveyForm_OtherCompound.RemoveRange(qry6); var qry7 = db.ProductLCAFabSurveyForm_Wastes.Where(x => x.LCAID == lcaID); db.ProductLCAFabSurveyForm_Wastes.RemoveRange(qry7); var qry8 = db.ProductLCAFabSurveyForm_WasteTransport.Where(x => x.LCAID == lcaID); db.ProductLCAFabSurveyForm_WasteTransport.RemoveRange(qry8); var qry9 = db.ProductLCAFabSurveyForm_WaterUsage.Where(x => x.LCAID == lcaID); db.ProductLCAFabSurveyForm_WaterUsage.RemoveRange(qry9); var qry10 = db.ProductLCAAbandonedStages.Where(x => x.ID == lcaID); db.ProductLCAAbandonedStages.RemoveRange(qry10); var qry11 = db.ProductLCAReplyRequests.Where(x => x.RepliedLCAID == lcaID); db.ProductLCAReplyRequests.RemoveRange(qry11); plca = db.ProductLCAs.Find(lcaID); db.ProductLCAs.Remove(plca); } db.LCAs.Remove(lca); db.SaveChanges(); } var v = db.SimaproVersions.Find(id); db.SimaproVersions.Remove(v); db.SaveChanges(); return RedirectToAction("import"); } public ActionResult Import() { try { ViewBag.errorMsg = TempData["errorMsg"]; ViewBag.successMsg = TempData["successMsg"]; var versions = db.SimaproVersions.OrderByDescending(x=>x.ID); var qry = versions .Select(x => x.Categories .SelectMany(y => y.SubTypes. SelectMany(z => z.Parameters)).Count()); var versionsList = versions.ToList(); ViewBag.ParameterCounts = qry.ToList(); ViewBag.History = versionsList; ViewBag.version = DateTime.Now.ToString("yyMMddHHmmss"); List relatedCount = new List(); var relatedCountQuery = db.ProductLCAProductSurveyForm_Material.Join(db.SimaproParameters, x => x.ParameterID, sp => sp.ID, (x, sp) => new { versionID = sp.Type.Category.VersionID, LCAID = x.LCAID }); var relatedCountQuery2 = db.ProductLCAProductSurveyForm_Material.Join(db.SimaproCategories, x => x.ParameterTypeID, sc => sc.ID, (x, sc) => new { versionID = sc.VersionID, LCAID = x.LCAID }); for (int i = 0; i < versionsList.Count; i++) { var versionID = versionsList[i].ID; var count = relatedCountQuery.Where(x => x.versionID == versionID).Select(x => x.LCAID).Distinct().Count(); var count2 = relatedCountQuery2.Where(x => x.versionID == versionID).Select(x => x.LCAID).Distinct().Count(); relatedCount.Add((count + count2)); } ViewBag.relatedCount = relatedCount; } catch (Exception ex) { string err = ex.Message; Thread.Sleep(0); } return View(); } [HttpPost] [Weee.Filter.MvcLog("Import", "SimaproDatabase")] public ActionResult Upload(string description = "", string parasource = "", string version="") { if (Request == null) return new HttpStatusCodeResult(HttpStatusCode.BadRequest); HttpPostedFileBase file = Request.Files["UploadedFile"]; if (!this.UploadFileIsValid(file)) return RedirectToAction("Import"); if (version == "") { TempData["errorMsg"] = "請填寫版本描述"; return RedirectToAction("Import"); } var isVersionExist = db.SimaproVersions.Where(x =>x.Version == version).AsEnumerable().Any(); if (isVersionExist) { TempData["errorMsg"] = "版本描述不得重複"; return RedirectToAction("Import"); } if (parasource == "") { TempData["errorMsg"] = "請填寫係數來源"; return RedirectToAction("Import"); } if (description == "") { TempData["errorMsg"] = "請填寫描述"; return RedirectToAction("Import"); } try { var fileName = this.FileUploadHandler(file); //var version2 = DateTime.Now.ToString("yyyyMMdd_") + Path.GetFileNameWithoutExtension(file.FileName).Substring(0, Math.Min(10, Path.GetFileNameWithoutExtension(file.FileName).Length)); description += $"\n({Path.GetFileNameWithoutExtension(file.FileName)})"; this.ImportExcelToDatabase(fileName, version, description, parasource); TempData["successMsg"] = "File Import Success!"; } catch (Exception exception) { if (exception.InnerException != null && exception.InnerException.Message.CompareTo( "External table is not in the expected format.") == 0) { TempData["errorMsg"] = "請使用*.xlsx檔案"; } else TempData["errorMsg"] = exception.Message; return RedirectToAction("Import"); } return RedirectToAction("Import"); } private string FileUploadHandler(HttpPostedFileBase file) { string result; if (file == null) { throw new ArgumentNullException("file", "Upload failed: No File!"); } if (file.ContentLength <= 0) { throw new InvalidOperationException("Upload failed: There is no content in this file"); } string virtualBaseFilePath = Url.Content(fileSavedPath); string filePath = HttpContext.Server.MapPath(virtualBaseFilePath); if (!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); } string fileName = string.Concat(DateTime.Now.ToString("yyyyMMddHHmmssfff"), Path.GetExtension(file.FileName).ToLower()); string fullFilePath = Path.Combine(Server.MapPath(fileSavedPath), fileName); file.SaveAs(fullFilePath); result = fileName; return result; } private void ImportExcelToDatabase(string savedFileName, string version, string description, string parasource) { var fileName = string.Concat(Server.MapPath(fileSavedPath), "/", savedFileName); var excelImporter = new SimaproExcelImporter(fileName); excelImporter.InsertSimaproData(version, description, parasource); excelImporter.DeleteExcelFile(fileName); } private bool UploadFileIsValid(HttpPostedFileBase file) { if (file == null) { TempData["errorMsg"] = "Please upload the file"; return false; } if (file.ContentLength <= 0) { TempData["errorMsg"] = "Please upload the file"; return false; } string fileExistName = Path.GetExtension(file.FileName).ToLower(); if (!fileExistName.Equals(".xls", StringComparison.OrdinalIgnoreCase) && !fileExistName.Equals(".xlsx", StringComparison.OrdinalIgnoreCase) && !fileExistName.Equals(".csv", StringComparison.OrdinalIgnoreCase)) { TempData["errorMsg"] = "Please upload xls or xlsx format file"; return false; } return true; } } }