|
|
<?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',
|
|
|
'appointment_total',
|
|
|
'letter',
|
|
|
'code',
|
|
|
'score',
|
|
|
'pid',
|
|
|
'company_introduce',
|
|
|
'company_date',
|
|
|
'deleted_at',
|
|
|
'no',
|
|
|
'from',
|
|
|
'open_course_types'
|
|
|
];
|
|
|
protected $appends = ['is_vip_text', 'is_schoolmate_text', 'appointment_total', 'name'];
|
|
|
|
|
|
// 更新时候覆盖更新的字段
|
|
|
public static $coverFields = [
|
|
|
'name', 'sex', 'mobile', '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'
|
|
|
];
|
|
|
|
|
|
public function getNameAttribute($value)
|
|
|
{
|
|
|
return $this->username;
|
|
|
}
|
|
|
|
|
|
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] ?? '';
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 数据类型转换,数字转字符串。
|
|
|
* 值是id则是数据字典的顶级id,或者是枚举型数组
|
|
|
* @var array[]
|
|
|
*/
|
|
|
public static $intToString = [
|
|
|
'company_position' => 1,
|
|
|
'company_area' => 1,
|
|
|
'company_industry' => 1,
|
|
|
'company_type' => 1,
|
|
|
'is_vip' => ['普通学员', 'VIP学员'],
|
|
|
'is_schoolmate' => ['否', '是'],
|
|
|
];
|
|
|
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
}
|