logService = app(WorkOrderLogService::class); $this->imageService = app(WorkOrderImageService::class); $this->commoditiesService = app(WorkOrderCommoditiesService::class); $this->detailService = app(WorkOrderDetailService::class); $this->issueTypeService = app(OrderIssueTypeService::class); $this->orderService = app(OrderService::class); } /** * 获取可生成工单的问题件类型 * @return Builder[]|Collection */ public function getIssueType() { if (Gate::allows('订单管理-工单处理-客服编辑')){ return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '其他', '快递异常', '错漏发', '破损', '快递丢件'])->get(); } else if (Gate::allows('订单管理-工单处理-货主编辑')) { return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '其他', '快递异常', '错漏发', '破损',])->get(); } else if (Gate::allows('订单管理-工单处理-承运商编辑')) { return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '破损', '快递异常'])->get(); } return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '其他', '快递异常', '错漏发', '破损', '快递丢件'])->get(); } public function createOrResetWorkOrder($order, $issueType, $remark) { $user = Auth::user(); $workOrder = WorkOrder::query()->where('order_id', $order->id)->orderByDesc('created_at')->first(); if ($workOrder) { $this->detailService->undoneTagsByWorkOrder($workOrder); $workOrder->update([ 'remark' => $remark, 'order_issue_type_id' => $issueType->id, 'creator_id' => $user['id'] ?? '', 'status' => 0, 'work_order_status' => 1, ]); return $workOrder; } return WorkOrder::query()->create([ 'order_id' => $order->id, 'logistic_id' => $order->logistic_id ?? '', 'owner_id' => $order->owner_id ?? '', 'creator_id' => $user['id'] ?? '', 'remark' => $remark, 'outer_table_name' => 'orders', 'order_issue_type_id' => $issueType->id, 'uniquely_tag' => $order->code, 'status' => 0, 'work_order_status' => 1, ]); } public function createAndNotification($order, $orderIssueType, $remark): WorkOrder { /** @var WorkOrder $workOrder */ $workOrder = $this->createOrResetWorkOrder($order, $orderIssueType, $remark); $workOrder->notification(); return $workOrder; } /** * @param WorkOrder $workOrder * @param WorkOrderDetail $detail */ public function end(WorkOrder $workOrder, WorkOrderDetail $detail) { $this->detailService->endDetail($detail); $this->logService->createLog($detail,'完结', '完结工单'); $workOrder->clearWorkOrderStatus(); $workOrder->changeStatus('完成'); } /** * @param WorkOrder $workOrder * @param WorkOrderDetail $detail */ public function logisticEnd(WorkOrder $workOrder, WorkOrderDetail $detail) { $this->logService->createLog($detail,'完结', '承运商完结工单'); $this->detailService->endDetail($detail); $workOrder->clearWorkOrderStatus(); $workOrder->changeStatus('完成'); } public function find($id): WorkOrder { /** @var WorkOrder $item */ $item = WorkOrder::query()->where('id', $id)->first(); return $item; } public function getDefaultWith($id){ return WorkOrder::query()->defaultWith()->find($id); } /** * 工单审核 * @param $wordOrder * @return array */ public function review($wordOrder): array { $wordOrder->update(['reviewer_id' => Auth::user()['id'], 'review_at' => Carbon::now(), 'status' => '2',]); $workOrders = WorkOrder::query()->defaultWith()->whereIn('id', [$wordOrder['id']])->get(); $this->tags($workOrders); return ['success' => true, 'data' => $workOrders->first()]; } /** * 终审 * @param WorkOrder $workOrder * @param WorkOrderDetail $detail * @param $params */ public function baoShiReview(WorkOrder $workOrder,WorkOrderDetail $detail, $params) { $user = Auth::user(); $workOrder->update(['reviewer_id' => $user['id'], 'review_at' => Carbon::now(), 'status' => '5']); $this->commoditiesService->updateWorkOrderCommoditiesByJsonArray($detail, $params); $this->logService->createLog($detail,'终审', '终审完成'); $this->detailService->endDetail($detail); } /** * 批量审核工单 * @param $workOrders * @return array */ public function batchReview($workOrders): array { $ids = $workOrders->map(function ($item) { return $item->id; })->toArray(); WorkOrder::query()->whereIn('id', $ids)->update(['review_at' => Carbon::now(), 'reviewer_id' => Auth::user()['id'], 'status' => '2']); $wordOrders = WorkOrder::query()->defaultWith()->whereIn('id', $ids)->get(); return ['success' => true, 'data' => $wordOrders]; } /** * 生成问题件 * @param $work_orders * @return array */ public function buildOrderIssue($work_orders): array { foreach ($work_orders as $work_order) { $inner_params[] = [ 'order_id' => $work_order->order_id, 'order_issue_type_id' => $work_order->order_issue_type_id, 'result_explain' => $work_order->remark, ]; } if (!isset($inner_params)) return ['success' => false, 'message' => '创建问题件失败']; try { return app('OrderIssueService')->buildOrderIssue($inner_params); } catch (\Exception $e) { return ['success' => false, 'message' => '刷新页面后重试']; } } /** * 按 指定工单类型 和 唯一标识 确认工单是否存在 * @param $work_order_type_id * @param $uniquely_tag * @return array|false[] */ public function exists($work_order_type_id, $uniquely_tag): array { $query = WorkOrder::query()->where('work_order_type_id', $work_order_type_id); if (is_array($uniquely_tag)) $query->whereIn('uniquely_tag', $uniquely_tag); if (is_string($uniquely_tag)) $query->where('uniquely_tag', $uniquely_tag); $items = $query->get(); if (count($items) > 0) { $exists_nos = $items->map(function ($item) { return $item->uniquely_tag; }); return ['success' => true, 'data' => $exists_nos]; } return ['success' => false]; } /** * 标记已有 问题件 的工单 * @param $workOrders */ public function tags(&$workOrders) { $order_ids = $workOrders->map(function ($item) { return $item->order_id; }); $order_issues = OrderIssue::query()->whereIn('order_id', $order_ids)->get(); foreach ($order_issues as $order_issue) { $codes[$order_issue->order_id] = true; } if (!isset($codes)) return; foreach ($workOrders as &$workOrder) { if (array_key_exists($workOrder->order_id, $codes)) $workOrder->is_issue_order = true; else $workOrder->is_issue_order = false; } } /** * 判断是否拦截工单 * @param $logistic_number * @return bool */ public function isIntercept($logistic_number): bool { $package_query = OrderPackage::query()->select('order_id')->where('logistic_number', $logistic_number); $order_issue_query = OrderIssueType::query()->select('id')->where('name', '拦截'); return WorkOrder::query()->whereIn('order_id', $package_query)->whereIn('order_issue_type_id', $order_issue_query)->exists(); } /** * 标记工单 * @param $orders */ public function tagWorkOrder(&$orders) { $orderNos = data_get($orders, '*.orderno'); $workOrders = WorkOrder::query()->with('order')->whereIn('order_id', function ($query) use ($orderNos) { $query->from('orders')->select('id')->whereIn('code', $orderNos); })->get(); $tags = []; $workOrders->each(function ($workOrder) use (&$tags) { $order_code = $workOrder->order->code ?? null; if ($order_code) $tags[$order_code] = true; }); foreach ($orders as &$order) { if (array_key_exists($order->orderno, $tags)) $order->is_work_order = true; else $order->is_work_order = false; } } /** * 校验工单是否存在c * @param $nos * @return mixed */ public function checkWorkOrder($nos) { return WorkOrder::query()->defaultWith()->whereIn('order_id', function ($query) use ($nos) { $query->from('orders')->selectRaw('id'); if (is_array($nos)) $query->whereIn('code', $nos); else { $query->where('code', $nos); } })->get(); } }