diff --git a/app/Console/Commands/Inventory.php b/app/Console/Commands/Inventory.php index 61b12fb..581ca5a 100644 --- a/app/Console/Commands/Inventory.php +++ b/app/Console/Commands/Inventory.php @@ -3,6 +3,7 @@ namespace App\Console\Commands; use Illuminate\Console\Command; +use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\DB; use App\Models\DailyStockRecord; use App\Models\GoodsSku; @@ -41,19 +42,20 @@ class Inventory extends Command */ public function handle() { - DB::beginTransaction(); - try { - $log = new Log(); - $log->module = 'goods'; - $log->action = 'PATCH'; - $log->target_type = 'goods_sku'; - $log->target_id = 0; - $log->target_field = 'timingInventory'; - $log->user_id = 999; - // 数据库存储过程,7点定时执行 - $data = []; - $date = date('Y-m-d'); - GoodsSku::query()->chunk(500, static function ($skus) use (&$data, $date) { + + $log = new Log(); + $log->module = 'goods'; + $log->action = 'PATCH'; + $log->target_type = 'goods_sku'; + $log->target_id = 0; + $log->target_field = 'timingInventory'; + $log->user_id = 999; + // 数据库存储过程,7点定时执行 + $data = []; + $date = date('Y-m-d'); + GoodsSku::query()->chunk(500, static function ($skus) use (&$data, $date, $log) { + DB::beginTransaction(); + try { foreach ($skus as $sku) { $data[] = [ 'sku_id' => $sku->id, @@ -64,15 +66,16 @@ class Inventory extends Command 'two_days_ago_num' => $sku->two_days_ago_num + $sku->yesterday_num, ]); } - }); - $record = new DailyStockRecord(); - $record->batchInsert($data); - DB::commit(); - $log->message = '7点数据更新成功'; - } catch (\Exception $exception) { - $log->message = '7点数据更新失败' . $exception->getMessage(); - DB::rollBack(); - } + $record = new DailyStockRecord(); + $record->batchInsert($data); + DB::commit(); + $log->message = '7点数据更新成功'; + } catch (\Exception $exception) { + $log->message = '7点数据更新失败' . $exception->getMessage(); + DB::rollBack(); + } + + }); $log->save(); $this->info($log->message); } diff --git a/app/Http/Controllers/Goods/GoodsCombinationController.php b/app/Http/Controllers/Goods/GoodsCombinationController.php index d12eec3..31308d6 100644 --- a/app/Http/Controllers/Goods/GoodsCombinationController.php +++ b/app/Http/Controllers/Goods/GoodsCombinationController.php @@ -7,9 +7,11 @@ use App\Http\Resources\GoodsSkuResource; use App\Imports\CombinationGoodsImport; use App\Models\BusinessOrderItem; use App\Models\CombinationGood; +use App\Models\DeveloperConfig; use App\Models\Goods; use App\Models\GoodsSku; use App\Utils\GeneratorUtils; +use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; @@ -22,43 +24,90 @@ class GoodsCombinationController extends Controller public function index(Request $request) { // 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([ '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.goods:id,title,img_url', ]) ->where('is_combination', 1) - ->filter() - ->orderBy('id', 'desc') + ->filter(); + 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')); - $fields = implode(',', [ - 'shop_id', - 'external_sku_id', - 'sum(goods_number) as number', - 'sum(already_cancel_number) as cancel_number', - ]); foreach ($skus as &$item) { $items = []; - $lastInventoryTime = date('Y-m-d 07:00:00'); - $orderDetail = BusinessOrderItem::query() - ->select(DB::raw($fields)) - ->with(['shop:id,name']) - ->where('external_sku_id', $item['external_sku_id']) - ->when($lastInventoryTime, function ($query) use ($lastInventoryTime) { - $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')); + if (isset($externals[$item['id']])) { + $item['order_detail'] = $externals[$item['id']]; + $item['order_goods_num'] = $ids[$item['id']]; + } else { + $item['order_detail'] = []; + $item['order_goods_num'] = 0; } - $item['order_goods_num'] = $addOrderGoodsNum - $reduceOrderGoodsNum; - $item['order_detail'] = $orderDetail; + $number = BusinessOrderItem::query() ->where('external_sku_id', $item['external_sku_id']) ->sum('goods_number'); diff --git a/app/Http/Controllers/Goods/GoodsSkusController.php b/app/Http/Controllers/Goods/GoodsSkusController.php index cf4f5f0..28737db 100644 --- a/app/Http/Controllers/Goods/GoodsSkusController.php +++ b/app/Http/Controllers/Goods/GoodsSkusController.php @@ -101,22 +101,10 @@ class GoodsSkusController extends Controller $builder = GoodsSku::query(); $this->preparQueryGoodsSkus($request, $builder); $day = DateTimeUtils::getToday(); - $goodsSkus = (clone $builder)->filter() - ->where('is_combination', 0) - ->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); - $goodsSkus = (clone $builder)->with(['goods' => function ($query) { + $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"]); }]); @@ -124,10 +112,28 @@ class GoodsSkusController extends Controller ->with(['daily' => function ($query) use ($day) { $query->where('day', $day); }]) - ->whereIn('id', $finalIds) - ->orderByDesc('id') - //->orderByRaw("FIELD(id, {$idField})") - ->paginate($request->get('per_page')); + ->where('is_combination', 0); + if ($sortField == "order_goods_num") { + $goodsSkus = (clone $builder)->filter() + ->where('is_combination', 0) + ->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); + } + + $goodsSkus = $goodsSkusBuilder->paginate($request->get('per_page')); $rolesName = $request->user()->getRoleNames()->toArray(); foreach ($goodsSkus as &$sku) { $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; } - if (!empty($sku['yesterday_num'])) { $sku['sale_ratio'] = round($sku['stock'] / $sku['yesterday_num'], 2) * 100; } else { diff --git a/app/Services/Statistic/SaleDataService.php b/app/Services/Statistic/SaleDataService.php index baa9019..def519b 100644 --- a/app/Services/Statistic/SaleDataService.php +++ b/app/Services/Statistic/SaleDataService.php @@ -244,7 +244,7 @@ class SaleDataService "goods_total" => $v->sum("goods_total"), "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_amount" => $v->sum("goods_total_amount"), ]; - })->values()->sortByDesc('goods_total')->toArray(); + })->sortByDesc('goods_total')->values()->toArray(); } /**