作者 ZhengBing He

ok

... ... @@ -80,6 +80,7 @@ class FetchTicketProjects extends Command
'assm_id' => $assm_id,
'seom_id' => $seom_id,
'website' => $item['main_url'] ?? '',
'test_website' => $item['test_url'] ?? '',
'is_del' => 0,
];
if (!$project) {
... ... @@ -170,7 +171,9 @@ class FetchTicketProjects extends Command
'assm_id' => $assm_id,
'seom_id' => $seom_id,
'engineer_id' => $engineer_id,
'is_del' => $is_del
'is_del' => $is_del,
'website' => !empty($item->domainInfo->domain) ? 'https://'.$item->domainInfo->domain : '',
'test_website' => $item->deploy_build->test_domain ?? '',
];
if (!$project) {
$project = new TicketProject();
... ...
<?php
namespace App\Http\Controllers\Api\WorkOrder;
use App\Http\Controllers\Controller;
use App\Http\Requests\Api\WorkOrder\TicketChatStoreRequest;
use App\Models\WorkOrder\TicketChat;
use App\Models\WorkOrder\Tickets;
use Illuminate\Http\Request;
class TicketChatController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index($project_id, $ticket_id)
{
$ticket = Tickets::find($ticket_id);;
if (!$ticket) return response('工单未找到', 404);
if ($ticket->project->uuid !== $project_id) return response('无权限查看该工单', 403);
if ($ticket->project->is_del) return response('项目状态异常', 400);
$chats = TicketChat::where('ticket_id', $ticket->id)
->get();
return response()->json(['data' => $chats]);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(TicketChatStoreRequest $request, $project_id, $ticket_id)
{
$request->validated();
$ticket = Tickets::with(['project'])->find($ticket_id);
if (!$ticket) return response('工单未找到', 404);
if ($ticket->project->uuid !== $project_id) return response('无权限查看该工单', 403);
if ($ticket->project->is_del) return response('项目状态异常', 400);
$chat = new TicketChat();
$chat->ticket_id = $ticket->id;
$chat->content = $request->input('content');
$files = $request->input('files');
if (empty($files) || (is_array($files) && count(array_filter($files, function($v){ return !is_null($v); })) === 0)) {
$ticket->files = null;
} else {
$ticket->files = json_encode($files);
}
$chat->submit_side = 2;
$chat->submit_username = $request->input('submit_username');
$chat->save();
return response()->json(['data' => $chat]);
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* 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)
{
//
}
}
... ...
... ... @@ -25,7 +25,7 @@ class TicketController extends BaseController
$size = (int)$request->input('size', 10);
$tickets = Tickets::with([
'project.projectV6:id,company,version',
'project:*',
'logs.engineer:id,name',
])
->where('project_id', $project->id)
... ...
... ... @@ -15,31 +15,24 @@ use Illuminate\Support\Facades\DB;
class AsideTicketController extends BaseController
{
/**
* Display a listing of the resource.
* A端查看所有工单
*
* @return \Illuminate\Http\Response
*/
public function index(AsideTicketListRequest $request)
{
/**
* 1. 超管看所有工单
* 2. 其他查看和自己有关的工单
*/
$validated = $request->validated();
$lists = Tickets::with([
'logs.engineer:id,name',
'project',
])
->when($this, function ($query) {
$role = $this->manage['role'];
// 超管 role = 1
if ($role == 1) {
return $query;
}
// 其他角色查自己参与的工单
return $query->where(function ($q) {
$q->where('submit_user_id', $this->manage['id'])
->orWhereHas('logs', function ($q1) {
$q1->where('engineer_id', $this->manage['id']);
->when($validated['engineer_id'], function ($query) use ($validated) {
// 查 gl_tickets 表 submit_user_id 或 gl_ticket_logs 表 engineer_id
$engineerId = $validated['engineer_id'];
return $query->where(function ($q) use ($engineerId) {
$q->where('submit_user_id', $engineerId)
->orWhereHas('logs', function ($q1) use ($engineerId) {
$q1->where('engineer_id', $engineerId);
});
});
})
... ... @@ -71,6 +64,11 @@ class AsideTicketController extends BaseController
$this->response('success', Code::SUCCESS, $lists);
}
/**
* @param $search
* @return void
* V5V6所有项目
*/
public function getProjects($search)
{
$projects = TicketProject::where('is_del', 0)
... ... @@ -136,37 +134,19 @@ class AsideTicketController extends BaseController
if (!$ticket) $this->response('工单不存在', Code::USER_MODEL_NOTFOUND_ERROE);
if ($this->manage['role'] != 1
&& $ticket->submit_user_id != $this->manage['id']
&& $ticket->logs()->where('engineer_id', $this->manage['id'])->count() == 0)
// 只能查看自己的工单
$this->response('没有权限查看该工单', Code::USER_PERMISSION_ERROE);
// TODO 判断是否有查看工单详情权限,待添加
$this->response('success', Code::SUCCESS, $ticket->toArray());
}
/**
* A端修改工单
* 1. 邀请协同的同事
* 2. 审核工单
* A端负责人修改工单
* 1. 邀请同事
* 2. 修改工单状态
*/
public function update(AsideTicketUpdateRequest $request, $id)
{
$request->validated();
$ticket = Tickets::find($id);
if (!$ticket) $this->response('工单不存在', Code::USER_MODEL_NOTFOUND_ERROE);
// 检测修改权限
if ($ticket->submit_side == 1 && $ticket->submit_user_id != $this->manage['id']) {
// A端提交的工单,只有提交人可以修改
$this->response('没有权限操作该工单', Code::USER_PERMISSION_ERROE);
} elseif ($ticket->submit_side == 2)
{
// B端提交的工单,只有第一对接人可以修改
$log = $ticket->logs()->first();
if ($log->engineer_id != $this->manage['id'])
$this->response('没有权限操作该工单', Code::USER_PERMISSION_ERROE);
}
// 开始修改
$result = DB::transaction(function () use ($request, $ticket) {
... ...
<?php
namespace App\Http\Controllers\Aside\WorkOrder;
use App\Enums\Common\Code;
use App\Http\Controllers\Aside\BaseController;
use App\Http\Requests\Api\WorkOrder\TicketChatStoreRequest;
use App\Models\WorkOrder\TicketChat;
use App\Models\WorkOrder\Tickets;
use Illuminate\Http\Request;
class TicketChatController extends BaseController
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index($ticket_id)
{
$ticket = Tickets::find($ticket_id);;
if (!$ticket) return response('工单未找到', 404);
$chats = TicketChat::where('ticket_id', $ticket->id)->get();
$this->response('success', Code::SUCCESS, $chats);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(TicketChatStoreRequest $request, $ticket_id)
{
$validated = $request->validated();
$ticket = Tickets::find($request->input('ticket_id'));
if (!$ticket) return response('工单未找到', 404);
if ($ticket->project->is_del) return response('项目状态异常', 400);
$chat = new TicketChat();
$chat->ticket_id = $ticket->id;
$chat->content = $validated['content'];
$files = $validated['files'];
if (empty($files) || (is_array($files) && count(array_filter($files, function($v){ return !is_null($v); })) === 0)) {
$ticket->files = null;
} else {
$ticket->files = json_encode($files);
}
$chat->submit_username = $this->manage['name'];
$chat->submit_side = 1;
$chat->manage_id = $this->manage['id'];
$chat->save();
$this->response('success', Code::SUCCESS, $chat);
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* 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)
{
//
}
}
... ...
<?php
namespace App\Http\Controllers\Aside\WorkOrder;
use App\Enums\Common\Code;
use App\Http\Controllers\Aside\BaseController;
use App\Http\Requests\Aside\WorkOrder\WorkOrderListRequest;
use App\Http\Requests\Aside\WorkOrder\WorkOrderUpdateRequest;
use App\Models\WorkOrder\WorkOrder;
use App\Models\WorkOrder\WorkOrderLog;
use Illuminate\Support\Facades\DB;
class WorkOrderController extends BaseController
{
/**
* A端工单列表
* 显示有我参与的工单列表
*/
public function index(WorkOrderListRequest $request)
{
/*
* A端工程师工单列表, 查询我的工单
*/
$request->validated();
# manage_id 或 engineer_id 是我
$lists = WorkOrderLog::with([
'workOrder.logs.manager:id,name',
'workOrder.project:id,company,title',
])
->where('manage_id', $this->manage['id'])
->when($request->input('project_id') !== null, function ($query) use ($request) {
// project_id 查 workOrder
return $query->whereHas('workOrder', function ($q) use ($request) {
$q->where('project_id', $request->input('project_id'));
});
})
->when($request->input('status') !== null, function ($query) use ($request) {
// status 查 workOrder
return $query->whereHas('workOrder', function ($q) use ($request) {
$q->where('status', $request->input('status'));
});
})
->when($request->input('search'), function ($query) use ($request) {
// search 查 workOrder
return $query->whereHas('workOrder', function ($q) use ($request) {
$q->where('product', 'like', '%' . $request->input('search') . '%')
->orWhere('content', 'like', '%' . $request->input('search') . '%');
});
})
->orderBy('id', 'desc')
->paginate($this->row, ['*'], 'page', $this->page);
$this->response('success', Code::SUCCESS, $lists);
}
/**
* @param WorkOrderListRequest $request
* @return void
* A端管理员的工单列表
*/
public function manager(WorkOrderListRequest $request)
{
$request->validated();
// 管理员查看所有工单
$lists = WorkOrder::with([
'user:id,name',
'manager:id,name',
'engineer:id,name',
'logs.manager:id,name',
'project:id,company:title',
])
->when($request->input('project_id') !== null, function ($query) use ($request) {
return $query->where('project_id', $request->input('project_id'));
})
->when($request->input('status') !== null, function ($query) use ($request) {
return $query->where('status', $request->input('status'));
})
->when($request->input('search'), function ($query) use ($request) {
return $query->where('product', 'like', '%' . $request->input('search') . '%')
->orWhere('content', 'like', '%' . $request->input('search') . '%');
})
->orderBy('id', 'desc')
->paginate($this->row, ['*'], 'page', $this->page);
$this->response('success', Code::SUCCESS, $lists);
}
/**
* A端工单详情
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$workOrder = WorkOrder::with([
'logs.manager:id,name',
'user:id,name',
'manager:id,name',
'engineer:id,name',
'project:id,company:title',
])->find($id);
if (!$workOrder)
$this->response('工单不存在', Code::USER_MODEL_NOTFOUND_ERROE);
// TODO 判断是否有查看工单详情权限,待添加
$this->response('success', Code::SUCCESS, $workOrder->toArray());
}
/**
* A端操作工单,工程师操作的是工单日志
* - 工程师:回复工单,自动��拆分给自己的子任务改为完成
* - 工单第一对接人:
* - 邀请工程师处理工单
* - 修改工单状态
* 若全部子任务完成,则将工单状态改为完成
*/
public function update(WorkOrderUpdateRequest $request, $id)
{
$request->validated();
$log = WorkOrderLog::find($id); // 拆分的子工单
if (!$log) {
$this->response('工单不存在', Code::USER_MODEL_NOTFOUND_ERROE);
}
if ($log->manage_id != $this->manage['id']) {
// 只能操作自己的工单
$this->response('没有权限操作该工单', Code::USER_PERMISSION_ERROE);
}
$workOrder = $log->workOrder;
$result = DB::transaction(function () use ($request, $workOrder, $log) {
if ($request->input('engineer_ids'))
{
// 有邀请工程师协同处理
foreach ($request->input('engineer_ids') as $engineer_id)
{
try {
// 利用唯一索引去重
$new_log = new WorkOrderLog();
$new_log->manage_id = $engineer_id;
$workOrder->logs()->save($new_log);
$workOrder->engineer_id = $engineer_id;
$workOrder->save();
}catch (\Exception $exception){}
}
}
if ($request->input('content'))
$log->content = $request->input('content');
if ($request->input('files'))
$log->files = $request->input('files');
if ($request->input('status') !== null)
{
$log->status = $request->input('status');
if ($log->status >= WorkOrder::STATUS_COMPLETED)
{
// 我的工单标记为已完成
$log->status = $request->input('status');
$log->end_at = now();
}
}
$log->save();
// 是否有未完成的子任务
$pending = $workOrder->logs()
->where('status', '<', WorkOrderLog::STATUS_COMPLETED)
->count();
if ($pending)
{
$workOrder->status = WorkOrder::STATUS_PROCESSING;
}else
{
$workOrder->status = WorkOrder::STATUS_COMPLETED;
// 如果所有子任务都完成了,则将工单状态改为已完成
$workOrder->end_at = now();
}
$workOrder->save();
return $log;
});
$this->response('success', Code::SUCCESS, $result->toArray());
}
}
<?php
namespace App\Http\Controllers\Bside\WorkOrder;
use App\Enums\Common\Code;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Requests\Aside\WorkOrder\WorkOrderListRequest;
use App\Http\Requests\Bside\WorkOrder\WorkOrderCreateRequest;
use App\Http\Requests\Bside\WorkOrder\WorkOrderUpdateRequest;
use App\Models\Project\Project;
use App\Models\WorkOrder\WorkOrder;
use App\Models\WorkOrder\WorkOrderLog;
use Illuminate\Support\Facades\DB;
class WorkOrderController extends BaseController
{
/**
* B端售后工单列表
*
* @return \Illuminate\Http\Response
*/
public function index(WorkOrderListRequest $request)
{
$request->validated();
$where = [
'project_id' => $this->user['project_id'],
];
// 分页查询
$lists = WorkOrder::with([
'manager:id,name',
])
->where($where)
->when($request->input('status'), function ($query) use ($request) {
return $query->where('status', $request->input('status'));
})
->when($request->input('search'), function ($query) use ($request) {
return $query->where('product', 'like', '%' . $request->input('search') . '%')
->orWhere('content', 'like', '%' . $request->input('search') . '%');
})
->orderBy('id', 'desc')->paginate($this->row, ['*'], 'page', $this->page);
$this->response('success', Code::SUCCESS, $lists);
}
/**
* B端用户提交工单
*
* @return \Illuminate\Http\Response
*/
public function store(WorkOrderCreateRequest $request)
{
$request->validated();
$result = DB::transaction(function () use ($request) {
$workOrder = new WorkOrder;
$workOrder->product = $request->input('product');
$workOrder->content = $request->input('content');
$workOrder->files = json_encode($request->input('files'));
$workOrder->project_user_id = $this->user['id'];
$workOrder->project_id = $this->user['project_id'];
$workOrder->engineer_id = 0;
if ($this->project['type'] == 3){
// 项目类型是优化推广,项目负责人找优化
$seo = Project::find($this->user['project_id'])->deploy_optimize;
$workOrder->manage_id = $seo->manager_mid ?? $seo->optimist_mid ?? 0;
}else{
// 非优化推广项目,项目负责人找技术组长
$build = Project::find($this->user['project_id'])->deploy_build;
$workOrder->manage_id = $build->leader_mid ?? 0;
}
$workOrder->save();
// 添加工单日志
$log = new WorkOrderLog();
$log->manage_id = $workOrder->manage_id;
$workOrder->logs()->save($log);
return $workOrder;
});
$this->response('success', Code::SUCCESS, $result->toArray());
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$workOrder = WorkOrder::with([
'logs.manager:id,name',
'user:id,name',
'manager:id,name',
'engineer:id,name',
])->find($id);
if (!$workOrder) {
$this->response('工单未找到', 404);
}
if ($workOrder->project_id != $this->user['project_id'] && $workOrder->engineer_id != $this->user['id']) {
$this->response('无权限查看该工单', 403);
}
$this->response('success', Code::SUCCESS, $workOrder->toArray());
}
/**
* B端用户修改工单,只能是修改工单状态
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(WorkOrderUpdateRequest $request, $id)
{
$request->validated();
$workOrder = WorkOrder::find($id);
if (!$workOrder) {
$this->response('工单未找到', 404);
}
// b端只有自己项目下的账号可以更新工单
if ($workOrder->project_id != $this->user['project_id']) {
$this->response('无权限更新该工单', 403);
}
// 更新工单状态
$workOrder->status = WorkOrder::STATUS_COMPLETED;
$workOrder->end_at = now();
$workOrder->save();
// B端完成工单,将所有未完成的子工单状态改为已完成。并记录完成时间
$workOrder->logs()->where('status', '<', WorkOrderLog::STATUS_COMPLETED)
->update(['status' => WorkOrderLog::STATUS_COMPLETED, 'end_at' => now()]);
$this->response('success', Code::SUCCESS);
}
public function destroy($id)
{
$workOrder = WorkOrder::find($id);
if (!$workOrder) {
$this->response('工单未找到', 404);
}
if ($workOrder->status >= WorkOrder::STATUS_COMPLETED)
$this->response('已完结的工单不能删除', 403);
if ($this->user['type'] != 1 && $workOrder->project_user_id != $this->user['id']) {
// 只有项目负责人可以删除工单
$this->response('无权限删除该工单', 403);
}
# 删除工单
$workOrder->delete();
$this->response('工单已删除', Code::SUCCESS);
}
}
<?php
namespace App\Http\Requests\Bside\WorkOrder;
namespace App\Http\Requests\Api\WorkOrder;
use Illuminate\Foundation\Http\FormRequest;
class WorkOrderCreateRequest extends FormRequest
class TicketChatStoreRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
... ... @@ -24,9 +24,9 @@ class WorkOrderCreateRequest extends FormRequest
public function rules()
{
return [
'product' => 'required|string',
'content' => 'required|string',
'files' => 'nullable|array',
'submit_username' => 'required|string',
];
}
}
... ...
... ... @@ -24,9 +24,10 @@ class AsideTicketListRequest extends FormRequest
public function rules()
{
return [
'project_id' => 'nullable|string', // 产品ID
'project_id' => 'nullable|string',
'status' => 'nullable|in:0,1,2,3|integer',
'search' => 'nullable|string', // 搜索关键词
'engineer_id' => 'nullable|integer', // 工程师ID
'page' => 'nullable|integer',
'size' => 'nullable|integer',
];
... ...
<?php
namespace App\Http\Requests\Aside\WorkOrder;
use Illuminate\Foundation\Http\FormRequest;
class WorkOrderListRequest 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 [
'page' => 'nullable|integer',
'size' => 'nullable|integer',
'project_id' => 'nullable|integer', // 产品ID
'status' => 'nullable|in:0,1,2,3|integer',
'search' => 'nullable|string', // 搜索关键词
];
}
}
<?php
namespace App\Http\Requests\Aside\WorkOrder;
use Illuminate\Foundation\Http\FormRequest;
class WorkOrderUpdateRequest 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
* A端更新售后工单
*/
public function rules()
{
return [
'status' => 'nullable|in:0,1,2,3|integer',
'engineer_ids' => 'nullable|array',
'content' => 'nullable|string',
'files' => 'nullable|array',
];
}
}
<?php
namespace App\Http\Requests\Bside\WorkOrder;
use Illuminate\Foundation\Http\FormRequest;
class WorkOrderUpdateRequest 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',
'engineer_ids' => 'nullable|array',
'content' => 'nullable|string',
'files' => 'nullable|array',
];
}
}
<?php
namespace App\Models\WorkOrder;
use App\Models\Base;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class TicketChat extends Base
{
use HasFactory;
protected $table = 'gl_ticket_chats';
/**
* 关联工单
*/
public function ticket()
{
return $this->belongsTo(Tickets::class, 'ticket_id', 'id');
}
}
... ...
<?php
namespace App\Models\WorkOrder;
use App\Models\Base;
use App\Models\Manage\Manage;
use App\Models\Project\Project;
use App\Models\User\User;
class WorkOrder extends Base
{
protected $table = 'gl_work_orders';
const STATUS_PEDDING = 0; // 待处理
const STATUS_PROCESSING = 1; // 处理中
const STATUS_COMPLETED = 2; // 已完成
const STATUS_CLOSED = 3; // 已关闭
/**
* 工单操作日志
*/
public function logs()
{
return $this->hasMany(WorkOrderLog::class, 'work_order_id', 'id');
}
/**
* 提交工单的用户
*/
public function user()
{
return $this->belongsTo(User::class, 'project_user_id', 'id');
}
/**
* 工单分配的管理员
*/
public function manager()
{
return $this->belongsTo(Manage::class, 'manage_id', 'id');
}
/**
* 工单分配的工程师
*/
public function engineer()
{
return $this->belongsTo(Manage::class, 'engineer_id', 'id');
}
/** 工单所属项目 */
public function project()
{
return $this->belongsTo(Project::class, 'project_id', 'id');
}
}
<?php
namespace App\Models\WorkOrder;
use App\Models\Base;
use App\Models\Manage\Manage;
class WorkOrderLog extends Base
{
protected $table = 'gl_work_order_logs';
const STATUS_PEDDING = 0; // 待处理
const STATUS_PROCESSING = 1; // 处理中
const STATUS_COMPLETED = 2; // 已完成
const STATUS_CLOSED = 3; // 已关闭
/**
* 所属工单
*/
public function workOrder()
{
return $this->belongsTo(WorkOrder::class, 'work_order_id');
}
/**
* 分配的工单负责人,工程师等
*/
public function manager()
{
return $this->belongsTo(Manage::class, 'manage_id', 'id');
}
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateTicketChatsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('ticket_chats', function (Blueprint $table) {
$table->id();
$table->longText('content')->comment('消息内容');
$table->json('files')->nullable()->comment('附件');
$table->foreignId('ticket_id')->constrained('gl_tickets')->onDelete('cascade')->comment('工单ID');
$table->integer('manage_id')->default(0)->comment('gl_manage 表ID');
$table->integer('submit_side')->index()->default(1)->comment('提交方,1: A端, 2: B端');
$table->string('submit_username')->nullable()->comment('提交人姓名,B端在企微群提交时,留个姓名即可');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('ticket_chats');
}
}
... ...
... ... @@ -83,4 +83,6 @@ Route::prefix('tickets')->group(function () {
Route::get('/projectInfo/{project_id}', [\App\Http\Controllers\Api\WorkOrder\TicketController::class, 'projectInfo'])->summary('B端,渠道-项目信息')->name('tickets.projectInfo');
Route::post('/{project_id}', [\App\Http\Controllers\Api\WorkOrder\TicketController::class, 'store'])->summary('B端,渠道-提工单')->name('tickets.store');
Route::get('/{project_id}/{id}', [\App\Http\Controllers\Api\WorkOrder\TicketController::class, 'show'])->summary('B端,渠道-工单详情')->name('tickets.show');
Route::get('/chat/{project_id}/{ticket_id}', [\App\Http\Controllers\Api\WorkOrder\TicketChatController::class, 'index'])->summary('B端,渠道-工单聊天记录')->name('tickets.chat.index');
Route::post('/chat/{project_id}/{ticket_id}', [\App\Http\Controllers\Api\WorkOrder\TicketChatController::class, 'store'])->summary('B端,渠道-工单聊天记录提交')->name('tickets.chat.store');
});
... ...
... ... @@ -248,13 +248,6 @@ Route::middleware(['aloginauth'])->group(function () {
Route::post('/save_follow', [Aside\Task\TaskController::class, 'save_follow'])->name('admin.task_save_follow');
Route::any('/getUserTaskList', [Aside\Task\TaskController::class, 'getUserTaskList'])->name('admin.task_getUserTaskList');
});
// 售后工单
Route::prefix('workorder')->group(function () {
Route::get('/', [Aside\WorkOrder\WorkOrderController::class, 'index'])->name('admin.workorder.index')->summary('A端工程师的工单列表');
Route::get('/manager', [Aside\WorkOrder\WorkOrderController::class, 'manager'])->name('admin.workorder.manager')->summary('A端管理员的工单列表');
Route::get('/{id}', [Aside\WorkOrder\WorkOrderController::class, 'show'])->name('admin.workorder.show')->summary('A端工单详情');
Route::post('/{id}', [Aside\WorkOrder\WorkOrderController::class, 'update'])->name('admin.workorder.update')->summary('A端更新工单');
});
// 售后工单改版
Route::prefix('tickets')->group(function () {
Route::get('/', [Aside\WorkOrder\AsideTicketController::class, 'index'])->name('admin.tickets.index')->summary('A端工单列表');
... ... @@ -263,6 +256,8 @@ Route::middleware(['aloginauth'])->group(function () {
Route::post('/{id}', [Aside\WorkOrder\AsideTicketController::class, 'update'])->name('admin.tickets.update')->summary('A端更新工单,审核,邀请同事');
Route::get('/projects/{search}', [Aside\WorkOrder\AsideTicketController::class, 'getProjects'])->name('admin.tickets.projects')->summary('A端V5V6项目列表');
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端工单聊天记录创建');
});
//服务器配置
... ...