diff --git a/app/Admin/Controllers/PartyCateController.php b/app/Admin/Controllers/PartyCateController.php index ed390b8..bd326b5 100644 --- a/app/Admin/Controllers/PartyCateController.php +++ b/app/Admin/Controllers/PartyCateController.php @@ -3,8 +3,15 @@ namespace App\Admin\Controllers; use App\Admin\Components; +use App\Admin\Services\ArticleService; use App\Admin\Services\PartyCateService; +use App\Admin\Services\PartyUserService; +use App\Admin\Services\UserScoreService; +use App\Enums\CheckStatus; +use App\Models\Article; +use App\Models\Keyword; use App\Models\PartyUser; +use Illuminate\Http\Request; use Slowlyo\OwlAdmin\Controllers\AdminController; use Slowlyo\OwlAdmin\Renderers\Form; use Slowlyo\OwlAdmin\Renderers\Page; @@ -20,6 +27,7 @@ class PartyCateController extends AdminController public function list(): Page { + $primary = $this->service->primaryKey(); $crud = $this->baseCRUD() ->filterTogglable(false) ->columnsTogglable(false) @@ -38,6 +46,22 @@ class PartyCateController extends AdminController amisMake()->TableColumn()->name('score')->label(__('party_cate.score')), amisMake()->TableColumn()->name('remarks')->label(__('party_cate.remarks')), $this->rowActions([ + amisMake()->LinkAction()->label('党员管理')->level('link')->link('/party-cate/${'.$primary.'}/user'), + amisMake()->DialogAction()->label('评星规则')->level('link')->level('link')->dialog( + amisMake()->Dialog()->size('lg')->title('')->body($this->baseForm() + ->title('') + ->onEvent([]) + ->redirect('') + ->initApi('/party-cate/${'.$primary.'}/article?_action=getData') + ->api('post:' . admin_url('/party-cate/${'.$primary.'}/article')) + ->body([ + amisMake()->TextControl()->name('title')->label(__('article.title'))->required(true), + amisMake()->ImageControl()->name('cover')->label(__('article.cover'))->autoUpload(true), + Components::make()->fuEditorControl('content', __('article.content')), + ]) + ) + ), + amisMake()->LinkAction()->label('审核评定')->level('link')->link('/party-cate/${'.$primary.'}/score'), $this->rowShowButton(), $this->rowEditButton(true), $this->rowDeleteButton(), @@ -71,6 +95,157 @@ class PartyCateController extends AdminController ]); } + public function userIndex($cid) + { + $service = PartyUserService::make(); + $userController = new PartyUserController(); + $primary = $service->primaryKey(); + request()->offsetSet('cate_id', $cid); + if ($userController->actionOfGetData()) { + return $userController->response()->success($service->list()); + } + + if ($userController->actionOfExport()) { + return $userController->export(); + } + $crud = $userController->baseCRUD() + ->filterTogglable(false) + ->columnsTogglable(false) + ->headerToolbar([ + amisMake()->DialogAction()->label(__('admin.create'))->icon('fa fa-add')->level('primary')->dialog( + amisMake()->Dialog()->title(__('admin.create'))->body( + $userController->form(false)->data(['cate_id' => $cid])->api('/party-user')->onEvent([]) + ) + ), + ]) + ->filter($userController->baseFilter()->actions([])->body([ + amisMake()->TextControl()->name('name')->label(__('party_user.name'))->size('md')->clearable(), + amisMake()->Component()->setType('submit')->label(__('admin.search'))->level('primary'), + ])) + ->columns([ + amisMake()->TableColumn()->name('id')->label(__('party_user.id')), + amisMake()->TableColumn()->name('name')->label(__('party_user.name')), + amisMake()->TableColumn()->set('type', 'avatar')->set('src', '${avatar}')->name('avatar')->label(__('party_user.avatar')), + amisMake()->TableColumn()->name('score')->label(__('party_user.score')), + $userController->rowActions([ + amisMake()->DialogAction()->label(__('admin.show'))->icon('fa-regular fa-eye')->level('link')->dialog( + amisMake()->Dialog()->title(__('admin.show'))->body($userController->detail('$id')->initApi('/party-user/${' . $primary . '}?_action=getData')) + ), + amisMake()->DialogAction()->label(__('admin.edit'))->icon('fa-regular fa-pen-to-square')->level('link')->dialog( + amisMake()->Dialog()->title(__('admin.edit'))->body( + $userController->form(true)->api('put:' . admin_url('/party-user/${' . $primary . '}'))->initApi('/party-user/${' . $primary . '}/edit?_action=getData')->redirect('')->onEvent([]) + ) + ), + amisMake()->AjaxAction() + ->label(__('admin.delete')) + ->icon('fa-regular fa-trash-can') + ->level('link') + ->confirmText('删除党员: ${name}') + ->api('delete:' . admin_url('/party-user/${'.$primary.'}')), + ]), + ]); + return $userController->response()->success($userController->baseList($crud)); + } + + public function articleUpdate($cid, Request $request) + { + if ($this->actionOfGetData()) { + return $this->response()->success(Article::where('party_cate_id', $cid)->first()); + } + $service = ArticleService::make(); + $data = $service->resloveData($request->all()); + Article::updateOrCreate(['party_cate_id' => $cid, 'category_id' => Keyword::where('key', 'category_2')->value('id')], $data); + + return $this->response()->success(); + } + + public function scoreIndex($cid) + { + $service = UserScoreService::make(); + $userController = new UserScoreController(); + $primary = $service->primaryKey(); + request()->offsetSet('cate_id', $cid); + if ($userController->actionOfGetData()) { + return $userController->response()->success($service->list()); + } + + if ($userController->actionOfExport()) { + return $userController->export(); + } + + $crud = $this->baseCRUD() + ->filterTogglable(false) + ->columnsTogglable(false) + ->headerToolbar([]) + ->filter($this->baseFilter()->actions([])->body([ + amisMake()->SelectControl()->name('type_id')->label(__('user_score.type_id'))->options($userController->getTypeOptions())->clearable()->size('md'), + amisMake()->SelectControl()->name('user_id')->label(__('user_score.user_id'))->options($userController->getUserOptions())->clearable()->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()->Component()->setType('submit')->label(__('admin.search'))->level('primary'), + ])) + ->columns([ + amisMake()->TableColumn()->name('id')->label(__('user_score.id')), + amisMake()->TableColumn()->name('type.name')->label(__('user_score.type_id')), + amisMake()->TableColumn()->name('user.name')->label(__('user_score.user_id')), + amisMake()->TableColumn()->name('title')->label(__('user_score.title')), + amisMake()->TableColumn()->name('check_status_text')->label(__('user_score.check_status')), + amisMake()->TableColumn()->name('score')->label(__('user_score.score')), + amisMake()->TableColumn()->name('created_at')->label(__('user_score.created_at')), + $this->rowActions([ + amisMake()->DialogAction() + ->label(__('admin.show')) + ->icon('fa-regular fa-eye') + ->level('link') + ->dialog( + amisMake()->Dialog()->title(__('admin.show'))->size('lg')->body( + amisMake()->Service()->api('/user-score/${'.$primary.'}?_action=getData')->body( + amisMake()->Property()->column(3)->items([ + ['label' => __('user_score.type_id'), 'content' => '${type.name}'], + ['label' => __('user_score.user_id'), 'content' => '${user.name}'], + ['label' => __('user_score.created_at'), 'content' => '${created_at}'], + + ['label' => __('user_score.check_status'), 'content' => '${check_status_text}'], + ['label' => __('user_score.check_user_id'), 'content' => '${check_user.name}'], + ['label' => __('user_score.check_at'), 'content' => '${check_at}'], + + ['label' => __('user_score.score'), 'content' => '${score}', 'span' => 3], + + ['label' => __('user_score.title'), 'content' => '${title}', 'span' => 3], + ['label' => __('user_score.content'), 'content' => amisMake()->TextareaControl()->value('${content}')->static(), 'span' => 3], + ['label' => __('user_score.images'), 'content' => amisMake()->Images()->source('${images}'), 'span' => 3], + ['label' => __('user_score.file'), 'content' => amisMake()->Link()->body('${file}')->blank()->href('${file}'), 'span' => 3], + ]) + ) + ) + ), + amisMake()->DialogAction() + ->visibleOn('${check_status != '.CheckStatus::Success->value.'}') + ->label('审核') + ->level('link') + ->dialog( + amisMake()->Dialog()->title('审核')->size('lg')->body( + amisMake()->Form() + ->data(['check_status' => CheckStatus::Success->value]) + ->api('post:' . admin_url('/user-score/${'.$primary.'}/check')) + ->onEvent('') + ->redirect('') + ->body([ + amisMake()->RadiosControl()->name('check_status')->label(__('user_score.check_status'))->options([ + CheckStatus::Success->value => CheckStatus::Success->text(), + CheckStatus::Fail->value => CheckStatus::Fail->text(), + ])->required(), + amisMake()->NumberControl()->name('score')->label(__('user_score.score')), + amisMake()->TextControl()->name('check_remarks')->label(__('user_score.check_remarks')), + ]) + ), + ) + ]), + ]); + + return $this->baseList($crud); + } + public function getUserOptions() { if (!$this->userOptions) { diff --git a/app/Admin/Controllers/PartyUserController.php b/app/Admin/Controllers/PartyUserController.php index d33829d..5123474 100644 --- a/app/Admin/Controllers/PartyUserController.php +++ b/app/Admin/Controllers/PartyUserController.php @@ -49,7 +49,7 @@ class PartyUserController extends AdminController public function form($edit): Form { return $this->baseForm()->title('')->body([ - amisMake()->SelectControl()->name('cate_id')->label(__('party_user.cate_id'))->options($this->getCateOptions()), + // amisMake()->SelectControl()->name('cate_id')->label(__('party_user.cate_id'))->options($this->getCateOptions()), amisMake()->TextControl()->name('name')->label(__('party_user.name'))->required(), amisMake()->ImageControl()->name('avatar')->label(__('party_user.avatar')), amisMake()->TextControl()->name('username')->label(__('party_user.username'))->required(), @@ -58,14 +58,14 @@ class PartyUserController extends AdminController ]); } - public function detail(): Form + public function detail($id): Form { return $this->baseDetail()->title('')->body([ amisMake()->TextControl()->name('id')->label(__('party_user.id'))->static(), + amisMake()->TextControl()->name('cate.name')->label(__('party_user.cate_id'))->static(), amisMake()->TextControl()->name('username')->label(__('party_user.username'))->static(), amisMake()->TextControl()->name('name')->label(__('party_user.name'))->static(), amisMake()->TextControl()->name('avatar')->label(__('party_user.avatar'))->static()->staticSchema(amisMake()->Image()), - amisMake()->TextControl()->name('cate.name')->label(__('party_user.cate_id'))->static(), amisMake()->TextControl()->name('score')->label(__('party_cate.score'))->static(), amisMake()->TextControl()->name('scores')->label(__('party_cate.scores'))->static()->staticSchema(amisMake()->Json()), amisMake()->TextControl()->name('remarks')->label(__('party_cate.remarks'))->static(), diff --git a/app/Admin/Controllers/UserScoreController.php b/app/Admin/Controllers/UserScoreController.php index 2ef4312..a047f69 100644 --- a/app/Admin/Controllers/UserScoreController.php +++ b/app/Admin/Controllers/UserScoreController.php @@ -38,7 +38,7 @@ class UserScoreController extends AdminController ])) ->columns([ amisMake()->TableColumn()->name('id')->label(__('user_score.id')), - amisMake()->TableColumn()->name('type_id')->label(__('user_score.type_id')), + amisMake()->TableColumn()->name('type.name')->label(__('user_score.type_id')), amisMake()->TableColumn()->name('user.name')->label(__('user_score.user_id')), amisMake()->TableColumn()->name('title')->label(__('user_score.title')), amisMake()->TableColumn()->name('check_status_text')->label(__('user_score.check_status')), @@ -115,7 +115,7 @@ class UserScoreController extends AdminController amisMake()->TextControl()->name('title')->label(__('user_score.title'))->static(), amisMake()->TextareaControl()->name('content')->label(__('user_score.content'))->static(), amisMake()->TextControl()->name('images')->label(__('user_score.images'))->static()->staticSchema(amisMake()->Images()), - amisMake()->TextControl()->name('file')->label(__('user_score.file'))->static()->staticSchema(amisMake()->Link()->blank()), + amisMake()->TextControl()->name('file')->label(__('user_score.file'))->static()->staticSchema(amisMake()->Link()->body('${file}')->href('${file}')->blank()), amisMake()->TextControl()->name('check_status_text')->label(__('user_score.check_status'))->static(), amisMake()->TextControl()->name('check_user.name')->label(__('user_score.check_user_id'))->static(), amisMake()->TextControl()->name('check_remarks')->label(__('user_score.check_remarks'))->static(), diff --git a/app/Admin/Services/UserScoreService.php b/app/Admin/Services/UserScoreService.php index f534ed9..ddb6b17 100644 --- a/app/Admin/Services/UserScoreService.php +++ b/app/Admin/Services/UserScoreService.php @@ -5,7 +5,9 @@ namespace App\Admin\Services; use App\Enums\CheckStatus; use App\Exceptions\BaseException; use App\ModelFilters\UserScoreFilter; +use App\Models\PartyUser; use App\Models\UserScore; +use Illuminate\Support\Facades\Validator; use Slowlyo\OwlAdmin\Admin; class UserScoreService extends BaseService @@ -39,4 +41,32 @@ class UserScoreService extends BaseService $info->update($attributes); } + + public function resloveData($data, $model = null) + { + if (!$model) { + $data['cate_id'] = PartyUser::where('id', $data['user_id'])->value('cate_id'); + } + return $data; + } + + public function validate($data, $model = null) + { + $createRules = [ + 'type_id' => 'required', + 'cate_id' => 'required', + 'user_id' => 'required', + ]; + $updateRules = [ + ]; + $validator = Validator::make($data, $model ? $updateRules : $createRules, [ + 'type_id.required' => __('user_score.type_id') . ' 必填', + 'cate_id.required' => __('user_score.cate_id') . ' 必填', + 'user_id.required' => __('user_score.user_id') . ' 必填', + ]); + if ($validator->fails()) { + return $validator->errors()->first(); + } + return true; + } } diff --git a/app/Admin/routes.php b/app/Admin/routes.php index 67ab52f..c18596a 100644 --- a/app/Admin/routes.php +++ b/app/Admin/routes.php @@ -39,6 +39,10 @@ Route::group([ // 党支部 $router->resource('party-cate', \App\Admin\Controllers\PartyCateController::class)->names('admin.party_cate'); + $router->get('party-cate/{id}/user', [\App\Admin\Controllers\PartyCateController::class, 'userIndex']); + $router->get('party-cate/{id}/article', [\App\Admin\Controllers\PartyCateController::class, 'articleUpdate']); + $router->post('party-cate/{id}/article', [\App\Admin\Controllers\PartyCateController::class, 'articleUpdate']); + $router->get('party-cate/{id}/score', [\App\Admin\Controllers\PartyCateController::class, 'scoreIndex']); // 党员 $router->resource('party-user', \App\Admin\Controllers\PartyUserController::class)->names('admin.party_user'); // 评议审核 diff --git a/app/ModelFilters/UserScoreFilter.php b/app/ModelFilters/UserScoreFilter.php index 4f66f36..255cd17 100644 --- a/app/ModelFilters/UserScoreFilter.php +++ b/app/ModelFilters/UserScoreFilter.php @@ -24,6 +24,11 @@ class UserScoreFilter extends ModelFilter $this->where('type_id', $id); } + public function cate($id) + { + $this->where('cate_id', $id); + } + public function checkStatus($id) { $this->where('check_status', $id); diff --git a/app/Models/UserScore.php b/app/Models/UserScore.php index 4c99a6a..9184db7 100644 --- a/app/Models/UserScore.php +++ b/app/Models/UserScore.php @@ -17,7 +17,7 @@ class UserScore extends Model { use HasDateTimeFormatter, Filterable; - protected $fillable = ['type_id', 'user_id', 'title', 'content', 'images', 'file', 'check_status', 'check_user_id', 'check_remarks', 'check_at', 'score']; + protected $fillable = ['type_id', 'cate_id', 'user_id', 'title', 'content', 'images', 'file', 'check_status', 'check_user_id', 'check_remarks', 'check_at', 'score']; protected $casts = [ 'images' => 'array', @@ -42,6 +42,11 @@ class UserScore extends Model return $this->belongsTo(Keyword::class, 'type_id'); } + public function cate() + { + return $this->belongsTo(PartyCate::class, 'cate_id'); + } + public function user() { return $this->belongsTo(PartyUser::class, 'user_id'); diff --git a/database/migrations/2023_12_01_140938_create_user_scores_table.php b/database/migrations/2023_12_01_140938_create_user_scores_table.php index a8bf5e2..823aabf 100644 --- a/database/migrations/2023_12_01_140938_create_user_scores_table.php +++ b/database/migrations/2023_12_01_140938_create_user_scores_table.php @@ -14,6 +14,7 @@ return new class extends Migration Schema::create('user_scores', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('type_id')->comment('类别, keywords.id, score_cate'); + $table->unsignedBigInteger('cate_id')->comment('党支部, part_cate.id'); $table->unsignedBigInteger('user_id')->comment('提交人, party_user.id'); $table->string('title')->nullable()->comment('主题'); $table->text('content')->nullable()->comment('内容'); diff --git a/lang/zh_CN/user_score.php b/lang/zh_CN/user_score.php index e214f25..ed8dc9c 100644 --- a/lang/zh_CN/user_score.php +++ b/lang/zh_CN/user_score.php @@ -7,11 +7,12 @@ return [ 'type_id' => '分类', 'user_id' => '党员', + 'cate_id' => '党支部', 'title' => '主题', 'content' => '内容', 'images' => '图片', 'file' => '附件', - 'check_status' => '状态', + 'check_status' => '审核状态', 'check_user_id' => '审核人', 'check_remarks' => '未通过原因', 'check_at' => '审核时间',