diff --git a/app/Admin/Controllers/CateRankController.php b/app/Admin/Controllers/CateRankController.php new file mode 100644 index 0000000..4eeca0e --- /dev/null +++ b/app/Admin/Controllers/CateRankController.php @@ -0,0 +1,46 @@ +baseCRUD() + ->filterTogglable(false) + ->columnsTogglable(false) + ->headerToolbar([]) + ->footerToolbar([]) + ->loadDataOnce() + ->initFetch(false) + ->filter($this->baseFilter()->actions()->body([ + amisMake()->SelectControl()->name('sn')->label(__('user_rank.sn'))->options($this->getSnOptions())->size('md'), + amisMake()->Component()->setType('submit')->label(__('admin.search'))->level('primary'), + ])) + ->columns([ + amisMake()->TableColumn()->name('cate.name')->label(__('user_rank.cate_id')), + amisMake()->TableColumn()->name('sort')->label(__('user_rank.sort'))->set('type', 'tpl')->tpl('${(start - 1) * size + index + 1}'), + amisMake()->TableColumn()->name('score')->label(__('user_rank.score')), + ]); + + return $this->baseList($crud); + } + + public function getSnOptions() + { + if (!$this->snOptions) { + $this->snOptions = CateRank::select('sn')->groupBy('sn')->orderBy('sn', 'desc')->pluck('sn'); + } + + return $this->snOptions; + } +} diff --git a/app/Admin/Controllers/KeywordsController.php b/app/Admin/Controllers/KeywordsController.php index 034af80..125d78e 100644 --- a/app/Admin/Controllers/KeywordsController.php +++ b/app/Admin/Controllers/KeywordsController.php @@ -14,8 +14,6 @@ class KeywordsController extends AdminController { protected string $serviceName = KeywordService::class; - protected string $pageTitle = '字典管理'; - public function list(): Page { $crud = $this->baseCRUD() diff --git a/app/Admin/Controllers/PartyCateController.php b/app/Admin/Controllers/PartyCateController.php index 2cb6f70..1f25487 100644 --- a/app/Admin/Controllers/PartyCateController.php +++ b/app/Admin/Controllers/PartyCateController.php @@ -97,8 +97,8 @@ class PartyCateController extends AdminController { return $this->baseForm()->title('')->body([ amisMake()->TextControl()->name('name')->label(__('party_cate.name'))->required(), - amisMake()->SelectControl()->name('master_id')->label(__('party_cate.master_id'))->options($this->getUserOptions()), - amisMake()->SelectControl()->name('plan_id')->label(__('party_cate.plan_id'))->options($this->getUserOptions()), + amisMake()->SelectControl()->name('master_id')->label(__('party_cate.master_id'))->options($this->getUserOptions())->searchable(), + amisMake()->SelectControl()->name('plan_id')->label(__('party_cate.plan_id'))->options($this->getUserOptions())->searchable(), amisMake()->TextControl()->name('remarks')->label(__('party_cate.remarks')), ]); } diff --git a/app/Admin/Controllers/UserRankController.php b/app/Admin/Controllers/UserRankController.php new file mode 100644 index 0000000..6ddc9d3 --- /dev/null +++ b/app/Admin/Controllers/UserRankController.php @@ -0,0 +1,50 @@ +baseCRUD() + ->filterTogglable(false) + ->columnsTogglable(false) + ->loadDataOnce(true) + ->footerToolbar([]) + ->headerToolbar([]) + ->initFetch(false) + ->filter($this->baseFilter()->actions()->body([ + amisMake()->SelectControl()->name('sn')->label(__('user_rank.sn'))->options($this->getSnOptions())->size('md'), + amisMake()->Component()->setType('submit')->label(__('admin.search'))->level('primary'), + ])) + ->columns([ + amisMake()->TableColumn()->name('cate.name')->label(__('user_rank.cate_id')), + amisMake()->TableColumn()->name('user.name')->label(__('user_rank.user_id')), + amisMake()->TableColumn()->name('sort')->label(__('user_rank.sort'))->set('type', 'tpl')->tpl('${(start - 1) * size + index + 1}'), + amisMake()->TableColumn()->name('score')->label(__('user_rank.score')), + ]); + + return $this->baseList($crud); + } + + public function getSnOptions() + { + if (!$this->snOptions) { + $this->snOptions = UserRank::select('sn')->groupBy('sn')->orderBy('sn', 'desc')->pluck('sn'); + } + + return $this->snOptions; + } +} diff --git a/app/Admin/Controllers/UserScoreController.php b/app/Admin/Controllers/UserScoreController.php index a047f69..50af742 100644 --- a/app/Admin/Controllers/UserScoreController.php +++ b/app/Admin/Controllers/UserScoreController.php @@ -5,7 +5,6 @@ namespace App\Admin\Controllers; use App\Admin\Services\UserScoreService; use App\Enums\CheckStatus; use App\Exceptions\BaseException; -use App\Models\Keyword; use App\Models\PartyUser; use App\Models\UserScore; use Illuminate\Http\Request; @@ -31,9 +30,10 @@ class UserScoreController extends AdminController ]) ->filter($this->baseFilter()->actions([])->body([ amisMake()->SelectControl()->name('type_id')->label(__('user_score.type_id'))->options($this->getTypeOptions())->clearable()->size('md'), - amisMake()->SelectControl()->name('user_id')->label(__('user_score.user_id'))->options($this->getUserOptions())->clearable()->size('md'), + amisMake()->SelectControl()->name('user_id')->label(__('user_score.user_id'))->options($this->getUserOptions())->clearable()->searchable()->size('md'), amisMake()->TextControl()->name('title')->label(__('user_score.title'))->clearable()->size('md'), amisMake()->SelectControl()->name('check_status')->label(__('user_score.check_status'))->options(CheckStatus::options())->clearable()->size('md'), + amisMake()->DateRangeControl()->name('created_range')->label(__('user_score.created_at'))->clearable()->size('md'), amisMake()->Component()->setType('submit')->label(__('admin.search'))->level('primary'), ])) ->columns([ diff --git a/app/Admin/Services/CateRankService.php b/app/Admin/Services/CateRankService.php new file mode 100644 index 0000000..9721575 --- /dev/null +++ b/app/Admin/Services/CateRankService.php @@ -0,0 +1,40 @@ +getModelFilter(); + + $query = $this->query(); + if ($this->withRelationships) { + $query->with($this->withRelationships); + } + + if ($filter) { + $query->filter(request()->input(), $filter); + } + + return $query->sort(); + } + + public function list() + { + $query = $this->listQuery(); + + $items = (clone $query)->get(); + + return compact('items'); + } +} diff --git a/app/Admin/Services/PartyCateService.php b/app/Admin/Services/PartyCateService.php index bb11242..ca71995 100644 --- a/app/Admin/Services/PartyCateService.php +++ b/app/Admin/Services/PartyCateService.php @@ -3,8 +3,10 @@ namespace App\Admin\Services; use App\ModelFilters\PartyCateFilter; +use App\Models\CateRank; use App\Models\PartyCate; use App\Models\PartyUser; +use App\Models\UserRank; use App\Models\UserScore; use Slowlyo\OwlAdmin\Models\AdminPermission; use Slowlyo\OwlAdmin\Services\AdminPermissionService; @@ -44,11 +46,14 @@ class PartyCateService extends BaseService public function preDelete(array $ids) { - $userIds = PartyUser::whereIn('cate_id', $ids)->pluck('id'); - // 删除支部下面的党员记录 + // 删除党员记录 PartyUser::whereIn('cate_id', $ids)->delete(); - // 删除党员下面的审核记录 - UserScore::whereIn('user_id', $userIds)->delete(); + // 删除审核记录 + UserScore::whereIn('cate_id', $ids)->delete(); + // 删除支部排名记录 + CateRank::whereIn('cate_id', $ids)->delete(); + // 删除党员排名记录 + UserRank::whereIn('cate_id', $ids)->delete(); // 删除权限 AdminPermission::whereIn('slug', array_map(fn ($v) => 'party_cate_' . $v, $ids))->delete(); return true; diff --git a/app/Admin/Services/PartyUserService.php b/app/Admin/Services/PartyUserService.php index deea48a..d8b3115 100644 --- a/app/Admin/Services/PartyUserService.php +++ b/app/Admin/Services/PartyUserService.php @@ -5,6 +5,7 @@ namespace App\Admin\Services; use App\ModelFilters\PartyUserFilter; use App\Models\Keyword; use App\Models\PartyUser; +use App\Models\UserRank; use App\Models\UserScore; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule; @@ -17,6 +18,15 @@ class PartyUserService extends BaseService protected string $modelFilterName = PartyUserFilter::class; + public function preDelete(array $ids) + { + // 删除审核记录 + UserScore::whereIn('user_id', $ids)->delete(); + // 删除党员排名记录 + UserRank::whereIn('user_id', $ids)->delete(); + return true; + } + public function validate($data, $model = null) { $createRules = [ @@ -52,7 +62,15 @@ class PartyUserService extends BaseService return $data; } - public function incrementScore(PartyUser $user, $type, $score) + /** + * 增加党员得分 + * + * @param PartyUser $user 党员 + * @param string $type 类型 keywords(score_cate).key + * @param int $score 得分 + * @return void + */ + public function incrementScore(PartyUser $user, string $type, int $score) { $scores = $user->scores; if (isset($scores[$type])) { @@ -63,6 +81,7 @@ class PartyUserService extends BaseService 'scores' => $scores, ]); + // 同时增加党支部的得分 if ($user->cate) { PartyCateService::make()->incrementScore($user->cate, $type, $score); } diff --git a/app/Admin/Services/UserRankService.php b/app/Admin/Services/UserRankService.php new file mode 100644 index 0000000..60cc85d --- /dev/null +++ b/app/Admin/Services/UserRankService.php @@ -0,0 +1,40 @@ +getModelFilter(); + + $query = $this->query(); + if ($this->withRelationships) { + $query->with($this->withRelationships); + } + + if ($filter) { + $query->filter(request()->input(), $filter); + } + + return $query->sort(); + } + + public function list() + { + $query = $this->listQuery(); + + $items = (clone $query)->get(); + + return compact('items'); + } +} diff --git a/app/Admin/Services/UserScoreService.php b/app/Admin/Services/UserScoreService.php index ddb6b17..f8f7fb2 100644 --- a/app/Admin/Services/UserScoreService.php +++ b/app/Admin/Services/UserScoreService.php @@ -18,6 +18,22 @@ class UserScoreService extends BaseService protected string $modelFilterName = UserScoreFilter::class; + public function listQuery() + { + $filter = $this->getModelFilter(); + + $query = $this->query(); + if ($this->withRelationships) { + $query->with($this->withRelationships); + } + + if ($filter) { + $query->filter(request()->input(), $filter); + } + + return $query->sort(); + } + public function check(UserScore $info, $options = []) { if ($info->check_status == CheckStatus::Success) { @@ -47,6 +63,10 @@ class UserScoreService extends BaseService if (!$model) { $data['cate_id'] = PartyUser::where('id', $data['user_id'])->value('cate_id'); } + $images = data_get($data, 'images'); + if ($images && !is_array($images)) { + $data['images'] = explode(',', $images); + } return $data; } @@ -69,4 +89,17 @@ class UserScoreService extends BaseService } return true; } + + + /** + * 统计时间段内党员得分 + * + * @param $start + * @param $end + * @return void + */ + public static function userTotal($start, $end) + { + $list = UserScore::where('check_status', CheckStatus::Success)->whereBetween('check_at', [$start, $end])->get(); + } } diff --git a/app/Admin/routes.php b/app/Admin/routes.php index e7a6a7b..80be8e1 100644 --- a/app/Admin/routes.php +++ b/app/Admin/routes.php @@ -50,4 +50,9 @@ Route::group([ // 评议审核 $router->post('user-score/{id}/check', [\App\Admin\Controllers\UserScoreController::class, 'check']); $router->resource('user-score', \App\Admin\Controllers\UserScoreController::class)->names('admin.user_score'); + + // 党员排名 + $router->resource('user-rank', \App\Admin\Controllers\UserRankController::class)->names('admin.user_rank'); + // 党支部排名 + $router->resource('cate-rank', \App\Admin\Controllers\CateRankController::class)->names('admin.cate_rank'); }); diff --git a/app/Console/Commands/CateRank.php b/app/Console/Commands/CateRank.php new file mode 100644 index 0000000..8026670 --- /dev/null +++ b/app/Console/Commands/CateRank.php @@ -0,0 +1,52 @@ +copy()->subQuarter(); + $start = $time->copy()->startOfQuarter(); + $end = $time->copy()->endOfQuarter(); + $sn = $time->year . '-' . $time->quarter; + $list = []; + $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) { + $list[] = [ + 'sn' => $sn, + 'cate_id' => $item->cate_id, + 'score' => $item->score, + 'created_at' => $now, + 'updated_at' => $now, + ]; + } + \App\Models\CateRank::insert($list); + } +} diff --git a/app/Console/Commands/UserRank.php b/app/Console/Commands/UserRank.php new file mode 100644 index 0000000..c9afff6 --- /dev/null +++ b/app/Console/Commands/UserRank.php @@ -0,0 +1,54 @@ +copy()->subQuarter(); + $start = $time->copy()->startOfQuarter(); + $end = $time->copy()->endOfQuarter(); + $sn = $time->year . '-' . $time->quarter; + $list = []; + + $scoreList = UserScore::with(['user']) + ->whereBetween('created_at', [$start, $end]) + ->select('user_id', DB::raw('sum(`score`) as `score`')) + ->groupBy('user_id') + ->get(); + foreach ($scoreList as $item) { + $list[] = [ + 'sn' => $sn, + 'cate_id' => $item->user->cate_id, + 'user_id' => $item->user_id, + 'score' => $item->score, + 'created_at' => $now, + 'updated_at' => $now, + ]; + } + \App\Models\UserRank::insert($list); + } +} diff --git a/app/ModelFilters/CateRankFilter.php b/app/ModelFilters/CateRankFilter.php new file mode 100644 index 0000000..79b3e54 --- /dev/null +++ b/app/ModelFilters/CateRankFilter.php @@ -0,0 +1,26 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function cate($id) + { + $this->where('cate_id', $id); + } + + public function sn($sn) + { + $this->where('sn', $sn); + } +} diff --git a/app/ModelFilters/UserRankFilter.php b/app/ModelFilters/UserRankFilter.php new file mode 100644 index 0000000..38db2ce --- /dev/null +++ b/app/ModelFilters/UserRankFilter.php @@ -0,0 +1,26 @@ + [input_key1, input_key2]]. + * + * @var array + */ + public $relations = []; + + public function user($id) + { + $this->where('user_id', $id); + } + + public function sn($sn) + { + $this->where('sn', $sn); + } +} diff --git a/app/ModelFilters/UserScoreFilter.php b/app/ModelFilters/UserScoreFilter.php index 255cd17..b454fa5 100644 --- a/app/ModelFilters/UserScoreFilter.php +++ b/app/ModelFilters/UserScoreFilter.php @@ -2,6 +2,7 @@ namespace App\ModelFilters; +use Carbon\Carbon; use EloquentFilter\ModelFilter; class UserScoreFilter extends ModelFilter @@ -38,4 +39,12 @@ class UserScoreFilter extends ModelFilter { $this->whereLike('title', $key); } + + public function createdRange($value) + { + $str = explode(',', $value); + $start = Carbon::createFromTimestamp(data_get($str, 0))->startOfDay(); + $end = Carbon::createFromTimestamp(data_get($str, 1))->endOfDay(); + $this->whereBetween('created_at', [$start, $end]); + } } diff --git a/app/Models/CateRank.php b/app/Models/CateRank.php new file mode 100644 index 0000000..0160c63 --- /dev/null +++ b/app/Models/CateRank.php @@ -0,0 +1,28 @@ +belongsTo(PartyCate::class, 'cate_id'); + } + + public function scopeSort($q) + { + return $q->orderBy('sn')->orderBy('score', 'desc'); + } +} diff --git a/app/Models/UserRank.php b/app/Models/UserRank.php new file mode 100644 index 0000000..024e0be --- /dev/null +++ b/app/Models/UserRank.php @@ -0,0 +1,33 @@ +belongsTo(PartyCate::class, 'cate_id'); + } + + public function user() + { + return $this->belongsTo(PartyUser::class, 'user_id'); + } + + public function scopeSort($q) + { + return $q->orderBy('score', 'desc'); + } +} diff --git a/app/Models/UserScore.php b/app/Models/UserScore.php index 9184db7..586d84e 100644 --- a/app/Models/UserScore.php +++ b/app/Models/UserScore.php @@ -9,13 +9,14 @@ use EloquentFilter\Filterable; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Model; use Slowlyo\OwlAdmin\Models\AdminUser; +use Illuminate\Database\Eloquent\Factories\HasFactory; /** * 党员审核记录 */ class UserScore extends Model { - use HasDateTimeFormatter, Filterable; + use HasDateTimeFormatter, Filterable, HasFactory; protected $fillable = ['type_id', 'cate_id', 'user_id', 'title', 'content', 'images', 'file', 'check_status', 'check_user_id', 'check_remarks', 'check_at', 'score']; @@ -66,6 +67,6 @@ class UserScore extends Model public function scopeSort($q) { - return $this->orderBy('check_status')->latest('id'); + return $this->orderBy('check_status')->latest('created_at'); } } diff --git a/config/app.php b/config/app.php index e99f334..59009c5 100644 --- a/config/app.php +++ b/config/app.php @@ -109,7 +109,7 @@ return [ | */ - 'faker_locale' => 'en_US', + 'faker_locale' => 'zh_CN', /* |-------------------------------------------------------------------------- diff --git a/database/factories/PartyCateFactory.php b/database/factories/PartyCateFactory.php new file mode 100644 index 0000000..fe78424 --- /dev/null +++ b/database/factories/PartyCateFactory.php @@ -0,0 +1,27 @@ + + */ +class PartyCateFactory extends Factory +{ + protected $model = PartyCate::class; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + $faker = $this->faker; + return [ + 'name' => $faker->streetName, + ]; + } +} diff --git a/database/factories/PartyUserFactory.php b/database/factories/PartyUserFactory.php new file mode 100644 index 0000000..a04a574 --- /dev/null +++ b/database/factories/PartyUserFactory.php @@ -0,0 +1,34 @@ + + */ +class PartyUserFactory extends Factory +{ + protected $model = PartyUser::class; + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + $faker = $this->faker; + do { + $username = $faker->userName; + } while (PartyUser::where('username', $username)->exists()); + return [ + 'username' => $username, + 'password' => '123456', + 'name' => $faker->name, + 'avatar' => 'https://via.placeholder.com/64x64.png?text=' . $username, + 'cate_id' => PartyCate::query()->inRandomOrder()->value('id'), + ]; + } +} diff --git a/database/factories/UserScoreFactory.php b/database/factories/UserScoreFactory.php new file mode 100644 index 0000000..3e08805 --- /dev/null +++ b/database/factories/UserScoreFactory.php @@ -0,0 +1,49 @@ + + */ +class UserScoreFactory extends Factory +{ + protected $model = UserScore::class; + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + $type = UserScore::getTypeList()->random(); + $user = PartyUser::query()->inRandomOrder()->first(); + $time = $this->faker->dateTimeBetween('-3 years', 'now'); + return [ + 'type_id' => $type->id, + 'cate_id' => $user->cate_id, + 'user_id' => $user->id, + 'title' => $this->faker->sentence, + 'content' => $this->faker->paragraph, + 'images' => ['https://via.placeholder.com/100x100.png', 'https://via.placeholder.com/100x100.png'], + 'file' => 'https://via.placeholder.com/100x100.png', + 'check_status' => CheckStatus::Success, + 'check_user_id' => 1, + 'check_at' => $time, + 'score' => $this->faker->numberBetween(10, 100), + 'created_at' => $time, + ]; + } + + public function configure(): static + { + return $this->afterCreating(function (UserScore $userScore) { + PartyUserService::make()->incrementScore($userScore->user, $userScore->type->key, $userScore->score); + }); + } +} 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 new file mode 100644 index 0000000..a4993ec --- /dev/null +++ b/database/migrations/2023_12_05_104656_create_user_rank_table.php @@ -0,0 +1,44 @@ +id(); + $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->timestamps(); + + $table->comment('党员排名'); + }); + + Schema::create('cate_rank', function (Blueprint $table) { + $table->id(); + $table->string('sn')->comment('期数(第一期: 202301)'); + $table->unsignedBigInteger('cate_id')->comment('支部(party_cates.id)'); + $table->unsignedInteger('score')->default(0)->comment('得分'); + $table->timestamps(); + + $table->comment('支部排名'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('user_rank'); + Schema::dropIfExists('cate_rank'); + } +}; diff --git a/database/seeders/AdminMenuSeeder.php b/database/seeders/AdminMenuSeeder.php index 8bc2cb4..0b8fac6 100644 --- a/database/seeders/AdminMenuSeeder.php +++ b/database/seeders/AdminMenuSeeder.php @@ -26,6 +26,8 @@ class AdminMenuSeeder extends Seeder ['title' => '审核评定', 'icon' => 'icon-park:internal-data', 'url' => '/user-score', 'permission' => ['user_score']], ['title' => '信息管理', 'icon' => 'icon-park:web-page', 'url' => '/articles', 'permission' => ['article']], ['title' => '广告管理', 'icon' => 'icon-park:picture-one', 'url' => '/banner', 'permission' => ['banner']], + ['title' => '支部排名', 'icon' => 'icon-park:sort-one', 'url' => '/cate-rank', 'permission' => ['cate-rank']], + ['title' => '个人排名', 'icon' => 'icon-park:sort-one', 'url' => '/user-rank', 'permission' => ['user-rank']], ['title' => '系统管理', 'icon' => 'icon-park:setting', 'url' => '/system', 'permission' => ['system'], 'children' => [ ['title' => '用户管理', 'icon' => 'icon-park:people-plus', 'url' => '/system/admin_users', 'permission' => ['admin_user']], ['title' => '角色管理', 'icon' => 'icon-park:people-plus-one', 'url' => '/system/admin_roles', 'permission' => ['admin_rule']], diff --git a/database/seeders/PartyUserSeeder.php b/database/seeders/PartyUserSeeder.php new file mode 100644 index 0000000..85301c0 --- /dev/null +++ b/database/seeders/PartyUserSeeder.php @@ -0,0 +1,29 @@ +count(20)->create(); + // (new PartyUserFactory())->count(100)->create(); + + UserScore::truncate(); + UserScore::factory()->count(100)->create(); + } +} diff --git a/database/seeders/PermissionSeeder.php b/database/seeders/PermissionSeeder.php index 5e8762e..037e98a 100644 --- a/database/seeders/PermissionSeeder.php +++ b/database/seeders/PermissionSeeder.php @@ -26,6 +26,8 @@ class PermissionSeeder extends Seeder ['name' => '审核评定', 'slug' => 'user_score'], ['name' => '信息管理', 'slug' => 'article'], ['name' => '广告管理', 'slug' => 'banner'], + ['name' => '党员排名', 'slug' => 'user_rank'], + ['name' => '支部排名', 'slug' => 'cate_rank'], ['name' => '系统管理', 'slug' => 'system', 'children' => [ ['name' => '用户管理', 'slug' => 'admin_user'], ['name' => '角色管理', 'slug' => 'admin_role'], diff --git a/lang/zh_CN/user_rank.php b/lang/zh_CN/user_rank.php new file mode 100644 index 0000000..1d4c1b7 --- /dev/null +++ b/lang/zh_CN/user_rank.php @@ -0,0 +1,13 @@ + 'ID', + 'created_at' => '创建时间', + 'updated_at' => '更新时间', + + 'sn' => '期数', + 'user_id' => '党员', + 'cate_id' => '支部', + 'score' => '得分', + 'sort' => '排名', +]; diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php index 36799d9..9549693 100644 --- a/tests/Feature/ExampleTest.php +++ b/tests/Feature/ExampleTest.php @@ -4,6 +4,7 @@ namespace Tests\Feature; // use Illuminate\Foundation\Testing\RefreshDatabase; use App\Models\PartyUser; +use Carbon\Carbon; use Illuminate\Support\Facades\Hash; use Tests\TestCase; @@ -14,7 +15,8 @@ class ExampleTest extends TestCase */ public function test_the_application_returns_a_successful_response(): void { - $user = PartyUser::find(1); - dump($user->getRawOriginal('password')); + $time = Carbon::parse('2024-01-01 00:00:00'); + $last = $time->subQuarter(); + dump($last->quarter, $last->copy()->startOfQuarter()->toDateString(), $last->copy()->endOfQuarter()->toDateString()); } }