数据统计修复
This commit is contained in:
parent
9229309500
commit
a5e82074a8
@ -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);
|
||||
}
|
||||
|
||||
@ -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');
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user