ReceiveController.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. <?php
  2. namespace App\Http\Controllers\Api\thirdPart\flux;
  3. use App\Batch;
  4. use App\Events\WmsReceiveNewEvent;
  5. use App\Http\Controllers\Controller;
  6. use App\Order;
  7. use App\OrderBarcode;
  8. use App\RejectedBill;
  9. use App\RejectedBillItem;
  10. use App\SkuNew;
  11. use App\Store;
  12. use App\WMSReflectReceive;
  13. use App\WMSReflectReceiveSku;
  14. use Illuminate\Http\Request;
  15. use Illuminate\Support\Facades\Auth;
  16. use Illuminate\Support\Facades\Validator;
  17. use Zttp\Zttp;
  18. class ReceiveController extends Controller
  19. {
  20. /**
  21. * 收货任务下发
  22. */
  23. public function new_(Request $request)
  24. {
  25. ini_set('max_execution_time',2500);
  26. $errors=$this->validatorForNew($request->all())->errors();
  27. if(count($errors)>0){
  28. $this->log(__METHOD__, 'error_body' . __FUNCTION__, json_encode($request->getContent()));
  29. (new Controller())->log(__METHOD__,'error_'.__FUNCTION__,'fields wrong, see Errors report please.'.'|'.json_encode($request).'|'.json_encode($errors));
  30. return response()->json(['response'=>['flag'=>'W','message'=>'fields wrong, see Errors report please.',
  31. 'errors'=>$errors]])
  32. ->setEncodingOptions(JSON_UNESCAPED_UNICODE);
  33. }
  34. $receiveInputs=$request->input('request');
  35. foreach ($receiveInputs as $receiveInput){
  36. $isRepeated=WMSReflectReceive::where('ASNNO',$receiveInput['ASNNO'])->first();
  37. if($isRepeated){
  38. (new Controller())->log(__METHOD__,'error_'.__FUNCTION__,'ASNNO重复'.'|'.json_encode($request).'|'.json_encode($errors));
  39. return response()->json(['response'=>['flag'=>'N','code'=>'6666','message'=>'ASNNO重复']])
  40. ->setEncodingOptions(JSON_UNESCAPED_UNICODE);
  41. }
  42. $receive=new WMSReflectReceive($receiveInput);
  43. $receive->save();
  44. // $skus=[];
  45. foreach ($receiveInput['SKU_LIST'] as $skuInput){
  46. $sku=new WMSReflectReceiveSku($skuInput);
  47. $receive->skus()->save($sku);
  48. // $skus[]=$sku;
  49. }
  50. if(isset($receive['ASNREFERENCE3']))
  51. event(new WmsReceiveNewEvent($receive['ASNREFERENCE3'],$receive));
  52. }
  53. (new Controller())->log(__METHOD__,'success_'.__FUNCTION__,json_encode($request->getContent()));
  54. return response()->json(['response'=>['flag'=>'Y','code'=>'0000','message'=>'正确接收']])
  55. ->setEncodingOptions(JSON_UNESCAPED_UNICODE);
  56. }
  57. protected function validatorForNew(array $data)
  58. {
  59. return Validator::make($data, [
  60. 'request' => ['required', 'array', 'min:1'],
  61. 'request.*.ASNNO' => ['required', 'string', 'max:191'],
  62. 'request.*.WAREHOUSEID' => ['required', 'string', 'max:191'],
  63. 'request.*.CUSTOMERID' => ['required', 'string', 'max:191'],
  64. 'request.*.ASNTYPE' => ['nullable', 'string', 'max:191'],
  65. 'request.*.ASNREFERENCE1' => ['nullable', 'string', 'max:191'],
  66. 'request.*.ASNREFERENCE2' => ['nullable', 'string', 'max:191'],
  67. 'request.*.ASNREFERENCE3' => ['nullable', 'string', 'max:191'],
  68. 'request.*.ASNSTATUS' => ['nullable', 'string', 'max:191'],
  69. 'request.*.NOTES' => ['nullable', 'string', 'max:191'],
  70. 'request.*.USERDEFINE1' => ['nullable', 'string', 'max:191'],
  71. 'request.*.USERDEFINE2' => ['nullable', 'string', 'max:191'],
  72. 'request.*.USERDEFINE3' => ['nullable', 'string', 'max:191'],
  73. 'request.*.SKU_LIST' => ['required', 'array', 'min:1'],
  74. 'request.*.SKU_LIST.*.ASNLINENO' => ['nullable', 'string', 'max:191'],
  75. 'request.*.SKU_LIST.*.SKU' => ['required', 'string', 'max:191'],
  76. 'request.*.SKU_LIST.*.ALTERNATE_SKU1' => ['required', 'string', 'max:191'],
  77. 'request.*.SKU_LIST.*.SKUDESCRC' => ['nullable', 'string', 'max:191'],
  78. 'request.*.SKU_LIST.*.EXPECTEDQTY_EACH' => ['nullable', 'string', 'max:191'],
  79. 'request.*.SKU_LIST.*.UOM' => ['nullable', 'string', 'max:191'],
  80. 'request.*.SKU_LIST.*.LINESTATUS' => ['nullable', 'string', 'max:191'],
  81. 'request.*.SKU_LIST.*.LOTATT05' => ['nullable', 'string', 'max:191'],
  82. 'request.*.SKU_LIST.*.USERDEFINE4' => ['nullable', 'string', 'max:191'],
  83. 'request.*.SKU_LIST.*.USERDEFINE5' => ['nullable', 'string', 'max:191'],
  84. 'request.*.SKU_LIST.*.USERDEFINE6' => ['nullable', 'string', 'max:191'],
  85. ],[],[
  86. 'request.ASNNO' => 'ASNNO',
  87. 'request.*.WAREHOUSEID' => 'WAREHOUSEID',
  88. 'request.*.CUSTOMERID' => 'CUSTOMERID',
  89. 'request.*.ASNTYPE' => 'ASNTYPE',
  90. 'request.*.ASNREFERENCE1' => 'ASNREFERENCE1',
  91. 'request.*.ASNREFERENCE2' => 'ASNREFERENCE2',
  92. 'request.*.ASNREFERENCE3' => 'ASNREFERENCE3',
  93. 'request.*.ASNSTATUS' => 'ASNSTATUS',
  94. 'request.*.NOTES' => 'NOTES',
  95. 'request.*.USERDEFINE1' => 'USERDEFINE1',
  96. 'request.*.USERDEFINE2' => 'USERDEFINE2',
  97. 'request.*.USERDEFINE3' => 'USERDEFINE3',
  98. 'request.*.SKU_LIST' => 'SKU_LIST',
  99. 'request.*.SKU_LIST.*.ASNLINENO' => 'SKU_LIST.ASNLINENO',
  100. 'request.*.SKU_LIST.*.SKU' => 'SKU_LIST.SKU',
  101. 'request.*.SKU_LIST.*.ALTERNATE_SKU1' => 'SKU_LIST.ALTERNATE_SKU1',
  102. 'request.*.SKU_LIST.*.SKUDESCRC' => 'SKU_LIST.SKUDESCRC',
  103. 'request.*.SKU_LIST.*.EXPECTEDQTY_EACH' => 'SKU_LIST.EXPECTEDQTY_EACH',
  104. 'request.*.SKU_LIST.*.UOM' => 'SKU_LIST.UOM',
  105. 'request.*.SKU_LIST.*.LINESTATUS' => 'SKU_LIST.LINESTATUS',
  106. 'request.*.SKU_LIST.*.LOTATT05' => 'SKU_LIST.LOTATT05',
  107. 'request.*.SKU_LIST.*.USERDEFINE4' => 'SKU_LIST.USERDEFINE4',
  108. 'request.*.SKU_LIST.*.USERDEFINE5' => 'SKU_LIST.USERDEFINE5',
  109. 'request.*.SKU_LIST.*.USERDEFINE6' => 'SKU_LIST.USERDEFINE6',
  110. ]);
  111. }
  112. /**
  113. * 入库回传给WMS
  114. * @param RejectedBill $rejectedBill
  115. * @return bool
  116. */
  117. static public function accomplishToWMS(RejectedBill $rejectedBill)
  118. {
  119. ini_set('max_execution_time',2500);
  120. $bill=$rejectedBill;
  121. $wmsReceiveds=WMSReflectReceive::where('ASNREFERENCE3',$rejectedBill['logistic_number_return'])
  122. ->where('is_uploaded',0)->get();
  123. if($wmsReceiveds->isEmpty()){
  124. (new Controller())->log(__METHOD__,'error_'.__FUNCTION__,'没有WMS入库单');
  125. return false;
  126. }
  127. $items=$bill->items()->get();
  128. $amountsItem=(function()use($items){
  129. $result=[];
  130. $items->each(function($item)use(&$result){
  131. $result[$item['id']]= $item['amount'];
  132. });
  133. return $result;
  134. })();
  135. $success=true;
  136. $wmsReceiveds->each(function ($wmsReceived)use(&$bill,&$amountsItem,$items,&$success){
  137. if(!$bill && $bill['is_loaded']!=0)return;
  138. $wmsSkus=$wmsReceived->skus()->get();
  139. $orderNumberCode=$wmsReceived['ASNREFERENCE1']??$bill['order_number'];
  140. $amountsSku=(function()use($wmsSkus){
  141. $result=[];
  142. $wmsSkus->each(function($sku)use(&$result){
  143. $result[$sku['id']]= $sku['EXPECTEDQTY_EACH'];
  144. });
  145. return $result;
  146. })();
  147. $skuStrList=[];
  148. $customerCode=$bill->owner()->first()['code'];
  149. $wmsSkus->each(function(WMSReflectReceiveSku $sku)use(&$items,&$skuList,&$amountsItem,&$amountsSku,&$skuStrList,$wmsReceived,$customerCode){
  150. $items->each(function(RejectedBillItem $item)use(&$sku,&$amountsItem,&$amountsSku,&$skuStrList,$wmsReceived,$customerCode){
  151. if($item['barcode_goods']!=$sku['ALTERNATE_SKU1'])return;
  152. if($amountsItem[$item['id']]==0||$amountsSku[$sku['id']]==0)return;
  153. $uploadingAmount=(function()use(&$item,&$sku,&$amountsItem,&$amountsSku){
  154. if($amountsItem[$item['id']]>$amountsSku[$sku['id']]){
  155. $amountsItem[$item['id']]-=$amountsSku[$sku['id']];
  156. $amount= $amountsSku[$sku['id']];
  157. $amountsSku[$sku['id']]=0;
  158. return $amount;
  159. }
  160. if($amountsItem[$item['id']]<$amountsSku[$sku['id']]){
  161. $amount=$amountsItem[$item['id']];
  162. $amountsSku[$sku['id']]-=$amount;
  163. $amountsItem[$item['id']]=0;
  164. return $amount;
  165. }
  166. $amount=$amountsItem[$item['id']];
  167. $amountsItem[$item['id']]=0;
  168. $amountsSku[$sku['id']]=0;
  169. return $amount;
  170. })();
  171. if($item['is_loaded']=='已入库'){return;}
  172. $STATUS=$item['id_quality_label']==1?'ZP':'CC';
  173. $STATUS_code=$item['id_quality_label']==1?'01':'02';
  174. $skuStr="
  175. {
  176. \"ORDERNUMBERCODE\": \"{$wmsReceived['ASNNO']}\",
  177. \"ASNLINENO\": \"{$sku['ASNLINENO']}\",
  178. \"SKUCODE\": \"{$sku['SKU']}\",
  179. \"QUANTITY\": \"{$uploadingAmount}\",
  180. \"LOTATT04\": \"{$sku['LOTATT04']}\",
  181. \"LOTATT05\": \"{$sku['LOTATT05']}\",
  182. \"STATUS\": \"{$STATUS}\",
  183. \"PRODUCTION DATE\": \"{$item['made_at']}\",
  184. \"EXPIRATION DATE\": \"{$item['validity_at']}\",
  185. \"USERDEFINE1\": \"{$customerCode}{$STATUS_code}\",
  186. \"USERDEFINE2\": \"\",
  187. \"USERDEFINE3\": \"\",
  188. \"UNIQUE_CODE_LIST\": [".
  189. // {
  190. // \"ORDERNUMBERCODE\": \"{$wmsReceived['ASNNO']}\",
  191. // \"SKUCODE\": \"{$sku['SKU']}\",
  192. // \"STATUS\": \"{$STATUS}\",
  193. // \"PRODUCTION DATE\": \"{$item['made_at']}\",
  194. // \"EXPIRATION DATE\": \"{$item['validity_at']}\",
  195. // \"LOTATT05\": \"{$sku['LOTATT05']}\",
  196. // \"UNIQUE_CODE\": \"\"
  197. // }
  198. "]
  199. }
  200. ";
  201. $skuStrList[]=$skuStr;
  202. });
  203. });
  204. if(count($skuStrList)==0)return;
  205. $skuStrList = implode(',',$skuStrList);
  206. $json="
  207. {
  208. \"request\": [
  209. {
  210. \"ORDERNUMBERCODE\": \"{$wmsReceived['ASNNO']}\",
  211. \"CUSTOMERID\": \"{$customerCode}\",
  212. \"ASNTYPE\": \"{$wmsReceived['ASNTYPE']}\",
  213. \"ASNREFERENCE1\": \"{$orderNumberCode}\",
  214. \"ADDWHO\": \"WCS\",
  215. \"USERDEFINE1\": \"\",
  216. \"USERDEFINE2\": \"\",
  217. \"USERDEFINE3\": \"\",
  218. \"SKU_LIST\": [{$skuStrList}]
  219. }
  220. ]
  221. }
  222. ";
  223. $sendingJson = json_decode($json,true);
  224. $url=url(config('api.flux.receive.new'));
  225. $response = Zttp::post($url, $sendingJson);
  226. $noIssues=true;
  227. $json = $response->json();
  228. (new Controller())->log(__METHOD__,__FUNCTION__,$response->body().'|'.json_encode($sendingJson));
  229. if(!$json||!isset($json['Response'])||!$json['Response']['return']['returnFlag']=='1'){
  230. $noIssues=false;
  231. }
  232. if($json&&isset($json['Response'])){
  233. if($json['Response']['return']['returnFlag']=='2'){
  234. return true;
  235. }
  236. if(isset($json['Response']['return']['returnDesc'])&&strpos($json['Response']['return']['returnDesc'],'唯一约束')!==false){
  237. (new Controller())->log(__METHOD__,'error_'.__FUNCTION__,$response->body().'|'.json_encode($sendingJson));
  238. return true;
  239. }
  240. if(isset($json['Response']['return']['errordescr'])&&strpos($json['Response']['return']['errordescr'],'已完成')!==false){
  241. (new Controller())->log(__METHOD__,'error_'.__FUNCTION__,$response->body().'|'.json_encode($sendingJson));
  242. return true;
  243. }
  244. }
  245. if($noIssues&&$json['Response']['return']['returnFlag']=='1'){
  246. $wmsReceived['is_uploaded']=1;
  247. $wmsReceived->save();
  248. return true;
  249. }else{
  250. $success=false;
  251. (new Controller())->log(__METHOD__,'error_'.__FUNCTION__,$response->body().'|'.json_encode($sendingJson));
  252. }
  253. });
  254. return $success;
  255. }
  256. }