<?php

class B2cUser extends B2cBase
{
	/**
	  * @method 用户登录
	  * $dataArr  token ['utag'=> '', 'from'=>]
	  * $dataArr  weixin ['unionid'=>'', 'from'=>]
	  * $dataArr  password ['name'=>'', 'password'=>'', 'from'=>]
	  * @author soul 2017/6/22
	  */
	public function loginByAny($type, $dataArr)
	{
		$LibYpApi = new LibYpApi();
		$postArr = [];
		switch($type)
		{
			case 'token':
				$utagArr = explode('@', base64_decode($dataArr['utag']));
				$res = $LibYpApi->Get('user/getToken', ['uid'=>$utagArr[1], 'uname'=>$utagArr[0]], [], true);
				if($res['status'] && !empty($res['data']['token']))
				{
					$postArr = [
						'type'=>'token',
						'data'=>['token'=>$res['data']['token']],
						'lang'=>'cn'
					];
				}
			break;
			case 'weixin':
				$postArr = [
					'type'=>'weixin',
					'data'=>['unionid'=>$dataArr['unionid'],'openid'=>$dataArr['openid']],
					'lang'=>'cn'
				];
			break;
			case 'password':
				$postArr = [
					'type'=>'password',
					'data'=>['name'=>$dataArr['name'],'password'=>$dataArr['password']],
					'lang'=>'cn'
				];
			break;
		}
		$postArr['data']['ip'] = LibFc::GetClientIp();
		$postArr['data']['from'] = empty($dataArr['from'])? 'PJD': $dataArr['from'];
		$LibYpApi = new LibYpApi();
		return $LibYpApi->Get('user/login', [], $postArr, true);
	}





	/**
	  * @method 同步用户表
	  * @author soul 2017/6/22
	  */
	public function updateUserByApi()
	{
		//2022/11/12 已在注册API处理
		return LibFc::ReturnData(true);
		$B2cBase = new B2cBase();
		$res = $B2cBase->get('us_user_base', ['max(ub_uid) ub_uid'], '', true);
		$maxUid = empty($res['data']['ub_uid']) ? 0: $res['data']['ub_uid'];
		$YpwBase = new YpwBase();
		while(1)
		{
			$res = $YpwBase->get('yp_user', ['u_id', 'u_name'], sprintf(" and u_id > %d order by u_id limit 1000", $maxUid));
			if(empty($res['data'])) break;
			foreach($res['data'] as $v)
			{
				$B2cBase->add('us_user_base', ['ub_uid'=>$v['u_id'], 'ub_username'=>$v['u_name']]);
				$maxUid = $v['u_id'];
			}
		}
		return LibFc::ReturnData(true);
	}
	
	/**
	  * @method 获取用户当前的默认车型
	  * @param  $userId 用户ID
	  * @author soul
	  * @copyright 2018/1/19
	  * @return [["status"]=> bool(true) ["data"]=> mod3Id ["code"]=> int(0) ]
	  */
	public function getUserNowCar($userId = 0)
	{
		$mod3Id = 0;
		//非第一次浏览
		$autoGet = isset($_COOKIE['autoCar']) ? (int) $_COOKIE['autoCar']: 1;
		setCookie('autoCar', $autoGet, time()+3600*24*7, '/');
		if($autoGet)
		{
			$userId = (int) $userId;
			if($userId > 0)
			{
				$res = $this->get('us_mycar', ['myc_mod3_id'], SPRINTF(" and myc_uid=%d order by myc_ltime desc", $userId), true);
				$mod3Id = (int) $res['data']['myc_mod3_id'];
			}
			else if(!empty($_COOKIE['carHistiry']))
			{
				$res = current(explode('|', $_COOKIE['carHistiry']));
				$mod3Id = current(explode(':', $res));
			}
		}
		return LibFc::ReturnData(true, $mod3Id);
	}
	
	
	/**
	 * @method    更新会员积分
	 * @param     [int]             $userId  [用户ID]
	 * @param     [int]             $num     [增加|减少的积分数量]
	 * @param     [string]             $type    [积分类型： login(登录)  签到(sign_in)   order(订单-完成获取积分 抵扣金额消耗积分)   comment(订单评价)  gift(赠送)]
	 * @param     boolean            $isAdd   [是否为添加（默认添加）]
	 * @param     string             $dataArr [array('inl_des'=>xxxx,'inl_remark'=>xxx,'inl_by'=>xxx) 积分变化说明,备注（支付明细...）,操作人]
	 * @return    [bool]                      
	 * @author 卢
	 * @copyright 2017-08-09
	 */
	public function changeUserIntegral($userId,$num,$type,$isAdd=true,$dataArr='')
	{
		if(LibFc::Int($userId)&&LibFc::Int($num)&&!empty($type))
		{
			$res=$this->Get('us_user_base',['ub_integral'],' and ub_uid='.$userId,true);
			if($res['data']['ub_integral']<$num&&$isAdd==false)
			{
				return LibFc::ReturnData(false,'积分不足',"");
			}
			$dataArr['inl_uid']=$userId;
			$dataArr['inl_type']=$type;
			$dataArr['inl_change']=$isAdd? $num:-$num;
			$dataArr['inl_has']=$isAdd? ($res['data']['ub_integral']+$num) : ($res['data']['ub_integral']-$num);
			$dataArr['inl_add_time']=time();
			$this->B2CDb->Begin();
			$interageRes= $this->Add('us_integral_list',$dataArr);
			$dataArr['inl_id']=$interageRes['data'];

			$this->Set('us_user_base',['ub_integral'=>$dataArr['inl_has']],' and ub_uid='.$userId);
			$this->B2CDb->End();
			return LibFc::ReturnData(true,true,"");
		}
		return LibFc::ReturnData(false,'参数错误',"");
	}

	/**
	  * @method 提交订单之后添加店铺会员为零级(主要方便在会员管理处查询店铺的成交客户)
	  * @param  $shopId 店铺ID
	  * @param  $userId 用户ID
	  * @author xu
	  * @copyright 2017/10/27
	  * @return [["status"]=> bool(true) ["data"]=> [data] ["code"]=> int(0) ]
	  */
	public function addMemLinkZero($shopId, $userId)
	{
		if(!LibFc::Int($shopId) || !LibFc::Int($userId))
		{
			return LibFc::ReturnData(false,'参数错误！');
		}
		// 查询当前用户是否已经在会员link表之中有记录
		$res = $this->get('sh_member_link',['*'],sprintf(" and meml_uid=%d and meml_shop_id=%d ",$userId,$shopId),true);
		if(!empty($res['data']))
		{
			return LibFc::ReturnData(true, true);
		}
		$dataArr = array(
			'meml_uid' => (int)$userId,
			'meml_shop_id' => (int)$shopId,
			'meml_mem_id' => 0,
			'meml_add_time' =>time()
		);
		$res = $this->add('sh_member_link',$dataArr);
		if($res['data']>0)
		{
			return LibFc::ReturnData(true, true);
		}
		else
		{
			return LibFc::ReturnData(false,'参数错误！');
		}
	}



	/**
	  * @method 去除当前用户与当前店铺的会员表link关系
	  * @param  $shopId 店铺ID
	  * @param  $userId 用户ID
	  * @author xu
	  * @copyright 2017/10/27
	  * @return [["status"]=> bool(true) ["data"]=> [data] ["code"]=> int(0) ]
	  */
	public function delMemLinkZero($shopId, $userId)
	{
		if(!LibFc::Int($shopId) || !LibFc::Int($userId))
		{
			return LibFc::ReturnData(false,'参数错误！');
		}
		// 查询当前用户是否有成交记录
		$res = $this->get(' or_order ',['*'],sprintf(" and ord_status not in ('cancel','creat') and ord_uid=%d and ord_shop_id=%d ",$userId,$shopId));
		$hasOrder = $res['data'];
		// 查询当前用户会员等级是否零级别
		$res = $this->get('sh_member_link',['*'],sprintf(" and meml_uid=%d and meml_shop_id=%d ",$userId,$shopId),true);
		$linkLevel = $res['data']['meml_mem_id'];
		// 既是零级又无成交记录就删除关联关系
		if(!$linkLevel && empty($hasOrder))
		{
			$this->del('sh_member_link',sprintf(" and meml_uid=%d and meml_shop_id=%d ",$userId,$shopId));
		}
		return LibFc::ReturnData(true, true);
	}

	/**
	  * @method 合并cookie到database
	  * @param  $cartHistory cookie浏览历史
	  * @param  $userId 用户ID
	  * @author xu
	  * @copyright 2017/12/26
	  * @return [["status"]=> bool(true) ["data"]=> [data] ["code"]=> int(0) ]
	  */
	public function mergeMycar($cartHistory, $userId)
	{
		if(!is_array($cartHistory) || !LibFc::Int($userId))
		{
			return LibFc::ReturnData(false,'参数错误！');
		}

		// 过滤数组
		foreach ($cartHistory as $k => $v)
		{
			$cartHistory[$k]['mod3Id'] = (int)$v['mod3Id'];
			$cartHistory[$k]['coll'] = (int)$v['coll'];
		}


		// 获取数据库之中用户浏览历史
		$res = $this->get('us_mycar',['*'],sprintf(" and myc_uid=%d ",$userId));
		$res = $res['data'];
		// 拼接数组用于获取差集
		$newres = array();
		// database之中所有mode3id
		$allDataMode3id = array();

		foreach ($res as $k => $v)
		{
			$newres[] = array('mod3Id'=>$v['myc_mod3_id'],'coll'=>$v['myc_coll']);
			$allDataMode3id[] = $v['myc_mod3_id'];
		}


		// 获取cookie中需要新增的
		$addHistory = array();
		//cookie之中编辑状态的
		$editHsitory = array();

		// 求出两个数组差集
		$diff = array_filter($cartHistory, function($v) use ($newres) { return ! in_array($v, $newres);});

		// 寻找两个都有的mode3id
		$sameMode3Id = array();
		foreach ($diff as $k => $v)
		{
			foreach ($newres as $kk => $vv)
			{
				if($vv['mod3Id']==$v['mod3Id'])
				{
					$sameMode3Id[] = $v['mod3Id'];
				}	
			}
		}
		
		foreach ($diff as $k => $v)
		{
			if(in_array($v['mod3Id'], $sameMode3Id))
			{
				$editHsitory[$k] = $v;
			}
			else
			{
				$addHistory[$k] = $v;
			}
		}

		// 开启事务

		$this->B2CDb->Begin();

		// 更新SQL之中状态值和时间
		if(!empty($editHsitory))
		{
			foreach ($editHsitory as $k => $v)
			{
				$where = sprintf(" and myc_uid=%d and myc_mod3_id=%d ",$userId,$v['mod3Id']);
				$temp = array('myc_coll'=>$v['coll'],'myc_ltime'=>time()-$k);
				// 修改记录
				$this->set('us_mycar',$temp,$where);
			}
		}
		// 新增浏览历史
		if(!empty($addHistory))
		{
			foreach ($addHistory as $k => $v)
			{
				// 获取用户浏览记录（收藏）最多五条
				if($v['coll']==1)
				{
					$res = $this->get('us_mycar',['*'], sprintf(" and myc_uid=%d and myc_coll=1 order by myc_ltime asc ",$userId));
					$res = $res['data'];
					
					if(count($res)>5)
					{
						$first = current($res);
						// 删除最先录入数据库的那一条记录
						$this->del('us_mycar',sprintf(" and myc_uid=%d and myc_coll=1 and myc_mod3_id=%d ",$userId,$first['myc_mod3_id']));
					}
				}
				else
				{
					// 获取用户浏览记录（非收藏）
					$res = $this->get('us_mycar',['*'], sprintf(" and myc_uid=%d and myc_coll=0 order by myc_ltime asc ",$userId));
					if(count($res)>10)
					{
						$first = current($res);
						// 删除最先录入数据库的那一条记录
						$this->del('us_mycar',sprintf(" and myc_uid=%d and myc_coll=1 and myc_mod3_id=%d ",$userId,$first['myc_mod3_id']));
					}
				}
				// 新增一条浏览历史
				$dataArr = array(
					'myc_uid'=>$userId,
					'myc_mod3_id'=>$v['mod3Id'],
					'myc_atime'=>time()-$k,
					'myc_coll'=>$v['coll'],
					'myc_ltime'=>time()-$k
				);
				$this->add('us_mycar',$dataArr);
			}
		}

		// 提交事务

		$this->B2CDb->End();

		return LibFc::ReturnData(true, true);
	}
	/**
	 * @method    申请企业会员入库处理
	 * @param     [arr]     $dataArr [入库数组]
	 * @param     [int]     $uid     [用户ID]
	 * @param     bool    $add     [true 为添加 false 为修改]
	 * @return    [arr]              ['status'=>true,'data'=>true]
	 * @author 卢
	 * @copyright 2018-04-02
	 */
	public function applyCom($dataArr,$uid,$add=true)
	{
		if(is_array($dataArr)&&!empty($dataArr['comName'])&&!empty($dataArr['societyCode'])&&!empty($uid))
		{
			//校验是否已经是企业会员
			$res=$this->get('us_user_base',['ub_level'],sprintf(' and ub_uid=%d',$uid),true);
			if(!empty($res['data'])&&$res['data']['ub_level']>0)
			{
				return LibFc::ReturnData(false, '该用户已经是企业会员，无需重复申请！');
			}
			$targetArr=[];
			if(empty($dataArr['comName']))
				return LibFc::ReturnData(false, '企业名称不能为空！');
			else
				$targetArr['ub_com_name']=$dataArr['comName'];

			if(!LibFc::RegularValida($dataArr['comName'],'companyName'))
				return LibFc::ReturnData(false, '企业名称格式错误！');

			if(empty($dataArr['societyCode']))
				return LibFc::ReturnData(false, '统一社会信用代码不能为空！');
			else
				$targetArr['ub_com_code']=$dataArr['societyCode'];

			if(!LibFc::RegularValida($dataArr['societyCode'],'societyCode'))
				return LibFc::ReturnData(false, '统一社会信用代码格式错误！');

			//校验统一社会信用代码和企业名称唯一
			$res=$this->get('us_user_base',['ub_com_code','ub_com_name'],sprintf(" and ub_uid!=%d and (ub_com_code='%s' or ub_com_name='%s')",$uid,LibFc::Escape($dataArr['societyCode']),LibFc::Escape($dataArr['comName'])));
			if($res['data'])
			{
				foreach ($res['data'] as $v) 
				{
					if($targetArr['ub_com_name']==$v['ub_com_name'])
						return LibFc::ReturnData(false, '企业名称已被使用！');
					if($targetArr['ub_com_code']==$v['ub_com_code'])
						return LibFc::ReturnData(false, '社会信用代码已被使用！');
				}
			}
			if(count($dataArr['province']))
				$targetArr['ub_com_pct_ids']=implode(',',$dataArr['province']);
			else
				$targetArr['ub_com_pct_ids']='';
			if(!empty($dataArr['licenceImg']))
				$targetArr['ub_com_license']=$dataArr['licenceImg'];
			else
				return LibFc::ReturnData(false, '营业执照不能为空！');
			$imgArr=[];
			foreach ($dataArr['comImgs'] as $v) 
			{
				if(empty(trim($v)))
					return LibFc::ReturnData(false, '企业门面照不能为空！');
				else
					$imgArr[]=$v;
			}
			if(count($imgArr))
				$targetArr['ub_com_img']=implode(',',array_filter($imgArr));
			else
				return LibFc::ReturnData(false, '企业门面照不能为空！');
			foreach ($dataArr['cardImgs'] as $v) 
			{
				if(empty($v))
					return LibFc::ReturnData(false, '法人身份证照片不能为空！');
			}
			if(count($dataArr['cardImgs']))
				$targetArr['ub_com_idcard']=implode(',',array_filter($dataArr['cardImgs']));
			else
				$targetArr['ub_com_idcard']='';
			
			$applyArr=[
				'uca_uid'=>$uid,
				'uca_status'=>0,
				'uca_atime'=>time()
			];
			$this->B2CDb->Begin();
			$this->set('us_user_base',$targetArr,sprintf(' and ub_uid=%d',$uid));
			if($add)
			{
				$this->add('us_com_apply',$applyArr);
			}
			else
			{
				$this->set('us_com_apply',['uca_atime'=>time(),'uca_status'=>0],sprintf(' and uca_uid=%d',$uid));
			}
			$this->B2CDb->End();
			return LibFc::ReturnData(true, true);
		}
		return LibFc::ReturnData(false, 'applyCom 参数不正确');
	}
	/**
	 * @method    修改申请状态
	 * @param     [arr]         $dataArr [us_com_apply  字段数组]
	 * @param     [int]         $userId  [用户ID]
	 * @param     [int]         $status  [状态id]
	 * @author 卢
	 * @copyright 2018-04-02
	 */
	function setApplyStatus($dataArr,$userId,$status)
	{
		if(is_array($dataArr)&&!empty($userId)&&in_array($status, ['-1','0','1','2']))
		{
			switch ($status) 
			{
				case '2':
					$comStatus=1;
					break;				
				default:
					$comStatus=0;
					break;
			}
			$this->B2CDb->Begin();
			$this->set('us_com_apply',$dataArr,sprintf(' and uca_uid=%d',$userId));
			$this->set('us_user_base',['ub_level'=>$comStatus],sprintf(' and ub_uid=%d',$userId));
			$this->B2CDb->End();
			return LibFc::ReturnData(true, true);
		}
		return LibFc::ReturnData(false, 'setApplyStatus 参数不正确');
	}


	/**
	 * @method    设置会员等级
	 * @param     [int|arr]		$id 会员id
	 * @param     [int]         $level  [等级ID]
	 * @author 		xu
	 * @copyright 2018-04-02
	 */
	function setUserMemLevel($id,$level,$shopId)
	{
		if(!is_array($id)) $id = [$id];
		if(empty($ids = array_filter($id,"LibFc::Int")) || !LibFc::Int($level) ||!LibFc::Int($shopId))
			return LibFc::ReturnData(false, 'setUserMemLevel 参数不正确');
		
		$this->B2CDb->Begin();

		$this->del('sh_member_link',sprintf("and meml_uid in (%s) and meml_shop_id=%d ",implode(',', $ids),$shopId));
		$res = $this->get('sh_member',['mem_id'],sprintf("and mem_shop_id=%d and mem_mel_id=%d",$shopId,$level),true);
		if(empty($res['data']))
			return LibFc::ReturnData(false, 'setUserMemLevel 参数不正确');
		$memId = $res['data']['mem_id'];
		foreach ($ids as $k => $v)
		{
			$this->add('sh_member_link',['meml_uid'=>$v,'meml_mem_id'=>$memId,'meml_add_time'=>time(),'meml_shop_id'=>$shopId]);	
		}
		$this->B2CDb->End();
		return LibFc::ReturnData(true, true);
	}

	function getUserMember($uid=0,$shopId=0)
	{
		if(LibFc::Int($uid)&&LibFc::Int($shopId))
		{
			//获取该会员在店铺里的级别
			$table = 'sh_member_link join sh_member on mem_id=meml_mem_id and mem_status=1 and meml_shop_id=mem_shop_id';
			$levelRes = $this->get($table, ['mem_mel_id'], sprintf(" and meml_shop_id=%d and meml_uid=%d", $shopId, $uid), true);
			return $levelRes;
		}
		return LibFc::ReturnData(false, '参数不正确');
	}

	/**
	 * @method    检测店铺注册会员并新增
	 * @param     int   $shopId  店铺ID
	 * @param     int $uid 用户ID
	 * @author 	  zhengweihua 
	 * @copyright 2022-09-13
	 */
	function checkShopUser($shopId=0,$uid =0)
	{
		if(LibFc::Int($uid)&&LibFc::Int($shopId))
		{
			$userRes = $this->get('sh_shop_user', ['sus_uid'], sprintf(" and sus_uid=%d and sus_shop_id=%d",$uid, $shopId), true);

			if(empty($userRes['data']))
			{
				$YpwBase = new YpwBase();
				$dataArr = $YpwBase->get('yp_user',['u_id','u_register_time'],sprintf(" and u_id=%d",$uid),true);
				$addArr = [
					'sus_shop_id'=>$shopId,
					'sus_uid'=>$uid,
					'sus_atime'=>$dataArr['data']['u_register_time']??time()
				];
				$this->add('sh_shop_user',$addArr);
				return LibFc::ReturnData(true, true);	
			}
			return LibFc::ReturnData(true,true);
		}
		return LibFc::ReturnData(false, '参数不正确');
	}

	/**
	 * @param  array $uids
	 * @param  array  $levelArr
	 * @method 提交新增会员表单
	 * @author zhengweihua 
	 * @copyright 2022-09-13
	 */
	public function submitNewUid($uids, $shopId = 0, $levelArr = [])
	{
		if (empty($levelArr) || empty($uids) || empty($shopId))  return LibFc::ReturnData(false, '参数不正确');

		$this->B2CDb->Begin();
		foreach ($uids as $k => $v) 
		{
			
			if ($v[0] == -1) 
			{
				$this->del('sh_member_link', sprintf(" and meml_uid=%d and meml_shop_id=%d", $v[1], $shopId));
			} 
			else 
			{
				if (!LibFc::Int($v[0]) || empty($levelArr[$v[0]]) || !LibFc::Int($v[1])) continue;
				$res = $this->get('sh_member_link', ['*'], sprintf(" and meml_uid=%d and meml_shop_id=%d ", $v[1], $shopId));
				if (empty($res['data'])) 
				{
					$this->checkShopUser($shopId, $v[1]);
					// 新增会员
					$data = ['meml_uid' => $v[1], 'meml_mem_id' => $levelArr[$v[0]], 'meml_add_time' => time(), 'meml_shop_id' => $shopId];
					if (isset($v[2])) $data['meml_remark'] = $v[2];
					$this->add('sh_member_link', $data);
				} else 
				{
					// 修改等级
					$data = ['meml_mem_id' => $levelArr[$v[0]]];
					if (isset($v[2])) $data['meml_remark'] = $v[2];
					$this->set('sh_member_link', $data, sprintf(" and meml_uid=%d and meml_shop_id=%d", $v[1], $shopId));
				}
			}
		}
		$this->B2CDb->End();
		return LibFc::ReturnData(true,true);
	}

	/**
	 * @param  array|int $uids 
	 * @param  int    $shopId
	 * @method 删除店铺用户
	 * @author zhengweihua 
	 * @copyright 2022-09-13
	 */
	public function delShopMemUser($uids, $shopId = 0)
	{	
		if(empty($uids))  return LibFc::ReturnData(false, '参数不正确');
		if(is_array($uids)){
			$where = sprintf(" and meml_shop_id=%d and meml_uid in (%s)",$shopId,implode(',',$uids));
			$userWhere = sprintf(" and sus_shop_id=%d and sus_uid in (%s)",$shopId,implode(',',$uids));
		}else{
			$where = sprintf(" and meml_shop_id=%d and meml_uid = %d",$shopId,$uids);
			$userWhere = sprintf(" and sus_shop_id=%d and sus_uid = %d",$shopId,$uids);
		}
		$this->B2CDb->Begin();
		$res =  $this->del('sh_member_link',$where);
		$res =  $this->del('sh_shop_user',$userWhere);
		$this->B2CDb->End();
		return LibFc::ReturnData(true,true);
	}
}