539 lines
19 KiB
PHP
539 lines
19 KiB
PHP
<?php
|
|
namespace app\admin\logic\user;
|
|
|
|
use app\admin\validate\user\UserValidate;
|
|
use app\common\basics\Logic;
|
|
use app\common\enum\ClientEnum;
|
|
use app\common\enum\OrderEnum;
|
|
use app\common\logic\AccountLogLogic;
|
|
use app\common\model\AccountLog;
|
|
use app\common\model\BusinessTeam;
|
|
use app\common\model\user\User;
|
|
use app\common\model\user\UserLevel;
|
|
use app\common\model\user\UserTag;
|
|
use app\common\server\UrlServer;
|
|
use app\common\model\order\Order;
|
|
use think\facade\Db;
|
|
|
|
class UserLogic extends Logic
|
|
{
|
|
public static function lists($get)
|
|
{
|
|
$where[] = ['del','=', '0'];
|
|
|
|
//查询
|
|
if(isset($get['keyword']) && $get['keyword']){
|
|
$where[] = [$get['keyword_type'],'like', '%'. trim($get['keyword']) . '%'];
|
|
}
|
|
|
|
//用户状态
|
|
if(isset($get['disable']) && $get['disable'] !== ''){
|
|
$where[] = ['disable', '=', $get['disable']];
|
|
}
|
|
|
|
//业务团队
|
|
if(isset($get['team_id']) && $get['team_id'] !== ''){
|
|
$where[] = ['team_id','=',$get['team_id']];
|
|
}
|
|
|
|
//等级查询
|
|
if(isset($get['level']) && $get['level'] !== ''){
|
|
$where[] = ['level','=',$get['level']];
|
|
}
|
|
|
|
// 标签查询
|
|
if(isset($get['tag']) && $get['tag']){
|
|
$where[] = ['tag_ids','find in set',$get['tag']];
|
|
}
|
|
|
|
//注册来源
|
|
if(isset($get['client']) && $get['client']){
|
|
$where[] = ['client','=',$get['client']];
|
|
}
|
|
|
|
//消费金额
|
|
if(isset($get['total_amount_start']) && $get['total_amount_start']){
|
|
$where[] = ['total_order_amount','>=',$get['total_amount_start']];
|
|
}
|
|
if(isset($get['total_amount_end']) && $get['total_amount_end']){
|
|
$where[] = ['total_order_amount','<=',$get['total_amount_end']];
|
|
}
|
|
|
|
//注册时间
|
|
if(isset($get['start_time']) && $get['start_time']!=''){
|
|
$where[] = ['create_time','>=',strtotime($get['start_time'])];
|
|
}
|
|
if(isset($get['end_time']) && $get['end_time']!=''){
|
|
$where[] = ['create_time','<=',strtotime($get['end_time'])];
|
|
}
|
|
|
|
$user_count = User::where($where)->count();
|
|
|
|
$user_list = User::where($where)
|
|
->field('id,sn,nickname,avatar,level,total_order_amount,tag_ids,client,login_time,create_time,user_growth,user_money,earnings,first_leader,disable,team_id')
|
|
->page($get['page'],$get['limit'])
|
|
->order('id desc')
|
|
->select()
|
|
->toArray();
|
|
|
|
// 业务团队
|
|
$business_team = BusinessTeam::order('id desc')->column('name','id');
|
|
//会员等级
|
|
$user_level = UserLevel::where(['del'=>0])->column('name','id');
|
|
// 会员标签
|
|
$user_tag = UserTag::where(['del'=>0])->column('name', 'id');
|
|
// 注册来源
|
|
$client_list = ClientEnum::getClient(true);
|
|
|
|
foreach ($user_list as &$item){
|
|
// 可提现金额
|
|
$item['earnings'] = empty($item['earnings']) ? 0 : $item['earnings'];
|
|
// 总资产
|
|
$item['total_amount'] = $item['user_money'] + $item['earnings'];
|
|
// 业务团队
|
|
$item['team_name'] = $business_team[$item['team_id']] ?? '无';
|
|
// 会员等级
|
|
$item['level_name'] = '暂无等级';
|
|
if(isset($user_level[$item['level']])){
|
|
$item['level_name'] = $user_level[$item['level']];
|
|
}
|
|
// 头像
|
|
if ($item['avatar'] != '/static/common/image/default/user.png') {
|
|
$item['abs_avatar'] = $item['avatar'] ? UrlServer::getFileUrl($item['avatar']) : '';
|
|
} else {
|
|
$item['abs_avatar'] = '/static/common/image/default/user.png';
|
|
}
|
|
// 会员标签
|
|
$item['tag_str'] = '';
|
|
if(!empty($item['tag_ids'])) {
|
|
$tempArr = explode(',',$item['tag_ids']);
|
|
foreach($tempArr as $v) {
|
|
$item['tag_str'] .= $user_tag[$v] . ',';
|
|
}
|
|
$item['tag_str'] = trim( $item['tag_str'], ',');
|
|
}
|
|
// 注册来源
|
|
$item['client_desc'] = $client_list[$item['client']];
|
|
|
|
// 上级推荐人
|
|
$item['first_leader_info'] = User::getUserInfo($item['first_leader']);
|
|
|
|
//推荐下级人数
|
|
$item['fans'] = User::where([
|
|
['first_leader|second_leader', '=', $item['id']],
|
|
['del', '=', 0]
|
|
])->count();
|
|
}
|
|
|
|
return ['count'=>$user_count , 'lists'=>$user_list];
|
|
}
|
|
|
|
public static function setTag($post)
|
|
{
|
|
try{
|
|
User::where([
|
|
['id', 'in', $post['user_ids']]
|
|
])->update([
|
|
'tag_ids' => $post['tag_ids'],
|
|
'update_time' => time()
|
|
]);
|
|
return true;
|
|
}catch(\Exception $e) {
|
|
self::$error = $e->getMessage();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static function getUser($id)
|
|
{
|
|
$field = [
|
|
'id', 'sn','nickname','avatar','mobile','sex','birthday','tag_ids',
|
|
'remark','user_money','user_growth','user_integral','earnings', 'disable', 'team_id'
|
|
];
|
|
$user = User::field($field)->where(['del' => 0, 'id' => $id])->findOrEmpty();
|
|
|
|
if($user->isEmpty()) {
|
|
return [];
|
|
}
|
|
// 头像
|
|
if($user['avatar']) {
|
|
$user['avatar'] = UrlServer::getFileUrl($user['avatar']);
|
|
}
|
|
// 会员标签
|
|
$user['tag_ids'] = json_encode(explode(',', $user['tag_ids']));
|
|
// 业务团队
|
|
$user['team_ids'] = json_encode(explode(',', $user['team_id']));
|
|
|
|
return $user->toArray();
|
|
}
|
|
|
|
public static function edit($post)
|
|
{
|
|
try{
|
|
$data = [
|
|
'id' => $post['id'],
|
|
'nickname' => $post['nickname'],
|
|
'avatar' => clearDomain($post['avatar']),
|
|
'mobile' => $post['mobile'],
|
|
'birthday' => strtotime($post['birthday']),
|
|
'tag_ids' => $post['select'],
|
|
'team_id' => $post['team_id'] ?? 0,
|
|
'remark' => $post['remark'],
|
|
'disable' => $post['disable'],
|
|
'update_time' => time()
|
|
];
|
|
User::update($data);
|
|
return true;
|
|
}catch(\Exception $e) {
|
|
self::$error = $e->getMessage();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static function getInfo($id)
|
|
{
|
|
$field = [
|
|
'id', 'sn', 'nickname', 'avatar', 'birthday', 'sex', 'mobile', 'client',
|
|
'create_time','login_time', 'user_money', 'tag_ids', 'user_growth', 'earnings',
|
|
'first_leader', 'disable'
|
|
];
|
|
$user = User::field($field)->findOrEmpty($id);
|
|
|
|
if($user->isEmpty()) {
|
|
return [];
|
|
}
|
|
$user =$user->toArray();
|
|
$orderWhere = [
|
|
'user_id' => $id,
|
|
'del' => 0,
|
|
'pay_status' => OrderEnum::PAY_STATUS_PAID
|
|
];
|
|
// 上级推荐人
|
|
$user['first_leader_info'] = User::getUserInfo($user['first_leader']);
|
|
// 推荐下级人数
|
|
$user['fans'] = User::where([
|
|
['first_leader|second_leader', '=', $user['id']],
|
|
['del', '=', 0],
|
|
])->count();
|
|
// 总资产
|
|
$user['assets'] = $user['user_money'] + $user['earnings'];
|
|
// 总订单数
|
|
$user['order_num'] = Order::where($orderWhere)->count();
|
|
// 总消费金额
|
|
$user['total_amount'] = Order::where($orderWhere)->sum('order_amount');
|
|
$user['total_amount'] = round($user['total_amount'] ,2);
|
|
// 平均消费单价
|
|
$user['avg_amount'] = Order::where($orderWhere)->avg('order_amount');
|
|
$user['avg_amount'] = round($user['avg_amount'], 2);
|
|
// 头像
|
|
$user['avatar'] = UrlServer::getFileUrl($user['avatar']);
|
|
// 客户端
|
|
$user['client_desc'] = ClientEnum::getClient($user['client']);
|
|
// 会员标签
|
|
$user_tag = UserTag::where(['del'=>0])->column('name', 'id');
|
|
$user['tag_str'] = '';
|
|
if(!empty($user['tag_ids'])) {
|
|
$tempArr = explode(',',$user['tag_ids']);
|
|
foreach($tempArr as $v) {
|
|
$user['tag_str'] .= $user_tag[$v] . ',';
|
|
}
|
|
$user['tag_str'] = trim( $user['tag_str'], ',');
|
|
}
|
|
|
|
return $user;
|
|
}
|
|
|
|
public static function adjustAccount($post)
|
|
{
|
|
Db::startTrans();
|
|
try{
|
|
$user = User::findOrEmpty($post['id']);
|
|
if($user->isEmpty()) {
|
|
throw new \Exception('用户不存在');
|
|
}
|
|
// 余额调整
|
|
if($post['type'] == 'money') {
|
|
if(empty($post['money'])) {
|
|
throw new \Exception('请输入调整的余额');
|
|
}
|
|
if(empty($post['money_remark'])) {
|
|
throw new \Exception('请输入余额备注');
|
|
}
|
|
if($post['money_handle'] == 1) { // 增加
|
|
$user->user_money = $user->user_money + $post['money'];
|
|
$user->save();
|
|
AccountLogLogic::AccountRecord($user['id'], $post['money'],1,AccountLog::admin_add_money, $post['money_remark']);
|
|
}else{
|
|
$user->user_money = $user->user_money - $post['money'];
|
|
$user->save();
|
|
AccountLogLogic::AccountRecord($user['id'], $post['money'],0,AccountLog::admin_reduce_money, $post['money_remark']);
|
|
}
|
|
}
|
|
|
|
// 成长值调整
|
|
if($post['type'] == 'growth') {
|
|
if(empty($post['growth'])) {
|
|
throw new \Exception('请输入调整的成长值');
|
|
}
|
|
if(empty($post['growth_remark'])) {
|
|
throw new \Exception('请输入成长值备注');
|
|
}
|
|
if($post['growth_handle'] == 1) { // 增加
|
|
$user->user_growth = $user->user_growth + $post['growth'];
|
|
$user->save();
|
|
AccountLogLogic::AccountRecord($user['id'], $post['growth'],1,AccountLog::admin_add_growth, $post['growth_remark']);
|
|
}else{
|
|
$user->user_growth = $user->user_growth - $post['growth'];
|
|
$user->save();
|
|
AccountLogLogic::AccountRecord($user['id'], $post['growth'],0,AccountLog::admin_reduce_growth, $post['growth_remark']);
|
|
}
|
|
}
|
|
|
|
// 积分调整
|
|
if($post['type'] == 'integral') {
|
|
if(empty($post['integral'])) {
|
|
throw new \Exception('请输入调整的积分');
|
|
}
|
|
if(empty($post['integral_remark'])) {
|
|
throw new \Exception('请输入积分调整备注');
|
|
}
|
|
if($post['integral_handle'] == 1) { // 增加
|
|
$user->user_integral = $user->user_integral + $post['integral'];
|
|
$user->save();
|
|
AccountLogLogic::AccountRecord($user['id'], $post['integral'],1,AccountLog::admin_add_integral, $post['integral_remark']);
|
|
}else{
|
|
$user->user_integral = $user->user_integral - $post['integral'];
|
|
$user->save();
|
|
AccountLogLogic::AccountRecord($user['id'], $post['integral'],0,AccountLog::admin_reduce_integral, $post['integral_remark']);
|
|
}
|
|
}
|
|
|
|
|
|
// 佣金调整
|
|
if($post['type'] == 'earnings') {
|
|
if(empty($post['earnings'])) {
|
|
throw new \Exception('请输入调整的佣金');
|
|
}
|
|
if(empty($post['earnings_remark'])) {
|
|
throw new \Exception('请输入佣金调整备注');
|
|
}
|
|
if($post['earnings_handle'] == 1) { // 增加
|
|
$user->earnings = $user->earnings + $post['earnings'];
|
|
$user->save();
|
|
AccountLogLogic::AccountRecord($user['id'], $post['earnings'],1,AccountLog::admin_inc_earnings, $post['earnings_remark']);
|
|
}else{
|
|
$user->earnings = $user->earnings - $post['earnings'];
|
|
$user->save();
|
|
AccountLogLogic::AccountRecord($user['id'], $post['earnings'],0,AccountLog::admin_reduce_earnings, $post['earnings_remark']);
|
|
}
|
|
}
|
|
|
|
|
|
Db::commit();
|
|
return true;
|
|
}catch(\Exception $e) {
|
|
Db::rollback();
|
|
self::$error = $e->getMessage();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static function fans($params)
|
|
{
|
|
$where = [];
|
|
// 一级
|
|
if ($params['type'] == 'one') {
|
|
$where[] = ['first_leader', '=', $params['id']];
|
|
}
|
|
// 二级粉丝
|
|
if ($params['type'] == 'two') {
|
|
$where[] = ['second_leader', '=', $params['id']];
|
|
}
|
|
if(isset($params['keyword']) && !empty($params['keyword'])) {
|
|
$where[] = [$params['field'], 'like', '%'. $params['keyword'] . '%'];
|
|
}
|
|
$lists = User::field('id,sn,nickname,avatar,first_leader')
|
|
->where($where)
|
|
->page($params['page'], $params['limit'])
|
|
->select()
|
|
->toArray();
|
|
|
|
$count = User::field('id,sn,nickname,avatar,first_leader')
|
|
->where($where)
|
|
->count();
|
|
|
|
foreach($lists as &$item) {
|
|
$item['avatar'] = empty($item['avatar']) ? '' : UrlServer::getFileUrl($item['avatar']);
|
|
$item['first_leader_info'] = User::getUserInfo($item['first_leader']);
|
|
$item['fans'] = User::where([
|
|
['first_leader|second_leader', '=', $item['id']],
|
|
['del', '=', 0]
|
|
])->count();
|
|
}
|
|
return [
|
|
'lists' => $lists,
|
|
'count' => $count,
|
|
];
|
|
}
|
|
|
|
public static function adjustLevel($params)
|
|
{
|
|
try {
|
|
$user = User::findOrEmpty($params['id']);
|
|
if ($user->isEmpty()) {
|
|
throw new \Exception('用户不存在');
|
|
}
|
|
$user->level = $params['level'];
|
|
$user->remark = $params['remark'];
|
|
$user->save();
|
|
|
|
return true;
|
|
} catch(\Exception $e) {
|
|
self::$error = $e->getMessage();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static function adjustFirstLeader($params)
|
|
{
|
|
Db::startTrans();
|
|
try {
|
|
switch($params['type']) {
|
|
// 指定推荐人
|
|
case 'assign':
|
|
$formatData = self::assignFirstLeader($params);
|
|
break;
|
|
// 设置推荐人为系统,即清空上级
|
|
case 'system':
|
|
$formatData = self::clearFirstLeader($params);
|
|
break;
|
|
}
|
|
|
|
$user = User::findOrEmpty($params['id']);
|
|
// 旧关系链
|
|
if (!empty($user->ancestor_relation)) {
|
|
$old_ancestor_relation = $user->id . ',' .$user->ancestor_relation;
|
|
} else {
|
|
$old_ancestor_relation = $user->id;
|
|
}
|
|
|
|
|
|
// 更新当前用户的分销关系
|
|
User::where(['id' => $params['id']])->update($formatData);
|
|
|
|
//更新当前用户下级的分销关系
|
|
$data = [
|
|
'second_leader' => $formatData['first_leader'],
|
|
'third_leader' => $formatData['second_leader'],
|
|
'update_time' => time()
|
|
];
|
|
User::where(['first_leader' => $params['id']])->update($data);
|
|
|
|
//更新当前用户下下级的分销关系
|
|
$data = [
|
|
'third_leader' => $formatData['first_leader'],
|
|
'update_time' => time()
|
|
];
|
|
User::where(['second_leader' => $params['id']])->update($data);
|
|
|
|
//更新当前用户所有后代的关系链
|
|
$posterityArr = User::field('id,ancestor_relation')
|
|
->whereFindInSet('ancestor_relation', $params['id'])
|
|
->select()
|
|
->toArray();
|
|
$updateData = [];
|
|
$replace_ancestor_relation = $params['id'] . ','. $formatData['ancestor_relation'];
|
|
foreach($posterityArr as $item) {
|
|
$updateData[] = [
|
|
'id' => $item['id'],
|
|
'ancestor_relation' => trim(str_replace($old_ancestor_relation, $replace_ancestor_relation, $item['ancestor_relation']), ',')
|
|
];
|
|
}
|
|
// 批量更新
|
|
(new User())->saveAll($updateData);
|
|
|
|
Db::commit();
|
|
return true;
|
|
} catch(\Exception $e) {
|
|
Db::rollback();
|
|
self::$error = $e->getMessage();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static function assignFirstLeader($params)
|
|
{
|
|
if (empty($params['first_id'])) {
|
|
throw new \think\Exception('请选择推荐人');
|
|
}
|
|
$firstLeader = User::field(['id', 'first_leader', 'second_leader', 'third_leader', 'ancestor_relation'])
|
|
->where('id', $params['first_id'])
|
|
->findOrEmpty()
|
|
->toArray();
|
|
if(empty($firstLeader)) {
|
|
throw new \think\Exception('推荐人不存在');
|
|
}
|
|
|
|
if ($params['first_id'] == $params['id']) {
|
|
throw new \think\Exception('不能指定上级是自己');
|
|
}
|
|
$ancestorArr = explode(',', trim($firstLeader['ancestor_relation']));
|
|
if(!empty($ancestorArr) && in_array($params['id'], $ancestorArr)) {
|
|
throw new \think\Exception('不能指定推荐人为自己的下级');
|
|
}
|
|
|
|
// 上级
|
|
$first_leader_id = $firstLeader['id'];
|
|
// 上上级
|
|
$second_leader_id = $firstLeader['first_leader'];
|
|
// 上上上级
|
|
$third_leader_id = $firstLeader['second_leader'];
|
|
// 拼接关系链
|
|
$firstLeader['ancestor_relation'] = $firstLeader['ancestor_relation'] ?? ''; // 清空null值及0
|
|
$my_ancestor_relation = $first_leader_id. ',' . $firstLeader['ancestor_relation'];
|
|
// 去除两端逗号
|
|
$my_ancestor_relation = trim($my_ancestor_relation, ',');
|
|
$data = [
|
|
'first_leader' => $first_leader_id,
|
|
'second_leader' => $second_leader_id,
|
|
'third_leader' => $third_leader_id,
|
|
'ancestor_relation' => $my_ancestor_relation,
|
|
'update_time' => time()
|
|
];
|
|
return $data;
|
|
}
|
|
|
|
public static function clearFirstLeader($params)
|
|
{
|
|
$data = [
|
|
'first_leader' => 0,
|
|
'second_leader' => 0,
|
|
'third_leader' => 0,
|
|
'ancestor_relation' => '',
|
|
'update_time' => time()
|
|
];
|
|
return $data;
|
|
}
|
|
|
|
public static function userLists()
|
|
{
|
|
$where[] = ['del', '=', 0];
|
|
// 用户信息
|
|
if (isset($params['keyword']) && !empty($params['keyword'])) {
|
|
$where[] = ['sn|nickname', 'like', '%'. $params['keyword'] .'%'];
|
|
}
|
|
|
|
$lists = User::field('id,sn,nickname,id as distribution')
|
|
->where($where)
|
|
->page($params['page'], $params['limit'])
|
|
->select()
|
|
->toArray();
|
|
$count = User::where($where)->count();
|
|
|
|
return [
|
|
'count' => $count,
|
|
'lists' => $lists,
|
|
];
|
|
}
|
|
}
|