工单
This commit is contained in:
parent
a006156bb4
commit
9e6e5151af
@ -29,12 +29,21 @@ public function index(Request $request)
|
|||||||
public function store(Request $request)
|
public function store(Request $request)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
$request->validate([
|
// $request->validate([
|
||||||
'content' => 'string|required|min:1|max:1000',
|
// '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([
|
$reply = Reply::create([
|
||||||
'content' => $request->content,
|
'content' => $request_array['content'],
|
||||||
'work_order_id' => $request->route('work_order'),
|
'work_order_id' => $request->route('work_order'),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
79
app/Http/Controllers/User/HostController.php
Normal file
79
app/Http/Controllers/User/HostController.php
Normal 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)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
@ -36,8 +36,10 @@ public function store(WorkOrderRequest $request)
|
|||||||
'content' => 'string|required|min:1|max:1000',
|
'content' => 'string|required|min:1|max:1000',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$reply = Reply::create([
|
$reply = Reply::create([
|
||||||
'content' => $request->content,
|
'content' => $request->toArray()['content'],
|
||||||
'work_order_id' => $request->route('work_order'),
|
'work_order_id' => $request->route('work_order'),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace App\Jobs\Remote;
|
namespace App\Jobs\Remote;
|
||||||
|
|
||||||
|
use App\Models\WorkOrder\Reply;
|
||||||
use Illuminate\Bus\Queueable;
|
use Illuminate\Bus\Queueable;
|
||||||
use App\Models\WorkOrder\WorkOrder;
|
use App\Models\WorkOrder\WorkOrder;
|
||||||
use Illuminate\Support\Facades\Http;
|
use Illuminate\Support\Facades\Http;
|
||||||
@ -33,7 +34,7 @@ public function __construct()
|
|||||||
public function handle()
|
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) {
|
foreach ($workOrders as $workOrder) {
|
||||||
|
|
||||||
if ($workOrder->host->status === 'pending') {
|
if ($workOrder->host->status === 'pending') {
|
||||||
@ -51,8 +52,12 @@ public function handle()
|
|||||||
|
|
||||||
$workOrder->save();
|
$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));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
56
app/Jobs/Remote/WorkOrder/Reply.php
Normal file
56
app/Jobs/Remote/WorkOrder/Reply.php
Normal 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();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
55
app/Jobs/Remote/WorkOrder/WorkOrder.php
Normal file
55
app/Jobs/Remote/WorkOrder/WorkOrder.php
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
@ -56,6 +56,14 @@ public function scopeActive($query) {
|
|||||||
return $query->where('status', 'running')->where('price', '!=', 0);
|
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
|
// on create
|
||||||
protected static function boot()
|
protected static function boot()
|
||||||
{
|
{
|
||||||
|
@ -2,8 +2,9 @@
|
|||||||
|
|
||||||
namespace App\Models\WorkOrder;
|
namespace App\Models\WorkOrder;
|
||||||
|
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use App\Exceptions\CommonException;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
|
||||||
class Reply extends Model
|
class Reply extends Model
|
||||||
{
|
{
|
||||||
@ -14,7 +15,7 @@ class Reply extends Model
|
|||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'content',
|
'content',
|
||||||
'work_order_id',
|
'work_order_id',
|
||||||
// 'user_id',
|
'user_id',
|
||||||
'is_pending',
|
'is_pending',
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -35,13 +36,18 @@ protected static function boot()
|
|||||||
parent::boot();
|
parent::boot();
|
||||||
static::creating(function ($model) {
|
static::creating(function ($model) {
|
||||||
|
|
||||||
|
$model->is_pending = 1;
|
||||||
|
|
||||||
|
|
||||||
// load work order
|
// load work order
|
||||||
$model->load(['workOrder']);
|
$model->load(['workOrder']);
|
||||||
|
|
||||||
|
throw_if($model->workOrder->status == 'pending' || $model->workOrder->status == 'error', CommonException::class, '工单状态不正确');
|
||||||
|
|
||||||
// change work order status
|
// change work order status
|
||||||
if (auth('sanctum')->check()) {
|
if (auth('sanctum')->check()) {
|
||||||
$model->user_id = auth()->id();
|
$model->user_id = auth()->id();
|
||||||
$model->workOrder->status = 'user_replied';
|
$model->workOrder->status = 'user_replied';
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (auth('remote')->check()) {
|
if (auth('remote')->check()) {
|
||||||
@ -50,8 +56,16 @@ protected static function boot()
|
|||||||
}
|
}
|
||||||
|
|
||||||
$model->workOrder->save();
|
$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'));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -99,16 +99,35 @@ protected static function boot()
|
|||||||
|
|
||||||
// 更新时获取差异部分
|
// 更新时获取差异部分
|
||||||
static::updating(function ($model) {
|
static::updating(function ($model) {
|
||||||
$original = $model->getOriginal();
|
// $original = $model->getOriginal();
|
||||||
// dd($original);
|
// // dd($original);
|
||||||
$diff = array_diff_assoc($model->attributes, $original);
|
// $diff = array_diff_assoc($model->attributes, $original);
|
||||||
|
|
||||||
// 如果更新了host_id,则抛出异常
|
// // 如果更新了host_id,则抛出异常
|
||||||
if (isset($diff['host_id'])) {
|
// if (isset($diff['host_id'])) {
|
||||||
throw new CommonException('host_id cannot be updated');
|
// 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();
|
||||||
|
// }
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,20 +1,21 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use App\Http\Controllers\Admin\User\DropController;
|
|
||||||
use App\Http\Controllers\Remote\CallController;
|
|
||||||
use App\Http\Controllers\User;
|
use App\Http\Controllers\User;
|
||||||
|
use App\Http\Controllers\Remote;
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
|
|
||||||
Route::name('client.')->middleware(['api', 'auth:sanctum'])->group(function () {
|
Route::name('client.')->middleware(['api', 'auth:sanctum'])->group(function () {
|
||||||
// Route::apiResource('users', Controllers\User\UserController::class);
|
// 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', User\WorkOrder\WorkOrderController::class);
|
||||||
Route::apiResource('work-orders.replies', User\WorkOrder\ReplyController::class);
|
Route::apiResource('work-orders.replies', User\WorkOrder\ReplyController::class);
|
||||||
|
|
||||||
// 调用远程 API
|
// 调用远程 API
|
||||||
Route::post('hosts/{host}/func/{func}', [CallController::class, 'host'])->name('host.call');
|
Route::post('hosts/{host}/func/{func}', [Remote\CallController::class, 'host'])->name('host.call');
|
||||||
Route::post('/modules/{module}/func/{func}', [CallController::class, 'module'])->name('module.call');
|
Route::post('/modules/{module}/func/{func}', [Remote\CallController::class, 'module'])->name('module.call');
|
||||||
|
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user