<?php
/**
  * @method 跑街令 用户操作
  * @author soul
  * @copyright 2018/7/23
  */
class PjlDaili extends PjlBase
{
	/**
	  * @method 获取业务员列表
	  * @param  $dco_id [必填] 代理公司ID
	  * @param  $dwo_uid [可选] 代理公司ID
	  * @author soul
	  * @copyright 2019/12/25
	  * @return 
	  */
	public function getDcoWorkers($dco_id, $dwo_uid = 0)
	{
		$where =  sprintf(" and dwo_dco_id=%d", $dco_id);
		if($dwo_uid > 0) $where .=  sprintf(" and dwo_uid=%d", $dwo_uid);
		$res = $this->get('dl_worker',['dwo_uid', 'dwo_name'], $where.' order by dwo_status desc, CONVERT(dwo_name using gbk) asc');
		$res['data'] = array_column($res['data'], null, 'dwo_uid');
		return $res;
	}




	/**
	  * @method 删除代理业务员
	  * @param  $dco_id  代理公司ID
	  * @param  $uid  用户ID
	  * @author soul
	  * @copyright 2019/12/25
	  * @return 
	  */
	public function delWorker($dco_id, $uid)
	{
		$dco_id = (int) $dco_id;
		$uid = (int) $uid;
		$res = $this->get('dl_worker join dl_company on dco_id=dwo_dco_id', ['dco_uid'], sprintf(" and dco_id=%d and dwo_uid=%d", $dco_id, $uid), true);
		if(!empty($res['data']))
		{
			if($res['data']['dco_uid'] == $uid) return LibFc::ReturnData(false, '此账号是本代理公司的所有者，禁止删除！');

			$res = $this->get('dl_order_list', ['dml_id'], sprintf(" and dml_dco_id=%d and dml_dwo_uid=%d", $dco_id, $uid), true);
			if(!empty($res['data'])) return LibFc::ReturnData(false, '此账号已产生业务，禁止删除，您可以选择停用！');
			$this->PjlDb->Begin();
			$this->del('dl_worker', sprintf(" and dwo_dco_id=%d and dwo_uid=%d", $dco_id, $uid));
			$this->del('dl_worker_invcode', sprintf(" and dwi_dco_id=%d and dwi_dwo_uid=%d", $dco_id, $uid));
			$this->PjlDb->End();
		}
		return LibFc::ReturnData(true, true);
	}

	/**
	  * @method 删除邀请码
	  * @param  $codeArr  array ['0102',...]
	  * @author soul
	  * @copyright 2019/12/25
	  * @return 
	  */
	public function delInvcode($codeArr)
	{
		if(!empty($codeArr))
		{
			foreach($codeArr as $k=>$v)
			{
				$codeArr[$k] = sprintf("'%s'", LibFc::Escape($v));
			}
			$res = $this->get('dl_order_list', ['distinct dml_dwi_invcode'], sprintf(" and dml_dwi_invcode in (%s)", implode(',', $codeArr)));
			if(!empty($res['data'])) return LibFc::ReturnData(false, '邀请码'.implode('、', array_column($res['data'], 'dml_dwi_invcode')).'已产生业务，禁止删除！');
			$this->del('dl_worker_invcode', sprintf(" and dwi_invcode in (%s)", implode(',', $codeArr)));
		}
		return LibFc::ReturnData(true, true);
	}

	/**
	  * @method 重置邀请码的二维码
	  * @param  $codeArr  [选填] all:表示所有， 空值表示：只更新尚未生成的
	  * @author soul
	  * @copyright 2019/12/25
	  * @return 
	  */
	public function rebuildinvcodeEwm($codeArr = [])
	{
		$where = '';
		if($codeArr == 'all')
		{
		
		}
		else if(is_array($codeArr) && !empty($codeArr))
		{
			foreach($codeArr as $k=>$v)
			{
				$codeArr[$k] = sprintf("'%s'", LibFc::Escape($v));
			}
			$where = sprintf(" and dwi_invcode in (%s)", implode(',', $codeArr));
		}
		else
		{
			$where = " and dwi_invcode_url = ''";
		}
		
		$listres = $this->get('dl_worker_invcode', ['dwi_invcode'], $where);
		if(!empty($listres['data']))
		{
			$OthQrcode=new OthQrcode();
			$this->PjlDb->Begin();
			$logo = mvc::$cfg['ROOT'].'home/yqewm/logo.png';
			$level=3; $size=8; $margin=2;
			$font = mvc::$cfg['AUTOLOAD']['Oth']['path'].'lib/captcha/assets/zhttfs/msyhbd.ttf';
			foreach($listres['data'] as $v)
			{
				$saveFile = mvc::$cfg['ROOT'].'home/yqewm/'.$v['dwi_invcode'].'.png';
				$url = 'http://pjl.paojd.cn/s/invcode?inv='.$v['dwi_invcode'];
				$ewmUrl = 'https://paojd.cn/yqewm/'.$v['dwi_invcode'].'.png';
				$src = $OthQrcode->png($url, $saveFile,$level,$size,$margin,$logo);
				if(file_exists($font))
				{
				    
				    $dst = imagecreatefromstring(file_get_contents($src));
                   
                    $im = imagecreatetruecolor(330, 360); 
                    
                    $white = imagecolorallocate($im, 255, 255, 255); 
                    //加颜色
                    $red = imagecolorallocate($im, 255, 0, 0); 
                    
                    imagefilledrectangle($im, 0, 0, 1200, 600, $white); 
                    
                    $text = '邀请码:'.$v['dwi_invcode']; 
                    $encode = mb_detect_encoding($text, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5','LATIN1'));
                    
                    if($encode != 'UTF-8')
                    {
                       $text = mb_convert_encoding($text, 'UTF-8', $encode);
                    }

                    //添加字到画布
                    imagettftext($im, 16, 0, 90, 348, $red, $font, $text); 
                    //合并
                    imagecopyresampled($im,$dst,0,0,0,0,330,330,330,330);
                    //保存
                    imagepng($im,$src);
                    //清除画布
                    imagedestroy($im); 
				}
	
				$this->set('dl_worker_invcode', ['dwi_invcode_url'=>$ewmUrl], sprintf(" and dwi_invcode='%s'", $v['dwi_invcode']));


			}
			$this->PjlDb->End();
		}
		return LibFc::ReturnData(true, true);
	}

	/**
	  * @method 计算邀请码的价格
	  * @param  $docId  [必填] 代理公司ID
	  * @param  $uid  [必填] 业务员ID
	  * @param  $dataArr  [必填] ['dwi_shop_price'=>600.00, 'dwi_pcyear_price'=>600.00...]
	  * @author soul
	  * @copyright 2019/12/25
	  * @return 
	  */
	public function initWorkerInvcodePrice($docId, $uid, $dataArr)
	{
		$allStyle = [
			'shop'=>'商家入驻',	
			'pcyear'=>'pc年卡',	
			'pchyear'=>'pc半年卡',	
			'pcmonth'=>'pc月卡'
		];

		$res = $this->get('dl_worker join dl_company on dco_id=dwo_dco_id', ['dco_id, dco_code, dwo_uid, dco_tc'], sprintf(" and dco_id=%d and dwo_uid=%d", $docId, $uid), true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '业务员不存在！');
		$workArr = $res['data'];
		$workArr['dco_tc'] = json_decode($workArr['dco_tc'], true);

		$workArr['price'] = [];
		foreach($allStyle as $type=>$name)
		{
			if(empty($workArr['dco_tc'][$type]) || count($workArr['dco_tc'][$type]) < 4) return LibFc::ReturnData(false, '代理价格配置异常，请联系平台！');
			if(empty($dataArr['dwi_'.$type.'_price'])) return LibFc::ReturnData(false, '获取'.$allStyle[$type].'价格失败！');
			$price = sprintf('%.2f', $dataArr['dwi_'.$type.'_price']);
			$dlPrice = $workArr['dco_tc'][$type];
			if($price < $dlPrice['min'] || $price > $dlPrice['max']) LibFc::ajaxJsonEncode(['status'=>false, 'data'=>$name.'价格不能低于'.$dlPrice['min'].'元，且不能高于'.$dlPrice['max'].'元！']);

			$workArr['price']['dwi_'.$type.'_price'] = $price;
			//公司账号无提成
			if($workArr['dwo_uid'] == 172999)
			{
				$workArr['price']['dwi_'.$type.'_gstc'] = $price;
			}
			else
			{
				//按照业务员方式计算
				if($dlPrice['tc'] == 'self')
				{
					//<=1 按照百分比计算
					$workArr['price']['dwi_'.$type.'_gstc'] = $dlPrice['tcmoney'] <= 1 ? sprintf('%.2f', $price*(1-$dlPrice['tcmoney'])): sprintf('%.2f', $price-$dlPrice['tcmoney']);
				}
				else
				{
					$workArr['price']['dwi_'.$type.'_gstc'] = $dlPrice['tcmoney'] <= 1 ? sprintf('%.2f', $price*$dlPrice['tcmoney']): sprintf('%.2f', $dlPrice['tcmoney']);
				}
			}

			$workArr['price']['dwi_'.$type.'_ywytc'] = sprintf('%.2f', $dataArr['dwi_'.$type.'_ywytc']);
			//业务提成不能超过代理商提成
			if($workArr['price']['dwi_'.$type.'_ywytc'] > ($workArr['price']['dwi_'.$type.'_price'] - $workArr['price']['dwi_'.$type.'_gstc']))
				$workArr['price']['dwi_'.$type.'_ywytc'] = $workArr['price']['dwi_'.$type.'_price'] - $workArr['price']['dwi_'.$type.'_gstc'];
		}
		return LibFc::ReturnData(true, $workArr);
	}


	/**
	  * @method 修改邀请码
	  * @param  
	  * @author soul
	  * @copyright 2019/12/25
	  * @return 
	  */
	public function editWorkerInvcode($dcoid, $uid, $dataArr)
	{
		if($uid == 172999) return LibFc::ReturnData(false, '此账号禁止调价！');

		$res = $this->get('dl_company', ['dco_id, dco_code'], sprintf(" and dco_id=%d", $dcoid), true);
		$dcoArr = $res['data'];
		
		$res = $this->get('dl_worker_invcode', ['distinct dwi_invcode'], sprintf(" and dwi_dco_id=%d order by dwi_invcode", $dcoid));
		$dcoArr['has'] = array_column($res['data'], 'dwi_invcode');
		$invArr = [];
		foreach($dataArr as $row)
		{
			//自动生成
			if(empty($row['dwi_invcode']) && empty($row['einvcode']))
			{
				for($i = 0; $i <= 999; $i++)
				{
					$row['dwi_invcode'] = $dcoArr['dco_code'].str_pad($i, 3, 0, STR_PAD_LEFT);
					if(!in_array($row['dwi_invcode'], $dcoArr['has'])) break;
				}
				if(empty($row['dwi_invcode']) || in_array($row['dwi_invcode'], $dcoArr['has'])) 
					return LibFc::ReturnData(false, '邀请码不能自动生成，请重新提交或者手工输入！');
			}
			else if(!empty($row['einvcode']))
			{
				if(!preg_match('/\d{2,3}/', $row['einvcode'], $match)) return LibFc::ReturnData(false, $row['einvcode'].'邀请码不正确！');
				$row['dwi_invcode'] = $dcoArr['dco_code'].$row['einvcode'];
				unset($row['einvcode']);
				if(in_array($row['dwi_invcode'], $dcoArr['has'])) return LibFc::ReturnData(false, $row['einvcode'].'邀请码已被使用，请换一个！');
			}

			if(!in_array($row['dwi_invcode'], $dcoArr['has']))
			{
				$dcoArr['has'][] = $row['dwi_invcode'];
				sort($dcoArr['has']);
			}
			
			$res = $this->initWorkerInvcodePrice($dcoid, $uid, $row);
			$row['init'] =$res['data'];
			
			$invArr[$row['dwi_invcode']] = $row;
		}
		
		$this->PjlDb->Begin();
		foreach($invArr as $invcode=>$row)
		{
			$res = $this->get('dl_worker_invcode', ['dwi_dwo_uid'], sprintf(" and dwi_invcode='%s'", $invcode), true);
			if(!empty($res['data']))
			{
				$this->set('dl_worker_invcode', $row['init']['price'], sprintf(" and dwi_invcode='%s'", LibFc::Escape($invcode)));
			}
			else
			{
				$addArr = [
					'dwi_dwo_uid'=>	$row['init']['dwo_uid'],
					'dwi_dco_id'=> $row['init']['dco_id'],
					'dwi_invcode'=>	$row['dwi_invcode'],
					'dwi_etime'=>time()
				];
				$addArr = array_merge($addArr, $row['init']['price']);
				$this->add('dl_worker_invcode', $addArr);
			}
		}
		
		$del = sprintf(" and dwi_dco_id=%d and dwi_dwo_uid=%d", $dcoid, $uid);
		if( !empty($invArr) ) $del .= sprintf(" and dwi_invcode not in ('%s')", implode("','", array_keys($invArr)));
		$this->del('dl_worker_invcode', $del);
		$this->PjlDb->End();
		$this->rebuildinvcodeEwm('');
		return LibFc::ReturnData(true, true);
	}

	
	/**
	  * @method 根据价格配置，重新初始化所有邀请码价格
	  * @param  
	  * @author soul
	  * @copyright 2019/12/25
	  * @return 
	  */
	public function initAllInvcodePrice()
	{
		$res = $this->get('dl_worker_invcode', ['*'], ' and dwi_dwo_uid != 172999 order by dwi_invcode');
		$dataArr = [];
		foreach($res['data'] as $v)
		{
			$dataArr[$v['dwi_dco_id']][$v['dwi_dwo_uid']][] = $v;
		}
		$this->PjlDb->Begin();
		foreach($dataArr as $dcoid=>$v)
		{
			foreach($v as $uid=>$vv)
			{
				$this->editWorkerInvcode($dcoid, $uid, $vv);
			}
		}
		$this->PjlDb->End();
		return LibFc::ReturnData(true, true);
	}

	/**
	 * @todo 待完善
	 * @param $data
	 * @return array
	 */
	public function addOrEditDls($data)
	{
		$data['dl_company']['dco_tc'] = json_encode($data['dl_company']['dco_tc']);//todo 待验证
		if($data['dl_company']['dco_id'] > 0){
			$dcoId = $data['dl_company']['dco_id'];
		    $dctId = $this->PjlDb->One(sprintf("select dct_id from dl_company_target WHERE dct_dco_id=%d",$dcoId));
			$data['dl_company_target_pcts']['dctp_dct_id'] = $dcoId;
			unset($data['dl_company']['dco_atime'],$data['dl_company_target']['dct_id'],$data['dl_company']['dco_id'],$data['dl_company']['dco_code'],$data['dl_worker']['dwo_atime'],$data['dl_worker']['dwo_dco_id'],$data['dl_company_target_pcts']['dctp_dct_id']);
			$this->PjlDb->Begin();
			$res = $this->set("dl_company",$data['dl_company'],sprintf(" and dco_id=%d",$dcoId));
			if(!$res['status']){
				$this->PjlDb->Rollback(true);
				$this->PjlDb->End();
				return LibFc::ReturnData(false,'操作失败,请重试');
			}
			$res = $this->set("dl_company_target",$data['dl_company_target'],sprintf(" and dct_id=%d",$dctId));
			if(!$res['status']){
				$this->PjlDb->Rollback(true);
				$this->PjlDb->End();
				return LibFc::ReturnData(false,'操作失败,请重试');
			}

			//fixMe 此处先删除后重新添加
            $res = $this->del("dl_company_target_pcts",sprintf(" and dctp_dct_id=%d",$dctId));
            if(!$res['status']){
                $this->PjlDb->Rollback(true);
                $this->PjlDb->End();
                return LibFc::ReturnData(false,'操作失败,请重试');
            }
            if(!empty($data['dl_company_target_pcts']['dctp_pc_id'])){
                foreach ($data['dl_company_target_pcts']['dctp_pc_id'] as $pcId){
                    $temp = [
                        'dctp_dct_id' => $dctId,
                        'dctp_pc_id' => $pcId,
                        'dctp_pc_type' => $data['dl_company_target_pcts']['dctp_pc_type']
                    ];
                    $res = $this->add("dl_company_target_pcts",$temp);
                    if(!$res['status']){
                        $this->PjlDb->Rollback(true);
                        $this->PjlDb->End();
                        return LibFc::ReturnData(false,'操作失败,请重试');
                    }
                }
            }


			$uId = $data['dl_worker']['dwo_uid'];
			unset($data['dl_worker']['dwo_uid']);
			$res = $this->set("dl_worker",$data['dl_worker'],sprintf(" and dwo_dco_id=%d and dwo_uid = %d",$dcoId,$uId));
			if(!$res['status']){
				$this->PjlDb->Rollback(true);
				$this->PjlDb->End();
				return LibFc::ReturnData(false,'操作失败,请重试');
			}
			$this->PjlDb->End();

			//更新开始

		}else{
			/**
			 *添加t
			 */
			$codeOne = $this->PjlDb->One(sprintf("select 1 from dl_company where dco_code =%d",$data['dl_company']['dco_code']));
			if($codeOne){
				return LibFc::ReturnData(false,'代理的唯一编码已经存在');
			}
			unset($data['dl_company']['dco_id']);
			$this->PjlDb->Begin();
			$res = $this->add('dl_company',$data['dl_company']);
			if(!$res['status']) {
				$this->PjlDb->Rollback(true);
				$this->PjlDb->End();
				return LibFc::ReturnData(false,'操作失败,请重试');
			}
			$dcoId = $res['data'];
			//拿不到的时候重新查询一次
			if((int) $dcoId <= 0){

				$dcoId = $this->PjlDb->One(sprintf("select dco_id from WHERE dco_code=%d",$data['dl_company']['dco_code']));
			}
			if(empty($dcoId) || $dcoId <= 0){
				$this->PjlDb->Rollback(true);
				$this->PjlDb->End();
				return LibFc::ReturnData(false,'操作失败,请重试');
			}
			//添加代理目标
			unset($data['dl_company_target']['dct_id'],$data['dl_company']);
			$data['dl_company_target']['dct_dco_id'] =  $dcoId;
			$data['dl_worker']['dwo_dco_id'] = $dcoId;

			$res = $this->add('dl_company_target',$data['dl_company_target']);
			$dctId = $res['data'];
			if((int) $dcoId <= 0){
				$dctId = $this->PjlDb->One(sprintf("select dct_id from dl_company_target WHERE dct_dco_id=%d",$dcoId));
			}
			if(empty($dctId) || $dctId <= 0){
				$this->PjlDb->Rollback(true);
				$this->PjlDb->End();
				return LibFc::ReturnData(false,'操作失败,请重试');
			}
			//$data['dl_company_target_pcts']['dctp_dct_id'] = $dctId;

            if(!empty($data['dl_company_target_pcts']['dctp_pc_id'])){
                foreach ($data['dl_company_target_pcts']['dctp_pc_id'] as $pcId){
                    $temp = [
                        'dctp_dct_id' => $dctId,
                        'dctp_pc_id' => $pcId,
                        'dctp_pc_type' => $data['dl_company_target_pcts']['dctp_pc_type']
                    ];
                    $res = $this->add("dl_company_target_pcts",$temp);
                    if(!$res['status']){
                        $this->PjlDb->Rollback(true);
                        $this->PjlDb->End();
                    }
                }
            }
			//添加目标限制标
			$res = $this->add('dl_worker',$data['dl_worker']);
			if(!$res['status']){
				$this->PjlDb->Rollback(true);
				$this->PjlDb->End();
				return LibFc::ReturnData(false,'操作失败,请重试');
			}
			$this->PjlDb->End();
		}
		return LibFc::ReturnData(true,'操作成功');
	}


	/**
	 * @method 将VIP单转为商家入驻
	 * @author zhengweihua 
	 * @copyright 2025-09-01
	 */
	public function changeVipToShop($orderId)
	{
		$vipRst = $this->get('pl_user_vip',['uip_uvl_id','uvip_uid','uvip_btime','uvip_etime'],sprintf(" AND uip_uvl_id = %d",$orderId),true);
		if(!$vipRst['data']) return LibFc::ReturnData(false,'记录不存在，请核实');

		$vipInfo = $vipRst['data'];

		//再验证下店铺到期时间跟VIP到期时间是否一致
		$shopRst = $this->get('pl_shop',['shop_id', 'shop_vip_etime'],sprintf(" AND shop_pu_id = %d ",$vipInfo['uvip_uid']),true);

		if(empty($shopRst['data'])) return LibFc::ReturnData(false, '尚未申请商铺入驻');

		$shopInfo = $shopRst['data'];
		
		if($shopInfo['shop_vip_etime'] == $vipInfo['uvip_etime']) return LibFc::ReturnData(true);
		
		//时间不一致才更新
		$this->PjlDb->Begin();
		//更新店铺到期时间
		$this->set('pl_shop',['shop_vip_etime'=>$vipInfo['uvip_etime']],sprintf(" AND shop_pu_id = %d",$vipInfo['uvip_uid']));
		$addArr = [
			'svip_shop_id'=>$shopInfo['shop_id'],
			'svip_btime'=>$vipInfo['uvip_btime'],
			'svip_etime'=>$vipInfo['uvip_etime'],
			'svip_uvl_id'=>$vipInfo['uip_uvl_id'],
			'svip_style'=>1
		];
		$res = $this->add('pl_shop_vip', $addArr);
		$this->PjlDb->End();
		return LibFc::ReturnData(true,$res['data']);
	}
}
