From 0bdd35f15b337dfc8d3096496341ae72d767e0ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=BB=BA=E7=82=8A?= <924182103@qq.com> Date: Tue, 6 Aug 2024 16:59:22 +0800 Subject: [PATCH] =?UTF-8?q?=E9=B2=9C=E8=8A=B12.0-=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=B5=8B=E8=AF=95bug=E4=BF=AE=E5=A4=8D+=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E6=A0=91=E5=9E=8B=E6=8E=A5=E5=8F=A3=E6=94=B9=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Commands/CheckSkuQualityPeriod.php | 2 +- .../Controllers/Goods/GoodsController.php | 2 +- .../Goods/GoodsTypesController.php | 58 ++++++++++++------- .../Supplier/PurchaseRecordController.php | 9 ++- app/Http/Service/MessageService.php | 6 +- app/Listeners/BatchStockUpdateListener.php | 28 +++++---- app/Services/Service/SaleDataService.php | 57 ++++++------------ ...der_total_amount_to_daily_stock_record.php | 1 + ...08_06_143056_add_fields_to_goods_types.php | 40 +++++++++++++ resources/lang/zh-CN/permission.php | 5 ++ routes/api.php | 6 +- 11 files changed, 134 insertions(+), 80 deletions(-) create mode 100644 database/migrations/2024_08_06_143056_add_fields_to_goods_types.php diff --git a/app/Console/Commands/CheckSkuQualityPeriod.php b/app/Console/Commands/CheckSkuQualityPeriod.php index 0d1575a..d30fcf0 100644 --- a/app/Console/Commands/CheckSkuQualityPeriod.php +++ b/app/Console/Commands/CheckSkuQualityPeriod.php @@ -64,7 +64,7 @@ class CheckSkuQualityPeriod extends Command $messageService->skuQualityPeriodNoticeMessage((array)$v); } //更新下状态 - PurchaseRecords::query()->update([ + PurchaseRecords::query()->where('id', '=', $v->id)->update([ "status" => 1 ]); } diff --git a/app/Http/Controllers/Goods/GoodsController.php b/app/Http/Controllers/Goods/GoodsController.php index 75485ca..a29b695 100644 --- a/app/Http/Controllers/Goods/GoodsController.php +++ b/app/Http/Controllers/Goods/GoodsController.php @@ -51,7 +51,7 @@ class GoodsController extends Controller $goods->title = $request->title; $goods->img_url = $request->img_url; $goods->type_id = $request->type_id; - $goods->brand_id = $request->brand_id; + $goods->brand_id = $request->brand_id ?? 0; $goods->goods_code = $request->goods_code; $goods->save(); } diff --git a/app/Http/Controllers/Goods/GoodsTypesController.php b/app/Http/Controllers/Goods/GoodsTypesController.php index 8a4ae32..2c620dd 100644 --- a/app/Http/Controllers/Goods/GoodsTypesController.php +++ b/app/Http/Controllers/Goods/GoodsTypesController.php @@ -6,6 +6,7 @@ use App\Http\Controllers\Controller; use App\Http\Resources\GoodsTypeResource; use App\Models\GoodsType; use App\Models\Log as LogModel; +use App\Utils\FormatUtils; use Illuminate\Http\Request; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule; @@ -31,27 +32,29 @@ class GoodsTypesController extends Controller public function store(Request $request) { $validator = Validator::make($request->all(), [ - 'names' => 'required|array', - 'names.*' => 'required|string|max:191|unique:goods_types,name', + 'name' => 'required|string|max:191', + 'parent_id' => 'sometimes', + 'show' => 'sometimes|integer', ]); if ($validator->fails()) { $this->setValidatorFailResponse($validator->getMessageBag()->getMessages()); return response($this->res, $this->res['httpCode']); } - $goodsTypes = []; - foreach ($request->names as $name) { - $goodsTypes[] = ['name' => $name]; + $level = 1; + if ($request->parent_id) { + $parentGoodsType = GoodsType::query()->where("id", "=", $request->parent_id)->get()->toArray(); + $level = $parentGoodsType['level'] ?? 1 + 1; } + $goodsType = new GoodsType(); - if (!$goodsType->batchInsert($goodsTypes)) { - $this->res = [ - 'httpCode' => 500, - 'errorCode' => 500500, - 'errorMessage' => '批量添加失败', - ]; - } - $this->setAfterUpdateForLog($goodsTypes); + $goodsType->parent_id = $request->parent_id ?? 0; + $goodsType->show = $request->show ?? 1; + $goodsType->name = $request->name; + $goodsType->level = $level; + $goodsType->save(); + + $this->setAfterUpdateForLog($request->all()); $this->addLog(0, 'add'); return response($this->res, $this->res['httpCode']); @@ -65,12 +68,9 @@ class GoodsTypesController extends Controller public function update($id, Request $request) { $validator = Validator::make($request->all(), [ - 'name' => [ - 'required', - 'string', - 'max:191', - Rule::unique('goods_types')->ignore($id), - ] + 'name' => 'sometimes|string|max:191', + 'parent_id' => 'sometimes', + 'show' => 'sometimes|integer', ]); if ($validator->fails()) { $this->setValidatorFailResponse($validator->getMessageBag()->getMessages()); @@ -79,7 +79,18 @@ class GoodsTypesController extends Controller } $goodsType = GoodsType::query()->find($id); $this->setBeforeUpdateForLog($goodsType->name); - $goodsType->name = request('name'); + $level= 1; + if ($request->parent_id) { + $parentGoodsType = GoodsType::query()->where("id", "=", $request->parent_id)->get()->toArray(); + $level = $parentGoodsType['level'] ?? 1 + 1; + } + + $goodsType->parent_id = $request->parent_id ?? 0; + $goodsType->show = $request->show ?? 1; + if($request->name){ + $goodsType->name = $request->name; + } + $goodsType->level = $level; $goodsType->save(); $this->setAfterUpdateForLog($goodsType->name); $this->addLog($id, 'name'); @@ -95,4 +106,11 @@ class GoodsTypesController extends Controller return response($this->res, $this->res['httpCode']); } + + public function tree(Request $request) + { + $goodsTypes = GoodsType::query()->get()->toArray(); + $menus = FormatUtils::formatTreeData($goodsTypes, $request->parent_id??0); + return $this->success($menus); + } } diff --git a/app/Http/Controllers/Supplier/PurchaseRecordController.php b/app/Http/Controllers/Supplier/PurchaseRecordController.php index b0ce3e7..c17fb0b 100644 --- a/app/Http/Controllers/Supplier/PurchaseRecordController.php +++ b/app/Http/Controllers/Supplier/PurchaseRecordController.php @@ -74,7 +74,12 @@ class PurchaseRecordController extends Controller $purchaseRecords->buyer_name = $allParams['buyer_name'] ?? ''; $purchaseRecords->supplier_name = $allParams['supplier_name'] ?? ''; $purchaseRecords->supplier_id = $allParams['supplier_id'] ?? 0; - $purchaseRecords->expire_time = $allParams['expire_time'] ?? Carbon::now()->addDays($expireDay)->toDateTimeString(); + if (!empty($allParams['expire_time'])) { + $purchaseRecords->expire_time = Carbon::parse($allParams['expire_time'])->toDateTimeString(); + }else{ + $purchaseRecords->expire_time = Carbon::now()->addDays($expireDay)->toDateTimeString(); + + } $purchaseRecords->save(); $updateIds = GoodSkuService::computeSkuStock($goodsSku->toArray(), $allParams); @@ -115,7 +120,7 @@ class PurchaseRecordController extends Controller $purchaseRecords->supplier_name = $allParams['supplier_name'] ?? ''; $purchaseRecords->supplier_id = $allParams['supplier_id'] ?? 0; if (!empty($allParams['expire_time'])) { - $purchaseRecords->expire_time = $allParams['expire_time']; + $purchaseRecords->expire_time = Carbon::parse($allParams['expire_time'])->toDateTimeString(); } $purchaseRecords->save(); diff --git a/app/Http/Service/MessageService.php b/app/Http/Service/MessageService.php index 35e1927..332e9bd 100644 --- a/app/Http/Service/MessageService.php +++ b/app/Http/Service/MessageService.php @@ -50,7 +50,7 @@ class MessageService } $date = Carbon::now()->format('Y-m-d'); foreach ($roleIds as $v) { - $arr['title'] = "订单库存不足告警"; + $arr['title'] = "商品库存不足告警"; $arr['role_id'] = $v; $arr['unique_key'] = $date . "-" . $goodsSku['id'] . "-" . $v; $arr['type'] = MessageTypeEnum::LOW_STOCK_NOTICE; @@ -72,11 +72,11 @@ class MessageService } $date = Carbon::now()->format('Y-m-d'); foreach ($roleIds as $v) { - $arr['title'] = "订单库存不足告警"; + $arr['title'] = "商品保质期告警"; $arr['role_id'] = $v; $arr['unique_key'] = $date . "-" . $goodsSku['id'] . "-" . $v;//这个场景下实际是采购单的id $arr['type'] = MessageTypeEnum::QUALITY_PERIOD_EXPIRE_NOTICE; - $arr['content'] = $date . "规格{$goodsSku['title']},即将过期,实际库存{$goodsSku['stock']} + $arr['content'] = $date . "规格{$goodsSku['title']}编码{$goodsSku['external_sku_id']},即将过期,目前实际库存{$goodsSku['stock']} ,当时采购数量为{$goodsSku['num']},录入采购时间为{$goodsSku['created_at']}"; $this->saveWebsiteMessages($arr); diff --git a/app/Listeners/BatchStockUpdateListener.php b/app/Listeners/BatchStockUpdateListener.php index 54c3fda..bd3c363 100644 --- a/app/Listeners/BatchStockUpdateListener.php +++ b/app/Listeners/BatchStockUpdateListener.php @@ -8,6 +8,8 @@ use App\Models\Shop; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Queue\InteractsWithQueue; use App\Services\Business\BusinessFactory; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Log; class BatchStockUpdateListener implements ShouldQueue { @@ -35,18 +37,22 @@ class BatchStockUpdateListener implements ShouldQueue if (empty($shops)) { return; } - foreach ($shops as $shop) { - foreach ($event->goodsSkus as $goodsSku) { - $num = $goodsSku->sale_stock; - $businessGoodsSkus = BusinessGoodsSku::query() - ->select(['goods_id', 'sku_id', 'external_sku_id']) - ->where('shop_id', $shop->id) - ->where('is_sync', 1) - ->where('external_sku_id', $goodsSku->external_sku_id) - ->get(); - BusinessFactory::init()->make($shop['plat_id'])->setShopWithId($shop['id'])->batchIncrQuantity($businessGoodsSkus->toArray(), $num, false); - usleep(140); + try { + foreach ($shops as $shop) { + foreach ($event->goodsSkus as $goodsSku) { + $num = $goodsSku->sale_stock; + $businessGoodsSkus = BusinessGoodsSku::query() + ->select(['goods_id', 'sku_id', 'external_sku_id']) + ->where('shop_id', $shop->id) + ->where('is_sync', 1) + ->where('external_sku_id', $goodsSku->external_sku_id) + ->get(); + BusinessFactory::init()->make($shop['plat_id'])->setShopWithId($shop['id'])->batchIncrQuantity($businessGoodsSkus->toArray(), $num, false); + usleep(140); + } } + } catch (\Exception $exception) { + Log::error("同步三方库存出现异常",[$exception->getMessage()]); } } } diff --git a/app/Services/Service/SaleDataService.php b/app/Services/Service/SaleDataService.php index c8b95e2..7aebff9 100644 --- a/app/Services/Service/SaleDataService.php +++ b/app/Services/Service/SaleDataService.php @@ -33,6 +33,8 @@ class SaleDataService public static function skuSaleStatisticsByToday(Request $request) { + $startTime = Carbon::parse($request->input("start_day"))->toDateTimeString(); + $endTime = Carbon::parse($request->input("end_day"))->endOfDay()->toDateTimeString(); $orderItems = BusinessOrderItem::query() ->leftJoin("business_orders as b", "business_order_id", "=", "b.id") ->select("business_order_items.external_sku_id" @@ -40,7 +42,7 @@ class SaleDataService , DB::raw("sum(CASE WHEN b.shipping_status=0 THEN goods_number-already_cancel_number ELSE 0 END) as unshipping_num") , DB::raw("sum(goods_number-already_cancel_number) as goods_total") , DB::raw("ROUND(sum(goods_amount) / 100,2) as goods_total_amount")) - ->where("business_order_items.created_at", ">", Carbon::now()->subDays(3)->startOfDay()->toDateTimeString()) + ->whereBetween("business_order_items.created_at", [$startTime, $endTime]) ->where("business_order_items.cancel_status", "=", 0) ->groupBy('external_sku_id') ->orderBy("goods_total", "DESC") @@ -136,15 +138,17 @@ class SaleDataService { //spu 基本就是全统计了 if (StaticTypeEnum::TODAY == $request->type) { - return static::spuSaleStatisticsByToday(); + return static::spuSaleStatisticsByToday($request); } else { //统计历史数据 这里走缓存 return static::spuSaleStatisticsByHistoryCache($request); } } - public static function spuSaleStatisticsByToday() + public static function spuSaleStatisticsByToday(Request $request) { + $startTime = Carbon::parse($request->input("start_day"))->toDateTimeString(); + $endTime = Carbon::parse($request->input("end_day"))->endOfDay()->toDateTimeString(); //实时统计 sku维度 $orderItems = BusinessOrderItem::query() ->leftJoin("business_orders as b", "business_order_id", "=", "b.id") @@ -153,7 +157,7 @@ class SaleDataService , DB::raw("sum(CASE WHEN b.shipping_status=0 THEN goods_number-already_cancel_number ELSE 0 END) as unshipping_num") , DB::raw("sum(goods_number-already_cancel_number) as goods_total") , DB::raw("ROUND(sum(goods_amount) / 100,2) as goods_total_amount")) - ->where("business_order_items.created_at", ">", Carbon::now()->startOfDay()->toDateTimeString()) + ->whereBetween("business_order_items.created_at", [$startTime, $endTime]) ->where("business_order_items.cancel_status", "=", 0) ->groupBy('external_sku_id')->get()->toArray(); $externalSkuIds = collect($orderItems)->pluck("external_sku_id")->toArray(); @@ -240,42 +244,15 @@ class SaleDataService public static function gmvStatistics(Request $request) { - //gmv - if (StaticTypeEnum::TODAY == $request->type) { - //以半小时为间隔统计数据 - $todayStartTime = Carbon::now()->startOfDay()->toDateTimeString(); - $orderItems = BusinessOrderItem::query() - ->select("business_order_items.external_sku_id", "goods_number", "already_cancel_number", "goods_amount", "created_at") - ->where("business_order_items.created_at", ">", $todayStartTime) - ->where("business_order_items.cancel_status", "=", 0) - ->get()->toArray(); - $interval = $request->input("interval", 30); - return collect($orderItems)->groupBy(function ($v) use ($todayStartTime, $interval) { - $diff = Carbon::parse($v['created_at'])->diffInMinutes(Carbon::parse($todayStartTime)); - return (int)floor($diff / $interval); - })->map(function ($v, $key) use ($todayStartTime, $interval) { - return [ - "sort_key" => $key, - "interval" => $interval, - "time_start" => Carbon::parse($todayStartTime)->addMinutes($key * $interval)->toTimeString(), - "time_end" => Carbon::parse($todayStartTime)->addMinutes(($key + 1) * $interval)->toTimeString(), - "goods_total" => $v->sum("goods_number") - $v->sum("already_cancel_number"), - "goods_total_amount" => $v->sum("goods_amount"), - ]; - })->sort()->values()->toArray(); - } else { - //统计历史数据 - $startTime = Carbon::parse($request->input("start_day"))->toDateTimeString(); - $endTime = Carbon::parse($request->input("end_day"))->endOfDay()->toDateTimeString(); - return DailyStockRecord::query() - ->select("day", DB::raw("sum(order_total_amount) as goods_total_amount") - , DB::raw("sum(order_goods_num) as goods_total")) - ->whereBetween("created_at", [$startTime, $endTime]) - ->groupBy("day")->orderBy("day") - ->get()->toArray(); - } - - + //gmv 目前只统计历史数据 后续看看是否需要拓展 + $startTime = Carbon::parse($request->input("start_day"))->toDateTimeString(); + $endTime = Carbon::parse($request->input("end_day"))->endOfDay()->toDateTimeString(); + return DailyStockRecord::query() + ->select("day", DB::raw("sum(order_total_amount) as goods_total_amount") + , DB::raw("sum(order_goods_num) as goods_total")) + ->whereBetween("created_at", [$startTime, $endTime]) + ->groupBy("day")->orderBy("day") + ->get()->toArray(); } diff --git a/database/migrations/2024_08_01_152352_add_order_total_amount_to_daily_stock_record.php b/database/migrations/2024_08_01_152352_add_order_total_amount_to_daily_stock_record.php index d08fe7d..f284769 100644 --- a/database/migrations/2024_08_01_152352_add_order_total_amount_to_daily_stock_record.php +++ b/database/migrations/2024_08_01_152352_add_order_total_amount_to_daily_stock_record.php @@ -30,6 +30,7 @@ class AddOrderTotalAmountToDailyStockRecord extends Migration { Schema::table('daily_stock_record', function (Blueprint $table) { // + $table->dropColumn('order_total_amount'); }); } } diff --git a/database/migrations/2024_08_06_143056_add_fields_to_goods_types.php b/database/migrations/2024_08_06_143056_add_fields_to_goods_types.php new file mode 100644 index 0000000..acd90ad --- /dev/null +++ b/database/migrations/2024_08_06_143056_add_fields_to_goods_types.php @@ -0,0 +1,40 @@ +integer('parent_id')->default(0)->comment('父id'); + $table->integer('show')->default(1)->comment('是否显示 0隐藏 1显示'); + $table->integer('level')->default(1)->comment('层级 目前仅记录使用 默认1'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('goods_types', function (Blueprint $table) { + // + $table->dropColumn('parent_id'); + $table->dropColumn('show'); + $table->dropColumn('level'); + }); + } +} diff --git a/resources/lang/zh-CN/permission.php b/resources/lang/zh-CN/permission.php index 367a760..73409e4 100644 --- a/resources/lang/zh-CN/permission.php +++ b/resources/lang/zh-CN/permission.php @@ -643,4 +643,9 @@ return [ 'name' => '售后单列表-接口查询', 'parent_id' => 141, ], + 'goods_types.tree' => [ + 'id' => 35, + 'name' => '类型树', + 'parent_id' => 3, + ], ]; diff --git a/routes/api.php b/routes/api.php index 16151a4..6ca56ae 100644 --- a/routes/api.php +++ b/routes/api.php @@ -16,7 +16,7 @@ use App\Http\Controllers\Supplier\DailyStockRecordController; use App\Http\Controllers\Supplier\LossRecordController; use App\Http\Controllers\Supplier\PurchaseRecordController; use App\Http\Controllers\Business\BusinessAfterSaleOrderController; - +use App\Http\Controllers\Goods\GoodsTypesController; /* |-------------------------------------------------------------------------- | API Routes @@ -93,6 +93,8 @@ Route::middleware(['auth:api', 'check.permissions'])->group(function () { Route::get('data_center/gmv_statistics', [DataCenterController::class, 'gmvStatistics'])->name('data_center.gmv_statistics'); Route::get('plat_after_sale_orders', [BusinessAfterSaleOrderController::class, 'index'])->name('plat_after_sale_orders.index'); + //获取树 + Route::get('goodsTypes/tree', [GoodsTypesController::class, 'tree'])->name('goods_types.tree'); }); Route::get('stock/goods_skus', [GoodsSkusController::class, 'stockNum'])->middleware('auth:api'); @@ -133,7 +135,7 @@ Route::post('upload', [UploadController::class, 'store'])->name('upload.file'); Route::get('goodsSkusList', [GoodsSkusController::class, 'goodsSkusList'])->name('goods_sku.list_for_goods_sku'); // 采购导入 -Route::post('supplier/purchase_record/purchase_import', [PurchaseRecordController::class, 'purchaseImport'])->name('supplier.purchase_record.purchase_import'); +Route::post('purchase_record/purchase_import', [PurchaseRecordController::class, 'purchaseImport'])->name('supplier.purchase_record.purchase_import'); //报损导入 Route::post('supplier/loss_record/loss_import', [LossRecordController::class, 'lossImport'])->name('supplier.loss_record.loss_import');