with(['order']) ->where('logistic_number', $logistic_number) ->first(); //这种类型的单,不需要再更新状态 if ($orderPackage->exception_status === '单号异常' || $orderPackage->exception_status === '无法获取路由') { return $data; } /** @var \Carbon\Carbon $sent_at */ $sent_at = $orderPackage->sent_at; /** @var \Carbon\Carbon $issue_time 订单下发时间 */ $issue_time = $orderPackage->order->created_at; /**执行该方法时,默认没有异常, *1. 之前有异常的件, * 1.1 新的状态是无异常的可以更新为正常 * 1.2 新的状态是异常的可以更新为对应异常 *2. 之前无异常 * 2.1 新的状态无异常更新为无异常 * 2.2 新的状态异常更新为对应异常 */ $data['exception_status'] = ''; //当天的16:30 $transfer_status = $data['transfer_status'] ?? []; if (empty($sent_at)) {//没复核 if (empty($transfer_status)) {//没有路由信息 //延迟发货 $issue_time_clone = deep_copy($issue_time); if ($issue_time->gt($issue_time_clone->startOfDay()->addHours(16)->addMinutes(30))) {//下午16:30的单 $issue_time_clone = deep_copy($issue_time); if ($issue_time_clone->addDay()->endOfDay()->lt(now())) {//超过第二天的24时 $data['exception_status'] = '延迟发货'; $data['is_delay_deliver'] = true; } } else { if ($issue_time_clone->endOfDay()->lt(now())) {//超过当天的24时 $data['exception_status'] = '延迟发货'; $data['is_delay_deliver'] = true; } } } } else {//复核过 if (empty($transfer_status)) {//没有路由信息 /** @var Carbon $temp_time */ $temp_time = $orderPackage->weighed_at ?: $orderPackage->sent_at;//揽收异常以称重时间优先 没有称重以发出时间 if (now()->gt($temp_time->addDay()->startOfDay()->addHours(6))) {//当前时间大于复核时间的第二天6点 if (empty($orderPackage->weighed_at)) {//没有称重 $data['exception_status'] = '疑似库内丢件'; } else {//有称重 $data['exception_status'] = '揽件异常'; } } } else {//有路由信息 $transfer_status = $this->sortTransferStatusByAcceptTimeDESC($transfer_status); $last_transfer_accept_time = $transfer_status[0]['accept_time']; $last_remark = $this->getLastRemark($transfer_status[0]); if (count($transfer_status) < 3) {//三条以内的不管地区 时间限制为24h if (Carbon::parse($last_transfer_accept_time)->diffInHours(now()) > 24) { $data['exception_status'] = '在途异常'; } } else { //根据地区获取超时时间限制 $SHORT_RESPONSE_HOURS = (function ($province) { switch ($province) { case '浙江省': case '江苏省': case '上海': case '安徽省': return 24; case '北京': case '天津': case '江西省': case '湖北省': case '湖南省': case '广东省': case '福建省': case '山东省': case '河北省': case '河南省': case '山西省': case '四川省': case '陕西省': case '重庆': case '广西壮族自治区': case '贵州省': case '云南省': case '海南省': case '吉林省': case '黑龙江省': case '辽宁省': return 72; case '青海省': case '宁夏回族自治区': case '甘肃省': case '内蒙古自治区': case '新疆维吾尔自治区': case '西藏自治区': return 120; default: return 24; } })($orderPackage->order->province); if (Carbon::parse($last_transfer_accept_time)->diffInHours(now()) > $SHORT_RESPONSE_HOURS) { $data['exception_status'] = '在途异常'; } } //在途异常修正为派送异常 if ((($data['exception_status'] ?? '') === '在途异常') && (($data['status'] ?? '') === '派送中')) { $data['exception_status'] = '派送异常'; } //内容中有一下信息的,视为签收 if (Str::contains($last_remark, ['代收', '快递柜', '驿站', '自提柜', '丰巢', '快递小屋', '合作点', '快递超市', '签收'])) { $data = $this->setStatus已签收($data, $last_transfer_accept_time); } } } //如果复核时间>前一天的23.59,则不添加异常信息 if ((!empty($sent_at)) && ($sent_at->gt(now()->subDay()->startOfDay()->addHours(23)->addMinutes(59))) && isset($data['exception_status'])) { unset($data['exception_status']); } //邮政待揽收状态不是在途 $logistic_id = $orderPackage->order->logistic_id ?? null; //判断承运商是否为邮政 $data = $this->邮政实际待揽收由在途改为已复核($logistic_id, $transfer_status, $data); return $data; } /** * 按照accept_time倒序排序 * @param $transfer_status * @return mixed */ private function sortTransferStatusByAcceptTimeDESC($transfer_status) { usort($transfer_status, function ($a, $b) { if ($a['accept_time'] === $b['accept_time']) { return 0; } return ($a['accept_time'] > $b['accept_time']) ? -1 : 1; }); return $transfer_status; } /** * 获取最新一条路由信息的remark * @param $transfer_status * @return mixed */ private function getLastRemark($transfer_status) { //部分接口的remark在accept_address字段中 return empty(!$transfer_status['remark']) ? $transfer_status['remark'] : $transfer_status['accept_address']; } /** * @param array $data * @param $last_transfer_accept_time * @return array */ private function setStatus已签收(array $data, $last_transfer_accept_time): array { $data['exception_status'] = ''; $data['status'] = '已签收'; $data['received_at'] = $last_transfer_accept_time; return $data; } /** * @param $logistic_id * @param $transfer_status * @param array $data * @return array */ private function 邮政实际待揽收由在途改为已复核($logistic_id, $transfer_status, array $data): array { if ((!empty($logistic_id)) && ($logistic_id === 6 || $logistic_id === 88)) { if (!empty($transfer_status)) { $this->sortTransferStatusByAcceptTimeDESC($transfer_status); $last_remark = $this->getLastRemark($transfer_status[0]); if (Str::contains($last_remark, ['等待揽收', '商品已下单'])) { $data['status'] = '已复核'; } } } return $data; } }