Documentation pour GIEBOX
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

202 行
8.0KB

  1. WebUI / Pages :
  2. ===============
  3. private async Task Export()
  4. {
  5. item.DT_WORK_FORCE_ID_WORK_FORCE = listDT_WORK_FORCE_ID_WORK_FORCE!.Where(e => e.ID_WORK_FORCE == item.ID_WORK_FORCE).FirstOrDefault();
  6. if(item.DATE_START>item.DATE_END)
  7. {
  8. var dtFin = item.DATE_START;
  9. var dtDebut = item.DATE_END;
  10. item.DATE_START = dtDebut;
  11. item.DATE_END = dtFin;
  12. }
  13. try
  14. {
  15. var resultat = await ApiService.GetExportByFiltersAsync($"api/DT_TIME_SHEET/export", item);
  16. if (resultat == null || resultat.Length == 0)
  17. {
  18. // Gérer le cas d'erreur ou pas de données
  19. ToastService.ShowInfo($"Il n'y a pas de données disponibles.", settings => { settings.Timeout = 2000; settings.IconType = IconType.None; settings.Position = ToastPosition.BottomCenter; });
  20. return;
  21. }
  22. // Nom de fichier avec timestamp
  23. var now = DateTime.Now;
  24. var fileName = $"reportings_{now:yyyyMMdd_HHmmss}.xlsx";
  25. // Convertir en base64
  26. var base64 = Convert.ToBase64String(resultat);
  27. // Appel JS pour lancer le téléchargement
  28. await JS!.InvokeVoidAsync("downloadFileFromByteArray", fileName, base64);
  29. }
  30. catch (Exception ex)
  31. {
  32. ToastService.ShowError($"Erreur dans les exports. Faites CTRL + F5 et recommencez... Si le soucis persiste, voir avec l'administrateur.", settings => { settings.Timeout = 2000; settings.IconType = IconType.None; settings.Position = ToastPosition.BottomCenter; });
  33. }
  34. }
  35. WebUI / Services :
  36. ==================
  37. public async Task<byte[]?> GetExportByFiltersAsync<T>(string url, T data)
  38. {
  39. var response = await _httpClient.PostAsJsonAsync<T>(url, data);
  40. if (!response.IsSuccessStatusCode)
  41. return null;
  42. return await response.Content.ReadAsByteArrayAsync();
  43. }
  44. API / CONTROLLER
  45. ================
  46. using Microsoft.AspNetCore.Authorization;
  47. using Microsoft.AspNetCore.Mvc;
  48. using Temporis.Domain;
  49. namespace Temporis.Api.Controllers
  50. {
  51. public partial class DT_TIME_SHEETController
  52. {
  53. [HttpPost("export")]
  54. [Authorize(Roles = "Admin,Manager")]
  55. public async Task<ActionResult> Export([FromBody] DT_TIME_SHEET dt_time_sheet)
  56. {
  57. var bytes = await dt_time_sheetService.ExportReportings(dt_time_sheet);
  58. if (bytes == null || bytes.Length == 0)
  59. return NotFound("Aucune donnée à exporter.");
  60. return File(bytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"reportings.xlsx");
  61. }
  62. }
  63. }
  64. APPLICATION / Service :
  65. =======================
  66. >>> D'abord : Installer le nuget ClosedXML sur le projet "Application"
  67. #region Exports
  68. public async Task<byte[]?> ExportReportings(DT_TIME_SHEET filters)
  69. {
  70. if (filters == null)
  71. return null;
  72. var lst = await dt_time_sheetRepository.GetAll_by_filters_Async(filters);
  73. var lstItems = lst.ToList();
  74. if (lstItems == null || lstItems.Count == 0)
  75. return null;
  76. using (var workbook = new XLWorkbook())
  77. {
  78. // Grouper les lignes par ID_TIME_SHEET
  79. var groupByTimeSheet = lstItems
  80. .GroupBy(l => l.ID_TIME_SHEET)
  81. .ToList();
  82. foreach (var group in groupByTimeSheet)
  83. {
  84. var timeSheet = group.First().DT_TIME_SHEET;
  85. string nomOnglet = timeSheet?.LIBELLE ?? $"TimeSheet_{group.Key.ToString().Substring(0, 8)}";
  86. // Crée l'onglet
  87. var worksheet = workbook.Worksheets.Add(nomOnglet);
  88. int row = 0;
  89. // Identification
  90. worksheet.Cell(row + 1, 1).Value = "Nom";
  91. worksheet.Cell(row + 2, 1).Value = "Prénom";
  92. worksheet.Cell(row + 3, 1).Value = "Début Période";
  93. worksheet.Cell(row + 4, 1).Value = "Fin Période";
  94. worksheet.Cell(row + 5, 1).Value = "Validation manager ?";
  95. worksheet.Cell(row + 1, 1).Style.Font.Bold = true;
  96. worksheet.Cell(row + 2, 1).Style.Font.Bold = true;
  97. worksheet.Cell(row + 3, 1).Style.Font.Bold = true;
  98. worksheet.Cell(row + 4, 1).Style.Font.Bold = true;
  99. worksheet.Cell(row + 5, 1).Style.Font.Bold = true;
  100. worksheet.Cell(row + 1, 2).Value = timeSheet!.DT_WORK_FORCE_ID_WORK_FORCE!.LAST_NAME;
  101. worksheet.Cell(row + 2, 2).Value = timeSheet!.DT_WORK_FORCE_ID_WORK_FORCE!.FIRST_NAME;
  102. worksheet.Cell(row + 3, 2).Value = timeSheet!.DATE_START.ToString("dd-MM-yyyy");
  103. worksheet.Cell(row + 4, 2).Value = timeSheet!.DATE_END.ToString("dd-MM-yyyy");
  104. worksheet.Cell(row + 5, 2).Value = timeSheet!.IsValidat ? "Oui" : "Non";
  105. row = row + 7;
  106. // Entêtes de lignes
  107. worksheet.Cell(row, 1).Value = "Date";
  108. worksheet.Cell(row, 2).Value = "Projet";
  109. worksheet.Cell(row, 3).Value = "Quantité (j)";
  110. worksheet.Cell(row, 4).Value = "Télétravail";
  111. worksheet.Row(row).Style.Font.Bold = true;
  112. // Remplir les lignes
  113. row = row + 1;
  114. double nbrTeleTravail = 0;
  115. var lstAlternance = group.Where(e=>e.DT_PROJECT?.ID_PROJECT_TYPE == ToolsRepo.ID_PROJECT_TYPE_ALTERNANCE).ToList();
  116. foreach (var line in group)
  117. {
  118. worksheet.Cell(row, 1).Value = line.DAY.ToString("dd-MM-yyyy");
  119. worksheet.Cell(row, 2).Value = line.DT_PROJECT?.LIBELLE_PROJECT ?? "";
  120. worksheet.Cell(row, 3).Value = line.QUANTITY;
  121. worksheet.Cell(row, 4).Value = line.TELETRAVAIL ? "Oui" : "Non";
  122. if(line.TELETRAVAIL)
  123. {
  124. nbrTeleTravail = nbrTeleTravail + line.QUANTITY;
  125. }
  126. row++;
  127. }
  128. row = row + 2;
  129. worksheet.Cell(row, 1).Value = "Total télétravail (j)";
  130. worksheet.Cell(row, 1).Style.Font.Bold = true;
  131. worksheet.Cell(row, 2).Value = nbrTeleTravail;
  132. var lstAbs = await dt_day_offRepository.GetAll_By_ID_WORK_FORCE_And_Dates_Async(timeSheet!.ID_WORK_FORCE, timeSheet!.DATE_START, timeSheet!.DATE_END);
  133. var lstAbsences = lstAbs.ToList();
  134. var nbrJoursOuvres = Infrastructure.Tools.NbrJoursOuvres(timeSheet!.DATE_START, timeSheet!.DATE_END);
  135. row = row + 2;
  136. worksheet.Cell(row, 1).Value = "Nbre de Tickets Restaurant";
  137. worksheet.Cell(row, 1).Style.Font.Bold = true;
  138. worksheet.Cell(row, 2).Value = nbrJoursOuvres - lstAbsences.Count - lstAlternance.Count;
  139. row = row + 2;
  140. if (lstAbsences != null && lstAbsences.Count() > 0)
  141. {
  142. worksheet.Cell(row, 1).Value = "Absences";
  143. worksheet.Cell(row, 1).Style.Font.Bold = true;
  144. row = row + 1;
  145. foreach (var item in lstAbsences)
  146. {
  147. worksheet.Cell(row, 1).Value = item.DATE_DAY_OFF.ToString("dd-MM-yyyy");
  148. worksheet.Cell(row, 2).Value = item.DT_DAY_OFF!.DT_REF_DAY_OFF_TYPE!.LIBELLE_DAY_OFF_TYPE;
  149. row++;
  150. }
  151. }
  152. // Ajustement automatique des colonnes
  153. worksheet.Columns().AdjustToContents();
  154. }
  155. using var stream = new MemoryStream();
  156. workbook.SaveAs(stream);
  157. return stream.ToArray();
  158. }
  159. }
  160. #endregion