<?php
namespace model;
use \model\pro\cate;
use \model\pro\factory;
use \model\pro\param;
use \model\pro\paramset;
use \model\pro\pro;
use \model\carmodel;
use \model\tags;
use \model\check;
use \model\pro\numidx;
use \model\pro\promodel;
use \model\collocation;
use \model\files;
use \model\work;
class initOldData extends \model
{
	public function __construct()
    {
		parent::__construct();


	}
	
	//初始化小类、商品品牌、编码
	public function initBase()
	{
		set_time_limit(3600*24);
		$acts = ['cate', 'catetcd', 'probrand', 'modelbrand', 'rulecode'];
		//$acts = ['catetcd'];
		$this->db->Begin();
		$datetime = getNowTime();
		foreach($acts as $act){
			if($act == 'cate'){//小类
				$sqlArr = [
					"TRUNCATE TABLE `pro_cate`",
					"INSERT INTO `pro_cate`(id, parent_id, cn_name, en_name, py_name, keyword, cat_from_id, cat_item_type, cat_opuser, create_time, update_time) 
					SELECT product_type_id, pid, l_name_zh,l_name_en, l_name_ru, keyword, product_type_id, 101, 'SYS', 
					CASE WHEN create_date > 0 THEN FROM_UNIXTIME(create_date, '%Y-%m-%d %H:%i:%s') ELSE '{$datetime}' END, 
					CASE WHEN edit_date > 0 THEN FROM_UNIXTIME(edit_date, '%Y-%m-%d %H:%i:%s') ELSE '{$datetime}' END 
					FROM `frey_org`.`cd_product_type`",
				];
				foreach($sqlArr as $sql){
					$this->db->query($sql);
				}
				$cate = new cate();
				$cate->lrtree->restructure();
			}else if($act == 'catetcd'){//商品品牌
				//分类对应tcd名称
				$vv[0] = trim($vv[0]);
				$excel = new \model\excel();
				$file = \mvc::$cfg['dir']['files'].'/cateTotcd.xlsx';
				if(!file_exists($file)) dd('缺失小类对应TCD的关系：1列+3列'.$file);
				$exrows = $excel->readOnly($file);
				$linkArr = [];
				foreach($exrows as $kk=>$vv){
					if($kk === 0) continue;
					$tnams = [];
					foreach(explode("\n", $vv[2]) as $vvv){
						if(preg_match('/(.*)\[(\d+)\]/', $vvv, $match)){
							$tnams[] = trim($match[1]);
						}else if($vvv){
							$tnams[] = trim($vvv);
						}
					}
					if($linkArr[$vv[0]]){
						$linkArr[$vv[0]] = array_merge($linkArr[$vv[0]], array_unique($tnams));
					}else{
						$linkArr[$vv[0]] = array_unique($tnams);
					}
				}
				foreach($linkArr as $cv=>$tvs){
					if($tvs){
						$this->db->update('pro_cate', ['tcd_name'=>';'.implode(";", $tvs).';'], ['cn_name'=>$cv]);
					}
				}
			}else if($act == 'probrand'){//商品品牌
				$sqlArr = [
					"TRUNCATE TABLE `pro_brand`",
					"INSERT INTO `pro_brand`(pb_id, pb_cn_name, pb_en_name, pb_py_name, pb_code_rule, pb_rules, pb_from_id, pb_opuser, pb_create_time, pb_update_time) SELECT CASE WHEN brand_id = 8 THEN 1  WHEN brand_id = 1 THEN 7 ELSE brand_id END pb_id, l_name_zh, l_name_en, l_name_ru, frey_no, CASE WHEN brand_id = 58 THEN 'M@B@C@S' ELSE 'M@C@S@B' END pb_rules, brand_id, 'SYS', '{$datetime}', '{$datetime}' FROM `frey_org`.`cd_brand`",
					"update `pro_brand` set pb_cn_name = 'FGIO', pb_en_name = 'FGIO', pb_py_name = 'FGIO', pb_code_rule='01' where pb_id =1",
					"TRUNCATE TABLE `cd_make`",
					"INSERT INTO `cd_make`(cm_id, cm_cn_name, cm_en_name, cm_py_name, cm_seq, cm_from_id, cm_opuser, cm_create_time, cm_update_time) SELECT make_id, l_name_zh, l_name_en, l_name_ru, seq, make_id, 'SYS', '{$datetime}', '{$datetime}' FROM `frey_org`.`cd_make`",
				];
				foreach($sqlArr as $sql){
					$this->db->query($sql);
				}
			}else if($act == 'modelbrand'){//汽车品牌
				$sql = sprintf("SELECT * FROM `frey_org`.`cd_make` order by seq, make_id");
				$rows = $this->db->query($sql)->fetchAll(\PDO::FETCH_ASSOC);
				$oldArr = array_column($rows, null, 'make_id');
				$newArr = [];
				//顶级
				foreach($oldArr as $row){
					if(empty($row['pid']) || empty($oldArr[$row['pid']])){
						$tb_words = strlen($row['l_name_zh']) < 3? $row['l_name_zh']: '%'.$row['l_name_zh'].'%';
						if($row['l_name_en'] && ($row['l_name_zh'] != $row['l_name_en'])){
							$tb_words .= strlen($row['l_name_en']) < 3? ','.$row['l_name_en']: ',%'.$row['l_name_en'].'%';
						}
						$newArr[$row['make_id']] = [
							'tb_cn_name'=>$row['l_name_zh'],
							'tb_en_name'=>$row['l_name_en'],
							'tb_py_name'=>$row['l_name_ru'],
							'tb_seq'=>$row['seq'],
							'tb_words'=>$tb_words,
							'tb_opuser'=>'SYS',
							'tb_create_time'=>$datetime,
							'tb_update_time'=>$datetime,
							'tb_from_ids'=>$row['make_id'],
						];
					}
				}
				//子级
				foreach($oldArr as $row){
					if(!empty($oldArr[$row['pid']])){
						$newArr[$row['pid']]['tb_from_ids'] .= ','.$row['make_id'];
					}
				}
				$this->db->query('TRUNCATE TABLE tag_brand');
				$this->db->query('TRUNCATE TABLE tag_brand_cnbrand');
				$this->db->query('TRUNCATE TABLE tag_brand_make');
				$this->db->query('TRUNCATE TABLE oe_tag_brand');
				$this->db->query('TRUNCATE TABLE pro_tag_brand');
				$this->db->insert('tag_brand', array_values($newArr));
				make(\model\sys::class)->formatTagBrand();
				make(\model\pro\pro::class)->initTagBrand([]);
				make(\model\oe::class)->initTagBrand([]);
			}else if($act == 'rulecode'){//编码
				//商品品牌对应的编码字段
				//小类编码
				$cateCode = [
					'FGIO'=>'scm_no',	
					/*'菲尔'=>'frey_no',	
					'CNAB'=>'cnab_no',
					'EFLLER'=>'frey_no',	
					'LCIVCHT'=>'frey_no',	
					'TFJCTAR'=>'frey_no',	
					'ATHOS'=>'frey_no',	
					'SO'=>'frey_no',	
					'NIBD'=>'nibd_no',	
					'凯世曼'=>'bc_no',
					'拓德'=>'bc_no',
					'马牌'=>'nibd_no',*/
				];
				$brandArr = $this->db->select('pro_brand', ['pb_id', 'pb_cn_name', 'pb_from_id']);
				foreach($brandArr as $k=>$v){
					$v['cat_field'] = $cateCode[$v['pb_cn_name']]? $cateCode[$v['pb_cn_name']]: '';
					$brandArr[$k] = $v;
				}
				
				$sql = "SELECT id cat_id,scm_no, frey_no, nibd_no, cnab_no, bc_no FROM `pro_cate` n JOIN `frey_org`.`cd_product_type` o ON n.cat_from_id = o.product_type_id";
				$rows = $this->db->query($sql)->fetchAll(\PDO::FETCH_ASSOC);
				$linkArr = [];
				foreach($rows as $row){
					foreach($brandArr as $vv){
						if($vv['cat_field'] && $row[$vv['cat_field']]){
							$code = trim($row[$vv['cat_field']]);
							$linkArr[$vv['pb_id'].'@'.$row['cat_id']] = [
								'prl_type'=>'cate',
								'prl_pb_id'=>$vv['pb_id'],
								'prl_val_id'=>$row['cat_id'],
								'prl_code_a'=>$code,
								'prl_opuser'=>'SYS',
								'prl_create_time'=>$datetime,
								'prl_update_time'=>$datetime,
							];
						}
					}
				}
				$this->db->delete('pro_rule_link', ['prl_type'=>'cate']);
				$this->db->insert('pro_rule_link', array_values($linkArr));
				

				//汽车品牌编码
				$linkArr = [];
				$modBrand = $this->db->select('tag_brand', '*');

				//菲尔科技
				$sql = sprintf("SELECT * FROM `frey_org`.`cd_make`");
				$rows = $this->db->query($sql)->fetchAll(\PDO::FETCH_ASSOC);
				$oldArr = array_column($rows, null, 'make_id');
				$pb_id = 1;
				foreach($modBrand as $row){
					foreach(explode(',', $row['tb_from_ids']) as $from_id){
						if($oldArr[$from_id] && ($oldArr[$from_id]['code'] || $oldArr[$from_id]['semi_code'])){
							$linkArr[$pb_id.'@'.$row['tb_id']] = [
								'prl_type'=>'brand',
								'prl_pb_id'=>$pb_id,
								'prl_val_id'=>$row['tb_id'],
								'prl_code_a'=>$oldArr[$from_id]['code']? trim($oldArr[$from_id]['code']): '',
								'prl_code_b'=>$oldArr[$from_id]['semi_code']? trim($oldArr[$from_id]['semi_code']): '',
								'prl_opuser'=>'SYS',
								'prl_create_time'=>$datetime,
								'prl_update_time'=>$datetime,
							];
						}
					}
				}

				//其他品牌.....

				$this->db->delete('pro_rule_link', ['prl_type'=>'brand']);
				$this->db->insert('pro_rule_link', array_values($linkArr));
			}
		}

		$this->db->End();
		return [];
	}

	//初始化商品数据（含数据单）
	function initProByExcel($file){
		$excel = new \model\excel();

		//名称对应的字段
		$nanemToField = [
			'product_id'=>'p_id',
			'OE'=>'p_oe',
			'去除后缀OE'=>'oe2',
			'去除后缀OE2'=>'oe3',
			'物料编码'=>'p_innum',
			'集团编码'=>'p_comnum',
			'产品名称'=>'p_cn_name',
			'产品英文名称'=>'p_en_name',
			'产品俄文名称'=>'p_py_name',
			'产品西语名称'=>'p_sp_name',
			'物料类型'=>'p_item_type',
			'产品所属类别'=>'p_cate',
			//'汽车品牌'=>'p_tb_id',
			'所属车型品牌'=>'p_cm_id',
			//'品牌'=>'p_pb_id',
			'基本单位'=>'p_unit',
			'车型'=>'p_model_cn_name',
			'车型（英文）'=>'p_model_en_name',
			'车型（俄文）'=>'p_model_py_name',
			'车型（西语）'=>'p_model_sp_name',
			'底盘'=>'p_chassis',
			'发动机'=>'p_engine',
			'年限'=>'p_model_year',
			'排量'=>'p_cc',
			'燃油类型'=>'p_fuel_type',
			'产品特性'=>'p_features',
			'是否内部研发'=>'p_isdevelop',
			'开发号'=>'develop_no',
			'固定货源地'=>'source_pc',
			'创建时间'=>'create_time',
		];

		$cids = [
			'p_item_type'=>1,
			'p_unit'=>2,
			'p_material'=>16,
			'p_fuel_type'=>5,
			'p_develop_status'=>17
		];
		$collArr = [];
		foreach($cids as $k=>$v){
			$rows = $this->db->select('object', ['o_id', 'cn_name'], ['o_parent_id'=>$v]);
			$collArr[$k] = array_column($rows, 'o_id', 'cn_name');
		}

		$rows = $this->db->select('pro_cate', ['id', 'cn_name']);
		$catArr = array_column($rows, 'id', 'cn_name');
		$catKvArr = array_column($rows, 'cn_name', 'id');
		
		//汽车品牌
		$rows = $this->db->select('tag_brand', ['tb_id', 'tb_cn_name', 'tb_from_ids']);
		$tbArr = [];
		$tbFArr = [];//来源ID对应
		foreach($rows as $v){
			$tbArr[$v['tb_cn_name']] = $v['tb_id'];
			foreach(explode(',', $v['tb_from_ids']) as $vv){
				$tbFArr[$vv] = $v['tb_id'];
			}
		}

		//所属车型品牌
		$rows = $this->db->select('cd_make', ['cm_id', 'cm_cn_name', 'cm_from_id']);
		$cmArr = array_column($rows, 'cm_id', 'cm_cn_name');
		$cmFArr = array_column($rows, 'cm_from_id', 'cm_cn_name');
		
		$cacheArr = [];

		//转数组
		$exrows = $excel->readOnly($file);
		$colKV = [];
		foreach($exrows[0] as $k=>$v){
			if(isset($nanemToField[$v])) $colKV[$k] = $nanemToField[$v];
		}
		unset($exrows[0]);
		$initArr = [];
		$this->db->query("TRUNCATE TABLE ztemp_init");
		foreach($exrows as $row){
			$prow = [];
			foreach($row as $kk=>$val){
				if(!isset($colKV[$kk])) continue;
				$field = $colKV[$kk];
				switch($field){
					case 'p_cate': 
						if($val == '') $val = '固定资产';
						if(!empty($catArr[$val])){
							$prow[$field] = $catArr[$val];
							$prow['cat_name'] = $val; 
						}else{
							dd($row, $field.'=>'.$val.'#匹配失败');
						}
					break;
					case 'p_tb_id': 
						if(!empty($tbArr[$val])){
							$prow[$field] = $tbArr[$val];
						}else if($tbFArr[$cmFArr[$val]]) {
							$prow[$field] = $tbFArr[$cmFArr[$val]];
						}else{
							dd($row, $field.'=>'.$val.'#匹配失败');
						}
					break;
					case 'p_cm_id': 
						if(!empty($cmArr[$val])){
							$prow[$field] = $cmArr[$val];
						}else if($val){
							dd($row, $field.'=>'.$val.'#匹配失败');
						}
					break;
					case 'p_isdevelop': $prow[$field] = $val == '是'? 1: 0; break;
					case 'p_item_type': 
					case 'p_unit': 
					case 'p_fuel_type': 
						if($val != ''){
							if(isset($collArr[$field][$val])){
								$prow[$field] = $collArr[$field][$val];
							}else{
								dd($row, $field.'=>'.$val.'#匹配失败');
							}
						}else{
							$prow[$field] = 0;
						}
					break;
					case 'source_pc': 
						if($val != ''){
							if(stripos($val, '广州') !== false){
								$prow['p_source_province_id'] = 19;
								$prow['p_source_city_id'] = 1901;
							}else if(stripos($val, '新疆') !== false){
								$prow['p_source_province_id'] = 31;
								$prow['p_source_city_id'] = 0;
							}else{
								dd($row, $field.'=>'.$val.'#匹配失败');
							}
						}else{
							$prow['p_source_province_id'] = 0;
							$prow['p_source_city_id'] = 0;
						}
					break;
					default:
						$prow[$field] = $val;
					break;
				}
			}
			if($prow['p_id']) $prow['p_from_id'] = $prow['p_id'];
			$initArr[] = ['z_data'=>json_encode($prow, JSON_UNESCAPED_UNICODE)];
			if(count($initArr) == 100){
				$this->db->insert('ztemp_init', $initArr);
				$initArr = [];
			}
		}
		if($initArr) $this->db->insert('ztemp_init', $initArr);
		return [];
	}
	
	//缓存入库
	function initProToDB($count = 10000){
		$pro = new pro();
		$work = new work();
		$datetime = getNowTime();
		$wdi_from = 1116;
		//按类别入库
		$okArr = []; $noArr = [];
		if(empty($count)) $count = 10000;
		for($i = $count; $i > 0; $i--){
			$sql = "SELECT * FROM ztemp_init where z_status =0 order by rand() limit 1";
			//$sql = "SELECT * FROM ztemp_init where z_status =0 limit 1";
			$zrow = $this->db->query($sql)->fetch(\PDO::FETCH_ASSOC);
			if(empty($zrow)) break;
			$prow = json_decode($zrow['z_data'], true);
			try {
				$haspro = $this->db->get('pro', 'p_id', ['p_from_id'=>$prow['p_from_id']]);
				
				$this->db->Begin();
				$prow['p_comnum_format'] = formatNum($prow['p_comnum']);
				$prow['p_innum_format'] = formatNum($prow['p_innum']);
				$prow['p_oe_format'] = formatNum($prow['p_oe']);
				$prow['oe2_format'] = formatNum($prow['oe2']);
				$prow['oe3_format'] = formatNum($prow['oe3']);
				$prow['p_seqno'] = substr($prow['p_comnum'], 6, 3);
				if(empty($prow['p_comnum_format']) || empty($prow['p_oe']) || 
					$prow['p_comnum_format'] != $prow['p_innum_format']
				){
					$this->db->rollBack();
					$noArr[] = ['p_id'=>$prow['p_id'], 'p_innum'=>$prow['p_innum']];
					$this->db->update('ztemp_init', ['z_status'=>-1], ['z_id'=>$zrow['z_id']]);
					continue;
				}
				
				$create_time = $datetime;
				if($prow['create_time']) $create_time = date('Y-m-d H:i:s', strtotime($prow['create_time']));

				$prow['p_pf_id'] = 1;
				$prow['p_pb_id'] = 1;
				$prow['p_opuser'] = 'SYS';
				$prow['p_update_time'] = $datetime;
				$add = array_filter($prow, function ($key) {
					return strpos($key, 'p_') === 0;
				}, ARRAY_FILTER_USE_KEY);

				if($haspro){//更新
					$this->db->update('pro', $add, ['p_id'=>$haspro]);
					$p_id = $haspro;
				}else{//新增
					$add['p_create_time'] = $create_time;
					$this->db->insert('pro', $add);
					$p_id = $this->db->id();
					if(empty($p_id)){
						$this->db->rollBack();
						dump('导入失败', $prow);
						continue;
					}
				}
				$okArr[] = ['p_id'=>$p_id, 'p_innum'=>$prow['p_innum']];
				$add = array_filter($prow, function ($key) {
					return strpos($key, 'pe_') === 0;
				}, ARRAY_FILTER_USE_KEY);
				$add['pe_opuser'] = 'SYS';
				$add['pe_update_time'] = $datetime;
				if($haspro){//更新
					$this->db->update('pro_ext', $add, ['pe_p_id'=>$p_id]);
				}else{
					$add['pe_p_id'] = $p_id;
					$add['pe_create_time'] = $create_time;
					$this->db->insert('pro_ext', $add);
				}
				
				//开发号
				if($haspro) $this->db->delete('pro_developno', ['pde_p_id'=>$p_id]);
				
				if(!empty($prow['develop_no'])){
					$this->db->insert('pro_developno', ['pde_p_id'=>$p_id, 'pde_number'=>$prow['develop_no'], 'pde_format'=>formatNum($prow['develop_no'])]);
				}

				//号码表
				$addNums = [
					[
						'pn_p_id'=>$p_id,
						'pn_is_sys'=>1,
						'pn_pf_id'=>3,
						'pn_number'=>$prow['p_innum'],
						'pn_formart'=>$prow['p_innum_format'],
						'pn_ismain'=>0,
						'opuser'=>'SYS',
						'create_time'=>$datetime,
						'update_time'=>$datetime
					],
					[
						'pn_p_id'=>$p_id,
						'pn_is_sys'=>1,
						'pn_pf_id'=>2,
						'pn_number'=>$prow['p_comnum'],
						'pn_formart'=>$prow['p_comnum_format'],
						'pn_ismain'=>0,
						'opuser'=>'SYS',
						'create_time'=>$datetime,
						'update_time'=>$datetime
					]
				];

				if($prow['p_oe_format']){
					$addNums[] = [
						'pn_p_id'=>$p_id,
						'pn_is_sys'=>0,
						'pn_pf_id'=>1,
						'pn_number'=>$prow['p_oe'],
						'pn_formart'=>$prow['p_oe_format'],
						'pn_ismain'=>1,
						'opuser'=>'SYS',
						'create_time'=>$datetime,
						'update_time'=>$datetime
					];
				}
				
				if($prow['oe2_format'] && $prow['p_oe_format'] != $prow['oe2_format']){
					$addNums[] = [
						'pn_p_id'=>$p_id,
						'pn_is_sys'=>0,
						'pn_pf_id'=>1,
						'pn_number'=>$prow['oe2'],
						'pn_formart'=>$prow['oe2_format'],
						'pn_ismain'=>0,
						'opuser'=>'SYS',
						'create_time'=>$datetime,
						'update_time'=>$datetime
					];
				}

				if($prow['oe3_format'] && $prow['p_oe_format'] != $prow['oe3_format'] && $prow['oe2_format'] != $prow['oe3_format']){
					$addNums[] = [
						'pn_p_id'=>$p_id,
						'pn_is_sys'=>0,
						'pn_pf_id'=>1,
						'pn_number'=>$prow['oe3'],
						'pn_formart'=>$prow['oe3_format'],
						'pn_ismain'=>0,
						'opuser'=>'SYS',
						'create_time'=>$datetime,
						'update_time'=>$datetime
					];
				}

				if($haspro){//更新
					foreach($addNums as $key=>$add){
						$uniwhere = [
							'pn_p_id'=>$add['pn_p_id'],
							'pn_is_sys'=>$add['pn_is_sys'],
							'pn_pf_id'=>$add['pn_pf_id'],	
							'pn_formart'=>$add['pn_formart']
						];
						$exists = $this->db->get('pro_numidx', 'pn_id', $uniwhere);
						if($exists) unset($addNums[$key]);
					}
					$addNums = array_values($addNums);
				}
				if($addNums) $this->db->insert('pro_numidx', $addNums);
				if(!$haspro){//数据单、零件库、清洗
					$wdlist_title = $prow['cat_name'].'[初始化]';
					$wdlist_id = $this->db->get('work_data_list', 'wdlist_id', ['wdlist_title'=>$wdlist_title]);
					if(empty($wdlist_id)){
						$wdl = [
							'wdlist_seq'=>$work->getWorkSeqNext(),
							'wdlist_from_opuser'=>'SYS',
							'wdlist_title'=>$wdlist_title,
							'wdlist_opuser'=>'SYS',
							'wdlist_create_time'=>$datetime,
							'wdlist_update_time'=>$datetime,
							'wdlist_from'=>$wdi_from
						];
						$this->db->insert('work_data_list', $wdl);
						$wdlist_id = $this->db->id();
					}

					$join = [
						"[><]work_data_item(wdi)" => ["wdif.wdif_wdi_id" =>"wdi_id"]
					];
					$where = ['wdi_wdlist_id'=>$wdlist_id, 'wdi_cat_id'=>$prow['p_cate'], 'wdif_type'=>'Number', 'wdif_search'=>$prow['p_oe_format'], 'wdif_pf_id'=>$prow['p_pf_id']];
					if($prow['p_oe_format']){
						$where['wdif_search'] = $prow['p_oe_format'];
					}else{
						$where['wdif_val'] = $prow['p_oe'];
					}
					
					$wdi_id = $this->db->get('work_data_item_format(wdif)', $join, 'wdif_wdi_id', $where);
					$oe_id = 0;
					if(empty($wdi_id)){
						$add = [
							'wdi_wdlist_id'=>$wdlist_id,
							'wdi_cat_id'=>$prow['p_cate'],
							'wdi_from'=>$wdi_from,
							'wdi_from_id'=>$p_id,
							'wdi_opuser'=>'SYS',
							'wdi_create_time'=>$datetime,
							'wdi_update_time'=>$datetime
						];
						$this->db->insert('work_data_item', $add);
						$wdi_id = $this->db->id();
						$add = [
							'wdif_wdi_id'=>$wdi_id,
							'wdif_type'=>'Number',
							'wdif_val'=>$prow['p_oe'],
							'wdif_search'=>$prow['p_oe_format'],
							'wdif_pf_id'=>$prow['p_pf_id']
						];
						$this->db->insert('work_data_item_format', $add);
						//去除后缀的OE号
						if($prow['oe2_format'] && $prow['p_oe_format'] != $prow['oe2_format']){
							$add = [
								'wdif_wdi_id'=>$wdi_id,
								'wdif_type'=>'Number',
								'wdif_val'=>$prow['oe2'],
								'wdif_search'=>$prow['oe2_format'],
								'wdif_pf_id'=>1
							];
							$this->db->insert('work_data_item_format', $add);
						}
						if($prow['oe3_format'] && $prow['p_oe_format'] != $prow['oe3_format'] && $prow['oe2_format'] != $prow['oe3_format']){
							$add = [
								'wdif_wdi_id'=>$wdi_id,
								'wdif_type'=>'Number',
								'wdif_val'=>$prow['oe3'],
								'wdif_search'=>$prow['oe3_format'],
								'wdif_pf_id'=>1
							];
							$this->db->insert('work_data_item_format', $add);
						}
					}else{
						$oe_id = $this->db->get('oe_item', 'oe_id', ['oe_wdi_id'=>$wdi_id]);
					}
					
					if(empty($oe_id)){
						//清洗数据单
						$work->cleanWorkData(['ids'=>$wdi_id]);
						//转零件库
						$oeids = $work->workItemToPoeItem(['ids'=>$wdi_id]);
						$oe_id = $oeids[0];
						if($oe_id){
							//零件数据使用第一个商品数据
							$sql = "UPDATE `pro`, `oe_item` SET oe_unit = p_unit,
								oe_cn_name = p_cn_name,
								oe_en_name = p_en_name,
								oe_py_name = p_py_name,
								oe_sp_name = p_sp_name,
								oe_model_cn_name=p_model_cn_name, 
								oe_model_en_name=p_model_en_name, 
								oe_model_py_name=p_model_py_name, 
								oe_model_sp_name=p_model_sp_name, 
								oe_chassis=p_chassis, 
								oe_engine= p_engine, 
								oe_fuel_type = p_fuel_type, 
								oe_cc =p_cc, 
								oe_model_year = p_model_year, 
								oe_isdevelop = p_isdevelop
								WHERE p_id={$p_id} and oe_id={$oe_id}";
							$this->db->query($sql);
							if(!empty($prow['develop_no'])){
								$this->db->insert('oe_item_developno', ['oid_oe_id'=>$oe_id, 'oid_number'=>$prow['develop_no'], 'oid_format'=>formatNum($prow['develop_no'])]);
							}
						}
					}
					
					if($oe_id){
						$this->db->update('pro', ['p_oe_id'=>$oe_id], ['p_id'=>$p_id]);
						//零件库转商品
						$pro->updateProByPoe($p_id, $oe_id);
					}
				}
				$this->db->update('ztemp_init', ['z_status'=>1], ['z_id'=>$zrow['z_id']]);
				$this->db->End();
			}catch (Exception $e) {
				$this->db->rollBack();
				$noArr[] = ['p_id'=>$prow['p_id'], 'p_innum'=>$prow['p_innum']];
				$this->db->update('ztemp_init', ['z_status'=>-1], ['z_id'=>$zrow['z_id']]);
				dump($prow, $e->getMessage());
			}
		}

		//填补p_oe_id为空的
		/*$pro = new pro();
		$rows = $this->db->select('pro', ['p_id', 'p_oe_format', 'p_oe', 'p_cate'], ['p_oe_id'=>0, 'p_create_time'=>$datetime]);
		foreach($rows as $row){
			$p_id = $row['p_id'];
			$where = ['oe_cate_id'=>$row['p_cate'], 'on_pf_id'=>1];
			if($row['p_oe_format']){
				$where['on_formart'] = $row['p_oe_format'];
			}else{
				$where['on_number'] = $row['p_oe'];
			}
			$oe_id = $this->db->get('oe_numidx(oen)', ["[><]oe_item(oe)" => ["oen.on_oe_id" =>"oe_id"]], 'oe_id', $where);
			if($oe_id){
				$this->db->update('pro', ['p_oe_id'=>$oe_id], ['p_id'=>$p_id]);
				$pro->updateProByPoe($p_id, $oe_id);
			}
		}*/

		$sqlArr = [
			//"UPDATE `pro_cate` SET is_engine = 1 WHERE id IN (SELECT DISTINCT p_cate FROM `pro` WHERE p_engine != '') and is_engine != 1",
			//零件开发号
			"TRUNCATE TABLE oe_item_developno",
			"INSERT INTO oe_item_developno(oid_oe_id, oid_number, oid_format, oid_sup_id)
			SELECT p_oe_id, pde_number, pde_format, pde_sup_id FROM `pro_developno` JOIN pro ON pde_p_id=p_id
			GROUP BY p_oe_id, pde_format",
			"UPDATE `pro`, `oe_item` SET p_para = oe_para WHERE p_oe_id = oe_id and p_create_time='{$datetime}'",
			"UPDATE oe_item SET ck1 = 1, ckuser1= 'SYS', cktime1='{$datetime}' where ck1 = 0 or ck1 is null and oe_opuser='SYS'"
		];
		$this->db->Begin();
		foreach($sqlArr as $sql){
			$this->db->query($sql);
		}
		$this->db->End();
		return ['ok'=>$okArr, 'no'=>$noArr];
	}

	function initProPic($count = 10000){
		$pro = new pro();
		if(empty($count)) $count = 10000;
		$okArr = []; $noArr = [];
		for($i = $count; $i > 0; $i--){
			$sql = "SELECT * FROM (SELECT p_id, p_comnum, p_innum FROM pro where p_pb_id=1 and temp_pic_init=0 limit 1000) t order by rand() limit 1";
			$zrow = $this->db->query($sql)->fetch(\PDO::FETCH_ASSOC);
			if(empty($zrow)) break;
			try {
				$btime = microtime(true);
				$this->db->update('pro', ['temp_pic_init'=>2], ['p_id'=>$zrow['p_id'],'temp_pic_init'=>0]);
				echo $zrow['p_id']."=>begin\r\n";
				$data = $pro->synPic($zrow['p_id']);
				if(is_array($data)){
					$pro->syncOePicToPro($zrow['p_id']);
					$this->db->update('pro', ['temp_pic_init'=>1], ['p_id'=>$zrow['p_id']]);
					$okArr[] = $zrow['p_id'];
				}
				echo ceil((microtime(true) - $btime)*1000)."ms \r\n";
			}catch (Exception $e) {
				$noArr[] = $zrow['p_id'];
				$this->db->update('pro', ['temp_pic_init'=>-1], ['p_id'=>$zrow['p_id'],'temp_pic_init'=>0]);
				dump($zrow, $e->getMessage());
			}
		}
		return ['ok'=>$okArr, 'no'=>$noArr];
	}

	/*function syncOePicToPro(){
		$pro = new pro();
		$rows = $this->db->select('pro', ['p_id'], ['p_pb_id'=>1]);
		foreach($rows as $row){
			$pro->syncOePicToPro($row['p_id']);
		}
		return [];
	}*/

	function initCompanyPic($count)
	{	
		$pro = new pro();
		if(empty($count)) $count = 10000;
		$okArr = []; $noArr = [];
		for($i = $count; $i > 0; $i--){
			$sql = "SELECT * FROM (SELECT p_id, p_comnum, p_innum FROM pro where p_pb_id!=1 and temp_pic_init=0 limit 1000) t order by rand() limit 1";
			$zrow = $this->db->query($sql)->fetch(\PDO::FETCH_ASSOC);
			if(empty($zrow)) break;
			$btime = microtime(true);
			try {
				$btime = microtime(true);
				$this->db->update('pro', ['temp_pic_init'=>2], ['p_id'=>$zrow['p_id'],'temp_pic_init'=>0]);
				echo $zrow['p_id']."=>begin\r\n";
				$data = $pro->synCompanyPic($zrow['p_id']);
				if(is_array($data)){
					$this->db->update('pro', ['temp_pic_init'=>1], ['p_id'=>$zrow['p_id']]);
					$okArr[] = $zrow['p_id'];
				}
			}catch (Exception $e) {
				$noArr[] = $zrow['p_id'];
				$this->db->update('pro', ['temp_pic_init'=>-1], ['p_id'=>$zrow['p_id'],'temp_pic_init'=>0]);
				dump($zrow, $e->getMessage());
			}
			echo $zrow['p_id'].'=>'.ceil((microtime(true) - $btime)*1000)."ms \r\n";
		}
		return ['ok'=>$okArr, 'no'=>$noArr];
	}
	
	//初始化OE汽车品牌
	function initOeNumBrand()
	{
		$oeNumidx = new \model\oeNumidx();
		$zrow = $this->db->select('oe_numidx', ['on_id', 'on_oe_id', 'on_formart', 'on_mk_id'], ['on_pf_id'=>1, 'on_opuser'=>'SYS']);
		$oeids = array_unique(array_column($zrow, 'on_oe_id'));
		$this->db->Begin();
		foreach($zrow as $row){
			$tbIds = [];
			$row['on_mk_id'] = trim($row['on_mk_id'], ',');
			if(!empty($row['on_mk_id'])){
				$ids = $this->db->select('tag_brand_make', 'tbm_tb_id', ['tbm_mk_id'=>explode(',', $row['on_mk_id'])]);
				if($ids) $tbIds = $ids;
			}else{
				$ypApi = new ypApi();
				$res = $ypApi->Get('etk/getNumberBrand', ['number'=>$row['on_formart']]);
				if($res['data']){
					$names = $res['data'];
					$namesstr = implode("','", $names);
					$sql = "SELECT DISTINCT tb_id FROM `tag_brand` WHERE tb_cn_name IN ('{$namesstr}') OR tb_en_name IN ('{$namesstr}') 
					OR tb_id IN (SELECT DISTINCT tbm_tb_id FROM tag_brand_cnbrand JOIN m_cn_model ON brand_id = tbm_brand_id WHERE brand_name IN ('{$namesstr}'))
					OR tb_id IN (SELECT DISTINCT tbm_tb_id FROM tag_brand_make JOIN m_make ON mk_id = tbm_mk_id WHERE mk_cn_name IN ('{$namesstr}') OR mk_en_name IN ('{$namesstr}'))";
					$vals = $this->db->query($sql)->fetchAll();
					if($vals) $tbIds = array_column($vals, 'tb_id');
				}
			}
			$oeNumidx->saveOeNumTb($row['on_oe_id'], $row['on_id'],$tbIds);
		}
		
		$pro = new pro();
		foreach($oeids as $oe_id){
			$pro->synProByOe($oe_id, ['nums']);
		}
		$this->db->End();
		return ['ok'];
	}

	function clearNotExistsPic()
	{
		$sql = 'SELECT fileid, filename FROM `oe_pic` JOIN `files` ON fileid = pic_fileid';
		$rows = $this->db->query($sql)->fetchAll();
		foreach($rows as $row){
			$file = \mvc::$cfg['dir']['files'].'/'.$row['filename'];
            if(!file_exists($file)){
                $this->db->delete('oe_pic',['pic_fileid'=>$row['fileid']]);
            }
		}

		$sql = 'SELECT fileid, filename FROM `pro_pic` JOIN `files` ON fileid = pic_fileid';
		$rows = $this->db->query($sql)->fetchAll();
		foreach($rows as $row){
			$file = \mvc::$cfg['dir']['files'].'/'.$row['filename'];
            if(!file_exists($file)){
                $this->db->delete('pro_pic',['pic_fileid'=>$row['fileid']]);
            }
		}
		$this->db->query("UPDATE oe_item SET oe_pic = 0 WHERE oe_pic NOT IN (SELECT pic_fileid FROM oe_pic)");
		$this->db->query("UPDATE pro SET p_pic = 0 WHERE p_pic NOT IN (SELECT pic_fileid FROM pro_pic)");
	}
}
