|
|
<?php
|
|
|
|
|
|
namespace App\Models;
|
|
|
|
|
|
use DateTimeInterface;
|
|
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
|
use Illuminate\Foundation\Auth\User as Authenticatable;
|
|
|
use Illuminate\Notifications\Notifiable;
|
|
|
use Illuminate\Support\Carbon;
|
|
|
use Laravel\Sanctum\HasApiTokens;
|
|
|
use OwenIt\Auditing\Contracts\Auditable;
|
|
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
|
|
|
|
|
|
|
|
class User extends Authenticatable implements Auditable
|
|
|
{
|
|
|
use HasApiTokens, HasFactory, Notifiable;
|
|
|
use \OwenIt\Auditing\Auditable;
|
|
|
use SoftDeletes;
|
|
|
|
|
|
protected $fillable = [
|
|
|
'remember_token',
|
|
|
'created_at',
|
|
|
'updated_at',
|
|
|
'nickname',
|
|
|
'openid',
|
|
|
'country',
|
|
|
'province',
|
|
|
'city',
|
|
|
'headimgurl',
|
|
|
'username',
|
|
|
'password',
|
|
|
'name',
|
|
|
'sex',
|
|
|
'birthday',
|
|
|
'mobile',
|
|
|
'idcard',
|
|
|
'education',
|
|
|
'company_name',
|
|
|
'company_position',
|
|
|
'company_has_share',
|
|
|
'type',
|
|
|
'company_type',
|
|
|
'company_fund',
|
|
|
'company_area',
|
|
|
'company_address',
|
|
|
'company_industry',
|
|
|
'company_product',
|
|
|
'school',
|
|
|
'speciality',
|
|
|
'overseas_experience',
|
|
|
'sign_from',
|
|
|
'email',
|
|
|
'sales_volume',
|
|
|
'valuation',
|
|
|
'market_value',
|
|
|
'is_yuanhe',
|
|
|
'plate',
|
|
|
'introduce',
|
|
|
'honour',
|
|
|
'company_need_fund',
|
|
|
'company_other',
|
|
|
'remark',
|
|
|
'is_import',
|
|
|
'is_vip',
|
|
|
'is_schoolmate',
|
|
|
'schoolmate_time',
|
|
|
'appointment_total',
|
|
|
'letter',
|
|
|
'code',
|
|
|
'score',
|
|
|
'pid',
|
|
|
'company_introduce',
|
|
|
'company_date',
|
|
|
'deleted_at',
|
|
|
'no',
|
|
|
'from',
|
|
|
'open_course_types',
|
|
|
'talent_tags'
|
|
|
];
|
|
|
protected $appends = ['is_vip_text', 'is_schoolmate_text', 'appointment_total', 'name', 'is_company_schoolmate', 'is_company_schoolmate_text'];
|
|
|
|
|
|
// 更新时候覆盖更新的字段
|
|
|
public static $coverFields = [
|
|
|
'name',
|
|
|
'sex',
|
|
|
'company_has_share',
|
|
|
'company_name',
|
|
|
'school',
|
|
|
'speciality',
|
|
|
'birthday',
|
|
|
'mobile',
|
|
|
'idcard',
|
|
|
'education',
|
|
|
'company_date',
|
|
|
'sales_volume',
|
|
|
'valuation',
|
|
|
'market_value',
|
|
|
'is_yuanhe',
|
|
|
'username',
|
|
|
'company_position',
|
|
|
'company_need_fund',
|
|
|
'company_address',
|
|
|
'company_area',
|
|
|
'course_id',
|
|
|
'status',
|
|
|
'fee_status',
|
|
|
'is_vip'
|
|
|
];
|
|
|
|
|
|
/**
|
|
|
* 数据类型转换,数字转字符串。
|
|
|
* 值是id则是数据字典的顶级id,或者是枚举型数组
|
|
|
* @var array[]
|
|
|
*/
|
|
|
public static $intToString = [
|
|
|
'company_position' => 1,
|
|
|
'company_area' => 1,
|
|
|
'company_industry' => 1,
|
|
|
'company_type' => 1,
|
|
|
'is_vip' => ['普通学员', 'VIP学员'],
|
|
|
'is_schoolmate' => ['否', '是'],
|
|
|
];
|
|
|
|
|
|
/**
|
|
|
* Boot 方法 - 处理模型事件
|
|
|
*/
|
|
|
protected static function boot()
|
|
|
{
|
|
|
parent::boot();
|
|
|
|
|
|
static::saving(function ($user) {
|
|
|
// 当 is_schoolmate 被设置为 1 时,自动设置成为校友时间
|
|
|
if ($user->isDirty('is_schoolmate')) {
|
|
|
if ($user->is_schoolmate == 1) {
|
|
|
// 如果是从非校友变成校友,设置成为校友时间为当前时间
|
|
|
if ($user->getOriginal('is_schoolmate') != 1) {
|
|
|
$user->schoolmate_time = now();
|
|
|
}
|
|
|
} elseif ($user->is_schoolmate == 0 || $user->is_schoolmate === null) {
|
|
|
// 如果设置为 0 或 null,清空成为校友时间
|
|
|
$user->schoolmate_time = null;
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
public function getMobileAttribute($value)
|
|
|
{
|
|
|
// 如果url中包含admin字符串,则所有的手机号显示中间4位星号代替
|
|
|
if (strpos(request()->url(), 'admin') !== false && env('APP_ENV') == 'local') {
|
|
|
return substr_replace($value, '****', 3, 4);
|
|
|
}
|
|
|
return $value;
|
|
|
}
|
|
|
|
|
|
public function getAppointmentTotalAttribute($value)
|
|
|
{
|
|
|
$now = date('Y-m-d H:i:s');
|
|
|
$courseAppointmentTotals = CourseAppointmentTotal::where('user_id', $this->id)
|
|
|
//->where('start_time', '<=', $now)
|
|
|
->where('end_time', '>=', $now)
|
|
|
->sum('total');
|
|
|
return $courseAppointmentTotals;
|
|
|
}
|
|
|
|
|
|
protected function serializeDate(DateTimeInterface $date)
|
|
|
{
|
|
|
return $date->format(Carbon::parse($date)->toDateTimeString());
|
|
|
}
|
|
|
|
|
|
public function getIsVipTextAttribute($value)
|
|
|
{
|
|
|
return self::$intToString['is_vip'][$this->is_vip] ?? '';
|
|
|
}
|
|
|
|
|
|
public function getIsSchoolmateTextAttribute($value)
|
|
|
{
|
|
|
return self::$intToString['is_schoolmate'][$this->is_schoolmate] ?? '否';
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取是否校友企业(数字:0否1是)
|
|
|
* 查询学员对应的企业下的用户,是否包含校友
|
|
|
*/
|
|
|
public function getIsCompanySchoolmateAttribute($value)
|
|
|
{
|
|
|
// 如果学员没有关联企业,返回否
|
|
|
if (empty($this->company_id)) {
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
// 查询该企业下是否有校友(is_schoolmate = 1)
|
|
|
$hasSchoolmate = self::where('company_id', $this->company_id)
|
|
|
->where('is_schoolmate', 1)
|
|
|
->exists();
|
|
|
|
|
|
return $hasSchoolmate ? 1 : 0;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取是否校友企业(文本:是/否)
|
|
|
*/
|
|
|
public function getIsCompanySchoolmateTextAttribute($value)
|
|
|
{
|
|
|
return $this->is_company_schoolmate == 1 ? '是' : '否';
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public function courses()
|
|
|
{
|
|
|
return $this->belongsToMany(Course::class, 'course_signs', 'user_id', 'course_id');
|
|
|
}
|
|
|
|
|
|
public function courseSigns()
|
|
|
{
|
|
|
return $this->hasMany(CourseSign::class, 'user_id', 'id');
|
|
|
}
|
|
|
|
|
|
public function companyAreaDetail()
|
|
|
{
|
|
|
return $this->hasOne(ParameterDetail::class, 'id', 'company_area');
|
|
|
}
|
|
|
|
|
|
public function companyPositionDetail()
|
|
|
{
|
|
|
return $this->hasOne(ParameterDetail::class, 'id', 'company_position');
|
|
|
}
|
|
|
|
|
|
public function companyIndustryDetail()
|
|
|
{
|
|
|
return $this->hasOne(ParameterDetail::class, 'id', 'company_industry');
|
|
|
}
|
|
|
|
|
|
public function companyTypeDetail()
|
|
|
{
|
|
|
return $this->hasOne(ParameterDetail::class, 'id', 'company_type');
|
|
|
}
|
|
|
|
|
|
public function appointments()
|
|
|
{
|
|
|
return $this->hasMany(Appointment::class, 'user_id', 'id');
|
|
|
}
|
|
|
|
|
|
public function company()
|
|
|
{
|
|
|
return $this->hasOne(Company::class, 'id', 'company_id');
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 获取预约剩余次数
|
|
|
*/
|
|
|
public static function getHasAppointment($userId)
|
|
|
{
|
|
|
$user = self::find($userId);
|
|
|
// 已预约次数 todo::已使用的次数应该存在有效期统计
|
|
|
$useTotal = Appointment::where('user_id', $userId)
|
|
|
->where('status', 1)
|
|
|
->count();
|
|
|
return $user->appointment_total - $useTotal >= 0 ? $user->appointment_total - $useTotal : 0;
|
|
|
}
|
|
|
|
|
|
}
|