RefundController.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Events\AuthRefundTip;
  4. use App\Events\CancelOrderEvent;
  5. use App\Http\Controllers\Controller;
  6. use App\Models\AgentNo;
  7. use App\Models\Comment;
  8. use App\Models\DwbsUser;
  9. use App\Models\DwbsWarea;
  10. use App\Models\Goods;
  11. use App\Models\OrderDetailW;
  12. use App\Models\OrderW;
  13. use App\Models\Store;
  14. use App\Models\StoreGoods;
  15. use App\Models\User;
  16. use App\Models\Order;
  17. use App\Models\OrderDetail;
  18. use App\Models\OrderRefund;
  19. use App\Models\OrderRefundStatus;
  20. use App\Models\UserW;
  21. use App\Models\Admin;
  22. use Illuminate\Http\Request;
  23. use Illuminate\Support\Facades\Auth;
  24. use Illuminate\Support\Facades\Log;
  25. use Illuminate\Support\Facades\DB;
  26. use Illuminate\Support\Facades\Validator;
  27. class RefundController extends Controller
  28. {
  29. //获取所有退货订单
  30. public function getRefundOrder(Request $request)
  31. {
  32. $page_index=$request->input('page_index');
  33. $page_size=$request->input('page_size');
  34. $user_search=$request->input('user_search');
  35. $store_search=$request->input('store_search');
  36. $refund_no=$request->input('refund_no');
  37. $order_no=$request->input('order_no');
  38. $num=$page_size*($page_index-1);
  39. $status=$request->input('status');
  40. $admin_id=Auth::user()->id;
  41. $admin=Admin::where('id',$admin_id)->first();
  42. if($admin && in_array($admin->role_id,[22,24])){//超级管理员
  43. $data=OrderRefund::with(['user:id,avatar,nickname,phone','store:id,name,phone','order:order_no,express_receive_time']);
  44. }else{
  45. $warea_ids=DwbsWarea::where('admin_id',$admin_id)->pluck('id');
  46. $agent_ids=DwbsUser::whereIn('warea_id',$warea_ids)->pluck('id');
  47. $store_ids=Store::whereIn('user_id',$agent_ids)->pluck('id');
  48. $data=OrderRefund::whereIn('store_id',$store_ids)
  49. ->with(['user:id,avatar,nickname,phone','store:id,name,phone','order:order_no,express_receive_time']);
  50. }
  51. if($status!='all'){
  52. $data->where('status',$status);
  53. }
  54. if($refund_no){
  55. $data->where('refund_no','like','%'.$refund_no.'%');
  56. }
  57. if($order_no){
  58. $data->where('order_no','like','%'.$order_no.'%');
  59. }
  60. if($user_search){
  61. $user_ids=User::where('phone','like','%'.$user_search.'%')
  62. ->orWhere('nickname','like','%'.$user_search.'%')->pluck('id');
  63. $data->whereIn('user_id',$user_ids);
  64. }
  65. if($store_search){
  66. $store_ids=Store::where('phone','like','%'.$store_search.'%')
  67. ->orWhere('name','like','%'.$store_search.'%')->pluck('id');
  68. $data->whereIn('store_id',$store_ids);
  69. }
  70. $count=$data->count();
  71. $list=$data->orderBy('id','desc')->skip($num)->take($page_size)->get();
  72. $wareas=DwbsWarea::pluck('name','id');
  73. $services=DwbsWarea::pluck('admin_name','id');
  74. $user_ids=Store::pluck('user_id');
  75. $store_user_ids=Store::pluck('user_id','id');
  76. $warea_user_ids=DwbsUser::whereIn('id',$user_ids)->pluck('warea_id','id');
  77. foreach($list as $key=>$val){
  78. $user_id=$store_user_ids[$val->store_id];
  79. $warea_id=$warea_user_ids[$user_id];
  80. $list[$key]->warea=$wareas[$warea_id];
  81. $list[$key]->service=$services[$warea_id];
  82. }
  83. return $this->success_list($list,'成功',$count);
  84. }
  85. //判断是否穿过
  86. public function isWear(Request $request){
  87. $refund_id=$request->input('refund_id');
  88. $is_wear=$request->input('is_wear');
  89. $refund=OrderRefund::where('id',$refund_id)->first();
  90. $refund->is_wear=$is_wear;
  91. $res=$refund->save();
  92. if($res){
  93. return $this->success([]);
  94. }else{
  95. return $this->error();
  96. }
  97. }
  98. //同意?退货:驳回
  99. public function agreeRefund(Request $request)
  100. {
  101. $refund_id=$request->input('refund_id');
  102. $refund=OrderRefund::where('id',$refund_id)->first();
  103. if(empty($refund)){
  104. return $this->error('450001','退货单不存在,刷新后重试');
  105. }
  106. $order=Order::where('order_no',$refund->order_no)->first();
  107. if(empty($order) || $order->status < 3){
  108. return $this->error('450001','该订单未收货,不能进行退货审核');
  109. }
  110. $is_agree=$request->input('is_agree');
  111. try{
  112. DB::transaction(function()use($request,$refund,$refund_id,$is_agree){
  113. if($is_agree == 1){
  114. OrderRefund::where('id',$refund_id)->update(['status'=>1,'auth_at'=>date("Y-m-d H:i:s")]);
  115. $order_refund=OrderRefund::where('id',$refund_id)->first();
  116. $refund_total=OrderRefund::where('order_no',$order_refund->order_no)->where('status',1)->sum('total');
  117. $order=Order::where('order_no',$order_refund->order_no)->first();
  118. $order_total=$order->total;
  119. if($refund_total >= $order_total){//全部退货
  120. Order::where('order_no',$order_refund->order_no)->update(['is_refund'=>3]);
  121. }else{//部分退货
  122. Order::where('order_no',$order_refund->order_no)->update(['is_refund'=>2]);
  123. }
  124. // if($order_total - $refund_total < 2){
  125. //判断是否剥夺vip
  126. // if($order->vip==1){
  127. // $orders=Order::where('user_id',$order->user_id)
  128. // ->where('store_id',$order->store_id)
  129. // ->where('is_pay',1)
  130. // ->whereIn('apply_cancel',[0,1,3])
  131. // ->whereIn('is_refund',[0,1])
  132. // ->where('total','>=',2)
  133. // ->where('created_at','>',$order->created_at)
  134. // ->orderBy('created_at')->get();
  135. // if(count($orders)>=1){
  136. // Order::where('id',$orders[0]->id)->update([
  137. // 'vip'=>1
  138. // ]);
  139. // }else{
  140. // User::where('id',$order->user_id)->update([
  141. // 'is_vip'=>0
  142. // ]);
  143. // }
  144. // }
  145. // }
  146. //同意退货通知用户
  147. $user=User::where('id',$refund->user_id)->first();
  148. if($user->openId){
  149. $data['openid']=$user->openId;
  150. $data['data']=[
  151. 'first' => '您的退货订单'.$refund->refund_no.'已审核通过',
  152. 'keyword1' => $refund->order_no,
  153. 'keyword2' => '退款金额:'.number_format($refund->account, 2)
  154. ];
  155. event(new AuthRefundTip($data));
  156. }
  157. //同意退货通知代理
  158. $store=Store::where('id',$refund->store_id)->first();
  159. $user=DwbsUser::where('id',$store->user_id)->first();
  160. if($user->openid){
  161. $data['openid']=$user->openid;
  162. $data['data']=[
  163. 'first' => '您的用户【'.$user->nickname.'】的退货订单'.$refund->refund_no.'已由政委审核成功',
  164. 'keyword1' => $refund->order_no,
  165. 'keyword2' => '退款金额:'.number_format($refund->account, 2)
  166. ];
  167. event(new AuthRefundTip($data));
  168. }
  169. }else{
  170. $remark=$request->input('remark');
  171. Order::where('order_no',$refund->order_no)->update(['is_refund'=>0]);//被驳回
  172. OrderRefund::where('id',$refund_id)->update(['status'=>2,'remark'=>$remark,'auth_at'=>date("Y-m-d H:i:s")]);
  173. //不同意退货通知用户
  174. $user=User::where('id',$refund->user_id)->first();
  175. if($user && $user->openId){
  176. $data['openid']=$user->openId;
  177. $data['data']=[
  178. 'first' => '您的退货订单'.$refund->refund_no.'审核被驳回',
  179. 'keyword1' => $refund->order_no,
  180. 'keyword2' => '退款金额:'.number_format($refund->account,2)
  181. ];
  182. event(new AuthRefundTip($data));
  183. }
  184. }
  185. },5);
  186. return $this->success([]);
  187. }catch(\Exception $e){
  188. return $this->error('450001',$e->getMessage());
  189. }
  190. }
  191. //获取退货订单详情
  192. public function getRefundOrderDetail(Request $request){
  193. $refund_no=$request->input('refund_no');
  194. $refund_order = OrderRefund::with(['store:id,name,img,phone'])->where('refund_no', $refund_no)->first();
  195. $goods_ids = OrderDetail::where('order_no', $refund_no)->groupBy('goods_id')->pluck('goods_id');
  196. $goods = [];
  197. foreach ($goods_ids as $key => $val) {
  198. $goods[$key] = Goods::where('id', $val)->first();
  199. $goods[$key]->sku = OrderDetail::where('order_no', $refund_no)->where('goods_id', $val)->get();
  200. }
  201. $refund_order->goods = $goods;
  202. return $this->success($refund_order);
  203. }
  204. //设置政委收货地址
  205. //添加政委收货地址
  206. //获取原始订单代理关系图
  207. public function getOrderAgentContact(Request $request)
  208. {
  209. $refund_no=$request->input('refund_no');
  210. $refund=OrderRefund::where('refund_no',$refund_no)->first();
  211. $agents=AgentNo::where('order_no',$refund->order_no)->orderByDesc('level')->get();
  212. foreach($agents as $key=>$val){
  213. $refund_details=OrderDetail::with('goods')->where('order_no',$refund_no)->get();
  214. $order_refund=OrderRefundStatus::where('refund_no',$refund_no)->where('level',$val->level)->first();
  215. if($order_refund){
  216. $agents[$key]->is_finish=$order_refund->status;
  217. $agents[$key]->remark=$order_refund->remark;
  218. }else{
  219. $agents[$key]->is_finish=0;
  220. }
  221. foreach($refund_details as $k=>$v){
  222. if($val->level==3){
  223. $agents[$key]->account += $v->num * $v->goods->crown_price;
  224. }
  225. if($val->level==2){
  226. $agents[$key]->account += $v->num * $v->goods->top_price;
  227. }
  228. if($val->level==1){
  229. $agents[$key]->account += $v->num * $v->goods->super_price;
  230. }
  231. }
  232. }
  233. $user=User::where('id',$agents[0]->user_id)->select('nickname','phone')->first();
  234. Log::info($agents[0]->user_id);
  235. Log::info(json_encode($user));
  236. Log::info($refund->account);
  237. $user->account=$refund->account;
  238. $data['order_no']=$refund->order_no;
  239. $data['list']=$agents;
  240. $data['user']=$user;
  241. return $this->success($data);
  242. }
  243. //修改代理关系昵称手机号信息
  244. public function changeAgentContactInfo(Request $request)
  245. {
  246. $id=$request->input('id');
  247. $nickname=$request->input('nickname');
  248. $phone=$request->input('phone');
  249. $rules=[
  250. 'nickname'=>'required|max:32',
  251. 'phone'=>'required|regex:/^1[3456789][0-9]{9}$/',
  252. ];
  253. $message=[
  254. 'nickname.required'=>'代理昵称不能为空.',
  255. 'nickname.max'=>'代理昵称不能大于32个字符.',
  256. 'phone.required'=>'代理手机号不能为空.',
  257. 'phone.regex'=>'代理手机号格式有误.',
  258. ];
  259. $validator = Validator::make($request->input(),$rules,$message);
  260. if($validator->fails()){
  261. return $this->error('400013',$validator->errors()->first());
  262. }
  263. $res=AgentNo::where('id',$id)->update([
  264. 'nickname'=>$nickname,
  265. 'phone'=>$phone,
  266. ]);
  267. if($res){
  268. return $this->success([]);
  269. }else{
  270. return $this->error();
  271. }
  272. }
  273. //删除代理关系
  274. public function deleteAgentContact(Request $request)
  275. {
  276. $id=$request->input('id');
  277. $refund_no=$request->input('refund_no');
  278. $agentNo=AgentNo::where('id',$id)->first();
  279. $count=AgentNo::where('order_no',$agentNo->order_no)->count();
  280. if($count==1){
  281. return $this->error('450001','该代理不能删除');
  282. }
  283. try{
  284. DB::transaction(function()use($agentNo,$refund_no){
  285. $agentNo->delete();
  286. OrderRefundStatus::where('refund_no',$refund_no)->where('level',$agentNo->level)->delete();
  287. $count_agent=AgentNo::where('order_no',$agentNo->order_no)->count();
  288. $count_refund_status=OrderRefundStatus::where('refund_no',$refund_no)->count();
  289. if($count_agent==$count_refund_status){
  290. $order_refund=OrderRefund::where('refund_no',$refund_no)->first();
  291. if($order_refund->is_end!=1){
  292. $order_refund->is_end=1;
  293. $order_refund->end_at=date("Y-m-d H:i:s");
  294. $order_refund->save();
  295. }
  296. }else{
  297. $order_refund=OrderRefund::where('refund_no',$refund_no)->first();
  298. if($order_refund->is_end==1){
  299. $order_refund->is_end=0;
  300. $order_refund->end_at=date("Y-m-d H:i:s");
  301. $order_refund->save();
  302. }
  303. }
  304. },5);
  305. return $this->success([]);
  306. }catch(\Exception $e){
  307. return $this->error('450001',$e->getMessage());
  308. }
  309. }
  310. //获取代理信息
  311. public function getAgentInfo(Request $request)
  312. {
  313. $phone=$request->input('phone');
  314. $agent=DwbsUser::where('mobile',$phone)->select('id','nickname','mobile','level')->first();
  315. if(!empty($agent)){
  316. return $this->success($agent);
  317. }else{
  318. return $this->error('450001','代理不存在');
  319. }
  320. }
  321. //添加代理关系代理
  322. public function addAgentContact(Request $request)
  323. {
  324. $order_no = $request->input('order_no');
  325. $refund_no = $request->input('refund_no');
  326. $nickname = $request->input('nickname');
  327. $level = $request->input('level');
  328. $phone = $request->input('phone');
  329. $rules=[
  330. 'nickname'=>'required|max:32',
  331. 'phone'=>'required|regex:/^1[3456789][0-9]{9}$/',
  332. ];
  333. $message=[
  334. 'nickname.required'=>'代理昵称不能为空.',
  335. 'nickname.max'=>'代理昵称不能大于32个字符.',
  336. 'phone.required'=>'代理手机号不能为空.',
  337. 'phone.regex'=>'代理手机号格式有误.',
  338. ];
  339. $validator = Validator::make($request->input(),$rules,$message);
  340. if($validator->fails()){
  341. return $this->error('400013',$validator->errors()->first());
  342. }
  343. $count = AgentNo::where('order_no', $order_no)->count();
  344. if ($count == 3) {
  345. return $this->error('450001', '代理关系已达上限,不能添加');
  346. }
  347. $agent=AgentNo::where('order_no', $order_no)->where('level',$level)->first();
  348. if($agent){
  349. return $this->error('450001', '该等级代理已存在,不能添加');
  350. }
  351. try{
  352. DB::transaction(function()use($order_no,$nickname,$level,$phone,$refund_no){
  353. $order = Order::where('order_no', $order_no)->first();
  354. $data['order_no'] = $order_no;
  355. $data['user_id'] = $order->user_id;
  356. $data['nickname'] = $nickname;
  357. $data['level'] = $level;
  358. $data['phone'] = $phone;
  359. AgentNo::create($data);
  360. $count_agent=AgentNo::where('order_no',$order_no)->count();
  361. $count_refund_status=OrderRefundStatus::where('refund_no',$refund_no)->count();
  362. if($count_agent==$count_refund_status){
  363. $order_refund=OrderRefund::where('refund_no',$refund_no)->first();
  364. if($order_refund->is_end!=1){
  365. $order_refund->is_end=1;
  366. $order_refund->end_at=date("Y-m-d H:i:s");
  367. $order_refund->save();
  368. }
  369. }else{
  370. $order_refund=OrderRefund::where('refund_no',$refund_no)->first();
  371. if($order_refund->is_end==1){
  372. $order_refund->is_end=0;
  373. $order_refund->end_at=date("Y-m-d H:i:s");
  374. $order_refund->save();
  375. }
  376. }
  377. },5);
  378. return $this->success([]);
  379. }catch(\Exception $e){
  380. return $this->error($e->getMessage());
  381. }
  382. }
  383. //全部完成
  384. public function allFinish(Request $request){
  385. $refund_no=$request->input('refund_no');
  386. $refund=OrderRefund::where('refund_no',$refund_no)->first();
  387. try{
  388. DB::transaction(function()use($refund,$refund_no){
  389. $refund->is_end=1;
  390. $refund->end_at=date("Y-m-d H:i:s");
  391. $refund->save();
  392. $levels=AgentNo::where('order_no',$refund->order_no)->pluck('level');
  393. foreach($levels as $v){
  394. $refund_status=OrderRefundStatus::where('refund_no',$refund_no)->where('level',$v)->first();
  395. if(!$refund_status){
  396. OrderRefundStatus::create([
  397. 'refund_no'=>$refund_no,
  398. 'level'=>$v,
  399. 'status'=>1,
  400. 'remark'=>null,
  401. ]);
  402. }
  403. }
  404. },5);
  405. return $this->success([]);
  406. }catch(\Exception $e){
  407. return $this->error('450001',$e->getMessage());
  408. }
  409. }
  410. public function changeFinish(Request $request){
  411. $id=$request->input('id');
  412. if($request->input('status')==1){
  413. $status=1;
  414. }else{
  415. $status=2;
  416. }
  417. $remark=$request->input('remark');
  418. $refund_no=$request->input('refund_no');
  419. $agentNo=AgentNo::where('id',$id)->first();
  420. $refund_status=OrderRefundStatus::where('refund_no',$refund_no)->where('level',$agentNo->level)->first();
  421. try{
  422. DB::transaction(function()use($refund_status,$status,$remark,$refund_no,$agentNo){
  423. if($refund_status){
  424. $refund_status->status=$status;
  425. $refund_status->remark=$remark;
  426. $refund_status->save();
  427. }else{
  428. OrderRefundStatus::create([
  429. 'refund_no'=>$refund_no,
  430. 'level'=>$agentNo->level,
  431. 'account'=>null,
  432. 'status'=>$status,
  433. 'remark'=>$remark
  434. ]);
  435. }
  436. $count_agent=AgentNo::where('order_no',$agentNo->order_no)->count();
  437. $count_refund_status=OrderRefundStatus::where('refund_no',$refund_no)->count();
  438. if($count_agent==$count_refund_status){
  439. $order_refund=OrderRefund::where('refund_no',$refund_no)->first();
  440. if($order_refund->is_end!=1){
  441. $order_refund->is_end=1;
  442. $order_refund->end_at=date("Y-m-d H:i:s");
  443. $order_refund->save();
  444. }
  445. }else{
  446. $order_refund=OrderRefund::where('refund_no',$refund_no)->first();
  447. if($order_refund->is_end==1){
  448. $order_refund->is_end=0;
  449. $order_refund->end_at=date("Y-m-d H:i:s");
  450. $order_refund->save();
  451. }
  452. }
  453. },5);
  454. return $this->success([]);
  455. }catch(\Exception $e){
  456. return $this->error($e->getMessage());
  457. }
  458. }
  459. }