|
|
<?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 $guarded = ['id'];
|
|
|
|
|
|
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 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 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;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 更新用户编号
|
|
|
*/
|
|
|
public static function updateNo($userId)
|
|
|
{
|
|
|
$user = self::find($userId);
|
|
|
$no = date('Ymd', strtotime($user->created_at)) . str_pad($userId, 6, '0', STR_PAD_LEFT);
|
|
|
$user->no = $no;
|
|
|
$user->save();
|
|
|
return $user->no;
|
|
|
}
|
|
|
|
|
|
}
|