| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- <?php
- namespace App\Traits;
- use App\OrderPackage;
- use Illuminate\Support\Carbon;
- use Illuminate\Support\Str;
- use function DeepCopy\deep_copy;
- trait LogisticSyncTrait
- {
- /**
- * 设置 status 与 exception_status
- * @param array $data
- * @return array
- */
- public function setExceptionStatus(array $data): array
- {
- //获取快递单号
- $logistic_number = $data['logistic_number'];
- /** @var OrderPackage $orderPackage */
- $orderPackage = OrderPackage::query()
- ->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;
- /**执行该方法时,默认没有异常,
- *1. 之前有异常的件,
- * 1.1 新的状态是无异常的可以更新为正常
- * 1.2 新的状态是异常的可以更新为对应异常
- *2. 之前无异常
- * 2.1 新的状态无异常更新为无异常
- * 2.2 新的状态异常更新为对应异常
- */
- $data['exception_status'] = '';
- $created_at = Carbon::parse($orderPackage->created_at);
- //当天的16:30
- $transfer_status = $data['transfer_status'] ?? [];
- if (empty($sent_at)) {//没复核
- if (empty($transfer_status)) {//没有路由信息
- //延迟发货
- $created_at_clone = deep_copy($created_at);
- if ($created_at->gt($created_at_clone->startOfDay()->addHours(16)->addMinutes(30))) {//下午16.30的单
- $created_at_clone = deep_copy($created_at);
- if ($created_at_clone->addDay()->endOfDay()->lt(now())) {//超过第二天的24时
- $created_at_clone = deep_copy($created_at);
- $data['exception_status'] = '延迟发货';
- $data['is_delay_deliver'] = true;
- }
- } else {
- if ($created_at_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);
- }
- }
- }
- //如果复核时间>前一天的18.00,则不添加异常信息
- if ((!empty($sent_at)) &&
- ($sent_at->gt(now()->subDay()->startOfDay()->addHours(18))) &&
- 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);
- if (Str::contains($last_remark, ['等待揽收', '商品已下单'])) {
- $data['status'] = '已复核';
- }
- }
- }
- return $data;
- }
- }
|