UserBill.php 12 KB

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