/// <summary> /// 대시보드 테이블 html 양식을 추가한다. /// </summary> public bool InsertFormHtmlTemplate(FormHtmlTemplate template) { template.ThrowIfNull(nameof(template)); string procCommandName = "up_FormHtmlTemplate_Insert"; try { var command = Connection.GetStoredProcCommand(procCommandName); Connection.AddInParameter(command, "FormID", DbType.Guid, template.FormId); Connection.AddInParameter(command, "HtmlTemplateID", DbType.Guid, template.HtmlTemplateId); Connection.AddInParameter(command, "CreatorId", DbType.String, template.CreatorId); Connection.AddInParameter(command, "Description", DbType.String, template.Description); Connection.AddInParameter(command, "ScriptContent", DbType.String, template.ScriptContent); Connection.AddInParameter(command, "HtmlContent", DbType.String, template.HtmlContent); Connection.AddInParameter(command, "StyleContent", DbType.String, template.StyleContent); Connection.AddInParameter(command, "CreatedDate", DbType.DateTimeOffset, template.CreatedDate); return((int)Connection.ExecuteNonQuery(command) > 0); } catch (Exception ex) { throw new DataException($"프로시져 실행 중 예기치 못한 에러가 발생했습니다.\r\n 프로시저: \"{procCommandName}\"", ex); } }
/// <summary> /// 대시보드 테이블 html 양식 리스트를 반환한다. /// </summary> public IEnumerable <FormHtmlTemplate> SelectFormHtmlTemplateList() { string procCommandName = "up_FormHtmlTemplate_SelectList"; try { var command = Connection.GetStoredProcCommand(procCommandName); using (DataSet ds = Connection.ExecuteDataSet(command)) { ValidateTableCount(ds, 1); var list = new List <FormHtmlTemplate>(); foreach (DataRow dr in ds.Tables[0].Rows) { var template = FormHtmlTemplate.ParseFrom(dr); list.Add(template); } return(list); } } catch (Exception ex) { throw new DataException($"프로시져 실행 중 예기치 못한 에러가 발생했습니다.\r\n 프로시저: \"{procCommandName}\"", ex); } }
/// <summary> /// 대시보드 테이블 html 양식 아이템을 반환한다. /// </summary> public FormHtmlTemplate SelectFormHtmlTemplate(Guid formId, Guid templateId) { string procCommandName = "up_FormHtmlTemplate_Select"; try { var command = Connection.GetStoredProcCommand(procCommandName); Connection.AddInParameter(command, "FormID", DbType.Guid, formId); Connection.AddInParameter(command, "HtmlTemplateID", DbType.Guid, templateId); using (DataSet ds = Connection.ExecuteDataSet(command)) { ValidateTableCount(ds, 1); if (ds.Tables[0].Rows.Count > 0) { return(FormHtmlTemplate.ParseFrom(ds.Tables[0].Rows[0])); } return(null); } } catch (Exception ex) { throw new DataException($"프로시져 실행 중 예기치 못한 에러가 발생했습니다.\r\n 프로시저: \"{procCommandName}\"", ex); } }
/// <summary> /// 대시보드의 특정 날짜 데이터 파일을 모두 확인 처리 한다. /// </summary> private bool ConfirmFormTableDataInternal(DashboardRepository repo, FormTable form, DateTimeOffset sourceDate) { // 날짜 범위에 해당하는 데이터를 모두 조회하기 위해 날짜 계산 var dateRange = form.GetDateRangeByUploadInterval(sourceDate); var list = repo.SelectDataFileSourceListBySourceDateRange(form.FormId, dateRange.BeginDate, dateRange.EndDate) .Where(o => !o.IsConfirmed) .ToList(); if (list.Any()) { Guid htmlTemplateId = form.HtmlTemplateId; // 1. 대시보드 양식 html 사본을 생성한다. if (AppSettings.AppSetting <bool>("FormHtmlTemplate.CopyIfConfirmed")) { htmlTemplateId = Guid.NewGuid(); using (var formRepo = new FormTableRepository()) { var htmlTemplate = FormHtmlTemplate.CopyFrom(form.HtmlTemplate, htmlTemplateId); formRepo.InsertFormHtmlTemplate(htmlTemplate); logger.Info($"대상 대시보드의 양식이 사본 처리되었습니다. 대시보드: \"{form.Name}\"" + $"\r\n\r\n" + $"대시보드 정보:" + $"{form}" + $"\r\n\r\n" + $"이전 양식 정보:" + $"{form.HtmlTemplate}" + $"\r\n\r\n" + $"신규 양식 정보:" + $"{htmlTemplate}"); } } // 2. 데이터 파일 소스 컨펌 처리 foreach (var fileSource in list) { repo.UpdateDataFileSourceAsConfirmed(form.FormId, fileSource.FileSourceId, htmlTemplateId, CurrentUser.UserId, DateTimeOffset.Now, fileSource.SourceDate); } logger.Info($"대상 대시보드의 실적 데이터 파일들을 확인 처리했습니다. 대시보드: \"{form.Name}\", 실적 기준일: \"{sourceDate.ToString("yyyy-MM-dd")}\"" + $"\r\n\r\n" + $"대상 데이터 파일({list.Count}개): [\r\n" + string.Join("\r\n", list.Select(o => "\t" + o.ToString())) + $"\r\n" + $"]"); return(true); } return(false); }
/// <summary> /// 페이징 처리된 대시보드 테이블 리스트를 반환한다. /// </summary> public PagedModel <FormTable> SelectFormTablePagedList(PagingOption option) { string procCommandName = "up_FormTable_SelectPagedList"; try { var command = Connection.GetStoredProcCommand(procCommandName); Connection.AddInParameter(command, "PageNumber", DbType.Int32, option.PageNumber); Connection.AddInParameter(command, "PageCount", DbType.Int32, option.PageCount); Connection.AddInParameter(command, "SortBy", DbType.String, option.SortBy); Connection.AddInParameter(command, "OrderBy", DbType.String, option.OrderBy.ToEnumMemberString()); using (DataSet ds = Connection.ExecuteDataSet(command)) { ValidateTableCount(ds, 2); var result = new PagedModel <FormTable>(option) { PagingOption = option }; int totalCount = 0; // 1. 대시보드 테이블 리스트 foreach (DataRow dr in ds.Tables[0].Rows) { var form = FormTable.ParseFrom(dr, out totalCount); result.Items.Add(form); } // 2. 대시보드 테이블 양식 리스트 foreach (DataRow dr in ds.Tables[1].Rows) { var template = FormHtmlTemplate.ParseFrom(dr); var forms = result.Items.FindAll(o => o.FormId == template.FormId && o.HtmlTemplateId == template.HtmlTemplateId); if (forms.Any()) { forms.ForEach(o => { o.HtmlTemplate = template; }); } } result.TotalCount = totalCount; return(result); } } catch (Exception ex) { throw new DataException($"프로시져 실행 중 예기치 못한 에러가 발생했습니다.\r\n 프로시저: \"{procCommandName}\"", ex); } }
/// <summary> /// 대시보드 테이블 html 양식을 추가한다. /// </summary> public bool AddFormHtmlTemplate(FormHtmlTemplate template) { using (var repo = new FormTableRepository()) { if (repo.InsertFormHtmlTemplate(template)) { logger.Info($"새 대시보드 테이블 양식을 추가하였습니다. 대시보드: \"{template.FormName}\"" + $"\r\n\r\n" + $"{template}"); return(true); } return(false); } }
/// <summary> /// 대시보드 테이블 리스트를 반환한다. /// </summary> /// <param name="queryUserId">값이 있는 경우, 해당 유저가 접근 가능한 데이터만 반환</param> public IEnumerable <FormTable> SelectFormTableList(string queryUserId = null) { string procCommandName = "up_FormTable_SelectList"; try { var command = Connection.GetStoredProcCommand(procCommandName); Connection.AddInParameter(command, "QueryUserID", DbType.String, queryUserId); using (DataSet ds = Connection.ExecuteDataSet(command)) { ValidateTableCount(ds, 2); var result = new List <FormTable>(); // 1. 대시보드 테이블 리스트 foreach (DataRow dr in ds.Tables[0].Rows) { var form = FormTable.ParseFrom(dr); result.Add(form); } // 2. 대시보드 테이블 양식 리스트 foreach (DataRow dr in ds.Tables[1].Rows) { var template = FormHtmlTemplate.ParseFrom(dr); var forms = result.FindAll(o => o.FormId == template.FormId && o.HtmlTemplateId == template.HtmlTemplateId); if (forms.Any()) { forms.ForEach(o => { o.HtmlTemplate = template; }); } } return(result); } } catch (Exception ex) { throw new DataException($"프로시져 실행 중 예기치 못한 에러가 발생했습니다.\r\n 프로시저: \"{procCommandName}\"", ex); } }
/// <summary> /// 페이징 처리된 대시보드 테이블 html 양식 리스트를 반환한다. /// </summary> public PagedModel <FormHtmlTemplate> SelectFormHtmlTemplatePagedList(PagingOption option) { string procCommandName = "up_FormHtmlTemplate_SelectPagedList"; try { var command = Connection.GetStoredProcCommand(procCommandName); Connection.AddInParameter(command, "PageNumber", DbType.Int32, option.PageNumber); Connection.AddInParameter(command, "PageCount", DbType.Int32, option.PageCount); Connection.AddInParameter(command, "SortBy", DbType.String, option.SortBy); Connection.AddInParameter(command, "OrderBy", DbType.String, option.OrderBy.ToEnumMemberString()); using (DataSet ds = Connection.ExecuteDataSet(command)) { ValidateTableCount(ds, 1); var result = new PagedModel <FormHtmlTemplate>(option) { PagingOption = option }; int totalCount = 0; foreach (DataRow dr in ds.Tables[0].Rows) { var template = FormHtmlTemplate.ParseFrom(dr, out totalCount); result.Items.Add(template); } result.TotalCount = totalCount; return(result); } } catch (Exception ex) { throw new DataException($"프로시져 실행 중 예기치 못한 에러가 발생했습니다.\r\n 프로시저: \"{procCommandName}\"", ex); } }
/// <summary> /// 대상 대시보드의 양식 HTML을 사본처리한다. /// </summary> public FormHtmlTemplate CopyFormHtmlTemplate(Guid formId, Guid templateId) { var newTemplateId = Guid.NewGuid(); using (var repo = new FormTableRepository()) { var form = repo.SelectFormTable(formId); if (form == null || form.IsDeleted) { throw new ObjectNotFoundException($"사본 처리 할 대시보드를 찾을 수 없습니다.\r\n대시보드 ID: \"{formId}\""); } var old = repo.SelectFormHtmlTemplate(formId, templateId); if (old == null) { throw new ObjectNotFoundException($"사본 처리 할 대시보드 양식을 찾을 수 없습니다.\r\n양식 ID: \"{templateId}\""); } repo.BeginTransaction(); try { // 1. 새 HTML 사본 레코드를 DB에 추가 var htmlTemplate = FormHtmlTemplate.CopyFrom(old, newTemplateId); if (repo.InsertFormHtmlTemplate(htmlTemplate)) { // 2. 대시보드가 참조하고 있는 HTML 양식 ID를 업데이트 form.HtmlTemplateId = newTemplateId; form.HtmlTemplate = htmlTemplate; repo.UpdateFormTable(form); repo.CommitTransaction(); logger.Info($"대시보드 양식이 사본 처리되었습니다. 대시보드: \"{old.FormName}\"" + $"\r\n새 양식 ID: \"{newTemplateId}\", 사본 처리된 양식 ID: \"{templateId}\"" + $"\r\n\r\n" + $"새 양식 정보: \r\n" + $"{htmlTemplate}"); return(htmlTemplate); } throw new InvalidOperationException($"대상 대시보드의 새 양식을 DB에 등록하지 못했습니다.\r\n대시보드: \"{form.Name}({formId})\"" + $"\r\n새 양식 ID: \"{newTemplateId}\", 사본 처리된 양식 ID: \"{templateId}\""); } catch (Exception ex) { logger.Error(ex, $"대시보드 양식을 사본 처리하는 도중 알 수 없는 오류가 발생하였습니다. 대시보드: \"{form.Name}({formId})\""); try { repo.RollBackTransaction(); } catch (Exception rex) { logger.Fatal(ex, $"대시보드 양식을 사본 처리하는 함수에서 롤백 실행 중 치명적인 에러가 발생했습니다. 대시보드: \"{form.Name}({formId})\""); ExceptionDispatchInfo.Capture(rex).Throw(); // not reached } ExceptionDispatchInfo.Capture(ex).Throw(); return(null); // not reached } } }