链街Dcat后台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

220 lines
8.8 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. <?php
  2. namespace App\Admin\Controllers\v3;
  3. use App\Admin\Actions\Metrics\Distance;
  4. use App\Admin\Actions\Metrics\Shipping;
  5. use App\Admin\Actions\Tools\DataReportDate;
  6. use App\Admin\Actions\Tools\DataReportOption;
  7. use App\Admin\Common\Order;
  8. use App\Admin\Extensions\Chart\Bar\OrderBar;
  9. use App\Models\ImsCjdcMarket;
  10. use App\Models\LanzuStore;
  11. use App\Models\v3\User;
  12. use Dcat\Admin\Form;
  13. use Dcat\Admin\Grid;
  14. use Dcat\Admin\Layout\Column;
  15. use Dcat\Admin\Layout\Content;
  16. use Dcat\Admin\Layout\Row;
  17. use Dcat\Admin\Widgets\Card;
  18. use http\Message\Body;
  19. use Illuminate\Support\Facades\DB;
  20. class DataReport
  21. {
  22. /**
  23. * 数据报表
  24. * @param Content $content
  25. * @return Content
  26. */
  27. protected $_amount;
  28. protected $_number;
  29. protected $_count_user;
  30. protected $_shipping;
  31. protected $_distance;
  32. public function __construct()
  33. {
  34. $option = request()->get('option',1);
  35. $marketId = request()->get('market_id','');
  36. $this->_amount = Order::getOrderData([
  37. 'user_type'=>'market_service',//谁取数据 user_type 用户类型
  38. 'data_type'=>'amount',//取什么数据 data_type 数据类型
  39. 'market_id'=>$marketId,//取哪个市场数据
  40. 'condition'=>1,//取数据维度 condition
  41. 'user_ids'=>null
  42. ],$option);
  43. $this->_number = Order::getOrderData([
  44. 'user_type'=>'market_service',//谁取数据 user_type 用户类型
  45. 'data_type'=>'number',//取什么数据 data_type 数据类型
  46. 'market_id'=>$marketId,//取哪个市场数据
  47. 'condition'=>1,//取数据维度 condition
  48. 'user_ids'=>null
  49. ],$option);
  50. $this->_count_user = Order::getOrderData([
  51. 'user_type'=>'market_service',//谁取数据 user_type 用户类型
  52. 'data_type'=>'count_user',//取什么数据 data_type 数据类型
  53. 'market_id'=>$marketId,//取哪个市场数据
  54. 'condition'=>1,//取数据维度 condition
  55. 'user_ids'=>null
  56. ],$option);
  57. $this->_shipping = Order::getOrderData([
  58. 'user_type'=>'market_service',//谁取数据 user_type 用户类型
  59. 'data_type'=>'shipping',//取什么数据 data_type 数据类型
  60. 'market_id'=>$marketId,//取哪个市场数据
  61. 'condition'=>1,//取数据维度 condition
  62. 'user_ids'=>null
  63. ],$option);
  64. $this->_distance = Order::getOrderData([
  65. 'user_type'=>'market_service',//谁取数据 user_type 用户类型
  66. 'data_type'=>'distance',//取什么数据 data_type 数据类型
  67. 'market_id'=>$marketId,//取哪个市场数据
  68. 'condition'=>1,//取数据维度 condition
  69. 'user_ids'=>null
  70. ],$option);
  71. }
  72. public function index(Content $content)
  73. {
  74. return $content
  75. ->header('订单数据')
  76. ->body(function (Row $row){
  77. $row->column(4,function (Column $column){
  78. $column->row(new \App\Admin\Actions\Tools\DataReportTime('data_report'));
  79. });
  80. $row->column(2,function (Column $column){
  81. $markets = ImsCjdcMarket::getMarket();
  82. $data = [['value'=>0,'label'=>'全部市场']];
  83. foreach ($markets as $key=>$val){
  84. $item = [];
  85. $item['value'] = $key;
  86. $item['label'] = $val;
  87. $data[] = $item;
  88. }
  89. $column->row(new DataReportOption('data_report',$data));
  90. });
  91. $row->column(6,function (Column $column){
  92. $column->row(new DataReportDate('data_report'));
  93. });
  94. })->body('<hr />')
  95. ->body(function (Row $row){
  96. $row->column(2,function (Column $column){
  97. $title = "订单数";
  98. $value = $this->_number;
  99. $card = Card::make("<span style='color: #ffffff'>{$title}</span>","<span style='color: #ffffff'>{$value}</span>");
  100. $card->style('background-color:#4e9876');
  101. $column->row($card);
  102. });
  103. $row->column(2,function (Column $column){
  104. $title = "订单总额(元)";
  105. $value = $this->_amount;
  106. $card = Card::make("<span style='color: #ffffff'>{$title}</span>","<span style='color: #ffffff'>{$value}</span>");
  107. $card->style('background-color:#4e9876');
  108. $column->row($card);
  109. });
  110. $row->column(2,function (Column $column) {
  111. $title = "下单人数";
  112. $value =$this->_count_user;
  113. $card = Card::make("<span style='color: #ffffff'>{$title}</span>","<span style='color: #ffffff'>{$value}</span>");
  114. $card->style('background-color:#4e9876');
  115. $column->row($card);
  116. });
  117. $row->column(2,function (Column $column){
  118. $title = "人均单价(元)";
  119. if ($this->_amount){
  120. $value = sprintf("%.2f",$this->_amount/$this->_count_user);
  121. }else{
  122. $value=0;
  123. }
  124. $card = Card::make("<span style='color: #ffffff'>{$title}</span>","<span style='color: #ffffff'>{$value}</span>");
  125. $card->style('background-color:#4e9876');
  126. $column->row($card);
  127. });
  128. $row->column(2,function (Column $column){
  129. $title = "线上用户总数";
  130. $value = User::where('nick_name','!=','')->count();
  131. $card = Card::make("<span style='color: #ffffff'>{$title}</span>","<span style='color: #ffffff'>{$value}</span>");
  132. $card->style('background-color:#4e9876');
  133. $column->row($card);
  134. });
  135. $row->column(2,function (Column $column){
  136. $title = "下过单的用户数";
  137. $value = 0;
  138. $card = Card::make("<span style='color: #ffffff'>{$title}</span>","<span style='color: #ffffff'>{$value}</span>");
  139. $card->style('background-color:#4e9876');
  140. $column->row($card);
  141. });
  142. })
  143. ->body(function (Row $row){
  144. $row->column(8,function (Column $column){
  145. $card = new Card();
  146. $card->title('订单图表');
  147. //默认查询最近20天的数据
  148. $dateTime = request()->get('created_at')??null;
  149. if ($dateTime){
  150. $dateTime['start'] = strtotime($dateTime['start']);
  151. $dateTime['end'] = strtotime($dateTime['end']);
  152. }else{
  153. $dateTime =['start'=>time()-(20*86400),'end'=>time()];
  154. }
  155. $marketId = request()->get('market_id')??0;
  156. $card->tool(new \App\Admin\Actions\Tools\DataReportOrder('data_report',$marketId,$dateTime));
  157. $card->content(OrderBar::make($this->orderData(['type'=>1,'market_id'=>$marketId,'date_time'=>$dateTime])));
  158. $column->row($card);
  159. });
  160. $row->column(4,function (Column $column){
  161. $column->row(new Shipping($this->_shipping));
  162. $column->row(new Distance($this->_distance,$this->_number));
  163. $card3 = Card::make('222');
  164. $card3->style("height:155px");
  165. $column->row($card3);
  166. });
  167. });
  168. }
  169. /**
  170. * 订单数据
  171. * @param array $params
  172. * @return array[]|string[]
  173. */
  174. public function orderData($params=[])
  175. {
  176. $where['type'] = $params['type'];
  177. if ($params['market_id']>0){
  178. $where['market_id'] = $params['market_id'];
  179. }
  180. $data = DB::table('lanzu_order_main')
  181. ->select('money')
  182. ->selectRaw("FROM_UNIXTIME(created_at,'%Y-%m-%d') as add_time")
  183. ->where($where)
  184. ->whereBetween('created_at',$params['date_time'])
  185. ->get();
  186. $time = $num = $amount = [];
  187. if ($data){
  188. $data = $data->groupBy('add_time')->toArray();
  189. foreach ($data as $key=>$val){
  190. $time[] = $key;
  191. $num[] = intval(count($val));
  192. $amount[] = sprintf("%.2f",array_sum(array_column($val,'money')));
  193. }
  194. return ['time'=>$time,'num'=>$num,'amount'=>$amount];
  195. }
  196. return ['time'=>'','num'=>'','amount'=>''];
  197. }
  198. public function getOrderData()
  199. {
  200. }
  201. }