diff --git a/app/Console/Commands/CateRank.php b/app/Console/Commands/CateRank.php index 1c5111d..5f23d80 100644 --- a/app/Console/Commands/CateRank.php +++ b/app/Console/Commands/CateRank.php @@ -36,16 +36,14 @@ class CateRank extends Command $sn = $time->year . '-' . $time->quarter; $list = []; CateRankModel::where('sn', $sn)->delete(); - $scoreList = UserScore::query() - ->whereBetween('created_at', [$start, $end]) - ->select('cate_id', DB::raw('sum(`score`) as `score`')) - ->groupBy('cate_id') - ->get(); - foreach ($scoreList as $item) { + $cateList = PartyCate::withCount(['users'])->get(); + foreach ($cateList as $item) { $list[] = [ 'sn' => $sn, - 'cate_id' => $item->cate_id, - 'score' => $item->score, + 'cate_id' => $item->id, + 'score' => $item->current_score, + 'count' => $item->users_count, + 'avg_score' => floor($item->score/$item->users_count), 'created_at' => $now, 'updated_at' => $now, ]; diff --git a/app/Http/Controllers/Api/CateRankController.php b/app/Http/Controllers/Api/CateRankController.php new file mode 100644 index 0000000..505ca4e --- /dev/null +++ b/app/Http/Controllers/Api/CateRankController.php @@ -0,0 +1,90 @@ +filled('limit')) { + $query->limit($request->input('limit')); + } + + $user = auth('api')->user(); + // 当前用户所在的支部排名 + $current = ['score' => '-', 'rank' => '-', 'cate' => '']; + + $list = $query->get(); + $rankList = collect(); + foreach ($list as $item) { + $rankList->push([ + 'id' => $item->id, + 'name' => $item->name, + 'count' => $item->users_count, + 'score' => floor($item->current_score / $item->users_count), + ]); + } + $rankList = $rankList->sortByDesc('score'); + $rankList = $rankList->values()->map(function ($item, $index) use ($user, &$current) { + $item['rank'] = $index + 1; + if ($user && $item['id'] == $user->cate_id) { + $current['cate'] = $item['name']; + $current['rank'] = $item['rank']; + $current['score'] = $item['score']; + } + return $item; + }); + + return $this->response()->success(['list' => $rankList, 'current' => $current]); + } + + // 党支部排名期数 + public function dates() + { + $query = CateRank::query(); + $list = $query->select('sn')->groupBy('sn')->pluck('sn'); + + return $this->response()->success($list); + } + + // 党支部其他季度的排名记录 + public function list(Request $request) + { + $request->validate([ + // 期数 + 'sn' => 'required', + ]); + $type = $request->input('column', 'avg_score'); + $list = CateRank::with(['cate']) + ->where('sn', $request->input('sn')) + ->orderBy($type, 'desc') + ->get(); + $rankList = []; + $user = auth('api')->user(); + // 当前用户所在的支部排名 + $current = ['score' => '-', 'rank' => '-', 'cate' => '']; + foreach ($list as $index => $item) { + $rankItem = [ + 'id' => $item->id, + 'name' => $item->cate?->name, + 'rank' => $index + 1, + 'score' => $item->$type, + ]; + $rankList[] = $rankItem; + + if ($user && $rankItem['id'] == $user->cate_id) { + $current['cate'] = $rankItem['name']; + $current['rank'] = $rankItem['rank']; + $current['score'] = $rankItem['score']; + } + } + + return $this->response()->success(['list' => $rankList, 'current' => $current]); + } +} diff --git a/app/Http/Controllers/Api/UserRankController.php b/app/Http/Controllers/Api/UserRankController.php new file mode 100644 index 0000000..0950bbe --- /dev/null +++ b/app/Http/Controllers/Api/UserRankController.php @@ -0,0 +1,84 @@ +filled('limit')) { + $query->limit($request->input('limit')); + } + + $user = auth('api')->user(); + // 当前用户的排名 + $current = ['score' => '-', 'rank' => '-']; + + $list = $query->orderBy('current_score', 'desc')->get(); + $rankList = []; + foreach($list as $index => $item) { + $rankItem = [ + 'id' => $item->id, + 'name' => $item->name, + 'rank' => $index + 1, + 'score' => $item->current_score + ]; + $rankList[] = $rankItem; + if ($user && $rankItem['id'] == $user->id) { + $current['rank'] = $rankItem['rank']; + $current['score'] = $rankItem['score']; + } + } + + return $this->response()->success(['list' => $rankList, 'current' => $current]); + } + + // 党员排名期数 + public function dates() + { + $query = UserRank::query(); + $list = $query->select('sn')->groupBy('sn')->pluck('sn'); + + return $this->response()->success($list); + } + + // 党员其他季度的排名记录 + public function list(Request $request) + { + $request->validate([ + // 期数 + 'sn' => 'required', + ]); + $list = UserRank::with(['user']) + ->where('sn', $request->input('sn')) + ->orderBy('score', 'desc') + ->get(); + $rankList = []; + $user = auth('api')->user(); + // 当前用户所在的支部排名 + $current = ['score' => '-', 'rank' => '-', 'cate' => '']; + foreach ($list as $index => $item) { + $rankItem = [ + 'id' => $item->id, + 'name' => $item->user?->name, + 'rank' => $index + 1, + 'score' => $item->score, + ]; + $rankList[] = $rankItem; + + if ($user && $rankItem['id'] == $user->cate_id) { + $current['cate'] = $rankItem['name']; + $current['rank'] = $rankItem['rank']; + $current['score'] = $rankItem['score']; + } + } + + return $this->response()->success(['list' => $rankList, 'current' => $current]); + } +} diff --git a/app/Models/CateRank.php b/app/Models/CateRank.php index 456ab37..a59e81a 100644 --- a/app/Models/CateRank.php +++ b/app/Models/CateRank.php @@ -14,7 +14,7 @@ class CateRank extends Model use HasDateTimeFormatter, Filterable; protected $table = 'cate_rank'; - protected $fillable = ['sn', 'cate_id', 'score']; + protected $fillable = ['sn', 'cate_id', 'score', 'count']; public function cate() { diff --git a/database/migrations/2023_12_05_104656_create_user_rank_table.php b/database/migrations/2023_12_05_104656_create_user_rank_table.php index a4993ec..df1aaa7 100644 --- a/database/migrations/2023_12_05_104656_create_user_rank_table.php +++ b/database/migrations/2023_12_05_104656_create_user_rank_table.php @@ -16,7 +16,7 @@ return new class extends Migration $table->string('sn')->comment('期数(第一期: 202301)'); $table->unsignedBigInteger('cate_id')->comment('支部(party_cates.id)'); $table->unsignedBigInteger('user_id')->comment('党员(party_users.id)'); - $table->unsignedInteger('score')->default(0)->comment('得分'); + $table->unsignedInteger('score')->default(0)->comment('累计得星'); $table->timestamps(); $table->comment('党员排名'); @@ -26,7 +26,9 @@ return new class extends Migration $table->id(); $table->string('sn')->comment('期数(第一期: 202301)'); $table->unsignedBigInteger('cate_id')->comment('支部(party_cates.id)'); - $table->unsignedInteger('score')->default(0)->comment('得分'); + $table->unsignedInteger('score')->default(0)->comment('累计得星'); + $table->unsignedInteger('avg_score')->default(0)->comment('人均得星'); + $table->unsignedInteger('count')->default(0)->comment('人数'); $table->timestamps(); $table->comment('支部排名'); diff --git a/lang/zh_CN/party_cate.php b/lang/zh_CN/party_cate.php index ac3202a..386c7e9 100644 --- a/lang/zh_CN/party_cate.php +++ b/lang/zh_CN/party_cate.php @@ -9,7 +9,7 @@ return [ 'master_id' => '书记', 'plan_id' => '组织委员', 'remarks' => '备注', - 'score' => '累计得分', + 'score' => '累计得星', 'scores' => '五星维度', - 'current_score' => '当前得分', + 'current_score' => '当前得星', ]; diff --git a/lang/zh_CN/party_user.php b/lang/zh_CN/party_user.php index 65332ef..6becadf 100644 --- a/lang/zh_CN/party_user.php +++ b/lang/zh_CN/party_user.php @@ -11,7 +11,7 @@ return [ 'avatar' => '头像', 'cate_id' => '党支部', 'remarks' => '备注', - 'score' => '累计得分', - 'current_score' => '当前得分', + 'score' => '累计得星', + 'current_score' => '当前得星', 'scores' => '五星维度', ]; diff --git a/lang/zh_CN/user_rank.php b/lang/zh_CN/user_rank.php index 3a79617..36ccd5c 100644 --- a/lang/zh_CN/user_rank.php +++ b/lang/zh_CN/user_rank.php @@ -11,6 +11,8 @@ return [ 'sn' => '期数', 'user_id' => '党员', 'cate_id' => '支部', - 'score' => '得分', + 'score' => '累计得星', + 'avg_score' => '平均得星', 'sort' => '排名', + 'count' => '人数', ]; diff --git a/lang/zh_CN/user_score.php b/lang/zh_CN/user_score.php index ed8dc9c..35372a6 100644 --- a/lang/zh_CN/user_score.php +++ b/lang/zh_CN/user_score.php @@ -16,5 +16,5 @@ return [ 'check_user_id' => '审核人', 'check_remarks' => '未通过原因', 'check_at' => '审核时间', - 'score' => '得分', + 'score' => '得星', ]; diff --git a/routes/api.php b/routes/api.php index 245cfba..e4c7193 100644 --- a/routes/api.php +++ b/routes/api.php @@ -21,9 +21,15 @@ Route::get('banner', [\App\Http\Controllers\Api\BannerController::class, 'index' Route::post('login', [\App\Http\Controllers\Api\AuthController::class, 'login']); -Route::get('rank', [\App\Http\Controllers\Api\RankController::class, 'index']); -Route::get('rank/list', [\App\Http\Controllers\Api\RankController::class, 'list']); -Route::get('rank/dates', [\App\Http\Controllers\Api\RankController::class, 'dates']); +// 党支部排名 +Route::get('rank/cate', [\App\Http\Controllers\Api\CateRankController::class, 'index']); +Route::get('rank/cate/dates', [\App\Http\Controllers\Api\CateRankController::class, 'dates']); +Route::get('rank/cate/list', [\App\Http\Controllers\Api\CateRankController::class, 'list']); + +// 党员排名 +Route::get('rank/user', [\App\Http\Controllers\Api\UserRankController::class, 'index']); +Route::get('rank/user/dates', [\App\Http\Controllers\Api\UserRankController::class, 'dates']); +Route::get('rank/user/list', [\App\Http\Controllers\Api\UserRankController::class, 'list']); Route::get('article/common', [\App\Http\Controllers\Api\ArticleController::class, 'common']); @@ -36,8 +42,5 @@ Route::group(['middleware' => 'auth:api'], function () { Route::get('article/cate', [\App\Http\Controllers\Api\ArticleController::class, 'cate']); - Route::get('rank/current', [\App\Http\Controllers\Api\RankController::class, 'current']); - Route::get('rank/current-list', [\App\Http\Controllers\Api\RankController::class, 'currentList']); - Route::apiResource('user/score', \App\Http\Controllers\Api\UserScoreController::class); });