MemberService.php 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | LARAVEL8.0 框架 [ LARAVEL ][ RXThinkCMF ]
  4. // +----------------------------------------------------------------------
  5. // | 版权所有 2017~2021 LARAVEL研发中心
  6. // +----------------------------------------------------------------------
  7. // | 官方网站: http://www.laravel.cn
  8. // +----------------------------------------------------------------------
  9. // | Author: laravel开发员 <laravel.qq.com>
  10. // +----------------------------------------------------------------------
  11. namespace App\Services\Common;
  12. use App\Models\ActionLogModel;
  13. use App\Models\MemberModel;
  14. use App\Services\BaseService;
  15. use App\Services\RedisService;
  16. /**
  17. * 会员管理-服务类
  18. * @author laravel开发员
  19. * @since 2020/11/11
  20. * Class MemberService
  21. * @package App\Services\Common
  22. */
  23. class MemberService extends BaseService
  24. {
  25. public static $instance = null;
  26. /**
  27. * 构造函数
  28. * @author laravel开发员
  29. * @since 2020/11/11
  30. * MemberService constructor.
  31. */
  32. public function __construct()
  33. {
  34. $this->model = new MemberModel();
  35. }
  36. /**
  37. * 静态入口
  38. */
  39. public static function make()
  40. {
  41. if (!self::$instance) {
  42. self::$instance = new static();
  43. }
  44. return self::$instance;
  45. }
  46. /**
  47. * 列表
  48. * @param $params
  49. * @param int $pageSize
  50. * @return array
  51. */
  52. public function getDataList($params, $pageSize = 15)
  53. {
  54. $where = ['a.mark' => 1];
  55. $status = isset($params['status'])? $params['status'] : 0;
  56. $idcardCheck = isset($params['idcard_check'])? $params['idcard_check'] : 0;
  57. $parentId = isset($params['parent_id'])? $params['parent_id'] : 0;
  58. if($parentId>0){
  59. $where['a.parent_id'] = $parentId;
  60. }
  61. if($status>0){
  62. $where['a.status'] = $status;
  63. }
  64. if($idcardCheck>0){
  65. $where['a.idcard_check'] = $idcardCheck;
  66. }
  67. $list = $this->model->with(['agent','driver'])->from('member as a')
  68. ->leftJoin('member as c', 'c.id', '=', 'a.parent_id')
  69. ->where($where)
  70. ->where(function ($query) use($params){
  71. $keyword = isset($params['keyword'])? $params['keyword'] : '';
  72. if($keyword){
  73. $query->where('a.nickname','like',"%{$keyword}%")->orWhere('a.mobile','like',"%{$keyword}%")->orWhere('a.username','like',"%{$keyword}%");
  74. }
  75. })
  76. ->where(function ($query) use($params){
  77. $mobile = isset($params['mobile'])? trim($params['mobile']) : '';
  78. if($mobile){
  79. $query->where('a.mobile','like',"%{$mobile}%");
  80. }
  81. })
  82. ->select(['a.*','c.code as parent_code','c.nickname as parent_name','c.mobile as parent_mobile'])
  83. ->orderBy('a.create_time','desc')
  84. ->paginate($pageSize > 0 ? $pageSize : 9999999);
  85. $list = $list? $list->toArray() :[];
  86. if($list){
  87. foreach($list['data'] as &$item){
  88. $item['selected'] = false;
  89. $item['nickname'] = trim($item['nickname']);
  90. $item['name_first'] = mb_substr($item['nickname'],2,2,'utf-8');
  91. $item['create_time'] = $item['create_time']? datetime($item['create_time'],'Y-m-d H.i.s') : '';
  92. $item['login_time'] = $item['login_time']? datetime($item['login_time'],'Y-m-d H.i.s') : '';
  93. $item['avatar'] = isset($item['avatar']) && $item['avatar']? get_image_url($item['avatar']) : '';
  94. $item['idcard_back_img'] = isset($item['idcard_back_img']) && $item['idcard_back_img']? get_image_url($item['idcard_back_img']) : '';
  95. $item['idcard_front_img'] = isset($item['idcard_front_img']) && $item['idcard_front_img']? get_image_url($item['idcard_front_img']) : '';
  96. $item['idcard_hand_img'] = isset($item['idcard_hand_img']) && $item['idcard_hand_img']? get_image_url($item['idcard_hand_img']) : '';
  97. $item['parent_code'] = isset($item['parent_code']) && $item['parent_code']? $item['parent_code'] : '无';
  98. if($item['status']==1){
  99. $item['invite_num'] = MemberService::make()->getInviteNums($item['id']);
  100. }
  101. $item['is_agent'] = 2;
  102. if(isset($item['agent']) && $item['agent']){
  103. $item['is_agent'] = 1;
  104. }
  105. $item['is_driver'] = 2;
  106. if(isset($item['driver']) && $item['driver'] && $item['driver']['status'] == 2){
  107. $item['is_driver'] = 1;
  108. }
  109. }
  110. }
  111. return [
  112. 'pageSize'=> $pageSize,
  113. 'total'=>isset($list['total'])? $list['total'] : 0,
  114. 'list'=> isset($list['data'])? $list['data'] : []
  115. ];
  116. }
  117. /**
  118. * 直推用户数
  119. * @param $userId
  120. * @return array|mixed
  121. */
  122. public function getInviteNums($userId)
  123. {
  124. $cacheKey = "caches:member:inviteNums_{$userId}";
  125. $data = RedisService::get($cacheKey);
  126. if($data){
  127. return $data;
  128. }
  129. $data = $this->model->where(['parent_id'=> $userId, 'mark'=> 1,'status'=>1])->count('id');
  130. if($data){
  131. RedisService::set($cacheKey, $data, rand(3, 5));
  132. }
  133. return $data;
  134. }
  135. /**
  136. * 按日期统计注册用户数
  137. * @param $beginAt
  138. * @param $endAt
  139. * @param int $status
  140. * @return mixed
  141. */
  142. public function getRegisterCount($beginAt='', $endAt='', $status=1)
  143. {
  144. $where = ['mark' => 1,'status'=>$status];
  145. return $this->model->where($where)->where(function($query) use($beginAt,$endAt){
  146. if($beginAt && $endAt){
  147. $query->whereBetween('create_time', [strtotime($beginAt), strtotime($endAt)]);
  148. }else if($beginAt){
  149. $query->where('create_time','>=', strtotime($beginAt));
  150. }
  151. })->count('id');
  152. }
  153. /**
  154. * 上级用户列表
  155. * @return array
  156. */
  157. public function parents()
  158. {
  159. // 获取参数
  160. $param = request()->all();
  161. // 用户ID
  162. $keyword = getter($param, "keyword");
  163. $parentId = getter($param, "parent_id");
  164. $userId = getter($param, "user_id");
  165. $datas = $this->model->where(function($query) use($parentId){
  166. if($parentId){
  167. $query->where(['id'=> $parentId,'mark'=>1]);
  168. }else{
  169. $query->where(['status'=> 1,'mark'=>1]);
  170. }
  171. })
  172. ->where(function($query) use($userId){
  173. if($userId){
  174. $query->whereNotIn('id', [$userId]);
  175. }
  176. })
  177. ->where(function($query) use($keyword){
  178. if($keyword){
  179. $query->where('username','like',"{$keyword}%")->orWhere('mobile','like',"{$keyword}%");
  180. }
  181. })
  182. ->select(['id','username','mobile','code','nickname','status'])
  183. ->get();
  184. return $datas? $datas->toArray() : [];
  185. }
  186. /**
  187. * 用户选项
  188. * @return array
  189. */
  190. public function options()
  191. {
  192. // 获取参数
  193. $param = request()->all();
  194. // 用户ID
  195. $keyword = getter($param, "keyword");
  196. $parentId = getter($param, "parent_id");
  197. $userId = getter($param, "user_id");
  198. $datas = $this->model->where(function($query) use($parentId){
  199. if($parentId){
  200. $query->where(['id'=> $parentId,'mark'=>1]);
  201. }else{
  202. $query->where(['status'=> 1,'mark'=>1]);
  203. }
  204. })
  205. ->where(function($query) use($userId){
  206. if($userId){
  207. $query->whereNotIn('id', [$userId]);
  208. }
  209. })
  210. ->where(function($query) use($keyword){
  211. if($keyword){
  212. $query->where('nickname','like',"%{$keyword}%")->orWhere('mobile','like',"%{$keyword}%");
  213. }
  214. })
  215. ->select(['id','username','mobile','code','nickname','status'])
  216. ->get();
  217. return $datas? $datas->toArray() : [];
  218. }
  219. /**
  220. * 添加会编辑会员
  221. * @return array
  222. * @since 2020/11/11
  223. * @author laravel开发员
  224. */
  225. public function edit()
  226. {
  227. // 请求参数
  228. $data = request()->all();
  229. // 头像处理
  230. $avatar = trim($data['avatar']);
  231. if ($avatar) {
  232. $data['avatar'] = get_image_path($avatar);
  233. }
  234. if(isset($data['idcard_front_img'])){
  235. $data['idcard_front_img'] = get_image_path($data['idcard_front_img']);
  236. }
  237. if(isset($data['idcard_back_img'])){
  238. $data['idcard_back_img'] = get_image_path($data['idcard_back_img']);
  239. }
  240. if(isset($data['idcard_hand_img'])){
  241. $data['idcard_hand_img'] = get_image_path($data['idcard_hand_img']);
  242. }
  243. if(isset($data['wxpay_qrcode'])){
  244. $data['wxpay_qrcode'] = get_image_path($data['wxpay_qrcode']);
  245. }
  246. if(isset($data['alipay_qrcode'])){
  247. $data['alipay_qrcode'] = get_image_path($data['alipay_qrcode']);
  248. }
  249. // 出生日期
  250. if ($data['birthday']) {
  251. $data['birthday'] = strtotime($data['birthday']);
  252. }
  253. // 设置日志标题
  254. ActionLogModel::setTitle("修改会员信息");
  255. ActionLogModel::record();
  256. unset($data['agent']);
  257. unset($data['driver']);
  258. return parent::edit($data); // TODO: Change the autogenerated stub
  259. }
  260. /**
  261. * 删除
  262. * @return array
  263. */
  264. public function delete()
  265. {
  266. // 设置日志标题
  267. ActionLogModel::setTitle("删除会员信息");
  268. ActionLogModel::record();
  269. $this->model->where('mark',0)->where('update_time','<=', time() - 15*86400)->delete();
  270. return parent::delete(); // TODO: Change the autogenerated stub
  271. }
  272. }