AssistantRejectedController.php 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <?php
  2. namespace App\Http\Controllers\api\jianshang;
  3. use App\Http\Controllers\Controller;
  4. use App\Rejected;
  5. use App\RejectedBill;
  6. use App\RejectedBillItem;
  7. use Carbon\Carbon;
  8. use Illuminate\Http\Request;
  9. use Illuminate\Support\Collection;
  10. use Zttp\Zttp;
  11. class AssistantRejectedController extends Controller
  12. {
  13. function sendRejected(Rejected $rejected){
  14. $created_at = $rejected['created_at'] ?? '';
  15. $fee_collected = $rejected['fee_collected'] ?? '';
  16. $goodses=[];
  17. foreach ($rejected['goodses'] as $goods){
  18. $temGoods['amount']=$goods['amount'] ?? '';
  19. $temGoods['goods_barcode']=$goods['barcode_goods'] ?? '';
  20. $temGoods['goods_name']=$goods['name_goods'] ?? '';
  21. $temGoods['quality_label']=$goods['quality_label'] ?? '';
  22. $goodses[]=$temGoods;
  23. }
  24. $logistic_name_return = $rejected->logisticName();
  25. $logistic_number = $rejected['logistic_number'] ?? '';
  26. $logistic_number_return = $rejected['logistic_number_return'] ?? '';
  27. $order_number = $rejected['order_number'] ?? '';
  28. $sender_mobile = $rejected['mobile_sender'] ?? '';
  29. $sender_name = $rejected['sender'] ?? '';
  30. $json = $this->packSendToRemote($created_at,$fee_collected,$goodses,
  31. $logistic_name_return,$logistic_number,$logistic_number_return,$order_number,
  32. $sender_mobile,$sender_name);
  33. if(!$json){
  34. $this->log(__METHOD__,'error',"返回错误:没有JSON,请检查笕尚直接返回内容");
  35. return ['success'=>false];
  36. }else if(!isset($json['success'])||!$json['success']){
  37. $this->log(__METHOD__,'error',"返回错误:".json_encode($json));
  38. return ['success'=>false];
  39. }
  40. if(!$json['goodses_feedback']){
  41. $this->log(__METHOD__,'error',"没有goodses信息:".json_encode($json));
  42. }
  43. if(!$json['logistic_number_return']){
  44. $this->log(__METHOD__,'error',"没有退回快递单号信息:".json_encode($json));
  45. }
  46. $bill = $this->markItemsIsLoaded($json);
  47. $billIsLoaded=$bill->changeIsLoaded_ifItemsAllLoaded();
  48. return ['success'=>true,'bill_is_loaded'=>$billIsLoaded];
  49. }
  50. private function markItemsIsLoaded($json){
  51. $barcodes=[];
  52. foreach ($json['goodses_feedback'] as $goods){
  53. $barcodes[]=trim($goods['goods_barcode']);
  54. }
  55. $bill=RejectedBill::where('logistic_number_return',$json['logistic_number_return'])->first();
  56. $items=RejectedBillItem::where('id_rejected_bill',$bill['id'])->whereIn('barcode_goods',$barcodes)->get();
  57. $items->each(function(RejectedBillItem $item)use(&$json){
  58. foreach ($json['goodses_feedback'] as &$goods1){ //标记出有重复条码的商品,并且标记出其中是否同时有不能入库可和可以入库的
  59. $goods1['sameBarcode']=0;
  60. $goods1['hasUnStorable']=false;
  61. $goods1['hasStorable']=false;
  62. foreach ($json['goodses_feedback'] as &$goods2){
  63. if($goods1['goods_barcode']==$goods2['goods_barcode']){
  64. $goods1['sameBarcode']+=1;
  65. if(!$goods2['storable']){
  66. $goods1['hasUnStorable']=true;
  67. }else{
  68. $goods1['hasStorable']=true;
  69. }
  70. }
  71. }
  72. }
  73. foreach ($json['goodses_feedback'] as $goods){
  74. if($item['barcode_goods']==$goods['goods_barcode']){
  75. $item['is_loaded'] = $goods['storable']==='true'|| $goods['storable']===true ? '已入库':'未入库';
  76. if($goods['sameBarcode']>1){//如果该条码有不止一件,并且同时拥有入库和不入库的,就按品质标签来区分入库与否(因为回传不带是否正品消息,也没有ID)
  77. if($goods['hasUnStorable']&&$goods['hasStorable']){
  78. if($item['id_quality_label']==1){
  79. $item['is_loaded'] ='已入库';
  80. }else{
  81. $item['is_loaded'] ='未入库';
  82. }
  83. }
  84. }
  85. $item->update();
  86. }
  87. }
  88. });
  89. return $bill;
  90. }
  91. // function sendRejectedByApi(Request $request){
  92. // $created_at = $request->input('created_at') ?? '';
  93. // $fee_collected = $request->input('fee_collected') ?? '';
  94. // $goodses=[];
  95. // foreach ($request->input('goodses') ?? [] as $goods){
  96. // $temGoods['amount']=$goods['amount'] ?? '';
  97. // $temGoods['goods_barcode']=$goods['barcode_goods'] ?? '';
  98. // $temGoods['goods_name']=$goods['name_goods'] ?? '';
  99. // $temGoods['quality_label']=$goods['quality_label'] ?? '';
  100. // $goodses[]=$temGoods;
  101. // }
  102. // $logistic_name_return = $request->input('logistic_name_return') ?? '';
  103. // $logistic_number = $request->input('logistic_number') ?? '';
  104. // $logistic_number_return = $request->input('logistic_number_return') ?? '';
  105. // $order_number = $request->input('order_number') ?? '';
  106. // $sender_mobile = $request->input('sender_mobile') ?? '';
  107. // $sender_name = $request->input('sender_name') ?? '';
  108. // $json = $this->packSendToRemote($created_at,$fee_collected,$goodses,
  109. // $logistic_name_return,$logistic_number,$logistic_number_return,$order_number,
  110. // $sender_mobile,$sender_name);
  111. // if(!$json)return ['success'=>'false','fail_info'=>'没有JSON回复'];
  112. // if(!$json['success']){return $this->apiError(__METHOD__,"返回错误:".json_encode($json));}
  113. // return $json;
  114. // }
  115. private function packSendToRemote($created_at,$fee_collected,$goodses,
  116. $logistic_name_return,$logistic_number,$logistic_number_return,$order_number,
  117. $sender_mobile,$sender_name){
  118. foreach ($goodses as $goods){
  119. asort($goods);
  120. }
  121. $goodses = json_encode($goodses);
  122. $data="{\"created_at\":\"$created_at\", \"fee_collected\":\"$fee_collected\",
  123. \"goodses\":$goodses,\"logistic_name_return\":\"$logistic_name_return\",
  124. \"logistic_number\":\"$logistic_number\", \"logistic_number_return\":\"$logistic_number_return\",
  125. \"order_number\":\"$order_number\", \"sender_mobile\":\"$sender_mobile\", \"sender_name\":\"$sender_name\"}";
  126. $sortParamsAndMd5=function(Array $params,$timestamp,$nonce,$signKey){
  127. $params=new Collection($params);
  128. $params=$params->sortKeys();
  129. $str='';
  130. $params->each(function($param,$key)use(&$str){
  131. if(is_array($param)){
  132. foreach ($param as &$paramValArr){
  133. foreach ($paramValArr as &$paramVal){
  134. $paramVal = trim($paramVal);
  135. }
  136. }
  137. $param=json_encode($param);
  138. }
  139. $val=trim($param);
  140. if($val){
  141. $str .= $key.$val;
  142. }
  143. });
  144. return strtolower(md5($str.$timestamp.$nonce.$signKey));
  145. };
  146. $timestamp=intval(microtime(true)*1000);
  147. $nonce=md5(microtime(true));
  148. $sign=$sortParamsAndMd5(json_decode($data,true),$timestamp,$nonce,config('api.sign_key_rejected_send_jianshang'));
  149. $url=config('api.url_rejected_send_jianshang');
  150. if(env('api_faking'))$url=url(config('api.fakingUrl_rejected_send_jianshang'));
  151. $response=Zttp::withHeaders([
  152. 'sign'=>$sign,
  153. 'nonce'=>$nonce,
  154. 'timestamp'=>$timestamp,
  155. 'Content-Type'=>'application/json'
  156. ])->post($url,json_decode($data,true));
  157. $this->log(__METHOD__,'json',$data);
  158. if(!$response){
  159. $this->log(__METHOD__,'error','回复异常:'.$response->body());
  160. return false;
  161. }
  162. $this->log(__METHOD__,'response',$response->body());
  163. return $response->json();
  164. }
  165. public function fakingReceiveSend(Request $request){
  166. $sign = $request->header('sign');
  167. $nonce = $request->header('nonce');
  168. $timestamp = $request->header('timestamp');
  169. $Content_Type = $request->header('Content-Type');
  170. $header = compact('sign', 'nonce', 'timestamp', 'Content_Type');
  171. $goods=[];
  172. foreach ($request->input('goodses') as $goodsIn){
  173. $goods[]=['goods_barcode'=>$goodsIn['goods_barcode'],'storable'=>$goodsIn['quality_label']=='正品'?true:false,'message'=>'msg'];
  174. }
  175. $result = ['logistic_number_return'=>$request->input('logistic_number_return'),'goodses_feedback' => $goods, 'success' => true, 'header' => $header, 'requestAll' => $request->all()];
  176. $this->log(__METHOD__,'faking',json_encode($result));
  177. return $result;
  178. }
  179. }