<?php
namespace admin\action\pro;
use \model\carmodel;
use \model\pro\cate;
use \model\check;
use model\oe;
use model\pro\paramset;
use model\pro\pro;
use model\pro\rule;

class cateAction  extends \action{
	function list(){
		$req = \mvc::$req;
        $cate = new cate();
		$data = $cate->list2($req, $req['filters'], $req['page'], $req['rows'], $req['sidx'], $req['sord']);
		$this->successJson($data);
	}
	
	function list2(){
        $req = \mvc::$req;
		//前置条件
		$rules = $this->urlRulesToWhere($req);
		if($req['pwcode']){
			$rules = array_merge($rules, ['pwcode'=>$req['pwcode']]);
		}
        $data = (new cate())->list2($rules,$req['filters'], $req['page'], $req['rows'], $req['sidx'], $req['sord'],'');
        $this->successJson($data);
	}
	
	function listOppo(){
        $req = \mvc::$req;
		//前置条件
		$rules = $this->urlRulesToWhere($req);
        $data = (new cate())->listOppo($rules,$req['filters'], $req['page'], $req['rows'], $req['sidx'], $req['sord'],'');
        $this->successJson($data);
	}

	function getAttaqtys()
	{
		$arr = [['key'=>'', 'value'=>'']];
		$cate = new cate();
		foreach($cate->attaqtys as $k=>$v)
		{
			$arr[] = ['key'=>$k, 'value'=>$v];
		}
		$this->successJson($arr);
	}
	function getMasAttaqtys()
	{
		$arr = [['key'=>'', 'value'=>'']];
		$cate = new cate();
		foreach($cate->attaqtys2 as $k=>$v)
		{
			$arr[] = ['key'=>$k, 'value'=>$v];
		}
		$this->successJson($arr);
	}


	/**
	  * @method 是否有产品
	  * @param  id int [必填] ID
	  * @return bool
	  */
	public function hasPro($id)
    {
        $pro = makeOne(\model\pro\pro::class);
        $result = $pro->has('p_cate',$id);
        $this->successJson($result);
    }

	/**
	  * @method 取参数示意图
	  * @return url
	  */
	public function param_photo($cid)
    {
        $url = '';
        $cate = new cate();
        if($row = $cate->getRowByKey($cid)){
            if($row['photo_param']){
                $url = makeOne(\model\files::class)->getFilename($row['photo_param']);
                $url = makeOne(\lib\file::class)->formatDir($url);
                $url = ltrim($url,'/');
            }
        }
        $this->successJson(['filename'=>$url]);
    }

	/**
	  * @method 明细
	  * @param  id int [必填] ID
	  * @author soul
	  */
	public function form()
    {
		$req = \mvc::$req;
		$carmodel = new carmodel();
		$cate = new cate();
		$dataArr = [];
		if(!empty($req['id']))
		{
			$dataArr = $cate->lrtree->getNode($req['id']);
			$dataArr['cat_model_fileds'] = !empty($dataArr['cat_model_fileds'])? json_decode($dataArr['cat_model_fileds'], true): [];
			$dataArr['cat_tcdfac'] = empty($dataArr['cat_tcdfac'])? []:explode(',', $dataArr['cat_tcdfac']);
			$dataArr['cat_tcdfacmain'] = empty($dataArr['cat_tcdfacmain'])? []:explode(',', $dataArr['cat_tcdfacmain']);
			$dataArr['cat_pos1'] = empty($dataArr['cat_pos1'])? []:explode(',', $dataArr['cat_pos1']);
			$dataArr['cat_pos2'] = empty($dataArr['cat_pos2'])? []:explode(',', $dataArr['cat_pos2']);
			$dataArr['cat_pos3'] = empty($dataArr['cat_pos3'])? []:explode(',', $dataArr['cat_pos3']);
			$dataArr['cat_pos4'] = empty($dataArr['cat_pos4'])? []:explode(',', $dataArr['cat_pos4']);
			$dataArr['cat_pos5'] = empty($dataArr['cat_pos5'])? []:explode(',', $dataArr['cat_pos5']);
			
			$dataArr['captions']['cat_cnpos'] = '';
			if(!empty($dataArr['cat_cnpos']))
			{
				$tarr = [];
				$cnpos = json_decode($dataArr['cat_cnpos'], true);
				foreach($cnpos as $rv)
				{
					$row = $rv['name'];
					if(isset($rv['seq'])) $row .= ':'.$rv['seq'];
					$tarr[] = $row;
				}
				$dataArr['captions']['cat_cnpos'] = implode("\n", $tarr);
			}
			$facRows = $cate->cleanGaTj($req['id']);
			$facRows = is_array($facRows)? array_column($facRows, null, 'sup_brand'): [];
			$facArr = [];
			// 兼容旧数据中只保存为重点厂商。
			foreach($dataArr['cat_tcdfacmain'] as $facName){
				if($facName === '' || isset($facArr[$facName])) continue;
				$facArr[$facName] = $facRows[$facName]?? ['sup_brand'=>$facName];
			}
			// 按已保存的清洗顺序排列；新增厂商追加到末尾。
			foreach($dataArr['cat_tcdfac'] as $facName){
				if($facName === '' || isset($facArr[$facName])) continue;
				$facArr[$facName] = $facRows[$facName]?? ['sup_brand'=>$facName];
			}
			foreach($facRows as $facName=>$facRow){
				if(!isset($facArr[$facName])) $facArr[$facName] = $facRow;
			}
			
			\view::set('facArr', $facArr);

			$rule = new rule();
			$rule = $rule->getCateRuleById($req['id']);
			\view::set('rule', $rule);
		}
		$dataArr['parent_info'] = [LG_NAME=>lg('顶级'),'id'=>0];
		$parent_id = $req['parent_id']??$dataArr['parent_id'];
		if($parent_id){
			$dataArr['parent_info'] = $cate->lrtree->getNode($parent_id);
		}
		//关联的数组信息
		$relArr = [];
		if(!empty($req['oe_id'])){
			$oe = new oe();
			$oeArr = $oe->getDetail($req['oe_id']);
			$relArr['paraArr'] = $oeArr['oe_para'];
			$relArr['chkpro_info'] = $oeArr['oe_chkpro_info'];
		}

		if(!empty($req['p_id'])){
			$pro = new pro();
			$proArr = $pro->getProParams($req['p_id']);
		
			$relArr['paraArr'] = $proArr['p_para'];
			$relArr['chkpro_info'] = $proArr['oe_chkpro_info'];
	
		}
		$pro = new pro();
		$pbArr = $pro->getProBrand(['pb_id'=>1]);
		\view::set('pbArr',$pbArr);

		$paramset = new paramset();
		$raws = $paramset->getCommonParam($req['id']);

		\view::set('commonParam', $raws);
		// dd($relArr);die;
		\view::set('relArr', $relArr);
		\view::set('attaqtysitems', $cate->attaqtysItems());
		\view::set('attaqtys2items', $cate->attaqtys2Items());
		$pro = makeOne(\model\pro\pro::class);
		\view::set('allPos', $pro->allPos);
		\view::set('dataArr', $dataArr);
	
		\view::put();
    }

	function setForm(){
		$req = \mvc::$req;
        $cate = new cate();
		$re = ['：'=>':', '，'=>',', '；'=>';'];
		$setArr = [
			'is_engine' =>(int)$req['is_engine'],
			'cat_item_type' =>(int)$req['cat_item_type'],
			'cat_unit' =>(int)$req['cat_unit'],
			'cat_unit_customs' =>(int)$req['cat_unit_customs'],
			'cat_hsbm' =>$req['cat_hsbm'],
			'cat_ktsl' =>(int)$req['cat_ktsl'],
			'keyword'=>$req['keyword']??'',
			'attaqty'=>$req['attaqty']??'',
			'cat_zhuyi'=>$req['cat_zhuyi'],
			'cat_pzbz'=>$req['cat_pzbz'],
			'cat_zpsl'=>$req['cat_zpsl'],
			'cat_cnpos'=>[],
			'cat_cnpos_fileds'=>'',
			'cat_tcdfac'=>empty($req['cat_tcdfac'])? '': implode(',', $req['cat_tcdfac']),
			'cat_cnpos_vals'=>strtr($req['cat_cnpos_vals'], $re),
			'cat_pos1'=>empty($req['pos1'])? '': implode(',', $req['pos1']),
			'cat_pos2'=>empty($req['pos2'])? '': implode(',', $req['pos2']),
			'cat_pos3'=>empty($req['pos3'])? '': implode(',', $req['pos3']),
			'cat_pos4'=>empty($req['pos4'])? '': implode(',', $req['pos4']),
			'cat_pos5'=>empty($req['pos5'])? '': implode(',', $req['pos5']),
			'cat_opuser'=>getOpuser(),
			'cat_prouni_material'=>$req['cat_prouni_material'],
			'cat_invoice'=>$req['cat_invoice']??'',
			'rule'=>$req['rule']??[],
			'cat_from_id'=>$req['cat_from_id'],
			'cat_detfacade'=>$req['cat_detfacade']??'',
			'cat_detpara'=>$req['cat_detpara']??'',
			'cat_detpower'=>$req['cat_detpower']??'',
		];
		
		//重点竞品最多10个
		$mainfac = [];
		if(!empty($req['cat_tcdfacmain'])){
			foreach($req['cat_tcdfacmain'] as $t){
				$mainfac[] = $t;
				if(count($mainfac) >= 10) break;
			}
		}
		$setArr['cat_tcdfacmain'] = implode(',', $mainfac);
		
		//多语言
		$setArr = langGetVals($setArr,$req,[''=>'']);

		$tval = [];
		foreach(explode(',', strtr($req['cat_as'], ['，'=>',',';'=>',','；'=>',',"\n"=>','])) as $tv){
			if(!empty($tv)) $tval[] = trim($tv);
		}
		$setArr['cat_as'] = $tval? ','.implode(',', array_unique($tval)).',' : '';

		$tval = [];
		foreach(explode(';', strtr($req['tcd_name'], ['；'=>';',"\n"=>','])) as $tv){
			if(!empty($tv)) $tval[] = trim($tv);
		}
		$setArr['tcd_name'] = $tval? ';'.implode(';', array_unique($tval)).';' : '';

		if($req['cat_rate_number']) $setArr['cat_rate_number'] = $req['cat_rate_number'];
		if($req['cat_rate_model']) $setArr['cat_rate_model'] = $req['cat_rate_model'];
		
		if(!empty($req['cat_cnpos']))
		{
			$fileds = ['pml_pos0','pml_pos1','pml_pos2','pml_pos3','pml_pos4'];
			$seqArr = [];
			$ofileds = [];
			$req['cat_cnpos'] = strtr($req['cat_cnpos'], $re);
			foreach(explode("\n", $req['cat_cnpos']) as $v)
			{
				$tarr = explode(':', $v);
				$name = $tarr[0];
				if(empty($name)) continue;
				$filed = array_shift($fileds);
				$row = ['filed'=>$filed, 'name'=>$name];
				if(count($tarr) > 1)
				{
					$row['seq'] = (int) $tarr[1];
					$ofileds[$row['seq']] = $filed;
				}
				ksort($ofileds);
				$setArr['cat_cnpos'][] = $row;
			}
			$setArr['cat_cnpos_fileds'] = implode(',', $ofileds);
		}
		$setArr['cat_cnpos'] = json_encode($setArr['cat_cnpos'], JSON_UNESCAPED_UNICODE);
		$check = new check();
		$checkArr = $setArr;
		$checkArr['parent_id'] = $req['parent_id'];
		$exist = $check->checkExist('pro_cate', $checkArr, $req['id']);
		if(!empty($exist)) $this->errorJson(-1,'名称已存在');

		//检测分类
		$res = $cate->canMoveSubtree($req['id'],$req['parent_id']);
		if(!$res['status']){
			$this->errorJson(-1,$res['msg']);
		}
		if(!empty($req['id'])){
			if($cate->editCate($req['id'], $req['parent_id'], $setArr)){
				$this->successJson(['id'=>$req['id']]);
			}
		}else{
			$cat_id = $cate->addCate($req['parent_id'], $setArr);
			$this->successJson(['id'=>$cat_id]);
		}
	}


	function move($prevKey,$key,$nextKey){
        $cate = new cate();
		if($cate->lrtree->moveNode($prevKey,$key,$nextKey)){
			$this->successJson();
		}
	}

	function delete($id){
        $cate = new cate();
		$data = $cate->delCate($id);
		$this->successJson($data);
	}

    function getNode($id){
        $cate = new cate();
        $data = $cate->lrtree->getNode($id);
        $this->successJson($data);
    }

	function getNodesByIds($ids){
        $cate = new cate();
        $data = $cate->lrtree->getNodesByIds($ids);
        $this->successJson($data);
    }

    function getParent($id){
        $cate = new cate();
        $data = $cate->lrtree->getParent($id);
        $this->successJson($data);
    }

    function getParents($id,$hasSelf){
        $cate = new cate();
        $data = $cate->lrtree->getParents($id,$hasSelf);
        $this->successJson($data);
    }

    function getChilds($id){
        $cate = new cate();
        $data = $cate->lrtree->getChilds($id);
        $this->successJson($data);
    }

	 /**
	  * @method 重构树
	  */
    function restructure($root){
		set_time_limit(3600);
        (new cate())->lrtree->restructure($root);
        $this->successJson();
    }

	 /**
	  * @method 小类选择
	  * @param  $pwcode  string  [选填]  权限代码
	  * @param  $style  string  [选填] 选择模式 anychk:多选  空(默认):单选
	  * @param  $pcateid  string  [选填] 指定产品线 逗号分隔
	  * @author soul
	  */
    function select()
	{
		$req = \mvc::$req;
		$style = !empty($req['style']) && $req['style'] == 'anychk'? 'anychk': '';
        $cate = new cate();
        $allPart = $cate->lrtree->getChilds(0);
		$allPart = array_column($allPart, null, 'id');
		
		//指定产品线
		$rulecate = null;
		if(!empty($req['pcateid']))
		{
			$rulecate = [];
			foreach(explode(',', $req['pcateid']) as $id)
			{
				$rows = $cate->lrtree->getChilds($id);
				$rulecate = array_merge($rulecate, array_column($rows, 'id'));
			}
		}
		
		//是否有权限控制
		if(!empty($req['pwcode']))
		{
			$pwids = \p::cates($req['pwcode']);
			if($pwids != '' && !\p::isAdmin())
			{
				if($rulecate !== null)
					$rulecate = array_intersect($rulecate, explode(',', $pwids));
				else
					$rulecate = explode(',', $pwids);
			}
		}

		if(isset($req['cfg']))
		{
			$cfg = json_decode(base64_decode($req['cfg']),true);
			if($req['cfg']){
				$hascate = $cate->getCatesByCfg($cfg);	

				if($rulecate !== null)
					$rulecate = array_intersect($rulecate, $hascate);
				else
					$rulecate = $hascate;
			}
		}

		if($rulecate !== null)
		{
			foreach($rulecate as $cid)
			{
				$pcatid = $allPart[$cid]['parent_id'];
				$rulecate[] = $pcatid;
				if(!empty($allPart[$pcatid]))
				$rulecate[] = $allPart[$pcatid]['parent_id'];
			}
			foreach($allPart as $k=>$v)
			{
				if(!in_array($v['id'], $rulecate))
					unset($allPart[$k]);
			}
			\view::set('ispwcode', 1);
		}
		
		//拼装零件树
		$partTree = [];
		foreach($allPart as $k=>$v)
		{
			if(empty($partTree[$v['parent_id']]))
				$partTree[$v['parent_id']] = [$v['id']];
			else
				$partTree[$v['parent_id']][] = $v['id'];
		}
		\view::set('req', $req);
		\view::set('allPart', $allPart);
		\view::set('style', $style);
		\view::set('partTree', $partTree);
		\view::put();
    }

	 /**
	  * @method 通过关键字查询小类
	  * @param  $word  string  [必填] 关键字
	  * @author soul
	  */
    function searchPart()
	{
		$req = \mvc::$req;
		$cate = new cate();
        $data = $cate->searchPart($req['word']);

		//指定产品线
		$rulecate = null;
		if(!empty($req['pcateid']))
		{
			$rulecate = [];
			foreach(explode(',', $req['pcateid']) as $id)
			{
				$rows = $cate->lrtree->getChilds($id);
				$rulecate = array_merge($rulecate, array_column($rows, 'id'));
			}
		}
		
		//是否有权限控制
		if(!empty($req['pwcode']))
		{
			$pwids = \p::cates($req['pwcode']);
			if($pwids != '' && !\p::isAdmin())
			{
				if($rulecate !== null)
					$rulecate = array_intersect($rulecate, explode(',', $pwids));
				else
					$rulecate = explode(',', $pwids);
			}
		}

		//是否有权限控制
		if($rulecate !== null)
		{
			foreach($data as $k=>$v)
			{
				if(!in_array($v['id'], $rulecate))
					unset($data[$k]);
			}
			$data = array_values($data);
		}

		$this->successJson($data);
    }
	
    public function getAllKeyValues($fields=null)
    {
		$req = \mvc::$req;
		$cate = new cate();
		$isBigCate = isset($req['isBigCate']) && $req['isBigCate'];
		$no_moreline = isset($req['no_moreline']) && $req['no_moreline'];
		$hascate = [];
		if($req['cfg']){
			$cfg = json_decode(base64_decode($req['cfg']),true);
			if($cfg){
				$hascate = $cate->getCatesByCfg($cfg);
			}
		}else{
			// 如果没有配置，则默认返回所有类别
			$hascate = $cate->getAllIds();
		}

		//是否有权限控制
		$pwids = !empty($req['pwcode'])? \p::cates($req['pwcode']): '';
		if($hascate){
			if($pwids){
				$pwids = implode(',',array_intersect($hascate,explode(',',$pwids)));
			}else{
				$pwids = implode(',',$hascate);
			}
		}

		if((isset($req['query']) && isset($req['limit'])) || $isBigCate)
		{
			$rows = $cate->searchPart($req['query'],$isBigCate,$req['limit'], $pwids,$req['pcate']);
		}else{

			$rows = $cate->searchPart('',false,999999, $pwids,$req['pcate']);
		}
        $data = [];
        $regi=0;
		$firstkey = isset($req['firstkey'])? $req['firstkey']: 0;
        if(isset($req['hasFirst']) && $req['hasFirst']){
            $data[$regi++] = ['key'=>$firstkey, 'value'=>'' ];
        }
		if(!$isBigCate && empty($req['query']) && $req['type'] == 'chk'){
			$data[$regi++] = ['key'=>'N', 'value'=>'N'];
			$data[$regi++] = ['key'=>'Y', 'value'=>'Y'];
		}
		//如果数据没有分类，就返回默认值
		if(!$hascate) $this->successJson($data);
        foreach($rows as $k=>$row){
            if($no_moreline){
                if($row['is_moreline']) continue;
            }
			if(isset($req['maxlevel']) && $row['level']>$req['maxlevel']) continue;
			
            $data[$k+$regi] = ['key'=>$row['id'], 'value'=> $row[cateName()] ];
        }
        $this->successJson($data);
    }

	/**
	  * @method 复制属性
	  * @param  $from_cate  int  [必填] 
	  * @param  $to_cate  string  [必填] 逗号分隔
	  * @param  $fileds  string  [必填] cat_model_fileds,cat_zhuyi...
	  * @author soul
	  */
    function copyFileds()
	{
		$req = \mvc::$req;
		$cate = new cate();
        $data = $cate->copyFileds($req['from_cate'], $req['to_cate'], $req['fileds']);
		$this->successJson($data);
    }

	/**
	  * @method 取二级产品线, 通过指定ID
	  * @param  $ids  string|array 
	  */
    function getBigCatesByIds($ids='')
	{
		$cate = new cate();
		if(is_string($ids)){
		    $ids = ($ids=='') ? [] : explode(',',$ids);
		}
        $data = $cate->getBigCatesByIds($ids);
		$this->successJson($data);
    }

	/**
	  * @method 取二级产品线, 通过指定ID
	  * @param  $cates string|array
	  */
    function getBigCatesByCates($cates='')
	{
		$cate = new cate();
		if(is_string($cates)){
		    $cates = ($cates=='') ? [] : explode(',',$cates);
		}
        $data = $cate->getBigCatesByCates($cates);
		$this->successJson($data);
    }
    
	/**
	  * @method 通过产品线,取所有小类
	  * @param  $cates  array 
	  */
    function getCatesByBigCates($ids)
	{
		$cate = new cate();
		if(is_string($ids)){
		    $ids = ($ids=='') ? [] : explode(',',$ids);
		}
        $data = $cate->getCatesByBigCates($ids);
		$this->successJson($data);
    }

	function selectUpperCates()
	{
		$req = \mvc::$req;
		$style = !empty($req['style']) && $req['style'] == 'anychk'? 'anychk': '';
        $cate = new cate();
        $allPart = $cate->lrtree->getChilds(0);
		$allPart = array_column($allPart, null, 'id');
		
		//指定产品线
		$rulecate = null;
		if(!empty($req['pcateid']))
		{
			$rulecate = [];
			foreach(explode(',', $req['pcateid']) as $id)
			{
				$rows = $cate->lrtree->getChilds($id);
				$rulecate = array_merge($rulecate, array_column($rows, 'id'));
			}
		}

		//排除的分类
		$exclude = $req['exid']?explode(',',$req['exid']) : [];
		//拼装零件树
		$partTree = [];
		foreach($allPart as $k=>$v)
		{	
			if($v['level']>2) continue;
			if($exclude && (in_array($v['parent_id'],$exclude) || in_array($v['id'],$exclude)))continue;
			if(empty($partTree[$v['parent_id']]))
				$partTree[$v['parent_id']] = [$v['id']];
			else
				$partTree[$v['parent_id']][] = $v['id'];
		}
		\view::set('req', $req);
		\view::set('allPart', $allPart);
		\view::set('style', $style);
		\view::set('partTree', $partTree);
		\view::put();
	}

	function formatParam()
	{
		$req = \mvc::$req;
		if(empty($req['param'])) $this->errorJson(-1,'参数错误');
		$param = json_decode($req['param'],true);
	
		$cate = new cate();
		$data = $cate->formatParam($req['id'],$param);
		$this->successJson($data);
	}
}