post_helper($url,$json, $header, 40); if(! $status) return [false, $result]; return [true, $result]; } public function testdwyget($data){ if(empty($data['url']) || empty($data['header'])) return [false,'API请求参数不能为空']; $url = $data['url']; $header = $data['header']; list($status,$result) = $this->get_helper($url,$header); if(! $status) return [false, $result]; return [true, $result]; } public function testdwyput($data){ if(empty($data['url']) || empty($data['post']) || empty($data['header'])) return [false,'API请求参数不能为空']; $url = $data['url']; $post = $data['post']; $header = $data['header']; $json = json_encode($post); $json = str_replace('"workflowSearchBean":{}','"workflowSearchBean":[]',json_encode($post)); $json = str_replace('"workflowSearchBean":[]','"workflowSearchBean":{}',json_encode($post)); list($status, $result) = $this->put_helper($url,$json, $header,40); if(! $status) return [false, $result]; return [true, $result]; } public function updateTopStock($data){ list($status, $msg) = $this->rule(); if(! $status) return [false, 'IP未入白名单']; if(empty($data['urlFromT9']) || $data['urlFromT9'] != "getStock") return [false,'API请求参数不能为空']; if(empty($data['code'])) return [false,'API请求参数不能为空']; if(empty($data['warehouse'])) return [false,'API请求参数不能为空']; list($status, $msg) = $this->connectYy(); if(! $status) return [false, $msg]; //数据库 $db = $msg[0]; $u8 = $msg[1]; list($status, $msg) = $this->getStock($db, $u8,$data['code'],$data['warehouse']); return [$status, $msg]; } public function getSnList($data){ list($status, $msg) = $this->rule(); if(! $status) return [false, 'IP未入白名单']; if(empty($data['urlFromT9']) || $data['urlFromT9'] != "getSnList") return [false,'API请求参数不能为空']; if(empty($data['sn_type'])) return [false, 'sn码来源依据不能为空']; list($status, $msg) = $this->connectYy(); if(! $status) return [false, $msg]; //数据库 $db = $msg[0]; $u8 = $msg[1]; if($data['sn_type'] == 1){ list($status, $msg) = $this->getSnListFormU8One($db, $u8,$data); }else{ //发货出库单 sn码 list($status, $msg) = $this->getSnListFormU8Two($db, $u8,$data); } return [$status, $msg]; } public function getSnforMap($data){ list($status, $msg) = $this->rule(); // if(! $status) return [false, 'IP未入白名单']; if(empty($data['urlFromT9']) || $data['urlFromT9'] != "getSnMap") return [false,'API请求参数不能为空']; if(empty($data['sn'])) return [false, 'sn码不能为空']; if(empty($data['code'])) return [false, '产品编码不能为空']; list($status, $msg) = $this->connectYy(); if(! $status) return [false, $msg]; //数据库 $db = $msg[0]; $u8 = $msg[1]; list($status, $msg) = $this->getSnListFormU8ForMap($db, $u8,$data); return [$status, $msg]; } public function rule(){ // 获取用户的IP地址 $userIP = $_SERVER['REMOTE_ADDR']; // 获取设置的IP地址 $ip = env("AliYUN"); $allowedIPs = [$ip]; $allowedIPs = array_filter($allowedIPs); if(empty($allowedIPs)) return [false, $userIP]; // 校验用户IP是否在允许的范围内 $isValidIP = false; foreach ($allowedIPs as $allowedIP) { if (strpos($allowedIP, '/') !== false) { // IP段表示法校验 list($subnet, $mask) = explode('/', $allowedIP); if ((ip2long($userIP) & ~((1 << (32 - $mask)) - 1)) == ip2long($subnet)) { $isValidIP = true; break; } } else { // 单个IP地址校验 if ($allowedIP === $userIP) { $isValidIP = true; break; } } } return [$isValidIP, $userIP]; } public function connectYy(){ $model_box = DB::connection("mysqlT9"); $u8 = $model_box->table('setting') ->where('setting_name','u8') ->where('setting_value','<>','') ->first(); if(empty($u8)) return [false, 'u8配置参数不存在!']; $u8 = $u8->setting_value; // 使用 eval() 函数执行字符串并转换为数组 $u8 = eval("return {$u8};"); if(empty($u8['domain'])) return [false, '外部域名不能为空!']; if(empty($u8['u8_api_port'])) return [false, 'u8程序API端口不能为空!']; if(empty($u8['u8_database_port'])) return [false, 'u8程序数据库端口不能为空!']; if(empty($u8['database'])) return [false, 'u8程序数据库不能为空!']; if(empty($u8['database_account'])) return [false, 'u8程序数据库登录账号不能为空!']; if(empty($u8['database_password'])) return [false, 'u8程序数据库登录密码不能为空!']; if(empty($u8['sAccID'])) return [false, 'u8程序sAccID不能为空!']; if(empty($u8['sServer'])) return [false, 'u8程序sServer不能为空!']; if(empty($u8['sUserID'])) return [false, 'u8程序sUserID不能为空!']; if(empty($u8['sPassword'])) return [false, 'u8程序sPassword不能为空!']; $config = [ 'driver' => 'sqlsrv', 'host' => $u8['domain'], 'port' => $u8['u8_database_port'], 'database' => $u8['database'], 'username' => $u8['database_account'], 'password' => $u8['database_password'], ]; // 数据库配置设置 Config::set('database.connections.sqlsrvs', $config); // 连接 try { $pdo = DB::connection('sqlsrvs')->getPdo(); if ($pdo instanceof \PDO) { // 连接成功的逻辑代码 $db = DB::connection('sqlsrvs'); return [true, [$db, $u8]]; } else { return [false, '连接失败!']; } } catch (\Throwable $e) { return [false, $e->getMessage()]; } } public function getStock($db, $u8, $code = [], $warehouse = ""){ if(empty($code) || empty($warehouse)) return [false, '存货以及仓库不能为空']; //映射ip是否通畅 $bool = $this->isDomainAvailable($u8['domain']); if(! $bool) return [false, 'U8程序外部域名不可达']; $result = $db->table('CurrentStock') ->where("cWhCode", $warehouse) ->whereIn("cInvCode", $code) ->select('iQuantity as number', 'cInvCode as product_no') ->get()->toArray(); $return = []; foreach ($result as $value){ $return[] = [ 'number' => floatval($value->number), 'product_no' => $value->product_no ]; } return [true, $return]; } public function getSnListFormU8One($db, $u8, $data){ if(empty($data['code'])) return [false, '存货不能为空']; $sn = $data['sn'] ?? ""; $warehouse = [ '001', '003', '010', ]; //映射ip是否通畅 $bool = $this->isDomainAvailable($u8['domain']); if(! $bool) return [false, 'U8程序外部域名不可达']; //检索条件 在库的 $model = $db->table('ST_SNState') ->select('cinvCode as code','cInvSN as sn') ->whereIn("cWhCode", $warehouse) ->where("cInvCode", $data['code']) ->where("iSNState", 2) ->when(! empty($sn), function ($query) use ($sn) { return $query->where('cInvSN', 'LIKE', '%'.$sn.'%'); }); $list = $this->limit($model, '', $data); return [true, $list]; } public function getSnListFormU8Two($db, $u8, $data){ if(empty($data['code']) || empty($data['depart_title'])) return [false, '存货以及门店信息不能为空']; $sn = $data['sn'] ?? ""; //映射ip是否通畅 $bool = $this->isDomainAvailable($u8['domain']); if(! $bool) return [false, 'U8程序外部域名不可达']; $model = $db->table('rdrecord32 as a') ->leftJoin('rdrecords32 as b','b.ID','a.ID') ->leftJoin('ST_SNDetail_SaleOut as c','c.iVouchsID','b.AutoID') ->select("c.cInvCode as code",'c.cinvSN as sn') ->whereNotNull('a.cHandler') ->where("b.cInvCode", $data['code']) ->where("b.iQuantity", '>', 0) ->where("b.cDefine31", $data['depart_title']) ->whereNotNull("c.cinvSN") ->when(! empty($sn), function ($query) use ($sn) { return $query->where('c.cInvSN', 'LIKE', '%'.$sn.'%'); }) ->orderBy('a.ID','desc'); $list = $this->limit($model, '', $data); return [true, $list]; } public function getSnListFormU8ForMap($db, $u8, $data){ //映射ip是否通畅 $bool = $this->isDomainAvailable($u8['domain']); if(! $bool) return [false, 'U8程序外部域名不可达']; $list = $db->table('ST_SNState') ->select("cInvCode as code",'cinvSN as sn') ->whereIn("cInvCode", $data['code']) ->whereIn('cInvSN', $data['sn']) ->get()->toArray(); return [true, $list]; } public function post_helper($url, $data, $header = [], $timeout = 20){ Log::channel('apiLog')->info('朗峰POST', ["api" => $url , "param" => $data ,"header" => $header]); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_ENCODING, ''); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); if(!is_null($data)) curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $r = curl_exec($ch); if ($r === false) { // 获取错误号 $errorNumber = curl_errno($ch); // 获取错误信息 $errorMessage = curl_error($ch); $message = "cURL Error #{$errorNumber}: {$errorMessage}"; Log::channel('apiLog')->info('朗峰POST结果', ["message" => $message ]); return [false, $message]; } curl_close($ch); Log::channel('apiLog')->info('朗峰POST结果', ["message" => json_decode($r, true) ]); return [true, json_decode($r, true)]; } public function get_helper($url,$header=[],$timeout = 20){ $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => $timeout, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_SSL_VERIFYPEER => false, CURLOPT_HTTPHEADER => $header, )); $r = curl_exec($ch); if ($r === false) { // 获取错误号 $errorNumber = curl_errno($ch); // 获取错误信息 $errorMessage = curl_error($ch); $message = "cURL Error #{$errorNumber}: {$errorMessage}"; Log::channel('apiLog')->info('朗峰GET结果', ["message" => $message]); return [false, $message]; } curl_close($ch); Log::channel('apiLog')->info('朗峰GET结果', ["message" => json_decode($r, true)]); return [true, json_decode($r, true)]; } public function put_helper($url, $data, $header = [], $timeout = 20){ Log::channel('apiLog')->info('朗峰PUT', ["api" => $url , "param" => $data ,"header" => $header]); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_ENCODING, ''); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); if(!is_null($data)) curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $r = curl_exec($ch); if ($r === false) { // 获取错误号 $errorNumber = curl_errno($ch); // 获取错误信息 $errorMessage = curl_error($ch); $message = "cURL Error #{$errorNumber}: {$errorMessage}"; Log::channel('apiLog')->info('朗峰PUT结果', ["message" => $message]); return [false, $message]; } curl_close($ch); Log::channel('apiLog')->info('朗峰PUT结果', ["message" => json_decode($r, true)]); return [true, json_decode($r, true)]; } }