djc-new/app/Services/Admin/PersonService.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;
}
}