MakeStatisticalResourceCommand.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539
  1. <?php
  2. namespace App\Console\Commands\Dwbs;
  3. use App\Repositories\Enums\Dwbs\DayTypeEnum;
  4. use App\Repositories\Enums\Dwbs\StatisticalResourceTypeEnum;
  5. use App\Repositories\Enums\ModelStatusEnum;
  6. use App\Repositories\Models\Base\Setting;
  7. use App\Repositories\Models\Base\User;
  8. use App\Repositories\Models\Dwbs\Ranking;
  9. use App\Repositories\Models\Dwbs\StatisticalResource;
  10. use Carbon\Carbon;
  11. use Illuminate\Console\Command;
  12. use Illuminate\Support\Facades\Log;
  13. use Illuminate\Support\Facades\Storage;
  14. use Illuminate\Support\Str;
  15. use Intervention\Image\Facades\Image;
  16. /**
  17. * 生成图片
  18. * @package Prettus\Repository\Generators\Commands
  19. * @author Anderson Andrade <contato@andersonandra.de>
  20. */
  21. class MakeStatisticalResourceCommand extends Command
  22. {
  23. /**
  24. * The name of command.
  25. *
  26. * @var string
  27. */
  28. protected $signature = 'make:statistical-resource {date?}';
  29. /**
  30. * The description of command.
  31. *
  32. * @var string
  33. */
  34. protected $description = '制造数据';
  35. /**
  36. * The type of class being generated.
  37. *
  38. * @var string
  39. */
  40. protected $type = 'permission';
  41. const TotalNums = 50;
  42. const PageNums = 50;
  43. /**
  44. * Execute the command.
  45. *
  46. * @return void
  47. * @see fire()
  48. */
  49. public function handle()
  50. {
  51. $day = $this->argument('date');
  52. $now = Carbon::now()->toDateString();
  53. if (!$day) {
  54. $day = Carbon::yesterday()->toDateString();
  55. } else {
  56. $now = Carbon::parse($day)->toDateString();
  57. $day = Carbon::parse($day)->subDay()->toDateString();
  58. }
  59. $this->line($day);
  60. $isOpenGroup = (bool)Setting::byCodeGetSetting('h5_paihangbang_is_group_user');
  61. if ($isOpenGroup) {
  62. $this->openGroup($day, $now);
  63. return;
  64. }
  65. $this->noOpenGroup($day, $now);
  66. $this->line('ok');
  67. }
  68. /**
  69. * 开分组
  70. * @param $day
  71. * @param $now
  72. * @return void
  73. */
  74. public function openGroup($day, $now)
  75. {
  76. $userGroupMaps = User::GroupMaps;
  77. //1.当天的排行榜
  78. $startTimeTxt = Carbon::parse($day)->startOfDay()->format('Y年m月d日 H:i');
  79. $endTimeTxt = Carbon::parse($day)->endOfDay()->format('Y年m月d日 H:i');
  80. $timeTxt = "{$startTimeTxt}-{$endTimeTxt}";
  81. foreach ($userGroupMaps as $map) {
  82. $group_id = $map['id'];
  83. $model = Ranking::query()->where('group_id', $group_id);
  84. $rankings = $model->clone()->where('day_type', DayTypeEnum::day)->where('day', $day)->with(['user'])->orderByDesc('xuefen')->limit(self::TotalNums)->get()->toArray();
  85. $this->makeRangingImg($rankings, $timeTxt, $day, DayTypeEnum::day, $group_id);
  86. $xueba = $model->clone()->where('day_type', DayTypeEnum::day)->where('day', $day)->with(['user'])->where('is_xueba', ModelStatusEnum::OK)->first();
  87. $this->makeXueBaImg($xueba, $timeTxt, $day, DayTypeEnum::day, $group_id);
  88. //2.周排行榜
  89. $firstDay = Carbon::parse($now)->startOfWeek();
  90. if (Carbon::parse($now)->isSameDay($firstDay)) {
  91. $startTimeTxt = Carbon::parse($day)->startOfWeek()->format('Y年m月d日 H:i');
  92. $endTimeTxt = Carbon::parse($day)->endOfWeek()->format('Y年m月d日 H:i');
  93. $start_day = Carbon::parse($day)->startOfWeek()->toDateString();
  94. $timeTxt = "{$startTimeTxt}-{$endTimeTxt}";
  95. $this->line("周:" . $group_id);
  96. $rankings = $model->clone()->where('day_type', DayTypeEnum::week)->where('day', $start_day)->with('user')->limit(self::TotalNums)->orderByDesc('xuefen')->get();
  97. $this->makeRangingImg($rankings, $timeTxt, $start_day, DayTypeEnum::week, $group_id);
  98. $xueba = $model->clone()->where('day_type', DayTypeEnum::week)->where('day', $start_day)->with(['user'])->where('is_xueba', ModelStatusEnum::OK)->first();
  99. $this->makeXueBaImg($xueba, $timeTxt, $start_day, DayTypeEnum::week, $group_id);
  100. }
  101. //3.月排行榜
  102. $firstDay = Carbon::parse($now)->startOfMonth();
  103. if (Carbon::parse($now)->isSameDay($firstDay)) {
  104. $startTimeTxt = Carbon::parse($day)->startOfMonth()->format('Y年m月d日 H:i');
  105. $endTimeTxt = Carbon::parse($day)->endOfMonth()->format('Y年m月d日 H:i');
  106. $start_day = Carbon::parse($day)->startOfMonth()->toDateString();
  107. $timeTxt = "{$startTimeTxt}-{$endTimeTxt}";
  108. $rankings = $model->clone()->where('day_type', DayTypeEnum::month)->where('day', $start_day)->with('user')->limit(self::TotalNums)->orderByDesc('xuefen')->get();
  109. $this->makeRangingImg($rankings, $timeTxt, $start_day, DayTypeEnum::month, $group_id);
  110. $xueba = $model->clone()->where('day_type', DayTypeEnum::month)->where('day', $start_day)->with(['user'])->where('is_xueba', ModelStatusEnum::OK)->first();
  111. $this->makeXueBaImg($xueba, $timeTxt, $start_day, DayTypeEnum::month, $group_id);
  112. }
  113. //4.季排行榜
  114. $firstDay = Carbon::parse($now)->startOfQuarter();
  115. if (Carbon::parse($now)->isSameDay($firstDay)) {
  116. $startTimeTxt = Carbon::parse($day)->startOfQuarter()->format('Y年m月d日 H:i');
  117. $endTimeTxt = Carbon::parse($day)->endOfQuarter()->format('Y年m月d日 H:i');
  118. $this->line("季:{$startTimeTxt}--{$endTimeTxt}");
  119. $timeTxt = "{$startTimeTxt}-{$endTimeTxt}";
  120. $start_day = Carbon::parse($day)->startOfQuarter()->toDateString();
  121. $rankings = $model->clone()->where('day_type', DayTypeEnum::quarter)->where('day', $start_day)->with('user')->limit(self::TotalNums)->orderByDesc('xuefen')->get();
  122. $this->makeRangingImg($rankings, $timeTxt, $start_day, DayTypeEnum::quarter, $group_id);
  123. $xueba = $model->clone()->where('day_type', DayTypeEnum::quarter)->where('day', $start_day)->with(['user'])->where('is_xueba', ModelStatusEnum::OK)->first();
  124. $this->makeXueBaImg($xueba, $timeTxt, $start_day, DayTypeEnum::quarter, $group_id);
  125. }
  126. //5.年排行榜
  127. $firstDay = Carbon::parse($now)->startOfYear();
  128. if (Carbon::parse($now)->isSameDay($firstDay)) {
  129. $startTimeTxt = Carbon::parse($day)->startOfYear()->format('Y年m月d日 H:i');
  130. $endTimeTxt = Carbon::parse($day)->endOfYear()->format('Y年m月d日 H:i');
  131. $start_day = Carbon::parse($day)->startOfYear()->toDateString();
  132. $timeTxt = "{$startTimeTxt}-{$endTimeTxt}";
  133. $rankings = $model->clone()->where('day_type', DayTypeEnum::year)->where('day', $start_day)->with('user')->limit(self::TotalNums)->orderByDesc('xuefen')->get();
  134. $this->makeRangingImg($rankings, $timeTxt, $start_day, DayTypeEnum::year, $group_id);
  135. $xueba = $model->clone()->where('day_type', DayTypeEnum::year)->where('day', $start_day)->with(['user'])->where('is_xueba', ModelStatusEnum::OK)->first();
  136. $this->makeXueBaImg($xueba, $timeTxt, $start_day, DayTypeEnum::year, $group_id);
  137. }
  138. }
  139. }
  140. /**
  141. * 没有开分组
  142. * @param $day
  143. * @param $now
  144. * @return void
  145. */
  146. public function noOpenGroup($day, $now)
  147. {
  148. //1.当天的排行榜
  149. $startTimeTxt = Carbon::parse($day)->startOfDay()->format('Y年m月d日 H:i');
  150. $endTimeTxt = Carbon::parse($day)->endOfDay()->format('Y年m月d日 H:i');
  151. $timeTxt = "{$startTimeTxt}-{$endTimeTxt}";
  152. $rankings = Ranking::query()->where('day_type', DayTypeEnum::day)->where('day', $day)->with(['user'])->orderByDesc('xuefen')->limit(30)->get()->toArray();
  153. $this->makeRangingImg($rankings, $timeTxt, $day, DayTypeEnum::day);
  154. $xueba = Ranking::query()->where('day_type', DayTypeEnum::day)->where('day', $day)->with(['user'])->where('is_xueba', ModelStatusEnum::OK)->first();
  155. $this->makeXueBaImg($xueba, $timeTxt, $day, DayTypeEnum::day);
  156. //2.周排行榜
  157. $firstDay = Carbon::parse($now)->startOfWeek();
  158. if (Carbon::parse($now)->isSameDay($firstDay)) {
  159. $startTimeTxt = Carbon::parse($day)->startOfWeek()->format('Y年m月d日 H:i');
  160. $endTimeTxt = Carbon::parse($day)->endOfWeek()->format('Y年m月d日 H:i');
  161. $start_day = Carbon::parse($day)->startOfWeek()->toDateString();
  162. $timeTxt = "{$startTimeTxt}-{$endTimeTxt}";
  163. $rankings = Ranking::query()->where('day_type', DayTypeEnum::week)->where('day', $start_day)->with('user')->limit(self::TotalNums)->orderByDesc('xuefen')->get();
  164. $this->makeRangingImg($rankings, $timeTxt, $start_day, DayTypeEnum::week);
  165. $xueba = Ranking::query()->where('day_type', DayTypeEnum::week)->where('day', $start_day)->with(['user'])->where('is_xueba', ModelStatusEnum::OK)->first();
  166. $this->makeXueBaImg($xueba, $timeTxt, $start_day, DayTypeEnum::week);
  167. }
  168. //3.月排行榜
  169. $firstDay = Carbon::parse($now)->startOfMonth();
  170. if (Carbon::parse($now)->isSameDay($firstDay)) {
  171. $startTimeTxt = Carbon::parse($day)->startOfMonth()->format('Y年m月d日 H:i');
  172. $endTimeTxt = Carbon::parse($day)->endOfMonth()->format('Y年m月d日 H:i');
  173. $start_day = Carbon::parse($day)->startOfMonth()->toDateString();
  174. $timeTxt = "{$startTimeTxt}-{$endTimeTxt}";
  175. $rankings = Ranking::query()->where('day_type', DayTypeEnum::month)->where('day', $start_day)->with('user')->limit(self::TotalNums)->orderByDesc('xuefen')->get();
  176. $this->makeRangingImg($rankings, $timeTxt, $start_day, DayTypeEnum::month);
  177. $xueba = Ranking::query()->where('day_type', DayTypeEnum::month)->where('day', $start_day)->with(['user'])->where('is_xueba', ModelStatusEnum::OK)->first();
  178. $this->makeXueBaImg($xueba, $timeTxt, $start_day, DayTypeEnum::month);
  179. }
  180. //4.季排行榜
  181. $firstDay = Carbon::parse($now)->startOfQuarter();
  182. if (Carbon::parse($now)->isSameDay($firstDay)) {
  183. $startTimeTxt = Carbon::parse($day)->startOfQuarter()->format('Y年m月d日 H:i');
  184. $endTimeTxt = Carbon::parse($day)->endOfQuarter()->format('Y年m月d日 H:i');
  185. $this->line("季:{$startTimeTxt}--{$endTimeTxt}");
  186. $timeTxt = "{$startTimeTxt}-{$endTimeTxt}";
  187. $start_day = Carbon::parse($day)->startOfQuarter()->toDateString();
  188. $rankings = Ranking::query()->where('day_type', DayTypeEnum::quarter)->where('day', $start_day)->with('user')->limit(self::TotalNums)->orderByDesc('xuefen')->get();
  189. $this->makeRangingImg($rankings, $timeTxt, $start_day, DayTypeEnum::quarter);
  190. $xueba = Ranking::query()->where('day_type', DayTypeEnum::quarter)->where('day', $start_day)->with(['user'])->where('is_xueba', ModelStatusEnum::OK)->first();
  191. $this->makeXueBaImg($xueba, $timeTxt, $start_day, DayTypeEnum::quarter);
  192. }
  193. //5.年排行榜
  194. $firstDay = Carbon::parse($now)->startOfYear();
  195. if (Carbon::parse($now)->isSameDay($firstDay)) {
  196. $startTimeTxt = Carbon::parse($day)->startOfYear()->format('Y年m月d日 H:i');
  197. $endTimeTxt = Carbon::parse($day)->endOfYear()->format('Y年m月d日 H:i');
  198. $start_day = Carbon::parse($day)->startOfYear()->toDateString();
  199. $this->line($timeTxt . '==>' . $start_day . '===' . $start_day);
  200. $timeTxt = "{$startTimeTxt}-{$endTimeTxt}";
  201. $rankings = Ranking::query()->where('day_type', DayTypeEnum::year)->where('day', $start_day)->with('user')->limit(self::TotalNums)->orderByDesc('xuefen')->get();
  202. $this->makeRangingImg($rankings, $timeTxt, $start_day, DayTypeEnum::year);
  203. $xueba = Ranking::query()->where('day_type', DayTypeEnum::year)->where('day', $start_day)->with(['user'])->where('is_xueba', ModelStatusEnum::OK)->first();
  204. $this->makeXueBaImg($xueba, $timeTxt, $start_day, DayTypeEnum::year);
  205. }
  206. }
  207. /**
  208. * 生成学霸
  209. * @param $rankings
  210. * @param $timeTxt
  211. * @param $day
  212. * @param $day_type
  213. * @param $type
  214. * @return void
  215. */
  216. public function makeXueBaImg($ranking, $timeTxt, $day, $day_type, $group_id = 0)
  217. {
  218. $type = StatisticalResourceTypeEnum::xueba;
  219. $bgPath = Setting::byCodeGetSetting('h5_base_img_xueba_beijingtu') ?? base_path('Data/xueba_bg.jpg');
  220. $logo = base_path('Data/xueba_logo.jpg');
  221. try {
  222. $image = Image::make($bgPath);
  223. if (!$ranking) return;
  224. $user = $ranking['user'];
  225. $name = $this->filterEmoji($user['nickname']);
  226. $avatar = Image::make($user['headimg'])->resize(830, 830);
  227. $avatar = $this->imgCircle($avatar, 830);
  228. $avatar_x = 120;
  229. $avatar_y = 570;
  230. $image->insert($avatar, 'top-left', $avatar_x, $avatar_y);
  231. $image->insert($logo);
  232. $length = mb_strlen($name);
  233. if ($length >= 6) {
  234. $name = mb_substr($name, 0, 6);
  235. $h = 835 - 40;
  236. $y = 80;
  237. } elseif ($length == 5) {
  238. $h = 835 - 20;
  239. $y = 80;
  240. } elseif ($length == 4) {
  241. $h = 835;
  242. $y = 80;
  243. } elseif ($length == 3) {
  244. $h = 835 + 40;
  245. $y = 120;
  246. } elseif ($length == 2) {
  247. $h = 835 + 80;
  248. $y = 160;
  249. } else {
  250. $h = 835 + 160;
  251. $y = 0;
  252. }
  253. for ($i = 0; $i < $length; $i++) {
  254. $this->addText($image, mb_substr($name, $i, 1), 951, $h + $i * $y, 83, 'fff');
  255. }
  256. $timeTxt = Carbon::parse($day)->format("m月d日");
  257. $this->addText($image, $timeTxt, 250, 440, 150, 'FFF', base_path("Data/ziti/zi.otf"));
  258. $dir = "xuebaImg/" . $day_type . '/' . $day;
  259. $filename = Str::random() . '.png';
  260. Storage::disk('public')->put("{$dir}/{$filename}.txt", 1);
  261. $path = Storage::disk('public')->path("{$dir}/{$filename}");
  262. $image->save($path);
  263. Storage::disk('public')->delete("{$dir}/{$filename}.txt");
  264. StatisticalResource::query()->updateOrCreate([
  265. 'day_type' => $day_type,
  266. 'day' => $day,
  267. 'type' => $type,
  268. 'group_id' => $group_id,
  269. ], [
  270. 'page' => 1,
  271. 'status' => ModelStatusEnum::OK,
  272. 'path' => "{$dir}/{$filename}",
  273. 'user_ids' => [$user['id']]
  274. ]);
  275. } catch (\Exception $exception) {
  276. log_record('排行榜生成异常', compact('ranking', 'bgPath', 'timeTxt', 'day_type', 'day'));
  277. Log::error($exception);
  278. }
  279. }
  280. /**
  281. * 生成排行榜
  282. * @param $rankings
  283. * @param $timeTxt
  284. * @param $day
  285. * @param $day_type
  286. * @param $type
  287. * @return void
  288. */
  289. public function makeRangingImg($rankings, $timeTxt, $day, $day_type, $group_id = 0)
  290. {
  291. $type = StatisticalResourceTypeEnum::paihangbang;
  292. if ($group_id) {
  293. $bgPath = Setting::byCodeGetSetting('h5_base_img_ranking_group_' . $group_id);
  294. } else {
  295. $bgPath = Setting::byCodeGetSetting('h5_base_img_ranking');
  296. }
  297. $bgPath = $bgPath ?? base_path('Data/paihangbang_bg.jpg');
  298. log_record('学霸', ['bg' => $bgPath, 'day' => $day, 'day_type' => $day_type, 'group_id' => $group_id]);
  299. $start_x = 90;
  300. $x_py = 490;
  301. $start_y = 750;
  302. $y_py = 0;
  303. $pageNums = 15;
  304. $rowY = 77;
  305. $count = count($rankings);
  306. if (!$count) return;
  307. $tPage = ceil($count / self::PageNums);
  308. try {
  309. for ($page = 0; $page < $tPage; $page++) {
  310. $image = Image::make($bgPath);
  311. $headimgBg = Image::make(base_path('Data/headimg_bg.png'));
  312. $user_ids = [];
  313. foreach ($rankings as $k => $ranking) {
  314. $user = $ranking['user'];
  315. $user_ids[] = $user['id'];
  316. $num = $k + 1 + ($page * 30);
  317. $name = "{$num}." . self::filterEmoji($user['nickname']);
  318. $avatar = Image::make($user['headimg']);
  319. $avatar = self::imgCircle($avatar, 60);
  320. $score = $ranking['xuefen'];
  321. if ($k >= ($pageNums * 2)) continue;
  322. $h = $k;
  323. if ($k >= $pageNums) {
  324. $start_x += $x_py;
  325. $h -= $pageNums;
  326. }
  327. $avatar_x = $start_x;
  328. $name_x = $start_x + 83;
  329. $score_x = $start_x + 367;
  330. $name_y = $start_y + $h * $rowY;
  331. $score_y = $start_y + $h * $rowY;
  332. $avatar_y = $start_y - 40 + $h * $rowY;
  333. // $avatar_x = 72;
  334. // $name_x = 155;
  335. // $score_x = 439;
  336. //
  337. // $jt = -300;
  338. // $avatar_y = 1000 + ($k) * 80 + $jt;
  339. // $name_y = 1040 + ($k) * 80 + $jt;
  340. // $score_y = 1040 + ($k) * 80 + $jt;
  341. //
  342. // if ($k >= 15) {
  343. //
  344. // $avatar_y = 1000 + ($k - 15) * 80 + $jt;
  345. // $name_y = 1040 + ($k - 15) * 80 + $jt;
  346. // $score_y = 1040 + ($k - 15) * 80 + $jt;
  347. //
  348. // $avatar_x = 578;
  349. // $name_x = 660;
  350. // $score_x = 947;
  351. // }
  352. $image->insert($avatar, 'top-left', $avatar_x, $avatar_y);
  353. $image->insert($headimgBg, 'top-left', $avatar_x, $avatar_y);
  354. $this->addText($image, $name, $name_x, $name_y, 30, '000');
  355. $this->addText($image, $score, $score_x, $score_y, 30, '000');
  356. }
  357. self::addText($image, $timeTxt, 101, 2320, 41, 'F8ECD2');
  358. $dir = "rankImg/" . $day_type . '/' . $day;
  359. $filename = Str::random() . '.png';
  360. Storage::disk('public')->put("{$dir}/{$filename}.txt", 1);
  361. $path = Storage::disk('public')->path("{$dir}/{$filename}");
  362. $image->save($path);
  363. Storage::disk('public')->delete("{$dir}/{$filename}.txt");
  364. StatisticalResource::query()->updateOrCreate([
  365. 'day_type' => $day_type,
  366. 'day' => $day,
  367. 'type' => $type,
  368. 'page' => ($page + 1),
  369. 'group_id' => $group_id
  370. ], [
  371. 'user_ids' => $user_ids,
  372. 'status' => ModelStatusEnum::OK,
  373. 'path' => "{$dir}/{$filename}"
  374. ]);
  375. }
  376. } catch (\Exception $exception) {
  377. log_record('排行榜生成异常', compact('rankings', 'bgPath', 'timeTxt', 'day_type', 'day'));
  378. Log::error($exception);
  379. }
  380. }
  381. public static function addText(&$bgImage, $text, $x, $y, $size, $color, $ziti = '')
  382. {
  383. if (!$ziti) $ziti = base_path('Data/ziti/ht.otf');
  384. // $y += ($size / 2);
  385. $bgImage->text($text, $x, $y, function ($font) use ($size, $color, $ziti) {
  386. $font->file($ziti);
  387. $font->size($size);
  388. $font->color($color);
  389. $font->angle(0);
  390. });
  391. // return $bgImage;
  392. }
  393. /**
  394. * 处理头像
  395. * @param $path
  396. * @return \Intervention\Image\Image
  397. */
  398. private static function imgCircle($img2, $size = 60)
  399. {
  400. $img2 = $img2->resize($size, $size);
  401. $r = $img2->width() / 2;
  402. $img3 = Image::canvas($size, $size);
  403. for ($x = 0; $x < $img2->width(); $x++) {
  404. for ($y = 0; $y < $img2->height(); $y++) {
  405. if (((($x - $r) * ($x - $r) + ($y - $r) * ($y - $r)) < ($r * $r))) {
  406. $c = $img2->pickColor($x, $y, 'array');
  407. $img3->pixel($c, $x, $y);
  408. }
  409. }
  410. }
  411. return $img3;
  412. }
  413. /**
  414. * 过滤符号
  415. * @param $str
  416. * @return mixed
  417. */
  418. private static function filterEmoji($str, $maxLen = 5)
  419. {
  420. $str = json_encode($str);
  421. $str = json_decode(preg_replace("#(\\\ud[0-9a-f]{3})#i", "", $str));
  422. if (mb_strlen($str) > $maxLen) {
  423. $str = mb_substr($str, 0, $maxLen);
  424. }
  425. return $str;
  426. }
  427. private static function getImgPath($dir_fix, $day_type, $day)
  428. {
  429. $dir = "{$dir_fix}/" . $day_type . '/' . $day;
  430. $filename = Str::random() . '.png';
  431. Storage::disk('public')->put("{$dir}/{$filename}.txt", 1);
  432. $path = Storage::disk('public')->path("{$dir}/{$filename}");
  433. return [
  434. 'path' => $path,
  435. 'xd_path' => "{$dir}/{$filename}",
  436. 'ls_file' => "{$dir}/{$filename}.txt"
  437. ];
  438. }
  439. }