AgentExtLogic.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. <?php
  2. /**
  3. * AgentExtLogic.php UTF-8
  4. * 渠道扩展
  5. *
  6. * @date : 2018/8/17 10:33
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : chenbingling <cbl@huosdk.com>
  10. * @version : HUOSDK 8.0
  11. */
  12. namespace huomp\logic\agent;
  13. use huo\controller\common\CommonFunc;
  14. use huo\model\user\AgentExtModel;
  15. use huolib\constant\CacheConst;
  16. use huolib\constant\CommonConst;
  17. use huolib\constant\MemConst;
  18. use huolib\tool\StrUtils;
  19. use huomp\model\common\CommonModel;
  20. use huomp\model\fill\MemFakerModel;
  21. use think\Cache;
  22. use think\db\exception\DataNotFoundException;
  23. use think\db\exception\ModelNotFoundException;
  24. use think\exception\DbException;
  25. class AgentExtLogic extends CommonModel {
  26. protected function getWhere($param = []) {
  27. $_map = [];
  28. if (!empty($param['agent_id'])) {
  29. $_map['agent_id'] = $param['agent_id'];
  30. }
  31. if (!empty($param['role_id'])) {
  32. $_map['mpagent.role_id'] = $param['role_id'];
  33. }
  34. return $_map;
  35. }
  36. /***
  37. * 后台获取渠道数据排行
  38. *
  39. * @param $field //排序字段
  40. * @param array $where
  41. * @param string $page
  42. *
  43. * @return array
  44. */
  45. public function getRank($field, $where = [], $page = '1,10') {
  46. $_map = $this->getWhere($where);
  47. $_rdata = ['count' => 0, 'list' => []];
  48. if (empty($field)) {
  49. return $_rdata;
  50. }
  51. $_field = [
  52. 'id' => 'id',
  53. 'user_login' => 'user_login',
  54. 'user_nicename' => 'user_nicename',
  55. 'mem_id' => 'mem_id',
  56. 'share_total' => 'share_total',
  57. 'reg_cnt' => 'reg_cnt',
  58. ];
  59. $_order = $field.' desc';
  60. $_ae_model = new AgentExtModel();
  61. $_count = $_ae_model->with('mpagent')->where($_map)->count('agent_id');
  62. if (empty($_count)) {
  63. return $_rdata;
  64. }
  65. try {
  66. $_a_data = $_ae_model->with('mpagent')
  67. ->with('mem')
  68. ->where($_map)
  69. ->field($_field)
  70. ->order($_order)
  71. ->page($page)
  72. ->select();
  73. if (is_object($_a_data)) {
  74. $_a_data = $_a_data->toArray();
  75. }
  76. if (empty($_a_data)) {
  77. return $_rdata;
  78. }
  79. $_list = [];
  80. foreach ($_a_data as $_k => $_v) {
  81. $_data = [];
  82. foreach ($_field as $k => $v) {
  83. $_data[$v] = $_v[$k];
  84. }
  85. $_data['mem'] = empty($_v['mem']) ? '' : $_v['mem']['username'];
  86. $_data['mem_nickname'] = empty($_v['mem']) ? '' : $_v['mem']['nickname'];
  87. $_list[] = $_data;
  88. }
  89. $_rdata = ['count' => $_count, 'list' => $_list];
  90. } catch (DataNotFoundException $e) {
  91. } catch (ModelNotFoundException $e) {
  92. } catch (DbException $e) {
  93. }
  94. return $_rdata;
  95. }
  96. /**
  97. * 收益排行列表
  98. *
  99. * @param $agent_id
  100. * @param array $where
  101. * @param string $page
  102. *
  103. * @return array
  104. */
  105. public function getRankList($agent_id, $where = [], $page = '1,10') {
  106. $_map = $this->getWhere($where);
  107. $_map['mpagent.user_status'] = MemConst::STATUS_NORMAL;
  108. $_data = $this->getList($agent_id, $_map, $page);
  109. return $_data;
  110. }
  111. /**
  112. * @param $agent_id
  113. * @param $where
  114. * @param string $page
  115. *
  116. * @return array|mixed
  117. * @throws DataNotFoundException
  118. * @throws DbException
  119. * @throws ModelNotFoundException
  120. */
  121. public function getList($agent_id, $where, $page = '1,10') {
  122. $_data = $this->getRankData($agent_id, $where);
  123. if (empty($_data['list'])) {
  124. return $_data;
  125. }
  126. $_page_data = explode(',', $page);
  127. $_start = ($_page_data[0] - 1) * $_page_data[1];
  128. $_data['list'] = array_slice($_data['list'], $_start, $_page_data[1]);
  129. return $_data;
  130. }
  131. /**
  132. * @param $agent_id
  133. * @param $where
  134. *
  135. * @return mixed
  136. * @throws DataNotFoundException
  137. * @throws DbException
  138. * @throws ModelNotFoundException
  139. */
  140. public function getRankData($agent_id, $where) {
  141. $_cache_key = CacheConst::CACHE_MONEY_RANK_PREFIX.md5(json_encode(array($where)));
  142. $_rdata = json_decode(Cache::get($_cache_key), true);
  143. if (!empty($_rdata)) {
  144. return $_rdata;
  145. }
  146. $_map = $where;
  147. /* 获取真实数据 */
  148. $_model = new AgentExtModel();
  149. $_order = 'share_total desc';
  150. $_data_list = $_model
  151. ->with('mpagent')
  152. ->where($_map)
  153. ->order($_order)
  154. ->limit(CommonConst::CONST_MAX_SHOW_CNT)
  155. ->select();
  156. if (is_object($_data_list)) {
  157. $_data_list = $_data_list->toArray();
  158. }
  159. $_merge_data = [];
  160. $_gold_rmb_rate = CommonFunc::getGoldRmbRate();
  161. foreach ($_data_list as $_item) {
  162. $_merge_data[] = [
  163. 'avatar' => !empty($_item['mpagent']) ? $_item['mpagent']['avatar'] : '',
  164. 'nickname' => !empty($_item['mpagent']) ? $_item['mpagent']['user_nicename'] : '',
  165. 'mem_id' => !empty($_item['mpagent']) ? $_item['mpagent']['mem_id'] : 0,
  166. 'agent_id' => $_item['agent_id'],
  167. 'reg_cnt' => StrUtils::formatNumber($_item['reg_cnt']),
  168. 'share_total' => StrUtils::formatNumber($_item['share_total']),
  169. 'share_total_integral' => intval($_gold_rmb_rate * $_item['share_total']),
  170. ];
  171. }
  172. /* 获取虚拟数据 */
  173. $_order = 'sub_amount desc';
  174. $_faker_data_list = (new MemFakerModel())->where(['is_delete' => CommonConst::CONST_NOT_DELETE])
  175. ->order($_order)
  176. ->limit(CommonConst::CONST_MAX_SHOW_CNT)
  177. ->select();
  178. if (is_object($_faker_data_list)) {
  179. $_faker_data_list = $_faker_data_list->toArray();
  180. }
  181. foreach ($_faker_data_list as $_item) {
  182. $_merge_data[] = [
  183. 'avatar' => empty($_item['avatar']) ? '' : cmf_get_image_preview_url($_item['avatar']),
  184. 'nickname' => empty($_item['nickname']) ? '' : $_item['nickname'],
  185. 'mem_id' => empty($_item['id']) ? 0 : 'fk_'.$_item['id'],
  186. 'agent_id' => empty($_item['id']) ? 0 : 'fk_'.$_item['id'],
  187. 'reg_cnt' => StrUtils::formatNumber($_item['sub_mem_cnt']),
  188. 'share_total' => StrUtils::formatNumber($_item['sub_amount']),
  189. 'share_total_integral' => intval($_gold_rmb_rate * $_item['sub_amount']),
  190. ];
  191. }
  192. if (empty($_merge_data)) {
  193. return [
  194. 'count' => 0,
  195. 'ranking' => 0,
  196. 'list' => []
  197. ];
  198. }
  199. //重新排序并截取
  200. array_multisort(array_column($_merge_data, 'share_total'), SORT_DESC, $_merge_data);
  201. $_merge_data = array_slice($_merge_data, 0, CommonConst::CONST_MAX_SHOW_CNT);
  202. $_ranking = '99+';
  203. foreach ($_merge_data as $_k => $_v) {
  204. if ($agent_id == $_v['agent_id']) {
  205. $_ranking = $_k + 1;
  206. }
  207. }
  208. $_rdata = [
  209. 'count' => CommonConst::CONST_MAX_SHOW_CNT,
  210. 'ranking' => $_ranking,
  211. 'list' => $_merge_data
  212. ];
  213. Cache::set($_cache_key, json_encode($_rdata), CommonConst::CONST_MINUTE_SECONDS);
  214. return $_rdata;
  215. }
  216. }