UserBill.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. <?php
  2. namespace app\admin\model\user;
  3. use traits\ModelTrait;
  4. use basic\ModelBasic;
  5. use app\admin\model\wechat\WechatUser;
  6. /**
  7. * 用户消费新增金额明细 model
  8. * Class User
  9. * @package app\admin\model\user
  10. */
  11. class UserBill extends ModelBasic
  12. {
  13. use ModelTrait;
  14. public static function income($title,$uid,$category,$type,$number,$link_id = 0,$balance = 0,$mark = '',$status = 1){
  15. $pm = 1;
  16. return self::set(compact('title','uid','link_id','category','type','number','balance','mark','status','pm'));
  17. }
  18. //获取柱状图和饼状图数据
  19. public static function getUserBillChart($where,$category='now_money',$type='brokerage',$pm=1,$zoom=15){
  20. $model=self::getModelTime($where,new self());
  21. $list=$model->field(['FROM_UNIXTIME(add_time,"%Y-%c-%d") as un_time','sum(number) as sum_number'])
  22. ->order('un_time asc')
  23. ->where(['category'=>$category,'type'=>$type,'pm'=>$pm])
  24. ->group('un_time')
  25. ->select();
  26. if(count($list)) $list=$list->toArray();
  27. $legdata=[];
  28. $listdata=[];
  29. $dataZoom='';
  30. foreach ($list as $item){
  31. $legdata[]=$item['un_time'];
  32. $listdata[]=$item['sum_number'];
  33. }
  34. if(count($legdata)>=$zoom) $dataZoom=$legdata[$zoom-1];
  35. //获取用户分布钱数
  36. $fenbulist=self::getModelTime($where,new self(),'a.add_time')
  37. ->alias('a')
  38. ->join('user r','a.uid=r.uid')
  39. ->field(['a.uid','sum(a.number) as sum_number','r.nickname'])
  40. ->where(['a.category'=>$category,'a.type'=>$type,'a.pm'=>$pm])
  41. ->order('sum_number desc')
  42. ->group('a.uid')
  43. ->limit(8)
  44. ->select();
  45. //获取用户当前时间段总钱数
  46. $sum_number=self::getModelTime($where,new self())
  47. ->where(['category'=>$category,'type'=>$type,'pm'=>$pm])
  48. ->sum('number');
  49. if(count($fenbulist)) $fenbulist=$fenbulist->toArray();
  50. $fenbudate=[];
  51. $fenbu_legend=[];
  52. $color=['#ffcccc','#99cc00','#fd99cc','#669966','#66CDAA','#ADFF2F','#00BFFF','#00CED1','#66cccc','#ff9900','#ffcc00','#336699','#cccc00','#99ccff','#990066'];
  53. foreach ($fenbulist as $key=>$value){
  54. $fenbu_legend[]=$value['nickname'];
  55. $items['name']=$value['nickname'];
  56. $items['value']=bcdiv($value['sum_number'],$sum_number,2)*100;
  57. $items['itemStyle']['color']=$color[$key];
  58. $fenbudate[]=$items;
  59. }
  60. return compact('legdata','listdata','fenbudate','fenbu_legend','dataZoom');
  61. }
  62. //获取头部信息
  63. public static function getRebateBadge($where){
  64. $datawhere=['category'=>'now_money','type'=>'brokerage','pm'=>1];
  65. return [
  66. [
  67. 'name'=>'返利数(笔)',
  68. 'field'=>'个',
  69. 'count'=>self::getModelTime($where,new self())->where($datawhere)->count(),
  70. 'content'=>'返利总笔数',
  71. 'background_color'=>'layui-bg-blue',
  72. 'sum'=>self::where($datawhere)->count(),
  73. 'class'=>'fa fa-bar-chart',
  74. ],
  75. [
  76. 'name'=>'返利金额(元)',
  77. 'field'=>'个',
  78. 'count'=>self::getModelTime($where,new self())->where($datawhere)->sum('number'),
  79. 'content'=>'返利总金额',
  80. 'background_color'=>'layui-bg-cyan',
  81. 'sum'=>self::where($datawhere)->sum('number'),
  82. 'class'=>'fa fa-line-chart',
  83. ],
  84. ];
  85. }
  86. //获取返佣用户信息列表
  87. public static function getFanList($where){
  88. $datawhere=['a.category'=>'now_money','a.type'=>'brokerage','a.pm'=>1];
  89. $list=self::alias('a')->join('user r','a.uid=r.uid')
  90. ->where($datawhere)
  91. ->order('a.number desc')
  92. ->join('store_order o','o.id=a.link_id')
  93. ->field(['o.order_id','FROM_UNIXTIME(a.add_time,"%Y-%c-%d") as add_time','a.uid','o.uid as down_uid','r.nickname','r.avatar','r.spread_uid','r.level','a.number'])
  94. ->page((int)$where['page'],(int)$where['limit'])
  95. ->select();
  96. if(count($list)) $list=$list->toArray();
  97. return $list;
  98. }
  99. //获取返佣用户总人数
  100. public static function getFanCount(){
  101. $datawhere=['a.category'=>'now_money','a.type'=>'brokerage','a.pm'=>1];
  102. return self::alias('a')->join('user r','a.uid=r.uid')->join('store_order o','o.id=a.link_id')->where($datawhere)->count();
  103. }
  104. //获取用户充值数据
  105. public static function getEchartsRecharge($where,$limit=15){
  106. $datawhere=['category'=>'now_money','pm'=>1];
  107. $list=self::getModelTime($where,self::where($datawhere)->where('type','in',['recharge','system_add']))
  108. ->field(['sum(number) as sum_money','FROM_UNIXTIME(add_time,"%Y-%c-%d") as un_time','count(id) as count'])
  109. ->group('un_time')
  110. ->order('un_time asc')
  111. ->select();
  112. if(count($list)) $list=$list->toArray();
  113. $sum_count=self::getModelTime($where,self::where($datawhere)->where('type','in',['recharge','system_add']))->count();
  114. $xdata=[];
  115. $seriesdata=[];
  116. $data=[];
  117. $zoom='';
  118. foreach ($list as $value){
  119. $xdata[]=$value['un_time'];
  120. $seriesdata[]=$value['sum_money'];
  121. $data[]=$value['count'];
  122. }
  123. if(count($xdata)>$limit){
  124. $zoom=$xdata[$limit-5];
  125. }
  126. return compact('xdata','seriesdata','data','zoom');
  127. }
  128. //获取佣金提现列表
  129. public static function getExtrctOneList($where,$uid){
  130. $list=self::setOneWhere($where,$uid)
  131. ->field(['number','link_id','mark','FROM_UNIXTIME(add_time,"%Y-%m-%d %H:%i:%s") as _add_time','status'])
  132. ->select();
  133. count($list) && $list=$list->toArray();
  134. $count=self::setOneWhere($where,$uid)->count();
  135. foreach ($list as &$value){
  136. $value['order_id']=db('store_order')->where(['order_id'=>$value['link_id']])->value('order_id');
  137. }
  138. return ['data'=>$list,'count'=>$count];
  139. }
  140. //设置单个用户查询
  141. public static function setOneWhere($where,$uid){
  142. $model=self::where(['uid'=>$uid,'category'=>'now_money','type'=>'brokerage']);
  143. $time['data']='';
  144. if($where['start_time']!='' && $where['end_time']!=''){
  145. $time['data']=$where['start_time'].' - '.$where['end_time'];
  146. $model=self::getModelTime($time,$model);
  147. }
  148. if($where['nickname']!=''){
  149. $model=$model->where('link_id|mark','like',"%$where[nickname]%");
  150. }
  151. return $model;
  152. }
  153. //查询积分个人明细
  154. public static function getOneIntegralList($where){
  155. return self::setWhereList(
  156. $where,
  157. ['deduction','system_add'],
  158. ['title','number','balance','mark','FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time']
  159. );
  160. }
  161. //查询个人签到明细
  162. public static function getOneSignList($where){
  163. return self::setWhereList(
  164. $where,'sign',
  165. ['title','number','mark','FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time']
  166. );
  167. }
  168. //查询个人余额变动记录
  169. public static function getOneBalanceChangList($where){
  170. $list=self::setWhereList(
  171. $where,
  172. ['system_add','pay_product','extract','pay_product_refund','system_sub'],
  173. ['FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time','title','type','mark','number','balance','pm','status'],
  174. 'now_money'
  175. );
  176. foreach ($list as &$item){
  177. switch ($item['type']){
  178. case 'system_add':
  179. $item['_type']='系统添加';
  180. break;
  181. case 'pay_product':
  182. $item['_type']='商品购买';
  183. break;
  184. case 'extract':
  185. $item['_type']='提现';
  186. break;
  187. case 'pay_product_refund':
  188. $item['_type']='退款';
  189. break;
  190. case 'system_sub':
  191. $item['_type']='系统减少';
  192. break;
  193. }
  194. $item['_pm']=$item['pm']==1 ? '获得': '支出';
  195. }
  196. return $list;
  197. }
  198. //设置where条件分页.返回数据
  199. public static function setWhereList($where,$type='',$field=[],$category='integral'){
  200. $models=self::where('uid',$where['uid'])
  201. ->where('category',$category)
  202. ->page((int)$where['page'],(int)$where['limit'])
  203. ->field($field);
  204. if(is_array($type)){
  205. $models=$models->where('type','in',$type);
  206. }else{
  207. $models=$models->where('type',$type);
  208. }
  209. return ($list=$models->select()) && count($list) ? $list->toArray():[];
  210. }
  211. //获取积分统计头部信息
  212. public static function getScoreBadgeList($where){
  213. return [
  214. [
  215. 'name'=>'总积分',
  216. 'field'=>'个',
  217. 'count'=>self::getModelTime($where,new self())->where('category','integral')->where('type','in',['gain','system_sub','deduction','sign'])->sum('number'),
  218. 'background_color'=>'layui-bg-blue',
  219. 'col'=>4,
  220. ],
  221. [
  222. 'name'=>'已使用积分',
  223. 'field'=>'个',
  224. 'count'=>self::getModelTime($where,new self())->where('category','integral')->where('type','deduction')->sum('number'),
  225. 'background_color'=>'layui-bg-cyan',
  226. 'col'=>4,
  227. ],
  228. [
  229. 'name'=>'未使用积分',
  230. 'field'=>'个',
  231. 'count'=>self::getModelTime($where,db('user'))->sum('integral'),
  232. 'background_color'=>'layui-bg-cyan',
  233. 'col'=>4,
  234. ],
  235. ];
  236. }
  237. //获取积分统计曲线图和柱状图
  238. public static function getScoreCurve($where){
  239. //发放积分趋势图
  240. $list=self::getModelTime($where,self::where('category','integral')
  241. ->field(['FROM_UNIXTIME(add_time,"%Y-%m-%d") as _add_time','sum(number) as sum_number'])
  242. ->group('_add_time')->order('_add_time asc'))->select()->toArray();
  243. $date=[];
  244. $zoom='';
  245. $seriesdata=[];
  246. foreach ($list as $item){
  247. $date[]=$item['_add_time'];
  248. $seriesdata[]=$item['sum_number'];
  249. }
  250. unset($item);
  251. if(count($date)>$where['limit']){
  252. $zoom=$date[$where['limit']-5];
  253. }
  254. //使用积分趋势图
  255. $deductionlist=self::getModelTime($where,self::where('category','integral')->where('type','deduction')
  256. ->field(['FROM_UNIXTIME(add_time,"%Y-%m-%d") as _add_time','sum(number) as sum_number'])
  257. ->group('_add_time')->order('_add_time asc'))->select()->toArray();
  258. $deduction_date=[];
  259. $deduction_zoom='';
  260. $deduction_seriesdata=[];
  261. foreach ($deductionlist as $item){
  262. $deduction_date[]=$item['_add_time'];
  263. $deduction_seriesdata[]=$item['sum_number'];
  264. }
  265. if(count($deductionlist)>$where['limit']){
  266. $deduction_zoom=$deductionlist[$where['limit']-5];
  267. }
  268. return compact('date','seriesdata','zoom','deduction_date','deduction_zoom','deduction_seriesdata');
  269. }
  270. }