GoodsService.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. namespace App\Modules\Admin\Services;
  3. use App\Base\BaseService;
  4. use App\Models\Goods\Goods;
  5. use App\Models\Goods\GoodsCategoryMap;
  6. use App\Models\Goods\GoodsSku;
  7. use App\Models\Goods\GoodsSpecMap;
  8. use Illuminate\Database\Eloquent\Builder;
  9. use Illuminate\Support\Arr;
  10. use Illuminate\Support\Facades\DB;
  11. class GoodsService extends BaseService
  12. {
  13. public function paginate($params)
  14. {
  15. $p = Goods::query()->when($params['status'], function (Builder $query) use ($params) {
  16. return $query->where("status", $params['status']);
  17. })->when($params['name'], function (Builder $query) use ($params) {
  18. return $query->where("name", "like", "%{$params['name']}%");
  19. })->when($params['category_id'], function (Builder $query) use ($params) {
  20. $gidArr = GoodsCategoryMap::whereCategoryId($params['category_id'])->groupBy("goods_id")->get(['goods_id'])->toArray();
  21. $query->whereIn("id", $gidArr);
  22. })->orderByDesc("id")->paginate($params['page_size']);
  23. return [
  24. "total" => $p->total(),
  25. "page_total" => $p->lastPage(),
  26. "list" => array_map(function (Goods $model) {
  27. return [
  28. "id" => $model->id,
  29. "name" => $model->name,
  30. "thumb" => Arr::first($model->image_list),
  31. "weight" => $model->weight,
  32. "status" => $model->status,
  33. "created_at" => $model->created_at->format("Y-m-d H:i:s"),
  34. ];
  35. }, $p->items()),
  36. ];
  37. }
  38. public function store($params)
  39. {
  40. if ($id = Arr::get($params, "id", 0)) {
  41. $goods = Goods::findOrFail($id);
  42. } else {
  43. $goods = new Goods();
  44. }
  45. $specIdArr = array_values(Arr::sort(Arr::get($params, "spec", [])));
  46. DB::transaction(function () use ($params, $goods, $specIdArr) {
  47. $goods->image_list = Arr::get($params, "image_list", []);
  48. $goods->sn = $params['sn'] ?? "";
  49. $goods->url_3d = $params['url_3d'] ?? "";
  50. $goods->spec = $specIdArr;
  51. $goods->name = Arr::get($params, "name", []);
  52. $goods->weight = Arr::get($params, "weight", 0);
  53. $goods->desc_html = Arr::get($params, "desc_html", "");
  54. $goods->spec_attr_html = Arr::get($params, "spec_attr_html", "");
  55. $goods->faq_html = Arr::get($params, "faq_html", "");
  56. $goods->save();
  57. $categoryArr = Arr::get($params, "category", []);
  58. GoodsCategoryMap::where("goods_id", $goods->id)->whereNotIn("category_id", Arr::pluck($categoryArr, "id"))->delete();
  59. foreach ($categoryArr as $c) {
  60. /**
  61. * [
  62. * "id" => 1
  63. * "is_public" => 1
  64. * ]
  65. */
  66. GoodsCategoryMap::updateOrCreate([
  67. "goods_id" => $goods->id,
  68. "category_id" => $c['id'],
  69. 'is_public' => $c['is_public'],
  70. ]);
  71. }
  72. $specMap = Arr::get($params, "spec_map", []);
  73. $doNotDelIdArr = [];
  74. foreach ($specMap as $c) {
  75. $model = GoodsSpecMap::where("goods_id", $goods->id)->where("spec_id", $c['spec_id'])->first();
  76. if (is_null($model)) {
  77. $model = new GoodsSpecMap();
  78. $model->goods_id = $goods->id;
  79. $model->spec_id = $c['spec_id'];
  80. }
  81. $model->value = $c['value'];
  82. $model->save();
  83. $doNotDelIdArr[] = $model->id;
  84. }
  85. GoodsSpecMap::where("goods_id", $goods->id)->whereNotIn("id", $doNotDelIdArr)->delete();
  86. $skuArr = Arr::get($params, "sku", []);
  87. $doNotDelIdArr = [];
  88. foreach ($skuArr as $skuParam) {
  89. $sku = GoodsSku::where("goods_id", $goods->id)->find($skuParam['id']);
  90. if (is_null($sku)) {
  91. $sku = new GoodsSku();
  92. $sku->goods_id = $goods->id;
  93. }
  94. $sku->spec_attr_list = $skuParam['attr'];
  95. $sku->save();
  96. $doNotDelIdArr[] = $sku->id;
  97. }
  98. GoodsSku::where("goods_id", $goods->id)->whereNotIn("id", $doNotDelIdArr)->delete();
  99. });
  100. }
  101. public function info($params)
  102. {
  103. $id = $params['id'];
  104. $model = Goods::findOrFail($id);
  105. $return = [
  106. "id" => $model->id,
  107. "name" => $model->name,
  108. "image_list" => $model->image_list,
  109. "category" => $model->map->map(function (GoodsCategoryMap $map) {
  110. return [
  111. "id" => $map->category->id,
  112. "is_public" => $map->is_public,
  113. "name" => $map->category->name,
  114. ];
  115. }),
  116. "spec" => $model->spec,
  117. "weight" => $model->weight,
  118. "desc_html" => $model->desc_html,
  119. "spec_attr_html" => $model->spec_attr_html,
  120. "faq_html" => $model->faq_html,
  121. "sn" => $model->sn,
  122. "url_3d" => $model->url_3d,
  123. "spec_map" => $model->specMap->map(function (GoodsSpecMap $map) {
  124. return [
  125. "id" => $map->id,
  126. "spec_id" => $map->spec_id,
  127. "value" => $map->value,
  128. "name" => $map->spec->name,
  129. ];
  130. }),
  131. "sku" => $model->sku->map(function (GoodsSku $sku) {
  132. return [
  133. "id" => $sku->id,
  134. "attr" => $sku->spec_attr_list,
  135. ];
  136. }),
  137. ];
  138. return $return;
  139. }
  140. }