<?php
namespace model;
/**
 * Class io
 * @package model
 */
class io extends \model
{
	public function __construct()
    {
		parent::__construct();
	}

	function plm($action,$data){
		$url = \mvc::$cfg['plmUrl'].'/'.$action;
		$result =  ioPostJson($url,$data);
		$error = [
			'result'=>$result,
			'url'=>$url,
			'data'=>$data
		];
		errorLog($error,'API_PLM');
		
		$taskArr = [
			'at_api'=>'plm',
			'at_api_fun'=>$action,
			'at_status'=>1,
			'at_count'=>1,
			'at_unikey'=>'',
			'at_post'=>json_encode($data, JSON_UNESCAPED_UNICODE),
			'at_result'=>json_encode($result, JSON_UNESCAPED_UNICODE),
			'at_update_time'=>getNowTime(),
			'at_create_time'=>getNowTime()
		];
		$this->db->insert('api_task', $taskArr);
		if(empty($result) || $result['code']!='1'){
			//TODO
		}
		return $result;
	}



	function plmParam($innum){
		$url = \mvc::$cfg['plmReadParamUrl']. $innum;
		$result =  ioGetJson($url);
		return $result;
	}


	function bom($action,$data){
		$url = \mvc::$cfg['bomUrl'].'/'.$action;
		$header = [
		    'Content-Type: application/json',
		    "Authorization: Basic ".base64_encode(\mvc::$cfg['bomUrlUsername'].":".\mvc::$cfg['bomUrlPassword'])
		] ;
		$result =  ioPostJson($url,$data, $header);
		return $result;
	}


	function crm($action,$data){
		$url = \mvc::$cfg['crmUrl'].'/'.$action;
		$header = [
		    'Content-Type: application/json',
		    "Authorization: Basic ".base64_encode(\mvc::$cfg['crmUrlUsername'].":".\mvc::$cfg['crmUrlPassword'])
		] ;
		$result =  ioPostJson($url,$data, $header);
		if(empty($result) || !empty($result['ErrorCode'])){
			$error = [
				'result'=>$result,
				'url'=>$url,
				'data'=>$data
			];
			errorLog($error,'API_CRM');
		}
		return $result;
	}

	function jd($action,$data){
		$url = \mvc::$cfg['jdUrl'].'/'.$action;
		$header = [
		    'Content-Type: application/json',
		    "Authorization: Basic ".base64_encode(\mvc::$cfg['jdUrlUsername'].":".\mvc::$cfg['jdUrlPassword'])
		] ;
		$result =  ioPostJson($url,$data, $header);
		if(empty($result) || !empty($result['code'])){
			$error = [
				'result'=>$result,
				'url'=>$url,
				'data'=>$data
			];
			errorLog($error,'API_JD');
		}
		return $result;
	}

	function sap($action,$data){
		$url = \mvc::$cfg['sapUrl'].'/'.$action;
		$header = [
		    'Content-Type: application/json',
		    "Authorization: Basic ".base64_encode(\mvc::$cfg['sapUrlUsername'].":".\mvc::$cfg['sapUrlPassword'])
		] ;
		$result =  ioPostJson($url,$data, $header);
		return $result;
	}


	/*
		新增接口任务
	*/
	public function addApiTask($api, $fun, $dataArr)
	{
		$taskArr = ['at_api'=>$api, 'at_api_fun'=>$fun, 'at_unikey'=>'', 'at_post'=>json_encode($dataArr, JSON_UNESCAPED_UNICODE)];
		$at_id = 0;
		//api的启用状态
		if(!\mvc::$cfg[$api.'Status'])
			return $at_id;
		switch($api)
		{
			case 'crm':
				switch($fun)
				{
					//品名变动
					case 'sap/SynProductTypeInfo':
						for($i = 3; $i > 0; $i--)
						{
							if(!empty($dataArr['headers'][0]['action_type']) && !empty($dataArr['headers'][0]['new_code'.$i]))
							{	
								$taskArr['at_unikey'] = $dataArr['headers'][0]['new_code'.$i];
								break;
							}
						}
					break;
					//审核编码||改主图
					case 'sap/SynMaterialInfo':
						$taskArr['at_unikey'] = $dataArr['Headers'][0]['productNumber'];
					break;
					//审核编码||改主状态||合并时||取消合并
					case 'sap/SynMaterialStatus':
						$taskArr['at_unikey'] = $dataArr['headers'][0]['Productnumber'];
					break;
					//本地码 区域码(pcn_pf_id != 2,3)
					case 'sap/SynMaterialBrand':
						$taskArr['at_unikey'] = $dataArr['headers'][0]['new_productnumber'].'@'.$dataArr['headers'][0]['new_brandmemo'].'@'.$dataArr['headers'][0]['new_name'];
					break;
				}
			break;
			case 'jd':
				switch($fun)
				{
					//审核编码||改主状态||合并时||取消合并
					case 'sap/cpglMaterialStatusToAps':
						$taskArr['at_unikey'] = $dataArr['records'][0]['matnr'];
					break;
				}
			break;
		}

		if(!empty($taskArr['at_unikey']))
		{
			$this->db->Begin();
			$delwhere = [
				'at_status[!]'=>1,
				'at_api'=>$taskArr['at_api'],
				'at_api_fun'=>$taskArr['at_api_fun'],
				'at_unikey'=>$taskArr['at_unikey']
			];
			//2022/10/12 不物理删除记录   -2标识删除
			$this->db->update('api_task', ['at_status'=>-2],$delwhere);
			$taskArr['at_create_time'] = getNowTime();
			$this->db->insert('api_task', $taskArr);
			$at_id = $this->db->id();
			$this->db->End();
		}
		return $at_id;
	}

	
	//允许指定任务ID
	public function runApiTask($atids = [])
	{
		//锁5分钟
		if(!hasFunLock(\mvc::$method, 300)) exit('上次任务尚未完成，请稍后重试');
		$where = ['at_status'=>[0,-1], 'at_api'=>['crm','jd'], 'at_count[<]'=>3, 'LIMIT'=>100];
		if(!empty($atids)) $where['at_id'] = $atids;
		$where['ORDER'] = ['at_status'=>'DESC', "at_id" => "ASC"];
		$taskArr = $this->db->select('api_task', ['at_id', 'at_api'], $where);
		if(!empty($taskArr))
		{
			foreach($taskArr as $task)
			{
				//api的启用状态
				if(!\mvc::$cfg[$task['at_api'].'Status']) continue;

				$where = ['at_id'=>$task['at_id'], 'at_status'=>[0,-1], 'at_api'=>['crm','jd'], 'at_count[<]'=>3];
				$task = $this->db->get('api_task', '*', $where);
				
				if(empty($task)) continue;

				$set = ['at_result'=>[]];
				$task['at_post'] = json_decode($task['at_post'], true);
				switch($task['at_api'])
				{
					case 'crm':
						//需要取SAP物料编码
						if($task['at_api_fun'] == 'sap/SynMaterialInfo')
						{
							$sappost = [
								'IT_TAB'=>
								[
									['MAKTX'=>$task['at_post']['Headers'][0]['p_innum']]
								]
							];
							$sapres = $this->sap('sap/QueryMaterial', $sappost);
							if(!empty($sapres['ET_ITEM'][0]['MATNR']))
							{
								$task['at_post']['Headers'][0]['newPsapCode'] = $sapres['ET_ITEM'][0]['MATNR'];
							}
							else
							{
								$set['at_result'] = ['Message'=>'SAP物料编码获取失败', 'Data'=>$sapres, 'ErrorCode'=>-1];
								$set['at_status'] = -1;
							}
						}
						if(empty($set['at_result']))
						{
							$result = $this->crm($task['at_api_fun'], $task['at_post']);
							$set['at_result'] = $result;
							$set['at_status'] = isset($result['ErrorCode']) && empty($result['ErrorCode'])? 1:-1;
						}
					break;
					case 'jd':
						$result = $this->jd($task['at_api_fun'], $task['at_post']);
						$set['at_result'] = $result;
						$set['at_status'] = isset($result['code']) && empty($result['code'])? 1: -1;
					break;
				}
				if(!is_array($set['at_result']))
				{
					$set['at_result'] = ['return'=>$set['at_result']];
					$set['at_status'] = -1;
				}
				$set['at_result'] = json_encode($set['at_result'], JSON_UNESCAPED_UNICODE);
				$set['at_update_time'] = getNowTime();
				$set['at_count'] = raw('at_count+1');
				$this->db->update('api_task', $set, ['at_id'=>$task['at_id']]);
			}
		}
		delFunLock(\mvc::$method);
		exit('ok');
	}
}