generated from liutk/owl-admin-base
168 lines
5.3 KiB
PHP
168 lines
5.3 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Admin;
|
|
|
|
use App\Models\Keyword;
|
|
use App\Models\Person;
|
|
use App\Models\Filters\PersonFilter;
|
|
use App\Traits\UploadTrait;
|
|
use Illuminate\Support\Arr;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use App\Models\PersonChange;
|
|
use DB;
|
|
|
|
/**
|
|
* @method Person getModel()
|
|
* @method Person|\Illuminate\Database\Query\Builder query()
|
|
*/
|
|
class PersonService extends BaseService
|
|
{
|
|
use UploadTrait;
|
|
|
|
protected string $modelName = Person::class;
|
|
|
|
protected string $modelFilterName = PersonFilter::class;
|
|
|
|
protected array $withRelationships = ['master'];
|
|
|
|
protected bool $modelSortAble = true;
|
|
|
|
public function query(): Builder
|
|
{
|
|
return $this->modelName::query()->valid()->whereIn('type', [11, 12]);
|
|
}
|
|
|
|
public function store($data): bool
|
|
{
|
|
$columns = $this->getTableColumns();
|
|
$model = $this->getModel();
|
|
|
|
$data['avatar'] = $this->saveImage('avatar', 'persons/avatar')[0] ?? '';
|
|
|
|
if(isset($data['master'])){
|
|
$data['master_id'] = $data['master'];
|
|
unset($data['master']);
|
|
}
|
|
|
|
//处理house_building字段
|
|
if(isset($data['house_building']))
|
|
{
|
|
$data['housing_estate_id'] = Keyword::where('id', $data['house_building'])->value('parent_id') ?:0;
|
|
$data['building_id'] = $data['house_building'];
|
|
}
|
|
|
|
foreach ($data as $k => $v) {
|
|
if (!in_array($k, $columns)) {
|
|
continue;
|
|
}
|
|
|
|
$model->setAttribute($k, $v);
|
|
}
|
|
|
|
return $model->save();
|
|
}
|
|
|
|
public function update($primaryKey, $data): bool
|
|
{
|
|
$columns = $this->getTableColumns();
|
|
$model = $this->query()->whereKey($primaryKey)->first();
|
|
|
|
if(isset($data['avatar'])){
|
|
$data['avatar'] = $this->saveImage('avatar', 'persons/avatar')[0] ?? '';
|
|
}
|
|
|
|
if(isset($data['house_building']))
|
|
{
|
|
$data['housing_estate_id'] = Keyword::where('id', $data['house_building'])->value('parent_id') ?:0;
|
|
$data['building_id'] = $data['house_building'];
|
|
}
|
|
|
|
foreach ($data as $k => $v) {
|
|
if (!in_array($k, $columns)) {
|
|
continue;
|
|
}
|
|
|
|
$model->setAttribute($k, $v);
|
|
}
|
|
|
|
return $model->save();
|
|
}
|
|
|
|
/**
|
|
* 软删除
|
|
*
|
|
* @param string $ids
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public function delete(string $ids): mixed
|
|
{
|
|
return $this->query()->whereIn($this->primaryKey(), explode(',', $ids))->update(['valid'=> 0]);
|
|
}
|
|
|
|
/**
|
|
* 分户
|
|
*
|
|
* @param int $masterId
|
|
* @param array $personArr
|
|
* @param array $extends
|
|
*
|
|
*/
|
|
public function splitMaster($masterId, $personArr = [], $extends)
|
|
{
|
|
$personList = collect($personArr);
|
|
$newMaster = $personList->first(function ($item) {
|
|
return isset($item['is_split']) && $item['is_split'] && isset($item['is_new_master']) && $item['is_new_master'];
|
|
});
|
|
if(empty($newMaster)){
|
|
return $this->setError('分户失败,未选择新户主');
|
|
}
|
|
try{
|
|
DB::beginTransaction();
|
|
$personChangeLogs = [];
|
|
//遍历分户成员情况, 并更新户主与户主关系
|
|
|
|
foreach($personList as $person){
|
|
if(!$person['is_split']){//是否参与分户
|
|
continue;
|
|
}
|
|
|
|
$changeMark = (isset($extends['splited_at']) ? $extends['splited_at'] : '某日'). '日,' .(isset($extends['split_reason']) ? ('因' .$extends['split_reason']) : '').'分户,';
|
|
if($newMaster['id'] == $person['id']){
|
|
$changeMark .= '成为新户主';
|
|
}else{
|
|
$changeMark .= '户主由【'.$person["master"]["name"].']变更为['.$newMaster["name"].'】,与户主关系更新为【'.$person['new_master_connect'].'】';
|
|
}
|
|
$personChangeLogs[] = [
|
|
'person_id' => $person['id'],
|
|
'type' => PersonChange::TYPE_SPLIT,
|
|
'changed_at' => isset($extends['splited_at']) ? $extends['splited_at'] : null,
|
|
'reason' => isset($extends['split_reason']) ? $extends['split_reason'] : null,
|
|
'old_master' => $person['master_id'],
|
|
'new_master' => $newMaster['id'],
|
|
'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'] : ($newMaster['id'] == $person['id'] ? '户主':'')
|
|
]);
|
|
}
|
|
//批量插入人口变动记录
|
|
count($personChangeLogs) > 0 && PersonChange::insert($personChangeLogs);
|
|
|
|
DB::commit();
|
|
}catch(Throwable $th){
|
|
DB::rollBack();
|
|
report($th);
|
|
return $this->setError('系统错误,请刷新后重试');
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
} |