WechatUser.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. <?php
  2. /**
  3. *
  4. * @author: xaboy<365615158@qq.com>
  5. * @day: 2017/11/28
  6. */
  7. namespace app\admin\model\wechat;
  8. use app\admin\model\order\StoreOrder;
  9. use app\admin\model\user\User;
  10. use app\admin\model\user\UserExtract;
  11. use service\ExportService;
  12. use service\QrcodeService;
  13. use think\Cache;
  14. use think\Config;
  15. use traits\ModelTrait;
  16. use basic\ModelBasic;
  17. use service\WechatService;
  18. use service\PHPExcelService;
  19. use service\SystemConfigService;
  20. /**
  21. * 微信用户 model
  22. * Class WechatUser
  23. * @package app\admin\model\wechat
  24. */
  25. class WechatUser extends ModelBasic
  26. {
  27. use ModelTrait;
  28. protected $insert = ['add_time'];
  29. /**
  30. * 用uid获得openid
  31. * @param $uid
  32. * @return mixed
  33. */
  34. public static function uidToOpenid($uid,$update = false)
  35. {
  36. $cacheName = 'openid_'.$uid;
  37. $openid = Cache::get($cacheName);
  38. if($openid && !$update) return $openid;
  39. $openid = self::where('uid',$uid)->value('openid');
  40. if(!$openid) exception('对应的openid不存在!');
  41. Cache::set($cacheName,$openid,0);
  42. return $openid;
  43. }
  44. public static function setAddTimeAttr($value)
  45. {
  46. return time();
  47. }
  48. /**
  49. * .添加新用户
  50. * @param $openid
  51. * @return object
  52. */
  53. public static function setNewUser($openid)
  54. {
  55. $userInfo = WechatService::getUserInfo($openid);
  56. $userInfo['tagid_list'] = implode(',',$userInfo['tagid_list']);
  57. return self::set($userInfo);
  58. }
  59. /**
  60. * 更新用户信息
  61. * @param $openid
  62. * @return bool
  63. */
  64. public static function updateUser($openid)
  65. {
  66. $userInfo = WechatService::getUserInfo($openid);
  67. $userInfo['tagid_list'] = implode(',',$userInfo['tagid_list']);
  68. return self::edit($userInfo,$openid,'openid');
  69. }
  70. /**
  71. * 用户存在就更新 不存在就添加
  72. * @param $openid
  73. */
  74. public static function saveUser($openid)
  75. {
  76. self::be($openid,'openid') == true ? self::updateUser($openid) : self::setNewUser($openid);
  77. }
  78. /**
  79. * 用户取消关注
  80. * @param $openid
  81. * @return bool
  82. */
  83. public static function unSubscribe($openid)
  84. {
  85. return self::edit(['subscribe'=>0],$openid,'openid');
  86. }
  87. /**
  88. * 获取微信用户
  89. * @param array $where
  90. * @return array
  91. */
  92. public static function systemPage($where = array(),$isall=false){
  93. self::setWechatUserOrder();//设置 一级推荐人 二级推荐人 一级推荐人订单 二级推荐人订单 佣金
  94. $model = new self;
  95. if($isall==false) {
  96. $status = (int)SystemConfigService::get('store_brokerage_statu');
  97. if ($status == 1) {
  98. if ($uids = User::where(['is_promoter' => 1])->column('uid')) {
  99. $model = $model->where('uid', 'in', implode(',', $uids));
  100. }
  101. }
  102. }
  103. $model = $model->where('openid','NOT NULL');
  104. if($where['nickname'] !== '') $model = $model->where('nickname','LIKE',"%$where[nickname]%");
  105. if($where['data'] !== ''){
  106. list($startTime,$endTime) = explode(' - ',$where['data']);
  107. $model = $model->where('add_time','>',strtotime($startTime));
  108. $model = $model->where('add_time','<',strtotime($endTime));
  109. }
  110. if(isset($where['tagid_list']) && $where['tagid_list'] !== ''){
  111. $tagid_list = explode(',',$where['tagid_list']);
  112. foreach ($tagid_list as $v){
  113. $model = $model->where('tagid_list','LIKE',"%$v%");
  114. }
  115. }
  116. if(isset($where['groupid']) && $where['groupid'] !== '-1' ) $model = $model->where('groupid',"$where[groupid]");
  117. if(isset($where['sex']) && $where['sex'] !== '' ) $model = $model->where('sex',"$where[sex]");
  118. if(isset($where['subscribe']) && $where['subscribe'] !== '' ) $model = $model->where('subscribe',"$where[subscribe]");
  119. if(isset($where['stair']) && $where['stair'] != '') $model = $model->order($where['stair']);
  120. if(isset($where['second']) && $where['second'] != '') $model = $model->order($where['second']);
  121. if(isset($where['order_stair']) && $where['order_stair'] != '') $model = $model->order($where['order_stair']);
  122. if(isset($where['order_second']) && $where['order_second'] != '') $model = $model->order($where['order_second']);
  123. if(isset($where['now_money']) && $where['now_money'] != '') $model = $model->order($where['now_money']);
  124. $model = $model->order('uid desc');
  125. if(isset($where['export']) && $where['export'] == 1){
  126. $list = $model->select()->toArray();
  127. $export = [];
  128. foreach ($list as $index=>$item){
  129. $export[] = [
  130. $item['nickname'],
  131. $item['sex'],
  132. $item['country'].$item['province'].$item['city'],
  133. $item['stair'],
  134. $item['second'],
  135. $item['order_stair'],
  136. $item['order_second'],
  137. $item['now_money'],
  138. $item['subscribe'] == 1? '关注':'未关注',
  139. ];
  140. $list[$index] = $item;
  141. }
  142. PHPExcelService::setExcelHeader(['名称','性别','地区','一级推荐人','二级推荐人','一级推荐订单个数','二级推荐订单个数','获得佣金','是否关注公众号'])
  143. ->setExcelTile('微信用户导出','微信用户导出'.time(),' 生成时间:'.date('Y-m-d H:i:s',time()))
  144. ->setExcelContent($export)
  145. ->ExcelSave();
  146. }
  147. return self::page($model,function ($item){
  148. $item['qr_code'] = QrcodeService::getForeverQrcode('spread',$item['uid']);
  149. $item['extract_count_price'] = UserExtract::getUserCountPrice($item['uid']);//累计提现
  150. $item['extract_count_num'] = UserExtract::getUserCountNum($item['uid']);//提现次数
  151. // $item['qr_code'] = '';
  152. },$where);
  153. }
  154. /**
  155. * 获取筛选后的所有用户uid
  156. * @param array $where
  157. * @return array
  158. */
  159. public static function getAll($where = array()){
  160. $model = new self;
  161. if($where['nickname'] !== '') $model = $model->where('nickname','LIKE',"%$where[nickname]%");
  162. if($where['data'] !== ''){
  163. list($startTime,$endTime) = explode(' - ',$where['data']);
  164. $model = $model->where('add_time','>',strtotime($startTime));
  165. $model = $model->where('add_time','<',strtotime($endTime));
  166. }
  167. if($where['tagid_list'] !== ''){
  168. $model = $model->where('tagid_list','LIKE',"%$where[tagid_list]%");
  169. }
  170. if($where['groupid'] !== '-1' ) $model = $model->where('groupid',"$where[groupid]");
  171. if($where['sex'] !== '' ) $model = $model->where('sex',"$where[sex]");
  172. return $model->column('uid','uid');
  173. }
  174. /**
  175. * 获取已关注的用户
  176. * @param $field
  177. */
  178. public static function getSubscribe($field){
  179. return self::where('subscribe',1)->column($field);
  180. }
  181. public static function getUserAll($field){
  182. return self::column($field);
  183. }
  184. public static function getUserTag()
  185. {
  186. $tagName = Config::get('system_wechat_tag');
  187. return Cache::tag($tagName)->remember('_wechat_tag',function () use($tagName){
  188. Cache::tag($tagName,['_wechat_tag']);
  189. $tag = WechatService::userTagService()->lists()->toArray()['tags']?:array();
  190. $list = [];
  191. foreach ($tag as $g){
  192. $list[$g['id']] = $g;
  193. }
  194. return $list;
  195. });
  196. }
  197. public static function clearUserTag()
  198. {
  199. Cache::rm('_wechat_tag');
  200. }
  201. public static function getUserGroup()
  202. {
  203. $tagName = Config::get('system_wechat_tag');
  204. return Cache::tag($tagName)->remember('_wechat_group',function () use($tagName){
  205. Cache::tag($tagName,['_wechat_group']);
  206. $tag = WechatService::userGroupService()->lists()->toArray()['groups']?:array();
  207. $list = [];
  208. foreach ($tag as $g){
  209. $list[$g['id']] = $g;
  210. }
  211. return $list;
  212. });
  213. }
  214. public static function clearUserGroup()
  215. {
  216. Cache::rm('_wechat_group');
  217. }
  218. /**
  219. * 获取推广人数
  220. * @param $uid //用户的uid
  221. * @param int $spread
  222. * $spread 0 一级推广人数 1 二级推广人数
  223. * @return int|string
  224. */
  225. public static function getUserSpreadUidCount($uid,$spread = 1){
  226. $userStair = User::where('spread_uid',$uid)->column('uid','uid');//获取一级推家人
  227. if($userStair){
  228. if(!$spread) return count($userStair);//返回一级推人人数
  229. else return User::where('spread_uid','IN',implode(',',$userStair))->count();//二级推荐人数
  230. }else return 0;
  231. }
  232. /**
  233. * 获取推广人的订单
  234. * @param $uid
  235. * @param int $spread
  236. * $spread 0 一级推广总订单 1 所有推广总订单
  237. * @return int|string
  238. */
  239. public static function getUserSpreadOrderCount($uid,$spread = 1){
  240. $userStair = User::where('spread_uid',$uid)->column('uid','uid');//获取一级推家人uid
  241. if($userStair){
  242. if(!$spread){
  243. return StoreOrder::where('uid','IN',implode(',',$userStair))->where('paid',1)->where('refund_status',0)->where('status',2)->count();//获取一级推广人订单数
  244. }
  245. else{
  246. $userSecond = User::where('spread_uid','IN',implode(',',$userStair))->column('uid','uid');//二级推广人的uid
  247. if($userSecond){
  248. return StoreOrder::where('uid','IN',implode(',',$userSecond))->where('paid',1)->where('refund_status',0)->where('status',2)->count();//获取二级推广人订单数
  249. }else return 0;
  250. }
  251. }else return 0;
  252. }
  253. /**
  254. * 同步微信用户表内的 一级推荐人 二级推荐人 一级推荐人订单 二级推荐人订单
  255. */
  256. public static function setWechatUserOrder(){
  257. $uidAll = self::column('uid','uid');
  258. $item = [];
  259. foreach ($uidAll as $k=>$v){
  260. $item['stair'] = self::getUserSpreadUidCount($v,0);//一级推荐人
  261. $item['second'] = self::getUserSpreadUidCount($v);//二级推荐人
  262. $item['order_stair'] = self::getUserSpreadOrderCount($v,0);//一级推荐人订单
  263. $item['order_second'] = self::getUserSpreadOrderCount($v);//二级推荐人订单
  264. $item['now_money'] = User::where('uid',$v)->value('now_money');//佣金
  265. if(!$item['stair'] && !$item['second'] && !$item['order_stair'] && !$item['order_second'] && !$item['now_money']) continue;
  266. else self::edit($item,$v);
  267. }
  268. }
  269. }