MemberService.php 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. <?php
  2. namespace services\member;
  3. use Yii;
  4. use common\models\base\User;
  5. use common\components\Service;
  6. use common\enums\AppEnum;
  7. use common\enums\StatusEnum;
  8. use common\models\member\Member;
  9. use common\enums\MemberTypeEnum;
  10. use common\helpers\TreeHelper;
  11. use common\helpers\EchantsHelper;
  12. use common\enums\MemberLevelBuyTypeEnum;
  13. use common\enums\AccessTokenGroupEnum;
  14. /**
  15. * Class MemberService
  16. * @package services\member
  17. */
  18. class MemberService extends Service
  19. {
  20. /**
  21. * 用户
  22. *
  23. * @var Member
  24. */
  25. protected $member;
  26. /**
  27. * @param $id
  28. * @return array|Member|\yii\db\ActiveRecord|null
  29. */
  30. public function get($id)
  31. {
  32. if (!$this->member || $this->member['id'] != $id) {
  33. $this->member = $this->findById($id);
  34. }
  35. return $this->member;
  36. }
  37. /**
  38. * @param Member $member
  39. * @return $this
  40. */
  41. public function set(Member $member)
  42. {
  43. $this->member = $member;
  44. return $this;
  45. }
  46. /**
  47. * 获取当前登录的用户ID
  48. *
  49. * @return int|string
  50. */
  51. public function getAutoId()
  52. {
  53. if (in_array(Yii::$app->id, AppEnum::api())) {
  54. $member_id = Yii::$app->user->identity->member_id ?? 0;
  55. if (empty($member_id)) {
  56. return Yii::$app->user->id ?? 0;
  57. }
  58. return $member_id;
  59. }
  60. return Yii::$app->user->id ?? 0;
  61. }
  62. /**
  63. * 购买等级
  64. *
  65. * @param Member $member
  66. * @param $validity
  67. * @param $level
  68. * @param int $buy_type
  69. */
  70. public function buyLevel(Member $member, $validity, $level, $buy_type = MemberLevelBuyTypeEnum::BUY)
  71. {
  72. $time = time();
  73. if ($member->level_expiration_time > time()) {
  74. $time = $member->level_expiration_time;
  75. }
  76. // 修改会员到期时间
  77. if ($member->current_level < $level) {
  78. Member::updateAll([
  79. 'level_expiration_time' => $time + $validity,
  80. 'current_level' => $level,
  81. 'level_buy_type' => $buy_type
  82. ], ['id' => $member->id]);
  83. } else {
  84. Member::updateAll([
  85. 'level_expiration_time' => $time + $validity,
  86. 'level_buy_type' => $buy_type
  87. ], ['id' => $member->id]);
  88. }
  89. }
  90. /**
  91. * 获取所有下级id
  92. *
  93. * @param $id
  94. * @return array|\yii\db\ActiveRecord[]
  95. */
  96. public function getChildById($id, $level = 3)
  97. {
  98. $member = $this->get($id);
  99. return Member::find()
  100. ->select(['id', 'level'])
  101. ->where(['status' => StatusEnum::ENABLED])
  102. ->andWhere(['<=', 'level', $member->level + $level])
  103. ->andWhere(['like', 'tree', $member->tree . TreeHelper::prefixTreeKey($member->id) . '%', false])
  104. ->andFilterWhere(['merchant_id' => $this->getMerchantId()])
  105. ->asArray()
  106. ->all();
  107. }
  108. /**
  109. * @return int|string
  110. */
  111. public function getCountByType($type = MemberTypeEnum::MEMBER, $merchant_id = '')
  112. {
  113. return Member::find()
  114. ->select('id')
  115. ->andWhere(['>', 'status', StatusEnum::DISABLED])
  116. ->andWhere(['type' => $type])
  117. ->andFilterWhere(['merchant_id' => $merchant_id])
  118. ->count();
  119. }
  120. /**
  121. * 获取区间会员数量
  122. *
  123. * @return array|\yii\db\ActiveRecord|null
  124. */
  125. public function getBetweenCountStat($type, $memberType = MemberTypeEnum::MEMBER)
  126. {
  127. $fields = [
  128. 'count' => '注册会员人数',
  129. ];
  130. // 获取时间和格式化
  131. list($time, $format) = EchantsHelper::getFormatTime($type);
  132. // 获取数据
  133. return EchantsHelper::lineOrBarInTime(function ($start_time, $end_time, $formatting) use ($memberType) {
  134. return Member::find()
  135. ->select(['count(id) as count', "from_unixtime(created_at, '$formatting') as time"])
  136. ->where(['>', 'status', StatusEnum::DISABLED])
  137. ->andWhere(['between', 'created_at', $start_time, $end_time])
  138. ->andWhere(['merchant_id' => Yii::$app->services->merchant->getNotNullId()])
  139. ->andWhere(['type' => $memberType])
  140. ->groupBy(['time'])
  141. ->asArray()
  142. ->all();
  143. }, $fields, $time, $format);
  144. }
  145. /**
  146. * 会员来源
  147. *
  148. * @param $type
  149. * @return array
  150. */
  151. public function getSourceStat($memberType = MemberTypeEnum::MEMBER)
  152. {
  153. $fields = AccessTokenGroupEnum::getMap();
  154. // 获取时间和格式化
  155. list($time, $format) = EchantsHelper::getFormatTime('all');
  156. // 获取数据
  157. return EchantsHelper::pie(function ($start_time, $end_time) use ($fields, $memberType) {
  158. $data = Member::find()
  159. ->select(['count(id) as value', 'source'])
  160. ->where(['type' => $memberType, 'status' => StatusEnum::ENABLED])
  161. ->andWhere(['merchant_id' => Yii::$app->services->merchant->getNotNullId()])
  162. ->groupBy(['source'])
  163. ->asArray()
  164. ->all();
  165. foreach ($data as &$datum) {
  166. $name = AccessTokenGroupEnum::getValue($datum['source']);
  167. $datum['name'] = !empty($name) ? $name : '未知';
  168. }
  169. return [$data, $fields];
  170. }, $time);
  171. }
  172. /**
  173. * 会员等级
  174. *
  175. * @return array
  176. */
  177. public function getLevelStat($memberType = MemberTypeEnum::MEMBER)
  178. {
  179. $fields = Yii::$app->services->memberLevel->getMap();
  180. // 获取时间和格式化
  181. list($time, $format) = EchantsHelper::getFormatTime('all');
  182. // 获取数据
  183. return EchantsHelper::pie(function ($start_time, $end_time) use ($fields, $memberType) {
  184. $data = Member::find()
  185. ->select(['count(id) as value', 'current_level'])
  186. ->where(['type' => $memberType, 'status' => StatusEnum::ENABLED])
  187. ->andWhere(['merchant_id' => Yii::$app->services->merchant->getNotNullId()])
  188. ->groupBy(['current_level'])
  189. ->asArray()
  190. ->all();
  191. foreach ($data as &$datum) {
  192. $name = $fields[$datum['current_level']] ?? '';
  193. $datum['name'] = !empty($name) ? $name : '未知';
  194. }
  195. return [$data, $fields];
  196. }, $time);
  197. }
  198. /**
  199. * 记录行为
  200. *
  201. * @param User $member
  202. * @param bool $saveAction
  203. * @throws \yii\base\InvalidConfigException
  204. */
  205. public function lastLogin($member)
  206. {
  207. // 记录访问次数
  208. $member->visit_count += 1;
  209. $member->last_time = time();
  210. $member->last_ip = Yii::$app->services->base->getUserIp();
  211. $member->save();
  212. }
  213. /**
  214. * @param $level
  215. * @param $type
  216. * @param $merchant_id
  217. * @return array|\yii\db\ActiveRecord|null
  218. */
  219. public function hasLevel($level, $type, $merchant_id)
  220. {
  221. return Member::find()
  222. ->where(['current_level' => $level])
  223. ->andWhere(['>=', 'status', StatusEnum::DISABLED])
  224. ->andWhere(['merchant_id' => $merchant_id])
  225. ->andWhere(['type' => $type])
  226. ->one();
  227. }
  228. /**
  229. * 写入条件查询
  230. *
  231. * @param array $condition
  232. * @return array|\yii\db\ActiveRecord|null|Member
  233. */
  234. public function findByCondition(array $condition)
  235. {
  236. return Member::find()
  237. ->where(['status' => StatusEnum::ENABLED])
  238. ->andWhere($condition)
  239. ->one();
  240. }
  241. /**
  242. * 写入条件查询
  243. *
  244. * @param array $condition
  245. * @return array|\yii\db\ActiveRecord|null
  246. */
  247. public function findAllByCondition(array $condition)
  248. {
  249. return Member::find()
  250. ->where(['status' => StatusEnum::ENABLED])
  251. ->andWhere($condition)
  252. ->all();
  253. }
  254. /**
  255. * @param $id
  256. * @return array|\yii\db\ActiveRecord|null|Member
  257. */
  258. public function findById($id, $select = ['*'])
  259. {
  260. return Member::find()
  261. ->select($select)
  262. ->where(['id' => $id])
  263. ->andWhere(['>=', 'status', StatusEnum::DISABLED])
  264. ->one();
  265. }
  266. /**
  267. * @param $ids
  268. * @param $type
  269. * @return array|\yii\db\ActiveRecord[]
  270. */
  271. public function findByIds($ids = [], $type = MemberTypeEnum::MEMBER, $select = ['*'])
  272. {
  273. return Member::find()
  274. ->select($select)
  275. ->filterWhere(['in', 'id', $ids])
  276. ->andWhere(['type' => $type])
  277. ->andWhere(['>=', 'status', StatusEnum::DISABLED])
  278. ->andFilterWhere(['merchant_id' => $this->getMerchantId()])
  279. ->all();
  280. }
  281. /**
  282. * @param $promoterCode
  283. * @return array|\yii\db\ActiveRecord|null|Member
  284. */
  285. public function findByPromoterCode($promoterCode)
  286. {
  287. return Member::find()
  288. ->where(['promoter_code' => $promoterCode])
  289. ->andWhere(['>=', 'status', StatusEnum::DISABLED])
  290. ->one();
  291. }
  292. }
粤ICP备19079148号