mirror of
https://gitee.com/hzchunfen/erp.git
synced 2025-12-01 14:40:44 +00:00
137 lines
4.3 KiB
PHP
137 lines
4.3 KiB
PHP
<?php
|
|
|
|
namespace App\Exports;
|
|
|
|
use App\Http\Enum\TargetTypeEnum;
|
|
use App\Models\DailyStockRecord;
|
|
use App\Models\Log;
|
|
use App\Models\PurchaseRecords;
|
|
use App\Utils\ArrayUtils;
|
|
use App\Utils\DateTimeUtils;
|
|
use Maatwebsite\Excel\Concerns\FromCollection;
|
|
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
|
|
use App\Models\GoodsSku;
|
|
use Illuminate\Support\Collection;
|
|
|
|
class GoodsSkusExport implements FromCollection, ShouldAutoSize
|
|
{
|
|
private $data;
|
|
private $type;
|
|
|
|
public function __construct($type)
|
|
{
|
|
$this->type = $type;
|
|
$this->data = $this->createData();
|
|
}
|
|
|
|
/**
|
|
* @return \Illuminate\Support\Collection
|
|
*/
|
|
public function collection()
|
|
{
|
|
return new Collection($this->data);
|
|
}
|
|
|
|
private function createData()
|
|
{
|
|
$headTitle = [
|
|
'商品编码',
|
|
'商品名称',
|
|
'商品品种',
|
|
'规格名称',
|
|
];
|
|
$map = [
|
|
'cost' => ['当前成本', '更新前成本', "更新后成本"],
|
|
'inventory' => ['当前库存', '盘点数', '采购总数'],
|
|
];
|
|
$headTitle = array_merge($headTitle, $map[$this->type]);
|
|
if ('cost' === $this->type) {
|
|
$update = $this->getChangeCostLogs();
|
|
}
|
|
if ('inventory' === $this->type) {
|
|
$update = $this->getInventoryRecord();
|
|
}
|
|
$ids = array_keys($update);
|
|
if (empty($ids)) {
|
|
return [$headTitle];
|
|
}
|
|
$model = GoodsSku::query()
|
|
->when($ids, function ($query, $ids) {
|
|
return $query->whereIn('id', $ids);
|
|
})
|
|
->with(['goods' => function ($query) {
|
|
$query->with(['type:id,name', 'brand:id,name'])
|
|
->orderBy('type_id')
|
|
->orderBy('brand_id');
|
|
}]);
|
|
$data = $model->get()->toArray();
|
|
if (empty($data)) {
|
|
return [$headTitle];
|
|
}
|
|
$bodyData = [];
|
|
foreach ($data as $item) {
|
|
$arr[0] = $item['external_sku_id'];
|
|
$arr[1] = $item['name'];
|
|
$arr[2] = !empty($item['goods']['type']['name']) ? $item['goods']['type']['name'] : '';
|
|
$arr[3] = $item['title'];
|
|
if ('cost' === $this->type) {
|
|
$arr[4] = (string)$item['cost'];
|
|
$arr[5] = (string)$update[$item['id']]['before_update'];
|
|
$arr[6] = (string)$update[$item['id']]['after_update'];
|
|
}
|
|
if ('inventory' === $this->type) {
|
|
$arr[4] = (string)$item['stock'];
|
|
$arr[5] = (string)$update[$item['id']]['inventory'];
|
|
$arr[6] = (string)$update[$item['id']]['arrived_today_num'];
|
|
}
|
|
$bodyData[] = $arr;
|
|
}
|
|
unset($arr);
|
|
return [$headTitle, $bodyData];
|
|
}
|
|
|
|
private function getChangeCostLogs()
|
|
{
|
|
$day = DateTimeUtils::getToday();
|
|
$logs = Log::query()
|
|
->select(['target_id', 'before_update', 'after_update'])
|
|
->where('target_type', TargetTypeEnum::PURCHASE)
|
|
->where('target_field', 'stock')
|
|
->where('created_at', '>', $day)
|
|
->get();
|
|
|
|
$update = [];
|
|
foreach ($logs as $log) {
|
|
if (!isset($update[$log['target_id']])) {
|
|
$beforeData = json_decode($log['before_update'], true);
|
|
if (!empty($beforeData['cost'])) {
|
|
$update[$log['target_id']]['before_update'] = $beforeData['cost'];
|
|
}
|
|
|
|
}
|
|
$afterData = json_decode($log['after_update'], true);
|
|
if (!empty($afterData['cost']) && $afterData['cost'] != $beforeData['cost']) {
|
|
$update[$log['target_id']]['after_update'] = $afterData['cost'];
|
|
}
|
|
}
|
|
|
|
return $update;
|
|
}
|
|
|
|
private function getInventoryRecord()
|
|
{
|
|
$day = date('Y-m-d', strtotime('-1 day'));
|
|
$records = DailyStockRecord::query()
|
|
->select(['sku_id', 'inventory', 'arrived_today_num'])
|
|
->where('day', $day)
|
|
->where(function ($query) {
|
|
$query->where('arrived_today_num', '<>', 0)
|
|
->orWhere('inventory', '<>', 0);
|
|
})
|
|
->get()
|
|
->toArray();
|
|
|
|
return ArrayUtils::index($records, 'sku_id');
|
|
}
|
|
}
|