This commit is contained in:
iVampireSP.com 2022-08-19 23:27:57 +08:00
parent a006156bb4
commit 9e6e5151af
No known key found for this signature in database
GPG Key ID: 2F7B001CA27A8132
10 changed files with 273 additions and 25 deletions

View File

@ -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'),
]);

View File

@ -0,0 +1,79 @@
<?php
namespace App\Http\Controllers\User;
use App\Models\Host;
use Illuminate\Http\Request;
use App\Models\Module\Module;
use App\Http\Controllers\Controller;
class HostController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Module $module)
{
//
$hosts = Host::thisUser($module->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)
{
//
}
}

View File

@ -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'),
]);

View File

@ -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') {
@ -51,8 +52,12 @@ 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));
}
});

View File

@ -0,0 +1,56 @@
<?php
namespace App\Jobs\Remote\WorkOrder;
use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Http;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use App\Models\WorkOrder\Reply as WorkOrderReply;
class Reply implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $reply;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(WorkOrderReply $reply)
{
//
$this->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();
}
}

View File

@ -0,0 +1,55 @@
<?php
namespace App\Jobs\Remote\WorkOrder;
use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Http;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use App\Models\WorkOrder\WorkOrder as WorkOrderWorkOrder;
class WorkOrder implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $workOrder, $type;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(WorkOrderWorkOrder $workOrder, $type = 'post')
{
//
$this->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();
}
}

View File

@ -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()
{

View File

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

View File

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

View File

@ -1,20 +1,21 @@
<?php
use App\Http\Controllers\Admin\User\DropController;
use App\Http\Controllers\Remote\CallController;
use App\Http\Controllers\User;
use App\Http\Controllers\Remote;
use Illuminate\Support\Facades\Route;
Route::name('client.')->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');
});