DataAnalysisLogic.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <?php
  2. namespace app\adminapi\logic\data_analysis;
  3. use app\common\logic\BaseLogic;
  4. use app\common\model\goods_category\GoodsCategory;
  5. use think\facade\Db;
  6. /**
  7. * DataAnalysis逻辑
  8. * Class DataAnalysisLogic
  9. * @package app\adminapi\logic
  10. */
  11. class DataAnalysisLogic extends BaseLogic
  12. {
  13. public static function serviceOrdersNumber(array $params = [])
  14. {
  15. $condition = self::paramsToSelectCondition($params);
  16. return Db::name('service_work')->alias('a')->field($condition['field'])
  17. ->where($condition['where'])
  18. ->group($condition['group'])
  19. ->order($condition['order'])
  20. ->select()->column('y', 'x');
  21. }
  22. public static function paramsToSelectCondition(array $params = [])
  23. {
  24. $where = [];
  25. $field = [];
  26. $group = [];
  27. $order = [];
  28. if($params['type'] == 'hour'){
  29. $params = $params['hour'];
  30. $field[] = Db::raw("HOUR(FROM_UNIXTIME(a.create_time)) AS x");
  31. if($params['date_range']){
  32. list($start_time,$end_time) = $params['date_range'];
  33. $where[] = ['a.create_time','between',[strtotime($start_time),strtotime($end_time)+86400-1]];
  34. }
  35. $group[] = Db::raw("HOUR(FROM_UNIXTIME(a.create_time))");
  36. $order[] = 'x';
  37. }else{
  38. $params = $params['category_type'];
  39. switch ($params['segmented']){
  40. case 1:
  41. $field[] = Db::raw("FROM_UNIXTIME(a.create_time,'%Y-%m-%d') AS x");
  42. if($params['date_range']){
  43. list($start_time,$end_time) = $params['date_range'];
  44. $where[] = ['a.create_time','between',[strtotime($start_time),strtotime($end_time)+86400-1]];
  45. }
  46. $group[] = Db::raw("x");
  47. $order[] = 'x';
  48. break;
  49. case 2:
  50. $field[] = Db::raw("FLOOR((a.create_time - UNIX_TIMESTAMP('".$params['monthdate']."-01')) / (7 * 24 * 60 * 60)) AS x");
  51. if($params['monthdate']){
  52. $dateTime = new \DateTime($params['monthdate']);
  53. $dateTime->modify('last day of this month');
  54. $where[] = ['a.create_time','between',[strtotime($params['monthdate'].'-01'),strtotime($dateTime->format('Y-m-d'))+86400-1]];
  55. }
  56. $group[] = Db::raw("x");
  57. $order[] = 'x';
  58. break;
  59. case 3:
  60. $field[] = Db::raw("FROM_UNIXTIME(a.create_time,'%m') AS x");
  61. if($params['yeardate']){
  62. $where[] = ['a.create_time','between',[strtotime($params['yeardate'].'-01-01'),strtotime($params['yeardate'].'-12-31')+86400-1]];
  63. }
  64. $group[] = Db::raw("x");
  65. $order[] = 'x';
  66. break;
  67. }
  68. }
  69. $field[] = Db::raw("COUNT(a.id) AS y");
  70. return [
  71. 'where' => $where,
  72. 'field' => $field,
  73. 'group' => $group,
  74. 'order' => $order
  75. ];
  76. }
  77. public static function serviceOrdersTotal(array $params = [])
  78. {
  79. $res = [
  80. 'total_flow' => 0,
  81. 'proxy_order_flow' => 0,
  82. 'free_class_flow' => 0,
  83. 'goods_category_flow' => [],
  84. ];
  85. list($start_time,$end_time) = $params['start_end_time'];
  86. $time = [strtotime($start_time), strtotime($end_time)+86400-1];
  87. $res['total_flow'] = Db::name('service_work')
  88. ->field([Db::raw('SUM(work_total) as work_total')])
  89. ->where([['service_status','=',3],['approval','=',1]])
  90. ->where([['create_time', 'between', $time]])
  91. ->select()->toArray()[0]['work_total'];
  92. $res['proxy_order_flow'] = Db::name('property_order')->alias('a')
  93. ->field([Db::raw('SUM(b.work_total) as work_total')])
  94. ->leftJoin('service_work b', 'a.work_id = b.id')
  95. ->where([['b.service_status','=',3],['b.approval','=',1]])
  96. ->where([['b.create_time', 'between', $time]])
  97. ->select()->toArray()[0]['work_total'];
  98. $res['free_class_flow'] = Db::name('master_worker_commission_notice')->alias('n')
  99. ->leftJoin('master_worker mw', 'n.master_worker_id = mw.id')
  100. ->leftJoin('service_work sw', 'n.master_worker_id = sw.master_worker_id AND sw.create_time >= n.signing_date AND sw.create_time <= n.signing_date_end')
  101. ->field([Db::raw("SUM(CASE WHEN sw.service_status = 3 THEN sw.work_total ELSE null END) AS work_total")])
  102. ->where([['sw.create_time', 'between', $time]])
  103. ->select()->toArray()[0]['work_total'];
  104. $goodsCategoryObj = GoodsCategory::where(['status'=>1])->order(['pid' => 'asc','weigh' => 'desc', 'id' => 'desc'])->select();
  105. $res['goods_category_flow'] = Db::name('service_work')
  106. ->field(Db::raw("goods_category_ids,goods_category_id,SUM(work_total) as work_total_flow"))
  107. ->where('service_status',3)
  108. ->where([['create_time', 'between', $time]])
  109. ->group('goods_category_id')
  110. ->order('work_total_flow', 'desc')
  111. ->select()->toArray();
  112. foreach ($res['goods_category_flow'] as &$item) {
  113. $item['goods_category_ids'] = array_map("intval",json_decode($item['goods_category_ids'],true));
  114. $item['goods_category_ids_str'] = implode(' / ',$goodsCategoryObj->whereIn('id', $item['goods_category_ids'])->column('name'));
  115. }
  116. return $res;
  117. }
  118. }