User.php 30 KB

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