鲜花2.0-接口测试bug修复+类型树型接口改造

This commit is contained in:
杨建炊 2024-08-06 16:59:22 +08:00
parent 5734c08ba4
commit 0bdd35f15b
11 changed files with 134 additions and 80 deletions

View File

@ -64,7 +64,7 @@ class CheckSkuQualityPeriod extends Command
$messageService->skuQualityPeriodNoticeMessage((array)$v); $messageService->skuQualityPeriodNoticeMessage((array)$v);
} }
//更新下状态 //更新下状态
PurchaseRecords::query()->update([ PurchaseRecords::query()->where('id', '=', $v->id)->update([
"status" => 1 "status" => 1
]); ]);
} }

View File

@ -51,7 +51,7 @@ class GoodsController extends Controller
$goods->title = $request->title; $goods->title = $request->title;
$goods->img_url = $request->img_url; $goods->img_url = $request->img_url;
$goods->type_id = $request->type_id; $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->goods_code = $request->goods_code;
$goods->save(); $goods->save();
} }

View File

@ -6,6 +6,7 @@ use App\Http\Controllers\Controller;
use App\Http\Resources\GoodsTypeResource; use App\Http\Resources\GoodsTypeResource;
use App\Models\GoodsType; use App\Models\GoodsType;
use App\Models\Log as LogModel; use App\Models\Log as LogModel;
use App\Utils\FormatUtils;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule; use Illuminate\Validation\Rule;
@ -31,27 +32,29 @@ class GoodsTypesController extends Controller
public function store(Request $request) public function store(Request $request)
{ {
$validator = Validator::make($request->all(), [ $validator = Validator::make($request->all(), [
'names' => 'required|array', 'name' => 'required|string|max:191',
'names.*' => 'required|string|max:191|unique:goods_types,name', 'parent_id' => 'sometimes',
'show' => 'sometimes|integer',
]); ]);
if ($validator->fails()) { if ($validator->fails()) {
$this->setValidatorFailResponse($validator->getMessageBag()->getMessages()); $this->setValidatorFailResponse($validator->getMessageBag()->getMessages());
return response($this->res, $this->res['httpCode']); return response($this->res, $this->res['httpCode']);
} }
$goodsTypes = []; $level = 1;
foreach ($request->names as $name) { if ($request->parent_id) {
$goodsTypes[] = ['name' => $name]; $parentGoodsType = GoodsType::query()->where("id", "=", $request->parent_id)->get()->toArray();
$level = $parentGoodsType['level'] ?? 1 + 1;
} }
$goodsType = new GoodsType(); $goodsType = new GoodsType();
if (!$goodsType->batchInsert($goodsTypes)) { $goodsType->parent_id = $request->parent_id ?? 0;
$this->res = [ $goodsType->show = $request->show ?? 1;
'httpCode' => 500, $goodsType->name = $request->name;
'errorCode' => 500500, $goodsType->level = $level;
'errorMessage' => '批量添加失败', $goodsType->save();
];
} $this->setAfterUpdateForLog($request->all());
$this->setAfterUpdateForLog($goodsTypes);
$this->addLog(0, 'add'); $this->addLog(0, 'add');
return response($this->res, $this->res['httpCode']); return response($this->res, $this->res['httpCode']);
@ -65,12 +68,9 @@ class GoodsTypesController extends Controller
public function update($id, Request $request) public function update($id, Request $request)
{ {
$validator = Validator::make($request->all(), [ $validator = Validator::make($request->all(), [
'name' => [ 'name' => 'sometimes|string|max:191',
'required', 'parent_id' => 'sometimes',
'string', 'show' => 'sometimes|integer',
'max:191',
Rule::unique('goods_types')->ignore($id),
]
]); ]);
if ($validator->fails()) { if ($validator->fails()) {
$this->setValidatorFailResponse($validator->getMessageBag()->getMessages()); $this->setValidatorFailResponse($validator->getMessageBag()->getMessages());
@ -79,7 +79,18 @@ class GoodsTypesController extends Controller
} }
$goodsType = GoodsType::query()->find($id); $goodsType = GoodsType::query()->find($id);
$this->setBeforeUpdateForLog($goodsType->name); $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(); $goodsType->save();
$this->setAfterUpdateForLog($goodsType->name); $this->setAfterUpdateForLog($goodsType->name);
$this->addLog($id, 'name'); $this->addLog($id, 'name');
@ -95,4 +106,11 @@ class GoodsTypesController extends Controller
return response($this->res, $this->res['httpCode']); 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);
}
} }

View File

@ -74,7 +74,12 @@ class PurchaseRecordController extends Controller
$purchaseRecords->buyer_name = $allParams['buyer_name'] ?? ''; $purchaseRecords->buyer_name = $allParams['buyer_name'] ?? '';
$purchaseRecords->supplier_name = $allParams['supplier_name'] ?? ''; $purchaseRecords->supplier_name = $allParams['supplier_name'] ?? '';
$purchaseRecords->supplier_id = $allParams['supplier_id'] ?? 0; $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(); $purchaseRecords->save();
$updateIds = GoodSkuService::computeSkuStock($goodsSku->toArray(), $allParams); $updateIds = GoodSkuService::computeSkuStock($goodsSku->toArray(), $allParams);
@ -115,7 +120,7 @@ class PurchaseRecordController extends Controller
$purchaseRecords->supplier_name = $allParams['supplier_name'] ?? ''; $purchaseRecords->supplier_name = $allParams['supplier_name'] ?? '';
$purchaseRecords->supplier_id = $allParams['supplier_id'] ?? 0; $purchaseRecords->supplier_id = $allParams['supplier_id'] ?? 0;
if (!empty($allParams['expire_time'])) { if (!empty($allParams['expire_time'])) {
$purchaseRecords->expire_time = $allParams['expire_time']; $purchaseRecords->expire_time = Carbon::parse($allParams['expire_time'])->toDateTimeString();
} }
$purchaseRecords->save(); $purchaseRecords->save();

View File

@ -50,7 +50,7 @@ class MessageService
} }
$date = Carbon::now()->format('Y-m-d'); $date = Carbon::now()->format('Y-m-d');
foreach ($roleIds as $v) { foreach ($roleIds as $v) {
$arr['title'] = "订单库存不足告警"; $arr['title'] = "商品库存不足告警";
$arr['role_id'] = $v; $arr['role_id'] = $v;
$arr['unique_key'] = $date . "-" . $goodsSku['id'] . "-" . $v; $arr['unique_key'] = $date . "-" . $goodsSku['id'] . "-" . $v;
$arr['type'] = MessageTypeEnum::LOW_STOCK_NOTICE; $arr['type'] = MessageTypeEnum::LOW_STOCK_NOTICE;
@ -72,11 +72,11 @@ class MessageService
} }
$date = Carbon::now()->format('Y-m-d'); $date = Carbon::now()->format('Y-m-d');
foreach ($roleIds as $v) { foreach ($roleIds as $v) {
$arr['title'] = "订单库存不足告警"; $arr['title'] = "商品保质期告警";
$arr['role_id'] = $v; $arr['role_id'] = $v;
$arr['unique_key'] = $date . "-" . $goodsSku['id'] . "-" . $v;//这个场景下实际是采购单的id $arr['unique_key'] = $date . "-" . $goodsSku['id'] . "-" . $v;//这个场景下实际是采购单的id
$arr['type'] = MessageTypeEnum::QUALITY_PERIOD_EXPIRE_NOTICE; $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']}"; ,当时采购数量为{$goodsSku['num']},录入采购时间为{$goodsSku['created_at']}";
$this->saveWebsiteMessages($arr); $this->saveWebsiteMessages($arr);

View File

@ -8,6 +8,8 @@ use App\Models\Shop;
use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use App\Services\Business\BusinessFactory; use App\Services\Business\BusinessFactory;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class BatchStockUpdateListener implements ShouldQueue class BatchStockUpdateListener implements ShouldQueue
{ {
@ -35,18 +37,22 @@ class BatchStockUpdateListener implements ShouldQueue
if (empty($shops)) { if (empty($shops)) {
return; return;
} }
foreach ($shops as $shop) { try {
foreach ($event->goodsSkus as $goodsSku) { foreach ($shops as $shop) {
$num = $goodsSku->sale_stock; foreach ($event->goodsSkus as $goodsSku) {
$businessGoodsSkus = BusinessGoodsSku::query() $num = $goodsSku->sale_stock;
->select(['goods_id', 'sku_id', 'external_sku_id']) $businessGoodsSkus = BusinessGoodsSku::query()
->where('shop_id', $shop->id) ->select(['goods_id', 'sku_id', 'external_sku_id'])
->where('is_sync', 1) ->where('shop_id', $shop->id)
->where('external_sku_id', $goodsSku->external_sku_id) ->where('is_sync', 1)
->get(); ->where('external_sku_id', $goodsSku->external_sku_id)
BusinessFactory::init()->make($shop['plat_id'])->setShopWithId($shop['id'])->batchIncrQuantity($businessGoodsSkus->toArray(), $num, false); ->get();
usleep(140); BusinessFactory::init()->make($shop['plat_id'])->setShopWithId($shop['id'])->batchIncrQuantity($businessGoodsSkus->toArray(), $num, false);
usleep(140);
}
} }
} catch (\Exception $exception) {
Log::error("同步三方库存出现异常",[$exception->getMessage()]);
} }
} }
} }

View File

@ -33,6 +33,8 @@ class SaleDataService
public static function skuSaleStatisticsByToday(Request $request) 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() $orderItems = BusinessOrderItem::query()
->leftJoin("business_orders as b", "business_order_id", "=", "b.id") ->leftJoin("business_orders as b", "business_order_id", "=", "b.id")
->select("business_order_items.external_sku_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(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("sum(goods_number-already_cancel_number) as goods_total")
, DB::raw("ROUND(sum(goods_amount) / 100,2) as goods_total_amount")) , 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) ->where("business_order_items.cancel_status", "=", 0)
->groupBy('external_sku_id') ->groupBy('external_sku_id')
->orderBy("goods_total", "DESC") ->orderBy("goods_total", "DESC")
@ -136,15 +138,17 @@ class SaleDataService
{ {
//spu 基本就是全统计了 //spu 基本就是全统计了
if (StaticTypeEnum::TODAY == $request->type) { if (StaticTypeEnum::TODAY == $request->type) {
return static::spuSaleStatisticsByToday(); return static::spuSaleStatisticsByToday($request);
} else { } else {
//统计历史数据 这里走缓存 //统计历史数据 这里走缓存
return static::spuSaleStatisticsByHistoryCache($request); 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维度 //实时统计 sku维度
$orderItems = BusinessOrderItem::query() $orderItems = BusinessOrderItem::query()
->leftJoin("business_orders as b", "business_order_id", "=", "b.id") ->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(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("sum(goods_number-already_cancel_number) as goods_total")
, DB::raw("ROUND(sum(goods_amount) / 100,2) as goods_total_amount")) , 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) ->where("business_order_items.cancel_status", "=", 0)
->groupBy('external_sku_id')->get()->toArray(); ->groupBy('external_sku_id')->get()->toArray();
$externalSkuIds = collect($orderItems)->pluck("external_sku_id")->toArray(); $externalSkuIds = collect($orderItems)->pluck("external_sku_id")->toArray();
@ -240,42 +244,15 @@ class SaleDataService
public static function gmvStatistics(Request $request) public static function gmvStatistics(Request $request)
{ {
//gmv //gmv 目前只统计历史数据 后续看看是否需要拓展
if (StaticTypeEnum::TODAY == $request->type) { $startTime = Carbon::parse($request->input("start_day"))->toDateTimeString();
//以半小时为间隔统计数据 $endTime = Carbon::parse($request->input("end_day"))->endOfDay()->toDateTimeString();
$todayStartTime = Carbon::now()->startOfDay()->toDateTimeString(); return DailyStockRecord::query()
$orderItems = BusinessOrderItem::query() ->select("day", DB::raw("sum(order_total_amount) as goods_total_amount")
->select("business_order_items.external_sku_id", "goods_number", "already_cancel_number", "goods_amount", "created_at") , DB::raw("sum(order_goods_num) as goods_total"))
->where("business_order_items.created_at", ">", $todayStartTime) ->whereBetween("created_at", [$startTime, $endTime])
->where("business_order_items.cancel_status", "=", 0) ->groupBy("day")->orderBy("day")
->get()->toArray(); ->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();
}
} }

View File

@ -30,6 +30,7 @@ class AddOrderTotalAmountToDailyStockRecord extends Migration
{ {
Schema::table('daily_stock_record', function (Blueprint $table) { Schema::table('daily_stock_record', function (Blueprint $table) {
// //
$table->dropColumn('order_total_amount');
}); });
} }
} }

View File

@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddFieldsToGoodsTypes extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
if (Schema::hasColumns('goods_types', ['parent_id', 'show',"level"])) {
return;
}
Schema::table('goods_types', function (Blueprint $table) {
$table->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');
});
}
}

View File

@ -643,4 +643,9 @@ return [
'name' => '售后单列表-接口查询', 'name' => '售后单列表-接口查询',
'parent_id' => 141, 'parent_id' => 141,
], ],
'goods_types.tree' => [
'id' => 35,
'name' => '类型树',
'parent_id' => 3,
],
]; ];

View File

@ -16,7 +16,7 @@ use App\Http\Controllers\Supplier\DailyStockRecordController;
use App\Http\Controllers\Supplier\LossRecordController; use App\Http\Controllers\Supplier\LossRecordController;
use App\Http\Controllers\Supplier\PurchaseRecordController; use App\Http\Controllers\Supplier\PurchaseRecordController;
use App\Http\Controllers\Business\BusinessAfterSaleOrderController; use App\Http\Controllers\Business\BusinessAfterSaleOrderController;
use App\Http\Controllers\Goods\GoodsTypesController;
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| API Routes | 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('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('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'); 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::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'); Route::post('supplier/loss_record/loss_import', [LossRecordController::class, 'lossImport'])->name('supplier.loss_record.loss_import');