Asset.php 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <?php
  2. namespace App\Models;
  3. use App\Models\Enums\AssetACL;
  4. use App\Models\Scopes\CompanyScope;
  5. use EloquentFilter\Filterable;
  6. use Illuminate\Database\Eloquent\Builder;
  7. use Illuminate\Database\Eloquent\Factories\HasFactory;
  8. use Illuminate\Database\Eloquent\Model;
  9. use Illuminate\Support\Facades\Auth;
  10. /**
  11. * @method static \Illuminate\Database\Eloquent\Builder allowed()
  12. */
  13. class Asset extends Model
  14. {
  15. use HasFactory, Filterable;
  16. protected $fillable = [
  17. "name", "code", "description", "company_id", "status", "created_by",
  18. "owner", "address", "group_id", "geo_address_code", "acl",
  19. "whitelist", "latitude", "longitude","parent_id", "path",
  20. "equity_interest","developer","date_completed","total_floor_area","contact_person","contact_phone","contact_email","property","building_type_description"
  21. ];
  22. protected static function booted(): void
  23. {
  24. static::addGlobalScope(new CompanyScope);
  25. }
  26. public function scopeAllowed(Builder $query): void
  27. {
  28. $query->where(function (Builder $query) {
  29. return $query->where('acl', AssetACL::PRIVATE->value)->where('owner', Auth::id());
  30. })->orWhere(function (Builder $query) {
  31. return $query->where('acl', AssetACL::CUSTOM->value)->where('whitelist', 'like', '%,' . Auth::id() . ',%');
  32. });
  33. }
  34. public function children(){
  35. return $this->hasMany(Asset::class ,'parent_id');
  36. }
  37. public function parent(){
  38. return $this->belongsTo(Asset::class ,'parent_id');
  39. }
  40. public function requirementGroups(){
  41. return $this->hasMany(RequirementGroup::class ,'asset_id');
  42. }
  43. public function requirements(){
  44. return $this->hasMany(Requirement::class ,'asset_id');
  45. }
  46. public function plans(){
  47. return $this->hasMany(Plan::class ,'asset_id');
  48. }
  49. public function projects(){
  50. return $this->belongsToMany(Project::class,'project_asset');
  51. }
  52. //获取子级需求数量
  53. public function getTotalRequirementsCountAttribute()
  54. {
  55. $totalRequirementsCount = $this->requirements()->count(); // 当前资产的需求数量
  56. foreach ($this->children as $child) {
  57. $totalRequirementsCount += $child->getTotalRequirementsCountAttribute(); // 递归调用子资产的方法
  58. }
  59. return $totalRequirementsCount;
  60. }
  61. //获取子级计划数量
  62. public function getTotalPlansCountAttribute()
  63. {
  64. $totalPlansCount = $this->plans()->count(); // 当前资产的需求数量
  65. foreach ($this->children as $child) {
  66. $totalPlansCount += $child->getTotalPlansCountAttribute(); // 递归调用子资产的方法
  67. }
  68. return $totalPlansCount;
  69. }
  70. }