diff --git a/app/Http/Controllers/Api/ComplaintController.php b/app/Http/Controllers/Api/ComplaintController.php new file mode 100644 index 0000000..b77a8e4 --- /dev/null +++ b/app/Http/Controllers/Api/ComplaintController.php @@ -0,0 +1,31 @@ +validate( + rules: [ + 'content' => ['bail', 'required', 'string', 'min:20'], + 'photos' => ['bail', 'array'], + 'anonymous' => ['bail', 'boolean'], + ], + attributes: [ + 'content' => '投诉内容', + 'photos' => '证明材料', + 'anonymous' => '匿名', + ], + ); + + Complaint::create( + array_merge($validated, ['employee_id' => $request->user()->id]) + ); + + return response()->noContent(); + } +} diff --git a/app/Http/Controllers/Api/FeedbackController.php b/app/Http/Controllers/Api/FeedbackController.php new file mode 100644 index 0000000..b6ad44a --- /dev/null +++ b/app/Http/Controllers/Api/FeedbackController.php @@ -0,0 +1,28 @@ +validate( + rules: [ + 'content' => ['bail', 'required', 'string', 'min:20'], + ], + attributes: [ + 'content' => '意见内容', + ], + ); + + Feedback::create([ + 'employee_id' => $request->user()->id, + 'content' => $validated['content'], + ]); + + return response()->noContent(); + } +} diff --git a/app/Models/Complaint.php b/app/Models/Complaint.php index fccd56d..7b4a499 100644 --- a/app/Models/Complaint.php +++ b/app/Models/Complaint.php @@ -5,6 +5,7 @@ namespace App\Models; use App\Enums\ComplaintStatus; use App\Traits\HasDateTimeFormatter; use EloquentFilter\Filterable; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -24,7 +25,7 @@ class Complaint extends Model ]; protected $fillable = [ - 'employee_id', 'content', 'result', 'anonymous', 'complaint_status', + 'employee_id', 'content', 'photos', 'result', 'anonymous', 'complaint_status', ]; public function employee(): BelongsTo @@ -41,4 +42,18 @@ class Complaint extends Model { return $this->complaint_status === ComplaintStatus::Processing; } + + protected function photos(): Attribute + { + return Attribute::make( + get: function (mixed $value) { + if (! is_array($photos = json_decode($value ?? '', true))) { + $photos = []; + } + + return $photos; + }, + set: fn (mixed $value) => json_encode(is_array($value) ? $value : []), + ); + } } diff --git a/app/Models/Ledger.php b/app/Models/Ledger.php index b35e039..7f0c9ab 100644 --- a/app/Models/Ledger.php +++ b/app/Models/Ledger.php @@ -2,7 +2,6 @@ namespace App\Models; -use App\Enums\LedgerStatus; use App\Traits\HasCheckable; use App\Traits\HasDateTimeFormatter; use EloquentFilter\Filterable; diff --git a/database/migrations/2024_04_02_154348_create_complaints_table.php b/database/migrations/2024_04_02_154348_create_complaints_table.php index 77dbb71..4347a40 100644 --- a/database/migrations/2024_04_02_154348_create_complaints_table.php +++ b/database/migrations/2024_04_02_154348_create_complaints_table.php @@ -18,6 +18,7 @@ return new class extends Migration $table->text('result')->nullable()->comment('处理结果'); $table->boolean('anonymous')->default(false)->comment('是否匿名'); $table->tinyInteger('complaint_status')->default(1)->comment('1: 未处理, 2 处理中, 3 已处理'); + $table->text('photos')->nullable()->comment('证明材料'); $table->timestamps(); }); } diff --git a/routes/api.php b/routes/api.php index 2e51b40..3d8cbcd 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,6 +1,8 @@ ['auth:api'], ], function () { - // + // 举报投诉 + Route::post('complaints', [ComplaintController::class, 'store']); + // 意见箱 + Route::post('feedback', [FeedbackController::class, 'store']); });