using BLL; using BLL.Common; using FineUIPro.Web.BaseInfo; using FineUIPro.Web.DataShow; using Model; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.IO; using System.Linq; using System.Web.Services.Description; namespace FineUIPro.Web.HSSE.Check { public partial class CheckSpecialProDetailIn : PageBase { #region 定义变量 /// /// 上传预设的虚拟路径 /// private string initPath = Const.ExcelUrl; /// /// 错误集合 /// public static List errorInfos = new List(); /// /// 项目id /// public string ProjectId { get { return (string)ViewState["ProjectId"]; } set { ViewState["ProjectId"] = value; } } /// /// 检查id /// public string CheckSpecialId { get { return (string)ViewState["CheckSpecialId"]; } set { ViewState["CheckSpecialId"] = value; } } public static int Cols = 11;//列数 public static Dictionary imgDic = new Dictionary(); //public static List unitWorks = new List(); public static List unitWorks = new List(); public static List units = new List(); public static List hseManagers = new List(); public static List types = new List(); public static List validLevelStrings = new List { "低风险", "一般风险", "较大风险", "重大风险" }; public static List validStateStrings = new List { "待整改", "已整改" }; public static List validTypeStrings = new List { "当场纠正", "口头警告" }; #endregion protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { this.ProjectId = Request.Params["ProjectId"]; this.CheckSpecialId = Request.Params["CheckSpecialId"]; ///单位工程 var unitWorkList = (from x in Funs.DB.WBS_UnitWork where x.ProjectId == this.ProjectId && x.SuperUnitWork == null orderby x.UnitWorkCode select x).ToList(); //var unitWorkList = (from x in Funs.DB.WBS_UnitWork // where x.ProjectId == this.ProjectId && x.SuperUnitWork == null // orderby x.UnitWorkCode // select new // { // x.UnitWorkId, // UnitWorkName = UnitWorkService.GetUnitWorkALLName(x.UnitWorkId) // }).ToList(); if (unitWorkList.Any()) { unitWorks.AddRange(unitWorkList); //unitWorks.AddRange(unitWorkList.Select(x => x.UnitWorkName)); } //受检单位 units = (from x in Funs.DB.Base_Unit join y in Funs.DB.Project_ProjectUnit on x.UnitId equals y.UnitId where y.ProjectId == this.ProjectId orderby x.UnitCode select x).ToList(); //HSE经理 hseManagers = BLL.ProjectUserService.GetProjectUserByUnitidAndProjectId(this.ProjectId, Const.HSSEManager); //安全巡检类型 types = BLL.HSSE_Hazard_HazardRegisterTypesService.GetHazardRegisterTypesList("1"); this.hdFileName.Text = string.Empty; if (errorInfos != null) { errorInfos.Clear(); } //if (this.CurrUser.UserId == Const.AdminId) //{ // this.btnFastImport.Hidden = false; //} } } #region 下载模板 /// /// 下载模板按钮 /// /// /// protected void btnDownLoad_Click(object sender, EventArgs e) { //这里要注意了,如果传过来的没有记录 PageContext.RegisterStartupScript(Confirm.GetShowReference("确定下载导入模板吗?", String.Empty, MessageBoxIcon.Question, PageManager1.GetCustomEventReference(false, "Confirm_OK"), PageManager1.GetCustomEventReference("Confirm_Cancel"))); } /// /// 下载导入模板 /// /// /// protected void PageManager1_CustomEvent(object sender, CustomEventArgs e) { if (e.EventArgument == "Confirm_OK") { string rootPath = Server.MapPath("~/"); string uploadfilepath = rootPath + Const.CheckSpecialDetailTemplateUrl; string filePath = Const.CheckSpecialDetailTemplateUrl; string fileName = Path.GetFileName(filePath); FileInfo info = new FileInfo(uploadfilepath); long fileSize = info.Length; Response.ClearContent(); Response.AddHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); Response.ContentType = "excel/plain"; Response.ContentEncoding = System.Text.Encoding.UTF8; Response.AddHeader("Content-Length", fileSize.ToString().Trim()); Response.TransmitFile(uploadfilepath, 0, fileSize); Response.End(); } } #endregion #region 审核 /// /// 审核 /// /// /// protected void btnAudit_Click(object sender, EventArgs e) { try { if (this.fuAttachUrl.HasFile == false) { ShowNotify("请您选择Excel文件!", MessageBoxIcon.Warning); return; } string IsXls = Path.GetExtension(this.fuAttachUrl.FileName).ToString().Trim().ToLower(); if (IsXls != ".xls" && IsXls != ".xlsx") { ShowNotify("只可以选择Excel文件!", MessageBoxIcon.Warning); return; } if (errorInfos != null) { errorInfos.Clear(); } string rootPath = Server.MapPath("~/"); string initFullPath = rootPath + initPath; if (!Directory.Exists(initFullPath)) { Directory.CreateDirectory(initFullPath); } this.hdFileName.Text = BLL.Funs.GetNewFileName() + IsXls; string filePath = initFullPath + this.hdFileName.Text; this.fuAttachUrl.PostedFile.SaveAs(filePath); AuditExcelAndShowResult(filePath); } catch (Exception ex) { ShowNotify("'" + ex.Message + "'", MessageBoxIcon.Warning); } } /// /// 审核Excel并展示校验结果 /// private void AuditExcelAndShowResult(string fileName) { try { string msg = string.Empty; var dt =NPOIHelper.ExcelToDataSet(fileName, out msg, true); if (dt != null) { //string rootPath = Server.MapPath("~/"); //var localPath = ConfigurationManager.AppSettings["localRoot"]; //imgDic = NPOIHelper.ExtractDispimgImagesFromXml(rootPath + initPath + this.hdFileName.Text, localPath + "FileUpload/CheckSpecial"); ValidateExcelData(dt.Tables[0], false); hdCheckResult.Text = "1"; } } catch (Exception exc) { BLL.ErrLogInfo.WriteLog("", exc); Response.Write(exc); } } /// /// 校验Excel数据(仅校验) /// /// /// true:导入;false:审核 /// private bool ValidateExcelData(DataTable pds, bool import) { int ic = pds.Columns.Count; if (ic < Cols) { ShowNotify($"导入Excel格式错误!Excel只有{ic}列", MessageBoxIcon.Warning); return false; } int ir = pds.Rows.Count; if (pds == null || ir <= 0) { ShowNotify("导入数据为空!", MessageBoxIcon.Warning); return false; } var errors = new List(); for (int i = 0; i < ir; i++) { var (error, _) = ValidateRowAndBuildEntity(pds.Rows[i], (i + 2).ToString(), import); if (error.Any()) { errors.AddRange(error); } } errorInfos.Clear(); errorInfos.AddRange(errors); this.gvErrorInfo.DataSource = errorInfos; this.gvErrorInfo.DataBind(); if (errors.Count > 0) { ShowNotify("存在校验错误,请查看错误列表并修正后再次导入。", MessageBoxIcon.Warning); return false; } ShowNotify("审核完成,请点击导入!", MessageBoxIcon.Success); return true; } /// /// 校验单行并生成实体(字段顺序与新模板一致) /// private (List lstError, Model.Check_CheckSpecialProDetail entity) ValidateRowAndBuildEntity(DataRow row, string displayRow, bool import) { List lstError = new List(); // 新模板字段顺序 string checkAreaName = row[0]?.ToString().Trim(); // 单位工程 string checkUnitName = row[1]?.ToString().Trim(); // 受检单位 string hseManageName = row[2]?.ToString().Trim(); // HSE经理 string description = row[3]?.ToString().Trim(); // 问题描述 string urls = row[4]?.ToString().Trim(); // 问题图片地址 string checkItemName = row[5]?.ToString().Trim(); // 问题类型 string levelName = row[6]?.ToString().Trim(); // 风险级别 string completeStatusName = row[7]?.ToString().Trim(); // 现场处理结果 string handMethod = row[8]?.ToString().Trim(); // 处理方式 string limitedDateStr = row[9]?.ToString().Trim(); // 限时日期 string suggestions = row[10]?.ToString().Trim(); // 整改要求 string CheckArea = string.Empty; string UnitId = string.Empty; string HSEManageId = string.Empty; string CheckContent = string.Empty; string CheckItem = string.Empty; string RiskLevel = string.Empty; bool CompleteStatus = false; DateTime? CompletedDate = null; string RectifyOpinion = string.Empty; DateTime? LimitedDate = null; string Suggestions = string.Empty; // 校验并转换 if (!string.IsNullOrEmpty(checkAreaName)) { if (unitWorks.Any(x => x.UnitWorkName == checkAreaName)) { //CheckArea = checkAreaName; CheckArea = unitWorks.Where(x => x.UnitWorkName == checkAreaName).FirstOrDefault().UnitWorkId; } else { lstError.Add(new ErrorInfo { Row = displayRow, Column = "单位工程", Reason = $"单位工程名称[{checkAreaName}]不存在" }); } } else { lstError.Add(new ErrorInfo { Row = displayRow, Column = "单位工程", Reason = "不能为空" }); } if (!string.IsNullOrEmpty(checkUnitName)) { if (units.Any(x => x.UnitName == checkUnitName)) { UnitId = units.Where(x => x.UnitName == checkUnitName).FirstOrDefault().UnitId; } else { lstError.Add(new ErrorInfo { Row = displayRow, Column = "受检单位", Reason = $"受检单位名称[{checkUnitName}]不存在" }); } } else { lstError.Add(new ErrorInfo { Row = displayRow, Column = "受检单位", Reason = "不能为空" }); } if (!string.IsNullOrEmpty(hseManageName)) { if (hseManagers.Any(x => x.UserName == hseManageName)) { HSEManageId = hseManagers.Where(x => x.UserName == hseManageName).FirstOrDefault().UserId; } else { lstError.Add(new ErrorInfo { Row = displayRow, Column = "HSE经理", Reason = $"项目不存在用户[{hseManageName}]" }); } } if (!string.IsNullOrEmpty(checkItemName)) { if (types.Any(x => x.RegisterTypesName == checkItemName)) { CheckContent = checkItemName; CheckItem = types.Where(x => x.RegisterTypesName == checkItemName).FirstOrDefault().RegisterTypesId; } else { lstError.Add(new ErrorInfo { Row = displayRow, Column = "问题类型", Reason = $"问题类型[{checkItemName}]不存在" }); } } if (!string.IsNullOrEmpty(levelName)) { if (validLevelStrings.Any(x => x == levelName)) { switch (levelName) { case "低": RiskLevel = "0"; break; case "一般": RiskLevel = "1"; break; case "较高": RiskLevel = "2"; break; case "高": RiskLevel = "3"; break; default: RiskLevel = "0"; break; } } else { lstError.Add(new ErrorInfo { Row = displayRow, Column = "风险级别", Reason = $"风险级别[{levelName}]不存在" }); } } if (!string.IsNullOrEmpty(completeStatusName)) { if (validStateStrings.Any(x => x == completeStatusName)) { if (completeStatusName == "已整改") { CompleteStatus = true; CompletedDate = DateTime.Now; } else { CompleteStatus = false; } } else { lstError.Add(new ErrorInfo { Row = displayRow, Column = "现场处理结果", Reason = $"现场处理结果[{completeStatusName}]不存在" }); } } if (!string.IsNullOrEmpty(handMethod)) { if (validTypeStrings.Any(x => x == handMethod)) { RectifyOpinion = handMethod; } else { lstError.Add(new ErrorInfo { Row = displayRow, Column = "处理方式", Reason = $"处理方式[{handMethod}]不存在" }); } } if (!string.IsNullOrWhiteSpace(limitedDateStr)) { if (!DateTime.TryParse(limitedDateStr, out DateTime ct)) lstError.Add(new ErrorInfo { Row = displayRow, Column = "限时日期", Reason = "日期格式错误" }); LimitedDate = ct; } else { lstError.Add(new ErrorInfo { Row = displayRow, Column = "限时日期", Reason = "不能为空" }); } if (!string.IsNullOrEmpty(suggestions)) { Suggestions = suggestions; } //if (import) //{图片待处理 // try // { // urls = urls.Substring(urls.IndexOf('"') + 1, urls.LastIndexOf('"') - urls.IndexOf('"') - 1); // var sss = imgDic.ContainsKey(urls) ? imgDic[urls].Replace(Funs.RootPath, "") : ""; // } // catch (Exception e) { } //} if (lstError.Any()) { return (lstError, null); } // 其余字段可根据实际业务映射到实体 var entity = new Model.Check_CheckSpecialProDetail { CheckSpecialDetailId = SQLHelper.GetNewID(), CheckSpecialId = this.CheckSpecialId, CheckArea = CheckArea, UnitId = UnitId, HSEManage = HSEManageId, Unqualified = description, CheckContent = CheckContent, CheckItem = CheckItem, RiskLevel = RiskLevel, CompleteStatus = CompleteStatus, CompletedDate = CompletedDate, RectifyOpinion = RectifyOpinion, LimitedDate = LimitedDate, Suggestions = Suggestions }; return (lstError, entity); } #endregion #region 导入 /// /// 导入 /// /// /// protected void btnImport_Click(object sender, EventArgs e) { if (hdCheckResult.Text == "1") { if (errorInfos.Count <= 0) { string rootPath = Server.MapPath("~/"); var localPath = ConfigurationManager.AppSettings["localRoot"]; //imgDic = NPOIHelper.ExtractDispimgImagesFromXml(rootPath + initPath + this.hdFileName.Text, localPath + "FileUpload/CheckSpecial"); ImportExcelToDatabase(rootPath + initPath + this.hdFileName.Text, true); hdCheckResult.Text = string.Empty; ShowNotify("导入成功!", MessageBoxIcon.Success); PageContext.RegisterStartupScript(ActiveWindow.GetHidePostBackReference()); } else { ShowNotify("请先将错误数据修正,再重新导入提交!", MessageBoxIcon.Warning); } } else { ShowNotify("请先审核要导入的文件!", MessageBoxIcon.Warning); } } /// /// 导入Excel到数据库 /// private void ImportExcelToDatabase(string fileName, bool import) { try { string msg = string.Empty; var dt = NPOIHelper.ExcelToDataSet(fileName, out msg, true); BLL.ErrLogInfo.WriteLog(msg); SaveExcelDataToDatabase(fileName, dt.Tables[0], import); } catch (Exception ex) { ErrLogInfo.WriteLog("", ex); } } /// /// 校验并保存数据到数据库 /// private bool SaveExcelDataToDatabase(string fileName, DataTable pds, bool import) { int ic = pds.Columns.Count; if (ic < Cols) { ShowNotify($"导入Excel格式错误!Excel只有{ic}列", MessageBoxIcon.Warning); return false; } int ir = pds.Rows.Count; if (pds == null || ir <= 0) { ShowNotify("导入数据为空!", MessageBoxIcon.Warning); return false; } var errors = new List(); var toInsert = new List(); for (int i = 0; i < ir; i++) { var (error, entity) = ValidateRowAndBuildEntity(pds.Rows[i], (i + 2).ToString(), import); if (error.Any()) errors.AddRange(error); else toInsert.Add(entity); } if (errors.Count > 0) { errorInfos.Clear(); errorInfos.AddRange(errors); this.gvErrorInfo.DataSource = errorInfos; this.gvErrorInfo.DataBind(); ShowNotify("存在校验错误,请先审核并修正后再导入。", MessageBoxIcon.Warning); return false; } try { if (toInsert.Any()) { Funs.DB.Check_CheckSpecialProDetail.InsertAllOnSubmit(toInsert); Funs.DB.SubmitChanges(); } ShowNotify($"成功导入 {toInsert.Count} 条记录。", MessageBoxIcon.Success); PageContext.RegisterStartupScript(ActiveWindow.GetHidePostBackReference()); return true; } catch (Exception ex) { ErrLogInfo.WriteLog("导入 Check_CheckSpecialProDetail 失败", ex); ShowNotify("导入失败:" + ex.Message, MessageBoxIcon.Error); return false; } } #endregion // 导入 } }