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; } }