<?php

/**
 * +----------------------------------------------------------------------
 * | Created By PhpStorm
 * +----------------------------------------------------------------------
 * | DATE: 2021/8/4
 * +----------------------------------------------------------------------
 * | TIME: 14:46
 * +----------------------------------------------------------------------
 * | Author: YangXing(925032253@qq.com)
 * +----------------------------------------------------------------------
 * | Class: paramset
 * +----------------------------------------------------------------------
 */

namespace model\pro;


class paramset extends \model
{

    public $key = 'ptpa_id';

    private static $dataType = [
        'int' => '数字',
        'double' => '带小数位数字',
        'string' => '文本',
        'smalltxt' => '小备注',
        'bigtxt' => '大备注',
        'list' => '列表',
        'radio' => '单选',
        'checkbox' => '多选'
    ];

    /**
     * 有附表的
     * @var array
     */
    public static $isParamType = [
        'list' => '列表',
        'radio' => '单选',
        'checkbox' => '多选'
    ];


    /**
     * 表名
     * @var string
     */
    public $table = 'part_param';

    /**
     * @return array|void
     */
    public function getListByPcId($id)
    {
        $where = [
            'ptpa_cate_id' => $id,
            'ORDER' => ['ptpa_col_order']
        ];
        $list = $this->db->select($this->table,'*',$where);
        if(!empty($list) && is_array($list)){
            foreach ($list as &$value) {
                //是否可以查看附表
                $value['is_accessory'] = isset(self::$isParamType[$value['ptpa_type']]) ?: false;
                //更改名称
                $value['ptpa_type'] = self::$dataType[$value['ptpa_type']];
                foreach ($value as $k => $v)
                {
                    if($v === 0 || $v === '0.00' || empty($v) || is_null($v)){
                        $value[$k] = '';
                    }
                }
            }
        }
        return $list;
    }

    public function getNode($id)
    {
		$data = $this->db->get($this->table,'*',['ptpa_id' => $id]);
        if($data['ptpa_pid']){
            $rows = $this->db->select('part_param_sche', '*',['pps_ptpa_id' => $data['ptpa_pid']]);
        }elseif($id){
            $rows = $this->db->select('part_param_sche', '*',['pps_ptpa_id' => $id]);
        }
		
		if(!empty($rows))
		{
			$data['param_strenval'] = $rows;
		}
		
        return $data; 
    }

    /**
     * @param array|int|string $keys
     * @return bool|\PDOStatement
     */
    public function deleteRows($keys)
    {
        if(!is_array($keys)) $keys = explode(',',$keys);
        $join = [
            '[>]oe_param_val(opv)'=>['pp.ptpa_id'=>'ppv_ptpa_id'],
            '[>]oe_item(oi)'=>['opv.ppv_oe_id'=>'oe_id'],
            '[>]pro_param_val(ppv)'=>['pp.ptpa_id'=>'ppv_ptpa_id'],
            '[>]pro(p)'=>['ppv.ppv_p_id'=>'p_id'],
        ];
        $arr = $this->db->select('part_param(pp)',$join,['ptpa_id','ppv.ppv_p_id','opv.ppv_oe_id','oi.oe_oe','p.p_oe'],['ptpa_id'=>$keys]);

        $poeArr = array_unique(array_filter(array_column($arr,'p_oe')));
        $oeArr = array_unique(array_filter(array_column($arr,'oe_oe')));
     
        if($poeArr||$oeArr) exitJson('此参数已被商品'.($poeArr?'【'.implode(',',$poeArr).'】':'').'或者零件'.($oeArr?'【'.implode(',',$oeArr).'】':'').'引用,不可删除');
        $this->db->Begin();
        $this->db->delete('part_param_sche',['pps_ptpa_id' => $keys]);
        $this->db->delete($this->table,['ptpa_id' => $keys]);
        $this->db->end();
        return [];
    }

    /**
     * 添加
     * @param $data
     * @return false|\PDOStatement
     */
    public function add($data)
    {
		$this->db->Begin();
		if(isset($data['param_strenval']))
		{
			$strenval = $data['param_strenval'];
		}
        unset($data['param_strenval']);
		$res = $this->db->insert($this->table,$data);
		$id = $this->db->id();
		if(isset($strenval))
			$this->setPartParamSche($id, $strenval);
		$this->db->End();
        return $res;
    }

    /**
     * 更新
     * @param \stirng $id
     * @param mixed $data
     * @return false|\PDOStatement|void
     */
    public function set($id,$data)
    {
		if(isset($data['param_strenval']))
		{
			$ppsval = $data['param_strenval'];
			$this->setPartParamSche($id, $ppsval);
		}
        unset($data['param_strenval']);
        return $this->db->update($this->table,$data,['ptpa_id' => $id]);
    }

    /**
     * @param  [type] $ptpa_id
     * @param  [type] $data
     * @method 保存参数附加值
     * @author zhengweihua 
     * @copyright 2025-01-14
     */
    public function setPartParamSche($ptpa_id, $data)
    {
        $arr = [];

        $param = $this->db->get('part_param','*',['ptpa_id'=>$ptpa_id]);
        if($param['ptpa_pid']>0){
            $old = $this->db->select('part_param_sche','pps_id',['pps_ptpa_id'=>$param['ptpa_pid']]);
        }else{
            $old = $this->db->select('part_param_sche','pps_id',['pps_ptpa_id'=>$ptpa_id]);
        }
        $this->db->Begin();
       
        foreach ($data as $pps_id => $val) 
        {
            if(in_array($pps_id,$old))
            {
                $this->db->update('part_param_sche',$val,['pps_id'=>$pps_id]);
            }else{
                $val['pps_ptpa_id'] = $ptpa_id;
                $this->db->insert('part_param_sche',$val);
            }
            $arr[] = $pps_id;
        }
        
        $delArr = array_diff($old,$arr);
        if($delArr){
            $this->db->delete('part_param_sche',['pps_id'=>$delArr]);
        }
        $this->db->End();
    }

	public function setStrenval($id, $vals)
	{
		$tArr = explode("\n", strtr($vals, [";"=>"\n","；"=>"\n","\r\n"=>"\n", "："=>':']));
		$this->db->Begin();
		$hasArr = $this->db->select("pro_param_strenval", 'ppsl_cn_name', ["ppsl_ptpa_id"=>$id]);
		$newArr = [];
		foreach($tArr as $row)
		{
			$x = explode(":", $row);
			$x[0] = trim($x[0]);
			$x[1] = trim($x[1]);
			if(!empty($x[0]) && !empty($x[1]))
			{
				$newArr[$x[0]] = $x[1];
			}
		}
		foreach($newArr as $cn=>$en)
		{
			if(!in_array($cn, $hasArr))
			{
				$this->db->insert('pro_param_strenval', ['ppsl_ptpa_id'=>$id, 'ppsl_cn_name'=>$cn, 'ppsl_en_name'=>$en]);
			}
			else
			{
				$this->db->update('pro_param_strenval', ['ppsl_en_name'=>$en], ['ppsl_ptpa_id'=>$id, 'ppsl_cn_name'=>$cn]);
			}
		}
		$delArr = array_diff($hasArr, array_keys($newArr));
		if(!empty($delArr))
			$this->db->delete('pro_param_strenval', ['ppsl_ptpa_id'=>$id, 'ppsl_cn_name'=>$delArr]);
		$this->db->End();
		return true;
	}

    /**
     * @param $key
     * @param string $where
     * @param int $page
     * @param int $pagesize
     * @param string $sidx
     * @param string $sord
     * @param string $orderby
     * @return array
     */
    public function scheduleList($key, $where='',$page=0,$pagesize=0,$sidx='',$sord='asc',$orderby='')
    {
        $fields = '*';
        $where = $this->filter2medoo($where);
        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
        $where['pps_ptpa_id'] = $key;
        if($page>0 && $pagesize>0){
            $pages = $this->paging('part_param_sche',$where,$page,$pagesize);
            $where["LIMIT"] = [$pages['limit'],$pagesize];
        }
        $rows = $this->db->select('part_param_sche',$fields,$where);

        $data = [
            'page'=> $page,
            'total'=> $pages['total'],
            'records' => $pages['records'],
            'rows' => $rows
        ];
        return $data;
    }

    /**
     * @param $key
     * @return false|\PDOStatement
     */
    public function scheduleAddRow($key)
    {
        $data = [
            'pps_ptpa_id' => $key,
            //'opuser' => $this->getOpuser(),
            //'create_time' => $this->getDateTime(),
            //'update_time' => $this->getOpuser(),
        ];
        return $this->db->insert('part_param_sche',$data);
    }

    /**
     * @param $keys
     * @return false|\PDOStatement
     */
    public function scheduleDeleteRows($keys)
    {
        if(!is_array($keys)) $keys = explode(',',$keys);
        return $this->db->delete('part_param_sche',['pps_id'=>$keys]);
    }

    /**
     * @param $key
     * @param $field
     * @param $value
     * @return array|false|\PDOStatement
     */
    public function setValues($key,$field,$value)
    {
        return $this->db->update('part_param_sche',[$field => $value],[ 'pps_id' => $key]);
    }

    /**
     * @method 获取公共参数
     * @author zhengweihua 
     * @copyright 2025-01-14
     */
    public function getCommonParam($cate_id)
    {   
       

        $join = [
            '[><]part_param_sche(pps)'=>['p.ptpa_id'=>'pps_ptpa_id']
        ];
        $where = ['ptpa_cate_id'=>0,'GROUP'=>'ptpa_id'];
        $exits = [];
        //已存在的不显示
        if($cate_id){
            $exits = $this->db->select('part_param','ptpa_pid',['ptpa_cate_id'=>$cate_id,'ptpa_pid[>]'=>0]);
            if($exits){
                $where = ['ptpa_cate_id'=>0,'GROUP'=>'ptpa_id','ptpa_id[!]'=>$exits];
            }
            
        }
        if(LG_NAME!='cn_name')
        {   
            $str =  "IF(pps.".LG_NAME." IS NULL OR pps.".LG_NAME." = '', pps.cn_name, pps.".LG_NAME.")";
        }else{  
            $str =  "pps.".LG_NAME;
        }
        
        $raws = $this->db->select("part_param(p)",$join,['p.*','vals'=>raw(sprintf("GROUP_CONCAT(%s)",$str))],$where);
        
        return $raws;
    }

    /**
     * @method 引用公共参数
     * @author zhengweihua 
     * @copyright 2025-01-14
     */
    public function copyCommonParam($cate_id,$ptpa_ids)
    {
        if(!$ptpa_ids||!$cate_id) return exitJson(-1,'参数错误');
        if(!is_array($ptpa_ids)){
            $ptpa_ids = [$ptpa_ids];
        }
        //公共参数
        $rawArr = $this->db->select('part_param','*',['ptpa_id'=>$ptpa_ids,'ptpa_cate_id'=>0]);

        foreach ($rawArr as $raw) 
        {
            $ptpa_id = $raw['ptpa_id'];
            $copy_ptpa_id = $this->db->get('part_param','ptpa_id',['ptpa_cate_id'=>$cate_id,'ptpa_pid'=>$ptpa_id]);
            //是否已引用
            if(!$copy_ptpa_id){
                $raw['ptpa_cate_id'] = $cate_id;
                $raw['ptpa_pid'] = $raw['ptpa_id'];
                $raw['create_time'] = $raw['update_time'] = getNowTime();
                unset($raw['ptpa_id']);
                $this->db->insert('part_param',$raw);
                $copy_ptpa_id = $this->db->id();
            }
        }

        return [];
    }
}