From 41f4241308f901ba04874f989b5ee6ebf35b488d Mon Sep 17 00:00:00 2001 From: vine_liutk <961510893@qq.com> Date: Fri, 23 Feb 2024 16:21:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BA=BA=E5=8F=A3=E8=BF=81?= =?UTF-8?q?=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Admin/Controllers/PersonController.php | 180 +++++++++++++++-- app/Admin/routes.php | 4 + app/Models/Person.php | 9 +- app/Models/PersonChange.php | 2 + app/Services/Admin/PersonService.php | 224 ++++++++++++++++++++- app/Traits/CustomActionTrait.php | 4 +- lang/zh_CN/admin.php | 1 + 7 files changed, 405 insertions(+), 19 deletions(-) diff --git a/app/Admin/Controllers/PersonController.php b/app/Admin/Controllers/PersonController.php index 1d77988..061d789 100644 --- a/app/Admin/Controllers/PersonController.php +++ b/app/Admin/Controllers/PersonController.php @@ -30,14 +30,14 @@ class PersonController extends AdminController public function list(): Page { - $crud = $this->baseCRUD()->tableLayout('fixed') + $crud = $this->baseCRUD()->tableLayout('fixed')->name('curd_list') ->headerToolbar([ $this->createTypeButton('drawer', '', '50%'), amis()->DialogAction()->icon('fas fa-people-arrows')->iconClassName('text-white text-sm')->level('danger')->label('分户')->dialog( amis()->Dialog()->title(__('admin.persons.split_master'))->body($this->splitMasterForm())->size('lg') ), amis()->DialogAction()->icon('fas fa-users')->iconClassName('text-white text-sm')->level('success')->label('合户')->dialog( - amis()->Dialog()->title('合户')->body($this->mergeMasterForm())->size('lg') + amis()->Dialog()->title(__('admin.persons.merge_master'))->body($this->mergeMasterForm())->size('lg') ), amis('reload')->align('right'), amis('filter-toggler')->align('right'), @@ -308,13 +308,19 @@ class PersonController extends AdminController public function detailActions() { return [ - //变更户主-todo + //变更户主 amis()->DialogAction()->level('warning')->label('变更户主')->dialog( - amis()->Dialog()->title('变更户主')->body()->size('lg') + amis()->Dialog()->title('变更户主')->body($this->editMasterForm())->size('lg')->actions([ + amis()->Button()->label('取消')->actionType('cancel'), + amis()->Button()->label('确认')->actionType('submit')->primary()->close('detail_info'), + ]) ), - //迁移-todo + //迁移 amis()->DialogAction()->level('info')->label('迁移')->dialog( - amis()->Dialog()->title('迁移')->body()->size('lg') + amis()->Dialog()->title('迁移')->body($this->migrateMasterForm())->size('lg')->actions([ + amis()->Button()->label('取消')->actionType('cancel'), + amis()->Button()->label('确认')->actionType('submit')->primary()->close('detail_info'), + ]) ), //迁出-todo amis()->DialogAction()->level('success')->label('迁出')->dialog( @@ -325,28 +331,172 @@ class PersonController extends AdminController amis()->Dialog()->title('死亡')->body()->size('lg') ), //返回 - amis()->Button()->actionType('confirm')->label(__('admin.back'))->primary() + amis()->Button()->actionType('cancel')->label(__('admin.back'))->primary() ]; } /** - * 合户-todo + * 变更户主 + */ + public function editMasterForm() + { + return amis()->form()->title('')->reload('curd_list') + ->api(admin_url('edit_master')) + ->body([ + amis()->Service() + ->api(admin_url('persons?_action=getData&state=1&master[id]=${master_id}&perPage=10')) + ->onEvent([ + 'fetchInited' => [ + 'actions' => [ + [ + 'actionType'=>'setValue', + "componentId" => "new_master_arr", + "args" => [ + 'value'=>'${event.data.items}' + ], + ] + ] + ] + ]) + ->body( + amis()->TableControl('new_master_arr', '户籍情况')->columnsTogglable(false)->id('new_master_arr')->columns([ + amis()->TableColumn('name', __('admin.persons.name'))->width('100px'), + amis()->TableColumn('idcard', __('admin.persons.idcard')), + amis()->TableColumn('master_connect', __('admin.persons.master_connect'))->width('60px'), + amis()->RadioControl('is_new_master', '新户主')->disabledOn('is_master'), + amis()->TextControl('new_master_connect', '新关系'), + ])->required() + ), + amis()->Divider(), + amis()->GroupControl()->body([ + amis()->DateControl('editd_at', '变更日期')->valueFormat('YYYY-MM-DD')->required(), + amis()->TextControl('edit_reason', '变更原因')->required() + ]), + amis()->GroupControl()->body([ + amis()->TextControl('edit_phone', '联系方式')->required(), + amis()->TextControl('edit_remark', '备注') + ]), + ]); + } + + public function doEditMaster(Request $request) + { + $res = $this->service->EditMaster($request->input('new_master_arr'), $request->input()); + + return $this->autoResponse($res, '变更户主'); + } + + /** + * 迁移-迁移到其他户下面去 + */ + public function migrateMasterForm() + { + return amis()->form()->title('')->reload('curd_list') + ->api(admin_url('migrate_master')) + ->body([ + amis()->HiddenControl('id'), + amis()->GroupControl()->body([ + $this->masterPicker('new_master_id', '新户主', '输入 户主姓名 进行筛选')->required(), + amis()->TextControl('new_master_connect', '新关系')->required(), + ]), + amis()->Divider()->visibleOn('${is_master}'), + amis()->Service() + ->api(admin_url('persons?_action=getData&state=1&master[id]=${master_id}&perPage=10')) + ->onEvent([ + 'fetchInited' => [ + 'actions' => [ + [ + 'actionType'=>'setValue', + "componentId" => "old_master_arr", + "args" => [ + 'value'=>'${event.data.items}' + ], + ] + ] + ] + ]) + ->body( + amis()->TableControl('old_master_arr', '原户籍情况')->columnsTogglable(false)->id('old_master_arr')->columns([ + amis()->TableColumn('name', __('admin.persons.name'))->width('100px'), + amis()->TableColumn('idcard', __('admin.persons.idcard')), + amis()->TableColumn('master_connect', __('admin.persons.master_connect'))->width('60px'), + amis()->RadioControl('is_new_master', '新户主')->disabledOn('is_master'), + amis()->TextControl('new_master_connect', '新关系'), + ])->required() + )->visibleOn('${is_master}'), + amis()->Divider(), + amis()->GroupControl()->body([ + amis()->DateControl('migrated_at', '迁移日期')->valueFormat('YYYY-MM-DD')->required(), + amis()->TextControl('migrate_reason', '迁移原因')->required() + ]), + amis()->GroupControl()->body([ + amis()->TextControl('migrate_phone', '联系方式')->required(), + amis()->TextControl('migrate_remark', '备注') + ]), + ]); + } + + public function doMigrateMaster(Request $request) + { + $res = $this->service->migrateMaster($request->input('id', 0), $request->input('new_master_id', 0), $request->input('new_master_connect', ''), + $request->input('old_master_arr', []), $request->input()); + + return $this->autoResponse($res, '迁移'); + } + + /** + * 合户 */ public function mergeMasterForm() { - return amis()->form()->title('')->body([ - + return amis()->form()->title('') + ->api(admin_url('merge_master')) + ->body([ amis()->GroupControl()->body([ - $this->masterPicker('master', '', '输入 户主姓名 进行筛选'), - $this->masterPicker('to_master', '待合并户', '输入 户主姓名 进行筛选'), + $this->masterPicker('master_id', '', '输入 户主姓名 进行筛选')->required(), + $this->masterPicker('to_merge_master_id', '待合并户', '输入 户主姓名 进行筛选')->required(), ]), amis()->Divider(), - + amis()->Service() + ->api(admin_url('persons?_action=getData&state=1&master[id]=${to_merge_master_id}&perPage=10')) + ->onEvent([ + 'fetchInited' => [ + 'actions' => [ + [ + 'actionType'=>'setValue', + "componentId" => "new_master_arr", + "args" => [ + 'value'=>'${event.data.items}' + ], + ] + ] + ] + ]) + ->body( + amis()->TableControl('new_master_arr', '合户情况')->columnsTogglable(false)->id('new_master_arr')->columns([ + amis()->TableColumn('name', __('admin.persons.name'))->width('100px'), + amis()->TableColumn('idcard', __('admin.persons.idcard')), + amis()->TableColumn('master_connect', __('admin.persons.master_connect'))->width('60px'), + amis()->TextControl('new_master_connect', '新关系'), + ])->required() + ), + amis()->Divider(), + amis()->GroupControl()->body([ + amis()->DateControl('merged_at', '合户日期')->valueFormat('YYYY-MM-DD')->required(), + amis()->TextControl('merge_reason', '合户原因')->required() + ]), + amis()->GroupControl()->body([ + amis()->TextControl('phone', '联系方式')->required(), + amis()->TextControl('remark', '备注') + ]), ]); } - public function doMergeMaster(Request $request){ - + public function doMergeMaster(Request $request) + { + $res = $this->service->mergeMaster($request->input('master_id'),$request->input('to_merge_master_id'), $request->input('new_master_arr'), $request->input()); + + return $this->autoResponse($res, '合户'); } /** diff --git a/app/Admin/routes.php b/app/Admin/routes.php index cf3a42f..ead3855 100644 --- a/app/Admin/routes.php +++ b/app/Admin/routes.php @@ -40,6 +40,10 @@ Route::group([ $router->resource('persons', \App\Admin\Controllers\PersonController::class); $router->post('split_master', [\App\Admin\Controllers\PersonController::class, 'doSplitMaster']); + $router->post('merge_master', [\App\Admin\Controllers\PersonController::class, 'doMergeMaster']); + $router->post('edit_master', [\App\Admin\Controllers\PersonController::class, 'doEditMaster']); + $router->post('migrate_master', [\App\Admin\Controllers\PersonController::class, 'doMigrateMaster']); + $router->resource('person_changes', \App\Admin\Controllers\PersonChangeController::class); diff --git a/app/Models/Person.php b/app/Models/Person.php index fffaaca..4ebd663 100644 --- a/app/Models/Person.php +++ b/app/Models/Person.php @@ -34,7 +34,14 @@ class Person extends Model $person->save(); } //处理新增时变动记录-todo - + if(in_array($person->type, [11, 12])){ + PersonChange::create([ + 'person_id' => $person->id, + 'type' => $person->type == 11 ? PersonChange::TYPE_BIRTH : PersonChange::TYPE_IN, + 'changed_at' => $person->type == 11 ? $person->birthday : $person->created_at, + 'new_master' => $person->master_id + ]); + } }); static::saving(function ($person) { if($person->origin_city_code){ diff --git a/app/Models/PersonChange.php b/app/Models/PersonChange.php index a5bb52d..80d01d8 100644 --- a/app/Models/PersonChange.php +++ b/app/Models/PersonChange.php @@ -20,6 +20,8 @@ class PersonChange extends Model public const TYPE_MIGRATE = 7; //迁移 public const TYPE_CHANGE = 8; //变更户主 + protected $fillable = ['person_id', 'type', 'changed_at', 'reason', 'old_master', 'new_master', 'phone', 'extends', 'extends_mark', 'remark']; + protected $casts = [ 'extends' => 'array', ]; diff --git a/app/Services/Admin/PersonService.php b/app/Services/Admin/PersonService.php index a734fa9..100bf39 100644 --- a/app/Services/Admin/PersonService.php +++ b/app/Services/Admin/PersonService.php @@ -140,6 +140,7 @@ class PersonService extends BaseService 'reason' => isset($extends['split_reason']) ? $extends['split_reason'] : null, 'old_master' => $person['master_id'], 'new_master' => $newMaster['id'], + 'phone' => isset($extends['phone']) ? $extends['phone'] : null, 'extends_mark' => $changeMark, 'remark' => isset($extends['remark']) ? $extends['remark'] : null, 'created_at' => now(), @@ -149,7 +150,7 @@ class PersonService extends BaseService Person::where('id', $person['id'])->update([ 'master_id' => $newMaster['id'], 'is_master' => $newMaster['id'] == $person['id'] ? true : false, - 'master_connect' => isset($person['new_master_connect']) ? $person['new_master_connect'] : ($newMaster['id'] == $person['id'] ? '户主':'') + 'master_connect' => (isset($person['new_master_connect']) && !empty($person['new_master_connect'])) ? $person['new_master_connect'] : ($newMaster['id'] == $person['id'] ? '户主':'') ]); } //批量插入人口变动记录 @@ -165,4 +166,225 @@ class PersonService extends BaseService return true; } + + /** + * 合户 + * @param int $masterId + * @param int $toMasterId + * @param array $personArr + * @param array $extends + */ + public function mergeMaster($masterId, $toMasterId, $personArr = [], $extends) + { + if($masterId == $toMasterId){ + return $this->setError('合并失败, 不能选择两个相同户主'); + } + $newMaster = Person::where('id', $masterId)->first()->toArray(); + try{ + DB::beginTransaction(); + $personChangeLogs = []; + //遍历分户成员情况, 并更合并户与新户主关系 + foreach($personList as $person){ + $changeMark = (isset($extends['merged_at']) ? $extends['merged_at'] : '某日'). '日,' .(isset($extends['merge_reason']) ? ('因' .$extends['merge_reason']) : '').'合户,'; + if($person['is_master']){ + $changeMark .= '与新户主关系更新为【'.$person['new_master_connect'].'】'; + }else{ + $changeMark .= '户主由【'.$person["master"]["name"].'】变更为【'.$newMaster["name"].'】,与新户主关系更新为【'.$person['new_master_connect'].'】'; + } + $personChangeLogs[] = [ + 'person_id' => $person['id'], + 'type' => PersonChange::TYPE_MERGE, + 'changed_at' => isset($extends['merged_at']) ? $extends['merged_at'] : null, + 'reason' => isset($extends['merge_reason']) ? $extends['merge_reason'] : null, + 'old_master' => $person['master_id'], + 'new_master' => $newMaster['id'], + 'phone' => isset($extends['phone']) ? $extends['phone'] : null, + 'extends_mark' => $changeMark, + 'remark' => isset($extends['remark']) ? $extends['remark'] : null, + 'created_at' => now(), + 'updated_at' => now() + ]; + + Person::where('id', $person['id'])->update([ + 'master_id' => $newMaster['id'], + 'is_master' => $newMaster['id'] == $person['id'] ? true : false, + 'master_connect' => isset($person['new_master_connect']) ? $person['new_master_connect'] : '' + ]); + } + //批量插入人口变动记录 + count($personChangeLogs) > 0 && PersonChange::insert($personChangeLogs); + + DB::commit(); + }catch(Throwable $th){ + DB::rollBack(); + report($th); + return $this->setError('系统错误,请刷新后重试'); + } + + return true; + } + + /** + * 变更户主 + * + * @param array $personArr + * @param array $extends + * + */ + public function editMaster($personArr = [], $extends) + { + $personList = collect($personArr); + $newMaster = $personList->first(function ($item) { + return isset($item['is_new_master']) && $item['is_new_master']; + }); + if(empty($newMaster)){ + return $this->setError('变更失败,未选择新户主'); + } + try{ + DB::beginTransaction(); + $personChangeLogs = []; + //遍历分户成员情况, 并更新与新户主关系 + foreach($personList as $person){ + + $changeMark = (isset($extends['editd_at']) ? $extends['editd_at'] : '某日'). '日,' .(isset($extends['edit_reason']) ? ('因' .$extends['edit_reason']) : '').'户主变更,'; + if($person['is_master']){ + $changeMark .= '与新户主关系更新为【'.(isset($person['new_master_connect']) ? $person['new_master_connect']:'').'】'; + }elseif($person['is_new_master']){ + $changeMark .= '成为户主'; + }else{ + $changeMark .= '户主由【'.$person["master"]["name"].'】变更为【'.$newMaster["name"].'】,与新户主关系更新为-'.$person['new_master_connect']; + } + $personChangeLogs[] = [ + 'person_id' => $person['id'], + 'type' => PersonChange::TYPE_CHANGE, + 'changed_at' => isset($extends['editd_at']) ? $extends['editd_at'] : null, + 'reason' => isset($extends['edit_reason']) ? $extends['edit_reason'] : null, + 'old_master' => $person['master_id'], + 'new_master' => $newMaster['id'], + 'phone' => isset($extends['edit_phone']) ? $extends['edit_phone'] : null, + 'extends_mark' => $changeMark, + 'remark' => isset($extends['edit_remark']) ? $extends['edit_remark'] : null, + 'created_at' => now(), + 'updated_at' => now() + ]; + + Person::where('id', $person['id'])->update([ + 'master_id' => $newMaster['id'], + 'is_master' => $newMaster['id'] == $person['id'] ? true : false, + 'master_connect' => (isset($person['new_master_connect']) && !empty($person['new_master_connect'])) ? $person['new_master_connect'] : ($newMaster['id'] == $person['id'] ? '户主':'') + ]); + } + //批量插入人口变动记录 + count($personChangeLogs) > 0 && PersonChange::insert($personChangeLogs); + + DB::commit(); + }catch(Throwable $th){ + DB::rollBack(); + report($th); + return $this->setError('系统错误,请刷新后重试'); + } + + return true; + } + + /** + * + */ + public function migrateMaster($personId, $newMasterId, $newMasterConnect, $oldMasterArr = [], $extends) + { + $person = Person::find($personId); + + if($person->master_id == $newMasterId){ + return $this->setError('迁移失败, 迁移目前户主不能为当前户主'); + } + + $newMaster = Person::find($newMasterId); + if(! $newMaster?->is_master){ + return $this->setError('迁移失败, 未选择新户主'); + } + if(!empty($oldMasterArr)){ + $oldPersonList = collect($oldMasterArr); + $oldNewMaster = $oldPersonList->first(function ($item) { + return isset($item['is_new_master']) && $item['is_new_master']; + }); + if(empty($oldNewMaster)){ + return $this->setError('迁移失败, 未选择原户新户主'); + } + } + + try{ + DB::beginTransaction(); + $personChangeLogs = []; + + $changeMark = (isset($extends['migrated_at']) ? $extends['migrated_at'] : '某日'). '日,' .(isset($extends['migrate_reason']) ? ('因' .$extends['migrate_reason']) : ''); + if($person->is_master){ + $changeMark .= '迁移至户主【'.$person->master->name.'】下,与新户主关系更新为【'.$newMasterConnect.'】'; + }else{ + $changeMark .= '由户主【'.$person->master->name.'】迁移至新户主【'.$newMaster->name.'】下,与新户主关系更新为【'.$newMasterConnect.'】'; + } + $personChangeLogs[] = [ + 'person_id' => $person->id, + 'type' => PersonChange::TYPE_MIGRATE, + 'changed_at' => isset($extends['migrated_at']) ? $extends['migrated_at'] : null, + 'reason' => isset($extends['migrate_reason']) ? $extends['migrate_reason'] : null, + 'old_master' => $person->master_id, + 'new_master' => $newMaster->id, + 'phone' => isset($extends['migrate_phone']) ? $extends['migrate_phone'] : null, + 'extends_mark' => $changeMark, + 'remark' => isset($extends['migrate_remark']) ? $extends['migrate_remark'] : null, + 'created_at' => now(), + 'updated_at' => now() + ]; + + //如果迁移的是户主, 则更新原户内人口信息 + if($person->is_master){ + foreach($oldMasterArr as $oldPerson){ + if($oldPerson['id'] == $person->id){ + continue; + } + $changeMark = (isset($extends['migrated_at']) ? $extends['migrated_at'] : '某日'). '日,' .(isset($extends['migrate_reason']) ? ('因' .$extends['migrate_reason'].'导致') : '').'原户主【'.$person->name.'】迁移,'; + if($oldPerson['is_new_master']){ + $changeMark .= '成为户主'; + }else{ + $changeMark .= '户主由【'.$person->master->name.'】变更为【'.$oldNewMaster['name'].'】,与新户主关系更新为【'.$oldPerson['new_master_connect'].'】'; + } + $personChangeLogs[] = [ + 'person_id' => $person['id'], + 'type' => PersonChange::TYPE_CHANGE, + 'changed_at' => isset($extends['migrated_at']) ? $extends['migrated_at'] : null, + 'reason' => (isset($extends['migrate_reason']) ? $extends['migrate_reason'].'导致' : '').'户主迁移', + 'old_master' => $person->master_id, + 'new_master' => $oldNewMaster['id'], + 'phone' => isset($extends['migrate_phone']) ? $extends['migrate_phone'] : null, + 'extends_mark' => $changeMark, + 'remark' => null, + 'created_at' => now(), + 'updated_at' => now() + ]; + + Person::where('id', $oldPerson['id'])->update([ + 'master_id' => $oldNewMaster['id'], + 'is_master' => $oldNewMaster['id'] == $oldPerson['id'] ? true : false, + 'master_connect' => (isset($oldPerson['new_master_connect']) && !empty($oldPerson['new_master_connect'])) ? $oldPerson['new_master_connect'] : ($oldNewMaster['id'] == $oldPerson['id'] ? '户主':'') + ]); + } + } + + Person::where('id', $person->id)->update([ + 'is_master' => 0, + 'master_id' => $newMaster->id, + 'master_connect' => $newMasterConnect + ]); + + count($personChangeLogs) > 0 && PersonChange::insert($personChangeLogs); + + DB::commit(); + }catch(Throwable $th){ + DB::rollBack(); + report($th); + return $this->setError('系统错误,请刷新后重试'); + } + + return true; + } } \ No newline at end of file diff --git a/app/Traits/CustomActionTrait.php b/app/Traits/CustomActionTrait.php index 0a01c13..4407920 100644 --- a/app/Traits/CustomActionTrait.php +++ b/app/Traits/CustomActionTrait.php @@ -110,7 +110,7 @@ trait CustomActionTrait { switch ($type) { case 'drawer': - $drawer = Drawer::make()->title(__('admin.show'))->body($this->detail('$id'))->closeOnOutside(); + $drawer = Drawer::make()->title(__('admin.show'))->name('detail_info')->body($this->detail('$id'))->closeOnOutside(); if($width){ $drawer->width($width); @@ -129,7 +129,7 @@ trait CustomActionTrait break; case 'dialog': //补充详情操作按钮扩展 - $dialog = Dialog::make()->title(__('admin.show'))->body($this->detail('$id'))->size($size); + $dialog = Dialog::make()->title(__('admin.show'))->name('detail_info')->body($this->detail('$id'))->size($size); try{ $actions = $this->detailActions(); }catch(\BadMethodCallException $e){ diff --git a/lang/zh_CN/admin.php b/lang/zh_CN/admin.php index 50212ad..07d5057 100644 --- a/lang/zh_CN/admin.php +++ b/lang/zh_CN/admin.php @@ -380,6 +380,7 @@ return [ //分户操作 'split_master' => '分户', + 'merge_master' => '合户', ], 'person_changes'=>[ 'changed_at' => '变动日期',