SoapController.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. <?php
  2. namespace Modules\Order\Http\Controllers;
  3. use App\Handlers\ExpressHandler;
  4. use App\Imports\ExpressImport;
  5. use Modules\Order\Events\CustomerSendSmsEvent;
  6. use Modules\Order\Events\SoapSendSmsEvent;
  7. use App\Models\Soap;
  8. use App\Models\User;
  9. use App\Models\Warea;
  10. use Carbon\Carbon;
  11. use EasyWeChat\Factory;
  12. use Illuminate\Http\Request;
  13. use Illuminate\Support\Facades\Auth;
  14. use Illuminate\Support\Facades\DB;
  15. use Illuminate\Support\Facades\Log;
  16. use Maatwebsite\Excel\Facades\Excel;
  17. class SoapController extends Controller
  18. {
  19. /**获取购买肥皂列表**/
  20. public function GetSoapList(Request $request){
  21. $page_index=$request->input('page_index',1);
  22. $page_size=$request->input('page_size',20);
  23. $num=($page_index-1)*$page_size;
  24. $search_name=$request->input('search_name');
  25. $express_status=$request->input('express_status')??-1;
  26. $status=$request->input('status')??-1;
  27. $order_num=$request->input('order_num')??null;
  28. $express_num=$request->input('express_num')??null;
  29. $tab_num=$request->input('tab_num');
  30. $re=Soap::query();
  31. if (Auth::user()->role_id==23){
  32. $warea_id=Warea::where('admin_id',Auth::user()->id)->value('id');
  33. $re->where('warea_id',$warea_id);
  34. }
  35. if ($order_num){
  36. $re->where('order_num','like','%'.$order_num.'%');
  37. }
  38. if ($tab_num==1){
  39. $re->where('is_pay',0)->where('order_end','>',Carbon::now());
  40. }elseif ($tab_num==2){
  41. $re->where('is_pay',1)->whereNull('is_refund')->where('express_status',0);
  42. }elseif ($tab_num==3){
  43. $re->where('is_pay',1)->whereNull('is_refund')->where('express_status',1);
  44. }elseif ($tab_num==4){
  45. $re->where('is_pay',1)->whereNull('is_refund')->where('express_status',2);
  46. }elseif ($tab_num==5){
  47. $re->where('is_pay',1)->where('is_refund',1);
  48. }
  49. // if ($express_status>0){
  50. // $re->where('express_status',$express_status);
  51. // }
  52. if ($express_num){
  53. $re->where('express_num',$express_num);
  54. }
  55. if($status>0){
  56. $re->where('status',$status);
  57. }
  58. if ($search_name){
  59. $user_ids=User::where('mobile','like','%'.$search_name.'%')->orwhere('nickname','like',"%$search_name%")
  60. ->orwhere('realname','like',"%$search_name%")->pluck('id');
  61. $re->whereIn('user_id',$user_ids);
  62. }
  63. $count=$re->count();
  64. $data=$re->where('is_deleted',0)->with(['user:mobile,id,nickname,level'])->with(['warea'])->orderByDesc('id')->take($page_size)->skip($num)->get();
  65. return $this->success_list($data,'',$count);
  66. }
  67. /**导出订单信息***/
  68. public function ExportSoapInfo(Request $request){
  69. $search_name=$request->input('search_name');
  70. $express_status=$request->input('express_status')??-1;
  71. $order_num=$request->input('order_num')??null;
  72. $express_num=$request->input('express_num')??null;
  73. $tab_num=$request->input('tab_num')??null;
  74. $id_all=$request->input('id_arr',[]);
  75. $re=Soap::query();
  76. if (Auth::user()->role_id==23){
  77. $warea_id=Warea::where('admin_id',Auth::user()->id)->value('id');
  78. $re->where('warea_id',$warea_id);
  79. }
  80. if ($id_all){
  81. $data=$re->whereIn('id',$id_all)->with(['user:mobile,id,nickname,level'])->orderByDesc('id')->get();
  82. return $this->success($data);
  83. }
  84. if ($order_num){
  85. $re->where('order_num','like','%'.$order_num.'%');
  86. }
  87. if ($tab_num==1){
  88. $re->where('is_pay',0)->whereNull('is_refund')->where('order_end','>',Carbon::now());
  89. }elseif ($tab_num==2){
  90. $re->where('is_pay',1)->whereNull('is_refund')->where('express_status',0);
  91. }elseif ($tab_num==3){
  92. $re->where('is_pay',1)->whereNull('is_refund')->where('express_status',1);
  93. }elseif ($tab_num==4){
  94. $re->where('is_pay',1)->whereNull('is_refund')->where('express_status',2);
  95. }
  96. // if ($express_status>0){
  97. // $re->where('express_status',$express_status);
  98. // }
  99. if ($express_num){
  100. $re->where('express_num',$express_num);
  101. }
  102. if ($search_name){
  103. $user_ids=User::where('mobile','like','%'.$search_name.'%')->orwhere('nickname','like',"%$search_name%")
  104. ->orwhere('realname','like',"%$search_name%")->pluck('id');
  105. $re->whereIn('user_id',$user_ids);
  106. }
  107. $data=$re->where('status',1)->where('is_deleted',0)->with(['user:mobile,id,nickname,level'])->orderByDesc('id')->get();
  108. return $this->success($data);
  109. }
  110. /**政委审核*/
  111. public function UpdateStatus(Request $request){
  112. $status=$request->input('status');
  113. if ($status==0){
  114. $id=[$request->input('id')];
  115. }else{
  116. $id=$request->input('id');
  117. }
  118. $re=Soap::whereIn('id',$id)->update(['status'=>$request->input('status')]);
  119. return $this->success([]);
  120. }
  121. public function UpdateAllStatus(Request $request){
  122. Soap::where('is_pay',1)->update(['status'=>1]);
  123. return $this->success([]);
  124. }
  125. /*
  126. * 修改信息
  127. * ***/
  128. public function UpdateInfo(Request $request){
  129. $re=Soap::find($request->input('id'));
  130. $re->province=$request->input('province');
  131. $re->city=$request->input('city');
  132. $re->area=$request->input('area');
  133. $re->address=$request->input('address');
  134. $re->user_name=$request->input('user_name');
  135. $re->mobile=$request->input('mobile');
  136. $re->save();
  137. return $this->success([]);
  138. }
  139. /*
  140. *快递公司简称
  141. */
  142. public function GetExpressInfo(){
  143. $express_name=['顺丰速运', '百世快递', '中通快递', '申通快递', '圆通速递', '韵达速递', '邮政快递包裹', 'EMS', '京东快递', '优速快递', '德邦快递', '极兔速递', '众邮快递', '宅急送'];
  144. $express_code=['SF', 'HTKY', 'ZTO', 'STO', 'YTO', 'YD', 'YZPY', 'EMS', 'JD', 'UC', 'DBL', 'JTSD', 'ZYE', 'ZJS'];
  145. $data=[];
  146. foreach ($express_name as $k=>$v){
  147. $data[$express_code[$k]]=$v;
  148. }
  149. return $this->success($data);
  150. }
  151. /**上传单个物流信息**/
  152. public function Express(Request $request){
  153. $re=Soap::find($request->input('id'));
  154. $re->express_num=$request->input('express_num');
  155. $re->express_status=1;
  156. $re->express_company=$request->input('express_company');
  157. $re->express_code=$request->input('express_code');
  158. $data=[
  159. 'mobile'=>$re->mobile,
  160. 'express_com'=>$re->express_company,
  161. 'express_num'=>$re->express_num,
  162. 'status'=>0
  163. ];
  164. event(new SoapSendSmsEvent($data));
  165. $re->save();
  166. return $this->success([]);
  167. }
  168. /**上传物流**/
  169. public function UploadExpress(Request $request){
  170. $file = $request->file('file');
  171. if ( !$file->isValid()) { //判断文件是否有效
  172. return redirect()
  173. ->back()
  174. ->withErrors('文件上传失败,请重新上传');
  175. }
  176. $array = Excel::toArray(new ExpressImport, request()->file('file'));
  177. if(count($array)>5001){
  178. return $this->error('450001',"单次最多导入5000条数据");
  179. }
  180. $one = array_shift($array[0]);
  181. $express_num_keys=array_search('快递单号',$one);
  182. if(!$express_num_keys && !is_numeric($express_num_keys)){
  183. return $this->error('450001',"表头无'快递单号'字段");
  184. }
  185. $order_num_keys=array_search('订单号',$one);
  186. if(!$order_num_keys && !is_numeric($order_num_keys)){
  187. return $this->error('450001',"表头无'快递单号'字段");
  188. }
  189. $express_com_keys=array_search('快递公司',$one);
  190. if(!$express_com_keys){
  191. return $this->error('450001',"表头无'快递公司'字段");
  192. }
  193. $express_code_keys=array_search('快递公司代码',$one);
  194. if(!$express_code_keys){
  195. return $this->error('450001',"表头无'快递公司代码'字段");
  196. }
  197. $arr=$array[0];
  198. $express_nums=array_column($arr,$express_num_keys);
  199. $unique_express_nums=array_unique($express_nums);
  200. $que_express_nums=array_diff_assoc($express_nums,$unique_express_nums);
  201. if(count($que_express_nums)>0){
  202. $que_express_str=implode(',',$que_express_nums);
  203. return $this->error('450001','快递单号'.$que_express_str.'重复出现');
  204. }
  205. $new_arr=[];
  206. $new_arrs=[];
  207. $z=0;
  208. foreach ($array[0] as $k=>$v){
  209. $st='';
  210. if ($v[$express_com_keys]=='中通快递'){
  211. $patterns = "/\d+/";
  212. preg_match_all($patterns,$v[$express_num_keys],$aa);
  213. foreach ($aa[0] as $kee=>$vaa){
  214. $st.=$vaa;
  215. }
  216. $new_arr[$z]=$st;
  217. }else{
  218. $new_arr[$z]=$v[$express_num_keys];
  219. }
  220. $new_arrs[$z]=$v[$order_num_keys];
  221. $z++;
  222. }
  223. $res=Soap::whereIn('express_num',$new_arr)->pluck('express_num')->toArray();
  224. if (count($res)>0){
  225. $ar_r=array_intersect($new_arr,$res);
  226. $que_express_str=implode(',',$ar_r);
  227. return $this->error('450001','快递单号:'.$que_express_str.'已经上传',$ar_r);
  228. }
  229. $order_arr=Soap::whereIn('order_num',$new_arrs)->whereNotNull('express_num')->pluck('order_num')->toArray();
  230. if ($order_arr){
  231. return $this->error(500214,implode(',',$order_arr).'已经上传过快递单号,请核实数据');
  232. }
  233. DB::beginTransaction();
  234. try {
  235. foreach ($arr as $k=>$v){
  236. $order_num=$v[$order_num_keys];
  237. $order_info=Soap::where('order_num',$order_num)->first();
  238. if (!$order_info){
  239. return $this->error(20014,'申请单号:'.$order_num.'不存在');
  240. }
  241. $st='';
  242. if ($v[$express_com_keys]=='中通快递'){
  243. $patterns = "/\d+/";
  244. preg_match_all($patterns,$v[$express_num_keys],$aa);
  245. foreach ($aa[0] as $kee=>$vaa){
  246. $st.=$vaa;
  247. }
  248. $order_info->express_num=$st;
  249. }else{
  250. $order_info->express_num=$v[$express_num_keys];
  251. }
  252. $order_info->express_company=$v[$express_com_keys];
  253. $order_info->express_code=$v[$express_code_keys];
  254. $order_info->express_time=Carbon::now();
  255. $order_info->express_status=1;
  256. if (!$order_info->save()){
  257. throw new \Exception(1);
  258. }
  259. }
  260. DB::commit();
  261. /**发送 快递信息*/
  262. foreach ($arr as $k=>$v){
  263. $apply_info=Soap::where('order_num',$v[$order_num_keys])->first();
  264. $data=[
  265. 'mobile'=>$apply_info->mobile,
  266. 'express_com'=>$apply_info->express_company,
  267. 'express_num'=>$apply_info->express_num,
  268. 'status'=>0
  269. ];
  270. event(new SoapSendSmsEvent($data));
  271. }
  272. return $this->success([]);
  273. }catch (\Exception $exception){
  274. DB::rollBack();
  275. return $this->error(500214,$exception->getMessage());
  276. }
  277. }
  278. /**获取物流轨迹**/
  279. public function ExpressSearch(Request $request,ExpressHandler $expressHandler){
  280. $express=Soap::find($request->id);
  281. if (!$express){
  282. return $this->error(40011,'','该物流订单不存在');
  283. }
  284. if ($express->express_status==2){
  285. return $this->success(json_decode($express->express_info));
  286. }else{
  287. $re=$expressHandler->search($express->express_num,$express->express_code);
  288. $re=(array)$re;
  289. if ($re['State']==3){
  290. DB::beginTransaction();
  291. try{
  292. $express->express_info=json_encode($re);
  293. $express->express_status=2;
  294. $express->save();
  295. DB::commit();
  296. }catch (\Exception $exception){
  297. Log::error('-------物流信息保存出错--------'.$exception);
  298. DB::rollBack();
  299. }
  300. }
  301. return $this->success($re);
  302. }
  303. }
  304. /*
  305. * 获取各个数量
  306. * **/
  307. public function GetTabNum(){
  308. $total=Soap::where('is_deleted',0)->count();
  309. $total_1=Soap::where('is_deleted',0)->whereNull('is_refund')->where('is_pay',0)->where('order_end','>',Carbon::now())->count();
  310. $total_2=Soap::where('is_deleted',0)->whereNull('is_refund')->where('is_pay',1)->where('express_status',0)->count();
  311. $total_3=Soap::where('is_deleted',0)->where('is_pay',1)->whereNull('is_refund')->where('express_status',1)->count();
  312. $total_4=Soap::where('is_deleted',0)->where('is_pay',1)->whereNull('is_refund')->where('express_status',2)->count();
  313. return $this->success(['all'=>$total,'no_pay'=>$total_1,'no_send'=>$total_2,'no_complete'=>$total_3,'end'=>$total_4]);
  314. }
  315. /**修改物流**/
  316. public function UpdateSoapExpressInfo(Request $request){
  317. $file = $request->file('file');
  318. if ( !$file->isValid()) { //判断文件是否有效
  319. return redirect()
  320. ->back()
  321. ->withErrors('文件上传失败,请重新上传');
  322. }
  323. $array = Excel::toArray(new ExpressImport, request()->file('file'));
  324. if(count($array)>5001){
  325. return $this->error('450001',"单次最多导入5000条数据");
  326. }
  327. $one = array_shift($array[0]);
  328. $express_num_keys=array_search('旧快递单号',$one);
  329. if(!$express_num_keys && !is_numeric($express_num_keys)){
  330. return $this->error('450001',"表头无'旧快递单号'字段");
  331. }
  332. $new_express_num_keys=array_search('新快递单号',$one);
  333. if(!$express_num_keys && !is_numeric($express_num_keys)){
  334. return $this->error('450001',"表头无'新快递单号'字段");
  335. }
  336. $express_com_keys=array_search('快递公司',$one);
  337. if(!$express_com_keys){
  338. return $this->error('450001',"表头无'快递公司'字段");
  339. }
  340. $express_code_keys=array_search('快递公司代码',$one);
  341. if(!$express_code_keys){
  342. return $this->error('450001',"表头无'快递公司代码'字段");
  343. }
  344. $arr=$array[0];
  345. $express_nums=array_column($arr,$express_num_keys);
  346. $unique_express_nums=array_unique($express_nums);
  347. $que_express_nums=array_diff_assoc($express_nums,$unique_express_nums);
  348. if(count($que_express_nums)>0){
  349. $que_express_str=implode(',',$que_express_nums);
  350. return $this->error('450001','快递单号'.$que_express_str.'重复出现');
  351. }
  352. DB::beginTransaction();
  353. try {
  354. foreach ($arr as $k=>$v){
  355. $apply_info=Soap::where('express_num',$v[$express_num_keys])->first();
  356. if (!$apply_info){
  357. return $this->error(20014,'申请单号:'.$v[$express_num_keys].'不存在');
  358. }
  359. $st='';
  360. if ($v[$express_com_keys]=='中通快递'){
  361. $patterns = "/\d+/";
  362. preg_match_all($patterns,$v[$new_express_num_keys],$aa);
  363. foreach ($aa[0] as $kee=>$vaa){
  364. $st.=$vaa;
  365. }
  366. $apply_info->express_num=$st;
  367. }else{
  368. $apply_info->express_num=$v[$new_express_num_keys];
  369. }
  370. $apply_info->express_company=$v[$express_com_keys];
  371. $apply_info->express_code=$v[$express_code_keys];
  372. $apply_info->express_time=Carbon::now();
  373. $apply_info->express_status=1;
  374. if (!$apply_info->save()){
  375. throw new \Exception(1);
  376. }
  377. }
  378. DB::commit();
  379. // /**发送 快递信息*/
  380. // foreach ($arr as $k=>$v){
  381. // $apply_info=Soap::where('express_num',$v[$new_express_num_keys])->first();
  382. // $data=[
  383. // 'mobile'=>$apply_info->customer_phone,
  384. // 'express_com'=>$apply_info->express_com,
  385. // 'express_num'=>$apply_info->express_num,
  386. // 'status'=>1,
  387. // 'old_express_num'=>$v[$express_num_keys]
  388. // ];
  389. // try {
  390. // event(new CustomerSendSmsEvent($data));
  391. // }catch (\Exception $exception){
  392. //
  393. // }
  394. // }
  395. return $this->success([]);
  396. }catch (\Exception $exception){
  397. DB::rollBack();
  398. return $this->error(500214,$exception->getMessage());
  399. }
  400. }
  401. /*
  402. * 点击退款
  403. * **/
  404. public function Refund(Request $request){
  405. $re=Soap::find($request->input('id'));
  406. if ($re){
  407. $options=$this->options();
  408. $payment=Factory::payment($options);
  409. $number=time().$re->user_id.random_int(11111,99999);
  410. // 参数分别为:商户订单号、商户退款单号、订单金额、退款金额、其他参数
  411. $result = $payment->refund->byOutTradeNumber($re->enroll_no, $number, $re->cost*100, $re->cost*100, [
  412. // 可在此处传入其他参数,详细参数见微信支付文档
  413. 'refund_desc' => $request->input('refund_desc'),
  414. 'notify_url'=>'https://api.admin.app.jiuweiyun.cn/api/soap/RefoundMessage'
  415. ]);
  416. $re->refund_cause=$request->input('refund_desc');
  417. $re->op_name=Auth::user()->name;
  418. $re->is_refund=1;
  419. $re->save();
  420. }
  421. return $this->success([]);
  422. }
  423. public function RefundMessage(Request $request){
  424. $options = $this->options();
  425. $payment = Factory::payment($options);
  426. $response = $payment->handleRefundedNotify(function ($message, $reqInfo, $fail){
  427. $out_trade_no = $reqInfo['out_trade_no']; // 商户订单号
  428. $out_refund_no = $reqInfo['out_refund_no']; // 微信支付退款订单号
  429. $order = Soap::where('enroll_no', '=', $out_trade_no)->first();
  430. if (empty($order)) {
  431. return true; // 告诉微信,我已经处理完了,订单没找到,别再通知我了
  432. }
  433. if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
  434. // 用户是否支付成功
  435. if ($reqInfo['refund_status'] === 'SUCCESS') {
  436. $enroll = Soap::where('enroll_no', '=', $out_trade_no)->first();
  437. $enroll->is_refund = 1;
  438. $enroll->refund_num = $out_refund_no;
  439. $enroll->refund_time = Carbon::now()->toDateTimeString();
  440. $enroll->save();
  441. }
  442. } else {
  443. return $fail('通信失败,请稍后再通知我');
  444. }
  445. return true;
  446. });
  447. return $response;
  448. }
  449. protected function options(){
  450. return [
  451. 'app_id' => config('wechat.payment.daweiboshi.app_id'),//config('wechat.payment.default.app_id'),
  452. 'mch_id' => config('wechat.payment.daweiboshi.mch_id'),
  453. 'sub_mch_id' => '',
  454. 'key' => config('wechat.payment.daweiboshi.key'),
  455. 'notify_url' =>'',
  456. // 'notify_url' =>url('api/pay/message'),
  457. 'cert_path' =>config('wechat.payment.daweiboshi.cert_path'),
  458. 'key_path' =>config('wechat.payment.daweiboshi.key_path'),
  459. ];
  460. }
  461. }