settingConnection(); if(! $status) { $this->error = $msg; return; } //是否需要连接u8数据库 if($is_need_connect){ //构建数据库连接对象 list($status,$msg) = $this->settingDb(); if(! $status) { $this->error = $msg; } } } //设置u8连接参数 private function settingConnection(){ $u8 = Setting::where('setting_name','u8')->where('setting_value','<>','')->first(); if(empty($u8)) return [false, 'u8配置参数不存在!']; $u8 = $u8->toArray(); // 使用 eval() 函数执行字符串并转换为数组 $u8 = eval("return {$u8['setting_value']};"); 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不能为空!']; $this->u8 = $u8; $this->u8_api = "https://" . $u8['domain'] . ":" . $u8['u8_api_port'] . "/U8Sys/U8API"; $this->post_common = [ "password"=>"cloud@123456", "entity"=>"", //调用方法 "login"=>[ "sAccID"=> $u8['sAccID'], "sDate"=> date("Y-m-d"), "sServer"=> $u8['sServer'], "sUserID"=> $u8['sUserID'], "sSerial"=> "", "sPassword"=> $u8['sPassword'] ] ]; return [true, '']; } //设置u8数据库连接 private function settingDb(){ if(empty($this->db)){ $u8 = $this->u8; $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) { // 连接成功的逻辑代码 $this->db = DB::connection('sqlsrvs'); } else { return [false, '连接失败!']; } } catch (\Throwable $e) { return [false, $e->getMessage()]; } } return [true, '']; } //采购订单保存 public function U8PO_PomainSave($data){ $id = $data; //映射ip是否通畅 $bool = $this->isDomainAvailable($this->u8['domain']); if(! $bool) { $msg = 'U8程序外部域名不可达'; $this->finalSettle($id, U8Job::one,$msg); return; } //获取数据 $result = $this->getPurchaseData($id); if(empty($result)) { $msg = "同步数据获取失败"; $this->finalSettle($id, U8Job::one, $msg); return; } //u8接口参数组织 $post = $this->post_common; $post['entity'] = "U8PO_PomainSave"; $time = date("Y-m-d"); foreach ($result as $value){ $bodys = []; foreach ($value['product'] as $son){ //子表数据 $bodys[] = [ "iappids"=>"", //子表id "cinvcode"=>$son['code'], //存货编码 "iquantity"=>$son['number'], //数量 "inum"=>$son['number'], //件数 "ipertaxrate"=>$son['ipertaxrate'], //税率 "iunitprice"=>$son['iunitprice'], //原币单价 "itaxprice"=>$son['itaxprice'], //原币含税单价 "isum"=>$son['isum'], //原币价税合计 "imoney"=>$son['imoney'], //原币无税金额 "itax"=>$son['itax'],//原币税额 "cbmemo"=>$son['mark'], //表体备注 "cdefine22"=>"", "cdefine23"=>"", "cdefine24"=>"", "cdefine25"=>"", "cdefine26"=>"", "cdefine27"=>"", "cdefine28"=>"", "cdefine29"=>"", "cdefine30"=>"", "cdefine31"=>"", "cdefine32"=>"", "cdefine33"=>"", "cdefine34"=>"", "cdefine35"=>"", "cdefine36"=>"", "cdefine37"=>"", "cfree1"=>"", "cfree2"=>"", "cfree3"=>"", "cfree4"=>"", "cfree5"=>"", "cfree6"=>"", "cfree7"=>"", "cfree8"=>"", "cfree9"=>"", "cfree10"=>"" ]; } //最终数据 $post['data'] = [ "cpoid"=>$value['order_number'], "dpodate"=>date("Y-m-d H:i:s",$value['crt_time']), "cmemo"=>"T9同步采购单", "cmaker"=>"admin", "cmaketime"=>$time, "IsExamine"=>false, "cvencode"=>$value['cvencode'], //供应商编码 "cdepcode"=>$value['cdepcode'], //部门编号 "cpersoncode"=>$value['cpersoncode'], //业务员编码 "cdefine1"=>"", "cdefine2"=>"", "cdefine3"=>"", "cdefine4"=>"", "cdefine5"=>"", "cdefine6"=>"", "cdefine7"=>"", "cdefine8"=>"", "cdefine9"=>"", "cdefine10"=>"", "cdefine11"=>"", "cdefine12"=>"", "cdefine13"=>"", "cdefine14"=>"", "cdefine15"=>"", "cdefine16"=>"", "bodys"=>$bodys ]; file_put_contents('record_purchase.txt',"请求参数:" . json_encode($post) . PHP_EOL,8); $return = $this->post_helper($this->u8_api,json_encode($post), ['Content-Type:application/json']); file_put_contents('record_purchase.txt',"返回结果:" . json_encode($return). PHP_EOL,8); //剔除数据 $id = array_diff($id, [$value['id']]); if(empty($return)) { $msg = '异常错误,请确认请求接口地址或地址不可达'; $this->finalSettle($value['id'], U8Job::one, $msg); }else{ if( ! empty($return['flag'])){ $this->finalSettle($value['id'], U8Job::one); }else{ $this->finalSettle($value['id'], U8Job::one, $return['msg']); } } } if(! empty($id)){ $msg = "未找到同步数据"; $this->finalSettle($id, U8Job::one, $msg); } } //销售订单(合同)保存 public function U8SaleOrderSave($data){ $id = $data; //映射ip是否通畅 $bool = $this->isDomainAvailable($this->u8['domain']); if(! $bool) { $msg = 'U8程序外部域名不可达'; $this->finalSettle($id, U8Job::two, $msg); return; } //获取数据 $result = $this->getSaleOrderData($id); if(empty($result)) { $msg = "同步数据获取失败"; $this->finalSettle($id, U8Job::two, $msg); return; } //u8接口参数组织 $post = $this->post_common; $post['entity'] = "U8SaleOrderSave"; $time = date("Y-m-d"); $time1 = date("Y-m-d H:i:s"); foreach ($result as $value){ $bodys = []; foreach ($value['product'] as $son){ //子表数据 $bodys[] = [ "iappids"=>"", //子表id "cinvcode"=>$son['code'], //存货编码 "iquantity"=>$son['number'], //数量 "inum"=>$son['number'], //件数 "ipertaxrate"=>$son['ipertaxrate'], //税率 "iunitprice"=>$son['iunitprice'], //原币单价 "itaxprice"=>$son['itaxprice'], //原币含税单价 "isum"=>$son['isum'], //原币价税合计 "imoney"=>$son['imoney'], //原币无税金额 "itax"=>$son['itax'],//原币税额 "cbmemo"=>$son['mark'], //表体备注 "cdefine22"=>"", "cdefine23"=>"", "cdefine24"=>"", "cdefine25"=>"", "cdefine26"=>"", "cdefine27"=>"", "cdefine28"=>"", "cdefine29"=>"", "cdefine30"=>"", "cdefine31"=>"", "cdefine32"=>"", "cdefine33"=>"", "cdefine34"=>"", "cdefine35"=>"", "cdefine36"=>"", "cdefine37"=>"", "cfree1"=>"", "cfree2"=>"", "cfree3"=>"", "cfree4"=>"", "cfree5"=>"", "cfree6"=>"", "cfree7"=>"", "cfree8"=>"", "cfree9"=>"", "cfree10"=>"" ]; } //最终数据 $post['data'] = [ "csocode"=>$value['order_number'], "ddate"=> $time, "cmaker"=>"admin", "dcreatesystime"=>$time1, "cstcode"=>$value['cstcode'], "ccuscode"=>$value['ccuscode'], "cdepcode"=>$value['cdepcode'], "cpersoncode"=>$value['cpersoncode'], "itaxrate"=>"0", "cmemo"=>"T9同步销售顶单", "cdefine1"=>"", "cdefine2"=>"", "cdefine3"=>"", "cdefine4"=>"", "cdefine5"=>"", "cdefine6"=>"", "cdefine7"=>"", "cdefine8"=>"", "cdefine9"=>"", "cdefine10"=>"", "cdefine11"=>"", "cdefine12"=>"", "cdefine13"=>"", "cdefine14"=>"", "cdefine15"=>"", "cdefine16"=>"", "cdefine16"=>"", "cdefine16"=>"", "bodys"=>$bodys ]; file_put_contents('record_purchase.txt',"请求参数:" . json_encode($post) . PHP_EOL,8); $return = $this->post_helper($this->u8_api,json_encode($post), ['Content-Type:application/json']); file_put_contents('record_purchase.txt',"返回结果:" . json_encode($return). PHP_EOL,8); //剔除数据 $id = array_diff($id, [$value['id']]); if(empty($return)) { $msg = '异常错误,请确认请求接口地址或地址不可达'; $this->finalSettle($value['id'],U8Job::two, $msg); }else{ if( ! empty($return['flag'])){ $this->finalSettle($value['id'],U8Job::two); }else{ $this->finalSettle($value['id'], U8Job::two, $return['msg']); } } } if(! empty($id)){ $msg = "未找到同步数据"; $this->finalSettle($id,U8Job::two, $msg); } } //最终处理 public function finalSettle($data,$data_type, $msg = ''){ if(! is_array($data)) $data = [$data]; $time = time(); $insert = []; U8Job::where('del_time',0) ->where('data_type',U8Job::one) ->whereIn('data',$data) ->update(['del_time' => $time]); foreach ($data as $value){ if(empty($msg)){ $insert[] = [ 'data' => $value, 'data_type' => $data_type, 'crt_time' => $time, 'state' => U8Job::success, ]; }else{ $insert[] = [ 'data' => $value, 'data_type' => $data_type, 'crt_time' => $time, 'state' => U8Job::failed, 'msg' => $msg ]; } } U8Job::insert($insert); } public function getPurchaseData($id){ $main = PurchaseOrder::whereIn('id',$id) ->where('del_time',0) ->get()->toArray(); if(empty($main)) return []; $supplier = Supplier::whereIn('id',array_unique(array_column($main,'supplier'))) ->pluck('title','id') ->toArray(); $depart = Depart::whereIn('id',array_unique(array_column($main,'depart_id'))) ->pluck('title','id') ->toArray(); $emp = Employee::whereIn('id',array_unique(array_column($main,'purchase_id'))) ->pluck('number','id') ->toArray(); $sub = PurchaseOrderInfo::whereIn('purchase_order_id',$id) ->where('del_time',0) ->get()->toArray(); $product = Product::whereIn('id',array_unique(array_column($sub,'product_id'))) ->get()->toArray(); $product_map = array_column($product,null,'id'); $sub_map = []; foreach ($sub as $value){ $product_tmp = $product_map[$value['product_id']] ?? []; $value['code'] = $product_tmp['code']; //计算金额 if($value['rate'] > 0){ $value['ipertaxrate'] = $value['rate']; $rate = round($value['rate'] / 100,2); $value['iunitprice'] = round($value['price'] / $rate,2); $value['itaxprice'] = $value['price']; $value['isum'] = $value['price'] * $value['number']; $value['imoney'] = $value['iunitprice'] * $value['number']; $value['itax'] = $value['isum'] - $value['imoney']; }else{ $value['ipertaxrate'] = 0; $value['iunitprice'] = $value['price']; $value['itaxprice'] = $value['price']; $value['isum'] = $value['price'] * $value['number']; $value['imoney'] = $value['isum']; $value['itax'] = 0; } $sub_map[$value['purchase_order_id']][] = $value; } foreach ($main as $key => $value){ $main[$key]['cvencode'] = $supplier[$value['supplier']] ?? ""; $main[$key]['cdepcode'] = $depart[$value['depart_id']] ?? ""; $main[$key]['cpersoncode'] = $emp[$value['purchase_id']] ?? ""; $main[$key]['product'] = $sub_map[$value['id']] ?? []; } return $main; } public function getSaleOrderData($id){ $main = SalesOrder::whereIn('id',$id) ->where('del_time',0) ->get()->toArray(); if(empty($main)) return []; $sub = SalesOrderProductInfo::whereIn('sales_order_id',$id) ->where('del_time',0) ->get()->toArray(); $product = Product::whereIn('id',array_unique(array_column($sub,'product_id'))) ->get()->toArray(); $product_map = array_column($product,null,'id'); $code_map = BasicType::whereIn('id',array_unique(array_merge_recursive(array_column($main,'business_type'),array_column($main,'sale_type'),array_column($main,'plat_type')))) ->pluck('title','id') ->toArray(); $customer_map = Customer::whereIn('id',array_unique(array_column($main,'customer_id'))) ->pluck('title','id') ->toArray(); $depart = Depart::whereIn('id',array_unique(array_column($main,'depart_id'))) ->pluck('title','id') ->toArray(); $emp = Employee::whereIn('id',array_unique(array_column($main,'crt_id'))) ->pluck('number','id') ->toArray(); $sub_map = []; foreach ($sub as $value){ $product_tmp = $product_map[$value['product_id']] ?? []; //计算金额 if($value['rate'] > 0){ $value['ipertaxrate'] = $value['rate']; $rate = round($value['rate'] / 100,2); $value['iunitprice'] = round($value['price'] / $rate,2); $value['itaxprice'] = $value['price']; $value['isum'] = $value['price'] * $value['number']; $value['imoney'] = $value['iunitprice'] * $value['number']; $value['itax'] = $value['isum'] - $value['imoney']; }else{ $value['ipertaxrate'] = 0; $value['iunitprice'] = $value['price']; $value['itaxprice'] = $value['price']; $value['isum'] = $value['price'] * $value['number']; $value['imoney'] = $value['isum']; $value['itax'] = 0; } $value['code'] = $product_tmp['code']; $sub_map[$value['sales_order_id']][] = $value; } foreach ($main as $key => $value){ $main[$key]['cstcode'] = $code_map[$value['sale_type']] ?? ""; //销售类型 $main[$key]['cbustype'] = $code_map[$value['business_type']] ?? ""; //业务类型 $main[$key]['cdefine25'] = $code_map[$value['plat_type']] ?? ""; //平台类型 $main[$key]['cdefine28'] = $code_map[$value['order_number']] ?? ""; //平台单号 $main[$key]['ccuscode'] = $customer_map[$value['customer_id']] ?? ""; $main[$key]['cdepcode'] = $depart[$value['depart_id']] ?? ""; $main[$key]['cpersoncode'] = $emp[$value['crt_id']] ?? ""; $main[$key]['product'] = $sub_map[$value['id']] ?? []; } return $main; } public function post_helper($url, $data, $header = [], $timeout = 20){ $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); curl_close($ch); return json_decode($r, true); } }