MoneyController.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. <?php
  2. namespace App\Http\Controllers;
  3. //<<<<<<< HEAD
  4. use App\Models\ListTag;
  5. use App\Events\AgentIncome;
  6. use App\Jobs\AgentIncome as AI;
  7. use App\Events\OrderPay;
  8. //=======
  9. //>>>>>>> 9aa477479386789a8615d89285e74706ec72fbab
  10. use Illuminate\Http\Request;
  11. use App\Models\User;
  12. use App\Models\Userpay;
  13. use App\Models\IncomeStyle;
  14. use Illuminate\Support\Facades\Auth;
  15. use Illuminate\Support\Facades\DB;
  16. use Illuminate\Support\Facades\Log;
  17. use Illuminate\Support\Facades\Validator;
  18. use \Exception;
  19. /**
  20. * @package App\Http\Controllers
  21. * @class MoneyController
  22. * time: 2020/5/5 9:59
  23. * Author: Conson
  24. */
  25. class MoneyController extends Controller
  26. {
  27. /**
  28. * @param Request $request
  29. * @return \Illuminate\Http\JsonResponse
  30. */
  31. public function index(Request $request)
  32. {
  33. $input=$request->all();
  34. $page_size=$input['page_size'];
  35. $page_index=$input['page_index'];
  36. $num = ($page_index - 1) * $page_size;
  37. $search_name=$input['search_name'];
  38. $time=$input['time'];
  39. if(empty($time)){
  40. $time=date("Y-m-d H:i:s");
  41. }
  42. $where=[];
  43. $where['level']=3;
  44. $data=User::where($where);
  45. if(!empty($time)){
  46. $data->with(['user_pay'=>function($query)use($time){
  47. $query->where('created_at','<=',$time)->orderByDesc('id');
  48. }]);
  49. }
  50. if($search_name){
  51. $data->where(function ($query) use ($search_name) {
  52. $query->where('nickname', 'like', '%' . $search_name . '%')
  53. ->orWhere('realname', 'like', '%' . $search_name . '%')
  54. ->orWhere('mobile', $search_name );
  55. });
  56. }
  57. $count=$data->count();
  58. if($count==0){
  59. $this->error('400001','没有数据');
  60. }
  61. $users=$data->select('id','nickname','realname','mobile','money','level')->get();
  62. if(!empty($time)){
  63. $totalMoney=0;
  64. foreach($users as $key=>$val){
  65. if(count($val->user_pay)>0){
  66. $totalMoney+=$val->user_pay[0]->user_money;
  67. }
  68. }
  69. }else{
  70. $totalMoney=$data->sum('money');
  71. }
  72. $list['totalMoney']=round($totalMoney,2);
  73. $list['info']=$users;
  74. return $this->success_list($list,'获取数据成功',$count);
  75. }
  76. public function detail(Request $request)
  77. {
  78. $input=$request->all();
  79. $user_id=$input['id'];
  80. $page_size=$input['page_size'];
  81. $page_index=$input['page_index'];
  82. $num = ($page_index - 1) * $page_size;
  83. $where=[];
  84. $where['user_id']=$user_id;
  85. $userPay=Userpay::where($where);
  86. $user=[];
  87. $user['info']=User::select('id','nickname','level','money')->where('id',$user_id)->first();
  88. if($input['start_time'] && $input['end_time']){
  89. $starTime=date("Y-m-d 00:00:00",strtotime($input['start_time']));
  90. $endTime=date("Y-m-d 23:59:59",strtotime($input['end_time']));
  91. $userPay=Userpay::whereBetween('created_at',[$starTime,$endTime])->where($where);
  92. }
  93. $userPay1=clone $userPay;
  94. $userPay2=clone $userPay;
  95. $user['incomeMoney']=$userPay1->whereIn('type',['0','2'])->sum('pay_money');
  96. $user['spendingMoney']=$userPay2->whereIn('type',['1','3'])->sum('pay_money');
  97. $user['total']=$userPay->count();
  98. $user['list']=$userPay->select('id','pay_money','pay_num','created_at','type','style','remark','user_money')
  99. ->orderBy('id','desc')->skip($num)->take($page_size)->get();
  100. // DB::raw('CONCAT("【",style,"】",remark) as remarks'),
  101. return $this->success($user);
  102. }
  103. public function deductions(Request $request)
  104. {
  105. $input=$request->all();
  106. $rules=[
  107. 'user_id'=>'required',
  108. 'money'=>'required|regex:/^[0-9]+(.[0-9]{1,2})?$/',
  109. 'remark'=>'required'
  110. ];
  111. $messages=[
  112. 'user_id.required'=>'无代理信息.',
  113. 'money.required'=>'金额不能为空.',
  114. 'money.regex'=>'金额格式有误.',
  115. 'remark.required'=>'备注不能为空.'
  116. ];
  117. $validator = Validator::make($input, $rules, $messages);
  118. if($validator->fails()){
  119. return $this->error('400013',$validator->errors()->first());
  120. }
  121. if($input['money']<=0){ return $this->error('扣款金额必须大于0元');}
  122. $user_id=$input['user_id'];
  123. $user=User::where('id',$user_id)->first();
  124. if($user->money-$input['money']<0){ return $this->error('扣款金额不能大于代理账户余额');}
  125. $data['user_id']=$user_id;
  126. $data['pay_money']=$input['money'];
  127. $data['remark']=$input['remark'];
  128. $data['type']=3;
  129. $data['pay_num']=$this->pay_num($user_id);
  130. $data['op_name']=Auth::user()->name;
  131. $data['user_money']=$user->money=$user->money-$input['money'];
  132. DB::beginTransaction();
  133. $row=$user->save();
  134. $res=Userpay::create($data);
  135. if($row && $res){
  136. if($user->openid){
  137. $mes['openid']=$user->openid;
  138. $mes['data']=[
  139. 'first' => '后台人工操作扣款成功',
  140. 'keyword1' => '-'.number_format($input['money'], 2),
  141. 'keyword2' => number_format($user->money, 2),
  142. 'keyword3' => date("Y-m-d H:i"),
  143. 'keyword4' => '人工扣款',
  144. 'remark' => $input['remark'].PHP_EOL.'点击链接进入系统,查看详情',
  145. ];
  146. event(new OrderPay($mes));
  147. }
  148. DB::commit();
  149. return $this->success([]);
  150. }else{
  151. DB::rollback();
  152. return $this->error();
  153. }
  154. }
  155. public function income(Request $request)
  156. {
  157. $input=$request->all();
  158. $rules=[
  159. 'user_id'=>'required',
  160. 'money'=>'required|regex:/^[0-9]+(.[0-9]{1,2})?$/',
  161. // 'remark'=>'required',
  162. 'style'=>'required'
  163. ];
  164. $messages=[
  165. 'user_id.required'=>'无代理信息.',
  166. 'money.required'=>'金额不能为空.',
  167. 'money.regex'=>'金额格式有误.',
  168. // 'remark.required'=>'备注不能为空.',
  169. 'style.required'=>'转账方式不能为空.'
  170. ];
  171. $validator = Validator::make($input, $rules, $messages);
  172. if($validator->fails()){
  173. return $this->error('400013',$validator->errors()->first());
  174. }
  175. if($input['money']<=0){ return $this->error('450001','充值金额必须大于0元');}
  176. $user_id=$input['user_id'];
  177. $data['user_id']=$user_id;
  178. $data['pay_money']=$input['money'];
  179. $data['remark']=$input['remark'];
  180. $data['type']=0;
  181. $data['style']=$input['style'];
  182. $data['pay_num']=$this->pay_num($user_id);
  183. $data['op_name']=Auth::user()->name;
  184. $user=User::where('id',$user_id)->lockForUpdate()->first();
  185. $cur_money=$user->money+$input['money'];
  186. $data['user_money']=$user->money=$cur_money;
  187. DB::beginTransaction();
  188. $row=$user->save();
  189. $res=Userpay::create($data);
  190. if($row && $res){
  191. if($user->openid){
  192. $mes['openid']=$user->openid;
  193. $mes['data']=[
  194. 'first' => '您的充值金额已成功到账',
  195. 'keyword1' => number_format($input['money'],2),
  196. 'keyword2' => date("Y-m-d H:i"),
  197. 'keyword3' => number_format($cur_money,2),
  198. 'remark' => '点击链接进入系统,查看详情',
  199. ];
  200. event(new AgentIncome($mes));
  201. }
  202. DB::commit();
  203. return $this->success([]);
  204. }else{
  205. DB::rollback();
  206. return $this->error();
  207. }
  208. }
  209. public function export(Request $request){
  210. $input=$request->all();
  211. // $page_size=$input['page_size'];
  212. // $page_index=$input['page_index'];
  213. // $num = ($page_index - 1) * $page_size;
  214. $search_name=$input['search_name'];
  215. $time=$input['time'];
  216. if(empty($time)){
  217. $time=date("Y-m-d H:i:s");
  218. }
  219. $where=[];
  220. $where['level']=3;
  221. $data=User::where($where);
  222. if(!empty($time)){
  223. $data->with(['user_pay'=>function($query)use($time){
  224. $query->where('created_at','<=',$time)->orderByDesc('id');
  225. }]);
  226. }
  227. if($search_name){
  228. $data->where(function ($query) use ($search_name) {
  229. $query->where('nickname', 'like', '%' . $search_name . '%')
  230. ->orWhere('realname', 'like', '%' . $search_name . '%')
  231. ->orWhere('mobile', $search_name );
  232. });
  233. }
  234. $count=$data->count();
  235. if($count==0){
  236. $this->error('400001','没有数据');
  237. }
  238. $users=$data->select('id','nickname','realname','mobile','money','level')->get();
  239. if(!empty($time)){
  240. $totalMoney=0;
  241. foreach($users as $key=>$val){
  242. if(count($val->user_pay)>0){
  243. $totalMoney+=$val->user_pay[0]->user_money;
  244. }
  245. }
  246. }else{
  247. $totalMoney=$data->sum('money');
  248. }
  249. $list['totalMoney']=round($totalMoney,2);
  250. $list['info']=$users;
  251. return $this->success_list($list,'获取数据成功',$count);
  252. }
  253. public function import(Request $request){
  254. $input=$request->all();
  255. // if(empty($input['style'])){
  256. // return $this->error(40013,'转账方式不能为空');
  257. // }
  258. if(empty($input['data'])){
  259. return $this->error(40013,'充值信息不能为空');
  260. }
  261. foreach ($input['data'] as $key=>$val){
  262. if(empty($val['代理名称'])){
  263. return $this->error(40013,'第'.($key+1).'位代理,名称不能为空');
  264. }
  265. if(empty($val['手机号'])){
  266. return $this->error(40013,'第'.($key+1).'位代理,手机号不能为空');
  267. }
  268. $user=User::where('mobile',$val['手机号'])->first();
  269. if (!$user){
  270. return $this->error(40013,'代理'.$val['代理名称'].'('.$val['手机号'].')不存在');
  271. }
  272. if(empty($val['金额']) || $val['金额']<=0){
  273. return $this->error(40013,'代理'.$val['代理名称'].'('.$val['手机号'].')充值金额必须大于0元');
  274. }
  275. if(!preg_match('/^[0-9]+(.[0-9]{1,2})?$/',$val['金额'])){
  276. return $this->error(40013,'代理'.$val['代理名称'].'('.$val['手机号'].')充值金额格式有误');
  277. }
  278. // if(empty($val['备注'])){
  279. // return $this->error(40013,'代理'.$val['代理名称'].'充值备注不能为空');
  280. // }
  281. }
  282. DB::beginTransaction();
  283. try{
  284. foreach ($input['data'] as $key=>$val){
  285. $user=User::where('mobile',$val['手机号'])->lockForUpdate()->first();
  286. $user->money=$user->money+$val['金额'];
  287. if(!$user->save()){
  288. Log::error('批量充值失败(代理)'.$val['手机号']);
  289. }
  290. $userpay=new Userpay();
  291. $userpay->pay_money=$val['金额'];
  292. $userpay->type=0;
  293. $userpay->op_name=Auth::user()->name;
  294. $userpay->user_id=$user->id;
  295. $userpay->pay_num=$this->pay_num($user->id);
  296. $userpay->user_money=$user->money;
  297. $userpay->remark=isset($val['备注'])?$val['备注']:"";
  298. $userpay->style=isset($val['转账方式'])?$val['转账方式']:"";
  299. if(!$userpay->save()){
  300. Log::error('批量充值失败(支付)'.$val['手机号']);
  301. }
  302. if($user->openid){
  303. $mes['openid']=$user->openid;
  304. $mes['data']=[
  305. 'first' => '您的充值金额已成功到账',
  306. 'keyword1' => number_format($val['金额'],2),
  307. 'keyword2' => date("Y-m-d H:i"),
  308. 'keyword3' => number_format($user->money,2),
  309. 'remark' => '点击链接进入系统,查看详情',
  310. ];
  311. AI::dispatch($mes);
  312. }
  313. }
  314. DB::commit();
  315. return $this->success([],'充值完成');
  316. }catch (Exception $exception){
  317. DB::rollBack();
  318. return $this->error(40013,'充值失败,出错代理手机号为'.$val['手机号']);
  319. }
  320. }
  321. //添加充值方式
  322. public function addIncomeStyle(Request $request){
  323. $input=$request->all();
  324. $style=IncomeStyle::where('title',$input['title'])->first();
  325. if($style){
  326. return $this->error('450001','该方式已存在');
  327. }
  328. $row=IncomeStyle::create([
  329. 'title'=>$input['title'],
  330. 'admin'=>Auth::user()->name
  331. ]);
  332. if($row){
  333. return $this->success([]);
  334. }
  335. return $this->error();
  336. }
  337. //获取充值方式
  338. public function getIncomeStyle(){
  339. $list=IncomeStyle::all();
  340. if($list){
  341. return $this->success($list);
  342. }
  343. return $this->error();
  344. }
  345. //删除充值转账方式
  346. public function deleteIncomeStyle(Request $request){
  347. $input=$request->all();
  348. $res=IncomeStyle::where('id',$input['id'])->delete();
  349. if($res){
  350. return $this->success([]);
  351. }
  352. return $this->error();
  353. }
  354. //支付单号
  355. public function pay_num($user_id){
  356. $num=date('Ymd',time()).'100000'.str_pad($user_id,6,0,STR_PAD_LEFT).rand(11111,99999);
  357. $count=UserPay::where('pay_num',$num)->count();
  358. if ($count>0){
  359. $num=$this->pay_num($user_id);
  360. return $num;
  361. }
  362. return $num;
  363. }
  364. //收支明细
  365. public function getPaymentList(Request $request){
  366. $input=$request->all();
  367. $where=[];
  368. $page_size=$input['page_size'];
  369. $page_index=$input['page_index'];
  370. $num = ($page_index - 1) * $page_size;
  371. $pay_no=$input['pay_no'];
  372. $type=$input['type'];
  373. $start_time=$input['start_time'];
  374. $end_time=$input['end_time'];
  375. $search_name=$input['search_name'];
  376. if($pay_no){
  377. $where['pay_num']=$pay_no;
  378. }
  379. if($type || $type == '0'){
  380. $where['type']=$type;
  381. }
  382. $userPay=Userpay::where($where);
  383. if($search_name){
  384. $user_ids=$this->getUserIds($search_name);
  385. $userPay->whereIn('user_id',$user_ids);
  386. }
  387. if($start_time && $end_time){
  388. $userPay->whereBetween('created_at',[$start_time,$end_time]);
  389. }
  390. $count=$userPay->count();
  391. // if($count<=0){
  392. // return $this->error('450001','没有数据');
  393. // }
  394. $list=$userPay->with(['user:id,nickname,realname,mobile'])->orderBy('created_at','desc')->skip($num)->take($page_size)->get();
  395. return $this->success_list($list,'成功',$count);
  396. }
  397. //导出收支明细
  398. public function exportPaymentList(Request $request){
  399. $input=$request->all();
  400. $where=[];
  401. $pay_no=$input['pay_no'];
  402. $search_name=$input['search_name'];
  403. $type=$input['type'];
  404. $start_time=$input['start_time'];
  405. $end_time=$input['end_time'];
  406. if($pay_no){
  407. $where['pay_num']=$pay_no;
  408. }
  409. if($type || $type == '0'){
  410. $where['type']=$type;
  411. }
  412. $userPay=Userpay::where($where);
  413. if($search_name){
  414. $user_ids=$this->getUserIds($search_name);
  415. $userPay->whereIn('user_id',$user_ids);
  416. }
  417. if($start_time && $end_time){
  418. $userPay->whereBetween('created_at',[$start_time,$end_time]);
  419. }
  420. $count=$userPay->count();
  421. if($count<=0){
  422. return $this->error('450001','没有数据');
  423. }
  424. $list=$userPay->with(['user:id,nickname,realname,mobile'])->orderBy('created_at','desc')->get();
  425. $ll=[];
  426. foreach($list as $key=>$val){
  427. $ll[$key]['支付流水号']=$val->pay_num;
  428. $ll[$key]['订单号']=$val->order_num;
  429. $ll[$key]['时间']=date("Y-m-d H:i:s",strtotime($val->created_at));
  430. $ll[$key]['代理昵称']=$val->user->nickname;
  431. $ll[$key]['代理姓名']=$val->user->realname;
  432. $ll[$key]['手机号']=$val->user->mobile;
  433. if($val->type==0){
  434. $ll[$key]['摘要']='后台充值';
  435. }elseif($val->type==1){
  436. $ll[$key]['摘要']='支付';
  437. }elseif($val->type==2){
  438. $ll[$key]['摘要']='退回';
  439. }elseif($val->type==3){
  440. $ll[$key]['摘要']='扣款';
  441. }
  442. $ll[$key]['金额']=$val->pay_money;
  443. $ll[$key]['支付方式']=$val->style;
  444. $ll[$key]['备注']=$val->remark;
  445. $ll[$key]['操作人']=$val->op_name;
  446. }
  447. return $this->success($ll);
  448. }
  449. //获取代理Ids
  450. public function getUserIds($search=null){
  451. return User::where(function($query) use ($search){
  452. $query->where('nickname','like','%'.$search.'%')
  453. ->orwhere('mobile','like','%'.$search.'%');
  454. })->pluck('id');
  455. }
  456. }