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