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){ if(! is_array($data)) $data = [$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"=>"", "dpodate"=>date("Y-m-d",$value['crt_time']), "cmemo"=>"T9采购单:" . $value['order_number'], "cmaker"=>"admin", "cmaketime"=>$time, "IsExamine"=>false, "cptname"=>$value['cptname']??"",//采购类型 "cvencode"=>"", //供应商编码 "cvenname"=>$value['cvenname'], //供应商名称 "cdepcode"=>"", //部门编号 "cdepname"=>"", //部门名称 $value['cdepname'] "cpersoncode"=>"", //业务员编码jobnumber "jobnumber"=>$value['jobnumber'], //业务员编码 "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){ if(! is_array($data)) $data = [$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 = []; // $cdefine31 = ""; // if(! empty($value['cstname']) && $value['cstname'] == "线下销售") $cdefine31 = $value['cstname']; foreach ($value['product'] as $son){ //子表数据 $bodys[] = [ "cinvcode"=>$son['code'], //存货编码 "iquantity"=>$son['number'], //数量 "inum"=>$son['number'], //件数 "itaxrate"=>$son['itaxrate'], //税率 "iunitprice"=>$son['iunitprice'],//原币单价 "itaxunitprice"=>$son['itaxunitprice'], // 原币含税单价 "isum"=>$son['isum'], //原币价税合计 "imoney"=>$son['imoney'], //原币无税金额 "itax"=>$son['itax'],//原币税额 "cbmemo"=>$son['mark'], //表体备注 // "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"=>$son['cdefine22'], //手机号码 "cdefine23"=>"", "cdefine24"=>"", "cdefine25"=>$son['cdefine25'], //平台类型 "cdefine26"=>"", "cdefine27"=>"", "cdefine28"=>$son['cdefine28'], //平台单号 "cdefine29"=>$son['cdefine29'], //分社施工 "cdefine30"=>$son['cdefine30'], //业务员 "cdefine31"=>$son['cdefine31'], //客户名称 "cdefine32"=>$son['cdefine32'], //直播销售 "cdefine33"=>"", "cdefine34"=>"", "cdefine35"=>"", "cdefine36"=>"", "cdefine37"=>"", "cfree1"=>"", "cfree2"=>"", "cfree3"=>"", "cfree4"=>"", "cfree5"=>"", "cfree6"=>"", "cfree7"=>"", "cfree8"=>"", "cfree9"=>"", "cfree10"=>"" ]; } //最终数据 $post['data'] = [ "csocode"=>'', "ddate"=> $time, "cmaker"=>"admin", "dcreatesystime"=>$time1, "cstcode"=>"", "cbustype" => $value['cbustype'], //业务类型 "cstname"=>$value['cstname'], //销售类型 "ccuscode"=>"", "ccusabbname"=>$value['ccusabbname'], //客户简称 "cdepcode"=>"", "cdepname"=>"", // 部门名称 $value['cdepname'] "cpersoncode"=>"", //业务员编码 暂时不要 "jobnumber"=>$value['jobnumber'],//业务员工号 "itaxrate"=>"0", "cmemo"=>"T9销售订单:". $value['order_number'], "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::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',$data_type) ->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(); $code_map = BasicType::whereIn('id',array_unique(array_column($main,'purchase_type'))) ->pluck('title','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){ // ipertaxrate 税率 // iunitprice 原币单价 // itaxprice 原币含税单价 // isum 原币价税合计 // imoney 原币无税金额 // itax 原币税额 $value['ipertaxrate'] = $value['rate']; $rate = round($value['rate'] / 100,2); $value['iunitprice'] = round($value['price'] / (1 + $rate),2); $value['itaxprice'] = $value['price']; $value['isum'] = round($value['price'] * $value['number'],2); $value['imoney'] = round($value['iunitprice'] * $value['number'],2); $value['itax'] = round($value['isum'] - $value['imoney'],2); }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]['cptname'] = $code_map[$value['purchase_type']] ?? ""; $main[$key]['cvenname'] = $supplier[$value['supplier']] ?? ""; // $main[$key]['cdepname'] = $depart[$value['depart_id']] ?? ""; // $main[$key]['cpersoncode'] = $emp[$value['purchase_id']] ?? ""; $main[$key]['jobnumber'] = $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 []; $main_map = array_column($main,null,'id'); $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_id = array_filter(array_unique(array_merge_recursive(array_column($main,'sale_type'),array_column($main,'plat_type')))); $code_map = BasicType::whereIn('id',$code_id) ->pluck('title','id') ->toArray(); $customer_map = Customer::whereIn('id',array_unique(array_column($main,'customer_id'))) ->pluck('title','id') ->toArray(); $depart = Depart::where('parent_id',0) ->pluck('title','id') ->toArray(); $emp = Employee::whereIn('id',array_unique(array_column($main,'crt_id'))) ->pluck('number','id') ->toArray(); $see = SeeRange::where('del_time',0) ->whereIn('data_id',array_column($main,'id')) ->where('data_type',SeeRange::type_seven) ->where('type',SeeRange::data_three) ->pluck('param_id','data_id')->toArray();//指派的分社 $sub_map = []; foreach ($sub as $value){ $product_tmp = $product_map[$value['product_id']] ?? []; $main_tmp = $main_map[$value['sales_order_id']] ?? []; // "itaxrate"=>$son['itaxrate'], //税率 // "iunitprice"=>$son['iunitprice'],//原币单价 // "itaxunitprice"=>$son['itaxunitprice'], // 原币含税单价 // "isum"=>$son['isum'], //原币价税合计 // "imoney"=>$son['imoney'], //原币无税金额 // "itax"=>$son['itax'],//原币税额 //计算金额 if($value['rate'] > 0){ $value['itaxrate'] = $value['rate']; $rate = round($value['rate'] / 100,2); $value['iunitprice'] = round($value['price'] / (1 + $rate),2); $value['itaxunitprice'] = $value['price']; $value['isum'] = round($value['price'] * $value['number'],2); $value['imoney'] = round($value['iunitprice'] * $value['number'],2); $value['itax'] = round($value['isum'] - $value['imoney'],2); }else{ $value['itaxrate'] = 0; $value['iunitprice'] = $value['price']; $value['itaxunitprice'] = $value['price']; $value['isum'] = $value['price'] * $value['number']; $value['imoney'] = $value['isum']; $value['itax'] = 0; } $value['cdefine25'] = $code_map[$main_tmp['plat_type']] ?? ""; //平台类型 $value['cdefine28'] = $main_tmp['plat_order'] ?? ""; //平台单号 $top_depart_id = $see[$value['sales_order_id']] ?? 0; $value['cdefine29'] = $depart[$top_depart_id] ?? "";//分社施工 $value['cdefine32'] = "";//直播销售 暂时没有 $value['cdefine31'] = $customer_map[$main_tmp['customer_id']] ?? "";//客户名称 $value['cdefine22'] = $main_tmp['customer_contact'] ?? "";//手机号码 // $value['cdefine31'] = "";//客户名称(线上的时候就是空 线下的话就是表头的客户简称) // $value['cdefine22'] = "";//手机号码 暂时没有 $value['cdefine30'] = $emp[$main_tmp['crt_id']] ?? "";//业务员 $value['code'] = $product_tmp['code'];//存货编码 $sub_map[$value['sales_order_id']][] = $value; } foreach ($main as $key => $value){ $main[$key]['cbustype'] = "普通销售"; //业务类型(本身就是中文) $main[$key]['cstname'] = SalesOrder::$model_type_title[$value['model_type']] ?? ""; //销售类型 $main[$key]['ccusabbname'] = $customer_map[$value['customer_id']] ?? "";//客户简称 // $main[$key]['cdepname'] = $depart[$value['top_depart_id']] ?? "";//部门名称 // $main[$key]['cpersoncode'] = $emp[$value['crt_id']] ?? "";//业务员 $main[$key]['jobnumber'] = $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); } }