UserBill.php 11 KB

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