链街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.

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