MoneyController.php 16 KB

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