'订单拦截', '信息更改' => '订单收件信息修改', '其他' => '订单其他异常', '快递异常' => '订单快递异常', '错漏发' => '快递错漏发', '破损' => '快递破损', ]; /** * 获取可生成工单的问题件类型 * @return Builder[]|\Illuminate\Database\Eloquent\Collection */ public function getIssueType() { return OrderIssueType::query()->whereIn('name', ['拦截', '信息更改', '其他', '快递异常', '错漏发', '破损'])->get(); } /** * 生成工单 * @param $params * @return array|bool[] */ public function build($params): array { $types = []; $work_order_types = []; $data = Carbon::now(); $creator_id = Auth::user()['id']; $parent = WorkOrderType::query()->firstOrCreate(['name' => '订单', 'prent_id' => 0, 'level' => 1]); foreach ($params as $param) { $order = Order::query()->where('code', $param['order_no'])->first(); $type_name = $param['order_issue_type']; if (!$param['order_issue_type']) { $order_issue_type_id = 0; $work_order_type_id = 0; } else { if (!array_key_exists($type_name, $types)) { $types[$type_name] = OrderIssueType::query()->where('name', $type_name)->first(); $work_order_type_name = $this->work_type_relation[$type_name] ?? $type_name; $work_order_types[$type_name] = WorkOrderType::query()->firstOrCreate( ['name' => $work_order_type_name], ['prent_id' => $parent['id'], 'table_name' => 'orders', 'level' => 2] ); } $order_issue_type_id = $types[$type_name]['id'] ?? 0; $work_order_type_id = $work_order_types[$type_name]['id'] ?? 0; } switch ($type_name) { case '拦截': $remark = "拦截订单"; break; case '信息更改': case '其他': case '快递异常': case '错漏发': case '破损': $remark = $param['remark'] ?? ''; break; default: $work_order_type_id = 0; $remark = $param['remark'] ?? ''; $order_issue_type_id = 0; break; } $inner_params[] = [ 'order_id' => $order['id'], 'creator_id' => $creator_id, 'work_order_type_id' => $work_order_type_id ?? 0, 'owner_id' => $order['owner_id'] ?? '', 'grad' => $param['grad'] ?? 1, 'remark' => $remark, 'outer_table_name' => 'orders', 'order_issue_type_id' => $order_issue_type_id ?? 0, 'uniquely_tag' => $order['code'] ?? null, 'status' => 1, 'created_at' => $data, 'updated_at' => $data, ]; } if (isset($inner_params)) { WorkOrder::query()->insert($inner_params); $workOrders = WorkOrder::query()->with('owner','order')->whereIn('order_id',data_get($inner_params,"*.order_id"))->where('created_at',">=",$data)->get(); foreach ($workOrders as $workOrder){ $user = Auth::user(); $remark = $workOrder->remark; $ownerName = $workOrder->owner->name ?? ''; $clientCode = $workOrder->order->client_code ?? ''; $msg = $user["name"]."建立了新工单
".$ownerName.":".$clientCode."
".$remark; NotificationService::SingleRegister($msg,$clientCode,"订单管理-问题件"); } return ['success' => true]; } return ['success' => false, 'message' => '参数异常']; } /** * 工单审核 * @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()->with(['type', 'creator', 'order' => function ($query) { /** @var $query Builder */ $query->with('packages', 'issue', 'logistic'); }, 'reviewer'])->whereIn('id', [$wordOrder['id']])->get(); $this->tags($workOrders); return ['success' => true, 'data' => $workOrders->first()]; } /** * 批量审核工单 * @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()->with(['type', 'creator', 'order' => function ($query) { /** @var $query Builder */ $query->with('packages', 'issue', 'logistic'); }, 'reviewer'])->whereIn('id', $ids)->get(); $this->tags($wordOrders); 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' => '创建问题件失败']; return app('OrderIssueService')->buildOrderIssue($inner_params); } /** * 按 指定工单类型 和 唯一标识 确认工单是否存在 * @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(); } }