RejectedController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. <?php
  2. namespace App\Http\Controllers\api\thirdPart\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 RejectedController extends Controller
  12. {
  13. function sendRejected(Rejected $rejected){
  14. $amount = $rejected['amount'] ?? '';
  15. $created_at = $rejected['created_at'] ?? '';
  16. $fee_collected = $rejected['fee_collected'] ?? '';
  17. $goods_barcode = $rejected['barcode_goods'] ?? '';
  18. $goods_name = $rejected['name_goods'] ?? '';
  19. $logistic_name_return = $rejected->logisticName();
  20. $logistic_number = $rejected['logistic_number'] ?? '';
  21. $logistic_number_return = $rejected['logistic_number_return'] ?? '';
  22. $order_number = $rejected['order_number'] ?? '';
  23. $quality_label = $rejected->qualityLabelName();
  24. $sender_mobile = $rejected['mobile_sender'] ?? '';
  25. $sender_name = $rejected['sender'] ?? '';
  26. $json = $this->packSendToRemote($amount,$created_at,$fee_collected,$goods_barcode,
  27. $goods_name,$logistic_name_return,$logistic_number,$logistic_number_return,$order_number,
  28. $quality_label,$sender_mobile,$sender_name);
  29. if(!$json){
  30. $this->log(__METHOD__,'error'.'_'.$logistic_number_return,"没有返回");
  31. return false;
  32. }
  33. if(!$json['success']){
  34. $this->log(__METHOD__,'error'.'_'.$logistic_number_return,"返回错误:".json_encode($json));
  35. return false;
  36. }else{
  37. $this->log(__METHOD__,'JianshangResponse'.'_'.$logistic_number_return,json_encode($json));
  38. }
  39. return $json;
  40. }
  41. function sendRejectedByApi(Request $request){
  42. $amount = $request->input('amount') ?? '';
  43. $created_at = $request->input('created_at') ?? '';
  44. $fee_collected = $request->input('fee_collected') ?? '';
  45. $goods_barcode = $request->input('goods_barcode') ?? '';
  46. $goods_name = $request->input('goods_name') ?? '';
  47. $logistic_name_return = $request->input('logistic_name_return') ?? '';
  48. $logistic_number = $request->input('logistic_number') ?? '';
  49. $logistic_number_return = $request->input('logistic_number_return') ?? '';
  50. $order_number = $request->input('order_number') ?? '';
  51. $quality_label = $request->input('quality_label') ?? '';
  52. $sender_mobile = $request->input('sender_mobile') ?? '';
  53. $sender_name = $request->input('sender_name') ?? '';
  54. $json = $this->packSendToRemote($amount,$created_at,$fee_collected,$goods_barcode,
  55. $goods_name,$logistic_name_return,$logistic_number,$logistic_number_return,$order_number,
  56. $quality_label,$sender_mobile,$sender_name);
  57. if(!$json)return ['success'=>'false','fail_info'=>'没有JSON回复'];
  58. if(!$json['success']){return $this->apiError(__METHOD__,"返回错误:".json_encode($json));}
  59. return $json;
  60. }
  61. private function packSendToRemote($amount,$created_at,$fee_collected,$goods_barcode,
  62. $goods_name,$logistic_name_return,$logistic_number,$logistic_number_return,$order_number,
  63. $quality_label,$sender_mobile,$sender_name){
  64. if(env('api_faking')){
  65. $this->log(__METHOD__,'error_'.__FUNCTION__,'API FAKING');
  66. return false;
  67. }
  68. $data="{\"amount\":\"$amount\", \"created_at\":\"$created_at\", \"fee_collected\":\"$fee_collected\",
  69. \"goods_barcode\":\"$goods_barcode\", \"goods_name\":\"$goods_name\", \"logistic_name_return\":\"$logistic_name_return\",
  70. \"logistic_number\":\"$logistic_number\", \"logistic_number_return\":\"$logistic_number_return\",
  71. \"order_number\":\"$order_number\", \"quality_label\":\"$quality_label\", \"sender_mobile\":\"$sender_mobile\", \"sender_name\":\"$sender_name\"}";
  72. $sortParamsAndMd5=function(Array $params,$timestamp,$nonce,$signKey){
  73. $params=new Collection($params);
  74. $params=$params->sortKeys();
  75. $str='';
  76. $params->each(function($param,$key)use(&$str){
  77. $val=trim($param);
  78. if($val){
  79. $str .= $key.$val;
  80. }
  81. });
  82. return strtolower(md5($str.$timestamp.$nonce.$signKey));
  83. };
  84. $timestamp=intval(microtime(true)*1000);
  85. $nonce=md5(microtime(true));
  86. $sign=$sortParamsAndMd5(json_decode($data,true),$timestamp,$nonce,config('api.sign_key_rejected_send_jianshang'));
  87. $url=config('api.url_rejected_send_jianshang');
  88. $response=Zttp::withHeaders([
  89. 'sign'=>$sign,
  90. 'nonce'=>$nonce,
  91. 'timestamp'=>$timestamp,
  92. 'Content-Type'=>'application/json'
  93. ])->post($url,json_decode($data,true));
  94. $this->log(__METHOD__,__FUNCTION__,$data);
  95. if(!$response){
  96. $this->log(__METHOD__,'error_'.__FUNCTION__,'回复异常:'.$response->body());
  97. return false;
  98. }
  99. if(!$response->json()){
  100. $this->log(__METHOD__,'error_'.__FUNCTION__,'json为空:'.$response->body());
  101. return false;
  102. }
  103. return $response->json();
  104. }
  105. function sendRejected2(Rejected $rejected){
  106. $created_at = $rejected['created_at'] ?? '';
  107. $fee_collected = $rejected['fee_collected'] ?? '';
  108. $goodses=[];
  109. foreach ($rejected['goodses'] as $goods){
  110. $temGoods['amount']=$goods['amount'] ?? '';
  111. $temGoods['goods_barcode']=$goods['barcode_goods'] ?? '';
  112. $temGoods['goods_name']=$goods['name_goods'] ?? '';
  113. $temGoods['quality_label']=$goods['quality_label'] ?? '';
  114. $goodses[]=$temGoods;
  115. }
  116. $logistic_name_return = $rejected->logisticName();
  117. $logistic_number = $rejected['logistic_number'] ?? '';
  118. $logistic_number_return = $rejected['logistic_number_return'] ?? '';
  119. $order_number = $rejected['order_number'] ?? '';
  120. $sender_mobile = $rejected['mobile_sender'] ?? '';
  121. $sender_name = $rejected['sender'] ?? '';
  122. $json = $this->packSendToRemote2($created_at,$fee_collected,$goodses,
  123. $logistic_name_return,$logistic_number,$logistic_number_return,$order_number,
  124. $sender_mobile,$sender_name);
  125. if(!$json){
  126. $this->log(__METHOD__,'error',"返回错误:没有JSON,请检查笕尚直接返回内容");
  127. return ['success'=>false];
  128. }else if(!isset($json['success'])||!$json['success']){
  129. $this->log(__METHOD__,'error',"返回错误:".json_encode($json));
  130. return ['success'=>false];
  131. }
  132. if(!$json['goodses_feedback']){
  133. $this->log(__METHOD__,'error',"没有goodses信息:".json_encode($json));
  134. }
  135. if(!$json['logistic_number_return']){
  136. $this->log(__METHOD__,'error',"没有退回快递单号:".json_encode($json));
  137. }
  138. // $this->markItemsIsLoaded($json);
  139. return true;
  140. }
  141. private function packSendToRemote2($created_at,$fee_collected,$goodses,
  142. $logistic_name_return,$logistic_number,$logistic_number_return,$order_number,
  143. $sender_mobile,$sender_name){
  144. foreach ($goodses as $goods){
  145. asort($goods);
  146. }
  147. $goodses = json_encode($goodses);
  148. $data="{\"created_at\":\"$created_at\", \"fee_collected\":\"$fee_collected\",
  149. \"goodses\":$goodses,\"logistic_name_return\":\"$logistic_name_return\",
  150. \"logistic_number\":\"$logistic_number\", \"logistic_number_return\":\"$logistic_number_return\",
  151. \"order_number\":\"$order_number\", \"sender_mobile\":\"$sender_mobile\", \"sender_name\":\"$sender_name\"}";
  152. $sortParamsAndMd5=function(Array $params,$timestamp,$nonce,$signKey){
  153. $params=new Collection($params);
  154. $params=$params->sortKeys();
  155. $str='';
  156. $params->each(function($param,$key)use(&$str){
  157. if(is_array($param)){
  158. foreach ($param as &$paramValArr){
  159. foreach ($paramValArr as &$paramVal){
  160. $paramVal = trim($paramVal);
  161. }
  162. }
  163. $param=json_encode($param);
  164. }
  165. $val=trim($param);
  166. if($val){
  167. $str .= $key.$val;
  168. }
  169. });
  170. return strtolower(md5($str.$timestamp.$nonce.$signKey));
  171. };
  172. $timestamp=intval(microtime(true)*1000);
  173. $nonce=md5(microtime(true));
  174. $sign=$sortParamsAndMd5(json_decode($data,true),$timestamp,$nonce,config('api.sign_key_rejected_send_jianshang'));
  175. $url=config('api.url_rejected_send_jianshang');
  176. if(env('api_faking'))$url=url(config('api.fakingUrl_rejected_send_jianshang'));
  177. $response=Zttp::withHeaders([
  178. 'sign'=>$sign,
  179. 'nonce'=>$nonce,
  180. 'timestamp'=>$timestamp,
  181. 'Content-Type'=>'application/json'
  182. ])->post($url,json_decode($data,true));
  183. $this->log(__METHOD__,'json',$data);
  184. if(!$response){
  185. $this->log(__METHOD__,'error','回复异常:'.$response->body());
  186. return false;
  187. }
  188. $this->log(__METHOD__,'response',$response->body());
  189. return $response->json();
  190. }
  191. private function markItemsIsLoaded($json){
  192. $barcodes=[];
  193. foreach ($json['goodses_feedback'] as $goods){
  194. $barcodes[]=trim($goods['goods_barcode']);
  195. }
  196. $bill=RejectedBill::where('logistic_number_return',$json['logistic_number_return'])->first();
  197. $items=RejectedBillItem::where('id_rejected_bill',$bill['id'])->whereIn('barcode_goods',$barcodes)->get();
  198. $items->each(function(RejectedBillItem $item)use(&$json){
  199. foreach ($json['goodses_feedback'] as &$goods1){ //标记出有重复条码的商品,并且标记出其中是否同时有不能入库可和可以入库的
  200. $goods1['sameBarcode']=0;
  201. $goods1['hasUnStorable']=false;
  202. $goods1['hasStorable']=false;
  203. foreach ($json['goodses_feedback'] as &$goods2){
  204. if($goods1['goods_barcode']==$goods2['goods_barcode']){
  205. $goods1['sameBarcode']+=1;
  206. if(!$goods2['storable']){
  207. $goods1['hasUnStorable']=true;
  208. }else{
  209. $goods1['hasStorable']=true;
  210. }
  211. }
  212. }
  213. }
  214. foreach ($json['goodses_feedback'] as $goods){
  215. if($item['barcode_goods']==$goods['goods_barcode']){
  216. $item['is_loaded'] = $goods['storable']==='true'|| $goods['storable']===true ? '已入库':'未入库';
  217. if($goods['sameBarcode']>1){//如果该条码有不止一件,并且同时拥有入库和不入库的,就按品质标签来区分入库与否(因为回传不带是否正品消息,也没有ID)
  218. if($goods['hasUnStorable']&&$goods['hasStorable']){
  219. if($item['id_quality_label']==1){
  220. $item['is_loaded'] ='已入库';
  221. }else{
  222. $item['is_loaded'] ='未入库';
  223. }
  224. }
  225. }
  226. $item->update();
  227. }
  228. }
  229. });
  230. return $bill;
  231. }
  232. }