whereIn('name', ['拦截', '信息更改', '其他', '快递异常', '错漏发', '破损'])->get(); } /** * 生成工单 * @param $params * @return array|bool[] */ public function build($params): array { foreach ($params as $param) { $type_name = $param['order_issue_type']; if ($type_name == '拦截') { $this->createInterceptWorkOrder($param); } else if ($type_name == '信息更改') { $this->createInformationChangeWorkOrder($param); } else if ($type_name == '快递异常') { $this->createExpressAbnormalWorkOrder($param); } else if ($type_name == '错漏发') { $this->createMistakeWorkOrder($param); } else if ($type_name == '破损') { $this->createDamagedWorkOrder($param); } else { $this->createDefaultWorkOrder($param); } } return ['success' => true]; } public function createAndNotification($order, $orderIssueType, $remake): WorkOrder { $user = Auth::user(); /** @var WorkOrder $workOrder */ $workOrder = WorkOrder::query()->create([ 'order_id' => $order->id, 'creator_id' => $user["id"], 'owner_id' => $order->owner_id, 'remark' => $remake, 'outer_table_name' => 'orders', 'order_issue_type_id' => $orderIssueType->id, 'uniquely_tag' => $order->code, 'status' => 1, ]); $workOrder->notification(); return $workOrder; } /** * 拦截 */ public function createInterceptWorkOrder($param): WorkOrder { $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '拦截']); $order = Order::query()->where('code', $param['order_no'])->first(); $remake = '拦截订单'; return $this->createAndNotification($order, $orderIssueType, $remake); } /** * 错漏发 */ public function createMistakeWorkOrder($param): WorkOrder { $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '错漏发']); $order = Order::query()->where('code', $param['order_no'])->first(); $remake = $param['remark'] ?? ''; return $this->createAndNotification($order, $orderIssueType, $remake); } /** * 破损 */ public function createDamagedWorkOrder($param): WorkOrder { $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '破损']); $order = Order::query()->where('code', $param['order_no'])->first(); $remake = $param['remark'] ?? ''; $workOrder = $this->createAndNotification($order, $orderIssueType, $remake); $workOrder->addPackageImages($param['packageImages']); // 外包装图片 $workOrder->addCommodityImage($param['commodityImages']); // 内物破损图片 $workOrder->addDealImages($param['dealImages']); // 交易图片 return $workOrder; } /*** * 快递异常 */ public function createExpressAbnormalWorkOrder($param): WorkOrder { $orderIssueType = OrderIssueType::query()->firstOrCreate(['name'=> '快递异常']); $order = Order::query()->where('code', $param['order_no'])->first(); $remake = $param['remark'] ?? ''; return $this->createAndNotification($order, $orderIssueType, $remake); } /*** * 信息更改 */ public function createInformationChangeWorkOrder($param): WorkOrder { $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '信息更改']); $order = Order::query()->where('code', $param['order_no'])->first(); $remake = $param['remark'] ?? ''; return $this->createAndNotification($order, $orderIssueType, $remake); } /** * 其他 */ public function createDefaultWorkOrder($param): WorkOrder { $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '其他']); $order = Order::query()->where('code', $param['order_no'])->first(); $remake = $param['remark'] ?? ''; return $this->createAndNotification($order, $orderIssueType, $remake); } /** * 快递丢件 */ public function createLoseWorkOrder($param):WorkOrder { $orderIssueType = OrderIssueType::query()->firstOrCreate(['name' => '快递丢件']); $order = Order::query()->where('code', $param['order_no'])->first(); $remake = $param['remark'] ?? ''; $workOrder = $this->createAndNotification($order, $orderIssueType, $remake); $workOrder->addPackageImages($param['packageImages']); $workOrder->addDealImages($param['dealImages']); return $workOrder; } /** * 工单审核 * @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(); } }