WechatUser.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  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. $model = new self;
  94. $model = $model->where('openid','NOT NULL');
  95. if($where['nickname'] !== '') $model = $model->where('nickname','LIKE',"%$where[nickname]%");
  96. if($where['data'] !== ''){
  97. list($startTime,$endTime) = explode(' - ',$where['data']);
  98. $model = $model->where('add_time','>',strtotime($startTime));
  99. $model = $model->where('add_time','<',strtotime($endTime));
  100. }
  101. if(isset($where['tagid_list']) && $where['tagid_list'] !== ''){
  102. $tagid_list = explode(',',$where['tagid_list']);
  103. foreach ($tagid_list as $v){
  104. $model = $model->where('tagid_list','LIKE',"%$v%");
  105. }
  106. }
  107. if(isset($where['groupid']) && $where['groupid'] !== '-1' ) $model = $model->where('groupid',"$where[groupid]");
  108. if(isset($where['sex']) && $where['sex'] !== '' ) $model = $model->where('sex',"$where[sex]");
  109. if(isset($where['subscribe']) && $where['subscribe'] !== '' ) $model = $model->where('subscribe',"$where[subscribe]");
  110. $model = $model->order('uid desc');
  111. if(isset($where['export']) && $where['export'] == 1){
  112. $list = $model->select()->toArray();
  113. $export = [];
  114. foreach ($list as $index=>$item){
  115. $export[] = [
  116. $item['nickname'],
  117. $item['sex'],
  118. $item['country'].$item['province'].$item['city'],
  119. $item['subscribe'] == 1? '关注':'未关注',
  120. ];
  121. $list[$index] = $item;
  122. }
  123. PHPExcelService::setExcelHeader(['名称','性别','地区','是否关注公众号'])
  124. ->setExcelTile('微信用户导出','微信用户导出'.time(),' 生成时间:'.date('Y-m-d H:i:s',time()))
  125. ->setExcelContent($export)
  126. ->ExcelSave();
  127. }
  128. return self::page($model,$where);
  129. }
  130. /**
  131. * 获取分销用户
  132. * @param array $where
  133. * @return array
  134. */
  135. public static function agentSystemPage($where = array(),$isall=false){
  136. self::setWechatUserOrder();//设置 一级推荐人 二级推荐人 一级推荐人订单 二级推荐人订单 佣金
  137. $model = new self;
  138. if($isall==false) {
  139. $status = (int)SystemConfigService::get('store_brokerage_statu');
  140. if ($status == 1) {
  141. if ($uids = User::where(['is_promoter' => 1])->column('uid')) {
  142. $model = $model->where('uid', 'in', implode(',', $uids));
  143. }
  144. }
  145. }
  146. // $model = $model->where('openid','NOT NULL');
  147. if($where['nickname'] !== '') $model = $model->where('nickname','LIKE',"%$where[nickname]%");
  148. if($where['data'] !== ''){
  149. list($startTime,$endTime) = explode(' - ',$where['data']);
  150. $model = $model->where('add_time','>',strtotime($startTime));
  151. $model = $model->where('add_time','<',strtotime($endTime));
  152. }
  153. if(isset($where['tagid_list']) && $where['tagid_list'] !== ''){
  154. $tagid_list = explode(',',$where['tagid_list']);
  155. foreach ($tagid_list as $v){
  156. $model = $model->where('tagid_list','LIKE',"%$v%");
  157. }
  158. }
  159. if(isset($where['groupid']) && $where['groupid'] !== '-1' ) $model = $model->where('groupid',"$where[groupid]");
  160. if(isset($where['sex']) && $where['sex'] !== '' ) $model = $model->where('sex',"$where[sex]");
  161. if(isset($where['subscribe']) && $where['subscribe'] !== '' ) $model = $model->where('subscribe',"$where[subscribe]");
  162. if(isset($where['stair']) && $where['stair'] != '') $model = $model->order($where['stair']);
  163. if(isset($where['second']) && $where['second'] != '') $model = $model->order($where['second']);
  164. if(isset($where['order_stair']) && $where['order_stair'] != '') $model = $model->order($where['order_stair']);
  165. if(isset($where['order_second']) && $where['order_second'] != '') $model = $model->order($where['order_second']);
  166. if(isset($where['now_money']) && $where['now_money'] != '') $model = $model->order($where['now_money']);
  167. $model = $model->order('uid desc');
  168. if(isset($where['export']) && $where['export'] == 1){
  169. $list = $model->select()->toArray();
  170. $export = [];
  171. foreach ($list as $index=>$item){
  172. $export[] = [
  173. $item['nickname'],
  174. $item['sex'],
  175. $item['country'].$item['province'].$item['city'],
  176. $item['stair'],
  177. $item['second'],
  178. $item['order_stair'],
  179. $item['order_second'],
  180. $item['now_money'],
  181. $item['subscribe'] == 1? '关注':'未关注',
  182. ];
  183. $list[$index] = $item;
  184. }
  185. PHPExcelService::setExcelHeader(['名称','性别','地区','一级推荐人','二级推荐人','一级推荐订单个数','二级推荐订单个数','获得佣金','是否关注公众号'])
  186. ->setExcelTile('微信用户导出','微信用户导出'.time(),' 生成时间:'.date('Y-m-d H:i:s',time()))
  187. ->setExcelContent($export)
  188. ->ExcelSave();
  189. }
  190. return self::page($model,function ($item){
  191. $item['qr_code'] = QrcodeService::getForeverQrcode('spread',$item['uid']);
  192. $item['extract_count_price'] = UserExtract::getUserCountPrice($item['uid']);//累计提现
  193. $item['extract_count_num'] = UserExtract::getUserCountNum($item['uid']);//提现次数
  194. },$where);
  195. }
  196. /**
  197. * 获取筛选后的所有用户uid
  198. * @param array $where
  199. * @return array
  200. */
  201. public static function getAll($where = array()){
  202. $model = new self;
  203. if($where['nickname'] !== '') $model = $model->where('nickname','LIKE',"%$where[nickname]%");
  204. if($where['data'] !== ''){
  205. list($startTime,$endTime) = explode(' - ',$where['data']);
  206. $model = $model->where('add_time','>',strtotime($startTime));
  207. $model = $model->where('add_time','<',strtotime($endTime));
  208. }
  209. if($where['tagid_list'] !== ''){
  210. $model = $model->where('tagid_list','LIKE',"%$where[tagid_list]%");
  211. }
  212. if($where['groupid'] !== '-1' ) $model = $model->where('groupid',"$where[groupid]");
  213. if($where['sex'] !== '' ) $model = $model->where('sex',"$where[sex]");
  214. return $model->column('uid','uid');
  215. }
  216. /**
  217. * 获取已关注的用户
  218. * @param $field
  219. */
  220. public static function getSubscribe($field){
  221. return self::where('subscribe',1)->column($field);
  222. }
  223. public static function getUserAll($field){
  224. return self::column($field);
  225. }
  226. public static function getUserTag()
  227. {
  228. $tagName = Config::get('system_wechat_tag');
  229. return Cache::tag($tagName)->remember('_wechat_tag',function () use($tagName){
  230. Cache::tag($tagName,['_wechat_tag']);
  231. $tag = WechatService::userTagService()->lists()->toArray()['tags']?:array();
  232. $list = [];
  233. foreach ($tag as $g){
  234. $list[$g['id']] = $g;
  235. }
  236. return $list;
  237. });
  238. }
  239. public static function clearUserTag()
  240. {
  241. Cache::rm('_wechat_tag');
  242. }
  243. public static function getUserGroup()
  244. {
  245. $tagName = Config::get('system_wechat_tag');
  246. return Cache::tag($tagName)->remember('_wechat_group',function () use($tagName){
  247. Cache::tag($tagName,['_wechat_group']);
  248. $tag = WechatService::userGroupService()->lists()->toArray()['groups']?:array();
  249. $list = [];
  250. foreach ($tag as $g){
  251. $list[$g['id']] = $g;
  252. }
  253. return $list;
  254. });
  255. }
  256. public static function clearUserGroup()
  257. {
  258. Cache::rm('_wechat_group');
  259. }
  260. /**
  261. * 获取推广人数
  262. * @param $uid //用户的uid
  263. * @param int $spread
  264. * $spread 0 一级推广人数 1 二级推广人数
  265. * @return int|string
  266. */
  267. public static function getUserSpreadUidCount($uid,$spread = 1){
  268. $userStair = User::where('spread_uid',$uid)->column('uid','uid');//获取一级推家人
  269. if($userStair){
  270. if(!$spread) return count($userStair);//返回一级推人人数
  271. else return User::where('spread_uid','IN',implode(',',$userStair))->count();//二级推荐人数
  272. }else return 0;
  273. }
  274. /**
  275. * 获取推广人的订单
  276. * @param $uid
  277. * @param int $spread
  278. * $spread 0 一级推广总订单 1 所有推广总订单
  279. * @return int|string
  280. */
  281. public static function getUserSpreadOrderCount($uid,$spread = 1){
  282. $userStair = User::where('spread_uid',$uid)->column('uid','uid');//获取一级推家人uid
  283. if($userStair){
  284. if(!$spread){
  285. return StoreOrder::where('uid','IN',implode(',',$userStair))->where('paid',1)->where('refund_status',0)->where('status',2)->count();//获取一级推广人订单数
  286. }
  287. else{
  288. $userSecond = User::where('spread_uid','IN',implode(',',$userStair))->column('uid','uid');//二级推广人的uid
  289. if($userSecond){
  290. return StoreOrder::where('uid','IN',implode(',',$userSecond))->where('paid',1)->where('refund_status',0)->where('status',2)->count();//获取二级推广人订单数
  291. }else return 0;
  292. }
  293. }else return 0;
  294. }
  295. /**
  296. * 同步微信用户表内的 一级推荐人 二级推荐人 一级推荐人订单 二级推荐人订单
  297. */
  298. public static function setWechatUserOrder(){
  299. $uidAll = self::column('uid','uid');
  300. $item = [];
  301. foreach ($uidAll as $k=>$v){
  302. $item['stair'] = self::getUserSpreadUidCount($v,0);//一级推荐人
  303. $item['second'] = self::getUserSpreadUidCount($v);//二级推荐人
  304. $item['order_stair'] = self::getUserSpreadOrderCount($v,0);//一级推荐人订单
  305. $item['order_second'] = self::getUserSpreadOrderCount($v);//二级推荐人订单
  306. $item['now_money'] = User::where('uid',$v)->value('now_money');//佣金
  307. if(!$item['stair'] && !$item['second'] && !$item['order_stair'] && !$item['order_second'] && !$item['now_money']) continue;
  308. else self::edit($item,$v);
  309. }
  310. }
  311. }