ForceSubscribeUsers.php 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512
  1. <?php
  2. namespace App\Modules\OfficialAccount\Models;
  3. use Illuminate\Database\Eloquent\Model;
  4. use App\Modules\OfficialAccount\Models\TempForceSubscribeUsers;
  5. use DB;
  6. use App\Modules\User\Services\UserService;
  7. class ForceSubscribeUsers extends Model
  8. {
  9. protected $connection = 'api_mysql';
  10. protected $tables = 'force_subscribe_users';
  11. protected $fillable = ['uid', 'official_account_id', 'distribution_channel_id', 'appid', 'openid', 'is_subscribed', 'subscribe_time', 'unsubscribe_time', 'last_interactive_time', 'bid', 'send_order_id'];
  12. /**
  13. * 根据openid和appid获取强关用户
  14. */
  15. static function forceSubscribeUsersByAppidAndOpenId($appid, $openid)
  16. {
  17. return self::where(['appid' => isset($appid) ? $appid : '', 'openid' => isset($openid) ? $openid : ''])->first();
  18. }
  19. /**
  20. * 获取所有强关用户
  21. */
  22. static function forceSubscribeUsersAllOf()
  23. {
  24. return self::where('is_subscribed', 1)->get();
  25. }
  26. /**
  27. * 修改公众号迁移用户数据
  28. */
  29. static function updateSubscribeUserTransfer($distribution_channel_id,$uid,$from_appid,$to_appid,$to_openid){
  30. return self::where(['distribution_channel_id'=>$distribution_channel_id,'uid'=>$uid,'appid'=>$from_appid])->update(['appid'=>$to_appid,'openid'=>$to_openid,'updated_at'=>date('Y-m-d H:i:s')]);
  31. }
  32. /**
  33. * 根据uid获取强关用户
  34. */
  35. static function forceSubscribeUsersByUid($uid)
  36. {
  37. return self::where(['uid' => $uid, 'is_subscribed' => 1])->first();
  38. }
  39. /**
  40. * 根据uid获取强关用户
  41. */
  42. static function allForceSubscribeUsersByUid($uid)
  43. {
  44. return self::where(['uid' => $uid, 'is_subscribed' => 1])->get();
  45. }
  46. /**
  47. * 根据distribution_channel_id获取强关用户
  48. */
  49. static function forceSubscribeUsersByChannelidAndTimeset($distribution_channel_id, $timeset)
  50. {
  51. $lastTime = date('Y-m-d H:i:s', time() - $timeset);
  52. return self::where(['distribution_channel_id' => $distribution_channel_id, 'is_subscribed' => 1])->where('last_interactive_time', '<', $lastTime)->get();
  53. }
  54. /**
  55. * 根据distribution_channel_id获取强关用户
  56. */
  57. static function forceSubscribeNewUsersByTimeset($distribution_channel_id, $timeset)
  58. {
  59. $lastTime = date('Y-m-d H:i:s', time() - $timeset);
  60. return self::where(['distribution_channel_id' => $distribution_channel_id, 'is_subscribed' => 1])->where('created_at', '<', $lastTime)->where('created_at', '>', date('Y-m-d H:i:s', strtotime('-2 day')))->get();
  61. // return self::where(['distribution_channel_id'=>$distribution_channel_id,'is_subscribed'=>1])->where('created_at','<',$lastTime)->get();
  62. }
  63. /**
  64. * 根据distribution_channel_id获取未付费的强关用户
  65. */
  66. static function forceSubscribeNewUnpaidUsersByTime($distribution_channel_id, $start_time,$end_time)
  67. {
  68. // return self::where('distribution_channel_id',$distribution_channel_id)
  69. // ->where('is_subscribed', 1)
  70. // ->where('created_at', '<', $end_time)
  71. // ->where('created_at', '>=', $start_time)
  72. // ->whereNotExists(function ($query) {
  73. // $query->select('uid')
  74. // ->from('orders')
  75. // ->where('orders.uid', '=', 'force_subscribe_users.uid') // TODO用框架这里有bug
  76. // ->where('orders.status', 'PAID')
  77. // ->limit(1);
  78. // })->skip(0)->take(20000)->get();
  79. $data = DB::select(
  80. "select force_subscribe_users.* from force_subscribe_users
  81. where distribution_channel_id = '{$distribution_channel_id}'
  82. and is_subscribed = 1
  83. and created_at < '{$end_time}'
  84. and created_at >= '{$start_time}'
  85. and not exists (select uid from orders where orders.uid=force_subscribe_users.uid and orders.status='PAID' limit 1 )
  86. limit 20000
  87. "
  88. );
  89. return object_to_array($data);
  90. }
  91. /**
  92. * 根据uid和appid获取强关用户
  93. */
  94. static function forceSubscribeUsersByUidAndAppidAndChannelId($uid, $appid, $distribution_channel_id)
  95. {
  96. $query = self::where(['uid' => $uid, 'distribution_channel_id' => $distribution_channel_id, 'is_subscribed' => 1]);
  97. $appidArray = explode(',', $appid);
  98. return $query->wherein('appid', $appidArray)->get();
  99. }
  100. /**
  101. * 根据uid获取强关用户包括取关的用户
  102. */
  103. static function forceSubscribeUsersByUidIncludeCancel($uid)
  104. {
  105. return self::where(['uid' => $uid])->first();
  106. }
  107. /**
  108. * 根据openid获取一个强关用户
  109. */
  110. static function forceSubscribeUsersByOpenid($openid, $appid = '')
  111. {
  112. return self::where(['openid' => $openid, 'is_subscribed' => 1])->first();
  113. }
  114. /**
  115. * openid获取强关用户
  116. */
  117. static function getOneForceSubscribeUsersByOpenid($openid)
  118. {
  119. return self::where('openid', $openid)->first();
  120. }
  121. /**
  122. * 根据openid获取所有强关用户
  123. */
  124. static function forceAllSubscribeUsersByOpenid($openid)
  125. {
  126. return self::where(['openid' => $openid, 'is_subscribed' => 1])->get();
  127. }
  128. /**
  129. * 根据openid获取强关用户
  130. */
  131. static function forceSubscribeUsersByOpenidAndAC($openid, $appid = '', $distribution_channel_id = '')
  132. {
  133. $query = self::where('openid', $openid);
  134. if ($appid) {
  135. # code...
  136. $query->where('appid', $appid);
  137. }
  138. if ($distribution_channel_id) {
  139. # code...
  140. $query->where('distribution_channel_id', $distribution_channel_id);
  141. }
  142. return $query->first();
  143. }
  144. /**
  145. * 根据渠道号和日期获取强关用户数量
  146. */
  147. static function forceSubscribeUserCountByChannelIdAndDate($distribution_channel_id, $startTime = '', $endTime = '')
  148. {
  149. $query = self::orderBy('id', 'desc');
  150. $distribution_channel_id && $query->where('distribution_channel_id', $distribution_channel_id);
  151. if ($startTime && $endTime) {
  152. $query->where('created_at', '>=', date('Y-m-d H:i:s', strtotime($startTime)))->where('created_at', '<', date('Y-m-d H:i:s', strtotime($endTime) + 1 * 86400));
  153. } elseif ($startTime) {
  154. # code...
  155. $end_time = date("Y-m-d",strtotime($startTime)+86400);
  156. //$query->whereDate('created_at', $startTime);
  157. $query->where('created_at', '>=',$startTime)->where('created_at', '<',$end_time);
  158. } elseif ($endTime) {
  159. # code...
  160. $end_time = date("Y-m-d",strtotime($endTime)+86400);
  161. //$query->whereDate('created_at', $endTime);
  162. $query->where('created_at', '>=',$endTime)->where('created_at', '<',$end_time);
  163. }
  164. return $query->count();
  165. }
  166. /**
  167. * 根据openid获取强关用户
  168. */
  169. static function forceSubscribeUsersByOpenidAndChannelId($openid, $distribution_channel_id)
  170. {
  171. return self::where(['openid' => $openid, 'distribution_channel_id' => $distribution_channel_id])->first();
  172. }
  173. /**
  174. * 根据openid获取一个取关用户
  175. */
  176. static function forceUnSubscribeUsersByOpenid($openid)
  177. {
  178. return self::where(['openid' => $openid, 'is_subscribed' => 0])->first();
  179. }
  180. /**
  181. * 根据openid获取全部取关用户
  182. */
  183. static function forceAllUnSubscribeUsersByOpenid($openid)
  184. {
  185. return self::where(['openid' => $openid, 'is_subscribed' => 0])->get();
  186. }
  187. /**
  188. * 根据appid获取强关用户
  189. */
  190. static function forceSubscribeUsersByAppid($appid)
  191. {
  192. return self::where(['appid' => $appid, 'is_subscribed' => 1])->get();
  193. }
  194. /**
  195. * 根据appid获取强关用户数量
  196. */
  197. static function forceSubscribeUsersCountByAppid($appid)
  198. {
  199. return self::where(['appid' => $appid, 'is_subscribed' => 1])->count();
  200. }
  201. /**
  202. * 根据appid获取今日新增粉丝数
  203. */
  204. static function todayForceSubscribeUsers($appid)
  205. {
  206. // dd($appid);
  207. // return 0;
  208. $subscribe_time = date("Y-m-d");
  209. $end_time = date("Y-m-d",strtotime($subscribe_time)+86400);
  210. //return self::where(['appid' => $appid, 'is_subscribed' => 1])->whereDate('subscribe_time', $subscribe_time)->count();
  211. return self::where(['appid' => $appid, 'is_subscribed' => 1])->where('subscribe_time', '>=',$subscribe_time)->where('subscribe_time', '<',$end_time)->count();
  212. }
  213. /**
  214. * 根据appid获取粉丝总数
  215. */
  216. static function allForceSubscribeUsers($appid)
  217. {
  218. return self::where(['appid' => $appid, 'is_subscribed' => 1])->count();
  219. }
  220. //获取推广带来的净关粉丝总数
  221. static function getFansNum($send_order_id)
  222. {
  223. return self::where('send_order_id', $send_order_id)->where('is_subscribed', 1)->count();
  224. }
  225. //获取推广带来的新关粉丝总数
  226. static function getNewFansNum($send_order_id)
  227. {
  228. return self::where('send_order_id', $send_order_id)->count();
  229. }
  230. //根据模板消息传的各项条件检索用户
  231. static function forceUserCountByTemplatePrams($appids, $distribution_channel_id, $subscribe_time = '', $sex = '', $balance = '', $category_id = '', $order_type = '', $skip = 0)
  232. {
  233. $query = self::leftJoin('users', 'users.id', '=', 'force_subscribe_users.uid')
  234. ->select('force_subscribe_users.id', 'force_subscribe_users.uid', 'force_subscribe_users.official_account_id', 'force_subscribe_users.distribution_channel_id', 'force_subscribe_users.appid', 'force_subscribe_users.openid', 'force_subscribe_users.is_subscribed', 'force_subscribe_users.subscribe_time', 'force_subscribe_users.unsubscribe_time', 'force_subscribe_users.last_interactive_time', 'force_subscribe_users.bid',
  235. 'users.nickname');
  236. $query->where('force_subscribe_users.distribution_channel_id', $distribution_channel_id);
  237. $query->where('force_subscribe_users.is_subscribed', 1);
  238. $appidArray = explode(',', $appids);
  239. $query->wherein('force_subscribe_users.appid', $appidArray);
  240. if ($subscribe_time) {
  241. # code...
  242. switch ($subscribe_time) {
  243. case 'a':
  244. # code...
  245. $selTime = date('Y-m-d H:i:s', strtotime('-5 day'));
  246. $query->where('subscribe_time', '>', $selTime);
  247. break;
  248. case 'b':
  249. # code...
  250. $selTimeStart = date('Y-m-d H:i:s', strtotime('-5 day'));
  251. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-15 day'));
  252. $query->where('subscribe_time', '<=', $selTimeStart);
  253. $query->where('subscribe_time', '>', $selTimeEnd);
  254. break;
  255. case 'c':
  256. # code...
  257. $selTimeStart = date('Y-m-d H:i:s', strtotime('-15 day'));
  258. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-30 day'));
  259. $query->where('subscribe_time', '<=', $selTimeStart);
  260. $query->where('subscribe_time', '>', $selTimeEnd);
  261. break;
  262. case 'd':
  263. # code...
  264. $selTimeStart = date('Y-m-d H:i:s', strtotime('-30 day'));
  265. $query->where('subscribe_time', '<=', $selTimeStart);
  266. break;
  267. case 'e':
  268. # code...
  269. $selTimeStart = date('Y-m-d H:i:s', strtotime('-1 day'));
  270. $selTimeEnd = date('Y-m-d H:i:s');
  271. $query->where('subscribe_time', '<=', $selTimeEnd);
  272. $query->where('subscribe_time', '>', $selTimeStart);
  273. break;
  274. case 'f':
  275. # code...
  276. $selTimeStart = date('Y-m-d H:i:s', strtotime('-2 day'));
  277. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-1 day'));
  278. $query->where('subscribe_time', '<=', $selTimeEnd);
  279. $query->where('subscribe_time', '>', $selTimeStart);
  280. break;
  281. default:
  282. # code...
  283. break;
  284. }
  285. }
  286. if ($sex || $balance) {
  287. if ($sex) {
  288. # code...
  289. switch ($sex) {
  290. case 'a':
  291. # code...
  292. $query->where('users.sex', 1);
  293. break;
  294. case 'b':
  295. # code...
  296. $query->where('users.sex', 2);
  297. break;
  298. default:
  299. # code...
  300. break;
  301. }
  302. }
  303. if ($balance) {
  304. # code...
  305. switch ($balance) {
  306. case 'a':
  307. # code...
  308. $query->where('users.balance', '<', 500);
  309. break;
  310. case 'b':
  311. # code...
  312. $query->where('users.balance', '>=', 500);
  313. $query->where('users.balance', '<', 2000);
  314. break;
  315. case 'c':
  316. # code...
  317. $query->where('users.balance', '>=', 2000);
  318. $query->where('users.balance', '<', 5000);
  319. break;
  320. default:
  321. # code...
  322. break;
  323. }
  324. }
  325. }
  326. if ($category_id) {
  327. if ($category_id != 'z') {
  328. # code...
  329. $query->join('books', 'force_subscribe_users.bid', '=','books.id');
  330. $categoryArray = explode(',', $category_id);
  331. $query->wherein('books.category_id', $categoryArray);
  332. // $query->where('books.category_id',$category_id);
  333. }
  334. }
  335. if ($order_type) {
  336. switch ($order_type) {
  337. case 'a':
  338. # code...
  339. //未消费用户
  340. $query->whereNotExists(function ($query) {
  341. $query->select(DB::raw(1))
  342. ->from('orders')
  343. ->whereRaw('orders.uid =force_subscribe_users.uid')
  344. ->whereRaw('orders.status="PAID"')
  345. ->limit(1);
  346. });
  347. break;
  348. case 'b':
  349. # code...
  350. //已消费用户
  351. $query->whereExists(function ($query) {
  352. $query->select(DB::raw(1))
  353. ->from('orders')
  354. ->whereRaw('orders.uid=force_subscribe_users.uid')
  355. ->whereRaw('orders.status="PAID"')
  356. ->limit(1);
  357. });
  358. break;
  359. case 'c':
  360. # code...
  361. //包年用户
  362. $query->whereExists(function ($query) {
  363. $query->select('uid')
  364. ->from('year_orders')
  365. ->whereRaw('year_orders.uid = force_subscribe_users.uid')
  366. ->where('year_orders.begin_time', '<', date('Y-m-d H:i:s'))
  367. ->where('year_orders.end_time', '>', date('Y-m-d H:i:s'))
  368. ->limit(1);
  369. });
  370. break;
  371. case 'd':
  372. # code...
  373. //昨天消费用户
  374. $query->whereExists(function ($query) {
  375. $query->select('uid')
  376. ->from('orders')
  377. ->whereRaw('orders.uid=force_subscribe_users.uid')
  378. ->whereRaw('orders.status="PAID"')
  379. ->where('orders.created_at', '>=',date('Y-m-d',strtotime('-1 day')))
  380. ->where('orders.created_at', '<',date('Y-m-d'))
  381. ->limit(1);
  382. });
  383. break;
  384. default:
  385. # code...
  386. break;
  387. }
  388. }
  389. // dd($query->get());
  390. return $query->skip($skip)->take(10000)->get();
  391. }
  392. //根据客服消息传的各项条件检索用户,精确到appid级别
  393. static function forceUserCountByCustomPrams($appids, $distribution_channel_id, $subscribe_time = '', $sex = '', $balance = '', $category_id = '', $order_type = '', $sign_time = '', $skip = 0)
  394. {
  395. $canSendDate = date('Y-m-d H:i:s', strtotime('-2 day'));
  396. # 缓存表
  397. $query = TempForceSubscribeUsers::select('temp_force_subscribe_users.id', 'temp_force_subscribe_users.uid', 'temp_force_subscribe_users.distribution_channel_id', 'temp_force_subscribe_users.appid', 'temp_force_subscribe_users.openid',
  398. 'temp_force_subscribe_users.is_subscribed', 'temp_force_subscribe_users.subscribe_time', 'temp_force_subscribe_users.unsubscribe_time', 'temp_force_subscribe_users.last_interactive_time', 'temp_force_subscribe_users.bid');
  399. $query->where('temp_force_subscribe_users.last_interactive_time', '>', $canSendDate);
  400. $query->where('temp_force_subscribe_users.distribution_channel_id', $distribution_channel_id);
  401. $query->where('temp_force_subscribe_users.is_subscribed', 1);
  402. $appidArray = explode(',', $appids);
  403. $query->wherein('temp_force_subscribe_users.appid', $appidArray);
  404. if ($subscribe_time) {
  405. # code...
  406. switch ($subscribe_time) {
  407. case 'a':
  408. # code...
  409. $selTime = date('Y-m-d H:i:s', strtotime('-5 day'));
  410. $query->where('subscribe_time', '>', $selTime);
  411. break;
  412. case 'b':
  413. # code...
  414. $selTimeStart = date('Y-m-d H:i:s', strtotime('-5 day'));
  415. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-15 day'));
  416. $query->where('subscribe_time', '<=', $selTimeStart);
  417. $query->where('subscribe_time', '>', $selTimeEnd);
  418. break;
  419. case 'c':
  420. # code...
  421. $selTimeStart = date('Y-m-d H:i:s', strtotime('-15 day'));
  422. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-30 day'));
  423. $query->where('subscribe_time', '<=', $selTimeStart);
  424. $query->where('subscribe_time', '>', $selTimeEnd);
  425. break;
  426. case 'd':
  427. # code...
  428. $selTimeStart = date('Y-m-d H:i:s', strtotime('-30 day'));
  429. $query->where('subscribe_time', '<=', $selTimeStart);
  430. break;
  431. case 'e':
  432. # code...
  433. $selTimeStart = date('Y-m-d H:i:s', strtotime('-1 day'));
  434. $selTimeEnd = date('Y-m-d H:i:s');
  435. $query->where('subscribe_time', '<=', $selTimeEnd);
  436. $query->where('subscribe_time', '>', $selTimeStart);
  437. break;
  438. case 'f':
  439. # code...
  440. $selTimeStart = date('Y-m-d H:i:s', strtotime('-2 day'));
  441. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-1 day'));
  442. $query->where('subscribe_time', '<=', $selTimeEnd);
  443. $query->where('subscribe_time', '>', $selTimeStart);
  444. break;
  445. case 'g':
  446. # 客服消息专用,24小时前的老用户,不发给新用户
  447. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-1 day'));
  448. $query->where('subscribe_time', '<=', $selTimeEnd);
  449. break;
  450. case 'h':
  451. // 关注10-50分钟之间
  452. $selTimeStart = date('Y-m-d H:i:s', strtotime('-50 min'));
  453. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-10 min'));
  454. $query->where('subscribe_time', '<=', $selTimeEnd);
  455. $query->where('subscribe_time', '>', $selTimeStart);
  456. break;
  457. case 'i':
  458. # 关注时间 36小时-48小时
  459. $selTimeStart = date('Y-m-d H:i:s', strtotime('-48 hour'));
  460. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-36 hour'));
  461. $query->where('subscribe_time', '<=', $selTimeEnd);
  462. $query->where('subscribe_time', '>', $selTimeStart);
  463. break;
  464. case 'j':
  465. # 关注时间 20小时-48小时
  466. $selTimeStart = date('Y-m-d H:i:s', strtotime('-48 hour'));
  467. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-20 hour'));
  468. $query->where('subscribe_time', '<=', $selTimeEnd);
  469. $query->where('subscribe_time', '>', $selTimeStart);
  470. break;
  471. case 'k':
  472. # 关注时间 42小时-48小时
  473. $selTimeStart = date('Y-m-d H:i:s', strtotime('-48 hour'));
  474. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-42 hour'));
  475. $query->where('subscribe_time', '<=', $selTimeEnd);
  476. $query->where('subscribe_time', '>', $selTimeStart);
  477. break;
  478. case 'l':
  479. # 关注时间 12小时-48小时
  480. $selTimeStart = date('Y-m-d H:i:s', strtotime('-48 hour'));
  481. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-12 hour'));
  482. $query->where('subscribe_time', '<=', $selTimeEnd);
  483. $query->where('subscribe_time', '>', $selTimeStart);
  484. break;
  485. default:
  486. # code...
  487. break;
  488. }
  489. }
  490. if ($sex || $balance) {
  491. # code...
  492. $query->join('users', 'temp_force_subscribe_users.uid', '=', 'users.id');
  493. if ($sex) {
  494. # code...
  495. switch ($sex) {
  496. case 'a':
  497. # code...
  498. $query->where('users.sex', 1);
  499. break;
  500. case 'b':
  501. # code...
  502. $query->where('users.sex', 2);
  503. break;
  504. default:
  505. # code...
  506. break;
  507. }
  508. }
  509. if ($balance) {
  510. # code...
  511. switch ($balance) {
  512. case 'a':
  513. # code...
  514. $query->where('users.balance', '<', 500);
  515. break;
  516. case 'b':
  517. # code...
  518. $query->where('users.balance', '>=', 500);
  519. $query->where('users.balance', '<', 2000);
  520. break;
  521. case 'c':
  522. # code...
  523. $query->where('users.balance', '>=', 2000);
  524. $query->where('users.balance', '<', 5000);
  525. break;
  526. default:
  527. # code...
  528. break;
  529. }
  530. }
  531. }
  532. if ($category_id) {
  533. if ($category_id != 'z') {
  534. # code...
  535. $query->join('books', 'temp_force_subscribe_users.bid','=', 'books.id');
  536. $categoryArray = explode(',', $category_id);
  537. $query->wherein('books.category_id', $categoryArray);
  538. // $query->where('books.category_id',$category_id);
  539. }
  540. }
  541. if ($order_type) {
  542. switch ($order_type) {
  543. case 'a':
  544. # code...
  545. //未消费用户
  546. $query->whereNotExists(function ($query) {
  547. $query->select(DB::raw(1))
  548. ->from('orders')
  549. ->whereRaw('orders.uid =temp_force_subscribe_users.uid')
  550. ->whereRaw('orders.status="PAID"')
  551. ->limit(1);
  552. });
  553. break;
  554. case 'b':
  555. # code...
  556. //已消费用户
  557. $query->whereExists(function ($query) {
  558. $query->select(DB::raw(1))
  559. ->from('orders')
  560. ->whereRaw('orders.uid =temp_force_subscribe_users.uid')
  561. ->whereRaw('orders.status="PAID"')
  562. ->limit(1);
  563. });
  564. break;
  565. case 'c':
  566. # code...
  567. //包年用户
  568. $query->whereExists(function ($query) {
  569. $query->select(DB::raw(1))
  570. ->from('year_orders')
  571. ->whereRaw('year_orders.uid = temp_force_subscribe_users.uid')
  572. ->where('year_orders.begin_time', '<', date('Y-m-d H:i:s'))
  573. ->where('year_orders.end_time', '>', date('Y-m-d H:i:s'))
  574. ->limit(1);
  575. });
  576. break;
  577. case 'd':
  578. # code...
  579. //6-13小时之间有过订阅记录
  580. $query->whereExists(function ($query) {
  581. $query->select(DB::raw(1))
  582. ->from('orders')
  583. ->whereRaw('orders.uid =temp_force_subscribe_users.uid')
  584. ->whereRaw('orders.status="PAID"')
  585. ->where('orders.created_at','>',date('Y-m-d H:i:s', strtotime('-13 hour')))
  586. ->where('orders.created_at','<=',date('Y-m-d H:i:s', strtotime('-6 hour')))
  587. ->limit(1);
  588. });
  589. break;
  590. default:
  591. # code...
  592. break;
  593. }
  594. }
  595. if ($sign_time) {
  596. switch ($sign_time) {
  597. case 'a':
  598. //签到 60-90分钟内
  599. $query->whereExists(function ($query) {
  600. $query->select(DB::raw(1))
  601. ->from('smart_push_user_sign')
  602. ->whereRaw('smart_push_user_sign.uid =temp_force_subscribe_users.uid')
  603. ->where('smart_push_user_sign.sign_time', '<', (microtime(true) - 60*60))
  604. ->where('smart_push_user_sign.sign_time', '>', (microtime(true) - 60*90))
  605. ->limit(1);
  606. });
  607. break;
  608. default:
  609. break;
  610. }
  611. }
  612. // 单次获取1w,改动此数值,必须更改CustomMsgService下SmartPush方法内对应数值
  613. return $query->skip($skip)->take(10000)->get();
  614. }
  615. //根据客服消息传的各项条件检索用户,精确到appid级别
  616. static function forceUserCountByBatchWechatCustomPrams($appids, $distribution_channel_id, $subscribe_time = '', $sex = '', $balance = '', $category_id = '', $order_type = '', $sign_time = '', $interaction_time = '', $skip = 0)
  617. {
  618. $canSendDate = date('Y-m-d H:i:s', strtotime('-2 day'));
  619. # 缓存表
  620. $query = ForceSubscribeUsers::select('force_subscribe_users.id', 'force_subscribe_users.uid', 'force_subscribe_users.distribution_channel_id', 'force_subscribe_users.appid', 'force_subscribe_users.openid',
  621. 'force_subscribe_users.is_subscribed', 'force_subscribe_users.subscribe_time', 'force_subscribe_users.unsubscribe_time', 'force_subscribe_users.last_interactive_time', 'force_subscribe_users.bid');
  622. // $query->where('force_subscribe_users.last_interactive_time', '>', $canSendDate);
  623. $query->where('force_subscribe_users.distribution_channel_id', $distribution_channel_id);
  624. $query->where('force_subscribe_users.is_subscribed', 1);
  625. $appidArray = explode(',', $appids);
  626. $query->wherein('force_subscribe_users.appid', $appidArray);
  627. if ($subscribe_time) {
  628. # code...
  629. switch ($subscribe_time) {
  630. case 'a':
  631. # code...
  632. $selTime = date('Y-m-d H:i:s', strtotime('-1 day'));
  633. $query->where('subscribe_time', '>', $selTime);
  634. break;
  635. case 'b':
  636. # code...
  637. $selTimeStart = date('Y-m-d H:i:s', strtotime('-1 day'));
  638. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-3 day'));
  639. $query->where('subscribe_time', '<=', $selTimeStart);
  640. $query->where('subscribe_time', '>', $selTimeEnd);
  641. break;
  642. case 'c':
  643. # code...
  644. $selTimeStart = date('Y-m-d H:i:s', strtotime('-3 day'));
  645. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-5 day'));
  646. $query->where('subscribe_time', '<=', $selTimeStart);
  647. $query->where('subscribe_time', '>', $selTimeEnd);
  648. break;
  649. case 'd':
  650. # code...
  651. $selTimeStart = date('Y-m-d H:i:s', strtotime('-5 day'));
  652. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-7 day'));
  653. $query->where('subscribe_time', '<=', $selTimeStart);
  654. $query->where('subscribe_time', '>', $selTimeEnd);
  655. break;
  656. case 'e':
  657. # code...
  658. $selTimeStart = date('Y-m-d H:i:s', strtotime('-7 day'));
  659. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-14 day'));
  660. $query->where('subscribe_time', '<=', $selTimeStart);
  661. $query->where('subscribe_time', '>', $selTimeEnd);
  662. break;
  663. case 'f':
  664. # code...
  665. $selTimeStart = date('Y-m-d H:i:s', strtotime('-14 day'));
  666. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-30 day'));
  667. $query->where('subscribe_time', '<=', $selTimeStart);
  668. $query->where('subscribe_time', '>', $selTimeEnd);
  669. break;
  670. case 'g':
  671. # code...
  672. $selTimeStart = date('Y-m-d H:i:s', strtotime('-30 day'));
  673. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-60 day'));
  674. $query->where('subscribe_time', '<=', $selTimeStart);
  675. $query->where('subscribe_time', '>', $selTimeEnd);
  676. break;
  677. case 'h':
  678. # code...
  679. $selTimeStart = date('Y-m-d H:i:s', strtotime('-60 day'));
  680. $query->where('subscribe_time', '<=', $selTimeStart);
  681. break;
  682. default:
  683. # code...
  684. break;
  685. }
  686. }
  687. // 互动时间
  688. if ($interaction_time) {
  689. # code...
  690. switch ($interaction_time) {
  691. case 'a':
  692. # code...
  693. $selTimeStart = date('Y-m-d H:i:s', strtotime('-2 day'));
  694. $query->where('last_interactive_time', '>', $selTimeStart);
  695. break;
  696. case 'b':
  697. # code...
  698. $selTimeStart = date('Y-m-d H:i:s', strtotime('-2 day'));
  699. $query->where('last_interactive_time', '<=', $selTimeStart);
  700. break;
  701. default:
  702. # code...
  703. break;
  704. }
  705. }
  706. if ($sex || $balance) {
  707. # code...
  708. $query->join('users', 'force_subscribe_users.uid', '=', 'users.id');
  709. if ($sex) {
  710. # code...
  711. switch ($sex) {
  712. case 'a':
  713. # code...
  714. $query->where('users.sex', 1);
  715. break;
  716. case 'b':
  717. # code...
  718. $query->where('users.sex', 2);
  719. break;
  720. default:
  721. # code...
  722. break;
  723. }
  724. }
  725. if ($balance) {
  726. # code...
  727. switch ($balance) {
  728. case 'a':
  729. # code...
  730. $query->where('users.balance', '<', 500);
  731. break;
  732. case 'b':
  733. # code...
  734. $query->where('users.balance', '>=', 500);
  735. $query->where('users.balance', '<', 2000);
  736. break;
  737. case 'c':
  738. # code...
  739. $query->where('users.balance', '>=', 2000);
  740. $query->where('users.balance', '<', 5000);
  741. break;
  742. default:
  743. # code...
  744. break;
  745. }
  746. }
  747. }
  748. // 书籍分类
  749. if ($category_id) {
  750. if ($category_id != 'z') {
  751. # code...
  752. $query->join('books', 'force_subscribe_users.bid','=', 'books.id');
  753. $categoryArray = explode(',', $category_id);
  754. $query->wherein('books.category_id', $categoryArray);
  755. // $query->where('books.category_id',$category_id);
  756. }
  757. }
  758. if ($order_type) {
  759. switch ($order_type) {
  760. case 'a':
  761. # code...
  762. //未消费用户
  763. $query->whereNotExists(function ($query) {
  764. $query->select(DB::raw(1))
  765. ->from('orders')
  766. ->whereRaw('orders.uid = force_subscribe_users.uid')
  767. ->whereRaw('orders.status="PAID"')
  768. ->limit(1);
  769. });
  770. break;
  771. case 'b':
  772. # code...
  773. //已消费用户
  774. $query->whereExists(function ($query) {
  775. $query->select(DB::raw(1))
  776. ->from('orders')
  777. ->whereRaw('orders.uid = force_subscribe_users.uid')
  778. ->whereRaw('orders.status="PAID"')
  779. ->limit(1);
  780. });
  781. break;
  782. default:
  783. # code...
  784. break;
  785. }
  786. }
  787. if ($sign_time) {
  788. switch ($sign_time) {
  789. case 'a':
  790. //签到 60-90分钟内
  791. $query->whereExists(function ($query) {
  792. $query->select(DB::raw(1))
  793. ->from('smart_push_user_sign')
  794. ->whereRaw('smart_push_user_sign.uid = force_subscribe_users.uid')
  795. ->where('smart_push_user_sign.sign_time', '<', (microtime(true) - 60*60))
  796. ->where('smart_push_user_sign.sign_time', '>', (microtime(true) - 60*90))
  797. ->limit(1);
  798. });
  799. break;
  800. default:
  801. break;
  802. }
  803. }
  804. // 单次获取1w,改动此数值,必须更改CustomMsgService下SmartPush方法内对应数值
  805. return $query->skip($skip)->take(10000)->get();
  806. }
  807. //指定强关用户获取
  808. static function simpleForceUserCountByPrams($uids, $param=[],$skip = 0)
  809. {
  810. $query = ForceSubscribeUsers::leftjoin('wechat_templates','wechat_templates.appid','=','force_subscribe_users.appid');
  811. $query->select('force_subscribe_users.id', 'force_subscribe_users.uid', 'force_subscribe_users.distribution_channel_id', 'force_subscribe_users.appid', 'force_subscribe_users.openid',
  812. 'force_subscribe_users.is_subscribed', 'force_subscribe_users.subscribe_time','force_subscribe_users.unsubscribe_time', 'force_subscribe_users.last_interactive_time',
  813. 'force_subscribe_users.bid','wechat_templates.template_id');
  814. $query->where('force_subscribe_users.subscribe_time', '>=','2018-11-15');
  815. $query->where('force_subscribe_users.is_subscribed', 1);
  816. $query->wherein('force_subscribe_users.uid', $uids);
  817. $subscribe_time = isset($param['subscribe_time'])?$param['subscribe_time']:'z';
  818. $category_id = isset($param['category_id'])?$param['category_id']:'z';
  819. $sex = isset($param['sex'])?$param['sex']:'';// 不区分
  820. $balance = isset($param['balance'])?$param['balance']:'';
  821. $order_type = isset($param['order_type'])?$param['order_type']:'z';
  822. $sign_time = isset($param['sign_time'])?$param['sign_time']:'z';
  823. $common_template_id = isset($param['common_template_id'])?$param['common_template_id']:'';
  824. if($common_template_id){
  825. $query->where('wechat_templates.common_template_id', $common_template_id);
  826. // $query->select(DB::raw('(select template_id from wechat_templates where appid=force_subscribe_users.appid and common_template_id="'.$common_template_id.'" limit 1) as template_id'));
  827. }
  828. if ($subscribe_time) {
  829. # code...
  830. switch ($subscribe_time) {
  831. case 'a':
  832. # code...
  833. $selTime = date('Y-m-d H:i:s', strtotime('-5 day'));
  834. $query->where('subscribe_time', '>', $selTime);
  835. break;
  836. case 'b':
  837. # code...
  838. $selTimeStart = date('Y-m-d H:i:s', strtotime('-5 day'));
  839. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-15 day'));
  840. $query->where('subscribe_time', '<=', $selTimeStart);
  841. $query->where('subscribe_time', '>', $selTimeEnd);
  842. break;
  843. case 'c':
  844. # code...
  845. $selTimeStart = date('Y-m-d H:i:s', strtotime('-15 day'));
  846. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-30 day'));
  847. $query->where('subscribe_time', '<=', $selTimeStart);
  848. $query->where('subscribe_time', '>', $selTimeEnd);
  849. break;
  850. case 'd':
  851. # code...
  852. $selTimeStart = date('Y-m-d H:i:s', strtotime('-30 day'));
  853. $query->where('subscribe_time', '<=', $selTimeStart);
  854. break;
  855. case 'e':
  856. # code...
  857. $selTimeStart = date('Y-m-d H:i:s', strtotime('-1 day'));
  858. $selTimeEnd = date('Y-m-d H:i:s');
  859. $query->where('subscribe_time', '<=', $selTimeEnd);
  860. $query->where('subscribe_time', '>', $selTimeStart);
  861. break;
  862. case 'f':
  863. # code...
  864. $selTimeStart = date('Y-m-d H:i:s', strtotime('-2 day'));
  865. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-1 day'));
  866. $query->where('subscribe_time', '<=', $selTimeEnd);
  867. $query->where('subscribe_time', '>', $selTimeStart);
  868. break;
  869. case 'g':
  870. # 客服消息专用,24小时前的老用户,不发给新用户
  871. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-1 day'));
  872. $query->where('subscribe_time', '<=', $selTimeEnd);
  873. break;
  874. case 'h':
  875. // 关注10-50分钟之间
  876. $selTimeStart = date('Y-m-d H:i:s', strtotime('-50 min'));
  877. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-10 min'));
  878. $query->where('subscribe_time', '<=', $selTimeEnd);
  879. $query->where('subscribe_time', '>', $selTimeStart);
  880. break;
  881. case 'i':
  882. # 关注时间 36小时-48小时
  883. $selTimeStart = date('Y-m-d H:i:s', strtotime('-48 hour'));
  884. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-36 hour'));
  885. $query->where('subscribe_time', '<=', $selTimeEnd);
  886. $query->where('subscribe_time', '>', $selTimeStart);
  887. break;
  888. case 'j':
  889. # 关注时间 20小时-48小时
  890. $selTimeStart = date('Y-m-d H:i:s', strtotime('-48 hour'));
  891. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-20 hour'));
  892. $query->where('subscribe_time', '<=', $selTimeEnd);
  893. $query->where('subscribe_time', '>', $selTimeStart);
  894. break;
  895. case 'k':
  896. # 关注时间 42小时-48小时
  897. $selTimeStart = date('Y-m-d H:i:s', strtotime('-48 hour'));
  898. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-42 hour'));
  899. $query->where('subscribe_time', '<=', $selTimeEnd);
  900. $query->where('subscribe_time', '>', $selTimeStart);
  901. break;
  902. case 'l':
  903. # 关注时间 12小时-48小时
  904. $selTimeStart = date('Y-m-d H:i:s', strtotime('-48 hour'));
  905. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-12 hour'));
  906. $query->where('subscribe_time', '<=', $selTimeEnd);
  907. $query->where('subscribe_time', '>', $selTimeStart);
  908. break;
  909. case 'm':
  910. # 关注时间 60小时-80小时
  911. $selTimeStart = date('Y-m-d H:i:s', strtotime('-80 hour'));
  912. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-60 hour'));
  913. $query->where('subscribe_time', '<=', $selTimeEnd);
  914. $query->where('subscribe_time', '>', $selTimeStart);
  915. break;
  916. default:
  917. # code...
  918. break;
  919. }
  920. }
  921. if ($sex || $balance) {
  922. # code...
  923. $query->join('users', 'force_subscribe_users.uid', '=', 'users.id');
  924. if ($sex) {
  925. # code...
  926. switch ($sex) {
  927. case 'a':
  928. # code...
  929. $query->where('users.sex', 1);
  930. break;
  931. case 'b':
  932. # code...
  933. $query->where('users.sex', 2);
  934. break;
  935. default:
  936. # code...
  937. break;
  938. }
  939. }
  940. if ($balance) {
  941. # code...
  942. switch ($balance) {
  943. case 'a':
  944. # code...
  945. $query->where('users.balance', '<', 500);
  946. break;
  947. case 'b':
  948. # code...
  949. $query->where('users.balance', '>=', 500);
  950. $query->where('users.balance', '<', 2000);
  951. break;
  952. case 'c':
  953. # code...
  954. $query->where('users.balance', '>=', 2000);
  955. $query->where('users.balance', '<', 5000);
  956. break;
  957. default:
  958. # code...
  959. break;
  960. }
  961. }
  962. }
  963. if ($category_id) {
  964. if ($category_id != 'z') {
  965. # code...
  966. $query->join('books', 'force_subscribe_users.bid','=', 'books.id');
  967. $categoryArray = explode(',', $category_id);
  968. $query->wherein('books.category_id', $categoryArray);
  969. // $query->where('books.category_id',$category_id);
  970. }
  971. }
  972. if ($order_type) {
  973. switch ($order_type) {
  974. case 'a':
  975. # code...
  976. //未消费用户
  977. $query->whereNotExists(function ($query) {
  978. $query->select(DB::raw(1))
  979. ->from('orders')
  980. ->whereRaw('orders.uid =force_subscribe_users.uid')
  981. ->whereRaw('orders.status="PAID"')
  982. ->limit(1);
  983. });
  984. break;
  985. case 'b':
  986. # code...
  987. //已消费用户
  988. $query->whereExists(function ($query) {
  989. $query->select(DB::raw(1))
  990. ->from('orders')
  991. ->whereRaw('orders.uid =force_subscribe_users.uid')
  992. ->whereRaw('orders.status="PAID"')
  993. ->limit(1);
  994. });
  995. break;
  996. case 'c':
  997. # code...
  998. //包年用户
  999. $query->whereExists(function ($query) {
  1000. $query->select(DB::raw(1))
  1001. ->from('year_orders')
  1002. ->whereRaw('year_orders.uid = force_subscribe_users.uid')
  1003. ->where('year_orders.begin_time', '<', date('Y-m-d H:i:s'))
  1004. ->where('year_orders.end_time', '>', date('Y-m-d H:i:s'))
  1005. ->limit(1);
  1006. });
  1007. break;
  1008. default:
  1009. # code...
  1010. break;
  1011. }
  1012. }
  1013. if ($sign_time) {
  1014. switch ($sign_time) {
  1015. case 'a':
  1016. //签到 60-90分钟内
  1017. $query->whereExists(function ($query) {
  1018. $query->select(DB::raw(1))
  1019. ->from('user_sign')
  1020. ->whereRaw('user_sign.uid =force_subscribe_users.uid')
  1021. ->where('user_sign.sign_time', '<', (microtime(true) - 60*60))
  1022. ->where('user_sign.sign_time', '>', (microtime(true) - 60*90))
  1023. ->limit(1);
  1024. });
  1025. break;
  1026. default:
  1027. break;
  1028. }
  1029. }
  1030. // 单次获取1w,改动此数值,必须更改CustomMsgService下SmartPush方法内对应数值
  1031. return $query->skip($skip)->take(10000)->get();
  1032. }
  1033. //根据客服消息传的各项条件检索用户--老版
  1034. static function forceUserCountByCustomPrams2($appids, $distribution_channel_id, $subscribe_time = '', $sex = '', $balance = '', $category_id = '', $order_type = '', $sign_time = '', $skip = 0)
  1035. {
  1036. $query = self::select('force_subscribe_users.id', 'force_subscribe_users.uid', 'force_subscribe_users.official_account_id', 'force_subscribe_users.distribution_channel_id', 'force_subscribe_users.appid', 'force_subscribe_users.openid', 'force_subscribe_users.is_subscribed', 'force_subscribe_users.subscribe_time', 'force_subscribe_users.unsubscribe_time', 'force_subscribe_users.last_interactive_time', 'force_subscribe_users.bid');
  1037. $query->where('force_subscribe_users.distribution_channel_id', $distribution_channel_id);
  1038. $query->where('force_subscribe_users.is_subscribed', 1);
  1039. $appidArray = explode(',', $appids);
  1040. $query->wherein('force_subscribe_users.appid', $appidArray);
  1041. $canSendDate = date('Y-m-d H:i:s', strtotime('-2 day'));
  1042. $query->where('force_subscribe_users.last_interactive_time', '>', $canSendDate);
  1043. if ($subscribe_time) {
  1044. # code...
  1045. switch ($subscribe_time) {
  1046. case 'a':
  1047. # code...
  1048. $selTime = date('Y-m-d H:i:s', strtotime('-5 day'));
  1049. $query->where('subscribe_time', '>', $selTime);
  1050. break;
  1051. case 'b':
  1052. # code...
  1053. $selTimeStart = date('Y-m-d H:i:s', strtotime('-5 day'));
  1054. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-15 day'));
  1055. $query->where('subscribe_time', '<=', $selTimeStart);
  1056. $query->where('subscribe_time', '>', $selTimeEnd);
  1057. break;
  1058. case 'c':
  1059. # code...
  1060. $selTimeStart = date('Y-m-d H:i:s', strtotime('-15 day'));
  1061. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-30 day'));
  1062. $query->where('subscribe_time', '<=', $selTimeStart);
  1063. $query->where('subscribe_time', '>', $selTimeEnd);
  1064. break;
  1065. case 'd':
  1066. # code...
  1067. $selTimeStart = date('Y-m-d H:i:s', strtotime('-30 day'));
  1068. $query->where('subscribe_time', '<=', $selTimeStart);
  1069. break;
  1070. case 'e':
  1071. # code...
  1072. $selTimeStart = date('Y-m-d H:i:s', strtotime('-1 day'));
  1073. $selTimeEnd = date('Y-m-d H:i:s');
  1074. $query->where('subscribe_time', '<=', $selTimeEnd);
  1075. $query->where('subscribe_time', '>', $selTimeStart);
  1076. break;
  1077. case 'f':
  1078. # code...
  1079. $selTimeStart = date('Y-m-d H:i:s', strtotime('-2 day'));
  1080. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-1 day'));
  1081. $query->where('subscribe_time', '<=', $selTimeEnd);
  1082. $query->where('subscribe_time', '>', $selTimeStart);
  1083. break;
  1084. case 'g':
  1085. # 客服消息专用,24小时前的老用户,不发给新用户
  1086. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-1 day'));
  1087. $query->where('subscribe_time', '<=', $selTimeEnd);
  1088. break;
  1089. case 'h':
  1090. // 关注10-25分钟之间
  1091. $selTimeStart = date('Y-m-d H:i:s', strtotime('-25 min'));
  1092. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-10 min'));
  1093. $query->where('subscribe_time', '<=', $selTimeEnd);
  1094. $query->where('subscribe_time', '>', $selTimeStart);
  1095. break;
  1096. case 'i':
  1097. # 关注时间 36小时-48小时
  1098. $selTimeStart = date('Y-m-d H:i:s', strtotime('-48 hour'));
  1099. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-36 hour'));
  1100. $query->where('subscribe_time', '<=', $selTimeEnd);
  1101. $query->where('subscribe_time', '>', $selTimeStart);
  1102. break;
  1103. case 'j':
  1104. # 关注时间 20小时-48小时
  1105. $selTimeStart = date('Y-m-d H:i:s', strtotime('-48 hour'));
  1106. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-20 hour'));
  1107. $query->where('subscribe_time', '<=', $selTimeEnd);
  1108. $query->where('subscribe_time', '>', $selTimeStart);
  1109. break;
  1110. case 'k':
  1111. # 关注时间 42小时-48小时
  1112. $selTimeStart = date('Y-m-d H:i:s', strtotime('-48 hour'));
  1113. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-42 hour'));
  1114. $query->where('subscribe_time', '<=', $selTimeEnd);
  1115. $query->where('subscribe_time', '>', $selTimeStart);
  1116. break;
  1117. case 'l':
  1118. # 关注时间 12小时-48小时
  1119. $selTimeStart = date('Y-m-d H:i:s', strtotime('-48 hour'));
  1120. $selTimeEnd = date('Y-m-d H:i:s', strtotime('-12 hour'));
  1121. $query->where('subscribe_time', '<=', $selTimeEnd);
  1122. $query->where('subscribe_time', '>', $selTimeStart);
  1123. break;
  1124. default:
  1125. # code...
  1126. break;
  1127. }
  1128. }
  1129. if ($sex || $balance) {
  1130. # code...
  1131. $query->join('users', 'force_subscribe_users.uid', '=', 'users.id');
  1132. if ($sex) {
  1133. # code...
  1134. switch ($sex) {
  1135. case 'a':
  1136. # code...
  1137. $query->where('users.sex', 1);
  1138. break;
  1139. case 'b':
  1140. # code...
  1141. $query->where('users.sex', 2);
  1142. break;
  1143. default:
  1144. # code...
  1145. break;
  1146. }
  1147. }
  1148. if ($balance) {
  1149. # code...
  1150. switch ($balance) {
  1151. case 'a':
  1152. # code...
  1153. $query->where('users.balance', '<', 500);
  1154. break;
  1155. case 'b':
  1156. # code...
  1157. $query->where('users.balance', '>=', 500);
  1158. $query->where('users.balance', '<', 2000);
  1159. break;
  1160. case 'c':
  1161. # code...
  1162. $query->where('users.balance', '>=', 2000);
  1163. $query->where('users.balance', '<', 5000);
  1164. break;
  1165. default:
  1166. # code...
  1167. break;
  1168. }
  1169. }
  1170. }
  1171. if ($category_id) {
  1172. if ($category_id != 'z') {
  1173. # code...
  1174. $query->join('books', 'force_subscribe_users.bid', '=','books.id');
  1175. $categoryArray = explode(',', $category_id);
  1176. $query->wherein('books.category_id', $categoryArray);
  1177. // $query->where('books.category_id',$category_id);
  1178. }
  1179. }
  1180. if ($order_type) {
  1181. switch ($order_type) {
  1182. case 'a':
  1183. # code...
  1184. //未消费用户
  1185. $query->whereNotExists(function ($query) {
  1186. $query->select(DB::raw(1))
  1187. ->from('orders')
  1188. ->whereRaw('orders.uid =force_subscribe_users.uid')
  1189. ->whereRaw('orders.status="PAID"')
  1190. ->limit(1);
  1191. });
  1192. break;
  1193. case 'b':
  1194. # code...
  1195. //已消费用户
  1196. $query->whereExists(function ($query) {
  1197. $query->select(DB::raw(1))
  1198. ->from('orders')
  1199. ->whereRaw('orders.uid =force_subscribe_users.uid')
  1200. ->whereRaw('orders.status="PAID"')
  1201. ->limit(1);
  1202. });
  1203. break;
  1204. case 'c':
  1205. # code...
  1206. //包年用户
  1207. $query->whereExists(function ($query) {
  1208. $query->select(DB::raw(1))
  1209. ->from('year_orders')
  1210. ->whereRaw('year_orders.uid = force_subscribe_users.uid')
  1211. ->where('year_orders.begin_time', '<', date('Y-m-d H:i:s'))
  1212. ->where('year_orders.end_time', '>', date('Y-m-d H:i:s'))
  1213. ->limit(1);
  1214. });
  1215. break;
  1216. default:
  1217. # code...
  1218. break;
  1219. }
  1220. }
  1221. if ($sign_time) {
  1222. switch ($sign_time) {
  1223. case 'a':
  1224. //签到 60-90分钟内
  1225. $query->whereExists(function ($query) {
  1226. $query->select(DB::raw(1))
  1227. ->from('user_sign')
  1228. ->whereRaw('user_sign.uid =force_subscribe_users.uid')
  1229. ->where('user_sign.sign_time', '<', (microtime(true) - 60*60))
  1230. ->where('user_sign.sign_time', '>', (microtime(true) - 60*90))
  1231. ->limit(1);
  1232. });
  1233. break;
  1234. default:
  1235. break;
  1236. }
  1237. }
  1238. // 单次获取1w,改动此数值,必须更改CustomMsgService下SmartPush方法内对应数值
  1239. return $query->skip($skip)->take(10000)->get();
  1240. }
  1241. /**
  1242. * 通过uid获取用户关注的服务号名称
  1243. * @param $uid
  1244. * @return mixed
  1245. */
  1246. static function getOfficalAccountNickName($uid)
  1247. {
  1248. $search_obj = self::select('official_accounts.nickname')->leftjoin('official_accounts', 'force_subscribe_users.appid', '=', 'official_accounts.appid')->where('force_subscribe_users.uid', $uid);
  1249. return $search_obj->first();
  1250. }
  1251. /**
  1252. * 根据openid获取用户的性别信息
  1253. * @param unknown_type $distribution_channel_id
  1254. * @param unknown_type $openid
  1255. */
  1256. static function getSexByOpenid($distribution_channel_id,$openid){
  1257. $sex = self::join('books','force_subscribe_users.bid','=','books.id')
  1258. ->join('book_categories', 'books.category_id','=', 'book_categories.id')
  1259. ->select('book_categories.channel_name','force_subscribe_users.bid')
  1260. ->where('force_subscribe_users.openid',$openid)
  1261. ->where('force_subscribe_users.distribution_channel_id',$distribution_channel_id)
  1262. ->first();
  1263. \Log::info('getSexByOpenid:'.$openid.' sex:'.json_encode($sex));
  1264. if(isset($sex->channel_name) && $sex->channel_name){
  1265. if($sex->channel_name == '男频'){
  1266. return 1;
  1267. }
  1268. return 2;
  1269. }else{
  1270. // 判断用户性别
  1271. $user = self::join('users','force_subscribe_users.uid','=','users.id')
  1272. ->select('users.sex')
  1273. ->where('force_subscribe_users.openid',$openid)
  1274. ->where('force_subscribe_users.distribution_channel_id',$distribution_channel_id)
  1275. ->first();
  1276. \Log::info('getSexByOpenid_user_openid:'.$openid.' sex:'.json_encode($user));
  1277. if(isset($user->sex) && $user->sex == 1){
  1278. \Log::info('getSexByOpenid_by_user_sex:'.$user->sex);
  1279. return 1;
  1280. }
  1281. return 2;
  1282. }
  1283. }
  1284. /**
  1285. * 根据uid获取用户的真实性别信息
  1286. */
  1287. static function getUserRealSexByUid($uid){
  1288. // 判断用户性别
  1289. $user = UserService::getById($uid);
  1290. $sex = isset($user->sex) && $user->sex==1?1:2;
  1291. \Log::info('getUserRealSexByUid:'.$uid.' sex:'.$sex);
  1292. return $sex;
  1293. }
  1294. /**
  1295. * 根据openid获取用户的性别信息--无需判断性别
  1296. */
  1297. static function getSimpleSexByOpenid($distribution_channel_id,$openid){
  1298. $sex = self::join('books','force_subscribe_users.bid','=','books.id')
  1299. ->join('book_categories', 'books.category_id','=', 'book_categories.id')
  1300. ->select('book_categories.channel_name','force_subscribe_users.bid')
  1301. ->where('force_subscribe_users.openid',$openid)
  1302. ->where('force_subscribe_users.distribution_channel_id',$distribution_channel_id)
  1303. ->first();
  1304. \Log::info('getSimpleSexByOpenid:'.$openid.' sex:'.json_encode($sex));
  1305. if(isset($sex->channel_name) && $sex->channel_name){
  1306. if($sex->channel_name == '男频'){
  1307. return 1;
  1308. }
  1309. }
  1310. return 2;
  1311. }
  1312. /**
  1313. * 根据uid获取用户的性别信息--无需判断性别
  1314. */
  1315. static function getSimpleSexByUid($uid){
  1316. if($uid == 0){
  1317. return 2;
  1318. }
  1319. $sex = self::join('books','force_subscribe_users.bid','=','books.id')
  1320. ->join('book_categories', 'books.category_id','=', 'book_categories.id')
  1321. ->select('book_categories.channel_name','force_subscribe_users.bid')
  1322. ->where('force_subscribe_users.uid',$uid)
  1323. ->first();
  1324. \Log::info('getSimpleSexByUid:'.$uid.' sex:'.json_encode($sex));
  1325. if(isset($sex->channel_name) && $sex->channel_name){
  1326. if($sex->channel_name == '男频'){
  1327. return 1;
  1328. }
  1329. }
  1330. return 2;
  1331. }
  1332. public static function getOldUserNewSubsribeNum($params){
  1333. $obj = self::whereRaw('force_subscribe_users.subscribe_time > force_subscribe_users.created_at');
  1334. if(isset($params['distribution_channel_id']) && $params['distribution_channel_id']){
  1335. $obj->where('distribution_channel_id',$params['distribution_channel_id']);
  1336. }
  1337. if(isset($params['start_time']) && $params['start_time']){
  1338. $obj->where('subscribe_time','>=',$params['start_time']);
  1339. }
  1340. if(isset($params['end_time']) && $params['end_time']){
  1341. $obj->where('subscribe_time','<=',$params['end_time']);
  1342. }
  1343. return $obj->count('id');
  1344. }
  1345. }