You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
4.5 KiB
161 lines
4.5 KiB
<?php |
|
/** |
|
* Created by IntelliJ IDEA. |
|
* User: luwei |
|
* Date: 2017/8/21 |
|
* Time: 9:58 |
|
*/ |
|
|
|
namespace app\models; |
|
|
|
use Curl\Curl; |
|
use Hejiang\Express\Exceptions\TrackingException; |
|
use Hejiang\Express\Trackers\TrackerInterface; |
|
use Hejiang\Express\Waybill; |
|
use yii\helpers\VarDumper; |
|
|
|
class ExpressDetailForm extends Model |
|
{ |
|
public $express_no; |
|
public $express; |
|
public $store_id; |
|
|
|
public $status_text = [ |
|
1 => '?', |
|
2 => '运输中', |
|
3 => '已签收', |
|
4 => '问题件', |
|
]; |
|
|
|
public function rules() |
|
{ |
|
return [ |
|
[['express', 'express_no'], 'trim'], |
|
[['express_no', 'express', 'store_id'], 'required'], |
|
]; |
|
} |
|
|
|
public function search() |
|
{ |
|
if (!$this->validate()) { |
|
return $this->errorResponse; |
|
} |
|
return $this->getData(); |
|
} |
|
|
|
private function transExpressName($name) |
|
{ |
|
if (!$name) { |
|
return false; |
|
} |
|
$append_list = [ |
|
'快递', |
|
'快运', |
|
'物流', |
|
'速运', |
|
'速递', |
|
]; |
|
foreach ($append_list as $append) { |
|
$name = str_replace($append, '', $name); |
|
} |
|
|
|
$name_map_list = [ |
|
'邮政快递包裹' => '邮政', |
|
'邮政包裹信件' => '邮政', |
|
]; |
|
if (isset($name_map_list[$name])) { |
|
$name = $name_map_list[$name]; |
|
} |
|
return $name; |
|
} |
|
|
|
private function getData() |
|
{ |
|
/**@var array $status_map 定义在 Hejiang\Express\Status */ |
|
$status_map = [ |
|
-1 => '已揽件', |
|
0 => '已揽件', |
|
1 => '已发出', |
|
2 => '在途中', |
|
3 => '派件中', |
|
4 => '已签收', |
|
5 => '已自取', |
|
6 => '问题件', |
|
7 => '已退回', |
|
8 => '已退签', |
|
]; |
|
|
|
/** @var Waybill $wb */ |
|
$wb = \Yii::createObject([ |
|
'class' => 'Hejiang\Express\Waybill', |
|
'id' => $this->express_no, |
|
'express' => $this->transExpressName($this->express), |
|
]); |
|
|
|
$tracker_class_list = [ |
|
'Hejiang\Express\Trackers\Kuaidi100', |
|
'Hejiang\Express\Trackers\Kuaidiniao', |
|
'Hejiang\Express\Trackers\Kuaidiwang', |
|
]; |
|
|
|
foreach ($tracker_class_list as $tracker_class) { |
|
$class_args = [ |
|
'class' => $tracker_class, |
|
]; |
|
|
|
if ($tracker_class == 'Hejiang\Express\Trackers\Kuaidiniao') { |
|
list($EBusinessID, $AppKey) = $this->getKuaidiniaoConfig(); |
|
$class_args['EBusinessID'] = $EBusinessID; |
|
$class_args['AppKey'] = $AppKey; |
|
} |
|
|
|
/** @var TrackerInterface $tracker */ |
|
$tracker = \Yii::createObject($class_args); |
|
try { |
|
$list = $wb->getTraces($tracker)->toArray(); |
|
if (!is_array($list)) { |
|
return [ |
|
'code' => 1, |
|
'msg' => '物流信息查询失败。', |
|
]; |
|
} |
|
foreach ($list as &$item) { |
|
$item['datetime'] = $item['time']; |
|
$item['detail'] = $item['desc']; |
|
unset($item['time']); |
|
unset($item['desc']); |
|
} |
|
} catch (TrackingException $ex) { |
|
continue; |
|
} |
|
if (isset($status_map[$wb->status])) { |
|
$status_text = $status_map[$wb->status]; |
|
} else { |
|
$status_text = '状态未知'; |
|
} |
|
return [ |
|
'code' => 0, |
|
'data' => [ |
|
'list' => $list, |
|
'status' => $wb->status, |
|
'status_text' => $status_text, |
|
], |
|
]; |
|
} |
|
return [ |
|
'code' => 1, |
|
'msg' => '未查询到物流信息。', |
|
]; |
|
} |
|
|
|
private function getKuaidiniaoConfig() |
|
{ |
|
$store = Store::findOne($this->store_id); |
|
if (!$store || !$store->kdniao_mch_id || !$store->kdniao_api_key) { |
|
return ['', '']; |
|
} |
|
$mch_id = $store->kdniao_mch_id; |
|
$api_key = $store->kdniao_api_key; |
|
return [$mch_id, $api_key]; |
|
} |
|
}
|
|
|