Membercluster.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  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 app\model\member\MemberCluster as MemberClusterModel;
  12. use app\model\member\Member as MemberModel;
  13. use app\model\member\MemberLevel as MemberLevelModel;
  14. use app\model\member\MemberLabel as MemberLabelModel;
  15. /**
  16. * 会员群体管理 控制器
  17. */
  18. class Membercluster extends BaseShop
  19. {
  20. /**
  21. * 会员群体列表
  22. * @return array|mixed
  23. */
  24. public function clusterList()
  25. {
  26. $member_cluster_model = new MemberClusterModel();
  27. if (request()->isAjax()) {
  28. $page = input('page', 1);
  29. $page_size = input('page_size', PAGE_LIST_ROWS);
  30. $cluster_name = input('cluster_name', '');
  31. $start_date = input('start_date', '');
  32. $end_date = input('end_date', '');
  33. $condition[] = [ 'site_id', '=', $this->site_id ];
  34. $condition[] = [ 'cluster_name', 'like', "%" . $cluster_name . "%" ];
  35. //更新时间
  36. if ($start_date != '' && $end_date != '') {
  37. $condition[] = [ 'update_time', 'between', [ strtotime($start_date), strtotime($end_date) ] ];
  38. } else if ($start_date != '' && $end_date == '') {
  39. $condition[] = [ 'update_time', '>=', strtotime($start_date) ];
  40. } else if ($start_date == '' && $end_date != '') {
  41. $condition[] = [ 'update_time', '<=', strtotime($end_date) ];
  42. }
  43. $order = 'create_time desc';
  44. $field = '*';
  45. $list = $member_cluster_model->getMemberClusterPageList($condition, $page, $page_size, $order, $field);
  46. return $list;
  47. } else {
  48. return $this->fetch('membercluster/cluster_list');
  49. }
  50. }
  51. /**
  52. * 添加会员群体
  53. * @return array|mixed
  54. */
  55. public function addCluster()
  56. {
  57. $member_cluster_model = new MemberClusterModel();
  58. if (request()->isAjax()) {
  59. $data = [
  60. 'site_id' => $this->site_id,
  61. 'cluster_name' => input('cluster_name', ''),
  62. 'rule_json' => input('rule_json', ''),
  63. 'create_time' => time(),
  64. 'update_time' => time(),
  65. ];
  66. return $member_cluster_model->addMemberCluster($data);
  67. } else {
  68. $basic_list = $member_cluster_model->basic;
  69. $consume_list = $member_cluster_model->consume;
  70. $promotion_list = $member_cluster_model->promotion;
  71. $this->assign('basic_list', $basic_list);
  72. $this->assign('consume_list', $consume_list);
  73. $this->assign('promotion_list', $promotion_list);
  74. //会员等级
  75. $member_level_model = new MemberLevelModel();
  76. $member_level_list = $member_level_model->getMemberLevelList([ [ 'site_id', '=', $this->site_id ] ], 'level_id, level_name', 'growth asc');
  77. $this->assign('member_level_list', $member_level_list[ 'data' ]);
  78. //会员标签
  79. $member_label_model = new MemberLabelModel();
  80. $member_label_list = $member_label_model->getMemberLabelList([ [ 'site_id', '=', $this->site_id ] ], 'label_id, label_name', 'sort asc');
  81. $this->assign('member_label_list', $member_label_list[ 'data' ]);
  82. return $this->fetch('membercluster/add_cluster');
  83. }
  84. }
  85. /**
  86. * 编辑会员群体
  87. * @return array|mixed
  88. */
  89. public function editCluster()
  90. {
  91. $member_cluster_model = new MemberClusterModel();
  92. $cluster_id = input('cluster_id', 0);
  93. if (request()->isAjax()) {
  94. $data = [
  95. 'site_id' => $this->site_id,
  96. 'cluster_name' => input('cluster_name', ''),
  97. 'rule_json' => input('rule_json', ''),
  98. 'update_time' => time(),
  99. ];
  100. return $member_cluster_model->editMemberCluster($data, [ 'cluster_id' => $cluster_id ]);
  101. } else {
  102. $cluster_info = $member_cluster_model->getMemberClusterDetail([ [ 'cluster_id', '=', $cluster_id ] ]);
  103. $this->assign('cluster_info', $cluster_info[ 'data' ]);
  104. //会员等级
  105. $member_level_model = new MemberLevelModel();
  106. $member_level_list = $member_level_model->getMemberLevelList([ [ 'site_id', '=', $this->site_id ] ], 'level_id, level_name', 'growth asc');
  107. $this->assign('member_level_list', $member_level_list[ 'data' ]);
  108. //会员标签
  109. $member_label_model = new MemberLabelModel();
  110. $member_label_list = $member_label_model->getMemberLabelList([ [ 'site_id', '=', $this->site_id ] ], 'label_id, label_name', 'sort asc');
  111. $this->assign('member_label_list', $member_label_list[ 'data' ]);
  112. return $this->fetch('membercluster/edit_cluster');
  113. }
  114. }
  115. /**
  116. * 删除会员群体
  117. */
  118. public function deleteCluster()
  119. {
  120. $cluster_ids = input('cluster_ids', '');
  121. $member_cluster_model = new MemberClusterModel();
  122. return $member_cluster_model->deleteMemberCluster([ 'cluster_id' => $cluster_ids ]);
  123. }
  124. /**
  125. * 刷新操作
  126. * @return array|mixed
  127. */
  128. public function refreshCluster()
  129. {
  130. if (request()->isAjax()) {
  131. $member_cluster_model = new MemberClusterModel();
  132. $cluster_id = input('cluster_id', 0);
  133. return $member_cluster_model->refreshMemberCluster($cluster_id);
  134. }
  135. }
  136. /**
  137. * 导出会员
  138. */
  139. public function exportClusterMember()
  140. {
  141. $member_cluster_model = new MemberClusterModel();
  142. $cluster_id = input('cluster_id', 0);
  143. $cluster_condition[] = [ 'site_id', '=', $this->site_id ];
  144. $cluster_condition[] = [ 'cluster_id', '=', $cluster_id ];
  145. $cluster_info = $member_cluster_model->getMemberClusterInfo($cluster_condition, 'member_ids,cluster_name');
  146. $order = 'reg_time desc';
  147. $field = 'username,nickname,realname,mobile,sex,birthday,email,member_level_name,member_label_name,
  148. qq,location,balance,balance_money,point,growth,reg_time,last_login_ip,last_login_time';
  149. $member_model = new MemberModel();
  150. $condition[] = [ "member_id", "in", $cluster_info[ 'data' ][ "member_ids" ] ];
  151. $condition[] = [ "site_id", "=", $this->site_id ];
  152. $list = $member_model->getMemberList($condition, $field, $order);
  153. // 实例化excel
  154. $phpExcel = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
  155. $phpExcel->getProperties()->setTitle("会员信息");
  156. $phpExcel->getProperties()->setSubject("会员信息");
  157. // 对单元格设置居中效果
  158. $phpExcel->getActiveSheet()->getStyle('A')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  159. $phpExcel->getActiveSheet()->getStyle('B')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  160. $phpExcel->getActiveSheet()->getStyle('C')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  161. $phpExcel->getActiveSheet()->getStyle('D')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  162. $phpExcel->getActiveSheet()->getStyle('E')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  163. $phpExcel->getActiveSheet()->getStyle('F')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  164. $phpExcel->getActiveSheet()->getStyle('G')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  165. $phpExcel->getActiveSheet()->getStyle('H')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  166. $phpExcel->getActiveSheet()->getStyle('I')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  167. $phpExcel->getActiveSheet()->getStyle('J')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  168. $phpExcel->getActiveSheet()->getStyle('K')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  169. $phpExcel->getActiveSheet()->getStyle('L')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  170. $phpExcel->getActiveSheet()->getStyle('M')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  171. $phpExcel->getActiveSheet()->getStyle('N')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  172. $phpExcel->getActiveSheet()->getStyle('O')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  173. $phpExcel->getActiveSheet()->getStyle('P')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  174. //单独添加列名称
  175. $phpExcel->setActiveSheetIndex(0);
  176. $phpExcel->getActiveSheet()->setCellValue('A1', '会员账号');//可以指定位置
  177. $phpExcel->getActiveSheet()->setCellValue('B1', '会员昵称');
  178. $phpExcel->getActiveSheet()->setCellValue('C1', '真实姓名');
  179. $phpExcel->getActiveSheet()->setCellValue('D1', '手机号');
  180. $phpExcel->getActiveSheet()->setCellValue('E1', '性别');
  181. $phpExcel->getActiveSheet()->setCellValue('F1', '生日');
  182. $phpExcel->getActiveSheet()->setCellValue('G1', '会员等级');
  183. $phpExcel->getActiveSheet()->setCellValue('H1', '会员标签');
  184. $phpExcel->getActiveSheet()->setCellValue('I1', 'qq');
  185. $phpExcel->getActiveSheet()->setCellValue('J1', '地址');
  186. $phpExcel->getActiveSheet()->setCellValue('K1', '余额');
  187. $phpExcel->getActiveSheet()->setCellValue('L1', '积分');
  188. $phpExcel->getActiveSheet()->setCellValue('M1', '成长值');
  189. $phpExcel->getActiveSheet()->setCellValue('N1', '上次登录时间');
  190. $phpExcel->getActiveSheet()->setCellValue('O1', '上次登录ip');
  191. $phpExcel->getActiveSheet()->setCellValue('P1', '注册时间');
  192. //循环添加数据(根据自己的逻辑)
  193. $sex = [ '保密', '男', '女' ];
  194. foreach ($list[ 'data' ] as $k => $v) {
  195. $i = $k + 2;
  196. $phpExcel->getActiveSheet()->setCellValue('A' . $i, $v[ 'username' ]);
  197. $phpExcel->getActiveSheet()->setCellValue('B' . $i, $v[ 'nickname' ]);
  198. $phpExcel->getActiveSheet()->setCellValue('C' . $i, $v[ 'realname' ]);
  199. $phpExcel->getActiveSheet()->setCellValue('D' . $i, $v[ 'mobile' ]);
  200. $phpExcel->getActiveSheet()->setCellValue('E' . $i, $sex[ $v[ 'sex' ] ]);
  201. $phpExcel->getActiveSheet()->setCellValue('F' . $i, date('Y-m-d', $v[ 'birthday' ]));
  202. $phpExcel->getActiveSheet()->setCellValue('G' . $i, $v[ 'member_level_name' ]);
  203. $phpExcel->getActiveSheet()->setCellValue('H' . $i, $v[ 'member_label_name' ]);
  204. $phpExcel->getActiveSheet()->setCellValue('I' . $i, $v[ 'qq' ]);
  205. $phpExcel->getActiveSheet()->setCellValue('J' . $i, $v[ 'location' ]);
  206. $phpExcel->getActiveSheet()->setCellValue('K' . $i, $v[ 'balance' ] + $v[ 'balance_money' ]);
  207. $phpExcel->getActiveSheet()->setCellValue('L' . $i, $v[ 'point' ]);
  208. $phpExcel->getActiveSheet()->setCellValue('M' . $i, $v[ 'growth' ]);
  209. $phpExcel->getActiveSheet()->setCellValue('N' . $i, date('Y-m-d H:i:s', $v[ 'last_login_time' ]));
  210. $phpExcel->getActiveSheet()->setCellValue('O' . $i, $v[ 'last_login_ip' ]);
  211. $phpExcel->getActiveSheet()->setCellValue('P' . $i, date('Y-m-d H:i:s', $v[ 'reg_time' ]));
  212. }
  213. // 重命名工作sheet
  214. $phpExcel->getActiveSheet()->setTitle('会员信息');
  215. // 设置第一个sheet为工作的sheet
  216. $phpExcel->setActiveSheetIndex(0);
  217. // 保存Excel 2007格式文件,保存路径为当前路径,名字为export.xlsx
  218. $objWriter = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($phpExcel, 'Xlsx');
  219. $file = date('Y年m月d日-会员信息表', time()) . '.xlsx';
  220. $objWriter->save($file);
  221. header("Content-type:application/octet-stream");
  222. $filename = basename($file);
  223. header("Content-Disposition:attachment;filename = " . $filename);
  224. header("Accept-ranges:bytes");
  225. header("Accept-length:" . filesize($file));
  226. readfile($file);
  227. unlink($file);
  228. exit;
  229. }
  230. /**
  231. * 发放优惠券
  232. */
  233. public function sendCoupon()
  234. {
  235. if (request()->isAjax()) {
  236. $member_cluster_model = new MemberClusterModel();
  237. $cluster_id = input('cluster_id', 0);
  238. $coupon_data = json_decode(input('coupon_data', '[]'), true);
  239. return $member_cluster_model->sendCoupon($coupon_data, $cluster_id);
  240. }
  241. }
  242. /**
  243. * 发放红包
  244. */
  245. public function sendBalance()
  246. {
  247. if (request()->isAjax()) {
  248. $member_cluster_model = new MemberClusterModel();
  249. $cluster_id = input('cluster_id', 0);
  250. $adjust_num = input('adjust_num', 0);
  251. $remark = input('remark', '');
  252. return $member_cluster_model->sendBalance($adjust_num, $cluster_id, $remark);
  253. }
  254. }
  255. /**
  256. * 发放积分
  257. */
  258. public function sendPoint()
  259. {
  260. if (request()->isAjax()) {
  261. $member_cluster_model = new MemberClusterModel();
  262. $cluster_id = input('cluster_id', 0);
  263. $adjust_num = input('adjust_num', 0);
  264. $remark = input('remark', '');
  265. return $member_cluster_model->sendPoint($adjust_num, $cluster_id, $remark);
  266. }
  267. }
  268. /**
  269. * 计算人数
  270. * @return array
  271. */
  272. public function calculate()
  273. {
  274. $member_cluster_model = new MemberClusterModel();
  275. if (request()->isAjax()) {
  276. $data = [
  277. 'site_id' => $this->site_id,
  278. 'rule_json' => input('rule_json', ''),
  279. ];
  280. return $member_cluster_model->calculate($data);
  281. }
  282. }
  283. }