| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526 |
- <?php
- /**
- *
- * @author: xaboy<365615158@qq.com>
- * @day: 2017/11/11
- */
- namespace app\admin\controller\user;
- use app\admin\controller\AuthController;
- use service\FormBuilder as Form;
- use traits\CurdControllerTrait;
- use service\UtilService as Util;
- use service\JsonService as Json;
- use think\Request;
- use think\Url;
- use app\admin\model\user\User as UserModel;
- use app\admin\model\user\UserBill AS UserBillAdmin;
- use basic\ModelBasic;
- use service\HookService;
- use behavior\user\UserBehavior;
- use app\admin\model\store\StoreVisit;
- use app\admin\model\wechat\WechatMessage;
- use app\admin\model\order\StoreOrder;
- use app\admin\model\store\StoreCouponUser;
- /**
- * 用户管理控制器
- * Class User
- * @package app\admin\controller\user
- */
- class User extends AuthController
- {
- use CurdControllerTrait;
- /**
- * 显示资源列表
- *
- * @return \think\Response
- */
- public function index(){
- $this->assign('count_user',UserModel::getcount());
- return $this->fetch();
- }
- /**
- * 修改user表状态
- *
- * @return json
- */
- public function set_status($status='',$uid=0,$is_echo=0){
- if($is_echo==0) {
- if ($status == '' || $uid == 0) return Json::fail('参数错误');
- UserModel::where(['uid' => $uid])->update(['status' => $status]);
- }else{
- $uids=Util::postMore([
- ['uids',[]]
- ]);
- UserModel::destrSyatus($uids['uids'],$status);
- }
- return Json::successful($status==0 ? '禁用成功':'解禁成功');
- }
- /**
- * 获取user表
- *
- * @return json
- */
- public function get_user_list(){
- $where=Util::getMore([
- ['page',1],
- ['limit',20],
- ['nickname',''],
- ['status',''],
- ['pay_count',''],
- ['is_promoter',''],
- ['order',''],
- ['data',''],
- ['user_type',''],
- ['country',''],
- ['province',''],
- ['city',''],
- ['user_time_type',''],
- ['user_time',''],
- ['sex',''],
- ]);
- return Json::successlayui(UserModel::getUserList($where));
- }
- /**
- * 编辑模板消息
- * @param $id
- * @return mixed|\think\response\Json|void
- */
- public function edit($uid)
- {
- if(!$uid) return $this->failed('数据不存在');
- $user = UserModel::get($uid);
- if(!$user) return Json::fail('数据不存在!');
- $f = array();
- $f[] = Form::input('uid','用户编号',$user->getData('uid'))->disabled(1);
- $f[] = Form::input('nickname','用户姓名',$user->getData('nickname'));
- $f[] = Form::radio('money_status','修改余额',1)->options([['value'=>1,'label'=>'增加'],['value'=>2,'label'=>'减少']]);
- $f[] = Form::number('money','余额')->min(0);
- $f[] = Form::radio('integration_status','修改积分',1)->options([['value'=>1,'label'=>'增加'],['value'=>2,'label'=>'减少']]);
- $f[] = Form::number('integration','积分')->min(0);
- $f[] = Form::radio('status','状态',$user->getData('status'))->options([['value'=>1,'label'=>'开启'],['value'=>0,'label'=>'锁定']]);
- $f[] = Form::radio('is_promoter','推广员',$user->getData('is_promoter'))->options([['value'=>1,'label'=>'开启'],['value'=>0,'label'=>'关闭']]);
- $form = Form::make_post_form('添加用户通知',$f,Url::build('update',array('id'=>$uid)),5);
- $this->assign(compact('form'));
- return $this->fetch('public/form-builder');
- }
- public function update(Request $request, $uid)
- {
- $data = Util::postMore([
- ['money_status',0],
- ['is_promoter',1],
- ['money',0],
- ['integration_status',0],
- ['integration',0],
- ['status',0],
- ],$request);
- if(!$uid) return $this->failed('数据不存在');
- $user = UserModel::get($uid);
- if(!$user) return Json::fail('数据不存在!');
- ModelBasic::beginTrans();
- $res1 = false;
- $res2 = false;
- $edit = array();
- if($data['money_status'] && $data['money']){//余额增加或者减少
- if($data['money_status'] == 1){//增加
- $edit['now_money'] = bcadd($user['now_money'],$data['money'],2);
- $res1 = UserBillAdmin::income('系统增加余额',$user['uid'],'now_money','system_add',$data['money'],$this->adminId,$edit['now_money'],'系统增加了'.floatval($data['money']).'余额');
- try{
- HookService::listen('admin_add_money',$user,$data['money'],false,UserBehavior::class);
- }catch (\Exception $e){
- ModelBasic::rollbackTrans();
- return Json::fail($e->getMessage());
- }
- }else if($data['money_status'] == 2){//减少
- $edit['now_money'] = bcsub($user['now_money'],$data['money'],2);
- $res1 = UserBillAdmin::expend('系统减少余额',$user['uid'],'now_money','system_sub',$data['money'],$this->adminId,$edit['now_money'],'系统扣除了'.floatval($data['money']).'余额');
- try{
- HookService::listen('admin_sub_money',$user,$data['money'],false,UserBehavior::class);
- }catch (\Exception $e){
- ModelBasic::rollbackTrans();
- return Json::fail($e->getMessage());
- }
- }
- }else{
- $res1 = true;
- }
- if($data['integration_status'] && $data['integration']){//积分增加或者减少
- if($data['integration_status'] == 1){//增加
- $edit['integral'] = bcadd($user['integral'],$data['integration'],2);
- $res2 = UserBillAdmin::income('系统增加积分',$user['uid'],'integral','system_add',$data['integration'],$this->adminId,$edit['integral'],'系统增加了'.floatval($data['integration']).'积分');
- try{
- HookService::listen('admin_add_integral',$user,$data['integration'],false,UserBehavior::class);
- }catch (\Exception $e){
- ModelBasic::rollbackTrans();
- return Json::fail($e->getMessage());
- }
- }else if($data['integration_status'] == 2){//减少
- $edit['integral'] = bcsub($user['integral'],$data['integration'],2);
- $res2 = UserBillAdmin::expend('系统减少积分',$user['uid'],'integral','system_sub',$data['integration'],$this->adminId,$edit['integral'],'系统扣除了'.floatval($data['integration']).'积分');
- try{
- HookService::listen('admin_sub_integral',$user,$data['integration'],false,UserBehavior::class);
- }catch (\Exception $e){
- ModelBasic::rollbackTrans();
- return Json::fail($e->getMessage());
- }
- }
- }else{
- $res2 = true;
- }
- $edit['status'] = $data['status'];
- $edit['is_promoter'] = $data['is_promoter'];
- if($edit) $res3 = UserModel::edit($edit,$uid);
- else $res3 = true;
- if($res1 && $res2 && $res3) $res =true;
- else $res = false;
- ModelBasic::checkTrans($res);
- if($res) return Json::successful('修改成功!');
- else return Json::fail('修改失败');
- }
- /**
- * 用户图表
- * @return mixed
- */
- public function user_analysis(){
- $where = Util::getMore([
- ['nickname',''],
- ['status',''],
- ['is_promoter',''],
- ['date',''],
- ['user_type',''],
- ['export',0]
- ],$this->request);
- $user_count=UserModel::consume($where,'',true);
- //头部信息
- $header=[
- [
- 'name'=>'新增用户',
- 'class'=>'fa-line-chart',
- 'value'=>$user_count,
- 'color'=>'red'
- ],
- [
- 'name'=>'用户留存',
- 'class'=>'fa-area-chart',
- 'value'=>$this->gethreaderValue(UserModel::consume($where,'',true),$where).'%',
- 'color'=>'lazur'
- ],
- [
- 'name'=>'新增用户总消费',
- 'class'=>'fa-bar-chart',
- 'value'=>'¥'.UserModel::consume($where),
- 'color'=>'navy'
- ],
- [
- 'name'=>'用户活跃度',
- 'class'=>'fa-pie-chart',
- 'value'=>$this->gethreaderValue(UserModel::consume($where,'',true)).'%',
- 'color'=>'yellow'
- ],
- ];
- $name=['新增用户','用户消费'];
- $dates=$this->get_user_index($where,$name);
- $user_index=['name'=>json_encode($name), 'date'=>json_encode($dates['time']), 'series'=>json_encode($dates['series'])];
- //用户浏览分析
- $view=StoreVisit::getVisit($where['date'],['','warning','info','danger']);
- $view_v1=WechatMessage::getViweList($where['date'],['','warning','info','danger']);
- $view=array_merge($view,$view_v1);
- $view_v2=[];
- foreach ($view as $val){
- $view_v2['color'][]='#'.rand(100000,339899);
- $view_v2['name'][]=$val['name'];
- $view_v2['value'][]=$val['value'];
- }
- $view=$view_v2;
- //消费会员排行用户分析
- $user_null=UserModel::getUserSpend($where['date']);
- //消费数据
- $now_number=UserModel::getUserSpend($where['date'],true);
- list($paren_number,$title)=UserModel::getPostNumber($where['date']);
- if($paren_number==0) {
- $rightTitle=[
- 'number'=>$now_number>0?$now_number:0,
- 'icon'=>'fa-level-up',
- 'title'=>$title
- ];
- }else{
- $number=(float)bcsub($now_number,$paren_number,4);
- if($now_number==0){
- $icon='fa-level-down';
- }else{
- $icon=$now_number>$paren_number?'fa-level-up':'fa-level-down';
- }
- $rightTitle=['number'=>$number, 'icon'=>$icon, 'title'=>$title];
- }
- unset($title,$paren_number,$now_number);
- list($paren_user_count,$title)=UserModel::getPostNumber($where['date'],true,'add_time','');
- if($paren_user_count==0){
- $count=$user_count==0?0:$user_count;
- $icon=$user_count==0?'fa-level-down':'fa-level-up';
- }else{
- $count=(float)bcsub($user_count,$paren_user_count,4);
- $icon=$user_count<$paren_user_count?'fa-level-down':'fa-level-up';
- }
- $leftTitle=[
- 'count'=>$count,
- 'icon'=>$icon,
- 'title'=>$title
- ];
- unset($count,$icon,$title);
- $consume=[
- 'title'=>'消费金额为¥'.UserModel::consume($where),
- 'series'=>UserModel::consume($where,'xiaofei'),
- 'rightTitle'=>$rightTitle,
- 'leftTitle'=>$leftTitle,
- ];
- $form=UserModel::consume($where,'form');
- $grouping=UserModel::consume($where,'grouping');
- $this->assign(compact('header','user_index','view','user_null','consume','form','grouping','where'));
- return $this->fetch();
- }
- public function gethreaderValue($chart,$where=[]){
- if($where){
- switch($where['date']){
- case null:case 'today':case 'week':case 'year':
- if($where['date']==null){
- $where['date']='month';
- }
- $sum_user=UserModel::whereTime('add_time',$where['date'])->count();
- if($sum_user==0) return 0;
- $counts=bcdiv($chart,$sum_user,4)*100;
- return $counts;
- break;
- case 'quarter':
- $quarter=UserModel::getMonth('n');
- $quarter[0]=strtotime($quarter[0]);
- $quarter[1]=strtotime($quarter[1]);
- $sum_user=UserModel::where('add_time','between',$quarter)->count();
- if($sum_user==0) return 0;
- $counts=bcdiv($chart,$sum_user,4)*100;
- return $counts;
- default:
- //自定义时间
- $quarter=explode('-',$where['date']);
- $quarter[0]=strtotime($quarter[0]);
- $quarter[1]=strtotime($quarter[1]);
- $sum_user=UserModel::where('add_time','between',$quarter)->count();
- if($sum_user==0) return 0;
- $counts=bcdiv($chart,$sum_user,4)*100;
- return $counts;
- break;
- }
- }else{
- $num=UserModel::count();
- $chart=$num!=0?bcdiv($chart,$num,5)*100:0;
- return $chart;
- }
- }
- public function get_user_index($where,$name){
- switch ($where['date']){
- case null:
- $days = date("t",strtotime(date('Y-m',time())));
- $dates=[];
- $series=[];
- $times_list=[];
- foreach ($name as $key=>$val){
- for($i=1;$i<=$days;$i++){
- if(!in_array($i.'号',$times_list)){
- array_push($times_list,$i.'号');
- }
- $time=$this->gettime(date("Y-m",time()).'-'.$i);
- if($key==0){
- $dates['data'][]=UserModel::where('add_time','between',$time)->count();
- }else if($key==1){
- $dates['data'][]=UserModel::consume(true,$time);
- }
- }
- $dates['name']=$val;
- $dates['type']='line';
- $series[]=$dates;
- unset($dates);
- }
- return ['time'=>$times_list,'series'=>$series];
- case 'today':
- $dates=[];
- $series=[];
- $times_list=[];
- foreach ($name as $key=>$val){
- for($i=0;$i<=24;$i++){
- $strtitle=$i.'点';
- if(!in_array($strtitle,$times_list)){
- array_push($times_list,$strtitle);
- }
- $time=$this->gettime(date("Y-m-d ",time()).$i);
- if($key==0){
- $dates['data'][]=UserModel::where('add_time','between',$time)->count();
- }else if($key==1){
- $dates['data'][]=UserModel::consume(true,$time);
- }
- }
- $dates['name']=$val;
- $dates['type']='line';
- $series[]=$dates;
- unset($dates);
- }
- return ['time'=>$times_list,'series'=>$series];
- case "week":
- $dates=[];
- $series=[];
- $times_list=[];
- foreach ($name as $key=>$val){
- for($i=0;$i<=6;$i++){
- if(!in_array('星期'.($i+1),$times_list)){
- array_push($times_list,'星期'.($i+1));
- }
- $time=UserModel::getMonth('h',$i);
- if($key==0){
- $dates['data'][]=UserModel::where('add_time','between',[strtotime($time[0]),strtotime($time[1])])->count();
- }else if($key==1){
- $dates['data'][]=UserModel::consume(true,[strtotime($time[0]),strtotime($time[1])]);
- }
- }
- $dates['name']=$val;
- $dates['type']='line';
- $series[]=$dates;
- unset($dates);
- }
- return ['time'=>$times_list,'series'=>$series];
- case 'year':
- $dates=[];
- $series=[];
- $times_list=[];
- $year=date('Y');
- foreach ($name as $key=>$val){
- for($i=1;$i<=12;$i++){
- if(!in_array($i.'月',$times_list)){
- array_push($times_list,$i.'月');
- }
- $t = strtotime($year.'-'.$i.'-01');
- $arr= explode('/',date('Y-m-01',$t).'/'.date('Y-m-',$t).date('t',$t));
- if($key==0){
- $dates['data'][]=UserModel::where('add_time','between',[strtotime($arr[0]),strtotime($arr[1])])->count();
- }else if($key==1){
- $dates['data'][]=UserModel::consume(true,[strtotime($arr[0]),strtotime($arr[1])]);
- }
- }
- $dates['name']=$val;
- $dates['type']='line';
- $series[]=$dates;
- unset($dates);
- }
- return ['time'=>$times_list,'series'=>$series];
- case 'quarter':
- $dates=[];
- $series=[];
- $times_list=[];
- foreach ($name as $key=>$val){
- for($i=1;$i<=4;$i++){
- $arr=$this->gettime('quarter',$i);
- if(!in_array(implode('--',$arr).'季度',$times_list)){
- array_push($times_list,implode('--',$arr).'季度');
- }
- if($key==0){
- $dates['data'][]=UserModel::where('add_time','between',[strtotime($arr[0]),strtotime($arr[1])])->count();
- }else if($key==1){
- $dates['data'][]=UserModel::consume(true,[strtotime($arr[0]),strtotime($arr[1])]);
- }
- }
- $dates['name']=$val;
- $dates['type']='line';
- $series[]=$dates;
- unset($dates);
- }
- return ['time'=>$times_list,'series'=>$series];
- default:
- $list=UserModel::consume($where,'default');
- $dates=[];
- $series=[];
- $times_list=[];
- foreach ($name as $k=>$v){
- foreach ($list as $val){
- $date=$val['add_time'];
- if(!in_array($date,$times_list)){
- array_push($times_list,$date);
- }
- if($k==0){
- $dates['data'][]=$val['num'];
- }else if($k==1){
- $dates['data'][]=UserBillAdmin::where(['uid'=>$val['uid'],'type'=>'pay_product'])->sum('number');
- }
- }
- $dates['name']=$v;
- $dates['type']='line';
- $series[]=$dates;
- unset($dates);
- }
- return ['time'=>$times_list,'series'=>$series];
- }
- }
- public function gettime($time='',$season=''){
- if(!empty($time) && empty($season)){
- $timestamp0 = strtotime($time);
- $timestamp24 =strtotime($time)+86400;
- return [$timestamp0,$timestamp24];
- }else if(!empty($time) && !empty($season)){
- $firstday=date('Y-m-01',mktime(0,0,0,($season - 1) *3 +1,1,date('Y')));
- $lastday=date('Y-m-t',mktime(0,0,0,$season * 3,1,date('Y')));
- return [$firstday,$lastday];
- }
- }
- /**
- * 会员等级首页
- */
- public function group(){
- return $this->fetch();
- }
- /**
- * 会员详情
- */
- public function see($uid=''){
- $this->assign([
- 'uid'=>$uid,
- 'userinfo'=>UserModel::getUserDetailed($uid),
- 'is_layui'=>true,
- 'headerList'=>UserModel::getHeaderList($uid),
- 'count'=>UserModel::getCountInfo($uid),
- ]);
- return $this->fetch();
- }
- /*
- * 获取某个用户的推广下线
- * */
- public function getSpreadList($uid,$page=1,$limit=20){
- return Json::successful(UserModel::getSpreadList($uid,(int)$page,(int)$limit));
- }
- /**
- * 获取某用户的订单列表
- */
- public function getOneorderList($uid,$page=1,$limit=20){
- return Json::successful(StoreOrder::getOneorderList(compact('uid','page','limit')));
- }
- /**
- * 获取某用户的积分列表
- */
- public function getOneIntegralList($uid,$page=1,$limit=20){
- return Json::successful(UserBillAdmin::getOneIntegralList(compact('uid','page','limit')));
- }
- /**
- * 获取某用户的积分列表
- */
- public function getOneSignList($uid,$page=1,$limit=20){
- return Json::successful(UserBillAdmin::getOneSignList(compact('uid','page','limit')));
- }
- /**
- * 获取某用户的持有优惠劵
- */
- public function getOneCouponsList($uid,$page=1,$limit=20){
- return Json::successful(StoreCouponUser::getOneCouponsList(compact('uid','page','limit')));
- }
- /**
- * 获取某用户的余额变动记录
- */
- public function getOneBalanceChangList($uid,$page=1,$limit=20){
- return Json::successful(UserBillAdmin::getOneBalanceChangList(compact('uid','page','limit')));
- }
- }
|