鲜花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);
}
//更新下状态
PurchaseRecords::query()->update([
PurchaseRecords::query()->where('id', '=', $v->id)->update([
"status" => 1
]);
}

View File

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

View File

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

View File

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

View File

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

View File

@ -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,6 +37,7 @@ class BatchStockUpdateListener implements ShouldQueue
if (empty($shops)) {
return;
}
try {
foreach ($shops as $shop) {
foreach ($event->goodsSkus as $goodsSku) {
$num = $goodsSku->sale_stock;
@ -48,5 +51,8 @@ class BatchStockUpdateListener implements ShouldQueue
usleep(140);
}
}
} catch (\Exception $exception) {
Log::error("同步三方库存出现异常",[$exception->getMessage()]);
}
}
}

View File

@ -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,31 +244,7 @@ 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 {
//统计历史数据
//gmv 目前只统计历史数据 后续看看是否需要拓展
$startTime = Carbon::parse($request->input("start_day"))->toDateTimeString();
$endTime = Carbon::parse($request->input("end_day"))->endOfDay()->toDateTimeString();
return DailyStockRecord::query()
@ -277,6 +257,3 @@ class SaleDataService
}
}

View File

@ -30,6 +30,7 @@ class AddOrderTotalAmountToDailyStockRecord extends Migration
{
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' => '售后单列表-接口查询',
'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\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');