SortingController.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. <?php
  2. namespace App\Http\Controllers\Api\thirdPart\flux;
  3. use App\Batch;
  4. use App\Commodity;
  5. use App\Http\Controllers\Controller;
  6. use App\Order;
  7. use App\OrderBin;
  8. use App\OrderCommodity;
  9. use App\Owner;
  10. use Carbon\Carbon;
  11. use Illuminate\Http\Request;
  12. use Illuminate\Support\Facades\Validator;
  13. use Zttp\Zttp;
  14. class SortingController extends Controller
  15. {
  16. /**
  17. * 新增被通知的波次列表(一个以上的波次),并且保存在本地数据库,供get波次使用
  18. * 接收:request[(下边newBatch的字段)]
  19. * 返回:Response{return{returnFlag(1/0),returnCode(0000/0001),returnDesc,resultInfo}}
  20. */
  21. public function newBatch(Request $request)
  22. {
  23. $requestArr=$request->all();
  24. app('LogService')->log(__METHOD__, 'issued_' . __FUNCTION__, json_encode($request->all()));
  25. !$requestArr?$requestArr=json_decode($request->getContent(),true):false;
  26. $errors=$this->newBatchValidator($requestArr)->errors();
  27. if(count($errors)>0){
  28. app('LogService')->log(__METHOD__, 'error' . __FUNCTION__, 'fields wrong, see Errors report please.'.'|'.json_encode($request->all()).'|'.json_encode($errors));
  29. return response()->json(['Response'=>['return'=>['returnFlag'=>'0','returnCode'=>'0001',
  30. 'returnDesc'=>':Failure','resultInfo'=>'','errors'=>$errors]]])->setEncodingOptions(JSON_UNESCAPED_UNICODE);
  31. }
  32. $requestBatches = $requestArr['request']?? '';
  33. foreach ($requestBatches as $requestBatch){
  34. $requestBatch['edittime']&&strpos(trim($requestBatch['edittime']),' ')?$editTimeFormat='Y-m-d H:i:s':$editTimeFormat='YmdHis';
  35. $batch=new Batch([
  36. 'code' => $requestBatch['waveno'],
  37. 'wms_type' => $requestBatch['batch_type']??'',
  38. 'wms_status' => $requestBatch['docstatus']??'',
  39. 'status' => '未处理',
  40. 'wms_created_at' => $requestBatch['edittime']?Carbon::createFromFormat($editTimeFormat,$requestBatch['edittime']):'',
  41. ]);
  42. $batch->save();
  43. foreach($requestBatch['order_list'] as $requestOrder){
  44. $owner=Owner::query()->where('code',$requestOrder['customerid'])->first();
  45. $order=Order::query()->where('code',$requestOrder['docno'])->first();
  46. if(!$order){
  47. $order=new Order([
  48. 'batch_id' => $batch['id'],
  49. 'code' => $requestOrder['docno'],
  50. 'owner_id' => $owner['id'],
  51. 'wms_status' => $requestOrder['docstatus']??'波次下发',
  52. 'status' => '未处理',
  53. ]);
  54. }else{
  55. $order['batch_id']= $order['batch_id']??$batch['id'] ;
  56. $order['owner_id']=$order['owner_id']??$owner['owner_id'];
  57. $order['wms_status']=$order['wms_status']??$requestOrder['docstatus']??'波次下发';
  58. $order['status']=$order['status']??'未处理';
  59. }
  60. $order->save();
  61. $orderBin=OrderBin::query()->firstOrCreate([
  62. 'order_id' => $order['id'],
  63. 'number' => $requestOrder['reservedfield01'],
  64. ]);
  65. foreach($requestOrder['barcode_list'] as $requestBarcode){
  66. $commodity=Commodity::newCommodityBy_BarcodeOwnerIdNameSku($requestBarcode['alternate_sku1'],$owner['id'],$requestBarcode['descr_c'],$requestBarcode['sku']);
  67. $orderCommodity = new OrderCommodity([
  68. 'order_id' => $order['id'],
  69. 'commodity_id' => $commodity['id'],
  70. 'amount' => $requestBarcode['fmqty_each']??0,
  71. 'wms_ptltaskid' => $requestBarcode['ptltaskid'],
  72. ]);
  73. $orderCommodity->save();
  74. }
  75. }
  76. }
  77. return response()->json(['Response'=>['return'=>['returnFlag'=>'1','returnCode'=>'0000',
  78. 'returnDesc'=>'消息处理成功:Success','resultInfo'=>'']]])->setEncodingOptions(JSON_UNESCAPED_UNICODE);
  79. }
  80. protected function newBatchValidator(array $data)
  81. {
  82. return Validator::make($data, [
  83. 'request' => ['required', 'array', 'min:1'],
  84. 'request.*.waveno' => ['required', 'string', 'max:191','unique:batches,code'],
  85. 'request.*.taskprocess' => ['nullable', 'string', 'max:191'],
  86. 'request.*.edittime' => ['nullable', 'string', 'max:191'],
  87. 'request.*.batch_type' => ['nullable', 'string', 'max:191'],
  88. 'request.*.docstatus' => ['nullable', 'string', 'max:191'],
  89. 'request.*.batch_created_at' => ['nullable', 'string', 'max:191'],
  90. 'request.*.order_list' => ['required', 'array', 'min:1'],
  91. 'request.*.order_list.*.docno' => ['required', 'string', 'max:191'],
  92. 'request.*.order_list.*.customerid' => ['required', 'string', 'max:191','exists:owners,code'],
  93. 'request.*.order_list.*.docstatus' => ['nullable', 'string', 'max:191'],
  94. 'request.*.order_list.*.reservedfield01' => ['required', 'max:191'],
  95. 'request.*.order_list.*.barcode_list' => ['required_unless:request.*.order_list.*.docstatus,90', 'array'],
  96. 'request.*.order_list.*.barcode_list.*.alternate_sku1' => ['required', 'string', 'max:191'],
  97. 'request.*.order_list.*.barcode_list.*.descr_c' => ['required', 'string', 'max:191'],
  98. 'request.*.order_list.*.barcode_list.*.fmqty_each' => ['required', 'numeric'],
  99. 'request.*.order_list.*.barcode_list.*.ptltaskid' => ['required', 'string', 'max:191'],
  100. ]);
  101. }
  102. /**
  103. * 新增被通知的取消订单
  104. * 接收:docno(订单号),docstatus(状态,唯一:canceled)
  105. * 返回:Response{return{returnFlag(1/0),returnCode(0000/0001),returnDesc,resultInfo}} 1和0000成功,0和0001失败
  106. */
  107. public function newCanceledOrder(Request $request)
  108. {
  109. $requestArr=$request->all();
  110. !$requestArr?$requestArr=json_decode($request->getContent(),true):false;
  111. Controller::logS(__METHOD__,__FUNCTION__,"接收到WMS下发取消单:".$request->getContent());
  112. $errors=$this->newCanceledOrderValidator($requestArr)->errors();
  113. if(count($errors)>0){
  114. app('LogService')->log(__METHOD__, 'error' . __FUNCTION__, 'fields wrong, see Errors report please.'.'|'.json_encode($request->all()).'|'.json_encode($errors));
  115. return response()->json(['Response'=>['return'=>['returnFlag'=>'0','returnCode'=>'0001',
  116. 'returnDesc'=>':Failure','resultInfo'=>'','errors'=>$errors]]])->setEncodingOptions(JSON_UNESCAPED_UNICODE);
  117. }
  118. $order=Order::query()->where('code',$requestArr['docno'])->first();
  119. $order->cancel();
  120. return response()->json(['Response'=>['return'=>['returnFlag'=>'1','returnCode'=>'0000',
  121. 'returnDesc'=>'消息处理成功:Success','resultInfo'=>'']]])->setEncodingOptions(JSON_UNESCAPED_UNICODE);
  122. }
  123. protected function newCanceledOrderValidator(array $data)
  124. {
  125. return Validator::make($data, [
  126. 'docno' => ['required', 'string', 'max:191', 'exists:orders,code'],
  127. 'docstatus' => ['required', 'string', 'max:191'],
  128. ]);
  129. }
  130. public function informBinAssignment(Batch $batch)
  131. {
  132. $apiUrl=config('api.flux.inform.binAssignment');
  133. if(config('api.faking')){$apiUrl=url(config('api.fake_flux_informBinAssignment'));}
  134. $sendingData=['request'=>[]];
  135. $batch->orders()->each(function(Order $order)use($batch,&$sendingData){
  136. $sendingData['request'][]=[
  137. 'batch_id'=>$batch['code'],
  138. 'status'=>'00',//原来是beforeSorting,改成了00
  139. 'order_id'=>$order['code'],
  140. 'bin'=>$order->bin()->first()['number']
  141. ];
  142. });
  143. $response=null;
  144. try {
  145. $response=Zttp::post($apiUrl,$sendingData);
  146. }catch (\Exception $e){
  147. app('LogService')->log(__METHOD__,'error_'.__FUNCTION__,'catch:'.$e->getMessage());
  148. return false;
  149. }
  150. $reJson=$response->json();
  151. if(!$reJson || (!isset($reJson['Response'])||!isset($reJson['Response']['return'])) || $reJson['Response']['return']['returnFlag']!='1'){
  152. app('LogService')->log(__METHOD__,'error_'.__FUNCTION__,'$sending:'.json_encode($sendingData).'$response:'.$response->body());
  153. return false;
  154. }
  155. return true;
  156. }
  157. public function informBatchFinished(Batch $batch){
  158. $sendingData=['request'=>[]];
  159. $batch->orders()->each(function (Order $order)use($batch,&$sendingData){
  160. $order->orderCommodities()->each(function (OrderCommodity $orderCommodity)use($batch,$order,&$sendingData){
  161. $bin=$order->bin()->first();
  162. $sendingData['request'][]=[
  163. 'ptltaskid'=>$orderCommodity['wms_ptltaskid'],
  164. 'batch_id'=>$batch['code'],
  165. 'status'=>'80', //原来是isSorted,改成了80
  166. 'order_id'=>$order['code'],
  167. 'bin'=>$bin?$bin['number']:'',
  168. 'docstatus'=>'success',
  169. 'sku'=>$orderCommodity->commodity()->first()?$orderCommodity->commodity()->first()['sku']:'',
  170. 'amount'=>'0',
  171. ];
  172. });
  173. });
  174. $informApiUrl = config('api.flux.inform.batchFinished');
  175. try{
  176. $response=Zttp::post($informApiUrl,$sendingData);
  177. $result=$response->json();
  178. if(!$result||!$result['Response']['return']['returnFlag']||$result['Response']['return']['returnCode']!='0000'){
  179. app('LogService')->log(__METHOD__,'error_'.__FUNCTION__,'$sending:'.json_encode($sendingData).'|$response:'.$response->body());
  180. return false;
  181. }
  182. }
  183. catch(\Exception $e){
  184. app('LogService')->log(__METHOD__,'error_'.__FUNCTION__,'catch:'.$e->getMessage());
  185. return false;
  186. }
  187. app('LogService')->log(__METHOD__,'temp_'.__FUNCTION__,'$sending:'.json_encode($sendingData).'|$response:'.$response->body());
  188. return true;
  189. }
  190. }