erp/app/Exports/WeekDataExport.php

108 lines
3.4 KiB
PHP
Raw Permalink Normal View History

2024-02-06 17:04:58 +08:00
<?php
namespace App\Exports;
use App\Models\DailyReport;
use App\Models\Shop;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Illuminate\Support\Collection;
class WeekDataExport implements FromCollection, ShouldAutoSize
{
2024-02-06 17:13:24 +08:00
private $startDate;
private $endDate;
2024-02-06 17:04:58 +08:00
private $data;
2024-02-06 17:13:24 +08:00
public function __construct($startDate, $endDate)
2024-02-06 17:04:58 +08:00
{
2024-02-06 17:13:24 +08:00
$this->startDate = $startDate;
$this->endDate = $endDate;
2024-02-06 17:04:58 +08:00
$this->data = $this->createData();
}
/**
* @return \Illuminate\Support\Collection
*/
public function collection()
{
return new Collection($this->data);
}
private function createData()
{
$headTitle = [
'商品名称',
'品种',
'规格名称',
2024-02-06 17:04:58 +08:00
'商品编码',
'成本',
'销售数量',
];
2024-02-06 17:13:24 +08:00
$shops = Shop::query()
2024-02-06 17:16:09 +08:00
->whereNotIn('id', [7, 9, 10, 11, 17, 18])
2024-02-06 17:13:24 +08:00
->orderBy('id')
->pluck('name', 'id')
->toArray();
2024-02-06 17:04:58 +08:00
$headTitle = array_merge($headTitle, array_values($shops));
$dailyReports = DailyReport::query()
->with([
'goods:id,title',
'goodsType:id,name',
'goodsSku:id,title,name'
2024-02-06 17:04:58 +08:00
])
2024-02-06 17:13:24 +08:00
->where('date', '>=', $this->startDate)
->where('date', '<=', $this->endDate)
2024-02-06 17:04:58 +08:00
->get();
if ($dailyReports->isEmpty()) {
return [$headTitle];
}
$arr = [];
foreach ($dailyReports as $item) {
$number = $item->total_goods_number - $item->total_cancel_number;
if (!isset($arr[$item->external_sku_id])) {
$arr[$item->external_sku_id] = [
'goodsTitle' => !empty($item->goodsSku) ? $item->goodsSku->name:'',
'goodsTypeName' => !empty($item->goodsType) ? $item->goodsType->name : "",
'goodsSkuTitle' => !empty($item->goodsSku) ? $item->goodsSku->title : "",
2024-02-06 17:04:58 +08:00
'external_sku_id' => $item->external_sku_id,
'cost' => [],
'number' => [],
'shops' => []
];
}
$arr[$item->external_sku_id]['cost'][] = $item->cost;
$arr[$item->external_sku_id]['number'][] = $number;
foreach ($item->shop_data as $shopId => $shopData) {
$number = $shopData['total_goods_number'] - $shopData['total_cancel_number'];
if (!isset($arr[$item->external_sku_id]['shops'][$shopId])) {
$arr[$item->external_sku_id]['shops'][$shopId] = 0;
}
$arr[$item->external_sku_id]['shops'][$shopId] += $number;
}
}
$bodyData = [];
foreach ($arr as $item) {
$cost = array_sum($item['cost']) / count($item['cost']);
$shopData = [];
foreach ($shops as $shopId => $shopName) {
$shopData[] = $item['shops'][$shopId] ?? 0;
}
$data = [
$item['goodsTitle'],
$item['goodsTypeName'],
$item['goodsSkuTitle'],
$item['external_sku_id'],
$cost,
array_sum($item['number']),
];
$bodyData[] = array_merge($data, $shopData);
}
return [$headTitle, $bodyData];
}
}