<?php
//品牌目录
class superAction extends baseAction
{

	//配件查询
	function modelSearch()
	{
		$Params = mvc::$URL_PARAMS;
		$this->HEAD_CSSJS['plugin'][] = 'zTree';
		if($this->supData['shop_smt_code'] == 'all'){
			$this->HEAD_CSSJS['plugin'][] = 'webuploader';
			$this->HEAD_CSSJS['css'] = ['cropper/cropper.css'];
			$this->HEAD_CSSJS['js'] = ['cropper/cropper.js','js/vin-ocr.js']; 
		}
	
		LibTpl::Set('HEAD_CSSJS', $this->HEAD_CSSJS);
		LibTpl::Set('Params', $Params);
		LibTpl::Set('title', '配件列表-品牌目录');
		LibTpl::Put();
	}

	//配件查询结果
	function modelList()
	{
		$Params = $_GET;
		if($this->supData['shop_smt_code'] == 'chassis')
		{
			$this->modelListchassis();
			exit;
		}
		else if($this->supData['shop_smt_code'] == 'engine')
		{
			$this->modelListengine();
			exit;
		}

		//全车件模式
		$B2cBase = new B2cBase();
		$page = isset($Params['page']) ? $Params['page'] : 1;
		$perPage = isset($_COOKIE['perPage'])? $_COOKIE['perPage'] : 25;
		$perPage = $perPage > 2000? 2000: $perPage;
		
		$B2cPart = new B2cPart();
		$YpcModel = new YpcModel();
		$ComModel = new ComModel();

		$res = $B2cPart->getProductPart($_SESSION['_shopid'],'bind');
		$supPartArr = array_column($res['data'], null, 'spart_id');
		$pidArr  = array_unique(array_column($res['data'],'pId'));
		LibTpl::Set('pIdArr',$pidArr);
		$proSpartIdArr = array_unique(array_column($res['data'],'spart_id'));
		$spartIdArr = empty($Params['spartid']) || !is_array($Params['spartid'])? $proSpartIdArr : $Params['spartid'];
		$modelArr = [];
		$orgModelProArr = [];
		$showFiled = [];
		$itemWhere = sprintf(' and pro_shop_id=%d', $_SESSION['_shopid']);
		$total = 0;
		$codeArr = null;
		$comWhere = '';
		//店铺全车件配置
		$B2cShop = new B2cShop();
		$res = $B2cShop->getshopModAdminSql($_SESSION['_shopid']);

		if($res['data']){
			$comWhere .= $res['data']; 
		}
		$showFiled = [
			'brand_name'=>['name'=>'品牌', 'show'=>1, 'w'=>'90px'],	
			'make_name'=>['name'=>'生产商', 'show'=>1, 'w'=>'100px'],	
			'mod2_name'=>['name'=>'车代', 'show'=>1, 'w'=>'160px'],
			'mod3_name'=>['name'=>'车型', 'show'=>1, 'w'=>'200px'],		
			'mod3_year'=>['name'=>'车型年', 'show'=>1, 'w'=>'75px'],
		];
		if($this->supData['shop_mod_adminfield']){
			foreach ($this->supData['shop_mod_adminfield'] as $key => $field) {
				$showFiled[$key] = ['name'=>$field,'show'=>1,'w'=>'75px'];
			}
		}
		$showFiled['sparts'] = ['name'=>'配件类别', 'show'=>1, 'w'=>'140px'];
		$itemWhere = sprintf(' and pro_shop_id=%d', $_SESSION['_shopid']);
		$total = 0;
		//号码搜索
		$M3IdArr = null;
		if(!empty($Params['number']))
		{
			$twhere = $itemWhere.sprintf(" and num_format LIKE '%%%s%%'", LibFc::FormatNum($Params['number']));
			$Res = $B2cBase->get('bc_number join bc_product on pro_id = num_pro_id join bc_product_model3_link on pro_id = pml3_pro_id', ["concat(pro_part_id, '_', pro_pas_id) as spart_id"], $twhere.' group by pro_part_id, pro_pas_id');
			$spartIdArr = array_column($Res['data'], 'spart_id');
			
			$Res = $B2cBase->get('bc_number join bc_product on pro_id = num_pro_id join bc_product_model3_link on pro_id = pml3_pro_id', ['distinct pml3_mod3_id'], $twhere);
			$TempM3IdArr = array_column($Res['data'], 'pml3_mod3_id');
			$M3IdArr = $M3IdArr === null ? $TempM3IdArr: array_intersect($TempM3IdArr, $M3IdArr);
		}
		else if(!empty($Params['vin']))
		{
			$spartIdArr = array_keys($supPartArr); 
			$vin = LibFc::FormatVin($Params['vin']);
			$LibYpApi = new LibYpApi();
			$res = $LibYpApi->Get('vin/decodeYpcModelId', ['vin'=>$vin]);
			$M3IdArr = $M3IdArr === null ? $res['data']: array_intersect($res['data'], $M3IdArr);
			if(!empty($res['data'])){
				$hisArr = [
					'ash_uid'=>$_SESSION['_shopid'],
					'ash_type'=>'vin',
					'ash_act'=>'vin/decodeVin',
					'ash_val'=>$vin,
					'ash_uid_by'=>$_SESSION['_userid'],
					'ash_ip'=>LibFc::GetClientIp(),
					'ash_from'=> in_array('gzhShop', $_SESSION['_shoptype'])? 'gzh': 'super'
				];
				$LibYpApi->Get('zyb/addHistory', [], $hisArr);
			}
		}
		else
		{
			foreach($Params as $filed=>$val)
			{
				if(!is_array($val))
				{
					$val = trim($val);
					if($val == '') continue;
				}
				else if(empty($val))
				{
					continue;
				}
				switch($filed)
				{
					case 'b_id': $comWhere .= sprintf(" and brand_id in (%s)", $val); break;
					case 'm_id': $comWhere .= sprintf(" and make_id=%d", $val); break;
					case 'm1_id': $comWhere .= sprintf(" and mod1_id=%d", $val); break;
					case 'm2_id': $comWhere .= sprintf(" and mod2_id=%d", $val); break;
					case 'm3_id': $comWhere .= sprintf(" and mod3_id=%d", $val); break;
					case 'engine2':
					case 'engine':
						$val = LibFc::FormatNum($val);
						if($val != '') $comWhere .= sprintf(" and mod3_engine_format like '%%%s%%'", $val); 
					break;
					case 'drive':
						$comWhere .= $val == '四驱' ? " and mod3_drive_short like '%四驱%'": " and mod3_drive_short not like '%四驱%'";
					break;
					case 'cc': $comWhere .= sprintf(" and mod3_cc='%s'",  LibFc::Escape($val)); break;
					case 'kw': $comWhere .= sprintf(" and mod3_kw='%s'",  LibFc::Escape($val)); break;
					case 'betime':
						$comWhere .= sprintf(" AND mod3_atime >=%d", strtotime('-'.$val));
					break;
					case 'ccname':
						$comWhere .= sprintf(" AND mod3_cc_name ='%s'", LibFc::Escape($val));
					break;
					case 'word':
						$wordArr = LibFc::keyword($val);
						if(!empty($wordArr))
						{ 
							$wordIdArr = [];
							$caseArr = [];
							foreach($wordArr as $word)
							{
								$res = $ComModel->get('yp_model_word', ['mw_id'], sprintf(" and mw_word like '%s%%'", LibFc::Escape($word)));
								if(!empty($res['data']))
								{
									$ids = array_column($res['data'], 'mw_id');
									$caseArr[] = sprintf("WHEN mwl_mw_id IN (%s) THEN %d", implode(',', $ids), count($caseArr)+1);
									$wordIdArr = array_merge($wordIdArr, $ids);
								}
							}
							if(!empty($caseArr))
							{
								$wordIdArr = array_unique($wordIdArr);
								for($i = count($caseArr); $i > 0; $i--)
								{
									$table = sprintf("( SELECT mwl_mod3_id, CASE %s END AS mwl_mw_id FROM yp_model_word_link WHERE mwl_mw_id IN (%s)) AS a", implode(' ', $caseArr), implode(',', $wordIdArr));
									$res = $ComModel->get($table, ['mwl_mod3_id'], sprintf(" GROUP BY mwl_mod3_id HAVING COUNT(DISTINCT mwl_mw_id) = %d", $i));
									if(!empty($res['data']))
									{
										$comWhere .= sprintf(" and mod3_id in (SELECT mwl_mod3_id from %s %s)", $table, sprintf(" GROUP BY mwl_mod3_id HAVING COUNT(DISTINCT mwl_mw_id) = %d", $i));
										break;
									}
								}
							}
						}
					break;
					case 'betime':
						$comWhere .= sprintf(" AND mod3_atime >=%d", strtotime('-'.$val));
					break;
					case 'chkitem':
						if(!empty($spartIdArr))
						{
							if($val == 'no')
							{
								//同时有产品的车型
								$table = 'bc_product_model3_link join bc_product on pro_id = pml3_pro_id';
								$twhere = $itemWhere.sprintf(" and concat(pro_part_id, '_', pro_pas_id) in ('%s') group by pml3_mod3_id, pro_part_id, pro_pas_id having count(*) >= %d", implode("','", $spartIdArr), count($spartIdArr));
								$res = $B2cBase->get($table, ['distinct pml3_mod3_id'], $twhere);
								if(!empty($res['data']))
								{
								$comWhere .= sprintf(" AND mod3_id not in (%s)", implode(',', array_column($res['data'], 'pml3_mod3_id')));
								}
							}
							else if($val == 'any')
							{
								//同一个车型一个类别有多个产品
								$table = 'bc_product_model3_link join bc_product on pro_id = pml3_pro_id';
								$twhere = $itemWhere.sprintf(" and concat(pro_part_id, '_', pro_pas_id) in ('%s') group by pml3_mod3_id, pro_part_id, pro_pas_id having count(*) > 1", implode("','", $spartIdArr));
								$res = $B2cBase->get($table, ['distinct pml3_mod3_id'], $twhere);
								$TempM3IdArr = array_column($res['data'], 'pml3_mod3_id');
								$M3IdArr = $M3IdArr === null ? $TempM3IdArr: array_intersect($TempM3IdArr, $M3IdArr);
							}
							else if($val == 'has')
							{
								$table = 'bc_product_model3_link join bc_product on pro_id = pml3_pro_id';
								$twhere = $itemWhere.sprintf(" and concat(pro_part_id, '_', pro_pas_id) in ('%s')", implode("','", $spartIdArr));
								$res = $B2cBase->get($table, ['distinct pml3_mod3_id'], $twhere);
								$TempM3IdArr = array_column($res['data'], 'pml3_mod3_id');
								$M3IdArr = $M3IdArr === null ? $TempM3IdArr: array_intersect($TempM3IdArr, $M3IdArr);
							}
						}
					break;
					case 'pl_5':
						if($val == '柴油')
						{
							$comWhere .= " and mod3_fuel='%柴油%'";
						}
						else if($val == '汽油')
						{
							$comWhere .= " and mod3_fuel not like '%%柴油%%' and mod3_cc > 0";
						}
						else if($val == '纯电')
						{
							$comWhere .= " and mod3_cc = 0";
						}	
					break;
					case 'pl_8':
						if(is_array($val)){
							$swhere = [];
							foreach ($val as $key => $vitem) {
								$swhere[] = sprintf(" mod3_rear_brake like '%%%s%%'",LibFc::Escape($vitem));
							}
			
							$comWhere .= sprintf(" and %s", implode(' or ',$swhere));
						}
					break;
				}
			}
		}

		if($M3IdArr !== null) $comWhere .= empty($M3IdArr) ? " and 1=0" : sprintf(" AND mod3_id IN ('%s')", implode("','", $M3IdArr));

		$Res = $ComModel->GetModel(3, array('count(distinct mod3_id) as count'), $comWhere, true);
		$total = $Res['data']['count'];
		$partArr = [];
		if($total > 0)
		{
			switch($Params['order'])
			{
				case 'm3_atime': $order = ' order by mod3_atime desc'; break;
				default: $order = ' group by mod3_id ORDER BY brand_initial, make_seq, make_initial, mod1_name, mod2_name, mod2_start_year, mod3_name, mod3_start_year'; break;
			}

			//下载
			if(!empty($Params['export']))
			{
				ini_set('memory_limit', '4096M');
				$page = 1;
				$perPage = $total;
				//排除代理授权的产品
				$itemWhere = sprintf(" %s and pro_dfrom='' and pro_dfrom_id=0", $itemWhere);
			}
			$filed = ['mod3_id, brand_id, brand_name, make_id, make_name, mod1_id, mod1_name, mod2_id, mod2_name, mod2_start_year, mod2_end_year,mod3_name, mod3_start_year, mod3_end_year,  mod3_cc_name,mod3_engine,mod3_kw,mod3_cc,mod3_transmission,mod3_fuel,mod3_drive,mod3_front_brake,mod3_rear_brake,mod3_parking_brake,mod3_start_stop,mod3_body,mod3_chassis'];
			$res = $ComModel->getModel(3, $filed, sprintf("%s %s LIMIT %d,%d",$comWhere, $order, ($page-1)*$perPage,$perPage));
			if(!empty($res['data']))
			{
				foreach($res['data'] as $v)
				{
					if(empty($v['mod3_cc'])) $v['mod3_cc'] = '';
					$v['mod2_year'] = LibFc::formatViewYear($v['mod2_start_year'], $v['mod2_end_year'], 3);
					$v['mod3_year'] = LibFc::formatViewYear($v['mod3_start_year'], $v['mod3_end_year'], 3);
					$v['pros'] = [];
					$v['numid'] = [];
					$modelArr[$v['mod3_id']] = $v;
				}
				unset($res);
				$m3IdArr = array_keys($modelArr);
				//车系产品信息
				if(!empty($spartIdArr))
				{
					$table = 'bc_product_model3_link
					join bc_product on pro_id = pml3_pro_id
					join bc_product_info on pri_pro_id = pro_id';
					$where = $itemWhere.sprintf(" and pml3_mod3_id in (%s) and concat(pro_part_id, '_', pro_pas_id) in ('%s') group by pml3_mod3_id, pro_id order by pri_code", implode(',', $m3IdArr), implode("','", $spartIdArr));
					$pres = $B2cBase->get($table, ["pml3_mod3_id, pro_id, pro_part_id, pro_pas_id, concat(pro_part_id, '_', pro_pas_id) spartid, pml3_remark, pri_code"], $where);
					$orgModelProArr = $pres['data'];
					unset($pres);
					foreach($orgModelProArr as $v)
					{
						//if($v['pro_pas_id'] > 0) $modelArr[$v['pml3_mod3_id']]['pros'][$v['pro_part_id'].'_0'][] = $proArr[$v['pro_id']];
						$modelArr[$v['pml3_mod3_id']]['pros'][$v['spartid']][] = $v;
					}

					//只在页面显示
					if(empty($Params['export']))
					{
						//哪些车型的零件有号码
						$table = 'yc_number join yc_part on part_id = num_part_id';
						$where = sprintf(" and num_m3_id in (%s) and part_partid_b2c in ('%s') group by num_m3_id, part_partid_b2c", implode(',', $m3IdArr), implode("','", $spartIdArr));
						$pres = $YpcModel->Get($table, ["num_m3_id, num_id, part_partid_b2c spartid"], $where);
						foreach($pres['data'] as $v)
						{
							$modelArr[$v['num_m3_id']]['numid'][$v['spartid']][] = $v['num_id'];
						}
						unset($pres);
					}
				}
			}
		}
		//导出
		if(!empty($Params['export']) && $Params['export'] == 'modsitem')
		{
			$allArr = [];
			$headArr = ['mod3_id'];
			foreach($showFiled as $filed=>$fv)
			{
				if($filed == 'sparts')
				{
					foreach($spartIdArr as $spid)
					{ 
						if(!empty($supPartArr[$spid]))
						{
							$headArr[]= $supPartArr[$spid]['name'];
						}
					}
				}
				else 
				{
					$headArr[]= $fv['name'];
				}
			}
			
			$allArr[] = $headArr;
			foreach($modelArr as $k=>$v)
			{
				$row = [$v['mod3_id']];
				foreach($showFiled as $filed=>$fv)
				{
					if($filed == 'sparts')
					{
						foreach($spartIdArr as $spid)
						{ 
							$fval = [];
							if(!empty($supPartArr[$spid]))
							{
								if(!empty($v['pros'][$spid]))
								{
									foreach($v['pros'][$spid] as $kkk=>$vvv)
									{
										$fval[] = empty($vvv['pml3_remark']) ? $vvv['pri_code']: $vvv['pri_code'].'@'.$vvv['pml3_remark'];
									}
								}
								$row[] = implode(';', $fval);
							}

						}
					}
					else
					{ 
						$row[] = !empty($v[$filed])?  $v[$filed]: '';
					}
				}
				$allArr[] = $row;
			}
			unset($modelArr);
			unset($orgModelProArr);
			$OthSExcel = new OthSExcel();
			$OthSExcel->writeBig($allArr, '车型配件'.date('Ymd').'.xlsx', false);
			unset($allArr);
			exit;
		}
		else if(!empty($Params['export']) && $Params['export'] == 'moditemremark')
		{
			$allArr = [];
			$sortArr = [];
			
			//程序排序，不用array_multisort，对spart_name有问题
			$uniArr = [];
			foreach($orgModelProArr as $v)
			{
				$uniArr[$v['spartid']][$v['pro_id']][$v['pml3_mod3_id']] = $v;
			}
			foreach($supPartArr as $spartid=>$sv)
			{
				if(empty($uniArr[$spartid])) continue;
				foreach($uniArr[$spartid] as $pid=>$mv)
				{
					foreach($modelArr as $m3id=>$mvv)
					{
						if(empty($mv[$m3id])) continue;
						$row = $mv[$m3id];
						$row = array_merge($row, $mvv);
						$row['spart_name'] = $sv['name'];
						$allArr[] = $row;
					}
				}
			}

			$allArr['fields'] = ['mod3_id'=>'mod3_id'];
			foreach($showFiled as $filed=>$fv)
			{ 
				if($filed == 'sparts')
				{
					$allArr['fields']['spart_name']= '零件分类';
				}
				else 
				{
					$allArr['fields'][$filed]= $fv['name'];
				}
			}
			$allArr['fields']['pri_code']= '商家编码';
			$allArr['fields']['pml3_remark']= '车型备注';
			//if(count($allArr) > 40000) LibFc::ReturnData(false, '导出记录数'.count($allArr).'条(最大限制40000条)，请改变导出条件');
			unset($modelArr);
			unset($orgModelProArr);
			unset($uniArr);
			$OthSExcel = new OthSExcel();
			$OthSExcel->writeBig($allArr, '配件车型备注'.date('Ymd').'.xlsx', false);
			unset($allArr);
			exit;
		}
		$allKeysEmpty =	array_filter(array_column($modelArr,'mod3_chassis'));
		LibTpl::Set('allKeysEmpty', empty($allKeysEmpty));
		LibTpl::Set('showFiled', $showFiled);
		LibTpl::Set('spartIdArr', $spartIdArr);
		LibTpl::Set('Params', $Params);
		LibTpl::Set('supPartArr', $supPartArr);
		LibTpl::Set('pageMsg', LibPage::Show($total, $perPage, true));
		LibTpl::Set('modelArr', $modelArr);
		LibTpl::Set('title', '配件管理-品牌目录');
		LibTpl::Put();
	}
	

	//底盘件模式
	function modelListchassis()
	{
		$Params = $_GET;
		$B2cBase = new B2cBase();
		$page = isset($Params['page']) ? $Params['page'] : 1;
		$perPage = isset($_COOKIE['perPage'])? $_COOKIE['perPage'] : 25;
		$perPage = $perPage > 2000? 2000: $perPage;
		
		$B2cPart = new B2cPart();
		$ComModel = new ComModel();

		$res = $B2cPart->getProductPart($_SESSION['_shopid'],'bind');
		$pidArr  = array_unique(array_column($res['data'],'pId'));
		LibTpl::Set('pIdArr',$pidArr);
		$supPartArr = array_column($res['data'], null, 'spart_id');
		$proSpartIdArr = array_unique(array_column($res['data'],'spart_id'));
		$spartIdArr = empty($Params['spartid']) || !is_array($Params['spartid'])? $proSpartIdArr : $Params['spartid'];
		$modelArr = [];
		$orgModelProArr = [];
		$showFiled = [];
		$itemWhere = sprintf(' and pro_shop_id=%d', $_SESSION['_shopid']);
		$total = 0;
		$codeArr = null;
		$comWhere = '';
		$B2cShop = new B2cShop();
		$res = $B2cShop->getshopModAdminSql($_SESSION['_shopid']);
		if($res['data']){
			$comWhere .= $res['data']; 
		}
		$showFiled =  [
			'brand_name'=>['name'=>'品牌', 'show'=>1, 'w'=>'90px'],	
			'make_name'=>['name'=>'生产商', 'show'=>1, 'w'=>'100px'],	
			'mod1_name'=>['name'=>'车系', 'show'=>1, 'w'=>'100px'],	
			'mod2_name'=>['name'=>'车代', 'show'=>1, 'w'=>'180px'],	
			'mod2_year'=>['name'=>'车代年', 'show'=>1, 'w'=>'75px'],	
			'mch_cc_name'=>['name'=>'排量', 'show'=>1, 'w'=>'50px'],	
			'mch_engine'=>['name'=>'发动机', 'show'=>1, 'w'=>'110px'],	
			'mch_kw'=>['name'=>'功率', 'show'=>1, 'w'=>'50px', 'sort'=>'float'],	
			'mch_cc'=>['name'=>'排量', 'show'=>1, 'w'=>'50px', 'sort'=>'float'],
			'mch_transmission'=>['name'=>'变速器', 'show'=>1, 'w'=>'80px'],	
			'mch_drive'=>['name'=>'驱动方式', 'show'=>1, 'w'=>'70px'],
			'mch_chassis'=>['name'=>'底盘', 'show'=>1, 'w'=>'100px'],
			'mch_fuel'=>['name'=>'燃料', 'show'=>1, 'w'=>'100px'],
			'sparts'=>['name'=>'配件类别', 'show'=>1, 'w'=>'140px']
		];

		//号码搜索
		if(!empty($Params['number']))
		{
			$twhere = $itemWhere.sprintf(" and num_format LIKE '%%%s%%'", LibFc::FormatNum($Params['number']));
			$Res = $B2cBase->get('bc_number join bc_product on pro_id = num_pro_id join bc_product_modchassis on pro_id = pmc_pro_id', ["concat(pro_part_id, '_', pro_pas_id) as spart_id"], $twhere.' group by pro_part_id, pro_pas_id');
			$spartIdArr = array_column($Res['data'], 'spart_id');
			
			$Res = $B2cBase->get('bc_number join bc_product on pro_id = num_pro_id join bc_product_modchassis on pro_id = pmc_pro_id', ['distinct pmc_mch_code'], $twhere);
			$TempCodeArr = array_column($Res['data'], 'pmc_mch_code');
			$codeArr = $codeArr === null ? $TempCodeArr: array_intersect($TempCodeArr, $codeArr);
		}
		else
		{
			foreach($Params as $filed=>$val)
			{
				if(!is_array($val))
				{
					$val = trim($val);
					if($val == '') continue;
				}
				else if(empty($val))
				{
					continue;
				}
				switch($filed)
				{
					case 'b_id': $comWhere .= sprintf(" and brand_id in (%s)", $val); break;
					case 'm_id': $comWhere .= sprintf(" and make_id=%d", $val); break;
					case 'm1_id': $comWhere .= sprintf(" and mod1_id=%d", $val); break;
					case 'm2_id': $comWhere .= sprintf(" and mod2_id=%d", $val); break;
					case 'engine2':
					case 'engine':
						$val = LibFc::FormatNum($val);
						if($val != '') $comWhere .= sprintf(" and mch_engine_format like '%%%s%%'", $val); 
					break;
					case 'drive':
						$comWhere .= $val == '四驱' ? " and mch_drive like '%四驱%'": " and mch_drive not like '%四驱%'";
					break;
					case 'cc': $comWhere .= sprintf(" and mch_cc='%s'",  LibFc::Escape($val)); break;
					case 'kw': $comWhere .= sprintf(" and mch_kw='%s'",  LibFc::Escape($val)); break;
					case 'betime':
						$comWhere .= sprintf(" AND mch_atime >=%d", strtotime('-'.$val));
					break;
					case 'word':
						$wordArr = LibFc::keyword($val);
						if(!empty($wordArr))
						{ 
							$wordIdArr = [];
							$caseArr = [];
							foreach($wordArr as $word)
							{
								$res = $ComModel->get('yp_model_word', ['mw_id'], sprintf(" and mw_word like '%s%%'", LibFc::Escape($word)));
								if(!empty($res['data']))
								{
									$ids = array_column($res['data'], 'mw_id');
									$caseArr[] = sprintf("WHEN mwl_mw_id IN (%s) THEN %d", implode(',', $ids), count($caseArr)+1);
									$wordIdArr = array_merge($wordIdArr, $ids);
								}
							}
							if(!empty($caseArr))
							{
								$wordIdArr = array_unique($wordIdArr);
								for($i = count($caseArr); $i > 0; $i--)
								{
									$table = sprintf("( SELECT mod3_mod2_id, CASE %s END AS mwl_mw_id FROM yp_model_word_link JOIN bc_model3 ON mwl_mod3_id = mod3_id WHERE mwl_mw_id IN (%s)) AS a", implode(' ', $caseArr), implode(',', $wordIdArr));
									$res = $ComModel->get($table, ['mod3_mod2_id'], sprintf(" GROUP BY mod3_mod2_id HAVING COUNT(DISTINCT mwl_mw_id) = %d", $i));
									if(!empty($res['data']))
									{
										$comWhere .= sprintf(" and mch_mod2_id in (SELECT mod3_mod2_id from %s %s)", $table, sprintf(" GROUP BY mod3_mod2_id HAVING COUNT(DISTINCT mwl_mw_id) = %d", $i));
										break;
									}
								}
							}
						}
					break;
					case 'chkitem':
						if(!empty($spartIdArr))
						{
							if($val == 'no')
							{
								//同时有产品的车型
								$table = 'bc_product_modchassis join bc_product on pro_id = pmc_pro_id';
								$twhere = $itemWhere.sprintf(" and concat(pro_part_id, '_', pro_pas_id) in ('%s') group by pmc_mch_code, pro_part_id, pro_pas_id having count(*) >= %d", implode("','", $spartIdArr), count($spartIdArr));
								$res = $B2cBase->get($table, ['distinct pmc_mch_code'], $twhere);
								if(!empty($res['data']))
								{
									$comWhere .= sprintf(" AND mch_code not in ('%s')", implode("','", array_column($res['data'], 'pmc_mch_code')));
								}
							}
							else if($val == 'any')
							{
								//同一个车型一个类别有多个产品
								$table = 'bc_product_modchassis join bc_product on pro_id = pmc_pro_id';
								$twhere = $itemWhere.sprintf(" and concat(pro_part_id, '_', pro_pas_id) in ('%s') group by pmc_mch_code, pro_part_id, pro_pas_id having count(*) > 1", implode("','", $spartIdArr));
								$res = $B2cBase->get($table, ['distinct pmc_mch_code'], $twhere);
								$TempCodeArr = array_column($res['data'], 'pmc_mch_code');
								$codeArr = $codeArr === null ? $TempCodeArr: array_intersect($TempCodeArr, $codeArr);
							}
							else if($val == 'has')
							{
								$table = 'bc_product_modchassis join bc_product on pro_id = pmc_pro_id';
								$twhere = $itemWhere.sprintf(" and concat(pro_part_id, '_', pro_pas_id) in ('%s')", implode("','", $spartIdArr));
								$res = $B2cBase->get($table, ['distinct pmc_mch_code'], $twhere);
								$TempCodeArr = array_column($res['data'], 'pmc_mch_code');
								$codeArr = $codeArr === null ? $TempCodeArr: array_intersect($TempCodeArr, $codeArr);
							}
						}
					break;
					case 'pl_5':
						if($val == '柴油')
						{
							$comWhere .= " and mch_fuel='%柴油%'";
						}
						else if($val == '汽油')
						{
							$comWhere .= " and mch_fuel not like '%%柴油%%' and mch_cc > 0";
						}
						else if($val == '纯电')
						{
							$comWhere .= " and mch_cc = 0";
						}	
					break;
				}
			}
		}

		if($codeArr != null) $comWhere .= sprintf(" AND mch_code IN ('%s')", implode("','", $codeArr));
		$Res = $ComModel->getChassisModel(['count(distinct mch_code) as count'], $comWhere, true);
		$total = $Res['data']['count'];
		$partArr = [];
		if($total > 0)
		{
			switch($Params['order'])
			{
				case 'mch_atime': $order = ' order by mch_atime desc'; break;
				default: $order = ' order by brand_initial, make_seq, make_initial, mod1_name, mod2_name,mch_engine,mch_kw,mch_cc,mch_transmission,mch_drive'; break;
			}
			//下载
			if(!empty($Params['export']))
			{
				ini_set('memory_limit', '4096M');
				$page = 1;
				$perPage = $total;
				$itemWhere = sprintf(" %s and pro_dfrom='' and pro_dfrom_id=0", $itemWhere);
			}

			$filed = ['mch_code,brand_id, brand_name, make_id, make_name, mod1_id, mod1_name, mod2_id, mod2_name, mod2_start_year, mod2_end_year, mch_cc_name,mch_engine,mch_kw,mch_cc,mch_transmission,mch_fuel,mch_drive,mch_chassis'];
			$res = $ComModel->getChassisModel($filed, sprintf("%s group by mch_code %s LIMIT %d,%d", $comWhere, $order, ($page-1)*$perPage,$perPage));
			if(!empty($res['data']))
			{
				foreach($res['data'] as $v)
				{
					if(empty($v['mch_cc'])) $v['mch_cc'] = '';
					$v['mod2_year'] = LibFc::formatViewYear($v['mod2_start_year'], $v['mod2_end_year'], 3);
					$v['pros'] = [];
					$v['numid'] = [];
					$modelArr[$v['mch_code']] = $v;
				}
				unset($res);
				$codeArr = array_keys($modelArr);
				//车系产品信息
				if(!empty($spartIdArr))
				{
					$table = 'bc_product_modchassis
					join bc_product on pro_id = pmc_pro_id
					join bc_product_info on pri_pro_id = pro_id';
					$where = $itemWhere.sprintf(" and pmc_mch_code in ('%s') and concat(pro_part_id, '_', pro_pas_id) in ('%s') group by pmc_mch_code, pro_id order by pri_code", implode("','", $codeArr), implode("','", $spartIdArr));
					$pres = $B2cBase->get($table, ["pmc_mch_code, pro_id, concat(pro_part_id, '_', pro_pas_id) spartid, pmc_remark, pri_code"], $where);
					$orgModelProArr = $pres['data'];
					unset($pres);
					foreach($orgModelProArr as $v)
					{
						$modelArr[$v['pmc_mch_code']]['pros'][$v['spartid']][] = $v;
					}
				}
			}
		}
		//导出
		if(!empty($Params['export']) && $Params['export'] == 'modsitem')
		{
			$allArr = [];
			$headArr = ['mch_code'];
			foreach($showFiled as $filed=>$fv)
			{
				if($filed == 'sparts')
				{
					foreach($spartIdArr as $spid)
					{ 
						if(!empty($supPartArr[$spid]))
						{
							$headArr[]= $supPartArr[$spid]['name'];
						}
					}
				}
				else
				{
					$headArr[]= $fv['name'];
				}
			}
			
			$allArr[] = $headArr;
			foreach($modelArr as $k=>$v)
			{
				$row = [$v['mch_code']];
				foreach($showFiled as $filed=>$fv)
				{ 
					if($filed == 'sparts')
					{
						foreach($spartIdArr as $spid)
						{ 
							$fval = [];
							if(!empty($supPartArr[$spid]))
							{
								if(!empty($v['pros'][$spid]))
								{
									foreach($v['pros'][$spid] as $kkk=>$vvv)
									{
										$fval[] = empty($vvv['pmc_remark']) ? $vvv['pri_code']: $vvv['pri_code'].'@'.$vvv['pmc_remark'];
									}
								}
								$row[] = implode(';', $fval);
							}
							
						}
					}
					else
					{ 
						$row[] = !empty($v[$filed])?  $v[$filed]: '';
					}
				}
				$allArr[] = $row;
			}
			unset($modelArr);
			unset($orgModelProArr);
			$OthSExcel = new OthSExcel();
			$OthSExcel->writeBig($allArr, '底盘车型配件'.date('Ymd').'.xlsx', false);
			unset($allArr);
			exit;
		}
		else if(!empty($Params['export']) && $Params['export'] == 'moditemremark')
		{
			$allArr = [];
			$sortArr = [];
			
			//程序排序，不用array_multisort，对spart_name有问题
			$uniArr = [];
			foreach($orgModelProArr as $v)
			{
				$uniArr[$v['spartid']][$v['pro_id']][$v['pmc_mch_code']] = $v;
			}
			foreach($supPartArr as $spartid=>$sv)
			{
				if(empty($uniArr[$spartid])) continue;
				foreach($uniArr[$spartid] as $pid=>$mv)
				{
					foreach($modelArr as $m3id=>$mvv)
					{
						if(empty($mv[$m3id])) continue;
						$row = $mv[$m3id];
						$row = array_merge($row, $mvv);
						$row['spart_name'] = $sv['name'];
						$allArr[] = $row;
					}
				}
			}

			$allArr['fields'] = ['mch_code'=>'mch_code'];
			foreach($showFiled as $filed=>$fv)
			{ 
				if($filed == 'sparts')
				{
					$allArr['fields']['spart_name']= '零件分类';
				}
				else 
				{
					$allArr['fields'][$filed]= $fv['name'];
				}
			}
			$allArr['fields']['pri_code']= '商家编码';
			$allArr['fields']['pmc_remark']= '车型备注';
			//if(count($allArr) > 30000) LibFc::ReturnData(false, '导出记录数'.count($allArr).'条(最大限制30000条)，请改变导出条件');
			unset($modelArr);
			unset($orgModelProArr);
			unset($uniArr);
			$OthSExcel = new OthSExcel();
			$OthSExcel->writeBig($allArr, '配件底盘车型备注'.date('Ymd').'.xlsx', false);
			unset($allArr);
			exit;
		}
		$allKeysEmpty =	array_filter(array_column($modelArr,'mch_chassis'));
		LibTpl::Set('allKeysEmpty', empty($allKeysEmpty));
		LibTpl::Set('showFiled', $showFiled);
		LibTpl::Set('spartIdArr', $spartIdArr);
		LibTpl::Set('Params', $Params);
		LibTpl::Set('supPartArr', $supPartArr);
		LibTpl::Set('pageMsg', LibPage::Show($total, $perPage, true));
		LibTpl::Set('modelArr', $modelArr);
		LibTpl::Set('title', '配件管理-品牌目录');
		LibTpl::Put('super/modelListchassis.php');
	}


	//配件查询结果
	function modelListengine()
	{
		$Params = $_GET;
		$B2cBase = new B2cBase();
		$page = isset($Params['page']) ? $Params['page'] : 1;
		$perPage = isset($_COOKIE['perPage'])? $_COOKIE['perPage'] : 25;
		$perPage = $perPage > 2000? 2000: $perPage;
	
		$B2cPart = new B2cPart();
		$ComModel = new ComModel();

		$res = $B2cPart->getProductPart($_SESSION['_shopid'],'bind');
		$pidArr  = array_unique(array_column($res['data'],'pId'));
		LibTpl::Set('pIdArr',$pidArr);
		$supPartArr = array_column($res['data'], null, 'spart_id');
		$proSpartIdArr = array_unique(array_column($res['data'],'spart_id'));
		$spartIdArr = empty($Params['spartid']) || !is_array($Params['spartid'])? $proSpartIdArr : $Params['spartid'];
		
		$modelArr = [];
		$orgModelProArr = [];
		$showFiled = [];
		$itemWhere = sprintf(' and pro_shop_id=%d', $_SESSION['_shopid']);
		$total = 0;
		$codeArr = null;
		$comWhere = '';
		$B2cShop = new B2cShop();
		$res = $B2cShop->getshopModAdminSql($_SESSION['_shopid']);
		if($res['data']){
			$comWhere .= $res['data']; 
		}
		$showFiled =  [
			'brand_name'=>['name'=>'品牌', 'show'=>1, 'w'=>'90px'],	
			'make_name'=>['name'=>'生产商', 'show'=>1, 'w'=>'100px'],	
			'mod1_name'=>['name'=>'车系', 'show'=>1, 'w'=>'100px'],	
			'mod2_name'=>['name'=>'车代', 'show'=>1, 'w'=>'180px'],	
			'mod2_year'=>['name'=>'车代年', 'show'=>1, 'w'=>'75px'],	
			'men_cc_name'=>['name'=>'排量', 'show'=>1, 'w'=>'50px'],	
			'men_engine'=>['name'=>'发动机', 'show'=>1, 'w'=>'110px'],	
			'men_kw'=>['name'=>'功率', 'show'=>1, 'w'=>'50px', 'sort'=>'float'],	
			'men_cc'=>['name'=>'排量', 'show'=>1, 'w'=>'50px', 'sort'=>'float'],
			'men_fuel'=>['name'=>'燃料', 'show'=>1, 'w'=>'100px'],
			'sparts'=>['name'=>'配件类别', 'show'=>1, 'w'=>'140px']
		];

		//号码搜索
		if(!empty($Params['number']))
		{
			$twhere = $itemWhere.sprintf(" and num_format LIKE '%%%s%%'", LibFc::FormatNum($Params['number']));
			$Res = $B2cBase->get('bc_number join bc_product on pro_id = num_pro_id join bc_product_modengine on pro_id = pme_pro_id', ["concat(pro_part_id, '_', pro_pas_id) as spart_id"], $twhere.' group by pro_part_id, pro_pas_id');
			$spartIdArr = array_column($Res['data'], 'spart_id');
			
			$Res = $B2cBase->get('bc_number join bc_product on pro_id = num_pro_id join bc_product_modengine on pro_id = pme_pro_id', ['distinct pme_men_code'], $twhere);
			$TempCodeArr = array_column($Res['data'], 'pme_men_code');
			$codeArr = $codeArr === null ? $TempCodeArr: array_intersect($TempCodeArr, $codeArr);
		}
		else
		{
			foreach($Params as $filed=>$val)
			{
				if(!is_array($val))
				{
					$val = trim($val);
					if($val == '') continue;
				}
				else if(empty($val))
				{
					continue;
				}
				switch($filed)
				{
					case 'b_id': $comWhere .= sprintf(" and brand_id in (%s)", $val); break;
					case 'm_id': $comWhere .= sprintf(" and make_id=%d", $val); break;
					case 'm1_id': $comWhere .= sprintf(" and mod1_id=%d", $val); break;
					case 'm2_id': $comWhere .= sprintf(" and mod2_id=%d", $val); break;
					case 'engine2':
					case 'engine':
						$val = LibFc::FormatNum($val);
						if($val != '') $comWhere .= sprintf(" and men_engine_format like '%%%s%%'", $val); 
					break;
					case 'cc': $comWhere .= sprintf(" and men_cc='%s'",  LibFc::Escape($val)); break;
					case 'kw': $comWhere .= sprintf(" and men_kw='%s'",  LibFc::Escape($val)); break;
					case 'betime':
						$comWhere .= sprintf(" AND men_atime >=%d", strtotime('-'.$val));
					break;
					case 'word':
						$wordArr = LibFc::keyword($val);
						if(!empty($wordArr))
						{ 
							$wordIdArr = [];
							$caseArr = [];
							foreach($wordArr as $word)
							{
								$res = $ComModel->get('yp_model_word', ['mw_id'], sprintf(" and mw_word like '%s%%'", LibFc::Escape($word)));
								if(!empty($res['data']))
								{
									$ids = array_column($res['data'], 'mw_id');
									$caseArr[] = sprintf("WHEN mwl_mw_id IN (%s) THEN %d", implode(',', $ids), count($caseArr)+1);
									$wordIdArr = array_merge($wordIdArr, $ids);
								}
							}
							if(!empty($caseArr))
							{
								$wordIdArr = array_unique($wordIdArr);
								for($i = count($caseArr); $i > 0; $i--)
								{
									$table = sprintf("( SELECT mod3_mod2_id, CASE %s END AS mwl_mw_id FROM yp_model_word_link JOIN bc_model3 ON mwl_mod3_id = mod3_id WHERE mwl_mw_id IN (%s)) AS a", implode(' ', $caseArr), implode(',', $wordIdArr));
									$res = $ComModel->get($table, ['mod3_mod2_id'], sprintf(" GROUP BY mod3_mod2_id HAVING COUNT(DISTINCT mwl_mw_id) = %d", $i));
									if(!empty($res['data']))
									{
										$comWhere .= sprintf(" and men_mod2_id in (SELECT mod3_mod2_id from %s %s)", $table, sprintf(" GROUP BY mod3_mod2_id HAVING COUNT(DISTINCT mwl_mw_id) = %d", $i));
										break;
									}
								}
							}
						}
					break;
					case 'chkitem':
						if(!empty($spartIdArr))
						{
							if($val == 'no')
							{
								//同时有产品的车型
								$table = 'bc_product_modengine join bc_product on pro_id = pme_pro_id';
								$twhere = $itemWhere.sprintf(" and concat(pro_part_id, '_', pro_pas_id) in ('%s') group by pme_men_code, pro_part_id, pro_pas_id having count(*) >= %d", implode("','", $spartIdArr), count($spartIdArr));
								$res = $B2cBase->get($table, ['distinct pme_men_code'], $twhere);
								if(!empty($res['data']))
								{
									$comWhere .= sprintf(" AND men_code not in ('%s')", implode("','", array_column($res['data'], 'pme_men_code')));
								}
							}
							else if($val == 'any')
							{
								//同一个车型一个类别有多个产品
								$table = 'bc_product_modengine join bc_product on pro_id = pme_pro_id';
								$twhere = $itemWhere.sprintf(" and concat(pro_part_id, '_', pro_pas_id) in ('%s') group by pme_men_code, pro_part_id, pro_pas_id having count(*) > 1", implode("','", $spartIdArr));
								$res = $B2cBase->get($table, ['distinct pme_men_code'], $twhere);
								$TempCodeArr = array_column($res['data'], 'pme_men_code');
								$codeArr = $codeArr === null ? $TempCodeArr: array_intersect($TempCodeArr, $codeArr);
							}
							else if($val == 'has')
							{
								$table = 'bc_product_modengine join bc_product on pro_id = pme_pro_id';
								$twhere = $itemWhere.sprintf(" and concat(pro_part_id, '_', pro_pas_id) in ('%s')", implode("','", $spartIdArr));
								$res = $B2cBase->get($table, ['distinct pme_men_code'], $twhere);
								$TempCodeArr = array_column($res['data'], 'pme_men_code');
								$codeArr = $codeArr === null ? $TempCodeArr: array_intersect($TempCodeArr, $codeArr);
							}
						}
					break;
					case 'pl_5':
						if($val == '柴油')
						{
							$comWhere .= " and mch_fuel='%柴油%'";
						}
						else if($val == '汽油')
						{
							$comWhere .= " and mch_fuel not like '%%柴油%%' and mch_cc > 0";
						}
						else if($val == '纯电')
						{
							$comWhere .= " and mch_cc = 0";
						}	
					break;
				}
			}
		}

		if($codeArr != null) $comWhere .= sprintf(" AND men_code IN ('%s')", implode("','", $codeArr));
		$Res = $ComModel->getEngineModel(['count(distinct men_code) as count'], $comWhere, true);
		$total = $Res['data']['count'];
		$partArr = [];
		if($total > 0)
		{
			switch($Params['order'])
			{
				case 'm3_atime': $order = ' order by men_atime desc'; break;
				default: $order = ' order by brand_initial, make_seq, make_initial, mod1_name, mod2_name,men_engine,men_kw,men_cc'; break;
			}
			//下载
			if(!empty($Params['export']))
			{
				ini_set('memory_limit', '4096M');
				$page = 1;
				$perPage = $total;
				$itemWhere = sprintf(" %s and pro_dfrom='' and pro_dfrom_id=0", $itemWhere);
			}

			$filed = ['men_code,brand_id, brand_name, make_id, make_name, mod1_id, mod1_name, mod2_id, mod2_name, mod2_start_year, mod2_end_year, men_cc_name,men_engine,men_kw,men_cc,men_fuel'];
			$res = $ComModel->getEngineModel($filed, sprintf("%s group by men_code %s LIMIT %d,%d", $comWhere, $order, ($page-1)*$perPage,$perPage));
			if(!empty($res['data']))
			{
				foreach($res['data'] as $v)
				{
					if(empty($v['men_cc'])) $v['men_cc'] = '';
					$v['mod2_year'] = LibFc::formatViewYear($v['mod2_start_year'], $v['mod2_end_year'], 3);
					$v['pros'] = [];
					$v['numid'] = [];
					$modelArr[$v['men_code']] = $v;
				}
				unset($res);
				$codeArr = array_keys($modelArr);
				//车系产品信息
				if(!empty($spartIdArr))
				{
					$table = 'bc_product_modengine
					join bc_product on pro_id = pme_pro_id
					join bc_product_info on pri_pro_id = pro_id';
					$where = $itemWhere.sprintf(" and pme_men_code in ('%s') and concat(pro_part_id, '_', pro_pas_id) in ('%s') group by pme_men_code, pro_id order by pri_code", implode("','", $codeArr), implode("','", $spartIdArr));
					$pres = $B2cBase->get($table, ["pme_men_code, pro_id, concat(pro_part_id, '_', pro_pas_id) spartid, pme_remark, pri_code"], $where);
					$orgModelProArr = $pres['data'];
					unset($pres);
					foreach($orgModelProArr as $v)
					{
						$modelArr[$v['pme_men_code']]['pros'][$v['spartid']][] = $v;
					}
				}
			}
		}
		//导出
		if(!empty($Params['export']) && $Params['export'] == 'modsitem')
		{
			$allArr = [];
			$headArr = ['men_code'];
			foreach($showFiled as $filed=>$fv)
			{
				if($filed == 'sparts')
				{
					foreach($spartIdArr as $spid)
					{ 
						if(!empty($supPartArr[$spid]))
						{
							$headArr[]= $supPartArr[$spid]['name'];
						}
					}
				}
				else
				{
					$headArr[]= $fv['name'];
				}
			}
			
			$allArr[] = $headArr;
			foreach($modelArr as $k=>$v)
			{
				$row = [$v['men_code']];
				foreach($showFiled as $filed=>$fv)
				{ 
					if($filed == 'sparts')
					{
						foreach($spartIdArr as $spid)
						{ 
							$fval = [];
							if(!empty($supPartArr[$spid]))
							{
								if(!empty($v['pros'][$spid]))
								{
									foreach($v['pros'][$spid] as $kkk=>$vvv)
									{
										$fval[] = empty($vvv['pme_remark']) ? $vvv['pri_code']: $vvv['pri_code'].'@'.$vvv['pme_remark'];
									}
								}
								$row[] = implode(';', $fval);
							}
							
						}
					}
					else
					{ 
						$row[] = !empty($v[$filed])?  $v[$filed]: '';
					}
				}
				$allArr[] = $row;
			}
			unset($modelArr);
			unset($orgModelProArr);
			$OthSExcel = new OthSExcel();
			$OthSExcel->writeBig($allArr, '发动机车型配件'.date('Ymd').'.xlsx', false);
			unset($allArr);
			exit;
		}
		else if(!empty($Params['export']) && $Params['export'] == 'moditemremark')
		{
			$allArr = [];
			$sortArr = [];
			
			//程序排序，不用array_multisort，对spart_name有问题
			$uniArr = [];
			foreach($orgModelProArr as $v)
			{
				$uniArr[$v['spartid']][$v['pro_id']][$v['pme_men_code']] = $v;
			}
			foreach($supPartArr as $spartid=>$sv)
			{
				if(empty($uniArr[$spartid])) continue;
				foreach($uniArr[$spartid] as $pid=>$mv)
				{
					foreach($modelArr as $m3id=>$mvv)
					{
						if(empty($mv[$m3id])) continue;
						$row = $mv[$m3id];
						$row = array_merge($row, $mvv);
						$row['spart_name'] = $sv['name'];
						$allArr[] = $row;
					}
				}
			}

			$allArr['fields'] = ['men_code'=>'men_code'];
			foreach($showFiled as $filed=>$fv)
			{ 
				if($filed == 'sparts')
				{
					$allArr['fields']['spart_name']= '零件分类';
				}
				else 
				{
					$allArr['fields'][$filed]= $fv['name'];
				}
			}
			$allArr['fields']['pri_code']= '商家编码';
			$allArr['fields']['pme_remark']= '车型备注';
			//if(count($allArr) > 30000) LibFc::ReturnData(false, '导出记录数'.count($allArr).'条(最大限制30000条)，请改变导出条件');
			unset($modelArr);
			unset($orgModelProArr);
			unset($uniArr);
			$OthSExcel = new OthSExcel();
			$OthSExcel->writeBig($allArr, '配件发动机车型备注'.date('Ymd').'.xlsx', false);
			unset($allArr);
			exit;
		}
		
		LibTpl::Set('showFiled', $showFiled);
		LibTpl::Set('spartIdArr', $spartIdArr);
		LibTpl::Set('Params', $Params);
		LibTpl::Set('supPartArr', $supPartArr);
		LibTpl::Set('pageMsg', LibPage::Show($total, $perPage, true));
		LibTpl::Set('modelArr', $modelArr);
		LibTpl::Set('title', '配件管理-品牌目录');
		LibTpl::Put('super/modelListengine.php');
	}

	//查询参考数据
	function othItemList()
	{
		$Params = $_GET;
		$proArr = [];
		$LibYpApi = new LibYpApi();

		$proSpartIdArr = [];
		if(!empty($Params['number']))
		{
			//号码查询
			$res = $LibYpApi->Get('number/superSearch', ['word'=>$Params['number']]);
			$proArr = $res['data'];
		}
		else if($Params['partid'] && !empty($Params['para']))
		{
			$partId = (int) $Params['partid'];
			//参数查询
			$B2cBase = new B2cBase();
			$res = $B2cBase->get('bc_part_param_link', ['ppl_pal_id, ppl_style'], sprintf(" and ppl_part_id=%d", $partId));
			$paraArr = array_column($res['data'], 'ppl_style', 'ppl_pal_id');
			if(!empty($paraArr))
			{
				//误差
				$wc = 10;
				if(isset($Params['wc'])) $wc = (int) $Params['wc'];
				$wc = $wc > 15? 15: $wc;
			
				$where = '';
				$table = 'yc_number_match_pro_para AS a1';
				$i = 2;
				$orderArr = [];
				foreach($Params['para'] as $palid=>$val)
				{
					$palid = (int) $palid;
					if(empty($val) || empty($paraArr[$palid])) continue;
					$table .= sprintf(" join yc_number_match_pro_para AS a%d ON a1.nmp_type=a%d.nmp_type AND a1.nmp_pro_id=a%d.nmp_pro_id AND a1.nmp_spartid=a%d.nmp_spartid", $i, $i, $i, $i);
					if($paraArr[$palid]['ppl_style'])
					{
						$val = sprintf("%.2f", $val);
						//数值
						if($wc > 0)
						{
							$where .= sprintf(" and a%d.nmp_pal_id= %d AND a%d.nmp_pal_val BETWEEN %.2f AND %.2f", $i, $palid, $i, $val*(1-$wc/100), $val*(1+$wc/100));
						}
						else
						{
							$where .= sprintf(" and a%d.nmp_pal_id= %d AND a%d.nmp_pal_val = %.2f", $i, $palid, $i, $val);
						}
						$orderArr[] = sprintf(" ABS(a%d.nmp_pal_val-%.2f)", $i, $val);
					}
					else
					{
						//字符串
						$where .= sprintf(" and a%d.nmp_pal_id= %d AND a%d.nmp_pal_val like '%%s%%'", $i, $palid, $i, LibFc::Escape($val));
					}
					$i++;
				}

				if($where != '')
				{ 
					$YpcBase = new YpcBase();
					$orderArr[] = "field(a1.nmp_type, 'yp', 'tcd', 'zhipei')";
					$where .= sprintf(" and a1.nmp_spartid like '%d_%%' order by %s", $partId, implode(',', $orderArr));
					$endTabel = sprintf("( SELECT a1.nmp_spartid as spartid, a1.nmp_type AS pro_type, a1.nmp_pro_id AS pro_id FROM %s WHERE 1=1 %s) AS a, (SELECT(@rowNum :=0)) AS b ", $table, $where);
					$res = $YpcBase->Get($endTabel, ['a.*'], ' group by pro_type, pro_id ORDER BY (@rowNum:=@rowNum+1) limit 20');
					if(!empty($res['data']))
					{
						foreach($res['data'] as $tv)
						{
							$proSpartIdArr[$tv['pro_type'].'@'.$tv['pro_id']] = $tv['spartid'];
						}
						$res = $LibYpApi->Get('super/anyItemInfo', [], ['items'=>$res['data']]);
						$proArr = $res['data'];
					}
				}
			}
		}
		if(!empty($proArr))
		{
			$allM3IdArr = [];
			$LibEncry = new LibEncry();
			$LibYpApi = new LibYpApi();
			foreach($proArr as $type=>$tv)
			{
				$res = $LibYpApi->Get('ypc/getItemYpcModelIds', [], ['type'=>$type, 'proIds'=>array_column($tv, 'pro_id'), 'etkId'=>$tv[0]['etk_id'], 'grp2_id'=>$tv[0]['grp2_id']]);
				$pmArr = $res['data'];
				foreach($tv as $pkk=>$pvv)
				{
					$pvv['brand'] = [];
					$pvv['m3'] = empty($pmArr[$pvv['pro_id']])? []: $pmArr[$pvv['pro_id']];
					$allM3IdArr = array_merge($allM3IdArr, $pvv['m3']);
					//产品类型_产品ID_对应YPC车型类别的号码ID
					$pvv['pro_uri'] = base64_encode($LibEncry->encode($type.'@'.$pvv['pro_id'].'@0@bynum@'.$pvv['etk_id'].'@'.$pvv['grp2_id'].'@'.$pvv['num'][0]['display']));
					$pvv['spartId'] = empty($proSpartIdArr[$type.'@'.$pvv['pro_id']])? '': $proSpartIdArr[$type.'@'.$pvv['pro_id']];
					$proArr[$type][$pkk] = $pvv;
				}
			}
			if(!empty($allM3IdArr))
			{
				$YpcModel = new YpcModel();
				$res = $YpcModel->getModel(3, ['m3_id, b_name'], sprintf(" and m3_id in (%s) order by b_seq, b_initial ", implode(',', $allM3IdArr)));
				$brandArr = array_column($res['data'], 'b_name', 'm3_id');

				foreach($proArr as $type=>$tv)
				{
					foreach($tv as $pkk=>$pvv)
					{
						foreach($pvv['m3'] as $vvv)
						{
							$pvv['brand'][] = $brandArr[$vvv];
						}
						$pvv['brand'] = array_unique($pvv['brand']);
						$proArr[$type][$pkk] = $pvv;
					}
				}
			}
		}

		LibTpl::Set('Params', $Params);
		LibTpl::Set('proArr', $proArr);
		LibTpl::Set('title', '参考数据-品牌目录');
		LibTpl::Put();
	}

	
	//获取产品的适用车型ID
	private function getTypeItemMod3Ids($type, $proId, $spartId = '', $mod3Id = 0)
	{
		$modelOeArr = [];
		$mod3IdArr = [];
		$YpcBase = new YpcBase();
		$res = $YpcBase->Get('yc_number_match JOIN yc_part ON part_id = nm_num_part_id', ['nm_num_id', 'part_partid_b2c'], sprintf(" and nm_type='%s' and nm_pro_id=%d limit 1", LibFc::Escape($type), $proId), true);
		if(!empty($res['data']))
		{
			$ypcNumId = $res['data']['nm_num_id'];
			if(empty($spartId)) $spartId = $res['data']['part_partid_b2c'];
		}

		if($type == 'yp')
		{
			$YpBase = new YpBase();
			$res = $YpBase->Get('yp_number', ['display'], sprintf(" and pid=%d and fid = 770", $proId));
			foreach($res['data'] as $v)
			{
				$modelOeArr[] = [ 'factory'=>'OE', 'display'=>$v['display']];
			}
		}

		if(!empty($ypcNumId))
		{
			$where = sprintf(" and num_id = %d", $ypcNumId);
			if(!empty($mod3Id)) $where .= sprintf(" and num_m3_id = %d ", $mod3Id);
			if(!empty($spartId)) $where .= sprintf(" AND part_partid_b2c = '%s'", LibFc::Escape($spartId));
			$res = $YpcBase->Get('yc_number join yp_factory on fac_id = num_fac_id join yc_part on part_id = num_part_id', ['num_id as num_fromid, fac_name as num_factory, num_display, num_format, num_info'], $where);
			foreach($res['data'] as $v)
			{
				$modelOeArr[] = [
					'factory'=>$v['num_factory'],
					'display'=>$v['num_display']
				];
			}
		}

		if(!empty($modelOeArr))
		{
			$LibYpApi = new LibYpApi();
			$res = $LibYpApi->Get('ypc/getModelByYpcNum', [], ['nums'=>$modelOeArr, 'spartId'=>$spartId]);
			$mod3IdArr = $res['data'];
		}
		else if(!empty($mod3Id))
		{
			$mod3IdArr[] = (int) $mod3Id;
		}
		return $mod3IdArr;
	}


	function getSelectData()
	{
		$Params = mvc::$URL_PARAMS;
		$arr = [];
		$dtypeArr = explode(',', $Params['dtype']);
		$where = '';
		if(!empty($Params['b_etk_id'])){
			$where .= $Params['b_etk_id'] == -1 ? " and b_etk_id IN(0, 999)" : sprintf(" and b_etk_id=%d", $Params['b_etk_id']);
		}
		if(!empty($Params['b_id'])) $where .= sprintf(" and b_id in (%s)", $Params['b_id']);
		if(!empty($Params['m_id'])) $where .= sprintf(" and m_id=%d", $Params['m_id']);
		if(!empty($Params['m1_id'])) $where .= sprintf(" and m1_id=%d", $Params['m1_id']);
		if(!empty($Params['m2_id'])) $where .= sprintf(" and m2_id=%d", $Params['m2_id']);
		//全车件品牌限制
		$B2cShop = new B2cShop();
		$brandRes = $B2cShop->getShopBrand($_SESSION['_shopid']);
		$lWhere ='';
		if($brandRes['data']){
			$lWhere = sprintf(" AND b_id in (%s)",implode(',',$brandRes['data']));
		}
		
		$YpcModel = new YpcModel();
		foreach($dtypeArr as $dtype)
		{
			switch($dtype)
			{
				case 'brand':
					$res =$YpcModel->Get('yp_brand', ['b_id as id','b_name as name','b_initial as initial'], $where.$lWhere.' order by b_initial');
					$arr[$dtype] = $res['data'];
				break;
				case 'make':
					$table = 'yp_model1 JOIN yp_make ON m1_m_id=m_id JOIN yp_brand ON m1_b_id = b_id';
					$res =$YpcModel->Get($table, ['m_id as id','m_name as name','m_initial as initial'], $where.$lWhere.' group by m_id order by m_initial');
					$arr[$dtype] = $res['data'];
				break;
				case 'mod1':
					$table = 'yp_model1 JOIN yp_make ON m1_m_id=m_id JOIN yp_brand ON m1_b_id = b_id';
					$filed = !empty($Params['m_id']) ? ['m1_id', 'm1_name']: ['m1_id', 'concat(m_name, "  ", m1_name) as m1_name'];
					$res =$YpcModel->Get($table, $filed, $where.$lWhere.' order by m_name, m1_name');
					$arr[$dtype] = $res['data'];
				break;
				case 'mod2':
					$res = $YpcModel->GetModel(2, ['m2_id','m2_name', 'm2_start_year', 'm2_end_year'], $where.$lWhere.' order by m2_name, m2_start_year');			
					foreach($res['data'] as $v)
					{
						if(!empty($v['m2_start_year']) || !empty($v['m2_end_year']))
							$v['m2_name'] .= ' '.LibFc::formatViewYear($v['m2_start_year'], $v['m2_end_year'], 3);
						$arr[$dtype][] = $v;
					}
				break;
				case 'mod3':
					$res = $YpcModel->GetModel(3, ['m3_id','m3_name', 'm3_start_year', 'm3_start_month', 'm3_end_year', 'm3_end_month'], $where.$lWhere.' order by m3_name, m3_start_year');			
					foreach($res['data'] as $v)
					{
						if(!empty($v['m3_start_year']) || !empty($v['m3_end_year']))
							$v['m3_name'] .= ' '.LibFc::formatViewYear($v['m3_start_year'], $v['m3_end_year'], 3);
						$arr[$dtype][] = $v;
					}
				break;
				case 'ccname':
					$res = $YpcModel->GetModel(3, ['m3_cc_name'], $where.$lWhere.' group by m3_cc_name order by m3_cc_name');
					$arr[$dtype] = array_column($res['data'], 'm3_cc_name');
				break;
				case 'engine':
					$res = $YpcModel->GetModel(3, ['m3_engine'], $where.$lWhere.' group by m3_engine order by m3_engine');
					$arr[$dtype] = array_column($res['data'], 'm3_engine');
				break;
				case 'drive':
					$arr[$dtype] = [];
					$table = 'yp_model3
					LEFT JOIN yp_model2 ON m3_m2_id = m2_id
					LEFT JOIN yp_model1 ON m2_m1_id = m1_id
					LEFT JOIN yp_make ON m1_m_id = m_id
					LEFT JOIN yp_brand ON m1_b_id = b_id';
					$res =$YpcModel->Get($table, ['m3_drive_short'], $where.$lWhere.' and m3_drive_short !="" group by m3_drive_short order by m3_drive_short');
					$arr[$dtype] = array_column($res['data'], 'm3_drive_short');
				break;
			}
		}
		LibFc::ajaxJsonEncode(['status'=>true, 'data'=>$arr]);
	}

	//根据车型和零件ID查询产品
	function searchModelSpart()
	{
		$Params = mvc::$URL_PARAMS;
		$proBaseArr = [];
		$proArr = [];
		if(!empty($Params['spartId']) && !empty($Params['mod3Id']))
		{
			//车型车型是否有OE号码
			$YpcBase = new YpcBase();
			$where = sprintf(" and num_m3_id = %d AND part_partid_b2c = '%s'",$Params['mod3Id'], LibFc::Escape($Params['spartId']));
			$res = $YpcBase->Get('yc_number join yp_factory on fac_id = num_fac_id join yc_part on part_id = num_part_id', ['num_id, fac_id, part_id, num_format, fac_name, num_display, num_info, num_format'], $where);
			$proBaseArr = $res['data'];
			if(!empty($proBaseArr))
			{
				$LibYpApi = new LibYpApi();
				$res = $LibYpApi->Get('number/ypcNumberSearch', [], ['mod3_id'=>$Params['mod3Id'], 'nums'=>$proBaseArr]);
				$proArr = $res['data'];

				$LibEncry = new LibEncry();
				//产品ID加密
				foreach($proBaseArr as $nk=>$nv)
				{
					$nv['items'] = [];
					$nv['ypProIds'] = [];
					if(!empty($proArr[$nv['num_id']]))
					{
						foreach($proArr[$nv['num_id']] as $tk=>$tv)
						{
							if($tv['type'] == 'yp') $nv['ypProIds'][] = $tv['pro_id'];
							//产品类型_产品ID_对应YPC车型类别的号码ID
							$tv['pro_uri'] = base64_encode($LibEncry->encode($tv['type'].'@'.$tv['pro_id'].'@'.$nv['num_id']));
							$nv['items'][$tk] = $tv;
							
						}
					}
					$nv['ypProIds'] = array_unique($nv['ypProIds']);
					$nv['numId'] = base64_encode($LibEncry->encode($nv['num_id']));
					$nv['ypProId'] = count($nv['ypProIds']) == 1? base64_encode($LibEncry->encode($nv['ypProIds'][0])) : '';
					$proBaseArr[$nk] = $nv;
				}
			}
		}
		LibTpl::Set('Params', $Params);
		LibTpl::Set('proBaseArr', $proBaseArr);
		LibTpl::Set('proArr', $proArr);
		$html = LibTpl::Fetch();
		LibFc::ajaxJsonEncode(['status'=>true, 'data'=>$html]);
	}


	//号码查询参考配件
	function searchOthItems()
	{
		$Params = mvc::$URL_PARAMS;
		$proArr = [];
		if(!empty($Params['number']))
		{
			$LibYpApi = new LibYpApi();
			$res = $LibYpApi->Get('number/superSearch', ['word'=>$Params['number']]);
			$proArr = $res['data'];
			
			$LibEncry = new LibEncry();
			foreach($proArr as $type=>$tv)
			{
				foreach($tv as $pkk=>$pvv)
				{
					//产品类型_产品ID_对应YPC车型类别的号码ID
					$proArr[$type][$pkk]['pro_uri'] = base64_encode($LibEncry->encode($type.'@'.$pvv['pro_id'].'@0@bynum'));
				}
			}

			if(!empty($proArr))
			{
				$allM3IdArr = [];
				$LibEncry = new LibEncry();
				$LibYpApi = new LibYpApi();
				foreach($proArr as $type=>$tv)
				{
					$res = $LibYpApi->Get('ypc/getItemYpcModelIds', [], ['type'=>$type, 'proIds'=>array_column($tv, 'pro_id'), 'etkId'=>$tv[0]['etk_id'], 'grp2_id'=>$tv[0]['grp2_id']]);
					$pmArr = $res['data'];
					foreach($tv as $pkk=>$pvv)
					{
						$pvv['brand'] = [];
						$pvv['m3'] = empty($pmArr[$pvv['pro_id']])? []: $pmArr[$pvv['pro_id']];
						$allM3IdArr = array_merge($allM3IdArr, $pvv['m3']);
						//产品类型_产品ID_对应YPC车型类别的号码ID
						$pvv['pro_uri'] = base64_encode($LibEncry->encode($type.'@'.$pvv['pro_id'].'@0@bynum'));
						$pvv['spartId'] = empty($proSpartIdArr[$type.'@'.$pvv['pro_id']])? '': $proSpartIdArr[$type.'@'.$pvv['pro_id']];
						$proArr[$type][$pkk] = $pvv;
					}
				}
				if(!empty($allM3IdArr))
				{
					$YpcModel = new YpcModel();
					$res = $YpcModel->getModel(3, ['m3_id, b_name'], sprintf(" and m3_id in (%s) order by b_seq, b_initial ", implode(',', $allM3IdArr)));
					$brandArr = array_column($res['data'], 'b_name', 'm3_id');

					foreach($proArr as $type=>$tv)
					{
						foreach($tv as $pkk=>$pvv)
						{
							foreach($pvv['m3'] as $vvv)
							{
								$pvv['brand'][] = $brandArr[$vvv];
							}
							$pvv['brand'] = array_unique($pvv['brand']);
							$proArr[$type][$pkk] = $pvv;
						}
					}
				}
			}

		}
		LibTpl::Set('Params', $Params);
		LibTpl::Set('proArr', $proArr);
		$html = LibTpl::Fetch();
		LibFc::ajaxJsonEncode(['status'=>true, 'data'=>$html]);
	}
	

	//根据您第三方配件匹配号码
	function ajaxGetProHideNum()
	{
		$proArr['hidenum'] = [];
		$LibEncry = new LibEncry();
		if(!empty($_POST['hideNum']))
		{
			$hideNum = $LibEncry->decode($_POST['hideNum']);
			$proArr['hidenum'] = json_decode($hideNum, true);
		}

		$arr['oldCount'] = count($proArr['hidenum']);

		if(!empty($_POST['fromPro']))
		{
			$numi = 0;
			//产品类型yp@产品ID6383@车型号码ID0@产品来源类型bynum 
			$t = $LibEncry->decode(base64_decode($_POST['fromPro']));
			$tArr = explode('@', $t);
			if(!empty($tArr[0]) && !empty($tArr[1]))
			{
				$fromType = $tArr[0];
				$fromProId = $tArr[1];

				//宜配产品获取OE号码用于车型匹配
				if($fromType == 'yp')
				{
					$YpBase = new YpBase();
					$res = $YpBase->Get('yp_number AS n JOIN yp_factory AS f ON n.fid=f.fid', ['f.factory, n.display'], sprintf(" and n.pid=%d", $fromProId));
					foreach($res['data'] as $v)
					{
						$proArr['hidenum'][] = [
							'num_factory'=>$v['factory'],
							'num_display'=>$v['display'],
							'num_from'=>'yp',
							'num_fromid'=>$fromProId
						];
						if($v['factory'] == 'OE') $modelOeArr[] = [ 'factory'=>'OE', 'display'=>$v['display']];
					}
				}
				
				if($fromType == 'tcd' || stripos($fromType, 'oth') !== false || $tArr[3] == 'bynum')
				{
					$LibYpApi = new LibYpApi();
					$res = $LibYpApi->Get('number/itemNumber', ['type'=>$fromType, 'proId'=>$fromProId, 'numtype'=>'main']);
					foreach($res['data'] as $v)
					{
						$proArr['hidenum'][] = [
							'num_factory'=>$v['oe']? 'OE':$v['factory'],
							'num_display'=>$v['display'],
							'num_from'=>$fromType,
							'num_fromid'=>$fromProId
						];
					}
				}

				//反查车型的对应零件的号码
				$YpcBase = new YpcBase();
				$table = 'yc_number_match
				JOIN yc_part ON part_id = nm_num_part_id
				JOIN yc_number on  nm_num_id = num_id
				JOIN yp_factory on fac_id = num_fac_id';
				$filed = ['num_id, fac_name, num_display, num_info'];
				$res = $YpcBase->Get($table, $filed, sprintf(" and nm_type='%s' and nm_pro_id=%d group by num_id", LibFc::Escape($fromType), $fromProId));
				foreach($res['data'] as $vv)
				{
					$proArr['hidenum'][] = [
						'num_factory'=>$vv['fac_name'],
						'num_display'=>$vv['num_display'],
						'num_from'=>$fromType,
						'num_fromid'=>$fromProId,
						'num_info'=>$vv['num_info']
					];
				}
				
			}
		}

		//去重加密
		$numArr = [];
		foreach($proArr['hidenum'] as $k=>$v)
		{
			$numArr[$v['num_factory'].'@'.LibFc::FormatNum($v['num_display'])] = $v;
		}
		$numArr = array_values($numArr);
		$arr['newCount'] = count($numArr);
		$arr['hidenum'] = $LibEncry->encode(json_encode($numArr));
		LibFc::ajaxJsonEncode(['status'=>true, 'data'=>$arr]);
	}

	//根据您第三方配件匹配参数
	function ajaxMatchOthProPara()
	{
		$arr = [];
		if(!empty($_POST['fromPro']))
		{
			//产品类型yp@产品ID6383@车型号码ID0@产品来源类型bynum 
			$LibEncry = new LibEncry();
			$t = $LibEncry->decode(base64_decode($_POST['fromPro']));
			$tArr = explode('@', $t);
			//宜配产品 TCD产品数据
			if(!empty($tArr[0]) && !empty($tArr[1]))
			{
				$fromType = $tArr[0];
				$fromProId = $tArr[1];
				if(stripos($fromType, 'oth') === false)
				{
					$LibYpApi = new LibYpApi();
					$res = $LibYpApi->Get('b2c/getPartParaByAny', ['partId'=>$_POST['spartId'], 'type'=>$fromType, 'proId'=>$fromProId]);
					$arr = array_column($res['data'], 'val', 'pal_id');
				}
			}
		}
		LibFc::ajaxJsonEncode(['status'=>true, 'data'=>$arr]);
	}



	//发布配件
	function publish()
	{
		$Params = mvc::$URL_PARAMS;
		$B2cPart = new B2cPart();
		$B2cProduct = new B2cProduct();
		$B2cBase = new B2cBase();
		$LibYpApi = new LibYpApi();
		$YpcBase = new YpcBase();
		$LibEncry = new LibEncry();
		$getLastParam = false;
		$numi = 0;
		if(!empty($_POST['pro']))
		{
			$baseArr = $_POST['pro'];
			if(!empty($_POST['shopBrand']))
			{
				$B2cBrand = new B2cBrand();
				$res =$B2cBrand->addShopBrand($_SESSION['_shopid'], $_POST['shopBrand']);
				$baseArr['pro_prb_id'] = (int) $res['data'];
			}
			$baseArr['pro_shop_id'] = $_SESSION['_shopid'];
			$baseArr['pro_smt_code'] = $_POST['modtype'];
			if($_POST['info']['pri_keyword']) $_POST['info']['pri_keyword']=LibFc::fromatKeyword($_POST['info']['pri_keyword']);
			$dataArr = [
				'base'=>$baseArr,	
				'info'=>$_POST['info'],	
				'imgs'=>$_POST['imgs'],	
				'param'=>$_POST['param'],
				'nums'=>[],
				'shopSort' => explode(',', $_POST['shopSort'])
			];
			if(empty(mvc::$cfg['isGzhShop']) && !empty(mvc::$cfg['isSuper']) && mvc::$cfg['hasModule'] =='all'){
				$dataArr['base']['pro_user_discount'] = 'Y';
			}
			if($dataArr['base']['pro_user_discount'] != 'Y') $dataArr['base']['pro_user_discount'] = 'N';
			if($dataArr['base']['pro_promoted'] != 'Y') $dataArr['base']['pro_promoted'] = 'N';
			if(empty($dataArr['info']['pri_invoice'])) $dataArr['info']['pri_invoice'] = 0;
			if(empty($dataArr['info']['pri_warranty'])) $dataArr['info']['pri_warranty'] = 0;
			if(empty($dataArr['info']['pri_return_promise'])) $dataArr['info']['pri_return_promise'] = 0;

			$dataArr[$baseArr['pro_smt_code']] = [];
			switch($baseArr['pro_smt_code'])
			{
				case 'all':
					$dataArr['modall'] = [];
					if(!empty($_POST['modall']['mod']) && is_array($_POST['modall']['mod']))
					{
						foreach($_POST['modall']['mod'] as $mk=>$mv)
						{
							$dataArr['modall'][] = ['pml3_mod3_id'=>$mv, 'pml3_remark'=>$_POST['modall']['remark'][$mk]];
						}
					}
				break;
				case 'chassis':
					$dataArr['modchassis'] = [];
					if(!empty($_POST['modchassis']['mod']) && is_array($_POST['modchassis']['mod']))
					{
						foreach($_POST['modchassis']['mod'] as $mk=>$mv)
						{
							$dataArr['modchassis'][] = ['pmc_mch_code'=>$mv, 'pmc_remark'=>$_POST['modchassis']['remark'][$mk]];
						}
					}
				break;
				case 'engine':
					$dataArr['modengine'] = [];
					if(!empty($_POST['modengine']['mod']) && is_array($_POST['modengine']['mod']))
					{
						foreach($_POST['modengine']['mod'] as $mk=>$mv)
						{
							$dataArr['modengine'][] = ['pme_men_code'=>$mv, 'pme_remark'=>$_POST['modengine']['remark'][$mk]];
						}
					}
				break;
			}
		
            //号码'nums'
			$mainNum = isset($_POST['mainNum'])? $_POST['mainNum']: 0;
			if(!empty($_POST['num']))
			{
				foreach($_POST['num'] as $k=>$v)
				{
					if(trim($v['factory']) != '' && trim($v['display']) != ''&&preg_match('/\w+/',trim($v['display'])))
					{
						$dataArr['nums'][] = [
							'num_factory'=>$v['factory'],
							'num_display'=>$v['display'],
							'num_show'=>1,
							'num_from'=>'',
							'num_fromid'=>0,
							'num_ismain'=> $mainNum == $k? 1: 0,
							'num_key'=>$k
						];
					}
				}
			}

			//追加隐藏的号码
			$delHideNum = 1;
			if(!empty($_POST['hidenum']))
			{
				$LibEncry = new LibEncry();
				$hideNum = $LibEncry->decode($_POST['hidenum']);
				$hideNum = json_decode($hideNum, true);
				if(!empty($hideNum) && is_array($hideNum))
				{
					$delHideNum = -1;
					foreach($hideNum as $k=>$v)
					{
						$v['num_show'] = 0;
						$dataArr['nums'][] = $v;
					}
				}
			}


			//追加车型库号码
			if(!empty($_POST['ypcnum']))
			{
				$LibEncry = new LibEncry();
				$ypcNumArr = [];
				foreach($_POST['ypcnum'] as $v)
				{
					$t = json_decode($LibEncry->decode($v), true);
					if(!empty($t['num_display']) && !empty($t['num_factory']) && !empty($t['num_fromid']))
					{
						$dataArr['nums'][] = [
							'num_factory'=>$t['num_factory'],
							'num_display'=>$t['num_display'],
							'num_from'=>'ypc',
							'num_show'=>0,
							'num_fromid'=>$t['num_fromid'],
							'num_info'=>$t['num_info']
						];
					}
				}
			}

			$oriTpl='';
			
			if(!empty($_POST['proId']))
			{
				$this->checkRule('PC02');
				$proId = $_POST['proId'];
				//获取原来的tpl id
				$orTplData=$B2cProduct->get('bc_product',['pro_ppt_id'],sprintf(' and pro_id=%d and pro_shop_id=%d',$proId,$_SESSION['_shopid']),true);
				$oriTpl = (int) $orTplData['data']['pro_ppt_id'];
				$B2cProduct->setProduct($_SESSION['_shopid'], $proId, $dataArr);
				//删除隐藏的号码
				if($delHideNum === 1) $B2cProduct->delProductHideYpNum($_SESSION['_shopid'], $proId);

			}
			else
			{
				// print_r($dataArr);die;
				$this->checkRule('PC01');
				$res = $B2cProduct->addProduct($dataArr,$_SESSION['_shopid']);
				$proId = $res['data'];
			}
			// print_r($_POST);exit();
			if($_POST['pro']['pro_ppt_id'])
			{
				//修改自定义参数
				$B2cProduct->setShopParam($_SESSION['_shopid'],$proId,$_POST['pro']['pro_ppt_id'],$_POST['paramVal'],$_POST['paramLabel'],$_POST['paramUnit'],$oriTpl);
			}
			//代理商同步给其他
			$prosynData = [
				'shopSort' => $dataArr['shopSort']?array_filter($dataArr['shopSort']):[],
				'partId' => [$dataArr['base']['pro_part_id']],
				'prbId' => $dataArr['base']['pro_prb_id']
			];
			$B2cProduct->setProSynUpdate($_SESSION['_shopid'],$proId,$prosynData);
			$url  =mvc::$cfg['SELF_URI'].'super/publish?proId='.$proId;
			LibTpl::Success('保存成功', $url, 2);
		}

		$res = $B2cPart->getShopSuperSPart($_SESSION['_shopid']);
		$supPartArr = [];
        foreach($res['data'] as $v)
        {
			if(empty($supPartArr[$v['part_id']]))
				$supPartArr[$v['part_id']] = ['part_id' => $v['part_id'], 'part_name' => $v['part_name']];

			$supPartArr[$v['part_id']]['son'][] = ['pas_id' => $v['id'], 'pas_name' => $v['name']];
        }
		LibTpl::Set('supPartArr', $supPartArr);
		
		$proArr = [
			'base'=>[],
			'nums'=>[],
			'ypcnums'=>[],
			'hidenum'=>[],
			'modall'=>[],
			'modchassis'=>[],
			'modengine'=>[],
		];
		
		$modelOeArr = [];

		$res = $B2cProduct->get('sh_modtype', ['smt_code', 'smt_name'], ' order by smt_seq');
		LibTpl::Set('modTypeArr', array_column($res['data'], null, 'smt_code'));
		
		$copyProId = 0;
		if(!empty($Params['proId']))
		{
			$proId = (int) $Params['proId'];
		}
		else if(!empty($Params['copyProId']))
		{
			$copyProId = (int) $Params['copyProId'];
			$proId = $copyProId;
		}

		if($proId > 0)
		{
			//已有产品的维护
			$res = $B2cProduct->getProduct(['*'], sprintf(" and pro_id = %d and pro_shop_id=%d", $proId, $_SESSION['_shopid']), true);
			if(empty($res['data']))
			{
				$proId = 0;
				$copyProId = 0;
			}
			else
			{
				$proArr['base'] = $res['data'];
				//找分类最后编辑的有自定义参数产品的模板
				$feild = ['prpv_prl_id', 'prpv_pru_id', 'prpv_value','prl_name','pru_name'];
				$res=$B2cBase->get('bc_product_para_val join bc_product on pro_id= prpv_pro_id left join bc_product_label on prl_id=prpv_prl_id left join bc_product_unit on pru_id=prpv_pru_id', $feild, sprintf(" and pro_id=%d and pro_ppt_id =%d and pro_shop_id=%d and (prpv_value is not null and prpv_value!='')", $proId, $proArr['base']['pro_ppt_id'], $_SESSION['_shopid']));
				
				if(empty($res['data'])){
					$getLastParam = true;
				}
			}
		}
		else 
		{
			if(!empty($Params['spartId']))
			{	
				//新增产品
				$proArr['base']['spart_id'] = $Params['spartId'];
				$t = explode('_', $Params['spartId']);
				$proArr['base']['pro_part_id'] = (int) $t[0];
				$proArr['base']['pro_pas_id'] = (int) $t[1];
				$res = $B2cBase->get('bc_part_tree  join bc_part on part_id=pt_part_id', ['pt_part_id', 'pt_path'], sprintf(" and pt_part_id=%d ", $proArr['base']['pro_part_id']), true);
		
				if(!empty($res['data'])){
					
					$proArr['base']['pro_part_path'] = $res['data']['pt_path'].','.$res['data']['pt_part_id'];
				}
				
			}
			else
			{
				//找最后一次增加的产品类别
				$res = $B2cProduct->getProduct(['pro_part_path,pro_part_id, pro_pas_id, pro_ppt_id'], sprintf(" and pro_shop_id=%d order by pro_id desc limit 1", $_SESSION['_shopid']), true);
				$proArr['base'] = $res['data'];
				if(!empty($res['data'])){
					$proArr['base']['pro_part_path'] = $res['data']['pro_part_path'];
				}
			}
			$getLastParam = true;	
			//添加时默认为系统设置
			$proArr['base']['pro_smt_code']=$this->supData['shop_smt_code'];
			//添加时默认为上架
			$proArr['base']['pro_status'] = 1;
			$ypcNumId = 0;
			//从某个配件产品参考进来的
			$LibEncry = new LibEncry();
			if(!empty($Params['fromPro']))
			{
				//产品类型yp@产品ID6383@车型号码ID0@产品来源类型bynum 
				$t = $LibEncry->decode(base64_decode($Params['fromPro']));
				$tArr = explode('@', $t);

				$comToYpProId = !empty($Params['ypProId']) ? (int) $LibEncry->decode(base64_decode($Params['ypProId'])): 0;

				//宜配产品 TCD产品数据
				if(!empty($tArr[0]) && !empty($tArr[1]))
				{
					$fromType = $tArr[0];
					$fromProId = $tArr[1];

					$res = $LibYpApi->Get('ypc/getItemYpcModelIds', [], ['type'=>$fromType, 'proIds'=>[$fromProId], 'etkId'=>$tArr[4], 'grp2_id'=>$tArr[5]]);
					foreach($res['data'][$fromProId] as $tm3)
					{
						$proArr['modall'][$tm3] = ['mod3_id'=>$tm3, 'remark'=>'','chk'=>1];
					}

					//宜配产品获取OE号码用于车型匹配
					if($fromType == 'yp')
					{
						$YpBase = new YpBase();
						$res = $YpBase->Get('yp_number AS n JOIN yp_factory AS f ON n.fid=f.fid', ['f.factory, n.display'], sprintf(" and n.pid=%d", $fromProId));
						foreach($res['data'] as $v)
						{
							$proArr['hidenum'][] = [
								'num_factory'=>$v['factory'],
								'num_display'=>$v['display'],
								'num_from'=>'yp',
								'num_fromid'=>$fromProId
							];
							if($v['factory'] == 'OE') $modelOeArr[] = [ 'factory'=>'OE', 'display'=>$v['display']];
						}
					}
					else if($comToYpProId > 0)
					{
						$res = $LibYpApi->Get('number/getOthToYpSameOe', ['type'=>$fromType, 'proId'=>$fromProId, 'ypProId'=>$comToYpProId]);
						foreach($res['data'] as $v)
						{
							$proArr['hidenum'][] = [
								'num_factory'=>$v['factory'],
								'num_display'=>$v['display'],
								'num_from'=>'yp',
								'num_fromid'=>$comToYpProId
							];
							if($v['factory'] == 'OE') $modelOeArr[] = [ 'factory'=>'OE', 'display'=>$v['display']];
						}
					}
					
					if(stripos($fromType, 'oth') !== false || $tArr[3] == 'bynum')
					{
						if($fromType == 'etk'){
							$proArr['nums'][] = [
								'num_id'=>--$numi,
								'num_ismain'=>1,
								'num_factory'=>'OE',
								'num_display'=>$tArr[6],
								'num_format'=>LibFc::FormatNum($tArr[6]),
								'num_from'=>$fromType,
								'num_show'=>1,
								'num_fromid'=>$fromProId
							];
						}else{
							$res = $LibYpApi->Get('number/itemNumber', ['type'=>$fromType, 'proId'=>$fromProId, 'numtype'=>'main']);
							foreach($res['data'] as $v)
							{
								$proArr['nums'][] = [
									'num_id'=>--$numi,
									'num_ismain'=>1,
									'num_factory'=>$v['oe']? 'OE':$v['factory'],
									'num_display'=>$v['display'],
									'num_format'=>LibFc::FormatNum($v['display']),
									'num_from'=>$fromType,
									'num_show'=>1,
									'num_fromid'=>$fromProId
								];
							}
						}
					}

					//反查车型的对应零件的号码
					$table = 'yc_number_match
					JOIN yc_part ON part_id = nm_num_part_id
					JOIN yc_number on  nm_num_id = num_id
					JOIN yp_factory on fac_id = num_fac_id';
					$filed = ['num_id, fac_name, num_display, num_info, part_partid_b2c'];
					$res = $YpcBase->Get($table, $filed, sprintf(" and nm_type='%s' and nm_pro_id=%d group by num_id", LibFc::Escape($fromType), $fromProId));
					foreach($res['data'] as $vv)
					{
						$proArr['hidenum'][] = [
							'num_factory'=>$vv['fac_name'],
							'num_display'=>$vv['num_display'],
							'num_from'=>$fromType,
							'num_fromid'=>$fromProId,
							'num_info'=>$vv['num_info']
						];
						$modelOeArr[] = [
							'factory'=>$vv['fac_name'],
							'display'=>$vv['num_display']
						];
						if(empty($proArr['base']['spart_id'])) $proArr['base']['spart_id'] = $vv['part_partid_b2c'];
					}
					
				}
				if(!empty($tArr[2])) $ypcNumId = (int) $tArr[2];
			}

			if(!empty($Params['numId'])) $ypcNumId = $LibEncry->decode(base64_decode($Params['numId']));

			if(!empty($ypcNumId))
			{
				$where = sprintf(" and num_id = %d", $ypcNumId);
				if(!empty($Params['mod3Id'])) $where .= sprintf(" and num_m3_id = %d ",$Params['mod3Id']);
				if(!empty($proArr['base']['spart_id'])) $where .= sprintf(" AND part_partid_b2c = '%s'", LibFc::Escape($proArr['base']['spart_id']));
				$res = $YpcBase->Get('yc_number join yp_factory on fac_id = num_fac_id join yc_part on part_id = num_part_id', ['num_id as num_fromid, fac_name as num_factory, num_display, num_format, num_info'], $where);
				foreach($res['data'] as $v)
				{
					$v['encode'] = $LibEncry->encode(json_encode($v));
					$proArr['ypcnums'][] = $v;

					$modelOeArr[] = [
						'factory'=>$v['num_factory'],
						'display'=>$v['num_display']
					];
				}
			}

			if(!empty($modelOeArr))
			{
				/*$res = $LibYpApi->Get('ypc/getModelByYpcNum', [], ['nums'=>$modelOeArr, 'spartId'=>$proArr['base']['spart_id']]);
				$proArr['modelId']['m3'] = $res['data'];*/
			}

			if(!empty($Params['mod3Id']))
			{
				$proArr['modall'][$Params['mod3Id']] = ['mod3_id'=>$Params['mod3Id'], 'remark'=>'','chk'=>1];
			}
			if(!empty($Params['mch_code']))
			{
				$proArr['modchassis'][$Params['mch_code']] = ['mch_code'=>$Params['mch_code'], 'remark'=>'','chk'=>1];
				$proArr['base']['pro_smt_code'] = 'chassis';
			}
			if(!empty($Params['men_code']))
			{
				$proArr['modengine'][$Params['men_code']] = ['men_code'=>$Params['men_code'], 'remark'=>'','chk'=>1];
				$proArr['base']['pro_smt_code'] = 'engine';
			}
			
		}

		//找分类最后编辑的有自定义参数产品的模板
		if($getLastParam){
			$table = 'bc_product_para_val 
			join bc_product on pro_id= prpv_pro_id';
			$feild = ['pro_ppt_id'];
			$res=$B2cBase->get($table, $feild, sprintf(" and pro_part_id=%d and pro_shop_id=%d and (prpv_value is not null and prpv_value!='') order by pro_id desc", $proArr['base']['pro_part_id'], $_SESSION['_shopid']),true);
			$proArr['base']['pro_ppt_id']  = $res['data']['pro_ppt_id'];
		}
		//自定义参数模板
		$selfParamArr = [];
		if(!empty($proArr['base']['pro_ppt_id']))
		{
			$fieldArr = ['pptl_ppt_id','prl_id','pru_id','pptl_seq','prl_name','pru_name'];
            $res = $B2cBase->get('bc_product_para_tpl_link left join bc_product_label on prl_id=pptl_prl_id left join bc_product_unit on pru_id=pptl_pru_id',$fieldArr,sprintf(' and pptl_ppt_id=%d order by pptl_seq, prl_name', $proArr['base']['pro_ppt_id']));
			$selfParamArr = array_column($res['data'], null,'prl_id');
		}
		
		if(!empty($proArr['base']['pro_id']))
		{
			$proId = $proArr['base']['pro_id'];
			//有值的
			$feild = ['prpv_prl_id', 'prpv_pru_id', 'prpv_value','prl_name','pru_name'];
			$res=$B2cBase->get('bc_product_para_val join bc_product on pro_id= prpv_pro_id left join bc_product_label on prl_id=prpv_prl_id left join bc_product_unit on pru_id=prpv_pru_id', $feild, sprintf(" and pro_id=%d and pro_ppt_id =%d and pro_shop_id=%d and (prpv_value is not null or prpv_value!='')", $proId, $proArr['base']['pro_ppt_id'], $_SESSION['_shopid']));
			$oldValArr = [];
			$oldValArr=array_column($res['data'], null,'prpv_prl_id');
			if(count($oldValArr))
			{
				foreach ($oldValArr as $k => $v)
				{
					$selfParamArr[$k]=isset($selfParamArr[$k])?array_merge($v,$selfParamArr[$k]):$v;
				}
			}
			$proArr['base']['spart_id'] = $proArr['base']['pro_part_id'].'_'.$proArr['base']['pro_pas_id'];
			
			//图片
			$res = $B2cProduct->getProductPic($proId, true);
			$proArr['imgs'] = $res['data'];

			//自有号码
			$res = $B2cBase->get('bc_number', ['num_id', 'num_factory', 'num_display', 'num_format', 'num_ismain'], sprintf(" and num_self=0 and num_show=1 and num_pro_id=%s order by num_factory, num_format", $proId));
			$proArr['nums'] = $res['data'];

			//隐藏的号码
			$res = $B2cBase->get('bc_number', ['num_factory, num_display, num_from, num_fromid'], sprintf(" and num_show=0 and num_from='yp' and num_pro_id=%s", $proId));
			$proArr['hidenum'] = $res['data'];

			//车型库号码
			$res = $B2cBase->get('bc_number', ['num_id', 'num_factory', 'num_display', 'num_format', 'num_fromid', 'num_info'], sprintf(" and num_self=0 and num_show=0 and num_pro_id=%s and num_from='ypc' order by num_factory, num_format", $proId));
			foreach($res['data'] as $v)
			{
				$v['encode'] = $LibEncry->encode(json_encode($v));
				$proArr['ypcnums'][] = $v;
			}
			
			if($proArr['base']['pro_smt_code'] == 'chassis')
			{
				//底盘模式的车型
				$res = $B2cBase->get('bc_product_modchassis', ['pmc_mch_code as mch_code, pmc_remark as remark, 1 chk'], sprintf(" and pmc_pro_id=%d", $proId));
				$proArr['modchassis'] = array_column($res['data'], null, 'mch_code');
			}
			else if($proArr['base']['pro_smt_code'] == 'engine')
			{
				//发动机模式的车型
				$res = $B2cBase->get('bc_product_modengine', ['pme_men_code as men_code, pme_remark as remark, 1 chk'], sprintf(" and pme_pro_id=%d", $proId));
				$proArr['modengine'] = array_column($res['data'], null, 'men_code');
			}
			else
			{
				//全车件模式
				$res = $B2cBase->get('bc_product_model3_link', ['pml3_mod3_id as mod3_id, pml3_remark as remark, 1 chk'], sprintf(" and pml3_pro_id=%d", $proId));
				$proArr['modall'] = array_column($res['data'], null, 'mod3_id');
				if(!empty($proArr['modall'])) $proArr['base']['pro_smt_code'] = 'all';
			}
		}

		//车型模式
		if(empty($proArr['base']['pro_smt_code']))
		{
			if(!empty($proArr['base']['pro_part_id']))
			{
				$res = $B2cBase->get('bc_product', ['pro_smt_code'], sprintf(" and pro_shop_id=%d and pro_part_id=%d and pro_smt_code != '' order by pro_id desc limit 1",$_SESSION['_shopid'], $proArr['base']['pro_part_id']), true);
				if(!empty($res['data']['pro_smt_code'])) $proArr['base']['pro_smt_code'] = $res['data']['pro_smt_code'];
			}

			if(empty($proArr['base']['pro_smt_code']))
			{
				$res = $B2cBase->get('sh_shop', ['shop_smt_code'], sprintf(" and shop_id=%d limit 1",$_SESSION['_shopid']), true);
				if(!empty($res['data']['shop_smt_code'])) $proArr['base']['pro_smt_code'] = $res['data']['shop_smt_code'];
			}
		}
		

		//自动获取上一次添加产品的的配件品牌
		if(empty($proArr['base']['prb_name']))
		{
			$twhere = sprintf(" and pro_shop_id=%d order by pro_id desc limit 1", $_SESSION['_shopid']);
			$res = $B2cBase->get('bc_product join bc_probrand on pro_prb_id=prb_id', ['prb_name'], $twhere, true);
			if(!empty($res['data'])) $proArr['base']['prb_name_last'] = $res['data']['prb_name'];
		}
		
		//哪些号码已经查询过，直接显示
		if(!empty($proArr['ypcnums']))
		{
			$res = $B2cBase->get('sh_ypc_number', ['syn_format'], sprintf(" and syn_shop_id = %d and syn_format in ('%s')", $_SESSION['_shopid'], implode("','", array_column($proArr['ypcnums'], 'num_format'))));
			if(!empty($res['data']))
			{
				$hasArr = array_column($res['data'], 'syn_format');
				
				foreach($proArr['ypcnums'] as $k=>$v)
				{
					$proArr['ypcnums'][$k]['has'] = in_array($v['num_format'], $hasArr)? 1 : 0;
				}
			}
		}

		$imgCount = !empty($proArr['imgs']) ? count($proArr['imgs']): 0;
		for($i = $imgCount; $i < 5; $i++)
		{
			$proArr['imgs'][$i] = [];
		}

		//去重加密
		$tArr = [];
		foreach($proArr['hidenum'] as $k=>$v)
		{
			$tArr[$v['num_factory'].'@'.LibFc::FormatNum($v['num_display'])] = $v;
		}
		$proArr['hidenum'] = array_values($tArr);

		$proArr['hidenumCount'] = count($proArr['hidenum']);
		$proArr['hidenum'] = $LibEncry->encode(json_encode($proArr['hidenum']));

		//厂商自动完成
		$res = $B2cProduct->getAutoFactory($_SESSION['_shopid']);
        $tplList = $B2cBase->get('bc_product_para_tpl',['ppt_id as id','ppt_name as name'],sprintf(' and ppt_shop_id=%d order by ppt_seq asc',$_SESSION['_shopid']));
        LibTpl::Set('tplList',$tplList['data']);
		LibTpl::Set('autoFactory', $res['data']);
		
		//复制产品，置空产品ID
		if($copyProId > 0)
		{
			$proId = 0;
			$proArr['base']['pro_id'] = 0;
		}
		//商品分类
		$res = $B2cBase->getFieldUniVal('bc_product_sort', 'prs_sort_id', sprintf(" and prs_pro_id=%d", $proId));
		$hasShopSortId = $res['data'];
		LibTpl::Set('hasShopSortId',$hasShopSortId);
		//店铺分类
		$B2cShopSort = new B2cShopSort();
		$res = $B2cShopSort->getShopSortZtree($_SESSION['_shopid'], $hasShopSortId, false);
		LibTpl::Set('shopSortArr', $res['data']);
		$res = $B2cBase->get('sh_shop', ['*'], sprintf(" and shop_id=%d", $_SESSION['_shopid']), true);
		$shopInfo = $res['data'];

		$res = $B2cBase->get('bc_product', ['count(*) window_used'], sprintf(" and pro_shop_id=%d and pro_promoted = 'Y'", $_SESSION['_shopid']), true);
		$shopInfo['window_used'] =  $res['data']['window_used'];

		$res = $B2cPart->getAllPart();
		$AllPart = $res['data'];

		$proArr['partNames'] = [];
		foreach(explode(',', $proArr['base']['pro_part_path']) as $v)
		{
			if(!empty($AllPart[$v]))
			{
				$proArr['partNames'][] = $AllPart[$v]['part_name'];
			}
		}
		$res = $B2cBase->get('bc_part_small', ['pas_id', 'pas_name'], sprintf(" and pas_part_id=%d order by pas_seq", $proArr['base']['pro_part_id']));
		LibTpl::Set('smallPartArr', $res['data']);
		$B2cShop = new B2cShop();
		$brandRes = $B2cShop->getShopBrand($_SESSION['_shopid']);
		LibTpl::Set('brandIdArr',$brandRes['data']);
		//获取等级别名
		$res = $B2cShop->getShopMember($_SESSION['_shopid']);
		LibTpl::Set('levelArr',array_column($res['data'],'men_alias','mel_id'));
		LibTpl::Set('shopInfo', $shopInfo);
		LibTpl::Set('selfParamArr', $selfParamArr);
		LibTpl::Set('proArr', $proArr);
		LibTpl::Set('Params', $Params);
		$title = empty($proArr['base']['pro_id'])? '添加配件': '编辑配件'.$proArr['base']['pri_code'];
		LibTpl::Set('title', $title);
		$this->HEAD_CSSJS['plugin'][] = 'webuploader';
		$this->HEAD_CSSJS['plugin'][] = 'ueditor';
		$this->HEAD_CSSJS['plugin'][] = 'zTree';
		LibTpl::Set('HEAD_CSSJS', $this->HEAD_CSSJS);
		LibTpl::Put();
	}

	public function anyact()
	{
		$this->HEAD_CSSJS['plugin'][] = 'webuploader';
		$this->HEAD_CSSJS['plugin'][] = 'zTree';

		$B2cBase = new B2cBase();
		$where  =sprintf(" and sps_to_shop_id = %d and sps_status=1",$_SESSION['_shopid']);
		$listres = 	$B2cBase->get('sh_prosyn join sh_shop on shop_id = sps_from_shop_id',['sh_prosyn.*,shop_name as from_shop_name'],$where);
		// 获取配件分类
		$spsIdArr = $listres['data']? array_column($listres['data'], 'sps_id'):[];
		if($spsIdArr)
		{
			$partRes = $B2cBase->get('sh_prosyn_part join bc_part on part_id = spp_part_id', ['part_name', 'spp_part_id', 'spp_sps_id'], sprintf(" and spp_sps_id in (%s)", implode(',', $spsIdArr)));
			$partArr = [];
			if($partRes['data'])
			{
				foreach ($partRes['data'] as $key => $partItem) 
				{
					$partArr[$partItem['spp_sps_id']][] = $partItem['part_name'];
				}
			}

			//获取店铺分类
			$sortRes = $B2cBase->get('sh_prosyn_sort join sh_sort on sort_id = spt_sort_id', ['sort_name', 'spt_sort_id', 'spt_sps_id'], sprintf(" and spt_sps_id in (%s)",implode(',', $spsIdArr)));
			$sortArr = [];
			if($sortRes['data'])
			{
				foreach ($sortRes['data'] as $key => $sortItem) {
					$sortArr[$sortItem['spt_sps_id']][] = $sortItem['sort_name'];
				}
			}

			foreach ($listres['data'] as $key => &$value) 
			{
				$value['part_name'] =isset($partArr[$value['sps_id']]) ?implode(',',$partArr[$value['sps_id']]):'';
				$value['sort_name'] = isset($sortArr[$value['sps_id']])?implode(',',$sortArr[$value['sps_id']]):'';
			}
			unset($value);
			LibTpl::Set('list', $listres['data']);
		}
		
		LibTpl::Set('HEAD_CSSJS', $this->HEAD_CSSJS);
		LibTpl::Set('title', '批量操作');
		LibTpl::Put();
	}


	//目录基本信息
	function superBase()
	{
		LibFc::ajaxJsonEncode(['status'=>true, 'data'=>$this->supData]);
	}


	//查看号码详情信息
	function viewYpcNum()
	{
		$arr = [];
		if(!empty($_POST['num']))
		{
			$LibEncry = new LibEncry();
			$arr = json_decode($LibEncry->decode($_POST['num']), true);
			if(!empty($arr['num_display']))
			{
				//是否需要减掉查询次数
				$B2cShop = new B2cShop();
				$B2cShop->changeYpcNumCount($_SESSION['_shopid'], $_SESSION['_userid'], $arr['num_display']); 
			}
		}
		if(empty($arr)) LibFc::ajaxJsonEncode(['status'=>false, 'data'=>'提供的参数有误，获取数据失败！']);
		LibFc::ajaxJsonEncode(['status'=>true, 'data'=>$arr]);
	}


	//通过配件品牌和商家编码确定是否可以入库
	function checkUniItem()
	{
		$Params = mvc::$URL_PARAMS;
		$B2cBase = new B2cBase();
		$arr = [];
		if(!empty($Params['pri_code']))
		{
			$table = 'bc_product join bc_product_info on pro_id = pri_pro_id join bc_probrand on pro_prb_id=prb_id join bc_number on num_pro_id = pro_id and num_self=1';
			$where = sprintf(" and pro_id !=%d and pro_shop_id=%d and num_format='%s' and UPPER(prb_name) = UPPER('%s')", 
				$Params['pro_id'], $_SESSION['_shopid'], LibFc::FormatNum($Params['pri_code']), LibFc::Escape($Params['prb_name']));
			$res = $B2cBase->get($table, ['distinct pro_id'], $where);
			$arr = array_column($res['data'], 'pro_id');
		}
		LibFc::ajaxJsonEncode(['status'=>true, 'data'=>$arr]);
	}



	/**
	  * @method 获取车型数据
	  * @author soul 2017/6/22
	  */
	function ajaxGetModel()
	{
		$Params = mvc::$URL_PARAMS;
		$arr = [];
		$spartId = $_POST['spartId'];
		$numsArr = [];
		if(!empty($_POST['nums']))
		{
			foreach($_POST['nums'] as $v)
			{
				$t = explode('@', $v);
				$numsArr[] = ['factory'=>$t[0], 'display'=>$t[1]];
			}
		}

		//车型号码
		if(!empty($_POST['ypcnum']))
		{
			$LibEncry = new LibEncry();
			foreach($_POST['ypcnum'] as $v)
			{
				$t = json_decode($LibEncry->decode($v), true);
				if(!empty($t['num_display']) && !empty($t['num_factory']) && !empty($t['num_fromid']))
				{
					$numsArr[] = ['factory'=>$t['num_factory'], 'display'=>$t['num_display']];
				}
			}
		}

		//隐藏的OE
		if(!empty($_POST['hideNum']))
		{
			$LibEncry = new LibEncry();
			$hideNum = $LibEncry->decode($_POST['hideNum']);
			$hideNum = json_decode($hideNum, true);
			if(!empty($hideNum) && is_array($hideNum))
			{
				foreach($hideNum as $k=>$v)
				{
					$numsArr[] = ['factory'=>$v['num_factory'], 'display'=>$v['num_display']];
				}
			}
		}

		$LibYpApi = new LibYpApi();

		$html = '';
		$type = $_POST['type'];
		if(!empty($type))
		{
			$ComModel = new ComModel();
			$ComBase = new ComBase();
			switch($type)
			{
				case 'tree':
					//某品牌的所有车型树
					if(!empty($_POST['brandId']))
					{
						$res = $ComModel->getModel(3, ['mod3_id'], sprintf(" and mod1_brand_id =%d", $_POST['brandId']));
						$mod3IdArr = array_column($res['data'], 'mod3_id');
					}
				break;
				case 'mod3Ids':
				case 'proModel':
					if(!empty($_POST['mod3Ids']))
					{
						$mod3IdArr = [];
						foreach(explode(',', $_POST['mod3Ids']) as $v)
						{
							$mod3IdArr[] = (int) $v;
						}
						$mod3IdArr = array_unique($mod3IdArr);
					}
				break;
				case 'numModel':
					if(!empty($numsArr))
					{
						$res = $LibYpApi->Get('ypc/getModelByYpcNum', [], ['nums'=>$numsArr, 'spartId'=>$_POST['spartId']]);
						$mod3IdArr = $res['data'];
					}
				break;
				case 'engine':
					$tempArr = [];
					foreach($_POST['engs'] as $v)
					{
						$tempArr[] = sprintf("'%s'", LibFc::Escape($v));
					}
					if(!empty($tempArr))
					{
						$ComModel = new ComModel();
						$res = $ComModel->getModel(3, ['mod3_id'],  sprintf(" and mod3_engine in (%s)", implode(',', $tempArr)));
						$mod3IdArr = array_column($res['data'], 'mod3_id');
					}
				break;
				case 'vin':
					$LibYpApi = new LibYpApi();
					$res = $LibYpApi->Get('vin/decodeYpcModelId',['vin'=>$_POST['vin']]);
					$mod3IdArr = $res['data'];
					if(!empty($res['data'])){
						$hisArr = [
							'ash_uid'=>$_SESSION['_shopid'],
							'ash_type'=>'vin',
							'ash_act'=>'vin/decodeVin',
							'ash_val'=>$vin,
							'ash_uid_by'=>$_SESSION['_userid'],
							'ash_ip'=>LibFc::GetClientIp(),
							'ash_from'=> in_array('gzhShop', $_SESSION['_shoptype'])? 'gzh': 'super'
						];
						$LibYpApi->Get('zyb/addHistory', [], $hisArr);
					}
				break;
                case 'keyword':
                    $wordArr = LibFc::keyword($_POST['keyword']);
                    if(!empty($wordArr))
					{ 
						$ComModel = new ComModel();
						$wordIdArr = [];
						$caseArr = [];
						foreach($wordArr as $word)
						{
							$res = $ComModel->get('yp_model_word', ['mw_id'], sprintf(" and mw_word like '%s%%'", LibFc::Escape($word)));
							if(!empty($res['data']))
							{
								$ids = array_column($res['data'], 'mw_id');
								$caseArr[] = sprintf("WHEN mwl_mw_id IN (%s) THEN %d", implode(',', $ids), count($caseArr)+1);
								$wordIdArr = array_merge($wordIdArr, $ids);
							}
						}
						if(!empty($caseArr))
						{
							$wordIdArr = array_unique($wordIdArr);
							for($i = count($caseArr); $i > 0; $i--)
							{
								$table = sprintf("( SELECT mwl_mod3_id, CASE %s END AS mwl_mw_id FROM yp_model_word_link WHERE mwl_mw_id IN (%s)) AS a", implode(' ', $caseArr), implode(',', $wordIdArr));
								$res = $ComModel->get($table, ['mwl_mod3_id'], sprintf(" GROUP BY mwl_mod3_id HAVING COUNT(DISTINCT mwl_mw_id) = %d limit 100", $i));
								if(!empty($res['data']))
								{
									$mod3IdArr = array_column($res['data'], 'mwl_mod3_id');
									break;
								}
							}
						}
                    }
                break;
			}
		}
		$modelArr = [];
		if(!empty($mod3IdArr))
		{
			//车型号码参数
			$res = $LibYpApi->Get('ypc/getModelNumberPara', [], ['m3ids'=>$mod3IdArr, 'nums'=>$numsArr, 'spartId'=>$spartId]);
			$modPara = $res['data'];

			$ComModel = new ComModel();
			$where = sprintf(" and mod3_id in (%s) order by brand_seq, brand_initial, make_seq, make_initial, mod1_name, mod2_name, mod3_name", implode(',', $mod3IdArr));
			$res = $ComModel->getModel(3, ['*'], $where);
			foreach($res['data'] as $k=>$v)
			{
				$v['mod3_year'] = LibFc::formatViewYear($v['mod3_start_year'], $v['mod3_end_year'], 2);
				$v['mod3_para'] = '';
				if(!empty($modPara['p'.$v['mod3_id']]))
				{
					$v['mod3_para'] = implode(';', array_unique(array_column($modPara['p'.$v['mod3_id']], 'info')));
				}
				$modelArr[$k] = $v;
			}
		}
		LibTpl::Set('modelArr', $modelArr);
		LibTpl::Set('type', $type);
		$html = LibTpl::Fetch();
		LibFc::ajaxJsonEncode(['status'=>true, 'data'=>$html]);
	}

	//通过全车件模式选择车型
	function getAllModByAny()
	{
		$Params = $_POST;
		$numsArr = [];
		if(!empty($_POST['nums']))
		{
			foreach($_POST['nums'] as $v)
			{
				$t = explode('@', $v);
				$numsArr[] = ['factory'=>$t[0], 'display'=>$t[1]];
			}
		}

		//车型号码
		if(!empty($_POST['ypcnum']))
		{
			$LibEncry = new LibEncry();
			foreach($_POST['ypcnum'] as $v)
			{
				$t = json_decode($LibEncry->decode($v), true);
				if(!empty($t['num_display']) && !empty($t['num_factory']) && !empty($t['num_fromid']))
				{
					$numsArr[] = ['factory'=>$t['num_factory'], 'display'=>$t['num_display']];
				}
			}
		}

		//隐藏的OE
		if(!empty($_POST['hideNum']))
		{
			$LibEncry = new LibEncry();
			$hideNum = $LibEncry->decode($_POST['hideNum']);
			$hideNum = json_decode($hideNum, true);
			if(!empty($hideNum) && is_array($hideNum))
			{
				foreach($hideNum as $k=>$v)
				{
					$numsArr[] = ['factory'=>$v['num_factory'], 'display'=>$v['num_display']];
				}
			}
		}
		if(!empty($numsArr)) $Params['nums'] = $numsArr;

		$B2cShop = new B2cShop();
		$res = $B2cShop->getshopModAdmin($_SESSION['_shopid']);
		if($res['data']){
			$Params = array_merge($Params,$res['data']);
			
		}
	
		$ComModel = new ComModel();
		$res = $ComModel->getAllModByAny($Params);
	
		if($res['data'] && $Params['vin'] && $Params['proId'])
		{
			//记录到查询历史
			$B2cProduct = new B2cProduct();
			$B2cProduct->setModelVin($Params['proId'],$Params['vin']);
		}

		LibFc::ajaxJsonEncode($res);
	}


	//通过底盘件模式选择车型
	function getChassisModByAny()
	{
		$Params = $_REQUEST;
		$ComModel = new ComModel();
		$B2cShop = new B2cShop();
		$res = $B2cShop->getshopModAdmin($_SESSION['_shopid']);
		if($res['data']){
			$Params = array_merge($Params,$res['data']);
		}
		
		$res = $ComModel->getChassisModByAny($Params);
		LibFc::ajaxJsonEncode($res);
	}
	
	//通过发动机件模式选择车型
	function getEngineModByAny()
	{
		$Params = $_REQUEST;
		$ComModel = new ComModel();
		$B2cShop = new B2cShop();
		$res = $B2cShop->getshopModAdmin($_SESSION['_shopid']);
		if($res['data']){
			$Params = array_merge($Params,$res['data']);
		}
		
		$res = $ComModel->getEngineModByAny($Params);
		LibFc::ajaxJsonEncode($res);
	}
	
	/**
	  * @method 搜索发动机
	  * @author soul 2017/6/22
	  */
	function ajaxGetEngine()
	{
		$Params = mvc::$URL_PARAMS;
		$engArr = [];
		$where = '';
		$B2cShop = new B2cShop();
		$brandRes = $B2cShop->getShopBrand($_SESSION['_shopid']);
		if($brandRes['data'])
		{
			$where .= sprintf(" AND mod3_brand_id in (%s)",implode(',',$brandRes['data']));
		}
		if(!empty($Params['word']))
		{
			$ComBase = new ComBase();
			$where .= sprintf(" and mod3_engine_format like '%%%s%%' order by length(mod3_engine_format), mod3_engine", LibFc::FormatNum($Params['word']));
			$res = $ComBase->get('bc_model3', ['distinct mod3_engine'], $where);
			$engArr = $res['data'];
		}
		LibTpl::Set('engArr', $engArr);
		$html = LibTpl::Fetch();
		LibFc::ajaxJsonEncode(['status'=>true, 'data'=>$html]);
	}


	//删除配件
	function delItems()
	{
		$this->checkRule('PC03');
		$B2cProduct = new B2cProduct();
		$res = $B2cProduct->delProduct($_SESSION['_shopid'], $_POST['proIds']);
		LibFc::ajaxJsonEncode($res);
	}



	//零件选择 partid_pasid
	function getSmallPart()
	{
		$Params = mvc::$URL_PARAMS;
		$arr = ['spart'=>[], 'para'=>[]];
		if(!empty($Params['part_id']))
		{
			$t = explode('_', $Params['part_id']);
			$partid = (int) $t[0];
			$B2cBase = new B2cBase();
			//子零件
			$res = $B2cBase->get('bc_part_small', ['pas_id', 'pas_name'], sprintf(" and pas_part_id=%d order by pas_seq", $partid));
			$arr['spart'] = $res['data'];
			
			//参数
			$B2cPart = new B2cPart();
			$res = $B2cPart->getPartParam($partid);
			$arr['para'] = $res['data'];

			$paraVal = [];
			if(!empty($Params['pro_id']))
			{
				$proId = (int) $Params['pro_id'];
				$res = $B2cBase->get('bc_product_param_float join bc_param_label on ppf_pal_id=pal_id',['pal_id', 'ppf_value as val'], sprintf(' and ppf_pro_id=%d', $proId));
				$paraVal = array_column($res['data'], 'val', 'pal_id');
				$res = $B2cBase->get('bc_product_param_string join bc_param_label on pps_pal_id=pal_id',['pal_id', 'pps_value as val'], sprintf(' and pps_pro_id=%d', $proId));
				foreach($res['data'] as $pv)
				{
					$paraVal[$pv['pal_id']] = $pv['val'];
				}
			}
			else if(!empty($Params['fromPro']))
			{
				$LibEncry = new LibEncry();
				$t = $LibEncry->decode(base64_decode($Params['fromPro']));
				$tArr = explode('@', $t);

				//宜配产品 TCD产品数据
				if(!empty($tArr[0]) && !empty($tArr[1]))
				{
					$fromType = $tArr[0];
					$fromProId = $tArr[1];
					if(stripos($fromType, 'oth') === false && $fromType != 'etk')
					{
						$LibYpApi = new LibYpApi();
						$res = $LibYpApi->Get('b2c/getPartParaByAny', ['partId'=>$partid, 'type'=>$fromType, 'proId'=>$fromProId]);
						$paraVal = array_column($res['data'], 'val', 'pal_id');
					}
				}
			}
			foreach($arr['para'] as $k=>$v)
			{
				$v['pal_val'] = empty($paraVal[$v['pal_id']])? '': htmlspecialchars($paraVal[$v['pal_id']]);
				$v['pau_name'] = empty($v['pau_name'])? '': $v['pau_name'];
				$arr['para'][$k] = $v;
			}
		}
		LibFc::ajaxJsonEncode(['status'=>true, 'data'=>$arr]);
	}

	//获取参数搜索的分类数据
	function getParaPart()
	{
		$Params = mvc::$URL_PARAMS;
		$arr = ['base'=>[], 'para'=>[]];
		if(!empty($Params['partid']))
		{
			$B2cPart = new B2cPart();
			$res = $B2cPart->getPartParam($Params['partid']);
			$arr['para'] = $res['data'];
		}
		LibFc::ajaxJsonEncode(['status'=>true, 'data'=>$arr]);
	}


	//配件查询
	function search()
	{
		$Params = mvc::$URL_PARAMS;
		$B2cPart = new B2cPart();
		$res = $B2cPart->getShopSuperSPart($_SESSION['_shopid']);
		LibTpl::Set('sPartArr', $res['data']);
		$list = [];
		foreach ($res['data'] as $value)
        {
            if(isset($list[$value['part_id']])){
                array_push($list[$value['part_id']]['son'],[
                    'pas_id' => $value['id'],
                    'pas_name' => $value['name']
                ]);
            }else{
                $list[$value['part_id']] = [
                    'part_id' => $value['part_id'],
                    'part_name' => $value['part_name'],
                    'son' => [
                        [
                            'pas_id' => $value['id'],
                            'pas_name' => $value['name'],
                        ]
                    ]
                ];
            }
        }
		LibTpl::Set('supPartArr', $list);
		$orderArr = [
			'default'=>['默认排序', 'order by part_name, pas_name, pri_code'],
			'part'=>['配件分类', ' order by part_name, pas_name, pri_code'],
			'proid'=>['添加时间降序', ' order by pro_id desc'],
			'proid2'=>['添加时间升序', ' order by pro_id asc'],
			'settime'=>['修改时间降序', ' order by pro_set_time desc'],
			'settime2'=>['修改时间升序', ' order by pro_set_time asc'],
			'number'=>['号码降序', ' order by pri_code desc'],
			'number2'=>['号码升序', ' order by pri_code asc'],
			
		];
		LibTpl::Set('orderArr', $orderArr);

		$res = $B2cPart->get('bc_copy_product',['cp_to_shop_id'],sprintf(" and cp_to_shop_id=%d",$_SESSION['_shopid']), true);
		LibTpl::Set('copyArr', $res['data']);

		$B2cProduct = new B2cProduct();
		
		$B2cShopSort = new B2cShopSort();
        $treeData = $B2cShopSort->getShopSortZtree($_SESSION['_shopid'],[$Params['shopCate']]);
        LibTpl::Set('treeArr',$treeData['data']);
		if($Params['part_id']){
			$spartId =  $Params['part_id'].'_'.($Params['pas_id']??'');
			LibTpl::Set('spartId', $spartId);
		}

		$res = $B2cProduct->get('bc_product join bc_probrand on pro_prb_id = prb_id',['distinct prb_id,prb_name'],sprintf(" and pro_shop_id=%d",$_SESSION['_shopid']));
		$brandList = $res['data']?:[];
		LibTpl::Set('brandList', $brandList);
		$showCol = $this->getShowCol();
		LibTpl::Set('showCol', $showCol);
		//获取添加人
		$res = $B2cProduct->get('bc_product',['distinct pro_add_uid'],sprintf(" and pro_add_uid!=0 and pro_shop_id=%d",$_SESSION['_shopid']));
		if($res['data']){
			
			$add_uid = array_column($res['data'], 'pro_add_uid');
			$res =  $B2cProduct->get('sh_worker',['wor_uid','wor_real_name'],sprintf(" and wor_uid in (%s)",implode(',',$add_uid)));
	
			if(in_array($_SESSION['_shopid'],$add_uid)){
				$YpwBase = new YpwBase();
				$res1 = $YpwBase->get('yp_user',['u_id as wor_uid,u_name as wor_real_name'],sprintf(" AND u_id=%d",$_SESSION['_shopid']),true);
				$res['data'][] = $res1['data'];
			}
			
			LibTpl::Set('addUserArr',$res['data']);
		}
		$this->HEAD_CSSJS['plugin'][] = 'zTree';
		LibTpl::Set('HEAD_CSSJS', $this->HEAD_CSSJS);
		LibTpl::Set('Params', $Params);
		LibTpl::Set('title', '配件列表-品牌目录');
		LibTpl::Put();
	}

	//产品从某个店铺同步到另外一个店铺
	public function copyShopPro()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD.$_SESSION['_shopid'], 600))
		{
			exit('上次的同步尚未执行完成，请稍后再试！');
		}
		else
		{
			$B2cProduct = new B2cProduct();
			$B2cProduct->copyShopPro($_SESSION['_shopid']);
			LibFc::delFunLock(mvc::$URL_METHOD.$_SESSION['_shopid']);
			echo '数据已同步完成！';
		}
	}

	//配件查询结果
	function lists()
	{
		$this->checkRule('PC04');
		$Params = $_GET;
		//处理显示的列
		$colArr = $this->getShowCol();
		LibTpl::Set('colArr', $colArr);
		$showCol = [];
		if($Params['show_col'])
		{
			$showCol = is_array($Params['show_col'])?$Params['show_col']:explode(',',$Params['show_col']);
		}
		$B2cBase = new B2cBase();
		$page = isset($Params['page']) ? $Params['page'] : 1;
		$perPage = isset($_COOKIE['perPage'])? $_COOKIE['perPage'] : 20;
		$proArr = [];
		$where = sprintf(' and pro_shop_id=%d', $_SESSION['_shopid']);
		$orderArr = [
			'default'=>['默认排序',' order by part_name, pas_name, pri_code'],
			'part'=>['配件分类', ' order by part_name, pas_name, pri_code'],
			'proid'=>['添加时间降序', ' order by pro_id desc'],
			'proid2'=>['添加时间升序', ' order by pro_id asc'],
			'settime'=>['修改时间降序', ' order by pro_set_time desc'],
			'settime2'=>['修改时间升序', ' order by pro_set_time asc'],
			'number'=>['号码降序', ' order by pri_code desc'],
			'number2'=>['号码升序', ' order by pri_code asc'],
		];
		$Params['order'] = empty($orderArr[$Params['order']]) ? 'default': $Params['order'];
		$order = $orderArr[$Params['order']][1];

		$total = 0;
		//
		if($Params['pro_prb_id'])
		{
			$where .= sprintf(" and pro_prb_id=%d",LibFc::Int($Params['pro_prb_id']));
		}
		//店铺分类
		$shopCate=(!empty($Params['shopCate'])) ? trim($Params['shopCate'],',') : '';
		if(!empty($shopCate))
		{
			$shopCateArr=explode(',',$shopCate);
			$shopCateArr=array_filter($shopCateArr,'LibFc::Int');
			$shopCate=implode(',',$shopCateArr);
			$where.=sprintf(' and pro_id in(%s)',sprintf('select prs_pro_id from bc_product left join bc_product_sort on pro_id=prs_pro_id where prs_sort_id in(%s)',$shopCate));
		}
		if(!empty($Params['number']))
		{
			$formatNum = LibFc::FormatNum($Params['number']);
			$where .= sprintf(" and (num_format like '%%%s%%' or num_reformat like '%%%s%%')", $formatNum, strrev( $formatNum));
			$table = 'bc_number join bc_product on pro_id = num_pro_id left join sh_super_part on sup_shop_id = pro_shop_id and sup_part_id = pro_part_id';
			$res = $B2cBase->get($table, ['count(distinct(pro_id)) count'], $where, true);
			$total = $res['data']['count'];
			if($total > 0)
			{
				$orderBy = $res['data'];
				$twhere = sprintf(" and pro_id in ( select pro_id from %s where 1=1 %s group by pro_id ) %s limit %d,%d", $table, $where, $order, ($page-1)*$perPage, $perPage);
				$res = $B2cBase->get('bc_product join bc_product_info on pri_pro_id = pro_id join bc_part on pro_part_id = part_id left join bc_part_small on pro_pas_id = pas_id', ['pro_id'], $twhere);
				
				$proArr = array_column($res['data'], null, 'pro_id');
			}
		}
		else
		{
			$table = 'bc_product join bc_product_info on pri_pro_id = pro_id';
	
			foreach($Params as $filed=>$val)
			{	
				$val =is_array($val)?$val:trim($val);
				
				if($val == '') continue;
				switch($filed)
				{
                    case 'pas_id':
						$t = explode('_', $val);
						if(count($t) == 2 && !empty($t[1]))
							$where .= sprintf(' and pro_pas_id=%d', $t[1]);
						else
							$where .= sprintf(' and pro_pas_id=%d', $val);
                        break;
					case 'part_id':
						$where .= sprintf(" and pro_part_id = %d", $val);
					break;
					case 'chk_code':
						$where .= $val == -1? " and (pri_code = '' or pri_code is null)":  " and pri_code !=''";
					break;
					case 'chk_img':
						$tw = sprintf("select distinct pp_pro_id from bc_product_pic join bc_product on pp_pro_id=pro_id and pro_shop_id=%d", $_SESSION['_shopid']);
						$where .= $val == -1 ? ' and pro_id not in ('.$tw.')': ' and pro_id in ('.$tw.')';
					break;
					case 'chk_para':
						$tw1 = sprintf("select distinct ppf_pro_id from bc_product_param_float join bc_product on ppf_pro_id=pro_id and pro_shop_id=%d", $_SESSION['_shopid']);
						$tw2 = sprintf("select distinct pps_pro_id from bc_product_param_string join bc_product on pps_pro_id=pro_id and pro_shop_id=%d", $_SESSION['_shopid']);
						$tw3 = sprintf("select distinct prpv_pro_id from bc_product_para_val join bc_product on prpv_pro_id =pro_id and pro_shop_id=%d and prpv_value!=''",$_SESSION['_shopid']);
						$where .= $val == -1 ? ' and pro_id not in ('.$tw1.') and pro_id not in ('.$tw2.') and pro_id not in ('.$tw3.')': ' and ( pro_id in ('.$tw1.') or pro_id in ('.$tw2.') or pro_id in ('.$tw3.') )';
					break;
					case 'chk_m3':
						$tw = sprintf("select distinct pml3_pro_id from bc_product_model3_link join bc_product on pml3_pro_id=pro_id and pro_shop_id=%d", $_SESSION['_shopid']);
						$where .= $val == -1 ? ' and pro_id not in ('.$tw.')': ' and pro_id in ('.$tw.')';
					break;
					case 'pri_self_remark':
						$where .= sprintf(" and pri_self_remark like '%%%s%%'", LibFc::Escape($val));
					break;
					case 'spartid':
						$where .= sprintf(" and  concat(pro_part_id, '_', pro_pas_id) in ('%s')", implode("','",$val));
						break;
					case 'status':
						$where .= sprintf(" and pro_status= %d",$val);
						break;
					case 'partName':
						$blparams = ['word'=>$val, 'shop_id'=>$_SESSION['_shopid'], 'count'=>10000];
						$LibYpApi = new LibYpApi();
						$res = $LibYpApi->Get('b2c/searchByEs', [], $blparams);
						if(!empty($res['data'])){
							
							$where .= sprintf(" and pro_id in (%s)", implode(',', $res['data']));
							//默认排序有关键字的情况下
							if($Params['order']=='default') $order = sprintf(" ORDER BY FIELD(pro_id,%s)",implode(',', $res['data']));
							
						}else{
							$where .= sprintf(" and pro_name like '%%%s%%'", LibFc::Escape($val));
						}
						break;
					case 'chk_shopcate':
						$tw = sprintf("select distinct prs_pro_id from bc_product_sort JOIN sh_sort ON prs_sort_id = sort_id where sort_shop_id =%d",$_SESSION['_shopid']);
						$where .= $val == -1 ? ' and pro_id not in ('.$tw.')': ' and pro_id in ('.$tw.')';
						break;
					case 'chk_chcode':
						
						$tw = sprintf("select distinct num_pro_id from bc_product join bc_number on num_pro_id=pro_id and num_self!=1 and num_show=1 where pro_shop_id=%d",$_SESSION['_shopid']);
						$where .= $val == -1 ? ' and pro_id not in ('.$tw.')': ' and pro_id in ('.$tw.')';
						break;
					case 'chk_main':
						$tw = sprintf("select distinct num_pro_id from bc_product join bc_number on num_pro_id=pro_id and num_ismain=1 and num_self!=1 and num_show=1 where pro_shop_id=%d",$_SESSION['_shopid']);
						$where .= $val == -1 ? ' and pro_id not in ('.$tw.')': ' and pro_id in ('.$tw.')';
						break;
					case 'invaild_mod':
						//已失效车型关联的产品
						$tw = sprintf("select distinct pro_id from bc_product 
						join bc_product_model3_link on pro_id = pml3_pro_id and pro_shop_id=%d 
						left join %s.bc_model3 on mod3_id = pml3_mod3_id where mod3_id is NULL",$_SESSION['_shopid'],mvc::$cfg['DB']['COM']['db_name']);
						$where .= $val==1? ' and pro_id in ('.$tw.')':' and pro_id not in ('.$tw.')';
						break;
					case 'pro_add_uid':
						$where .= sprintf(" and pro_add_uid =%d", $val);
						break;
					case 'b_id':
						if($val){
							$where .= sprintf(" and pro_id in (select distinct pbl_pro_id from bc_product_brand_link where pbl_brand_id in (%s))",$val);
						}
						break;
				}
			}
			//下载
			if(!empty($Params['export']))
			{
				set_time_limit(0);
				ini_set('memory_limit', '4096M');
				$temptable = $table.' join bc_part on pro_part_id = part_id
				left join bc_probrand on pro_prb_id = prb_id
				left join bc_product_para_tpl on pro_ppt_id = ppt_id
				left join bc_part_small on pro_pas_id = pas_id';
				//不取代理授权数据
				$where  = sprintf(" %s AND pro_dfrom not like 'shop_%%' ",$where);
				$res = $B2cBase->get($temptable, ['bc_product.*,bc_product_info.*,part_id, part_name, pas_name,prb_name,ppt_name'], $where.$order);
				$proArr = array_column($res['data'], null, 'pro_id');
				//查添加人
				$table = sprintf('(SELECT pro_add_uid AS uid FROM bc_product
				WHERE pro_add_uid != 0 AND pro_shop_id = %d
				UNION
				SELECT pro_set_uid AS uid FROM bc_product WHERE pro_set_uid != 0
				AND pro_shop_id = %d) as table1',$_SESSION['_shopid'],$_SESSION['_shopid']);

				$ures = $B2cBase->get($table,['DISTINCT uid']);
				if($ures['data']){
					$add_uid = array_column($ures['data'], 'uid');
					$ures =  $B2cBase->get('sh_worker',['wor_uid','wor_real_name'],sprintf(" and wor_uid in (%s)",implode(',',$add_uid)));
					if(in_array($_SESSION['_shopid'],$add_uid)){
						$YpwBase = new YpwBase();
						$ures1 = $YpwBase->get('yp_user',['u_id as wor_uid,u_real_name as wor_real_name'],sprintf(" AND u_id=%d",$_SESSION['_shopid']),true);
						$ures['data'][] = $ures1['data'];
						$addUserArr = array_column($ures['data'], 'wor_real_name', 'wor_uid');
					}
				}
				
				if(!empty($proArr))
				{
					foreach ($proArr as $key => $val) 
					{
						$proArr[$key]['pro_status'] = $val['pro_status']==1?'上架':'下架';
						$proArr[$key]['pro_add_uid'] = $val['pro_add_uid']!=0?($addUserArr[$val['pro_add_uid']]??''):'';
					}
					//零件参数
					$partIdArr = array_unique(array_column($proArr, 'part_id'));

					//号码
					$twhere = sprintf(" and num_self=0 and num_show=1 and num_pro_id in (%s) order by num_ismain desc, num_factory asc, num_format asc", implode(',', array_keys($proArr)));
					$res = $B2cBase->get('bc_number', ['num_pro_id', 'num_factory', 'num_display'], $twhere);
					foreach($res['data'] as $v)
					{
						if(!empty($proArr[$v['num_pro_id']]['number']))
							$proArr[$v['num_pro_id']]['number'][] = $v['num_factory'].':'.$v['num_display'];
						else
							$proArr[$v['num_pro_id']]['number'] = [$v['num_factory'].':'.$v['num_display']];
					}

                    $table = 'bc_product_para_val JOIN bc_product_label ON prl_id = prpv_prl_id
				    LEFT JOIN bc_product_unit ON pru_id = prpv_pru_id';
                    $res = $B2cBase->get($table, ['prpv_pro_id, prl_name, prpv_value, pru_name'], sprintf(" and prpv_pro_id in(%s)  ORDER BY prpv_seq, prl_name", implode(',', array_keys($proArr))));
                    foreach($res['data'] as $v)
                    {
                        $proArr[$v['prpv_pro_id']]['pro_param'][] = $v['prl_name'].':'.$v['prpv_value'];
                    }
					//参数
					$res = $B2cBase->get('bc_product_param_float',['ppf_pal_id as pal_id', 'ppf_pro_id as pro_id', 'ppf_value as val'], sprintf(' and ppf_pro_id in (%s)', implode(',', array_keys($proArr))));
					foreach($res['data'] as $v)
					{
						$proArr[$v['pro_id']]['para']['para_'.$v['pal_id']] = $v['val'];
					}

					$res = $B2cBase->get('bc_product_param_string',['pps_pal_id as pal_id', 'pps_pro_id as pro_id', 'pps_value as val'], sprintf(' and pps_pro_id in (%s)', implode(',', array_keys($proArr))));
					foreach($res['data'] as $v)
					{
						$proArr[$v['pro_id']]['para']['para_'.$v['pal_id']] = $v['val'];
					}
					//分类
					$res = $B2cBase->get('bc_product_sort JOIN sh_sort ON prs_sort_id = sort_id', ['prs_pro_id, sort_name'], sprintf(" and prs_pro_id in(%s) ORDER BY sort_seq",  implode(',', array_keys($proArr))));
					foreach($res['data'] as $v)
					{
						$proArr[$v['prs_pro_id']]['shop_sort'][] = $v['sort_name'];
					}
				}
				$B2cProduct = new B2cProduct();
				$B2cProduct->exportDifferentDemo($_SESSION['_shopid'], $partIdArr, $proArr, '配件'.date('Ymd').'.xlsx');
				exit;
			}

			$res = $B2cBase->get($table, ['count(distinct(pro_id)) count'], $where, true);
			$total = $res['data']['count'];
			if($total > 0)
			{
				$orderBy = $res['data'];
				$twhere = sprintf(" and pro_id in ( select pro_id from %s where 1=1 %s group by pro_id ) %s limit %d,%d", $table, $where, $order, ($page-1)*$perPage, $perPage);
				$res = $B2cBase->get('bc_product join bc_product_info on pri_pro_id = pro_id join bc_part on pro_part_id = part_id left join bc_part_small on pro_pas_id = pas_id', ['pro_id'], $twhere);
				$proArr = array_column($res['data'], null, 'pro_id');
			}
		}

		//配件信息
		if(!empty($proArr))
		{
			$table = 'bc_product 
			join bc_product_info on pri_pro_id = pro_id
			join bc_part on pro_part_id = part_id
			left join bc_probrand on pro_prb_id = prb_id
			left join bc_number on pro_id = num_pro_id and num_ismain =1
			left join bc_part_small on pro_pas_id = pas_id
			';
			$res = $B2cBase->get($table, ['*'], sprintf(" and pro_id in (%s)", implode(',', array_keys($proArr))));
			$pptId = array_column($res['data'],'pro_ppt_id');
			foreach($res['data'] as $v)
			{
				$v['pics'] = [];
				$v['para'] = [];
				$v['nums'] = [];
				$v['m3_count'] = 0;
				$proArr[$v['pro_id']] = $v;
			}
			foreach ($pptId as $k => $value)
            {
                if($value <= 0){
                    unset($pptId[$k]);
                }
            }
			if(!empty($pptId)){
                $feild = ['prpv_prl_id', 'pro_id','prpv_pru_id', 'prpv_value','prl_name','pru_name'];
                $res = $B2cBase->get('bc_product_para_val join bc_product on pro_id= prpv_pro_id left join bc_product_label on prl_id=prpv_prl_id left join bc_product_unit on pru_id=prpv_pru_id', $feild, sprintf(" and pro_id in (%s) and pro_ppt_id in (%s) and pro_shop_id=%d and (prpv_value is not null or prpv_value!='')", implode(',', array_keys($proArr)), implode(',',$pptId), $_SESSION['_shopid']));
                $paramZiDiYi = [];
                $fieldArr=['prl_id'];
                $newlink = $B2cBase->get('bc_product_para_tpl_link left join bc_product_label on prl_id=pptl_prl_id left join bc_product_unit on pru_id=pptl_pru_id',$fieldArr,sprintf(' and pptl_ppt_id=%d order by pptl_seq asc,pptl_prl_id asc',implode(',',$pptId)));
                if(!empty($newlink['data'])){
                    $prlId = array_column($newlink['data'],'prl_id');
                }else{
                    $prlId = [];
                }
                foreach ($res['data'] as $value)
                {
                    if(in_array($value['prpv_prl_id'],$prlId)){
                        $paramZiDiYi[$value['pro_id']][] = $value;
                    }
                }
                LibTpl::Set('paramZiDiYi',$paramZiDiYi);
            }
			//图片
			$B2cProduct = new B2cProduct();
			$res = $B2cProduct->getProductPic(array_keys($proArr), true);
			foreach($res['data'] as $k=>$v)
			{
				$proArr[$k]['pics'] = $v;
			}

			$where = sprintf(" and num_pro_id in (%s) and num_self = 0 and num_ismain=1", implode(',', array_keys($proArr)));
			// $where .= !empty($formatNum) ? sprintf(" and (num_format like '%s%%' or num_reformat like '%s%%')", $formatNum, strrev( $formatNum)): ' and num_ismain=1';
			$res = $B2cBase->get('bc_number', ['num_id, num_pro_id, num_factory, num_display'], $where);
			foreach($res['data'] as $v)
			{
				$proArr[$v['num_pro_id']]['nums'][$v['num_id']] = $v;
			}
			
			$table = sprintf("bc_part_param_link 
			join bc_param_label on ppl_pal_id=pal_id 
			left join bc_product_param_float on ppf_pal_id=pal_id and ppf_pro_id in (%s)
			left join bc_product_param_string on pps_pal_id=pal_id and pps_pro_id in (%s) 
			left join bc_param_unit on ppl_pau_id = pau_id", implode(',', array_keys($proArr)), implode(',', array_keys($proArr)));
			$res = $B2cBase->get($table, ['ppf_pro_id, pps_pro_id, pal_name, ppl_style, pps_value, ppf_value, pau_name'], ' order by ppl_seq');
			foreach($res['data'] as $v)
			{
				$proId = empty($v['ppf_pro_id'])? $v['pps_pro_id']: $v['ppf_pro_id'];
				if(empty($proId)) continue;
				$v['pau_name'] = empty($v['pau_name']) ? '': $v['pau_name'];
				$v['val'] = empty($v['pps_value']) ? $v['ppf_value']: $v['pps_value'];
				$proArr[$proId]['para'][] = ['name'=>$v['pal_name'], 'val'=>$v['val'], 'unit'=>$v['pau_name']];
			}
			
			//适用车型统计
			$res = $B2cBase->get('bc_product_model3_link', ['pml3_pro_id, count(*) as m3_count'], sprintf(" and pml3_pro_id in (%s) group by pml3_pro_id", implode(',', array_keys($proArr))));
			foreach($res['data'] as $v)
			{
				$proArr[$v['pml3_pro_id']]['m3_count'] = $v['m3_count'];
			}


			//适用品牌
			$mres = $B2cBase->get('bc_product_brand_link', ['*'], sprintf(" and pbl_pro_id in (%s) ", implode(',', array_keys($proArr))));
			if(!empty($mres['data']))
			{
				$ComModel = new ComModel();
				$where = sprintf(" and brand_id in (%s) order by brand_seq, brand_initial", implode(',', array_unique(array_column($mres['data'], 'pbl_brand_id'))));
				$res = $ComModel->getModel(3, ['brand_id,brand_name'], $where);
				$brandArr = array_column($res['data'], 'brand_name', 'brand_id');
				foreach($mres['data'] as $v)
				{
					$proArr[$v['pbl_pro_id']]['brand'][] = $brandArr[$v['pbl_brand_id']];
				}
			}

			// 店铺分类
			if($showCol && in_array('shop_sort',$showCol))
			{
				$shopSortArr = [];
				$shopSort = $B2cBase->get('bc_product_sort join sh_sort on prs_sort_id  = sort_id',['*'],sprintf(" and prs_pro_id in (%s)",implode(',', array_keys($proArr))));
				if(!empty($shopSort['data'])){
					foreach ($shopSort['data'] as $key => $val) {
						$shopSortArr[$val['prs_pro_id']][] = $val['sort_name'];
					}
					LibTpl::Set('shopSortArr',$shopSortArr);
				}
			}
			
		}
		
		$B2cShopSort = new B2cShopSort();
        $treeData = $B2cShopSort->getShopSortZtree($_SESSION['_shopid'],[]);

        LibTpl::Set('treeArr',$treeData['data']);

		$table = sprintf('(SELECT pro_add_uid AS uid FROM bc_product
		WHERE pro_add_uid != 0 AND pro_shop_id = %d
		UNION
		SELECT pro_set_uid AS uid FROM bc_product WHERE pro_set_uid != 0
		AND pro_shop_id = %d) as table1',$_SESSION['_shopid'],$_SESSION['_shopid']);

		$res = $B2cShopSort->get($table,['DISTINCT uid']);
		
		if($res['data'])
		{
			$add_uid = array_column($res['data'], 'uid');
			$res =  $B2cShopSort->get('sh_worker',['wor_uid','wor_real_name'],sprintf(" and wor_uid in (%s)",implode(',',$add_uid)));
			if(in_array($_SESSION['_shopid'],$add_uid)){
				$YpwBase = new YpwBase();
				$res1 = $YpwBase->get('yp_user',['u_id as wor_uid,u_real_name as wor_real_name'],sprintf(" AND u_id=%d",$_SESSION['_shopid']),true);
				$res['data'][] = $res1['data'];
			}
			LibTpl::Set('addUserArr',array_column($res['data'], 'wor_real_name', 'wor_uid'));
		}

        $this->HEAD_CSSJS['plugin'][] = 'zTree';
        LibTpl::Set('HEAD_CSSJS', $this->HEAD_CSSJS);
		LibTpl::Set('showCol',$showCol);
		LibTpl::Set('pageMsg', LibPage::Show($total, $perPage, true));
		LibTpl::Set('formatNum', $formatNum);
		LibTpl::Set('proArr', $proArr);
		LibTpl::Set('title', '配件列表-品牌目录');
		LibTpl::Put();
	}

	//第三方数据查询
	function othSearch()
	{
		$B2cPart = new B2cPart();

		//获取参数查询的类别
		$res = $B2cPart->getShopSuperParaPart($_SESSION['_shopid']);
		LibTpl::Set('supParaPartArr', $res['data']);

		LibTpl::Set('title', '数据查询-品牌目录');
		LibTpl::Put();
	}


	//获取配件的适用车型列表
	function getItemModels()
	{
		$Params = mvc::$URL_PARAMS;
		$html = '';
		if(!empty($Params['type']) && !empty($Params['proId']))
		{
			$proId = (int) $Params['proId'];
			$mod3IdArr = [];
			switch($Params['type'])
			{
				case 'self':
					$B2cBase = new B2cBase();
					$res = $B2cBase->get('bc_product_model3_link', ['pml3_mod3_id'], sprintf(" and pml3_pro_id =%d", $proId));
					$mod3IdArr = array_column($res['data'], 'pml3_mod3_id');
				break;
				case 'fromPro':
					$LibEncry = new LibEncry();
					$t = $LibEncry->decode(base64_decode($Params['proId']));
					$tArr = explode('@', $t);
					$LibYpApi = new LibYpApi();
					$res = $LibYpApi->Get('ypc/getItemYpcModelIds', [], ['type'=>$tArr[0], 'proIds'=>[$tArr[1]]]);
					$mod3IdArr = !empty($res['data'][$tArr[1]])? $res['data'][$tArr[1]]: [];	
				break;
			}
			if(!empty($mod3IdArr))
			{
				$ComModel = new ComModel();
				$where = sprintf(" and mod3_id in (%s) order by brand_seq, brand_initial, make_seq, make_initial, mod1_name, mod2_name, mod3_name", implode(',', $mod3IdArr));
				$res = $ComModel->getModel(3, ['brand_name, make_name, mod2_name, mod3_name, mod3_start_year, mod3_end_year, mod3_engine'], $where);
				foreach($res['data'] as $k=>$v)
				{
					$v['mod3_year'] = LibFc::formatViewYear($v['mod3_start_year'], $v['mod3_end_year'], 2);
					$modelArr[$k] = $v;
				}
			}
		}
		LibTpl::Set('modelArr', $modelArr);
		$html = LibTpl::Fetch();
		LibFc::ajaxJsonEncode(['status'=>true, 'data'=>$html]);
	}



	/**获取用户配置**/
	function getUserConfig()
	{
		$B2cShop = new B2cShop();
		$res = $B2cShop->getUserConfig($_SESSION['_userid']);
		LibFc::ajaxJsonEncode($res);
	}

	
	/**设置用户配置**/
	function setUserConfig()
	{
		$config = [];
		foreach($_POST as $filed=>$val)
		{
			switch($filed)
			{
				case 'modelFileds':
					$config[$filed]	= $val;
				break;
			}
		}
		$B2cShop = new B2cShop();
		$res = $B2cShop->setUserConfig($_SESSION['_userid'], $config);
		LibFc::ajaxJsonEncode($res);
	}
	
	//修改店铺的默认车型模式
	function setShopModType()
	{
		$smodtype = $_POST['smodtype'];
		$B2cProduct = new B2cProduct();
		$res = $B2cProduct->set('sh_shop', ['shop_smt_code'=>$smodtype], sprintf(" and shop_id=%d", $_SESSION['_shopid']));
		LibFc::ajaxJsonEncode($res);
	}


	//产品导入模板
	function importDemo()
	{
		$B2cProduct = new B2cProduct();
		$B2cProduct->exportDifferentDemo($_SESSION['_shopid']);
	}

	//检测导入产品
	function checkImportItem()
	{
		ini_set('memory_limit', '2048M');
		$brow = 4;
		$OthExcel = new OthExcel();
		$res = $OthExcel->read($_FILES['file']['tmp_name'], 0, [], $brow);
		$rowsArr = $res['data'];
		$proArr = [];
		foreach($rowsArr as $row=>$data)
		{
			//获取字段
			if($row == $brow)
			{
				$filedArr = $data;
			}
			else
			{
				foreach($data as $col=>$val)
				{
					if(stripos($filedArr[$col], 'para_') === 0)
					{
						$proArr[$row]['part_param'][substr($filedArr[$col], 5)] = $val;
					}
					else
					{
						$proArr[$row][$filedArr[$col]] = $val;
					}
				}
			}
		}
		$B2cProduct = new B2cProduct();
		$res = $B2cProduct->checkImportSuperItem($_SESSION['_shopid'], $proArr);
		//日志
		$B2cLog = new B2cLog();
		$item = [
			'log_shop_id'=>$_SESSION['_shopid'],
			'log_category'=>'21',
			'log_txt'=>'批量导入配件',
			'log_dataid'=>$_SESSION['_shopid']
		];
		$B2cLog->addFastLog($item);	
		LibFc::ajaxJsonEncode($res);
	}


	//导入产品
	function importItem()
	{
		$B2cProduct = new B2cProduct();
		$proItems = json_decode($_POST['items'],true);
		if (mvc::$cfg['isGzhShop']) {
			$res = $B2cProduct->importB2cItem($_SESSION['_shopid'], $proItems);
		}else{
			$res = $B2cProduct->importSuperItem($_SESSION['_shopid'], $proItems);
		}
		
		LibFc::ajaxJsonEncode($res);
	}


	//获取更新车型的配件ID
	function getRefreshModelItems()
	{
		if(!empty($_POST['spartId']))
		{
			$spartIdArr = [];
			foreach(explode(',', $_POST['spartId']) as $v)
			{
				if(stripos($v, '_'))
					$spartIdArr[] = LibFc::Escape($v);
			}
			if(!empty($spartIdArr))
			{
				$where = sprintf(" and pro_shop_id=%d and concat(pro_part_id, '_', pro_pas_id) in ('%s')", $_SESSION['_shopid'], implode("','", $spartIdArr));
				$table = 'bc_product join bc_number on pro_id = num_pro_id left join sh_super_part on sup_shop_id = pro_shop_id and sup_part_id = pro_part_id';
				$B2cBase = new B2cBase();
				$res = $B2cBase->get($table, ['distinct(pro_id) pro_id'], $where);
				$res['data'] = array_column($res['data'], 'pro_id');
				//日志
				$B2cLog = new B2cLog();
				$item = [
					'log_shop_id'=>$_SESSION['_shopid'],
					'log_category'=>'21',
					'log_txt'=>'批量操作：配件号码更新适用车型',
					'log_dataid'=>$_SESSION['_shopid']
				];
				$B2cLog->addFastLog($item);
				LibFc::ajaxJsonEncode($res);
			}
		}
		LibFc::ajaxJsonEncode(['status'=>true, 'data'=>[]]);
	}
	

	//刷配件适用车型
	function refreshItemModel()
	{
		$B2cProduct = new B2cProduct();
		$res = $B2cProduct->refreshItemModel($_SESSION['_shopid'], $_POST['type'], $_POST['items']);
		$proIdArr = $_POST['items'];
		$codeRes = $B2cProduct->get('bc_product_info',['pri_code'],sprintf(" and pri_pro_id in (%s)", implode(',',$proIdArr)));
		$codeArr = $codeRes['data'] ? array_column($codeRes['data'], 'pri_code') : [];
		$item = [
			'log_category'=>1,
			'log_shop_id'=>$_SESSION['_shopid'],
			'log_atime'=>time(),
			'log_dataid'=>$proIdArr,
			'log_txt'=>'配件：'.implode(',',$codeArr).'批量刷车型'
		];
		$B2cLog = new B2cLog();
		$B2cLog->addFastLog($item);
		LibFc::ajaxJsonEncode($res);
	}



	//获取关联号码的配件ID
	function getRefreshYpItems()
	{
		$arr = [];
		if(!empty($_POST['spartId']) && !empty($_POST['facs']))
		{
			$spartIdArr = [];
			foreach(explode(',', $_POST['spartId']) as $v)
			{
				if(stripos($v, '_'))
					$spartIdArr[] = LibFc::Escape($v);
			}
			$facArr = [];
			foreach(explode(',', $_POST['facs']) as $v)
			{
				$v = strtoupper(LibFc::Escape($v));
				$facArr[$v] = $v;
			}
			if(!empty($facArr) && !empty($spartIdArr))
			{
				$where = sprintf(" and pro_shop_id=%d and num_show = 1 and UPPER(num_factory) in ('%s') and concat(pro_part_id, '_', pro_pas_id) in ('%s')",
					$_SESSION['_shopid'], implode("','", $facArr), implode("','", $spartIdArr));
				$table = 'bc_number join bc_product on pro_id = num_pro_id';
				$B2cBase = new B2cBase();
				$res = $B2cBase->get($table, ['distinct(pro_id) pro_id'], $where);
				$arr = array_column($res['data'], 'pro_id');
			}

			$B2cLog = new B2cLog();
			$item = [
				'log_shop_id'=>(int)$_SESSION['_shopid'],
				'log_category'=>'21',
				'log_txt'=>'批量操作：通过已有号码关联宜配产品号码',
				'log_dataid'=>(int)$_SESSION['shop_id']
			];
			$B2cLog->addFastLog($item);

		}
		LibFc::ajaxJsonEncode(['status'=>true, 'data'=>$arr]);
	}


	//刷配件的宜配号码
	function refreshYpItem()
	{
		$B2cProduct = new B2cProduct();
		$res = $B2cProduct->refreshYpItem($_SESSION['_shopid'], $_POST['type'], explode(',', $_POST['facs']), $_POST['items']);
		LibFc::ajaxJsonEncode($res);
	}

	//大文件上传
	function uploadBigFile()
	{
		ini_set('memory_limit', '2048M');
		$OthUpload = new OthUpload();
		$res = $OthUpload->uploadBigFile($_POST);
		LibFc::ajaxJsonEncode($res);
	}

	//检测导入图片包
	function checkImportItemImgZip()
	{
		ini_set('memory_limit', '2048M');
		$B2cProduct = new B2cProduct();
		$optArr = $_POST;
		$res = $B2cProduct->checkImportItemImgZip($_SESSION['_shopid'], $optArr);
		//日志
		$B2cLog = new B2cLog();
		$item = [
			'log_shop_id'=>(int)$_SESSION['_shopid'],
			'log_category'=>'21',
			'log_txt'=>'批量导入配件图片',
			'log_dataid'=>(int)$_SESSION['shop_id']
		];
		$B2cLog->addFastLog($item);
		LibFc::ajaxJsonEncode($res);
	}

	//导入配件图片
	function importItemImg()
	{
		ini_set('memory_limit', '2048M');
		$B2cProduct = new B2cProduct();
		$optArr = $_POST;
		$res = $B2cProduct->importItemImg($_SESSION['_shopid'], $optArr);
		LibFc::ajaxJsonEncode($res);
	}

	//
	public function batchUploadImage()
    {
		ini_set('memory_limit', '2048M');
        if(empty($_POST) || empty($_POST['imgs']) || empty($_POST['pro_id']))  LibFc::ajaxJsonEncode(['status' => false,'data' => '参数错误']);
        $dbBase = new B2cProduct();
        $_POST['pro_id'] = explode(',',$_POST['pro_id']);

		$uploadType = isset($_POST['upload_type'])?$_POST['upload_type']:'';

        $img = [];
        $_POST['imgs'] = explode(',',$_POST['imgs']);
        foreach ($_POST['imgs'] as $k => $v)
        {
            $temp = trim($v);
            if($temp) $img[] = $temp;
            unset($_POST['imgs'][$k],$temp);
        }
        if(count($img) <= 0) LibFc::ajaxJsonEncode(['status' => false,'data' => '图片不可为空']);
		$codeRes = $dbBase->get('bc_product_info',['pri_code'],sprintf(" and pri_pro_id in (%s)",implode(',',$_POST['pro_id'])));
		$codeArr = $codeRes['data']?array_column($codeRes['data'],'pri_code'):[];
        foreach ($_POST['pro_id'] as $key => $proId)
        {
            if((int) $proId <= 0) continue;
			$res = $dbBase->setProductPic((int) $_SESSION['_shopid'],(int) $proId,$img,$uploadType);
            unset($_POST[$key]);
        }
		$B2cLog = new B2cLog();
		$item = [
			'log_category'=>1,
			'log_shop_id'=>$_SESSION['_shopid'],
			'log_atime'=>time(),
			'log_dataid'=>$_POST['pro_id'],
			'log_txt'=>'配件：'.implode(',',$codeArr).'批量上传图片'
		];
		$B2cLog->addFastLog($item);
        LibFc::ajaxJsonEncode($res);
    }

    public function getParamTplList()
    {
        $B2cBase=new B2cBase();
        $res = $B2cBase->get('bc_product_para_tpl',['ppt_id','ppt_name'],sprintf(' and ppt_shop_id=%d order by ppt_seq asc',$_SESSION['_shopid']));
        $tplIds = array_column($res['data'],'ppt_id');
        $fieldArr = ['pptl_ppt_id','prl_id','pru_id','pptl_seq','prl_name','pru_name'];
        $arr = [];
		$countArr = [];
        if(!empty($tplIds)){
            $newLink = $B2cBase->get('bc_product_para_tpl_link 

			left join bc_product_label on prl_id=pptl_prl_id 
			left join bc_product_unit on pru_id=pptl_pru_id
			',$fieldArr,sprintf(' and pptl_ppt_id in (%s) order by pptl_seq asc,pptl_prl_id asc',implode(',',$tplIds)));
			//使用该自定义模板参数的产品数量
			
			$prlIdArr = array_column($newLink['data'],'prl_id');
			if($prlIdArr){
				$countArr = $B2cBase->get('bc_product_para_val left join bc_product on pro_id = prpv_pro_id',['concat_ws(\'_\',prpv_prl_id,pro_ppt_id) as prl_id_key,count(*) as product_num'],sprintf(' and pro_ppt_id in (%s)  and prpv_prl_id in (%s) group by prpv_prl_id,pro_ppt_id',implode(',',$tplIds),implode(',',$prlIdArr)));
				$countArr = array_column($countArr['data'],null,'prl_id_key');
			}
			foreach ($newLink['data'] as $value)
            {
				$key  = $value['prl_id'].'_'.$value['pptl_ppt_id'];
				$value['product_num'] = $countArr[$key]['product_num']?:0;	
                $arr[$value['pptl_ppt_id']][] = $value;
            }
        }
        unset($newLink);
        $res['new_link'] = $arr;
        LibFc::ajaxJsonEncode($res);
    }

    public function getParamTplById()
    {
        $id = $_POST['id'];
        if($id <= 0){
            LibFc::ajaxJsonEncode(['status' => true,'data' => []]);
        }
        $fieldArr = ['pptl_ppt_id','prl_id','pru_id','pptl_seq','prl_name','pru_name'];
        $newLink = (new B2cBase)->get('bc_product_para_tpl_link left join bc_product_label on prl_id=pptl_prl_id left join bc_product_unit on pru_id=pptl_pru_id',$fieldArr,sprintf(' and pptl_ppt_id = %d order by pptl_seq asc,pptl_prl_id asc',$id));
        LibFc::ajaxJsonEncode($newLink);
    }

    public function saveParamTpl()
    {

        $B2cProduct=new B2cProduct();
        $params=[];
        $res=['status'=>false,'data'=>'添加失败'];
        if(!empty($_POST))
        {
            if(!empty($_POST['data']))
            {
                foreach ($_POST['data'] as $k => $v)
                {
                    if(empty($v)){
                        continue;
                    }
                    if(empty(trim($v['prl_name']))){
                        continue;
                    }
                    $params[]= [
                        'name' => trim($v['prl_name']),
                        'seq' => (int) $v['pptl_seq'] ? (int) $v['pptl_seq'] : 999,
                        'unit' => $v['pru_name'] ?: ''
                    ];
                }
                if(count($params))
                {
                    if($_POST['tpl_id'])
                    {
                        $res = $B2cProduct->editProParamsTpl($_POST['tpl_id'],$_POST['tpl_name'],$params,$_SESSION['_shopid']);
                    }
                    else
                    {
                        $res = $B2cProduct->addProParamsTpl($_POST['tpl_name'],'999',$params,$_SESSION['_shopid']);
                    }
                }
            }
        }
        if($res['status']){
           // var_dump($res['status'] != true);
            if( is_numeric($res['data'])){
                $tplId =  (int) $res['data'];
            }else{
                $tplId = (int) $_POST['tpl_id'];
            }
            $B2cBase=new B2cBase();
            $fieldArr = ['pptl_ppt_id','prl_id','pru_id','pptl_seq','prl_name','pru_name'];
            $newLink = $B2cBase->get('bc_product_para_tpl_link 
			left join bc_product_label on prl_id=pptl_prl_id 
			left join bc_product_unit on pru_id=pptl_pru_id',$fieldArr,sprintf(' and pptl_ppt_id = %d order by pptl_seq asc,pptl_prl_id asc',(int) $tplId));
            //关联产品的数量
			$prlIdArr =	array_column($newLink['data'],'prl_id');
			$countArr = [];
			if($prlIdArr){
				$countArr = $B2cBase->get('bc_product_para_val left join bc_product on pro_id = prpv_pro_id',['prpv_prl_id,pro_ppt_id,count(*) as product_num'],sprintf(' and pro_ppt_id = %d  and prpv_prl_id in (%s) group by prpv_prl_id',(int) $tplId,implode(',',$prlIdArr)));
           		
				$countArr = array_column($countArr['data'],null,'prpv_prl_id');
				
			}
			foreach ($newLink['data'] as $key => &$value) {
				$value['product_num'] = 0;	
				if(!empty($countArr[$value['prl_id']]) && $countArr[$value['prl_id']]['pro_ppt_id'] == $value['pptl_ppt_id']){
					$value['product_num'] = $countArr[$value['prl_id']]['product_num'];
				}
			}
			unset($value);
			$res['result'] = $newLink['data'];
        }
        LibFc::ajaxJsonEncode($res);
    }

    public function delParamTpl()
    {
       // $OthCheck = new OthCheck();
       // $OthCheck->hasShop();
        $status = false;
        $data = '参数不正确！';
        $B2cProduct=new B2cProduct();
        //参数模版排序
        if(!empty($_POST['sort']))
        {
            $res = $B2cProduct->resetProParamsTplSort($_SESSION['_shopid'],$_POST['sort']);
            if($res['status']) $status = true;
        }
        //删除参数模版
        if(!empty(trim($_POST['delTplId'],',')))
        {
            $res = $B2cProduct->delProParamsTpl(explode(',', trim($_POST['delTplId'],',')),$_SESSION['_shopid']);
            if($res['status']) $status = true;
        }
        if($status) $data = true;
        LibFc::ajaxJsonEncode(['status'=>$status,'data'=>$data]);
    }


	//检测导入配件车型备注
	function checkItemModelRemark()
	{
		$B2cProduct = new B2cProduct();
		$optArr = $_POST;
		//$optArr = ['ext'=>'xls', 'filename'=>"0b9fdd0683e32416d63bc243a96db81c"];
		$res = $B2cProduct->checkItemModelRemark($_SESSION['_shopid'], $optArr);
		//日志
		$B2cLog = new B2cLog();
		$item = [
			'log_shop_id'=>$_SESSION['_shopid'],
			'log_category'=>'21',
			'log_txt'=>'批量操作：导入配件车型备注',
			'log_dataid'=>$_SESSION['_shopid']
		];
		$B2cLog->addFastLog($item);
		LibFc::ajaxJsonEncode($res);
	}

	//导入配件车型备注
	function importItemModelRemark()
	{
		ini_set('memory_limit', '2048M');
		$B2cProduct = new B2cProduct();
		$optArr = $_POST;
		$res = $B2cProduct->importItemModelRemark($_SESSION['_shopid'], $optArr);
		LibFc::ajaxJsonEncode($res);
	}
	/* 
	* 修改分类
	*/
	function ajaxChangeProSort()
	{
		$proIdArr = explode(',', $_POST['proId']);
        $sortIdArr = explode(',',$_POST['sortId']);
		$result = ['status'=>false,'data'=>'参数不正确'];
        if(!empty($proIdArr) && !empty($sortIdArr))
        {
            $B2cProduct = new B2cProduct();
            $result = $B2cProduct->changeProSort($_SESSION['_shopid'],$proIdArr,$sortIdArr);
			if($result['status']){
				$result = ['status'=>true,'data'=>'操作成功'];
			}
        }
		LibFc::ajaxJsonEncode($result);
	}
	/* 
	*  修改运费模板列表
	*/
	function ajaxChangeFrt()
	{
		$Params = mvc::$URL_PARAMS;
		$result=['status'=>false,'data'=>'参数错误'];
		if(LibFc::Int($Params['frtid']))
		{
			$B2cBase=new B2cBase();
			$B2cProduct=new B2cProduct();
			$res=$B2cBase->get('sh_freight_tpl',['count(1) count'],sprintf(' and frt_id=%d and frt_shop_id=%d',$Params['frtid'],$_SESSION['_shopid']),true);
			if($res['data']['count'])
			{
				
				$result=$B2cProduct->setProFrt($_SESSION['_shopid'],$_POST['pro_id'],$Params['frtid']);
				if($result['status']){
					$result = [
						'status'=>false,'data'=>'操作成功'
					];
				}
			}
		}
		LibFc::ajaxJsonEncode($result);
	}
	/* 
	* 获取运费模板列表
	*/
	function ajaxGetFrtList()
	{
		$B2cFreight=new B2cFreight();
        $res=$B2cFreight->getSellerTemplateList($_SESSION['_shopid']);
        $data=[];
        if(!empty($res['data']))
        {
            foreach ($res['data'] as $v)
            {
                $data[]=['frtid'=>$v['frt_id'],'title'=>$v['frt_name']];
            }
        }
        LibFc::ajaxJsonEncode(['status'=>true,'data'=>$data]);
	}
	/* 
	* 获取描述模板列表
	*/
	function ajaxGetDescList()
	{
		$B2cProduct = new B2cProduct();
		$res = $B2cProduct->Get('bc_product_desc_tpl',['pdt_id, pdt_name'],' and pdt_type = 0 and pdt_shop_id='.$_SESSION['_shopid']);
        LibFc::ajaxJsonEncode(['status'=>true,'data'=>$res['data']]);
	}
	/* 
	* 修改描述模板
	*/
	function ajaxChangeDesTpl()
    {
        $Params = mvc::$URL_PARAMS;
		$result=['status'=>false,'data'=>'参数错误'];
        if(LibFc::Int($Params['pdtid']))
        {
            $B2cProduct=new B2cProduct();
            $result = $B2cProduct->setProDesTpl($_SESSION['_shopid'],$_POST['pro_id'],$Params['pdtid']);
        }
        LibFc::ajaxJsonEncode($result);
    }
	/* 
	* 模板列表
	*/
	function proDescTpl()
	{
		$B2cBase = new B2cBase();
		$proData = $B2cBase->Get('bc_product_desc_tpl',['pdt_id','pdt_name','pdt_remark','pdt_add_time'],sprintf(' and pdt_shop_id=%d and pdt_type=0 order by pdt_add_time asc',$_SESSION['_shopid']));
		LibTpl::Set('pdtArr',$proData['data']);
		LibTpl::Set('title', '详情模板');
		LibTpl::Put();
	}

	/* 
	* 配件模板
	*/
	function proDescTplManage()
	{
		$params = mvc::$URL_PARAMS;
		$title ='配件模版';
	

		if($params['order']=='edit' && LibFc::Int($params['pdt_id']))
		{
			$this->checkRule('PM02');
			$B2cBase = new B2cBase();
			$proData = $B2cBase->get('bc_product_desc_tpl',['*'],sprintf(' and pdt_id=%d and pdt_shop_id=%d',$params['pdt_id'],$_SESSION['_shopid']),true);
			if (empty($proData['data']))
				LibTpl::Error('配件模版参数错误','/seller/proDescTpl');
			
			LibTpl::Set('pdtArr',$proData['data']);
			$title = '编辑配件模版';
		}else if($params['order']=='add')
		{
			$this->checkRule('PM01');
			$title = '新增配件模版';
		}
		LibTpl::Set('title',$title);
		LibTpl::Put();
	}
	/* 
	* 保存配件模板信息
	*/
	function savePDTInfo()
	{	
		$B2cBase = new B2cBase();
		
		if($_POST['orderType'] == 'add' && !empty(LibFc::Escape($_POST['pdt_name'])))
		{
			$this->checkRule('PM01');
			$dataArr =[
				'pdt_shop_id'=>$_SESSION['_shopid'],
				'pdt_name'=>$_POST['pdt_name'],
				'pdt_remark'=>$_POST['pdt_remark'],
				'pdt_txt'=>$_POST['pdt_txt'],
				'pdt_add_time'=>time()
			];
			$re = $B2cBase->Add('bc_product_desc_tpl',$dataArr, ['pdt_txt']);
			LibFc::ajaxJsonEncode($re);
		}
		if($_POST['orderType'] == 'edit' && !empty(LibFc::Escape($_POST['pdt_name'])) && LibFc::Int($_POST['pdt_id']))
		{
			$this->checkRule('PM02');
			$dataArr =[
				'pdt_shop_id'=>$_SESSION['_shopid'],
				'pdt_name'=>LibFc::Escape($_POST['pdt_name']),
				'pdt_remark'=>LibFc::Escape($_POST['pdt_remark']),
				'pdt_txt'=>LibFc::Escape($_POST['pdt_txt']),
				'pdt_set_time'=>time()
			];
			$re = $B2cBase->Set('bc_product_desc_tpl',$dataArr,sprintf(' and pdt_id=%d and pdt_shop_id=%d',$_POST['pdt_id'],$_SESSION['_shopid']), ['pdt_txt']);
			$re['data']=$_POST['pdt_id'];
			LibFc::ajaxJsonEncode($re);
		}
	}
	/* 
	* 删除模板
	*/
	public function delproDescTpl()
	{
		$this->checkRule('PM03');
		if($_POST['orderType']=='del' && LibFc::Int($_POST['proId']))
		{
			$B2cBase = new B2cBase();
			$re =$B2cBase->Del('bc_product_desc_tpl',sprintf(' and pdt_id=%d and pdt_shop_id=%d',$_POST['proId'],$_SESSION['_shopid']));
			LibFc::ajaxJsonEncode($re);
		}
		LibFc::ajaxJsonEncode(['status'=>false,'data'=>'参数不正确！']);
	}

	/**  
	*@method 处理配件上下架
	*@author zhengweihua 2022/4/27 
	*/
	public function dealWithPro()
	{
		
		$Params = mvc::$URL_PARAMS;
		if(isset($Params['tag']))
		{
		
			$B2cProduct=new B2cProduct();
			$shopId=$_SESSION['_shopid'];
			$proArr = explode(',',$_POST['proIds']);
			if(count($proArr))
			{
				$where=sprintf(' and pro_shop_id=%d and pro_id IN(%s)',$shopId,$_POST['proIds']);
				$target=[];
	
				if($Params['tag']=='recommend')
				{
					$re=$B2cProduct->get('sh_shop',['shop_window_count'],sprintf(' and shop_id=%d',$_SESSION['_shopid']),true);
					$windowCount=$re['data']['shop_window_count'];
					$useTotal=$B2cProduct->get('bc_product',['count(1) count'],sprintf(" and pro_promoted='Y' and pro_shop_id=%d",$_SESSION['_shopid']),true);
					$lest=$windowCount-$useTotal['data']['count'];
					
					if($lest>0)
					{
						$proArr=array_slice($proArr,0,$lest);
						$where=sprintf(' and pro_shop_id=%d and pro_id IN(%s)',$shopId,implode(',',$proArr));
					}else
					{
						LibFc::ajaxJsonEncode(['status'=>true,'data'=>true]);
						exit();
					}

					// echo 132;
					$target=['pro_promoted'=>'Y'];
				}
				elseif($Params['tag']=='unrecommend')
				{
					$target=['pro_promoted'=>'N'];
				}
				elseif($Params['tag']=='out')
				{
					$target=['pro_status'=>0];
				}
				elseif($Params['tag']=='sell')
				{
					$target=['pro_status'=>1];
				}
			
				$res=$B2cProduct->dealWithPro($shopId,$where,$Params['tag'],$proArr,$target);
				LibFc::ajaxJsonEncode($res);
			}
		}
		LibFc::ajaxJsonEncode(array('status'=>false,'data'=>'参数错误'));
	}
	/** 
	*@method 刷新分类
	*@author zhengweihua 2022/4/27 
	*/
	public function refreshSort()
	{
		$params = mvc::$URL_PARAMS;
		$hasShopSortId=[];
		if(!empty($params['proId'])){
			
			$B2cBase = new B2cBase();
			//商品分类
			$res = $B2cBase->getFieldUniVal('bc_product_sort', 'prs_sort_id', sprintf(" and prs_pro_id=%d", $params['proId']));
			$hasShopSortId = $res['data'];
		}
		//店铺分类
		$B2cShopSort = new B2cShopSort();
		$res = $B2cShopSort->getShopSortZtree($_SESSION['_shopid'], $hasShopSortId, false);
		LibFc::ajaxJsonEncode($res);
	}

	/**
	* @method 选择配件分类页面
	* @author zhengweihua 2022/4/27
	*/
	public function productPart()
	{
		$Params = mvc::$URL_PARAMS;
		$B2cPart = new B2cPart();
		$where = sprintf(' and sup_shop_id=%d',(int)$_SESSION['_shopid']);
		$countRes = $B2cPart->get('sh_super_part', ['count(*) as count'], $where, true);
		$count = $countRes['data']['count'];
		if ($count > 0)
		{	
			$where  = '';
			if(!empty($Params['keyword'])){
				$where .= sprintf(" and (part_name like '%%%s%%' or pas_name like '%%%s%%')",LibFc::Escape($Params['keyword']),LibFc::Escape($Params['keyword']));
			}
			$where .= sprintf(" and sup_shop_id=%d ORDER BY pt_seq, part_initial, pas_seq",(int)$_SESSION['_shopid']);
			$table = 'sh_super_part 
			join bc_part on sup_part_id = part_id 
			join bc_part_tree ON pt_part_id = part_id and pt_ismain=1
			left join bc_part_small on  part_id = pas_part_id';
			$res = $B2cPart->get($table, ['part_id, part_name, pas_id, pas_name,pt_path'], $where);

			$allPartRes = $B2cPart->getAllPart();
			$AllPart = $allPartRes['data'];
			foreach($res['data'] as $v)
			{
				$v['id'] = $v['part_id'].'_'.((int) $v['pas_id']);
				$v['pas_id'] = $v['pas_id'];
				$v['name'] = empty($v['pas_name'])? $v['part_name']: $v['pas_name'];
				$part_pathArr =$v['pt_path']? explode(',',$v['pt_path']):[];
				$partNamesArr = [];
				$v['part_path'] = $v['pt_path'].','.$v['part_id'];
				foreach ($part_pathArr as $part_item) 
				{
					if(!empty($AllPart[$part_item]))
					{
						$partNamesArr[] = $AllPart[$part_item]['part_name'];
					}
				}
				$v['partNames'] = implode('>>',$partNamesArr);
				if(!empty($v['pas_id']))
				{
					if(empty($arr[$v['part_id'].'_0']))
					{
						$t = $v;
						$t['id'] = $t['part_id'].'_0';
						$t['name'] = $t['part_name'];
						$t['pas_id'] = 0;
						$t['pas_name'] = '';
						
						$arr[$t['id']] = $t;
					}
					$arr[$v['part_id'].'_0']['small_part'][] = $v;
				}else{
					$arr[$v['part_id'].'_0'] = $v;
				}
			}
			$superPartArr =	empty($arr)?[]:array_values($arr);
			LibTpl::Set('hasDiyPart', true);
			LibTpl::Set('superPartArr', $superPartArr);
		}
		LibTpl::Set('Params', $Params);
		LibTpl::Put();
	}
	/**
	* @method 获取配件分类名称
	* @author zhengweihua 2022/4/27
	*/
	public function ajaxGetPartNames()
	{
		$params =	mvc::$URL_PARAMS;
		$B2cPart  = new B2cPart();
		$B2cBase = new B2cBase();
		$res = $B2cPart->getAllPart();
		$AllPart = $res['data'];
		$data  = [
			'partNames' =>[],
			'smallPartArr'=>[],
			'pro_part_id'=>0,
			'pro_pas_id'=>0
		];

		$pro_part_id = 0;
		$temp = [];
		foreach(explode(',', $params['partPath']) as $k=>$v)
		{
			$temp[] = (int) $v;
		}
		$temp = array_unique($temp);
		$last = array_pop($temp);
		
		//查询是否有该分类
		$res = $B2cBase->get('bc_part_tree  join bc_part on part_id=pt_part_id', ['pt_part_id', 'pt_path'], sprintf(" and pt_part_id=%d and pt_path='%s' ", $last, implode(',', $temp)), true);
		
		if(!empty($res['data']))
		{
			$res = $res['data'];
			$pro_part_id = $res['pt_part_id'];
			$pro_part_path = $res['pt_path'].','.$res['pt_part_id'];
			//新增店铺最近使用的零件
			$B2cPart->addRecentPart($_SESSION['_shopid'], $pro_part_path);
		}
		$data['partNames'] = [];
		foreach(explode(',', $params['partPath']) as $v)
		{
			if(!empty($AllPart[$v]))
			{
				$data['partNames'][] = $AllPart[$v]['part_name'];
			}
		}
		if($pro_part_id){
			$res = $B2cBase->get('bc_part_small', ['pas_id', 'pas_name'], sprintf(" and pas_part_id=%d order by pas_seq", $pro_part_id));
			$data['smallPartArr'] = $res['data'];
			$data['pro_part_id'] = $pro_part_id;
			$data['pro_pas_id'] = isset($params['pro_pas_id'])?$params['pro_pas_id']:0;
		}
		
		LibFc::ajaxJsonEncode(['status'=>true,'data'=>$data]);
	}
	/**
	* @method 获取描述模板详情
	* @author zhengweihua 2022/4/27
	*/
	public function getDescTplDetail()
	{
		$Params = mvc::$URL_PARAMS;
		$B2cBase = new B2cBase();
		$where = sprintf(' and pdt_shop_id=%d and pdt_type=0', $_SESSION['_shopid']);
		if(empty($Params['tplId'])){
			LibFc::ajaxJsonEncode(['status'=>false,'data'=>'提供的参数有误，获取数据失败！']);	
		}
		
		$where .=sprintf(' and pdt_id=%d ',LibFc::Escape($Params['tplId']));
		
		$tplData = $B2cBase->Get('bc_product_desc_tpl', ['*'], $where,true);
		LibFc::ajaxJsonEncode(['status'=>true,'data'=>$tplData]);
	}
	/**
	* @method 获取配件分类
	* @author zhengweihua 2022/4/27
	*/
	public function ajaxPartSort()
	{	
		$Params = mvc::$URL_PARAMS;
		$where = sprintf(' and part_id in(select pro_part_id from bc_product where pro_shop_id=%d)',$_SESSION['_shopid']);
		$where .= ' order by pt_seq, part_initial ';
		$B2cPart = new B2cPart();
		$res = $B2cPart->get('bc_part 
		join bc_part_tree on part_id = pt_part_id and pt_ismain=1 
		left join bc_part_small on part_id = pas_part_id ', ['part_id', 'part_name','pt_parent_part_id','pas_id','pas_name'], $where);
		$partSortArr = [];
		$arr[] = ['name'=>'全选/全不选','pId'=>0,'id'=>0,'open'=>true,'checked'=>true];
		$parentIdCount =  $parentIdsCount = [];
		$selectedPartIds = [];
		$mod = '_'; // 下划线分隔的，为原有的多层级选中情况  逗号分隔,为直接多选
		if(strpos($Params['spart_id'], ',') !== false){
			$mod = ',';
		}
		if(!empty($Params['spart_id'])){
			// 处理多个part_id的情况，格式可能是 "123_456_789" 或单个 "123_0"
			$partIdArr  = [];
			if($mod == '_'){
				$partIdArr = explode('_', $Params['spart_id']);
				$parted_id = $partIdArr[0];
-				$pased_id = $partIdArr[1];
			}else{
				$partIdArr = explode(',', $Params['spart_id']);
				$selectedPartIds = $partIdArr;
			}
		}
		$nochecked = [];
		foreach($res['data'] as $v)
		{
			$t = [];
			$parentIdCount[$v['pt_parent_part_id']][$v['part_id']] = $v['part_id'];

			if(empty($arr[$v['part_id']])){

				$t['id'] = $v['part_id'];
				$t['spart_id'] = $v['part_id'].'_0';
				$t['name'] = $v['part_name'];
				$t['pId']  = $v['pt_parent_part_id'];
				$t['checked'] = true;
				
				if($mod == '_'){
					if(!empty($parted_id) && $parted_id != $v['part_id']){
						$t['checked'] = false;
						$nochecked[] = $v['pt_parent_part_id']; 
					}
				}else{
					// 如果有选中的part_id，只有在选中列表中的才设为true
					if(!empty($selectedPartIds)){
						$t['checked'] = in_array($v['part_id'], $selectedPartIds);
						if(!$t['checked']){
							$nochecked[] = $v['pt_parent_part_id']; 
						}
					}
				}
				$arr[$t['id']] = $t;
			}

			if(!empty($v['pas_id'])){
				$t['id'] = ((int) $v['pas_id']);
				$t['name'] = $v['pas_name'];
				$t['pId'] = $v['part_id'];
				$t['spart_id'] = $v['part_id'].'_'. ((int) $v['pas_id']);
				$t['checked'] = true;
				if($mod == '_'){
					if(!empty($parted_id) && $v['part_id']!=$parted_id){
						$t['checked'] = false;
					}else if((!empty($parted_id) && $v['part_id']==$parted_id)){
						if ($pased_id>0 && $v['pas_id']!=$pased_id){
							$t['checked'] = false;
							$arr[$v['part_id']]['checked'] = false; 
						}
					}
				}else{
					if(!empty($selectedPartIds)){
						$t['checked'] = in_array($v['pas_id'], $selectedPartIds);
					}
				}
				
				$arr[$v['pas_id']] = $t;
			}
		}

		$partSortArr = array_values($arr);
		//上级
		$parentArr = array_column($res['data'],'pt_parent_part_id');
		$res1 = $B2cPart->get('bc_part', ['part_id', 'part_name'], sprintf(' and part_id in(%s)',implode(",",$parentArr)));
		foreach($res1['data'] as $v)
		{
			$t = [];
			if(empty($arr[$v['part_id']]) )
			{
				$t['id'] = $v['part_id'];
				$t['name'] = $v['part_name'];
				$t['spart_id'] = $v['part_id'].'_0';
				$t['pId']  = 0;
				$t['checked'] = true;
				if($mod == '_'){
					if(in_array($t['id'],$nochecked)){
						$t['checked'] = false;
					}
				}else{
					// 如果有选中的part_id，只有在选中列表中的才设为true
					if(!empty($selectedPartIds)){
						$t['checked'] = in_array($v['part_id'], $selectedPartIds);
					} else if(in_array($t['id'],$nochecked)){
						$t['checked'] = false;
					}
				}
				//<=5的才展开
				$t['open'] = count($parentIdCount[$v['part_id']]) <= 5?true:false;
				$partSortArr[] = $t;
			}
			
		}
		LibFc::ajaxJsonEncode(['status'=>true,'data'=>$partSortArr]);
	}

	/**
	 * @method 设置车型选择
	 * @author zhengweihua 
	 * @copyright 2022-05-06
	 */  
	public function setShopModFrom()
	{

		$B2cBase = new B2cBase();
		//找已存在的值
		$where = sprintf(' and ssm_shop_id = %d',$_SESSION['_shopid']);
		$res = $B2cBase->get('sh_shop_model1',['ssm_mod1_id'],$where);
		$oldMod1Id = array_column($res['data'],'ssm_mod1_id');
		
		
		if($_SERVER['REQUEST_METHOD']==='POST'){
			
			if(!empty($_POST['modId'])){
				$modIdArr = explode(',',$_POST['modId']);
				$delIdArr = array_diff($oldMod1Id,$modIdArr);
				$addIdArr = array_diff($modIdArr,$oldMod1Id);
				$arr = [];
				if(!empty($delIdArr)){
					$where =  sprintf(' and ssm_mod1_id in (%s)',implode(',',$delIdArr));
					$B2cBase->del('sh_shop_model1',$where);
				}
				if(!empty($addIdArr)){
					foreach ($addIdArr as $item) {
						$t  = [
							'ssm_shop_id'=> $_SESSION['_shopid'],
							'ssm_mod1_id'=> $item
						];
						$arr[] = $t;
					}
	
					$B2cBase->addAny('sh_shop_model1',['ssm_shop_id','ssm_mod1_id'],$arr);
				}
	
			}
			$res = $B2cBase->set('sh_shop',['shop_mod_from'=>LibFc::Escape($_POST['shop_mod_from'])],sprintf(' and shop_id = %d',$_SESSION['_shopid']));
			LibFc::ajaxJsonEncode($res);

		}
		
		//找产品里已经选过的车型
		$table = "bc_product 
		join bc_product_model1_link on pml1_pro_id = pro_id";
		$where = sprintf(" and pro_shop_id = %d",$_SESSION['_shopid']);
		$res = $B2cBase->get($table,['distinct pml1_mod1_id'],$where);
		if($res['data']){
			$curMod1Id = array_column($res['data'],'pml1_mod1_id');
			$oldMod1Id = array_merge($curMod1Id,$oldMod1Id);
		}

		$shopModFrom = $B2cBase->get('sh_shop',['shop_mod_from'],sprintf('and shop_id=%d',$_SESSION['_shopid']),true);
		//全车件品牌限制
		$B2cShop = new B2cShop();
		$brandRes = $B2cShop->getShopBrand($_SESSION['_shopid']);
		$lWhere = '';
		if($brandRes['data']){
			$lWhere = sprintf(" AND brand_id IN (%s)",implode(',',$brandRes['data']));
		}
		$ComModel = new ComModel();
		$table = "bc_model1 
		left join bc_brand on brand_id = mod1_brand_id
		left join bc_make on make_id = mod1_make_id";
		$where = $lWhere.' order by brand_initial ASC, make_initial ASC,mod1_id ASC';
		$res = $ComModel->get($table,['mod1_id,mod1_name,mod1_brand_id,brand_name,brand_code,mod1_make_id,make_name'],$where);

		$arr['brand_0'] =  ['id'=>'brand_0','name'=>'全部','pId'=>0,'open'=>true,'checked'=>$oldMod1Id?true:false];
		foreach ($res['data'] as $key => $item) {
			$t = [];	
			$t['id'] = $item['mod1_id'];
			$t['name'] = $item['mod1_name'];
			$t['pId']  = 'make_'.$item['mod1_make_id'].'_'.$item['mod1_brand_id'];
			$t['type'] = 'model';
			$t['checked'] = in_array($item['mod1_id'],$oldMod1Id)?true:false;
			$arr[$t['id']] = $t;
			//品牌
			if(empty($arr['brand_'.$item['mod1_brand_id']])){
				$t  = [];
				$t['id'] = 'brand_'.$item['mod1_brand_id'];
				$t['name'] = $item['brand_name'];
				$t['pId']  = 'brand_0';
				$t['type'] = 'brand';
				$t['icon'] =  mvc::$cfg['HOST']['b2c'].'static/images/chebiao/'.$item['brand_code'].'.png';
				$arr[$t['id']] = $t;
			}
			//生产商
			if(empty($arr['make_'.$item['mod1_make_id'].'_'.$item['mod1_brand_id']])){
				$t  = [];
				$t['id'] = 'make_'.$item['mod1_make_id'].'_'.$item['mod1_brand_id'];
				$t['name'] = $item['make_name'];
				$t['pId']  = 'brand_'.$item['mod1_brand_id'];
				$t['type'] = 'make';
				$arr[$t['id']] = $t;
			}
			//判断父级是否勾选 展开
			if(in_array($item['mod1_id'],$oldMod1Id)){
				$makeid = 'make_'.$item['mod1_make_id'].'_'.$item['mod1_brand_id'];
				$brandid = 'brand_'.$item['mod1_brand_id'];
				$arr[$makeid]['checked'] =true;
				$arr[$brandid]['checked'] =true;
			}
			
		}
		$title = '车型选择';
		$this->HEAD_CSSJS['plugin'][] = 'zTree';
		LibTpl::Set('HEAD_CSSJS', $this->HEAD_CSSJS);
		LibTpl::Set('shopModFrom',$shopModFrom['data']['shop_mod_from']);
		LibTpL::Set('modId',implode(',',$oldMod1Id));
		LibTpl::Set('dataJson',array_values($arr));
		LibTpl::Set('title',$title);
		LibTpl::Put();
	}
	
	/**
	 * @method 设置会员权限
	 * @author zhengweihua 
	 * @copyright 2022-05-20
	 */
	public function setMemberRule()
	{
		$title = '权限管理';
		$B2cBase = new B2cBase();
		$oldRuleArr = [];
		//已保存权限
		$oldRuleResult = $B2cBase->get('sh_member_rule_link',['smrl_mel_id,smrl_smr_code'],sprintf(" and smrl_shop_id=%d",$_SESSION['_shopid']));
		
		if(!empty($oldRuleResult['data']))
		{
			foreach ($oldRuleResult['data'] as $key => $item) 
			{
				$oldRuleArr[$item['smrl_smr_code']][] = $item['smrl_mel_id'];
			}
		}
	
		if($_SERVER['REQUEST_METHOD'] == 'POST')
		{
			
			if(empty($_POST['ruleArr']))
			{
				LibFc::ReturnJson(false,'参数错误');
			}
			$B2cMemberRules = new B2cMemberRules();
			$res =  $B2cMemberRules->saveMemberRulesLink($_POST['ruleArr'],$_SESSION['_shopid']);
			LibFc::ajaxJsonEncode($res);
			
		}
		$memberLevelArr = $B2cBase->get('sh_member_level',['*']);
		foreach ($memberLevelArr['data'] as &$val) {
			if($val['mel_id']==-1)$val['mel_name']='非注册会员';
			if($val['mel_id']==0)$val['mel_name']='注册会员';	
		}
		unset($val);
		$memberRuleArr = $B2cBase->get('sh_member_rule',['smr_code','smr_name']," and smr_code != 'item_buy' order by smr_seq ");
		//非公众号目录
	
		if(empty(mvc::$cfg['isGzhShop']))
		{
			$where = sprintf(' and ssu_shop_id = %d',(int)$_SESSION['_shopid']);
			$res = $B2cBase->get('sh_super',['ssu_id,ssu_shop_id,ssu_module,ssu_super_gzh,ssu_pjl_show'],$where,true);

			if($res['data'])
			{
				if($res['data']['ssu_super_gzh']==2)
				{
					$moduleArr = explode(',', $res['data']['ssu_module']);

					if (!in_array('user', $moduleArr)) {

						$memberLevelArr['data'] = [['mel_id' => -1, 'mel_name' => '非注册用户']];

						if (!empty($res['data']['ssu_pjl_show'])) {

							$memberLevelArr['data'] = [['mel_id' => -1, 'mel_name' => '非注册用户'], ['mel_id' => 0, 'mel_name' => '注册用户']];
						}
					}
					//无价格模块
					if (!in_array('price', $moduleArr)) {
						
						$memberRuleArr['data'] = array_column($memberRuleArr['data'], null, 'smr_code');
						unset($memberRuleArr['data']['item_price']);
						$memberLevelArr['data'] = array_values($memberLevelArr['data']);
					}
				}
				else
				{
					$memberLevelArr['data'] = [['mel_id'=>-1,'mel_name'=>'非注册用户']];
					unset($memberRuleArr['data']['item_price']);
					//有 品牌目录 时默认有注册会员
					if(!empty($res['data']['ssu_pjl_show']))
					{
						$memberLevelArr['data'] = [['mel_id'=>-1,'mel_name'=>'非注册用户'],['mel_id'=>0,'mel_name'=>'注册用户']];
					}
				}
				
			}	
		}
		LibTpl::Set('memberLevelArr',$memberLevelArr['data']);
		LibTpl::Set('memberRuleArr',$memberRuleArr['data']);
		LibTpl::Set('oldRuleArr',$oldRuleArr);
		LibTpl::Set('ruleCount', count($memberRuleArr['data']));
		LibTpl::Set('title',$title);
		LibTpl::Put();
	}
	
	/**
	 * @method 联系方式设置
	 * @author zhengweihua 
	 * @copyright 2022-05-24
	 */
	public function setShopContact()
	{	
		if($_SERVER['REQUEST_METHOD'] == 'POST')
		{
			$contact = $_POST['contact'];
			$B2cSuperContact = new B2cSuperContact();
			$res =	$B2cSuperContact->setShopContact($contact,$_SESSION['_shopid']);
			LibFc::ajaxJsonEncode($res);
		}
		$B2cBase = new B2cBase();
		$res = $B2cBase->get('sh_super_contact',['*'],sprintf(' and ssc_shop_id=%d order by ssc_seq asc',$_SESSION['_shopid']));
		$contactArr = $res['data'];
		$linkArr = ['phone'=>'手机','tel'=>'电话','qq'=>'QQ','email'=>'邮箱','url'=>'链接','addr'=>'地址'];
		if(empty($res['data']))
		{
			foreach ($linkArr as $key => $value) {
				$data[] = [
					'ssc_type'=>$key,
					'ssc_id'=>0,
					'ssc_val'=>'',
					'ssc_show'=>'',
					'ssc_seq'=>''
				]; 	
			}
			$contactArr = $data;
		}
		
		$title = '联系方式';
		LibTpl::Set('contactArr',$contactArr);
		LibTpl::Set('title',$title);
		LibTpl::Set('linkArr',$linkArr);
		LibTpl::Put();
	}

	/**
	 * @method 批量删除配件图片
	 * @author zhengweihua 
	 * @copyright 2022-08-09
	 */
	public function delProImage()
	{
		$Params = mvc::$URL_PARAMS;

		if($_SERVER['REQUEST_METHOD'] != 'POST') LibFc::ReturnJson(false,'请求错误');
			
		if(empty($_POST['proIds'])) LibFc::ReturnJson(false,'参数错误');

		$B2cProduct=new B2cProduct();

		$res=$B2cProduct->batchDelProImage($_SESSION['_shopid'],$_POST);
		LibFc::ajaxJsonEncode($res);
	}

	/**
	 * @method 店铺同步
	 * @author zhengweihua 
	 * @copyright 2022-08-10
	 */
	public function shopSync()
	{	
		$Params = mvc::$URL_PARAMS;
		
		$this->HEAD_CSSJS['plugin'][] = 'webuploader';
		$this->HEAD_CSSJS['plugin'][] = 'zTree';

		$page = isset($Params['page']) ? $Params['page'] : 1;
		$perPage = isset($_COOKIE['perPage'])? $_COOKIE['perPage'] : 25;

		$B2cBase = new B2cBase();
		//店铺同步设置
		$table  = 'sh_shop_synch join sh_shop on shop_id = sss_shop_id_from';
		$syncres = $B2cBase->get($table,['sh_shop_synch.*,sh_shop.shop_name as from_shop_name'],sprintf(" and sss_shop_id_to = %d",$_SESSION['_shopid']));
		if($syncres['data'])
		{
			if(!isset($Params['mode'])) $Params['mode'] = 'other';

			$syncsetArr = array_column($syncres['data'],null,'sss_shop_id_from');
			
			foreach ($syncsetArr as $key => $val) 
			{
				$val['sss_act'] = json_decode($val['sss_act'],true);
				if($val['sss_act'] && !in_array('number',array_keys($val['sss_act']))) $val['sss_act']['number'] = 'add';

				if($key!=$_SESSION['_shopid']){
					$otherSyncset = $val;
					$Params['mode'] = 'other';	
				}else{
					$sameSyncset = $val;
					$Params['mode'] = 'self';
				}
			}
			if(!$sameSyncset) {
				$sameSyncset = ['sss_shop_id_from'=>$_SESSION['_shopid']];
			}
			LibTpl::Set('syncset',$Params['mode']=='other'?$otherSyncset:$sameSyncset);
			LibTpl::Set('otherSyncset',$otherSyncset);
		}else{
			if(!isset($Params['mode'])) $Params['mode'] = 'self';
			$sameSyncset = ['sss_shop_id_from'=>$_SESSION['_shopid']];
			LibTpl::Set('syncset',$sameSyncset);
		}
		$where = '';
		if($Params['mode']=='other')
		{
			$where = sprintf(" and sssp_shop_id_to = %d and sssp_shop_id_from = %d",$_SESSION['_shopid'],$otherSyncset['sss_shop_id_from']);
		}
		elseif($Params['mode']=='self')
		{
			$where = sprintf(" and sssp_shop_id_to = %d and sssp_shop_id_from = %d",$_SESSION['_shopid'],$_SESSION['_shopid']);
		}
	
			//源店铺自编码查询
		if(!empty($Params['sssp_pri_code_from']))
		{
			$pri_code_from  =array_map(function($v){
				return sprintf("'%s'", LibFc::FormatNum($v));
			},preg_split("/[\s,]+/",$Params['sssp_pri_code_from']));
			$pri_code_from1 = preg_split("/[\s,]+/",$Params['sssp_pri_code_from']);
			$where .= sprintf(" and (sssp_pri_code_from in (%s) or sssp_pri_code_from in ('%s')) ", implode(",",$pri_code_from),implode("','",$pri_code_from1)); 
		}
		//当前店铺自编码查询
		if(!empty($Params['sssp_pri_code_to']))
		{
			$pri_code_to  =array_map(function($v){
				return sprintf("'%s'",LibFc::FormatNum($v));
			},preg_split("/[\s,]+/",$Params['sssp_pri_code_to']));
			$pri_code_to1 = preg_split("/[\s,]+/",$Params['sssp_pri_code_to']);
			$where .= sprintf(" and (sssp_pri_code_to in (%s) or sssp_pri_code_to in ('%s')) ",implode(',',$pri_code_to),implode("','",$pri_code_to1)); 
		}
		$res = 	$B2cBase->get('sh_shop_synch_product',['count(*) as count'],$where,true);
		if($res['data']['count']>0)
		{
			$where .= sprintf(" limit %d,%d ",($page-1)*$perPage,$perPage);
			$listres = 	$B2cBase->get('sh_shop_synch_product',['*'],$where);
			foreach ($listres['data'] as $key => $item) {
				$table = sprintf('bc_number join bc_product on pro_id=num_pro_id and pro_shop_id = %d',$item['sssp_shop_id_from']);
				$fromres = $B2cBase->get($table,['num_display'],sprintf(" and num_format = '%s'",$item['sssp_pri_code_from']),true);
				$item['num_display_from'] = $fromres['data']['num_display']?:$item['sssp_pri_code_from'];

				$table = sprintf('bc_number join bc_product on pro_id=num_pro_id and pro_shop_id = %d',$item['sssp_shop_id_to']);
				$tores = $B2cBase->get($table,['num_display'],sprintf(" and num_format = '%s'",$item['sssp_pri_code_to']),true);
				$item['num_display_to'] = $tores['data']['num_display']?:$item['sssp_pri_code_to'];
				$listres['data'][$key] = $item;
			}
			
			LibTpl::Set('listArr', $listres['data']);
		}
		LibTpl::Set('pageMsg', LibPage::Show($res['data']['count'], $perPage, true));
		LibTpl::Set('Params',$Params);
		
		LibTpl::Set('HEAD_CSSJS', $this->HEAD_CSSJS);
		LibTpl::Set('title','店铺同步');
		LibTpl::Put();
	}
	
	/**
	 * @method 管理店铺自编号数据
	 * @author zhengweihua 
	 * @copyright 2022-08-10
	 */
	public function checkShopSync()
	{
		$mode =$_POST['mode']??'other';
		$B2cProduct = new B2cProduct();
		$res = 	$B2cProduct->checkShopSync($_SESSION['_shopid'],$_POST,$mode);
		LibFc::ajaxJsonEncode($res);
	}

	/**
	 * @method 同步店铺数据前检测
	 * @author zhengweihua 
	 * @copyright 2024-05-17
	 */
	public function checkShopProSync()
	{
		$mode =$_POST['mode']??'other';

		$toShopId = (int) $_SESSION['_shopid'];
		$B2cProduct = new B2cProduct();
		if($mode=='self')
		{
			$fromShopId = $toShopId;
		}
		elseif($mode=='other')
		{
			$res = $B2cProduct->get('sh_shop_synch', ['*'], sprintf(" and sss_shop_id_to = %d", $toShopId), true);
			if (empty($res['data']))  LibFc::ReturnJson(false, '此店铺无同步配置');
			$cfg = $res['data'];
			$cfg['sss_act'] = json_decode($cfg['sss_act'], true);
			if (empty($cfg['sss_act'])) libfc::ReturnJson(false, '没有相关设置');
			$fromShopId = $cfg['sss_shop_id_from'];

		}
		//函数去重,把数组每个元素变成引号,方便mysql in
		$function = function($array)
		{
			$array = array_unique($array);
			$array = array_map(function ($v){
				return sprintf("'%s'",$v);
			},$array);
			return $array;
		};

		$where = sprintf(" and sssp_shop_id_to = %d and sssp_shop_id_from=%d",$toShopId,$fromShopId);
		//如果有传值过来只处理传值
		if(isset($_POST['priCodeArr']) && !empty($_POST['priCodeArr']))
		{	
			$priCodeArr = $function($_POST['priCodeArr']);
			$where .= sprintf(" and sssp_pri_code_to in (%s)",implode(',',$priCodeArr));
		}
		$listres = $B2cProduct->get('sh_shop_synch_product',['sssp_pri_code_to'],$where);	
		$data = $listres['data']?array_column($listres['data'],'sssp_pri_code_to'):[];
		//日志
		if($_POST['type']=='model'){
			$logtxt = '车型同步';
		}elseif($_POST['type']=='num'){
			$logtxt = '号码同步';
		}elseif ($_POST['type']=='param') {
			$logtxt = '参数同步';
		}
		$B2cLog = new B2cLog();
		$shopInfo = $B2cLog->get('sh_shop',['shop_name'],sprintf(" AND shop_id=%d",$fromShopId),true);
		$item = [
			'log_category'=>1,
			'log_shop_id'=>$toShopId,
			'log_atime'=>time(),
			'log_dataid'=>$listres['data'],
			'log_txt'=>$mode=='self'?'执行店铺内'.$logtxt:'执行'.$shopInfo['data']['shop_name'].'店铺间'.$logtxt,
		];
		$B2cLog->addFastLog($item);
		LibFc::ReturnJson(true,$data);
	}

	/**
	 * @method 执行店铺同步操作
	 * @author zhengweihua 
	 * @copyright 2022-08-10
	 */
	public function doShopSync()
	{
		$mode =$_POST['mode']??'other';
		$B2cProduct = new B2cProduct();
		$res = 	$B2cProduct->doShopSync($_SESSION['_shopid'],$_POST,$mode);
		LibFc::ajaxJsonEncode($res);
	}

	/**
	 * @method 删除商品
	 * @author zhengweihua 
	 * @copyright 2022-08-12
	 */
	public function delSyncProduct()
	{
		$B2cProduct = new B2cProduct();
		$res = $B2cProduct->delShopSyncProduct($_SESSION['_shopid'], $_POST['priCodeArr']);
		LibFc::ajaxJsonEncode($res);	
	}

	/**
	 * @method 店铺同步设置
	 * @author zhengweihua 
	 * @copyright 2022-08-13
	 */
	public function shopSyncSet()
	{	
		if($_SERVER['REQUEST_METHOD'] != 'POST') LibFc::ReturnJson(false,'请求错误');
		if(empty($_POST)) LibFc::ReturnJson(false,'参数错误');
		$B2cProduct = new B2cProduct();
		$res = $B2cProduct->shopSyncSet($_SESSION['_shopid'],$_POST);
		
		LibFc::ajaxJsonEncode($res);	
	}
	
	/**
	 * @method 通过文本管理自编号导入
	 * @author zhengweihua 
	 * @copyright 2022-09-05
	 */
	public function doShopSyncByText()
	{
		if($_SERVER['REQUEST_METHOD'] != 'POST') LibFc::ReturnJson(false,'请求错误');
		if(empty($_POST)) LibFc::ReturnJson(false,'参数错误');
		$mode =$_POST['mode']??'other';
		$B2cProduct = new B2cProduct();
		$res =$B2cProduct->doShopSyncByText($_SESSION['_shopid'],$_POST['pri_code'],$mode);
		LibFc::ajaxJsonEncode($res);
	}

	/**
	 * @method 产品同步设置
	 * @author zhengweihua 
	 * @copyright 2022-10-20
	 */
	public function proSyn()
	{
		$Params = mvc::$URL_PARAMS;
		$page = isset($Params['page']) ? $Params['page'] : 1;
		$perPage = isset($_COOKIE['perPage'])? $_COOKIE['perPage'] : 25;
		$B2cBase = new B2cBase();
		$where = sprintf(" and sps_from_shop_id = %d",$_SESSION['_shopid']);

		$YpwBase = 	new YpwBase();
		foreach($Params as $field=>$val){
			$val =is_array($val)?$val:trim($val);
			if($val == '') continue;

			switch ($field) {
				case 'keyword':
					if(is_numeric($val)){
						$res = $YpwBase->Get('yp_user',['u_b2c_shopid'],sprintf(" and u_b2c_worker = 'N' and u_mobile=%d and u_b2c_shopid>0 ",LibFc::Escape($val)),true);
						
						$where .= sprintf(" and sps_to_shop_id = %d",$res['data']['u_b2c_shopid']?:0);
						
					}else{
						$where .= sprintf(" and shop_name like '%%%s%%'",$val); 
					}
					
					break;
				case 'sps_status':
					$where .= sprintf(" and sps_status = %d",$val); 
					break;
			}
		}

		$table = 'sh_prosyn join 
		sh_shop on sps_to_shop_id  = shop_id';
		$res = $B2cBase->get($table,['count(*) as count'],$where ,true);
		$total = $res['data']['count']?:0;
		if($total>0){
			$order = 'order by sps_atime desc';
			$where .= sprintf(" %s LIMIT %d,%d",$order, ($page-1)*$perPage,$perPage);
			$listres = $B2cBase->get($table,['sh_prosyn.*,shop_name as to_shop_name'],$where);
			// 获取配件分类
			$spsIdArr =  array_column($listres['data'], 'sps_id');
			$partRes = $B2cBase->get('sh_prosyn_part join bc_part on part_id = spp_part_id', ['part_name', 'spp_part_id', 'spp_sps_id'], sprintf(" and spp_sps_id in (%s)", implode(',', $spsIdArr)));
			$partArr = [];
			if($partRes['data'])
			{
				foreach ($partRes['data'] as $key => $partItem) {
					$partArr[$partItem['spp_sps_id']][] = $partItem['part_name'];
				}
			}
			//获取店铺分类
			$sortRes = $B2cBase->get('sh_prosyn_sort join sh_sort on sort_id = spt_sort_id', ['sort_name', 'spt_sort_id', 'spt_sps_id'], sprintf(" and sort_shop_id=%d and spt_sps_id in (%s)",$_SESSION['_shopid'],implode(',', $spsIdArr)));
			$sortArr = [];
			if($sortRes['data'])
			{
				foreach ($sortRes['data'] as $key => $sortItem) {
					$sortArr[$sortItem['spt_sps_id']][] = $sortItem['sort_name'];
				}
			}
			//获取配件品牌
			$sortRes = $B2cBase->get('sh_prosyn_probrand join bc_probrand on prb_id = spb_prb_id', ['prb_id','spb_sps_id','prb_name'], sprintf(" and spb_sps_id in (%s)",implode(',', $spsIdArr)));
			$brandArr = [];
			if($sortRes['data'])
			{
				foreach ($sortRes['data'] as $key => $sortItem) {
					$brandArr[$sortItem['spb_sps_id']][] = $sortItem['prb_name'];
				}
			}

			//获取代理商用户信息
			$toshopArr =  array_column($listres['data'],'sps_to_shop_id');
			$res = $YpwBase->Get('yp_user',['u_b2c_shopid','u_mobile'],sprintf(" and u_b2c_worker = 'N' and u_b2c_shopid in (%s) ",implode(',',$toshopArr)));
			$toShopUserArr = array_column($res['data'],'u_mobile','u_b2c_shopid');
			foreach ($listres['data'] as $key => &$value) {
				$value['to_mobile'] = $toShopUserArr[$value['sps_to_shop_id']]??'';
				if(isset($partArr[$value['sps_id']]))
				{
					$value['sync_name'] = implode(',',$partArr[$value['sps_id']]);
				}
				if(isset($sortArr[$value['sps_id']]))
				{
					$value['sync_name'] = implode(',',$sortArr[$value['sps_id']]);
				}
				if(isset($brandArr[$value['sps_id']]))
				{
					$value['sync_name'] = implode(',',$brandArr[$value['sps_id']]);
				}
			}
			unset($value);
			LibTpl::Set('list',$listres['data']);
		}
		LibTpl::Set('pageMsg', LibPage::Show($total, $perPage, true));
		LibTpl::Set('Params',$Params);
		LibTpl::Set('title','产品同步');
		LibTpl::Put();
	}

	/**
	 * @method 设置产品同步
	 * @author zhengweihua 
	 * @copyright 2022-10-20
	 */
	public function setProSyn()
	{
		$Params = mvc::$URL_PARAMS;
		$sps_id = LibFc::Int($Params['sps_id']);
		$B2cProduct = new B2cProduct();
		if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['sps']))
		{
			$sps =  $_POST['sps'];
			$YpwUser = new YpwUser();
			$keyword = LibFc::Escape($sps['sps_to_keyword']);
			$where = " and u_b2c_worker = 'N'";
			if(is_numeric($sps['sps_to_keyword'])){
				$where .= sprintf(" %s and u_mobile=%d ",$where,$keyword);
			}else{
				$where .= sprintf(" %s and u_name='%s' ",$where,$keyword);
			}
			$ures = $YpwUser->get('yp_user', array('u_id', 'u_mobile'), $where, true);
			$uid = $ures['data']['u_id'];
			if (empty($uid))  LibFc::ReturnJson(false, '用户不存在');
			$res = $B2cProduct->get('sh_shop',['shop_id'],sprintf(" AND shop_uid=%d",$uid),true);
			if (empty($res['data']))  LibFc::ReturnJson(false, '不存在该代理商');
			if ($res['data']['shop_id'] == $_SESSION['_shopid'])  LibFc::ReturnJson(false, '不可添加自己');
			$_POST['sps']['sps_to_shop_id'] = $res['data']['shop_id'];
			$res = $B2cProduct->setProSyn($_SESSION['_shopid'], $_POST['sps']);
			LibFc::ajaxJsonEncode($res);
		}
		// GET
		$defaultSpsAct = ['type'=>'part','price'=>1,'shopsort'=>0,'params'=>1,'pic'=>1];
		$spsPartArr = [];
		if($sps_id)
		{
			$B2cBase = new B2cBase();
			$where = sprintf(" and sps_id = %d", $sps_id);
			$prosynres = $B2cBase->get('sh_prosyn join sh_shop on sps_to_shop_id  = shop_id ', ['sh_prosyn.*,shop_name as to_shop_name'], $where, true);
			if ($prosynres['data']['sps_to_shop_id']) {
				$userres = $B2cBase->get('sh_shop left join us_user_base on ub_uid = shop_uid', array('shop_uid','shop_main_tel','ub_username'), sprintf(" and shop_id=%d",$prosynres['data']['sps_to_shop_id']), true);
				$prosynres['data']['sps_to_keyword'] = $userres['data']?($userres['data']['shop_main_tel']?$userres['data']['shop_main_tel']:$userres['data']['ub_username']):'';
			}
			$prosynres['data']['sps_act'] = $prosynres['data']['sps_act']?json_decode($prosynres['data']['sps_act'],true):$defaultSpsAct;

			//配件分类
			if($prosynres['data']['sps_act']['type']=='part')
			{
				$spspartres = $B2cBase->get('sh_prosyn_part',['*'],sprintf(" and spp_sps_id = %d",$sps_id));
				$spsPartArr = array_column($spspartres['data'],'spp_part_id');
				$prosynres['data']['sps_part_id'] = implode(',',$spsPartArr);
			}
			// 店铺分类
			if($prosynres['data']['sps_act']['type']=='sort')
			{
				$spssortres = $B2cBase->get('sh_prosyn_sort',['*'],sprintf(" and spt_sps_id = %d",$sps_id));
				$spsSortArr = array_column($spssortres['data'],'spt_sort_id');
				$prosynres['data']['spt_sort_id'] = implode(',',$spsSortArr);
			}
			// 配件品牌
			if($prosynres['data']['sps_act']['type']=='brand')
			{
				$spsbrandres = $B2cBase->get('sh_prosyn_probrand',['*'],sprintf(" and spb_sps_id = %d",$sps_id));
				$spsPrbArr = array_column($spsbrandres['data'],'spb_prb_id');
				$prosynres['data']['spsPrbArr'] = $spsPrbArr;
			}
			$prosynres['data']['sps_act'] = array_merge($defaultSpsAct,$prosynres['data']['sps_act']);
			LibTpl::Set('spsArr',$prosynres['data']);
		}else{
			LibTpl::Set('spsArr',['sps_act'=>$defaultSpsAct]);
		}
		$where = sprintf(' and part_id in (select pro_part_id from bc_product where pro_shop_id=%d)  order by pt_seq, part_initial ',$_SESSION['_shopid']);
		$B2cPart = new B2cPart();
		$res = $B2cPart->get('bc_part join bc_part_tree on part_id = pt_part_id and pt_ismain=1', ['part_id', 'part_name','pt_parent_part_id'], $where);
		$partSortArr = [];
		$arr[] = ['name'=>'全选/全不选','pId'=>0,'id'=>0,'open'=>true,'checked'=>false];
		$parentChkArr = [];
		foreach($res['data'] as $v)
		{
			$t = [];
			if(empty($arr[$v['part_id']])){
				$t['id'] = $v['part_id'];
				$t['spart_id'] = $v['part_id'].'_0';
				$t['name'] = $v['part_name'];
				$t['pId']  = $v['pt_parent_part_id'];
				$t['checked'] = false;
				if(in_array($v['part_id'],$spsPartArr)){
					$t['checked'] = true;
					$parentChkArr[] = $v['pt_parent_part_id'];
				}

				$arr[$t['id']] = $t;
			}
		}
		$partSortArr = array_values($arr);
		//上级
		$parentArr = array_column($res['data'], 'pt_parent_part_id');
		$res1 = $B2cPart->get('bc_part', ['part_id', 'part_name'], sprintf(' and part_id in (%s)', implode(",", $parentArr)));
		foreach ($res1['data'] as $v) {
			$t = [];
			if (empty($arr[$v['part_id']])) {
				$t['id'] = $v['part_id'];
				$t['name'] = $v['part_name'];
				$t['spart_id'] = $v['part_id'] . '_0';
				$t['pId']  = 0;
				$t['checked'] = false;
				if(in_array($v['part_id'],$parentChkArr)){
					$t['checked'] = true;
					$t['open'] =true;
				}
				
				$partSortArr[] = $t;
			}
		}

		//店铺分类
		$arr1[] = ['name'=>'全选/全不选','pId'=>0,'id'=>0,'open'=>true,'checked'=>false];
		$B2cShopSort = new B2cShopSort();
		$res = $B2cShopSort->getShopSortZtree($_SESSION['_shopid'], $spsSortArr??[], false);
		LibTpl::Set('shopSortArr', array_merge($arr1,$res['data']));
		//配件品牌
		$B2cShopSort = new B2cShopSort();
		$sql = sprintf("select distinct pro_prb_id from bc_product where pro_shop_id=%d",$_SESSION['_shopid']);
		$res = $B2cShopSort->get('bc_probrand',['prb_id,prb_name'],sprintf(" AND prb_id IN (%s) order by prb_initial",$sql));
		LibTpl::Set('brandArr', $res['data']);

		$this->HEAD_CSSJS['plugin'][] = 'zTree';
		LibTpl::Set('HEAD_CSSJS', $this->HEAD_CSSJS);
		LibTpl::Set('partSortArr',$partSortArr);
		LibTpl::Set('title','产品同步');
		LibTpl::Put();
	}

	/**
	 * @method 删除同步设置
	 * @author zhengweihua 
	 * @copyright 2022-10-21
	 */
	public function delProSyn()
	{
		$B2cProduct = new B2cProduct();
		$res = $B2cProduct->delProSyn($_SESSION['_shopid'],$_POST['from']??'shouquan' ,$_POST['sps_id'],$_POST['delStatus']);
		LibFc::ajaxJsonEncode($res);
	}

	public function checkProSyn()
	{
		$sps_id = $_GET['sps_id'];
		if (empty($sps_id)) LibFc::ReturnJson(false, '参数错误');
		$sps_ids = is_array($sps_id) ? $sps_id : [$sps_id];
		$B2cProduct = new B2cProduct();
		$synRes = $B2cProduct->get('sh_prosyn', ['*'], sprintf(" and sps_id in (%s)", implode(',', $sps_ids)));
		if (empty($synRes['data'])) LibFc::ReturnJson(false, '参数错误');
		$errorArr = [];
		foreach ($synRes['data'] as $synItem) {
			if(empty($synItem['sps_chkstatus'])){
				$errorArr[] = $synItem['sps_id']; 
				continue;
			} 
			$B2cProduct->getProSyn($synItem['sps_from_shop_id'], $synItem['sps_id']);
		}
	}
	
	/**
	 * @method 执行同步
	 * @author zhengweihua 
	 * @copyright 2022-10-21
	 */
	public function doProSyn()
	{
		$sps_id = $_GET['sps_id'];
		if (empty($sps_id)) LibFc::ReturnJson(false, '参数错误');
		$sps_ids = is_array($sps_id) ? $sps_id : [$sps_id];
		$B2cProduct = new B2cProduct();
		$synRes = $B2cProduct->get('sh_prosyn', ['*'], sprintf(" and sps_id in (%s)", implode(',', $sps_ids)));
		if (empty($synRes['data'])) LibFc::ReturnJson(false, '参数错误');
		$errorArr = [];
		foreach ($synRes['data'] as $synItem) {
			if(empty($synItem['sps_chkstatus'])){
				$errorArr[] = $synItem['sps_id']; 
				continue;
			} 
			$B2cProduct->doProSyn($synItem['sps_from_shop_id'], $synItem['sps_id']);
		}
		if(count($errorArr)){
			LibFc::ReturnJson(false,'部分授权配置未确认同步失败，请先确认后再同步');
		}
		LibFc::ReturnJson(true,true);
	}

	/**
	 * @method 获取同步产品
	 * @author zhengweihua 
	 * @copyright 2025-11-10
	 */
	public function getProSynProd()
	{
		$sps_id = $_GET['sps_id'];
		if (empty($sps_id)) LibFc::ReturnJson(false, '参数错误');
		
		$B2cProduct = new B2cProduct();
		$synRes = $B2cProduct->get('sh_prosyn', ['*'], sprintf(" and sps_id = %d",$sps_id),true);
		if (empty($synRes['data'])) LibFc::ReturnJson(false, '参数错误');

		if(!$synRes['data']['sps_chkstatus']){
			LibFc::ReturnJson(false,'授权配置未确认,同步失败!请先确认后再同步');
		}
		$synItem = $synRes['data'];
		$res = $B2cProduct->getProSynProd($synItem['sps_from_shop_id'], $synItem['sps_id']);
		LibFc::ReturnJson(true,$res['data']);
		
	}
	/**
	 * @method 批量处理同步产品
	 * @author zhengweihua 
	 * @copyright 2025-11-10
	 */
	public function doBatchProSyn()
	{
		$Params = mvc::$URL_PARAMS;
		$sps_id = $_GET['sps_id'];
		$proIds = !is_array($Params['prod_ids']) ? explode(',',$Params['prod_ids']) : $Params['prod_ids'];
		$B2cProduct = new B2cProduct();
		$synRes = $B2cProduct->get('sh_prosyn', ['*'], sprintf(" and sps_id = %d",$sps_id),true);
		if (empty($synRes['data'])) LibFc::ReturnJson(false, '参数错误');

		$synItem = $synRes['data'];
		$B2cProduct->doBatchProSyn($synItem['sps_from_shop_id'], $synItem['sps_id'],$proIds);
		
		LibFc::ReturnJson(true,true);
	}

	/**
	 * @method 执行删除不在配置内的产品
	 * @author zhengweihua 
	 * @copyright 2025-11-10
	 */
	public function doDeleteProSyn()
	{
		$sps_id = $_GET['sps_id'];
		if (empty($sps_id)) LibFc::ReturnJson(false, '参数错误');
		
		$B2cProduct = new B2cProduct();
		$synRes = $B2cProduct->get('sh_prosyn', ['*'], sprintf(" and sps_id = %d",$sps_id),true);
		if (empty($synRes['data'])) LibFc::ReturnJson(false, '参数错误');

		if(!$synRes['data']['sps_chkstatus']){
			LibFc::ReturnJson(false,'授权配置未确认,同步失败!请先确认后再同步');
		}
		$synItem = $synRes['data'];
		$res = $B2cProduct->doDeleteProSyn($synItem['sps_from_shop_id'], $synItem['sps_id']);
		LibFc::ReturnJson(true,$res['data']);
	}

	/**
	 * @method 更改代理同步状态
	 * @author zhengweihua 
	 * @copyright 2022-10-24
	 */
	public function changeChkStatus()
	{
		$sps_id = $_GET['sps_id'];
		if (empty($sps_id)) LibFc::ReturnJson(false, '参数错误');
		$sps_ids = is_array($sps_id) ? $sps_id : [$sps_id];
		$B2cBase = new B2cBase();
		$where = sprintf(" and sps_id in (%s)", implode(',', $sps_ids));
		$res = 	$B2cBase->set('sh_prosyn',['sps_chkstatus'=>1],$where);
		LibFc::ajaxJsonEncode($res);
	}
	
	/**
	 * @method 导入配件车型关系
	 * @author zhengweihua 
	 * @copyright 2023-01-09
	 */
	public function importProModel()
	{
		ini_set('memory_limit', '2048M');
		$B2cProduct = new B2cProduct();
		$optArr = $_POST;
		$res = $B2cProduct->importProModel($_SESSION['_shopid'], $optArr);
		LibFc::ajaxJsonEncode($res);
	}

	//检测导入配件车型备注
	function checkRelationAndRemark()
	{
		ini_set('memory_limit', '2048M');
		$B2cProduct = new B2cProduct();
		$optArr = $_POST;
		$res = $B2cProduct->checkRelationAndRemark($_SESSION['_shopid'], $optArr);
		//日志
		$B2cLog = new B2cLog();
		$item = [
			'log_shop_id'=>$_SESSION['_shopid'],
			'log_category'=>'21',
			'log_txt'=>'批量操作：导入配件关系与备注',
			'log_dataid'=>$_SESSION['_shopid']
		];
		$B2cLog->addFastLog($item);
		LibFc::ajaxJsonEncode($res);
	}

	/**
	 * @method 导入配件车型关系与备注
	 * @author zhengweihua 
	 * @copyright 2023-01-31
	 */
	public function importRelationAndRemark()
	{
		ini_set('memory_limit', '2048M');
		$B2cProduct = new B2cProduct();
		$optArr = $_POST;
		$res = $B2cProduct->importRelationAndRemark($_SESSION['_shopid'], $optArr);
		LibFc::ajaxJsonEncode($res);	
	}
	/**
	 * @method 导入配件车型关系与备注模板
	 * @author zhengweihua 
	 * @copyright 2023-02-01
	 */
	public function importRDemo()
	{
		ini_set('memory_limit', '2048M');
		$B2cProduct = new B2cProduct();
		$B2cProduct->importRDemo($this->supData['shop_smt_code']);
	}

	/**
	 * @method 通过号码绑定配件车型
	 * @author zhengweihua 
	 * @copyright 2023-05-16
	 */
	public function addProModelbyNumber()
	{
		if($_SERVER['REQUEST_METHOD']=='POST' && $_POST){
			if (empty($_POST['number'])) LibFc::ReturnJson(false, '参数错误,请填写号码');
			$B2cProduct = new B2cProduct();
			$numberArr = explode(';',strtr($_POST['number'],[","=>";","\n"=>";"])) ;
			
			$numberArr = array_map(function ($number){
					return LibFc::FormatNum($number);
				},$numberArr);
			$numberStr = implode("','",$numberArr);
			$where = sprintf(" and num_format in ('%s') and pro_shop_id=%d", $numberStr, $_SESSION['_shopid']);
			$res = $B2cProduct->get('bc_number join bc_product on num_pro_id=pro_id and num_self=1', ['num_pro_id', 'num_format', 'pro_smt_code'], $where);
			if (empty($res['data'])) LibFc::ReturnJson(false, '该号码不存在');
			
			foreach ($res['data'] as $key=> $item) {
				$smt_code = $item['pro_smt_code'] ? $item['pro_smt_code'] : $this->supData['shop_smt_code'];
				if ($smt_code != $this->supData['shop_smt_code']) {
					unset($res['data'][$key]);
				}
			}
			if(empty($res['data'])) LibFc::ReturnJson(false, '车型模式均不匹配');
			$proId = array_unique(array_column($res['data'],'num_pro_id'));
			$proIdStr = implode(',',$proId);
			$res1 = ['status' => true, 'data' => ''];
			if($this->supData['shop_smt_code'] == 'chassis')
			{
				if(!$_POST['mch_code']) LibFc::ReturnJson(false, '车型不存在');
				$res = $B2cProduct->get('bc_product_modchassis', ['pmc_mch_code, pmc_remark,pmc_pro_id'], sprintf(" and pmc_pro_id in (%s)", $proIdStr));
				$modelArr = [];
				foreach ($res['data'] as $key => $item) {
					$modelArr[$item['pmc_pro_id']][] = [
						'pmc_mch_code'=>$item['pmc_mch_code'],
						'pmc_remark'=>$item['pmc_remark']
					];
				}
				$mchCodeArr = explode(',',$_POST['mch_code']);
				$codeArr = [];
				foreach ($mchCodeArr as $mch_code) {
					$codeArr[] = ['pmc_mch_code'=>$mch_code,'pmc_remark'=>''];
				}
				foreach ($proId as $pid) {
					$arr = $modelArr[$pid]??[];
					$arr = array_merge($arr,$codeArr);
					$res1 = $B2cProduct->setProductModChassis($pid,$arr);
				}
					
			}
			else if($this->supData['shop_smt_code'] == 'engine')
			{
				if(!$_POST['men_code']) LibFc::ReturnJson(false, '车型不存在');
				$res = $B2cProduct->get('bc_product_modengine', ['pme_men_code, pme_remark,pme_pro_id'], sprintf(" and pme_pro_id in (%s)", $proIdStr));
				$modelArr = [];
				foreach ($res['data'] as $item) {
					$modelArr[$item['pme_pro_id']][] = [
						'pme_men_code'=>$item['pme_men_code'],
						'pme_remark'=>$item['pme_remark']
					];
				}
				$menCodeArr = explode(',',$_POST['men_code']);
				$codeArr = [];
				foreach ($menCodeArr as $men_code) {
					$codeArr[] = ['pme_men_code'=>$men_code,'pme_remark'=>''];
				}
				foreach ($proId as $pid) {
					$arr = $modelArr[$pid]??[];
					$arr = array_merge($arr,$codeArr);
					$res1 = $B2cProduct->setProductModEngine($pid,$arr);
				}
			}
			else
			{
				if(!$_POST['mod3Id']) LibFc::ReturnJson(false, '车型不存在');
				$res = $B2cProduct->get('bc_product_model3_link', ['pml3_mod3_id, pml3_remark,pml3_pro_id'], sprintf(" and pml3_pro_id in (%s)", $proIdStr));
				$modelArr = [];
				foreach ($res['data'] as $item) {
					$modelArr[$item['pml3_pro_id']][] = [
						'pml3_mod3_id'=>$item['pml3_mod3_id'],
						'pml3_remark'=>$item['pml3_remark']
					];
				}

				$mod3IdArr = explode(',',$_POST['mod3Id']);
				$codeArr = [];
				foreach ($mod3IdArr as $mod3Id) {
					$codeArr[] = ['pml3_mod3_id'=>$mod3Id,'pml3_remark'=>''];
				}
				foreach ($proId as $pid) {
					$arr = $modelArr[$pid]??[];
					$arr = array_merge($arr,$codeArr);
					$res1 = $B2cProduct->setProductModel($pid,$arr);
				}
			}
			LibFc::ajaxJsonEncode($res1);
		}
		LibFc::ReturnJson(false, '参数错误');
	}

	/**
	 * @method 批量绑定零件分类
	 * @author zhengweihua 
	 * @copyright 2023-06-21
	 */
	public function batchChangePart()
	{
		if($_POST && $_POST['proId'])
		{
			$B2cProduct = new B2cProduct();
			$dataArr = [
				'partPath'=>$_POST['partPath'],
				'pro_pas_id'=>$_POST['pasId']
			];
			$res = $B2cProduct->batchChangePart($_POST['proId'],$dataArr);
			LibFc::ajaxJsonEncode($res);
		}
		
	}

	/**
	 * @method 设置车型品牌
	 * @author zhengweihua 
	 * @copyright 2023-06-26
	 */
	public function setShopModBrand()
	{
		$Params = mvc::$URL_PARAMS;
		$B2cShop = new B2cShop();
		if($_POST && $_SERVER['REQUEST_METHOD']=='POST')
		{
			$res = $B2cShop->setShopModAdmin($_SESSION['_shopid'],$_POST);
			LibFc::ajaxJsonEncode($res);
		}


		$listArr = ['all'=>'所有','pc'=>'乘用车','cv'=>'商用车','brand'=>'自定义品牌'];
		
		$res = 	$B2cShop->get('sh_shop',['shop_id','shop_mod_admin'],sprintf(" and shop_id=%d",$_SESSION['_shopid']),true);
		$shop_mod_admin = $res['data']['shop_mod_admin']?:'all';

		if($shop_mod_admin =='brand'){
			$brandResArr = $B2cShop->getShopBrand($_SESSION['_shopid']);
			LibTpl::Set('brandArr',$brandResArr['data']);
		}

		$initialArr = [];
		$ComModel = new ComModel();
		$model2Arr = ['pc'=>[],'cv'=>[]];
		$mod2Res = $ComModel->get('bc_model2',['DISTINCT mod2_brand_id','mod2_pc','mod2_cv']);
		if($mod2Res['data']){
			foreach ($mod2Res['data'] as $val) {
				if($val['mod2_pc']==1){
					$model2Arr['pc'][] = $val['mod2_brand_id'];
				}
				if($val['mod2_cv']==1){
					$model2Arr['cv'][] = $val['mod2_brand_id'];
				}
			}
			LibTpl::Set('model2Arr',$model2Arr);
		}
		$brandRes = $ComModel->get('bc_brand', ['brand_id', 'brand_name','brand_initial'], ' order by brand_initial');

		foreach ($brandRes['data'] as $key => $brand) {

			$initialArr[] = substr($brand['brand_initial'],0,1);
		}
		LibTpl::Set('initialArr',array_unique($initialArr));
		LibTpl::Set('brandList', $brandRes['data']);

		LibTpl::Set('title','车型选择');
		LibTpl::Set('shop_mod_admin',$shop_mod_admin);
		LibTpl::Set('listArr',$listArr);
		LibTpl::Put();
	}

	/**
	 * @method 设置车型品牌
	 * @author zhengweihua 
	 * @copyright 2023-10-19
	 */
	public function setShopMod()
	{
		$B2cShop = new B2cShop();
		if($_SERVER['REQUEST_METHOD']=='POST')
		{	
			$dataArr = $_POST;
			$dataArr['shop']['shop_mod_adminfield'] = $dataArr['shop']['shop_mod_adminfield']?implode(',',$dataArr['shop']['shop_mod_adminfield']):'';
			$dataArr['shop']['shop_mod_webfield'] = $dataArr['shop']['shop_mod_webfield']?implode(',',$dataArr['shop']['shop_mod_webfield']):'';
			$res  =	$B2cShop->setShopMod($_SESSION['_shopid'],$dataArr); 
			LibFc::ajaxJsonEncode($res);
		}
		$modArr = [
			'mod3_kw'=>'功率','mod3_cc'=>'排量','mod3_engine'=>'发动机','mod3_transmission'=>'变速器',
			'mod3_fuel'=>'燃料','mod3_body'=>'车身形式','mod3_front_brake'=>'前制动器','mod3_rear_brake'=>'后制动器',
			'mod3_parking_brake'=>'驻车制动','mod3_drive'=>'驱动方式','mod3_start_stop'=>'自动启停','mod3_chassis'=>'底盘'
		];
		LibTpl::Set('sortModArr1',$modArr);//前端字段
		LibTpl::Set('sortModArr2',$modArr);//后端字段
		

		$res = $B2cShop->get("sh_shop",['shop_id,shop_mod_from,shop_mod_admin,shop_mod_adminfield,shop_mod_webfield'],sprintf(" AND shop_id=%d",$_SESSION['_shopid']),true);
		$shopArr = $res['data'];
		
		if($shopArr['shop_mod_webfield']){
			$webfield = explode(',',$shopArr['shop_mod_webfield']);
			$shopArr['shop_mod_webfield'] = $webfield;
			$sortModArr1 = [];
		    foreach ($webfield as $key => $field) {
				$sortModArr1[$field]  = $modArr[$field];
			}
			$sortModArr1 = array_merge($sortModArr1,$modArr);
			LibTpl::Set('sortModArr1',$sortModArr1);
		}
		if($shopArr['shop_mod_adminfield']){
			$adminfield = explode(',',$shopArr['shop_mod_adminfield']);
			$shopArr['shop_mod_adminfield'] = $adminfield;
			$sortModArr2 = [];
		    foreach ($adminfield as $key => $field) {
				$sortModArr2[$field]  = $modArr[$field];
			}
			$sortModArr2 = array_merge($sortModArr2,$modArr);
			LibTpl::Set('sortModArr2',$sortModArr2);
		}
		//前端车型
		//找已存在的值
		$res = $B2cShop->get('sh_shop_model1',['ssm_mod1_id'],sprintf(' and ssm_shop_id = %d',$_SESSION['_shopid']));
		$oldMod1Id = array_column($res['data'],'ssm_mod1_id');
		
		//全车件品牌限制
		$brandRes = $B2cShop->getShopBrand($_SESSION['_shopid']);
		$lWhere = '';
		if($brandRes['data']){
			$lWhere = sprintf(" AND brand_id IN (%s)",implode(',',$brandRes['data']));
		}
		$ComModel = new ComModel();
		$table = "bc_model1 
		left join bc_brand on brand_id = mod1_brand_id
		left join bc_make on make_id = mod1_make_id";
		$where = $lWhere.' order by brand_initial ASC, make_initial ASC,mod1_id ASC';
		$res = $ComModel->get($table,['mod1_id,mod1_name,mod1_brand_id,brand_name,brand_code,mod1_make_id,make_name'],$where);

		$arr['brand_0'] =  ['id'=>'brand_0','name'=>'全部','pId'=>0,'open'=>true,'checked'=>$oldMod1Id?true:false];
		foreach ($res['data'] as $key => $item) {
			$t = [];	
			$t['id'] = $item['mod1_id'];
			$t['name'] = $item['mod1_name'];
			$t['pId']  = 'make_'.$item['mod1_make_id'].'_'.$item['mod1_brand_id'];
			$t['type'] = 'model';
			$t['checked'] = in_array($item['mod1_id'],$oldMod1Id)?true:false;
			$arr[$t['id']] = $t;
			//品牌
			if(empty($arr['brand_'.$item['mod1_brand_id']])){
				$t  = [];
				$t['id'] = 'brand_'.$item['mod1_brand_id'];
				$t['name'] = $item['brand_name'];
				$t['pId']  = 'brand_0';
				$t['type'] = 'brand';
				$t['icon'] =  mvc::$cfg['HOST']['b2c'].'static/images/chebiao/'.$item['brand_code'].'.png';
				$arr[$t['id']] = $t;
			}
			//生产商
			if(empty($arr['make_'.$item['mod1_make_id'].'_'.$item['mod1_brand_id']])){
				$t  = [];
				$t['id'] = 'make_'.$item['mod1_make_id'].'_'.$item['mod1_brand_id'];
				$t['name'] = $item['make_name'];
				$t['pId']  = 'brand_'.$item['mod1_brand_id'];
				$t['type'] = 'make';
				$arr[$t['id']] = $t;
			}
			//判断父级是否勾选 展开
			if(in_array($item['mod1_id'],$oldMod1Id)){
				$makeid = 'make_'.$item['mod1_make_id'].'_'.$item['mod1_brand_id'];
				$brandid = 'brand_'.$item['mod1_brand_id'];
				$arr[$makeid]['checked'] =true;
				$arr[$brandid]['checked'] =true;
			}
			
		}
		LibTpL::Set('modId',implode(',',$oldMod1Id));
		LibTpl::Set('modelJson',array_values($arr));
		//后端车型品牌
		$listArr = ['all'=>'所有','pc'=>'乘用车','cv'=>'商用车','brand'=>'自定义品牌'];
		LibTpl::Set('listArr',$listArr);
		$shopArr['shop_mod_admin'] = $shopArr['shop_mod_admin']?:'all';

		if($shopArr['shop_mod_admin'] =='brand'){
			$brandResArr = $B2cShop->getShopBrand($_SESSION['_shopid']);
			LibTpl::Set('brandArr',$brandResArr['data']);
		}
		$initialArr = [];
		$ComModel = new ComModel();
		$model2Arr = ['pc'=>[],'cv'=>[]];
		$mod2Res = $ComModel->get('bc_model2',['DISTINCT mod2_brand_id','mod2_pc','mod2_cv']);
		if($mod2Res['data']){
			foreach ($mod2Res['data'] as $val) {
				if($val['mod2_pc']==1){
					$model2Arr['pc'][] = $val['mod2_brand_id'];
				}
				if($val['mod2_cv']==1){
					$model2Arr['cv'][] = $val['mod2_brand_id'];
				}
			}
			LibTpl::Set('model2Arr',$model2Arr);
		}
		$brandRes = $ComModel->get('bc_brand', ['brand_id', 'brand_name','brand_initial'], ' order by brand_initial');

		foreach ($brandRes['data'] as $key => $brand) {

			$initialArr[] = substr($brand['brand_initial'],0,1);
		}
		LibTpl::Set('initialArr',array_unique($initialArr));
		LibTpl::Set('brandList', $brandRes['data']);
		LibTpl::Set('shopArr',$shopArr);
		$this->HEAD_CSSJS['plugin'][] = 'zTree';
		LibTpl::Set('HEAD_CSSJS', $this->HEAD_CSSJS);
		LibTpl::Set('title','车型配置');
		LibTpl::Put();
	}

	public function resetProKeyword()
	{
		$B2cKeyword = new B2cKeyword();
		$B2cKeyword->resetProductKeyword([$_SESSION['_shopid']], 'shopId');
		//日志
		$B2cLog = new B2cLog();
		$item = [
			'log_shop_id'=>$_SESSION['_shopid'],
			'log_category'=>'21',
			'log_txt'=>'批量操作：重置配件关键字',
			'log_dataid'=>$_SESSION['_shopid']
		];
		$B2cLog->addFastLog($item);
		echo '重置完成';
	}

	/**
	 * @method 获取显示的字段
	 * @author zhengweihua 
	 * @copyright 2024-01-02
	 */
	protected function getShowCol()
	{
		$colArr = ['pro_id'=>'配件ID','pri_code'=>'商家编码','pro_status'=>'状态','part_name'=>'分类','pro_name'=>'名称','nums'=>'号码','pics'=>'图片','param'=>'参数','paramZiDiYi'=>'自定义参数'
			,'shop_sort'=>'店铺分类','brand'=>'车型','pri_self_remark'=>'商家备注','pro_atime'=>'添加时间','pro_etime'=>'编辑时间','pro_add_uid'=>'添加人','pro_set_uid'=>'最后修改人'
		];
		//获取等级别名
		$B2cShop = new B2cShop();
		$res = $B2cShop->getShopMember($_SESSION['_shopid']);
		$levelArr = array_column($res['data'],'men_alias','mel_id');
		if(!empty(mvc::$cfg['isGzhShop']) || !empty(mvc::$cfg['isSuper']) && (mvc::$cfg['hasModule'] =='price' || mvc::$cfg['hasModule'] =='all') )
		{	
			$colArr['pro_count'] = '库存';
			$colArr['pro_sale_price'] = $levelArr[0]?:'销售价';
		}
		if(!empty(mvc::$cfg['isGzhShop']) || !empty(mvc::$cfg['isSuper']) &&  mvc::$cfg['hasModule'] =='all' )
		{
			$colArr['pro_price_vip1'] =  $levelArr[1]?:'维修厂价格';
			$colArr['pro_price_vip2'] =  $levelArr[2]?:'小型经销商价格';
			$colArr['pro_price_vip3'] =  $levelArr[3]?:'中型经销商价格';
			$colArr['pro_price_vip4'] =  $levelArr[4]?:'大型经销商价格';
		}

		return $colArr;
	}

	/**
	 * @method 车型自动匹配
	 * @author zhengweihua 
	 * @copyright 2024-04-02
	 */
	public function modelAutoSearch()
	{
		$Params = mvc::$URL_PARAMS;
		// var_dump($this->supData['shop_mod_adminfield']);die;
		$supArr = [];
		foreach ($this->supData['shop_mod_adminfield'] as $key => $val) {
			$width = '60px';
			switch ($key) {
				case 'mod3_kw':
					$width = '40px';
					break;
				case 'mod3_cc':
					$width = '45px';
					break;
				case 'mod3_parking_brake':	
				case 'mod3_drive':
					$width = '65px';
					break;
				case 'mod3_transmission':
					$width = '50px';
					break;
			}

			$supArr[$key] = ['name'=>$val,'width'=>$width];
		}
		LibTpl::Set('supArr',$supArr);
		$page = isset($Params['page']) ? $Params['page'] : 1;
		$perPage = isset($_COOKIE['perPage'])? $_COOKIE['perPage'] : 25;
		$B2cBase = new B2cBase();
		$where = ' AND pma_status=0';
		if($Params['keyword']){
			$formatNum = LibFc::FormatNum($Params['keyword']);
			$swhere = sprintf(" and (num_format like '%%%s%%' or num_reformat like '%%%s%%')", $formatNum, strrev( $formatNum));
			$table = 'bc_number join bc_product on pro_id = num_pro_id AND pro_shop_id='.$_SESSION['_shopid'];
			$res = $B2cBase->get($table, ['distinct pro_id'], $swhere);
			if($res['data']) $where .= sprintf(" AND pma_pro_id IN (%s)",implode(',',array_column($res['data'],'pro_id')));
		}
		if($Params['from']){
			$where .= sprintf(" AND pma_from='%s'",LibFc::Escape($Params['from'])); 
		}
		//取最新版本的数据
		$table = "bc_product_model_auto 
		INNER JOIN (  
			SELECT `pma_pro_id` as ppro_id, MAX(`pma_version`) as max_version  
			FROM `bc_product_model_auto` where pma_shop_id={$_SESSION['_shopid']}
			GROUP BY `pma_pro_id`  
		) as sub ON pma_pro_id = sub.ppro_id AND pma_version = sub.max_version
		JOIN bc_product on pma_pro_id = pro_id";
		
		$res = $B2cBase->get($table,['pma_pro_id'],sprintf(" %s AND pma_shop_id=%d group by pma_pro_id",$where,$_SESSION['_shopid']));
		$total = count($res['data']);
		
		//查车型数目
		$res1 = $B2cBase->get($table,['count(pma_mod3_id) as total'],sprintf(" AND pma_status=0 AND pma_shop_id=%d",$_SESSION['_shopid']),true);
		$modelCounts = $res1['data']['total']?:0;
		LibTpl::Set('total',$modelCounts);
		$listArr = [];
		if($total)
		{
			$res = $B2cBase->get($table,['*'],sprintf(" %s AND pma_shop_id=%d group by pma_pro_id order by pma_pro_id asc LIMIT %d,%d",$where,$_SESSION['_shopid'], ($page-1)*$perPage,$perPage));
			if($res['data'])
			{
				$proIdArr = array_column($res['data'],'pma_pro_id');
				$numArr = [];
				$numres = $B2cBase->get('bc_number',['*'],sprintf(" AND num_pro_id IN (%s) AND num_self=1",implode(',',$proIdArr)));
				foreach ($numres['data'] as $key => $val) 
				{
					$numArr[$val['num_pro_id']] = $val;
				}

				$mod3IdArr = [];
				$res1 = $B2cBase->get($table,['pma_id,pma_pro_id,pma_mod3_id,pma_remark,pma_status,pma_from'],sprintf(" %s AND pma_shop_id=%d AND pma_pro_id IN (%s)",$where,$_SESSION['_shopid'],implode(',',$proIdArr)));
				if($res1['data'])
				{
					foreach ($res1['data'] as $key => $val) 
					{
						$mod3IdArr[$val['pma_pro_id']][] = $val;
					}
				}
				$allKeysEmpty = 1;
				$ComModel = new ComModel();
				foreach ($res['data'] as $key => $val) 
				{
					$pro_code = '';
					if($numArr[$val['pma_pro_id']])
					{
						$pro_code =	$numArr[$val['pma_pro_id']]['num_factory']?$numArr[$val['pma_pro_id']]['num_factory'].':'.$numArr[$val['pma_pro_id']]['num_display']:$numArr[$val['pma_pro_id']]['num_display'];
					}
					if($mod3IdArr[$val['pma_pro_id']])
					{
						$asss = implode(',',array_column($mod3IdArr[$val['pma_pro_id']],'pma_mod3_id')) ;
						$res1 = $ComModel->getAllModByAny(['mod3_id'=>$asss]);
						$json_arr = array_column($mod3IdArr[$val['pma_pro_id']],null,'pma_mod3_id');
						foreach ($res1['data'] as &$val1) {
							if($json_arr[$val1['mod3_id']]){
								$val1 = array_merge($json_arr[$val1['mod3_id']],$val1);
							}
							if($val1['mod3_chassis']){ $allKeysEmpty = 0;}
						}
						unset($val1);
					}
	
					$listArr[$val['pma_pro_id']] = [
						'pro_id'=>$val['pma_pro_id'],
						'pro_code'=>$pro_code,
						'max_version'=>$val['max_version'],
						'pro_model_count'=>count($res1['data']),
						'model_list'=>$res1['data']
					];
				}

			}
		}
		
		LibTpl::Set('allKeysEmpty',$allKeysEmpty);
		LibTpl::Set('Params',$Params);
		LibTpl::Set('Pages',LibPage::Show($total,$perPage,true));
		LibTpl::Set('listArr',$listArr);
		LibTpl::Put();
	}

	/**
	 * @method 保存车型自动匹配
	 * @author zhengweihua 
	 * @copyright 2024-04-02
	 */
	public function saveAutoSearch()
	{
		if($_SERVER['REQUEST_METHOD']=='POST')
		{	
			$B2cProduct = new B2cProduct();
			//所有
			$all = $_POST['all']=='true'?true:false;
			if($all)
			{
				$table = "bc_product_model_auto 
				INNER JOIN (  
					SELECT `pma_pro_id` as ppro_id, MAX(`pma_version`) as max_version  
					FROM `bc_product_model_auto` where pma_shop_id={$_SESSION['_shopid']}
					GROUP BY `pma_pro_id`  
				) as sub ON pma_pro_id = sub.ppro_id AND pma_version = sub.max_version
				JOIN bc_product on pma_pro_id = pro_id";
				
				$res = $B2cProduct->get($table,['DISTINCT pma_id'],sprintf(" AND pma_status=0 AND pma_shop_id=%d",$_SESSION['_shopid']));
			
				$pmaIdArr = array_column($res['data'],'pma_id');
				$remarkArr = [];
			}else{
				
				$pmaIdArr = $_POST['modall']['pmaid'];
				$remarkArr = $_POST['modall']['remark'];
				if(empty($pmaIdArr)) LibFc::ReturnJson(false,'请先选择要操作的项目');
			}
			$res = $B2cProduct->saveAutoSearch($pmaIdArr,$remarkArr,$all);
			LibFc::ajaxJsonEncode($res);
		}
	}

	/**
	 * @method 变更状态车型自动匹配
	 * @author zhengweihua 
	 * @copyright 2024-04-02
	 */
	public function changeAutoSearch()
	{
		if($_SERVER['REQUEST_METHOD']=='POST')
		{	
			$pmaIdArr = $_POST['pmaid'];
			$status = $_POST['status'];
			$B2cProduct = new B2cProduct();
			$res = $B2cProduct->set('bc_product_model_auto',['pma_status'=>$status,'pma_etime'=>time()],sprintf(" AND pma_id IN (%s) AND pma_status!=1",$pmaIdArr));
			LibFc::ajaxJsonEncode($res);
		}
	}

	/**
	 * @method 取消配件主号码
	 * @author zhengweihua 
	 * @copyright 2024-05-20
	 */
	public function cancelProMainNum()
	{
		if($_SERVER['REQUEST_METHOD'] == 'POST')
		{
			$proIds = $_POST['proIds'];
			$B2cProduct = new B2cProduct();
			$res = $B2cProduct->set('bc_number',['num_ismain'=>0],sprintf(" AND num_ismain=1 AND num_show=1 AND num_pro_id IN (%s)",$proIds));
			LibFc::ajaxJsonEncode($res);
		}
	}

	public function updateProductD()
	{
		$B2cProduct = new B2cProduct();
		$res = $B2cProduct->set('bc_product',['pro_user_discount'=>'Y'],sprintf(" AND pro_shop_id=%d",$_SESSION['_shopid']));
		LibFc::ReturnJson(true);
	}

	/**
	 * @method 获取配件的vin搜索历史
	 * @author zhengweihua 
	 * @copyright 2024-07-29
	 */
	public function getModelVinList()
	{
		$Params = mvc::$URL_PARAMS;
		$proId = (int)$Params['proId'];
		$word = $Params['word'];
		$B2cProduct = new B2cProduct();
		$res = $B2cProduct->get('bc_product_model_vin',['bpmv_vin'],sprintf(" AND bpmv_vin LIKE '%%%s%%' AND bpmv_pro_id=%d order by bpmv_etime desc limit 100",$word,$proId));
		LibFc::ajaxJsonEncode($res);
	}

	/**
	 * @method 明达定制-客服管理
	 * @author zhengweihua 
	 * @copyright 2024-10-14
	 */
	public function setKefu()
	{	
		if($_SERVER['REQUEST_METHOD']=='POST')
		{
			$realname = $_POST['realname'];
			$word = $_POST['word'];
			//判断是否存在
			$YpwBase = new YpwBase();
			$res = $YpwBase->get('yp_user',['*'],sprintf(" AND u_name='%s' or u_mobile='%s'",$word,$word),true);
            if(!$res['data']){
				$msg = '客服'.$word."不存在，请先注册";
				LibTpl::Error($msg);
            }
			$uid = $res['data']['u_id'];
			$shopSelf = [];
			//保存合并
			$B2cBase = new B2cBase();
			$res = $B2cBase->get('sh_shop',['*'],sprintf(" AND shop_id=%d",$_SESSION['_shopid']),true);
			if($res['data']){
				$shopSelf = $res['data']['shop_self']?json_decode($res['data']['shop_self'],true):[];
			}
			$shopSelf['kefu'][] = ['uid'=>$uid,'realname'=>$realname];

			$res = $B2cBase->set('sh_shop',['shop_self'=>json_encode($shopSelf)],sprintf(" AND shop_id=%d",$_SESSION['_shopid']));
			if($res['status'])
			{
				LibTpl::Success('操作成功');
			}else{
				LibTpl::Error('操作错误');
			}
		}

		$Params = mvc::$URL_PARAMS;
		$arr = [];
		$B2cBase = new B2cBase();
		$res = $B2cBase->get('sh_shop',['shop_self'],sprintf(" AND shop_id=%d",$_SESSION['_shopid']),true);
		if($res['data'])
		{
			$selfArr = $res['data']['shop_self'] ?json_decode($res['data']['shop_self'],true):[];
			$kefuArr = $selfArr['kefu']?array_column($selfArr['kefu'],null,'uid'):[];
			if($kefuArr)
			{
				$YpwUser = new YpwUser();
				$res = $YpwUser->Get('yp_user', array('u_id','u_name','u_nickname','u_real_name','u_mobile'), sprintf(' and u_id in (%s)',implode(',',array_keys($kefuArr))));
				foreach ($res['data'] as $key => &$val) 
				{
					$val['realname'] = $kefuArr[$val['u_id']]['realname']?: $val['u_real_name'];;
					$val['chkdep'] = $kefuArr[$val['u_id']]['chkdep']??[];
					$val['u_name'] = $val['u_name'] ? $val['u_name'] : $val['u_nickname'];


					if($Params['keyword'] && $val['realname'] && stripos($val['realname'],$Params['keyword'])===false &&$val['u_name']&&
					stripos($val['u_name'],$Params['keyword'])===false && $val['u_mobile']!=$Params['keyword'])
					{
						unset($res['data'][$key]);
					}
				}
				unset($val);
				$arr = $res['data'];
			}
		}
		LibTpl::Set('Params',$Params);
		LibTpl::Set('kefuArr',$arr);
		LibTpl::Put();
	}

	public function delKefu()
	{
		if($_SERVER['REQUEST_METHOD']=='POST' && $_POST['uid'])
		{
			$B2cBase = new B2cBase();
			$res = $B2cBase->get('sh_shop',['shop_self'],sprintf(" AND shop_id=%d",$_SESSION['_shopid']),true);
			if($res['data'])
			{
				$selfArr = $res['data']['shop_self'] ?json_decode($res['data']['shop_self'],true):[];
				$change =false;
				foreach ($selfArr['kefu'] as $key => $val) {
					if(!is_array($val)) continue;
					if($val['uid'] == $_POST['uid']){
						$change =true;
						unset($selfArr['kefu'][$key]);
					}
				}
				if($change){
					$B2cBase->set('sh_shop',['shop_self'=>json_encode($selfArr)],sprintf(" AND shop_id=%d",$_SESSION['_shopid']));
				}
			}
			return LibFc::ReturnJson(true,'操作成功');
		}
	}

	public function editKefu()
	{
		if($_SERVER['REQUEST_METHOD']=='POST')
		{
			$data = $_POST;
			$B2cBase = new B2cBase();
			$res = $B2cBase->get('sh_shop',['*'],sprintf(" AND shop_id=%d",$_SESSION['_shopid']),true);
			if($res['data']){
				$shopSelf = $res['data']['shop_self']?json_decode($res['data']['shop_self'],true):[];
			}
			foreach ($shopSelf['kefu'] as &$val) {
				if($val['uid']==$data['uid']){
					
					$val['realname'] = $data['realname'];
				}
			}
			unset($val);
			$res = $B2cBase->set('sh_shop',['shop_self'=>json_encode($shopSelf)],sprintf(" AND shop_id=%d",$_SESSION['_shopid']));
			
			LibFc::ReturnJson(true);
		}
	}

	/**
	 * @method 设置客服部门权限
	 * @author zhengweihua 
	 * @copyright 2025-06-26
	 */
	public function setKefuDep()
	{
		if($_SERVER['REQUEST_METHOD']=='POST')
		{
			$data = $_POST;
			$B2cBase = new B2cBase();
			$res = $B2cBase->get('sh_shop',['*'],sprintf(" AND shop_id=%d",$_SESSION['_shopid']),true);
			if($res['data']){
				$shopSelf = $res['data']['shop_self']?json_decode($res['data']['shop_self'],true):[];
			}
			foreach ($shopSelf['kefu'] as &$val) {
				if($val['uid']==$data['uid']){
					if($data['checked']){
						$val['chkdep'][] = $data['depno'];
					}else{
						$depno = $data['depno'];
						$val['chkdep'] = array_filter($val['chkdep'], function ($item) use ($depno) {
							return $item !== $depno;
						});
					}
					$val['chkdep'] = array_unique($val['chkdep']);
				}
				
			}
			unset($val);
			$res = $B2cBase->set('sh_shop',['shop_self'=>json_encode($shopSelf)],sprintf(" AND shop_id=%d",$_SESSION['_shopid']));
			
			LibFc::ReturnJson(true);
		}
	}



	/**
	 * @method 检测变更车型模式的配件数量
	 * @author zhengweihua 
	 * @copyright 2024-11-13
	 */
	public function checkChangeProMod()
	{
		if($_SERVER['REQUEST_METHOD']=='POST')
		{
			$B2cProduct = new B2cProduct();
			$spartId = $_POST['spartId'];
			$modtype = $_POST['modtype'];
			$spartId = explode(',',$spartId);

			if(empty($spartId)) return LibFc::ReturnJson(false,'参数错误');

			$where = sprintf(" AND pro_shop_id=%d AND concat(pro_part_id, '_', pro_pas_id) in ('%s')",$_SESSION['_shopid'], implode("','",$spartId));
			//排除车型模式一致的配件
			if($modtype=='all'){
				$where .=sprintf(" AND pro_smt_code !='' AND pro_smt_code != '%s'",$modtype);
			}else{
				$where .=sprintf(" AND pro_smt_code != '%s'",$modtype);
			}
			$proIdArr = [];
			$res = $B2cProduct->get('bc_product',['pro_id'],$where);
			if($res['data']){

				$proIdArr = array_column($res['data'],'pro_id');
				//日志
				$B2cLog = new B2cLog();
				$item = [
					'log_shop_id'=>$_SESSION['_shopid'],
					'log_category'=>'21',
					'log_txt'=>'批量操作：配件号码更新适用车型',
					'log_dataid'=>$_SESSION['_shopid']
				];
				$B2cLog->addFastLog($item);
			}
			LibFc::ReturnJson(true,$proIdArr);
		}
	}

	/**
	 * @method 变更车型模式
	 * @author zhengweihua 
	 * @copyright 2024-11-13
	 */
	public function changeProMod()
	{
		if($_SERVER['REQUEST_METHOD']=='POST')
		{
			$B2cProduct = new B2cProduct();
			$items = $_POST['items'];
			$modtype = $_POST['modtype'];
			$res = $B2cProduct->changeProMod($items,$modtype);
			LibFc::ajaxJsonEncode($res);
		}
	}

	/**
	 * @method 检查重置商品图片水印的缓存状态
	 * @author zhengweihua 
	 * @copyright 2026-01-30
	 */
	public function checkResetProWater()
	{
		$cacheFile = \mvc::$cfg['PATH_CACHE'].'reset_pro_water_' . $_SESSION['_shopid'] . '.json';
		$cacheTime = 3600;
		
		if (file_exists($cacheFile)) {
			$cacheData = json_decode(file_get_contents($cacheFile), true);
			$fileTime = $cacheData['created_time'];
			
			// 检查缓存是否过期 且未处理完
			if ((time() - $fileTime) < $cacheTime && !empty($cacheData['unprocessed_ids'])) {

				LibFc::ReturnJson(true, $cacheData);
			} else {
				unlink($cacheFile);
				LibFc::ReturnJson(true, '');
			}
		} else {
			LibFc::ReturnJson(true, '');
		}
	}
	/**
	 * @method 重置配件水印
	 * @author zhengweihua 
	 * @copyright 2026-01-30
	 */
	public function resetProWater()
	{
		if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
			LibFc::ReturnJson(false, '请求错误');
		}
		
		$items = $_POST['items'] ?? [];
		
		if (empty($items)) {
			LibFc::ReturnJson(false, '参数错误');
		}
		
		$OthFileCenter = new OthFileCenter();
		
		$B2cProduct = new B2cProduct();
		
		$proIds = array_map('intval', $items);
		$idsStr = implode(',', $proIds);
		
		$table = "bc_product_pic 
				  JOIN bc_product ON pp_pro_id = pro_id
				  JOIN sh_pic ON pp_spi_id = spi_id AND spi_shop_id = pro_shop_id"; 
				  
		
		$where = sprintf(" AND pro_shop_id=%d AND pro_id IN (%s)", $_SESSION['_shopid'], $idsStr);
		
		$res = $B2cProduct->get($table, [
			'pp_pro_id', 
			'spi_path', 
			"concat(spi_name, '.', spi_ext) as spi_filename"
		], $where);
		
		$files = [];
		foreach ($res['data'] as $pic) {
			$files[] = $pic['spi_path'] . $pic['spi_filename'];
		}
		
		if (!empty($files)) {
			// 按5个一批分批处理
			$chunksArr = array_chunk($files, 5);
			$successCount = 0;
			
			foreach ($chunksArr as $chunk) {
				$dataArr = [
					'cate' => 'product',
					'files' => $chunk,
				];
				
				$res = $OthFileCenter->resetHasfile($dataArr, 'b2c');
				if ($res['status']) {
					$successCount += count($chunk);
				} else {
					// 如果某一批失败，记录错误
					error_log("Reset image failed: " . json_encode($res));
				}
			}
		}
		
		// 更新缓存文件中的处理状态
		$this->updateCacheStatus($proIds);
		

		LibFc::ReturnJson(true, [
			'message' => '重置成功'
		]);
		
	}

	/**
	 * 更新缓存文件中的处理状态
	 */
	private function updateCacheStatus($processedIds)
	{
		$cacheFile = \mvc::$cfg['PATH_CACHE'].'reset_pro_water_' . $_SESSION['_shopid'] . '.json';
		
		if (!file_exists($cacheFile)) {
			return;
		}
		
		$cacheData = json_decode(file_get_contents($cacheFile), true);
		
		// 更新已处理的ID列表
		$cacheData['processed_ids'] = array_unique(array_merge($cacheData['processed_ids'], $processedIds));
		
		// 更新未处理的ID列表
		$cacheData['unprocessed_ids'] = array_diff($cacheData['all_ids'], $cacheData['processed_ids']);
		
		// 重新写入缓存文件
		file_put_contents($cacheFile, json_encode($cacheData, JSON_PRETTY_PRINT));
	}

	/**
	 * @method 获取有图片的商品
	 * @author zhengweihua 
	 * @copyright 2026-01-29
	 */
	public function getAllProWithImg()
	{
		$cacheFile = \mvc::$cfg['PATH_CACHE'].'reset_pro_water_' . $_SESSION['_shopid'] . '.json';
		$B2cProduct = new B2cProduct();
		
		// 查询当前商家拥有图片的配件
		$table = 'bc_product_pic join bc_product on pp_pro_id=pro_id';
		$field = ['distinct pro_id'];
		$where = sprintf(" AND pro_shop_id=%d", $_SESSION['_shopid']);
		
		$res = $B2cProduct->get($table, $field, $where);
		
		if ($res['status']) {
			$allProIds = array_column($res['data'], 'pro_id');
			
			// 构建缓存数据结构
			$cacheData = [
				'all_ids' => $allProIds,
				'processed_ids' => [],
				'unprocessed_ids' => $allProIds,
				'created_time' => time(),
				'total_count' => count($allProIds)
			];
			
			// 写入缓存文件
			file_put_contents($cacheFile, json_encode($cacheData, JSON_PRETTY_PRINT));
			
			LibFc::ReturnJson(true,$allProIds);
		} else {
			LibFc::ReturnJson(false, '获取配件数据失败');
		}

	}
	
}