数据统计修复

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;
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);
}

View File

@ -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');

View File

@ -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 {

View File

@ -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();
}
/**