diff --git a/app/Http/Controllers/CropStructureController.php b/app/Http/Controllers/CropStructureController.php index 2948f6c..6d5af93 100644 --- a/app/Http/Controllers/CropStructureController.php +++ b/app/Http/Controllers/CropStructureController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\CropStructure; use App\Http\Requestes\CropStructureRequest; +use App\Http\Resources\CropStructureResource; use App\Http\Requestes\CropStructureUpdateRequest; class CropStructureController extends Controller @@ -17,6 +18,7 @@ class CropStructureController extends Controller 'totalOutput' => $totalOutput, 'list' => array_map(function($item) use ($totalOutput){ return [ + 'id'=> $item['id'], 'cate_name' => $item['crops_cate']['name'] ?? '', 'cate_rate' => $totalOutput ? bcdiv($item['crops_output'],$totalOutput, 4) * 100 : 0, 'year' => $item['time_year'], @@ -30,12 +32,21 @@ class CropStructureController extends Controller { $structures = $request->input('structures'); CropStructure::insert(array_map(function($item) use ($request){ - return array_merge($item, ['time_year' => $request->input('time_year')]); + return array_merge($item, [ + 'time_year' => $request->input('time_year'), + 'created_at' => now(), + 'updated_at' => now(), + ]); }, $structures)); return $this->success('添加成功'); } + public function show(CropStructure $cropStructure){ + $cropStructure->load('cropsCate'); + return $this->json(CropStructureResource::make($cropStructure)); + } + public function update(CropStructure $cropStructure, CropStructureUpdateRequest $request) { $cropStructure->update($request->input()); diff --git a/app/Http/Controllers/CropYieldController.php b/app/Http/Controllers/CropYieldController.php new file mode 100644 index 0000000..ed4ed2f --- /dev/null +++ b/app/Http/Controllers/CropYieldController.php @@ -0,0 +1,59 @@ +all()); + $totalNum = $query->sum('yield');//总产量 + $list = $query->simplePaginate(Paginator::resolvePerPage('per_page', 20, 50)); + $list->load(['base', 'crop', 'user']); + return $this->json([ + 'total' => $totalNum, + 'list' => CropYieldResource::collection($list) + ]); + } + + public function store(CropYieldRequest $request) + { + $yields = $request->input('yields'); + CropYield::insert(array_map(function($item) use ($request){ + return array_merge($item, [ + 'time_year' => $request->input('time_year'), + 'crop_id' => $request->input('crop_id'), + 'user_id' => auth('api')->user()?->id ?? 0, + 'created_at' => now(), + 'updated_at' => now(), + ]); + }, $yields)); + return $this->success('添加成功'); + } + + public function show(CropYield $cropYield) + { + dd($cropYield); + $cropYield->load(['base', 'crop', 'user']); + return $this->json(CropYieldResource::make($cropYield)); + } + + public function update(CropYield $cropYield, CropYieldUpdateRequest $request) + { + $cropYield->update($request->input()); + return $this->success('修改成功'); + } + + public function destroy(CropYield $cropYield) + { + $cropYield->delete(); + return $this->success('删除成功'); + } +} diff --git a/app/Http/Requestes/CropYieldRequest.php b/app/Http/Requestes/CropYieldRequest.php new file mode 100644 index 0000000..e45bb4a --- /dev/null +++ b/app/Http/Requestes/CropYieldRequest.php @@ -0,0 +1,43 @@ + 'required|date_format:Y', + 'crop_id' => 'required|integer|min:0', + 'yields' => 'required|array|min:1', + 'yields.*'=>'required_array_keys:base_id,yield,cultivated,output' + ]; + } + + public function messages() + { + $messages = [ + 'time_year' => '请选择年份', + 'crop_id' => '请选择农作物', + 'yields' => '请填写基地以及产值信息', + 'yields.*.required_array_keys' => '请填写完整基地以及产值信息', + ]; + + return $messages; + } + + protected function failedValidation(Validator $validator) + { + $error = $validator->errors()->all(); + throw new HttpResponseException(response()->json(['data' => [], 'code' => 400, 'message' => $error[0]])); + } +} diff --git a/app/Http/Requestes/CropYieldUpdateRequest.php b/app/Http/Requestes/CropYieldUpdateRequest.php new file mode 100644 index 0000000..49a4a91 --- /dev/null +++ b/app/Http/Requestes/CropYieldUpdateRequest.php @@ -0,0 +1,47 @@ + 'required|date_format:Y', + 'crop_id' => 'required|integer|min:0', + 'base_id' => 'required|integer|min:0', + 'yield' => 'required|integer|min:0', + 'cultivated'=> 'required|integer|min:0', + 'output' => 'required|integer|min:0' + ]; + } + + public function messages() + { + $messages = [ + 'time_year' => '请选择年份', + 'crop_id' => '请选择农作物', + 'base_id' => '请选择基地', + 'yield' => '请填写产量', + 'cultivated' => '请填写耕地面积', + 'output' => '请填写产值', + ]; + + return $messages; + } + + protected function failedValidation(Validator $validator) + { + $error = $validator->errors()->all(); + throw new HttpResponseException(response()->json(['data' => [], 'code' => 400, 'message' => $error[0]])); + } +} diff --git a/app/Http/Resources/CropStructureResource.php b/app/Http/Resources/CropStructureResource.php new file mode 100644 index 0000000..50d2347 --- /dev/null +++ b/app/Http/Resources/CropStructureResource.php @@ -0,0 +1,25 @@ + $this->id, + 'crops_cate' => $this->cropsCate?->name ?? '', + 'crops_cate_id' => $this->crops_cate_id, + 'time_year' => $this->time_year, + 'crops_output' => $this->crops_output, + ]; + } +} diff --git a/app/Http/Resources/CropYieldResource.php b/app/Http/Resources/CropYieldResource.php new file mode 100644 index 0000000..e2bcf95 --- /dev/null +++ b/app/Http/Resources/CropYieldResource.php @@ -0,0 +1,37 @@ + $this->id, + 'base_name' => $this->whenLoaded('base', function () { + return $this->base?->name; + }, ''), + 'base_id' => $this->base_id, + 'crop_name' => $this->whenLoaded('crop', function (){ + return $this->crop?->name; + }, ''), + 'crop_id' => $this->crop_id, + 'time_year' => $this->time_year, + 'yield' => $this->yield, + 'output' => $this->output, + 'cultivated' => $this->cultivated, + 'user' => $this->whenLoaded('user', function (){ + return $this->user?->name; + }, ''),//录入人 + 'created_at' => strtotime($this->created_at) ?? 0,//录入时间 + ]; + } +} diff --git a/app/ModelFilters/CropYieldFilter.php b/app/ModelFilters/CropYieldFilter.php new file mode 100644 index 0000000..1b4141e --- /dev/null +++ b/app/ModelFilters/CropYieldFilter.php @@ -0,0 +1,20 @@ +where('time_year', $y); + } + + public function crop($cropId) + { + return $this->where('crop_id', $cropId); + } +} diff --git a/app/Models/CropStructure.php b/app/Models/CropStructure.php index 9560ed5..05a6d9f 100644 --- a/app/Models/CropStructure.php +++ b/app/Models/CropStructure.php @@ -12,7 +12,8 @@ class CropStructure extends Model protected $fillable = ['time_year', 'crops_cate_id', 'crops_output']; - public function cropsCate(){ + public function cropsCate() + { return $this->belongsTo(Keywords::class, 'crops_cate_id'); } } diff --git a/app/Models/CropYield.php b/app/Models/CropYield.php new file mode 100644 index 0000000..4897a5d --- /dev/null +++ b/app/Models/CropYield.php @@ -0,0 +1,42 @@ +belongsTo(AgriculturalBase::class, 'base_id'); + } + + /** + * 农作物 + * + * @return void + */ + public function crop(){ + return $this->belongsTo(Keywords::class, 'crop_id'); + } + + /** + * 录入人 + * + * @return void + */ + public function user(){ + return $this->belongsTo(AdminUser::class, 'user_id'); + } + +} diff --git a/database/migrations/2022_10_17_111601_create_crop_yields_table.php b/database/migrations/2022_10_17_111601_create_crop_yields_table.php new file mode 100644 index 0000000..baf428d --- /dev/null +++ b/database/migrations/2022_10_17_111601_create_crop_yields_table.php @@ -0,0 +1,40 @@ +id(); + $table->unsignedBigInteger('base_id')->comment('基地ID'); + $table->unsignedBigInteger('crop_id')->comment('农产品ID'); + $table->unsignedInteger('time_year')->comment('年份'); + $table->unsignedInteger('yield')->comment('产量'); + $table->unsignedInteger('cultivated')->comment('耕地面积'); + $table->unsignedInteger('output')->comment('产值'); + $table->unsignedBigInteger('user_id')->comment('录入人'); + $table->timestamps(); + + $table->comment('农产品产量'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('crop_yields'); + } +}; diff --git a/routes/api.php b/routes/api.php index 44bd858..c2c4cfe 100644 --- a/routes/api.php +++ b/routes/api.php @@ -30,6 +30,8 @@ Route::group(['middleware' => 'auth:sanctum'], function () { Route::apiResource('agricultural-basic', AgriculturalBaseController::class)->names('agricultural_basic'); //农业结构 Route::apiResource('crop-structures', CropStructureController::class)->names('crops_build'); + //产量 + Route::apiResource('crop-yields', CropYieldController::class)->names('crops_output'); /** 系统管理 **/ Route::apiResource('admin-users', AdminUserController::class)->names('admin_users');