完善人口迁移

main
vine_liutk 2024-02-23 16:21:27 +08:00
parent 8f6d2dbd7c
commit 41f4241308
7 changed files with 405 additions and 19 deletions

View File

@ -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 mergeMasterForm()
public function editMasterForm()
{
return amis()->form()->title('')->body([
amis()->GroupControl()->body([
$this->masterPicker('master', '', '输入 户主姓名 进行筛选'),
$this->masterPicker('to_master', '待合并户', '输入 户主姓名 进行筛选'),
]),
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 doMergeMaster(Request $request){
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('')
->api(admin_url('merge_master'))
->body([
amis()->GroupControl()->body([
$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)
{
$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, '合户');
}
/**

View File

@ -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);

View File

@ -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){

View File

@ -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',
];

View File

@ -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;
}
}

View File

@ -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){

View File

@ -380,6 +380,7 @@ return [
//分户操作
'split_master' => '分户',
'merge_master' => '合户',
],
'person_changes'=>[
'changed_at' => '变动日期',