feat: #20220803 商品规格编辑修改

This commit is contained in:
赵世界 2022-08-03 20:28:42 +08:00
parent 1ee5c5eb85
commit dc013d9ae5
6 changed files with 232 additions and 79 deletions

View File

@ -6,11 +6,13 @@ use App\Http\Controllers\Controller;
use App\Http\Requests\GoodsSkuRequest; use App\Http\Requests\GoodsSkuRequest;
use App\Http\Resources\GoodsResource; use App\Http\Resources\GoodsResource;
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\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use App\Models\Goods; use App\Models\Goods;
use App\Http\Requests\GoodsRequest; use App\Http\Requests\GoodsRequest;
use App\Models\DailyStockRecord;
class GoodsController extends Controller class GoodsController extends Controller
{ {
@ -42,8 +44,8 @@ class GoodsController extends Controller
} }
DB::beginTransaction(); DB::beginTransaction();
try { try {
if (!empty($request->id)) { if (!empty($request->goods_id)) {
$goods = Goods::query()->find($request->id); $goods = Goods::query()->find($request->goods_id);
} else { } else {
$goods = new Goods(); $goods = new Goods();
$goods->title = $request->title; $goods->title = $request->title;
@ -56,11 +58,21 @@ class GoodsController extends Controller
$goodsSkus = []; $goodsSkus = [];
foreach ($request->skus as $item) { foreach ($request->skus as $item) {
$item['goods_id'] = $goods->id; $item['goods_id'] = $goods->id;
$item['reference_price'] = $item['cost'] * 1.5;
$goodsSkus[] = $item; $goodsSkus[] = $item;
} }
$collection = $goods->skus()->createMany($goodsSkus); $collection = $goods->skus()->createMany($goodsSkus)->toArray();
$this->setAfterUpdate($collection->toArray()); $this->setAfterUpdate($collection);
$this->addLog(0, 'add'); $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(); DB::commit();
} catch (\Exception $exception) { } catch (\Exception $exception) {
DB::rollBack(); DB::rollBack();

View File

@ -7,6 +7,7 @@ use App\Http\Requests\GoodsRequest;
use App\Http\Requests\GoodsSkuRequest; use App\Http\Requests\GoodsSkuRequest;
use App\Models\Goods; use App\Models\Goods;
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 App\Models\GoodsSku; use App\Models\GoodsSku;
use App\Http\Resources\GoodsSkuResource; use App\Http\Resources\GoodsSkuResource;
@ -16,6 +17,7 @@ use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule; use Illuminate\Validation\Rule;
use Illuminate\Validation\ValidationException; use Illuminate\Validation\ValidationException;
use Maatwebsite\Excel\Facades\Excel; use Maatwebsite\Excel\Facades\Excel;
use App\Models\DailyStockRecord;
class GoodsSkusController extends Controller class GoodsSkusController extends Controller
{ {
@ -34,14 +36,14 @@ class GoodsSkusController extends Controller
$goods = Goods::query()->filter()->get()->toArray(); $goods = Goods::query()->filter()->get()->toArray();
$goodsIds = array_column($goods, 'id'); $goodsIds = array_column($goods, 'id');
// 状态变更时间查询,日志 // 状态变更时间查询,日志
$day = date('Y-m-d'); //早上7点之前是昨天,7点之后是今天 $day = FormatUtils::date();
$goodsSkus = GoodsSku::query() $goodsSkus = GoodsSku::query()
->whereIn('goods_id', $goodsIds) ->whereIn('goods_id', $goodsIds)
->filter() ->filter()
->with(['goods' => function ($query) { ->with(['goods' => function ($query) {
$query->with(['type:id,name', 'brand:id,name']); $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']); $query->where('day', $day)->with(['daily:id,sku_id,day,arrived_today_num,loss_num,inventory']);
}]) }])
->paginate(); ->paginate();
@ -98,96 +100,199 @@ class GoodsSkusController extends Controller
public function batchUpdate(Request $request) public function batchUpdate(Request $request)
{ {
$appendRules = [ $appendRules = [
'updateType' => ['required', 'string', Rule::in(['newest', 'inventory', 'stock'])],
'skus' => ['required', 'array'], 'skus' => ['required', 'array'],
'skus.*.id' => [ 'skus.*.id' => [
'required', 'required',
Rule::exists('goods_skus', 'id'), Rule::exists('goods_skus', 'id'),
], ],
]; ];
$data = $request->all(); $validator = $this->validateUpdate($request->all(), $appendRules);
$this->validateUpdate($data, $appendRules); if ($validator->fails()) {
GoodsSku::whereIn('id', array_column($data, 'id')) $this->setValidatorFailResponse($validator->getMessageBag()->getMessages());
->update($data);
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) public function updateField($id, Request $request)
{ {
$appendRules = [ $rules = [
'updateField' => [ 'updateField' => [
'required', 'required',
Rule::in(['reference_price', 'reserve', 'loss_num', 'status']) 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')) { $validator = Validator::make($request->all(), $rules);
$appendRules['reason'] = ['required', 'string']; if ($validator->fails()) {
$this->setValidatorFailResponse($validator->getMessageBag()->getMessages());
return response($this->res, $this->res['httpCode']);
} }
$this->validateUpdate($request->all(), $appendRules);
$updateField = \request('updateField'); $updateField = \request('updateField');
$sku = GoodsSku::query()->find($id); if ('loss_num' === $updateField) {
$this->setBeforeUpdate($sku->$updateField); $model = DailyStockRecord::query()
$sku->$updateField = $request->$updateField; ->where('sku_id', $id)
$sku->save(); ->where('day', FormatUtils::date())
$this->setAfterUpdate($sku->$updateField); ->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); $this->addLog($id, $updateField);
return new GoodsSkuResource($sku); return response($this->res, $this->res['httpCode']);
}
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));
} }
public function store(Request $request) public function store(Request $request)

View File

@ -32,6 +32,23 @@ class GoodsSkuRequest extends FormRequest
'status' => ['required', 'integer', Rule::in([0, 1, 2])], 'status' => ['required', 'integer', Rule::in([0, 1, 2])],
'num' => ['required', 'integer'], 'num' => ['required', 'integer'],
'cost' => ['required', 'numeric'], 'cost' => ['required', 'numeric'],
'reference_price' => [
'sometimes',
'numeric',
'gt:0'
],
'reserve' => [
'sometimes',
'integer',
],
'loss_num' => [
'sometimes',
'integer',
],
'inventory' => [
'sometimes',
'integer',
],
]; ];
} }

View File

@ -7,8 +7,11 @@ class FormatUtils
/** /**
* 格式化为树形结构 * 格式化为树形结构
* @param $menus * @param $menus
* @param $parentId * @param $parentValue
* @param $juniorTitle //下级标题 * @param string $juniorTitle //下级标题
* @param string $parentKey
* @param string $subKey
* @param string $useKey
* @return array * @return array
*/ */
public static function formatTreeData($menus, $parentValue, $juniorTitle = 'children', $parentKey = 'parent_id', $subKey = 'id', $useKey = '') public static function formatTreeData($menus, $parentValue, $juniorTitle = 'children', $parentKey = 'parent_id', $subKey = 'id', $useKey = '')
@ -30,4 +33,18 @@ class FormatUtils
} }
return $data; 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);
}
} }

View File

@ -22,6 +22,7 @@ class CreateLogsTable extends Migration
$table->string('target_field')->nullable()->comment('目标字段'); $table->string('target_field')->nullable()->comment('目标字段');
$table->text('before_update')->nullable()->comment('更新前数据'); $table->text('before_update')->nullable()->comment('更新前数据');
$table->text('after_update')->nullable()->comment('更新后数据'); $table->text('after_update')->nullable()->comment('更新后数据');
$table->text('message')->nullable()->comment('备注信息');
$table->bigInteger('user_id')->comment('操作人id'); $table->bigInteger('user_id')->comment('操作人id');
$table->timestamps(); $table->timestamps();
}); });

View File

@ -30,6 +30,7 @@ Route::middleware('auth:api')->group(function () {
// 商品规格 // 商品规格
Route::resource('goods_skus', 'Goods\GoodsSkusController', ['only' => ['index', 'show', 'update', '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::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::resource('shops', 'Shop\ShopsController', ['only' => ['index', 'store', 'show', 'update', 'destroy']]);
Route::get('shop_platforms', [ShopsController::class, 'getPlatList'])->name('plat.list'); Route::get('shop_platforms', [ShopsController::class, 'getPlatList'])->name('plat.list');