caipan_shop_admin/app/traits/order/ExpressLogTrait.php

152 lines
4.6 KiB
PHP
Executable File

<?php
namespace app\traits\order;
use app\exception\RepositoryException;
use app\model\OrderExpress;
use app\repository\OrderRepository;
use app\service\Kd100;
use think\Collection;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use think\Model;
/**
* 订单快递配送日志记录
*
* Trait ExpressLogTrait
* @package app\traits\order
*/
trait ExpressLogTrait
{
/**
* 查询订单快递配送记录
*
* @param string $orderCoding 订单编号
* @return Collection
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function getExpressLogsByOrderCoding(string $orderCoding = ''): Collection
{
return OrderExpress::where('coding', $orderCoding)->select();
}
/**
* 根据订单物流单号查询配送记录
* @param string $orderCoding 订单编号
* @param string $com 快递公司编号,一律小写
* @param string $nu 快递单号
* @return array|Model|null
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function findExpressLogByNu(string $orderCoding, string $com, string $nu)
{
$whereMap = ['coding' => $orderCoding, 'nu' => $nu, 'com' => $com];
return OrderExpress::where($whereMap)->find();
}
/**
* 写入订单物流配送记录
*
* @param string $orderCoding 订单编号
* @param string $com 快递公司编号,一律小写
* @param string $nu 快递单号
* @param array $data 快递100查询返回的数据
* @throws RepositoryException
*/
public function setExpressLog(string $orderCoding, string $com, string $nu, array $data)
{
try {
if (empty($data)) {
throw new RepositoryException('快递配送明细查询失败');
}
$state = 0;
$content = '';
if (isset($data['result']) && $data['result'] === false) {
throw new RepositoryException($data['message'] ?? '快递配送明细查询失败');
} else {
$state = $data['state'] ?? 0;
$content = json_encode($data['data'] ?? [], JSON_UNESCAPED_UNICODE);
}
$expr = $this->findExpressLogByNu($orderCoding, $com, $nu);
if (empty($expr)) {
OrderExpress::create([
'coding' => $orderCoding,
'nu' => $nu,
'com' => $com,
'state' => $state,
'content' => $content,
'created_at' => date('Y-m-d H:i:s'),
]);
} else {
OrderExpress::updateById($expr['id'], [
'state' => $state,
'content' => $content,
'updated_at' => date('Y-m-d H:i:s'),
]);
}
} catch (\Exception $e) {
OrderRepository::log('订单快递配送记录写入失败', $e, 'error', 'order');
throw new RepositoryException('订单快递配送记录写入失败');
} catch (RepositoryException $e) {
throw $e;
}
}
/**
* 查询订单快递配送记录,并写入
*
* @param string $orderCoding
* @param string $com
* @param string $nu
* @return array
*/
public function handleOrderExpressLog(string $orderCoding, string $com, string $nu): array
{
$com = strtolower($com);
$list = [];
$list['com'] = $com;
$list['nu'] = $nu;
try {
$expressInfo = Kd100::query($com, $nu, true);
if ($expressInfo) {
$this->setExpressLog($orderCoding, $com, $nu, $expressInfo);
if (isset($expressInfo['result']) && $expressInfo['result'] === false) {
$list['status'] = $expressInfo['returnCode'];
$list['state'] = 0;
$list['state_desc'] = $expressInfo['message'];
$list['data'] = [];
} else {
$list['status'] = 200;
$list['state'] = $expressInfo['state'];
$list['state_desc'] = Kd100::state()[$expressInfo['state']] ?? '';
$list['data'] = $expressInfo['data'] ?? [];
}
}
unset($expressInfo);
} catch (RepositoryException | \Exception $e) {
}
return $list;
}
}