152 lines
4.6 KiB
PHP
Executable File
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;
|
|
}
|
|
|
|
} |