From 090ce1cf1880e2b1a4a5c26600600f0490551ff7 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Tue, 13 Dec 2022 19:05:06 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E7=AD=BE=E5=88=B0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/SystemController.php | 8 +-- app/Http/Controllers/Api/UsersController.php | 8 +-- app/Models/UserCheckinRecord.php | 52 ++++++++++++++++--- 3 files changed, 53 insertions(+), 15 deletions(-) diff --git a/app/Http/Controllers/Api/SystemController.php b/app/Http/Controllers/Api/SystemController.php index cbbd913b2..1c51103c8 100755 --- a/app/Http/Controllers/Api/SystemController.php +++ b/app/Http/Controllers/Api/SystemController.php @@ -864,7 +864,7 @@ class SystemController extends AbstractController $users = User::whereIn('userid', $userid)->take(20)->get(); /** @var User $user */ foreach ($users as $user) { - $records = UserCheckinRecord::whereUserid($user->userid)->whereBetween("created_at", [$startD, $endD])->orderBy('id')->get()->keyBy('date'); + $recordTimes = UserCheckinRecord::getTimes($user->userid, [$startD, $endD]); // $nickname = Base::filterEmoji($user->nickname); $styles = ["A1:H1" => ["font" => ["bold" => true]]]; @@ -875,8 +875,8 @@ class SystemController extends AbstractController while ($startT < $endT) { $index++; $sameDate = date("Y-m-d", $startT); - $sameRecord = isset($records[$sameDate]) ? $records[$sameDate] : null; - $sameCollect = $sameRecord?->atCollect(); + $sameTimes = $recordTimes[$sameDate] ?? []; + $sameCollect = UserCheckinRecord::atCollect($sameDate, $sameTimes); $firstBetween = [Carbon::createFromTimestamp($startT), Carbon::createFromTimestamp($startT + $secondEnd - 1)]; $lastBetween = [Carbon::createFromTimestamp($startT + $secondStart + 1), Carbon::createFromTimestamp($startT + 86400)]; $firstRecord = $sameCollect?->whereBetween("datetime", $firstBetween)->first(); @@ -912,7 +912,7 @@ class SystemController extends AbstractController $lastTimestamp = $lastTimestamp ? date("H:i", $lastTimestamp) : "-"; $section = array_map(function($item) { return $item[0] . "-" . ($item[1] ?: "None"); - }, $sameRecord?->atSection() ?: []); + }, UserCheckinRecord::atSection($sameTimes)); $datas[] = [ "{$nickname} (ID: {$user->userid})", $sameDate, diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index 3d3a5e964..0c9e73bf5 100755 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -1412,17 +1412,17 @@ class UsersController extends AbstractController $start = Carbon::parse(date("Y-m-01 00:00:00", strtotime($ym))); $end = (clone $start)->addMonth()->subSecond(); // - $records = UserCheckinRecord::whereUserid($user->userid)->whereBetween('created_at', [$start, $end])->orderBy('id')->get()->keyBy('date'); + $recordTimes = UserCheckinRecord::getTimes($user->userid, [$start, $end]); $array = []; $startT = $start->timestamp; $endT = $end->timestamp; while ($startT < $endT) { $sameDate = date("Y-m-d", $startT); - $sameRecord = isset($records[$sameDate]) ? $records[$sameDate] : null; - if ($sameRecord) { + $sameTimes = $recordTimes[$sameDate] ?? []; + if ($sameTimes) { $array[] = [ 'date' => $sameDate, - 'section' => $sameRecord->atSection(), + 'section' => UserCheckinRecord::atSection($sameTimes), ]; } $startT += 86400; diff --git a/app/Models/UserCheckinRecord.php b/app/Models/UserCheckinRecord.php index 973c8f4a1..86967f781 100644 --- a/app/Models/UserCheckinRecord.php +++ b/app/Models/UserCheckinRecord.php @@ -45,32 +45,70 @@ class UserCheckinRecord extends AbstractModel return Base::json2array($value); } + /** + * 获取签到时间 + * @param int $userid + * @param array $betweenTimes + * @return array + */ + public static function getTimes(int $userid, array $betweenTimes) + { + $array = []; + $records = self::whereUserid($userid)->whereBetween('created_at', $betweenTimes)->orderBy('id')->get(); + /** @var self $record */ + foreach ($records as $record) { + $times = array_map(function ($time) { + return preg_replace("/(\d+):(\d+):\d+$/", "$1:$2", $time); + }, $record->times); + if (isset($array[$record->date])) { + $array[$record->date] = array_merge($array[$record->date], $times); + } else { + $array[$record->date] = $times; + } + } + // + foreach ($array as $date => $times) { + $times = array_values(array_filter(array_unique($times))); + $inOrder = []; + foreach ($times as $key => $time) { + $inOrder[$key] = strtotime("2022-01-01 {$time}"); + } + array_multisort($inOrder, SORT_ASC, $times); + $array[$date] = $times; + } + // + return $array; + } + /** * 时间收集 + * @param string $data + * @param array $times * @return \Illuminate\Support\Collection */ - public function atCollect() + public static function atCollect($data, $times) { - $sameTimes = array_map(function($time) { + $sameTimes = array_map(function($time) use ($data) { return [ - "datetime" => "{$this->date} {$time}", - "timestamp" => strtotime("{$this->date} {$time}") + "datetime" => "{$data} {$time}", + "timestamp" => strtotime("{$data} {$time}") ]; - }, $this->times); + }, $times); return collect($sameTimes); } /** * 签到时段 + * @param array $times * @param int $diff 多长未签到算失效(秒) * @return array */ - public function atSection($diff = 3600) + public static function atSection($times, $diff = 3600) { $start = ""; $end = ""; $array = []; - foreach ($this->times as $time) { + foreach ($times as $time) { $time = preg_replace("/(\d+):(\d+):\d+$/", "$1:$2", $time); if (empty($start)) { $start = $time;