crmeb v4.4.2 修复前端小程序物流查询有部分查询不出来的问题

在后台一号通里面购买物流查询接口
后台发货的时候选择物流公司和单号,但是前端小程序上却没有显示实时物流
app/services/shipping/ExpressServices.php

<?php
CRMEB二次开发QQ: 
namespace app\services\shipping;
use app\dao\shipping\ExpressDao;
use app\services\BaseServices;
use app\services\serve\ServeServices;
use crmeb\exceptions\AdminException;
use crmeb\services\CacheService;
use crmeb\services\ExpressService;
use crmeb\services\FormBuilder as Form;

/**
 * 物流数据
 * Class ExpressServices
 * @package app\services\shipping
 * @method save(array $data) 保存数据
 * @method get(int $id, ?array $field = []) 获取数据
 * @method delete(int $id, ?string $key = null) 删除数据
 * @method update($id, array $data, ?string $key = null) 修改数据
 */
class ExpressServices extends BaseServices
{
    public $_cacheKey = "plat_express_list";

    //物流查询物流公司code
    public $express_code = [
        'yunda' => 'yunda',
        'yundakuaiyun' => 'yunda56',
        'ems' => 'EMS',
        'youzhengguonei' => 'chinapost',
        'huitongkuaidi' => 'HTKY',
        'baishiwuliu' => 'BSKY',
        'shentong' => 'STO',
        'jd' => 'JD',
        'zhongtong' => 'ZTO',
        'zhongtongkuaiyun' => 'ZTO56',
    ];

    /**
     * 构造方法
     * ExpressServices constructor.
     * @param ExpressDao $dao
     */
    public function __construct(ExpressDao $dao)
    {
        $this->dao = $dao;
    }

    /**
     * 获取物流信息
     * @param array $where
     * @return array
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public function getExpressList(array $where)
    {
        [$page, $limit] = $this->getPageValue();
        $list = $this->dao->getExpressList($where, '*', $page, $limit);
        $count = $this->dao->count($where);
        return compact('list', 'count');
    }

    public function apiExpressList()
    {
        return $this->dao->getExpressList([], '*', 0, 0);
    }

    /**
     * 物流表单
     * @param array $formData
     * @return mixed
     * @throws \FormBuilder\Exception\FormBuilderException
     */
    public function createExpressForm(array $formData = [])
    {
        if (isset($formData['partner_id']) && $formData['partner_id'] == 1) $field[] = Form::input('account', '月结账号', $formData['account'] ?? '');
        if (isset($formData['partner_key']) && $formData['partner_key'] == 1) $field[] = Form::input('key', '月结密码', $formData['key'] ?? '');
        if (isset($formData['net']) && $formData['net'] == 1) $field[] = Form::input('net_name', '取件网点', $formData['net_name'] ?? '');
        $field[] = Form::number('sort', '排序', (int)($formData['sort'] ?? 0))->precision(0);
        $field[] = Form::radio('is_show', '是否启用', $formData['is_show'] ?? 1)->options([['value' => 0, 'label' => '隐藏'], ['value' => 1, 'label' => '启用']]);
        return $field;
    }

    /**
     * 创建物流信息表单获取
     * @return array
     * @throws \FormBuilder\Exception\FormBuilderException
     */
    public function createForm()
    {
        return create_form('添加物流公司', $this->createExpressForm(), $this->url('/freight/express'));
    }

    /**
     * 修改物流信息表单获取
     * @param int $id
     * @return array
     * @throws \FormBuilder\Exception\FormBuilderException
     */
    public function updateForm(int $id)
    {
        $express = $this->dao->get($id);
        if (!$express) {
            throw new AdminException('查询数据失败,无法修改');
        }
        return create_form('编辑物流公司', $this->createExpressForm($express->toArray()), $this->url('/freight/express/' . $id), 'PUT');
    }

    /**
     * 平台获取快递
     * @return array|mixed
     */
    public function getPlatExpress()
    {
        /** @var ServeServices $expressService */
        $expressService = app()->make(ServeServices::class);
        /** @var CacheService $cacheService */
        $cacheService = app()->make(CacheService::class);
        $data = [];
        if ($list = $cacheService::get($this->_cacheKey)) {
            $data = json_decode($list, true);
        } else {
            $list = $expressService->express()->express(0, 0, 1000);
            if (isset($list['data'])) {
                $cacheService->set($this->_cacheKey, json_encode($list['data']), 3600);
                $data = $list['data'];
            }
        }
        return $data;
    }

    /**
     * 获取物流信息组合成新的数组返回
     * @param array $where
     * @return array
     */
    public function express(array $where = [], string $k = 'id')
    {
        $list = $this->expressList($where);
        $data = [];
        if ($list) {
            foreach ($list as $k => $v) {
                $data[$k]['id'] = $v['id'];
                $data[$k]['value'] = $v['name'];
                $data[$k]['code'] = $v['code'];
            }
        }
        return $data;
    }

    /**
     * 获取物流信息组合成新的数组返回
     * @param array $where
     * @return array
     */
    public function expressSelectForm(array $where = [])
    {
        $list = $this->expressList();
        //$list = $this->dao->getExpress($where, 'name', 'id');
        $data = [];
        foreach ($list as $key => $value) {
            $data[] = ['label' => $value['name'], 'value' => $value['id']];
        }
        return $data;
    }

    public function expressList($where = [])
    {
        if (empty($where)) $where = ['is_show' => 1];
        return $this->dao->getExpressList($where, 'id,name,code,partner_id,partner_key,net,account,key,net_name', 0, 0);
    }

    /**
     * 物流公司查询
     * @param string $cacheName
     * @param string $expressNum
     * @param string|null $com
     * @return array
     */
    public function query(string $cacheName, string $expressNum, string $com = null)
    {
        $resultData = CacheService::get($cacheName, null);
        if ($resultData === null || !is_array($resultData)) {
            $data = [];
            $com = $this->express_code[$com] ?? '';
            $cacheTime = 0;
            switch ((int)sys_config('logistics_type')) {
                case 1:
                    /** @var ServeServices $services */
                    $services = app()->make(ServeServices::class);
                    $result = $services->express()->query($expressNum, $com);
                    if (isset($result['ischeck']) && $result['ischeck'] == 1) {
                        $cacheTime = 0;
                    } else {
                        $cacheTime = 1800;
                    }
                    foreach ($result['content'] ?? [] as $item) {
                        $data[] = ['time' => $item['time'], 'status' => $item['status']];
                    }
                    break;
                case 2:
                    $result = ExpressService::query($expressNum, $com);
                    if (is_array($result) &&
                        isset($result['result']) &&
                        isset($result['result']['deliverystatus']) &&
                        $result['result']['deliverystatus'] >= 3)
                        $cacheTime = 0;
                    else
                        $cacheTime = 1800;
                    $data = $result['result']['list'] ?? [];
                    break;
            }
            CacheService::set($cacheName, $data, $cacheTime);
            return $data;
        }

        return $resultData;
    }

    /**
     * 同步物流公司
     * @return bool
     */
    public function syncExpress()
    {
        if (CacheService::get('sync_express')) {
            return true;
        }
        $expressList = $this->getPlatExpress();
        $data = $data_all = [];
        $selfExpress = $this->dao->getExpress([], 'id,code', 'id');
        $codes = [];
        if ($selfExpress) {
            $codes = array_column($selfExpress, 'code');
        }
        foreach ($expressList as $express) {
            if (!in_array($express['code'], $codes)) {
                $data['name'] = $express['name'] ?? '';
                $data['code'] = $express['code'] ?? '';
                $data['partner_id'] = $express['partner_id'] ?? '';
                $data['partner_key'] = $express['partner_key'] ?? '';
                $data['net'] = $express['net'] ?? '';
                $data['is_show'] = 1;
                $data['status'] = 0;
                if ($express['partner_id'] == 0 && $express['partner_key'] == 0 && $express['net'] == 0) {
                    $data['status'] = 1;
                }
                $data_all[] = $data;
            }
        }
        if ($data_all) {
            $this->dao->saveAll($data_all);
        }
        CacheService::set('sync_express', 1, 3600);
        return true;
    }

    /** 查询单个快递公司
     * @param array $where
     * @return array|\think\Model|null
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public function getOneByWhere(array $where)
    {
        return $this->dao->getOne($where);
    }
}

技术交流 QQ扫一扫:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linlinlove2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值