From 9e6e5151af17fc74552d5923bec14546bf0f6990 Mon Sep 17 00:00:00 2001 From: "iVampireSP.com" Date: Fri, 19 Aug 2022 23:27:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Remote/WorkOrder/ReplyController.php | 17 +++- app/Http/Controllers/User/HostController.php | 79 +++++++++++++++++++ .../User/WorkOrder/ReplyController.php | 4 +- app/Jobs/Remote/PushWorkOrder.php | 11 ++- app/Jobs/Remote/WorkOrder/Reply.php | 56 +++++++++++++ app/Jobs/Remote/WorkOrder/WorkOrder.php | 55 +++++++++++++ app/Models/Host.php | 8 ++ app/Models/Workorder/Reply.php | 22 +++++- app/Models/Workorder/Workorder.php | 35 ++++++-- routes/api/client.php | 11 +-- 10 files changed, 273 insertions(+), 25 deletions(-) create mode 100644 app/Http/Controllers/User/HostController.php create mode 100644 app/Jobs/Remote/WorkOrder/Reply.php create mode 100644 app/Jobs/Remote/WorkOrder/WorkOrder.php diff --git a/app/Http/Controllers/Remote/WorkOrder/ReplyController.php b/app/Http/Controllers/Remote/WorkOrder/ReplyController.php index 8da6379..c6f5f61 100644 --- a/app/Http/Controllers/Remote/WorkOrder/ReplyController.php +++ b/app/Http/Controllers/Remote/WorkOrder/ReplyController.php @@ -29,12 +29,21 @@ public function index(Request $request) public function store(Request $request) { // - $request->validate([ - 'content' => 'string|required|min:1|max:1000', - ]); + // $request->validate([ + // 'content' => 'string|required|min:1|max:1000', + // ]); + + $request_array = $request->all(); + + + // dd([ + // 'content' => $request_array['content'], + // 'work_order_id' => $request->route('work_order'), + // ]); + $reply = Reply::create([ - 'content' => $request->content, + 'content' => $request_array['content'], 'work_order_id' => $request->route('work_order'), ]); diff --git a/app/Http/Controllers/User/HostController.php b/app/Http/Controllers/User/HostController.php new file mode 100644 index 0000000..a27b1de --- /dev/null +++ b/app/Http/Controllers/User/HostController.php @@ -0,0 +1,79 @@ +id)->get(); + + return $this->success($hosts); + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request, Module $module) + { + // User create host + $request->validate([ + 'name' => 'required|max:255', + 'configuration' => 'required|json', + ]); + + // // post to module + // $host = $module->hosts()->create([ + // 'name' => $request->name, + // 'configuration' => $request->configuration, + // ]); + } + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show() + { + + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + // + } +} diff --git a/app/Http/Controllers/User/WorkOrder/ReplyController.php b/app/Http/Controllers/User/WorkOrder/ReplyController.php index c0e6661..f200fec 100644 --- a/app/Http/Controllers/User/WorkOrder/ReplyController.php +++ b/app/Http/Controllers/User/WorkOrder/ReplyController.php @@ -36,8 +36,10 @@ public function store(WorkOrderRequest $request) 'content' => 'string|required|min:1|max:1000', ]); + + $reply = Reply::create([ - 'content' => $request->content, + 'content' => $request->toArray()['content'], 'work_order_id' => $request->route('work_order'), ]); diff --git a/app/Jobs/Remote/PushWorkOrder.php b/app/Jobs/Remote/PushWorkOrder.php index 8bc6bfd..15ed565 100644 --- a/app/Jobs/Remote/PushWorkOrder.php +++ b/app/Jobs/Remote/PushWorkOrder.php @@ -2,6 +2,7 @@ namespace App\Jobs\Remote; +use App\Models\WorkOrder\Reply; use Illuminate\Bus\Queueable; use App\Models\WorkOrder\WorkOrder; use Illuminate\Support\Facades\Http; @@ -33,7 +34,7 @@ public function __construct() public function handle() { // - WorkOrder::whereIn('status', ['pending', 'error'])->with(['module', 'user', 'host'])->chunk(100, function ($workOrders) { + WorkOrder::whereIn('status', ['pending', 'error'])->with(['module', 'user', 'host', 'replies'])->chunk(100, function ($workOrders) { foreach ($workOrders as $workOrder) { if ($workOrder->host->status === 'pending') { @@ -50,9 +51,13 @@ public function handle() } $workOrder->save(); + + } + }); - - dd($response); + Reply::where('is_pending', 1)->chunk(100, function ($replies) { + foreach ($replies as $reply) { + dispatch(new \App\Jobs\Remote\WorkOrder\Reply($reply)); } }); diff --git a/app/Jobs/Remote/WorkOrder/Reply.php b/app/Jobs/Remote/WorkOrder/Reply.php new file mode 100644 index 0000000..9e276ef --- /dev/null +++ b/app/Jobs/Remote/WorkOrder/Reply.php @@ -0,0 +1,56 @@ +reply = $reply; + $this->reply->load(['workOrder']); + $this->reply->workOrder->load(['module']); + // $this->reply->user = $this->reply->workOrder->user; + + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + // + $http = Http::remote($this->reply->workOrder->module->api_token, $this->reply->workOrder->module->url); + + $response = $http->post('work-orders/' . $this->reply->workOrder->id . '/replies', $this->reply->toArray()); + + if ($response->successful()) { + $this->reply->is_pending = false; + } else { + $this->reply->is_pending = true; + } + + $this->reply->save(); + + + } +} diff --git a/app/Jobs/Remote/WorkOrder/WorkOrder.php b/app/Jobs/Remote/WorkOrder/WorkOrder.php new file mode 100644 index 0000000..5cc7498 --- /dev/null +++ b/app/Jobs/Remote/WorkOrder/WorkOrder.php @@ -0,0 +1,55 @@ +workOrder = $workOrder; + $this->workOrder->load(['module']); + $this->type = $type; + + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + + $http = Http::remote($this->workOrder->module->api_token, $this->workOrder->module->url); + if ($this->type == 'put') { + $response = $http->put('work-orders/' . $this->workOrder->id, $this->workOrder->toArray()); + } else { + $response = $http->post('work-orders', $this->workOrder->toArray()); + } + + if (!$response->successful()) { + $this->workOrder->status = 'error'; + } + + $this->workOrder->save(); + } +} diff --git a/app/Models/Host.php b/app/Models/Host.php index 89cdc55..4a9a54e 100644 --- a/app/Models/Host.php +++ b/app/Models/Host.php @@ -56,6 +56,14 @@ public function scopeActive($query) { return $query->where('status', 'running')->where('price', '!=', 0); } + public function scopeThisUser($query, $module = null) { + if ($module) { + return $query->where('user_id', auth()->id())->where('module_id', $module); + } else { + return $query->where('user_id', auth()->id()); + } + } + // on create protected static function boot() { diff --git a/app/Models/Workorder/Reply.php b/app/Models/Workorder/Reply.php index 6a33437..c78ce22 100644 --- a/app/Models/Workorder/Reply.php +++ b/app/Models/Workorder/Reply.php @@ -2,8 +2,9 @@ namespace App\Models\WorkOrder; -use Illuminate\Database\Eloquent\Factories\HasFactory; +use App\Exceptions\CommonException; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Factories\HasFactory; class Reply extends Model { @@ -14,7 +15,7 @@ class Reply extends Model protected $fillable = [ 'content', 'work_order_id', - // 'user_id', + 'user_id', 'is_pending', ]; @@ -35,13 +36,18 @@ protected static function boot() parent::boot(); static::creating(function ($model) { + $model->is_pending = 1; + + // load work order $model->load(['workOrder']); + + throw_if($model->workOrder->status == 'pending' || $model->workOrder->status == 'error', CommonException::class, '工单状态不正确'); + // change work order status if (auth('sanctum')->check()) { $model->user_id = auth()->id(); $model->workOrder->status = 'user_replied'; - } if (auth('remote')->check()) { @@ -50,8 +56,16 @@ protected static function boot() } $model->workOrder->save(); + }); + static::created(function ($model) { + if (auth('remote')->check()) { + $model->workOrder->status = 'replied'; + $model->workOrder->save(); + } + // dispatch + dispatch(new \App\Jobs\Remote\WorkOrder\Reply($model)); + dispatch(new \App\Jobs\Remote\WorkOrder\WorkOrder($model->workOrder, 'put')); }); } - } diff --git a/app/Models/Workorder/Workorder.php b/app/Models/Workorder/Workorder.php index 001c9eb..e29a1bb 100644 --- a/app/Models/Workorder/Workorder.php +++ b/app/Models/Workorder/Workorder.php @@ -99,16 +99,35 @@ protected static function boot() // 更新时获取差异部分 static::updating(function ($model) { - $original = $model->getOriginal(); - // dd($original); - $diff = array_diff_assoc($model->attributes, $original); + // $original = $model->getOriginal(); + // // dd($original); + // $diff = array_diff_assoc($model->attributes, $original); - // 如果更新了host_id,则抛出异常 - if (isset($diff['host_id'])) { - throw new CommonException('host_id cannot be updated'); - } + // // 如果更新了host_id,则抛出异常 + // if (isset($diff['host_id'])) { + // throw new CommonException('host_id cannot be updated'); + // } - // queue patch diff + }); + + // updated + static::updated(function ($model) { + dispatch(new \App\Jobs\Remote\WorkOrder\WorkOrder($model, 'put')); + + // $original = $model->getOriginal(); + // $diff = array_diff_assoc($model->attributes, $original); + // // dd($diff); + // if (isset($diff['status'])) { + // $model->load(['host']); + // $model->host->load('module'); + // $module = $model->host->module; + // if ($module === null) { + // $model->status = 'open'; + // } else { + // $model->status = 'pending'; + // } + // $model->save(); + // } }); } } diff --git a/routes/api/client.php b/routes/api/client.php index 117911a..d98f5b9 100644 --- a/routes/api/client.php +++ b/routes/api/client.php @@ -1,20 +1,21 @@ middleware(['api', 'auth:sanctum'])->group(function () { // Route::apiResource('users', Controllers\User\UserController::class); - Route::apiResource('drops', DropController::class); + Route::apiResource('/modules/{module}/hosts', User\HostController::class); + + Route::apiResource('drops', User\DropController::class); Route::apiResource('work-orders', User\WorkOrder\WorkOrderController::class); Route::apiResource('work-orders.replies', User\WorkOrder\ReplyController::class); // 调用远程 API - Route::post('hosts/{host}/func/{func}', [CallController::class, 'host'])->name('host.call'); - Route::post('/modules/{module}/func/{func}', [CallController::class, 'module'])->name('module.call'); + Route::post('hosts/{host}/func/{func}', [Remote\CallController::class, 'host'])->name('host.call'); + Route::post('/modules/{module}/func/{func}', [Remote\CallController::class, 'module'])->name('module.call'); });