[api] 举报投诉/意见箱

main
Jing Li 2024-04-07 13:29:58 +08:00
parent 60bc23c3b8
commit 6a27c971e6
6 changed files with 82 additions and 3 deletions

View File

@ -0,0 +1,31 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Complaint;
use Illuminate\Http\Request;
class ComplaintController extends Controller
{
public function store(Request $request)
{
$validated = $request->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();
}
}

View File

@ -0,0 +1,28 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Feedback;
use Illuminate\Http\Request;
class FeedbackController extends Controller
{
public function store(Request $request)
{
$validated = $request->validate(
rules: [
'content' => ['bail', 'required', 'string', 'min:20'],
],
attributes: [
'content' => '意见内容',
],
);
Feedback::create([
'employee_id' => $request->user()->id,
'content' => $validated['content'],
]);
return response()->noContent();
}
}

View File

@ -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 : []),
);
}
}

View File

@ -2,7 +2,6 @@
namespace App\Models;
use App\Enums\LedgerStatus;
use App\Traits\HasCheckable;
use App\Traits\HasDateTimeFormatter;
use EloquentFilter\Filterable;

View File

@ -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();
});
}

View File

@ -1,6 +1,8 @@
<?php
use App\Http\Controllers\Api\Auth\AccessTokenController;
use App\Http\Controllers\Api\ComplaintController;
use App\Http\Controllers\Api\FeedbackController;
use Illuminate\Support\Facades\Route;
Route::post('/auth/login', [AccessTokenController::class, 'store']);
@ -9,5 +11,8 @@ Route::delete('/auth/logout', [AccessTokenController::class, 'destroy']);
Route::group([
'middleware' => ['auth:api'],
], function () {
//
// 举报投诉
Route::post('complaints', [ComplaintController::class, 'store']);
// 意见箱
Route::post('feedback', [FeedbackController::class, 'store']);
});