From ada42eaae66641ea3d3d38a438dd4c71e4c20b15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E4=B8=96=E7=95=8C?= <642747453@qq.com> Date: Wed, 3 Aug 2022 11:14:08 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20#20220803=20=E5=95=86=E5=93=81?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Goods/GoodsController.php | 53 ++++++++++--------- .../Controllers/Goods/GoodsSkusController.php | 31 ++++++++--- routes/api.php | 2 + 3 files changed, 53 insertions(+), 33 deletions(-) diff --git a/app/Http/Controllers/Goods/GoodsController.php b/app/Http/Controllers/Goods/GoodsController.php index 4498091..b50aa0f 100644 --- a/app/Http/Controllers/Goods/GoodsController.php +++ b/app/Http/Controllers/Goods/GoodsController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Goods; use App\Http\Controllers\Controller; +use App\Http\Resources\GoodsResource; use App\Http\Resources\GoodsSkuResource; use App\Models\Log as LogModel; use Illuminate\Http\Request; @@ -25,39 +26,35 @@ class GoodsController extends Controller public function index(Request $request) { - $goods = Goods::query()->filter()->get()->toArray(); - $goodsIds = array_column($goods, 'id'); - // 状态变更时间查询,日志 - $day = date('Y-m-d'); //早上7点之前是昨天,7点之后是今天 - $goodsSkus = GoodsSku::query() - ->whereIn('goods_id', $goodsIds) - ->filter() - ->with(['goods' => function ($query) { - $query->with(['type:id,name', 'brand:id,name']); - }]) - ->with(['daily' => function ($query) use ($day){ - $query->where('day', $day)->with(['daily:id,sku_id,day,arrived_today_num,loss_num,inventory']); - }]) - ->paginate(); + $goods = Goods::query()->get(['id', 'title', 'img_url', 'type_id', 'brand_id', 'goods_code']); - return GoodsSkuResource::collection($goodsSkus); + return GoodsResource::collection($goods); } public function store(Request $request) { - $validator = Validator::make($request->all(), [ + $goodsRules = [ 'title' => ['required', 'string', 'max:255'], 'img_url' => ['required', 'string', 'max:255'], 'type_id' => ['required', 'integer', 'exists:goods_types,id'], 'brand_id' => ['integer', 'exists:goods_brands,id'], 'goods_code' => ['required', 'alpha_dash', 'max:32', 'unique:goods,goods_code'], + ]; + + if ($useGoods = !empty($request->goods_id)) { + $goodsRules = [ + 'goods_id' => ['required', 'integer', 'exists:goods,id'], + ]; + } + $skuRules = [ 'skus' => ['required', 'array'], 'skus.*.title' => ['required', 'string', 'max:255'], 'skus.*.sku_code' => ['required', 'distinct', 'alpha_dash', 'max:32'], 'skus.*.status' => ['required', 'integer', Rule::in([0, 1, 2])], - 'skus.*.num' => ['required', 'integer', 'max:10'], - 'skus.*.cost' => ['required', 'numeric', 'max:10'], - ]); + 'skus.*.num' => ['required', 'integer'], + 'skus.*.cost' => ['required', 'numeric'], + ]; + $validator = Validator::make($request->all(), array_merge($goodsRules, $skuRules)); if ($validator->fails()) { $this->setValidatorFailResponse($validator->getMessageBag()->getMessages()); @@ -65,13 +62,17 @@ class GoodsController extends Controller } DB::beginTransaction(); try { - $goods = new Goods(); - $goods->title = $request->title; - $goods->img_url = $request->img_url; - $goods->type_id = $request->type_id; - $goods->brand_id = $request->brand_id; - $goods->goods_code = $request->goods_code; - $goods->save(); + if ($useGoods) { + $goods = Goods::query()->find($request->goods_id); + } else { + $goods = new Goods(); + $goods->title = $request->title; + $goods->img_url = $request->img_url; + $goods->type_id = $request->type_id; + $goods->brand_id = $request->brand_id; + $goods->goods_code = $request->goods_code; + $goods->save(); + } $goodsSkus = []; foreach ($request->skus as $item) { $item['goods_id'] = $goods->id; diff --git a/app/Http/Controllers/Goods/GoodsSkusController.php b/app/Http/Controllers/Goods/GoodsSkusController.php index ff4a3fa..fa8af86 100644 --- a/app/Http/Controllers/Goods/GoodsSkusController.php +++ b/app/Http/Controllers/Goods/GoodsSkusController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Goods; use App\Http\Controllers\Controller; +use App\Models\Goods; use App\Models\Log as LogModel; use Illuminate\Http\Request; use App\Models\GoodsSku; @@ -27,7 +28,22 @@ class GoodsSkusController extends Controller public function index(Request $request) { - return new GoodsSkuResource(GoodsSku::query()->get(['id', 'title'])); + $goods = Goods::query()->filter()->get()->toArray(); + $goodsIds = array_column($goods, 'id'); + // 状态变更时间查询,日志 + $day = date('Y-m-d'); //早上7点之前是昨天,7点之后是今天 + $goodsSkus = GoodsSku::query() + ->whereIn('goods_id', $goodsIds) + ->filter() + ->with(['goods' => function ($query) { + $query->with(['type:id,name', 'brand:id,name']); + }]) + ->with(['daily' => function ($query) use ($day){ + $query->where('day', $day)->with(['daily:id,sku_id,day,arrived_today_num,loss_num,inventory']); + }]) + ->paginate(); + + return GoodsSkuResource::collection($goodsSkus); } public function show($id) @@ -55,11 +71,16 @@ class GoodsSkusController extends Controller public function batchUpdate(Request $request) { $appendRules = [ - '*.id' => [ + 'skus' => ['required', 'array'], + 'skus.*.id' => [ 'required', Rule::exists('goods_skus', 'id'), ], ]; + $data = $request->all(); + $this->validateUpdate($data, $appendRules); + GoodsSku::whereIn('id', array_column($data, 'id')) + ->update($data); } public function updateField($id, Request $request) @@ -138,12 +159,8 @@ class GoodsSkusController extends Controller Rule::in([0, 1, 2]) ], ]; +// $validator = Validator::make($data, array_merge($rules, $appendRules))->validate(); $validator = Validator::make($data, array_merge($rules, $appendRules)); - if ($validator->fails()) { - $this->setValidatorFailResponse($validator->getMessageBag()->getMessages()); - - return response($this->res, $this->res['httpCode']); - } } public function store(Request $request) diff --git a/routes/api.php b/routes/api.php index 7ae0b39..c6b756b 100644 --- a/routes/api.php +++ b/routes/api.php @@ -4,6 +4,7 @@ use App\Http\Controllers\Auth\LoginController; use App\Http\Controllers\Role\RolesController; use App\Http\Controllers\UploadController; use App\Http\Controllers\Shop\ShopsController; +use App\Http\Controllers\Goods\GoodsSkusController; /* |-------------------------------------------------------------------------- @@ -28,6 +29,7 @@ Route::middleware('auth:api')->group(function () { Route::resource('goods', 'Goods\GoodsController', ['only' => ['index', 'store']]); // 商品规格 Route::resource('goods_skus', 'Goods\GoodsSkusController', ['only' => ['index', 'show', 'update', 'store']]); + Route::patch('batch/goods_skus', [GoodsSkusController::class, 'batchUpdate'])->name('goods_sku.batch_update'); // 店铺 Route::resource('shops', 'Shop\ShopsController', ['only' => ['index', 'store', 'show', 'update', 'destroy']]); Route::get('shop_platforms', [ShopsController::class, 'getPlatList'])->name('plat.list'); From 1ee5c5eb8571a76c2986fc8939d5e9b451ded581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E4=B8=96=E7=95=8C?= <642747453@qq.com> Date: Wed, 3 Aug 2022 16:41:15 +0800 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20#20220803=20=E5=95=86=E5=93=81?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Goods/GoodsController.php | 36 ++++---------- .../Controllers/Goods/GoodsSkusController.php | 43 +++++++++++++---- app/Http/Requests/GoodsRequest.php | 47 ++++++++++++++++++ app/Http/Requests/GoodsSkuPost.php | 30 ------------ app/Http/Requests/GoodsSkuRequest.php | 48 +++++++++++++++++++ app/Models/Goods.php | 2 + 6 files changed, 140 insertions(+), 66 deletions(-) create mode 100644 app/Http/Requests/GoodsRequest.php delete mode 100644 app/Http/Requests/GoodsSkuPost.php create mode 100644 app/Http/Requests/GoodsSkuRequest.php diff --git a/app/Http/Controllers/Goods/GoodsController.php b/app/Http/Controllers/Goods/GoodsController.php index b50aa0f..9a114dd 100644 --- a/app/Http/Controllers/Goods/GoodsController.php +++ b/app/Http/Controllers/Goods/GoodsController.php @@ -3,15 +3,14 @@ namespace App\Http\Controllers\Goods; use App\Http\Controllers\Controller; +use App\Http\Requests\GoodsSkuRequest; use App\Http\Resources\GoodsResource; -use App\Http\Resources\GoodsSkuResource; use App\Models\Log as LogModel; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; -use Illuminate\Validation\Rule; use App\Models\Goods; -use App\Models\GoodsSku; +use App\Http\Requests\GoodsRequest; class GoodsController extends Controller { @@ -33,28 +32,9 @@ class GoodsController extends Controller public function store(Request $request) { - $goodsRules = [ - 'title' => ['required', 'string', 'max:255'], - 'img_url' => ['required', 'string', 'max:255'], - 'type_id' => ['required', 'integer', 'exists:goods_types,id'], - 'brand_id' => ['integer', 'exists:goods_brands,id'], - 'goods_code' => ['required', 'alpha_dash', 'max:32', 'unique:goods,goods_code'], - ]; - - if ($useGoods = !empty($request->goods_id)) { - $goodsRules = [ - 'goods_id' => ['required', 'integer', 'exists:goods,id'], - ]; - } - $skuRules = [ - 'skus' => ['required', 'array'], - 'skus.*.title' => ['required', 'string', 'max:255'], - 'skus.*.sku_code' => ['required', 'distinct', 'alpha_dash', 'max:32'], - 'skus.*.status' => ['required', 'integer', Rule::in([0, 1, 2])], - 'skus.*.num' => ['required', 'integer'], - 'skus.*.cost' => ['required', 'numeric'], - ]; - $validator = Validator::make($request->all(), array_merge($goodsRules, $skuRules)); + $goodsRules = (new GoodsRequest())->rules(); + $skuRules = (new GoodsSkuRequest())->arrayRules('skus.*.'); + $validator = Validator::make($request->all(), array_merge($goodsRules, ['skus' => ['required', 'array']], $skuRules)); if ($validator->fails()) { $this->setValidatorFailResponse($validator->getMessageBag()->getMessages()); @@ -62,8 +42,8 @@ class GoodsController extends Controller } DB::beginTransaction(); try { - if ($useGoods) { - $goods = Goods::query()->find($request->goods_id); + if (!empty($request->id)) { + $goods = Goods::query()->find($request->id); } else { $goods = new Goods(); $goods->title = $request->title; @@ -79,9 +59,9 @@ class GoodsController extends Controller $goodsSkus[] = $item; } $collection = $goods->skus()->createMany($goodsSkus); - DB::commit(); $this->setAfterUpdate($collection->toArray()); $this->addLog(0, 'add'); + DB::commit(); } catch (\Exception $exception) { DB::rollBack(); $this->res = [ diff --git a/app/Http/Controllers/Goods/GoodsSkusController.php b/app/Http/Controllers/Goods/GoodsSkusController.php index fa8af86..d3344c8 100644 --- a/app/Http/Controllers/Goods/GoodsSkusController.php +++ b/app/Http/Controllers/Goods/GoodsSkusController.php @@ -3,12 +3,15 @@ namespace App\Http\Controllers\Goods; use App\Http\Controllers\Controller; +use App\Http\Requests\GoodsRequest; +use App\Http\Requests\GoodsSkuRequest; use App\Models\Goods; use App\Models\Log as LogModel; use Illuminate\Http\Request; use App\Models\GoodsSku; use App\Http\Resources\GoodsSkuResource; use App\Imports\GoodsSkusImport; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule; use Illuminate\Validation\ValidationException; @@ -57,15 +60,39 @@ class GoodsSkusController extends Controller public function update($id, Request $request) { - $data = $request->all(); - $this->validateUpdate($data); - $sku = GoodsSku::query()->find($id); - $this->setBeforeUpdate($sku->toArray()); - $sku->update($data); - $this->setAfterUpdate($sku->toArray()); - $this->addLog($id, 'update'); + $goodsRules = (new GoodsRequest())->arrayRules('goods.'); + $skuRules = (new GoodsSkuRequest())->arrayRules('sku.'); + $validator = Validator::make($request->all(), array_merge($goodsRules, $skuRules)); + if ($validator->fails()) { + $this->setValidatorFailResponse($validator->getMessageBag()->getMessages()); - return new GoodsSkuResource($sku); + return response($this->res, $this->res['httpCode']); + } + DB::beginTransaction(); + try { + // 商品规格更新 + $sku = GoodsSku::query()->find($id); + $this->setBeforeUpdate($sku->toArray()); + $sku->update($request->sku); + $this->setAfterUpdate($sku->toArray()); + $this->addLog($id, 'update'); + // 商品更新 + $goods = Goods::query()->find($sku->goods_id); + $this->setBeforeUpdate($goods->toArray()); + $goods->update($request->goods); + $this->setAfterUpdate($goods->toArray()); + $this->addLog($sku->goods_id, 'update', 'goods'); + DB::commit(); + } catch (\Exception $exception) { + DB::rollBack(); + $this->res = [ + 'httpCode' => 400, + 'errorCode' => 400416, + 'errorMessage' => $exception->getMessage(), + ]; + } + + return response($this->res, $this->res['httpCode']); } public function batchUpdate(Request $request) diff --git a/app/Http/Requests/GoodsRequest.php b/app/Http/Requests/GoodsRequest.php new file mode 100644 index 0000000..e0ecc5f --- /dev/null +++ b/app/Http/Requests/GoodsRequest.php @@ -0,0 +1,47 @@ + ['sometimes', 'required', 'integer', 'exists:goods,id'], + 'title' => ['required', 'string', 'max:255'], + 'img_url' => ['required', 'string', 'max:255'], + 'type_id' => ['required', 'integer', 'exists:goods_types,id'], + 'brand_id' => ['integer', 'exists:goods_brands,id'], + 'goods_code' => ['required', 'alpha_dash', 'max:32', Rule::unique('goods')->ignore(request('goods_id'))], + ]; + } + + public function arrayRules($arrayName) + { + $arrayRules = []; + $rules = $this->rules(); + foreach ($rules as $key => $val) { + $arrayRules[$arrayName . $key] = $val; + } + + return $arrayRules; + } +} diff --git a/app/Http/Requests/GoodsSkuPost.php b/app/Http/Requests/GoodsSkuPost.php deleted file mode 100644 index cabbf76..0000000 --- a/app/Http/Requests/GoodsSkuPost.php +++ /dev/null @@ -1,30 +0,0 @@ - ['sometimes', 'required', 'integer', 'exists:goods_skus,id'], + 'goods_id' => ['sometimes', 'required', 'integer', 'exists:goods,id'], + 'title' => ['required', 'string', 'max:255'], + 'sku_code' => ['required', 'distinct', 'alpha_dash', 'max:32'], + 'status' => ['required', 'integer', Rule::in([0, 1, 2])], + 'num' => ['required', 'integer'], + 'cost' => ['required', 'numeric'], + ]; + } + + public function arrayRules($arrayName) + { + $arrayRules = []; + $rules = $this->rules(); + foreach ($rules as $key => $val) { + $arrayRules[$arrayName . $key] = $val; + } + + return $arrayRules; + } +} diff --git a/app/Models/Goods.php b/app/Models/Goods.php index 3498be6..f9f9ff2 100644 --- a/app/Models/Goods.php +++ b/app/Models/Goods.php @@ -15,6 +15,8 @@ class Goods extends Model 'brand_id', ]; + protected $guarded = []; + /** * 多规格 */ From dc013d9ae5f9b8e604aaa1dc0d873977f4cf199e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E4=B8=96=E7=95=8C?= <642747453@qq.com> Date: Wed, 3 Aug 2022 20:28:42 +0800 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20#20220803=20=E5=95=86=E5=93=81?= =?UTF-8?q?=E8=A7=84=E6=A0=BC=E7=BC=96=E8=BE=91=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Goods/GoodsController.php | 20 +- .../Controllers/Goods/GoodsSkusController.php | 251 +++++++++++++----- app/Http/Requests/GoodsSkuRequest.php | 17 ++ app/Utils/FormatUtils.php | 21 +- .../2022_07_26_105818_create_logs_table.php | 1 + routes/api.php | 1 + 6 files changed, 232 insertions(+), 79 deletions(-) diff --git a/app/Http/Controllers/Goods/GoodsController.php b/app/Http/Controllers/Goods/GoodsController.php index 9a114dd..234752e 100644 --- a/app/Http/Controllers/Goods/GoodsController.php +++ b/app/Http/Controllers/Goods/GoodsController.php @@ -6,11 +6,13 @@ use App\Http\Controllers\Controller; use App\Http\Requests\GoodsSkuRequest; use App\Http\Resources\GoodsResource; use App\Models\Log as LogModel; +use App\Utils\FormatUtils; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; use App\Models\Goods; use App\Http\Requests\GoodsRequest; +use App\Models\DailyStockRecord; class GoodsController extends Controller { @@ -42,8 +44,8 @@ class GoodsController extends Controller } DB::beginTransaction(); try { - if (!empty($request->id)) { - $goods = Goods::query()->find($request->id); + if (!empty($request->goods_id)) { + $goods = Goods::query()->find($request->goods_id); } else { $goods = new Goods(); $goods->title = $request->title; @@ -56,11 +58,21 @@ class GoodsController extends Controller $goodsSkus = []; foreach ($request->skus as $item) { $item['goods_id'] = $goods->id; + $item['reference_price'] = $item['cost'] * 1.5; $goodsSkus[] = $item; } - $collection = $goods->skus()->createMany($goodsSkus); - $this->setAfterUpdate($collection->toArray()); + $collection = $goods->skus()->createMany($goodsSkus)->toArray(); + $this->setAfterUpdate($collection); $this->addLog(0, 'add'); + $newRecords = []; + foreach ($collection as $sku) { + $newRecords[] = [ + 'sku_id' => $sku['id'], + 'day' => FormatUtils::date(), + ]; + } + $record = new DailyStockRecord(); + $record->batchInsert($newRecords); DB::commit(); } catch (\Exception $exception) { DB::rollBack(); diff --git a/app/Http/Controllers/Goods/GoodsSkusController.php b/app/Http/Controllers/Goods/GoodsSkusController.php index d3344c8..1798db4 100644 --- a/app/Http/Controllers/Goods/GoodsSkusController.php +++ b/app/Http/Controllers/Goods/GoodsSkusController.php @@ -7,6 +7,7 @@ use App\Http\Requests\GoodsRequest; use App\Http\Requests\GoodsSkuRequest; use App\Models\Goods; use App\Models\Log as LogModel; +use App\Utils\FormatUtils; use Illuminate\Http\Request; use App\Models\GoodsSku; use App\Http\Resources\GoodsSkuResource; @@ -16,6 +17,7 @@ use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule; use Illuminate\Validation\ValidationException; use Maatwebsite\Excel\Facades\Excel; +use App\Models\DailyStockRecord; class GoodsSkusController extends Controller { @@ -34,14 +36,14 @@ class GoodsSkusController extends Controller $goods = Goods::query()->filter()->get()->toArray(); $goodsIds = array_column($goods, 'id'); // 状态变更时间查询,日志 - $day = date('Y-m-d'); //早上7点之前是昨天,7点之后是今天 + $day = FormatUtils::date(); $goodsSkus = GoodsSku::query() ->whereIn('goods_id', $goodsIds) ->filter() ->with(['goods' => function ($query) { $query->with(['type:id,name', 'brand:id,name']); }]) - ->with(['daily' => function ($query) use ($day){ + ->with(['daily' => function ($query) use ($day) { $query->where('day', $day)->with(['daily:id,sku_id,day,arrived_today_num,loss_num,inventory']); }]) ->paginate(); @@ -98,96 +100,199 @@ class GoodsSkusController extends Controller public function batchUpdate(Request $request) { $appendRules = [ + 'updateType' => ['required', 'string', Rule::in(['newest', 'inventory', 'stock'])], 'skus' => ['required', 'array'], 'skus.*.id' => [ 'required', Rule::exists('goods_skus', 'id'), ], ]; - $data = $request->all(); - $this->validateUpdate($data, $appendRules); - GoodsSku::whereIn('id', array_column($data, 'id')) - ->update($data); + $validator = $this->validateUpdate($request->all(), $appendRules); + if ($validator->fails()) { + $this->setValidatorFailResponse($validator->getMessageBag()->getMessages()); + + return response($this->res, $this->res['httpCode']); + } + $function = $request->updateType; + + return $this->$function($request); + } + + private function newest($request) + { + DB::beginTransaction(); + try { + $logs = []; + foreach ($request->skus as $sku) { + $costLog = $arrivedLog = [ + 'module' => 'goods', + 'action' => $request->getMethod(), + 'target_type' => 'goods_sku', + 'target_id' => $sku['id'], + 'user_id' => $request->user()->id + ]; + // 成本 + $goodsSku = GoodsSku::query()->where('id', $sku['id'])->first(['id', 'cost']); + $costLog['target_field'] = 'cost'; + $costLog['before_update'] = $goodsSku->cost; + $goodsSku->cost = $sku['cost']; + $goodsSku->reference_price = $sku['cost'] * 1.5; + $goodsSku->save(); + $costLog['after_update'] = $goodsSku->cost; + $logs[] = $costLog; + // 今日到货 + $record = DailyStockRecord::query()->where('sku_id', $sku['id'])->where('day', FormatUtils::date())->first(['id', 'arrived_today_num']); + $arrivedLog['target_field'] = 'arrived_today_num'; + $arrivedLog['before_update'] = $record->arrived_today_num; + $record->arrived_today_num = $sku['arrived_today_num']; + $record->save(); + $arrivedLog['after_update'] = $record->arrived_today_num; + $logs[] = $arrivedLog; + } + $log = new LogModel(); + $log->batchInsert($logs); + DB::commit(); + } catch (\Exception $exception) { + DB::rollBack(); + $this->res = [ + 'httpCode' => 400, + 'errorCode' => 400500, + 'errorMessage' => $exception->getMessage(), + ]; + } + + return response($this->res, $this->res['httpCode']); + } + + private function inventory($request) + { + DB::beginTransaction(); + try { + $logs = []; + foreach ($request->skus as $sku) { + $inventoryLog = [ + 'module' => 'goods', + 'action' => $request->getMethod(), + 'target_type' => 'goods_sku', + 'target_id' => $sku['id'], + 'user_id' => $request->user()->id + ]; + // 今日到货 + $record = DailyStockRecord::query()->where('sku_id', $sku['id'])->where('day', FormatUtils::date())->first(['id', 'inventory']); + $inventoryLog['target_field'] = 'inventory'; + $inventoryLog['before_update'] = $record->inventory; + $record->inventory = $sku['inventory']; + $record->save(); + $inventoryLog['after_update'] = $record->inventory; + $logs[] = $inventoryLog; + } + $log = new LogModel(); + $log->batchInsert($logs); + DB::commit(); + } catch (\Exception $exception) { + DB::rollBack(); + $this->res = [ + 'httpCode' => 400, + 'errorCode' => 400500, + 'errorMessage' => $exception->getMessage(), + ]; + } + + return response($this->res, $this->res['httpCode']); + } + + private function stock($skus) + { + $update = reset($skus); + DB::beginTransaction(); + try { + $sku = GoodsSku::query()->where('id', $update['id'])->get(['id', 'two_days_ago_num', 'yesterday_num']); + $record = DailyStockRecord::query() + ->where('sku_id', $sku->id) + ->where('day', FormatUtils::date()) + ->first(); + $this->setBeforeUpdate([ + 'two_days_ago_num' => $sku->two_days_ago_num, + 'yesterday_num' => $sku->yesterday_num, + 'arrived_today_num' => $record->arrived_today_num, + ]); + $sku->two_days_ago_num = $update['two_days_ago_num']; + $sku->yesterday_num = $update['two_days_ago_num']; + $sku->save(); + $record->arrived_today_num = $update['arrived_today_num']; + $record->save(); + $this->setAfterUpdate([ + 'two_days_ago_num' => $sku->two_days_ago_num, + 'yesterday_num' => $sku->yesterday_num, + 'arrived_today_num' => $record->arrived_today_num, + ]); + $this->addLog($sku->id, 'stock'); + DB::commit(); + } catch (\Exception $exception) { + DB::rollBack(); + $this->res = [ + 'httpCode' => 400, + 'errorCode' => 400416, + 'errorMessage' => $exception->getMessage(), + ]; + } + + return response($this->res, $this->res['httpCode']); } public function updateField($id, Request $request) { - $appendRules = [ + $rules = [ 'updateField' => [ 'required', Rule::in(['reference_price', 'reserve', 'loss_num', 'status']) ], + 'reference_price' => [ + 'sometimes', + 'numeric', + 'gt:0' + ], + 'reserve' => [ + 'sometimes', + 'integer', + ], + 'loss_num' => [ + 'sometimes', + 'integer', + ], + 'inventory' => [ + 'sometimes', + 'integer', + ], + 'reason' => [ + 'sometimes', + 'required', + 'string' + ] ]; - if ($request->has('loss_num')) { - $appendRules['reason'] = ['required', 'string']; + $validator = Validator::make($request->all(), $rules); + if ($validator->fails()) { + $this->setValidatorFailResponse($validator->getMessageBag()->getMessages()); + + return response($this->res, $this->res['httpCode']); } - $this->validateUpdate($request->all(), $appendRules); $updateField = \request('updateField'); - $sku = GoodsSku::query()->find($id); - $this->setBeforeUpdate($sku->$updateField); - $sku->$updateField = $request->$updateField; - $sku->save(); - $this->setAfterUpdate($sku->$updateField); + if ('loss_num' === $updateField) { + $model = DailyStockRecord::query() + ->where('sku_id', $id) + ->where('day', FormatUtils::date()) + ->first(['id', 'loss_num']); + $this->log->message = $request->input('reason', ''); + } else { + $model = GoodsSku::query()->find($id); + } + $this->setBeforeUpdate($model->$updateField); + $model->$updateField = $request->$updateField; + $model->save(); + $this->setAfterUpdate($model->$updateField); $this->addLog($id, $updateField); - return new GoodsSkuResource($sku); - } - - public function updateStock($id, Request $request) - { - $this->validateUpdate($request->all()); - $sku = GoodsSku::query()->where('id', $id)->get(['id', 'two_days_ago_num', 'yesterday_num']); - if ($sku->two_days_ago_num != \request('t wo_days_ago_num') || $sku->yesterday_num != \request('yesterday_num')) { - $this->setBeforeUpdate($sku->toArray()); - } - - } - - private function validateUpdate($data, $appendRules = []) - { - $rules = [ - '*.two_days_ago_num' => [ - 'sometimes', - 'integer', - ], - '*.yesterday_num' => [ - 'sometimes', - 'integer', - ], - '*.arrived_today_num' => [ - 'sometimes', - 'integer', - ], - '*.cost' => [ - 'sometimes', - 'numeric', - 'gt:0' - ], - '*.reference_price' => [ - 'sometimes', - 'numeric', - 'gt:0' - ], - '*.reserve' => [ - 'sometimes', - 'integer', - ], - '*.loss_num' => [ - 'sometimes', - 'integer', - ], - '*.inventory' => [ - 'sometimes', - 'integer', - ], - '*.status' => [ - 'sometimes', - 'integer', - Rule::in([0, 1, 2]) - ], - ]; -// $validator = Validator::make($data, array_merge($rules, $appendRules))->validate(); - $validator = Validator::make($data, array_merge($rules, $appendRules)); + return response($this->res, $this->res['httpCode']); } public function store(Request $request) diff --git a/app/Http/Requests/GoodsSkuRequest.php b/app/Http/Requests/GoodsSkuRequest.php index d6824e0..c403df0 100644 --- a/app/Http/Requests/GoodsSkuRequest.php +++ b/app/Http/Requests/GoodsSkuRequest.php @@ -32,6 +32,23 @@ class GoodsSkuRequest extends FormRequest 'status' => ['required', 'integer', Rule::in([0, 1, 2])], 'num' => ['required', 'integer'], 'cost' => ['required', 'numeric'], + 'reference_price' => [ + 'sometimes', + 'numeric', + 'gt:0' + ], + 'reserve' => [ + 'sometimes', + 'integer', + ], + 'loss_num' => [ + 'sometimes', + 'integer', + ], + 'inventory' => [ + 'sometimes', + 'integer', + ], ]; } diff --git a/app/Utils/FormatUtils.php b/app/Utils/FormatUtils.php index 667f332..a0a98d5 100644 --- a/app/Utils/FormatUtils.php +++ b/app/Utils/FormatUtils.php @@ -7,8 +7,11 @@ class FormatUtils /** * 格式化为树形结构 * @param $menus - * @param $parentId - * @param $juniorTitle //下级标题 + * @param $parentValue + * @param string $juniorTitle //下级标题 + * @param string $parentKey + * @param string $subKey + * @param string $useKey * @return array */ public static function formatTreeData($menus, $parentValue, $juniorTitle = 'children', $parentKey = 'parent_id', $subKey = 'id', $useKey = '') @@ -30,4 +33,18 @@ class FormatUtils } return $data; } + + /** + * 今天7点到明天7点算作今天 + */ + public static function date() + { + $time = time(); + $inventoryTime = strtotime(date('Y-m-d 07:00:00')); + if ($time < $inventoryTime) { + $time = strtotime('-1 day'); + } + + return date('Y-m-d', $time); + } } diff --git a/database/migrations/2022_07_26_105818_create_logs_table.php b/database/migrations/2022_07_26_105818_create_logs_table.php index 1ca6436..1530d0c 100644 --- a/database/migrations/2022_07_26_105818_create_logs_table.php +++ b/database/migrations/2022_07_26_105818_create_logs_table.php @@ -22,6 +22,7 @@ class CreateLogsTable extends Migration $table->string('target_field')->nullable()->comment('目标字段'); $table->text('before_update')->nullable()->comment('更新前数据'); $table->text('after_update')->nullable()->comment('更新后数据'); + $table->text('message')->nullable()->comment('备注信息'); $table->bigInteger('user_id')->comment('操作人id'); $table->timestamps(); }); diff --git a/routes/api.php b/routes/api.php index c6b756b..5c5adc8 100644 --- a/routes/api.php +++ b/routes/api.php @@ -30,6 +30,7 @@ Route::middleware('auth:api')->group(function () { // 商品规格 Route::resource('goods_skus', 'Goods\GoodsSkusController', ['only' => ['index', 'show', 'update', 'store']]); Route::patch('batch/goods_skus', [GoodsSkusController::class, 'batchUpdate'])->name('goods_sku.batch_update'); + Route::patch('single/goods_skus/{id}', [GoodsSkusController::class, 'updateField'])->name('goods_sku.single_update'); // 店铺 Route::resource('shops', 'Shop\ShopsController', ['only' => ['index', 'store', 'show', 'update', 'destroy']]); Route::get('shop_platforms', [ShopsController::class, 'getPlatList'])->name('plat.list'); From c45c004ad8545c54f2743cddb359f2e777b5ef48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E4=B8=96=E7=95=8C?= <642747453@qq.com> Date: Wed, 3 Aug 2022 20:41:04 +0800 Subject: [PATCH 4/4] =?UTF-8?q?feat:=20#20220803=20=E5=8D=95=E4=B8=AA?= =?UTF-8?q?=E5=95=86=E5=93=81=E4=BF=A1=E6=81=AF=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Goods/GoodsSkusController.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/Goods/GoodsSkusController.php b/app/Http/Controllers/Goods/GoodsSkusController.php index 1798db4..d47c1cb 100644 --- a/app/Http/Controllers/Goods/GoodsSkusController.php +++ b/app/Http/Controllers/Goods/GoodsSkusController.php @@ -260,15 +260,16 @@ class GoodsSkusController extends Controller 'sometimes', 'integer', ], - 'inventory' => [ - 'sometimes', - 'integer', - ], 'reason' => [ 'sometimes', 'required', 'string' - ] + ], + 'status' => [ + 'sometimes', + 'required', + 'integer', + Rule::in([0, 1, 2])], ]; $validator = Validator::make($request->all(), $rules); if ($validator->fails()) {