Files
OMS/app/erpapi/lib/router/request.php
2026-01-04 19:08:31 +08:00

267 lines
9.7 KiB
PHP

<?php
/**
* Copyright 2012-2026 ShopeX (https://www.shopex.cn)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* 请求转发路由
*
* @category
* @package
* @author chenping<chenping@shopex.cn>
* @version $Id: Z
*/
@include_once(dirname(__FILE__).'/../apiname.php');
class erpapi_router_request
{
/**
* 平台类型 wms|shop
*
* @var string
**/
private $__channel_type = '';
/**
* 平台ID
*
* @var string
**/
private $__channel_id = null;
/**
* 标识业务 delivery|goods ...
*
* @var string
**/
private $__business;
/**
* 设置初始化
*
* @return object
* @author
**/
public function set($channel_type,$channel_id)
{
$this->__channel_type = $channel_type;
$this->__channel_id = $channel_id;
// $this->__business = $business;
return $this;
}
/**
*
*
* @return Array array('rsp'=>'succ|fail','msg'=>'','data'=>'','msg_code'=>'')
* @author
**/
public function __call($method,$args)
{
try {
if (!$this->__channel_id) throw new Exception("channel_id is required");
if (!$this->__channel_type) throw new Exception("channel_type is required");
if (in_array($this->__channel_type,array('store','wms','tbo2o'))){
list($this->__business,$action) = explode('_',$method);
$action = $method;
}else{
if (false !== $pos=strpos($method,'_')) {
$this->__business = substr($method, 0,$pos);
$action = substr($method, $pos+1);
}
}
if (!$this->__business || !$action) {
throw new Exception('method:format error', 1);
}
$channel_name = 'erpapi_channel_'.$this->__channel_type;
$channel_class = kernel::single($channel_name,array($this->__channel_type,$this->__channel_id));
if (!$channel_class instanceof erpapi_channel_abstract) throw new Exception("{$channel_name} not instanceof erpapi_channel_abstract");
$channelRs = $channel_class->init(null,$this->__channel_id);
if (!$channelRs) throw new Exception('渠道不存在');
$adapter = $channel_class->get_adapter();
$platform = $channel_class->get_platform();
$ver = $channel_class->get_ver();
// 可配置默认类
$default_config_name = 'erpapi_'.$this->__channel_type.'_config';
$config_class = kernel::single($default_config_name,array($channel_class));
try {
// 自带配置类
$config_name_arr = array('erpapi',$this->__channel_type,$adapter,$platform,'config');
$config_name = implode('_',array_filter($config_name_arr));
if (class_exists($config_name)) {
$config_class = kernel::single($config_name,array($channel_class));
if (!is_subclass_of($config_class, $default_config_name)) throw new Exception("{$config_name} not instanceof {$default_config_name}");
}
} catch (Exception $e) {
try {
$config_name_arr = array('erpapi',$this->__channel_type,$adapter,'config');
$config_name = implode('_',array_filter($config_name_arr));
if (class_exists($config_name)) {
$config_class = kernel::single($config_name,array($channel_class));
if (!is_subclass_of($config_class, $default_config_name)) throw new Exception("{$config_name} not instanceof {$default_config_name}");
}
} catch (Exception $e) {
}
}
$config_class->init($channel_class);
// 结果默认类
$result_class = kernel::single('erpapi_result',array($channel_class));
try {
// 自带结果类
$result_name_arr = array('erpapi',$this->__channel_type,$adapter,$platform,'result');
$result_name = implode('_',array_filter($result_name_arr));
if (class_exists($result_name)) {
$result_class = kernel::single($result_name,array($channel_class));
if (!is_subclass_of($result_class, 'erpapi_result')) throw new Exception("{$result_name} not instanceof erpapi_result");
}
} catch (Exception $e) {
try {
// 自带结果类
$result_name_arr = array('erpapi', $this->__channel_type, $adapter, 'result');
$result_name = implode('_', array_filter($result_name_arr));
if (class_exists($result_name)) {
$result_class = kernel::single($result_name, array($channel_class));
if (!is_subclass_of($result_class, 'erpapi_result')) throw new Exception("{$result_name} not instanceof erpapi_result");
}
} catch (Exception $e) {
try {
// 自带结果类
$result_name_arr = array('erpapi', $this->__channel_type, 'result');
$result_name = implode('_', array_filter($result_name_arr));
if (class_exists($result_name)) {
$result_class = kernel::single($result_name, array($channel_class));
if (!is_subclass_of($result_class, 'erpapi_result')) throw new Exception("{$result_name} not instanceof erpapi_result");
}
} catch (Exception $e) {
}
}
}
// 平台处理默认类
$object_class = $this->_get_object_class($channel_class);
$object_class->init($channel_class,$config_class,$result_class);
if (!method_exists($object_class,$action)) throw new Exception("method error");
return call_user_func_array(array($object_class,$action), $args);
} catch (Exception $e) {
return array('rsp'=>'fail','msg'=>$e->getMessage(),'data'=>'','msg_code'=>'');
}
}
/**
* 获取处理类
*
* @return void
* @author
**/
private function _get_object_class($channel_class)
{
$adapter = $channel_class->get_adapter();
$platform = $channel_class->get_platform();
$platform_business = $channel_class->get_platform_business();
$ver = $channel_class->get_ver();
// 平台处理默认类
$default_object_name = 'erpapi_'.$this->__channel_type.'_request_'.$this->__business;
do {
$tgV = $ver > 1 ? 'v'.$ver : '';
// 自带处理类
$object_name_arr = array('erpapi',$this->__channel_type,$adapter,$platform,'request',$tgV,$this->__business);
$object_name = implode('_',array_filter($object_name_arr));
try {
if (class_exists($object_name)) {
$object_class = kernel::single($object_name,array($channel_class));
if (is_subclass_of($object_class, $default_object_name)) break;
}
} catch (Exception $e) {
}
$ver--;
} while ($ver > 0);
if (!is_object($object_class)) {
if (false !== strpos($platform, 'shopex_')) {//自由体系特殊处理
$parentPlatForm = 'shopex';
// 自带处理类
$object_name_arr = array('erpapi', $this->__channel_type, $adapter, $parentPlatForm, 'request', $this->__business);
$object_name = implode('_', array_filter($object_name_arr));
try {
if (class_exists($object_name)) {
$object_class = kernel::single($object_name,array($channel_class));
if (!is_subclass_of($object_class, $default_object_name)) {
unset($object_class);
}
}
} catch (Exception $e) {
}
}
}
if($platform_business) {
// array_push($object_name_arr, $platform_business);
array_splice( $object_name_arr, -1, 0, [$platform_business]);
// $object_name_arr = array('erpapi', $this->__channel_type, $adapter, $parentPlatForm, 'request', $platform_business, $this->__business);
$object_name = implode('_',array_filter($object_name_arr));
try {
if (class_exists($object_name)) {
$pb_object_class = kernel::single($object_name,array($channel_class));
if (is_subclass_of($pb_object_class, $default_object_name)) {
$object_class = $pb_object_class;
}
}
} catch (Exception $e) {
}
}
if (!is_object($object_class)) {
$object_class = kernel::single($default_object_name,array($channel_class));
}
return $object_class;
}
}