User.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726
  1. <?php
  2. /**
  3. *
  4. * @author: xaboy<365615158@qq.com>
  5. * @day: 2017/11/11
  6. */
  7. namespace app\admin\controller\user;
  8. use app\admin\controller\AuthController;
  9. use app\admin\model\system\SystemUserLevel;
  10. use service\FormBuilder as Form;
  11. use service\JsonService;
  12. use think\Db;
  13. use traits\CurdControllerTrait;
  14. use service\UtilService as Util;
  15. use service\JsonService as Json;
  16. use think\Request;
  17. use think\Url;
  18. use app\admin\model\user\User as UserModel;
  19. use app\admin\model\user\UserBill AS UserBillAdmin;
  20. use basic\ModelBasic;
  21. use service\HookService;
  22. use app\admin\model\user\UserLevel;
  23. use behavior\user\UserBehavior;
  24. use app\admin\model\store\StoreVisit;
  25. use app\admin\model\wechat\WechatMessage;
  26. use app\admin\model\order\StoreOrder;
  27. use app\admin\model\store\StoreCouponUser;
  28. /**
  29. * 用户管理控制器
  30. * Class User
  31. * @package app\admin\controller\user
  32. */
  33. class User extends AuthController
  34. {
  35. use CurdControllerTrait;
  36. /**
  37. * 显示资源列表
  38. *
  39. * @return \think\Response
  40. */
  41. public function index(){
  42. $this->assign('count_user',UserModel::getcount());
  43. $this->assign('level_list',SystemUserLevel::where(['is_show'=>1,'is_del'=>0])->field(['id','name'])->select());
  44. return $this->fetch();
  45. }
  46. /*
  47. * 赠送会员等级
  48. * @paran int $uid
  49. * */
  50. public function give_level($uid=0)
  51. {
  52. if(!$uid) return $this->failed('缺少参数');
  53. $level=\app\core\model\user\UserLevel::getUserLevel($uid);
  54. //获取当前会员等级
  55. if($level===false)
  56. $grade=0;
  57. else
  58. $grade=\app\core\model\user\UserLevel::getUserLevelInfo($level,'grade');
  59. //查询高于当前会员的所有会员等级
  60. $systemLevelList=SystemUserLevel::where('grade','>',$grade)->where(['is_show'=>1,'is_del'=>0])->field(['name','id'])->select();
  61. $field[]=Form::select('level_id','会员等级')->setOptions(function() use($systemLevelList) {
  62. $menus=[];
  63. foreach ($systemLevelList as $menu){
  64. $menus[] = ['value'=>$menu['id'],'label'=>$menu['name']];
  65. }
  66. return $menus;
  67. })->filterable(1);
  68. $form = Form::make_post_form('赠送会员',$field,Url::build('save_give_level',['uid'=>$uid]),2);
  69. $this->assign(compact('form'));
  70. return $this->fetch('public/form-builder');
  71. }
  72. /*
  73. * 赠送会员等级
  74. * @paran int $uid
  75. * @return json
  76. * */
  77. public function save_give_level($uid=0)
  78. {
  79. if(!$uid) return JsonService::fail('缺少参数');
  80. list($level_id)=Util::postMore([
  81. ['level_id',0],
  82. ],$this->request,true);
  83. //查询当前选择的会员等级
  84. $systemLevel=SystemUserLevel::where(['is_show'=>1,'is_del'=>0,'id'=>$level_id])->find();
  85. if(!$systemLevel) return JsonService::fail('您选择赠送的会员等级不存在!');
  86. //检查是否拥有此会员等级
  87. $level=UserLevel::where(['uid'=>$uid,'level_id'=>$level_id,'is_del'=>0])->field('valid_time,is_forever')->find();
  88. if($level) if(!$level['is_forever'] && time() < $level['valid_time']) return JsonService::fail('此用户已有该会员等级,无法再次赠送');
  89. //设置会员过期时间
  90. $add_valid_time=(int)$systemLevel->valid_date*86400;
  91. UserModel::commitTrans();
  92. try{
  93. //保存会员信息
  94. $res=UserLevel::set([
  95. 'is_forever'=>$systemLevel->is_forever,
  96. 'status'=>1,
  97. 'is_del'=>0,
  98. 'grade'=>$systemLevel->grade,
  99. 'uid'=>$uid,
  100. 'add_time'=>time(),
  101. 'level_id'=>$level_id,
  102. 'discount'=>$systemLevel->discount,
  103. 'valid_time'=>$systemLevel->discount ? $add_valid_time : 0,
  104. 'mark'=>'尊敬的用户【'.UserModel::where('uid',$uid)->value('nickname').'】在'.date('Y-m-d H:i:s',time()).'赠送会员等级成为'.$systemLevel['name'].'会员',
  105. ]);
  106. //提取等级任务并记录完成情况
  107. $levelIds=[$level_id];
  108. $lowGradeLevelIds=SystemUserLevel::where('grade','<',$systemLevel->grade)->where(['is_show'=>1,'is_del'=>0])->column('id');
  109. if(count($lowGradeLevelIds)) $levelIds=array_merge($levelIds,$lowGradeLevelIds);
  110. $taskIds=Db::name('system_user_task')->where('level_id','in',$levelIds)->column('id');
  111. $inserValue=[];
  112. foreach ($taskIds as $id){
  113. $inserValue[]=['uid'=>$uid,'task_id'=>$id,'status'=>1,'add_time'=>time()];
  114. }
  115. $res=$res && Db::name('user_task_finish')->insertAll($inserValue);
  116. if($res){
  117. UserModel::commitTrans();
  118. return JsonService::successful('赠送成功');
  119. }else{
  120. UserModel::rollbackTrans();
  121. return JsonService::successful('赠送失败');
  122. }
  123. }catch (\Exception $e){
  124. UserModel::rollbackTrans();
  125. return JsonService::fail('赠送失败');
  126. }
  127. }
  128. /*
  129. * 清除会员等级
  130. * @param int $uid
  131. * @return json
  132. * */
  133. public function del_level($uid=0)
  134. {
  135. if(!$uid) return JsonService::fail('缺少参数');
  136. if(UserLevel::cleanUpLevel($uid))
  137. return JsonService::successful('清除成功');
  138. else
  139. return JsonService::fail('清除失败');
  140. }
  141. /**
  142. * 修改user表状态
  143. *
  144. * @return json
  145. */
  146. public function set_status($status='',$uid=0,$is_echo=0){
  147. if($is_echo==0) {
  148. if ($status == '' || $uid == 0) return Json::fail('参数错误');
  149. UserModel::where(['uid' => $uid])->update(['status' => $status]);
  150. }else{
  151. $uids=Util::postMore([
  152. ['uids',[]]
  153. ]);
  154. UserModel::destrSyatus($uids['uids'],$status);
  155. }
  156. return Json::successful($status==0 ? '禁用成功':'解禁成功');
  157. }
  158. /**
  159. * 获取user表
  160. *
  161. * @return json
  162. */
  163. public function get_user_list(){
  164. $where=Util::getMore([
  165. ['page',1],
  166. ['limit',20],
  167. ['nickname',''],
  168. ['status',''],
  169. ['pay_count',''],
  170. ['is_promoter',''],
  171. ['order',''],
  172. ['data',''],
  173. ['user_type',''],
  174. ['country',''],
  175. ['province',''],
  176. ['city',''],
  177. ['user_time_type',''],
  178. ['user_time',''],
  179. ['sex',''],
  180. ['level_id',''],
  181. ['birthday',''],
  182. ]);
  183. return Json::successlayui(UserModel::getUserList($where));
  184. }
  185. /**
  186. * 编辑模板消息
  187. * @param $id
  188. * @return mixed|\think\response\Json|void
  189. */
  190. public function edit($uid)
  191. {
  192. if(!$uid) return $this->failed('数据不存在');
  193. $user = UserModel::get($uid);
  194. if(!$user) return Json::fail('数据不存在!');
  195. $f = array();
  196. $f[] = Form::input('uid','用户编号',$user->getData('uid'))->disabled(1);
  197. $f[] = Form::input('real_name','真实姓名',$user->getData('real_name'));
  198. $f[] = Form::date('birthday','生日',$user->getData('birthday') ? date('Y-m-d',$user->getData('birthday')) : 0);
  199. $f[] = Form::input('card_id','身份证号',$user->getData('card_id'));
  200. $f[] = Form::textarea('mark','用户备注',$user->getData('mark'));
  201. $f[] = Form::radio('is_promoter','推广员',$user->getData('is_promoter'))->options([['value'=>1,'label'=>'开启'],['value'=>0,'label'=>'关闭']]);
  202. $f[] = Form::radio('status','状态',$user->getData('status'))->options([['value'=>1,'label'=>'开启'],['value'=>0,'label'=>'锁定']]);
  203. $form = Form::make_post_form('添加用户通知',$f,Url::build('update',array('uid'=>$uid)),5);
  204. $this->assign(compact('form'));
  205. return $this->fetch('public/form-builder');
  206. }
  207. public function edit_other($uid)
  208. {
  209. if(!$uid) return $this->failed('数据不存在');
  210. $user = UserModel::get($uid);
  211. if(!$user) return Json::fail('数据不存在!');
  212. $f = array();
  213. $f[] = Form::radio('money_status','修改余额',1)->options([['value'=>1,'label'=>'增加'],['value'=>2,'label'=>'减少']]);
  214. $f[] = Form::number('money','余额')->min(0);
  215. $f[] = Form::radio('integration_status','修改积分',1)->options([['value'=>1,'label'=>'增加'],['value'=>2,'label'=>'减少']]);
  216. $f[] = Form::number('integration','积分')->min(0);
  217. $form = Form::make_post_form('修改其他',$f,Url::build('update_other',array('uid'=>$uid)),5);
  218. $this->assign(compact('form'));
  219. return $this->fetch('public/form-builder');
  220. }
  221. public function update_other($uid=0)
  222. {
  223. $data = Util::postMore([
  224. ['money_status',0],
  225. ['money',0],
  226. ['integration_status',0],
  227. ['integration',0],
  228. ],$this->request);
  229. if(!$uid) return $this->failed('数据不存在');
  230. $user = UserModel::get($uid);
  231. if(!$user) return Json::fail('数据不存在!');
  232. ModelBasic::beginTrans();
  233. $res1 = false;
  234. $res2 = false;
  235. $edit = array();
  236. if($data['money_status'] && $data['money']){//余额增加或者减少
  237. if($data['money_status'] == 1){//增加
  238. $edit['now_money'] = bcadd($user['now_money'],$data['money'],2);
  239. $res1 = UserBillAdmin::income('系统增加余额',$user['uid'],'now_money','system_add',$data['money'],$this->adminId,$edit['now_money'],'系统增加了'.floatval($data['money']).'余额');
  240. try{
  241. HookService::listen('admin_add_money',$user,$data['money'],false,UserBehavior::class);
  242. }catch (\Exception $e){
  243. ModelBasic::rollbackTrans();
  244. return Json::fail($e->getMessage());
  245. }
  246. }else if($data['money_status'] == 2){//减少
  247. $edit['now_money'] = bcsub($user['now_money'],$data['money'],2);
  248. $res1 = UserBillAdmin::expend('系统减少余额',$user['uid'],'now_money','system_sub',$data['money'],$this->adminId,$edit['now_money'],'系统扣除了'.floatval($data['money']).'余额');
  249. try{
  250. HookService::listen('admin_sub_money',$user,$data['money'],false,UserBehavior::class);
  251. }catch (\Exception $e){
  252. ModelBasic::rollbackTrans();
  253. return Json::fail($e->getMessage());
  254. }
  255. }
  256. }else{
  257. $res1 = true;
  258. }
  259. if($data['integration_status'] && $data['integration']){//积分增加或者减少
  260. if($data['integration_status'] == 1){//增加
  261. $edit['integral'] = bcadd($user['integral'],$data['integration'],2);
  262. $res2 = UserBillAdmin::income('系统增加积分',$user['uid'],'integral','system_add',$data['integration'],$this->adminId,$edit['integral'],'系统增加了'.floatval($data['integration']).'积分');
  263. try{
  264. HookService::listen('admin_add_integral',$user,$data['integration'],false,UserBehavior::class);
  265. }catch (\Exception $e){
  266. ModelBasic::rollbackTrans();
  267. return Json::fail($e->getMessage());
  268. }
  269. }else if($data['integration_status'] == 2){//减少
  270. $edit['integral'] = bcsub($user['integral'],$data['integration'],2);
  271. $res2 = UserBillAdmin::expend('系统减少积分',$user['uid'],'integral','system_sub',$data['integration'],$this->adminId,$edit['integral'],'系统扣除了'.floatval($data['integration']).'积分');
  272. try{
  273. HookService::listen('admin_sub_integral',$user,$data['integration'],false,UserBehavior::class);
  274. }catch (\Exception $e){
  275. ModelBasic::rollbackTrans();
  276. return Json::fail($e->getMessage());
  277. }
  278. }
  279. }else{
  280. $res2 = true;
  281. }
  282. if($edit) $res3 = UserModel::edit($edit,$uid);
  283. else $res3 = true;
  284. if($res1 && $res2 && $res3) $res =true;
  285. else $res = false;
  286. ModelBasic::checkTrans($res);
  287. if($res) return Json::successful('修改成功!');
  288. else return Json::fail('修改失败');
  289. }
  290. public function update(Request $request, $uid)
  291. {
  292. $data = Util::postMore([
  293. ['money_status',0],
  294. ['is_promoter',1],
  295. ['real_name',''],
  296. ['card_id',''],
  297. ['birthday',''],
  298. ['mark',''],
  299. ['money',0],
  300. ['integration_status',0],
  301. ['integration',0],
  302. ['status',0],
  303. ],$request);
  304. if(!$uid) return $this->failed('数据不存在');
  305. $user = UserModel::get($uid);
  306. if(!$user) return Json::fail('数据不存在!');
  307. $data['birthday'] = strtotime($data['birthday']);
  308. if($data['card_id'] && !Util::setCard($data['card_id'])) return JsonService::successful('输入正确的身份证号码');
  309. ModelBasic::beginTrans();
  310. $res1 = false;
  311. $res2 = false;
  312. $edit = array();
  313. if($data['money_status'] && $data['money']){//余额增加或者减少
  314. if($data['money_status'] == 1){//增加
  315. $edit['now_money'] = bcadd($user['now_money'],$data['money'],2);
  316. $res1 = UserBillAdmin::income('系统增加余额',$user['uid'],'now_money','system_add',$data['money'],$this->adminId,$edit['now_money'],'系统增加了'.floatval($data['money']).'余额');
  317. try{
  318. HookService::listen('admin_add_money',$user,$data['money'],false,UserBehavior::class);
  319. }catch (\Exception $e){
  320. ModelBasic::rollbackTrans();
  321. return Json::fail($e->getMessage());
  322. }
  323. }else if($data['money_status'] == 2){//减少
  324. $edit['now_money'] = bcsub($user['now_money'],$data['money'],2);
  325. $res1 = UserBillAdmin::expend('系统减少余额',$user['uid'],'now_money','system_sub',$data['money'],$this->adminId,$edit['now_money'],'系统扣除了'.floatval($data['money']).'余额');
  326. try{
  327. HookService::listen('admin_sub_money',$user,$data['money'],false,UserBehavior::class);
  328. }catch (\Exception $e){
  329. ModelBasic::rollbackTrans();
  330. return Json::fail($e->getMessage());
  331. }
  332. }
  333. }else{
  334. $res1 = true;
  335. }
  336. if($data['integration_status'] && $data['integration']){//积分增加或者减少
  337. if($data['integration_status'] == 1){//增加
  338. $edit['integral'] = bcadd($user['integral'],$data['integration'],2);
  339. $res2 = UserBillAdmin::income('系统增加积分',$user['uid'],'integral','system_add',$data['integration'],$this->adminId,$edit['integral'],'系统增加了'.floatval($data['integration']).'积分');
  340. try{
  341. HookService::listen('admin_add_integral',$user,$data['integration'],false,UserBehavior::class);
  342. }catch (\Exception $e){
  343. ModelBasic::rollbackTrans();
  344. return Json::fail($e->getMessage());
  345. }
  346. }else if($data['integration_status'] == 2){//减少
  347. $edit['integral'] = bcsub($user['integral'],$data['integration'],2);
  348. $res2 = UserBillAdmin::expend('系统减少积分',$user['uid'],'integral','system_sub',$data['integration'],$this->adminId,$edit['integral'],'系统扣除了'.floatval($data['integration']).'积分');
  349. try{
  350. HookService::listen('admin_sub_integral',$user,$data['integration'],false,UserBehavior::class);
  351. }catch (\Exception $e){
  352. ModelBasic::rollbackTrans();
  353. return Json::fail($e->getMessage());
  354. }
  355. }
  356. }else{
  357. $res2 = true;
  358. }
  359. $edit['status'] = $data['status'];
  360. $edit['real_name'] = $data['real_name'];
  361. $edit['card_id'] = $data['card_id'];
  362. $edit['birthday'] = $data['birthday'];
  363. $edit['mark'] = $data['mark'];
  364. $edit['is_promoter'] = $data['is_promoter'];
  365. if($edit) $res3 = UserModel::edit($edit,$uid);
  366. else $res3 = true;
  367. if($res1 && $res2 && $res3) $res =true;
  368. else $res = false;
  369. ModelBasic::checkTrans($res);
  370. if($res) return Json::successful('修改成功!');
  371. else return Json::fail('修改失败');
  372. }
  373. /**
  374. * 用户图表
  375. * @return mixed
  376. */
  377. public function user_analysis(){
  378. $where = Util::getMore([
  379. ['nickname',''],
  380. ['status',''],
  381. ['is_promoter',''],
  382. ['date',''],
  383. ['user_type',''],
  384. ['export',0]
  385. ],$this->request);
  386. $user_count=UserModel::consume($where,'',true);
  387. //头部信息
  388. $header=[
  389. [
  390. 'name'=>'新增用户',
  391. 'class'=>'fa-line-chart',
  392. 'value'=>$user_count,
  393. 'color'=>'red'
  394. ],
  395. [
  396. 'name'=>'用户留存',
  397. 'class'=>'fa-area-chart',
  398. 'value'=>$this->gethreaderValue(UserModel::consume($where,'',true),$where).'%',
  399. 'color'=>'lazur'
  400. ],
  401. [
  402. 'name'=>'新增用户总消费',
  403. 'class'=>'fa-bar-chart',
  404. 'value'=>'¥'.UserModel::consume($where),
  405. 'color'=>'navy'
  406. ],
  407. [
  408. 'name'=>'用户活跃度',
  409. 'class'=>'fa-pie-chart',
  410. 'value'=>$this->gethreaderValue(UserModel::consume($where,'',true)).'%',
  411. 'color'=>'yellow'
  412. ],
  413. ];
  414. $name=['新增用户','用户消费'];
  415. $dates=$this->get_user_index($where,$name);
  416. $user_index=['name'=>json_encode($name), 'date'=>json_encode($dates['time']), 'series'=>json_encode($dates['series'])];
  417. //用户浏览分析
  418. $view=StoreVisit::getVisit($where['date'],['','warning','info','danger']);
  419. $view_v1=WechatMessage::getViweList($where['date'],['','warning','info','danger']);
  420. $view=array_merge($view,$view_v1);
  421. $view_v2=[];
  422. foreach ($view as $val){
  423. $view_v2['color'][]='#'.rand(100000,339899);
  424. $view_v2['name'][]=$val['name'];
  425. $view_v2['value'][]=$val['value'];
  426. }
  427. $view=$view_v2;
  428. //消费会员排行用户分析
  429. $user_null=UserModel::getUserSpend($where['date']);
  430. //消费数据
  431. $now_number=UserModel::getUserSpend($where['date'],true);
  432. list($paren_number,$title)=UserModel::getPostNumber($where['date']);
  433. if($paren_number==0) {
  434. $rightTitle=[
  435. 'number'=>$now_number>0?$now_number:0,
  436. 'icon'=>'fa-level-up',
  437. 'title'=>$title
  438. ];
  439. }else{
  440. $number=(float)bcsub($now_number,$paren_number,4);
  441. if($now_number==0){
  442. $icon='fa-level-down';
  443. }else{
  444. $icon=$now_number>$paren_number?'fa-level-up':'fa-level-down';
  445. }
  446. $rightTitle=['number'=>$number, 'icon'=>$icon, 'title'=>$title];
  447. }
  448. unset($title,$paren_number,$now_number);
  449. list($paren_user_count,$title)=UserModel::getPostNumber($where['date'],true,'add_time','');
  450. if($paren_user_count==0){
  451. $count=$user_count==0?0:$user_count;
  452. $icon=$user_count==0?'fa-level-down':'fa-level-up';
  453. }else{
  454. $count=(float)bcsub($user_count,$paren_user_count,4);
  455. $icon=$user_count<$paren_user_count?'fa-level-down':'fa-level-up';
  456. }
  457. $leftTitle=[
  458. 'count'=>$count,
  459. 'icon'=>$icon,
  460. 'title'=>$title
  461. ];
  462. unset($count,$icon,$title);
  463. $consume=[
  464. 'title'=>'消费金额为¥'.UserModel::consume($where),
  465. 'series'=>UserModel::consume($where,'xiaofei'),
  466. 'rightTitle'=>$rightTitle,
  467. 'leftTitle'=>$leftTitle,
  468. ];
  469. $form=UserModel::consume($where,'form');
  470. $grouping=UserModel::consume($where,'grouping');
  471. $this->assign(compact('header','user_index','view','user_null','consume','form','grouping','where'));
  472. return $this->fetch();
  473. }
  474. public function gethreaderValue($chart,$where=[]){
  475. if($where){
  476. switch($where['date']){
  477. case null:case 'today':case 'week':case 'year':
  478. if($where['date']==null){
  479. $where['date']='month';
  480. }
  481. $sum_user=UserModel::whereTime('add_time',$where['date'])->count();
  482. if($sum_user==0) return 0;
  483. $counts=bcdiv($chart,$sum_user,4)*100;
  484. return $counts;
  485. break;
  486. case 'quarter':
  487. $quarter=UserModel::getMonth('n');
  488. $quarter[0]=strtotime($quarter[0]);
  489. $quarter[1]=strtotime($quarter[1]);
  490. $sum_user=UserModel::where('add_time','between',$quarter)->count();
  491. if($sum_user==0) return 0;
  492. $counts=bcdiv($chart,$sum_user,4)*100;
  493. return $counts;
  494. default:
  495. //自定义时间
  496. $quarter=explode('-',$where['date']);
  497. $quarter[0]=strtotime($quarter[0]);
  498. $quarter[1]=strtotime($quarter[1]);
  499. $sum_user=UserModel::where('add_time','between',$quarter)->count();
  500. if($sum_user==0) return 0;
  501. $counts=bcdiv($chart,$sum_user,4)*100;
  502. return $counts;
  503. break;
  504. }
  505. }else{
  506. $num=UserModel::count();
  507. $chart=$num!=0?bcdiv($chart,$num,5)*100:0;
  508. return $chart;
  509. }
  510. }
  511. public function get_user_index($where,$name){
  512. switch ($where['date']){
  513. case null:
  514. $days = date("t",strtotime(date('Y-m',time())));
  515. $dates=[];
  516. $series=[];
  517. $times_list=[];
  518. foreach ($name as $key=>$val){
  519. for($i=1;$i<=$days;$i++){
  520. if(!in_array($i.'号',$times_list)){
  521. array_push($times_list,$i.'号');
  522. }
  523. $time=$this->gettime(date("Y-m",time()).'-'.$i);
  524. if($key==0){
  525. $dates['data'][]=UserModel::where('add_time','between',$time)->count();
  526. }else if($key==1){
  527. $dates['data'][]=UserModel::consume(true,$time);
  528. }
  529. }
  530. $dates['name']=$val;
  531. $dates['type']='line';
  532. $series[]=$dates;
  533. unset($dates);
  534. }
  535. return ['time'=>$times_list,'series'=>$series];
  536. case 'today':
  537. $dates=[];
  538. $series=[];
  539. $times_list=[];
  540. foreach ($name as $key=>$val){
  541. for($i=0;$i<=24;$i++){
  542. $strtitle=$i.'点';
  543. if(!in_array($strtitle,$times_list)){
  544. array_push($times_list,$strtitle);
  545. }
  546. $time=$this->gettime(date("Y-m-d ",time()).$i);
  547. if($key==0){
  548. $dates['data'][]=UserModel::where('add_time','between',$time)->count();
  549. }else if($key==1){
  550. $dates['data'][]=UserModel::consume(true,$time);
  551. }
  552. }
  553. $dates['name']=$val;
  554. $dates['type']='line';
  555. $series[]=$dates;
  556. unset($dates);
  557. }
  558. return ['time'=>$times_list,'series'=>$series];
  559. case "week":
  560. $dates=[];
  561. $series=[];
  562. $times_list=[];
  563. foreach ($name as $key=>$val){
  564. for($i=0;$i<=6;$i++){
  565. if(!in_array('星期'.($i+1),$times_list)){
  566. array_push($times_list,'星期'.($i+1));
  567. }
  568. $time=UserModel::getMonth('h',$i);
  569. if($key==0){
  570. $dates['data'][]=UserModel::where('add_time','between',[strtotime($time[0]),strtotime($time[1])])->count();
  571. }else if($key==1){
  572. $dates['data'][]=UserModel::consume(true,[strtotime($time[0]),strtotime($time[1])]);
  573. }
  574. }
  575. $dates['name']=$val;
  576. $dates['type']='line';
  577. $series[]=$dates;
  578. unset($dates);
  579. }
  580. return ['time'=>$times_list,'series'=>$series];
  581. case 'year':
  582. $dates=[];
  583. $series=[];
  584. $times_list=[];
  585. $year=date('Y');
  586. foreach ($name as $key=>$val){
  587. for($i=1;$i<=12;$i++){
  588. if(!in_array($i.'月',$times_list)){
  589. array_push($times_list,$i.'月');
  590. }
  591. $t = strtotime($year.'-'.$i.'-01');
  592. $arr= explode('/',date('Y-m-01',$t).'/'.date('Y-m-',$t).date('t',$t));
  593. if($key==0){
  594. $dates['data'][]=UserModel::where('add_time','between',[strtotime($arr[0]),strtotime($arr[1])])->count();
  595. }else if($key==1){
  596. $dates['data'][]=UserModel::consume(true,[strtotime($arr[0]),strtotime($arr[1])]);
  597. }
  598. }
  599. $dates['name']=$val;
  600. $dates['type']='line';
  601. $series[]=$dates;
  602. unset($dates);
  603. }
  604. return ['time'=>$times_list,'series'=>$series];
  605. case 'quarter':
  606. $dates=[];
  607. $series=[];
  608. $times_list=[];
  609. foreach ($name as $key=>$val){
  610. for($i=1;$i<=4;$i++){
  611. $arr=$this->gettime('quarter',$i);
  612. if(!in_array(implode('--',$arr).'季度',$times_list)){
  613. array_push($times_list,implode('--',$arr).'季度');
  614. }
  615. if($key==0){
  616. $dates['data'][]=UserModel::where('add_time','between',[strtotime($arr[0]),strtotime($arr[1])])->count();
  617. }else if($key==1){
  618. $dates['data'][]=UserModel::consume(true,[strtotime($arr[0]),strtotime($arr[1])]);
  619. }
  620. }
  621. $dates['name']=$val;
  622. $dates['type']='line';
  623. $series[]=$dates;
  624. unset($dates);
  625. }
  626. return ['time'=>$times_list,'series'=>$series];
  627. default:
  628. $list=UserModel::consume($where,'default');
  629. $dates=[];
  630. $series=[];
  631. $times_list=[];
  632. foreach ($name as $k=>$v){
  633. foreach ($list as $val){
  634. $date=$val['add_time'];
  635. if(!in_array($date,$times_list)){
  636. array_push($times_list,$date);
  637. }
  638. if($k==0){
  639. $dates['data'][]=$val['num'];
  640. }else if($k==1){
  641. $dates['data'][]=UserBillAdmin::where(['uid'=>$val['uid'],'type'=>'pay_product'])->sum('number');
  642. }
  643. }
  644. $dates['name']=$v;
  645. $dates['type']='line';
  646. $series[]=$dates;
  647. unset($dates);
  648. }
  649. return ['time'=>$times_list,'series'=>$series];
  650. }
  651. }
  652. public function gettime($time='',$season=''){
  653. if(!empty($time) && empty($season)){
  654. $timestamp0 = strtotime($time);
  655. $timestamp24 =strtotime($time)+86400;
  656. return [$timestamp0,$timestamp24];
  657. }else if(!empty($time) && !empty($season)){
  658. $firstday=date('Y-m-01',mktime(0,0,0,($season - 1) *3 +1,1,date('Y')));
  659. $lastday=date('Y-m-t',mktime(0,0,0,$season * 3,1,date('Y')));
  660. return [$firstday,$lastday];
  661. }
  662. }
  663. /**
  664. * 会员等级首页
  665. */
  666. public function group(){
  667. return $this->fetch();
  668. }
  669. /**
  670. * 会员详情
  671. */
  672. public function see($uid=''){
  673. $this->assign([
  674. 'uid'=>$uid,
  675. 'userinfo'=>UserModel::getUserDetailed($uid),
  676. 'is_layui'=>true,
  677. 'headerList'=>UserModel::getHeaderList($uid),
  678. 'count'=>UserModel::getCountInfo($uid),
  679. ]);
  680. return $this->fetch();
  681. }
  682. /*
  683. * 获取某个用户的推广下线
  684. * */
  685. public function getSpreadList($uid,$page=1,$limit=20){
  686. return Json::successful(UserModel::getSpreadList($uid,(int)$page,(int)$limit));
  687. }
  688. /**
  689. * 获取某用户的订单列表
  690. */
  691. public function getOneorderList($uid,$page=1,$limit=20){
  692. return Json::successful(StoreOrder::getOneorderList(compact('uid','page','limit')));
  693. }
  694. /**
  695. * 获取某用户的积分列表
  696. */
  697. public function getOneIntegralList($uid,$page=1,$limit=20){
  698. return Json::successful(UserBillAdmin::getOneIntegralList(compact('uid','page','limit')));
  699. }
  700. /**
  701. * 获取某用户的积分列表
  702. */
  703. public function getOneSignList($uid,$page=1,$limit=20){
  704. return Json::successful(UserBillAdmin::getOneSignList(compact('uid','page','limit')));
  705. }
  706. /**
  707. * 获取某用户的持有优惠劵
  708. */
  709. public function getOneCouponsList($uid,$page=1,$limit=20){
  710. return Json::successful(StoreCouponUser::getOneCouponsList(compact('uid','page','limit')));
  711. }
  712. /**
  713. * 获取某用户的余额变动记录
  714. */
  715. public function getOneBalanceChangList($uid,$page=1,$limit=20){
  716. return Json::successful(UserBillAdmin::getOneBalanceChangList(compact('uid','page','limit')));
  717. }
  718. }