Files
OMS/app/ome/lib/rpc/mapper.php
2025-12-28 23:13:25 +08:00

213 lines
7.2 KiB
PHP
Raw 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
/**
* Copyright © ShopeX http://www.shopex.cn. All rights reserved.
* See LICENSE file for license details.
*/
class ome_rpc_mapper{
/**
* ecstore 版本映射
*/
private $ecosb2c = array(
'1' => '1.0',
'2' => '2.2'
);
/**
* 店掌柜 版本映射
*/
private $ecosdzg = array(
'1' => '1.0',
'2' => '2.2'
);
/**
* b2b 版本映射
*/
private $shopexb2b = array(
'1' => '1.0',
'3.2' => '2.2'
);
/**
* 485 版本映射
*/
private $shopexb2c = array(
'1' => '1.0',
'2' => '2.2',
);
/**
* 淘管版本与淘管 API文件映射
*/
private $tg = array(
'base' => 'base',
'1.0' => '1',
'2.2' => '2',
);
function __construct(){
$this->version_list = array(
'shopex_b2c' => $this->shopexb2c,
'shopex_b2b' => $this->shopexb2b,
'ecos.b2c' => $this->ecosb2c,
'ecos.dzg' => $this->ecosdzg,
);
}
/**
* 接收API版本文件路由
* @access public
* @param String $node_id 前端店铺节点标识
* @param String $api_class 接口类名
* @param String $api_method 接口方法
* @param Array $params 接口参数
* @return array('rsp'=>'保存状态success/fail','msg'=>'错误消息','data'=>'数据')
*/
public function response_router($node_id,$api_class='',$api_method='',$params=array()){
$rs = array('rsp'=>'fail','msg'=>'','data'=>'');
if (empty($node_id) || empty($api_class) || empty($api_method)){
$rs['msg'] = '参数传递错误';
return $rs;
}else{
$oResponse = kernel::single('ome_rpc_response');
$shop_info = $oResponse->filter(array('node_id'=>$node_id));
if ($shop_info['rsp'] == 'fail'){
$rs['msg'] = $shop_info['msg'];
return $rs;
}else{
#存储前端店铺API版本号
$shop_api_v = isset($params['node_version']) ? $params['node_version'] : '';
if (!empty($shop_api_v)){
$oFunc = kernel::single('ome_rpc_func');
$oFunc->store_shop_api_v($shop_api_v,$node_id);
$cur_ver = $shop_api_v;
}else{
$cur_ver = $shop_info['api_version'];
}
$node_type = $shop_info['node_type'];
if($shop_ver_list = $this->version_list[$node_type]){
$tg_ver = $this->ver_compre($node_type,$cur_ver,$shop_ver_list,'shop');
}else{
$tg_ver = '1.0';
}
$tg_ver_list = $this->tg;
$params['shop_id'] = $shop_info['shop_id'];
$params['shop_name'] = $shop_info['name'];
$params['shop_type'] = $shop_info['node_type'];
$params['node_id'] = $shop_info['node_id'];
$action_rs = $this->action($node_type,'tg',$tg_ver,$tg_ver_list,$api_class,$api_method,$params);
if ($action_rs['rsp'] == 'success'){
$rs['rsp'] = 'success';
}else{
$rs['msg'] = $action_rs['msg'];
}
$rs['data'] = $action_rs['data'];
$rs['logTitle'] = $action_rs['logTitle'];
$rs['logInfo'] = $action_rs['logInfo'];
return $rs;
}
}
}
/**
* 发起API版本文件路由
* @access public
* @param String $node_id 前端店铺节点号
* @param String $api_class 接口类名
* @param String $api_method 接口方法
* @param Array $params 接口参数
* @return array('rsp'=>'保存状态success/fail','msg'=>'错误消息','data'=>'数据')
*/
public function request_router($node_id,$api_class='',$api_method='',$params=array()){
$rs = array('rsp'=>'fail','msg'=>'','data'=>'');
if (empty($node_id) || empty($api_class) || empty($api_method)){
$rs['msg'] = '参数传递错误';
return $rs;
}else{
#获取前端店铺API版本号
$oFunc = kernel::single('ome_rpc_func');
$shopObj = app::get('ome')->model('shop');
$shop_detail = $shopObj->getRow(array('node_id'=>$node_id),'shop_id,name,node_type,node_id');
$node_type = $shop_detail['node_type'];
$cur_ver = $oFunc->fetch_shop_api_v($node_id);
if($shop_ver_list = $this->version_list[$node_type]){
$tg_ver = $this->ver_compre($node_type,$cur_ver,$shop_ver_list,'shop');
}else{
$tg_ver = '1.0';
}
$tg_ver_list = $this->tg;
$params['shop_id'] = $shop_detail['shop_id'];
$params['shop_name'] = $shop_detail['name'];
$params['shop_type'] = $shop_detail['node_type'];
$params['node_type'] = $node_type;
$params['node_id'] = $node_id;
$action_rs = $this->action($node_type,'tg',$tg_ver,$tg_ver_list,$api_class,$api_method,$params,'request');
if ($action_rs['rsp'] == 'success'){
$rs['rsp'] = 'success';
}else{
$rs['msg'] = $action_rs['msg'];
}
$rs['data'] = $action_rs['data'];
$rs['logTitle'] = $action_rs['logTitle'];
$rs['logInfo'] = $action_rs['logInfo'];
return $rs;
}
}
private function action($node_type,$ver_type,$cur_ver,$his_ver,$class='',$method='',$params='',$api_type='response',$max=1){
if ($cur_ver != 'base'){
$api_ver = $this->ver_compre($node_type,$cur_ver,$his_ver,$ver_type);
}else{
$api_ver = 'base';
}
$api_class = 'ome_rpc_'.$api_type.'_version_'.$api_ver.'_'.$class;
if (ome_func::class_exists($api_class) && $instance = kernel::single($api_class)){
if (method_exists($instance,$method)){
return $instance->$method($params);
}
}
array_pop($his_ver);
if ($max >= 30) return;#防止死循环
static $max;
$max += 1;
return $this->action($node_type,$ver_type,$cur_ver,$his_ver,$class,$method,$params,$api_type,$max);
}
private function ver_compre($node_type,$cur_ver,$his_ver,$ver_type,$max=1){
$tmp_ver = array_pop($his_ver);
if ($ver_type == 'shop'){
$ver_list = $this->version_list[$node_type];
}else{
$ver_list = $this->tg;
}
$tmp_ver_list = array_flip($ver_list);
$compre_ver = $tmp_ver_list[$tmp_ver];
if ($cur_ver == '' || $compre_ver == 'base'){
return $ver_list['base'] ? $ver_list['base'] : $ver_list['1'];
}else{
if(version_compare($cur_ver,$compre_ver,'>=')){
return $ver_list[$compre_ver];
}else{
if ($max >= 30) return;#防止死循环
static $max;
$max += 1;
return $this->ver_compre($node_type,$cur_ver,$his_ver,$ver_type,$max);
}
}
}
}