Asset.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <?php
  2. namespace App\Models;
  3. use App\Http\Requests\IndexHelper;
  4. use App\Models\Enums\AssetACL;
  5. use App\Models\Scopes\CompanyScope;
  6. use EloquentFilter\Filterable;
  7. use Illuminate\Database\Eloquent\Builder;
  8. use Illuminate\Database\Eloquent\Factories\HasFactory;
  9. use Illuminate\Database\Eloquent\Model;
  10. use Illuminate\Database\Eloquent\SoftDeletes;
  11. use Illuminate\Support\Facades\Auth;
  12. use App\Models\Enums\DisplayIndexObjectType;
  13. /**
  14. * @method static \Illuminate\Database\Eloquent\Builder allowed()
  15. */
  16. class Asset extends Model
  17. {
  18. use HasFactory, Filterable,SoftDeletes,IndexHelper;
  19. protected $fillable = [
  20. "name", "code", "description", "company_id", "status", "created_by",
  21. "owner", "address", "group_id", "geo_address_code", "acl",
  22. "whitelist", "latitude", "longitude","parent_id", "path",
  23. "equity_interest","developer","date_completed","total_floor_area","contact_person","contact_phone","contact_email","property","building_type_description","area_unit"
  24. ];
  25. protected $casts = [
  26. 'created_at' => 'datetime:Y-m-d H:i:s',
  27. 'updated_at' => 'datetime:Y-m-d H:i:s',
  28. ];
  29. protected static function booted(): void
  30. {
  31. static::addGlobalScope(new CompanyScope);
  32. static::creating(function (Asset $asset){
  33. $type =DisplayIndexObjectType::ASSET;
  34. $displayIndex = IndexHelper::getObjectMaxIndex($type);
  35. $asset->display_id =$displayIndex;
  36. });
  37. }
  38. public function scopeAllowed(Builder $query): void
  39. {
  40. $query->where(function (Builder $query) {
  41. return $query->where('acl', AssetACL::CUSTOM->value)->where('whitelist', 'like', '%,' . Auth::id() . ',%');
  42. })->orWhere(function (Builder $query) {
  43. return $query->where('acl', AssetACL::PRIVATE->value)->where('created_by', Auth::id());
  44. });
  45. }
  46. public function children(){
  47. return $this->hasMany(Asset::class ,'parent_id');
  48. }
  49. public function parent(){
  50. return $this->belongsTo(Asset::class ,'parent_id');
  51. }
  52. public function requirementGroups(){
  53. return $this->hasMany(RequirementGroup::class ,'asset_id');
  54. }
  55. public function requirements(){
  56. return $this->hasMany(Requirement::class ,'asset_id');
  57. }
  58. public function plans(){
  59. return $this->hasMany(Plan::class ,'asset_id');
  60. }
  61. public function projects(){
  62. return $this->belongsToMany(Project::class,'project_asset');
  63. }
  64. //获取子级需求数量
  65. public function getTotalRequirementsCountAttribute()
  66. {
  67. $childIds = [];
  68. Asset::where('path','like','%,'.$this->id.',%')->get('id')->each(function ($id)use (&$childIds){
  69. $childIds[]=$id['id'];
  70. });
  71. return Requirement::whereIn('asset_id',$childIds)->count();
  72. }
  73. //获取子级计划数量
  74. public function getTotalPlansCountAttribute()
  75. {
  76. $childIds = [];
  77. Asset::where('path','like','%,'.$this->id.',%')->get('id')->each(function ($id)use (&$childIds){
  78. $childIds[]=$id['id'];
  79. });
  80. return Plan::whereIn('asset_id',$childIds)->count();
  81. }
  82. public function library(){
  83. return $this->hasMany(Library::class ,'asset_id')->where('type', 'asset');
  84. }
  85. public function createdBy(): \Illuminate\Database\Eloquent\Relations\BelongsTo
  86. {
  87. return $this->belongsTo(User::class, 'created_by');
  88. }
  89. public function byOwner(): \Illuminate\Database\Eloquent\Relations\BelongsTo
  90. {
  91. return $this->belongsTo(User::class, 'owner');
  92. }
  93. public function assetGroup(): \Illuminate\Database\Eloquent\Relations\BelongsTo
  94. {
  95. return $this->belongsTo(AssetGroup::class, 'group_id');
  96. }
  97. public function projectRequirementsGroup(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
  98. {
  99. return $this->belongsToMany(RequirementGroup::class, 'project_requirement');
  100. }
  101. }