Files
huangjingfen/pro_v3.5.1/app/services/other/ExpressServices.php
panchengyong 7acbf45ff7 new files
2026-03-07 22:29:07 +08:00

308 lines
11 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\services\other;
use app\dao\other\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;
use think\annotation\Inject;
/**
* 物流数据
* Class ExpressServices
* @package app\services\other
* @mixin ExpressDao
*/
class ExpressServices extends BaseServices
{
public string $_cacheKey = "plat_express_list";
//物流查询物流公司code
public array $express_code = [
'yunda' => 'yunda',
'yundakuaiyun' => 'yunda56',
'ems' => 'EMS',
'youzhengguonei' => 'chinapost',
'huitongkuaidi' => 'HTKY',
'baishiwuliu' => 'BSKY',
'shentong' => 'STO',
'jd' => 'JD',
'zhongtong' => 'ZTO',
'zhongtongkuaiyun' => 'ZTO56',
];
/**
* @var ExpressDao
*/
#[Inject]
protected ExpressDao $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');
}
/**
* 获取API用快递列表
* @return array
*/
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'] ?? '');
if (isset($formData['check_man']) && $formData['check_man'] == 1) $field[] = Form::input('courier_name', '承载快递员名:', $formData['courier_name'] ?? '')->required();
if (isset($formData['partner_name']) && $formData['partner_name'] == 1) $field[] = Form::input('customer_name', '客户账户名称:', $formData['customer_name'] ?? '')->required();
if (isset($formData['is_code']) && $formData['is_code'] == 1) $field[] = Form::input('code_name', '电子面单承载编号:', $formData['code_name'] ?? '')->required();
$field[] = Form::number('sort', '排序:', (int)($formData['sort'] ?? 0))->min(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;
}
/**
* 获取快递列表(带缓存)
* @param array $where 查询条件
* @return array
*/
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
* @return array|bool|mixed
*/
public function query(string $cacheName, string $expressNum)
{
$resultData = CacheService::get($cacheName, null);
if ($resultData === null || !is_array($resultData)) {
$data = [];
$cacheTime = 0;
try {
switch ((int)sys_config('logistics_type')) {
case 1://一号通
/** @var ServeServices $services */
$services = app()->make(ServeServices::class);
$result = $services->express()->query($expressNum);
if (isset($result['ischeck']) && $result['ischeck'] == 1) {
$cacheTime = 0;
} else {
$cacheTime = 1800;
}
foreach (isset($result['content']) ? $result['content'] : [] as $item) {
$data[] = ['time' => $item['time'], 'status' => $item['status']];
}
break;
case 2://阿里云
$result = ExpressService::query($expressNum);
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);
} catch (\Throwable $e) {
}
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,status,account,key,net_name,courier_name,customer_name,code_name', 'id');
$codes = [];
if ($selfExpress) {
$codes = array_column($selfExpress, 'code');
$selfExpress = array_combine($codes, $selfExpress);
}
foreach ($expressList as $express) {
$data = [];
$data['partner_id'] = $express['partner_id'] ?? 0;
$data['partner_key'] = $express['partner_key'] ?? 0;
$data['net'] = $express['net'] ?? 0;
$data['check_man'] = $express['check_man'] ?? 0;
$data['partner_name'] = $express['partner_name'] ?? 0;
$data['is_code'] = $express['is_code'] ?? 0;
if (!in_array($express['code'], $codes)) {
$data['name'] = $express['name'] ?? '';
$data['code'] = $express['code'] ?? '';
$data['is_show'] = 0;
$data['status'] = 0;
if ($express['partner_id'] == 0 && $express['partner_key'] == 0 && $express['net'] == 0) {
$data['status'] = 1;
}
$data_all[] = $data;
} else {
if (isset($selfExpress[$express['code']]['id']) && $selfExpress[$express['code']]['id']) {
if (($express['partner_id'] == 1 && !$selfExpress[$express['code']]['account']) || ($express['partner_key'] == 1 && !$selfExpress[$express['code']]['key']) || ($express['net'] == 1 && !$selfExpress[$express['code']]['net_name']) || ($express['check_man'] == 1 && !$selfExpress[$express['code']]['courier_name']) || ($express['partner_name'] == 1 && !$selfExpress[$express['code']]['customer_name']) || ($express['is_code'] == 1 && !$selfExpress[$express['code']]['code_name'])) {
$data['status'] = 0;
} else {
$data['status'] = 1;
}
$this->dao->update($selfExpress[$express['code']]['id'], $data, 'id');
}
}
}
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);
}
}