TestService.php 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101
  1. <?php
  2. namespace App\Service;
  3. use App\Model\RecordTable;
  4. use Illuminate\Support\Facades\Cache;
  5. use Illuminate\Support\Facades\Log;
  6. class TestService extends Service
  7. {
  8. public function testPjCommonRule($data){
  9. if(empty($data['domain'])) return [false, '域名不能为空'];
  10. $url = $data['domain'] . '/api/module-data/asst_daily_schedule/asst_daily_schedule/diy/get_current_daily_schedule';
  11. $json = '{}';
  12. list($status, $result) = $this->post_helper($url,$json, $data['header'], 30,'pj预先调用');
  13. if(! $status) return [false, $result];
  14. if(isset($result['message']) && $result['message'] == 'error.unAuthorized') return [false, $result['description'] ?? '用户未登录或失效'];
  15. if(isset($result['status']) && $result['status'] == 'error') return [false, $result];
  16. return [true, ''];
  17. }
  18. public function testpj($data){
  19. if(empty($data['url']) || empty($data['post']) || empty($data['header'])) return [false,'API请求参数不能为空'];
  20. list($status, $msg) = $this->testPjCommonRule($data);
  21. if(! $status) return [false, $msg];
  22. $url = $data['url'];
  23. // $oldUrl = config('ip.zslf');
  24. // $newUrl = config('ip.zslfip');
  25. // $url = str_replace($oldUrl, $newUrl, $url);
  26. $post = $data['post'];
  27. $header = $data['header'];
  28. $json = json_encode($post);
  29. $json = str_replace('"workflowSearchBean":[]','"workflowSearchBean":{}',$json);
  30. $json = str_replace('"loginBindingParameters":[]','"loginBindingParameters":{}',$json);
  31. list($status, $result) = $this->post_helper($url,$json, $header, 40,'pj');
  32. if(! $status) return [false, $result];
  33. return [true, $result];
  34. }
  35. public function testpjget($data){
  36. if(empty($data['url']) || empty($data['header'])) return [false,'API请求参数不能为空'];
  37. list($status, $msg) = $this->testPjCommonRule($data);
  38. if(! $status) return [false, $msg];
  39. $url = $data['url'];
  40. // $oldUrl = config('ip.zslf');
  41. // $newUrl = config('ip.zslfip');
  42. // $url = str_replace($oldUrl, $newUrl, $url);
  43. $header = $data['header'];
  44. list($status,$result) = $this->get_helper($url,$header);
  45. if(! $status) return [false, $result];
  46. return [true, $result];
  47. }
  48. public function testpjput($data){
  49. if(empty($data['url']) || empty($data['post']) || empty($data['header'])) return [false,'API请求参数不能为空'];
  50. list($status, $msg) = $this->testPjCommonRule($data);
  51. if(! $status) return [false, $msg];
  52. $url = $data['url'];
  53. // $oldUrl = config('ip.zslf');
  54. // $newUrl = config('ip.zslfip');
  55. // $url = str_replace($oldUrl, $newUrl, $url);
  56. $post = $data['post'];
  57. $header = $data['header'];
  58. $json = json_encode($post);
  59. $json = str_replace('"workflowSearchBean":{}','"workflowSearchBean":[]',json_encode($post));
  60. $json = str_replace('"workflowSearchBean":[]','"workflowSearchBean":{}',json_encode($post));
  61. list($status, $result) = $this->put_helper($url,$json, $header,40);
  62. if(! $status) return [false, $result];
  63. return [true, $result];
  64. }
  65. public function testdwy($data){
  66. if(empty($data['url']) || empty($data['post']) || empty($data['header'])) return [false,'API请求参数不能为空'];
  67. $url = $data['url'];
  68. // $oldUrl = config('ip.zslf');
  69. // $newUrl = config('ip.zslfip');
  70. // $url = str_replace($oldUrl, $newUrl, $url);
  71. $post = $data['post'];
  72. $header = $data['header'];
  73. $json = json_encode($post);
  74. $json = str_replace('"workflowSearchBean":[]','"workflowSearchBean":{}',$json);
  75. $json = str_replace('"loginBindingParameters":[]','"loginBindingParameters":{}',$json);
  76. list($status, $result) = $this->post_helper($url,$json, $header, 40,'LFMY');
  77. if(! $status) return [false, $result];
  78. return [true, $result];
  79. }
  80. public function testdwyget($data){
  81. if(empty($data['url']) || empty($data['header'])) return [false,'API请求参数不能为空'];
  82. $url = $data['url'];
  83. // $oldUrl = config('ip.zslf');
  84. // $newUrl = config('ip.zslfip');
  85. // $url = str_replace($oldUrl, $newUrl, $url);
  86. $header = $data['header'];
  87. list($status,$result) = $this->get_helper($url,$header);
  88. if(! $status) return [false, $result];
  89. return [true, $result];
  90. }
  91. public function testdwyput($data){
  92. if(empty($data['url']) || empty($data['post']) || empty($data['header'])) return [false,'API请求参数不能为空'];
  93. $url = $data['url'];
  94. // $oldUrl = config('ip.zslf');
  95. // $newUrl = config('ip.zslfip');
  96. // $url = str_replace($oldUrl, $newUrl, $url);
  97. $post = $data['post'];
  98. $header = $data['header'];
  99. $json = json_encode($post);
  100. $json = str_replace('"workflowSearchBean":{}','"workflowSearchBean":[]',json_encode($post));
  101. $json = str_replace('"workflowSearchBean":[]','"workflowSearchBean":{}',json_encode($post));
  102. list($status, $result) = $this->put_helper($url,$json, $header,40);
  103. if(! $status) return [false, $result];
  104. return [true, $result];
  105. }
  106. //-----------------------------------朗峰u8-----
  107. public function getToken($common_array){
  108. list($status, $msg) = $this->SetU8($common_array);
  109. if(! $status) return [false , $msg];
  110. $host = $msg;
  111. $key = "lf_u8_long_token_demo_" . $common_array['site'] . '_' . $common_array['database'];
  112. if(! Cache::has($key)){
  113. $url = $host . "/api/System/GetToken";
  114. $date = date("Y-m-d");
  115. $json = [
  116. "U8DbName"=> $common_array['database'],
  117. "sUserId"=> "demo",
  118. "sPassword"=> "DEMO",
  119. "LoginDateTime"=> $date,
  120. "bPersist"=> true
  121. ];
  122. $header = ['Content-Type:application/json'];
  123. list($status, $result) = $this->post_helper($url,json_encode($json), $header, 30, $common_array['title'] . "获取token");
  124. if(! $status) return [false, $result];
  125. if(! isset($result['code'])) return [false, '获取用友登录信息失败,请重新操作'];
  126. if($result['code'] != 0) return [false, $result['msg']];
  127. $token = $result['data']['Token'] ?? "";
  128. Cache::forever($key, $token);
  129. }else{
  130. $token = Cache::get($key);
  131. }
  132. return [true, [$host, $token]];
  133. }
  134. public function salesOrderGet($data, $common_array){
  135. list($status, $msg) = $this->getToken($common_array);
  136. if(! $status) return [false, $msg];
  137. list($host, $token) = $msg;
  138. $today = (new \DateTime())->setTime(0, 0, 0)->format('Y-m-d H:i:s') . '.000';
  139. $fourDaysAgo = (new \DateTime())->sub(new \DateInterval('P4D'))->setTime(0, 0, 0)->format('Y-m-d H:i:s') . '.000';
  140. $page = $data['pageSize'] ?? 10;
  141. $version = $data['version'] ?? 0;
  142. $start_time = $data['start_time'] ?? $today;
  143. $end_time = $data['end_time'] ?? $today;
  144. $order_number = $data['order_number'] ?? '';
  145. $header = ["Authorization: {$token}",'Content-Type:application/json'];
  146. $url = $host . "/api/System/SqlQuery";
  147. $json = [
  148. 'customSQLFileName' => "U8SQL",
  149. 'customSQLPath' => 'U8API/SO_SOMain/Get',
  150. 'paramObj' => [
  151. "@pagesize" => $page,
  152. "@where" => "AND m.dDate >= '$start_time' AND m.dDate <= '$end_time' AND m.iStatus = 1",
  153. "@code" => $order_number,
  154. "@version" => $version,
  155. ]
  156. ];
  157. $json = json_encode($json);
  158. list($status, $result) = $this->post_helper($url,$json, $header, 60, $common_array['title'] . '获取销售订单');
  159. if(! $status) return [false, $result];
  160. if(! isset($result['code'])) return [false, '拉取销售订单失败,请重新拉取'];
  161. if($result['code'] != 0) return [false, $result['msg']];
  162. if(empty($result['data'])) return [true, []];
  163. $r_data = $result['data'];
  164. $return = $this->returnOrders($common_array, $r_data, $msg);
  165. return [true, $return];
  166. }
  167. private function returnOrders($common_array, $r_data, $msg){
  168. $site = $common_array['site'];
  169. $title = $common_array['title'];
  170. $return = [];
  171. if($site == 'LFMY'){
  172. foreach ($r_data as $value){
  173. list($status, $detail) = $this->getSalesDetail($value, $msg, $title);
  174. if(! $status) return [false, $detail];
  175. $return_detail = [];
  176. $total_qty = $money = 0;
  177. foreach ($detail as $d_value){
  178. $return_detail[] = [
  179. 'erp_sale_dt_id' => $d_value['autoid'],
  180. 'item_no' => $d_value['irowno'],
  181. 'material_code' => $d_value['cinvcode'],
  182. 'brand_name' => $d_value['cdefine28'] ?? '',
  183. 'safe' => $d_value['cdefine29'] ?? '',
  184. 'decor' => $d_value['cdefine30'] ?? '',
  185. 'craft_type_code' => $d_value['cdefine31'] ?? '',
  186. 'decor_b' => $d_value['cdefine32'] ?? '',
  187. 'craft_type_code_b' => $d_value['cdefine33'] ?? '',
  188. 'unit' => $d_value['cinvm_unit'],
  189. 'price' => $d_value['itaxunitprice'] ?? 0,
  190. 'not_tax_price' => $d_value['itaxunitprice'] ?? 0,
  191. 'tax_price' => $d_value['itaxunitprice'] ?? 0,
  192. 'qty' => $d_value['iquantity'],
  193. 'money' => $d_value['isum'] ?? 0,
  194. 'tax_amount' => $d_value['isum'] ?? 0,
  195. 'total_tax_amount' => $d_value['isum'] ?? 0,
  196. 'tax_rate' => $d_value['itaxrate'] ?? 0,
  197. 'expected_delivery_date' => date('Y-m-d',strtotime($d_value['dpredate'])),
  198. 'remark' => $d_value['cmemo'] ?? '',
  199. ];
  200. $t = $d_value['isum'] ?? 0;
  201. $total_qty = bcadd($total_qty,$d_value['iquantity'],3);
  202. $money = bcadd($money,$t,3);
  203. }
  204. $return[] = [
  205. 'no' => $value['csocode'],
  206. 'order_date' => date("Y-m-d",strtotime($value['ddate'])),
  207. 'customer' => $value['ccuscode'] ?? '',
  208. 'salesman' => $value['cpersoncode'] ?? '',
  209. 'sale_department' => $value['cdepcode'] ?? '',
  210. 'total_qty' => $total_qty,
  211. 'total_money' => $money,
  212. 'remark' => $value['cmemo'] ?? '',
  213. 'version' => $value['version'],
  214. 'detail' => $return_detail,
  215. ];
  216. }
  217. }elseif ($site == 'HCLT'){
  218. foreach ($r_data as $value){
  219. list($status, $detail) = $this->getSalesDetail($value, $msg, $title);
  220. if(! $status) return [false, $detail];
  221. $return_detail = [];
  222. $total_qty = $money = 0;
  223. foreach ($detail as $d_value){
  224. $return_detail[] = [
  225. 'erp_sale_dt_id' => $d_value['autoid'],
  226. 'material_code' => $d_value['cinvcode'] ?? '',
  227. 'specs' => $d_value['cinvstd'] ?? '',
  228. 'unit' => $d_value['cinvm_unit'] ?? '',
  229. 'qty' => $d_value['iquantity'],
  230. 'not_tax_price' => $d_value['iunitprice'] ?? 0,
  231. 'tax_price' => $d_value['itaxunitprice'] ?? 0,
  232. 'not_tax_amount' => $d_value['imoney'] ?? 0,
  233. 'tax_amount' => $d_value['itax'] ?? 0,
  234. 'total_tax_amount' => $d_value['isum'] ?? 0,
  235. 'tax_rate' => $d_value['itaxrate'] ?? 0,
  236. 'expected_delivery_date' => date('Y-m-d',strtotime($d_value['dpredate'])),
  237. 'customer_brand' => $d_value['cfree1'] ?? '',
  238. 'color' => $d_value['cfree2'] ?? '',
  239. 'plan_no' => $d_value['cdefine22'] ?? '',
  240. 'contract_no' => $d_value['cdefine23'] ?? '',
  241. 'technical_require' => $d_value['cdefine28'] ?? '',
  242. 'quality_require' => $d_value['cdefine29'] ?? '',
  243. 'package_require' => $d_value['cdefine30'] ?? '',
  244. 'shipping_mark' => $d_value['cdefine31'] ?? '',
  245. ];
  246. $t = $d_value['isum'] ?? 0;
  247. $total_qty = bcadd($total_qty,$d_value['iquantity'],3);
  248. $money = bcadd($money,$t,3);
  249. }
  250. $return[] = [
  251. 'no' => $value['csocode'],
  252. 'order_date' => date("Y-m-d",strtotime($value['ddate'])),
  253. 'customer' => $value['ccuscode'] ?? '',
  254. 'salesman' => $value['cpersoncode'] ?? '',
  255. 'sale_department' => $value['cdepcode'] ?? '',
  256. 'total_qty' => $total_qty,
  257. 'total_money' => $money,
  258. 'remark' => $value['cmemo'] ?? '',
  259. 'version' => $value['version'],
  260. 'detail' => $return_detail,
  261. ];
  262. }
  263. }elseif ($site == 'JLWM'){
  264. foreach ($r_data as $value){
  265. list($status, $detail) = $this->getSalesDetail($value, $msg, $title);
  266. if(! $status) return [false, $detail];
  267. $return_detail = [];
  268. $total_qty = $money = 0;
  269. foreach ($detail as $d_value){
  270. $return_detail[] = [
  271. 'erp_sale_dt_id' => $d_value['autoid'],
  272. 'material_code' => $d_value['cinvcode'] ?? '',
  273. 'contract_no' => $d_value['cdefine23'] ?? '',
  274. 'specs' => $d_value['cinvstd'] ?? '',
  275. 'unit' => $d_value['cinvm_unit'] ?? '',
  276. 'qty' => $d_value['iquantity'] ?? '',
  277. 'not_tax_price' => $d_value['iunitprice'] ?? 0,
  278. 'tax_price' => $d_value['itaxunitprice'] ?? 0,
  279. 'not_tax_amount' => $d_value['imoney'] ?? 0,
  280. 'tax_amount' => $d_value['itax'] ?? 0,
  281. 'total_tax_amount' => $d_value['isum'] ?? 0,
  282. 'tax_rate' => $d_value['itaxrate'] ?? 0,
  283. 'expected_delivery_date' => date('Y-m-d',strtotime($d_value['dpredate'])),
  284. 'customer_model' => $d_value['cfree4'] ?? '',
  285. 'length' => $d_value['cfree1'] ?? '',
  286. 'width' => $d_value['cfree2'] ?? '',
  287. 'thickness' => $d_value['cfree3'] ?? '',
  288. 'color_or_model' => $d_value['cdefine28'] ?? '',
  289. ];
  290. $t = $d_value['isum'] ?? 0;
  291. $total_qty = bcadd($total_qty,$d_value['iquantity'],3);
  292. $money = bcadd($money,$t,3);
  293. }
  294. $return[] = [
  295. 'no' => $value['csocode'],
  296. 'order_date' => date("Y-m-d",strtotime($value['ddate'])),
  297. 'customer' => $value['ccuscode'] ?? '',
  298. 'salesman' => $value['cpersoncode'] ?? '',
  299. 'sale_department' => $value['cdepcode'] ?? '',
  300. 'total_qty' => $total_qty,
  301. 'total_money' => $money,
  302. 'remark' => $value['cmemo'] ?? '',
  303. 'version' => $value['version'],
  304. 'detail' => $return_detail,
  305. ];
  306. }
  307. }
  308. return $return;
  309. }
  310. public function purchaseOrderGet($data, $common_array){
  311. list($status, $msg) = $this->getToken($common_array);
  312. if(! $status) return [false, $msg];
  313. list($host, $token) = $msg;
  314. $today = (new \DateTime())->setTime(0, 0, 0)->format('Y-m-d H:i:s') . '.000';
  315. $fourDaysAgo = (new \DateTime())->sub(new \DateInterval('P4D'))->setTime(0, 0, 0)->format('Y-m-d H:i:s') . '.000';
  316. $page = $data['pageSize'] ?? 10;
  317. $version = $data['version'] ?? 0;
  318. $start_time = $data['start_time'] ?? $today;
  319. $end_time = $data['end_time'] ?? $today;
  320. $order_number = $data['order_number'] ?? '';
  321. $header = ["Authorization: {$token}",'Content-Type:application/json'];
  322. $url = $host . "/api/System/SqlQuery";
  323. $json = [
  324. 'customSQLFileName' => "U8SQL",
  325. 'customSQLPath' => 'U8API/PurchaseOrderController/Get',
  326. 'paramObj' => [
  327. "@pagesize" => $page,
  328. "@where" => "AND m.dPODate >= '$start_time' AND m.dPODate <= '$end_time'",
  329. "@code" => $order_number,
  330. "@version" => $version,
  331. ]
  332. ];
  333. $json = json_encode($json);
  334. list($status, $result) = $this->post_helper($url,$json, $header, 60, $common_array['title'] . '获取采购订单');
  335. if(! $status) return [false, $result];
  336. if(! isset($result['code'])) return [false, '拉取采购订单失败,请重新拉取'];
  337. if($result['code'] != 0) return [false, $result['msg']];
  338. if(empty($result['data'])) return [true, []];
  339. $r_data = $result['data'];
  340. $return = $this->returnPurchaseOrders($common_array, $r_data, $msg);
  341. return [true, $return];
  342. }
  343. private function returnPurchaseOrders($common_array, $r_data, $msg){
  344. $site = $common_array['site'];
  345. $title = $common_array['title'];
  346. $return = [];
  347. foreach ($r_data as $key => $value){
  348. list($status, $detail) = $this->getPurchaseDetail($value, $msg, $title);
  349. if(! $status) return [false, $detail];
  350. $r_data[$key]['detail'] = $detail;
  351. }
  352. return $r_data;
  353. }
  354. private function getPurchaseDetail($sale_order, $msg, $title){
  355. list($host, $token) = $msg;
  356. $header = ["Authorization: {$token}",'Content-Type:application/json'];;
  357. $url = $host . "/api/System/SqlQuery2";
  358. $json = [
  359. "selectSQL" => "",
  360. "customSQLFileName"=> "U8SQL",
  361. "customSQLPath"=> "U8API/PurchaseOrderController/GetVoucherData",
  362. "paramObj"=> [
  363. "@poid"=> $sale_order["poid"]
  364. ]
  365. ];
  366. list($status, $result) = $this->post_helper($url, json_encode($json), $header, 30, $title . '获取采购订单详情');
  367. if(! $status) return [false, $result];
  368. if(! isset($result['code'])) return [false, '拉取采购订单详情失败,请重新拉取'];
  369. if($result['code'] != 0) return [false, $result['msg']];
  370. return [true, $result['data']['DataTable1']];
  371. }
  372. private function SetU8($common_array){
  373. // $api_host = env('API_HOST');
  374. // if(empty($api_host)) return [false, '用友对外域名不存在'];
  375. // $api_port = env('API_PORT');
  376. // if(empty($api_port)) return [false, '用友对外域名端口不存在'];
  377. $api_host = $common_array['api_host'];
  378. $api_port = $common_array['api_port'];
  379. //映射ip是否通畅
  380. $bool = $this->isDomainAvailable($api_host);
  381. if(! $bool) return [false, '用友对外域名不可达'];
  382. $host = $api_host . ":" . $api_port;
  383. return [true, $host];
  384. }
  385. private function getSalesDetail($sale_order, $msg, $title){
  386. list($host, $token) = $msg;
  387. $header = ["Authorization: {$token}",'Content-Type:application/json'];;
  388. $url = $host . "/api/System/SqlQuery2";
  389. $json = [
  390. "customSQLFileName"=> "U8SQL",
  391. "customSQLPath"=> "U8API/SO_SOMain/GetWithDetail",
  392. "paramObj"=> [
  393. "@code"=> $sale_order["csocode"]
  394. ]
  395. ];
  396. list($status, $result) = $this->post_helper($url, json_encode($json), $header, 30, $title . '获取销售订单详情');
  397. if(! $status) return [false, $result];
  398. if(! isset($result['code'])) return [false, '拉取销售订单详情失败,请重新拉取'];
  399. if($result['code'] != 0) return [false, $result['msg']];
  400. return [true, $result['data']['DataTable1']];
  401. }
  402. public function updateSalesOrder($data, $common_array){
  403. if (empty($data['sale_order_details']) || !is_array($data['sale_order_details'])) {
  404. return [false, '更新数据不能为空'];
  405. }
  406. foreach ($data['sale_order_details'] as $index => $value) {
  407. $line = $index + 1;
  408. if (empty($value['erp_sale_dt_id'])) {
  409. return [false, "第{$line}行:明细行ID不能为空"];
  410. }
  411. if (!isset($value['quantity']) || !is_numeric($value['quantity']) || floatval($value['quantity']) < 0.0) {
  412. return [false, "第{$line}行:数量格式错误或必须大于等于0"];
  413. }
  414. }
  415. $service = new U8ThirtyPartyDatabaseServerService($common_array);
  416. list($status, $msg) = $service->updateSaleOrderDetails($data);
  417. return [$status, $msg];
  418. }
  419. public function materialAddU8($data,$common_array){
  420. list($status, $msg) = $this->getToken($common_array);
  421. if(! $status) return [false, $msg];
  422. list($host, $token) = $msg;
  423. $title = $common_array['title'];
  424. if(empty($data['iHead'])) return [false, '领料单表头信息不能为空'];
  425. if(empty($data['iBody'])) return [false, '领料单表体信息不能为空'];
  426. $header = ["Authorization: {$token}",'Content-Type:application/json'];
  427. $url = $host . "/api/MaterialRequest/Add";
  428. $json[] = [
  429. "Inum" => "MaterialRequest",
  430. "data" =>[
  431. "iHead" => $data['iHead'],
  432. "iBody" => $data['iBody'],
  433. ],
  434. ];
  435. $json_str = json_encode($json);
  436. list($status, $result) = $this->post_helper($url, $json_str, $header, 60, $title . '生成领料申请单');
  437. if(! $status) return [false, $result];
  438. if(! isset($result['code'])) return [false, '生成领料申请单失败,请重新操作'];
  439. if($result['code'] != 0) return [false, $result['msg']];
  440. return [true, $result['data']];
  441. }
  442. public function productInAddU8($data,$common_array){
  443. list($status, $msg) = $this->getToken($common_array);
  444. if(! $status) return [false, $msg];
  445. list($host, $token) = $msg;
  446. $title = $common_array['title'];
  447. if(empty($data['iHead'])) return [false, '产成品入库单单表头信息不能为空'];
  448. if(empty($data['iBody'])) return [false, '产成品入库单表体信息不能为空'];
  449. $header = ["Authorization: {$token}",'Content-Type:application/json'];;
  450. $url = $host . "/api/ProductIn/Add";
  451. $json[] = [
  452. "Inum" => "ProductIn",
  453. "data" =>[
  454. "iHead" => $data['iHead'],
  455. "iBody" => $data['iBody'],
  456. ],
  457. ];
  458. list($status, $result) = $this->post_helper($url, json_encode($json), $header, 60, $title . '生成产成品入库单');
  459. if(! $status) return [false, $result];
  460. if(! isset($result['code'])) return [false, '生成产成品入库单失败,请重新操作'];
  461. if($result['code'] != 0) return [false, $result['msg']];
  462. return [true, $result['data']];
  463. }
  464. public function dispatchAddU8($data,$common_array){
  465. list($status, $msg) = $this->getToken($common_array);
  466. if(! $status) return [false, $msg];
  467. list($host, $token) = $msg;
  468. $title = $common_array['title'];
  469. if(empty($data['iHead'])) return [false, '发货单单表头信息不能为空'];
  470. if(empty($data['iBody'])) return [false, '发货单表体信息不能为空'];
  471. foreach ($data['iBody'] as $key => $value){
  472. $data['iBody'][$key] = $this->fillYonyouDispatchDetail($value);
  473. }
  474. $header = ["Authorization: {$token}",'Content-Type:application/json'];;
  475. $url = $host . "/api/Dispatch/Add";
  476. $json[] = [
  477. "Inum" => "DispatchList",
  478. "data" =>[
  479. "iHead" => $data['iHead'],
  480. "iBody" => $data['iBody'],
  481. ]
  482. ];
  483. list($status, $result) = $this->post_helper($url, json_encode($json), $header, 60, $title . '生成发货单');
  484. if(! $status) return [false, $result];
  485. if(! isset($result['code'])) return [false, '生成发货单失败,请重新操作'];
  486. if($result['code'] != 0) return [false, $result['msg']];
  487. return [true, $result['data']];
  488. }
  489. public function recordList($data){
  490. $model = RecordTable::where('del_time',0)
  491. ->select('msg','data','type','crt_time','return_data')
  492. ->orderBy('id','desc');
  493. if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) $model->whereBetween('crt_time',[$data['crt_time'][0],$data['crt_time'][1]]);
  494. if(! empty($data['type'])) $model->where('type',$data['type']);
  495. if(! empty($data['site'])) $model->where('site',$data['site']);
  496. $list = $this->limit($model,'',$data);
  497. $list = $this->fillData($list);
  498. return [true,$list];
  499. }
  500. private function fillData($data){
  501. if(empty($data['data'])) return $data;
  502. foreach ($data['data'] as $key => $value){
  503. $data['data'][$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d H:i:s',$value['crt_time']) : '';
  504. $data['data'][$key]['type_name'] = RecordTable::$type[$value['type']] ?? '';
  505. }
  506. return $data;
  507. }
  508. /**
  509. * 补全用友发货单子表金额字段(含换算率)
  510. * 输入示例:
  511. * [
  512. * 'iQuantity' => 1, // 输入单位数量
  513. * 'iunitprice' => 10, // 无税单价(按主计量单位)
  514. * 'iTaxRate' => 0, // 税率
  515. * 'iInvExchRate' => 12 // 换算率(1箱=12个)
  516. * ]
  517. */
  518. function fillYonyouDispatchDetail(array $item)
  519. {
  520. $qty = floatval($item['iQuantity']);
  521. $price = floatval($item['iunitprice']);
  522. $rate = floatval($item['iTaxRate']);
  523. $exchRate = floatval($item['iInvExchRate']);
  524. // 实际参与金额计算的基本数量(用友内部用这个)
  525. $qtyBase = $qty * $exchRate;
  526. // 税率
  527. $taxRate = $rate / 100;
  528. // 原币(人民币)
  529. $imoney = round($qtyBase * $price, 2);
  530. $itax = round($imoney * $taxRate, 2);
  531. $iSum = round($imoney + $itax, 2);
  532. $itaxunitprice = round($price * (1 + $taxRate), 6);
  533. // 本币 = 原币
  534. return array_merge($item, [
  535. 'imoney' => $imoney,
  536. 'itax' => $itax,
  537. 'iSum' => $iSum,
  538. 'itaxunitprice' => $itaxunitprice,
  539. 'idiscount' => 0,
  540. 'inatunitprice' => $price,
  541. 'inatmoney' => $imoney,
  542. 'inattax' => $itax,
  543. 'inatsum' => $iSum,
  544. 'inatdiscount' => 0,
  545. ]);
  546. }
  547. public function getInventoryStock($data){
  548. if(empty($data['site'])) return [false,'站点不能为空'];
  549. $config = config("u");
  550. if(! isset($config[$data['site']])) return [false,'站点不存在'];
  551. $service = new U8ThirtyPartyDatabaseServerService($config[$data['site']]);
  552. list($status, $msg) = $service->getStockCountWithPercentage();
  553. return [$status, $msg];
  554. }
  555. //检验单(不是用友的检验单 所以不是参照)生成产成品入库单
  556. public function productInByZj($data, $common_array){
  557. // u8 token 获取
  558. list($status, $msg) = $this->getToken($common_array);
  559. if(! $status) return [false, $msg];
  560. $title = $common_array['title'];
  561. // 组织 ProductIn 结构
  562. $tmp = [
  563. "Inum" => "ProductIn",
  564. "Data" => [
  565. "iHead" => [
  566. "cWhCode" => $data['warehouseCode'] ?? "01", // 默认产成品库
  567. "cRdCode" => $data['cRdCode'] ?? "105", // 入库类别
  568. "cDepCode" => null,
  569. "cMemo" => $data['cMemo'] ?? "接口生成",
  570. "cSource" => "库存",
  571. "cBusType" => "成品入库",
  572. "dDate" => date("Y-m-d"),
  573. "IsVerify" => true,
  574. ],
  575. "iBody" => []
  576. ]
  577. ];
  578. //合格数量加让步接收数量
  579. $num = $data['quality_receive_num'] ?? 0;
  580. $num2 = $data['compromise_receive_num'] ?? 0;
  581. $num = bcadd($num, $num2,2);
  582. //产品编码
  583. $product_code = $data['material_code'] ?? "";
  584. $baseData = [
  585. "iRowNo" => 1,
  586. "cInvCode" => $product_code,
  587. "iQuantity" => $num,
  588. ];
  589. if ($common_array['site'] == "LFMY") {
  590. // 朗峰结构 (cdefine28 - cdefine33)
  591. $extData = [
  592. 'cdefine28' => $data['brand_name'] ?? null,
  593. 'cdefine29' => $data['safe'] ?? null,
  594. 'cdefine30' => $data['decor'] ?? null,
  595. 'cdefine31' => $data['craft_type_code'] ?? null,
  596. 'cdefine32' => $data['decor_b'] ?? null,
  597. 'cdefine33' => $data['craft_type_code_b'] ?? null,
  598. ];
  599. } elseif ($common_array['site'] == "HCLT") {
  600. //根据存货获取自由项的配置
  601. $service = new U8ThirtyPartyDatabaseServerService($common_array);
  602. list($status, $msg1) = $service->getStockFreeItemsByInvCode([$product_code]);
  603. if(! $status) return [false, $msg1];
  604. $p_control = $msg1;
  605. $cFree1 = $cFree2 = $cFree3 = null;
  606. $cFree1_n = $p_control[$product_code]['free1'] ?? 0;
  607. $cFree2_n = $p_control[$product_code]['free2'] ?? 0;
  608. $cFree3_n = $p_control[$product_code]['free3'] ?? 0;
  609. if($cFree1_n) $cFree1 = $data['customer_brand'] ?? '无';
  610. if($cFree2_n) $cFree2 = $data['color'] ?? '无';
  611. if($cFree3_n) $cFree3 = $data['bar_code'] ?? '无';
  612. // 恒昌结构 (cfree + cdefine22/23 + cdefine28-31)
  613. $extData = [
  614. 'cfree1' => $cFree1,
  615. 'cfree2' => $cFree2,
  616. 'cfree3' => $cFree3,
  617. 'cdefine22' => $data['plan_no'] ?? null,
  618. 'cdefine23' => $data['contract_no'] ?? null,
  619. 'cdefine28' => $data['technical_require'] ?? null,
  620. 'cdefine29' => $data['quality_require'] ?? null,
  621. 'cdefine30' => $data['package_require'] ?? null,
  622. 'cdefine31' => $data['shipping_mark'] ?? null,
  623. ];
  624. } else {
  625. $extData = [];
  626. }
  627. $inventoryEntry = array_merge($baseData, $extData);
  628. // 组织表体
  629. $tmp["Data"]["iBody"][] = $inventoryEntry;
  630. $final_data = [$tmp];
  631. // 调用参数
  632. list($host, $token) = $msg;
  633. $url = $host . "/api/ProductIn/Add";
  634. $header = ["Authorization: {$token}", 'Content-Type:application/json'];
  635. $json = json_encode($final_data);
  636. list($status, $result) = $this->post_helper($url, json_encode($json), $header, 60, $title . '生成产成品入库单');
  637. if(! $status) return [false, $result];
  638. if(! isset($result['code'])) return [false, '产成品入库单生成失败,请重试'];
  639. if($result['code'] != 0) return [false, $result['msg']];
  640. return [true, ''];
  641. }
  642. //检验单(不是用友的检验单 所以不是参照)生成采购入库单
  643. public function purchaseInByZj($data, $common_array)
  644. {
  645. // u8 token 获取
  646. list($status, $msg) = $this->getToken($common_array);
  647. if(! $status) return [false, $msg];
  648. $title = $common_array['title'];
  649. //合格数量加让步接收数量
  650. $num = $data['quality_receive_num'] ?? 0;
  651. $num2 = $data['compromise_receive_num'] ?? 0;
  652. $num = bcadd($num, $num2,2);
  653. $qty = $num;
  654. $taxRate = $data['tax_rate'] ?? 0; // 税率
  655. $taxUnitPrice = $data['tax_price'] ?? 0; // 原币含税单价
  656. // 1. 价税合计 (iSum)
  657. $iSum = round($qty * $taxUnitPrice, 2);
  658. // 2. 原币无税金额 (imoney) = 价税合计 / (1 + 税率/100)
  659. $iMoney = round($iSum / (1 + ($taxRate / 100)), 2);
  660. // 3. 税额 (itax)
  661. $iTax = round($iSum - $iMoney, 2);
  662. // 4. 原币无税单价 (iunitprice)
  663. $iUnitPrice = round($taxUnitPrice / (1 + ($taxRate / 100)), 6);
  664. $baseData = [
  665. "iRowNo" => 1,
  666. "cInvCode" => $data['material_code'],
  667. "iQuantity" => $qty,
  668. "iNQuantity" => $qty,
  669. "iPOsID" => $data['detail_id'] ?? 0,
  670. "cPOID" => $data['cMemo'] ?? null,
  671. "iOriTaxCost" => (float)$taxUnitPrice, // 原币含税单价
  672. "iOriCost" => (float)$iUnitPrice, // 原币无税单价
  673. "iOriMoney" => (float)$iMoney, // 原币无税金额
  674. "iOriTaxPrice" => (float)$iTax, // 原币税额
  675. "iOriSum" => (float)$iSum, // 原币价税合计
  676. "iTaxRate" => (float)$taxRate, // 税率
  677. "cBatch" => $data['batch'] ?? null,
  678. "dMadeDate" => $data['made_date'] ?? null,
  679. "dVDate" => $data['valid_date'] ?? null,
  680. "cdefineObj" => [
  681. "cbdefine2" => $qty
  682. ]
  683. ];
  684. if ($common_array['site'] == "LFMY") {
  685. // 朗峰结构 (cdefine28 - cdefine33)
  686. $extData = [
  687. 'cDefine28' => $data['brand_name'] ?? null,
  688. 'cDefine29' => $data['safe'] ?? null,
  689. 'cDefine30' => $data['decor'] ?? null,
  690. 'cDefine31' => $data['craft_type_code'] ?? null,
  691. 'cDefine32' => $data['decor_b'] ?? null,
  692. 'cDefine33' => $data['craft_type_code_b'] ?? null,
  693. ];
  694. } elseif ($common_array['site'] == "HCLT") {
  695. $product_code = $data['material_code'];
  696. //根据存货获取自由项的配置
  697. $service = new U8ThirtyPartyDatabaseServerService($common_array);
  698. list($status, $msg1) = $service->getStockFreeItemsByInvCode([$product_code]);
  699. if(! $status) return [false, $msg1];
  700. $p_control = $msg1;
  701. $cFree1 = $cFree2 = $cFree3 = null;
  702. $cFree1_n = $p_control[$product_code]['free1'] ?? 0;
  703. $cFree2_n = $p_control[$product_code]['free2'] ?? 0;
  704. $cFree3_n = $p_control[$product_code]['free3'] ?? 0;
  705. if($cFree1_n) $cFree1 = $data['customer_brand'] ?? '无';
  706. if($cFree2_n) $cFree2 = $data['color'] ?? '无';
  707. if($cFree3_n) $cFree3 = $data['bar_code'] ?? '无';
  708. // 恒昌结构 (cfree + cdefine22/23 + cdefine28-31)
  709. $extData = [
  710. 'cFree1' => $cFree1,
  711. 'cFree2' => $cFree2,
  712. 'cFree3' => $cFree3,
  713. 'cDefine22' => $data['plan_no'] ?? null,
  714. 'cDefine23' => $data['contract_no'] ?? null,
  715. 'cDefine28' => $data['technical_require'] ?? null,
  716. 'cDefine29' => $data['quality_require'] ?? null,
  717. 'cDefine30' => $data['package_require'] ?? null,
  718. 'cDefine31' => $data['shipping_mark'] ?? null,
  719. ];
  720. } else {
  721. $extData = [];
  722. }
  723. $inventoryEntry = array_merge($baseData, $extData);
  724. // 3. 组织采购入库单
  725. $tmp = [
  726. "Inum" => "PurchaseIn",
  727. "Data" => [
  728. "iHead" => [
  729. "IsVerify" => true,
  730. "bCalPrice" => true, // 开启自动计算
  731. "PriceCalKey" => "iOriTaxCost", // 以含税单价为准
  732. "cOrderCode" => $data['cMemo'] ?? null, // 采购订单号
  733. "cWhCode" => $data['warehouse_code'] ?? "",
  734. "cVenCode" => $data['supplier_code'] ?? "",
  735. "cRdCode" => $data['cRdCode'] ?? "101", //收发类别
  736. "iExchRate" => $data['iExchRate'] ?? 1.0,
  737. "iTaxRate" => (float)$taxRate,
  738. "cExch_Name" => "人民币",
  739. "cSource" => "采购订单",
  740. "cBusType" => "普通采购",
  741. "cMemo" => $data['cMemo'] ?? "接口生成",
  742. "dDate" => date("Y-m-d"),
  743. ],
  744. "iBody" => [
  745. $inventoryEntry
  746. ]
  747. ]
  748. ];
  749. $final_data = [$tmp];
  750. // 4. 调用 API
  751. list($host, $token) = $msg;
  752. $header = ["Authorization: {$token}", 'Content-Type:application/json'];
  753. $url = $host . "/api/PurchaseIn/Add";
  754. $json = json_encode($final_data);
  755. list($status, $result) = $this->post_helper($url,$json, $header, 60, $title . '生成采购入库单');
  756. if(! $status) return [false, $result];
  757. if(! isset($result['code'])) return [false, '采购入库单生成失败'];
  758. if($result['code'] != 0) return [false, $result['msg']];
  759. return [true, ''];
  760. }
  761. //检验单(不是用友的检验单 所以不是参照)生成其他入库单
  762. public function otherInByZj($data, $common_array){
  763. // u8 token 获取
  764. list($status, $msg) = $this->getToken($common_array);
  765. if(! $status) return [false, $msg];
  766. $title = $common_array['title'];
  767. $baseData = [
  768. "iRowNo" => 1,
  769. "cInvCode" => $data['material_code'] ?? '',
  770. "cBatch" => $data['batch'] ?? null,
  771. "iinvexchrate" => null,
  772. "iQuantity" => $data['quantity'], // 数量
  773. "dMadeDate" => $data['made_date'] ?? null, // 生产日期
  774. "dVDate" => $data['valid_date'] ?? null,
  775. ];
  776. if ($common_array['site'] == "LFMY") {
  777. // 朗峰结构 (cdefine28 - cDefine33)
  778. $extData = [
  779. 'cDefine28' => $data['brand_name'] ?? null,
  780. 'cDefine29' => $data['safe'] ?? null,
  781. 'cDefine30' => $data['decor'] ?? null,
  782. 'cDefine31' => $data['craft_type_code'] ?? null,
  783. 'cDefine32' => $data['decor_b'] ?? null,
  784. 'cDefine33' => $data['craft_type_code_b'] ?? null,
  785. ];
  786. } elseif ($common_array['site'] == "HCLT") {
  787. $product_code = $data['material_code'];
  788. //根据存货获取自由项的配置
  789. $service = new U8ThirtyPartyDatabaseServerService($common_array);
  790. list($status, $msg1) = $service->getStockFreeItemsByInvCode([$product_code]);
  791. if(! $status) return [false, $msg1];
  792. $p_control = $msg1;
  793. $cFree1 = $cFree2 = $cFree3 = null;
  794. $cFree1_n = $p_control[$product_code]['free1'] ?? 0;
  795. $cFree2_n = $p_control[$product_code]['free2'] ?? 0;
  796. $cFree3_n = $p_control[$product_code]['free3'] ?? 0;
  797. if($cFree1_n) $cFree1 = $data['customer_brand'] ?? '无';
  798. if($cFree2_n) $cFree2 = $data['color'] ?? '无';
  799. if($cFree3_n) $cFree3 = $data['bar_code'] ?? '无';
  800. // 恒昌结构 (cfree + cdefine22/23 + cdefine28-31)
  801. $extData = [
  802. 'cFree1' => $cFree1,
  803. 'cFree2' => $cFree2,
  804. 'cFree3' => $cFree3,
  805. 'cDefine22' => $data['plan_no'] ?? null,
  806. 'cDefine23' => $data['contract_no'] ?? null,
  807. 'cDefine28' => $data['technical_require'] ?? null,
  808. 'cDefine29' => $data['quality_require'] ?? null,
  809. 'cDefine30' => $data['package_require'] ?? null,
  810. 'cDefine31' => $data['shipping_mark'] ?? null,
  811. ];
  812. } else {
  813. $extData = [];
  814. }
  815. $inventoryEntry = array_merge($baseData, $extData);
  816. $tmp = [
  817. "Inum" => "OtherIn",
  818. "Data" => [
  819. "iHead" => [
  820. "IsVerify" => true,
  821. "cWhCode" => $data['warehouse_code'] ?? "",
  822. "cRdCode" => $data['cRdCode'] ?? null, // 入库类别
  823. "cDepCode" => null, // 部门
  824. "cSource" => "库存",
  825. "cBusType" => "其他入库",
  826. "cMemo" => $data['cMemo'] ?? "接口生成",
  827. "dDate" => date("Y-m-d"),
  828. ],
  829. "iBody" => [$inventoryEntry]
  830. ]
  831. ];
  832. $final_data = [$tmp];
  833. //调用所需
  834. list($host, $token) = $msg;
  835. //产成品入库单生成
  836. $header = ["Authorization: {$token}",'Content-Type:application/json'];
  837. $url = $host . "/api/OtherIn/Add";
  838. $json = json_encode($final_data);
  839. list($status, $result) = $this->post_helper($url, $json, $header, 60, $title . '生成其他入库单');
  840. if(! $status) return [false, $result];
  841. if(! isset($result['code'])) return [false, '其他入库单生成失败,请重试'];
  842. if($result['code'] != 0) return [false, $result['msg']];
  843. return [true, ''];
  844. }
  845. //-----------------------------------朗峰u8-----
  846. public function post_helper($url, $data, $header = [], $timeout = 20, $title = ""){
  847. Log::channel('apiLog')->info($title . 'POST', ["api" => $url , "param" => json_decode($data,true) ,"header" => $header]);
  848. $ch = curl_init();
  849. curl_setopt($ch, CURLOPT_URL, $url);
  850. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  851. curl_setopt($ch, CURLOPT_ENCODING, '');
  852. curl_setopt($ch, CURLOPT_POST, 1);
  853. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
  854. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  855. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  856. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  857. curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  858. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
  859. if(!is_null($data)) curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  860. $r = curl_exec($ch);
  861. if ($r === false) {
  862. // 获取错误号
  863. $errorNumber = curl_errno($ch);
  864. // 获取错误信息
  865. $errorMessage = curl_error($ch);
  866. $message = "cURL Error #{$errorNumber}: {$errorMessage}";
  867. Log::channel('apiLog')->info($title . 'POST结果', ["message" => $message ]);
  868. return [false, $message];
  869. }
  870. curl_close($ch);
  871. $return = json_decode($r, true);
  872. unset($r);
  873. Log::channel('apiLog')->info($title . 'POST结果', ["message" => $return ]);
  874. return [true, $return];
  875. }
  876. public function get_helper($url,$header=[],$timeout = 20){
  877. $ch = curl_init();
  878. curl_setopt_array($ch, array(
  879. CURLOPT_URL => $url,
  880. CURLOPT_RETURNTRANSFER => true,
  881. CURLOPT_ENCODING => '',
  882. CURLOPT_MAXREDIRS => 10,
  883. CURLOPT_TIMEOUT => $timeout,
  884. CURLOPT_FOLLOWLOCATION => true,
  885. CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  886. CURLOPT_CUSTOMREQUEST => 'GET',
  887. CURLOPT_SSL_VERIFYPEER => false,
  888. CURLOPT_HTTPHEADER => $header,
  889. ));
  890. $r = curl_exec($ch);
  891. if ($r === false) {
  892. // 获取错误号
  893. $errorNumber = curl_errno($ch);
  894. // 获取错误信息
  895. $errorMessage = curl_error($ch);
  896. $message = "cURL Error #{$errorNumber}: {$errorMessage}";
  897. Log::channel('apiLog')->info('朗峰GET结果', ["message" => $message]);
  898. return [false, $message];
  899. }
  900. curl_close($ch);
  901. Log::channel('apiLog')->info('朗峰GET结果', ["message" => json_decode($r, true)]);
  902. return [true, json_decode($r, true)];
  903. }
  904. public function put_helper($url, $data, $header = [], $timeout = 20){
  905. Log::channel('apiLog')->info('朗峰PUT', ["api" => $url , "param" => $data ,"header" => $header]);
  906. $ch = curl_init();
  907. curl_setopt($ch, CURLOPT_URL, $url);
  908. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  909. curl_setopt($ch, CURLOPT_ENCODING, '');
  910. curl_setopt($ch, CURLOPT_POST, 1);
  911. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
  912. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  913. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  914. curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  915. if(!is_null($data)) curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  916. $r = curl_exec($ch);
  917. if ($r === false) {
  918. // 获取错误号
  919. $errorNumber = curl_errno($ch);
  920. // 获取错误信息
  921. $errorMessage = curl_error($ch);
  922. $message = "cURL Error #{$errorNumber}: {$errorMessage}";
  923. Log::channel('apiLog')->info('朗峰PUT结果', ["message" => $message]);
  924. return [false, $message];
  925. }
  926. curl_close($ch);
  927. Log::channel('apiLog')->info('朗峰PUT结果', ["message" => json_decode($r, true)]);
  928. return [true, json_decode($r, true)];
  929. }
  930. }