TestService.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. <?php
  2. namespace App\Service;
  3. use App\Model\RecordTable;
  4. use Illuminate\Support\Facades\Cache;
  5. use Illuminate\Support\Facades\Config;
  6. use Illuminate\Support\Facades\DB;
  7. use Illuminate\Support\Facades\Log;
  8. class TestService extends Service
  9. {
  10. public function testdwy($data){
  11. if(empty($data['url']) || empty($data['post']) || empty($data['header'])) return [false,'API请求参数不能为空'];
  12. $url = $data['url'];
  13. // $oldUrl = config('ip.zslf');
  14. // $newUrl = config('ip.zslfip');
  15. // $url = str_replace($oldUrl, $newUrl, $url);
  16. $post = $data['post'];
  17. $header = $data['header'];
  18. $json = json_encode($post);
  19. $json = str_replace('"workflowSearchBean":[]','"workflowSearchBean":{}',$json);
  20. $json = str_replace('"loginBindingParameters":[]','"loginBindingParameters":{}',$json);
  21. list($status, $result) = $this->post_helper($url,$json, $header, 40,'LFMY');
  22. if(! $status) return [false, $result];
  23. return [true, $result];
  24. }
  25. public function testdwyget($data){
  26. if(empty($data['url']) || empty($data['header'])) return [false,'API请求参数不能为空'];
  27. $url = $data['url'];
  28. // $oldUrl = config('ip.zslf');
  29. // $newUrl = config('ip.zslfip');
  30. // $url = str_replace($oldUrl, $newUrl, $url);
  31. $header = $data['header'];
  32. list($status,$result) = $this->get_helper($url,$header);
  33. if(! $status) return [false, $result];
  34. return [true, $result];
  35. }
  36. public function testdwyput($data){
  37. if(empty($data['url']) || empty($data['post']) || empty($data['header'])) return [false,'API请求参数不能为空'];
  38. $url = $data['url'];
  39. // $oldUrl = config('ip.zslf');
  40. // $newUrl = config('ip.zslfip');
  41. // $url = str_replace($oldUrl, $newUrl, $url);
  42. $post = $data['post'];
  43. $header = $data['header'];
  44. $json = json_encode($post);
  45. $json = str_replace('"workflowSearchBean":{}','"workflowSearchBean":[]',json_encode($post));
  46. $json = str_replace('"workflowSearchBean":[]','"workflowSearchBean":{}',json_encode($post));
  47. list($status, $result) = $this->put_helper($url,$json, $header,40);
  48. if(! $status) return [false, $result];
  49. return [true, $result];
  50. }
  51. //-----------------------------------朗峰u8-----
  52. public function getToken($common_array){
  53. list($status, $msg) = $this->SetU8($common_array);
  54. if(! $status) return [false , $msg];
  55. $host = $msg;
  56. $key = "lf_u8_long_token_demo_" . $common_array['site'] . '_' . $common_array['database'];
  57. if(! Cache::has($key)){
  58. $url = $host . "/api/System/GetToken";
  59. $date = date("Y-m-d");
  60. $json = [
  61. "U8DbName"=> $common_array['database'],
  62. "sUserId"=> "demo",
  63. "sPassword"=> "DEMO",
  64. "LoginDateTime"=> $date,
  65. "bPersist"=> true
  66. ];
  67. $header = ['Content-Type:application/json'];
  68. list($status, $result) = $this->post_helper($url,json_encode($json), $header, 30, $common_array['title'] . "获取token");
  69. if(! $status) return [false, $result];
  70. if(! isset($result['code'])) return [false, '获取用友登录信息失败,请重新操作'];
  71. if($result['code'] != 0) return [false, $result['msg']];
  72. $token = $result['data']['Token'] ?? "";
  73. Cache::forever($key, $token);
  74. }else{
  75. $token = Cache::get($key);
  76. }
  77. return [true, [$host, $token]];
  78. }
  79. public function salesOrderGet($data, $common_array){
  80. list($status, $msg) = $this->getToken($common_array);
  81. if(! $status) return [false, $msg];
  82. list($host, $token) = $msg;
  83. $today = (new \DateTime())->setTime(0, 0, 0)->format('Y-m-d H:i:s') . '.000';
  84. $fourDaysAgo = (new \DateTime())->sub(new \DateInterval('P4D'))->setTime(0, 0, 0)->format('Y-m-d H:i:s') . '.000';
  85. $page = $data['pageSize'] ?? 10;
  86. $version = $data['version'] ?? 0;
  87. $start_time = $data['start_time'] ?? $today;
  88. $end_time = $data['end_time'] ?? $today;
  89. $order_number = $data['order_number'] ?? '';
  90. $header = ["Authorization: {$token}",'Content-Type:application/json'];
  91. $url = $host . "/api/System/SqlQuery";
  92. $json = [
  93. 'customSQLFileName' => "U8SQL",
  94. 'customSQLPath' => 'U8API/SO_SOMain/Get',
  95. 'paramObj' => [
  96. "@pagesize" => $page,
  97. "@where" => "AND m.dDate >= '$start_time' AND m.dDate <= '$end_time' AND m.iStatus = 1",
  98. "@code" => $order_number,
  99. "@version" => $version,
  100. ]
  101. ];
  102. $json = json_encode($json);
  103. list($status, $result) = $this->post_helper($url,$json, $header, 60, $common_array['title'] . '获取销售订单');
  104. if(! $status) return [false, $result];
  105. if(! isset($result['code'])) return [false, '拉取销售订单失败,请重新拉取'];
  106. if($result['code'] != 0) return [false, $result['msg']];
  107. if(empty($result['data'])) return [true, []];
  108. $r_data = $result['data'];
  109. $return = $this->returnOrders($common_array, $r_data, $msg);
  110. return [true, $return];
  111. }
  112. private function returnOrders($common_array, $r_data, $msg){
  113. $site = $common_array['site'];
  114. $title = $common_array['title'];
  115. $return = [];
  116. if($site == 'LFMY'){
  117. foreach ($r_data as $value){
  118. list($status, $detail) = $this->getSalesDetail($value, $msg, $title);
  119. if(! $status) return [false, $detail];
  120. $return_detail = [];
  121. $total_qty = $money = 0;
  122. foreach ($detail as $d_value){
  123. $return_detail[] = [
  124. 'erp_sale_dt_id' => $d_value['autoid'],
  125. 'item_no' => $d_value['irowno'],
  126. 'material_code' => $d_value['cinvcode'],
  127. 'brand_name' => $d_value['cdefine28'] ?? '',
  128. 'safe' => $d_value['cdefine29'] ?? '',
  129. 'decor' => $d_value['cdefine30'] ?? '',
  130. 'craft_type_code' => $d_value['cdefine31'] ?? '',
  131. 'decor_b' => $d_value['cdefine32'] ?? '',
  132. 'craft_type_code_b' => $d_value['cdefine33'] ?? '',
  133. 'unit' => $d_value['cinvm_unit'],
  134. 'price' => $d_value['itaxunitprice'] ?? 0,
  135. 'not_tax_price' => $d_value['itaxunitprice'] ?? 0,
  136. 'tax_price' => $d_value['itaxunitprice'] ?? 0,
  137. 'qty' => $d_value['iquantity'],
  138. 'money' => $d_value['isum'] ?? 0,
  139. 'tax_amount' => $d_value['isum'] ?? 0,
  140. 'total_tax_amount' => $d_value['isum'] ?? 0,
  141. 'tax_rate' => $d_value['itaxrate'] ?? 0,
  142. 'expected_delivery_date' => date('Y-m-d',strtotime($d_value['dpredate'])),
  143. 'remark' => $d_value['cmemo'] ?? '',
  144. ];
  145. $t = $d_value['isum'] ?? 0;
  146. $total_qty = bcadd($total_qty,$d_value['iquantity'],3);
  147. $money = bcadd($money,$t,3);
  148. }
  149. $return[] = [
  150. 'no' => $value['csocode'],
  151. 'order_date' => date("Y-m-d",strtotime($value['ddate'])),
  152. 'customer' => $value['ccuscode'] ?? '',
  153. 'salesman' => $value['cpersoncode'] ?? '',
  154. 'sale_department' => $value['cdepcode'] ?? '',
  155. 'total_qty' => $total_qty,
  156. 'total_money' => $money,
  157. 'remark' => $value['cmemo'] ?? '',
  158. 'version' => $value['version'],
  159. 'detail' => $return_detail,
  160. ];
  161. }
  162. }elseif ($site == 'HCLT'){
  163. foreach ($r_data as $value){
  164. list($status, $detail) = $this->getSalesDetail($value, $msg, $title);
  165. if(! $status) return [false, $detail];
  166. $return_detail = [];
  167. $total_qty = $money = 0;
  168. foreach ($detail as $d_value){
  169. $return_detail[] = [
  170. 'erp_sale_dt_id' => $d_value['autoid'],
  171. 'material_code' => $d_value['cinvcode'] ?? '',
  172. 'specs' => $d_value['cinvstd'] ?? '',
  173. 'unit' => $d_value['cinvm_unit'] ?? '',
  174. 'qty' => $d_value['iquantity'],
  175. 'not_tax_price' => $d_value['iunitprice'] ?? 0,
  176. 'tax_price' => $d_value['itaxunitprice'] ?? 0,
  177. 'not_tax_amount' => $d_value['imoney'] ?? 0,
  178. 'tax_amount' => $d_value['itax'] ?? 0,
  179. 'total_tax_amount' => $d_value['isum'] ?? 0,
  180. 'tax_rate' => $d_value['itaxrate'] ?? 0,
  181. 'expected_delivery_date' => date('Y-m-d',strtotime($d_value['dpredate'])),
  182. 'customer_brand' => $d_value['cfree1'] ?? '',
  183. 'color' => $d_value['cfree2'] ?? '',
  184. 'plan_no' => $d_value['cdefine22'] ?? '',
  185. 'contract_no' => $d_value['cdefine23'] ?? '',
  186. 'technical_require' => $d_value['cdefine28'] ?? '',
  187. 'quality_require' => $d_value['cdefine29'] ?? '',
  188. 'package_require' => $d_value['cdefine30'] ?? '',
  189. 'shipping_mark' => $d_value['cdefine31'] ?? '',
  190. ];
  191. $t = $d_value['isum'] ?? 0;
  192. $total_qty = bcadd($total_qty,$d_value['iquantity'],3);
  193. $money = bcadd($money,$t,3);
  194. }
  195. $return[] = [
  196. 'no' => $value['csocode'],
  197. 'order_date' => date("Y-m-d",strtotime($value['ddate'])),
  198. 'customer' => $value['ccuscode'] ?? '',
  199. 'salesman' => $value['cpersoncode'] ?? '',
  200. 'sale_department' => $value['cdepcode'] ?? '',
  201. 'total_qty' => $total_qty,
  202. 'total_money' => $money,
  203. 'remark' => $value['cmemo'] ?? '',
  204. 'version' => $value['version'],
  205. 'detail' => $return_detail,
  206. ];
  207. }
  208. }elseif ($site == 'JLWM'){
  209. foreach ($r_data as $value){
  210. list($status, $detail) = $this->getSalesDetail($value, $msg, $title);
  211. if(! $status) return [false, $detail];
  212. $return_detail = [];
  213. $total_qty = $money = 0;
  214. foreach ($detail as $d_value){
  215. $return_detail[] = [
  216. 'erp_sale_dt_id' => $d_value['autoid'],
  217. 'material_code' => $d_value['cinvcode'] ?? '',
  218. 'contract_no' => $d_value['cdefine23'] ?? '',
  219. 'specs' => $d_value['cinvstd'] ?? '',
  220. 'unit' => $d_value['cinvm_unit'] ?? '',
  221. 'qty' => $d_value['iquantity'] ?? '',
  222. 'not_tax_price' => $d_value['iunitprice'] ?? 0,
  223. 'tax_price' => $d_value['itaxunitprice'] ?? 0,
  224. 'not_tax_amount' => $d_value['imoney'] ?? 0,
  225. 'tax_amount' => $d_value['itax'] ?? 0,
  226. 'total_tax_amount' => $d_value['isum'] ?? 0,
  227. 'tax_rate' => $d_value['itaxrate'] ?? 0,
  228. 'expected_delivery_date' => date('Y-m-d',strtotime($d_value['dpredate'])),
  229. 'customer_model' => $d_value['cfree4'] ?? '',
  230. 'length' => $d_value['cfree1'] ?? '',
  231. 'width' => $d_value['cfree2'] ?? '',
  232. 'thickness' => $d_value['cfree3'] ?? '',
  233. 'color_or_model' => $d_value['cdefine28'] ?? '',
  234. ];
  235. $t = $d_value['isum'] ?? 0;
  236. $total_qty = bcadd($total_qty,$d_value['iquantity'],3);
  237. $money = bcadd($money,$t,3);
  238. }
  239. $return[] = [
  240. 'no' => $value['csocode'],
  241. 'order_date' => date("Y-m-d",strtotime($value['ddate'])),
  242. 'customer' => $value['ccuscode'] ?? '',
  243. 'salesman' => $value['cpersoncode'] ?? '',
  244. 'sale_department' => $value['cdepcode'] ?? '',
  245. 'total_qty' => $total_qty,
  246. 'total_money' => $money,
  247. 'remark' => $value['cmemo'] ?? '',
  248. 'version' => $value['version'],
  249. 'detail' => $return_detail,
  250. ];
  251. }
  252. }
  253. return $return;
  254. }
  255. public function purchaseOrderGet($data, $common_array){
  256. list($status, $msg) = $this->getToken($common_array);
  257. if(! $status) return [false, $msg];
  258. list($host, $token) = $msg;
  259. $today = (new \DateTime())->setTime(0, 0, 0)->format('Y-m-d H:i:s') . '.000';
  260. $fourDaysAgo = (new \DateTime())->sub(new \DateInterval('P4D'))->setTime(0, 0, 0)->format('Y-m-d H:i:s') . '.000';
  261. $page = $data['pageSize'] ?? 10;
  262. $version = $data['version'] ?? 0;
  263. $start_time = $data['start_time'] ?? $today;
  264. $end_time = $data['end_time'] ?? $today;
  265. $order_number = $data['order_number'] ?? '';
  266. $header = ["Authorization: {$token}",'Content-Type:application/json'];
  267. $url = $host . "/api/System/SqlQuery";
  268. $json = [
  269. 'customSQLFileName' => "U8SQL",
  270. 'customSQLPath' => 'U8API/PurchaseOrderController/Get',
  271. 'paramObj' => [
  272. "@pagesize" => $page,
  273. "@where" => "AND m.dPODate >= '$start_time' AND m.dPODate <= '$end_time'",
  274. "@code" => $order_number,
  275. "@version" => $version,
  276. ]
  277. ];
  278. $json = json_encode($json);
  279. list($status, $result) = $this->post_helper($url,$json, $header, 60, $common_array['title'] . '获取采购订单');
  280. if(! $status) return [false, $result];
  281. if(! isset($result['code'])) return [false, '拉取采购订单失败,请重新拉取'];
  282. if($result['code'] != 0) return [false, $result['msg']];
  283. if(empty($result['data'])) return [true, []];
  284. $r_data = $result['data'];
  285. $return = $this->returnPurchaseOrders($common_array, $r_data, $msg);
  286. return [true, $return];
  287. }
  288. private function returnPurchaseOrders($common_array, $r_data, $msg){
  289. $site = $common_array['site'];
  290. $title = $common_array['title'];
  291. $return = [];
  292. foreach ($r_data as $key => $value){
  293. list($status, $detail) = $this->getPurchaseDetail($value, $msg, $title);
  294. if(! $status) return [false, $detail];
  295. $r_data[$key]['detail'] = $detail;
  296. }
  297. return $r_data;
  298. }
  299. private function getPurchaseDetail($sale_order, $msg, $title){
  300. list($host, $token) = $msg;
  301. $header = ["Authorization: {$token}",'Content-Type:application/json'];;
  302. $url = $host . "/api/System/SqlQuery2";
  303. $json = [
  304. "selectSQL" => "",
  305. "customSQLFileName"=> "U8SQL",
  306. "customSQLPath"=> "U8API/PurchaseOrderController/GetVoucherData",
  307. "paramObj"=> [
  308. "@poid"=> $sale_order["poid"]
  309. ]
  310. ];
  311. list($status, $result) = $this->post_helper($url, json_encode($json), $header, 30, $title . '获取采购订单详情');
  312. if(! $status) return [false, $result];
  313. if(! isset($result['code'])) return [false, '拉取采购订单详情失败,请重新拉取'];
  314. if($result['code'] != 0) return [false, $result['msg']];
  315. return [true, $result['data']['DataTable1']];
  316. }
  317. private function SetU8($common_array){
  318. // $api_host = env('API_HOST');
  319. // if(empty($api_host)) return [false, '用友对外域名不存在'];
  320. // $api_port = env('API_PORT');
  321. // if(empty($api_port)) return [false, '用友对外域名端口不存在'];
  322. $api_host = $common_array['api_host'];
  323. $api_port = $common_array['api_port'];
  324. //映射ip是否通畅
  325. $bool = $this->isDomainAvailable($api_host);
  326. if(! $bool) return [false, '用友对外域名不可达'];
  327. $host = $api_host . ":" . $api_port;
  328. return [true, $host];
  329. }
  330. private function getSalesDetail($sale_order, $msg, $title){
  331. list($host, $token) = $msg;
  332. $header = ["Authorization: {$token}",'Content-Type:application/json'];;
  333. $url = $host . "/api/System/SqlQuery2";
  334. $json = [
  335. "customSQLFileName"=> "U8SQL",
  336. "customSQLPath"=> "U8API/SO_SOMain/GetWithDetail",
  337. "paramObj"=> [
  338. "@code"=> $sale_order["csocode"]
  339. ]
  340. ];
  341. list($status, $result) = $this->post_helper($url, json_encode($json), $header, 30, $title . '获取销售订单详情');
  342. if(! $status) return [false, $result];
  343. if(! isset($result['code'])) return [false, '拉取销售订单详情失败,请重新拉取'];
  344. if($result['code'] != 0) return [false, $result['msg']];
  345. return [true, $result['data']['DataTable1']];
  346. }
  347. public function updateSalesOrder($data, $common_array){
  348. if (empty($data['sale_order_details']) || !is_array($data['sale_order_details'])) {
  349. return [false, '更新数据不能为空'];
  350. }
  351. foreach ($data['sale_order_details'] as $index => $value) {
  352. $line = $index + 1;
  353. if (empty($value['erp_sale_dt_id'])) {
  354. return [false, "第{$line}行:明细行ID不能为空"];
  355. }
  356. if (!isset($value['quantity']) || !is_numeric($value['quantity']) || floatval($value['quantity']) < 0.0) {
  357. return [false, "第{$line}行:数量格式错误或必须大于等于0"];
  358. }
  359. }
  360. $service = new U8ThirtyPartyDatabaseServerService($common_array);
  361. list($status, $msg) = $service->updateSaleOrderDetails($data);
  362. return [$status, $msg];
  363. }
  364. public function materialAddU8($data,$common_array){
  365. list($status, $msg) = $this->getToken($common_array);
  366. if(! $status) return [false, $msg];
  367. list($host, $token) = $msg;
  368. $title = $common_array['title'];
  369. if(empty($data['iHead'])) return [false, '领料单表头信息不能为空'];
  370. if(empty($data['iBody'])) return [false, '领料单表体信息不能为空'];
  371. $header = ["Authorization: {$token}",'Content-Type:application/json'];
  372. $url = $host . "/api/MaterialRequest/Add";
  373. $json[] = [
  374. "Inum" => "MaterialRequest",
  375. "data" =>[
  376. "iHead" => $data['iHead'],
  377. "iBody" => $data['iBody'],
  378. ],
  379. ];
  380. $json_str = json_encode($json);
  381. list($status, $result) = $this->post_helper($url, $json_str, $header, 60, $title . '生成领料申请单');
  382. if(! $status) return [false, $result];
  383. if(! isset($result['code'])) return [false, '生成领料申请单失败,请重新操作'];
  384. if($result['code'] != 0) return [false, $result['msg']];
  385. return [true, $result['data']];
  386. }
  387. public function productInAddU8($data,$common_array){
  388. list($status, $msg) = $this->getToken($common_array);
  389. if(! $status) return [false, $msg];
  390. list($host, $token) = $msg;
  391. $title = $common_array['title'];
  392. if(empty($data['iHead'])) return [false, '产成品入库单单表头信息不能为空'];
  393. if(empty($data['iBody'])) return [false, '产成品入库单表体信息不能为空'];
  394. $header = ["Authorization: {$token}",'Content-Type:application/json'];;
  395. $url = $host . "/api/ProductIn/Add";
  396. $json[] = [
  397. "Inum" => "ProductIn",
  398. "data" =>[
  399. "iHead" => $data['iHead'],
  400. "iBody" => $data['iBody'],
  401. ],
  402. ];
  403. list($status, $result) = $this->post_helper($url, json_encode($json), $header, 60, $title . '生成产成品入库单');
  404. if(! $status) return [false, $result];
  405. if(! isset($result['code'])) return [false, '生成产成品入库单失败,请重新操作'];
  406. if($result['code'] != 0) return [false, $result['msg']];
  407. return [true, $result['data']];
  408. }
  409. public function dispatchAddU8($data,$common_array){
  410. list($status, $msg) = $this->getToken($common_array);
  411. if(! $status) return [false, $msg];
  412. list($host, $token) = $msg;
  413. $title = $common_array['title'];
  414. if(empty($data['iHead'])) return [false, '发货单单表头信息不能为空'];
  415. if(empty($data['iBody'])) return [false, '发货单表体信息不能为空'];
  416. foreach ($data['iBody'] as $key => $value){
  417. $data['iBody'][$key] = $this->fillYonyouDispatchDetail($value);
  418. }
  419. $header = ["Authorization: {$token}",'Content-Type:application/json'];;
  420. $url = $host . "/api/Dispatch/Add";
  421. $json[] = [
  422. "Inum" => "DispatchList",
  423. "data" =>[
  424. "iHead" => $data['iHead'],
  425. "iBody" => $data['iBody'],
  426. ]
  427. ];
  428. list($status, $result) = $this->post_helper($url, json_encode($json), $header, 60, $title . '生成发货单');
  429. if(! $status) return [false, $result];
  430. if(! isset($result['code'])) return [false, '生成发货单失败,请重新操作'];
  431. if($result['code'] != 0) return [false, $result['msg']];
  432. return [true, $result['data']];
  433. }
  434. public function recordList($data){
  435. $model = RecordTable::where('del_time',0)
  436. ->select('msg','data','type','crt_time','return_data')
  437. ->orderBy('id','desc');
  438. if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) $model->whereBetween('crt_time',[$data['crt_time'][0],$data['crt_time'][1]]);
  439. if(! empty($data['type'])) $model->where('type',$data['type']);
  440. if(! empty($data['site'])) $model->where('site',$data['site']);
  441. $list = $this->limit($model,'',$data);
  442. $list = $this->fillData($list);
  443. return [true,$list];
  444. }
  445. private function fillData($data){
  446. if(empty($data['data'])) return $data;
  447. foreach ($data['data'] as $key => $value){
  448. $data['data'][$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d H:i:s',$value['crt_time']) : '';
  449. $data['data'][$key]['type_name'] = RecordTable::$type[$value['type']] ?? '';
  450. }
  451. return $data;
  452. }
  453. /**
  454. * 补全用友发货单子表金额字段(含换算率)
  455. * 输入示例:
  456. * [
  457. * 'iQuantity' => 1, // 输入单位数量
  458. * 'iunitprice' => 10, // 无税单价(按主计量单位)
  459. * 'iTaxRate' => 0, // 税率
  460. * 'iInvExchRate' => 12 // 换算率(1箱=12个)
  461. * ]
  462. */
  463. function fillYonyouDispatchDetail(array $item)
  464. {
  465. $qty = floatval($item['iQuantity']);
  466. $price = floatval($item['iunitprice']);
  467. $rate = floatval($item['iTaxRate']);
  468. $exchRate = floatval($item['iInvExchRate']);
  469. // 实际参与金额计算的基本数量(用友内部用这个)
  470. $qtyBase = $qty * $exchRate;
  471. // 税率
  472. $taxRate = $rate / 100;
  473. // 原币(人民币)
  474. $imoney = round($qtyBase * $price, 2);
  475. $itax = round($imoney * $taxRate, 2);
  476. $iSum = round($imoney + $itax, 2);
  477. $itaxunitprice = round($price * (1 + $taxRate), 6);
  478. // 本币 = 原币
  479. return array_merge($item, [
  480. 'imoney' => $imoney,
  481. 'itax' => $itax,
  482. 'iSum' => $iSum,
  483. 'itaxunitprice' => $itaxunitprice,
  484. 'idiscount' => 0,
  485. 'inatunitprice' => $price,
  486. 'inatmoney' => $imoney,
  487. 'inattax' => $itax,
  488. 'inatsum' => $iSum,
  489. 'inatdiscount' => 0,
  490. ]);
  491. }
  492. public function getInventoryStock($data){
  493. if(empty($data['site'])) return [false,'站点不能为空'];
  494. $config = config("u");
  495. if(! isset($config[$data['site']])) return [false,'站点不存在'];
  496. $service = new U8ThirtyPartyDatabaseServerService($config[$data['site']]);
  497. list($status, $msg) = $service->getStockCountWithPercentage();
  498. return [$status, $msg];
  499. }
  500. //-----------------------------------朗峰u8-----
  501. public function post_helper($url, $data, $header = [], $timeout = 20, $title = ""){
  502. Log::channel('apiLog')->info($title . 'POST', ["api" => $url , "param" => json_decode($data,true) ,"header" => $header]);
  503. $ch = curl_init();
  504. curl_setopt($ch, CURLOPT_URL, $url);
  505. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  506. curl_setopt($ch, CURLOPT_ENCODING, '');
  507. curl_setopt($ch, CURLOPT_POST, 1);
  508. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
  509. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  510. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  511. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  512. curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  513. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
  514. if(!is_null($data)) curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  515. $r = curl_exec($ch);
  516. if ($r === false) {
  517. // 获取错误号
  518. $errorNumber = curl_errno($ch);
  519. // 获取错误信息
  520. $errorMessage = curl_error($ch);
  521. $message = "cURL Error #{$errorNumber}: {$errorMessage}";
  522. Log::channel('apiLog')->info($title . 'POST结果', ["message" => $message ]);
  523. return [false, $message];
  524. }
  525. curl_close($ch);
  526. $return = json_decode($r, true);
  527. unset($r);
  528. Log::channel('apiLog')->info($title . 'POST结果', ["message" => $return ]);
  529. return [true, $return];
  530. }
  531. public function get_helper($url,$header=[],$timeout = 20){
  532. $ch = curl_init();
  533. curl_setopt_array($ch, array(
  534. CURLOPT_URL => $url,
  535. CURLOPT_RETURNTRANSFER => true,
  536. CURLOPT_ENCODING => '',
  537. CURLOPT_MAXREDIRS => 10,
  538. CURLOPT_TIMEOUT => $timeout,
  539. CURLOPT_FOLLOWLOCATION => true,
  540. CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  541. CURLOPT_CUSTOMREQUEST => 'GET',
  542. CURLOPT_SSL_VERIFYPEER => false,
  543. CURLOPT_HTTPHEADER => $header,
  544. ));
  545. $r = curl_exec($ch);
  546. if ($r === false) {
  547. // 获取错误号
  548. $errorNumber = curl_errno($ch);
  549. // 获取错误信息
  550. $errorMessage = curl_error($ch);
  551. $message = "cURL Error #{$errorNumber}: {$errorMessage}";
  552. Log::channel('apiLog')->info('朗峰GET结果', ["message" => $message]);
  553. return [false, $message];
  554. }
  555. curl_close($ch);
  556. Log::channel('apiLog')->info('朗峰GET结果', ["message" => json_decode($r, true)]);
  557. return [true, json_decode($r, true)];
  558. }
  559. public function put_helper($url, $data, $header = [], $timeout = 20){
  560. Log::channel('apiLog')->info('朗峰PUT', ["api" => $url , "param" => $data ,"header" => $header]);
  561. $ch = curl_init();
  562. curl_setopt($ch, CURLOPT_URL, $url);
  563. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  564. curl_setopt($ch, CURLOPT_ENCODING, '');
  565. curl_setopt($ch, CURLOPT_POST, 1);
  566. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
  567. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  568. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  569. curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  570. if(!is_null($data)) curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  571. $r = curl_exec($ch);
  572. if ($r === false) {
  573. // 获取错误号
  574. $errorNumber = curl_errno($ch);
  575. // 获取错误信息
  576. $errorMessage = curl_error($ch);
  577. $message = "cURL Error #{$errorNumber}: {$errorMessage}";
  578. Log::channel('apiLog')->info('朗峰PUT结果', ["message" => $message]);
  579. return [false, $message];
  580. }
  581. curl_close($ch);
  582. Log::channel('apiLog')->info('朗峰PUT结果', ["message" => json_decode($r, true)]);
  583. return [true, json_decode($r, true)];
  584. }
  585. }