Files
OMS/app/eccommon/lib/platform/regions.php
2026-01-04 19:08:31 +08:00

538 lines
18 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 eccommon_platform_regions{
/**
* sync
* @param mixed $data 数据
* @return mixed 返回值
*/
public function sync($data){
set_time_limit(0);
ini_set('memory_limit', '512M');
$shop_id = $data['shop_id'];
$shopInfo = app::get('ome')->model('shop')->db_dump(['shop_id'=>$shop_id]);
$params = array(
'region_grade' => 1,
);
$rs = kernel::single('erpapi_router_request')->set('shop', $shop_id)->branch_getProvince($params);
if($rs['rsp'] == 'succ' && $rs['data']){
$insertData = $rs['data'];
$this->save($insertData);
$data = app::get('eccommon')->model('platform_regions')->getList('id,outregion_id,outregion_name', ['shop_type'=>$shopInfo['shop_type'], 'region_grade'=>'1']);
if($data) {
return [true, ['msg'=>'同步成功', 'data'=>$data]];
}
}
return [false, ['msg'=>'同步失败:'.$rs['msg']]];
}
/**
* syncArea
* @param mixed $data 数据
* @return mixed 返回值
*/
public function syncArea($data) {
$params = array(
'outregion_id' => $data['outregion_id'],
'outregion_name' => $data['outregion_name'],
);
$res = kernel::single('erpapi_router_request')->set('shop', $data['shop_id'])->branch_getAreasByProvince($params);
if($res['rsp'] != 'succ') {
return [false, ['msg' => '获取失败:'. $res['error_msg']]];
}
if(empty($res['data'])) {
return [false, ['msg' => '获取失败:没有获取到平台四级地区数据']];
}
//save
$insertData = $res['data'];
$this->save($insertData);
return [true, ['msg'=>'保存成功']];
}
/**
* 保存
* @param mixed $data 数据
* @return mixed 返回操作结果
*/
public function save($data){
$regionsObj = app::get('eccommon')->model('platform_regions');
foreach($data as $v){
$outregion_id = $v['outregion_id'];
$outregion_name = $v['outregion_name'];
if (isset($v['outparent_id'])) {
$where = array('shop_type'=>$v['shop_type'],'region_grade'=>$v['region_grade'],'outregion_name'=>$outregion_name,'outparent_id'=>$v['outparent_id']);
}else{
$where = array('shop_type'=>$v['shop_type'],'region_grade'=>$v['region_grade'],'outregion_name'=>$outregion_name);
}
$regions = $regionsObj->dump($where,'id,mapping');
if($regions){
if($regions['mapping'] == '0'){
$local_regions = $this->getLocalRegion($v);
if($local_regions){
$update_data = array(
'mapping' => '1',
'local_region_id'=>$local_regions['region_id'],
'local_region_name'=>$local_regions['local_name'],
);
$regionsObj->update($update_data,array('id'=>$regions['id']));
}
}
}else{
$local_regions = $this->getLocalRegion($v);
$insert_data = array(
'outregion_id' => $outregion_id,
'outregion_name' => $outregion_name,
'shop_type' => $v['shop_type'],
'region_grade' => $v['region_grade']? $v['region_grade'] : 1,
);
if ($v['outparent_id']){
$insert_data['outparent_id'] = $v['outparent_id'];
}
if($local_regions){
$insert_data['local_region_id'] = $local_regions['region_id'];
$insert_data['local_region_name'] = $local_regions['local_name'];
$insert_data['mapping'] = '1';
}
if (($v['region_grade']== 2 || $v['region_grade']== 3 ) && $v['outparent_id']){
$parentRegion = $this->getRegionByParentId($v['shop_type'],$v['outparent_id']);
$insert_data['outparent_name'] = $parentRegion['outregion_name'];
}
$regionsObj->save($insert_data);
}
}
}
/**
* platformList
* @return mixed 返回值
*/
public function platformList(){
$shopObj = app::get('ome')->model('shop');
$shop_list = $shopObj->getlist('*',array('shop_type'=>array('luban','kuaishou', 'pinduoduo', 'weimobv')));
$platform = array();
if ($shop_list) {
foreach ($shop_list as $k=>$shop ) {
if ($shop['node_id'] != '') {
$platform[$shop['shop_type']] = $shop;
}
}
}
return $platform;
}
/**
* 获取LocalRegion
* @param mixed $data 数据
* @return mixed 返回结果
*/
public function getLocalRegion($data){
$db = kernel::database();
$outregion_name = $data['outregion_name'];
$region_grade = $data['region_grade'];
$regionMdl = app::get('eccommon')->model('regions');
if($region_grade == 1){
$regions = $regionMdl->dump(array('local_name|head'=>$outregion_name,'region_grade'=>'1'), 'package,region_id,local_name');
if(!$regions){
$formatregion = $this->_formate_province($outregion_name);
$regions = $regionMdl->dump(array('local_name|head'=>$formatregion,'region_grade'=>'1'), 'package,region_id,local_name');
}
}
if($region_grade == 2){
$parentRegion = $this->getRegionByParentId($data['shop_type'],$data['outparent_id']);
$regions = $regionMdl->dump(array('local_name|head'=>$outregion_name,'region_grade'=>'2','p_region_id'=>$parentRegion['local_region_id']),'region_id,p_region_id,local_name');
if(!$regions){
$formatregion = $this->_formate_city($outregion_name);
$regions = $regionMdl->dump(array('local_name|head'=>$formatregion,'region_grade'=>'2','p_region_id'=>$parentRegion['local_region_id']),'region_id,p_region_id,local_name');
}
}
if($region_grade == 3){
$parentRegion = $this->getRegionByParentId($data['shop_type'],$data['outparent_id']);
$regions = $regionMdl->dump(array('local_name|head'=>$outregion_name,'region_grade'=>'3','p_region_id'=>$parentRegion['local_region_id']),'region_id,p_region_id,local_name');
if(!$regions){
$formatregion = $this->_formate_street($outregion_name);
$regions = $regionMdl->dump(array('local_name|head'=>$formatregion,'region_grade'=>'3','p_region_id'=>$parentRegion['local_region_id']),'region_id,p_region_id,local_name');
}
}
return $regions;
}
/**
* 获取RegionList
* @return mixed 返回结果
*/
public function getRegionList(){
$regionsObj = app::get('eccommon')->model('regions');
$regionList = $regionsObj->getlist('region_id,local_name,region_grade,p_region_id',array('region_grade'=>1));
return $regionList;
}
/**
* synckpl
* @return mixed 返回值
*/
public function synckpl(){
$channelObj = app::get('channel')->model('channel');
$channel = $channelObj->dump(array('filter_sql' => " ( node_id is not null or node_id!='' ) and node_type='yjdf'"),'channel_id');
$params = array(
'parent_id' => '4744',
'region_grade' => 1,
'channel_id' => $channel['channel_id'],
);
$rs = $this->provinceRequest($params);
$zhixiashi = array('北京','北京市', '上海','上海市', '天津','天津市', '重庆','重庆市');
if($rs['rsp'] == 'succ' && $rs['data']){
foreach($rs['data'] as $cv){
if(!$cv['outregion_id']) continue;
if(in_array($cv['outregion_name'],$zhixiashi)){//直辖市转换
$zhixia_data = array();
$outregion_name = $cv['outregion_name'];
if (!preg_match('/(.*?)市/', $outregion_name)){
$outregion_name=$outregion_name.'市';
}
$zhixia_data[] = array(
'region_grade' => 2,
'outregion_id' => $cv['outregion_id'],
'outregion_name'=> $outregion_name,
'shop_type' => $cv['shop_type'],
'outparent_id' => $cv['outregion_id'],
);
$this->save($zhixia_data);
$cvparams = array(
'region_grade' => 3,
'parent_id' => $cv['outregion_id'],
'channel_id' => $channel['channel_id'],
);
$cvrs = $this->provinceRequest($cvparams);
}else{
$cvparams = array(
'region_grade' => 2,
'parent_id' => $cv['outregion_id'],
'channel_id' => $channel['channel_id'],
);
$cvrs = $this->provinceRequest($cvparams);
if($cvrs['rsp'] == 'succ' && $cvrs['data']){
foreach($cvrs['data'] as $zv){
if(!$zv['outregion_id']) continue;
$zvparams = array(
'region_grade' => 3,
'parent_id' => $zv['outregion_id'],
'channel_id' => $channel['channel_id'],
);
$this->provinceRequest($zvparams);
}
}
}
}
}
}
/**
* provinceRequest
* @param mixed $sdf sdf
* @return mixed 返回值
*/
public function provinceRequest($sdf){
$params = array(
'parent_id' => $sdf['parent_id'],
'region_grade' => $sdf['region_grade'],
);
$rs = kernel::single('erpapi_router_request')->set('wms',$sdf['channel_id'])->branch_getAreaList($params);
if($rs['rsp'] == 'succ' && $rs['data']){
$this->save($rs['data']);
return $rs;
}
}
function _formate_province($province)
{
$tranregion = preg_replace("/省|自治区|壮族自治区|回族自治区|维吾尔自治区|市|特别行政区/","",$province);
return $tranregion;
}
function _formate_city($city)
{
$tranregion = preg_replace("/市|州|自治州|地区|区划|县/","",$city);
return $tranregion;
}
function _formate_street ($street)
{
$tranregion = preg_replace("/市|区|县|镇|乡|街道|旗/","",$street);
return $tranregion;
}
/**
* 获取RegionByParentId
* @param mixed $shop_type shop_type
* @param mixed $outparent_id ID
* @return mixed 返回结果
*/
public function getRegionByParentId($shop_type,$outparent_id){
$regionsObj = app::get('eccommon')->model('platform_regions');
$regions = $regionsObj->getList('local_region_id,outregion_name',array('shop_type'=>$shop_type,'outregion_id'=>$outparent_id),0,1,'id desc');
$regions =current($regions);
return $regions;
}
/**
* 获取平台市、区、镇地区库(主要用于获取四级地区镇)
*
* @param $data
* @return void
*/
public function syncTown($params)
{
set_time_limit(0);
ini_set('memory_limit', '512M');
$regionsObj = app::get('eccommon')->model('platform_regions');
//setting
$result = array('rsp'=>'fail', 'error_msg'=>'');
$page = intval($params['page_no']);
$page_size = 1;
$shop_bn = $params['shop_bn'];
$offset = $page - 1;
//shop
$shopInfo = app::get('ome')->model('shop')->db_dump(array('shop_bn'=>$shop_bn));
if(empty($shopInfo)){
$result['error_msg'] = '店铺信息不存在!';
return $result;
}
$shop_id = $shopInfo['shop_id'];
//filter
$filter = array(
'shop_type' => $shopInfo['shop_type'], //店铺类型
'region_grade' => 1,
);
//count
$total_num = $regionsObj->count($filter);
//获取省级地区
$regionInfo = $regionsObj->getList('id,outregion_id,outregion_name,local_region_id,local_region_name', $filter, $offset, 1, 'id ASC');
$regionInfo = $regionInfo[0];
if(empty($regionInfo)){
$result['error_msg'] = '平台地区信息不存在!';
return $result;
}
//request
$params = array(
'outregion_id' => $regionInfo['outregion_id'],
'outregion_name' => $regionInfo['outregion_name'],
);
$res = kernel::single('erpapi_router_request')->set('shop', $shop_id)->branch_getAreasByProvince($params);
if($res['rsp'] != 'succ') {
$result['error_msg'] = '获取失败:'. $res['error_msg'];
return $result;
}
if(empty($res['data'])) {
$result['error_msg'] = '获取失败:没有获取到平台四级地区数据';
return $result;
}
//save
$insertData = $res['data'];
$this->save($insertData);
//本次拉取数据条数
$current_num = 1;
//data
$next_page = ($page + 1);
$data = array(
'rsp' => 'succ',
'current_page' => $page, //当前页码
'next_page' => $next_page, //下一页页码
'page_size' => $page_size, //每次拉取数量
'all_pages' => ceil($total_num / $page_size), //总页码
'total_num' => $total_num, //数据总记录数
'current_num' => $current_num, //本次拉取记录数
'current_succ_num' => $current_num, //处理成功记录数
'current_fail_num' => 0, //处理失败记录数
);
//是否拉取下一页(如果为0则无需拉取)
if ($data['current_page'] == $data['all_pages']) {
$data['next_page'] = 0;
}
return $data;
}
/**
* 获取PlatformRegions
* @param mixed $params 参数
* @param mixed $shop_type shop_type
* @return mixed 返回结果
*/
public function getPlatformRegions($params, $shop_type)
{
$regionsObj = app::get('eccommon')->model('platform_regions');
$regionLib = kernel::single('ome_region');
//setting
$data = array();
//get
$receiver_state = $params['receiver_state'];
$receiver_city = $params['receiver_city'];
$receiver_district = $params['receiver_district'];
$receiver_street = $params['receiver_street'];
//check
if(empty($receiver_state) || empty($receiver_city) || empty($receiver_district)){
return $data;
}
//兼容匹配平台特殊省份及自治区
$receiver_state_2 = $regionLib->matchingReceiverProvince($receiver_state);
//省
$filter = array(
'shop_type' => $shop_type,
'region_grade' => 1,
'outregion_name' => array($receiver_state, $receiver_state_2),
);
$regionInfo = $regionsObj->dump($filter, 'id,outregion_id,outregion_name');
if(empty($regionInfo)){
return $data;
}
$data['provinceCode'] = $regionInfo['outregion_id'];
$data['provinceName'] = $regionInfo['outregion_name'];
//市
$filter = array(
'shop_type' => $shop_type,
'region_grade' => 2,
'outregion_name' => $receiver_city,
'outparent_id' => $regionInfo['outregion_id'], //父级地区ID
);
$regionInfo = $regionsObj->dump($filter, 'id,outregion_id,outregion_name');
if(empty($regionInfo)){
return $data;
}
$data['cityCode'] = $regionInfo['outregion_id'];
$data['cityName'] = $regionInfo['outregion_name'];
//区
$filter = array(
'shop_type' => $shop_type,
'region_grade' => 3,
'outregion_name' => $receiver_district,
'outparent_id' => $regionInfo['outregion_id'], //父级地区ID
);
$regionInfo = $regionsObj->dump($filter, 'id,outregion_id,outregion_name');
if(empty($regionInfo)){
return $data;
}
$data['districtCode'] = $regionInfo['outregion_id'];
$data['districtName'] = $regionInfo['outregion_name'];
//check
if($receiver_street){
//镇
$filter = array(
'shop_type' => $shop_type,
'region_grade' => 4,
'outregion_name' => $receiver_street,
'outparent_id' => $regionInfo['outregion_id'], //父级地区ID
);
$regionInfo = $regionsObj->dump($filter, 'id,outregion_id,outregion_name');
if($regionInfo){
$data['townCode'] = $regionInfo['outregion_id'];
$data['townName'] = $regionInfo['outregion_name'];
}
}
return $data;
}
}