数据统计修复

This commit is contained in:
杨建炊 2024-11-01 18:00:46 +08:00
parent 9229309500
commit a5e82074a8
4 changed files with 127 additions and 70 deletions

View File

@ -3,6 +3,7 @@
namespace App\Console\Commands; namespace App\Console\Commands;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use App\Models\DailyStockRecord; use App\Models\DailyStockRecord;
use App\Models\GoodsSku; use App\Models\GoodsSku;
@ -41,8 +42,7 @@ class Inventory extends Command
*/ */
public function handle() public function handle()
{ {
DB::beginTransaction();
try {
$log = new Log(); $log = new Log();
$log->module = 'goods'; $log->module = 'goods';
$log->action = 'PATCH'; $log->action = 'PATCH';
@ -53,7 +53,9 @@ class Inventory extends Command
// 数据库存储过程,7点定时执行 // 数据库存储过程,7点定时执行
$data = []; $data = [];
$date = date('Y-m-d'); $date = date('Y-m-d');
GoodsSku::query()->chunk(500, static function ($skus) use (&$data, $date) { GoodsSku::query()->chunk(500, static function ($skus) use (&$data, $date, $log) {
DB::beginTransaction();
try {
foreach ($skus as $sku) { foreach ($skus as $sku) {
$data[] = [ $data[] = [
'sku_id' => $sku->id, 'sku_id' => $sku->id,
@ -64,7 +66,6 @@ class Inventory extends Command
'two_days_ago_num' => $sku->two_days_ago_num + $sku->yesterday_num, 'two_days_ago_num' => $sku->two_days_ago_num + $sku->yesterday_num,
]); ]);
} }
});
$record = new DailyStockRecord(); $record = new DailyStockRecord();
$record->batchInsert($data); $record->batchInsert($data);
DB::commit(); DB::commit();
@ -73,6 +74,8 @@ class Inventory extends Command
$log->message = '7点数据更新失败' . $exception->getMessage(); $log->message = '7点数据更新失败' . $exception->getMessage();
DB::rollBack(); DB::rollBack();
} }
});
$log->save(); $log->save();
$this->info($log->message); $this->info($log->message);
} }

View File

@ -7,9 +7,11 @@ use App\Http\Resources\GoodsSkuResource;
use App\Imports\CombinationGoodsImport; use App\Imports\CombinationGoodsImport;
use App\Models\BusinessOrderItem; use App\Models\BusinessOrderItem;
use App\Models\CombinationGood; use App\Models\CombinationGood;
use App\Models\DeveloperConfig;
use App\Models\Goods; use App\Models\Goods;
use App\Models\GoodsSku; use App\Models\GoodsSku;
use App\Utils\GeneratorUtils; use App\Utils\GeneratorUtils;
use Carbon\Carbon;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@ -22,43 +24,90 @@ class GoodsCombinationController extends Controller
public function index(Request $request) public function index(Request $request)
{ {
// ToDo // ToDo
$sortField = $request->input('sort_field', 'id');//stock sale_stock order_goods_num
$sortValue = $request->input('sort_value', 'desc');
$fields = implode(',', [
'shop_id',
'external_sku_id',
'SUM(goods_number) - SUM(already_cancel_number) as number',
]);
$orderRestTime = DeveloperConfig::query()
->where('key', DeveloperConfig::$ORDER_RESET_TIME)
->value('value');
if (is_null($orderRestTime)) {
$orderRestTime = date('Y-m-d 07:00:00');
}
$businessOrderItems = BusinessOrderItem::query()
->select(DB::raw($fields))
->with([
'shop:id,name',
'goodsSku:id,external_sku_id,is_combination',
'goodsSku.combinationGoods:id,goods_sku_id,item_id,item_num'
])
->where('created_at', '>', $orderRestTime)
->where('external_sku_id', '<>', '')
->groupBy(['shop_id', 'external_sku_id'])
->orderByDesc('number')
->get()
->toArray();
$ids = $externals = [];
foreach ($businessOrderItems as $businessOrderItem) {
if (is_null($businessOrderItem['goods_sku'])) {
continue;
}
$id = $businessOrderItem['goods_sku']['id'];
if (isset($ids[$id])) {
$ids[$id] += (int)$businessOrderItem['number'];
} else {
$ids[$id] = (int)$businessOrderItem['number'];
}
$externals[$id][] = $businessOrderItem;
}
arsort($ids);
// 可通过子商品查找主商品 // 可通过子商品查找主商品
$skus = GoodsSku::query() $goodsSkusBuilder = GoodsSku::query()
->with([ ->with([
'combinationGoods:id,goods_sku_id,item_id,item_num', 'combinationGoods:id,goods_sku_id,item_id,item_num',
'combinationGoods.goodsSkuItem:id,name,goods_id,title,stock,sale_stock,external_sku_id,updated_at,yesterday_num,reference_price,status', 'combinationGoods.goodsSkuItem:id,name,goods_id,title,stock,sale_stock,external_sku_id,updated_at,yesterday_num,reference_price,status',
'combinationGoods.goodsSkuItem.goods:id,title,img_url', 'combinationGoods.goodsSkuItem.goods:id,title,img_url',
]) ])
->where('is_combination', 1) ->where('is_combination', 1)
->filter() ->filter();
->orderBy('id', 'desc') if ($sortField == "order_goods_num") {
$builder = GoodsSku::query();
$goodsSkus = (clone $builder)->filter()
->where('is_combination', 1)
->orderByDesc('id')
->pluck('stock', 'id')
->toArray();
$finalIds = [];
foreach ($ids as $id => $number) {
if (isset($goodsSkus[$id])) {
$finalIds[] = $id;
unset($goodsSkus[$id]);
}
}
$finalIds = array_merge($finalIds, array_keys($goodsSkus));
$idField = implode(',', $finalIds);
$goodsSkusBuilder->orderByRaw("FIELD(id, {$idField})");
} else {
$goodsSkusBuilder->orderBy($sortField, $sortValue);
}
$skus = $goodsSkusBuilder
->paginate($request->get('per_page')); ->paginate($request->get('per_page'));
$fields = implode(',', [
'shop_id',
'external_sku_id',
'sum(goods_number) as number',
'sum(already_cancel_number) as cancel_number',
]);
foreach ($skus as &$item) { foreach ($skus as &$item) {
$items = []; $items = [];
$lastInventoryTime = date('Y-m-d 07:00:00'); if (isset($externals[$item['id']])) {
$orderDetail = BusinessOrderItem::query() $item['order_detail'] = $externals[$item['id']];
->select(DB::raw($fields)) $item['order_goods_num'] = $ids[$item['id']];
->with(['shop:id,name']) } else {
->where('external_sku_id', $item['external_sku_id']) $item['order_detail'] = [];
->when($lastInventoryTime, function ($query) use ($lastInventoryTime) { $item['order_goods_num'] = 0;
$query->where('created_at', '>', $lastInventoryTime);
})
->groupBy(['shop_id', 'external_sku_id'])
->get()
->toArray();
$addOrderGoodsNum = $reduceOrderGoodsNum = 0;
if ($orderDetail) {
$addOrderGoodsNum = array_sum(array_column($orderDetail, 'number'));
$reduceOrderGoodsNum = array_sum(array_column($orderDetail, 'cancel_number'));
} }
$item['order_goods_num'] = $addOrderGoodsNum - $reduceOrderGoodsNum;
$item['order_detail'] = $orderDetail;
$number = BusinessOrderItem::query() $number = BusinessOrderItem::query()
->where('external_sku_id', $item['external_sku_id']) ->where('external_sku_id', $item['external_sku_id'])
->sum('goods_number'); ->sum('goods_number');

View File

@ -101,6 +101,19 @@ class GoodsSkusController extends Controller
$builder = GoodsSku::query(); $builder = GoodsSku::query();
$this->preparQueryGoodsSkus($request, $builder); $this->preparQueryGoodsSkus($request, $builder);
$day = DateTimeUtils::getToday(); $day = DateTimeUtils::getToday();
$sortField = $request->input('sort_field', 'id');//stock sale_stock order_goods_num
$sortValue = $request->input('sort_value', 'desc');
$goodsSkusBuilder = (clone $builder)->with(['goods' => function ($query) {
$query->with(['type' => function ($query) {
$query->with("parentType:id,name")->select(["id", "name", "parent_id"]);
}]);
}])
->with(['daily' => function ($query) use ($day) {
$query->where('day', $day);
}])
->where('is_combination', 0);
if ($sortField == "order_goods_num") {
$goodsSkus = (clone $builder)->filter() $goodsSkus = (clone $builder)->filter()
->where('is_combination', 0) ->where('is_combination', 0)
->orderByDesc('id') ->orderByDesc('id')
@ -115,19 +128,12 @@ class GoodsSkusController extends Controller
} }
$finalIds = array_merge($finalIds, array_keys($goodsSkus)); $finalIds = array_merge($finalIds, array_keys($goodsSkus));
$idField = implode(',', $finalIds); $idField = implode(',', $finalIds);
$goodsSkusBuilder->orderByRaw("FIELD(id, {$idField})");
} else {
$goodsSkusBuilder->orderBy($sortField, $sortValue);
}
$goodsSkus = (clone $builder)->with(['goods' => function ($query) { $goodsSkus = $goodsSkusBuilder->paginate($request->get('per_page'));
$query->with(['type' => function ($query) {
$query->with("parentType:id,name")->select(["id", "name", "parent_id"]);
}]);
}])
->with(['daily' => function ($query) use ($day) {
$query->where('day', $day);
}])
->whereIn('id', $finalIds)
->orderByDesc('id')
//->orderByRaw("FIELD(id, {$idField})")
->paginate($request->get('per_page'));
$rolesName = $request->user()->getRoleNames()->toArray(); $rolesName = $request->user()->getRoleNames()->toArray();
foreach ($goodsSkus as &$sku) { foreach ($goodsSkus as &$sku) {
$lastInventoryTime = !empty($sku['daily']['inventory_time']) ? $sku['daily']['inventory_time'] : date('Y-m-d 07:00:00'); $lastInventoryTime = !empty($sku['daily']['inventory_time']) ? $sku['daily']['inventory_time'] : date('Y-m-d 07:00:00');
@ -144,7 +150,6 @@ class GoodsSkusController extends Controller
$sku['cost'] = 0; $sku['cost'] = 0;
} }
if (!empty($sku['yesterday_num'])) { if (!empty($sku['yesterday_num'])) {
$sku['sale_ratio'] = round($sku['stock'] / $sku['yesterday_num'], 2) * 100; $sku['sale_ratio'] = round($sku['stock'] / $sku['yesterday_num'], 2) * 100;
} else { } else {

View File

@ -244,7 +244,7 @@ class SaleDataService
"goods_total" => $v->sum("goods_total"), "goods_total" => $v->sum("goods_total"),
"goods_total_amount" => $v->sum("goods_total_amount"), "goods_total_amount" => $v->sum("goods_total_amount"),
]; ];
})->values()->sortByDesc('goods_total')->toArray(); })->sortByDesc('goods_total')->values()->toArray();
} }
/** /**
@ -323,7 +323,7 @@ class SaleDataService
"goods_total" => $v->sum("goods_total"), "goods_total" => $v->sum("goods_total"),
"goods_total_amount" => $v->sum("goods_total_amount"), "goods_total_amount" => $v->sum("goods_total_amount"),
]; ];
})->values()->sortByDesc('goods_total')->toArray(); })->sortByDesc('goods_total')->values()->toArray();
} }
/** /**