Member_bak.php 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace app\shop\controller;
  11. use addon\fenxiao\model\Fenxiao;
  12. use addon\supermember\model\MemberCard;
  13. use app\model\member\Member as MemberModel;
  14. use app\model\member\MemberAddress as MemberAddressModel;
  15. use app\model\member\MemberLabel as MemberLabelModel;
  16. use app\model\member\MemberLevel as MemberLevelModel;
  17. use app\model\member\MemberAccount as MemberAccountModel;
  18. use app\model\member\Config as ConfigModel;
  19. use app\model\system\Stat;
  20. use Carbon\Carbon;
  21. use think\facade\Db;
  22. use phpoffice\phpexcel\Classes\PHPExcel;
  23. use phpoffice\phpexcel\Classes\PHPExcel\Writer\Excel2007;
  24. use app\model\upload\Upload as UploadModel;
  25. use app\model\member\MemberCluster as MemberClusterModel;
  26. use think\facade\Config;
  27. use addon\coupon\model\Coupon as CouponModel;
  28. /**
  29. * 会员管理 控制器
  30. */
  31. class Member extends BaseShop
  32. {
  33. /*
  34. * 会员概况
  35. */
  36. public function index()
  37. {
  38. $member = new MemberModel();
  39. // 累计会员数
  40. $total_count = $member->getMemberCount([ [ 'site_id', '=', $this->site_id ] ]);
  41. // 今日新增数
  42. $newadd_count = $member->getMemberCount([ [ 'site_id', '=', $this->site_id ], [ 'reg_time', 'between', [ date_to_time(date('Y-m-d 00:00:00')), time() ] ] ]);
  43. // 已购会员数
  44. $buyed_count = $member->getMemberCount([ [ 'site_id', '=', $this->site_id ], [ 'order_num', '>', 0 ] ]);
  45. $this->assign('data', [
  46. 'total_count' => $total_count[ 'data' ],
  47. 'newadd_count' => $newadd_count[ 'data' ],
  48. 'buyed_count' => $buyed_count[ 'data' ]
  49. ]);
  50. $stat_shop_model = new Stat();
  51. $today = Carbon::now();
  52. $yesterday = Carbon::yesterday();
  53. $stat_today = $stat_shop_model->getStatShop($this->site_id, $today->year, $today->month, $today->day)[ 'data' ];
  54. $stat_yesterday = $stat_shop_model->getStatShop($this->site_id, $yesterday->year, $yesterday->month, $yesterday->day)[ 'data' ];
  55. $this->assign('today', $stat_today);
  56. $this->assign('yesterday', $stat_yesterday);
  57. return $this->fetch('member/index');
  58. }
  59. /**
  60. * 获取区域会员数量
  61. */
  62. public function areaCount()
  63. {
  64. if (request()->isAjax()) {
  65. $member = new MemberModel();
  66. $handle = input('handle', false);
  67. $res = $member->getMemberCountByArea($this->site_id, $handle);
  68. return $res;
  69. }
  70. }
  71. /**
  72. * 会员列表
  73. */
  74. public function memberList()
  75. {
  76. //判断分销是否存在
  77. $is_exit_fenxiao = addon_is_exit('fenxiao');
  78. $cluster_id = input('cluster_id', '');//获取会员群体
  79. $member_cluster_model = new MemberClusterModel();
  80. if (request()->isAjax()) {
  81. $page = input('page', 1);
  82. $page_size = input('page_size', PAGE_LIST_ROWS);
  83. $search_text = input('search_text', '');
  84. $search_text_type = input('search_text_type', 'username');//可以传username mobile email
  85. $level_id = input('level_id', 0);
  86. $label_id = input('label_id', 0);
  87. $reg_start_date = input('reg_start_date', '');
  88. $reg_end_date = input('reg_end_date', '');
  89. $status = input('status', '');
  90. $cluster_id = input('cluster_id', '');//获取会员群体
  91. $last_login_time_start = input('last_login_time_start', '');//上次登录时间
  92. $last_login_time_end = input('last_login_time_end', '');
  93. $start_order_complete_num = input('start_order_complete_num', '');//成交次数
  94. $end_order_complete_num = input('end_order_complete_num', '');
  95. $start_order_complete_money = input('start_order_complete_money', '');//消费金额
  96. $end_order_complete_money = input('end_order_complete_money', '');
  97. $start_point = input('start_point', '');//积分
  98. $end_point = input('end_point', '');
  99. $start_balance = input('start_balance', '');//余额
  100. $end_balance = input('end_balance', '');
  101. $start_growth = input('start_growth', '');//成长值
  102. $end_growth = input('end_growth', '');
  103. $login_type = input('login_type', '');//来源渠道
  104. $is_member = input('is_member', '');
  105. $condition[] = [ 'site_id', '=', $this->site_id ];
  106. //下拉选择
  107. $condition[] = [ $search_text_type, 'like', "%" . $search_text . "%" ];
  108. //会员等级
  109. if ($level_id != 0) {
  110. $condition[] = [ 'member_level', '=', $level_id ];
  111. }
  112. //会员标签
  113. if ($label_id != 0) {
  114. //raw方法变为public类型 需要实例化以后调用
  115. $condition[] = [ "", 'exp', Db::raw("FIND_IN_SET({$label_id}, member_label)") ];
  116. }
  117. //注册时间
  118. if ($reg_start_date != '' && $reg_end_date != '') {
  119. $condition[] = [ 'reg_time', 'between', [ strtotime($reg_start_date), strtotime($reg_end_date) ] ];
  120. } else if ($reg_start_date != '' && $reg_end_date == '') {
  121. $condition[] = [ 'reg_time', '>=', strtotime($reg_start_date) ];
  122. } else if ($reg_start_date == '' && $reg_end_date != '') {
  123. $condition[] = [ 'reg_time', '<=', strtotime($reg_end_date) ];
  124. }
  125. //会员状态
  126. if ($status != '') {
  127. $condition[] = [ 'status', '=', $status ];
  128. }
  129. //会员群体
  130. if ($cluster_id != '') {
  131. //获取会员群体的member_id值
  132. $member_cluster_info = $member_cluster_model->getMemberClusterInfo([ "cluster_id" => $cluster_id ], 'member_ids');
  133. if (!empty($member_cluster_info[ 'data' ][ 'member_ids' ])) {
  134. $condition[] = [ 'member_id', 'in', $member_cluster_info[ 'data' ][ 'member_ids' ] ];
  135. }
  136. }
  137. //上次访问时间
  138. if ($last_login_time_start != '' && $last_login_time_end != '') {
  139. $condition[] = [ 'last_login_time', 'between', [ strtotime($last_login_time_start), strtotime($last_login_time_end) ] ];
  140. } else if ($last_login_time_start != '' && $last_login_time_end == '') {
  141. $condition[] = [ 'last_login_time', '>=', strtotime($last_login_time_start) ];
  142. } else if ($last_login_time_start == '' && $last_login_time_end != '') {
  143. $condition[] = [ 'last_login_time', '<=', strtotime($last_login_time_end) ];
  144. }
  145. //成交次数
  146. if ($start_order_complete_num != '' && $end_order_complete_num != '') {
  147. $condition[] = [ 'order_complete_num', 'between', [ $start_order_complete_num, $end_order_complete_num ] ];
  148. } else if ($start_order_complete_num != '' && $end_order_complete_num == '') {
  149. $condition[] = [ 'order_complete_num', '>=', $start_order_complete_num ];
  150. } else if ($start_order_complete_num == '' && $end_order_complete_num != '') {
  151. $condition[] = [ 'order_complete_num', '<=', $end_order_complete_num ];
  152. }
  153. //消费金额
  154. if ($start_order_complete_money != '' && $end_order_complete_money != '') {
  155. $condition[] = [ 'order_complete_money', 'between', [ $start_order_complete_money, $end_order_complete_money ] ];
  156. } else if ($start_order_complete_money != '' && $end_order_complete_money == '') {
  157. $condition[] = [ 'order_complete_money', '>=', $start_order_complete_money ];
  158. } else if ($start_order_complete_money == '' && $end_order_complete_money != '') {
  159. $condition[] = [ 'order_complete_money', '<=', $end_order_complete_money ];
  160. }
  161. //积分
  162. if ($start_point != '' && $end_point != '') {
  163. $condition[] = [ 'point', 'between', [ $start_point, $end_point ] ];
  164. } else if ($start_point != '' && $end_point == '') {
  165. $condition[] = [ 'point', '>=', $start_point ];
  166. } else if ($start_point == '' && $end_point != '') {
  167. $condition[] = [ 'point', '<=', $end_point ];
  168. }
  169. //余额
  170. if ($start_balance != '' && $end_balance != '') {
  171. $condition[] = [ '', 'exp', Db::raw("(balance + balance_money) between {$start_balance} and {$end_balance}") ];
  172. } else if ($start_balance != '' && $end_balance == '') {
  173. $condition[] = [ '', 'exp', Db::raw("(balance + balance_money) >= {$start_balance}") ];
  174. } else if ($start_balance == '' && $end_balance != '') {
  175. $condition[] = [ '', 'exp', Db::raw("(balance + balance_money) <= {$end_balance}") ];
  176. }
  177. //成长值
  178. if ($start_growth != '' && $end_growth != '') {
  179. $condition[] = [ 'growth', 'between', [ $start_growth, $end_growth ] ];
  180. } else if ($start_growth != '' && $end_growth == '') {
  181. $condition[] = [ 'growth', '>=', $start_growth ];
  182. } else if ($start_growth == '' && $end_growth != '') {
  183. $condition[] = [ 'growth', '<=', $end_growth ];
  184. }
  185. //来源渠道
  186. if ($login_type != '') {
  187. $condition[] = [ 'login_type', '=', $login_type ];
  188. }
  189. if ($is_member != '') $condition[] = [ 'is_member', '=', $is_member ];
  190. $order = 'last_visit_time desc';
  191. $field = '*';
  192. $member_model = new MemberModel();
  193. $result = $member_model->getMemberPageList($condition, $page, $page_size, $order, $field);
  194. $member_label_model = new MemberLabelModel();
  195. $label_list = $member_label_model->getMemberLabelList([], 'label_id, label_name');
  196. if (!empty($label_list[ 'data' ])) {
  197. //格式化标签
  198. $format_label_list = array_column($label_list[ 'data' ], 'label_name', 'label_id');
  199. }
  200. $list = $result[ 'data' ][ 'list' ];
  201. if (!empty($list)) {
  202. if ($is_exit_fenxiao == 1) {
  203. $fenxiao_model = new Fenxiao();
  204. }
  205. foreach ($list as $k => $v) {
  206. if ($is_exit_fenxiao == 1) {
  207. if ($v[ 'is_fenxiao' ] == 1) {
  208. $parent_fenxiao_name = $fenxiao_model->getParentFenxiaoName($v[ 'fenxiao_id' ], 2);
  209. } else {
  210. $parent_fenxiao_name = $fenxiao_model->getParentFenxiaoName($v[ 'fenxiao_id' ], 1);
  211. }
  212. $list[ $k ][ 'parent_fenxiao_name' ] = $parent_fenxiao_name;
  213. }
  214. $list[ $k ][ 'member_label_name' ] = '';
  215. $member_label_name = '';
  216. if (!empty($v[ 'member_label' ]) && !empty($label_list[ 'data' ])) {
  217. $member_labels = explode(',', $v[ 'member_label' ]);
  218. foreach ($member_labels as $kk => $vv) {
  219. if (isset($format_label_list[ $vv ])) {
  220. $member_label_name .= ',' . $format_label_list[ $vv ];
  221. }
  222. }
  223. $member_label_name = ltrim($member_label_name, ',');
  224. }
  225. $list[ $k ][ 'member_label_name' ] = $member_label_name;
  226. }
  227. }
  228. $result[ 'data' ][ 'list' ] = $list;
  229. return $result;
  230. } else {
  231. //会员等级
  232. $member_level_model = new MemberLevelModel();
  233. $member_level_list = $member_level_model->getMemberLevelList([ [ 'site_id', '=', $this->site_id ] ], 'level_id, level_name, level_type,status', 'growth asc');
  234. $this->assign('member_level_list', $member_level_list[ 'data' ]);
  235. //会员标签
  236. $member_label_model = new MemberLabelModel();
  237. $member_label_list = $member_label_model->getMemberLabelList([ [ 'site_id', '=', $this->site_id ] ], 'label_id, label_name', 'sort asc');
  238. $this->assign('member_label_list', $member_label_list[ 'data' ]);
  239. /*奖励规则*/
  240. //积分
  241. $point = event('MemberAccountRule', [ 'account' => 'point', 'site_id' => $this->site_id ]);
  242. $this->assign('point', $point);
  243. //余额
  244. $balance = event('MemberAccountRule', [ 'account' => 'balance', 'site_id' => $this->site_id ]);
  245. $this->assign('balance', $balance);
  246. //成长值
  247. $growth = event('MemberAccountRule', [ 'account' => 'growth', 'site_id' => $this->site_id ]);
  248. $this->assign('growth', $growth);
  249. $this->assign('is_exit_fenxiao', $is_exit_fenxiao);
  250. //会员群体
  251. $member_cluster_list = $member_cluster_model->getMemberClusterList([ [ 'site_id', '=', $this->site_id ] ], 'cluster_id, cluster_name', 'create_time desc');
  252. $this->assign('member_cluster_list', $member_cluster_list[ 'data' ]);
  253. $this->assign('cluster_id', $cluster_id);
  254. //订单来源 (支持端口)
  255. $order_from = Config::get("app_type");
  256. $this->assign('order_from_list', $order_from);
  257. $this->assign('supermember_is_exit', addon_is_exit('supermember', $this->site_id));
  258. return $this->fetch('member/member_list');
  259. }
  260. }
  261. /**
  262. * 会员添加
  263. */
  264. public function addMember()
  265. {
  266. if (request()->isAjax()) {
  267. $data = [
  268. 'site_id' => $this->site_id,
  269. 'username' => input('username', ''),
  270. 'mobile' => input('mobile', ''),
  271. 'email' => input('email', ''),
  272. 'password' => data_md5(input('password', '')),
  273. 'status' => input('status', 1),
  274. 'headimg' => input('headimg', ''),
  275. 'member_level' => input('member_level', ''),
  276. 'member_level_name' => input('member_level_name', ''),
  277. 'nickname' => input('nickname', ''),
  278. 'sex' => input('sex', 0),
  279. 'birthday' => input('birthday', '') ? strtotime(input('birthday', '')) : 0,
  280. 'realname' => input('realname', ''),
  281. 'reg_time' => time(),
  282. ];
  283. $member_model = new MemberModel();
  284. $this->addLog("添加会员" . $data[ 'username' ] . $data[ 'mobile' ]);
  285. return $member_model->addMember($data);
  286. } else {
  287. //会员等级
  288. $member_level_model = new MemberLevelModel();
  289. $member_level_list = $member_level_model->getMemberLevelList([ [ 'site_id', '=', $this->site_id ], [ 'level_type', '=', 0 ] ], 'level_id, level_name', 'growth asc');
  290. $this->assign('member_level_list', $member_level_list[ 'data' ]);
  291. $this->assign('type', input('type', 'member'));
  292. return $this->fetch('member/add_member');
  293. }
  294. }
  295. /**
  296. * 会员编辑
  297. */
  298. public function editMember()
  299. {
  300. if (request()->isAjax()) {
  301. $input = input();
  302. $data = [];
  303. if (isset($input[ 'nickname' ])) $data[ 'nickname' ] = $input[ 'nickname' ];
  304. if (isset($input[ 'realname' ])) $data[ 'realname' ] = $input[ 'realname' ];
  305. if (isset($input[ 'sex' ])) $data[ 'sex' ] = $input[ 'sex' ];
  306. if (isset($input[ 'birthday' ])) $data[ 'birthday' ] = $input[ 'birthday' ] ? strtotime($input[ 'birthday' ]) : 0;
  307. if (isset($input[ 'mobile' ])) $data[ 'mobile' ] = $input[ 'mobile' ];
  308. if (isset($input[ 'province_id' ])) $data[ 'province_id' ] = $input[ 'province_id' ];
  309. if (isset($input[ 'city_id' ])) $data[ 'city_id' ] = $input[ 'city_id' ];
  310. if (isset($input[ 'district_id' ])) $data[ 'district_id' ] = $input[ 'district_id' ];
  311. if (isset($input[ 'address' ])) $data[ 'address' ] = $input[ 'address' ];
  312. if (isset($input[ 'full_address' ])) $data[ 'full_address' ] = $input[ 'full_address' ];
  313. $member_id = input('member_id', 0);
  314. $member_model = new MemberModel();
  315. $this->addLog("编辑会员:id" . $member_id, $data);
  316. return $member_model->editMember($data, [ [ 'member_id', '=', $member_id ], [ 'site_id', '=', $this->site_id ] ]);
  317. } else {
  318. //会员信息
  319. $member_id = input('member_id', 0);
  320. $member_model = new MemberModel();
  321. $member_info = $member_model->getMemberInfo([ [ 'site_id', '=', $this->site_id ], [ 'member_id', '=', $member_id ] ]);
  322. if (empty($member_info[ 'data' ])) $this->error('未获取到会员数据', addon_url('shop/member/memberlist'));
  323. $this->assign('member_info', $member_info);
  324. //会员等级
  325. $member_level_model = new MemberLevelModel();
  326. $member_level_list = $member_level_model->getMemberLevelList([ [ 'site_id', '=', $this->site_id ] ], 'level_id,level_name,level_type,is_free_shipping,consume_discount,point_feedback,charge_rule', 'level_type asc,growth asc');
  327. $this->assign('member_level_list', $member_level_list[ 'data' ]);
  328. //账户类型和来源类型
  329. $member_account_model = new MemberAccountModel();
  330. $account_type_arr = $member_account_model->getAccountType();
  331. $this->assign('account_type_arr', $account_type_arr);
  332. $supermember_is_exit = addon_is_exit('supermember', $this->site_id);
  333. $this->assign('supermember_is_exit', $supermember_is_exit);
  334. $this->assign('level_time', $member_level_model->level_time);
  335. return $this->fetch('member/edit_member');
  336. }
  337. }
  338. /**
  339. * 会员删除
  340. */
  341. public function deleteMember()
  342. {
  343. $member_ids = input('member_ids', '');
  344. $member_model = new MemberModel();
  345. $this->addLog("删除会员:id" . $member_ids);
  346. return $member_model->deleteMember([ [ 'member_id', 'in', $member_ids ], [ 'site_id', '=', $this->site_id ] ]);
  347. }
  348. /**
  349. * 修改会员标签
  350. */
  351. public function modifyLabel()
  352. {
  353. $member_ids = input('member_ids', '');
  354. $label_ids = input('label_ids', '');
  355. $member_model = new MemberModel();
  356. return $member_model->modifyMemberLabel($label_ids, [ [ 'member_id', 'in', $member_ids ] ]);
  357. }
  358. /**
  359. * 修改会员状态
  360. */
  361. public function modifyStatus()
  362. {
  363. $member_ids = input('member_ids', '');
  364. $status = input('status', 0);
  365. $member_model = new MemberModel();
  366. return $member_model->modifyMemberStatus($status, [ [ 'member_id', 'in', $member_ids ], [ 'site_id', '=', $this->site_id ] ]);
  367. }
  368. /**
  369. * 修改会员密码
  370. */
  371. public function modifyPassword()
  372. {
  373. $member_ids = input('member_ids', '');
  374. $password = input('password', '123456');
  375. $member_model = new MemberModel();
  376. return $member_model->resetMemberPassword($password, [ [ 'member_id', 'in', $member_ids ] ]);
  377. }
  378. /**
  379. * 账户详情
  380. */
  381. public function accountDetail()
  382. {
  383. $account_type = input('account_type', '');
  384. if (request()->isAjax()) {
  385. $page = input('page', 1);
  386. $page_size = input('page_size', PAGE_LIST_ROWS);
  387. $from_type = input('from_type', '');
  388. $start_date = input('start_date', '');
  389. $end_date = input('end_date', '');
  390. $member_id = input('member_id', 0);
  391. $condition[] = [ 'site_id', '=', $this->site_id ];
  392. $condition[] = [ 'member_id', '=', $member_id ];
  393. //账户类型
  394. if ($account_type != '') {
  395. $condition[] = [ 'account_type', 'in', $account_type ];
  396. }
  397. //来源类型
  398. if ($from_type != '') {
  399. $condition[] = [ 'from_type', '=', $from_type ];
  400. }
  401. //发生时间
  402. if ($start_date != '' && $end_date != '') {
  403. $condition[] = [ 'create_time', 'between', [ strtotime($start_date), strtotime($end_date) ] ];
  404. } else if ($start_date != '' && $end_date == '') {
  405. $condition[] = [ 'create_time', '>=', strtotime($start_date) ];
  406. } else if ($start_date == '' && $end_date != '') {
  407. $condition[] = [ 'create_time', '<=', strtotime($end_date) ];
  408. }
  409. $member_account_model = new MemberAccountModel();
  410. $res = $member_account_model->getMemberAccountPageList($condition, $page, $page_size);
  411. $account_type_arr = $member_account_model->getAccountType();
  412. foreach ($res[ 'data' ][ 'list' ] as $key => $val) {
  413. $res[ 'data' ][ 'list' ][ $key ][ 'account_type_name' ] = $account_type_arr[ $val[ 'account_type' ] ];
  414. }
  415. return $res;
  416. } else {
  417. $member_id = input('member_id', 0);
  418. //会员信息
  419. $member_model = new MemberModel();
  420. $member_info = $member_model->getMemberDetail($member_id, $this->site_id);
  421. if (empty($member_info[ 'data' ])) $this->error('未获取到会员数据', addon_url('shop/member/memberlist'));
  422. $this->assign('member_info', $member_info[ 'data' ]);
  423. //账户类型和来源类型
  424. $member_account_model = new MemberAccountModel();
  425. $account_type_arr = $member_account_model->getAccountType();
  426. $from_type_arr = $member_account_model->getFromType();
  427. $this->assign('account_type_arr', $account_type_arr);
  428. $this->assign('from_type_arr', $from_type_arr[$account_type] ?? []);
  429. $this->assign('account_type', $account_type);
  430. $this->assign('member_id', $member_id);
  431. return $this->fetch('member/account_detail');
  432. }
  433. }
  434. /**
  435. * 余额调整(不可提现)
  436. */
  437. public function adjustBalance()
  438. {
  439. $member_id = input('member_id', 0);
  440. $adjust_num = input('adjust_num', 0);
  441. $remark = input('remark', '商家调整');
  442. $this->addLog("会员余额调整id:" . $member_id . "金额" . $adjust_num);
  443. $member_account_model = new MemberAccountModel();
  444. return $member_account_model->addMemberAccount($this->site_id, $member_id, 'balance', $adjust_num, 'adjust', 0, $remark ? $remark : '商家调整');
  445. }
  446. /**
  447. * 积分调整
  448. */
  449. public function adjustPoint()
  450. {
  451. $member_id = input('member_id', 0);
  452. $adjust_num = input('adjust_num', 0);
  453. $remark = input('remark', '商家调整');
  454. $this->addLog("会员积分调整id:" . $member_id . "数量" . $adjust_num);
  455. $member_account_model = new MemberAccountModel();
  456. return $member_account_model->addMemberAccount($this->site_id, $member_id, 'point', $adjust_num, 'adjust', 0, $remark ? $remark : '商家调整');
  457. }
  458. /**
  459. * 成长值调整
  460. */
  461. public function adjustGrowth()
  462. {
  463. $member_id = input('member_id', 0);
  464. $adjust_num = input('adjust_num', 0);
  465. $remark = input('remark', '商家调整');
  466. $this->addLog("会员成长值调整id:" . $member_id . "数量" . $adjust_num);
  467. $member_account_model = new MemberAccountModel();
  468. return $member_account_model->addMemberAccount($this->site_id, $member_id, 'growth', $adjust_num, 'adjust', 0, $remark ? $remark : '商家调整');
  469. }
  470. /**
  471. * 注册协议
  472. */
  473. public function regAgreement()
  474. {
  475. if (request()->isAjax()) {
  476. //设置注册协议
  477. $title = input('title', '');
  478. $content = input('content', '');
  479. $config_model = new ConfigModel();
  480. return $config_model->setRegisterDocument($title, $content, $this->site_id, 'shop');
  481. } else {
  482. $this->forthMenu();
  483. //获取注册协议
  484. $config_model = new ConfigModel();
  485. $document_info = $config_model->getRegisterDocument($this->site_id, 'shop');
  486. $this->assign('document_info', $document_info);
  487. return $this->fetch('member/reg_agreement');
  488. }
  489. }
  490. /**
  491. * 注册设置
  492. */
  493. public function regConfig()
  494. {
  495. $config_model = new ConfigModel();
  496. if (request()->isAjax()) {
  497. //设置注册设置
  498. $data = array (
  499. 'login' => input('login', ''),
  500. 'register' => input('register', ''),
  501. 'pwd_len' => input('pwd_len', 6),
  502. 'pwd_complexity' => input('pwd_complexity', 'number,letter,upper_case,symbol'),
  503. 'third_party' => input('third_party', 0),
  504. 'bind_mobile' => input('bind_mobile', 0),
  505. );
  506. return $config_model->setRegisterConfig($data, $this->site_id, 'shop');
  507. } else {
  508. $this->forthMenu();
  509. //获取注册设置
  510. $config_info = $config_model->getRegisterConfig($this->site_id, 'shop');
  511. $value = $config_info[ 'data' ][ 'value' ];
  512. if (!empty($value)) {
  513. $value[ 'pwd_complexity_arr' ] = explode(',', $value[ 'pwd_complexity' ]);
  514. $value[ 'login' ] = explode(',', $value[ 'login' ]);
  515. $value[ 'register' ] = explode(',', $value[ 'register' ]);
  516. }
  517. $this->assign('value', $value);
  518. return $this->fetch('member/reg_config');
  519. }
  520. }
  521. /**
  522. * 注销协议
  523. */
  524. public function cancelAgreement()
  525. {
  526. if (request()->isAjax()) {
  527. //设置注销协议
  528. $title = input('title', '');
  529. $content = input('content', '');
  530. $config_model = new ConfigModel();
  531. return $config_model->setCancelDocument($title, $content, $this->site_id, 'shop');
  532. } else {
  533. //获取注销协议
  534. $config_model = new ConfigModel();
  535. $document_info = $config_model->getCancelDocument($this->site_id, 'shop');
  536. $this->assign('document_info', $document_info);
  537. return $this->fetch('member/cancel_agreement');
  538. }
  539. }
  540. /**
  541. * 注销设置
  542. */
  543. public function cancelConfig()
  544. {
  545. $config_model = new ConfigModel();
  546. if (request()->isAjax()) {
  547. //设置注册设置
  548. $data = array (
  549. 'is_enable' => input('is_enable', 0),
  550. 'is_audit' => input('is_audit', 1),
  551. );
  552. return $config_model->setCancelConfig($data, $this->site_id, 'shop');
  553. } else {
  554. //获取注册设置
  555. $config_info = $config_model->getCancelConfig($this->site_id, 'shop');
  556. $value = $config_info[ 'data' ][ 'value' ];
  557. $this->assign('value', $value);
  558. return $this->fetch('member/cancel_config');
  559. }
  560. }
  561. /**
  562. * 搜索会员
  563. * 不是菜单 不入权限
  564. */
  565. public function searchMember()
  566. {
  567. $search_text = input('search_text', '');
  568. $member_model = new MemberModel();
  569. $member_info = $member_model->getMemberInfo([ [ 'username|mobile', '=', $search_text ], [ 'site_id', '=', $this->site_id ] ]);
  570. return $member_info;
  571. }
  572. /**
  573. * 导出会员信息
  574. */
  575. public function exportMember()
  576. {
  577. //获取会员信息
  578. $search_text = input('search_text', '');
  579. $search_text_type = input('search_text_type', 'username');//可以传username mobile email
  580. $level_id = input('level_id', 0);
  581. $label_id = input('label_id', 0);
  582. $reg_start_date = input('reg_start_date', '');
  583. $reg_end_date = input('reg_end_date', '');
  584. $status = input('status', '');
  585. $cluster_id = input('cluster_id', '');//获取会员群体
  586. $last_login_time_start = input('last_login_time_start', '');//上次登录时间
  587. $last_login_time_end = input('last_login_time_end', '');
  588. $start_order_complete_num = input('start_order_complete_num', '');//成交次数
  589. $end_order_complete_num = input('end_order_complete_num', '');
  590. $start_order_complete_money = input('start_order_complete_money', '');//消费金额
  591. $end_order_complete_money = input('end_order_complete_money', '');
  592. $start_point = input('start_point', '');//积分
  593. $end_point = input('end_point', '');
  594. $start_balance = input('start_balance', '');//余额
  595. $end_balance = input('end_balance', '');
  596. $start_growth = input('start_growth', '');//成长值
  597. $end_growth = input('end_growth', '');
  598. $login_type = input('login_type', '');//来源渠道
  599. $condition[] = [ 'site_id', '=', $this->site_id ];
  600. //下拉选择
  601. $condition[] = [ $search_text_type, 'like', "%" . $search_text . "%" ];
  602. //会员等级
  603. if ($level_id != 0) {
  604. $condition[] = [ 'member_level', '=', $level_id ];
  605. }
  606. //会员标签
  607. if ($label_id != 0) {
  608. //raw方法变为public类型 需要实例化以后调用
  609. $condition[] = [ "", 'exp', Db::raw("FIND_IN_SET({$label_id}, member_label)") ];
  610. }
  611. //注册时间
  612. if ($reg_start_date != '' && $reg_end_date != '') {
  613. $condition[] = [ 'reg_time', 'between', [ strtotime($reg_start_date), strtotime($reg_end_date) ] ];
  614. } else if ($reg_start_date != '' && $reg_end_date == '') {
  615. $condition[] = [ 'reg_time', '>=', strtotime($reg_start_date) ];
  616. } else if ($reg_start_date == '' && $reg_end_date != '') {
  617. $condition[] = [ 'reg_time', '<=', strtotime($reg_end_date) ];
  618. }
  619. //会员状态
  620. if ($status != '') {
  621. $condition[] = [ 'status', '=', $status ];
  622. }
  623. //会员群体
  624. $member_cluster_model = new MemberClusterModel();
  625. if ($cluster_id != '') {
  626. //获取会员群体的member_id值
  627. $member_cluster_info = $member_cluster_model->getMemberClusterInfo([ "cluster_id" => $cluster_id ], 'member_ids');
  628. if (!empty($member_cluster_info[ 'data' ][ 'member_ids' ])) {
  629. $condition[] = [ 'member_id', 'in', $member_cluster_info[ 'data' ][ 'member_ids' ] ];
  630. }
  631. }
  632. //上次访问时间
  633. if ($last_login_time_start != '' && $last_login_time_end != '') {
  634. $condition[] = [ 'last_login_time', 'between', [ strtotime($last_login_time_start), strtotime($last_login_time_end) ] ];
  635. } else if ($last_login_time_start != '' && $last_login_time_end == '') {
  636. $condition[] = [ 'last_login_time', '>=', strtotime($last_login_time_start) ];
  637. } else if ($last_login_time_start == '' && $last_login_time_end != '') {
  638. $condition[] = [ 'last_login_time', '<=', strtotime($last_login_time_end) ];
  639. }
  640. //成交次数
  641. if ($start_order_complete_num != '' && $end_order_complete_num != '') {
  642. $condition[] = [ 'order_complete_num', 'between', [ $start_order_complete_num, $end_order_complete_num ] ];
  643. } else if ($start_order_complete_num != '' && $end_order_complete_num == '') {
  644. $condition[] = [ 'order_complete_num', '>=', $start_order_complete_num ];
  645. } else if ($start_order_complete_num == '' && $end_order_complete_num != '') {
  646. $condition[] = [ 'order_complete_num', '<=', $end_order_complete_num ];
  647. }
  648. //消费金额
  649. if ($start_order_complete_money != '' && $end_order_complete_money != '') {
  650. $condition[] = [ 'order_complete_num', 'between', [ $start_order_complete_money, $end_order_complete_money ] ];
  651. } else if ($start_order_complete_money != '' && $end_order_complete_money == '') {
  652. $condition[] = [ 'order_complete_num', '>=', $start_order_complete_money ];
  653. } else if ($start_order_complete_money == '' && $end_order_complete_money != '') {
  654. $condition[] = [ 'order_complete_num', '<=', $end_order_complete_money ];
  655. }
  656. //积分
  657. if ($start_point != '' && $end_point != '') {
  658. $condition[] = [ 'point', 'between', [ $start_point, $end_point ] ];
  659. } else if ($start_point != '' && $end_point == '') {
  660. $condition[] = [ 'point', '>=', $start_point ];
  661. } else if ($start_point == '' && $end_point != '') {
  662. $condition[] = [ 'point', '<=', $end_point ];
  663. }
  664. //余额
  665. if ($start_balance != '' && $end_balance != '') {
  666. $condition[] = [ 'balance', 'between', [ $start_balance, $end_balance ] ];
  667. } else if ($start_balance != '' && $end_balance == '') {
  668. $condition[] = [ 'balance', '>=', $start_balance ];
  669. } else if ($start_balance == '' && $end_balance != '') {
  670. $condition[] = [ 'balance', '<=', $end_balance ];
  671. }
  672. //成长值
  673. if ($start_growth != '' && $end_growth != '') {
  674. $condition[] = [ 'growth', 'between', [ $start_growth, $end_growth ] ];
  675. } else if ($start_growth != '' && $end_growth == '') {
  676. $condition[] = [ 'growth', '>=', $start_growth ];
  677. } else if ($start_growth == '' && $end_growth != '') {
  678. $condition[] = [ 'growth', '<=', $end_growth ];
  679. }
  680. //来源渠道
  681. if ($login_type != '') {
  682. $condition[] = [ 'login_type', '=', $login_type ];
  683. }
  684. $order = 'reg_time desc';
  685. $field = 'username,nickname,realname,mobile,sex,birthday,email,member_level_name,member_label_name,
  686. qq,location,balance,balance_money,point,growth,reg_time,last_login_ip,last_login_time,is_fenxiao,fenxiao_id';
  687. $member_model = new MemberModel();
  688. $list = $member_model->getMemberList($condition, $field, $order);
  689. $is_exit_fenxiao = addon_is_exit('fenxiao');
  690. if ($is_exit_fenxiao == 1) {
  691. if (!empty($list[ 'data' ])) {
  692. $fenxiao_model = new Fenxiao();
  693. foreach ($list[ 'data' ] as $k => $v) {
  694. if ($v[ 'is_fenxiao' ] == 1) {
  695. $parent_fenxiao_name = $fenxiao_model->getParentFenxiaoName($v[ 'fenxiao_id' ], 2);
  696. } else {
  697. $parent_fenxiao_name = $fenxiao_model->getParentFenxiaoName($v[ 'fenxiao_id' ], 1);
  698. }
  699. $list[ 'data' ][ $k ][ 'parent_fenxiao_name' ] = $parent_fenxiao_name;
  700. }
  701. }
  702. }
  703. // 实例化excel
  704. $phpExcel = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
  705. $phpExcel->getProperties()->setTitle("会员信息");
  706. $phpExcel->getProperties()->setSubject("会员信息");
  707. // 对单元格设置居中效果
  708. $phpExcel->getActiveSheet()->getStyle('A')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  709. $phpExcel->getActiveSheet()->getStyle('B')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  710. $phpExcel->getActiveSheet()->getStyle('C')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  711. $phpExcel->getActiveSheet()->getStyle('D')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  712. $phpExcel->getActiveSheet()->getStyle('E')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  713. $phpExcel->getActiveSheet()->getStyle('F')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  714. $phpExcel->getActiveSheet()->getStyle('G')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  715. $phpExcel->getActiveSheet()->getStyle('H')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  716. $phpExcel->getActiveSheet()->getStyle('I')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  717. $phpExcel->getActiveSheet()->getStyle('J')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  718. $phpExcel->getActiveSheet()->getStyle('K')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  719. $phpExcel->getActiveSheet()->getStyle('L')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  720. $phpExcel->getActiveSheet()->getStyle('M')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  721. $phpExcel->getActiveSheet()->getStyle('N')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  722. $phpExcel->getActiveSheet()->getStyle('O')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  723. $phpExcel->getActiveSheet()->getStyle('P')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  724. $phpExcel->getActiveSheet()->getStyle('Q')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  725. //单独添加列名称
  726. $phpExcel->setActiveSheetIndex(0);
  727. $phpExcel->getActiveSheet()->setCellValue('A1', '会员账号');//可以指定位置
  728. $phpExcel->getActiveSheet()->setCellValue('B1', '会员昵称');
  729. $phpExcel->getActiveSheet()->setCellValue('C1', '真实姓名');
  730. $phpExcel->getActiveSheet()->setCellValue('D1', '手机号');
  731. $phpExcel->getActiveSheet()->setCellValue('E1', '性别');
  732. $phpExcel->getActiveSheet()->setCellValue('F1', '生日');
  733. $phpExcel->getActiveSheet()->setCellValue('G1', '会员等级');
  734. $phpExcel->getActiveSheet()->setCellValue('H1', '会员标签');
  735. $phpExcel->getActiveSheet()->setCellValue('I1', 'qq');
  736. $phpExcel->getActiveSheet()->setCellValue('J1', '地址');
  737. $phpExcel->getActiveSheet()->setCellValue('K1', '余额');
  738. $phpExcel->getActiveSheet()->setCellValue('L1', '积分');
  739. $phpExcel->getActiveSheet()->setCellValue('M1', '成长值');
  740. $phpExcel->getActiveSheet()->setCellValue('N1', '上次登录时间');
  741. $phpExcel->getActiveSheet()->setCellValue('O1', '上次登录ip');
  742. $phpExcel->getActiveSheet()->setCellValue('P1', '注册时间');
  743. $phpExcel->getActiveSheet()->setCellValue('Q1', '上级分销商');
  744. //循环添加数据(根据自己的逻辑)
  745. $sex = [ '保密', '男', '女' ];
  746. foreach ($list[ 'data' ] as $k => $v) {
  747. $i = $k + 2;
  748. $phpExcel->getActiveSheet()->setCellValue('A' . $i, $v[ 'username' ] . ' ');
  749. $phpExcel->getActiveSheet()->setCellValue('B' . $i, $v[ 'nickname' ] . ' ');
  750. $phpExcel->getActiveSheet()->setCellValue('C' . $i, $v[ 'realname' ] . ' ');
  751. $phpExcel->getActiveSheet()->setCellValue('D' . $i, $v[ 'mobile' ] . ' ');
  752. $phpExcel->getActiveSheet()->setCellValue('E' . $i, $sex[ $v[ 'sex' ] ]);
  753. $phpExcel->getActiveSheet()->setCellValue('F' . $i, date('Y-m-d', $v[ 'birthday' ]));
  754. $phpExcel->getActiveSheet()->setCellValue('G' . $i, $v[ 'member_level_name' ]);
  755. $phpExcel->getActiveSheet()->setCellValue('H' . $i, $v[ 'member_label_name' ]);
  756. $phpExcel->getActiveSheet()->setCellValue('I' . $i, $v[ 'qq' ]);
  757. $phpExcel->getActiveSheet()->setCellValue('J' . $i, $v[ 'location' ]);
  758. $phpExcel->getActiveSheet()->setCellValue('K' . $i, $v[ 'balance' ] + $v[ 'balance_money' ]);
  759. $phpExcel->getActiveSheet()->setCellValue('L' . $i, $v[ 'point' ]);
  760. $phpExcel->getActiveSheet()->setCellValue('M' . $i, $v[ 'growth' ]);
  761. $phpExcel->getActiveSheet()->setCellValue('N' . $i, date('Y-m-d H:i:s', $v[ 'last_login_time' ]));
  762. $phpExcel->getActiveSheet()->setCellValue('O' . $i, $v[ 'last_login_ip' ]);
  763. $phpExcel->getActiveSheet()->setCellValue('P' . $i, date('Y-m-d H:i:s', $v[ 'reg_time' ]));
  764. $phpExcel->getActiveSheet()->setCellValue('Q' . $i, !empty($v[ 'parent_fenxiao_name' ]) ? $v[ 'parent_fenxiao_name' ] . ' ' : '');
  765. }
  766. // 重命名工作sheet
  767. $phpExcel->getActiveSheet()->setTitle('会员信息');
  768. // 设置第一个sheet为工作的sheet
  769. $phpExcel->setActiveSheetIndex(0);
  770. // 保存Excel 2007格式文件,保存路径为当前路径,名字为export.xlsx
  771. $objWriter = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($phpExcel, 'Xlsx');
  772. $file = date('Y年m月d日-会员信息表', time()) . '.xlsx';
  773. $objWriter->save($file);
  774. header("Content-type:application/octet-stream");
  775. $filename = basename($file);
  776. header("Content-Disposition:attachment;filename = " . $filename);
  777. header("Accept-ranges:bytes");
  778. header("Accept-length:" . filesize($file));
  779. readfile($file);
  780. unlink($file);
  781. exit;
  782. }
  783. /**
  784. * 订单管理
  785. */
  786. public function order()
  787. {
  788. $member_id = input("member_id", 0);//会员id
  789. $this->assign('member_id', $member_id);
  790. //会员详情四级菜单
  791. $this->forthMenu([ 'member_id' => $member_id ]);
  792. return $this->fetch('member/order');
  793. }
  794. /**
  795. * 会员地址
  796. */
  797. public function addressDetail()
  798. {
  799. if (request()->isAjax()) {
  800. $page = input('page', 1);
  801. $page_size = input('page_size', PAGE_LIST_ROWS);
  802. $member_id = input('member_id', 0);
  803. $condition[] = [ 'site_id', '=', $this->site_id ];
  804. $condition[] = [ 'member_id', '=', $member_id ];
  805. //会员地址
  806. $member_address_model = new MemberAddressModel();
  807. $res = $member_address_model->getMemberAddressPageList($condition, $page, $page_size);
  808. return $res;
  809. } else {
  810. $member_id = input('member_id', 0);
  811. $this->assign('member_id', $member_id);
  812. //会员详情四级菜单
  813. $this->forthMenu([ 'member_id' => $member_id ]);
  814. return $this->fetch('member/address_detail');
  815. }
  816. }
  817. /**
  818. * 会员领取优惠卷
  819. */
  820. public function memberCoupon()
  821. {
  822. $coupon_model = new CouponModel();
  823. if (request()->isAjax()) {
  824. $page = input('page', 1);
  825. $page_size = input('page_size', PAGE_LIST_ROWS);
  826. $member_id = input('member_id', 0);
  827. $condition[] = [ 'site_id', '=', $this->site_id ];
  828. $condition[] = [ 'member_id', '=', $member_id ];
  829. //查询会员领取的优惠券
  830. $res = $coupon_model->getCouponPageList($condition, $page, $page_size);
  831. return $res;
  832. } else {
  833. $member_id = input('member_id', 0);
  834. $this->assign('member_id', $member_id);
  835. //会员详情四级菜单
  836. $this->forthMenu([ 'member_id' => $member_id ]);
  837. $this->assign('get_type', $coupon_model->getCouponGetType());
  838. return $this->fetch('member/member_coupon');
  839. }
  840. }
  841. /**
  842. * 根据账户类型获取来源类型
  843. * @return array
  844. */
  845. public function getFromType()
  846. {
  847. $type = input('type', '');
  848. $model = new MemberAccountModel();
  849. $res = $model->getFromType();
  850. return $res[ $type ];
  851. }
  852. /**
  853. * 会员导入列表页
  854. */
  855. public function memberImport()
  856. {
  857. if (request()->isAjax()) {
  858. $member_model = new MemberModel();
  859. $page = input('page', 1);
  860. $page_size = input('page_size', PAGE_LIST_ROWS);
  861. $condition = [];
  862. $result = $member_model->getMemberImportRecordList($condition, $page, $page_size);
  863. return $result;
  864. }
  865. return $this->fetch('member/memberImport');
  866. }
  867. /**
  868. * 下载会员导入模板
  869. */
  870. public function downloadMemberFile()
  871. {
  872. // 实例化excel
  873. $phpExcel = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
  874. $phpExcel->getProperties()->setTitle("会员导入模板");
  875. $phpExcel->getProperties()->setSubject("会员导入模板");
  876. // 对单元格设置居中效果
  877. $phpExcel->getActiveSheet()->getStyle('A')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  878. $phpExcel->getActiveSheet()->getStyle('B')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  879. $phpExcel->getActiveSheet()->getStyle('C')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  880. $phpExcel->getActiveSheet()->getStyle('D')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  881. $phpExcel->getActiveSheet()->getStyle('E')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  882. $phpExcel->getActiveSheet()->getStyle('F')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  883. $phpExcel->getActiveSheet()->getStyle('G')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  884. $phpExcel->getActiveSheet()->getStyle('H')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  885. $phpExcel->getActiveSheet()->getStyle('I')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  886. $phpExcel->getActiveSheet()->getStyle('J')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  887. $phpExcel->getActiveSheet()->getStyle('K')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  888. $phpExcel->getActiveSheet()->getStyle('L')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  889. //单独添加列名称
  890. $phpExcel->setActiveSheetIndex(0);
  891. $phpExcel->getActiveSheet()->setCellValue('A1', '用户名');//可以指定位置
  892. $phpExcel->getActiveSheet()->setCellValue('B1', '手机号');
  893. $phpExcel->getActiveSheet()->setCellValue('C1', '昵称');
  894. $phpExcel->getActiveSheet()->setCellValue('D1', '密码(明文)');
  895. $phpExcel->getActiveSheet()->setCellValue('E1', '微信公众号openid');
  896. $phpExcel->getActiveSheet()->setCellValue('F1', '微信小程序openid');
  897. $phpExcel->getActiveSheet()->setCellValue('G1', '真实姓名');
  898. $phpExcel->getActiveSheet()->setCellValue('H1', '积分');
  899. $phpExcel->getActiveSheet()->setCellValue('I1', '成长值');
  900. $phpExcel->getActiveSheet()->setCellValue('J1', '余额(可提现)');
  901. $phpExcel->getActiveSheet()->setCellValue('K1', '余额(不可提现)');
  902. $phpExcel->getActiveSheet()->setCellValue('L1', '会员等级(名称)');
  903. // 设置第一个sheet为工作的sheet
  904. $phpExcel->setActiveSheetIndex(0);
  905. // 保存Excel 2007格式文件,保存路径为当前路径,名字为export.xlsx
  906. $objWriter = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($phpExcel, 'Xlsx');
  907. $file = date('Y年m月d日-会员导入模板', time()) . '.xlsx';
  908. $objWriter->save($file);
  909. header("Content-type:application/octet-stream");
  910. $filename = basename($file);
  911. header("Content-Disposition:attachment;filename = " . $filename);
  912. header("Accept-ranges:bytes");
  913. header("Accept-length:" . filesize($file));
  914. readfile($file);
  915. unlink($file);
  916. exit;
  917. }
  918. /**
  919. * 上传文件
  920. */
  921. public function file()
  922. {
  923. $upload_model = new UploadModel($this->site_id);
  924. $param = array (
  925. "name" => "file",
  926. 'extend_type' => [ 'xlsx' ]
  927. );
  928. $result = $upload_model->setPath("common/member/member_import/" . date("Ymd") . '/')->file($param);
  929. return $result;
  930. }
  931. /**
  932. * 导入
  933. */
  934. public function import()
  935. {
  936. if (request()->isAjax()) {
  937. $filename = input('filename', '');
  938. $path = input('path', '');
  939. $index = input('index', '');
  940. $success_num = input('success_num', 0);
  941. $error_num = input('error_num', 0);
  942. $record = input('record', 0);
  943. $member_model = new MemberModel();
  944. $params = [
  945. 'filename' => $filename,
  946. 'path' => $path,
  947. 'index' => $index,
  948. 'success_num' => $success_num,
  949. "error_num" => $error_num,
  950. "record" => $record
  951. ];
  952. $res = $member_model->importMember($params, $this->site_id);
  953. return $res;
  954. }
  955. }
  956. /**
  957. * 黑名单
  958. * @return mixed
  959. */
  960. public function blacklist()
  961. {
  962. if (request()->isAjax()) {
  963. $page = input('page', 1);
  964. $page_size = input('page_size', PAGE_LIST_ROWS);
  965. $search_text = input('search_text', '');
  966. $search_text_type = input('search_text_type', 'username');//可以传username mobile email
  967. $condition[] = [ 'status', '=', 0 ];
  968. $condition[] = [ 'site_id', '=', $this->site_id ];
  969. //下拉选择
  970. $condition[] = [ $search_text_type, 'like', "%" . $search_text . "%" ];
  971. $order = 'reg_time desc';
  972. $field = '*';
  973. $member_model = new MemberModel();
  974. $result = $member_model->getMemberPageList($condition, $page, $page_size, $order, $field);
  975. return $result;
  976. }
  977. return $this->fetch('member/blacklist');
  978. }
  979. /*
  980. * 会员导入记录
  981. */
  982. public function memberimportlist()
  983. {
  984. if (request()->isAjax()) {
  985. $member_model = new MemberModel();
  986. $id = input("id", 0);
  987. $page = input('page', 1);
  988. $page_size = input('page_size', PAGE_LIST_ROWS);
  989. $condition[ 'record_id' ] = $id;
  990. $list = $member_model->getMemberImportLogList($condition, $page, $page_size);
  991. return $list;
  992. }
  993. $id = request()->get("id", 0);
  994. $member_model = new MemberModel();
  995. $info = $member_model->getMemberImportRecordInfo($id);
  996. if (empty($info[ 'data' ])) $this->error('未获取到导入数据', addon_url('shop/member/memberimport'));
  997. $this->assign('info', $info);
  998. $this->assign('id', $id);
  999. return $this->fetch('member/import_log');
  1000. }
  1001. /**
  1002. * 变更会员会员卡
  1003. */
  1004. public function changeMemberLevel()
  1005. {
  1006. if (request()->isAjax()) {
  1007. $member_id = input('member_id', 0);
  1008. $level_id = input('level_id', 0);
  1009. $period_unit = input('period_unit', '');
  1010. $expire_time = 0;
  1011. switch ($period_unit) {
  1012. case 'week':
  1013. $expire_time = strtotime('+1 week');
  1014. break;
  1015. case 'month':
  1016. $expire_time = strtotime('+1 month');
  1017. break;
  1018. case 'quarter':
  1019. $expire_time = strtotime('+3 month');
  1020. break;
  1021. case 'year':
  1022. $expire_time = strtotime('+1 year');
  1023. break;
  1024. }
  1025. $member_level = new MemberLevelModel();
  1026. $res = $member_level->addMemberLevelChangeRecord($member_id, $this->site_id, $level_id, $expire_time, 'adjust', $this->user_info[ 'uid' ], 'user', $this->user_info[ 'username' ]);
  1027. return $res;
  1028. }
  1029. }
  1030. /**
  1031. * 获取各渠道会员数量
  1032. * @return array
  1033. */
  1034. public function getRegisterChannelMemberNum()
  1035. {
  1036. if (request()->isAjax()) {
  1037. $app_type = Config::get("app_type");
  1038. $member_model = new MemberModel();
  1039. $data = [];
  1040. foreach ($app_type as $k => $v) {
  1041. array_push($data, [
  1042. 'name' => $v[ 'name' ],
  1043. 'member_num' => $member_model->getMemberCount([ [ 'login_type', '=', $k ], [ 'is_delete', '=', 0 ] ])[ 'data' ]
  1044. ]);
  1045. }
  1046. return success(0, '', $data);
  1047. }
  1048. }
  1049. /**
  1050. * 办理会员
  1051. */
  1052. public function handleMember()
  1053. {
  1054. if (request()->isAjax()) {
  1055. $member_id = input('member_id', 0);
  1056. $level_id = input('level_id', 0);
  1057. $member_code = input('member_code', '');
  1058. $member_model = new MemberModel();
  1059. $res = $member_model->handleMember([
  1060. 'member_id' => $member_id,
  1061. 'level_id' => $level_id,
  1062. 'member_code' => $member_code,
  1063. 'site_id' => $this->site_id
  1064. ]);
  1065. return $res;
  1066. }
  1067. }
  1068. }