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'], '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']) && !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; } /** * 合户 * @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; } }