<?php
namespace model\pro;

class rule extends \model
{
    
    public function getListCate()
    {   
        $join = [
            '[>]pro_cate(pcate)'=>['cate.parent_id'=>'id'],
        ];
        $where = [];
        // $where['cate.right'] = raw('`cate`.`left`+1');
        $allcate = $this->db->select('pro_cate(cate)',$join,['cate.id','cate.'.LG_NAME.'(name)','pcate.'.LG_NAME.'(pcate_name)'], $where);

        $arr = [];
        $join = [
            '[><]pro_brand(pb)'=>['prl_pb_id'=>'pb_id'],
        ];
        $linkarr = $this->db->select('pro_rule_link',$join,['prl_id','prl_pb_id','prl_val_id','prl_code_a','prl_code_b'],['prl_type'=>'cate']);
        foreach ($linkarr as $key => $val) {
            $arr[$val['prl_val_id']][$val['prl_pb_id']] = $val;
        }

        foreach ($allcate as $key => $val) 
        {   
            $allcate[$key]['pbArr'] = [];
            if($arr[$val['id']]){
                $allcate[$key]['pbArr'] = $arr[$val['id']];
            }
        }
        return $allcate;
    }


    public function saveData($params)
    {
        $old = $this->db->select('pro_rule_link','*',['prl_type'=>$params['type']]);
        $oldArr = array_column($old,'prl_id');
        $newArr = [];
       
        $this->db->Begin();
        foreach ($params['rule'] as $key => $val) 
        {
            foreach ($val as $k => $v) 
            {
                if(!$v['prl_id'])
                {
                    $this->db->insert('pro_rule_link',[
                        'prl_type'=>$params['type'],
                        'prl_val_id'=>$key,
                        'prl_pb_id'=>$k,
                        'prl_code_a'=>$v['prl_code_a'],
                        'prl_code_b'=>$v['prl_code_b']??'',
                        'prl_opuser'=>getOpuser(),
                        'prl_create_time'=>getNowTime(),
                        'prl_update_time'=>getNowTime(),
                    ]);
                }
                elseif($v['prl_id'])
                {
                    $newArr[] = $v['prl_id'];

                    $this->db->update('pro_rule_link',[
                        'prl_code_a'=>$v['prl_code_a'],
                        'prl_code_b'=>$v['prl_code_b']??'',
                        'prl_update_time'=>getNowTime(),
                    ],[
                        'prl_id'=>$v['prl_id']
                    ]);
                }
            }
        }
        $delArr = array_diff($oldArr,$newArr);
        if($delArr){
            $this->db->delete('pro_rule_link',['prl_id'=>$delArr]);
        }
        $this->db->End();
        return [];
    }


    public function export($params)
    {
        $header = [['title'=>'名称','width'=>'20']];

        $pro = new pro();
       
        $name = $params['type']=='cate' ? '小类编码' : '汽车品牌编码';
        if($params['type']=='cate')
        {
            $pbArr = $pro->getProBrand(['pb_id'=>1]);
            foreach ($pbArr as $val) {
                $header[] = ['title'=>$val['pb_name'],'width'=>'25'];
            }

            $alldata = $this->getListCate();
        }
        elseif ($params['type']=='brand') 
        {   
            $pbArr = $pro->getProBrand(['pb_id'=>1]);
            foreach ($pbArr as $val) {
                $header[] = ['title'=>$val['pb_name'],'width'=>'25'];
                // $header[] = ['title'=>$val['pb_name'].'半成品编码','width'=>'25'];
            }
            $alldata = $this->getListBrand();
        }
        // 创建一个新的 Spreadsheet 对象
		$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
		$sheet = $spreadsheet->getActiveSheet();

		// 设置标题
		$row = 1;
        $col = 'A';
		foreach ($header as $vv) {
            if(!$vv){
                $col++;
                continue;
            } 
            if(is_array($vv)){
                if($vv['isMerge']){
                    $sheet->mergeCells(sprintf("%s:%s",$vv['scell'],$vv['ecell'])); // 合并单元格
                }
                if(!empty($vv['width']))
                    $sheet->getColumnDimension($col)->setWidth($vv['width']);

                $sheet->setCellValue($vv['scell']??$col.$row, $vv['title']); 

                $cell = $vv['isMerge']?sprintf("%s:%s",$vv['scell'],$vv['ecell']):$col.$row;
                $style = $sheet->getStyle($cell);

                if($vv['color']){
                    $style->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB($vv['color']);
                    $styleArray = [
                        'borders' => [
                            'allBorders' => [
                                'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
                                'color' => ['argb' => 'FF000000'], // 黑色边框
                            ],
                        ],
                    ];
                    $style->applyFromArray($styleArray);
                } 
            }else{
                $sheet->setCellValue($col.$row, $vv);
                $style = $sheet->getStyle($col.$row);  
            }
            $style->getAlignment()->setHorizontal('center');  
            $style->getAlignment()->setVertical('center');  
            $col++;
		}
        $row++;


        foreach ($alldata as $key => $val) 
        {   
            $col = 'A';
            $sheet->setCellValue($col.$row, $val['name']); 
			$style = $sheet->getStyle($col.$row); 
            foreach ($pbArr as $key => $vv) 
            {   
                $col++;
                $sheet->setCellValue($col.$row, $val['pbArr'][$vv['pb_id']]['prl_code_a']??''); 
                if($params['type']=='brand'){
                    $col++;
                    $sheet->setCellValue($col.$row, $val['pbArr'][$vv['pb_id']]['prl_code_b']??''); 
                }
				$style = $sheet->getStyle($col.$row); 
            }
            $style->getAlignment()->setHorizontal('center');  
			$style->getAlignment()->setVertical('center');
            $row++;
        }

        $dateTime = getNowTime();
        $filename = sprintf('%s%s',$name,$dateTime).'.xlsx';
        $objWriter = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
        ob_clean();
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="'.$filename.'"');
        header('Cache-Control: max-age=0');
        $objWriter->save("php://output"); 
    }

    /**
     * @method 汽车品牌编码
     * @author zhengweihua 
     * @copyright 2025-03-11
     */
    public function getListBrand()
    {
        $arr = [];
        $join = [
            '[><]pro_brand(pb)'=>['prl_pb_id'=>'pb_id'],
        ];
        $linkarr = $this->db->select('pro_rule_link',$join,['prl_id','prl_pb_id','prl_val_id','prl_code_a','prl_code_b'],['prl_type'=>'brand']);
        foreach ($linkarr as $key => $val) {
            $arr[$val['prl_val_id']][$val['prl_pb_id']] = $val;
        }
        
        $allbrand = $this->db->select('tag_brand',['tb_id','tb_'.LG_NAME.'(name)'],['ORDER'=>raw('tb_seq,CONVERT(tb_'.LG_NAME.' USING gbk)')]);

        foreach ($allbrand as $key => $val) 
        {   
            $allbrand[$key]['pbArr'] = [];
            if($arr[$val['tb_id']]){
                $allbrand[$key]['pbArr'] = $arr[$val['tb_id']];
            }
        }
        return $allbrand;
    }

    /**
     * @param  int $id
     * @method 通过分类ID获取编码规则
     * @author zhengweihua 
     * @copyright 2025-03-13
     */
    public function getCateRuleById($id,$where  = [])
    {   
        $where =  array_merge(['prl_type'=>'cate','prl_val_id'=>$id],$where);
        $data = $this->db->select('pro_rule_link',['prl_pb_id','prl_val_id','prl_code_a'],$where);
        $arr = [];
        foreach ($data as $key => $val) {
            $arr[$val['prl_pb_id']]['prl_code_a'] = $val['prl_code_a'];
        }

        return $arr;
    }

    /**
     * @param  int $id
     * @param  Array $rule
     * @method 保存指定规则
     * @author zhengweihua 
     * @copyright 2025-03-13
     */
    public function saveCateRuleById($id,$rule,$type = 'cate')
    {
        if (!$id) return [];
        foreach ($rule as $pbid => $val) 
        {   
            $exits =  $this->db->get('pro_rule_link', 'prl_id', ['prl_type' => $type, 'prl_val_id' => $id, 'prl_pb_id' => $pbid]);
            if ($exits) 
            {
                $updata = [
                    'prl_code_a' => $val['prl_code_a'],
                    'prl_code_b' => $val['prl_code_b']??'',
                    'prl_opuser'=>getOpuser(),
                    'prl_update_time'=>getNowTime()
                ];
                $this->db->update('pro_rule_link', $updata, ['prl_type' => $type, 'prl_val_id' => $id, 'prl_pb_id' => $pbid]);
            } 
            else
            {
                if(!$val['prl_code_a'] && !$val['prl_code_b']) continue;
                $this->db->insert('pro_rule_link', [
                    'prl_type' => $type,
                    'prl_val_id' => $id,
                    'prl_pb_id' => $pbid,
                    'prl_code_a' => $val['prl_code_a'],
                    'prl_code_b' => $val['prl_code_b']??'',
                    'prl_opuser'=>getOpuser(),
                    'prl_create_time'=>getNowTime(),
                    'prl_update_time'=>getNowTime()
                ]);
            }
        }
        return [];
    }
}
