<?php
/**
  * @method 跑街令 用户操作
  * @author soul
  * @copyright 2018/7/23
  */
class PjlUser extends PjlBase
{
	public $HDCFG = [];	
	public function __construct()
	{
		parent::__construct();
		LibFc::useMainDb();
		$this->HDCFG = mvc::$cfg['HDCFG'];
	}

	/**
	  * @method 初始化此平台的会员信息
	  * @param  $uid 宜配会员ID
	  * @author soul
	  * @copyright 2018/7/23
	  * @return ["status"=> bool(true), "data"=>'', "code"=>""]
	  */
	public function initUser($uid)
	{
		$uid = (int) $uid;
		$res = $this->get('pl_user', ['pu_uid'], sprintf(" and pu_uid=%d", $uid), true);
		if(empty($res['data']))
		{
			$YpwUser = new YpwUser();
			$res = $YpwUser->GetUser(['u_id'], sprintf(" AND u_id =%d", $uid), true);
			if(empty($res['data']))
				return LibFc::ReturnData(false, '账号信息'.$uid.'不存在！');
			$this->add('pl_user', ['pu_uid'=>$uid, 'pu_atime'=>time()]);
		}
		return LibFc::ReturnData(true);
	}


	/**
	  * @method 修改会员的信用分  
	  * @param  $uid 宜配会员ID
	  * @param  $score 分值变化  发布采购-0.5 成交+1 满分100
	  * @param  $txt 说明
	  * @author soul
	  * @copyright 2018/7/23
	  * @return ["status"=> bool(true), "data"=>'', "code"=>""]
	  */
	public function changeUserCredit($uid, $score, $txt)
	{
		$uid = (int) $uid;
		$filterNum = ['-0.5','1','0.5'];
		if ($uid > 0 && in_array($score, $filterNum) && !empty($txt))
		{
			$where = sprintf('and pu_uid = %d', $uid);
			// 获取用户当前的信用分
			$nowScore = $this->get('pl_user',['pu_credit_score'], $where,true);
			$nowScore = $nowScore['data']['pu_credit_score'];
			if ($nowScore === null)
				return LibFc::ReturnData(false, '该用户不存在');
			$setScore = $nowScore + $score;
			if ($setScore < 0)
				return LibFc::ReturnData(false, '用户信用分过低');

			//信用分不超过 100
			$setScore = $setScore > 100 ? 100 : $setScore;

			//开启事务
			$this->PjlDb->Begin();
			//更新用户信用分
			$this->set('pl_user',['pu_credit_score'=>$setScore],$where);
			//更新信用分表动记录
			$dataArr = [
				'usc_pu_uid' => $uid,
				'usc_last_score' => $nowScore,
				'usc_score' => $score,
				'usc_txt' => $txt,
				'usc_atime' => time()
			];
			$this->add('pl_user_credit', $dataArr);
			$this->PjlDb->End();
			return LibFc::ReturnData(true, '');
		}
		return LibFc::ReturnData(false, 'changeUserCredit 参数不正确');
	}


	/**
	  * @method 账号余额变动  
	  * @param  $dataArr ['mon_pu_uid'=>11, 'mon_change'=>-0.5, 'mon_des'=>xxx...]
	  * @author soul
	  * @copyright 2018/7/23
	  * @return ["status"=> bool(true), "data"=>'', "code"=>""]
	  */
	public function changeUserMoney($dataArr)
	{
		//参数校验
		if(!LibFc::Int($dataArr['mon_pu_uid']) || !in_array($dataArr['mon_style'], [0,1,2,3,4,5]) || empty($dataArr['mon_money']) || empty($dataArr['mon_des']))
		{
			return LibFc::ReturnData(false, 'changeUserMoney 提供的参数有误');
		}
		$dataArr['mon_pu_uid'] = (int) $dataArr['mon_pu_uid'];
		$dataArr['mon_money'] = sprintf("%.2f", $dataArr['mon_money']);
		$res = $this->get('pl_user', ['pu_money'], sprintf(" and pu_uid=%d",$dataArr['mon_pu_uid']), true);
		$oldMoney = $res['data'];
		//如果是支出，是否够支付
		if($dataArr['mon_money'] < 0 && ($dataArr['mon_money'] + $oldMoney['pu_money']) < 0)
			return LibFc::ReturnData(false, '余额不足，扣款失败！', 'nomoney');

		$this->PjlDb->Begin();
		
		//根据金额判断支出还是收入
		$dataArr['mon_tyle'] = $dataArr['mon_money'] > 0? 0: 1;
		$dataArr['mon_money_old'] = $oldMoney['pu_money'];
		$dataArr['mon_money_new'] = $oldMoney['pu_money'] + $dataArr['mon_money'];
		$dataArr['mon_atime'] = time();
		$dataArr['mon_opl_id'] = (int) $dataArr['mon_opl_id'];
		$dataArr['mon_etime'] = $dataArr['mon_atime'];
		//防止重复数据
		$res = $this->get('pl_money_list', ['mon_id'], sprintf(" and mon_pu_uid=%d and mon_style='%s' and mon_money='%s' and mon_des='%s' and mon_atime >= %d",
			$dataArr['mon_pu_uid'], $dataArr['mon_style'], $dataArr['mon_money'], $dataArr['mon_des'], time()-600), true);
		if(!empty($res['data']))
		{
			return LibFc::ReturnData(false, '余额变动异常，请稍后重试！');
		}
		$this->add('pl_money_list', $dataArr);
		//余额更新
		$this->set('pl_user', ['pu_money'=>$dataArr['mon_money_new']], sprintf(" and pu_uid=%d", $dataArr['mon_pu_uid']));
		$this->PjlDb->End();
		return LibFc::ReturnData(true, $dataArr['mon_money_new']);
	}


	/**
	  * @method 查询余额变动  
	  * @param  $dataArr ['mon_pu_uid'=>11, 'mon_change'=>-0.5, 'mon_des'=>xxx...]
	  * @author soul
	  * @copyright 2018/7/23
	  * @return ["status"=> bool(true), "data"=>'', "code"=>""]
	  */
	public function changeUserSearchMoney($dataArr)
	{
		//参数校验
		if(!LibFc::Int($dataArr['mon_pu_uid']) || !in_array($dataArr['mon_style'], [0,1,2,3,4,5]) || empty($dataArr['mon_money']) || empty($dataArr['mon_des']))
		{
			return LibFc::ReturnData(false, 'changeUserSearchMoney 提供的参数有误');
		}
		$dataArr['mon_pu_uid'] = (int) $dataArr['mon_pu_uid'];
		$dataArr['mon_money'] = sprintf("%.2f", $dataArr['mon_money']);
		$res = $this->get('pl_user', ['pu_money_search'], sprintf(" and pu_uid=%d",$dataArr['mon_pu_uid']), true);
		$oldMoney = $res['data'];
		//如果是支出，是否够支付
		if($dataArr['mon_money'] < 0 && ($dataArr['mon_money'] + $oldMoney['pu_money_search']) < 0)
			return LibFc::ReturnData(false, '余额不足，扣款失败！', 'nomoney');

		$this->PjlDb->Begin();
		
		//根据金额判断支出还是收入
		$dataArr['mon_tyle'] = $dataArr['mon_money'] > 0? 0: 1;
		$dataArr['mon_money_old'] = $oldMoney['pu_money_search'];
		$dataArr['mon_money_new'] = $oldMoney['pu_money_search'] + $dataArr['mon_money'];
		$dataArr['mon_atime'] = time();
		$dataArr['mon_opl_id'] = (int) $dataArr['mon_opl_id'];
		$dataArr['mon_etime'] = $dataArr['mon_atime'];
		//防止重复数据
		$res = $this->get('pl_money_list_search', ['mon_id'], sprintf(" and mon_pu_uid=%d and mon_style='%s' and mon_money='%s' and mon_des='%s' and mon_atime >= %d",
			$dataArr['mon_pu_uid'], $dataArr['mon_style'], $dataArr['mon_money'], $dataArr['mon_des'], time()-600), true);
		if(!empty($res['data']))
		{
			return LibFc::ReturnData(false, '余额变动异常，请稍后重试！');
		}
		$this->add('pl_money_list_search', $dataArr);
		//余额更新
		$this->set('pl_user', ['pu_money_search'=>$dataArr['mon_money_new']], sprintf(" and pu_uid=%d", $dataArr['mon_pu_uid']));
		$this->PjlDb->End();
		return LibFc::ReturnData(true, $dataArr['mon_money_new']);
	}


	/**
	  * @method 分享赚钱资金变动  
	  * @param  $dataArr ['mon_pu_uid'=>11, 'mon_change'=>-0.5, 'mon_des'=>xxx...]
	  * @author soul
	  * @copyright 2018/7/23
	  * @return ["status"=> bool(true), "data"=>'', "code"=>""]
	  */
	public function changeUserShareMoney($dataArr)
	{
		//参数校验
		if(!LibFc::Int($dataArr['mon_pu_uid']) || empty($dataArr['mon_money']) || empty($dataArr['mon_des']))
		{
			return LibFc::ReturnData(false, 'changeUserSearchMoney 提供的参数有误');
		}
		$dataArr['mon_pu_uid'] = (int) $dataArr['mon_pu_uid'];
		$dataArr['mon_money'] = sprintf("%.2f", $dataArr['mon_money']);
		$res = $this->get('pl_user', ['pu_money_share'], sprintf(" and pu_uid=%d",$dataArr['mon_pu_uid']), true);
		$oldMoney = $res['data'];
		if(empty($oldMoney)) $oldMoney['pu_money_share'] = 0.00;
		//如果是支出，是否够支付
		if($dataArr['mon_money'] < 0 && ($dataArr['mon_money'] + $oldMoney['pu_money_share']) < 0)
			return LibFc::ReturnData(false, '余额不足，扣款失败！', 'nomoney');

		$this->PjlDb->Begin();
		
		//根据金额判断支出还是收入
		$dataArr['mon_tyle'] = $dataArr['mon_money'] > 0? 0: 1;
		$dataArr['mon_money_old'] = $oldMoney['pu_money_share'];
		$dataArr['mon_money_new'] = $oldMoney['pu_money_share'] + $dataArr['mon_money'];
		$dataArr['mon_atime'] = time();
		$dataArr['mon_sor_id'] = (int) $dataArr['mon_sor_id'];
		$dataArr['mon_mow_id'] = (int) $dataArr['mon_mow_id'];
		//防止重复数据
		$res = $this->get('pl_money_list_share', ['mon_id'], sprintf(" and mon_pu_uid=%d and mon_tyle='%s' and mon_money='%s' and mon_des='%s' and mon_atime >= %d",
			$dataArr['mon_pu_uid'], $dataArr['mon_tyle'], $dataArr['mon_money'], $dataArr['mon_des'], time()-600), true);
		if(!empty($res['data']))
		{
			return LibFc::ReturnData(false, '余额变动异常，请稍后重试！');
		}
		$this->add('pl_money_list_share', $dataArr);
		//余额更新
		$this->set('pl_user', ['pu_money_share'=>$dataArr['mon_money_new']], sprintf(" and pu_uid=%d", $dataArr['mon_pu_uid']));
		$this->PjlDb->End();
		return LibFc::ReturnData(true, $dataArr['mon_money_new']);
	}
	
	
	/**
	  * @method 新增或者编辑用户收货地址（收货地址每人最多10条记录）
	  * @param  $uid 哪个用户
	  * @param  $dataArr ['ua_default'=>0, 'ua_name'=>'张先生', 'ua_tel'=>.....]
	  * @param  $uaId 如果是编辑需要提供，否则当新增处理
	  * @author lu
	  * @copyright 2018.7.23
	  * @return ["status"=> bool(true), "data"=> $uaId, "code"=>""]
	  */
	public function setUserAddr($uid, $dataArr, $uaId = 0)
	{
		if(!empty($dataArr)&&LibFc::Int($uid))
		{
			//限定10条
			$max=10;
			$res=$this->get('pl_user_addr',['ua_id'],sprintf(' and ua_pu_uid=%d order by ua_atime desc',$uid));
			$addrIdArr=array_column($res['data'], 'ua_id');
			if(count($addrIdArr)>=$max&&empty($uaId))
				return LibFc::ReturnData(false, '收货地址最多10条');
			if(empty($dataArr['ua_name']))
				return LibFc::ReturnData(false, '收件人不能为空');
			if(empty($dataArr['ua_tel']))
				return LibFc::ReturnData(false, '联系电话不能为空');
			if(empty($dataArr['ua_pct_ids']))
				return LibFc::ReturnData(false, '地区不能为空');
			if(empty($dataArr['ua_addr']))
				return LibFc::ReturnData(false, '详细地址不能为空');						
			$dataArr['ua_etime']=time();
			$this->PjlDb->Begin();
			if(!empty($uaId))
			{
				//校验是否为该用户的地址				
				if(!in_array($uaId, $addrIdArr))
					return LibFc::ReturnData(false, '该地址不属于此用户');
				$res=$this->set('pl_user_addr',$dataArr,sprintf(' and ua_id=%d',$uaId));
			}
			else
			{
				$dataArr['ua_pu_uid']=$uid;
				$dataArr['ua_atime']=time();
				$res=$this->add('pl_user_addr',$dataArr);
				$uaId=$res['data'];
			}
			//默认地址设置
			if(!empty($dataArr['ua_default']))
			{
				$this->set('pl_user_addr',['ua_default'=>0],sprintf(' and ua_pu_uid=%d and ua_id !=%d',$uid,$uaId));
			}
			$this->PjlDb->End();
			return LibFc::ReturnData(true, $uaId);
		}
		return LibFc::ReturnData(false, 'setUserAddr 参数错误');
	}
	/**
	 * @method    设置用户默认地址
	 * @param     [int]            $uid    [用户id]
	 * @param     [int]            $addrid [地址id]
	 * @author    liao
	 * @copyright 2018-08-11
	 * @return
	 */
	public function setAddressDefault($uid,$addrid)
	{
		if (LibFc::Int($uid) && LibFc::Int($addrid))
		{
			$basewhere = sprintf('and ua_pu_uid = %d',$uid);
			$res = $this->get('pl_user_addr',['count(*) count'],sprintf('%s and ua_id = %d',$basewhere,$addrid),true);
			if ($res['data']['count'] < 1)
				return LibFc::ReturnData(false, '找不到用户的该条地址');
			$this->PjlDb->Begin();
			$this->set('pl_user_addr',['ua_default'=>1],sprintf('%s and ua_id =%d',$basewhere,$addrid));
			$this->set('pl_user_addr',['ua_default'=>0],sprintf('%s and ua_id !=%d',$basewhere,$addrid));
			$this->PjlDb->End();
			return LibFc::ReturnData(true, $addrid);
		}
		return LibFc::ReturnData(false, 'setAddressDefault 参数错误');
	}

	/**
	  * @method 删除用户收货地址（收货地址每人最多10条记录）
	  * @param  $uid 哪个用户
	  * @param  $uaIdArr 地址库ID[111,222]
	  * @author lu
	  * @copyright 2018.7.23
	  * @return ["status"=> bool(true), "data"=>"", "code"=>""]
	  */
	public function delUserAddr($uid, $uaIdArr)
	{
		if(!empty($uaIdArr)&&LibFc::Int($uid))
		{		
			$uaIdArr=array_filter($uaIdArr,'LibFc::Int');
			if(!empty($uaIdArr))
			{
				$res=$this->del('pl_user_addr',sprintf(' and ua_id in(%s) and ua_pu_uid=%d',implode(',',$uaIdArr),$uid));
				return $res;
			}
		}
		return LibFc::ReturnData(false, 'delUserAddr 参数错误');
	}


	/**
	  * @method 新增用户VIN查询记录（每人最多10条，否则先删除最早的再加入）
	  * @param  $uid 哪个用户
	  * @param  $vin 需要校验是否为17位的VIN
	  * @author lu
	  * @copyright 2018.7.23
	  * @return ["status"=> bool(true), "data"=> $uvId, "code"=>""]
	  */
	public function addUserVin($uid, $vin)
	{
		if(LibFc::Int($uid)&&!empty($vin))
		{
			$vin=LibFc::FormatVin($vin);
			if(mb_strlen($vin)!=17)
				return LibFc::ReturnData(false, 'vin 不正确');
			$res=$this->get('pl_user_vin',['uv_id'],sprintf(" and uv_pu_id=%d and uv_vin='%s'",$uid,LibFc::Escape($vin)),true);
			$vId=!empty($res['data']['uv_id'])?$res['data']['uv_id']:0;
			if(empty($vId))
			{
				$max=10;
				$res=$this->get('pl_user_vin',['uv_id'],sprintf(' and uv_pu_id=%d order by uv_etime asc',$uid));
				$uVArr=array_column($res['data'], 'uv_id');
				$dataArr=[
					'uv_pu_id'=>$uid,
					'uv_vin'=>$vin,
					'uv_etime'=>time()
				];
				$this->PjlDb->Begin();
				if(count($uVArr)==$max)
				{
					$this->delUserVin($uid,[$uVArr[0]]);
				}
				$res=$this->add('pl_user_vin',$dataArr);
				$vId=$res['data'];
				$this->PjlDb->End();
			}
			else{
				$res=$this->set('pl_user_vin',['uv_etime'=>time()],sprintf(" and uv_id=%d",$vId));
			}
			return LibFc::ReturnData(true, $vId);
		}
		return LibFc::ReturnData(false, 'addUserVin 参数错误');
	}

	/**
	  * @method 删除用户VIN查询记录
	  * @param  $uid 哪个用户
	  * @param  $uvIdArr 通过VIN记录ID删除
	  * @param  $vinArr 通过VIN删除
	  * @author lu
	  * @copyright 2018.7.23
	  * @return ["status"=> bool(true), "data"=> $uaId, "code"=>""]
	  */
	public function delUserVin($uid, $uvIdArr=[], $vinArr=[])
	{
		if(LibFc::Int($uid))
		{
			$where='';
			if(!empty($uvIdArr))
			{
				$uvIdArr=array_filter($uvIdArr,'LibFc::Int');
				if(!empty($uvIdArr))
				{
					$where.=sprintf(' and uv_id in(%s)',implode(',',$uvIdArr));
				}
			}
			if(!empty($vinArr))
			{
				$vinArr=array_map(function($v){
					$temp=LibFc::FormatVin($v);
					if(mb_strlen($temp)==17)
					{
						return $temp;
					}
				},$vinArr);
				$vinArr=array_filter($vinArr);
				if(!empty($vinArr))
				{
					$where.=sprintf(" and uv_vin in('%s')",implode("','",$vinArr));
				}
			}
			if(!empty($where))
			{
				$where.=sprintf(' and uv_pu_id=%d',$uid);
				$res=$this->del('pl_user_vin',$where);
				return $res;
			}
		}
		return LibFc::ReturnData(false, 'delUserVin 参数错误');
	}


	/**
	  * @method 新增用户车型查询记录（每人最多10条，否则先删除最早(非收藏)>最早收藏）
	  * @param  $uid 哪个用户
	  * @param  $mod3Id 车型ID
	  * @param  $coll null表示不变  0普通  1收藏
	  * @author lu
	  * @copyright 2018.7.24
	  * @return ["status"=> bool(true), "data"=>, "code"=>""]
	  */
	public function addUserModel($uid, $mod3Id, $coll = null)
	{
		if(LibFc::Int($uid)&&LibFc::Int($mod3Id))
		{
			$where=sprintf(' and um_pu_uid=%d and um_pu_mod3_id=%d',$uid,$mod3Id);
			$res=$this->get('pl_user_model',['um_id'],$where,true);
			if(!empty($res['data']))
			{
				$dataArr=['um_etime'=>time()];
				if($coll!==null&&in_array($coll, [0,1])){
					$dataArr['um_coll']=$coll;
				}
				$res=$this->set('pl_user_model',$dataArr,$where);
				return $res;
			}
			$res=$this->get('pl_user_model',['um_id'],sprintf(' and um_pu_uid=%d order by um_coll asc, um_etime asc',$uid));
			$max=10;
			$this->PjlDb->Begin();
			if(count($res['data'])==$max)
			{
				$this->del('pl_user_model',sprintf(' and um_id=%d',$res['data'][0]));
			}
			$dataArr=[
				'um_pu_uid'=>$uid,
				'um_pu_mod3_id'=>$mod3Id,
				'um_etime'=>time()
			];
			if($coll!==null&&in_array($coll, [0,1])){
				$dataArr['um_coll']=$coll;
			}
			$res=$this->add('pl_user_model',$dataArr);
			$this->PjlDb->End();
			return $res;
		}
		return LibFc::ReturnData(false, 'addUserModel 参数错误');
	}


	/**
	  * @method 变更车型查询记录的收藏状态
	  * @param  $uid 哪个用户
	  * @param  $mod3IdArr 车型ID数组
	  * @param  $coll 0普通  1收藏
	  * @author lu
	  * @copyright 2018.7.24
	  * @return ["status"=> bool(true), "data"=>, "code"=>""]
	  */
	public function setUserModelColl($uid, $mod3IdArr, $coll)
	{
		if(LibFc::Int($uid)&&!empty($mod3IdArr)&&is_numeric($coll)&&in_array($coll, [0,1]))
		{
			$mod3IdArr=array_filter($mod3IdArr,'LibFc::Int');
			if(!empty($mod3IdArr))
			{
				$res=$this->set('pl_user_model',['um_coll'=>$coll],sprintf(" and um_pu_uid=%d and um_pu_mod3_id in(%s)",$uid,implode(',', $mod3IdArr)));
				return $res;
			}
		}
		return LibFc::ReturnData(false, 'setUserModelColl 参数错误');
	}


	/**
	  * @method 删除用户车型查询记录
	  * @param  $uid 哪个用户
	  * @param  $mod3IdArr 车型ID数组
	  * @author lu
	  * @copyright 2018.7.24
	  * @return ["status"=> bool(true), "data"=>, "code"=>""]
	  */
	public function delUserModel($uid, $mod3IdArr)
	{
		if(LibFc::Int($uid)&&!empty($mod3IdArr))
		{
			$mod3IdArr=array_filter($mod3IdArr,'LibFc::Int');
			if(!empty($mod3IdArr))
			{
				$res=$this->del('pl_user_model',sprintf(' and um_pu_uid=%d and um_id in(%s)',$uid,implode(',',$mod3IdArr)));
				return $res;
			}
		}
		return LibFc::ReturnData(false, 'delUserModel 参数错误');
	}
	/**
	 * @method    保存职员
	 * @param     [array]        $data 
	 * @author     廖
	 * @copyright 2018-02-27
	 * @return    ['true','xxx']
	 */
	public function saveRulesUser($data)
	{
		if(!empty($data) && LibFc::Int($data['userId']))
		{
			$rulesArr = array_filter(explode(',', $data['userRules']),'LibFc::Escape');
			if($data['order']=='add')
			{
				//查询是否已存在
				$res = $this->get('an_user',['count(*) count'],'and au_uid='.$data['userId'],true);
				if($res['data']['count']==0)
				{
					$dataArr['au_uid'] = $data['userId'];
					$dataArr['au_status'] = $data['openRules']?1:0;
					$dataArr['au_atime'] = time();					
					if(!empty($rulesArr))
					{
						$dataArr['au_rules']=implode(',',$rulesArr);
					}
					$this->add('an_user', $dataArr);
				}
			}
			if($data['order']=='edit')
			{
				$dataArr['au_status'] = $data['openRules']?1:0;
				if(!empty($rulesArr))
				{
					$dataArr['au_rules']=implode(',',$rulesArr);
				}else{
					$dataArr['au_rules']='';
				}
				$this->set('an_user', $dataArr,'and au_uid='.$data['userId']);
			}
			return LibFc::ReturnData(true,true);
		}
		else
		{
			return LibFc::ReturnData(false, '参数不正确!');
		}
	}
	/**
	 * @method    获取用户信息
	 * @param     [字段]      $fields [arr]
	 * @param     [用户ID]      $uid    [arr|int]
	 * @return    [type]              [description]
	 * @author 卢
	 * @copyright 2018-08-08
	 */
	function getUserInfo($fields,$uid)
	{
		if(!empty($fields)&&!empty($uid))
		{
			$uid=is_array($uid)?array_filter($uid,'LibFc::Int'):[(int)$uid];
			if(!empty($uid))
			{
				$fields=array_merge($fields,['pu_uid']);
				$res=$this->get('pl_user',$fields,sprintf(' and pu_uid in(%s)',implode(',',$uid)));
				$res['data']=array_column($res['data'],null, 'pu_uid');
				// print_r($res);
				return $res;
			}
		}
		return LibFc::ReturnData(false, 'getUserInfo参数不正确!');
	}
	function getAddrByIds($ids)
	 {
		 $IdArr = [];
		 foreach(explode(',', $ids) as $V)
		 {
			if(LibFc::Int($V) && $V > 0)
			{
				$IdArr[$V] = '';
			}
		 }
		 $ids=implode(',',array_filter(explode(',', $ids)));
	 	if(count( $IdArr) > 0)
	 	{
		 	$data=array();
		 	$result=$this-> get('yp_province_city',['pc_id','pc_name'], sprintf(' and pc_id in(%s)',$ids));
		 	foreach($result['data'] as $k => $v)
		 	{
		 		$IdArr[$v['pc_id']]=$v['pc_name'];
		 	}
	 	}
		return LibFc::ReturnData(true, $IdArr);
	 }

	 /**
	  * @method 用户成长值变动
	  * @param  $uid  用户ID
	  * @param  $kouchu  扣除成长值
	  * @param  $dataArr [
			'ug_style'=>'...',
			'ug_change'=>20, 
			'ug_val_id'=>, 
		]
	  * @author soul
	  * @copyright 2019/4/2
	  * @return 
	  {"status":true,"data":{"type":"ok","pu_growth":26,"ug_change":10},"code":0,"encry":0,"runtime":236}
	  {"status":true,"data":{"type":"exists","pu_growth":"16","msg":"此成长值已领取过，不可以重复领取！"},"code":0,"encry":0,"runtime":146}
	  {"status":true,"data":{"type":"max","pu_growth":"16","msg":"你太牛了，今天转发文章的成长值已全部领取完！"},"code":0,"encry":0,"runtime":146}
	  */
	public function changeGrowth($uid, $dataArr, $kouchu = false)
	{
		$uid = (int) $uid;
		if(empty($dataArr['ug_style']) || empty(mvc::$cfg['GROWTH'][$dataArr['ug_style']]))
			return LibFc::ReturnData(false, '成长值变更提供的ug_style参数不正确！');
		
		$styleConf = mvc::$cfg['GROWTH'][$dataArr['ug_style']];
		if($styleConf['ug_val_id'] && empty($dataArr['ug_val_id']))
			return LibFc::ReturnData(false, '成长值变更提供的ug_val_id参数不正确！');
		
		$dataArr['ug_val_id'] = (int) $dataArr['ug_val_id'];

		$res = $this->get('pl_user', ['pu_uid', 'pu_growth'], sprintf(" AND pu_uid=%d", $uid), true);
		if(empty($res['data'])) 
			return LibFc::ReturnData(false, $uid.'成长值变更提供的uid参数不正确！');
		$userData = $res['data'];

		if(!$kouchu)
		{
			$where = sprintf(" and ug_pu_id=%d and ug_style='%s'", $uid, $dataArr['ug_style']);
			//此ID是否已经领取过
			if($styleConf['ug_val_id'])
			{
				$res = $this->get('pl_user_growth', ['sum(ug_change) as sum'], sprintf(" %s and ug_val_id = %d", $where, $dataArr['ug_val_id']), true);
				if(!empty($res['data']['sum']))
					return LibFc::ReturnData(true, ['type'=>'exists', 'pu_growth'=>$userData['pu_growth'], 'msg'=>'此成长值已领取过，不可以重复领取！']);
			}

			if($styleConf['type'] == 'day') $where .= sprintf(" and ug_atime>%d", strtotime(date('Y-m-d')));

			$res = $this->get('pl_user_growth', ['sum(ug_change) as sum'], $where, true);
			if($res['data']['sum'] >= $styleConf['max'])
			{
				//达到最大值
				if($styleConf['max'] == $styleConf['per'])
				{
					return LibFc::ReturnData(true, ['type'=>'exists', 'pu_growth'=>$userData['pu_growth'], 'msg'=>'此成长值已领取过，不可以重复领取！']);
				}
				else
				{
					return LibFc::ReturnData(true, ['type'=>'max', 'pu_growth'=>$userData['pu_growth'], 'msg'=>'你太牛了，今天'.$styleConf['name'].'的成长值已全部领取完！']);
				}
			}
			else
			{
				$dataArr['ug_change'] = $styleConf['per'];
			}
			$dataArr['ug_des'] = $styleConf['name'];


			//完善资料特殊处理
			if($dataArr['ug_style'] == 'userInfo')
			{
				$res = $this->get('pl_user_growth', ['count(*) as count'], " and ug_change > 0 and ug_style = 'userInfo'", true);
				if($res['data']['count'] <= 100)
				{
					$dataArr['ug_des'] = $styleConf['name'].'前100名';
					$dataArr['ug_change'] = 50;
				}
				else if($res['data']['count'] <= 1000)
				{
					$dataArr['ug_des'] = $styleConf['name'].'前1000名';
					$dataArr['ug_change'] = 20;
				}
			}
		}
		else
		{
			$where = sprintf(" and ug_pu_id=%d and ug_style='%s'", $uid, $dataArr['ug_style']);
			if($styleConf['ug_val_id'] && $styleConf['ug_val_id'] > 0)
			{
				$where .= sprintf(" and ug_val_id = %d", $dataArr['ug_val_id']);
			}
			else
			{
				if($styleConf['type'] == 'day') $where .= sprintf(" and ug_atime>%d", strtotime(date('Y-m-d')));
			}

			//防止重复扣除
			$res = $this->get('pl_user_growth', ['sum(ug_change) as sum'], $where, true);
			if(empty($res['data']['sum']))
				return LibFc::ReturnData(true, ['type'=>'ok', 'pu_growth'=>$userData['pu_growth'], 'ug_change'=>0]);
			
			//查询之前获取的成长值
			$res = $this->get('pl_user_growth', ['ug_id', 'ug_change'], $where.'  and ug_change > 0 order by ug_id desc', true);
			if(empty($res['data']))
				return LibFc::ReturnData(true, ['type'=>'ok', 'pu_growth'=>$userData['pu_growth'], 'ug_change'=>0]);

			$dataArr['ug_change'] = -$res['data']['ug_change'];
			$dataArr['ug_des'] = empty($dataArr['ug_des'])? $styleConf['name'].'成长值扣除': $dataArr['ug_des'];
		}
		$this->PjlDb->Begin();
		$userData['pu_growth'] += $dataArr['ug_change'];
		$this->set('pl_user', ['pu_growth'=>$userData['pu_growth']], sprintf(" AND pu_uid=%d", $uid));
		$dataArr['ug_has'] = $userData['pu_growth'];
		$dataArr['ug_val_id'] = (int) $dataArr['ug_val_id'];
		$dataArr['ug_atime'] = time();
		$dataArr['ug_pu_id'] = $uid;
		$this->add('pl_user_growth', $dataArr);
		$this->PjlDb->End();
		return LibFc::ReturnData(true, ['type'=>'ok', 'pu_growth'=>$userData['pu_growth'], 'ug_change'=>$dataArr['ug_change']]);
	}


	 /**
	  * @method 新增用户号码查询记录（每人每种un_from最多10条，否则先删除最早的再加入）
	  * @param  $uid 哪个用户
	  * @param  $number 号码
	  * @param  $from 1:etk  0:普通
	  * @author 
	  * @copyright 
	  * @return ["status"=> bool(true), "data"=> $uvId, "code"=>""]
	  */
	public function addUserNumber($uid, $number, $from = 0)
	{
		$uid = (int) $uid;
		$number = LibFc::Escape($number);
		if ($uid > 0 && $number !='' && in_array($from, ['0','1']))
		{
			//格式化号码
			$formatNum = LibFc::FormatNum($number);
			//基本条件
			$baseWhere = sprintf("and un_pu_uid = %d and un_from = %d", $uid, $from);
			//查看 该号码存不存在 存在则更新记录
			$res = $this->get('pl_user_number',['un_id'],sprintf("%s and un_number = '%s' ", $baseWhere, $formatNum),true);

			if ($res['data']['un_id'] > 0)
			{
				$this->set('pl_user_number',['un_etime'=>time()],sprintf("and un_id = %d",$res['data']['un_id']));
				return LibFc::ReturnData(true, $res['data']['un_id']);
			}

			//计算 该 from 的条数 
			$res = $this->get('pl_user_number',['un_id'],sprintf("%s order by un_etime asc", $baseWhere));
			//开启事务
			$this->PjlDb->Begin();
			if (count($res['data']) >= 10)
			{
				//删除
				$this->del('pl_user_number',sprintf("%s and un_id=%d", $baseWhere, $res['data'][0]['un_id']));
			}
			//增加
			$dataArr = [
				'un_pu_uid' => $uid,
				'un_format' => $formatNum,
				'un_number' => $number,
				'un_etime' => time(),
				'un_from' => $from
			];
			$res = $this->add('pl_user_number',$dataArr);
			//结束事务
			$this->PjlDb->End();
			return LibFc::ReturnData(true, $res['data']);
		}
		return LibFc::ReturnData(false, 'addUserNumber 参数不正确!');
	}

	/**
	  * @method 删除用户号码查询记录
	  * @param  $uid 哪个用户
	  * @param  $numArr 号码 为空则删除$from的所有
	  * @param  $from  1:etk  0:普通  -1删除所有
	  * @author 
	  * @copyright 
	  * @return ["status"=> bool(true), "data"=> , "code"=>""]
	  */
	public function delUserNumber($uid, $numArr = [], $from = 0)
	{
		$uid = (int) $uid;
		if ($uid > 0)
		{
			$where = sprintf("and un_pu_uid = %d", $uid);
			if (in_array($from, ['0','1']))
			{
				//基本条件
				$where = sprintf("%s and un_from = %d", $where, $from);
				//限制条件
				if (!empty($numArr))
				{
					if (!is_array($numArr))
						return LibFc::ReturnData(false, 'delUserNumber 号码组必须为数组!');
					//格式化代码
					$numArr = array_map('LibFc::FormatNum', $numArr);
					if (empty($numArr))
						return LibFc::ReturnData(false, 'delUserNumber 号码不正确!');
					$where = sprintf("%s and un_format in ('%s')", $where, implode("','", $numArr));
				}
				//删除
				$res = $this->del('pl_user_number',$where);
				return LibFc::ReturnData(true, $res['data']);

			} else if ($from == '-1')
			{
				//删除
				$res = $this->del('pl_user_number',$where);
				return LibFc::ReturnData(true, $res['data']);
			}
		}
		return LibFc::ReturnData(false, 'delUserNumber 参数不正确!');
	}

	/**
	 * @method    保存用户评价
	 * @param     [int]           $uid     [用户id]
	 * @param     [array]         $dataArr [eva_img'=>[],'eva_score'=>xx,'eva_txt'=>'xxx','eva_ord_id'=>xxx]
	 * @author    liao
	 * @copyright 2018-08-21
	 * @return    ["status"=> bool(true), "data"=> , "code"=>""]
	 */
	public function saveUserEvaluate($uid, $dataArr)
	{
		$uid = (int) $uid;
		if ($uid > 0)
		{
			$must = ['eva_ord_id', 'eva_score'];
			foreach($must as $filed)
			{
				$dataArr[$filed] = (int) $dataArr[$filed];
				if(!isset($dataArr[$filed]) || empty($dataArr[$filed]) || $dataArr[$filed] < 1)
					return LibFc::ReturnData(false, '评价 '.$filed.' 参数不能空！');
			}
			if (empty($dataArr['eva_txt']))
				return LibFc::ReturnData(false, '评价 内容 不能空！');

			if ($dataArr['eva_score'] > 5)
				return LibFc::ReturnData(false, '订单评分不能超过 5 分！');

			//查看订单是否已经 评价
			$res = $this->get('pl_order',['ord_eva_time','ord_shop_id'],sprintf("and ord_id = %d and ord_pu_uid = %d and ord_status='completed'", $dataArr['eva_ord_id'], $uid),true);
			if ($res['data']['ord_eva_time'] === null)
				return LibFc::ReturnData(false, '订单信息不正确！');
			if ($res['data']['ord_eva_time'] > 0)
				return LibFc::ReturnData(false, '订单已评价！');
			// 过滤 图片 去空 json
			$dataArr['eva_img'] = array_filter($dataArr['eva_img']);
			if (count($dataArr['eva_img']) > 8)
				return LibFc::ReturnData(false, '评论图片最多8张');
			
			$inData = [
				'eva_ord_id' => $dataArr['eva_ord_id'],
				'eva_shop_id' => $res['data']['ord_shop_id'],
				'eva_pl_uid' => $uid,
				'eva_score' => $dataArr['eva_score'],
				'eva_txt' => $dataArr['eva_txt'],
				'eva_img' =>  !empty($dataArr['eva_img']) ? json_encode($dataArr['eva_img'],JSON_UNESCAPED_UNICODE) : '',
				'eva_atime' => time()
			];
			//开启事务
			$this->PjlDb->Begin();
			$this->set('pl_order',['ord_eva_time'=>time()],sprintf("and ord_id = %d and ord_pu_uid = %d", $dataArr['eva_ord_id'], $uid));
			$this->add('pl_evaluate',$inData);
			//更新店铺分数
			$avg = $this->get('pl_evaluate',['avg(eva_score) score'], sprintf('and eva_shop_id=%d', $res['data']['ord_shop_id']), true);

			$this->set('pl_shop',['shop_score'=>round($avg['data']['score'],1)], sprintf("and shop_id = %s", $res['data']['ord_shop_id']));
			$this->PjlDb->End();
			return  LibFc::ReturnData(true, $res['data']);
		}
		return LibFc::ReturnData(false, 'saveUserEvaluate 参数不正确!');
	}




	/**
	  * @method 获取PC版VIP价格
	  * @param  uid	   int [必填] 会员ID	  
	  * @param  month  int [必填] 购买月数	已无效  
	  * @param  level  int [必填] 变更后的级别  
	  * @author soul
	  * @copyright 2018/9/20
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function getVipPrice($uid, $month, $level)
	{
		$uid = (int) $uid;
		$month = (int) $month;
		$month = $month  < 0 ? 0: $month;
		$level = (int) $level;
		$arr = [
			'vip_id'=>'',	
			'vip_name'=>'',	
			'paymoney'=>'0.00',	
			'price'=>'0.00',
			'free_price'=>'0.00',
			'free_money'=>'0.00',
			'month'=>$month,
			'free_month'=>0,
			'btime'=>'',
			'etime'=>'',
		];

		$res = $this->get('pl_user left join pl_shop on shop_pu_id=pu_uid', ['pu_uid, pu_pct_ids, shop_pct_ids'], sprintf(" and pu_uid=%d limit 1", $uid), true);
		if(empty($res['data']))  return LibFc::ReturnData(false, '用户不存在或者尚未初始化数据，请重新登录跑街令APP!');
		$userArr = $res['data'];

		$res = $this->get('pl_user_vip', ['max(uvip_etime) as uvip_etime'], sprintf(" and uvip_uid=%d  and uvip_vip_id > 1 limit 1", $uid), true);
		$userArr['uvip_etime'] = (int) $res['data']['uvip_etime'];

		$now = time();
		$userArr['last_vip_etime'] = $userArr['uvip_etime'] > $now ? $userArr['uvip_etime']: $now;
		
		$res = $this->get('pl_vip_level', ['*'], ' and vip_id > 1');
		$levelArr = array_column($res['data'], null, 'vip_id');

		if(empty($levelArr[$level])) return LibFc::ReturnData(false, '您购买的会员级别不存在！');

		//最多续一年
		if(($userArr['last_vip_etime']-time())/3600/24/365 >= 2)  return LibFc::ReturnData(false, '现有的会员服务还剩余2年，续费功能受限！');

		$arr['vip_id'] = $level;
		$arr['vip_name'] = $levelArr[$level]['vip_name'];
		$arr['price'] = $levelArr[$level]['vip_price'];
		$arr['paymoney'] = $levelArr[$level]['vip_now_price'];
		$arr['free_money'] =  sprintf("%.2f", $arr['price']-$arr['paymoney']);
		
		$arr['etime'] = strtotime($levelArr[$level]['vin_time'], $userArr['last_vip_etime']);
		$arr['btime'] = date('Y-m-d H:i:s', $userArr['last_vip_etime']);
		$arr['etime'] = date('Y-m-d H:i:s', $arr['etime']);
		return LibFc::ReturnData(true, $arr);
	}


	/**
	  * @method 创建VIP开通、升级、续费订单
	  * @param  uid	   int [必填] 会员ID	  
	  * @param  month  int [必填] 购买月数	已无效 
	  * @param  level  int [必填] 变更后的级别 
	  * @param  referee string [选填] 推荐人手机号码
	  * @author soul
	  * @copyright 2018/9/20
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function buildVipOrder($uid, $month, $level, $referee)
	{
		$res = $this->getVipPrice($uid, $month, $level);
		$priceArr = $res['data'];

		$res = $this->get('pl_user', ['*'], sprintf(" and pu_uid=%d", $uid), true);
		$userArr = $res['data'];
		$this->PjlDb->Begin();

		//关闭之前尚未支付的订单
		$res = $this->get('pl_user_vip_list', ['uvl_id'], sprintf(" and uvl_uid=%d and uvl_status = 0", $uid));
		if(!empty($res['data']))
		{
			$this->closeVipOrder(array_column($res['data'], 'uvl_id'));
		}

		$addArr = [
			'uvl_uid'=>$userArr['pu_uid'],
			'uvl_status'=>0,
			'uvl_now_vip_id'=>$priceArr['vip_id'],
			'uvl_now_btime'=>strtotime($priceArr['btime']),
			'uvl_now_etime'=>strtotime($priceArr['etime']),
			'uvl_paymoney'=>$priceArr['paymoney'],
			'uvl_free_money'=>$priceArr['free_money'],
			'uvl_month'=>$priceArr['month'],
			'uvl_free_month'=>$priceArr['free_month'],
			'uvl_price'=>$priceArr['price'],
			'uvl_free_price'=>$priceArr['free_price'],
			'uvl_btime'=>time(),
			'uvl_referee'=> !empty($referee) && preg_match('/^1\d{10}$/', trim($referee)) ? $referee: '',
		];

		$res = $this->add('pl_user_vip_list', $addArr);
		$this->PjlDb->End();
		return $res;
	}

	
	/**
	  * @method 检查此会员是否可以申请体验会员(尚未开通过会员的用户)
	  * @param  uid	   int [必填] 会员ID	  
	  * @author soul
	  * @copyright 2018/9/20
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function checkCanFreeVip($uid)
	{
		$uid = (int) $uid;
		$res = $this->get('pl_user left join pl_user_vip on uvip_uid = pu_uid', ['uvip_vip_id', 'uvip_etime'], sprintf(" and pu_uid=%d order by uvip_etime limit 1", $uid), true);
		if(empty($res['data']))
			return LibFc::ReturnData(false, '用户不存在或者尚未初始化数据，请重新登录跑街令APP!');
		if(!empty($res['data']['uvip_etime']) && ($res['data']['uvip_vip_id'] > 1 || $res['data']['uvip_etime'] > time()))
			return LibFc::ReturnData(true, false);

		$res = $this->get('pl_user_vip_list', ['uvl_id'], sprintf(" and uvl_uid=%d and uvl_status > 0 and uvl_now_vip_id > 0", $uid));
		if(!empty($res['data']))
			return LibFc::ReturnData(true, false);
		return LibFc::ReturnData(true, true);
	}



	/**
	  * @method 人工开通商家入驻或者PC版会员
	  * @param  dataArr	   array [必填] [
			u_id: soul12
			vip_code: shop
			paymoney: 818
			invcode: 2004
			remark: 测试
			pay_time: 记账日期  选填
			pay_money: 付款金额 选填
		  ]
	  * @author soul
	  * @copyright 2018/9/20
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function manualOpenPcVip($dataArr)
	{
		$YpwBase = new YpwBase();
		$res = $YpwBase->Get('yp_user', ['u_id', 'u_name'], sprintf(" and (u_id=%d or u_name='%s' or (u_mobile='%s' and u_mobile_check = 'Y'))", $dataArr['u_id'], LibFc::Escape($dataArr['u_id']), LibFc::Escape($dataArr['u_id'])), true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '用户不存在!');
		$uArr = $res['data'];

		$this->PjlDb->Begin();

		$res =  $this->buildVipStyleOrder($dataArr['style'], $uArr['u_id'], $dataArr['invcode']);
		$uvlId = $res['data'];

		$filed = ['pu_uid, shop_name, uvl_id, uvl_style, uvl_status, uvl_paymoney, uvl_por_id, uvl_now_vip_id, uvl_now_btime, uvl_now_etime, uvl_dco_id, uvl_dwi_invcode, uvl_pc_pid, uvl_pc_cid, l.*'];
		$table = 'pl_user_vip_list 
		join pl_user on pu_uid=uvl_uid 
		join pl_vip_level as l on uvl_now_vip_id = vip_id
		left join pl_shop on shop_pu_id = pu_uid';
		$res = $this->get($table, $filed, sprintf(" and uvl_id =%d", $uvlId), true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '订单不存在！');
		$ordArr = $res['data'];
		$ordArr = array_merge($ordArr, $uArr);
		$xiangmu = 'PC会员';

		//记录是否已经存在
		$title = empty($ordArr['shop_name']) ? $ordArr['u_name'].' 买'.$ordArr['vip_name']: $ordArr['u_name'].'【'.$ordArr['shop_name'].'】 ';
		$remark = $dataArr['remark'];
		$res = $this->get('pl_user_vip', ['*'], sprintf(" and uip_uvl_id = %d", $uvlId), true);
		if(!empty($res['data'])) return LibFc::ReturnData(true, $ordArr);

		$moneyArr = [
			'pay'=>$ordArr['uvl_paymoney'],
			'gstc'=>$ordArr['uvl_paymoney'],
			'selftc'=>0.00,
		];

		if(!empty($dataArr['pay_money']))
		{
			$moneyArr = [
				'pay'=>sprintf("%.2f", $dataArr['pay_money']),
				'gstc'=>sprintf("%.2f", $dataArr['pay_money']),
				'selftc'=>0.00,
			];
		}

		$now = time();
		$payArr = [
			'uvl_status'=>2,	
			'uvl_pay_time'=>$now,
			'uvl_ok_time'=>$now
		];
		if($now > $ordArr['uvl_now_btime'])
		{
			$ordArr['uvl_now_etime'] = $ordArr['uvl_now_etime'] + $now - $ordArr['uvl_now_btime'];
			$ordArr['uvl_now_btime'] = $now;
			$payArr['uvl_now_btime'] = $ordArr['uvl_now_btime'];
			$payArr['uvl_now_etime'] = $ordArr['uvl_now_etime'];
		}

		$this->set('pl_user_vip_list',$payArr, sprintf(" and uvl_id=%d", $uvlId));
		
		//VIP列表
		$vipAddArr = [
			'uvip_uid'=>$ordArr['pu_uid'],
			'uip_uvl_id'=>$uvlId,
			'uvip_btime'=>$ordArr['uvl_now_btime'],
			'uvip_etime'=>$ordArr['uvl_now_etime'],
			'uvip_vip_id'=>$ordArr['uvl_now_vip_id'],
			'uvip_name'=>$ordArr['vip_name'],
			'uvip_vin_count'=>$ordArr['vip_vin_count'],
			'uvip_number_count'=>$ordArr['vip_number_count'],
			'uvip_etk_count'=>$ordArr['vip_etk_count'],
			'uvip_cyj_count'=>$ordArr['vip_cyj_count'],
			'uvip_atime'=>time(),
			'uvip_paymoney'=>$moneyArr['pay']
		];

		//商家入驻
		if($ordArr['uvl_style'] == 'shop')
		{
			$title .= '商家入驻';
			$xiangmu = '商家入驻';
			$res = $this->get('pl_shop', ['shop_status, shop_enter_time, shop_vip_etime'], sprintf(" and shop_id=%d", $ordArr['pu_uid']), true);
			$shopData = $res['data'];
			$btime = !empty($shopData['shop_vip_etime']) && $shopData['shop_vip_etime'] >= $now ? $shopData['shop_vip_etime']: $now;
			$etime = $ordArr['uvl_now_etime'] - $ordArr['uvl_now_btime'] + $btime;
			$addArr = [
				'svip_shop_id'=>$ordArr['pu_uid'],
				'svip_uvl_id'=>$uvlId,
				'svip_btime'=>$btime,
				'svip_etime'=>$etime
			];
			$this->add('pl_shop_vip', $addArr);
			$sArr = [];
			if($shopData['shop_status'] != 2)
			{
				$sArr = [
					'shop_status'=>2,
					'shop_enter_pay'=>1,
					'shop_checkby'=>json_encode([
						'name'=>'系统',
						'result'=>'1',
						'remark'=>'恭喜您成功入驻跑街令，请移步PC端导入产品目录，地址为：https://pc.paojd.cn',
						'time'=>time()
					])
				];
			}
			$sArr['shop_vip_etime'] = $etime;
			if(empty($shopData['shop_enter_time'])) $sArr['shop_enter_time'] = time();
			$this->set('pl_shop', $sArr, sprintf(" and shop_id=%d", $ordArr['pu_uid']));
		}
		else
		{
			$title .= '购买'.$ordArr['vip_name'];
		}

		//代理邀请码、计算提成
		$invArr = [];
		
		//默认非代理区域
		$dailiArea = 0;
		$invTable = 'dl_worker_invcode as a join dl_worker on dwi_dwo_uid=dwo_uid and dwi_dco_id = dwo_dco_id and dwo_status =1 join dl_company on dwo_dco_id=dco_id';
		
		//此邀请码是否能使用
		$dmlRemark = '';
		if(!empty($ordArr['uvl_dwi_invcode']))
		{
			$res = $this->get($invTable, ['*'], sprintf(" and dwi_invcode ='%s'", LibFc::Escape($ordArr['uvl_dwi_invcode'])), true);
			if(!empty($res['data']))
			{
				$invArr = $res['data'];
				//客户是否有业务员，非所属业务员的邀请码会被清空
				$CrmMain = new CrmMain();
				$res = $CrmMain->get('crm_customer JOIN crm_customer_admin ON cca_ctr_id=ctr_id', ['cca_au_uid'], sprintf(" and ctr_uid=%d and cca_au_uid != 172999 and cca_end_time > %d", $ordArr['pu_uid'], time()));
				if(!empty($res['data']) && !in_array($invArr['dwo_uid'], array_column($res['data'], 'cca_au_uid'))){
					$invArr = [];
					$dmlRemark = ' 非自己的客户邀请码'.$ordArr['uvl_dwi_invcode'].'无效';
					$ordArr['uvl_dwi_invcode'] = '';
				}

				if(!$invArr['dco_isyp'])
				{
					$twhere = sprintf(" and dct_begin <= %d AND dct_end >= %d AND ( (dctp_pc_type = 1 AND dctp_pc_id = %d ) OR (dctp_pc_type = 2 AND dctp_pc_id = %d) )", time(), time(), $ordArr['uvl_pc_pid'], $ordArr['uvl_pc_cid']);
					$table = 'dl_company_target_pcts JOIN dl_company_target ON dctp_dct_id = dct_id';
					$res = $this->get($table, ['distinct dct_dco_id'], $twhere);
					//此区域有独家代理
					if(!empty($res['data']))
					{
						//自己的代理区域
						if(in_array($invArr['dco_id'], array_column($res['data'], 'dct_dco_id')))
						{
							$dailiArea = 1;
						}
						else
						{
							//return LibFc::ReturnData(false, '此区域已有独家代理商，您提供的邀请码不能使用，请重新填写！');
						}
					}
				}
			}
		}

		//无邀请码的自动归属到平台
		if(empty($invArr))
		{
			$res = $this->get($invTable, ['*'], " and dwi_invcode ='01888'", true);
			$invArr = $res['data'];
		}

		$yluser = $invArr['dco_isyp'] ? $invArr['dwo_name']: '代理-'.$invArr['dco_short_name']; 
		$remark .= ' '.'邀请人：'.$invArr['dco_short_name'].'-'.$invArr['dwo_name'].'['.$invArr['dwi_invcode'].']';
		$remark .= $dmlRemark;
		$vipAddArr['uvip_remark'] = $remark;
		//vip成功购买记录
		$this->add('pl_user_vip', $vipAddArr);
		
		//平台账号不计入提成
		$moneyArr['gstc'] =  $invArr['dwi_'.$ordArr['uvl_style'].'_gstc'];
		if($moneyArr['gstc'] > $moneyArr['pay']) $moneyArr['gstc'] = $moneyArr['pay'];

		$moneyArr['selftc'] = sprintf("%.2f", $moneyArr['pay'] - $moneyArr['gstc']);
		if($moneyArr['selftc'] < 0) $moneyArr['selftc'] = '0.00';

		$moneyArr['ywytc'] = $invArr['dwi_'.$ordArr['uvl_style'].'_ywytc'];
		if($moneyArr['ywytc'] > $moneyArr['selftc'] || $moneyArr['ywytc'] < 0) $moneyArr['ywytc'] = '0.00';

		//跑街业绩记录
		$PjlMoney = new PjlMoney();

		//代理业绩
		$addArr = [
			'dml_dco_id'=>$invArr['dco_id'],
			'dml_dwo_uid'=>$invArr['dwo_uid'],
			'dml_dwo_name'=>$invArr['dwo_name'],
			'dml_dwi_invcode'=>$invArr['dwi_invcode'],
			'dml_order_uid'=>$ordArr['pu_uid'],
			'dml_style'=>$ordArr['uvl_style'],
			'dml_order_id'=>$ordArr['uvl_id'],
			'dml_shop_id'=>$ordArr['pu_uid'],
			'dml_por_id'=>$ordArr['uvl_por_id'],
			'dml_pc_pid'=>$ordArr['uvl_pc_pid'],
			'dml_pc_cid'=>$ordArr['uvl_pc_cid'],
			'dml_money_pay'=>$moneyArr['pay'],
			'dml_money_gstc'=>$moneyArr['gstc'],
			'dml_money_selftc'=>$moneyArr['selftc'],
			'dml_money_ywytc'=>$moneyArr['ywytc'],
			'dml_atime'=>$now,
			'dml_remark'=>$remark,
			'dml_daili_area'=>$dailiArea
		];
		$res = $this->add('dl_order_list', $addArr);
		$dml_id = $res['data'];

		/*
		//2023/6/1取消自动录入，人工记录
		$payBy = ['weixin'=>'微信', 'alipay'=>'支付宝'];
		$yjArr = [
			'yl_title'=>$title,
			'yl_status'=>0,
			'yl_xiangmu'=>$xiangmu,
			'yl_xiangmu_des'=>$ordArr['uvl_style'] == 'shop'? '':$ordArr['vip_name'],
			'yl_user'=>$yluser,
			'yl_pay_money'=>$moneyArr['pay'],
			'yl_user_money'=>$moneyArr['selftc'],
			'yl_pay_by'=>$dataArr['pay_method'],
			'yl_pay_style'=>$dataArr['pay_style'],
			'yl_pay_time'=>!empty($dataArr['pay_time'])? strtotime($dataArr['pay_time']): time(),
			'yl_add_user'=>'系统',
			'yl_remark'=>$remark,
			'yl_dml_id'=>$dml_id,
			'yl_por_id'=>$ordArr['uvl_por_id']
		];
		$res = $PjlMoney->addPjlYj($yjArr);
		$yl_id = $res['data'];*/
		
		//新总业绩
		/*$CrmsbMain = new CrmsbMain();
		$autoYjArr = [
			'mon_date'=>!empty($dataArr['pay_time'])? strtotime($dataArr['pay_time']): time(),
			'mon_customer_name'=>empty($ordArr['shop_name']) ? $ordArr['u_name']: $ordArr['u_name'].'【'.$ordArr['shop_name'].'】',
			'mon_u_name'=>$yluser,
			'mon_ypt_id'=>10,
			'mon_remark'=>$remark,
			'server'=>[
				'mos_site_id'=>2,
				'mos_ser_id'=>$ordArr['uvl_style'] == 'shop'? 26: 27,
				'mos_sertype'=>$xufei? 2: 1,
				'mos_pay_money'=>$moneyArr['pay'],
				'mos_user_money'=>$moneyArr['selftc'],
				'mos_remark'=>$ordArr['uvl_style'] == 'shop'? '':$ordArr['vip_name'],
				'mos_from'=>'PJLVIP',
				'mos_from_id'=>$uvlId
			]
		];
		$CrmsbMain->addAutoYeji($autoYjArr);
		*/
		//完成目标数+1
		if($dailiArea && $ordArr['uvl_style'] == 'shop')
		{
			$this->set('dl_company_target', ['dct_shop_ok'=>'#@dct_shop_ok+1'], sprintf(" and dct_dco_id=%d and dct_begin <= %d and dct_end>=%d", $invArr['dco_id'], time(), time()));
		}

		/*if(!empty($invArr['dwo_uid']))
		{
			$CrmMain = new CrmMain();
			$CrmMain->changeCtrAutoStatus(0, $invArr['dwo_uid'], $ordArr['pu_uid']);
		}*/

		$this->PjlDb->End();
		
		//CRM合同
		$MainRabbit = new MainRabbit('TJ_OTH');
		$MainRabbit->send([json_encode(['DTYPE'=>'PJLVIP', 'uvl_id'=>$uvlId])]);

		$res = $this->get('pl_shop', ['shop_id'], sprintf(" and shop_pu_id=%d", $ordArr['pu_uid']), true);
		if(!empty($res['data'])){
			$PjlShop = new PjlShop();
			$PjlShop->updateShopAddr($ordArr['pu_uid']);
			//机器人
			$PjlShop->autoSetWxrobot($ordArr['pu_uid']);
		}
		return LibFc::ReturnData(true, true);
	}





	/**
	  * @method 申请体验会员
	  * @param  uid	   int [必填] 会员ID	  
	  * @author soul
	  * @copyright 2018/9/20
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function applyFreeVip($uid)
	{
		$res = $this->checkCanFreeVip($uid);
		if($res['data'])
		{
			$res = $this->get('pl_vip_level', ['*'], ' and vip_id=1', true);
			$freeArr = $res['data'];
			$this->PjlDb->Begin();
			$now = time();
			$etime = strtotime($freeArr['vin_time'], $now);
			$addArr = [
				'uvl_uid'=>$uid,
				'uvl_status'=>2,
				'uvl_now_vip_id'=>1,
				'uvl_now_btime'=>$now,
				'uvl_now_etime'=>$etime,
				'uvl_paymoney'=>'0.00',
				'uvl_month'=>0,
				'uvl_price'=>'0.00',
				'uvl_btime'=>time()
			];
			$res = $this->add('pl_user_vip_list', $addArr);
			$uvlId = $res['data'];

			$addArr = [
				'uvip_uid'=>$uid,
				'uip_uvl_id'=>$uvlId,
				'uvip_btime'=>$now,
				'uvip_etime'=>$etime,
				'uvip_vip_id'=>$freeArr['vip_id'],
				'uvip_name'=>$freeArr['vip_name'],
				'uvip_vin_count'=>$freeArr['vip_vin_count'],
				'uvip_number_count'=>$freeArr['vip_number_count'],
				'uvip_etk_count'=>$freeArr['vip_etk_count'],
				'uvip_cyj_count'=>$freeArr['vip_cyj_count'],
				'uvip_atime'=>time(),
				'uvip_paymoney'=>'0.00'
			];
			$this->add('pl_user_vip', $addArr);
			$this->PjlDb->End();
			return LibFc::ReturnData(true, true);
		}
		else
		{
			return LibFc::ReturnData(false, '对不起，您已经领取过免费体验会员，或者您不是体验会员目标用户！');
		}
	}



	/**
	  * @method 申请体验商铺权益 15天
	  * @param  uid	   int [必填] 会员ID	  
	  * @author soul
	  * @copyright 2020/2/15
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function applyFreeShop($uid)
	{
		$uid = (int) $uid;
		$res = $this->get('pl_shop', ['shop_id', 'shop_vip_etime'], sprintf(" and shop_pu_id=%d limit 1", $uid), true);
		if(empty($res['data']))
			return LibFc::ReturnData(false, '尚未申请商铺入驻，请先提交申请入驻!');
		if(!empty($res['data']['shop_vip_etime']))
			return LibFc::ReturnData(false, '对不起，您已经领取过免费体验商铺，或者您不是体验商铺目标用户！');
		$etime = strtotime('+15 day');
		$shopid = $res['data']['shop_id'];
		$this->PjlDb->Begin();
		$this->set('pl_shop', ['shop_vip_etime'=>$etime], sprintf(" and shop_id=%d", $shopid));
		$addArr = [
			'svip_shop_id'=>$shopid,
			'svip_btime'=>time(),
			'svip_etime'=>$etime,
			'svip_style'=>2
		];
		$res = $this->add('pl_shop_vip', $addArr);
		$this->PjlDb->End();
		return $res;
	}



	/**
	  * @method 关闭VIP订单
	  * @param  uvlIdArr	   array [必填] 订单ID	  
	  * @author soul
	  * @copyright 2018/9/20
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function closeVipOrder($uvlIdArr)
	{
		foreach($uvlIdArr as $k=>$v)
		{
			$uvlIdArr[$k] = (int) $v;
		}
		if(!empty($uvlIdArr))
		{
			$this->PjlDb->Begin();
			$res = $this->get('pl_user_vip_list', ['uvl_id', 'uvl_por_id'], sprintf(" and uvl_id in (%s) and uvl_status = 0 and uvl_por_id > 0", implode(',', $uvlIdArr)));
			$closeArr = $res['data'];
			$MainOrder = new MainOrder();
			foreach($closeArr as $v)
			{
				$res = $MainOrder->checkPay($v['uvl_por_id']);
				if($res['data']['por_status'] == 1)
				{
					$this->checkVipOrderPay($v['uvl_id']);
				}
				else
				{
					$MainOrder->closePay($v['uvl_por_id']);
				}
			}
			$setArr = [
				'uvl_status'=>-1,
				'uvl_close_time'=>time()
			];
			$this->set('pl_user_vip_list', $setArr, sprintf(" and uvl_id in (%s) and uvl_status = 0", implode(',', $uvlIdArr)));
			$this->PjlDb->End();
		}
		return LibFc::ReturnData(true);
	}


	/**
	  * @method 获取VIP订单支付的支付信息
	  * @param  uvlId	   int [必填] 订单ID	  
	  * @param  payBy  weixin|alipay
	  * @param  payType  pc:扫码 app:APP wap:手机网 gzh:公众号
	  * @author soul
	  * @copyright 2018/9/20
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function payVipOrder($uvlId, $payBy, $payType, $othArr = [])
	{
		$uvlId = (int) $uvlId;
		if(!in_array($payBy, ['weixin', 'alipay']) || empty($payBy) || $uvlId < 1)
			return LibFc::ReturnData(false, '提供的付款参数不正确！');

		$res = $this->get('pl_user_vip_list', ['*'], sprintf(" and uvl_id =%d", $uvlId), true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '订单不存在！');
		$ordArr = $res['data'];
		if($ordArr['uvl_status'] == 0){
		}else if($ordArr['uvl_status'] >= 1){
			return LibFc::ReturnData(false, '订单'.$uvlId.'已支付，请勿重复付款！');
		}else if($ordArr['uvl_status'] == -1){
			return LibFc::ReturnData(false, '订单'.$uvlId.'已取消，请勿付款！');
		}else{
			return LibFc::ReturnData(false, '订单'.$uvlId.'异常，请稍后重试！');
		}
		
		$MainOrder = new MainOrder();
		$newOrderFlag = true;
		if(!empty($ordArr['uvl_por_id']))
		{
			$res = $MainOrder->get('pa_order', ['por_status'], sprintf(" and por_id=%d and por_pay_method='%s' and por_pay_type='%s'", $ordArr['uvl_por_id'], $payBy, LibFc::Escape($payType)), true);
			if(!empty($res['data']))
			{
				$newOrderFlag = false;
				$payMsg = $MainOrder->getPayPage($ordArr['uvl_por_id']);
				$payMsg = $payMsg['data'];
			}
			else
			{
				$MainOrder->closePay($ordArr['uvl_por_id']);
			}
		}

		if($newOrderFlag)
		{
			$dataArr = [
				'por_guid'=>LibFc::guid(),
				'por_u_id'=>$ordArr['uvl_uid'],
				'por_style'=>'PJLVIP',
				'por_orderids'=>$ordArr['uvl_id'],
				'por_pay_method'=>$payBy,
				'por_pay_type'=>$payType,
				'por_money'=>$ordArr['uvl_paymoney'],
				'por_title'=>$ordArr['uvl_style'] == 'shop'? '跑街令-商家入驻订单：'.$ordArr['uvl_id']:'跑街令-电脑版VIP会员订单：'.$ordArr['uvl_id'],
				'por_back_url'=>$othArr['backurl'],
				'por_wx_openid'=>$othArr['wxopenid'],
				'por_from'=>$othArr['from']
			];
			$payMsg = $MainOrder->buildPay($dataArr);
			$payMsg = $payMsg['data'];
			$this->set('pl_user_vip_list', ['uvl_por_id'=>$payMsg['por_id'], 'uvl_por_guid'=>$dataArr['por_guid']], sprintf(" and uvl_id=%d", $uvlId));
		}
		return LibFc::ReturnData(true, $payMsg);
	}
	

	/**
	  * @method 检查VIP订单支付
	  * @param  uvlId	   int [必填] 订单ID	  
	  * @author soul
	  * @copyright 2018/9/20
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function checkVipOrderPay($uvlId)
	{
		$uvlId = (int) $uvlId;
		$filed = ['pu_uid, shop_name, uvl_id, uvl_style, uvl_status, uvl_paymoney, uvl_por_id, uvl_now_vip_id, uvl_now_btime, uvl_now_etime, uvl_dco_id, uvl_dwi_invcode, uvl_pc_pid, uvl_pc_cid, l.*'];
		$table = 'pl_user_vip_list 
		join pl_user on pu_uid=uvl_uid 
		join pl_vip_level as l on uvl_now_vip_id = vip_id
		left join pl_shop on shop_pu_id = pu_uid';
		$res = $this->get($table, $filed, sprintf(" and uvl_id =%d", $uvlId), true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '订单不存在！');
		$ordArr = $res['data'];
		if($ordArr['uvl_status'] == 0)
		{
			$MainOrder = new MainOrder();
			$res = $MainOrder->checkPay($ordArr['uvl_por_id']);
			$payMsg = $res['data'];
			if($payMsg['por_status'] == 1 && $payMsg['por_money'] == $ordArr['uvl_paymoney'])
			{
				$xiangmu = 'PC会员';
				$YpwBase = new YpwBase();
				$res = $YpwBase->Get('yp_user', ['u_name'], sprintf(" and u_id=%d", $ordArr['pu_uid']), true);
				$uArr = $res['data'];
				$ordArr = array_merge($ordArr, $uArr);

				//记录是否已经存在
				$title = empty($ordArr['shop_name']) ? $ordArr['u_name'].' 买'.$ordArr['vip_name']: $ordArr['u_name'].'【'.$ordArr['shop_name'].'】 ';
				$remark = $payMsg['por_title'];
				$res = $this->get('pl_user_vip', ['*'], sprintf(" and uip_uvl_id = %d", $uvlId), true);
				if(!empty($res['data'])) return LibFc::ReturnData(true, $ordArr);

				$moneyArr = [
					'pay'=>$ordArr['uvl_paymoney'],
					'gstc'=>$ordArr['uvl_paymoney'],
					'selftc'=>0.00,
				];

				$now = time();
				$payArr = [
					'uvl_status'=>2,	
					'uvl_pay_time'=>$payMsg['por_pay_time'],
					'uvl_ok_time'=>$now
				];
				$xufei = false;
				if($now > $ordArr['uvl_now_btime'])
				{
					$ordArr['uvl_now_etime'] = $ordArr['uvl_now_etime'] + $now - $ordArr['uvl_now_btime'];
					$ordArr['uvl_now_btime'] = $now;
					$payArr['uvl_now_btime'] = $ordArr['uvl_now_btime'];
					$payArr['uvl_now_etime'] = $ordArr['uvl_now_etime'];
				}

				$this->PjlDb->Begin();
				$this->set('pl_user_vip_list',$payArr, sprintf(" and uvl_id=%d", $uvlId));
				$ordArr = array_merge($ordArr, $payArr);
				
				//VIP列表
				$vipAddArr = [
					'uvip_uid'=>$ordArr['pu_uid'],
					'uip_uvl_id'=>$uvlId,
					'uvip_btime'=>$ordArr['uvl_now_btime'],
					'uvip_etime'=>$ordArr['uvl_now_etime'],
					'uvip_vip_id'=>$ordArr['uvl_now_vip_id'],
					'uvip_name'=>$ordArr['vip_name'],
					'uvip_vin_count'=>$ordArr['vip_vin_count'],
					'uvip_number_count'=>$ordArr['vip_number_count'],
					'uvip_etk_count'=>$ordArr['vip_etk_count'],
					'uvip_cyj_count'=>$ordArr['vip_cyj_count'],
					'uvip_atime'=>time(),
					'uvip_paymoney'=>$moneyArr['pay']
				];

				//商家入驻
				if($ordArr['uvl_style'] == 'shop')
				{
					$title .= '商家入驻';
					$xiangmu = '商家入驻';
					$res = $this->get('pl_shop', ['shop_status, shop_id, shop_enter_time, shop_vip_etime'], sprintf(" and shop_id=%d", $ordArr['pu_uid']), true);
					$shopData = $res['data'];
					if(!empty($shopData['shop_vip_etime'])) $xufei = 1;
					$btime = !empty($shopData['shop_vip_etime']) && $shopData['shop_vip_etime'] >= $now ? $shopData['shop_vip_etime']: $now;
					$etime = $ordArr['uvl_now_etime'] - $ordArr['uvl_now_btime'] + $btime;
					$addArr = [
						'svip_shop_id'=>$ordArr['pu_uid'],
						'svip_uvl_id'=>$uvlId,
						'svip_btime'=>$btime,
						'svip_etime'=>$etime
					];
					$this->add('pl_shop_vip', $addArr);
					$sArr = [];
					if($shopData['shop_status'] != 2)
					{
						$sArr = [
							'shop_status'=>2,
							'shop_enter_pay'=>1,
							'shop_checkby'=>json_encode([
								'name'=>'系统',
								'result'=>'1',
								'remark'=>'恭喜您成功入驻跑街令，请移步PC端导入产品目录，地址为：https://pc.paojd.cn',
								'time'=>time()
							])
						];
					}
					$sArr['shop_vip_etime'] = $etime;
					if(empty($shopData['shop_enter_time'])) $sArr['shop_enter_time'] = time();
					$this->set('pl_shop', $sArr, sprintf(" and shop_id=%d", $ordArr['pu_uid']));
				}
				else
				{
					$res = $this->get('pl_user_vip', ['uvip_vip_id'], sprintf(" and uvip_uid=%d order by uvip_id desc limit 1", $ordArr['pu_uid']), true);
					if(!empty($res['data']) && $res['data']['uvip_vip_id'] == $ordArr['uvl_now_vip_id']) $xufei = 1;

					$title .= '购买'.$ordArr['vip_name'];
					//购买PC年卡自动延长店铺有效期
					if($ordArr['uvl_style'] == 'pcyear')
					{
						$res = $this->get('pl_shop', ['shop_status, shop_id, shop_enter_time, shop_vip_etime'], sprintf(" and shop_id = %d group by shop_id", $ordArr['pu_uid']), true);
						if(!empty($res['data']))
						{
							$shopData = $res['data'];
							$btime = !empty($shopData['shop_vip_etime']) && $shopData['shop_vip_etime'] >= $now ? $shopData['shop_vip_etime']: $now;
							$etime = $ordArr['uvl_now_etime'] - $ordArr['uvl_now_btime'] + $btime;
							$addArr = [
								'svip_shop_id'=>$ordArr['pu_uid'],
								'svip_uvl_id'=>$uvlId,
								'svip_btime'=>$btime,
								'svip_etime'=>$etime
							];
							$this->add('pl_shop_vip', $addArr);
							$sArr = [];
							if($shopData['shop_status'] != 2)
							{
								$sArr = [
									'shop_status'=>2,
									'shop_enter_pay'=>1,
									'shop_checkby'=>json_encode([
										'name'=>'系统',
										'result'=>'1',
										'remark'=>'恭喜您成功入驻跑街令，请移步PC端导入产品目录，地址为：https://pc.paojd.cn',
										'time'=>time()
									])
								];
							}
							$sArr['shop_vip_etime'] = $etime;
							if(empty($shopData['shop_enter_time'])) $sArr['shop_enter_time'] = time();
							$this->set('pl_shop', $sArr, sprintf(" and shop_id=%d", $ordArr['pu_uid']));
						}
					}
				}

				//代理邀请码、计算提成
				$invArr = [];
				
				//默认非代理区域
				$dailiArea = 0;
				$invTable = 'dl_worker_invcode as a join dl_worker on dwi_dwo_uid=dwo_uid and dwi_dco_id = dwo_dco_id and dwo_status =1 join dl_company on dwo_dco_id=dco_id and dco_status = 1';
				//此邀请码是否能使用
				$dmlRemark = '';
				
				//客户是否有业务员，非所属业务员的邀请码会被清空
				$CrmMain = new CrmMain();
				$YpwBase = new YpwBase();
				$res = $YpwBase->get('yp_user', ['u_mobile'], sprintf(" and u_mobile_check='Y' and u_id=%d", $ordArr['pu_uid']), true);
				$mobile = $res['data']['u_mobile'];
				$res = $CrmMain->checkMobileSales($mobile);
				if(!empty($res['data'])){
					$ctrArr = $res['data'];
					$chkflag = false;
					if($ctrArr['cca_level_id'] == 5){
						$chkflag = true;
					}else{//非成交
						//最近3个月是否有跟进
						$res = $CrmMain->get('crm_follow', ['cfo_id'], sprintf(" and cfo_au_uid=%d and cfo_ctr_id=%d and cfo_pass=1 and cfo_atime>%d limit 1", $ctrArr['au_uid'], $ctrArr['ctr_id'], strtotime('-3 month')), true);
						if(!empty($res['data'])){
							$chkflag = true;
						}
					}
					if($chkflag){
						$res = $this->get($invTable, ['*'], sprintf(" and dwi_dwo_uid =%d", $ctrArr['au_uid']), true);
						$invArr = $res['data'];
						$dmlRemark = ' [自动归属]';
					}
				}

				if(empty($invArr) && !empty($ordArr['uvl_dwi_invcode']))
				{
					$res = $this->get($invTable, ['*'], sprintf(" and dwi_invcode ='%s'", LibFc::Escape($ordArr['uvl_dwi_invcode'])), true);
					if(!empty($res['data']))
					{
						$invArr = $res['data'];
						//客户是否有业务员，非所属业务员的邀请码会被清空
						$CrmMain = new CrmMain();
						$res = $CrmMain->get('crm_customer JOIN crm_customer_admin ON cca_ctr_id=ctr_id', ['cca_au_uid'], sprintf(" and ctr_uid=%d and cca_au_uid != 172999 and cca_end_time > %d", $ordArr['pu_uid'], time()));
						if(!empty($res['data']) && !in_array($invArr['dwo_uid'], array_column($res['data'], 'cca_au_uid'))){
							$invArr = [];
							$dmlRemark = ' 非自己的客户邀请码'.$ordArr['uvl_dwi_invcode'].'无效';
							$ordArr['uvl_dwi_invcode'] = '';
						}
						if(!$invArr['dco_isyp'])
						{
							$twhere = sprintf(" and dct_begin <= %d AND dct_end >= %d AND ( (dctp_pc_type = 1 AND dctp_pc_id = %d ) OR (dctp_pc_type = 2 AND dctp_pc_id = %d) )", time(), time(), $ordArr['uvl_pc_pid'], $ordArr['uvl_pc_cid']);
							$table = 'dl_company_target_pcts JOIN dl_company_target ON dctp_dct_id = dct_id join dl_company on dco_id = dct_dco_id';
							$res = $this->get($table, ['dco_id, dco_dltype'], $twhere);
							//此区域有独家代理
							if(!empty($res['data']))
							{
								//自己的代理区域
								if(in_array($invArr['dco_id'], array_column($res['data'], 'dco_id')))
								{
									$dailiArea = 1;
								}
								else if(in_array(1, array_column($res['data'], 'dco_dltype')))
								{
									return LibFc::ReturnData(false, '此区域已有独家代理商，您提供的邀请码不能使用，请重新填写！');
								}
							}
						}
					}
				}
			
				//个人分享的？
				if(empty($invArr))
				{
					$res = $this->get('pl_share_order', ['*'], sprintf(" and sor_uvl_id = %d", $uvlId), true);
					if(!empty($res['data']))
					{
						$sorArr = $res['data'];
						$res = $YpwBase->Get('yp_user', ['u_name'], sprintf(" and u_id=%d", $sorArr['sor_pu_id']), true);
						$sorArr = array_merge($sorArr, $res['data']);
						$res = $this->get($invTable, ['*'], " and dwi_invcode ='0166'", true);
						$invArr = $res['data'];
						$dmlRemark = '会员:'.$sorArr['u_name'].'['.$sorArr['sor_share_code'].']';
					}
				}

				//无邀请码的自动归属到平台
				if(empty($invArr))
				{
					$res = $this->get($invTable, ['*'], " and dwi_invcode ='01888'", true);
					$invArr = $res['data'];
				}
				$vipAddArr['uvip_remark'] = '邀请人：'.$invArr['dco_short_name'].'-'.$invArr['dwo_name'].'['.$invArr['dwi_invcode'].']';

				if(!empty($sorArr))
				{
					//提成不一致时，重新修改
					if($sorArr['sor_selftc_money'] != $invArr['dwi_'.$ordArr['uvl_style'].'_ywytc'])
						$this->set('pl_share_order', ['sor_selftc_money'=>$invArr['dwi_'.$ordArr['uvl_style'].'_ywytc']], sprintf(" and sor_uvl_id=%d", $uvlId));
				}
				if($dmlRemark) $vipAddArr['uvip_remark'] .= ' '.$dmlRemark;
				
				$yluser = $invArr['dco_isyp'] ? $invArr['dwo_name']: '代理-'.$invArr['dco_short_name']; 
				$remark .= ' '.$vipAddArr['uvip_remark'];
				//vip成功购买记录
				$this->add('pl_user_vip', $vipAddArr);

				//终止体验的
				$this->set('pl_user_vip', ['uvip_etime'=>$vipAddArr['uvip_btime']], sprintf(" and uvip_uid=%d and uvip_vip_id = 1 and uvip_etime > %d", $vipAddArr['uvip_uid'], $vipAddArr['uvip_btime']));
				
				//平台账号不计入提成
				$moneyArr['gstc'] =  $invArr['dwi_'.$ordArr['uvl_style'].'_gstc'];
				//支付金额少于平台提成金额
				if($moneyArr['pay'] < $moneyArr['gstc']) $moneyArr['gstc'] = $moneyArr['pay'];

				//代理商提成
				$moneyArr['selftc'] = $moneyArr['pay'] - $moneyArr['gstc'] < 0? '0.00': sprintf("%.2f", $moneyArr['pay'] - $moneyArr['gstc']);

				//业务提成
				$moneyArr['ywytc'] = $invArr['dwi_'.$ordArr['uvl_style'].'_ywytc'];
				$moneyArr['ywytc'] = $moneyArr['selftc'] < $moneyArr['ywytc']? '0.00': $moneyArr['ywytc'];

				if($invArr['dco_isyp'] && $invArr['dwi_shop_ywytc'] > 0 && $ordArr['uvl_style'] == $this->HDCFG['style'] && $now >= $this->HDCFG['btime'] && $now <= $this->HDCFG['etime'])
				{//双11非代理提成
					
					foreach($this->HDCFG['price'] as $hprice)
					{
						if($hprice['price'] == $moneyArr['pay']){
							if(isset($hprice['tc1']) && $hprice['tc1'] < $moneyArr['pay']){
								if(!empty($hprice['tc2']) && $invArr['dwi_shop_ywytc'] < 150){//客服100
									$hprice['tc1'] = $hprice['tc2'];
								}
								$moneyArr['selftc'] = sprintf("%.2f",$hprice['tc1']);
								$moneyArr['ywytc'] = sprintf("%.2f",$hprice['tc1']);
								$moneyArr['gstc'] = sprintf("%.2f",$moneyArr['pay'] - $hprice['tc1']);
							}
							break;
						}
					}
				}
				
				//跑街业绩记录
				$PjlMoney = new PjlMoney();

				//代理业绩
				$addArr = [
					'dml_dco_id'=>$invArr['dco_id'],
					'dml_dwo_uid'=>$invArr['dwo_uid'],
					'dml_dwo_name'=>$invArr['dwo_name'],
					'dml_dwi_invcode'=>$invArr['dwi_invcode'],
					'dml_order_uid'=>$ordArr['pu_uid'],
					'dml_style'=>$ordArr['uvl_style'],
					'dml_order_id'=>$ordArr['uvl_id'],
					'dml_shop_id'=>$ordArr['pu_uid'],
					'dml_por_id'=>$ordArr['uvl_por_id'],
					'dml_pc_pid'=>$ordArr['uvl_pc_pid'],
					'dml_pc_cid'=>$ordArr['uvl_pc_cid'],
					'dml_money_pay'=>$moneyArr['pay'],
					'dml_money_gstc'=>$moneyArr['gstc'],
					'dml_money_selftc'=>$moneyArr['selftc'],
					'dml_money_ywytc'=>$moneyArr['ywytc'],
					'dml_atime'=>$now,
					'dml_daili_area'=>$dailiArea,
					'dml_remark'=>$dmlRemark
				];
				$res = $this->add('dl_order_list', $addArr);
				$dml_id = $res['data'];
				
				$payBy = ['weixin'=>'微信', 'alipay'=>'支付宝'];
				if($xufei) $title .= '续费';
				$yjArr = [
					'yl_title'=>$title,
					'yl_status'=>1,
					'yl_xiangmu'=>$xiangmu,
					'yl_xiangmu_des'=>$ordArr['uvl_style'] == 'shop'? '':$ordArr['vip_name'],
					'yl_user'=>$yluser,
					'yl_pay_money'=>$moneyArr['pay'],
					'yl_user_money'=>$moneyArr['selftc'],
					'yl_pay_by'=>$payBy[$payMsg['por_pay_method']],
					'yl_pay_style'=>'对公',
					'yl_pay_time'=>!empty($payMsg['por_pay_time'])? $payMsg['por_pay_time']: time(),
					'yl_check_time'=>time(),
					'yl_add_user'=>'系统',
					'yl_check_user'=>'系统',
					'yl_remark'=>$remark,
					'yl_dml_id'=>$dml_id,
					'yl_por_id'=>$payMsg['por_id']
				];
				$res = $PjlMoney->addPjlYj($yjArr);
				$yl_id = $res['data'];
				
				//新总业绩
				$CrmsbMain = new CrmsbMain();
				$autoYjArr = [
					'mon_date'=>!empty($payMsg['por_pay_time'])? $payMsg['por_pay_time']: time(),
					'mon_customer_name'=>empty($ordArr['shop_name']) ? $ordArr['u_name']: $ordArr['u_name'].'【'.$ordArr['shop_name'].'】',
					'mon_u_name'=>$yluser,
					'mon_ypt_id'=>$payMsg['por_pay_method'] == 'alipay'? 8: 9,
					'mon_remark'=>$remark,
					'server'=>[
						'mos_site_id'=>2,
						'mos_ser_id'=>$ordArr['uvl_style'] == 'shop'? 26: 27,
						'mos_sertype'=>$xufei? 2: 1,
						'mos_pay_money'=>$moneyArr['pay'],
						'mos_user_money'=>$moneyArr['selftc'],
						'mos_remark'=>$ordArr['uvl_style'] == 'shop'? '':$ordArr['vip_name'],
						'mos_from'=>'PJLVIP',
						'mos_from_id'=>$uvlId
					]
				];
				$CrmsbMain->addAutoYeji($autoYjArr);

				//完成目标数+1
				if($dailiArea && $ordArr['uvl_style'] == 'shop')
				{
					$this->set('dl_company_target', ['dct_shop_ok'=>'#@dct_shop_ok+1'], sprintf(" and dct_dco_id=%d and dct_begin <= %d and dct_end>=%d", $invArr['dco_id'], time(), time()));
				}
				
				//清空现有邀请码
				$this->set('pl_shop', ['shop_dwi_invcode'=>''], sprintf(" and shop_id=%d", $ordArr['pu_uid']));

				$this->PjlDb->End();
				
				//CRM合同
				$MainRabbit = new MainRabbit('TJ_OTH');
				$MainRabbit->send([json_encode(['DTYPE'=>'PJLVIP', 'uvl_id'=>$uvlId])]);

				
				$res = $this->get('pl_shop', ['shop_id'], sprintf(" and shop_pu_id=%d", $ordArr['pu_uid']), true);
				if(!empty($res['data'])){
					$PjlShop = new PjlShop();
					$PjlShop->updateShopAddr($ordArr['pu_uid']);
					//机器人
					$PjlShop->autoSetWxrobot($ordArr['pu_uid']);
				}

				//crm
				/*if(!empty($invArr['dwo_uid']))
				{
					$CrmMain = new CrmMain();
					$CrmMain->changeCtrAutoStatus(0, $invArr['dwo_uid'], $ordArr['pu_uid']);
				}*/
			}

		}else if($ordArr['uvl_status'] >= 1){
			
		}else if($ordArr['uvl_status'] == -1){
			return LibFc::ReturnData(false, '订单'.$uvlId.'已取消，请勿付款！');
		}else{
			return LibFc::ReturnData(false, '订单'.$uvlId.'异常，请稍后重试！');
		}
		return LibFc::ReturnData(true, $ordArr);
	}




	/**
	  * @method 创建资源包订单
	  * @param  uid	   int [必填] 会员ID	  
	   * @param  vin  int [必填] 数量	  
	  * @param  number  int [必填] 数量  
	  * @param  etk  int [必填] 数量  
	  * @author soul
	  * @copyright 2018/9/20
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function buildPacOrder($uid, $vin, $number, $etk)
	{
		$res = $this->get('pl_user_vip', ['*'], sprintf(" and uvip_uid=%d order by uvip_etime desc limit 1", $uid), true);
		$userArr = $res['data'];
		if($userArr['uvip_etime'] < time())
			return LibFc::ReturnData(false, '开通会员后才可以购买资源包！');

		if($vin < 1 && $number < 1 && $etk < 1)
			return LibFc::ReturnData(false, '请选择需要资源包的查询次数！');
		
		$vin = (int) $vin;
		$number = (int) $number;
		$etk = (int) $etk;
		$priceArr = mvc::$cfg['PJL_PAC_PRICE'];
		$money = sprintf("%.2f", $vin*$priceArr['vin']+$number*$priceArr['number']+$etk*$priceArr['etk']);

		$this->PjlDb->Begin();

		//关闭之前尚未支付的订单
		$res = $this->get('pl_user_pac_list', ['upl_id'], sprintf(" and upl_uid=%d and upl_status = 0", $uid));
		if(!empty($res['data']))
		{
			$this->closePacOrder(array_column($res['data'], 'upl_id'));
		}

		$addArr = [
			'upl_uid'=>$userArr['uvip_uid'],
			'upl_status'=>0,
			'upl_vin_count'=>$vin,
			'upl_number_count'=>$number,
			'upl_etk_count'=>$etk,
			'upl_paymoney'=>$money,
			'upl_btime'=>time()
		];
		$this->PjlDb->End();
		return $this->add('pl_user_pac_list', $addArr);
	}


	/**
	  * @method 关闭资源包订单
	  * @param  uplIdArr	   array [必填] 订单ID	  
	  * @author soul
	  * @copyright 2018/9/20
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function closePacOrder($uplIdArr)
	{
		foreach($uplIdArr as $k=>$v)
		{
			$uplIdArr[$k] = (int) $v;
		}
		if(!empty($uplIdArr))
		{
			$this->PjlDb->Begin();
			$res = $this->get('pl_user_pac_list', ['upl_id', 'upl_por_id'], sprintf(" and upl_id in (%s) and upl_status = 0 and upl_por_id > 0", implode(',', $uplIdArr)));
			$closeArr = $res['data'];
			$MainOrder = new MainOrder();
			foreach($closeArr as $v)
			{
				$res = $MainOrder->checkPay($v['upl_por_id']);
				if($res['data']['por_status'] == 1)
				{
					$this->checkPacOrderPay($v['upl_id']);
				}
				else
				{
					$MainOrder->closePay($v['upl_por_id']);
				}
			}
			$setArr = [
				'upl_status'=>-1,
				'upl_close_time'=>time()
			];
			$this->set('pl_user_pac_list', $setArr, sprintf(" and upl_id in (%s) and upl_status = 0", implode(',', $uplIdArr)));
			$this->PjlDb->End();
		}
		return LibFc::ReturnData(true);
	}


	/**
	  * @method 获取资源包订单支付的支付信息
	  * @param  uplId	   int [必填] 订单ID	  
	  * @param  payBy  weixin|alipay
	  * @param  payType  pc:扫码 app:APP wap:手机网 gzh:公众号
	  * @author soul
	  * @copyright 2018/9/20
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function payPacOrder($uplId, $payBy, $payType, $othArr = [])
	{
		$uplId = (int) $uplId;
		if(!in_array($payBy, ['weixin', 'alipay']) || empty($payBy) || $uplId < 1)
			return LibFc::ReturnData(false, '提供的付款参数不正确！');

		$res = $this->get('pl_user_pac_list', ['*'], sprintf(" and upl_id =%d", $uplId), true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '订单不存在！');
		$ordArr = $res['data'];
		if($ordArr['upl_status'] == 0){
		}else if($ordArr['upl_status'] >= 1){
			return LibFc::ReturnData(false, '订单已支付，请勿重复付款！');
		}else if($ordArr['upl_status'] == -1){
			return LibFc::ReturnData(false, '订单已取消，请勿付款！');
		}else{
			return LibFc::ReturnData(false, '订单异常，请稍后重试！');
		}
		
		$MainOrder = new MainOrder();
		$newOrderFlag = true;
		if(!empty($ordArr['upl_por_id']))
		{
			$res = $MainOrder->get('pa_order', ['por_status'], sprintf(" and por_id=%d and por_pay_method='%s' and por_pay_type='%s'", $ordArr['upl_por_id'], $payBy, LibFc::Escape($payType)), true);
			if(!empty($res['data']))
			{
				$newOrderFlag = false;
				$payMsg = $MainOrder->getPayPage($ordArr['upl_por_id']);
				$payMsg = $payMsg['data'];
			}
			else
			{
				$MainOrder->closePay($ordArr['upl_por_id']);
			}
		}

		if($newOrderFlag)
		{
			$dataArr = [
				'por_guid'=>LibFc::guid(),
				'por_u_id'=>$ordArr['upl_uid'],
				'por_style'=>'PJLPAC',
				'por_orderids'=>$ordArr['upl_id'],
				'por_pay_method'=>$payBy,
				'por_pay_type'=>$payType,
				'por_money'=>$ordArr['upl_paymoney'],
				'por_title'=>'跑街令-电脑版资源包订单：'.$ordArr['upl_id'],
				'por_back_url'=>$othArr['backurl'],
				'por_wx_openid'=>$othArr['wxopenid'],
				'por_from'=>$othArr['from']
			];
			$payMsg = $MainOrder->buildPay($dataArr);
			$payMsg = $payMsg['data'];
			$this->set('pl_user_pac_list', ['upl_por_id'=>$payMsg['por_id'], 'upl_por_guid'=>$dataArr['por_guid']], sprintf(" and upl_id=%d", $uplId));
		}
		return LibFc::ReturnData(true, $payMsg);
	}
	

	/**
	  * @method 检查资源包订单支付
	  * @param  uplId	   int [必填] 订单ID	  
	  * @author soul
	  * @copyright 2018/9/20
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function checkPacOrderPay($uplId)
	{
		$uplId = (int) $uplId;
		$res = $this->get('pl_user_pac_list join pl_user on pu_uid=upl_uid', ['pu_uid,pu_pac_vin_count, pu_pac_number_count, pu_pac_etk_count, upl_id, upl_status, upl_paymoney, upl_por_id, upl_vin_count, upl_number_count, upl_etk_count'], sprintf(" and upl_id =%d", $uplId), true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '订单不存在！');
		$ordArr = $res['data'];
		if($ordArr['upl_status'] == 0)
		{
			$MainOrder = new MainOrder();
			$res = $MainOrder->checkPay($ordArr['upl_por_id']);
			$payMsg = $res['data'];
			if($payMsg['por_status'] == 1 && $payMsg['por_money'] == $ordArr['upl_paymoney'])
			{
				$YpwBase = new YpwBase();
				$res = $YpwBase->Get('yp_user', ['u_name'], sprintf(" and u_id=%d", $ordArr['pu_uid']), true);
				$uArr = $res['data'];
				$ordArr = array_merge($ordArr, $uArr);

				$now = time();
				$this->PjlDb->Begin();
				$payArr = [
					'upl_status'=>2,	
					'upl_pay_time'=>$payMsg['por_pay_time'],
					'upl_ok_time'=>$now
				];
				$this->set('pl_user_pac_list',$payArr, sprintf(" and upl_id=%d", $uplId));
				$ordArr = array_merge($ordArr, $payArr);

				$styleArr = ['vin', 'number', 'etk'];
				foreach($styleArr as $style)
				{
					if($ordArr['upl_'.$style.'_count'] > 0)
					{
						$changeArr = [
							'upc_uid'=>$ordArr['pu_uid'],
							'upc_style'=>$style,
							'upc_change'=>$ordArr['upl_'.$style.'_count'],
							'upc_des'=>'购买资源包，订单ID：'.$ordArr['upl_id']
						];
						$this->changePac($changeArr);
					}
				}

				//跑街业绩记录
				$PjlMoney = new PjlMoney();
				$payBy = ['weixin'=>'微信', 'alipay'=>'支付宝'];
				$yjArr = [
					'yl_title'=>$ordArr['u_name'].' 购买PC资源包',
					'yl_status'=>1,
					'yl_xiangmu'=>'PC会员',
					'yl_xiangmu_des'=>'资源包',
					'yl_user'=>'跑街令',
					'yl_pay_money'=>$payMsg['por_money'],
					'yl_user_money'=>0.00,
					'yl_pay_by'=>$payBy[$payMsg['por_pay_method']],
					'yl_pay_style'=>'对公',
					'yl_pay_time'=>!empty($payMsg['por_pay_time'])? $payMsg['por_pay_time']: time(),
					'yl_check_time'=>time(),
					'yl_add_user'=>'系统',
					'yl_check_user'=>'系统',
					'yl_remark'=>$payMsg['por_title'],
					'yl_por_id'=>$payMsg['por_id']
				];
				$PjlMoney->addPjlYj($yjArr);

				//新总业绩
				$CrmsbMain = new CrmsbMain();
				$autoYjArr = [
					'mon_date'=>!empty($payMsg['por_pay_time'])? $payMsg['por_pay_time']: time(),
					'mon_customer_name'=>$ordArr['u_name'],
					'mon_u_name'=>'跑街令',
					'mon_ypt_id'=>$payMsg['por_pay_method'] == 'alipay'? 8: 9,
					'mon_remark'=>$payMsg['por_title'],
					'server'=>[
						'mos_site_id'=>2,
						'mos_ser_id'=>27,
						'mos_sertype'=>1,
						'mos_pay_money'=>$payMsg['por_money'],
						'mos_user_money'=>0.00,
						'mos_remark'=>'资源包',
						'mos_from'=>'PJLPAC',
						'mos_from_id'=>$uplId
					]
				];
				$CrmsbMain->addAutoYeji($autoYjArr);

				$this->PjlDb->End();
			}
		}else if($ordArr['upl_status'] >= 1){
			
		}else if($ordArr['upl_status'] == -1){
			return LibFc::ReturnData(false, '订单已取消，请勿付款！');
		}else{
			return LibFc::ReturnData(false, '订单异常，请稍后重试！');
		}
		return LibFc::ReturnData(true, $ordArr);
	}

	/**
	  * @method 用户资源包变动
	  * @param  $dataArr [
		'upc_uid'=>1,
		'upc_change'=>-1, 
		'upc_style'=>number vin engine makeno etk, 
		'upc_des'=>'插入数据：....'
		]
	  * @author soul
	  * @copyright 2016/3/30
	  * @return 
			成功：['status'=>true, 'data'=>$uil_id]
			失败：['status'=>false, 'data'=>'错误原因']
	  */
	public function changePac($dataArr)
	{
		$dataArr['upc_uid'] = (int) $dataArr['upc_uid'];
		$dataArr['upc_change'] = (int) $dataArr['upc_change'];
		if($dataArr['upc_uid'] > 0 && $dataArr['upc_change'] != 0 && !empty($dataArr['upc_des']) && !empty($dataArr['upc_style']))
		{
			$res = $this->get('pl_user', ['pu_uid', 'pu_pac_vin_count', 'pu_pac_number_count', 'pu_pac_etk_count'], sprintf(" AND pu_uid=%d", $dataArr['upc_uid']), true);
			if(!empty($res['data'])) 
			{
				$UserData = $res['data'];
				$style = in_array($dataArr['upc_style'], ['engine', 'makeno'])? 'vin': $dataArr['upc_style'];
				if($dataArr['upc_change'] < 0 && ($UserData['pu_pac_'.$style.'_count']+$dataArr['upc_change']) < 0){
					if($style == 'vin' && stripos($dataArr['upc_by'], 'robot') === 0){
						$msg = '机器人今日的车架号查询次数已达上限，请联系人工客服为你服务。';
						return LibFc::ReturnData(false, $msg, 'nozybvin');
					}else{
						return LibFc::ReturnData(false, '资源包'.$style.'可用次数不足，请先购买！', 'nopac'.$style);
					}
				}
				$this->PjlDb->Begin();
				$UserData['pu_pac_'.$style.'_count'] += $dataArr['upc_change'];
				$this->set('pl_user', ['pu_pac_'.$style.'_count'=>$UserData['pu_pac_'.$style.'_count']], sprintf(" AND pu_uid=%d", $dataArr['upc_uid']));
				$dataArr['upc_has'] = $UserData['pu_pac_'.$style.'_count'];
				$dataArr['upc_atime'] = time();
				$res = $this->add('pl_user_pac_change', $dataArr);
				$upc_uid = $res['data'];
				$this->PjlDb->End();
				return LibFc::ReturnData(true, $upc_uid);
			}
		}
		return LibFc::ReturnData(false, 'changePac提供的参数不正确！');
	}


	/**
	  * @method 创建查询余额充值订单
	  * @param  $dataArr	   array [必填] ['moc_uid'=>'','moc_paymoney'=>'', 'moc_from'=>'']
	  * @author soul
	  * @copyright 2018/9/20
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function buildChongZhiOrder($dataArr)
	{
		$dataArr['moc_paymoney'] = sprintf("%.2f", $dataArr['moc_paymoney']);
		if($dataArr['moc_paymoney'] < 1) return LibFc::ReturnData(false, '充值金额不能低于1.00元，创建充值订单失败！');

		$res = $this->get('pl_user', ['*'], sprintf(" and pu_uid=%d", $dataArr['moc_uid']), true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '会员'.$dataArr['moc_uid'].'不存在，创建充值订单失败！');
		$userArr = $res['data'];
		$this->PjlDb->Begin();

		//关闭之前尚未支付的订单
		$res = $this->get('pl_money_chongzhi', ['moc_id'], sprintf(" and moc_uid=%d and moc_status = 0", $dataArr['moc_uid']));
		if(!empty($res['data']))
		{
			$this->closeChongZhiOrder(array_column($res['data'], 'moc_id'));
		}
		$addArr = [
			'moc_uid'=>(int)$dataArr['moc_uid'],
			'moc_status'=>0,
			'moc_paymoney'=>$dataArr['moc_paymoney'],
			'moc_btime'=>time()
		];
		$this->PjlDb->End();
		return $this->add('pl_money_chongzhi', $addArr);
	}


	/**
	  * @method 关闭查询余额充值订单
	  * @param  mocIdArr	   array [必填] 订单ID	  
	  * @author soul
	  * @copyright 2018/9/20
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function closeChongZhiOrder($mocIdArr)
	{
		foreach($mocIdArr as $k=>$v)
		{
			$mocIdArr[$k] = (int) $v;
		}
		if(!empty($mocIdArr))
		{
			$this->PjlDb->Begin();
			$res = $this->get('pl_money_chongzhi', ['moc_id', 'moc_por_id'], sprintf(" and moc_id in (%s) and moc_status = 0 and moc_por_id > 0", implode(',', $mocIdArr)));
			$closeArr = $res['data'];
			$MainOrder = new MainOrder();
			foreach($closeArr as $v)
			{
				$res = $MainOrder->checkPay($v['moc_por_id']);
				if($res['data']['por_status'] == 1)
				{
					$this->checkChongZhiOrderPay($v['moc_id']);
				}
				else
				{
					$MainOrder->closePay($v['moc_por_id']);
				}
			}
			
			$setArr = [
				'moc_status'=>-1,
				'moc_close_time'=>time()
			];
			$this->set('pl_money_chongzhi', $setArr, sprintf(" and moc_id in (%s) and moc_status = 0", implode(',', $mocIdArr)));
			$this->PjlDb->End();
		}
		return LibFc::ReturnData(true);
	}


	/**
	  * @method 获取查询余额充值订单支付的支付信息
	  * @param  mocId	   int [必填] 订单ID	  
	  * @param  payBy  weixin|alipay
	  * @param  payType  pc:扫码 app:APP wap:手机网 gzh:公众号
	  * @author soul
	  * @copyright 2018/9/20
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function payChongZhiOrder($mocId, $payBy, $payType, $othArr = [])
	{
		$mocId = (int) $mocId;
		if(!in_array($payBy, ['weixin', 'alipay']) || empty($payBy) || $mocId < 1)
			return LibFc::ReturnData(false, '提供的付款参数不正确！');

		$res = $this->get('pl_money_chongzhi', ['*'], sprintf(" and moc_id =%d", $mocId), true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '订单不存在！');
		$ordArr = $res['data'];
		if($ordArr['moc_status'] == 0){
		}else if($ordArr['moc_status'] >= 1){
			return LibFc::ReturnData(false, '订单已支付，请勿重复付款！');
		}else if($ordArr['moc_status'] == -1){
			return LibFc::ReturnData(false, '订单已取消，请勿付款！');
		}else{
			return LibFc::ReturnData(false, '订单异常，请稍后重试！');
		}
		
		$MainOrder = new MainOrder();
		$newOrderFlag = true;
		if(!empty($ordArr['moc_por_id']))
		{
			$res = $MainOrder->get('pa_order', ['por_status'], sprintf(" and por_id=%d and por_pay_method='%s' and por_pay_type='%s'", $ordArr['moc_por_id'], $payBy, LibFc::Escape($payType)), true);
			if(!empty($res['data']))
			{
				$newOrderFlag = false;
				$payMsg = $MainOrder->getPayPage($ordArr['moc_por_id']);
				$payMsg = $payMsg['data'];
			}
			else
			{
				$MainOrder->closePay($ordArr['moc_por_id']);
			}
		}

		if($newOrderFlag)
		{
			$dataArr = [
				'por_guid'=>LibFc::guid(),
				'por_u_id'=>$ordArr['moc_uid'],
				'por_style'=>'PJLCZ',
				'por_orderids'=>$ordArr['moc_id'],
				'por_pay_method'=>$payBy,
				'por_pay_type'=>$payType,
				'por_money'=>$ordArr['moc_paymoney'],
				'por_title'=>'跑街令-查询余额充值订单：'.$ordArr['moc_id'],
				'por_back_url'=>$othArr['backurl'],
				'por_wx_openid'=>$othArr['wxopenid'],
				'por_from'=>$othArr['from']
			];
			$payMsg = $MainOrder->buildPay($dataArr);
			$payMsg = $payMsg['data'];
			$this->set('pl_money_chongzhi', ['moc_por_id'=>$payMsg['por_id'], 'moc_por_guid'=>$dataArr['por_guid']], sprintf(" and moc_id=%d", $mocId));
		}
		return LibFc::ReturnData(true, $payMsg);
	}
	

	/**
	  * @method 检查查询余额充值订单支付
	  * @param  mocId	   int [必填] 订单ID	  
	  * @author soul
	  * @copyright 2018/9/20
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function checkChongZhiOrderPay($mocId)
	{
		$mocId = (int) $mocId;
		$res = $this->get('pl_money_chongzhi join pl_user on pu_uid=moc_uid', ['pu_uid, pu_money_search, moc_id, moc_status, moc_paymoney, moc_por_id'], sprintf(" and moc_id =%d", $mocId), true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '订单不存在！');
		$ordArr = $res['data'];
		if($ordArr['moc_status'] == 0)
		{
			$MainOrder = new MainOrder();
			$res = $MainOrder->checkPay($ordArr['moc_por_id']);
			$payMsg = $res['data'];
			if($payMsg['por_status'] == 1 && $payMsg['por_money'] == $ordArr['moc_paymoney'])
			{
				$YpwBase = new YpwBase();
				$res = $YpwBase->Get('yp_user', ['u_name'], sprintf(" and u_id=%d", $ordArr['pu_uid']), true);
				$uArr = $res['data'];
				$ordArr = array_merge($ordArr, $uArr);

				$now = time();
				$this->PjlDb->Begin();
				$payArr = [
					'moc_status'=>2,	
					'moc_pay_time'=>$payMsg['por_pay_time'],
					'moc_ok_time'=>$now
				];
				$this->set('pl_money_chongzhi',$payArr, sprintf(" and moc_id=%d", $mocId));
				$ordArr = array_merge($ordArr, $payArr);

				$moneyArr=[
					'mon_pu_uid'=>$ordArr['pu_uid'],
					'mon_money'=>$ordArr['moc_paymoney'],
					'mon_style'=>4,
					'mon_des'=>'跑街令-查询余额充值订单：'.$mocId,
					'mon_opl_id'=>0
				];
				$this->changeUserSearchMoney($moneyArr);
				$ordArr['pu_money_search'] = sprintf('%.2f', $ordArr['pu_money_search']+$ordArr['moc_paymoney']);

				//跑街业绩记录
				$PjlMoney = new PjlMoney();
				$payBy = ['weixin'=>'微信', 'alipay'=>'支付宝'];
				$yjArr = [
					'yl_title'=>$ordArr['u_name'].' 打电话充值',
					'yl_status'=>1,
					'yl_xiangmu'=>'打电话',
					'yl_user'=>'跑街令',
					'yl_pay_money'=>$payMsg['por_money'],
					'yl_user_money'=>0.00,
					'yl_pay_by'=>$payBy[$payMsg['por_pay_method']],
					'yl_pay_style'=>'对公',
					'yl_pay_time'=>!empty($payMsg['por_pay_time'])? $payMsg['por_pay_time']: time(),
					'yl_check_time'=>time(),
					'yl_add_user'=>'系统',
					'yl_check_user'=>'系统',
					'yl_remark'=>$payMsg['por_title'],
					'yl_por_id'=>$payMsg['por_id']
				];
				$PjlMoney->addPjlYj($yjArr);

				//新总业绩
				$CrmsbMain = new CrmsbMain();
				$autoYjArr = [
					'mon_date'=>!empty($payMsg['por_pay_time'])? $payMsg['por_pay_time']: time(),
					'mon_customer_name'=>$ordArr['u_name'],
					'mon_u_name'=>'跑街令',
					'mon_ypt_id'=>$payMsg['por_pay_method'] == 'alipay'? 8: 9,
					'mon_remark'=>$payMsg['por_title'],
					'server'=>[
						'mos_site_id'=>2,
						'mos_ser_id'=>34,
						'mos_sertype'=>1,
						'mos_pay_money'=>$payMsg['por_money'],
						'mos_user_money'=>0.00,
						'mos_from'=>'PJLCZ',
						'mos_from_id'=>$mocId
					]
				];
				$CrmsbMain->addAutoYeji($autoYjArr);

				$this->PjlDb->End();
			}
		}else if($ordArr['moc_status'] >= 1){
			
		}else if($ordArr['moc_status'] == -1){
			return LibFc::ReturnData(false, '订单已取消，请勿付款！');
		}else{
			return LibFc::ReturnData(false, '订单异常，请稍后重试！');
		}
		return LibFc::ReturnData(true, $ordArr);
	}


	/**
	 * @method 获取商家入驻、PC版会员的对应的价格
	 * @param style      string [必填] shop:商家入驻 pcyear:pc年卡 pchyear:pc半年卡 pcmonth:pc月卡
	 * @param uid        string [选填] 购买人用户ID
	 * @param invcode    string [选填] 邀请码
	 * @param pct_pid    int [选填] 省ID  
	 * @param pct_cid    int [选填] 市
	 * @author soul 2019/12/14
	 * @return
	 	org_money:原价  paymoney:需要支付的金额   free_money:优惠多少钱
		接口返回的invcode 和 提交给接口的invcode 不一样表示邀请码无效
	 	{"status":true,"data":{"style":"shop","vip_id":"4","vip_name":"业务内容","org_money":"1800.00","paymoney":"600.00","free_money":"1200.00","btime":"2020-06-17 10:23:32","etime":"2021-06-17 10:23:32",invcode: "019690", "dco_id":"1","comany":"邀请码所属企业","sales":"邀请码所属业务员","pct_pid":"19","pct_cid":"1901"},"code":0}
		
	 */
	public function getVipStylePrice($style, $uid, $invcode, $pct_pid, $pct_cid)
	{
		$uid = (int) $uid;
		$res = $this->get('pl_user left join pl_shop on shop_pu_id=pu_uid', ['pu_uid, pu_pct_ids, shop_pct_ids'], sprintf(" and pu_uid=%d limit 1", $uid), true);
		if(empty($res['data']))  return LibFc::ReturnData(false, '账号不存在，获取信息失败');
		$userArr = $res['data'];

		$res = $this->get('pl_user_vip', ['max(uvip_etime) as uvip_etime'], sprintf(" and uvip_uid=%d  and uvip_vip_id > 1 limit 1", $uid), true);
		$userArr['uvip_etime'] = (int) $res['data']['uvip_etime'];

		//无邀请码 直接给标准价
		$realStyle = $style == 'shop'? 'pcyear': $style;
		$res = $this->get('pl_vip_level', ['*'], sprintf(" and vip_code='%s'", LibFc::Escape($realStyle)), true);
		if(empty($res['data']))  return LibFc::ReturnData(false, '尚未开通'.$style.'的业务类型！');
		$levelArr = $res['data'];
		$now = time();
		$arr = [
			'style'=>$style,
			'vip_id'=>$levelArr['vip_id'],	
			'vip_name'=>$levelArr['vip_name'],	
			'org_money'=>$levelArr['vip_price'],
			'paymoney'=>$levelArr['vip_now_price'],	
			'free_money'=>'0.00',
			'btime'=>'',
			'etime'=>'',
			'invcode'=>'',
			'dco_id'=>0,
			'comany'=>'',
			'sales'=>'',
			'pct_pid'=>0,
			'pct_cid'=>0,
		];

		$userArr['last_vip_etime'] = $userArr['uvip_etime'] > $now ? $userArr['uvip_etime']: $now;
		$arr['etime'] = strtotime($levelArr['vin_time'], $userArr['last_vip_etime']);
		$arr['btime'] = date('Y-m-d H:i:s', $userArr['last_vip_etime']);
		$arr['etime'] = date('Y-m-d H:i:s', $arr['etime']);
		
		$pct_pid = (int) $pct_pid;
		$pct_cid = (int) $pct_cid;
		if($pct_cid < 1)
		{
			//配件商的省市为空
			if(empty($userArr['shop_pct_ids']))
			{
				//配件商入驻
				if($style == 'shop' && empty($pct_cid)) return LibFc::ReturnData(false, '请提供配件商的省市参数！');
				
				//账号本身的省市
				if(!empty($userArr['pu_pct_ids']))
				{
					$t = explode(',', $userArr['pu_pct_ids']);
					$pct_pid = $t[0];
					$pct_cid = $t[1];
				}
			}
			else
			{
				//配件商的省市不为空
				$t = explode(',', $userArr['shop_pct_ids']);
				$pct_pid = (int) $t[0];
				$pct_cid = (int) $t[1];
			}
		}

		//验证省市是否存在
		if(!empty($pct_cid) && $style == 'shop')
		{
			$res = $this->get('yp_province_city', ['pc_id'], sprintf(" and pc_id =%d and pc_pid=%d", $pct_cid, $pct_pid), true);
			if(empty($res['data'])) return LibFc::ReturnData(false, '提供的省市参数有误！');
		}


		//有邀请码的，验证邀请码是否有效
		if(!empty($invcode))
		{
			$table = 'dl_worker_invcode as a
			join dl_worker on dwi_dwo_uid=dwo_uid and dwi_dco_id = dwo_dco_id and dwo_status =1
			join dl_company on dwo_dco_id=dco_id and dco_status = 1';
			$res = $this->get($table, ['a.*, dco_id, dco_short_name, dwo_name, dco_isyp'], sprintf(" and dwi_status = 1 and dwi_invcode ='%s'", LibFc::Escape($invcode)), true);
			if(!empty($res['data']))
			{
				$incArr = $res['data'];

				if(empty($incArr['dwi_'.$style.'_price'])) return LibFc::ReturnData(false, '尚未开通'.$style.'的邀请类型！');
				
				//非平台邀请码，验证此区域是否存在代理商
				if($incArr['dco_isyp'] != 1)
				{
					$twhere = sprintf(" and dco_dltype = 1 and dct_begin <= %d AND dct_end >= %d AND ( (dctp_pc_type = 1 AND dctp_pc_id = %d ) OR (dctp_pc_type = 2 AND dctp_pc_id = %d) )", time(), time(), $pct_pid, $pct_cid);
					$table = 'dl_company_target_pcts JOIN dl_company_target ON dctp_dct_id = dct_id join dl_company on dco_id=dct_dco_id';
					$res = $this->get($table, ['distinct dct_dco_id'], $twhere);
					if(!empty($res['data']) && !in_array($incArr['dco_id'], array_column($res['data'], 'dct_dco_id')))
					{
						return LibFc::ReturnData(false, '此区域已有独家代理商，您提供的邀请码不能使用，请重新填写！');
					}
				}

				$arr['invcode'] = $invcode;
				$arr['dco_id'] = $incArr['dco_id'];
				$arr['comany'] = $incArr['dco_short_name'];
				$arr['sales'] = $incArr['dwo_name'];
				$arr['paymoney'] = $incArr['dwi_'.$style.'_price'];
			}
			else
			{
				//是否为个人分享
				$YpwBase = new YpwBase();
				$res = $YpwBase->get('yp_user', ['u_id', 'u_name'], sprintf(" and (u_name='%s' or (u_mobile='%s' and u_mobile_check='Y'))", LibFc::Escape($invcode), LibFc::Escape($invcode)), true);
				if(!empty($res['data']))
				{
					$user = $res['data'];
					$arr['sales'] = $user['u_name'];
					$arr['comany'] = $invcode;
					$arr['invcode_uid'] = $user['u_id'];
					
					$twhere = sprintf(" and dco_dltype = 1 and dct_begin <= %d AND dct_end >= %d AND ( (dctp_pc_type = 1 AND dctp_pc_id = %d ) OR (dctp_pc_type = 2 AND dctp_pc_id = %d) )", time(), time(), $pct_pid, $pct_cid);
					$table = 'dl_company_target_pcts JOIN dl_company_target ON dctp_dct_id = dct_id join dl_company on dco_id=dct_dco_id';
					$res = $this->get($table, ['distinct dct_dco_id'], $twhere);
					if(!empty($res['data']))
					{
						return LibFc::ReturnData(false, '此区域已有独家代理商，您提供的邀请码不能使用，请重新填写！');
					}
				}
			}
		}
		$arr['pct_pid'] = $pct_pid;
		$arr['pct_cid'] = $pct_cid;

		$btime = $this->HDCFG['btime'];
		$etime = $this->HDCFG['etime'];
		$hdStyle = $this->HDCFG['style'];
		if($style == $hdStyle && time() >= $btime &&  time() <= $etime)
		{
			//续费商家：仅限2024年12月31日前到期的商家
			$res =  $this->get('pl_user_vip', ['max(uvip_etime) uvip_etime'], sprintf(" and uvip_uid=%d", $uid), true);
			if(empty($res['data']) || $res['data']['uvip_etime'] < $this->HDCFG['xufeietime']){
				$priceArr = $this->HDCFG['price'];
				//这个用户是否已经参与过本次活动
				$where = sprintf(" and uvl_uid=%d and uvl_style='%s' and uvl_status > 0 and uvl_btime >=%d and uvl_btime <= %d and uvl_paymoney in (%s)",
					$uid, $hdStyle, $btime, $etime, implode(',', array_column($priceArr, 'price')));
				$res =  $this->get('pl_user_vip_list', ['uvl_id'], $where, true);
				if(empty($res['data']))
				{
					foreach($priceArr as $pv)
					{
						//当前价格有多少用户已经成功入驻
						$where = sprintf(" and uvl_style='%s' and uvl_status > 0 and uvl_btime >=%d and uvl_btime <= %d and uvl_paymoney <= %.2f", $hdStyle, $btime, $etime, $pv['price']);
						$res = $this->get('pl_user_vip_list', ['count(*) as count'], $where, true);
						if($res['data']['count'] < $pv['end'])
						{
							$arr['paymoney'] = sprintf("%.2f", $pv['price']);
							//暂停个人邀请
							if(empty($arr['dco_id']) && !empty($arr['invcode_uid']))
							{
								$arr['invcode_uid'] = 0;
								$arr['comany'] = '';
								$arr['sales'] = '';
							}
							break;
						}
					}
				}
			}
		}
		$arr['free_money'] =  sprintf("%.2f", $arr['org_money']-$arr['paymoney']);
		return LibFc::ReturnData(true, $arr);
	}


	
	/**
	 * @method 创建商家入驻或者PC会员订单
	 * @param style      string [必填] shop:商家入驻 pcyear:pc年卡 pchyear:pc半年卡 pcmonth:pc月卡
	 * @param uid        string [选填] 购买人用户ID
	 * @param invcode    string [选填] 邀请码
	 * @param pct_pid    int [选填] 省ID  
	 * @param pct_cid    int [选填] 市
	 * @author soul 2019/12/14
	 * @return
	 	org_money:原价  paymoney:需要支付的金额   free_money:优惠多少钱
		接口返回的invcode 和 提交给接口的invcode 不一样表示邀请码无效
	 	{"status":true,"data":{"style":"shop","vip_id":"4","vip_name":"业务内容","org_money":"1800.00","paymoney":"600.00","free_money":"1200.00","btime":"2020-06-17 10:23:32","etime":"2021-06-17 10:23:32",invcode: "019690", "dco_id":"1","comany":"邀请码所属企业","sales":"邀请码所属业务员","pct_pid":"19","pct_cid":"1901"},"code":0}
		
	 */
	public function buildVipStyleOrder($style, $uid, $invcode='', $pct_pid=0, $pct_cid=0)
	{
		if($style == 'shop' && empty($invcode))
		{
			$res = $this->get('pl_shop', ['shop_dwi_invcode'], sprintf(" and shop_id=%d limit 1", $uid), true);
			if(!empty($res['data'])) $invcode = $res['data']['shop_dwi_invcode'];
		}
		$res = $this->getVipStylePrice($style, $uid, $invcode, $pct_pid, $pct_cid);
		$priceArr = $res['data'];
		
		$res = $this->get('pl_user', ['*'], sprintf(" and pu_uid=%d", $uid), true);
		$userArr = $res['data'];
		$this->PjlDb->Begin();

		//关闭之前尚未支付的订单
		/*$res = $this->get('pl_user_vip_list', ['uvl_id'], sprintf(" and uvl_uid=%d and uvl_status = 0", $uid));
		if(!empty($res['data']))
		{
			$this->closeVipOrder(array_column($res['data'], 'uvl_id'));
		}*/

		$addArr = [
			'uvl_uid'=>$userArr['pu_uid'],
			'uvl_status'=>0,
			'uvl_style'=>$priceArr['style'],
			'uvl_now_vip_id'=>$priceArr['vip_id'],
			'uvl_now_btime'=>strtotime($priceArr['btime']),
			'uvl_now_etime'=>strtotime($priceArr['etime']),
			'uvl_org_money'=>$priceArr['paymoney'],
			'uvl_paymoney'=>$priceArr['paymoney'],
			'uvl_free_money'=>$priceArr['free_money'],
			'uvl_btime'=>time(),
			'uvl_dco_id'=>$priceArr['dco_id'],
			'uvl_dwi_invcode'=>$priceArr['invcode'],
			'uvl_pc_pid'=>$priceArr['pct_pid'],
			'uvl_pc_cid'=>$priceArr['pct_cid']
		];
		$res = $this->add('pl_user_vip_list', $addArr);
		$uvl_id = $res['data'];
		
		//个人分享
		if(empty($priceArr['dco_id']) && !empty($priceArr['invcode_uid']))
		{
			$YpwBase = new YpwBase();
			$res = $YpwBase->Get('yp_user', ['u_name'], sprintf(" and u_id=%d", $addArr['uvl_uid']), true);
			$uArr = $res['data'];
			if($priceArr['style'] == 'shop')
			{
				$res = $this->get('pl_shop', ['shop_name'], sprintf(" and shop_pu_id=%d", $addArr['uvl_uid']), true);
				$title = $uArr['u_name'].'【'.$res['data']['shop_name'].'】商家入驻';
			}
			else
			{
				$title = $uArr['u_name'].' 买PC'.$priceArr['vip_name'];
			}

			$res = $this->get('dl_worker_invcode', ['*'], " and dwi_invcode ='0166'", true);
			if(empty($res['data'])) return LibFc::ReturnData(false, '金额设置异常，请联系平台客服！');
			
			$tcArr = $res['data'];
			$sArr = [
				'sor_pu_id'=>$priceArr['invcode_uid'],	
				'sor_uvl_id'=>$uvl_id,	
				'sor_title'=>$title,	
				'sor_share_code'=>$priceArr['invcode'],	
				'sor_selftc_money'=>$tcArr['dwi_'.$priceArr['style'].'_ywytc'],	
				'sor_atime'=>time()
			];
			$this->add('pl_share_order', $sArr);
		}
		$this->PjlDb->End();
		return LibFc::ReturnData(true, $uvl_id);
	}


	/**
	  * @method 将邀请赚钱的订单中支付时间超过30天进行结算
	  * @author soul
	  * @copyright 2020/9/10
	  * @return 
	  */
	public function checkShareOrder()
	{
		//尚未结算的订单
		$endPayTime = strtotime('-30 days');
		$table = 'pl_share_order JOIN pl_user_vip_list ON uvl_id=sor_uvl_id';
		$res = $this->get($table, ['*'], sprintf(" and sor_selftc_status = 0 and uvl_status IN (1,2) AND uvl_pay_time <= %d order by uvl_id", $endPayTime));
		if(!empty($res['data']))
		{
			$this->PjlDb->Begin();
			$orderArr = $res['data'];
			foreach($orderArr as $v)
			{
				$now = time();
				$okArr = [
					'sor_selftc_status'=>1,	
					'sor_selftc_jstime'=>$now
				];
				$this->set('pl_share_order',$okArr, sprintf(" and sor_id=%d", $v['sor_id']));

				$moneyArr=[
					'mon_pu_uid'=>$v['sor_pu_id'],
					'mon_money'=>$v['sor_selftc_money'],
					'mon_des'=>'结算-邀请订单ID：'.$v['sor_uvl_id'],
					'mon_sor_id'=>$v['sor_id'],
				];
				$this->changeUserShareMoney($moneyArr);
			}
			$this->PjlDb->End();
		}
		return LibFc::ReturnData(true);
	}



	/**
	  * @method 创建推送服务资源包订单
	  * @param  uid	   int [必填] 会员ID	  
	  * @param  style  int [必填] 类型	  
	  * @author soul
	  * @copyright 2021/3/27
	  * @return 
	  {"status":false,"data": 订单ID,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function buildTsfwPacOrder($uid, $style)
	{
		$table = 'pl_shop 
		left join pl_tuisong ON shop_id = stu_shop_id';
		$res = $this->get($table, ['shop_id, stu_shop_id,shop_pu_id, shop_status, stu_status, shop_vip_etime'], sprintf(" and shop_pu_id = %d group by shop_id", $uid), true);
		$shopArr = $res['data'];
		if(empty($shopArr)) return LibFc::ReturnData(false, '您尚未入驻跑街令商家！', 'notOpenShop');
		if($shopArr['shop_vip_etime'] < time()) return LibFc::ReturnData(false, '您的跑街令商家权益已到期，请先续费！');
		if($shopArr['shop_status'] != 2) return LibFc::ReturnData(false, '您的跑街令商家已停用！');
		if($shopArr['stu_status'] == -1) return LibFc::ReturnData(false, '您的跑街令商家推送服务已停用！');
		if(empty(mvc::$cfg['PJL_TS_PRICE'][$style])) return LibFc::ReturnData(false, '您购买的套餐规格不存在，请稍后重试！');

		$priceArr = mvc::$cfg['PJL_TS_PRICE'][$style];
		$this->PjlDb->Begin();

		if(empty($shopArr['stu_shop_id']))
			$this->add('pl_tuisong', ['stu_shop_id'=>$shopArr['shop_id']]);

		//关闭之前尚未支付的订单
		$res = $this->get('pl_tuisong_order', ['tuo_id'], sprintf(" and tuo_uid=%d and tuo_status = 0", $uid));
		if(!empty($res['data']))
		{
			$this->closeTsfwPacOrder(array_column($res['data'], 'tuo_id'));
		}
		$title = $priceArr['money'].'元 共'.$priceArr['total'].'次';
		if($priceArr['song'] > 0) $title .= '(含送'.$priceArr['song'].'次)';
		$addArr = [
			'tuo_uid'=>$shopArr['shop_pu_id'],
			'tuo_shop_id'=>$shopArr['shop_id'],
			'tuo_status'=>0,
			'tuo_vin_count'=>$priceArr['total'],
			'tuo_vin_song'=>$priceArr['song'],
			'tuo_title'=>$title,
			'tuo_paymoney'=>sprintf("%.2f", $priceArr['money']),
			'tuo_btime'=>time()
		];
		$this->PjlDb->End();
		return $this->add('pl_tuisong_order', $addArr);
	}

	/**
	  * @method 关闭推送服务资源包订单
	  * @param  tuoIdArr	   array [必填] 订单ID	  
	  * @author soul
	  * @copyright 2018/9/20
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function closeTsfwPacOrder($tuoIdArr)
	{
		foreach($tuoIdArr as $k=>$v)
		{
			$tuoIdArr[$k] = (int) $v;
		}
		if(!empty($tuoIdArr))
		{
			$this->PjlDb->Begin();
			$res = $this->get('pl_tuisong_order', ['tuo_id', 'tuo_por_id'], sprintf(" and tuo_id in (%s) and tuo_status = 0 and tuo_por_id > 0", implode(',', $tuoIdArr)));
			$closeArr = $res['data'];
			$MainOrder = new MainOrder();
			foreach($closeArr as $v)
			{
				$res = $MainOrder->checkPay($v['tuo_por_id']);
				if($res['data']['por_status'] == 1)
				{
					$this->checkTsfwPacOrderPay($v['tuo_id']);
				}
				else
				{
					$MainOrder->closePay($v['tuo_por_id']);
				}
			}
			$setArr = [
				'tuo_status'=>-1,
				'tuo_close_time'=>time()
			];
			$this->set('pl_tuisong_order', $setArr, sprintf(" and tuo_id in (%s) and tuo_status = 0", implode(',', $tuoIdArr)));
			$this->PjlDb->End();
		}
		return LibFc::ReturnData(true);
	}

	/**
	  * @method 获取推送服务资源包订单支付的支付信息
	  * @param  tuoId	   int [必填] 订单ID	  
	  * @param  payBy  weixin|alipay
	  * @param  payType  pc:扫码 app:APP wap:手机网 gzh:公众号
	  * @author soul
	  * @copyright 2018/9/20
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function payTsfwPacOrder($tuoId, $payBy, $payType, $othArr = [])
	{
		$tuoId = (int) $tuoId;
		if(!in_array($payBy, ['weixin', 'alipay']) || empty($payBy) || $tuoId < 1)
			return LibFc::ReturnData(false, '提供的付款参数不正确！');

		$res = $this->get('pl_tuisong_order', ['*'], sprintf(" and tuo_id =%d", $tuoId), true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '订单不存在！');
		$ordArr = $res['data'];
		if($ordArr['tuo_status'] == 0){
		}else if($ordArr['tuo_status'] >= 1){
			return LibFc::ReturnData(false, '订单已支付，请勿重复付款！');
		}else if($ordArr['tuo_status'] == -1){
			return LibFc::ReturnData(false, '订单已取消，请勿付款！');
		}else{
			return LibFc::ReturnData(false, '订单异常，请稍后重试！');
		}
		
		$MainOrder = new MainOrder();
		$newOrderFlag = true;
		if(!empty($ordArr['tuo_por_id']))
		{
			$res = $MainOrder->get('pa_order', ['por_status'], sprintf(" and por_id=%d and por_pay_method='%s' and por_pay_type='%s'", $ordArr['tuo_por_id'], $payBy, LibFc::Escape($payType)), true);
			if(!empty($res['data']))
			{
				$newOrderFlag = false;
				$payMsg = $MainOrder->getPayPage($ordArr['tuo_por_id']);
				$payMsg = $payMsg['data'];
			}
			else
			{
				$MainOrder->closePay($ordArr['tuo_por_id']);
			}
		}

		if($newOrderFlag)
		{
			$dataArr = [
				'por_guid'=>LibFc::guid(),
				'por_u_id'=>$ordArr['tuo_uid'],
				'por_style'=>'PJLTSPAC',
				'por_orderids'=>$ordArr['tuo_id'],
				'por_pay_method'=>$payBy,
				'por_pay_type'=>$payType,
				'por_money'=>$ordArr['tuo_paymoney'],
				'por_title'=>'跑街令-推送服务订单：'.$ordArr['tuo_id'],
				'por_back_url'=>$othArr['backurl'],
				'por_wx_openid'=>$othArr['wxopenid'],
				'por_from'=>$othArr['from']
			];
			$payMsg = $MainOrder->buildPay($dataArr);
			$payMsg = $payMsg['data'];
			$this->set('pl_tuisong_order', ['tuo_por_id'=>$payMsg['por_id'], 'tuo_por_guid'=>$dataArr['por_guid']], sprintf(" and tuo_id=%d", $tuoId));
		}
		return LibFc::ReturnData(true, $payMsg);
	}


	/**
	  * @method 检查推送服务资源包订单支付
	  * @param  tuoId	   int [必填] 订单ID	  
	  * @author soul
	  * @copyright 2018/9/20
	  * @return 
	  {"status":false,"data":,"code":''}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function checkTsfwPacOrderPay($tuoId)
	{
		$tuoId = (int) $tuoId;
		$res = $this->get('pl_tuisong_order', ['*'], sprintf(" and tuo_id =%d", $tuoId), true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '订单不存在！');
		$ordArr = $res['data'];
		if($ordArr['tuo_status'] == 0)
		{
			$MainOrder = new MainOrder();
			$res = $MainOrder->checkPay($ordArr['tuo_por_id']);
			$payMsg = $res['data'];
			if($payMsg['por_status'] == 1 && $payMsg['por_money'] == $ordArr['tuo_paymoney'])
			{
				$YpwBase = new YpwBase();
				$res = $this->Get('pl_shop', ['shop_id, shop_pu_id, shop_name'], sprintf(" and shop_pu_id=%d", $ordArr['tuo_uid']), true);
				$uArr = $res['data'];
				$ordArr = array_merge($ordArr, $uArr);

				$now = time();
				$this->PjlDb->Begin();
				$payArr = [
					'tuo_status'=>2,	
					'tuo_pay_time'=>$payMsg['por_pay_time'],
					'tuo_ok_time'=>$now
				];
				$this->set('pl_tuisong_order',$payArr, sprintf(" and tuo_id=%d", $tuoId));
				$ordArr = array_merge($ordArr, $payArr);
				
				$title = $ordArr['tuo_paymoney'].'元 共'.$ordArr['tuo_vin_count'].'次';
				if($ordArr['tuo_vin_song'] > 0) $title .= '(含送'.$ordArr['tuo_vin_song'].'次)';

				$changeArr = [
					'tuc_shop_id'=>$ordArr['shop_id'],
					'tuc_uid'=>$ordArr['shop_pu_id'],
					'tuc_style'=>'vin',
					'tuc_change'=>$ordArr['tuo_vin_count'],
					'tuc_des'=>'推送服务订单ID：'.$ordArr['tuo_id'].' --'.$title,
					'tuc_by'=>'系统'
				];
				$this->changeTsfwPac($changeArr);

				//跑街业绩记录
				$PjlMoney = new PjlMoney();
				$payBy = ['weixin'=>'微信', 'alipay'=>'支付宝'];
				$yjArr = [
					'yl_title'=>$ordArr['shop_name'].' 购买推送服务',
					'yl_status'=>1,
					'yl_xiangmu'=>'推送服务',
					'yl_xiangmu_des'=>'',
					'yl_user'=>'跑街令',
					'yl_pay_money'=>$payMsg['por_money'],
					'yl_user_money'=>0.00,
					'yl_pay_by'=>$payBy[$payMsg['por_pay_method']],
					'yl_pay_style'=>'对公',
					'yl_pay_time'=>!empty($payMsg['por_pay_time'])? $payMsg['por_pay_time']: time(),
					'yl_check_time'=>time(),
					'yl_add_user'=>'系统',
					'yl_check_user'=>'系统',
					'yl_remark'=>$payMsg['por_title'],
					'yl_por_id'=>$payMsg['por_id']
				];
				$PjlMoney->addPjlYj($yjArr);

				//新总业绩
				$CrmsbMain = new CrmsbMain();
				$autoYjArr = [
					'mon_date'=>!empty($payMsg['por_pay_time'])? $payMsg['por_pay_time']: time(),
					'mon_customer_name'=>$ordArr['shop_name'],
					'mon_u_name'=>'跑街令',
					'mon_ypt_id'=>$payMsg['por_pay_method'] == 'alipay'? 8: 9,
					'mon_remark'=>$payMsg['por_title'],
					'server'=>[
						'mos_site_id'=>2,
						'mos_ser_id'=>31,
						'mos_sertype'=>1,
						'mos_pay_money'=>$payMsg['por_money'],
						'mos_user_money'=>0.00,
						'mos_from'=>'PJLTSPAC',
						'mos_from_id'=>$tuoId
					]
				];
				$CrmsbMain->addAutoYeji($autoYjArr);

				$this->PjlDb->End();
			}
		}else if($ordArr['tuo_status'] >= 1){
			
		}else if($ordArr['tuo_status'] == -1){
			return LibFc::ReturnData(false, '订单已取消，请勿付款！');
		}else{
			return LibFc::ReturnData(false, '订单异常，请稍后重试！');
		}
		return LibFc::ReturnData(true, $ordArr);
	}


	/**
	  * @method 推送服务资源包变动明细
	  * @param  $dataArr [
			'tuc_shop_id'=>$ordArr['shop_id'],
			'tuc_uid'=>'店主ID',
			'tuc_style'=>'vin',
			'tuc_change'=>$ordArr['tuo_vin_count'],
			'tuc_des'=>'购买推送服务资源包，订单ID：'.$ordArr['tuo_id'],
			'tuc_by'=>'系统'
		]
	  * @author soul
	  * @copyright 2016/3/30
	  * @return 
			成功：['status'=>true, 'data'=>$tuc_id]
			失败：['status'=>false, 'data'=>'错误原因']
	  */
	public function changeTsfwPac($dataArr)
	{
		$dataArr['tuc_shop_id'] = (int) $dataArr['tuc_shop_id'];
		$dataArr['tuc_change'] = (int) $dataArr['tuc_change'];
		if($dataArr['tuc_shop_id'] > 0 && $dataArr['tuc_uid'] > 0 && $dataArr['tuc_change'] != 0 && !empty($dataArr['tuc_des']) && !empty($dataArr['tuc_style']))
		{
			$res = $this->get('pl_shop join pl_tuisong on shop_id=stu_shop_id', ['shop_id', 'shop_pu_id', 'shop_tsfw_vin_count'], sprintf(" AND shop_id=%d", $dataArr['tuc_shop_id']), true);
			if(!empty($res['data'])) 
			{
				$shopArr = $res['data'];
				if($dataArr['tuc_change'] < 0 && ($shopArr['shop_tsfw_vin_count']+$dataArr['tuc_change']) < 0)
					return LibFc::ReturnData(false, '推送服务可用次数不足，请先购买！', 'notsfwpac');
				
				$this->PjlDb->Begin();
				$shopArr['shop_tsfw_vin_count'] += $dataArr['tuc_change'];
				$this->set('pl_shop', ['shop_tsfw_vin_count'=>$shopArr['shop_tsfw_vin_count']], sprintf(" AND shop_id=%d", $dataArr['tuc_shop_id']));
				$dataArr['tuc_has'] = $shopArr['shop_tsfw_vin_count'];
				$dataArr['tuc_atime'] = time();
				$res = $this->add('pl_tuisong_change', $dataArr);
				$tuc_id = $res['data'];
				$this->PjlDb->End();
				return LibFc::ReturnData(true, $tuc_id);
			}
			return LibFc::ReturnData(false, '此账号尚未开通推送服务，请先开通！');
		}
		return LibFc::ReturnData(false, 'changeTsfwPac提供的参数不正确！');
	}

	/**
	  * @method 跑街令VIP退款
	  * @param  $dataArr [
			u_id  string [必填] 用户ID
			uvl_id  string [必填] VIP订单ID
			refund_password  string [必填] 退款密码
			refund_money  float [必填] 退款金额
			selftc_money  float [选填] 代理提成金额
			ywytc_money  float [选填] 业务提成金额
			remark  string [必填] 退款原因
			by_uid  string [必填] 操作人
		]
	  * @author soul
	  * @copyright 2025/11/11
	  * @return 
	  */
	public function refundPjViplOrder($dataArr)
	{
		$uvl_id = (int) $dataArr['uvl_id'];
		$dataArr['refund_money'] = sprintf("%.2f", $dataArr['refund_money']);
		if(empty($dataArr['refund_money'])) return LibFc::ReturnData(false, '退款金额必填');
		if(empty($dataArr['remark'])) return LibFc::ReturnData(false, '退款原因必填');
		if(empty($dataArr['by_uid'])) return LibFc::ReturnData(false, '操作人ID必填');

		$YpwBase = new YpwBase();
		$res = $YpwBase->getKeyVal('refund_password');
		if($res['data'] != md5('Y'.md5($dataArr['refund_password']).'P')) return LibFc::ReturnData(false, '退款密码错误');
		//获取订单
		$res = $this->get('pl_user_vip_list', ['*'], sprintf(" and uvl_uid=%d and uvl_id=%d and uvl_status in (1,2)", $dataArr['u_id'], $uvl_id), true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '订单不存在或者已经关闭');
		$ordArr = $res['data'];
		
		//是否存在未处理退款
		$res = $this->get('pl_user_vip_refund', ['uvr_id', 'uvr_atime'], sprintf(" and uvr_uvl_id=%d and uvr_status = 0", $uvl_id), true);
		if(!empty($res['data'])) return LibFc::ReturnData(false, date('Y-m-d H:i:s', $res['data']['uvr_atime']).'有退款未完成，禁止申请');
		
		//已退款金额
		$res = $this->get('pl_user_vip_refund', ['sum(uvr_money) uvr_money'], sprintf(" and uvr_uvl_id=%d and uvr_status = 1", $uvl_id), true);
		$hasRefund = $res['data']['uvr_money']??0.00;
		$maxRefund = $ordArr['uvl_paymoney'] - $hasRefund;
		if($dataArr['refund_money'] > $maxRefund) return LibFc::ReturnData(false, '订单最多可退款'.$maxRefund.'元');
		
		$this->PjlDb->Begin();
		$pre_guid = LibFc::guid();
		$vradd = [
			'uvr_uvl_id'=>$ordArr['uvl_id'],	
			'uvr_status'=>0,	
			'uvr_money'=>$dataArr['refund_money'],	
			'uvr_remark'=>$dataArr['remark'],	
			'uvr_money'=>$dataArr['refund_money'],	
			'uvr_atime'=>time(),	
			'uvr_etime'=>time(),	
			'uvr_pre_guid'=>$pre_guid,
			'uvr_by_uid'=>$dataArr['by_uid']	
		];

		$res = $this->add('pl_user_vip_refund',$vradd);
		$uvr_id = $res['data'];

		//剩余金额
		$leaveMoney = $maxRefund - $dataArr['refund_money'];

		$res = $this->get('dl_order_list', ['*'], sprintf(" and dml_order_id=%d", $uvl_id), true);
		$dmlArr = $res['data'];
		if(!isset($dataArr['selftc_money']) || $dataArr['selftc_money'] == '') $dataArr['selftc_money'] = $dmlArr['dml_money_selftc'];
		if(!isset($dataArr['ywytc_money']) || $dataArr['ywytc_money'] == '') $dataArr['ywytc_money'] = $dmlArr['dml_money_ywytc'];
		if($dataArr['selftc_money'] > $leaveMoney) $dataArr['selftc_money'] = $leaveMoney;
		if($dataArr['ywytc_money'] > $leaveMoney) $dataArr['ywytc_money'] = $leaveMoney;

		$tremark = date('Ymd H:i').'退款:'.$dataArr['refund_money'].' 原因:'.$dataArr['remark'];
		//代理单
		$setArr = [
			'dml_money_pay'=>$leaveMoney,
			'dml_money_gstc'=>$leaveMoney - $dataArr['selftc_money'],
			'dml_money_selftc'=>$dataArr['selftc_money'],
			'dml_money_ywytc'=>$dataArr['ywytc_money'],
			'dml_remark'=>$dmlArr['dml_remark'].' '.$tremark
		];
		$this->set('dl_order_list', $setArr, sprintf(" and dml_id=%d", $dmlArr['dml_id']));
		
		//新总业绩 服务
		$CrmsbMain = new CrmsbMain();
		$res = $CrmsbMain->get('yja_money_ser', ['*'], sprintf(" and mos_from='PJLVIP' and mos_from_id=%d", $uvl_id), true);
		$serArr = $res['data'];
		$setArr = [
			'mos_pay_money'=>$leaveMoney,
			'mos_com_money'=>$leaveMoney - $dataArr['selftc_money'],
			'mos_user_money'=>$dataArr['selftc_money'],
			'mos_remark'=>$serArr['mos_remark'].' '.$tremark
		];
		$CrmsbMain->set('yja_money_ser', $setArr, sprintf(" and mos_id=%d", $serArr['mos_id']));
		
		$res = $CrmsbMain->get('yja_money', ['*'], sprintf(" and mon_id=%d", $serArr['mos_mon_id']), true);
		$monArr = $res['data'];
		$res = $CrmsbMain->get('yja_money_ser', ['sum(mos_pay_money) mos_pay_money'], sprintf(" and mos_mon_id=%d", $serArr['mos_mon_id']), true);
		$setArr = [
			'mon_money'=>$res['data']['mos_pay_money'],
			'mon_remark'=>$monArr['mon_remark'].' '.$tremark
		];
		$CrmsbMain->set('yja_money', $setArr, sprintf(" and mon_id=%d", $serArr['mos_mon_id']));

		//提成表
		$setArr = [
			'mst_money_all'=>$dataArr['selftc_money'],
			'mst_money_ywr'=>$dataArr['selftc_money'],
		];
		$CrmsbMain->set('yja_money_ser_tc', $setArr, sprintf(" and mst_mos_id=%d", $serArr['mos_id']));
		//对账单
		$setArr = [
			'ymt_money'=>$dataArr['selftc_money'],
		];
		$CrmsbMain->set('yja_money_tcbill', $setArr, sprintf(" and ymt_mst_mos_id=%d", $serArr['mos_id']));

		//跑街合同
		$CrmMain = new CrmMain();
		$res = $CrmMain->get('fad_link_fct_sve', ['*'], sprintf(" and fsl_des_id=%d", $uvl_id), true);
		$fslArr = $res['data'];
		if($fslArr){
			$set = ['fsl_money'=>$leaveMoney];
			if($leaveMoney == 0){
				$set['fsl_btime'] = time();
				$set['fsl_etime'] = time();
			}
			$CrmMain->set('fad_link_fct_sve', $set, sprintf(" and fsl_id=%d", $fslArr['fsl_id']));
			$CrmMain->set('fad_contract', ['fct_money'=>$leaveMoney], sprintf(" and fct_id=%d", $fslArr['fsl_fct_id']));
			$CrmMain->set('fad_pay_money', ['pay_money'=>$leaveMoney], sprintf(" and pay_fct_id=%d", $fslArr['fsl_fct_id']));
			$CrmMain->set('fad_finance', ['fae_money'=>$leaveMoney], sprintf(" and fae_fct_id=%d", $fslArr['fsl_fct_id']));
			$CrmMain->set('fad_link_pay', ['fff_pay_money'=>$leaveMoney], sprintf(" and fff_fct_id=%d", $fslArr['fsl_fct_id']));
		}
		
		//全额已经全部退完 退服务
		if($leaveMoney == 0){
			$res = $this->get('pl_user_vip', ['*'], sprintf(" and uip_uvl_id=%d", $uvl_id), true);
			$vipArr = $res['data'];
			//是否存在大于删除记录的时间
			$deltime = $vipArr['uvip_etime'] - $vipArr['uvip_btime'];
			$this->set('pl_user_vip', ['uvip_btime'=>'#@uvip_btime-'.$deltime, 'uvip_etime'=>'#@uvip_etime-'.$deltime], sprintf(" and uvip_uid=%d and uip_uvl_id!=%d and uvip_btime>=%d", $ordArr['uvl_uid'], $uvl_id, $vipArr['uvip_etime']));
			$this->set('pl_user_vip', ['uvip_btime'=>0, 'uvip_etime'=>0], sprintf(" and uvip_uid=%d and uip_uvl_id=%d", $ordArr['uvl_uid'], $vipArr['uip_uvl_id']));
			
			//店铺VIP
			if($ordArr['uvl_now_vip_id'] == 4){
				$this->set('pl_shop_vip', ['svip_btime'=>'#@svip_btime-'.$deltime, 'svip_etime'=>'#@svip_etime-'.$deltime], sprintf(" and svip_shop_id=%d and svip_uvl_id!=%d and svip_btime>=%d", $ordArr['uvl_uid'], $uvl_id, $vipArr['uvip_etime']));
				$this->set('pl_shop_vip', ['svip_btime'=>0, 'svip_etime'=>0], sprintf(" and svip_shop_id=%d and svip_uvl_id=%d", $ordArr['uvl_uid'], $vipArr['uip_uvl_id']));

				$res = $this->get('pl_shop_vip', ['max(svip_etime) svip_etime'], sprintf(" and svip_shop_id=%d", $ordArr['uvl_uid']), true);
				$this->set('pl_shop', ['shop_vip_etime'=>(int)$res['data']['svip_etime']], sprintf(" and shop_id=%d", $ordArr['uvl_uid']));
			}
			$this->set('pl_user_vip_list', ['uvl_status'=>-1, 'uvl_close_time'=>time()], sprintf(" and uvl_id=%d", $uvl_id));
		}
		//退款
		if($ordArr['uvl_por_id']){
			$MainOrder = new MainOrder();
			$aruArr = [
				'pre_por_id'=>$ordArr['uvl_por_id'],
				'pre_guid'=>$pre_guid,
				'pre_refund_money'=>$dataArr['refund_money'],
				'pre_des'=>$tremark
			];
			$res = $MainOrder->refund($aruArr);
			$pre_id = $res['data'];
			if($leaveMoney == 0){
				$MainOrder->set('pa_order', ['por_status'=>-1], sprintf(" and por_id=%d", $ordArr['uvl_por_id']));
			}
			$this->set('pl_user_vip_refund', ['uvr_status'=>1, 'uvr_pre_id'=>$pre_id, 'uvr_refund_type'=>0, 'uvr_etime'=>time()], sprintf(" and uvr_id=%d", $uvr_id));
		}else{
			$this->set('pl_user_vip_refund', ['uvr_status'=>1, 'uvr_pre_id'=>0, 'uvr_refund_type'=>1, 'uvr_etime'=>time()], sprintf(" and uvr_id=%d", $uvr_id));
		}
		$this->PjlDb->End();
		return LibFc::ReturnData(true, $uvr_id);
	}
}