Files
OMS/app/tbo2o/lib/common/tbo2oapi.php
2026-01-04 19:08:31 +08:00

613 lines
25 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.
*/
class tbo2o_common_tbo2oapi{
/*
* 门店新增接口参数
* 参数
* $tbo2o_shop淘宝o2o全渠道配置
* $store_id tbo2o_store表local_store_id
* $rt_cat 门店类目接口返回信息
*/
public function getStoreCreateParam($store_id){
//获取主店铺信息
$tbo2o_shop = kernel::single('tbo2o_common')->getTbo2oShopInfo();
//获取门店相关信息
$mdlTb2oStore = app::get('tbo2o')->model('store');
$tbo2o_store = $mdlTb2oStore->dump(array("local_store_id"=>$store_id));
//营业时间
$arr_time = explode("-",$tbo2o_store["open_hours"]);
$startTime = trim($arr_time[0]);
$endTime = trim($arr_time[1]);
//门店区域
$arr_area = explode(":",$tbo2o_store["area"]);
$arr_area_text = explode("/",$arr_area[1]);
$province = $arr_area_text[0];
$city = $arr_area_text[1];
$area = $city;
if($arr_area_text[2]){
$area = $arr_area_text[2];
}
//获取绑定淘宝店信息
$tb_shop_info = $this->getTbShopInfoByShopId($tbo2o_shop["shop_id"]);
//全渠道格式化省名/市名
$arr_area_format = $this->_formate_province_city($province,$city);
return array(
"storeCode" => $tbo2o_store["store_bn"].$tb_shop_info["tb_shop_id"],
"companyName" => $tbo2o_shop["company_name"],
"storeName" => $tbo2o_store["store_name"],
"storeType" => strtoupper($tbo2o_store["store_type"]),
"mainCategory" => $tbo2o_store["cat_id"],
"startTime" => $startTime,
"endTime" => $endTime,
"address" => array(
"region" => "",
"province" => $arr_area_format["province"],
"city" => $arr_area_format["city"],
"area" => $area,
"town" => "",
"detailAddress" => $tbo2o_store["address"],
"countryCode" => "",
),
"storeStatus" => strtoupper($tbo2o_store["status"]),
"storeDescription" => "",
"storeKeeper" => array(
"name" => $tbo2o_store["contacter"],
"tel" => $tbo2o_store["tel"],
"mobile" => $tbo2o_store["mobile"],
"fax" => $tbo2o_store["fax"],
"zipCode" => $tbo2o_store["zip"],
),
"remark" => "",
);
}
/*
* 门店更新接口参数
* 参数
* $tbo2o_shop淘宝o2o全渠道配置
* $store_id tbo2o_store表local_store_id
* $rt_cat 门店类目接口返回信息
*/
public function getStoreUpdateParam($store_id){
//获取主店铺信息
$tbo2o_shop = kernel::single('tbo2o_common')->getTbo2oShopInfo();
//获取门店相关信息
$mdlTb2oStore = app::get('tbo2o')->model('store');
$tbo2o_store = $mdlTb2oStore->dump(array("local_store_id"=>$store_id));
//营业时间
$arr_time = explode("-",$tbo2o_store["open_hours"]);
$startTime = trim($arr_time[0]);
$endTime = trim($arr_time[1]);
//门店区域
$arr_area = explode(":",$tbo2o_store["area"]);
$arr_area_text = explode("/",$arr_area[1]);
$province = $arr_area_text[0];
$city = $arr_area_text[1];
$area = $city;
if($arr_area_text[2]){
$area = $arr_area_text[2];
}
//获取绑定淘宝店信息
$tb_shop_info = $this->getTbShopInfoByShopId($tbo2o_shop["shop_id"]);
//全渠道格式化省名/市名
$arr_area_format = $this->_formate_province_city($province,$city);
return array(
"storeId" => $tbo2o_store["outer_store_id"],
"storeCode" => $tbo2o_store["store_bn"],
"shopId" => $tb_shop_info["tb_shop_id"],
"companyName" => $tbo2o_shop["company_name"],
"storeName" => $tbo2o_store["store_name"],
"storeType" => strtoupper($tbo2o_store["store_type"]),
"mainCategory" => $tbo2o_store["cat_id"],
"startTime" => $startTime,
"endTime" => $endTime,
"address" => array(
"region" => "",
"province" => $arr_area_format["province"],
"city" => $arr_area_format["city"],
"area" => $area,
"town" => "",
"detailAddress" => $tbo2o_store["address"],
"countryCode" => "",
),
"storeStatus" => strtoupper($tbo2o_store["status"]),
"storeDescription" => "",
"storeKeeper" => array(
"name" => $tbo2o_store["contacter"],
"tel" => $tbo2o_store["tel"],
"mobile" => $tbo2o_store["mobile"],
"fax" => $tbo2o_store["fax"],
"zipCode" => $tbo2o_store["zip"],
),
"remark" => "",
);
}
/*
* 商品关联绑定接口
*/
public function getItemstoreBandingParam($type="ADD",$itemId,$storeIds){
$storeIds_arr = array();
foreach ($storeIds as $v_s){
$storeIds_arr[] = array("storeId"=>$v_s);
}
return array(
"actionType" => $type,
"itemId" => $itemId,
"storeIds" => $storeIds_arr,
"remark" => ""
);
}
//全渠道接口格式化省名
/**
* _formate_province_city
* @param mixed $province province
* @param mixed $city city
* @return mixed 返回值
*/
public function _formate_province_city($province,$city){
$return_arr = array(
"province" => $province,
"city" => $city
);
$zhixiashi = array('北京','上海','天津','重庆');
$zizhiqu = array('内蒙古','宁夏','新疆','西藏','广西','香港','澳门');
if (in_array($province,$zhixiashi)) {
$return_arr = array(
"province" => $province.'市',
"city" => $province.'市市辖区'
);
}elseif(in_array($province,$zizhiqu)){
$province_f = $province.'自治区'; //内蒙古 西藏
if($province == "香港" || $province == "澳门"){
$province_f = $province.'特别行政区';
}
if($province == "宁夏"){
$province_f = $province.'回族自治区';
}
if($province == "新疆"){
$province_f = $province.'维吾尔自治区';
}
if($province == "广西"){
$province_f = $province.'壮族自治区';
}
$return_arr = array(
"province" => $province_f,
"city" => $city
);
}elseif(!preg_match('/(.*?)省/',$province)){
$return_arr = array(
"province" => $province.'省',
"city" => $city
);
}
return $return_arr;
}
/**
* _formate_tb_province_city
* @param mixed $tb_address tb_address
* @return mixed 返回值
*/
public function _formate_tb_province_city($tb_address){
$return_str = "";
$tb_zhixiashi_province = array('北京市','上海市','天津市','重庆市');
$tb_zizhiqu_province = array('内蒙古自治区','西藏自治区','宁夏回族自治区','新疆维吾尔自治区','广西壮族自治区','香港特别行政区','澳门特别行政区');
if(in_array($tb_address["province"],$tb_zhixiashi_province)){
//去掉最后一个字 市
$local_province = substr($tb_address["province"],0,-3);
$local_city = $tb_address["province"];
}elseif (in_array($tb_address["province"],$tb_zizhiqu_province)){
switch ($tb_address["province"]){
case "内蒙古自治区":
case "西藏自治区":
$local_province = substr($tb_address["province"],0,-9);
break;
case "宁夏回族自治区":
case "广西壮族自治区":
case "香港特别行政区":
case "澳门特别行政区":
$local_province = substr($tb_address["province"],0,-15);
break;
case "新疆维吾尔自治区":
$local_province = substr($tb_address["province"],0,-18);
break;
}
$local_city = $tb_address["city"];
}else{
$prov = array();
preg_match('/(.*?)省/',$tb_address["province"],$prov);
if($prov){
//去掉最后的省字
$local_province = substr($tb_address["province"],0,-3);
}
$local_city = $tb_address["city"];
}
//组area字段字符串
if($local_province){
$mdlEccommonRegions = app::get('eccommon')->model('regions');
$rs_province = $mdlEccommonRegions->dump(array("region_grade"=>1,"local_name"=>$local_province),"region_id");
if($rs_province){
$rs_city = $mdlEccommonRegions->dump(array("region_grade"=>2,"p_region_id"=>$rs_province["region_id"],"local_name"=>$local_city),"region_id,haschild");
if($rs_city){
if($rs_city["haschild"] == "1"){
//本地目前只支持3级地区
$rs_area = $mdlEccommonRegions->dump(array("region_grade"=>3,"p_region_id"=>$rs_city["region_id"],"local_name"=>$tb_address["area"]),"region_id");
if($rs_area){
$return_str = "mainland:".$local_province."/".$local_city."/".$tb_address["area"].":".$rs_area["region_id"];
}
}else{
$return_str = "mainland:".$local_province."/".$local_city.":".$rs_city["region_id"];
}
}
}
}
//最终返回
return $return_str;
}
//根据淘宝的address字段获取area字段 mainland:字符串
/**
* 获取AreaFromTbAddress
* @param mixed $tb_address tb_address
* @param mixed $local_area local_area
* @return mixed 返回结果
*/
public function getAreaFromTbAddress($tb_address,$local_area){
//本地area字段
$arr_area = explode(":",$local_area);
$arr_area_text = explode("/",$arr_area[1]);
$province = $arr_area_text[0];
$city = $arr_area_text[1];
$area = $city;
if($arr_area_text[2]){
$area = $arr_area_text[2];
}
//全渠道格式化省名/市名
$arr_area_format = $this->_formate_province_city($province,$city);
if($tb_address["province"] == $arr_area_format["province"] && $tb_address["city"] == $arr_area_format["city"] && $tb_address["area"] == $area){
//淘宝上没有修改地区
return $local_area;
}
//有在淘宝上修改地区的
return $this->_formate_tb_province_city($tb_address);
}
//获取淘宝店铺ID
/**
* 获取TbShopInfoByShopId
* @param mixed $shop_id ID
* @return mixed 返回结果
*/
public function getTbShopInfoByShopId($shop_id){
$mdlOmeShop = app::get('ome')->model('shop');
$rs_shop = $mdlOmeShop->dump(array("shop_id"=>$shop_id),"addon");
return $rs_shop["addon"];
}
//盘点库存 获取阿里全渠道requset接口参数
/**
* 获取InventoryRequestParam
* @param mixed $product_store product_store
* @param mixed $branch_id ID
* @param mixed $type type
* @return mixed 返回结果
*/
public function getInventoryRequestParam($product_store,$branch_id,$type="initial"){
//获取主店铺信息
$tbo2o_shop = kernel::single('tbo2o_common')->getTbo2oShopInfo();
//获取门店信息
$mdlO2oStore = app::get('o2o')->model('store');
$rs_o2o_store = $mdlO2oStore->dump(array("branch_id"=>$branch_id),"store_id");
//获取淘宝门店ID
$mdlTbo2oStore = app::get('tbo2o')->model('store');
$rs_tb_store = $mdlTbo2oStore->dump(array("store_id"=>$rs_o2o_store["store_id"]),"outer_store_id");
//获取淘宝主店铺绑定信息
$tb_shop_info = $this->getTbShopInfoByShopId($tbo2o_shop["shop_id"]);
$return_arr = array(
"userId" => $tb_shop_info["tb_user_id"],
"operationTime" => date("Y-m-d H:i:s",time()),
"stores" => array(
"store" => array(
"warehouseType" => "STORE",
"warehouseId" => $rs_tb_store["outer_store_id"],
),
),
);
$bm_ids = array();
foreach ($product_store as $var_p){
$bm_ids[] = $var_p["bm_id"];
}
//获取基础物料(后端商品)的bn
$mdlBasicMaterial = app::get('material')->model('basic_material');
$rs_basic_ma = $mdlBasicMaterial->getList("bm_id,material_bn",array("bm_id|in"=>$bm_ids));
$bm_bns = array();
$rl_bm_id_bn = array();
foreach ($rs_basic_ma as $var_b_m){
$bm_bns[] = $var_b_m["material_bn"];
$rl_bm_id_bn[$var_b_m["bm_id"]] = $var_b_m["material_bn"];
}
//获取shop_skus商品数据
$mdlTbo2oShopSkus = app::get('tbo2o')->model('shop_skus');
$rs_tb_shop_skus = $mdlTbo2oShopSkus->getList("shop_sku_id,shop_iid,shop_product_bn,product_bn",array("product_bn|in"=>$bm_bns));
$rl_bn_skus = array();
foreach ($rs_tb_shop_skus as $var_s_s){
$rl_bn_skus[$var_s_s["product_bn"]] = $var_s_s;
}
//获取bm_id和sku之间的关系
$rl_bm_id_sku = array();
foreach ($rl_bm_id_bn as $key_b_i_b => $var_b_i_b){
$rl_bm_id_sku[$key_b_i_b] = $rl_bn_skus[$var_b_i_b];
}
//组storeInventories明细参数
$time_micro = utils::microtime();
$time_micro = str_replace(".", "", $time_micro);
$storeInventories_arr = array();
foreach ($product_store as $var_p_s){
$temp_arr = array(
"itemId" => $rl_bm_id_sku[$var_p_s["bm_id"]]["shop_iid"],
"outerId" => $rl_bm_id_sku[$var_p_s["bm_id"]]["shop_product_bn"],
"skuId" => $rl_bm_id_sku[$var_p_s["bm_id"]]["shop_sku_id"],
);
if($type == "initial"){
if($var_p_s["store"] > 0){
$temp_arr["billNum"] = $time_micro++;
$temp_arr["inventoryType"] = "CERTAINTY";
$temp_arr["quantity"] = $var_p_s["store"];
$storeInventories_arr[]["storeInventory"] = $temp_arr;
}
if($var_p_s["share_store"] > 0){
$temp_arr["billNum"] = $time_micro++;
$temp_arr["inventoryType"] = "UNCERTAINTY";
$temp_arr["quantity"] = $var_p_s["share_store"];
$storeInventories_arr[]["storeInventory"] = $temp_arr;
}
}else{
//update
if($var_p_s["short_over"] != "0" ){
$temp_arr["billNum"] = $time_micro++;
$temp_arr["billType"] = "BALANCE";
$temp_arr["inventoryType"] = "CERTAINTY";
$temp_arr["quantity"] = $var_p_s["short_over"];
$temp_arr["finalQuantity"] = $var_p_s["store"];
$storeInventories_arr[]["storeInventory"] = $temp_arr;
}
if($var_p_s["share_short_over"] != "0" ){
$temp_arr["billNum"] = $time_micro++;
$temp_arr["billType"] = "BALANCE";
$temp_arr["inventoryType"] = "UNCERTAINTY";
$temp_arr["quantity"] = $var_p_s["share_short_over"];
$temp_arr["finalQuantity"] = $var_p_s["share_store"];
$storeInventories_arr[]["storeInventory"] = $temp_arr;
}
}
}
$return_arr["stores"]["store"]["storeInventories"] = $storeInventories_arr;
return $return_arr;
}
//阿里全渠道回写电商仓库存 获取requset接口参数
function getO2oInvInitialRequestParam($omnichannel_stock,$tbo2o_shop){
//获取淘宝主店铺绑定信息
$tb_shop_info = $this->getTbShopInfoByShopId($tbo2o_shop["shop_id"]);
$return_arr = array(
"userId" => $tb_shop_info["tb_user_id"],
"operationTime" => date("Y-m-d H:i:s",time()),
"stores" => array(
"store" => array(
"warehouseType" => "WAREHOUSE",
"warehouseId" => $tbo2o_shop["branch_bn"],
),
),
);
//获取销售物料bn的sku_id和item_id
$sm_bns = array();
foreach ($omnichannel_stock as $var_o){
$sm_bns[] = $var_o["bn"];
}
$mdlTbo2oShopSkus = app::get('tbo2o')->model('shop_skus');
$rs_skus = $mdlTbo2oShopSkus->getList("shop_sku_id,shop_iid,shop_product_bn",array("shop_product_bn|in"=>$sm_bns));
$rl_bn_ids = array();
foreach ($rs_skus as $var_s){
$rl_bn_ids[$var_s["shop_product_bn"]] = array(
"shop_sku_id" => $var_s["shop_sku_id"],
"shop_iid" => $var_s["shop_iid"],
"shop_product_bn" => $var_s["shop_product_bn"],
);
}
//组storeInventories明细参数
$time_micro = utils::microtime();
$time_micro = str_replace(".", "", $time_micro);
$storeInventories_arr = array();
foreach ($omnichannel_stock as $var_o_s){
$temp_arr = array(
"billNum" => $time_micro++,
"itemId" => $rl_bn_ids[$var_o_s["bn"]]["shop_iid"],
"outerId" => $rl_bn_ids[$var_o_s["bn"]]["shop_product_bn"],
"skuId" => $rl_bn_ids[$var_o_s["bn"]]["shop_sku_id"],
"inventoryType" => "CERTAINTY",
"quantity" => $var_o_s["quantity"],
);
$storeInventories_arr[]["storeInventory"] = $temp_arr;
}
$return_arr["stores"]["store"]["storeInventories"] = $storeInventories_arr;
return $return_arr;
}
//新增门店
/**
* tbStoreCreate
* @param mixed $store_id ID
* @param mixed $errormsg errormsg
* @return mixed 返回值
*/
public function tbStoreCreate($store_id,&$errormsg){
$param = $this->getStoreCreateParam($store_id);
$result = kernel::single('tbo2o_event_trigger_store')->storeCreate($param);
$return_result = false;
$update_arr = array();
if($result["rsp"] == "fail"){
$update_arr["sync"] = 2;
$errormsg = $result["msg"];
}
$data = json_decode($result["data"],true);
if ($data["succ"][0]["response"]["flag"] == "success"){
$update_arr["sync"] = 3; //新增成功
$return_result = true;
if($data["succ"][0]["response"]["storeId"]){
$update_arr["outer_store_id"] = $data["succ"][0]["response"]["storeId"];
}
}
if(!empty($update_arr)){
$mdlTbo2oStore = app::get('tbo2o')->model('store');
$filter_arr = array("store_id"=>$store_id);
$mdlTbo2oStore->update($update_arr,$filter_arr);
}
return $return_result;
}
//更新门店
/**
* tbStoreUpdate
* @param mixed $store_id ID
* @param mixed $errormsg errormsg
* @return mixed 返回值
*/
public function tbStoreUpdate($store_id,&$errormsg){
$param = $this->getStoreUpdateParam($store_id);
$result = kernel::single('tbo2o_event_trigger_store')->storeUpdate($param);
$return_result = false;
$update_arr = array();
if($result["rsp"] == "fail"){
//更新失败
$update_arr["sync"] = 2;
$errormsg = $result["msg"];
}
$data = json_decode($result["data"],true);
if ($data["succ"][0]["response"]["flag"] == "success"){
$update_arr["sync"] = 3; //更新成功
$return_result = true;
}
if(!empty($update_arr)){
$mdlTbo2oStore = app::get('tbo2o')->model('store');
$filter_arr = array("store_id"=>$store_id);
$mdlTbo2oStore->update($update_arr,$filter_arr);
}
return $return_result;
}
//删除门店
/**
* tbStoreDelete
* @param mixed $store_id ID
* @param mixed $errormsg errormsg
* @return mixed 返回值
*/
public function tbStoreDelete($store_id,&$errormsg){
$mdlTbo2oStore = app::get('tbo2o')->model('store');
$rs_tbo2o_store = $mdlTbo2oStore->dump(array("store_id"=>$store_id),"outer_store_id");
$param = array("storeId"=>$rs_tbo2o_store["outer_store_id"]);
$result = kernel::single('tbo2o_event_trigger_store')->storeDelete($param);
$return_result = false;
if($result["rsp"] == "fail"){
//删除失败
$errormsg = $result["msg"];
}
$data = json_decode($result["data"],true);
if ($data["succ"][0]["response"]["flag"] == "success"){
$update_arr["sync"] = 1; //删除成功
$update_arr["outer_store_id"] = "";
$return_result = true;
}
if(!empty($update_arr)){
$mdlTbo2oStore = app::get('tbo2o')->model('store');
$filter_arr = array("store_id"=>$store_id);
$mdlTbo2oStore->update($update_arr,$filter_arr);
}
return $return_result;
}
//门店查询
/**
* tbStoreQuery
* @param mixed $outer_store_id ID
* @param mixed $errormsg errormsg
* @return mixed 返回值
*/
public function tbStoreQuery($outer_store_id,&$errormsg){
$param = array("storeId"=>$outer_store_id);
$result = kernel::single('tbo2o_event_trigger_store')->storeQuery($param);
$return_result = false;
if($result["rsp"] == "fail"){
//查询失败
$errormsg = $result["msg"];
}
$data = json_decode($result["data"],true);
if ($data["succ"][0]["response"]["flag"] == "success"){
//查询成功
$return_result = $data["succ"][0]["response"];
}
return $return_result;
}
//淘宝门店关联宝贝绑定和解绑
/**
* tbStoreItemStoreBanding
* @param mixed $id ID
* @param mixed $type type
* @param mixed $errormsg errormsg
* @return mixed 返回值
*/
public function tbStoreItemStoreBanding($id,$type,&$errormsg){
//获取商品id
$mdlTbo2oStoreItems = app::get('tbo2o')->model('store_items');
$rs_item = $mdlTbo2oStoreItems->dump(array("id"=>$id));
//获取淘宝门店id
$mdlTbo2oStore = app::get('tbo2o')->model('store');
$rs_tb_store = $mdlTbo2oStore->dump(array("store_id"=>$rs_item["store_id"]),"outer_store_id");
$param = kernel::single('tbo2o_common_tbo2oapi')->getItemstoreBandingParam($type,$rs_item["item_iid"],array($rs_tb_store["outer_store_id"]));
$result = kernel::single('tbo2o_event_trigger_store')->storeItemstoreBanding($param);
$return_result = false;
if($result["rsp"] == "fail"){
//操作失败
$errormsg = $result["msg"];
}
$data = json_decode($result["data"],true);
if ($data["succ"][0]["response"]["flag"] == "success"){
$return_result = true;
//绑定成功 更新bind字段和bind时间
$filter_arr = array("id"=>$id);
if($type == "ADD"){
//绑定
$update_arr = array("is_bind"=>1,"bind_time"=>time());
}else{
//解绑
$update_arr = array("is_bind"=>0,"bind_time"=>"0");
}
$mdlTbo2oStoreItems->update($update_arr,$filter_arr);
}
return $return_result;
}
}