User.php 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166
  1. <?php
  2. /**
  3. * @author: xaboy<365615158@qq.com>
  4. * @day: 2017/11/11
  5. */
  6. namespace app\admin\model\user;
  7. use app\admin\model\order\StoreOrder;
  8. use app\admin\model\system\SystemUserLevel;
  9. use crmeb\traits\ModelTrait;
  10. use crmeb\basic\BaseModel;
  11. use app\admin\model\wechat\WechatUser;
  12. use app\admin\model\store\StoreCouponUser;
  13. use crmeb\services\SystemConfigService;
  14. use crmeb\services\PHPExcelService;
  15. use think\facade\Db;
  16. /**
  17. * 用户管理 model
  18. * Class User
  19. * @package app\admin\model\user
  20. */
  21. class User extends BaseModel
  22. {
  23. /**
  24. * 数据表主键
  25. * @var string
  26. */
  27. protected $pk = 'uid';
  28. /**
  29. * 模型名称
  30. * @var string
  31. */
  32. protected $name = 'user';
  33. use ModelTrait;
  34. /*
  35. * 获取和提现金额
  36. * @param array $uid
  37. * @return float
  38. * */
  39. public static function getextractPrice($uid,$where=[])
  40. {
  41. if(is_array($uid)) {
  42. if (!count($uid)) return 0;
  43. }else
  44. $uid = [$uid];
  45. $brokerage= UserBill::getBrokerage($uid,'now_money','brokerage',$where);//获取总佣金
  46. $recharge = UserBill::getBrokerage($uid,'now_money','recharge',$where);//累计充值
  47. $extractTotalPrice = UserExtract::userExtractTotalPrice($uid,1,$where);//累计提现
  48. if($brokerage > $extractTotalPrice) {
  49. $orderYuePrice = self::getModelTime($where,StoreOrder::where('uid','in',$uid)->where(['is_del'=>0,'paid'=>1]))->sum('pay_price');//余额累计消费
  50. $systemAdd = UserBill::getBrokerage($uid,'now_money','system_add',$where);//后台添加余额
  51. $yueCount = bcadd($recharge,$systemAdd,2);// 后台添加余额 + 累计充值 = 非佣金的总金额
  52. $orderYuePrice = $yueCount > $orderYuePrice ? 0 : bcsub($orderYuePrice,$yueCount,2);// 余额累计消费(使用佣金消费的金额)
  53. $brokerage = bcsub($brokerage,$extractTotalPrice,2);//减去已提现金额
  54. $extract_price = UserExtract::userExtractTotalPrice($uid,0,$where);
  55. $brokerage = $extract_price < $brokerage ? bcsub($brokerage,$extract_price,2) : 0;//减去审核中的提现金额
  56. $brokerage = $brokerage > $orderYuePrice ? bcsub($brokerage,$orderYuePrice,2) : 0;//减掉余额支付
  57. }else{
  58. $brokerage=0;
  59. }
  60. $num = (float)bcsub($brokerage,$extractTotalPrice,2);
  61. return $num > 0 ? $num : 0;//可提现
  62. }
  63. /**
  64. * @param $where
  65. * @return array
  66. */
  67. public static function systemPage($where){
  68. $model = new self;
  69. if($where['status'] != '') $model = $model->where('status',$where['status']);
  70. if($where['is_promoter'] != '') $model = $model->where('is_promoter',$where['is_promoter']);
  71. if(isset($where['user_type']) && $where['user_type'] != '') $model = $model->where('user_type',$where['user_type']);
  72. if($where['nickname'] != '') $model = $model->where('nickname|uid','like',"%$where[nickname]%");
  73. $model = $model->order('uid desc');
  74. return self::page($model,function ($item){
  75. if($item['spread_uid']){
  76. $item['spread_uid_nickname'] = self::where('uid',$item['spread_uid'])->value('nickname');
  77. }else{
  78. $item['spread_uid_nickname'] = '无';
  79. }
  80. },$where);
  81. }
  82. /*
  83. * 设置搜索条件
  84. *
  85. */
  86. public static function setWhere($where)
  87. {
  88. if($where['order']!=''){
  89. $model=self::order(self::setOrder($where['order']));
  90. }else{
  91. $model=self::order('u.uid desc');
  92. }
  93. if($where['user_time_type'] == 'visitno' && $where['user_time'] != ''){
  94. list($startTime, $endTime) = explode(' - ', $where['user_time']);
  95. $endTime = strtotime($endTime)+24*3600;
  96. $model = $model->where("u.last_time < ".strtotime($startTime)." OR u.last_time > ".$endTime);
  97. }
  98. if($where['user_time_type'] == 'visit' && $where['user_time'] != ''){
  99. list($startTime, $endTime) = explode(' - ', $where['user_time']);
  100. $model = $model->where('u.last_time', '>', strtotime($startTime));
  101. $model = $model->where('u.last_time', '<', strtotime($endTime)+24*3600);
  102. }
  103. if($where['user_time_type'] == 'add_time' && $where['user_time'] != ''){
  104. list($startTime, $endTime) = explode(' - ', $where['user_time']);
  105. $model = $model->where('u.add_time', '>', strtotime($startTime));
  106. $model = $model->where('u.add_time', '<', strtotime($endTime)+24*3600);
  107. }
  108. if($where['pay_count'] !== '') {
  109. if($where['pay_count'] == '-1') $model = $model->where('pay_count',0);
  110. else $model = $model->where('pay_count','>',$where['pay_count']);
  111. }
  112. if($where['user_type'] != ''){
  113. if($where['user_type'] == 'routine') $model = $model->where('w.routine_openid','not null');
  114. else if($where['user_type'] == 'wechat') $model = $model->where('w.openid','not null');
  115. else $model = $model->where('u.user_type',$where['user_type']);
  116. }
  117. if($where['country'] != ''){
  118. if($where['country'] == 'domestic') $model = $model->where('w.country','中国');
  119. else if($where['country'] == 'abroad') $model = $model->where('w.country','<>','中国');
  120. }
  121. return $model;
  122. }
  123. /**
  124. * 异步获取当前用户 信息
  125. * @param $where
  126. * @return array
  127. */
  128. public static function getUserList($where){
  129. $model = self::setWherePage(self::setWhere($where),$where,['w.sex','w.province','w.city','u.status','u.is_promoter'],['u.nickname','u.uid','u.phone']);
  130. $list = $model->alias('u')
  131. ->join('WechatUser w','u.uid=w.uid')
  132. ->field('u.*,w.country,w.province,w.city,w.sex,w.unionid,w.openid,w.routine_openid,w.groupid,w.tagid_list,w.subscribe,w.subscribe_time')
  133. ->page((int)$where['page'],(int)$where['limit'])
  134. ->select()
  135. ->each(function ($item){
  136. $item['add_time']=date('Y-m-d H:i:s',$item['add_time']);
  137. if($item['last_time']) $item['last_time'] = date('Y-m-d H:i:s',$item['last_time']);//最近一次访问日期
  138. else $item['last_time'] = '无访问';//最近一次访问日期
  139. self::edit(['pay_count'=>StoreOrder::getUserCountPay($item['uid'])],$item['uid']);
  140. $item['extract_count_price'] = UserExtract::getUserCountPrice($item['uid']);//累计提现
  141. if($item['spread_uid']){
  142. $item['spread_uid_nickname'] = self::where('uid',$item['spread_uid'])->value('nickname').'/'.$item['spread_uid'];
  143. }else{
  144. $item['spread_uid_nickname'] = '无';
  145. }
  146. if($item['openid'] != '' && $item['routine_openid'] != ''){
  147. $item['user_type']='通用';
  148. }else if($item['openid'] == '' && $item['routine_openid'] != ''){
  149. $item['user_type']='小程序';
  150. }else if($item['openid'] != '' && $item['routine_openid'] == ''){
  151. $item['user_type']='公众号';
  152. }else if($item['user_type'] == 'h5') {
  153. $item['user_type'] = 'H5';
  154. }else $item['user_type']='其他';
  155. if($item['sex'] == 1){
  156. $item['sex']='男';
  157. }else if($item['sex'] == 2){
  158. $item['sex']='女';
  159. }else $item['sex']='保密';
  160. $item['vip_name']=false;
  161. $levelinfo=UserLevel::where('uid', $item['uid'])->where('is_del', 0)->order('grade desc')->field('level_id,is_forever,valid_time')->find();
  162. if($levelinfo){
  163. if($levelinfo['is_forever']) $item['vip_name']=SystemUserLevel::where('id',$levelinfo['level_id'])->value('name');
  164. else if(time() > $levelinfo['valid_time']) $item['vip_name']=SystemUserLevel::where('id',$levelinfo['level_id'])->value('name');
  165. }
  166. });//->toArray();
  167. $count=self::setWherePage(self::setWhere($where),$where,['w.sex','w.province','w.city','u.status','u.is_promoter'],['u.nickname','u.uid'])->alias('u')->join('WechatUser w','u.uid=w.uid')->count();
  168. return ['count'=>$count,'data'=>$list];
  169. }
  170. /**
  171. * 修改用户状态
  172. * @param $uids 用户uid
  173. * @param $status 修改状态
  174. * @return array
  175. */
  176. public static function destrSyatus($uids,$status){
  177. if(empty($uids) && !is_array($uids)) return false;
  178. if($status=='') return false;
  179. self::beginTrans();
  180. try{
  181. $res=self::where('uid','in',$uids)->update(['status'=>$status]);
  182. self::checkTrans($res);
  183. return true;
  184. }catch (\Exception $e){
  185. self::rollbackTrans();
  186. return Json::fail($e->getMessage());
  187. }
  188. }
  189. /*
  190. * 获取某季度,某年某年后的时间戳
  191. *
  192. * self::getMonth('n',1) 获取当前季度的上个季度的时间戳
  193. * self::getMonth('n') 获取当前季度的时间戳
  194. */
  195. public static function getMonth($time='',$ceil=0){
  196. if(empty($time)){
  197. $firstday = date("Y-m-01",time());
  198. $lastday = date("Y-m-d",strtotime("$firstday +1 month -1 day"));
  199. }else if($time=='n'){
  200. if($ceil!=0)
  201. $season = ceil(date('n') /3)-$ceil;
  202. else
  203. $season = ceil(date('n') /3);
  204. $firstday=date('Y-m-01',mktime(0,0,0,($season - 1) *3 +1,1,date('Y')));
  205. $lastday=date('Y-m-t',mktime(0,0,0,$season * 3,1,date('Y')));
  206. }else if($time=='y'){
  207. $firstday=date('Y-01-01');
  208. $lastday=date('Y-12-31');
  209. }else if($time=='h'){
  210. $firstday = date('Y-m-d', strtotime('this week +'.$ceil.' day')) . ' 00:00:00';
  211. $lastday = date('Y-m-d', strtotime('this week +'.($ceil+1).' day')) . ' 23:59:59';
  212. }
  213. return array($firstday,$lastday);
  214. }
  215. public static function getcount(){
  216. return self::count();
  217. }
  218. /*
  219. *获取用户某个时间段的消费信息
  220. *
  221. * reutrn Array || number
  222. */
  223. public static function consume($where,$status='',$keep=''){
  224. $model = new self;
  225. $user_id=[];
  226. if(is_array($where)){
  227. if($where['is_promoter']!='') $model=$model->where('is_promoter',$where['is_promoter']);
  228. if($where['status']!='') $model=$model->where('status',$where['status']);
  229. switch ($where['date']){
  230. case null:case 'today':case 'week':case 'year':
  231. if($where['date']==null){
  232. $where['date']='month';
  233. }
  234. if($keep){
  235. $model=$model->whereTime('add_time',$where['date'])->whereTime('last_time',$where['date']);
  236. }else{
  237. $model=$model->whereTime('add_time',$where['date']);
  238. }
  239. break;
  240. case 'quarter':
  241. $quarter=self::getMonth('n');
  242. $startTime=strtotime($quarter[0]);
  243. $endTime=strtotime($quarter[1]);
  244. if($keep){
  245. $model = $model->where('add_time','>',$startTime)->where('add_time','<',$endTime)->where('last_time','>',$startTime)->where('last_time','<',$endTime);
  246. }else{
  247. $model = $model->where('add_time','>',$startTime)->where('add_time','<',$endTime);
  248. }
  249. break;
  250. default:
  251. //自定义时间
  252. if(strstr($where['date'],'-')!==FALSE){
  253. list($startTime,$endTime)=explode('-',$where['date']);
  254. $model = $model->where('add_time','>',strtotime($startTime))->where('add_time','<',bcadd(strtotime($endTime),86400,0));
  255. }else{
  256. $model=$model->whereTime('add_time','month');
  257. }
  258. break;
  259. }
  260. }else{
  261. if(is_array($status)){
  262. $model=$model->where('add_time','>',$status[0])->where('add_time','<',$status[1]);
  263. }
  264. }
  265. if($keep===true){
  266. return $model->count();
  267. }
  268. if($status==='default'){
  269. return $model->group('from_unixtime(add_time,\'%Y-%m-%d\')')->field('count(uid) num,from_unixtime(add_time,\'%Y-%m-%d\') add_time,uid')->select()->toArray();
  270. }
  271. if($status==='grouping'){
  272. return $model->group('user_type')->field('user_type')->select()->toArray();
  273. }
  274. $uid=$model->field('uid')->select()->toArray();
  275. foreach ($uid as $val){
  276. $user_id[]=$val['uid'];
  277. }
  278. if(empty($user_id)){
  279. $user_id=[0];
  280. }
  281. if($status==='xiaofei'){
  282. $list=UserBill::where('uid','in',$user_id)
  283. ->group('type')
  284. ->field('sum(number) as top_number,title')
  285. ->select()
  286. ->toArray();
  287. $series=[
  288. 'name'=>isset($list[0]['title'])?$list[0]['title']:'',
  289. 'type'=>'pie',
  290. 'radius'=> ['40%', '50%'],
  291. 'data'=>[]
  292. ];
  293. foreach($list as $key=>$val){
  294. $series['data'][$key]['value']=$val['top_number'];
  295. $series['data'][$key]['name']=$val['title'];
  296. }
  297. return $series;
  298. }else if($status==='form'){
  299. $list=WechatUser::where('uid','in',$user_id)->group('city')->field('count(city) as top_city,city')->limit(0,10)->select()->toArray();
  300. $count=self::getcount();
  301. $option=[
  302. 'legend_date'=>[],
  303. 'series_date'=>[]
  304. ];
  305. foreach($list as $key=>$val){
  306. $num=$count!=0?(bcdiv($val['top_city'],$count,2))*100:0;
  307. $t=['name'=>$num.'% '.(empty($val['city'])?'未知':$val['city']),'icon'=>'circle'];
  308. $option['legend_date'][$key]=$t;
  309. $option['series_date'][$key]=['value'=>$num,'name'=>$t['name']];
  310. }
  311. return $option;
  312. }else{
  313. $number=UserBill::where('uid','in',$user_id)->where('type','pay_product')->sum('number');
  314. return $number;
  315. }
  316. }
  317. /*
  318. * 获取 用户某个时间段的钱数或者TOP20排行
  319. *
  320. * return Array || number
  321. */
  322. public static function getUserSpend($date,$status=''){
  323. $model=new self();
  324. $model=$model->alias('A');
  325. switch ($date){
  326. case null:case 'today':case 'week':case 'year':
  327. if($date==null) $date='month';
  328. $model=$model->whereTime('A.add_time',$date);
  329. break;
  330. case 'quarter':
  331. list($startTime,$endTime)=User::getMonth('n');
  332. $model = $model->where('A.add_time','>',strtotime($startTime));
  333. $model = $model->where('A.add_time','<',bcadd(strtotime($endTime),86400,0));
  334. break;
  335. default:
  336. list($startTime,$endTime)=explode('-',$date);
  337. $model = $model->where('A.add_time','>',strtotime($startTime));
  338. $model = $model->where('A.add_time','<',bcadd(strtotime($endTime),86400,0));
  339. break;
  340. }
  341. if($status===true){
  342. return $model->join('user_bill B','B.uid=A.uid')->where('B.type','pay_product')->where('B.pm',0)->sum('B.number');
  343. }
  344. $list=$model->join('user_bill B','B.uid=A.uid')
  345. ->where('B.type','pay_product')
  346. ->where('B.pm',0)
  347. ->field('sum(B.number) as totel_number,A.nickname,A.avatar,A.now_money,A.uid,A.add_time')
  348. ->order('totel_number desc')
  349. ->limit(0,20)
  350. ->select()
  351. ->toArray();
  352. if(!isset($list[0]['totel_number'])){
  353. $list=[];
  354. }
  355. return $list;
  356. }
  357. /*
  358. * 获取 相对于上月或者其他的数据
  359. *
  360. * return Array
  361. */
  362. public static function getPostNumber($date,$status=false,$field='A.add_time',$t='消费'){
  363. $model=new self();
  364. if(!$status) $model=$model->alias('A');
  365. switch ($date){
  366. case null:case 'today':case 'week':case 'year':
  367. if($date==null) {
  368. $date='last month';
  369. $title='相比上月用户'.$t.'增长';
  370. }
  371. if($date=='today') {
  372. $date='yesterday';
  373. $title='相比昨天用户'.$t.'增长';
  374. }
  375. if($date=='week') {
  376. $date='last week';
  377. $title='相比上周用户'.$t.'增长';
  378. }
  379. if($date=='year') {
  380. $date='last year';
  381. $title='相比去年用户'.$t.'增长';
  382. }
  383. $model=$model->whereTime($field,$date);
  384. break;
  385. case 'quarter':
  386. $title='相比上季度用户'.$t.'增长';
  387. list($startTime,$endTime)=User::getMonth('n',1);
  388. $model = $model->where($field,'>',$startTime);
  389. $model = $model->where($field,'<',$endTime);
  390. break;
  391. default:
  392. list($startTime,$endTime)=explode('-',$date);
  393. $title='相比'.$startTime.'-'.$endTime.'时间段用户'.$t.'增长';
  394. $Time=strtotime($endTime)-strtotime($startTime);
  395. $model = $model->where($field,'>',strtotime($startTime)+$Time);
  396. $model = $model->where($field,'<',strtotime($endTime)+$Time);
  397. break;
  398. }
  399. if($status){
  400. return [$model->count(),$title];
  401. }
  402. $number=$model->join('user_bill B','B.uid=A.uid')->where('B.type','pay_product')->where('B.pm',0)->sum('B.number');
  403. return [$number,$title];
  404. }
  405. //获取用户新增,头部信息
  406. public static function getBadgeList($where){
  407. $user_count = self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status'])->count();
  408. $user_count_old = self::getOldDate($where)->count();
  409. $store_brokerage_statu = SystemConfigService::get('store_brokerage_statu');
  410. if($store_brokerage_statu == 1)
  411. $fenxiao = self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status'])->where('spread_uid','<>',0)->count();
  412. else
  413. $fenxiao = self::count();
  414. $fenxiao_count = self::getOldDate($where)->where('spread_uid','<>',0)->count();
  415. $newFemxiao_count = bcsub($fenxiao,$fenxiao_count,0);
  416. $order_count = bcsub($user_count,$user_count_old,0);
  417. return [
  418. [
  419. 'name'=>'会员人数',
  420. 'field'=>'个',
  421. 'count'=>$user_count,
  422. 'content'=>'会员总人数',
  423. 'background_color'=>'layui-bg-blue',
  424. 'sum'=>self::count(),
  425. 'class'=>'fa fa-bar-chart',
  426. ],
  427. [
  428. 'name'=>'会员增长',
  429. 'field'=>'个',
  430. 'count'=>$order_count,
  431. 'content'=>'会员增长率',
  432. 'background_color'=>'layui-bg-cyan',
  433. 'sum'=>$user_count_old ? bcdiv($order_count,$user_count_old,2)*100:0,
  434. 'class'=>'fa fa-line-chart',
  435. ],
  436. [
  437. 'name'=>'分销人数',
  438. 'field'=>'个',
  439. 'count'=>$fenxiao,
  440. 'content'=>'分销总人数',
  441. 'background_color'=>'layui-bg-green',
  442. 'sum'=>$store_brokerage_statu == 1 ? self::where('spread_uid','<>',0)->count() : $fenxiao,
  443. 'class'=>'fa fa-bar-chart',
  444. ],
  445. [
  446. 'name'=>'分销增长',
  447. 'field'=>'个',
  448. 'count'=>$newFemxiao_count,
  449. 'content'=>'分销总人数',
  450. 'background_color'=>'layui-bg-orange',
  451. 'sum'=>$fenxiao_count ? bcdiv($newFemxiao_count,$fenxiao_count,2)*100:0,
  452. 'class'=>'fa fa-cube',
  453. ],
  454. ];
  455. }
  456. /*
  457. * 获取会员增长曲线图和分布图
  458. * $where 查询条件
  459. * $limit 显示条数,是否有滚动条
  460. */
  461. public static function getUserChartList($where,$limit=20){
  462. $list = self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter','status'])
  463. ->where('add_time','<>',0)
  464. ->field('FROM_UNIXTIME(add_time,"%Y-%m-%d") as _add_time,count(uid) as num')
  465. ->order('_add_time asc')
  466. ->group('_add_time')
  467. ->select();
  468. count($list) && $list = $list->toArray();
  469. $seriesdata = [];
  470. $xdata = [];
  471. $Zoom = '';
  472. foreach ($list as $item){
  473. $seriesdata[] = $item['num'];
  474. $xdata[] = $item['_add_time'];
  475. }
  476. (count($xdata) > $limit) && $Zoom = $xdata[$limit-5];
  477. //多次购物会员数量饼状图
  478. $count = self::setWherePage(self::getModelTime($where,new self),$where,['is_promoter'])->count();
  479. $user_count = self::setWherePage(self::getModelTime($where,self::alias('a')->join('__store_order__ r','r.uid=a.uid'),'a.add_time'),$where,['is_promoter'])
  480. ->where('r.paid',1)->count('a.uid');
  481. $shop_xdata = ['多次购买数量占比','无购买数量占比'];
  482. $shop_data = [];
  483. $count >0 && $shop_data = [
  484. [
  485. 'value'=>bcdiv($user_count,$count,2)*100,
  486. 'name'=>$shop_xdata[0],
  487. 'itemStyle'=>[
  488. 'color'=>'#D789FF',
  489. ]
  490. ],
  491. [
  492. 'value'=>bcdiv($count-$user_count,$count,2)*100,
  493. 'name'=>$shop_xdata[1],
  494. 'itemStyle'=>[
  495. 'color'=>'#7EF0FB',
  496. ]
  497. ]
  498. ];
  499. return compact('shop_data','shop_xdata','seriesdata','Zoom');
  500. }
  501. //获取$date的前一天或者其他的时间段
  502. public static function getOldDate($where,$moedls=null){
  503. $model=$moedls ===null ? self::setWherePage(new self(),$where,['is_promoter','status']) :$moedls;
  504. switch ($where['data']){
  505. case 'today':
  506. $model=$model->whereTime('add_time','yesterday');
  507. break;
  508. case 'week':
  509. $model=$model->whereTime('add_time','last week');
  510. break;
  511. case 'month':
  512. $model=$model->whereTime('add_time','last month');
  513. break;
  514. case 'year':
  515. $model=$model->whereTime('add_time','last year');
  516. break;
  517. case 'quarter':
  518. $time=self::getMonth('n',1);
  519. $model=$model->where('add_time','between',$time);
  520. break;
  521. }
  522. return $model;
  523. }
  524. //获取用户属性和性别分布图
  525. public static function getEchartsData($where){
  526. $model=self::alias('a');
  527. $data=self::getModelTime($where,$model,'a.add_time')
  528. ->join('wechat_user r','r.uid=a.uid')
  529. ->group('r.province')
  530. ->field('count(r.province) as count,province')
  531. ->order('count desc')
  532. ->limit(15)
  533. ->select();
  534. if(count($data)) $data=$data->toArray();
  535. $legdata=[];
  536. $dataList=[];
  537. foreach ($data as $value){
  538. $value['province']=='' && $value['province']='未知省份';
  539. $legdata[]=$value['province'];
  540. $dataList[]=$value['count'];
  541. }
  542. $model=self::alias('a');
  543. $sex=self::getModelTime($where,$model,'a.add_time')
  544. ->join('wechat_user r','r.uid=a.uid')
  545. ->group('r.sex')
  546. ->field('count(r.uid) as count,sex')
  547. ->order('count desc')
  548. ->select();
  549. if(count($sex)) $sex=$sex->toArray();
  550. $sexlegdata=['男','女','未知'];
  551. $sexcount=self::getModelTime($where,new self())->count();
  552. $sexList=[];
  553. $color=['#FB7773','#81BCFE','#91F3FE'];
  554. foreach ($sex as $key=>$item){
  555. if($item['sex']==1){
  556. $item_date['name']='男';
  557. }else if($item['sex']==2){
  558. $item_date['name']='女';
  559. }else{
  560. $item_date['name']='未知性别';
  561. }
  562. $item_date['value']=bcdiv($item['count'],$sexcount,2)*100;
  563. $item_date['itemStyle']['color']=$color[$key];
  564. $sexList[]=$item_date;
  565. }
  566. return compact('sexList','sexlegdata','legdata','dataList');
  567. }
  568. //获取佣金记录列表
  569. public static function getCommissionList($where){
  570. $model = self::setCommissionWhere($where);
  571. if($where['excel'])
  572. $list = $model->select();
  573. else
  574. $list = $model->page((int)$where['page'],(int)$where['limit'])->select();
  575. count($list) && $list=$list->toArray();
  576. $export=[];
  577. foreach ($list as &$value){
  578. $value['ex_price']= Db::name('user_extract')->where('uid', $value['uid'])->sum('extract_price');
  579. $value['extract_price']= Db::name('user_extract')->where('uid',$value['uid'])->where('status', 1)->sum('extract_price');
  580. $cashPrice = Db::name('user_extract')->where('uid',$value['uid'])->where('status', 0)->sum('extract_price');
  581. $value['money'] = bcsub($value['ex_price'],$value['extract_price'],2);
  582. $value['money'] = bcsub($value['money'],$cashPrice,2);
  583. $export[]=[
  584. $value['nickname'],
  585. $value['sum_number'],
  586. $value['now_money'],
  587. $value['brokerage_price'],
  588. $value['extract_price'],
  589. ];
  590. }
  591. if($where['excel']){
  592. PHPExcelService::setExcelHeader(['昵称/姓名','总佣金金额','账户余额','账户佣金','提现到账佣金'])
  593. ->setExcelTile('拥金记录','拥金记录'.time(),' 生成时间:'.date('Y-m-d H:i:s',time()))
  594. ->setExcelContent($export)
  595. ->ExcelSave();
  596. }
  597. $count=self::setCommissionWhere($where)->count();
  598. return ['data'=>$list,'count'=>$count];
  599. }
  600. //获取佣金记录列表的查询条件
  601. public static function setCommissionWhere($where){
  602. $models=self::setWherePage(self::alias('A'),$where,[],['A.nickname','A.uid'])
  603. ->join('user_bill B','B.uid=A.uid')
  604. ->group('A.uid')
  605. ->where('B.type', 'brokerage')
  606. ->where('B.category', 'now_money')
  607. ->field('sum(B.number) as sum_number,A.nickname,A.uid,A.now_money,A.brokerage_price');
  608. if($where['order']==''){
  609. $models=$models->order('sum_number desc');
  610. }else{
  611. $models=$models->order($where['order']==1 ? 'sum_number desc':'sum_number asc');
  612. }
  613. if($where['price_max']!='' && $where['price_min']!=''){
  614. $models=$models->where('now_money','between',[$where['price_max'],$where['price_min']]);
  615. }
  616. return $models;
  617. }
  618. /**获取用户详细信息
  619. * @param $uid
  620. * @return array
  621. */
  622. public static function getUserInfos($uid)
  623. {
  624. $userInfo = self::where('uid',$uid)->find();
  625. if(!$userInfo) exception('读取用户信息失败!');
  626. return $userInfo->toArray();
  627. }
  628. //获取某人用户推广信息
  629. public static function getUserinfo($uid){
  630. $userinfo=self::where('uid', $uid)->field('nickname,spread_uid,now_money,add_time')->find()->toArray();
  631. $userinfo['number'] = (float)UserBill::where('category', 'now_money')->where('uid', $uid)->where('type', 'brokerage')->sum('number');
  632. $userinfo['spread_name'] = $userinfo['spread_uid'] ? self::where('uid', $userinfo['spread_uid'])->value('nickname') :'';
  633. return $userinfo;
  634. }
  635. //获取某用户的详细信息
  636. public static function getUserDetailed($uid){
  637. $key_field=['real_name','phone','province','city','district','detail','post_code'];
  638. $Address=($thisAddress= Db::name('user_address')->where('uid', $uid)->where('is_default', 1)->field($key_field)->find()) ?
  639. $thisAddress :
  640. Db::name('user_address')->where('uid', $uid)->field($key_field)->find();
  641. $UserInfo=self::get($uid);
  642. return [
  643. ['col'=>12,'name'=>'默认收货地址','value'=>$thisAddress ? '收货人:'.$thisAddress['real_name'].'邮编:'.$thisAddress['post_code'].' 收货人电话:'.$thisAddress['phone'].' 地址:'.$thisAddress['province'].' '.$thisAddress['city'].' '.$thisAddress['district'].' '.$thisAddress['detail'] : ''],
  644. // ['name'=>'微信OpenID','value'=>WechatUser::where('uid', $uid)->value('openid'),'col'=>8],
  645. ['name'=>'手机号码','value'=>$UserInfo['phone']],
  646. // ['name'=>'ID','value'=>$uid],
  647. ['name'=>'姓名','value'=>''],
  648. ['name'=>'微信昵称','value'=>$UserInfo['nickname']],
  649. ['name'=>'邮箱','value'=>''],
  650. ['name'=>'生日','value'=>''],
  651. ['name'=>'积分','value'=>$UserInfo['integral']],
  652. ['name'=>'上级推广人','value'=>$UserInfo['spread_uid'] ? self::where('uid', $UserInfo['spread_uid'])->value('nickname'):''],
  653. ['name'=>'账户余额','value'=>$UserInfo['now_money']],
  654. ['name'=>'佣金总收入','value'=>UserBill::where('category','now_money')->where('type', 'brokerage')->where('uid', $uid)->sum('number')],
  655. ['name'=>'提现总金额','value'=> Db::name('user_extract')->where('uid', $uid)->where('status', 1)->sum('extract_price')],
  656. ];
  657. }
  658. //获取某用户的订单个数,消费明细
  659. public static function getHeaderList($uid){
  660. return [
  661. [
  662. 'title'=>'总计订单',
  663. 'value'=>StoreOrder::where('uid',$uid)->count(),
  664. 'key'=>'笔',
  665. 'class'=>'',
  666. ],
  667. [
  668. 'title'=>'总消费金额',
  669. 'value'=>StoreOrder::where('uid',$uid)->where('paid', 1)->sum('total_price'),
  670. 'key'=>'元',
  671. 'class'=>'',
  672. ],
  673. [
  674. 'title'=>'本月订单',
  675. 'value'=>StoreOrder::where('uid',$uid)->whereTime('add_time','month')->count(),
  676. 'key'=>'笔',
  677. 'class'=>'',
  678. ],
  679. [
  680. 'title'=>'本月消费金额',
  681. 'value'=>StoreOrder::where('uid',$uid)->where('paid',1)->whereTime('add_time','month')->sum('total_price'),
  682. 'key'=>'元',
  683. 'class'=>'',
  684. ]
  685. ];
  686. }
  687. /*
  688. * 获取 会员 订单个数,积分明细,优惠劵明细
  689. *
  690. * $uid 用户id;
  691. *
  692. * return array
  693. */
  694. public static function getCountInfo($uid){
  695. $order_count=StoreOrder::where('uid',$uid)->count();
  696. $integral_count=UserBill::where('uid', $uid)->where('category', 'integral')->where('type','in','deduction,system_add')->count();
  697. $sign_count=UserBill::where('type', 'sign')->where('uid', $uid)->where('category', 'integral')->count();
  698. $balanceChang_count=UserBill::where('category', 'now_money')->where('uid', $uid)
  699. ->where('type','in','system_add,pay_product,extract,pay_product_refund,system_sub')
  700. ->count();
  701. $coupon_count=StoreCouponUser::where('uid', $uid)->count();
  702. $spread_count=self::where('spread_uid', $uid)->count();
  703. return compact('order_count','integral_count','sign_count','balanceChang_count','coupon_count','spread_count');
  704. }
  705. /*
  706. * 获取 会员业务的
  707. * 购物会员统计
  708. * 会员访问量
  709. *
  710. * 曲线图
  711. *
  712. * $where 查询条件
  713. *
  714. * return array
  715. */
  716. public static function getUserBusinessChart($where,$limit=20){
  717. //获取购物会员人数趋势图
  718. $list=self::getModelTime($where,self::where('a.status',1)->alias('a')->join('__store_order__ r','r.uid=a.uid'),'a.add_time')
  719. ->where('r.paid', 1)
  720. ->where('a.is_promoter', 0)
  721. ->where('a.add_time','<>',0)
  722. ->field('FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as _add_time,count(r.uid) as count_user')
  723. ->group('_add_time')
  724. ->order('_add_time asc')
  725. ->select();
  726. count($list) && $list=$list->toArray();
  727. $seriesdata=[];
  728. $xdata=[];
  729. $zoom='';
  730. foreach ($list as $item){
  731. $seriesdata[]=$item['count_user'];
  732. $xdata[]=$item['_add_time'];
  733. }
  734. count($xdata) > $limit && $zoom=$xdata[$limit-5];
  735. //会员访问量
  736. $visit=self::getModelTime($where,self::alias('a')->join('__store_visit__ t','t.uid=a.uid'),'t.add_time')
  737. ->where('a.is_promoter',0)
  738. ->field('FROM_UNIXTIME(t.add_time,"%Y-%m-%d") as _add_time,count(t.uid) as count_user')
  739. ->group('_add_time')
  740. ->order('_add_time asc')
  741. ->select();
  742. count($visit) && $visit=$visit->toArray();
  743. $visit_data=[];
  744. $visit_xdata=[];
  745. $visit_zoom='';
  746. foreach ($visit as $item){
  747. $visit_data[]=$item['count_user'];
  748. $visit_xdata[]=$item['_add_time'];
  749. }
  750. count($visit_xdata) > $limit && $visit_zoom=$visit_xdata[$limit-5];
  751. //多次购物会员数量饼状图
  752. $count=self::getModelTime($where,self::where('is_promoter',0))->count();
  753. $user_count=self::getModelTime($where,self::alias('a')->join('__store_order__ r','r.uid=a.uid'),'a.add_time')
  754. ->where('a.is_promoter',0)
  755. ->where('r.paid',1)
  756. ->group('a.uid')
  757. ->count();
  758. $shop_xdata=['多次购买数量占比','无购买数量占比'];
  759. $shop_data=[];
  760. $count >0 && $shop_data=[
  761. [
  762. 'value'=>bcdiv($user_count,$count,2)*100,
  763. 'name'=>$shop_xdata[0],
  764. 'itemStyle'=>[
  765. 'color'=>'#D789FF',
  766. ]
  767. ],
  768. [
  769. 'value'=>bcdiv($count-$user_count,$count,2)*100,
  770. 'name'=>$shop_xdata[1],
  771. 'itemStyle'=>[
  772. 'color'=>'#7EF0FB',
  773. ]
  774. ]
  775. ];
  776. return compact('seriesdata','xdata','zoom','visit_data','visit_xdata','visit_zoom','shop_data','shop_xdata');
  777. }
  778. /*
  779. * 获取用户
  780. * 积分排行
  781. * 会员余额排行榜
  782. * 分销商佣金总额排行榜
  783. * 购物笔数排行榜
  784. * 购物金额排行榜
  785. * 分销商佣金提现排行榜
  786. * 上月消费排行榜
  787. * $limit 查询多少条
  788. * return array
  789. */
  790. public static function getUserTop10List($limit=10,$is_promoter=0){
  791. //积分排行
  792. $integral=self::where('status',1)
  793. ->where('is_promoter',$is_promoter)
  794. ->order('integral desc')
  795. ->field('nickname,phone,integral,FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time')
  796. ->limit($limit)
  797. ->select();
  798. count($integral) && $integral=$integral->toArray();
  799. //会员余额排行榜
  800. $now_money=self::where('status',1)
  801. ->where('is_promoter',$is_promoter)
  802. ->order('now_money desc')
  803. ->field('nickname,phone,now_money,FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time')
  804. ->limit($limit)
  805. ->select();
  806. count($now_money) && $now_money=$now_money->toArray();
  807. //购物笔数排行榜
  808. $orderPayCount = StoreOrder::getOrderPayCount($is_promoter);
  809. if($orderPayCount){
  810. $shopcount=self::alias('a')
  811. ->join('__store_order__ r','r.uid=a.uid')
  812. ->where('r.paid', 1)
  813. ->where('a.is_promoter', $is_promoter)
  814. ->group('r.uid')
  815. ->field('a.nickname,a.phone,count(r.uid) as sum_count,FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time')
  816. ->order('sum_count desc')
  817. ->limit($limit)
  818. ->select();
  819. }else $shopcount = [];
  820. count($shopcount) && $shopcount=$shopcount->toArray();
  821. //购物金额排行榜
  822. if($orderPayCount){
  823. $order=self::alias('a')
  824. ->join('__store_order__ r','r.uid=a.uid')
  825. ->where('r.paid', 1)
  826. ->where('a.is_promoter', $is_promoter)
  827. ->group('r.uid')
  828. ->field('a.nickname,a.phone,sum(r.pay_price) as sum_price,FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time,r.uid')
  829. ->order('sum_price desc')
  830. ->limit($limit)
  831. ->select();
  832. }else $order = [];
  833. count($order) && $order=$order->toArray();
  834. //上月消费排行
  835. $orderPayCount = StoreOrder::getOrderPayMonthCount($is_promoter);
  836. if($orderPayCount){
  837. $lastorder=self::alias('a')
  838. ->join('__store_order__ r','r.uid=a.uid')
  839. ->where('r.paid', 1)
  840. ->where('a.is_promoter', $is_promoter)
  841. // ->whereTime('r.pay_time','last month')
  842. ->where('r.pay_time','between',[strtotime(date('Y-m',strtotime('-1 month'))),strtotime(date('Y-m'))])
  843. ->group('r.uid')
  844. ->field('a.nickname,a.phone,sum(r.pay_price) as sum_price,FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time,r.uid')
  845. ->order('sum_price desc')
  846. ->limit($limit)
  847. ->select();
  848. }else $lastorder = [];
  849. count($lastorder) && $lastorder=$lastorder->toArray();
  850. return compact('integral','now_money','shopcount','order','lastorder');
  851. }
  852. /*
  853. * 获取 会员业务
  854. * 会员总余额 会员总积分
  855. * $where 查询条件
  856. *
  857. * return array
  858. */
  859. public static function getUserBusinesHeade($where){
  860. return [
  861. [
  862. 'name'=>'会员总余额',
  863. 'field'=>'元',
  864. 'count'=>self::getModelTime($where,self::where('status',1))->sum('now_money'),
  865. 'background_color'=>'layui-bg-cyan',
  866. 'col'=>6,
  867. ],
  868. [
  869. 'name'=>'会员总积分',
  870. 'field'=>'分',
  871. 'count'=>self::getModelTime($where,self::where('status',1))->sum('integral'),
  872. 'background_color'=>'layui-bg-cyan',
  873. 'col'=>6
  874. ]
  875. ];
  876. }
  877. /*
  878. * 分销会员头部信息查询获取
  879. *
  880. * 分销商总佣金余额
  881. * 分销商总提现佣金
  882. * 本月分销商业务佣金
  883. * 本月分销商佣金提现金额
  884. * 上月分销商业务佣金
  885. * 上月分销商佣金提现金额
  886. * $where array 时间条件
  887. *
  888. * return array
  889. */
  890. public static function getDistributionBadgeList($where){
  891. $timeList = [
  892. 'today'=>implode(' - ',[date('Y/m/d'),date('Y/m/d',strtotime('+1 day'))]),
  893. 'week'=>implode(' - ',[
  894. date('Y/m/d', (time() - ((date('w') == 0 ? 7 : date('w')) - 1) * 24 * 3600)),
  895. date('Y-m-d', (time() + (7 - (date('w') == 0 ? 7 : date('w'))) * 24 * 3600))
  896. ]),
  897. 'month'=>implode(' - ',[date('Y/m').'/01',date('Y/m').'/'.date('t')]),
  898. 'quarter'=>implode(' - ',[
  899. date('Y').'/'.(ceil((date('n'))/3)*3-3+1).'/01',
  900. date('Y').'/'.(ceil((date('n'))/3)*3).'/'.date('t',mktime(0,0,0,(ceil((date('n'))/3)*3),1,date('Y')))
  901. ]),
  902. 'year'=>implode(' - ',[
  903. date('Y').'/01/01',date('Y/m/d',strtotime(date('Y').'/01/01 + 1year -1 day'))
  904. ])
  905. ];
  906. $timeKey = ['today','week','month','quarter','year'];
  907. if(in_array($where['data'], $timeKey)) $where['data'] = $timeList[$where['data']];
  908. $uid = self::name('user')->where('status',1)->where('is_promoter',1)->whereOr('spread_uid','<>',0)->column('uid','uid');
  909. return [
  910. [
  911. 'name'=>'分销商总佣金',
  912. 'field'=>'元',
  913. 'count'=>count($uid) ? self::getModelTime($where,UserBill::where('category','now_money')->where('type','brokerage'))->where('uid','in',implode(',',$uid))->sum('number') : 0,
  914. 'background_color'=>'layui-bg-cyan',
  915. 'col'=>3,
  916. ],
  917. [
  918. 'name'=>'分销商总佣金余额',
  919. 'field'=>'元',
  920. 'count'=>self::getModelTime($where,self::where('status',1)->where('is_promoter',1))->sum('now_money'),
  921. 'background_color'=>'layui-bg-cyan',
  922. 'col'=>3,
  923. ],
  924. [
  925. 'name'=>'分销商总提现佣金',
  926. 'field'=>'元',
  927. 'count'=>self::getModelTime($where,UserExtract::where('status',1))->sum('extract_price'),
  928. 'background_color'=>'layui-bg-cyan',
  929. 'col'=>3,
  930. ],
  931. [
  932. 'name'=>'本月分销商业务佣金',
  933. 'field'=>'元',
  934. 'count'=>count($uid) ? self::getModelTime(['data'=>'month'],UserBill::where('category','now_money')->where('type','brokerage'))
  935. ->where('uid','in',implode(',',$uid))->sum('number') : 0,
  936. 'background_color'=>'layui-bg-cyan',
  937. 'col'=>3,
  938. ],
  939. [
  940. 'name'=>'本月分销商佣金提现金额',
  941. 'field'=>'元',
  942. 'count'=>count($uid) ? self::getModelTime(['data'=>'month'],UserExtract::where('status',1))
  943. ->where('uid','in',implode(',',$uid))->sum('extract_price') : 0,
  944. 'background_color'=>'layui-bg-cyan',
  945. 'col'=>4,
  946. ],
  947. [
  948. 'name'=>'上月分销商业务佣金',
  949. 'field'=>'元',
  950. 'count'=>count($uid) ? self::getOldDate(['data'=>'year'],UserBill::where('category','now_money')->where('uid','in',implode(',',$uid))->where('type','brokerage'))->sum('number') : 0,
  951. 'background_color'=>'layui-bg-cyan',
  952. 'col'=>4,
  953. ],
  954. [
  955. 'name'=>'上月分销商佣金提现金额',
  956. 'field'=>'元',
  957. 'count'=>count($uid) ? self::getOldDate(['data'=>'year'],UserBill::where('category','now_money')->where('uid','in',implode(',',$uid))->where('type','brokerage'))->sum('number') : 0,
  958. 'background_color'=>'layui-bg-cyan',
  959. 'col'=>4,
  960. ],
  961. ];
  962. }
  963. /*
  964. * 分销会员
  965. * 分销数量 饼状图
  966. * 分销商会员访问量 曲线
  967. * 获取购物会员人数趋势图 曲线
  968. * 多次购物分销会员数量 饼状图
  969. * $where array 条件
  970. * $limit int n条数据后出拖动条
  971. * return array
  972. */
  973. public static function getUserDistributionChart($where,$limit=20){
  974. //分销数量
  975. $fenbu_user=self::getModelTime($where,new self)->field('count(uid) as num')->group('is_promoter')->select();
  976. count($fenbu_user) && $fenbu_user=$fenbu_user->toArray();
  977. $sum_user=0;
  978. $fenbu_data=[];
  979. $fenbu_xdata=['分销商','非分销商'];
  980. $color=['#81BCFE','#91F3FE'];
  981. foreach($fenbu_user as $item){
  982. $sum_user+=$item['num'];
  983. }
  984. foreach ($fenbu_user as $key=>$item){
  985. $value['value']=bcdiv($item['num'],$sum_user,2)*100;
  986. $value['name']=isset($fenbu_xdata[$key]) ?$fenbu_xdata[$key].' %'.$value['value'] :'';
  987. $value['itemStyle']['color']=$color[$key];
  988. $fenbu_data[]=$value;
  989. }
  990. //分销商会员访问量
  991. $visit=self::getModelTime($where,self::alias('a')->join('store_visit t','t.uid=a.uid'),'t.add_time')
  992. ->where('a.is_promoter',1)
  993. ->field(['FROM_UNIXTIME(t.add_time,"%Y-%m-%d") as _add_time','count(t.uid) as count_user'])
  994. ->group('_add_time')
  995. ->order('_add_time asc')
  996. ->select();
  997. // echo self::getLastSql();die;
  998. count($visit) && $visit=$visit->toArray();
  999. $visit_data=[];
  1000. $visit_xdata=[];
  1001. $visit_zoom='';
  1002. foreach ($visit as $item){
  1003. $visit_data[]=$item['count_user'];
  1004. $visit_xdata[]=$item['_add_time'];
  1005. }
  1006. count($visit_xdata) > $limit && $visit_zoom=$visit_xdata[$limit-5];
  1007. //获取购物会员人数趋势图
  1008. $list=self::getModelTime($where,self::where('a.status',1)->alias('a')->join('__store_order__ r','r.uid=a.uid'),'a.add_time')
  1009. ->where('r.paid', 1)
  1010. ->where('a.is_promoter', 1)
  1011. ->where('a.add_time','<>',0)
  1012. ->field('FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as _add_time,count(r.uid) as count_user')
  1013. ->group('_add_time')
  1014. ->order('_add_time asc')
  1015. ->select();
  1016. count($list) && $list=$list->toArray();
  1017. $seriesdata=[];
  1018. $xdata=[];
  1019. $zoom='';
  1020. foreach ($list as $item){
  1021. $seriesdata[]=$item['count_user'];
  1022. $xdata[]=$item['_add_time'];
  1023. }
  1024. count($xdata) > $limit && $zoom=$xdata[$limit-5];
  1025. //多次购物分销会员数量饼状图
  1026. $count=self::getModelTime($where,self::where('is_promoter',1))->count();
  1027. $user_count=self::getModelTime($where,self::alias('a')
  1028. ->join('__store_order__ r','r.uid=a.uid'),'a.add_time')
  1029. ->where('a.is_promoter',1)
  1030. ->where('r.paid',1)
  1031. ->group('a.uid')
  1032. ->count();
  1033. $shop_xdata=['多次购买数量占比','无购买数量占比'];
  1034. $shop_data=[];
  1035. $count >0 && $shop_data=[
  1036. [
  1037. 'value'=>bcdiv($user_count,$count,2)*100,
  1038. 'name'=>$shop_xdata[0].$user_count.'人',
  1039. 'itemStyle'=>[
  1040. 'color'=>'#D789FF',
  1041. ]
  1042. ],
  1043. [
  1044. 'value'=>bcdiv($count-$user_count,$count,2)*100,
  1045. 'name'=>$shop_xdata[1].($count-$user_count).'人',
  1046. 'itemStyle'=>[
  1047. 'color'=>'#7EF0FB',
  1048. ]
  1049. ]
  1050. ];
  1051. return compact('fenbu_data','fenbu_xdata','visit_data','visit_xdata','visit_zoom','seriesdata','xdata','zoom','shop_xdata','shop_data');
  1052. }
  1053. /*
  1054. * 分销商佣金提现排行榜
  1055. * 分销商佣金总额排行榜
  1056. * $limit 截取条数
  1057. * return array
  1058. */
  1059. public static function getUserDistributionTop10List($limit){
  1060. //分销商佣金提现排行榜
  1061. $extract=self::alias('a')
  1062. ->join('user_extract t','a.uid=t.uid')
  1063. ->where('t.status', 1)
  1064. ->where('a.is_promoter', 1)
  1065. ->group('t.uid')
  1066. ->field('a.nickname,a.phone,sum(t.extract_price) as sum_price,FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time,t.uid')
  1067. ->order('sum_price desc')
  1068. ->limit($limit)
  1069. ->select();
  1070. count($extract) && $extract=$extract->toArray();
  1071. //分销商佣金总额排行榜
  1072. $commission=UserBill::alias('l')
  1073. ->join('user a','l.uid=a.uid')
  1074. ->where('l.status',1)
  1075. ->where('l.category', 'now_money')
  1076. ->where('l.type', 'brokerage')
  1077. ->where('a.is_promoter', 1)
  1078. ->group('l.uid')
  1079. ->field('a.nickname,a.phone,sum(number) as sum_number,FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time')
  1080. ->order('sum_number desc')
  1081. ->limit($limit)
  1082. ->select();
  1083. count($commission) && $commission=$commission->toArray();
  1084. return compact('extract','commission');
  1085. }
  1086. public static function getSpreadList($uid,$page,$limit){
  1087. $list=self::where('spread_uid', $uid)->field('uid,nickname,now_money,integral,add_time')
  1088. ->order('uid desc')->page((int)$page,(int)$limit)->select();
  1089. count($list) && $list=$list->toArray();
  1090. foreach ($list as &$item){
  1091. $item['add_time']=date('Y-m-d H',$item['add_time']);
  1092. }
  1093. return $list;
  1094. }
  1095. /**
  1096. * 一级分销
  1097. * @param $orderInfo
  1098. * @return bool
  1099. */
  1100. public static function backOrderBrokerage($orderInfo)
  1101. {
  1102. $userInfo = User::getUserInfo($orderInfo['uid']);
  1103. if(!$userInfo || !$userInfo['spread_uid']) return true;
  1104. $storeBrokerageStatu = SystemConfigService::get('store_brokerage_statu') ? : 1;//获取后台分销类型
  1105. if($storeBrokerageStatu == 1){
  1106. if(!User::be(['uid'=>$userInfo['spread_uid'],'is_promoter'=>1])) return true;
  1107. }
  1108. $brokerageRatio = (SystemConfigService::get('store_brokerage_ratio') ?: 0)/100;
  1109. if($brokerageRatio <= 0) return true;
  1110. $cost = isset($orderInfo['cost']) ? $orderInfo['cost'] : 0;//成本价
  1111. if($cost > $orderInfo['pay_price']) return true;//成本价大于支付价格时直接返回
  1112. $brokeragePrice = bcmul(bcsub($orderInfo['pay_price'],$cost,2),$brokerageRatio,2);
  1113. //返佣之后余额
  1114. $spNow_money = User::where('uid', $userInfo['spread_uid'])->value('now_money');
  1115. $balance = bcadd($spNow_money,$brokeragePrice,2);
  1116. if($brokeragePrice <= 0) return true;
  1117. $mark = $userInfo['nickname'].'成功消费'.floatval($orderInfo['pay_price']).'元,奖励推广佣金'.floatval($brokeragePrice);
  1118. self::beginTrans();
  1119. $res1 = UserBill::income('获得推广佣金',$userInfo['spread_uid'],'now_money','brokerage',$brokeragePrice,$orderInfo['id'],$balance,$mark);
  1120. $res2 = self::bcInc($userInfo['spread_uid'],'now_money',$brokeragePrice,'uid');
  1121. $res = $res1 && $res2;
  1122. self::checkTrans($res);
  1123. if($res) self::backOrderBrokerageTwo($orderInfo);
  1124. return $res;
  1125. }
  1126. /**
  1127. * 二级推广
  1128. * @param $orderInfo
  1129. * @return bool
  1130. */
  1131. public static function backOrderBrokerageTwo($orderInfo){
  1132. $userInfo = User::getUserInfo($orderInfo['uid']);
  1133. $userInfoTwo = User::getUserInfo($userInfo['spread_uid']);
  1134. if(!$userInfoTwo || !$userInfoTwo['spread_uid']) return true;
  1135. $storeBrokerageStatu = SystemConfigService::get('store_brokerage_statu') ? : 1;//获取后台分销类型
  1136. if($storeBrokerageStatu == 1){
  1137. if(!User::be(['uid'=>$userInfoTwo['spread_uid'],'is_promoter'=>1])) return true;
  1138. }
  1139. $brokerageRatio = (SystemConfigService::get('store_brokerage_two') ?: 0)/100;
  1140. if($brokerageRatio <= 0) return true;
  1141. $cost = isset($orderInfo['cost']) ? $orderInfo['cost'] : 0;//成本价
  1142. if($cost > $orderInfo['pay_price']) return true;//成本价大于支付价格时直接返回
  1143. $brokeragePrice = bcmul(bcsub($orderInfo['pay_price'],$cost,2),$brokerageRatio,2);
  1144. //返佣之后余额
  1145. $spNow_money = User::where('uid', $userInfo['spread_uid'])->value('now_money');
  1146. $balance = bcadd($spNow_money,$brokeragePrice,2);
  1147. if($brokeragePrice <= 0) return true;
  1148. $mark = '二级推广人'.$userInfo['nickname'].'成功消费'.floatval($orderInfo['pay_price']).'元,奖励推广佣金'.floatval($brokeragePrice);
  1149. self::beginTrans();
  1150. $res1 = UserBill::income('获得推广佣金',$userInfoTwo['spread_uid'],'now_money','brokerage',$brokeragePrice,$orderInfo['id'],$balance,$mark);
  1151. $res2 = self::bcInc($userInfoTwo['spread_uid'],'now_money',$brokeragePrice,'uid');
  1152. $res = $res1 && $res2;
  1153. self::checkTrans($res);
  1154. return $res;
  1155. }
  1156. }