ufutx.dma/app/Exports/OrdersExport.php
2026-03-04 14:42:40 +08:00

143 lines
5.0 KiB
PHP

<?php
namespace App\Exports;
use App\Models\Order;
use Maatwebsite\Excel\Concerns\FromArray;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithStyles;
use Maatwebsite\Excel\Events\AfterSheet;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
class OrdersExport implements FromArray,WithHeadings,WithStyles,WithEvents
{
protected $keyword;
protected $pay_status;
protected $status;
protected $agency_id;
protected $header;
public function __construct($data)
{
$this->keyword = $data['keyword']??null;
$this->pay_status = $data['pay_status']??null;
$this->status = $data['status']??null;
$this->agency_id = $data['agency_id']??null;
}
public function array():array
{
$orders = [];
Order::query()
->with([
'user:id,name,mobile,avatar',
'service:id,title,pic',
'agency:id,name,mobile',
'commission' => function($commission){
$commission->with(['service_user:user_id,name,mobile'])->select('id','order_id','role','user_id');
},
"recommendUser",
])
->serviceOrder()
->when($this->keyword !== null,function ($query){
$query->where(function ($query){
$query->where('name', 'like', '%' . $this->keyword . '%')
->orWhere('mobile', 'like', '%' . $this->keyword . '%');
});
})
->when($this->pay_status !== null,function ($query){
$query->where('pay_status',$this->pay_status);
})
->when($this->status !== null,function ($query){
$query->where('status',$this->status);
})
->when($this->agency_id !== null,function ($query){
$query->where('agency_id',$this->agency_id);
})
->orderByDesc('id')
->get()
->each(function ($order) use (&$orders){
$commission_arr = [
1=>'',
2=>'',
3=>'',
4=>'',
5=>'',
];
foreach ($order->commission as $commission){
$commission_arr[$commission->role] .= $commission->service_user?$commission->service_user->name:'' .',';
}
$order_item = [
$order->id,
$order->price,
['UNPAID'=>'未支付','PAID'=>'已支付'][$order->pay_status],
$order->offline_order?'虚拟订单':'线上订单',
['NOTSTART'=>'未开始','STARTING'=>'进行中','FINISHED'=>'已结束', 'SUSPEND'=>"暂停中"][$order->status],
$order->trade_no.' ',
$order->desc,
$order->user?->name??null,
$order->user?->mobile??null,
$order->agency?->name??null,
$order->agency?->mobile??null,
$order->recommendUser->name??"",
$order->recommendUser->mobile??"",
$commission_arr[2],
$commission_arr[3],
$commission_arr[4],
$commission_arr[5],
];
$orders[] = $order_item;
});
return $orders;
}
public function headings(): array
{
return [
['订单信息', '', '', '', '', '', '', '联系人', '', '子公司信息', '', '服务人员', '', '', '', ''],
['订单id', '订单价格', '订单状态', '订单类型', '服务状态', '订单号', '订单描述', '姓名', '电话', '负责人姓名', '电话', '推荐人-姓名', "推荐人-手机号", '主教练', '副教练', '客服', '企业介绍人']
];
}
public function styles(Worksheet $sheet)
{
$sheet->getStyle('F')->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_TEXT);
$sheet->mergeCells('A1:G1');
$sheet->mergeCells('H1:I1');
$sheet->mergeCells('J1:K1');
$sheet->mergeCells('L1:P1');
return [
1 => [
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER,
],
'font' => [
'bold' => true,
],
'borders' => [
'allBorders' => [
'borderStyle' => Border::BORDER_THIN,
],
],
],
];
}
public function registerEvents(): array
{
return [
AfterSheet::class => function (AfterSheet $event) {
$event->sheet->getDelegate()->calculateColumnWidths();
},
];
}
}