glhcp/server/app/api/logic/UserLogic.php

527 lines
18 KiB
PHP

<?php
namespace app\api\logic;
use app\api\controller\Account;
use app\common\basics\Logic;
use app\common\logic\ChatLogic;
use app\common\model\BusinessTeam;
use app\common\model\goods\GoodsCollect;
use app\common\model\kefu\ChatRecord;
use app\common\model\kefu\ChatRelation;
use app\common\model\kefu\Kefu;
use app\common\model\user\User;
use app\common\model\order\Order;
use app\common\model\AfterSale;
use app\common\model\CouponList;
use app\common\model\user\UserLevel;
use app\common\server\ConfigServer;
use app\common\model\AccountLog;
use app\common\server\UrlServer;
use app\common\server\WeChatServer;
use app\common\server\storage\Driver as StorageDriver;
use think\facade\Db;
use EasyWeChat\Factory;
use EasyWeChat\Kernel\Exceptions\Exception;
class UserLogic extends Logic
{
public static function center($user_id)
{
$user = User::findOrEmpty($user_id);
if($user->isEmpty()) {
return [];
}
// 头像
$user->avatar = UrlServer::getFileUrl($user->avatar);
//待支付
$user->wait_pay = Order::where(['del'=>0,'user_id'=>$user_id,'order_status'=>Order::STATUS_WAIT_PAY,'pay_status'=>0])->count();
//待发货
$user->wait_delivery = Order::where(['del'=>0,'user_id'=>$user_id,'order_status'=>Order::STATUS_WAIT_DELIVERY,'pay_status'=>1])->count();
//待收货
$user->wait_take = Order::where(['del'=>0,'user_id'=>$user_id,'order_status'=>Order::STATUS_WAIT_RECEIVE,'pay_status'=>1])->count();
//待评论
$user->wait_comment = Order::alias('o')
->join('order_goods og','o.id = og.order_id')
->where(['del'=>0,'user_id'=>$user_id,'order_status'=>Order::STATUS_FINISH,'og.is_comment'=>0])
->count('og.id');
//售后中
$user->after_sale = AfterSale::where(['del'=>0,'user_id'=>$user_id])
->where('status','<>',AfterSale::STATUS_SUCCESS_REFUND)
->count();
// 优惠券
$user->coupon = CouponList::where(['user_id'=>$user_id,'del'=>0,'status'=>0])->count();
//分销开关
$user->distribution_setting = ConfigServer::get('distribution', 'is_open',1);
//消息数量
$user->notice_num = 0;
//收藏商品数量
$user->collect = GoodsCollect::where(['user_id' => $user_id, 'status' => 1])->count();
// 会员等级
$level_list = UserLevel::where(['del'=>0])->order('growth_value', 'asc')->column('id,name,growth_value,image,background_image', 'id');
$user['level_name'] = isset($level_list[$user['level']]) ? $level_list[$user['level']]['name'] : '-';
$user['vip'] = 0;
$level_list = array_values($level_list);
foreach($level_list as $k=>$v){
if($v['id'] == $user['level']) {
$user['vip'] = $k + 1;
}
}
//下个会员等级提示
$user_level = UserLevel::where([
['id','>',$user->getData('level')],
['del','=',0]
])->order('growth_value asc')
->findOrEmpty();
$user['next_level_tips'] = '';
if(!$user_level->isEmpty()){
$user['next_level_tips'] = '距离升级还差'.intval($user_level['growth_value'] - $user['user_growth']);
}
$team = [
'id' => 0,
'name' => '',
'phone' => '',
];
// 团队信息
$teamInfo = BusinessTeam::where('id', $user['team_id'])->find();
if (!empty($teamInfo)) {
$team['id'] = $teamInfo['id'] ?? 0;
$team['name'] = $teamInfo['name'] ?: '';
$team['phone'] = $teamInfo['phone'] ?: '';
}
// 是否设置支付密码
$user['hasPayPassword'] = $user['pay_password'] ? 1: 0;
$user->visible(['id','nickname','sn','avatar', 'mobile', 'hasPayPassword','next_level_tips','user_money','total_order_amount','total_recharge_amount',
'coupon','user_integral','level','wait_pay','wait_take','wait_delivery',
'wait_comment','after_sale', 'distribution_setting', 'distribution_code', 'notice_num', 'collect','level_name','vip','team_id']);
$user = $user->toArray();
$user['team_info'] = $team;
return $user;
}
public static function accountLog($user_id,$source,$type,$page,$size){
$source_type = '';
$where[] = ['user_id','=',$user_id];
switch ($source){
case 1:
$source_type = AccountLog::money_change;
break;
case 2:
$source_type = AccountLog::integral_change;
break;
case 3:
$source_type = AccountLog::growth_change;
}
$where[] = ['source_type','in',$source_type];
if($type && $type != 0){
$where[] = ['change_type','=',$type];
}
$count = AccountLog::where($where)->count();
$list = AccountLog::where($where)
->page($page,$size)
->order('id desc')
->field('id,change_amount,change_amount as change_amount_format,source_type,change_type,create_time,create_time as create_time_format')
->select()
->toArray();
$more = is_more($count,$page,$size); //是否有下一页
$data = [
'list' => $list,
'page_no' => $page,
'page_size' => $size,
'count' => $count,
'more' => $more
];
return $data;
}
public static function getUserLevelInfo($id)
{
$user = User::field('id,avatar,nickname,level,user_growth')->findOrEmpty($id);
if($user->isEmpty()) {
return ['error_msg' => '会员不存在'];
}
$user = $user->toArray();
$level_list = UserLevel::where(['del'=>0])->order('growth_value', 'asc')->column('id,name,growth_value,image,background_image', 'id');
// 用户会员等级
$user['level_name'] = isset($level_list[$user['level']]) ? $level_list[$user['level']]['name'] : '-';
// 用户头像
$user['avatar'] = UrlServer::getFileUrl($user['avatar']);
// 重置会员等级列表索引
$level_list = array_values($level_list);
// 获取当前用户对应等级的索引
$index = null;
foreach($level_list as $key => $item) {
if($item['id'] == $user['level']) {
$index = $key;
}
}
// 遍历标识每个会员等级信息
foreach($level_list as $key => &$item) {
$diff_growth_percent = 0; //距离下个等级成长百分比
if($index === false || $index < $key) {
$item['lock_desc'] = '未解锁';
$item['tips1'] = '当前成长值 '. $user['user_growth'];
$item['tips2'] = '还需'.($item['growth_value'] - $user['user_growth']).'成长值';
$item['current_level_status'] = -1;
}else if($index > $key) {
$item['lock_desc'] = '已解锁';
$item['tips1'] = '当前高于该等级 ';
$item['tips2'] = '';
$item['current_level_status'] = 0;
}else if($index == $key) {
$item['current_level_status'] = 1;
$item['lock_desc'] = '当前等级';
$item['tips1'] = '当前成长值 '. $user['user_growth'];
//下个等级
$next_level = $level_list[$key+1] ?? [];
if($next_level) {
$diff_growth_percent = round($user['user_growth'] / $next_level['growth_value'],2);
$item['tips2'] = '满'.$next_level['growth_value'].'可升级';
} else {
$item['tips2'] = '';
}
}
$item['diff_growth_percent'] = $diff_growth_percent;
$item['image'] = empty($item['image']) ? '' : UrlServer::getFileUrl($item['image']);
$item['background_image'] = empty($item['background_image']) ? '' : UrlServer::getFileUrl($item['background_image']);
}
$level_intro = ConfigServer::get('user_level', 'intro', '');
$data = [
'user' => $user,
'level' => $level_list,
'level_intro' => $level_intro
];
return $data;
}
public static function getGrowthList($get)
{
$user_growth = User::where(['id'=>$get['user_id']])->value('user_growth');
$where = [
['user_id', '=', $get['user_id']],
['source_type', 'in', AccountLog::growth_change]
];
$lists = AccountLog::field('id,source_type,change_amount as change_amount_format,change_type,create_time as create_time_format')
->where($where)
->order('create_time', 'desc')
->page($get['page_no'], $get['page_size'])
->select()
->toArray();
$count = AccountLog::field('id,source_type,change_amount as change_amount_format,change_type,create_time as create_time_format')
->where($where)
->count();
$data = [
'count' => $count,
'lists' => $lists,
'page_no' => $get['page_no'],
'page_size' => $get['page_size'],
'more' => is_more($count, $get['page_no'], $get['page_size']),
'user_growth' => $user_growth
];
return $data;
}
public static function myWallet($user_id)
{
$info = User::where(['id'=>$user_id])
->field('user_money,total_order_amount,total_recharge_amount')
->findOrEmpty();
if($info->isEmpty()) {
self::$error = '用户不存在';
return false;
}
$info = $info->toArray();
$info['open_racharge'] = ConfigServer::get('recharge','open_racharge',0);
return $info;
}
//获取用户信息
public static function getUserInfo($user_id)
{
$info = User::where(['id' => $user_id])
->field('id,sn,nickname,avatar,mobile,sex,create_time')
->find()
->toArray();
$info['avatar'] = $info['avatar'] ? UrlServer::getFileUrl($info['avatar']) : '';
return $info;
}
//设置个人信息
public static function setUserInfo($post)
{
try{
$field = $post['field'];
$value = $post['value'];
User::where(['id'=> $post['user_id']])
->update([$field => $value]);
return true;
}catch(\Exception $e) {
self::$error = $e->getMessage();
return false;
}
}
//更新微信信息
public static function updateWechatInfo($user_id, $post)
{
Db::startTrans();
try{
$time = time();
$avatar_url = $post['avatar'];
$nickanme = $post['nickname'];
$sex = $post['sex'];
$config = [
'default' => ConfigServer::get('storage', 'default', 'local'),
'engine' => ConfigServer::get('storage_engine')
];
$avatar = ''; //头像路径
if ($config['default'] == 'local') {
$file_name = md5($user_id . $time. rand(10000, 99999)) . '.jpeg';
$avatar = download_file($avatar_url, 'uploads/user/avatar/', $file_name);
} else {
$avatar = 'uploads/user/avatar/' . md5($user_id . $time. rand(10000, 99999)) . '.jpeg';
$StorageDriver = new StorageDriver($config);
if (!$StorageDriver->fetch($avatar_url, $avatar)) {
throw new Exception( '头像保存失败:'. $StorageDriver->getError());
}
}
User::where(['id' => $user_id])->update([
'nickname' => $nickanme,
'avatar' => $avatar,
'sex' => $sex
]);
Db::commit();
return true;
} catch(\Exception $e) {
Db::rollback();
self::$error = $e->getMessage();
return false;
}
}
//获取微信手机号
public static function getMobileByMnp($post)
{
Db::startTrans();
try {
$config = WeChatServer::getMnpConfig();
$app = Factory::miniProgram($config);
$response = $app->auth->session($post['code']);
if (!isset($response['session_key'])) {
throw new Exception('获取用户信息失败');
}
$response = $app->encryptor->decryptData($response['session_key'], $post['iv'], $post['encrypted_data']);
$isExist = User::where([
['mobile', '=', $response['phoneNumber']],
['id', '<>', $post['user_id']]
])->findOrEmpty();
if (!$isExist->isEmpty()) {
throw new Exception('手机号已被其他账号绑定');
}
User::update(['id' => $post['user_id'], 'mobile' => $response['phoneNumber']]);
Db::commit();
return true;
} catch (Exception $e) {
Db::rollback();
self::$error = $e->getMessage();
return false;
}
}
//修改手机号
public static function changeMobile($user_id, $data)
{
$user = User::find($user_id);
$user->mobile = $data['new_mobile'];
$user->save();
return $user;
}
//我的粉丝列表
public static function fans($user_id, $get, $page, $size)
{
$where = [];
if (isset($get['keyword']) && $get['keyword'] != ''){
$where[] = ['nickname|mobile','like','%'.$get['keyword'].'%'];
}
//查询条件
$type = $get['type'] ?? 'all';
switch ($type){
case 'first':
$where[] = ['first_leader', '=', $user_id];
break;
case 'second':
$where[] = ['second_leader', '=', $user_id];
break;
default:
$where[] = ['first_leader|second_leader', '=', $user_id];
}
$field = 'u.id, avatar, nickname, mobile, u.create_time, order_num as fans_order,
order_amount as fans_money, fans as fans_team';
$count = User::alias('u')
->field($field)
->leftJoin('user_distribution d', 'd.user_id = u.id')
->where($where)
->count();
$lists = User::alias('u')
->field($field)
->leftJoin('user_distribution d', 'd.user_id = u.id')
->where($where)
->page($page, $size)
->order(self::fansListsSort($get))
->select();
foreach ($lists as &$item) {
$item['avatar'] = UrlServer::getFileUrl($item['avatar']);
$item['fans_team'] = $item['fans_team'] ?? 0;
$item['fans_order'] = $item['fans_order'] ?? 0;
$item['fans_money'] = $item['fans_money'] ?? 0;
unset($item['fans'], $item['distribution_order_num'], $item['distribution_money']);
}
$data = [
'list' => $lists,
'page' => $page,
'size' => $size,
'count' => $count,
'more' => is_more($count, $page, $size)
];
return $data;
}
//粉丝列表排序
public static function fansListsSort($get)
{
if (isset($get['fans']) && $get['fans'] != ''){
return ['fans_team' => $get['fans'], 'u.id' => 'desc'];
}
if (isset($get['money']) && $get['money'] != ''){
return ['fans_money' => $get['money'], 'u.id' => 'desc'];
}
if (isset($get['order']) && $get['order'] != ''){
return ['fans_order' => $get['order'], 'u.id' => 'desc'];
}
return ['u.id' => 'desc'];
}
/**
* @notes 获取聊天记录
* @param $user_id
* @param $shop_id
* @param $page
* @param $size
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* @author 段誉
* @date 2021/12/29 18:20
*/
public static function getChatRecord($user_id, $shop_id, $page, $size)
{
$map1 = [
['shop_id', '=', $shop_id],
['from_id', '=', $user_id],
['from_type', '=', 'user'],
];
$map2 = [
['shop_id', '=', $shop_id],
['to_id', '=', $user_id],
['to_type', '=', 'user'],
];
// 通信记录
$records = ChatRecord::whereOr([$map1, $map2])
->order('id desc')
->page($page, $size)
->select()->toArray();
$count = ChatRecord::whereOr([$map1, $map2])->count();
// 上一个客服关系
$kefu = self::getLastRelation((int)$user_id, (int)$shop_id);
// 当前在线的所有客服
$online = ChatLogic::getOnlineKefu($shop_id);
// 后台配置=>[1=>人工客服; 2=>在线客服]
if ($shop_id > 0) {
$config = ConfigServer::get('shop_customer_service', 'type', 1, $shop_id);
} else {
$config = ConfigServer::get('customer_service', 'type', 1);
}
$kefu_id = $kefu['kefu_id'] ?? 0;
$records = ChatLogic::formatChatRecords($records, $count, $page, $size);
// 没有在线客服或者后台配置为 人工客服
if (empty($online) || $config == 1) {
return ['config' => $config, 'kefu' => [], 'record' => $records];
}
// 没有聊天记录(未与客服聊天) 或者 曾经的聊天客服不在线
if (empty($kefu) || !in_array($kefu_id, $online)) {
// 随机分配客服
$rand = rand(0, count($online) - 1);
$kefu_id = $online[$rand];
}
$kefu = Kefu::where(['id' => $kefu_id])
->field(['id', 'nickname', 'avatar'])
->findOrEmpty();
return ['config' => $config, 'kefu' => $kefu, 'record' => $records];
}
/**
* @notes 获取用户最后通信的客服id
* @param int $user_id
* @param int $shop_id
* @return array|\think\Model
* @author 段誉
* @date 2021/12/29 18:20
*/
public static function getLastRelation(int $user_id, int $shop_id)
{
$relation = ChatRelation::where([
'user_id' => $user_id,
'shop_id' => $shop_id
])->order('update_time desc')->findOrEmpty();
return $relation;
}
}