UserBill.php 13 KB

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