djc-new/app/Admin/Controllers/PersonController.php

602 lines
34 KiB
PHP

<?php
namespace App\Admin\Controllers;
use Slowlyo\OwlAdmin\Admin;
use Slowlyo\OwlAdmin\Renderers\Page;
use Slowlyo\OwlAdmin\Renderers\Form;
use Slowlyo\OwlAdmin\Controllers\AdminController;
use App\Services\Admin\PersonService;
use App\Traits\CustomActionTrait;
use App\Models\Keyword;
use App\Admin\Components;
use Slowlyo\OwlAdmin\Renderers\Drawer;
use Slowlyo\OwlAdmin\Renderers\Dialog;
use Slowlyo\OwlAdmin\Renderers\DrawerAction;
use Slowlyo\OwlAdmin\Renderers\DialogAction;
use Slowlyo\OwlAdmin\Renderers\LinkAction;
use Illuminate\Http\Request;
/**
* 人口管理
*
* @property PersonService $service
*/
class PersonController extends AdminController
{
use CustomActionTrait;
protected string $serviceName = PersonService::class;
public function list(): Page
{
$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(__('admin.persons.merge_master'))->body($this->mergeMasterForm())->size('lg')
),
amis('reload')->align('right'),
amis('filter-toggler')->align('right'),
])
->filter($this->baseFilter()->labelWidth('80px')->body([
amis()->GroupControl()->mode('horizontal')->body([
amis()->SelectControl('organized_body', __('admin.persons.organized_body'))->options(Keyword::where('parent_key', 'organized_body')->pluck('name', 'id')->toArray())
->columnRatio(3)->clearable(true),
amis()->NestedSelectControl('house_building', __('admin.persons.house_building'))->source(admin_url('api/keywords/tree-list?parent_name=housing_estate&has_owner=0'))->labelField('name')->valueField('id')->columnRatio(6)->clearable(true),
amis()->SelectControl('is_master', __('admin.persons.is_master'))->options([
'1'=>'仅户主','0'=>'非户主'
])->columnRatio(3)->clearable(true),
]),
amis()->GroupControl()->mode('horizontal')->body([
amis()->SelectControl('state', __('admin.persons.state'))->options([
'1'=>'实有人口','2'=>'已死亡','3'=>'已迁出'
])->columnRatio(3)->clearable(true),
amis()->DateRangeControl()->label(__('admin.persons.birthday'))->name('birthday')->valueFormat('YYYY-MM-DD')->columnRatio(6),
]),
]))
->itemBadge([//行角标
'text' => __('admin.persons.master'),
'mode' => 'ribbon',
'position' => 'top-left',
'badgeLevel' => 'danger',
'visibleOn' => '${is_master > 0}',
'size' => 15
])
->columns([
amis()->TableColumn('domicile_code', __('admin.persons.domicile_code'))->width('100px'),
amis()->TableColumn('name', __('admin.persons.name'))->width('100px')->copyable()->searchable(),
amis()->TableColumn('master_connect', __('admin.persons.master_connect'))->width('60px'),
amis()->TableColumn('master.name', __('admin.persons.master_name'))->width('100px')->copyable()->searchable(),
amis()->TableColumn('idcard', __('admin.persons.idcard'))->copyable()->searchable(),
amis()->TableColumn('gender', __('admin.persons.gender'))->type('mapping')->map([
"1"=>"<span class='label label-info'>男</span>",
"2"=>"<span class='label label-success'>女</span>",
"*"=> '其他:${gender}'
])->filterable(['options'=>[
['label'=>'男', 'value'=>1], ['label'=> '女', 'value'=>2]
]]),
amis()->TableColumn('birthday', __('admin.persons.birthday'))->width('100px'),
// amis()->TableColumn('age', __('admin.persons.age')),
amis()->TableColumn('now_address', __('admin.persons.now_address'))->copyable(),
amisMake()->Operation()->label(__('admin.actions'))->buttons([
$this->rowShowTypeButton('drawer', 'xl'),
$this->rowEditTypeButton('drawer', '', '50%'),
$this->rowDeleteButton(),
])
]);
return $this->baseList($crud);
}
public function form(): Form
{
return $this->baseForm()->body([
amis()->Grid()->columns([
amis()->Wrapper()->body([
amis()->FieldSetControl()->title('基本信息')->body([
amis()->GroupControl()->mode('horizontal')->body([
Components::make()->cropImageControl('avatar', __('admin.persons.avatar')),
amis()->RadiosControl('type', __('admin.persons.type'))->options([
'11'=>'出生人口', '12'=>'迁入人口'
])->value('11')->required(),
]),
amis()->GroupControl()->mode('horizontal')->body([
amis()->TextControl('name', __('admin.persons.name'))->required(),
amis()->TextControl('used_name', __('admin.persons.used_name')),
]),
amis()->GroupControl()->mode('horizontal')->body([
amis()->TextControl('idcard', __('admin.persons.idcard'))->required()->id('person_idcard')->onEvent([
'blur'=>[//自定义JS联动字段填写
'actions'=>[
[
"componentId" => "person_idcard",
"actionType"=> "disabled"
],
[
'actionType'=>'custom',
'script' => 'var strBirthday="";
var idcard=event.data.value;
if((/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(idcard))){
if(String(idcard).length == 18){
strBirthday = idcard.substr(6,4)+"/"+idcard.substr(10,2)+"/"+idcard.substr(12,2);
}
event.setData({...event.data, "birthday":new Date(strBirthday)})
}'
],
[
'actionType'=>'setValue',
"componentId" => "person_birthday",
"args" => [
'value'=>'${birthday}'
],
],
[
"componentId" => "person_idcard",
"actionType"=> "enabled"
],
]
]
]),
amis()->RadiosControl('gender', __('admin.persons.gender'))->options([
'1'=>'男', '2'=>'女'
])->required(),
]),
amis()->GroupControl()->mode('horizontal')->body([
amis()->DateControl('birthday', __('admin.persons.birthday'))->valueFormat('YYYY-MM-DD')->required()->id('person_birthday')->columnRatio(6),
]),
amis()->GroupControl()->mode('horizontal')->body([
amisMake()->InputCityControl('origin_city_code', __('admin.persons.origin_city_code'))->placeholder('请选择城市地区')->itemClassName('w-52')->searchable('true')->required(true)->columnRatio(12),
amis()->TextControl('origin_complete_address')->placeholder('若无法选择籍贯,可以手动填写籍贯'),
]),
amis()->GroupControl()->mode('horizontal')->body([
amisMake()->InputCityControl('card_city_code', __('admin.persons.card_city_code'))->placeholder('请选择城市地区')->itemClassName('w-52')->searchable('true')->required(true)->columnRatio(12),
amis()->TextControl('card_address')->placeholder('详细地址'),
]),
amis()->GroupControl()->mode('horizontal')->body([
amis()->SelectControl('nation_id', __('admin.persons.nation'))->options(Keyword::where('parent_key', 'nation')->pluck('name', 'id')->toArray())->clearable(true)->required()->searchable(),
amis()->SelectControl('political_face_id', __('admin.persons.political_face'))->options(Keyword::where('parent_key', 'political_face')->pluck('name', 'id')->toArray())->clearable(true)->required(),
]),
amis()->GroupControl()->mode('horizontal')->body([
amis()->SelectControl('educational_level_id', __('admin.persons.educational_level'))->options(Keyword::where('parent_key', 'educational_level')->pluck('name', 'id')->toArray())->clearable(true)->required(),
amis()->SelectControl('marry_state_id', __('admin.persons.marry_state'))->options(Keyword::where('parent_key', 'marry_state')->pluck('name', 'id')->toArray())->clearable(true)->required(),
]),
amis()->GroupControl()->mode('horizontal')->body([
amis()->NestedSelectControl('house_building', __('admin.persons.house_building'))->source(admin_url('api/keywords/tree-list?parent_name=housing_estate&has_owner=0'))->labelField('name')->valueField('id')->onlyLeaf(true)->clearable(true),
amis()->TextControl('house_number', __('admin.persons.house_number')),
]),
amis()->GroupControl()->mode('horizontal')->body([
amis()->TextControl('real_address', __('admin.persons.real_address'))->placeholder('若无法选择小区,可以手动填写居住地址'),
]),
]),
amis()->FieldSetControl()->title('户籍信息')->className('mt-10')->body([
amis()->GroupControl()->mode('horizontal')->body([
amis()->TextControl('domicile_code', __('admin.persons.domicile_code'))->required(),
amis()->SelectControl('organized_body_id', __('admin.persons.organized_body'))->options(Keyword::where('parent_key', 'organized_body')->pluck('name', 'id')->toArray())->clearable(true)->required(),
]),
amis()->GroupControl()->mode('horizontal')->body([
amis()->SwitchControl('has_benefit', __('admin.persons.has_benefit'))->value(false)->required(),
amis()->SelectControl('domicile_id', __('admin.persons.domicile'))->options(Keyword::where('parent_key', 'domicile')->pluck('name', 'id')->toArray())->clearable(true)->required(),
]),
amis()->GroupControl()->mode('horizontal')->body([
$this->masterPicker('master', '', '输入 户主姓名 进行筛选,忽略则为添加户主')->disabledOn('this.id > 0'),
amis()->TextControl('master_connect', __('admin.persons.master_connect'))->required(),
]),
]),
amis()->FieldSetControl()->title('其他信息')->className('mt-10')->body([
amis()->GroupControl()->mode('horizontal')->body([
amis()->SelectControl('military_service_status', __('admin.persons.military_service_status'))->options(Keyword::where('parent_key', 'military_service_status')->pluck('name', 'id')->toArray())->clearable(true),
amis()->SwitchControl('is_voter', __('admin.persons.is_voter'))->value(true),
]),
amis()->GroupControl()->mode('horizontal')->body([
amis()->TextControl('job', __('admin.persons.job')),
amis()->TextControl('health', __('admin.persons.health')),
]),
amis()->GroupControl()->mode('horizontal')->body([
amis()->TextControl('phone', __('admin.persons.phone')),
amis()->TextControl('remark', __('admin.persons.remark')),
]),
]),
])->md(12),
// amis()->Wrapper()->body([
// ])->md(6)
]),
]);
}
public function detail()
{
$form = amisMake()->form()->title('')->panelClassName('border-r border-t-0 border-b-0 border-l-0')->mode('horizontal')
->static(true)->actions([])
->body([
amis()->FieldSetControl()->title('基本信息')->body([
amis()->GroupControl()->body([
amis()->Image()->type('static-image')->name('avatar')->label( __('admin.persons.avatar'))->height('80px')->width('80px')->thumbMode('cover'),
]),
amis()->GroupControl()->body([
amis()->StaticExactControl('name', __('admin.persons.name'))->copyable(['content'=>'${name}']),
amis()->StaticExactControl('used_name', __('admin.persons.used_name')),
]),
amis()->GroupControl()->body([
amis()->StaticExactControl('idcard', __('admin.persons.idcard'))->copyable(['content'=>'${idcard}']),
amis()->RadiosControl('gender', __('admin.persons.gender'))->options([
'1'=>'男', '2'=>'女'
]),
]),
amis()->GroupControl()->body([
amis()->StaticExactControl('birthday', __('admin.persons.birthday')),
]),
amis()->GroupControl()->body([
amis()->StaticExactControl('age', __('admin.persons.age')),
amis()->StaticExactControl('origin_complete_address', __('admin.persons.origin_complete_address')),
]),
amis()->GroupControl()->body([
amis()->StaticExactControl('card_complete_address', __('admin.persons.card_complete_address')),
amis()->StaticExactControl('now_address', __('admin.persons.now_address')),
]),
amis()->GroupControl()->body([
amis()->StaticExactControl('nation', __('admin.persons.nation'))->type('static-mapping')->map(
Keyword::where('parent_key', 'nation')->pluck('name', 'id')->toArray()),
amis()->StaticExactControl('political_face', __('admin.persons.political_face'))->type('static-mapping')->map(
Keyword::where('parent_key', 'political_face')->pluck('name', 'id')->toArray()),
]),
amis()->GroupControl()->body([
amis()->StaticExactControl('educational_level', __('admin.persons.educational_level'))->type('static-mapping')->map(
Keyword::where('parent_key', 'educational_level')->pluck('name', 'id')->toArray()),
amis()->StaticExactControl('marry_state', __('admin.persons.marry_state'))->type('static-mapping')->map(
Keyword::where('parent_key', 'marry_state')->pluck('name', 'id')->toArray()),
]),
]),
amis()->FieldSetControl()->title('其他信息')->className('mt-10')->body([
amis()->GroupControl()->body([
amis()->StaticExactControl('military_service_status', __('admin.persons.military_service_status'))->type('static-mapping')->map(
Keyword::where('parent_key', 'military_service_status')->pluck('name', 'id')->toArray()),
amis()->StaticExactControl('is_voter', __('admin.persons.is_voter'))->type('static-mapping')->map(
['0'=>'否','1'=>'是','*'=>'未知']),
]),
amis()->GroupControl()->body([
amis()->StaticExactControl('job', __('admin.persons.job')),
amis()->StaticExactControl('health', __('admin.persons.health')),
]),
amis()->GroupControl()->body([
amis()->StaticExactControl('phone', __('admin.persons.phone')),
amis()->StaticExactControl('remark', __('admin.persons.remark')),
]),
]),
]);
return amisMake()->Grid()->columns([
amis()->Column()->body($form)->md(6),
amis()->Column()->body([
amisMake()->form()->title('')->panelClassName('border-0')->mode('horizontal')
->static(true)->actions([])
->body([
amis()->FieldSetControl()->title('户籍信息')->body([
amisMake()->CRUDTable()->affixHeader(false)
->title('')
->itemBadge([//行角标
'text' => __('admin.persons.master'),
'mode' => 'ribbon',
'position' => 'top-left',
'badgeLevel' => 'danger',
'visibleOn' => '${is_master > 0}',
'size' => 15
])
->api(admin_url('persons?_action=getData&master[name]=${master.name}'))
->columns([
amis()->TableColumn('name', __('admin.persons.name'))->copyable(),
amis()->TableColumn('master_connect', __('admin.persons.master_connect')),
amis()->TableColumn('idcard', __('admin.persons.idcard'))->copyable(),
amis()->TableColumn('gender', __('admin.persons.gender'))->type('mapping')->map([
"1"=>"<span class='label label-info'>男</span>",
"2"=>"<span class='label label-success'>女</span>",
"*"=> '其他:${gender}'
]),
])
])
])
])->md(6),
]);
}
public function detailActions()
{
return [
//变更户主
amis()->DialogAction()->level('warning')->label('变更户主')->dialog(
amis()->Dialog()->title('变更户主')->body($this->editMasterForm())->size('lg')->actions([
amis()->Button()->label('取消')->actionType('cancel'),
amis()->Button()->label('确认')->actionType('submit')->primary()->close('detail_info'),
])
),
//迁移
amis()->DialogAction()->level('info')->label('迁移')->dialog(
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(
amis()->Dialog()->title('迁出')->body()->size('lg')
),
//死亡-todo
amis()->DialogAction()->level('danger')->label('死亡')->dialog(
amis()->Dialog()->title('死亡')->body()->size('lg')
),
//返回
amis()->Button()->actionType('cancel')->label(__('admin.back'))->primary()
];
}
/**
* 变更户主
*/
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('')
->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, '合户');
}
/**
* 分户
*/
public function splitMasterForm()
{
return amis()->form()->title('')
->api(admin_url('split_master'))
->body([
amis()->GroupControl()->body([
$this->masterPicker('split_master_id', '分户对象', '输入 户主姓名 进行筛选')->required(),
]),
amis()->Divider(),
amis()->Service()
->api(admin_url('persons?_action=getData&state=1&master[id]=${split_master_id}&perPage=10&no_master=1'))
->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()->CheckboxControl('is_split', '是否分户')->value(false),
amis()->RadioControl('is_new_master', '新户主')->disabledOn('! is_split'),
amis()->TextControl('new_master_connect', '新关系')->disabledOn('! is_split'),
])->required()
),
amis()->Divider(),
amis()->GroupControl()->body([
amis()->DateControl('splited_at', '分户日期')->valueFormat('YYYY-MM-DD')->required(),
amis()->TextControl('split_reason', '分户原因')->required()
]),
amis()->GroupControl()->body([
amis()->TextControl('phone', '联系方式')->required(),
amis()->TextControl('remark', '备注')
]),
]);
}
public function doSplitMaster(Request $request)
{
$res = $this->service->splitMaster($request->input('split_master_id'), $request->input('new_master_arr'), $request->input());
return $this->autoResponse($res, '分户');
}
private function masterPicker($name = 'master', $label = '', $description = '')
{
return amis()->PickerControl($name, $label ?:__('admin.persons.master'))
->multiple(false)
->valueField('id')
->labelField('name')
->size('lg')
->source([
'method' => 'get',
'url' => admin_url('persons?_action=getData&state=1&is_master=1&perPage=10'),
'data' => [
'name'=>'${master_name}',
'idcard'=>'${master_idcard}'
]
])
->pickerSchema(
[
'mode' => 'table',
'name' => 'monitor_list',
'headerToolbar' => amis()->form()
->wrapWithPanel(false)
->className('text-right')
->target('monitor_list')
->mode('inline')
->body([
amis()->TextControl('master_idcard', __('admin.persons.idcard'))->size('md'),
amis()->TextControl('master_name', __('admin.persons.name'))->size('md')->addOn(
amis('submit')->label(__('admin.search'))->level('primary')
),
]),
'columns' => [
amis()->TableColumn('domicile_code', __('admin.persons.domicile_code'))->width('120px')->copyable(),
amis()->TableColumn('name', __('admin.persons.name'))->width('150px')->copyable(),
amis()->TableColumn('idcard', __('admin.persons.idcard'))->copyable(),
amis()->TableColumn('gender', __('admin.persons.gender'))->type('mapping')->map([
"1"=>"<span class='label label-info'>男</span>",
"2"=>"<span class='label label-success'>女</span>",
"*"=> '其他:${gender}'
]),
]
]
)->description($description);
}
}