<?php
/**
	* @method 店铺分类的管理
	* @author 许
	* @copyright 2017/6/16
	*/
class B2cShopSort extends B2cBase
{
	/**
	  * @method 获取某店铺的店铺分类
	  * @param  $shopId 店铺ID
	  * @param  $cache  true|false   false:将重置缓存
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=> [1=>['sort_id'=>1, 'sot_psort_id'=>''], ....] ["code"]=> int(0) ]
	  */
	public function getAllShopSort($shopId, $cache = true)
	{
		$shopId = (int) $shopId;
		$file = mvc::$cfg['AUTOLOAD']['B2c']['path'].'cache/allShopSort'.$shopId.'.php';
		$resArr = [];
		if(!file_exists($file) || !$cache)
		{
			$parentArr = [];
			$where = sprintf(" and sort_shop_id=%d order by sort_seq ",$shopId);
			$res = $this->get('sh_sort left join sh_sort_tree on sort_id = sot_sort_id', ['sort_id', 'sot_psort_id psort_id', 'sort_name'],$where);
			foreach($res['data'] as $v)
			{
				$parentArr[$v['psort_id']][] = $v['sort_id'];
				$v['END'] = 0;
				$resArr[$v['sort_id']] = $v;
			}
			foreach($resArr as $k=>$v)
			{
				$resArr[$k]['END'] = empty($parentArr[$k])? 1: 0;
			}
			LibFc::ArraySave($resArr, $file);
		}
		else
		{//括起来为了防止读取文件失败
			$resArr = include($file);
		}
		return LibFc::ReturnData(true, $resArr);
	}


	/**
	  * @method 获取某店铺的店铺分类ztree树
	  * @param  $shopId 店铺ID
	  * @param  $checkedArr 选中的零件ID数组
	  * @param  $cache  true|false   false:将重置缓存
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=> [ztree data] ["code"]=> int(0) ]
	  */
	public function getShopSortZtree($shopId, $hasShopSortId,$cache = true)
	{
		$res = $this->getAllShopSort($shopId, $cache);
		$shopSortArr = [];
		foreach($res['data'] as $v)
		{
			$nochecked = $v['END'] ? false: true;
			$checked = in_array($v['sort_id'], $hasShopSortId)? true: false;
			$shopSortArr[] = ['id'=>$v['sort_id'], 'pId'=>$v['psort_id'], 'name'=>$v['sort_name'], 'open'=>true, 'nocheck'=>false, 'checked'=>$checked];
		}
		return LibFc::ReturnData(true, $shopSortArr);
	}


/**
	* @method 查询店铺分类的所有信息
	* @param  $shopId 店铺ID int
	* @author xu
	* @copyright 2017/06/29
	* @return  
		array(status=>true,'data'=>array(628=>array('sort_id'=>628,'sort_shop_id'=>1,'sort_name'=>'刹车片','sort_seq'=>2,'sort_keyword=>'',
		 'sot_sort_id'=>'12','sot_psort_id'=>'0','sot_path'=>'0',
		 'son'=>array(
				629=>array('sort_id'=>629,'sort_shop_id'=>1,
				'sort_name'=>'小刹车片','sort_seq'=>,'sort_keyword=>',
				'sot_sort_id'=>'629','sot_psort_id'=>628,'sot_path'=>'0,628',
				'son'=>array()
				)
			),650=>,...),code=>""
		);
	*/    
	public function getShopSort($shopId) 
	{
		//参数判断
		if(!LibFc::Int($shopId))
		{
			return LibFc::ReturnData(false,'参数错误！',0);
		}
		$table='sh_sort left join sh_sort_tree on sort_id=sot_sort_id';
		$data=$this->Get($table,['*'],' and sort_shop_id='.$shopId.' order by sort_seq asc');
		$data = $data['data'];
		//现在对data数组进行重组，实现能够显示出树状的数据的数组
		$new_data = array();
		foreach ($data as $k => $v)
		{
			if($v['sot_psort_id'] == 0)
			{
				$new_data[$v['sot_sort_id']] = $v;
				unset($data[$k]);
				continue;
			}
			$data[$k]['paths'] = explode(',', $v['sot_path']);
		}
		foreach($data as $k=>$v)
		{
			if(count($v['paths']) == 2)
			{
				$new_data[$v['paths'][1]]['son'][$v['sot_sort_id']] = $v;
				unset($data[$k]);
			}
		}
		return LibFc::ReturnData(true, $new_data);     
	}


/**
	* @method 检测删除子类是否合理
	* @param  $id 店铺分类ID int
	* @author xu
	* @copyright 2017/06/30
	* @return  array('status'=> true,'data'=>'success（可以删除）/hasGoods（含有商品）','code'=>0);
	*/       
	public function checkDelShopSort($id)
	{
		//参数判断，不能为null以及无整型匹配数据
		if(!LibFc::Int($id)) return LibFc::ReturnData(false,'参数错误！');
		
		$res = $this->get('bc_product_sort',['count(*) as num'],sprintf(' and prs_sort_id=%d',$id),true);

		$data = (!empty($res['data']['num']) && $res['data']['num']>0)?$res['data']['num']:0;

		return LibFc::ReturnData(true, $data);
	}


/**
	* @method 保存更改
	* @param  $shopId 店铺分类ID int
	* @param  $postdata 店铺分类表单数据 array
	* @author xu
	* @copyright 2017/06/30
	* @return
		成功：["status"=>true, "data"=>true]
		失败：["status"=>false, "data"=>'错误原因', 'code'=>""]
	*/ 
	public function saveShopSort($shopId, $postdata)
	{   
		//参数判断，不能为null以及无整型匹配数据
		if(!LibFc::Int($shopId))
		{
			return LibFc::ReturnData(false,'参数错误！',0);
		}
		$shopId = (int) $shopId;
		$res =$this->Get('sh_sort left join sh_sort_tree on sort_id=sot_sort_id' ,['sort_id'], sprintf(" and sort_shop_id=%d order by sot_path desc", $shopId));
		//所有的当前商户ID
		$allSortIdArr = [];
		foreach ($res['data'] as $value)
		{
			$allSortIdArr[] = $value['sort_id'];
		}
		if(!empty($postdata))
		{
			foreach($postdata as $k=>$v)
			{
				if(!LibFc::Int($k) || (!in_array($k, $allSortIdArr) && $k > 0))
				{    
					//去除非本店铺的分类ID，防止修改其他店铺分类数据
					unset($postdata[$k]);
				}
			}
		}
		else
		{
			$postdata = array();
		}
		$delSortIdArr = array_diff($allSortIdArr, array_keys($postdata));
		$OthCheck = new OthCheck();
		//开启事务
		$this->B2CDb->Begin();
		//此时删除的分类已经通过上一级逻辑删除的验证可以会直接删除
		if(!empty($delSortIdArr))
		{   
			$OthCheck->rule('SC03');
			//删除该分类和商品的关系表
			$this->del('bc_product_sort', sprintf(" and prs_sort_id in (%s)", implode(',', $delSortIdArr)));
			//删除分类表
			$this->del('sh_sort', sprintf(" and sort_id in (%s)", implode(',', $delSortIdArr)));
			//删除分类父子级关系表
			$this->del('sh_sort_tree', sprintf(" and sot_sort_id in (%s)", implode(',', $delSortIdArr)));
		}
		//用于存放新增的大类和小类之间的id=>pid关系
		$newDataSon = array();
		foreach($postdata as $key => $value)
		{   
			if($key>0)
			{
				$OthCheck->rule('SC02');
				//更新数据，就是仅仅保存具有ID的数据
				$table = "sh_sort";
				$new_data = array(
						'sort_id'=>$key,
						'sort_shop_id'=>$shopId,
						'sort_name'=>$value['name'],
						'sort_seq'=>$value['seq']+1
						);
				$Where =sprintf(' and sort_id =%d and sort_shop_id =%d',$key,$shopId);
				$this->set($table,$new_data,$Where);
			}
			if($key<0)
			{
				$OthCheck->rule('SC01');
				//现在是对新增的数据进行入库
				//首先入库第一个表
				$table = 'sh_sort';
				$new_data = array(
					'sort_shop_id'=>$shopId,
					'sort_name'=>$value['name'],
					'sort_seq'=>$value['seq']+1,
					'sort_open'=>empty($value['sort_open'])?0:$value['sort_open']
					);
				 
				 $data = $this->add($table,$new_data);
				 $newDataSon[$key] = $data['data'];
				 //入库第二张表
				if($value['pid']>0){
					//这个是给旧父类添加子类
					$table = 'sh_sort_tree';
					$path =  str_replace('\'',"",$value['path']);
					$path = str_replace('\'', "",$value['path']);
					$path = $path.','.$value['pid'];
					$new_data = array(
							'sot_sort_id'=>$data['data'],
							'sot_psort_id'=>$value['pid'],
							'sot_path'=>$path
					);
				}
				else
				{
					//这个是新添加的数据，他们pid为0的时候表示添加的一级，若pid<0的时候添加的是二级
					$table = 'sh_sort_tree';
					if($value['pid']<0)
					{
							//这个时候要注意啦，需要获取pid为-8..的id作为其父ID，而且还有拼接path
							$new_data = array(
									'sot_sort_id'=>$data['data'],
									'sot_psort_id'=>$newDataSon[$value['pid']],
									'sot_path'=>'0,'.$newDataSon[$value['pid']]
									);
					}
					else
					{
							$new_data = array(
									'sot_sort_id'=>$data['data'],
									'sot_psort_id'=>0,
									'sot_path'=>0
									);
					}
				}
				$this->add($table,$new_data);
			}
		}
		//提交事务
		$this->B2CDb->End();
		return LibFc::ReturnData(true, true);
	}
	/**
	 * @method    获取该ID下末级子类(未去重)
	 * @param     [array]       $tree [所有树数据]
	 * @param     [int]      $sort [父级分类id]
	 * @return    [array]      ['status'=>true,'data'=>[1,2,3,4,5]]  配件ID 
	 * @author 卢
	 * @copyright 2017-07-25
	 */
	public function getEndSortIds($tree,$sort=0)
	{
		if(is_array($tree))
		{
			if($sort==0)
			{
				$data=array_keys($tree);
				// print_r($data);
			}
			else
			{
				foreach ($tree as $k => $v) 
				{
					if(($v['sort_id']==$sort||$v['psort_id']==$sort)&&$v['END']>0)
					{
						$data[]=$v['sort_id'];
						continue;
					}
				}
			}
			return LibFc::ReturnData(true,$data);
		}
		return LibFc::ReturnData(false,'参数不正确');
	}

/**
	* @method 查询店铺分类的所有信息(限定店铺分类信息)
	* @param  $shopId 店铺ID int
	* @param  $sortIds 分类ID array
	* @author xu
	* @copyright 2017/10/11
	* @return  
		array(status=>true,'data'=>array(628=>array('sort_id'=>628,'sort_shop_id'=>1,'sort_name'=>'刹车片','sort_seq'=>2,'sort_keyword=>'',
		 'sot_sort_id'=>'12','sot_psort_id'=>'0','sot_path'=>'0',
		 'son'=>array(
				629=>array('sort_id'=>629,'sort_shop_id'=>1,
				'sort_name'=>'小刹车片','sort_seq'=>,'sort_keyword=>',
				'sot_sort_id'=>'629','sot_psort_id'=>628,'sot_path'=>'0,628',
				'son'=>array()
				)
			),650=>,...),code=>""
		);
	*/    
	public function getShopSortLimit($shopId,$sortIds) 
	{
		//参数判断
		if(!LibFc::Int($shopId))
		{
			return LibFc::ReturnData(false,'参数错误！',0);
		}
		if(!is_array($sortIds))
		{
			return LibFc::ReturnData(false,'参数错误！',0);
		}
		$newSortIds = array();
		foreach ($sortIds as $key => $value) {
			$newSortIds[] = (int)$value;
		}
		$newSortIds = implode(',',$newSortIds);
		$table='sh_sort left join sh_sort_tree on sort_id=sot_sort_id';
		$data=$this->Get($table,['*'],' and sort_shop_id='.$shopId.' and sort_id in ('.$newSortIds.')');
		$data = $data['data'];
		//现在对data数组进行重组，实现能够显示出树状的数据的数组
		$new_data = array();
		foreach ($data as $k => $v)
		{
			if($v['sot_psort_id'] == 0)
			{
				$new_data[$v['sot_sort_id']] = $v;
				unset($data[$k]);
				continue;
			}
			$data[$k]['paths'] = explode(',', $v['sot_path']);
		}
		foreach($data as $k=>$v)
		{
			if(count($v['paths']) == 2)
			{
				$new_data[$v['paths'][1]]['son'][$v['sot_sort_id']] = $v;
				unset($data[$k]);
			}
		}
		return LibFc::ReturnData(true, $new_data);     
	}

	/**
	 * @method    更新配件的店铺分类
	 * @param     [int] $proid [配件id]
	 * @param     [array]  $sortArr [所有配件分类名称]
	 * @return    [array] [true,true] 
	 * @author    xu
	 * @copyright 2018-03-02
	 */
	public function updateProSort($shopId,$proid,$sortArr)
	{
		if(!is_array($sortArr) || !LibFc::Int($proid) || !LibFc::Int($shopId)) return LibFc::ReturnData(false,'updateProSort 参数不正确');
		$sortArr = array_filter(array_map('trim', $sortArr));
		if(empty($sortArr)) return LibFc::ReturnData(false,'updateProSort 配件分类为空！');

		$this->B2CDb->Begin(); 
		// 关系表
		$this->del('bc_product_sort',sprintf(" and prs_pro_id=%d ",$proid));

		foreach ($sortArr as $k => $v)
		{
			// 分类值表
			$res = $this->get('sh_sort',['sort_id'],sprintf(" and sort_shop_id=%d and sort_name='%s' ",$shopId,$v),true);
			if(!empty($res['data'])) 
			{
				$sortId = $res['data']['sort_id'];
				// 层级表不存在
				$res = $this->get('sh_sort_tree',['*'],sprintf('and sot_sort_id=%d',$sortId));
				if(empty($res['data'])) $this->add('sh_sort_tree',['sot_sort_id'=>$sortId,'sot_psort_id'=>0,'sot_path'=>0]);

			}
			else
			{
				// 分类值表
				$data = $this->add('sh_sort',['sort_shop_id'=>$shopId,'sort_name'=>$v,'sort_open'=>1]);
				$sortId = $data['data'];
				// 层级表
				$this->add('sh_sort_tree',['sot_sort_id'=>$sortId,'sot_psort_id'=>0,'sot_path'=>0]);
			}
			// 关系表
			$this->add('bc_product_sort',['prs_pro_id'=>$proid,'prs_sort_id'=>$sortId]);
		}
		//提交事务
		$this->B2CDb->End();
		return LibFc::ReturnData(true,true);
	}


	/**
	 * @method   通过名称查询店铺分类ID
	 * @param $shopId int 商家店铺ID
	 * @param $sortArr array ['刹车片'....]
	 * @author	soul
	 * @copyright 2018/6/8
	 * @return ['status'=>true,'data'=>['刹车片'=>1]]
	 */
	public function getAddShopSortId($shopId, $sortArr)
	{
		$shopId = (int) $shopId;
		$arr = [];
		if($shopId > 0 && !empty($sortArr))
		{
			$temp = [];
			$temp2 = [];
			foreach($sortArr as $sort)
			{
				$sort = trim($sort);
				if($sort == '') continue;
				$temp[] = sprintf("'%s'", $sort);
				$temp2[strtoupper($sort)] = $sort;
			}
			if(!empty($temp))
			{
				$res = $this->get('sh_sort', ['sort_id', 'sort_name'], sprintf(" and sort_name in (%s) and sort_shop_id=%d", implode(',', $temp), $shopId));
				foreach($res['data'] as $v)
				{
					$orcVal = $temp2[strtoupper($v['sort_name'])];
					$arr[$orcVal] = $v['sort_id'];
					unset($temp2[$orcVal]);
				}
			}

			$this->B2CDb->Begin(); 
			foreach($temp2 as $sort)
			{
				$res = $this->add('sh_sort',['sort_shop_id'=>$shopId,'sort_name'=>$sort,'sort_open'=>1]);
				$sortId = $res['data'];
				$this->add('sh_sort_tree',['sot_sort_id'=>$sortId,'sot_psort_id'=>0,'sot_path'=>0]);
				$arr[$sort] = $sortId;
			}
			$this->B2CDb->End(); 
		}
		return LibFc::ReturnData(true, $arr);
	
	}
	/**
	 * @param  int $shopId
	 * @param  array $sortIdArr [1,2,3,4....]
	 * @method 通过店铺分类ID查找其父类ID
	 * @author zhengweihua 
	 * @copyright 2023-07-28
	 */
	public function getShopParentById($shopId,$sortIdArr)
	{
		$shopId = (int) $shopId;
		$arr = [];
		if($shopId > 0 && !empty($sortIdArr)){
			$res = $this->get('sh_sort JOIN sh_sort_tree on sot_sort_id = sort_id', ['sot_psort_id'], sprintf(" and sort_id in (%s) and sot_psort_id!=0 and sort_shop_id=%d", implode(',', $sortIdArr), $shopId));
			if($res['data']){
				$arr = array_unique(array_column($res['data'],'sot_psort_id'));
			}
		}
		return LibFc::ReturnData(true, $arr);
	}

}