TestService.php 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977
  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. //检验单(不是用友的检验单 所以不是参照)生成产成品入库单
  501. public function productInByZj($data, $common_array){
  502. // u8 token 获取
  503. list($status, $msg) = $this->getToken($common_array);
  504. if(! $status) return [false, $msg];
  505. $title = $common_array['title'];
  506. // 组织 ProductIn 结构
  507. $tmp = [
  508. "Inum" => "ProductIn",
  509. "Data" => [
  510. "iHead" => [
  511. "cWhCode" => $data['warehouseCode'] ?? "01", // 默认产成品库
  512. "cRdCode" => "105", // 入库类别
  513. "cDepCode" => null,
  514. "cMemo" => "接口生成",
  515. "cSource" => "库存",
  516. "cBusType" => "成品入库",
  517. "dDate" => date("Y-m-d"),
  518. "IsVerify" => true,
  519. ],
  520. "iBody" => []
  521. ]
  522. ];
  523. //合格数量加让步接收数量
  524. $num = $data['quality_receive_num'] ?? 0;
  525. $num2 = $data['compromise_receive_num'] ?? 0;
  526. $num = bcadd($num, $num2,2);
  527. //产品编码
  528. $product_code = $data['material_code'] ?? "";
  529. $baseData = [
  530. "iRowNo" => 1,
  531. "cInvCode" => $product_code,
  532. "iQuantity" => $num,
  533. ];
  534. if ($common_array['site'] == "LFMY") {
  535. // 朗峰结构 (cdefine28 - cdefine33)
  536. $extData = [
  537. 'cdefine28' => $data['brand_name'] ?? null,
  538. 'cdefine29' => $data['safe'] ?? null,
  539. 'cdefine30' => $data['decor'] ?? null,
  540. 'cdefine31' => $data['craft_type_code'] ?? null,
  541. 'cdefine32' => $data['decor_b'] ?? null,
  542. 'cdefine33' => $data['craft_type_code_b'] ?? null,
  543. ];
  544. } elseif ($common_array['site'] == "HCLT") {
  545. // 恒昌结构 (cfree + cdefine22/23 + cdefine28-31)
  546. $extData = [
  547. 'cfree1' => $data['customer_brand'] ?? null,
  548. 'cfree2' => $data['color'] ?? null,
  549. 'cdefine22' => $data['plan_no'] ?? null,
  550. 'cdefine23' => $data['contract_no'] ?? null,
  551. 'cdefine28' => $data['technical_require'] ?? null,
  552. 'cdefine29' => $data['quality_require'] ?? null,
  553. 'cdefine30' => $data['package_require'] ?? null,
  554. 'cdefine31' => $data['shipping_mark'] ?? null,
  555. ];
  556. } else {
  557. $extData = [];
  558. }
  559. $inventoryEntry = array_merge($baseData, $extData);
  560. // 组织表体
  561. $tmp["Data"]["iBody"][] = $inventoryEntry;
  562. $final_data = [$tmp];
  563. // 调用参数
  564. $host = $msg['host'] ?? "";
  565. $token = $msg['token'] ?? "";
  566. $url = $host . "/api/ProductIn/Add";
  567. $header = ["Authorization: {$token}", 'Content-Type:application/json'];
  568. $json = json_encode($final_data);
  569. list($status, $result) = $this->post_helper($url, json_encode($json), $header, 60, $title . '生成产成品入库单');
  570. if(! $status) return [false, $result];
  571. if(! isset($result['code'])) return [false, '产成品入库单生成失败,请重试'];
  572. if($result['code'] != 0) return [false, $result['msg']];
  573. return [true, ''];
  574. }
  575. //检验单(不是用友的检验单 所以不是参照)生成采购入库单
  576. public function purchaseInByZj($data, $common_array)
  577. {
  578. // u8 token 获取
  579. list($status, $msg) = $this->getToken($common_array);
  580. if(! $status) return [false, $msg];
  581. $title = $common_array['title'];
  582. //合格数量加让步接收数量
  583. $num = $data['quality_receive_num'] ?? 0;
  584. $num2 = $data['compromise_receive_num'] ?? 0;
  585. $num = bcadd($num, $num2,2);
  586. $qty = $num;
  587. $taxRate = $data['tax_rate'] ?? 0; // 税率
  588. $taxUnitPrice = $data['tax_price'] ?? 0; // 原币含税单价
  589. // 1. 价税合计 (iSum)
  590. $iSum = round($qty * $taxUnitPrice, 2);
  591. // 2. 原币无税金额 (imoney) = 价税合计 / (1 + 税率/100)
  592. $iMoney = round($iSum / (1 + ($taxRate / 100)), 2);
  593. // 3. 税额 (itax)
  594. $iTax = round($iSum - $iMoney, 2);
  595. // 4. 原币无税单价 (iunitprice)
  596. $iUnitPrice = round($taxUnitPrice / (1 + ($taxRate / 100)), 6);
  597. $baseData = [
  598. "iRowNo" => 1,
  599. "cInvCode" => $data['material_code'],
  600. "iQuantity" => $qty,
  601. "iPOsID" => $data['detail_id'] ?? 0,
  602. "iOriTaxCost" => (float)$taxUnitPrice, // 原币含税单价
  603. "iOriCost" => (float)$iUnitPrice, // 原币无税单价
  604. "iOriMoney" => (float)$iMoney, // 原币无税金额
  605. "iOriTaxPrice" => (float)$iTax, // 原币税额
  606. "iOriSum" => (float)$iSum, // 原币价税合计
  607. "iTaxRate" => (float)$taxRate, // 税率
  608. "cBatch" => $data['batch'] ?? null,
  609. "dMadeDate" => $data['made_date'] ?? null,
  610. "dVDate" => $data['valid_date'] ?? null,
  611. ];
  612. if ($common_array['site'] == "LFMY") {
  613. // 朗峰结构 (cdefine28 - cdefine33)
  614. $extData = [
  615. 'cDefine28' => $data['brand_name'] ?? null,
  616. 'cDefine29' => $data['safe'] ?? null,
  617. 'cDefine30' => $data['decor'] ?? null,
  618. 'cDefine31' => $data['craft_type_code'] ?? null,
  619. 'cDefine32' => $data['decor_b'] ?? null,
  620. 'cDefine33' => $data['craft_type_code_b'] ?? null,
  621. ];
  622. } elseif ($common_array['site'] == "HCLT") {
  623. // 恒昌结构 (cfree + cdefine22/23 + cdefine28-31)
  624. $extData = [
  625. 'cFree1' => $data['customer_brand'] ?? null,
  626. 'cFree2' => $data['color'] ?? null,
  627. 'cFree3' => $data['bar_code'] ?? '无',
  628. 'cDefine22' => $data['plan_no'] ?? null,
  629. 'cDefine23' => $data['contract_no'] ?? null,
  630. 'cDefine28' => $data['technical_require'] ?? null,
  631. 'cDefine29' => $data['quality_require'] ?? null,
  632. 'cDefine30' => $data['package_require'] ?? null,
  633. 'cDefine31' => $data['shipping_mark'] ?? null,
  634. ];
  635. } else {
  636. $extData = [];
  637. }
  638. $inventoryEntry = array_merge($baseData, $extData);
  639. // 3. 组织采购入库单
  640. $tmp = [
  641. "Inum" => "PurchaseIn",
  642. "Data" => [
  643. "iHead" => [
  644. "IsVerify" => true,
  645. "bCalPrice" => true, // 开启自动计算
  646. "PriceCalKey" => "iOriTaxCost", // 以含税单价为准
  647. "cWhCode" => $data['warehouse_code'] ?? "",
  648. "cVenCode" => $data['supplier_code'] ?? "",
  649. "cRdCode" => $data['cRdCode'] ?? "101", //收发类别
  650. "iExchRate" => $data['iExchRate'] ?? 1.0,
  651. "iTaxRate" => (float)$taxRate,
  652. "cExch_Name" => "人民币",
  653. "cSource" => "库存",
  654. "cBusType" => "普通采购",
  655. "cMemo" => $data['cMemo'] ?? "接口生成",
  656. "dDate" => date("Y-m-d"),
  657. ],
  658. "iBody" => [
  659. $inventoryEntry
  660. ]
  661. ]
  662. ];
  663. $final_data = [$tmp];
  664. // 4. 调用 API
  665. list($host, $token) = $msg;
  666. $header = ["Authorization: {$token}", 'Content-Type:application/json'];
  667. $url = $host . "/api/PurchaseIn/Add";
  668. $json = json_encode($final_data);
  669. list($status, $result) = $this->post_helper($url,$json, $header, 60, $title . '生成采购入库单');
  670. if(! $status) return [false, $result];
  671. if(! isset($result['code'])) return [false, '采购入库单生成失败'];
  672. if($result['code'] != 0) return [false, $result['msg']];
  673. return [true, ''];
  674. }
  675. //检验单(不是用友的检验单 所以不是参照)生成其他入库单
  676. public function otherInByZj($data, $common_array){
  677. // u8 token 获取
  678. list($status, $msg) = $this->getToken($common_array);
  679. if(! $status) return [false, $msg];
  680. $title = $common_array['title'];
  681. $baseData = [
  682. "iRowNo" => 1,
  683. "cInvCode" => $data['material_code'] ?? '',
  684. "cBatch" => $data['batch'] ?? null,
  685. "iinvexchrate" => null,
  686. "iQuantity" => $data['quantity'], // 数量
  687. "dMadeDate" => $data['made_date'] ?? null, // 生产日期
  688. "dVDate" => $data['valid_date'] ?? null,
  689. ];
  690. if ($common_array['site'] == "LFMY") {
  691. // 朗峰结构 (cdefine28 - cDefine33)
  692. $extData = [
  693. 'cDefine28' => $data['brand_name'] ?? null,
  694. 'cDefine29' => $data['safe'] ?? null,
  695. 'cDefine30' => $data['decor'] ?? null,
  696. 'cDefine31' => $data['craft_type_code'] ?? null,
  697. 'cDefine32' => $data['decor_b'] ?? null,
  698. 'cDefine33' => $data['craft_type_code_b'] ?? null,
  699. ];
  700. } elseif ($common_array['site'] == "HCLT") {
  701. // 恒昌结构 (cfree + cdefine22/23 + cdefine28-31)
  702. $extData = [
  703. 'cFree1' => $data['customer_brand'] ?? null,
  704. 'cFree2' => $data['color'] ?? null,
  705. 'cFree3' => $data['bar_code'] ?? '无',
  706. 'cDefine22' => $data['plan_no'] ?? null,
  707. 'cDefine23' => $data['contract_no'] ?? null,
  708. 'cDefine28' => $data['technical_require'] ?? null,
  709. 'cDefine29' => $data['quality_require'] ?? null,
  710. 'cDefine30' => $data['package_require'] ?? null,
  711. 'cDefine31' => $data['shipping_mark'] ?? null,
  712. ];
  713. } else {
  714. $extData = [];
  715. }
  716. $inventoryEntry = array_merge($baseData, $extData);
  717. $tmp = [
  718. "Inum" => "OtherIn",
  719. "Data" => [
  720. "iHead" => [
  721. "IsVerify" => true,
  722. "cWhCode" => $data['warehouse_code'] ?? "",
  723. "cRdCode" => $data['cRdCode'] ?? null, // 入库类别
  724. "cDepCode" => null, // 部门
  725. "cSource" => "库存",
  726. "cBusType" => "其他入库",
  727. "cMemo" => $data['cMemo'] ?? "接口生成",
  728. "dDate" => date("Y-m-d"),
  729. ],
  730. "iBody" => [$inventoryEntry]
  731. ]
  732. ];
  733. $final_data = [$tmp];
  734. //调用所需
  735. list($host, $token) = $msg;
  736. //产成品入库单生成
  737. $header = ["Authorization: {$token}",'Content-Type:application/json'];
  738. $url = $host . "/api/OtherIn/Add";
  739. $json = json_encode($final_data);
  740. list($status, $result) = $this->post_helper($url, $json, $header, 60, $title . '生成其他入库单');
  741. if(! $status) return [false, $result];
  742. if(! isset($result['code'])) return [false, '其他入库单生成失败,请重试'];
  743. if($result['code'] != 0) return [false, $result['msg']];
  744. return [true, ''];
  745. }
  746. //-----------------------------------朗峰u8-----
  747. public function post_helper($url, $data, $header = [], $timeout = 20, $title = ""){
  748. Log::channel('apiLog')->info($title . 'POST', ["api" => $url , "param" => json_decode($data,true) ,"header" => $header]);
  749. $ch = curl_init();
  750. curl_setopt($ch, CURLOPT_URL, $url);
  751. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  752. curl_setopt($ch, CURLOPT_ENCODING, '');
  753. curl_setopt($ch, CURLOPT_POST, 1);
  754. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
  755. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  756. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  757. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  758. curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  759. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
  760. if(!is_null($data)) curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  761. $r = curl_exec($ch);
  762. if ($r === false) {
  763. // 获取错误号
  764. $errorNumber = curl_errno($ch);
  765. // 获取错误信息
  766. $errorMessage = curl_error($ch);
  767. $message = "cURL Error #{$errorNumber}: {$errorMessage}";
  768. Log::channel('apiLog')->info($title . 'POST结果', ["message" => $message ]);
  769. return [false, $message];
  770. }
  771. curl_close($ch);
  772. $return = json_decode($r, true);
  773. unset($r);
  774. Log::channel('apiLog')->info($title . 'POST结果', ["message" => $return ]);
  775. return [true, $return];
  776. }
  777. public function get_helper($url,$header=[],$timeout = 20){
  778. $ch = curl_init();
  779. curl_setopt_array($ch, array(
  780. CURLOPT_URL => $url,
  781. CURLOPT_RETURNTRANSFER => true,
  782. CURLOPT_ENCODING => '',
  783. CURLOPT_MAXREDIRS => 10,
  784. CURLOPT_TIMEOUT => $timeout,
  785. CURLOPT_FOLLOWLOCATION => true,
  786. CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  787. CURLOPT_CUSTOMREQUEST => 'GET',
  788. CURLOPT_SSL_VERIFYPEER => false,
  789. CURLOPT_HTTPHEADER => $header,
  790. ));
  791. $r = curl_exec($ch);
  792. if ($r === false) {
  793. // 获取错误号
  794. $errorNumber = curl_errno($ch);
  795. // 获取错误信息
  796. $errorMessage = curl_error($ch);
  797. $message = "cURL Error #{$errorNumber}: {$errorMessage}";
  798. Log::channel('apiLog')->info('朗峰GET结果', ["message" => $message]);
  799. return [false, $message];
  800. }
  801. curl_close($ch);
  802. Log::channel('apiLog')->info('朗峰GET结果', ["message" => json_decode($r, true)]);
  803. return [true, json_decode($r, true)];
  804. }
  805. public function put_helper($url, $data, $header = [], $timeout = 20){
  806. Log::channel('apiLog')->info('朗峰PUT', ["api" => $url , "param" => $data ,"header" => $header]);
  807. $ch = curl_init();
  808. curl_setopt($ch, CURLOPT_URL, $url);
  809. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  810. curl_setopt($ch, CURLOPT_ENCODING, '');
  811. curl_setopt($ch, CURLOPT_POST, 1);
  812. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
  813. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  814. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  815. curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  816. if(!is_null($data)) curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  817. $r = curl_exec($ch);
  818. if ($r === false) {
  819. // 获取错误号
  820. $errorNumber = curl_errno($ch);
  821. // 获取错误信息
  822. $errorMessage = curl_error($ch);
  823. $message = "cURL Error #{$errorNumber}: {$errorMessage}";
  824. Log::channel('apiLog')->info('朗峰PUT结果', ["message" => $message]);
  825. return [false, $message];
  826. }
  827. curl_close($ch);
  828. Log::channel('apiLog')->info('朗峰PUT结果', ["message" => json_decode($r, true)]);
  829. return [true, json_decode($r, true)];
  830. }
  831. }