mirror of
https://github.com/crmeb/CRMEB.git
synced 2025-12-15 13:22:51 +00:00
527 lines
21 KiB
PHP
527 lines
21 KiB
PHP
<?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')));
|
|
}
|
|
}
|