WechatUser.php 13 KB

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