数据统计修复

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,19 +42,20 @@ 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'; $log->target_type = 'goods_sku';
$log->target_type = 'goods_sku'; $log->target_id = 0;
$log->target_id = 0; $log->target_field = 'timingInventory';
$log->target_field = 'timingInventory'; $log->user_id = 999;
$log->user_id = 999; // 数据库存储过程,7点定时执行
// 数据库存储过程,7点定时执行 $data = [];
$data = []; $date = date('Y-m-d');
$date = date('Y-m-d'); GoodsSku::query()->chunk(500, static function ($skus) use (&$data, $date, $log) {
GoodsSku::query()->chunk(500, static function ($skus) use (&$data, $date) { DB::beginTransaction();
try {
foreach ($skus as $sku) { foreach ($skus as $sku) {
$data[] = [ $data[] = [
'sku_id' => $sku->id, 'sku_id' => $sku->id,
@ -64,15 +66,16 @@ 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(); $log->message = '7点数据更新成功';
$log->message = '7点数据更新成功'; } catch (\Exception $exception) {
} catch (\Exception $exception) { $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,22 +101,10 @@ class GoodsSkusController extends Controller
$builder = GoodsSku::query(); $builder = GoodsSku::query();
$this->preparQueryGoodsSkus($request, $builder); $this->preparQueryGoodsSkus($request, $builder);
$day = DateTimeUtils::getToday(); $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(['type' => function ($query) {
$query->with("parentType:id,name")->select(["id", "name", "parent_id"]); $query->with("parentType:id,name")->select(["id", "name", "parent_id"]);
}]); }]);
@ -124,10 +112,28 @@ class GoodsSkusController extends Controller
->with(['daily' => function ($query) use ($day) { ->with(['daily' => function ($query) use ($day) {
$query->where('day', $day); $query->where('day', $day);
}]) }])
->whereIn('id', $finalIds) ->where('is_combination', 0);
->orderByDesc('id') if ($sortField == "order_goods_num") {
//->orderByRaw("FIELD(id, {$idField})") $goodsSkus = (clone $builder)->filter()
->paginate($request->get('per_page')); ->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(); $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();
} }
/** /**