diff --git a/app/Enums/MaterielType.php b/app/Enums/MaterielType.php new file mode 100644 index 0000000..1610b19 --- /dev/null +++ b/app/Enums/MaterielType.php @@ -0,0 +1,9 @@ +filter($request->all()) + ->latest('id') + ->paginate(20); + + return MaterielResource::collection($materiels); + } + + /** + * 创建物资 + * + * @param \App\Http\Requestes\MaterielStoreRequest $request + * @return \App\Http\Resources\MaterielResource + * + * @throws \App\Exceptions\BizException + */ + public function store(MaterielStoreRequest $request): MaterielResource + { + $user = $request->user(); + + $materiel = new Materiel( + $request->only([ + 'name', + 'type', + 'year', + 'quarter', + 'lowest_price', + 'highest_price', + ]) + ); + $materiel->created_by = $user->id; + $materiel->updated_by = $user->id; + $materiel->save(); + + return MaterielResource::make( + $materiel->setRelations([ + 'createdBy' => $user, + 'updatedBy' => $user, + ]) + ); + } + + /** + * 修改物资 + * + * @param int $id + * @param \App\Http\Requestes\MaterielUpdateRequest $request + * @return \App\Http\Resources\RiceShrimpIndustryResource + */ + public function update($id, MaterielUpdateRequest $request): MaterielResource + { + $materiel = Materiel::findOrFail($id); + + foreach ([ + 'name', + 'type', + 'year', + 'quarter', + 'lowest_price', + 'highest_price', + ] as $key) { + if ($request->filled($key)) { + $materiel->{$key} = $request->input($key); + } + } + + if ($materiel->isDirty()) { + $materiel->updated_by = $request->user()->id; + } + + $materiel->save(); + + return Materiel::make( + $materiel->loadMissing(['createdBy', 'updatedBy']) + ); + } + + /** + * 删除物资 + * + * @param int $id + * @return \Illuminate\Http\JsonResponse + */ + public function destroy($id): JsonResponse + { + $materiel = Materiel::findOrFail($id); + + $materiel->delete(); + + return response()->json(null); + } +} diff --git a/app/Http/Requestes/MaterielStoreRequest.php b/app/Http/Requestes/MaterielStoreRequest.php new file mode 100644 index 0000000..60004d6 --- /dev/null +++ b/app/Http/Requestes/MaterielStoreRequest.php @@ -0,0 +1,41 @@ + ['required', 'int'], + 'quarter' => ['required', new Quarter()], + 'name' => ['required', 'string', 'max:255'], + 'type' => ['required', new Enum(MaterielType::class)], + 'lowest_price' => ['required', 'int'], + 'highest_price' => ['required', 'int', 'gte:lowest_price'], + ]; + } + + public function attributes() + { + return [ + 'year' => '年份', + 'quarter' => '季度', + 'name' => '名称', + 'type' => '类型', + 'lowest_price' => '最低价', + 'highest_price' => '最高价', + ]; + } +} diff --git a/app/Http/Requestes/MaterielUpdateRequest.php b/app/Http/Requestes/MaterielUpdateRequest.php new file mode 100644 index 0000000..6cb8560 --- /dev/null +++ b/app/Http/Requestes/MaterielUpdateRequest.php @@ -0,0 +1,40 @@ + ['filled', 'int'], + 'quarter' => ['filled', new Quarter()], + 'name' => ['filled', 'string', 'max:255'], + 'type' => ['filled', new Enum(MaterielType::class)], + 'lowest_price' => ['filled', 'int'], + 'highest_price' => ['filled', 'int', 'gte:lowest_price'], + ]; + } + + public function attributes() + { + return [ + 'year' => '年份', + 'quarter' => '季度', + 'name' => '名称', + 'type' => '类型', + 'lowest_price' => '最低价', + 'highest_price' => '最高价', + ]; + } +} diff --git a/app/Http/Resources/MaterielResource.php b/app/Http/Resources/MaterielResource.php new file mode 100644 index 0000000..c524611 --- /dev/null +++ b/app/Http/Resources/MaterielResource.php @@ -0,0 +1,31 @@ + $this->id, + 'name' => $this->name, + 'type' => $this->type, + 'year' => $this->year, + 'quarter' => $this->quarter, + 'lowest_price' => $this->lowest_price, + 'highest_price' => $this->highest_price, + 'created_by' => AdminUserResource::make($this->whenLoaded('createdBy')), + 'updated_by' => AdminUserResource::make($this->whenLoaded('updatedBy')), + 'created_at' => $this->created_at->unix(), + 'updated_at' => $this->updated_at->unix(), + ]; + } +} diff --git a/app/ModelFilters/MaterielFilter.php b/app/ModelFilters/MaterielFilter.php new file mode 100644 index 0000000..7ac1caa --- /dev/null +++ b/app/ModelFilters/MaterielFilter.php @@ -0,0 +1,28 @@ +where('year', $year); + } + + public function quarter($quarter) + { + return $this->where('quarter', $quarter); + } + + public function name($name) + { + return $this->where('name', 'like', "%{$name}%"); + } + + public function type($type) + { + return $this->where('type', $type); + } +} diff --git a/app/Models/Materiel.php b/app/Models/Materiel.php new file mode 100644 index 0000000..0f34ede --- /dev/null +++ b/app/Models/Materiel.php @@ -0,0 +1,38 @@ + MaterielType::class, + ]; + + protected $fillable = [ + 'name', + 'type', + 'year', + 'quarter', + 'lowest_price', + 'highest_price', + 'created_by', + 'updated_by', + ]; + + public function createdBy() + { + return $this->belongsTo(AdminUser::class, 'created_by'); + } + + public function updatedBy() + { + return $this->belongsTo(AdminUser::class, 'updated_by'); + } +} diff --git a/app/Rules/Quarter.php b/app/Rules/Quarter.php new file mode 100644 index 0000000..a174a6c --- /dev/null +++ b/app/Rules/Quarter.php @@ -0,0 +1,30 @@ +id(); + $table->string('name')->comment('名称'); + $table->tinyInteger('type')->comment('类型: 1 饲料, 2 肥料'); + $table->integer('year')->comment('年'); + $table->tinyInteger('quarter')->comment('季度'); + $table->unsignedBigInteger('lowest_price')->comment('最低价格'); + $table->unsignedBigInteger('highest_price')->comment('最低价格'); + $table->unsignedBigInteger('created_by')->comment('创建人ID'); + $table->unsignedBigInteger('updated_by')->comment('修改人ID'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('materiels'); + } +}; diff --git a/routes/api.php b/routes/api.php index 37d21a7..d631a28 100644 --- a/routes/api.php +++ b/routes/api.php @@ -60,10 +60,11 @@ Route::group(['middleware' => 'auth:sanctum'], function () { Route::put('admin-users/{admin_user}/edit-password', [AdminUserController::class, 'editPassword'])->name('admin_users.edit_password'); Route::apiResource('admin-roles', AdminRoleController::class)->names('admin_roles'); - // 稻虾价格 + // 重点产业 Route::apiResource('rice-shrimp-prices', RiceShrimpPriceController::class)->names('rice_shrimp_prices'); Route::apiResource('rice-shrimp-industries', RiceShrimpIndustryController::class)->names('rice_shrimp_industries'); Route::apiResource('rice-shrimp-flows', RiceShrimpFlowController::class)->names('rice_shrimp_flows'); + Route::apiResource('materiels', MaterielController::class)->names('materiels'); }); Route::prefix('users')->group(function () {