mirror of
https://gitee.com/hzchunfen/erp.git
synced 2025-12-01 06:30:49 +00:00
数据统计修复
This commit is contained in:
parent
9229309500
commit
a5e82074a8
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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');
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user