MemberLowerOrderJob.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Administrator
  5. * Date: 2018/10/31
  6. * Time: 14:55
  7. */
  8. namespace app\Jobs;
  9. use app\backend\modules\charts\modules\member\models\MemberLowerOrder;
  10. use app\backend\modules\charts\modules\member\services\LowerOrderService;
  11. use app\common\models\MemberShopInfo;
  12. use Illuminate\Bus\Queueable;
  13. use Illuminate\Contracts\Queue\ShouldQueue;
  14. use Illuminate\Queue\InteractsWithQueue;
  15. use Illuminate\Queue\SerializesModels;
  16. use Illuminate\Support\Facades\DB;
  17. class MemberLowerOrderJob implements ShouldQueue
  18. {
  19. use InteractsWithQueue, Queueable, SerializesModels;
  20. public $uniacid;
  21. public $insert_data;
  22. public function __construct()
  23. {
  24. }
  25. /**
  26. * Execute the job.
  27. *
  28. * @return void
  29. */
  30. public function handle()
  31. {
  32. $this->memberOrder();
  33. }
  34. public function memberOrder()
  35. {
  36. $orders = [];
  37. $order_data = DB::select('select uid, SUM(price) as amount, COUNT(id) as count from '. DB::getTablePrefix() . 'yz_order where status = 3 and uniacid =' . \YunShop::app()->uniacid .' group by uid');
  38. foreach ($order_data as $order) {
  39. $orders[$order['uid']] = $order;
  40. }
  41. unset($order_data);
  42. $members = DB::select('select member_id, parent_id from '. DB::getTablePrefix() . 'yz_member where uniacid =' . \YunShop::app()->uniacid );
  43. $tree = $this->tree($members);
  44. unset($members);
  45. $this->getTreeData($tree[0]['son'],$orders);
  46. unset($tree[0]);
  47. $this->getFirst($tree,$orders);
  48. $insert_data = array_chunk($this->insert_data,2000);
  49. foreach ($insert_data as $k=>$v){
  50. MemberLowerOrder::insert($v);
  51. }
  52. }
  53. public function tree($members)
  54. {
  55. $items = [];
  56. foreach ($members as $member) {
  57. $items[$member['member_id']] = $member;
  58. }
  59. foreach ($items as $item) {
  60. $items[$item['parent_id']]['son'][$item['member_id']] = &$items[$item['member_id']];
  61. }
  62. return $items;
  63. }
  64. function getTreeData($tree, $orders)
  65. {
  66. $data = [];
  67. foreach($tree as $kk => $t){
  68. $this_insert_data = [
  69. 'uid'=> $t['member_id'],
  70. 'uniacid'=>\YunShop::app()->uniacid,
  71. 'first_order_quantity'=>0,
  72. 'first_order_amount'=>0,
  73. 'second_order_quantity'=>0,
  74. 'second_order_amount'=>0,
  75. 'third_order_quantity'=>0,
  76. 'third_order_amount'=>0,
  77. 'team_order_quantity'=>0,
  78. 'team_order_amount'=>0,
  79. 'pay_count'=>0,
  80. 'created_at'=>time()
  81. ];
  82. $this_order_data = [];
  83. if(isset($t['son'])){
  84. $this_order_data = $this->getTreeData($t['son'], $orders);
  85. $this_insert_data['team_order_quantity'] = $this_order_data['count'];
  86. $this_insert_data['team_order_amount'] = $this_order_data['amount'];
  87. }
  88. $data['count'] += $orders[$t['member_id']]['count'] + $this_order_data['count'];
  89. $data['amount'] += $orders[$t['member_id']]['amount'] + $this_order_data['amount'];
  90. $this->insert_data[$kk] = $this_insert_data;
  91. }
  92. return $data;
  93. }
  94. function getFirst($tree, $orders)
  95. {
  96. foreach($tree as $kk => $t){
  97. if(empty($t['son'])) {
  98. continue;
  99. }
  100. if (empty($this->insert_data[$kk])) {
  101. if (empty($t['member_id'])) {
  102. //todo 有出现某会员在yz_member找不到(被删了),但有其他会员的parent_id还是该会员的id,导致下面uid为null,插入数据失败
  103. continue;
  104. }
  105. $this->insert_data[$kk] = [
  106. 'uid'=> $t['member_id'],
  107. 'uniacid'=>\YunShop::app()->uniacid,
  108. 'first_order_quantity'=>0,
  109. 'first_order_amount'=>0,
  110. 'second_order_quantity'=>0,
  111. 'second_order_amount'=>0,
  112. 'third_order_quantity'=>0,
  113. 'third_order_amount'=>0,
  114. 'team_order_quantity'=>0,
  115. 'team_order_amount'=>0,
  116. 'pay_count'=>0,
  117. 'created_at'=>time()
  118. ];
  119. }
  120. foreach ($t['son'] as $first) {
  121. $this->insert_data[$kk]['first_order_quantity'] += $orders[$first['member_id']]['count'];
  122. $this->insert_data[$kk]['first_order_amount'] += $orders[$first['member_id']]['amount'];
  123. if(!isset($first['son'])) {
  124. continue;
  125. }
  126. foreach ($first['son'] as $second) {
  127. $this->insert_data[$kk]['second_order_quantity'] += $orders[$second['member_id']]['count'];
  128. $this->insert_data[$kk]['second_order_amount'] += $orders[$second['member_id']]['amount'];
  129. if(!isset($second['son'])) {
  130. continue;
  131. }
  132. foreach ($second['son'] as $third) {
  133. $this->insert_data[$kk]['third_order_quantity'] += $orders[$third['member_id']]['count'];
  134. $this->insert_data[$kk]['third_order_amount'] += $orders[$third['member_id']]['amount'];
  135. }
  136. }
  137. }
  138. }
  139. }
  140. public function memberOrder1(){
  141. $time = time();
  142. \Log::debug('下线订单排行定时任务开始执行,公众号id为', \YunShop::app()->uniacid);
  143. $insert_data = [];
  144. $order_data = DB::table('yz_order')
  145. ->selectRaw('uid, SUM(price) as amount, COUNT(id) as count')
  146. ->where('status', 3)
  147. ->where('uniacid', \YunShop::app()->uniacid)
  148. ->groupBy('uid')
  149. ->get();
  150. $members = DB::select('select member_id from '. DB::getTablePrefix() . 'yz_member where uniacid =' . \YunShop::app()->uniacid );
  151. $child = DB::table('yz_member_children')
  152. ->select(['child_id','member_id', 'level'])
  153. ->where('uniacid', \YunShop::app()->uniacid)
  154. ->get();
  155. foreach ($members as $key => $member) {
  156. $this_insert_data = [
  157. 'uid'=>$member['member_id'],
  158. 'uniacid'=>\YunShop::app()->uniacid,
  159. 'created_at'=>$time,
  160. 'first_order_quantity'=>0,
  161. 'first_order_amount'=>0,
  162. 'second_order_quantity'=>0,
  163. 'second_order_amount'=>0,
  164. 'third_order_quantity'=>0,
  165. 'third_order_amount'=>0,
  166. 'team_order_quantity'=>0,
  167. 'team_order_amount'=>0,
  168. 'pay_count'=>0,
  169. ];
  170. $total_member = $child->where('member_id', $member['member_id'])->pluck('child_id');
  171. if (!$total_member->isEmpty()) {
  172. $this_insert_data['team_order_quantity'] = $order_data->whereIn('uid', $total_member)->sum('count');
  173. $this_insert_data['team_order_amount'] = $order_data->whereIn('uid', $total_member)->sum('amount');
  174. $first_member = $child->where('level',1)->where('member_id', $member['member_id'])->pluck('child_id');
  175. if (!$first_member->isEmpty()) {
  176. $this_insert_data['first_order_quantity'] = $order_data->whereIn('uid', $first_member)->sum('count');
  177. $this_insert_data['first_order_amount'] = $order_data->whereIn('uid', $first_member)->sum('amount');
  178. }
  179. $second_member = $child->where('level',2)->where('member_id', $member['member_id'])->pluck('child_id');
  180. if (!$second_member->isEmpty()) {
  181. $this_insert_data['second_order_quantity'] = $order_data->whereIn('uid', $second_member)->sum('count');
  182. $this_insert_data['second_order_amount'] = $order_data->whereIn('uid', $second_member)->sum('amount');
  183. }
  184. $third_member = $child->where('level',3)->where('member_id', $member['member_id'])->pluck('child_id');
  185. if (!$third_member->isEmpty()) {
  186. $this_insert_data['third_order_quantity'] = $order_data->whereIn('uid', $third_member)->sum('count');
  187. $this_insert_data['third_order_amount'] = $order_data->whereIn('uid', $third_member)->sum('amount');
  188. }
  189. }
  190. $insert_data[$key] = $this_insert_data;
  191. unset($this_insert_data);
  192. }
  193. $insert_data = array_chunk($insert_data,2000);
  194. foreach ($insert_data as $k=>$v){
  195. MemberLowerOrder::insert($v);
  196. }
  197. \Log::debug('下线订单排行定时任务执行结束,公众号id为', \YunShop::app()->uniacid);
  198. }
  199. public function memberOrder2(){
  200. $time = time();
  201. $insert_data = [];
  202. $order_data = DB::select('select uid, SUM(price) as amount, COUNT(id) as count from '. DB::getTablePrefix() . 'yz_order where status = 3 and uniacid =' . \YunShop::app()->uniacid .' group by uid');
  203. $order_data = array_column($order_data, null, 'uid');
  204. $members = DB::select('select member_id from '. DB::getTablePrefix() . 'yz_member where uniacid =' . \YunShop::app()->uniacid );
  205. foreach ($members as $v){
  206. $this_insert_data = [
  207. 'uid'=>$v['member_id'],
  208. 'uniacid'=>\YunShop::app()->uniacid,
  209. 'first_order_quantity'=>0,
  210. 'first_order_amount'=>0,
  211. 'second_order_quantity'=>0,
  212. 'second_order_amount'=>0,
  213. 'third_order_quantity'=>0,
  214. 'third_order_amount'=>0,
  215. 'team_order_quantity'=>0,
  216. 'team_order_amount'=>0,
  217. 'pay_count'=>0,
  218. 'created_at'=>$time
  219. ];
  220. $child = DB::table('yz_member_children')
  221. ->select(['child_id','level'])
  222. ->where('member_id',$v['member_id'])
  223. ->where('uniacid', \YunShop::app()->uniacid)
  224. ->get()
  225. ->toArray();
  226. if (!empty($child)) {
  227. $this_child = array_column($child, 'level', 'child_id');
  228. foreach ($this_child as $kk => $vv){
  229. if (!isset($order_data[$kk])) continue;
  230. $this_order_data = $order_data[$kk];
  231. $this_insert_data['pay_count']++;
  232. $this_insert_data['team_order_quantity'] += $this_order_data['count'];
  233. $this_insert_data['team_order_amount'] += $this_order_data['amount'];
  234. if ($vv > 3 ) continue;
  235. switch ($vv){
  236. case 1:
  237. $this_insert_data['first_order_quantity'] += $this_order_data['count'];
  238. $this_insert_data['first_order_amount'] += $this_order_data['amount'];
  239. break;
  240. case 2:
  241. $this_insert_data['second_order_quantity'] += $this_order_data['count'];
  242. $this_insert_data['second_order_amount'] += $this_order_data['amount'];
  243. break;
  244. case 3:
  245. $this_insert_data['third_order_quantity'] += $this_order_data['count'];
  246. $this_insert_data['third_order_amount'] += $this_order_data['amount'];
  247. }
  248. }
  249. }
  250. $insert_data[] = $this_insert_data;
  251. }
  252. $insert_data = array_chunk($insert_data,2000);
  253. foreach ($insert_data as $k=>$v){
  254. MemberLowerOrder::insert($v);
  255. }
  256. }
  257. }