RejectedController.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. <?php
  2. namespace App\Http\Controllers\api\thirdPart\jianshang;
  3. use App\Components\ErrorPush;
  4. use App\Http\Controllers\Controller;
  5. use App\Logistic;
  6. use App\QualityLabel;
  7. use App\RejectedBill;
  8. use App\RejectedBillItem;
  9. use Illuminate\Http\Request;
  10. use Illuminate\Support\Collection;
  11. use Illuminate\Support\Facades\Auth;
  12. use Zttp\Zttp;
  13. use Zttp\ZttpResponse;
  14. class RejectedController extends Controller
  15. {
  16. use ErrorPush;
  17. /**
  18. * 22-6-8 废弃接口
  19. *
  20. * @Deprecated
  21. * @param $rejected
  22. * @return false
  23. */
  24. function sendRejected($rejected){
  25. $amount = $rejected['amount'] ?? '';
  26. $created_at = $rejected['created_at'] ?? '';
  27. $fee_collected = $rejected['fee_collected'] ?? '';
  28. $goods_barcode = $rejected['barcode_goods'] ?? '';
  29. $goods_name = $rejected['name_goods'] ?? '';
  30. $logistic_name_return = Logistic::nameById($rejected['id_logistic_return']);
  31. $logistic_number = $rejected['logistic_number'] ?? '';
  32. $logistic_number_return = $rejected['logistic_number_return'] ?? '';
  33. $order_number = $rejected['order_number'] ?? '';
  34. $quality_label = QualityLabel::where('id',$rejected['id_quality_label'])->first();
  35. $quality_label = $quality_label?$quality_label['name']:'';
  36. $sender_mobile = $rejected['mobile_sender'] ?? '';
  37. $sender_name = $rejected['sender'] ?? '';
  38. $json = $this->packSendToRemote($amount,$created_at,$fee_collected,$goods_barcode,
  39. $goods_name,$logistic_name_return,$logistic_number,$logistic_number_return,$order_number,
  40. $quality_label,$sender_mobile,$sender_name);
  41. if(!$json){
  42. app('LogService')->log(__METHOD__,'error'.'_'.$logistic_number_return,"没有返回");
  43. return false;
  44. }
  45. if(!$json['success']){
  46. app('LogService')->log(__METHOD__,'error'.'_'.$logistic_number_return,"返回错误:".json_encode($json));
  47. return false;
  48. }else{
  49. app('LogService')->log(__METHOD__,'JianshangResponse'.'_'.$logistic_number_return,json_encode($json));
  50. }
  51. return $json;
  52. }
  53. /**
  54. * 22-6-8 废弃接口
  55. * @Deprecated
  56. * @param Request $request
  57. * @return array|string[]
  58. */
  59. function sendRejectedByApi(Request $request){
  60. $amount = $request->input('amount') ?? '';
  61. $created_at = $request->input('created_at') ?? '';
  62. $fee_collected = $request->input('fee_collected') ?? '';
  63. $goods_barcode = $request->input('goods_barcode') ?? '';
  64. $goods_name = $request->input('goods_name') ?? '';
  65. $logistic_name_return = $request->input('logistic_name_return') ?? '';
  66. $logistic_number = $request->input('logistic_number') ?? '';
  67. $logistic_number_return = $request->input('logistic_number_return') ?? '';
  68. $order_number = $request->input('order_number') ?? '';
  69. $quality_label = $request->input('quality_label') ?? '';
  70. $sender_mobile = $request->input('sender_mobile') ?? '';
  71. $sender_name = $request->input('sender_name') ?? '';
  72. $json = $this->packSendToRemote($amount,$created_at,$fee_collected,$goods_barcode,
  73. $goods_name,$logistic_name_return,$logistic_number,$logistic_number_return,$order_number,
  74. $quality_label,$sender_mobile,$sender_name);
  75. if(!$json)return ['success'=>'false','fail_info'=>'没有JSON回复'];
  76. if(!$json['success']){return $this->apiError(__METHOD__,"返回错误:".json_encode($json));}
  77. return $json;
  78. }
  79. /**
  80. * 22-6-8 废弃接口
  81. *
  82. * @Deprecated
  83. * @param $amount
  84. * @param $created_at
  85. * @param $fee_collected
  86. * @param $goods_barcode
  87. * @param $goods_name
  88. * @param $logistic_name_return
  89. * @param $logistic_number
  90. * @param $logistic_number_return
  91. * @param $order_number
  92. * @param $quality_label
  93. * @param $sender_mobile
  94. * @param $sender_name
  95. * @return false
  96. */
  97. private function packSendToRemote($amount,$created_at,$fee_collected,$goods_barcode,
  98. $goods_name,$logistic_name_return,$logistic_number,$logistic_number_return,$order_number,
  99. $quality_label,$sender_mobile,$sender_name){
  100. if(env('api_faking')){
  101. app('LogService')->log(__METHOD__,'error_'.__FUNCTION__,'API FAKING');
  102. return false;
  103. }
  104. $data="{\"amount\":\"$amount\", \"created_at\":\"$created_at\", \"fee_collected\":\"$fee_collected\",
  105. \"goods_barcode\":\"$goods_barcode\", \"goods_name\":\"$goods_name\", \"logistic_name_return\":\"$logistic_name_return\",
  106. \"logistic_number\":\"$logistic_number\", \"logistic_number_return\":\"$logistic_number_return\",
  107. \"order_number\":\"$order_number\", \"quality_label\":\"$quality_label\", \"sender_mobile\":\"$sender_mobile\", \"sender_name\":\"$sender_name\"}";
  108. $sortParamsAndMd5=function(Array $params,$timestamp,$nonce,$signKey){
  109. $params=new Collection($params);
  110. $params=$params->sortKeys();
  111. $str='';
  112. $params->each(function($param,$key)use(&$str){
  113. $val=trim($param);
  114. if($val){
  115. $str .= $key.$val;
  116. }
  117. });
  118. return strtolower(md5($str.$timestamp.$nonce.$signKey));
  119. };
  120. $timestamp=intval(microtime(true)*1000);
  121. $nonce=md5(microtime(true));
  122. $sign=$sortParamsAndMd5(json_decode($data,true),$timestamp,$nonce,config('api.sign_key_rejected_send_jianshang'));
  123. $url=config('api.url_rejected_send_jianshang');
  124. $response=Zttp::withHeaders([
  125. 'sign'=>$sign,
  126. 'nonce'=>$nonce,
  127. 'timestamp'=>$timestamp,
  128. 'Content-Type'=>'application/json'
  129. ])->post($url,json_decode($data,true));
  130. app('LogService')->log(__METHOD__,__FUNCTION__,$data);
  131. if(!$response){
  132. app('LogService')->log(__METHOD__,'error_'.__FUNCTION__,'回复异常:'.$response->body());
  133. return false;
  134. }
  135. if(!$response->json()){
  136. app('LogService')->log(__METHOD__,'error_'.__FUNCTION__,'json为空:'.$response->body());
  137. return false;
  138. }
  139. return $response->json();
  140. }
  141. function sendRejected2(array $rejected){
  142. if(config('api.jianshang_rejecteds_log_switch'))Controller::logS(__METHOD__,__FUNCTION__,"发送笕尚接口,进入入口。退单号:{$rejected['logistic_number_return']}",Auth::user()['id']);
  143. $created_at = $rejected['created_at'] ?? '';
  144. $fee_collected = $rejected['fee_collected'] ?? '';
  145. $goodses=[];
  146. foreach ($rejected['goodses'] as $goods){
  147. $temGoods['amount']=$goods['amount'] ?? '';
  148. $temGoods['goods_barcode']=$goods['barcode_goods'] ?? '';
  149. $temGoods['goods_name']=$goods['name_goods'] ?? '';
  150. $temGoods['quality_label']=$goods['quality_label'] ?? '';
  151. $goodses[]=$temGoods;
  152. }
  153. $logistic_name_return = Logistic::nameById($rejected['id_logistic_return']);
  154. $logistic_number = $rejected['logistic_number'] ?? '';
  155. $logistic_number_return = $rejected['logistic_number_return'] ?? '';
  156. $order_number = $rejected['order_number'] ?? '';
  157. $sender_mobile = $rejected['mobile_sender'] ?? '';
  158. $sender_name = $rejected['sender'] ?? '';
  159. $json = $this->packSendToRemote2($created_at,$fee_collected,$goodses,
  160. $logistic_name_return,$logistic_number,$logistic_number_return,$order_number,
  161. $sender_mobile,$sender_name);
  162. if(config('api.jianshang_rejecteds_log_switch'))Controller::logS(__METHOD__,__FUNCTION__,"发送笕尚接口调度完成。退单号:{$rejected['logistic_number_return']}",Auth::user()['id']);
  163. if(!$json){
  164. if(config('api.jianshang_rejecteds_log_switch'))Controller::logS(__METHOD__,'error_'.__FUNCTION__,"发送笕尚接口异常,没有json返回。退单号:{$rejected['logistic_number_return']}",Auth::user()['id']);
  165. return 'fail';
  166. }else if(!isset($json['success'])||!$json['success']){
  167. if(strpos(json_encode($json),'已经接收过')!==false){
  168. return 'received';
  169. }
  170. if(config('api.jianshang_rejecteds_log_switch'))Controller::logS(__METHOD__,'error_'.__FUNCTION__,"发送笕尚接口错误。退单号:{$rejected['logistic_number_return']}。".json_encode($json),Auth::user()['id']);
  171. return 'fail';
  172. }
  173. if(!$json['goodses_feedback']){
  174. if(config('api.jianshang_rejecteds_log_switch'))Controller::logS(__METHOD__,'error_'.__FUNCTION__,"发送笕尚接口返回不全,没有商品信息返回(goodses)。退单号:{$rejected['logistic_number_return']}。".json_encode($json),Auth::user()['id']);
  175. }
  176. if(!$json['logistic_number_return']){
  177. if(config('api.jianshang_rejecteds_log_switch'))Controller::logS(__METHOD__,'error_'.__FUNCTION__,"发送笕尚接口返回不全,没有退回快递单号。退单号:{$rejected['logistic_number_return']}。".json_encode($json),Auth::user()['id']);
  178. }
  179. $storable = (function ()use($json) {
  180. if(count($json['goodses_feedback'])==0)return false;
  181. foreach ($json['goodses_feedback'] as $goods){
  182. if(!$goods['storable']){
  183. return false;
  184. }
  185. }
  186. return true;
  187. })();
  188. if(!$storable){
  189. if(config('api.jianshang_rejecteds_log_switch'))Controller::logS(__METHOD__,'error_'.__FUNCTION__,"发送笕尚接口提示,商品不可入库。退单号:{$rejected['logistic_number_return']}".json_encode($json),Auth::user()['id']);
  190. return 'none';
  191. }
  192. if(config('api.jianshang_rejecteds_log_switch'))Controller::logS(__METHOD__,__FUNCTION__,"发送笕尚接口完成,可入库,待其未来推单。退单号:{$rejected['logistic_number_return']}".json_encode($json),Auth::user()['id']);
  193. // $this->markItemsIsLoaded($json);
  194. return 'storable';
  195. }
  196. private function packSendToRemote2($created_at,$fee_collected,$goodses,
  197. $logistic_name_return,$logistic_number,$logistic_number_return,$order_number,
  198. $sender_mobile,$sender_name){
  199. foreach ($goodses as $goods){
  200. asort($goods);
  201. }
  202. $goodses = json_encode($goodses);
  203. $data="{\"created_at\":\"$created_at\", \"fee_collected\":\"$fee_collected\",
  204. \"goodses\":$goodses,\"logistic_name_return\":\"$logistic_name_return\",
  205. \"logistic_number\":\"$logistic_number\", \"logistic_number_return\":\"$logistic_number_return\",
  206. \"order_number\":\"$order_number\", \"sender_mobile\":\"$sender_mobile\", \"sender_name\":\"$sender_name\"}";
  207. $sortParamsAndMd5=function(Array $params,$timestamp,$nonce,$signKey){
  208. $params=new Collection($params);
  209. $params=$params->sortKeys();
  210. $str='';
  211. $params->each(function($param,$key)use(&$str){
  212. if(is_array($param)){return;
  213. // foreach ($param as &$paramValArr){
  214. // foreach ($paramValArr as &$paramVal){
  215. // $paramVal = trim($paramVal);
  216. // }
  217. // }
  218. // $param=json_encode($param);
  219. }
  220. $val=trim($param);
  221. if($val){
  222. $str .= $key.$val;
  223. }
  224. });
  225. $forSign = $str . $timestamp . $nonce . $signKey;
  226. return strtolower(md5($forSign));
  227. };
  228. if (!$data){
  229. app('LogService')->log(__METHOD__,'笕尚接口参数异常',json_encode(array($created_at,$fee_collected,$goodses,
  230. $logistic_name_return,$logistic_number,$logistic_number_return,$order_number,
  231. $sender_mobile,$sender_name)));
  232. return false;
  233. }
  234. $timestamp=intval(microtime(true)*1000);
  235. $nonce=md5(microtime(true));
  236. $sign=$sortParamsAndMd5(json_decode($data,true),$timestamp,$nonce,config('api.sign_key_rejected_send_jianshang'));
  237. app('LogService')->log(__METHOD__,'笕尚接口发送请求:',$data);
  238. $url=config('api.url_rejected_send_jianshang2');
  239. if(env('api_faking'))$url=url(config('api.fakingUrl_rejected_send_jianshang'));
  240. try{
  241. /** @var ZttpResponse $response */
  242. $response=Zttp::withHeaders([
  243. 'sign'=>$sign,
  244. 'nonce'=>$nonce,
  245. 'timestamp'=>$timestamp,
  246. 'Content-Type'=>'application/json'
  247. ])->post($url,json_decode($data,true));
  248. }catch (\Exception $e){
  249. app('LogService')->log(__METHOD__,'笕尚接口返回异常!!:',$e->getMessage().'||'.json_encode($data));
  250. $response=false;
  251. }
  252. if(!$response){
  253. app('LogService')->log(__METHOD__,'笕尚接口返回异常!!:',"沒有返回");
  254. return false;
  255. }
  256. app('LogService')->log(__METHOD__,'笕尚接口返回:',$response->body());
  257. return $response->json();
  258. }
  259. private function markItemsIsLoaded($json){
  260. $barcodes=[];
  261. foreach ($json['goodses_feedback'] as $goods){
  262. $barcodes[]=trim($goods['goods_barcode']);
  263. }
  264. $bill=RejectedBill::where('logistic_number_return',$json['logistic_number_return'])->first();
  265. $items=RejectedBillItem::where('id_rejected_bill',$bill['id'])->whereIn('barcode_goods',$barcodes)->get();
  266. $items->each(function(RejectedBillItem $item)use(&$json){
  267. foreach ($json['goodses_feedback'] as &$goods1){ //标记出有重复条码的商品,并且标记出其中是否同时有不能入库可和可以入库的
  268. $goods1['sameBarcode']=0;
  269. $goods1['hasUnStorable']=false;
  270. $goods1['hasStorable']=false;
  271. foreach ($json['goodses_feedback'] as &$goods2){
  272. if($goods1['goods_barcode']==$goods2['goods_barcode']){
  273. $goods1['sameBarcode']+=1;
  274. if(!$goods2['storable']){
  275. $goods1['hasUnStorable']=true;
  276. }else{
  277. $goods1['hasStorable']=true;
  278. }
  279. }
  280. }
  281. }
  282. foreach ($json['goodses_feedback'] as $goods){
  283. if($item['barcode_goods']==$goods['goods_barcode']){
  284. $item['is_loaded'] = $goods['storable']==='true'|| $goods['storable']===true ? '已入库':'未入库';
  285. if($goods['sameBarcode']>1){//如果该条码有不止一件,并且同时拥有入库和不入库的,就按品质标签来区分入库与否(因为回传不带是否正品消息,也没有ID)
  286. if($goods['hasUnStorable']&&$goods['hasStorable']){
  287. if($item['id_quality_label']==1){
  288. $item['is_loaded'] ='已入库';
  289. }else{
  290. $item['is_loaded'] ='未入库';
  291. }
  292. }
  293. }
  294. $item->update();
  295. }
  296. }
  297. });
  298. return $bill;
  299. }
  300. }