UnitService.php 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. namespace App\Services;
  3. use App\Unit;
  4. use App\Traits\ServiceAppAop;
  5. use Illuminate\Database\Eloquent\Model;
  6. use Illuminate\Support\Facades\Cache;
  7. class UnitService
  8. {
  9. use ServiceAppAop;
  10. protected $modelClass=Unit::class;
  11. /*
  12. * array | string $column
  13. * 默认一些select字段,可传递string 或 array来指定select字段
  14. * */
  15. public function getSelection($column = ['id','name']){
  16. if (!is_array($column)) {
  17. $column = [$column];
  18. }
  19. return Unit::query()->orderBy("sequence")->select($column)->get();
  20. }
  21. /**
  22. * 设置/刷新 单位缓存
  23. */
  24. public function setUnitCache()
  25. {
  26. $units = Unit::query()->get();
  27. Cache::forever("units",$units);
  28. }
  29. /**
  30. * 获取单位缓存
  31. *
  32. * @return mixed
  33. */
  34. public function getUnitCache()
  35. {
  36. if (!Cache::has("units")){
  37. $units = Unit::query()->get();
  38. Cache::forever("units",$units);
  39. }
  40. return Cache::get("units");
  41. }
  42. /**
  43. * 获取单位集的映射
  44. *
  45. * @param null|array $targets
  46. * @param bool $notExistToCreate
  47. *
  48. * @return array
  49. */
  50. public function getUnitMapping(?array $targets = null, bool $notExistToCreate = false):array
  51. {
  52. $key = "unitMapping:".json_encode($targets,JSON_UNESCAPED_UNICODE);
  53. $units = Cache::remember($key,config("cache.expirations.rarelyChange"),function ()use($targets){
  54. $result = [];
  55. $units = $this->getUnitCache();
  56. if (!$units)return [];
  57. foreach ($units as $unit){
  58. if (!$targets)$result[$unit->id] = $unit->name;
  59. else if (array_search($unit->name,$targets)!==false)$result[$unit->id] = $unit->name;
  60. }
  61. return $result;
  62. });
  63. if ($notExistToCreate && $targets && count($units)!=count($targets)){
  64. $flip = array_flip($targets);
  65. foreach ($units as $key=>$val)unset($flip[$val]);
  66. foreach ($flip as $key=>$val)Unit::query()->firstOrCreate(["name"=>$key]);
  67. Cache::pull($key);
  68. return $this->getUnitMapping($targets);
  69. }
  70. return $units;
  71. }
  72. /**
  73. * 根据名称获取单位
  74. *
  75. * @param string|null $name
  76. *
  77. * @return Model|\stdClass|null
  78. */
  79. public function getUnit(?string $name = null):?Unit
  80. {
  81. if (!$name)$name = "件";
  82. return Unit::query()->where("name",$name)->firstOrCreate(["name"=>$name]);
  83. }
  84. }