作者 ZhengBing He

ok

@@ -8,6 +8,7 @@ use App\Http\Requests\Aside\WorkOrder\WorkOrderListRequest; @@ -8,6 +8,7 @@ use App\Http\Requests\Aside\WorkOrder\WorkOrderListRequest;
8 use App\Http\Requests\Aside\WorkOrder\WorkOrderUpdateRequest; 8 use App\Http\Requests\Aside\WorkOrder\WorkOrderUpdateRequest;
9 use App\Models\WorkOrder\WorkOrder; 9 use App\Models\WorkOrder\WorkOrder;
10 use App\Models\WorkOrder\WorkOrderLog; 10 use App\Models\WorkOrder\WorkOrderLog;
  11 +use Illuminate\Support\Facades\DB;
11 12
12 class WorkOrderController extends BaseController 13 class WorkOrderController extends BaseController
13 { 14 {
@@ -91,31 +92,64 @@ class WorkOrderController extends BaseController @@ -91,31 +92,64 @@ class WorkOrderController extends BaseController
91 } 92 }
92 93
93 /** 94 /**
94 - * A端更新工单  
95 - * 要么更新状态,要么分配工程师 95 + * A端操作工单,工程师操作的是工单日志
  96 + * - 工程师:回复工单,自动将拆分给自己的子任务改为完成
  97 + * - 工单第一对接人:
  98 + * - 邀请工程师处理工单
  99 + * - 修改工单状态
  100 + * 若全部子任务完成,则将工单状态改为完成
96 */ 101 */
97 public function update(WorkOrderUpdateRequest $request, $id) 102 public function update(WorkOrderUpdateRequest $request, $id)
98 { 103 {
99 $request->validated(); 104 $request->validated();
100 - // 更新工单状态  
101 - $workOrder = WorkOrder::find($id);  
102 - if (!$workOrder) { 105 + $log = WorkOrderLog::find($id); // 拆分的子工单
  106 + if (!$log) {
103 $this->response('工单不存在', Code::USER_MODEL_NOTFOUND_ERROE); 107 $this->response('工单不存在', Code::USER_MODEL_NOTFOUND_ERROE);
104 } 108 }
105 - if ($request->has('status'))  
106 - $workOrder->status = $request->input('status');  
107 - if ($request->has('engineer_id'))  
108 - {  
109 - try {  
110 - // 利用唯一索引去重  
111 - $log = new WorkOrderLog();  
112 - $log->manage_id = $request->input('engineer_id');  
113 - $workOrder->logs()->save($log);  
114 - }catch (\Exception $exception){}  
115 - $workOrder->engineer_id = $request->input('engineer_id'); 109 + if ($log->manage_id != $this->manage['id']) {
  110 + // 只能操作自己的工单
  111 + $this->response('没有权限操作该工单', Code::USER_PERMISSION_ERROE);
116 } 112 }
117 - $workOrder->save();  
118 - $this->response('success', Code::SUCCESS, $workOrder->toArray()); 113 + $workOrder = $log->workOrder;
  114 + $result = DB::transaction(function () use ($request, $workOrder, $log) {
  115 + if ($request->has('engineer_ids'))
  116 + {
  117 + // 有邀请工程师协同处理
  118 + foreach ($request->input('engineer_ids') as $engineer_id)
  119 + {
  120 + try {
  121 + // 利用唯一索引去重
  122 + $new_log = new WorkOrderLog();
  123 + $new_log->manage_id = $engineer_id;
  124 + $workOrder->logs()->save($new_log);
  125 + $workOrder->engineer_id = $engineer_id;
  126 + $workOrder->save();
  127 + }catch (\Exception $exception){}
  128 + }
  129 + }
  130 + if ($request->input('content'))
  131 + {
  132 + // 工程师在回复处理结果
  133 + $log->content = $request->input('content');
  134 + if ($request->input('files'))
  135 + $log->files = $request->input('files');
  136 + $log->status = WorkOrderLog::STATUS_COMPLETED;
  137 + $log->end_at = now();
  138 + $log->save();
  139 + // 如果所有的子任务都已完成, 则更新工单主表状态
  140 + $pending = $workOrder->logs()
  141 + ->where('status', '<', WorkOrderLog::STATUS_COMPLETED)
  142 + ->count();
  143 + if ($pending == 0)
  144 + {
  145 + $workOrder->status = WorkOrderLog::STATUS_COMPLETED;
  146 + $workOrder->save();
  147 + }
  148 + }
  149 + return $log;
  150 + });
  151 +
  152 + $this->response('success', Code::SUCCESS, $result->toArray());
119 } 153 }
120 154
121 } 155 }
@@ -26,18 +26,9 @@ class WorkOrderUpdateRequest extends FormRequest @@ -26,18 +26,9 @@ class WorkOrderUpdateRequest extends FormRequest
26 { 26 {
27 return [ 27 return [
28 'status' => 'nullable|in:0,1,2,3|integer', 28 'status' => 'nullable|in:0,1,2,3|integer',
29 - 'engineer_id' => 'nullable|integer', 29 + 'engineer_ids' => 'nullable|array',
  30 + 'content' => 'nullable|string',
  31 + 'files' => 'nullable|array',
30 ]; 32 ];
31 } 33 }
32 -  
33 - public function withValidator($validator)  
34 - {  
35 - $validator->after(function ($validator) {  
36 - $status = $this->input('status');  
37 - $engineerId = $this->input('engineer_id');  
38 - if (is_null($status) && is_null($engineerId)) {  
39 - $validator->errors()->add('status', 'status 和 engineer_id 不能全是空');  
40 - }  
41 - });  
42 - }  
43 } 34 }
@@ -251,7 +251,7 @@ Route::middleware(['aloginauth'])->group(function () { @@ -251,7 +251,7 @@ Route::middleware(['aloginauth'])->group(function () {
251 Route::get('/', [Aside\WorkOrder\WorkOrderController::class, 'index'])->name('admin.workorder.index')->summary('A端工程师的工单列表'); 251 Route::get('/', [Aside\WorkOrder\WorkOrderController::class, 'index'])->name('admin.workorder.index')->summary('A端工程师的工单列表');
252 Route::get('/manager', [Aside\WorkOrder\WorkOrderController::class, 'manager'])->name('admin.workorder.manager')->summary('A端管理员的工单列表'); 252 Route::get('/manager', [Aside\WorkOrder\WorkOrderController::class, 'manager'])->name('admin.workorder.manager')->summary('A端管理员的工单列表');
253 Route::get('/{id}', [Aside\WorkOrder\WorkOrderController::class, 'show'])->name('admin.workorder.show')->summary('A端工单详情'); 253 Route::get('/{id}', [Aside\WorkOrder\WorkOrderController::class, 'show'])->name('admin.workorder.show')->summary('A端工单详情');
254 - Route::put('/{id}', [Aside\WorkOrder\WorkOrderController::class, 'update'])->name('admin.workorder.update')->summary('A端更新工单'); 254 + Route::post('/{id}', [Aside\WorkOrder\WorkOrderController::class, 'update'])->name('admin.workorder.update')->summary('A端更新工单');
255 }); 255 });
256 //服务器配置 256 //服务器配置
257 Route::prefix('devops')->group(function () { 257 Route::prefix('devops')->group(function () {
@@ -275,7 +275,7 @@ Route::middleware(['bloginauth'])->group(function () { @@ -275,7 +275,7 @@ Route::middleware(['bloginauth'])->group(function () {
275 Route::get('/', [\App\Http\Controllers\Bside\WorkOrder\WorkOrderController::class, 'index'])->name('workorder.index')->summary('B端售后工单列表'); 275 Route::get('/', [\App\Http\Controllers\Bside\WorkOrder\WorkOrderController::class, 'index'])->name('workorder.index')->summary('B端售后工单列表');
276 Route::post('/', [\App\Http\Controllers\Bside\WorkOrder\WorkOrderController::class, 'store'])->name('workorder.store')->summary('B端创建工单'); 276 Route::post('/', [\App\Http\Controllers\Bside\WorkOrder\WorkOrderController::class, 'store'])->name('workorder.store')->summary('B端创建工单');
277 Route::get('/{id}', [\App\Http\Controllers\Bside\WorkOrder\WorkOrderController::class, 'show'])->name('workorder.show')->summary('B端查看工单'); 277 Route::get('/{id}', [\App\Http\Controllers\Bside\WorkOrder\WorkOrderController::class, 'show'])->name('workorder.show')->summary('B端查看工单');
278 - Route::put('/{id}', [\App\Http\Controllers\Bside\WorkOrder\WorkOrderController::class, 'update'])->name('workorder.update')->summary('B端完结工单'); 278 + Route::post('/{id}', [\App\Http\Controllers\Bside\WorkOrder\WorkOrderController::class, 'update'])->name('workorder.update')->summary('B端完结工单');
279 }); 279 });
280 280
281 //产品 281 //产品