MemberService.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749
  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\AccountLogModel;
  13. use App\Models\ActionLogModel;
  14. use App\Models\MemberAddressModel;
  15. use App\Models\MemberCouponModel;
  16. use App\Models\MemberModel;
  17. use App\Services\BaseService;
  18. use App\Services\RedisService;
  19. use Illuminate\Support\Facades\DB;
  20. /**
  21. * 会员管理-服务类
  22. * @author laravel开发员
  23. * @since 2020/11/11
  24. * Class MemberService
  25. * @package App\Services\Common
  26. */
  27. class MemberService extends BaseService
  28. {
  29. public static $instance = null;
  30. /**
  31. * 构造函数
  32. * @author laravel开发员
  33. * @since 2020/11/11
  34. * MemberService constructor.
  35. */
  36. public function __construct()
  37. {
  38. $this->model = new MemberModel();
  39. }
  40. /**
  41. * 静态入口
  42. */
  43. public static function make()
  44. {
  45. if (!self::$instance) {
  46. self::$instance = new static();
  47. }
  48. return self::$instance;
  49. }
  50. /**
  51. * 获取列表
  52. */
  53. public function getList()
  54. {
  55. $params = request()->all();
  56. $pageSize = $params['limit'] ?? 20;
  57. $where = ['member.mark' => 1];
  58. $status = isset($params['status']) ? $params['status'] : 0;
  59. if ($status > 0) {
  60. $where['member.status'] = $status;
  61. }
  62. $query = $this->model->with(['parent','point','levelData'])
  63. ->from('member')
  64. ->leftJoin('member as b','b.id','=','member.parent_id')
  65. ->leftJoin('member as c','c.id','=','member.point_id')
  66. ->where($where)
  67. ->where(function ($query) use ($params) {
  68. $keyword = isset($params['keyword']) ? $params['keyword'] : '';
  69. if ($keyword) {
  70. $query->where('member.nickname', 'like', "%{$keyword}%")->orWhere('member.realname', 'like', "%{$keyword}%");
  71. }
  72. })
  73. ->where(function ($query) use ($params) {
  74. $mobile = isset($params['mobile']) ? trim($params['mobile']) : '';
  75. if ($mobile) {
  76. $query->where('member.mobile', 'like', "%{$mobile}%");
  77. }else{
  78. $query->where('member.mobile', '>', 0);
  79. }
  80. // 推荐人ID
  81. $parentId = isset($params['parent_id'])?intval($params['parent_id']):0;
  82. if ($parentId>0) {
  83. $query->where('member.parent_id', $parentId);
  84. }
  85. $parent = isset($params['parent']) ? trim($params['parent']) : '';
  86. if (!empty($parent)) {
  87. $query->where(function ($q) use ($parent) {
  88. $q->where('b.nickname', 'like', "%{$parent}%")
  89. ->orWhere('b.mobile', 'like', "%{$parent}%");
  90. });
  91. }
  92. // 推荐节点
  93. $pointId = isset($params['point_id'])?$params['point_id']:0;
  94. if ($pointId>0) {
  95. $query->where('member.point_id', $pointId);
  96. }
  97. // 节点上级
  98. $point = isset($params['point']) ? trim($params['point']) : '';
  99. if (!empty($point)) {
  100. $query->where(function ($q) use ($point) {
  101. $q->where('c.nickname', 'like', "%{$point}%")
  102. ->orWhere('c.mobile', 'like', "%{$point}%");
  103. });
  104. }
  105. })
  106. ->select(['member.*'])
  107. ->withCount(['invites','points'])
  108. ->orderBy('member.create_time', 'desc')
  109. ->orderBy('member.id', 'desc');
  110. $list = $query->paginate($pageSize > 0 ? $pageSize : 9999999);
  111. $list = $list ? $list->toArray() : [];
  112. if ($list) {
  113. foreach ($list['data'] as &$item) {
  114. $item['avatar'] = $item['avatar'] ? get_image_url($item['avatar']) : '';
  115. $item['balance'] = number_format($item['balance'], 2, '.', '');
  116. $item['create_time_text'] = datetime($item['create_time'],'Y-m-d H:i:s');
  117. $item['login_time_text'] = $item['login_time'] ? datetime($item['login_time'],'Y-m-d H:i:s') : '-';
  118. $item['status_text'] = $item['status'] == 1 ? '正常' : '冻结';
  119. $item['invites_count'] = $item['invites_count']?$item['invites_count']:0;
  120. $item['points_count'] = $item['points_count']?$item['points_count']:0;
  121. }
  122. }
  123. return [
  124. 'code' => 0,
  125. 'msg' => '获取成功',
  126. 'data' => isset($list['data'])?$list['data']:[],
  127. 'count' => isset($list['total'])?$list['total']:0
  128. ];
  129. }
  130. /**
  131. * 列表(兼容旧方法)
  132. * @param $params
  133. * @param int $pageSize
  134. * @return array
  135. */
  136. public function getDataList($params, $pageSize = 15)
  137. {
  138. $where = ['a.mark' => 1];
  139. $status = isset($params['status']) ? $params['status'] : 0;
  140. if ($status > 0) {
  141. $where['a.status'] = $status;
  142. }
  143. $query = $this->model->from('member as a')
  144. ->where($where)
  145. ->where(function ($query) use ($params) {
  146. $keyword = isset($params['keyword']) ? $params['keyword'] : '';
  147. if ($keyword) {
  148. $query->where('a.nickname', 'like', "%{$keyword}%")->orWhere('a.realname', 'like', "%{$keyword}%");
  149. }
  150. })
  151. ->where(function ($query) use ($params) {
  152. $mobile = isset($params['mobile']) ? trim($params['mobile']) : '';
  153. if ($mobile) {
  154. $query->where('a.mobile', 'like', "%{$mobile}%");
  155. }
  156. })
  157. ->select(['a.*']);
  158. $query->orderBy('a.create_time', 'desc')->orderBy('a.id', 'desc');
  159. $list = $query->paginate($pageSize > 0 ? $pageSize : 9999999);
  160. $list = $list ? $list->toArray() : [];
  161. return [
  162. 'pageSize' => $pageSize,
  163. 'total' => isset($list['total']) ? $list['total'] : 0,
  164. 'list' => isset($list['data']) ? $list['data'] : []
  165. ];
  166. }
  167. /**
  168. * 按日期统计注册用户数
  169. * @param $beginAt
  170. * @param $endAt
  171. * @param int $status
  172. * @return mixed
  173. */
  174. public function getRegisterCount($beginAt = 0, $endAt = 0, $status = 0)
  175. {
  176. $cacheKey = "caches:members:count_{$beginAt}_{$endAt}_{$status}";
  177. $data = RedisService::get($cacheKey);
  178. if ($data) {
  179. return $data;
  180. }
  181. $query = $this->model->where('mark', 1);
  182. // 如果指定了状态,添加状态筛选
  183. if ($status > 0) {
  184. $query->where('status', $status);
  185. }
  186. // 时间范围筛选
  187. if ($beginAt && $endAt) {
  188. $query->whereBetween('create_time', [strtotime($beginAt), strtotime($endAt)]);
  189. } else if ($beginAt) {
  190. $query->where('create_time', '>=', strtotime($beginAt));
  191. }
  192. $data = $query->count('id');
  193. if ($data) {
  194. RedisService::set($cacheKey, $data, rand(300, 600));
  195. }
  196. return $data;
  197. }
  198. /**
  199. * 搜索用户(用于下拉选择)
  200. * @param string $keyword 搜索关键词
  201. * @param int $accountType 账户类型
  202. * @param int $limit 返回数量
  203. * @return array
  204. */
  205. public function searchUsers($keyword = '', $accountType = 1, $limit = 20)
  206. {
  207. try {
  208. if ($accountType == 2) {
  209. // 代理账户:以 agents 表为主
  210. $query = \Illuminate\Support\Facades\DB::table('agents')
  211. ->where('mark', 1);
  212. // 关键词搜索
  213. if (!empty($keyword)) {
  214. $query->where(function ($q) use ($keyword) {
  215. $q->where('id', $keyword)
  216. ->orWhere('user_id', $keyword)
  217. ->orWhere('real_name', 'like', "%{$keyword}%")
  218. ->orWhere('phone', 'like', "%{$keyword}%");
  219. });
  220. }
  221. $list = $query->select([
  222. 'user_id as id',
  223. 'real_name as nickname',
  224. 'real_name as realname',
  225. 'phone as mobile',
  226. \Illuminate\Support\Facades\DB::raw('2 as user_type')
  227. ])
  228. ->limit($limit)
  229. ->get()
  230. ->toArray();
  231. } elseif ($accountType == 3) {
  232. // 商户账户:以 stores 表为主
  233. $query = \Illuminate\Support\Facades\DB::table('stores')
  234. ->where('mark', 1);
  235. // 关键词搜索
  236. if (!empty($keyword)) {
  237. $query->where(function ($q) use ($keyword) {
  238. $q->where('id', $keyword)
  239. ->orWhere('user_id', $keyword)
  240. ->orWhere('name', 'like', "%{$keyword}%")
  241. ->orWhere('real_name', 'like', "%{$keyword}%")
  242. ->orWhere('phone', 'like', "%{$keyword}%");
  243. });
  244. }
  245. $list = $query->select([
  246. 'user_id as id',
  247. \Illuminate\Support\Facades\DB::raw('COALESCE(name, real_name) as nickname'),
  248. 'real_name as realname',
  249. 'phone as mobile',
  250. \Illuminate\Support\Facades\DB::raw('3 as user_type')
  251. ])
  252. ->limit($limit)
  253. ->get()
  254. ->toArray();
  255. } else {
  256. // 会员账户:从 member 表查询
  257. $query = MemberModel::where('mark', 1)
  258. ->whereIn('user_type', [0, 1]);
  259. // 关键词搜索:昵称、手机号、ID
  260. if (!empty($keyword)) {
  261. $query->where(function ($q) use ($keyword) {
  262. $q->where('id', $keyword)
  263. ->orWhere('nickname', 'like', "%{$keyword}%")
  264. ->orWhere('realname', 'like', "%{$keyword}%")
  265. ->orWhere('mobile', 'like', "%{$keyword}%");
  266. });
  267. }
  268. $list = $query->select(['id', 'nickname', 'realname', 'mobile', 'user_type'])
  269. ->limit($limit)
  270. ->get()
  271. ->toArray();
  272. }
  273. // 转换为数组(如果是对象)
  274. $list = json_decode(json_encode($list), true);
  275. return [
  276. 'code' => 0,
  277. 'msg' => '获取成功',
  278. 'data' => $list
  279. ];
  280. } catch (\Exception $e) {
  281. return [
  282. 'code' => 1,
  283. 'msg' => '搜索失败:' . $e->getMessage(),
  284. 'data' => []
  285. ];
  286. }
  287. }
  288. /**
  289. * 用户选项
  290. * @return array
  291. */
  292. public function options()
  293. {
  294. // 获取参数
  295. $param = request()->all();
  296. // 用户ID
  297. $keyword = getter($param, "keyword");
  298. $parentId = getter($param, "parent_id");
  299. $userId = getter($param, "user_id");
  300. $datas = $this->model->where(function ($query) use ($parentId) {
  301. if ($parentId) {
  302. $query->where(['id' => $parentId, 'mark' => 1]);
  303. } else {
  304. $query->where(['status' => 1, 'mark' => 1]);
  305. }
  306. })
  307. ->where(function ($query) use ($userId) {
  308. $query->where('mobile', '>',0);
  309. if ($userId) {
  310. $query->whereNotIn('id', [$userId]);
  311. }
  312. })
  313. ->where(function ($query) use ($keyword) {
  314. if ($keyword) {
  315. $query->where('nickname', 'like', "%{$keyword}%")->orWhere('mobile', 'like', "%{$keyword}%");
  316. }
  317. })
  318. ->select(['id', 'mobile', 'code', 'nickname', 'status'])
  319. ->get();
  320. return $datas ? $datas->toArray() : [];
  321. }
  322. /**
  323. * 修改推荐人
  324. * @param $adminId
  325. * @param $params
  326. * @return array
  327. */
  328. public function modifyParent($adminId, $params)
  329. {
  330. $id = isset($params['id'])?$params['id'] : 0;
  331. $parentId = isset($params['parent_id'])?$params['parent_id'] : 0;
  332. if($id<=0){
  333. $this->error = '用户参数错误';
  334. return false;
  335. }
  336. if($parentId<=0){
  337. $this->error = '请选择推荐人';
  338. return false;
  339. }
  340. $info = $this->model->where(['id'=> $id])->first();
  341. $memberParentId = isset($info['parent_id'])? $info['parent_id'] : 0;
  342. if($memberParentId == $parentId){
  343. $this->error = '推荐人未修改';
  344. return false;
  345. }
  346. $parent = $this->model->where(['id'=> $parentId])->first();
  347. $parents = isset($parent['parents'])?$parent['parents'] : '';
  348. $parents = $parents? explode(',', $parents) : [];
  349. $parents = array_filter($parents);
  350. $parents[] = $parentId;
  351. $parents = ','.implode(',', $parents).',';
  352. // 滑落节点
  353. $pointId = 0;
  354. $points = '';
  355. $pointSorts = '';
  356. if($parentId>0){
  357. $pointData = \App\Services\Api\MemberService::make()->getPointParentId($parentId);
  358. $pointSort = isset($pointData['point_sort']) && $pointData['point_sort']?$pointData['point_sort'] : 0;
  359. if($pointId){
  360. $pointParent = $this->model->where(['id'=> $pointId,'mark'=>1])->select(['id','points','point_sort'])->first();
  361. $points = isset($pointParent['points']) && $pointParent['points']? $pointParent['points'].$pointId.',' : ($pointId ? $pointId . ',' : '');
  362. $pointSorts = isset($pointParent['point_sort']) && $pointParent['point_sort']? $pointParent['point_sort'].''.$pointSort : $pointSort;
  363. }
  364. }
  365. DB::beginTransaction();
  366. $info->parent_id = $parentId;
  367. $info->parents = $parents;
  368. $info->point_id = $pointId;
  369. $info->points = $points;
  370. $info->point_sort = $pointSorts;
  371. $info->update_time = time();
  372. if(!$info->save()){
  373. DB::rollBack();
  374. $this->error = '修改失败';
  375. return false;
  376. }
  377. // 修改下级推荐参数
  378. if($this->model->where(['parent_id'=> $id])->count('id') && !$this->model->where(['parent_id'=> $id])->update(['parents'=> $parents.$id.',','update_time'=>time()])){
  379. DB::rollBack();
  380. $this->error = '修改下级推荐数据失败';
  381. return false;
  382. }
  383. // 修改下级节点参数
  384. if($this->model->where(['point_id'=> $id])->count('id') && !$this->model->where(['point_id'=> $id])->update(['points'=> $points.$id.',','update_time'=>time()])){
  385. DB::rollBack();
  386. $this->error = '修改下级节点数据失败';
  387. return false;
  388. }
  389. DB::commit();
  390. // 设置日志
  391. ActionLogModel::setRecord($adminId, ['type' => 1, 'title' => '修改会员推荐人', 'content' => json_encode($params, 256), 'module' => 'admin']);
  392. ActionLogModel::record();
  393. $this->error = '修改成功';
  394. RedisService::keyDel("caches:members*");
  395. return true;
  396. }
  397. /**
  398. * 账户充值
  399. * @param $adminId
  400. * @param $params
  401. * @return array
  402. */
  403. public function recharge($adminId, $params)
  404. {
  405. $id = isset($params['user_id'])?$params['user_id'] : 0;
  406. $accountType = isset($params['account_type'])?$params['account_type'] : 0;
  407. $changeType = isset($params['change_type'])&&$params['change_type']?$params['change_type'] : 1;
  408. $money = isset($params['money'])?floatval($params['money']) : 0;
  409. if($id<=0){
  410. $this->error = '用户参数错误';
  411. return false;
  412. }
  413. if($accountType<=0){
  414. $this->error = '请选择账户';
  415. return false;
  416. }
  417. if($money<=0){
  418. $this->error = '请输入调整金额或数量';
  419. return false;
  420. }
  421. $accounts = ['余额','余额','数字资产','报单积分','绿色积分'];
  422. $fields = ['balance','balance','property','bd_score','ls_score'];
  423. $field = isset($fields[$accountType])?$fields[$accountType]:'balance';
  424. $accountName = isset($accounts[$accountType])?$accounts[$accountType]:'余额';
  425. $balance = $this->model->where(['id'=>$id])->value("{$field}");
  426. if($changeType==2){
  427. if($balance<$money){
  428. $this->error = '抱歉,该用户的账户可扣除金额不足';
  429. return false;
  430. }
  431. $money = -$money;
  432. }
  433. DB::beginTransaction();
  434. if(!$this->model->where(['id'=>$id])->update(["{$field}"=>DB::raw("{$field} + {$money}"),'update_time'=>time()])){
  435. DB::rollBack();
  436. $this->error = '账户充值失败';
  437. return false;
  438. }
  439. $remark = ($changeType==2?'平台扣除':'平台充值').$accountName;
  440. $data = [
  441. 'user_id'=>$id,
  442. 'source_order_no'=> get_order_num('PR'),
  443. 'user_type'=> 1,
  444. 'account_type'=> $accountType, // 报单积分
  445. 'type'=> 6,
  446. 'money'=> $money,
  447. 'after_money'=> moneyFormat($balance + $money,2),
  448. 'date'=>date('Y-m-d'),
  449. 'create_time'=>time(),
  450. 'remark'=> isset($params['remark'])?$params['remark'] : $remark,
  451. 'remark1'=> "操作人:".$adminId,
  452. 'status'=>1,
  453. 'mark'=>1
  454. ];
  455. if(!AccountLogModel::insertGetId($data)){
  456. Db::rollBack();
  457. $this->error = '账户调整失败';
  458. }
  459. DB::commit();
  460. // 设置日志
  461. ActionLogModel::setRecord($adminId, ['type' => 1, 'title' =>$remark, 'content' => json_encode($params, 256), 'module' => 'admin']);
  462. ActionLogModel::record();
  463. $this->error = '操作成功';
  464. RedisService::keyDel("caches:members*");
  465. return true;
  466. }
  467. /**
  468. * 添加会编辑会员
  469. * @return array
  470. * @since 2020/11/11
  471. * @author laravel开发员
  472. */
  473. public function edit()
  474. {
  475. // 请求参数
  476. $data = request()->all();
  477. $id = isset($data['id']) ? $data['id'] : 0;
  478. // 查找会员
  479. $member = MemberModel::where('id', $id)->where('mark', 1)->first();
  480. if (!$member && $id) {
  481. return message('会员不存在', false);
  482. }
  483. // 头像处理
  484. if (isset($data['avatar']) && $data['avatar']) {
  485. $data['avatar'] = get_image_path(trim($data['avatar']));
  486. }
  487. // 手机号唯一性验证
  488. $mobile = isset($data['mobile']) ? trim($data['mobile']) : '';
  489. if ($mobile) {
  490. $checkId = $this->model->where(['mobile' => $mobile, 'mark' => 1])->value('id');
  491. if ($checkId && ($id != $checkId)) {
  492. return message('手机号已存在', false);
  493. }
  494. }
  495. // 密码处理
  496. if (isset($data['password']) && $data['password']) {
  497. $data['password'] = get_password(trim($data['password']));
  498. } else {
  499. // 编辑时如果密码为空则不更新密码
  500. unset($data['password']);
  501. }
  502. // 处理数值类型字段
  503. if (isset($data['status'])) {
  504. $data['status'] = (int)$data['status'];
  505. }
  506. if (isset($data['parent_id'])) {
  507. $data['parent_id'] = (float)$data['parent_id'];
  508. }
  509. $result = parent::edit($data);
  510. // 设置日志
  511. ActionLogModel::setRecord(session('userId'), ['type' => 1, 'title' => '修改会员信息', 'content' => json_encode($data, 256), 'module' => 'admin']);
  512. ActionLogModel::record();
  513. RedisService::keyDel("caches:members:count*");
  514. RedisService::clear("caches:members:info_{$id}");
  515. RedisService::keyDel("caches:members:teamList*");
  516. return $result;
  517. }
  518. /**
  519. * 获取详情
  520. */
  521. public function getInfo($id = null)
  522. {
  523. if ($id === null) {
  524. $id = request()->input('id');
  525. }
  526. $info = MemberModel::where('id', $id)
  527. ->where('mark', 1)
  528. ->first();
  529. if (!$info) {
  530. return ['code' => 1, 'msg' => '记录不存在'];
  531. }
  532. $info = $info->toArray();
  533. $info['avatar'] = $info['avatar'] ? get_image_url($info['avatar']) : '';
  534. $info['balance'] = number_format($info['balance'], 2, '.', '');
  535. $info['create_time_text'] = date('Y-m-d H:i:s', (int)$info['create_time']);
  536. $info['login_time_text'] = $info['login_time'] ? date('Y-m-d H:i:s', (int)$info['login_time']) : '-';
  537. return [
  538. 'code' => 0,
  539. 'msg' => '获取成功',
  540. 'data' => $info
  541. ];
  542. }
  543. /**
  544. * 添加会员
  545. */
  546. public function add()
  547. {
  548. $params = request()->all();
  549. // 检查手机号是否已存在
  550. $mobile = $params['mobile'] ?? '';
  551. $exists = MemberModel::where('mobile', $mobile)
  552. ->where('mark', 1)
  553. ->exists();
  554. if ($exists) {
  555. return ['code' => 1, 'msg' => '手机号已存在'];
  556. }
  557. // 处理头像
  558. $avatar = $params['avatar'] ?? '';
  559. if ($avatar) {
  560. $params['avatar'] = get_image_path($avatar);
  561. }
  562. // 处理密码
  563. if (isset($params['password']) && $params['password']) {
  564. $params['password'] = get_password($params['password']);
  565. }
  566. $data = [
  567. 'openid' => $params['openid'] ?? '',
  568. 'mobile' => $mobile,
  569. 'user_type' => (int)($params['user_type'] ?? 1),
  570. 'password' => $params['password'] ?? '',
  571. 'member_level' => (int)($params['member_level'] ?? 0),
  572. 'realname' => $params['realname'] ?? '',
  573. 'nickname' => $params['nickname'] ?? '',
  574. 'gender' => (int)($params['gender'] ?? 3),
  575. 'avatar' => $params['avatar'] ?? '',
  576. 'balance' => (float)($params['balance'] ?? 0),
  577. 'parent_id' => (int)($params['parent_id'] ?? 0),
  578. 'status' => (int)($params['status'] ?? 1),
  579. 'source' => (int)($params['source'] ?? 2),
  580. 'create_time' => time(),
  581. 'update_time' => time(),
  582. 'mark' => 1
  583. ];
  584. $result = MemberModel::insert($data);
  585. if ($result) {
  586. RedisService::clear("caches:member:counts_by_level");
  587. return ['code' => 0, 'msg' => '添加成功'];
  588. }
  589. return ['code' => 1, 'msg' => '添加失败'];
  590. }
  591. /**
  592. * 设置状态
  593. */
  594. public function status()
  595. {
  596. $params = request()->all();
  597. $id = $params['id'] ?? 0;
  598. $status = $params['status'] ?? 1;
  599. $member = MemberModel::where('id', $id)
  600. ->where('mark', 1)
  601. ->first();
  602. if (!$member) {
  603. return ['code' => 1, 'msg' => '记录不存在'];
  604. }
  605. $member->status = $status;
  606. $member->update_time = time();
  607. $member->save();
  608. RedisService::clear("caches:members:info_{$id}");
  609. return ['code' => 0, 'msg' => '设置成功'];
  610. }
  611. /**
  612. * 删除
  613. * @return array
  614. */
  615. public function delete()
  616. {
  617. $id = request()->input('id');
  618. $this->model->where(['mark'=>0])->where('update_time','<', time() - 600)->delete();
  619. RedisService::clear("caches:member:counts_by_level");
  620. if (is_array($id)) {
  621. // 批量删除
  622. $count = $this->model->whereIn('id', $id)
  623. ->where('mark', 1)
  624. ->update(['mark' => 0, 'update_time' => time()]);
  625. foreach ($id as $memberId) {
  626. RedisService::clear("caches:members:info_{$memberId}");
  627. }
  628. MemberCouponModel::whereIn('user_id', $id)->delete();
  629. MemberAddressModel::whereIn('user_id', $id)->delete();
  630. RedisService::keyDel("caches:members:count*");
  631. RedisService::keyDel("caches:members:teamList*");
  632. return ['code' => 0, 'msg' => "成功删除{$count}条记录"];
  633. } else {
  634. // 单个删除
  635. $member = $this->model->where('id', $id)
  636. ->where('mark', 1)
  637. ->first();
  638. if (!$member) {
  639. return ['code' => 1, 'msg' => '记录不存在'];
  640. }
  641. $member->mark = 0;
  642. $member->update_time = time();
  643. $member->save();
  644. MemberCouponModel::where('user_id', $id)->delete();
  645. MemberAddressModel::where('user_id', $id)->delete();
  646. RedisService::clear("caches:members:info_{$id}");
  647. RedisService::keyDel("caches:members:teamList*");
  648. RedisService::keyDel("caches:members:count*");
  649. return ['code' => 0, 'msg' => '删除成功'];
  650. }
  651. }
  652. }