RejectedExport.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <?php
  2. namespace App\Exports;
  3. use App\RejectedBill;
  4. use App\RejectedBillItem;
  5. use Illuminate\Database\Eloquent\Builder;
  6. use Illuminate\Database\Eloquent\Collection;
  7. use Illuminate\Support\Facades\Gate;
  8. use Maatwebsite\Excel\Concerns\FromCollection;
  9. use Maatwebsite\Excel\Concerns\ShouldAutoSize;
  10. use Maatwebsite\Excel\Concerns\WithColumnFormatting;
  11. use Maatwebsite\Excel\Concerns\WithCustomValueBinder;
  12. use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
  13. class RejectedExport extends \PhpOffice\PhpSpreadsheet\Cell\StringValueBinder implements FromCollection,ShouldAutoSize,WithColumnFormatting
  14. ,WithCustomValueBinder
  15. {
  16. protected $ids;
  17. static public $max=100000;
  18. protected $rejectedBills;
  19. public function setIds(Array $ids)
  20. {
  21. $this->ids=$ids;
  22. }
  23. public function setRejectedBills($rejectedBills)
  24. {
  25. $this->rejectedBills=$rejectedBills;
  26. }
  27. public function collection()
  28. {
  29. if($this->ids){
  30. return $this->getByIds();
  31. }
  32. if($this->rejectedBills){
  33. return $this->getByRejectedBills();
  34. }
  35. return null;
  36. }
  37. private function getByIds(){
  38. $rejectedItems=RejectedBillItem::whereHas('rejectedBill',function(Builder $query){
  39. $query->whereIn('id',$this->ids);
  40. if(count($this->ids)>self::$max){
  41. $query->where('is_finished',false);
  42. }
  43. });
  44. $rejectedItems=$rejectedItems->get();
  45. $rejecteds = new Collection();
  46. if($rejectedItems->isEmpty())return $rejecteds;
  47. $id_owner = $rejectedItems->first()->rejectedBill['id_owner'];
  48. $this->prependFields($rejecteds,$id_owner);
  49. $rejectedItems->each(function(RejectedBillItem $item)use($rejecteds,$id_owner){
  50. $this->injectRecord($rejecteds,$item->rejectedBill,$item,$id_owner);
  51. });
  52. return $rejecteds;
  53. }
  54. private function getByRejectedBills(){
  55. $rejecteds = new Collection();
  56. $rejectedBills=$this->rejectedBills->get();
  57. if($rejectedBills->isEmpty())return $rejecteds;
  58. $id_owner = $rejectedBills->first()['id_owner'];
  59. $this->prependFields($rejecteds,$id_owner);
  60. $rejectedBills->each(function(RejectedBill $rejectedBill)use($rejecteds,$id_owner){
  61. $rejectedBill->items()->each(function (RejectedBillItem $item)use($rejecteds,$rejectedBill,$id_owner){
  62. $this->injectRecord($rejecteds,$rejectedBill,$item,$id_owner);
  63. });
  64. });
  65. return $rejecteds;
  66. }
  67. private function prependFields($collection,$id_owner){
  68. $fieldNames=['日期','审核号','客户名称','订单号','姓名',
  69. '手机','原单单号','退回单号','退回公司','到付费用',
  70. '是否入库','商品条码','商品名称',];
  71. if($id_owner==94){
  72. $fieldNames=array_merge($fieldNames,['寄件方省','重量',]);
  73. }
  74. $fieldNames=array_merge($fieldNames,['数量','是否正品',
  75. '批次号','生产日期','效期','备注','退单备注','录入人']);
  76. $collection->prepend($fieldNames);
  77. return $collection;
  78. }
  79. private function injectRecord($collection,$bill,$item,$id_owner){
  80. $fieldValues=[$item['created_at'],
  81. $bill['checked_numbers'],$bill['owner_name'],
  82. $bill['order_number'],$bill['sender'],
  83. $bill['mobile_sender'],$bill['logistic_number'],
  84. $bill['logistic_number_return'],$bill['logistic_name'],
  85. $bill['fee_collected'],$bill['is_loaded_str'],
  86. $item['barcode_goods'],$item['name_goods'],];
  87. if($id_owner==94){
  88. $fieldValues=array_merge($fieldValues,[$bill['common_01'],$bill['common_02']]);
  89. }
  90. $fieldValues=array_merge($fieldValues,[$item['amount'],$item['quality_label'],
  91. $item['batch_number'],$item['made_at'],$item['validity_at'],$item['remark'],$bill['remark'],$bill['operator_name']]);
  92. $collection->push($fieldValues);
  93. return $collection;
  94. }
  95. /**
  96. * @return array
  97. */
  98. public function columnFormats(): array
  99. {
  100. return [
  101. 'B' => NumberFormat::FORMAT_TEXT,
  102. 'C' => NumberFormat::FORMAT_TEXT,
  103. 'D' => NumberFormat::FORMAT_TEXT,
  104. 'E' => NumberFormat::FORMAT_TEXT,
  105. 'F' => NumberFormat::FORMAT_TEXT,
  106. 'G' => NumberFormat::FORMAT_TEXT,
  107. 'H' => NumberFormat::FORMAT_TEXT,
  108. 'L' => NumberFormat::FORMAT_TEXT,
  109. 'N' => NumberFormat::FORMAT_TEXT,
  110. ];
  111. }
  112. }