GoodsSaleStatistics.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <?php
  2. namespace app\store\model;
  3. use app\common\library\helper;
  4. use app\common\model\GoodsSaleStatistics as GoodsSaleStatisticsModel;
  5. /**
  6. * 商品销售统计模型
  7. * @package app\store\model
  8. */
  9. class GoodsSaleStatistics extends GoodsSaleStatisticsModel
  10. {
  11. /**
  12. * 获取列表
  13. * @param $param
  14. * @return mixed
  15. */
  16. public function getList($param = [])
  17. {
  18. $model = $this->setQueryFilter($param);
  19. // 排序条件
  20. $sort = $this->setQuerySort($param);
  21. return $model->alias('st')
  22. ->field('sum(st.order_count) as order_count,sum(st.order_user_count) as order_user_count,sum(pay_count) as pay_count,sum(pay_goods_count) as pay_goods_count,sum(pay_user_count) as pay_user_count,sum(order_amount) as order_amount,sum(first_order_users) as first_order_users,sum(recorder_users) as recorder_users,st.goods_id,g.goods_name,g.goods_no,g.create_time,convert((sum(st.order_amount)/sum(st.pay_user_count)),decimal(10,2)) as user_unit_price')
  23. ->leftJoin('goods g', 'g.goods_id=st.goods_id')
  24. ->group('st.goods_id')
  25. ->order($sort)
  26. ->paginate(15)
  27. ->each(function ($item) {
  28. $item['order_amount'] = helper::number2($item['order_amount']);
  29. $item['user_unit_price'] = helper::number2($item['user_unit_price']);
  30. });
  31. }
  32. /**
  33. * 检索排序条件
  34. * @param array $param
  35. * @return array|string[]
  36. */
  37. private function setQuerySort(array $param = [])
  38. {
  39. $params = $this->setQueryDefaultValue($param, [
  40. 'sortField' => '', // 排序类型 默认空:按销售总额倒序 order_count-总订单数 order_user_count-总下单人数 pay_count-实付订单数 pay_goods_count-实付商品件数 pay_user_count-实付买家数 order_amount-销售总额 first_order_users-首次下单人数 recorder_users-复购人数 user_unit_price-客单价
  41. 'sortOrder' => 'descend', // 排序方式 (descend-高到低 ascend-低到高)
  42. ]);
  43. // 排序规则
  44. $sort = [];
  45. if (!empty($params['sortField'])) {
  46. $sort = $params['sortOrder'] == 'descend' ? [$params['sortField'] => 'desc'] : [$params['sortField'] => 'asc'];
  47. } else {
  48. $sort = ['order_amount' => 'desc'];
  49. }
  50. return array_merge($sort, [$this->getPk() => 'desc']);
  51. }
  52. /**
  53. * 检索查询条件
  54. * @param array $param
  55. * @return \think\db\BaseQuery
  56. */
  57. private function setQueryFilter(array $param)
  58. {
  59. // 实例化查询对象
  60. $query = $this->getNewQuery();
  61. // 查询参数
  62. $params = $this->setQueryDefaultValue($param, [
  63. 'ftype' => -1 // -1全部 1按日 2按周 3按月
  64. ]);
  65. $filter[] = ['g.is_delete', '=', 0];
  66. $params['ftype']>-1 && $filter[] = ['st.ftype', '=', (int)$params['ftype']];
  67. // 起止时间
  68. if (!empty($params['betweenTime'])) {
  69. $times = between_time($params['betweenTime']);
  70. $filter[] = ["st.start_time", '>=', $times['start_time']];
  71. $filter[] = ["st.end_time", '<=', $times['end_time']];
  72. }
  73. $filter[] = ['g.goods_id', '>', 0];
  74. $query->where($filter);
  75. return $query;
  76. }
  77. /**
  78. * 导出记录
  79. */
  80. public function export(array $param)
  81. {
  82. $data['header'] = ['商品ID', '商品名称','商品编码', '发布时间','总订单数', '总下单人数', '实付订单数','实付商品件数','实付买家数',
  83. '销售总额(元)','客单价(元)','首次下单人数','复购人数'];
  84. $data['filename'] = '商品销售数据导出';
  85. $data['data'] = [];
  86. $model = $this->setQueryFilter($param);
  87. // 排序条件
  88. $sort = $this->setQuerySort($param);
  89. $list = $model->alias('st')
  90. ->field('sum(st.order_count) as order_count,sum(st.order_user_count) as order_user_count,
  91. sum(pay_count) as pay_count,sum(pay_goods_count) as pay_goods_count,sum(pay_user_count) as pay_user_count,
  92. sum(order_amount) as order_amount,sum(first_order_users) as first_order_users,sum(recorder_users) as recorder_users,st.goods_id,g.goods_name,g.goods_no,g.create_time,convert((sum(st.order_amount)/sum(st.pay_user_count)),decimal(10,2)) as user_unit_price')
  93. ->leftJoin('goods g', 'g.goods_id=st.goods_id')
  94. ->group('st.goods_id')
  95. ->order($sort)
  96. ->select();
  97. foreach ($list as $arr){
  98. $new_list['goods_id'] = $arr['goods_id'];
  99. $new_list['goods_name'] = $arr['goods_name'];
  100. $new_list['goods_no'] = $arr['goods_no'];
  101. $new_list['create_time'] = $arr['create_time'];
  102. $new_list['order_count'] = $arr['order_count'];
  103. $new_list['order_user_count'] = $arr['order_user_count'];
  104. $new_list['pay_count'] = $arr['pay_count'];
  105. $new_list['pay_goods_count'] = $arr['pay_goods_count'];
  106. $new_list['pay_user_count'] = $arr['pay_user_count'];
  107. $new_list['order_amount'] = helper::number2($arr['order_amount']);
  108. $new_list['user_unit_price'] = helper::number2($arr['user_unit_price']);
  109. $new_list['first_order_users'] = $arr['first_order_users'];
  110. $new_list['recorder_users'] = $arr['recorder_users'];
  111. $data['data'][] = $new_list;
  112. }
  113. return $data;
  114. }
  115. }