MakePKListCommand.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. <?php
  2. namespace App\Console\Commands;
  3. use App\Models\Basic;
  4. use App\Models\Challenge;
  5. use App\Models\DwbsUser;
  6. use App\Models\Enroll;
  7. use App\Models\RankDays;
  8. use App\Models\RankTemplate;
  9. use App\Models\User;
  10. use Carbon\Carbon;
  11. use Illuminate\Console\Command;
  12. use Illuminate\Support\Facades\DB;
  13. use Illuminate\Support\Facades\Log;
  14. use Intervention\Image\Facades\Image;
  15. class MakePKListCommand extends Command
  16. {
  17. /**
  18. * The name and signature of the console command.
  19. *
  20. * @var string
  21. */
  22. protected $signature = 'MakePKListCommand';
  23. /**
  24. * The console command description.
  25. *
  26. * @var string
  27. */
  28. protected $description = 'Command description';
  29. /**
  30. * Create a new command instance.
  31. *
  32. * @return void
  33. */
  34. public function __construct()
  35. {
  36. parent::__construct();
  37. }
  38. /**
  39. * Execute the console command.
  40. *
  41. * @return mixed
  42. */
  43. public function handle()
  44. {
  45. $time=time();
  46. Log::error('制作排行榜开始');
  47. // if ($time<0){
  48. $season=Basic::where('keys','=','season')->value('value');
  49. $end_time=Basic::where('keys','=','round_end_time')->value('value');
  50. $start_time=Basic::where('keys','=','round_start_time')->value('value');
  51. // if ($time<$end_time&&$time>$start_time+3600*24){
  52. $uids=Enroll::where('season',$season)
  53. ->join('user','user.id','=','enroll.uid')
  54. ->where('user.level_name','批发商')
  55. ->where('enroll.status',0)->pluck('enroll.uid');
  56. $this->rank_days($season,$uids,3);
  57. $uids=Enroll::where('season',$season)
  58. ->join('user','user.id','=','enroll.uid')
  59. ->where('user.level_name','经销商')
  60. ->where('enroll.status',0)->pluck('enroll.uid');
  61. $this->rank_days($season,$uids,2);
  62. // }
  63. Log::error('制作排行榜结束');
  64. }
  65. public function rank_days($season,$uids=[],$level){
  66. $re=Challenge::whereIn('challenge_status',[1,2])->where('season',$season)->whereIn('challenge_id',$uids)
  67. ->select(DB::raw('if(challenge_total >=accept_total,challenge_total,accept_total) as total'),DB::raw('if(challenge_total >=accept_total,challenge_id,accept_id) as idx'),'challenge_total','accept_total','challenge_id','accept_id')
  68. ->with(['get_challenge_user:id,nickname,avatar,phone'])
  69. ->with(['get_accept_user:id,nickname,avatar,phone'])
  70. ->orderByDesc('total')->GroupBy('idx')->limit(10)->get()->toArray();
  71. if ($level==3){
  72. $url=RankTemplate::where('season',$season)->where('type',1)->where('level',3)->value('url');
  73. // $img=\Intervention\Image\Facades\Image::make(public_path().'/uploads/img/crown_pk.jpg');
  74. $img=Image::make($url);
  75. }else{
  76. $url=RankTemplate::where('season',$season)->where('type',1)->where('level',2)->value('url');
  77. $img=Image::make($url);
  78. // $img=\Intervention\Image\Facades\Image::make(public_path().'/uploads/img/ji_pk.jpg');
  79. }
  80. if ($level==3){
  81. foreach ($re as $k=>$v){
  82. if ($v['challenge_total']>$v['accept_total']){
  83. $dwuser=DwbsUser::where('mobile',$v['get_challenge_user']['phone'])->select('remark_name','headimgurl')->first();
  84. if ($dwuser->remark_name){
  85. $this->avatar($v['get_challenge_user']['avatar'],$k,$img,1,$v['challenge_total'],$dwuser->remark_name,$dwuser->headimgurl);
  86. }else{
  87. $this->avatar($v['get_challenge_user']['avatar'],$k,$img,1,$v['challenge_total'],$v['get_challenge_user']['nickname'],$dwuser->headimgurl);
  88. }
  89. $dwuser=DwbsUser::where('mobile',$v['get_accept_user']['phone'])->select('remark_name','headimgurl')->first();
  90. if ($dwuser->remark_name){
  91. $this->avatar($v['get_accept_user']['avatar'],$k,$img,2,$v['accept_total'],$dwuser->remark_name,$dwuser->headimgurl);
  92. }else{
  93. $this->avatar($v['get_accept_user']['avatar'],$k,$img,2,$v['accept_total'],$v['get_accept_user']['nickname'],$dwuser->headimgurl);
  94. }
  95. $baifenbi=$this->judge_pk($v['challenge_total'],$v['accept_total']);
  96. $img->insert($baifenbi,'',240,1600+250*$k);
  97. }else{
  98. $dwuser=DwbsUser::where('mobile',$v['get_accept_user']['phone'])->select('remark_name','headimgurl')->first();
  99. if ($dwuser->remark_name){
  100. $this->avatar($v['get_accept_user']['avatar'],$k,$img,1,$v['accept_total'],$dwuser->remark_name,$dwuser->headimgurl);
  101. }else{
  102. $this->avatar($v['get_accept_user']['avatar'],$k,$img,1,$v['accept_total'],$v['get_accept_user']['nickname'],$dwuser->headimgurl);
  103. }
  104. $dwuser=DwbsUser::where('mobile',$v['get_challenge_user']['phone'])->select('remark_name','headimgurl')->first();
  105. if ($dwuser->remark_name){
  106. $this->avatar($v['get_challenge_user']['avatar'],$k,$img,2,$v['challenge_total'],$dwuser->remark_name,$dwuser->headimgurl);
  107. }else{
  108. $this->avatar($v['get_challenge_user']['avatar'],$k,$img,2,$v['challenge_total'],$v['get_challenge_user']['nickname'],$dwuser->headimgurl);
  109. }
  110. // $this->avatar($v['get_accept_user']['avatar'],$k,$img,1,$v['accept_total'],$v['get_accept_user']['nickname']);
  111. // $this->avatar($v['get_challenge_user']['avatar'],$k,$img,2,$v['challenge_total'],$v['get_challenge_user']['nickname']);
  112. $baifenbi=$this->judge_pk($v['accept_total'],$v['challenge_total']);
  113. $img->insert($baifenbi,'',240,1600+250*$k);
  114. }
  115. }
  116. $img->text(date('Y年m月d日',time()-3600*24).'-'.date('m月d日',time()),220,2090*2,function ($font){
  117. $font->file(public_path() . '/ziti/ht.otf');
  118. $font->size(50);
  119. $font->color('F6F09C');
  120. $font->angle(0);
  121. });
  122. }else{
  123. foreach ($re as $k=>$v){
  124. if ($v['challenge_total']>$v['accept_total']){
  125. // $this->avatars($v['get_challenge_user']['avatar'],$k,$img,1,$v['challenge_total'],$v['get_challenge_user']['nickname']);
  126. // $this->avatars($v['get_accept_user']['avatar'],$k,$img,2,$v['accept_total'],$v['get_accept_user']['nickname']);
  127. $dwuser=DwbsUser::where('mobile',$v['get_challenge_user']['phone'])->select('remark_name','headimgurl')->first();
  128. if ($dwuser->remark_name){
  129. $this->avatars($v['get_challenge_user']['avatar'],$k,$img,1,$v['challenge_total'],$dwuser->remark_name,$dwuser->headimgurl);
  130. }else{
  131. $this->avatars($v['get_challenge_user']['avatar'],$k,$img,1,$v['challenge_total'],$v['get_challenge_user']['nickname'],$dwuser->headimgurl);
  132. }
  133. $dwuser=DwbsUser::where('mobile',$v['get_accept_user']['phone'])->select('remark_name','headimgurl')->first();
  134. if ($dwuser->remark_name){
  135. $this->avatars($v['get_accept_user']['avatar'],$k,$img,2,$v['accept_total'],$dwuser->remark_name,$dwuser->headimgurl);
  136. }else{
  137. $this->avatars($v['get_accept_user']['avatar'],$k,$img,2,$v['accept_total'],$v['get_accept_user']['nickname'],$dwuser->headimgurl);
  138. }
  139. $baifenbi=$this->judge_pks($v['challenge_total'],$v['accept_total']);
  140. $img->insert($baifenbi,'',240,1600-640+260*$k);
  141. }else{
  142. // $this->avatars($v['get_accept_user']['avatar'],$k,$img,1,$v['accept_total'],$v['get_accept_user']['nickname']);
  143. // $this->avatars($v['get_challenge_user']['avatar'],$k,$img,2,$v['challenge_total'],$v['get_challenge_user']['nickname']);
  144. $dwuser=DwbsUser::where('mobile',$v['get_accept_user']['phone'])->select('remark_name','headimgurl')->first();
  145. if($dwuser){
  146. if ($dwuser->remark_name){
  147. $this->avatars($v['get_accept_user']['avatar'],$k,$img,1,$v['accept_total'],$dwuser->remark_name,$dwuser->headimgurl);
  148. }else{
  149. $this->avatars($v['get_accept_user']['avatar'],$k,$img,1,$v['accept_total'],$v['get_accept_user']['nickname'],$dwuser->headimgurl);
  150. }
  151. }else{
  152. $dwuser=User::where('phone',$v['get_accept_user']['phone'])->select('nickname','avatar')->first();
  153. if ($dwuser->nickname){
  154. $this->avatars($v['get_accept_user']['avatar'],$k,$img,1,$v['accept_total'],$dwuser->remark_name,$dwuser->headimgurl);
  155. }else{
  156. $this->avatars($v['get_accept_user']['avatar'],$k,$img,1,$v['accept_total'],$v['get_accept_user']['nickname'],$dwuser->avatar);
  157. }
  158. }
  159. $dwuser=DwbsUser::where('mobile',$v['get_challenge_user']['phone'])->select('remark_name','headimgurl')->first();
  160. if ($dwuser->remark_name){
  161. $this->avatars($v['get_challenge_user']['avatar'],$k,$img,2,$v['challenge_total'],$dwuser->remark_name,$dwuser->headimgurl);
  162. }else{
  163. $this->avatars($v['get_challenge_user']['avatar'],$k,$img,2,$v['challenge_total'],$v['get_challenge_user']['nickname'],$dwuser->headimgurl);
  164. }
  165. $baifenbi=$this->judge_pks($v['accept_total'],$v['challenge_total']);
  166. $img->insert($baifenbi,'',240,1600-640+260*$k);
  167. }
  168. }
  169. $img->text(date('Y年m月d日',time()-3600*24).'-'.date('m月d日',time()),220,3750,function ($font){
  170. $font->file(public_path() . '/ziti/ht.otf');
  171. $font->size(50);
  172. $font->color('F6F09C');
  173. $font->angle(0);
  174. });
  175. }
  176. $folder_name = "uploads/images/PkImg/" . date("Ym/d", time());
  177. // 文件具体存储的物理路径,`public_path()` 获取的是 `public` 文件夹的物理路径。
  178. // 值如:/home/vagrant/Code/larabbs/public/uploads/images/avatars/201709/21/
  179. $upload_path = '/public/' . $folder_name;
  180. // 获取文件的后缀名,因图片从剪贴板里黏贴时后缀名为空,所以此处确保后缀一直存在
  181. $extension = 'png';
  182. // 拼接文件名,加前缀是为了增加辨析度,前缀可以是相关数据模型的 ID
  183. // 值如:1_1493521050_7BVc9v9ujP.png
  184. $filename = $level . '_' . time() . '_' . str_random(10) . '.' . $extension;
  185. if (!file_exists(public_path($upload_path))) {
  186. mkdir(public_path($upload_path), 0777, true);
  187. }
  188. // File::isDirectory(public_path().$upload_path) or File::makeDirectory(public_path().$upload_path,077,true,true);
  189. // 将图片移动到我们的目标存储路径中
  190. $img->save(public_path().$upload_path.'/'.$filename);
  191. $rank_path=env('APP_URL').$upload_path.'/'.$filename;
  192. $rank_days=new RankDays();
  193. $rank_days->season=$season;
  194. $rank_days->level=$level;
  195. $rank_days->img_url=$rank_path;
  196. $rank_days->type=1;
  197. $rank_days->time=Carbon::today()->toDateString();
  198. $rank_days->save();
  199. }
  200. public function bg_resize($img2)
  201. {
  202. $img2 = $img2->resize(153, 153);
  203. $r = $img2->width() / 2;
  204. $img3 = Image::canvas(153, 153);
  205. for ($x = 0; $x < $img2->width(); $x++) {
  206. for ($y = 0; $y < $img2->height(); $y++) {
  207. if (((($x - $r) * ($x - $r) + ($y - $r) * ($y - $r)) < ($r * $r))) {
  208. $c = $img2->pickColor($x, $y, 'array');
  209. $img3->pixel($c, $x, $y);
  210. }
  211. }
  212. }
  213. return $img3;
  214. }
  215. public function judge_pks($total1,$total2){
  216. if ($total2==0){
  217. $name='pk_100';
  218. }else{
  219. $nums=round($total1/($total2+$total1)*100,2);
  220. if ($nums>95){
  221. $name='pk_100';
  222. }elseif ($nums>85&&$nums<=95){
  223. $name='pk_90';
  224. }elseif ($nums>75&&$nums<=85){
  225. $name='pk_80';
  226. }elseif ($nums>65&&$nums<=75){
  227. $name='pk_70';
  228. }elseif ($nums>55&&$nums<=65){
  229. $name='pk_60';
  230. }else{
  231. $name='pk_50';
  232. }
  233. }
  234. $baifenbi=Image::make(public_path()."/uploads/img/".$name.".png")->resize(615);
  235. return $baifenbi;
  236. }
  237. public function avatar($url,$k,$img,$n,$total_1=0,$nickname,$imgs){
  238. $len=mb_strlen($nickname);
  239. if ($len>4){
  240. $nickname=mb_substr($nickname,0,4);
  241. }
  242. try {
  243. $avatars = Image::make($url);
  244. } catch (\Exception $exception) {
  245. try{
  246. $avatars = Image::make($imgs);
  247. }catch (\Exception $exception){
  248. $avatars = Image::make(public_path() . '/logo3.png');
  249. }
  250. }
  251. $yuan=Image::make(public_path().'/uploads/img/yuan.png')->resize(169,169);
  252. $avatar=$this->bg_resize($avatars);
  253. if ($n==1){
  254. $img->insert($avatar,'',128,1500+(250)*$k);
  255. $img->insert($yuan,'',120,1500-8+(250)*$k);
  256. $img->text($total_1.'分', 310, 1600-10+250*$k, function ($font) {
  257. $font->file(public_path() . '/ziti/ht.otf');
  258. $font->size(30);
  259. $font->color('F6F09C');
  260. $font->angle(0);
  261. });
  262. $img->text($nickname, 132, 1710+250*$k, function ($font) {
  263. $font->file(public_path() . '/ziti/ht.otf');
  264. $font->size(47);
  265. $font->color('F6F09C');
  266. $font->angle(0);
  267. });
  268. }else{
  269. $img->insert($avatar,'',799+8,1500+250*$k);
  270. $img->insert($yuan,'',799,1500-8+250*$k);
  271. $img->text($total_1.'分', 680, 1600-10+250*$k, function ($font) {
  272. $font->file(public_path() . '/ziti/ht.otf');
  273. $font->size(30);
  274. $font->color('F6F09C');
  275. $font->angle(0);
  276. });
  277. $img->text($nickname, 812, 1710+250*$k, function ($font) {
  278. $font->file(public_path() . '/ziti/ht.otf');
  279. $font->size(47);
  280. $font->color('F6F09C');
  281. $font->angle(0);
  282. });
  283. }
  284. return $img;
  285. }
  286. public function judge_pk($total1,$total2){
  287. if ($total2==0){
  288. $name='pk_100';
  289. }else{
  290. $nums=round($total1/($total2+$total1)*100,2);
  291. if ($nums>95){
  292. $name='pk_100';
  293. }elseif ($nums>85&&$nums<=95){
  294. $name='pk_90';
  295. }elseif ($nums>75&&$nums<=85){
  296. $name='pk_80';
  297. }elseif ($nums>65&&$nums<=75){
  298. $name='pk_70';
  299. }elseif ($nums>55&&$nums<=65){
  300. $name='pk_60';
  301. }else{
  302. $name='pk_50';
  303. }
  304. }
  305. $baifenbi=Image::make(public_path()."/uploads/img/".$name.".png")->resize(615);
  306. return $baifenbi;
  307. }
  308. public function avatars($url,$k,$img,$n,$total_1=0,$nickname,$imgs){
  309. $len=mb_strlen($nickname);
  310. if ($len>4){
  311. $nickname=mb_substr($nickname,0,4);
  312. }
  313. try {
  314. $avatars = Image::make($url);
  315. } catch (\Exception $exception) {
  316. try{
  317. $avatars = Image::make($imgs);
  318. }catch (\Exception $exception){
  319. $avatars = Image::make(public_path() . '/logo3.png');
  320. }
  321. }
  322. $yuan=Image::make(public_path().'/uploads/img/yuan.png')->resize(169,169);
  323. $avatar=$this->bg_resize($avatars);
  324. if ($n==1){
  325. $img->insert($avatar,'',128,860+(260)*$k);
  326. $img->insert($yuan,'',120,860-8+(260)*$k);
  327. $img->text($total_1.'分', 310, 1600-640-10+260*$k, function ($font) {
  328. $font->file(public_path() . '/ziti/ht.otf');
  329. $font->size(30);
  330. $font->color('FF4104');
  331. $font->angle(0);
  332. });
  333. $img->text($nickname, 132, 1710-640+260*$k, function ($font) {
  334. $font->file(public_path() . '/ziti/ht.otf');
  335. $font->size(47);
  336. $font->color('FF4104');
  337. $font->angle(0);
  338. });
  339. }else{
  340. $len=mb_strlen($nickname);
  341. if ($len==4){
  342. $x=812-40;
  343. }elseif ($len==1){
  344. $x=812+40;
  345. }else{
  346. if ($len==2){
  347. $nickname=mb_substr($nickname,0,1).' '.mb_substr($nickname,1,2);
  348. }
  349. $x=812;
  350. }
  351. $img->insert($avatar,'',799+8,1500-640+260*$k);
  352. $img->insert($yuan,'',799,1500-640-8+260*$k);
  353. $img->text($total_1.'分', 680, 1600-640-10+260*$k, function ($font) {
  354. $font->file(public_path() . '/ziti/ht.otf');
  355. $font->size(30);
  356. $font->color('FF4104');
  357. $font->angle(0);
  358. });
  359. $img->text($nickname, $x, 1710-640+260*$k, function ($font) {
  360. $font->file(public_path() . '/ziti/ht.otf');
  361. $font->size(47);
  362. $font->color('FF4104');
  363. $font->angle(0);
  364. });
  365. }
  366. return $img;
  367. }
  368. }