作者 ZhengBing He

合并分支 'workorder' 到 'master'

Workorder



查看合并请求 !2255
... ... @@ -3,6 +3,7 @@
namespace App\Http\Controllers\Api\WorkOrder;
use App\Http\Controllers\Api\BaseController;
use App\Http\Requests\Api\WorkOrder\TicketListRequest;
use App\Http\Requests\Api\WorkOrder\TicketStoreRequest;
use App\Models\WorkOrder\TicketLog;
use App\Models\WorkOrder\TicketProject;
... ... @@ -17,8 +18,9 @@ class TicketController extends BaseController
*
* @return \Illuminate\Http\Response
*/
public function index($project_id, Request $request)
public function index(TicketListRequest $request, $project_id)
{
$validated = $request->validated();
$project = TicketProject::where('uuid', $project_id)->first();
if (!$project) return $this->error('未找到项目', 404);
$page = (int)$request->input('page', 1);
... ... @@ -30,6 +32,22 @@ class TicketController extends BaseController
])
->where('project_id', $project->id)
// ->where('submit_side', 2)
->when($request->input('status') !== null, function ($query) use ($request) {
// status 查 gl_tickets.status
$status = $request->input('status');
return $query->where('status', $status);
})
->when($request->input('search'), function ($query) use ($request) {
// search 查 gl_tickets.title 或 gl_ticket_projects.title 或 gl_ticket_projects.company_name
$search = $request->input('search');
return $query->where(function ($q) use ($search) {
$q->where('title', 'like', '%' . $search . '%')
->orWhereHas('project', function ($q1) use ($search) {
$q1->where('title', 'like', '%' . $search . '%')
->orWhere('company_name', 'like', '%' . $search . '%');
});
});
})
->orderBy('id', 'desc')
->paginate($size, ['*'], 'page', $page);
return response()->json(['data' => $tickets]);
... ...
... ... @@ -8,6 +8,8 @@ use App\Http\Requests\Aside\WorkOrder\AsideTicketStoreRequest;
use App\Http\Requests\Aside\WorkOrder\AsideTicketListRequest;
use App\Http\Requests\Aside\WorkOrder\AsideTicketUpdateRequest;
use App\Http\Requests\Aside\WorkOrder\TicketProjectListRequest;
use App\Models\ProjectAssociation\ProjectAssociation;
use App\Models\Workchat\MessagePush;
use App\Models\WorkOrder\TicketLog;
use App\Models\WorkOrder\TicketProject;
use App\Models\WorkOrder\Tickets;
... ... @@ -216,4 +218,39 @@ class AsideTicketController extends BaseController
{
//
}
/**
* 手动触发,推送工单到企微群
*/
public function pushNotify($id)
{
$ticket = Tickets::find($id);
if (!$ticket) {
$this->response('工单不存在', Code::USER_MODEL_NOTFOUND_ERROE);
}
$project = $ticket->project;
if (empty($project->association)) {
$this->response('该工单没有绑定的企微群', Code::USER_MODEL_NOTFOUND_ERROE);
}
$message_push = new MessagePush();
$message_push->project_id = $project->table_id;
$message_push->friend_id = $project->association->friend_id;
$message_push->content_type = 'Link';
$message_push->content = json_encode([
'title' => '工单查看 - ' . $project->company_name,
'desc' => $ticket->title,
'size' => 0,
'thumbSize' => 0,
'thumbUrl' => 'https://oa.quanqiusou.cn/logo.ico',
'url' => 'https://oa.quanqiusou.cn/tickets?project_id='.$project->uuid
], JSON_UNESCAPED_UNICODE);
$message_push->send_time = now();
$message_push->type = MessagePush::TYPE_TICKET;
$message_push->save();
$this->response('success', Code::SUCCESS);
}
}
... ...
<?php
namespace App\Http\Requests\Api\WorkOrder;
use Illuminate\Foundation\Http\FormRequest;
class TicketListRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'status' => 'nullable|in:0,1,2,3|integer',
'search' => 'nullable|string', // 搜索关键词
'page' => 'nullable|integer',
'size' => 'nullable|integer',
];
}
}
... ...
... ... @@ -5,6 +5,7 @@ namespace App\Models\WorkOrder;
use App\Models\Base;
use App\Models\Manage\Manage;
use App\Models\Project\Project;
use App\Models\ProjectAssociation\ProjectAssociation;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class TicketProject extends Base
... ... @@ -41,4 +42,15 @@ class TicketProject extends Base
return $this->hasOne(Manage::class, 'id', 'engineer_id')
->select(['id', 'name']);
}
/**
* 绑定的企微群
*/
public function association()
{
return $this->hasOne(ProjectAssociation::class, 'project_id', 'table_id')
->where('status', 1)
->where('binding_app', ProjectAssociation::ENTERPRISE_WECHAT)
->select(['id', 'project_id', 'friend_id', 'binding_app']);
}
}
... ...
... ... @@ -260,6 +260,7 @@ Route::middleware(['aloginauth'])->group(function () {
Route::post('/log/{id}', [Aside\WorkOrder\AsideTicketLogController::class, 'update'])->name('admin.tickets.log.update')->summary('A端工单操作日志更新,完成工单');
Route::get('/chat/{ticket_id}', [Aside\WorkOrder\TicketChatController::class, 'index'])->name('admin.tickets.chat.index')->summary('A端工单聊天记录');
Route::post('/chat/{ticket_id}', [Aside\WorkOrder\TicketChatController::class, 'store'])->name('admin.tickets.chat.store')->summary('A端工单聊天记录创建');
Route::get('/pushNotify/{ticket_id}', [Aside\WorkOrder\TicketChatController::class, 'pushNotify'])->name('admin.tickets.pushNotify')->summary('A端工单推送企微群');
});
//服务器配置
... ...