You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

271 lines
7.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?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;
/** from 标签:元禾同事(元和员工参与人员) */
public const FROM_TAG_YUANHE_COLLEAGUE = '元禾同事';
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', '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' => ['否', '是'],
];
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;
}
/**
* 批量将用户更新为校友
* @param array $userIds 用户ID数组
* @param string $courseStartDate 课程开课时间(用于设置 schoolmate_time
* @return int 更新的用户数量
*/
public static function batchUpdateToSchoolmate(array $userIds, string $courseStartDate)
{
if (empty($userIds)) {
return 0;
}
// 将课程开课时间转换为 datetime 格式
$schoolmateTime = Carbon::parse($courseStartDate)->format('Y-m-d H:i:s');
// 批量更新:只更新还不是校友的学员;从 非校友→校友 时使用课程开课时间作为 schoolmate_time
return self::whereIn('id', $userIds)
->whereRaw('COALESCE(is_schoolmate, 0) != 1')
->update([
'is_schoolmate' => 1,
'schoolmate_time' => $schoolmateTime
]);
}
}