|
|
@@ -23,15 +23,14 @@ class OrderPackageReceivedSyncService
|
|
|
|
|
|
/**
|
|
|
* 同步快递信息
|
|
|
- * 1 如果当前时间大于初始化时间 每日执行一次,更新order_packages中创建时间大于初始化时间,没有异常,用户未收货的全部订单的快递路由状态
|
|
|
- * 2 如果当前时间小于等于初始化时间,执行初始化脚本,将数据库中全部小于等于初始化时间的数据更新
|
|
|
- * @throws Exception
|
|
|
+ * @param bool $is_to_init 是否为初始化数据状态 初始化同步一个月的 正常执行为15天
|
|
|
+ * @param array $logistic_numbers 指定更新的单号
|
|
|
*/
|
|
|
public function syncLogisticRoute($is_to_init = false, $logistic_numbers = [])
|
|
|
{
|
|
|
ini_set('max_execution_time', 2 * 60 * 60);
|
|
|
ini_set('memory_limit', '1024M');
|
|
|
- // LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法", '');
|
|
|
+ //没有指定单号
|
|
|
if (empty($logistic_numbers)) {
|
|
|
$query = OrderPackage::query()
|
|
|
->select(['logistic_number', 'order_id', 'id'])
|
|
|
@@ -40,14 +39,14 @@ class OrderPackageReceivedSyncService
|
|
|
}]);
|
|
|
if ($is_to_init) {//当前时间小于等于初始化时间
|
|
|
$initDate = Carbon::parse(config('api_logistic.init_date'));
|
|
|
- //初始化查询一个月的数据,exception为否
|
|
|
+ //初始化查询一个月的数据
|
|
|
$query = $query->where('created_at', '>=', $initDate)
|
|
|
->whereNull('received_at');
|
|
|
} else {//查询20天以内的数据
|
|
|
$query = $query->where('created_at', '>=', now()->subDays(config('api_logistic.querying_days'))->startOfDay())
|
|
|
->whereNull('received_at');
|
|
|
}
|
|
|
- } else {
|
|
|
+ } else {//指定了单号
|
|
|
$query = OrderPackage::query()
|
|
|
->select(['logistic_number', 'order_id', 'id'])
|
|
|
->with(['order' => function ($query) {
|
|
|
@@ -55,41 +54,34 @@ class OrderPackageReceivedSyncService
|
|
|
}])
|
|
|
->whereIn('logistic_number', $logistic_numbers);
|
|
|
}
|
|
|
-
|
|
|
+ //分块执行
|
|
|
$query->chunkById(1000, function ($orderPackages) {
|
|
|
- // LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法", json_encode(data_get($orderPackages,'*.logistic_number')));
|
|
|
+ //按照承运商分组
|
|
|
$logisticNumbers = $this->buildData($orderPackages);
|
|
|
- //sf
|
|
|
+ //更新顺丰系列
|
|
|
if (array_key_exists('SF', $logisticNumbers)) {
|
|
|
$SFLogisticNumbers = $logisticNumbers['SF'];
|
|
|
- // LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法-SF", json_encode($SFLogisticNumbers));
|
|
|
foreach ($SFLogisticNumbers as $logisticNumber) {
|
|
|
- // LogService::log(OrderPackageReceivedSyncService::class, "同步SF快递单号", $logisticNumber);
|
|
|
LogisticSFSync::dispatch($logisticNumber);
|
|
|
}
|
|
|
}
|
|
|
//更新中通
|
|
|
if (array_key_exists('ZTO', $logisticNumbers)) {
|
|
|
$ZTOLogisticNumbers = $logisticNumbers['ZTO'];
|
|
|
- // LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法-ZTO", json_encode($ZTOLogisticNumbers));
|
|
|
foreach ($ZTOLogisticNumbers as $logisticNumber) {
|
|
|
- // LogService::log(OrderPackageReceivedSyncService::class, "同步ZTO快递单号", $logisticNumber);
|
|
|
LogisticZopSync::dispatch($logisticNumber);
|
|
|
}
|
|
|
}
|
|
|
//更新韵达
|
|
|
if (array_key_exists('YUNDA', $logisticNumbers)) {
|
|
|
$YDLogisticNumbers = $logisticNumbers['YUNDA'];
|
|
|
- // LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法-YUNDA", json_encode($YDLogisticNumbers));
|
|
|
foreach ($YDLogisticNumbers as $logistic_number) {
|
|
|
- // LogService::log(OrderPackageReceivedSyncService::class, "同步YUNDA快递单号", $logisticNumber);
|
|
|
LogisticYDSync::dispatch($logistic_number);
|
|
|
}
|
|
|
}
|
|
|
//更新圆通
|
|
|
if (array_key_exists('YTO', $logisticNumbers)) {
|
|
|
$YTOLogisticNumbers = $logisticNumbers['YTO'];
|
|
|
- // LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法-YTO", json_encode($YTOLogisticNumbers));
|
|
|
foreach ($YTOLogisticNumbers as $logistic_number) {
|
|
|
if ($logistic_number) LogisticYTOSync::dispatch($logistic_number);
|
|
|
}
|
|
|
@@ -97,8 +89,13 @@ class OrderPackageReceivedSyncService
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- public function syncLogisticRouteByAliJiSu($logistic_numbers = [])
|
|
|
+ /**
|
|
|
+ * 阿里云同步快递信息
|
|
|
+ * @param array $logistic_numbers 指定单号同步
|
|
|
+ */
|
|
|
+ public function syncLogisticRouteByAliJiSu(array $logistic_numbers = [])
|
|
|
{
|
|
|
+ //没有指定单号
|
|
|
if (empty($logistic_numbers)) {
|
|
|
ini_set('max_execution_time', 2 * 60 * 60);
|
|
|
$query = OrderPackage::query()
|
|
|
@@ -110,20 +107,17 @@ class OrderPackageReceivedSyncService
|
|
|
});
|
|
|
$query = $query->where('created_at', '>=', now()->subDays(config('api_logistic.querying_days')))
|
|
|
->whereNull('received_at');
|
|
|
- } else {
|
|
|
+ } else {//指定了单号
|
|
|
$query = OrderPackage::query()
|
|
|
->select(['logistic_number', 'order_id', 'id'])
|
|
|
->whereIn('logistic_number', $logistic_numbers);
|
|
|
}
|
|
|
|
|
|
$query->chunkById(200, function ($orderPackages) {
|
|
|
- // LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法-阿里公用接口", json_encode($orderPackages));
|
|
|
foreach ($orderPackages as $orderPackage) {
|
|
|
if ($orderPackage && $orderPackage->logistic_number) LogisticAliJiSuSync::dispatch($orderPackage->logistic_number);
|
|
|
}
|
|
|
});
|
|
|
- //TODO 暂时不同步京东
|
|
|
-// $this->syncLogisticRouteJD();
|
|
|
}
|
|
|
|
|
|
public function syncLogisticRouteJD()
|
|
|
@@ -139,59 +133,12 @@ class OrderPackageReceivedSyncService
|
|
|
$query = $query->where('created_at', '>=', now()->subDays(config('api_logistic.querying_days')))
|
|
|
->whereNull('received_at')->where('logistic_number', 'like', 'JD%');
|
|
|
$query->chunkById(200, function ($orderPackages) {
|
|
|
- // LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法-JD", json_encode($orderPackages));
|
|
|
foreach ($orderPackages as $orderPackage) {
|
|
|
if ($orderPackage && $orderPackage->logistic_number) LogisticAliJiSuSync::dispatch($orderPackage->logistic_number);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 根据传递的承运商与快递单号更新快递信息
|
|
|
- * @param array $logisticNumbers 快递单号
|
|
|
- * example: ['SF' => ['SF1038651915891', 'SF1038651413847', 'SF1038611050071'],'ZT'=>['75424148714142','548464120822', '75424147834290']....]
|
|
|
- * @throws Exception 快递接口调用或者返回的信息有误,无法更新指定的快递路由信息
|
|
|
- */
|
|
|
- public function syncLogisticRouteApi(array $logisticNumbers)
|
|
|
- {
|
|
|
- $this->update($this->getLogisticRoutes($logisticNumbers));
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取快件揽收信息
|
|
|
- * @param array $request [
|
|
|
- * 'SF' => ['SF1038651915891', 'SF1038651413847', 'SF1038611050071'],
|
|
|
- * 'ZT'=>['75424148714142','548464120822', '75424147834290']
|
|
|
- * ]
|
|
|
- * @return array
|
|
|
- * @throws Exception
|
|
|
- */
|
|
|
- public function getLogisticRoutes(array $request): array
|
|
|
- {
|
|
|
- $this->logisticSFService = new LogisticSFService();
|
|
|
- $resultSF = [];
|
|
|
- $resultYD = [];
|
|
|
- $resultYT = [];
|
|
|
- $resultOther = [];
|
|
|
- foreach ($request as $key => $logisticNums) {
|
|
|
- switch ($key) {
|
|
|
- case "SF":
|
|
|
- $resultSF = $this->logisticSFService->get($logisticNums);
|
|
|
- break;
|
|
|
- case "YD":
|
|
|
- $resultYD = [];
|
|
|
- break;
|
|
|
- case "YT":
|
|
|
- $resultYT = [];
|
|
|
- break;
|
|
|
- default:
|
|
|
- $resultOther = [];
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- return array_merge($resultSF, $resultYD, $resultYT, $resultOther);
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 根据快递单号更新状态
|
|
|
* @param array $logisticResponses
|
|
|
@@ -211,11 +158,15 @@ class OrderPackageReceivedSyncService
|
|
|
unset($logisticResponse['status']);
|
|
|
}
|
|
|
}
|
|
|
+ //设置异常信息
|
|
|
$logisticResponse = $this->setExceptionStatus($logisticResponse);
|
|
|
+ //标记为单号异常
|
|
|
if (Str::contains($orderPackage->logistic_number, ['SO', '#', '-'])) {
|
|
|
$logisticResponse['exception_status'] = '单号异常';
|
|
|
}
|
|
|
- if (((!isset($logisticResponse['status'])) || ($logisticResponse['status'] === '')) && $orderPackage->status === '') {
|
|
|
+ //没有状态的数据赋予初始状态
|
|
|
+ if (((!isset($logisticResponse['status'])) || ($logisticResponse['status'] === '')) &&
|
|
|
+ $orderPackage->status === '') {
|
|
|
$logisticResponse['status'] = '生成订单';
|
|
|
|
|
|
if (!empty($orderPackage->sent_at)) {
|
|
|
@@ -225,7 +176,6 @@ class OrderPackageReceivedSyncService
|
|
|
$logisticResponse['status'] = '已称重';
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
if (isset($logisticResponse['exception_status'])) $logisticResponse['exception_status'] = OrderPackage::switchExceptionStatus($logisticResponse['exception_status']);
|
|
|
if (isset($logisticResponse['status'])) $logisticResponse['status'] = OrderPackage::switchStatus($logisticResponse['status']);
|
|
|
if (isset($logisticResponse['routes_length'])) unset($logisticResponse['routes_length']);
|
|
|
@@ -248,7 +198,6 @@ class OrderPackageReceivedSyncService
|
|
|
try {
|
|
|
$logisticCode = $orderPackage->order->logistic->code;
|
|
|
} catch (Exception $e) {
|
|
|
- // LogService::log(OrderPackageReceivedSyncService::class, "快递同步按照承运商分组异常", json_encode($orderPackage??[]));
|
|
|
continue;
|
|
|
}
|
|
|
$key = config('api_logistic.logistic.' . $logisticCode);
|