MemberController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. <?php
  2. namespace app\admin\controller\statistics;
  3. use app\model\Member;
  4. use app\model\MemberCert;
  5. use app\model\MemberRole;
  6. use app\model\PayDetail;
  7. use support\Db;
  8. class MemberController
  9. {
  10. public function index()
  11. {
  12. // 会员数量
  13. $memberCount = Member::where('member_is_owner', 'N')->where('member_mobile', '<>', '0000')->count();
  14. // 业主数量
  15. $ownerCount = Member::where('member_is_owner', 'Y')->count();
  16. // 用户总数
  17. $userCount = $memberCount + $ownerCount;
  18. // 今日新增用户数
  19. $todayTime = strtotime(date('Y-m-d 00:00:00'));
  20. $todayCount = Member::where('member_addtimes', '>', $todayTime)->where('member_is_owner', 'N')->count();
  21. // 本月新增用户数
  22. $monthTime = strtotime(date('Y-m-01 00:00:00'));
  23. $monthCount = Member::where('member_addtimes', '>', $monthTime)->where('member_is_owner', 'N')->count();
  24. // 折线图
  25. $newAddition = Db::select("
  26. SELECT t1.month, t1.member_count,
  27. SUM(t2.member_count) AS member_month_count
  28. FROM (
  29. SELECT DATE_FORMAT(FROM_UNIXTIME(member_addtimes), '%Y/%m') AS month,
  30. COUNT(member_id) AS member_count
  31. FROM app_member
  32. WHERE member_mobile != '0000'
  33. GROUP BY month
  34. ) t1
  35. JOIN (
  36. SELECT DATE_FORMAT(FROM_UNIXTIME(member_addtimes), '%Y/%m') AS month,
  37. COUNT(member_id) AS member_count
  38. FROM app_member
  39. WHERE member_mobile != '0000'
  40. GROUP BY month
  41. ) t2 ON t1.month >= t2.month
  42. GROUP BY t1.month;
  43. ");
  44. $newAdditionData = [];
  45. $newAddition = json_decode(json_encode($newAddition), true);
  46. foreach ($newAddition as $key => $item) {
  47. $newAddition[$key]['monthNbr'] = intval(str_replace('/', '', $item['month']));
  48. }
  49. usort($newAddition, function ($a, $b) {
  50. return $a['monthNbr'] - $b['monthNbr'];
  51. });
  52. foreach ($newAddition as $item) {
  53. $newAdditionData['category'][] = $item['month'];
  54. $newAdditionData['data'][] = $item['member_count'];
  55. $newAdditionData['month_total'][] = $item['member_month_count'];
  56. }
  57. // 饼图
  58. $newAdditionBing = Db::select("
  59. SELECT CASE
  60. WHEN TIMESTAMPDIFF(YEAR, member_cert_birth, CURDATE()) BETWEEN 0 AND 1 THEN '0'
  61. WHEN TIMESTAMPDIFF(YEAR, member_cert_birth, CURDATE()) BETWEEN 1 AND 39 THEN '39'
  62. WHEN TIMESTAMPDIFF(YEAR, member_cert_birth, CURDATE()) BETWEEN 40 AND 50 THEN '40-50'
  63. WHEN TIMESTAMPDIFF(YEAR, member_cert_birth, CURDATE()) BETWEEN 51 AND 60 THEN '51-60'
  64. WHEN TIMESTAMPDIFF(YEAR, member_cert_birth, CURDATE()) BETWEEN 61 AND 70 THEN '60-70'
  65. WHEN TIMESTAMPDIFF(YEAR, member_cert_birth, CURDATE()) BETWEEN 71 AND 80 THEN '70-80'
  66. ELSE '81以上'
  67. END AS age_group,
  68. COUNT(*) AS number_of_people
  69. FROM
  70. app_member_cert
  71. WHERE member_cert_birth != ''
  72. GROUP BY
  73. age_group
  74. ORDER BY
  75. age_group;
  76. ");
  77. $newAdditionBingData = [];
  78. foreach ($newAdditionBing as $item) {
  79. if ($item->age_group == '0') {
  80. $item->age_group = '未知';
  81. } elseif ($item->age_group == '39') {
  82. $item->age_group = '40以下';
  83. }
  84. $newAdditionBingData[] = [
  85. 'name' => $item->age_group,
  86. 'value' => $item->number_of_people
  87. ];
  88. }
  89. // 认证数
  90. $authCount = MemberCert::where('member_cert_nbr', '<>', '')
  91. ->where('member_cert_name', '<>', '')
  92. ->where('member_cert_name', '<>', null)
  93. ->where('member_mobile', '<>', '0000')
  94. ->count();
  95. $unAuthCount = $memberCount - $authCount;
  96. $authBingData = [
  97. [
  98. 'name' => '已认证',
  99. 'value' => $authCount
  100. ],
  101. [
  102. 'name' => '未认证',
  103. 'value' => $unAuthCount
  104. ]
  105. ];
  106. // 各身份数量
  107. $memberIdentityBingData = [];
  108. $basicMemberCount = $memberCount;
  109. // 1.等级
  110. $memberRoles = MemberRole::select('member_role_id', 'member_role_name')->get()->toArray();
  111. foreach ($memberRoles as $role) {
  112. $memberRoleCount = Member::where('join_member_role_id', $role['member_role_id'])->count();
  113. if ($memberRoleCount < 1) {
  114. continue;
  115. }
  116. $basicMemberCount -= $memberRoleCount;
  117. $isHave = false;
  118. foreach ($memberIdentityBingData as $key => $item) {
  119. if ($item['name'] == $role['member_role_name']) {
  120. $isHave = true;
  121. $memberIdentityBingData[$key]['value'] += $memberRoleCount;
  122. }
  123. }
  124. if (!$isHave) {
  125. $memberIdentityBingData[] = [
  126. 'name' => $role['member_role_name'],
  127. 'value' => $memberRoleCount
  128. ];
  129. }
  130. }
  131. // 2.康养城会员
  132. $vipCount = Member::where('member_is_vip', 'Y')->count();
  133. $basicMemberCount -= $vipCount;
  134. $memberIdentityBingData[] = [
  135. 'name' => '康养城VIP',
  136. 'value' => $vipCount
  137. ];
  138. // 3.会员合伙人
  139. $partnerCount = Member::where('member_is_partner', 'Y')->count();
  140. $basicMemberCount -= $partnerCount;
  141. $memberIdentityBingData[] = [
  142. 'name' => '会员合伙人',
  143. 'value' => $partnerCount
  144. ];
  145. // 4.康养推荐官
  146. $referrerCount = Member::where('member_is_referrer', 'Y')->count();
  147. $basicMemberCount -= $referrerCount;
  148. $memberIdentityBingData[] = [
  149. 'name' => '康养推荐官',
  150. 'value' => $referrerCount
  151. ];
  152. // 5.加盟合伙人
  153. $franchiseeCount = Member::where('member_is_franchisee', 'Y')->count();
  154. $basicMemberCount -= $franchiseeCount;
  155. $memberIdentityBingData[] = [
  156. 'name' => '加盟合伙人',
  157. 'value' => $franchiseeCount
  158. ];
  159. $memberIdentityAllBingData = $memberIdentityBingData;
  160. $memberIdentityAllBingData[] = [
  161. 'name' => '普通会员',
  162. 'value' => $basicMemberCount
  163. ];
  164. // 消费账户占比
  165. $memberConsumptionBingData = [
  166. ['name' => '未消费', 'value' => 0],
  167. ['name' => '1-500', 'value' => 0],
  168. ['name' => '501-1000', 'value' => 0],
  169. ['name' => '1001-5000', 'value' => 0],
  170. ['name' => '5001-10000', 'value' => 0],
  171. ['name' => '10001-50000', 'value' => 0],
  172. ['name' => '50000以上', 'value' => 0],
  173. ];
  174. $memberConsumptionCount = $memberCount;
  175. // 散客ID
  176. $sankeMemberId = Member::where('member_mobile', '0000')->value('member_id');
  177. $payDetails = PayDetail::selectRaw('SUM(pay_amount) as amount,join_pay_member_id')
  178. ->where('pay_amount', '>', 0)
  179. ->where('pay_status', 'SUCCESS')
  180. ->where('join_pay_member_id', '<>', $sankeMemberId)
  181. ->whereIn('pay_category', ['GOODS', 'SERVICE', 'CHNMED', 'CHNNCD', 'MEALS', 'PACKAGE'])
  182. ->groupBy('join_pay_member_id')
  183. ->get()
  184. ->toArray();
  185. foreach ($payDetails as $detail) {
  186. $memberConsumptionCount -= 1;
  187. if ($detail['amount'] >= 1 && $detail['amount'] <= 500 && isset($memberConsumptionBingData[1])) {
  188. $memberConsumptionBingData[1]['value'] += 1;
  189. } elseif ($detail['amount'] >= 501 && $detail['amount'] <= 1000 && isset($memberConsumptionBingData[2])) {
  190. $memberConsumptionBingData[2]['value'] += 1;
  191. } elseif ($detail['amount'] >= 1001 && $detail['amount'] <= 5000 && isset($memberConsumptionBingData[3])) {
  192. $memberConsumptionBingData[3]['value'] += 1;
  193. } elseif ($detail['amount'] >= 5001 && $detail['amount'] <= 10000 && isset($memberConsumptionBingData[4])) {
  194. $memberConsumptionBingData[4]['value'] += 1;
  195. } elseif ($detail['amount'] >= 10001 && $detail['amount'] <= 50000 && isset($memberConsumptionBingData[5])) {
  196. $memberConsumptionBingData[5]['value'] += 1;
  197. } elseif ($detail['amount'] >= 50001 && isset($memberConsumptionBingData[6])) {
  198. $memberConsumptionBingData[6]['value'] += 1;
  199. }
  200. }
  201. if ($memberConsumptionBingData[6]['value'] == 0) {
  202. unset($memberConsumptionBingData[6]);
  203. }
  204. $memberConsumptionBingData[0]['value'] = $memberConsumptionCount;
  205. // 充值
  206. $rechargeBingData = [];
  207. $rechargePaydetail = PayDetail::whereIn('pay_category', ['FRANCHISEE', 'RECHARGE', 'REFERRER', 'PARTNER', 'COMBINE'])
  208. ->where('pay_status', 'SUCCESS')
  209. ->where('join_pay_order_id', 'like', '%OD%');
  210. $recharge1Model = clone $rechargePaydetail;
  211. $rechargeBingData[] = [
  212. 'name' => '1-1000',
  213. 'value' => $recharge1Model->whereBetween('pay_amount', [1, 1000])->count()
  214. ];
  215. $recharge1Model = clone $rechargePaydetail;
  216. $rechargeBingData[] = [
  217. 'name' => '1001-5000',
  218. 'value' => $recharge1Model->whereBetween('pay_amount', [1001, 5000])->count()
  219. ];
  220. $recharge1Model = clone $rechargePaydetail;
  221. $rechargeBingData[] = [
  222. 'name' => '5001-10000',
  223. 'value' => $recharge1Model->whereBetween('pay_amount', [5001, 10000])->count()
  224. ];
  225. $recharge1Model = clone $rechargePaydetail;
  226. $rechargeBingData[] = [
  227. 'name' => '10001-50000',
  228. 'value' => $recharge1Model->whereBetween('pay_amount', [10001, 50000])->count()
  229. ];
  230. $recharge1Model = clone $rechargePaydetail;
  231. $rechargeBingData[] = [
  232. 'name' => '50000以上',
  233. 'value' => $recharge1Model->where('pay_amount', '>', 50000)->count()
  234. ];
  235. $data = [
  236. 'memberCount' => $memberCount,
  237. 'ownerCount' => $ownerCount,
  238. 'userCount' => $userCount,
  239. 'todayCount' => $todayCount,
  240. 'monthCount' => $monthCount,
  241. 'newAdditionData' => $newAdditionData,
  242. 'newAdditionBingData' => $newAdditionBingData,
  243. 'authBingData' => $authBingData,
  244. 'memberIdentityInfoBingData' => $memberIdentityBingData,
  245. 'memberIdentityAllBingData' => $memberIdentityAllBingData,
  246. 'memberConsumptionBingData' => $memberConsumptionBingData,
  247. 'rechargeBingData' => $rechargeBingData
  248. ];
  249. return json_success('', $data);
  250. }
  251. }