Member.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkAdmin
  4. // +----------------------------------------------------------------------
  5. // | 版权所有 2014~2019 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
  6. // +----------------------------------------------------------------------
  7. // | 官方网站: http://demo.thinkadmin.top
  8. // +----------------------------------------------------------------------
  9. // | 开源协议 ( https://mit-license.org )
  10. // +----------------------------------------------------------------------
  11. // | gitee 代码仓库:https://gitee.com/zoujingli/ThinkAdmin
  12. // | github 代码仓库:https://github.com/zoujingli/ThinkAdmin
  13. // +----------------------------------------------------------------------
  14. namespace app\user\controller;
  15. use app\common\model\User;
  16. use app\common\model\UserGroup;
  17. use app\common\model\UserLevel;
  18. use app\common\model\UserLevelRank;
  19. use app\common\model\UserTag;
  20. use app\common\model\UserWallet;
  21. use library\Controller;
  22. use library\tools\Data;
  23. use think\Db;
  24. use function AlibabaCloud\Client\value;
  25. /**
  26. * 会员信息管理
  27. * Class Member
  28. * @package app\Member\controller
  29. */
  30. class Member extends Controller
  31. {
  32. /**
  33. * 绑定数据表
  34. * @var string
  35. */
  36. protected $table = 'StoreMember';
  37. /**
  38. * 会员信息管理
  39. * @auth true
  40. * @menu true
  41. * @throws \think\Exception
  42. * @throws \think\db\exception\DataNotFoundException
  43. * @throws \think\db\exception\ModelNotFoundException
  44. * @throws \think\exception\DbException
  45. * @throws \think\exception\PDOException
  46. */
  47. public function index()
  48. {
  49. $this->search_url = strtolower($this->request->controller()).'/index_search';
  50. $this->title = '会员信息管理';
  51. $this->tag_arr = UserTag::column('title','id');
  52. $this->level_arr = UserLevel::column('name','id');
  53. $where = [];
  54. $where[] = ['m.is_deleted','=',0];
  55. if($name = input('get.name')) $where[] = ['m.name','like','%'.$name.'%'];
  56. if($phone = input('get.phone')) $where[] = ['m.phone','like','%'.$phone.'%'];
  57. if($level_id = input('get.level_id')) $where[] = ['m.level_id','=',$level_id];
  58. if($label_id = input('get.label_id')) $where[] = ['m.label','like','%|'.$label_id."|%"];
  59. if($account_type = input('get.account_type')) $where[] = ['m.account_type','=',$account_type];
  60. $field="m.id,m.openid,m.name,m.headimg,m.level_exp,m.phone,m.status,m.create_at,m.account_type,w.growth,w.integral,w.money,m.tag_id,label";
  61. $create_at = input('create_at');
  62. $query = $this->_query($this->table)
  63. ->field($field)
  64. ->alias('m')
  65. ->leftJoin('UserWallet w','m.id =w.user_id')
  66. ->where($where)
  67. ->when($create_at,function ($q)use ($create_at){
  68. if($create_at){
  69. $time = explode(' - ',$_GET['create_at']);
  70. $start_date_time = $time[0];
  71. $end_date_time = $time[1];
  72. $q->whereBetweenTime('m.create_at',$start_date_time,$end_date_time);
  73. }
  74. })->order('id desc')->page();
  75. }
  76. /**
  77. * 数据列表处理
  78. * @auth true
  79. * @menu true
  80. * @param array $data
  81. * @throws \think\db\exception\DataNotFoundException
  82. * @throws \think\db\exception\ModelNotFoundException
  83. * @throws \think\exception\DbException
  84. */
  85. protected function _index_page_filter(&$data)
  86. {
  87. $level_arr = UserLevel::column('name','id');
  88. foreach ($data as $k=>&$v){
  89. $level_rank= UserLevelRank::getUserVipInfo($v['id']);
  90. $v['level_id'] = $level_rank ? $level_rank['level_id'] : 0 ;
  91. $v['level_name'] = $level_rank ? $level_arr[$level_rank['level_id']] : '--';
  92. $v['end_date'] = $level_rank ?$level_rank['end_date'] :'--';
  93. $label_ids = implode(',',explode("|",trim($v['label'],'|')));
  94. $v['label_arr'] = $v['label'] ? UserTag::where('id','in',$label_ids)->column('title') : [];
  95. }
  96. }
  97. /**
  98. * 删除
  99. * @auth true
  100. * @menu true
  101. * @param array $data
  102. * @throws \think\db\exception\DataNotFoundException
  103. * @throws \think\db\exception\ModelNotFoundException
  104. * @throws \think\exception\DbException
  105. */
  106. public function remove()
  107. {
  108. $this->_save($this->table, ['is_deleted' => '1','phone'=>'','email'=>'']);
  109. }
  110. /**
  111. * 禁用
  112. * @auth true
  113. * @menu true
  114. * @param array $data
  115. * @throws \think\db\exception\DataNotFoundException
  116. * @throws \think\db\exception\ModelNotFoundException
  117. * @throws \think\exception\DbException
  118. */
  119. public function forbid()
  120. {
  121. $this->_save($this->table, ['status' => '0']);
  122. }
  123. /**
  124. * 启用
  125. * @auth true
  126. * @menu true
  127. * @param array $data
  128. * @throws \think\db\exception\DataNotFoundException
  129. * @throws \think\db\exception\ModelNotFoundException
  130. * @throws \think\exception\DbException
  131. */
  132. public function resume()
  133. {
  134. $this->_save($this->table, ['status' => '1']);
  135. }
  136. /**
  137. * 添加
  138. * @auth true
  139. * @menu true
  140. * @param array $data
  141. * @throws \think\db\exception\DataNotFoundException
  142. * @throws \think\db\exception\ModelNotFoundException
  143. * @throws \think\exception\DbException
  144. */
  145. public function add(){
  146. $this->title = '添加';
  147. $this->level_arr = UserLevel::column('name','id');
  148. if($this->request->isPost())
  149. {
  150. list($data) = [$this->request->post()];
  151. $check_where =[];
  152. $check_where[] = $data['account_type'] == 1 ? ['email','=',$data['account']] : ['phone','=',$data['account']];
  153. $user_info = User::where($check_where)->find();
  154. if($user_info) $this->error('用户已存在');
  155. $user_add= [];
  156. $data['account_type'] == 1 ? $user_add['email'] = $data['account'] : $user_add['phone'] = $data['account'];
  157. $user_add['name'] = $data['name'];
  158. $user_add['account_type'] = $data['account_type'];
  159. $select_label = [];
  160. if(isset($data['label']) && !empty($data['label'])){
  161. foreach ($data['label'] as $key=>$value){
  162. if($value) $select_label[] = $key;
  163. }
  164. }
  165. $data['label'] = '|'.implode('|',$select_label).'|';
  166. $new_user = User::create($user_add);
  167. if($data['level_id'] && intval($data['days']) > 0) {
  168. UserLevelRank::create(['user_id'=>$new_user->id,'level_id'=>$data['level_id'],'start_time'=>time(),'end_time'=>time()+86400* intval($data['days']),'end_date'=>date('Y-m-d H:i:s',time()+86400*intval($data['days']))]);
  169. }
  170. $this->success('添加成功');
  171. }
  172. $this->_form($this->table, 'add');
  173. }
  174. /**
  175. *
  176. * 编辑
  177. * @auth true
  178. * @menu true
  179. * @param array $data
  180. * @throws \think\db\exception\DataNotFoundException
  181. * @throws \think\db\exception\ModelNotFoundException
  182. * @throws \think\exception\DbException
  183. */
  184. public function edit()
  185. {
  186. $this->title = '编辑';
  187. $this->level_arr = UserLevel::column('name','id');
  188. $this->_form($this->table, 'form');
  189. }
  190. /**
  191. * 钱包管理
  192. * @auth true
  193. * @menu true
  194. * @param array $data
  195. * @throws \think\db\exception\DataNotFoundException
  196. * @throws \think\db\exception\ModelNotFoundException
  197. * @throws \think\exception\DbException
  198. */
  199. public function wallet()
  200. {
  201. $this->title = '钱包';
  202. $this->_form($this->table, 'wallet');
  203. }
  204. protected function _form_filter(&$data){
  205. //选中的服务标签
  206. $this->tag_arr = UserTag::column('title','id');
  207. if($this->request->isPost() && $this->request->action() == 'add')
  208. {
  209. if($data['account_type'] == 1) {
  210. $is_reg = User::where('email',$data['account'])->value('id');
  211. $data['email'] = $data['account'];
  212. }else{
  213. $is_reg = User::where('phone',$data['account'])->value('id');
  214. $data['phone'] = $data['account'];
  215. }
  216. if($is_reg)$this->error('账号已存在');
  217. }
  218. if($this->request->isPost() && $this->request->action() == 'edit') {
  219. if($data['level_id'] > 0 && $data['over_time']) {
  220. Data::save('UserLevelRank',[
  221. 'user_id'=>$data['id'],
  222. 'level_id'=>$data['level_id'],
  223. 'start_time'=>time(),
  224. 'end_time'=>strtotime($data['over_time']) ,
  225. 'end_date'=>$data['over_time']
  226. ],'user_id',['user_id'=>$data['id']]);
  227. $data['level_exp'] = $data['over_time'];
  228. } else if($data['level_id'] == 0){
  229. Data::save('UserLevelRank',[
  230. 'user_id'=>$data['id'],
  231. 'level_id'=>$data['level_id'],
  232. 'start_time'=>time(),
  233. 'end_time'=> time(),
  234. 'end_date'=>date('Y-m-d H:i:s')
  235. ],'user_id',['user_id'=>$data['id']]);
  236. $data['level_exp'] = date('Y-m-d H:i:s');
  237. }
  238. }
  239. //
  240. if($this->request->isPost()) {
  241. $select_label = [];
  242. if(isset($data['label']) && !empty($data['label'])){
  243. foreach ($data['label'] as $key=>$value){
  244. if($value) $select_label[] = $key;
  245. }
  246. }
  247. $data['label'] = '|'.implode('|',$select_label).'|';
  248. }
  249. if($this->request->isGet() && $this->request->action() =='edit') {
  250. $label_arr = isset($data['label']) ? explode('|',trim($data['label'],'|')) : [];
  251. $this->label_arr = $label_arr;
  252. $data['rank_id'] = UserLevelRank::getUserVip($data['id']);
  253. $level_rank= UserLevelRank::where([['user_id','=',$data['id']]])->find();
  254. $data['end_date'] = $level_rank ? $level_rank->end_date:'--';
  255. }
  256. }
  257. public function export(){
  258. $tag_arr = UserTag::column('title','id');
  259. $get_data = $this->request->get();
  260. $time = explode(' - ',$get_data['create_at']);
  261. $phone = $get_data['phone'];
  262. $name = $get_data['name'];
  263. $where = [];
  264. $where[] = ['status',1];
  265. $where[] = ['is_deleted',0];
  266. $where_str = ' status = 1 AND is_deleted = 0';
  267. if($name) $where_str .=' AND name like '."'%".$name."%'";
  268. if($phone) $where_str .=' AND phone like '."'%".$phone."%'";
  269. if($level_id = input('get.level_id')) $where_str .=' AND level_id = '.$level_id;
  270. if($label_id = input('get.label_id')) $where_str .=' AND label like '."'%|".$label_id."|%'";
  271. if($get_data['create_at']) $where_str.=" AND create_at > '".$time[0]."'AND create_at <'".$time[1]."'";
  272. $data = Db::query("SELECT name,headimg,email,tag_id,phone,create_at,account_type,label FROM dd_store_member WHERE".$where_str.' ORDER BY id DESC');
  273. if(empty($data)) $this->error('暂无可以导出的数据');
  274. foreach ($data as $k=>&$v) {
  275. if(!$v) $v = '--';
  276. $v['account_desc'] = $v['account_type'] == 1 ? '公司':'个人';
  277. $label_ids = implode(',',explode("|",trim($v['label'],'|')));
  278. $label_arr = $label_ids ? UserTag::where('id','in',$label_ids)->column('title') : [];
  279. $v['label_name'] = $label_arr ? implode('|',$label_arr) : "--";
  280. }
  281. $field=array(
  282. 'A' => array('name', '昵称'),
  283. 'B' => array('email', '邮箱'),
  284. 'C' => array('phone', '电话'),
  285. 'D' => array('account_desc','类型'),
  286. 'E' => array('label_name','标签'),
  287. 'F' => array('create_at', '注册时间'),
  288. );
  289. $this->phpExcelList($field,$data,'会员列表');
  290. }
  291. public function phpExcelList($field=[],$list=[],$title='文件'){
  292. $PHPExcel=new \PHPExcel();
  293. $PHPSheet=$PHPExcel->getActiveSheet();
  294. $PHPSheet->setTitle('demo'); //给当前活动sheet设置名称
  295. foreach($list as $key=>$value)
  296. {
  297. foreach($field as $k=>$v){
  298. if($key == 0){
  299. $PHPSheet= $PHPExcel->getActiveSheet()->setCellValue($k.'1',$v[1]);
  300. }
  301. $i=$key+2;
  302. $PHPExcel->getActiveSheet()->setCellValue($k . $i, $value[$v[0]]);
  303. }
  304. }
  305. $PHPWriter = \PHPExcel_IOFactory::createWriter($PHPExcel,'Excel2007'); //按照指定格式生成Excel文件,
  306. header('Content-Type: application/vnd.ms-excel'); // 告诉浏览器生成一个excel05版的表格
  307. header("Content-Disposition: attachment;filename={$title}.xls"); //告诉浏览器输出文件的名称
  308. header('Cache-Control: max-age=0'); //禁止缓存
  309. $PHPWriter->save("php://output"); //输出到浏览器
  310. }
  311. /**
  312. * 导入
  313. * @auth true
  314. * @menu true
  315. * @throws \think\Exception
  316. * @throws \think\db\exception\DataNotFoundException
  317. * @throws \think\db\exception\ModelNotFoundException
  318. * @throws \think\exception\DbException
  319. * @throws \think\exception\PDOException
  320. */
  321. public function import()
  322. {
  323. $file = request()->file('file');
  324. $file_size = $_FILES['file']['size'];
  325. if ($file_size > 5 * 1024 * 1024) $this->error('文件大小不能超过5M');
  326. //限制上传表格类型
  327. $fileExtendName = substr(strrchr($_FILES['file']["name"], '.'), 1);
  328. if ($fileExtendName != 'xls' && $fileExtendName != 'xlsx') $this->error('必须为excel表格,且必须为xls/xlsx格式!');
  329. $dir = dirname(realpath(dirname($_SERVER['SCRIPT_FILENAME']))) . '/public/upload';
  330. if (!file_exists($dir)) mkdir($dir, 0777, true);
  331. $info = $file->move($dir);
  332. $fileName = $info->getSaveName();
  333. $filePath = dirname(realpath(dirname($_SERVER['SCRIPT_FILENAME']))) . "/public/upload/{$fileName}";
  334. /* $reader = \PHPExcel_IOFactory::createReader('Excel2007');
  335. if(!$reader->canRead($filePath)) $reader = \PHPExcel_IOFactory::createReader('Excel2015');
  336. */
  337. $objPHPExcelReader = \PHPExcel_IOFactory::load($filePath);
  338. $sheet = $objPHPExcelReader->getSheet(0); // 读取第一个工作表(编号从 0 开始)
  339. $highestRow = $sheet->getHighestRow(); // 取得总行数
  340. $arr = array('A','B','C','D','E','F');
  341. // 一次读取一列
  342. $res_arr = [];
  343. for ($row = 2; $row <= $highestRow; $row++) {
  344. $row_arr = array();
  345. for ($column = 0 ;$column < count($arr) ; $column++) {
  346. $val = $sheet->getCellByColumnAndRow($column, $row)->getValue();
  347. $row_arr[] = $val;
  348. }
  349. $res_arr[] = $row_arr;
  350. }
  351. $success_num = 0;
  352. // name account account_type level_id days label
  353. foreach ($res_arr as $new_user) {
  354. if(!$new_user['1'])continue;
  355. $check_where=[];
  356. $check_where[] = $new_user['2'] == 1 ? ['email','=',trim($new_user['1'])]: ['phone','=',trim($new_user['1'])];
  357. $ck_res = User::where($check_where)->value('id');
  358. if($ck_res){
  359. Data::save('UserLevelRank',[
  360. 'user_id'=>$ck_res,
  361. 'level_id'=>intval($new_user['3']),
  362. 'start_time'=>time(),
  363. 'end_time'=>time()+86400* intval($new_user['4']),
  364. 'end_date'=>date('Y-m-d H:i:s',time()+86400*intval($new_user['4']))],'user_id',['user_id'=>$ck_res]);
  365. $success_num++;
  366. User::where('id',$ck_res)->update(['level_id'=>intval($new_user['3']),'level_exp'=>date('Y-m-d H:i:s',time()+86400*intval($new_user['4'])),'label'=>'|'.$new_user['5'].'|']);
  367. }else{
  368. $user_add= [];
  369. $user_add['account_type'] = $new_user['2'];
  370. if($new_user['5']) $user_add['label'] = '|'.$new_user['5'].'|';
  371. if( $user_add['account_type'] == 1) {// 公司账号
  372. $group_title = explode('@', $new_user['1'])[1];
  373. $group_info = UserGroup::where(['title'=>'@'.$group_title])->find();
  374. if(empty($group_info)) continue;
  375. $user_add['name'] = $new_user['0'] ? $new_user['0'] : 'G企业用户_'.$group_info->name.'_'.$group_title;
  376. $check_group = User::where(['group_id'=>$group_info->id,'is_first'=>1])->value('id');//该公司是否有第一个注册的
  377. $user_add['group_id'] = $group_info->id;
  378. if(!$check_group) $user_add['is_first'] =1;
  379. if($check_group) $user_add['group_first'] = $check_group;
  380. $add_res = User::create($user_add);
  381. if(isset_full_check($user_add,'is_first',1)){
  382. User::where('id',$add_res->id)->update(['group_first'=>$add_res->id]);
  383. if($new_user['3'] > 0 && intval($new_user[4]) > 0) {
  384. UserLevelRank::create(['user_id'=>$add_res->id,'level_id'=>$new_user['3'],'start_time'=>time(),'end_time'=>time()+86400* intval($new_user['4']),'end_date'=>date('Y-m-d H:i:s',time()+86400*intval($new_user['4']))]);
  385. User::where('id',$add_res->id)->update(['level_id'=>intval($new_user['3']),'level_exp'=>date('Y-m-d H:i:s',time()+86400*intval($new_user['4']))]);
  386. $success_num++;
  387. }
  388. }
  389. }else{
  390. $user_add['phone'] = trim($new_user['1']);
  391. $user_add['name'] = $new_user['0'] ? $new_user['0'] : 'G'. substr_replace( $new_user['1'],'****',3,4);
  392. $add_res = User::create($user_add);
  393. if($new_user['3'] > 0 && intval($new_user[4]) > 0) {
  394. UserLevelRank::create(['user_id'=>$add_res->id,'level_id'=>$new_user['3'],'start_time'=>time(),'end_time'=>time()+86400* intval($new_user['4']),'end_date'=>date('Y-m-d H:i:s',time()+86400*intval($new_user['4']))]);
  395. User::where('id',$add_res->id)->update(['level_id'=>intval($new_user['3']),'level_exp'=>date('Y-m-d H:i:s',time()+86400*intval($new_user['4']))]);
  396. $success_num++;
  397. }
  398. }
  399. }
  400. }
  401. $this->success('成功导入会员:'.$success_num);
  402. }
  403. }