ProjectGanttExport.php 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. <?php
  2. namespace App\Exports;
  3. use App\Models\Project;
  4. use App\Services\Project\ProjectGanttService;
  5. use Illuminate\Support\Collection;
  6. use Maatwebsite\Excel\Concerns\Exportable;
  7. use Maatwebsite\Excel\Concerns\FromCollection;
  8. use Maatwebsite\Excel\Concerns\ShouldAutoSize;
  9. use Maatwebsite\Excel\Concerns\WithHeadings;
  10. use Maatwebsite\Excel\Concerns\WithMapping;
  11. use Maatwebsite\Excel\Events\AfterSheet;
  12. use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
  13. class ProjectGanttExport implements FromCollection, WithMapping, WithHeadings, ShouldAutoSize
  14. {
  15. use Exportable;
  16. private static $index = 1;
  17. public function collection()
  18. {
  19. $project = Project::allowed(request()->project_id)->findOrFail(request()->project_id);
  20. $group = in_array(
  21. request()->get("group"),
  22. ['requirement_id','assign','task_type']
  23. ) ? request()->get("group") : "task_type";
  24. return new Collection((new ProjectGanttService())->gantt($project, $group));
  25. }
  26. public function map($project): array
  27. {
  28. if (isset($project['duration'])){
  29. $displayId = self::$index++;
  30. }else{
  31. $displayId = $project['text'] == 'Empty'?'':$project['text'];
  32. $project['text'] = '';
  33. }
  34. return [
  35. $displayId,
  36. $project['text'],
  37. $project['start_date'],
  38. $project['end_date'],
  39. isset($project['duration'])?$project['duration'].'%':'',
  40. $project['assign_to'],
  41. ];
  42. }
  43. public function headings(): array
  44. {
  45. return [
  46. 'ID',
  47. 'Name',
  48. 'StartTime',
  49. 'EndTime',
  50. 'Duration',
  51. 'AssignTo',
  52. ];
  53. }
  54. public function columnFormats(): array
  55. {
  56. return [
  57. 'B' => NumberFormat::FORMAT_DATE_DDMMYYYY, //日期
  58. 'C' => NumberFormat::FORMAT_NUMBER_00, //金额保留两位小数
  59. ];
  60. }
  61. }